Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IFN5bnRhY29yZSBMTEMgqSAyMDE2LTIwMjEKLy8gCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAovLyBTUERYLUZpbGVDb250cmlidXRvcjogU3ludGFjb3JlIExMQwovLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8gQGZpbGUgICAgICAgPHNjcjFfYXJjaF90eXBlcy5zdmg+Ci8vLyBAYnJpZWYgICAgICBQaXBlbGluZSB0eXBlcyBkZXNjcmlwdGlvbiBmaWxlCi8vLwoKYGlmbmRlZiBTQ1IxX0FSQ0hfVFlQRVNfU1ZICmBkZWZpbmUgU0NSMV9BUkNIX1RZUEVTX1NWSAoKYGluY2x1ZGUgInNjcjFfYXJjaF9kZXNjcmlwdGlvbi5zdmgiCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTVBSRiBhbmQgQ1NSIHBhcmFtZXRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgaWZkZWYgU0NSMV9SVkVfRVhUCiAgYGRlZmluZSBTQ1IxX01QUkZfQVdJRFRIICAgIDQKICBgZGVmaW5lIFNDUjFfTVBSRl9TSVpFICAgICAgMTYKYGVsc2UgLy8gU0NSMV9SVkVfRVhUCiAgYGRlZmluZSBTQ1IxX01QUkZfQVdJRFRIICAgIDUKICBgZGVmaW5lIFNDUjFfTVBSRl9TSVpFICAgICAgMzIKYGVuZGlmIC8vIFNDUjFfUlZFX0VYVAoKLy8gTWFza2VkIGR1ZSB0byBpdmVyaWxvZyBpc3N1ZQovL3R5cGVkZWYgbG9naWMgW2BTQ1IxX1hMRU4tMTowXSAgdHlwZV9zY3IxX21wcmZfdjsKLy90eXBlZGVmIGxvZ2ljIFtgU0NSMV9YTEVOLTE6MF0gIHR5cGVfc2NyMV9wY192OwoKcGFyYW1ldGVyIGludCB1bnNpZ25lZCAgU0NSMV9DU1JfQUREUl9XSURUSCAgICAgICAgICAgICA9IDEyOwpwYXJhbWV0ZXIgaW50IHVuc2lnbmVkICBTQ1IxX0NTUl9NVFZFQ19CQVNFX1pFUk9fQklUUyAgID0gNjsKcGFyYW1ldGVyIGludCB1bnNpZ25lZCAgU0NSMV9DU1JfTVRWRUNfQkFTRV9WQUxfQklUUyAgICA9IGBTQ1IxX1hMRU4tU0NSMV9DU1JfTVRWRUNfQkFTRV9aRVJPX0JJVFM7CnBhcmFtZXRlciBiaXQgW2BTQ1IxX1hMRU4tMTpTQ1IxX0NTUl9NVFZFQ19CQVNFX1pFUk9fQklUU10gIFNDUjFfQ1NSX01UVkVDX0JBU0VfV1JfUlNUX1ZBTCAgICA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NSMV9DU1JfTVRWRUNfQkFTRV9WQUxfQklUUycoU0NSMV9BUkNIX01UVkVDX0JBU0UgPj4gU0NSMV9DU1JfTVRWRUNfQkFTRV9aRVJPX0JJVFMpOwpwYXJhbWV0ZXIgaW50IHVuc2lnbmVkICBTQ1IxX0NTUl9NVFZFQ19CQVNFX1JPX0JJVFMgPSAoYFNDUjFfWExFTi0oU0NSMV9DU1JfTVRWRUNfQkFTRV9aRVJPX0JJVFMrU0NSMV9NVFZFQ19CQVNFX1dSX0JJVFMpKTsKCmBkZWZpbmUgU0NSMV9NVFZBTF9JTExFR0FMX0lOU1RSX0VOCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRXhjZXB0aW9uIGFuZCBJUlEgY29kZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnBhcmFtZXRlciBpbnQgdW5zaWduZWQgU0NSMV9FWENfQ09ERV9XSURUSF9FICAgID0gNDsKCi8vIEV4Y2VwdGlvbnMKdHlwZWRlZiBlbnVtIGxvZ2ljIFtTQ1IxX0VYQ19DT0RFX1dJRFRIX0UtMTowXSB7CiAgICBTQ1IxX0VYQ19DT0RFX0lOU1RSX01JU0FMSUdOICAgICAgICA9IDQnZDAsICAgICAvLyBmcm9tIEVYVQogICAgU0NSMV9FWENfQ09ERV9JTlNUUl9BQ0NFU1NfRkFVTFQgICAgPSA0J2QxLCAgICAgLy8gZnJvbSBJRlUKICAgIFNDUjFfRVhDX0NPREVfSUxMRUdBTF9JTlNUUiAgICAgICAgID0gNCdkMiwgICAgIC8vIGZyb20gSURVIG9yIENTUgogICAgU0NSMV9FWENfQ09ERV9CUkVBS1BPSU5UICAgICAgICAgICAgPSA0J2QzLCAgICAgLy8gZnJvbSBJRFUgb3IgQlJLTQogICAgU0NSMV9FWENfQ09ERV9MRF9BRERSX01JU0FMSUdOICAgICAgPSA0J2Q0LCAgICAgLy8gZnJvbSBMU1UKICAgIFNDUjFfRVhDX0NPREVfTERfQUNDRVNTX0ZBVUxUICAgICAgID0gNCdkNSwgICAgIC8vIGZyb20gTFNVCiAgICBTQ1IxX0VYQ19DT0RFX1NUX0FERFJfTUlTQUxJR04gICAgICA9IDQnZDYsICAgICAvLyBmcm9tIExTVQogICAgU0NSMV9FWENfQ09ERV9TVF9BQ0NFU1NfRkFVTFQgICAgICAgPSA0J2Q3LCAgICAgLy8gZnJvbSBMU1UKICAgIFNDUjFfRVhDX0NPREVfRUNBTExfTSAgICAgICAgICAgICAgID0gNCdkMTEgICAgIC8vIGZyb20gSURVCn0gdHlwZV9zY3IxX2V4Y19jb2RlX2U7CgovLyBJUlFzLCByZXNldApwYXJhbWV0ZXIgYml0IFtTQ1IxX0VYQ19DT0RFX1dJRFRIX0UtMTowXSBTQ1IxX0VYQ19DT0RFX0lSUV9NX1NPRlRXQVJFICAgICAgPSA0J2QzOwpwYXJhbWV0ZXIgYml0IFtTQ1IxX0VYQ19DT0RFX1dJRFRIX0UtMTowXSBTQ1IxX0VYQ19DT0RFX0lSUV9NX1RJTUVSICAgICAgICAgPSA0J2Q3OwpwYXJhbWV0ZXIgYml0IFtTQ1IxX0VYQ19DT0RFX1dJRFRIX0UtMTowXSBTQ1IxX0VYQ19DT0RFX0lSUV9NX0VYVEVSTkFMICAgICAgPSA0J2QxMTsKcGFyYW1ldGVyIGJpdCBbU0NSMV9FWENfQ09ERV9XSURUSF9FLTE6MF0gU0NSMV9FWENfQ09ERV9SRVNFVCAgICAgICAgICAgICAgID0gNCdkMDsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBPcGVyYW5kIHdpZHRoIGZvciBCUktNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0eXBlZGVmIGVudW0gbG9naWMgWzE6MF0gewogICAgU0NSMV9PUF9XSURUSF9CWVRFICA9IDInYjAwLAogICAgU0NSMV9PUF9XSURUSF9IQUxGICA9IDInYjAxLAogICAgU0NSMV9PUF9XSURUSF9XT1JEICA9IDInYjEwCmBpZmRlZiBTQ1IxX1hQUk9QX0VOCiAgICAsCiAgICBTQ1IxX09QX1dJRFRIX0VSUk9SID0gJ3gKYGVuZGlmIC8vIFNDUjFfWFBST1BfRU4KfSB0eXBlX3NjcjFfb3Bfd2lkdGhfZTsKCmBlbmRpZiAvL1NDUjFfQVJDSF9UWVBFU19TVkgK