service-bridge 1.8.3-dev.43 → 1.8.4-dev.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -13
- package/dist/index.js +68 -57
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ import * as protoLoader from "@grpc/proto-loader";
|
|
|
10
10
|
import * as protobuf from "protobufjs";
|
|
11
11
|
|
|
12
12
|
// sdk/src/generated/servicebridge-package-definition.ts
|
|
13
|
-
var DESCRIPTOR_SET_BASE64 = "ConaBAogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiLKAQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlKnsIgOzK/wEQgezK/wEabRJrCIDsyv8BEjQuYnVmLmRlc2NyaXB0b3IudjEuYnVmX2ZpbGVfZGVzY3JpcHRvcl9zZXRfZXh0ZW5zaW9uGi0uYnVmLmRlc2NyaXB0b3IudjEuRmlsZURlc2NyaXB0b3JTZXRFeHRlbnNpb24ixQUKE0ZpbGVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIYCgdwYWNrYWdlGAIgASgJUgdwYWNrYWdlEh4KCmRlcGVuZGVuY3kYAyADKAlSCmRlcGVuZGVuY3kSKwoRcHVibGljX2RlcGVuZGVuY3kYCiADKAVSEHB1YmxpY0RlcGVuZGVuY3kSJwoPd2Vha19kZXBlbmRlbmN5GAsgAygFUg53ZWFrRGVwZW5kZW5jeRIrChFvcHRpb25fZGVwZW5kZW5jeRgPIAMoCVIQb3B0aW9uRGVwZW5kZW5jeRJDCgxtZXNzYWdlX3R5cGUYBCADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgttZXNzYWdlVHlwZRJBCgllbnVtX3R5cGUYBSADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSQQoHc2VydmljZRgGIAMoCzInLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvUgdzZXJ2aWNlEkMKCWV4dGVuc2lvbhgHIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEjYKB29wdGlvbnMYCCABKAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNSB29wdGlvbnMSSQoQc291cmNlX2NvZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1IOc291cmNlQ29kZUluZm8SFgoGc3ludGF4GAwgASgJUgZzeW50YXgSMgoHZWRpdGlvbhgOIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUgdlZGl0aW9uIvwGCg9EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI7CgVmaWVsZBgCIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IFZmllbGQSQwoJZXh0ZW5zaW9uGAYgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SQQoLbmVzdGVkX3R5cGUYAyADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgpuZXN0ZWRUeXBlEkEKCWVudW1fdHlwZRgEIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJYCg9leHRlbnNpb25fcmFuZ2UYBSADKAsyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlUg5leHRlbnNpb25SYW5nZRJECgpvbmVvZl9kZWNsGAggAygLMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvUglvbmVvZkRlY2wSOQoHb3B0aW9ucxgHIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9uc1IHb3B0aW9ucxJVCg5yZXNlcnZlZF9yYW5nZRgJIAMoCzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAogAygJUgxyZXNlcnZlZE5hbWUSQQoKdmlzaWJpbGl0eRgLIAEoDjIhLmdvb2dsZS5wcm90b2J1Zi5TeW1ib2xWaXNpYmlsaXR5Ugp2aXNpYmlsaXR5GnoKDkV4dGVuc2lvblJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZBJACgdvcHRpb25zGAMgASgLMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9uc1IHb3B0aW9ucxo3Cg1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCLMBAoVRXh0ZW5zaW9uUmFuZ2VPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uElkKC2RlY2xhcmF0aW9uGAIgAygLMjIuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbkIDiAECUgtkZWNsYXJhdGlvbhI3CghmZWF0dXJlcxgyIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UghmZWF0dXJlcxJtCgx2ZXJpZmljYXRpb24YAyABKA4yOC5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlOgpVTlZFUklGSUVEQgOIAQJSDHZlcmlmaWNhdGlvbhqUAQoLRGVjbGFyYXRpb24SFgoGbnVtYmVyGAEgASgFUgZudW1iZXISGwoJZnVsbF9uYW1lGAIgASgJUghmdWxsTmFtZRISCgR0eXBlGAMgASgJUgR0eXBlEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWRKBAgEEAUiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVQRUFURUQQAxISCg5MQUJFTF9SRVFVSVJFRBACImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMipgMKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUSQQoKdmlzaWJpbGl0eRgGIAEoDjIhLmdvb2dsZS5wcm90b2J1Zi5TeW1ib2xWaXNpYmlsaXR5Ugp2aXNpYmlsaXR5GjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIq0JCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlEjcKCGZlYXR1cmVzGDIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgqECtKBAgmECdSFHBocF9nZW5lcmljX3NlcnZpY2VzIvQDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAwgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoinQ0KDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJXChBlZGl0aW9uX2RlZmF1bHRzGBQgAygLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdFIPZWRpdGlvbkRlZmF1bHRzEjcKCGZlYXR1cmVzGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElUKD2ZlYXR1cmVfc3VwcG9ydBgWIAEoCzIsLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRmVhdHVyZVN1cHBvcnRSDmZlYXR1cmVTdXBwb3J0ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uGloKDkVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUalgIKDkZlYXR1cmVTdXBwb3J0EkcKEmVkaXRpb25faW50cm9kdWNlZBgBIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uSW50cm9kdWNlZBJHChJlZGl0aW9uX2RlcHJlY2F0ZWQYAiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIRZWRpdGlvbkRlcHJlY2F0ZWQSLwoTZGVwcmVjYXRpb25fd2FybmluZxgDIAEoCVISZGVwcmVjYXRpb25XYXJuaW5nEkEKD2VkaXRpb25fcmVtb3ZlZBgEIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5lZGl0aW9uUmVtb3ZlZCIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFSgQIEhATIqwBCgxPbmVvZk9wdGlvbnMSNwoIZmVhdHVyZXMYASABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLRAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYi2AIKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSNwoIZmVhdHVyZXMYAiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSKAoMZGVidWdfcmVkYWN0GAMgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSVQoPZmVhdHVyZV9zdXBwb3J0GAQgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLVAQoOU2VydmljZU9wdGlvbnMSNwoIZmVhdHVyZXMYIiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKZAwoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSNwoIZmVhdHVyZXMYIyABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiK5EAoKRmVhdHVyZVNldBKRAQoOZmllbGRfcHJlc2VuY2UYASABKA4yKS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlQj+IAQGYAQSYAQGiAQ0SCEVYUExJQ0lUGIQHogENEghJTVBMSUNJVBjnB6IBDRIIRVhQTElDSVQY6AeyAQMI6AdSDWZpZWxkUHJlc2VuY2USbAoJZW51bV90eXBlGAIgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGVCKYgBAZgBBpgBAaIBCxIGQ0xPU0VEGIQHogEJEgRPUEVOGOcHsgEDCOgHUghlbnVtVHlwZRKYAQoXcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmcYAyABKA4yMS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5SZXBlYXRlZEZpZWxkRW5jb2RpbmdCLYgBAZgBBJgBAaIBDRIIRVhQQU5ERUQYhAeiAQsSBlBBQ0tFRBjnB7IBAwjoB1IVcmVwZWF0ZWRGaWVsZEVuY29kaW5nEn4KD3V0ZjhfdmFsaWRhdGlvbhgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uQimIAQGYAQSYAQGiAQkSBE5PTkUYhAeiAQsSBlZFUklGWRjnB7IBAwjoB1IOdXRmOFZhbGlkYXRpb24SfgoQbWVzc2FnZV9lbmNvZGluZxgFIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lk1lc3NhZ2VFbmNvZGluZ0ImiAEBmAEEmAEBogEUEg9MRU5HVEhfUFJFRklYRUQYhAeyAQMI6AdSD21lc3NhZ2VFbmNvZGluZxKCAQoLanNvbl9mb3JtYXQYBiABKA4yJi5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0QjmIAQGYAQOYAQaYAQGiARcSEkxFR0FDWV9CRVNUX0VGRk9SVBiEB6IBChIFQUxMT1cY5weyAQMI6AdSCmpzb25Gb3JtYXQSqwEKFGVuZm9yY2VfbmFtaW5nX3N0eWxlGAcgASgOMi4uZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW5mb3JjZU5hbWluZ1N0eWxlQkmIAQKYAQGYAQKYAQOYAQSYAQWYAQaYAQeYAQiYAQmiARESDFNUWUxFX0xFR0FDWRiEB6IBDhIJU1RZTEUyMDI0GOkHsgEDCOkHUhJlbmZvcmNlTmFtaW5nU3R5bGUSuQEKGWRlZmF1bHRfc3ltYm9sX3Zpc2liaWxpdHkYCCABKA4yRS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5WaXNpYmlsaXR5RmVhdHVyZS5EZWZhdWx0U3ltYm9sVmlzaWJpbGl0eUI2iAECmAEBogEPEgpFWFBPUlRfQUxMGIQHogEVEhBFWFBPUlRfVE9QX0xFVkVMGOkHsgEDCOkHUhdkZWZhdWx0U3ltYm9sVmlzaWJpbGl0eRqhAQoRVmlzaWJpbGl0eUZlYXR1cmUigQEKF0RlZmF1bHRTeW1ib2xWaXNpYmlsaXR5EiUKIURFRkFVTFRfU1lNQk9MX1ZJU0lCSUxJVFlfVU5LTk9XThAAEg4KCkVYUE9SVF9BTEwQARIUChBFWFBPUlRfVE9QX0xFVkVMEAISDQoJTE9DQUxfQUxMEAMSCgoGU1RSSUNUEARKCAgBEICAgIACIlwKDUZpZWxkUHJlc2VuY2USGgoWRklFTERfUFJFU0VOQ0VfVU5LTk9XThAAEgwKCEVYUExJQ0lUEAESDAoISU1QTElDSVQQAhITCg9MRUdBQ1lfUkVRVUlSRUQQAyI3CghFbnVtVHlwZRIVChFFTlVNX1RZUEVfVU5LTk9XThAAEggKBE9QRU4QARIKCgZDTE9TRUQQAiJWChVSZXBlYXRlZEZpZWxkRW5jb2RpbmcSIwofUkVQRUFURURfRklFTERfRU5DT0RJTkdfVU5LTk9XThAAEgoKBlBBQ0tFRBABEgwKCEVYUEFOREVEEAIiSQoOVXRmOFZhbGlkYXRpb24SGwoXVVRGOF9WQUxJREFUSU9OX1VOS05PV04QABIKCgZWRVJJRlkQAhIICgROT05FEAMiBAgBEAEiUwoPTWVzc2FnZUVuY29kaW5nEhwKGE1FU1NBR0VfRU5DT0RJTkdfVU5LTk9XThAAEhMKD0xFTkdUSF9QUkVGSVhFRBABEg0KCURFTElNSVRFRBACIkgKCkpzb25Gb3JtYXQSFwoTSlNPTl9GT1JNQVRfVU5LTk9XThAAEgkKBUFMTE9XEAESFgoSTEVHQUNZX0JFU1RfRUZGT1JUEAIiVwoSRW5mb3JjZU5hbWluZ1N0eWxlEiAKHEVORk9SQ0VfTkFNSU5HX1NUWUxFX1VOS05PV04QABINCglTVFlMRTIwMjQQARIQCgxTVFlMRV9MRUdBQ1kQAiqwAQjoBxCLThqnARIdCOgHEgcucGIuY3BwGg8ucGIuQ3BwRmVhdHVyZXMSHwjpBxIILnBiLmphdmEaEC5wYi5KYXZhRmVhdHVyZXMSGwjqBxIGLnBiLmdvGg4ucGIuR29GZWF0dXJlcxIjCOsHEgoucGIucHl0aG9uGhIucGIuUHl0aG9uRmVhdHVyZXMSIwiGThIKLnBiLnByb3RvMRoSLnBiLlByb3RvMUZlYXR1cmVzKgYIi04QkE4qBgiQThCRTkoGCOcHEOgHIu8DChJGZWF0dXJlU2V0RGVmYXVsdHMSWAoIZGVmYXVsdHMYASADKAsyPC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdFIIZGVmYXVsdHMSQQoPbWluaW11bV9lZGl0aW9uGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1pbmltdW1FZGl0aW9uEkEKD21heGltdW1fZWRpdGlvbhgFIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5tYXhpbXVtRWRpdGlvbhr4AQoYRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhJOChRvdmVycmlkYWJsZV9mZWF0dXJlcxgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UhNvdmVycmlkYWJsZUZlYXR1cmVzEkIKDmZpeGVkX2ZlYXR1cmVzGAUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSDWZpeGVkRmVhdHVyZXNKBAgBEAJKBAgCEANSCGZlYXR1cmVzIp4DCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyp1CIDsyv8BEIHsyv8BGmcSZQiA7Mr/ARIxLmJ1Zi5kZXNjcmlwdG9yLnYxLmJ1Zl9zb3VyY2VfY29kZV9pbmZvX2V4dGVuc2lvbhoqLmJ1Zi5kZXNjcmlwdG9yLnYxLlNvdXJjZUNvZGVJbmZvRXh0ZW5zaW9uItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////BypVChBTeW1ib2xWaXNpYmlsaXR5EhQKEFZJU0lCSUxJVFlfVU5TRVQQABIUChBWSVNJQklMSVRZX0xPQ0FMEAESFQoRVklTSUJJTElUWV9FWFBPUlQQAkJ+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uSojwAwoHEgUmAIgLAQqqDwoBDBIDJgASMsEMIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoy2wIgQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQogIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAgU2FuamF5IEdo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FgoMCgUEAQIKARIDfRceCgwKBQQBAgoDEgN9ISIK9QEKBAQBAgsSBIMBAi8a5gEgVGhpcyBmaWVsZCBjb250YWlucyBvcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuCiBZb3UgbWF5IHNhZmVseSByZW1vdmUgdGhpcyBlbnRpcmUgZmllbGQgd2l0aG91dCBoYXJtaW5nIHJ1bnRpbWUKIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRlc2NyaXB0b3JzIC0tIHRoZSBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgb25seSBieQogZGV2ZWxvcG1lbnQgdG9vbHMuCgoNCgUEAQILBBIEgwECCgoNCgUEAQILBhIEgwELGQoNCgUEAQILARIEgwEaKgoNCgUEAQILAxIEgwEtLgr5AgoEBAECDBIEjAECHhrqAiBUaGUgc3ludGF4IG9mIHRoZSBwcm90byBmaWxlLgogVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlICJwcm90bzIiLCAicHJvdG8zIiwgYW5kICJlZGl0aW9ucyIuCgogSWYgYGVkaXRpb25gIGlzIHByZXNlbnQsIHRoaXMgdmFsdWUgbXVzdCBiZSAiZWRpdGlvbnMiLgogV0FSTklORzogVGhpcyBmaWVsZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHByb3RvYnVmIHBsdWdpbnMgb3Igc3BlY2lhbAogY2FzZXMgbGlrZSB0aGUgcHJvdG8gY29tcGlsZXIuIE90aGVyIHVzZXMgYXJlIGRpc2NvdXJhZ2VkIGFuZAogZGV2ZWxvcGVycyBzaG91bGQgcmVseSBvbiB0aGUgcHJvdG9yZWZsZWN0IEFQSXMgZm9yIHRoZWlyIGNsaWVudCBsYW5ndWFnZS4KCg0KBQQBAgwEEgSMAQIKCg0KBQQBAgwFEgSMAQsRCg0KBQQBAgwBEgSMARIYCg0KBQQBAgwDEgSMARsdCoICCgQEAQINEgSSAQIgGvMBIFRoZSBlZGl0aW9uIG9mIHRoZSBwcm90byBmaWxlLgogV0FSTklORzogVGhpcyBmaWVsZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHByb3RvYnVmIHBsdWdpbnMgb3Igc3BlY2lhbAog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ZXJ3aXNlLCBpdCdzIGRlZHVjZWQgZnJvbSB0aGUgZmllbGQncyBuYW1lIGJ5IGNvbnZlcnRpbmcKIGl0IHRvIGNhbWVsQ2FzZS4KCg0KBQQEAggEEgTAAgIKCg0KBQQEAggFEgTAAgsRCg0KBQQEAggBEgTAAhIbCg0KBQQEAggDEgTAAh4gCgwKBAQEAgkSBMICAiQKDQoFBAQCCQQSBMICAgoKDQoFBAQCCQYSBMICCxcKDQoFBAQCCQESBMICGB8KDQoFBAQCCQMSBMICIiMKsAkKBAQEAgoSBNkCAiUaoQkgSWYgdHJ1ZSwgdGhpcyBpcyBhIHByb3RvMyAib3B0aW9uYWwiLiBXaGVuIGEgcHJvdG8zIGZpZWxkIGlzIG9wdGlvbmFsLCBpdAogdHJhY2tzIHByZXNlbmNlIHJlZ2FyZGxlc3Mgb2YgZmllbGQgdHlwZS4KCiBXaGVuIHByb3RvM19vcHRpb25hbCBpcyB0cnVlLCB0aGlzIGZpZWxkIG11c3QgYmVsb25nIHRvIGEgb25lb2YgdG8gc2lnbmFsCiB0byBvbGQgcHJvdG8zIGNsaWVudHMgdGhhdCBwcmVzZW5jZSBpcyB0cmFja2VkIGZvciB0aGlzIGZpZWxkLiBUaGlzIG9uZW9mCiBpcyBrbm93biBhcyBhICJzeW50aGV0aWMiIG9uZW9mLCBhbmQgdGhpcyBmaWVsZCBtdXN0IGJlIGl0cyBzb2xlIG1lbWJlcgogKGVhY2ggcHJvdG8zIG9wdGlvbmFsIGZpZWxkIGdldHMgaXRzIG93biBzeW50aGV0aWMgb25lb2YpLiBTeW50aGV0aWMgb25lb2ZzCiBleGlzdCBpbiB0aGUgZGVzY3JpcHRvciBvbmx5LCBhbmQgZG8gbm90IGdlbmVyYXRlIGFueSBBUEkuIFN5bnRoZXRpYyBvbmVvZnMKIG11c3QgYmUgb3JkZXJlZCBhZnRlciBhbGwgInJlYWwiIG9uZW9mcy4KCiBGb3IgbWVzc2FnZSBmaWVsZHMsIHByb3RvM19vcHRpb25hbCBkb2Vzbid0IGNyZWF0ZSBhbnkgc2VtYW50aWMgY2hhbmdlLAogc2luY2Ugbm9uLXJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzIGFsd2F5cyB0cmFjayBwcmVzZW5jZS4gSG93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dmUgbWF5IGhhdmUgIm9wdGlvbnMiIGF0dGFjaGVkLiAgVGhlc2UgYXJlCiBqdXN0IGFubm90YXRpb25zIHdoaWNoIG1heSBjYXVzZSBjb2RlIHRvIGJlIGdlbmVyYXRlZCBzbGlnaHRseSBkaWZmZXJlbnRseQogb3IgbWF5IGNvbnRhaW4gaGludHMgZm9yIGNvZGUgdGhhdCBtYW5pcHVsYXRlcyBwcm90b2NvbCBtZXNzYWdlcy4KCiBDbGllbnRzIG1heSBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgYXMgZXh0ZW5zaW9ucyBvZiB0aGUgKk9wdGlvbnMgbWVzc2FnZXMuCiBUaGVzZSBleHRlbnNpb25zIG1heSBub3QgeWV0IGJlIGtub3duIGF0IHBhcnNpbmcgdGltZSwgc28gdGhlIHBhcnNlciBjYW5ub3QKIHN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlbS4gIEluc3RlYWQgaXQgc3RvcmVzIHRoZW0gaW4gYSBmaWVsZCBpbiB0aGUgKk9wdGlvbnMKIG1lc3NhZ2UgY2FsbGVkIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLiBUaGlzIGZpZWxkIG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lCiBhY3Jvc3MgYWxsICpPcHRpb25zIG1lc3NhZ2VzLiBXZSB0aGVuIHVzZSB0aGlzIGZpZWxkIHRvIHBvcHVsYXRlIHRoZQogZXh0ZW5zaW9ucyB3aGVuIHdlIGJ1aWxkIGEgZGVzY3JpcHRvciwgYXQgd2hpY2ggcG9pbnQgYWxsIHByb3RvcyBoYXZlIGJlZW4KIHBhcnNlZCBhbmQgc28gYWxsIGV4dGVuc2lvbnMgYXJlIGtub3duLgoKIEV4dGVuc2lvbiBudW1iZXJzIGZvciBjdXN0b20gb3B0aW9ucyBtYXkgYmUgY2hvc2VuIGFzIGZvbGxvd3M6CiAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbiBvcgogICBvcmdhbml6YXRpb24sIG9yIGZvciBleHBlcmltZW50YWwgb3B0aW9ucywgdXNlIGZpZWxkIG51bWJlcnMgNTAwMDAKICAgdGhyb3VnaCA5OTk5OS4gIEl0IGlzIHVwIHRvIHlvdSB0byBlbnN1cmUgdGhhdCB5b3UgZG8gbm90IHVzZSB0aGUKICAgc2FtZSBudW1iZXIgZm9yIG11bHRpcGxlIG9wdGlvbnMuCiAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgYmUgcHVibGlzaGVkIGFuZCB1c2VkIHB1YmxpY2x5IGJ5IG11bHRpcGxlCiAgIGluZGVwZW5kZW50IGVudGl0aWVzLCBlLW1haWwgcHJvdG9idWYtZ2xvYmFsLWV4dGVuc2lvbi1yZWdpc3RyeUBnb29nbGUuY29tCiAgIHRvIHJlc2VydmUgZXh0ZW5zaW9uIG51bWJlcnMuIFNpbXBseSBwcm92aWRlIHlvdXIgcHJvamVjdCBuYW1lIChlLmcuCiAgIE9iamVjdGl2ZS1DIHBsdWdpbikgYW5kIHlvdXIgcHJvamVjdCB3ZWJzaXRlIChpZiBhdmFpbGFibGUpIC0tIHRoZXJlJ3Mgbm8KICAgbmVlZCB0byBleHBsYWluIGhvdyB5b3UgaW50ZW5kIHRvIHVzZSB0aGVtLiBVc3VhbGx5IHlvdSBvbmx5IG5lZWQgb25lCiAgIGV4dGVuc2lvbiBudW1iZXIuIFlvdSBjYW4gZGVjbGFyZSBtdWx0aXBsZSBvcHRpb25zIHdpdGggb25seSBvbmUgZXh0ZW5zaW9uCiAgIG51bWJlciBieSBwdXR0aW5nIHRoZW0gaW4gYSBzdWItbWVzc2FnZS4gU2VlIHRoZSBDdXN0b20gT3B0aW9ucyBzZWN0aW9uIG9mCiAgIHRoZSBkb2NzIGZvciBleGFtcGxlczoKICAgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvI29wdGlvbnMKICAgSWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgcG9wdWxhciwgYSB3ZWIgc2VydmljZSB3aWxsIGJlIHNldCB1cAogICB0byBhdXRvbWF0aWNhbGx5IGFzc2lnbiBvcHRpb24gbnVtYmVycy4KCgsKAwQKARIEwwMIEwr0AQoEBAoCABIEyQMCIxrlASBTZXRzIHRoZSBKYXZhIHBhY2thZ2Ugd2hlcmUgY2xhc3NlcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIC5wcm90byB3aWxsIGJlCiBwbGFjZWQuICBCeSBkZWZhdWx0LCB0aGUgcHJvdG8gcGFja2FnZSBpcyB1c2VkLCBidXQgdGhpcyBpcyBvZnRlbgogaW5hcHByb3ByaWF0ZSBiZWNhdXNlIHByb3RvIHBhY2thZ2VzIGRvIG5vdCBub3JtYWxseSBzdGFydCB3aXRoIGJhY2t3YXJkcwogZG9tYWluIG5hbWVzLgoKDQoFBAoCAAQSBMkDAgoKDQoFBAoCAAUSBMkDCxEKDQoFBAoCAAESBMkDEh4KDQoFBAoCAAMSBMkDISIK8QIKBAQKAgESBNADAisa4gIgQ29udHJvbHMgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgSmF2YSBjbGFzcyBnZW5lcmF0ZWQgZm9yIHRoZSAucHJvdG8gZmlsZS4KIFRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgY29udGFpbiB0aGUgLnByb3RvIGZpbGUncyBnZXREZXNjcmlwdG9yKCkgbWV0aG9kIGFzCiB3ZWxsIGFzIGFueSB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KIElmIGphdmFfbXVsdGlwbGVfZmlsZXMgaXMgZGlzYWJsZWQsIHRoZW4gYWxsIHRoZSBvdGhlciBjbGFzc2VzIGZyb20gdGhlCiAucHJvdG8gZmlsZSB3aWxsIGJlIG5lc3RlZCBpbnNpZGUgdGhlIHNpbmdsZSB3cmFwcGVyIG91dGVyIGNsYXNzLgoKDQoFBAoCAQQSBNADAgoKDQoFBAoCAQUSBNADCxEKDQoFBAoCAQESBNADEiYKDQoFBAoCAQMSBNADKSoKpgMKBAQKAgISBNgDAjsalwMgSWYgZW5hYmxlZCwgdGhlbiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGEgc2VwYXJhdGUgLmphdmEKIGZpbGUgZm9yIGVhY2ggdG9wLWxldmVsIG1lc3NhZ2UsIGVudW0sIGFuZCBzZXJ2aWNlIGRlZmluZWQgaW4gdGhlIC5wcm90bwogZmlsZS4gIFRodXMsIHRoZXNlIHR5cGVzIHdpbGwgKm5vdCogYmUgbmVzdGVkIGluc2lkZSB0aGUgd3JhcHBlciBj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bWVudGF0aW9ucyBzdGlsbCBuZWVkIHRvIHdvcmsgYXMKIGlmIHRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQuCgogTk9URTogRG8gbm90IHNldCB0aGUgb3B0aW9uIGluIC5wcm90byBmaWxlcy4gQWx3YXlzIHVzZSB0aGUgbWFwcyBzeW50YXgKIGluc3RlYWQuIFRoZSBvcHRpb24gc2hvdWxkIG9ubHkgYmUgaW1wbGljaXRseSBzZXQgYnkgdGhlIHByb3RvIGNvbXBpbGVyCiBwYXJzZXIuCgoNCgUECwIDBBIE+wQCCgoNCgUECwIDBRIE+wQLDwoNCgUECwIDARIE+wQQGQoNCgUECwIDAxIE+wQcHQokCgMECwkSBP0EAg0iFyBqYXZhbGl0ZV9zZXJpYWxpemFibGUKCgwKBAQLCQMSBP0ECwwKDQoFBAsJAwESBP0ECwwKDQoFBAsJAwISBP0ECwwKHwoDBAsJEgT+BAINIhIgamF2YW5hbm9fYXNfbGl0ZQoKDAoEBAsJBBIE/gQLDAoNCgUECwkEARIE/gQLDAoNCgUECwkEAhIE/gQLDArdAwoEBAsCBBIEigUCUBrOAyBFbmFibGUgdGhlIGxlZ2FjeSBoYW5kbGluZyBvZiBKU09OIGZpZWxkIG5hbWUgY29uZmxpY3RzLiAgVGhpcyBsb3dlcmNhc2VzCiBhbmQgc3RyaXBzIHVuZGVyc2NvcmVkIGZyb20gdGhlIGZpZWxkcyBiZWZvcmUgY29tcGFyaXNvbiBpbiBwcm90bzMgb25seS4KIFRoZSBuZXcgYmVoYXZpb3IgdGFrZXMgYGpzb25fbmFtZWAgaW50byBhY2NvdW50IGFuZCBhcHBsaWVzIHRvIHByb3RvMiBhcwogd2VsbC4KCiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkgbWVhc3VyZSBhZ2FpbnN0IGJyb2tlbiBidWlsZHMgZHVlCiB0byB0aGUgY2hhbmdlIGluIGJlaGF2aW9yIGZvciBKU09OIGZpZWxkIG5hbWUgY29uZmxpY3RzLgoKIFRPRE8gVGhpcyBpcyBsZWdhY3kgYmVoYXZpb3Igd2UgcGxhbiB0byByZW1vdmUgb25jZSBkb3duc3RyZWFtCiB0ZWFtcyBoYXZlIGhhZCB0aW1lIHRvIG1pZ3JhdGUuCgoNCgUECwIEBBIEigUCCgoNCgUECwIEBRIEigULDwoNCgUECwIEARIEigUQNgoNCgUECwIEAxIEigU5OwoNCgUECwIECBIEigU8TwoOCgYECwIECAMSBIoFPU4KkQIKBAQLAgUSBJAFAiQaggIgQW55IGZlYXR1cmVzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljIGVkaXRpb24uCiBXQVJOSU5HOiBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9idWYgcGx1Z2lucyBvciBzcGVjaWFsCiBjYXNlcyBsaWtlIHRoZSBwcm90byBjb21waWxlci4gT3RoZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBAsCBQQSBJAFAgoKDQoFBAsCBQYSBJAFCxUKDQoFBAsCBQESBJAFFh4KDQoFBAsCBQMSBJAFISMKTwoEBAsCBhIEkwUCOhpBIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgoKDQoFBAsCBgQSBJMFAgoKDQoFBAsCBgYSBJMFCx4KDQoFBAsCBgESBJMFHzMKDQoFBAsCBgMSBJMFNjkKWgoDBAsFEgSWBQIZGk0gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCgoMCgQECwUAEgSWBQ0YCg0KBQQLBQABEgSWBQ0RCg0KBQQLBQACEgSWBRUYCgwKAgQMEgaZBQC/BgEKCwoDBAwBEgSZBQgUCsIDCgQEDAIAEgShBQJFGrMDIE5PVEU6IGN0eXBlIGlzIGRlcHJlY2F0ZWQuIFVzZSBgZmVhdHVyZXMuKHBiLmNwcCkuc3RyaW5nX3R5cGVgIGluc3RlYWQuCiBUaGUgY3R5cGUgb3B0aW9uIGluc3RydWN0cyB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHRvIHVzZSBhIGRpZmZlcmVudAogcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpZWxkIHRoYW4gaXQgbm9ybWFsbHkgd291bGQuICBTZWUgdGhlIHNwZWNpZmljCiBvcHRpb25zIGJlbG93LiAgVGhpcyBvcHRpb24gaXMgb25seSBpbXBsZW1lbnRlZCB0byBzdXBwb3J0IHVzZSBvZgogW2N0eXBlPUNPUkRdIGFuZCBbY3R5cGU9U1RSSU5HXSAodGhlIGRlZmF1bHQpIG9uIG5vbi1yZXBlYXRlZCBmaWVsZHMgb2YKIHR5cGUgImJ5dGVzIiBpbiB0aGUgb3BlbiBzb3VyY2UgcmVsZWFzZS4KIFRPRE86IG1ha2UgY3R5cGUgYWN0dWFsbHkgZGVwcmVjYXRlZC4KCg0KBQQMAgAEEgShBQIKCg0KBQQMAgAGEgShBQsQCg0KBQQMAgABEgShBREWCg0KBQQMAgADEgShBRkaCg0KBQQMAgAIEgShBRtECg0KBQQMAgAHEgShBTNDCg4KBAQMBAASBqIFAq8FAwoNCgUEDAQAARIEogUHDAofCgYEDAQAAgASBKQFBA8aDyBEZWZhdWx0IG1vZGUuCgoPCgcEDAQAAgABEgSkBQQKCg8KBwQMBAACAAISBKQFDQ4KlgMKBgQMBAACARIErAUEDRqFAyBUaGUgb3B0aW9uIFtjdHlwZT1DT1JEXSBtYXkgYmUgYXBwbGllZCB0byBhIG5vbi1yZXBlYXRlZCBmaWVsZCBvZiB0eXBlCiAiYnl0ZXMiLiBJdCBpbmRpY2F0ZXMgdGhhdCBpbiBDKyssIHRoZSBkYXRhIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBDb3JkCiBpbnN0ZWFkIG9mIGEgc3RyaW5nLiAgRm9yIHZlcnkgbGFyZ2Ugc3RyaW5ncywgdGhpcyBtYXkgcmVkdWNlIG1lbW9yeQogZnJhZ21lbnRhdGlvbi4gSXQgbWF5IGFsc28gYWxsb3cgYmV0dGVyIHBlcmZvcm1hbmNlIHdoZW4gcGFyc2luZyBmcm9tIGEKIENvcmQsIG9yIHdoZW4gcGFyc2luZyB3aXRoIGFsaWFzaW5nIGVuYWJsZWQsIGFzIHRoZSBwYXJzZWQgQ29yZCBtYXkgdGhlbgogYWxpYXMgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KCg8KBwQMBAACAQESBKwFBAgKDwoHBAwEAAIBAhIErAULDAoOCgYEDAQAAgISBK4FBBUKDwoHBAwEAAICARIErgUEEAoPCgcEDAQAAgICEgSuBRMUCtMDCgQEDAIBEgS3BQIbGsQDIFRoZSBwYWNrZWQgb3B0aW9uIGNhbiBiZSBlbmFibGVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIHRvIGVuYWJsZQogYSBtb3JlIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvbiB0aGUgd2lyZS4gUmF0aGVyIHRoYW4gcmVwZWF0ZWRseQogd3JpdGluZyB0aGUgdGFnIGFuZCB0eXBlIGZvciBlYWNoIGVsZW1lbnQsIHRoZSBlbnRpcmUgYXJyYXkgaXMgZW5jb2RlZCBhcwogYSBzaW5nbGUgbGVuZ3RoLWRlbGltaXRlZCBibG9iLiBJbiBwcm90bzMsIG9ubHkgZXhwbGljaXQgc2V0dGluZyBpdCB0bwogZmFsc2Ugd2lsbCBhdm9pZCB1c2luZyBwYWNrZWQgZW5jb2RpbmcuICBUaGlzIG9wdGlvbiBpcyBwcm9oaWJpdGVkIGluCiBFZGl0aW9ucywgYnV0IHRoZSBgcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmdgIGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gY29udHJvbAogdGhlIGJlaGF2aW9yLgoKDQoFBAwCAQQSBLcFAgoKDQoFBAwCAQUSBLcFCw8KDQoFBAwCAQESBLcFEBYKDQoFBAwCAQMSBLcFGRoKmgUKBAQMAgISBMQFAjMaiwUgVGhlIGpzdHlwZSBvcHRpb24gZGV0ZXJtaW5lcyB0aGUgSmF2YVNjcmlwdCB0eXBlIHVzZWQgZm9yIHZhbHVlcyBvZiB0aGUKIGZpZWxkLiAgVGhlIG9wdGlvbiBpcyBwZXJtaXR0ZWQgb25seSBmb3IgNjQgYml0IGludGVncmFsIGFuZCBmaXhlZCB0eXBlcwogKGludDY0LCB1aW50NjQsIHNpbnQ2NCwgZml4ZWQ2NCwgc2ZpeGVkNjQpLiAgQSBmaWVsZCB3aXRoIGpzdHlwZSBKU19TVFJJTkcKIGlzIHJlcHJlc2VudGVkIGFzIEphdmFTY3JpcHQgc3RyaW5nLCB3aGljaCBhdm9pZHMgbG9zcyBvZiBwcmVjaXNpb24gdGhhdAogY2FuIGhhcHBlbiB3aGVuIGEgbGFyZ2UgdmFsdWUgaXMgY29udmVydGVkIHRvIGEgZmxvYXRpbmcgcG9pbnQgSmF2YVNjcmlwdC4KIFNwZWNpZnlpbmcgSlNfTlVNQkVSIGZvciB0aGUganN0eXBlIGNhdXNlcyB0aGUgZ2VuZXJhdGVkIEphdmFTY3JpcHQgY29kZSB0bwogdXNlIHRoZSBKYXZhU2NyaXB0ICJudW1iZXIiIHR5cGUuICBUaGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgb3B0aW9uCiBKU19OT1JNQUwgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LgoKIFRoaXMgb3B0aW9uIGlzIGFuIGVudW0gdG8gcGVybWl0IGFkZGl0aW9uYWwgdHlwZXMgdG8gYmUgYWRkZWQsIGUuZy4KIGdvb2cubWF0aC5JbnRlZ2VyLgoKDQoFBAwCAgQSBMQFAgoKDQoFBAwCAgYSBMQFCxEKDQoFBAwCAgESBMQFEhgKDQoFBAwCAgMSBMQFGxwKDQoFBAwCAggSBMQFHTIKDQoFBAwCAgcSBMQFHjEKDgoEBAwEARIGxQUCzgUDCg0KBQQMBAEBEgTFBQcNCicKBgQMBAECABIExwUEEhoXIFVzZSB0aGUgZGVmYXVsdCB0eXBlLgoKDwoHBAwEAQIAARIExwUEDQoPCgcEDAQBAgACEgTHBRARCikKBgQMBAECARIEygUEEhoZIFVzZSBKYXZhU2NyaXB0IHN0cmluZ3MuCgoPCgcEDAQBAgEBEgTKBQQNCg8KBwQMBAECAQISBMoFEBEKKQoGBAwEAQICEgTNBQQSGhkgVXNlIEphdmFTY3JpcHQgbnVtYmVycy4KCg8KBwQMBAECAgESBM0FBA0KDwoHBAwEAQICAhIEzQUQEQqZCgoEBAwCAxIE5gUCKxqKCiBTaG91bGQgdGhpcyBmaWVsZCBiZSBwYXJzZWQgbGF6aWx5PyAgTGF6eSBhcHBsaWVzIG9ubHkgdG8gbWVzc2FnZS10eXBlCiBmaWVsZHMuICBJdCBtZWFucyB0aGF0IHdoZW4gdGhlIG91dGVyIG1lc3NhZ2UgaXMgaW5pdGlhbGx5IHBhcnNlZCwgdGhlCiBpbm5lciBtZXNzYWdlJ3MgY29udGVudHMgd2lsbCBub3QgYmUgcGFyc2VkIGJ1dCBpbnN0ZWFkIHN0b3JlZCBpbiBlbmNvZGVkCiBmb3JtLiAgVGhlIGlubmVyIG1lc3NhZ2Ugd2lsbCBhY3R1YWxseSBiZSBwYXJzZWQgd2hlbiBpdCBpcyBmaXJzdCBhY2Nlc3NlZC4KCiBUaGlzIGlzIG9ubHkgYSBoaW50LiAgSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZQogZWFnZXIgb3IgbGF6eSBwYXJzaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uLiAgSG93ZXZlciwKIHNldHRpbmcgdGhpcyBvcHRpb24gdHJ1ZSBzdWdnZXN0cyB0aGF0IHRoZSBwcm90b2NvbCBhdXRob3IgYmVsaWV2ZXMgdGhhdAogdXNpbmcgbGF6eSBwYXJzaW5nIG9uIHRoaXMgZmllbGQgaXMgd29ydGggdGhlIGFkZGl0aW9uYWwgYm9va2tlZXBpbmcKIG92ZXJoZWFkIHR5cGljYWxseSBuZWVkZWQgdG8gaW1wbGVtZW50IGl0LgoKIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhbnkgZ2VuZXJhdGVkIGNvZGU7CiBhbGwgbWV0aG9kIHNpZ25hdHVyZXMgcmVtYWluIHRoZSBzYW1lLiAgRnVydGhlcm1vcmUsIHRocmVhZC1zYWZldHkgb2YgdGhlCiBpbnRlcmZhY2UgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgb3B0aW9uOyBjb25zdCBtZXRob2RzIHJlbWFpbiBzYWZlIHRvCiBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHdoaWxlIG5vbi1jb25zdCBtZXRob2RzIGNvbnRpbnVlCiB0byByZXF1aXJlIGV4Y2x1c2l2ZSBhY2Nlc3MuCgogTm90ZSB0aGF0IGxhenkgbWVzc2FnZSBmaWVsZHMgYXJlIHN0aWxsIGVhZ2VybHkgdmVyaWZpZWQgdG8gY2hlY2sKIGlsbC1mb3JtZWQgd2lyZWZvcm1hdCBvciBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4gQ2FsbGluZyBJc0luaXRpYWxpemVkKCkKIG9uIHRoZSBvdXRlciBtZXNzYWdlIHdvdWxkIGZhaWwgaWYgdGhlIGlubmVyIG1lc3NhZ2UgaGFzIG1pc3NpbmcgcmVxdWlyZWQKIGZpZWxkcy4gRmFpbGVkIHZlcmlmaWNhdGlvbiB3b3VsZCByZXN1bHQgaW4gcGFyc2luZyBmYWlsdXJlIChleGNlcHQgd2hlbgogdW5pbml0aWFsaXplZCBtZXNzYWdlcyBhcmUgYWNjZXB0YWJsZSkuCgoNCgUEDAIDBBIE5gUCCgoNCgUEDAIDBRIE5gULDwoNCgUEDAIDARIE5gUQFAoNCgUEDAIDAxIE5gUXGAoNCgUEDAIDCBIE5gUZKgoNCgUEDAIDBxIE5gUaKQqvAQoEBAwCBBIE6wUCNxqgASB1bnZlcmlmaWVkX2xhenkgZG9lcyBubyBjb3JyZWN0bmVzcyBjaGVja3Mgb24gdGhlIGJ5dGUgc3RyZWFtLiBUaGlzIHNob3VsZAogb25seSBiZSB1c2VkIHdoZXJlIGxhenkgd2l0aCB2ZXJpZmljYXRpb24gaXMgcHJvaGliaXRpdmUgZm9yIHBlcmZvcm1hbmNlCiByZWFzb25zLgoKDQoFBAwCBAQSBOsFAgoKDQoFBAwCBAUSBOsFCw8KDQoFBAwCBAESBOsFEB8KDQoFBAwCBAMSBOsFIiQKDQoFBAwCBAgSBOsFJTYKDQoFBAwCBAcSBOsFJjUK6AEKBAQMAgUSBPEFAjEa2QEgSXMgdGhpcyBmaWVsZCBkZXByZWNhdGVkPwogRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwogZm9yIGFjY2Vzc29ycywgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LCB0aGlzCiBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpZWxkcy4KCg0KBQQMAgUEEgTxBQIKCg0KBQQMAgUFEgTxBQsPCg0KBQQMAgUBEgTxBRAaCg0KBQQMAgUD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iAcfMwoNCgUEDwIEAxIEiAc2OQpaCgMEDwUSBIsHAhkaTSBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KCgwKBAQPBQASBIsHDRgKDQoFBA8FAAESBIsHDREKDQoFBA8FAAISBIsHFRgKDAoCBBASBo4HAKYHAQoLCgMEEAESBI4HCBYKkQIKBAQQAgASBJQHAiQaggIgQW55IGZlYXR1cmVzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljIGVkaXRpb24uCiBXQVJOSU5HOiBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9idWYgcGx1Z2lucyBvciBzcGVjaWFsCiBjYXNlcyBsaWtlIHRoZSBwcm90byBjb21waWxlci4gT3RoZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBBACAAQSBJQHAgoKDQoFBBACAAYSBJQHCxUKDQoFBBACAAESBJQHFh4KDQoFBBACAAMSBJQHISMK2QMKBAQQAgESBJ8HAjIa3wEgSXMgdGhpcyBzZXJ2aWNlIGRlcHJlY2F0ZWQ/CiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCiBmb3IgdGhlIHNlcnZpY2UsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwKIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBzZXJ2aWNlcy4KMugBIE5vdGU6ICBGaWVsZCBudW1iZXJzIDEgdGhyb3VnaCAzMiBhcmUgcmVzZXJ2ZWQgZm9yIEdvb2dsZSdzIGludGVybmFsIFJQQwogICBmcmFtZXdvcmsuICBXZSBhcG9sb2dpemUgZm9yIGhvYXJkaW5nIHRoZXNlIG51bWJlcnMgdG8gb3Vyc2Vs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ZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBBECAgQSBMQHAgoKDQoFBBECAgYSBMQHCxUKDQoFBBECAgESBMQHFh4KDQoFBBECAgMSBMQHISMKTwoEBBECAxIExwcCOhpBIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgoKDQoFBBECAwQSBMcHAgoKDQoFBBECAwYSBMcHCx4KDQoFBBECAwESBMcHHzMKDQoFBBECAwMSBMcHNjkKWgoDBBEFEgTKBwIZGk0gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCgoMCgQEEQUAEgTKBw0YCg0KBQQRBQABEgTKBw0RCg0KBQQRBQACEgTKBxUYCosDCgIEEhIG0wcA5wcBGvwCIEEgbWVzc2FnZSByZXByZXNlbnRpbmcgYSBvcHRpb24gdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgb25seQogYXBwZWFycyBpbiBvcHRpb25zIHByb3RvcyBjcmVhdGVkIGJ5IHRoZSBjb21waWxlcjo6UGFyc2VyIGNsYXNzLgogRGVzY3JpcHRvclBvb2wgcmVzb2x2ZXMgdGhlc2Ugd2hlbiBidWlsZGluZyBEZXNjcmlwdG9yIG9iamVjdHMuIFRoZXJlZm9yZSwKIG9wdGlvbnMgcHJvdG9zIGluIGRlc2NyaXB0b3Igb2JqZWN0cyAoZS5nLiByZXR1cm5lZCBieSBEZXNjcmlwdG9yOjpvcHRpb25zKCksCiBvciBwcm9kdWNlZCBieSBEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBuZXZlciBoYXZlIFVuaW50ZXJwcmV0ZWRPcHRpb25zCiBpbiB0aGVtLgoKCwoDBBIBEgTTBwgbCssCCgQEEgMAEgbZBwLcBwMaugIgVGhlIG5hbWUgb2YgdGhlIHVuaW50ZXJwcmV0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bWluaW11bSBzdXBwb3J0ZWQgZWRpdGlvbiAoaW5jbHVzaXZlKSB3aGVuIHRoaXMgd2FzIGNvbnN0cnVjdGVkLgogRWRpdGlvbnMgYmVmb3JlIHRoaXMgd2lsbCBub3QgaGF2ZSBkZWZhdWx0cy4KCg0KBQQUAgEEEgTDCQIKCg0KBQQUAgEGEgTDCQsSCg0KBQQUAgEBEgTDCRMiCg0KBQQUAgEDEgTDCSUmCoYBCgQEFAICEgTHCQInGnggVGhlIG1heGltdW0ga25vd24gZWRpdGlvbiAoaW5jbHVzaXZlKSB3aGVuIHRoaXMgd2FzIGNvbnN0cnVjdGVkLiBFZGl0aW9ucwogYWZ0ZXIgdGhpcyB3aWxsIG5vdCBoYXZlIHJlbGlhYmxlIGRlZmF1bHRzLgoKDQoFBBQCAgQSBMcJAgoKDQoFBBQCAgYSBMcJCxIKDQoFBBQCAgESBMcJEyIKDQoFBBQCAgMSBMcJJSYK2gEKAgQVEgbPCQDXCgEaaiBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIGZyb20gd2hpY2ggYQogRmlsZURlc2NyaXB0b3JQcm90byB3YXMgZ2VuZXJhdGVkLgoyYCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBPcHRpb25hbCBzb3VyY2UgY29kZSBpbmZvCgoLCgMEFQESBM8JCBYKghEKBAQVAgASBPsJAiEa8xAgQSBMb2NhdGlvbiBpZGVudGlmaWVzIGEgcGllY2Ugb2Ygc291cmNlIGNvZGUgaW4gYSAucHJvdG8gZmlsZSB3aGljaAogY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGRlZmluaXRpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkCiB0byBiZSB1c2VmdWwgdG8gSURFcywgY29kZSBpbmRleGVycywgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3JzLCBhbmQgc2ltaWxhcgogdG9vbHMuCgogRm9yIGV4YW1wbGUsIHNheSB3ZSBoYXZlIGEgZmlsZSBsaWtlOgogICBtZXNzYWdlIEZvbyB7CiAgICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CiAgIH0KIExldCdzIGxvb2sgYXQganVzdCB0aGUgZmllbGQgZGVmaW5pdGlvbjoKICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CiAgIF4gICAgICAgXl4gICAgIF5eICBeICBeXl4KICAgYSAgICAgICBiYyAgICAgZGUgIGYgIGdoaQogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKICAgc3BhbiAgIHBhdGggICAgICAgICAgICAgICByZXByZXNlbnRzCiAgIFthLGkpICBbIDQsIDAsIDIsIDAgXSAgICAgVGhlIHdob2xlIGZpZWxkIGRlZmluaXRpb24uCiAgIFthLGIpICBbIDQsIDAsIDIsIDAsIDQgXSAgVGhlIGxhYmVsIChvcHRpb25hbCkuCiAgIFtjLGQpICBbIDQsIDAsIDIsIDAsIDUgXSAgVGhlIHR5cGUgKHN0cmluZykuCiAgIFtlLGYpICBbIDQsIDAsIDIsIDAsIDEgXSAgVGhlIG5hbWUgKGZvbykuCiAgIFtnLGgpICBbIDQsIDAsIDIsIDAsIDMgXSAgVGhlIG51bWJlciAoMSkuCgogTm90ZXM6CiAtIEEgbG9jYXRpb24gbWF5IHJlZmVyIHRvIGEgcmVwZWF0ZWQgZmllbGQgaXRzZWxmIChpLmUuIG5vdCB0byBhbnkKICAgcGFydGljdWxhciBpbmRleCB3aXRoaW4gaXQpLiAgVGhpcyBpcyB1c2VkIHdoZW5ldmVyIGEgc2V0IG9mIGVsZW1lbnRzIGFyZQogICBsb2dpY2FsbHkgZW5jbG9zZWQgaW4gYSBzaW5nbGUgY29kZSBzZWdtZW50LiAgRm9yIGV4YW1wbGUsIGFuIGVudGlyZQogICBleHRlbmQgYmxvY2sgKHBvc3NpYmx5IGNvbnRhaW5pbmcgbXVsdGlwbGUgZXh0ZW5zaW9uIGRlZmluaXRpb25zKSB3aWxsCiAgIGhhdmUgYW4gb3V0ZXIgbG9jYXRpb24gd2hvc2UgcGF0aCByZWZlcnMgdG8gdGhlICJleHRlbnNpb25zIiByZXBlYXRlZAogICBmaWVsZCB3aXRob3V0IGFuIGluZGV4LgogLSBNdWx0aXBsZSBsb2NhdGlvbnMgbWF5IGhhdmUgdGhlIHNhbWUgcGF0aC4gIFRoaXMgaGFwcGVucyB3aGVuIGEgc2luZ2xlCiAgIGxvZ2ljYWwgZGVjbGFyYXRpb24gaXMgc3ByZWFkIG91dCBhY3Jvc3MgbXVsdGlwbGUgcGxhY2VzLiAgVGhlIG1vc3QKICAgb2J2aW91cyBleGFtcGxlIGlzIHRoZSAiZXh0ZW5kIiBibG9jayBhZ2FpbiAtLSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUKICAgZXh0ZW5kIGJsb2NrcyBpbiB0aGUgc2FtZSBzY29wZSwgZWFjaCBvZiB3aGljaCB3aWxsIGhhdmUgdGhlIHNhbWUgcGF0aC4KIC0gQSBsb2NhdGlvbidzIHNwYW4gaXMgbm90IGFsd2F5cyBhIHN1YnNldCBvZiBpdHMgcGFyZW50J3Mgc3Bhbi4gIEZvcgogICBleGFtcGxlLCB0aGUgImV4dGVuZGVlIiBvZiBhbiBleHRlbnNpb24gZGVjbGFyYXRpb24gYXBwZWFycyBhdCB0aGUKICAgYmVnaW5uaW5nIG9mIHRoZSAiZXh0ZW5kIiBibG9jayBhbmQgaXMgc2hhcmVkIGJ5IGFsbCBleHRlbnNpb25zIHdpdGhpbgogICB0aGUgYmxvY2suCiAtIEp1c3QgYmVjYXVzZSBhIGxvY2F0aW9uJ3Mgc3BhbiBpcyBhIHN1YnNldCBvZiBzb21lIG90aGVyIGxvY2F0aW9uJ3Mgc3BhbgogICBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgaXMgYSBkZXNjZW5kYW50LiAgRm9yIGV4YW1wbGUsIGEgImdyb3VwIiBkZWZpbmVzCiAgIGJvdGggYSB0eXBlIGFuZCBhIGZpZWxkIGluIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgVGh1cywgdGhlIGxvY2F0aW9ucwogICBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGFuZCBmaWVsZCBhbmQgdGhlaXIgY29tcG9uZW50cyB3aWxsIG92ZXJsYXAuCiAtIENvZGUgd2hpY2ggdHJpZXMgdG8gaW50ZXJwcmV0IGxvY2F0aW9ucyBzaG91bGQgcHJvYmFibHkgYmUgZGVzaWduZWQgdG8KICAgaWdub3JlIHRob3NlIHRoYXQgaXQgZG9lc24ndCB1bmRlcnN0YW5kLCBhcyBtb3JlIHR5cGVzIG9mIGxvY2F0aW9ucyBjb3VsZAogICBiZSByZWNvcmRlZCBpbiB0aGUgZnV0dXJlLgoKDQoFBBUCAAQSBPsJAgoKDQoFBBUCAAYSBPsJCxMKDQoFBBUCAAESBPsJFBwKDQoFBBUCAAMSBPsJHyAKDgoEBBUDABIG/AkCzwoDCg0KBQQVAwABEgT8CQoSCooHCgYEFQMAAgASBJQKBCwa+QYgSWRlbnRpZmllcyB3aGljaCBwYXJ0IG9mIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHdhcyBkZWZpbmVkIGF0IHRoaXMKIGxvY2F0aW9uLgoKIEVhY2ggZWxlbWVudCBpcyBhIGZpZWxkIG51bWJlciBvciBhbiBpbmRleC4gIFRoZXkgZm9ybSBhIHBhdGggZnJvbQogdGhlIHJvb3QgRmlsZURlc2NyaXB0b3JQcm90byB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIGRlZmluaXRpb24gYXBwZWFycy4KIEZvciBleGFtcGxlLCB0aGlzIHBhdGg6CiAgIFsgNCwgMywgMiwgNywgMSBdCiByZWZlcnMgdG86CiAgIGZpbGUubWVzc2FnZV90eXBlKDMpICAvLyA0LCAzCiAgICAgICAuZmllbGQoNykgICAgICAgICAvLyAyLCA3CiAgICAgICAubmFtZSgpICAgICAgICAgICAvLyAxCiBUaGlzIGlzIGJlY2F1c2UgRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUgaGFzIGZpZWxkIG51bWJlciA0OgogICByZXBlYXRlZCBEZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKIGFuZCBEZXNjcmlwdG9yUHJvdG8uZmllbGQgaGFzIGZpZWxkIG51bWJlciAyOgogICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CiBhbmQgRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSBoYXMgZmllbGQgbnVtYmVyIDE6CiAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKCiBUaHVzLCB0aGUgYWJvdmUgcGF0aCBnaXZlcyB0aGUgbG9jYXRpb24gb2YgYSBmaWVsZCBuYW1lLiAgSWYgd2UgcmVtb3ZlZAogdGhlIGxhc3QgZWxlbWVudDoKICAgWyA0LCAzLCAyLCA3IF0KIHRoaXMgcGF0aCByZWZlcnMgdG8gdGhlIHdob2xlIGZpZWxkIGRlY2xhcmF0aW9uIChmcm9tIHRoZSBiZWdpbm5pbmcKIG9mIHRoZSBsYWJlbCB0byB0aGUgdGVybWluYXRpbmcgc2VtaWNvbG9uKS4KCg8KBwQVAwACAAQSBJQKBAwKDwoHBBUDAAIABRIElAoNEgoPCgcEFQMAAgABEgSUChMXCg8KBwQVAwACAAMSBJQKGhsKDwoHBBUDAAIACBIElAocKwoQCggEFQMAAgAIAhIElAodKgrSAgoGBBUDAAIBEgSbCgQsGsECIEFsd2F5cyBoYXMgZXhhY3RseSB0aHJlZSBvciBmb3VyIGVsZW1lbnRzOiBzdGFydCBsaW5lLCBzdGFydCBjb2x1bW4sCiBlbmQgbGluZSAob3B0aW9uYWwsIG90aGVyd2lzZSBhc3N1bWVkIHNhbWUgYXMgc3RhcnQgbGluZSksIGVuZCBjb2x1bW4uCiBUaGVzZSBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgZmllbGQgZm9yIGVmZmljaWVuY3kuICBOb3RlIHRoYXQgbGluZQogYW5kIGNvbHVtbiBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkIC0tIHR5cGljYWxseSB5b3Ugd2lsbCB3YW50IHRvIGFkZAogMSB0byBlYWNoIGJlZm9yZSBkaXNwbGF5aW5nIHRvIGEgdXNlci4KCg8KBwQVAwACAQQSBJsKBAwKDwoHBBUDAAIBBRIEmwoNEgoPCgcEFQMAAgEBEgSbChMXCg8KBwQVAwACAQMSBJsKGhsKDwoHBBUDAAIBCBIEmwocKwoQCggEFQMAAgEIAhIEmwodKgqlDAoGBBUDAAICEgTMCgQpGpQMIElmIHRoaXMgU291cmNlQ29kZUluZm8gcmVwcmVzZW50cyBhIGNvbXBsZXRlIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgYW55CiBjb21tZW50cyBhcHBlYXJpbmcgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjbGFyYXRpb24gd2hpY2ggYXBwZWFyIHRvIGJlCiBhdHRhY2hlZCB0byB0aGUgZGVjbGFyYXRpb24uCgogQSBzZXJpZXMgb2YgbGluZSBjb21tZW50cyBhcHBlYXJpbmcgb24gY29uc2VjdXRpdmUgbGluZXMsIHdpdGggbm8gb3RoZXIKIHRva2VucyBhcHBlYXJpbmcgb24gdGhvc2UgbGluZXMsIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNpbmdsZSBjb21tZW50LgoKIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgd2lsbCBrZWVwIHBhcmFncmFwaHMgb2YgY29tbWVudHMgdGhhdCBhcHBlYXIKIGJlZm9yZSAoYnV0IG5vdCBjb25uZWN0ZWQgdG8pIHRoZSBjdXJyZW50IGVsZW1lbnQuIEVhY2ggcGFyYWdyYXBoLAogc2VwYXJhdGVkIGJ5IGVtcHR5IGxpbmVzLCB3aWxsIGJlIG9uZSBjb21tZW50IGVsZW1lbnQgaW4gdGhlIHJlcGVhdGVkCiBmaWVsZC4KCiBPbmx5IHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcHJvdmlkZWQ7IGNvbW1lbnQgbWFya2VycyAoZS5nLiAvLykgYXJlCiBzdHJpcHBlZCBvdXQuICBGb3IgYmxvY2sgY29tbWVudHMsIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgYW4gYXN0ZXJpc2sKIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvdGhlciB0aGFuIHRoZSBmaXJzdC4KIE5ld2xpbmVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgoKIEV4YW1wbGVzOgoKICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gZm9vLgogICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhci4KICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMjsKCiAgIG9wdGlvbmFsIHN0cmluZyBiYXogPSAzOwogICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhei4KICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIGJhei4KCiAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gbW9vLgogICAv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Z2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKCAoBAhIDIAAYCggKAQgSAyIAHwoJCgIIHxIDIgAfCggKAQgSAyMASAoJCgIICxIDIwBICggKAQgSAyQALAoJCgIIARIDJAAsCggKAQgSAyUALgoJCgIICBIDJQAuCggKAQgSAyYAIgoJCgIIChIDJgAiCggKAQgSAycAIQoJCgIIJBIDJwAhCggKAQgSAygAOwoJCgIIJRIDKAA7Cp0QCgIEABIEZQByARqQECBBIER1cmF0aW9uIHJlcHJlc2VudHMgYSBzaWduZWQsIGZpeGVkLWxlbmd0aCBzcGFuIG9mIHRpbWUgcmVwcmVzZW50ZWQKIGFzIGEgY291bnQgb2Ygc2Vjb25kcyBhbmQgZnJhY3Rpb25zIG9mIHNlY29uZHMgYXQgbmFub3NlY29uZAogcmVzb2x1dGlvbi4gSXQgaXMgaW5kZXBlbmRlbnQgb2YgYW55IGNhbGVuZGFyIGFuZCBjb25jZXB0cyBsaWtlICJkYXkiCiBvciAibW9udGgiLiBJdCBpcyByZWxhdGVkIHRvIFRpbWVzdGFtcCBpbiB0aGF0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KIHR3byBUaW1lc3RhbXAgdmFsdWVzIGlzIGEgRHVyYXRpb24gYW5kIGl0IGNhbiBiZSBhZGRlZCBvciBzdWJ0cmFjdGVkCiBmcm9tIGEgVGltZXN0YW1wLiBSYW5nZSBpcyBhcHByb3hpbWF0ZWx5ICstMTAsMDAwIHllYXJzLgoKICMgRXhhbXBsZXMKCiBFeGFtcGxlIDE6IENvbXB1dGUgRHVyYXRpb24gZnJvbSB0d28gVGltZXN0YW1wcyBpbiBwc2V1ZG8gY29kZS4KCiAgICAgVGltZXN0YW1wIHN0YXJ0ID0gLi4uOwogICAgIFRpbWVzdGFtcCBlbmQgPSAuLi47CiAgICAgRHVyYXRpb24gZHVyYXRpb24gPSAuLi47CgogICAgIGR1cmF0aW9uLnNlY29uZHMgPSBlbmQuc2Vjb25kcyAtIHN0YXJ0LnNlY29uZHM7CiAgICAgZHVyYXRpb24ubmFub3MgPSBlbmQubmFub3MgLSBzdGFydC5uYW5vczsKCiAgICAgaWYgKGR1cmF0aW9uLnNlY29uZHMgPCAwICYmIGR1cmF0aW9uLm5hbm9zID4gMCkgewogICAgICAgZHVyYXRpb24uc2Vjb25kcyArPSAxOwogICAgICAgZHVyYXRpb24ubmFub3MgLT0gMTAwMDAwMDAwMDsKICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uLnNlY29uZHMgPiAwICYmIGR1cmF0aW9uLm5hbm9zIDwgMCkgewogICAgICAgZHVyYXRpb24uc2Vjb25kcyAtPSAxOwogICAgICAgZHVyYXRpb24ubmFub3MgKz0gMTAwMDAwMDAwMDsKICAgICB9CgogRXhhbXBsZSAyOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFRpbWVzdGFtcCArIER1cmF0aW9uIGluIHBzZXVkbyBjb2RlLgoKICAgICBUaW1lc3RhbXAgc3RhcnQgPSAuLi47CiAgICAgRHVyYXRpb24gZHVyYXRpb24gPSAuLi47CiAgICAgVGltZXN0YW1wIGVuZCA9IC4uLjsKCiAgICAgZW5kLnNlY29uZHMgPSBzdGFydC5zZWNvbmRzICsgZHVyYXRpb24uc2Vjb25kczsKICAgICBlbmQubmFub3MgPSBzdGFydC5uYW5vcyArIGR1cmF0aW9uLm5hbm9zOwoKICAgICBpZiAoZW5kLm5hbm9zIDwgMCkgewogICAgICAgZW5kLnNlY29uZHMgLT0gMTsKICAgICAgIGVuZC5uYW5vcyArPSAxMDAwMDAwMDAwOwogICAgIH0gZWxzZSBpZiAoZW5kLm5hbm9zID49IDEwMDAwMDAwMDApIHsKICAgICAgIGVuZC5zZWNvbmRzICs9IDE7CiAgICAgICBlbmQubmFub3MgLT0gMTAwMDAwMDAwMDsKICAgICB9CgogRXhhbXBsZSAzOiBDb21wdXRlIER1cmF0aW9uIGZyb20gZGF0ZXRpbWUudGltZWRlbHRhIGluIFB5dGhvbi4KCiAgICAgdGQgPSBkYXRldGltZS50aW1lZGVsdGEoZGF5cz0zLCBtaW51dGVzPTEwKQogICAgIGR1cmF0aW9uID0gRHVyYXRpb24oKQogICAgIGR1cmF0aW9uLkZyb21UaW1lZGVsdGEodGQpCgogIyBKU09OIE1hcHBpbmcKCiBJbiBKU09OIGZvcm1hdCwgdGhlIER1cmF0aW9uIHR5cGUgaXMgZW5jb2RlZCBhcyBhIHN0cmluZyByYXRoZXIgdGhhbiBhbgogb2JqZWN0LCB3aGVyZSB0aGUgc3RyaW5nIGVuZHMgaW4gdGhlIHN1ZmZpeCAicyIgKGluZGljYXRpbmcgc2Vjb25kcykgYW5kCiBpcyBwcmVjZWRlZCBieSB0aGUgbnVtYmVyIG9mIHNlY29uZHMsIHdpdGggbmFub3NlY29uZHMgZXhwcmVzc2VkIGFzCiBmcmFjdGlvbmFsIHNlY29uZHMuIEZvciBleGFtcGxlLCAzIHNlY29uZHMgd2l0aCAwIG5hbm9zZWNvbmRzIHNob3VsZCBiZQogZW5jb2RlZCBpbiBKU09OIGZvcm1hdCBhcyAiM3MiLCB3aGlsZSAzIHNlY29uZHMgYW5kIDEgbmFub3NlY29uZCBzaG91bGQKIGJlIGV4cHJlc3NlZCBpbiBKU09OIGZvcm1hdCBhcyAiMy4wMDAwMDAwMDFzIiwgYW5kIDMgc2Vjb25kcyBhbmQgMQogbWljcm9zZWNvbmQgc2hvdWxkIGJlIGV4cHJlc3NlZCBpbiBKU09OIGZvcm1hdCBhcyAiMy4wMDAwMDFzIi4KCgoKCgMEAAESA2UIEArcAQoEBAACABIDaQIUGs4BIFNpZ25lZCBzZWNvbmRzIG9mIHRoZSBzcGFuIG9mIHRpbWUuIE11c3QgYmUgZnJvbSAtMzE1LDU3NiwwMDAsMDAwCiB0byArMzE1LDU3NiwwMDAsMDAwIGluY2x1c2l2ZS4gTm90ZTogdGhlc2UgYm91bmRzIGFyZSBjb21wdXRlZCBmcm9tOgogNjAgc2VjL21pbiAqIDYwIG1pbi9ociAqIDI0IGhyL2RheSAqIDM2NS4yNSBkYXlzL3llYXIgKiAxMDAwMCB5ZWFycwoKDAoFBAACAAUSA2kCBwoMCgUEAAIAARIDaQgPCgwKBQQAAgADEgNpEhMKgwMKBAQAAgESA3ECEhr1AiBTaWduZWQgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBvZiB0aGUgc3Bhbgogb2YgdGltZS4gRHVyYXRpb25zIGxlc3MgdGhhbiBvbmUgc2Vjb25kIGFyZSByZXByZXNlbnRlZCB3aXRoIGEgMAogYHNlY29uZHNgIGZpZWxkIGFuZCBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGBuYW5vc2AgZmllbGQuIEZvciBkdXJhdGlvbnMKIG9mIG9uZSBzZWNvbmQgb3IgbW9yZSwgYSBub24temVybyB2YWx1ZSBmb3IgdGhlIGBuYW5vc2AgZmllbGQgbXVzdCBiZQogb2YgdGhlIHNhbWUgc2lnbiBhcyB0aGUgYHNlY29uZHNgIGZpZWxkLiBNdXN0IGJlIGZyb20gLTk5OSw5OTksOTk5CiB0byArOTk5LDk5OSw5OTkgaW5jbHVzaXZlLgoKDAoFBAACAQUSA3ECBwoMCgUEAAIBARIDcQgNCgwKBQQAAgEDEgNxEBFiBnByb3RvMwqKPQogZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIhCglGaWVsZE1hc2sSFAoFcGF0aHMYASADKAlSBXBhdGhzQoUBChNjb20uZ29vZ2xlLnByb3RvYnVmQg5GaWVsZE1hc2tQcm90b1ABWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9maWVsZG1hc2twYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc0qhOwoHEgUeAPQBAQrMDAoBDBIDHgASMsEMIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKCAoBAhIDIAAYCggKAQgSAyIALAoJCgIIARIDIgAsCggKAQgSAyMALwoJCgIICBIDIwAvCggKAQgSAyQAIgoJCgIIChIDJAAiCggKAQgSAyUAIQoJCgIIJBIDJQAhCggKAQgSAyYAOwoJCgIIJRIDJgA7CggKAQgSAycASQoJCgIICxIDJwBJCggKAQgSAygAHwoJCgIIHxIDKAAfCrIsCgIEABIG8QEA9AEBGqMsIGBGaWVsZE1hc2tgIHJlcHJlc2VudHMgYSBzZXQgb2Ygc3ltYm9saWMgZmllbGQgcGF0aHMsIGZvciBleGFtcGxlOgoKICAgICBwYXRoczogImYuYSIKICAgICBwYXRoczogImYuYi5kIgoKIEhlcmUgYGZgIHJlcHJlc2VudHMgYSBmaWVsZCBpbiBzb21lIHJvb3QgbWVzc2FnZSwgYGFgIGFuZCBgYmAKIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBmb3VuZCBpbiBgZmAsIGFuZCBgZGAgYSBmaWVsZCBmb3VuZCBpbiB0aGUKIG1lc3NhZ2UgaW4gYGYuYmAuCgogRmllbGQgbWFza3MgYXJlIHVzZWQgdG8gc3BlY2lmeSBhIHN1YnNldCBvZiBmaWVsZHMgdGhhdCBzaG91bGQgYmUKIHJldHVybmVkIGJ5IGEgZ2V0IG9wZXJhdGlvbiBvciBtb2RpZmllZCBieSBhbiB1cGRhdGUgb3BlcmF0aW9uLgogRmllbGQgbWFza3MgYWxzbyBoYXZlIGEgY3VzdG9tIEpTT04gZW5jb2RpbmcgKHNlZSBiZWxvdykuCgogIyBGaWVsZCBNYXNrcyBpbiBQcm9qZWN0aW9ucwoKIFdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhIHByb2plY3Rpb24sIGEgcmVzcG9uc2UgbWVzc2FnZSBvcgogc3ViLW1lc3NhZ2UgaXMgZmlsdGVyZWQgYnkgdGhlIEFQSSB0byBvbmx5IGNvbnRhaW4gdGhvc2UgZmllbGRzIGFzCiBzcGVjaWZpZWQgaW4gdGhlIG1hc2suIEZvciBleGFtcGxlLCBpZiB0aGUgbWFzayBpbiB0aGUgcHJldmlvdXMKIGV4YW1wbGUgaXMgYXBwbGllZCB0byBhIHJlc3BvbnNlIG1lc3NhZ2UgYXMgZm9sbG93czoKCiAgICAgZiB7CiAgICAgICBhIDogMjIKICAgICAgIGIgewogICAgICAgICBkIDogMQogICAgICAgICB4IDogMgogICAgICAgfQogICAgICAgeSA6IDEzCiAgICAgfQogICAgIHo6IDgKCiBUaGUgcmVzdWx0IHdpbGwgbm90IGNvbnRhaW4gc3BlY2lmaWMgdmFsdWVzIGZvciBmaWVsZHMgeCx5IGFuZCB6CiAodGhlaXIgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGRlZmF1bHQsIGFuZCBvbWl0dGVkIGluIHByb3RvIHRleHQKIG91dHB1dCk6CgoKICAgICBmIHsKICAgICAgIGEgOiAyMgogICAgICAgYiB7CiAgICAgICAgIGQgOiAxCiAgICAgICB9CiAgICAgfQoKIEEgcmVwZWF0ZWQgZmllbGQgaXMgbm90IGFsbG93ZWQgZXhjZXB0IGF0IHRoZSBsYXN0IHBvc2l0aW9uIG9mIGEKIHBhdGhzIHN0cmluZy4KCiBJZiBhIEZpZWxkTWFzayBvYmplY3QgaXMgbm90IHByZXNlbnQgaW4gYSBnZXQgb3BlcmF0aW9uLCB0aGUKIG9wZXJhdGlvbiBhcHBsaWVzIHRvIGFsbCBmaWVsZHMgKGFzIGlmIGEgRmllbGRNYXNrIG9mIGFsbCBmaWVsZHMKIGhhZCBiZWVuIHNwZWNpZmllZCkuCgogTm90ZSB0aGF0IGEgZmllbGQgbWFzayBkb2VzIG5vdCBuZWNlc3NhcmlseSBhcHBseSB0byB0aGUKIHRvcC1sZXZlbCByZXNwb25zZSBtZXNzYWdlLiBJbiBjYXNlIG9mIGEgUkVTVCBnZXQgb3BlcmF0aW9uLCB0aGUKIGZpZWxkIG1hc2sgYXBwbGllcyBkaXJlY3RseSB0byB0aGUgcmVzcG9uc2UsIGJ1dCBpbiBjYXNlIG9mIGEgUkVTVAogbGlzdCBvcGVyYXRpb24sIHRoZSBtYXNrIGluc3RlYWQgYXBwbGllcyB0byBlYWNoIGluZGl2aWR1YWwgbWVzc2FnZQogaW4gdGhlIHJldHVybmVkIHJlc291cmNlIGxpc3QuIEluIGNhc2Ugb2YgYSBSRVNUIGN1c3RvbSBtZXRob2QsCiBvdGhlciBkZWZpbml0aW9ucyBtYXkgYmUgdXNlZC4gV2hlcmUgdGhlIG1hc2sgYXBwbGllcyB3aWxsIGJlCiBjbGVhcmx5IGRvY3VtZW50ZWQgdG9nZXRoZXIgd2l0aCBpdHMgZGVjbGFyYXRpb24gaW4gdGhlIEFQSS4gIEluCiBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvbiB0aGUgcmV0dXJuZWQgcmVzb3VyY2UvcmVzb3VyY2VzIGlzIHJlcXVpcmVkCiBiZWhhdmlvciBmb3IgQVBJcy4KCiAjIEZpZWxkIE1hc2tzIGluIFVwZGF0ZSBPcGVyYXRpb25zCgogQSBmaWVsZCBtYXNrIGluIHVwZGF0ZSBvcGVyYXRpb25zIHNwZWNpZmllcyB3aGljaCBmaWVsZHMgb2YgdGhlCiB0YXJnZXRlZCByZXNvdXJjZSBhcmUgZ29pbmcgdG8gYmUgdXBkYXRlZC4gVGhlIEFQSSBpcyByZXF1aXJlZAogdG8gb25seSBjaGFuZ2UgdGhlIHZhbHVlcyBvZiB0aGUgZmllbGRzIGFzIHNwZWNpZmllZCBpbiB0aGUgbWFzawogYW5kIGxlYXZlIHRoZSBvdGhlcnMgdW50b3VjaGVkLiBJZiBhIHJlc291cmNlIGlzIHBhc3NlZCBpbiB0bwogZGVzY3JpYmUgdGhlIHVwZGF0ZWQgdmFsdWVzLCB0aGUgQVBJIGlnbm9yZXMgdGhlIHZhbHVlcyBvZiBhbGwKIGZpZWxkcyBub3QgY292ZXJlZCBieSB0aGUgbWFzay4KCiBJZiBhIHJlcGVhdGVkIGZpZWxkIGlzIHNwZWNpZmllZCBmb3IgYW4gdXBkYXRlIG9wZXJhdGlvbiwgbmV3IHZhbHVlcyB3aWxsCiBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcgcmVwZWF0ZWQgZmllbGQgaW4gdGhlIHRhcmdldCByZXNvdXJjZS4gTm90ZSB0aGF0CiBhIHJlcGVhdGVkIGZpZWxkIGlzIG9ubHkgYWxsb3dlZCBpbiB0aGUgbGFzdCBwb3NpdGlvbiBvZiBhIGBwYXRoc2Agc3RyaW5nLgoKIElmIGEgc3ViLW1lc3NhZ2UgaXMgc3BlY2lmaWVkIGluIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZCBtYXNrIGZvciBhbgogdXBkYXRlIG9wZXJhdGlvbiwgdGhlbiBuZXcgdmFsdWUgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgZXhpc3Rpbmcgc3ViLW1lc3NhZ2UKIGluIHRoZSB0YXJnZXQgcmVzb3VyY2UuCgogRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSB0YXJnZXQgbWVzc2FnZToKCiAgICAgZiB7CiAgICAgICBiIHsKICAgICAgICAgZDogMQogICAgICAgICB4OiAyCiAgICAgICB9CiAgICAgICBjOiBbMV0KICAgICB9CgogQW5kIGFuIHVwZGF0ZSBtZXNzYWdlOgoKICAgICBmIHsKICAgICAgIGIgewogICAgICAgICBkOiAxMAogICAgICAgfQogICAgICAgYzogWzJdCiAgICAgfQoKIHRoZW4gaWYgdGhlIGZpZWxkIG1hc2sgaXM6CgogIHBhdGhzOiBbImYuYiIsICJmLmMiXQoKIHRoZW4gdGhlIHJlc3VsdCB3aWxsIGJlOgoKICAgICBmIHsKICAgICAgIGIgewogICAgICAgICBkOiAxMAogICAgICAgICB4OiAyCiAgICAgICB9CiAgICAgICBjOiBbMSwgMl0KICAgICB9CgogQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGUgb3B0aW9ucyB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQgYmVoYXZpb3IgZm9yCiByZXBlYXRlZCBhbmQgbWVzc2FnZSBmaWVsZHMuCgogSW4gb3JkZXIgdG8gcmVzZXQgYSBmaWVsZCdzIHZhbHVlIHRvIHRoZSBkZWZhdWx0LCB0aGUgZmllbGQgbXVzdAogYmUgaW4gdGhlIG1hc2sgYW5kIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgcHJvdmlkZWQgcmVzb3VyY2UuCiBIZW5jZSwgaW4gb3JkZXIgdG8gcmVzZXQgYWxsIGZpZWxkcyBvZiBhIHJlc291cmNlLCBwcm92aWRlIGEgZGVmYXVsdAogaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGFuZCBzZXQgYWxsIGZpZWxkcyBpbiB0aGUgbWFzaywgb3IgZG8KIG5vdCBwcm92aWRlIGEgbWFzayBhcyBkZXNjcmliZWQgYmVsb3cuCgogSWYgYSBmaWVsZCBtYXNrIGlzIG5vdCBwcmVzZW50IG9uIHVwZGF0ZSwgdGhlIG9wZXJhdGlvbiBhcHBsaWVzIHRvCiBhbGwgZmllbGRzIChhcyBpZiBhIGZpZWxkIG1hc2sgb2YgYWxsIGZpZWxkcyBoYXMgYmVlbiBzcGVjaWZpZWQpLgogTm90ZSB0aGF0IGluIHRoZSBwcmVzZW5jZSBvZiBzY2hlbWEgZXZvbHV0aW9uLCB0aGlzIG1heSBtZWFuIHRoYXQKIGZpZWxkcyB0aGUgY2xpZW50IGRvZXMgbm90IGtub3cgYW5kIGhhcyB0aGVyZWZvcmUgbm90IGZpbGxlZCBpbnRvCiB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlc2V0IHRvIHRoZWlyIGRlZmF1bHQuIElmIHRoaXMgaXMgdW53YW50ZWQKIGJlaGF2aW9yLCBhIHNwZWNpZmljIHNlcnZpY2UgbWF5IHJlcXVpcmUgYSBjbGllbnQgdG8gYWx3YXlzIHNwZWNpZnkKIGEgZmllbGQgbWFzaywgcHJvZHVjaW5nIGFuIGVycm9yIGlmIG5vdC4KCiBBcyB3aXRoIGdldCBvcGVyYXRpb25zLCB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHdoaWNoCiBkZXNjcmliZXMgdGhlIHVwZGF0ZWQgdmFsdWVzIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZGVwZW5kcyBvbiB0aGUKIG9wZXJhdGlvbiBraW5kLiBJbiBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvZiB0aGUgZmllbGQgbWFzayBpcwogcmVxdWlyZWQgdG8gYmUgaG9ub3JlZCBieSB0aGUgQVBJLgoKICMjIENvbnNpZGVyYXRpb25zIGZvciBIVFRQIFJFU1QKCiBUaGUgSFRUUCBraW5kIG9mIGFuIHVwZGF0ZSBvcGVyYXRpb24gd2hpY2ggdXNlcyBhIGZpZWxkIG1hc2sgbXVzdAogYmUgc2V0IHRvIFBBVENIIGluc3RlYWQgb2YgUFVUIGluIG9yZGVyIHRvIHNhdGlzZnkgSFRUUCBzZW1hbnRpY3MKIChQVVQgbXVzdCBvbmx5IGJlIHVzZWQgZm9yIGZ1bGwgdXBkYXRlcykuCgogIyBKU09OIEVuY29kaW5nIG9mIEZpZWxkIE1hc2tzCgogSW4gSlNPTiwgYSBmaWVsZCBtYXNrIGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgc3RyaW5nIHdoZXJlIHBhdGhzIGFyZQogc2VwYXJhdGVkIGJ5IGEgY29tbWEuIEZpZWxkcyBuYW1lIGluIGVhY2ggcGF0aCBhcmUgY29udmVydGVkCiB0by9mcm9tIGxvd2VyLWNhbWVsIG5hbWluZyBjb252ZW50aW9ucy4KCiBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgZGVjbGFyYXRpb25zOgoKICAgICBtZXNzYWdlIFByb2ZpbGUgewogICAgICAgVXNlciB1c2VyID0gMTsKICAgICAgIFBob3RvIHBob3RvID0gMjsKICAgICB9CiAgICAgbWVzc2FnZSBVc2VyIHsKICAgICAgIHN0cmluZyBkaXNwbGF5X25hbWUgPSAxOwogICAgICAgc3RyaW5nIGFkZHJlc3MgPSAyOwogICAgIH0KCiBJbiBwcm90byBhIGZpZWxkIG1hc2sgZm9yIGBQcm9maWxlYCBtYXkgbG9vayBhcyBzdWNoOgoKICAgICBtYXNrIHsKICAgICAgIHBhdGhzOiAidXNlci5kaXNwbGF5X25hbWUiCiAgICAgICBwYXRoczogInBob3RvIgogICAgIH0KCiBJbiBKU09OLCB0aGUgc2FtZSBtYXNrIGlzIHJlcHJlc2VudGVkIGFzIGJlbG93OgoKICAgICB7CiAgICAgICBtYXNrOiAidXNlci5kaXNwbGF5TmFtZSxwaG90byIKICAgICB9CgogIyBGaWVsZCBNYXNrcyBhbmQgT25lb2YgRmllbGRzCgogRmllbGQgbWFza3MgdHJlYXQgZmllbGRzIGluIG9uZW9mcyBqdXN0IGFzIHJlZ3VsYXIgZmllbGRzLiBDb25zaWRlciB0aGUKIGZvbGxvd2luZyBtZXNzYWdlOgoKICAgICBtZXNzYWdlIFNhbXBsZU1lc3NhZ2UgewogICAgICAgb25lb2YgdGVzdF9vbmVvZiB7CiAgICAgICAgIHN0cmluZyBuYW1lID0gNDsKICAgICAgICAgU3ViTWVzc2FnZSBzdWJfbWVzc2FnZSA9IDk7CiAgICAgICB9CiAgICAgfQoKIFRoZSBmaWVsZCBtYXNrIGNhbiBiZToKCiAgICAgbWFzayB7CiAgICAgICBwYXRoczogIm5hbWUiCiAgICAgfQoKIE9yOgoKICAgICBtYXNrIHsKICAgICAgIHBhdGhzOiAic3ViX21lc3NhZ2UiCiAgICAgfQoKIE5vdGUgdGhhdCBvbmVvZiB0eXBlIG5hbWVzICgidGVzdF9vbmVvZiIgaW4gdGhpcyBjYXNlKSBjYW5ub3QgYmUgdXNlZCBpbgogcGF0aHMuCgogIyMgRmllbGQgTWFzayBWZXJpZmljYXRpb24KCiBUaGUgaW1wbGVtZW50YXRpb24gb2YgYW55IEFQSSBtZXRob2Qgd2hpY2ggaGFzIGEgRmllbGRNYXNrIHR5cGUgZmllbGQgaW4gdGhlCiByZXF1ZXN0IHNob3VsZCB2ZXJpZnkgdGhlIGluY2x1ZGVkIGZpZWxkIHBhdGhzLCBhbmQgcmV0dXJuIGFuCiBgSU5WQUxJRF9BUkdVTUVOVGAgZXJyb3IgaWYgYW55IHBhdGggaXMgdW5tYXBwYWJsZS4KCgsKAwQAARIE8QEIEQosCgQEAAIAEgTzAQIcGh4gVGhlIHNldCBvZiBmaWVsZCBtYXNrIHBhdGhzLgoKDQoFBAACAAQSBPMBAgoKDQoFBAACAAUSBPMBCxEKDQoFBAACAAESBPMBEhcKDQoFBAACAAMSBPMBGhtiBnByb3RvMwrDMQofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIjsKCVRpbWVzdGFtcBIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KFAQoTY29tLmdvb2dsZS5wcm90b2J1ZkIOVGltZXN0YW1wUHJvdG9QAVoyZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vdGltZXN0YW1wcGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNKwS8KBxIFHgCPAQEKzAwKAQwSAx4AEjLBDCBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KCiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKIG1ldDoKCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogZGlzdHJpYnV0aW9uLgogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCggKAQISAyAAGAoICgEIEgMiAB8KCQoCCB8SAyIAHwoICgEIEgMjAEkKCQoCCAsSAyMASQoICgEIEgMkACwKCQoCCAESAyQALAoICgEIEgMlAC8KCQoCCAgSAyUALwoICgEIEgMmACIKCQoCCAoSAyYAIgoICgEIEgMnACEKCQoCCCQSAycAIQoICgEIEgMoADsKCQoCCCUSAygAOwraHQoCBAASBoQBAI8BARrLHSBBIFRpbWVzdGFtcCByZXByZXNlbnRzIGEgcG9pbnQgaW4gdGltZSBpbmRlcGVuZGVudCBvZiBhbnkgdGltZSB6b25lIG9yIGxvY2FsCiBjYWxlbmRhciwgZW5jb2RlZCBhcyBhIGNvdW50IG9mIHNlY29uZHMgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGF0CiBuYW5vc2Vjb25kIHJlc29sdXRpb24uIFRoZSBjb3VudCBpcyByZWxhdGl2ZSB0byBhbiBlcG9jaCBhdCBVVEMgbWlkbmlnaHQgb24KIEphbnVhcnkgMSwgMTk3MCwgaW4gdGhlIHByb2xlcHRpYyBHcmVnb3JpYW4gY2FsZW5kYXIgd2hpY2ggZXh0ZW5kcyB0aGUKIEdyZWdvcmlhbiBjYWxlbmRhciBiYWNrd2FyZHMgdG8geWVhciBvbmUuCgogQWxsIG1pbnV0ZXMgYXJlIDYwIHNlY29uZHMgbG9uZy4gTGVhcCBzZWNvbmRzIGFyZSAic21lYXJlZCIgc28gdGhhdCBubyBsZWFwCiBzZWNvbmQgdGFibGUgaXMgbmVlZGVkIGZvciBpbnRlcnByZXRhdGlvbiwgdXNpbmcgYSBbMjQtaG91ciBsaW5lYXIKIHNtZWFyXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS90aW1lL3NtZWFyKS4KCiBUaGUgcmFuZ2UgaXMgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVouIEJ5CiByZXN0cmljdGluZyB0byB0aGF0IHJhbmdlLCB3ZSBlbnN1cmUgdGhhdCB3ZSBjYW4gY29udmVydCB0byBhbmQgZnJvbSBbUkZDCiAzMzM5XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGRhdGUgc3RyaW5ncy4KCiAjIEV4YW1wbGVzCgogRXhhbXBsZSAxOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFBPU0lYIGB0aW1lKClgLgoKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wOwogICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcyh0aW1lKE5VTEwpKTsKICAgICB0aW1lc3RhbXAuc2V0X25hbm9zKDApOwoKIEV4YW1wbGUgMjogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBQT1NJWCBgZ2V0dGltZW9mZGF5KClgLgoKICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKCiAgICAgVGltZXN0YW1wIHRpbWVzdGFtcDsKICAgICB0aW1lc3RhbXAuc2V0X3NlY29uZHModHYudHZfc2VjKTsKICAgICB0aW1lc3RhbXAuc2V0X25hbm9zKHR2LnR2X3VzZWMgKiAxMDAwKTsKCiBFeGFtcGxlIDM6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gV2luMzIgYEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKClgLgoKICAgICBGSUxFVElNRSBmdDsKICAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOwogICAgIFVJTlQ2NCB0aWNrcyA9ICgoKFVJTlQ2NClmdC5kd0hpZ2hEYXRlVGltZSkgPDwgMzIpIHwgZnQuZHdMb3dEYXRlVGltZTsKCiAgICAgLy8gQSBXaW5kb3dzIHRpY2sgaXMgMTAwIG5hbm9zZWNvbmRzLiBXaW5kb3dzIGVwb2NoIDE2MDEtMDEtMDFUMDA6MDA6MDBaCiAgICAgLy8gaXMgMTE2NDQ0NzM2MDAgc2Vjb25kcyBiZWZvcmUgVW5peCBlcG9jaCAxOTcwLTAxLTAxVDAwOjAwOjAwWi4KICAgICBUaW1lc3RhbXAgdGltZXN0YW1wOwogICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcygoSU5UNjQpICgodGlja3MgLyAxMDAwMDAwMCkgLSAxMTY0NDQ3MzYwMExMKSk7CiAgICAgdGltZXN0YW1wLnNldF9uYW5vcygoSU5UMzIpICgodGlja3MgJSAxMDAwMDAwMCkgKiAxMDApKTsKCiBFeGFtcGxlIDQ6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gSmF2YSBgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKClgLgoKICAgICBsb25nIG1pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gVGltZXN0YW1wLm5ld0J1aWxkZXIoKS5zZXRTZWNvbmRzKG1pbGxpcyAvIDEwMDApCiAgICAgICAgIC5zZXROYW5vcygoaW50KSAoKG1pbGxpcyAlIDEwMDApICogMTAwMDAwMCkpLmJ1aWxkKCk7CgogRXhhbXBsZSA1OiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIEphdmEgYEluc3RhbnQubm93KClgLgoKICAgICBJbnN0YW50IG5vdyA9IEluc3RhbnQubm93KCk7CgogICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPQogICAgICAgICBUaW1lc3RhbXAubmV3QnVpbGRlcigpLnNldFNlY29uZHMobm93LmdldEVwb2NoU2Vjb25kKCkpCiAgICAgICAgICAgICAuc2V0TmFub3Mobm93LmdldE5hbm8oKSkuYnVpbGQoKTsKCiBFeGFtcGxlIDY6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gY3VycmVudCB0aW1lIGluIFB5dGhvbi4KCiAgICAgdGltZXN0YW1wID0gVGltZXN0YW1wKCkKICAgICB0aW1lc3RhbXAuR2V0Q3VycmVudFRpbWUoKQoKICMgSlNPTiBNYXBwaW5nCgogSW4gSlNPTiBmb3JtYXQsIHRoZSBUaW1lc3RhbXAgdHlwZSBpcyBlbmNvZGVkIGFzIGEgc3RyaW5nIGluIHRoZQogW1JGQyAzMzM5XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGZvcm1hdC4gVGhhdCBpcywgdGhlCiBmb3JtYXQgaXMgInt5ZWFyfS17bW9udGh9LXtkYXl9VHtob3VyfTp7bWlufTp7c2VjfVsue2ZyYWNfc2VjfV1aIgogd2hlcmUge3llYXJ9IGlzIGFsd2F5cyBleHByZXNzZWQgdXNpbmcgZm91ciBkaWdpdHMgd2hpbGUge21vbnRofSwge2RheX0sCiB7aG91cn0sIHttaW59LCBhbmQge3NlY30gYXJlIHplcm8tcGFkZGVkIHRvIHR3byBkaWdpdHMgZWFjaC4gVGhlIGZyYWN0aW9uYWwKIHNlY29uZHMsIHdoaWNoIGNhbiBnbyB1cCB0byA5IGRpZ2l0cyAoaS5lLiB1cCB0byAxIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiksCiBhcmUgb3B0aW9uYWwuIFRoZSAiWiIgc3VmZml4IGluZGljYXRlcyB0aGUgdGltZXpvbmUgKCJVVEMiKTsgdGhlIHRpbWV6b25lCiBpcyByZXF1aXJlZC4gQSBwcm90bzMgSlNPTiBzZXJpYWxpemVyIHNob3VsZCBhbHdheXMgdXNlIFVUQyAoYXMgaW5kaWNhdGVkIGJ5CiAiWiIpIHdoZW4gcHJpbnRpbmcgdGhlIFRpbWVzdGFtcCB0eXBlIGFuZCBhIHByb3RvMyBKU09OIHBhcnNlciBzaG91bGQgYmUKIGFibGUgdG8gYWNjZXB0IGJvdGggVVRDIGFuZCBvdGhlciB0aW1lem9uZXMgKGFzIGluZGljYXRlZCBieSBhbiBvZmZzZXQpLgoKIEZvciBleGFtcGxlLCAiMjAxNy0wMS0xNVQwMTozMDoxNS4wMVoiIGVuY29kZXMgMTUuMDEgc2Vjb25kcyBwYXN0CiAwMTozMCBVVEMgb24gSmFudWFyeSAxNSwgMjAxNy4KCiBJbiBKYXZhU2NyaXB0LCBvbmUgY2FuIGNvbnZlcnQgYSBEYXRlIG9iamVjdCB0byB0aGlzIGZvcm1hdCB1c2luZyB0aGUKIHN0YW5kYXJkCiBbdG9JU09TdHJpbmcoKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS90b0lTT1N0cmluZykKIG1ldGhvZC4gSW4gUHl0aG9uLCBhIHN0YW5kYXJkIGBkYXRldGltZS5kYXRldGltZWAgb2JqZWN0IGNhbiBiZSBjb252ZXJ0ZWQKIHRvIHRoaXMgZm9ybWF0IHVzaW5nCiBbYHN0cmZ0aW1lYF0oaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9saWJyYXJ5L3RpbWUuaHRtbCN0aW1lLnN0cmZ0aW1lKSB3aXRoCiB0aGUgdGltZSBmb3JtYXQgc3BlYyAnJVktJW0tJWRUJUg6JU06JVMuJWZaJy4gTGlrZXdpc2UsIGluIEphdmEsIG9uZSBjYW4gdXNlCiB0aGUgSm9kYSBUaW1lJ3MgW2BJU09EYXRlVGltZUZvcm1hdC5kYXRlVGltZSgpYF0oCiBodHRwOi8vam9kYS10aW1lLnNvdXJjZWZvcmdlLm5ldC9hcGlkb2NzL29yZy9qb2RhL3RpbWUvZm9ybWF0L0lTT0RhdGVUaW1lRm9ybWF0Lmh0bWwjZGF0ZVRpbWUoKQogKSB0byBvYnRhaW4gYSBmb3JtYXR0ZXIgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIHRpbWVzdGFtcHMgaW4gdGhpcyBmb3JtYXQuCgoKCwoDBAABEgSEAQgRCp0BCgQEAAIAEgSIAQIUGo4BIFJlcHJlc2VudHMgc2Vjb25kcyBvZiBVVEMgdGltZSBzaW5jZSBVbml4IGVwb2NoCiAxOTcwLTAxLTAxVDAwOjAwOjAwWi4gTXVzdCBiZSBmcm9tIDAwMDEtMDEtMDFUMDA6MDA6MDBaIHRvCiA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuCgoNCgUEAAIABRIEiAECBwoNCgUEAAIAARIEiAEIDwoNCgUEAAIAAxIEiAESEwrlAQoEBAACARIEjgECEhrWASBOb24tbmVnYXRpdmUgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbi4gTmVnYXRpdmUKIHNlY29uZCB2YWx1ZXMgd2l0aCBmcmFjdGlvbnMgbXVzdCBzdGlsbCBoYXZlIG5vbi1uZWdhdGl2ZSBuYW5vcyB2YWx1ZXMKIHRoYXQgY291bnQgZm9yd2FyZCBpbiB0aW1lLiBNdXN0IGJlIGZyb20gMCB0byA5OTksOTk5LDk5OQogaW5jbHVzaXZlLgoKDQoFBAACAQUSBI4BAgcKDQoFBAACAQESBI4BCA0KDQoFBAACAQMSBI4BEBFiBnByb3RvMwqx7gwKG2J1Zi92YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxIMYnVmLnZhbGlkYXRlGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoeZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvGiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byJQCgRSdWxlEg4KAmlkGAEgASgJUgJpZBIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlEh4KCmV4cHJlc3Npb24YAyABKAlSCmV4cHJlc3Npb24ioQEKDE1lc3NhZ2VSdWxlcxIlCg5jZWxfZXhwcmVzc2lvbhgFIAMoCVINY2VsRXhwcmVzc2lvbhIkCgNjZWwYAyADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsEjQKBW9uZW9mGAQgAygLMh4uYnVmLnZhbGlkYXRlLk1lc3NhZ2VPbmVvZlJ1bGVSBW9uZW9mSgQIARACUghkaXNhYmxlZCJGChBNZXNzYWdlT25lb2ZSdWxlEhYKBmZpZWxkcxgBIAMoCVIGZmllbGRzEhoKCHJlcXVpcmVkGAIgASgIUghyZXF1aXJlZCIoCgpPbmVvZlJ1bGVzEhoKCHJlcXVpcmVkGAEgASgIUghyZXF1aXJlZCLjCgoKRmllbGRSdWxlcxIlCg5jZWxfZXhwcmVzc2lvbhgdIAMoCVINY2VsRXhwcmVzc2lvbhIkCgNjZWwYFyADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsEhoKCHJlcXVpcmVkGBkgASgIUghyZXF1aXJlZBIsCgZpZ25vcmUYGyABKA4yFC5idWYudmFsaWRhdGUuSWdub3JlUgZpZ25vcmUSMAoFZmxvYXQYASABKAsyGC5idWYudmFsaWRhdGUuRmxvYXRSdWxlc0gAUgVmbG9hdBIzCgZkb3VibGUYAiABKAsyGS5idWYudmFsaWRhdGUuRG91YmxlUnVsZXNIAFIGZG91YmxlEjAKBWludDMyGAMgASgLMhguYnVmLnZhbGlkYXRlLkludDMyUnVsZXNIAFIFaW50MzISMAoFaW50NjQYBCABKAsyGC5idWYudmFsaWRhdGUuSW50NjRSdWxlc0gAUgVpbnQ2NBIzCgZ1aW50MzIYBSABKAsyGS5idWYudmFsaWRhdGUuVUludDMyUnVsZXNIAFIGdWludDMyEjMKBnVpbnQ2NBgGIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50NjRSdWxlc0gAUgZ1aW50NjQSMwoGc2ludDMyGAcgASgLMhkuYnVmLnZhbGlkYXRlLlNJbnQzMlJ1bGVzSABSBnNpbnQzMhIzCgZzaW50NjQYCCABKAsyGS5idWYudmFsaWRhdGUuU0ludDY0UnVsZXNIAFIGc2ludDY0EjYKB2ZpeGVkMzIYCSABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQzMlJ1bGVzSABSB2ZpeGVkMzISNgoHZml4ZWQ2NBgKIAEoCzIaLmJ1Zi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIAFIHZml4ZWQ2NBI5CghzZml4ZWQzMhgLIAEoCzIbLmJ1Zi52YWxpZGF0ZS5TRml4ZWQzMlJ1bGVzSABSCHNmaXhlZDMyEjkKCHNmaXhlZDY0GAwgASgLMhsuYnVmLnZhbGlkYXRlLlNGaXhlZDY0UnVsZXNIAFIIc2ZpeGVkNjQSLQoEYm9vbBgNIAEoCzIXLmJ1Zi52YWxpZGF0ZS5Cb29sUnVsZXNIAFIEYm9vbBIzCgZzdHJpbmcYDiABKAsyGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXNIAFIGc3RyaW5nEjAKBWJ5dGVzGA8gASgLMhguYnVmLnZhbGlkYXRlLkJ5dGVzUnVsZXNIAFIFYnl0ZXMSLQoEZW51bRgQIAEoCzIXLmJ1Zi52YWxpZGF0ZS5FbnVtUnVsZXNIAFIEZW51bRI5CghyZXBlYXRlZBgSIAEoCzIbLmJ1Zi52YWxpZGF0ZS5SZXBlYXRlZFJ1bGVzSABSCHJlcGVhdGVkEioKA21hcBgTIAEoCzIWLmJ1Zi52YWxpZGF0ZS5NYXBSdWxlc0gAUgNtYXASKgoDYW55GBQgASgLMhYuYnVmLnZhbGlkYXRlLkFueVJ1bGVzSABSA2FueRI5CghkdXJhdGlvbhgVIAEoCzIbLmJ1Zi52YWxpZGF0ZS5EdXJhdGlvblJ1bGVzSABSCGR1cmF0aW9uEj0KCmZpZWxkX21hc2sYHCABKAsyHC5idWYudmFsaWRhdGUuRmllbGRNYXNrUnVsZXNIAFIJZmllbGRNYXNrEjwKCXRpbWVzdGFtcBgWIAEoCzIcLmJ1Zi52YWxpZGF0ZS5UaW1lc3RhbXBSdWxlc0gAUgl0aW1lc3RhbXBCBgoEdHlwZUoECBgQGUoECBoQG1IHc2tpcHBlZFIMaWdub3JlX2VtcHR5IloKD1ByZWRlZmluZWRSdWxlcxIkCgNjZWwYASADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHkikBgKCkZsb2F0UnVsZXMSigEKBWNvbnN0GAEgASgCQnTCSHEKbwoLZmxvYXQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSowEKAmx0GAIgASgCQpABwkiMAQqJAQoIZmxvYXQubHQafSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0ErQBCgNsdGUYAyABKAJCnwHCSJsBCpgBCglmbG9hdC5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIAFIDbHRlEvMHCgJndBgEIAEoAkLgB8JI3AcKjQEKCGZsb2F0Lmd0GoABIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKwwEKC2Zsb2F0Lmd0X2x0GrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzQEKFWZsb2F0Lmd0X2x0X2V4Y2x1c2l2ZRqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCtMBCgxmbG9hdC5ndF9sdGUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrdAQoWZmxvYXQuZ3RfbHRlX2V4Y2x1c2l2ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0Er8ICgNndGUYBSABKAJCqgjCSKYICpsBCglmbG9hdC5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0gEKDGZsb2F0Lmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3AEKFmZsb2F0Lmd0ZV9sdF9leGNsdXNpdmUawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCuIBCg1mbG9hdC5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrsAQoXZmxvYXQuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKDAQoCaW4YBiADKAJCc8JIcApuCghmbG9hdC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn0KBm5vdF9pbhgHIAMoAkJmwkhjCmEKDGZsb2F0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhJ9CgZmaW5pdGUYCCABKAhCZcJIYgpgCgxmbG9hdC5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnUgZmaW5pdGUSNAoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIqIYCgtEb3VibGVSdWxlcxKLAQoFY29uc3QYASABKAFCdcJIcgpwCgxkb3VibGUuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSpAEKAmx0GAIgASgBQpEBwkiNAQqKAQoJZG91YmxlLmx0Gn0haGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0KT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBK1AQoDbHRlGAMgASgBQqABwkicAQqZAQoKZG91YmxlLmx0ZRqKASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUS+AcKAmd0GAQgASgBQuUHwkjhBwqOAQoJZG91YmxlLmd0GoABIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKxAEKDGRvdWJsZS5ndF9sdBqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCs4BChZkb3VibGUuZ3RfbHRfZXhjbHVzaXZlGrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycK1AEKDWRvdWJsZS5ndF9sdGUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwreAQoXZG91YmxlLmd0X2x0ZV9leGNsdXNpdmUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLECAoDZ3RlGAUgASgBQq8IwkirCAqcAQoKZG91YmxlLmd0ZRqNASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrTAQoNZG91YmxlLmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3QEKF2RvdWJsZS5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrjAQoOZG91YmxlLmd0ZV9sdGUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCu0BChhkb3VibGUuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKEAQoCaW4YBiADKAFCdMJIcQpvCglkb3VibGUuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ+CgZub3RfaW4YByADKAFCZ8JIZApiCg1kb3VibGUubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJydSBW5vdEluEn4KBmZpbml0ZRgIIAEoCEJmwkhjCmEKDWRvdWJsZS5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnUgZmaW5pdGUSNQoHZXhhbXBsZRgJIAMoAUIbwkgYChYKDmRvdWJsZS5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiK6FQoKSW50MzJSdWxlcxKKAQoFY29uc3QYASABKAVCdMJIcQpvCgtpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKOAQoCbHQYAiABKAVCfMJIeQp3CghpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSoQEKA2x0ZRgDIAEoBUKMAcJIiAEKhQEKCWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKbBwoCZ3QYBCABKAVCiAfCSIQHCnoKCGludDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50MzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EugHCgNndGUYBSABKAVC0wfCSM8HCogBCglpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrCAQoMaW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsoBChZpbnQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrSAQoNaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwraAQoXaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKDAQoCaW4YBiADKAVCc8JIcApuCghpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn0KBm5vdF9pbhgHIAMoBUJmwkhjCmEKDGludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI0CgdleGFtcGxlGAggAygFQhrCSBcKFQoNaW50MzIuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iuhUKCkludDY0UnVsZXMSigEKBWNvbnN0GAEgASgDQnTCSHEKbwoLaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjgEKAmx0GAIgASgDQnzCSHkKdwoIaW50NjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0EqEBCgNsdGUYAyABKANCjAHCSIgBCoUBCglpbnQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUSmwcKAmd0GAQgASgDQogHwkiEBwp6CghpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKswEKC2ludDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq7AQoVaW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwwEKDGludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKywEKFmludDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLoBwoDZ3RlGAUgASgDQtMHwkjPBwqIAQoJaW50NjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUSgwEKAmluGAYgAygDQnPCSHAKbgoIaW50NjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ9CgZub3RfaW4YByADKANCZsJIYwphCgxpbnQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNAoHZXhhbXBsZRgJIAMoA0IawkgXChUKDWludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtVSW50MzJSdWxlcxKLAQoFY29uc3QYASABKA1CdcJIcgpwCgx1aW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgNQn3CSHoKeAoJdWludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgNQo0BwkiJAQqGAQoKdWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKA1CjQfCSIkHCnsKCXVpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoDULYB8JI1AcKiQEKCnVpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygNQnTCSHEKbwoJdWludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygNQmfCSGQKYgoNdWludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygNQhvCSBgKFgoOdWludDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtVSW50NjRSdWxlcxKLAQoFY29uc3QYASABKARCdcJIcgpwCgx1aW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgEQn3CSHoKeAoJdWludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgEQo0BwkiJAQqGAQoKdWludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKARCjQfCSIkHCnsKCXVpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoBELYB8JI1AcKiQEKCnVpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygEQnTCSHEKbwoJdWludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygEQmfCSGQKYgoNdWludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygEQhvCSBgKFgoOdWludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtTSW50MzJSdWxlcxKLAQoFY29uc3QYASABKBFCdcJIcgpwCgxzaW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgRQn3CSHoKeAoJc2ludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgRQo0BwkiJAQqGAQoKc2ludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKBFCjQfCSIkHCnsKCXNpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoEULYB8JI1AcKiQEKCnNpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygRQnTCSHEKbwoJc2ludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygRQmfCSGQKYgoNc2ludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygRQhvCSBgKFgoOc2ludDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtTSW50NjRSdWxlcxKLAQoFY29uc3QYASABKBJCdcJIcgpwCgxzaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgSQn3CSHoKeAoJc2ludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgSQo0BwkiJAQqGAQoKc2ludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKBJCjQfCSIkHCnsKCXNpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoEkLYB8JI1AcKiQEKCnNpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygSQnTCSHEKbwoJc2ludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygSQmfCSGQKYgoNc2ludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygSQhvCSBgKFgoOc2ludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuItwVCgxGaXhlZDMyUnVsZXMSjAEKBWNvbnN0GAEgASgHQnbCSHMKcQoNZml4ZWQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKQAQoCbHQYAiABKAdCfsJIewp5CgpmaXhlZDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKjAQoDbHRlGAMgASgHQo4BwkiKAQqHAQoLZml4ZWQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUSpQcKAmd0GAQgASgHQpIHwkiOBwp8CgpmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS8gcKA2d0ZRgFIAEoB0LdB8JI2QcKigEKC2ZpeGVkMzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxAEKDmZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCswBChhmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtQBCg9maXhlZDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3AEKGWZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKFAQoCaW4YBiADKAdCdcJIcgpwCgpmaXhlZDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfwoGbm90X2luGAcgAygHQmjCSGUKYwoOZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNgoHZXhhbXBsZRgIIAMoB0IcwkgZChcKD2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i3BUKDEZpeGVkNjRSdWxlcxKMAQoFY29uc3QYASABKAZCdsJIcwpxCg1maXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EpABCgJsdBgCIAEoBkJ+wkh7CnkKCmZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0EqMBCgNsdGUYAyABKAZCjgHCSIoBCocBCgtmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKlBwoCZ3QYBCABKAZCkgfCSI4HCnwKCmZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrUBCg1maXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq9AQoXZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrFAQoOZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs0BChhmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLyBwoDZ3RlGAUgASgGQt0HwkjZBwqKAQoLZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIAVIDZ3RlEoUBCgJpbhgGIAMoBkJ1wkhyCnAKCmZpeGVkNjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ/CgZub3RfaW4YByADKAZCaMJIZQpjCg5maXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI2CgdleGFtcGxlGAggAygGQhzCSBkKFwoPZml4ZWQ2NC5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLuFQoNU0ZpeGVkMzJSdWxlcxKNAQoFY29uc3QYASABKA9Cd8JIdApyCg5zZml4ZWQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKRAQoCbHQYAiABKA9Cf8JIfAp6CgtzZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSpAEKA2x0ZRgDIAEoD0KPAcJIiwEKiAEKDHNmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKqBwoCZ3QYBCABKA9ClwfCSJMHCn0KC3NmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOc2ZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhzZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPc2ZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZc2ZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EvcHCgNndGUYBSABKA9C4gfCSN4HCosBCgxzZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKGAQoCaW4YBiADKA9CdsJIcwpxCgtzZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEoABCgZub3RfaW4YByADKA9CacJIZgpkCg9zZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNwoHZXhhbXBsZRgIIAMoD0IdwkgaChgKEHNmaXhlZDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIu4VCg1TRml4ZWQ2NFJ1bGVzEo0BCgVjb25zdBgBIAEoEEJ3wkh0CnIKDnNmaXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EpEBCgJsdBgCIAEoEEJ/wkh8CnoKC3NmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKkAQoDbHRlGAMgASgQQo8BwkiLAQqIAQoMc2ZpeGVkNjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIAFIDbHRlEqoHCgJndBgEIAEoEEKXB8JIkwcKfQoLc2ZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrYBCg5zZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKGHNmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsYBCg9zZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs4BChlzZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS9wcKA2d0ZRgFIAEoEELiB8JI3gcKiwEKDHNmaXhlZDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9zZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGXNmaXhlZDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBzZml4ZWQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpzZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIAVIDZ3RlEoYBCgJpbhgGIAMoEEJ2wkhzCnEKC3NmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SgAEKBm5vdF9pbhgHIAMoEEJpwkhmCmQKD3NmaXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI3CgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i1wEKCUJvb2xSdWxlcxKJAQoFY29uc3QYASABKAhCc8JIcApuCgpib29sLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EjMKB2V4YW1wbGUYAiADKAhCGcJIFgoUCgxib29sLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAiLPOwoLU3RyaW5nUnVsZXMSjQEKBWNvbnN0GAEgASgJQnfCSHQKcgoMc3RyaW5nLmNvbnN0GmJ0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsIGAlc2AnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSgwEKA2xlbhgTIAEoBEJxwkhuCmwKCnN0cmluZy5sZW4aXnVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJydSA2xlbhKhAQoHbWluX2xlbhgCIAEoBEKHAcJIgwEKgAEKDnN0cmluZy5taW5fbGVuGm51aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJ1IGbWluTGVuEp8BCgdtYXhfbGVuGAMgASgEQoUBwkiBAQp/Cg5zdHJpbmcubWF4X2xlbhptdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IG1vc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5tYXhfbGVuXSkgOiAnJ1IGbWF4TGVuEqUBCglsZW5fYnl0ZXMYFCABKARChwHCSIMBCoABChBzdHJpbmcubGVuX2J5dGVzGmx1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl9ieXRlc10pIDogJydSCGxlbkJ5dGVzEq0BCgltaW5fYnl0ZXMYBCABKARCjwHCSIsBCogBChBzdHJpbmcubWluX2J5dGVzGnR1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgPCBydWxlcy5taW5fYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWluX2J5dGVzXSkgOiAnJ1IIbWluQnl0ZXMSrAEKCW1heF9ieXRlcxgFIAEoBEKOAcJIigEKhwEKEHN0cmluZy5tYXhfYnl0ZXMac3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9ieXRlc10pIDogJydSCG1heEJ5dGVzEpYBCgdwYXR0ZXJuGAYgASgJQnzCSHkKdwoOc3RyaW5nLnBhdHRlcm4aZSF0aGlzLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgZG9lcyBub3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnUgdwYXR0ZXJuEowBCgZwcmVmaXgYByABKAlCdMJIcQpvCg1zdHJpbmcucHJlZml4Gl4hdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnUgZwcmVmaXgSigEKBnN1ZmZpeBgIIAEoCUJywkhvCm0KDXN0cmluZy5zdWZmaXgaXCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnUgZzdWZmaXgSmgEKCGNvbnRhaW5zGAkgASgJQn7CSHsKeQoPc3RyaW5nLmNvbnRhaW5zGmYhdGhpcy5jb250YWlucyhydWxlcy5jb250YWlucykgPyAndmFsdWUgZG9lcyBub3QgY29udGFpbiBzdWJzdHJpbmcgYCVzYCcuZm9ybWF0KFtydWxlcy5jb250YWluc10pIDogJydSCGNvbnRhaW5zEqUBCgxub3RfY29udGFpbnMYFyABKAlCgQHCSH4KfAoTc3RyaW5nLm5vdF9jb250YWlucxpldGhpcy5jb250YWlucyhydWxlcy5ub3RfY29udGFpbnMpID8gJ3ZhbHVlIGNvbnRhaW5zIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLm5vdF9jb250YWluc10pIDogJydSC25vdENvbnRhaW5zEoQBCgJpbhgKIAMoCUJ0wkhxCm8KCXN0cmluZy5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn4KBm5vdF9pbhgLIAMoCUJnwkhkCmIKDXN0cmluZy5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4S5gEKBWVtYWlsGAwgASgIQs0BwkjJAQphCgxzdHJpbmcuZW1haWwSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGiwhcnVsZXMuZW1haWwgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzRW1haWwoKQpkChJzdHJpbmcuZW1haWxfZW1wdHkSMnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGhohcnVsZXMuZW1haWwgfHwgdGhpcyAhPSAnJ0gAUgVlbWFpbBLxAQoIaG9zdG5hbWUYDSABKAhC0gHCSM4BCmUKD3N0cmluZy5ob3N0bmFtZRIedmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIAFIIaG9zdG5hbWUSywEKAmlwGA4gASgIQrgBwki0AQpVCglzdHJpbmcuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGiYhcnVsZXMuaXAgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoKQpbCg9zdHJpbmcuaXBfZW1wdHkSL3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUCBhZGRyZXNzGhchcnVsZXMuaXAgfHwgdGhpcyAhPSAnJ0gAUgJpcBLcAQoEaXB2NBgPIAEoCELFAcJIwQEKXAoLc3RyaW5nLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaKSFydWxlcy5pcHY0IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwKDQpCmEKEXN0cmluZy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGhkhcnVsZXMuaXB2NCB8fCB0aGlzICE9ICcnSABSBGlwdjQS3AEKBGlwdjYYECABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY2EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzGikhcnVsZXMuaXB2NiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg2KQphChFzdHJpbmcuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxoZIXJ1bGVzLmlwdjYgfHwgdGhpcyAhPSAnJ0gAUgRpcHY2EsQBCgN1cmkYESABKAhCrwHCSKsBClEKCnN0cmluZy51cmkSGXZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkaKCFydWxlcy51cmkgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzVXJpKCkKVgoQc3RyaW5nLnVyaV9lbXB0eRIodmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVSSRoYIXJ1bGVzLnVyaSB8fCB0aGlzICE9ICcnSABSA3VyaRJ4Cgd1cmlfcmVmGBIgASgIQl3CSFoKWAoOc3RyaW5nLnVyaV9yZWYSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkgUmVmZXJlbmNlGiEhcnVsZXMudXJpX3JlZiB8fCB0aGlzLmlzVXJpUmVmKClIAFIGdXJpUmVmEpkCCgdhZGRyZXNzGBUgASgIQvwBwkj4AQqBAQoOc3RyaW5nLmFkZHJlc3MSLXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0bmFtZSwgb3IgaXAgYWRkcmVzcxpAIXJ1bGVzLmFkZHJlc3MgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKSB8fCB0aGlzLmlzSXAoKQpyChRzdHJpbmcuYWRkcmVzc19lbXB0eRI8dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGhwhcnVsZXMuYWRkcmVzcyB8fCB0aGlzICE9ICcnSABSB2FkZHJlc3MSngIKBHV1aWQYFiABKAhChwLCSIMCCqUBCgtzdHJpbmcudXVpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeiFydWxlcy51dWlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpClkKEXN0cmluZy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBoZIXJ1bGVzLnV1aWQgfHwgdGhpcyAhPSAnJ0gAUgR1dWlkEvcBCgV0dXVpZBghIAEoCELeAcJI2gEKcwoMc3RyaW5nLnR1dWlkEiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgdHJpbW1lZCBVVUlEGj8hcnVsZXMudHV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXszMn0kJykKYwoSc3RyaW5nLnR1dWlkX2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgdHJpbW1lZCBVVUlEGhohcnVsZXMudHV1aWQgfHwgdGhpcyAhPSAnJ0gAUgV0dXVpZBKnAgoRaXBfd2l0aF9wcmVmaXhsZW4YGiABKAhC+AHCSPQBCngKGHN0cmluZy5pcF93aXRoX3ByZWZpeGxlbhIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo7IXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KCkKeAoec3RyaW5nLmlwX3dpdGhfcHJlZml4bGVuX2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4GiYhcnVsZXMuaXBfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAUg9pcFdpdGhQcmVmaXhsZW4S4gIKE2lwdjRfd2l0aF9wcmVmaXhsZW4YGyABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQpCpIBCiBzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIAFIRaXB2NFdpdGhQcmVmaXhsZW4S4gIKE2lwdjZfd2l0aF9wcmVmaXhsZW4YHCABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2Nl93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY2X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYpCpIBCiBzdHJpbmcuaXB2Nl93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY2X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIAFIRaXB2NldpdGhQcmVmaXhsZW4S/AEKCWlwX3ByZWZpeBgdIAEoCELcAcJI2AEKbAoQc3RyaW5nLmlwX3ByZWZpeBIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIAFIIaXBQcmVmaXgSjwIKC2lwdjRfcHJlZml4GB4gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2NF9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IHByZWZpeBo8IXJ1bGVzLmlwdjRfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQsIHRydWUpCm4KGHN0cmluZy5pcHY0X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgcHJlZml4GiAhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAUgppcHY0UHJlZml4Eo8CCgtpcHY2X3ByZWZpeBgfIAEoCELrAcJI5wEKdQoSc3RyaW5nLmlwdjZfcHJlZml4EiF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBwcmVmaXgaPCFydWxlcy5pcHY2X3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2LCB0cnVlKQpuChhzdHJpbmcuaXB2Nl9wcmVmaXhfZW1wdHkSMHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IHByZWZpeBogIXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgIT0gJydIAFIKaXB2NlByZWZpeBLCAgoNaG9zdF9hbmRfcG9ydBggIAEoCEKbAsJIlwIKmQEKFHN0cmluZy5ob3N0X2FuZF9wb3J0EkF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdCAoaG9zdG5hbWUgb3IgSVAgYWRkcmVzcykgYW5kIHBvcnQgcGFpcho+IXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdEFuZFBvcnQodHJ1ZSkKeQoac3RyaW5nLmhvc3RfYW5kX3BvcnRfZW1wdHkSN3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0IGFuZCBwb3J0IHBhaXIaIiFydWxlcy5ob3N0X2FuZF9wb3J0IHx8IHRoaXMgIT0gJydIAFILaG9zdEFuZFBvcnQS+wEKBHVsaWQYIyABKAhC5AHCSOABCoIBCgtzdHJpbmcudWxpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVMSUQaVyFydWxlcy51bGlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtN11bMC05QS1ISktNTlAtVFYtWmEtaGprbW5wLXR2LXpdezI1fSQnKQpZChFzdHJpbmcudWxpZF9lbXB0eRIpdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVMSUQaGSFydWxlcy51bGlkIHx8IHRoaXMgIT0gJydIAFIEdWxpZBK4BQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QvEEwkjtBArwAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSJnZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrnAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEid2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAUg53ZWxsS25vd25SZWdleBIWCgZzdHJpY3QYGSABKAhSBnN0cmljdBI1CgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIqwTCgpCeXRlc1J1bGVzEocBCgVjb25zdBgBIAEoDEJxwkhuCmwKC2J5dGVzLmNvbnN0Gl10aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGJlICV4Jy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0En0KA2xlbhgNIAEoBEJrwkhoCmYKCWJ5dGVzLmxlbhpZdWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJydSA2xlbhKYAQoHbWluX2xlbhgCIAEoBEJ/wkh8CnoKDWJ5dGVzLm1pbl9sZW4aaXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJ1IGbWluTGVuEpABCgdtYXhfbGVuGAMgASgEQnfCSHQKcgoNYnl0ZXMubWF4X2xlbhphdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ3ZhbHVlIG11c3QgYmUgYXQgbW9zdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5tYXhfbGVuXSkgOiAnJ1IGbWF4TGVuEpkBCgdwYXR0ZXJuGAQgASgJQn/CSHwKegoNYnl0ZXMucGF0dGVybhppIXN0cmluZyh0aGlzKS5tYXRjaGVzKHJ1bGVzLnBhdHRlcm4pID8gJ3ZhbHVlIG11c3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnUgdwYXR0ZXJuEokBCgZwcmVmaXgYBSABKAxCccJIbgpsCgxieXRlcy5wcmVmaXgaXCF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCAleCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnUgZwcmVmaXgShwEKBnN1ZmZpeBgGIAEoDEJvwkhsCmoKDGJ5dGVzLnN1ZmZpeBpaIXRoaXMuZW5kc1dpdGgocnVsZXMuc3VmZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpeCAleCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnUgZzdWZmaXgSjQEKCGNvbnRhaW5zGAcgASgMQnHCSG4KbAoOYnl0ZXMuY29udGFpbnMaWiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluICV4Jy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJ1IIY29udGFpbnMSqwEKAmluGAggAygMQpoBwkiWAQqTAQoIYnl0ZXMuaW4ahgFnZXRGaWVsZChydWxlcywgJ2luJykuc2l6ZSgpID4gMCAmJiAhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfQoGbm90X2luGAkgAygMQmbCSGMKYQoMYnl0ZXMubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJydSBW5vdEluEu8BCgJpcBgKIAEoCELcAcJI2AEKdAoIYnl0ZXMuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGkYhcnVsZXMuaXAgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0IHx8IHRoaXMuc2l6ZSgpID09IDE2CmAKDmJ5dGVzLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxodIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpICE9IDBIAFICaXAS6gEKBGlwdjQYCyABKAhC0wHCSM8BCmUKCmJ5dGVzLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSABSBGlwdjQS6wEKBGlwdjYYDCABKAhC1AHCSNABCmYKCmJ5dGVzLmlwdjYSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAUgRpcHY2EtsBCgR1dWlkGA8gASgIQsQBwkjAAQpeCgpieXRlcy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBo0IXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpeChBieXRlcy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBofIXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgIT0gMEgAUgR1dWlkEjQKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biL9AwoJRW51bVJ1bGVzEokBCgVjb25zdBgBIAEoBUJzwkhwCm4KCmVudW0uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSIQoMZGVmaW5lZF9vbmx5GAIgASgIUgtkZWZpbmVkT25seRKCAQoCaW4YAyADKAVCcsJIbwptCgdlbnVtLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfAoGbm90X2luGAQgAygFQmXCSGIKYAoLZW51bS5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SMwoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACIp4ECg1SZXBlYXRlZFJ1bGVzEqgBCgltaW5faXRlbXMYASABKARCigHCSIYBCoMBChJyZXBlYXRlZC5taW5faXRlbXMabXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBhdCBsZWFzdCAlZCBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1pbl9pdGVtc10pIDogJydSCG1pbkl0ZW1zEqwBCgltYXhfaXRlbXMYAiABKARCjgHCSIoBCocBChJyZXBlYXRlZC5tYXhfaXRlbXMacXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJXMgaXRlbShzKScuZm9ybWF0KFtydWxlcy5tYXhfaXRlbXNdKSA6ICcnUghtYXhJdGVtcxJ4CgZ1bmlxdWUYAyABKAhCYMJIXQpbCg9yZXBlYXRlZC51bmlxdWUSKHJlcGVhdGVkIHZhbHVlIG11c3QgY29udGFpbiB1bmlxdWUgaXRlbXMaHiFydWxlcy51bmlxdWUgfHwgdGhpcy51bmlxdWUoKVIGdW5pcXVlEi4KBWl0ZW1zGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXNSBWl0ZW1zKgkI6AcQgICAgAIirAMKCE1hcFJ1bGVzEpkBCgltaW5fcGFpcnMYASABKARCfMJIeQp3Cg1tYXAubWluX3BhaXJzGmZ1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBsZWFzdCAlZCBlbnRyaWVzJy5mb3JtYXQoW3J1bGVzLm1pbl9wYWlyc10pIDogJydSCG1pblBhaXJzEpgBCgltYXhfcGFpcnMYAiABKARCe8JIeAp2Cg1tYXAubWF4X3BhaXJzGmV1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBtb3N0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWF4X3BhaXJzXSkgOiAnJ1IIbWF4UGFpcnMSLAoEa2V5cxgEIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgRrZXlzEjAKBnZhbHVlcxgFIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgZ2YWx1ZXMqCQjoBxCAgICAAiIxCghBbnlSdWxlcxIOCgJpbhgCIAMoCVICaW4SFQoGbm90X2luGAMgAygJUgVub3RJbiLGFwoNRHVyYXRpb25SdWxlcxKoAQoFY29uc3QYAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cd8JIdApyCg5kdXJhdGlvbi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKsAQoCbHQYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cf8JIfAp6CgtkdXJhdGlvbi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSvwEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKPAcJIiwEKiAEKDGR1cmF0aW9uLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRLFBwoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ClwfCSJMHCn0KC2R1cmF0aW9uLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOZHVyYXRpb24uZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPZHVyYXRpb24uZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZZHVyYXRpb24uZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EpIICgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25C4gfCSN4HCosBCgxkdXJhdGlvbi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPZHVyYXRpb24uZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQZHVyYXRpb24uZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKhAQoCaW4YByADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CdsJIcwpxCgtkdXJhdGlvbi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEpsBCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CacJIZgpkCg9kdXJhdGlvbi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SUgoHZXhhbXBsZRgJIAMoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkIdwkgaChgKEGR1cmF0aW9uLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIpgGCg5GaWVsZE1hc2tSdWxlcxLGAQoFY29uc3QYASABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQpMBwkiPAQqMAQoQZmllbGRfbWFzay5jb25zdBp4dGhpcy5wYXRocyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykucGF0aHMgPyAndmFsdWUgbXVzdCBlcXVhbCBwYXRocyAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JykucGF0aHNdKSA6ICcnUgVjb25zdBLdAQoCaW4YAiADKAlCzAHCSMgBCsUBCg1maWVsZF9tYXNrLmluGrMBIXRoaXMucGF0aHMuYWxsKHAsIHAgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpIHx8IGdldEZpZWxkKHJ1bGVzLCAnaW4nKS5leGlzdHMoZiwgcC5zdGFydHNXaXRoKGYrJy4nKSkpID8gJ3ZhbHVlIG11c3Qgb25seSBjb250YWluIHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEvoBCgZub3RfaW4YAyADKAlC4gHCSN4BCtsBChFmaWVsZF9tYXNrLm5vdF9pbhrFASF0aGlzLnBhdGhzLmFsbChwLCAhKHAgaW4gZ2V0RmllbGQocnVsZXMsICdub3RfaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ25vdF9pbicpLmV4aXN0cyhmLCBwLnN0YXJ0c1dpdGgoZisnLicpKSkpID8gJ3ZhbHVlIG11c3Qgbm90IGNvbnRhaW4gYW55IHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnbm90X2luJyldKSA6ICcnUgVub3RJbhJVCgdleGFtcGxlGAQgAygLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza0IfwkgcChoKEmZpZWxkX21hc2suZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACIsoYCg5UaW1lc3RhbXBSdWxlcxKqAQoFY29uc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQnjCSHUKcwoPdGltZXN0YW1wLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0Eq8BCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCgAHCSH0KewoMdGltZXN0YW1wLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBLBAQoDbHRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKQAcJIjAEKiQEKDXRpbWVzdGFtcC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUScwoGbHRfbm93GAcgASgIQlrCSFcKVQoQdGltZXN0YW1wLmx0X25vdxpBKHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIAFIFbHROb3cSywcKAmd0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKcB8JImAcKfgoMdGltZXN0YW1wLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq3AQoPdGltZXN0YW1wLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq/AQoZdGltZXN0YW1wLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCscBChB0aW1lc3RhbXAuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrPAQoadGltZXN0YW1wLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBKYCAoDZ3RlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcELnB8JI4wcKjAEKDXRpbWVzdGFtcC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrGAQoQdGltZXN0YW1wLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrOAQoadGltZXN0YW1wLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtYBChF0aW1lc3RhbXAuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwreAQobdGltZXN0YW1wLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUSdgoGZ3Rfbm93GAggASgIQl3CSFoKWAoQdGltZXN0YW1wLmd0X25vdxpEKHJ1bGVzLmd0X25vdyAmJiB0aGlzIDwgbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cnIDogJydIAVIFZ3ROb3cSwAEKBndpdGhpbhgJIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKMAcJIiAEKhQEKEHRpbWVzdGFtcC53aXRoaW4acXRoaXMgPCBub3ctcnVsZXMud2l0aGluIHx8IHRoaXMgPiBub3crcnVsZXMud2l0aGluID8gJ3ZhbHVlIG11c3QgYmUgd2l0aGluICVzIG9mIG5vdycuZm9ybWF0KFtydWxlcy53aXRoaW5dKSA6ICcnUgZ3aXRoaW4SVAoHZXhhbXBsZRgKIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCHsJIGwoZChF0aW1lc3RhbXAuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iRQoKVmlvbGF0aW9ucxI3Cgp2aW9sYXRpb25zGAEgAygLMhcuYnVmLnZhbGlkYXRlLlZpb2xhdGlvblIKdmlvbGF0aW9ucyLFAQoJVmlvbGF0aW9uEi0KBWZpZWxkGAUgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aFIFZmllbGQSKwoEcnVsZRgGIAEoCzIXLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhSBHJ1bGUSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEhgKB21lc3NhZ2UYAyABKAlSB21lc3NhZ2USFwoHZm9yX2tleRgEIAEoCFIGZm9yS2V5SgQIARACUgpmaWVsZF9wYXRoIkcKCUZpZWxkUGF0aBI6CghlbGVtZW50cxgBIAMoCzIeLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhFbGVtZW50UghlbGVtZW50cyLMAwoQRmllbGRQYXRoRWxlbWVudBIhCgxmaWVsZF9udW1iZXIYASABKAVSC2ZpZWxkTnVtYmVyEh0KCmZpZWxkX25hbWUYAiABKAlSCWZpZWxkTmFtZRJJCgpmaWVsZF90eXBlGAMgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVSCWZpZWxkVHlwZRJFCghrZXlfdHlwZRgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgdrZXlUeXBlEkkKCnZhbHVlX3R5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIJdmFsdWVUeXBlEhYKBWluZGV4GAYgASgESABSBWluZGV4EhsKCGJvb2xfa2V5GAcgASgISABSB2Jvb2xLZXkSGQoHaW50X2tleRgIIAEoA0gAUgZpbnRLZXkSGwoIdWludF9rZXkYCSABKARIAFIHdWludEtleRIfCgpzdHJpbmdfa2V5GAogASgJSABSCXN0cmluZ0tleUILCglzdWJzY3JpcHQqoQEKBklnbm9yZRIWChJJR05PUkVfVU5TUEVDSUZJRUQQABIYChRJR05PUkVfSUZfWkVST19WQUxVRRABEhEKDUlHTk9SRV9BTFdBWVMQAyIECAIQAioMSUdOT1JFX0VNUFRZKg5JR05PUkVfREVGQVVMVCoXSUdOT1JFX0lGX0RFRkFVTFRfVkFMVUUqFUlHTk9SRV9JRl9VTlBPUFVMQVRFRCpuCgpLbm93blJlZ2V4EhsKF0tOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEEAASIAocS05PV05fUkVHRVhfSFRUUF9IRUFERVJfTkFNRRABEiEKHUtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFEAI6VgoHbWVzc2FnZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiHCSABKAsyGi5idWYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlOk4KBW9uZW9mEh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucxiHCSABKAsyGC5idWYudmFsaWRhdGUuT25lb2ZSdWxlc1IFb25lb2Y6TgoFZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVmaWVsZDpdCgpwcmVkZWZpbmVkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiICSABKAsyHS5idWYudmFsaWRhdGUuUHJlZGVmaW5lZFJ1bGVzUgpwcmVkZWZpbmVkQm4KEmJ1aWxkLmJ1Zi52YWxpZGF0ZUINVmFsaWRhdGVQcm90b1ABWkdidWYuYnVpbGQvZ2VuL2dvL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUvcHJvdG9jb2xidWZmZXJzL2dvL2J1Zi92YWxpZGF0ZUq4tgkKBxIFDgDAJwEKzgQKAQwSAw4AEjLDBCBDb3B5cmlnaHQgMjAyMy0yMDI2IEJ1ZiBUZWNobm9sb2dpZXMsIEluYy4KCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgrqCwoBAhIDLAAVGt8LIFtQcm90b3ZhbGlkYXRlXShodHRwczovL3Byb3RvdmFsaWRhdGUuY29tLykgaXMgdGhlIHNlbWFudGljIHZhbGlkYXRpb24gbGlicmFyeSBmb3IgUHJvdG9idWYuCiBJdCBwcm92aWRlcyBzdGFuZGFyZCBhbm5vdGF0aW9ucyB0byB2YWxpZGF0ZSBjb21tb24gcnVsZXMgb24gbWVzc2FnZXMgYW5kIGZpZWxkcywgYXMgd2VsbCBhcyB0aGUgYWJpbGl0eSB0byB1c2UgW0NFTF0oaHR0cHM6Ly9jZWwuZGV2KSB0byB3cml0ZSBjdXN0b20gcnVsZXMuCiBJdCdzIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgW3Byb3RvYy1nZW4tdmFsaWRhdGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b2MtZ2VuLXZhbGlkYXRlKS4KCiBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIG9wdGlvbnMsIG1lc3NhZ2VzLCBhbmQgZW51bXMgdGhhdCBwb3dlciBQcm90b3ZhbGlkYXRlLgogQXBwbHkgaXRzIG9wdGlvbnMgdG8gbWVzc2FnZXMsIGZpZWxkcywgYW5kIG9uZW9mcyBpbiB5b3VyIFByb3RvYnVmIHNjaGVtYXMgdG8gYWRkIHZhbGlkYXRpb24gcnVsZXM6CgogYGBgcHJvdG8KIG1lc3NhZ2UgVXNlciB7CiAgIHN0cmluZyBpZCA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy51dWlkID0gdHJ1ZV07CiAgIHN0cmluZyBmaXJzdF9uYW1lID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLm1heF9sZW4gPSA2NF07CiAgIHN0cmluZyBsYXN0X25hbWUgPSAzIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcubWF4X2xlbiA9IDY0XTsKCiAgIG9wdGlvbiAoYnVmLnZhbGlkYXRlLm1lc3NhZ2UpLmNlbCA9IHsKICAgICBpZDogImZpcnN0X25hbWVfcmVxdWlyZXNfbGFzdF9uYW1lIgogICAgIG1lc3NhZ2U6ICJsYXN0X25hbWUgbXVzdCBiZSBwcmVzZW50IGlmIGZpcnN0X25hbWUgaXMgcHJlc2VudCIKICAgICBleHByZXNzaW9uOiAiIWhhcyh0aGlzLmZpcnN0X25hbWUpIHx8IGhhcyh0aGlzLmxhc3RfbmFtZSkiCiAgIH07CiB9CiBgYGAKCiBUaGVzZSBydWxlcyBhcmUgZW5mb3JjZWQgYXQgcnVudGltZSBieSBsYW5ndWFnZS1zcGVjaWZpYyBsaWJyYXJpZXMuCiBTZWUgdGhlIFtkZXZlbG9wZXIgcXVpY2tzdGFydF0oaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9xdWlja3N0YXJ0LykgdG8gZ2V0IHN0YXJ0ZWQsIG9yIGdvIGRpcmVjdGx5IHRvIHRoZSBydW50aW1lIGxpYnJhcnkgZm9yIHlvdXIgbGFuZ3VhZ2U6CiBbR29dKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWdvKQogW0phdmFTY3JpcHQvVHlwZVNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUtZXMpLAogW0phdmFdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWphdmEpLAogW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUtcHl0aG9uKSwKIG9yIFtDKytdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWNjKS4KCgkKAgMAEgMuACoKCQoCAwESAy8AKAoJCgIDAhIDMAAqCgkKAgMDEgMxACkKCAoBCBIDMwBeCgkKAggLEgMzAF4KCAoBCBIDNAAiCgkKAggKEgM0ACIKCAoBCBIDNQAuCgkKAggIEgM1AC4KCAoBCBIDNgArCgkKAggBEgM2ACsKgAIKAQcSBDwAQAEa9AEgTWVzc2FnZU9wdGlvbnMgaXMgYW4gZXh0ZW5zaW9uIHRvIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy4gSXQgYWxsb3dzCiB0aGUgYWRkaXRpb24gb2YgdmFsaWRhdGlvbiBydWxlcyBhdCB0aGUgbWVzc2FnZSBsZXZlbC4gVGhlc2UgcnVsZXMgY2FuIGJlCiBhcHBsaWVkIHRvIGluY29taW5nIG1lc3NhZ2VzIHRvIGVuc3VyZSB0aGV5IG1lZXQgY2VydGFpbiBjcml0ZXJpYSBiZWZvcmUKIGJlaW5nIHByb2Nlc3NlZC4KCoYBCgIHABIDPwInGnsgUnVsZXMgc3BlY2lmeSB0aGUgdmFsaWRhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoaXMgbWVzc2FnZS4gQnkgZGVmYXVsdCwKIG5vIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGFnYWluc3QgYSBtZXNzYWdlLgoKCgoDBwACEgM8ByUKCgoDBwAEEgM/AgoKCgoDBwAGEgM/CxcKCgoDBwABEgM/GB8KCgoDBwADEgM/IiYK8gEKAQcSBEYASgEa5gEgT25lb2ZPcHRpb25zIGlzIGFuIGV4dGVuc2lvbiB0byBnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLiBJdCBhbGxvd3MKIHRoZSBhZGRpdGlvbiBvZiB2YWxpZGF0aW9uIHJ1bGVzIG9uIGEgb25lb2YuIFRoZXNlIHJ1bGVzIGNhbiBiZQogYXBwbGllZCB0byBpbmNvbWluZyBtZXNzYWdlcyB0byBlbnN1cmUgdGhleSBtZWV0IGNlcnRhaW4gY3JpdGVyaWEgYmVmb3JlCiBiZWluZyBwcm9jZXNzZWQuCgqCAQoCBwESA0kCIxp3IFJ1bGVzIHNwZWNpZnkgdGhlIHZhbGlkYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGlzIG9uZW9mLiBCeSBkZWZhdWx0LAogbm8gdmFsaWRhdGlvbiBpcyBwZXJmb3JtZWQgYWdhaW5zdCBhIG9uZW9mLgoKCgoDBwECEgNGByMKCgoDBwEEEgNJAgoKCgoDBwEGEgNJCxUKCgoDBwEBEgNJFhsKCgoDBwEDEgNJHiIK+gEKAQcSBFAAZgEa7gEgRmllbGRPcHRpb25zIGlzIGFuIGV4dGVuc2lvbiB0byBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLiBJdCBhbGxvd3MKIHRoZSBhZGRpdGlvbiBvZiB2YWxpZGF0aW9uIHJ1bGVzIGF0IHRoZSBmaWVsZCBsZXZlbC4gVGhlc2UgcnVsZXMgY2FuIGJlCiBhcHBsaWVkIHRvIGluY29taW5nIG1lc3NhZ2VzIHRvIGVuc3VyZSB0aGV5IG1lZXQgY2VydGFpbiBjcml0ZXJpYSBiZWZvcmUKIGJlaW5nIHByb2Nlc3NlZC4KCoIBCgIHAhIDUwIjGncgUnVsZXMgc3BlY2lmeSB0aGUgdmFsaWRhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoaXMgZmllbGQuIEJ5IGRlZmF1bHQsCiBubyB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IGEgZmllbGQuCgoKCgMHAgISA1AHIwoKCgMHAgQSA1MCCgoKCgMHAgYSA1MLFQoKCgMHAgESA1MWGwoKCgMHAgMSA1MeIgrKAwoCBwMSA2UCLRq+AyBTcGVjaWZpZXMgcHJlZGVmaW5lZCBydWxlcy4gV2hlbiBleHRlbmRpbmcgYSBzdGFuZGFyZCBydWxlIG1lc3NhZ2UsCiB0aGlzIGFkZHMgYWRkaXRpb25hbCBDRUwgZXhwcmVzc2lvbnMgdGhhdCBhcHBseSB3aGVuIHRoZSBleHRlbnNpb24gaXMgdXNlZC4KCiBgYGBwcm90bwogZXh0ZW5kIGJ1Zi52YWxpZGF0ZS5JbnQzMlJ1bGVzIHsKICAgYm9vbCBpc196ZXJvIFsoYnVmLnZhbGlkYXRlLnByZWRlZmluZWQpLmNlbCA9IHsKICAgICBpZDogImludDMyLmlzX3plcm8iLAogICAgIG1lc3NhZ2U6ICJ2YWx1ZSBtdXN0IGJlIHplcm8iLAogICAgIGV4cHJlc3Npb246ICIhcnVsZSB8fCB0aGlzID09IDAiLAogICB9XTsKIH0KCiBtZXNzYWdlIEZvbyB7CiAgIGludDMyIHJlc2VydmVkID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuaW50MzIuKGlzX3plcm8pID0gdHJ1ZV07CiB9CiBgYGAKCgoKAwcDAhIDUAcjCgoKAwcDBBIDZQIKCgoKAwcDBhIDZQsaCgoKAwcDARIDZRslCgoKAwcDAxIDZSgsCoEECgIEABIFdwCHAQEa8wMgYFJ1bGVgIHJlcHJlc2VudHMgYSB2YWxpZGF0aW9uIHJ1bGUgd3JpdHRlbiBpbiB0aGUgQ29tbW9uIEV4cHJlc3Npb24KIExhbmd1YWdlIChDRUwpIHN5bnRheC4gRWFjaCBSdWxlIGluY2x1ZGVzIGEgdW5pcXVlIGlkZW50aWZpZXIsIGFuCiBvcHRpb25hbCBlcnJvciBtZXNzYWdlLCBhbmQgdGhlIENFTCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiBGb3IgbW9yZQogaW5mb3JtYXRpb24sIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIEZvbyB7CiAgIG9wdGlvbiAoYnVmLnZhbGlkYXRlLm1lc3NhZ2UpLmNlbCA9IHsKICAgICBpZDogImZvby5iYXIiCiAgICAgbWVzc2FnZTogImJhciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIgogICAgIGV4cHJlc3Npb246ICJ0aGlzLmJhciA+IDAiCiAgIH07CiAgIGludDMyIGJhciA9IDE7CiB9CiBgYGAKCgoKAwQAARIDdwgMCqkBCgQEAAIAEgN6AhkamwEgYGlkYCBpcyBhIHN0cmluZyB0aGF0IHNlcnZlcyBhcyBhIG1hY2hpbmUtcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBSdWxlLgogSXQgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gaXRzIHNjb3BlLCB3aGljaCBjb3VsZCBiZSBlaXRoZXIgYSBtZXNzYWdlIG9yIGEgZmllbGQuCgoMCgUEAAIABBIDegIKCgwKBQQAAgAFEgN6CxEKDAoFBAACAAESA3oSFAoMCgUEAAIAAxIDehcYCoMCCgQEAAIBEgSAAQIeGvQBIGBtZXNzYWdlYCBpcyBhbiBvcHRpb25hbCBmaWVsZCB0aGF0IHByb3ZpZGVzIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZQogZm9yIHRoaXMgUnVsZSB3aGVuIHRoZSBDRUwgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UuIElmIGEKIG5vbi1lbXB0eSBtZXNzYWdlIGlzIHByb3ZpZGVkLCBhbnkgc3RyaW5ncyByZXN1bHRpbmcgZnJvbSB0aGUgQ0VMCiBleHByZXNzaW9uIGV2YWx1YXRpb24gYXJlIGlnbm9yZWQuCgoNCgUEAAIBBBIEgAECCgoNCgUEAAIBBRIEgAELEQoNCgUEAAIBARIEgAESGQoNCgUEAAIBAxIEgAEcHQqiAgoEBAACAhIEhgECIRqTAiBgZXhwcmVzc2lvbmAgaXMgdGhlIGFjdHVhbCBDRUwgZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGZvcgogdmFsaWRhdGlvbi4gVGhpcyBzdHJpbmcgbXVzdCByZXNvbHZlIHRvIGVpdGhlciBhIGJvb2xlYW4gb3IgYSBzdHJpbmcKIHZhbHVlLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2Ugb3IgYSBub24tZW1wdHkgc3RyaW5nLCB0aGUKIHZhbGlkYXRpb24gaXMgY29uc2lkZXJlZCBmYWlsZWQsIGFuZCB0aGUgbWVzc2FnZSBpcyByZWplY3RlZC4KCg0KBQQAAgIEEgSGAQIKCg0KBQQAAgIFEgSGAQsRCg0KBQQAAgIBEgSGARIcCg0KBQQAAgIDEgSGAR8gCtwBCgIEARIGiwEA1wEBGs0BIE1lc3NhZ2VSdWxlcyByZXByZXNlbnRzIHZhbGlkYXRpb24gcnVsZXMgdGhhdCBhcmUgYXBwbGllZCB0byB0aGUgZW50aXJlIG1lc3NhZ2UuCiBJdCBpbmNsdWRlcyBkaXNhYmxpbmcgb3B0aW9ucyBhbmQgYSBsaXN0IG9mIFJ1bGUgbWVzc2FnZXMgcmVwcmVzZW50aW5nIENvbW1vbiBFeHByZXNzaW9uIExhbmd1YWdlIChDRUwpIHZhbGlkYXRpb24gcnVsZXMuCgoLCgMEAQESBIsBCBQK1AYKBAQBAgASBJ4BAiUaxQYgYGNlbF9leHByZXNzaW9uYCBpcyBhIHJlcGVhdGVkIGZpZWxkIENFTCBleHByZXNzaW9ucy4gRWFjaCBleHByZXNzaW9uIHNwZWNpZmllcyBhIHZhbGlkYXRpb24KIHJ1bGUgdG8gYmUgYXBwbGllZCB0byB0aGlzIG1lc3NhZ2UuIFRoZXNlIHJ1bGVzIGFyZSB3cml0dGVuIGluIENvbW1vbiBFeHByZXNzaW9uIExhbmd1YWdlIChDRUwpIHN5bnRheC4KCiBUaGlzIGlzIGEgc2ltcGxpZmllZCBmb3JtIG9mIHRoZSBgY2VsYCBSdWxlIGZpZWxkLCB3aGVyZSBvbmx5IGBleHByZXNzaW9uYCBpcyBzZXQuIFRoaXMgYWxsb3dzIGZvcgogc2ltcGxlciBzeW50YXggd2hlbiBkZWZpbmluZyBDRUwgUnVsZXMgd2hlcmUgYGlkYCBhbmQgYG1lc3NhZ2VgIGRlcml2ZWQgZnJvbSB0aGUgYGV4cHJlc3Npb25gLiBgaWRgIHdpbGwKIGJlIHNhbWUgYXMgdGhlIGBleHByZXNzaW9uYC4KCiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgW3NlZSBvdXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9idWYuYnVpbGQvZG9jcy9wcm90b3ZhbGlkYXRlL3NjaGVtYXMvY3VzdG9tLXJ1bGVzLykuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGBmb29gIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb24gKGJ1Zi52YWxpZGF0ZS5tZXNzYWdlKS5jZWxfZXhwcmVzc2lvbiA9ICJ0aGlzLmZvbyA+IDQyIjsKICAgLy8gVGhlIGZpZWxkIGBmb29gIG11c3QgYmUgbGVzcyB0aGFuIDg0LgogICBvcHRpb24gKGJ1Zi52YWxpZGF0ZS5tZXNzYWdlKS5jZWxfZXhwcmVzc2lvbiA9ICJ0aGlzLmZvbyA8IDg0IjsKICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsKIH0KIGBgYAoKDQoFBAECAAQSBJ4BAgoKDQoFBAECAAUSBJ4BCxEKDQoFBAECAAESBJ4BEiAKDQoFBAECAAMSBJ4BIyQKvgQKBAQBAgESBK8BAhgarwQgYGNlbGAgaXMgYSByZXBlYXRlZCBmaWVsZCBvZiB0eXBlIFJ1bGUuIEVhY2ggUnVsZSBzcGVjaWZpZXMgYSB2YWxpZGF0aW9uIHJ1bGUgdG8gYmUgYXBwbGllZCB0byB0aGlzIG1lc3NhZ2UuCiBUaGVzZSBydWxlcyBhcmUgd3JpdHRlbiBpbiBDb21tb24gRXhwcmVzc2lvbiBMYW5ndWFnZSAoQ0VMKSBzeW50YXguIEZvciBtb3JlIGluZm9ybWF0aW9uLAogW3NlZSBvdXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9idWYuYnVpbGQvZG9jcy9wcm90b3ZhbGlkYXRlL3NjaGVtYXMvY3VzdG9tLXJ1bGVzLykuCgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgZm9vYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0Mi4KICAgb3B0aW9uIChidWYudmFsaWRhdGUubWVzc2FnZSkuY2VsID0gewogICAgIGlkOiAibXlfbWVzc2FnZS52YWx1ZSIsCiAgICAgbWVzc2FnZTogInZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyIiwKICAgICBleHByZXNzaW9uOiAidGhpcy5mb28gPiA0MiIsCiAgIH07CiAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7CiB9CiBgYGAKCg0KBQQBAgEEEgSvAQIKCg0KBQQBAgEGEgSvAQsPCg0KBQQBAgEBEgSvARATCg0KBQQBAgEDEgSvARYXCskOCgQEAQICEgTTAQImGroOIGBvbmVvZmAgaXMgYSByZXBlYXRlZCBmaWVsZCBvZiB0eXBlIE1lc3NhZ2VPbmVvZlJ1bGUgdGhhdCBzcGVjaWZpZXMgYSBsaXN0IG9mIGZpZWxkcwogb2Ygd2hpY2ggYXQgbW9zdCBvbmUgY2FuIGJlIHByZXNlbnQuIElmIGByZXF1aXJlZGAgaXMgYWxzbyBzcGVjaWZpZWQsIHRoZW4gZXhhY3RseSBvbmUKIG9mIHRoZSBzcGVjaWZpZWQgZmllbGRzIF9tdXN0XyBiZSBwcmVzZW50LgoKIFRoaXMgd2lsbCBlbmZvcmNlIG9uZW9mLWxpa2UgY29uc3RyYWludHMgd2l0aCBhIGZldyBmZWF0dXJlcyBub3QgcHJvdmlkZWQgYnkKIGFjdHVhbCBQcm90b2J1ZiBvbmVvZiBkZWNsYXJhdGlvbnM6CiAgIDEuIFJlcGVhdGVkIGFuZCBtYXAgZmllbGRzIGFyZSBhbGxvd2VkIGluIHRoaXMgdmFsaWRhdGlvbi4gSW4gYSBQcm90b2J1ZiBvbmVvZiwKICAgICAgb25seSBzY2FsYXIgZmllbGRzIGFyZSBhbGxvd2VkLgogICAyLiBGaWVsZHMgd2l0aCBpbXBsaWNpdCBwcmVzZW5jZSBhcmUgYWxsb3dlZC4gSW4gYSBQcm90b2J1ZiBvbmVvZiwgYWxsIG1lbWJlcgogICAgICBmaWVsZHMgaGF2ZSBleHBsaWNpdCBwcmVzZW5jZS4gVGhpcyBtZWFucyB0aGF0LCBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV0ZXJtaW5pbmcKICAgICAgaG93IG1hbnkgZmllbGRzIGFyZSBzZXQsIGV4cGxpY2l0bHkgc2V0dGluZyBzdWNoIGEgZmllbGQgdG8gaXRzIHplcm8gdmFsdWUgaXMKICAgICAgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgbm90IHNldHRpbmcgaXQgYXQgYWxsLgogICAzLiBUaGlzIHdpbGwgYWx3YXlzIGdlbmVyYXRlIHZhbGlkYXRpb24gZXJyb3JzIGZvciBhIG1lc3NhZ2UgdW5tYXJzaGFsbGVkIGZyb20KICAgICAgc2VyaWFsaXplZCBkYXRhIHRoYXQgc2V0cyBtb3JlIHRoYW4gb25lIGZpZWxkLiBXaXRoIGEgUHJvdG9idWYgb25lb2YsIHdoZW4KICAgICAgbXVsdGlwbGUgZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGZvcm0sIGVhcmxpZXIgdmFsdWVzIGFyZSB1c3VhbGx5CiAgICAgIHNpbGVudGx5IGlnbm9yZWQgd2hlbiB1bm1hcnNoYWxsaW5nLCB3aXRoIG9ubHkgdGhlIGxhc3QgZmllbGQgYmVpbmcgc2V0IHdoZW4KICAgICAgdW5tYXJzaGFsbGluZyBjb21wbGV0ZXMuCgogTm90ZSB0aGF0IGFkZGluZyBhIGZpZWxkIHRvIGEgYG9uZW9mYCB3aWxsIGFsc28gc2V0IHRoZSBJR05PUkVfSUZfWkVST19WQUxVRSBvbiB0aGUgZmllbGRzLiBUaGlzIG1lYW5zCiBvbmx5IHRoZSBmaWVsZCB0aGF0IGlzIHNldCB3aWxsIGJlIHZhbGlkYXRlZCBhbmQgdGhlIHVuc2V0IGZpZWxkcyBhcmUgbm90IHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZpZWxkIHJ1bGVzLgogVGhpcyBiZWhhdmlvciBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0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9QEQGAoNCgUEAwIAAxIE9QEbHAqgAQoCBAQSBvoBAIEDARqRASBGaWVsZFJ1bGVzIGVuY2Fwc3VsYXRlcyB0aGUgcnVsZXMgZm9yIGVhY2ggdHlwZSBvZiBmaWVsZC4gRGVwZW5kaW5nIG9uCiB0aGUgZmllbGQsIHRoZSBjb3JyZWN0IHNldCBzaG91bGQgYmUgdXNlZCB0byBlbnN1cmUgcHJvcGVyIHZhbGlkYXRpb25zLgoKCwoDBAQBEgT6AQgSCtoFCgQEBAIAEgSKAgImGssFIGBjZWxfZXhwcmVzc2lvbmAgaXMgYSByZXBlYXRlZCBmaWVsZCBDRUwgZXhwcmVzc2lvbnMuIEVhY2ggZXhwcmVzc2lvbiBzcGVjaWZpZXMgYSB2YWxpZGF0aW9uCiBydWxlIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBtZXNzYWdlLiBUaGVzZSBydWxlcyBhcmUgd3JpdHRlbiBpbiBDb21tb24gRXhwcmVzc2lvbiBMYW5ndWFnZSAoQ0VMKSBzeW50YXguCgogVGhpcyBpcyBhIHNpbXBsaWZpZWQgZm9ybSBvZiB0aGUgYGNlbGAgUnVsZSBmaWVsZCwgd2hlcmUgb25seSBgZXhwcmVzc2lvbmAgaXMgc2V0LiBUaGlzIGFsbG93cyBmb3IKIHNpbXBsZXIgc3ludGF4IHdoZW4gZGVmaW5pbmcgQ0VMIFJ1bGVzIHdoZXJlIGBpZGAgYW5kIGBtZXNzYWdlYCBkZXJpdmVkIGZyb20gdGhlIGBleHByZXNzaW9uYC4gYGlkYCB3aWxsCiBiZSBzYW1lIGFzIHRoZSBgZXhwcmVzc2lvbmAuCgogRm9yIG1vcmUgaW5mb3JtYXRpb24sIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgdmFsdWVgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmNlbF9leHByZXNzaW9uID0gInRoaXMgPiA0MiJdOwogfQogYGBgCgoNCgUEBAIABBIEigICCgoNCgUEBAIABRIEigILEQoNCgUEBAIAARIEigISIAoNCgUEBAIAAxIEigIjJQryAwoEBAQCARIEmQICGRrjAyBgY2VsYCBpcyBhIHJlcGVhdGVkIGZpZWxkIHVzZWQgdG8gcmVwcmVzZW50IGEgdGV4dHVhbCBleHByZXNzaW9uCiBpbiB0aGUgQ29tbW9uIEV4cHJlc3Npb24gTGFuZ3VhZ2UgKENFTCkgc3ludGF4LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwKIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgdmFsdWVgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmNlbCA9IHsKICAgICBpZDogIm15X21lc3NhZ2UudmFsdWUiLAogICAgIG1lc3NhZ2U6ICJ2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0MiIsCiAgICAgZXhwcmVzc2lvbjogInRoaXMgPiA0MiIsCiAgIH1dOwogfQogYGBgCgoNCgUEBAIBBBIEmQICCgoNCgUEBAIBBhIEmQILDwoNCgUEBAIBARIEmQIQEwoNCgUEBAIBAxIEmQIWGArhDgoEBAQCAhIE0gICHhrSDiBJZiBgcmVxdWlyZWRgIGlzIHRydWUsIHRoZSBmaWVsZCBtdXN0IGJlIHNldC4gQSB2YWxpZGF0aW9uIGVycm9yIGlzIHJldHVybmVkCiBpZiB0aGUgZmllbGQgaXMgbm90IHNldC4KCiBgYGBwcm90bwogc3ludGF4PSJwcm90bzMiOwoKIG1lc3NhZ2UgRmllbGRzV2l0aFByZXNlbmNlIHsKICAgLy8gUmVxdWlyZXMgYW55IHN0cmluZyB0byBiZSBzZXQsIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgogICBvcHRpb25hbCBzdHJpbmcgbGluayA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogICAvLyBSZXF1aXJlcyB0cnVlIG9yIGZhbHNlIHRvIGJlIHNldC4KICAgb3B0aW9uYWwgYm9vbCBkaXNhYmxlZCA9IDIgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogICAvLyBSZXF1aXJlcyBhIG1lc3NhZ2UgdG8gYmUgc2V0LCBpbmNsdWRpbmcgdGhlIGVtcHR5IG1lc3NhZ2UuCiAgIFNvbWVNZXNzYWdlIG1zZyA9IDQgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogfQogYGBgCgogQWxsIGZpZWxkcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSB0cmFjayBwcmVzZW5jZS4gQnkgZGVmYXVsdCwgUHJvdG92YWxpZGF0ZQogaWdub3JlcyBydWxlcyBvbiB0aG9zZSBmaWVsZHMgaWYgbm8gdmFsdWUgaXMgc2V0LiBgcmVxdWlyZWRgIGVuc3VyZXMgdGhhdAogdGhlIGZpZWxkcyBhcmUgc2V0IGFuZCB2YWxpZC4KCiBGaWVsZHMgdGhhdCBkb24ndCB0cmFjayBwcmVzZW5jZSBhcmUgYWx3YXlzIHZhbGlkYXRlZCBieSBQcm90b3ZhbGlkYXRlLAogd2hldGhlciB0aGV5IGFyZSBzZXQgb3Igbm90LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBgcmVxdWlyZWRgLiBJdAogY2FuIGJlIGFkZGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGZpZWxkIGNhbm5vdCBiZSB0aGUgemVybyB2YWx1ZS4KCiBgYGBwcm90bwogc3ludGF4PSJwcm90bzMiOwoKIG1lc3NhZ2UgRmllbGRzV2l0aG91dFByZXNlbmNlIHsKICAgLy8gYHN0cmluZy5lbWFpbGAgYWx3YXlzIGFwcGxpZXMsIGV2ZW4gdG8gYW4gZW1wdHkgc3RyaW5nLgogICBzdHJpbmcgbGluayA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5lbWFpbCA9IHRydWUKICAgXTsKICAgLy8gYHJlcGVhdGVkLm1pbl9pdGVtc2AgYWx3YXlzIGFwcGxpZXMsIGV2ZW4gdG8gYW4gZW1wdHkgbGlzdC4KICAgcmVwZWF0ZWQgc3RyaW5nIGxhYmVscyA9IDIgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcGVhdGVkLm1pbl9pdGVtcyA9IDEKICAgXTsKICAgLy8gYHJlcXVpcmVkYCwgZm9yIGZpZWxkcyB0aGF0IGRvbid0IHRyYWNrIHByZXNlbmNlLCBpbmRpY2F0ZXMKICAgLy8gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBjYW4ndCBiZSB0aGUgemVybyB2YWx1ZS4KICAgaW50MzIgemVyb192YWx1ZV9ub3RfYWxsb3dlZCA9IDMgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogfQogYGBgCgogVG8gbGVhcm4gd2hpY2ggZmllbGRzIHRyYWNrIHByZXNlbmNlLCBzZWUgdGhlCiBbRmllbGQgUHJlc2VuY2UgY2hlYXQgc2hlZXRdKGh0dHBzOi8vcHJvdG9idWYuZGV2L3Byb2dyYW1taW5nLWd1aWRlcy9maWVsZF9wcmVzZW5jZS8jY2hlYXQpLgoKIE5vdGU6IFdoaWxlIGZpZWxkIHJ1bGVzIGNhbiBiZSBhcHBsaWVkIHRvIHJlcGVhdGVkIGl0ZW1zLCBtYXAga2V5cywgYW5kIG1hcAogdmFsdWVzLCB0aGUgZWxlbWVudHMgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIHNldC4gQ29uc2VxdWVudGx5LAogc3BlY2lmeWluZyBgcmVwZWF0ZWQuaXRlbXMucmVxdWlyZWRgIGlzIHJlZHVuZGFudC4KCg0KBQQEAgIEEgTSAgIKCg0KBQQEAgIFEgTSAgsPCg0KBQQEAgIBEgTSAhAYCg0KBQQEAgIDEgTSAhsdCvYCCgQEBAIDEgTfAgIeGucCIElnbm9yZSB2YWxpZGF0aW9uIHJ1bGVzIG9uIHRoZSBmaWVsZCBpZiBpdHMgdmFsdWUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCiBjcml0ZXJp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AQoCBQASBpwDAPQDARp0IFNwZWNpZmllcyBob3cgYEZpZWxkUnVsZXMuaWdub3JlYCBiZWhhdmVzLCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkJ3MgdmFsdWUsIGFuZAogd2hldGhlciB0aGUgZmllbGQgdHJhY2tzIHByZXNlbmNlLgoKCwoDBQABEgScAwULCpQKCgQFAAIAEgTQAwIZGoUKIElnbm9yZSBydWxlcyBpZiB0aGUgZmllbGQgdHJhY2tzIHByZXNlbmNlIGFuZCBpcyB1bnNldC4gVGhpcyBpcyB0aGUgZGVmYXVsdAogYmVoYXZpb3IuCgogSW4gcHJvdG8zLCBvbmx5IG1lc3NhZ2UgZmllbGRzLCBtZW1iZXJzIG9mIGEgUHJvdG9idWYgYG9uZW9mYCwgYW5kIGZpZWxkcwogd2l0aCB0aGUgYG9wdGlvbmFsYCBsYWJlbCB0cmFjayBwcmVzZW5jZS4gQ29uc2VxdWVudGx5LCB0aGUgZm9sbG93aW5nIGZpZWxkcwogYXJlIGFsd2F5cyB2YWxpZGF0ZWQsIHdoZXRoZXIgYSB2YWx1ZSBpcyBzZXQgb3Igbm90OgoKIGBgYHByb3RvCiBzeW50YXg9InByb3RvMyI7CgogbWVzc2FnZSBSdWxlc0FwcGx5IHsKICAgc3RyaW5nIGVtYWlsID0gMSBbCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLmVtYWlsID0gdHJ1ZQogICBdOwogICBpbnQzMiBhZ2UgPSAyIFsKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5pbnQzMi5ndCA9IDAKICAgXTsKICAgcmVwZWF0ZWQgc3RyaW5nIGxhYmVscyA9IDMgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcGVhdGVkLm1pbl9pdGVtcyA9IDEKICAgXTsKIH0KIGBgYAoKIEluIGNvbnRyYXN0LCB0aGUgZm9sbG93aW5nIGZpZWxkcyB0cmFjayBwcmVzZW5jZSwgYW5kIGFyZSBvbmx5IHZhbGlkYXRlZCBpZgogYSB2YWx1ZSBpcyBzZXQ6CgogYGBgcHJvdG8KIHN5bnRheD0icHJvdG8zIjsKCiBtZXNzYWdlIFJ1bGVzQXBwbHlJZlNldCB7CiAgIG9wdGlvbmFsIHN0cmluZyBlbWFpbCA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5lbWFpbCA9IHRydWUKICAgXTsKICAgb25lb2YgcmVmIHsKICAgICBzdHJpbmcgcmVmZXJlbmNlID0gMiBbCiAgICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcudXVpZCA9IHRydWUKICAgICBdOwogICAgIHN0cmluZyBuYW1lID0gMyBbCiAgICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcubWluX2xlbiA9IDQKICAgICBdOwogICB9CiAgIFNvbWVNZXNzYWdlIG1zZyA9IDQgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLmNlbCA9IHsvKiAuLi4gKi99CiAgIF07CiB9CiBgYGAKCiBUbyBlbnN1cmUgdGhhdCBzdWNoIGEgZmllbGQgaXMgc2V0LCBhZGQgdGhlIGByZXF1aXJlZGAgcnVsZS4KCiBUbyBsZWFybiB3aGljaCBmaWVsZHMgdHJhY2sgcHJlc2VuY2UsIHNlZSB0aGUKIFtGaWVsZCBQcmVzZW5jZSBjaGVhdCBzaGVldF0oaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2ZpZWxkX3ByZXNlbmNlLyNjaGVhdCkuCgoNCgUFAAIAARIE0AMCFAoNCgUFAAIAAhIE0AMXGArJBQoEBQACARIE4AMCGxq6BSBJZ25vcmUgcnVsZXMgaWYgdGhlIGZpZWxkIGlzIHVuc2V0LCBvciBzZXQgdG8gdGhlIHplcm8gdmFsdWUuCgogVGhlIHplcm8gdmFsdWUgZGVwZW5kcyBvbiB0aGUgZmllbGQgdHlwZToKIC0gRm9yIHN0cmluZ3MsIHRoZSB6ZXJvIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcuCiAtIEZvciBieXRlcywgdGhlIHplcm8gdmFsdWUgaXMgZW1wdHkgYnl0ZXMuCiAtIEZvciBib29sLCB0aGUgemVybyB2YWx1ZSBpcyBmYWxzZS4KIC0gRm9yIG51bWVyaWMgdHlwZXMsIHRoZSB6ZXJvIHZhbHVlIGlzIHplcm8uCiAtIEZvciBlbnVtcywgdGhlIHplcm8gdmFsdWUgaXMgdGhlIGZpcnN0IGRlZmluZWQgZW51bSB2YWx1ZS4KIC0gRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhlIHplcm8gaXMgYW4gZW1wdHkgbGlzdC4KIC0gRm9yIG1hcCBmaWVsZHMsIHRoZSB6ZXJvIGlzIGFuIGVtcHR5IG1hcC4KIC0gRm9yIG1lc3NhZ2UgZmllbGRzLCBhYnNlbmNlIG9mIHRoZSBtZXNzYWdlICh0eXBpY2FsbHkgYSBudWxsLXZhbHVlKSBpcyBjb25zaWRlcmVkIHplcm8gdmFsdWUuCgogRm9yIGZpZWxkcyB0aGF0IHRyYWNrIHByZXNlbmNlIChlLmcuIGFkZGluZyB0aGUgYG9wdGlvbmFsYCBsYWJlbCBpbiBwcm90bzMpLAogdGhpcyBhIG5vLW9wIGFuZCBiZWhhdmlvciBpcyB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCBgSUdOT1JFX1VOU1BFQ0lGSUVEYC4KCg0KBQUAAgEBEgTgAwIWCg0KBQUAAgECEgTgAxkaCpkDCgQFAAICEgTwAwIUGooDIEFsd2F5cyBpZ25vcmUgcnVsZXMsIGluY2x1ZGluZyB0aGUgYHJlcXVpcmVkYCBydWxlLgoKIFRoaXMgaXMgdXNlZnVsIGZvciBpZ25vcmluZyB0aGUgcnVsZXMgb2YgYSByZWZlcmVuY2VkIG1lc3NhZ2UsIG9yIHRvCiB0ZW1wb3JhcmlseSBpZ25vcmUgcnVsZXMgZHVyaW5nIGRldmVsb3BtZW50LgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCdzIHJ1bGVzIHdpbGwgYWx3YXlzIGJlIGlnbm9yZWQsIGluY2x1ZGluZyBhbnkgdmFsaWRhdGlvbnMKICAgLy8gb24gdmFsdWUncyBmaWVsZHMuCiAgIE15T3RoZXJNZXNzYWdlIHZhbHVlID0gMSBbCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuaWdub3JlID0gSUdOT1JFX0FMV0FZUwogICBdOwogfQogYGBgCgoNCgUFAAICARIE8AMCDwoNCgUFAAICAhIE8AMSEwoLCgMFAAQSBPIDAg0KDAoEBQAEABIE8gMLDAoNCgUFAAQA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FAoKBAoCAwiICQEDAxIGoAsIogttChMKCQQKAgMIiAkBBBIGpAsGqQsHChIKCgQKAgMIiAkBBAESBKULCCUKFAoKBAoCAwiICQEEAxIGpgsIqAtsCsQGCgQECgIEEga+CwTdCwYaswYgYGd0ZWAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSAoZXhjbHVzaXZlKS4gSWYgdGhlIHZhbHVlIG9mIGBndGVgIGlzIGxhcmdlciB0aGFuIGEgc3BlY2lmaWVkIGBsdGAKIG9yIGBsdGVgLCB0aGUgcmFuZ2UgaXMgcmV2ZXJzZWQsIGFuZCB0aGUgZmllbGQgdmFsdWUgbXVzdCBiZSBvdXRzaWRlIHRoZQogc3BlY2lmaWVkIHJhbmdlLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlVSW50MzIgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IFt1aW50MzIuZ3RlXQogICB1aW50MzIgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS51aW50MzIuZ3RlID0gNV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IGFuZCBsZXNzIHRoYW4gMTAgW3VpbnQzMi5ndGVfbHRdCiAgIHVpbnQzMiBvdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLnVpbnQzMiA9IHsgZ3RlOiA1LCBsdDogMTAgfV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxMCBvciBsZXNzIHRoYW4gNSBbdWludDMyLmd0ZV9sdF9leGNsdXNpdmVdCiAgIHVpbnQzMiBhbm90aGVyX3ZhbHVlID0gMyBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudWludDMyID0geyBndGU6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EgTbEQgcChQKCgQOAgMIiAkBAwMSBtwRCN4RbQoTCgkEDgIDCIgJAQQSBuARBuURBwoSCgoEDgIDCIgJAQQBEgThEQgmChQKCgQOAgMIiAkBBAMSBuIRCOQRbArOBgoEBA4CBBIG+hEEmRIGGr0GIGBndGVgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAogdmFsdWUgKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RlYCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Rml4ZWQzMiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgW2ZpeGVkMzIuZ3RlXQogICBmaXhlZDMyIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQzMi5ndGUgPSA1XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgYW5kIGxlc3MgdGhhbiAxMCBbZml4ZWQzMi5ndGVfbHRdCiAgIGZpeGVkMzIgb3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5maXhlZDMyID0geyBndGU6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwIG9yIGxlc3MgdGhhbiA1IFtmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmVdCiAgIGZpeGVkMzIgYW5vdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQp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AAESBP0SBhcKFAoKBA8CAgiICQEAAxIG/hIGgBNNCg4KBAQPCAESBoMTAukTAwoNCgUEDwgBARIEgxMIFAqWBgoEBA8CAxIGlhMEtRMGGoUGIGBndGAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlCiAoZXhjbHVzaXZlKS4gSWYgdGhlIHZhbHVlIG9mIGBndGAgaXMgbGFyZ2VyIHRoYW4gYSBzcGVjaWZpZWQgYGx0YCBvcgogYGx0ZWAsIHRoZSByYW5nZSBpcyByZXZlcnNlZCwgYW5kIHRoZSBmaWVsZCB2YWx1ZSBtdXN0IGJlIG91dHNpZGUgdGhlCiBzcGVjaWZpZWQgcmFuZ2UuIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1lZXQgdGhlIHJlcXVpcmVkIGNvbmRpdGlvbnMsCiBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA1IFtmaXhlZDY0Lmd0XQogICBmaXhlZDY0IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NC5ndCA9IDVdOwoKICAgLy8gdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gNSBhbmQgbGVzcyB0aGFuIDEwIFtmaXhlZDY0Lmd0X2x0XQogICBmaXhlZDY0IG90aGVyX3ZhbHVlID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NCA9IHsgZ3Q6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEwIG9yIGxlc3MgdGhhbiA1IFtmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZV0KICAgZml4ZWQ2NCBhbm90aGVyX3ZhbHVlID0gMyBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NCA9IHsgZ3Q6IDEwLCBsdDogNSB9XTsKIH0KIGBgYAoKDQoFBA8CAwUSBJYTBAsKDQoFBA8CAwESBJYTDA4KDQoFBA8CAwMSBJYTERIK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cXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAogdmFsdWUgKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RlYCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U0ZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IFtzZml4ZWQ2NC5ndGVdCiAgIHNmaXhlZDY0IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc2ZpeGVkNjQuZ3RlID0gNV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IGFuZCBsZXNzIHRoYW4gMTAgW3NmaXhlZDY0Lmd0ZV9sdF0KICAgc2ZpeGVkNjQgb3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zZml4ZWQ2NCA9IHsgZ3RlOiA1LCBsdDogMTAgfV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxMCBvciBsZXNzIHRoYW4gNSBbc2ZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZV0KICAgc2ZpeGVkNjQgYW5vdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDY0ID0geyBndGU6IDEwLCBsdDogNSB9XTsKIH0KIGBgYAoKDQoFBBECBAUSBOcWBAwKDQoFBBECBAESBOcWDRAKDQoFBBECBAMSBOcWExQKDwoFBBECBAgSBucWFYYXBQoTCgkEEQIE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ZWxkIHZhbHVlIG11c3QgbWF0Y2ggdGhlIHNwZWNpZmllZAogcmVndWxhciBleHByZXNzaW9uIChSRTIgc3ludGF4KSwgd2l0aCB0aGUgZXhwcmVzc2lvbiBwcm92aWRlZCB3aXRob3V0IGFueQogZGVsaW1pdGVycy4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYW4KIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTdHJpbmcgewogICAvLyB2YWx1ZSBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIGBeW2EtekEtWl0vLyRgCiAgIHN0cmluZyB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5wYXR0ZXJuID0gIl5bYS16QS1aXS8vJCJdOwogfQogYGBgCgoNCgUEEwIHBBIE4BgCCgoNCgUEEwIHBRIE4BgLEQoNCgUEEwIHARIE4BgSGQoNCgUEEwIHAxIE4BgcHQoPCgUEEwIHCBIG4Bge4xgEChMKCQQTAgcIiAkBABIG4Bgf4xgDChIKCgQTAgcIiAkBAAESBOEYBBgKEgoKBBMCBwiICQEAAxIE4hgEdwruAgoEBBMCCBIG8BgC8xgFGt0CIGBwcmVmaXhgIHNwZWNpZmllcyB0aGF0IHRoZSBmaWVsZCB2YWx1ZSBtdXN0IGhhdmUgdGhlCnNwZWNpZmllZCBzdWJzdHJpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLiBJZiB0aGUgZmllbGQgdmFsdWUKIGRvZXNuJ3Qgc3RhcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlCiBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTdHJpbmcgewogICAvLyB2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCBgcHJlYAogICBzdHJpbmcgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcucHJlZml4ID0gInByZSJdOwogfQogYGBgCgoNCgUE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AAESBLsZBBcKEgoKBBMCDQiICQEAAxIEvBkEYwpbCgQEEwgAEgbBGQK9HQMaSyBgV2VsbEtub3duYCBydWxlcyBwcm92aWRlIGFkdmFuY2VkIHJ1bGVzIGFnYWluc3QgY29tbW9uIHN0cmluZwogcGF0dGVybnMuCgoNCgUEEwgAARIEwRkIEgrJBQoEBBMCDhIG0hkE3RkGGrgFIGBlbWFpbGAgc3BlY2lmaWVzIHRoYXQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLCBmb3IKIGV4YW1wbGUgImZvb0BleGFtcGxlLmNvbSIuCgogQ29uZm9ybXMgdG8gdGhlIGRlZmluaXRpb24gZm9yIGEgdmFsaWQgZW1haWwgYWRkcmVzcyBmcm9tIHRoZSBbSFRNTCBzdGFuZGFyZF0oaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5wdXQuaHRtbCN2YWxpZC1lLW1haWwtYWRkcmVzcykuCiBOb3RlIHRoYXQgdGhpcyBzdGFuZGFyZCB3aWxsZnVsbHkgZGV2aWF0ZXMgZnJvbSBbUkZDIDUzMjJdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNTMyMiksCiB3aGljaCBhbGxvd3MgbWFueSB1bmV4cGVjdGVkIGZvcm1zIG9mIGVtYWlsIGFkZHJlc3NlcyBhbmQgd2lsbCBlYXNpbHkgbWF0Y2gKIGEgdHlwb2dyYXBoaWNhbCBlcnJvci4KCiBJZiB0aGUgZmllbGQgdmFsdWUgaXNuJ3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLCBhbiBlcnJvciBtZXNzYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U3RyaW5nIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MKICAgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLmVtYWlsID0gdHJ1ZV07CiB9CiBgYGAKCg0KBQQTAg4FEgTSGQQICg0KBQQTAg4BEgTSGQkOCg0KBQQTAg4DEgTSGRETCg8K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AxIEjh0ILwryBwoEBBMCIBIGph0EvB0GGuEHIGB3ZWxsX2tub3duX3JlZ2V4YCBzcGVjaWZpZXMgYSBjb21tb24gd2VsbC1rbm93biBwYXR0ZXJuCiBkZWZpbmVkIGFzIGEgcmVnZXguIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1hdGNoIHRoZSB3ZWxsLWtub3duCiByZWdleCwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVN0cmluZyB7CiAgIC8vIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciB2YWx1ZQogICBzdHJpbmcgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcud2VsbF9rbm93bl9yZWdleCA9IEtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFXTsKIH0KIGBgYAoKICMjIyMgS25vd25SZWdleAoKIGB3ZWxsX2tub3duX3JlZ2V4YCBjb250YWlucyBzb21lIHdlbGwta25vd24gcGF0dGVybnMuCgogfCBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICB8IE51bWJlciB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CiB8IEtOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEICAgICAgIHwgMCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogfCBLTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9OQU1FICB8IDEgICAgICB8IEhUVFAgaGVhZGVyIG5hbWUgYXMgZGVmaW5lZCBieSBbUkZDIDcyMzBdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMikgIHwKIHwgS05PV05fUkVHRVhfSFRUUF9IRUFERVJfVkFM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ZmllbGQgdmFsdWUgdG8gZXhhY3RseSBtYXRjaCB0aGUgc3BlY2lmaWVkIGVudW0gdmFsdWUuCiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtYXRjaCwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIGVudW0gTXlFbnVtIHsKICAgTVlfRU5VTV9VTlNQRUNJRklFRCA9IDA7CiAgIE1ZX0VOVU1fVkFMVUUxID0gMTsKICAgTVlfRU5VTV9WQUxVRTIgPSAyOwogfQoKIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGB2YWx1ZWAgbXVzdCBiZSBleGFjdGx5IE1ZX0VOVU1fVkFMVUUxLgogICBNeUVudW0gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtLmNvbnN0ID0gMV07CiB9CiBgYGAKCg0KBQQVAgAEEgSPIAIKCg0KBQQVAgAFEgSPIAsQCg0KBQQVAgABEgSPIBEWCg0KBQQVAgADEgSPIBkaCg8KBQQVAgAIEgaPIBuSIAQKEwoJBBUCAAiICQEAEgaPIBySIAMKEgoKBBUCAAiICQEAARIEkCAEFAoSCgoEFQIACIgJAQADEgSRIARyCo0DCgQEFQIBEgSjIAIhGv4CIGBkZWZpbmVkX29ubHlgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBvbmUgb2YgdGhlIGRlZmluZWQgdmFsdWVzIGZvcgogdGhpcyBlbnVtLCBmYWlsaW5nIG9uIGFueSB1bmRlZmluZWQgdmFsdWUuCgogYGBgcHJvdG8KIGVudW0gTXlFbnVtIHsKICAgTVlfRU5VTV9VTlNQRUNJRklFRCA9IDA7CiAgIE1ZX0VOVU1fVkFMVUUxID0gMTsKICAgTVlfRU5VTV9WQUxVRTIgPSAyOwogfQoKIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGB2YWx1ZWAgbXVzdCBiZSBhIGRlZmluZWQgdmFsdWUgb2YgTXlFbnVtLgogICBNeUVudW0gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtLmRlZmluZWRfb25seSA9IHRydWVdOwogfQogYGBgCgoNCgUEFQIBBBIEoyACCgoNCgUEFQIBBRIEoyALDwoNCgUEFQIBARIEoyAQHAoNCgUEFQIBAxIEoyAfIArKAwoEBBUCAhIGtSACuCAFGrkDIGBpbmAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGVxdWFsIHRvIG9uZSBvZiB0aGUKc3BlY2lmaWVkIGVudW0gdmFsdWVzLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtYXRjaCBhbnkgb2YgdGhlCnNwZWNpZmllZCB2YWx1ZXMsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBlbnVtIE15RW51bSB7CiAgIE1ZX0VOVU1fVU5TUEVDSUZJRUQgPSAwOwogICBNWV9FTlVNX1ZBTFVFMSA9IDE7CiAgIE1ZX0VOVU1fVkFMVUUyID0gMjsKIH0KCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgdmFsdWVgIG11c3QgYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICBNeUVudW0gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtID0geyBpbjogWzEsIDJdfV07CiB9CiBgYGAKCg0KBQQVAgIEEgS1IAIKCg0KBQQVAgIFEgS1IAsQCg0KBQQVAgIBEgS1IBETCg0KBQQVAgIDEgS1IBYXCg8KBQQVAgIIEga1IBi4IAQKEwoJBBUCAgiICQEAEga1IBm4IAMKEgoKBBUCAgiICQEAARIEtiAEEQoSCgoEFQICCIgJAQADEgS3IAR0CtUDCgQEFQIDEgbKIALNIAUaxAMgYG5vdF9pbmAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIG5vdCBlcXVhbCB0byBhbnkgb2YgdGhlCnNwZWNpZmllZCBlbnVtIHZhbHVlcy4gSWYgdGhlIGZpZWxkIHZhbHVlIG1hdGNoZXMgb25lIG9mIHRoZSBzcGVjaWZpZWQKIHZhbHVlcywgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIGVudW0gTXlFbnVtIHsKICAgTVlfRU5VTV9VTlNQRUNJRklFRCA9IDA7CiAgIE1ZX0VOVU1fVkFMVUUxID0gMTsKICAgTVlfRU5VTV9WQUxVRTIgPSAyOwogfQoKIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGB2YWx1ZWAgbXVzdCBub3QgYmUgZXF1YWwgdG8gYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICBNeUVudW0gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtID0geyBub3RfaW46IFsxLCAyXX1dOwogfQogYGBgCgoNCgUEFQIDBBIEyiACCgoNCgUEFQIDBRIEyiALEAoNCgUEFQIDARIEyiARFwoNCgUEFQIDAxIEyiAaGwoPCgUEFQIDCBIGyiAczSAEChMKCQQVAgMIiAkBABIGyiAdzSADChIKCgQVAgMIiAkBAAESBMsgBBUKEgoKBBUCAwiICQEAAxIEzCAEYwrEAwoEBBUCBBIG3yAC4iAFGrMDIGBleGFtcGxlYCBzcGVjaWZpZXMgdmFsdWVzIHRoYXQgdGhlIGZpZWxkIG1heSBoYXZlLiBUaGVzZSB2YWx1ZXMgU0hPVUxECiBjb25mb3JtIHRvIG90aGVyIHJ1bGVzLiBgZXhhbXBsZWAgdmFsdWVzIHdpbGwgbm90IGltcGFjdCB2YWxpZGF0aW9uCiBidXQgbWF5IGJlIHVzZWQgYXMgaGVscGZ1bCBndWlkYW5jZSBvbiBob3cgdG8gcG9wdWxhdGUgdGhlIGdpdmVuIGZpZWxkLgoKIGBgYHByb3RvCiBlbnVtIE15RW51bSB7CiAgIE1ZX0VOVU1fVU5TUEVDSUZJRUQgPSAwOwogICBNWV9FTlVNX1ZBTFVFMSA9IDE7CiAgIE1ZX0VOVU1fVkFMVUUyID0gMjsKIH0KCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZW51bS5leGFtcGxlID0gMSwKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtLmV4YW1wbGUgPSAyCiB9CiBgYGAKCg0KBQQVAgQEEgTfIAIKCg0KBQQVAgQFEgTfIAsQCg0KBQQVAgQBEgTfIBEYCg0KBQQVAgQDEgTfIBscCg8KBQQVAgQIEgbfIB3iIAQKEwoJBBUCBAiICQEAEgbfIB7iIAMKEgoKBBUCBAiICQEAARIE4CAEFgoSCgoEFQIECIgJAQADEgThIAQWCrgBCgMEFQUSBOcgAhkaqgEgRXh0ZW5zaW9uIGZpZWxkcyB0aGF0IGhhdmUgdGhlIChidWYudmFsaWRhdGUucHJlZGVmaW5lZCkgb3B0aW9uIHNldAogd2lsbCBiZSB0cmVhdGVkIGFzIHByZWRlZmluZWQgZmllbGQgcnVsZXMuCiBTZWUgaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9zY2hlbWFzL3ByZWRlZmluZWQtcnVsZXMvCgoMCgQEFQUAEgTnIA0YCg0KBQQVBQABEgTnIA0RCg0KBQQVBQACEgTnIBUYCk4KAgQWEgbrIAC0IQEaQCBSZXBlYXRlZFJ1bGVzIGRlc2NyaWJlIHRoZSBydWxlcyBhcHBsaWVkIHRvIGByZXBlYXRlZGAgdmFsdWVzLgoKCwoDBBYBEgTrIAgVCuECCgQEFgIAEgb3IAL6IAUa0AIgYG1pbl9pdGVtc2AgcmVxdWlyZXMgdGhhdCB0aGlzIGZpZWxkIG11c3QgY29udGFpbiBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkCiBtaW5pbXVtIG51bWJlciBvZiBpdGVtcy4KCiBOb3RlIHRoYXQgYG1pbl9pdGVtcyA9IDFgIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyBhIGZpZWxkIGFzIGByZXF1aXJlZGAuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlSZXBlYXRlZCB7CiAgIC8vIHZhbHVlIG11c3QgY29udGFpbiBhdCBsZWFzdCAgMiBpdGVtcwogICByZXBlYXRlZCBzdHJpbmcgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5yZXBlYXRlZC5taW5faXRlbXMgPSAyXTsKIH0KIGBgYAoKDQoFBBYCAAQSBPcgAgoKDQoFBBYCAAUSBPcgCxEKDQoFBBYCAAESBPcgEhsKDQoFBBYCAAMSBPcgHh8KDwoFBBYCAAgSBvcgIPogBAoTCgkEFgIACIgJAQASBvcgIfogAwoSCgoEFgIACIgJAQABEgT4IAQcChIKCgQWAgAIiAkBAAMSBPkgBH8KvQMKBAQWAgESBochAoohBRqsAyBgbWF4X2l0ZW1zYCBkZW5vdGVzIHRoYXQgdGhpcyBmaWVsZCBtdXN0IG5vdCBleGNlZWQgYQogY2VydGFpbiBudW1iZXIgb2YgaXRlbXMgYXMgdGhlIHVwcGVyIGxpbWl0LiBJZiB0aGUgZmllbGQgY29udGFpbnMgbW9yZQogaXRlbXMgdGhhbiBzcGVjaWZpZWQsIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQsIHJlcXVpcmluZyB0aGUKIGZpZWxkIHRvIG1haW50YWluIG5vIG1vcmUgdGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpdGVtcy4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVJlcGVhdGVkIHsKICAgLy8gdmFsdWUgbXVzdCBjb250YWluIG5vIG1vcmUgdGhhbiAzIGl0ZW0ocykKICAgcmVwZWF0ZWQgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVwZWF0ZWQubWF4X2l0ZW1zID0gM107CiB9CiBgYGAKCg0KBQQWAgEEEgSHIQIKCg0KBQQWAgEFEgSHIQsRCg0KBQQWAgEBEgSHIRIbCg0KBQQWAgEDEgSHIR4fCg8KBQQWAgEIEgaHISCKIQQKEwoJBBYCAQiICQEAEgaHISGKIQMKEgoKBBYCAQiICQEAARIEiCEEHAoTCgoEFgIBCIgJAQADEgWJIQSDAQreAgoEBBYCAhIGliECmiEFGs0CIGB1bmlxdWVgIGluZGljYXRlcyB0aGF0IGFsbCBlbGVtZW50cyBpbiB0aGlzIGZpZWxkIG11c3QKIGJlIHVuaXF1ZS4gVGhpcyBydWxlIGlzIHN0cmljdGx5IGFwcGxpY2FibGUgdG8gc2NhbGFyIGFuZCBlbnVtCiB0eXBlcywgd2l0aCBtZXNzYWdlIHR5cGVzIG5vdCBiZWluZyBzdXBwb3J0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlSZXBlYXRlZCB7CiAgIC8vIHJlcGVhdGVkIHZhbHVlIG11c3QgY29udGFpbiB1bmlxdWUgaXRlbXMKICAgcmVwZWF0ZWQgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVwZWF0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aGUgdmFsdWVzIGluIHRoZSBmaWVsZCBgdmFsdWVgIG11c3QgZm9sbG93IHRoZSBzcGVjaWZpZWQgcnVsZXMuCiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5tYXAudmFsdWVzID0gewogICAgIHN0cmluZzogewogICAgICAgbWluX2xlbjogNQogICAgICAgbWF4X2xlbjogMjAKICAgICB9CiAgIH1dOwogfQogYGBgCiBOb3RlIHRoYXQgdGhlIGByZXF1aXJlZGAgcnVsZSBkb2VzIG5vdCBhcHBseS4gTWFwIHZhbHVlcyBjYW5ub3QgYmUgdW5zZXQuCgoNCgUEFwIDBBIE9SECCgoNCgUEFwIDBhIE9SELFQoNCgUEFwIDARIE9SEWHAoNCgUEFwIDAxIE9SEfIAq4AQoDBBcFEgT6IQIZGqoBIEV4dGVuc2lvbiBmaWVsZHMgdGhhdCBoYXZlIHRoZSAoYnVmLnZhbGlkYXRlLnByZWRlZmluZWQpIG9wdGlvbiBzZXQKIHdpbGwgYmUgdHJlYXRlZCBhcyBwcmVkZWZpbmVkIGZpZWxkIHJ1bGVzLgogU2VlIGh0dHBzOi8vcHJvdG92YWxpZGF0ZS5jb20vc2NoZW1hcy9wcmVkZWZpbmVkLXJ1bGVzLwoKDAoEBBcFABIE+iENGAoNCgUEFwUAARIE+iENEQoNCgUEFwUAAhIE+iEVGAppCgIEGBIG/iEAmCIBGlsgQW55UnVsZXMgZGVzY3JpYmUgcnVsZXMgYXBwbGllZCBleGNsdXNpdmVseSB0byB0aGUgYGdvb2dsZS5wcm90b2J1Zi5BbnlgIHdlbGwta25vd24gdHlwZS4KCgsKAwQYARIE/iEIEAq8AwoEBBgCABIEiyICGRqtAyBgaW5gIHJlcXVpcmVzIHRoZSBmaWVsZCdzIGB0eXBlX3VybGAgdG8gYmUgZXF1YWwgdG8gb25lIG9mIHRoZQpzcGVjaWZpZWQgdmFsdWVzLiBJZiBpdCBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IKIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15QW55IHsKICAgLy8gIFRoZSBgdmFsdWVgIGZpZWxkIG11c3QgaGF2ZSBhIGB0eXBlX3VybGAgZXF1YWwgdG8gb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICBnb29nbGUucHJvdG9idWYuQW55IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYW55ID0gewogICAgICAgaW46IFsidHlwZS5nb29nbGVhcGlzLmNvbS9NeVR5cGUxIiwgInR5cGUuZ29vZ2xlYXBpcy5jb20vTXlUeXBlMiJdCiAgIH1dOwogfQogYGBgCgoNCgUEGAIABBIEiyICCgoNCgUEGAIABRIEiyILEQoNCgUEGAIAARIEiyISFAoNCgUEGAIAAxIEiyIXGArIAwoEBBgCARIElyICHRq5AyByZXF1aXJlcyB0aGUgZmllbGQncyB0eXBlX3VybCB0byBiZSBub3QgZXF1YWwgdG8gYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiBJZiBpdCBtYXRjaGVzIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlBbnkgewogICAvLyAgVGhlIGB2YWx1ZWAgZmllbGQgbXVzdCBub3QgaGF2ZSBhIGB0eXBlX3VybGAgZXF1YWwgdG8gYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICBnb29nbGUucHJvdG9idWYuQW55IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYW55ID0gewogICAgICAgbm90X2luOiBbInR5cGUuZ29vZ2xlYXBpcy5jb20vRm9yYmlkZGVuVHlwZTEiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9Gb3JiaWRkZW5UeXBlMiJdCiAgIH1dOwogfQogYGBgCgoNCgUEGAIBBBIElyICCgoNCgUEGAIBBRIElyILEQoNCgUEGAIBARIElyISGAoNCgUEGAIBAxIElyIbHAp3CgIEGRIGmyIA6SMBGmkgRHVyYXRpb25SdWxlcyBkZXNjcmliZSB0aGUgcnVsZXMgYXBwbGllZCBleGNsdXNpdmVseSB0byB0aGUgYGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmAgd2VsbC1rbm93biB0eXBlLgoKCwoDBBkBEgSbIggVCvYCCgQEGQIAEgamIgKpIgUa5QIgYGNvbnN0YCBkaWN0YXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRHVyYXRpb25gIHR5cGUgZXhhY3RseS4KIElmIHRoZSBmaWVsZCdzIHZhbHVlIGRldmlhdGVzIGZyb20gdGhlIHNwZWNpZmllZCB2YWx1ZSwgYW4gZXJyb3IgbWVzc2FnZQogd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIC8vIHZhbHVlIG11c3QgZXF1YWwgNXMKICAgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZHVyYXRpb24uY29uc3QgPSAiNXMiXTsKIH0KIGBgYAoKDQoFBBkCAAQSBKYiAgoKDQoFBBkCAAYSBKYiCyMKDQoFBBkCAAESBKYiJCkKDQoFBBkCAAMSBKYiLC0KDwoFBBkCAAgSBqYiLqkiBAoTCgkEGQIACIgJAQASBqYiL6kiAwoSCgoEGQIACIgJAQABEgSnIgQYChIKCgQZAgAIiAkBAAMSBKgiBHIKDgoEBBkIABIGqiICzCIDCg0KBQQZCAABEgSqIggRCpEDCgQEGQIBEga1IgS6IgcagAMgYGx0YCBzdGlwdWxhdGVzIHRoYXQgdGhlIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRHVyYXRpb25gIHR5cGUsCiBleGNsdXNpdmUuIElmIHRoZSBmaWVsZCdzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUR1cmF0aW9uIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gNXMKICAgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZHVyYXRpb24ubHQgPSAiNXMiXTsKIH0KIGBgYAoKDQoFBBkCAQYSBLUiBBwKDQoFBBkCAQESBLUiHR8KDQoFBBkCAQMSBLUiIiMKDwoFBBkCAQgSBrUiJLoiBgoTCgkEGQIBCIgJAQASBrUiJboiBQoSCgoEGQIBCIgJAQABEgS2IgYXChQKCgQZAgEIiAkBAAMSBrciBrkiQAqgAwoEBBkCAhIGxiIEyyIHGo8DIGBsdGVgIGluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSBvZiB0aGUgYGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmAgdHlwZSwgaW5jbHVzaXZlLiBJZiB0aGUgZmllbGQncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwKIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEwcwogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5kdXJhdGlvbi5sdGUgPSAiMTBzIl07CiB9CiBgYGAKCg0KBQQZAgIGEgTGIgQcCg0KBQQZAgIBEgTGIh0gCg0KBQQZAgIDEgTGIiMkCg8KBQQZAgIIEgbGIiXLIgYKEwoJBBkCAgiICQEAEgbGIibLIgUKEgoKBBkCAgiICQEAARIExyIGGAoUCgoEGQICCIgJAQADEgbIIgbKIk0KDgoEBBkIARIGzSICsyMDCg0KBQQZCAEBEgTNIggUCqgHCgQEGQIDEgbgIgT/IgYalwcgYGd0YCByZXF1aXJlcyB0aGUgZHVyYXRpb24gZmllbGQgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQKIHZhbHVlIChleGNsdXNpdmUpLiBJZiB0aGUgdmFsdWUgb2YgYGd0YCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15RHVyYXRpb24gewogICAvLyBkdXJhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA1cyBbZHVyYXRpb24uZ3RdCiAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uLmd0ID0geyBzZWNvbmRzOiA1IH1dOwoKICAgLy8gZHVyYXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gNXMgYW5kIGxlc3MgdGhhbiAxMHMgW2R1cmF0aW9uLmd0X2x0XQogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gYW5vdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uID0geyBndDogeyBzZWNvbmRzOiA1IH0sIGx0OiB7IHNlY29uZHM6IDEwIH0gfV07CgogICAvLyBkdXJhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxMHMgb3IgbGVzcyB0aGFuIDVzIFtkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmVdCiAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiBvdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uID0geyBndDogeyBzZWNvbmRzOiAxMCB9LCBsdDogeyBzZWNvbmRzOiA1IH0gfV07CiB9CiBgYGAKCg0KBQQZAgMGEgTgIgQcCg0KBQQZAgMBEgTgIh0fCg0KBQQZAgMDEgTgIiIjCg8KBQQZAgMIEgbg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BQQZBQACEgToIxUYCnUKAgQaEgbsIwC5JAEaZyBGaWVsZE1hc2tSdWxlcyBkZXNjcmliZSBydWxlcyBhcHBsaWVkIGV4Y2x1c2l2ZWx5IHRvIHRoZSBgZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza2Agd2VsbC1rbm93biB0eXBlLgoKCwoDBBoBEgTsIwgWCpQDCgQEGgIAEgb5IwL8IwUagwMgYGNvbnN0YCBkaWN0YXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrYCB0eXBlIGV4YWN0bHkuCiBJZiB0aGUgZmllbGQncyB2YWx1ZSBkZXZpYXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWUsIGFuIGVycm9yIG1lc3NhZ2UKIHdpbGwgYmUgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15RmllbGRNYXNrIHsKICAgLy8gdmFsdWUgbXVzdCBlcXVhbCBbImEiXQogICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZmllbGRfbWFzay5jb25zdCA9IHsKICAgICAgIHBhdGhzOiBbImEiXQogICB9XTsKIH0KIGBgYAoKDQoFBBoCAAQSBPkjAgoKDQoFBBoCAAYSBPkjCyQKDQoFBBoCAAESBPkjJSoKDQoFBBoCAAMSBPkjLS4KDwoFBBoCAAgSBvkjL/wjBAoTCgkEGgIACIgJAQASBvkjMPwjAwoSCgoEGgIACIgJAQABEgT6IwQaChMKCgQaAgAIiAkBAAMSBfsjBIoBCvgDCgQEGgIBEgaMJAKPJAUa5wMgYGluYCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gb25seSBjb250YWluIHBhdGhzIG1hdGNoaW5nIHNwZWNpZmllZAogdmFsdWVzIG9yIHRoZWlyIHN1YnBhdGhzLgogSWYgYW55IG9mIHRoZSBmaWVsZCB2YWx1ZSdzIHBhdGhzIGRvZXNuJ3QgbWF0Y2ggdGhlIHJ1bGUsCiBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KIFNlZTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcmVmZXJlbmNlL3Byb3RvYnVmL2dvb2dsZS5wcm90b2J1Zi8jZmllbGQtbWFzawoKIGBgYHByb3RvCiBtZXNzYWdlIE15RmllbGRNYXNrIHsKICAgLy8gIFRoZSBgdmFsdWVgIEZpZWxkTWFzayBtdXN0IG9ubHkgY29udGFpbiBwYXRocyBsaXN0ZWQgaW4gYGluYC4KICAgZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmZpZWxkX21hc2sgPSB7CiAgICAgICBpbjogWyJhIiwgImIiLCAiYy5hIl0KICAgfV07CiB9CiBgYGAKCg0KBQQaAgEEEgSMJAIKCg0KBQQaAgEFEgSMJAsRCg0KBQQaAgEBEgSMJBIUCg0KBQQaAgEDEgSMJBcYCg8KBQQaAgEIEgaMJBmPJAQKEwoJBBoCAQiICQEAEgaMJBqPJAMKEgoKBBoCAQiICQEAARIEjSQEFwoTCgoEGgIBCIgJAQADEgWOJATFAQqNBAoEBBoCAhIGnyQCoiQFGvwDIGBub3RfaW5gIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBub3QgY29udGFpbiBwYXRocyBtYXRjaGluZyBzcGVjaWZpZWQKIHZhbHVlcyBvciB0aGVpciBzdWJwYXRocy4KIElmIGFueSBvZiB0aGUgZmllbGQgdmFsdWUncyBwYXRocyBtYXRjaGVzIHRoZSBydWxlLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCiBTZWU6IGh0dHBzOi8vcHJvdG9idWYuZGV2L3JlZmVyZW5jZS9wcm90b2J1Zi9nb29nbGUucHJvdG9idWYvI2ZpZWxkLW1hc2sKCiBgYGBwcm90bwogbWVzc2FnZSBNeUZpZWxkTWFzayB7CiAgIC8vICBUaGUgYHZhbHVlYCBGaWVsZE1hc2sgc2hhbGwgbm90IGNvbnRhaW4gcGF0aHMgbGlzdGVkIGluIGBub3RfaW5gLgogICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZmllbGRfbWFzayA9IHsK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aXJlcyB0aGUgZHVyYXRpb24gZmllbGQgdmFsdWUgdG8gYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgKGZpZWxkIDwgdmFsdWUpLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUR1cmF0aW9uIHsKICAgLy8gZHVyYXRpb24gbXVzdCBiZSBsZXNzIHRoYW4gJ1AzRCcgW2R1cmF0aW9uLmx0XQogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5kdXJhdGlvbi5sdCA9IHsgc2Vjb25kczogMjU5MjAwIH1dOwogfQogYGBgCgoNCgUEGwIBBhIE0iQEHQoNCgUEGwIBARIE0iQeIAoNCgUEGwIBAxIE0iQjJAoPCgUEGwIBCBIG0iQl1yQGChMKCQQbAgEIiAkBABIG0iQm1yQFChIKCgQbAgEIiAkBAAESBNMkBhgKFAoKBBsCAQiICQEAAxIG1CQG1iRACrUDCgQEGwICEgbhJATmJAcapAMgcmVxdWlyZXMgdGhlIHRpbWVzdGFtcCBmaWVsZCB2YWx1ZSB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAoZmllbGQgPD0gdmFsdWUpLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVRpbWVzdGFtcCB7CiAgIC8vIHRpbWVzdGFtcCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAnMjAyMy0wNS0xNFQwMDowMDowMFonIFt0aW1lc3RhbXAubHRlXQogICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmx0ZSA9IHsgc2Vjb25kczogMTY3ODg2NzIwMCB9XTsKIH0KIGBgYAoKDQoFBBsCAgYSBOEkBB0KDQoFBBsCAgESBOEkHiEKDQoFBBsCAgMSBOEkJCUKDwoFBBsCAggSBuEkJuYkBgoTCgkEGwICCIgJAQASBuEkJ+YkBQoSCgoEGwICCIgJAQABEgTiJAYZChQKCgQbAgIIiAkBAAMSBuMkBuUkTQrcAgoEBBsCAxIG8CQE8yQHGssCIGBsdF9ub3dgIHNwZWNpZmllcyB0aGF0IHRoaXMgZmllbGQsIG9mIHRoZSBgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcGAgdHlwZSwgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgdGltZS4gYGx0X25vd2AgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBgd2l0aGluYCBydWxlLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15VGltZXN0YW1wIHsKICAvLyB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cKICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmx0X25vdyA9IHRydWVdOwogfQogYGBgCgoNCgUEGwIDBRIE8CQECAoNCgUEGwIDARIE8CQJDwoNCgUEGwIDAxIE8CQSEwoPCgUEGwIDCBIG8CQU8yQGChMKCQQbAgMIiAkBABIG8CQV8yQFChIKCgQbAgMIiAkBAAESBPEkBhwKEgoKBBsCAwiICQEAAxIE8iQGVQoOCgQEGwgBEgb1JALoJQMKDQoFBBsIAQESBPUkCBQKwwgKBAQbAgQSBoglBKclBhqyCCBgZ3RgIHJlcXVpcmVzIHRoZSB0aW1lc3RhbXAgZmllbGQgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQKIHZhbHVlIChleGNsdXNpdmUpLiBJZiB0aGUgdmFsdWUgb2YgYGd0YCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15VGltZXN0YW1wIHsKICAgLy8gdGltZXN0YW1wIG11c3QgYmUgZ3JlYXRlciB0aGFuICcyMDIzLTAxLTAxVDAwOjAwOjAwWicgW3RpbWVzdGFtcC5ndF0KICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC5ndCA9IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9XTsKCiAgIC8vIHRpbWVzdGFtcCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAnMjAyMy0wMS0wMVQwMDowMDowMFonIGFuZCBsZXNzIHRoYW4gJzIwMjMtMDEtMDJUMDA6MDA6MDBaJyBbdGltZXN0YW1wLmd0X2x0XQogICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGFub3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAgPSB7IGd0OiB7IHNlY29uZHM6IDE2NzI0NDQ4MDAgfSwgbHQ6IHsgc2Vjb25kczogMTY3MjUzMTIwMCB9IH1dOwoKICAgLy8gdGltZXN0YW1wIG11c3QgYmUgZ3JlYXRlciB0aGFuICcyMDIzLTAxLTAyVDAwOjAwOjAwWicgb3IgbGVzcyB0aGFuICcyMDIzLTAxLTAxVDAwOjAwOjAwWicgW3RpbWVzdGFtcC5ndF9sdF9leGNsdXNpdmVdCiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgb3RoZXJfdmFsdWUgPSAzIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAgPSB7IGd0OiB7IHNlY29uZHM6IDE2NzI1MzEyMDAgfSwgbHQ6IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9IH1dOwogfQogYGBgCgoNCgUEGwIEBhIEiCUEHQoNCgUEGwIEARIEiCUeIAoNCgUEGwIEAxIEiCUjJAoPCgUE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iAkBBBIG1CUG2SUHChIKCgQbAgUIiAkBBAESBNUlCCkKFAoKBBsCBQiICQEEAxIG1iUI2CV5CuMCCgQEGwIGEgbkJQTnJQca0gIgYGd0X25vd2Agc3BlY2lmaWVzIHRoYXQgdGhpcyBmaWVsZCwgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wYCB0eXBlLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB0aW1lLiBgZ3Rfbm93YCBjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlIGB3aXRoaW5gIHJ1bGUuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlUaW1lc3RhbXAgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cKICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmd0X25vdyA9IHRydWVdOwogfQogYGBgCgoNCgUEGwIGBRIE5CUECAoNCgUEGwIGARIE5CUJDwoNCgUEGwIGAxIE5CUSEwoPCgUEGwIGCBIG5CUU5yUGChMKCQQbAgYIiAkBABIG5CUV5yUFChIKCgQbAgYIiAkBAAESBOUlBhwKEgoKBBsCBgiICQEAAxIE5iUGWAqhAwoEBBsCBxIG8iUC9SUFGpADIGB3aXRoaW5gIHNwZWNpZmllcyB0aGF0IHRoaXMgZmllbGQsIG9mIHRoZSBgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcGAgdHlwZSwgbXVzdCBiZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCB0aW1lLiBJZiB0aGUgZmllbGQgdmFsdWUgaXNuJ3Qgd2l0aGluIHRoZSBkdXJhdGlvbiwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlUaW1lc3RhbXAgewogICAvLyB2YWx1ZSBtdXN0IGJlIHdpdGhpbiAxIGhvdXIgb2Ygbm93CiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgY3JlYXRlZF9hdCA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC53aXRoaW4gPSB7c2Vjb25kczogMzYwMH1dOwogfQogYGBgCgoNCgUEGwIHBBIE8iUCCgoNCgUEGwIHBhIE8iULIwoNCgUEGwIHARIE8iUkKgoNCgUEGwIHAxIE8iUtLgoPCgUEGwIHCBIG8iUv9SUEChMKCQQbAgcIiAkBABIG8iUw9SUDChIKCgQbAgcIiAkBAAESBPMlBBoKEwoKBBsCBwiICQEAAxIF9CUEgwEKzwMKBAQbAggSBoMmAoYmBRq+AyBgZXhhbXBsZWAgc3BlY2lmaWVzIHZhbHVlcyB0aGF0IHRoZSBmaWVsZCBtYXkgaGF2ZS4gVGhlc2UgdmFsdWVzIFNIT1VMRAogY29uZm9ybSB0byBvdGhlciBydWxlcy4gYGV4YW1wbGVgIHZhbHVlcyB3aWxsIG5vdCBpbXBhY3QgdmFsaWRhdGlvbgogYnV0IG1heSBiZSB1c2VkIGFzIGhlbHBmdWwgZ3VpZGFuY2Ugb24gaG93IHRvIHBvcHVsYXRlIHRoZSBnaXZlbiBmaWVsZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVRpbWVzdGFtcCB7CiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgdmFsdWUgPSAxIFsKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAuZXhhbXBsZSA9IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9LAogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC5leGFtcGxlID0geyBzZWNvbmRzOiAxNjcyNTMxMjAwIH0sCiAgIF07CiB9CiBgYGAKCg0KBQQbAggEEgSDJgIKCg0KBQQbAggGEgSDJgskCg0KBQQbAggBEgSDJiUsCg0KBQQbAggDEgSDJi8xCg8KBQQbAggIEgaDJjKGJgQKEwoJBBsCCAiICQEAEgaDJjOGJgMKEgoKBBsCCAiICQEAARIEhCYEGwoSCgoEGwIICIgJAQADEgSFJgQWCrgBCgMEGwUSBIsmAhkaqgEgRXh0ZW5zaW9uIGZpZWxkcyB0aGF0IGhhdmUgdGhlIChidWYudmFsaWRhdGUucHJlZGVmaW5lZCkgb3B0aW9uIHNldAogd2lsbCBiZSB0cmVhdGVkIGFzIHByZWRlZmluZWQgZmllbGQgcnVsZXMuCiBTZWUgaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9zY2hlbWFzL3ByZWRlZmluZWQtcnVsZXMvCgoMCgQEGwUAEgSLJg0YCg0KBQQbBQABEgSLJg0RCg0KBQQbBQACEgSLJhUYCpICCgIEHBIGkSYAlCYBGoMCIGBWaW9sYXRpb25zYCBpcyBhIGNvbGxlY3Rpb24gb2YgYFZpb2xhdGlvbmAgbWVzc2FnZXMuIFRoaXMgbWVzc2FnZSB0eXBlIGlzIHJldHVybmVkIGJ5CiBQcm90b3ZhbGlkYXRlIHdoZW4gYSBwcm90byBtZXNzYWdlIGZhaWxzIHRvIG1lZXQgdGhlIHJlcXVpcmVtZW50cyBzZXQgYnkgdGhlIGBSdWxlYCB2YWxpZGF0aW9uIHJ1bGVzLgogRWFjaCBpbmRpdmlkdWFsIHZpb2xhdGlvbiBpcyByZXByZXNlbnRlZCBieSBhIGBWaW9sYXRpb25gIG1lc3NhZ2UuCgoLCgMEHAESBJEmCBIKhQEKBAQcAgASBJMmAiQadyBgdmlvbGF0aW9uc2AgaXMgYSByZXBlYXRlZCBmaWVsZCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgYFZpb2xhdGlvbmAgbWVzc2FnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgdmlvbGF0aW9ucyBkZXRlY3RlZC4KCg0KBQQcAgAEEgSTJgIKCg0KBQQcAgAGEgSTJgsUCg0KBQQcAgABEgSTJhUfCg0KBQQcAgADEgSTJiIjCtgHCgIEHRIGwSYAgicBGskHIGBWaW9sYXRpb25gIHJlcHJlc2VudHMgYSBzaW5nbGUgaW5zdGFuY2Ugd2hlcmUgYSB2YWxpZGF0aW9uIHJ1bGUsIGV4cHJlc3NlZAogYXMgYSBgUnVsZWAsIHdhcyBub3QgbWV0LiBJdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmllbGQgdGhhdAogY2F1c2VkIHRoZSB2aW9sYXRpb24sIHRoZSBzcGVjaWZpYyBydWxlIHRoYXQgd2Fzbid0IGZ1bGZpbGxlZCwgYW5kIGEKIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCgogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKCiBgYGBwcm90bwogbWVzc2FnZSBVc2VyIHsKICAgICBpbnQzMiBhZ2UgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5jZWwgPSB7CiAgICAgICAgIGlkOiAidXNlci5hZ2UiLAogICAgICAgICBleHByZXNzaW9uOiAidGhpcyA8IDE4ID8gJ1VzZXIgbXVzdCBiZSBhdCBsZWFzdCAxOCB5ZWFycyBvbGQnIDogJyciLAogICAgIH1dOwogfQogYGBgCgogSXQgY291bGQgcHJvZHVjZSB0aGUgZm9sbG93aW5nIHZpb2xhdGlvbjoKCiBgYGBqc29uCiB7CiAgICJydWxlSWQiOiAidXNlci5hZ2UiLAogICAibWVzc2FnZSI6ICJVc2VyIG11c3QgYmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkIiwKICAgImZpZWxkIjogewogICAgICJlbGVtZW50cyI6IFsKICAgICAgIHsKICAgICAgICAgImZpZWxkTnVtYmVyIjogMSwKICAgICAgICAgImZpZWxkTmFtZSI6ICJhZ2UiLAogICAgICAgICAiZmllbGRUeXBlIjogIlRZUEVfSU5UMzIiCiAgICAgICB9CiAgICAgXQogICB9LAogICAicnVsZSI6IHsKICAgICAiZWxlbWVudHMiOiBbCiAgICAgICB7CiAgICAgICAgICJmaWVsZE51bWJlciI6IDIzLAogICAgICAgICAiZmllbGROYW1lIjogImNlbCIsCiAgICAgICAgICJmaWVsZFR5cGUiOiAiVFlQRV9NRVNTQUdFIiwKICAgICAgICAgImluZGV4IjogIjAiCiAgICAgICB9CiAgICAgXQogICB9CiB9CiBgYGAKCgsKAwQdARIEwSYIEQqTBAoEBB0CABIE1SYCHxqEBCBgZmllbGRgIGlzIGEgbWFjaGluZS1yZWFkYWJsZSBwYXRoIHRvIHRoZSBmaWVsZCB0aGF0IGZhaWxlZCB2YWxpZGF0aW9uLgogVGhpcyBjb3VsZCBiZSBhIG5lc3RlZCBmaWVsZCwgaW4gd2hpY2ggY2FzZSB0aGUgcGF0aCB3aWxsIGluY2x1ZGUgYWxsIHRoZSBwYXJlbnQgZmllbGRzIGxlYWRpbmcgdG8gdGhlIGFjdHVhbCBmaWVsZCB0aGF0IGNhdXNlZCB0aGUgdmlvbGF0aW9uLgoKIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6CgogYGBgcHJvdG8KIG1lc3NhZ2UgTWVzc2FnZSB7CiAgIGJvb2wgYSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZV07CiB9CiBgYGAKCiBJdCBjb3VsZCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgdmlvbGF0aW9uOgoKIGBgYHRleHRwcm90bwogdmlvbGF0aW9uIHsKICAgZmllbGQgeyBlbGVtZW50IHsgZmllbGRfbnVtYmVyOiAxLCBmaWVsZF9uYW1lOiAiYSIsIGZpZWxkX3R5cGU6IDggfSB9CiAgIC4uLgogfQogYGBgCgoNCgUEHQIABBIE1SYCCgoNCgUEHQIABhIE1SYLFAoNCgUEHQIAARIE1SYVGgoNCgUEHQIAAxIE1SYdHgquBgoEBB0CARIE8yYCHhqfBiBgcnVsZWAgaXMgYSBtYWNoaW5lLXJlYWRhYmxlIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIHNwZWNpZmljIHJ1bGUgdGhhdCBmYWlsZWQgdmFsaWRhdGlvbi4KIFRoaXMgd2lsbCBiZSBhIG5lc3RlZCBmaWVsZCBzdGFydGluZyBmcm9tIHRoZSBGaWVsZFJ1bGVzIG9mIHRoZSBmaWVsZCB0aGF0IGZhaWxlZCB2YWxpZGF0aW9uLgogRm9yIGN1c3RvbSBydWxlcywgdGhpcyB3aWxsIHByb3ZpZGUgdGhlIHBhdGggb2YgdGhlIHJ1bGUsIGUuZy4gYGNlbFswXWAuCgogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKCiBgYGBwcm90bwogbWVzc2FnZSBNZXNzYWdlIHsKICAgYm9vbCBhID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVxdWlyZWQgPSB0cnVlXTsKICAgYm9vbCBiID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuY2VsID0gewogICAgIGlkOiAiY3VzdG9tX3J1bGUiLAogICAgIGV4cHJlc3Npb246ICIhdGhpcyA/ICdiIG11c3QgYmUgdHJ1ZSc6ICcnIgogICB9XQogfQogYGBgCgogSXQgY291bGQgcHJvZHVjZSB0aGUgZm9sbG93aW5nIHZpb2xhdGlvbnM6CgogYGBgdGV4dHByb3RvCiB2aW9sYXRpb24gewogICBydWxlIHsgZWxlbWVudCB7IGZpZWxkX251bWJlcjogMjUsIGZpZWxkX25hbWU6ICJyZXF1aXJlZCIsIGZpZWxkX3R5cGU6IDggfSB9CiAgIC4uLgogfQogdmlvbGF0aW9uIHsKICAgcnVsZSB7IGVsZW1lbnQgeyBmaWVsZF9udW1iZXI6IDIzLCBmaWVsZF9uYW1lOiAiY2VsIiwgZmllbGRfdHlwZTogMTEsIGluZGV4OiAwIH0gfQogICAuLi4KIH0KIGBgYAoKDQoFBB0CAQQSBPMmAgoKDQoFBB0CAQYSBPMmCxQKDQoFBB0CAQESBPMmFRkKDQoFBB0CAQMSBPMmHB0KzAEKBAQdAgISBPcmAh4avQEgYHJ1bGVfaWRgIGlzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYFJ1bGVgIHRoYXQgd2FzIG5vdCBmdWxmaWxsZWQuCiBUaGlzIGlzIHRoZSBzYW1lIGBpZGAgdGhhdCB3YXMgc3BlY2lmaWVkIGluIHRoZSBgUnVsZWAgbWVzc2FnZSwgYWxsb3dpbmcgZWFzeSB0cmFjaW5nIG9mIHdoaWNoIHJ1bGUgd2FzIHZpb2xhdGVkLgoKDQoFBB0CAgQSBPcmAgoKDQoFBB0CAgUSBPcmCxEKDQoFBB0CAgESBPcmEhkKDQoFBB0CAgMSBPcmHB0K9AEKBAQdAgMSBPsmAh4a5QEgYG1lc3NhZ2VgIGlzIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZSB0aGF0IGRlc2NyaWJlcyB0aGUgbmF0dXJlIG9mIHRoZSB2aW9sYXRpb24uCiBUaGlzIGNhbiBiZSB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlIGZyb20gdGhlIHZpb2xhdGVkIGBSdWxlYCwgb3IgaXQgY2FuIGJlIGEgY3VzdG9tIG1lc3NhZ2UgdGhhdCBnaXZlcyBtb3JlIGNvbnRleHQgYWJvdXQgdGhlIHZpb2xhdGlvbi4KCg0KBQQdAgMEEgT7JgIKCg0KBQQdAgMFEgT7JgsRCg0KBQQdAgMBEgT7JhIZCg0KBQQdAgMDEgT7JhwdCmcKBAQdAgQSBP4mAhwaWSBgZm9yX2tleWAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZpb2xhdGlvbiB3YXMgY2F1c2VkIGJ5IGEgbWFwIGtleSwgcmF0aGVyIHRoYW4gYSB2YWx1ZS4KCg0KBQQdAgQEEgT+JgIKCg0KBQQdAgQFEgT+JgsPCg0KBQQdAgQBEgT+JhAXCg0KBQQdAgQDEgT+JhobCgsKAwQdCRIEgCcCDQoMCgQEHQkAEgSAJwsMCg0KBQQdCQABEgSAJwsMCg0KBQQdCQACEgSAJwsMCgsKAwQdChIEgScCGAoMCgQEHQoAEgSBJwsXCo4CCgIEHhIGiCcAiycBGv8BIGBGaWVsZFBhdGhgIHByb3ZpZGVzIGEgcGF0aCB0byBhIG5lc3RlZCBwcm90b2J1ZiBmaWVsZC4KCiBUaGlzIG1lc3NhZ2UgcHJvdmlkZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHJlbmRlciBhIGRvdHRlZCBmaWVsZCBwYXRoIGV2ZW4gd2l0aG91dCBwcm90b2J1ZiBkZXNjcmlwdG9ycy4KIEl0IGFsc28gcHJvdmlkZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHJlc29sdmUgYSBuZXN0ZWQgZmllbGQgdGhyb3VnaCB1bmtub3duIHdpcmUgZGF0YS4KCgsKAwQeARIEiCcIEQpsCgQEHgIAEgSKJwIpGl4gYGVsZW1lbnRzYCBjb250YWlucyBlYWNoIGVsZW1lbnQgb2YgdGhlIHBhdGgsIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgYW5kIHJlY3Vyc2luZyBkb3dud2FyZC4KCg0KBQQeAgAEEgSKJwIKCg0KBQQeAgAGEgSKJwsbCg0KBQQeAgABEgSKJxwkCg0KBQQeAgADEgSKJycoCqsDCgIEHxIGkicAwCcBGpwDIGBGaWVsZFBhdGhFbGVtZW50YCBwcm92aWRlcyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gbmVzdCB0aHJvdWdoIGEgc2luZ2xlIHByb3RvYnVmIGZpZWxkLgoKIElmIHRoZSBzZWxlY3RlZCBmaWVsZCBpcyBhIG1hcCBvciByZXBlYXRlZCBmaWVsZCwgdGhlIGBzdWJzY3JpcHRgIHZhbHVlIHNlbGVjdHMgYSBzcGVjaWZpYyBlbGVtZW50IGZyb20gaXQuCiBBIHBhdGggdGhhdCByZWZlcnMgdG8gYSB2YWx1ZSBuZXN0ZWQgdW5kZXIgYSBtYXAga2V5IG9yIHJlcGVhdGVkIGZpZWxkIGluZGV4IHdpbGwgaGF2ZSBhIGBzdWJzY3JpcHRgIHZhbHVlLgogVGhlIGBmaWVsZF90eXBlYCBmaWVsZCBhbGxvd3MgdW5hbWJpZ3VvdXMgcmVzb2x1dGlvbiBvZiBhIGZpZWxkIGV2ZW4gaWYgZGVzY3JpcHRvcnMgYXJlIG5vdCBhdmFpbGFibGUuCgoLCgMEHwESBJInCBgKTwoEBB8CABIElCcCIhpBIGBmaWVsZF9udW1iZXJgIGlzIHRoZSBmaWVsZCBudW1iZXIgdGhpcyBwYXRoIGVsZW1lbnQgcmVmZXJzIHRvLgoKDQoFBB8CAAQSBJQnAgoKDQoFBB8CAAUSBJQnCxAKDQoFBB8CAAESBJQnER0KDQoFBB8CAAMSBJQnICEKqgEKBAQfAgESBJgnAiEamwEgYGZpZWxkX25hbWVgIGNvbnRhaW5zIHRoZSBmaWVsZCBuYW1lIHRoaXMgcGF0aCBlbGVtZW50IHJlZmVycyB0by4KIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhIGh1bWFuLXJlYWRhYmxlIHBhdGggZXZlbiBpZiB0aGUgZmllbGQgbnVtYmVyIGlzIHVua25vd24uCgoNCgUEHwIBBBIEmCcCCgoNCgUEHwIBBRIEmCcLEQoNCgUEHwIBARIEmCcSHAoNCgUEHwIBAxIEmCcfIArABAoEBB8CAhIEpCcCRBqxBCBgZmllbGRfdHlwZWAgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuIFdoZW4gdXNpbmcgcmVmbGVjdGlvbiwgdGhpcyB2YWx1ZSBpcyBub3QgbmVlZGVkLgoKIFRoaXMgdmFsdWUgaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB0cmF2ZXJzZSB1bmtub3duIGZpZWxkcyB0aHJvdWdoIHdpcmUgZGF0YS4KIFdoZW4gdHJhdmVyc2luZyB3aXJlIGRhdGEsIGJlIG1pbmRmdWwgb2YgYm90aCBwYWNrZWRbMV0gYW5kIGRlbGltaXRlZFsyXSBlbmNvZGluZyBzY2hlbWVzLgoKIFsxXTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2VuY29kaW5nLyNwYWNrZWQKIFsyXTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2VuY29kaW5nLyNncm91cHMKCiBOLkIuOiBBbHRob3VnaCBncm91cHMgYXJlIGRlcHJlY2F0ZWQsIHRoZSBjb3JyZXNwb25kaW5nIGRlbGltaXRlZCBlbmNvZGluZyBzY2hlbWUgaXMgbm90LCBhbmQKIGNhbiBiZSBleHBsaWNpdGx5IHVzZWQgaW4gUHJvdG9jb2wgQnVmZmVycyAyMDIzIEVkaXRpb24uCgoNCgUEHwICBBIEpCcCCgoNCgUEHwICBhIEpCcLNAoNCgUEHwICARIEpCc1PwoNCgUEHwICAxIEpCdCQwrkAQoEBB8CAxIEqScCQhrVASBga2V5X3R5cGVgIHNwZWNpZmllcyB0aGUgbWFwIGtleSB0eXBlIG9mIHRoaXMgZmllbGQuIFRoaXMgdmFsdWUgaXMgdXNlZnVsIHdoZW4gdHJhdmVyc2luZwogdW5rbm93biBmaWVsZHMgdGhyb3VnaCB3aXJlIGRhdGE6IHNwZWNpZmljYWxseSwgaXQgYWxsb3dzIGhhbmRsaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCiBkaWZmZXJlbnQgaW50ZWdlciBlbmNvZGluZ3MuCgoNCgUEHwIDBBIEqScCCgoNCgUEHwIDBhIEqScLNAoNCgUEHwIDARIEqSc1PQoNCgUEHwIDAxIEqSdAQQqdAQoEBB8CBBIErScCRBqOASBgdmFsdWVfdHlwZWAgc3BlY2lmaWVzIG1hcCB2YWx1ZSB0eXBlIG9mIHRoaXMgZmllbGQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGRpc3BsYXkgYQogdmFsdWUgaW5zaWRlIHVua25vd24gZmllbGRzIHRocm91Z2ggd2lyZSBkYXRhLgoKDQoFBB8CBAQSBK0nAgoKDQoFBB8CBAYSBK0nCzQKDQoFBB8CBAESBK0nNT8KDQoFBB8CBAMSBK0nQkMKfAoEBB8IABIGsCcCvycDGmwgYHN1YnNjcmlwdGAgY29udGFpbnMgYSByZXBlYXRlZCBpbmRleCBvciBtYXAga2V5LCBpZiB0aGlzIHBhdGggZWxlbWVudCBuZXN0cyBpbnRvIGEgcmVwZWF0ZWQgb3IgbWFwIGZpZWxkLgoKDQoFBB8IAAESBLAnCBEKSAoEBB8CBRIEsicEFRo6IGBpbmRleGAgc3BlY2lmaWVzIGEgMC1iYXNlZCBpbmRleCBpbnRvIGEgcmVwZWF0ZWQgZmllbGQuCgoNCgUEHwIFBRIEsicECgoNCgUEHwIFARIEsicLEAoNCgUEHwIFAxIEsicTFAo8CgQEHwIGEgS1JwQWGi4gYGJvb2xfa2V5YCBzcGVjaWZpZXMgYSBtYXAga2V5IG9mIHR5cGUgYm9vbC4KCg0KBQQfAgYFEgS1JwQICg0KBQQfAgYBEgS1JwkRCg0KBQQfAgYDEgS1JxQVCmkKBAQfAgcSBLgnBBYaWyBgaW50X2tleWAgc3BlY2lmaWVzIGEgbWFwIGtleSBvZiB0eXBlIGludDMyLCBpbnQ2NCwgc2ludDMyLCBzaW50NjQsIHNmaXhlZDMyIG9yIHNmaXhlZDY0LgoKDQoFBB8CBwUSBLgnBAkKDQoFBB8CBwESBLgnChEKDQoFBB8CBwMSBLgnFBUKWgoEBB8CCBIEuycEGBpMIGB1aW50X2tleWAgc3BlY2lmaWVzIGEgbWFwIGtleSBvZiB0eXBlIHVpbnQzMiwgdWludDY0LCBmaXhlZDMyIG9yIGZpeGVkNjQuCgoNCgUEHwIIBRIEuycECgoNCgUEHwIIARIEuycLEwoNCgUEHwIIAxIEuycWFwpACgQEHwIJEgS+JwQbGjIgYHN0cmluZ19rZXlgIHNwZWNpZmllcyBhIG1hcCBrZXkgb2YgdHlwZSBzdHJpbmcuCgoNCgUEHwIJBRIEvicECgoNCgUEHwIJARIEvicLFQoNCgUEHwIJAxIEvicYGgr2IgoVY29tbW9uL3YxL3R5cGVzLnByb3RvEhdzZXJ2aWNlYnJpZGdlLmNvbW1vbi52MRobYnVmL3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvIqABCg5Xb3JrZXJJZGVudGl0eRIqCgxzZXJ2aWNlX25hbWUYASABKAlCB7pIBHICEAFSC3NlcnZpY2VOYW1lEigKC2luc3RhbmNlX2lkGAIgASgJQge6SARyAhABUgppbnN0YW5jZUlkEhoKCGVuZHBvaW50GAMgASgJUghlbmRwb2ludBIcCgl0cmFuc3BvcnQYBCABKAlSCXRyYW5zcG9ydCJuCg9SZXNvdXJjZU1ldHJpY3MSJAoLY3B1X3BlcmNlbnQYASABKAJIAFIKY3B1UGVyY2VudIgBARIaCgZyYW1fbWIYAiABKAVIAVIFcmFtTWKIAQFCDgoMX2NwdV9wZXJjZW50QgkKB19yYW1fbWIi0gEKE0Z1bmN0aW9uRGVjbGFyYXRpb24SIAoHZm5fbmFtZRgBIAEoCUIHukgEcgIQAVIGZm5OYW1lEhYKBndlaWdodBgCIAEoBVIGd2VpZ2h0EioKEWlucHV0X3NjaGVtYV9qc29uGAMgASgJUg9pbnB1dFNjaGVtYUpzb24SLAoSb3V0cHV0X3NjaGVtYV9qc29uGAQgASgJUhBvdXRwdXRTY2hlbWFKc29uEicKD2FsbG93ZWRfY2FsbGVycxgFIAMoCVIOYWxsb3dlZENhbGxlcnMi6wEKGENvbnN1bWVyR3JvdXBEZWNsYXJhdGlvbhIbCgRuYW1lGAEgASgJQge6SARyAhABUgRuYW1lEiEKB3BhdHRlcm4YAiABKAlCB7pIBHICEAFSB3BhdHRlcm4SEgoEbW9kZRgDIAEoCVIEbW9kZRIqChFyZXRyeV9wb2xpY3lfanNvbhgEIAEoCVIPcmV0cnlQb2xpY3lKc29uEhYKBmFjdGl2ZRgFIAEoCFIGYWN0aXZlEh8KC2ZpbHRlcl9leHByGAYgASgJUgpmaWx0ZXJFeHByEhYKBndlaWdodBgHIAEoBVIGd2VpZ2h0It4BChRIdHRwUm91dGVEZWNsYXJhdGlvbhIWCgZtZXRob2QYASABKAlSBm1ldGhvZBIjCg1yb3V0ZV9wYXR0ZXJuGAIgASgJUgxyb3V0ZVBhdHRlcm4SLgoTcmVxdWVzdF9zY2hlbWFfanNvbhgDIAEoCVIRcmVxdWVzdFNjaGVtYUpzb24SMAoUcmVzcG9uc2Vfc2NoZW1hX2pzb24YBCABKAlSEnJlc3BvbnNlU2NoZW1hSnNvbhInCg9hbGxvd2VkX2NhbGxlcnMYBSADKAlSDmFsbG93ZWRDYWxsZXJzIl0KE1dvcmtmbG93RGVjbGFyYXRpb24SEgoEbmFtZRgBIAEoCVIEbmFtZRIeCgpkZWZpbml0aW9uGAIgASgJUgpkZWZpbml0aW9uEhIKBG9wdHMYAyABKAlSBG9wdHMi9wEKDkpvYkRlY2xhcmF0aW9uEhsKCWNyb25fZXhwchgBIAEoCVIIY3JvbkV4cHISGgoIdGltZXpvbmUYAiABKAlSCHRpbWV6b25lEiUKDm1pc2ZpcmVfcG9saWN5GAMgASgJUg1taXNmaXJlUG9saWN5Eh8KC3RhcmdldF90eXBlGAQgASgJUgp0YXJnZXRUeXBlEh0KCnRhcmdldF9yZWYYBSABKAlSCXRhcmdldFJlZhIZCghkZWxheV9tcxgGIAEoBVIHZGVsYXlNcxIqChFyZXRyeV9wb2xpY3lfanNvbhgHIAEoCVIPcmV0cnlQb2xpY3lKc29uKmQKDVRyYW5zcG9ydE1vZGUSHgoaVFJBTlNQT1JUX01PREVfVU5TUEVDSUZJRUQQABIZChVUUkFOU1BPUlRfTU9ERV9ESVJFQ1QQARIYChRUUkFOU1BPUlRfTU9ERV9QUk9YWRACKmcKE0xvYWRCYWxhbmNpbmdQb2xpY3kSEgoOTEJfUk9VTkRfUk9CSU4QABIPCgtMQl9XRUlHSFRFRBABEhgKFExCX0xFQVNUX0NPTk5FQ1RJT05TEAISEQoNTEJfWk9ORV9BV0FSRRADKkMKE0NpcmN1aXRCcmVha2VyU3RhdGUSDQoJQ0JfQ0xPU0VEEAASCwoHQ0JfT1BFThABEhAKDENCX0hBTEZfT1BFThACQkNaQWdpdGh1Yi5jb20vc2VydmljZWJyaWRnZS9zZXJ2ZXItZ28vaW50ZXJuYWwvcGIvY29tbW9uL3YxO2NvbW1vbnYxSrUVCgYSBAAATgEKCAoBDBIDAAASCggKAQISAwEAIAoICgEIEgMDAFgKCQoCCAsSAwMAWAoJCgIDABIDBQAlCgoKAgQAEgQHAAwBCgoKAwQAARIDBwgWCgsKBAQAAgASAwgCRAoMCgUEAAIABRIDCAIICgwKBQQAAgABEgMICRUKDAoFBAACAAMSAwgYGQoMCgUEAAIACBIDCBpDChAKCQQAAgAIhwkOAhIDCBtCCgsKBAQA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UmVjb25jaWxlUmVxdWVzdBJLCghpZGVudGl0eRgBIAEoCzInLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLldvcmtlcklkZW50aXR5Qga6SAPIAQFSCGlkZW50aXR5EkoKCWZ1bmN0aW9ucxgCIAMoCzIsLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLkZ1bmN0aW9uRGVjbGFyYXRpb25SCWZ1bmN0aW9ucxJaCg9jb25zdW1lcl9ncm91cHMYAyADKAsyMS5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5Db25zdW1lckdyb3VwRGVjbGFyYXRpb25SDmNvbnN1bWVyR3JvdXBzEk4KC2h0dHBfcm91dGVzGAQgAygLMi0uc2VydmljZWJyaWRnZS5jb21tb24udjEuSHR0cFJvdXRlRGVjbGFyYXRpb25SCmh0dHBSb3V0ZXMSSgoJd29ya2Zsb3dzGAUgAygLMiwuc2VydmljZWJyaWRnZS5jb21tb24udjEuV29ya2Zsb3dEZWNsYXJhdGlvblIJd29ya2Zsb3dzEjsKBGpvYnMYBiADKAsyJy5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5Kb2JEZWNsYXJhdGlvblIEam9icxJCCgdtZXRyaWNzGAcgASgLMiguc2VydmljZWJyaWRnZS5jb21tb24udjEuUmVzb3VyY2VNZXRyaWNzUgdtZXRyaWNzEk0KDnRyYW5zcG9ydF9tb2RlGAggASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVINdHJhbnNwb3J0TW9kZRISCgR6b25lGAkgASgJUgR6b25lIl4KEVJlY29uY2lsZVJlc3BvbnNlEiAKDGxlYXNlX3R0bF9tcxgBIAEoA1IKbGVhc2VUdGxNcxInCg9zZXJ2ZXJfcmV2aXNpb24YAiABKANSDnNlcnZlclJldmlzaW9uIt0BChdJc3N1ZUNlcnRpZmljYXRlUmVxdWVzdBIqCgxzZXJ2aWNlX25hbWUYASABKAlCB7pIBHICEAFSC3NlcnZpY2VOYW1lEigKC2luc3RhbmNlX2lkGAIgASgJQge6SARyAhABUgppbnN0YW5jZUlkEiAKB2Nzcl9wZW0YAyABKAlCB7pIBHICEAFSBmNzclBlbRIrChFhZHZlcnRpc2VfYWRkcmVzcxgEIAEoCVIQYWR2ZXJ0aXNlQWRkcmVzcxIdCgpleHRyYV9zYW5zGAUgAygJUglleHRyYVNhbnMiawoYSXNzdWVDZXJ0aWZpY2F0ZVJlc3BvbnNlEhkKCGNlcnRfcGVtGAEgASgJUgdjZXJ0UGVtEhUKBmNhX3BlbRgCIAEoCVIFY2FQZW0SHQoKZXhwaXJlc19hdBgDIAEoA1IJZXhwaXJlc0F0IvYBCg5QdWJsaXNoUmVxdWVzdBIdCgV0b3BpYxgBIAEoCUIHukgEcgIQAVIFdG9waWMSGAoHcGF5bG9hZBgCIAEoDFIHcGF5bG9hZBJUCgdoZWFkZXJzGAMgAygLMjouc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUHVibGlzaFJlcXVlc3QuSGVhZGVyc0VudHJ5UgdoZWFkZXJzEhkKCHRyYWNlX2lkGAQgASgJUgd0cmFjZUlkGjoKDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIjAKD1B1Ymxpc2hSZXNwb25zZRIdCgptZXNzYWdlX2lkGAEgASgJUgltZXNzYWdlSWQinQEKFkV4ZWN1dGVXb3JrZmxvd1JlcXVlc3QSLAoNd29ya2Zsb3dfbmFtZRgBIAEoCUIHukgEcgIQAVIMd29ya2Zsb3dOYW1lEhQKBWlucHV0GAIgASgMUgVpbnB1dBIZCgh0cmFjZV9pZBgDIAEoCVIHdHJhY2VJZBIkCg5ncm91cF90cmFjZV9pZBgEIAEoCVIMZ3JvdXBUcmFjZUlkIjQKF0V4ZWN1dGVXb3JrZmxvd1Jlc3BvbnNlEhkKCHRyYWNlX2lkGAEgASgJUgd0cmFjZUlkIlMKFUNhbmNlbFdvcmtmbG93UmVxdWVzdBIiCgh0cmFjZV9pZBgBIAEoCUIHukgEcgIQAVIHdHJhY2VJZBIWCgZyZWFzb24YAiABKAlSBnJlYXNvbiI2ChZDYW5jZWxXb3JrZmxvd1Jlc3BvbnNlEhwKCWNhbmNlbGxlZBgBIAEoCFIJY2FuY2VsbGVkItMBChBQcm94eUNhbGxSZXF1ZXN0EiwKDWZ1bmN0aW9uX25hbWUYASABKAlCB7pIBHICEAFSDGZ1bmN0aW9uTmFtZRIYCgdwYXlsb2FkGAIgASgMUgdwYXlsb2FkEiQKDmdyb3VwX3RyYWNlX2lkGAMgASgJUgxncm91cFRyYWNlSWQSFwoHc3Bhbl9pZBgEIAEoCVIGc3BhbklkEhkKCHRyYWNlX2lkGAUgASgJUgd0cmFjZUlkEh0KCnRpbWVvdXRfbXMYBiABKAVSCXRpbWVvdXRNcyJbChFQcm94eUNhbGxSZXNwb25zZRIYCgdzdWNjZXNzGAEgASgIUgdzdWNjZXNzEhYKBm91dHB1dBgCIAEoDFIGb3V0cHV0EhQKBWVycm9yGAMgASgJUgVlcnJvciJkChFXYXRjaFRyYWNlUmVxdWVzdBIiCgh0cmFjZV9pZBgBIAEoCUIHukgEcgIQAVIHdHJhY2VJZBIZCghmcm9tX3NlcRgCIAEoA1IHZnJvbVNlcRIQCgNrZXkYAyABKAlSA2tleSKMAQoQVHJhY2VTdHJlYW1DaHVuaxIQCgNzZXEYASABKANSA3NlcRIQCgNrZXkYAiABKAlSA2tleRIdCgpldmVudF90eXBlGAMgASgJUglldmVudFR5cGUSEgoEZGF0YRgEIAEoDFIEZGF0YRIhCgx0cmFjZV9zdGF0dXMYBSABKAlSC3RyYWNlU3RhdHVzMtMGCgxDb250cm9sUGxhbmUSbgoJUmVjb25jaWxlEi8uc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUmVjb25jaWxlUmVxdWVzdBowLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlJlY29uY2lsZVJlc3BvbnNlEoMBChBJc3N1ZUNlcnRpZmljYXRlEjYuc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuSXNzdWVDZXJ0aWZpY2F0ZVJlcXVlc3QaNy5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5Jc3N1ZUNlcnRpZmljYXRlUmVzcG9uc2USaAoHUHVibGlzaBItLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlB1Ymxpc2hSZXF1ZXN0Gi4uc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUHVibGlzaFJlc3BvbnNlEoABCg9FeGVjdXRlV29ya2Zsb3cSNS5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5FeGVjdXRlV29ya2Zsb3dSZXF1ZXN0GjYuc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuRXhlY3V0ZVdvcmtmbG93UmVzcG9uc2USfQoOQ2FuY2VsV29ya2Zsb3cSNC5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5DYW5jZWxXb3JrZmxvd1JlcXVlc3QaNS5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5DYW5jZWxXb3JrZmxvd1Jlc3BvbnNlEm4KCVByb3h5Q2FsbBIvLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlByb3h5Q2FsbFJlcXVlc3QaMC5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5Qcm94eUNhbGxSZXNwb25zZRJxCgpXYXRjaFRyYWNlEjAuc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuV2F0Y2hUcmFjZVJlcXVlc3QaLy5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5UcmFjZVN0cmVhbUNodW5rMAFCT1pNZ2l0aHViLmNvbS9zZXJ2aWNlYnJpZGdlL3NlcnZlci1nby9pbnRlcm5hbC9wYi9jb250cm9scGxhbmUvdjE7Y29udHJvbHBsYW5ldjFKuB4KBhIEAABrAQoICgEMEgMAABIKCAoBAhIDAQAmCggKAQgSAwMAZAoJCgIICxIDAwBkCgkKAgMAEgMFACUKCQoCAwESAwYAHwoKCgIGABIECAAQAQoKCgMGAAESAwgIFAoLCgQGAAIAEgMJAj4KDAoFBgACAAESAwkGDwoMCgUGAAIAAhIDCRAgCgwKBQYAAgADEgMJKzwKCwoEBgACARIDCgJTCgwKBQYAAgEBEgMKBhYKDAoFBgACAQISAwoXLgoMCgUGAAIBAxIDCjlRCgsKBAYAAgISAwsCOAoMCgUGAAICARIDCwYNCgwKBQYAAgICEgMLDhwKDAoFBgACAgMSAwsnNgoLCgQGAAIDEgMMAlAKDAoFBgACAwESAwwGFQoMCgUGAAIDAhIDDBYsCgwKBQYAAgMDEgMMN04KCwoEBgACBBIDDQJNCgwKBQYAAgQBEgMNBhQKDAoFBgACBAISAw0VKgoMCgUGAAIEAxIDDTVLCgsKBAYAAgUSAw4C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YXRlLnByb3RvGhVjb21tb24vdjEvdHlwZXMucHJvdG8igwEKEFN1YnNjcmliZVJlcXVlc3QSJQoOZnVuY3Rpb25fbmFtZXMYASADKAlSDWZ1bmN0aW9uTmFtZXMSJQoOcmVzcG9uc2Vfbm9uY2UYAiABKAlSDXJlc3BvbnNlTm9uY2USIQoMZXJyb3JfZGV0YWlsGAMgASgJUgtlcnJvckRldGFpbCLSAQoRU3Vic2NyaWJlUmVzcG9uc2USGAoHdmVyc2lvbhgBIAEoCVIHdmVyc2lvbhIUCgVub25jZRgCIAEoCVIFbm9uY2USQQoEZnVsbBgDIAEoCzIrLnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuUmVnaXN0cnlTbmFwc2hvdEgAUgRmdWxsEkAKBWRlbHRhGAQgASgLMiguc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5SZWdpc3RyeURlbHRhSABSBWRlbHRhQggKBnVwZGF0ZSLYAQoQUmVnaXN0cnlTbmFwc2hvdBJYCglmdW5jdGlvbnMYASADKAsyOi5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLlJlZ2lzdHJ5U25hcHNob3QuRnVuY3Rpb25zRW50cnlSCWZ1bmN0aW9ucxpqCg5GdW5jdGlvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJCCgV2YWx1ZRgCIAEoCzIsLnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuRnVuY3Rpb25FbmRwb2ludHNSBXZhbHVlOgI4ASLmAQoNUmVnaXN0cnlEZWx0YRJPCgd1cHNlcnRzGAEgAygLMjUuc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5SZWdpc3RyeURlbHRhLlVwc2VydHNFbnRyeVIHdXBzZXJ0cxIaCghyZW1vdmFscxgCIAMoCVIIcmVtb3ZhbHMaaAoMVXBzZXJ0c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkIKBXZhbHVlGAIgASgLMiwuc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5GdW5jdGlvbkVuZHBvaW50c1IFdmFsdWU6AjgBIlwKEUZ1bmN0aW9uRW5kcG9pbnRzEkcKCWVuZHBvaW50cxgBIAMoCzIpLnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuV29ya2VyRW5kcG9pbnRSCWVuZHBvaW50cyKxAwoOV29ya2VyRW5kcG9pbnQSGgoIZW5kcG9pbnQYASABKAlSCGVuZHBvaW50Ek0KDnRyYW5zcG9ydF9tb2RlGAIgASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVINdHJhbnNwb3J0TW9kZRIfCgtpbnN0YW5jZV9pZBgDIAEoCVIKaW5zdGFuY2VJZBIWCgZ3ZWlnaHQYBCABKAVSBndlaWdodBIhCgxzZXJ2aWNlX25hbWUYBSABKAlSC3NlcnZpY2VOYW1lEhIKBHpvbmUYBiABKAlSBHpvbmUSKgoRaW5wdXRfc2NoZW1hX2pzb24YCiABKAlSD2lucHV0U2NoZW1hSnNvbhIsChJvdXRwdXRfc2NoZW1hX2pzb24YCyABKAlSEG91dHB1dFNjaGVtYUpzb24SJwoPYWxsb3dlZF9jYWxsZXJzGAwgAygJUg5hbGxvd2VkQ2FsbGVycxJBCgZoZWFsdGgYFCABKAsyKS5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLkVuZHBvaW50SGVhbHRoUgZoZWFsdGgiuQIKDkVuZHBvaW50SGVhbHRoEhwKCXJlYWNoYWJsZRgBIAEoCFIJcmVhY2hhYmxlEiQKDmxhdGVuY3lfcDUwX21zGAIgASgFUgxsYXRlbmN5UDUwTXMSJAoObGF0ZW5jeV9wOTlfbXMYAyABKAVSDGxhdGVuY3lQOTlNcxIdCgplcnJvcl9yYXRlGAQgASgCUgllcnJvclJhdGUSIgoNbGFzdF9jaGVja19hdBgFIAEoA1ILbGFzdENoZWNrQXQSMQoUY29uc2VjdXRpdmVfZmFpbHVyZXMYBiABKAVSE2NvbnNlY3V0aXZlRmFpbHVyZXMSRwoIY2Jfc3RhdGUYByABKA4yLC5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5DaXJjdWl0QnJlYWtlclN0YXRlUgdjYlN0YXRlIj0KDUxvb2t1cFJlcXVlc3QSLAoNZnVuY3Rpb25fbmFtZRgBIAEoCUIHukgEcgIQAVIMZnVuY3Rpb25OYW1lIoMCCg5Mb29rdXBSZXNwb25zZRIlCg5jYW5vbmljYWxfbmFtZRgBIAEoCVINY2Fub25pY2FsTmFtZRJH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GigKDAoFBAgCAAMSA0YvMAoLCgQECAIBEgNHAjEKDAoFBAgCAQQSA0cCCgoMCgUECAIBBhIDRwsZCgwKBQQIAgEBEgNHGiMKDAoFBAgCAQMSA0cvMAoLCgQECAICEgNIAjEKDAoFBAgCAgUSA0gCCAoMCgUECAICARIDSBorCgwKBQQIAgIDEgNILzAKCwoEBAgCAxIDSQIxCgwKBQQIAgMFEgNJAggKDAoFBAgCAwESA0kaLAoMCgUECAIDAxIDSS8wCgsKBAQIAgQSA0oCMQoMCgUECAIEBBIDSgIKCgwKBQQIAgQFEgNKCxEKDAoFBAgCBAESA0oaKQoMCgUECAIEAxIDSi8wYgZwcm90bzMKlasBChhzZXNzaW9uL3YxL3Nlc3Npb24ucHJvdG8SGHNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MRobYnVmL3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvGhVjb21tb24vdjEvdHlwZXMucHJvdG8iywsKCEVudmVsb3BlEhAKA3NlcRgBIAEoBFIDc2VxEhcKB2Fja19zZXEYAiABKARSBmFja1NlcRIhCgx0aW1lc3RhbXBfbXMYAyABKANSC3RpbWVzdGFtcE1zEjcKBWhlbGxvGAogASgLMh8uc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkhlbGxvSABSBWhlbGxvEkEKCWhlbGxvX2FjaxgLIAEoCzIiLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5IZWxsb0Fja0gAUghoZWxsb0FjaxI9CgVkcmFpbhgMIAEoCzIlLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5EcmFpblNpZ25hbEgAUgVkcmFpbhJACgZnb2F3YXkYDSABKAsyJi5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuR29hd2F5U2lnbmFsSABSBmdvYXdheRI5CgRwaW5nGBQgASgLMiMuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlBpbmdGcmFtZUgAUgRwaW5nEjkKBHBvbmcYFSABKAsyIy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUG9uZ0ZyYW1lSABSBHBvbmcSUAoOY29tbWFuZF9yZXN1bHQYHiABKAsyJy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuQ29tbWFuZFJlc3VsdEgAUg1jb21tYW5kUmVzdWx0EkgKCXRlbGVtZXRyeRgfIAEoCzIoLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5UZWxlbWV0cnlGcmFtZUgAUgl0ZWxlbWV0cnkSUgoNc3RyZWFtX2FwcGVuZBggIAEoCzIrLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5TdHJlYW1BcHBlbmRGcmFtZUgAUgxzdHJlYW1BcHBlbmQSUgoNd29ya2VyX3N0YXR1cxghIAEoCzIrLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Xb3JrZXJTdGF0dXNGcmFtZUgAUgx3b3JrZXJTdGF0dXMSUwoPcG9zaXRpb25fdXBkYXRlGCIgASgLMiguc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlBvc2l0aW9uVXBkYXRlSABSDnBvc2l0aW9uVXBkYXRlEkcKCGRpc3BhdGNoGCggASgLMikuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkRpc3BhdGNoQ29tbWFuZEgAUghkaXNwYXRjaBJHCgtjb25maWdfcHVzaBgpIAEoCzIkLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Db25maWdQdXNoSABSCmNvbmZpZ1B1c2gSSgoMcGVybWl0X2dyYW50GDIgASgLMiUuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlBlcm1pdEdyYW50SABSC3Blcm1pdEdyYW50ElAKDnBlcm1pdF9yZWxlYXNlGDMgASgLMicuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlBlcm1pdFJlbGVhc2VIAFINcGVybWl0UmVsZWFzZRJOCgtmbG93X3VwZGF0ZRg0IAEoCzIrLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5GbG93Q29udHJvbFVwZGF0ZUgAUgpmbG93VXBkYXRlElMKD3B1Ymxpc2hfbWVzc2FnZRg1IAEoCzIoLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5QdWJsaXNoTWVzc2FnZUgAUg5wdWJsaXNoTWVzc2FnZRJHCgtwdWJsaXNoX2Fjaxg2IAEoCzIkLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5QdWJsaXNoQWNrSABSCnB1Ymxpc2hBY2sSPAoFZXJyb3IYYyABKAsyJC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRXJyb3JGcmFtZUgAUgVlcnJvckIJCgdwYXlsb2FkIvcDCgVIZWxsbxJDCghpZGVudGl0eRgBIAEoCzInLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLldvcmtlcklkZW50aXR5UghpZGVudGl0eRIhCgxtYXhfaW5mbGlnaHQYAiABKAVSC21heEluZmxpZ2h0EiEKDG1pbl9pbmZsaWdodBgDIAEoBVILbWluSW5mbGlnaHQSIQoMcmVzdW1lX3Rva2VuGAQgASgJUgtyZXN1bWVUb2tlbhIUCgVlcG9jaBgFIAEoBFIFZXBvY2gSKgoRbGFzdF9yZWNlaXZlZF9zZXEYBiABKARSD2xhc3RSZWNlaXZlZFNlcRIiCg1sYXN0X3NlbnRfc2VxGAcgASgEUgtsYXN0U2VudFNlcRIyChVjb21wbGV0ZWRfY29tbWFuZF9pZHMYCCADKAlSE2NvbXBsZXRlZENvbW1hbmRJZHMSHwoLc2RrX3ZlcnNpb24YCiABKAlSCnNka1ZlcnNpb24SIgoMY2FwYWJpbGl0aWVzGAsgAygJUgxjYXBhYmlsaXRpZXMSEgoEem9uZRgMIAEoCVIEem9uZRJNCg50cmFuc3BvcnRfbW9kZRgNIAEoDjImLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlRyYW5zcG9ydE1vZGVSDXRyYW5zcG9ydE1vZGUi7AQKCEhlbGxvQWNrEh0KCnNlc3Npb25faWQYASABKAlSCXNlc3Npb25JZBIhCgxyZXN1bWVfdG9rZW4YAiABKAlSC3Jlc3VtZVRva2VuEhQKBWVwb2NoGAMgASgEUgVlcG9jaBIYCgdyZXN1bWVkGAQgASgIUgdyZXN1bWVkEiYKD3Jlc3VtZV9mcm9tX3NlcRgFIAEoBFINcmVzdW1lRnJvbVNlcRIrChFyZXBsYXllZF9jb21tYW5kcxgGIAEoBVIQcmVwbGF5ZWRDb21tYW5kcxItChJyZWNvbmNpbGVkX3Jlc3VsdHMYByABKAVSEXJlY29uY2lsZWRSZXN1bHRzEjIKFWhlYXJ0YmVhdF9pbnRlcnZhbF9tcxgKIAEoBVITaGVhcnRiZWF0SW50ZXJ2YWxNcxIwChRoZWFydGJlYXRfdGltZW91dF9tcxgLIAEoBVISaGVhcnRiZWF0VGltZW91dE1zEicKD2luaXRpYWxfcGVybWl0cxgMIAEoBVIOaW5pdGlhbFBlcm1pdHMSHwoLbWF4X3Blcm1pdHMYDSABKAVSCm1heFBlcm1pdHMSYAoYZWZmZWN0aXZlX3RyYW5zcG9ydF9tb2RlGBQgASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVIWZWZmZWN0aXZlVHJhbnNwb3J0TW9kZRJYChJyZXN1bWVfZmFpbF9yZWFzb24YHiABKA4yKi5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUmVzdW1lRmFpbFJlYXNvblIQcmVzdW1lRmFpbFJlYXNvbiJ2CgtEcmFpblNpZ25hbBIWCgZyZWFzb24YASABKAlSBnJlYXNvbhIfCgtkZWFkbGluZV9tcxgCIAEoBVIKZGVhZGxpbmVNcxIuChNwZW5kaW5nX2NvbW1hbmRfaWRzGAMgAygJUhFwZW5kaW5nQ29tbWFuZElkcyJgCgxHb2F3YXlTaWduYWwSOAoEY29kZRgBIAEoDjIkLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Hb2F3YXlDb2RlUgRjb2RlEhYKBnJlYXNvbhgCIAEoCVIGcmVhc29uIi4KCVBpbmdGcmFtZRIhCgx0aW1lc3RhbXBfbXMYASABKANSC3RpbWVzdGFtcE1zImcKCVBvbmdGcmFtZRIqChFlY2hvX3RpbWVzdGFtcF9tcxgBIAEoA1IPZWNob1RpbWVzdGFtcE1zEi4KE3NlcnZlcl90aW1lc3RhbXBfbXMYAiABKANSEXNlcnZlclRpbWVzdGFtcE1zIr8DCgtUYXNrQ29tbWFuZBI+CgR0eXBlGAEgASgOMiouc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlRhc2tDb21tYW5kLlR5cGVSBHR5cGUSGQoIdHJhY2VfaWQYAiABKAlSB3RyYWNlSWQSFwoHc3Bhbl9pZBgDIAEoCVIGc3BhbklkEiQKDnBhcmVudF9zcGFuX2lkGAQgASgJUgxwYXJlbnRTcGFuSWQSGAoHcGF5bG9hZBgFIAEoDFIHcGF5bG9hZBJDCgRtZXRhGAYgAygLMi8uc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlRhc2tDb21tYW5kLk1ldGFFbnRyeVIEbWV0YRIoChBkZWFkbGluZV91bml4X21zGAcgASgDUg5kZWFkbGluZVVuaXhNcxIYCgdhdHRlbXB0GAggASgFUgdhdHRlbXB0GjcKCU1ldGFFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIjoKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEgwKCFRZUEVfUlBDEAESDgoKVFlQRV9FVkVOVBACIr0CCg9EaXNwYXRjaENvbW1hbmQSHQoKY29tbWFuZF9pZBgBIAEoCVIJY29tbWFuZElkEigKEGRlYWRsaW5lX3VuaXhfbXMYAiABKANSDmRlYWRsaW5lVW5peE1zEhsKCWlzX3JlcGxheRgDIAEoCFIIaXNSZXBsYXkSSAoMdGFza19jb21tYW5kGBQgASgLMiUuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlRhc2tDb21tYW5kUgt0YXNrQ29tbWFuZBI1CgNycGMYCiABKAsyIS5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUnBjVGFza0gAUgNycGMSOwoFZXZlbnQYCyABKAsyIy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRXZlbnRUYXNrSABSBWV2ZW50QgYKBHRhc2siswEKB1JwY1Rhc2sSDgoCZm4YASABKAlSAmZuEhgKB3BheWxvYWQYAiABKAxSB3BheWxvYWQSJAoOZ3JvdXBfdHJhY2VfaWQYAyABKAlSDGdyb3VwVHJhY2VJZBIXCgdzcGFuX2lkGAQgASgJUgZzcGFuSWQSGQoIdHJhY2VfaWQYBSABKAlSB3RyYWNlSWQSJAoOcGFyZW50X3NwYW5faWQYBiABKAlSDHBhcmVudFNwYW5JZCKCAwoJRXZlbnRUYXNrEh0KCm1lc3NhZ2VfaWQYASABKAlSCW1lc3NhZ2VJZBIdCgpncm91cF9uYW1lGAIgASgJUglncm91cE5hbWUSFAoFdG9waWMYAyABKAlSBXRvcGljEhgKB3BheWxvYWQYBCABKAxSB3BheWxvYWQSSgoHaGVhZGVycxgFIAMoCzIwLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5FdmVudFRhc2suSGVhZGVyc0VudHJ5UgdoZWFkZXJzEiQKDmdyb3VwX3RyYWNlX2lkGAYgASgJUgxncm91cFRyYWNlSWQSJAoOcGFyZW50X3NwYW5faWQYByABKAlSDHBhcmVudFNwYW5JZBIYCgdhdHRlbXB0GAggASgFUgdhdHRlbXB0EhkKCHRyYWNlX2lkGAkgASgJUgd0cmFjZUlkGjoKDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIvIBCg1Db21tYW5kUmVzdWx0Eh0KCmNvbW1hbmRfaWQYASABKAlSCWNvbW1hbmRJZBIYCgdzdWNjZXNzGAIgASgIUgdzdWNjZXNzEhYKBm91dHB1dBgDIAEoDFIGb3V0cHV0EhQKBWVycm9yGAQgASgJUgVlcnJvchIQCgNhY2sYBSABKAhSA2FjaxIkCg5yZXRyeV9hZnRlcl9tcxgGIAEoBVIMcmV0cnlBZnRlck1zEiMKDXJlamVjdF9yZWFzb24YByABKAlSDHJlamVjdFJlYXNvbhIdCgpyZXN1bHRfc2VxGAggASgEUglyZXN1bHRTZXEigwEKDlRlbGVtZXRyeUZyYW1lEjkKBXNwYW5zGAEgAygLMiMuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlNwYW5FdmVudFIFc3BhbnMSNgoEbG9ncxgCIAMoCzIiLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Mb2dFbnRyeVIEbG9ncyLuAwoJU3BhbkV2ZW50EjwKBGtpbmQYASABKA4yKC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuU3BhbkV2ZW50LktpbmRSBGtpbmQSGQoIdHJhY2VfaWQYAiABKAlSB3RyYWNlSWQSFwoHc3Bhbl9pZBgDIAEoCVIGc3BhbklkEiQKDnBhcmVudF9zcGFuX2lkGAQgASgJUgxwYXJlbnRTcGFuSWQSDgoCZm4YBSABKAlSAmZuEh0KCnN0YXJ0ZWRfYXQYBiABKANSCXN0YXJ0ZWRBdBIfCgtkdXJhdGlvbl9tcxgHIAEoA1IKZHVyYXRpb25NcxIYCgdzdWNjZXNzGAggASgIUgdzdWNjZXNzEhQKBWVycm9yGAkgASgJUgVlcnJvchIUCgVpbnB1dBgKIAEoDFIFaW5wdXQSFgoGb3V0cHV0GAsgASgMUgZvdXRwdXQSGAoHYXR0ZW1wdBgMIAEoBVIHYXR0ZW1wdBIbCglzcGFuX3R5cGUYDSABKAlSCHNwYW5UeXBlEiUKDnRhcmdldF9zZXJ2aWNlGA4gASgJUg10YXJnZXRTZXJ2aWNlIj0KBEtpbmQSFAoQS0lORF9VTlNQRUNJRklFRBAAEg4KCktJTkRfU1RBUlQQARIPCgtLSU5EX0ZJTklTSBACIugCCghMb2dFbnRyeRIZCgh0cmFjZV9pZBgBIAEoCVIHdHJhY2VJZBIXCgdzcGFuX2lkGAIgASgJUgZzcGFuSWQSIQoMc2VydmljZV9uYW1lGAMgASgJUgtzZXJ2aWNlTmFtZRIUCgVsZXZlbBgEIAEoCVIFbGV2ZWwSGAoHbWVzc2FnZRgFIAEoCVIHbWVzc2FnZRIhCgx0aW1lc3RhbXBfbnMYBiABKANSC3RpbWVzdGFtcE5zElIKCmF0dHJpYnV0ZXMYByADKAsyMi5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuTG9nRW50cnkuQXR0cmlidXRlc0VudHJ5UgphdHRyaWJ1dGVzEh8KC2luc3RhbmNlX2lkGAggASgJUgppbnN0YW5jZUlkGj0KD0F0dHJpYnV0ZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIpYBChFTdHJlYW1BcHBlbmRGcmFtZRIZCgh0cmFjZV9pZBgBIAEoCVIHdHJhY2VJZBIQCgNrZXkYAiABKAlSA2tleRIdCgpldmVudF90eXBlGAMgASgJUglldmVudFR5cGUSEgoEZGF0YRgEIAEoDFIEZGF0YRIhCgx0cmFjZV9zdGF0dXMYBSABKAlSC3RyYWNlU3RhdHVzIsMBChFXb3JrZXJTdGF0dXNGcmFtZRIlCg5mdW5jdGlvbl9uYW1lcxgBIAMoCVINZnVuY3Rpb25OYW1lcxIfCgtncm91cF9uYW1lcxgCIAMoCVIKZ3JvdXBOYW1lcxIaCghlbmRwb2ludBgDIAEoCVIIZW5kcG9pbnQSHwoLY3B1X3BlcmNlbnQYBCABKAJSCmNwdVBlcmNlbnQSFQoGcmFtX21iGAUgASgFUgVyYW1NYhISCgR6b25lGAYgASgJUgR6b25lImEKC1Blcm1pdEdyYW50Ei0KEmFkZGl0aW9uYWxfcGVybWl0cxgBIAEoBVIRYWRkaXRpb25hbFBlcm1pdHMSIwoNdG90YWxfcGVuZGluZxgCIAEoBVIMdG90YWxQZW5kaW5nIisKDVBlcm1pdFJlbGVhc2USGgoIcmVsZWFzZWQYASABKAVSCHJlbGVhc2VkIlMKEUZsb3dDb250cm9sVXBkYXRlEiYKD25ld193aW5kb3dfc2l6ZRgBIAEoBVINbmV3V2luZG93U2l6ZRIWCgZyZWFzb24YAiABKAlSBnJlYXNvbiI8Cg5Qb3NpdGlvblVwZGF0ZRIqChFsYXN0X3JlY2VpdmVkX3NlcRgBIAEoBFIPbGFzdFJlY2VpdmVkU2VxImIKCkNvbmZpZ1B1c2gSVAoQdHJhbnNwb3J0X2NvbmZpZxgBIAEoCzIpLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5UcmFuc3BvcnRDb25maWdSD3RyYW5zcG9ydENvbmZpZyLRBQoPVHJhbnNwb3J0Q29uZmlnEkkKDGRlZmF1bHRfbW9kZRgBIAEoDjImLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlRyYW5zcG9ydE1vZGVSC2RlZmF1bHRNb2RlEmwKEXNlcnZpY2Vfb3ZlcnJpZGVzGAIgAygLMj8uc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlRyYW5zcG9ydENvbmZpZy5TZXJ2aWNlT3ZlcnJpZGVzRW50cnlSEHNlcnZpY2VPdmVycmlkZXMSbwoSZnVuY3Rpb25fb3ZlcnJpZGVzGAMgAygLMkAuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlRyYW5zcG9ydENvbmZpZy5GdW5jdGlvbk92ZXJyaWRlc0VudHJ5UhFmdW5jdGlvbk92ZXJyaWRlcxJmChdkZWZhdWx0X2NpcmN1aXRfYnJlYWtlchgEIAEoCzIuLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5DaXJjdWl0QnJlYWtlckNvbmZpZ1IVZGVmYXVsdENpcmN1aXRCcmVha2VyEjgKBHpvbmUYBSABKAsyJC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuWm9uZUNvbmZpZ1IEem9uZRp3ChVTZXJ2aWNlT3ZlcnJpZGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSAoFdmFsdWUYAiABKAsyMi5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuU2VydmljZVRyYW5zcG9ydE92ZXJyaWRlUgV2YWx1ZToCOAEaeQoWRnVuY3Rpb25PdmVycmlkZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5GdW5jdGlvblRyYW5zcG9ydE92ZXJyaWRlUgV2YWx1ZToCOAEi+QIKGFNlcnZpY2VUcmFuc3BvcnRPdmVycmlkZRI6CgRtb2RlGAEgASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVIEbW9kZRJRCg9mYWxsYmFja19wb2xpY3kYAiABKA4yKC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRmFsbGJhY2tQb2xpY3lSDmZhbGxiYWNrUG9saWN5EioKEWRpcmVjdF90aW1lb3V0X21zGAMgASgFUg9kaXJlY3RUaW1lb3V0TXMSSQoJbGJfcG9saWN5GAQgASgOMiwuc2VydmljZWJyaWRnZS5jb21tb24udjEuTG9hZEJhbGFuY2luZ1BvbGljeVIIbGJQb2xpY3kSVwoPY2lyY3VpdF9icmVha2VyGAUgASgLMi4uc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkNpcmN1aXRCcmVha2VyQ29uZmlnUg5jaXJjdWl0QnJlYWtlciLJAQoZRnVuY3Rpb25UcmFuc3BvcnRPdmVycmlkZRI6CgRtb2RlGAEgASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVIEbW9kZRJRCg9mYWxsYmFja19wb2xpY3kYAiABKA4yKC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRmFsbGJhY2tQb2xpY3lSDmZhbGxiYWNrUG9saWN5Eh0KCnRpbWVvdXRfbXMYAyABKAVSCXRpbWVvdXRNcyLPAQoUQ2lyY3VpdEJyZWFrZXJDb25maWcSKwoRZmFpbHVyZV90aHJlc2hvbGQYASABKAVSEGZhaWx1cmVUaHJlc2hvbGQSKwoRc3VjY2Vzc190aHJlc2hvbGQYAiABKAVSEHN1Y2Nlc3NUaHJlc2hvbGQSKAoQb3Blbl9kdXJhdGlvbl9tcxgDIAEoBVIOb3BlbkR1cmF0aW9uTXMSMwoWaGFsZl9vcGVuX21heF9yZXF1ZXN0cxgEIAEoBVITaGFsZk9wZW5NYXhSZXF1ZXN0cyJ4Cgpab25lQ29uZmlnEh0KCmxvY2FsX3pvbmUYASABKAlSCWxvY2FsWm9uZRIfCgtwcmVmZXJfem9uZRgCIAEoCFIKcHJlZmVyWm9uZRIqChF6b25lX3dlaWdodF9ib29zdBgDIAEoBVIPem9uZVdlaWdodEJvb3N0In4KCkVycm9yRnJhbWUSEgoEY29kZRgBIAEoBVIEY29kZRIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlEhwKCXJldHJ5YWJsZRgDIAEoCFIJcmV0cnlhYmxlEiQKDnJldHJ5X2FmdGVyX21zGAQgASgFUgxyZXRyeUFmdGVyTXMirQIKDlB1Ymxpc2hNZXNzYWdlEh0KCnJlcXVlc3RfaWQYASABKAlSCXJlcXVlc3RJZBIUCgV0b3BpYxgCIAEoCVIFdG9waWMSGAoHcGF5bG9hZBgDIAEoDFIHcGF5bG9hZBJPCgdoZWFkZXJzGAQgAygLMjUuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlB1Ymxpc2hNZXNzYWdlLkhlYWRlcnNFbnRyeVIHaGVhZGVycxIZCgh0cmFjZV9pZBgFIAEoCVIHdHJhY2VJZBIkCg5wYXJlbnRfc3Bhbl9pZBgGIAEoCVIMcGFyZW50U3BhbklkGjoKDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBImAKClB1Ymxpc2hBY2sSHQoKcmVxdWVzdF9pZBgBIAEoCVIJcmVxdWVzdElkEh0KCm1lc3NhZ2VfaWQYAiABKAlSCW1lc3NhZ2VJZBIUCgVlcnJvchgDIAEoCVIFZXJyb3Iq7AEKEFJlc3VtZUZhaWxSZWFzb24SGwoXUkVTVU1FX0ZBSUxfVU5TUEVDSUZJRUQQABIdChlSRVNVTUVfRkFJTF9UT0tFTl9FWFBJUkVEEAESHQoZUkVTVU1FX0ZBSUxfVE9LRU5fSU5WQUxJRBACEh0KGVJFU1VNRV9GQUlMX0dBUF9UT09fTEFSR0UQ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c2USGAoHc3VjY2VzcxgBIAEoCFIHc3VjY2VzcxIWCgZvdXRwdXQYAiABKAxSBm91dHB1dBIUCgVlcnJvchgDIAEoCVIFZXJyb3IimQMKDkRlbGl2ZXJSZXF1ZXN0EiYKCmdyb3VwX25hbWUYASABKAlCB7pIBHICEAFSCWdyb3VwTmFtZRIdCgV0b3BpYxgCIAEoCUIHukgEcgIQAVIFdG9waWMSJgoKbWVzc2FnZV9pZBgDIAEoCUIHukgEcgIQAVIJbWVzc2FnZUlkEhgKB2F0dGVtcHQYBCABKAVSB2F0dGVtcHQSGAoHcGF5bG9hZBgFIAEoDFIHcGF5bG9hZBJOCgdoZWFkZXJzGAYgAygLMjQuc2VydmljZWJyaWRnZS53b3JrZXIudjEuRGVsaXZlclJlcXVlc3QuSGVhZGVyc0VudHJ5UgdoZWFkZXJzEiQKDmdyb3VwX3RyYWNlX2lkGAcgASgJUgxncm91cFRyYWNlSWQSFwoHc3Bhbl9pZBgIIAEoCVIGc3BhbklkEhkKCHRyYWNlX2lkGAkgASgJUgd0cmFjZUlkGjoKDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIoQBCg9EZWxpdmVyUmVzcG9uc2USEAoDYWNrGAEgASgIUgNhY2sSIwoNcmVqZWN0X3JlYXNvbhgCIAEoCVIMcmVqZWN0UmVhc29uEiQKDnJldHJ5X2FmdGVyX21zGAMgASgFUgxyZXRyeUFmdGVyTXMSFAoFZXJyb3IYBCABKAlSBWVycm9yMsgBCg1Xb3JrZXJIYW5kbGVyElkKBkhhbmRsZRImLnNlcnZpY2VicmlkZ2Uud29ya2VyLnYxLkhhbmRsZVJlcXVlc3QaJy5zZXJ2aWNlYnJpZGdlLndvcmtlci52MS5IYW5kbGVSZXNwb25zZRJcCgdEZWxpdmVyEicuc2VydmljZWJyaWRnZS53b3JrZXIudjEuRGVsaXZlclJlcXVlc3QaKC5zZXJ2aWNlYnJpZGdlLndvcmtlci52MS5EZWxpdmVyUmVzcG9uc2VCQ1pBZ2l0aHViLmNvbS9zZXJ2aWNlYnJpZGdlL3NlcnZlci1nby9pbnRlcm5hbC9wYi93b3JrZXIvdjE7d29ya2VydjFK3AwKBhIE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";
|
|
13
|
+
var DESCRIPTOR_SET_BASE64 = "ConaBAogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiLKAQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlKnsIgOzK/wEQgezK/wEabRJrCIDsyv8BEjQuYnVmLmRlc2NyaXB0b3IudjEuYnVmX2ZpbGVfZGVzY3JpcHRvcl9zZXRfZXh0ZW5zaW9uGi0uYnVmLmRlc2NyaXB0b3IudjEuRmlsZURlc2NyaXB0b3JTZXRFeHRlbnNpb24ixQUKE0ZpbGVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIYCgdwYWNrYWdlGAIgASgJUgdwYWNrYWdlEh4KCmRlcGVuZGVuY3kYAyADKAlSCmRlcGVuZGVuY3kSKwoRcHVibGljX2RlcGVuZGVuY3kYCiADKAVSEHB1YmxpY0RlcGVuZGVuY3kSJwoPd2Vha19kZXBlbmRlbmN5GAsgAygFUg53ZWFrRGVwZW5kZW5jeRIrChFvcHRpb25fZGVwZW5kZW5jeRgPIAMoCVIQb3B0aW9uRGVwZW5kZW5jeRJDCgxtZXNzYWdlX3R5cGUYBCADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgttZXNzYWdlVHlwZRJBCgllbnVtX3R5cGUYBSADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSQQoHc2VydmljZRgGIAMoCzInLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvUgdzZXJ2aWNlEkMKCWV4dGVuc2lvbhgHIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEjYKB29wdGlvbnMYCCABKAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNSB29wdGlvbnMSSQoQc291cmNlX2NvZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1IOc291cmNlQ29kZUluZm8SFgoGc3ludGF4GAwgASgJUgZzeW50YXgSMgoHZWRpdGlvbhgOIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUgdlZGl0aW9uIvwGCg9EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI7CgVmaWVsZBgCIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IFZmllbGQSQwoJZXh0ZW5zaW9uGAYgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SQQoLbmVzdGVkX3R5cGUYAyADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgpuZXN0ZWRUeXBlEkEKCWVudW1fdHlwZRgEIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJYCg9leHRlbnNpb25fcmFuZ2UYBSADKAsyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlUg5leHRlbnNpb25SYW5nZRJECgpvbmVvZl9kZWNsGAggAygLMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvUglvbmVvZkRlY2wSOQoHb3B0aW9ucxgHIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9uc1IHb3B0aW9ucxJVCg5yZXNlcnZlZF9yYW5nZRgJIAMoCzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAogAygJUgxyZXNlcnZlZE5hbWUSQQoKdmlzaWJpbGl0eRgLIAEoDjIhLmdvb2dsZS5wcm90b2J1Zi5TeW1ib2xWaXNpYmlsaXR5Ugp2aXNpYmlsaXR5GnoKDkV4dGVuc2lvblJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZBJACgdvcHRpb25zGAMgASgLMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9uc1IHb3B0aW9ucxo3Cg1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCLMBAoVRXh0ZW5zaW9uUmFuZ2VPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uElkKC2RlY2xhcmF0aW9uGAIgAygLMjIuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbkIDiAECUgtkZWNsYXJhdGlvbhI3CghmZWF0dXJlcxgyIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UghmZWF0dXJlcxJtCgx2ZXJpZmljYXRpb24YAyABKA4yOC5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlOgpVTlZFUklGSUVEQgOIAQJSDHZlcmlmaWNhdGlvbhqUAQoLRGVjbGFyYXRpb24SFgoGbnVtYmVyGAEgASgFUgZudW1iZXISGwoJZnVsbF9uYW1lGAIgASgJUghmdWxsTmFtZRISCgR0eXBlGAMgASgJUgR0eXBlEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWRKBAgEEAUiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVQRUFURUQQAxISCg5MQUJFTF9SRVFVSVJFRBACImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMipgMKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUSQQoKdmlzaWJpbGl0eRgGIAEoDjIhLmdvb2dsZS5wcm90b2J1Zi5TeW1ib2xWaXNpYmlsaXR5Ugp2aXNpYmlsaXR5GjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIq0JCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlEjcKCGZlYXR1cmVzGDIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgqECtKBAgmECdSFHBocF9nZW5lcmljX3NlcnZpY2VzIvQDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAwgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoinQ0KDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJXChBlZGl0aW9uX2RlZmF1bHRzGBQgAygLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdFIPZWRpdGlvbkRlZmF1bHRzEjcKCGZlYXR1cmVzGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElUKD2ZlYXR1cmVfc3VwcG9ydBgWIAEoCzIsLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRmVhdHVyZVN1cHBvcnRSDmZlYXR1cmVTdXBwb3J0ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uGloKDkVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUalgIKDkZlYXR1cmVTdXBwb3J0EkcKEmVkaXRpb25faW50cm9kdWNlZBgBIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uSW50cm9kdWNlZBJHChJlZGl0aW9uX2RlcHJlY2F0ZWQYAiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIRZWRpdGlvbkRlcHJlY2F0ZWQSLwoTZGVwcmVjYXRpb25fd2FybmluZxgDIAEoCVISZGVwcmVjYXRpb25XYXJuaW5nEkEKD2VkaXRpb25fcmVtb3ZlZBgEIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5lZGl0aW9uUmVtb3ZlZCIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFSgQIEhATIqwBCgxPbmVvZk9wdGlvbnMSNwoIZmVhdHVyZXMYASABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLRAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYi2AIKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSNwoIZmVhdHVyZXMYAiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSKAoMZGVidWdfcmVkYWN0GAMgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSVQoPZmVhdHVyZV9zdXBwb3J0GAQgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLVAQoOU2VydmljZU9wdGlvbnMSNwoIZmVhdHVyZXMYIiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKZAwoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSNwoIZmVhdHVyZXMYIyABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiK5EAoKRmVhdHVyZVNldBKRAQoOZmllbGRfcHJlc2VuY2UYASABKA4yKS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlQj+IAQGYAQSYAQGiAQ0SCEVYUExJQ0lUGIQHogENEghJTVBMSUNJVBjnB6IBDRIIRVhQTElDSVQY6AeyAQMI6AdSDWZpZWxkUHJlc2VuY2USbAoJZW51bV90eXBlGAIgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGVCKYgBAZgBBpgBAaIBCxIGQ0xPU0VEGIQHogEJEgRPUEVOGOcHsgEDCOgHUghlbnVtVHlwZRKYAQoXcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmcYAyABKA4yMS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5SZXBlYXRlZEZpZWxkRW5jb2RpbmdCLYgBAZgBBJgBAaIBDRIIRVhQQU5ERUQYhAeiAQsSBlBBQ0tFRBjnB7IBAwjoB1IVcmVwZWF0ZWRGaWVsZEVuY29kaW5nEn4KD3V0ZjhfdmFsaWRhdGlvbhgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uQimIAQGYAQSYAQGiAQkSBE5PTkUYhAeiAQsSBlZFUklGWRjnB7IBAwjoB1IOdXRmOFZhbGlkYXRpb24SfgoQbWVzc2FnZV9lbmNvZGluZxgFIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lk1lc3NhZ2VFbmNvZGluZ0ImiAEBmAEEmAEBogEUEg9MRU5HVEhfUFJFRklYRUQYhAeyAQMI6AdSD21lc3NhZ2VFbmNvZGluZxKCAQoLanNvbl9mb3JtYXQYBiABKA4yJi5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0QjmIAQGYAQOYAQaYAQGiARcSEkxFR0FDWV9CRVNUX0VGRk9SVBiEB6IBChIFQUxMT1cY5weyAQMI6AdSCmpzb25Gb3JtYXQSqwEKFGVuZm9yY2VfbmFtaW5nX3N0eWxlGAcgASgOMi4uZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW5mb3JjZU5hbWluZ1N0eWxlQkmIAQKYAQGYAQKYAQOYAQSYAQWYAQaYAQeYAQiYAQmiARESDFNUWUxFX0xFR0FDWRiEB6IBDhIJU1RZTEUyMDI0GOkHsgEDCOkHUhJlbmZvcmNlTmFtaW5nU3R5bGUSuQEKGWRlZmF1bHRfc3ltYm9sX3Zpc2liaWxpdHkYCCABKA4yRS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5WaXNpYmlsaXR5RmVhdHVyZS5EZWZhdWx0U3ltYm9sVmlzaWJpbGl0eUI2iAECmAEBogEPEgpFWFBPUlRfQUxMGIQHogEVEhBFWFBPUlRfVE9QX0xFVkVMGOkHsgEDCOkHUhdkZWZhdWx0U3ltYm9sVmlzaWJpbGl0eRqhAQoRVmlzaWJpbGl0eUZlYXR1cmUigQEKF0RlZmF1bHRTeW1ib2xWaXNpYmlsaXR5EiUKIURFRkFVTFRfU1lNQk9MX1ZJU0lCSUxJVFlfVU5LTk9XThAAEg4KCkVYUE9SVF9BTEwQARIUChBFWFBPUlRfVE9QX0xFVkVMEAISDQoJTE9DQUxfQUxMEAMSCgoGU1RSSUNUEARKCAgBEICAgIACIlwKDUZpZWxkUHJlc2VuY2USGgoWRklFTERfUFJFU0VOQ0VfVU5LTk9XThAAEgwKCEVYUExJQ0lUEAESDAoISU1QTElDSVQQAhITCg9MRUdBQ1lfUkVRVUlSRUQQAyI3CghFbnVtVHlwZRIVChFFTlVNX1RZUEVfVU5LTk9XThAAEggKBE9QRU4QARIKCgZDTE9TRUQQAiJWChVSZXBlYXRlZEZpZWxkRW5jb2RpbmcSIwofUkVQRUFURURfRklFTERfRU5DT0RJTkdfVU5LTk9XThAAEgoKBlBBQ0tFRBABEgwKCEVYUEFOREVEEAIiSQoOVXRmOFZhbGlkYXRpb24SGwoXVVRGOF9WQUxJREFUSU9OX1VOS05PV04QABIKCgZWRVJJRlkQAhIICgROT05FEAMiBAgBEAEiUwoPTWVzc2FnZUVuY29kaW5nEhwKGE1FU1NBR0VfRU5DT0RJTkdfVU5LTk9XThAAEhMKD0xFTkdUSF9QUkVGSVhFRBABEg0KCURFTElNSVRFRBACIkgKCkpzb25Gb3JtYXQSFwoTSlNPTl9GT1JNQVRfVU5LTk9XThAAEgkKBUFMTE9XEAESFgoSTEVHQUNZX0JFU1RfRUZGT1JUEAIiVwoSRW5mb3JjZU5hbWluZ1N0eWxlEiAKHEVORk9SQ0VfTkFNSU5HX1NUWUxFX1VOS05PV04QABINCglTVFlMRTIwMjQQARIQCgxTVFlMRV9MRUdBQ1kQAiqwAQjoBxCLThqnARIdCOgHEgcucGIuY3BwGg8ucGIuQ3BwRmVhdHVyZXMSHwjpBxIILnBiLmphdmEaEC5wYi5KYXZhRmVhdHVyZXMSGwjqBxIGLnBiLmdvGg4ucGIuR29GZWF0dXJlcxIjCOsHEgoucGIucHl0aG9uGhIucGIuUHl0aG9uRmVhdHVyZXMSIwiGThIKLnBiLnByb3RvMRoSLnBiLlByb3RvMUZlYXR1cmVzKgYIi04QkE4qBgiQThCRTkoGCOcHEOgHIu8DChJGZWF0dXJlU2V0RGVmYXVsdHMSWAoIZGVmYXVsdHMYASADKAsyPC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdFIIZGVmYXVsdHMSQQoPbWluaW11bV9lZGl0aW9uGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1pbmltdW1FZGl0aW9uEkEKD21heGltdW1fZWRpdGlvbhgFIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5tYXhpbXVtRWRpdGlvbhr4AQoYRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhJOChRvdmVycmlkYWJsZV9mZWF0dXJlcxgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UhNvdmVycmlkYWJsZUZlYXR1cmVzEkIKDmZpeGVkX2ZlYXR1cmVzGAUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSDWZpeGVkRmVhdHVyZXNKBAgBEAJKBAgCEANSCGZlYXR1cmVzIp4DCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyp1CIDsyv8BEIHsyv8BGmcSZQiA7Mr/ARIxLmJ1Zi5kZXNjcmlwdG9yLnYxLmJ1Zl9zb3VyY2VfY29kZV9pbmZvX2V4dGVuc2lvbhoqLmJ1Zi5kZXNjcmlwdG9yLnYxLlNvdXJjZUNvZGVJbmZvRXh0ZW5zaW9uItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////BypVChBTeW1ib2xWaXNpYmlsaXR5EhQKEFZJU0lCSUxJVFlfVU5TRVQQABIUChBWSVNJQklMSVRZX0xPQ0FMEAESFQoRVklTSUJJTElUWV9FWFBPUlQQAkJ+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uSojwAwoHEgUmAIgLAQqqDwoBDBIDJgASMsEMIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoy2wIgQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQogIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAgU2FuamF5IEdo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FgoMCgUEAQIKARIDfRceCgwKBQQBAgoDEgN9ISIK9QEKBAQBAgsSBIMBAi8a5gEgVGhpcyBmaWVsZCBjb250YWlucyBvcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuCiBZb3UgbWF5IHNhZmVseSByZW1vdmUgdGhpcyBlbnRpcmUgZmllbGQgd2l0aG91dCBoYXJtaW5nIHJ1bnRpbWUKIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRlc2NyaXB0b3JzIC0tIHRoZSBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgb25seSBieQogZGV2ZWxvcG1lbnQgdG9vbHMuCgoNCgUEAQILBBIEgwECCgoNCgUEAQILBhIEgwELGQoNCgUEAQILARIEgwEaKgoNCgUEAQILAxIEgwEtLgr5AgoEBAECDBIEjAECHhrqAiBUaGUgc3ludGF4IG9mIHRoZSBwcm90byBmaWxlLgogVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlICJwcm90bzIiLCAicHJvdG8zIiwgYW5kICJlZGl0aW9ucyIuCgogSWYgYGVkaXRpb25gIGlzIHByZXNlbnQsIHRoaXMgdmFsdWUgbXVzdCBiZSAiZWRpdGlvbnMiLgogV0FSTklORzogVGhpcyBmaWVsZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHByb3RvYnVmIHBsdWdpbnMgb3Igc3BlY2lhbAogY2FzZXMgbGlrZSB0aGUgcHJvdG8gY29tcGlsZXIuIE90aGVyIHVzZXMgYXJlIGRpc2NvdXJhZ2VkIGFuZAogZGV2ZWxvcGVycyBzaG91bGQgcmVseSBvbiB0aGUgcHJvdG9yZWZsZWN0IEFQSXMgZm9yIHRoZWlyIGNsaWVudCBsYW5ndWFnZS4KCg0KBQQBAgwEEgSMAQIKCg0KBQQBAgwFEgSMAQsRCg0KBQQBAgwBEgSMARIYCg0KBQQBAgwDEgSMARsdCoICCgQEAQINEgSSAQIgGvMBIFRoZSBlZGl0aW9uIG9mIHRoZSBwcm90byBmaWxlLgogV0FSTklORzogVGhpcyBmaWVsZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHByb3RvYnVmIHBsdWdpbnMgb3Igc3BlY2lhbAog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ZXJ3aXNlLCBpdCdzIGRlZHVjZWQgZnJvbSB0aGUgZmllbGQncyBuYW1lIGJ5IGNvbnZlcnRpbmcKIGl0IHRvIGNhbWVsQ2FzZS4KCg0KBQQEAggEEgTAAgIKCg0KBQQEAggFEgTAAgsRCg0KBQQEAggBEgTAAhIbCg0KBQQEAggDEgTAAh4gCgwKBAQEAgkSBMICAiQKDQoFBAQCCQQSBMICAgoKDQoFBAQCCQYSBMICCxcKDQoFBAQCCQESBMICGB8KDQoFBAQCCQMSBMICIiMKsAkKBAQEAgoSBNkCAiUaoQkgSWYgdHJ1ZSwgdGhpcyBpcyBhIHByb3RvMyAib3B0aW9uYWwiLiBXaGVuIGEgcHJvdG8zIGZpZWxkIGlzIG9wdGlvbmFsLCBpdAogdHJhY2tzIHByZXNlbmNlIHJlZ2FyZGxlc3Mgb2YgZmllbGQgdHlwZS4KCiBXaGVuIHByb3RvM19vcHRpb25hbCBpcyB0cnVlLCB0aGlzIGZpZWxkIG11c3QgYmVsb25nIHRvIGEgb25lb2YgdG8gc2lnbmFsCiB0byBvbGQgcHJvdG8zIGNsaWVudHMgdGhhdCBwcmVzZW5jZSBpcyB0cmFja2VkIGZvciB0aGlzIGZpZWxkLiBUaGlzIG9uZW9mCiBpcyBrbm93biBhcyBhICJzeW50aGV0aWMiIG9uZW9mLCBhbmQgdGhpcyBmaWVsZCBtdXN0IGJlIGl0cyBzb2xlIG1lbWJlcgogKGVhY2ggcHJvdG8zIG9wdGlvbmFsIGZpZWxkIGdldHMgaXRzIG93biBzeW50aGV0aWMgb25lb2YpLiBTeW50aGV0aWMgb25lb2ZzCiBleGlzdCBpbiB0aGUgZGVzY3JpcHRvciBvbmx5LCBhbmQgZG8gbm90IGdlbmVyYXRlIGFueSBBUEkuIFN5bnRoZXRpYyBvbmVvZnMKIG11c3QgYmUgb3JkZXJlZCBhZnRlciBhbGwgInJlYWwiIG9uZW9mcy4KCiBGb3IgbWVzc2FnZSBmaWVsZHMsIHByb3RvM19vcHRpb25hbCBkb2Vzbid0IGNyZWF0ZSBhbnkgc2VtYW50aWMgY2hhbmdlLAogc2luY2Ugbm9uLXJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzIGFsd2F5cyB0cmFjayBwcmVzZW5jZS4gSG93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dmUgbWF5IGhhdmUgIm9wdGlvbnMiIGF0dGFjaGVkLiAgVGhlc2UgYXJlCiBqdXN0IGFubm90YXRpb25zIHdoaWNoIG1heSBjYXVzZSBjb2RlIHRvIGJlIGdlbmVyYXRlZCBzbGlnaHRseSBkaWZmZXJlbnRseQogb3IgbWF5IGNvbnRhaW4gaGludHMgZm9yIGNvZGUgdGhhdCBtYW5pcHVsYXRlcyBwcm90b2NvbCBtZXNzYWdlcy4KCiBDbGllbnRzIG1heSBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgYXMgZXh0ZW5zaW9ucyBvZiB0aGUgKk9wdGlvbnMgbWVzc2FnZXMuCiBUaGVzZSBleHRlbnNpb25zIG1heSBub3QgeWV0IGJlIGtub3duIGF0IHBhcnNpbmcgdGltZSwgc28gdGhlIHBhcnNlciBjYW5ub3QKIHN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlbS4gIEluc3RlYWQgaXQgc3RvcmVzIHRoZW0gaW4gYSBmaWVsZCBpbiB0aGUgKk9wdGlvbnMKIG1lc3NhZ2UgY2FsbGVkIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLiBUaGlzIGZpZWxkIG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lCiBhY3Jvc3MgYWxsICpPcHRpb25zIG1lc3NhZ2VzLiBXZSB0aGVuIHVzZSB0aGlzIGZpZWxkIHRvIHBvcHVsYXRlIHRoZQogZXh0ZW5zaW9ucyB3aGVuIHdlIGJ1aWxkIGEgZGVzY3JpcHRvciwgYXQgd2hpY2ggcG9pbnQgYWxsIHByb3RvcyBoYXZlIGJlZW4KIHBhcnNlZCBhbmQgc28gYWxsIGV4dGVuc2lvbnMgYXJlIGtub3duLgoKIEV4dGVuc2lvbiBudW1iZXJzIGZvciBjdXN0b20gb3B0aW9ucyBtYXkgYmUgY2hvc2VuIGFzIGZvbGxvd3M6CiAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbiBvcgogICBvcmdhbml6YXRpb24sIG9yIGZvciBleHBlcmltZW50YWwgb3B0aW9ucywgdXNlIGZpZWxkIG51bWJlcnMgNTAwMDAKICAgdGhyb3VnaCA5OTk5OS4gIEl0IGlzIHVwIHRvIHlvdSB0byBlbnN1cmUgdGhhdCB5b3UgZG8gbm90IHVzZSB0aGUKICAgc2FtZSBudW1iZXIgZm9yIG11bHRpcGxlIG9wdGlvbnMuCiAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgYmUgcHVibGlzaGVkIGFuZCB1c2VkIHB1YmxpY2x5IGJ5IG11bHRpcGxlCiAgIGluZGVwZW5kZW50IGVudGl0aWVzLCBlLW1haWwgcHJvdG9idWYtZ2xvYmFsLWV4dGVuc2lvbi1yZWdpc3RyeUBnb29nbGUuY29tCiAgIHRvIHJlc2VydmUgZXh0ZW5zaW9uIG51bWJlcnMuIFNpbXBseSBwcm92aWRlIHlvdXIgcHJvamVjdCBuYW1lIChlLmcuCiAgIE9iamVjdGl2ZS1DIHBsdWdpbikgYW5kIHlvdXIgcHJvamVjdCB3ZWJzaXRlIChpZiBhdmFpbGFibGUpIC0tIHRoZXJlJ3Mgbm8KICAgbmVlZCB0byBleHBsYWluIGhvdyB5b3UgaW50ZW5kIHRvIHVzZSB0aGVtLiBVc3VhbGx5IHlvdSBvbmx5IG5lZWQgb25lCiAgIGV4dGVuc2lvbiBudW1iZXIuIFlvdSBjYW4gZGVjbGFyZSBtdWx0aXBsZSBvcHRpb25zIHdpdGggb25seSBvbmUgZXh0ZW5zaW9uCiAgIG51bWJlciBieSBwdXR0aW5nIHRoZW0gaW4gYSBzdWItbWVzc2FnZS4gU2VlIHRoZSBDdXN0b20gT3B0aW9ucyBzZWN0aW9uIG9mCiAgIHRoZSBkb2NzIGZvciBleGFtcGxlczoKICAgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvI29wdGlvbnMKICAgSWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgcG9wdWxhciwgYSB3ZWIgc2VydmljZSB3aWxsIGJlIHNldCB1cAogICB0byBhdXRvbWF0aWNhbGx5IGFzc2lnbiBvcHRpb24gbnVtYmVycy4KCgsKAwQKARIEwwMIEwr0AQoEBAoCABIEyQMCIxrlASBTZXRzIHRoZSBKYXZhIHBhY2thZ2Ugd2hlcmUgY2xhc3NlcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIC5wcm90byB3aWxsIGJlCiBwbGFjZWQuICBCeSBkZWZhdWx0LCB0aGUgcHJvdG8gcGFja2FnZSBpcyB1c2VkLCBidXQgdGhpcyBpcyBvZnRlbgogaW5hcHByb3ByaWF0ZSBiZWNhdXNlIHByb3RvIHBhY2thZ2VzIGRvIG5vdCBub3JtYWxseSBzdGFydCB3aXRoIGJhY2t3YXJkcwogZG9tYWluIG5hbWVzLgoKDQoFBAoCAAQSBMkDAgoKDQoFBAoCAAUSBMkDCxEKDQoFBAoCAAESBMkDEh4KDQoFBAoCAAMSBMkDISIK8QIKBAQKAgESBNADAisa4gIgQ29udHJvbHMgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgSmF2YSBjbGFzcyBnZW5lcmF0ZWQgZm9yIHRoZSAucHJvdG8gZmlsZS4KIFRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgY29udGFpbiB0aGUgLnByb3RvIGZpbGUncyBnZXREZXNjcmlwdG9yKCkgbWV0aG9kIGFzCiB3ZWxsIGFzIGFueSB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KIElmIGphdmFfbXVsdGlwbGVfZmlsZXMgaXMgZGlzYWJsZWQsIHRoZW4gYWxsIHRoZSBvdGhlciBjbGFzc2VzIGZyb20gdGhlCiAucHJvdG8gZmlsZSB3aWxsIGJlIG5lc3RlZCBpbnNpZGUgdGhlIHNpbmdsZSB3cmFwcGVyIG91dGVyIGNsYXNzLgoKDQoFBAoCAQQSBNADAgoKDQoFBAoCAQUSBNADCxEKDQoFBAoCAQESBNADEiYKDQoFBAoCAQMSBNADKSoKpgMKBAQKAgISBNgDAjsalwMgSWYgZW5hYmxlZCwgdGhlbiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGEgc2VwYXJhdGUgLmphdmEKIGZpbGUgZm9yIGVhY2ggdG9wLWxldmVsIG1lc3NhZ2UsIGVudW0sIGFuZCBzZXJ2aWNlIGRlZmluZWQgaW4gdGhlIC5wcm90bwogZmlsZS4gIFRodXMsIHRoZXNlIHR5cGVzIHdpbGwgKm5vdCogYmUgbmVzdGVkIGluc2lkZSB0aGUgd3JhcHBlciBj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bWVudGF0aW9ucyBzdGlsbCBuZWVkIHRvIHdvcmsgYXMKIGlmIHRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQuCgogTk9URTogRG8gbm90IHNldCB0aGUgb3B0aW9uIGluIC5wcm90byBmaWxlcy4gQWx3YXlzIHVzZSB0aGUgbWFwcyBzeW50YXgKIGluc3RlYWQuIFRoZSBvcHRpb24gc2hvdWxkIG9ubHkgYmUgaW1wbGljaXRseSBzZXQgYnkgdGhlIHByb3RvIGNvbXBpbGVyCiBwYXJzZXIuCgoNCgUECwIDBBIE+wQCCgoNCgUECwIDBRIE+wQLDwoNCgUECwIDARIE+wQQGQoNCgUECwIDAxIE+wQcHQokCgMECwkSBP0EAg0iFyBqYXZhbGl0ZV9zZXJpYWxpemFibGUKCgwKBAQLCQMSBP0ECwwKDQoFBAsJAwESBP0ECwwKDQoFBAsJAwISBP0ECwwKHwoDBAsJEgT+BAINIhIgamF2YW5hbm9fYXNfbGl0ZQoKDAoEBAsJBBIE/gQLDAoNCgUECwkEARIE/gQLDAoNCgUECwkEAhIE/gQLDArdAwoEBAsCBBIEigUCUBrOAyBFbmFibGUgdGhlIGxlZ2FjeSBoYW5kbGluZyBvZiBKU09OIGZpZWxkIG5hbWUgY29uZmxpY3RzLiAgVGhpcyBsb3dlcmNhc2VzCiBhbmQgc3RyaXBzIHVuZGVyc2NvcmVkIGZyb20gdGhlIGZpZWxkcyBiZWZvcmUgY29tcGFyaXNvbiBpbiBwcm90bzMgb25seS4KIFRoZSBuZXcgYmVoYXZpb3IgdGFrZXMgYGpzb25fbmFtZWAgaW50byBhY2NvdW50IGFuZCBhcHBsaWVzIHRvIHByb3RvMiBhcwogd2VsbC4KCiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkgbWVhc3VyZSBhZ2FpbnN0IGJyb2tlbiBidWlsZHMgZHVlCiB0byB0aGUgY2hhbmdlIGluIGJlaGF2aW9yIGZvciBKU09OIGZpZWxkIG5hbWUgY29uZmxpY3RzLgoKIFRPRE8gVGhpcyBpcyBsZWdhY3kgYmVoYXZpb3Igd2UgcGxhbiB0byByZW1vdmUgb25jZSBkb3duc3RyZWFtCiB0ZWFtcyBoYXZlIGhhZCB0aW1lIHRvIG1pZ3JhdGUuCgoNCgUECwIEBBIEigUCCgoNCgUECwIEBRIEigULDwoNCgUECwIEARIEigUQNgoNCgUECwIEAxIEigU5OwoNCgUECwIECBIEigU8TwoOCgYECwIECAMSBIoFPU4KkQIKBAQLAgUSBJAFAiQaggIgQW55IGZlYXR1cmVzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljIGVkaXRpb24uCiBXQVJOSU5HOiBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9idWYgcGx1Z2lucyBvciBzcGVjaWFsCiBjYXNlcyBsaWtlIHRoZSBwcm90byBjb21waWxlci4gT3RoZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBAsCBQQSBJAFAgoKDQoFBAsCBQYSBJAFCxUKDQoFBAsCBQESBJAFFh4KDQoFBAsCBQMSBJAFISMKTwoEBAsCBhIEkwUCOhpBIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgoKDQoFBAsCBgQSBJMFAgoKDQoFBAsCBgYSBJMFCx4KDQoFBAsCBgESBJMFHzMKDQoFBAsCBgMSBJMFNjkKWgoDBAsFEgSWBQIZGk0gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCgoMCgQECwUAEgSWBQ0YCg0KBQQLBQABEgSWBQ0RCg0KBQQLBQACEgSWBRUYCgwKAgQMEgaZBQC/BgEKCwoDBAwBEgSZBQgUCsIDCgQEDAIAEgShBQJFGrMDIE5PVEU6IGN0eXBlIGlzIGRlcHJlY2F0ZWQuIFVzZSBgZmVhdHVyZXMuKHBiLmNwcCkuc3RyaW5nX3R5cGVgIGluc3RlYWQuCiBUaGUgY3R5cGUgb3B0aW9uIGluc3RydWN0cyB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHRvIHVzZSBhIGRpZmZlcmVudAogcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpZWxkIHRoYW4gaXQgbm9ybWFsbHkgd291bGQuICBTZWUgdGhlIHNwZWNpZmljCiBvcHRpb25zIGJlbG93LiAgVGhpcyBvcHRpb24gaXMgb25seSBpbXBsZW1lbnRlZCB0byBzdXBwb3J0IHVzZSBvZgogW2N0eXBlPUNPUkRdIGFuZCBbY3R5cGU9U1RSSU5HXSAodGhlIGRlZmF1bHQpIG9uIG5vbi1yZXBlYXRlZCBmaWVsZHMgb2YKIHR5cGUgImJ5dGVzIiBpbiB0aGUgb3BlbiBzb3VyY2UgcmVsZWFzZS4KIFRPRE86IG1ha2UgY3R5cGUgYWN0dWFsbHkgZGVwcmVjYXRlZC4KCg0KBQQMAgAEEgShBQIKCg0KBQQMAgAGEgShBQsQCg0KBQQMAgABEgShBREWCg0KBQQMAgADEgShBRkaCg0KBQQMAgAIEgShBRtECg0KBQQMAgAHEgShBTNDCg4KBAQMBAASBqIFAq8FAwoNCgUEDAQAARIEogUHDAofCgYEDAQAAgASBKQFBA8aDyBEZWZhdWx0IG1vZGUuCgoPCgcEDAQAAgABEgSkBQQKCg8KBwQMBAACAAISBKQFDQ4KlgMKBgQMBAACARIErAUEDRqFAyBUaGUgb3B0aW9uIFtjdHlwZT1DT1JEXSBtYXkgYmUgYXBwbGllZCB0byBhIG5vbi1yZXBlYXRlZCBmaWVsZCBvZiB0eXBlCiAiYnl0ZXMiLiBJdCBpbmRpY2F0ZXMgdGhhdCBpbiBDKyssIHRoZSBkYXRhIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBDb3JkCiBpbnN0ZWFkIG9mIGEgc3RyaW5nLiAgRm9yIHZlcnkgbGFyZ2Ugc3RyaW5ncywgdGhpcyBtYXkgcmVkdWNlIG1lbW9yeQogZnJhZ21lbnRhdGlvbi4gSXQgbWF5IGFsc28gYWxsb3cgYmV0dGVyIHBlcmZvcm1hbmNlIHdoZW4gcGFyc2luZyBmcm9tIGEKIENvcmQsIG9yIHdoZW4gcGFyc2luZyB3aXRoIGFsaWFzaW5nIGVuYWJsZWQsIGFzIHRoZSBwYXJzZWQgQ29yZCBtYXkgdGhlbgogYWxpYXMgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KCg8KBwQMBAACAQESBKwFBAgKDwoHBAwEAAIBAhIErAULDAoOCgYEDAQAAgISBK4FBBUKDwoHBAwEAAICARIErgUEEAoPCgcEDAQAAgICEgSuBRMUCtMDCgQEDAIBEgS3BQIbGsQDIFRoZSBwYWNrZWQgb3B0aW9uIGNhbiBiZSBlbmFibGVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIHRvIGVuYWJsZQogYSBtb3JlIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvbiB0aGUgd2lyZS4gUmF0aGVyIHRoYW4gcmVwZWF0ZWRseQogd3JpdGluZyB0aGUgdGFnIGFuZCB0eXBlIGZvciBlYWNoIGVsZW1lbnQsIHRoZSBlbnRpcmUgYXJyYXkgaXMgZW5jb2RlZCBhcwogYSBzaW5nbGUgbGVuZ3RoLWRlbGltaXRlZCBibG9iLiBJbiBwcm90bzMsIG9ubHkgZXhwbGljaXQgc2V0dGluZyBpdCB0bwogZmFsc2Ugd2lsbCBhdm9pZCB1c2luZyBwYWNrZWQgZW5jb2RpbmcuICBUaGlzIG9wdGlvbiBpcyBwcm9oaWJpdGVkIGluCiBFZGl0aW9ucywgYnV0IHRoZSBgcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmdgIGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gY29udHJvbAogdGhlIGJlaGF2aW9yLgoKDQoFBAwCAQQSBLcFAgoKDQoFBAwCAQUSBLcFCw8KDQoFBAwCAQESBLcFEBYKDQoFBAwCAQMSBLcFGRoKmgUKBAQMAgISBMQFAjMaiwUgVGhlIGpzdHlwZSBvcHRpb24gZGV0ZXJtaW5lcyB0aGUgSmF2YVNjcmlwdCB0eXBlIHVzZWQgZm9yIHZhbHVlcyBvZiB0aGUKIGZpZWxkLiAgVGhlIG9wdGlvbiBpcyBwZXJtaXR0ZWQgb25seSBmb3IgNjQgYml0IGludGVncmFsIGFuZCBmaXhlZCB0eXBlcwogKGludDY0LCB1aW50NjQsIHNpbnQ2NCwgZml4ZWQ2NCwgc2ZpeGVkNjQpLiAgQSBmaWVsZCB3aXRoIGpzdHlwZSBKU19TVFJJTkcKIGlzIHJlcHJlc2VudGVkIGFzIEphdmFTY3JpcHQgc3RyaW5nLCB3aGljaCBhdm9pZHMgbG9zcyBvZiBwcmVjaXNpb24gdGhhdAogY2FuIGhhcHBlbiB3aGVuIGEgbGFyZ2UgdmFsdWUgaXMgY29udmVydGVkIHRvIGEgZmxvYXRpbmcgcG9pbnQgSmF2YVNjcmlwdC4KIFNwZWNpZnlpbmcgSlNfTlVNQkVSIGZvciB0aGUganN0eXBlIGNhdXNlcyB0aGUgZ2VuZXJhdGVkIEphdmFTY3JpcHQgY29kZSB0bwogdXNlIHRoZSBKYXZhU2NyaXB0ICJudW1iZXIiIHR5cGUuICBUaGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgb3B0aW9uCiBKU19OT1JNQUwgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LgoKIFRoaXMgb3B0aW9uIGlzIGFuIGVudW0gdG8gcGVybWl0IGFkZGl0aW9uYWwgdHlwZXMgdG8gYmUgYWRkZWQsIGUuZy4KIGdvb2cubWF0aC5JbnRlZ2VyLgoKDQoFBAwCAgQSBMQFAgoKDQoFBAwCAgYSBMQFCxEKDQoFBAwCAgESBMQFEhgKDQoFBAwCAgMSBMQFGxwKDQoFBAwCAggSBMQFHTIKDQoFBAwCAgcSBMQFHjEKDgoEBAwEARIGxQUCzgUDCg0KBQQMBAEBEgTFBQcNCicKBgQMBAECABIExwUEEhoXIFVzZSB0aGUgZGVmYXVsdCB0eXBlLgoKDwoHBAwEAQIAARIExwUEDQoPCgcEDAQBAgACEgTHBRARCikKBgQMBAECARIEygUEEhoZIFVzZSBKYXZhU2NyaXB0IHN0cmluZ3MuCgoPCgcEDAQBAgEBEgTKBQQNCg8KBwQMBAECAQISBMoFEBEKKQoGBAwEAQICEgTNBQQSGhkgVXNlIEphdmFTY3JpcHQgbnVtYmVycy4KCg8KBwQMBAECAgESBM0FBA0KDwoHBAwEAQICAhIEzQUQEQqZCgoEBAwCAxIE5gUCKxqKCiBTaG91bGQgdGhpcyBmaWVsZCBiZSBwYXJzZWQgbGF6aWx5PyAgTGF6eSBhcHBsaWVzIG9ubHkgdG8gbWVzc2FnZS10eXBlCiBmaWVsZHMuICBJdCBtZWFucyB0aGF0IHdoZW4gdGhlIG91dGVyIG1lc3NhZ2UgaXMgaW5pdGlhbGx5IHBhcnNlZCwgdGhlCiBpbm5lciBtZXNzYWdlJ3MgY29udGVudHMgd2lsbCBub3QgYmUgcGFyc2VkIGJ1dCBpbnN0ZWFkIHN0b3JlZCBpbiBlbmNvZGVkCiBmb3JtLiAgVGhlIGlubmVyIG1lc3NhZ2Ugd2lsbCBhY3R1YWxseSBiZSBwYXJzZWQgd2hlbiBpdCBpcyBmaXJzdCBhY2Nlc3NlZC4KCiBUaGlzIGlzIG9ubHkgYSBoaW50LiAgSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZQogZWFnZXIgb3IgbGF6eSBwYXJzaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uLiAgSG93ZXZlciwKIHNldHRpbmcgdGhpcyBvcHRpb24gdHJ1ZSBzdWdnZXN0cyB0aGF0IHRoZSBwcm90b2NvbCBhdXRob3IgYmVsaWV2ZXMgdGhhdAogdXNpbmcgbGF6eSBwYXJzaW5nIG9uIHRoaXMgZmllbGQgaXMgd29ydGggdGhlIGFkZGl0aW9uYWwgYm9va2tlZXBpbmcKIG92ZXJoZWFkIHR5cGljYWxseSBuZWVkZWQgdG8gaW1wbGVtZW50IGl0LgoKIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhbnkgZ2VuZXJhdGVkIGNvZGU7CiBhbGwgbWV0aG9kIHNpZ25hdHVyZXMgcmVtYWluIHRoZSBzYW1lLiAgRnVydGhlcm1vcmUsIHRocmVhZC1zYWZldHkgb2YgdGhlCiBpbnRlcmZhY2UgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgb3B0aW9uOyBjb25zdCBtZXRob2RzIHJlbWFpbiBzYWZlIHRvCiBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHdoaWxlIG5vbi1jb25zdCBtZXRob2RzIGNvbnRpbnVlCiB0byByZXF1aXJlIGV4Y2x1c2l2ZSBhY2Nlc3MuCgogTm90ZSB0aGF0IGxhenkgbWVzc2FnZSBmaWVsZHMgYXJlIHN0aWxsIGVhZ2VybHkgdmVyaWZpZWQgdG8gY2hlY2sKIGlsbC1mb3JtZWQgd2lyZWZvcm1hdCBvciBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4gQ2FsbGluZyBJc0luaXRpYWxpemVkKCkKIG9uIHRoZSBvdXRlciBtZXNzYWdlIHdvdWxkIGZhaWwgaWYgdGhlIGlubmVyIG1lc3NhZ2UgaGFzIG1pc3NpbmcgcmVxdWlyZWQKIGZpZWxkcy4gRmFpbGVkIHZlcmlmaWNhdGlvbiB3b3VsZCByZXN1bHQgaW4gcGFyc2luZyBmYWlsdXJlIChleGNlcHQgd2hlbgogdW5pbml0aWFsaXplZCBtZXNzYWdlcyBhcmUgYWNjZXB0YWJsZSkuCgoNCgUEDAIDBBIE5gUCCgoNCgUEDAIDBRIE5gULDwoNCgUEDAIDARIE5gUQFAoNCgUEDAIDAxIE5gUXGAoNCgUEDAIDCBIE5gUZKgoNCgUEDAIDBxIE5gUaKQqvAQoEBAwCBBIE6wUCNxqgASB1bnZlcmlmaWVkX2xhenkgZG9lcyBubyBjb3JyZWN0bmVzcyBjaGVja3Mgb24gdGhlIGJ5dGUgc3RyZWFtLiBUaGlzIHNob3VsZAogb25seSBiZSB1c2VkIHdoZXJlIGxhenkgd2l0aCB2ZXJpZmljYXRpb24gaXMgcHJvaGliaXRpdmUgZm9yIHBlcmZvcm1hbmNlCiByZWFzb25zLgoKDQoFBAwCBAQSBOsFAgoKDQoFBAwCBAUSBOsFCw8KDQoFBAwCBAESBOsFEB8KDQoFBAwCBAMSBOsFIiQKDQoFBAwCBAgSBOsFJTYKDQoFBAwCBAcSBOsFJjUK6AEKBAQMAgUSBPEFAjEa2QEgSXMgdGhpcyBmaWVsZCBkZXByZWNhdGVkPwogRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwogZm9yIGFjY2Vzc29ycywgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LCB0aGlzCiBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpZWxkcy4KCg0KBQQMAgUEEgTxBQIKCg0KBQQMAgUFEgTxBQsPCg0KBQQMAgUBEgTxBRAaCg0KBQQMAgUD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iAcfMwoNCgUEDwIEAxIEiAc2OQpaCgMEDwUSBIsHAhkaTSBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KCgwKBAQPBQASBIsHDRgKDQoFBA8FAAESBIsHDREKDQoFBA8FAAISBIsHFRgKDAoCBBASBo4HAKYHAQoLCgMEEAESBI4HCBYKkQIKBAQQAgASBJQHAiQaggIgQW55IGZlYXR1cmVzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljIGVkaXRpb24uCiBXQVJOSU5HOiBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9idWYgcGx1Z2lucyBvciBzcGVjaWFsCiBjYXNlcyBsaWtlIHRoZSBwcm90byBjb21waWxlci4gT3RoZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBBACAAQSBJQHAgoKDQoFBBACAAYSBJQHCxUKDQoFBBACAAESBJQHFh4KDQoFBBACAAMSBJQHISMK2QMKBAQQAgESBJ8HAjIa3wEgSXMgdGhpcyBzZXJ2aWNlIGRlcHJlY2F0ZWQ/CiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCiBmb3IgdGhlIHNlcnZpY2UsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwKIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBzZXJ2aWNlcy4KMugBIE5vdGU6ICBGaWVsZCBudW1iZXJzIDEgdGhyb3VnaCAzMiBhcmUgcmVzZXJ2ZWQgZm9yIEdvb2dsZSdzIGludGVybmFsIFJQQwogICBmcmFtZXdvcmsuICBXZSBhcG9sb2dpemUgZm9yIGhvYXJkaW5nIHRoZXNlIG51bWJlcnMgdG8gb3Vyc2Vs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ZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBBECAgQSBMQHAgoKDQoFBBECAgYSBMQHCxUKDQoFBBECAgESBMQHFh4KDQoFBBECAgMSBMQHISMKTwoEBBECAxIExwcCOhpBIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgoKDQoFBBECAwQSBMcHAgoKDQoFBBECAwYSBMcHCx4KDQoFBBECAwESBMcHHzMKDQoFBBECAwMSBMcHNjkKWgoDBBEFEgTKBwIZGk0gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCgoMCgQEEQUAEgTKBw0YCg0KBQQRBQABEgTKBw0RCg0KBQQRBQACEgTKBxUYCosDCgIEEhIG0wcA5wcBGvwCIEEgbWVzc2FnZSByZXByZXNlbnRpbmcgYSBvcHRpb24gdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgb25seQogYXBwZWFycyBpbiBvcHRpb25zIHByb3RvcyBjcmVhdGVkIGJ5IHRoZSBjb21waWxlcjo6UGFyc2VyIGNsYXNzLgogRGVzY3JpcHRvclBvb2wgcmVzb2x2ZXMgdGhlc2Ugd2hlbiBidWlsZGluZyBEZXNjcmlwdG9yIG9iamVjdHMuIFRoZXJlZm9yZSwKIG9wdGlvbnMgcHJvdG9zIGluIGRlc2NyaXB0b3Igb2JqZWN0cyAoZS5nLiByZXR1cm5lZCBieSBEZXNjcmlwdG9yOjpvcHRpb25zKCksCiBvciBwcm9kdWNlZCBieSBEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBuZXZlciBoYXZlIFVuaW50ZXJwcmV0ZWRPcHRpb25zCiBpbiB0aGVtLgoKCwoDBBIBEgTTBwgbCssCCgQEEgMAEgbZBwLcBwMaugIgVGhlIG5hbWUgb2YgdGhlIHVuaW50ZXJwcmV0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bWluaW11bSBzdXBwb3J0ZWQgZWRpdGlvbiAoaW5jbHVzaXZlKSB3aGVuIHRoaXMgd2FzIGNvbnN0cnVjdGVkLgogRWRpdGlvbnMgYmVmb3JlIHRoaXMgd2lsbCBub3QgaGF2ZSBkZWZhdWx0cy4KCg0KBQQUAgEEEgTDCQIKCg0KBQQUAgEGEgTDCQsSCg0KBQQUAgEBEgTDCRMiCg0KBQQUAgEDEgTDCSUmCoYBCgQEFAICEgTHCQInGnggVGhlIG1heGltdW0ga25vd24gZWRpdGlvbiAoaW5jbHVzaXZlKSB3aGVuIHRoaXMgd2FzIGNvbnN0cnVjdGVkLiBFZGl0aW9ucwogYWZ0ZXIgdGhpcyB3aWxsIG5vdCBoYXZlIHJlbGlhYmxlIGRlZmF1bHRzLgoKDQoFBBQCAgQSBMcJAgoKDQoFBBQCAgYSBMcJCxIKDQoFBBQCAgESBMcJEyIKDQoFBBQCAgMSBMcJJSYK2gEKAgQVEgbPCQDXCgEaaiBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIGZyb20gd2hpY2ggYQogRmlsZURlc2NyaXB0b3JQcm90byB3YXMgZ2VuZXJhdGVkLgoyYCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBPcHRpb25hbCBzb3VyY2UgY29kZSBpbmZvCgoLCgMEFQESBM8JCBYKghEKBAQVAgASBPsJAiEa8xAgQSBMb2NhdGlvbiBpZGVudGlmaWVzIGEgcGllY2Ugb2Ygc291cmNlIGNvZGUgaW4gYSAucHJvdG8gZmlsZSB3aGljaAogY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGRlZmluaXRpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkCiB0byBiZSB1c2VmdWwgdG8gSURFcywgY29kZSBpbmRleGVycywgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3JzLCBhbmQgc2ltaWxhcgogdG9vbHMuCgogRm9yIGV4YW1wbGUsIHNheSB3ZSBoYXZlIGEgZmlsZSBsaWtlOgogICBtZXNzYWdlIEZvbyB7CiAgICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CiAgIH0KIExldCdzIGxvb2sgYXQganVzdCB0aGUgZmllbGQgZGVmaW5pdGlvbjoKICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CiAgIF4gICAgICAgXl4gICAgIF5eICBeICBeXl4KICAgYSAgICAgICBiYyAgICAgZGUgIGYgIGdoaQogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKICAgc3BhbiAgIHBhdGggICAgICAgICAgICAgICByZXByZXNlbnRzCiAgIFthLGkpICBbIDQsIDAsIDIsIDAgXSAgICAgVGhlIHdob2xlIGZpZWxkIGRlZmluaXRpb24uCiAgIFthLGIpICBbIDQsIDAsIDIsIDAsIDQgXSAgVGhlIGxhYmVsIChvcHRpb25hbCkuCiAgIFtjLGQpICBbIDQsIDAsIDIsIDAsIDUgXSAgVGhlIHR5cGUgKHN0cmluZykuCiAgIFtlLGYpICBbIDQsIDAsIDIsIDAsIDEgXSAgVGhlIG5hbWUgKGZvbykuCiAgIFtnLGgpICBbIDQsIDAsIDIsIDAsIDMgXSAgVGhlIG51bWJlciAoMSkuCgogTm90ZXM6CiAtIEEgbG9jYXRpb24gbWF5IHJlZmVyIHRvIGEgcmVwZWF0ZWQgZmllbGQgaXRzZWxmIChpLmUuIG5vdCB0byBhbnkKICAgcGFydGljdWxhciBpbmRleCB3aXRoaW4gaXQpLiAgVGhpcyBpcyB1c2VkIHdoZW5ldmVyIGEgc2V0IG9mIGVsZW1lbnRzIGFyZQogICBsb2dpY2FsbHkgZW5jbG9zZWQgaW4gYSBzaW5nbGUgY29kZSBzZWdtZW50LiAgRm9yIGV4YW1wbGUsIGFuIGVudGlyZQogICBleHRlbmQgYmxvY2sgKHBvc3NpYmx5IGNvbnRhaW5pbmcgbXVsdGlwbGUgZXh0ZW5zaW9uIGRlZmluaXRpb25zKSB3aWxsCiAgIGhhdmUgYW4gb3V0ZXIgbG9jYXRpb24gd2hvc2UgcGF0aCByZWZlcnMgdG8gdGhlICJleHRlbnNpb25zIiByZXBlYXRlZAogICBmaWVsZCB3aXRob3V0IGFuIGluZGV4LgogLSBNdWx0aXBsZSBsb2NhdGlvbnMgbWF5IGhhdmUgdGhlIHNhbWUgcGF0aC4gIFRoaXMgaGFwcGVucyB3aGVuIGEgc2luZ2xlCiAgIGxvZ2ljYWwgZGVjbGFyYXRpb24gaXMgc3ByZWFkIG91dCBhY3Jvc3MgbXVsdGlwbGUgcGxhY2VzLiAgVGhlIG1vc3QKICAgb2J2aW91cyBleGFtcGxlIGlzIHRoZSAiZXh0ZW5kIiBibG9jayBhZ2FpbiAtLSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUKICAgZXh0ZW5kIGJsb2NrcyBpbiB0aGUgc2FtZSBzY29wZSwgZWFjaCBvZiB3aGljaCB3aWxsIGhhdmUgdGhlIHNhbWUgcGF0aC4KIC0gQSBsb2NhdGlvbidzIHNwYW4gaXMgbm90IGFsd2F5cyBhIHN1YnNldCBvZiBpdHMgcGFyZW50J3Mgc3Bhbi4gIEZvcgogICBleGFtcGxlLCB0aGUgImV4dGVuZGVlIiBvZiBhbiBleHRlbnNpb24gZGVjbGFyYXRpb24gYXBwZWFycyBhdCB0aGUKICAgYmVnaW5uaW5nIG9mIHRoZSAiZXh0ZW5kIiBibG9jayBhbmQgaXMgc2hhcmVkIGJ5IGFsbCBleHRlbnNpb25zIHdpdGhpbgogICB0aGUgYmxvY2suCiAtIEp1c3QgYmVjYXVzZSBhIGxvY2F0aW9uJ3Mgc3BhbiBpcyBhIHN1YnNldCBvZiBzb21lIG90aGVyIGxvY2F0aW9uJ3Mgc3BhbgogICBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgaXMgYSBkZXNjZW5kYW50LiAgRm9yIGV4YW1wbGUsIGEgImdyb3VwIiBkZWZpbmVzCiAgIGJvdGggYSB0eXBlIGFuZCBhIGZpZWxkIGluIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgVGh1cywgdGhlIGxvY2F0aW9ucwogICBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGFuZCBmaWVsZCBhbmQgdGhlaXIgY29tcG9uZW50cyB3aWxsIG92ZXJsYXAuCiAtIENvZGUgd2hpY2ggdHJpZXMgdG8gaW50ZXJwcmV0IGxvY2F0aW9ucyBzaG91bGQgcHJvYmFibHkgYmUgZGVzaWduZWQgdG8KICAgaWdub3JlIHRob3NlIHRoYXQgaXQgZG9lc24ndCB1bmRlcnN0YW5kLCBhcyBtb3JlIHR5cGVzIG9mIGxvY2F0aW9ucyBjb3VsZAogICBiZSByZWNvcmRlZCBpbiB0aGUgZnV0dXJlLgoKDQoFBBUCAAQSBPsJAgoKDQoFBBUCAAYSBPsJCxMKDQoFBBUCAAESBPsJFBwKDQoFBBUCAAMSBPsJHyAKDgoEBBUDABIG/AkCzwoDCg0KBQQVAwABEgT8CQoSCooHCgYEFQMAAgASBJQKBCwa+QYgSWRlbnRpZmllcyB3aGljaCBwYXJ0IG9mIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHdhcyBkZWZpbmVkIGF0IHRoaXMKIGxvY2F0aW9uLgoKIEVhY2ggZWxlbWVudCBpcyBhIGZpZWxkIG51bWJlciBvciBhbiBpbmRleC4gIFRoZXkgZm9ybSBhIHBhdGggZnJvbQogdGhlIHJvb3QgRmlsZURlc2NyaXB0b3JQcm90byB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIGRlZmluaXRpb24gYXBwZWFycy4KIEZvciBleGFtcGxlLCB0aGlzIHBhdGg6CiAgIFsgNCwgMywgMiwgNywgMSBdCiByZWZlcnMgdG86CiAgIGZpbGUubWVzc2FnZV90eXBlKDMpICAvLyA0LCAzCiAgICAgICAuZmllbGQoNykgICAgICAgICAvLyAyLCA3CiAgICAgICAubmFtZSgpICAgICAgICAgICAvLyAxCiBUaGlzIGlzIGJlY2F1c2UgRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUgaGFzIGZpZWxkIG51bWJlciA0OgogICByZXBlYXRlZCBEZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKIGFuZCBEZXNjcmlwdG9yUHJvdG8uZmllbGQgaGFzIGZpZWxkIG51bWJlciAyOgogICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CiBhbmQgRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSBoYXMgZmllbGQgbnVtYmVyIDE6CiAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKCiBUaHVzLCB0aGUgYWJvdmUgcGF0aCBnaXZlcyB0aGUgbG9jYXRpb24gb2YgYSBmaWVsZCBuYW1lLiAgSWYgd2UgcmVtb3ZlZAogdGhlIGxhc3QgZWxlbWVudDoKICAgWyA0LCAzLCAyLCA3IF0KIHRoaXMgcGF0aCByZWZlcnMgdG8gdGhlIHdob2xlIGZpZWxkIGRlY2xhcmF0aW9uIChmcm9tIHRoZSBiZWdpbm5pbmcKIG9mIHRoZSBsYWJlbCB0byB0aGUgdGVybWluYXRpbmcgc2VtaWNvbG9uKS4KCg8KBwQVAwACAAQSBJQKBAwKDwoHBBUDAAIABRIElAoNEgoPCgcEFQMAAgABEgSUChMXCg8KBwQVAwACAAMSBJQKGhsKDwoHBBUDAAIACBIElAocKwoQCggEFQMAAgAIAhIElAodKgrSAgoGBBUDAAIBEgSbCgQsGsECIEFsd2F5cyBoYXMgZXhhY3RseSB0aHJlZSBvciBmb3VyIGVsZW1lbnRzOiBzdGFydCBsaW5lLCBzdGFydCBjb2x1bW4sCiBlbmQgbGluZSAob3B0aW9uYWwsIG90aGVyd2lzZSBhc3N1bWVkIHNhbWUgYXMgc3RhcnQgbGluZSksIGVuZCBjb2x1bW4uCiBUaGVzZSBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgZmllbGQgZm9yIGVmZmljaWVuY3kuICBOb3RlIHRoYXQgbGluZQogYW5kIGNvbHVtbiBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkIC0tIHR5cGljYWxseSB5b3Ugd2lsbCB3YW50IHRvIGFkZAogMSB0byBlYWNoIGJlZm9yZSBkaXNwbGF5aW5nIHRvIGEgdXNlci4KCg8KBwQVAwACAQQSBJsKBAwKDwoHBBUDAAIBBRIEmwoNEgoPCgcEFQMAAgEBEgSbChMXCg8KBwQVAwACAQMSBJsKGhsKDwoHBBUDAAIBCBIEmwocKwoQCggEFQMAAgEIAhIEmwodKgqlDAoGBBUDAAICEgTMCgQpGpQMIElmIHRoaXMgU291cmNlQ29kZUluZm8gcmVwcmVzZW50cyBhIGNvbXBsZXRlIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgYW55CiBjb21tZW50cyBhcHBlYXJpbmcgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjbGFyYXRpb24gd2hpY2ggYXBwZWFyIHRvIGJlCiBhdHRhY2hlZCB0byB0aGUgZGVjbGFyYXRpb24uCgogQSBzZXJpZXMgb2YgbGluZSBjb21tZW50cyBhcHBlYXJpbmcgb24gY29uc2VjdXRpdmUgbGluZXMsIHdpdGggbm8gb3RoZXIKIHRva2VucyBhcHBlYXJpbmcgb24gdGhvc2UgbGluZXMsIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNpbmdsZSBjb21tZW50LgoKIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgd2lsbCBrZWVwIHBhcmFncmFwaHMgb2YgY29tbWVudHMgdGhhdCBhcHBlYXIKIGJlZm9yZSAoYnV0IG5vdCBjb25uZWN0ZWQgdG8pIHRoZSBjdXJyZW50IGVsZW1lbnQuIEVhY2ggcGFyYWdyYXBoLAogc2VwYXJhdGVkIGJ5IGVtcHR5IGxpbmVzLCB3aWxsIGJlIG9uZSBjb21tZW50IGVsZW1lbnQgaW4gdGhlIHJlcGVhdGVkCiBmaWVsZC4KCiBPbmx5IHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcHJvdmlkZWQ7IGNvbW1lbnQgbWFya2VycyAoZS5nLiAvLykgYXJlCiBzdHJpcHBlZCBvdXQuICBGb3IgYmxvY2sgY29tbWVudHMsIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgYW4gYXN0ZXJpc2sKIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvdGhlciB0aGFuIHRoZSBmaXJzdC4KIE5ld2xpbmVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgoKIEV4YW1wbGVzOgoKICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gZm9vLgogICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhci4KICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMjsKCiAgIG9wdGlvbmFsIHN0cmluZyBiYXogPSAzOwogICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhei4KICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIGJhei4KCiAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gbW9vLgogICAv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Z2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKCAoBAhIDIAAYCggKAQgSAyIAHwoJCgIIHxIDIgAfCggKAQgSAyMASAoJCgIICxIDIwBICggKAQgSAyQALAoJCgIIARIDJAAsCggKAQgSAyUALgoJCgIICBIDJQAuCggKAQgSAyYAIgoJCgIIChIDJgAiCggKAQgSAycAIQoJCgIIJBIDJwAhCggKAQgSAygAOwoJCgIIJRIDKAA7Cp0QCgIEABIEZQByARqQECBBIER1cmF0aW9uIHJlcHJlc2VudHMgYSBzaWduZWQsIGZpeGVkLWxlbmd0aCBzcGFuIG9mIHRpbWUgcmVwcmVzZW50ZWQKIGFzIGEgY291bnQgb2Ygc2Vjb25kcyBhbmQgZnJhY3Rpb25zIG9mIHNlY29uZHMgYXQgbmFub3NlY29uZAogcmVzb2x1dGlvbi4gSXQgaXMgaW5kZXBlbmRlbnQgb2YgYW55IGNhbGVuZGFyIGFuZCBjb25jZXB0cyBsaWtlICJkYXkiCiBvciAibW9udGgiLiBJdCBpcyByZWxhdGVkIHRvIFRpbWVzdGFtcCBpbiB0aGF0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KIHR3byBUaW1lc3RhbXAgdmFsdWVzIGlzIGEgRHVyYXRpb24gYW5kIGl0IGNhbiBiZSBhZGRlZCBvciBzdWJ0cmFjdGVkCiBmcm9tIGEgVGltZXN0YW1wLiBSYW5nZSBpcyBhcHByb3hpbWF0ZWx5ICstMTAsMDAwIHllYXJzLgoKICMgRXhhbXBsZXMKCiBFeGFtcGxlIDE6IENvbXB1dGUgRHVyYXRpb24gZnJvbSB0d28gVGltZXN0YW1wcyBpbiBwc2V1ZG8gY29kZS4KCiAgICAgVGltZXN0YW1wIHN0YXJ0ID0gLi4uOwogICAgIFRpbWVzdGFtcCBlbmQgPSAuLi47CiAgICAgRHVyYXRpb24gZHVyYXRpb24gPSAuLi47CgogICAgIGR1cmF0aW9uLnNlY29uZHMgPSBlbmQuc2Vjb25kcyAtIHN0YXJ0LnNlY29uZHM7CiAgICAgZHVyYXRpb24ubmFub3MgPSBlbmQubmFub3MgLSBzdGFydC5uYW5vczsKCiAgICAgaWYgKGR1cmF0aW9uLnNlY29uZHMgPCAwICYmIGR1cmF0aW9uLm5hbm9zID4gMCkgewogICAgICAgZHVyYXRpb24uc2Vjb25kcyArPSAxOwogICAgICAgZHVyYXRpb24ubmFub3MgLT0gMTAwMDAwMDAwMDsKICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uLnNlY29uZHMgPiAwICYmIGR1cmF0aW9uLm5hbm9zIDwgMCkgewogICAgICAgZHVyYXRpb24uc2Vjb25kcyAtPSAxOwogICAgICAgZHVyYXRpb24ubmFub3MgKz0gMTAwMDAwMDAwMDsKICAgICB9CgogRXhhbXBsZSAyOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFRpbWVzdGFtcCArIER1cmF0aW9uIGluIHBzZXVkbyBjb2RlLgoKICAgICBUaW1lc3RhbXAgc3RhcnQgPSAuLi47CiAgICAgRHVyYXRpb24gZHVyYXRpb24gPSAuLi47CiAgICAgVGltZXN0YW1wIGVuZCA9IC4uLjsKCiAgICAgZW5kLnNlY29uZHMgPSBzdGFydC5zZWNvbmRzICsgZHVyYXRpb24uc2Vjb25kczsKICAgICBlbmQubmFub3MgPSBzdGFydC5uYW5vcyArIGR1cmF0aW9uLm5hbm9zOwoKICAgICBpZiAoZW5kLm5hbm9zIDwgMCkgewogICAgICAgZW5kLnNlY29uZHMgLT0gMTsKICAgICAgIGVuZC5uYW5vcyArPSAxMDAwMDAwMDAwOwogICAgIH0gZWxzZSBpZiAoZW5kLm5hbm9zID49IDEwMDAwMDAwMDApIHsKICAgICAgIGVuZC5zZWNvbmRzICs9IDE7CiAgICAgICBlbmQubmFub3MgLT0gMTAwMDAwMDAwMDsKICAgICB9CgogRXhhbXBsZSAzOiBDb21wdXRlIER1cmF0aW9uIGZyb20gZGF0ZXRpbWUudGltZWRlbHRhIGluIFB5dGhvbi4KCiAgICAgdGQgPSBkYXRldGltZS50aW1lZGVsdGEoZGF5cz0zLCBtaW51dGVzPTEwKQogICAgIGR1cmF0aW9uID0gRHVyYXRpb24oKQogICAgIGR1cmF0aW9uLkZyb21UaW1lZGVsdGEodGQpCgogIyBKU09OIE1hcHBpbmcKCiBJbiBKU09OIGZvcm1hdCwgdGhlIER1cmF0aW9uIHR5cGUgaXMgZW5jb2RlZCBhcyBhIHN0cmluZyByYXRoZXIgdGhhbiBhbgogb2JqZWN0LCB3aGVyZSB0aGUgc3RyaW5nIGVuZHMgaW4gdGhlIHN1ZmZpeCAicyIgKGluZGljYXRpbmcgc2Vjb25kcykgYW5kCiBpcyBwcmVjZWRlZCBieSB0aGUgbnVtYmVyIG9mIHNlY29uZHMsIHdpdGggbmFub3NlY29uZHMgZXhwcmVzc2VkIGFzCiBmcmFjdGlvbmFsIHNlY29uZHMuIEZvciBleGFtcGxlLCAzIHNlY29uZHMgd2l0aCAwIG5hbm9zZWNvbmRzIHNob3VsZCBiZQogZW5jb2RlZCBpbiBKU09OIGZvcm1hdCBhcyAiM3MiLCB3aGlsZSAzIHNlY29uZHMgYW5kIDEgbmFub3NlY29uZCBzaG91bGQKIGJlIGV4cHJlc3NlZCBpbiBKU09OIGZvcm1hdCBhcyAiMy4wMDAwMDAwMDFzIiwgYW5kIDMgc2Vjb25kcyBhbmQgMQogbWljcm9zZWNvbmQgc2hvdWxkIGJlIGV4cHJlc3NlZCBpbiBKU09OIGZvcm1hdCBhcyAiMy4wMDAwMDFzIi4KCgoKCgMEAAESA2UIEArcAQoEBAACABIDaQIUGs4BIFNpZ25lZCBzZWNvbmRzIG9mIHRoZSBzcGFuIG9mIHRpbWUuIE11c3QgYmUgZnJvbSAtMzE1LDU3NiwwMDAsMDAwCiB0byArMzE1LDU3NiwwMDAsMDAwIGluY2x1c2l2ZS4gTm90ZTogdGhlc2UgYm91bmRzIGFyZSBjb21wdXRlZCBmcm9tOgogNjAgc2VjL21pbiAqIDYwIG1pbi9ociAqIDI0IGhyL2RheSAqIDM2NS4yNSBkYXlzL3llYXIgKiAxMDAwMCB5ZWFycwoKDAoFBAACAAUSA2kCBwoMCgUEAAIAARIDaQgPCgwKBQQAAgADEgNpEhMKgwMKBAQAAgESA3ECEhr1AiBTaWduZWQgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBvZiB0aGUgc3Bhbgogb2YgdGltZS4gRHVyYXRpb25zIGxlc3MgdGhhbiBvbmUgc2Vjb25kIGFyZSByZXByZXNlbnRlZCB3aXRoIGEgMAogYHNlY29uZHNgIGZpZWxkIGFuZCBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGBuYW5vc2AgZmllbGQuIEZvciBkdXJhdGlvbnMKIG9mIG9uZSBzZWNvbmQgb3IgbW9yZSwgYSBub24temVybyB2YWx1ZSBmb3IgdGhlIGBuYW5vc2AgZmllbGQgbXVzdCBiZQogb2YgdGhlIHNhbWUgc2lnbiBhcyB0aGUgYHNlY29uZHNgIGZpZWxkLiBNdXN0IGJlIGZyb20gLTk5OSw5OTksOTk5CiB0byArOTk5LDk5OSw5OTkgaW5jbHVzaXZlLgoKDAoFBAACAQUSA3ECBwoMCgUEAAIBARIDcQgNCgwKBQQAAgEDEgNxEBFiBnByb3RvMwqKPQogZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIhCglGaWVsZE1hc2sSFAoFcGF0aHMYASADKAlSBXBhdGhzQoUBChNjb20uZ29vZ2xlLnByb3RvYnVmQg5GaWVsZE1hc2tQcm90b1ABWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9maWVsZG1hc2twYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc0qhOwoHEgUeAPQBAQrMDAoBDBIDHgASMsEMIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKCAoBAhIDIAAYCggKAQgSAyIALAoJCgIIARIDIgAsCggKAQgSAyMALwoJCgIICBIDIwAvCggKAQgSAyQAIgoJCgIIChIDJAAiCggKAQgSAyUAIQoJCgIIJBIDJQAhCggKAQgSAyYAOwoJCgIIJRIDJgA7CggKAQgSAycASQoJCgIICxIDJwBJCggKAQgSAygAHwoJCgIIHxIDKAAfCrIsCgIEABIG8QEA9AEBGqMsIGBGaWVsZE1hc2tgIHJlcHJlc2VudHMgYSBzZXQgb2Ygc3ltYm9saWMgZmllbGQgcGF0aHMsIGZvciBleGFtcGxlOgoKICAgICBwYXRoczogImYuYSIKICAgICBwYXRoczogImYuYi5kIgoKIEhlcmUgYGZgIHJlcHJlc2VudHMgYSBmaWVsZCBpbiBzb21lIHJvb3QgbWVzc2FnZSwgYGFgIGFuZCBgYmAKIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBmb3VuZCBpbiBgZmAsIGFuZCBgZGAgYSBmaWVsZCBmb3VuZCBpbiB0aGUKIG1lc3NhZ2UgaW4gYGYuYmAuCgogRmllbGQgbWFza3MgYXJlIHVzZWQgdG8gc3BlY2lmeSBhIHN1YnNldCBvZiBmaWVsZHMgdGhhdCBzaG91bGQgYmUKIHJldHVybmVkIGJ5IGEgZ2V0IG9wZXJhdGlvbiBvciBtb2RpZmllZCBieSBhbiB1cGRhdGUgb3BlcmF0aW9uLgogRmllbGQgbWFza3MgYWxzbyBoYXZlIGEgY3VzdG9tIEpTT04gZW5jb2RpbmcgKHNlZSBiZWxvdykuCgogIyBGaWVsZCBNYXNrcyBpbiBQcm9qZWN0aW9ucwoKIFdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhIHByb2plY3Rpb24sIGEgcmVzcG9uc2UgbWVzc2FnZSBvcgogc3ViLW1lc3NhZ2UgaXMgZmlsdGVyZWQgYnkgdGhlIEFQSSB0byBvbmx5IGNvbnRhaW4gdGhvc2UgZmllbGRzIGFzCiBzcGVjaWZpZWQgaW4gdGhlIG1hc2suIEZvciBleGFtcGxlLCBpZiB0aGUgbWFzayBpbiB0aGUgcHJldmlvdXMKIGV4YW1wbGUgaXMgYXBwbGllZCB0byBhIHJlc3BvbnNlIG1lc3NhZ2UgYXMgZm9sbG93czoKCiAgICAgZiB7CiAgICAgICBhIDogMjIKICAgICAgIGIgewogICAgICAgICBkIDogMQogICAgICAgICB4IDogMgogICAgICAgfQogICAgICAgeSA6IDEzCiAgICAgfQogICAgIHo6IDgKCiBUaGUgcmVzdWx0IHdpbGwgbm90IGNvbnRhaW4gc3BlY2lmaWMgdmFsdWVzIGZvciBmaWVsZHMgeCx5IGFuZCB6CiAodGhlaXIgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGRlZmF1bHQsIGFuZCBvbWl0dGVkIGluIHByb3RvIHRleHQKIG91dHB1dCk6CgoKICAgICBmIHsKICAgICAgIGEgOiAyMgogICAgICAgYiB7CiAgICAgICAgIGQgOiAxCiAgICAgICB9CiAgICAgfQoKIEEgcmVwZWF0ZWQgZmllbGQgaXMgbm90IGFsbG93ZWQgZXhjZXB0IGF0IHRoZSBsYXN0IHBvc2l0aW9uIG9mIGEKIHBhdGhzIHN0cmluZy4KCiBJZiBhIEZpZWxkTWFzayBvYmplY3QgaXMgbm90IHByZXNlbnQgaW4gYSBnZXQgb3BlcmF0aW9uLCB0aGUKIG9wZXJhdGlvbiBhcHBsaWVzIHRvIGFsbCBmaWVsZHMgKGFzIGlmIGEgRmllbGRNYXNrIG9mIGFsbCBmaWVsZHMKIGhhZCBiZWVuIHNwZWNpZmllZCkuCgogTm90ZSB0aGF0IGEgZmllbGQgbWFzayBkb2VzIG5vdCBuZWNlc3NhcmlseSBhcHBseSB0byB0aGUKIHRvcC1sZXZlbCByZXNwb25zZSBtZXNzYWdlLiBJbiBjYXNlIG9mIGEgUkVTVCBnZXQgb3BlcmF0aW9uLCB0aGUKIGZpZWxkIG1hc2sgYXBwbGllcyBkaXJlY3RseSB0byB0aGUgcmVzcG9uc2UsIGJ1dCBpbiBjYXNlIG9mIGEgUkVTVAogbGlzdCBvcGVyYXRpb24sIHRoZSBtYXNrIGluc3RlYWQgYXBwbGllcyB0byBlYWNoIGluZGl2aWR1YWwgbWVzc2FnZQogaW4gdGhlIHJldHVybmVkIHJlc291cmNlIGxpc3QuIEluIGNhc2Ugb2YgYSBSRVNUIGN1c3RvbSBtZXRob2QsCiBvdGhlciBkZWZpbml0aW9ucyBtYXkgYmUgdXNlZC4gV2hlcmUgdGhlIG1hc2sgYXBwbGllcyB3aWxsIGJlCiBjbGVhcmx5IGRvY3VtZW50ZWQgdG9nZXRoZXIgd2l0aCBpdHMgZGVjbGFyYXRpb24gaW4gdGhlIEFQSS4gIEluCiBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvbiB0aGUgcmV0dXJuZWQgcmVzb3VyY2UvcmVzb3VyY2VzIGlzIHJlcXVpcmVkCiBiZWhhdmlvciBmb3IgQVBJcy4KCiAjIEZpZWxkIE1hc2tzIGluIFVwZGF0ZSBPcGVyYXRpb25zCgogQSBmaWVsZCBtYXNrIGluIHVwZGF0ZSBvcGVyYXRpb25zIHNwZWNpZmllcyB3aGljaCBmaWVsZHMgb2YgdGhlCiB0YXJnZXRlZCByZXNvdXJjZSBhcmUgZ29pbmcgdG8gYmUgdXBkYXRlZC4gVGhlIEFQSSBpcyByZXF1aXJlZAogdG8gb25seSBjaGFuZ2UgdGhlIHZhbHVlcyBvZiB0aGUgZmllbGRzIGFzIHNwZWNpZmllZCBpbiB0aGUgbWFzawogYW5kIGxlYXZlIHRoZSBvdGhlcnMgdW50b3VjaGVkLiBJZiBhIHJlc291cmNlIGlzIHBhc3NlZCBpbiB0bwogZGVzY3JpYmUgdGhlIHVwZGF0ZWQgdmFsdWVzLCB0aGUgQVBJIGlnbm9yZXMgdGhlIHZhbHVlcyBvZiBhbGwKIGZpZWxkcyBub3QgY292ZXJlZCBieSB0aGUgbWFzay4KCiBJZiBhIHJlcGVhdGVkIGZpZWxkIGlzIHNwZWNpZmllZCBmb3IgYW4gdXBkYXRlIG9wZXJhdGlvbiwgbmV3IHZhbHVlcyB3aWxsCiBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcgcmVwZWF0ZWQgZmllbGQgaW4gdGhlIHRhcmdldCByZXNvdXJjZS4gTm90ZSB0aGF0CiBhIHJlcGVhdGVkIGZpZWxkIGlzIG9ubHkgYWxsb3dlZCBpbiB0aGUgbGFzdCBwb3NpdGlvbiBvZiBhIGBwYXRoc2Agc3RyaW5nLgoKIElmIGEgc3ViLW1lc3NhZ2UgaXMgc3BlY2lmaWVkIGluIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZCBtYXNrIGZvciBhbgogdXBkYXRlIG9wZXJhdGlvbiwgdGhlbiBuZXcgdmFsdWUgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgZXhpc3Rpbmcgc3ViLW1lc3NhZ2UKIGluIHRoZSB0YXJnZXQgcmVzb3VyY2UuCgogRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSB0YXJnZXQgbWVzc2FnZToKCiAgICAgZiB7CiAgICAgICBiIHsKICAgICAgICAgZDogMQogICAgICAgICB4OiAyCiAgICAgICB9CiAgICAgICBjOiBbMV0KICAgICB9CgogQW5kIGFuIHVwZGF0ZSBtZXNzYWdlOgoKICAgICBmIHsKICAgICAgIGIgewogICAgICAgICBkOiAxMAogICAgICAgfQogICAgICAgYzogWzJdCiAgICAgfQoKIHRoZW4gaWYgdGhlIGZpZWxkIG1hc2sgaXM6CgogIHBhdGhzOiBbImYuYiIsICJmLmMiXQoKIHRoZW4gdGhlIHJlc3VsdCB3aWxsIGJlOgoKICAgICBmIHsKICAgICAgIGIgewogICAgICAgICBkOiAxMAogICAgICAgICB4OiAyCiAgICAgICB9CiAgICAgICBjOiBbMSwgMl0KICAgICB9CgogQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGUgb3B0aW9ucyB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQgYmVoYXZpb3IgZm9yCiByZXBlYXRlZCBhbmQgbWVzc2FnZSBmaWVsZHMuCgogSW4gb3JkZXIgdG8gcmVzZXQgYSBmaWVsZCdzIHZhbHVlIHRvIHRoZSBkZWZhdWx0LCB0aGUgZmllbGQgbXVzdAogYmUgaW4gdGhlIG1hc2sgYW5kIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgcHJvdmlkZWQgcmVzb3VyY2UuCiBIZW5jZSwgaW4gb3JkZXIgdG8gcmVzZXQgYWxsIGZpZWxkcyBvZiBhIHJlc291cmNlLCBwcm92aWRlIGEgZGVmYXVsdAogaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGFuZCBzZXQgYWxsIGZpZWxkcyBpbiB0aGUgbWFzaywgb3IgZG8KIG5vdCBwcm92aWRlIGEgbWFzayBhcyBkZXNjcmliZWQgYmVsb3cuCgogSWYgYSBmaWVsZCBtYXNrIGlzIG5vdCBwcmVzZW50IG9uIHVwZGF0ZSwgdGhlIG9wZXJhdGlvbiBhcHBsaWVzIHRvCiBhbGwgZmllbGRzIChhcyBpZiBhIGZpZWxkIG1hc2sgb2YgYWxsIGZpZWxkcyBoYXMgYmVlbiBzcGVjaWZpZWQpLgogTm90ZSB0aGF0IGluIHRoZSBwcmVzZW5jZSBvZiBzY2hlbWEgZXZvbHV0aW9uLCB0aGlzIG1heSBtZWFuIHRoYXQKIGZpZWxkcyB0aGUgY2xpZW50IGRvZXMgbm90IGtub3cgYW5kIGhhcyB0aGVyZWZvcmUgbm90IGZpbGxlZCBpbnRvCiB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlc2V0IHRvIHRoZWlyIGRlZmF1bHQuIElmIHRoaXMgaXMgdW53YW50ZWQKIGJlaGF2aW9yLCBhIHNwZWNpZmljIHNlcnZpY2UgbWF5IHJlcXVpcmUgYSBjbGllbnQgdG8gYWx3YXlzIHNwZWNpZnkKIGEgZmllbGQgbWFzaywgcHJvZHVjaW5nIGFuIGVycm9yIGlmIG5vdC4KCiBBcyB3aXRoIGdldCBvcGVyYXRpb25zLCB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHdoaWNoCiBkZXNjcmliZXMgdGhlIHVwZGF0ZWQgdmFsdWVzIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZGVwZW5kcyBvbiB0aGUKIG9wZXJhdGlvbiBraW5kLiBJbiBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvZiB0aGUgZmllbGQgbWFzayBpcwogcmVxdWlyZWQgdG8gYmUgaG9ub3JlZCBieSB0aGUgQVBJLgoKICMjIENvbnNpZGVyYXRpb25zIGZvciBIVFRQIFJFU1QKCiBUaGUgSFRUUCBraW5kIG9mIGFuIHVwZGF0ZSBvcGVyYXRpb24gd2hpY2ggdXNlcyBhIGZpZWxkIG1hc2sgbXVzdAogYmUgc2V0IHRvIFBBVENIIGluc3RlYWQgb2YgUFVUIGluIG9yZGVyIHRvIHNhdGlzZnkgSFRUUCBzZW1hbnRpY3MKIChQVVQgbXVzdCBvbmx5IGJlIHVzZWQgZm9yIGZ1bGwgdXBkYXRlcykuCgogIyBKU09OIEVuY29kaW5nIG9mIEZpZWxkIE1hc2tzCgogSW4gSlNPTiwgYSBmaWVsZCBtYXNrIGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgc3RyaW5nIHdoZXJlIHBhdGhzIGFyZQogc2VwYXJhdGVkIGJ5IGEgY29tbWEuIEZpZWxkcyBuYW1lIGluIGVhY2ggcGF0aCBhcmUgY29udmVydGVkCiB0by9mcm9tIGxvd2VyLWNhbWVsIG5hbWluZyBjb252ZW50aW9ucy4KCiBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgZGVjbGFyYXRpb25zOgoKICAgICBtZXNzYWdlIFByb2ZpbGUgewogICAgICAgVXNlciB1c2VyID0gMTsKICAgICAgIFBob3RvIHBob3RvID0gMjsKICAgICB9CiAgICAgbWVzc2FnZSBVc2VyIHsKICAgICAgIHN0cmluZyBkaXNwbGF5X25hbWUgPSAxOwogICAgICAgc3RyaW5nIGFkZHJlc3MgPSAyOwogICAgIH0KCiBJbiBwcm90byBhIGZpZWxkIG1hc2sgZm9yIGBQcm9maWxlYCBtYXkgbG9vayBhcyBzdWNoOgoKICAgICBtYXNrIHsKICAgICAgIHBhdGhzOiAidXNlci5kaXNwbGF5X25hbWUiCiAgICAgICBwYXRoczogInBob3RvIgogICAgIH0KCiBJbiBKU09OLCB0aGUgc2FtZSBtYXNrIGlzIHJlcHJlc2VudGVkIGFzIGJlbG93OgoKICAgICB7CiAgICAgICBtYXNrOiAidXNlci5kaXNwbGF5TmFtZSxwaG90byIKICAgICB9CgogIyBGaWVsZCBNYXNrcyBhbmQgT25lb2YgRmllbGRzCgogRmllbGQgbWFza3MgdHJlYXQgZmllbGRzIGluIG9uZW9mcyBqdXN0IGFzIHJlZ3VsYXIgZmllbGRzLiBDb25zaWRlciB0aGUKIGZvbGxvd2luZyBtZXNzYWdlOgoKICAgICBtZXNzYWdlIFNhbXBsZU1lc3NhZ2UgewogICAgICAgb25lb2YgdGVzdF9vbmVvZiB7CiAgICAgICAgIHN0cmluZyBuYW1lID0gNDsKICAgICAgICAgU3ViTWVzc2FnZSBzdWJfbWVzc2FnZSA9IDk7CiAgICAgICB9CiAgICAgfQoKIFRoZSBmaWVsZCBtYXNrIGNhbiBiZToKCiAgICAgbWFzayB7CiAgICAgICBwYXRoczogIm5hbWUiCiAgICAgfQoKIE9yOgoKICAgICBtYXNrIHsKICAgICAgIHBhdGhzOiAic3ViX21lc3NhZ2UiCiAgICAgfQoKIE5vdGUgdGhhdCBvbmVvZiB0eXBlIG5hbWVzICgidGVzdF9vbmVvZiIgaW4gdGhpcyBjYXNlKSBjYW5ub3QgYmUgdXNlZCBpbgogcGF0aHMuCgogIyMgRmllbGQgTWFzayBWZXJpZmljYXRpb24KCiBUaGUgaW1wbGVtZW50YXRpb24gb2YgYW55IEFQSSBtZXRob2Qgd2hpY2ggaGFzIGEgRmllbGRNYXNrIHR5cGUgZmllbGQgaW4gdGhlCiByZXF1ZXN0IHNob3VsZCB2ZXJpZnkgdGhlIGluY2x1ZGVkIGZpZWxkIHBhdGhzLCBhbmQgcmV0dXJuIGFuCiBgSU5WQUxJRF9BUkdVTUVOVGAgZXJyb3IgaWYgYW55IHBhdGggaXMgdW5tYXBwYWJsZS4KCgsKAwQAARIE8QEIEQosCgQEAAIAEgTzAQIcGh4gVGhlIHNldCBvZiBmaWVsZCBtYXNrIHBhdGhzLgoKDQoFBAACAAQSBPMBAgoKDQoFBAACAAUSBPMBCxEKDQoFBAACAAESBPMBEhcKDQoFBAACAAMSBPMBGhtiBnByb3RvMwrDMQofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIjsKCVRpbWVzdGFtcBIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KFAQoTY29tLmdvb2dsZS5wcm90b2J1ZkIOVGltZXN0YW1wUHJvdG9QAVoyZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vdGltZXN0YW1wcGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNKwS8KBxIFHgCPAQEKzAwKAQwSAx4AEjLBDCBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KCiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKIG1ldDoKCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogZGlzdHJpYnV0aW9uLgogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCggKAQISAyAAGAoICgEIEgMiAB8KCQoCCB8SAyIAHwoICgEIEgMjAEkKCQoCCAsSAyMASQoICgEIEgMkACwKCQoCCAESAyQALAoICgEIEgMlAC8KCQoCCAgSAyUALwoICgEIEgMmACIKCQoCCAoSAyYAIgoICgEIEgMnACEKCQoCCCQSAycAIQoICgEIEgMoADsKCQoCCCUSAygAOwraHQoCBAASBoQBAI8BARrLHSBBIFRpbWVzdGFtcCByZXByZXNlbnRzIGEgcG9pbnQgaW4gdGltZSBpbmRlcGVuZGVudCBvZiBhbnkgdGltZSB6b25lIG9yIGxvY2FsCiBjYWxlbmRhciwgZW5jb2RlZCBhcyBhIGNvdW50IG9mIHNlY29uZHMgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGF0CiBuYW5vc2Vjb25kIHJlc29sdXRpb24uIFRoZSBjb3VudCBpcyByZWxhdGl2ZSB0byBhbiBlcG9jaCBhdCBVVEMgbWlkbmlnaHQgb24KIEphbnVhcnkgMSwgMTk3MCwgaW4gdGhlIHByb2xlcHRpYyBHcmVnb3JpYW4gY2FsZW5kYXIgd2hpY2ggZXh0ZW5kcyB0aGUKIEdyZWdvcmlhbiBjYWxlbmRhciBiYWNrd2FyZHMgdG8geWVhciBvbmUuCgogQWxsIG1pbnV0ZXMgYXJlIDYwIHNlY29uZHMgbG9uZy4gTGVhcCBzZWNvbmRzIGFyZSAic21lYXJlZCIgc28gdGhhdCBubyBsZWFwCiBzZWNvbmQgdGFibGUgaXMgbmVlZGVkIGZvciBpbnRlcnByZXRhdGlvbiwgdXNpbmcgYSBbMjQtaG91ciBsaW5lYXIKIHNtZWFyXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS90aW1lL3NtZWFyKS4KCiBUaGUgcmFuZ2UgaXMgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVouIEJ5CiByZXN0cmljdGluZyB0byB0aGF0IHJhbmdlLCB3ZSBlbnN1cmUgdGhhdCB3ZSBjYW4gY29udmVydCB0byBhbmQgZnJvbSBbUkZDCiAzMzM5XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGRhdGUgc3RyaW5ncy4KCiAjIEV4YW1wbGVzCgogRXhhbXBsZSAxOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFBPU0lYIGB0aW1lKClgLgoKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wOwogICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcyh0aW1lKE5VTEwpKTsKICAgICB0aW1lc3RhbXAuc2V0X25hbm9zKDApOwoKIEV4YW1wbGUgMjogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBQT1NJWCBgZ2V0dGltZW9mZGF5KClgLgoKICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKCiAgICAgVGltZXN0YW1wIHRpbWVzdGFtcDsKICAgICB0aW1lc3RhbXAuc2V0X3NlY29uZHModHYudHZfc2VjKTsKICAgICB0aW1lc3RhbXAuc2V0X25hbm9zKHR2LnR2X3VzZWMgKiAxMDAwKTsKCiBFeGFtcGxlIDM6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gV2luMzIgYEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKClgLgoKICAgICBGSUxFVElNRSBmdDsKICAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOwogICAgIFVJTlQ2NCB0aWNrcyA9ICgoKFVJTlQ2NClmdC5kd0hpZ2hEYXRlVGltZSkgPDwgMzIpIHwgZnQuZHdMb3dEYXRlVGltZTsKCiAgICAgLy8gQSBXaW5kb3dzIHRpY2sgaXMgMTAwIG5hbm9zZWNvbmRzLiBXaW5kb3dzIGVwb2NoIDE2MDEtMDEtMDFUMDA6MDA6MDBaCiAgICAgLy8gaXMgMTE2NDQ0NzM2MDAgc2Vjb25kcyBiZWZvcmUgVW5peCBlcG9jaCAxOTcwLTAxLTAxVDAwOjAwOjAwWi4KICAgICBUaW1lc3RhbXAgdGltZXN0YW1wOwogICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcygoSU5UNjQpICgodGlja3MgLyAxMDAwMDAwMCkgLSAxMTY0NDQ3MzYwMExMKSk7CiAgICAgdGltZXN0YW1wLnNldF9uYW5vcygoSU5UMzIpICgodGlja3MgJSAxMDAwMDAwMCkgKiAxMDApKTsKCiBFeGFtcGxlIDQ6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gSmF2YSBgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKClgLgoKICAgICBsb25nIG1pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gVGltZXN0YW1wLm5ld0J1aWxkZXIoKS5zZXRTZWNvbmRzKG1pbGxpcyAvIDEwMDApCiAgICAgICAgIC5zZXROYW5vcygoaW50KSAoKG1pbGxpcyAlIDEwMDApICogMTAwMDAwMCkpLmJ1aWxkKCk7CgogRXhhbXBsZSA1OiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIEphdmEgYEluc3RhbnQubm93KClgLgoKICAgICBJbnN0YW50IG5vdyA9IEluc3RhbnQubm93KCk7CgogICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPQogICAgICAgICBUaW1lc3RhbXAubmV3QnVpbGRlcigpLnNldFNlY29uZHMobm93LmdldEVwb2NoU2Vjb25kKCkpCiAgICAgICAgICAgICAuc2V0TmFub3Mobm93LmdldE5hbm8oKSkuYnVpbGQoKTsKCiBFeGFtcGxlIDY6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gY3VycmVudCB0aW1lIGluIFB5dGhvbi4KCiAgICAgdGltZXN0YW1wID0gVGltZXN0YW1wKCkKICAgICB0aW1lc3RhbXAuR2V0Q3VycmVudFRpbWUoKQoKICMgSlNPTiBNYXBwaW5nCgogSW4gSlNPTiBmb3JtYXQsIHRoZSBUaW1lc3RhbXAgdHlwZSBpcyBlbmNvZGVkIGFzIGEgc3RyaW5nIGluIHRoZQogW1JGQyAzMzM5XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGZvcm1hdC4gVGhhdCBpcywgdGhlCiBmb3JtYXQgaXMgInt5ZWFyfS17bW9udGh9LXtkYXl9VHtob3VyfTp7bWlufTp7c2VjfVsue2ZyYWNfc2VjfV1aIgogd2hlcmUge3llYXJ9IGlzIGFsd2F5cyBleHByZXNzZWQgdXNpbmcgZm91ciBkaWdpdHMgd2hpbGUge21vbnRofSwge2RheX0sCiB7aG91cn0sIHttaW59LCBhbmQge3NlY30gYXJlIHplcm8tcGFkZGVkIHRvIHR3byBkaWdpdHMgZWFjaC4gVGhlIGZyYWN0aW9uYWwKIHNlY29uZHMsIHdoaWNoIGNhbiBnbyB1cCB0byA5IGRpZ2l0cyAoaS5lLiB1cCB0byAxIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiksCiBhcmUgb3B0aW9uYWwuIFRoZSAiWiIgc3VmZml4IGluZGljYXRlcyB0aGUgdGltZXpvbmUgKCJVVEMiKTsgdGhlIHRpbWV6b25lCiBpcyByZXF1aXJlZC4gQSBwcm90bzMgSlNPTiBzZXJpYWxpemVyIHNob3VsZCBhbHdheXMgdXNlIFVUQyAoYXMgaW5kaWNhdGVkIGJ5CiAiWiIpIHdoZW4gcHJpbnRpbmcgdGhlIFRpbWVzdGFtcCB0eXBlIGFuZCBhIHByb3RvMyBKU09OIHBhcnNlciBzaG91bGQgYmUKIGFibGUgdG8gYWNjZXB0IGJvdGggVVRDIGFuZCBvdGhlciB0aW1lem9uZXMgKGFzIGluZGljYXRlZCBieSBhbiBvZmZzZXQpLgoKIEZvciBleGFtcGxlLCAiMjAxNy0wMS0xNVQwMTozMDoxNS4wMVoiIGVuY29kZXMgMTUuMDEgc2Vjb25kcyBwYXN0CiAwMTozMCBVVEMgb24gSmFudWFyeSAxNSwgMjAxNy4KCiBJbiBKYXZhU2NyaXB0LCBvbmUgY2FuIGNvbnZlcnQgYSBEYXRlIG9iamVjdCB0byB0aGlzIGZvcm1hdCB1c2luZyB0aGUKIHN0YW5kYXJkCiBbdG9JU09TdHJpbmcoKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS90b0lTT1N0cmluZykKIG1ldGhvZC4gSW4gUHl0aG9uLCBhIHN0YW5kYXJkIGBkYXRldGltZS5kYXRldGltZWAgb2JqZWN0IGNhbiBiZSBjb252ZXJ0ZWQKIHRvIHRoaXMgZm9ybWF0IHVzaW5nCiBbYHN0cmZ0aW1lYF0oaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9saWJyYXJ5L3RpbWUuaHRtbCN0aW1lLnN0cmZ0aW1lKSB3aXRoCiB0aGUgdGltZSBmb3JtYXQgc3BlYyAnJVktJW0tJWRUJUg6JU06JVMuJWZaJy4gTGlrZXdpc2UsIGluIEphdmEsIG9uZSBjYW4gdXNlCiB0aGUgSm9kYSBUaW1lJ3MgW2BJU09EYXRlVGltZUZvcm1hdC5kYXRlVGltZSgpYF0oCiBodHRwOi8vam9kYS10aW1lLnNvdXJjZWZvcmdlLm5ldC9hcGlkb2NzL29yZy9qb2RhL3RpbWUvZm9ybWF0L0lTT0RhdGVUaW1lRm9ybWF0Lmh0bWwjZGF0ZVRpbWUoKQogKSB0byBvYnRhaW4gYSBmb3JtYXR0ZXIgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIHRpbWVzdGFtcHMgaW4gdGhpcyBmb3JtYXQuCgoKCwoDBAABEgSEAQgRCp0BCgQEAAIAEgSIAQIUGo4BIFJlcHJlc2VudHMgc2Vjb25kcyBvZiBVVEMgdGltZSBzaW5jZSBVbml4IGVwb2NoCiAxOTcwLTAxLTAxVDAwOjAwOjAwWi4gTXVzdCBiZSBmcm9tIDAwMDEtMDEtMDFUMDA6MDA6MDBaIHRvCiA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuCgoNCgUEAAIABRIEiAECBwoNCgUEAAIAARIEiAEIDwoNCgUEAAIAAxIEiAESEwrlAQoEBAACARIEjgECEhrWASBOb24tbmVnYXRpdmUgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbi4gTmVnYXRpdmUKIHNlY29uZCB2YWx1ZXMgd2l0aCBmcmFjdGlvbnMgbXVzdCBzdGlsbCBoYXZlIG5vbi1uZWdhdGl2ZSBuYW5vcyB2YWx1ZXMKIHRoYXQgY291bnQgZm9yd2FyZCBpbiB0aW1lLiBNdXN0IGJlIGZyb20gMCB0byA5OTksOTk5LDk5OQogaW5jbHVzaXZlLgoKDQoFBAACAQUSBI4BAgcKDQoFBAACAQESBI4BCA0KDQoFBAACAQMSBI4BEBFiBnByb3RvMwqx7gwKG2J1Zi92YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxIMYnVmLnZhbGlkYXRlGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoeZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvGiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byJQCgRSdWxlEg4KAmlkGAEgASgJUgJpZBIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlEh4KCmV4cHJlc3Npb24YAyABKAlSCmV4cHJlc3Npb24ioQEKDE1lc3NhZ2VSdWxlcxIlCg5jZWxfZXhwcmVzc2lvbhgFIAMoCVINY2VsRXhwcmVzc2lvbhIkCgNjZWwYAyADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsEjQKBW9uZW9mGAQgAygLMh4uYnVmLnZhbGlkYXRlLk1lc3NhZ2VPbmVvZlJ1bGVSBW9uZW9mSgQIARACUghkaXNhYmxlZCJGChBNZXNzYWdlT25lb2ZSdWxlEhYKBmZpZWxkcxgBIAMoCVIGZmllbGRzEhoKCHJlcXVpcmVkGAIgASgIUghyZXF1aXJlZCIoCgpPbmVvZlJ1bGVzEhoKCHJlcXVpcmVkGAEgASgIUghyZXF1aXJlZCLjCgoKRmllbGRSdWxlcxIlCg5jZWxfZXhwcmVzc2lvbhgdIAMoCVINY2VsRXhwcmVzc2lvbhIkCgNjZWwYFyADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsEhoKCHJlcXVpcmVkGBkgASgIUghyZXF1aXJlZBIsCgZpZ25vcmUYGyABKA4yFC5idWYudmFsaWRhdGUuSWdub3JlUgZpZ25vcmUSMAoFZmxvYXQYASABKAsyGC5idWYudmFsaWRhdGUuRmxvYXRSdWxlc0gAUgVmbG9hdBIzCgZkb3VibGUYAiABKAsyGS5idWYudmFsaWRhdGUuRG91YmxlUnVsZXNIAFIGZG91YmxlEjAKBWludDMyGAMgASgLMhguYnVmLnZhbGlkYXRlLkludDMyUnVsZXNIAFIFaW50MzISMAoFaW50NjQYBCABKAsyGC5idWYudmFsaWRhdGUuSW50NjRSdWxlc0gAUgVpbnQ2NBIzCgZ1aW50MzIYBSABKAsyGS5idWYudmFsaWRhdGUuVUludDMyUnVsZXNIAFIGdWludDMyEjMKBnVpbnQ2NBgGIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50NjRSdWxlc0gAUgZ1aW50NjQSMwoGc2ludDMyGAcgASgLMhkuYnVmLnZhbGlkYXRlLlNJbnQzMlJ1bGVzSABSBnNpbnQzMhIzCgZzaW50NjQYCCABKAsyGS5idWYudmFsaWRhdGUuU0ludDY0UnVsZXNIAFIGc2ludDY0EjYKB2ZpeGVkMzIYCSABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQzMlJ1bGVzSABSB2ZpeGVkMzISNgoHZml4ZWQ2NBgKIAEoCzIaLmJ1Zi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIAFIHZml4ZWQ2NBI5CghzZml4ZWQzMhgLIAEoCzIbLmJ1Zi52YWxpZGF0ZS5TRml4ZWQzMlJ1bGVzSABSCHNmaXhlZDMyEjkKCHNmaXhlZDY0GAwgASgLMhsuYnVmLnZhbGlkYXRlLlNGaXhlZDY0UnVsZXNIAFIIc2ZpeGVkNjQSLQoEYm9vbBgNIAEoCzIXLmJ1Zi52YWxpZGF0ZS5Cb29sUnVsZXNIAFIEYm9vbBIzCgZzdHJpbmcYDiABKAsyGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXNIAFIGc3RyaW5nEjAKBWJ5dGVzGA8gASgLMhguYnVmLnZhbGlkYXRlLkJ5dGVzUnVsZXNIAFIFYnl0ZXMSLQoEZW51bRgQIAEoCzIXLmJ1Zi52YWxpZGF0ZS5FbnVtUnVsZXNIAFIEZW51bRI5CghyZXBlYXRlZBgSIAEoCzIbLmJ1Zi52YWxpZGF0ZS5SZXBlYXRlZFJ1bGVzSABSCHJlcGVhdGVkEioKA21hcBgTIAEoCzIWLmJ1Zi52YWxpZGF0ZS5NYXBSdWxlc0gAUgNtYXASKgoDYW55GBQgASgLMhYuYnVmLnZhbGlkYXRlLkFueVJ1bGVzSABSA2FueRI5CghkdXJhdGlvbhgVIAEoCzIbLmJ1Zi52YWxpZGF0ZS5EdXJhdGlvblJ1bGVzSABSCGR1cmF0aW9uEj0KCmZpZWxkX21hc2sYHCABKAsyHC5idWYudmFsaWRhdGUuRmllbGRNYXNrUnVsZXNIAFIJZmllbGRNYXNrEjwKCXRpbWVzdGFtcBgWIAEoCzIcLmJ1Zi52YWxpZGF0ZS5UaW1lc3RhbXBSdWxlc0gAUgl0aW1lc3RhbXBCBgoEdHlwZUoECBgQGUoECBoQG1IHc2tpcHBlZFIMaWdub3JlX2VtcHR5IloKD1ByZWRlZmluZWRSdWxlcxIkCgNjZWwYASADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHkikBgKCkZsb2F0UnVsZXMSigEKBWNvbnN0GAEgASgCQnTCSHEKbwoLZmxvYXQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSowEKAmx0GAIgASgCQpABwkiMAQqJAQoIZmxvYXQubHQafSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0ErQBCgNsdGUYAyABKAJCnwHCSJsBCpgBCglmbG9hdC5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIAFIDbHRlEvMHCgJndBgEIAEoAkLgB8JI3AcKjQEKCGZsb2F0Lmd0GoABIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKwwEKC2Zsb2F0Lmd0X2x0GrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzQEKFWZsb2F0Lmd0X2x0X2V4Y2x1c2l2ZRqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCtMBCgxmbG9hdC5ndF9sdGUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrdAQoWZmxvYXQuZ3RfbHRlX2V4Y2x1c2l2ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0Er8ICgNndGUYBSABKAJCqgjCSKYICpsBCglmbG9hdC5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0gEKDGZsb2F0Lmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3AEKFmZsb2F0Lmd0ZV9sdF9leGNsdXNpdmUawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCuIBCg1mbG9hdC5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrsAQoXZmxvYXQuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKDAQoCaW4YBiADKAJCc8JIcApuCghmbG9hdC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn0KBm5vdF9pbhgHIAMoAkJmwkhjCmEKDGZsb2F0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhJ9CgZmaW5pdGUYCCABKAhCZcJIYgpgCgxmbG9hdC5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnUgZmaW5pdGUSNAoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIqIYCgtEb3VibGVSdWxlcxKLAQoFY29uc3QYASABKAFCdcJIcgpwCgxkb3VibGUuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSpAEKAmx0GAIgASgBQpEBwkiNAQqKAQoJZG91YmxlLmx0Gn0haGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0KT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBK1AQoDbHRlGAMgASgBQqABwkicAQqZAQoKZG91YmxlLmx0ZRqKASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUS+AcKAmd0GAQgASgBQuUHwkjhBwqOAQoJZG91YmxlLmd0GoABIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKxAEKDGRvdWJsZS5ndF9sdBqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCs4BChZkb3VibGUuZ3RfbHRfZXhjbHVzaXZlGrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycK1AEKDWRvdWJsZS5ndF9sdGUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwreAQoXZG91YmxlLmd0X2x0ZV9leGNsdXNpdmUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLECAoDZ3RlGAUgASgBQq8IwkirCAqcAQoKZG91YmxlLmd0ZRqNASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrTAQoNZG91YmxlLmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3QEKF2RvdWJsZS5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrjAQoOZG91YmxlLmd0ZV9sdGUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCu0BChhkb3VibGUuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKEAQoCaW4YBiADKAFCdMJIcQpvCglkb3VibGUuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ+CgZub3RfaW4YByADKAFCZ8JIZApiCg1kb3VibGUubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJydSBW5vdEluEn4KBmZpbml0ZRgIIAEoCEJmwkhjCmEKDWRvdWJsZS5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnUgZmaW5pdGUSNQoHZXhhbXBsZRgJIAMoAUIbwkgYChYKDmRvdWJsZS5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiK6FQoKSW50MzJSdWxlcxKKAQoFY29uc3QYASABKAVCdMJIcQpvCgtpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKOAQoCbHQYAiABKAVCfMJIeQp3CghpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSoQEKA2x0ZRgDIAEoBUKMAcJIiAEKhQEKCWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKbBwoCZ3QYBCABKAVCiAfCSIQHCnoKCGludDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50MzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EugHCgNndGUYBSABKAVC0wfCSM8HCogBCglpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrCAQoMaW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsoBChZpbnQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrSAQoNaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwraAQoXaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKDAQoCaW4YBiADKAVCc8JIcApuCghpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn0KBm5vdF9pbhgHIAMoBUJmwkhjCmEKDGludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI0CgdleGFtcGxlGAggAygFQhrCSBcKFQoNaW50MzIuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iuhUKCkludDY0UnVsZXMSigEKBWNvbnN0GAEgASgDQnTCSHEKbwoLaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjgEKAmx0GAIgASgDQnzCSHkKdwoIaW50NjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0EqEBCgNsdGUYAyABKANCjAHCSIgBCoUBCglpbnQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUSmwcKAmd0GAQgASgDQogHwkiEBwp6CghpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKswEKC2ludDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq7AQoVaW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwwEKDGludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKywEKFmludDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLoBwoDZ3RlGAUgASgDQtMHwkjPBwqIAQoJaW50NjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUSgwEKAmluGAYgAygDQnPCSHAKbgoIaW50NjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ9CgZub3RfaW4YByADKANCZsJIYwphCgxpbnQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNAoHZXhhbXBsZRgJIAMoA0IawkgXChUKDWludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtVSW50MzJSdWxlcxKLAQoFY29uc3QYASABKA1CdcJIcgpwCgx1aW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgNQn3CSHoKeAoJdWludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgNQo0BwkiJAQqGAQoKdWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKA1CjQfCSIkHCnsKCXVpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoDULYB8JI1AcKiQEKCnVpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygNQnTCSHEKbwoJdWludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygNQmfCSGQKYgoNdWludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygNQhvCSBgKFgoOdWludDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtVSW50NjRSdWxlcxKLAQoFY29uc3QYASABKARCdcJIcgpwCgx1aW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgEQn3CSHoKeAoJdWludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgEQo0BwkiJAQqGAQoKdWludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKARCjQfCSIkHCnsKCXVpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoBELYB8JI1AcKiQEKCnVpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygEQnTCSHEKbwoJdWludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygEQmfCSGQKYgoNdWludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygEQhvCSBgKFgoOdWludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtTSW50MzJSdWxlcxKLAQoFY29uc3QYASABKBFCdcJIcgpwCgxzaW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgRQn3CSHoKeAoJc2ludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgRQo0BwkiJAQqGAQoKc2ludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKBFCjQfCSIkHCnsKCXNpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoEULYB8JI1AcKiQEKCnNpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygRQnTCSHEKbwoJc2ludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygRQmfCSGQKYgoNc2ludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygRQhvCSBgKFgoOc2ludDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtTSW50NjRSdWxlcxKLAQoFY29uc3QYASABKBJCdcJIcgpwCgxzaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgSQn3CSHoKeAoJc2ludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgSQo0BwkiJAQqGAQoKc2ludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKBJCjQfCSIkHCnsKCXNpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoEkLYB8JI1AcKiQEKCnNpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygSQnTCSHEKbwoJc2ludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygSQmfCSGQKYgoNc2ludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygSQhvCSBgKFgoOc2ludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuItwVCgxGaXhlZDMyUnVsZXMSjAEKBWNvbnN0GAEgASgHQnbCSHMKcQoNZml4ZWQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKQAQoCbHQYAiABKAdCfsJIewp5CgpmaXhlZDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKjAQoDbHRlGAMgASgHQo4BwkiKAQqHAQoLZml4ZWQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUSpQcKAmd0GAQgASgHQpIHwkiOBwp8CgpmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS8gcKA2d0ZRgFIAEoB0LdB8JI2QcKigEKC2ZpeGVkMzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxAEKDmZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCswBChhmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtQBCg9maXhlZDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3AEKGWZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKFAQoCaW4YBiADKAdCdcJIcgpwCgpmaXhlZDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfwoGbm90X2luGAcgAygHQmjCSGUKYwoOZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNgoHZXhhbXBsZRgIIAMoB0IcwkgZChcKD2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i3BUKDEZpeGVkNjRSdWxlcxKMAQoFY29uc3QYASABKAZCdsJIcwpxCg1maXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EpABCgJsdBgCIAEoBkJ+wkh7CnkKCmZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0EqMBCgNsdGUYAyABKAZCjgHCSIoBCocBCgtmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKlBwoCZ3QYBCABKAZCkgfCSI4HCnwKCmZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrUBCg1maXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq9AQoXZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrFAQoOZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs0BChhmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLyBwoDZ3RlGAUgASgGQt0HwkjZBwqKAQoLZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIAVIDZ3RlEoUBCgJpbhgGIAMoBkJ1wkhyCnAKCmZpeGVkNjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ/CgZub3RfaW4YByADKAZCaMJIZQpjCg5maXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI2CgdleGFtcGxlGAggAygGQhzCSBkKFwoPZml4ZWQ2NC5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLuFQoNU0ZpeGVkMzJSdWxlcxKNAQoFY29uc3QYASABKA9Cd8JIdApyCg5zZml4ZWQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKRAQoCbHQYAiABKA9Cf8JIfAp6CgtzZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSpAEKA2x0ZRgDIAEoD0KPAcJIiwEKiAEKDHNmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKqBwoCZ3QYBCABKA9ClwfCSJMHCn0KC3NmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOc2ZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhzZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPc2ZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZc2ZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EvcHCgNndGUYBSABKA9C4gfCSN4HCosBCgxzZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKGAQoCaW4YBiADKA9CdsJIcwpxCgtzZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEoABCgZub3RfaW4YByADKA9CacJIZgpkCg9zZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNwoHZXhhbXBsZRgIIAMoD0IdwkgaChgKEHNmaXhlZDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIu4VCg1TRml4ZWQ2NFJ1bGVzEo0BCgVjb25zdBgBIAEoEEJ3wkh0CnIKDnNmaXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EpEBCgJsdBgCIAEoEEJ/wkh8CnoKC3NmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKkAQoDbHRlGAMgASgQQo8BwkiLAQqIAQoMc2ZpeGVkNjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIAFIDbHRlEqoHCgJndBgEIAEoEEKXB8JIkwcKfQoLc2ZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrYBCg5zZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKGHNmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsYBCg9zZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs4BChlzZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS9wcKA2d0ZRgFIAEoEELiB8JI3gcKiwEKDHNmaXhlZDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9zZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGXNmaXhlZDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBzZml4ZWQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpzZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIAVIDZ3RlEoYBCgJpbhgGIAMoEEJ2wkhzCnEKC3NmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SgAEKBm5vdF9pbhgHIAMoEEJpwkhmCmQKD3NmaXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI3CgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i1wEKCUJvb2xSdWxlcxKJAQoFY29uc3QYASABKAhCc8JIcApuCgpib29sLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EjMKB2V4YW1wbGUYAiADKAhCGcJIFgoUCgxib29sLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAiLPOwoLU3RyaW5nUnVsZXMSjQEKBWNvbnN0GAEgASgJQnfCSHQKcgoMc3RyaW5nLmNvbnN0GmJ0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsIGAlc2AnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSgwEKA2xlbhgTIAEoBEJxwkhuCmwKCnN0cmluZy5sZW4aXnVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJydSA2xlbhKhAQoHbWluX2xlbhgCIAEoBEKHAcJIgwEKgAEKDnN0cmluZy5taW5fbGVuGm51aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJ1IGbWluTGVuEp8BCgdtYXhfbGVuGAMgASgEQoUBwkiBAQp/Cg5zdHJpbmcubWF4X2xlbhptdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IG1vc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5tYXhfbGVuXSkgOiAnJ1IGbWF4TGVuEqUBCglsZW5fYnl0ZXMYFCABKARChwHCSIMBCoABChBzdHJpbmcubGVuX2J5dGVzGmx1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl9ieXRlc10pIDogJydSCGxlbkJ5dGVzEq0BCgltaW5fYnl0ZXMYBCABKARCjwHCSIsBCogBChBzdHJpbmcubWluX2J5dGVzGnR1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgPCBydWxlcy5taW5fYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWluX2J5dGVzXSkgOiAnJ1IIbWluQnl0ZXMSrAEKCW1heF9ieXRlcxgFIAEoBEKOAcJIigEKhwEKEHN0cmluZy5tYXhfYnl0ZXMac3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9ieXRlc10pIDogJydSCG1heEJ5dGVzEpYBCgdwYXR0ZXJuGAYgASgJQnzCSHkKdwoOc3RyaW5nLnBhdHRlcm4aZSF0aGlzLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgZG9lcyBub3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnUgdwYXR0ZXJuEowBCgZwcmVmaXgYByABKAlCdMJIcQpvCg1zdHJpbmcucHJlZml4Gl4hdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnUgZwcmVmaXgSigEKBnN1ZmZpeBgIIAEoCUJywkhvCm0KDXN0cmluZy5zdWZmaXgaXCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnUgZzdWZmaXgSmgEKCGNvbnRhaW5zGAkgASgJQn7CSHsKeQoPc3RyaW5nLmNvbnRhaW5zGmYhdGhpcy5jb250YWlucyhydWxlcy5jb250YWlucykgPyAndmFsdWUgZG9lcyBub3QgY29udGFpbiBzdWJzdHJpbmcgYCVzYCcuZm9ybWF0KFtydWxlcy5jb250YWluc10pIDogJydSCGNvbnRhaW5zEqUBCgxub3RfY29udGFpbnMYFyABKAlCgQHCSH4KfAoTc3RyaW5nLm5vdF9jb250YWlucxpldGhpcy5jb250YWlucyhydWxlcy5ub3RfY29udGFpbnMpID8gJ3ZhbHVlIGNvbnRhaW5zIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLm5vdF9jb250YWluc10pIDogJydSC25vdENvbnRhaW5zEoQBCgJpbhgKIAMoCUJ0wkhxCm8KCXN0cmluZy5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn4KBm5vdF9pbhgLIAMoCUJnwkhkCmIKDXN0cmluZy5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4S5gEKBWVtYWlsGAwgASgIQs0BwkjJAQphCgxzdHJpbmcuZW1haWwSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGiwhcnVsZXMuZW1haWwgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzRW1haWwoKQpkChJzdHJpbmcuZW1haWxfZW1wdHkSMnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGhohcnVsZXMuZW1haWwgfHwgdGhpcyAhPSAnJ0gAUgVlbWFpbBLxAQoIaG9zdG5hbWUYDSABKAhC0gHCSM4BCmUKD3N0cmluZy5ob3N0bmFtZRIedmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIAFIIaG9zdG5hbWUSywEKAmlwGA4gASgIQrgBwki0AQpVCglzdHJpbmcuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGiYhcnVsZXMuaXAgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoKQpbCg9zdHJpbmcuaXBfZW1wdHkSL3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUCBhZGRyZXNzGhchcnVsZXMuaXAgfHwgdGhpcyAhPSAnJ0gAUgJpcBLcAQoEaXB2NBgPIAEoCELFAcJIwQEKXAoLc3RyaW5nLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaKSFydWxlcy5pcHY0IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwKDQpCmEKEXN0cmluZy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGhkhcnVsZXMuaXB2NCB8fCB0aGlzICE9ICcnSABSBGlwdjQS3AEKBGlwdjYYECABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY2EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzGikhcnVsZXMuaXB2NiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg2KQphChFzdHJpbmcuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxoZIXJ1bGVzLmlwdjYgfHwgdGhpcyAhPSAnJ0gAUgRpcHY2EsQBCgN1cmkYESABKAhCrwHCSKsBClEKCnN0cmluZy51cmkSGXZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkaKCFydWxlcy51cmkgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzVXJpKCkKVgoQc3RyaW5nLnVyaV9lbXB0eRIodmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVSSRoYIXJ1bGVzLnVyaSB8fCB0aGlzICE9ICcnSABSA3VyaRJ4Cgd1cmlfcmVmGBIgASgIQl3CSFoKWAoOc3RyaW5nLnVyaV9yZWYSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkgUmVmZXJlbmNlGiEhcnVsZXMudXJpX3JlZiB8fCB0aGlzLmlzVXJpUmVmKClIAFIGdXJpUmVmEpkCCgdhZGRyZXNzGBUgASgIQvwBwkj4AQqBAQoOc3RyaW5nLmFkZHJlc3MSLXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0bmFtZSwgb3IgaXAgYWRkcmVzcxpAIXJ1bGVzLmFkZHJlc3MgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKSB8fCB0aGlzLmlzSXAoKQpyChRzdHJpbmcuYWRkcmVzc19lbXB0eRI8dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGhwhcnVsZXMuYWRkcmVzcyB8fCB0aGlzICE9ICcnSABSB2FkZHJlc3MSngIKBHV1aWQYFiABKAhChwLCSIMCCqUBCgtzdHJpbmcudXVpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeiFydWxlcy51dWlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpClkKEXN0cmluZy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBoZIXJ1bGVzLnV1aWQgfHwgdGhpcyAhPSAnJ0gAUgR1dWlkEvcBCgV0dXVpZBghIAEoCELeAcJI2gEKcwoMc3RyaW5nLnR1dWlkEiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgdHJpbW1lZCBVVUlEGj8hcnVsZXMudHV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXszMn0kJykKYwoSc3RyaW5nLnR1dWlkX2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgdHJpbW1lZCBVVUlEGhohcnVsZXMudHV1aWQgfHwgdGhpcyAhPSAnJ0gAUgV0dXVpZBKnAgoRaXBfd2l0aF9wcmVmaXhsZW4YGiABKAhC+AHCSPQBCngKGHN0cmluZy5pcF93aXRoX3ByZWZpeGxlbhIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo7IXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KCkKeAoec3RyaW5nLmlwX3dpdGhfcHJlZml4bGVuX2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4GiYhcnVsZXMuaXBfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAUg9pcFdpdGhQcmVmaXhsZW4S4gIKE2lwdjRfd2l0aF9wcmVmaXhsZW4YGyABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQpCpIBCiBzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIAFIRaXB2NFdpdGhQcmVmaXhsZW4S4gIKE2lwdjZfd2l0aF9wcmVmaXhsZW4YHCABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2Nl93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY2X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYpCpIBCiBzdHJpbmcuaXB2Nl93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY2X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIAFIRaXB2NldpdGhQcmVmaXhsZW4S/AEKCWlwX3ByZWZpeBgdIAEoCELcAcJI2AEKbAoQc3RyaW5nLmlwX3ByZWZpeBIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIAFIIaXBQcmVmaXgSjwIKC2lwdjRfcHJlZml4GB4gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2NF9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IHByZWZpeBo8IXJ1bGVzLmlwdjRfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQsIHRydWUpCm4KGHN0cmluZy5pcHY0X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgcHJlZml4GiAhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAUgppcHY0UHJlZml4Eo8CCgtpcHY2X3ByZWZpeBgfIAEoCELrAcJI5wEKdQoSc3RyaW5nLmlwdjZfcHJlZml4EiF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBwcmVmaXgaPCFydWxlcy5pcHY2X3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2LCB0cnVlKQpuChhzdHJpbmcuaXB2Nl9wcmVmaXhfZW1wdHkSMHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IHByZWZpeBogIXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgIT0gJydIAFIKaXB2NlByZWZpeBLCAgoNaG9zdF9hbmRfcG9ydBggIAEoCEKbAsJIlwIKmQEKFHN0cmluZy5ob3N0X2FuZF9wb3J0EkF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdCAoaG9zdG5hbWUgb3IgSVAgYWRkcmVzcykgYW5kIHBvcnQgcGFpcho+IXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdEFuZFBvcnQodHJ1ZSkKeQoac3RyaW5nLmhvc3RfYW5kX3BvcnRfZW1wdHkSN3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0IGFuZCBwb3J0IHBhaXIaIiFydWxlcy5ob3N0X2FuZF9wb3J0IHx8IHRoaXMgIT0gJydIAFILaG9zdEFuZFBvcnQS+wEKBHVsaWQYIyABKAhC5AHCSOABCoIBCgtzdHJpbmcudWxpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVMSUQaVyFydWxlcy51bGlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtN11bMC05QS1ISktNTlAtVFYtWmEtaGprbW5wLXR2LXpdezI1fSQnKQpZChFzdHJpbmcudWxpZF9lbXB0eRIpdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVMSUQaGSFydWxlcy51bGlkIHx8IHRoaXMgIT0gJydIAFIEdWxpZBK4BQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QvEEwkjtBArwAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSJnZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrnAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEid2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAUg53ZWxsS25vd25SZWdleBIWCgZzdHJpY3QYGSABKAhSBnN0cmljdBI1CgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIqwTCgpCeXRlc1J1bGVzEocBCgVjb25zdBgBIAEoDEJxwkhuCmwKC2J5dGVzLmNvbnN0Gl10aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGJlICV4Jy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0En0KA2xlbhgNIAEoBEJrwkhoCmYKCWJ5dGVzLmxlbhpZdWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJydSA2xlbhKYAQoHbWluX2xlbhgCIAEoBEJ/wkh8CnoKDWJ5dGVzLm1pbl9sZW4aaXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJ1IGbWluTGVuEpABCgdtYXhfbGVuGAMgASgEQnfCSHQKcgoNYnl0ZXMubWF4X2xlbhphdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ3ZhbHVlIG11c3QgYmUgYXQgbW9zdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5tYXhfbGVuXSkgOiAnJ1IGbWF4TGVuEpkBCgdwYXR0ZXJuGAQgASgJQn/CSHwKegoNYnl0ZXMucGF0dGVybhppIXN0cmluZyh0aGlzKS5tYXRjaGVzKHJ1bGVzLnBhdHRlcm4pID8gJ3ZhbHVlIG11c3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnUgdwYXR0ZXJuEokBCgZwcmVmaXgYBSABKAxCccJIbgpsCgxieXRlcy5wcmVmaXgaXCF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCAleCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnUgZwcmVmaXgShwEKBnN1ZmZpeBgGIAEoDEJvwkhsCmoKDGJ5dGVzLnN1ZmZpeBpaIXRoaXMuZW5kc1dpdGgocnVsZXMuc3VmZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpeCAleCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnUgZzdWZmaXgSjQEKCGNvbnRhaW5zGAcgASgMQnHCSG4KbAoOYnl0ZXMuY29udGFpbnMaWiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluICV4Jy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJ1IIY29udGFpbnMSqwEKAmluGAggAygMQpoBwkiWAQqTAQoIYnl0ZXMuaW4ahgFnZXRGaWVsZChydWxlcywgJ2luJykuc2l6ZSgpID4gMCAmJiAhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfQoGbm90X2luGAkgAygMQmbCSGMKYQoMYnl0ZXMubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJydSBW5vdEluEu8BCgJpcBgKIAEoCELcAcJI2AEKdAoIYnl0ZXMuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGkYhcnVsZXMuaXAgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0IHx8IHRoaXMuc2l6ZSgpID09IDE2CmAKDmJ5dGVzLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxodIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpICE9IDBIAFICaXAS6gEKBGlwdjQYCyABKAhC0wHCSM8BCmUKCmJ5dGVzLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSABSBGlwdjQS6wEKBGlwdjYYDCABKAhC1AHCSNABCmYKCmJ5dGVzLmlwdjYSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAUgRpcHY2EtsBCgR1dWlkGA8gASgIQsQBwkjAAQpeCgpieXRlcy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBo0IXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpeChBieXRlcy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBofIXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgIT0gMEgAUgR1dWlkEjQKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biL9AwoJRW51bVJ1bGVzEokBCgVjb25zdBgBIAEoBUJzwkhwCm4KCmVudW0uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSIQoMZGVmaW5lZF9vbmx5GAIgASgIUgtkZWZpbmVkT25seRKCAQoCaW4YAyADKAVCcsJIbwptCgdlbnVtLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfAoGbm90X2luGAQgAygFQmXCSGIKYAoLZW51bS5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SMwoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACIp4ECg1SZXBlYXRlZFJ1bGVzEqgBCgltaW5faXRlbXMYASABKARCigHCSIYBCoMBChJyZXBlYXRlZC5taW5faXRlbXMabXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBhdCBsZWFzdCAlZCBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1pbl9pdGVtc10pIDogJydSCG1pbkl0ZW1zEqwBCgltYXhfaXRlbXMYAiABKARCjgHCSIoBCocBChJyZXBlYXRlZC5tYXhfaXRlbXMacXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJXMgaXRlbShzKScuZm9ybWF0KFtydWxlcy5tYXhfaXRlbXNdKSA6ICcnUghtYXhJdGVtcxJ4CgZ1bmlxdWUYAyABKAhCYMJIXQpbCg9yZXBlYXRlZC51bmlxdWUSKHJlcGVhdGVkIHZhbHVlIG11c3QgY29udGFpbiB1bmlxdWUgaXRlbXMaHiFydWxlcy51bmlxdWUgfHwgdGhpcy51bmlxdWUoKVIGdW5pcXVlEi4KBWl0ZW1zGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXNSBWl0ZW1zKgkI6AcQgICAgAIirAMKCE1hcFJ1bGVzEpkBCgltaW5fcGFpcnMYASABKARCfMJIeQp3Cg1tYXAubWluX3BhaXJzGmZ1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBsZWFzdCAlZCBlbnRyaWVzJy5mb3JtYXQoW3J1bGVzLm1pbl9wYWlyc10pIDogJydSCG1pblBhaXJzEpgBCgltYXhfcGFpcnMYAiABKARCe8JIeAp2Cg1tYXAubWF4X3BhaXJzGmV1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBtb3N0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWF4X3BhaXJzXSkgOiAnJ1IIbWF4UGFpcnMSLAoEa2V5cxgEIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgRrZXlzEjAKBnZhbHVlcxgFIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgZ2YWx1ZXMqCQjoBxCAgICAAiIxCghBbnlSdWxlcxIOCgJpbhgCIAMoCVICaW4SFQoGbm90X2luGAMgAygJUgVub3RJbiLGFwoNRHVyYXRpb25SdWxlcxKoAQoFY29uc3QYAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cd8JIdApyCg5kdXJhdGlvbi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKsAQoCbHQYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cf8JIfAp6CgtkdXJhdGlvbi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSvwEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKPAcJIiwEKiAEKDGR1cmF0aW9uLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRLFBwoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ClwfCSJMHCn0KC2R1cmF0aW9uLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOZHVyYXRpb24uZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPZHVyYXRpb24uZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZZHVyYXRpb24uZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EpIICgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25C4gfCSN4HCosBCgxkdXJhdGlvbi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPZHVyYXRpb24uZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQZHVyYXRpb24uZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKhAQoCaW4YByADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CdsJIcwpxCgtkdXJhdGlvbi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEpsBCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CacJIZgpkCg9kdXJhdGlvbi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SUgoHZXhhbXBsZRgJIAMoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkIdwkgaChgKEGR1cmF0aW9uLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIpgGCg5GaWVsZE1hc2tSdWxlcxLGAQoFY29uc3QYASABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQpMBwkiPAQqMAQoQZmllbGRfbWFzay5jb25zdBp4dGhpcy5wYXRocyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykucGF0aHMgPyAndmFsdWUgbXVzdCBlcXVhbCBwYXRocyAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JykucGF0aHNdKSA6ICcnUgVjb25zdBLdAQoCaW4YAiADKAlCzAHCSMgBCsUBCg1maWVsZF9tYXNrLmluGrMBIXRoaXMucGF0aHMuYWxsKHAsIHAgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpIHx8IGdldEZpZWxkKHJ1bGVzLCAnaW4nKS5leGlzdHMoZiwgcC5zdGFydHNXaXRoKGYrJy4nKSkpID8gJ3ZhbHVlIG11c3Qgb25seSBjb250YWluIHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEvoBCgZub3RfaW4YAyADKAlC4gHCSN4BCtsBChFmaWVsZF9tYXNrLm5vdF9pbhrFASF0aGlzLnBhdGhzLmFsbChwLCAhKHAgaW4gZ2V0RmllbGQocnVsZXMsICdub3RfaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ25vdF9pbicpLmV4aXN0cyhmLCBwLnN0YXJ0c1dpdGgoZisnLicpKSkpID8gJ3ZhbHVlIG11c3Qgbm90IGNvbnRhaW4gYW55IHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnbm90X2luJyldKSA6ICcnUgVub3RJbhJVCgdleGFtcGxlGAQgAygLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza0IfwkgcChoKEmZpZWxkX21hc2suZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACIsoYCg5UaW1lc3RhbXBSdWxlcxKqAQoFY29uc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQnjCSHUKcwoPdGltZXN0YW1wLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0Eq8BCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCgAHCSH0KewoMdGltZXN0YW1wLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBLBAQoDbHRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKQAcJIjAEKiQEKDXRpbWVzdGFtcC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUScwoGbHRfbm93GAcgASgIQlrCSFcKVQoQdGltZXN0YW1wLmx0X25vdxpBKHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIAFIFbHROb3cSywcKAmd0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKcB8JImAcKfgoMdGltZXN0YW1wLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq3AQoPdGltZXN0YW1wLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq/AQoZdGltZXN0YW1wLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCscBChB0aW1lc3RhbXAuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrPAQoadGltZXN0YW1wLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBKYCAoDZ3RlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcELnB8JI4wcKjAEKDXRpbWVzdGFtcC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrGAQoQdGltZXN0YW1wLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrOAQoadGltZXN0YW1wLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtYBChF0aW1lc3RhbXAuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwreAQobdGltZXN0YW1wLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUSdgoGZ3Rfbm93GAggASgIQl3CSFoKWAoQdGltZXN0YW1wLmd0X25vdxpEKHJ1bGVzLmd0X25vdyAmJiB0aGlzIDwgbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cnIDogJydIAVIFZ3ROb3cSwAEKBndpdGhpbhgJIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKMAcJIiAEKhQEKEHRpbWVzdGFtcC53aXRoaW4acXRoaXMgPCBub3ctcnVsZXMud2l0aGluIHx8IHRoaXMgPiBub3crcnVsZXMud2l0aGluID8gJ3ZhbHVlIG11c3QgYmUgd2l0aGluICVzIG9mIG5vdycuZm9ybWF0KFtydWxlcy53aXRoaW5dKSA6ICcnUgZ3aXRoaW4SVAoHZXhhbXBsZRgKIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCHsJIGwoZChF0aW1lc3RhbXAuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iRQoKVmlvbGF0aW9ucxI3Cgp2aW9sYXRpb25zGAEgAygLMhcuYnVmLnZhbGlkYXRlLlZpb2xhdGlvblIKdmlvbGF0aW9ucyLFAQoJVmlvbGF0aW9uEi0KBWZpZWxkGAUgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aFIFZmllbGQSKwoEcnVsZRgGIAEoCzIXLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhSBHJ1bGUSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEhgKB21lc3NhZ2UYAyABKAlSB21lc3NhZ2USFwoHZm9yX2tleRgEIAEoCFIGZm9yS2V5SgQIARACUgpmaWVsZF9wYXRoIkcKCUZpZWxkUGF0aBI6CghlbGVtZW50cxgBIAMoCzIeLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhFbGVtZW50UghlbGVtZW50cyLMAwoQRmllbGRQYXRoRWxlbWVudBIhCgxmaWVsZF9udW1iZXIYASABKAVSC2ZpZWxkTnVtYmVyEh0KCmZpZWxkX25hbWUYAiABKAlSCWZpZWxkTmFtZRJJCgpmaWVsZF90eXBlGAMgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVSCWZpZWxkVHlwZRJFCghrZXlfdHlwZRgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgdrZXlUeXBlEkkKCnZhbHVlX3R5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIJdmFsdWVUeXBlEhYKBWluZGV4GAYgASgESABSBWluZGV4EhsKCGJvb2xfa2V5GAcgASgISABSB2Jvb2xLZXkSGQoHaW50X2tleRgIIAEoA0gAUgZpbnRLZXkSGwoIdWludF9rZXkYCSABKARIAFIHdWludEtleRIfCgpzdHJpbmdfa2V5GAogASgJSABSCXN0cmluZ0tleUILCglzdWJzY3JpcHQqoQEKBklnbm9yZRIWChJJR05PUkVfVU5TUEVDSUZJRUQQABIYChRJR05PUkVfSUZfWkVST19WQUxVRRABEhEKDUlHTk9SRV9BTFdBWVMQAyIECAIQAioMSUdOT1JFX0VNUFRZKg5JR05PUkVfREVGQVVMVCoXSUdOT1JFX0lGX0RFRkFVTFRfVkFMVUUqFUlHTk9SRV9JRl9VTlBPUFVMQVRFRCpuCgpLbm93blJlZ2V4EhsKF0tOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEEAASIAocS05PV05fUkVHRVhfSFRUUF9IRUFERVJfTkFNRRABEiEKHUtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFEAI6VgoHbWVzc2FnZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiHCSABKAsyGi5idWYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlOk4KBW9uZW9mEh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucxiHCSABKAsyGC5idWYudmFsaWRhdGUuT25lb2ZSdWxlc1IFb25lb2Y6TgoFZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVmaWVsZDpdCgpwcmVkZWZpbmVkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiICSABKAsyHS5idWYudmFsaWRhdGUuUHJlZGVmaW5lZFJ1bGVzUgpwcmVkZWZpbmVkQm4KEmJ1aWxkLmJ1Zi52YWxpZGF0ZUINVmFsaWRhdGVQcm90b1ABWkdidWYuYnVpbGQvZ2VuL2dvL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUvcHJvdG9jb2xidWZmZXJzL2dvL2J1Zi92YWxpZGF0ZUq4tgkKBxIFDgDAJwEKzgQKAQwSAw4AEjLDBCBDb3B5cmlnaHQgMjAyMy0yMDI2IEJ1ZiBUZWNobm9sb2dpZXMsIEluYy4KCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgrqCwoBAhIDLAAVGt8LIFtQcm90b3ZhbGlkYXRlXShodHRwczovL3Byb3RvdmFsaWRhdGUuY29tLykgaXMgdGhlIHNlbWFudGljIHZhbGlkYXRpb24gbGlicmFyeSBmb3IgUHJvdG9idWYuCiBJdCBwcm92aWRlcyBzdGFuZGFyZCBhbm5vdGF0aW9ucyB0byB2YWxpZGF0ZSBjb21tb24gcnVsZXMgb24gbWVzc2FnZXMgYW5kIGZpZWxkcywgYXMgd2VsbCBhcyB0aGUgYWJpbGl0eSB0byB1c2UgW0NFTF0oaHR0cHM6Ly9jZWwuZGV2KSB0byB3cml0ZSBjdXN0b20gcnVsZXMuCiBJdCdzIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgW3Byb3RvYy1nZW4tdmFsaWRhdGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b2MtZ2VuLXZhbGlkYXRlKS4KCiBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIG9wdGlvbnMsIG1lc3NhZ2VzLCBhbmQgZW51bXMgdGhhdCBwb3dlciBQcm90b3ZhbGlkYXRlLgogQXBwbHkgaXRzIG9wdGlvbnMgdG8gbWVzc2FnZXMsIGZpZWxkcywgYW5kIG9uZW9mcyBpbiB5b3VyIFByb3RvYnVmIHNjaGVtYXMgdG8gYWRkIHZhbGlkYXRpb24gcnVsZXM6CgogYGBgcHJvdG8KIG1lc3NhZ2UgVXNlciB7CiAgIHN0cmluZyBpZCA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy51dWlkID0gdHJ1ZV07CiAgIHN0cmluZyBmaXJzdF9uYW1lID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLm1heF9sZW4gPSA2NF07CiAgIHN0cmluZyBsYXN0X25hbWUgPSAzIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcubWF4X2xlbiA9IDY0XTsKCiAgIG9wdGlvbiAoYnVmLnZhbGlkYXRlLm1lc3NhZ2UpLmNlbCA9IHsKICAgICBpZDogImZpcnN0X25hbWVfcmVxdWlyZXNfbGFzdF9uYW1lIgogICAgIG1lc3NhZ2U6ICJsYXN0X25hbWUgbXVzdCBiZSBwcmVzZW50IGlmIGZpcnN0X25hbWUgaXMgcHJlc2VudCIKICAgICBleHByZXNzaW9uOiAiIWhhcyh0aGlzLmZpcnN0X25hbWUpIHx8IGhhcyh0aGlzLmxhc3RfbmFtZSkiCiAgIH07CiB9CiBgYGAKCiBUaGVzZSBydWxlcyBhcmUgZW5mb3JjZWQgYXQgcnVudGltZSBieSBsYW5ndWFnZS1zcGVjaWZpYyBsaWJyYXJpZXMuCiBTZWUgdGhlIFtkZXZlbG9wZXIgcXVpY2tzdGFydF0oaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9xdWlja3N0YXJ0LykgdG8gZ2V0IHN0YXJ0ZWQsIG9yIGdvIGRpcmVjdGx5IHRvIHRoZSBydW50aW1lIGxpYnJhcnkgZm9yIHlvdXIgbGFuZ3VhZ2U6CiBbR29dKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWdvKQogW0phdmFTY3JpcHQvVHlwZVNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUtZXMpLAogW0phdmFdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWphdmEpLAogW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUtcHl0aG9uKSwKIG9yIFtDKytdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWNjKS4KCgkKAgMAEgMuACoKCQoCAwESAy8AKAoJCgIDAhIDMAAqCgkKAgMDEgMxACkKCAoBCBIDMwBeCgkKAggLEgMzAF4KCAoBCBIDNAAiCgkKAggKEgM0ACIKCAoBCBIDNQAuCgkKAggIEgM1AC4KCAoBCBIDNgArCgkKAggBEgM2ACsKgAIKAQcSBDwAQAEa9AEgTWVzc2FnZU9wdGlvbnMgaXMgYW4gZXh0ZW5zaW9uIHRvIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy4gSXQgYWxsb3dzCiB0aGUgYWRkaXRpb24gb2YgdmFsaWRhdGlvbiBydWxlcyBhdCB0aGUgbWVzc2FnZSBsZXZlbC4gVGhlc2UgcnVsZXMgY2FuIGJlCiBhcHBsaWVkIHRvIGluY29taW5nIG1lc3NhZ2VzIHRvIGVuc3VyZSB0aGV5IG1lZXQgY2VydGFpbiBjcml0ZXJpYSBiZWZvcmUKIGJlaW5nIHByb2Nlc3NlZC4KCoYBCgIHABIDPwInGnsgUnVsZXMgc3BlY2lmeSB0aGUgdmFsaWRhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoaXMgbWVzc2FnZS4gQnkgZGVmYXVsdCwKIG5vIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGFnYWluc3QgYSBtZXNzYWdlLgoKCgoDBwACEgM8ByUKCgoDBwAEEgM/AgoKCgoDBwAGEgM/CxcKCgoDBwABEgM/GB8KCgoDBwADEgM/IiYK8gEKAQcSBEYASgEa5gEgT25lb2ZPcHRpb25zIGlzIGFuIGV4dGVuc2lvbiB0byBnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLiBJdCBhbGxvd3MKIHRoZSBhZGRpdGlvbiBvZiB2YWxpZGF0aW9uIHJ1bGVzIG9uIGEgb25lb2YuIFRoZXNlIHJ1bGVzIGNhbiBiZQogYXBwbGllZCB0byBpbmNvbWluZyBtZXNzYWdlcyB0byBlbnN1cmUgdGhleSBtZWV0IGNlcnRhaW4gY3JpdGVyaWEgYmVmb3JlCiBiZWluZyBwcm9jZXNzZWQuCgqCAQoCBwESA0kCIxp3IFJ1bGVzIHNwZWNpZnkgdGhlIHZhbGlkYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGlzIG9uZW9mLiBCeSBkZWZhdWx0LAogbm8gdmFsaWRhdGlvbiBpcyBwZXJmb3JtZWQgYWdhaW5zdCBhIG9uZW9mLgoKCgoDBwECEgNGByMKCgoDBwEEEgNJAgoKCgoDBwEGEgNJCxUKCgoDBwEBEgNJFhsKCgoDBwEDEgNJHiIK+gEKAQcSBFAAZgEa7gEgRmllbGRPcHRpb25zIGlzIGFuIGV4dGVuc2lvbiB0byBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLiBJdCBhbGxvd3MKIHRoZSBhZGRpdGlvbiBvZiB2YWxpZGF0aW9uIHJ1bGVzIGF0IHRoZSBmaWVsZCBsZXZlbC4gVGhlc2UgcnVsZXMgY2FuIGJlCiBhcHBsaWVkIHRvIGluY29taW5nIG1lc3NhZ2VzIHRvIGVuc3VyZSB0aGV5IG1lZXQgY2VydGFpbiBjcml0ZXJpYSBiZWZvcmUKIGJlaW5nIHByb2Nlc3NlZC4KCoIBCgIHAhIDUwIjGncgUnVsZXMgc3BlY2lmeSB0aGUgdmFsaWRhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoaXMgZmllbGQuIEJ5IGRlZmF1bHQsCiBubyB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IGEgZmllbGQuCgoKCgMHAgISA1AHIwoKCgMHAgQSA1MCCgoKCgMHAgYSA1MLFQoKCgMHAgESA1MWGwoKCgMHAgMSA1MeIgrKAwoCBwMSA2UCLRq+AyBTcGVjaWZpZXMgcHJlZGVmaW5lZCBydWxlcy4gV2hlbiBleHRlbmRpbmcgYSBzdGFuZGFyZCBydWxlIG1lc3NhZ2UsCiB0aGlzIGFkZHMgYWRkaXRpb25hbCBDRUwgZXhwcmVzc2lvbnMgdGhhdCBhcHBseSB3aGVuIHRoZSBleHRlbnNpb24gaXMgdXNlZC4KCiBgYGBwcm90bwogZXh0ZW5kIGJ1Zi52YWxpZGF0ZS5JbnQzMlJ1bGVzIHsKICAgYm9vbCBpc196ZXJvIFsoYnVmLnZhbGlkYXRlLnByZWRlZmluZWQpLmNlbCA9IHsKICAgICBpZDogImludDMyLmlzX3plcm8iLAogICAgIG1lc3NhZ2U6ICJ2YWx1ZSBtdXN0IGJlIHplcm8iLAogICAgIGV4cHJlc3Npb246ICIhcnVsZSB8fCB0aGlzID09IDAiLAogICB9XTsKIH0KCiBtZXNzYWdlIEZvbyB7CiAgIGludDMyIHJlc2VydmVkID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuaW50MzIuKGlzX3plcm8pID0gdHJ1ZV07CiB9CiBgYGAKCgoKAwcDAhIDUAcjCgoKAwcDBBIDZQIKCgoKAwcDBhIDZQsaCgoKAwcDARIDZRslCgoKAwcDAxIDZSgsCoEECgIEABIFdwCHAQEa8wMgYFJ1bGVgIHJlcHJlc2VudHMgYSB2YWxpZGF0aW9uIHJ1bGUgd3JpdHRlbiBpbiB0aGUgQ29tbW9uIEV4cHJlc3Npb24KIExhbmd1YWdlIChDRUwpIHN5bnRheC4gRWFjaCBSdWxlIGluY2x1ZGVzIGEgdW5pcXVlIGlkZW50aWZpZXIsIGFuCiBvcHRpb25hbCBlcnJvciBtZXNzYWdlLCBhbmQgdGhlIENFTCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiBGb3IgbW9yZQogaW5mb3JtYXRpb24sIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIEZvbyB7CiAgIG9wdGlvbiAoYnVmLnZhbGlkYXRlLm1lc3NhZ2UpLmNlbCA9IHsKICAgICBpZDogImZvby5iYXIiCiAgICAgbWVzc2FnZTogImJhciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIgogICAgIGV4cHJlc3Npb246ICJ0aGlzLmJhciA+IDAiCiAgIH07CiAgIGludDMyIGJhciA9IDE7CiB9CiBgYGAKCgoKAwQAARIDdwgMCqkBCgQEAAIAEgN6AhkamwEgYGlkYCBpcyBhIHN0cmluZyB0aGF0IHNlcnZlcyBhcyBhIG1hY2hpbmUtcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBSdWxlLgogSXQgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gaXRzIHNjb3BlLCB3aGljaCBjb3VsZCBiZSBlaXRoZXIgYSBtZXNzYWdlIG9yIGEgZmllbGQuCgoMCgUEAAIABBIDegIKCgwKBQQAAgAFEgN6CxEKDAoFBAACAAESA3oSFAoMCgUEAAIAAxIDehcYCoMCCgQEAAIBEgSAAQIeGvQBIGBtZXNzYWdlYCBpcyBhbiBvcHRpb25hbCBmaWVsZCB0aGF0IHByb3ZpZGVzIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZQogZm9yIHRoaXMgUnVsZSB3aGVuIHRoZSBDRUwgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UuIElmIGEKIG5vbi1lbXB0eSBtZXNzYWdlIGlzIHByb3ZpZGVkLCBhbnkgc3RyaW5ncyByZXN1bHRpbmcgZnJvbSB0aGUgQ0VMCiBleHByZXNzaW9uIGV2YWx1YXRpb24gYXJlIGlnbm9yZWQuCgoNCgUEAAIBBBIEgAECCgoNCgUEAAIBBRIEgAELEQoNCgUEAAIBARIEgAESGQoNCgUEAAIBAxIEgAEcHQqiAgoEBAACAhIEhgECIRqTAiBgZXhwcmVzc2lvbmAgaXMgdGhlIGFjdHVhbCBDRUwgZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGZvcgogdmFsaWRhdGlvbi4gVGhpcyBzdHJpbmcgbXVzdCByZXNvbHZlIHRvIGVpdGhlciBhIGJvb2xlYW4gb3IgYSBzdHJpbmcKIHZhbHVlLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2Ugb3IgYSBub24tZW1wdHkgc3RyaW5nLCB0aGUKIHZhbGlkYXRpb24gaXMgY29uc2lkZXJlZCBmYWlsZWQsIGFuZCB0aGUgbWVzc2FnZSBpcyByZWplY3RlZC4KCg0KBQQAAgIEEgSGAQIKCg0KBQQAAgIFEgSGAQsRCg0KBQQAAgIBEgSGARIcCg0KBQQAAgIDEgSGAR8gCtwBCgIEARIGiwEA1wEBGs0BIE1lc3NhZ2VSdWxlcyByZXByZXNlbnRzIHZhbGlkYXRpb24gcnVsZXMgdGhhdCBhcmUgYXBwbGllZCB0byB0aGUgZW50aXJlIG1lc3NhZ2UuCiBJdCBpbmNsdWRlcyBkaXNhYmxpbmcgb3B0aW9ucyBhbmQgYSBsaXN0IG9mIFJ1bGUgbWVzc2FnZXMgcmVwcmVzZW50aW5nIENvbW1vbiBFeHByZXNzaW9uIExhbmd1YWdlIChDRUwpIHZhbGlkYXRpb24gcnVsZXMuCgoLCgMEAQESBIsBCBQK1AYKBAQBAgASBJ4BAiUaxQYgYGNlbF9leHByZXNzaW9uYCBpcyBhIHJlcGVhdGVkIGZpZWxkIENFTCBleHByZXNzaW9ucy4gRWFjaCBleHByZXNzaW9uIHNwZWNpZmllcyBhIHZhbGlkYXRpb24KIHJ1bGUgdG8gYmUgYXBwbGllZCB0byB0aGlzIG1lc3NhZ2UuIFRoZXNlIHJ1bGVzIGFyZSB3cml0dGVuIGluIENvbW1vbiBFeHByZXNzaW9uIExhbmd1YWdlIChDRUwpIHN5bnRheC4KCiBUaGlzIGlzIGEgc2ltcGxpZmllZCBmb3JtIG9mIHRoZSBgY2VsYCBSdWxlIGZpZWxkLCB3aGVyZSBvbmx5IGBleHByZXNzaW9uYCBpcyBzZXQuIFRoaXMgYWxsb3dzIGZvcgogc2ltcGxlciBzeW50YXggd2hlbiBkZWZpbmluZyBDRUwgUnVsZXMgd2hlcmUgYGlkYCBhbmQgYG1lc3NhZ2VgIGRlcml2ZWQgZnJvbSB0aGUgYGV4cHJlc3Npb25gLiBgaWRgIHdpbGwKIGJlIHNhbWUgYXMgdGhlIGBleHByZXNzaW9uYC4KCiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgW3NlZSBvdXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9idWYuYnVpbGQvZG9jcy9wcm90b3ZhbGlkYXRlL3NjaGVtYXMvY3VzdG9tLXJ1bGVzLykuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGBmb29gIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb24gKGJ1Zi52YWxpZGF0ZS5tZXNzYWdlKS5jZWxfZXhwcmVzc2lvbiA9ICJ0aGlzLmZvbyA+IDQyIjsKICAgLy8gVGhlIGZpZWxkIGBmb29gIG11c3QgYmUgbGVzcyB0aGFuIDg0LgogICBvcHRpb24gKGJ1Zi52YWxpZGF0ZS5tZXNzYWdlKS5jZWxfZXhwcmVzc2lvbiA9ICJ0aGlzLmZvbyA8IDg0IjsKICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsKIH0KIGBgYAoKDQoFBAECAAQSBJ4BAgoKDQoFBAECAAUSBJ4BCxEKDQoFBAECAAESBJ4BEiAKDQoFBAECAAMSBJ4BIyQKvgQKBAQBAgESBK8BAhgarwQgYGNlbGAgaXMgYSByZXBlYXRlZCBmaWVsZCBvZiB0eXBlIFJ1bGUuIEVhY2ggUnVsZSBzcGVjaWZpZXMgYSB2YWxpZGF0aW9uIHJ1bGUgdG8gYmUgYXBwbGllZCB0byB0aGlzIG1lc3NhZ2UuCiBUaGVzZSBydWxlcyBhcmUgd3JpdHRlbiBpbiBDb21tb24gRXhwcmVzc2lvbiBMYW5ndWFnZSAoQ0VMKSBzeW50YXguIEZvciBtb3JlIGluZm9ybWF0aW9uLAogW3NlZSBvdXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9idWYuYnVpbGQvZG9jcy9wcm90b3ZhbGlkYXRlL3NjaGVtYXMvY3VzdG9tLXJ1bGVzLykuCgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgZm9vYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0Mi4KICAgb3B0aW9uIChidWYudmFsaWRhdGUubWVzc2FnZSkuY2VsID0gewogICAgIGlkOiAibXlfbWVzc2FnZS52YWx1ZSIsCiAgICAgbWVzc2FnZTogInZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyIiwKICAgICBleHByZXNzaW9uOiAidGhpcy5mb28gPiA0MiIsCiAgIH07CiAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7CiB9CiBgYGAKCg0KBQQBAgEEEgSvAQIKCg0KBQQBAgEGEgSvAQsPCg0KBQQBAgEBEgSvARATCg0KBQQBAgEDEgSvARYXCskOCgQEAQICEgTTAQImGroOIGBvbmVvZmAgaXMgYSByZXBlYXRlZCBmaWVsZCBvZiB0eXBlIE1lc3NhZ2VPbmVvZlJ1bGUgdGhhdCBzcGVjaWZpZXMgYSBsaXN0IG9mIGZpZWxkcwogb2Ygd2hpY2ggYXQgbW9zdCBvbmUgY2FuIGJlIHByZXNlbnQuIElmIGByZXF1aXJlZGAgaXMgYWxzbyBzcGVjaWZpZWQsIHRoZW4gZXhhY3RseSBvbmUKIG9mIHRoZSBzcGVjaWZpZWQgZmllbGRzIF9tdXN0XyBiZSBwcmVzZW50LgoKIFRoaXMgd2lsbCBlbmZvcmNlIG9uZW9mLWxpa2UgY29uc3RyYWludHMgd2l0aCBhIGZldyBmZWF0dXJlcyBub3QgcHJvdmlkZWQgYnkKIGFjdHVhbCBQcm90b2J1ZiBvbmVvZiBkZWNsYXJhdGlvbnM6CiAgIDEuIFJlcGVhdGVkIGFuZCBtYXAgZmllbGRzIGFyZSBhbGxvd2VkIGluIHRoaXMgdmFsaWRhdGlvbi4gSW4gYSBQcm90b2J1ZiBvbmVvZiwKICAgICAgb25seSBzY2FsYXIgZmllbGRzIGFyZSBhbGxvd2VkLgogICAyLiBGaWVsZHMgd2l0aCBpbXBsaWNpdCBwcmVzZW5jZSBhcmUgYWxsb3dlZC4gSW4gYSBQcm90b2J1ZiBvbmVvZiwgYWxsIG1lbWJlcgogICAgICBmaWVsZHMgaGF2ZSBleHBsaWNpdCBwcmVzZW5jZS4gVGhpcyBtZWFucyB0aGF0LCBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV0ZXJtaW5pbmcKICAgICAgaG93IG1hbnkgZmllbGRzIGFyZSBzZXQsIGV4cGxpY2l0bHkgc2V0dGluZyBzdWNoIGEgZmllbGQgdG8gaXRzIHplcm8gdmFsdWUgaXMKICAgICAgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgbm90IHNldHRpbmcgaXQgYXQgYWxsLgogICAzLiBUaGlzIHdpbGwgYWx3YXlzIGdlbmVyYXRlIHZhbGlkYXRpb24gZXJyb3JzIGZvciBhIG1lc3NhZ2UgdW5tYXJzaGFsbGVkIGZyb20KICAgICAgc2VyaWFsaXplZCBkYXRhIHRoYXQgc2V0cyBtb3JlIHRoYW4gb25lIGZpZWxkLiBXaXRoIGEgUHJvdG9idWYgb25lb2YsIHdoZW4KICAgICAgbXVsdGlwbGUgZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGZvcm0sIGVhcmxpZXIgdmFsdWVzIGFyZSB1c3VhbGx5CiAgICAgIHNpbGVudGx5IGlnbm9yZWQgd2hlbiB1bm1hcnNoYWxsaW5nLCB3aXRoIG9ubHkgdGhlIGxhc3QgZmllbGQgYmVpbmcgc2V0IHdoZW4KICAgICAgdW5tYXJzaGFsbGluZyBjb21wbGV0ZXMuCgogTm90ZSB0aGF0IGFkZGluZyBhIGZpZWxkIHRvIGEgYG9uZW9mYCB3aWxsIGFsc28gc2V0IHRoZSBJR05PUkVfSUZfWkVST19WQUxVRSBvbiB0aGUgZmllbGRzLiBUaGlzIG1lYW5zCiBvbmx5IHRoZSBmaWVsZCB0aGF0IGlzIHNldCB3aWxsIGJlIHZhbGlkYXRlZCBhbmQgdGhlIHVuc2V0IGZpZWxkcyBhcmUgbm90IHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZpZWxkIHJ1bGVzLgogVGhpcyBiZWhhdmlvciBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0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9QEQGAoNCgUEAwIAAxIE9QEbHAqgAQoCBAQSBvoBAIEDARqRASBGaWVsZFJ1bGVzIGVuY2Fwc3VsYXRlcyB0aGUgcnVsZXMgZm9yIGVhY2ggdHlwZSBvZiBmaWVsZC4gRGVwZW5kaW5nIG9uCiB0aGUgZmllbGQsIHRoZSBjb3JyZWN0IHNldCBzaG91bGQgYmUgdXNlZCB0byBlbnN1cmUgcHJvcGVyIHZhbGlkYXRpb25zLgoKCwoDBAQBEgT6AQgSCtoFCgQEBAIAEgSKAgImGssFIGBjZWxfZXhwcmVzc2lvbmAgaXMgYSByZXBlYXRlZCBmaWVsZCBDRUwgZXhwcmVzc2lvbnMuIEVhY2ggZXhwcmVzc2lvbiBzcGVjaWZpZXMgYSB2YWxpZGF0aW9uCiBydWxlIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBtZXNzYWdlLiBUaGVzZSBydWxlcyBhcmUgd3JpdHRlbiBpbiBDb21tb24gRXhwcmVzc2lvbiBMYW5ndWFnZSAoQ0VMKSBzeW50YXguCgogVGhpcyBpcyBhIHNpbXBsaWZpZWQgZm9ybSBvZiB0aGUgYGNlbGAgUnVsZSBmaWVsZCwgd2hlcmUgb25seSBgZXhwcmVzc2lvbmAgaXMgc2V0LiBUaGlzIGFsbG93cyBmb3IKIHNpbXBsZXIgc3ludGF4IHdoZW4gZGVmaW5pbmcgQ0VMIFJ1bGVzIHdoZXJlIGBpZGAgYW5kIGBtZXNzYWdlYCBkZXJpdmVkIGZyb20gdGhlIGBleHByZXNzaW9uYC4gYGlkYCB3aWxsCiBiZSBzYW1lIGFzIHRoZSBgZXhwcmVzc2lvbmAuCgogRm9yIG1vcmUgaW5mb3JtYXRpb24sIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgdmFsdWVgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmNlbF9leHByZXNzaW9uID0gInRoaXMgPiA0MiJdOwogfQogYGBgCgoNCgUEBAIABBIEigICCgoNCgUEBAIABRIEigILEQoNCgUEBAIAARIEigISIAoNCgUEBAIAAxIEigIjJQryAwoEBAQCARIEmQICGRrjAyBgY2VsYCBpcyBhIHJlcGVhdGVkIGZpZWxkIHVzZWQgdG8gcmVwcmVzZW50IGEgdGV4dHVhbCBleHByZXNzaW9uCiBpbiB0aGUgQ29tbW9uIEV4cHJlc3Npb24gTGFuZ3VhZ2UgKENFTCkgc3ludGF4LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwKIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgdmFsdWVgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmNlbCA9IHsKICAgICBpZDogIm15X21lc3NhZ2UudmFsdWUiLAogICAgIG1lc3NhZ2U6ICJ2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0MiIsCiAgICAgZXhwcmVzc2lvbjogInRoaXMgPiA0MiIsCiAgIH1dOwogfQogYGBgCgoNCgUEBAIBBBIEmQICCgoNCgUEBAIBBhIEmQILDwoNCgUEBAIBARIEmQIQEwoNCgUEBAIBAxIEmQIWGArhDgoEBAQCAhIE0gICHhrSDiBJZiBgcmVxdWlyZWRgIGlzIHRydWUsIHRoZSBmaWVsZCBtdXN0IGJlIHNldC4gQSB2YWxpZGF0aW9uIGVycm9yIGlzIHJldHVybmVkCiBpZiB0aGUgZmllbGQgaXMgbm90IHNldC4KCiBgYGBwcm90bwogc3ludGF4PSJwcm90bzMiOwoKIG1lc3NhZ2UgRmllbGRzV2l0aFByZXNlbmNlIHsKICAgLy8gUmVxdWlyZXMgYW55IHN0cmluZyB0byBiZSBzZXQsIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgogICBvcHRpb25hbCBzdHJpbmcgbGluayA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogICAvLyBSZXF1aXJlcyB0cnVlIG9yIGZhbHNlIHRvIGJlIHNldC4KICAgb3B0aW9uYWwgYm9vbCBkaXNhYmxlZCA9IDIgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogICAvLyBSZXF1aXJlcyBhIG1lc3NhZ2UgdG8gYmUgc2V0LCBpbmNsdWRpbmcgdGhlIGVtcHR5IG1lc3NhZ2UuCiAgIFNvbWVNZXNzYWdlIG1zZyA9IDQgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogfQogYGBgCgogQWxsIGZpZWxkcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSB0cmFjayBwcmVzZW5jZS4gQnkgZGVmYXVsdCwgUHJvdG92YWxpZGF0ZQogaWdub3JlcyBydWxlcyBvbiB0aG9zZSBmaWVsZHMgaWYgbm8gdmFsdWUgaXMgc2V0LiBgcmVxdWlyZWRgIGVuc3VyZXMgdGhhdAogdGhlIGZpZWxkcyBhcmUgc2V0IGFuZCB2YWxpZC4KCiBGaWVsZHMgdGhhdCBkb24ndCB0cmFjayBwcmVzZW5jZSBhcmUgYWx3YXlzIHZhbGlkYXRlZCBieSBQcm90b3ZhbGlkYXRlLAogd2hldGhlciB0aGV5IGFyZSBzZXQgb3Igbm90LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBgcmVxdWlyZWRgLiBJdAogY2FuIGJlIGFkZGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGZpZWxkIGNhbm5vdCBiZSB0aGUgemVybyB2YWx1ZS4KCiBgYGBwcm90bwogc3ludGF4PSJwcm90bzMiOwoKIG1lc3NhZ2UgRmllbGRzV2l0aG91dFByZXNlbmNlIHsKICAgLy8gYHN0cmluZy5lbWFpbGAgYWx3YXlzIGFwcGxpZXMsIGV2ZW4gdG8gYW4gZW1wdHkgc3RyaW5nLgogICBzdHJpbmcgbGluayA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5lbWFpbCA9IHRydWUKICAgXTsKICAgLy8gYHJlcGVhdGVkLm1pbl9pdGVtc2AgYWx3YXlzIGFwcGxpZXMsIGV2ZW4gdG8gYW4gZW1wdHkgbGlzdC4KICAgcmVwZWF0ZWQgc3RyaW5nIGxhYmVscyA9IDIgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcGVhdGVkLm1pbl9pdGVtcyA9IDEKICAgXTsKICAgLy8gYHJlcXVpcmVkYCwgZm9yIGZpZWxkcyB0aGF0IGRvbid0IHRyYWNrIHByZXNlbmNlLCBpbmRpY2F0ZXMKICAgLy8gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBjYW4ndCBiZSB0aGUgemVybyB2YWx1ZS4KICAgaW50MzIgemVyb192YWx1ZV9ub3RfYWxsb3dlZCA9IDMgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogfQogYGBgCgogVG8gbGVhcm4gd2hpY2ggZmllbGRzIHRyYWNrIHByZXNlbmNlLCBzZWUgdGhlCiBbRmllbGQgUHJlc2VuY2UgY2hlYXQgc2hlZXRdKGh0dHBzOi8vcHJvdG9idWYuZGV2L3Byb2dyYW1taW5nLWd1aWRlcy9maWVsZF9wcmVzZW5jZS8jY2hlYXQpLgoKIE5vdGU6IFdoaWxlIGZpZWxkIHJ1bGVzIGNhbiBiZSBhcHBsaWVkIHRvIHJlcGVhdGVkIGl0ZW1zLCBtYXAga2V5cywgYW5kIG1hcAogdmFsdWVzLCB0aGUgZWxlbWVudHMgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIHNldC4gQ29uc2VxdWVudGx5LAogc3BlY2lmeWluZyBgcmVwZWF0ZWQuaXRlbXMucmVxdWlyZWRgIGlzIHJlZHVuZGFudC4KCg0KBQQEAgIEEgTSAgIKCg0KBQQEAgIFEgTSAgsPCg0KBQQEAgIBEgTSAhAYCg0KBQQEAgIDEgTSAhsdCvYCCgQEBAIDEgTfAgIeGucCIElnbm9yZSB2YWxpZGF0aW9uIHJ1bGVzIG9uIHRoZSBmaWVsZCBpZiBpdHMgdmFsdWUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCiBjcml0ZXJp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AQoCBQASBpwDAPQDARp0IFNwZWNpZmllcyBob3cgYEZpZWxkUnVsZXMuaWdub3JlYCBiZWhhdmVzLCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkJ3MgdmFsdWUsIGFuZAogd2hldGhlciB0aGUgZmllbGQgdHJhY2tzIHByZXNlbmNlLgoKCwoDBQABEgScAwULCpQKCgQFAAIAEgTQAwIZGoUKIElnbm9yZSBydWxlcyBpZiB0aGUgZmllbGQgdHJhY2tzIHByZXNlbmNlIGFuZCBpcyB1bnNldC4gVGhpcyBpcyB0aGUgZGVmYXVsdAogYmVoYXZpb3IuCgogSW4gcHJvdG8zLCBvbmx5IG1lc3NhZ2UgZmllbGRzLCBtZW1iZXJzIG9mIGEgUHJvdG9idWYgYG9uZW9mYCwgYW5kIGZpZWxkcwogd2l0aCB0aGUgYG9wdGlvbmFsYCBsYWJlbCB0cmFjayBwcmVzZW5jZS4gQ29uc2VxdWVudGx5LCB0aGUgZm9sbG93aW5nIGZpZWxkcwogYXJlIGFsd2F5cyB2YWxpZGF0ZWQsIHdoZXRoZXIgYSB2YWx1ZSBpcyBzZXQgb3Igbm90OgoKIGBgYHByb3RvCiBzeW50YXg9InByb3RvMyI7CgogbWVzc2FnZSBSdWxlc0FwcGx5IHsKICAgc3RyaW5nIGVtYWlsID0gMSBbCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLmVtYWlsID0gdHJ1ZQogICBdOwogICBpbnQzMiBhZ2UgPSAyIFsKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5pbnQzMi5ndCA9IDAKICAgXTsKICAgcmVwZWF0ZWQgc3RyaW5nIGxhYmVscyA9IDMgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcGVhdGVkLm1pbl9pdGVtcyA9IDEKICAgXTsKIH0KIGBgYAoKIEluIGNvbnRyYXN0LCB0aGUgZm9sbG93aW5nIGZpZWxkcyB0cmFjayBwcmVzZW5jZSwgYW5kIGFyZSBvbmx5IHZhbGlkYXRlZCBpZgogYSB2YWx1ZSBpcyBzZXQ6CgogYGBgcHJvdG8KIHN5bnRheD0icHJvdG8zIjsKCiBtZXNzYWdlIFJ1bGVzQXBwbHlJZlNldCB7CiAgIG9wdGlvbmFsIHN0cmluZyBlbWFpbCA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5lbWFpbCA9IHRydWUKICAgXTsKICAgb25lb2YgcmVmIHsKICAgICBzdHJpbmcgcmVmZXJlbmNlID0gMiBbCiAgICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcudXVpZCA9IHRydWUKICAgICBdOwogICAgIHN0cmluZyBuYW1lID0gMyBbCiAgICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcubWluX2xlbiA9IDQKICAgICBdOwogICB9CiAgIFNvbWVNZXNzYWdlIG1zZyA9IDQgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLmNlbCA9IHsvKiAuLi4gKi99CiAgIF07CiB9CiBgYGAKCiBUbyBlbnN1cmUgdGhhdCBzdWNoIGEgZmllbGQgaXMgc2V0LCBhZGQgdGhlIGByZXF1aXJlZGAgcnVsZS4KCiBUbyBsZWFybiB3aGljaCBmaWVsZHMgdHJhY2sgcHJlc2VuY2UsIHNlZSB0aGUKIFtGaWVsZCBQcmVzZW5jZSBjaGVhdCBzaGVldF0oaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2ZpZWxkX3ByZXNlbmNlLyNjaGVhdCkuCgoNCgUFAAIAARIE0AMCFAoNCgUFAAIAAhIE0AMXGArJBQoEBQACARIE4AMCGxq6BSBJZ25vcmUgcnVsZXMgaWYgdGhlIGZpZWxkIGlzIHVuc2V0LCBvciBzZXQgdG8gdGhlIHplcm8gdmFsdWUuCgogVGhlIHplcm8gdmFsdWUgZGVwZW5kcyBvbiB0aGUgZmllbGQgdHlwZToKIC0gRm9yIHN0cmluZ3MsIHRoZSB6ZXJvIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcuCiAtIEZvciBieXRlcywgdGhlIHplcm8gdmFsdWUgaXMgZW1wdHkgYnl0ZXMuCiAtIEZvciBib29sLCB0aGUgemVybyB2YWx1ZSBpcyBmYWxzZS4KIC0gRm9yIG51bWVyaWMgdHlwZXMsIHRoZSB6ZXJvIHZhbHVlIGlzIHplcm8uCiAtIEZvciBlbnVtcywgdGhlIHplcm8gdmFsdWUgaXMgdGhlIGZpcnN0IGRlZmluZWQgZW51bSB2YWx1ZS4KIC0gRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhlIHplcm8gaXMgYW4gZW1wdHkgbGlzdC4KIC0gRm9yIG1hcCBmaWVsZHMsIHRoZSB6ZXJvIGlzIGFuIGVtcHR5IG1hcC4KIC0gRm9yIG1lc3NhZ2UgZmllbGRzLCBhYnNlbmNlIG9mIHRoZSBtZXNzYWdlICh0eXBpY2FsbHkgYSBudWxsLXZhbHVlKSBpcyBjb25zaWRlcmVkIHplcm8gdmFsdWUuCgogRm9yIGZpZWxkcyB0aGF0IHRyYWNrIHByZXNlbmNlIChlLmcuIGFkZGluZyB0aGUgYG9wdGlvbmFsYCBsYWJlbCBpbiBwcm90bzMpLAogdGhpcyBhIG5vLW9wIGFuZCBiZWhhdmlvciBpcyB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCBgSUdOT1JFX1VOU1BFQ0lGSUVEYC4KCg0KBQUAAgEBEgTgAwIWCg0KBQUAAgECEgTgAxkaCpkDCgQFAAICEgTwAwIUGooDIEFsd2F5cyBpZ25vcmUgcnVsZXMsIGluY2x1ZGluZyB0aGUgYHJlcXVpcmVkYCBydWxlLgoKIFRoaXMgaXMgdXNlZnVsIGZvciBpZ25vcmluZyB0aGUgcnVsZXMgb2YgYSByZWZlcmVuY2VkIG1lc3NhZ2UsIG9yIHRvCiB0ZW1wb3JhcmlseSBpZ25vcmUgcnVsZXMgZHVyaW5nIGRldmVsb3BtZW50LgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCdzIHJ1bGVzIHdpbGwgYWx3YXlzIGJlIGlnbm9yZWQsIGluY2x1ZGluZyBhbnkgdmFsaWRhdGlvbnMKICAgLy8gb24gdmFsdWUncyBmaWVsZHMuCiAgIE15T3RoZXJNZXNzYWdlIHZhbHVlID0gMSBbCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuaWdub3JlID0gSUdOT1JFX0FMV0FZUwogICBdOwogfQogYGBgCgoNCgUFAAICARIE8AMCDwoNCgUFAAICAhIE8AMSEwoLCgMFAAQSBPIDAg0KDAoEBQAEABIE8gMLDAoNCgUFAAQA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FAoKBAoCAwiICQEDAxIGoAsIogttChMKCQQKAgMIiAkBBBIGpAsGqQsHChIKCgQKAgMIiAkBBAESBKULCCUKFAoKBAoCAwiICQEEAxIGpgsIqAtsCsQGCgQECgIEEga+CwTdCwYaswYgYGd0ZWAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSAoZXhjbHVzaXZlKS4gSWYgdGhlIHZhbHVlIG9mIGBndGVgIGlzIGxhcmdlciB0aGFuIGEgc3BlY2lmaWVkIGBsdGAKIG9yIGBsdGVgLCB0aGUgcmFuZ2UgaXMgcmV2ZXJzZWQsIGFuZCB0aGUgZmllbGQgdmFsdWUgbXVzdCBiZSBvdXRzaWRlIHRoZQogc3BlY2lmaWVkIHJhbmdlLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlVSW50MzIgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IFt1aW50MzIuZ3RlXQogICB1aW50MzIgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS51aW50MzIuZ3RlID0gNV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IGFuZCBsZXNzIHRoYW4gMTAgW3VpbnQzMi5ndGVfbHRdCiAgIHVpbnQzMiBvdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLnVpbnQzMiA9IHsgZ3RlOiA1LCBsdDogMTAgfV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxMCBvciBsZXNzIHRoYW4gNSBbdWludDMyLmd0ZV9sdF9leGNsdXNpdmVdCiAgIHVpbnQzMiBhbm90aGVyX3ZhbHVlID0gMyBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudWludDMyID0geyBndGU6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EgTbEQgcChQKCgQOAgMIiAkBAwMSBtwRCN4RbQoTCgkEDgIDCIgJAQQSBuARBuURBwoSCgoEDgIDCIgJAQQBEgThEQgmChQKCgQOAgMIiAkBBAMSBuIRCOQRbArOBgoEBA4CBBIG+hEEmRIGGr0GIGBndGVgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAogdmFsdWUgKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RlYCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Rml4ZWQzMiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgW2ZpeGVkMzIuZ3RlXQogICBmaXhlZDMyIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQzMi5ndGUgPSA1XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgYW5kIGxlc3MgdGhhbiAxMCBbZml4ZWQzMi5ndGVfbHRdCiAgIGZpeGVkMzIgb3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5maXhlZDMyID0geyBndGU6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwIG9yIGxlc3MgdGhhbiA1IFtmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmVdCiAgIGZpeGVkMzIgYW5vdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQp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AAESBP0SBhcKFAoKBA8CAgiICQEAAxIG/hIGgBNNCg4KBAQPCAESBoMTAukTAwoNCgUEDwgBARIEgxMIFAqWBgoEBA8CAxIGlhMEtRMGGoUGIGBndGAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlCiAoZXhjbHVzaXZlKS4gSWYgdGhlIHZhbHVlIG9mIGBndGAgaXMgbGFyZ2VyIHRoYW4gYSBzcGVjaWZpZWQgYGx0YCBvcgogYGx0ZWAsIHRoZSByYW5nZSBpcyByZXZlcnNlZCwgYW5kIHRoZSBmaWVsZCB2YWx1ZSBtdXN0IGJlIG91dHNpZGUgdGhlCiBzcGVjaWZpZWQgcmFuZ2UuIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1lZXQgdGhlIHJlcXVpcmVkIGNvbmRpdGlvbnMsCiBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA1IFtmaXhlZDY0Lmd0XQogICBmaXhlZDY0IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NC5ndCA9IDVdOwoKICAgLy8gdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gNSBhbmQgbGVzcyB0aGFuIDEwIFtmaXhlZDY0Lmd0X2x0XQogICBmaXhlZDY0IG90aGVyX3ZhbHVlID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NCA9IHsgZ3Q6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEwIG9yIGxlc3MgdGhhbiA1IFtmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZV0KICAgZml4ZWQ2NCBhbm90aGVyX3ZhbHVlID0gMyBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NCA9IHsgZ3Q6IDEwLCBsdDogNSB9XTsKIH0KIGBgYAoKDQoFBA8CAwUSBJYTBAsKDQoFBA8CAwESBJYTDA4KDQoFBA8CAwMSBJYTERIK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cXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAogdmFsdWUgKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RlYCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U0ZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IFtzZml4ZWQ2NC5ndGVdCiAgIHNmaXhlZDY0IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc2ZpeGVkNjQuZ3RlID0gNV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IGFuZCBsZXNzIHRoYW4gMTAgW3NmaXhlZDY0Lmd0ZV9sdF0KICAgc2ZpeGVkNjQgb3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zZml4ZWQ2NCA9IHsgZ3RlOiA1LCBsdDogMTAgfV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxMCBvciBsZXNzIHRoYW4gNSBbc2ZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZV0KICAgc2ZpeGVkNjQgYW5vdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDY0ID0geyBndGU6IDEwLCBsdDogNSB9XTsKIH0KIGBgYAoKDQoFBBECBAUSBOcWBAwKDQoFBBECBAESBOcWDRAKDQoFBBECBAMSBOcWExQKDwoFBBECBAgSBucWFYYXBQoTCgkEEQIE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ZWxkIHZhbHVlIG11c3QgbWF0Y2ggdGhlIHNwZWNpZmllZAogcmVndWxhciBleHByZXNzaW9uIChSRTIgc3ludGF4KSwgd2l0aCB0aGUgZXhwcmVzc2lvbiBwcm92aWRlZCB3aXRob3V0IGFueQogZGVsaW1pdGVycy4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYW4KIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTdHJpbmcgewogICAvLyB2YWx1ZSBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIGBeW2EtekEtWl0vLyRgCiAgIHN0cmluZyB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5wYXR0ZXJuID0gIl5bYS16QS1aXS8vJCJdOwogfQogYGBgCgoNCgUEEwIHBBIE4BgCCgoNCgUEEwIHBRIE4BgLEQoNCgUEEwIHARIE4BgSGQoNCgUEEwIHAxIE4BgcHQoPCgUEEwIHCBIG4Bge4xgEChMKCQQTAgcIiAkBABIG4Bgf4xgDChIKCgQTAgcIiAkBAAESBOEYBBgKEgoKBBMCBwiICQEAAxIE4hgEdwruAgoEBBMCCBIG8BgC8xgFGt0CIGBwcmVmaXhgIHNwZWNpZmllcyB0aGF0IHRoZSBmaWVsZCB2YWx1ZSBtdXN0IGhhdmUgdGhlCnNwZWNpZmllZCBzdWJzdHJpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLiBJZiB0aGUgZmllbGQgdmFsdWUKIGRvZXNuJ3Qgc3RhcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlCiBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTdHJpbmcgewogICAvLyB2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCBgcHJlYAogICBzdHJpbmcgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcucHJlZml4ID0gInByZSJdOwogfQogYGBgCgoNCgUE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AAESBLsZBBcKEgoKBBMCDQiICQEAAxIEvBkEYwpbCgQEEwgAEgbBGQK9HQMaSyBgV2VsbEtub3duYCBydWxlcyBwcm92aWRlIGFkdmFuY2VkIHJ1bGVzIGFnYWluc3QgY29tbW9uIHN0cmluZwogcGF0dGVybnMuCgoNCgUEEwgAARIEwRkIEgrJBQoEBBMCDhIG0hkE3RkGGrgFIGBlbWFpbGAgc3BlY2lmaWVzIHRoYXQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLCBmb3IKIGV4YW1wbGUgImZvb0BleGFtcGxlLmNvbSIuCgogQ29uZm9ybXMgdG8gdGhlIGRlZmluaXRpb24gZm9yIGEgdmFsaWQgZW1haWwgYWRkcmVzcyBmcm9tIHRoZSBbSFRNTCBzdGFuZGFyZF0oaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5wdXQuaHRtbCN2YWxpZC1lLW1haWwtYWRkcmVzcykuCiBOb3RlIHRoYXQgdGhpcyBzdGFuZGFyZCB3aWxsZnVsbHkgZGV2aWF0ZXMgZnJvbSBbUkZDIDUzMjJdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNTMyMiksCiB3aGljaCBhbGxvd3MgbWFueSB1bmV4cGVjdGVkIGZvcm1zIG9mIGVtYWlsIGFkZHJlc3NlcyBhbmQgd2lsbCBlYXNpbHkgbWF0Y2gKIGEgdHlwb2dyYXBoaWNhbCBlcnJvci4KCiBJZiB0aGUgZmllbGQgdmFsdWUgaXNuJ3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLCBhbiBlcnJvciBtZXNzYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U3RyaW5nIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MKICAgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLmVtYWlsID0gdHJ1ZV07CiB9CiBgYGAKCg0KBQQTAg4FEgTSGQQICg0KBQQTAg4BEgTSGQkOCg0KBQQTAg4DEgTSGRETCg8K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AxIEjh0ILwryBwoEBBMCIBIGph0EvB0GGuEHIGB3ZWxsX2tub3duX3JlZ2V4YCBzcGVjaWZpZXMgYSBjb21tb24gd2VsbC1rbm93biBwYXR0ZXJuCiBkZWZpbmVkIGFzIGEgcmVnZXguIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1hdGNoIHRoZSB3ZWxsLWtub3duCiByZWdleCwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVN0cmluZyB7CiAgIC8vIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciB2YWx1ZQogICBzdHJpbmcgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcud2VsbF9rbm93bl9yZWdleCA9IEtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFXTsKIH0KIGBgYAoKICMjIyMgS25vd25SZWdleAoKIGB3ZWxsX2tub3duX3JlZ2V4YCBjb250YWlucyBzb21lIHdlbGwta25vd24gcGF0dGVybnMuCgogfCBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICB8IE51bWJlciB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CiB8IEtOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEICAgICAgIHwgMCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogfCBLTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9OQU1FICB8IDEgICAgICB8IEhUVFAgaGVhZGVyIG5hbWUgYXMgZGVmaW5lZCBieSBbUkZDIDcyMzBdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMikgIHwKIHwgS05PV05fUkVHRVhfSFRUUF9IRUFERVJfVkFM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ZmllbGQgdmFsdWUgdG8gZXhhY3RseSBtYXRjaCB0aGUgc3BlY2lmaWVkIGVudW0gdmFsdWUuCiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtYXRjaCwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIGVudW0gTXlFbnVtIHsKICAgTVlfRU5VTV9VTlNQRUNJRklFRCA9IDA7CiAgIE1ZX0VOVU1fVkFMVUUxID0gMTsKICAgTVlfRU5VTV9WQUxVRTIgPSAyOwogfQoKIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGB2YWx1ZWAgbXVzdCBiZSBleGFjdGx5IE1ZX0VOVU1fVkFMVUUxLgogICBNeUVudW0gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtLmNvbnN0ID0gMV07CiB9CiBgYGAKCg0KBQQVAgAEEgSPIAIKCg0KBQQVAgAFEgSPIAsQCg0KBQQVAgABEgSPIBEWCg0KBQQVAgADEgSPIBkaCg8KBQQVAgAIEgaPIBuSIAQKEwoJBBUCAAiICQEAEgaPIBySIAMKEgoKBBUCAAiICQEAARIEkCAEFAoSCgoEFQIACIgJAQADEgSRIARyCo0DCgQEFQIBEgSjIAIhGv4CIGBkZWZpbmVkX29ubHlgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBvbmUgb2YgdGhlIGRlZmluZWQgdmFsdWVzIGZvcgogdGhpcyBlbnVtLCBmYWlsaW5nIG9uIGFueSB1bmRlZmluZWQgdmFsdWUuCgogYGBgcHJvdG8KIGVudW0gTXlFbnVtIHsKICAgTVlfRU5VTV9VTlNQRUNJRklFRCA9IDA7CiAgIE1ZX0VOVU1fVkFMVUUxID0gMTsKICAgTVlfRU5VTV9WQUxVRTIgPSAyOwogfQoKIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGB2YWx1ZWAgbXVzdCBiZSBhIGRlZmluZWQgdmFsdWUgb2YgTXlFbnVtLgogICBNeUVudW0gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtLmRlZmluZWRfb25seSA9IHRydWVdOwog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AoohBRqsAyBgbWF4X2l0ZW1zYCBkZW5vdGVzIHRoYXQgdGhpcyBmaWVsZCBtdXN0IG5vdCBleGNlZWQgYQogY2VydGFpbiBudW1iZXIgb2YgaXRlbXMgYXMgdGhlIHVwcGVyIGxpbWl0LiBJZiB0aGUgZmllbGQgY29udGFpbnMgbW9yZQogaXRlbXMgdGhhbiBzcGVjaWZpZWQsIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQsIHJlcXVpcmluZyB0aGUKIGZpZWxkIHRvIG1haW50YWluIG5vIG1vcmUgdGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpdGVtcy4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVJlcGVhdGVkIHsKICAgLy8gdmFsdWUgbXVzdCBjb250YWluIG5vIG1vcmUgdGhhbiAzIGl0ZW0ocykKICAgcmVwZWF0ZWQgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVwZWF0ZWQubWF4X2l0ZW1zID0gM107CiB9CiBgYGAKCg0KBQQWAgEEEgSHIQIKCg0KBQQWAgEFEgSHIQsRCg0KBQQWAgEBEgSHIRIbCg0KBQQWAgEDEgSHIR4fCg8KBQQWAgEIEgaHISCKIQQKEwoJBBYCAQiICQEAEgaHISGKIQMKEgoKBBYCAQiICQEAARIEiCEEHAoTCgoEFgIBCIgJAQADEgWJIQSDAQreAgoEBBYCAhIGliECmiEFGs0CIGB1bmlxdWVgIGluZGljYXRlcyB0aGF0IGFsbCBlbGVtZW50cyBpbiB0aGlzIGZpZWxkIG11c3QKIGJlIHVuaXF1ZS4gVGhpcyBydWxlIGlzIHN0cmljdGx5IGFwcGxpY2FibGUgdG8gc2NhbGFyIGFuZCBlbnVtCiB0eXBlcywgd2l0aCBtZXNzYWdlIHR5cGVzIG5vdCBiZWluZyBzdXBwb3J0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlSZXBlYXRlZCB7CiAgIC8vIHJlcGVhdGVkIHZhbHVlIG11c3QgY29udGFpbiB1bmlxdWUgaXRlbXMKICAgcmVwZWF0ZWQgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVwZWF0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aGUgdmFsdWVzIGluIHRoZSBmaWVsZCBgdmFsdWVgIG11c3QgZm9sbG93IHRoZSBzcGVjaWZpZWQgcnVsZXMuCiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5tYXAudmFsdWVzID0gewogICAgIHN0cmluZzogewogICAgICAgbWluX2xlbjogNQogICAgICAgbWF4X2xlbjogMjAKICAgICB9CiAgIH1dOwogfQogYGBgCiBOb3RlIHRoYXQgdGhlIGByZXF1aXJlZGAgcnVsZSBkb2VzIG5vdCBhcHBseS4gTWFwIHZhbHVlcyBjYW5ub3QgYmUgdW5zZXQuCgoNCgUEFwIDBBIE9SECCgoNCgUEFwIDBhIE9SELFQoNCgUEFwIDARIE9SEWHAoNCgUEFwIDAxIE9SEfIAq4AQoDBBcFEgT6IQIZGqoBIEV4dGVuc2lvbiBmaWVsZHMgdGhhdCBoYXZlIHRoZSAoYnVmLnZhbGlkYXRlLnByZWRlZmluZWQpIG9wdGlvbiBzZXQKIHdpbGwgYmUgdHJlYXRlZCBhcyBwcmVkZWZpbmVkIGZpZWxkIHJ1bGVzLgogU2VlIGh0dHBzOi8vcHJvdG92YWxpZGF0ZS5jb20vc2NoZW1hcy9wcmVkZWZpbmVkLXJ1bGVzLwoKDAoEBBcFABIE+iENGAoNCgUEFwUAARIE+iENEQoNCgUEFwUAAhIE+iEVGAppCgIEGBIG/iEAmCIBGlsgQW55UnVsZXMgZGVzY3JpYmUgcnVsZXMgYXBwbGllZCBleGNsdXNpdmVseSB0byB0aGUgYGdvb2dsZS5wcm90b2J1Zi5BbnlgIHdlbGwta25vd24gdHlwZS4KCgsKAwQYARIE/iEIEAq8AwoEBBgCABIEiyICGRqtAyBgaW5gIHJlcXVpcmVzIHRoZSBmaWVsZCdzIGB0eXBlX3VybGAgdG8gYmUgZXF1YWwgdG8gb25lIG9mIHRoZQpzcGVjaWZpZWQgdmFsdWVzLiBJZiBpdCBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IKIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15QW55IHsKICAgLy8gIFRoZSBgdmFsdWVgIGZpZWxkIG11c3QgaGF2ZSBhIGB0eXBlX3VybGAgZXF1YWwgdG8gb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICBnb29nbGUucHJvdG9idWYuQW55IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYW55ID0gewogICAgICAgaW46IFsidHlwZS5nb29nbGVhcGlzLmNvbS9NeVR5cGUxIiwgInR5cGUuZ29vZ2xlYXBpcy5jb20vTXlUeXBlMiJdCiAgIH1dOwogfQogYGBgCgoNCgUEGAIABBIEiyICCgoNCgUEGAIABRIEiyILEQoNCgUEGAIAARIEiyISFAoNCgUEGAIAAxIEiyIXGArIAwoEBBgCARIElyICHRq5AyByZXF1aXJlcyB0aGUgZmllbGQncyB0eXBlX3VybCB0byBiZSBub3QgZXF1YWwgdG8gYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiBJZiBpdCBtYXRjaGVzIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlBbnkgewogICAvLyAgVGhlIGB2YWx1ZWAgZmllbGQgbXVzdCBub3QgaGF2ZSBhIGB0eXBlX3VybGAgZXF1YWwgdG8gYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICBnb29nbGUucHJvdG9idWYuQW55IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYW55ID0gewogICAgICAgbm90X2luOiBbInR5cGUuZ29vZ2xlYXBpcy5jb20vRm9yYmlkZGVuVHlwZTEiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9Gb3JiaWRkZW5UeXBlMiJdCiAgIH1dOwogfQogYGBgCgoNCgUEGAIBBBIElyICCgoNCgUEGAIBBRIElyILEQoNCgUEGAIBARIElyISGAoNCgUEGAIBAxIElyIbHAp3CgIEGRIGmyIA6SMBGmkgRHVyYXRpb25SdWxlcyBkZXNjcmliZSB0aGUgcnVsZXMgYXBwbGllZCBleGNsdXNpdmVseSB0byB0aGUgYGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmAgd2VsbC1rbm93biB0eXBlLgoKCwoDBBkBEgSbIggVCvYCCgQEGQIAEgamIgKpIgUa5QIgYGNvbnN0YCBkaWN0YXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRHVyYXRpb25gIHR5cGUgZXhhY3RseS4KIElmIHRoZSBmaWVsZCdzIHZhbHVlIGRldmlhdGVzIGZyb20gdGhlIHNwZWNpZmllZCB2YWx1ZSwgYW4gZXJyb3IgbWVzc2FnZQogd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIC8vIHZhbHVlIG11c3QgZXF1YWwgNXMKICAgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZHVyYXRpb24uY29uc3QgPSAiNXMiXTsKIH0KIGBgYAoKDQoFBBkCAAQSBKYiAgoKDQoFBBkCAAYSBKYiCyMKDQoFBBkCAAESBKYiJCkKDQoFBBkCAAMSBKYiLC0KDwoFBBkCAAgSBqYiLqkiBAoTCgkEGQIACIgJAQASBqYiL6kiAwoSCgoEGQIACIgJAQABEgSnIgQYChIKCgQZAgAIiAkBAAMSBKgiBHIKDgoEBBkIABIGqiICzCIDCg0KBQQZCAABEgSqIggRCpEDCgQEGQIBEga1IgS6IgcagAMgYGx0YCBzdGlwdWxhdGVzIHRoYXQgdGhlIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRHVyYXRpb25gIHR5cGUsCiBleGNsdXNpdmUuIElmIHRoZSBmaWVsZCdzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUR1cmF0aW9uIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gNXMKICAgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZHVyYXRpb24ubHQgPSAiNXMiXTsKIH0KIGBgYAoKDQoFBBkCAQYSBLUiBBwKDQoFBBkCAQESBLUiHR8KDQoFBBkCAQMSBLUiIiMKDwoFBBkCAQgSBrUiJLoiBgoTCgkEGQIBCIgJAQASBrUiJboiBQoSCgoEGQIBCIgJAQABEgS2IgYXChQKCgQZAgEIiAkBAAMSBrciBrkiQAqgAwoEBBkCAhIGxiIEyyIHGo8DIGBsdGVgIGluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSBvZiB0aGUgYGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmAgdHlwZSwgaW5jbHVzaXZlLiBJZiB0aGUgZmllbGQncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwKIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEwcwogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5kdXJhdGlvbi5sdGUgPSAiMTBzIl07CiB9CiBgYGAKCg0KBQQZAgIGEgTGIgQcCg0KBQQZAgIBEgTGIh0gCg0KBQQZAgIDEgTGIiMkCg8KBQQZAgIIEgbGIiXLIgYKEwoJBBkCAgiICQEAEgbGIibLIgUKEgoKBBkCAgiICQEAARIExyIGGAoUCgoEGQICCIgJAQADEgbIIgbKIk0KDgoEBBkIARIGzSICsyMDCg0KBQQZCAEBEgTNIggUCqgHCgQEGQIDEgbgIgT/IgYalwcgYGd0YCByZXF1aXJlcyB0aGUgZHVyYXRpb24gZmllbGQgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQKIHZhbHVlIChleGNsdXNpdmUpLiBJZiB0aGUgdmFsdWUgb2YgYGd0YCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15RHVyYXRpb24gewogICAvLyBkdXJhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA1cyBbZHVyYXRpb24uZ3RdCiAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uLmd0ID0geyBzZWNvbmRzOiA1IH1dOwoKICAgLy8gZHVyYXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gNXMgYW5kIGxlc3MgdGhhbiAxMHMgW2R1cmF0aW9uLmd0X2x0XQogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gYW5vdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uID0geyBndDogeyBzZWNvbmRzOiA1IH0sIGx0OiB7IHNlY29uZHM6IDEwIH0gfV07CgogICAvLyBkdXJhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxMHMgb3IgbGVzcyB0aGFuIDVzIFtkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmVdCiAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiBvdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uID0geyBndDogeyBzZWNvbmRzOiAxMCB9LCBsdDogeyBzZWNvbmRzOiA1IH0gfV07CiB9CiBgYGAKCg0KBQQZAgMGEgTgIgQcCg0KBQQZAgMBEgTgIh0fCg0KBQQZAgMDEgTgIiIjCg8KBQQZAgMIEgbgIiT/IgUKEwoJBBkCAwiICQEAEgbhIgbmIgcKEgoKBBkCAwiICQEAARIE4iIIGQoUCgoEGQIDCIgJAQADEgbjIgjlIkUKEwoJBBkCAwiICQEBEgbnIgbsIgcKEgoKBBkCAwiICQEBARIE6CIIHAoUCgoEGQIDCIgJAQEDEgbpIgjrImAKEwoJBBkCAwiICQECEgbtIgbyIgcKEgoKBBkCAwiICQECARIE7iIIJgoUCgoEGQIDCIgJAQIDEgbvIgjxIl8KEwoJBBkCAwiICQEDEgbzIgb4IgcKEgoKBBkCAwiICQEDARIE9CIIHQoUCgoEGQIDCIgJAQMDEgb1Igj3Im0KEwoJBBkCAwiICQEEEgb5Igb+IgcKEgoKBBkCAwiICQEEARIE+iIIJwoUCgoEGQIDCIgJAQQDEgb7Igj9ImwK2gcKBAQZAgQSBpMjBLIjBhrJByBgZ3RlYCByZXF1aXJlcyB0aGUgZHVyYXRpb24gZmllbGQgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQogc3BlY2lmaWVkIHZhbHVlIChleGNsdXNpdmUpLiBJZiB0aGUgdmFsdWUgb2YgYGd0ZWAgaXMgbGFyZ2VyIHRoYW4gYQogc3BlY2lmaWVkIGBsdGAgb3IgYGx0ZWAsIHRoZSByYW5nZSBpcyByZXZlcnNlZCwgYW5kIHRoZSBmaWVsZCB2YWx1ZSBtdXN0CiBiZSBvdXRzaWRlIHRoZSBzcGVjaWZpZWQgcmFuZ2UuIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1lZXQgdGhlCiByZXF1aXJlZCBjb25kaXRpb25zLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUR1cmF0aW9uIHsKICAvLyBkdXJhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1cyBbZHVyYXRpb24uZ3RlXQogIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uLmd0ZSA9IHsgc2Vjb25kczogNSB9XTsKCiAgLy8gZHVyYXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNXMgYW5kIGxlc3MgdGhhbiAxMHMgW2R1cmF0aW9uLmd0ZV9sdF0KICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gYW5vdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uID0geyBndGU6IHsgc2Vjb25kczogNSB9LCBsdDogeyBzZWNvbmRzOiAxMCB9IH1dOwoKICAvLyBkdXJhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxMHMgb3IgbGVzcyB0aGFuIDVzIFtkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlXQogIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiBvdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uID0geyBndGU6IHsgc2Vjb25kczogMTAgfSwgbHQ6IHsgc2Vjb25kczogNSB9IH1dOwogfQogYGBgCgoNCgUEGQIEBhIEkyMEHAoNCgUEGQIEARIEkyMdIAoNCgUEGQIEAxIEkyMjJAoPCgUEGQIECBIGkyMlsiMFChMKCQQZAgQIiAkBABIGlCMGmSMHChIKCgQZAgQIiAkBAAESBJUjCBoKFAoKBBkCBAiICQEAAxIGliMImCNSChMKCQQZAgQIiAkBARIGmiMGnyMHChIKCgQZAgQIiAkBAQESBJsjCB0KFAoKBBkCBAiICQEBAxIGnCMIniNtChMKCQQZAgQIiAkBAhIGoCMGpSMHChIKCgQZAgQIiAkBAgESBKEjCCcKFAoKBBkCBAiICQECAxIGoiMIpCNsChMKCQQZAgQIiAkBAxIGpiMGqyMHChIKCgQZAgQIiAkBAwESBKcjCB4KFAoKBBkCBAiICQEDAxIGqCMIqiN6ChMKCQQZAgQIiAkBBBIGrCMGsSMHChIKCgQZAgQIiAkBBAESBK0jCCgKFAoKBBkCBAiICQEEAxIGriMIsCN5CqIDCgQEGQIFEga/IwLCIwUakQMgYGluYCBhc3NlcnRzIHRoYXQgdGhlIGZpZWxkIG11c3QgYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzIG9mIHRoZSBgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uYCB0eXBlLgogSWYgdGhlIGZpZWxkJ3MgdmFsdWUgZG9lc24ndCBjb3JyZXNwb25kIHRvIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywKIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgaW4gbGlzdCBbMXMsIDJzLCAzc10KICAgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZHVyYXRpb24uaW4gPSBbIjFzIiwgIjJzIiwgIjNzIl1dOwogfQogYGBgCgoNCgUEGQIFBBIEvyMCCgoNCgUEGQIFBhIEvyMLIwoNCgUEGQIFARIEvyMkJgoNCgUEGQIFAxIEvyMpKgoPCgUEGQIFCBIGvyMrwiMEChMKCQQZAgUIiAkBABIGvyMswiMDChIKCgQZAgUIiAkBAAESBMAjBBUKEgoKBBkCBQiICQEAAxIEwSMEdAqdAwoEBBkCBhIGzyMC0iMFGowDIGBub3RfaW5gIGRlbm90ZXMgdGhhdCB0aGUgZmllbGQgbXVzdCBub3QgYmUgZXF1YWwgdG8KIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcyBvZiB0aGUgYGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmAgdHlwZS4KIElmIHRoZSBmaWVsZCdzIHZhbHVlIG1hdGNoZXMgYW55IG9mIHRoZXNlIHZhbHVlcywgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlCiBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIC8vIHZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgWzFzLCAycywgM3NdCiAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uLm5vdF9pbiA9IFsiMXMiLCAiMnMiLCAiM3MiXV07CiB9CiBgYGAKCg0KBQQZAgYEEgTPIwIKCg0KBQQZAgYGEgTPIwsjCg0KBQQZAgYBEgTPIyQqCg0KBQQZAgYDEgTPIy0uCg8KBQQZAgYIEgbPIy/SIwQKEwoJBBkCBgiICQEAEgbPIzDSIwMKEgoKBBkCBgiICQEAARIE0CMEGQoSCgoEGQIGCIgJAQADEgTRIwRjCrkDCgQEGQIHEgbgIwLjIwUaqAMgYGV4YW1wbGVgIHNwZWNpZmllcyB2YWx1ZXMgdGhhdCB0aGUgZmllbGQgbWF5IGhhdmUuIFRoZXNlIHZhbHVlcyBTSE9VTEQKIGNvbmZvcm0gdG8gb3RoZXIgcnVsZXMuIGBleGFtcGxlYCB2YWx1ZXMgd2lsbCBub3QgaW1wYWN0IHZhbGlkYXRpb24KIGJ1dCBtYXkgYmUgdXNlZCBhcyBoZWxwZnVsIGd1aWRhbmNlIG9uIGhvdyB0byBwb3B1bGF0ZSB0aGUgZ2l2ZW4gZmllbGQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiB2YWx1ZSA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uLmV4YW1wbGUgPSB7IHNlY29uZHM6IDEgfSwKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5kdXJhdGlvbi5leGFtcGxlID0geyBzZWNvbmRzOiAyIH0sCiAgIF07CiB9CiBgYGAKCg0KBQQZAgcEEgTgIwIKCg0KBQQZAgcGEgTgIwsjCg0KBQQZAgcBEgTgIyQrCg0KBQQZAgcDEgTgIy4vCg8KBQQZAgcIEgbgIzDjIwQKEwoJBBkCBwiICQEAEgbgIzHjIwMKEgoKBBkCBwiICQEAARIE4SMEGgoSCgoEGQIHCIgJAQADEgTiIwQWCrgBCgMEGQUSBOgjAhkaqgEgRXh0ZW5zaW9uIGZpZWxkcyB0aGF0IGhhdmUgdGhlIChidWYudmFsaWRhdGUucHJlZGVmaW5lZCkgb3B0aW9uIHNldAogd2lsbCBiZSB0cmVhdGVkIGFzIHByZWRlZmluZWQgZmllbGQgcnVsZXMuCiBTZWUgaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9zY2hlbWFzL3ByZWRlZmluZWQtcnVsZXMvCgoMCgQEGQUAEgToIw0YCg0KBQQZBQABEgToIw0RCg0KBQQZBQACEgToIxUYCnUKAgQaEgbsIwC5JAEaZyBGaWVsZE1hc2tSdWxlcyBkZXNjcmliZSBydWxlcyBhcHBsaWVkIGV4Y2x1c2l2ZWx5IHRvIHRoZSBgZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza2Agd2VsbC1rbm93biB0eXBlLgoKCwoDBBoBEgTsIwgWCpQDCgQEGgIAEgb5IwL8IwUagwMgYGNvbnN0YCBkaWN0YXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrYCB0eXBlIGV4YWN0bHkuCiBJZiB0aGUgZmllbGQncyB2YWx1ZSBkZXZpYXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWUsIGFuIGVycm9yIG1lc3NhZ2UKIHdpbGwgYmUgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15RmllbGRNYXNrIHsKICAgLy8gdmFsdWUgbXVzdCBlcXVhbCBbImEiXQogICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZmllbGRfbWFzay5jb25zdCA9IHsKICAgICAgIHBhdGhzOiBbImEiXQogICB9XTsKIH0KIGBgYAoKDQoFBBoCAAQSBPkjAgoKDQoFBBoCAAYSBPkjCyQKDQoFBBoCAAESBPkjJSoKDQoFBBoCAAMSBPkjLS4KDwoFBBoCAAgSBvkjL/wjBAoTCgkEGgIACIgJAQASBvkjMPwjAwoSCgoEGgIACIgJAQABEgT6IwQaChMKCgQaAgAIiAkBAAMSBfsjBIoBCvgDCgQEGgIBEgaMJAKPJAUa5wMgYGluYCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gb25seSBjb250YWluIHBhdGhzIG1hdGNoaW5nIHNwZWNpZmllZAogdmFsdWVzIG9yIHRoZWlyIHN1YnBhdGhzLgogSWYgYW55IG9mIHRoZSBmaWVsZCB2YWx1ZSdzIHBhdGhzIGRvZXNuJ3QgbWF0Y2ggdGhlIHJ1bGUsCiBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KIFNlZTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcmVmZXJlbmNlL3Byb3RvYnVmL2dvb2dsZS5wcm90b2J1Zi8jZmllbGQtbWFzawoKIGBgYHByb3RvCiBtZXNzYWdlIE15RmllbGRNYXNrIHsKICAgLy8gIFRoZSBgdmFsdWVgIEZpZWxkTWFzayBtdXN0IG9ubHkgY29udGFpbiBwYXRocyBsaXN0ZWQgaW4gYGluYC4KICAgZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmZpZWxkX21hc2sgPSB7CiAgICAgICBpbjogWyJhIiwgImIiLCAiYy5hIl0KICAgfV07CiB9CiBgYGAKCg0KBQQaAgEEEgSMJAIKCg0KBQQaAgEFEgSMJAsRCg0KBQQaAgEBEgSMJBIUCg0KBQQaAgEDEgSMJBcYCg8KBQQaAgEIEgaMJBmPJAQKEwoJBBoCAQiICQEAEgaMJBqPJAMKEgoKBBoCAQiICQEAARIEjSQEFwoTCgoEGgIBCIgJAQADEgWOJATFAQqNBAoEBBoCAhIGnyQCoiQFGvwDIGBub3RfaW5gIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBub3QgY29udGFpbiBwYXRocyBtYXRjaGluZyBzcGVjaWZpZWQKIHZhbHVlcyBvciB0aGVpciBzdWJwYXRocy4KIElmIGFueSBvZiB0aGUgZmllbGQgdmFsdWUncyBwYXRocyBtYXRjaGVzIHRoZSBydWxlLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCiBTZWU6IGh0dHBzOi8vcHJvdG9idWYuZGV2L3JlZmVyZW5jZS9wcm90b2J1Zi9nb29nbGUucHJvdG9idWYvI2ZpZWxkLW1hc2sKCiBgYGBwcm90bwogbWVzc2FnZSBNeUZpZWxkTWFzayB7CiAgIC8vICBUaGUgYHZhbHVlYCBGaWVsZE1hc2sgc2hhbGwgbm90IGNvbnRhaW4gcGF0aHMgbGlzdGVkIGluIGBub3RfaW5gLgogICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZmllbGRfbWFzayA9IHsK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aXJlcyB0aGUgZHVyYXRpb24gZmllbGQgdmFsdWUgdG8gYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgKGZpZWxkIDwgdmFsdWUpLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUR1cmF0aW9uIHsKICAgLy8gZHVyYXRpb24gbXVzdCBiZSBsZXNzIHRoYW4gJ1AzRCcgW2R1cmF0aW9uLmx0XQogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5kdXJhdGlvbi5sdCA9IHsgc2Vjb25kczogMjU5MjAwIH1dOwogfQogYGBgCgoNCgUEGwIBBhIE0iQEHQoNCgUEGwIBARIE0iQeIAoNCgUEGwIBAxIE0iQjJAoPCgUEGwIBCBIG0iQl1yQGChMKCQQbAgEIiAkBABIG0iQm1yQFChIKCgQbAgEIiAkBAAESBNMkBhgKFAoKBBsCAQiICQEAAxIG1CQG1iRACrUDCgQEGwICEgbhJATmJAcapAMgcmVxdWlyZXMgdGhlIHRpbWVzdGFtcCBmaWVsZCB2YWx1ZSB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAoZmllbGQgPD0gdmFsdWUpLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVRpbWVzdGFtcCB7CiAgIC8vIHRpbWVzdGFtcCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAnMjAyMy0wNS0xNFQwMDowMDowMFonIFt0aW1lc3RhbXAubHRlXQogICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmx0ZSA9IHsgc2Vjb25kczogMTY3ODg2NzIwMCB9XTsKIH0KIGBgYAoKDQoFBBsCAgYSBOEkBB0KDQoFBBsCAgESBOEkHiEKDQoFBBsCAgMSBOEkJCUKDwoFBBsCAggSBuEkJuYkBgoTCgkEGwICCIgJAQASBuEkJ+YkBQoSCgoEGwICCIgJAQABEgTiJAYZChQKCgQbAgIIiAkBAAMSBuMkBuUkTQrcAgoEBBsCAxIG8CQE8yQHGssCIGBsdF9ub3dgIHNwZWNpZmllcyB0aGF0IHRoaXMgZmllbGQsIG9mIHRoZSBgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcGAgdHlwZSwgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgdGltZS4gYGx0X25vd2AgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBgd2l0aGluYCBydWxlLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15VGltZXN0YW1wIHsKICAvLyB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cKICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmx0X25vdyA9IHRydWVdOwogfQogYGBgCgoNCgUEGwIDBRIE8CQECAoNCgUEGwIDARIE8CQJDwoNCgUEGwIDAxIE8CQSEwoPCgUEGwIDCBIG8CQU8yQGChMKCQQbAgMIiAkBABIG8CQV8yQFChIKCgQbAgMIiAkBAAESBPEkBhwKEgoKBBsCAwiICQEAAxIE8iQGVQoOCgQEGwgBEgb1JALoJQMKDQoFBBsIAQESBPUkCBQKwwgKBAQbAgQSBoglBKclBhqyCCBgZ3RgIHJlcXVpcmVzIHRoZSB0aW1lc3RhbXAgZmllbGQgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQKIHZhbHVlIChleGNsdXNpdmUpLiBJZiB0aGUgdmFsdWUgb2YgYGd0YCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15VGltZXN0YW1wIHsKICAgLy8gdGltZXN0YW1wIG11c3QgYmUgZ3JlYXRlciB0aGFuICcyMDIzLTAxLTAxVDAwOjAwOjAwWicgW3RpbWVzdGFtcC5ndF0KICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC5ndCA9IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9XTsKCiAgIC8vIHRpbWVzdGFtcCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAnMjAyMy0wMS0wMVQwMDowMDowMFonIGFuZCBsZXNzIHRoYW4gJzIwMjMtMDEtMDJUMDA6MDA6MDBaJyBbdGltZXN0YW1wLmd0X2x0XQogICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGFub3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAgPSB7IGd0OiB7IHNlY29uZHM6IDE2NzI0NDQ4MDAgfSwgbHQ6IHsgc2Vjb25kczogMTY3MjUzMTIwMCB9IH1dOwoKICAgLy8gdGltZXN0YW1wIG11c3QgYmUgZ3JlYXRlciB0aGFuICcyMDIzLTAxLTAyVDAwOjAwOjAwWicgb3IgbGVzcyB0aGFuICcyMDIzLTAxLTAxVDAwOjAwOjAwWicgW3RpbWVzdGFtcC5ndF9sdF9leGNsdXNpdmVdCiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgb3RoZXJfdmFsdWUgPSAzIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAgPSB7IGd0OiB7IHNlY29uZHM6IDE2NzI1MzEyMDAgfSwgbHQ6IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9IH1dOwogfQogYGBgCgoNCgUEGwIEBhIEiCUEHQoNCgUEGwIEARIEiCUeIAoNCgUEGwIEAxIEiCUjJAoPCgUEGwIECBIGiCUlpyUFChMKCQQbAgQIiAkBABIGiSUGjiUHChIKCgQbAgQIiAkBAAESBIolCBoKFAoKBBsCBAiICQEAAxIGiyUIjSVFChMKCQQbAgQIiAkBARIGjyUGlCUHChIKCgQbAgQIiAkBAQESBJAlCB0KFAoKBBsCBAiICQEBAxIGkSUIkyVgChMKCQQbAgQIiAkBAhIGlSUGmiUHChIKCgQbAgQIiAkBAgESBJYlCCcKFAoKBBsCBAiICQECAxIGlyUImSVfChMKCQQbAgQIiAkBAxIGmyUGoCUHChIKCgQbAgQIiAkBAwESBJwlCB4KFAoKBBsCBAiICQEDAxIGnSUInyVtChMKCQQbAgQIiAkBBBIGoSUGpiUHChIKCgQbAgQIiAkBBAESBKIlCCgKFAoKBBsCBAiICQEEAxIGoyUIpSVsCvsICgQEGwIFEga7JQTaJQYa6gggYGd0ZWAgcmVxdWlyZXMgdGhlIHRpbWVzdGFtcCBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlCiBzcGVjaWZpZWQgdmFsdWUgKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RlYCBpcyBsYXJnZXIgdGhhbiBhCiBzcGVjaWZpZWQgYGx0YCBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlCiBtdXN0IGJlIG91dHNpZGUgdGhlIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldAogdGhlIHJlcXVpcmVkIGNvbmRpdGlvbnMsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15VGltZXN0YW1wIHsKICAgLy8gdGltZXN0YW1wIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICcyMDIzLTAxLTAxVDAwOjAwOjAwWicgW3RpbWVzdGFtcC5ndGVdCiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAuZ3RlID0geyBzZWNvbmRzOiAxNjcyNDQ0ODAwIH1dOwoKICAgLy8gdGltZXN0YW1wIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICcyMDIzLTAxLTAxVDAwOjAwOjAwWicgYW5kIGxlc3MgdGhhbiAnMjAyMy0wMS0wMlQwMDowMDowMFonIFt0aW1lc3RhbXAuZ3RlX2x0XQogICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGFub3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAgPSB7IGd0ZTogeyBzZWNvbmRzOiAxNjcyNDQ0ODAwIH0sIGx0OiB7IHNlY29uZHM6IDE2NzI1MzEyMDAgfSB9XTsKCiAgIC8vIHRpbWVzdGFtcCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAnMjAyMy0wMS0wMlQwMDowMDowMFonIG9yIGxlc3MgdGhhbiAnMjAyMy0wMS0wMVQwMDowMDowMFonIFt0aW1lc3RhbXAuZ3RlX2x0X2V4Y2x1c2l2ZV0KICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBvdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcCA9IHsgZ3RlOiB7IHNlY29uZHM6IDE2NzI1MzEyMDAgfSwgbHQ6IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9IH1dOwogfQogYGBgCgoNCgUEGwIFBhIEuyUEHQoNCgUEGwIFARIEuyUeIQoNCgUEGwIFAxIEuyUkJQoPCgUEGwIFCBIGuyUm2iUFChMKCQQbAgUIiAkBABIGvCUGwSUHChIKCgQbAgUIiAkBAAESBL0lCBsKFAoKBBsCBQiICQEAAxIGviUIwCVSChMKCQQbAgUIiAkBARIGwiUGxyUHChIKCgQbAgUIiAkBAQESBMMlCB4KFAoKBBsCBQiICQEBAxIGxCUIxiVtChMKCQQbAgUIiAkBAhIGyCUGzSUHChIKCgQbAgUIiAkBAgESBMklCCgKFAoKBBsCBQiICQECAxIGyiUIzCVsChMKCQQbAgUIiAkBAxIGziUG0yUHChIKCgQbAgUIiAkBAwESBM8lCB8KFAoKBBsCBQiICQEDAxIG0CUI0iV6ChMKCQQbAgUIiAkBBBIG1CUG2SUHChIKCgQbAgUIiAkBBAESBNUlCCkKFAoKBBsCBQiICQEEAxIG1iUI2CV5CuMCCgQEGwIGEgbkJQTnJQca0gIgYGd0X25vd2Agc3BlY2lmaWVzIHRoYXQgdGhpcyBmaWVsZCwgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wYCB0eXBlLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB0aW1lLiBgZ3Rfbm93YCBjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlIGB3aXRoaW5gIHJ1bGUuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlUaW1lc3RhbXAgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cKICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmd0X25vdyA9IHRydWVdOwogfQogYGBgCgoNCgUEGwIGBRIE5CUECAoNCgUEGwIGARIE5CUJDwoNCgUEGwIGAxIE5CUSEwoPCgUEGwIGCBIG5CUU5yUGChMKCQQbAgYIiAkBABIG5CUV5yUFChIKCgQbAgYIiAkBAAESBOUlBhwKEgoKBBsCBgiICQEAAxIE5iUGWAqhAwoEBBsCBxIG8iUC9SUFGpADIGB3aXRoaW5gIHNwZWNpZmllcyB0aGF0IHRoaXMgZmllbGQsIG9mIHRoZSBgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcGAgdHlwZSwgbXVzdCBiZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCB0aW1lLiBJZiB0aGUgZmllbGQgdmFsdWUgaXNuJ3Qgd2l0aGluIHRoZSBkdXJhdGlvbiwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlUaW1lc3RhbXAgewogICAvLyB2YWx1ZSBtdXN0IGJlIHdpdGhpbiAxIGhvdXIgb2Ygbm93CiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgY3JlYXRlZF9hdCA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC53aXRoaW4gPSB7c2Vjb25kczogMzYwMH1dOwogfQogYGBgCgoNCgUEGwIHBBIE8iUCCgoNCgUEGwIHBhIE8iULIwoNCgUEGwIHARIE8iUkKgoNCgUEGwIHAxIE8iUtLgoPCgUEGwIHCBIG8iUv9SUEChMKCQQbAgcIiAkBABIG8iUw9SUDChIKCgQbAgcIiAkBAAESBPMlBBoKEwoKBBsCBwiICQEAAxIF9CUEgwEKzwMKBAQbAggSBoMmAoYmBRq+AyBgZXhhbXBsZWAgc3BlY2lmaWVzIHZhbHVlcyB0aGF0IHRoZSBmaWVsZCBtYXkgaGF2ZS4gVGhlc2UgdmFsdWVzIFNIT1VMRAogY29uZm9ybSB0byBvdGhlciBydWxlcy4gYGV4YW1wbGVgIHZhbHVlcyB3aWxsIG5vdCBpbXBhY3QgdmFsaWRhdGlvbgogYnV0IG1heSBiZSB1c2VkIGFzIGhlbHBmdWwgZ3VpZGFuY2Ugb24gaG93IHRvIHBvcHVsYXRlIHRoZSBnaXZlbiBmaWVsZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVRpbWVzdGFtcCB7CiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgdmFsdWUgPSAxIFsKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAuZXhhbXBsZSA9IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9LAogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC5leGFtcGxlID0geyBzZWNvbmRzOiAxNjcyNTMxMjAwIH0sCiAgIF07CiB9CiBgYGAKCg0KBQQbAggEEgSDJgIKCg0KBQQbAggGEgSDJgskCg0KBQQbAggBEgSDJiUsCg0KBQQbAggDEgSDJi8xCg8KBQQbAggIEgaDJjKGJgQKEwoJBBsCCAiICQEAEgaDJjOGJgMKEgoKBBsCCAiICQEAARIEhCYEGwoSCgoEGwIICIgJAQADEgSFJgQWCrgBCgMEGwUSBIsmAhkaqgEgRXh0ZW5zaW9uIGZpZWxkcyB0aGF0IGhhdmUgdGhlIChidWYudmFsaWRhdGUucHJlZGVmaW5lZCkgb3B0aW9uIHNldAogd2lsbCBiZSB0cmVhdGVkIGFzIHByZWRlZmluZWQgZmllbGQgcnVsZXMuCiBTZWUgaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9zY2hlbWFzL3ByZWRlZmluZWQtcnVsZXMvCgoMCgQEGwUAEgSLJg0YCg0KBQQbBQABEgSLJg0RCg0KBQQbBQACEgSLJhUYCpICCgIEHBIGkSYAlCYBGoMCIGBWaW9sYXRpb25zYCBpcyBhIGNvbGxlY3Rpb24gb2YgYFZpb2xhdGlvbmAgbWVzc2FnZXMuIFRoaXMgbWVzc2FnZSB0eXBlIGlzIHJldHVybmVkIGJ5CiBQcm90b3ZhbGlkYXRlIHdoZW4gYSBwcm90byBtZXNzYWdlIGZhaWxzIHRvIG1lZXQgdGhlIHJlcXVpcmVtZW50cyBzZXQgYnkgdGhlIGBSdWxlYCB2YWxpZGF0aW9uIHJ1bGVzLgogRWFjaCBpbmRpdmlkdWFsIHZpb2xhdGlvbiBpcyByZXByZXNlbnRlZCBieSBhIGBWaW9sYXRpb25gIG1lc3NhZ2UuCgoLCgMEHAESBJEmCBIKhQEKBAQcAgASBJMmAiQadyBgdmlvbGF0aW9uc2AgaXMgYSByZXBlYXRlZCBmaWVsZCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgYFZpb2xhdGlvbmAgbWVzc2FnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgdmlvbGF0aW9ucyBkZXRlY3RlZC4KCg0KBQQcAgAEEgSTJgIKCg0KBQQcAgAGEgSTJgsUCg0KBQQcAgABEgSTJhUfCg0KBQQcAgADEgSTJiIjCtgHCgIEHRIGwSYAgicBGskHIGBWaW9sYXRpb25gIHJlcHJlc2VudHMgYSBzaW5nbGUgaW5zdGFuY2Ugd2hlcmUgYSB2YWxpZGF0aW9uIHJ1bGUsIGV4cHJlc3NlZAogYXMgYSBgUnVsZWAsIHdhcyBub3QgbWV0LiBJdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmllbGQgdGhhdAogY2F1c2VkIHRoZSB2aW9sYXRpb24sIHRoZSBzcGVjaWZpYyBydWxlIHRoYXQgd2Fzbid0IGZ1bGZpbGxlZCwgYW5kIGEKIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCgogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKCiBgYGBwcm90bwogbWVzc2FnZSBVc2VyIHsKICAgICBpbnQzMiBhZ2UgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5jZWwgPSB7CiAgICAgICAgIGlkOiAidXNlci5hZ2UiLAogICAgICAgICBleHByZXNzaW9uOiAidGhpcyA8IDE4ID8gJ1VzZXIgbXVzdCBiZSBhdCBsZWFzdCAxOCB5ZWFycyBvbGQnIDogJyciLAogICAgIH1dOwogfQogYGBgCgogSXQgY291bGQgcHJvZHVjZSB0aGUgZm9sbG93aW5nIHZpb2xhdGlvbjoKCiBgYGBqc29uCiB7CiAgICJydWxlSWQiOiAidXNlci5hZ2UiLAogICAibWVzc2FnZSI6ICJVc2VyIG11c3QgYmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkIiwKICAgImZpZWxkIjogewogICAgICJlbGVtZW50cyI6IFsKICAgICAgIHsKICAgICAgICAgImZpZWxkTnVtYmVyIjogMSwKICAgICAgICAgImZpZWxkTmFtZSI6ICJhZ2UiLAogICAgICAgICAiZmllbGRUeXBlIjogIlRZUEVfSU5UMzIiCiAgICAgICB9CiAgICAgXQogICB9LAogICAicnVsZSI6IHsKICAgICAiZWxlbWVudHMiOiBbCiAgICAgICB7CiAgICAgICAgICJmaWVsZE51bWJlciI6IDIzLAogICAgICAgICAiZmllbGROYW1lIjogImNlbCIsCiAgICAgICAgICJmaWVsZFR5cGUiOiAiVFlQRV9NRVNTQUdFIiwKICAgICAgICAgImluZGV4IjogIjAiCiAgICAgICB9CiAgICAgXQogICB9CiB9CiBgYGAKCgsKAwQdARIEwSYIEQqTBAoEBB0CABIE1SYCHxqEBCBgZmllbGRgIGlzIGEgbWFjaGluZS1yZWFkYWJsZSBwYXRoIHRvIHRoZSBmaWVsZCB0aGF0IGZhaWxlZCB2YWxpZGF0aW9uLgogVGhpcyBjb3VsZCBiZSBhIG5lc3RlZCBmaWVsZCwgaW4gd2hpY2ggY2FzZSB0aGUgcGF0aCB3aWxsIGluY2x1ZGUgYWxsIHRoZSBwYXJlbnQgZmllbGRzIGxlYWRpbmcgdG8gdGhlIGFjdHVhbCBmaWVsZCB0aGF0IGNhdXNlZCB0aGUgdmlvbGF0aW9uLgoKIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6CgogYGBgcHJvdG8KIG1lc3NhZ2UgTWVzc2FnZSB7CiAgIGJvb2wgYSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZV07CiB9CiBgYGAKCiBJdCBjb3VsZCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgdmlvbGF0aW9uOgoKIGBgYHRleHRwcm90bwogdmlvbGF0aW9uIHsKICAgZmllbGQgeyBlbGVtZW50IHsgZmllbGRfbnVtYmVyOiAxLCBmaWVsZF9uYW1lOiAiYSIsIGZpZWxkX3R5cGU6IDggfSB9CiAgIC4uLgogfQogYGBgCgoNCgUEHQIABBIE1SYCCgoNCgUEHQIABhIE1SYLFAoNCgUEHQIAARIE1SYVGgoNCgUEHQIAAxIE1SYdHgquBgoEBB0CARIE8yYCHhqfBiBgcnVsZWAgaXMgYSBtYWNoaW5lLXJlYWRhYmxlIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIHNwZWNpZmljIHJ1bGUgdGhhdCBmYWlsZWQgdmFsaWRhdGlvbi4KIFRoaXMgd2lsbCBiZSBhIG5lc3RlZCBmaWVsZCBzdGFydGluZyBmcm9tIHRoZSBGaWVsZFJ1bGVzIG9mIHRoZSBmaWVsZCB0aGF0IGZhaWxlZCB2YWxpZGF0aW9uLgogRm9yIGN1c3RvbSBydWxlcywgdGhpcyB3aWxsIHByb3ZpZGUgdGhlIHBhdGggb2YgdGhlIHJ1bGUsIGUuZy4gYGNlbFswXWAuCgogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKCiBgYGBwcm90bwogbWVzc2FnZSBNZXNzYWdlIHsKICAgYm9vbCBhID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVxdWlyZWQgPSB0cnVlXTsKICAgYm9vbCBiID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuY2VsID0gewogICAgIGlkOiAiY3VzdG9tX3J1bGUiLAogICAgIGV4cHJlc3Np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IG1hcCBvciByZXBlYXRlZCBmaWVsZCwgdGhlIGBzdWJzY3JpcHRgIHZhbHVlIHNlbGVjdHMgYSBzcGVjaWZpYyBlbGVtZW50IGZyb20gaXQuCiBBIHBhdGggdGhhdCByZWZlcnMgdG8gYSB2YWx1ZSBuZXN0ZWQgdW5kZXIgYSBtYXAga2V5IG9yIHJlcGVhdGVkIGZpZWxkIGluZGV4IHdpbGwgaGF2ZSBhIGBzdWJzY3JpcHRgIHZhbHVlLgogVGhlIGBmaWVsZF90eXBlYCBmaWVsZCBhbGxvd3MgdW5hbWJpZ3VvdXMgcmVzb2x1dGlvbiBvZiBhIGZpZWxkIGV2ZW4gaWYgZGVzY3JpcHRvcnMgYXJlIG5vdCBhdmFpbGFibGUuCgoLCgMEHwESBJInCBgKTwoEBB8CABIElCcCIhpBIGBmaWVsZF9udW1iZXJgIGlzIHRoZSBmaWVsZCBudW1iZXIgdGhpcyBwYXRoIGVsZW1lbnQgcmVmZXJzIHRvLgoKDQoFBB8CAAQSBJQnAgoKDQoFBB8CAAUSBJQnCxAKDQoFBB8CAAESBJQnER0KDQoFBB8CAAMSBJQnICEKqgEKBAQfAgESBJgnAiEamwEgYGZpZWxkX25hbWVgIGNvbnRhaW5zIHRoZSBmaWVsZCBuYW1lIHRoaXMgcGF0aCBlbGVtZW50IHJlZmVycyB0by4KIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhIGh1bWFuLXJlYWRhYmxlIHBhdGggZXZlbiBpZiB0aGUgZmllbGQgbnVtYmVyIGlzIHVua25vd24uCgoNCgUEHwIBBBIEmCcCCgoNCgUEHwIBBRIEmCcLEQoNCgUEHwIBARIEmCcSHAoNCgUEHwIBAxIEmCcfIArABAoEBB8CAhIEpCcCRBqxBCBgZmllbGRfdHlwZWAgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuIFdoZW4gdXNpbmcgcmVmbGVjdGlvbiwgdGhpcyB2YWx1ZSBpcyBub3QgbmVlZGVkLgoKIFRoaXMgdmFsdWUgaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB0cmF2ZXJzZSB1bmtub3duIGZpZWxkcyB0aHJvdWdoIHdpcmUgZGF0YS4KIFdoZW4gdHJhdmVyc2luZyB3aXJlIGRhdGEsIGJlIG1pbmRmdWwgb2YgYm90aCBwYWNrZWRbMV0gYW5kIGRlbGltaXRlZFsyXSBlbmNvZGluZyBzY2hlbWVzLgoKIFsxXTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2VuY29kaW5nLyNwYWNrZWQKIFsyXTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2VuY29kaW5nLyNncm91cHMKCiBOLkIuOiBBbHRob3VnaCBncm91cHMgYXJlIGRlcHJlY2F0ZWQsIHRoZSBjb3JyZXNwb25kaW5nIGRlbGltaXRlZCBlbmNvZGluZyBzY2hlbWUgaXMgbm90LCBhbmQKIGNhbiBiZSBleHBsaWNpdGx5IHVzZWQgaW4gUHJvdG9jb2wgQnVmZmVycyAyMDIzIEVkaXRpb24uCgoNCgUEHwICBBIEpCcCCgoNCgUEHwICBhIEpCcLNAoNCgUEHwICARIEpCc1PwoNCgUEHwICAxIEpCdCQwrkAQoEBB8CAxIEqScCQhrVASBga2V5X3R5cGVgIHNwZWNpZmllcyB0aGUgbWFwIGtleSB0eXBlIG9mIHRoaXMgZmllbGQuIFRoaXMgdmFsdWUgaXMgdXNlZnVsIHdoZW4gdHJhdmVyc2luZwogdW5rbm93biBmaWVsZHMgdGhyb3VnaCB3aXJlIGRhdGE6IHNwZWNpZmljYWxseSwgaXQgYWxsb3dzIGhhbmRsaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCiBkaWZmZXJlbnQgaW50ZWdlciBlbmNvZGluZ3MuCgoNCgUEHwIDBBIEqScCCgoNCgUEHwIDBhIEqScLNAoNCgUEHwIDARIEqSc1PQoNCgUEHwIDAxIEqSdAQQqdAQoEBB8CBBIErScCRBqOASBgdmFsdWVfdHlwZWAgc3BlY2lmaWVzIG1hcCB2YWx1ZSB0eXBlIG9mIHRoaXMgZmllbGQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGRpc3BsYXkgYQogdmFsdWUgaW5zaWRlIHVua25vd24gZmllbGRzIHRocm91Z2ggd2lyZSBkYXRhLgoKDQoFBB8CBAQSBK0nAgoKDQoFBB8CBAYSBK0nCzQKDQoFBB8CBAESBK0nNT8KDQoFBB8CBAMSBK0nQkMKfAoEBB8IABIGsCcCvycDGmwgYHN1YnNjcmlwdGAgY29udGFpbnMgYSByZXBlYXRlZCBpbmRleCBvciBtYXAga2V5LCBpZiB0aGlzIHBhdGggZWxlbWVudCBuZXN0cyBpbnRvIGEgcmVwZWF0ZWQgb3IgbWFwIGZpZWxkLgoKDQoFBB8IAAESBLAnCBEKSAoEBB8CBRIEsicEFRo6IGBpbmRleGAgc3BlY2lmaWVzIGEgMC1iYXNlZCBpbmRleCBpbnRvIGEgcmVwZWF0ZWQgZmllbGQuCgoNCgUEHwIFBRIEsicECgoNCgUEHwIFARIEsicLEAoNCgUEHwIFAxIEsicTFAo8CgQEHwIGEgS1JwQWGi4gYGJvb2xfa2V5YCBzcGVjaWZpZXMgYSBtYXAga2V5IG9mIHR5cGUgYm9vbC4KCg0KBQQfAgYFEgS1JwQICg0KBQQfAgYBEgS1JwkRCg0KBQQfAgYDEgS1JxQVCmkKBAQfAgcSBLgnBBYaWyBgaW50X2tleWAgc3BlY2lmaWVzIGEgbWFwIGtleSBvZiB0eXBlIGludDMyLCBpbnQ2NCwgc2ludDMyLCBzaW50NjQsIHNmaXhlZDMyIG9yIHNmaXhlZDY0LgoKDQoFBB8CBwUSBLgnBAkKDQoFBB8CBwESBLgnChEKDQoFBB8CBwMSBLgnFBUKWgoEBB8CCBIEuycEGBpMIGB1aW50X2tleWAgc3BlY2lmaWVzIGEgbWFwIGtleSBvZiB0eXBlIHVpbnQzMiwgdWludDY0LCBmaXhlZDMyIG9yIGZpeGVkNjQuCgoNCgUEHwIIBRIEuycECgoNCgUEHwIIARIEuycLEwoNCgUEHwIIAxIEuycWFwpACgQEHwIJEgS+JwQbGjIgYHN0cmluZ19rZXlgIHNwZWNpZmllcyBhIG1hcCBrZXkgb2YgdHlwZSBzdHJpbmcuCgoNCgUEHwIJBRIEvicECgoNCgUEHwIJARIEvicLFQoNCgUEHwIJAxIEvicYGgr2IgoVY29tbW9uL3YxL3R5cGVzLnByb3RvEhdzZXJ2aWNlYnJpZGdlLmNvbW1vbi52MRobYnVmL3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvIqABCg5Xb3JrZXJJZGVudGl0eRIqCgxzZXJ2aWNlX25hbWUYASABKAlCB7pIBHICEAFSC3NlcnZpY2VOYW1lEigKC2luc3RhbmNlX2lkGAIgASgJQge6SARyAhABUgppbnN0YW5jZUlkEhoKCGVuZHBvaW50GAMgASgJUghlbmRwb2ludBIcCgl0cmFuc3BvcnQYBCABKAlSCXRyYW5zcG9ydCJuCg9SZXNvdXJjZU1ldHJpY3MSJAoLY3B1X3BlcmNlbnQYASABKAJIAFIKY3B1UGVyY2VudIgBARIaCgZyYW1fbWIYAiABKAVIAVIFcmFtTWKIAQFCDgoMX2NwdV9wZXJjZW50QgkKB19yYW1fbWIi0gEKE0Z1bmN0aW9uRGVjbGFyYXRpb24SIAoHZm5fbmFtZRgBIAEoCUIHukgEcgIQAVIGZm5OYW1lEhYKBndlaWdodBgCIAEoBVIGd2VpZ2h0EioKEWlucHV0X3NjaGVtYV9qc29uGAMgASgJUg9pbnB1dFNjaGVtYUpzb24SLAoSb3V0cHV0X3NjaGVtYV9qc29uGAQgASgJUhBvdXRwdXRTY2hlbWFKc29uEicKD2FsbG93ZWRfY2FsbGVycxgFIAMoCVIOYWxsb3dlZENhbGxlcnMi6wEKGENvbnN1bWVyR3JvdXBEZWNsYXJhdGlvbhIbCgRuYW1lGAEgASgJQge6SARyAhABUgRuYW1lEiEKB3BhdHRlcm4YAiABKAlCB7pIBHICEAFSB3BhdHRlcm4SEgoEbW9kZRgDIAEoCVIEbW9kZRIqChFyZXRyeV9wb2xpY3lfanNvbhgEIAEoCVIPcmV0cnlQb2xpY3lKc29uEhYKBmFjdGl2ZRgFIAEoCFIGYWN0aXZlEh8KC2ZpbHRlcl9leHByGAYgASgJUgpmaWx0ZXJFeHByEhYKBndlaWdodBgHIAEoBVIGd2VpZ2h0It4BChRIdHRwUm91dGVEZWNsYXJhdGlvbhIWCgZtZXRob2QYASABKAlSBm1ldGhvZBIjCg1yb3V0ZV9wYXR0ZXJuGAIgASgJUgxyb3V0ZVBhdHRlcm4SLgoTcmVxdWVzdF9zY2hlbWFfanNvbhgDIAEoCVIRcmVxdWVzdFNjaGVtYUpzb24SMAoUcmVzcG9uc2Vfc2NoZW1hX2pzb24YBCABKAlSEnJlc3BvbnNlU2NoZW1hSnNvbhInCg9hbGxvd2VkX2NhbGxlcnMYBSADKAlSDmFsbG93ZWRDYWxsZXJzIl0KE1dvcmtmbG93RGVjbGFyYXRpb24SEgoEbmFtZRgBIAEoCVIEbmFtZRIeCgpkZWZpbml0aW9uGAIgASgJUgpkZWZpbml0aW9uEhIKBG9wdHMYAyABKAlSBG9wdHMi9wEKDkpvYkRlY2xhcmF0aW9uEhsKCWNyb25fZXhwchgBIAEoCVIIY3JvbkV4cHISGgoIdGltZXpvbmUYAiABKAlSCHRpbWV6b25lEiUKDm1pc2ZpcmVfcG9saWN5GAMgASgJUg1taXNmaXJlUG9saWN5Eh8KC3RhcmdldF90eXBlGAQgASgJUgp0YXJnZXRUeXBlEh0KCnRhcmdldF9yZWYYBSABKAlSCXRhcmdldFJlZhIZCghkZWxheV9tcxgGIAEoBVIHZGVsYXlNcxIqChFyZXRyeV9wb2xpY3lfanNvbhgHIAEoCVIPcmV0cnlQb2xpY3lKc29uKmQKDVRyYW5zcG9ydE1vZGUSHgoaVFJBTlNQT1JUX01PREVfVU5TUEVDSUZJRUQQABIZChVUUkFOU1BPUlRfTU9ERV9ESVJFQ1QQARIYChRUUkFOU1BPUlRfTU9ERV9QUk9YWRACKmcKE0xvYWRCYWxhbmNpbmdQb2xpY3kSEgoOTEJfUk9VTkRfUk9CSU4QABIPCgtMQl9XRUlHSFRFRBABEhgKFExCX0xFQVNUX0NPTk5FQ1RJT05TEAISEQoNTEJfWk9ORV9BV0FSRRADKkMKE0NpcmN1aXRCcmVha2VyU3RhdGUSDQoJQ0JfQ0xPU0VEEAASCwoHQ0JfT1BFThABEhAKDENCX0hBTEZfT1BFThACQkNaQWdpdGh1Yi5jb20vc2VydmljZWJyaWRnZS9zZXJ2ZXItZ28vaW50ZXJuYWwvcGIvY29tbW9uL3YxO2NvbW1vbnYxSrUVCgYSBAAATgEKCAoBDBIDAAASCggKAQISAwEAIAoICgEIEgMDAFgKCQoCCAsSAwMAWAoJCgIDABIDBQAlCgoKAgQAEgQHAAwBCgoKAwQAARIDBwgWCgsKBAQAAgASAwgCRAoMCgUEAAIABRIDCAIICgwKBQQAAgABEgMICRUKDAoFBAACAAMSAwgYGQoMCgUEAAIACBIDCBpDChAKCQQAAgAIhwkOAhIDCBtCCgsKBAQA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UmVjb25jaWxlUmVxdWVzdBJLCghpZGVudGl0eRgBIAEoCzInLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLldvcmtlcklkZW50aXR5Qga6SAPIAQFSCGlkZW50aXR5EkoKCWZ1bmN0aW9ucxgCIAMoCzIsLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLkZ1bmN0aW9uRGVjbGFyYXRpb25SCWZ1bmN0aW9ucxJaCg9jb25zdW1lcl9ncm91cHMYAyADKAsyMS5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5Db25zdW1lckdyb3VwRGVjbGFyYXRpb25SDmNvbnN1bWVyR3JvdXBzEk4KC2h0dHBfcm91dGVzGAQgAygLMi0uc2VydmljZWJyaWRnZS5jb21tb24udjEuSHR0cFJvdXRlRGVjbGFyYXRpb25SCmh0dHBSb3V0ZXMSSgoJd29ya2Zsb3dzGAUgAygLMiwuc2VydmljZWJyaWRnZS5jb21tb24udjEuV29ya2Zsb3dEZWNsYXJhdGlvblIJd29ya2Zsb3dzEjsKBGpvYnMYBiADKAsyJy5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5Kb2JEZWNsYXJhdGlvblIEam9icxJCCgdtZXRyaWNzGAcgASgLMiguc2VydmljZWJyaWRnZS5jb21tb24udjEuUmVzb3VyY2VNZXRyaWNzUgdtZXRyaWNzEk0KDnRyYW5zcG9ydF9tb2RlGAggASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVINdHJhbnNwb3J0TW9kZRISCgR6b25lGAkgASgJUgR6b25lIl4KEVJlY29uY2lsZVJlc3BvbnNlEiAKDGxlYXNlX3R0bF9tcxgBIAEoA1IKbGVhc2VUdGxNcxInCg9zZXJ2ZXJfcmV2aXNpb24YAiABKANSDnNlcnZlclJldmlzaW9uIt0BChdJc3N1ZUNlcnRpZmljYXRlUmVxdWVzdBIqCgxzZXJ2aWNlX25hbWUYASABKAlCB7pIBHICEAFSC3NlcnZpY2VOYW1lEigKC2luc3RhbmNlX2lkGAIgASgJQge6SARyAhABUgppbnN0YW5jZUlkEiAKB2Nzcl9wZW0YAyABKAlCB7pIBHICEAFSBmNzclBlbRIrChFhZHZlcnRpc2VfYWRkcmVzcxgEIAEoCVIQYWR2ZXJ0aXNlQWRkcmVzcxIdCgpleHRyYV9zYW5zGAUgAygJUglleHRyYVNhbnMiawoYSXNzdWVDZXJ0aWZpY2F0ZVJlc3BvbnNlEhkKCGNlcnRfcGVtGAEgASgJUgdjZXJ0UGVtEhUKBmNhX3BlbRgCIAEoCVIFY2FQZW0SHQoKZXhwaXJlc19hdBgDIAEoA1IJZXhwaXJlc0F0IvYBCg5QdWJsaXNoUmVxdWVzdBIdCgV0b3BpYxgBIAEoCUIHukgEcgIQAVIFdG9waWMSGAoHcGF5bG9hZBgCIAEoDFIHcGF5bG9hZBJUCgdoZWFkZXJzGAMgAygLMjouc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUHVibGlzaFJlcXVlc3QuSGVhZGVyc0VudHJ5UgdoZWFkZXJzEhkKCHRyYWNlX2lkGAQgASgJUgd0cmFjZUlkGjoKDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIjAKD1B1Ymxpc2hSZXNwb25zZRIdCgptZXNzYWdlX2lkGAEgASgJUgltZXNzYWdlSWQiyQEKFkV4ZWN1dGVXb3JrZmxvd1JlcXVlc3QSLAoNd29ya2Zsb3dfbmFtZRgBIAEoCUIHukgEcgIQAVIMd29ya2Zsb3dOYW1lEhQKBWlucHV0GAIgASgMUgVpbnB1dBIZCgh0cmFjZV9pZBgDIAEoCVIHdHJhY2VJZBIkCg5ncm91cF90cmFjZV9pZBgEIAEoCVIMZ3JvdXBUcmFjZUlkEioKDHNlcnZpY2VfbmFtZRgFIAEoCUIHukgEcgIQAVILc2VydmljZU5hbWUiNAoXRXhlY3V0ZVdvcmtmbG93UmVzcG9uc2USGQoIdHJhY2VfaWQYASABKAlSB3RyYWNlSWQiUwoVQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0EiIKCHRyYWNlX2lkGAEgASgJQge6SARyAhABUgd0cmFjZUlkEhYKBnJlYXNvbhgCIAEoCVIGcmVhc29uIjYKFkNhbmNlbFdvcmtmbG93UmVzcG9uc2USHAoJY2FuY2VsbGVkGAEgASgIUgljYW5jZWxsZWQi0wEKEFByb3h5Q2FsbFJlcXVlc3QSLAoNZnVuY3Rpb25fbmFtZRgBIAEoCUIHukgEcgIQAVIMZnVuY3Rpb25OYW1lEhgKB3BheWxvYWQYAiABKAxSB3BheWxvYWQSJAoOZ3JvdXBfdHJhY2VfaWQYAyABKAlSDGdyb3VwVHJhY2VJZBIXCgdzcGFuX2lkGAQgASgJUgZzcGFuSWQSGQoIdHJhY2VfaWQYBSABKAlSB3RyYWNlSWQSHQoKdGltZW91dF9tcxgGIAEoBVIJdGltZW91dE1zIlsKEVByb3h5Q2FsbFJlc3BvbnNlEhgKB3N1Y2Nlc3MYASABKAhSB3N1Y2Nlc3MSFgoGb3V0cHV0GAIgASgMUgZvdXRwdXQSFAoFZXJyb3IYAyABKAlSBWVycm9yImQKEVdhdGNoVHJhY2VSZXF1ZXN0EiIKCHRyYWNlX2lkGAEgASgJQge6SARyAhABUgd0cmFjZUlkEhkKCGZyb21fc2VxGAIgASgDUgdmcm9tU2VxEhAKA2tleRgDIAEoCVIDa2V5IqsBChBUcmFjZVN0cmVhbUNodW5rEhAKA3NlcRgBIAEoA1IDc2VxEhAKA2tleRgCIAEoCVIDa2V5Eh0KCmV2ZW50X3R5cGUYAyABKAlSCWV2ZW50VHlwZRISCgRkYXRhGAQgASgMUgRkYXRhEiEKDHRyYWNlX3N0YXR1cxgFIAEoCVILdHJhY2VTdGF0dXMSHQoKY3JlYXRlZF9hdBgGIAEoA1IJY3JlYXRlZEF0MtMGCgxDb250cm9sUGxhbmUSbgoJUmVjb25jaWxlEi8uc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUmVjb25jaWxlUmVxdWVzdBowLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlJlY29uY2lsZVJlc3BvbnNlEoMBChBJc3N1ZUNlcnRpZmljYXRlEjYuc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuSXNzdWVDZXJ0aWZpY2F0ZVJlcXVlc3QaNy5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5Jc3N1ZUNlcnRpZmljYXRlUmVzcG9uc2USaAoHUHVibGlzaBItLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlB1Ymxpc2hSZXF1ZXN0Gi4uc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUHVibGlzaFJlc3BvbnNlEoABCg9FeGVjdXRlV29ya2Zsb3cSNS5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5FeGVjdXRlV29ya2Zsb3dSZXF1ZXN0GjYuc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuRXhlY3V0ZVdvcmtmbG93UmVzcG9uc2USfQoOQ2FuY2VsV29ya2Zsb3cSNC5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5DYW5jZWxXb3JrZmxvd1JlcXVlc3QaNS5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5DYW5jZWxXb3JrZmxvd1Jlc3BvbnNlEm4KCVByb3h5Q2FsbBIvLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlByb3h5Q2FsbFJlcXVlc3QaMC5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5Qcm94eUNhbGxSZXNwb25zZRJxCgpXYXRjaFRyYWNlEjAuc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuV2F0Y2hUcmFjZVJlcXVlc3QaLy5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5UcmFjZVN0cmVhbUNodW5rMAFCT1pNZ2l0aHViLmNvbS9zZXJ2aWNlYnJpZGdlL3NlcnZlci1nby9pbnRlcm5hbC9wYi9jb250cm9scGxhbmUvdjE7Y29udHJvbHBsYW5ldjFKkSAKBhIEAABuAQoICgEMEgMAABIKCAoBAhIDAQAmCggKAQgSAwMAZAoJCgIICxIDAwBkCgkKAgMAEgMFACUKCQoCAwESAwYAHwoKCgIGABIECAAQAQoKCgMGAAESAwgIFAoLCgQGAAIAEgMJAj4KDAoFBgACAAESAwkGDwoMCgUGAAIAAhIDCRAgCgwKBQYAAgADEgMJKzwKCwoEBgACARIDCgJTCgwKBQYAAgEBEgMKBhYKDAoFBgACAQISAwoXLgoMCgUGAAIBAxIDCjlRCgsKBAYAAgISAwsCOAoMCgUGAAICARIDCwYNCgwKBQYAAgICEgMLDhwKDAoFBgACAgMSAwsnNgoLCgQGAAIDEgMMAlAKDAoFBgACAwESAwwGFQoMCgUGAAIDAhIDDBYsCgwKBQYA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DAoFBA0CAgUSA2oCCAoMCgUEDQICARIDagkTCgwKBQQNAgIDEgNqGBkKCwoEBA0CAxIDawIaCgwKBQQNAgMFEgNrAgcKDAoFBA0CAwESA2sJDQoMCgUEDQIDAxIDaxgZCgsKBAQNAgQSA2wCGgoMCgUEDQIEBRIDbAIICgwKBQQNAgQBEgNsCRUKDAoFBA0CBAMSA2wYGQoLCgQEDQIFEgNtAhoKDAoFBA0CBQUSA20CBwoMCgUEDQIFARIDbQkTCgwKBQQNAgUDEgNtGBliBnByb3RvMwq7JgoacmVnaXN0cnkvdjEvcmVnaXN0cnkucHJvdG8SGXNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEaG2J1Zi92YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxoVY29tbW9uL3YxL3R5cGVzLnByb3RvIoMBChBTdWJzY3JpYmVSZXF1ZXN0EiUKDmZ1bmN0aW9uX25hbWVzGAEgAygJUg1mdW5jdGlvbk5hbWVzEiUKDnJlc3BvbnNlX25vbmNlGAIgASgJUg1yZXNwb25zZU5vbmNlEiEKDGVycm9yX2RldGFpbBgDIAEoCVILZXJyb3JEZXRhaWwi0gEKEVN1YnNjcmliZVJlc3BvbnNlEhgKB3ZlcnNpb24YASABKAlSB3ZlcnNpb24SFAoFbm9uY2UYAiABKAlSBW5vbmNlEkEKBGZ1bGwYAyABKAsyKy5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLlJlZ2lzdHJ5U25hcHNob3RIAFIEZnVsbBJACgVkZWx0YRgEIAEoCzIoLnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuUmVnaXN0cnlEZWx0YUgAUgVkZWx0YUIICgZ1cGRhdGUi2AEKEFJlZ2lzdHJ5U25hcHNob3QSWAoJZnVuY3Rpb25zGAEgAygLMjouc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5SZWdpc3RyeVNuYXBzaG90LkZ1bmN0aW9uc0VudHJ5UglmdW5jdGlvbnMaagoORnVuY3Rpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSQgoFdmFsdWUYAiABKAsyLC5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLkZ1bmN0aW9uRW5kcG9pbnRzUgV2YWx1ZToCOAEi5gEKDVJlZ2lzdHJ5RGVsdGESTwoHdXBzZXJ0cxgBIAMoCzI1LnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuUmVnaXN0cnlEZWx0YS5VcHNlcnRzRW50cnlSB3Vwc2VydHMSGgoIcmVtb3ZhbHMYAiADKAlSCHJlbW92YWxzGmgKDFVwc2VydHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJCCgV2YWx1ZRgCIAEoCzIsLnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuRnVuY3Rpb25FbmRwb2ludHNSBXZhbHVlOgI4ASJcChFGdW5jdGlvbkVuZHBvaW50cxJHCgllbmRwb2ludHMYASADKAsyKS5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLldvcmtlckVuZHBvaW50UgllbmRwb2ludHMisQMKDldvcmtlckVuZHBvaW50EhoKCGVuZHBvaW50GAEgASgJUghlbmRwb2ludBJNCg50cmFuc3BvcnRfbW9kZRgCIAEoDjImLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlRyYW5zcG9ydE1vZGVSDXRyYW5zcG9ydE1vZGUSHwoLaW5zdGFuY2VfaWQYAyABKAlSCmluc3RhbmNlSWQSFgoGd2VpZ2h0GAQgASgFUgZ3ZWlnaHQSIQoMc2VydmljZV9uYW1lGAUgASgJUgtzZXJ2aWNlTmFtZRISCgR6b25lGAYgASgJUgR6b25lEioKEWlucHV0X3NjaGVtYV9qc29uGAogASgJUg9pbnB1dFNjaGVtYUpzb24SLAoSb3V0cHV0X3NjaGVtYV9qc29uGAsgASgJUhBvdXRwdXRTY2hlbWFKc29uEicKD2FsbG93ZWRfY2FsbGVycxgMIAMoCVIOYWxsb3dlZENhbGxlcnMSQQoGaGVhbHRoGBQgASgLMikuc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5FbmRwb2ludEhlYWx0aFIGaGVhbHRoIrkCCg5FbmRwb2ludEhlYWx0aBIcCglyZWFjaGFibGUYASABKAhSCXJlYWNoYWJsZRIkCg5sYXRlbmN5X3A1MF9tcxgCIAEoBVIMbGF0ZW5jeVA1ME1zEiQKDmxhdGVuY3lfcDk5X21zGAMgASgFUgxsYXRlbmN5UDk5TXMSHQoKZXJyb3JfcmF0ZRgEIAEoAlIJZXJyb3JSYXRlEiIKDWxhc3RfY2hlY2tfYXQYBSABKANSC2xhc3RDaGVja0F0EjEKFGNvbnNlY3V0aXZlX2ZhaWx1cmVzGAYgASgFUhNjb25zZWN1dGl2ZUZhaWx1cmVzEkcKCGNiX3N0YXRlGAcgASgOMiwuc2VydmljZWJyaWRnZS5jb21tb24udjEuQ2lyY3VpdEJyZWFrZXJTdGF0ZVIHY2JTdGF0ZSI9Cg1Mb29rdXBSZXF1ZXN0EiwKDWZ1bmN0aW9uX25hbWUYASABKAlCB7pIBHICEAFSDGZ1bmN0aW9uTmFtZSKYAgoOTG9va3VwUmVzcG9uc2USIQoMc2VydmljZV9uYW1lGAEgASgJUgtzZXJ2aWNlTmFtZRIXCgdmbl9uYW1lGAIgASgJUgZmbk5hbWUSRwoJZW5kcG9pbnRzGAMgAygLMikuc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5Xb3JrZXJFbmRwb2ludFIJZW5kcG9pbnRzEioKEWlucHV0X3NjaGVtYV9qc29uGAQgASgJUg9pbnB1dFNjaGVtYUpzb24SLAoSb3V0cHV0X3NjaGVtYV9qc29uGAUgASgJUhBvdXRwdXRTY2hlbWFKc29uEicKD2FsbG93ZWRfY2FsbGVycxgGIAMoCVIOYWxsb3dlZENhbGxlcnMy3AEKD1JlZ2lzdHJ5U2VydmljZRJqCglTdWJzY3JpYmUSKy5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLlN1YnNjcmliZVJlcXVlc3QaLC5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLlN1YnNjcmliZVJlc3BvbnNlKAEwARJdCgZMb29rdXASKC5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLkxvb2t1cFJlcXVlc3QaKS5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLkxvb2t1cFJlc3BvbnNlQkdaRWdpdGh1Yi5jb20vc2VydmljZWJyaWRnZS9zZXJ2ZXItZ28vaW50ZXJuYWwvcGIvcmVnaXN0cnkvdjE7cmVnaXN0cnl2MUrWEwoGEgQAAEwBCggKAQwSAwAAEgoICgECEgMBACIKCAoBCBIDAwBcCgkKAggLEgMDAFwKCQoCAwASAwUAJQoJCgIDARIDBgAfCgoKAgYAEgQIAAsBCgoK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aGVsbG9fYWNrGAsgASgLMiIuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkhlbGxvQWNrSABSCGhlbGxvQWNrEj0KBWRyYWluGAwgASgLMiUuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkRyYWluU2lnbmFsSABSBWRyYWluEkAKBmdvYXdheRgNIAEoCzImLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Hb2F3YXlTaWduYWxIAFIGZ29hd2F5EjkKBHBpbmcYFCABKAsyIy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUGluZ0ZyYW1lSABSBHBpbmcSOQoEcG9uZxgVIAEoCzIjLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Qb25nRnJhbWVIAFIEcG9uZxJQCg5jb21tYW5kX3Jlc3VsdBgeIAEoCzInLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Db21tYW5kUmVzdWx0SABSDWNvbW1hbmRSZXN1bHQSSAoJdGVsZW1ldHJ5GB8gASgLMiguc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlRlbGVtZXRyeUZyYW1lSABSCXRlbGVtZXRyeRJSCg1zdHJlYW1fYXBwZW5kGCAgASgLMisuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlN0cmVhbUFwcGVuZEZyYW1lSABSDHN0cmVhbUFwcGVuZBJSCg13b3JrZXJfc3RhdHVzGCEgASgLMisuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLldvcmtlclN0YXR1c0ZyYW1lSABSDHdvcmtlclN0YXR1cxJTCg9wb3NpdGlvbl91cGRhdGUYIiABKAsyKC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUG9zaXRpb25VcGRhdGVIAFIOcG9zaXRpb25VcGRhdGUSRwoIZGlzcGF0Y2gYKCABKAsyKS5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRGlzcGF0Y2hDb21tYW5kSABSCGRpc3BhdGNoEkcKC2NvbmZpZ19wdXNoGCkgASgLMiQuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkNvbmZpZ1B1c2hIAFIKY29uZmlnUHVzaBJKCgxwZXJtaXRfZ3JhbnQYMiABKAsyJS5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUGVybWl0R3JhbnRIAFILcGVybWl0R3JhbnQSUAoOcGVybWl0X3JlbGVhc2UYMyABKAsyJy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUGVybWl0UmVsZWFzZUgAUg1wZXJtaXRSZWxlYXNlEk4KC2Zsb3dfdXBkYXRlGDQgASgLMisuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkZsb3dDb250cm9sVXBkYXRlSABSCmZsb3dVcGRhdGUSUwoPcHVibGlzaF9tZXNzYWdlGDUgASgLMiguc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlB1Ymxpc2hNZXNzYWdlSABSDnB1Ymxpc2hNZXNzYWdlEkcKC3B1Ymxpc2hfYWNrGDYgASgLMiQuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlB1Ymxpc2hBY2tIAFIKcHVibGlzaEFjaxI8CgVlcnJvchhjIAEoCzIkLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5FcnJvckZyYW1lSABSBWVycm9yQgkKB3BheWxvYWQi9wMKBUhlbGxvEkMKCGlkZW50aXR5GAEgASgLMicuc2VydmljZWJyaWRnZS5jb21tb24udjEuV29ya2VySWRlbnRpdHlSCGlkZW50aXR5EiEKDG1heF9pbmZsaWdodBgCIAEoBVILbWF4SW5mbGlnaHQSIQoMbWluX2luZmxpZ2h0GAMgASgFUgttaW5JbmZsaWdodBIhCgxyZXN1bWVfdG9rZW4YBCABKAlSC3Jlc3VtZVRva2VuEhQKBWVwb2NoGAUgASgEUgVlcG9jaBIqChFsYXN0X3JlY2VpdmVkX3NlcRgGIAEoBFIPbGFzdFJlY2VpdmVkU2VxEiIKDWxhc3Rfc2VudF9zZXEYByABKARSC2xhc3RTZW50U2VxEjIKFWNvbXBsZXRlZF9jb21tYW5kX2lkcxgIIAMoCVITY29tcGxldGVkQ29tbWFuZElkcxIfCgtzZGtfdmVyc2lvbhgKIAEoCVIKc2RrVmVyc2lvbhIiCgxjYXBhYmlsaXRpZXMYCyADKAlSDGNhcGFiaWxpdGllcxISCgR6b25lGAwgASgJUgR6b25lEk0KDnRyYW5zcG9ydF9tb2RlGA0gASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVINdHJhbnNwb3J0TW9kZSLsBAoISGVsbG9BY2sSHQoKc2Vzc2lvbl9pZBgBIAEoCVIJc2Vzc2lvbklkEiEKDHJlc3VtZV90b2tlbhgCIAEoCVILcmVzdW1lVG9rZW4SFAoFZXBvY2gYAyABKARSBWVwb2NoEhgKB3Jlc3VtZWQYBCABKAhSB3Jlc3VtZWQSJgoPcmVzdW1lX2Zyb21fc2VxGAUgASgEUg1yZXN1bWVGcm9tU2VxEisKEXJlcGxheWVkX2NvbW1hbmRzGAYgASgFUhByZXBsYXllZENvbW1hbmRzEi0KEnJlY29uY2lsZWRfcmVzdWx0cxgHIAEoBVIRcmVjb25jaWxlZFJlc3VsdHMSMgoVaGVhcnRiZWF0X2ludGVydmFsX21zGAogASgFUhNoZWFydGJlYXRJbnRlcnZhbE1zEjAKFGhlYXJ0YmVhdF90aW1lb3V0X21zGAsgASgFUhJoZWFydGJlYXRUaW1lb3V0TXMSJwoPaW5pdGlhbF9wZXJtaXRzGAwgASgFUg5pbml0aWFsUGVybWl0cxIfCgttYXhfcGVybWl0cxgNIAEoBVIKbWF4UGVybWl0cxJgChhlZmZlY3RpdmVfdHJhbnNwb3J0X21vZGUYFCABKA4yJi5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5UcmFuc3BvcnRNb2RlUhZlZmZlY3RpdmVUcmFuc3BvcnRNb2RlElgKEnJlc3VtZV9mYWlsX3JlYXNvbhgeIAEoDjIqLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5SZXN1bWVGYWlsUmVhc29uUhByZXN1bWVGYWlsUmVhc29uInYKC0RyYWluU2lnbmFsEhYKBnJlYXNvbhgBIAEoCVIGcmVhc29uEh8KC2RlYWRsaW5lX21zGAIgASgFUgpkZWFkbGluZU1zEi4KE3BlbmRpbmdfY29tbWFuZF9pZHMYAyADKAlSEXBlbmRpbmdDb21tYW5kSWRzImAKDEdvYXdheVNpZ25hbBI4CgRjb2RlGAEgASgOMiQuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkdvYXdheUNvZGVSBGNvZGUSFgoGcmVhc29uGAIgASgJUgZyZWFzb24iLgoJUGluZ0ZyYW1lEiEKDHRpbWVzdGFtcF9tcxgBIAEoA1ILdGltZXN0YW1wTXMiZwoJUG9uZ0ZyYW1lEioKEWVjaG9fdGltZXN0YW1wX21zGAEgASgDUg9lY2hvVGltZXN0YW1wTXMSLgoTc2VydmVyX3RpbWVzdGFtcF9tcxgCIAEoA1IRc2VydmVyVGltZXN0YW1wTXMivwMKC1Rhc2tDb21tYW5kEj4KBHR5cGUYASABKA4yKi5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuVGFza0NvbW1hbmQuVHlwZVIEdHlwZRIZCgh0cmFjZV9pZBgCIAEoCVIHdHJhY2VJZBIXCgdzcGFuX2lkGAMgASgJUgZzcGFuSWQSJAoOcGFyZW50X3NwYW5faWQYBCABKAlSDHBhcmVudFNwYW5JZBIYCgdwYXlsb2FkGAUgASgMUgdwYXlsb2FkEkMKBG1ldGEYBiADKAsyLy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuVGFza0NvbW1hbmQuTWV0YUVudHJ5UgRtZXRhEigKEGRlYWRsaW5lX3VuaXhfbXMYByABKANSDmRlYWRsaW5lVW5peE1zEhgKB2F0dGVtcHQYCCABKAVSB2F0dGVtcHQaNwoJTWV0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEiOgoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASDAoIVFlQRV9SUEMQARIOCgpUWVBFX0VWRU5UEAIivQIKD0Rpc3BhdGNoQ29tbWFuZBIdCgpjb21tYW5kX2lkGAEgASgJUgljb21tYW5kSWQSKAoQZGVhZGxpbmVfdW5peF9tcxgCIAEoA1IOZGVhZGxpbmVVbml4TXMSGwoJaXNfcmVwbGF5GAMgASgIUghpc1JlcGxheRJICgx0YXNrX2NvbW1hbmQYFCABKAsyJS5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuVGFza0NvbW1hbmRSC3Rhc2tDb21tYW5kEjUKA3JwYxgKIAEoCzIhLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5ScGNUYXNrSABSA3JwYxI7CgVldmVudBgLIAEoCzIjLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5FdmVudFRhc2tIAFIFZXZlbnRCBgoEdGFzayKzAQoHUnBjVGFzaxIOCgJmbhgBIAEoCVICZm4SGAoHcGF5bG9hZBgCIAEoDFIHcGF5bG9hZBIkCg5ncm91cF90cmFjZV9pZBgDIAEoCVIMZ3JvdXBUcmFjZUlkEhcKB3NwYW5faWQYBCABKAlSBnNwYW5JZBIZCgh0cmFjZV9pZBgFIAEoCVIHdHJhY2VJZBIkCg5wYXJlbnRfc3Bhbl9pZBgGIAEoCVIMcGFyZW50U3BhbklkIoIDCglFdmVudFRhc2sSHQoKbWVzc2FnZV9pZBgBIAEoCVIJbWVzc2FnZUlkEh0KCmdyb3VwX25hbWUYAiABKAlSCWdyb3VwTmFtZRIUCgV0b3BpYxgDIAEoCVIFdG9waWMSGAoHcGF5bG9hZBgEIAEoDFIHcGF5bG9hZBJKCgdoZWFkZXJzGAUgAygLMjAuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkV2ZW50VGFzay5IZWFkZXJzRW50cnlSB2hlYWRlcnMSJAoOZ3JvdXBfdHJhY2VfaWQYBiABKAlSDGdyb3VwVHJhY2VJZBIkCg5wYXJlbnRfc3Bhbl9pZBgHIAEoCVIMcGFyZW50U3BhbklkEhgKB2F0dGVtcHQYCCABKAVSB2F0dGVtcHQSGQoIdHJhY2VfaWQYCSABKAlSB3RyYWNlSWQaOgoMSGVhZGVyc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi8gEKDUNvbW1hbmRSZXN1bHQSHQoKY29tbWFuZF9pZBgBIAEoCVIJY29tbWFuZElkEhgKB3N1Y2Nlc3MYAiABKAhSB3N1Y2Nlc3MSFgoGb3V0cHV0GAMgASgMUgZvdXRwdXQSFAoFZXJyb3IYBCABKAlSBWVycm9yEhAKA2FjaxgFIAEoCFIDYWNrEiQKDnJldHJ5X2FmdGVyX21zGAYgASgFUgxyZXRyeUFmdGVyTXMSIwoNcmVqZWN0X3JlYXNvbhgHIAEoCVIMcmVqZWN0UmVhc29uEh0KCnJlc3VsdF9zZXEYCCABKARSCXJlc3VsdFNlcSKDAQoOVGVsZW1ldHJ5RnJhbWUSOQoFc3BhbnMYASADKAsyIy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuU3BhbkV2ZW50UgVzcGFucxI2CgRsb2dzGAIgAygLMiIuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkxvZ0VudHJ5UgRsb2dzIu4DCglTcGFuRXZlbnQSPAoEa2luZBgBIAEoDjIoLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5TcGFuRXZlbnQuS2luZFIEa2luZBIZCgh0cmFjZV9pZBgCIAEoCVIHdHJhY2VJZBIXCgdzcGFuX2lkGAMgASgJUgZzcGFuSWQSJAoOcGFyZW50X3NwYW5faWQYBCABKAlSDHBhcmVudFNwYW5JZBIOCgJmbhgFIAEoCVICZm4SHQoKc3RhcnRlZF9hdBgGIAEoA1IJc3RhcnRlZEF0Eh8KC2R1cmF0aW9uX21zGAcgASgDUgpkdXJhdGlvbk1zEhgKB3N1Y2Nlc3MYCCABKAhSB3N1Y2Nlc3MSFAoFZXJyb3IYCSABKAlSBWVycm9yEhQKBWlucHV0GAogASgMUgVpbnB1dBIWCgZvdXRwdXQYCyABKAxSBm91dHB1dBIYCgdhdHRlbXB0GAwgASgFUgdhdHRlbXB0EhsKCXNwYW5fdHlwZRgNIAEoCVIIc3BhblR5cGUSJQoOdGFyZ2V0X3NlcnZpY2UYDiABKAlSDXRhcmdldFNlcnZpY2UiPQoES2luZBIUChBLSU5EX1VOU1BFQ0lGSUVEEAASDgoKS0lORF9TVEFSVBABEg8KC0tJTkRfRklOSVNIEAIi6AIKCExvZ0VudHJ5EhkKCHRyYWNlX2lkGAEgASgJUgd0cmFjZUlkEhcKB3NwYW5faWQYAiABKAlSBnNwYW5JZBIhCgxzZXJ2aWNlX25hbWUYAyABKAlSC3NlcnZpY2VOYW1lEhQKBWxldmVsGAQgASgJUgVsZXZlbBIYCgdtZXNzYWdlGAUgASgJUgdtZXNzYWdlEiEKDHRpbWVzdGFtcF9ucxgGIAEoA1ILdGltZXN0YW1wTnMSUgoKYXR0cmlidXRlcxgHIAMoCzIyLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Mb2dFbnRyeS5BdHRyaWJ1dGVzRW50cnlSCmF0dHJpYnV0ZXMSHwoLaW5zdGFuY2VfaWQYCCABKAlSCmluc3RhbmNlSWQaPQoPQXR0cmlidXRlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEilgEKEVN0cmVhbUFwcGVuZEZyYW1lEhkKCHRyYWNlX2lkGAEgASgJUgd0cmFjZUlkEhAKA2tleRgCIAEoCVIDa2V5Eh0KCmV2ZW50X3R5cGUYAyABKAlSCWV2ZW50VHlwZRISCgRkYXRhGAQgASgMUgRkYXRhEiEKDHRyYWNlX3N0YXR1cxgFIAEoCVILdHJhY2VTdGF0dXMiwwEKEVdvcmtlclN0YXR1c0ZyYW1lEiUKDmZ1bmN0aW9uX25hbWVzGAEgAygJUg1mdW5jdGlvbk5hbWVzEh8KC2dyb3VwX25hbWVzGAIgAygJUgpncm91cE5hbWVzEhoKCGVuZHBvaW50GAMgASgJUghlbmRwb2ludBIfCgtjcHVfcGVyY2VudBgEIAEoAlIKY3B1UGVyY2VudBIVCgZyYW1fbWIYBSABKAVSBXJhbU1iEhIKBHpvbmUYBiABKAlSBHpvbmUiYQoLUGVybWl0R3JhbnQSLQoSYWRkaXRpb25hbF9wZXJtaXRzGAEgASgFUhFhZGRpdGlvbmFsUGVybWl0cxIjCg10b3RhbF9wZW5kaW5nGAIgASgFUgx0b3RhbFBlbmRpbmciKwoNUGVybWl0UmVsZWFzZRIaCghyZWxlYXNlZBgBIAEoBVIIcmVsZWFzZWQiUwoRRmxvd0NvbnRyb2xVcGRhdGUSJgoPbmV3X3dpbmRvd19zaXplGAEgASgFUg1uZXdXaW5kb3dTaXplEhYKBnJlYXNvbhgCIAEoCVIGcmVhc29uIjwKDlBvc2l0aW9uVXBkYXRlEioKEWxhc3RfcmVjZWl2ZWRfc2VxGAEgASgEUg9sYXN0UmVjZWl2ZWRTZXEiYgoKQ29uZmlnUHVzaBJUChB0cmFuc3BvcnRfY29uZmlnGAEgASgLMikuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlRyYW5zcG9ydENvbmZpZ1IPdHJhbnNwb3J0Q29uZmlnItEFCg9UcmFuc3BvcnRDb25maWcSSQoMZGVmYXVsdF9tb2RlGAEgASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVILZGVmYXVsdE1vZGUSbAoRc2VydmljZV9vdmVycmlkZXMYAiADKAsyPy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuVHJhbnNwb3J0Q29uZmlnLlNlcnZpY2VPdmVycmlkZXNFbnRyeVIQc2VydmljZU92ZXJyaWRlcxJvChJmdW5jdGlvbl9vdmVycmlkZXMYAyADKAsyQC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuVHJhbnNwb3J0Q29uZmlnLkZ1bmN0aW9uT3ZlcnJpZGVzRW50cnlSEWZ1bmN0aW9uT3ZlcnJpZGVzEmYKF2RlZmF1bHRfY2lyY3VpdF9icmVha2VyGAQgASgLMi4uc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkNpcmN1aXRCcmVha2VyQ29uZmlnUhVkZWZhdWx0Q2lyY3VpdEJyZWFrZXISOAoEem9uZRgFIAEoCzIkLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5ab25lQ29uZmlnUgR6b25lGncKFVNlcnZpY2VPdmVycmlkZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJICgV2YWx1ZRgCIAEoCzIyLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5TZXJ2aWNlVHJhbnNwb3J0T3ZlcnJpZGVSBXZhbHVlOgI4ARp5ChZGdW5jdGlvbk92ZXJyaWRlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkkKBXZhbHVlGAIgASgLMjMuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkZ1bmN0aW9uVHJhbnNwb3J0T3ZlcnJpZGVSBXZhbHVlOgI4ASL5AgoYU2VydmljZVRyYW5zcG9ydE92ZXJyaWRlEjoKBG1vZGUYASABKA4yJi5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5UcmFuc3BvcnRNb2RlUgRtb2RlElEKD2ZhbGxiYWNrX3BvbGljeRgCIAEoDjIoLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5GYWxsYmFja1BvbGljeVIOZmFsbGJhY2tQb2xpY3kSKgoRZGlyZWN0X3RpbWVvdXRfbXMYAyABKAVSD2RpcmVjdFRpbWVvdXRNcxJJCglsYl9wb2xpY3kYBCABKA4yLC5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5Mb2FkQmFsYW5jaW5nUG9saWN5UghsYlBvbGljeRJXCg9jaXJjdWl0X2JyZWFrZXIYBSABKAsyLi5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuQ2lyY3VpdEJyZWFrZXJDb25maWdSDmNpcmN1aXRCcmVha2VyIskBChlGdW5jdGlvblRyYW5zcG9ydE92ZXJyaWRlEjoKBG1vZGUYASABKA4yJi5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5UcmFuc3BvcnRNb2RlUgRtb2RlElEKD2ZhbGxiYWNrX3BvbGljeRgCIAEoDjIoLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5GYWxsYmFja1BvbGljeVIOZmFsbGJhY2tQb2xpY3kSHQoKdGltZW91dF9tcxgDIAEoBVIJdGltZW91dE1zIs8BChRDaXJjdWl0QnJlYWtlckNvbmZpZxIrChFmYWlsdXJlX3RocmVzaG9sZBgBIAEoBVIQZmFpbHVyZVRocmVzaG9sZBIrChFzdWNjZXNzX3RocmVzaG9sZBgCIAEoBVIQc3VjY2Vzc1RocmVzaG9sZBIoChBvcGVuX2R1cmF0aW9uX21zGAMgASgFUg5vcGVuRHVyYXRpb25NcxIzChZoYWxmX29wZW5fbWF4X3JlcXVlc3RzGAQgASgFUhNoYWxmT3Blbk1heFJlcXVlc3RzIngKClpvbmVDb25maWcSHQoKbG9jYWxfem9uZRgBIAEoCVIJbG9jYWxab25lEh8KC3ByZWZlcl96b25lGAIgASgIUgpwcmVmZXJab25lEioKEXpvbmVfd2VpZ2h0X2Jvb3N0GAMgASgFUg96b25lV2VpZ2h0Qm9vc3QifgoKRXJyb3JGcmFtZRISCgRjb2RlGAEgASgFUgRjb2RlEhgKB21lc3NhZ2UYAiABKAlSB21lc3NhZ2USHAoJcmV0cnlhYmxlGAMgASgIUglyZXRyeWFibGUSJAoOcmV0cnlfYWZ0ZXJfbXMYBCABKAVSDHJldHJ5QWZ0ZXJNcyKtAgoOUHVibGlzaE1lc3NhZ2USHQoKcmVxdWVzdF9pZBgBIAEoCVIJcmVxdWVzdElkEhQKBXRvcGljGAIgASgJUgV0b3BpYxIYCgdwYXlsb2FkGAMgASgMUgdwYXlsb2FkEk8KB2hlYWRlcnMYBCADKAsyNS5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUHVibGlzaE1lc3NhZ2UuSGVhZGVyc0VudHJ5UgdoZWFkZXJzEhkKCHRyYWNlX2lkGAUgASgJUgd0cmFjZUlkEiQKDnBhcmVudF9zcGFuX2lkGAYgASgJUgxwYXJlbnRTcGFuSWQaOgoMSGVhZGVyc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEiYAoKUHVibGlzaEFjaxIdCgpyZXF1ZXN0X2lkGAEgASgJUglyZXF1ZXN0SWQSHQoKbWVzc2FnZV9pZBgCIAEoCVIJbWVzc2FnZUlkEhQKBWVycm9yGAMgASgJUgVlcnJvcirsAQoQUmVzdW1lRmFpbFJlYXNvbhIbChdSRVNVTUVfRkFJTF9VTlNQRUNJRklFRBAAEh0KGVJFU1VNRV9GQUlMX1RPS0VOX0VYUElSRUQQARIdChlSRVNVTUVfRkFJTF9UT0tFTl9JTlZBTElEEAISHQoZUkVTVU1FX0ZBSUxfR0FQX1RPT19MQVJHRRADEh4KGlJFU1VNRV9GQUlMX0VQT0NIX01JU01BVENIEAQSHgoaUkVTVU1FX0ZBSUxfU0VTU0lPTl9GRU5DRUQQBRIeChpSRVNVTUVfRkFJTF9TRVJWRVJfUkVTVEFSVBAGKoABCgpHb2F3YXlDb2RlEhIKDkdPQVdBWV9VTktOT1dOEAASHAoYR09BV0FZX0dSQUNFRlVMX1NIVVRET1dOEAESFQoRR09BV0FZX09WRVJMT0FERUQQAhIRCg1HT0FXQVlfRkVOQ0VEEAMSFgoSR09BV0FZX01BSU5URU5BTkNFEAQqbAoORmFsbGJhY2tQb2xpY3kSEQoNRkFMTEJBQ0tfTk9ORRAAEhUKEUZBTExCQUNLX1RPX1BST1hZEAESFgoSRkFMTEJBQ0tfVE9fRElSRUNUEAISGAoURkFMTEJBQ0tfQkVTVF9FRkZPUlQQAzJnCg5TZXNzaW9uU2VydmljZRJVCgdDaGFubmVsEiIuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkVudmVsb3BlGiIuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkVudmVsb3BlKAEwAUJFWkNnaXRodWIuY29tL3NlcnZpY2VicmlkZ2Uvc2VydmVyLWdvL2ludGVybmFsL3BiL3Nlc3Npb24vdjE7c2Vzc2lvbnYxSs1iCgcSBQAAvgIBCggKAQwS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EgS9AhYXYgZwcm90bzMKnBYKFndvcmtlci92MS93b3JrZXIucHJvdG8SF3NlcnZpY2VicmlkZ2Uud29ya2VyLnYxGhtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8i1wEKDUhhbmRsZVJlcXVlc3QSLAoNZnVuY3Rpb25fbmFtZRgBIAEoCUIHukgEcgIQAVIMZnVuY3Rpb25OYW1lEhgKB3BheWxvYWQYAiABKAxSB3BheWxvYWQSJAoOZ3JvdXBfdHJhY2VfaWQYAyABKAlSDGdyb3VwVHJhY2VJZBIXCgdzcGFuX2lkGAQgASgJUgZzcGFuSWQSGQoIdHJhY2VfaWQYBSABKAlSB3RyYWNlSWQSJAoOcGFyZW50X3NwYW5faWQYBiABKAlSDHBhcmVudFNwYW5JZCJYCg5IYW5kbGVSZXNwb25zZRIYCgdzdWNjZXNzGAEgASgIUgdzdWNjZXNzEhYKBm91dHB1dBgCIAEoDFIGb3V0cHV0EhQKBWVycm9yGAMgASgJUgVlcnJvciKZAwoORGVsaXZlclJlcXVlc3QSJgoKZ3JvdXBfbmFtZRgBIAEoCUIHukgEcgIQAVIJZ3JvdXBOYW1lEh0KBXRvcGljGAIgASgJQge6SARyAhABUgV0b3BpYxImCgptZXNzYWdlX2lkGAMgASgJQge6SARyAhABUgltZXNzYWdlSWQSGAoHYXR0ZW1wdBgEIAEoBVIHYXR0ZW1wdBIYCgdwYXlsb2FkGAUgASgMUgdwYXlsb2FkEk4KB2hlYWRlcnMYBiADKAsyNC5zZXJ2aWNlYnJpZGdlLndvcmtlci52MS5EZWxpdmVyUmVxdWVzdC5IZWFkZXJzRW50cnlSB2hlYWRlcnMSJAoOZ3JvdXBfdHJhY2VfaWQYByABKAlSDGdyb3VwVHJhY2VJZBIXCgdzcGFuX2lkGAggASgJUgZzcGFuSWQSGQoIdHJhY2VfaWQYCSABKAlSB3RyYWNlSWQaOgoMSGVhZGVyc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEihAEKD0RlbGl2ZXJSZXNwb25zZRIQCgNhY2sYASABKAhSA2FjaxIjCg1yZWplY3RfcmVhc29uGAIgASgJUgxyZWplY3RSZWFzb24SJAoOcmV0cnlfYWZ0ZXJfbXMYAyABKAVSDHJldHJ5QWZ0ZXJNcxIUCgVlcnJvchgEIAEoCVIFZXJyb3IyyAEKDVdvcmtlckhhbmRsZXISWQoGSGFuZGxlEiYuc2VydmljZWJyaWRnZS53b3JrZXIudjEuSGFuZGxlUmVxdWVzdBonLnNlcnZpY2VicmlkZ2Uud29ya2VyLnYxLkhhbmRsZVJlc3BvbnNlElwKB0RlbGl2ZXISJy5zZXJ2aWNlYnJpZGdlLndvcmtlci52MS5EZWxpdmVyUmVxdWVzdBooLnNlcnZpY2VicmlkZ2Uud29ya2VyLnYxLkRlbGl2ZXJSZXNwb25zZUJDWkFnaXRodWIuY29tL3NlcnZpY2VicmlkZ2Uvc2VydmVyLWdvL2ludGVybmFsL3BiL3dvcmtlci92MTt3b3JrZXJ2MUrcDAoGEgQAACwBCggKAQwSAwAAEgoICgECEgMBACAKCAoBCBIDAwBYCgkKAggLEgMDAFgKCQoCAwASAwUAJQoKCgIGABIEBwAKAQoKCgMGAAESAwcIFQoLCgQGAAIAEgMIAjUKDAoFBgACAAESAwgGDAoMCgUGAAIAAhIDCA0aCgwKBQYAAgADEgMIJTMKCwoEBgACARIDCQI4CgwKBQYAAgEBEgMJBg0KDAoFBgACAQISAwkOHAoMCgUGAAIBAxIDCSc2CgoKAgQAEgQMABMBCgoKAwQAARIDDAgVCgsKBAQAAgASAw0CRwoMCgUEAAIABRIDDQIICgwKBQQAAgABEgMNCRYKDAoFBAACAAMSAw0bHAoMCgUEAAIACBIDDR1GChAKCQQAAgAIhwkOAhIDDR5FCgsKBAQAAgESAw4CHQoMCgUEAAIBBRIDDgIHCgwKBQQAAgEBEgMOCRAKDAoFBAACAQMSAw4bHAoLCgQEAAICEgMPAh0KDAoFBAACAgUSAw8CCAoMCgUEAAICARIDDwkXCgwKBQQAAgIDEgMPGxwKCwoEBAACAxIDEAIdCgwKBQQAAgMFEgMQAggKDAoFBAACAwESAxAJEAoMCgUEAAIDAxIDEBscCgsKBAQAAgQSAxECHQoMCgUEAAIEBRIDEQIICgwKBQQAAgQBEgMRCREKDAoFBAACBAMSAxEbHAoLCgQEAAIFEgMSAh0KDAoFBAACBQUSAxICCAoMCgUEAAIFARIDEgkXCgwKBQQAAgUDEgMSGxwKCgoCBAESBBUAGQEKCgoDBAEBEgMVCBYKCwoEBAECABIDFgIVCgwKBQQBAgAFEgMWAgYKDAoFBAECAAESAxYJEAoMCgUEAQIAAxIDFhMUCgsKBAQBAgESAxcCFQoMCgUEAQIBBRIDFwIHCgwKBQQBAgEBEgMXCQ8KDAoFBAECAQMSAxcTFAoLCgQEAQICEgMYAhUKDAoFBAECAgUSAxgCCAoMCgUEAQICARIDGAkOCgwKBQQBAgIDEgMYExQKCgoCBAISBBsAJQEKCgoDBAIBEgMbCBYKCwoEBAICABIDHAJTCgwKBQQCAgAFEgMcAggKDAoFBAICAAESAxwWIAoMCgUEAgIAAxIDHCcoCgwKBQQCAgAIEgMcKVIKEAoJBAICAAiHCQ4CEgMcKlEKCwoEBAICARIDHQJTCgwKBQQCAgEFEgMdAggKDAoFBAICAQESAx0WGwoMCgUEAgIBAxIDHScoCgwKBQQCAgEIEgMdKVIKEAoJBAICAQiHCQ4CEgMdKlEKCwoEBAICAhIDHgJTCgwKBQQCAgIFEgMeAggKDAoFBAICAgESAx4WIAoMCgUEAgICAxIDHicoCgwKBQQCAgIIEgMeKVIKEAoJBAICAgiHCQ4CEgMeKlEKCwoEBAICAxIDHwIpCgwKBQQCAgMFEgMfAgcKDAoFBAICAwESAx8WHQoMCgUEAgIDAxIDHycoCgsKBAQCAgQSAyACKQoMCgUEAgIEBRIDIAIHCgwKBQQCAgQBEgMgFh0KDAoFBAICBAMSAyAnKAoLCgQEAgIFEgMhAikKDAoFBAICBQYSAyECFQoMCgUEAgIFARIDIRYdCgwKBQQCAgUDEgMhJygKCwoEBAICBhIDIgIpCgwKBQQCAgYFEgMiAggKDAoFBAICBgESAyIWJAoMCgUEAgIGAxIDIicoCgsKBAQCAgcSAyMCKQoMCgUEAgIHBRIDIwIICgwKBQQCAgcBEgMjFh0KDAoFBAICBwMSAyMnKAoLCgQEAgIIEgMkAikKDAoFBAICCAUSAyQCCAoMCgUEAgIIARIDJBYeCgwKBQQCAggDEgMkJygKCgoCBAMSBCcALAEKCgoDBAMBEgMnCBcKCwoEBAMCABIDKAIcCgwKBQQDAgAFEgMoAgYKDAoFBAMCAAESAygJDAoMCgUEAwIAAxIDKBobCgsKBAQDAgESAykCHAoMCgUEAwIBBRIDKQIICgwKBQQDAgEBEgMpCRYKDAoFBAMCAQMSAykaGwoLCgQEAwICEgMqAhwKDAoFBAMCAgUSAyoCBwoMCgUEAwICARIDKgkXCgwKBQQDAgIDEgMqGhsKCwoEBAMCAxIDKwIcCgwKBQQDAgMFEgMrAggKDAoFBAMCAwESAysJDgoMCgUEAwIDAxIDKxobYgZwcm90bzM=";
|
|
14
14
|
|
|
15
15
|
// sdk/src/session_v2.ts
|
|
16
16
|
class AdaptiveHeartbeatV2 {
|
|
@@ -628,20 +628,6 @@ function reportSDKError(operation, err, component = "sdk") {
|
|
|
628
628
|
}
|
|
629
629
|
return normalized;
|
|
630
630
|
}
|
|
631
|
-
function parseRegistryCanonicalName(target) {
|
|
632
|
-
const canonicalName = target.trim();
|
|
633
|
-
if (!canonicalName)
|
|
634
|
-
return null;
|
|
635
|
-
const slash = canonicalName.indexOf("/");
|
|
636
|
-
if (slash > 0 && slash < canonicalName.length - 1) {
|
|
637
|
-
const serviceName = canonicalName.slice(0, slash).trim();
|
|
638
|
-
const fnName = canonicalName.slice(slash + 1).trim();
|
|
639
|
-
if (!serviceName || !fnName)
|
|
640
|
-
return null;
|
|
641
|
-
return { canonicalName, serviceName, fnName };
|
|
642
|
-
}
|
|
643
|
-
return { canonicalName, serviceName: "", fnName: canonicalName };
|
|
644
|
-
}
|
|
645
631
|
function workerChannelOptions(tlsOpts) {
|
|
646
632
|
if (!tlsOpts?.serverName) {
|
|
647
633
|
return channelOpts;
|
|
@@ -784,7 +770,7 @@ function ensureSbResolverRegistered() {
|
|
|
784
770
|
|
|
785
771
|
class SbResolver {
|
|
786
772
|
clientId;
|
|
787
|
-
|
|
773
|
+
functionKey;
|
|
788
774
|
listener;
|
|
789
775
|
refreshTimer = null;
|
|
790
776
|
constructor(target, listener) {
|
|
@@ -792,11 +778,11 @@ function ensureSbResolverRegistered() {
|
|
|
792
778
|
const normalizedPath = (target.path ?? "").replace(/^\/+/, "");
|
|
793
779
|
if (authority && authority !== "localhost" && _sbContexts.has(authority)) {
|
|
794
780
|
this.clientId = authority;
|
|
795
|
-
this.
|
|
781
|
+
this.functionKey = normalizedPath;
|
|
796
782
|
} else {
|
|
797
|
-
const [clientIdFromPath = "", ...
|
|
783
|
+
const [clientIdFromPath = "", ...keyParts] = normalizedPath.split("/");
|
|
798
784
|
this.clientId = clientIdFromPath.trim();
|
|
799
|
-
this.
|
|
785
|
+
this.functionKey = keyParts.join("/").trim();
|
|
800
786
|
}
|
|
801
787
|
this.listener = listener;
|
|
802
788
|
this.init().catch(() => {});
|
|
@@ -825,7 +811,7 @@ function ensureSbResolverRegistered() {
|
|
|
825
811
|
if (!ctx)
|
|
826
812
|
return;
|
|
827
813
|
try {
|
|
828
|
-
const eps = await ctx.lookupFn(this.
|
|
814
|
+
const eps = await ctx.lookupFn(this.functionKey);
|
|
829
815
|
this.reportEndpoints(eps);
|
|
830
816
|
} catch {}
|
|
831
817
|
}
|
|
@@ -835,7 +821,7 @@ function ensureSbResolverRegistered() {
|
|
|
835
821
|
ok: false,
|
|
836
822
|
error: {
|
|
837
823
|
code: 14,
|
|
838
|
-
details: `No live endpoints for ${this.
|
|
824
|
+
details: `No live endpoints for ${this.functionKey}`,
|
|
839
825
|
metadata: new grpc.Metadata
|
|
840
826
|
}
|
|
841
827
|
}, {}, null, "sb-resolver");
|
|
@@ -1082,9 +1068,9 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
|
|
|
1082
1068
|
ensureSbResolverRegistered();
|
|
1083
1069
|
_sbContexts.set(clientId, {
|
|
1084
1070
|
lookupFn: async (target2) => {
|
|
1085
|
-
const
|
|
1086
|
-
if (
|
|
1087
|
-
const m = functionMeta.get(
|
|
1071
|
+
const functionKey = resolveFunctionKey(target2);
|
|
1072
|
+
if (functionKey) {
|
|
1073
|
+
const m = functionMeta.get(functionKey);
|
|
1088
1074
|
if (m && m.endpoints.length > 0)
|
|
1089
1075
|
return m.endpoints;
|
|
1090
1076
|
}
|
|
@@ -1120,7 +1106,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
|
|
|
1120
1106
|
} catch {}
|
|
1121
1107
|
return;
|
|
1122
1108
|
}
|
|
1123
|
-
function
|
|
1109
|
+
function resolveFunctionKey(target2) {
|
|
1124
1110
|
const n = target2.trim();
|
|
1125
1111
|
if (!n)
|
|
1126
1112
|
throw new Error("RPC target is required");
|
|
@@ -1134,29 +1120,28 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
|
|
|
1134
1120
|
async function doLookupFunction(target2) {
|
|
1135
1121
|
return new Promise((resolve) => {
|
|
1136
1122
|
registryStub.Lookup({ function_name: target2 }, meta, { deadline: new Date(Date.now() + 5000) }, (err, res) => {
|
|
1137
|
-
if (err || !res?.
|
|
1123
|
+
if (err || !res?.service_name || !res?.fn_name) {
|
|
1138
1124
|
resolve([]);
|
|
1139
1125
|
return;
|
|
1140
1126
|
}
|
|
1141
|
-
const
|
|
1127
|
+
const serviceName = res.service_name;
|
|
1128
|
+
const fnName = res.fn_name;
|
|
1129
|
+
const functionKey = `${serviceName}/${fnName}`;
|
|
1142
1130
|
const endpoints = parseEndpointsFromWire(res.endpoints);
|
|
1143
|
-
const isNewFunction = !functionMeta.has(
|
|
1131
|
+
const isNewFunction = !functionMeta.has(functionKey);
|
|
1144
1132
|
if (isNewFunction) {
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
});
|
|
1156
|
-
rebuildAliasMap();
|
|
1157
|
-
}
|
|
1133
|
+
functionMeta.set(functionKey, {
|
|
1134
|
+
functionKey,
|
|
1135
|
+
fnName,
|
|
1136
|
+
serviceName,
|
|
1137
|
+
inputSchema: parseSchemaJsonSafe(res.input_schema_json),
|
|
1138
|
+
outputSchema: parseSchemaJsonSafe(res.output_schema_json),
|
|
1139
|
+
allowedCallers: Array.isArray(res.allowed_callers) ? res.allowed_callers : [],
|
|
1140
|
+
endpoints
|
|
1141
|
+
});
|
|
1142
|
+
rebuildAliasMap();
|
|
1158
1143
|
} else {
|
|
1159
|
-
const meta2 = functionMeta.get(
|
|
1144
|
+
const meta2 = functionMeta.get(functionKey);
|
|
1160
1145
|
if (meta2)
|
|
1161
1146
|
meta2.endpoints = endpoints;
|
|
1162
1147
|
}
|
|
@@ -1170,18 +1155,18 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
|
|
|
1170
1155
|
for (const m of functionMeta.values())
|
|
1171
1156
|
count.set(m.fnName, (count.get(m.fnName) ?? 0) + 1);
|
|
1172
1157
|
for (const m of functionMeta.values())
|
|
1173
|
-
fnAliasMap.set(m.fnName, (count.get(m.fnName) ?? 0) === 1 ? m.
|
|
1158
|
+
fnAliasMap.set(m.fnName, (count.get(m.fnName) ?? 0) === 1 ? m.functionKey : null);
|
|
1174
1159
|
}
|
|
1175
|
-
function getOrCreateFunctionChannel(
|
|
1176
|
-
let ch = functionChannels.get(
|
|
1160
|
+
function getOrCreateFunctionChannel(functionKey) {
|
|
1161
|
+
let ch = functionChannels.get(functionKey);
|
|
1177
1162
|
if (!ch) {
|
|
1178
1163
|
const tlsOpts = effectiveWorkerTLS;
|
|
1179
1164
|
const creds = tlsOpts?.caCert && tlsOpts.cert && tlsOpts.key ? workerClientCredentials(tlsOpts) : grpc.credentials.createInsecure();
|
|
1180
|
-
ch = new grpc.Channel(`sb://localhost/${clientId}/${
|
|
1165
|
+
ch = new grpc.Channel(`sb://localhost/${clientId}/${functionKey}`, creds, {
|
|
1181
1166
|
...workerChannelOptions(tlsOpts ?? undefined),
|
|
1182
1167
|
"grpc.lb_policy_name": "round_robin"
|
|
1183
1168
|
});
|
|
1184
|
-
functionChannels.set(
|
|
1169
|
+
functionChannels.set(functionKey, ch);
|
|
1185
1170
|
}
|
|
1186
1171
|
return ch;
|
|
1187
1172
|
}
|
|
@@ -2129,14 +2114,14 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
|
|
|
2129
2114
|
const maxRetries = normalizeNonNegativeInt(opts?.retries ?? globalOpts.retries ?? 3, 3);
|
|
2130
2115
|
const baseDelay = normalizePositiveInt(opts?.retryDelay ?? globalOpts.retryDelay ?? 300, 300);
|
|
2131
2116
|
const timeout = normalizePositiveInt(opts?.timeout ?? globalOpts.timeout ?? 30000, 30000);
|
|
2132
|
-
let
|
|
2133
|
-
if (!
|
|
2117
|
+
let functionKey = resolveFunctionKey(lookupKey);
|
|
2118
|
+
if (!functionKey) {
|
|
2134
2119
|
await doLookupFunction(lookupKey);
|
|
2135
|
-
|
|
2120
|
+
functionKey = resolveFunctionKey(lookupKey);
|
|
2136
2121
|
}
|
|
2137
|
-
if (!
|
|
2122
|
+
if (!functionKey)
|
|
2138
2123
|
throw normalizeServiceError(new Error(`No endpoints available for RPC: ${lookupKey}`), lookupKey, "worker");
|
|
2139
|
-
const fmeta = functionMeta.get(
|
|
2124
|
+
const fmeta = functionMeta.get(functionKey);
|
|
2140
2125
|
if (fmeta && !containsOrAll(fmeta.allowedCallers, service)) {
|
|
2141
2126
|
throw new Error(`Service "${service}" is not allowed to call "${lookupKey}". ` + `Permitted callers: ${fmeta.allowedCallers.join(", ")}`);
|
|
2142
2127
|
}
|
|
@@ -2155,7 +2140,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
|
|
|
2155
2140
|
if (opts?.mode === "proxy") {
|
|
2156
2141
|
return await new Promise((resolve, reject) => {
|
|
2157
2142
|
stub.ProxyCall({
|
|
2158
|
-
function_name:
|
|
2143
|
+
function_name: functionKey,
|
|
2159
2144
|
payload: inputBuf,
|
|
2160
2145
|
trace_id: traceId,
|
|
2161
2146
|
span_id: rootSpanId,
|
|
@@ -2181,7 +2166,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
|
|
|
2181
2166
|
});
|
|
2182
2167
|
}
|
|
2183
2168
|
await ensureCallerTLS();
|
|
2184
|
-
const channel = getOrCreateFunctionChannel(
|
|
2169
|
+
const channel = getOrCreateFunctionChannel(functionKey);
|
|
2185
2170
|
const workerClient = new WorkerHandlerService("__channel__", grpc.credentials.createInsecure(), { channelOverride: channel });
|
|
2186
2171
|
let lastError;
|
|
2187
2172
|
for (let attempt = 1;attempt <= maxRetries + 1; attempt++) {
|
|
@@ -2443,7 +2428,27 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
|
|
|
2443
2428
|
}
|
|
2444
2429
|
}, 200);
|
|
2445
2430
|
},
|
|
2446
|
-
async job(
|
|
2431
|
+
async job(serviceOrTarget, fnOrOpts, optsOrUndefined) {
|
|
2432
|
+
let target2;
|
|
2433
|
+
let opts;
|
|
2434
|
+
if (typeof fnOrOpts === "string") {
|
|
2435
|
+
const service2 = serviceOrTarget.trim();
|
|
2436
|
+
const fn = fnOrOpts.trim();
|
|
2437
|
+
opts = optsOrUndefined ?? { via: "rpc" };
|
|
2438
|
+
if (!service2 || !fn) {
|
|
2439
|
+
throw new Error("job: service and fn are required for RPC jobs");
|
|
2440
|
+
}
|
|
2441
|
+
if (opts.via !== "rpc") {
|
|
2442
|
+
throw new Error("job: via must be 'rpc' when using (service, fn) form");
|
|
2443
|
+
}
|
|
2444
|
+
target2 = `${service2}/${fn}`;
|
|
2445
|
+
} else {
|
|
2446
|
+
target2 = serviceOrTarget;
|
|
2447
|
+
opts = fnOrOpts;
|
|
2448
|
+
if (opts.via === "rpc") {
|
|
2449
|
+
throw new Error("job: use job(service, fn, opts) form for RPC jobs");
|
|
2450
|
+
}
|
|
2451
|
+
}
|
|
2447
2452
|
jobRegistrations.set(target2, { target: target2, opts });
|
|
2448
2453
|
if (isOnline) {
|
|
2449
2454
|
await reconcileRegistrations(`job:${target2}`).catch((err) => {
|
|
@@ -2465,12 +2470,18 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
|
|
|
2465
2470
|
}
|
|
2466
2471
|
return name;
|
|
2467
2472
|
},
|
|
2468
|
-
async executeWorkflow(name, input, opts) {
|
|
2473
|
+
async executeWorkflow(service2, name, input, opts) {
|
|
2469
2474
|
await _controlReady;
|
|
2475
|
+
const svc2 = service2.trim();
|
|
2476
|
+
const wfName = name.trim();
|
|
2477
|
+
if (!svc2 || !wfName) {
|
|
2478
|
+
return Promise.reject(new Error("executeWorkflow: service and name are required"));
|
|
2479
|
+
}
|
|
2470
2480
|
const payload = toJsonBuffer(input ?? {});
|
|
2471
2481
|
return new Promise((resolve, reject) => {
|
|
2472
2482
|
stub.ExecuteWorkflow({
|
|
2473
|
-
workflow_name:
|
|
2483
|
+
workflow_name: wfName,
|
|
2484
|
+
service_name: svc2,
|
|
2474
2485
|
input: payload
|
|
2475
2486
|
}, meta, unaryDeadlineOptions(), (err, res) => {
|
|
2476
2487
|
if (err) {
|