ZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9PV05FUlMgYi90b29scy9pZGVfcXVlcnkvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNGE5YTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvT1dORVJTCkBAIC0wLDAgKzEsNCBAQAoraWFsaXlldkBnb29nbGUuY29tCitpdmFua2lyaWNoZW5rb0Bnb29nbGUuY29tCitrYWRpcmNldEBnb29nbGUuY29tCittaWNoYWVsbWVyZ0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL0FuZHJvaWQuYnAgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5MDIxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvQW5kcm9pZC5icApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJpZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJnZW5lcmFsLmNjIiwKKyAgICAgICAgImZvby5wcm90byIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsiLVduby11bnVzZWQtcGFyYW1ldGVyIl0sCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90byBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODUxNDcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90bwpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgaWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzOworCittZXNzYWdlIFByb3RvTXNnIHsKKyAgLy8gVGVzdCBwcm90byBmaWVsZC4KKyAgaW50NjQgc29tZV9maWVsZCA9IDE7CisgIC8vICAgICAgICAgICAgICAgICAgIF4gc29tZV9maWVsZAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDYzOWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZm9vLnBiLmgiCisKK3VzaW5nIGlkZV9xdWVyeTo6cHJvYmVyX3NjcmlwdHM6OlByb3RvTXNnOworCit2b2lkIEZvbyhpbnQgeCwgZG91YmxlIHkpIHt9CitmbG9hdCBGb28oZmxvYXQgeCwgZmxvYXQgeSkgeyByZXR1cm4gMC4wZjsgfQorCit2b2lkIFRlc3RDb21wbGV0aW9uKCkgeworICAvLyBUZXN0IGNvbXBsZXRpb24gb24gcHJvdG9zIGFuZCBmdXp6eSBtYXRjaGluZyBvZiBjb21wbGV0aW9uIHN1Z2dlc3Rpb25zLgorCisgIFByb3RvTXNnIGZvbzsKKworICAvLyBeCisKKyAgLy8gc3RlcAorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gdHlwZSgiZiIpCisgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBjb21wbGV0aW9uLml0ZW1zLmZpbHRlcihsYWJlbD0iZm9vIikKKyAgLy8gZGVsbGluZSgpCisgIC8vIHR5cGUoImZvby5zZiIpCisgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBjb21wbGV0aW9uLml0ZW1zLmZpbHRlcigKKyAgLy8gIGxhYmVsPSJzb21lX2ZpZWxkLioiLAorICAvLyAgaW5zZXJ0VGV4dD0ic29tZV9maWVsZC4qIiwKKyAgLy8gKQorICAvLyBkZWxsaW5lKCkKKworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisKKyAgLy8gXgorCisgIC8vIHN0ZXAKKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIHR5cGUoInYucHVzaCIpCisgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBjb21wbGV0aW9uLml0ZW1zLmZpbHRlcihsYWJlbD0icHVzaF9iYWNrLioiKQorICAvLyBkZWxsaW5lKCkKK30KKwordm9pZCBUZXN0TmF2aWdhdGlvbigpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBpbnRzOworICAvLyAgICAgICAgICAgICAgIHwgICB8IGludHMKKyAgLy8gICAgICBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgbmF2aWdhdGlvbiB0byBkZWZpbml0aW9uIG9uIFNUTCB0eXBlcy4KKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIG5hdmlnYXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBuYXZpZ2F0aW9uLml0ZW1zLmZpbHRlcihwYXRoPSIuKi92ZWN0b3IiKQorCisgIGludHMucHVzaF9iYWNrKDApOworICAvLyBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgbmF2aWdhdGlvbiB0byBkZWZpbml0aW9uIG9uIGxvY2FsIHN5bWJvbHMuCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyBuYXZpZ2F0aW9uLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgbmF2aWdhdGlvbi5pdGVtcy5maWx0ZXIocGF0aD0iLiovZ2VuZXJhbC5jYyIsIHJhbmdlPWludHMpCisKKyAgUHJvdG9Nc2cgbXNnOworICBtc2cuc2V0X3NvbWVfZmllbGQoMCk7CisgIC8vICAgICAgICAgIF4KKworICAvLyBzdGVwCisgIC8vIDsgVGVzdCBuYXZpZ2F0aW9uIHRvIGRlZmluaXRpb24gb24gcHJvdG8gZmllbGRzLiBXZSBkbyBub3QgY2hlY2sgZm9yIGEKKyAgLy8gOyBzcGVjaWZpYyB0YXJnZXQgYXMgaXQgY2FuIGJlIGluIGdlbmVyYXRlZCBjb2RlLgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gbmF2aWdhdGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IG5hdmlnYXRpb24uaXRlbXMKK30KKwordm9pZCBUZXN0UGFyYW1ldGVySW5mbygpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiB2OworICB2LnB1c2hfYmFjaygwKTsKKyAgLy8gICAgICAgICAgXgorCisgIC8vIHN0ZXAKKyAgLy8gOyBUZXN0IHRoZSBzaWduYXR1cmUgaGVscCBmb3IgU1RMIGZ1bmN0aW9ucy4gV2UgZG8gbm90IGNoZWNrIGZvciBhIHNwZWNpZmljCisgIC8vIDsgdGV4dCBhcyBpdCBjYW4gYmUgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gcGFyYW1pbmZvLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgcGFyYW1pbmZvLml0ZW1zCisKKyAgRm9vKDAsIDAuMCk7CisgIC8vICAgICAgXgorCisgIC8vIHN0ZXAKKyAgLy8gOyBUZXN0IHRoZSBzaWduYXR1cmUgaGVscCBmb3IgdGhlIGZ1bmN0aW9uICdGb28nIGhhdmluZyB0d28gb3ZlcmxvYWRzLgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gcGFyYW1pbmZvLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgcGFyYW1pbmZvLml0ZW1zLmZpbHRlcigKKyAgLy8gIGFjdGl2ZT10cnVlLAorICAvLyAgbGFiZWw9IkZvb1xcKGludCB4LCBkb3VibGUgeVxcKSAtPiB2b2lkIiwKKyAgLy8gIHNlbGVjdGlvbj0iZG91YmxlIHkiLAorICAvLyApCisgIC8vIGFzc2VydCBwYXJhbWluZm8uaXRlbXMuZmlsdGVyKAorICAvLyAgYWN0aXZlPWZhbHNlLAorICAvLyAgbGFiZWw9IkZvb1xcKGZsb2F0IHgsIGZsb2F0IHlcXCkgLT4gZmxvYXQiLAorICAvLyApCit9CisKK2ludCBtYWluKCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcF9zdWl0ZS50ZXh0cGIgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwX3N1aXRlLnRleHRwYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc3MjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcF9zdWl0ZS50ZXh0cGIKQEAgLTAsMCArMSw1IEBACit0ZXN0czogeworICBuYW1lOiAiZ2VuZXJhbCIKKyAgc2NyaXB0czogImJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjIgorICBzY3JpcHRzOiAiYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90byIKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0IGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3Y2U2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0CkBAIC0wLDAgKzEsMjM5IEBACisKKwNvdXQSlmEKKzhidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYxo4cHJlYnVpbHRzL2NsYW5nL2hvc3QvbGludXgteDg2L2NsYW5nLXI1MjI4MTcvYmluL2NsYW5nKysaBy1tdGh1bWIaAy1PcxoULWZvbWl0LWZyYW1lLXBvaW50ZXIaBi1tbGx2bRoZLWVuYWJsZS1zaHJpbmstd3JhcD1mYWxzZRoDLU8yGgUtV2FsbBoHLVdleHRyYRoLLVdpbml0LXNlbGYaDy1XcG9pbnRlci1hcml0aBoYLVd1bmd1YXJkZWQtYXZhaWxhYmlsaXR5GhEtV2Vycm9yPWRhdGUtdGltZRoWLVdlcnJvcj1pbnQtY29udmVyc2lvbhoTLVdlcnJvcj1wcmFnbWEtcGFjaxomLVdlcnJvcj1wcmFnbWEtcGFjay1zdXNwaWNpb3VzLWluY2x1ZGUaGC1XZXJyb3I9c2l6ZW9mLWFycmF5LWRpdhoXLVdlcnJvcj1zdHJpbmctcGx1cy1pbnQaJy1XZXJyb3I9dW5yZWFjaGFibGUtY29kZS1sb29wLWluY3JlbWVudBoiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucxoTLVduby1jOTktZGVzaWduYXRvchoZLVduby1nbnUtZm9sZGluZy1jb25zdGFudBoiLVduby1pbmNvbnNpc3RlbnQtbWlzc2luZy1vdmVycmlkZRocLVduby1lcnJvcj1yZW9yZGVyLWluaXQtbGlzdBoWLVduby1yZW9yZGVyLWluaXQtbGlzdBoRLVduby1zaWduLWNvbXBhcmUaCy1Xbm8tdW51c2VkGgktREFORFJPSUQaCC1ETkRFQlVHGgctVURFQlVHGigtRF9fY29tcGlsZXJfb2Zmc2V0b2Y9X19idWlsdGluX29mZnNldG9mGiotRF9fQU5EUk9JRF9VTkFWQUlMQUJMRV9TWU1CT0xTX0FSRV9XRUFLX18aCS1mYWRkcnNpZxoZLWZkZWJ1Zy1kZWZhdWx0LXZlcnNpb249NRoTLWZjb2xvci1kaWFnbm9zdGljcxoRLWZmcC1jb250cmFjdD1vZmYaDy1mbm8tZXhjZXB0aW9ucxoULWZuby1zdHJpY3QtYWxpYXNpbmcaEi1mbWVzc2FnZS1sZW5ndGg9MBojLWZuby1yZWxheGVkLXRlbXBsYXRlLXRlbXBsYXRlLWFyZ3MaFy1nc2ltcGxlLXRlbXBsYXRlLW5hbWVzGggtZ3o9enN0ZBoWLW5vLWNhbm9uaWNhbC1wcmVmaXhlcxoRLVduby1lcnJvcj1mb3JtYXQaIi1mZGVidWctcHJlZml4LW1hcD0vcHJvYy9zZWxmL2N3ZD0aHC1mdHJpdmlhbC1hdXRvLXZhci1pbml0PXplcm8aAi1nGhMtZmZ1bmN0aW9uLXNlY3Rpb25zGg8tZmRhdGEtc2VjdGlvbnMaEC1mbm8tc2hvcnQtZW51bXMaDy1mdW53aW5kLXRhYmxlcxoYLWZzdGFjay1wcm90ZWN0b3Itc3Ryb25nGhEtV2EsLS1ub2V4ZWNzdGFjaxoTLURfRk9SVElGWV9TT1VSQ0U9MhoTLVdzdHJpY3QtYWxpYXNpbmc9MhoTLVdlcnJvcj1yZXR1cm4tdHlwZRoYLVdlcnJvcj1ub24tdmlydHVhbC1kdG9yGg8tV2Vycm9yPWFkZHJlc3MaFi1XZXJyb3I9c2VxdWVuY2UtcG9pbnQaFy1XZXJyb3I9Zm9ybWF0LXNlY3VyaXR5Ggwtbm9zdGRsaWJpbmMaGi1mZGVidWctaW5mby1mb3ItcHJvZmlsaW5nGgwtbXNvZnQtZmxvYXQaDi1tYXJjaD1hcm12Ny1hGhItbWZsb2F0LWFiaT1zb2Z0ZnAaCistbWZwdT1uZW9uGi8tSWJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcBqzAS1Jb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8vYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwGoUBLUlvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90bxoULURfX0xJQkNfQVBJX189MTAwMDAaFC1EX19MSUJNX0FQSV9fPTEwMDAwGhUtRF9fTElCRExfQVBJX189MTAwMDAaFy1JZXh0ZXJuYWwvcHJvdG9idWYvc3JjGlktSXByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yNTIyODE3L2FuZHJvaWRfbGliYysrL3BsYXRmb3JtL2FybS9pbmNsdWRlL2MrKy92MRo9LUlwcmVidWlsdHMvY2xhbmcvaG9zdC9saW51eC14ODYvY2xhbmctcjUyMjgxNy9pbmNsdWRlL2MrKy92MRogLUliaW9uaWMvbGliYy9hc3luY19zYWZlL2luY2x1ZGUaHy1Jc3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGUaJy1JYmlvbmljL2xpYmMvc3lzdGVtX3Byb3BlcnRpZXMvaW5jbHVkZRo8LUlzeXN0ZW0vY29yZS9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9pbmNsdWRlGggtaXN5c3RlbRoTYmlvbmljL2xpYmMvaW5jbHVkZRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC91YXBpL2FzbS1hcm0aCC1pc3lzdGVtGhdiaW9uaWMvbGliYy9rZXJuZWwvdWFwaRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC9hbmRyb2lkL3Njc2kaCC1pc3lzdGVtGh9iaW9uaWMvbGliYy9rZXJuZWwvYW5kcm9pZC91YXBpGgctdGFyZ2V0Gh1hcm12N2EtbGludXgtYW5kcm9pZGVhYmkxMDAwMBoQLURBTkRST0lEX1NUUklDVBoFLWZQSUUaBy1XZXJyb3IaFS1Xbm8tdW51c2VkLXBhcmFtZXRlchoZLURHT09HTEVfUFJPVE9CVUZfTk9fUlRUSRoWLVdpbXBsaWNpdC1mYWxsdGhyb3VnaBoqLURfTElCQ1BQX0VOQUJMRV9USFJFQURfU0FGRVRZX0FOTk9UQVRJT05TGhUtV25vLWdudS1pbmNsdWRlLW5leHQaGy1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbhoGLW1sbHZtGhktZW5hYmxlLXNocmluay13cmFwPWZhbHNlGgwtc3RkPWdudSsrMjAaCS1mbm8tcnR0aRoVLUlzeXN0ZW0vY29yZS9pbmNsdWRlGh8tSXN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlGhwtSXN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlGh4tSWhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUaJS1JaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5L2luY2x1ZGUaFi1JaGFyZHdhcmUvcmlsL2luY2x1ZGUaGy1JZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZRoiLUlmcmFtZXdvcmtzL25hdGl2ZS9vcGVuZ2wvaW5jbHVkZRoXLUlmcmFtZXdvcmtzL2F2L2luY2x1ZGUaFi1XZXJyb3I9Ym9vbC1vcGVyYXRpb24aIC1XZXJyb3I9Zm9ybWF0LWluc3VmZmljaWVudC1hcmdzGiUtV2Vycm9yPWltcGxpY2l0LWludC1mbG9hdC1jb252ZXJzaW9uGhstV2Vycm9yPWludC1pbi1ib29sLWNvbnRleHQaGy1XZXJyb3I9aW50LXRvLXBvaW50ZXItY2FzdBobLVdlcnJvcj1wb2ludGVyLXRvLWludC1jYXN0GhctV2Vycm9yPXhvci11c2VkLWFzLXBvdxoeLVduby12b2lkLXBvaW50ZXItdG8tZW51bS1jYXN0Gh0tV25vLXZvaWQtcG9pbnRlci10by1pbnQtY2FzdBoYLVduby1wb2ludGVyLXRvLWludC1jYXN0GhYtV2Vycm9yPWZvcnRpZnktc291cmNlGhQtV25vLXVudXNlZC12YXJpYWJsZRofLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycxoTLVduby1wYWNrZWQtbm9uLXBvZBocLVdlcnJvcj1hZGRyZXNzLW9mLXRlbXBvcmFyeRorLVdlcnJvcj1pbmNvbXBhdGlibGUtZnVuY3Rpb24tcG9pbnRlci10eXBlcxoYLVdlcnJvcj1udWxsLWRlcmVmZXJlbmNlGhMtV2Vycm9yPXJldHVybi10eXBlGiItV25vLXRhdXRvbG9naWNhbC1jb25zdGFudC1jb21wYXJlGiQtV25vLXRhdXRvbG9naWNhbC10eXBlLWxpbWl0LWNvbXBhcmUaIi1Xbm8taW1wbGljaXQtaW50LWZsb2F0LWNvbnZlcnNpb24aIS1Xbm8tdGF1dG9sb2dpY2FsLW92ZXJsYXAtY29tcGFyZRoULVduby1kZXByZWNhdGVkLWNvcHkaGS1Xbm8tcmFuZ2UtbG9vcC1jb25zdHJ1Y3QaIi1Xbm8temVyby1hcy1udWxsLXBvaW50ZXItY29uc3RhbnQaKS1Xbm8tZGVwcmVjYXRlZC1hbm9uLWVudW0tZW51bS1jb252ZXJzaW9uGiQtV25vLWRlcHJlY2F0ZWQtZW51bS1lbnVtLWNvbnZlcnNpb24aFS1Xbm8tcGVzc2ltaXppbmctbW92ZRoeLVduby1ub24tYy10eXBlZGVmLWZvci1saW5rYWdlGhMtV25vLWFsaWduLW1pc21hdGNoGiItV25vLWVycm9yPXVudXNlZC1idXQtc2V0LXZhcmlhYmxlGiMtV25vLWVycm9yPXVudXNlZC1idXQtc2V0LXBhcmFtZXRlchoeLVduby1lcnJvcj1kZXByZWNhdGVkLWJ1aWx0aW5zGhUtV25vLWVycm9yPWRlcHJlY2F0ZWQaMi1Xbm8tZXJyb3I9c2luZ2xlLWJpdC1iaXRmaWVsZC1jb25zdGFudC1jb252ZXJzaW9uGiQtV25vLWVycm9yPWVudW0tY29uc3RleHByLWNvbnZlcnNpb24aGy1Xbm8tZXJyb3I9aW52YWxpZC1vZmZzZXRvZhomLVduby1kZXByZWNhdGVkLWR5bmFtaWMtZXhjZXB0aW9uLXNwZWMaOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjItU/Ciu2AXNvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8vYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wYi5oEpk+Ly8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90bworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2lmIFBST1RPQlVGX1ZFUlNJT04gPCAzMDIxMDAwCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZSB1cGRhdGUKKyNlcnJvciB5b3VyIGhlYWRlcnMuCisjZW5kaWYKKyNpZiAzMDIxMDEyIDwgUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UKKyNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuCisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjZGVmaW5lIFBST1RPQlVGX0lOVEVSTkFMX0VYUE9SVF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIEFueU1ldGFkYXRhOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCB1c2UgdGhlc2UgbWVtYmVycy4KK3N0cnVjdCBUYWJsZVN0cnVjdF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvIHsKKyAgc3RhdGljIGNvbnN0IDo6dWludDMyX3Qgb2Zmc2V0c1tdOworfTsKK25hbWVzcGFjZSBpZGVfcXVlcnkgeworbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzIHsKK2NsYXNzIFByb3RvTXNnOworc3RydWN0IFByb3RvTXNnRGVmYXVsdFR5cGVJbnRlcm5hbDsKK2V4dGVybiBQcm90b01zZ0RlZmF1bHRUeXBlSW50ZXJuYWwgX1Byb3RvTXNnX2RlZmF1bHRfaW5zdGFuY2VfOworfSAgLy8gbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzCit9ICAvLyBuYW1lc3BhY2UgaWRlX3F1ZXJ5CitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiA6OmlkZV9xdWVyeTo6cHJvYmVyX3NjcmlwdHM6OlByb3RvTXNnKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6aWRlX3F1ZXJ5Ojpwcm9iZXJfc2NyaXB0czo6UHJvdG9Nc2c+KEFyZW5hKik7CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK25hbWVzcGFjZSBpZGVfcXVlcnkgeworbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzIHsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBQcm90b01zZyBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjppZGVfcXVlcnkucHJvYmVyX3NjcmlwdHMuUHJvdG9Nc2cpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBQcm90b01zZygpIDogUHJvdG9Nc2cobnVsbHB0cikge30KKyAgflByb3RvTXNnKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBQcm90b01zZyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIFByb3RvTXNnKGNvbnN0IFByb3RvTXNnJiBmcm9tKTsKKyAgUHJvdG9Nc2coUHJvdG9Nc2cmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogUHJvdG9Nc2coKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBQcm90b01zZyYgb3BlcmF0b3I9KGNvbnN0IFByb3RvTXNnJiBmcm9tKSB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIFByb3RvTXNnJiBvcGVyYXRvcj0oUHJvdG9Nc2cmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IFByb3RvTXNnJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgUHJvdG9Nc2cqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvdG9Nc2cqPigKKyAgICAgICAgICAgICAgICZfUHJvdG9Nc2dfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAwOworCisgIGZyaWVuZCB2b2lkIHN3YXAoUHJvdG9Nc2cmIGEsIFByb3RvTXNnJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKFByb3RvTXNnKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChQcm90b01zZyogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUHJvdG9Nc2cqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxQcm90b01zZz4oYXJlbmEpOworICB9CisgIFByb3RvTXNnKiBOZXcoKSBjb25zdCB7CisgICAgcmV0dXJuIE5ldyhudWxscHRyKTsKKyAgfQorICB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUmIGZyb20pICBmaW5hbDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBQcm90b01zZyYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFByb3RvTXNnJiBmcm9tKTsKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIDo6dWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgOjp1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoUHJvdG9Nc2cqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJpZGVfcXVlcnkucHJvYmVyX3NjcmlwdHMuUHJvdG9Nc2ciOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgUHJvdG9Nc2coOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1NvbWVGaWVsZEZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgLy8gaW50NjQgc29tZV9maWVsZCA9IDE7CisgIHZvaWQgY2xlYXJfc29tZV9maWVsZCgpOworICA6OmludDY0X3Qgc29tZV9maWVsZCgpIGNvbnN0OworICB2b2lkIHNldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIDo6aW50NjRfdCBfaW50ZXJuYWxfc29tZV9maWVsZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfc29tZV9maWVsZCg6OmludDY0X3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZykKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjppbnQ2NF90IHNvbWVfZmllbGRfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfYnVpbGRfMmZtYWtlXzJmdG9vbHNfMmZpZGVfNWZxdWVyeV8yZnByb2Jlcl81ZnNjcmlwdHNfMmZjcHBfMmZmb29fMmVwcm90bzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyBQcm90b01zZworCisvLyBpbnQ2NCBzb21lX2ZpZWxkID0gMTsKK2lubGluZSB2b2lkIFByb3RvTXNnOjpjbGVhcl9zb21lX2ZpZWxkKCkgeworICBfaW1wbF8uc29tZV9maWVsZF8gPSA6OmludDY0X3R7MH07Cit9CitpbmxpbmUgOjppbnQ2NF90IFByb3RvTXNnOjpfaW50ZXJuYWxfc29tZV9maWVsZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5zb21lX2ZpZWxkXzsKK30KK2lubGluZSA6OmludDY0X3QgUHJvdG9Nc2c6OnNvbWVfZmllbGQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6aWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzLlByb3RvTXNnLnNvbWVfZmllbGQpCisgIHJldHVybiBfaW50ZXJuYWxfc29tZV9maWVsZCgpOworfQoraW5saW5lIHZvaWQgUHJvdG9Nc2c6Ol9pbnRlcm5hbF9zZXRfc29tZV9maWVsZCg6OmludDY0X3QgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5zb21lX2ZpZWxkXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgUHJvdG9Nc2c6OnNldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3NvbWVfZmllbGQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZy5zb21lX2ZpZWxkKQorfQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZiAgLy8gX19HTlVDX18KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKKworfSAgLy8gbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzCit9ICAvLyBuYW1lc3BhY2UgaWRlX3F1ZXJ5CisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9HT09HTEVfUFJPVE9CVUZfSU5DTFVERURfYnVpbGRfMmZtYWtlXzJmdG9vbHNfMmZpZGVfNWZxdWVyeV8yZnByb2Jlcl81ZnNjcmlwdHNfMmZjcHBfMmZmb29fMmVwcm90bwpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL3JlZ2VuLnNoIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL3JlZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlZGZlNTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL2Jhc2ggLWUKKworIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBpZGVfcXVlcnkub3V0IGZpbGUuCisjCisjIFRoZSBpZGVfcXVlcnkub3V0IGZpbGUgaXMgYSBwcmUtY29tcHV0ZWQgcmVzdWx0IG9mIHJ1bm5pbmcgaWRlX3F1ZXJ5LnNoCisjIG9uIGEgc2V0IG9mIGZpbGVzLiBUaGlzIGFsbG93cyB0aGUgcHJvYmVyIHRvIHJ1biBpdHMgdGVzdHMgd2l0aG91dCBydW5uaW5nCisjIGlkZV9xdWVyeS5zaC4gVGhlIHByb2JlciBkb2Vzbid0IGNoZWNrLW91dCB0aGUgZnVsbCBzb3VyY2UgY29kZSwgc28gaXQKKyMgY2FuJ3QgcnVuIGlkZV9xdWVyeS5zaCBpdHNlbGYuCisKK2NkICQoZGlybmFtZSAkQkFTSF9TT1VSQ0UpCitzb3VyY2UgJChwd2QpLy4uLy4uLy4uL3NoZWxsX3V0aWxzLnNoCityZXF1aXJlX3RvcAorCitmaWxlc190b19idWlsZD0oCisgIGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjCispCisKK2NkICR7VE9QfQorYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoIC0tbHVuY2hfdGFyZ2V0PWFvc3BfYXJtLXRydW5rX3N0YWdpbmctZW5nICR7ZmlsZXNfdG9fYnVpbGRbQF19ID4gYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvaWRlX3F1ZXJ5Lm91dAo=