ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNWM0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworLy8gUGFja2FnZSB0aGUgbWluaW1hbCBmaWxlcyByZXF1aXJlZCB0byBydW4gZW52c2V0dXAuc2ggaW4gdGhlIHRlc3QKKy8vIGVudmlyb25tZW50LgorZ2VucnVsZSB7CisgICAgbmFtZTogImVudnNldHVwX21pbmltdW0uemlwIiwKKyAgICB2aXNpYmlsaXR5OiBbCisgICAgICAgICIvL2J1aWxkL21ha2UvdGVzdHM6X19zdWJwYWNrYWdlc19fIiwKKyAgICBdLAorICAgIHRvb2xzOiBbCisgICAgICAgICJzb29uZ196aXAiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAiZW52c2V0dXAuc2giLAorICAgICAgICAic2hlbGxfdXRpbHMuc2giLAorICAgICAgICAiY29yZS9lbnZzZXR1cC5tayIsCisgICAgXSwKKyAgICBvdXQ6IFsiZW52c2V0dXAuemlwIl0sCisgICAgY21kOiAiJChsb2NhdGlvbiBzb29uZ196aXApIC1vICQob3V0KSAtRCBidWlsZC9tYWtlIiwKK30KZGlmZiAtLWdpdCBhL0NoYW5nZXMubWQgYi9DaGFuZ2VzLm1kCmluZGV4IGRhZWJkNTIuLmZjMTVlNjAgMTAwNjQ0Ci0tLSBhL0NoYW5nZXMubWQKKysrIGIvQ2hhbmdlcy5tZApAQCAtMSw0ICsxLDQyIEBACi0jIEJ1aWxkIFN5c3RlbSBDaGFuZ2VzIGZvciBBbmRyb2lkLm1rIFdyaXRlcnMKKyMgQnVpbGQgU3lzdGVtIENoYW5nZXMgZm9yIEFuZHJvaWQubWsvQW5kcm9pZC5icCBXcml0ZXJzCisKKyMjIFNvb25nIGdlbnJ1bGVzIGFyZSBub3cgc2FuZGJveGVkCisKK1ByZXZpb3VzbHksIHNvb25nIGdlbnJ1bGVzIGNvdWxkIGFjY2VzcyBhbnkgZmlsZXMgaW4gdGhlIHNvdXJjZSB0cmVlLCB3aXRob3V0IHNwZWNpZnlpbmcgdGhlbSBhcworaW5wdXRzLiBUaGlzIG1ha2VzIHRoZW0gaW5jb3JyZWN0IGluIGluY3JlbWVudGFsIGJ1aWxkcywgYW5kIGluY29tcGF0aWJsZSB3aXRoIFJCRSBhbmQgQmF6ZWwuCisKK05vdywgZ2VucnVsZXMgYXJlIHNhbmRib3hlZCBzbyB0aGV5IGNhbiBvbmx5IGFjY2VzcyB0aGVpciBsaXN0ZWQgc3Jjcy4gTW9kdWxlcyBkZW55bGlzdGVkIGluCitnZW5ydWxlL2FsbG93bGlzdHMuZ28gYXJlIGV4ZW1wdCBmcm9tIHRoaXMuIFlvdSBjYW4gYWxzbyBzZXQgYEJVSUxEX0JST0tFTl9HRU5SVUxFX1NBTkRCT1hJTkdgCitpbiBib2FyZCBjb25maWcgdG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLgorCisjIyBQYXJ0aXRpb25zIGFyZSBubyBsb25nZXIgYWZmZWN0ZWQgYnkgcHJldmlvdXMgYnVpbGRzCisKK1BhcnRpdGlvbiBidWlsZHMgdXNlZCB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcgaW4gdGhlaXIgc3RhZ2luZyBkaXJlY3RvcmllcywgYW5kIGJ1aWxkaW5nIGFuCitpbmRpdmlkdWFsIG1vZHVsZSB3aWxsIGluc3RhbGwgaXQgdG8gdGhlIHN0YWdpbmcgZGlyZWN0b3J5LiBUaHVzLCBwcmV2aW91c2x5LCBgbSBteW1vZHVsZWAgZm9sbG93ZWQKK2J5IGBtYCB3b3VsZCBjYXVzZSBgbXltb2R1bGVgIHRvIGJlIHByZXNpbnN0YWxsZWQgb24gdGhlIGRldmljZSwgZXZlbiBpZiBpdCB3YXNuJ3QgbGlzdGVkIGluCitgUFJPRFVDVF9QQUNLQUdFU2AuCisKK1RoaXMgYmVoYXZpb3IgaGFzIGJlZW4gY2hhbmdlZCwgYW5kIG5vdyB0aGUgcGFydGl0aW9uIGltYWdlcyBvbmx5IGluY2x1ZGUgd2hhdCB0aGV5J2QgaGF2ZSBpZiB5b3UKK2RpZCBhIGNsZWFuIGJ1aWxkLiBUaGlzIGJlaGF2aW9yIGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZQorYEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFU2AgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYm9hcmQgY29uZmlnIHZhcmlhYmxlLgorCitNYW51YWxseSBhZGRpbmcgbWFrZSBydWxlcyB0aGF0IGJ1aWxkIHRvIHRoZSBzdGFnaW5nIGRpcmVjdG9yaWVzIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgbWFrZQorbW9kdWxlIHN5c3RlbSB3aWxsIG5vdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBjaGFuZ2UuIFRoaXMgaW5jbHVkZXMgbWFueSB1c2FnZXMgb2YKK2BMT0NBTF9QT1NUX0lOU1RBTExfQ01EYC4KKworIyMgUGVyZm9ybSB2YWxpZGF0aW9uIG9mIFNvb25nIHBsdWdpbnMKKworRWFjaCBTb29uZyBwbHVnaW4gd2lsbCByZXF1aXJlIG1hbnVhbCB3b3JrIHRvIG1pZ3JhdGUgdG8gQmF6ZWwuIEluIG9yZGVyIHRvCittaW5pbWl6ZSB0aGUgbWFudWFsIHdvcmsgb3V0c2lkZSBvZiBidWlsZC9zb29uZywgd2UgYXJlIHJlc3RyaWN0aW5nIHBsdWdpbnMgdG8KK3Rob3NlIHRoYXQgZXhpc3QgdG9kYXkgYW5kIHRob3NlIGluIHZlbmRvciBvciBoYXJkd2FyZSBkaXJlY3Rvcmllcy4KKworSWYgeW91IG5lZWQgdG8gZXh0ZW5kIHRoZSBidWlsZCBzeXN0ZW0gdmlhIGEgcGx1Z2luLCBwbGVhc2UgcmVhY2ggb3V0IHRvIHRoZQorYnVpbGQgdGVhbSB2aWEgZW1haWwgYW5kcm9pZC1idWlsZGluZ0Bnb29nbGVncm91cHMuY29tIChleHRlcm5hbCkgZm9yIGFueQorcXVlc3Rpb25zLCBvciBzZWUgW2dvL3Nvb25nXShodHRwOi8vZ28vc29vbmcpIChpbnRlcm5hbCkuCisKK1RvIG9taXQgdGhlIHZhbGlkYXRpb24sIGBCVUlMRF9CUk9LRU5fUExVR0lOX1ZBTElEQVRJT05gIGV4cGVjdHMgYQorc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGx1Z2lucyB0byBvbWl0IGZyb20gdGhlIHZhbGlkYXRpb24uIFRoaXMgbXVzdCBiZSBzZXQKK3dpdGhpbiBhIHByb2R1Y3QgY29uZmlndXJhdGlvbiAubWsgZmlsZSwgYm9hcmQgY29uZmlnIC5tayBmaWxlLCBvciBidWlsZHNwZWMubWsuCiAKICMjIFB5dGhvbiAyIHRvIDMgbWlncmF0aW9uCiAKQEAgLTQ5Myw2ICs1MzEsMjQgQEAKIAogd2lsbCBjb3B5IGBiYXIvYmF6YCBpbnRvIGAkRElTVF9ESVIvYmF6YCB3aGVuIGBtIGZvbyBkaXN0YCBpcyBydW4uCiAKKyMjIyMgRklMRV9OQU1FX1RBRyAgeyNGSUxFX05BTUVfVEFHfQorCitUbyBlbWJlZCB0aGUgYEJVSUxEX05VTUJFUmAgKG9yIGZvciBsb2NhbCBidWlsZHMsIGBlbmcuJHtVU0VSfWApLCBpbmNsdWRlCitgRklMRV9OQU1FX1RBR19QTEFDRUhPTERFUmAgaW4gdGhlIGRlc3RpbmF0aW9uOgorCitgYGAgbWFrZQorIyB5b3UgY2FuIHVzZSBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnIGZ1bmN0aW9uCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMtd2l0aC1maWxlbmFtZXRhZyxmb28sYmFyLnppcCkKKyMgb3IgdXNlIEZJTEVfTkFNRV9UQUdfUExBQ0VIT0xERVIgbWFudWFsbHkKKyQoY2FsbCBkaXN0LWZvci1nb2Fscyxmb28sYmFyLnppcDpiYXotRklMRV9OQU1FX1RBR19QTEFDRUhPTERFUi56aXApCitgYGAKKworV2hpY2ggd2lsbCBwcm9kdWNlIGAkRElTVF9ESVIvYmF6LTEyMzQ1NjcuemlwYCBvbiBidWlsZCBzZXJ2ZXJzIHdoaWNoIHNldAorYEJVSUxEX05VTUJFUj0xMjM0NTY3YCwgb3IgYCRESVNUX0RJUi9iYXotZW5nLmJ1aWxkZXIuemlwYCBmb3IgbG9jYWwgYnVpbGRzLgorCitJZiB5b3UganVzdCB3YW50IHRvIGFwcGVuZCBgQlVJTERfTlVNQkVSYCBhdCB0aGUgZW5kIG9mIGJhc2VuYW1lLCB1c2UKK2BkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnYCBpbnN0ZWFkIG9mIGBkaXN0LWZvci1nb2Fsc2AuCisKICMjIyMgUmVuYW1lcyBkdXJpbmcgY29weQogCiBJbnN0ZWFkIG9mIHNwZWNpZnlpbmcganVzdCBhIGZpbGUsIGEgZGVzdGluYXRpb24gbmFtZSBjYW4gYmUgc3BlY2lmaWVkLApkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IDk1N2RhOTIuLjhjMzA4ODMgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTc3Myw2ICs3NzMsMjcgQEAKICMgRG9uJ3QgdXNlIFNPT05HX0hPU1RfT1VULCBpdCBpcyBub3cgYW4gYWxpYXMgZm9yIEhPU1RfT1VULgogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS9zb29uZy9ob3N0KQogCisjIENsZWFyIG91dCB0b29scy9tZXRhbGF2YSBCYXplbCBvdXRwdXQgZGlyCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL2JhemVsL291dHB1dC9leGVjcm9vdC9fX21haW5fXy9iYXplbC1vdXQvbWl4ZWRfYnVpbGRzX3Byb2R1Y3QtKi9iaW4vdG9vbHMvbWV0YWxhdmEpCisKKyMgQ2xlYXIgb3V0IHJ1c3RjIGNvbXBpbGVyIGludGVybWVkaWF0ZXMgYWZ0ZXIgcmV2ZXJ0aW5nIHJ1c3QgY29tcGlsZXIvbGlua2VyIHNwbGl0LgorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLW5hbWUgIioucnNwLndob2xlLmEiIC1wcmludDAgfCB4YXJncyAtMCAvYmluL2Jhc2ggLWMgJ3JtIC1mICQkJCR7QH07IHJtIC1mICQkJCR7QC8ucnNwLndob2xlLmEvLnJzcC5hfTsgcm0gLWYgJCQkJHtALy5yc3Aud2hvbGUuYS8ucnNwfScpCisKKyMgUmVtb3ZlIG9ic29sZXRlIGphdmEgY29tcGlsYXRpb24gYXJ0aWZhY3RzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTLykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC10eXBlIGYgLW5hbWUgIiouamFyIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCisKKyMgUmVtb3ZlIG9ic29sZXRlIGphdmEgY29tcGlsYXRpb24gYXJ0aWZhY3RzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTLykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC10eXBlIGYgLW5hbWUgIiouamFyIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCisKKyMgUmVtb3ZlIG9ic29sZXRlIGRleHByZW9wdF9jb25maWcgYXJ0aWZhY3RzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1mICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcvZGV4cHJlb3B0LmNvbmZpZykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLWYgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZy9kZXhwcmVvcHRfc29vbmcuY29uZmlnKQorCisjIENsZWFyIG91dCBTb29uZyAuaW50ZXJtZWRpYXRlcyBkaXJlY3RvcnkgcmVnYXJkaW5nIHJlbW92YWwgb2YgaGFzaGVkIHN1YmRpcgorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS9zb29uZy8uaW50ZXJtZWRpYXRlcykKKwogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvTUVUQURBVEEgYi9NRVRBREFUQQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3ODFhNy4uMDAwMDAwMAotLS0gYS9NRVRBREFUQQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotdGhpcmRfcGFydHkgewotICBsaWNlbnNlX25vdGU6ICJ3b3VsZCBiZSBOT1RJQ0Ugc2F2ZSBmb3IgR1BMIGluOlxuIgotICAiICAgY29yZS9MSU5VWF9LRVJORUxfQ09QWUlOR1xuIgotICAiICAgdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXBkay9hc3NldHMvanF1ZXJ5LTEuNi4yLm1pbi5qc1xuIgotICAiICAgdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXBkay9hc3NldHMvanF1ZXJ5LWhpc3RvcnkuanNcbiIKLSAgIiAgIHRvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1wZGsvYXNzZXRzL2pxdWVyeS1yZXNpemFibGUubWluLmpzIgotICBsaWNlbnNlX3R5cGU6IFJFU1RSSUNURUQKLX0KZGlmZiAtLWdpdCBhL09XTkVSUyBiL09XTkVSUwppbmRleCA5N2ZkYTQwLi5iZDA0OWU5IDEwMDY0NAotLS0gYS9PV05FUlMKKysrIGIvT1dORVJTCkBAIC0yLDYgKzIsNiBAQAogCiAjIFNpbmNlIHRoaXMgZmlsZSBhZmZlY3RzIGFsbCBBbmRyb2lkIGRldmVsb3BlcnMsIGxvY2sgaXQgZG93bi4gVGhlcmUgaXMgc3RpbGwKICMgcm91bmQgdGhlIHdvcmxkIHRpbXplb25lIGNvdmVyYWdlLgotcGVyLWZpbGUgZW52c2V0dXAuc2ggPSBqb2VvQGdvb2dsZS5jb20sIGppbmd3ZW5AZ29vZ2xlLmNvbSwgbGJlcmtpQGdvb2dsZS5jb20KLXBlci1maWxlIHNoZWxsX3V0aWxzLnNoID0gam9lb0Bnb29nbGUuY29tLCBqaW5nd2VuQGdvb2dsZS5jb20sIGxiZXJraUBnb29nbGUuY29tCitwZXItZmlsZSBlbnZzZXR1cC5zaCA9IGpvZW9AZ29vZ2xlLmNvbSwgamluZ3dlbkBnb29nbGUuY29tCitwZXItZmlsZSBzaGVsbF91dGlscy5zaCA9IGpvZW9AZ29vZ2xlLmNvbSwgamluZ3dlbkBnb29nbGUuY29tCiAKZGlmZiAtLWdpdCBhL1BSRVVQTE9BRC5jZmcgYi9QUkVVUExPQUQuY2ZnCmluZGV4IGNlNzUxNTAuLjk3ZWNkMzMgMTAwNjQ0Ci0tLSBhL1BSRVVQTE9BRC5jZmcKKysrIGIvUFJFVVBMT0FELmNmZwpAQCAtMSwyICsxLDUgQEAKIFtIb29rIFNjcmlwdHNdCiBkb19ub3RfdXNlX0RPX05PVF9NRVJHRSA9ICR7UkVQT19ST09UfS9idWlsZC9zb29uZy9zY3JpcHRzL2NoZWNrX2RvX25vdF9tZXJnZS5zaCAke1BSRVVQTE9BRF9DT01NSVR9CisKK1tCdWlsdGluIEhvb2tzXQora3RmbXQgPSB0cnVlCmRpZmYgLS1naXQgYS9jaS9BbmRyb2lkLmJwIGIvY2kvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDRmNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2kvQW5kcm9pZC5icApAQCAtMCwwICsxLDg3IEBACisvLyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCisgICAgZGVmYXVsdF90ZWFtOiAidHJlbmR5X3RlYW1fYWR0ZSIsCit9CisKK3B5dGhvbl90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJidWlsZF90ZXN0X3N1aXRlc190ZXN0IiwKKyAgICBtYWluOiAiYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weSIsCisgICAgcGtnX3BhdGg6ICJ0ZXN0ZGF0YSIsCisgICAgc3JjczogWworICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJidWlsZF90ZXN0X3N1aXRlcyIsCisgICAgICAgICJweWZha2VmcyIsCisgICAgICAgICJjaV90ZXN0X2xpYiIsCisgICAgXSwKKyAgICB0ZXN0X29wdGlvbnM6IHsKKyAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAorICAgIH0sCisgICAgZGF0YTogWworICAgICAgICAiOnB5My1jbWQiLAorICAgIF0sCisgICAgdmVyc2lvbjogeworICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CisKKy8vIFRoaXMgdGVzdCBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHJ1biBsb2NhbGx5IHNpbmNlIGl0J3Mgc2xvdywgbm90IGhlcm1ldGljLAorLy8gYW5kIHJlcXVpcmVzIGEgbG90IG9mIHN5c3RlbSBzdGF0ZS4gSXQgaXMgdGhlcmVmb3JlIG5vdCBtYXJrZWQgYXMgYHVuaXRfdGVzdGAKKy8vIGFuZCBpcyBub3QgcGFydCBvZiBhbnkgdGVzdCBzdWl0ZS4gTm90ZSB0aGF0IHdlIGFsc28gZG9uJ3Qgd2FudCB0byBydW4gdGhpcworLy8gdGVzdCB3aXRoIEJhemVsIHNpbmNlIHRoYXQgd291bGQgcmVxdWlyZSBkaXNhYmxpbmcgc2FuZGJveGluZyBhbmQgZXhwbGljaXRseQorLy8gcGFzc2luZyBpbiBhbGwgdGhlIGVudiB2YXJzIHdlIGRlcGVuZCBvbiB2aWEgdGhlIGNvbW1hbmQtbGluZS4gVGhlIHRlc3QKKy8vIHRhcmdldCBjb3VsZCBiZSBjb25maWd1cmVkIHRvIGRvIHNvIGJ1dCBpdCdzIG5vdCB3b3J0aCBkb2luZyBzZWVpbmcgdGhhdAorLy8gd2UncmUgbW92aW5nIGF3YXkgZnJvbSBCYXplbC4KK3B5dGhvbl90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJidWlsZF90ZXN0X3N1aXRlc19sb2NhbF90ZXN0IiwKKyAgICBtYWluOiAiYnVpbGRfdGVzdF9zdWl0ZXNfbG9jYWxfdGVzdC5weSIsCisgICAgc3JjczogWworICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXNfbG9jYWxfdGVzdC5weSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJidWlsZF90ZXN0X3N1aXRlcyIsCisgICAgICAgICJweWZha2VmcyIsCisgICAgICAgICJjaV90ZXN0X2xpYiIsCisgICAgXSwKKyAgICB0ZXN0X2NvbmZpZ190ZW1wbGF0ZTogIkFuZHJvaWRUZXN0LnhtbC50ZW1wbGF0ZSIsCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogZmFsc2UsCisgICAgfSwKKyAgICB2ZXJzaW9uOiB7CisgICAgICAgIHB5MzogeworICAgICAgICAgICAgZW1iZWRkZWRfbGF1bmNoZXI6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KKworcHl0aG9uX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImJ1aWxkX3Rlc3Rfc3VpdGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJidWlsZF90ZXN0X3N1aXRlcy5weSIsCisgICAgICAgICJvcHRpbWl6ZWRfdGFyZ2V0cy5weSIsCisgICAgXSwKK30KKworcHl0aG9uX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImNpX3Rlc3RfbGliIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJjaV90ZXN0X2xpYi5weSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NpL0FuZHJvaWRUZXN0LnhtbC50ZW1wbGF0ZSBiL2NpL0FuZHJvaWRUZXN0LnhtbC50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWEzNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2kvQW5kcm9pZFRlc3QueG1sLnRlbXBsYXRlCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnB5dGhvbi5QeXRob25CaW5hcnlIb3N0VGVzdCI+CisgICAgPG9wdGlvbiBuYW1lPSJwYXItZmlsZS1uYW1lIiB2YWx1ZT0ie01PRFVMRX0iLz4KKyAgICA8b3B0aW9uIG5hbWU9InVzZS10ZXN0LW91dHB1dC1maWxlIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3QtdGltZW91dCIgdmFsdWU9IjVtIi8+CisgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODYubWsgYi9jaS9idWlsZF90ZXN0X3N1aXRlcwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSB0YXJnZXQvcHJvZHVjdC9zZGtfeDg2Lm1rCmNvcHkgdG8gY2kvYnVpbGRfdGVzdF9zdWl0ZXMKaW5kZXggMTNlZTU3ZC4uNWFhZjJmNAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2Lm1rCisrKyBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzCkBAIC0xLDIxICsxLDIwIEBACisjIXByZWJ1aWx0cy9idWlsZC10b29scy9saW51eC14ODYvYmluL3B5My1jbWQgLUIKICMKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKIAotIyBEb24ndCBtb2RpZnkgdGhpcyBmaWxlIC0gSXQncyBqdXN0IGFuIGFsaWFzIQoraW1wb3J0IGJ1aWxkX3Rlc3Rfc3VpdGVzCitpbXBvcnQgc3lzCiAKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX3Bob25lX3g4Ni5taykKLQotUFJPRFVDVF9OQU1FIDo9IHNka194ODYKK2J1aWxkX3Rlc3Rfc3VpdGVzLm1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvY2kvYnVpbGRfdGVzdF9zdWl0ZXMucHkgYi9jaS9idWlsZF90ZXN0X3N1aXRlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFmODhjCi0tLSAvZGV2L251bGwKKysrIGIvY2kvYnVpbGRfdGVzdF9zdWl0ZXMucHkKQEAgLTAsMCArMSwxODQgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiQnVpbGQgc2NyaXB0IGZvciB0aGUgQ0kgYHRlc3Rfc3VpdGVzYCB0YXJnZXQuIiIiCisKK2ltcG9ydCBhcmdwYXJzZQorZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCitpbXBvcnQganNvbgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitmcm9tIHR5cGluZyBpbXBvcnQgQ2FsbGFibGUKK2ltcG9ydCBvcHRpbWl6ZWRfdGFyZ2V0cworCisKK1JFUVVJUkVEX0VOVl9WQVJTID0gZnJvemVuc2V0KFsnVEFSR0VUX1BST0RVQ1QnLCAnVEFSR0VUX1JFTEVBU0UnLCAnVE9QJ10pCitTT09OR19VSV9FWEVfUkVMX1BBVEggPSAnYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCcKKworCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlKToKKyAgICBzdXBlcigpLl9faW5pdF9fKG1lc3NhZ2UpCisKKworY2xhc3MgQnVpbGRGYWlsdXJlRXJyb3IoRXJyb3IpOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCByZXR1cm5fY29kZSk6CisgICAgc3VwZXIoKS5fX2luaXRfXyhmJ0J1aWxkIGNvbW1hbmQgZmFpbGVkIHdpdGggcmV0dXJuIGNvZGU6IGZ7cmV0dXJuX2NvZGV9JykKKyAgICBzZWxmLnJldHVybl9jb2RlID0gcmV0dXJuX2NvZGUKKworCitjbGFzcyBCdWlsZFBsYW5uZXI6CisgICIiIkNsYXNzIGluIGNoYXJnZSBvZiBkZXRlcm1pbmluZyBob3cgdG8gb3B0aW1pemUgYnVpbGQgdGFyZ2V0cy4KKworICBHaXZlbiB0aGUgYnVpbGQgY29udGV4dCBhbmQgdGFyZ2V0cyB0byBidWlsZCBpdCB3aWxsIGRldGVybWluZSBhIGZpbmFsIGxpc3Qgb2YKKyAgdGFyZ2V0cyB0byBidWlsZCBhbG9uZyB3aXRoIGdldHRpbmcgYSBzZXQgb2YgcGFja2FnaW5nIGZ1bmN0aW9ucyB0byBwYWNrYWdlIHVwCisgIGFueSBvdXRwdXQgemlwIGZpbGVzIG5lZWRlZCBieSB0aGUgYnVpbGQuCisgICIiIgorCisgIGRlZiBfX2luaXRfXygKKyAgICAgIHNlbGYsCisgICAgICBidWlsZF9jb250ZXh0OiBkaWN0W3N0ciwgYW55XSwKKyAgICAgIGFyZ3M6IGFyZ3BhcnNlLk5hbWVzcGFjZSwKKyAgICAgIHRhcmdldF9vcHRpbWl6YXRpb25zOiBkaWN0W3N0ciwgb3B0aW1pemVkX3RhcmdldHMuT3B0aW1pemVkQnVpbGRUYXJnZXRdLAorICApOgorICAgIHNlbGYuYnVpbGRfY29udGV4dCA9IGJ1aWxkX2NvbnRleHQKKyAgICBzZWxmLmFyZ3MgPSBhcmdzCisgICAgc2VsZi50YXJnZXRfb3B0aW1pemF0aW9ucyA9IHRhcmdldF9vcHRpbWl6YXRpb25zCisKKyAgZGVmIGNyZWF0ZV9idWlsZF9wbGFuKHNlbGYpOgorCisgICAgaWYgJ29wdGltaXplZF9idWlsZCcgbm90IGluIHNlbGYuYnVpbGRfY29udGV4dFsnZW5hYmxlZF9idWlsZF9mZWF0dXJlcyddOgorICAgICAgcmV0dXJuIEJ1aWxkUGxhbihzZXQoc2VsZi5hcmdzLmV4dHJhX3RhcmdldHMpLCBzZXQoKSkKKworICAgIGJ1aWxkX3RhcmdldHMgPSBzZXQoKQorICAgIHBhY2thZ2luZ19mdW5jdGlvbnMgPSBzZXQoKQorICAgIGZvciB0YXJnZXQgaW4gc2VsZi5hcmdzLmV4dHJhX3RhcmdldHM6CisgICAgICB0YXJnZXRfb3B0aW1pemVyX2dldHRlciA9IHNlbGYudGFyZ2V0X29wdGltaXphdGlvbnMuZ2V0KHRhcmdldCwgTm9uZSkKKyAgICAgIGlmIG5vdCB0YXJnZXRfb3B0aW1pemVyX2dldHRlcjoKKyAgICAgICAgYnVpbGRfdGFyZ2V0cy5hZGQodGFyZ2V0KQorICAgICAgICBjb250aW51ZQorCisgICAgICB0YXJnZXRfb3B0aW1pemVyID0gdGFyZ2V0X29wdGltaXplcl9nZXR0ZXIoCisgICAgICAgICAgdGFyZ2V0LCBzZWxmLmJ1aWxkX2NvbnRleHQsIHNlbGYuYXJncworICAgICAgKQorICAgICAgYnVpbGRfdGFyZ2V0cy51cGRhdGUodGFyZ2V0X29wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpKQorICAgICAgcGFja2FnaW5nX2Z1bmN0aW9ucy5hZGQodGFyZ2V0X29wdGltaXplci5wYWNrYWdlX291dHB1dHMpCisKKyAgICByZXR1cm4gQnVpbGRQbGFuKGJ1aWxkX3RhcmdldHMsIHBhY2thZ2luZ19mdW5jdGlvbnMpCisKKworQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIEJ1aWxkUGxhbjoKKyAgYnVpbGRfdGFyZ2V0czogc2V0W3N0cl0KKyAgcGFja2FnaW5nX2Z1bmN0aW9uczogc2V0W0NhbGxhYmxlWy4uLiwgTm9uZV1dCisKKworZGVmIGJ1aWxkX3Rlc3Rfc3VpdGVzKGFyZ3Y6IGxpc3Rbc3RyXSkgLT4gaW50OgorICAiIiJCdWlsZHMgYWxsIHRlc3Qgc3VpdGVzIHBhc3NlZCBpbiwgb3B0aW1pemluZyBiYXNlZCBvbiB0aGUgYnVpbGRfY29udGV4dCBjb250ZW50LgorCisgIEFyZ3M6CisgICAgYXJndjogVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgcGFzc2VkIGluLgorCisgIFJldHVybnM6CisgICAgVGhlIGV4aXQgY29kZSBvZiB0aGUgYnVpbGQuCisgICIiIgorICBhcmdzID0gcGFyc2VfYXJncyhhcmd2KQorICBjaGVja19yZXF1aXJlZF9lbnYoKQorICBidWlsZF9jb250ZXh0ID0gbG9hZF9idWlsZF9jb250ZXh0KCkKKyAgYnVpbGRfcGxhbm5lciA9IEJ1aWxkUGxhbm5lcigKKyAgICAgIGJ1aWxkX2NvbnRleHQsIGFyZ3MsIG9wdGltaXplZF90YXJnZXRzLk9QVElNSVpFRF9CVUlMRF9UQVJHRVRTCisgICkKKyAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorCisgIHRyeToKKyAgICBleGVjdXRlX2J1aWxkX3BsYW4oYnVpbGRfcGxhbikKKyAgZXhjZXB0IEJ1aWxkRmFpbHVyZUVycm9yIGFzIGU6CisgICAgbG9nZ2luZy5lcnJvcignQnVpbGQgY29tbWFuZCBmYWlsZWQhIENoZWNrIGJ1aWxkX2xvZyBmb3IgZGV0YWlscy4nKQorICAgIHJldHVybiBlLnJldHVybl9jb2RlCisKKyAgcmV0dXJuIDAKKworCitkZWYgcGFyc2VfYXJncyhhcmd2OiBsaXN0W3N0cl0pIC0+IGFyZ3BhcnNlLk5hbWVzcGFjZToKKyAgYXJncGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorCisgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnZXh0cmFfdGFyZ2V0cycsIG5hcmdzPScqJywgaGVscD0nRXh0cmEgdGVzdCBzdWl0ZXMgdG8gYnVpbGQuJworICApCisKKyAgcmV0dXJuIGFyZ3BhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCisKKworZGVmIGNoZWNrX3JlcXVpcmVkX2VudigpOgorICAiIiJDaGVjayBmb3IgcmVxdWlyZWQgZW52IHZhcnMuCisKKyAgUmFpc2VzOgorICAgIFJ1bnRpbWVFcnJvcjogSWYgYW55IHJlcXVpcmVkIGVudiB2YXJzIGFyZSBub3QgZm91bmQuCisgICIiIgorICBtaXNzaW5nX2Vudl92YXJzID0gc29ydGVkKHYgZm9yIHYgaW4gUkVRVUlSRURfRU5WX1ZBUlMgaWYgdiBub3QgaW4gb3MuZW52aXJvbikKKworICBpZiBub3QgbWlzc2luZ19lbnZfdmFyczoKKyAgICByZXR1cm4KKworICB0ID0gJywnLmpvaW4obWlzc2luZ19lbnZfdmFycykKKyAgcmFpc2UgRXJyb3IoZidNaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlczoge3R9JykKKworCitkZWYgbG9hZF9idWlsZF9jb250ZXh0KCk6CisgIGJ1aWxkX2NvbnRleHRfcGF0aCA9IHBhdGhsaWIuUGF0aChvcy5lbnZpcm9uLmdldCgnQlVJTERfQ09OVEVYVCcsICcnKSkKKyAgaWYgYnVpbGRfY29udGV4dF9wYXRoLmlzX2ZpbGUoKToKKyAgICB0cnk6CisgICAgICB3aXRoIG9wZW4oYnVpbGRfY29udGV4dF9wYXRoLCAncicpIGFzIGY6CisgICAgICAgIHJldHVybiBqc29uLmxvYWQoZikKKyAgICBleGNlcHQganNvbi5kZWNvZGVyLkpTT05EZWNvZGVFcnJvciBhcyBlOgorICAgICAgcmFpc2UgRXJyb3IoZidGYWlsZWQgdG8gbG9hZCBKU09OIGZpbGU6IHtidWlsZF9jb250ZXh0X3BhdGh9JykKKworICBsb2dnaW5nLmluZm8oJ05vIEJVSUxEX0NPTlRFWFQgZm91bmQsIHNraXBwaW5nIG9wdGltaXphdGlvbnMuJykKKyAgcmV0dXJuIGVtcHR5X2J1aWxkX2NvbnRleHQoKQorCisKK2RlZiBlbXB0eV9idWlsZF9jb250ZXh0KCk6CisgIHJldHVybiB7J2VuYWJsZWRfYnVpbGRfZmVhdHVyZXMnOiBbXX0KKworCitkZWYgZXhlY3V0ZV9idWlsZF9wbGFuKGJ1aWxkX3BsYW46IEJ1aWxkUGxhbik6CisgIGJ1aWxkX2NvbW1hbmQgPSBbXQorICBidWlsZF9jb21tYW5kLmFwcGVuZChnZXRfdG9wKCkuam9pbnBhdGgoU09PTkdfVUlfRVhFX1JFTF9QQVRIKSkKKyAgYnVpbGRfY29tbWFuZC5hcHBlbmQoJy0tbWFrZS1tb2RlJykKKyAgYnVpbGRfY29tbWFuZC5leHRlbmQoYnVpbGRfcGxhbi5idWlsZF90YXJnZXRzKQorCisgIHRyeToKKyAgICBydW5fY29tbWFuZChidWlsZF9jb21tYW5kKQorICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZToKKyAgICByYWlzZSBCdWlsZEZhaWx1cmVFcnJvcihlLnJldHVybmNvZGUpIGZyb20gZQorCisgIGZvciBwYWNrYWdpbmdfZnVuY3Rpb24gaW4gYnVpbGRfcGxhbi5wYWNrYWdpbmdfZnVuY3Rpb25zOgorICAgIHBhY2thZ2luZ19mdW5jdGlvbigpCisKKworZGVmIGdldF90b3AoKSAtPiBwYXRobGliLlBhdGg6CisgIHJldHVybiBwYXRobGliLlBhdGgob3MuZW52aXJvblsnVE9QJ10pCisKKworZGVmIHJ1bl9jb21tYW5kKGFyZ3M6IGxpc3Rbc3RyXSwgc3Rkb3V0PU5vbmUpOgorICBzdWJwcm9jZXNzLnJ1bihhcmdzPWFyZ3MsIGNoZWNrPVRydWUsIHN0ZG91dD1zdGRvdXQpCisKKworZGVmIG1haW4oYXJndik6CisgIHN5cy5leGl0KGJ1aWxkX3Rlc3Rfc3VpdGVzKGFyZ3YpKQpkaWZmIC0tZ2l0IGEvY2kvYnVpbGRfdGVzdF9zdWl0ZXNfbG9jYWxfdGVzdC5weSBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzX2xvY2FsX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlNTJkMwotLS0gL2Rldi9udWxsCisrKyBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzX2xvY2FsX3Rlc3QucHkKQEAgLTAsMCArMSwxMjMgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiSW50ZWdyYXRpb24gdGVzdHMgZm9yIGJ1aWxkX3Rlc3Rfc3VpdGVzIHRoYXQgcmVxdWlyZSBhIGxvY2FsIGJ1aWxkIGVudi4iIiIKKworaW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHNodXRpbAoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKK2ltcG9ydCBjaV90ZXN0X2xpYgorCisKK2NsYXNzIEJ1aWxkVGVzdFN1aXRlc0xvY2FsVGVzdChjaV90ZXN0X2xpYi5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYudG9wX2RpciA9IHBhdGhsaWIuUGF0aChvcy5lbnZpcm9uWydBTkRST0lEX0JVSUxEX1RPUCddKS5yZXNvbHZlKCkKKyAgICBzZWxmLmV4ZWN1dGFibGUgPSBzZWxmLnRvcF9kaXIuam9pbnBhdGgoJ2J1aWxkL21ha2UvY2kvYnVpbGRfdGVzdF9zdWl0ZXMnKQorICAgIHNlbGYucHJvY2Vzc19zZXNzaW9uID0gY2lfdGVzdF9saWIuVGVtcG9yYXJ5UHJvY2Vzc1Nlc3Npb24oc2VsZikKKyAgICBzZWxmLnRlbXBfZGlyID0gY2lfdGVzdF9saWIuVGVzdFRlbXBvcmFyeURpcmVjdG9yeS5jcmVhdGUoc2VsZikKKworICBkZWYgYnVpbGRfc3VicHJvY2Vzc19hcmdzKHNlbGYsIGJ1aWxkX2FyZ3M6IGxpc3Rbc3RyXSk6CisgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICBlbnZbJ1RPUCddID0gc3RyKHNlbGYudG9wX2RpcikKKyAgICBlbnZbJ09VVF9ESVInXSA9IHNlbGYudGVtcF9kaXIKKworICAgIGFyZ3MgPSAoW3NlbGYuZXhlY3V0YWJsZV0gKyBidWlsZF9hcmdzLCkKKyAgICBrd2FyZ3MgPSB7CisgICAgICAgICdjd2QnOiBzZWxmLnRvcF9kaXIsCisgICAgICAgICdlbnYnOiBlbnYsCisgICAgICAgICd0ZXh0JzogVHJ1ZSwKKyAgICB9CisKKyAgICByZXR1cm4gKGFyZ3MsIGt3YXJncykKKworICBkZWYgcnVuX2J1aWxkKHNlbGYsIGJ1aWxkX2FyZ3M6IGxpc3Rbc3RyXSkgLT4gc3VicHJvY2Vzcy5Db21wbGV0ZWRQcm9jZXNzOgorICAgIGFyZ3MsIGt3YXJncyA9IHNlbGYuYnVpbGRfc3VicHJvY2Vzc19hcmdzKGJ1aWxkX2FyZ3MpCisKKyAgICByZXR1cm4gc3VicHJvY2Vzcy5ydW4oCisgICAgICAgICphcmdzLAorICAgICAgICAqKmt3YXJncywKKyAgICAgICAgY2hlY2s9VHJ1ZSwKKyAgICAgICAgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwKKyAgICAgICAgdGltZW91dD01ICogNjAsCisgICAgKQorCisgIGRlZiBhc3NlcnRfY2hpbGRyZW5fYWxpdmUoc2VsZiwgY2hpbGRyZW46IGxpc3RbaW50XSk6CisgICAgZm9yIGMgaW4gY2hpbGRyZW46CisgICAgICBzZWxmLmFzc2VydFRydWUoY2lfdGVzdF9saWIucHJvY2Vzc19hbGl2ZShjKSkKKworICBkZWYgYXNzZXJ0X2NoaWxkcmVuX2RlYWQoc2VsZiwgY2hpbGRyZW46IGxpc3RbaW50XSk6CisgICAgZm9yIGMgaW4gY2hpbGRyZW46CisgICAgICBzZWxmLmFzc2VydEZhbHNlKGNpX3Rlc3RfbGliLnByb2Nlc3NfYWxpdmUoYykpCisKKyAgZGVmIHRlc3RfZmFpbHNfZm9yX2ludmFsaWRfYXJnKHNlbGYpOgorICAgIGludmFsaWRfYXJnID0gJy0taW52YWxpZC1hcmcnCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKSBhcyBjbToKKyAgICAgIHNlbGYucnVuX2J1aWxkKFtpbnZhbGlkX2FyZ10pCisKKyAgICBzZWxmLmFzc2VydEluKGludmFsaWRfYXJnLCBjbS5leGNlcHRpb24uc3RkZXJyKQorCisgIGRlZiB0ZXN0X2J1aWxkc19zdWNjZXNzZnVsbHkoc2VsZik6CisgICAgc2VsZi5ydW5fYnVpbGQoWydub3RoaW5nJ10pCisKKyAgZGVmIHRlc3RfY2FuX2ludGVycnVwdF9idWlsZChzZWxmKToKKyAgICBhcmdzLCBrd2FyZ3MgPSBzZWxmLmJ1aWxkX3N1YnByb2Nlc3NfYXJncyhbJ2dlbmVyYWwtdGVzdHMnXSkKKyAgICBwID0gc2VsZi5wcm9jZXNzX3Nlc3Npb24uY3JlYXRlKGFyZ3MsIGt3YXJncykKKworICAgICMgVE9ETyhsdWNhZmFyc2kpOiBSZXBsYWNlIHRoaXMgKGFuZCBvdGhlciBpbnN0YW5jZXMpIHdpdGggYSBjb25kaXRpb24uCisgICAgdGltZS5zbGVlcCg1KSAgIyBXYWl0IGZvciB0aGUgYnVpbGQgdG8gZ2V0IGdvaW5nLgorICAgIHNlbGYuYXNzZXJ0SXNOb25lKHAucG9sbCgpKSAgIyBDaGVjayB0aGF0IHRoZSBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlLgorICAgIGNoaWxkcmVuID0gcXVlcnlfY2hpbGRfcGlkcyhwLnBpZCkKKyAgICBzZWxmLmFzc2VydF9jaGlsZHJlbl9hbGl2ZShjaGlsZHJlbikKKworICAgIHAuc2VuZF9zaWduYWwoc2lnbmFsLlNJR0lOVCkKKyAgICBwLndhaXQoKQorCisgICAgdGltZS5zbGVlcCg1KSAgIyBXYWl0IGZvciB0aGluZ3MgdG8gZGllIG91dC4KKyAgICBzZWxmLmFzc2VydF9jaGlsZHJlbl9kZWFkKGNoaWxkcmVuKQorCisgIGRlZiB0ZXN0X2Nhbl9raWxsX2J1aWxkX3Byb2Nlc3NfZ3JvdXAoc2VsZik6CisgICAgYXJncywga3dhcmdzID0gc2VsZi5idWlsZF9zdWJwcm9jZXNzX2FyZ3MoWydnZW5lcmFsLXRlc3RzJ10pCisgICAgcCA9IHNlbGYucHJvY2Vzc19zZXNzaW9uLmNyZWF0ZShhcmdzLCBrd2FyZ3MpCisKKyAgICB0aW1lLnNsZWVwKDUpICAjIFdhaXQgZm9yIHRoZSBidWlsZCB0byBnZXQgZ29pbmcuCisgICAgc2VsZi5hc3NlcnRJc05vbmUocC5wb2xsKCkpICAjIENoZWNrIHRoYXQgdGhlIHByb2Nlc3MgaXMgc3RpbGwgYWxpdmUuCisgICAgY2hpbGRyZW4gPSBxdWVyeV9jaGlsZF9waWRzKHAucGlkKQorICAgIHNlbGYuYXNzZXJ0X2NoaWxkcmVuX2FsaXZlKGNoaWxkcmVuKQorCisgICAgb3Mua2lsbHBnKG9zLmdldHBnaWQocC5waWQpLCBzaWduYWwuU0lHS0lMTCkKKyAgICBwLndhaXQoKQorCisgICAgdGltZS5zbGVlcCg1KSAgIyBXYWl0IGZvciB0aGluZ3MgdG8gZGllIG91dC4KKyAgICBzZWxmLmFzc2VydF9jaGlsZHJlbl9kZWFkKGNoaWxkcmVuKQorCisKKyMgVE9ETyhoemFsZWspOiBSZXBsYWNlIHRoaXMgd2l0aCBgcHN1dGlsc2Agb25jZSBhdmFpbGFibGUgaW4gdGhlIHRyZWUuCitkZWYgcXVlcnlfY2hpbGRfcGlkcyhwYXJlbnRfcGlkOiBpbnQpIC0+IHNldFtpbnRdOgorICBwID0gc3VicHJvY2Vzcy5ydW4oCisgICAgICBbJ3BncmVwJywgJy1QJywgc3RyKHBhcmVudF9waWQpXSwKKyAgICAgIGNoZWNrPVRydWUsCisgICAgICBjYXB0dXJlX291dHB1dD1UcnVlLAorICAgICAgdGV4dD1UcnVlLAorICApCisgIHJldHVybiB7aW50KHBpZCkgZm9yIHBpZCBpbiBwLnN0ZG91dC5zcGxpdGxpbmVzKCl9CisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgY2lfdGVzdF9saWIubWFpbigpCmRpZmYgLS1naXQgYS9jaS9idWlsZF90ZXN0X3N1aXRlc190ZXN0LnB5IGIvY2kvYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWZmM2ZiCi0tLSAvZGV2L251bGwKKysrIGIvY2kvYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weQpAQCAtMCwwICsxLDQzMSBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJUZXN0cyBmb3IgYnVpbGRfdGVzdF9zdWl0ZXMucHkiIiIKKworaW1wb3J0IGFyZ3BhcnNlCitmcm9tIGltcG9ydGxpYiBpbXBvcnQgcmVzb3VyY2VzCitpbXBvcnQganNvbgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHNodXRpbAoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHN0YXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IHRpbWUKK2Zyb20gdHlwaW5nIGltcG9ydCBDYWxsYWJsZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCitpbXBvcnQgYnVpbGRfdGVzdF9zdWl0ZXMKK2ltcG9ydCBjaV90ZXN0X2xpYgoraW1wb3J0IG9wdGltaXplZF90YXJnZXRzCitmcm9tIHB5ZmFrZWZzIGltcG9ydCBmYWtlX2ZpbGVzeXN0ZW1fdW5pdHRlc3QKKworCitjbGFzcyBCdWlsZFRlc3RTdWl0ZXNUZXN0KGZha2VfZmlsZXN5c3RlbV91bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYuc2V0VXBQeWZha2VmcygpCisKKyAgICBvc19lbnZpcm9uX3BhdGNoZXIgPSBtb2NrLnBhdGNoLmRpY3QoJ29zLmVudmlyb24nLCB7fSkKKyAgICBzZWxmLmFkZENsZWFudXAob3NfZW52aXJvbl9wYXRjaGVyLnN0b3ApCisgICAgc2VsZi5tb2NrX29zX2Vudmlyb24gPSBvc19lbnZpcm9uX3BhdGNoZXIuc3RhcnQoKQorCisgICAgc3VicHJvY2Vzc19ydW5fcGF0Y2hlciA9IG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MucnVuJykKKyAgICBzZWxmLmFkZENsZWFudXAoc3VicHJvY2Vzc19ydW5fcGF0Y2hlci5zdG9wKQorICAgIHNlbGYubW9ja19zdWJwcm9jZXNzX3J1biA9IHN1YnByb2Nlc3NfcnVuX3BhdGNoZXIuc3RhcnQoKQorCisgICAgc2VsZi5fc2V0dXBfd29ya2luZ19idWlsZF9lbnYoKQorCisgIGRlZiB0ZXN0X21pc3NpbmdfdGFyZ2V0X3JlbGVhc2VfZW52X3Zhcl9yYWlzZXMoc2VsZik6CisgICAgZGVsIG9zLmVudmlyb25bJ1RBUkdFVF9SRUxFQVNFJ10KKworICAgIHdpdGggc2VsZi5hc3NlcnRfcmFpc2VzX3dvcmQoYnVpbGRfdGVzdF9zdWl0ZXMuRXJyb3IsICdUQVJHRVRfUkVMRUFTRScpOgorICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMubWFpbihbXSkKKworICBkZWYgdGVzdF9taXNzaW5nX3RhcmdldF9wcm9kdWN0X2Vudl92YXJfcmFpc2VzKHNlbGYpOgorICAgIGRlbCBvcy5lbnZpcm9uWydUQVJHRVRfUFJPRFVDVCddCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0X3JhaXNlc193b3JkKGJ1aWxkX3Rlc3Rfc3VpdGVzLkVycm9yLCAnVEFSR0VUX1BST0RVQ1QnKToKKyAgICAgIGJ1aWxkX3Rlc3Rfc3VpdGVzLm1haW4oW10pCisKKyAgZGVmIHRlc3RfbWlzc2luZ190b3BfZW52X3Zhcl9yYWlzZXMoc2VsZik6CisgICAgZGVsIG9zLmVudmlyb25bJ1RPUCddCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0X3JhaXNlc193b3JkKGJ1aWxkX3Rlc3Rfc3VpdGVzLkVycm9yLCAnVE9QJyk6CisgICAgICBidWlsZF90ZXN0X3N1aXRlcy5tYWluKFtdKQorCisgIGRlZiB0ZXN0X2ludmFsaWRfYXJnX3JhaXNlcyhzZWxmKToKKyAgICBpbnZhbGlkX2FyZ3MgPSBbJy0taW52YWxpZF9hcmcnXQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFN5c3RlbUV4aXQsICcyJyk6CisgICAgICBidWlsZF90ZXN0X3N1aXRlcy5tYWluKGludmFsaWRfYXJncykKKworICBkZWYgdGVzdF9idWlsZF9mYWlsdXJlX3JldHVybnMoc2VsZik6CisgICAgc2VsZi5tb2NrX3N1YnByb2Nlc3NfcnVuLnNpZGVfZWZmZWN0ID0gc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoCisgICAgICAgIDQyLCBOb25lCisgICAgKQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFN5c3RlbUV4aXQsICc0MicpOgorICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMubWFpbihbXSkKKworICBkZWYgdGVzdF9pbmNvcnJlY3RseV9mb3JtYXR0ZWRfYnVpbGRfY29udGV4dF9yYWlzZXMoc2VsZik6CisgICAgYnVpbGRfY29udGV4dCA9IHNlbGYuZmFrZV90b3Auam9pbnBhdGgoJ2J1aWxkX2NvbnRleHQnKQorICAgIGJ1aWxkX2NvbnRleHQudG91Y2goKQorICAgIG9zLmVudmlyb25bJ0JVSUxEX0NPTlRFWFQnXSA9IHN0cihidWlsZF9jb250ZXh0KQorCisgICAgd2l0aCBzZWxmLmFzc2VydF9yYWlzZXNfd29yZChidWlsZF90ZXN0X3N1aXRlcy5FcnJvciwgJ0pTT04nKToKKyAgICAgIGJ1aWxkX3Rlc3Rfc3VpdGVzLm1haW4oW10pCisKKyAgZGVmIHRlc3RfYnVpbGRfc3VjY2Vzc19yZXR1cm5zKHNlbGYpOgorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeXN0ZW1FeGl0LCAnMCcpOgorICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMubWFpbihbXSkKKworICBkZWYgYXNzZXJ0X3JhaXNlc193b3JkKHNlbGYsIGNscywgd29yZCk6CisgICAgcmV0dXJuIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoY2xzLCByZidcYnt3b3JkfVxiJykKKworICBkZWYgX3NldHVwX3dvcmtpbmdfYnVpbGRfZW52KHNlbGYpOgorICAgIHNlbGYuZmFrZV90b3AgPSBwYXRobGliLlBhdGgoJy9mYWtlL3RvcCcpCisgICAgc2VsZi5mYWtlX3RvcC5ta2RpcihwYXJlbnRzPVRydWUpCisKKyAgICBzZWxmLnNvb25nX3VpX2RpciA9IHNlbGYuZmFrZV90b3Auam9pbnBhdGgoJ2J1aWxkL3Nvb25nJykKKyAgICBzZWxmLnNvb25nX3VpX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisKKyAgICBzZWxmLnNvb25nX3VpID0gc2VsZi5zb29uZ191aV9kaXIuam9pbnBhdGgoJ3Nvb25nX3VpLmJhc2gnKQorICAgIHNlbGYuc29vbmdfdWkudG91Y2goKQorCisgICAgc2VsZi5tb2NrX29zX2Vudmlyb24udXBkYXRlKHsKKyAgICAgICAgJ1RBUkdFVF9SRUxFQVNFJzogJ3JlbGVhc2UnLAorICAgICAgICAnVEFSR0VUX1BST0RVQ1QnOiAncHJvZHVjdCcsCisgICAgICAgICdUT1AnOiBzdHIoc2VsZi5mYWtlX3RvcCksCisgICAgfSkKKworICAgIHNlbGYubW9ja19zdWJwcm9jZXNzX3J1bi5yZXR1cm5fdmFsdWUgPSAwCisKKworY2xhc3MgUnVuQ29tbWFuZEludGVncmF0aW9uVGVzdChjaV90ZXN0X2xpYi5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYudGVtcF9kaXIgPSBjaV90ZXN0X2xpYi5UZXN0VGVtcG9yYXJ5RGlyZWN0b3J5LmNyZWF0ZShzZWxmKQorCisgICAgIyBDb3B5IHRoZSBQeXRob24gZXhlY3V0YWJsZSBmcm9tICdub24tY29kZScgcmVzb3VyY2VzIGFuZCBtYWtlIGl0CisgICAgIyBleGVjdXRhYmxlIGZvciB1c2UgYnkgdGVzdHMgdGhhdCBsYXVuY2ggYSBzdWJwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAjIHVzZSBQeXRob24ncyBuYXRpdmUgYHN5cy5leGVjdXRhYmxlYCBwcm9wZXJ0eSBzaW5jZSB0aGF0IGlzIG5vdCBzZXQgd2hlbgorICAgICMgcnVubmluZyB2aWEgdGhlIGVtYmVkZGVkIGxhdW5jaGVyLgorICAgIGJhc2VfbmFtZSA9ICdweTMtY21kJworICAgIGRlc3RfZmlsZSA9IHNlbGYudGVtcF9kaXIuam9pbnBhdGgoYmFzZV9uYW1lKQorICAgIHdpdGggcmVzb3VyY2VzLmFzX2ZpbGUoCisgICAgICAgIHJlc291cmNlcy5maWxlcygndGVzdGRhdGEnKS5qb2lucGF0aChiYXNlX25hbWUpCisgICAgKSBhcyBwOgorICAgICAgc2h1dGlsLmNvcHkocCwgZGVzdF9maWxlKQorICAgIGRlc3RfZmlsZS5jaG1vZChkZXN0X2ZpbGUuc3RhdCgpLnN0X21vZGUgfCBzdGF0LlNfSUVYRUMpCisgICAgc2VsZi5weXRob25fZXhlY3V0YWJsZSA9IGRlc3RfZmlsZQorCisgICAgc2VsZi5fbWFuYWdlZF9wcm9jZXNzZXMgPSBbXQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBzZWxmLl90ZXJtaW5hdGVfbWFuYWdlZF9wcm9jZXNzZXMoKQorCisgIGRlZiB0ZXN0X3JhaXNlc19vbl9ub256ZXJvX2V4aXQoc2VsZik6CisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24pOgorICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMucnVuX2NvbW1hbmQoWworICAgICAgICAgIHNlbGYucHl0aG9uX2V4ZWN1dGFibGUsCisgICAgICAgICAgJy1jJywKKyAgICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoZiIiIlwKKyAgICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICAgICAgICAiIiIpLAorICAgICAgXSkKKworICBkZWYgdGVzdF9zdHJlYW1zX3N0ZG91dChzZWxmKToKKworICAgIGRlZiBydW5fc2xvd19jb21tYW5kKHN0ZG91dF9maWxlLCBtYXJrZXIpOgorICAgICAgd2l0aCBvcGVuKHN0ZG91dF9maWxlLCAndycpIGFzIGY6CisgICAgICAgIGJ1aWxkX3Rlc3Rfc3VpdGVzLnJ1bl9jb21tYW5kKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIHNlbGYucHl0aG9uX2V4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgJy1jJywKKyAgICAgICAgICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoZiIiIlwKKyAgICAgICAgICAgICAgICAgIGltcG9ydCB0aW1lCisKKyAgICAgICAgICAgICAgICAgIHByaW50KCd7bWFya2VyfScsIGVuZD0nJywgZmx1c2g9VHJ1ZSkKKworICAgICAgICAgICAgICAgICAgIyBLZWVwIHByb2Nlc3MgYWxpdmUgdW50aWwgd2UgY2hlY2sgc3Rkb3V0LgorICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgxMCkKKyAgICAgICAgICAgICAgICAgICIiIiksCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgc3Rkb3V0PWYsCisgICAgICAgICkKKworICAgIG1hcmtlciA9ICdTcGluYWNoJworICAgIHN0ZG91dF9maWxlID0gc2VsZi50ZW1wX2Rpci5qb2lucGF0aCgnc3Rkb3V0LnR4dCcpCisKKyAgICBwID0gc2VsZi5zdGFydF9wcm9jZXNzKHRhcmdldD1ydW5fc2xvd19jb21tYW5kLCBhcmdzPVtzdGRvdXRfZmlsZSwgbWFya2VyXSkKKworICAgIHNlbGYuYXNzZXJ0X2ZpbGVfZXZlbnR1YWxseV9jb250YWlucyhzdGRvdXRfZmlsZSwgbWFya2VyKQorCisgIGRlZiB0ZXN0X3Byb3BhZ2F0ZXNfaW50ZXJydXB0aW9ucyhzZWxmKToKKworICAgIGRlZiBydW4ocGlkX2ZpbGUpOgorICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMucnVuX2NvbW1hbmQoWworICAgICAgICAgIHNlbGYucHl0aG9uX2V4ZWN1dGFibGUsCisgICAgICAgICAgJy1jJywKKyAgICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoZiIiIlwKKyAgICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICAgIGltcG9ydCBwYXRobGliCisgICAgICAgICAgICAgIGltcG9ydCB0aW1lCisKKyAgICAgICAgICAgICAgcGF0aGxpYi5QYXRoKCd7cGlkX2ZpbGV9Jykud3JpdGVfdGV4dChzdHIob3MuZ2V0cGlkKCkpKQorCisgICAgICAgICAgICAgICMgS2VlcCB0aGUgcHJvY2VzcyBhbGl2ZSBmb3IgdXMgdG8gZXhwbGljaXRseSBpbnRlcnJ1cHQgaXQuCisgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMTApCisgICAgICAgICAgICAgICIiIiksCisgICAgICBdKQorCisgICAgcGlkX2ZpbGUgPSBzZWxmLnRlbXBfZGlyLmpvaW5wYXRoKCdwaWQudHh0JykKKyAgICBwID0gc2VsZi5zdGFydF9wcm9jZXNzKHRhcmdldD1ydW4sIGFyZ3M9W3BpZF9maWxlXSkKKyAgICBzdWJwcm9jZXNzX3BpZCA9IGludChyZWFkX2V2ZW50dWFsX2ZpbGVfY29udGVudHMocGlkX2ZpbGUpKQorCisgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICBwLmpvaW4oKQorCisgICAgc2VsZi5hc3NlcnRfcHJvY2Vzc19ldmVudHVhbGx5X2RpZXMocC5waWQpCisgICAgc2VsZi5hc3NlcnRfcHJvY2Vzc19ldmVudHVhbGx5X2RpZXMoc3VicHJvY2Vzc19waWQpCisKKyAgZGVmIHN0YXJ0X3Byb2Nlc3Moc2VsZiwgKmFyZ3MsICoqa3dhcmdzKSAtPiBtdWx0aXByb2Nlc3NpbmcuUHJvY2VzczoKKyAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MoKmFyZ3MsICoqa3dhcmdzKQorICAgIHNlbGYuX21hbmFnZWRfcHJvY2Vzc2VzLmFwcGVuZChwKQorICAgIHAuc3RhcnQoKQorICAgIHJldHVybiBwCisKKyAgZGVmIGFzc2VydF9wcm9jZXNzX2V2ZW50dWFsbHlfZGllcyhzZWxmLCBwaWQ6IGludCk6CisgICAgdHJ5OgorICAgICAgd2FpdF91bnRpbChsYW1iZGE6IG5vdCBjaV90ZXN0X2xpYi5wcm9jZXNzX2FsaXZlKHBpZCkpCisgICAgZXhjZXB0IFRpbWVvdXRFcnJvciBhcyBlOgorICAgICAgc2VsZi5mYWlsKGYnUHJvY2VzcyB7cGlkfSBkaWQgbm90IGRpZSBhZnRlciBhIHdoaWxlOiB7ZX0nKQorCisgIGRlZiBhc3NlcnRfZmlsZV9ldmVudHVhbGx5X2NvbnRhaW5zKHNlbGYsIGZpbGU6IHBhdGhsaWIuUGF0aCwgc3Vic3RyaW5nOiBzdHIpOgorICAgIHdhaXRfdW50aWwobGFtYmRhOiBmaWxlLmlzX2ZpbGUoKSBhbmQgZmlsZS5zdGF0KCkuc3Rfc2l6ZSA+IDApCisgICAgc2VsZi5hc3NlcnRJbihzdWJzdHJpbmcsIHJlYWRfZmlsZV9jb250ZW50cyhmaWxlKSkKKworICBkZWYgX3Rlcm1pbmF0ZV9tYW5hZ2VkX3Byb2Nlc3NlcyhzZWxmKToKKyAgICBmb3IgcCBpbiBzZWxmLl9tYW5hZ2VkX3Byb2Nlc3NlczoKKyAgICAgIGlmIG5vdCBwLmlzX2FsaXZlKCk6CisgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICMgV2UgdGVybWluYXRlIHRoZSBwcm9jZXNzIHdpdGggYFNJR0lOVGAgc2luY2UgdXNpbmcgYHRlcm1pbmF0ZWAgb3IKKyAgICAgICMgYFNJR0tJTExgIGRvZXNuJ3Qga2lsbCBhbnkgZ3JhbmRjaGlsZCBwcm9jZXNzZXMgYW5kIHdlIGRvbid0IGhhdmUKKyAgICAgICMgYHBzdXRpbGAgYXZhaWxhYmxlIHRvIGVhc2lseSBxdWVyeSBhbGwgY2hpbGRyZW4uCisgICAgICBvcy5raWxsKHAucGlkLCBzaWduYWwuU0lHSU5UKQorCisKK2NsYXNzIEJ1aWxkUGxhbm5lclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGNsYXNzIFRlc3RPcHRpbWl6ZWRCdWlsZFRhcmdldChvcHRpbWl6ZWRfdGFyZ2V0cy5PcHRpbWl6ZWRCdWlsZFRhcmdldCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3V0cHV0X3RhcmdldHMpOgorICAgICAgc2VsZi5vdXRwdXRfdGFyZ2V0cyA9IG91dHB1dF90YXJnZXRzCisKKyAgICBkZWYgZ2V0X2J1aWxkX3RhcmdldHMoc2VsZik6CisgICAgICByZXR1cm4gc2VsZi5vdXRwdXRfdGFyZ2V0cworCisgICAgZGVmIHBhY2thZ2Vfb3V0cHV0cyhzZWxmKToKKyAgICAgIHJldHVybiBmJ3BhY2thZ2luZyB7IiAiLmpvaW4oc2VsZi5vdXRwdXRfdGFyZ2V0cyl9JworCisgIGRlZiB0ZXN0X2J1aWxkX29wdGltaXphdGlvbl9vZmZfYnVpbGRzX2V2ZXJ5dGhpbmcoc2VsZik6CisgICAgYnVpbGRfdGFyZ2V0cyA9IHsndGFyZ2V0XzEnLCAndGFyZ2V0XzInfQorICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQob3B0aW1pemVkX2J1aWxkX2VuYWJsZWQ9RmFsc2UpLAorICAgICAgICBidWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMsCisgICAgKQorCisgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF90YXJnZXRzLCBidWlsZF9wbGFuLmJ1aWxkX3RhcmdldHMpCisKKyAgZGVmIHRlc3RfYnVpbGRfb3B0aW1pemF0aW9uX29mZl9kb2VzbnRfcGFja2FnZShzZWxmKToKKyAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CisgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dChvcHRpbWl6ZWRfYnVpbGRfZW5hYmxlZD1GYWxzZSksCisgICAgICAgIGJ1aWxkX3RhcmdldHM9YnVpbGRfdGFyZ2V0cywKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWlsZF9wbGFuLnBhY2thZ2luZ19mdW5jdGlvbnMpLCAwKQorCisgIGRlZiB0ZXN0X2J1aWxkX29wdGltaXphdGlvbl9vbl9vcHRpbWl6ZXNfdGFyZ2V0KHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldHMgPSB7J3RhcmdldF8xJywgJ3RhcmdldF8yJ30KKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz1idWlsZF90YXJnZXRzLAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQoCisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPXtzZWxmLmdldF90YXJnZXRfZmxhZygndGFyZ2V0XzEnKX0KKyAgICAgICAgKSwKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBleHBlY3RlZF90YXJnZXRzID0ge3NlbGYuZ2V0X29wdGltaXplZF90YXJnZXRfbmFtZSgndGFyZ2V0XzEnKSwgJ3RhcmdldF8yJ30KKyAgICBzZWxmLmFzc2VydFNldEVxdWFsKGV4cGVjdGVkX3RhcmdldHMsIGJ1aWxkX3BsYW4uYnVpbGRfdGFyZ2V0cykKKworICBkZWYgdGVzdF9idWlsZF9vcHRpbWl6YXRpb25fb25fcGFja2FnZXNfdGFyZ2V0KHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldHMgPSB7J3RhcmdldF8xJywgJ3RhcmdldF8yJ30KKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz1idWlsZF90YXJnZXRzLAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQoCisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPXtzZWxmLmdldF90YXJnZXRfZmxhZygndGFyZ2V0XzEnKX0KKyAgICAgICAgKSwKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBvcHRpbWl6ZWRfdGFyZ2V0X25hbWUgPSBzZWxmLmdldF9vcHRpbWl6ZWRfdGFyZ2V0X25hbWUoJ3RhcmdldF8xJykKKyAgICBzZWxmLmFzc2VydEluKAorICAgICAgICBmJ3BhY2thZ2luZyB7b3B0aW1pemVkX3RhcmdldF9uYW1lfScsCisgICAgICAgIHNlbGYucnVuX3BhY2thZ2luZ19mdW5jdGlvbnMoYnVpbGRfcGxhbiksCisgICAgKQorCisgIGRlZiB0ZXN0X2luZGl2aWR1YWxfYnVpbGRfb3B0aW1pemF0aW9uX29mZl9kb2VzbnRfb3B0aW1pemUoc2VsZik6CisgICAgYnVpbGRfdGFyZ2V0cyA9IHsndGFyZ2V0XzEnLCAndGFyZ2V0XzInfQorICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAorICAgICAgICBidWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMsCisgICAgKQorCisgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorCisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChidWlsZF90YXJnZXRzLCBidWlsZF9wbGFuLmJ1aWxkX3RhcmdldHMpCisKKyAgZGVmIHRlc3RfaW5kaXZpZHVhbF9idWlsZF9vcHRpbWl6YXRpb25fb2ZmX2RvZXNudF9wYWNrYWdlKHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldHMgPSB7J3RhcmdldF8xJywgJ3RhcmdldF8yJ30KKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz1idWlsZF90YXJnZXRzLAorICAgICkKKworICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKworICAgIGV4cGVjdGVkX3BhY2thZ2luZ19mdW5jdGlvbl9vdXRwdXRzID0ge05vbmUsIE5vbmV9CisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbCgKKyAgICAgICAgZXhwZWN0ZWRfcGFja2FnaW5nX2Z1bmN0aW9uX291dHB1dHMsCisgICAgICAgIHNlbGYucnVuX3BhY2thZ2luZ19mdW5jdGlvbnMoYnVpbGRfcGxhbiksCisgICAgKQorCisgIGRlZiBjcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgIHNlbGYsCisgICAgICBidWlsZF90YXJnZXRzOiBzZXRbc3RyXSwKKyAgICAgIGJ1aWxkX2NvbnRleHQ6IGRpY3Rbc3RyLCBhbnldID0gTm9uZSwKKyAgICAgIGFyZ3M6IGFyZ3BhcnNlLk5hbWVzcGFjZSA9IE5vbmUsCisgICAgICB0YXJnZXRfb3B0aW1pemF0aW9uczogZGljdFsKKyAgICAgICAgICBzdHIsIG9wdGltaXplZF90YXJnZXRzLk9wdGltaXplZEJ1aWxkVGFyZ2V0CisgICAgICBdID0gTm9uZSwKKyAgKSAtPiBidWlsZF90ZXN0X3N1aXRlcy5CdWlsZFBsYW5uZXI6CisgICAgaWYgbm90IGJ1aWxkX2NvbnRleHQ6CisgICAgICBidWlsZF9jb250ZXh0ID0gc2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dCgpCisgICAgaWYgbm90IGFyZ3M6CisgICAgICBhcmdzID0gc2VsZi5jcmVhdGVfYXJncyhleHRyYV9idWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMpCisgICAgaWYgbm90IHRhcmdldF9vcHRpbWl6YXRpb25zOgorICAgICAgdGFyZ2V0X29wdGltaXphdGlvbnMgPSBzZWxmLmNyZWF0ZV90YXJnZXRfb3B0aW1pemF0aW9ucygKKyAgICAgICAgICBidWlsZF9jb250ZXh0LCBidWlsZF90YXJnZXRzCisgICAgICApCisgICAgcmV0dXJuIGJ1aWxkX3Rlc3Rfc3VpdGVzLkJ1aWxkUGxhbm5lcigKKyAgICAgICAgYnVpbGRfY29udGV4dCwgYXJncywgdGFyZ2V0X29wdGltaXphdGlvbnMKKyAgICApCisKKyAgZGVmIGNyZWF0ZV9idWlsZF9jb250ZXh0KAorICAgICAgc2VsZiwKKyAgICAgIG9wdGltaXplZF9idWlsZF9lbmFibGVkOiBib29sID0gVHJ1ZSwKKyAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM6IHNldFtzdHJdID0gc2V0KCksCisgICAgICB0ZXN0X2NvbnRleHQ6IGRpY3Rbc3RyLCBhbnldID0ge30sCisgICkgLT4gZGljdFtzdHIsIGFueV06CisgICAgYnVpbGRfY29udGV4dCA9IHt9CisgICAgYnVpbGRfY29udGV4dFsnZW5hYmxlZF9idWlsZF9mZWF0dXJlcyddID0gZW5hYmxlZF9idWlsZF9mZWF0dXJlcworICAgIGlmIG9wdGltaXplZF9idWlsZF9lbmFibGVkOgorICAgICAgYnVpbGRfY29udGV4dFsnZW5hYmxlZF9idWlsZF9mZWF0dXJlcyddLmFkZCgnb3B0aW1pemVkX2J1aWxkJykKKyAgICBidWlsZF9jb250ZXh0Wyd0ZXN0X2NvbnRleHQnXSA9IHRlc3RfY29udGV4dAorICAgIHJldHVybiBidWlsZF9jb250ZXh0CisKKyAgZGVmIGNyZWF0ZV9hcmdzKAorICAgICAgc2VsZiwgZXh0cmFfYnVpbGRfdGFyZ2V0czogc2V0W3N0cl0gPSBzZXQoKQorICApIC0+IGFyZ3BhcnNlLk5hbWVzcGFjZToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnZXh0cmFfdGFyZ2V0cycsIG5hcmdzPScqJykKKyAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoZXh0cmFfYnVpbGRfdGFyZ2V0cykKKworICBkZWYgY3JlYXRlX3RhcmdldF9vcHRpbWl6YXRpb25zKAorICAgICAgc2VsZiwgYnVpbGRfY29udGV4dDogZGljdFtzdHIsIGFueV0sIGJ1aWxkX3RhcmdldHM6IHNldFtzdHJdCisgICk6CisgICAgdGFyZ2V0X29wdGltaXphdGlvbnMgPSBkaWN0KCkKKyAgICBmb3IgdGFyZ2V0IGluIGJ1aWxkX3RhcmdldHM6CisgICAgICB0YXJnZXRfb3B0aW1pemF0aW9uc1t0YXJnZXRdID0gKAorICAgICAgICAgIGxhbWJkYSB0YXJnZXQsIGJ1aWxkX2NvbnRleHQsIGFyZ3M6IG9wdGltaXplZF90YXJnZXRzLmdldF90YXJnZXRfb3B0aW1pemVyKAorICAgICAgICAgICAgICB0YXJnZXQsCisgICAgICAgICAgICAgIHNlbGYuZ2V0X3RhcmdldF9mbGFnKHRhcmdldCksCisgICAgICAgICAgICAgIGJ1aWxkX2NvbnRleHQsCisgICAgICAgICAgICAgIHNlbGYuVGVzdE9wdGltaXplZEJ1aWxkVGFyZ2V0KAorICAgICAgICAgICAgICAgICAge3NlbGYuZ2V0X29wdGltaXplZF90YXJnZXRfbmFtZSh0YXJnZXQpfQorICAgICAgICAgICAgICApLAorICAgICAgICAgICkKKyAgICAgICkKKworICAgIHJldHVybiB0YXJnZXRfb3B0aW1pemF0aW9ucworCisgIGRlZiBnZXRfdGFyZ2V0X2ZsYWcoc2VsZiwgdGFyZ2V0OiBzdHIpOgorICAgIHJldHVybiBmJ3t0YXJnZXR9X2VuYWJsZWQnCisKKyAgZGVmIGdldF9vcHRpbWl6ZWRfdGFyZ2V0X25hbWUoc2VsZiwgdGFyZ2V0OiBzdHIpOgorICAgIHJldHVybiBmJ3t0YXJnZXR9X29wdGltaXplZCcKKworICBkZWYgcnVuX3BhY2thZ2luZ19mdW5jdGlvbnMoCisgICAgICBzZWxmLCBidWlsZF9wbGFuOiBidWlsZF90ZXN0X3N1aXRlcy5CdWlsZFBsYW4KKyAgKSAtPiBzZXRbc3RyXToKKyAgICBvdXRwdXQgPSBzZXQoKQorICAgIGZvciBwYWNrYWdpbmdfZnVuY3Rpb24gaW4gYnVpbGRfcGxhbi5wYWNrYWdpbmdfZnVuY3Rpb25zOgorICAgICAgb3V0cHV0LmFkZChwYWNrYWdpbmdfZnVuY3Rpb24oKSkKKworICAgIHJldHVybiBvdXRwdXQKKworCitkZWYgd2FpdF91bnRpbCgKKyAgICBjb25kaXRpb25fZnVuY3Rpb246IENhbGxhYmxlW1tdLCBib29sXSwKKyAgICB0aW1lb3V0X3NlY3M6IGZsb2F0ID0gMy4wLAorICAgIHBvbGxpbmdfaW50ZXJ2YWxfc2VjczogZmxvYXQgPSAwLjEsCispOgorICAiIiJXYWl0cyB1bnRpbCBhIGNvbmRpdGlvbiBmdW5jdGlvbiByZXR1cm5zIFRydWUuIiIiCisKKyAgc3RhcnRfdGltZV9zZWNzID0gdGltZS50aW1lKCkKKworICB3aGlsZSBub3QgY29uZGl0aW9uX2Z1bmN0aW9uKCk6CisgICAgaWYgdGltZS50aW1lKCkgLSBzdGFydF90aW1lX3NlY3MgPiB0aW1lb3V0X3NlY3M6CisgICAgICByYWlzZSBUaW1lb3V0RXJyb3IoCisgICAgICAgICAgZidDb25kaXRpb24gbm90IG1ldCB3aXRoaW4gdGltZW91dDoge3RpbWVvdXRfc2Vjc30gc2Vjb25kcycKKyAgICAgICkKKworICAgIHRpbWUuc2xlZXAocG9sbGluZ19pbnRlcnZhbF9zZWNzKQorCisKK2RlZiByZWFkX2ZpbGVfY29udGVudHMoZmlsZTogcGF0aGxpYi5QYXRoKSAtPiBzdHI6CisgIHdpdGggb3BlbihmaWxlLCAncicpIGFzIGY6CisgICAgcmV0dXJuIGYucmVhZCgpCisKKworZGVmIHJlYWRfZXZlbnR1YWxfZmlsZV9jb250ZW50cyhmaWxlOiBwYXRobGliLlBhdGgpIC0+IHN0cjoKKyAgd2FpdF91bnRpbChsYW1iZGE6IGZpbGUuaXNfZmlsZSgpIGFuZCBmaWxlLnN0YXQoKS5zdF9zaXplID4gMCkKKyAgcmV0dXJuIHJlYWRfZmlsZV9jb250ZW50cyhmaWxlKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGNpX3Rlc3RfbGliLm1haW4oKQpkaWZmIC0tZ2l0IGEvY2kvY2lfdGVzdF9saWIucHkgYi9jaS9jaV90ZXN0X2xpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDcwZDNmCi0tLSAvZGV2L251bGwKKysrIGIvY2kvY2lfdGVzdF9saWIucHkKQEAgLTAsMCArMSw4NiBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJUZXN0aW5nIHV0aWxpdGllcyBmb3IgdGVzdHMgaW4gdGhlIENJIHBhY2thZ2UuIiIiCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgdGVtcGZpbGUKKworCisjIEV4cG9ydCB0aGUgVGVzdENhc2UgY2xhc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgaW1wb3J0cyB0ZXN0cyBoYXZlIHRvIGxpc3QuCitUZXN0Q2FzZSA9IHVuaXR0ZXN0LlRlc3RDYXNlCisKKworZGVmIHByb2Nlc3NfYWxpdmUocGlkKToKKyAgIiIiQ2hlY2sgRm9yIHRoZSBleGlzdGVuY2Ugb2YgYSBwaWQuIiIiCisKKyAgdHJ5OgorICAgIG9zLmtpbGwocGlkLCAwKQorICBleGNlcHQgT1NFcnJvcjoKKyAgICByZXR1cm4gRmFsc2UKKworICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFRlbXBvcmFyeVByb2Nlc3NTZXNzaW9uOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2Nhc2U6IFRlc3RDYXNlKToKKyAgICBzZWxmLl9jcmVhdGVkX3Byb2Nlc3NlcyA9IFtdCisgICAgdGVzdF9jYXNlLmFkZENsZWFudXAoc2VsZi5jbGVhbnVwKQorCisgIGRlZiBjcmVhdGUoc2VsZiwgYXJncywga3dhcmdzKToKKyAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigqYXJncywgKiprd2FyZ3MsIHN0YXJ0X25ld19zZXNzaW9uPVRydWUpCisgICAgc2VsZi5fY3JlYXRlZF9wcm9jZXNzZXMuYXBwZW5kKHApCisgICAgcmV0dXJuIHAKKworICBkZWYgY2xlYW51cChzZWxmKToKKyAgICBmb3IgcCBpbiBzZWxmLl9jcmVhdGVkX3Byb2Nlc3NlczoKKyAgICAgIGlmIG5vdCBwcm9jZXNzX2FsaXZlKHAucGlkKToKKyAgICAgICAgcmV0dXJuCisgICAgICBvcy5raWxscGcob3MuZ2V0cGdpZChwLnBpZCksIHNpZ25hbC5TSUdLSUxMKQorCisKK2NsYXNzIFRlc3RUZW1wb3JhcnlEaXJlY3Rvcnk6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGRlbGV0ZTogYm9vbCwgKToKKyAgICBzZWxmLl9kZWxldGUgPSBkZWxldGUKKworICBAY2xhc3NtZXRob2QKKyAgZGVmIGNyZWF0ZShjbHMsIHRlc3RfY2FzZTogVGVzdENhc2UsIGRlbGV0ZTogYm9vbCA9IFRydWUpOgorICAgIHRlbXBfZGlyID0gVGVzdFRlbXBvcmFyeURpcmVjdG9yeShkZWxldGUpCisgICAgdGVtcF9kaXIuX2RpciA9IHBhdGhsaWIuUGF0aCh0ZW1wZmlsZS5ta2R0ZW1wKCkpCisgICAgdGVzdF9jYXNlLmFkZENsZWFudXAodGVtcF9kaXIuY2xlYW51cCkKKyAgICByZXR1cm4gdGVtcF9kaXIuX2RpcgorCisgIGRlZiBnZXRfZGlyKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9kaXIKKworICBkZWYgY2xlYW51cChzZWxmKToKKyAgICBpZiBub3Qgc2VsZi5fZGVsZXRlOgorICAgICAgcmV0dXJuCisgICAgc2h1dGlsLnJtdHJlZShzZWxmLl9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworCitkZWYgbWFpbigpOgorCisgICMgRGlzYWJsZSBsb2dnaW5nIHNpbmNlIGl0IGJyZWFrcyB0aGUgVEYgUHl0aG9uIHRlc3Qgb3V0cHV0IHBhcnNlci4KKyAgIyBUT0RPKGh6YWxlayk6IFVzZSBURidzIGB0ZXN0LW91dHB1dC1maWxlYCBvcHRpb24gdG8gcmUtZW5hYmxlIGxvZ2dpbmcuCisgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCkuZGlzYWJsZWQgPSBUcnVlCisKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9jaS9vcHRpbWl6ZWRfdGFyZ2V0cy5weSBiL2NpL29wdGltaXplZF90YXJnZXRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGM4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9vcHRpbWl6ZWRfdGFyZ2V0cy5weQpAQCAtMCwwICsxLDY5IEBACisjCisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Zyb20gYWJjIGltcG9ydCBBQkMKKworCitjbGFzcyBPcHRpbWl6ZWRCdWlsZFRhcmdldChBQkMpOgorICAiIiJBIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9wdGltaXplZCBidWlsZCB0YXJnZXQuCisKKyAgVGhpcyBjbGFzcyB3aWxsIGRldGVybWluZSB3aGF0IHRhcmdldHMgdG8gYnVpbGQgZ2l2ZW4gYSBnaXZlbiBidWlsZF9jb3RleHQgYW5kCisgIHdpbGwgaGF2ZSBhIHBhY2thZ2luZyBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhbnkgbmVjZXNzYXJ5IG91dHB1dCB6aXBzIGZvciB0aGUKKyAgYnVpbGQuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZF9jb250ZXh0LCBhcmdzKToKKyAgICBzZWxmLmJ1aWxkX2NvbnRleHQgPSBidWlsZF9jb250ZXh0CisgICAgc2VsZi5hcmdzID0gYXJncworCisgIGRlZiBnZXRfYnVpbGRfdGFyZ2V0cyhzZWxmKToKKyAgICBwYXNzCisKKyAgZGVmIHBhY2thZ2Vfb3V0cHV0cyhzZWxmKToKKyAgICBwYXNzCisKKworY2xhc3MgTnVsbE9wdGltaXplcihPcHRpbWl6ZWRCdWlsZFRhcmdldCk6CisgICIiIk5vLW9wIHRhcmdldCBvcHRpbWl6ZXIuCisKKyAgVGhpcyB3aWxsIHNpbXBseSBidWlsZCB0aGUgc2FtZSB0YXJnZXQgaXQgd2FzIGdpdmVuIGFuZCBkbyBub3RoaW5nIGZvciB0aGUKKyAgcGFja2FnaW5nIHN0ZXAuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXQpOgorICAgIHNlbGYudGFyZ2V0ID0gdGFyZ2V0CisKKyAgZGVmIGdldF9idWlsZF90YXJnZXRzKHNlbGYpOgorICAgIHJldHVybiB7c2VsZi50YXJnZXR9CisKKyAgZGVmIHBhY2thZ2Vfb3V0cHV0cyhzZWxmKToKKyAgICBwYXNzCisKKworZGVmIGdldF90YXJnZXRfb3B0aW1pemVyKHRhcmdldCwgZW5hYmxlZF9mbGFnLCBidWlsZF9jb250ZXh0LCBvcHRpbWl6ZXIpOgorICBpZiBlbmFibGVkX2ZsYWcgaW4gYnVpbGRfY29udGV4dFsnZW5hYmxlZF9idWlsZF9mZWF0dXJlcyddOgorICAgIHJldHVybiBvcHRpbWl6ZXIKKworICByZXR1cm4gTnVsbE9wdGltaXplcih0YXJnZXQpCisKKworIyBUbyBiZSB3cml0dGVuIGFzOgorIyAgICAndGFyZ2V0JzogbGFtYmRhIHRhcmdldCwgYnVpbGRfY29udGV4dCwgYXJnczogZ2V0X3RhcmdldF9vcHRpbWl6ZXIoCisjICAgICAgICB0YXJnZXQsCisjICAgICAgICAndGFyZ2V0X2VuYWJsZWRfZmxhZycsCisjICAgICAgICBidWlsZF9jb250ZXh0LAorIyAgICAgICAgVGFyZ2V0T3B0aW1pemVyKGJ1aWxkX2NvbnRleHQsIGFyZ3MpLAorIyAgICApCitPUFRJTUlaRURfQlVJTERfVEFSR0VUUyA9IGRpY3QoKQpkaWZmIC0tZ2l0IGEvY2kvdGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIucHkgYi9jaS90ZXN0X21hcHBpbmdfbW9kdWxlX3JldHJpZXZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmMxM2MwCi0tLSAvZGV2L251bGwKKysrIGIvY2kvdGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIucHkKQEAgLTAsMCArMSwxMjUgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiCitTaW1wbGUgcGFyc2luZyBjb2RlIHRvIHNjYW4gdGVzdF9tYXBwaW5nIGZpbGVzIGFuZCBkZXRlcm1pbmUgd2hpY2gKK21vZHVsZXMgYXJlIG5lZWRlZCB0byBidWlsZCBmb3IgdGhlIGdpdmVuIGxpc3Qgb2YgY2hhbmdlZCBmaWxlcy4KK1RPRE8obHVjYWZhcnNpKTogRGVkdXBsaWNhdGUgZnJvbSBhcnRpZmFjdF9oZWxwZXIucHkKKyIiIgorCitmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBTZXQsIFRleHQKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCByZQorCisjIFJlZ2V4IHRvIGV4dHJhIHRlc3QgbmFtZSBmcm9tIHRoZSBwYXRoIG9mIHRlc3QgY29uZmlnIGZpbGUuCitURVNUX05BTUVfUkVHRVggPSByJyg/Ol58LiovKShbXi9dKylcLmNvbmZpZycKKworIyBLZXkgbmFtZSBmb3IgVEVTVF9NQVBQSU5HIGltcG9ydHMKK0tFWV9JTVBPUlRTID0gJ2ltcG9ydHMnCitLRVlfSU1QT1JUX1BBVEggPSAncGF0aCcKKworIyBOYW1lIG9mIFRFU1RfTUFQUElORyBmaWxlLgorVEVTVF9NQVBQSU5HID0gJ1RFU1RfTUFQUElORycKKworIyBQYXR0ZXJuIHVzZWQgdG8gaWRlbnRpZnkgZG91YmxlLXF1b3RlZCBzdHJpbmdzIGFuZCAnLy8nLWZvcm1hdCBjb21tZW50cyBpbgorIyBURVNUX01BUFBJTkcgZmlsZSwgYnV0IG9ubHkgZG91YmxlLXF1b3RlZCBzdHJpbmdzIGFyZSBpbmNsdWRlZCB3aXRoaW4gdGhlCisjIG1hdGNoaW5nIGdyb3VwLgorX0NPTU1FTlRTX1JFID0gcmUuY29tcGlsZShyJyhcIig/OlteXCJcXF18XFwuKSpcInwoPz0vLykpKD86Ly8uKik/JykKKworCitkZWYgRmlsdGVyQ29tbWVudHModGVzdF9tYXBwaW5nX2ZpbGU6IFRleHQpIC0+IFRleHQ6CisgICIiIlJlbW92ZSBjb21tZW50cyBpbiBURVNUX01BUFBJTkcgZmlsZSB0byB2YWxpZCBmb3JtYXQuCisKKyAgT25seSAnLy8nIGlzIHJlZ2FyZGVkIGFzIGNvbW1lbnRzLgorCisgIEFyZ3M6CisgICAgdGVzdF9tYXBwaW5nX2ZpbGU6IFBhdGggdG8gYSBURVNUX01BUFBJTkcgZmlsZS4KKworICBSZXR1cm5zOgorICAgIFZhbGlkIGpzb24gc3RyaW5nIHdpdGhvdXQgY29tbWVudHMuCisgICIiIgorICByZXR1cm4gcmUuc3ViKF9DT01NRU5UU19SRSwgcidcMScsIHRlc3RfbWFwcGluZ19maWxlKQorCitkZWYgR2V0VGVzdE1hcHBpbmdzKHBhdGhzOiBTZXRbVGV4dF0sCisgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRfcGF0aHM6IFNldFtUZXh0XSkgLT4gRGljdFtUZXh0LCBEaWN0W1RleHQsIEFueV1dOgorICAiIiJHZXQgdGhlIGFmZmVjdGVkIFRFU1RfTUFQUElORyBmaWxlcy4KKworICBURVNUX01BUFBJTkcgZmlsZXMgaW4gc291cmNlIGNvZGUgYXJlIHBhY2thZ2VkIGludG8gYSBidWlsZCBhcnRpZmFjdAorICBgdGVzdF9tYXBwaW5ncy56aXBgLiBJbnNpZGUgdGhlIHppcCBmaWxlLCB0aGUgcGF0aCBvZiBlYWNoIFRFU1RfTUFQUElORyBmaWxlCisgIGlzIHByZXNlcnZlZC4gRnJvbSBhbGwgVEVTVF9NQVBQSU5HIGZpbGVzIGluIHRoZSBzb3VyY2UgY29kZSwgdGhpcyBtZXRob2QKKyAgbG9jYXRlcyB0aGUgYWZmZWN0ZWQgVEVTVF9NQVBQSU5HIGZpbGVzIGJhc2VkIG9uIHRoZSBnaXZlbiBwYXRocyBsaXN0LgorCisgIEEgVEVTVF9NQVBQSU5HIGZpbGUgbWF5IGFsc28gY29udGFpbiBgaW1wb3J0c2AgdGhhdCBpbXBvcnQgVEVTVF9NQVBQSU5HIGZpbGVzCisgIGZyb20gYSBkaWZmZXJlbnQgbG9jYXRpb24sIGUuZy4sCisgICAgImltcG9ydHMiOiBbCisgICAgICB7CisgICAgICAgICJwYXRoIjogIi4uL2ZvbGRlcjIiCisgICAgICB9CisgICAgXQorICBJbiB0aGF0IGV4YW1wbGUsIFRFU1RfTUFQUElORyBmaWxlcyBpbnNpZGUgLi4vZm9sZGVyMiAocmVsYXRpdmUgdG8gdGhlCisgIFRFU1RfTUFQUElORyBmaWxlIGNvbnRhaW5pbmcgdGhhdCBpbXBvcnRzIHNlY3Rpb24pIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yaWVzCisgIHdpbGwgYWxzbyBiZSBpbmNsdWRlZC4KKworICBBcmdzOgorICAgIHBhdGhzOiBBIHNldCBvZiBwYXRocyB3aXRoIHJlbGF0ZWQgVEVTVF9NQVBQSU5HIGZpbGVzIGZvciBnaXZlbiBjaGFuZ2VzLgorICAgIGNoZWNrZWRfcGF0aHM6IEEgc2V0IG9mIHBhdGhzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgZm9yIFRFU1RfTUFQUElORyBmaWxlCisgICAgICBhbHJlYWR5LiBUaGUgc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgcHJvY2Vzc2luZyBlYWNoIFRFU1RfTUFQUElORyBmaWxlLiBJdCdzCisgICAgICB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcCB3aGVuIHRoZSBtZXRob2QgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5LgorCisgIFJldHVybnM6CisgICAgQSBkaWN0aW9uYXJ5IG9mIFRlc3QgTWFwcGluZyBjb250YWluaW5nIHRoZSBjb250ZW50IG9mIHRoZSBhZmZlY3RlZAorICAgICAgVEVTVF9NQVBQSU5HIGZpbGVzLCBpbmRleGVkIGJ5IHRoZSBwYXRoIGNvbnRhaW5pbmcgdGhlIFRFU1RfTUFQUElORyBmaWxlLgorICAiIiIKKyAgdGVzdF9tYXBwaW5ncyA9IHt9CisKKyAgIyBTZWFyY2ggZm9yIFRFU1RfTUFQUElORyBmaWxlcyBpbiBlYWNoIG1vZGlmaWVkIHBhdGggYW5kIGl0cyBwYXJlbnQKKyAgIyBkaXJlY3Rvcmllcy4KKyAgYWxsX3BhdGhzID0gc2V0KCkKKyAgZm9yIHBhdGggaW4gcGF0aHM6CisgICAgZGlyX25hbWVzID0gcGF0aC5zcGxpdChvcy5wYXRoLnNlcCkKKyAgICBhbGxfcGF0aHMgfD0gc2V0KAorICAgICAgICBbb3MucGF0aC5zZXAuam9pbihkaXJfbmFtZXNbOmkgKyAxXSkgZm9yIGkgaW4gcmFuZ2UobGVuKGRpcl9uYW1lcykpXSkKKyAgIyBBZGQgcm9vdCBkaXJlY3RvcnkgdG8gdGhlIHBhdGhzIHRvIHNlYXJjaCBmb3IgVEVTVF9NQVBQSU5HIGZpbGUuCisgIGFsbF9wYXRocy5hZGQoJycpCisKKyAgYWxsX3BhdGhzLmRpZmZlcmVuY2VfdXBkYXRlKGNoZWNrZWRfcGF0aHMpCisgIGNoZWNrZWRfcGF0aHMgfD0gYWxsX3BhdGhzCisgICMgVHJ5IHRvIGxvYWQgVEVTVF9NQVBQSU5HIGZpbGUgaW4gZWFjaCBwb3NzaWJsZSBwYXRoLgorICBmb3IgcGF0aCBpbiBhbGxfcGF0aHM6CisgICAgdHJ5OgorICAgICAgdGVzdF9tYXBwaW5nX2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBwYXRoKSwgJ1RFU1RfTUFQUElORycpCisgICAgICAjIFJlYWQgY29udGVudCBvZiBURVNUX01BUFBJTkcgZmlsZS4KKyAgICAgIGNvbnRlbnQgPSBGaWx0ZXJDb21tZW50cyhvcGVuKHRlc3RfbWFwcGluZ19maWxlLCAiciIpLnJlYWQoKSkKKyAgICAgIHRlc3RfbWFwcGluZyA9IGpzb24ubG9hZHMoY29udGVudCkKKyAgICAgIHRlc3RfbWFwcGluZ3NbcGF0aF0gPSB0ZXN0X21hcHBpbmcKKworICAgICAgaW1wb3J0X3BhdGhzID0gc2V0KCkKKyAgICAgIGZvciBpbXBvcnRfZGV0YWlsIGluIHRlc3RfbWFwcGluZy5nZXQoS0VZX0lNUE9SVFMsIFtdKToKKyAgICAgICAgaW1wb3J0X3BhdGggPSBpbXBvcnRfZGV0YWlsW0tFWV9JTVBPUlRfUEFUSF0KKyAgICAgICAgIyBUcnkgdGhlIGltcG9ydCBwYXRoIGFzIGFic29sdXRlIHBhdGguCisgICAgICAgIGltcG9ydF9wYXRocy5hZGQoaW1wb3J0X3BhdGgpCisgICAgICAgICMgVHJ5IHRoZSBpbXBvcnQgcGF0aCBhcyByZWxhdGl2ZSBwYXRoIGJhc2VkIG9uIHRoZSB0ZXN0IG1hcHBpbmcgZmlsZQorICAgICAgICAjIGNvbnRhaW5pbmcgdGhlIGltcG9ydC4KKyAgICAgICAgbm9ybV9pbXBvcnRfcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHBhdGgsIGltcG9ydF9wYXRoKSkKKyAgICAgICAgaW1wb3J0X3BhdGhzLmFkZChub3JtX2ltcG9ydF9wYXRoKQorICAgICAgaW1wb3J0X3BhdGhzLmRpZmZlcmVuY2VfdXBkYXRlKGNoZWNrZWRfcGF0aHMpCisgICAgICBpZiBpbXBvcnRfcGF0aHM6CisgICAgICAgIGltcG9ydF90ZXN0X21hcHBpbmdzID0gR2V0VGVzdE1hcHBpbmdzKGltcG9ydF9wYXRocywgY2hlY2tlZF9wYXRocykKKyAgICAgICAgdGVzdF9tYXBwaW5ncy51cGRhdGUoaW1wb3J0X3Rlc3RfbWFwcGluZ3MpCisgICAgZXhjZXB0IChLZXlFcnJvciwgRmlsZU5vdEZvdW5kRXJyb3IsIE5vdEFEaXJlY3RvcnlFcnJvcik6CisgICAgICAjIFRFU1RfTUFQUElORyBmaWxlIGRvZXNuJ3QgZXhpc3QgaW4gcGF0aAorICAgICAgcGFzcworCisgIHJldHVybiB0ZXN0X21hcHBpbmdzCmRpZmYgLS1naXQgYS9jb2dzZXR1cC5zaCBiL2NvZ3NldHVwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTQ4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb2dzZXR1cC5zaApAQCAtMCwwICsxLDcxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFRoaXMgZmlsZSBpcyBleGVjdXRlZCBieSBidWlsZC9lbnZzZXR1cC5zaCwgYW5kIGNhbiB1c2UgYW55dGhpbmcKKyMgZGVmaW5lZCBpbiBlbnZzZXR1cC5zaC4KK2Z1bmN0aW9uIF9jcmVhdGVfb3V0X3N5bWxpbmtfZm9yX2NvZygpIHsKKyAgaWYgW1sgIiR7T1VUX0RJUn0iID09ICIiIF1dOyB0aGVuCisgICAgT1VUX0RJUj0ib3V0IgorICBmaQorCisgICMgZ2V0b3V0ZGlyIGVuc3VyZXMgcGF0aHMgYXJlIGFic29sdXRlLiBlbnZzZXR1cCBjb3VsZCBiZSBjYWxsZWQgZnJvbSBhCisgICMgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCisgIGxvY2FsIG91dGRpcj0kKGdldG91dGRpcikKKyAgaWYgW1sgLUwgIiR7b3V0ZGlyfSIgXV07IHRoZW4KKyAgICByZXR1cm4KKyAgZmkKKyAgaWYgWyAtZCAiJHtvdXRkaXJ9IiBdOyB0aGVuCisgICAgZWNobyAtZSAiXHRPdXRwdXQgZGlyZWN0b3J5ICR7b3V0ZGlyfSBjYW5ub3QgYmUgcHJlc2VudCBpbiBhIENvZyB3b3Jrc3BhY2UuIgorICAgIGVjaG8gLWUgIlx0RGVsZXRlIFwiJHtvdXRkaXJ9XCIgb3IgY3JlYXRlIGEgc3ltbGluayBmcm9tIFwiJHtvdXRkaXJ9XCIgdG8gYSBkaXJlY3Rvcnkgb3V0c2lkZSB5b3VyIHdvcmtzcGFjZS4iCisgICAgcmV0dXJuIDEKKyAgZmkKKworICBERUZBVUxUX09VVFBVVF9ESVI9IiR7SE9NRX0vLmNvZy9hbmRyb2lkLWJ1aWxkLW91dCIKKyAgbWtkaXIgLXAgJHtERUZBVUxUX09VVFBVVF9ESVJ9CisgIGxuIC1zICR7REVGQVVMVF9PVVRQVVRfRElSfSAke291dGRpcn0KK30KKworIyBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIGJ1aWxkIGVudmlyb25tZW50IHRvIGJlIGFwcHJvcHJpYXRlIGZvciBDb2cuCitmdW5jdGlvbiBfc2V0dXBfY29nX2VudigpIHsKKyAgX2NyZWF0ZV9vdXRfc3ltbGlua19mb3JfY29nCisgIGlmIFsgIiQ/IiAtZXEgIjEiIF07IHRoZW4KKyAgICBlY2hvIC1lICJcZVswOzMzbVdBUk5JTkc6XGVbMDBtIENvZyBlbnZpcm9ubWVudCBzZXR1cCBmYWlsZWQhIgorICAgIHJldHVybiAxCisgIGZpCisKKyAgZXhwb3J0IEFORFJPSURfQlVJTERfRU5WSVJPTk1FTlRfQ09ORklHPSJnb29nbGVyLWNvZyIKKworICAjIFJ1bm5pbmcgcmVwbyBjb21tYW5kIHdpdGhpbiBDb2cgd29ya3NwYWNlcyBpcyBub3Qgc3VwcG9ydGVkLCBzbyBvdmVycmlkZQorICAjIGl0IHdpdGggdGhpcyBmdW5jdGlvbi4gSWYgdGhlIHVzZXIgaXMgcnVubmluZyByZXBvIHdpdGhpbiBhIENvZyB3b3Jrc3BhY2UsCisgICMgd2UnbGwgZmFpbCB3aXRoIGFuIGVycm9yLCBvdGhlcndpc2UsIHdlIHJ1biB0aGUgb3JpZ2luYWwgcmVwbyBjb21tYW5kIHdpdGgKKyAgIyB0aGUgZ2l2ZW4gYXJncy4KKyAgaWYgISBPUklHX1JFUE9fUEFUSD1gd2hpY2ggcmVwb2A7IHRoZW4KKyAgICByZXR1cm4gMAorICBmaQorICBmdW5jdGlvbiByZXBvIHsKKyAgICBpZiBbWyAiJHtQV0R9IiA9PSAvZ29vZ2xlL2NvZy8qIF1dOyB0aGVuCisgICAgICBlY2hvICJcZVswMTszMW1FUlJPUjpcZVswbXJlcG8gY29tbWFuZCBpcyBkaXNhbGxvd2VkIHdpdGhpbiBDb2cgd29ya3NwYWNlcy4iCisgICAgICByZXR1cm4gMQorICAgIGZpCisgICAgJHtPUklHX1JFUE9fUEFUSH0gIiRAIgorICB9Cit9CisKK2lmIFtbICIke1BXRH0iICE9IC9nb29nbGUvY29nLyogXV07IHRoZW4KKyAgZWNobyAtZSAiXGVbMDE7MzFtRVJST1I6XGVbMG0gVGhpcyBzY3JpcHQgbXVzdCBiZSBydW4gZnJvbSBhIENvZyB3b3Jrc3BhY2UuIgorZmkKKworX3NldHVwX2NvZ19lbnYKZGlmZiAtLWdpdCBhL2NvbW1vbi9tYXRoLm1rIGIvY29tbW9uL21hdGgubWsKaW5kZXggMDI3MWVhOC4uODI5Y2ViNSAxMDA2NDQKLS0tIGEvY29tbW9uL21hdGgubWsKKysrIGIvY29tbW9uL21hdGgubWsKQEAgLTI1LDYgKzI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICA2MSA2MiA2MyA2NCA2NSA2NiA2NyA2OCA2OSA3MCA3MSA3MiA3MyA3NCA3NSA3NiA3NyA3OCA3OSA4MCBcCiAgICAgICAgICAgICAgICAgICAgICAgODEgODIgODMgODQgODUgODYgODcgODggODkgOTAgOTEgOTIgOTMgOTQgOTUgOTYgOTcgOTggOTkgMTAwCiBfX01BVEhfTlVNQkVSUyA6PSAwICQoX19NQVRIX1BPU19OVU1CRVJTKQorX19NQVRIX09ORV9OVU1CRVJTIDo9IDAgMSAyIDMgNCA1IDYgNyA4IDkKIAogbWF0aC1lcnJvciA9ICQoY2FsbCBwcmV0dHktZXJyb3IsJCgxKSkKIG1hdGgtZXhwZWN0IDo9CkBAIC0zNiw2ICszNywxMCBAQAogIyAgbWFrZSAtZiAke0FORFJPSURfQlVJTERfVE9QfS9idWlsZC9tYWtlL2NvbW1vbi9tYXRoLm1rIFJVTl9NQVRIX1RFU1RTPXRydWUKICMgICQoZ2V0X2J1aWxkX3ZhciBDS0FUSSkgLWYgJHtBTkRST0lEX0JVSUxEX1RPUH0vL2J1aWxkL21ha2UvY29tbW9uL21hdGgubWsgUlVOX01BVEhfVEVTVFM9dHJ1ZQogaWZkZWYgUlVOX01BVEhfVEVTVFMKKyAgaWZuZGVmIGVtcHR5CisgICAgZW1wdHkgOj0KKyAgICBzcGFjZSA6PSAkKGVtcHR5KSAkKGVtcHR5KQorICBlbmRpZgogICBNQVRIX1RFU1RfRkFJTFVSRSA6PQogICBNQVRIX1RFU1RfRVJST1IgOj0KICAgbWF0aC1lcnJvciA9ICQoaWYgJChNQVRIX1RFU1RfRVJST1IpLCwkKGV2YWwgTUFUSF9URVNUX0VSUk9SOj0kKDEpKSkKQEAgLTYxLDEzICs2NiwyOSBAQAogZW5kaWYKIAogIyBSZXR1cm5zIHRydWUgaWYgJCgxKSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIDw9IDEwMCwgb3RoZXJ3aXNlIHJldHVybnMgbm90aGluZy4KLWRlZmluZSBtYXRoX2lzX251bWJlcgorZGVmaW5lIG1hdGhfaXNfbnVtYmVyX2luXzEwMAogJChzdHJpcCBcCiAgICQoaWYgJCgxKSwsJChjYWxsIG1hdGgtZXJyb3IsQXJndW1lbnQgbWlzc2luZykpIFwKICAgJChpZiAkKHdvcmQgMiwkKDEpKSwkKGNhbGwgbWF0aC1lcnJvcixNdWx0aXBsZSB3b3JkcyBpbiBhIHNpbmdsZSBhcmd1bWVudDogJCgxKSkpIFwKICAgJChpZiAkKGZpbHRlciAkKDEpLCQoX19NQVRIX05VTUJFUlMpKSx0cnVlKSkKIGVuZGVmCiAKKyMgU2FtZSB3aXRoIG1hdGhfaXNfbnVtYmVyX2luXzEwMCwgYnV0IG5vIGxpbWl0LgorZGVmaW5lIF9tYXRoX2V4dF9pc19udW1iZXIKKyQoc3RyaXAgXAorICAkKGlmICQoMSksLCQoY2FsbCBtYXRoLWVycm9yLEFyZ3VtZW50IG1pc3NpbmcpKSBcCisgICQoaWYgJCh3b3JkIDIsJCgxKSksJChjYWxsIG1hdGgtZXJyb3IsTXVsdGlwbGUgd29yZHMgaW4gYSBzaW5nbGUgYXJndW1lbnQ6ICQoMSkpKSBcCisgICQoZXZhbCBzaG91bGRfZW1wdHk6PSQoMSkpIFwKKyAgJChmb3JlYWNoIG51bSwkKF9fTUFUSF9PTkVfTlVNQkVSUyksXAorICAgICQoZXZhbCBzaG91bGRfZW1wdHk6PSQoc3Vic3QgJChudW0pLCQoZW1wdHkpLCQoc2hvdWxkX2VtcHR5KSkpKSBcCisgICQoaWYgJChzaG91bGRfZW1wdHkpLCx0cnVlKSkKK2VuZGVmCisKKyMgUmV0dXJucyB0cnVlIGlmICQoMSkgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KK2RlZmluZSBtYXRoX2lzX251bWJlcgorJChzdHJpcCAkKGlmICQoY2FsbCBtYXRoX2lzX251bWJlcl9pbl8xMDAsJCgxKSksdHJ1ZSwkKGNhbGwgX21hdGhfZXh0X2lzX251bWJlciwkKDEpKSkpCitlbmRlZgorCiBkZWZpbmUgbWF0aF9pc196ZXJvCiAkKHN0cmlwIFwKICAgJChpZiAkKHdvcmQgMiwkKDEpKSwkKGNhbGwgbWF0aC1lcnJvcixNdWx0aXBsZSB3b3JkcyBpbiBhIHNpbmdsZSBhcmd1bWVudDogJCgxKSkpIFwKQEAgLTc2LDYgKzk3LDcgQEAKIAogJChjYWxsIG1hdGgtZXhwZWN0LXRydWUsKGNhbGwgbWF0aF9pc19udW1iZXIsMCkpCiAkKGNhbGwgbWF0aC1leHBlY3QtdHJ1ZSwoY2FsbCBtYXRoX2lzX251bWJlciwyKSkKKyQoY2FsbCBtYXRoLWV4cGVjdC10cnVlLChjYWxsIG1hdGhfaXNfbnVtYmVyLDIwMjQxMikpCiAkKGNhbGwgbWF0aC1leHBlY3QtZmFsc2UsKGNhbGwgbWF0aF9pc19udW1iZXIsZm9vKSkKICQoY2FsbCBtYXRoLWV4cGVjdC1mYWxzZSwoY2FsbCBtYXRoX2lzX251bWJlciwtMSkpCiAkKGNhbGwgbWF0aC1leHBlY3QtZXJyb3IsKGNhbGwgbWF0aF9pc19udW1iZXIsMSAyKSxNdWx0aXBsZSB3b3JkcyBpbiBhIHNpbmdsZSBhcmd1bWVudDogMSAyKQpAQCAtODgsNyArMTEwLDcgQEAKICQoY2FsbCBtYXRoLWV4cGVjdC1lcnJvciwoY2FsbCBtYXRoX2lzX3plcm8sbm8gMiksTXVsdGlwbGUgd29yZHMgaW4gYSBzaW5nbGUgYXJndW1lbnQ6IG5vIDIpCiAKIGRlZmluZSBfbWF0aF9jaGVja192YWxpZAotJChpZiAkKGNhbGwgbWF0aF9pc19udW1iZXIsJCgxKSksLCQoY2FsbCBtYXRoLWVycm9yLE9ubHkgbm9uLW5lZ2F0aXZlIGludGVnZXJzIDw9IDEwMCBhcmUgc3VwcG9ydGVkIChub3QgJCgxKSkpKQorJChpZiAkKGNhbGwgbWF0aF9pc19udW1iZXJfaW5fMTAwLCQoMSkpLCwkKGNhbGwgbWF0aC1lcnJvcixPbmx5IG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyA8PSAxMDAgYXJlIHN1cHBvcnRlZCAobm90ICQoMSkpKSkKIGVuZGVmCiAKICQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBfbWF0aF9jaGVja192YWxpZCwwKSkKQEAgLTExMywxOCArMTM1LDgxIEBACiAkKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgaW50X3JhbmdlX2xpc3QsMiwxKSwpCiAkKGNhbGwgbWF0aC1leHBlY3QtZXJyb3IsKGNhbGwgaW50X3JhbmdlX2xpc3QsMSwxMDEpLE9ubHkgbm9uLW5lZ2F0aXZlIGludGVnZXJzIDw9IDEwMCBhcmUgc3VwcG9ydGVkIChub3QgMTAxKSkKIAorIyBTcGxpdCBhbiBpbnRlZ2VyIGludG8gYSBsaXN0IG9mIGRpZ2l0cworZGVmaW5lIF9tYXRoX251bWJlcl90b19saXN0CiskKHN0cmlwIFwKKyAgJChpZiAkKGNhbGwgX21hdGhfZXh0X2lzX251bWJlciwkKDEpKSwsXAorICAgICQoY2FsbCBtYXRoLWVycm9yLE9ubHkgbm9uLW5lZ2F0aXZlIGludGVnZXJzIGFyZSBzdXBwb3J0ZWQgKG5vdCAkKDEpKSkpIFwKKyAgJChldmFsIG51bV9saXN0Oj0kKDEpKSBcCisgICQoZm9yZWFjaCBudW0sJChfX01BVEhfT05FX05VTUJFUlMpLFwKKyAgICAkKGV2YWwgbnVtX2xpc3Q6PSQoc3Vic3QgJChudW0pLCQoc3BhY2UpJChudW0pLCQobnVtX2xpc3QpKSkpIFwKKyAgJChpZiAkKGZpbHRlciAkKHdvcmRzICQobnVtX2xpc3QpKSwkKF9fTUFUSF9PTkVfTlVNQkVSUykpLCxcCisgICAgJChjYWxsIG1hdGgtZXJyb3IsT25seSBub24tbmVnYXRpdmUgaW50ZWdlcnMgd2l0aCBsZXNzIHRoYW4gOSBkaWdpdHMgYXJlIHN1cHBvcnRlZCAobm90ICQoMSkpKSkgXAorICAkKGlmICQoZmlsdGVyIDAsJCh3b3JkIDEsJChudW1fbGlzdCkpKSxcCisgICAgJChjYWxsIG1hdGgtZXJyb3IsT25seSBub24tbmVnYXRpdmUgaW50ZWdlcnMgd2l0aG91dCBsZWFkaW5nIHplcm9zIGFyZSBzdXBwb3J0ZWQgKG5vdCAkKDEpKSkpIFwKKyAgJChudW1fbGlzdCkpCitlbmRlZgorCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgX21hdGhfbnVtYmVyX3RvX2xpc3QsMTIzKSwxIDIgMykKKyQoY2FsbCBtYXRoLWV4cGVjdC1lcnJvciwoY2FsbCBfbWF0aF9udW1iZXJfdG9fbGlzdCwxMjMgNDU2KSxNdWx0aXBsZSB3b3JkcyBpbiBhIHNpbmdsZSBhcmd1bWVudDogMTIzIDQ1NikKKyQoY2FsbCBtYXRoLWV4cGVjdC1lcnJvciwoY2FsbCBfbWF0aF9udW1iZXJfdG9fbGlzdCwtMTIzKSxPbmx5IG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyBhcmUgc3VwcG9ydGVkIChub3QgLTEyMykpCiskKGNhbGwgbWF0aC1leHBlY3QtZXJyb3IsKGNhbGwgX21hdGhfbnVtYmVyX3RvX2xpc3QsMDAyKSxPbmx5IG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyB3aXRob3V0IGxlYWRpbmcgemVyb3MgYXJlIHN1cHBvcnRlZCAobm90IDAwMikpCiskKGNhbGwgbWF0aC1leHBlY3QtZXJyb3IsKGNhbGwgX21hdGhfbnVtYmVyX3RvX2xpc3QsMTIzNDU2Nzg5MCksT25seSBub24tbmVnYXRpdmUgaW50ZWdlcnMgd2l0aCBsZXNzIHRoYW4gOSBkaWdpdHMgYXJlIHN1cHBvcnRlZCAobm90IDEyMzQ1Njc4OTApKQorCisjIENvbXBhcmUgMS1kaWdpdCBpbnRlZ2VyICQoMSkgYW5kICQoMikuCisjIFJldHVybnMgMSBpZiAkKDEpID4gJCgyKSwgLTEgaWYgJCgxKSA8ICQoMiksIG5vdGhpbmcgaWYgZXF1YWxzLgorZGVmaW5lIF9tYXRoXzFkaWdpdF9jb21wCiskKHN0cmlwIFwKKyAgJChpZiAkKGZpbHRlciAkKDEpLCQoMikpLCxcCisgICAgJChpZiAkKGZpbHRlciAkKDEpLCQoZmlyc3R3b3JkICQoZmlsdGVyICQoMSkgJCgyKSwkKF9fTUFUSF9PTkVfTlVNQkVSUykpKSksLTEsMSkpKQorZW5kZWYKKworJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIF9tYXRoXzFkaWdpdF9jb21wLDEsMSkpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgX21hdGhfMWRpZ2l0X2NvbXAsMCw5KSwtMSkKKyQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBfbWF0aF8xZGlnaXRfY29tcCwzLDEpLDEpCisKKyMgQ29tcGFyZSB0aGUgc2FtZSAkKDMpLWRpZ2l0LWxlbmd0aCBpbnRlZ2VycyAkKDEpIGFuZCAkKDIpIHRoYXQgYXJlIHNwbGl0IGludG8gYSBsaXN0IG9mIGRpZ2l0cy4KKyMgUmV0dXJucyAxIGlmICQoMSkgPiAkKDIpLCAtMSBpZiAkKDEpIDwgJCgyKSwgbm90aGluZyBpZiBlcXVhbHMuCitkZWZpbmUgX21hdGhfbGlzdF9jb21wCiskKHN0cmlwIFwKKyAgJChldmFsIGFuczo9KSBcCisgICQoZm9yZWFjaCBudW0sJChjYWxsIGludF9yYW5nZV9saXN0LDEsJCgzKSksXAorICAgICQoaWYgJChhbnMpLCwkKGV2YWwgYW5zOj0kKGNhbGwgX21hdGhfMWRpZ2l0X2NvbXAsJCh3b3JkICQobnVtKSwkKDEpKSwkKHdvcmQgJChudW0pLCQoMikpKSkpKSBcCisgICQoYW5zKSkKK2VuZGVmCisKKyMgQ29tcGFyZSBhbnkgdHdvIG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyAkKDEpIGFuZCAkKDIpLgorIyBSZXR1cm5zIDEgaWYgJCgxKSA+ICQoMiksIC0xIGlmICQoMSkgPCAkKDIpLCBub3RoaW5nIGlmIGVxdWFscy4KK2RlZmluZSBfbWF0aF9leHRfY29tcAorJChzdHJpcCBcCisgICQoZXZhbCBudW1fbGlzdDE6PSQoY2FsbCBfbWF0aF9udW1iZXJfdG9fbGlzdCwkKDEpKSkgXAorICAkKGV2YWwgbGVuMTo9JCh3b3JkcyAkKG51bV9saXN0MSkpKSBcCisgICQoZXZhbCBudW1fbGlzdDI6PSQoY2FsbCBfbWF0aF9udW1iZXJfdG9fbGlzdCwkKDIpKSkgXAorICAkKGV2YWwgbGVuMjo9JCh3b3JkcyAkKG51bV9saXN0MikpKSBcCisgICQoZXZhbCBjb21wOj0kKGNhbGwgX21hdGhfMWRpZ2l0X2NvbXAsJChsZW4xKSwkKGxlbjIpKSkgXAorICAkKGlmICQoY29tcCksJChjb21wKSwkKGNhbGwgX21hdGhfbGlzdF9jb21wLCQobnVtX2xpc3QxKSwkKG51bV9saXN0MiksJChsZW4xKSkpKQorZW5kZWYKKworJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIF9tYXRoX2V4dF9jb21wLDUsMTApLC0xKQorJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIF9tYXRoX2V4dF9jb21wLDEyMzQ1LDEyMzQ1KSkKKyQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBfbWF0aF9leHRfY29tcCw1MDAsNSksMSkKKyQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBfbWF0aF9leHRfY29tcCwyMDI0MDQsMjAyNTA0KSwtMSkKIAogIyBSZXR1cm5zIHRoZSBncmVhdGVyIG9mICQxIG9yICQyLgotIyBJZiAkMSBvciAkMiBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyIDw9IDEwMCwgdGhlbiBhbiBlcnJvciBpcyBnZW5lcmF0ZWQuCisjIElmICQxIG9yICQyIGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIsIHRoZW4gYW4gZXJyb3IgaXMgZ2VuZXJhdGVkLgogZGVmaW5lIG1hdGhfbWF4Ci0kKHN0cmlwICQoY2FsbCBfbWF0aF9jaGVja192YWxpZCwkKDEpKSAkKGNhbGwgX21hdGhfY2hlY2tfdmFsaWQsJCgyKSkgXAotICAkKGxhc3R3b3JkICQoZmlsdGVyICQoMSkgJCgyKSwkKF9fTUFUSF9OVU1CRVJTKSkpKQorJChzdHJpcCBcCisgICQoaWYgJChmaWx0ZXIgdHJ1ZXRydWUsJChjYWxsIG1hdGhfaXNfbnVtYmVyX2luXzEwMCwkKDEpKSQoY2FsbCBtYXRoX2lzX251bWJlcl9pbl8xMDAsJCgyKSkpLFwKKyAgICAkKGxhc3R3b3JkICQoZmlsdGVyICQoMSkgJCgyKSwkKF9fTUFUSF9OVU1CRVJTKSkpLFwKKyAgICAkKGlmICQoZmlsdGVyIDEsJChjYWxsIF9tYXRoX2V4dF9jb21wLCQoMSksJCgyKSkpLCQoMSksJCgyKSkpKQogZW5kZWYKIAogIyBSZXR1cm5zIHRoZSBsZXNzZXIgb2YgJDEgb3IgJDIuCiBkZWZpbmUgbWF0aF9taW4KLSQoc3RyaXAgJChjYWxsIF9tYXRoX2NoZWNrX3ZhbGlkLCQoMSkpICQoY2FsbCBfbWF0aF9jaGVja192YWxpZCwkKDIpKSBcCi0gICQoZmlyc3R3b3JkICQoZmlsdGVyICQoMSkgJCgyKSwkKF9fTUFUSF9OVU1CRVJTKSkpKQorJChzdHJpcCBcCisgICQoaWYgJChmaWx0ZXIgdHJ1ZXRydWUsJChjYWxsIG1hdGhfaXNfbnVtYmVyX2luXzEwMCwkKDEpKSQoY2FsbCBtYXRoX2lzX251bWJlcl9pbl8xMDAsJCgyKSkpLFwKKyAgICAkKGZpcnN0d29yZCAkKGZpbHRlciAkKDEpICQoMiksJChfX01BVEhfTlVNQkVSUykpKSxcCisgICAgJChpZiAkKGZpbHRlciAtMSwkKGNhbGwgX21hdGhfZXh0X2NvbXAsJCgxKSwkKDIpKSksJCgxKSwkKDIpKSkpCiBlbmRlZgogCiAkKGNhbGwgbWF0aC1leHBlY3QtZXJyb3IsKGNhbGwgbWF0aF9tYXgpLEFyZ3VtZW50IG1pc3NpbmcpCkBAIC0xNDIsNiArMjI3LDE1IEBACiAkKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbWF0aF9taW4sNywzMiksNykKICQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBtYXRoX21pbiwzMiw3KSw3KQogCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbWF0aF9tYXgsMzI3NTksNyksMzI3NTkpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbWF0aF9tYXgsNywzMjc1OSksMzI3NTkpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbWF0aF9tYXgsMjAyNDA0LDIwMjUwNSksMjAyNTA1KQorJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIG1hdGhfbWF4LDIwMjQwNCwyMDI0MDQpLDIwMjQwNCkKKyQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBtYXRoX21pbiw4OTA4NTI3LDMyKSwzMikKKyQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBtYXRoX21pbiwzMiw4OTA4NTI3KSwzMikKKyQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBtYXRoX21pbiwyMDI0MDQsMjAyNTA1KSwyMDI0MDQpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbWF0aF9taW4sMjAyNDA0LDIwMjQwNCksMjAyNDA0KQorCiBkZWZpbmUgbWF0aF9ndF9vcl9lcQogJChpZiAkKGZpbHRlciAkKDEpLCQoY2FsbCBtYXRoX21heCwkKDEpLCQoMikpKSx0cnVlKQogZW5kZWYKQEAgLTE1MCw2ICsyNDQsMTAgQEAKICQoaWYgJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJCgyKSwkKDEpKSwsdHJ1ZSkKIGVuZGVmCiAKK2RlZmluZSBtYXRoX2x0X29yX2VxCiskKGlmICQoY2FsbCBtYXRoX2d0X29yX2VxLCQoMiksJCgxKSksdHJ1ZSkKK2VuZGVmCisKIGRlZmluZSBtYXRoX2x0CiAkKGlmICQoY2FsbCBtYXRoX2d0X29yX2VxLCQoMSksJCgyKSksLHRydWUpCiBlbmRlZgpAQCAtMTYwLDEwICsyNTgsMTcgQEAKICQoY2FsbCBtYXRoLWV4cGVjdC10cnVlLChjYWxsIG1hdGhfZ3QsIDQsIDMpKQogJChjYWxsIG1hdGgtZXhwZWN0LWZhbHNlLChjYWxsIG1hdGhfZ3QsIDUsIDUpKQogJChjYWxsIG1hdGgtZXhwZWN0LWZhbHNlLChjYWxsIG1hdGhfZ3QsIDYsIDcpKQorJChjYWxsIG1hdGgtZXhwZWN0LXRydWUsKGNhbGwgbWF0aF9sdF9vcl9lcSwgMTEsIDExKSkKKyQoY2FsbCBtYXRoLWV4cGVjdC1mYWxzZSwoY2FsbCBtYXRoX2x0X29yX2VxLCAyNSwgMTUpKQorJChjYWxsIG1hdGgtZXhwZWN0LXRydWUsKGNhbGwgbWF0aF9sdF9vcl9lcSwgOSwgMTYpKQogJChjYWxsIG1hdGgtZXhwZWN0LWZhbHNlLChjYWxsIG1hdGhfbHQsIDEsIDApKQogJChjYWxsIG1hdGgtZXhwZWN0LWZhbHNlLChjYWxsIG1hdGhfbHQsIDgsIDgpKQogJChjYWxsIG1hdGgtZXhwZWN0LXRydWUsKGNhbGwgbWF0aF9sdCwgMTAsIDExKSkKIAorJChjYWxsIG1hdGgtZXhwZWN0LXRydWUsKGNhbGwgbWF0aF9ndF9vcl9lcSwgMjU3MzkwNCwgMjU3MzkwMCkpCiskKGNhbGwgbWF0aC1leHBlY3QtdHJ1ZSwoY2FsbCBtYXRoX2d0X29yX2VxLCAxMjM0NSwgMTIzNDUpKQorJChjYWxsIG1hdGgtZXhwZWN0LWZhbHNlLChjYWxsIG1hdGhfZ3Rfb3JfZXEsIDU2LCAyNzgwKSkKKwogIyAkMSBpcyB0aGUgdmFyaWFibGUgbmFtZSB0byBpbmNyZW1lbnQKIGRlZmluZSBpbmNfYW5kX3ByaW50CiAkKHN0cmlwICQoZXZhbCAkKDEpIDo9ICQoJCgxKSkgLikkKHdvcmRzICQoJCgxKSkpKQpAQCAtMTkyLDYgKzI5Nyw3IEBACiAkKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbnVtYmVyc19sZXNzX3RoYW4sMywwIDIgMSAzKSwwIDIgMSkKICQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBudW1iZXJzX2xlc3NfdGhhbiw0LDAgMiAxIDMpLDAgMiAxIDMpCiAkKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbnVtYmVyc19sZXNzX3RoYW4sMywwIDIgMSAzIDIpLDAgMiAxIDIpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbnVtYmVyc19sZXNzX3RoYW4sMTAwLDAgMTAwMCA1MCAxMDEgMTAwKSwwIDUwKQogCiAjIFJldHVybnMgdGhlIHdvcmRzIGluICQyIHRoYXQgYXJlIG51bWJlcnMgYW5kIGFyZSBncmVhdGVyIG9yIGVxdWFsIHRvICQxCiBkZWZpbmUgbnVtYmVyc19ncmVhdGVyX29yX2VxdWFsX3RvCkBAIC0yMDksOCArMzE1LDkgQEAKICQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBudW1iZXJzX2dyZWF0ZXJfb3JfZXF1YWxfdG8sMCwwIDIgMSAzKSwwIDIgMSAzKQogJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIG51bWJlcnNfZ3JlYXRlcl9vcl9lcXVhbF90bywxLDAgMiAxIDMgMiksMiAxIDMgMikKIAotX0lOVF9MSU1JVF9XT1JEUyA6PSAkKGZvcmVhY2ggYSx4IHgsJChmb3JlYWNoIGIseCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCxcCi0gICQoZm9yZWFjaCBjLHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHgseCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCkpKQorIyAxMCwwMDEgPSAxMCAqKiA0ICsgMSwgY29udGFpbnMgMTAsMDAxIHgncywgc28gMSBtb3JlIHRoYW4gMTAsMDAwIChmdXR1cmUpIEFQSSBsZXZlbAorX0lOVF9MSU1JVF9XT1JEUyA6PSB4ICQoZm9yZWFjaCBhLDAgMSAyIDMgNCA1IDYgNyA4IDksJChmb3JlYWNoIGIsMCAxIDIgMyA0IDUgNiA3IDggOSxcCisgICQoZm9yZWFjaCBjLDAgMSAyIDMgNCA1IDYgNyA4IDkseCB4IHggeCB4IHggeCB4IHggeCkpKQogCiBkZWZpbmUgX2ludF9lbmNvZGUKICQoaWYgJChmaWx0ZXIgJCh3b3JkcyB4ICQoX0lOVF9MSU1JVF9XT1JEUykpLCQod29yZHMgJCh3b3JkbGlzdCAxLCQoMSkseCAkKF9JTlRfTElNSVRfV09SRFMpKSkpLFwKZGlmZiAtLWdpdCBhL2NvcmUvQlVJTEQuYmF6ZWwgYi9jb3JlL0JVSUxELmJhemVsCmluZGV4IDNlNjllNjIuLmY0ODY5ZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvQlVJTEQuYmF6ZWwKKysrIGIvY29yZS9CVUlMRC5iYXplbApAQCAtMSw0ICsxLDI4IEBACisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKwogIyBFeHBvcnQgdHJhZGVmZWQgdGVtcGxhdGVzIGZvciB0ZXN0cy4KIGV4cG9ydHNfZmlsZXMoCiAgICAgZ2xvYihbIioueG1sIl0pLAogKQorCisjIEV4cG9ydCBwcm9ndWFyZCBmbGFnIGZpbGVzIGZvciByOC4KK2ZpbGVncm91cCgKKyAgICBuYW1lID0gImdsb2JhbF9wcm9ndWFyZF9mbGFncyIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgInByb2d1YXJkLmZsYWdzIiwKKyAgICAgICAgInByb2d1YXJkX2Jhc2ljX2tlZXBzLmZsYWdzIiwKKyAgICBdLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKykKZGlmZiAtLWdpdCBhL2NvcmUvTWFrZWZpbGUgYi9jb3JlL01ha2VmaWxlCmluZGV4IDQyMDg2NzIuLjdkN2I5ZTcgMTAwNjQ0Ci0tLSBhL2NvcmUvTWFrZWZpbGUKKysrIGIvY29yZS9NYWtlZmlsZQpAQCAtMTYsNiArMTYsOTQgQEAKIE9ETV9ETEtNX05PVElDRV9ERVBTIDo9CiBTWVNURU1fRExLTV9OT1RJQ0VfREVQUyA6PQogCisKKyMgSU1BR0VTX1RPX0JVSUxEIGlzIGEgbGlzdCBvZiB0aGUgcGFydGl0aW9uIC5pbWcgZmlsZXMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuCitJTUFHRVNfVE9fQlVJTEQ6PQoraWZuZXEgKCQoQlVJTERJTkdfQk9PVF9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gYm9vdAorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX0NBQ0hFX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSBjYWNoZQorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX0RFQlVHX0JPT1RfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IGRlYnVnX2Jvb3QKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19ERUJVR19WRU5ET1JfQk9PVF9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gZGVidWdfdmVuZG9yX2Jvb3QKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19JTklUX0JPT1RfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IGluaXRfYm9vdAorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX09ETV9ETEtNX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSBvZG1fZGxrbQorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX09ETV9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gb2RtCitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfUFJPRFVDVF9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gcHJvZHVjdAorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX1JBTURJU0tfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IHJhbWRpc2sKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19SRUNPVkVSWV9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gcmVjb3ZlcnkKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19TVVBFUl9FTVBUWV9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gc3VwZXJfZW1wdHkKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19TWVNURU1fRExLTV9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gc3lzdGVtX2Rsa20KK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19TWVNURU1fRVhUX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSBzeXN0ZW1fZXh0CitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfU1lTVEVNX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSBzeXN0ZW0KK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19TWVNURU1fT1RIRVJfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IHN5c3RlbV9vdGhlcgorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX1VTRVJEQVRBX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSB1c2VyZGF0YQorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX1ZCTUVUQV9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gdmJtZXRhCitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfVkVORE9SX0JPT1RfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IHZlbmRvcl9ib290CitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfVkVORE9SX0RMS01fSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IHZlbmRvcl9kbGttCitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfVkVORE9SX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSB2ZW5kb3IKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19WRU5ET1JfS0VSTkVMX0JPT1RfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IHZlbmRvcl9rZXJuZWxfYm9vdAorZW5kaWYKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBHZXQgdGhlIG1vZHVsZSBuYW1lcyBzdWl0YWJsZSBmb3IgQUxMX01PRFVMRVMuKiB2YXJpYWJsZXMgdGhhdCBhcmUgaW5zdGFsbGVkCisjIGZvciBhIGdpdmVuIHBhcnRpdGlvbgorIworIyAkKDEpOiBQYXJ0aXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkZWZpbmUgcmVnaXN0ZXItbmFtZXMtZm9yLXBhcnRpdGlvbgorJChzb3J0ICQoZm9yZWFjaCBtLCQocHJvZHVjdF9NT0RVTEVTKSxcCisJJChpZiAkKGZpbHRlciAkKFBST0RVQ1RfT1VUKS8kKHN0cmlwICQoMSkpLyUsICQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSwgXAorCQkkKG0pCisJKSBcCispKQorZW5kZWYKKworCisjIFJlbGVhc2UgJiBBY29uZmlnIEZsYWdzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9wYWNrYWdpbmcvZmxhZ3MubWsKKworCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIERlZmluZSBydWxlcyB0byBjb3B5IFBST0RVQ1RfQ09QWV9GSUxFUyBkZWZpbmVkIGJ5IHRoZSBwcm9kdWN0LgogIyBQUk9EVUNUX0NPUFlfRklMRVMgY29udGFpbnMgd29yZHMgbGlrZSA8c291cmNlIGZpbGU+OjxkZXN0IGZpbGU+Wzo8b3duZXI+XS4KQEAgLTE5OSw2ICsyODcsMTEgQEAKIGVuZGlmCiBlbmRpZgogCisjIERvIHRoaXMgZWFybHkgYmVjYXVzZSBzeXNwcm9wLm1rIGRlcGVuZHMgb24gQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRV9GT1JfVUZGRF9HQy4KK2lmZXEgKGRlZmF1bHQsJChFTkFCTEVfVUZGRF9HQykpCitCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFX0ZPUl9VRkZEX0dDIDo9ICQoT1VUX0RJUikvc29vbmcvZGV4cHJlb3B0L2tlcm5lbF92ZXJzaW9uX2Zvcl91ZmZkX2djLnR4dAorZW5kaWYgIyBFTkFCTEVfVUZGRF9HQworCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zeXNwcm9wLm1rCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjc1LDYgKzM2OCwxMCBAQAogKQogSU5URVJOQUxfVkVORE9SX1JBTURJU0tfRlJBR01FTlRTICs9ICQoQk9BUkRfVkVORE9SX1JBTURJU0tfRlJBR01FTlRTKQogCitpZm5lcSAoJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspLCkKK0lOVEVSTkFMX1ZFTkRPUl9SQU1ESVNLX0ZSQUdNRU5UUyArPSAxNksKK2VuZGlmCisKICMgU3RyaXAgdGhlIGxpc3QgaW4gY2FzZSBvZiBhbnkgd2hpdGVzcGFjZS4KIElOVEVSTkFMX1ZFTkRPUl9SQU1ESVNLX0ZSQUdNRU5UUyA6PSBcCiAgICQoc3RyaXAgJChJTlRFUk5BTF9WRU5ET1JfUkFNRElTS19GUkFHTUVOVFMpKQpAQCAtMzY0LDEzICs0NjEsMTEgQEAKIAkgIHVuemlwIC1xb0REIC1kICQkKFBSSVZBVEVfTU9EVUxFX0RJUikgJCQoUFJJVkFURV9NT0RVTEVfQVJDSElWRSk7IFwKIAkgIG1rZGlyIC1wICQkKFBSSVZBVEVfT1VUUFVUX0RJUikvbGliOyBcCiAJICBjcCAtciAgJCgzKS8kKERFUE1PRF9TVEFHSU5HX1NVQkRJUikvJCgyKS9saWIvbW9kdWxlcyAkJChQUklWQVRFX09VVFBVVF9ESVIpL2xpYi87IFwKLQkgIGZpbmQgJCQoUFJJVkFURV9NT0RVTEVfRElSKSAtdHlwZSBmIC1uYW1lICoua28gfCB4YXJncyBiYXNlbmFtZSAtYSA+ICQkKFBSSVZBVEVfTE9BRF9GSUxFKTsgXAorCSAgZmluZCAkJChQUklWQVRFX01PRFVMRV9ESVIpIC10eXBlIGYgLW5hbWUgJyoua28nIHwgeGFyZ3MgYmFzZW5hbWUgLWEgPiAkJChQUklWQVRFX0xPQURfRklMRSk7IFwKIAkpCiAJJChpZiAkKDEpLFwKIAkgIGNwICQkKFBSSVZBVEVfTU9EVUxFUykgJCQoUFJJVkFURV9NT0RVTEVfRElSKS87IFwKLQkgIGZvciBNT0RVTEUgaW4gJCQoUFJJVkFURV9MT0FEX01PRFVMRVMpOyBkbyBcCi0JICAgIGJhc2VuYW1lICQkJCRNT0RVTEUgPj4gJCQoUFJJVkFURV9MT0FEX0ZJTEUpOyBcCi0JICBkb25lOyBcCisJICBpZiBbIC1uICIkJChQUklWQVRFX0xPQURfTU9EVUxFUykiIF07IHRoZW4gYmFzZW5hbWUgLWEgJCQoUFJJVkFURV9MT0FEX01PRFVMRVMpOyBmaSA+ICQkKFBSSVZBVEVfTE9BRF9GSUxFKTsgXAogCSkKIAkjIFRoZSBsbiAtc2YgKyBmaW5kIC1kZWxldGUgc2VxdWVuY2UgaXMgdG8gcmVtb3ZlIGFueSBtb2R1bGVzIGluCiAJIyBQUklWQVRFX0VYVFJBX01PRFVMRVMgd2hpY2ggaGF2ZSBzYW1lIGJhc2VuYW1lIGFzIE1PRFVMRVMgaW4gUFJJVkFURV9NT0RVTEVTCkBAIC01MzAsNiArNjI1LDI0IEBACiAgICAgJChjYWxsIGNvcHktbWFueS1maWxlcywkKGNhbGwgbW9kdWxlLWxvYWQtbGlzdC1jb3B5LXBhdGhzLCQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZlbmRvcl9jaGFyZ2VyX21vZHVsZV9saXN0JChfc2VwKSQoX2t2ZXIpKSwkKEJPQVJEX1ZFTkRPUl9DSEFSR0VSX0tFUk5FTF9NT0RVTEVTJChfc2VwKSQoX2t2ZXIpKSwkKEJPQVJEX1ZFTkRPUl9DSEFSR0VSX0tFUk5FTF9NT0RVTEVTX0xPQUQkKF9zZXApJChfa3ZlcikpLG1vZHVsZXMubG9hZC5jaGFyZ2VyLCQoVEFSR0VUX09VVF9WRU5ET1IpKSkpCiBlbmRlZgogCisjICQoMSk6IGtlcm5lbCBtb2R1bGUgZGlyZWN0b3J5IG5hbWUgKHRvcCBpcyBhbiBvdXQgb2YgYmFuZCB2YWx1ZSBmb3Igbm8gZGlyZWN0b3J5KQorZGVmaW5lIGJ1aWxkLXZlbmRvci1yYW1kaXNrLWNoYXJnZXItbG9hZAorJChpZiAkKGZpbHRlciB0b3AsJCgxKSksXAorICAkKGV2YWwgX2t2ZXIgOj0pJChldmFsIF9zZXAgOj0pLFwKKyAgJChldmFsIF9rdmVyIDo9ICQoMSkpJChldmFsIF9zZXAgOj1fKSlcCisgICQoaWYgJChCT0FSRF9WRU5ET1JfUkFNRElTS19DSEFSR0VSX0tFUk5FTF9NT0RVTEVTX0xPQUQkKF9zZXApJChfa3ZlcikpLFwKKyAgICAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQoY2FsbCBtb2R1bGUtbG9hZC1saXN0LWNvcHktcGF0aHMsJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsdmVuZG9yX3JhbWRpc2tfY2hhcmdlcl9tb2R1bGVfbGlzdCQoX3NlcCkkKF9rdmVyKSksJChCT0FSRF9WRU5ET1JfUkFNRElTS19LRVJORUxfTU9EVUxFUyQoX3NlcCkkKF9rdmVyKSksJChCT0FSRF9WRU5ET1JfUkFNRElTS19DSEFSR0VSX0tFUk5FTF9NT0RVTEVTX0xPQUQkKF9zZXApJChfa3ZlcikpLG1vZHVsZXMubG9hZC5jaGFyZ2VyLCQoVEFSR0VUX1ZFTkRPUl9SQU1ESVNLX09VVCkpKSkKK2VuZGVmCisKKyMgJCgxKToga2VybmVsIG1vZHVsZSBkaXJlY3RvcnkgbmFtZSAodG9wIGlzIGFuIG91dCBvZiBiYW5kIHZhbHVlIGZvciBubyBkaXJlY3RvcnkpCitkZWZpbmUgYnVpbGQtdmVuZG9yLWtlcm5lbC1yYW1kaXNrLWNoYXJnZXItbG9hZAorJChpZiAkKGZpbHRlciB0b3AsJCgxKSksXAorICAkKGV2YWwgX2t2ZXIgOj0pJChldmFsIF9zZXAgOj0pLFwKKyAgJChldmFsIF9rdmVyIDo9ICQoMSkpJChldmFsIF9zZXAgOj1fKSlcCisgICQoaWYgJChCT0FSRF9WRU5ET1JfS0VSTkVMX1JBTURJU0tfQ0hBUkdFUl9LRVJORUxfTU9EVUxFU19MT0FEJChfc2VwKSQoX2t2ZXIpKSxcCisgICAgJChjYWxsIGNvcHktbWFueS1maWxlcywkKGNhbGwgbW9kdWxlLWxvYWQtbGlzdC1jb3B5LXBhdGhzLCQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZlbmRvcl9rZXJuZWxfcmFtZGlza19jaGFyZ2VyX21vZHVsZV9saXN0JChfc2VwKSQoX2t2ZXIpKSwkKEJPQVJEX1ZFTkRPUl9LRVJORUxfUkFNRElTS19LRVJORUxfTU9EVUxFUyQoX3NlcCkkKF9rdmVyKSksJChCT0FSRF9WRU5ET1JfS0VSTkVMX1JBTURJU0tfQ0hBUkdFUl9LRVJORUxfTU9EVUxFU19MT0FEJChfc2VwKSQoX2t2ZXIpKSxtb2R1bGVzLmxvYWQuY2hhcmdlciwkKFRBUkdFVF9WRU5ET1JfS0VSTkVMX1JBTURJU0tfT1VUKSkpKQorZW5kZWYKKwogaWZuZXEgKCQoQlVJTERJTkdfVkVORE9SX0JPT1RfSU1BR0UpLHRydWUpCiAgICMgSWYgdGhlcmUgaXMgbm8gdmVuZG9yIGJvb3QgcGFydGl0aW9uLCBzdG9yZSB2ZW5kb3IgcmFtZGlzayBrZXJuZWwgbW9kdWxlcyBpbiB0aGUKICAgIyBib290IHJhbWRpc2suCkBAIC01NDcsNiArNjYwLDEyIEBACiAgIGVuZGlmCiBlbmRpZgogCitpZm5lcSAoJChCT0FSRF9ET19OT1RfU1RSSVBfR0VORVJJQ19SQU1ESVNLX01PRFVMRVMpLHRydWUpCisgIEdFTkVSSUNfUkFNRElTS19TVFJJUFBFRF9NT0RVTEVfU1RBR0lOR19ESVIgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZGVwbW9kX2dlbmVyaWNfcmFtZGlza19rZXJuZWxfc3RyaXBwZWQpCitlbHNlCisgIEdFTkVSSUNfUkFNRElTS19TVFJJUFBFRF9NT0RVTEVfU1RBR0lOR19ESVIgOj0KK2VuZGlmCisKIGlmbmVxICgkKEJPQVJEX0RPX05PVF9TVFJJUF9SRUNPVkVSWV9NT0RVTEVTKSx0cnVlKQogCVJFQ09WRVJZX1NUUklQUEVEX01PRFVMRV9TVEFHSU5HX0RJUiA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxkZXBtb2RfcmVjb3Zlcnlfc3RyaXBwZWQpCiBlbHNlCkBAIC01OTUsMTEgKzcxNCwxMyBAQAogICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLXZlbmRvci1rZXJuZWwtcmFtZGlzay1yZWNvdmVyeS1sb2FkLCQoa21kKSkpIFwKICAgJChldmFsIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoY2FsbCBidWlsZC1pbWFnZS1rZXJuZWwtbW9kdWxlcy1kaXIsVkVORE9SLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfVkVORE9SX0RMS01JTUFHRSkpLCQoVEFSR0VUX09VVF9WRU5ET1JfRExLTSksJChUQVJHRVRfT1VUX1ZFTkRPUikpLHZlbmRvcixtb2R1bGVzLmxvYWQsJChWRU5ET1JfU1RSSVBQRURfTU9EVUxFX1NUQUdJTkdfRElSKSwkKGttZCksJChCT0FSRF9TWVNURU1fS0VSTkVMX01PRFVMRVMpLHN5c3RlbSkpIFwKICAgJChldmFsIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoY2FsbCBidWlsZC12ZW5kb3ItY2hhcmdlci1sb2FkLCQoa21kKSkpIFwKKyAgJChldmFsIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoY2FsbCBidWlsZC12ZW5kb3ItcmFtZGlzay1jaGFyZ2VyLWxvYWQsJChrbWQpKSkgXAorICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLXZlbmRvci1rZXJuZWwtcmFtZGlzay1jaGFyZ2VyLWxvYWQsJChrbWQpKSkgXAogICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLWRpcixPRE0sJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19PRE1fRExLTUlNQUdFKSksJChUQVJHRVRfT1VUX09ETV9ETEtNKSwkKFRBUkdFVF9PVVRfT0RNKSksb2RtLG1vZHVsZXMubG9hZCwsJChrbWQpKSkgXAogICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLWRpcixTWVNURU0sJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19TWVNURU1fRExLTUlNQUdFKSksJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKSwkKFRBUkdFVF9PVVRfU1lTVEVNKSksc3lzdGVtLG1vZHVsZXMubG9hZCwsJChrbWQpKSkgXAogICAkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpKSxcCiAgICAgJChldmFsIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoY2FsbCBidWlsZC1yZWNvdmVyeS1hcy1ib290LWxvYWQsJChrbWQpKSksXAotICAgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtaW1hZ2Uta2VybmVsLW1vZHVsZXMtZGlyLEdFTkVSSUNfUkFNRElTSywkKFRBUkdFVF9SQU1ESVNLX09VVCksLG1vZHVsZXMubG9hZCwsJChrbWQpKSkpKQorICAgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtaW1hZ2Uta2VybmVsLW1vZHVsZXMtZGlyLEdFTkVSSUNfUkFNRElTSywkKFRBUkdFVF9SQU1ESVNLX09VVCksLG1vZHVsZXMubG9hZCwkKEdFTkVSSUNfUkFNRElTS19TVFJJUFBFRF9NT0RVTEVfU1RBR0lOR19ESVIpLCQoa21kKSkpKSkKIAogaWZlcSAoJChCT0FSRF9TWVNURU1fS0VSTkVMX01PRFVMRVMpLCkKIGlmbmVxICgkKEJPQVJEX1NZU1RFTV9ETEtNX1NSQyksKQpAQCAtNjQ1LDcgKzc2Niw3IEBACiBpZmVxICgkKFRBUkdFVF9CVUlMRF9UWVBFKSxkZWJ1ZykKICAgbmFtZSA6PSAkKG5hbWUpX2RlYnVnCiBlbmRpZgotbmFtZSA6PSAkKG5hbWUpLWFwa2NlcnRzLSQoRklMRV9OQU1FX1RBRykKK25hbWUgOj0gJChuYW1lKS1hcGtjZXJ0cwogaW50ZXJtZWRpYXRlcyA6PSBcCiAJJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsYXBrY2VydHMpCiBBUEtDRVJUU19GSUxFIDo9ICQoaW50ZXJtZWRpYXRlcykvJChuYW1lKS50eHQKQEAgLTY3NSw5ICs3OTYsMjUgQEAKIC5QSE9OWTogYXBrY2VydHMtbGlzdAogYXBrY2VydHMtbGlzdDogJChBUEtDRVJUU19GSUxFKQogCitpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGFwZXhrZXlzKQorQVBFWF9LRVlTX0ZJTEUgOj0gJChpbnRlcm1lZGlhdGVzKS9hcGV4a2V5cy50eHQKKworYWxsX2FwZXhfa2V5c19maWxlcyA6PSAkKHNvcnQgJChmb3JlYWNoIG0sJChjYWxsIHByb2R1Y3QtaW5zdGFsbGVkLW1vZHVsZXMsJChJTlRFUk5BTF9QUk9EVUNUKSksJChBTExfTU9EVUxFUy4kKG0pLkFQRVhfS0VZU19GSUxFKSkpCiskKEFQRVhfS0VZU19GSUxFKTogJChhbGxfYXBleF9rZXlzX2ZpbGVzKQorCUBta2RpciAtcCAkKGRpciAkQCkKKwlAcm0gLWYgJEAKKwkkKGhpZGUpIHRvdWNoICRACisJJChoaWRlKSAkKGZvcmVhY2ggZmlsZSwkXixjYXQgJChmaWxlKSA+PiAkQCAkKG5ld2xpbmUpKQorYWxsX2FwZXhfa2V5c19maWxlcyA6PQorCiskKGNhbGwgZGVjbGFyZS0wcC10YXJnZXQsJChBUEVYX0tFWVNfRklMRSkpCisKKy5QSE9OWTogYXBleGtleXMudHh0CithcGV4a2V5cy50eHQ6ICQoQVBFWF9LRVlTX0ZJTEUpCisKIGlmbmVxICgsJChUQVJHRVRfQlVJTERfQVBQUykpCiAgICQoY2FsbCBkaXN0LWZvci1nb2FscywgYXBwc19vbmx5LCAkKEFQS0NFUlRTX0ZJTEUpOmFwa2NlcnRzLnR4dCkKLSAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBhcHBzX29ubHksICQoU09PTkdfQVBFWF9LRVlTX0ZJTEUpOmFwZXhrZXlzLnR4dCkKKyAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBhcHBzX29ubHksICQoQVBFWF9LRVlTX0ZJTEUpOmFwZXhrZXlzLnR4dCkKIGVuZGlmCiAKIApAQCAtNzUzLDYgKzg5MCw5IEBACiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChNSzJCUF9SRU1BSU5JTkdfQ1NWKSkKICQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZGNvcmUtdW5idW5kbGVkLCQoTUsyQlBfUkVNQUlOSU5HX0NTVikpCiAKKy5QSE9OWTogbWsyYnBfcmVtYWluaW5nCittazJicF9yZW1haW5pbmc6ICQoTUsyQlBfUkVNQUlOSU5HX0hUTUwpICQoTUsyQlBfUkVNQUlOSU5HX0NTVikKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBNb2R1bGVzIHVzZSAtV25vLWVycm9yLCBvciBhZGRlZCBkZWZhdWx0IC1XYWxsIC1XZXJyb3IKIFdBTExfV0VSUk9SIDo9ICQoUFJPRFVDVF9PVVQpL3dhbGxfd2Vycm9yLnR4dApAQCAtOTEyLDYgKzEwNTIsMzUgQEAKIGVuZGlmCiBlbmRpZgogCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZHRibyBpbWFnZQoraWZkZWYgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCitJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9kdGJvLmltZworCitpZmVxICgkKEJPQVJEX0FWQl9FTkFCTEUpLHRydWUpCiskKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKTogJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCkKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKKwljaG1vZCArdyAkQAorCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKKwkgICAgLS1pbWFnZSAkQCBcCisJICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9EVEJPSU1HX1BBUlRJVElPTl9TSVpFKSkgXAorCSAgICAtLXBhcnRpdGlvbl9uYW1lIGR0Ym8gJChJTlRFUk5BTF9BVkJfRFRCT19TSUdOSU5HX0FSR1MpIFwKKwkgICAgJChCT0FSRF9BVkJfRFRCT19BRERfSEFTSF9GT09URVJfQVJHUykKKworJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpLCkKKyQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCksJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpLCQoUFJPRFVDVF9PVVQpLzovKQorCitVTk1PVU5URURfTk9USUNFX1ZFTkRPUl9ERVBTKz0gJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkKK2Vsc2UKKyQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpOiAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKK2VuZGlmCisKK2VuZGlmICMgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB0aGUgcmFtZGlzawogSU5TVEFMTEVEX0ZJTEVTX09VVFNJREVfSU1BR0VTIDo9ICQoZmlsdGVyLW91dCAkKFRBUkdFVF9SQU1ESVNLX09VVCkvJSwgJChJTlNUQUxMRURfRklMRVNfT1VUU0lERV9JTUFHRVMpKQpAQCAtOTQxLDExICsxMTEwLDE2NCBAQAogQ09NUFJFU1NJT05fQ09NTUFORCA6PSAkKExaNCkgLWwgLTEyIC0tZmF2b3ItZGVjU3BlZWQKIFJBTURJU0tfRVhUIDo9IC5sejQKIGVsc2UKLUNPTVBSRVNTSU9OX0NPTU1BTkRfREVQUyA6PSAkKE1JTklHWklQKQotQ09NUFJFU1NJT05fQ09NTUFORCA6PSAkKE1JTklHWklQKQorQ09NUFJFU1NJT05fQ09NTUFORF9ERVBTIDo9ICQoR1pJUCkKK0NPTVBSRVNTSU9OX0NPTU1BTkQgOj0gJChHWklQKQogUkFNRElTS19FWFQgOj0gLmd6CiBlbmRpZgogCitpZm5lcSAoJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspLCkKKworVEFSR0VUX09VVF9SQU1ESVNLXzE2SyA6PSAkKFBST0RVQ1RfT1VUKS9yYW1kaXNrXzE2aworQlVJTFRfUkFNRElTS18xNktfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3JhbWRpc2tfMTZrLmltZworUkFNRElTS18xNktfU1RBR0lOR19ESVIgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZGVwbW9kX3JhbWRpc2tfMTZrKQorCitpZm5lcSAoJChCT0FSRF9TWVNURU1fS0VSTkVMX01PRFVMRVMpLCkKK1NZU1RFTV9ETEtNX01PRFVMRV9QQVRURVJOUyA6PSAkKGZvcmVhY2ggcGF0aCwkKEJPQVJEX1NZU1RFTV9LRVJORUxfTU9EVUxFUyksJS8kKG5vdGRpciAkKHBhdGgpKSkKKworZW5kaWYKKworIyBCT0FSRF9LRVJORUxfTU9EVUxFU18xNksgbWlnaHQgY29udGFpbiBkdXBsaWNhdGUgbW9kdWxlcyB1bmRlciBkaWZmZXJlbnQgcGF0aC4KKyMgZm9yIGV4YW1wbGUsIGZvby9iYXIvd2lmaS5rbyBhbmQgZm9vL3dpZmkua28gLiBUbyBhdm9pZCBidWlsZCBpc3N1ZXMsIGRlLWR1cAorIyBtb2R1bGUgbGlzdCBvbiBiYXNlbmFtZSBmaXJzdC4KK0JPQVJEX0tFUk5FTF9NT0RVTEVTXzE2SyA6PSAkKGZvcmVhY2ggXAorICBwYXR0ZXJuLFwKKyAgJChzb3J0ICQoZm9yZWFjaCBcCisgICAgcGF0aCxcCisgICAgJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspLFwKKyAgICAlLyQobm90ZGlyICQocGF0aCkpKVwKKyAgKSxcCisgICQoZmlyc3R3b3JkICQoZmlsdGVyICQocGF0dGVybiksJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspKSkgXAorKQorIyBGb3Igbm9uLUdLSSBtb2R1bGVzLCBzdHJpcCB0aGVtIGJlZm9yZSBpbnN0YWxsLiBBcyBkZWJ1ZyBzeW1ib2xzIHRha2UgdXAKKyMgc2lnbmlmaWNhbnQgc3BhY2UuCiskKGZvcmVhY2ggXAorICBmaWxlLFwKKyAgJChmaWx0ZXItb3V0ICQoU1lTVEVNX0RMS01fTU9EVUxFX1BBVFRFUk5TKSwkKEJPQVJEX0tFUk5FTF9NT0RVTEVTXzE2SykpLFwKKyAgJChldmFsIFwKKyAgICAkKGNhbGwgY29weS1hbmQtc3RyaXAta2VybmVsLW1vZHVsZSxcCisgICAgICAkKGZpbGUpLFwKKyAgICAgICQoUkFNRElTS18xNktfU1RBR0lOR19ESVIpL2xpYi9tb2R1bGVzLzAuMC8kKG5vdGRpciAkKGZpbGUpKSBcCisgICAgKSBcCisgICkgXAorKQorCisjIEZvciBHS0kgbW9kdWxlcywgY29weSBhcy1pcyB3aXRob3V0IHN0cmlwcGluZywgYmVjYXVzZSBzdHJpcHBpbmcgd291bGQKKyMgcmVtb3ZlIHRoZSBzaWduYXR1cmUgb2Yga2VybmVsIG1vZHVsZXMsIGFuZCBHS0kgbW9kdWxlcyBtdXN0IGJlIHNpZ25lZAorIyBmb3Iga2VybmVsIHRvIGxvYWQgdGhlbS4KKyQoZm9yZWFjaCBcCisgIGZpbGUsXAorICAkKGZpbHRlciAkKFNZU1RFTV9ETEtNX01PRFVMRV9QQVRURVJOUyksJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspKSxcCisgICQoZXZhbCBcCisgICAgJChjYWxsIGNvcHktb25lLWZpbGUsXAorICAgICAgJChmaWxlKSxcCisgICAgICAkKFJBTURJU0tfMTZLX1NUQUdJTkdfRElSKS9saWIvbW9kdWxlcy8wLjAvJChub3RkaXIgJChmaWxlKSkgXAorICAgICkgXAorICApIFwKKykKKworQk9BUkRfVkVORE9SX1JBTURJU0tfRlJBR01FTlQuMTZLLlBSRUJVSUxUIDo9ICQoQlVJTFRfUkFNRElTS18xNktfVEFSR0VUKQorCitpZm5kZWYgQk9BUkRfS0VSTkVMX01PRFVMRVNfTE9BRF8xNksKKyAgQk9BUkRfS0VSTkVMX01PRFVMRVNfTE9BRF8xNksgOj0gJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspCitlbmRpZgorCiskKEJVSUxUX1JBTURJU0tfMTZLX1RBUkdFVCk6ICQoREVQTU9EKSAkKE1LQk9PVEZTKSAkKEVYVFJBQ1RfS0VSTkVMKSAkKENPTVBSRVNTSU9OX0NPTU1BTkRfREVQUykKKyQoQlVJTFRfUkFNRElTS18xNktfVEFSR0VUKTogJChmb3JlYWNoIGZpbGUsJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspLCQoUkFNRElTS18xNktfU1RBR0lOR19ESVIpL2xpYi9tb2R1bGVzLzAuMC8kKG5vdGRpciAkKGZpbGUpKSkKKwkkKERFUE1PRCkgLWIgJChSQU1ESVNLXzE2S19TVEFHSU5HX0RJUikgMC4wCisJcm0gLWYgJChSQU1ESVNLXzE2S19TVEFHSU5HX0RJUikvbGliL21vZHVsZXMvMC4wL21vZHVsZXMubG9hZAorCWZvciBNT0RVTEUgaW4gJChCT0FSRF9LRVJORUxfTU9EVUxFU19MT0FEXzE2Syk7IGRvIFwKKwkJYmFzZW5hbWUgJCRNT0RVTEUgPj4gJChSQU1ESVNLXzE2S19TVEFHSU5HX0RJUikvbGliL21vZHVsZXMvMC4wL21vZHVsZXMubG9hZCA7IFwKKwlkb25lOworCXJtIC1yZiAkKFRBUkdFVF9PVVRfUkFNRElTS18xNkspL2xpYi9tb2R1bGVzCisJbWtkaXIgLXAgJChUQVJHRVRfT1VUX1JBTURJU0tfMTZLKS9saWIvbW9kdWxlcworCUtFUk5FTF9SRUxFQVNFPWAkKEVYVFJBQ1RfS0VSTkVMKSAtLXRvb2xzIGx6NDokKExaNCkgLS1pbnB1dCAkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SykgLS1vdXRwdXQtcmVsZWFzZWAgO1wKKwlJU18xNktfS0VSTkVMPWAkKEVYVFJBQ1RfS0VSTkVMKSAtLXRvb2xzIGx6NDokKExaNCkgLS1pbnB1dCAkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SykgLS1vdXRwdXQtY29uZmlnYCA7XAorCWlmIFtbICIkJElTXzE2S19LRVJORUwiID09ICoiQ09ORklHX0FSTTY0XzE2S19QQUdFUz15IiogXV07IHRoZW4gU1VGRklYPV8xNms7IGZpIDtcCisJY3AgLXIgJChSQU1ESVNLXzE2S19TVEFHSU5HX0RJUikvbGliL21vZHVsZXMvMC4wICQoVEFSR0VUX09VVF9SQU1ESVNLXzE2SykvbGliL21vZHVsZXMvJCRLRVJORUxfUkVMRUFTRSQkU1VGRklYCisJJChNS0JPT1RGUykgJChUQVJHRVRfT1VUX1JBTURJU0tfMTZLKSB8ICQoQ09NUFJFU1NJT05fQ09NTUFORCkgPiAkQAorCisjIEJ1aWxkcyBhIHJhbWRpc2sgdXNpbmcgbW9kdWxlcyBkZWZpbmVkIGluIEJPQVJEX0tFUk5FTF9NT0RVTEVTXzE2SworcmFtZGlza18xNms6ICQoQlVJTFRfUkFNRElTS18xNktfVEFSR0VUKQorLlBIT05ZOiByYW1kaXNrXzE2aworCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIDE2S0IgZHRibyBpbWFnZQoraWZkZWYgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFXzE2S0IKK0lOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvZHRib18xNmsuaW1nCisKK2lmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKKyQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCk6ICQoQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFXzE2S0IpICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCkKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRV8xNktCKSAkQAorCWNobW9kICt3ICRACisJJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAorCSAgICAtLWltYWdlICRAIFwKKwkgICAgJChjYWxsIGdldC1wYXJ0aXRpb24tc2l6ZS1hcmd1bWVudCwkKEJPQVJEX0RUQk9JTUdfUEFSVElUSU9OX1NJWkUpKSBcCisJICAgIC0tcGFydGl0aW9uX25hbWUgZHRibyAkKElOVEVSTkFMX0FWQl9EVEJPX1NJR05JTkdfQVJHUykgXAorCSAgICAkKEJPQVJEX0FWQl9EVEJPX0FERF9IQVNIX0ZPT1RFUl9BUkdTKQorCiskKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKSwpCiskKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCksJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0VfMTZLQiksJChQUk9EVUNUX09VVCkvOi8pCisKK1VOTU9VTlRFRF9OT1RJQ0VfVkVORE9SX0RFUFMgKz0gJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKQorZWxzZQorJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKTogJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0VfMTZLQikKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRV8xNktCKSAkQAorZW5kaWYKKworZW5kaWYgIyBCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0VfMTZLQgorCisKK2lmbmVxICgkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SyksKQorQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkva2VybmVsXzE2aworCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChCT0FSRF9LRVJORUxfUEFUSF8xNkspLCQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpKSkKKworIyBDb3BpZXMgQk9BUkRfS0VSTkVMX1BBVEhfMTZLIHRvIG91dHB1dCBkaXJlY3RvcnkgYXMgaXMKK2tlcm5lbF8xNms6ICQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpCisuUEhPTlk6IGtlcm5lbF8xNmsKKworQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvYm9vdF8xNmsuaW1nCisKK0JPQVJEX0tFUk5FTF8xNktfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFIDo9ICQoQk9BUkRfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKQorCiskKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKTogJChNS0JPT1RJTUcpICQoQVZCVE9PTCkgJChJTlRFUk5BTF9CT09USU1BR0VfRklMRVMpICQoQk9BUkRfQVZCX0JPT1RfS0VZX1BBVEgpICQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpCisJJChjYWxsIHByZXR0eSwiVGFyZ2V0IGJvb3QgMTZrIGltYWdlOiAkQCIpCisJJChjYWxsIGJ1aWxkX2Jvb3RfZnJvbV9rZXJuZWxfYXZiX2VuYWJsZWQsJEAsJChCVUlMVF9LRVJORUxfMTZLX1RBUkdFVCkpCisKKworYm9vdGltYWdlXzE2azogJChCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCkKKy5QSE9OWTogYm9vdGltYWdlXzE2aworCitCVUlMVF9CT09UX09UQV9QQUNLQUdFXzE2SyA6PSAkKFBST0RVQ1RfT1VUKS9ib290X290YV8xNmsuemlwCiskKEJVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfMTZLKTogICQoT1RBX0ZST01fUkFXX0lNRykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLnBrOCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKQorCSQoT1RBX0ZST01fUkFXX0lNRykgLS1wYWNrYWdlX2tleSAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkgXAorICAgICAgICAgICAgICAgICAgICAgIC0tbWF4X3RpbWVzdGFtcCBgY2F0ICQoQlVJTERfREFURVRJTUVfRklMRSlgIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLXBhdGggJChIT1NUX09VVCkgXAorICAgICAgICAgICAgICAgICAgICAgIC0tcGFydGl0aW9uX25hbWUgJChpZiAkKGFuZCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3QkKGNvbW1hKWR0Ym8sXAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vdCkgXAorICAgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICRAIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoQk9BUkRfMTZLX09UQV9VU0VfSU5DUkVNRU5UQUwpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpOiQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpXAorICAgICAgICAgICAgICAgICAgICAgIClcCisgICAgICAgICAgICAgICAgICAgICAgJChpZiAkKGFuZCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSwkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpKQorCitib290b3RhcGFja2FnZV8xNms6ICQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV8xNkspCisuUEhPTlk6IGJvb3RvdGFwYWNrYWdlXzE2aworCitlbmRpZgorCisKICMgVGhpcyBmaWxlIGNvbnRhaW5zIC9kZXYgbm9kZXMgZGVzY3JpcHRpb24gYWRkZWQgdG8gdGhlIGdlbmVyaWMgcmFtZGlzawogUkFNRElTS19OT0RFX0xJU1QgOj0gJChQUk9EVUNUX09VVCkvcmFtZGlza19ub2RlX2xpc3QKIApAQCAtMTAyNywxNyArMTM0OSwyOSBAQAogICAkKGlmICQoMSksLS1wYXJ0aXRpb25fc2l6ZSAkKDEpLC0tZHluYW1pY19wYXJ0aXRpb25fc2l6ZSkKIGVuZGVmCiAKKyMgJDE6IG91dHB1dCBib290IGltYWdlIHRhcmdldAorIyAkMjogaW5wdXQgcGF0aCB0byBrZXJuZWwgYmluYXJ5CitkZWZpbmUgYnVpbGRfYm9vdF9mcm9tX2tlcm5lbF9hdmJfZW5hYmxlZAorICAkKGV2YWwga2VybmVsIDo9ICQoMikpCisgICQoTUtCT09USU1HKSAtLWtlcm5lbCAkKGtlcm5lbCkgJChJTlRFUk5BTF9CT09USU1BR0VfQVJHUykgJChJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTKSAkKEJPQVJEX01LQk9PVElNR19BUkdTKSAtLW91dHB1dCAkKDEpCisgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJCgxKSwkKGNhbGwgZ2V0LWhhc2gtaW1hZ2UtbWF4LXNpemUsJChjYWxsIGdldC1ib290aW1hZ2UtcGFydGl0aW9uLXNpemUsJCgxKSxib290KSkpCisgICQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKKyAgICAgICAgICAtLWltYWdlICQoMSkgXAorICAgICAgICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChjYWxsIGdldC1ib290aW1hZ2UtcGFydGl0aW9uLXNpemUsJCgxKSxib290KSkgXAorICAgICAgICAgIC0tc2FsdCBgc2hhMjU2c3VtICIkKGtlcm5lbCkiIHwgY3V0IC1kICIgIiAtZiAxYCBcCisgICAgICAgICAgLS1wYXJ0aXRpb25fbmFtZSBib290ICQoSU5URVJOQUxfQVZCX0JPT1RfU0lHTklOR19BUkdTKSBcCisgICAgICAgICAgJChCT0FSRF9BVkJfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykKK2VuZGVmCisKKwogaWZuZGVmIEJPQVJEX1BSRUJVSUxUX0JPT1RJTUFHRQogCiBpZm5lcSAoJChzdHJpcCAkKFRBUkdFVF9OT19LRVJORUwpKSx0cnVlKQogSU5URVJOQUxfQk9PVElNQUdFX0FSR1MgOj0gXAogCSQoYWRkcHJlZml4IC0tc2Vjb25kICwkKElOU1RBTExFRF8yTkRCT09UTE9BREVSX1RBUkdFVCkpCiAKLSMgVE9ETyhiLzIyOTcwMTAzMyk6IGNsZWFuIHVwIEJPQVJEX0JVSUxEX0dLSV9CT09UX0lNQUdFX1dJVEhPVVRfUkFNRElTSy4KLWlmbmVxICgkKEJPQVJEX0JVSUxEX0dLSV9CT09UX0lNQUdFX1dJVEhPVVRfUkFNRElTSyksdHJ1ZSkKLSAgaWZuZXEgKCQoQlVJTERJTkdfSU5JVF9CT09UX0lNQUdFKSx0cnVlKQotICAgIElOVEVSTkFMX0JPT1RJTUFHRV9BUkdTICs9IC0tcmFtZGlzayAkKElOU1RBTExFRF9SQU1ESVNLX1RBUkdFVCkKLSAgZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX0lOSVRfQk9PVF9JTUFHRSksdHJ1ZSkKKyAgSU5URVJOQUxfQk9PVElNQUdFX0FSR1MgKz0gLS1yYW1kaXNrICQoSU5TVEFMTEVEX1JBTURJU0tfVEFSR0VUKQogZW5kaWYKIAogaWZuZGVmIEJVSUxESU5HX1ZFTkRPUl9CT09UX0lNQUdFCkBAIC0xMDcwLDUxICsxNDA0LDkgQEAKICAgZW5kaWYKIGVuZGlmICMgQlVJTERJTkdfVkVORE9SX0JPT1RfSU1BR0UgPT0gIiIgJiYgQk9BUkRfVVNFU19HRU5FUklDX0tFUk5FTF9JTUFHRSAhPSB0cnVlCiAKLWlmZGVmIEJPQVJEX0dLSV9TSUdOSU5HX0tFWV9QQVRICi0gICMgR0tJIGJvb3QgaW1hZ2VzIHdpbGwgbm90IHNldCBzeXN0ZW0gdmVyc2lvbiAmIFNQTCB2YWx1ZSBpbiB0aGUgaGVhZGVyLgotICAjIFRoZXkgY2FuIGJlIHNldCBieSB0aGUgZGV2aWNlIG1hbnVmYWN0dXJlciBpbiB0aGUgQVZCIHByb3BlcnRpZXMgaW5zdGVhZC4KLSAgSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUyA6PQotZWxzZQotICBJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTIDo9IFwKLSAgICAtLW9zX3ZlcnNpb24gJChQTEFURk9STV9WRVJTSU9OX0xBU1RfU1RBQkxFKSBcCi0gICAgLS1vc19wYXRjaF9sZXZlbCAkKFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENIKQotZW5kaWYgIyBCT0FSRF9HS0lfU0lHTklOR19LRVlfUEFUSAotCi0jICQoMSk6IGltYWdlIHRhcmdldCB0byBjZXJ0aWZ5Ci0jICQoMik6IG91dCBjZXJ0aWZpY2F0ZSB0YXJnZXQKLSMgJCgzKTogaW1hZ2UgbmFtZQotIyAkKDQpOiBhZGRpdGlvbmFsIEFWQiBhcmd1bWVudHMKLWRlZmluZSBnZW5lcmF0ZV9nZW5lcmljX2Jvb3RfaW1hZ2VfY2VydGlmaWNhdGUKLSAgcm0gLXJmICIkKDIpIgotICBta2RpciAtcCAiJChkaXIgJCgyKSkiCi0gICQoR0VORVJBVEVfR0tJX0NFUlRJRklDQVRFKSAkKElOVEVSTkFMX0dLSV9DRVJUSUZJQ0FURV9BUkdTKSBcCi0gICAgLS1hZGRpdGlvbmFsX2F2Yl9hcmdzICIkKDQpIiBcCi0gICAgLS1uYW1lICIkKDMpIiAtLW91dHB1dCAiJCgyKSIgIiQoMSkiCi1lbmRlZgotCi1JTlRFUk5BTF9HS0lfQ0VSVElGSUNBVEVfQVJHUyA6PQotSU5URVJOQUxfR0tJX0NFUlRJRklDQVRFX0RFUFMgOj0KLWlmZGVmIEJPQVJEX0dLSV9TSUdOSU5HX0tFWV9QQVRICi0gIGlmbmRlZiBCT0FSRF9HS0lfU0lHTklOR19BTEdPUklUSE0KLSAgICAkKGVycm9yIEJPQVJEX0dLSV9TSUdOSU5HX0FMR09SSVRITSBzaG91bGQgYmUgZGVmaW5lZCB3aXRoIEJPQVJEX0dLSV9TSUdOSU5HX0tFWV9QQVRIKQotICBlbmRpZgotCi0gIElOVEVSTkFMX0dLSV9DRVJUSUZJQ0FURV9BUkdTIDo9IFwKLSAgICAtLWtleSAiJChCT0FSRF9HS0lfU0lHTklOR19LRVlfUEFUSCkiIFwKLSAgICAtLWFsZ29yaXRobSAiJChCT0FSRF9HS0lfU0lHTklOR19BTEdPUklUSE0pIiBcCi0gICAgLS1hdmJ0b29sICIkKEFWQlRPT0wpIgotCi0gICMgUXVvdGUgYW5kIHBhc3MgQk9BUkRfR0tJX1NJR05JTkdfU0lHTkFUVVJFX0FSR1MgYXMgYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50LgotICBpZmRlZiBCT0FSRF9HS0lfU0lHTklOR19TSUdOQVRVUkVfQVJHUwotICAgIElOVEVSTkFMX0dLSV9DRVJUSUZJQ0FURV9BUkdTICs9IC0tYWRkaXRpb25hbF9hdmJfYXJncyAiJChCT0FSRF9HS0lfU0lHTklOR19TSUdOQVRVUkVfQVJHUykiCi0gIGVuZGlmCi0KLSAgSU5URVJOQUxfR0tJX0NFUlRJRklDQVRFX0RFUFMgOj0gXAotICAgICQoR0VORVJBVEVfR0tJX0NFUlRJRklDQVRFKSBcCi0gICAgJChCT0FSRF9HS0lfU0lHTklOR19LRVlfUEFUSCkgXAotICAgICQoQVZCVE9PTCkKLQotZW5kaWYKK0lOVEVSTkFMX01LQk9PVElNR19WRVJTSU9OX0FSR1MgOj0gXAorICAtLW9zX3ZlcnNpb24gJChQTEFURk9STV9WRVJTSU9OX0xBU1RfU1RBQkxFKSBcCisgIC0tb3NfcGF0Y2hfbGV2ZWwgJChQTEFURk9STV9TRUNVUklUWV9QQVRDSCkKIAogIyBEZWZpbmUgdGhlc2Ugb25seSBpZiB3ZSBhcmUgYnVpbGRpbmcgYm9vdAogaWZkZWYgQlVJTERJTkdfQk9PVF9JTUFHRQpAQCAtMTEzMSw2MiArMTQyMywyNCBAQAogIyAkMTogYm9vdCBpbWFnZSB0YXJnZXQKIGRlZmluZSBidWlsZF9ib290X2JvYXJkX2F2Yl9lbmFibGVkCiAgICQoZXZhbCBrZXJuZWwgOj0gJChjYWxsIGJvb3RpbWFnZS10by1rZXJuZWwsJCgxKSkpCi0gICQoTUtCT09USU1HKSAtLWtlcm5lbCAkKGtlcm5lbCkgJChJTlRFUk5BTF9CT09USU1BR0VfQVJHUykgJChJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTKSAkKEJPQVJEX01LQk9PVElNR19BUkdTKSAtLW91dHB1dCAkKDEpCi0gICQoaWYgJChCT0FSRF9HS0lfU0lHTklOR19LRVlfUEFUSCksIFwKLSAgICAkKGV2YWwgYm9vdF9zaWduYXR1cmUgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZ2VuZXJpY19ib290KS8kKG5vdGRpciAkKDEpKS5ib290X3NpZ25hdHVyZSkgXAotICAgICQoZXZhbCBrZXJuZWxfc2lnbmF0dXJlIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGdlbmVyaWNfa2VybmVsKS8kKG5vdGRpciAkKGtlcm5lbCkpLmJvb3Rfc2lnbmF0dXJlKSBcCi0gICAgJChjYWxsIGdlbmVyYXRlX2dlbmVyaWNfYm9vdF9pbWFnZV9jZXJ0aWZpY2F0ZSwkKDEpLCQoYm9vdF9zaWduYXR1cmUpLGJvb3QsJChCT0FSRF9BVkJfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykpICQobmV3bGluZSkgXAotICAgICQoY2FsbCBnZW5lcmF0ZV9nZW5lcmljX2Jvb3RfaW1hZ2VfY2VydGlmaWNhdGUsJChrZXJuZWwpLCQoa2VybmVsX3NpZ25hdHVyZSksZ2VuZXJpY19rZXJuZWwsJChCT0FSRF9BVkJfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykpICQobmV3bGluZSkgXAotICAgIGNhdCAkKGtlcm5lbF9zaWduYXR1cmUpID4+ICQoYm9vdF9zaWduYXR1cmUpICQobmV3bGluZSkgXAotICAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChib290X3NpZ25hdHVyZSksMTYgPDwgMTApICQobmV3bGluZSkgXAotICAgIHRydW5jYXRlIC1zICQkKCggMTYgPDwgMTAgKSkgJChib290X3NpZ25hdHVyZSkgJChuZXdsaW5lKSBcCi0gICAgY2F0ICIkKGJvb3Rfc2lnbmF0dXJlKSIgPj4gJCgxKSkKLSAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKDEpLCQoY2FsbCBnZXQtaGFzaC1pbWFnZS1tYXgtc2l6ZSwkKGNhbGwgZ2V0LWJvb3RpbWFnZS1wYXJ0aXRpb24tc2l6ZSwkKDEpLGJvb3QpKSkKLSAgJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAotICAgICAgICAgIC0taW1hZ2UgJCgxKSBcCi0gICAgICAgICAgJChjYWxsIGdldC1wYXJ0aXRpb24tc2l6ZS1hcmd1bWVudCwkKGNhbGwgZ2V0LWJvb3RpbWFnZS1wYXJ0aXRpb24tc2l6ZSwkKDEpLGJvb3QpKSBcCi0gICAgICAgICAgLS1wYXJ0aXRpb25fbmFtZSBib290ICQoSU5URVJOQUxfQVZCX0JPT1RfU0lHTklOR19BUkdTKSBcCi0gICAgICAgICAgJChCT0FSRF9BVkJfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykKKyAgJChjYWxsIGJ1aWxkX2Jvb3RfZnJvbV9rZXJuZWxfYXZiX2VuYWJsZWQsJCgxKSwkKGtlcm5lbCkpCiBlbmRlZgogCi0kKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKTogJChNS0JPT1RJTUcpICQoQVZCVE9PTCkgJChJTlRFUk5BTF9CT09USU1BR0VfRklMRVMpICQoQk9BUkRfQVZCX0JPT1RfS0VZX1BBVEgpICQoSU5URVJOQUxfR0tJX0NFUlRJRklDQVRFX0RFUFMpCiskKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKTogJChNS0JPT1RJTUcpICQoQVZCVE9PTCkgJChJTlRFUk5BTF9CT09USU1BR0VfRklMRVMpICQoQk9BUkRfQVZCX0JPT1RfS0VZX1BBVEgpCiAJJChjYWxsIHByZXR0eSwiVGFyZ2V0IGJvb3QgaW1hZ2U6ICRAIikKIAkkKGNhbGwgYnVpbGRfYm9vdF9ib2FyZF9hdmJfZW5hYmxlZCwkQCkKIAogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtbWV0YWRhdGEsJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCksU1BEWC1saWNlbnNlLWlkZW50aWZpZXItR1BMLTIuMC1vbmx5IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAscmVzdHJpY3RlZCBub3RpY2UsJChCVUlMRF9TWVNURU0pL0xJTlVYX0tFUk5FTF9DT1BZSU5HIGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsIkJvb3QgSW1hZ2UiLGJvb3QpCi0kKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfQk9PVElNQUdFX0ZJTEVTKSAkKElOVEVSTkFMX0dLSV9DRVJUSUZJQ0FURV9ERVBTKSwkKFBST0RVQ1RfT1VUKS86LykKLQotVU5NT1VOVEVEX05PVElDRV9WRU5ET1JfREVQUyArPSAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKQotCi0uUEhPTlk6IGJvb3RpbWFnZS1ub2RlcHMKLWJvb3RpbWFnZS1ub2RlcHM6ICQoTUtCT09USU1HKSAkKEFWQlRPT0wpICQoQk9BUkRfQVZCX0JPT1RfS0VZX1BBVEgpICQoSU5URVJOQUxfR0tJX0NFUlRJRklDQVRFX0RFUFMpCi0JQGVjaG8gIm1ha2UgJEA6IGlnbm9yaW5nIGRlcGVuZGVuY2llcyIKLQkkKGZvcmVhY2ggYiwkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSwkKGNhbGwgYnVpbGRfYm9vdF9ib2FyZF9hdmJfZW5hYmxlZCwkKGIpKSkKLQotZWxzZSBpZmVxICh0cnVlLCQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkpICMgQk9BUkRfQVZCX0VOQUJMRSAhPSB0cnVlCi0KLSMgJDE6IGJvb3QgaW1hZ2UgdGFyZ2V0Ci1kZWZpbmUgYnVpbGRfYm9vdF9zdXBwb3J0c192Ym9vdAotICAkKE1LQk9PVElNRykgLS1rZXJuZWwgJChjYWxsIGJvb3RpbWFnZS10by1rZXJuZWwsJCgxKSkgJChJTlRFUk5BTF9CT09USU1BR0VfQVJHUykgJChJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTKSAkKEJPQVJEX01LQk9PVElNR19BUkdTKSAtLW91dHB1dCAkKDEpLnVuc2lnbmVkCi0gICQoVkJPT1RfU0lHTkVSKSAkKEZVVElMSVRZKSAkKDEpLnVuc2lnbmVkICQoUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSkudmJwdWJrICQoUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSkudmJwcml2ayAkKFBST0RVQ1RfVkJPT1RfU0lHTklOR19TVUJLRVkpLnZicHJpdmsgJCgxKS5rZXlibG9jayAkKDEpCi0gICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJCgxKSwkKGNhbGwgZ2V0LWJvb3RpbWFnZS1wYXJ0aXRpb24tc2l6ZSwkKDEpLGJvb3QpKQotZW5kZWYKLQotJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCk6ICQoTUtCT09USU1HKSAkKElOVEVSTkFMX0JPT1RJTUFHRV9GSUxFUykgJChWQk9PVF9TSUdORVIpICQoRlVUSUxJVFkpCi0JJChjYWxsIHByZXR0eSwiVGFyZ2V0IGJvb3QgaW1hZ2U6ICRAIikKLQkkKGNhbGwgYnVpbGRfYm9vdF9zdXBwb3J0c192Ym9vdCwkQCkKLQotJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtbWV0YWRhdGEsJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCksU1BEWC1saWNlbnNlLWlkZW50aWZpZXItR1BMLTIuMC1vbmx5IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAscmVzdHJpY3RlZCBub3RpY2UsJChCVUlMRF9TWVNURU0pL0xJTlVYX0tFUk5FTF9DT1BZSU5HIGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsIkJvb3QgSW1hZ2UiLGJvb3QpCiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfQk9PVElNQUdFX0ZJTEVTKSwkKFBST0RVQ1RfT1VUKS86LykKIAogVU5NT1VOVEVEX05PVElDRV9WRU5ET1JfREVQUyArPSAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKQogCiAuUEhPTlk6IGJvb3RpbWFnZS1ub2RlcHMKLWJvb3RpbWFnZS1ub2RlcHM6ICQoTUtCT09USU1HKSAkKFZCT09UX1NJR05FUikgJChGVVRJTElUWSkKK2Jvb3RpbWFnZS1ub2RlcHM6ICQoTUtCT09USU1HKSAkKEFWQlRPT0wpICQoQk9BUkRfQVZCX0JPT1RfS0VZX1BBVEgpCiAJQGVjaG8gIm1ha2UgJEA6IGlnbm9yaW5nIGRlcGVuZGVuY2llcyIKLQkkKGZvcmVhY2ggYiwkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSwkKGNhbGwgYnVpbGRfYm9vdF9zdXBwb3J0c192Ym9vdCwkKGIpKSkKKwkkKGZvcmVhY2ggYiwkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSwkKGNhbGwgYnVpbGRfYm9vdF9ib2FyZF9hdmJfZW5hYmxlZCwkKGIpKSkKIAotZWxzZSAjIFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QgIT0gdHJ1ZQorZWxzZSAjIEJPQVJEX0FWQl9FTkFCTEUgIT0gdHJ1ZQogCiAjICQxOiBib290IGltYWdlIHRhcmdldAogZGVmaW5lIGJ1aWxkX2Jvb3Rfbm92Ym9vdApAQCAtMTIyMCwxNSArMTQ3NCwxOSBAQAogSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvYm9vdC5pbWcKIAogaWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQotJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCk6ICQoSU5URVJOQUxfUFJFQlVJTFRfQk9PVElNQUdFKSAkKEFWQlRPT0wpICQoQk9BUkRfQVZCX0JPT1RfS0VZX1BBVEgpCiskKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKTogUFJJVkFURV9XT1JLSU5HX0RJUiA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxwcmVidWlsdF9ib290aW1nKQorJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCk6ICQoSU5URVJOQUxfUFJFQlVJTFRfQk9PVElNQUdFKSAkKEFWQlRPT0wpICQoQk9BUkRfQVZCX0JPT1RfS0VZX1BBVEgpICQoVU5QQUNLX0JPT1RJTUcpCiAJY3AgJChJTlRFUk5BTF9QUkVCVUlMVF9CT09USU1BR0UpICRACisJJChVTlBBQ0tfQk9PVElNRykgLS1ib290X2ltZyAkKElOVEVSTkFMX1BSRUJVSUxUX0JPT1RJTUFHRSkgLS1vdXQgJChQUklWQVRFX1dPUktJTkdfRElSKQogCWNobW9kICt3ICRACiAJJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAogCSAgICAtLWltYWdlICRAIFwKKwkgICAgLS1zYWx0IGBzaGEyNTZzdW0gJChQUklWQVRFX1dPUktJTkdfRElSKS9rZXJuZWwgfCBjdXQgLWQgIiAiIC1mIDFgIFwKIAkgICAgJChjYWxsIGdldC1wYXJ0aXRpb24tc2l6ZS1hcmd1bWVudCwkKEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkpIFwKIAkgICAgLS1wYXJ0aXRpb25fbmFtZSBib290ICQoSU5URVJOQUxfQVZCX0JPT1RfU0lHTklOR19BUkdTKSBcCiAJICAgICQoQk9BUkRfQVZCX0JPT1RfQUREX0hBU0hfRk9PVEVSX0FSR1MpCiAKKwogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtbWV0YWRhdGEsJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCksU1BEWC1saWNlbnNlLWlkZW50aWZpZXItR1BMLTIuMC1vbmx5IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAscmVzdHJpY3RlZCBub3RpY2UsJChCVUlMRF9TWVNURU0pL0xJTlVYX0tFUk5FTF9DT1BZSU5HIGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsIkJvb3QgSW1hZ2UiLGJvb2wpCiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfUFJFQlVJTFRfQk9PVElNQUdFKSwkKFBST0RVQ1RfT1VUKS86LykKIApAQCAtMTI0Miw2ICsxNTAwLDQ3IEBACiAKIGVuZGlmICMgbXlfaW5zdGFsbGVkX3ByZWJ1aWx0X2draV9hcGV4IG5vdCBkZWZpbmVkCiAKK2lmbmVxICgkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SyksKQorQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV80SyA6PSAkKFBST0RVQ1RfT1VUKS9ib290X290YV80ay56aXAKKyQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV80Syk6ICQoT1RBX0ZST01fUkFXX0lNRykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLnBrOCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpCisJJChPVEFfRlJPTV9SQVdfSU1HKSAtLXBhY2thZ2Vfa2V5ICQoREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFKSBcCisgICAgICAgICAgICAgICAgICAgICAgLS1tYXhfdGltZXN0YW1wIGBjYXQgJChCVUlMRF9EQVRFVElNRV9GSUxFKWAgXAorICAgICAgICAgICAgICAgICAgICAgIC0tcGF0aCAkKEhPU1RfT1VUKSBcCisgICAgICAgICAgICAgICAgICAgICAgLS1wYXJ0aXRpb25fbmFtZSAkKGlmICQoYW5kICQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKSksXAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vdCQoY29tbWEpZHRibyxcCisgICAgICAgICAgICAgICAgICAgICAgICBib290KSBcCisgICAgICAgICAgICAgICAgICAgICAgLS1vdXRwdXQgJEAgXAorICAgICAgICAgICAgICAgICAgICAgICQoaWYgJChCT0FSRF8xNktfT1RBX1VTRV9JTkNSRU1FTlRBTCksXAorICAgICAgICAgICAgICAgICAgICAgICAgJChCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCk6JChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCksXAorICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVClcCisgICAgICAgICAgICAgICAgICAgICAgKVwKKyAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoYW5kICQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpKQorCitib290b3RhcGFja2FnZV80azogJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzRLKQorLlBIT05ZOiBib290b3RhcGFja2FnZV80aworCitpZmVxICgkKEJPQVJEXzE2S19PVEFfTU9WRV9WRU5ET1IpLHRydWUpCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzRLKSwkKFRBUkdFVF9PVVRfVkVORE9SKS9ib290X290YXMvYm9vdF9vdGFfNGsuemlwKSkKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKEJVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfMTZLKSwkKFRBUkdFVF9PVVRfVkVORE9SKS9ib290X290YXMvYm9vdF9vdGFfMTZrLnppcCkpCitBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ib290X290YXMvYm9vdF9vdGFfNGsuemlwCitBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ib290X290YXMvYm9vdF9vdGFfMTZrLnppcAorZWxzZQorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV80SyksJChUQVJHRVRfT1VUKS9ib290X290YXMvYm9vdF9vdGFfNGsuemlwKSkKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKEJVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfMTZLKSwkKFRBUkdFVF9PVVQpL2Jvb3Rfb3Rhcy9ib290X290YV8xNmsuemlwKSkKK0FMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoVEFSR0VUX09VVCkvYm9vdF9vdGFzL2Jvb3Rfb3RhXzRrLnppcAorQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChUQVJHRVRfT1VUKS9ib290X290YXMvYm9vdF9vdGFfMTZrLnppcAorZW5kaWYgIyBCT0FSRF8xNktfT1RBX01PVkVfVkVORE9SID09IHRydWUKKworCitlbmRpZgorCiBteV9hcGV4X2V4dHJhY3RlZF9ib290X2ltYWdlIDo9CiBteV9pbnN0YWxsZWRfcHJlYnVpbHRfZ2tpX2FwZXggOj0KIApAQCAtMTQ1MCw2ICsxNzQ5LDMwIEBACiAkKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCkKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfVkVORE9SX1JBTURJU0tfVEFSR0VUKSAkKElOU1RBTExFRF9EVEJfSU1BR0VfVEFSR0VUKSAkKElOVEVSTkFMX1ZFTkRPUl9SQU1ESVNLX0ZSQUdNRU5UX1RBUkdFVFMpICQoSU5URVJOQUxfVkVORE9SX0JPT1RDT05ESUdfVEFSR0VUKSwkKFBST0RVQ1RfT1VUKS86LykKIFZFTkRPUl9OT1RJQ0VfREVQUyArPSAkKElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCkKKworZWxzZSAjIEJVSUxESU5HX1ZFTkRPUl9CT09UX0lNQUdFIG5vdCBkZWZpbmVkLCB1c2UgcHJlYnVpbHQgaW1hZ2UKKworaWZkZWYgQk9BUkRfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRQorSU5URVJOQUxfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRSA6PSAkKEJPQVJEX1BSRUJVSUxUX1ZFTkRPUl9CT09USU1BR0UpCitJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvdmVuZG9yX2Jvb3QuaW1nCisKK2lmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKKyQoSU5TVEFMTEVEX1ZFTkRPUl9CT09USU1BR0VfVEFSR0VUKTogJChJTlRFUk5BTF9QUkVCVUlMVF9WRU5ET1JfQk9PVElNQUdFKSAkKEFWQlRPT0wpICQoQk9BUkRfQVZCX1ZFTkRPUl9CT09UX0tFWV9QQVRIKQorCWNwICQoSU5URVJOQUxfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRSkgJEAKKwljaG1vZCArdyAkQAorCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKKwkgICAgLS1pbWFnZSAkQCBcCisJICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9WRU5ET1JfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKSkgXAorCSAgICAtLXBhcnRpdGlvbl9uYW1lIHZlbmRvcl9ib290ICQoSU5URVJOQUxfQVZCX1ZFTkRPUl9CT09UX1NJR05JTkdfQVJHUykgXAorCSAgICAkKEJPQVJEX0FWQl9WRU5ET1JfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykKK2Vsc2UKKyQoSU5TVEFMTEVEX1ZFTkRPUl9CT09USU1BR0VfVEFSR0VUKTogJChJTlRFUk5BTF9QUkVCVUlMVF9WRU5ET1JfQk9PVElNQUdFKQorCWNwICQoSU5URVJOQUxfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRSkgJEAKKworZW5kaWYgIyBCT0FSRF9BVkJfRU5BQkxFCiskKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCkKKyQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRSksJChQUk9EVUNUX09VVCkvOi8pCitlbmRpZiAjIEJPQVJEX1BSRUJVSUxUX1ZFTkRPUl9CT09USU1BR0UKIGVuZGlmICMgQlVJTERJTkdfVkVORE9SX0JPT1RfSU1BR0UKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTg2MSwxMSArMjE4NCw2IEBACiAjIEdldCBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHNlYXJjaCBwYXRocy4KIElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTIDo9ICQoc3Vic3QgJChzcGFjZSksOiwkKHNvcnQgJChkaXIgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpKSkpCiAKLSMgQ29sbGVjdHMgZmlsZV9jb250ZXh0cyBmaWxlcyBmcm9tIG1vZHVsZXMgdG8gYmUgaW5zdGFsbGVkCi0kKGNhbGwgbWVyZ2UtZmMtZmlsZXMsIFwKLSAgJChzb3J0ICQoZm9yZWFjaCBtLCQocHJvZHVjdF9NT0RVTEVTKSwkKEFMTF9NT0RVTEVTLiQobSkuRklMRV9DT05URVhUUykpKSxcCi0gICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVRDLGZpbGVfY29udGV4dHMuYmluKS9maWxlX2NvbnRleHRzLm1vZHVsZXMudG1wKQotCiBTRUxJTlVYX0ZDIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVRDLGZpbGVfY29udGV4dHMuYmluKS9maWxlX2NvbnRleHRzLmJpbgogCiBJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMgKz0gJChTRUxJTlVYX0ZDKQpAQCAtMTg4NSw5ICsyMjAzLDExIEBACiAkKGlmICQoQk9BUkRfJChfdmFyKUlNQUdFX0VST0ZTX0NPTVBSRVNTT1IpLCQoaGlkZSkgZWNobyAiJCgxKV9lcm9mc19jb21wcmVzc29yPSQoQk9BUkRfJChfdmFyKUlNQUdFX0VST0ZTX0NPTVBSRVNTT1IpIiA+PiAkKDIpKQogJChpZiAkKEJPQVJEXyQoX3ZhcilJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUyksJChoaWRlKSBlY2hvICIkKDEpX2Vyb2ZzX2NvbXByZXNzX2hpbnRzPSQoQk9BUkRfJChfdmFyKUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSIgPj4gJCgyKSkKICQoaWYgJChCT0FSRF8kKF92YXIpSU1BR0VfRVJPRlNfUENMVVNURVJfU0laRSksJChoaWRlKSBlY2hvICIkKDEpX2Vyb2ZzX3BjbHVzdGVyX3NpemU9JChCT0FSRF8kKF92YXIpSU1BR0VfRVJPRlNfUENMVVNURVJfU0laRSkiID4+ICQoMikpCiskKGlmICQoQk9BUkRfJChfdmFyKUlNQUdFX0VST0ZTX0JMT0NLU0laRSksJChoaWRlKSBlY2hvICIkKDEpX2Vyb2ZzX2Jsb2Nrc2l6ZT0kKEJPQVJEXyQoX3ZhcilJTUFHRV9FUk9GU19CTE9DS1NJWkUpIiA+PiAkKDIpKQogJChpZiAkKEJPQVJEXyQoX3ZhcilJTUFHRV9FWFRGU19JTk9ERV9DT1VOVCksJChoaWRlKSBlY2hvICIkKDEpX2V4dGZzX2lub2RlX2NvdW50PSQoQk9BUkRfJChfdmFyKUlNQUdFX0VYVEZTX0lOT0RFX0NPVU5UKSIgPj4gJCgyKSkKICQoaWYgJChCT0FSRF8kKF92YXIpSU1BR0VfRVhURlNfUlNWX1BDVCksJChoaWRlKSBlY2hvICIkKDEpX2V4dGZzX3Jzdl9wY3Q9JChCT0FSRF8kKF92YXIpSU1BR0VfRVhURlNfUlNWX1BDVCkiID4+ICQoMikpCiAkKGlmICQoQk9BUkRfJChfdmFyKUlNQUdFX0YyRlNfU0xPQURfQ09NUFJFU1NfRkxBR1MpLCQoaGlkZSkgZWNobyAiJCgxKV9mMmZzX3NsZGNfZmxhZ3M9JChCT0FSRF8kKF92YXIpSU1BR0VfRjJGU19TTE9BRF9DT01QUkVTU19GTEFHUykiID4+ICQoMikpCiskKGlmICQoQk9BUkRfJChfdmFyKUlNQUdFX0YyRlNfQkxPQ0tTSVpFKSwkKGhpZGUpIGVjaG8gIiQoMSlfZjJmc19ibG9ja3NpemU9JChCT0FSRF8kKF92YXIpSU1BR0VfRjJGU19CTE9DS1NJWkUpIiA+PiAkKDIpKQogJChpZiAkKEJPQVJEXyQoX3ZhcilJTUFHRV9GSUxFX1NZU1RFTV9DT01QUkVTUyksJChoaWRlKSBlY2hvICIkKDEpX2YyZnNfY29tcHJlc3M9JChCT0FSRF8kKF92YXIpSU1BR0VfRklMRV9TWVNURU1fQ09NUFJFU1MpIiA+PiAkKDIpKQogJChpZiAkKEJPQVJEXyQoX3ZhcilJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSwkKGhpZGUpIGVjaG8gIiQoMSlfZnNfdHlwZT0kKEJPQVJEXyQoX3ZhcilJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSIgPj4gJCgyKSkKICQoaWYgJChCT0FSRF8kKF92YXIpSU1BR0VfSk9VUk5BTF9TSVpFKSwkKGhpZGUpIGVjaG8gIiQoMSlfam91cm5hbF9zaXplPSQoQk9BUkRfJChfdmFyKUlNQUdFX0pPVVJOQUxfU0laRSkiID4+ICQoMikpCkBAIC0xOTc0LDkgKzIyOTQsMTEgQEAKICQoaWYgJChCT0FSRF9FUk9GU19DT01QUkVTU09SKSwkKGhpZGUpIGVjaG8gImVyb2ZzX2RlZmF1bHRfY29tcHJlc3Nvcj0kKEJPQVJEX0VST0ZTX0NPTVBSRVNTT1IpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSwkKGhpZGUpIGVjaG8gImVyb2ZzX2RlZmF1bHRfY29tcHJlc3NfaGludHM9JChCT0FSRF9FUk9GU19DT01QUkVTU19ISU5UUykiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfRVJPRlNfUENMVVNURVJfU0laRSksJChoaWRlKSBlY2hvICJlcm9mc19wY2x1c3Rlcl9zaXplPSQoQk9BUkRfRVJPRlNfUENMVVNURVJfU0laRSkiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfRVJPRlNfQkxPQ0tTSVpFKSwkKGhpZGUpIGVjaG8gImVyb2ZzX2Jsb2Nrc2l6ZT0kKEJPQVJEX0VST0ZTX0JMT0NLU0laRSkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfRVJPRlNfU0hBUkVfRFVQX0JMT0NLUyksJChoaWRlKSBlY2hvICJlcm9mc19zaGFyZV9kdXBfYmxvY2tzPSQoQk9BUkRfRVJPRlNfU0hBUkVfRFVQX0JMT0NLUykiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfRVJPRlNfVVNFX0xFR0FDWV9DT01QUkVTU0lPTiksJChoaWRlKSBlY2hvICJlcm9mc191c2VfbGVnYWN5X2NvbXByZXNzaW9uPSQoQk9BUkRfRVJPRlNfVVNFX0xFR0FDWV9DT01QUkVTU0lPTikiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfRVhUNF9TSEFSRV9EVVBfQkxPQ0tTKSwkKGhpZGUpIGVjaG8gImV4dDRfc2hhcmVfZHVwX2Jsb2Nrcz0kKEJPQVJEX0VYVDRfU0hBUkVfRFVQX0JMT0NLUykiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfRjJGU19CTE9DS1NJWkUpLCQoaGlkZSkgZWNobyAiZjJmc19ibG9ja3NpemU9JChCT0FSRF9GMkZTX0JMT0NLU0laRSkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfRkxBU0hfTE9HSUNBTF9CTE9DS19TSVpFKSwgJChoaWRlKSBlY2hvICJmbGFzaF9sb2dpY2FsX2Jsb2NrX3NpemU9JChCT0FSRF9GTEFTSF9MT0dJQ0FMX0JMT0NLX1NJWkUpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX0ZMQVNIX0VSQVNFX0JMT0NLX1NJWkUpLCAkKGhpZGUpIGVjaG8gImZsYXNoX2VyYXNlX2Jsb2NrX3NpemU9JChCT0FSRF9GTEFTSF9FUkFTRV9CTE9DS19TSVpFKSIgPj4gJCgxKSkKICQoaWYgJChmaWx0ZXIgZW5nLCAkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSksJChoaWRlKSBlY2hvICJ2ZXJpdHlfZGlzYWJsZT10cnVlIiA+PiAkKDEpKQpAQCAtMTk4Nyw4NiArMjMwOSw4MCBAQAogJChpZiAkKFBST0RVQ1RfVkVORE9SX0RMS01fVkVSSVRZX1BBUlRJVElPTiksJChoaWRlKSBlY2hvICJ2ZW5kb3JfZGxrbV92ZXJpdHlfYmxvY2tfZGV2aWNlPSQoUFJPRFVDVF9WRU5ET1JfRExLTV9WRVJJVFlfUEFSVElUSU9OKSIgPj4gJCgxKSkKICQoaWYgJChQUk9EVUNUX09ETV9ETEtNX1ZFUklUWV9QQVJUSVRJT04pLCQoaGlkZSkgZWNobyAib2RtX2Rsa21fdmVyaXR5X2Jsb2NrX2RldmljZT0kKFBST0RVQ1RfT0RNX0RMS01fVkVSSVRZX1BBUlRJVElPTikiID4+ICQoMSkpCiAkKGlmICQoUFJPRFVDVF9TWVNURU1fRExLTV9WRVJJVFlfUEFSVElUSU9OKSwkKGhpZGUpIGVjaG8gInN5c3RlbV9kbGttX3Zlcml0eV9ibG9ja19kZXZpY2U9JChQUk9EVUNUX1NZU1RFTV9ETEtNX1ZFUklUWV9QQVJUSVRJT04pIiA+PiAkKDEpKQotJChpZiAkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpLCQoaGlkZSkgZWNobyAidmJvb3Q9JChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSIgPj4gJCgxKSkKLSQoaWYgJChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSwkKGhpZGUpIGVjaG8gInZib290X2tleT0kKFBST0RVQ1RfVkJPT1RfU0lHTklOR19LRVkpIiA+PiAkKDEpKQotJChpZiAkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpLCQoaGlkZSkgZWNobyAidmJvb3Rfc3Via2V5PSQoUFJPRFVDVF9WQk9PVF9TSUdOSU5HX1NVQktFWSkiID4+ICQoMSkpCi0kKGlmICQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCksJChoaWRlKSBlY2hvICJmdXRpbGl0eT0kKG5vdGRpciAkKEZVVElMSVRZKSkiID4+ICQoMSkpCi0kKGlmICQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCksJChoaWRlKSBlY2hvICJ2Ym9vdF9zaWduZXJfY21kPSQoVkJPT1RfU0lHTkVSKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9hdmJ0b29sPSQobm90ZGlyICQoQVZCVE9PTCkpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLCQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1NZU1RFTV9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKLSAgICAkKGlmICQoQk9BUkRfQVZCX1NZU1RFTV9LRVlfUEFUSCksXAotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fa2V5X3BhdGg9JChCT0FSRF9BVkJfU1lTVEVNX0tFWV9QQVRIKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9BTEdPUklUSE0pIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9TWVNURU1fUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fb3RoZXJfaGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX290aGVyX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9TWVNURU1fT1RIRVJfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSxcCiskKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksIFwKKyAgJChoaWRlKSBlY2hvICJhdmJfYXZidG9vbD0kKG5vdGRpciAkKEFWQlRPT0wpKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAkKGlmICQoZmlsdGVyICQoMiksc3lzdGVtKSwgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfU1lTVEVNX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAkKGlmICQoQk9BUkRfQVZCX1NZU1RFTV9LRVlfUEFUSCksIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9rZXlfcGF0aD0kKEJPQVJEX0FWQl9TWVNURU1fS0VZX1BBVEgpIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9BTEdPUklUSE0pIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfU1lTVEVNX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSQobmV3bGluZSkpKSBcCisgICQoaWYgJChmaWx0ZXIgJCgyKSxzeXN0ZW1fb3RoZXIpLCBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX290aGVyX2hhc2h0cmVlX2VuYWJsZT0kKEJPQVJEX0FWQl9FTkFCTEUpIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX290aGVyX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9TWVNURU1fT1RIRVJfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSQobmV3bGluZSkgXAogICAgICQoaWYgJChCT0FSRF9BVkJfU1lTVEVNX09USEVSX0tFWV9QQVRIKSxcCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9vdGhlcl9rZXlfcGF0aD0kKEJPQVJEX0FWQl9TWVNURU1fT1RIRVJfS0VZX1BBVEgpIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9vdGhlcl9hbGdvcml0aG09JChCT0FSRF9BVkJfU1lTVEVNX09USEVSX0FMR09SSVRITSkiID4+ICQoMSkpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLCQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1ZFTkRPUl9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9vdGhlcl9rZXlfcGF0aD0kKEJPQVJEX0FWQl9TWVNURU1fT1RIRVJfS0VZX1BBVEgpIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fb3RoZXJfYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9PVEhFUl9BTEdPUklUSE0pIiA+PiAkKDEpJChuZXdsaW5lKSkpIFwKKyAgJChpZiAkKGZpbHRlciAkKDIpLHZlbmRvciksIFwKKyAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfaGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1ZFTkRPUl9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpJChuZXdsaW5lKSBcCiAgICAgJChpZiAkKEJPQVJEX0FWQl9WRU5ET1JfS0VZX1BBVEgpLFwKLSAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2tleV9wYXRoPSQoQk9BUkRfQVZCX1ZFTkRPUl9LRVlfUEFUSCkiID4+ICQoMSkKLSAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2FsZ29yaXRobT0kKEJPQVJEX0FWQl9WRU5ET1JfQUxHT1JJVEhNKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3Jfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfVkVORE9SX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9QUk9EVUNUX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2tleV9wYXRoPSQoQk9BUkRfQVZCX1ZFTkRPUl9LRVlfUEFUSCkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9hbGdvcml0aG09JChCT0FSRF9BVkJfVkVORE9SX0FMR09SSVRITSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9WRU5ET1JfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpJChuZXdsaW5lKSkpIFwKKyAgJChpZiAkKGZpbHRlciAkKDIpLHByb2R1Y3QpLCBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3Byb2R1Y3RfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1BST0RVQ1RfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSQobmV3bGluZSkgXAogICAgICQoaWYgJChCT0FSRF9BVkJfUFJPRFVDVF9LRVlfUEFUSCksXAotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X2tleV9wYXRoPSQoQk9BUkRfQVZCX1BST0RVQ1RfS0VZX1BBVEgpIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3Byb2R1Y3RfYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1BST0RVQ1RfQUxHT1JJVEhNKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX1BST0RVQ1RfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X2hhc2h0cmVlX2VuYWJsZT0kKEJPQVJEX0FWQl9FTkFCTEUpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKLSAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9TWVNURU1fRVhUX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9rZXlfcGF0aD0kKEJPQVJEX0FWQl9QUk9EVUNUX0tFWV9QQVRIKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9hbGdvcml0aG09JChCT0FSRF9BVkJfUFJPRFVDVF9BTEdPUklUSE0pIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX1BST0RVQ1RfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpJChuZXdsaW5lKSkpIFwKKyAgJChpZiAkKGZpbHRlciAkKDIpLHN5c3RlbV9leHQpLCBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX2V4dF9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9leHRfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1NZU1RFTV9FWFRfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSQobmV3bGluZSkgXAogICAgICQoaWYgJChCT0FSRF9BVkJfU1lTVEVNX0VYVF9LRVlfUEFUSCksXAotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X2tleV9wYXRoPSQoQk9BUkRfQVZCX1NZU1RFTV9FWFRfS0VZX1BBVEgpIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9leHRfYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9FWFRfQUxHT1JJVEhNKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX1NZU1RFTV9FWFRfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9vZG1faGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksJChoaWRlKSBlY2hvICJhdmJfb2RtX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9PRE1fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSxcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X2tleV9wYXRoPSQoQk9BUkRfQVZCX1NZU1RFTV9FWFRfS0VZX1BBVEgpIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X2FsZ29yaXRobT0kKEJPQVJEX0FWQl9TWVNURU1fRVhUX0FMR09SSVRITSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9leHRfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfU1lTVEVNX0VYVF9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICQoMSkkKG5ld2xpbmUpKSkgXAorICAkKGlmICQoZmlsdGVyICQoMiksb2RtKSwgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfT0RNX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkkKG5ld2xpbmUpIFwKICAgICAkKGlmICQoQk9BUkRfQVZCX09ETV9LRVlfUEFUSCksXAotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9vZG1fa2V5X3BhdGg9JChCT0FSRF9BVkJfT0RNX0tFWV9QQVRIKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9vZG1fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX09ETV9BTEdPUklUSE0pIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9PRE1fUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfZGxrbV9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSxcCi0gICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2Rsa21fYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1ZFTkRPUl9ETEtNX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfb2RtX2tleV9wYXRoPSQoQk9BUkRfQVZCX09ETV9LRVlfUEFUSCkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9hbGdvcml0aG09JChCT0FSRF9BVkJfT0RNX0FMR09SSVRITSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9PRE1fUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpJChuZXdsaW5lKSkpIFwKKyAgJChpZiAkKGZpbHRlciAkKDIpLHZlbmRvcl9kbGttKSwgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9kbGttX2hhc2h0cmVlX2VuYWJsZT0kKEJPQVJEX0FWQl9FTkFCTEUpIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2Rsa21fYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1ZFTkRPUl9ETEtNX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkkKG5ld2xpbmUpIFwKICAgICAkKGlmICQoQk9BUkRfQVZCX1ZFTkRPUl9ETEtNX0tFWV9QQVRIKSxcCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9kbGttX2tleV9wYXRoPSQoQk9BUkRfQVZCX1ZFTkRPUl9ETEtNX0tFWV9QQVRIKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfZGxrbV9hbGdvcml0aG09JChCT0FSRF9BVkJfVkVORE9SX0RMS01fQUxHT1JJVEhNKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfZGxrbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9WRU5ET1JfRExLTV9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICQoMSkpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLCQoaGlkZSkgZWNobyAiYXZiX29kbV9kbGttX2hhc2h0cmVlX2VuYWJsZT0kKEJPQVJEX0FWQl9FTkFCTEUpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKLSAgICAkKGhpZGUpIGVjaG8gImF2Yl9vZG1fZGxrbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfT0RNX0RMS01fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSxcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfZGxrbV9rZXlfcGF0aD0kKEJPQVJEX0FWQl9WRU5ET1JfRExLTV9LRVlfUEFUSCkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9kbGttX2FsZ29yaXRobT0kKEJPQVJEX0FWQl9WRU5ET1JfRExLTV9BTEdPUklUSE0pIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfZGxrbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9WRU5ET1JfRExLTV9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICQoMSkkKG5ld2xpbmUpKSkgXAorICAkKGlmICQoZmlsdGVyICQoMiksb2RtX2Rsa20pLCBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfb2RtX2Rsa21faGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAkKGhpZGUpIGVjaG8gImF2Yl9vZG1fZGxrbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfT0RNX0RMS01fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSQobmV3bGluZSkgXAogICAgICQoaWYgJChCT0FSRF9BVkJfT0RNX0RMS01fS0VZX1BBVEgpLFwKLSAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfb2RtX2Rsa21fa2V5X3BhdGg9JChCT0FSRF9BVkJfT0RNX0RMS01fS0VZX1BBVEgpIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9kbGttX2FsZ29yaXRobT0kKEJPQVJEX0FWQl9PRE1fRExLTV9BTEdPUklUSE0pIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9kbGttX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX09ETV9ETEtNX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX2Rsa21faGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksXAotICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9kbGttX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9TWVNURU1fRExLTV9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9kbGttX2tleV9wYXRoPSQoQk9BUkRfQVZCX09ETV9ETEtNX0tFWV9QQVRIKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfb2RtX2Rsa21fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX09ETV9ETEtNX0FMR09SSVRITSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9kbGttX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX09ETV9ETEtNX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSQobmV3bGluZSkpKSBcCisgICQoaWYgJChmaWx0ZXIgJCgyKSxzeXN0ZW1fZGxrbSksIFwKKyAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZGxrbV9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9kbGttX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9TWVNURU1fRExLTV9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpJChuZXdsaW5lKSBcCiAgICAgJChpZiAkKEJPQVJEX0FWQl9TWVNURU1fRExLTV9LRVlfUEFUSCksXAotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZGxrbV9rZXlfcGF0aD0kKEJPQVJEX0FWQl9TWVNURU1fRExLTV9LRVlfUEFUSCkiID4+ICQoMSkKLSAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX2Rsa21fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9ETEtNX0FMR09SSVRITSkiID4+ICQoMSkKLSAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX2Rsa21fcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9TWVNURU1fU1lTVEVNX0RMS01fUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9kbGttX2tleV9wYXRoPSQoQk9BUkRfQVZCX1NZU1RFTV9ETEtNX0tFWV9QQVRIKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX2Rsa21fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9ETEtNX0FMR09SSVRITSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9kbGttX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfU1lTVEVNX1NZU1RFTV9ETEtNX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSQobmV3bGluZSkpKSBcCispCiAkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpKSxcCiAgICAgJChoaWRlKSBlY2hvICJyZWNvdmVyeV9hc19ib290PXRydWUiID4+ICQoMSkpCi0kKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9CVUlMRF9HS0lfQk9PVF9JTUFHRV9XSVRIT1VUX1JBTURJU0spKSxcCi0gICAgJChoaWRlKSBlY2hvICJna2lfYm9vdF9pbWFnZV93aXRob3V0X3JhbWRpc2s9dHJ1ZSIgPj4gJCgxKSkKICQoaGlkZSkgZWNobyAicm9vdF9kaXI9JChUQVJHRVRfUk9PVF9PVVQpIiA+PiAkKDEpCiAkKGlmICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTl9TSVpFKSksXAogICAgICQoaGlkZSkgZWNobyAidXNlX2R5bmFtaWNfcGFydGl0aW9uX3NpemU9dHJ1ZSIgPj4gJCgxKSkKKyQoaWYgJChDT1BZX0lNQUdFU19GT1JfVEFSR0VUX0ZJTEVTX1pJUCksXAorICAgICQoaGlkZSkgZWNobyAidXNlX2ZpeGVkX3RpbWVzdGFtcD10cnVlIiA+PiAkKDEpKQogJChpZiAkKDMpLCQoaGlkZSkgJChmb3JlYWNoIGt2LCQoMyksZWNobyAiJChrdikiID4+ICQoMSk7KSkKKyQoaGlkZSkgc29ydCAtbyAkKDEpICQoMSkKIGVuZGVmCiAKICMgJCgxKTogdGhlIHBhdGggb2YgdGhlIG91dHB1dCBkaWN0aW9uYXJ5IGZpbGUKQEAgLTIzNjcsNyArMjY4MywxMSBAQAogICAgIFRBUkdFVF9SRUNPVkVSWV9VSV9QUk9HUkVTU19CQVJfQkFTRUxJTkU6cHJvZ3Jlc3NfYmFyX2Jhc2VsaW5lIFwKICAgICBUQVJHRVRfUkVDT1ZFUllfVUlfVE9VQ0hfTE9XX1RIUkVTSE9MRDp0b3VjaF9sb3dfdGhyZXNob2xkIFwKICAgICBUQVJHRVRfUkVDT1ZFUllfVUlfVE9VQ0hfSElHSF9USFJFU0hPTEQ6dG91Y2hfaGlnaF90aHJlc2hvbGQgXAotICAgIFRBUkdFVF9SRUNPVkVSWV9VSV9WUl9TVEVSRU9fT0ZGU0VUOnZyX3N0ZXJlb19vZmZzZXQKKyAgICBUQVJHRVRfUkVDT1ZFUllfVUlfVlJfU1RFUkVPX09GRlNFVDp2cl9zdGVyZW9fb2Zmc2V0IFwKKyAgICBUQVJHRVRfUkVDT1ZFUllfVUlfQlJJR0hUTkVTU19GSUxFOmJyaWdodG5lc3NfZmlsZSBcCisgICAgVEFSR0VUX1JFQ09WRVJZX1VJX01BWF9CUklHSFRORVNTX0ZJTEU6bWF4X2JyaWdodG5lc3NfZmlsZSBcCisgICAgVEFSR0VUX1JFQ09WRVJZX1VJX0JSSUdIVE5FU1NfTk9STUFMOmJyaWdodG5lc3Nfbm9ybWFsX3BlcmNlbnQgXAorICAgIFRBUkdFVF9SRUNPVkVSWV9VSV9CUklHSFRORVNTX0RJTU1FRDpicmlnaHRuZXNzX2RpbW1lZF9wZXJjZW50CiAKICMgUGFyc2VzIHRoZSBnaXZlbiBsaXN0IG9mIGJ1aWxkIHZhcmlhYmxlcyBhbmQgd3JpdGVzIHRoZWlyIHZhbHVlcyBhcyBidWlsZCBwcm9wZXJ0aWVzIGlmIGRlZmluZWQuCiAjIEZvciBleGFtcGxlLCBpZiBhIHRhcmdldCBkZWZpbmVzIGBUQVJHRVRfUkVDT1ZFUllfVUlfTUFSR0lOX0hFSUdIVCA6PSAxMDBgLApAQCAtMjQ4Nyw2ICsyODA3LDggQEAKIAkkKGlmICQoc3RyaXAgJChyZWNvdmVyeV93aXBlKSksIFwKIAkgIGNwIC1mICQocmVjb3Zlcnlfd2lwZSkgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL3N5c3RlbS9ldGMvcmVjb3Zlcnkud2lwZSkKIAlsbiAtc2YgcHJvcC5kZWZhdWx0ICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9kZWZhdWx0LnByb3AKKwkjIFNpbGVuY2Ugd2FybmluZ3MgaW4gZmlyc3Rfc3RhZ2VfY29uc29sZS4KKwl0b3VjaCAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvbGlua2VyY29uZmlnL2xkLmNvbmZpZy50eHQKIAkkKEJPQVJEX1JFQ09WRVJZX0lNQUdFX1BSRVBBUkUpCiAJJChoaWRlKSB0b3VjaCAkQAogCkBAIC0yNDk2LDE1ICsyODE4LDkgQEAKICMgJCgxKTogb3V0cHV0IGZpbGUKICMgJCgyKTogb3B0aW9uYWwga2VybmVsIGZpbGUKIGRlZmluZSBidWlsZC1yZWNvdmVyeWltYWdlLXRhcmdldAotICAkKGlmICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSksIFwKLSAgICAkKE1LQk9PVElNRykgJChpZiAkKHN0cmlwICQoMikpLC0ta2VybmVsICQoc3RyaXAgJCgyKSkpICQoSU5URVJOQUxfUkVDT1ZFUllJTUFHRV9BUkdTKSBcCi0gICAgICAgICAgICAgICAgICQoSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUykgJChCT0FSRF9SRUNPVkVSWV9NS0JPT1RJTUdfQVJHUykgXAotICAgICAgICAgICAgICAgICAtLW91dHB1dCAkKDEpLnVuc2lnbmVkLCBcCi0gICAgJChNS0JPT1RJTUcpICQoaWYgJChzdHJpcCAkKDIpKSwtLWtlcm5lbCAkKHN0cmlwICQoMikpKSAkKElOVEVSTkFMX1JFQ09WRVJZSU1BR0VfQVJHUykgXAotICAgICAgICAgICAgICAgICAkKElOVEVSTkFMX01LQk9PVElNR19WRVJTSU9OX0FSR1MpIFwKLSAgICAgICAgICAgICAgICAgJChCT0FSRF9SRUNPVkVSWV9NS0JPT1RJTUdfQVJHUykgLS1vdXRwdXQgJCgxKSkKLSAgJChpZiAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkpLCBcCi0gICAgJChWQk9PVF9TSUdORVIpICQoRlVUSUxJVFkpICQoMSkudW5zaWduZWQgJChQUk9EVUNUX1ZCT09UX1NJR05JTkdfS0VZKS52YnB1YmsgJChQUk9EVUNUX1ZCT09UX1NJR05JTkdfS0VZKS52YnByaXZrICQoUFJPRFVDVF9WQk9PVF9TSUdOSU5HX1NVQktFWSkudmJwcml2ayAkKDEpLmtleWJsb2NrICQoMSkpCisgICQoTUtCT09USU1HKSAkKGlmICQoc3RyaXAgJCgyKSksLS1rZXJuZWwgJChzdHJpcCAkKDIpKSkgJChJTlRFUk5BTF9SRUNPVkVSWUlNQUdFX0FSR1MpIFwKKyAgICAgICAgICAgICAgICQoSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUykgXAorICAgICAgICAgICAgICAgJChCT0FSRF9SRUNPVkVSWV9NS0JPT1RJTUdfQVJHUykgLS1vdXRwdXQgJCgxKQogICAkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpKSwgXAogICAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJCgxKSwkKGNhbGwgZ2V0LWhhc2gtaW1hZ2UtbWF4LXNpemUsJChjYWxsIGdldC1ib290aW1hZ2UtcGFydGl0aW9uLXNpemUsJCgxKSxib290KSkpLCBcCiAgICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKDEpLCQoY2FsbCBnZXQtaGFzaC1pbWFnZS1tYXgtc2l6ZSwkKEJPQVJEX1JFQ09WRVJZSU1BR0VfUEFSVElUSU9OX1NJWkUpKSkpCkBAIC0yNTE1LDkgKzI4MzEsNiBAQAogZW5kZWYKIAogcmVjb3ZlcnlpbWFnZS1kZXBzIDo9ICQoTUtCT09USU1HKSAkKHJlY292ZXJ5X3JhbWRpc2spICQocmVjb3Zlcnlfa2VybmVsKQotaWZlcSAodHJ1ZSwkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpKQotICByZWNvdmVyeWltYWdlLWRlcHMgKz0gJChWQk9PVF9TSUdORVIpCi1lbmRpZgogaWZlcSAodHJ1ZSwkKEJPQVJEX0FWQl9FTkFCTEUpKQogICByZWNvdmVyeWltYWdlLWRlcHMgKz0gJChBVkJUT09MKSAkKEJPQVJEX0FWQl9CT09UX0tFWV9QQVRIKQogZW5kaWYKQEAgLTI5OTcsNyArMzMxMCw2IEBACiAJICBleGl0IDE7IFwKIAlmaQogCWxuIC1zZm4gJDIgJDEKLSQxOiAuS0FUSV9TWU1MSU5LX09VVFBVVFMgOj0gJDEKICkKICQoZXZhbCBQQVJUSVRJT05fQ09NUEFUX1NZTUxJTktTICs9ICQxKQogJDEKQEAgLTMxNTYsNiArMzQ2OCwzMSBAQAogCiBGVUxMX1NZU1RFTUlNQUdFX0RFUFMgKz0gJChJTlRFUk5BTF9ST09UX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX1JPT1QpCiAKKyMgUmV0dXJucyBhIGxpc3Qgb2YgRVhUUkFfSU5TVEFMTF9aSVBTIHRyaW9zIHdob3NlIHByaW1hcnkgZmlsZSBpcyBjb250YWluZWQgd2l0aGluICQoMSkKKyMgVGhlIHRyaW9zIHdpbGwgY29udGFpbiB0aGUgcHJpbWFyeSBpbnN0YWxsZWQgZmlsZSA6IHRoZSBkaXJlY3RvcnkgdG8gdW56aXAgdGhlIHppcCB0byA6IHRoZSB6aXAKK2RlZmluZSByZWxldmFudC1leHRyYS1pbnN0YWxsLXppcHMKKyQoc3RyaXAgJChmb3JlYWNoIHAsJChFWFRSQV9JTlNUQUxMX1pJUFMpLCBcCisgICQoaWYgJChmaWx0ZXIgJChjYWxsIHdvcmQtY29sb24sMSwkKHApKSwkKDEpKSwgXAorICAgICQocCkpKSkKK2VuZGVmCisKKyMgV3JpdGVzIGEgdGV4dCBmaWxlIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBmaWxlcyB0aGF0IHdpbGwgYmUgaW5zaWRlIGEgcGFydGl0aW9uLgorIyBBbGwgdGhlIGZpbGUgcGF0aHMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgcGFydGl0aW9uJ3Mgc3RhZ2luZyBkaXJlY3RvcnkuCisjIEl0IHdpbGwgYWxzbyB0YWtlIGludG8gYWNjb3VudCBmaWxlcyBpbnNpZGUgemlwcyBsaXN0ZWQgaW4gRVhUUkFfSU5TVEFMTF9aSVBTLgorIworIyBBcmd1bWVudHM6CisjICAgJCgxKTogT3V0cHV0IGZpbGUKKyMgICAkKDIpOiBUaGUgcGFydGl0aW9uJ3Mgc3RhZ2luZyBkaXJlY3RvcnkKKyMgICAkKDMpOiBGaWxlcyB0byBpbmNsdWRlIGluIHRoZSBwYXJ0aXRpb24KK2RlZmluZSB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0CiskKDEpOiAkJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZXh0cmFfaW5zdGFsbF96aXBzX2ZpbGVfbGlzdCAkKGZvcmVhY2ggcCwkKGNhbGwgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzLCQoZmlsdGVyICQoMikvJSwkKDMpKSksJChjYWxsIHdvcmQtY29sb24sMywkKHApKSkKKwlAZWNobyBXcml0aW5nICQkQAorCXJtIC1mICQkQAorCWVjaG8gLW4gPiAkJEAKKwkkJChmb3JlYWNoIGYsJChzdWJzdCAkKDIpLywsJChmaWx0ZXIgJCgyKS8lLCQoMykpKSxlY2hvICIkJChmKSIgPj4gJCRAJCQobmV3bGluZSkpCisJJCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2V4dHJhX2luc3RhbGxfemlwc19maWxlX2xpc3QgJCgyKSAkKGNhbGwgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzLCQoZmlsdGVyICQoMikvJSwkKDMpKSkgPj4gJCRACitlbmRlZgorCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpZmRlZiBCVUlMRElOR19TWVNURU1fSU1BR0UKIApAQCAtMzIwMSw5ICszNTM4LDggQEAKIC5QSE9OWTogaW5zdGFsbGVkLWZpbGUtbGlzdAogaW5zdGFsbGVkLWZpbGUtbGlzdDogJChJTlNUQUxMRURfRklMRVNfRklMRSkKIAotc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcyA6PSBcCi0gICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsc3lzdGVtaW1hZ2UpCi1CVUlMVF9TWVNURU1JTUFHRSA6PSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL3N5c3RlbS5pbWcKK3N5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMgOj0kPSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxzeXN0ZW0pCitCVUlMVF9TWVNURU1JTUFHRSA6PSQ9ICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtLmltZwogCiAjICQoMSk6IG91dHB1dCBmaWxlCiBkZWZpbmUgYnVpbGQtc3lzdGVtaW1hZ2UtdGFyZ2V0CkBAIC0zMjEzLDE3ICszNTQ5LDUyIEBACiAgICAgICBza2lwX2ZzY2s9dHJ1ZSkKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAorICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKICAgICAgICAgICAkKFRBUkdFVF9PVVQpICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2ltYWdlX2luZm8udHh0ICQoMSkgJChUQVJHRVRfT1VUKSBcCiAgICAgICAgICAgfHwgKCBta2RpciAtcCAkJHtESVNUX0RJUn07IFwKICAgICAgICAgICAgICAgIGNwICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEUpICQke0RJU1RfRElSfS9pbnN0YWxsZWQtZmlsZXMtcmVzY3VlZC50eHQ7IFwKICAgICAgICAgICAgICAgIGV4aXQgMSApCiBlbmRlZgogCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX09VVCksJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpKSkKKworaWZuZXEgKCQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSksKQorZmlsZV9saXN0X2RpZmYgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZmlsZV9saXN0X2RpZmYkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCitzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCA6PSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfZGlmZi50aW1lc3RhbXAKKworJChzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCk6IFwKKwkgICAgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0IFwKKwkgICAgJChBTExfTU9EVUxFUy4kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLkZJTEVTWVNURU1fRklMRUxJU1QpIFwKKwkgICAgJChBTExfTU9EVUxFUy5zeXN0ZW1faW1hZ2VfZGlmZl9hbGxvd2xpc3QuSU5TVEFMTEVEKSBcCisJICAgICQoZmlsZV9saXN0X2RpZmYpCisJJChmaWxlX2xpc3RfZGlmZikgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0IFwKKwkgICQoQUxMX01PRFVMRVMuJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKS5GSUxFU1lTVEVNX0ZJTEVMSVNUKSBcCisJICAkKEFMTF9NT0RVTEVTLnN5c3RlbV9pbWFnZV9kaWZmX2FsbG93bGlzdC5JTlNUQUxMRUQpICQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSkKKwl0b3VjaCAkQAorCiskKEJVSUxUX1NZU1RFTUlNQUdFKTogJChzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCkKK2VuZGlmCisKKyMgVXNlZCBieSBzb29uZyBzYW5kd2ljaCB0byByZXF1ZXN0IHRoZSBzdGFnaW5nIGRpciBiZSBidWlsdAorJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9zdGFnaW5nX2Rpci5zdGFtcDogJChmaWx0ZXIgJChUQVJHRVRfT1VUKS8lLCQoRlVMTF9TWVNURU1JTUFHRV9ERVBTKSkKKwl0b3VjaCAkQAorCiBpZmVxICgkKEJPQVJEX0FWQl9FTkFCTEUpLHRydWUpCiAkKEJVSUxUX1NZU1RFTUlNQUdFKTogJChCT0FSRF9BVkJfU1lTVEVNX0tFWV9QQVRIKQogZW5kaWYKLSQoQlVJTFRfU1lTVEVNSU1BR0UpOiAkKEZVTExfU1lTVEVNSU1BR0VfREVQUykgJChJTlNUQUxMRURfRklMRVNfRklMRSkKKworaWZlcSAoJChVU0VfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLHRydWUpCitpZmVxICgkKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLCkKKyQoZXJyb3IgUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSBtdXN0IGJlIHNldCBpZiBVU0VfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UgaXMgdHJ1ZSkKK2VuZGlmCitzb29uZ19kZWZpbmVkX3N5c3RlbV9pbWFnZSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQywkKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpKS8kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpCiskKEJVSUxUX1NZU1RFTUlNQUdFKTogJChJTlNUQUxMRURfRklMRVNfRklMRSkgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0ICQoc29vbmdfZGVmaW5lZF9zeXN0ZW1faW1hZ2UpCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsICQoc29vbmdfZGVmaW5lZF9zeXN0ZW1faW1hZ2UpLCAkKEJVSUxUX1NZU1RFTUlNQUdFKSkpCitzb29uZ19kZWZpbmVkX3N5c3RlbV9pbWFnZSA6PQorZWxzZQorJChCVUlMVF9TWVNURU1JTUFHRSk6ICQoRlVMTF9TWVNURU1JTUFHRV9ERVBTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGNhbGwgYnVpbGQtc3lzdGVtaW1hZ2UtdGFyZ2V0LCRAKQorZW5kaWYKIAogJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoQlVJTFRfU1lTVEVNSU1BR0UpLHN5c3RlbS9leHRyYXMpCiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoQlVJTFRfU1lTVEVNSU1BR0UpLCQoRlVMTF9TWVNURU1JTUFHRV9ERVBTKSwkKFBST0RVQ1RfT1VUKS86LykKQEAgLTMyNzgsNyArMzY0OSw3IEBACiAKIC5QSE9OWTogc3lzdGVtaW1hZ2Utbm9kZXBzIHNub2QKIHN5c3RlbWltYWdlLW5vZGVwcyBzbm9kOiAkKGZpbHRlci1vdXQgc3lzdGVtaW1hZ2Utbm9kZXBzIHNub2QsJChNQUtFQ01ER09BTFMpKSBcCi0JICAgICAgICAgICAgfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKKwkgICAgICAgICAgICB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAlAZWNobyAibWFrZSAkQDogaWdub3JpbmcgZGVwZW5kZW5jaWVzIgogCSQoY2FsbCBidWlsZC1zeXN0ZW1pbWFnZS10YXJnZXQsJChJTlNUQUxMRURfU1lTVEVNSU1BR0VfVEFSR0VUKSkKIAkkKGhpZGUpICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfU1lTVEVNSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKQEAgLTMyODgsOCArMzY1OSw4IEBACiAKIGVuZGlmICMgQlVJTERJTkdfU1lTVEVNX0lNQUdFCiAKLS5QSE9OWTogc3luYyBzeW5jc3lzCi1zeW5jIHN5bmNzeXM6ICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpCisuUEhPTlk6IHN5bmMgc3luY3N5cyBzeW5jX3N5c3RlbQorc3luYyBzeW5jc3lzIHN5bmNfc3lzdGVtOiAkKElOVEVSTkFMX1NZU1RFTUlNQUdFX0ZJTEVTKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIE9sZCBQREsgZnVzaW9uIHRhcmdldHMKQEAgLTMzMTksNiArMzY5MCw3IEBACiAgICQoY2FsbCBnZW5lcmF0ZS1pbWFnZS1wcm9wLWRpY3Rpb25hcnksICQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS91c2VyZGF0YV9pbWFnZV9pbmZvLnR4dCx1c2VyZGF0YSxza2lwX2ZzY2s9dHJ1ZSkKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAorICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKHVzZXJkYXRhaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAogICAgICAgICAgICQoVEFSR0VUX09VVF9EQVRBKSAkKHVzZXJkYXRhaW1hZ2VfaW50ZXJtZWRpYXRlcykvdXNlcmRhdGFfaW1hZ2VfaW5mby50eHQgXAogICAgICAgICAgICQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfVVNFUkRBVEFJTUFHRV9UQVJHRVQpLCQoQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSkpCkBAIC0zMzI5LDcgKzM3MDEsMTMgQEAKIElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVF9ERVBTIDo9IFwKICAgICAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgXAogICAgICQoSU5URVJOQUxfVVNFUkRBVEFJTUFHRV9GSUxFUykKLSQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKTogJChJTlNUQUxMRURfVVNFUkRBVEFJTUFHRV9UQVJHRVRfREVQUykKKworJChldmFsICQoY2FsbCB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0LCQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX09VVF9EQVRBKSwkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVF9ERVBTKSkpCisjIFVzZWQgYnkgc29vbmcgc2FuZHdpY2ggdG8gcmVxdWVzdCB0aGUgc3RhZ2luZyBkaXIgYmUgYnVpbHQKKyQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS9zdGFnaW5nX2Rpci5zdGFtcDogJChmaWx0ZXIgJChUQVJHRVRfT1VUX0RBVEEpLyUsJChJTlNUQUxMRURfVVNFUkRBVEFJTUFHRV9UQVJHRVRfREVQUykpCisJdG91Y2ggJEAKKworJChJTlNUQUxMRURfVVNFUkRBVEFJTUFHRV9UQVJHRVQpOiAkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVF9ERVBTKSAkKHVzZXJkYXRhaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtdXNlcmRhdGFpbWFnZS10YXJnZXQpCiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCksKQpAQCAtMzMzOCw3ICszNzE2LDcgQEAKIFVOTU9VTlRFRF9OT1RJQ0VfVkVORE9SX0RFUFMrPSAkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCkKIAogLlBIT05ZOiB1c2VyZGF0YWltYWdlLW5vZGVwcwotdXNlcmRhdGFpbWFnZS1ub2RlcHM6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpCit1c2VyZGF0YWltYWdlLW5vZGVwczogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJCh1c2VyZGF0YWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLXVzZXJkYXRhaW1hZ2UtdGFyZ2V0KQogCiBlbmRpZiAjIEJVSUxESU5HX1VTRVJEQVRBX0lNQUdFCkBAIC0zMzU3LDQ1ICszNzM1LDYgQEAKIAl0YXIgY2ZqICQoQVNBTl9JTl9TWVNURU1fSU5TVEFMTEVEKSAkKEFTQU5fU1lTVEVNX0lOU1RBTExfT1BUSU9OUykgLUMgJChUQVJHRVRfT1VUX0RBVEEpLy4uICQoQVNBTl9PVVRfRElSU19GT1JfU1lTVEVNX0lOU1RBTEwpID4vZGV2L251bGwKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBwYXJ0aXRpb24gdGFibGUgaW1hZ2UKLWlmZGVmIEJPQVJEX0JQVF9JTlBVVF9GSUxFUwotCi1CVUlMVF9CUFRJTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvcGFydGl0aW9uLXRhYmxlLmltZwotQlVJTFRfQlBUSlNPTl9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvcGFydGl0aW9uLXRhYmxlLmJwdAotCi1JTlRFUk5BTF9CVkJUT09MX01BS0VfVEFCTEVfQVJHUyA6PSBcCi0JLS1vdXRwdXRfZ3B0ICQoQlVJTFRfQlBUSU1BR0VfVEFSR0VUKSBcCi0JLS1vdXRwdXRfanNvbiAkKEJVSUxUX0JQVEpTT05fVEFSR0VUKSBcCi0JJChmb3JlYWNoIGZpbGUsICQoQk9BUkRfQlBUX0lOUFVUX0ZJTEVTKSwgLS1pbnB1dCAkKGZpbGUpKQotCi1pZmRlZiBCT0FSRF9CUFRfRElTS19TSVpFCi1JTlRFUk5BTF9CVkJUT09MX01BS0VfVEFCTEVfQVJHUyArPSAtLWRpc2tfc2l6ZSAkKEJPQVJEX0JQVF9ESVNLX1NJWkUpCi1lbmRpZgotCi1kZWZpbmUgYnVpbGQtYnB0aW1hZ2UtdGFyZ2V0Ci0gICQoY2FsbCBwcmV0dHksIlRhcmdldCBwYXJ0aXRpb24gdGFibGUgaW1hZ2U6ICQoSU5TVEFMTEVEX0JQVElNQUdFX1RBUkdFVCkiKQotICAkKGhpZGUpICQoQlBUVE9PTCkgbWFrZV90YWJsZSAkKElOVEVSTkFMX0JWQlRPT0xfTUFLRV9UQUJMRV9BUkdTKSAkKEJPQVJEX0JQVF9NQUtFX1RBQkxFX0FSR1MpCi1lbmRlZgotCi1JTlNUQUxMRURfQlBUSU1BR0VfVEFSR0VUIDo9ICQoQlVJTFRfQlBUSU1BR0VfVEFSR0VUKQotJChCVUlMVF9CUFRKU09OX1RBUkdFVCk6ICQoSU5TVEFMTEVEX0JQVElNQUdFX1RBUkdFVCkKLQkkKGhpZGUpIHRvdWNoIC1jICQoQlVJTFRfQlBUSlNPTl9UQVJHRVQpCi0KLSQoSU5TVEFMTEVEX0JQVElNQUdFX1RBUkdFVCk6ICQoQlBUVE9PTCkgJChCT0FSRF9CUFRfSU5QVVRfRklMRVMpCi0JJChidWlsZC1icHRpbWFnZS10YXJnZXQpCi0KLSQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKElOU1RBTExFRF9CUFRJTUFHRV9UQVJHRVQpLCkKLSQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfQlBUSU1BR0VfVEFSR0VUKSwkKEJPQVJEX0JQVF9JTlBVVF9GSUxFUyksJChQUk9EVUNUX09VVCkvOi8pCi0KLVVOTU9VTlRFRF9OT1RJQ0VfVkVORE9SX0RFUFMrPSAkKElOU1RBTExFRF9CUFRJTUFHRV9UQVJHRVQpCi0KLS5QSE9OWTogYnB0aW1hZ2Utbm9kZXBzCi1icHRpbWFnZS1ub2RlcHM6Ci0JJChidWlsZC1icHRpbWFnZS10YXJnZXQpCi0KLWVuZGlmICMgQk9BUkRfQlBUX0lOUFVUX0ZJTEVTCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgY2FjaGUgcGFydGl0aW9uIGltYWdlCiBJTlNUQUxMRURfRklMRVNfT1VUU0lERV9JTUFHRVMgOj0gJChmaWx0ZXItb3V0ICQoVEFSR0VUX09VVF9DQUNIRSkvJSwgJChJTlNUQUxMRURfRklMRVNfT1VUU0lERV9JTUFHRVMpKQogaWZkZWYgQlVJTERJTkdfQ0FDSEVfSU1BR0UKQEAgLTM0MTMsMTQgKzM3NTIsMjAgQEAKICAgJChjYWxsIGdlbmVyYXRlLWltYWdlLXByb3AtZGljdGlvbmFyeSwgJChjYWNoZWltYWdlX2ludGVybWVkaWF0ZXMpL2NhY2hlX2ltYWdlX2luZm8udHh0LGNhY2hlLHNraXBfZnNjaz10cnVlKQogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCisgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQoY2FjaGVpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0KSBcCiAgICAgICAgICAgJChUQVJHRVRfT1VUX0NBQ0hFKSAkKGNhY2hlaW1hZ2VfaW50ZXJtZWRpYXRlcykvY2FjaGVfaW1hZ2VfaW5mby50eHQgXAogICAgICAgICAgICQoSU5TVEFMTEVEX0NBQ0hFSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfQ0FDSEVJTUFHRV9UQVJHRVQpLCQoQk9BUkRfQ0FDSEVJTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgogCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJChjYWNoZWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfT1VUX0NBQ0hFKSwkKElOVEVSTkFMX0NBQ0hFSU1BR0VfRklMRVMpKSkKKyMgVXNlZCBieSBzb29uZyBzYW5kd2ljaCB0byByZXF1ZXN0IHRoZSBzdGFnaW5nIGRpciBiZSBidWlsdAorJChjYWNoZWltYWdlX2ludGVybWVkaWF0ZXMpL3N0YWdpbmdfZGlyLnN0YW1wOiAkKGZpbHRlciAkKFRBUkdFVF9PVVRfQ0FDSEUpLyUsJChJTlRFUk5BTF9DQUNIRUlNQUdFX0ZJTEVTKSkKKwl0b3VjaCAkQAorCiAjIFdlIGp1c3QgYnVpbGQgdGhpcyBkaXJlY3RseSB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KIElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCA6PSAkKEJVSUxUX0NBQ0hFSU1BR0VfVEFSR0VUKQotJChJTlNUQUxMRURfQ0FDSEVJTUFHRV9UQVJHRVQpOiAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChJTlRFUk5BTF9DQUNIRUlNQUdFX0ZJTEVTKQorJChJTlNUQUxMRURfQ0FDSEVJTUFHRV9UQVJHRVQpOiAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChJTlRFUk5BTF9DQUNIRUlNQUdFX0ZJTEVTKSAkKGNhY2hlaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtY2FjaGVpbWFnZS10YXJnZXQpCiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCksKQpAQCAtMzQyOSw3ICszNzc0LDcgQEAKIFVOTU9VTlRFRF9OT1RJQ0VfVkVORE9SX0RFUFMrPSAkKElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCkKIAogLlBIT05ZOiBjYWNoZWltYWdlLW5vZGVwcwotY2FjaGVpbWFnZS1ub2RlcHM6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpCitjYWNoZWltYWdlLW5vZGVwczogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChjYWNoZWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLWNhY2hlaW1hZ2UtdGFyZ2V0KQogCiBlbHNlICMgQlVJTERJTkdfQ0FDSEVfSU1BR0UKQEAgLTM0OTQsMTYgKzM4MzksMjIgQEAKICAgJChjYWxsIGdlbmVyYXRlLWltYWdlLXByb3AtZGljdGlvbmFyeSwgJChzeXN0ZW1vdGhlcmltYWdlX2ludGVybWVkaWF0ZXMpL3N5c3RlbV9vdGhlcl9pbWFnZV9pbmZvLnR4dCxzeXN0ZW0sc2tpcF9mc2NrPXRydWUpCiAgIFBBVEg9JChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyk6JCRQQVRIIFwKICAgICAgICQoQlVJTERfSU1BR0UpIFwKKyAgICAgICAgICAkKGlmICQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSwsLS1pbnB1dC1kaXJlY3RvcnktZmlsdGVyLWZpbGUgJChzeXN0ZW1vdGhlcmltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKICAgICAgICAgICAkKFRBUkdFVF9PVVRfU1lTVEVNX09USEVSKSAkKHN5c3RlbW90aGVyaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX290aGVyX2ltYWdlX2luZm8udHh0IFwKICAgICAgICAgICAkKElOU1RBTExFRF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCiAKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKHN5c3RlbW90aGVyaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCwkKFRBUkdFVF9PVVRfU1lTVEVNX09USEVSKSwkKElOVEVSTkFMX1NZU1RFTU9USEVSSU1BR0VfRklMRVMpKSkKKyMgVXNlZCBieSBzb29uZyBzYW5kd2ljaCB0byByZXF1ZXN0IHRoZSBzdGFnaW5nIGRpciBiZSBidWlsdAorJChzeXN0ZW1vdGhlcmltYWdlX2ludGVybWVkaWF0ZXMpL3N0YWdpbmdfZGlyLnN0YW1wOiAkKGZpbHRlciAkKFRBUkdFVF9PVVRfU1lTVEVNX09USEVSKS8lLCQoSU5URVJOQUxfU1lTVEVNT1RIRVJJTUFHRV9GSUxFUykpCisJdG91Y2ggJEAKKwogIyBXZSBqdXN0IGJ1aWxkIHRoaXMgZGlyZWN0bHkgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24uCiBJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQgOj0gJChCVUlMVF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVCkKIGlmbmVxICh0cnVlLCQoU0FOSVRJWkVfTElURSkpCiAjIE9ubHkgY3JlYXRlIHN5c3RlbV9vdGhlciB3aGVuIG5vdCBidWlsZGluZyB0aGUgc2Vjb25kIHN0YWdlIG9mIGEgU0FOSVRJWkVfTElURSBidWlsZC4KLSQoSU5TVEFMTEVEX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKTogJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoSU5URVJOQUxfU1lTVEVNT1RIRVJJTUFHRV9GSUxFUykgJChJTlNUQUxMRURfRklMRVNfRklMRV9TWVNURU1PVEhFUikKKyQoSU5TVEFMTEVEX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKTogJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoSU5URVJOQUxfU1lTVEVNT1RIRVJJTUFHRV9GSUxFUykgJChJTlNUQUxMRURfRklMRVNfRklMRV9TWVNURU1PVEhFUikgJChzeXN0ZW1vdGhlcmltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLXN5c3RlbW90aGVyaW1hZ2UtdGFyZ2V0KQogCiAkKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQpLCkKQEAgLTM1MTMsNyArMzg2NCw3IEBACiBlbmRpZgogCiAuUEhPTlk6IHN5c3RlbW90aGVyaW1hZ2Utbm9kZXBzCi1zeXN0ZW1vdGhlcmltYWdlLW5vZGVwczogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKK3N5c3RlbW90aGVyaW1hZ2Utbm9kZXBzOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKHN5c3RlbW90aGVyaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtc3lzdGVtb3RoZXJpbWFnZS10YXJnZXQpCiAKIGVuZGlmICMgQlVJTERJTkdfU1lTVEVNX09USEVSX0lNQUdFCkBAIC0zNTU1LDcgKzM5MDYsNyBAQAogICBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKF92ZW5kb3JfZGxrbV9saWJfbW9kdWxlc19zeW1saW5rKQogZW5kaWYKIAotIyBJbnN0YWxsIHZlbmRvci9ldGMvbGlua2VyLmNvbmZpZy5wYiB3aXRoIFBST0RVQ1RfVkVORE9SX0xJTktFUl9DT05GSUdfRlJBR01FTlRTIGFuZCBTVFVCX0xJQlJBUklFUworIyBJbnN0YWxsIHZlbmRvci9ldGMvbGlua2VyLmNvbmZpZy5wYiB3aXRoIFBST0RVQ1RfVkVORE9SX0xJTktFUl9DT05GSUdfRlJBR01FTlRTIGFuZCBTT09OR19TVFVCX1ZFTkRPUl9MSUJSQVJJRVMKIHZlbmRvcl9saW5rZXJfY29uZmlnX2ZpbGUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUikvZXRjL2xpbmtlci5jb25maWcucGIKICQodmVuZG9yX2xpbmtlcl9jb25maWdfZmlsZSk6IHByaXZhdGVfbGlua2VyX2NvbmZpZ19mcmFnbWVudHMgOj0gJChQUk9EVUNUX1ZFTkRPUl9MSU5LRVJfQ09ORklHX0ZSQUdNRU5UUykKICQodmVuZG9yX2xpbmtlcl9jb25maWdfZmlsZSk6ICQoSU5URVJOQUxfVkVORE9SSU1BR0VfRklMRVMpICQoUFJPRFVDVF9WRU5ET1JfTElOS0VSX0NPTkZJR19GUkFHTUVOVFMpIHwgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvY29udl9saW5rZXJfY29uZmlnCkBAIC0zNTY2LDcgKzM5MTcsNyBAQAogCQktLXNvdXJjZSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKHByaXZhdGVfbGlua2VyX2NvbmZpZ19mcmFnbWVudHMpKSBcCiAJCS0tb3V0cHV0ICRACiAJJChIT1NUX09VVF9FWEVDVVRBQkxFUykvY29udl9saW5rZXJfY29uZmlnIHN5c3RlbXByb3ZpZGUgLS1zb3VyY2UgJEAgXAotCQktLW91dHB1dCAkQCAtLXZhbHVlICIkKFNUVUJfTElCUkFSSUVTKSIgLS1zeXN0ZW0gIiQoVEFSR0VUX09VVF9WRU5ET1IpIgorCQktLW91dHB1dCAkQCAtLXZhbHVlICIkKFNPT05HX1NUVUJfVkVORE9SX0xJQlJBUklFUykiIC0tc3lzdGVtICIkKFRBUkdFVF9PVVRfVkVORE9SKSIKICQoY2FsbCBkZWZpbmUgZGVjbGFyZS0wcC10YXJnZXQsJCh2ZW5kb3JfbGlua2VyX2NvbmZpZ19maWxlKSwpCiBJTlRFUk5BTF9WRU5ET1JJTUFHRV9GSUxFUyArPSAkKHZlbmRvcl9saW5rZXJfY29uZmlnX2ZpbGUpCiBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKHZlbmRvcl9saW5rZXJfY29uZmlnX2ZpbGUpCkBAIC0zNTk0LDE4ICszOTQ1LDI1IEBACiAgICQoY2FsbCBnZW5lcmF0ZS1pbWFnZS1wcm9wLWRpY3Rpb25hcnksICQodmVuZG9yaW1hZ2VfaW50ZXJtZWRpYXRlcykvdmVuZG9yX2ltYWdlX2luZm8udHh0LHZlbmRvcixza2lwX2ZzY2s9dHJ1ZSkKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAorICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKHZlbmRvcmltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKICAgICAgICAgICAkKFRBUkdFVF9PVVRfVkVORE9SKSAkKHZlbmRvcmltYWdlX2ludGVybWVkaWF0ZXMpL3ZlbmRvcl9pbWFnZV9pbmZvLnR4dCBcCiAgICAgICAgICAgJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSAkKFJFQ09WRVJZX0ZST01fQk9PVF9QQVRDSCksJChCT0FSRF9WRU5ET1JJTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgogCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJCh2ZW5kb3JpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX09VVF9WRU5ET1IpLCQoSU5URVJOQUxfVkVORE9SSU1BR0VfRklMRVMpKSkKKyMgVXNlZCBieSBzb29uZyBzYW5kd2ljaCB0byByZXF1ZXN0IHRoZSBzdGFnaW5nIGRpciBiZSBidWlsdAorJCh2ZW5kb3JpbWFnZV9pbnRlcm1lZGlhdGVzKS9zdGFnaW5nX2Rpci5zdGFtcDogJChmaWx0ZXIgJChUQVJHRVRfT1VUX1ZFTkRPUikvJSwkKElOVEVSTkFMX1ZFTkRPUklNQUdFX0ZJTEVTKSkKKwl0b3VjaCAkQAorCiAjIFdlIGp1c3QgYnVpbGQgdGhpcyBkaXJlY3RseSB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KIElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQgOj0gJChCVUlMVF9WRU5ET1JJTUFHRV9UQVJHRVQpCiAkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpOiBcCiAgICAgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpIFwKICAgICAkKElOVEVSTkFMX1ZFTkRPUklNQUdFX0ZJTEVTKSBcCiAgICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9WRU5ET1IpIFwKLSAgICAkKFJFQ09WRVJZX0ZST01fQk9PVF9QQVRDSCkKKyAgICAkKFJFQ09WRVJZX0ZST01fQk9PVF9QQVRDSCkgXAorICAgICQodmVuZG9yaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtdmVuZG9yaW1hZ2UtdGFyZ2V0KQogCiBWRU5ET1JfTk9USUNFX0RFUFMgKz0gJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKQpAQCAtMzYxNCwxMCArMzk3MiwxMSBAQAogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKElOVEVSTkFMX1ZFTkRPUklNQUdFX0ZJTEVTKSAkKFJFQ09WRVJZX0ZST01fQk9PVF9QQVRIKSwkKFBST0RVQ1RfT1VUKS86LykKIAogLlBIT05ZOiB2ZW5kb3JpbWFnZS1ub2RlcHMgdm5vZAotdmVuZG9yaW1hZ2Utbm9kZXBzIHZub2Q6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpCit2ZW5kb3JpbWFnZS1ub2RlcHMgdm5vZDogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJCh2ZW5kb3JpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC12ZW5kb3JpbWFnZS10YXJnZXQpCiAKLXN5bmM6ICQoSU5URVJOQUxfVkVORE9SSU1BR0VfRklMRVMpCisuUEhPTlk6IHN5bmNfdmVuZG9yCitzeW5jIHN5bmNfdmVuZG9yOiAkKElOVEVSTkFMX1ZFTkRPUklNQUdFX0ZJTEVTKQogCiBlbHNlIGlmZGVmIEJPQVJEX1BSRUJVSUxUX1ZFTkRPUklNQUdFCiBJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3ZlbmRvci5pbWcKQEAgLTM2NTksMTcgKzQwMTgsMjQgQEAKICAgJChjYWxsIGdlbmVyYXRlLWltYWdlLXByb3AtZGljdGlvbmFyeSwgJChwcm9kdWN0aW1hZ2VfaW50ZXJtZWRpYXRlcykvcHJvZHVjdF9pbWFnZV9pbmZvLnR4dCxwcm9kdWN0LHNraXBfZnNjaz10cnVlKQogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCisgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQocHJvZHVjdGltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKICAgICAgICAgICAkKFRBUkdFVF9PVVRfUFJPRFVDVCkgJChwcm9kdWN0aW1hZ2VfaW50ZXJtZWRpYXRlcykvcHJvZHVjdF9pbWFnZV9pbmZvLnR4dCBcCiAgICAgICAgICAgJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpLCQoQk9BUkRfUFJPRFVDVElNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCiAKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKHByb2R1Y3RpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX09VVF9QUk9EVUNUKSwkKElOVEVSTkFMX1BST0RVQ1RJTUFHRV9GSUxFUykpKQorIyBVc2VkIGJ5IHNvb25nIHNhbmR3aWNoIHRvIHJlcXVlc3QgdGhlIHN0YWdpbmcgZGlyIGJlIGJ1aWx0CiskKHByb2R1Y3RpbWFnZV9pbnRlcm1lZGlhdGVzKS9zdGFnaW5nX2Rpci5zdGFtcDogJChmaWx0ZXIgJChUQVJHRVRfT1VUX1BST0RVQ1QpLyUsJChJTlRFUk5BTF9QUk9EVUNUSU1BR0VfRklMRVMpKQorCXRvdWNoICRACisKICMgV2UganVzdCBidWlsZCB0aGlzIGRpcmVjdGx5IHRvIHRoZSBpbnN0YWxsIGxvY2F0aW9uLgogSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQgOj0gJChCVUlMVF9QUk9EVUNUSU1BR0VfVEFSR0VUKQogJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCk6IFwKICAgICAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgXAogICAgICQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKSBcCi0gICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9QUk9EVUNUKQorICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfUFJPRFVDVCkgXAorICAgICQocHJvZHVjdGltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLXByb2R1Y3RpbWFnZS10YXJnZXQpCiAKIFBST0RVQ1RfTk9USUNFX0RFUFMgKz0gJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkKQEAgLTM2NzgsMTAgKzQwNDQsMTEgQEAKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCksJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX1BST0RVQ1QpLCQoUFJPRFVDVF9PVVQpLzovKQogCiAuUEhPTlk6IHByb2R1Y3RpbWFnZS1ub2RlcHMgcG5vZAotcHJvZHVjdGltYWdlLW5vZGVwcyBwbm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKQorcHJvZHVjdGltYWdlLW5vZGVwcyBwbm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKHByb2R1Y3RpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC1wcm9kdWN0aW1hZ2UtdGFyZ2V0KQogCi1zeW5jOiAkKElOVEVSTkFMX1BST0RVQ1RJTUFHRV9GSUxFUykKKy5QSE9OWTogc3luY19wcm9kdWN0CitzeW5jIHN5bmNfcHJvZHVjdDogJChJTlRFUk5BTF9QUk9EVUNUSU1BR0VfRklMRVMpCiAKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfUFJPRFVDVElNQUdFCiBJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9wcm9kdWN0LmltZwpAQCAtMzcxOSw2ICs0MDg2LDcgQEAKICAgJChjYWxsIGdlbmVyYXRlLWltYWdlLXByb3AtZGljdGlvbmFyeSwgJChzeXN0ZW1fZXh0aW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2V4dF9pbWFnZV9pbmZvLnR4dCxzeXN0ZW1fZXh0LCBza2lwX2ZzY2s9dHJ1ZSkKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAorICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKHN5c3RlbV9leHRpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0KSBcCiAgICAgICAgICAgJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpIFwKICAgICAgICAgICAkKHN5c3RlbV9leHRpbWFnZV9pbnRlcm1lZGlhdGVzKS9zeXN0ZW1fZXh0X2ltYWdlX2luZm8udHh0IFwKICAgICAgICAgICAkKElOU1RBTExFRF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKSBcCkBAIC0zNzI2LDEyICs0MDk0LDE4IEBACiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfUFJPRFVDVF9TRVJWSUNFU0lNQUdFX1RBUkdFVCksJChCT0FSRF9QUk9EVUNUX1NFUlZJQ0VTSU1BR0VfUEFSVElUSU9OX1NJWkUpKQogZW5kZWYKIAorJChldmFsICQoY2FsbCB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0LCQoc3lzdGVtX2V4dGltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpLCQoSU5URVJOQUxfU1lTVEVNX0VYVElNQUdFX0ZJTEVTKSkpCisjIFVzZWQgYnkgc29vbmcgc2FuZHdpY2ggdG8gcmVxdWVzdCB0aGUgc3RhZ2luZyBkaXIgYmUgYnVpbHQKKyQoc3lzdGVtX2V4dGltYWdlX2ludGVybWVkaWF0ZXMpL3N0YWdpbmdfZGlyLnN0YW1wOiAkKGZpbHRlciAkKFRBUkdFVF9PVVRfU1lTVEVNX0VYVCkvJSwkKElOVEVSTkFMX1NZU1RFTV9FWFRJTUFHRV9GSUxFUykpCisJdG91Y2ggJEAKKwogIyBXZSBqdXN0IGJ1aWxkIHRoaXMgZGlyZWN0bHkgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24uCiBJTlNUQUxMRURfU1lTVEVNX0VYVElNQUdFX1RBUkdFVCA6PSAkKEJVSUxUX1NZU1RFTV9FWFRJTUFHRV9UQVJHRVQpCiAkKElOU1RBTExFRF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKTogXAogICAgICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSBcCiAgICAgJChJTlRFUk5BTF9TWVNURU1fRVhUSU1BR0VfRklMRVMpIFwKLSAgICAkKElOU1RBTExFRF9GSUxFU19GSUxFX1NZU1RFTV9FWFQpCisgICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9TWVNURU1fRVhUKSBcCisgICAgJChzeXN0ZW1fZXh0aW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtc3lzdGVtX2V4dGltYWdlLXRhcmdldCkKIAogU1lTVEVNX0VYVF9OT1RJQ0VfREVQUyArPSAkKElOU1RBTExFRF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKQpAQCAtMzc0MCwxMCArNDExNCwxMSBAQAogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKSwkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChJTlRFUk5BTF9TWVNURU1fRVhUSU1BR0VfRklMRVMpICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfU1lTVEVNX0VYVCksJChQUk9EVUNUX09VVCkvOi8pCiAKIC5QSE9OWTogc3lzdGVtZXh0aW1hZ2Utbm9kZXBzIHNlbm9kCi1zeXN0ZW1leHRpbWFnZS1ub2RlcHMgc2Vub2Q6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpCitzeXN0ZW1leHRpbWFnZS1ub2RlcHMgc2Vub2Q6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoc3lzdGVtX2V4dGltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLXN5c3RlbV9leHRpbWFnZS10YXJnZXQpCiAKLXN5bmM6ICQoSU5URVJOQUxfU1lTVEVNX0VYVElNQUdFX0ZJTEVTKQorLlBIT05ZOiBzeW5jX3N5c3RlbV9leHQKK3N5bmMgc3luY19zeXN0ZW1fZXh0OiAkKElOVEVSTkFMX1NZU1RFTV9FWFRJTUFHRV9GSUxFUykKIAogZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9TWVNURU1fRVhUSU1BR0UKIElOU1RBTExFRF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3N5c3RlbV9leHQuaW1nCkBAIC0zODAyLDE3ICs0MTc3LDI0IEBACiAJICBza2lwX2ZzY2s9dHJ1ZSkKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAorICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKG9kbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKICAgICAgICAgICAkKFRBUkdFVF9PVVRfT0RNKSAkKG9kbWltYWdlX2ludGVybWVkaWF0ZXMpL29kbV9pbWFnZV9pbmZvLnR4dCBcCiAgICAgICAgICAgJChJTlNUQUxMRURfT0RNSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfT0RNSU1BR0VfVEFSR0VUKSwkKEJPQVJEX09ETUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCiAKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKG9kbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfT1VUX09ETSksJChJTlRFUk5BTF9PRE1JTUFHRV9GSUxFUykpKQorIyBVc2VkIGJ5IHNvb25nIHNhbmR3aWNoIHRvIHJlcXVlc3QgdGhlIHN0YWdpbmcgZGlyIGJlIGJ1aWx0CiskKG9kbWltYWdlX2ludGVybWVkaWF0ZXMpL3N0YWdpbmdfZGlyLnN0YW1wOiAkKGZpbHRlciAkKFRBUkdFVF9PVVRfT0RNKS8lLCQoSU5URVJOQUxfT0RNSU1BR0VfRklMRVMpKQorCXRvdWNoICRACisKICMgV2UganVzdCBidWlsZCB0aGlzIGRpcmVjdGx5IHRvIHRoZSBpbnN0YWxsIGxvY2F0aW9uLgogSU5TVEFMTEVEX09ETUlNQUdFX1RBUkdFVCA6PSAkKEJVSUxUX09ETUlNQUdFX1RBUkdFVCkKICQoSU5TVEFMTEVEX09ETUlNQUdFX1RBUkdFVCk6IFwKICAgICAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgXAogICAgICQoSU5URVJOQUxfT0RNSU1BR0VfRklMRVMpIFwKLSAgICAkKElOU1RBTExFRF9GSUxFU19GSUxFX09ETSkKKyAgICAkKElOU1RBTExFRF9GSUxFU19GSUxFX09ETSkgXAorICAgICQob2RtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtb2RtaW1hZ2UtdGFyZ2V0KQogCiBPRE1fTk9USUNFX0RFUFMgKz0gJChJTlNUQUxMRURfT0RNSU1BR0VfVEFSR0VUKQpAQCAtMzgyMSwxMCArNDIwMywxMSBAQAogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9PRE1JTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKElOVEVSTkFMX09ETUlNQUdFX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX09ETSksJChQUk9EVUNUX09VVCkvOi8pCiAKIC5QSE9OWTogb2RtaW1hZ2Utbm9kZXBzIG9ub2QKLW9kbWltYWdlLW5vZGVwcyBvbm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKQorb2RtaW1hZ2Utbm9kZXBzIG9ub2Q6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQob2RtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtb2RtaW1hZ2UtdGFyZ2V0KQogCi1zeW5jOiAkKElOVEVSTkFMX09ETUlNQUdFX0ZJTEVTKQorLlBIT05ZOiBzeW5jX29kbQorc3luYyBzeW5jX29kbTogJChJTlRFUk5BTF9PRE1JTUFHRV9GSUxFUykKIAogZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9PRE1JTUFHRQogSU5TVEFMTEVEX09ETUlNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9vZG0uaW1nCkBAIC0zODYzLDE3ICs0MjQ2LDI0IEBACiAJICB2ZW5kb3JfZGxrbSwgc2tpcF9mc2NrPXRydWUpCiAgIFBBVEg9JChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyk6JCRQQVRIIFwKICAgICAgICQoQlVJTERfSU1BR0UpIFwKKyAgICAgICAgICAkKGlmICQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSwsLS1pbnB1dC1kaXJlY3RvcnktZmlsdGVyLWZpbGUgJCh2ZW5kb3JfZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKICAgICAgICAgICAkKFRBUkdFVF9PVVRfVkVORE9SX0RMS00pICQodmVuZG9yX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS92ZW5kb3JfZGxrbV9pbWFnZV9pbmZvLnR4dCBcCiAgICAgICAgICAgJChJTlNUQUxMRURfVkVORE9SX0RMS01JTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9WRU5ET1JfRExLTUlNQUdFX1RBUkdFVCksJChCT0FSRF9WRU5ET1JfRExLTUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCiAKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKHZlbmRvcl9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCwkKFRBUkdFVF9PVVRfVkVORE9SX0RMS00pLCQoSU5URVJOQUxfVkVORE9SX0RMS01JTUFHRV9GSUxFUykpKQorIyBVc2VkIGJ5IHNvb25nIHNhbmR3aWNoIHRvIHJlcXVlc3QgdGhlIHN0YWdpbmcgZGlyIGJlIGJ1aWx0CiskKHZlbmRvcl9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3RhZ2luZ19kaXIuc3RhbXA6ICQoZmlsdGVyICQoVEFSR0VUX09VVF9WRU5ET1JfRExLTSkvJSwkKElOVEVSTkFMX1ZFTkRPUl9ETEtNSU1BR0VfRklMRVMpKQorCXRvdWNoICRACisKICMgV2UganVzdCBidWlsZCB0aGlzIGRpcmVjdGx5IHRvIHRoZSBpbnN0YWxsIGxvY2F0aW9uLgogSU5TVEFMTEVEX1ZFTkRPUl9ETEtNSU1BR0VfVEFSR0VUIDo9ICQoQlVJTFRfVkVORE9SX0RMS01JTUFHRV9UQVJHRVQpCiAkKElOU1RBTExFRF9WRU5ET1JfRExLTUlNQUdFX1RBUkdFVCk6IFwKICAgICAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgXAogICAgICQoSU5URVJOQUxfVkVORE9SX0RMS01JTUFHRV9GSUxFUykgXAotICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfVkVORE9SX0RMS00pCisgICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9WRU5ET1JfRExLTSkgXAorICAgICQodmVuZG9yX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC12ZW5kb3JfZGxrbWltYWdlLXRhcmdldCkKIAogVkVORE9SX0RMS01fTk9USUNFX0RFUFMgKz0gJChJTlNUQUxMRURfVkVORE9SX0RMS01JTUFHRV9UQVJHRVQpCkBAIC0zODgyLDEwICs0MjcyLDExIEBACiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNSU1BR0VfVEFSR0VUKSwkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChJTlRFUk5BTF9WRU5ET1JfRExLTUlNQUdFX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX1ZFTkRPUl9ETEtNKSwkKFBST0RVQ1RfT1VUKS86LykKIAogLlBIT05ZOiB2ZW5kb3JfZGxrbWltYWdlLW5vZGVwcyB2ZG5vZAotdmVuZG9yX2Rsa21pbWFnZS1ub2RlcHMgdmRub2Q6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpCit2ZW5kb3JfZGxrbWltYWdlLW5vZGVwcyB2ZG5vZDogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJCh2ZW5kb3JfZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLXZlbmRvcl9kbGttaW1hZ2UtdGFyZ2V0KQogCi1zeW5jOiAkKElOVEVSTkFMX1ZFTkRPUl9ETEtNSU1BR0VfRklMRVMpCisuUEhPTlk6IHN5bmNfdmVuZG9yX2Rsa20KK3N5bmMgc3luY192ZW5kb3JfZGxrbTogJChJTlRFUk5BTF9WRU5ET1JfRExLTUlNQUdFX0ZJTEVTKQogCiBlbHNlIGlmZGVmIEJPQVJEX1BSRUJVSUxUX1ZFTkRPUl9ETEtNSU1BR0UKIElOU1RBTExFRF9WRU5ET1JfRExLTUlNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS92ZW5kb3JfZGxrbS5pbWcKQEAgLTM5MjQsMTcgKzQzMTUsMjQgQEAKIAkgIG9kbV9kbGttLCBza2lwX2ZzY2s9dHJ1ZSkKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAorICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKG9kbV9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAogICAgICAgICAgICQoVEFSR0VUX09VVF9PRE1fRExLTSkgJChvZG1fZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL29kbV9kbGttX2ltYWdlX2luZm8udHh0IFwKICAgICAgICAgICAkKElOU1RBTExFRF9PRE1fRExLTUlNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX09ETV9ETEtNSU1BR0VfVEFSR0VUKSwkKEJPQVJEX09ETV9ETEtNSU1BR0VfUEFSVElUSU9OX1NJWkUpKQogZW5kZWYKIAorJChldmFsICQoY2FsbCB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0LCQob2RtX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX09VVF9PRE1fRExLTSksJChJTlRFUk5BTF9PRE1fRExLTUlNQUdFX0ZJTEVTKSkpCisjIFVzZWQgYnkgc29vbmcgc2FuZHdpY2ggdG8gcmVxdWVzdCB0aGUgc3RhZ2luZyBkaXIgYmUgYnVpbHQKKyQob2RtX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9zdGFnaW5nX2Rpci5zdGFtcDogJChmaWx0ZXIgJChUQVJHRVRfT1VUX09ETV9ETEtNKS8lLCQoSU5URVJOQUxfT0RNX0RMS01JTUFHRV9GSUxFUykpCisJdG91Y2ggJEAKKwogIyBXZSBqdXN0IGJ1aWxkIHRoaXMgZGlyZWN0bHkgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24uCiBJTlNUQUxMRURfT0RNX0RMS01JTUFHRV9UQVJHRVQgOj0gJChCVUlMVF9PRE1fRExLTUlNQUdFX1RBUkdFVCkKICQoSU5TVEFMTEVEX09ETV9ETEtNSU1BR0VfVEFSR0VUKTogXAogICAgICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSBcCiAgICAgJChJTlRFUk5BTF9PRE1fRExLTUlNQUdFX0ZJTEVTKSBcCi0gICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9PRE1fRExLTSkKKyAgICAkKElOU1RBTExFRF9GSUxFU19GSUxFX09ETV9ETEtNKSBcCisgICAgJChvZG1fZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLW9kbV9kbGttaW1hZ2UtdGFyZ2V0KQogCiBPRE1fRExLTV9OT1RJQ0VfREVQUyArPSAkKElOU1RBTExFRF9PRE1fRExLTUlNQUdFX1RBUkdFVCkKQEAgLTM5NDMsMTAgKzQzNDEsMTEgQEAKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfT0RNX0RMS01JTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKElOVEVSTkFMX09ETV9ETEtNSU1BR0VfRklMRVMpICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfT0RNX0RMS00pLCQoUFJPRFVDVF9PVVQpLzovKQogCiAuUEhPTlk6IG9kbV9kbGttaW1hZ2Utbm9kZXBzIG9kbm9kCi1vZG1fZGxrbWltYWdlLW5vZGVwcyBvZG5vZDogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKK29kbV9kbGttaW1hZ2Utbm9kZXBzIG9kbm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKG9kbV9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtb2RtX2Rsa21pbWFnZS10YXJnZXQpCiAKLXN5bmM6ICQoSU5URVJOQUxfT0RNX0RMS01JTUFHRV9GSUxFUykKKy5QSE9OWTogc3luY19vZG1fZGxrbQorc3luYyBzeW5jX29kbV9kbGttOiAkKElOVEVSTkFMX09ETV9ETEtNSU1BR0VfRklMRVMpCiAKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfT0RNX0RMS01JTUFHRQogSU5TVEFMTEVEX09ETV9ETEtNSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL29kbV9kbGttLmltZwpAQCAtMzk4NywxNyArNDM4NiwyNCBAQAogCSAgc3lzdGVtX2Rsa20sIHNraXBfZnNjaz10cnVlKQogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCisgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQoc3lzdGVtX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0KSBcCiAgICAgICAgICAgJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKSAkKHN5c3RlbV9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2Rsa21faW1hZ2VfaW5mby50eHQgXAogICAgICAgICAgICQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpLCQoQk9BUkRfU1lTVEVNX0RMS01JTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgogCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJChzeXN0ZW1fZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKSwkKElOVEVSTkFMX1NZU1RFTV9ETEtNSU1BR0VfRklMRVMpKSkKKyMgVXNlZCBieSBzb29uZyBzYW5kd2ljaCB0byByZXF1ZXN0IHRoZSBzdGFnaW5nIGRpciBiZSBidWlsdAorJChzeXN0ZW1fZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL3N0YWdpbmdfZGlyLnN0YW1wOiAkKGZpbHRlciAkKFRBUkdFVF9PVVRfU1lTVEVNX0RMS00pLyUsJChJTlRFUk5BTF9TWVNURU1fRExLTUlNQUdFX0ZJTEVTKSkKKwl0b3VjaCAkQAorCiAjIFdlIGp1c3QgYnVpbGQgdGhpcyBkaXJlY3RseSB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KIElOU1RBTExFRF9TWVNURU1fRExLTUlNQUdFX1RBUkdFVCA6PSAkKEJVSUxUX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUKQogJChJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpOiBcCiAgICAgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpIFwKICAgICAkKElOVEVSTkFMX1NZU1RFTV9ETEtNSU1BR0VfRklMRVMpIFwKLSAgICAkKElOU1RBTExFRF9GSUxFU19GSUxFX1NZU1RFTV9ETEtNKQorICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfU1lTVEVNX0RMS00pIFwKKyAgICAkKHN5c3RlbV9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtc3lzdGVtX2Rsa21pbWFnZS10YXJnZXQpCiAKIFNZU1RFTV9ETEtNX05PVElDRV9ERVBTICs9ICQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUKQpAQCAtNDAwNiw0MyArNDQxMiwxNyBAQAogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9TWVNURU1fRExLTUlNQUdFX1RBUkdFVCksJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoSU5URVJOQUxfU1lTVEVNX0RMS01JTUFHRV9GSUxFUykgJChJTlNUQUxMRURfRklMRVNfRklMRV9TWVNURU1fRExLTSksJChQUk9EVUNUX09VVCkvOi8pCiAKIC5QSE9OWTogc3lzdGVtX2Rsa21pbWFnZS1ub2RlcHMgc2Rub2QKLXN5c3RlbV9kbGttaW1hZ2Utbm9kZXBzIHNkbm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKQorc3lzdGVtX2Rsa21pbWFnZS1ub2RlcHMgc2Rub2Q6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoc3lzdGVtX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC1zeXN0ZW1fZGxrbWltYWdlLXRhcmdldCkKIAotc3luYzogJChJTlRFUk5BTF9TWVNURU1fRExLTUlNQUdFX0ZJTEVTKQorLlBIT05ZOiBzeW5jX3N5c3RlbV9kbGttCitzeW5jIHN5bmNfc3lzdGVtX2Rsa206ICQoSU5URVJOQUxfU1lTVEVNX0RMS01JTUFHRV9GSUxFUykKIAogZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9TWVNURU1fRExLTUlNQUdFCiBJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvc3lzdGVtX2Rsa20uaW1nCiAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChCT0FSRF9QUkVCVUlMVF9TWVNURU1fRExLTUlNQUdFKSwkKElOU1RBTExFRF9TWVNURU1fRExLTUlNQUdFX1RBUkdFVCkpKQogZW5kaWYKIAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBkdGJvIGltYWdlCi1pZmRlZiBCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UKLUlOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2R0Ym8uaW1nCi0KLWlmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKLSQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpOiAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJChBVkJUT09MKSAkKEJPQVJEX0FWQl9EVEJPX0tFWV9QQVRIKQotCWNwICQoQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFKSAkQAotCWNobW9kICt3ICRACi0JJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAotCSAgICAtLWltYWdlICRAIFwKLQkgICAgJChjYWxsIGdldC1wYXJ0aXRpb24tc2l6ZS1hcmd1bWVudCwkKEJPQVJEX0RUQk9JTUdfUEFSVElUSU9OX1NJWkUpKSBcCi0JICAgIC0tcGFydGl0aW9uX25hbWUgZHRibyAkKElOVEVSTkFMX0FWQl9EVEJPX1NJR05JTkdfQVJHUykgXAotCSAgICAkKEJPQVJEX0FWQl9EVEJPX0FERF9IQVNIX0ZPT1RFUl9BUkdTKQotCi0kKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCksKQotJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSksJChQUk9EVUNUX09VVCkvOi8pCi0KLVVOTU9VTlRFRF9OT1RJQ0VfVkVORE9SX0RFUFMrPSAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKQotZWxzZQotJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCk6ICQoQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFKQotCWNwICQoQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFKSAkQAotZW5kaWYKLQotZW5kaWYgIyBCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBQcm90ZWN0ZWQgVk0gZmlybXdhcmUgaW1hZ2UKIGlmZXEgKCQoQk9BUkRfVVNFU19QVk1GV0lNQUdFKSx0cnVlKQogCkBAIC00MDUxLDkgKzQ0MzEsOSBAQAogCiBJTlNUQUxMRURfUFZNRldJTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvcHZtZncuaW1nCiBJTlNUQUxMRURfUFZNRldfRU1CRURERURfQVZCS0VZX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9wdm1md19lbWJlZGRlZC5hdmJwdWJrZXkKLUlOU1RBTExFRF9QVk1GV19CSU5BUllfVEFSR0VUIDo9ICQoY2FsbCBtb2R1bGUtaW5zdGFsbGVkLWZpbGVzLHB2bWZ3X2JpbikKK0lOU1RBTExFRF9QVk1GV19CSU5BUllfVEFSR0VUIDo9ICQoY2FsbCBtb2R1bGUtdGFyZ2V0LWJ1aWx0LWZpbGVzLHB2bWZ3X2JpbikKIElOVEVSTkFMX1BWTUZXSU1BR0VfRklMRVMgOj0gJChjYWxsIG1vZHVsZS10YXJnZXQtYnVpbHQtZmlsZXMscHZtZndfaW1nKQotSU5URVJOQUxfUFZNRldfRU1CRURERURfQVZCS0VZIDo9ICQoY2FsbCBtb2R1bGUtdGFyZ2V0LWJ1aWx0LWZpbGVzLHB2bWZ3X2VtYmVkZGVkX2tleSkKK0lOVEVSTkFMX1BWTUZXX0VNQkVEREVEX0FWQktFWSA6PSAkKGNhbGwgbW9kdWxlLXRhcmdldC1idWlsdC1maWxlcyxwdm1md19lbWJlZGRlZF9rZXlfcHViX2JpbikKIElOVEVSTkFMX1BWTUZXX1NZTUJPTCA6PSAkKFRBUkdFVF9PVVRfRVhFQ1VUQUJMRVNfVU5TVFJJUFBFRCkvcHZtZncKIAogJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX1BWTUZXSU1BR0VfVEFSR0VUKSwpCkBAIC00MDg5LDYgKzQ0NjksMTMgQEAKIAogaWZuZXEgKCQoc3RyaXAgJChCT0FSRF9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpKSwpCiBJTlRFUk5BTF9BVkJfQ1VTVE9NSU1BR0VTX1NJR05JTkdfQVJHUyA6PQorQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCA6PQorIyBJZiBCT0FSRF9BVkJfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfS0VZX1BBVEggaXMgc2V0LCB0aGUgaW1hZ2Ugd2lsbCBiZSBpbmNsdWRlZCBpbgorIyBCT0FSRF9BVkJfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNULCBvdGhlcndpc2UgdGhlIGltYWdlIHdvbid0IGJlIEFWQiBzaWduZWQuCiskKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgXAorCSQoaWYgJChCT0FSRF9BVkJfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfS0VZX1BBVEgpLCBcCisJJChldmFsIEJPQVJEX0FWQl9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QgKz0gJChwYXJ0aXRpb24pKSBcCisJJChldmFsIEJPQVJEXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0lNQUdFX0xJU1QgOj0gJChCT0FSRF9BVkJfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfSU1BR0VfTElTVCkpKSkKIAogIyBTaWduIGN1c3RvbSBpbWFnZS4KICMgJCgxKTogdGhlIHByZWJ1aWx0IGN1c3RvbSBpbWFnZS4KQEAgLTQxMTMsOSArNDUwMCwyNiBAQAogSU5TVEFMTEVEX0NVU1RPTUlNQUdFU19UQVJHRVQgKz0gJCgzKQogZW5kZWYKIAotJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksIFwKKyMgQ29weSB1bnNpZ25lZCBjdXN0b20gaW1hZ2UuCisjICQoMSk6IHRoZSBwcmVidWlsdCBjdXN0b20gaW1hZ2UuCisjICQoMik6IHRoZSBzaWduZWQgY3VzdG9tIGltYWdlIHRhcmdldC4KK2RlZmluZSBjb3B5X2N1c3RvbV9pbWFnZQorJCgyKTogJCgxKSAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKKwlAZWNobyBUYXJnZXQgY3VzdG9tIGltYWdlOiAkKDIpCisJbWtkaXIgLXAgJChkaXIgJCgyKSkKKwljcCAkKDEpICQoMikKK0lOU1RBTExFRF9DVVNUT01JTUFHRVNfVEFSR0VUICs9ICQoMikKK2VuZGVmCisKKyMgQWRkIEFWQiBjdXN0b20gaW1hZ2UgdG8gZHJvaWQgdGFyZ2V0CiskKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksIFwKICAgJChmb3JlYWNoIGltYWdlLCQoQk9BUkRfQVZCXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0lNQUdFX0xJU1QpLCBcCiAgICAgICQoZXZhbCAkKGNhbGwgc2lnbl9jdXN0b21faW1hZ2UsJChpbWFnZSksJChwYXJ0aXRpb24pLCQoUFJPRFVDVF9PVVQpLyQobm90ZGlyICQoaW1hZ2UpKSkpKSkKKworIyBBZGQgdW5zaWduZWQgY3VzdG9tIGltYWdlIHRvIGRyb2lkIHRhcmdldAorJChmb3JlYWNoIHBhcnRpdGlvbiwkKGZpbHRlci1vdXQgJChCT0FSRF9BVkJfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgJChCT0FSRF9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpKSwgXAorICAkKGZvcmVhY2ggaW1hZ2UsJChCT0FSRF8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9JTUFHRV9MSVNUKSwgXAorICAgICAkKGV2YWwgJChjYWxsIGNvcHlfY3VzdG9tX2ltYWdlLCQoaW1hZ2UpLCQoUFJPRFVDVF9PVVQpLyQobm90ZGlyICQoaW1hZ2UpKSkpKSkKIGVuZGlmCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQzMTUsNiArNDcxOSwyMCBAQAogICAgIC0tcHJvcCBjb20uYW5kcm9pZC5idWlsZC5wdm1mdy5zZWN1cml0eV9wYXRjaDokKFBWTUZXX1NFQ1VSSVRZX1BBVENIKQogZW5kaWYKIAorIyBBcHBlbmQgcm9vdCBkaWdlc3Qgb2YgbWljcm9kcm9pZC12ZW5kb3IgcGFydGl0aW9uJ3MgaGFzaHRyZWUgZGVzY3JpcHRvciBpbnRvIHZlbmRvciBwYXJ0aXRpb24uCitpZmRlZiBNSUNST0RST0lEX1ZFTkRPUl9JTUFHRV9NT0RVTEUKK01JQ1JPRFJPSURfVkVORE9SX0lNQUdFIDo9IFwKKyAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQywkKE1JQ1JPRFJPSURfVkVORE9SX0lNQUdFX01PRFVMRSkpLyQoTUlDUk9EUk9JRF9WRU5ET1JfSU1BR0VfTU9EVUxFKQorTUlDUk9EUk9JRF9WRU5ET1JfUk9PVF9ESUdFU1QgOj0gJChQUk9EVUNUX09VVCkvbWljcm9kcm9pZF92ZW5kb3Jfcm9vdF9kaWdlc3QKK0JPQVJEX0FWQl9WRU5ET1JfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTICs9IFwKKyAgICAtLXByb3BfZnJvbV9maWxlIGNvbS5hbmRyb2lkLmJ1aWxkLm1pY3JvZHJvaWQtdmVuZG9yLnJvb3RfZGlnZXN0OiQoTUlDUk9EUk9JRF9WRU5ET1JfUk9PVF9ESUdFU1QpCiskKE1JQ1JPRFJPSURfVkVORE9SX1JPT1RfRElHRVNUKTogJChBVkJUT09MKSAkKE1JQ1JPRFJPSURfVkVORE9SX0lNQUdFKQorCSQoQVZCVE9PTCkgcHJpbnRfcGFydGl0aW9uX2RpZ2VzdHMgXAorICAgICAgLS1pbWFnZSAkKE1JQ1JPRFJPSURfVkVORE9SX0lNQUdFKSBcCisgICAgICB8IHRyIC1kICdcbicgfCBzZWQgLUUgJ3MvLio6IC8vZycgPiAkQAorJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKTogJChNSUNST0RST0lEX1ZFTkRPUl9ST09UX0RJR0VTVCkKK2VuZGlmCisKIEJPT1RfRk9PVEVSX0FSR1MgOj0gQk9BUkRfQVZCX0JPT1RfQUREX0hBU0hfRk9PVEVSX0FSR1MKIElOSVRfQk9PVF9GT09URVJfQVJHUyA6PSBCT0FSRF9BVkJfSU5JVF9CT09UX0FERF9IQVNIX0ZPT1RFUl9BUkdTCiBWRU5ET1JfQk9PVF9GT09URVJfQVJHUyA6PSBCT0FSRF9BVkJfVkVORE9SX0JPT1RfQUREX0hBU0hfRk9PVEVSX0FSR1MKQEAgLTQzOTIsNyArNDgxMCw5IEBACiAkKGV2YWwgcGFydCA6PSAkKDEpKQogJChldmFsIFBBUlQ9JChjYWxsIHRvLXVwcGVyLCQocGFydCkpKQogJChldmFsIF9yb2xsYmFja19pbmRleF9sb2NhdGlvbiA6PSBCT0FSRF9BVkJfJChQQVJUKV9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikKKyQoZXZhbCBfa2V5X3BhdGggOj0gQk9BUkRfQVZCXyQoUEFSVClfS0VZX1BBVEgpCiAkKGlmICQoJChfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24pKSwsJChlcnJvciAkKF9yb2xsYmFja19pbmRleF9sb2NhdGlvbikgaXMgbm90IGRlZmluZWQpKQorJChpZiAkKCQoX2tleV9wYXRoKSksLCQoZXJyb3IgJChfa2V5X3BhdGgpIGlzIG5vdCBkZWZpbmVkKSkKIAogSU5URVJOQUxfQVZCX01BS0VfVkJNRVRBX0lNQUdFX0FSR1MgKz0gXAogICAgIC0tY2hhaW5fcGFydGl0aW9uICQocGFydCk6JCgkKF9yb2xsYmFja19pbmRleF9sb2NhdGlvbikpOiQoQVZCX0NIQUlOX0tFWV9ESVIpLyQocGFydCkuYXZicHVia2V5CkBAIC00NDcyLDggKzQ4OTIsOCBAQAogJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX0FWQl9WQk1FVEFfQ1VTVE9NX1BBUlRJVElPTlMpLCQoZXZhbCBCT0FSRF9BVkJfTUFLRV9WQk1FVEFfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfSU1BR0VfQVJHUyArPSAtLXBhZGRpbmdfc2l6ZSA0MDk2KSkKIGVuZGlmCiAKLWlmbmVxICgkKHN0cmlwICQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSksKQotJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksIFwKK2lmbmVxICgkKHN0cmlwICQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCkpLCkKKyQoZm9yZWFjaCBwYXJ0aXRpb24sJChCT0FSRF9BVkJfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgXAogICAgICQoZXZhbCAkKGNhbGwgY2hlY2stYW5kLXNldC1jdXN0b20tYXZiLWNoYWluLWFyZ3MsJChwYXJ0aXRpb24pKSkpCiBlbmRpZgogCkBAIC00NTYwLDEwICs0OTgwLDEwIEBACiAgICQoaWYgJChCT0FSRF9BVkJfVkJNRVRBX1ZFTkRPUl9LRVlfUEFUSCksXAogICAgICQoaGlkZSkgJChBVkJUT09MKSBleHRyYWN0X3B1YmxpY19rZXkgLS1rZXkgJChCT0FSRF9BVkJfVkJNRVRBX1ZFTkRPUl9LRVlfUEFUSCkgXAogICAgICAgICAtLW91dHB1dCAkKDEpL3ZibWV0YV92ZW5kb3IuYXZicHVia2V5KQotICAkKGlmICQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSxcCi0gICAgJChoaWRlKSAkKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgXAorICAkKGlmICQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksXAorICAgICQoaGlkZSkgJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX0FWQl9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpLCBcCiAgICAgICAgICQoQVZCVE9PTCkgZXh0cmFjdF9wdWJsaWNfa2V5IC0ta2V5ICQoQk9BUkRfQVZCXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0tFWV9QQVRIKSBcCi0gICAgICAgICAgICAtLW91dHB1dCAkKDEpLyQocGFydGl0aW9uKS5hdmJwdWJrZXk7KSkgXAorICAgICAgICAgICAgLS1vdXRwdXQgJCgxKS8kKHBhcnRpdGlvbikuYXZicHVia2V5OykpCiAgICQoaWYgJChCT0FSRF9BVkJfVkJNRVRBX0NVU1RPTV9QQVJUSVRJT05TKSxcCiAgICAgJChoaWRlKSAkKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQVZCX1ZCTUVUQV9DVVNUT01fUEFSVElUSU9OUyksIFwKICAgICAgICAgJChBVkJUT09MKSBleHRyYWN0X3B1YmxpY19rZXkgLS1rZXkgJChCT0FSRF9BVkJfVkJNRVRBXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0tFWV9QQVRIKSBcCkBAIC00NzA4LDYgKzUxMjgsNTAgQEAKICAgICAkKElOVEVSTkFMX1BWTUZXSU1BR0VfRklMRVMpIFwKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSdW4gYXBleF9zZXBvbGljeV90ZXN0cyBmb3IgYWxsIGluc3RhbGxlZCBBUEVYZXMKKworaWZlcSAoLCQoVEFSR0VUX0JVSUxEX1VOQlVORExFRCkpCitpbnRlcm1lZGlhdGUgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsYXBleF9zZXBvbGljeV90ZXN0cykKK2FwZXhfZGlycyA6PSBcCisgICQoVEFSR0VUX09VVCkvYXBleC8lIFwKKyAgJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2FwZXgvJSBcCisgICQoVEFSR0VUX09VVF9WRU5ET1IpL2FwZXgvJSBcCisgICQoVEFSR0VUX09VVF9QUk9EVUNUKS9hcGV4LyUgXAorCithcGV4X2ZpbGVzIDo9ICQoc29ydCAkKGZpbHRlciAkKGFwZXhfZGlycyksICQoSU5URVJOQUxfQUxMSU1BR0VTX0ZJTEVTKSkpCithcGV4X2RpcnMgOj0KKworIyAkMTogYXBleCBmaWxlCisjICQyOiBvdXRwdXQgZmlsZQorZGVmaW5lIF9ydW5fYXBleF9zZXBvbGljeV90ZXN0cworJDI6ICQxIFwKKyAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hcGV4X3NlcG9saWN5X3Rlc3RzIFwKKyAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kZWFwZXhlciBcCisgICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZGVidWdmc19zdGF0aWMKKwlAcm0gLXJmICQkQAorCUBta2RpciAtcCAkKGRpciAkJEApCisJJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXBleF9zZXBvbGljeV90ZXN0cyAtLWFsbCAtZiA8KCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2RlYXBleGVyIC0tZGVidWdmc19wYXRoICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2RlYnVnZnNfc3RhdGljIGxpc3QgLVogJCQ8KQorCUB0b3VjaCAkJEAKK2VuZGVmCisKKyMgJDE6IGFwZXggZmlsZSBsaXN0CitkZWZpbmUgcnVuX2FwZXhfc2Vwb2xpY3lfdGVzdHMKKyQoZm9yZWFjaCBhcGV4X2ZpbGUsJDEsIFwKKyAgJChldmFsIHBhc3NmaWxlIDo9ICQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwkKGludGVybWVkaWF0ZSkvJS5wYXNzLCQoYXBleF9maWxlKSkpIFwKKyAgJChldmFsICQoY2FsbCBfcnVuX2FwZXhfc2Vwb2xpY3lfdGVzdHMsJChhcGV4X2ZpbGUpLCQocGFzc2ZpbGUpKSkgXAorICAkKHBhc3NmaWxlKSkKK2VuZGVmCisKKy5QSE9OWTogcnVuX2FwZXhfc2Vwb2xpY3lfdGVzdHMKK3J1bl9hcGV4X3NlcG9saWN5X3Rlc3RzOiAkKGNhbGwgcnVuX2FwZXhfc2Vwb2xpY3lfdGVzdHMsJChhcGV4X2ZpbGVzKSkKKworZHJvaWRfdGFyZ2V0czogcnVuX2FwZXhfc2Vwb2xpY3lfdGVzdHMKKworYXBleF9maWxlcyA6PQoraW50ZXJtZWRpYXRlIDo9CitlbmRpZiAjIFRBUkdFVF9CVUlMRF9VTkJVTkRMRUQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBDaGVjayBWSU5URiBvZiBidWlsZAogCiAjIE5vdGU6IHZlbmRvcl9kbGttLCBvZG1fZGxrbSwgYW5kIHN5c3RlbV9kbGttIGRvZXMgbm90IGhhdmUgVklOVEYgZmlsZXMuCkBAIC00NzE2LDM5ICs1MTgwLDQ3IEBACiBpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGNoZWNrX3ZpbnRmX2FsbCkKIGNoZWNrX3ZpbnRmX2FsbF9kZXBzIDo9CiAKLUFQRVhfT1VUIDo9ICQoUFJPRFVDVF9PVVQpL2FwZXgKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ3JlYXRlIGFwZXgtaW5mby1maWxlLnhtbAorIyBBY3RpdmF0ZSBBUEVYZXMgZm9yIGNoZWNrdmludGYKIAogYXBleF9kaXJzIDo9IFwKICAgJChUQVJHRVRfT1VUKS9hcGV4LyUgXAorICAkKFRBUkdFVF9PVVRfUFJPRFVDVCkvYXBleC8lIFwKICAgJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2FwZXgvJSBcCiAgICQoVEFSR0VUX09VVF9WRU5ET1IpL2FwZXgvJSBcCi0gICQoVEFSR0VUX09VVF9PRE0pL2FwZXgvJSBcCi0gICQoVEFSR0VUX09VVF9QUk9EVUNUKS9hcGV4LyUgXAogCiBhcGV4X2ZpbGVzIDo9ICQoc29ydCAkKGZpbHRlciAkKGFwZXhfZGlycyksICQoSU5URVJOQUxfQUxMSU1BR0VTX0ZJTEVTKSkpCisKK0FQRVhfT1VUIDo9ICQoaW50ZXJtZWRpYXRlcykvYXBleAogQVBFWF9JTkZPX0ZJTEUgOj0gJChBUEVYX09VVCkvYXBleC1pbmZvLWxpc3QueG1sCiAKLSMgZHVtcF9hcGV4X2luZm8gc2NhbnMgJChQUk9EVUNUX09VVCkvYXBleCBhbmQgd3JpdGVzIGFwZXgtaW5mby1saXN0LnhtbCB0aGVyZS4KLSMgVGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBydWxlcyBmb3IgLmFwZXggZmlsZXMgaW5zdGFsbCB0aGUgY29udGVudHMgaW4gJChQUk9EVUNUX09VVCkvYXBleC4KLSQoQVBFWF9JTkZPX0ZJTEUpOiAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kdW1wX2FwZXhfaW5mbyAkKGFwZXhfZmlsZXMpCi0JQGVjaG8gIkNyZWF0aW5nIGFwZXgtaW5mby1maWxlIGluICQoUFJPRFVDVF9PVVQpICIKLQkkPCAtLXJvb3RfZGlyICQoUFJPRFVDVF9PVVQpCisjIGFwZXhkX2hvc3Qgc2NhbnMvYWN0aXZhdGVzIEFQRVggZmlsZXMgYW5kIHdyaXRlcyAvYXBleC9hcGV4LWluZm8tbGlzdC54bWwKKyMgTm90ZSB0aGF0IGBAZWNobyAkKFBSSVZBVEVfQVBFWF9GSUxFUylgIGxpbmUgaXMgYWRkZWQgdG8gdHJpZ2dlciB0aGUgcnVsZSB3aGVuIHRoZSBBUEVYIGxpc3QgaXMgY2hhbmdlZC4KKyQoQVBFWF9JTkZPX0ZJTEUpOiBQUklWQVRFX0FQRVhfRklMRVMgOj0gJChhcGV4X2ZpbGVzKQorJChBUEVYX0lORk9fRklMRSk6ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FwZXhkX2hvc3QgJChhcGV4X2ZpbGVzKQorCUBlY2hvICJFeHRyYWN0aW5nIGFwZXhlcy4uLiIKKwlAZWNobyAkKFBSSVZBVEVfQVBFWF9GSUxFUykgPiAvZGV2L251bGwKKwlAcm0gLXJmICQoQVBFWF9PVVQpCisJQG1rZGlyIC1wICQoQVBFWF9PVVQpCisJJDwgLS1zeXN0ZW1fcGF0aCAkKFRBUkdFVF9PVVQpIFwKKwkgICAtLXN5c3RlbV9leHRfcGF0aCAkKFRBUkdFVF9PVVRfU1lTVEVNX0VYVCkgXAorCSAgIC0tcHJvZHVjdF9wYXRoICQoVEFSR0VUX09VVF9QUk9EVUNUKSBcCisJICAgLS12ZW5kb3JfcGF0aCAkKFRBUkdFVF9PVVRfVkVORE9SKSBcCisJICAgLS1hcGV4X3BhdGggJChBUEVYX09VVCkKIAogYXBleF9maWxlcyA6PQogYXBleF9kaXJzIDo9CiAKICMgVGhlIGJ1aWxkIHN5c3RlbSBvbmx5IHdyaXRlcyBWSU5URiBtZXRhZGF0YSB0byAqL2V0Yy92aW50ZiBwYXRocy4gTGVnYWN5IHBhdGhzIGFyZW4ndCBuZWVkZWQgaGVyZQogIyBiZWNhdXNlIHRoZXkgYXJlIG9ubHkgdXNlZCBmb3IgcHJlYnVpbHQgaW1hZ2VzLgotIyBBUEVYIGZpbGVzIGluIC92ZW5kb3IvYXBleCBjYW4gaGF2ZSBWSU5URiBmcmFnbWVudHMgYXMgd2VsbC4KKyMgQVBFWCBmaWxlcyBpbiAvJHBhcnRpdGlvbi9hcGV4IGNhbiBoYXZlIFZJTlRGIGZyYWdtZW50cyBhcyB3ZWxsLgogY2hlY2tfdmludGZfY29tbW9uX3NyY3NfcGF0dGVybnMgOj0gXAogICAkKFRBUkdFVF9PVVQpL2V0Yy92aW50Zi8lIFwKICAgJChUQVJHRVRfT1VUX1ZFTkRPUikvZXRjL3ZpbnRmLyUgXAogICAkKFRBUkdFVF9PVVRfT0RNKS9ldGMvdmludGYvJSBcCiAgICQoVEFSR0VUX09VVF9QUk9EVUNUKS9ldGMvdmludGYvJSBcCiAgICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKS9ldGMvdmludGYvJSBcCi0gICQoVEFSR0VUX09VVF9WRU5ET1IpL2FwZXgvJSBcCisgICQoYXBleF9kaXJzKQogCiBjaGVja192aW50Zl9jb21tb25fc3JjcyA6PSAkKHNvcnQgJChmaWx0ZXIgJChjaGVja192aW50Zl9jb21tb25fc3Jjc19wYXR0ZXJucyksJChJTlRFUk5BTF9BTExJTUFHRVNfRklMRVMpKSkKIGNoZWNrX3ZpbnRmX2NvbW1vbl9zcmNzX3BhdHRlcm5zIDo9CkBAIC00NzYzLDE1ICs1MjM1LDIwIEBACiAkKGVycm9yIEVNUFRZX1ZFTkRPUl9TS1VfUExBQ0VIT0xERVIgaXMgYW4gaW50ZXJuYWwgdmFyaWFibGUgYW5kIGNhbm5vdCBiZSB1c2VkIGZvciBERUlWQ0VfTUFOSUZFU1RfU0tVUykKIGVuZGlmCiAKLSMgLS0gQ2hlY2sgc3lzdGVtIG1hbmlmZXN0IC8gbWF0cml4IGluY2x1ZGluZyBmcmFnbWVudHMgKGV4Y2x1ZGluZyBvdGhlciBmcmFtZXdvcmsgbWFuaWZlc3RzIC8gbWF0cmljZXMsIGUuZy4gcHJvZHVjdCk7Ci1jaGVja192aW50Zl9zeXN0ZW1fZGVwcyA6PSAkKGZpbHRlciAkKFRBUkdFVF9PVVQpL2V0Yy92aW50Zi8lLCAkKGNoZWNrX3ZpbnRmX2NvbW1vbl9zcmNzKSkKKyMgLS0gQ2hlY2sgc3lzdGVtIGFuZCBzeXN0ZW1fZXh0IG1hbmlmZXN0cyAvIG1hdHJpY2VzIGluY2x1ZGluZyBmcmFnbWVudHMgKGV4Y2x1ZGluZyBvdGhlciBmcmFtZXdvcmsgbWFuaWZlc3RzIC8gbWF0cmljZXMsIGUuZy4gcHJvZHVjdCk7CitpZmRlZiBCVUlMRElOR19TWVNURU1fSU1BR0UKK2NoZWNrX3ZpbnRmX3N5c3RlbV9kZXBzIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVCkvZXRjL3ZpbnRmLyUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2V0Yy92aW50Zi8lIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX09VVCkvYXBleC8lIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKS9hcGV4LyUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoY2hlY2tfdmludGZfY29tbW9uX3NyY3MpKQogaWZuZXEgKCQoY2hlY2tfdmludGZfc3lzdGVtX2RlcHMpLCkKIGNoZWNrX3ZpbnRmX2hhc19zeXN0ZW0gOj0gdHJ1ZQogCiBjaGVja192aW50Zl9zeXN0ZW1fbG9nIDo9ICQoaW50ZXJtZWRpYXRlcykvY2hlY2tfdmludGZfc3lzdGVtLmxvZwogY2hlY2tfdmludGZfYWxsX2RlcHMgKz0gJChjaGVja192aW50Zl9zeXN0ZW1fbG9nKQotJChjaGVja192aW50Zl9zeXN0ZW1fbG9nKTogJChIT1NUX09VVF9FWEVDVVRBQkxFUykvY2hlY2t2aW50ZiAkKGNoZWNrX3ZpbnRmX3N5c3RlbV9kZXBzKQotCUAoICQ8IC0tY2hlY2stb25lIC0tZGlybWFwIC9zeXN0ZW06JChUQVJHRVRfT1VUKSA+ICRAIDI+JjEgKSB8fCAoIGNhdCAkQCAmJiBleGl0IDEgKQorJChjaGVja192aW50Zl9zeXN0ZW1fbG9nKTogJChIT1NUX09VVF9FWEVDVVRBQkxFUykvY2hlY2t2aW50ZiAkKGNoZWNrX3ZpbnRmX3N5c3RlbV9kZXBzKSAkKEFQRVhfSU5GT19GSUxFKQorCUAoICQ8IC0tY2hlY2stb25lIC0tZGlybWFwIC9zeXN0ZW06JChUQVJHRVRfT1VUKSAtLWRpcm1hcCAvYXBleDokKEFQRVhfT1VUKSA+ICRAIDI+JjEgKSB8fCAoIGNhdCAkQCAmJiBleGl0IDEgKQogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoY2hlY2tfdmludGZfc3lzdGVtX2xvZykpCiBjaGVja192aW50Zl9zeXN0ZW1fbG9nIDo9CiAKQEAgLTQ3ODAsOCArNTI1NywxMSBAQAogICAgIHZpbnRmZm1fbG9nIDo9ICQoaW50ZXJtZWRpYXRlcykvdmludGZmbS5sb2cKIGVuZGlmCiBjaGVja192aW50Zl9hbGxfZGVwcyArPSAkKHZpbnRmZm1fbG9nKQotJCh2aW50ZmZtX2xvZyk6ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3ZpbnRmZm0gJChjaGVja192aW50Zl9zeXN0ZW1fZGVwcykKKyQodmludGZmbV9sb2cpOiAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS92aW50ZmZtICQoY2hlY2tfdmludGZfc3lzdGVtX2RlcHMpICQoQVBFWF9JTkZPX0ZJTEUpCiAJQCggJDwgLS1jaGVjayAtLWRpcm1hcCAvc3lzdGVtOiQoVEFSR0VUX09VVCkgXAorCSAgLS1kaXJtYXAgL3N5c3RlbV9leHQ6JChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpIFwKKwkgIC0tZGlybWFwIC9wcm9kdWN0OiQoVEFSR0VUX09VVF9QUk9EVUNUKSBcCisJICAtLWRpcm1hcCAvYXBleDokKEFQRVhfT1VUKSBcCiAJICAkKFZJTlRGX0ZSQU1FV09SS19NQU5JRkVTVF9GUk9aRU5fRElSKSA+ICRAIDI+JjEgKSB8fCAoIGNhdCAkQCAmJiBleGl0IDEgKQogCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJCh2aW50ZmZtX2xvZykpCkBAIC00Nzg5LDkgKzUyNjksMTIgQEAKIGVuZGlmICMgY2hlY2tfdmludGZfc3lzdGVtX2RlcHMKIGNoZWNrX3ZpbnRmX3N5c3RlbV9kZXBzIDo9CiAKK2VuZGlmICMgQlVJTERJTkdfU1lTVEVNX0lNQUdFCisKICMgLS0gQ2hlY2sgdmVuZG9yIG1hbmlmZXN0IC8gbWF0cml4IGluY2x1ZGluZyBmcmFnbWVudHMgKGV4Y2x1ZGluZyBvdGhlciBkZXZpY2UgbWFuaWZlc3RzIC8gbWF0cmljZXMpCi1jaGVja192aW50Zl92ZW5kb3JfZGVwcyA6PSAkKGZpbHRlciAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvdmludGYvJSwgJChjaGVja192aW50Zl9jb21tb25fc3JjcykpCi1jaGVja192aW50Zl92ZW5kb3JfZGVwcyArPSAkKGZpbHRlciAkKFRBUkdFVF9PVVRfVkVORE9SKS9hcGV4LyUsICQoY2hlY2tfdmludGZfY29tbW9uX3NyY3MpKQorY2hlY2tfdmludGZfdmVuZG9yX2RlcHMgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUX1ZFTkRPUikvZXRjL3ZpbnRmLyUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfT1VUX1ZFTkRPUikvYXBleC8lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGNoZWNrX3ZpbnRmX2NvbW1vbl9zcmNzKSkKIGlmbmVxICgkKHN0cmlwICQoY2hlY2tfdmludGZfdmVuZG9yX2RlcHMpKSwpCiBjaGVja192aW50Zl9oYXNfdmVuZG9yIDo9IHRydWUKIGNoZWNrX3ZpbnRmX3ZlbmRvcl9sb2cgOj0gJChpbnRlcm1lZGlhdGVzKS9jaGVja192aW50Zl92ZW5kb3IubG9nCkBAIC00ODIxLDQwICs1MzA0LDQ4IEBACiAKIG15X2JvYXJkX2V4dHJhY3RlZF9rZXJuZWwgOj0KIAotIyBCT0FSRF9LRVJORUxfQ09ORklHX0ZJTEUgYW5kIEJPQVJEX0tFUk5FTF9WRVJTSU9OIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSB2YWx1ZXMgZXh0cmFjdGVkCi0jIGZyb20gSU5TVEFMTEVEX0tFUk5FTF9UQVJHRVQuCi1pZmRlZiBCT0FSRF9LRVJORUxfQ09ORklHX0ZJTEUKLWlmZGVmIEJPQVJEX0tFUk5FTF9WRVJTSU9OCi0kKEJVSUxUX0tFUk5FTF9DT05GSUdTX0ZJTEUpOiAkKEJPQVJEX0tFUk5FTF9DT05GSUdfRklMRSkKLQljcCAkPCAkQAotJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKToKLQllY2hvICQoQk9BUkRfS0VSTkVMX1ZFUlNJT04pID4gJEAKLQotJChjYWxsIGRlY2xhcmUtbGljZW5zZS1tZXRhZGF0YSwkKEJVSUxUX0tFUk5FTF9DT05GSUdTX0ZJTEUpLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUdQTC0yLjAtb25seSxyZXN0cmljdGVkLCQoQlVJTERfU1lTVEVNKS9MSU5VWF9LRVJORUxfQ09QWUlORywiS2VybmVsIixrZXJuZWwpCi0kKGNhbGwgZGVjbGFyZS1saWNlbnNlLW1ldGFkYXRhLCQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRSksU1BEWC1saWNlbnNlLWlkZW50aWZpZXItR1BMLTIuMC1vbmx5LHJlc3RyaWN0ZWQsJChCVUlMRF9TWVNURU0pL0xJTlVYX0tFUk5FTF9DT1BZSU5HLCJLZXJuZWwiLGtlcm5lbCkKLQotbXlfYm9hcmRfZXh0cmFjdGVkX2tlcm5lbCA6PSB0cnVlCi1lbmRpZiAjIEJPQVJEX0tFUk5FTF9WRVJTSU9OCi1lbmRpZiAjIEJPQVJEX0tFUk5FTF9DT05GSUdfRklMRQotCi1pZm5lcSAoJChteV9ib2FyZF9leHRyYWN0ZWRfa2VybmVsKSx0cnVlKQogIyBUb29scyBmb3IgZGVjb21wcmVzc2lvbiB0aGF0IGlzIG5vdCBpbiBQQVRILgogIyBDaGVjayAkKEVYVFJBQ1RfS0VSTkVMKSBmb3IgZGVjb21wcmVzc2lvbiBhbGdvcml0aG1zIHN1cHBvcnRlZCBieSB0aGUgc2NyaXB0LgogIyBBbGdvcml0aG1zIHRoYXQgYXJlIGluIHRoZSBzY3JpcHQgYnV0IG5vdCBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBmb3VuZCBpbiBQQVRILgogbXlfZGVjb21wcmVzc190b29scyA6PSBcCiAgICAgbHo0OiQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2x6NCBcCiAKLWVuZGlmICMgbXlfYm9hcmRfZXh0cmFjdGVkX2tlcm5lbAorCisjIEJPQVJEX0tFUk5FTF9DT05GSUdfRklMRSBhbmQgQk9BUkRfS0VSTkVMX1ZFUlNJT04gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlcyBleHRyYWN0ZWQKKyMgZnJvbSBJTlNUQUxMRURfS0VSTkVMX1RBUkdFVC4KK2lmZGVmIEJPQVJEX0tFUk5FTF9WRVJTSU9OCiskKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpOiBQUklWQVRFX0RFQ09NUFJFU1NfVE9PTFMgOj0gJChteV9kZWNvbXByZXNzX3Rvb2xzKQorJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKTogJChmb3JlYWNoIHBhaXIsJChteV9kZWNvbXByZXNzX3Rvb2xzKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQocGFpcikpKQorJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKTogJChFWFRSQUNUX0tFUk5FTCkgJChmaXJzdHdvcmQgJChJTlNUQUxMRURfS0VSTkVMX1RBUkdFVCkpCisJS0VSTkVMX1JFTEVBU0U9YCQoRVhUUkFDVF9LRVJORUwpIC0tdG9vbHMgJChQUklWQVRFX0RFQ09NUFJFU1NfVE9PTFMpIC0taW5wdXQgJChmaXJzdHdvcmQgJChJTlNUQUxMRURfS0VSTkVMX1RBUkdFVCkpIFwKKwkgIC0tb3V0cHV0LXJlbGVhc2VgIDtcCisgIGlmIFsgIiQkS0VSTkVMX1JFTEVBU0UiICE9ICckKEJPQVJEX0tFUk5FTF9WRVJTSU9OKScgXTsgdGhlbiBcCisgICAgZWNobyAiU3BlY2lmaWVkIGtlcm5lbCB2ZXJzaW9uICckKEJPQVJEX0tFUk5FTF9WRVJTSU9OKScgZG9lcyBub3QgbWF0Y2ggYWN0dWFsIGtlcm5lbCB2ZXJzaW9uICckJEtFUk5FTF9SRUxFQVNFJyAiIDsgZXhpdCAxOyBmaTsKKwllY2hvICckKEJPQVJEX0tFUk5FTF9WRVJTSU9OKScgPiAkQAorCitpZmRlZiBCT0FSRF9LRVJORUxfQ09ORklHX0ZJTEUKKyQoQlVJTFRfS0VSTkVMX0NPTkZJR1NfRklMRSk6ICQoQk9BUkRfS0VSTkVMX0NPTkZJR19GSUxFKQorCWNwICQ8ICRACisKKyQoY2FsbCBkZWNsYXJlLWxpY2Vuc2UtbWV0YWRhdGEsJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKSxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1HUEwtMi4wLW9ubHkscmVzdHJpY3RlZCwkKEJVSUxEX1NZU1RFTSkvTElOVVhfS0VSTkVMX0NPUFlJTkcsIktlcm5lbCIsa2VybmVsKQorJChjYWxsIGRlY2xhcmUtbGljZW5zZS1tZXRhZGF0YSwkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUdQTC0yLjAtb25seSxyZXN0cmljdGVkLCQoQlVJTERfU1lTVEVNKS9MSU5VWF9LRVJORUxfQ09QWUlORywiS2VybmVsIixrZXJuZWwpCisKK215X2JvYXJkX2V4dHJhY3RlZF9rZXJuZWwgOj0gdHJ1ZQorZW5kaWYgIyBCT0FSRF9LRVJORUxfQ09ORklHX0ZJTEUKK2VuZGlmICMgQk9BUkRfS0VSTkVMX1ZFUlNJT04KKwogCiBpZm5lcSAoJChteV9ib2FyZF9leHRyYWN0ZWRfa2VybmVsKSx0cnVlKQogaWZkZWYgSU5TVEFMTEVEX0tFUk5FTF9UQVJHRVQKK2lmbmRlZiBCT0FSRF9LRVJORUxfVkVSU0lPTgogJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpCitlbmRpZgogJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKTogUFJJVkFURV9ERUNPTVBSRVNTX1RPT0xTIDo9ICQobXlfZGVjb21wcmVzc190b29scykKICQoQlVJTFRfS0VSTkVMX0NPTkZJR1NfRklMRSk6ICQoZm9yZWFjaCBwYWlyLCQobXlfZGVjb21wcmVzc190b29scyksJChjYWxsIHdvcmQtY29sb24sMiwkKHBhaXIpKSkKICQoQlVJTFRfS0VSTkVMX0NPTkZJR1NfRklMRSk6ICQoRVhUUkFDVF9LRVJORUwpICQoZmlyc3R3b3JkICQoSU5TVEFMTEVEX0tFUk5FTF9UQVJHRVQpKQogCSQ8IC0tdG9vbHMgJChQUklWQVRFX0RFQ09NUFJFU1NfVE9PTFMpIC0taW5wdXQgJChmaXJzdHdvcmQgJChJTlNUQUxMRURfS0VSTkVMX1RBUkdFVCkpIFwKIAkgIC0tb3V0cHV0LWNvbmZpZ3MgJEAgXAotCSAgLS1vdXRwdXQtcmVsZWFzZSAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpCisJICAkKGlmICQoQk9BUkRfS0VSTkVMX1ZFUlNJT04pLCwtLW91dHB1dC1yZWxlYXNlICQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRSkpCiAKICQoY2FsbCBkZWNsYXJlLWxpY2Vuc2UtbWV0YWRhdGEsJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKSxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1HUEwtMi4wLW9ubHkscmVzdHJpY3RlZCwkKEJVSUxEX1NZU1RFTSkvTElOVVhfS0VSTkVMX0NPUFlJTkcsIktlcm5lbCIsa2VybmVsKQogCkBAIC00ODgzLDcgKzUzNzQsOSBAQAogZW5kaWYgIyBJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVAogZW5kaWYgIyBteV9ib2FyZF9leHRyYWN0ZWRfa2VybmVsCiAKLWlmbmVxICgkKG15X2JvYXJkX2V4dHJhY3RlZF9rZXJuZWwpLHRydWUpCitpZmVxICgkKG15X2JvYXJkX2V4dHJhY3RlZF9rZXJuZWwpLHRydWUpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRyb2lkX3RhcmdldHMsICQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRSkpCitlbHNlCiAkKHdhcm5pbmcgTmVpdGhlciBJTlNUQUxMRURfS0VSTkVMX1RBUkdFVCBub3IgSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQgaXMgZGVmaW5lZCB3aGVuIFwKICAgICBQUk9EVUNUX09UQV9FTkZPUkNFX1ZJTlRGX0tFUk5FTF9SRVFVSVJFTUVOVFMgIGlzIHRydWUuIEluZm9ybWF0aW9uIGFib3V0IHRoZSB1cGRhdGVkIGtlcm5lbCBcCiAgICAgY2Fubm90IGJlIGJ1aWx0IGludG8gT1RBIHVwZGF0ZSBwYWNrYWdlLiBZb3UgY2FuIGZpeCB0aGlzIGJ5OiBcCkBAIC00OTAzLDYgKzUzOTYsMzQgQEAKIAogZW5kaWYgIyBQUk9EVUNUX09UQV9FTkZPUkNFX1ZJTlRGX0tFUk5FTF9SRVFVSVJFTUVOVFMKIAoraWZlcSAoZGVmYXVsdCwkKEVOQUJMRV9VRkZEX0dDKSkKKworaWZuZXEgKCwkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpKQorJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFX0ZPUl9VRkZEX0dDKTogJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKQorJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFX0ZPUl9VRkZEX0dDKToKKwljcCAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpICQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRV9GT1JfVUZGRF9HQykKK2Vsc2UKKyMgV2UgbWFrZSB0aGlzIGEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvciB0byBhdm9pZCBicmVha2luZyB0b28gbWFueSBidWlsZHMuIFdoZW4gaXQgaGFwcGVucywKKyMgd2UgdXNlIGEgcGxhY2Vob2xkZXIgYXMgdGhlIGtlcm5lbCB2ZXJzaW9uLCB3aGljaCBpcyBjb25zdW1lZCBieSB1ZmZkX2djX3V0aWxzLnB5LgorJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFX0ZPUl9VRkZEX0dDKToKKwllY2hvICQkJ1wKK1VuYWJsZSB0byBkZXRlcm1pbmUgVUZGRCBHQyBmbGFnIGJlY2F1c2UgdGhlIGtlcm5lbCB2ZXJzaW9uIGlzIG5vdCBhdmFpbGFibGUgYW5kXG5cCitQUk9EVUNUX0VOQUJMRV9VRkZEX0dDIGlzICJkZWZhdWx0Ii5cblwKK1lvdSBjYW4gZml4IHRoaXMgYnk6XG5cCisgIDEuIFtSZWNvbW1lbmRlZF0gTWFraW5nIHRoZSBrZXJuZWwgdmVyc2lvbiBhdmFpbGFibGUuXG5cCisgICAgKDEpLiBTZXQgUFJPRFVDVF9PVEFfRU5GT1JDRV9WSU5URl9LRVJORUxfUkVRVUlSRU1FTlRTIHRvICJ0cnVlIi5cblwKKyAgICAoMikuIElmIHlvdSBhcmUgc3RpbGwgZ2V0dGluZyB0aGlzIG1lc3NhZ2UgYWZ0ZXIgZG9pbmcgc28sIHNlZSB0aGUgd2FybmluZyBhYm91dFxuXAorICAgICAgICAgUFJPRFVDVF9PVEFfRU5GT1JDRV9WSU5URl9LRVJORUxfUkVRVUlSRU1FTlRTIGluIHRoZSBidWlsZCBsb2dzLlxuXAorICBvclxuXAorICAyLiBFeHBsaWNpdGx5IHNldHRpbmcgUFJPRFVDVF9FTkFCTEVfVUZGRF9HQyB0byAidHJ1ZSIgb3IgImZhbHNlIiBiYXNlZCBvbiB0aGUga2VybmVsIHZlcnNpb24uXG5cCisgICAgKDEpLiBTZXQgUFJPRFVDVF9FTkFCTEVfVUZGRF9HQyB0byAidHJ1ZSIgaWYgdGhlIGtlcm5lbCBpcyBhIEdLSSBrZXJuZWwgYW5kIGlzIGFuZHJvaWQxMi01LjRcblwKKyAgICAgICAgIG9yIGFib3ZlLCBvciBhIG5vbi1HS0kga2VybmVsIHRoYXQgc3VwcG9ydHMgdXNlcmZhdWx0ZmQoMikgYW5kIE1SRU1BUF9ET05UVU5NQVAuXG5cCisgICAgKDIpLiBTZXQgUFJPRFVDVF9FTkFCTEVfVUZGRF9HQyB0byAiZmFsc2UiIG90aGVyd2lzZS4nXAorCSAgJiYgZWNobyAnPHVua25vd24ta2VybmVsPicgPiAkQAorZW5kaWYgIyBCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFCisKK2VuZGlmICMgRU5BQkxFX1VGRkRfR0MgPT0gImRlZmF1bHQiCisKICMgLS0gQ2hlY2sgVklOVEYgY29tcGF0aWJpbGl0eSBvZiBidWlsZC4KICMgU2tpcCBwYXJ0aWFsIGJ1aWxkczsgb25seSBjaGVjayBmdWxsIGJ1aWxkcy4gT25seSBjaGVjayBpZjoKICMgLSBQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1QgaXMgdHJ1ZQpAQCAtNTEzMSw3ICs1NjUyLDYgQEAKICAgZnNjay5lcm9mcyBcCiAgIGZzY2suZjJmcyBcCiAgIGZzX2NvbmZpZyBcCi0gIGdlbmVyYXRlX2draV9jZXJ0aWZpY2F0ZSBcCiAgIGdlbmVyYXRlX3Zlcml0eV9rZXkgXAogICBob3N0X2luaXRfdmVyaWZpZXIgXAogICBpbWcyc2ltZyBcCkBAIC01MTQ2LDcgKzU2NjYsNiBAQAogICBtYWtlX2YyZnNfY2FzZWZvbGQgXAogICBtZXJnZV9vdGEgXAogICBtZXJnZV90YXJnZXRfZmlsZXMgXAotICBtaW5pZ3ppcCBcCiAgIG1rX2NvbWJpbmVkX2ltZyBcCiAgIG1rYm9vdGZzIFwKICAgbWtib290aW1nIFwKQEAgLTUxNzMsNiArNTY5Miw3IEBACiAgIHRveWJveCBcCiAgIHR1bmUyZnMgXAogICB1bnBhY2tfYm9vdGltZyBcCisgIHVwZGF0ZV9kZXZpY2UgXAogICB1cGRhdGVfaG9zdF9zaW11bGF0b3IgXAogICB2YWxpZGF0ZV90YXJnZXRfZmlsZXMgXAogICB2ZXJpdHlfc2lnbmVyIFwKQEAgLTUxODQsMjQgKzU3MDQsMTcgQEAKIAogIyBBZGRpdGlvbmFsIHRvb2xzIHRvIHVucGFjayBhbmQgcmVwYWNrIHRoZSBhcGV4IGZpbGUuCiBJTlRFUk5BTF9PVEFUT09MU19NT0RVTEVTICs9IFwKKyAgYXBleGRfaG9zdCBcCiAgIGFwZXhlciBcCiAgIGFwZXhfY29tcHJlc3Npb25fdG9vbCBcCi0gIGJsa2lkX3N0YXRpYyBcCiAgIGRlYXBleGVyIFwKICAgZGVidWdmc19zdGF0aWMgXAotICBkdW1wX2FwZXhfaW5mbyBcCiAgIGZzY2suZXJvZnMgXAogICBtYWtlX2Vyb2ZzIFwKICAgbWVyZ2VfemlwcyBcCiAgIHJlc2l6ZTJmcyBcCiAgIHNvb25nX3ppcCBcCiAKLWlmZXEgKHRydWUsJChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSkKLUlOVEVSTkFMX09UQVRPT0xTX01PRFVMRVMgKz0gXAotICBmdXRpbGl0eS1ob3N0IFwKLSAgdmJvb3Rfc2lnbmVyCi1lbmRpZgotCiBJTlRFUk5BTF9PVEFUT09MU19GSUxFUyA6PSBcCiAgICQoZmlsdGVyICQoSE9TVF9PVVQpLyUsJChjYWxsIG1vZHVsZS1pbnN0YWxsZWQtZmlsZXMsJChJTlRFUk5BTF9PVEFUT09MU19NT0RVTEVTKSkpCiAKQEAgLTUyMzcsMTAgKzU3NTAsNiBAQAogICAkKHNvcnQgJChzaGVsbCBmaW5kIGV4dGVybmFsL2F2Yi90ZXN0L2RhdGEgLXR5cGUgZiAtbmFtZSAidGVzdGtleV8qLnBlbSIgLW8gXAogICAgICAgLW5hbWUgImF0eF9tZXRhZGF0YS5iaW4iKSkKIGVuZGlmCi1pZmVxICh0cnVlLCQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkpCi1JTlRFUk5BTF9PVEFUT09MU19QQUNLQUdFX0ZJTEVTICs9IFwKLSAgJChzb3J0ICQoc2hlbGwgZmluZCBleHRlcm5hbC92Ym9vdF9yZWZlcmVuY2UvdGVzdHMvZGV2a2V5cyAtdHlwZSBmKSkKLWVuZGlmCiAKIElOVEVSTkFMX09UQVRPT0xTX1JFTEVBU0VUT09MUyA6PSBcCiAgICQoc2hlbGwgZmluZCBidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scyAtbmFtZSAiKi5weWMiIC1wcnVuZSAtbyBcCkBAIC01MjczLDYgKzU3ODIsODEgQEAKIGVuZGlmICMgYnVpbGRfb3RhdG9vbHNfcGFja2FnZQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICBmYXN0Ym9vdC1pbmZvLnR4dAorRkFTVEJPT1RfSU5GT19WRVJTSU9OID0gMQorCitJTlNUQUxMRURfRkFTVEJPT1RfSU5GT19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvZmFzdGJvb3QtaW5mby50eHQKK2lmZGVmIFRBUkdFVF9CT0FSRF9GQVNUQk9PVF9JTkZPX0ZJTEUKKyQoSU5TVEFMTEVEX0ZBU1RCT09UX0lORk9fVEFSR0VUKTogJChUQVJHRVRfQk9BUkRfRkFTVEJPT1RfSU5GT19GSUxFKQorCXJtIC1mICRACisJJChjYWxsIHByZXR0eSwiVGFyZ2V0IGZhc3Rib290LWluZm8udHh0OiAkQCIpCisJJChoaWRlKSBjcCAkPCAkQAorZWxzZQorJChJTlNUQUxMRURfRkFTVEJPT1RfSU5GT19UQVJHRVQpOgorCXJtIC1mICRACisJJChjYWxsIHByZXR0eSwiVGFyZ2V0IGZhc3Rib290LWluZm8udHh0OiAkQCIpCisJJChoaWRlKSBlY2hvICIjIGZhc3Rib290LWluZm8gZm9yICQoVEFSR0VUX1BST0RVQ1QpIiA+PiAkQAorCSQoaGlkZSkgZWNobyAidmVyc2lvbiAkKEZBU1RCT09UX0lORk9fVkVSU0lPTikiID4+ICRACitpZm5lcSAoJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCksKQorCSQoaGlkZSkgZWNobyAiZmxhc2ggYm9vdCIgPj4gJEAKK2VuZGlmCitpZm5lcSAoJChJTlNUQUxMRURfSU5JVF9CT09UX0lNQUdFX1RBUkdFVCksKQorCSQoaGlkZSkgZWNobyAiZmxhc2ggaW5pdF9ib290IiA+PiAkQAorZW5kaWYKK2lmZGVmIEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRQorCSQoaGlkZSkgZWNobyAiZmxhc2ggZHRibyIgPj4gJEAKK2VuZGlmCitpZm5lcSAoJChJTlNUQUxMRURfRFRJTUFHRV9UQVJHRVQpLCkKKwkkKGhpZGUpIGVjaG8gImZsYXNoIGR0cyBkdC5pbWciID4+ICRACitlbmRpZgoraWZuZXEgKCQoSU5TVEFMTEVEX1ZFTkRPUl9LRVJORUxfQk9PVElNQUdFX1RBUkdFVCksKQorCSQoaGlkZSkgZWNobyAiZmxhc2ggdmVuZG9yX2tlcm5lbF9ib290IiA+PiAkQAorZW5kaWYKK2lmbmVxICgkKElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVCksKQorCSQoaGlkZSkgZWNobyAiZmxhc2ggcmVjb3ZlcnkiID4+ICRACitlbmRpZgoraWZlcSAoJChCT0FSRF9VU0VTX1BWTUZXSU1BR0UpLHRydWUpCisJJChoaWRlKSBlY2hvICJmbGFzaCBwdm1mdyIgPj4gJEAKK2VuZGlmCitpZm5lcSAoJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCkKKwkkKGhpZGUpIGVjaG8gImZsYXNoIHZlbmRvcl9ib290IiA+PiAkQAorZW5kaWYKK2lmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKK2lmZXEgKCQoQlVJTERJTkdfVkJNRVRBX0lNQUdFKSx0cnVlKQorCSQoaGlkZSkgZWNobyAiZmxhc2ggLS1hcHBseS12Ym1ldGEgdmJtZXRhIiA+PiAkQAorZW5kaWYKK2lmbmVxICgsJChzdHJpcCAkKEJPQVJEX0FWQl9WQk1FVEFfU1lTVEVNKSkpCisJJChoaWRlKSBlY2hvICJmbGFzaCB2Ym1ldGFfc3lzdGVtIiA+PiAkQAorZW5kaWYKK2lmbmVxICgsJChzdHJpcCAkKEJPQVJEX0FWQl9WQk1FVEFfVkVORE9SKSkpCisJJChoaWRlKSBlY2hvICJmbGFzaCB2Ym1ldGFfdmVuZG9yIiA+PiAkQAorZW5kaWYKK2lmbmVxICgsJChzdHJpcCAkKEJPQVJEX0FWQl9WQk1FVEFfQ1VTVE9NX1BBUlRJVElPTlMpKSkKKwkkKGhpZGUpICQoZm9yZWFjaCBwYXJ0aXRpb24sJChCT0FSRF9BVkJfVkJNRVRBX0NVU1RPTV9QQVJUSVRJT05TKSwgXAorCSAgZWNobyAiZmxhc2ggdmJtZXRhXyQocGFydGl0aW9uKSIgPj4gJEA7KQorZW5kaWYKK2VuZGlmICMgQk9BUkRfQVZCX0VOQUJMRQoraWZuZXEgKCwkKHN0cmlwICQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSkpCisJJChoaWRlKSAkKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgXAorCSAgZWNobyAiZmxhc2ggJChwYXJ0aXRpb24pIiA+PiAkQDspCitlbmRpZgorCSQoaGlkZSkgZWNobyAicmVib290IGZhc3Rib290IiA+PiAkQAorCSQoaGlkZSkgZWNobyAidXBkYXRlLXN1cGVyIiA+PiAkQAorCSQoaGlkZSkgJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9QQVJUSVRJT05fTElTVCksIFwKKwkgIGVjaG8gImZsYXNoICQocGFydGl0aW9uKSIgPj4gJEA7KQoraWZkZWYgQlVJTERJTkdfU1lTVEVNX09USEVSX0lNQUdFCisJJChoaWRlKSBlY2hvICJmbGFzaCAtLXNsb3Qtb3RoZXIgc3lzdGVtIHN5c3RlbV9vdGhlci5pbWciID4+ICRACitlbmRpZgoraWZkZWYgQlVJTERJTkdfQ0FDSEVfSU1BR0UKKwkkKGhpZGUpIGVjaG8gImlmLXdpcGUgZXJhc2UgY2FjaGUiID4+ICRACitlbmRpZgorCSQoaGlkZSkgZWNobyAiaWYtd2lwZSBlcmFzZSB1c2VyZGF0YSIgPj4gJEAKK2lmZXEgKCQoQk9BUkRfVVNFU19NRVRBREFUQV9QQVJUSVRJT04pLHRydWUpCisJJChoaWRlKSBlY2hvICJpZi13aXBlIGVyYXNlIG1ldGFkYXRhIiA+PiAkQAorZW5kaWYKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgIG1pc2NfaW5mby50eHQKIAogSU5TVEFMTEVEX01JU0NfSU5GT19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvbWlzY19pbmZvLnR4dApAQCAtNTM1MiwxMSArNTkzNiw2IEBACiAJJChoaWRlKSBlY2hvICdyZWNvdmVyeV9ta2Jvb3RpbWdfYXJncz0kKEJPQVJEX1JFQ09WRVJZX01LQk9PVElNR19BUkdTKScgPj4gJEAKIAkkKGhpZGUpIGVjaG8gJ21rYm9vdGltZ192ZXJzaW9uX2FyZ3M9JChJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTKScgPj4gJEAKIAkkKGhpZGUpIGVjaG8gJ21rYm9vdGltZ19pbml0X2FyZ3M9JChCT0FSRF9NS0JPT1RJTUdfSU5JVF9BUkdTKScgPj4gJEAKLWlmZGVmIEJPQVJEX0dLSV9TSUdOSU5HX0tFWV9QQVRICi0JJChoaWRlKSBlY2hvICdna2lfc2lnbmluZ19rZXlfcGF0aD0kKEJPQVJEX0dLSV9TSUdOSU5HX0tFWV9QQVRIKScgPj4gJEAKLQkkKGhpZGUpIGVjaG8gJ2draV9zaWduaW5nX2FsZ29yaXRobT0kKEJPQVJEX0dLSV9TSUdOSU5HX0FMR09SSVRITSknID4+ICRACi0JJChoaWRlKSBlY2hvICdna2lfc2lnbmluZ19zaWduYXR1cmVfYXJncz0kKEJPQVJEX0dLSV9TSUdOSU5HX1NJR05BVFVSRV9BUkdTKScgPj4gJEAKLWVuZGlmCiAJJChoaWRlKSBlY2hvICJtdWx0aXN0YWdlX3N1cHBvcnQ9MSIgPj4gJEAKIAkkKGhpZGUpIGVjaG8gImJsb2NraW1nZGlmZl92ZXJzaW9ucz0zLDQiID4+ICRACiBpZmVxICgkKFBST0RVQ1RfQlVJTERfR0VORVJJQ19PVEFfUEFDS0FHRSksdHJ1ZSkKQEAgLTU0MTUsMTUgKzU5OTQsMjAgQEAKIAkkKGhpZGUpIGVjaG8gImF2Yl9yZWNvdmVyeV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9SRUNPVkVSWV9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICRACiBlbmRpZiAjIEJPQVJEX0FWQl9SRUNPVkVSWV9LRVlfUEFUSAogaWZuZXEgKCwkKHN0cmlwICQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSkpCi0JJChoaWRlKSBlY2hvICJhdmJfY3VzdG9tX2ltYWdlc19wYXJ0aXRpb25fbGlzdD0kKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCkiID4+ICRACi0JJChoaWRlKSAkKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgXAorCSQoaGlkZSkgZWNobyAiY3VzdG9tX2ltYWdlc19wYXJ0aXRpb25fbGlzdD0kKGZpbHRlci1vdXQgJChCT0FSRF9BVkJfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgJChCT0FSRF9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpKSIgPj4gJEAKKwkkKGhpZGUpICQoZm9yZWFjaCBwYXJ0aXRpb24sJChmaWx0ZXItb3V0ICQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksICQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSksIFwKKwkgICAgZWNobyAiJChwYXJ0aXRpb24pX2ltYWdlX2xpc3Q9JChmb3JlYWNoIGltYWdlLCQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfSU1BR0VfTElTVCksJChub3RkaXIgJChpbWFnZSkpKSIgPj4gJEA7KQorZW5kaWYgIyBCT0FSRF9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QKK2lmbmVxICgsJChzdHJpcCAkKEJPQVJEX0FWQl9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpKSkKKwkkKGhpZGUpIGVjaG8gImF2Yl9jdXN0b21faW1hZ2VzX3BhcnRpdGlvbl9saXN0PSQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCkiID4+ICRACisJJChoaWRlKSAkKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksIFwKIAkgICAgZWNobyAiYXZiXyQocGFydGl0aW9uKV9rZXlfcGF0aD0kKEJPQVJEX0FWQl8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9LRVlfUEFUSCkiICA+PiAkQDsgXAogCSAgICBlY2hvICJhdmJfJChwYXJ0aXRpb24pX2FsZ29yaXRobT0kKEJPQVJEX0FWQl8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9BTEdPUklUSE0pIiAgPj4gJEA7IFwKIAkgICAgZWNobyAiYXZiXyQocGFydGl0aW9uKV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgID4+ICRAOyBcCiAJICAgIGVjaG8gImF2Yl8kKHBhcnRpdGlvbilfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiAgPj4gJEA7IFwKIAkgICAgZWNobyAiYXZiXyQocGFydGl0aW9uKV9wYXJ0aXRpb25fc2l6ZT0kKEJPQVJEX0FWQl8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9QQVJUSVRJT05fU0laRSkiICA+PiAkQDsgXAogCSAgICBlY2hvICJhdmJfJChwYXJ0aXRpb24pX2ltYWdlX2xpc3Q9JChmb3JlYWNoIGltYWdlLCQoQk9BUkRfQVZCXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0lNQUdFX0xJU1QpLCQobm90ZGlyICQoaW1hZ2UpKSkiID4+ICRAOykKLWVuZGlmICMgQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUCitlbmRpZiAjIEJPQVJEX0FWQl9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QKIGlmbmVxICgsJChzdHJpcCAkKEJPQVJEX0FWQl9WQk1FVEFfU1lTVEVNKSkpCiAJJChoaWRlKSBlY2hvICJhdmJfdmJtZXRhX3N5c3RlbT0kKEJPQVJEX0FWQl9WQk1FVEFfU1lTVEVNKSIgPj4gJEAKIAkkKGhpZGUpIGVjaG8gImF2Yl92Ym1ldGFfc3lzdGVtX2FyZ3M9JChCT0FSRF9BVkJfTUFLRV9WQk1FVEFfU1lTVEVNX0lNQUdFX0FSR1MpIiA+PiAkQApAQCAtNTQ0OCwxNCArNjAzMiw2IEBACiAJZWNobyAiYXZiX3ZibWV0YV8kKHBhcnRpdGlvbilfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfVkJNRVRBXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJEAgOykKIGVuZGlmICMgQk9BUkRfQVZCX1ZCTUVUQV9DVVNUT01fUEFSVElUSU9OUwogZW5kaWYgIyBCT0FSRF9BVkJfRU5BQkxFCi1pZmRlZiBCT0FSRF9CUFRfSU5QVVRfRklMRVMKLQkkKGhpZGUpIGVjaG8gImJvYXJkX2JwdF9lbmFibGU9dHJ1ZSIgPj4gJEAKLQkkKGhpZGUpIGVjaG8gImJvYXJkX2JwdF9tYWtlX3RhYmxlX2FyZ3M9JChCT0FSRF9CUFRfTUFLRV9UQUJMRV9BUkdTKSIgPj4gJEAKLQkkKGhpZGUpIGVjaG8gImJvYXJkX2JwdF9pbnB1dF9maWxlcz0kKEJPQVJEX0JQVF9JTlBVVF9GSUxFUykiID4+ICRACi1lbmRpZgotaWZkZWYgQk9BUkRfQlBUX0RJU0tfU0laRQotCSQoaGlkZSkgZWNobyAiYm9hcmRfYnB0X2Rpc2tfc2l6ZT0kKEJPQVJEX0JQVF9ESVNLX1NJWkUpIiA+PiAkQAotZW5kaWYKIAkkKGNhbGwgZ2VuZXJhdGUtdXNlcmltYWdlLXByb3AtZGljdGlvbmFyeSwgJEApCiBpZmVxICgkKEFCX09UQV9VUERBVEVSKSx0cnVlKQogCUAjIEluY2x1ZGUgdGhlIGJ1aWxkIHR5cGUgaW4gTUVUQS9taXNjX2luZm8udHh0IHNvIHRoZSBzZXJ2ZXIgY2FuIGVhc2lseSBkaWZmZXJlbnRpYXRlIHByb2R1Y3Rpb24gYnVpbGRzLgpAQCAtNTQ2NSw2ICs2MDQxLDkgQEAKIGlmZXEgKCQoVEFSR0VUX09UQV9BTExPV19OT05fQUIpLHRydWUpCiAJJChoaWRlKSBlY2hvICJhbGxvd19ub25fYWI9dHJ1ZSIgPj4gJEAKIGVuZGlmCitpZmVxICgkKEJPQVJEX05PTl9BQl9PVEFfRElTQUJMRV9DT01QUkVTU0lPTiksdHJ1ZSkKKwkkKGhpZGUpIGVjaG8gImJvYXJkX25vbl9hYl9vdGFfZGlzYWJsZV9jb21wcmVzc2lvbj10cnVlIiA+PiAkQAorZW5kaWYKIGlmZGVmIEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRQogCSQoaGlkZSkgZWNobyAiaGFzX2R0Ym89dHJ1ZSIgPj4gJEAKIGlmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKQEAgLTU1MTgsOSArNjA5NywxMyBAQAogaWZlcSAoJChCVUlMRElOR19XSVRIX1ZTREspLHRydWUpCiAJJChoaWRlKSBlY2hvICJidWlsZGluZ193aXRoX3ZzZGs9dHJ1ZSIgPj4gJEAKIGVuZGlmCi1pZmVxICgkKFRBUkdFVF9GTEFUVEVOX0FQRVgpLGZhbHNlKQotCSQoaGlkZSkgZWNobyAidGFyZ2V0X2ZsYXR0ZW5fYXBleD1mYWxzZSIgPj4gJEAKLWVuZGlmCisKKyQoY2FsbCBkZWNsYXJlLTBwLXRhcmdldCwkKElOU1RBTExFRF9GQVNUQk9PVF9JTkZPX1RBUkdFVCkpCisKKy5QSE9OWTogZmFzdGJvb3RfaW5mbworZmFzdGJvb3RfaW5mbzogJChJTlNUQUxMRURfRkFTVEJPT1RfSU5GT19UQVJHRVQpCisKK2Ryb2lkY29yZS11bmJ1bmRsZWQ6ICQoSU5TVEFMTEVEX0ZBU1RCT09UX0lORk9fVEFSR0VUKQogCiAkKGNhbGwgZGVjbGFyZS0wcC10YXJnZXQsJChJTlNUQUxMRURfTUlTQ19JTkZPX1RBUkdFVCkpCiAKQEAgLTU1MzgsMjEgKzYxMjEsMjMgQEAKIGlmZXEgKCQoVEFSR0VUX0JVSUxEX1RZUEUpLGRlYnVnKQogICBuYW1lIDo9ICQobmFtZSlfZGVidWcKIGVuZGlmCi1uYW1lIDo9ICQobmFtZSktdGFyZ2V0X2ZpbGVzLSQoRklMRV9OQU1FX1RBRykKK25hbWUgOj0gJChuYW1lKS10YXJnZXRfZmlsZXMKIAogaW50ZXJtZWRpYXRlcyA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx0YXJnZXRfZmlsZXMpCitCVUlMVF9UQVJHRVRfRklMRVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcykvJChuYW1lKS56aXAubGlzdAogQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UgOj0gJChpbnRlcm1lZGlhdGVzKS8kKG5hbWUpLnppcAotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6IGludGVybWVkaWF0ZXMgOj0gJChpbnRlcm1lZGlhdGVzKQotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6IFwKLQkgICAgemlwX3Jvb3QgOj0gJChpbnRlcm1lZGlhdGVzKS8kKG5hbWUpCiskKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogemlwX3Jvb3QgOj0gJChpbnRlcm1lZGlhdGVzKS8kKG5hbWUpCiskKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiB6aXBfcm9vdCA6PSAkKGludGVybWVkaWF0ZXMpLyQobmFtZSkKKyQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6IGludGVybWVkaWF0ZXMgOj0gJChpbnRlcm1lZGlhdGVzKQorCiAKICMgJCgxKTogRGlyZWN0b3J5IHRvIGNvcHkKICMgJCgyKTogTG9jYXRpb24gdG8gY29weSBpdCB0bwotIyBUaGUgImxzIC1BIiBpcyB0byBwcmV2ZW50ICJhY3Agcy8qIGQiIGZyb20gZmFpbGluZyBpZiBzIGlzIGVtcHR5LgorIyBUaGUgImxzIC1BIiBpcyB0byBza2lwIGlmICQoMSkgaXMgZW1wdHkuCiBkZWZpbmUgcGFja2FnZV9maWxlcy1jb3B5LXJvb3QKICAgaWYgWyAtZCAiJChzdHJpcCAkKDEpKSIgLWEgIiQkKGxzIC1BICQoMSkpIiBdOyB0aGVuIFwKICAgICBta2RpciAtcCAkKDIpICYmIFwKLSAgICAkKEFDUCkgLXJkICQoc3RyaXAgJCgxKSkvKiAkKDIpOyBcCisgICAgJChBQ1ApIC1yZCAkKHN0cmlwICQoMSkpLy4gJChzdHJpcCAkKDIpKS87IFwKICAgZmkKIGVuZGVmCiAKQEAgLTU1NjQsMTAgKzYxNDksMTAgQEAKICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVYRUNVVEFCTEVTLHVwZGF0ZXIpL3VwZGF0ZXIKIGVuZGlmCiAKLSQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiBQUklWQVRFX09UQV9UT09MUyA6PSAkKGJ1aWx0X290YV90b29scykKKyQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6IFBSSVZBVEVfT1RBX1RPT0xTIDo9ICQoYnVpbHRfb3RhX3Rvb2xzKQogCiB0b29sX2V4dGVuc2lvbiA6PSAkKHdpbGRjYXJkICQodG9vbF9leHRlbnNpb25zKS9yZWxlYXNldG9vbHMucHkpCi0kKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogUFJJVkFURV9UT09MX0VYVEVOU0lPTiA6PSAkKHRvb2xfZXh0ZW5zaW9uKQorJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogUFJJVkFURV9UT09MX0VYVEVOU0lPTiA6PSAkKHRvb2xfZXh0ZW5zaW9uKQogCiB1cGRhdGVyX2RlcCA6PQogaWZlcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKQEAgLTU1ODMsMjkgKzYxNjgsMjMgQEAKIHVwZGF0ZXJfZGVwICs9ICQoYnVpbHRfb3RhX3Rvb2xzKQogZW5kaWYKIAotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQodXBkYXRlcl9kZXApCiskKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKHVwZGF0ZXJfZGVwKQogCiAjIElmIHdlIGFyZSB1c2luZyByZWNvdmVyeSBhcyBib290LCBvdXRwdXQgcmVjb3ZlcnkgZmlsZXMgdG8gQk9PVC8uCiAjIElmIHdlIGFyZSBtb3ZpbmcgcmVjb3ZlcnkgcmVzb3VyY2VzIHRvIHZlbmRvcl9ib290LCBvdXRwdXQgcmVjb3ZlcnkgZmlsZXMgdG8gVkVORE9SX0JPT1QvLgogaWZlcSAoJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpLHRydWUpCi0kKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogUFJJVkFURV9SRUNPVkVSWV9PVVQgOj0gQk9PVAorJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogUFJJVkFURV9SRUNPVkVSWV9PVVQgOj0gQk9PVAogZWxzZSBpZmVxICgkKEJPQVJEX01PVkVfUkVDT1ZFUllfUkVTT1VSQ0VTX1RPX1ZFTkRPUl9CT09UKSx0cnVlKQotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6IFBSSVZBVEVfUkVDT1ZFUllfT1VUIDo9IFZFTkRPUl9CT09UCiskKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiBQUklWQVRFX1JFQ09WRVJZX09VVCA6PSBWRU5ET1JfQk9PVAogZWxzZQotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6IFBSSVZBVEVfUkVDT1ZFUllfT1VUIDo9IFJFQ09WRVJZCiskKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiBQUklWQVRFX1JFQ09WRVJZX09VVCA6PSBSRUNPVkVSWQogZW5kaWYKIAogaWZlcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKICAgaWZkZWYgT1NSRUxFQVNFRF9ESVJFQ1RPUlkKLSAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChUQVJHRVRfT1VUX09FTSkvJChPU1JFTEVBU0VEX0RJUkVDVE9SWSkvcHJvZHVjdF9pZAotICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKFRBUkdFVF9PVVRfT0VNKS8kKE9TUkVMRUFTRURfRElSRUNUT1JZKS9wcm9kdWN0X3ZlcnNpb24KLSAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChUQVJHRVRfT1VUX0VUQykvJChPU1JFTEVBU0VEX0RJUkVDVE9SWSkvc3lzdGVtX3ZlcnNpb24KLSAgZW5kaWYKLQotICAjIE5vdCBjaGVja2luZyBpbiBib2FyZF9jb25maWcubWssIHNpbmNlIEFCX09UQV9QQVJUSVRJT05TIG1heSBiZSB1cGRhdGVkIGluIEFuZHJvaWQubWsgKGUuZy4gdG8KLSAgIyBhZGRpdGlvbmFsbHkgaW5jbHVkZSByYWRpbyBvciBib290bG9hZGVyIHBhcnRpdGlvbnMpLgotICBpZmVxICgkKEFCX09UQV9QQVJUSVRJT05TKSwpCi0gICAgJChlcnJvciBBQl9PVEFfUEFSVElUSU9OUyBtdXN0IGJlIGRlZmluZWQgd2hlbiB1c2luZyBBQl9PVEFfVVBEQVRFUikKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKFRBUkdFVF9PVVRfT0VNKS8kKE9TUkVMRUFTRURfRElSRUNUT1JZKS9wcm9kdWN0X2lkCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChUQVJHRVRfT1VUX09FTSkvJChPU1JFTEVBU0VEX0RJUkVDVE9SWSkvcHJvZHVjdF92ZXJzaW9uCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChUQVJHRVRfT1VUX0VUQykvJChPU1JFTEVBU0VEX0RJUkVDVE9SWSkvc3lzdGVtX3ZlcnNpb24KICAgZW5kaWYKIGVuZGlmCiAKQEAgLTU2MTksNyArNjE5OCw3IEBACiAjICQxOiByb290IGRpcmVjdG9yeQogIyAkMjogYWRkIHByZWZpeAogZGVmaW5lIGZzX2NvbmZpZwotKGNkICQoMSk7IGZpbmQgLiAtdHlwZSBkIHwgc2VkICdzLCQkLC8sJzsgZmluZCAuIFwhIC10eXBlIGQpIHwgY3V0IC1jIDMtIHwgc29ydCB8IHNlZCAncyxeLCQoMiksJyB8ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ZzX2NvbmZpZyAtQyAtRCAkKFRBUkdFVF9PVVQpIC1TICQoU0VMSU5VWF9GQykgLVIgIiQoMikiCisoY2QgJCgxKTsgZmluZCAuIC10eXBlIGQgfCBzZWQgJ3MsJCQsLywnOyBmaW5kIC4gXCEgLXR5cGUgZCkgfCBjdXQgLWMgMy0gfCBzb3J0IHwgc2VkICdzLF4sJCgyKSwnIHwgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZnNfY29uZmlnIC1DIC1EICQoVEFSR0VUX09VVCkgLVIgIiQoMikiCiBlbmRlZgogCiBkZWZpbmUgZmlsdGVyLW91dC1taXNzaW5nLXZlbmRvcgpAQCAtNTcwMSwzNCArNjI4MCw2NyBAQAogICAgIGVjaG8gInZpcnR1YWxfYWJfY29tcHJlc3Npb25fbWV0aG9kPSQoUFJPRFVDVF9WSVJUVUFMX0FCX0NPTVBSRVNTSU9OX01FVEhPRCkiID4+ICQoMSkpCiAgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfVklSVFVBTF9BQl9PVEFfUkVUUk9GSVQpKSwgXAogICAgIGVjaG8gInZpcnR1YWxfYWJfcmV0cm9maXQ9dHJ1ZSIgPj4gJCgxKSkKKyAgJChpZiAkKFBST0RVQ1RfVklSVFVBTF9BQl9DT1dfVkVSU0lPTiksIFwKKyAgICBlY2hvICJ2aXJ0dWFsX2FiX2Nvd192ZXJzaW9uPSQoUFJPRFVDVF9WSVJUVUFMX0FCX0NPV19WRVJTSU9OKSIgPj4gJCgxKSkKKyAgJChpZiAkKFBST0RVQ1RfVklSVFVBTF9BQl9DT01QUkVTU0lPTl9GQUNUT1IpLCBcCisgICAgZWNobyAidmlydHVhbF9hYl9jb21wcmVzc2lvbl9mYWN0b3I9JChQUk9EVUNUX1ZJUlRVQUxfQUJfQ09NUFJFU1NJT05fRkFDVE9SKSIgPj4gJCgxKSkKK2VuZGVmCisKKyMgQ29weSBhbiBpbWFnZSBmaWxlIHRvIGEgZGlyZWN0b3J5IGFuZCBnZW5lcmF0ZSBhIGJsb2NrIGxpc3QgbWFwIGZpbGUgZnJvbSB0aGUgaW1hZ2UsCisjIG9ubHkgaWYgdGhlIG1hcF9maWxlX2dlbmVyYXRvciBzdXBwb3J0cyB0aGUgZmlsZSBzeXN0ZW0uCisjIE90aGVyd2lzZSwgc2tpcCBnZW5lcmF0aW5nIG1hcCBmaWxlcyBhcyB3ZWxsIGFzIGNvcHlpbmcgaW1hZ2VzLiBUaGUgaW1hZ2Ugd2lsbCBiZQorIyBnZW5lcmF0ZWQgZnJvbSB0aGUgJChBRERfSU1HX1RPX1RBUkdFVF9GSUxFUykgdG8gZ2VuZXJhdGUgdGhlIG1hcCBmaWxlIHdpdGggaXQuCisjICQoMSk6IHBhdGggb2YgdGhlIGltYWdlIGZpbGUKKyMgJCgyKTogdGFyZ2V0IG91dCBkaXJlY3RvcnkKKyMgJCgzKTogaW1hZ2UgbmFtZSB0byBnZW5lcmF0ZSBhIG1hcCBmaWxlLiBza2lwIGdlbmVyYXRpbmcgbWFwIGZpbGUgaWYgZW1wdHkKK2RlZmluZSBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAKKyAgJChpZiAkKENPUFlfSU1BR0VTX0ZPUl9UQVJHRVRfRklMRVNfWklQKSwgXAorICAgICQoZXZhbCBfc3VwcG9ydGVkX2ZzX2Zvcl9tYXBfZmlsZV9nZW5lcmF0b3IgOj0gZXJvZnMgZXh0JSkgXAorICAgICQoZXZhbCBfaW1nIDo9ICQoY2FsbCB0by11cHBlciwkKDMpKSkgXAorICAgICQoaWYgJCgzKSwkKGV2YWwgX21hcF9mc190eXBlIDo9ICQoQk9BUkRfJChfaW1nKUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpKSxcCisgICAgICAkKGV2YWwgX25vX21hcF9maWxlIDo9ICJ0cnVlIikpIFwKKyAgICAkKGlmICQoZmlsdGVyICQoX3N1cHBvcnRlZF9mc19mb3JfbWFwX2ZpbGVfZ2VuZXJhdG9yKSwkKF9tYXBfZnNfdHlwZSkpJChfbm9fbWFwX2ZpbGUpLFwKKyAgICAgIG1rZGlyIC1wICQoMik7IFwKKyAgICAgIGNwICQoMSkgJCgyKTsgXAorICAgICAgJChpZiAkKDMpLCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21hcF9maWxlX2dlbmVyYXRvciAkKDEpICQoMikvJCgzKS5tYXApKSBcCisgICAgJChldmFsIF9pbWcgOj0pIFwKKyAgICAkKGV2YWwgX21hcF9mc190eXBlIDo9KSBcCisgICAgJChldmFsIF9ub19tYXBfZmlsZSA6PSkgXAorICApCiBlbmRlZgogCiAjIEJ5IGNvbmRpdGlvbmFsbHkgaW5jbHVkaW5nIHRoZSBkZXBlbmRlbmN5IG9mIHRoZSB0YXJnZXQgZmlsZXMgcGFja2FnZSBvbiB0aGUKICMgZnVsbCBzeXN0ZW0gaW1hZ2UgZGVwcywgd2Ugc3BlZWQgdXAgYnVpbGRzIHRoYXQgZG8gbm90IGJ1aWxkIHRoZSBzeXN0ZW0KICMgaW1hZ2UuCiBpZmRlZiBCVUlMRElOR19TWVNURU1fSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoRlVMTF9TWVNURU1JTUFHRV9ERVBTKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKEZVTExfU1lTVEVNSU1BR0VfREVQUykKKyAgaWZkZWYgQ09QWV9JTUFHRVNfRk9SX1RBUkdFVF9GSUxFU19aSVAKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKEJVSUxUX1NZU1RFTUlNQUdFKQorICBlbmRpZgogZWxzZQogICAjIHJlbGVhc2V0b29scyBtYXkgbmVlZCB0aGUgc3lzdGVtIGJ1aWxkLnByb3AgZXZlbiB3aGVuIGJ1aWxkaW5nIGEKICAgIyBzeXN0ZW0taW1hZ2UtbGVzcyBwcm9kdWN0LgotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlNUQUxMRURfQlVJTERfUFJPUF9UQVJHRVQpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUKQogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfVVNFUkRBVEFfSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5URVJOQUxfVVNFUkRBVEFJTUFHRV9GSUxFUykKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9VU0VSREFUQUlNQUdFX0ZJTEVTKQogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfU1lTVEVNX09USEVSX0lNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1NZU1RFTU9USEVSSU1BR0VfRklMRVMpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5URVJOQUxfU1lTVEVNT1RIRVJJTUFHRV9GSUxFUykKKyAgaWZkZWYgQ09QWV9JTUFHRVNfRk9SX1RBUkdFVF9GSUxFU19aSVAKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKEJVSUxUX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKQorICBlbmRpZgogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfVkVORE9SX0JPT1RfSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5URVJOQUxfVkVORE9SX1JBTURJU0tfRklMRVMpCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1ZFTkRPUl9SQU1ESVNLX0ZSQUdNRU5UX1RBUkdFVFMpCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1ZFTkRPUl9CT09UQ09ORklHX1RBUkdFVCkKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9WRU5ET1JfUkFNRElTS19GSUxFUykKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9WRU5ET1JfUkFNRElTS19GUkFHTUVOVF9UQVJHRVRTKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOVEVSTkFMX1ZFTkRPUl9CT09UQ09ORklHX1RBUkdFVCkKICAgIyBUaGUgdmVuZG9yIHJhbWRpc2sgbWF5IGJlIGJ1aWx0IGZyb20gdGhlIHJlY292ZXJ5IHJhbWRpc2suCiAgIGlmZXEgKHRydWUsJChCT0FSRF9NT1ZFX1JFQ09WRVJZX1JFU09VUkNFU19UT19WRU5ET1JfQk9PVCkpCi0gICAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5URVJOQUxfUkVDT1ZFUllfUkFNRElTS19GSUxFU19USU1FU1RBTVApCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9SRUNPVkVSWV9SQU1ESVNLX0ZJTEVTX1RJTUVTVEFNUCkKICAgZW5kaWYKIGVuZGlmCiAKQEAgLTU3MzgsMTEgKzYzNTAsMTEgQEAKICAgIyBjb21tYW5kcyBpbiBidWlsZC1yZWNvdmVyeWltYWdlLXRhcmdldCwgd2hpY2ggd291bGQgdG91Y2ggdGhlIGZpbGVzIHVuZGVyCiAgICMgVEFSR0VUX1JFQ09WRVJZX09VVCBhbmQgcmFjZSB3aXRoIHBhY2thZ2luZyB0YXJnZXQtZmlsZXMuemlwLgogICBpZmVxICgkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCksdHJ1ZSkKLSAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKQogICBlbHNlCi0gICAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKQorICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKQogICBlbmRpZgotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlRFUk5BTF9SRUNPVkVSWUlNQUdFX0ZJTEVTKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOVEVSTkFMX1JFQ09WRVJZSU1BR0VfRklMRVMpCiBlbmRpZgogCiAjIENvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIHRoZSBpbWFnZSBmaWxlcyBpZiB0aGUgaW1hZ2UgaXMgYmVpbmcgYnVpbHQgc28gdGhlCkBAIC01NzUwLDY4ICs2MzYyLDg5IEBACiAjIGlmIGl0IGlzIGNvbWluZyBmcm9tIGEgcHJlYnVpbHQuCiAKIGlmZGVmIEJVSUxESU5HX1ZFTkRPUl9JTUFHRQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlRFUk5BTF9WRU5ET1JJTUFHRV9GSUxFUykKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9WRU5ET1JJTUFHRV9GSUxFUykKKyAgaWZkZWYgQ09QWV9JTUFHRVNfRk9SX1RBUkdFVF9GSUxFU19aSVAKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKEJVSUxUX1ZFTkRPUklNQUdFX1RBUkdFVCkKKyAgZW5kaWYKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfVkVORE9SSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKQogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfUFJPRFVDVF9JTUFHRQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlRFUk5BTF9QUk9EVUNUSU1BR0VfRklMRVMpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKQorICBpZmRlZiBDT1BZX0lNQUdFU19GT1JfVEFSR0VUX0ZJTEVTX1pJUAorICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoQlVJTFRfUFJPRFVDVElNQUdFX1RBUkdFVCkKKyAgZW5kaWYKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfUFJPRFVDVElNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKQogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfU1lTVEVNX0VYVF9JTUFHRQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlRFUk5BTF9TWVNURU1fRVhUSU1BR0VfRklMRVMpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5URVJOQUxfU1lTVEVNX0VYVElNQUdFX0ZJTEVTKQorICBpZmRlZiBDT1BZX0lNQUdFU19GT1JfVEFSR0VUX0ZJTEVTX1pJUAorICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoQlVJTFRfU1lTVEVNX0VYVElNQUdFX1RBUkdFVCkKKyAgZW5kaWYKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfU1lTVEVNX0VYVElNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOU1RBTExFRF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOU1RBTExFRF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKQogZW5kaWYKIAogaWZuZXEgKCwkKEJVSUxESU5HX0JPT1RfSU1BR0UpJChCVUlMRElOR19JTklUX0JPT1RfSU1BR0UpKQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlRFUk5BTF9SQU1ESVNLX0ZJTEVTKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOVEVSTkFMX1JBTURJU0tfRklMRVMpCiBlbmRpZiAgIyBCVUlMRElOR19CT09UX0lNQUdFICE9ICIiIHx8IEJVSUxESU5HX0lOSVRfQk9PVF9JTUFHRSAhPSAiIgogCiBpZm5lcSAoLCQoSU5URVJOQUxfUFJFQlVJTFRfQk9PVElNQUdFKSAkKGZpbHRlciB0cnVlLCQoQk9BUkRfQ09QWV9CT09UX0lNQUdFX1RPX1RBUkdFVF9GSUxFUykpKQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkKIGVuZGlmCiAKIGlmZGVmIEJVSUxESU5HX09ETV9JTUFHRQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlRFUk5BTF9PRE1JTUFHRV9GSUxFUykKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9PRE1JTUFHRV9GSUxFUykKKyAgaWZkZWYgQ09QWV9JTUFHRVNfRk9SX1RBUkdFVF9GSUxFU19aSVAKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKEJVSUxUX09ETUlNQUdFX1RBUkdFVCkKKyAgZW5kaWYKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfT0RNSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5TVEFMTEVEX09ETUlNQUdFX1RBUkdFVCkKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlNUQUxMRURfT0RNSU1BR0VfVEFSR0VUKQogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfVkVORE9SX0RMS01fSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5URVJOQUxfVkVORE9SX0RMS01JTUFHRV9GSUxFUykKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9WRU5ET1JfRExLTUlNQUdFX0ZJTEVTKQorICBpZmRlZiBDT1BZX0lNQUdFU19GT1JfVEFSR0VUX0ZJTEVTX1pJUAorICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoQlVJTFRfVkVORE9SX0RMS01JTUFHRV9UQVJHRVQpCisgIGVuZGlmCiBlbHNlIGlmZGVmIEJPQVJEX1BSRUJVSUxUX1ZFTkRPUl9ETEtNSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNSU1BR0VfVEFSR0VUKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOU1RBTExFRF9WRU5ET1JfRExLTUlNQUdFX1RBUkdFVCkKIGVuZGlmCiAKIGlmZGVmIEJVSUxESU5HX09ETV9ETEtNX0lNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX09ETV9ETEtNSU1BR0VfRklMRVMpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5URVJOQUxfT0RNX0RMS01JTUFHRV9GSUxFUykKKyAgaWZkZWYgQ09QWV9JTUFHRVNfRk9SX1RBUkdFVF9GSUxFU19aSVAKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKEJVSUxUX09ETV9ETEtNSU1BR0VfVEFSR0VUKQorICBlbmRpZgogZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9PRE1fRExLTUlNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOU1RBTExFRF9PRE1fRExLTUlNQUdFX1RBUkdFVCkKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlNUQUxMRURfT0RNX0RMS01JTUFHRV9UQVJHRVQpCiBlbmRpZgogCiBpZmRlZiBCVUlMRElOR19TWVNURU1fRExLTV9JTUFHRQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlRFUk5BTF9TWVNURU1fRExLTUlNQUdFX0ZJTEVTKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOVEVSTkFMX1NZU1RFTV9ETEtNSU1BR0VfRklMRVMpCisgIGlmZGVmIENPUFlfSU1BR0VTX0ZPUl9UQVJHRVRfRklMRVNfWklQCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChCVUlMVF9TWVNURU1fRExLTUlNQUdFX1RBUkdFVCkKKyAgZW5kaWYKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfU1lTVEVNX0RMS01JTUFHRQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUKQogZW5kaWYKIAogaWZlcSAoJChCVUlMRF9RRU1VX0lNQUdFUyksdHJ1ZSkKICAgTUtfVkJNRVRBX0JPT1RfS0VSTkVMX0NNRExJTkVfU0ggOj0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvdG9vbHMvbWtfdmJtZXRhX2Jvb3RfcGFyYW1zLnNoCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKE1LX1ZCTUVUQV9CT09UX0tFUk5FTF9DTURMSU5FX1NIKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKE1LX1ZCTUVUQV9CT09UX0tFUk5FTF9DTURMSU5FX1NIKQogZW5kaWYKIAogaWZkZWYgQk9BUkRfUFJFQlVJTFRfQk9PVExPQURFUgotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5TVEFMTEVEX0JPT1RMT0FERVJfTU9EVUxFKQorJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlNUQUxMRURfQk9PVExPQURFUl9NT0RVTEUpCiBkcm9pZGNvcmUtdW5idW5kbGVkOiAkKElOU1RBTExFRF9CT09UTE9BREVSX01PRFVMRSkKIGVuZGlmCiAKICMgRGVwZW5kaW5nIG9uIHRoZSB2YXJpb3VzIGltYWdlcyBndWFyYW50ZWVzIHRoYXQgdGhlIHVuZGVybHlpbmcKICMgZGlyZWN0b3JpZXMgYXJlIHVwLXRvLWRhdGUuCi0kKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogXAorJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogXAogCSAgICAkKElOU1RBTExFRF9SQURJT0lNQUdFX1RBUkdFVCkgXAogCSAgICAkKElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVCkgXAogCSAgICAkKElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCkgXApAQCAtNTgyNSw2ICs2NDU4LDggQEAKIAkgICAgJChJTlNUQUxMRURfUkFNRElTS19UQVJHRVQpIFwKIAkgICAgJChJTlNUQUxMRURfRFRCSU1BR0VfVEFSR0VUKSBcCiAJICAgICQoSU5TVEFMTEVEXzJOREJPT1RMT0FERVJfVEFSR0VUKSBcCisJICAgICQoQlVJTFRfUkFNRElTS18xNktfVEFSR0VUKSBcCisJICAgICQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpIFwKIAkgICAgJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpIFwKIAkgICAgJChCT0FSRF9QUkVCVUlMVF9SRUNPVkVSWV9EVEJPSU1BR0UpIFwKIAkgICAgJChCT0FSRF9SRUNPVkVSWV9BQ1BJTykgXApAQCAtNTgzOSwxNiArNjQ3NCwxOCBAQAogCSAgICAkKExQTUFLRSkgXAogCSAgICAkKFNFTElOVVhfRkMpIFwKIAkgICAgJChJTlNUQUxMRURfTUlTQ19JTkZPX1RBUkdFVCkgXAorCSAgICAkKElOU1RBTExFRF9GQVNUQk9PVF9JTkZPX1RBUkdFVCkgXAogCSAgICAkKEFQS0NFUlRTX0ZJTEUpIFwKLQkgICAgJChTT09OR19BUEVYX0tFWVNfRklMRSkgXAorCSAgICAkKEFQRVhfS0VZU19GSUxFKSBcCiAJICAgICQoU09PTkdfWklQKSBcCiAJICAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ZzX2NvbmZpZyBcCisJICAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21hcF9maWxlX2dlbmVyYXRvciBcCiAJICAgICQoQUREX0lNR19UT19UQVJHRVRfRklMRVMpIFwKIAkgICAgJChNQUtFX1JFQ09WRVJZX1BBVENIKSBcCiAJICAgICQoQlVJTFRfS0VSTkVMX0NPTkZJR1NfRklMRSkgXAogCSAgICAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpIFwKIAkgICAgfCAkKEFDUCkKLQlAZWNobyAiUGFja2FnZSB0YXJnZXQgZmlsZXM6ICRAIgorCUBlY2hvICJCdWlsZGluZyB0YXJnZXQgZmlsZXM6ICRAIgogCSQoaGlkZSkgcm0gLXJmICRAICRALmxpc3QgJCh6aXBfcm9vdCkKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKSAkKHppcF9yb290KQogaWZuZXEgKCwkKElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVCkkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSkkKGZpbHRlciB0cnVlLCQoQk9BUkRfTU9WRV9SRUNPVkVSWV9SRVNPVVJDRVNfVE9fVkVORE9SX0JPT1QpKSkKQEAgLTYwNTAsMTMgKzY2ODcsMTYgQEAKIAlAIyBidWlsZCB0aGVtLgogCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvTUVUQQogCSQoaGlkZSkgY3AgJChBUEtDRVJUU19GSUxFKSAkKHppcF9yb290KS9NRVRBL2Fwa2NlcnRzLnR4dAotCSQoaGlkZSkgY3AgJChTT09OR19BUEVYX0tFWVNfRklMRSkgJCh6aXBfcm9vdCkvTUVUQS9hcGV4a2V5cy50eHQKKwkkKGhpZGUpIGNwICQoQVBFWF9LRVlTX0ZJTEUpICQoemlwX3Jvb3QpL01FVEEvYXBleGtleXMudHh0CiBpZm5lcSAoJCh0b29sX2V4dGVuc2lvbiksKQogCSQoaGlkZSkgY3AgJChQUklWQVRFX1RPT0xfRVhURU5TSU9OKSAkKHppcF9yb290KS9NRVRBLwogZW5kaWYKIAkkKGhpZGUpIGVjaG8gIiQoUFJPRFVDVF9PVEFfUFVCTElDX0tFWVMpIiA+ICQoemlwX3Jvb3QpL01FVEEvb3Rha2V5cy50eHQKIAkkKGhpZGUpIGNwICQoU0VMSU5VWF9GQykgJCh6aXBfcm9vdCkvTUVUQS9maWxlX2NvbnRleHRzLmJpbgogCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfTUlTQ19JTkZPX1RBUkdFVCkgJCh6aXBfcm9vdCkvTUVUQS9taXNjX2luZm8udHh0CitpZm5lcSAoJChJTlNUQUxMRURfRkFTVEJPT1RfSU5GT19UQVJHRVQpLCkKKwkkKGhpZGUpIGNwICQoSU5TVEFMTEVEX0ZBU1RCT09UX0lORk9fVEFSR0VUKSAkKHppcF9yb290KS9NRVRBL2Zhc3Rib290LWluZm8udHh0CitlbmRpZgogaWZuZXEgKCQoUFJPRFVDVF9TWVNURU1fQkFTRV9GU19QQVRIKSwpCiAJJChoaWRlKSBjcCAkKFBST0RVQ1RfU1lTVEVNX0JBU0VfRlNfUEFUSCkgXAogCSAgJCh6aXBfcm9vdCkvTUVUQS8kKG5vdGRpciAkKFBST0RVQ1RfU1lTVEVNX0JBU0VfRlNfUEFUSCkpCkBAIC02MTE2LDYgKzY3NTYsMTAgQEAKIAlAIyBJZiBicmVha3BhZCBzeW1ib2xzIGhhdmUgYmVlbiBnZW5lcmF0ZWQsIGFkZCB0aGVtIHRvIHRoZSB6aXAuCiAJJChoaWRlKSBjcCAtUiAkKFRBUkdFVF9PVVRfQlJFQUtQQUQpICQoemlwX3Jvb3QpL0JSRUFLUEFECiBlbmRpZgoraWZkZWYgQk9BUkRfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRQorCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvSU1BR0VTCisJJChoaWRlKSBjcCAkKElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCkgJCh6aXBfcm9vdCkvSU1BR0VTLworZW5kaWYKIGlmZGVmIEJPQVJEX1BSRUJVSUxUX1ZFTkRPUklNQUdFCiAJJChoaWRlKSBta2RpciAtcCAkKHppcF9yb290KS9JTUFHRVMKIAkkKGhpZGUpIGNwICQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkgJCh6aXBfcm9vdCkvSU1BR0VTLwpAQCAtNjE2NCw2ICs2ODA4LDE0IEBACiAJJChoaWRlKSBta2RpciAtcCAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMKIAkkKGhpZGUpIGNwICQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUy8KIGVuZGlmICMgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCitpZmRlZiBCVUlMVF9LRVJORUxfMTZLX1RBUkdFVAorCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTCisJJChoaWRlKSBjcCAkKEJVSUxUX0tFUk5FTF8xNktfVEFSR0VUKSAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMvCitlbmRpZiAjIEJVSUxUX0tFUk5FTF8xNktfVEFSR0VUCitpZmRlZiBCVUlMVF9SQU1ESVNLXzE2S19UQVJHRVQKKwkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUworCSQoaGlkZSkgY3AgJChCVUlMVF9SQU1ESVNLXzE2S19UQVJHRVQpICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUy8KK2VuZGlmICMgQlVJTFRfUkFNRElTS18xNktfVEFSR0VUCiBpZmVxICgkKEJPQVJEX1VTRVNfUFZNRldJTUFHRSksdHJ1ZSkKIAkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUwogCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfUFZNRldJTUFHRV9UQVJHRVQpICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUy8KQEAgLTYxNzgsNyArNjgzMCw3IEBACiBpZm5lcSAoJChzdHJpcCAkKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCkpLCkKIAkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUwogCSQoaGlkZSkgJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksIFwKLQkgICAgJChmb3JlYWNoIGltYWdlLCQoQk9BUkRfQVZCXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0lNQUdFX0xJU1QpLGNwICQoaW1hZ2UpICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUy87KSkKKwkgICAgJChmb3JlYWNoIGltYWdlLCQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfSU1BR0VfTElTVCksY3AgJChpbWFnZSkgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTLzspKQogZW5kaWYgIyBCT0FSRF9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QKIAlAIyBUaGUgcmFkaW8gaW1hZ2VzIGluIEJPQVJEX1BBQ0tfUkFESU9JTUFHRVMgd2lsbCBiZSBhZGRpdGlvbmFsbHkgY29waWVkIGZyb20gUkFESU8vIGludG8KIAlAIyBJTUFHRVMvLCB3aGljaCB0aGVuIHdpbGwgYmUgYWRkZWQgaW50byA8cHJvZHVjdD4taW1nLnppcC4gU3VjaCBpbWFnZXMgbXVzdCBiZSBsaXN0ZWQgaW4KQEAgLTYxODgsMjcgKzY4NDAsMzUgQEAKIAlAIyBSdW4gZnNfY29uZmlnIG9uIGFsbCB0aGUgc3lzdGVtLCB2ZW5kb3IsIGJvb3QgcmFtZGlzaywKIAlAIyBhbmQgcmVjb3ZlcnkgcmFtZGlzayBmaWxlcyBpbiB0aGUgemlwLCBhbmQgc2F2ZSB0aGUgb3V0cHV0CiBpZmRlZiBCVUlMRElOR19TWVNURU1fSU1BR0UKKwkkKGhpZGUpICQoY2FsbCBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAsJChCVUlMVF9TWVNURU1JTUFHRSksJCh6aXBfcm9vdCkvSU1BR0VTLHN5c3RlbSkKIAkkKGhpZGUpICQoY2FsbCBmc19jb25maWcsJCh6aXBfcm9vdCkvU1lTVEVNLHN5c3RlbS8pID4gJCh6aXBfcm9vdCkvTUVUQS9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCiBpZmRlZiBCVUlMRElOR19WRU5ET1JfSU1BR0UKKwkkKGhpZGUpICQoY2FsbCBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAsJChCVUlMVF9WRU5ET1JJTUFHRV9UQVJHRVQpLCQoemlwX3Jvb3QpL0lNQUdFUyx2ZW5kb3IpCiAJJChoaWRlKSAkKGNhbGwgZnNfY29uZmlnLCQoemlwX3Jvb3QpL1ZFTkRPUix2ZW5kb3IvKSA+ICQoemlwX3Jvb3QpL01FVEEvdmVuZG9yX2ZpbGVzeXN0ZW1fY29uZmlnLnR4dAogZW5kaWYKIGlmZGVmIEJVSUxESU5HX1BST0RVQ1RfSU1BR0UKKwkkKGhpZGUpICQoY2FsbCBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAsJChCVUlMVF9QUk9EVUNUSU1BR0VfVEFSR0VUKSwkKHppcF9yb290KS9JTUFHRVMscHJvZHVjdCkKIAkkKGhpZGUpICQoY2FsbCBmc19jb25maWcsJCh6aXBfcm9vdCkvUFJPRFVDVCxwcm9kdWN0LykgPiAkKHppcF9yb290KS9NRVRBL3Byb2R1Y3RfZmlsZXN5c3RlbV9jb25maWcudHh0CiBlbmRpZgogaWZkZWYgQlVJTERJTkdfU1lTVEVNX0VYVF9JTUFHRQorCSQoaGlkZSkgJChjYWxsIGNvcHktaW1hZ2UtYW5kLWdlbmVyYXRlLW1hcCwkKEJVSUxUX1NZU1RFTV9FWFRJTUFHRV9UQVJHRVQpLCQoemlwX3Jvb3QpL0lNQUdFUyxzeXN0ZW1fZXh0KQogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9TWVNURU1fRVhULHN5c3RlbV9leHQvKSA+ICQoemlwX3Jvb3QpL01FVEEvc3lzdGVtX2V4dF9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCiBpZmRlZiBCVUlMRElOR19PRE1fSU1BR0UKKwkkKGhpZGUpICQoY2FsbCBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAsJChCVUlMVF9PRE1JTUFHRV9UQVJHRVQpLCQoemlwX3Jvb3QpL0lNQUdFUyxvZG0pCiAJJChoaWRlKSAkKGNhbGwgZnNfY29uZmlnLCQoemlwX3Jvb3QpL09ETSxvZG0vKSA+ICQoemlwX3Jvb3QpL01FVEEvb2RtX2ZpbGVzeXN0ZW1fY29uZmlnLnR4dAogZW5kaWYKIGlmZGVmIEJVSUxESU5HX1ZFTkRPUl9ETEtNX0lNQUdFCisJJChoaWRlKSQoY2FsbCBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAsJChCVUlMVF9WRU5ET1JfRExLTUlNQUdFX1RBUkdFVCksJCh6aXBfcm9vdCkvSU1BR0VTLHZlbmRvcl9kbGttKQogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9WRU5ET1JfRExLTSx2ZW5kb3JfZGxrbS8pID4gJCh6aXBfcm9vdCkvTUVUQS92ZW5kb3JfZGxrbV9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCiBpZmRlZiBCVUlMRElOR19PRE1fRExLTV9JTUFHRQorCSQoaGlkZSkgJChjYWxsIGNvcHktaW1hZ2UtYW5kLWdlbmVyYXRlLW1hcCwkKEJVSUxUX09ETV9ETEtNSU1BR0VfVEFSR0VUKSwkKHppcF9yb290KS9JTUFHRVMsb2RtX2Rsa20pCiAJJChoaWRlKSAkKGNhbGwgZnNfY29uZmlnLCQoemlwX3Jvb3QpL09ETV9ETEtNLG9kbV9kbGttLykgPiAkKHppcF9yb290KS9NRVRBL29kbV9kbGttX2ZpbGVzeXN0ZW1fY29uZmlnLnR4dAogZW5kaWYKIGlmZGVmIEJVSUxESU5HX1NZU1RFTV9ETEtNX0lNQUdFCisJJChoaWRlKSAkKGNhbGwgY29weS1pbWFnZS1hbmQtZ2VuZXJhdGUtbWFwLCQoQlVJTFRfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpLCQoemlwX3Jvb3QpL0lNQUdFUyxzeXN0ZW1fZGxrbSkKIAkkKGhpZGUpICQoY2FsbCBmc19jb25maWcsJCh6aXBfcm9vdCkvU1lTVEVNX0RMS00sc3lzdGVtX2Rsa20vKSA+ICQoemlwX3Jvb3QpL01FVEEvc3lzdGVtX2Rsa21fZmlsZXN5c3RlbV9jb25maWcudHh0CiBlbmRpZgogCUAjIFJPT1QgYWx3YXlzIGNvbnRhaW5zIHRoZSBmaWxlcyBmb3IgdGhlIHJvb3QgdW5kZXIgbm9ybWFsIGJvb3QuCkBAIC02MjMwLDYgKzY4OTAsNyBAQAogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9SRUNPVkVSWS9SQU1ESVNLLCkgPiAkKHppcF9yb290KS9NRVRBL3JlY292ZXJ5X2ZpbGVzeXN0ZW1fY29uZmlnLnR4dAogZW5kaWYKIGlmZGVmIEJVSUxESU5HX1NZU1RFTV9PVEhFUl9JTUFHRQorCSQoaGlkZSkgJChjYWxsIGNvcHktaW1hZ2UtYW5kLWdlbmVyYXRlLW1hcCwkKEJVSUxUX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKSwkKHppcF9yb290KS9JTUFHRVMpCiAJJChoaWRlKSAkKGNhbGwgZnNfY29uZmlnLCQoemlwX3Jvb3QpL1NZU1RFTV9PVEhFUixzeXN0ZW0vKSA+ICQoemlwX3Jvb3QpL01FVEEvc3lzdGVtX290aGVyX2ZpbGVzeXN0ZW1fY29uZmlnLnR4dAogZW5kaWYKIAlAIyBNZXRhZGF0YSBmb3IgY29tcGF0aWJpbGl0eSB2ZXJpZmljYXRpb24uCkBAIC02MjUxLDEzICs2OTEyLDE5IEBACiBlbmRpZgogCUAjIFppcCBldmVyeXRoaW5nIHVwLCBwcmVzZXJ2aW5nIHN5bWxpbmtzIGFuZCBwbGFjaW5nIE1FVEEvIGZpbGVzIGZpcnN0IHRvCiAJQCMgaGVscCBlYXJseSB2YWxpZGF0aW9uIG9mIHRoZSAuemlwIGZpbGUgd2hpbGUgdXBsb2FkaW5nIGl0LgotCSQoaGlkZSkgZmluZCAkKHppcF9yb290KS9NRVRBIHwgc29ydCA+JEAubGlzdAotCSQoaGlkZSkgZmluZCAkKHppcF9yb290KSAtcGF0aCAkKHppcF9yb290KS9NRVRBIC1wcnVuZSAtbyAtcHJpbnQgfCBzb3J0ID4+JEAubGlzdAotCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoemlwX3Jvb3QpIC1yICRALmxpc3QKKwkkKGhpZGUpIGZpbmQgJCh6aXBfcm9vdCkvTUVUQSB8IHNvcnQgPiRACisJJChoaWRlKSBmaW5kICQoemlwX3Jvb3QpIC1wYXRoICQoemlwX3Jvb3QpL01FVEEgLXBydW5lIC1vIC1wcmludCB8IHNvcnQgPj4kQAorCiskKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKQorCUBlY2hvICJQYWNrYWdpbmcgdGFyZ2V0IGZpbGVzOiAkQCIKKwkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkQCAtQyAkKHppcF9yb290KSAtciAkQC5saXN0IC1zaGEyNTYKIAogLlBIT05ZOiB0YXJnZXQtZmlsZXMtcGFja2FnZQogdGFyZ2V0LWZpbGVzLXBhY2thZ2U6ICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpCiAKKy5QSE9OWTogdGFyZ2V0LWZpbGVzLWRpcgordGFyZ2V0LWZpbGVzLWRpcjogJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKQorCiAkKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSksKQogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKSwgJChJTlNUQUxMRURfUkFESU9JTUFHRV9UQVJHRVQpIFwKICAgICAgICAgICAgICQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKSBcCkBAIC02Mjg1LDE1ICs2OTUyLDE3IEBACiAgICAgICAgICAgICAkKExQTUFLRSkgXAogICAgICAgICAgICAgJChTRUxJTlVYX0ZDKSBcCiAgICAgICAgICAgICAkKElOU1RBTExFRF9NSVNDX0lORk9fVEFSR0VUKSBcCisgICAgICAgICAgICAkKElOU1RBTExFRF9GQVNUQk9PVF9JTkZPX1RBUkdFVCkgXAogICAgICAgICAgICAgJChBUEtDRVJUU19GSUxFKSBcCi0gICAgICAgICAgICAkKFNPT05HX0FQRVhfS0VZU19GSUxFKSBcCisgICAgICAgICAgICAkKEFQRVhfS0VZU19GSUxFKSBcCiAgICAgICAgICAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9mc19jb25maWcgXAorICAgICAgICAgICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWFwX2ZpbGVfZ2VuZXJhdG9yIFwKICAgICAgICAgICAgICQoQUREX0lNR19UT19UQVJHRVRfRklMRVMpIFwKICAgICAgICAgICAgICQoTUFLRV9SRUNPVkVSWV9QQVRDSCkgXAogICAgICAgICAgICAgJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKSBcCiAgICAgICAgICAgICAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpLCQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOikKIAotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCB0YXJnZXQtZmlsZXMtcGFja2FnZSwgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMtd2l0aC1maWxlbmFtZXRhZywgdGFyZ2V0LWZpbGVzLXBhY2thZ2UsICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIE5ESyBTeXNyb290IFBhY2thZ2UKQEAgLTYzMTgsMTggKzY5ODcsMTggQEAKIFBBVEg9JChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyk6JChkaXIgJChaSVAyWklQKSk6JCRQQVRIIFwKICAgICAkKE9UQV9GUk9NX1RBUkdFVF9GSUxFUykgXAogICAgICAgICAtLXZlcmJvc2UgXAotICAgICAgICAtLWV4dHJhY3RlZF9pbnB1dF90YXJnZXRfZmlsZXMgJChwYXRzdWJzdCAlLnppcCwlLCQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpKSBcCiAgICAgICAgIC0tcGF0aCAkKEhPU1RfT1VUKSBcCiAgICAgICAgICQoaWYgJChPRU1fT1RBX0NPTkZJRyksIC0tb2VtX3NldHRpbmdzICQoT0VNX09UQV9DT05GSUcpKSBcCisgICAgICAgICQoaWYgJChCT09UX1ZBUl9PVEFfQ09ORklHKSwgLS1ib290X3ZhcmlhYmxlX2ZpbGUgJChCT09UX1ZBUl9PVEFfQ09ORklHKSkgXAogICAgICAgICAkKDIpIFwKLSAgICAgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkgJCgxKQorICAgICAgICAkKHBhdHN1YnN0ICUuemlwLCUsJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkpICQoMSkKIGVuZGVmCiAKIHByb2R1Y3RfbmFtZSA6PSAkKFRBUkdFVF9QUk9EVUNUKQogaWZlcSAoJChUQVJHRVRfQlVJTERfVFlQRSksZGVidWcpCiAgIHByb2R1Y3RfbmFtZSA6PSAkKHByb2R1Y3RfbmFtZSlfZGVidWcKIGVuZGlmCi1uYW1lIDo9ICQocHJvZHVjdF9uYW1lKS1vdGEtJChGSUxFX05BTUVfVEFHKQorbmFtZSA6PSAkKHByb2R1Y3RfbmFtZSktb3RhCiAKIElOVEVSTkFMX09UQV9QQUNLQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS8kKG5hbWUpLnppcAogSU5URVJOQUxfT1RBX01FVEFEQVRBIDo9ICQoUFJPRFVDVF9PVVQpL290YV9tZXRhZGF0YQpAQCAtNjMzOCw3ICs3MDA3LDcgQEAKIAogJChJTlRFUk5BTF9PVEFfUEFDS0FHRV9UQVJHRVQpOiBLRVlfQ0VSVF9QQUlSIDo9ICQoREVGQVVMVF9LRVlfQ0VSVF9QQUlSKQogJChJTlRFUk5BTF9PVEFfUEFDS0FHRV9UQVJHRVQpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoSU5URVJOQUxfT1RBX01FVEFEQVRBKQotJChJTlRFUk5BTF9PVEFfUEFDS0FHRV9UQVJHRVQpOiAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKSAkKE9UQV9GUk9NX1RBUkdFVF9GSUxFUykgJChJTlRFUk5BTF9PVEFUT09MU19GSUxFUykKKyQoSU5URVJOQUxfT1RBX1BBQ0tBR0VfVEFSR0VUKTogJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKSAkKE9UQV9GUk9NX1RBUkdFVF9GSUxFUykgJChJTlRFUk5BTF9PVEFUT09MU19GSUxFUykKIAlAZWNobyAiUGFja2FnZSBPVEE6ICRAIgogCSQoY2FsbCBidWlsZC1vdGEtcGFja2FnZS10YXJnZXQsJEAsLWsgJChLRVlfQ0VSVF9QQUlSKSAtLW91dHB1dF9tZXRhZGF0YV9wYXRoICQoSU5URVJOQUxfT1RBX01FVEFEQVRBKSkKIApAQCAtNjM0OSw3ICs3MDE4LDcgQEAKIG90YXBhY2thZ2U6ICQoSU5URVJOQUxfT1RBX1BBQ0tBR0VfVEFSR0VUKQogCiBpZmVxICgkKEJPQVJEX0JVSUxEX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OU19PVEFfUEFDS0FHRSksdHJ1ZSkKLW5hbWUgOj0gJChwcm9kdWN0X25hbWUpLW90YS1yZXRyb2ZpdC0kKEZJTEVfTkFNRV9UQUcpCituYW1lIDo9ICQocHJvZHVjdF9uYW1lKS1vdGEtcmV0cm9maXQKIAogSU5URVJOQUxfT1RBX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OU19QQUNLQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS8kKG5hbWUpLnppcAogJChJTlRFUk5BTF9PVEFfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TX1BBQ0tBR0VfVEFSR0VUKTogS0VZX0NFUlRfUEFJUiA6PSAkKERFRkFVTFRfS0VZX0NFUlRfUEFJUikKQEAgLTYzNzAsMTEgKzcwMzksMTEgQEAKIGVuZGlmICMgQk9BUkRfQlVJTERfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TX09UQV9QQUNLQUdFCiAKIGlmbmVxICgkKEJPQVJEX1BBUlRJQUxfT1RBX1VQREFURV9QQVJUSVRJT05TX0xJU1QpLCkKLW5hbWUgOj0gJChwcm9kdWN0X25hbWUpLXBhcnRpYWwtb3RhLSQoRklMRV9OQU1FX1RBRykKK25hbWUgOj0gJChwcm9kdWN0X25hbWUpLXBhcnRpYWwtb3RhCiAKIElOVEVSTkFMX09UQV9QQVJUSUFMX1BBQ0tBR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpLyQobmFtZSkuemlwCiAkKElOVEVSTkFMX09UQV9QQVJUSUFMX1BBQ0tBR0VfVEFSR0VUKTogS0VZX0NFUlRfUEFJUiA6PSAkKERFRkFVTFRfS0VZX0NFUlRfUEFJUikKLSQoSU5URVJOQUxfT1RBX1BBUlRJQUxfUEFDS0FHRV9UQVJHRVQpOiAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKSAkKE9UQV9GUk9NX1RBUkdFVF9GSUxFUykgJChJTlRFUk5BTF9PVEFUT09MU19GSUxFUykKKyQoSU5URVJOQUxfT1RBX1BBUlRJQUxfUEFDS0FHRV9UQVJHRVQpOiAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpICQoT1RBX0ZST01fVEFSR0VUX0ZJTEVTKSAkKElOVEVSTkFMX09UQVRPT0xTX0ZJTEVTKQogCUBlY2hvICJQYWNrYWdlIHBhcnRpYWwgT1RBOiAkQCIKIAkkKGNhbGwgYnVpbGQtb3RhLXBhY2thZ2UtdGFyZ2V0LCRALC1rICQoS0VZX0NFUlRfUEFJUikgLS1wYXJ0aWFsICIkKEJPQVJEX1BBUlRJQUxfT1RBX1VQREFURV9QQVJUSVRJT05TX0xJU1QpIikKIApAQCAtNjQzOCwxOCArNzEwNywxOSBAQAogCiBlbmRpZgogCi0kKERFWFBSRU9QVF9DT05GSUdfWklQKTogJChTT09OR19aSVApCi0JJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZwotCiskKERFWFBSRU9QVF9DT05GSUdfWklQKTogUFJJVkFURV9ERVhQUkVPUFRfQ09ORklHX1pJUF9QQVJBTVMgOj0KIGlmZXEgKCwkKFRBUkdFVF9CVUlMRF9VTkJVTkRMRUQpKQogaWZuZXEgKCwkKERFWF9QUkVPUFRfQ09ORklHX0ZPUl9NQUtFKSkKLQkkKGhpZGUpIGNwICQoREVYX1BSRU9QVF9DT05GSUdfRk9SX01BS0UpICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcKKyQoREVYUFJFT1BUX0NPTkZJR19aSVApOiBQUklWQVRFX0RFWFBSRU9QVF9DT05GSUdfWklQX1BBUkFNUyArPSAtZSAkKG5vdGRpciAkKERFWF9QUkVPUFRfQ09ORklHX0ZPUl9NQUtFKSkgLWYgJChERVhfUFJFT1BUX0NPTkZJR19GT1JfTUFLRSkKIGVuZGlmCiBpZm5lcSAoLCQoREVYX1BSRU9QVF9TT09OR19DT05GSUdfRk9SX01BS0UpKQotCSQoaGlkZSkgY3AgJChERVhfUFJFT1BUX1NPT05HX0NPTkZJR19GT1JfTUFLRSkgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZworJChERVhQUkVPUFRfQ09ORklHX1pJUCk6IFBSSVZBVEVfREVYUFJFT1BUX0NPTkZJR19aSVBfUEFSQU1TICs9IC1lICQobm90ZGlyICQoREVYX1BSRU9QVF9TT09OR19DT05GSUdfRk9SX01BS0UpKSAtZiAkKERFWF9QUkVPUFRfU09PTkdfQ09ORklHX0ZPUl9NQUtFKQogZW5kaWYKIGVuZGlmICMhVEFSR0VUX0JVSUxEX1VOQlVORExFRAotCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcgLUQgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZworCiskKERFWFBSRU9QVF9DT05GSUdfWklQKTogJChTT09OR19aSVApCisJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZworCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcgLUQgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZyAkKFBSSVZBVEVfREVYUFJFT1BUX0NPTkZJR19aSVBfUEFSQU1TKQogCiAuUEhPTlk6IGRleHByZW9wdF9jb25maWdfemlwCiBkZXhwcmVvcHRfY29uZmlnX3ppcDogJChERVhQUkVPUFRfQ09ORklHX1pJUCkKQEAgLTY0NzAsOSArNzE0MCw5IEBACiBlbmRpZgogCiAjIFRoZSBwYXRoIHRvIHRoZSB6aXAgZmlsZSBjb250YWluaW5nIGJpbmFyaWVzIHdpdGggc3ltYm9scy4KLVNZTUJPTFNfWklQIDo9ICQoUFJPRFVDVF9PVVQpLyQobmFtZSktc3ltYm9scy0kKEZJTEVfTkFNRV9UQUcpLnppcAorU1lNQk9MU19aSVAgOj0gJChQUk9EVUNUX09VVCkvJChuYW1lKS1zeW1ib2xzLnppcAogIyBUaGUgcGF0aCB0byBhIGZpbGUgY29udGFpbmluZyBtYXBwaW5ncyBmcm9tIGVsZiBJRHMgdG8gZmlsZW5hbWVzLgotU1lNQk9MU19NQVBQSU5HIDo9ICQoUFJPRFVDVF9PVVQpLyQobmFtZSktc3ltYm9scy1tYXBwaW5nLSQoRklMRV9OQU1FX1RBRykudGV4dHByb3RvCitTWU1CT0xTX01BUFBJTkcgOj0gJChQUk9EVUNUX09VVCkvJChuYW1lKS1zeW1ib2xzLW1hcHBpbmcudGV4dHByb3RvCiAuS0FUSV9SRUFET05MWSA6PSBTWU1CT0xTX1pJUCBTWU1CT0xTX01BUFBJTkcKICMgRm9yIGFwcHNfb25seSBidWlsZCB3ZSdsbCBlc3RhYmxpc2ggdGhlIGRlcGVuZGVuY3kgbGF0ZXIgaW4gYnVpbGQvbWFrZS9jb3JlL21haW4ubWsuCiBpZmVxICgsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKQEAgLTY1MjksNyArNzE5OSw3IEBACiBpZmVxICh0cnVlLCQoQ0xBTkdfQ09WRVJBR0UpKQogICBMTFZNX1BST0ZEQVRBIDo9ICQoTExWTV9QUkVCVUlMVFNfQkFTRSkvbGludXgteDg2LyQoTExWTV9QUkVCVUlMVFNfVkVSU0lPTikvYmluL2xsdm0tcHJvZmRhdGEKICAgTExWTV9DT1YgOj0gJChMTFZNX1BSRUJVSUxUU19CQVNFKS9saW51eC14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS9iaW4vbGx2bS1jb3YKLSAgTElCQ1hYIDo9ICQoTExWTV9QUkVCVUlMVFNfQkFTRSkvbGludXgteDg2LyQoTExWTV9QUkVCVUlMVFNfVkVSU0lPTikvbGliL3g4Nl82NC11bmtub3duLWxpbnV4LWdudS9saWJjKysuc28uMQorICBMSUJDWFggOj0gJChMTFZNX1BSRUJVSUxUU19CQVNFKS9saW51eC14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS9saWIveDg2XzY0LXVua25vd24tbGludXgtZ251L2xpYmMrKy5zbwogICAjIFVzZSBsbHZtLXByb2ZkYXRhLnppcCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB0cmFkZWZlZCBjb2RlLgogICBMTFZNX0NPVkVSQUdFX1RPT0xTX1pJUCA6PSAkKFBST0RVQ1RfT1VUKS9sbHZtLXByb2ZkYXRhLnppcAogCkBAIC02NTQ3LDcgKzcyMTcsNyBAQAogaWZlcSAoJChUQVJHRVRfQlVJTERfVFlQRSksZGVidWcpCiAgIG5hbWUgOj0gJChuYW1lKV9kZWJ1ZwogZW5kaWYKLW5hbWUgOj0gJChuYW1lKS1hcHBzLSQoRklMRV9OQU1FX1RBRykKK25hbWUgOj0gJChuYW1lKS1hcHBzCiAKIEFQUFNfWklQIDo9ICQoUFJPRFVDVF9PVVQpLyQobmFtZSkuemlwCiAkKEFQUFNfWklQKTogJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpCkBAIC02NTg2LDYgKzcyNTYsMTQgQEAKIGlmZXEgKCwkKFRBUkdFVF9CVUlMRF9VTkJVTkRMRUQpKQogICAkKEpBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwpOiAkKElOVEVSTkFMX0FMTElNQUdFU19GSUxFUykKIGVuZGlmCisKKyMgVGhpcyBpcyBub3QgaWRlYWwsIGJ1dCBpdCBpcyBkaWZmaWN1bHQgdG8gY29ycmVjdGx5IGZpZ3VyZSBvdXQgdGhlIGFjdHVhbCBqYWNvY28gcmVwb3J0CisjIGphcnMgd2UgbmVlZCB0byBhZGQgaGVyZSBhcyBkZXBlbmRlbmNpZXMsIHNvIHdlIGFkZCB0aGUgZGV2aWNlLXRlc3RzIGFzIGEgZGVwZW5kZW5jeSB3aGVuCisjIHRoZSBlbnYgdmFyaWFibGUgaXMgc2V0IGFuZCB0aGlzIHNob3VsZCBndWFyYW50ZWUgdGhhYXQgYWxsIHRoZSBqYWNvY28gcmVwb3J0IGphcnMgYXJlIHJlYWR5CisjIHdoZW4gd2UgcGFja2FnZSB0aGUgZmluYWwgcmVwb3J0IGphciBoZXJlLgoraWZlcSAoJChKQUNPQ09fUEFDS0FHSU5HX0lOQ0xVREVfREVWSUNFX1RFU1RTKSx0cnVlKQorICAkKEpBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwpOiAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkZJTEVTKQorZW5kaWYKIGVuZGlmICMgRU1NQV9JTlNUUlVNRU5UPXRydWUKIAogCkBAIC02NTk3LDI5ICs3Mjc1LDM0IEBACiAjIGZpbmRpbmcgdGhlIGFwcHJvcHJpYXRlIGRpY3Rpb25hcnkgdG8gZGVvYmZ1c2NhdGUgYSBzdGFjayB0cmFjZSBmcmFtZS4KICMKIAotIyBUaGUgcGF0aCB0byB0aGUgemlwIGZpbGUgY29udGFpbmluZyBwcm9ndWFyZCBkaWN0aW9uYXJpZXMuCi1QUk9HVUFSRF9ESUNUX1pJUCA6PSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9QUk9EVUNUKS1wcm9ndWFyZC1kaWN0LSQoRklMRV9OQU1FX1RBRykuemlwCi0jIFRoZSBwYXRoIHRvIHRoZSB6aXAgZmlsZSBjb250YWluaW5nIG1hcHBpbmdzIGZyb20gZGljdGlvbmFyeSBoYXNoZXMgdG8gZmlsZW5hbWVzLgotUFJPR1VBUkRfRElDVF9NQVBQSU5HIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX1BST0RVQ1QpLXByb2d1YXJkLWRpY3QtbWFwcGluZy0kKEZJTEVfTkFNRV9UQUcpLnRleHRwcm90bwotLktBVElfUkVBRE9OTFkgOj0gUFJPR1VBUkRfRElDVF9aSVAgUFJPR1VBUkRfRElDVF9NQVBQSU5HCi0jIEZvciBhcHBzX29ubHkgYnVpbGQgd2UnbGwgZXN0YWJsaXNoIHRoZSBkZXBlbmRlbmN5IGxhdGVyIGluIGJ1aWxkL21ha2UvY29yZS9tYWluLm1rLgogaWZlcSAoLCQoVEFSR0VUX0JVSUxEX1VOQlVORExFRCkpCi0kKFBST0dVQVJEX0RJQ1RfWklQKTogJChJTlRFUk5BTF9BTExJTUFHRVNfRklMRVMpICQodXBkYXRlcl9kZXApCisgIF9wcm9ndWFyZF9kaWN0X3ppcF9tb2R1bGVzIDo9ICQoY2FsbCBwcm9kdWN0LWluc3RhbGxlZC1tb2R1bGVzLCQoSU5URVJOQUxfUFJPRFVDVCkpCitlbHNlCisgIF9wcm9ndWFyZF9kaWN0X3ppcF9tb2R1bGVzIDo9ICQodW5idW5kbGVkX2J1aWxkX21vZHVsZXMpCiBlbmRpZgotJChQUk9HVUFSRF9ESUNUX1pJUCk6IFBSSVZBVEVfUEFDS0FHSU5HX0RJUiA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxwcm9ndWFyZF9kaWN0aW9uYXJ5KQotJChQUk9HVUFSRF9ESUNUX1pJUCk6IFBSSVZBVEVfTUFQUElOR19QQUNLQUdJTkdfRElSIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHByb2d1YXJkX2RpY3Rpb25hcnlfbWFwcGluZykKLSQoUFJPR1VBUkRfRElDVF9aSVApOiBQUklWQVRFX0xJU1RfRklMRSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxwcm9ndWFyZF9kaWN0aW9uYXJ5X2ZpbGVsaXN0KS9maWxlbGlzdAotJChQUk9HVUFSRF9ESUNUX1pJUCk6ICQoU09PTkdfWklQKSAkKFNZTUJPTFNfTUFQKQorCisjIFRoZSBwYXRoIHRvIHRoZSB6aXAgZmlsZSBjb250YWluaW5nIHByb2d1YXJkIGRpY3Rpb25hcmllcy4KK1BST0dVQVJEX0RJQ1RfWklQIDo9JD0gJChQUk9EVUNUX09VVCkvJChUQVJHRVRfUFJPRFVDVCktcHJvZ3VhcmQtZGljdC56aXAKKyQoUFJPR1VBUkRfRElDVF9aSVApOiBQUklWQVRFX1NPT05HX1pJUF9BUkdVTUVOVFMgOj0gJChmb3JlYWNoIG0sJChfcHJvZ3VhcmRfZGljdF96aXBfbW9kdWxlcyksJChBTExfTU9EVUxFUy4kKG0pLlBST0dVQVJEX0RJQ1RJT05BUllfU09PTkdfWklQX0FSR1VNRU5UUykpCiskKFBST0dVQVJEX0RJQ1RfWklQKTogJChTT09OR19aSVApICQoZm9yZWFjaCBtLCQoX3Byb2d1YXJkX2RpY3RfemlwX21vZHVsZXMpLCQoQUxMX01PRFVMRVMuJChtKS5QUk9HVUFSRF9ESUNUSU9OQVJZX0ZJTEVTKSkKIAlAZWNobyAiUGFja2FnaW5nIFByb2d1YXJkIG9iZnVzY2F0aW9uIGRpY3Rpb25hcnkgZmlsZXMuIgotCXJtIC1yZiAkQCAkKFBSSVZBVEVfTElTVF9GSUxFKQotCW1rZGlyIC1wICQoUFJJVkFURV9QQUNLQUdJTkdfRElSKSAkKFBSSVZBVEVfTUFQUElOR19QQUNLQUdJTkdfRElSKSAkKGRpciAkKFBSSVZBVEVfTElTVF9GSUxFKSkKLQkjIFppcCBhbGwgb2YgdGhlIGZpbGVzIGluIHRoZSBwcm9ndWFyZCBkaWN0aW9uYXJ5IGRpcmVjdG9yeS4KLQkkKFNPT05HX1pJUCkgLS1pZ25vcmVfbWlzc2luZ19maWxlcyAtZCAtbyAkQCAtQyAkKFBSSVZBVEVfUEFDS0FHSU5HX0RJUikgLUQgJChQUklWQVRFX1BBQ0tBR0lOR19ESVIpCi0JIyBGaW5kIGFsbCBvZiB0aGUgZmlsZXMgaW4gdGhlIHByb2d1YXJkIGRpY3Rpb25hcnkgbWFwcGluZyBkaXJlY3RvcnkgYW5kIG1lcmdlIHRoZW0gaW50byB0aGUgbWFwcGluZyB0ZXh0cHJvdG8uCi0JIyBTdHJpcCB0aGUgUFJJVkFURV9QQUNLQUdJTkdfRElSIG9mZiB0aGUgZmlsZW5hbWVzIHRvIG1hdGNoIHNvb25nX3ppcCdzIC1DIGFyZ3VtZW50LgotCSQoaGlkZSkgZmluZCAtTCAkKFBSSVZBVEVfTUFQUElOR19QQUNLQUdJTkdfRElSKSAtdHlwZSBmIHwgc29ydCA+JChQUklWQVRFX0xJU1RfRklMRSkKLQkkKFNZTUJPTFNfTUFQKSAtbWVyZ2UgJChQUk9HVUFSRF9ESUNUX01BUFBJTkcpIC1zdHJpcF9wcmVmaXggJChQUklWQVRFX1BBQ0tBR0lOR19ESVIpLyAtaWdub3JlX21pc3NpbmdfZmlsZXMgQCQoUFJJVkFURV9MSVNUX0ZJTEUpCi0kKFBST0dVQVJEX0RJQ1RfWklQKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKFBST0dVQVJEX0RJQ1RfTUFQUElORykKKwkjIFppcCBhbGwgb2YgdGhlIGZpbGVzIGluIFBST0dVQVJEX0RJQ1RJT05BUllfRklMRVMuCisJZWNobyAtbiA+ICRALnRtcGFyZ2xpc3QKKwkkKGZvcmVhY2ggYXJnLCQoUFJJVkFURV9TT09OR19aSVBfQVJHVU1FTlRTKSxwcmludGYgIiVzXG4iICIkKGFyZykiID4+ICRALnRtcGFyZ2xpc3QkKG5ld2xpbmUpKQorCSQoU09PTkdfWklQKSAtZCAtbyAkQCBAJEAudG1wYXJnbGlzdAorCXJtIC1mICRALnRtcGFyZ2xpc3QKKworIyBUaGUgcGF0aCB0byB0aGUgemlwIGZpbGUgY29udGFpbmluZyBtYXBwaW5ncyBmcm9tIGRpY3Rpb25hcnkgaGFzaGVzIHRvIGZpbGVuYW1lcy4KK1BST0dVQVJEX0RJQ1RfTUFQUElORyA6PSQ9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX1BST0RVQ1QpLXByb2d1YXJkLWRpY3QtbWFwcGluZy50ZXh0cHJvdG8KK19wcm9ndWFyZF9kaWN0X21hcHBpbmdfZmlsZXMgOj0gJChmb3JlYWNoIG0sJChfcHJvZ3VhcmRfZGljdF96aXBfbW9kdWxlcyksJChBTExfTU9EVUxFUy4kKG0pLlBST0dVQVJEX0RJQ1RJT05BUllfTUFQUElORykpCiskKFBST0dVQVJEX0RJQ1RfTUFQUElORyk6IFBSSVZBVEVfTUFQUElOR19GSUxFUyA6PSAkKF9wcm9ndWFyZF9kaWN0X21hcHBpbmdfZmlsZXMpCiskKFBST0dVQVJEX0RJQ1RfTUFQUElORyk6ICQoU1lNQk9MU19NQVApICQoX3Byb2d1YXJkX2RpY3RfbWFwcGluZ19maWxlcykKKwlAZWNobyAiUGFja2FnaW5nIFByb2d1YXJkIG9iZnVzY2F0aW9uIGRpY3Rpb25hcnkgbWFwcGluZyBmaWxlcy4iCisJIyBNZXJnZSBhbGwgdGhlIG1hcHBpbmcgZmlsZXMgdG9nZXRoZXIKKwllY2hvIC1uID4gJEAudG1wYXJnbGlzdAorCSQoZm9yZWFjaCBtZiwkKFBSSVZBVEVfTUFQUElOR19GSUxFUyksZWNobyAiJChtZikiID4+ICRALnRtcGFyZ2xpc3QkKG5ld2xpbmUpKQorCSQoU1lNQk9MU19NQVApIC1tZXJnZSAkKFBST0dVQVJEX0RJQ1RfTUFQUElORykgQCRALnRtcGFyZ2xpc3QKKwlybSAtZiAkQC50bXBhcmdsaXN0CiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKFBST0dVQVJEX0RJQ1RfWklQKSwpCiBpZmVxICgsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKQEAgLTY2MjksMzEgKzczMTIsMTkgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgQSB6aXAgb2YgUHJvZ3VhcmQgdXNhZ2UgZmlsZXMuCiAjCi1QUk9HVUFSRF9VU0FHRV9aSVAgOj0gJChQUk9EVUNUX09VVCkvJChUQVJHRVRfUFJPRFVDVCktcHJvZ3VhcmQtdXNhZ2UtJChGSUxFX05BTUVfVEFHKS56aXAKLSMgRm9yIGFwcHNfb25seSBidWlsZCB3ZSdsbCBlc3RhYmxpc2ggdGhlIGRlcGVuZGVuY3kgbGF0ZXIgaW4gYnVpbGQvbWFrZS9jb3JlL21haW4ubWsuCi1pZmVxICgsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKLSQoUFJPR1VBUkRfVVNBR0VfWklQKTogXAotICAgICQoSU5TVEFMTEVEX1NZU1RFTUlNQUdFX1RBUkdFVCkgXAotICAgICQoSU5TVEFMTEVEX1JBTURJU0tfVEFSR0VUKSBcCi0gICAgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAotICAgICQoSU5TVEFMTEVEX0lOSVRfQk9PVF9JTUFHRV9UQVJHRVQpIFwKLSAgICAkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCkgXAotICAgICQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkgXAotICAgICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpIFwKLSAgICAkKElOU1RBTExFRF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKSBcCi0gICAgJChJTlNUQUxMRURfT0RNSU1BR0VfVEFSR0VUKSBcCi0gICAgJChJTlNUQUxMRURfVkVORE9SX0RMS01JTUFHRV9UQVJHRVQpIFwKLSAgICAkKElOU1RBTExFRF9PRE1fRExLTUlNQUdFX1RBUkdFVCkgXAotICAgICQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUKSBcCi0gICAgJCh1cGRhdGVyX2RlcCkKLWVuZGlmCi0kKFBST0dVQVJEX1VTQUdFX1pJUCk6IFBSSVZBVEVfTElTVF9GSUxFIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHByb2d1YXJkX3VzYWdlLnppcCkvZmlsZWxpc3QKLSQoUFJPR1VBUkRfVVNBR0VfWklQKTogUFJJVkFURV9QQUNLQUdJTkdfRElSIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHByb2d1YXJkX3VzYWdlKQotJChQUk9HVUFSRF9VU0FHRV9aSVApOiAkKE1FUkdFX1pJUFMpCitQUk9HVUFSRF9VU0FHRV9aSVAgOj0kPSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9QUk9EVUNUKS1wcm9ndWFyZC11c2FnZS56aXAKK19wcm9ndWFyZF91c2FnZV96aXBzIDo9ICQoZm9yZWFjaCBtLCQoX3Byb2d1YXJkX2RpY3RfemlwX21vZHVsZXMpLCQoQUxMX01PRFVMRVMuJChtKS5QUk9HVUFSRF9VU0FHRV9aSVApKQorJChQUk9HVUFSRF9VU0FHRV9aSVApOiBQUklWQVRFX1pJUFMgOj0gJChfcHJvZ3VhcmRfdXNhZ2VfemlwcykKKyQoUFJPR1VBUkRfVVNBR0VfWklQKTogJChNRVJHRV9aSVBTKSAkKF9wcm9ndWFyZF91c2FnZV96aXBzKQogCUBlY2hvICJQYWNrYWdpbmcgUHJvZ3VhcmQgdXNhZ2UgZmlsZXMuIgotCW1rZGlyIC1wICQoZGlyICRAKSAkKFBSSVZBVEVfUEFDS0FHSU5HX0RJUikgJChkaXIgJChQUklWQVRFX0xJU1RfRklMRSkpCi0JZmluZCAkKFBSSVZBVEVfUEFDS0FHSU5HX0RJUikgLW5hbWUgcHJvZ3VhcmRfdXNhZ2UuemlwID4gJChQUklWQVRFX0xJU1RfRklMRSkKLQkkKE1FUkdFX1pJUFMpICRAIEAkKFBSSVZBVEVfTElTVF9GSUxFKQorCWVjaG8gLW4gPiAkQC50bXBhcmdsaXN0CisJJChmb3JlYWNoIHosJChQUklWQVRFX1pJUFMpLGVjaG8gIiQoeikiID4+ICRALnRtcGFyZ2xpc3QkKG5ld2xpbmUpKQorCSQoTUVSR0VfWklQUykgJEAgQCRALnRtcGFyZ2xpc3QKKwlybSAtcmYgJEAudG1wYXJnbGlzdAorCitfcHJvZ3VhcmRfZGljdF9tYXBwaW5nX2ZpbGVzIDo9CitfcHJvZ3VhcmRfdXNhZ2VfemlwcyA6PQorX3Byb2d1YXJkX2RpY3RfemlwX21vZHVsZXMgOj0KIAogJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoUFJPR1VBUkRfVVNBR0VfWklQKSwpCiBpZmVxICgsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKQEAgLTY2OTcsNyArNzM2OCw3IEBACiAjIEZvciByZWFsIGRldmljZXMgYW5kIGZvciBkaXN0IGJ1aWxkcywgYnVpbGQgc3VwZXIgaW1hZ2UgZnJvbSB0YXJnZXQgZmlsZXMgdG8gYW4gaW50ZXJtZWRpYXRlIGRpcmVjdG9yeS4KIElOVEVSTkFMX1NVUEVSSU1BR0VfRElTVF9UQVJHRVQgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsc3VwZXIuaW1nKS9zdXBlci5pbWcKICQoSU5URVJOQUxfU1VQRVJJTUFHRV9ESVNUX1RBUkdFVCk6IGV4dHJhY3RlZF9pbnB1dF90YXJnZXRfZmlsZXMgOj0gJChwYXRzdWJzdCAlLnppcCwlLCQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpKQotJChJTlRFUk5BTF9TVVBFUklNQUdFX0RJU1RfVEFSR0VUKTogJChMUE1BS0UpICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpICQoQlVJTERfU1VQRVJfSU1BR0UpCiskKElOVEVSTkFMX1NVUEVSSU1BR0VfRElTVF9UQVJHRVQpOiAkKExQTUFLRSkgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKSAkKEJVSUxEX1NVUEVSX0lNQUdFKQogCSQoY2FsbCBwcmV0dHksIlRhcmdldCBzdXBlciBmcyBpbWFnZSBmcm9tIHRhcmdldCBmaWxlczogJEAiKQogCVBBVEg9JChkaXIgJChMUE1BS0UpKTokJFBBVEggXAogCSAgICAkKEJVSUxEX1NVUEVSX0lNQUdFKSAtdiAkKGV4dHJhY3RlZF9pbnB1dF90YXJnZXRfZmlsZXMpICRACkBAIC02ODA2LDcgKzc0NzcsNyBAQAogaWZlcSAoJChUQVJHRVRfQlVJTERfVFlQRSksZGVidWcpCiAgIG5hbWUgOj0gJChuYW1lKV9kZWJ1ZwogZW5kaWYKLW5hbWUgOj0gJChuYW1lKS1pbWctJChGSUxFX05BTUVfVEFHKQorbmFtZSA6PSAkKG5hbWUpLWltZwogCiBJTlRFUk5BTF9VUERBVEVfUEFDS0FHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvJChuYW1lKS56aXAKIApAQCAtNjgxNSw2ICs3NDg2LDcgQEAKIAlQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQoZGlyICQoWklQMlpJUCkpOiQkUEFUSCBcCiAJICAgICQoSU1HX0ZST01fVEFSR0VUX0ZJTEVTKSBcCiAJICAgICAgICAtLWFkZGl0aW9uYWwgSU1BR0VTL1ZlcmlmaWVkQm9vdFBhcmFtcy50ZXh0cHJvdG86VmVyaWZpZWRCb290UGFyYW1zLnRleHRwcm90byBcCisJICAgICAgICAtLWJ1aWxkX3N1cGVyX2ltYWdlICQoQlVJTERfU1VQRVJfSU1BR0UpIFwKIAkgICAgICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpICRACiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKElOVEVSTkFMX1VQREFURV9QQUNLQUdFX1RBUkdFVCksKQpAQCAtNjgyMiw3ICs3NDk0LDcgQEAKIAogLlBIT05ZOiB1cGRhdGVwYWNrYWdlCiB1cGRhdGVwYWNrYWdlOiAkKElOVEVSTkFMX1VQREFURV9QQUNLQUdFX1RBUkdFVCkKLSQoY2FsbCBkaXN0LWZvci1nb2Fscyx1cGRhdGVwYWNrYWdlLCQoSU5URVJOQUxfVVBEQVRFX1BBQ0tBR0VfVEFSR0VUKSkKKyQoY2FsbCBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnLHVwZGF0ZXBhY2thZ2UsJChJTlRFUk5BTF9VUERBVEVfUEFDS0FHRV9UQVJHRVQpKQogCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY5NDIsNiArNzYxNCwxMCBAQAogZHJvaWRjb3JlLXVuYnVuZGxlZDogJChRRU1VX1ZFUklGSUVEX0JPT1RfUEFSQU1TKQogCiBlbmRpZgorCisjIFByZXByb2Nlc3MgZmlsZXMgZm9yIGVtdWxhdG9yIGFuZCBzZGsuCistaW5jbHVkZSBkZXZlbG9wbWVudC9idWlsZC90b29scy9zZGstcHJlcHJvY2Vzcy1maWxlcy5taworCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRoZSBlbXVsYXRvciBwYWNrYWdlCiBpZmVxICgkKEJVSUxEX0VNVUxBVE9SKSx0cnVlKQpAQCAtNjk1MSw3ICs3NjI3LDcgQEAKICAgICAgICAgJChJTlNUQUxMRURfU1lTVEVNSU1BR0VfVEFSR0VUKSBcCiAgICAgICAgICQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKQogCi1uYW1lIDo9ICQoVEFSR0VUX1BST0RVQ1QpLWVtdWxhdG9yLSQoRklMRV9OQU1FX1RBRykKK25hbWUgOj0gJChUQVJHRVRfUFJPRFVDVCktZW11bGF0b3IKIAogSU5URVJOQUxfRU1VTEFUT1JfUEFDS0FHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvJChuYW1lKS56aXAKIApAQCAtNjk3OSw3ICs3NjU1LDcgQEAKIGlmbmVxICgkKEhPU1RfT1MpLGxpbnV4KQogICAkKGVycm9yIEJ1aWxkaW5nIHRoZSBtb25vbGl0aGljIFNESyBpcyBvbmx5IHN1cHBvcnRlZCBvbiBMaW51eCkKIGVuZGlmCi1zZGtfbmFtZSA6PSBhbmRyb2lkLXNka18kKEZJTEVfTkFNRV9UQUcpCitzZGtfbmFtZSA6PSBhbmRyb2lkLXNkawogSU5URVJOQUxfU0RLX0hPU1RfT1NfTkFNRSA6PSBsaW51eC0kKFNES19IT1NUX0FSQ0gpCiBzZGtfbmFtZSA6PSAkKHNka19uYW1lKV8kKElOVEVSTkFMX1NES19IT1NUX09TX05BTUUpCiAKQEAgLTcwMTQsNiArNzY5MCwyNCBAQAogc2RrX2F0cmVlX2ZpbGVzICs9ICQoYXRyZWVfZGlyKS9zZGsuYXRyZWUKIGVuZGlmCiAKK1NES19NRVRBREFUQV9ESVIgOj0kPSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxmcmFtZXdvcmstZG9jLXN0dWJzLW1ldGFkYXRhLCxDT01NT04pCitTREtfTUVUQURBVEFfRklMRVMgOj0kPSAkKGFkZHByZWZpeCAkKFNES19NRVRBREFUQV9ESVIpLyxcCisgICAgYWN0aXZpdHlfYWN0aW9ucy50eHQgXAorICAgIGJyb2FkY2FzdF9hY3Rpb25zLnR4dCBcCisgICAgY2F0ZWdvcmllcy50eHQgXAorICAgIGZlYXR1cmVzLnR4dCBcCisgICAgc2VydmljZV9hY3Rpb25zLnR4dCBcCisgICAgd2lkZ2V0cy50eHQpCitTREtfTUVUQURBVEEgOj0kPSAkKGZpcnN0d29yZCAkKFNES19NRVRBREFUQV9GSUxFUykpCiskKFNES19NRVRBREFUQSk6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChmaWx0ZXItb3V0ICQoU0RLX01FVEFEQVRBKSwkKFNES19NRVRBREFUQV9GSUxFUykpCiskKFNES19NRVRBREFUQSk6ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvUEFDS0FHSU5HL2ZyYW1ld29yay1kb2Mtc3R1YnMtbWV0YWRhdGEuemlwCisJcm0gLXJmICQoU0RLX01FVEFEQVRBX0RJUikKKwlta2RpciAtcCAkKFNES19NRVRBREFUQV9ESVIpCisJdW56aXAgLUREcW8gJDwgLWQgJChTREtfTUVUQURBVEFfRElSKQorCisuUEhPTlk6IGZyYW1ld29yay1kb2Mtc3R1YnMKK2ZyYW1ld29yay1kb2Mtc3R1YnM6ICQoU0RLX01FVEFEQVRBKQorCiBkZXBzIDo9IFwKIAkkKE9VVF9ET0NTKS9vZmZsaW5lLXNkay10aW1lc3RhbXAgXAogCSQoU0RLX01FVEFEQVRBX0ZJTEVTKSBcCkBAIC03MTYwLDExICs3ODU0LDM3IEBACiBoYWlrdS1ydXN0OiAkKFNPT05HX1JVU1RfRlVaWl9QQUNLQUdJTkdfQVJDSF9NT0RVTEVTKSAkKEFMTF9SVVNUX0ZVWlpfVEFSR0VUUykKICQoY2FsbCBkaXN0LWZvci1nb2FscyxoYWlrdS1ydXN0LCQoU09PTkdfUlVTVF9GVVpaX1BBQ0tBR0lOR19BUkNIX01PRFVMRVMpKQogJChjYWxsIGRpc3QtZm9yLWdvYWxzLGhhaWt1LXJ1c3QsJChQUk9EVUNUX09VVCkvbW9kdWxlLWluZm8uanNvbikKKy5QSE9OWTogaGFpa3UtcHJlc3VibWl0CitoYWlrdS1wcmVzdWJtaXQ6ICQoU09PTkdfUFJFU1VCTUlUX0ZVWlpfUEFDS0FHSU5HX0FSQ0hfTU9EVUxFUykgJChBTExfUFJFU1VCTUlUX0ZVWlpfVEFSR0VUUykKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxoYWlrdS1wcmVzdWJtaXQsJChTT09OR19QUkVTVUJNSVRfRlVaWl9QQUNLQUdJTkdfQVJDSF9NT0RVTEVTKSkKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBFeHRyYWN0IHBsYXRmb3JtIGZvbnRzIHVzZWQgaW4gTGF5b3V0bGliCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9sYXlvdXRsaWJfZm9udHMubWsKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xheW91dGxpYl9kYXRhLm1rCiAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVza3RvcCBwYWNrIGltYWdlIGhvb2suCitpZm5lcSAoLCQoc3RyaXAgJChQQUNLX0RFU0tUT1BfRklMRVNZU1RFTV9JTUFHRVMpKSkKK1BBQ0tfSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2FuZHJvaWQtZGVza3RvcF9pbWFnZS5iaW4KK1BBQ0tfSU1BR0VfU0NSSVBUIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3BhY2tfaW1hZ2UKK0lNQUdFUyA6PSAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSBcCisJJChJTlNUQUxMRURfU1VQRVJJTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9JTklUX0JPT1RfSU1BR0VfVEFSR0VUKSBcCisJJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9WQk1FVEFJTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCkKKworJChQQUNLX0lNQUdFX1RBUkdFVCk6ICQoSU1BR0VTKSAkKFBBQ0tfSU1BR0VfU0NSSVBUKQorCSQoUEFDS19JTUFHRV9TQ1JJUFQpIC0tb3V0X2RpciAkKFBST0RVQ1RfT1VUKSAtLW5vYXJjaGl2ZQorCitQQUNLRURfSU1BR0VfQVJDSElWRV9UQVJHRVQgOj0gJChQQUNLX0lNQUdFX1RBUkdFVCkuZ3oKKworJChQQUNLRURfSU1BR0VfQVJDSElWRV9UQVJHRVQpOiAkKFBBQ0tfSU1BR0VfVEFSR0VUKSB8ICQoR1pJUCkKKwkkKEdaSVApIC1mayAkKFBBQ0tfSU1BR0VfVEFSR0VUKQorCitkcm9pZGNvcmUtdW5idW5kbGVkOiAkKFBBQ0tFRF9JTUFHRV9BUkNISVZFX1RBUkdFVCkKKworZW5kaWYgIyBQQUNLX0RFU0tUT1BfRklMRVNZU1RFTV9JTUFHRVMKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBPUyBMaWNlbnNpbmcKZGlmZiAtLWdpdCBhL2NvcmUvT1dORVJTIGIvY29yZS9PV05FUlMKaW5kZXggZWIxZDVjMy4uMzVlYTgzZCAxMDA2NDQKLS0tIGEvY29yZS9PV05FUlMKKysrIGIvY29yZS9PV05FUlMKQEAgLTMsNSArMywxMSBAQAogcGVyLWZpbGUgcHJvZ3VhcmQqLmZsYWdzID0gamRkdWtlQGdvb2dsZS5jb20KIAogIyBGb3IgdmVyc2lvbiB1cGRhdGVzCi1wZXItZmlsZSB2ZXJzaW9uX2RlZmF1bHRzLm1rID0gYXNlYXRvbkBnb29nbGUuY29tLGx1Ym9taXJAZ29vZ2xlLmNvbSxwc2NvdmFubmVyQGdvb2dsZS5jb20sYmtoYWxpZmVAZ29vZ2xlLmNvbSxqYWlubmVAZ29vZ2xlLmNvbQorcGVyLWZpbGUgdmVyc2lvbl9kZWZhdWx0cy5tayA9IGFua3VyYmFrc2hpQGdvb2dsZS5jb20sYmtoYWxpZmVAZ29vZ2xlLmNvbSxqYWlubmVAZ29vZ2xlLmNvbSxsb2tlc2hnb2VsQGdvb2dsZS5jb20sbHVib21pckBnb29nbGUuY29tLHBzY292YW5uZXJAZ29vZ2xlLmNvbQorCisjIEZvciBzZGsgZXh0ZW5zaW9ucyB2ZXJzaW9uIHVwZGF0ZXMKK3Blci1maWxlIHZlcnNpb25fZGVmYXVsdHMubWsgPSBhbWhrQGdvb2dsZS5jb20sZ3VycHJlZXRnc0Bnb29nbGUuY29tLG1raG9raGxvdmFAZ29vZ2xlLmNvbSxyb2JlcnRvZ2lsQGdvb2dsZS5jb20KKworIyBGb3IgUmF2ZW53b29kIHRlc3QgY29uZmlncworcGVyLWZpbGUgcmF2ZW53b29kX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbCA9IGpzaGFya2V5QGdvb2dsZS5jb20sb21ha290b0Bnb29nbGUuY29tCiAKZGlmZiAtLWdpdCBhL2NvcmUvYWFwdDIubWsgYi9jb3JlL2FhcHQyLm1rCmluZGV4IDdiMTdkZjQuLjBlMjM0NzcgMTAwNjQ0Ci0tLSBhL2NvcmUvYWFwdDIubWsKKysrIGIvY29yZS9hYXB0Mi5tawpAQCAtNjgsNiArNjgsOCBAQAogIyBzdXBwb3J0IGZvciBpdC4KIG15X3N0YXRpY19saWJyYXJ5X3Jlc291cmNlcyA6PSAkKGZvcmVhY2ggbCwgJChjYWxsIHJldmVyc2UtbGlzdCwkKExPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUykgJChMT0NBTF9TVEFUSUNfSkFWQV9BQVJfTElCUkFSSUVTKSksXAogICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLCQobCksLENPTU1PTikvcGFja2FnZS1yZXMuYXBrKQorbXlfc3RhdGljX2xpYnJhcnlfdHJhbnNpdGl2ZV9yZXNvdXJjZV9wYWNrYWdlc19saXN0cyA6PSAkKGZvcmVhY2ggbCwgJChjYWxsIHJldmVyc2UtbGlzdCwkKExPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUykgJChMT0NBTF9TVEFUSUNfSkFWQV9BQVJfTElCUkFSSUVTKSksXAorICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLCQobCksLENPTU1PTikvdHJhbnNpdGl2ZS1yZXMtcGFja2FnZXMpCiBteV9zdGF0aWNfbGlicmFyeV9leHRyYV9wYWNrYWdlcyA6PSAkKGZvcmVhY2ggbCwgJChjYWxsIHJldmVyc2UtbGlzdCwkKExPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUykgJChMT0NBTF9TVEFUSUNfSkFWQV9BQVJfTElCUkFSSUVTKSksXAogICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLCQobCksLENPTU1PTikvZXh0cmFfcGFja2FnZXMpCiBteV9zaGFyZWRfbGlicmFyeV9yZXNvdXJjZXMgOj0gJChmb3JlYWNoIGwsICQoTE9DQUxfU0hBUkVEX0FORFJPSURfTElCUkFSSUVTKSxcCkBAIC05NSw2ICs5Nyw3IEBACiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9KQVZBX0dFTl9ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvYWFwdDIKICQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX1NSQ0pBUiA6PSAkKG15X3NyY2phcikKICQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX1NUQVRJQ19MSUJSQVJZX0VYVFJBX1BBQ0tBR0VTIDo9ICQobXlfc3RhdGljX2xpYnJhcnlfZXh0cmFfcGFja2FnZXMpCiskKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9TVEFUSUNfTElCUkFSWV9UUkFOU0lUSVZFX1JFU19QQUNLQUdFU19MSVNUUyA6PSAkKG15X3N0YXRpY19saWJyYXJ5X3RyYW5zaXRpdmVfcmVzb3VyY2VfcGFja2FnZXNfbGlzdHMpCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9BQVBUX0VYVFJBX1BBQ0tBR0VTIDo9ICQoYWFwdF9leHRyYV9wYWNrYWdlcykKICQobXlfcmVzX3BhY2thZ2UpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQobXlfc3JjamFyKSAkKGFhcHRfZXh0cmFfcGFja2FnZXMpCiAKQEAgLTExNyw3ICsxMjAsNyBAQAogJChteV9yZXNfcGFja2FnZSk6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgKz0gJChwcm9ndWFyZF9vcHRpb25zX2ZpbGUpCiBlbmRpZgogCi0kKG15X3Jlc19wYWNrYWdlKTogJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpICQobXlfc3RhdGljX2xpYnJhcnlfcmVzb3VyY2VzKSAkKG15X3NoYXJlZF9saWJyYXJ5X3Jlc291cmNlcykKKyQobXlfcmVzX3BhY2thZ2UpOiAkKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCkgJChteV9zdGF0aWNfbGlicmFyeV9yZXNvdXJjZXMpICQobXlfc3RhdGljX2xpYnJhcnlfdHJhbnNpdGl2ZV9yZXNvdXJjZV9wYWNrYWdlc19saXN0cykgJChteV9zaGFyZWRfbGlicmFyeV9yZXNvdXJjZXMpCiAkKG15X3Jlc19wYWNrYWdlKTogJChteV9mdWxsX2Fzc2V0X3BhdGhzKQogJChteV9yZXNfcGFja2FnZSk6ICQobXlfcmVzX3Jlc291cmNlc19mbGF0KSAkKG15X292ZXJsYXlfcmVzb3VyY2VzX2ZsYXQpIFwKICAgJChteV9yZXNvdXJjZXNfZmxhdGEpICQobXlfc3RhdGljX2xpYnJhcnlfcmVzb3VyY2VzKSAkKG15X3N0YXRpY19saWJyYXJ5X2V4dHJhX3BhY2thZ2VzKSBcCmRpZmYgLS1naXQgYS9jb3JlL2FuZHJvaWRfbWFuaWZlc3QubWsgYi9jb3JlL2FuZHJvaWRfbWFuaWZlc3QubWsKaW5kZXggZmY0OTI2Mi4uN2Y0NjkwMyAxMDA2NDQKLS0tIGEvY29yZS9hbmRyb2lkX21hbmlmZXN0Lm1rCisrKyBiL2NvcmUvYW5kcm9pZF9tYW5pZmVzdC5tawpAQCAtNTEsNiArNTEsOSBAQAogICAgICAgICBteV90YXJnZXRfc2RrX3ZlcnNpb24gOj0gJChteV90YXJnZXRfc2RrX3ZlcnNpb24pLiQkKGNhdCAkKEFQSV9GSU5HRVJQUklOVCkpCiAgICAgICAgIG15X21pbl9zZGtfdmVyc2lvbiA6PSAkKG15X21pbl9zZGtfdmVyc2lvbikuJCQoY2F0ICQoQVBJX0ZJTkdFUlBSSU5UKSkKICAgICAgICAgJChmaXhlZF9hbmRyb2lkX21hbmlmZXN0KTogJChBUElfRklOR0VSUFJJTlQpCisgICAgICBlbHNlIGlmZGVmIFVOQlVORExFRF9CVUlMRF9UQVJHRVRfU0RLX1dJVEhfREVTU0VSVF9TSEEKKyAgICAgICAgbXlfdGFyZ2V0X3Nka192ZXJzaW9uIDo9ICQoVU5CVU5ETEVEX0JVSUxEX1RBUkdFVF9TREtfV0lUSF9ERVNTRVJUX1NIQSkKKyAgICAgICAgbXlfbWluX3Nka192ZXJzaW9uIDo9ICQoVU5CVU5ETEVEX0JVSUxEX1RBUkdFVF9TREtfV0lUSF9ERVNTRVJUX1NIQSkKICAgICAgIGVuZGlmCiAgICAgZW5kaWYKICAgZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvYW5kcm9pZF9zb29uZ19jb25maWdfdmFycy5tayBiL2NvcmUvYW5kcm9pZF9zb29uZ19jb25maWdfdmFycy5tawppbmRleCBiNWY3YjIyLi5mMmZmMjg2IDEwMDY0NAotLS0gYS9jb3JlL2FuZHJvaWRfc29vbmdfY29uZmlnX3ZhcnMubWsKKysrIGIvY29yZS9hbmRyb2lkX3Nvb25nX2NvbmZpZ192YXJzLm1rCkBAIC0yNiwxMDEgKzI2LDI3IEBACiAKICMgQWRkIHZhcmlhYmxlcyB0byB0aGUgbmFtZXNwYWNlIGJlbG93OgogCi0kKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxUQVJHRVRfRFlOQU1JQ182NF8zMl9NRURJQVNFUlZFUikKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELEJPQVJEX1VTRVNfT0RNSU1BR0UpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09ULCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSkKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELENIRUNLX0RFVl9UWVBFX1ZJT0xBVElPTlMpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsUExBVEZPUk1fU0VQT0xJQ1lfQ09NUEFUX1ZFUlNJT05TKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsUFJPRFVDVF9JTlNUQUxMX0RFQlVHX1BPTElDWV9UT19TWVNURU1fRVhUKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0RZTkFNSUNfNjRfMzJfRFJNU0VSVkVSKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0VOQUJMRV9NRURJQURSTV82NCkKLSQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELElTX1RBUkdFVF9NSVhFRF9TRVBPTElDWSkKLWlmZXEgKCQoSVNfVEFSR0VUX01JWEVEX1NFUE9MSUNZKSx0cnVlKQotJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQsTUlYRURfU0VQT0xJQ1lfVkVSU0lPTiwkKEJPQVJEX1NFUE9MSUNZX1ZFUlMpKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0RZTkFNSUNfNjRfMzJfTUVESUFTRVJWRVIpCisKKyMgUFJPRFVDVF9QUkVDT01QSUxFRF9TRVBPTElDWSBkZWZhdWx0cyB0byB0cnVlLiBFeHBsaWNpdGx5IGNoZWNrIGlmIGl0J3MgImZhbHNlIiBvciBub3QuCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsUFJPRFVDVF9QUkVDT01QSUxFRF9TRVBPTElDWSwkKGlmICQoZmlsdGVyIGZhbHNlLCQoUFJPRFVDVF9QUkVDT01QSUxFRF9TRVBPTElDWSkpLGZhbHNlLHRydWUpKQorCitpZmRlZiBBUlRfREVCVUdfT1BUX0ZMQUcKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LGFydF9tb2R1bGUsYXJ0X2RlYnVnX29wdF9mbGFnLCQoQVJUX0RFQlVHX09QVF9GTEFHKSkKIGVuZGlmCi0kKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxCT0FSRF9VU0VTX09ETUlNQUdFKQotJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKQotJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsUFJPRFVDVF9JTlNUQUxMX0RFQlVHX1BPTElDWV9UT19TWVNURU1fRVhUKQotCi0jIERlZmF1bHQgYmVoYXZpb3IgZm9yIHRoZSB0cmVlIHdydCBidWlsZGluZyBtb2R1bGVzIG9yIHVzaW5nIHByZWJ1aWx0cy4gVGhpcwotIyBjYW4gYWx3YXlzIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSMgTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFLgotQlJBTkNIX0RFRkFVTFRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIDo9IHRydWUKLQotaWZuZXEgKCQoU0FOSVRJWkVfVEFSR0VUKSQoRU1NQV9JTlNUUlVNRU5UX0ZSQU1FV09SSyksKQotICAjIEFsd2F5cyB1c2Ugc291cmNlcyB3aGVuIGJ1aWxkaW5nIHRoZSBmcmFtZXdvcmsgd2l0aCBKYXZhIGNvdmVyYWdlIG9yCi0gICMgc2FuaXRpemVkIGJ1aWxkcyBhcyB0aGV5IGJvdGggcmVxdWlyZSBwdXJwb3NlIGJ1aWx0IHByZWJ1aWx0cyB3aGljaCB3ZSBkbwotICAjIG5vdCBwcm92aWRlLgotICBCUkFOQ0hfREVGQVVMVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UgOj0gdHJ1ZQotZW5kaWYKLQotIyBBUlQgZG9lcyBub3QgcHJvdmlkZSBsaW51eF9iaW9uaWMgdmFyaWFudHMgbmVlZGVkIGZvciBwcm9kdWN0cyB0aGF0Ci0jIHNldCBIT1NUX0NST1NTX09TPWxpbnV4X2Jpb25pYy4KLWlmZXEgKGxpbnV4X2Jpb25pYywke0hPU1RfQ1JPU1NfT1N9KQotICBCUkFOQ0hfREVGQVVMVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UgOj0gdHJ1ZQotZW5kaWYKLQotIyBBUlQgZG9lcyBub3QgcHJvdmlkZSBob3N0IHNpZGUgYXJtNjQgdmFyaWFudHMgbmVlZGVkIGZvciBwcm9kdWN0cyB0aGF0Ci0jIHNldCBIT1NUX0NST1NTX0FSQ0g9YXJtNjQuCi1pZmVxIChhcm02NCwke0hPU1RfQ1JPU1NfQVJDSH0pCi0gIEJSQU5DSF9ERUZBVUxUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA6PSB0cnVlCi1lbmRpZgotCi0jIFRWIGJhc2VkIGRldmljZXMgZG8gbm90IHNlZW0gdG8gd29yayB3aXRoIHByZWJ1aWx0cywgc28gYnVpbGQgZnJvbSBzb3VyY2UKLSMgZm9yIG5vdyBhbmQgZml4IGluIGEgZm9sbG93IHVwLgotaWZuZXEgKCwkKGZpbHRlciB0diwkKHN1YnN0ICQoY29tbWEpLCQoc3BhY2UpLCR7UFJPRFVDVF9DSEFSQUNURVJJU1RJQ1N9KSkpCi0gIEJSQU5DSF9ERUZBVUxUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA6PSB0cnVlCi1lbmRpZgotCi0jIEFUViBiYXNlZCBkZXZpY2VzIGRvIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBwcmVidWlsdHMsIHNvIGJ1aWxkIGZyb20gc291cmNlCi0jIGZvciBub3cgYW5kIGZpeCBpbiBhIGZvbGxvdyB1cC4KLWlmbmVxICgsJHtQUk9EVUNUX0lTX0FUVn0pCi0gIEJSQU5DSF9ERUZBVUxUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA6PSB0cnVlCi1lbmRpZgotCi1pZm5lcSAoLCQoTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKSkKLSAgIyBLZWVwIGFuIGV4cGxpY2l0IHNldHRpbmcuCi1lbHNlIGlmZXEgKCwkKGZpbHRlciBkb2NzIHNkayB3aW5fc2RrIHNka19hZGRvbiwkKE1BS0VDTURHT0FMUykpJChmaW5kc3RyaW5nIGNvbS5nb29nbGUuYW5kcm9pZC5jb25zY3J5cHQsJChQUk9EVUNUX1BBQ0tBR0VTKSkpCi0gICMgUHJlYnVpbHQgbW9kdWxlIFNES3MgcmVxdWlyZSBwcmVidWlsdCBtb2R1bGVzIHRvIHdvcmssIGFuZCBjdXJyZW50bHkKLSAgIyBwcmVidWlsdCBtb2R1bGVzIGFyZSBvbmx5IHByb3ZpZGVkIGZvciBjb20uZ29vZ2xlLmFuZHJvaWQueHh4LiBJZiB3ZSBjYW4ndAotICAjIGZpbmQgb25lIG9mIHRoZW0gaW4gUFJPRFVDVF9QQUNLQUdFUyB0aGVuIGFzc3VtZSBjb20uYW5kcm9pZC54eHggYXJlIGluIHVzZSwKLSAgIyBhbmQgZGlzYWJsZSBwcmVidWlsdCBTREtzLiBJbiBwYXJ0aWN1bGFyIHRoaXMgYXBwbGllcyB0byBBT1NQIGJ1aWxkcy4KLSAgIwotICAjIEhvd2V2ZXIsIGRvY3Mvc2RrL3dpbl9zZGsvc2RrX2FkZG9uIGJ1aWxkcyBtaWdodCBub3QgaW5jbHVkZSBjb20uZ29vZ2xlLmFuZHJvaWQueHh4Ci0gICMgcGFja2FnZXMsIHNvIGZvciB0aG9zZSB3ZSByZXNwZWN0IHRoZSBkZWZhdWx0IGJlaGF2aW9yLgotICBNT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UgOj0gdHJ1ZQotZWxzZSBpZm5lcSAoLCQoUFJPRFVDVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UpKQotICAjIExldCBwcm9kdWN0cyBvdmVycmlkZSB0aGUgYnJhbmNoIGRlZmF1bHQuCi0gIE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA6PSAkKFBST0RVQ1RfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKQotZWxzZQotICBNT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UgOj0gJChCUkFOQ0hfREVGQVVMVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UpCi1lbmRpZgotCi1pZm5lcSAoLCQoQVJUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSkpCi0gICMgS2VlcCBhbiBleHBsaWNpdCBzZXR0aW5nLgotZWxzZSBpZm5lcSAoLCQoZmluZHN0cmluZyAuYW5kcm9pZC5hcnQsJChUQVJHRVRfQlVJTERfQVBQUykpKQotICAjIEJ1aWxkIEFSVCBtb2R1bGVzIGZyb20gc291cmNlIGlmIHRoZXkgYXJlIGxpc3RlZCBpbiBUQVJHRVRfQlVJTERfQVBQUy4KLSAgQVJUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA6PSB0cnVlCi1lbHNlCi0gICMgRG8gdGhlIHNhbWUgYXMgb3RoZXIgbW9kdWxlcyBieSBkZWZhdWx0LgotICBBUlRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIDo9ICQoTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKQotZW5kaWYKLQotJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYXJ0X21vZHVsZSxzb3VyY2VfYnVpbGQsJChBUlRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKSkKIAogaWZkZWYgVEFSR0VUX0JPQVJEX0FVVE8KICAgJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLCBBTkRST0lELCB0YXJnZXRfYm9hcmRfYXV0bywgJChUQVJHRVRfQk9BUkRfQVVUTykpCiBlbmRpZgogCi0jIEVuc3VyZSB0aGF0IHRob3NlIG1haW5saW5lIG1vZHVsZXMgd2hvIGhhdmUgaW5kaXZpZHVhbGx5IHRvZ2dsZWFibGUgcHJlYnVpbHRzCi0jIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBNT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UgZW52aXJvbm1lbnQgdmFyaWFibGUgYnkKLSMgZGVmYXVsdC4KLUlORElWSURVQUxMWV9UT0dHTEVBQkxFX1BSRUJVSUxUX01PRFVMRVMgOj0gXAotICBidHNlcnZpY2VzIFwKLSAgcGVybWlzc2lvbiBcCi0gIHJrcGQgXAotICB1d2IgXAotICB3aWZpIFwKLQotJChmb3JlYWNoIG0sICQoSU5ESVZJRFVBTExZX1RPR0dMRUFCTEVfUFJFQlVJTFRfTU9EVUxFUyksXAotICAkKGlmICQoY2FsbCBzb29uZ19jb25maWdfZ2V0LCQobSlfbW9kdWxlLHNvdXJjZV9idWlsZCksLFwKLSAgICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCwkKG0pX21vZHVsZSxzb3VyY2VfYnVpbGQsJChNT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UpKSkpCi0KICMgQXBleCBidWlsZCBtb2RlIHZhcmlhYmxlcwogaWZkZWYgQVBFWF9CVUlMRF9GT1JfUFJFX1NfREVWSUNFUwogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQsbGlicmFyeV9saW5raW5nX3N0cmF0ZWd5LHByZWZlcl9zdGF0aWMpCkBAIC0xMzAsMjcgKzU2LDYzIEBACiBlbmRpZgogZW5kaWYKIAotaWZlcSAodHJ1ZSwkKE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSkpCisjIFRPRE8oYi8zMDgxODc4MDApOiBzb21lIGludGVybmFsIG1vZHVsZXMgc2V0IGBwcmVmZXJgIHRvIHRydWUgb24gdGhlIHByZWJ1aWx0IGFwZXggbW9kdWxlLAorIyBhbmQgc2V0IHRoYXQgdG8gZmFsc2Ugd2hlbiBgQU5EUk9JRC5tb2R1bGVfYnVpbGRfZnJvbV9zb3VyY2VgIGlzIHRydWUuCisjIFNldCB0aGlzIHNvb25nIGNvbmZpZyB2YXJpYWJsZSB0byB0cnVlIGZvciBub3csIGFuZCBjbGVhbnVwIGBwcmVmZXJgIGFzIHBhcnQgb2YgYi8zMDgxODc4MDAKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELG1vZHVsZV9idWlsZF9mcm9tX3NvdXJjZSx0cnVlKQotZW5kaWYKLQotIyBNZXNzYWdpbmcgYXBwIHZhcnMKLWlmZXEgKGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkKLSQoY2FsbCBzb29uZ19jb25maWdfc2V0LG1lc3NhZ2luZyxidWlsZF92YXJpYW50X2VuZyx0cnVlKQotZW5kaWYKIAogIyBFbmFibGUgU3lzdGVtVUkgb3B0aW1pemF0aW9ucyBieSBkZWZhdWx0IHVubGVzcyBleHBsaWNpdGx5IHNldC4KIFNZU1RFTVVJX09QVElNSVpFX0pBVkEgPz0gdHJ1ZQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsU1lTVEVNVUlfT1BUSU1JWkVfSkFWQSkKIAotIyBEaXNhYmxlIENvbXBvc2UgaW4gU3lzdGVtVUkgYnkgZGVmYXVsdC4KLVNZU1RFTVVJX1VTRV9DT01QT1NFID89IGZhbHNlCi0kKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxTWVNURU1VSV9VU0VfQ09NUE9TRSkKLQogaWZkZWYgUFJPRFVDVF9BVkZfRU5BQkxFRAogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQsYXZmX2VuYWJsZWQsJChQUk9EVUNUX0FWRl9FTkFCTEVEKSkKIGVuZGlmCiAKKyMgRW5hYmxlIEFWRiByZW1vdGUgYXR0ZXN0YXRpb24gYWNjb3JkaW5nIHRvIHRoZSBmbGFnIHZhbHVlIGlmIFBST0RVQ1RfQVZGX1JFTU9URV9BVFRFU1RBVElPTl9ESVNBQkxFRCBpcyBub3QKKyMgc2V0IHRvIHRydWUgZXhwbGljaXRseS4KK2lmbmVxICh0cnVlLCQoUFJPRFVDVF9BVkZfUkVNT1RFX0FUVEVTVEFUSU9OX0RJU0FCTEVEKSkKKyAgJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQsYXZmX3JlbW90ZV9hdHRlc3RhdGlvbl9lbmFibGVkLCQoUkVMRUFTRV9BVkZfRU5BQkxFX1JFTU9URV9BVFRFU1RBVElPTikpCitlbmRpZgorCitpZmRlZiBQUk9EVUNUX0FWRl9NSUNST0RST0lEX0dVRVNUX0dLSV9WRVJTSU9OCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxhdmZfbWljcm9kcm9pZF9ndWVzdF9na2lfdmVyc2lvbiwkKFBST0RVQ1RfQVZGX01JQ1JPRFJPSURfR1VFU1RfR0tJX1ZFUlNJT04pKQorZW5kaWYKKworaWZkZWYgUFJPRFVDVF9NRU1DR19WMl9GT1JDRV9FTkFCTEVECiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxtZW1jZ192Ml9mb3JjZV9lbmFibGVkLCQoUFJPRFVDVF9NRU1DR19WMl9GT1JDRV9FTkFCTEVEKSkKK2VuZGlmCisKK2lmZGVmIFBST0RVQ1RfQ0dST1VQX1YyX1NZU19BUFBfSVNPTEFUSU9OX0VOQUJMRUQKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELGNncm91cF92Ml9zeXNfYXBwX2lzb2xhdGlvbiwkKFBST0RVQ1RfQ0dST1VQX1YyX1NZU19BUFBfSVNPTEFUSU9OX0VOQUJMRUQpKQorZW5kaWYKKworJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfYWxsb3dfcHJlaW5zdGFsbGVkX2FwcHMsJChSRUxFQVNFX0FWRl9BTExPV19QUkVJTlNUQUxMRURfQVBQUykpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfZGV2aWNlX2Fzc2lnbm1lbnQsJChSRUxFQVNFX0FWRl9FTkFCTEVfREVWSUNFX0FTU0lHTk1FTlQpKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX2RpY2VfY2hhbmdlcywkKFJFTEVBU0VfQVZGX0VOQUJMRV9ESUNFX0NIQU5HRVMpKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX2xscHZtX2NoYW5nZXMsJChSRUxFQVNFX0FWRl9FTkFCTEVfTExQVk1fQ0hBTkdFUykpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfbXVsdGlfdGVuYW50X21pY3JvZHJvaWRfdm0sJChSRUxFQVNFX0FWRl9FTkFCTEVfTVVMVElfVEVOQU5UX01JQ1JPRFJPSURfVk0pKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX25ldHdvcmssJChSRUxFQVNFX0FWRl9FTkFCTEVfTkVUV09SSykpCisjIFRPRE8oYi8zNDEyOTI2MDEpOiBUaGlzIGZsYWcgaXMgbmVlZGVkIHVudGlsIHRoZSBWIHJlbGVhc2UuIFdlIHdpdGggY2xlYW4gaXQgdXAgYWZ0ZXIgViB0b2dldGhlcgorIyB3aXRoIG1vc3Qgb2YgdGhlIHJlbGVhc2VfYXZmXyBmbGFncyBoZXJlLgorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX3JlbW90ZV9hdHRlc3RhdGlvbiwkKFJFTEVBU0VfQVZGX0VOQUJMRV9SRU1PVEVfQVRURVNUQVRJT04pKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX3ZlbmRvcl9tb2R1bGVzLCQoUkVMRUFTRV9BVkZfRU5BQkxFX1ZFTkRPUl9NT0RVTEVTKSkKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfYXZmX2VuYWJsZV92aXJ0X2NwdWZyZXEsJChSRUxFQVNFX0FWRl9FTkFCTEVfVklSVF9DUFVGUkVRKSkKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfYXZmX21pY3JvZHJvaWRfa2VybmVsX3ZlcnNpb24sJChSRUxFQVNFX0FWRl9NSUNST0RST0lEX0tFUk5FTF9WRVJTSU9OKSkKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfYXZmX3N1cHBvcnRfY3VzdG9tX3ZtX3dpdGhfcGFyYXZpcnR1YWxpemVkX2RldmljZXMsJChSRUxFQVNFX0FWRl9TVVBQT1JUX0NVU1RPTV9WTV9XSVRIX1BBUkFWSVJUVUFMSVpFRF9ERVZJQ0VTKSkKKworJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9iaW5kZXJfZGVhdGhfcmVjaXBpZW50X3dlYWtfZnJvbV9qbmksJChSRUxFQVNFX0JJTkRFUl9ERUFUSF9SRUNJUElFTlRfV0VBS19GUk9NX0pOSSkpCisKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfbGlicG93ZXJfbm9fbG9ja19iaW5kZXJfdHhuLCQoUkVMRUFTRV9MSUJQT1dFUl9OT19MT0NLX0JJTkRFUl9UWE4pKQorCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX3BhY2thZ2VfbGliYW5kcm9pZF9ydW50aW1lX3B1bmNoX2hvbGVzLCQoUkVMRUFTRV9QQUNLQUdFX0xJQkFORFJPSURfUlVOVElNRV9QVU5DSF9IT0xFUykpCisKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2Vfc2VsaW51eF9kYXRhX2RhdGFfaWdub3JlLCQoUkVMRUFTRV9TRUxJTlVYX0RBVEFfREFUQV9JR05PUkUpKQoraWZuZXEgKCwkKGZpbHRlciBlbmcgdXNlcmRlYnVnLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKKyAgICAjIHdyaXRlIGFwcGNvbXBhdCBzeXN0ZW0gcHJvcGVydGllcyBvbiB1c2VyZGVidWcgYW5kIGVuZyBidWlsZHMKKyAgICAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX3dyaXRlX2FwcGNvbXBhdF9vdmVycmlkZV9zeXN0ZW1fcHJvcGVydGllcyx0cnVlKQorZW5kaWYKKwogIyBFbmFibGUgc3lzdGVtX3NlcnZlciBvcHRpbWl6YXRpb25zIGJ5IGRlZmF1bHQgdW5sZXNzIGV4cGxpY2l0bHkgc2V0IG9yIGlmCiAjIHRoZXJlIG1heSBiZSBkZXBlbmRlbnQgcnVudGltZSBqYXJzLgogIyBUT0RPKGIvMjQwNTg4MjI2KTogUmVtb3ZlIHRoZSBvZmYtYnktZGVmYXVsdCBleGNlcHRpb25zIGFmdGVyIGhhbmRsaW5nCkBAIC0xNjYsNyArMTI4LDE2IEBACiBlbHNlCiAgIFNZU1RFTV9PUFRJTUlaRV9KQVZBID89IHRydWUKIGVuZGlmCisKK2lmZXEgKHRydWUsJChGVUxMX1NZU1RFTV9PUFRJTUlaRV9KQVZBKSkKKyAgU1lTVEVNX09QVElNSVpFX0pBVkEgOj0gdHJ1ZQorZW5kaWYKKwogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsU1lTVEVNX09QVElNSVpFX0pBVkEpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxGVUxMX1NZU1RFTV9PUFRJTUlaRV9KQVZBKQorCisjIFRPRE8oYi8zMTk2OTc5NjgpOiBSZW1vdmUgdGhpcyBidWlsZCBmbGFnIHN1cHBvcnQgd2hlbiBtZXRhbGF2YSBmdWxseSBzdXBwb3J0cyBmbGFnZ2VkIGFwaQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxyZWxlYXNlX2hpZGRlbl9hcGlfZXhwb3J0YWJsZV9zdHVicywkKFJFTEVBU0VfSElEREVOX0FQSV9FWFBPUlRBQkxFX1NUVUJTKSkKIAogIyBDaGVjayBmb3IgU3VwcGxlbWVudGFsQXBpIG1vZHVsZS4KIGlmZXEgKCQod2lsZGNhcmQgcGFja2FnZXMvbW9kdWxlcy9TdXBwbGVtZW50YWxBcGkpLCkKQEAgLTE3NSwzICsxNDYsMTkgQEAKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELGluY2x1ZGVfbm9ucHVibGljX2ZyYW1ld29ya19hcGksdHJ1ZSkKIGVuZGlmCiAKKyMgQWRkIGNyYXNocmVjb3ZlcnkgYnVpbGQgZmxhZyB0byBzb29uZworJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxyZWxlYXNlX2NyYXNocmVjb3ZlcnlfbW9kdWxlLCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSkpCisjIEFkZCBjcmFzaHJlY292ZXJ5IGZpbGUgbW92ZSBmbGFncyB0byBzb29uZywgZm9yIGJvdGggcGxhdGZvcm0gYW5kIG1vZHVsZQoraWZlcSAodHJ1ZSwkKFJFTEVBU0VfQ1JBU0hSRUNPVkVSWV9GSUxFX01PVkUpKQorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELGNyYXNocmVjb3ZlcnlfZmlsZXNfaW5fbW9kdWxlLHRydWUpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsY3Jhc2hyZWNvdmVyeV9maWxlc19pbl9wbGF0Zm9ybSxmYWxzZSkKK2Vsc2UKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxjcmFzaHJlY292ZXJ5X2ZpbGVzX2luX21vZHVsZSxmYWxzZSkKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxjcmFzaHJlY292ZXJ5X2ZpbGVzX2luX3BsYXRmb3JtLHRydWUpCitlbmRpZgorIyBSZXF1aXJlZCBhcyBwbGF0Zm9ybV9ib290Y2xhc3NwYXRoIGlzIHVzaW5nIHRoaXMgbmFtZXNwYWNlCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLHJlbGVhc2VfY3Jhc2hyZWNvdmVyeV9tb2R1bGUsJChSRUxFQVNFX0NSQVNIUkVDT1ZFUllfTU9EVUxFKSkKKworIyBFbmFibGUgUHJvZmlsaW5nIG1vZHVsZS4gQWxzbyB1c2VkIGJ5IHBsYXRmb3JtX2Jvb3RjbGFzc3BhdGguCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELHJlbGVhc2VfcGFja2FnZV9wcm9maWxpbmdfbW9kdWxlLCQoUkVMRUFTRV9QQUNLQUdFX1BST0ZJTElOR19NT0RVTEUpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYm9vdGNsYXNzcGF0aCxyZWxlYXNlX3BhY2thZ2VfcHJvZmlsaW5nX21vZHVsZSwkKFJFTEVBU0VfUEFDS0FHRV9QUk9GSUxJTkdfTU9EVUxFKSkKZGlmZiAtLWdpdCBhL2NvcmUvYXBwX3ByZWJ1aWx0X2ludGVybmFsLm1rIGIvY29yZS9hcHBfcHJlYnVpbHRfaW50ZXJuYWwubWsKaW5kZXggOWZhYjQ0ZC4uMjY3MTk1NiAxMDA2NDQKLS0tIGEvY29yZS9hcHBfcHJlYnVpbHRfaW50ZXJuYWwubWsKKysrIGIvY29yZS9hcHBfcHJlYnVpbHRfaW50ZXJuYWwubWsKQEAgLTg1LDExICs4NSw2IEBACiBteV9wcmVidWlsdF9zcmNfZmlsZSA6PSAkKG15X2V4dHJhY3RlZF9hcGspCiBteV9leHRyYWN0ZWRfYXBrIDo9CiBteV9leHRyYWN0X2FwayA6PQotaWZlcSAoJChQUk9EVUNUX0FMV0FZU19QUkVPUFRfRVhUUkFDVEVEX0FQSyksdHJ1ZSkKLSMgSWYgdGhlIHByb2R1Y3QgcHJvcGVydHkgaXMgc2V0LCBhbHdheXMgcHJlb3B0IGZvciBleHRyYWN0ZWQgbW9kdWxlcyB0byBwcmV2ZW50IGV4ZWN1dGluZyBvdXQgb2YKLSMgdGhlIEFQSy4KLW15X3ByZW9wdF9mb3JfZXh0cmFjdGVkX2FwayA6PSB0cnVlCi1lbmRpZgogZW5kaWYKIAogcnNfY29tcGF0aWJpbGl0eV9qbmlfbGlicyA6PQpAQCAtMjI3LDcgKzIyMiw3IEBACiAkKGJ1aWx0X21vZHVsZSk6IFBSSVZBVEVfRU1CRURERURfSk5JX0xJQlMgOj0gJChlbWJlZGRlZF9wcmVidWlsdF9qbmlfbGlicykKIAogaWZkZWYgTE9DQUxfQ09NUFJFU1NFRF9NT0RVTEUKLSQoYnVpbHRfbW9kdWxlKSA6ICQoTUlOSUdaSVApCiskKGJ1aWx0X21vZHVsZSkgOiAkKEdaSVApCiBlbmRpZgogCiBpZmVxICgkKG1vZHVsZV9ydW5fYXBwY29tcGF0KSx0cnVlKQpAQCAtMzA1LDQgKzMwMCw0IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgU0JPTSBnZW5lcmF0aW9uCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaW5jbHVkZSAkKEJVSUxEX1NCT01fR0VOKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2luY2x1ZGUgJChCVUlMRF9TQk9NX0dFTikKZGlmZiAtLWdpdCBhL2NvcmUvYXJ0X2NvbmZpZy5tayBiL2NvcmUvYXJ0X2NvbmZpZy5tawppbmRleCAxZWEwNWRiLi45ZTg3YTdiIDEwMDY0NAotLS0gYS9jb3JlL2FydF9jb25maWcubWsKKysrIGIvY29yZS9hcnRfY29uZmlnLm1rCkBAIC0xMiwzNSArMTIsMjYgQEAKICMgRU5BQkxFX1VGRkRfR0M6IFdoZXRoZXIgdG8gdXNlIHVzZXJmYXVsdGZkIEdDLgogCiBjb25maWdfZW5hYmxlX3VmZmRfZ2MgOj0gXAotICAkKGZpcnN0d29yZCAkKE9WRVJSSURFX0VOQUJMRV9VRkZEX0dDKSAkKFBST0RVQ1RfRU5BQkxFX1VGRkRfR0MpKQorICAkKGZpcnN0d29yZCAkKE9WRVJSSURFX0VOQUJMRV9VRkZEX0dDKSAkKFBST0RVQ1RfRU5BQkxFX1VGRkRfR0MpIGRlZmF1bHQpCiAKLWlmZXEgKCwkKGZpbHRlci1vdXQgZGVmYXVsdCwkKGNvbmZpZ19lbmFibGVfdWZmZF9nYykpKQotICBFTkFCTEVfVUZGRF9HQyA6PSB0cnVlCi0KLSAgIyBEaXNhYmxlIHVzZXJmYXVsdGZkIEdDIGlmIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGl0IChpLmUuLCBpZgotICAjIGBtaW4ocm8uYm9hcmQuYXBpX2xldmVsID8/IHJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCA/PyBNQVhfVkFMVUUsCi0gICMgICAgICByby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCA/PyByby5idWlsZC52ZXJzaW9uLnNkayA/PyBNQVhfVkFMVUUpIDwgMzFgKQotICAjIFRoaXMgbG9naWMgYWxpZ25zIHdpdGggaG93IGByby52ZW5kb3IuYXBpX2xldmVsYCBpcyBjYWxjdWxhdGVkIGluCi0gICMgYHN5c3RlbS9jb3JlL2luaXQvcHJvcGVydHlfc2VydmljZS5jcHBgLgotICAjIFdlIG9taXQgdGhlIGNoZWNrIG9uIGByby5idWlsZC52ZXJzaW9uLnNka2AgaGVyZSBiZWNhdXNlIHdlIGFyZSBvbiB0aGUgbGF0ZXN0IGJ1aWxkIHN5c3RlbS4KLSAgYm9hcmRfYXBpX2xldmVsIDo9ICQoZmlyc3R3b3JkICQoQk9BUkRfQVBJX0xFVkVMKSAkKEJPQVJEX1NISVBQSU5HX0FQSV9MRVZFTCkpCi0gIGlmbmVxICgsJChib2FyZF9hcGlfbGV2ZWwpKQotICAgIGlmZXEgKHRydWUsJChjYWxsIG1hdGhfbHQsJChib2FyZF9hcGlfbGV2ZWwpLDMxKSkKLSAgICAgIEVOQUJMRV9VRkZEX0dDIDo9IGZhbHNlCi0gICAgZW5kaWYKLSAgZW5kaWYKLQotICBpZm5lcSAoLCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpKQotICAgIGlmZXEgKHRydWUsJChjYWxsIG1hdGhfbHQsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksMzEpKQotICAgICAgRU5BQkxFX1VGRkRfR0MgOj0gZmFsc2UKLSAgICBlbmRpZgotICBlbmRpZgotZWxzZSBpZmVxICh0cnVlLCQoY29uZmlnX2VuYWJsZV91ZmZkX2djKSkKLSAgRU5BQkxFX1VGRkRfR0MgOj0gdHJ1ZQotZWxzZSBpZmVxIChmYWxzZSwkKGNvbmZpZ19lbmFibGVfdWZmZF9nYykpCi0gIEVOQUJMRV9VRkZEX0dDIDo9IGZhbHNlCi1lbHNlCitpZmVxICgsJChmaWx0ZXIgZGVmYXVsdCB0cnVlIGZhbHNlLCQoY29uZmlnX2VuYWJsZV91ZmZkX2djKSkpCiAgICQoZXJyb3IgVW5rbm93biBQUk9EVUNUX0VOQUJMRV9VRkZEX0dDIHZhbHVlOiAkKGNvbmZpZ19lbmFibGVfdWZmZF9nYykpCiBlbmRpZgogCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5kYWx2aWsudm0uZW5hYmxlX3VmZmRfZ2M9JChFTkFCTEVfVUZGRF9HQykKK0VOQUJMRV9VRkZEX0dDIDo9ICQoY29uZmlnX2VuYWJsZV91ZmZkX2djKQorCisjIENyZWF0ZSBBUEVYX0JPT1RfSkFSU19FWENMVURFRCB3aGljaCBpcyBhIGxpc3Qgb2YgamFycyB0byBiZSByZW1vdmVkIGZyb20KKyMgQXBleEJvb3JKYXJzIHdoZW4gYnVpbHQgZnJvbSBtYWlubGluZSBwcmVidWlsdHMuCisjIE5vdGUgdGhhdCBSRUxFQVNFX0FQRVhfQk9PVF9KQVJTX1BSRUJVSUxUX0VYQ0xVREVEX0xJU1QgaXMgdGhlIGxpc3Qgb2YgbW9kdWxlIG5hbWVzCisjIGFuZCBsaWJyYXJ5IG5hbWVzIG9mIGphcnMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQuIFdlIGhhdmUgdG8ga2VlcCBzZXBhcmF0ZWQgbGlzdCBwZXIKKyMgcmVsZWFzZSBjb25maWcgZHVlIHRvIHBvc3NpYmlsaXR5IG9mIGRpZmZlcmVudCBwcmVidWlsdCBjb250ZW50LgorIworIyBJZiBhIGRldmljZSBoYXMgb3B0ZWQgdG8gbm90IHVzZSBnb29nbGUgcHJlYnVpbHRzIChkZXRlcm1pbmVkIHVzaW5nCisjIFBST0RVQ1RfQlVJTERfSUdOT1JFX0FQRVhfQ09OVFJJQlVUSU9OX0NPTlRFTlRTKSwgdGhlbiBubyBqYXJzIG5lZWQgdG8gYmUgcmVtb3ZlZC4KKyMgRXhhbXBsZSBvZiBwcm9kdWN0cyB3aGVyZSBQUk9EVUNUX0JVSUxEX0lHTk9SRV9BUEVYX0NPTlRSSUJVVElPTl9DT05URU5UUyBpcyB0cnVlIGFyZQorIyAxLiBhb3NwIGRldmljZXMgKHRoZXkgZG8gbm90IHVzZSBnb29nbGUgYXBleGVzKQorIyAyLiBod2FzYW4gZGV2aWNlcyAoYXBleCBwcmVidWlsdHMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlc2UgZGV2aWNlcykKKyMgMy4gY292ZXJhZ2UgYnVpbGRzCitpZm5lcSAodHJ1ZSwgJChQUk9EVUNUX0JVSUxEX0lHTk9SRV9BUEVYX0NPTlRSSUJVVElPTl9DT05URU5UUykpCisgIEFQRVhfQk9PVF9KQVJTX0VYQ0xVREVEICs9ICQoUkVMRUFTRV9BUEVYX0JPT1RfSkFSU19QUkVCVUlMVF9FWENMVURFRF9MSVNUKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvYXJ0aWZhY3RfcGF0aF9yZXF1aXJlbWVudHMubWsgYi9jb3JlL2FydGlmYWN0X3BhdGhfcmVxdWlyZW1lbnRzLm1rCmluZGV4IDU2NmI5ZjcuLmM5NDljYzQgMTAwNjQ0Ci0tLSBhL2NvcmUvYXJ0aWZhY3RfcGF0aF9yZXF1aXJlbWVudHMubWsKKysrIGIvY29yZS9hcnRpZmFjdF9wYXRoX3JlcXVpcmVtZW50cy5tawpAQCAtNCw2ICs0LDcgQEAKICMgRmFrZXMgZG9uJ3QgZ2V0IGluc3RhbGxlZCwgYW5kIE5ESyBzdHVicyBhcmVuJ3QgaW5zdGFsbGVkIHRvIGRldmljZS4KIHN0YXRpY19hbGxvd2VkX3BhdHRlcm5zIDo9ICQoVEFSR0VUX09VVF9GQUtFKS8lICQoU09PTkdfT1VUX0RJUikvbmRrLyUKICMgUlJPcyBiZWNvbWUgUkVRVUlSRUQgYnkgdGhlIHNvdXJjZSBtb2R1bGUsIGJ1dCBhcmUgYWx3YXlzIHBsYWNlZCBvbiB0aGUgdmVuZG9yIHBhcnRpdGlvbi4KK3N0YXRpY19hbGxvd2VkX3BhdHRlcm5zICs9ICVfX2F1dG9fZ2VuZXJhdGVkX2NoYXJhY3RlcmlzdGljc19ycm8uYXBrCiBzdGF0aWNfYWxsb3dlZF9wYXR0ZXJucyArPSAlX19hdXRvX2dlbmVyYXRlZF9ycm9fcHJvZHVjdC5hcGsKIHN0YXRpY19hbGxvd2VkX3BhdHRlcm5zICs9ICVfX2F1dG9fZ2VuZXJhdGVkX3Jyb192ZW5kb3IuYXBrCiAjIEF1dG8taW5jbHVkZWQgdGFyZ2V0cyBhcmUgbm90IGNvbnNpZGVyZWQKZGlmZiAtLWdpdCBhL2NvcmUvYXV0b2dlbl90ZXN0X2NvbmZpZy5tayBiL2NvcmUvYXV0b2dlbl90ZXN0X2NvbmZpZy5tawppbmRleCAxMzdiMTE4Li5iNjlmNjk0IDEwMDY0NAotLS0gYS9jb3JlL2F1dG9nZW5fdGVzdF9jb25maWcubWsKKysrIGIvY29yZS9hdXRvZ2VuX3Rlc3RfY29uZmlnLm1rCkBAIC0yOSw3ICsyOSw3IEBACiAgIGlmZXEgKHRydWUsJChMT0NBTF9WRU5ET1JfTU9EVUxFKSkKICAgICBhdXRvZ2VuX3Rlc3RfaW5zdGFsbF9iYXNlID0gL2RhdGEvbG9jYWwvdGVzdHMvdmVuZG9yCiAgIGVuZGlmCi0gIGlmZXEgKHRydWUsJChMT0NBTF9VU0VfVk5ESykpCisgIGlmZXEgKHRydWUsJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCkpCiAgICAgYXV0b2dlbl90ZXN0X2luc3RhbGxfYmFzZSA9IC9kYXRhL2xvY2FsL3Rlc3RzL3ZlbmRvcgogICBlbmRpZgogZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvYmFzZV9ydWxlcy5tayBiL2NvcmUvYmFzZV9ydWxlcy5tawppbmRleCA4OTMwOTFhLi5jYTU1M2Y2IDEwMDY0NAotLS0gYS9jb3JlL2Jhc2VfcnVsZXMubWsKKysrIGIvY29yZS9iYXNlX3J1bGVzLm1rCkBAIC0xMjAsMTMgKzEyMCwxNiBAQAogICAgJChMT0NBTF9WRU5ET1JfTU9EVUxFKSBcCiAgICAkKExPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSkpCiAKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xvY2FsX3ZuZGsubWsKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xvY2FsX3N5c3RlbXNkay5taworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbG9jYWxfdmVuZG9yX3Byb2R1Y3QubWsKKworIyBsb2NhbF9jdXJyZW50X3NkayBuZWVkcyB0byBydW4gYmVmb3JlIGxvY2FsX3N5c3RlbXNkayBiZWNhdXNlIHRoZSBmb3JtZXIgbWF5IG92ZXJyaWRlCisjIExPQ0FMX1NES19WRVJTSU9OIHdoaWNoIGlzIHVzZWQgYnkgdGhlIGxhdHRlci4KIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xvY2FsX2N1cnJlbnRfc2RrLm1rCiAKLW15X21vZHVsZV90YWdzIDo9ICQoTE9DQUxfTU9EVUxFX1RBR1MpCi1pZmVxICgkKG15X2hvc3RfY3Jvc3MpLHRydWUpCi0gIG15X21vZHVsZV90YWdzIDo9CisjIENoZWNrIGlmIHRoZSB1c2Ugb2YgU3lzdGVtIFNESyBpcyBjb3JyZWN0LiBOb3RlIHRoYXQsIGZvciBTb29uZyBtb2R1bGVzLCB0aGUgc3lzdGVtIHNkayB2ZXJzaW9uCisjIGNoZWNrIGlzIGRvbmUgaW4gU29vbmcuIE5vIG5lZWQgdG8gZG8gaXQgdHdpY2UuCitpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9sb2NhbF9zeXN0ZW1zZGsubWsKIGVuZGlmCiAKICMgTmluamEgaGFzIGFuIGltcGxpY2l0IGRlcGVuZGVuY3kgb24gdGhlIGNvbW1hbmQgYmVpbmcgcnVuLCBhbmQga2F0aSB3aWxsCkBAIC0xNDgsNTggKzE1MSwxMyBAQAogIyMgVmFsaWRhdGUgYW5kIGRlZmluZSBmYWxsYmFja3MgZm9yIGlucHV0IExPQ0FMXyogdmFyaWFibGVzLgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotIyMgRHVtcCBhIC5jc3YgZmlsZSBvZiBhbGwgbW9kdWxlcyBhbmQgdGhlaXIgdGFncwotI2lmbmVxICgkKHRhZy1saXN0LWZpcnN0LXRpbWUpLGZhbHNlKQotIyQoc2hlbGwgcm0gLWYgdGFnLWxpc3QuY3N2KQotI3RhZy1saXN0LWZpcnN0LXRpbWUgOj0gZmFsc2UKLSNlbmRpZgotIyQoc2hlbGwgZWNobyAkKGxhc3R3b3JkICQoZmlsdGVyLW91dCBjb25maWcvJSBvdXQvJSwkKE1BS0VGSUxFX0xJU1QpKSksJChMT0NBTF9NT0RVTEUpLCQoc3RyaXAgJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSwkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoc29ydCAkKG15X21vZHVsZV90YWdzKSkpID4+IHRhZy1saXN0LmNzdikKLQogTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUgOj0gJChzdHJpcCAkKExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFKSkKLW15X21vZHVsZV90YWdzIDo9ICQoc29ydCAkKG15X21vZHVsZV90YWdzKSkKLWlmZXEgKCwkKG15X21vZHVsZV90YWdzKSkKLSAgbXlfbW9kdWxlX3RhZ3MgOj0gb3B0aW9uYWwKLWVuZGlmCi0KLSMgVXNlciB0YWdzIGFyZSBub3QgYWxsb3dlZCBhbnltb3JlLiAgRmFpbCBlYXJseSBiZWNhdXNlIGl0IHdpbGwgbm90IGJlIGluc3RhbGxlZAotIyBsaWtlIGl0IHVzZWQgdG8gYmUuCi1pZm5lcSAoJChmaWx0ZXIgJChteV9tb2R1bGVfdGFncyksdXNlciksKQotICAkKHdhcm5pbmcgKioqIE1vZHVsZSBuYW1lOiAkKExPQ0FMX01PRFVMRSkpCi0gICQod2FybmluZyAqKiogTWFrZWZpbGUgbG9jYXRpb246ICQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKSkKLSAgJCh3YXJuaW5nICogKQotICAkKHdhcm5pbmcgKiBNb2R1bGUgaXMgYXR0ZW1wdGluZyB0byB1c2UgdGhlICd1c2VyJyB0YWcuICBUaGlzKQotICAkKHdhcm5pbmcgKiB1c2VkIHRvIGNhdXNlIHRoZSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkIGF1dG9tYXRpY2FsbHkuKQotICAkKHdhcm5pbmcgKiBOb3csIHRoZSBtb2R1bGUgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIFBST0RVQ1RfUEFDS0FHRVMpCi0gICQod2FybmluZyAqIHNlY3Rpb24gb2YgYSBwcm9kdWN0IG1ha2VmaWxlIHRvIGhhdmUgaXQgaW5zdGFsbGVkLikKLSAgJCh3YXJuaW5nICogKQotICAkKGVycm9yIHVzZXIgdGFnIGRldGVjdGVkIG9uIG1vZHVsZS4pCi1lbmRpZgotCi1teV9iYWRfbW9kdWxlX3RhZ3MgOj0gJChmaWx0ZXIgZW5nIGRlYnVnLCQobXlfbW9kdWxlX3RhZ3MpKQotaWZkZWYgbXlfYmFkX21vZHVsZV90YWdzCi0gIGlmZXEgKHRydWUsJChMT0NBTF9VTklOU1RBTExBQkxFX01PRFVMRSkpCi0gICAgJChjYWxsIHByZXR0eS13YXJuaW5nLExPQ0FMX01PRFVMRV9UQUdTIDo9ICQobXlfYmFkX21vZHVsZV90YWdzKSBkb2VzIG5vdCBkbyBhbnl0aGluZyBmb3IgdW5pbnN0YWxsYWJsZSBtb2R1bGVzKQotICBlbmRpZgotICAkKGNhbGwgcHJldHR5LWVycm9yLExPQ0FMX01PRFVMRV9UQUdTIDo9ICQobXlfYmFkX21vZHVsZV90YWdzKSBpcyBvYnNvbGV0ZS4gU2VlICQoQ0hBTkdFU19VUkwpI0xPQ0FMX01PRFVMRV9UQUdTKQotZW5kaWYKIAogIyBPbmx5IHRoZSB0YWdzIG1lbnRpb25lZCBpbiB0aGlzIHRlc3QgYXJlIGV4cGVjdGVkIHRvIGJlIHNldCBieSBtb2R1bGUKICMgbWFrZWZpbGVzLiBBbnl0aGluZyBlbHNlIGlzIGVpdGhlciBhIHR5cG8gb3IgYSBzb3VyY2Ugb2YgdW5leHBlY3RlZAogIyBiZWhhdmlvcnMuCi1pZm5lcSAoJChmaWx0ZXItb3V0IHRlc3RzIG9wdGlvbmFsIHNhbXBsZXMsJChteV9tb2R1bGVfdGFncykpLCkKLSQoY2FsbCBwcmV0dHktZXJyb3IsdW51c3VhbCB0YWdzOiAkKGZpbHRlci1vdXQgdGVzdHMgb3B0aW9uYWwgc2FtcGxlcywkKG15X21vZHVsZV90YWdzKSkpCi1lbmRpZgotCi0jIEFkZCBpbXBsaWNpdCB0YWdzLgotIwotIyBJZiB0aGUgbG9jYWwgZGlyZWN0b3J5IG9yIG9uZSBvZiBpdHMgcGFyZW50cyBjb250YWlucyBhIE1PRFVMRV9MSUNFTlNFX0dQTAotIyBmaWxlLCB0YWcgdGhlIG1vZHVsZSBhcyAiZ251Ii4gIFNlYXJjaCBmb3IgIipfR1BMKiIsICIqX0xHUEwqIiBhbmQgIipfTVBMKiIKLSMgc28gdGhhdCB3ZSBjYW4gYWxzbyBmaW5kIGZpbGVzIGxpa2UgTU9EVUxFX0xJQ0VOU0VfR1BMX0FORF9BRkwKLSMKLWdwbF9saWNlbnNlX2ZpbGUgOj0gJChjYWxsIGZpbmQtcGFyZW50LWZpbGUsJChMT0NBTF9QQVRIKSxNT0RVTEVfTElDRU5TRSpfR1BMKiBNT0RVTEVfTElDRU5TRSpfTVBMKiBNT0RVTEVfTElDRU5TRSpfTEdQTCopCi1pZm5lcSAoJChncGxfbGljZW5zZV9maWxlKSwpCi0gIG15X21vZHVsZV90YWdzICs9IGdudQotICBBTExfR1BMX01PRFVMRV9MSUNFTlNFX0ZJTEVTICs9ICQoZ3BsX2xpY2Vuc2VfZmlsZSkKK2lmbmVxICgkKGZpbHRlci1vdXQgdGVzdHMgb3B0aW9uYWwgc2FtcGxlcywkKExPQ0FMX01PRFVMRV9UQUdTKSksKQorJChjYWxsIHByZXR0eS1lcnJvcix1bnVzdWFsIHRhZ3M6ICQoZmlsdGVyLW91dCB0ZXN0cyBvcHRpb25hbCBzYW1wbGVzLCQoTE9DQUxfTU9EVUxFX1RBR1MpKSkKIGVuZGlmCiAKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSAkKHN0cmlwICQoTE9DQUxfTU9EVUxFX0NMQVNTKSkKQEAgLTI1Miw3ICsyMTAsNyBAQAogZWxzZQogICAjIFRoZSBkZWZpbml0aW9uIG9mIHNob3VsZC1pbnN0YWxsLXRvLXN5c3RlbSB3aWxsIGJlIGRpZmZlcmVudCBkZXBlbmRpbmcKICAgIyBvbiB3aGljaCBnb2FsIChlLmcuLCBzZGsgb3IganVzdCBkcm9pZCkgaXMgYmVpbmcgYnVpbHQuCi0gIHBhcnRpdGlvbl90YWcgOj0gJChpZiAkKGNhbGwgc2hvdWxkLWluc3RhbGwtdG8tc3lzdGVtLCQobXlfbW9kdWxlX3RhZ3MpKSwsX0RBVEEpCisgIHBhcnRpdGlvbl90YWcgOj0gJChpZiAkKGNhbGwgc2hvdWxkLWluc3RhbGwtdG8tc3lzdGVtLCQoTE9DQUxfTU9EVUxFX1RBR1MpKSwsX0RBVEEpCiAgIGFjdHVhbF9wYXJ0aXRpb25fdGFnIDo9ICQoaWYgJChwYXJ0aXRpb25fdGFnKSxkYXRhLHN5c3RlbSkKIGVuZGlmCiBlbmRpZgpAQCAtMjY0LDcgKzIyMiw3IEBACiAgICAgTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBudWxsLXN1aXRlCiAgIGVuZGlmCiAgIGlmbmVxICgkKGZpbHRlciBBUFBTLCAkKExPQ0FMX01PRFVMRV9DTEFTUykpLCkKLSAgICBpZm5lcSAoJChmaWx0ZXIgJChteV9tb2R1bGVfdGFncyksdGVzdHMpLCkKKyAgICBpZm5lcSAoJChmaWx0ZXIgJChMT0NBTF9NT0RVTEVfVEFHUyksdGVzdHMpLCkKICAgICAgIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gbnVsbC1zdWl0ZQogICAgIGVuZGlmCiAgIGVuZGlmCkBAIC00MzUsOCArMzkzLDggQEAKIAogbG9ndGFnc19zb3VyY2VzIDo9ICQoZmlsdGVyICUubG9ndGFncywkKExPQ0FMX1NSQ19GSUxFUykpICQoTE9DQUxfTE9HVEFHU19GSUxFUykKIAotaWZuZXEgKCQoc3RyaXAgJChsb2d0YWdzX3NvdXJjZXMpKSwpCi1ldmVudF9sb2dfdGFncyA6PSAkKGZvcmVhY2ggZiwkKGFkZHByZWZpeCAkKExPQ0FMX1BBVEgpLywkKGxvZ3RhZ3Nfc291cmNlcykpLCQoY2FsbCBjbGVhbi1wYXRoLCQoZikpKQoraWZuZXEgKCQoc3RyaXAgJChsb2d0YWdzX3NvdXJjZXMpICQoTE9DQUxfU09PTkdfTE9HVEFHU19GSUxFUykpLCkKK2V2ZW50X2xvZ190YWdzIDo9ICQoZm9yZWFjaCBmLCQoTE9DQUxfU09PTkdfTE9HVEFHU19GSUxFUykgJChhZGRwcmVmaXggJChMT0NBTF9QQVRIKS8sJChsb2d0YWdzX3NvdXJjZXMpKSwkKGNhbGwgY2xlYW4tcGF0aCwkKGYpKSkKIGVsc2UKIGV2ZW50X2xvZ190YWdzIDo9CiBlbmRpZgpAQCAtNDYyLDYgKzQyMCwxMiBAQAogJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUykgOiBQUklWQVRFX0lTX0hPU1RfTU9EVUxFIDo9ICQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKSA6IFBSSVZBVEVfSE9TVDo9ICQobXlfaG9zdCkKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpIDogUFJJVkFURV9QUkVGSVggOj0gJChteV9wcmVmaXgpCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKSA6IC5LQVRJX1RBR1MgKz0gO21vZHVsZV9uYW1lPSQoTE9DQUxfTU9EVUxFKQoraWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLCkKKyQoZXJyb3IgIiQoTE9DQUxfTU9EVUxFKSBpbiAkKExPQ0FMX1BBVEgpIGRvZXMgbm90IHNldCAkKExPQ0FMX01PRFVMRV9DTEFTUykiKQorZWxzZQorJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUykgOiAuS0FUSV9UQUdTICs9IDttb2R1bGVfdHlwZT0kKExPQ0FMX01PRFVMRV9DTEFTUykKK2VuZGlmCiAKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpIDogUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUjo9ICQoaW50ZXJtZWRpYXRlcykKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpIDogUFJJVkFURV8yTkRfQVJDSF9WQVJfUFJFRklYIDo9ICQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCkKQEAgLTUyNywxMCArNDkxLDYgQEAKICAgIyBjb3B5IG9mIHRoZSBpbnRlcm1lZGlhdGVzIGZvciBub3csIGFzIHNvbWUgcnVsZXMgdGhhdCBjb2xsZWN0IGludGVybWVkaWF0ZXMgbWF5IGV4cGVjdAogICAjIHRoZW0gdG8gZXhpc3QuCiAgICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQotCi0gICQoZm9yZWFjaCBzeW1saW5rLCAkKExPQ0FMX1NPT05HX0lOU1RBTExfU1lNTElOS1MpLCBcCi0gICAgJChjYWxsIGRlY2xhcmUtMHAtdGFyZ2V0LCQoc3ltbGluaykpKQotICAkKG15X2FsbF90YXJnZXRzKSA6IHwgJChMT0NBTF9TT09OR19JTlNUQUxMX1NZTUxJTktTKQogZWxzZSBpZm5lcSAodHJ1ZSwkKExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFKSkKICAgJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKTogUFJJVkFURV9QT1NUX0lOU1RBTExfQ01EIDo9ICQoTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCkKICAgJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKTogJChMT0NBTF9CVUlMVF9NT0RVTEUpCkBAIC01NTIsNiArNTEyLDE1IEBACiAKIGVuZGlmICMgIUxPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFCiAKKyMgQWRkIGRlcGVuZGVuY2llcyBvbiBMT0NBTF9TT09OR19JTlNUQUxMX1NZTUxJTktTIGlmIHdlJ3JlIGluc3RhbGxpbmcgYW55IGtpbmQgb2YgbW9kdWxlLCBub3QganVzdAorIyBvbmVzIHRoYXQgc2V0IExPQ0FMX1NPT05HX0lOU1RBTExFRF9NT0RVTEUuIFRoaXMgaXMgc28gd2UgY2FuIGhhdmUgYSBzb29uZyBtb2R1bGUgdGhhdCBvbmx5CisjIGluc3RhbGxzIHN5bWxpbmtzIChlLmcuIGluc3RhbGxfc3ltbGluaykuIFdlIGNhbid0IHNldCBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFIHRvIGEgc3ltbGluaworIyBiZWNhdXNlIGNwIGNvbW1hbmRzIHdpbGwgZmFpbCBvbiBzeW1saW5rcy4KK2lmbmVxICgsJChvciAkKExPQ0FMX1NPT05HX0lOU1RBTExFRF9NT0RVTEUpLCQoY2FsbCBib29sZWFuLW5vdCwkKExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFKSkpKQorICAkKGZvcmVhY2ggc3ltbGluaywgJChMT0NBTF9TT09OR19JTlNUQUxMX1NZTUxJTktTKSwgJChjYWxsIGRlY2xhcmUtMHAtdGFyZ2V0LCQoc3ltbGluaykpKQorICAkKG15X2FsbF90YXJnZXRzKSA6IHwgJChMT0NBTF9TT09OR19JTlNUQUxMX1NZTUxJTktTKQorZW5kaWYKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFZJTlRGIG1hbmlmZXN0IGZyYWdtZW50IGFuZCBpbml0LnJjIGdvYWxzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtNTgwLDExICs1NDksMTQgQEAKIAogICAgICAgIyBPbmx5IHNldCB1cCBjb3B5IHJ1bGVzIG9uY2UsIGV2ZW4gaWYgYW5vdGhlciBhcmNoIHZhcmlhbnQgc2hhcmVzIGl0CiAgICAgICBteV92aW50Zl9uZXdfcGFpcnMgOj0gJChmaWx0ZXItb3V0ICQoQUxMX1ZJTlRGX01BTklGRVNUX0ZSQUdNRU5UU19MSVNUKSwkKG15X3ZpbnRmX3BhaXJzKSkKLSAgICAgIG15X3ZpbnRmX25ld19pbnN0YWxsZWQgOj0gJChjYWxsIGNvcHktbWFueS12aW50Zi1tYW5pZmVzdC1maWxlcy1jaGVja2VkLCQobXlfdmludGZfbmV3X3BhaXJzKSkKLQogICAgICAgQUxMX1ZJTlRGX01BTklGRVNUX0ZSQUdNRU5UU19MSVNUICs9ICQobXlfdmludGZfbmV3X3BhaXJzKQogCi0gICAgICAkKG15X2FsbF90YXJnZXRzKSA6ICQobXlfdmludGZfbmV3X2luc3RhbGxlZCkKKyAgICAgIGlmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKKyAgICAgICAgJChjYWxsIGNvcHktbWFueS12aW50Zi1tYW5pZmVzdC1maWxlcy1jaGVja2VkLCQobXlfdmludGZfbmV3X3BhaXJzKSkKKyAgICAgICAgJChteV9hbGxfdGFyZ2V0cykgOiAkKG15X3ZpbnRmX2luc3RhbGxlZCkKKyAgICAgICAgIyBJbnN0YWxsIGZyYWdtZW50cyB0b2dldGhlciB3aXRoIHRoZSB0YXJnZXQKKyAgICAgICAgJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKSA6IHwgJChteV92aW50Zl9pbnN0YWxsZWQpCisgICAgIGVuZGlmCiAgICAgZW5kaWYgIyBteV92aW50Zl9mcmFnbWVudHMKIAogICAgICMgUnVsZSB0byBpbnN0YWxsIHRoZSBtb2R1bGUncyBjb21wYW5pb24gaW5pdC5yYy4KQEAgLTYxNiwxMSArNTg4LDE0IEBACiAgICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IHNldCB1cCB0aGUgY29weSBydWxlcyBvbmNlLCBldmVuIGlmIGFub3RoZXIgYXJjaCB2YXJpYW50CiAgICAgICAjIHNoYXJlcyBhIGNvbW1vbiBMT0NBTF9JTklUX1JDLgogICAgICAgbXlfaW5pdF9yY19uZXdfcGFpcnMgOj0gJChmaWx0ZXItb3V0ICQoQUxMX0lOSVRfUkNfSU5TVEFMTEVEX1BBSVJTKSwkKG15X2luaXRfcmNfcGFpcnMpKQotICAgICAgbXlfaW5pdF9yY19uZXdfaW5zdGFsbGVkIDo9ICQoY2FsbCBjb3B5LW1hbnktaW5pdC1zY3JpcHQtZmlsZXMtY2hlY2tlZCwkKG15X2luaXRfcmNfbmV3X3BhaXJzKSkKLQogICAgICAgQUxMX0lOSVRfUkNfSU5TVEFMTEVEX1BBSVJTICs9ICQobXlfaW5pdF9yY19uZXdfcGFpcnMpCiAKLSAgICAgICQobXlfYWxsX3RhcmdldHMpIDogJChteV9pbml0X3JjX2luc3RhbGxlZCkKKyAgICAgIGlmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKKyAgICAgICAgJChjYWxsIGNvcHktbWFueS1pbml0LXNjcmlwdC1maWxlcy1jaGVja2VkLCQobXlfaW5pdF9yY19uZXdfcGFpcnMpKQorICAgICAgICAkKG15X2FsbF90YXJnZXRzKSA6ICQobXlfaW5pdF9yY19pbnN0YWxsZWQpCisgICAgICAgICMgSW5zdGFsbCBpbml0X3JjIHRvZ2V0aGVyIHdpdGggdGhlIHRhcmdldAorICAgICAgICAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpIDogfCAkKG15X2luaXRfcmNfaW5zdGFsbGVkKQorICAgICAgZW5kaWYKICAgICBlbmRpZiAjIG15X2luaXRfcmMKIAogICBlbmRpZiAjICFMT0NBTF9JU19IT1NUX01PRFVMRQpAQCAtNzA1LDE0ICs2ODAsMzAgQEAKIAogY29weV90ZXN0X2RhdGFfcGFpcnMgOj0KIAotbXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobXlfdGVzdF9kYXRhX3BhaXJzKSkKLSQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6ICQobXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSkKK2lmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKKyAgbXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobXlfdGVzdF9kYXRhX3BhaXJzKSkKKyAgJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKTogJChteV9pbnN0YWxsZWRfdGVzdF9kYXRhKQorZWxzZQorICAjIFNraXAgaW5zdGFsbGluZyB0ZXN0IGRhdGEgZm9yIFNvb25nIG1vZHVsZXMsIGl0J3MgYWxyZWFkeSBiZWVuIGhhbmRsZWQuCisgICMgSnVzdCBjb21wdXRlIG15X2luc3RhbGxlZF90ZXN0X2RhdGEuCisgIG15X2luc3RhbGxlZF90ZXN0X2RhdGEgOj0gJChmb3JlYWNoIGYsICQobXlfdGVzdF9kYXRhX3BhaXJzKSwgJChjYWxsIHdvcmQtY29sb24sMiwkKGYpKSkKK2VuZGlmCiAKIGVuZGlmCiBlbmRpZgogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIFNPT05HIElOU1RBTEwgUEFJUlMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlY2xhcmUgZGVwZW5kZW5jaWVzIGZvciBMT0NBTF9TT09OR19JTlNUQUxMX1BBSVJTIGluIHNvb25nIHRvIHRoZSBtb2R1bGUgaXQgcmVsaWVzIG9uLgoraWZuZXEgKCwkKExPQ0FMX1NPT05HX0lOU1RBTExFRF9NT0RVTEUpKQorJChteV9hbGxfdGFyZ2V0cyk6IFwKKyAgICAkKGZvcmVhY2ggZiwgJChMT0NBTF9TT09OR19JTlNUQUxMX1BBSVJTKSxcCisgICAgICAkKHdvcmQgMiwkKHN1YnN0IDosJChzcGFjZSksJChmKSkpKQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIENvbXBhdGliaWxpdHkgc3VpdGUgZmlsZXMuCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaWZkZWYgTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURQpAQCAtNzI2LDEyICs3MTcsMTQgQEAKIGVuZGlmCiAKIGlmZXEgKCQoRVhDTFVERV9NQ1RTKSx0cnVlKQoraWZlcSAoLCQoZmlsdGVyICQoTE9DQUxfTU9EVUxFKSwkKG1jdHNfd2hpdGVsaXN0KSkpCiAgIGlmbmVxICgsJCh0ZXN0X2NvbmZpZykpCiAgICAgaWZuZXEgKCwkKGZpbHRlciBtY3RzLSUsJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSkpCiAgICAgICBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9ICQoZmlsdGVyLW91dCBjdHMsJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSkKICAgICBlbmRpZgogICBlbmRpZgogZW5kaWYKK2VuZGlmCiAKIGlmbmVxICh0cnVlLCQoTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUpKQogCkBAIC03ODUsNiArNzc4LDEwIEBACiAgICAgICAkKExPQ0FMX0JVSUxUX01PRFVMRSk6JChkaXIpLyQobXlfaW5zdGFsbGVkX21vZHVsZV9zdGVtKSkpKSBcCiAgICQoZXZhbCBteV9jb21wYXRfZGlzdF9jb25maWdfJChzdWl0ZSkgOj0gKSkKIAoraWZuZXEgKCwkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKSkKKyAgICAkKGZvcmVhY2ggc3VpdGUsICQoTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSksIFwKKyAgICAgICQoZXZhbCBteV9jb21wYXRfYXBpX21hcF8kKHN1aXRlKSArPSAkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKSkpCitlbmRpZgogCiAjIEF1dG8tZ2VuZXJhdGUgYnVpbGQgY29uZmlnLgogaWZlcSAoLCQodGVzdF9jb25maWcpKQpAQCAtODM4LDEwICs4MzUsMTYgQEAKICAgICAgICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSkpLCBcCiAgICAgICAgICQocyk6JChkaXIpLyQobikpKSkpCiAKKyAgJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCisgICAgICQoZXZhbCBteV9jb21wYXRfYXBpX21hcF8kKHN1aXRlKSArPSAkKGZvcmVhY2ggZiwgJChMT0NBTF9DT01QQVRJQklMSVRZX1NVUFBPUlRfRklMRVMpLCBcCisgICAgICAgJChldmFsIHAgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQoZikpKSBcCisgICAgICAgJChldmFsIHMgOj0gJCh3b3JkIDEsJChwKSkpIFwKKyAgICAgICAkKGlmICQoZmlsdGVyICUuYXBrLCQocykpICQoZmlsdGVyICUuamFyLCQocykpLCQocyksKSkpKQorCiAgIGlmbmVxICgsJCh0ZXN0X2NvbmZpZykpCiAgICAgJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCiAgICAgICAkKGV2YWwgbXlfY29tcGF0X2Rpc3RfY29uZmlnXyQoc3VpdGUpICs9ICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSkpLCBcCi0gICAgICAgICQodGVzdF9jb25maWcpOiQoZGlyKS8kKExPQ0FMX01PRFVMRSkuY29uZmlnKSkpCisgICAgICAgICQodGVzdF9jb25maWcpOiQoZGlyKS8kKExPQ0FMX01PRFVMRSkuY29uZmlnJChMT0NBTF9URVNUX0NPTkZJR19TVUZGSVgpKSkpCiAgIGVuZGlmCiAKICAgaWZuZXEgKCwkKExPQ0FMX0VYVFJBX0ZVTExfVEVTVF9DT05GSUdTKSkKQEAgLTg4MCw3ICs4ODMsOSBAQAogICAgICAgJChjYWxsIGZpbHRlci1jb3B5LXBhaXIsJChzcmNfcGF0aCksJChjYWxsIGFwcGVuZC1wYXRoLCQoZGlyKSwkKGZpbGUpKSwkKG15X2luc3RhbGxlZF90ZXN0X2RhdGEpKSkpIFwKICAgICAkKGV2YWwgbXlfY29tcGF0X2Rpc3RfdGVzdF9kYXRhXyQoc3VpdGUpICs9IFwKICAgICAgICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSksJChhcmNoX2RpcikpLCBcCi0gICAgICAgICQoZmlsdGVyICQobXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSksJChjYWxsIGFwcGVuZC1wYXRoLCQoZGlyKSwkKGZpbGUpKSkpKSkpCisgICAgICAgICQoZmlsdGVyICQobXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSksJChjYWxsIGFwcGVuZC1wYXRoLCQoZGlyKSwkKGZpbGUpKSkpKSBcCisgICAgJChldmFsIG15X2NvbXBhdF9hcGlfbWFwXyQoc3VpdGUpICs9IFwKKyAgICAgICQoaWYgJChmaWx0ZXIgJS5hcGssJChzcmNfcGF0aCkpICQoZmlsdGVyICUuamFyLCQoc3JjX3BhdGgpKSwkKHNyY19wYXRoKSwpKSkpCiBlbmRpZgogZWxzZQogaWZuZXEgKCQobXlfdGVzdF9kYXRhX2ZpbGVfcGFpcnMpLCkKQEAgLTg5MCw3ICs4OTUsOSBAQAogICAkKGV2YWwgZmlsZSA6PSAkKHdvcmQgMiwkKHBhcnRzKSkpIFwKICAgJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCiAgICAgJChldmFsIG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpICs9ICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSksJChhcmNoX2RpcikpLCBcCi0gICAgICAkKHNyY19wYXRoKTokKGNhbGwgYXBwZW5kLXBhdGgsJChkaXIpLCQoZmlsZSkpKSkpKQorICAgICAgJChzcmNfcGF0aCk6JChjYWxsIGFwcGVuZC1wYXRoLCQoZGlyKSwkKGZpbGUpKSkpIFwKKyAgICAkKGV2YWwgbXlfY29tcGF0X2FwaV9tYXBfJChzdWl0ZSkgKz0gXAorICAgICAgJChpZiAkKGZpbHRlciAlLmFwaywkKHNyY19wYXRoKSkgJChmaWx0ZXIgJS5qYXIsJChzcmNfcGF0aCkpLCQoc3JjX3BhdGgpLCkpKSkKIGVuZGlmCiBlbmRpZgogCkBAIC05MDIsNyArOTA5LDggQEAKICQoY2FsbCBjcmVhdGUtc3VpdGUtZGVwZW5kZW5jaWVzKQogJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCiAgICQoZXZhbCBteV9jb21wYXRfZGlzdF9jb25maWdfJChzdWl0ZSkgOj0gKSBcCi0gICQoZXZhbCBteV9jb21wYXRfZGlzdF90ZXN0X2RhdGFfJChzdWl0ZSkgOj0gKSkKKyAgJChldmFsIG15X2NvbXBhdF9kaXN0X3Rlc3RfZGF0YV8kKHN1aXRlKSA6PSApIFwKKyAgJChldmFsIG15X2NvbXBhdF9hcGlfbWFwXyQoc3VpdGUpIDo9ICkpCiAKIGVuZGlmICAjIExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFCiAKQEAgLTk2MCwxMyArOTY4LDE1IEBACiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBBVEggOj0gXAogICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5QQVRIKSAkKExPQ0FMX1BBVEgpCiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRBR1MgOj0gXAotICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQUdTKSAkKG15X21vZHVsZV90YWdzKQorICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQUdTKSAkKExPQ0FMX01PRFVMRV9UQUdTKQogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5DSEVDS0VEIDo9IFwKICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQ0hFQ0tFRCkgJChteV9jaGVja2VkX21vZHVsZSkKIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFQgOj0gXAogICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVCkgJChMT0NBTF9CVUlMVF9NT0RVTEUpCiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNPT05HX01PRFVMRV9UWVBFIDo9IFwKICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuU09PTkdfTU9EVUxFX1RZUEUpICQoTE9DQUxfU09PTkdfTU9EVUxFX1RZUEUpCitBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklTX1NPT05HX01PRFVMRSA6PSBcCisgICAgJChpZiAkKGZpbHRlciAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSksdHJ1ZSkKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQVJHRVRfQlVJTFQgOj0gXAogICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQVJHRVRfQlVJTFQpICQoTE9DQUxfQlVJTFRfTU9EVUxFKQpAQCAtOTgzLDYgKzk5Myw5IEBACiAgICAgICAkKG15X2luaXRfcmNfaW5zdGFsbGVkKSBcCiAgICAgICAkKG15X2luc3RhbGxlZF90ZXN0X2RhdGEpIFwKICAgICAgICQobXlfdmludGZfaW5zdGFsbGVkKSkKKworICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRF9TWU1MSU5LUyA6PSAkKExPQ0FMX1NPT05HX0lOU1RBTExfU1lNTElOS1MpCisKICAgIyBTdG9yZSB0aGUgbGlzdCBvZiBjb2xvbi1zZXBhcmF0ZWQgcGFpcnMgb2YgdGhlIGJ1aWx0IGFuZCBpbnN0YWxsZWQgbG9jYXRpb25zCiAgICMgb2YgZmlsZXMgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUuICBVc2VkIGJ5IGN1c3RvbSBwYWNrYWdpbmcgcnVsZXMgbGlrZQogICAjIHBhY2thZ2UtbW9kdWxlcy5tayB0aGF0IG5lZWQgdG8gY29weSB0aGUgYnVpbHQgZmlsZXMgdG8gYSBjdXN0b20gaW5zdGFsbApAQCAtOTk3LDYgKzEwMTAsMTEgQEAKICAgICAgICQobXlfaW5pdF9yY19wYWlycykgXAogICAgICAgJChteV90ZXN0X2RhdGFfcGFpcnMpIFwKICAgICAgICQobXlfdmludGZfcGFpcnMpKQorICAjIFN0b3JlIHRoZSBsaXN0IG9mIHZpbnRmL2luaXRfcmMgYXMgb3JkZXItb25seSBkZXBlbmRlbmNpZXMKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5PUkRFUk9OTFlfSU5TVEFMTEVEIDo9IFwKKyAgICAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5PUkRFUk9OTFlfSU5TVEFMTEVEKSBcCisgICAgICAkKG15X2luaXRfcmNfaW5zdGFsbGVkKSBcCisgICAgICAkKG15X3ZpbnRmX2luc3RhbGxlZCkpCiBlbHNlIGlmbmVxICh0cnVlLCQoTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUpKQogICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRCA6PSBcCiAgICAgJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEKSBcCkBAIC0xMDA2LDcgKzEwMjQsMjEgQEAKICAgICAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVF9JTlNUQUxMRUQpIFwKICAgICAkKExPQ0FMX0JVSUxUX01PRFVMRSk6JChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKSBcCiAgICAgJChteV9pbml0X3JjX3BhaXJzKSAkKG15X3Rlc3RfZGF0YV9wYWlycykgJChteV92aW50Zl9wYWlycykpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuT1JERVJPTkxZX0lOU1RBTExFRCA6PSBcCisgICAgJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuT1JERVJPTkxZX0lOU1RBTExFRCkgXAorICAgICAgJChteV9pbml0X3JjX2luc3RhbGxlZCkgXAorICAgICAgJChteV92aW50Zl9pbnN0YWxsZWQpKQogZW5kaWYKKworIyBNYXJrIExPQ0FMX1NPT05HX0lOU1RBTExfU1lNTElOS1MgYXMgaW5zdGFsbGVkIGlmIHdlJ3JlIGluc3RhbGxpbmcgYW55IGtpbmQgb2YgbW9kdWxlLCBub3QganVzdAorIyBvbmVzIHRoYXQgc2V0IExPQ0FMX1NPT05HX0lOU1RBTExFRF9NT0RVTEUuIFRoaXMgaXMgc28gd2UgY2FuIGhhdmUgYSBzb29uZyBtb2R1bGUgdGhhdCBvbmx5CisjIGluc3RhbGxzIHN5bWxpbmtzIChlLmcuIGluc3RhbGxlZF9zeW1saW5rKS4gV2UgY2FuJ3Qgc2V0IExPQ0FMX1NPT05HX0lOU1RBTExFRF9NT0RVTEUgdG8gYSBzeW1saW5rCisjIGJlY2F1c2UgY3AgY29tbWFuZHMgd2lsbCBmYWlsIG9uIHN5bWxpbmtzLgoraWZuZXEgKCwkKG9yICQoTE9DQUxfU09PTkdfSU5TVEFMTEVEX01PRFVMRSksJChjYWxsIGJvb2xlYW4tbm90LCQoTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUpKSkpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUykKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRURfU1lNTElOS1MgOj0gJChMT0NBTF9TT09OR19JTlNUQUxMX1NZTUxJTktTKQorZW5kaWYKKwogaWZkZWYgTE9DQUxfUElDS1VQX0ZJTEVTCiAjIEZpbGVzIG9yIGRpcmVjdG9yaWVzIHJlYWR5IHRvIHBpY2sgdXAgYnkgdGhlIGJ1aWxkIHN5c3RlbQogIyB3aGVuICQoTE9DQUxfQlVJTFRfTU9EVUxFKSBpcyBkb25lLgpAQCAtMTAzMCw0OCArMTA2Miw5NCBAQAogbXlfcmVxdWlyZWRfbW9kdWxlcyArPSAkKExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfJCgkKG15X3ByZWZpeClPUykpCiBlbmRpZgogCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNIQVJFRF9MSUJTIDo9IFwKLSAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuU0hBUkVEX0xJQlMpICQoTE9DQUxfU0hBUkVEX0xJQlJBUklFUykKLQotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TWVNURU1fU0hBUkVEX0xJQlMgOj0gXAotICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TWVNURU1fU0hBUkVEX0xJQlMpICQoTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMpCi0KLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTE9DQUxfUlVOVElNRV9MSUJSQVJJRVMgOj0gXAotICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5MT0NBTF9SVU5USU1FX0xJQlJBUklFUykgJChMT0NBTF9SVU5USU1FX0xJQlJBUklFUykgXAotICAgICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCi0KLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpICQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKQotCi1pZmRlZiBMT0NBTF9URVNUX0RBVEEKLSAgIyBFeHBvcnQgdGhlIGxpc3Qgb2YgdGFyZ2V0cyB0aGF0IGFyZSBoYW5kbGVkIGFzIGRhdGEgaW5wdXRzIGFuZCByZXF1aXJlZAotICAjIGJ5IHRlc3RzIGF0IHJ1bnRpbWUuIFRoZSBMT0NBTF9URVNUX0RBVEEgZm9ybWF0IGlzIGdlbmVyYXRlZCBmcm9tIGJlbG93Ci0gICMgaHR0cHM6Ly9jcy5hbmRyb2lkLmNvbS9hbmRyb2lkL3BsYXRmb3JtL3N1cGVycHJvamVjdC8rL21hc3RlcjpidWlsZC9zb29uZy9hbmRyb2lkL2FuZHJvaWRtay5nbztsPTkyNS05NDQ7ZHJjPW1hc3RlcgotICAjIHdoaWNoIGZvcm1hdCBpcyBsaWtlICQocGF0aCk6JChyZWxhdGl2ZV9maWxlKSBidXQgZm9yIG1vZHVsZS1pbmZvLCBvbmx5Ci0gICMgdGhlIHN0cmluZyBhZnRlciAiOiIgaXMgbmVlZGVkLgotICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRFU1RfREFUQSA6PSBcCi0gICAgJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9EQVRBKSBcCi0gICAgICAkKGZvcmVhY2ggZiwgJChMT0NBTF9URVNUX0RBVEEpLFwKLSAgICAgICAgJChjYWxsIHdvcmQtY29sb24sMiwkKGYpKSkpCitpZmRlZiBMT0NBTF9BQ09ORklHX0ZJTEVTCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQUNPTkZJR19GSUxFUyA6PSBcCisgICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQUNPTkZJR19GSUxFUykgJChMT0NBTF9BQ09ORklHX0ZJTEVTKQogZW5kaWYKIAotaWZkZWYgTE9DQUxfVEVTVF9EQVRBX0JJTlMKLSAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5URVNUX0RBVEFfQklOUyA6PSBcCi0gICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRFU1RfREFUQV9CSU5TKSAkKExPQ0FMX1RFU1RfREFUQV9CSU5TKQoraWZkZWYgTE9DQUxfRklMRVNZU1RFTV9GSUxFTElTVAorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkZJTEVTWVNURU1fRklMRUxJU1QgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkZJTEVTWVNURU1fRklMRUxJU1QpICQoTE9DQUxfRklMRVNZU1RFTV9GSUxFTElTVCkKIGVuZGlmCiAKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuU1VQUE9SVEVEX1ZBUklBTlRTIDo9IFwKLSAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNVUFBPUlRFRF9WQVJJQU5UUykgXAotICAkKGZpbHRlci1vdXQgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNVUFBPUlRFRF9WQVJJQU5UUyksJChteV9zdXBwb3J0ZWRfdmFyaWFudCkpCitpZm5kZWYgTE9DQUxfU09PTkdfTU9EVUxFX0lORk9fSlNPTgorICBBTExfTUFLRV9NT0RVTEVfSU5GT19KU09OX01PRFVMRVMgKz0gJChteV9yZWdpc3Rlcl9uYW1lKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNIQVJFRF9MSUJTIDo9IFwKKyAgICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TSEFSRURfTElCUykgJChMT0NBTF9TSEFSRURfTElCUkFSSUVTKQorCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuU1RBVElDX0xJQlMgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNUQVRJQ19MSUJTKSAkKExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpCisKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TWVNURU1fU0hBUkVEX0xJQlMgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNZU1RFTV9TSEFSRURfTElCUykgJChMT0NBTF9TWVNURU1fU0hBUkVEX0xJQlJBUklFUykKKworICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxPQ0FMX1JVTlRJTUVfTElCUkFSSUVTIDo9IFwKKyAgICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5MT0NBTF9SVU5USU1FX0xJQlJBUklFUykgJChMT0NBTF9SVU5USU1FX0xJQlJBUklFUykgXAorICAgICAgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKKworICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpICQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKQorCisgIGlmbmVxICgkKG15X3Rlc3RfZGF0YV9maWxlX3BhaXJzKSwpCisgICAgIyBFeHBvcnQgdGhlIGxpc3Qgb2YgdGFyZ2V0cyB0aGF0IGFyZSBoYW5kbGVkIGFzIGRhdGEgaW5wdXRzIGFuZCByZXF1aXJlZAorICAgICMgYnkgdGVzdHMgYXQgcnVudGltZS4gVGhlIGZvcm1hdCBvZiBteV90ZXN0X2RhdGFfZmlsZV9wYWlycyBpcworICAgICMgaXMgJChwYXRoKTokKHJlbGF0aXZlX2ZpbGUpIGJ1dCBmb3IgbW9kdWxlLWluZm8sIG9ubHkgdGhlIHN0cmluZyBhZnRlcgorICAgICMgIjoiIGlzIG5lZWRlZC4KKyAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRFU1RfREFUQSA6PSBcCisgICAgICAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5URVNUX0RBVEEpIFwKKyAgICAgICAgJChmb3JlYWNoIGYsICQobXlfdGVzdF9kYXRhX2ZpbGVfcGFpcnMpLFwKKyAgICAgICAgICAkKGNhbGwgd29yZC1jb2xvbiwyLCQoZikpKSkKKyAgZW5kaWYKKworICBpZmRlZiBMT0NBTF9URVNUX0RBVEFfQklOUworICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9EQVRBX0JJTlMgOj0gXAorICAgICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9EQVRBX0JJTlMpICQoTE9DQUxfVEVTVF9EQVRBX0JJTlMpCisgIGVuZGlmCisKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TVVBQT1JURURfVkFSSUFOVFMgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNVUFBPUlRFRF9WQVJJQU5UUykgXAorICAgICAgJChmaWx0ZXItb3V0ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TVVBQT1JURURfVkFSSUFOVFMpLCQobXlfc3VwcG9ydGVkX3ZhcmlhbnQpKQorCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQ09NUEFUSUJJTElUWV9TVUlURVMgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkNPTVBBVElCSUxJVFlfU1VJVEVTKSAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTU9EVUxFX05BTUUgOj0gJChMT0NBTF9NT0RVTEUpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9DT05GSUcgOj0gJCh0ZXN0X2NvbmZpZykKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5FWFRSQV9URVNUX0NPTkZJR1MgOj0gJChMT0NBTF9FWFRSQV9GVUxMX1RFU1RfQ09ORklHUykKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5URVNUX01BSU5MSU5FX01PRFVMRVMgOj0gJChMT0NBTF9URVNUX01BSU5MSU5FX01PRFVMRVMpCisgIGlmZGVmIExPQ0FMX0lTX1VOSVRfVEVTVAorICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSVNfVU5JVF9URVNUIDo9ICQoTE9DQUxfSVNfVU5JVF9URVNUKQorICBlbmRpZgorICBpZmRlZiBMT0NBTF9URVNUX09QVElPTlNfVEFHUworICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9PUFRJT05TX1RBR1MgOj0gJChMT0NBTF9URVNUX09QVElPTlNfVEFHUykKKyAgZW5kaWYKKworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMgVHJhY2sgbW9kdWxlLWxldmVsIGRlcGVuZGVuY2llcy4KKyAgIyAoYi8yMDQzOTcxODApIFVubG9jayBSRUNPUkRfQUxMX0RFUFMgd2FzIGFja25vd2xlZGdlZCByZWFzb25hYmxlIGZvciBiZXR0ZXIgQXRlc3QgcGVyZm9ybWFuY2UuCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQUxMX0RFUFMgOj0gXAorICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5BTExfREVQUykgXAorICAgICQoTE9DQUxfU1RBVElDX0xJQlJBUklFUykgXAorICAgICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgXAorICAgICQoTE9DQUxfU0hBUkVEX0xJQlJBUklFUykgXAorICAgICQoTE9DQUxfRFlMSUJfTElCUkFSSUVTKSBcCisgICAgJChMT0NBTF9STElCX0xJQlJBUklFUykgXAorICAgICQoTE9DQUxfUFJPQ19NQUNST19MSUJSQVJJRVMpIFwKKyAgICAkKExPQ0FMX0hFQURFUl9MSUJSQVJJRVMpIFwKKyAgICAkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUykgXAorICAgICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpIFwKKyAgICAkKExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTKQorCitlbmRpZgorQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5URVNUX01PRFVMRV9DT05GSUdfQkFTRSA6PSAkKExPQ0FMX1RFU1RfTU9EVUxFX0NPTkZJR19CQVNFKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgV2hlbiBjb21waWxpbmcgYWdhaW5zdCBBUEkgaW1wb3J0ZWQgbW9kdWxlLCB1c2UgQVBJIGltcG9ydCBzdHViCiAjIyBsaWJyYXJpZXMuCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaWZuZXEgKCQoTE9DQUxfVVNFX1ZOREspLCkKK2lmbmVxICgkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSwpCiAgIGlmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKICAgICBhcGlpbXBvcnRfcG9zdGZpeCA6PSAuYXBpaW1wb3J0Ci0gICAgaWZlcSAoJChMT0NBTF9VU0VfVk5ES19QUk9EVUNUKSx0cnVlKQorICAgIGlmZXEgKCQoTE9DQUxfSU5fUFJPRFVDVCksdHJ1ZSkKICAgICAgIGFwaWltcG9ydF9wb3N0Zml4IDo9IC5hcGlpbXBvcnQucHJvZHVjdAogICAgIGVsc2UKICAgICAgIGFwaWltcG9ydF9wb3N0Zml4IDo9IC5hcGlpbXBvcnQudmVuZG9yCkBAIC0xMDg2LDcgKzExNjQsNyBAQAogIyMgV2hlbiBjb21waWxpbmcgYWdhaW5zdCB0aGUgVk5ESywgYWRkIHRoZSAudmVuZG9yIG9yIC5wcm9kdWN0IHN1ZmZpeCB0bwogIyMgcmVxdWlyZWQgbW9kdWxlcy4KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZm5lcSAoJChMT0NBTF9VU0VfVk5ESyksKQoraWZuZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLCkKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyMgU29vbmcgbW9kdWxlcyBtYXkgYmUgYnVpbHQgdGhyZWUgdGltZXMsIG9uY2UgZm9yCiAgICMjIC9zeXN0ZW0sIG9uY2UgZm9yIC92ZW5kb3IgYW5kIG9uY2UgZm9yIC9wcm9kdWN0LgpAQCAtMTA5Nyw3ICsxMTc1LDcgQEAKICAgICAjIFdlIGRvbid0IGRvIHRoaXMgcmVuYW1pbmcgZm9yIHNvb25nLWRlZmluZWQgbW9kdWxlcyBzaW5jZSB0aGV5IGFscmVhZHkKICAgICAjIGhhdmUgY29ycmVjdCBuYW1lcyAod2l0aCAudmVuZG9yIG9yIC5wcm9kdWN0IHN1ZmZpeCB3aGVuIG5lY2Vzc2FyeSkgaW4KICAgICAjIHRoZWlyIExPQ0FMXypfTElCUkFSSUVTLgotICAgIGlmZXEgKCQoTE9DQUxfVVNFX1ZOREtfUFJPRFVDVCksdHJ1ZSkKKyAgICBpZmVxICgkKExPQ0FMX0lOX1BST0RVQ1QpLHRydWUpCiAgICAgICBteV9yZXF1aXJlZF9tb2R1bGVzIDo9ICQoZm9yZWFjaCBsLCQobXlfcmVxdWlyZWRfbW9kdWxlcyksXAogICAgICAgICAkKGlmICQoU1BMSVRfUFJPRFVDVC5TSEFSRURfTElCUkFSSUVTLiQobCkpLCQobCkucHJvZHVjdCwkKGwpKSkKICAgICBlbHNlCkBAIC0xMTQzLDcwICsxMjIxLDMxIEBACiAgICAgICAgICQoY2FsbCBwcmV0dHktZXJyb3IsTE9DQUxfVEFSR0VUX1JFUVVJUkVEX01PRFVMRVMgbWF5IG5vdCBiZSB1c2VkIGZyb20gdGFyZ2V0IG1vZHVsZXMuIFVzZSBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIGluc3RlYWQpCiAgICAgZW5kaWYKIGVuZGlmCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkVWRU5UX0xPR19UQUdTIDo9IFwKLSAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRVZFTlRfTE9HX1RBR1MpICQoZXZlbnRfbG9nX3RhZ3MpCisKK2lmZGVmIGV2ZW50X2xvZ190YWdzCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRVZFTlRfTE9HX1RBR1MgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkVWRU5UX0xPR19UQUdTKSAkKGV2ZW50X2xvZ190YWdzKQorZW5kaWYKKwogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFRklMRSA6PSBcCiAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VGSUxFKSAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSkKKwogaWZkZWYgTE9DQUxfTU9EVUxFX09XTkVSCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk9XTkVSIDo9IFwKLSAgICAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk9XTkVSKSAkKExPQ0FMX01PRFVMRV9PV05FUikpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuT1dORVIgOj0gXAorICAgICAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5PV05FUikgJChMT0NBTF9NT0RVTEVfT1dORVIpKQogZW5kaWYKKwogaWZkZWYgTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWAogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5GT1JfMk5EX0FSQ0ggOj0gdHJ1ZQogZW5kaWYKIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRk9SX0hPU1RfQ1JPU1MgOj0gJChteV9ob3N0X2Nyb3NzKQotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NT0RVTEVfTkFNRSA6PSAkKExPQ0FMX01PRFVMRSkKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQ09NUEFUSUJJTElUWV9TVUlURVMgOj0gXAotICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQ09NUEFUSUJJTElUWV9TVUlURVMpIFwKLSAgJChmaWx0ZXItb3V0ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5DT01QQVRJQklMSVRZX1NVSVRFUyksJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSkKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9DT05GSUcgOj0gJCh0ZXN0X2NvbmZpZykKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRVhUUkFfVEVTVF9DT05GSUdTIDo9ICQoTE9DQUxfRVhUUkFfRlVMTF9URVNUX0NPTkZJR1MpCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRFU1RfTUFJTkxJTkVfTU9EVUxFUyA6PSAkKExPQ0FMX1RFU1RfTUFJTkxJTkVfTU9EVUxFUykKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5GSUxFX0NPTlRFWFRTIDo9ICQoTE9DQUxfRklMRV9DT05URVhUUykKLWVuZGlmCi1pZmRlZiBMT0NBTF9JU19VTklUX1RFU1QKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSVNfVU5JVF9URVNUIDo9ICQoTE9DQUxfSVNfVU5JVF9URVNUKQotZW5kaWYKLWlmZGVmIExPQ0FMX1RFU1RfT1BUSU9OU19UQUdTCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRFU1RfT1BUSU9OU19UQUdTIDo9ICQoTE9DQUxfVEVTVF9PUFRJT05TX1RBR1MpCitBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkFQRVhfS0VZU19GSUxFIDo9ICQoTE9DQUxfQVBFWF9LRVlfUEFUSCkKIGVuZGlmCiB0ZXN0X2NvbmZpZyA6PQogCiBJTlNUQUxMQUJMRV9GSUxFUy4kKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpLk1PRFVMRSA6PSAkKG15X3JlZ2lzdGVyX25hbWUpCiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVHJhY2sgbW9kdWxlLWxldmVsIGRlcGVuZGVuY2llcy4KLSMgVXNlICQoTE9DQUxfTU9EVUxFKSBpbnN0ZWFkIG9mICQobXlfcmVnaXN0ZXJfbmFtZSkgdG8gaWdub3JlIG1vZHVsZSdzIGJpdG5lc3MuCi0jIChiLzIwNDM5NzE4MCkgVW5sb2NrIFJFQ09SRF9BTExfREVQUyB3YXMgYWNrbm93bGVkZ2VkIHJlYXNvbmFibGUgZm9yIGJldHRlciBBdGVzdCBwZXJmb3JtYW5jZS4KLUFMTF9ERVBTLk1PRFVMRVMgKz0gJChMT0NBTF9NT0RVTEUpCi1BTExfREVQUy4kKExPQ0FMX01PRFVMRSkuQUxMX0RFUFMgOj0gJChzb3J0IFwKLSAgJChBTExfREVQUy4kKExPQ0FMX01PRFVMRSkuQUxMX0RFUFMpIFwKLSAgJChMT0NBTF9TVEFUSUNfTElCUkFSSUVTKSBcCi0gICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgXAotICAkKExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMpIFwKLSAgJChMT0NBTF9EWUxJQl9MSUJSQVJJRVMpIFwKLSAgJChMT0NBTF9STElCX0xJQlJBUklFUykgXAotICAkKExPQ0FMX1BST0NfTUFDUk9fTElCUkFSSUVTKSBcCi0gICQoTE9DQUxfSEVBREVSX0xJQlJBUklFUykgXAotICAkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUykgXAotICAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSBcCi0gICQoTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMpKQotCi1saWNlbnNlX2ZpbGVzIDo9ICQoY2FsbCBmaW5kLXBhcmVudC1maWxlLCQoTE9DQUxfUEFUSCksTU9EVUxFX0xJQ0VOU0UqKQotQUxMX0RFUFMuJChMT0NBTF9NT0RVTEUpLkxJQ0VOU0UgOj0gJChzb3J0ICQoQUxMX0RFUFMuJChMT0NBTF9NT0RVTEUpLkxJQ0VOU0UpICQobGljZW5zZV9maWxlcykpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBUYWtlIGNhcmUgb2YgbXlfbW9kdWxlX3RhZ3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgS2VlcCB0cmFjayBvZiBhbGwgdGhlIHRhZ3Mgd2UndmUgc2Vlbi4KLUFMTF9NT0RVTEVfVEFHUyA6PSAkKHNvcnQgJChBTExfTU9EVUxFX1RBR1MpICQobXlfbW9kdWxlX3RhZ3MpKQotCi0jIEFkZCB0aGlzIG1vZHVsZSBuYW1lIHRvIHRoZSB0YWcgbGlzdCBvZiBlYWNoIHNwZWNpZmllZCB0YWcuCi0kKGZvcmVhY2ggdGFnLCQoZmlsdGVyLW91dCBvcHRpb25hbCwkKG15X21vZHVsZV90YWdzKSksXAotICAgICQoZXZhbCBBTExfTU9EVUxFX05BTUVfVEFHUy4kKHRhZykgOj0gJCQoQUxMX01PRFVMRV9OQU1FX1RBR1MuJCh0YWcpKSAkKG15X3JlZ2lzdGVyX25hbWUpKSkKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIHVtYnJlbGxhIHRhcmdldHMgdXNlZCB0byB2ZXJpZnkgYnVpbGRzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTIzMyw3ICsxMjcyLDcgQEAKIAogaWZkZWYgal9vcl9uCiAkKGpfb3JfbikgJChoX29yX3QpICQoal9vcl9uKS0kKGhfb3JfaGNfb3JfdCkgOiAkKG15X2NoZWNrZWRfbW9kdWxlKQotaWZuZXEgKCwkKGZpbHRlciAkKG15X21vZHVsZV90YWdzKSx0ZXN0cykpCitpZm5lcSAoLCQoZmlsdGVyICQoTE9DQUxfTU9EVUxFX1RBR1MpLHRlc3RzKSkKICQoal9vcl9uKS0kKGhfb3JfdCktdGVzdHMgJChqX29yX24pLXRlc3RzICQoaF9vcl90KS10ZXN0cyA6ICQobXlfY2hlY2tlZF9tb2R1bGUpCiBlbmRpZgogJChMT0NBTF9NT0RVTEUpLSQoaF9vcl9oY19vcl90KSA6ICQobXlfYWxsX3RhcmdldHMpCkBAIC0xMjQ0LDYgKzEyODMsOCBAQAogZW5kaWYKIGVuZGlmCiAKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1iYXNlX3J1bGVzKSkKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgRW5zdXJlIHByaXZpbGVnZWQgYXBwbGljYXRpb25zIGFsd2F5cyBoYXZlIExPQ0FMX1BSSVZJTEVHRURfTU9EVUxFCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTI2Miw0ICsxMzAzLDQgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBTQk9NIGdlbmVyYXRpb24KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pbmNsdWRlICQoQlVJTERfU0JPTV9HRU4pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW5jbHVkZSAkKEJVSUxEX1NCT01fR0VOKQpkaWZmIC0tZ2l0IGEvY29yZS9iaW5hcnkubWsgYi9jb3JlL2JpbmFyeS5tawppbmRleCA1NzllNmI1Li4wYmM5NDY5IDEwMDY0NAotLS0gYS9jb3JlL2JpbmFyeS5taworKysgYi9jb3JlL2JpbmFyeS5tawpAQCAtMTQ1LDE1ICsxNDUsMjEgQEAKIGlmbmVxICgsJChzdHJpcCAkKGZvcmVhY2ggZGlyLCQoTkFUSVZFX0NPVkVSQUdFX1BBVEhTKSwkKGZpbHRlciAkKGRpciklLCQoTE9DQUxfUEFUSCkpKSkpCiBpZmVxICgsJChzdHJpcCAkKGZvcmVhY2ggZGlyLCQoTkFUSVZFX0NPVkVSQUdFX0VYQ0xVREVfUEFUSFMpLCQoZmlsdGVyICQoZGlyKSUsJChMT0NBTF9QQVRIKSkpKSkKICAgbXlfbmF0aXZlX2NvdmVyYWdlIDo9IHRydWUKKyAgbXlfY2xhbmdfY292ZXJhZ2UgOj0gdHJ1ZQogZWxzZQogICBteV9uYXRpdmVfY292ZXJhZ2UgOj0gZmFsc2UKKyAgbXlfY2xhbmdfY292ZXJhZ2UgOj0gZmFsc2UKIGVuZGlmCiBlbHNlCiAgIG15X25hdGl2ZV9jb3ZlcmFnZSA6PSBmYWxzZQorICBteV9jbGFuZ19jb3ZlcmFnZSA6PSBmYWxzZQogZW5kaWYKIGlmbmVxICgkKE5BVElWRV9DT1ZFUkFHRSksdHJ1ZSkKICAgbXlfbmF0aXZlX2NvdmVyYWdlIDo9IGZhbHNlCiBlbmRpZgoraWZuZXEgKCQoQ0xBTkdfQ09WRVJBR0UpLHRydWUpCisgIG15X2NsYW5nX2NvdmVyYWdlIDo9IGZhbHNlCitlbmRpZgogCiAjIEV4Y2x1ZGUgZGlyZWN0b3JpZXMgZnJvbSBjaGVja2luZyBhbGxvd2VkIG1hbnVhbCBiaW5kZXIgaW50ZXJmYWNlIGxpc3RzLgogIyBUT0RPKGIvMTQ1NjIxNDc0KTogTW92ZSB0aGlzIGNoZWNrIGludG8gSUludGVyZmFjZS5oIHdoZW4gY2xhbmctdGlkeSBubyBsb25nZXIgdXNlcyBhYnNvbHV0ZSBwYXRocy4KQEAgLTI1MiwxMyArMjU4LDYgQEAKICAgICAgIG15X25ka19zdGxfc2hhcmVkX2xpYl9mdWxscGF0aCA6PSAkKG15X2xpYmN4eF9saWJkaXIpL2xpYmMrK19zaGFyZWQuc28KICAgICBlbmRpZgogCi0gICAgaWZuZXEgKCQobXlfbmRrX2FwaSksY3VycmVudCkKLSAgICAgIGlmZXEgKCQoY2FsbCBtYXRoX2x0LCQobXlfbmRrX2FwaSksMjEpLHRydWUpCi0gICAgICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoICs9ICQobXlfbmRrX3NvdXJjZV9yb290KS9hbmRyb2lkL3N1cHBvcnQvaW5jbHVkZQotICAgICAgICBteV9uZGtfc3RsX3N0YXRpY19saWIgKz0gJChteV9saWJjeHhfbGliZGlyKS9saWJhbmRyb2lkX3N1cHBvcnQuYQotICAgICAgZW5kaWYKLSAgICBlbmRpZgotCiAgICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliICs9ICQobXlfbGliY3h4X2xpYmRpcikvbGlidW53aW5kLmEKICAgICBteV9sZGxpYnMgKz0gLWxkbAogICBlbHNlICMgTE9DQUxfTkRLX1NUTF9WQVJJQU5UIG11c3QgYmUgbm9uZQpAQCAtMjcwLDEwICsyNjksMTggQEAKICAgaWZuZXEgKCQobXlfbmRrX2FwaSksY3VycmVudCkKICAgICBpZmVxICgkKGNhbGwgbWF0aF9sdCwgJChteV9uZGtfYXBpKSwyMyksdHJ1ZSkKICAgICAgIG15X25hdGl2ZV9jb3ZlcmFnZSA6PSBmYWxzZQorICAgICAgbXlfY2xhbmdfY292ZXJhZ2UgOj0gZmFsc2UKICAgICBlbmRpZgogICBlbmRpZgogZW5kaWYKIAoraWZuZXEgKCQoTE9DQUxfTUlOX1NES19WRVJTSU9OKSwpCisgIGlmZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCisgICAgJChlcnJvciAkKExPQ0FMX1BBVEgpOiBMT0NBTF9NSU5fU0RLX1ZFUlNJT04gY2Fubm90IGJlIHVzZWQgaW4gaG9zdCBtb2R1bGUpCisgIGVuZGlmCisgIG15X2FwaV9sZXZlbCA6PSAkKExPQ0FMX01JTl9TREtfVkVSU0lPTikKK2VuZGlmCisKIGlmZXEgKCQoTkFUSVZFX0NPVkVSQUdFKSx0cnVlKQogICBpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKICAgICBteV9sZGZsYWdzICs9IC1XbCwtLXdyYXAsZ2V0ZW52CkBAIC0yODgsMjYgKzI5NSw1MSBAQAogICBlbmRpZgogZW5kaWYKIAotaWZuZXEgKCQoTE9DQUxfVVNFX1ZOREspLCkKLSAgIyBSZXF1aXJlZCBWTkRLIHZlcnNpb24gZm9yIHZlbmRvciBtb2R1bGVzIGlzIEJPQVJEX1ZOREtfVkVSU0lPTi4KLSAgbXlfYXBpX2xldmVsIDo9ICQoQk9BUkRfVk5ES19WRVJTSU9OKQotICBpZmVxICgkKG15X2FwaV9sZXZlbCksY3VycmVudCkKLSAgICAjIEJ1aWxkIHdpdGggY3VycmVudCBQTEFURk9STV9WTkRLX1ZFUlNJT04uCi0gICAgIyBJZiBQTEFURk9STV9WTkRLX1ZFUlNJT04gaGFzIGEgQ09ERU5BTUUsIGl0IHdpbGwgcmV0dXJuCi0gICAgIyBfX0FORFJPSURfQVBJX0ZVVFVSRV9fLgotICAgIG15X2FwaV9sZXZlbCA6PSAkKGNhbGwgY29kZW5hbWUtb3Itc2RrLXRvLXNkaywkKFBMQVRGT1JNX1ZOREtfVkVSU0lPTikpCi0gIGVsc2UKLSAgICAjIEJ1aWxkIHdpdGggY3VycmVudCBCT0FSRF9WTkRLX1ZFUlNJT04uCi0gICAgbXlfYXBpX2xldmVsIDo9ICQoY2FsbCBjb2RlbmFtZS1vci1zZGstdG8tc2RrLCQoQk9BUkRfVk5ES19WRVJTSU9OKSkKK2lmZXEgKCQoQ0xBTkdfQ09WRVJBR0UpLHRydWUpCisgIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQorICAgIG15X2xkZmxhZ3MgKz0gJChDTEFOR19DT1ZFUkFHRV9IT1NUX0xERkxBR1MpCisgICAgaWZuZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSxTVEFUSUNfTElCUkFSSUVTKQorICAgICAgbXlfd2hvbGVfc3RhdGljX2xpYnJhcmllcyArPSBsaWJjbGFuZ19ydC5wcm9maWxlCisgICAgICBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSwpCisgICAgICAgIG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMgKz0gbGlicHJvZmlsZS1jbGFuZy1leHRyYXMKKyAgICAgIGVsc2UKKyAgICAgICAgbXlfd2hvbGVfc3RhdGljX2xpYnJhcmllcyArPSBsaWJwcm9maWxlLWNsYW5nLWV4dHJhc19uZGsKKyAgICAgIGVuZGlmCisgICAgZW5kaWYKICAgZW5kaWYKKyAgaWZlcSAoJChteV9jbGFuZ19jb3ZlcmFnZSksdHJ1ZSkKKyAgICBteV9wcm9maWxlX2luc3RyX2dlbmVyYXRlIDo9ICQoQ0xBTkdfQ09WRVJBR0VfSU5TVFJfUFJPRklMRSkKKyAgICBpZmVxICgkKENMQU5HX0NPVkVSQUdFX0NPTlRJTlVPVVNfTU9ERSksdHJ1ZSkKKyAgICAgIG15X2NmbGFncyArPSAkKENMQU5HX0NPVkVSQUdFX0NPTlRJTlVPVVNfRkxBR1MpCisgICAgICBteV9sZGZsYWdzICs9ICQoQ0xBTkdfQ09WRVJBR0VfQ09OVElOVU9VU19GTEFHUykKKyAgICBlbmRpZgorCisgICAgbXlfcHJvZmlsZV9pbnN0cl9nZW5lcmF0ZSArPSAkKENMQU5HX0NPVkVSQUdFX0NPTkZJR19DT01NRkxBR1MpCisgICAgbXlfY2ZsYWdzICs9ICQoQ0xBTkdfQ09WRVJBR0VfSU5TVFJfUFJPRklMRSkgJChDTEFOR19DT1ZFUkFHRV9DT05GSUdfQ0ZMQUdTKSAkKENMQU5HX0NPVkVSQUdFX0NPTkZJR19DT01NRkxBR1MpCisgICAgbXlfbGRmbGFncyArPSAkKENMQU5HX0NPVkVSQUdFX0NPTkZJR19DT01NRkxBR1MpCisKKyAgICBpZm5lcSAoJChmaWx0ZXIgaHdhZGRyZXNzLCQobXlfc2FuaXRpemUpKSwpCisgICAgICBteV9jZmxhZ3MgKz0gJChDTEFOR19DT1ZFUkFHRV9IV0FTQU5fRkxBR1MpCisgICAgICBteV9sZGZsYWdzICs9ICQoQ0xBTkdfQ09WRVJBR0VfSFdBU0FOX0ZMQUdTKQorICAgIGVuZGlmCisgIGVuZGlmCitlbmRpZgorCitpZm5lcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksKQogICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfVk5ES19fCi0gIGlmbmVxICgkKExPQ0FMX1VTRV9WTkRLX1ZFTkRPUiksKQotICAgICMgVmVuZG9yIG1vZHVsZXMgaGF2ZSBMT0NBTF9VU0VfVk5ES19WRU5ET1Igd2hlbgotICAgICMgQk9BUkRfVk5ES19WRVJTSU9OIGlzIGRlZmluZWQuCisgIGlmbmVxICgkKExPQ0FMX0lOX1ZFTkRPUiksKQorICAgICMgVmVuZG9yIG1vZHVsZXMgaGF2ZSBMT0NBTF9JTl9WRU5ET1IKICAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfVkVORE9SX18KLSAgZWxzZSBpZm5lcSAoJChMT0NBTF9VU0VfVk5ES19QUk9EVUNUKSwpCi0gICAgIyBQcm9kdWN0IG1vZHVsZXMgaGF2ZSBMT0NBTF9VU0VfVk5ES19QUk9EVUNUIHdoZW4KLSAgICAjIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04gaXMgZGVmaW5lZC4KKworICAgIGlmZXEgKCQoQk9BUkRfQVBJX0xFVkVMKSwpCisgICAgICAjIFRPRE8oYi8zMTQwMzY4NDcpOiBUaGlzIGlzIGEgZmFsbGJhY2sgZm9yIFVEQyB0YXJnZXRzLgorICAgICAgIyBUaGlzIG11c3QgYmUgYSBidWlsZCBmYWlsdXJlIHdoZW4gVURDIGlzIG5vIGxvbmdlciBidWlsdCBmcm9tIHRoaXMgc291cmNlIHRyZWUuCisgICAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfVkVORE9SX0FQSV9fPSQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCisgICAgZWxzZQorICAgICAgbXlfY2ZsYWdzICs9IC1EX19BTkRST0lEX1ZFTkRPUl9BUElfXz0kKEJPQVJEX0FQSV9MRVZFTCkKKyAgICBlbmRpZgorICBlbHNlIGlmbmVxICgkKExPQ0FMX0lOX1BST0RVQ1QpLCkKKyAgICAjIFByb2R1Y3QgbW9kdWxlcyBoYXZlIExPQ0FMX0lOX1BST0RVQ1QKICAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfUFJPRFVDVF9fCiAgIGVuZGlmCiBlbmRpZgpAQCAtMzU0LDE3ICszODYsMTUgQEAKICMgTWluR1cgc3BpdHMgb3V0IHdhcm5pbmdzIGFib3V0IC1mUElDIGV2ZW4gZm9yIC1mcGllPyEpIGJlaW5nIGlnbm9yZWQgYmVjYXVzZQogIyBhbGwgY29kZSBpcyBwb3NpdGlvbiBpbmRlcGVuZGVudCwgYW5kIHRoZW4gdGhvc2Ugd2FybmluZ3MgZ2V0IHByb21vdGVkIHRvCiAjIGVycm9ycy4KLWlmbmVxICgkKExPQ0FMX05PX1BJQyksdHJ1ZSkKLSAgaWZuZXEgKCQoZmlsdGVyIEVYRUNVVEFCTEVTIE5BVElWRV9URVNUUywkKExPQ0FMX01PRFVMRV9DTEFTUykpLCkKLSAgICBteV9jZmxhZ3MgKz0gLWZQSUUKLSAgICBpZm5kZWYgQlVJTERfSE9TVF9zdGF0aWMKLSAgICAgIGlmbmVxICgkKExPQ0FMX0ZPUkNFX1NUQVRJQ19FWEVDVVRBQkxFKSx0cnVlKQotICAgICAgICBteV9sZGZsYWdzICs9IC1waWUKLSAgICAgIGVuZGlmCitpZm5lcSAoJChmaWx0ZXIgRVhFQ1VUQUJMRVMgTkFUSVZFX1RFU1RTLCQoTE9DQUxfTU9EVUxFX0NMQVNTKSksKQorICBteV9jZmxhZ3MgKz0gLWZQSUUKKyAgaWZuZGVmIEJVSUxEX0hPU1Rfc3RhdGljCisgICAgaWZuZXEgKCQoTE9DQUxfRk9SQ0VfU1RBVElDX0VYRUNVVEFCTEUpLHRydWUpCisgICAgICBteV9sZGZsYWdzICs9IC1waWUKICAgICBlbmRpZgotICBlbHNlCi0gICAgbXlfY2ZsYWdzICs9IC1mUElDCiAgIGVuZGlmCitlbHNlCisgIG15X2NmbGFncyArPSAtZlBJQwogZW5kaWYKIAogaWZkZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKQEAgLTQ0NCw2ICs0NzQsMzQgQEAKICAgICBteV9jZmxhZ3MgKz0gJChDTEFOR19FWFRFUk5BTF9DRkxBR1MpCiBlbmRpZgogCisjIEV4dHJhIGNmbGFncyBmb3IgcHJvamVjdHMgdW5kZXIgaGFyZHdhcmUvIGRpcmVjdG9yeS4KKyMgVGhpcyBzaG91bGQgbWF0Y2ggdGhlIGRlZmluaXRpb24gb2YgYHRoaXJkUGFydHlEaXJQcmVmaXhFeGNlcHRpb25zYAorIyBpbiBidWlsZC9zb29uZy9hbmRyb2lkL3BhdGhzLmdvLgorIyBHZXQgdGhlIHNlY29uZCBlbGVtZW50IG9mIExPQ0FMX1BBVEgKK2lmbmVxICgkKGZpbHRlciBoYXJkd2FyZS8lLCQoTE9DQUxfUEFUSCkpLCkKKyAgbXlfc3ViZGlyIDo9ICQod29yZCAyLCQoc3Vic3QgLywkKHNwYWNlKSwkKExPQ0FMX1BBVEgpKSkKKyAgbXVzdF9jb21waWxlX2hhcmR3YXJlX3N1YmRpcnMgOj0gXAorICAgICAgICAgICAgICAgICAgaGFyZHdhcmUvZ29vZ2xlLyUgXAorICAgICAgICAgICAgICAgICAgaGFyZHdhcmUvaW50ZXJmYWNlcy8lIFwKKyAgICAgICAgICAgICAgICAgIGhhcmR3YXJlL2xpYmhhcmR3YXJlLyUgXAorICAgICAgICAgICAgICAgICAgaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5LyUgXAorICAgICAgICAgICAgICAgICAgaGFyZHdhcmUvcmlsLyUKKyAgaWZlcSAoJChmaWx0ZXIgJChtdXN0X2NvbXBpbGVfaGFyZHdhcmVfc3ViZGlycyksJChteV9zdWJkaXIpKSwpCisgICAgbXlfY2ZsYWdzICs9ICQoQ0xBTkdfRVhURVJOQUxfQ0ZMQUdTKQorICBlbmRpZgorZW5kaWYKKworIyBFeHRyYSBjZmxhZ3MgZm9yIHByb2plY3RzIHVuZGVyIHZlbmRvci8gZGlyZWN0b3J5LgorIyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgZGVmaW5pdGlvbiBvZiBgdGhpcmRQYXJ0eURpclByZWZpeEV4Y2VwdGlvbnNgCisjIGluIGJ1aWxkL3Nvb25nL2FuZHJvaWQvcGF0aHMuZ28uCitpZm5lcSAoJChmaWx0ZXIgdmVuZG9yLyUsJChMT0NBTF9QQVRIKSksKQorICBteV9zdWJkaXIgOj0gJCh3b3JkIDIsJChzdWJzdCAvLCQoc3BhY2UpLCQoTE9DQUxfUEFUSCkpKQorICAjIERvIG5vdCBhZGQgdGhlIGZsYWdzIGZvciBhbnkgc3ViZGlyIHRoYXQgY29udGFpbnMgdGhlIHN0cmluZyAiZ29vZ2xlIi4KKyAgaWZuZXEgKCQoZmluZHN0cmluZyBnb29nbGUsJChteV9zdWJkaXIpKSwpCisgICAgbXlfY2ZsYWdzICs9ICQoQ0xBTkdfRVhURVJOQUxfQ0ZMQUdTKQorICBlbmRpZgorZW5kaWYKKwogIyBhcmNoLXNwZWNpZmljIHN0YXRpYyBsaWJyYXJpZXMgZ28gZmlyc3Qgc28gdGhhdCBnZW5lcmljIG9uZXMgY2FuIGRlcGVuZCBvbiB0aGVtCiBteV9zdGF0aWNfbGlicmFyaWVzIDo9ICQoTE9DQUxfU1RBVElDX0xJQlJBUklFU18kKCQobXlfcHJlZml4KSQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKSkgJChMT0NBTF9TVEFUSUNfTElCUkFSSUVTXyQobXlfMzJfNjRfYml0X3N1ZmZpeCkpICQobXlfc3RhdGljX2xpYnJhcmllcykKIG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMgOj0gJChMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTXyQoJChteV9wcmVmaXgpJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpKSAkKExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVNfJChteV8zMl82NF9iaXRfc3VmZml4KSkgJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKQpAQCAtMTEzMSwxNCArMTE4OSwyNSBAQAogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgV2hlbiBjb21waWxpbmcgYSBtZW10YWdfc3RhY2sgZW5hYmxlZCB0YXJnZXQsIHVzZSB0aGUgLm1lbXRhZ19zdGFjayB2YXJpYW50CisjIyBvZiBhbnkgc3RhdGljIGRlcGVuZGVuY2llcyAod2hlcmUgdGhleSBleGlzdCkuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmbmVxICgkKGZpbHRlciBtZW10YWdfc3RhY2ssJChteV9zYW5pdGl6ZSkpLCkKKyAgbXlfd2hvbGVfc3RhdGljX2xpYnJhcmllcyA6PSAkKGNhbGwgdXNlX3Nvb25nX3Nhbml0aXplZF9zdGF0aWNfbGlicmFyaWVzLFwKKyAgICAkKG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMpLG1lbXRhZ19zdGFjaykKKyAgbXlfc3RhdGljX2xpYnJhcmllcyA6PSAkKGNhbGwgdXNlX3Nvb25nX3Nhbml0aXplZF9zdGF0aWNfbGlicmFyaWVzLFwKKyAgICAkKG15X3N0YXRpY19saWJyYXJpZXMpLG1lbXRhZ19zdGFjaykKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFdoZW4gY29tcGlsaW5nIGFnYWluc3QgQVBJIGltcG9ydGVkIG1vZHVsZSwgdXNlIEFQSSBpbXBvcnQgc3R1YgogIyMgbGlicmFyaWVzLgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIGFwaWltcG9ydF9wb3N0Zml4IDo9IC5hcGlpbXBvcnQKIAotaWZuZXEgKCQoTE9DQUxfVVNFX1ZOREspLCkKLSAgaWZlcSAoJChMT0NBTF9VU0VfVk5ES19QUk9EVUNUKSx0cnVlKQoraWZuZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLCkKKyAgaWZlcSAoJChMT0NBTF9JTl9QUk9EVUNUKSx0cnVlKQogICAgIGFwaWltcG9ydF9wb3N0Zml4IDo9IC5hcGlpbXBvcnQucHJvZHVjdAogICBlbHNlCiAgICAgYXBpaW1wb3J0X3Bvc3RmaXggOj0gLmFwaWltcG9ydC52ZW5kb3IKQEAgLTExNTUsMTQgKzEyMjQsMTQgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBXaGVuIGNvbXBpbGluZyBhZ2FpbnN0IHRoZSBWTkRLLCB1c2UgTEwtTkRLIGxpYnJhcmllcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWlmbmVxICgkKExPQ0FMX1VTRV9WTkRLKSwpCitpZm5lcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksKQogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAjIyBTb29uZyBtb2R1bGVzIG1heSBiZSBidWlsdCB0aHJlZSB0aW1lcywgb25jZSBmb3IKICAgIyMgL3N5c3RlbSwgb25jZSBmb3IgL3ZlbmRvciBhbmQgb25jZSBmb3IgL3Byb2R1Y3QuCiAgICMjIElmIHdlJ3JlIHVzaW5nIHRoZSBWTkRLLCBzd2l0Y2ggYWxsIHNvb25nCiAgICMjIGxpYnJhcmllcyBvdmVyIHRvIHRoZSAvdmVuZG9yIG9yIC9wcm9kdWN0IHZhcmlhbnQuCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gIGlmZXEgKCQoTE9DQUxfVVNFX1ZOREtfUFJPRFVDVCksdHJ1ZSkKKyAgaWZlcSAoJChMT0NBTF9JTl9QUk9EVUNUKSx0cnVlKQogICAgIG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMgOj0gJChmb3JlYWNoIGwsJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKSxcCiAgICAgICAkKGlmICQoU1BMSVRfUFJPRFVDVC5TVEFUSUNfTElCUkFSSUVTLiQobCkpLCQobCkucHJvZHVjdCwkKGwpKSkKICAgICBteV9zdGF0aWNfbGlicmFyaWVzIDo9ICQoZm9yZWFjaCBsLCQobXlfc3RhdGljX2xpYnJhcmllcyksXApAQCAtMTE4OSw3ICsxMjU4LDcgQEAKIAogIyBQbGF0Zm9ybSBjYW4gdXNlIHZlbmRvciBwdWJsaWMgbGlicmFyaWVzLiBJZiBhIHJlcXVpcmVkIHNoYXJlZCBsaWIgaXMgb25lIG9mCiAjIHRoZSB2ZW5kb3IgcHVibGljIGxpYnJhcmllcywgdGhlIGxpYiBpcyBzd2l0Y2hlZCB0byB0aGUgc3R1YiB2ZXJzaW9uIG9mIHRoZSBsaWIuCi1pZmVxICgkKExPQ0FMX1VTRV9WTkRLKSwpCitpZmVxICgkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSwpCiAgIG15X3NoYXJlZF9saWJyYXJpZXMgOj0gJChmb3JlYWNoIGwsJChteV9zaGFyZWRfbGlicmFyaWVzKSxcCiAgICAgJChpZiAkKGZpbHRlciAkKGwpLCQoVkVORE9SX1BVQkxJQ19MSUJSQVJJRVMpKSwkKGwpLnZlbmRvcnB1YmxpYywkKGwpKSkKIGVuZGlmCkBAIC0xMjQxLDcgKzEzMTAsNyBAQAogbXlfbGlua190eXBlIDo9IG5hdGl2ZTpuZGs6JChteV9uZGtfc3RsX2ZhbWlseSk6JChteV9uZGtfc3RsX2xpbmtfdHlwZSkKIG15X3dhcm5fdHlwZXMgOj0gJChteV93YXJuX25ka190eXBlcykKIG15X2FsbG93ZWRfdHlwZXMgOj0gJChteV9hbGxvd2VkX25ka190eXBlcykKLWVsc2UgaWZkZWYgTE9DQUxfVVNFX1ZOREsKK2Vsc2UgaWZlcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksdHJ1ZSkKICAgICBfbmFtZSA6PSAkKHBhdHN1YnN0ICUudmVuZG9yLCUsJChMT0NBTF9NT0RVTEUpKQogICAgIF9uYW1lIDo9ICQocGF0c3Vic3QgJS5wcm9kdWN0LCUsJChMT0NBTF9NT0RVTEUpKQogICAgIGlmbmVxICgkKGZpbHRlciAkKF9uYW1lKSwkKFZOREtfQ09SRV9MSUJSQVJJRVMpICQoVk5ES19TQU1FUFJPQ0VTU19MSUJSQVJJRVMpICQoTExOREtfTElCUkFSSUVTKSksKQpAQCAtMTI1Miw3ICsxMzIxLDcgQEAKICAgICAgICAgZW5kaWYKICAgICAgICAgbXlfd2Fybl90eXBlcyA6PQogICAgICAgICBteV9hbGxvd2VkX3R5cGVzIDo9IG5hdGl2ZTp2bmRrIG5hdGl2ZTp2bmRrX3ByaXZhdGUKLSAgICBlbHNlIGlmZXEgKCQoTE9DQUxfVVNFX1ZOREtfUFJPRFVDVCksdHJ1ZSkKKyAgICBlbHNlIGlmZXEgKCQoTE9DQUxfSU5fUFJPRFVDVCksdHJ1ZSkKICAgICAgICAgIyBNb2R1bGVzIGluc3RhbGxlZCB0byAvcHJvZHVjdCBjYW5ub3QgZGlyZWN0bHkgZGVwZW5kIG9uIG1vZHVsZXMgbWFya2VkCiAgICAgICAgICMgd2l0aCB2ZW5kb3JfYXZhaWxhYmxlOiBmYWxzZQogICAgICAgICBteV9saW5rX3R5cGUgOj0gbmF0aXZlOnByb2R1Y3QKQEAgLTEyNzYsNiArMTM0NSw4IEBACiBteV9hbGxvd2VkX3R5cGVzIDo9ICQobXlfYWxsb3dlZF9uZGtfdHlwZXMpIG5hdGl2ZTpwbGF0Zm9ybSBuYXRpdmU6cGxhdGZvcm1fdm5kawogZW5kaWYKIAorQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5XSE9MRV9TVEFUSUNfTElCUyA6PSAkKG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMpCisKIG15X2xpbmtfZGVwcyA6PSAkKGFkZHByZWZpeCBTVEFUSUNfTElCUkFSSUVTOiwkKG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMpICQobXlfc3RhdGljX2xpYnJhcmllcykpCiBpZm5lcSAoJChmaWx0ZXItb3V0IFNUQVRJQ19MSUJSQVJJRVMgSEVBREVSX0xJQlJBUklFUywkKExPQ0FMX01PRFVMRV9DTEFTUykpLCkKIG15X2xpbmtfZGVwcyArPSAkKGFkZHByZWZpeCBTSEFSRURfTElCUkFSSUVTOiwkKG15X3NoYXJlZF9saWJyYXJpZXMpKQpAQCAtMTQzNywxNyArMTUwOCw2IEBACiAgICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLCBcCiAgICAgICAgIFNUQVRJQ19MSUJSQVJJRVMsJChsaWIpLCQobXlfa2luZCksLCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCksJChteV9ob3N0X2Nyb3NzKSkvJChsaWIpJChhX3N1ZmZpeCkpCiAKLSMgV2UgZG9uJ3QgY2FyZSBhYm91dCBpbnN0YWxsZWQgc3RhdGljIGxpYnJhcmllcywgc2luY2UgdGhlCi0jIGxpYnJhcmllcyBoYXZlIGFscmVhZHkgYmVlbiBsaW5rZWQgaW50byB0aGUgbW9kdWxlIGF0IHRoYXQgcG9pbnQuCi0jIFdlIGRvLCBob3dldmVyLCBjYXJlIGFib3V0IHRoZSBOT1RJQ0UgZmlsZXMgZm9yIGFueSBzdGF0aWMKLSMgbGlicmFyaWVzIHRoYXQgd2UgdXNlLiAoc2VlIG5vdGljZV9maWxlcy5taykKLWluc3RhbGxlZF9zdGF0aWNfbGlicmFyeV9ub3RpY2VfZmlsZV90YXJnZXRzIDo9IFwKLSAgICAkKGZvcmVhY2ggbGliLCQobXlfc3RhdGljX2xpYnJhcmllcykgJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKSwgXAotICAgICAgTk9USUNFLSQoaWYgJChMT0NBTF9JU19IT1NUX01PRFVMRSksSE9TVCQoaWYgJChteV9ob3N0X2Nyb3NzKSxfQ1JPU1MsKSxUQVJHRVQpLVNUQVRJQ19MSUJSQVJJRVMtJChsaWIpKQotCi0kKG5vdGljZV90YXJnZXQpOiB8ICQoaW5zdGFsbGVkX3N0YXRpY19saWJyYXJ5X25vdGljZV9maWxlX3RhcmdldHMpCi0kKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiB8ICQobm90aWNlX3RhcmdldCkKLQogIyBEZWZhdWx0IGlzIC1mbm8tcnR0aS4KIGlmZXEgKCQoc3RyaXAgJChMT0NBTF9SVFRJX0ZMQUcpKSwpCiBMT0NBTF9SVFRJX0ZMQUcgOj0gLWZuby1ydHRpCkBAIC0xNTY2LDIxICsxNjI2LDE2IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAKLWlmZGVmIExPQ0FMX1VTRV9WTkRLCitpZmVxICgkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSx0cnVlKQogICBteV90YXJnZXRfZ2xvYmFsX2NfaW5jbHVkZXMgOj0KICAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKFRBUkdFVF9PVVRfSEVBREVSUykKIGVsc2UgaWZkZWYgTE9DQUxfU0RLX1ZFUlNJT04KICAgbXlfdGFyZ2V0X2dsb2JhbF9jX2luY2x1ZGVzIDo9CiAgIG15X3RhcmdldF9nbG9iYWxfY19zeXN0ZW1faW5jbHVkZXMgOj0gJChteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCkgJChteV9uZGtfc3lzcm9vdF9pbmNsdWRlKQotZWxzZSBpZmRlZiBCT0FSRF9WTkRLX1ZFUlNJT04KLSAgbXlfdGFyZ2V0X2dsb2JhbF9jX2luY2x1ZGVzIDo9ICQoU1JDX0hFQURFUlMpIFwKLSAgICAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCkkKG15X3ByZWZpeClDX0lOQ0xVREVTKQotICBteV90YXJnZXRfZ2xvYmFsX2Nfc3lzdGVtX2luY2x1ZGVzIDo9ICQoU1JDX1NZU1RFTV9IRUFERVJTKSBcCi0gICAgJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpQ19TWVNURU1fSU5DTFVERVMpCiBlbHNlCiAgIG15X3RhcmdldF9nbG9iYWxfY19pbmNsdWRlcyA6PSAkKFNSQ19IRUFERVJTKSBcCiAgICAgJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpQ19JTkNMVURFUykKLSAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKFNSQ19TWVNURU1fSEVBREVSUykgJChUQVJHRVRfT1VUX0hFQURFUlMpIFwKKyAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKFNSQ19TWVNURU1fSEVBREVSUykgXAogICAgICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKSQobXlfcHJlZml4KUNfU1lTVEVNX0lOQ0xVREVTKQogZW5kaWYKIApAQCAtMTY2NSwxNiArMTcyMCwxMCBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaW1wb3J0ZWRfaW5jbHVkZXMgOj0KIAotaWZkZWYgTE9DQUxfVVNFX1ZOREsKK2lmZXEgKHRydWUsJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCkpCiAgIGltcG9ydGVkX2luY2x1ZGVzICs9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSEVBREVSX0xJQlJBUklFUyxkZXZpY2Vfa2VybmVsX2hlYWRlcnMsJChteV9raW5kKSwsJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKSwkKG15X2hvc3RfY3Jvc3MpKQotZWxzZSBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgotICAjIEFwcHMgc2hvdWxkbid0IG5lZWQgZGV2aWNlLXNwZWNpZmljIGtlcm5lbCBoZWFkZXJzCi1lbHNlIGlmZGVmIEJPQVJEX1ZOREtfVkVSU0lPTgotICAjIEZvciBkZXZpY2VzIGJ1aWxkaW5nIHdpdGggdGhlIFZOREssIG9ubHkgdGhlIFZOREsgZ2V0cyBkZXZpY2Utc3BlY2lmaWMga2VybmVsIGhlYWRlcnMgYnkgZGVmYXVsdAotICAjIEluIHNvb25nLCBpdCdzIGVudGlyZWx5IG9wdC1pbgogZWxzZQotICAjIEZvciBvbGRlciBub24tVk5ESyBidWlsZHMsIGNvbnRpbnVlIGFkZGluZyBpbiBrZXJuZWwgaGVhZGVycyB0byBldmVyeXRoaW5nIGxpa2Ugd2UgdXNlZCB0bwotICBpbXBvcnRlZF9pbmNsdWRlcyArPSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEhFQURFUl9MSUJSQVJJRVMsZGV2aWNlX2tlcm5lbF9oZWFkZXJzLCQobXlfa2luZCksLCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCksJChteV9ob3N0X2Nyb3NzKSkKKyAgIyBldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIG1hbnVhbGx5IHNwZWNpZnkgaGVhZGVycwogZW5kaWYKIAogaW1wb3J0ZWRfaW5jbHVkZXMgOj0gJChzdHJpcCBcCmRpZmYgLS1naXQgYS9jb3JlL2JvYXJkX2NvbmZpZy5tayBiL2NvcmUvYm9hcmRfY29uZmlnLm1rCmluZGV4IGZhZTdhYWEuLmQzZjA0OTMgMTAwNjQ0Ci0tLSBhL2NvcmUvYm9hcmRfY29uZmlnLm1rCisrKyBiL2NvcmUvYm9hcmRfY29uZmlnLm1rCkBAIC0xNDQsOSArMTQ0LDYgQEAKIF9ib2FyZF9zdHJpcF9saXN0ICs9IEJPQVJEX0FWQl9QVk1GV19BTEdPUklUSE0KIF9ib2FyZF9zdHJpcF9saXN0ICs9IEJPQVJEX0FWQl9QVk1GV19ST0xMQkFDS19JTkRFWF9MT0NBVElPTgogX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfUEFSVElBTF9PVEFfVVBEQVRFX1BBUlRJVElPTlNfTElTVAotX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfQlBUX0RJU0tfU0laRQotX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfQlBUX0lOUFVUX0ZJTEVTCi1fYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9CUFRfTUFLRV9UQUJMRV9BUkdTCiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9BVkJfVkJNRVRBX1ZFTkRPUl9ST0xMQkFDS19JTkRFWF9MT0NBVElPTgogX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfQVZCX1ZCTUVUQV9WRU5ET1JfQUxHT1JJVEhNCiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9BVkJfVkJNRVRBX1ZFTkRPUl9LRVlfUEFUSApAQCAtMTY0LDkgKzE2MSw2IEBACiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9BVkJfVkVORE9SX0tFUk5FTF9CT09UX0tFWV9QQVRICiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9BVkJfVkVORE9SX0tFUk5FTF9CT09UX0FMR09SSVRITQogX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfQVZCX1ZFTkRPUl9LRVJORUxfQk9PVF9ST0xMQkFDS19JTkRFWF9MT0NBVElPTgotX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfR0tJX1NJR05JTkdfU0lHTkFUVVJFX0FSR1MKLV9ib2FyZF9zdHJpcF9saXN0ICs9IEJPQVJEX0dLSV9TSUdOSU5HX0FMR09SSVRITQotX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfR0tJX1NJR05JTkdfS0VZX1BBVEgKIF9ib2FyZF9zdHJpcF9saXN0ICs9IEJPQVJEX01LQk9PVElNR19BUkdTCiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9WRU5ET1JfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFCiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9WRU5ET1JfS0VSTkVMX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRQpAQCAtMTg4LDkgKzE4MiwxMSBAQAogICBCVUlMRF9CUk9LRU5fUFJFQlVJTFRfRUxGX0ZJTEVTIFwKICAgQlVJTERfQlJPS0VOX1RSRUJMRV9TWVNQUk9QX05FVkVSQUxMT1cgXAogICBCVUlMRF9CUk9LRU5fVVNFU19ORVRXT1JLIFwKLSAgQlVJTERfQlJPS0VOX1VTRVNfU09PTkdfUFlUSE9OMl9NT0RVTEVTIFwKICAgQlVJTERfQlJPS0VOX1ZFTkRPUl9QUk9QRVJUWV9OQU1FU1BBQ0UgXAogICBCVUlMRF9CUk9LRU5fVklOVEZfUFJPRFVDVF9DT1BZX0ZJTEVTIFwKKyAgQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTIFwKKyAgQlVJTERfQlJPS0VOX0dFTlJVTEVfU0FOREJPWElORyBcCisgIEJVSUxEX0JST0tFTl9ET05UX0NIRUNLX1NZU1RFTVNESyBcCiAKIF9idWlsZF9icm9rZW5fdmFyX2xpc3QgKz0gXAogICAkKGZvcmVhY2ggbSwkKEFWQUlMQUJMRV9CVUlMRF9NT0RVTEVfVFlQRVMpIFwKQEAgLTIwNCw3ICsyMDAsNyBAQAogCiAjIENvbmRpdGlvbmFsIHRvIGJ1aWxkaW5nIG9uIGxpbnV4LCBhcyBkZXgyb2F0IGN1cnJlbnRseSBkb2VzIG5vdCB3b3JrIG9uIGRhcndpbi4KIGlmZXEgKCQoSE9TVF9PUyksbGludXgpCi0gIFdJVEhfREVYUFJFT1BUIDo9IHRydWUKKyAgV0lUSF9ERVhQUkVPUFQgPz0gdHJ1ZQogZW5kaWYKIAogIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTIyNiw2ICsyMjIsOCBAQAogICBib2FyZF9jb25maWdfbWsgOj0gXAogICAgICQoc3RyaXAgJChzb3J0ICQod2lsZGNhcmQgXAogICAgICAgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvJChUQVJHRVRfREVWSUNFKS9Cb2FyZENvbmZpZy5tayBcCisgICAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9ib2FyZC8kKFRBUkdFVF9ERVZJQ0UpL0JvYXJkQ29uZmlnLm1rIFwKKyAgICAgIGRldmljZS9nb29nbGUvY3V0dGxlZmlzaC9ib2FyZC8kKFRBUkdFVF9ERVZJQ0UpL0JvYXJkQ29uZmlnLm1rIFwKICAgICAgICQoc2hlbGwgdGVzdCAtZCBkZXZpY2UgJiYgZmluZCAtTCBkZXZpY2UgLW1heGRlcHRoIDQgLXBhdGggJyovJChUQVJHRVRfREVWSUNFKS9Cb2FyZENvbmZpZy5taycpIFwKICAgICAgICQoc2hlbGwgdGVzdCAtZCB2ZW5kb3IgJiYgZmluZCAtTCB2ZW5kb3IgLW1heGRlcHRoIDQgLXBhdGggJyovJChUQVJHRVRfREVWSUNFKS9Cb2FyZENvbmZpZy5taycpIFwKICAgICApKSkKQEAgLTI1Niw3ICsyNTQsNyBAQAogICBlbmRpZgogCiAgICQoc2hlbGwgYnVpbGQvc29vbmcvc2NyaXB0cy91cGRhdGVfb3V0ICQoT1VUX0RJUikvcmJjL3JiY19ib2FyZF9jb25maWdfcmVzdWx0cy5tayBcCi0gICAgJChPVVRfRElSKS9yYmNydW4gUkJDX09VVD0ibWFrZSIgJChPVVRfRElSKS9yYmMvYm9hcmRsYXVuY2hlci5yYmMpCisgICAgJChPVVRfRElSKS9yYmNydW4gLS1tb2RlPXJiYyAkKE9VVF9ESVIpL3JiYy9ib2FyZGxhdW5jaGVyLnJiYykKICAgaWZuZXEgKCQoLlNIRUxMU1RBVFVTKSwwKQogICAgICQoZXJyb3IgYm9hcmQgY29uZmlndXJhdGlvbiBydW5uZXIgZmFpbGVkOiAkKC5TSEVMTFNUQVRVUykpCiAgIGVuZGlmCkBAIC0yNzYsNyArMjc0LDcgQEAKIAogaWZuZXEgKCQoTUFMTE9DX0lNUEwpLCkKICAgJCh3YXJuaW5nICoqKiBVbnN1cHBvcnRlZCBvcHRpb24gTUFMTE9DX0lNUEwgZGVmaW5lZCBieSBib2FyZCBjb25maWc6ICQoYm9hcmRfY29uZmlnX21rKS4pCi0gICQoZXJyb3IgVXNlIGBNQUxMT0NfU1ZFTFRFIDo9IHRydWVgIHRvIGNvbmZpZ3VyZSBqZW1hbGxvYyBmb3IgbG93LW1lbW9yeSkKKyAgJChlcnJvciBVc2UgYE1BTExPQ19MT1dfTUVNT1JZIDo9IHRydWVgIHRvIHVzZSBsb3ctbWVtb3J5IGFsbG9jYXRvciBjb25maWcpCiBlbmRpZgogYm9hcmRfY29uZmlnX21rIDo9CiAKQEAgLTI4OSw2ICsyODcsOSBAQAogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9ib2FyZF9jb25maWdfd2lmaS5tawogCisjIFNldCB1cCBzb29uZyBjb25maWcgZm9yICJzb29uZ19jb25maWdfdmFsdWVfdmFyaWFibGUiLgorLWluY2x1ZGUgdmVuZG9yL2dvb2dsZS9idWlsZC9zb29uZy9zb29uZ19jb25maWdfbmFtZXNwYWNlL2NhbWVyYS5taworCiAjIERlZmF1bHQgKl9DUFVfVkFSSUFOVF9SVU5USU1FIHRvIENQVV9WQVJJQU5UIGlmIHVuc3BlY2lmaWVkLgogVEFSR0VUX0NQVV9WQVJJQU5UX1JVTlRJTUUgOj0gJChvciAkKFRBUkdFVF9DUFVfVkFSSUFOVF9SVU5USU1FKSwkKFRBUkdFVF9DUFVfVkFSSUFOVCkpCiBUQVJHRVRfMk5EX0NQVV9WQVJJQU5UX1JVTlRJTUUgOj0gJChvciAkKFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlRfUlVOVElNRSksJChUQVJHRVRfMk5EX0NQVV9WQVJJQU5UKSkKQEAgLTkyMiw3ICs5MjMsOSBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBFbnN1cmUgY29uc2lzdGVuY3kgYW1vbmcgVEFSR0VUX1JFQ09WRVJZX1VQREFURVJfTElCUywgQUJfT1RBX1VQREFURVIsIGFuZCBQUk9EVUNUX09UQV9GT1JDRV9OT05fQUJfUEFDS0FHRS4KIFRBUkdFVF9SRUNPVkVSWV9VUERBVEVSX0xJQlMgPz0KLUFCX09UQV9VUERBVEVSID89CitpZmVxICgkKEFCX09UQV9VUERBVEVSKSwpCitBQl9PVEFfVVBEQVRFUiA6PSB0cnVlCitlbmRpZgogLktBVElfUkVBRE9OTFkgOj0gVEFSR0VUX1JFQ09WRVJZX1VQREFURVJfTElCUyBBQl9PVEFfVVBEQVRFUgogCiAjIEVuc3VyZSB0aGF0IGlmIFBST0RVQ1RfT1RBX0ZPUkNFX05PTl9BQl9QQUNLQUdFID09IHRydWUsIHRoZW4gQUJfT1RBX1VQREFURVIgbXVzdCBiZSB0cnVlCkBAIC05NDgsNiArOTUxLDExIEBACiAgIGVuZGlmCiBlbmRpZgogCisjIEZvciBOb24gQS9CIGZ1bGwgT1RBLCBkaXNhYmxlIGJyb3RsaSBjb21wcmVzc2lvbi4KK2lmZXEgKCQoVEFSR0VUX09UQV9BTExPV19OT05fQUIpLHRydWUpCisgIEJPQVJEX05PTl9BQl9PVEFfRElTQUJMRV9DT01QUkVTU0lPTiA6PSB0cnVlCitlbmRpZgorCiAjIFF1aWNrIGNoZWNrIGZvciBidWlsZGluZyBnZW5lcmljIE9UQSBwYWNrYWdlcy4gQ3VycmVudGx5IGl0IG9ubHkgc3VwcG9ydHMgQS9CIE9UQXMuCiBpZmVxICgkKFBST0RVQ1RfQlVJTERfR0VORVJJQ19PVEFfUEFDS0FHRSksdHJ1ZSkKICAgaWZuZXEgKCQoQUJfT1RBX1VQREFURVIpLHRydWUpCkBAIC05NjcsMzcgKzk3NSw3IEBACiAgICQoaWYgJCh3aWxkY2FyZCAkKHZuZGtfcGF0aCkvKi9BbmRyb2lkLmJwKSwsJChlcnJvciBWTkRLIHZlcnNpb24gJCgxKSBub3QgZm91bmQpKQogZW5kZWYKIAotaWZkZWYgQk9BUkRfVk5ES19WRVJTSU9OCi0gIGlmZXEgKCQoQk9BUkRfVk5ES19WRVJTSU9OKSwkKFBMQVRGT1JNX1ZOREtfVkVSU0lPTikpCi0gICAgJChlcnJvciBCT0FSRF9WTkRLX1ZFUlNJT04gaXMgZXF1YWwgdG8gUExBVEZPUk1fVk5ES19WRVJTSU9OOyB1c2UgQk9BUkRfVk5ES19WRVJTSU9OIDo9IGN1cnJlbnQpCi0gIGVuZGlmCi0gIGlmbmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksY3VycmVudCkKLSAgICAkKGNhbGwgY2hlY2tfdm5ka192ZXJzaW9uLCQoQk9BUkRfVk5ES19WRVJTSU9OKSkKLSAgZW5kaWYKLSAgVEFSR0VUX1ZFTkRPUl9URVNUX1NVRkZJWCA6PSAvdmVuZG9yCi1lbHNlCi0gIFRBUkdFVF9WRU5ET1JfVEVTVF9TVUZGSVggOj0KLWVuZGlmCi0KLSMgSWYgUFJPRFVDVF9FTkZPUkNFX0lOVEVSX1BBUlRJVElPTl9KQVZBX1NES19MSUJSQVJZIGlzIHNldCwKLSMgQk9BUkRfVk5ES19WRVJTSU9OIG11c3QgYmUgc2V0IGJlY2F1c2UgUFJPRFVDVF9FTkZPUkNFX0lOVEVSX1BBUlRJVElPTl9KQVZBX1NES19MSUJSQVJZCi0jIGlzIGEgZW5mb3JjZW1lbnQgb2YgaW50ZXItcGFydGl0aW9uIGRlcGVuZGVuY3ksIGFuZCBpdCBkb2Vzbid0IGhhdmUgYW55IG1lYW5pbmcKLSMgd2hlbiBCT0FSRF9WTkRLX1ZFUlNJT04gaXNuJ3Qgc2V0LgotaWZlcSAoJChQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkpLHRydWUpCi0gIGlmZXEgKCQoQk9BUkRfVk5ES19WRVJTSU9OKSwpCi0gICAgJChlcnJvciBCT0FSRF9WTkRLX1ZFUlNJT04gbXVzdCBiZSBzZXQgd2hlbiBQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkgaXMgdHJ1ZSkKLSAgZW5kaWYKLWVuZGlmCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQVBFWGVzIGFyZSBieSBkZWZhdWx0IG5vdCBmbGF0dGVuZWQsIGkuZS4gdXBkYXRhYmxlLgotIwotIyBBUEVYIGZsYXR0ZW5pbmcgY2FuIGFsc28gYmUgZm9yY2libHkgZW5hYmxlZCAocmVzcC4gZGlzYWJsZWQpIGJ5Ci0jIHNldHRpbmcgT1ZFUlJJREVfVEFSR0VUX0ZMQVRURU5fQVBFWCB0byB0cnVlIChyZXNwLiBmYWxzZSksIGUuZy4gYnkKLSMgc2V0dGluZyB0aGUgT1ZFUlJJREVfVEFSR0VUX0ZMQVRURU5fQVBFWCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLWlmZGVmIE9WRVJSSURFX1RBUkdFVF9GTEFUVEVOX0FQRVgKLSAgVEFSR0VUX0ZMQVRURU5fQVBFWCA6PSAkKE9WRVJSSURFX1RBUkdFVF9GTEFUVEVOX0FQRVgpCi1lbmRpZgorVEFSR0VUX1ZFTkRPUl9URVNUX1NVRkZJWCA6PSAvdmVuZG9yCiAKIGlmZXEgKCwkKFRBUkdFVF9CVUlMRF9VTkJVTkRMRUQpKQogaWZkZWYgUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TCkBAIC0xMDEzLDYgKzk5MSwxNiBAQAogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCT0FSRF9BUElfTEVWRUwgZm9yIHZlbmRvciBBUEkgc3VyZmFjZQoraWZkZWYgUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwKKyAgaWZkZWYgQk9BUkRfQVBJX0xFVkVMCisgICAgJChlcnJvciBCT0FSRF9BUElfTEVWRUwgbXVzdCBub3QgYmUgc2V0IG1hbnVhbGx5LiBUaGUgYnVpbGQgc3lzdGVtIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGlzIHZhbHVlLikKKyAgZW5kaWYKKyAgQk9BUkRfQVBJX0xFVkVMIDo9ICQoUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwpCisgIC5LQVRJX1JFQURPTkxZIDo9IEJPQVJEX0FQSV9MRVZFTAorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBIYW5kbGUgQlVJTERfQlJPS0VOX1VTRVNfQlVJTERfKgogCiAkKGZvcmVhY2ggbSwkKERFRkFVTFRfV0FSTklOR19CVUlMRF9NT0RVTEVfVFlQRVMpLFwKZGlmZiAtLWdpdCBhL2NvcmUvYnVpbGRfaWQubWsgYi9jb3JlL2J1aWxkX2lkLm1rCmluZGV4IDJmOWMzZjMuLmJlZDgzOWYgMTAwNjQ0Ci0tLSBhL2NvcmUvYnVpbGRfaWQubWsKKysrIGIvY29yZS9idWlsZF9pZC5tawpAQCAtMTgsNCArMTgsNCBAQAogIyAobGlrZSAiQ1JCMDEiKS4gIEl0IG11c3QgYmUgYSBzaW5nbGUgd29yZCwgYW5kIGlzCiAjIGNhcGl0YWxpemVkIGJ5IGNvbnZlbnRpb24uCiAKLUJVSUxEX0lEPU1BU1RFUgorQlVJTERfSUQ9TUFJTgpkaWZmIC0tZ2l0IGEvY29yZS9jY19wcmVidWlsdF9pbnRlcm5hbC5tayBiL2NvcmUvY2NfcHJlYnVpbHRfaW50ZXJuYWwubWsKaW5kZXggMmRlNDExNS4uZTM0ZTExMCAxMDA2NDQKLS0tIGEvY29yZS9jY19wcmVidWlsdF9pbnRlcm5hbC5taworKysgYi9jb3JlL2NjX3ByZWJ1aWx0X2ludGVybmFsLm1rCkBAIC01Niw5ICs1Niw2IEBACiAgIGlmZXEgKCQoZmlsdGVyIFNIQVJFRF9MSUJSQVJJRVMgRVhFQ1VUQUJMRVMgTkFUSVZFX1RFU1RTLCQoTE9DQUxfTU9EVUxFX0NMQVNTKSksKQogICAgICQoY2FsbCBwcmV0dHktZXJyb3IsQ2FuIHN0cmlwL3BhY2sgb25seSBzaGFyZWQgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzKQogICBlbmRpZgotICBpZm5lcSAoJChMT0NBTF9QUkVCVUlMVF9TVFJJUF9DT01NRU5UUyksKQotICAgICQoY2FsbCBwcmV0dHktZXJyb3IsQ2Fubm90IHN0cmlwL3BhY2sgc2NyaXB0cykKLSAgZW5kaWYKICAgIyBTZXQgdGhlIGFyY2gtc3BlY2lmaWMgdmFyaWFibGVzIHRvIHNldCB1cCB0aGUgc3RyaXAgcnVsZXMKICAgTE9DQUxfU1RSSVBfTU9EVUxFXyQoJChteV9wcmVmaXgpJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpIDo9ICQobXlfc3RyaXBfbW9kdWxlKQogICBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9keW5hbWljX2JpbmFyeS5tawpAQCAtODMsNyArODAsNyBAQAogCiBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgogbXlfbGlua190eXBlIDo9IG5hdGl2ZTpuZGs6JChteV9uZGtfc3RsX2ZhbWlseSk6JChteV9uZGtfc3RsX2xpbmtfdHlwZSkKLWVsc2UgaWZkZWYgTE9DQUxfVVNFX1ZOREsKK2Vsc2UgaWZlcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksdHJ1ZSkKICAgICBfbmFtZSA6PSAkKHBhdHN1YnN0ICUudmVuZG9yLCUsJChMT0NBTF9NT0RVTEUpKQogICAgIF9uYW1lIDo9ICQocGF0c3Vic3QgJS5wcm9kdWN0LCUsJChMT0NBTF9NT0RVTEUpKQogICAgIGlmbmVxICgkKGZpbHRlciAkKF9uYW1lKSwkKFZOREtfQ09SRV9MSUJSQVJJRVMpICQoVk5ES19TQU1FUFJPQ0VTU19MSUJSQVJJRVMpICQoTExOREtfTElCUkFSSUVTKSksKQpAQCAtOTMsNyArOTAsNyBAQAogICAgICAgICAgICAgbXlfbGlua190eXBlIDo9IG5hdGl2ZTp2bmRrX3ByaXZhdGUKICAgICAgICAgZW5kaWYKICAgICBlbHNlCi0gICAgICAgIGlmZXEgKCQoTE9DQUxfVVNFX1ZOREtfUFJPRFVDVCksdHJ1ZSkKKyAgICAgICAgaWZlcSAoJChMT0NBTF9JTl9QUk9EVUNUKSx0cnVlKQogICAgICAgICAgICAgbXlfbGlua190eXBlIDo9IG5hdGl2ZTpwcm9kdWN0CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6dmVuZG9yCkBAIC0xNDIsOCArMTM5LDggQEAKICMgV2hlbiBjb21waWxpbmcgYWdhaW5zdCBBUEkgaW1wb3J0ZWQgbW9kdWxlLCB1c2UgQVBJIGltcG9ydCBzdHViIGxpYnJhcmllcy4KIGFwaWltcG9ydF9wb3N0Zml4IDo9IC5hcGlpbXBvcnQKIAotaWZuZXEgKCQoTE9DQUxfVVNFX1ZOREspLCkKLSAgaWZlcSAoJChMT0NBTF9VU0VfVk5ES19QUk9EVUNUKSx0cnVlKQoraWZlcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksdHJ1ZSkKKyAgaWZlcSAoJChMT0NBTF9JTl9QUk9EVUNUKSx0cnVlKQogICAgIGFwaWltcG9ydF9wb3N0Zml4IDo9IC5hcGlpbXBvcnQucHJvZHVjdAogICBlbHNlCiAgICAgYXBpaW1wb3J0X3Bvc3RmaXggOj0gLmFwaWltcG9ydC52ZW5kb3IKQEAgLTE2MSw4ICsxNTgsOCBAQAogZW5kaWYgI215X3N5c3RlbV9zaGFyZWRfbGlicmFyaWVzCiAKIGlmZGVmIG15X3NoYXJlZF9saWJyYXJpZXMKLWlmZGVmIExPQ0FMX1VTRV9WTkRLCi0gIGlmZXEgKCQoTE9DQUxfVVNFX1ZOREtfUFJPRFVDVCksdHJ1ZSkKK2lmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLHRydWUpCisgIGlmZXEgKCQoTE9DQUxfSU5fUFJPRFVDVCksdHJ1ZSkKICAgICBteV9zaGFyZWRfbGlicmFyaWVzIDo9ICQoZm9yZWFjaCBsLCQobXlfc2hhcmVkX2xpYnJhcmllcyksXAogICAgICAgJChpZiAkKFNQTElUX1BST0RVQ1QuU0hBUkVEX0xJQlJBUklFUy4kKGwpKSwkKGwpLnByb2R1Y3QsJChsKSkpCiAgIGVsc2UKZGlmZiAtLWdpdCBhL2NvcmUvY2hlY2tfZWxmX2ZpbGUubWsgYi9jb3JlL2NoZWNrX2VsZl9maWxlLm1rCmluZGV4IGI1YmU4MWYuLmVjM2M0YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvY2hlY2tfZWxmX2ZpbGUubWsKKysrIGIvY29yZS9jaGVja19lbGZfZmlsZS5tawpAQCAtNyw5ICs3LDEyIEBACiAjCiAjIElucHV0czoKICMgLSBMT0NBTF9BTExPV19VTkRFRklORURfU1lNQk9MUworIyAtIExPQ0FMX0lHTk9SRV9NQVhfUEFHRV9TSVpFCiAjIC0gTE9DQUxfQlVJTFRfTU9EVUxFCiAjIC0gTE9DQUxfSVNfSE9TVF9NT0RVTEUKICMgLSBMT0NBTF9NT0RVTEVfQ0xBU1MKKyMgLSBUQVJHRVRfQ0hFQ0tfUFJFQlVJTFRfTUFYX1BBR0VfU0laRQorIyAtIFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRAogIyAtIGludGVybWVkaWF0ZXMKICMgLSBteV9pbnN0YWxsZWRfbW9kdWxlX3N0ZW0KICMgLSBteV9wcmVidWlsdF9zcmNfZmlsZQpAQCAtMjYsNiArMjksMjEgQEAKICMgSW4gYWRkaXRpb24gdG8gJChteV9jaGVja19lbGZfZmlsZV9zaGFyZWRfbGliX2ZpbGVzKSwgc29tZSBmaWxlIHBhdGhzIGFyZQogIyBhZGRlZCBieSBgcmVzb2x2ZS1zaGFyZWQtbGlicy1mb3ItZWxmLWZpbGUtY2hlY2tgIGZyb20gYGNvcmUvbWFpbi5ta2AuCiAkKGNoZWNrX2VsZl9maWxlc19zdGFtcCk6IFBSSVZBVEVfU0hBUkVEX0xJQlJBUllfRklMRVMgOj0gJChteV9jaGVja19lbGZfZmlsZV9zaGFyZWRfbGliX2ZpbGVzKQorCisjIEZvciBkaWZmZXJlbnQgcGFnZSBzaXplcyB0byB3b3JrLCB3ZSBtdXN0IHN1cHBvcnQgYSBsYXJnZXIgbWF4IHBhZ2Ugc2l6ZQorIyBhcyB3ZWxsIGFzIHByb3Blcmx5IHJlZmxlY3QgcGFnZSBzaXplIGF0IHJ1bnRpbWUuIExpbWl0IHRoaXMgY2hlY2ssIHNpbmNlIG1hbnkKKyMgZGV2aWNlcyBzZXQgdGhlIG1heCBwYWdlIHNpemUgKGZvciBmdXR1cmUgcHJvb2YpIHRoYW4gYWN0dWFsbHkgdXNlIHRoZQorIyBsYXJnZXIgcGFnZSBzaXplLgoraWZlcSAoJChzdHJpcCAkKFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFKSksdHJ1ZSkKK2lmZXEgKCQoc3RyaXAgJChMT0NBTF9JR05PUkVfTUFYX1BBR0VfU0laRSkpLHRydWUpCiskKGNoZWNrX2VsZl9maWxlc19zdGFtcCk6IFBSSVZBVEVfTUFYX1BBR0VfU0laRSA6PQorZWxzZQorJChjaGVja19lbGZfZmlsZXNfc3RhbXApOiBQUklWQVRFX01BWF9QQUdFX1NJWkUgOj0gJChUQVJHRVRfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQpCitlbmRpZgorZWxzZQorJChjaGVja19lbGZfZmlsZXNfc3RhbXApOiBQUklWQVRFX01BWF9QQUdFX1NJWkUgOj0KK2VuZGlmCisKICQoY2hlY2tfZWxmX2ZpbGVzX3N0YW1wKTogJChteV9wcmVidWlsdF9zcmNfZmlsZSkgJChteV9jaGVja19lbGZfZmlsZV9zaGFyZWRfbGliX2ZpbGVzKSAkKENIRUNLX0VMRl9GSUxFKSAkKExMVk1fUkVBRE9CSikKIAlAZWNobyBDaGVjayBwcmVidWlsdCBFTEYgYmluYXJ5OiAkPAogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCkBAIC0zMyw2ICs1MSw3IEBACiAJJChoaWRlKSAkKENIRUNLX0VMRl9GSUxFKSBcCiAJICAgIC0tc2tpcC1iYWQtZWxmLW1hZ2ljIFwKIAkgICAgLS1za2lwLXVua25vd24tZWxmLW1hY2hpbmUgXAorCSAgICAkKGlmICQoUFJJVkFURV9NQVhfUEFHRV9TSVpFKSwtLW1heC1wYWdlLXNpemU9JChQUklWQVRFX01BWF9QQUdFX1NJWkUpKSBcCiAJICAgICQoaWYgJChQUklWQVRFX1NPTkFNRSksLS1zb25hbWUgJChQUklWQVRFX1NPTkFNRSkpIFwKIAkgICAgJChmb3JlYWNoIGwsJChQUklWQVRFX1NIQVJFRF9MSUJSQVJZX0ZJTEVTKSwtLXNoYXJlZC1saWIgJChsKSkgXAogCSAgICAkKGZvcmVhY2ggbCwkKFBSSVZBVEVfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMpLC0tc3lzdGVtLXNoYXJlZC1saWIgJChsKSkgXApkaWZmIC0tZ2l0IGEvY29yZS9jbGVhcl92YXJzLm1rIGIvY29yZS9jbGVhcl92YXJzLm1rCmluZGV4IGJiN2JhMWIuLmZlZDE5ZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xlYXJfdmFycy5taworKysgYi9jb3JlL2NsZWFyX3ZhcnMubWsKQEAgLTUsMjEgKzUsMTggQEAKICMgJycsdHJ1ZQogTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWDo9CiBMT0NBTF8zMl9CSVRfT05MWTo9Ci1MT0NBTF9BQVBUMl9PTkxZOj0KIExPQ0FMX0FBUFRfRkxBR1M6PQogTE9DQUxfQUFQVF9JTkNMVURFX0FMTF9SRVNPVVJDRVM6PQogTE9DQUxfQUFQVF9OQU1FU1BBQ0VTOj0KK0xPQ0FMX0FDT05GSUdfRklMRVM6PQogTE9DQUxfQURESVRJT05BTF9DRVJUSUZJQ0FURVM6PQogTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRTo9CiBMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUzo9Ci1MT0NBTF9BRERJVElPTkFMX0hUTUxfRElSOj0KLUxPQ0FMX0FERElUSU9OQUxfSkFWQV9ESVI6PQogTE9DQUxfQUlETF9JTkNMVURFUzo9CiBMT0NBTF9BTExPV19VTkRFRklORURfU1lNQk9MUzo9CiBMT0NBTF9BTk5PVEFUSU9OX1BST0NFU1NPUlM6PQogTE9DQUxfQU5OT1RBVElPTl9QUk9DRVNTT1JfQ0xBU1NFUzo9Ci1MT0NBTF9BUElESUZGX05FV0FQSTo9Ci1MT0NBTF9BUElESUZGX09MREFQSTo9CitMT0NBTF9BUEVYX0tFWV9QQVRIOj0KIExPQ0FMX0FQS19MSUJSQVJJRVM6PQogTE9DQUxfQVBLX1NFVF9JTlNUQUxMX0ZJTEU6PQogTE9DQUxfQVBLQ0VSVFNfRklMRTo9CkBAIC01Miw4ICs0OSw2IEBACiBMT0NBTF9DUFBGTEFHUzo9CiBMT0NBTF9DUFBfU1REOj0KIExPQ0FMX0NfU1REOj0KLUxPQ0FMX0NUU19URVNUX1BBQ0tBR0U6PQotTE9DQUxfQ1RTX1RFU1RfUlVOTkVSOj0KIExPQ0FMX0NYWDo9CiBMT0NBTF9DWFhfU1RMIDo9IGRlZmF1bHQKIExPQ0FMX0RFWF9QUkVPUFRfQVBQX0lNQUdFOj0KQEAgLTcyLDIxICs2NywxMSBAQAogTE9DQUxfRFBJX1ZBUklBTlRTOj0KIExPQ0FMX0RST0lERE9DX0FOTk9UQVRJT05TX1pJUCA6PQogTE9DQUxfRFJPSURET0NfQVBJX1ZFUlNJT05TX1hNTCA6PQotTE9DQUxfRFJPSURET0NfQVNTRVRfRElSOj0KLUxPQ0FMX0RST0lERE9DX0NVU1RPTV9BU1NFVF9ESVI6PQotTE9DQUxfRFJPSURET0NfQ1VTVE9NX1RFTVBMQVRFX0RJUjo9CiBMT0NBTF9EUk9JRERPQ19ET0NfWklQIDo9Ci1MT0NBTF9EUk9JRERPQ19IVE1MX0RJUjo9CiBMT0NBTF9EUk9JRERPQ19NRVRBREFUQV9aSVA6PQotTE9DQUxfRFJPSURET0NfT1BUSU9OUzo9Ci1MT0NBTF9EUk9JRERPQ19TT1VSQ0VfUEFUSDo9Ci1MT0NBTF9EUk9JRERPQ19TVFVCX09VVF9ESVI6PQogTE9DQUxfRFJPSURET0NfU1RVQlNfU1JDSkFSIDo9Ci1MT0NBTF9EUk9JRERPQ19URU1QTEFURV9ESVI6PQotTE9DQUxfRFJPSURET0NfVVNFX1NUQU5EQVJEX0RPQ0xFVDo9CiBMT0NBTF9EWF9GTEFHUzo9CiBMT0NBTF9EWUxJQl9MSUJSQVJJRVM6PQotTE9DQUxfRU1NQV9DT1ZFUkFHRV9GSUxURVI6PQogTE9DQUxfRU1NQV9JTlNUUlVNRU5UOj0KIExPQ0FMX0VORk9SQ0VfVVNFU19MSUJSQVJJRVM6PQogTE9DQUxfRVJST1JfUFJPTkVfRkxBR1M6PQpAQCAtMTAyLDcgKzg3LDcgQEAKIExPQ0FMX0VYVFJBX0ZVTExfVEVTVF9DT05GSUdTOj0KIExPQ0FMX0VYVFJBQ1RfQVBLOj0KIExPQ0FMX0VYVFJBQ1RfRFBJX0FQSzo9Ci1MT0NBTF9GSUxFX0NPTlRFWFRTOj0KK0xPQ0FMX0ZJTEVTWVNURU1fRklMRUxJU1Q6PQogTE9DQUxfRklOREJVR1NfRkxBR1M6PQogTE9DQUxfRk9SQ0VfU1RBVElDX0VYRUNVVEFCTEU6PQogTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVI6PQpAQCAtMTIyLDEyICsxMDcsMTIgQEAKIExPQ0FMX0hFQURFUl9MSUJSQVJJRVM6PQogTE9DQUxfSE9TVF9QUkVGSVg6PQogTE9DQUxfSE9TVF9SRVFVSVJFRF9NT0RVTEVTOj0KK0xPQ0FMX0lHTk9SRV9NQVhfUEFHRV9TSVpFOj0KIExPQ0FMX0lOSVRfUkM6PQogTE9DQUxfSU5KRUNUX0JTU0xfSEFTSDo9CiBMT0NBTF9JTlNUQUxMRURfTU9EVUxFOj0KIExPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTTo9CiBMT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SOj0KLUxPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VfRElSOj0KIExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VTOj0KIExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTOj0KIExPQ0FMX0lTX0ZVWlpfVEFSR0VUOj0KQEAgLTEzNSwxNSArMTIwLDggQEAKIExPQ0FMX0lTX1JVTlRJTUVfUkVTT1VSQ0VfT1ZFUkxBWTo9CiBMT0NBTF9JU19VTklUX1RFU1Q6PQogTE9DQUxfVEVTVF9PUFRJT05TX1RBR1M6PQotTE9DQUxfSkFDS19DTEFTU1BBVEg6PQogTE9DQUxfSkFDS19DT1ZFUkFHRV9FWENMVURFX0ZJTFRFUjo9CiBMT0NBTF9KQUNLX0NPVkVSQUdFX0lOQ0xVREVfRklMVEVSOj0KLSMgJycgKGllIGRpc2FibGVkKSwgZGlzYWJsZWQsIGZ1bGwsIGluY3JlbWVudGFsLCBqYXZhY19mcm9udGVuZAotTE9DQUxfSkFDS19FTkFCTEVEOj0kKERFRkFVTFRfSkFDS19FTkFCTEVEKQotTE9DQUxfSkFDS19GTEFHUzo9Ci1MT0NBTF9KQUNLX1BMVUdJTjo9Ci1MT0NBTF9KQUNLX1BMVUdJTl9QQVRIOj0KLUxPQ0FMX0pBQ0tfUFJPR1VBUkRfRkxBR1M6PQogTE9DQUxfSkFSX0VYQ0xVREVfRklMRVM6PQogTE9DQUxfSkFSX0VYQ0xVREVfUEFDS0FHRVM6PQogTE9DQUxfSkFSSkFSX1JVTEVTOj0KQEAgLTE1Niw3ICsxMzQsNiBAQAogTE9DQUxfSkFWQV9MSUJSQVJJRVM6PQogTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTOj0KIExPQ0FMX0pBVkFfUkVTT1VSQ0VfRklMRVM6PQotTE9DQUxfSkVUSUZJRVJfRU5BQkxFRDo9CiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUzo9CiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFU19BQkk6PQogTE9DQUxfQ0VSVElGSUNBVEVfTElORUFHRTo9CkBAIC0xOTgsMTAgKzE3NSw4IEBACiBMT0NBTF9OREtfVkVSU0lPTjo9Y3VycmVudAogTE9DQUxfTk9fQ1JUOj0KIExPQ0FMX05PX0RFRkFVTFRfQ09NUElMRVJfRkxBR1M6PQotTE9DQUxfTk9fRlBJRSA6PQogTE9DQUxfTk9fTElCQ1JUX0JVSUxUSU5TOj0KIExPQ0FMX05PX05PVElDRV9GSUxFOj0KLUxPQ0FMX05PX1BJQzo9CiBMT0NBTF9OT1NBTklUSVpFOj0KIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUzo9CiBMT0NBTF9OT19TVEFUSUNfQU5BTFlaRVI6PQpAQCAtMjI3LDcgKzIwMiw2IEBACiBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRTo9CiBMT0NBTF9QUkVCVUlMVF9PQkpfRklMRVM6PQogTE9DQUxfUFJFQlVJTFRfU1RBVElDX0pBVkFfTElCUkFSSUVTOj0KLUxPQ0FMX1BSRUJVSUxUX1NUUklQX0NPTU1FTlRTOj0KIExPQ0FMX1VTRV9FTUJFRERFRF9ERVg6PQogTE9DQUxfVVNFX0VNQkVEREVEX05BVElWRV9MSUJTOj0KIExPQ0FMX1BSRVNVQk1JVF9ESVNBQkxFRDo9CkBAIC0yNjMsNyArMjM3LDYgQEAKIExPQ0FMX1JFU19MSUJSQVJJRVM6PQogTE9DQUxfUkVTT1VSQ0VfRElSOj0KIExPQ0FMX1JMSUJfTElCUkFSSUVTOj0KLUxPQ0FMX1JNVFlQRURFRlM6PQogTE9DQUxfUk9UQVRJT05fTUlOX1NES19WRVJTSU9OOj0KIExPQ0FMX1JVTlRJTUVfTElCUkFSSUVTOj0KIExPQ0FMX1JST19USEVNRTo9CkBAIC0yODgsMTUgKzI2MSwxOSBAQAogTE9DQUxfU09PTkdfSEVBREVSX0pBUiA6PQogTE9DQUxfU09PTkdfSU5TVEFMTF9QQUlSUyA6PQogTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUyA6PQorTE9DQUxfU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUzo9CiBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFIDo9CiBMT0NBTF9TT09OR19KQUNPQ09fUkVQT1JUX0NMQVNTRVNfSkFSIDo9CiBMT0NBTF9TT09OR19MSUNFTlNFX01FVEFEQVRBIDo9CiBMT0NBTF9TT09OR19MSU5LX1RZUEUgOj0KIExPQ0FMX1NPT05HX0xJTlRfUkVQT1JUUyA6PQorTE9DQUxfU09PTkdfTE9HVEFHU19GSUxFUyA6PQorTE9DQUxfU09PTkdfTU9EVUxFX0lORk9fSlNPTiA6PQogTE9DQUxfU09PTkdfTU9EVUxFX1RZUEUgOj0KIExPQ0FMX1NPT05HX1BST0dVQVJEX0RJQ1QgOj0KIExPQ0FMX1NPT05HX1BST0dVQVJEX1VTQUdFX1pJUCA6PQogTE9DQUxfU09PTkdfUkVTT1VSQ0VfRVhQT1JUX1BBQ0tBR0UgOj0KK0xPQ0FMX1NPT05HX1RSQU5TSVRJVkVfUkVTX1BBQ0tBR0VTIDo9CiBMT0NBTF9TT09OR19ERVZJQ0VfUlJPX0RJUlMgOj0KIExPQ0FMX1NPT05HX1BST0RVQ1RfUlJPX0RJUlMgOj0KIExPQ0FMX1NPT05HX1NUQVRJQ19MSUJSQVJZX0VYVFJBX1BBQ0tBR0VTIDo9CkBAIC0zMTgsMTAgKzI5NSwxMiBAQAogTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVM6PW5vbmUKIExPQ0FMX1RBUkdFVF9SRVFVSVJFRF9NT0RVTEVTOj0KIExPQ0FMX1RFU1RfQ09ORklHOj0KK0xPQ0FMX1RFU1RfQ09ORklHX1NVRkZJWDo9CiBMT0NBTF9URVNUX0RBVEE6PQogTE9DQUxfVEVTVF9EQVRBX0JJTlM6PQogTE9DQUxfVEVTVF9NQUlOTElORV9NT0RVTEVTOj0KIExPQ0FMX1RFU1RfTU9EVUxFX1RPX1BST0dVQVJEX1dJVEg6PQorTE9DQUxfVEVTVF9NT0RVTEVfQ09ORklHX0JBU0U6PQogTE9DQUxfVElEWTo9CiBMT0NBTF9USURZX0NIRUNLUzo9CiBMT0NBTF9USURZX0ZMQUdTOj0KQEAgLTMzMSwyMSArMzEwLDE2IEBACiBMT0NBTF9VU0VfQUFQVDI6PQogTE9DQUxfVVNFX0NMQU5HX0xMRDo9CiBMT0NBTF9VU0VfVk5ESzo9Ci1MT0NBTF9VU0VfVk5ES19QUk9EVUNUOj0KK0xPQ0FMX0lOX1ZFTkRPUjo9CitMT0NBTF9JTl9QUk9EVUNUOj0KIExPQ0FMX1VTRVNfTElCUkFSSUVTOj0KIExPQ0FMX1ZFTkRPUl9NT0RVTEU6PQogTE9DQUxfVklOVEZfRlJBR01FTlRTOj0KIExPQ0FMX1ZOREtfREVQRU5EX09OX0NPUkVfVkFSSUFOVDo9Ci1MT0NBTF9WVFNDX0ZMQUdTOj0KLUxPQ0FMX1ZUU19JTkNMVURFUzo9Ci1MT0NBTF9WVFNfTU9ERTo9CiBMT0NBTF9XQVJOSU5HU19FTkFCTEU6PQogTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUzo9CiBMT0NBTF9ZQUNDRkxBR1M6PQogTE9DQUxfQ0hFQ0tfRUxGX0ZJTEVTOj0KLSMgVE9ETzogZGVwcmVjYXRlLCBpdCBkb2VzIG5vdGhpbmcKLU9WRVJSSURFX0JVSUxUX01PRFVMRV9QQVRIOj0KLQogIyBhcmNoIHNwZWNpZmljIHZhcmlhYmxlcwogTE9DQUxfQVNGTEFHU18kKFRBUkdFVF9BUkNIKTo9CiBMT0NBTF9DRkxBR1NfJChUQVJHRVRfQVJDSCk6PQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9IT1NUX2Rhcndpbi14ODZfNjQubWsgYi9jb3JlL2NvbWJvL0hPU1RfZGFyd2luLm1rCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGNvcmUvY29tYm8vSE9TVF9kYXJ3aW4teDg2XzY0Lm1rCnJlbmFtZSB0byBjb3JlL2NvbWJvL0hPU1RfZGFyd2luLm1rCmluZGV4IGRhYzNiYmYuLjExMDYzZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvY29tYm8vSE9TVF9kYXJ3aW4teDg2XzY0Lm1rCisrKyBiL2NvcmUvY29tYm8vSE9TVF9kYXJ3aW4ubWsKQEAgLTE0LDcgKzE0LDcgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgQ29uZmlndXJhdGlvbiBmb3IgRGFyd2luIChNYWMgT1MgWCkgb24geDg2XzY0LgorIyBDb25maWd1cmF0aW9uIGZvciBEYXJ3aW4gKE1hYyBPUyBYKS4KICMgSW5jbHVkZWQgYnkgY29tYm8vc2VsZWN0Lm1rCiAKIGRlZmluZSAkKGNvbWJvX3Zhcl9wcmVmaXgpdHJhbnNmb3JtLXNoYXJlZC1saWItdG8tdG9jCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL0hPU1RfbGludXgteDg2XzY0Lm1rIGIvY29yZS9jb21iby9IT1NUX2xpbnV4LXg4Nl82NC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1NzMzZi4uMDAwMDAwMAotLS0gYS9jb3JlL2NvbWJvL0hPU1RfbGludXgteDg2XzY0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBDb25maWd1cmF0aW9uIGZvciBidWlsZHMgaG9zdGVkIG9uIGxpbnV4LXg4Nl82NC4KLSMgSW5jbHVkZWQgYnkgY29tYm8vc2VsZWN0Lm1rCi0KLWRlZmluZSAkKGNvbWJvX3Zhcl9wcmVmaXgpdHJhbnNmb3JtLXNoYXJlZC1saWItdG8tdG9jCi0kKGNhbGwgX2dlbl90b2NfY29tbWFuZF9mb3JfZWxmLCQoMSksJCgyKSkKLWVuZGVmCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL0hPU1RfbGludXgteDg2Lm1rIGIvY29yZS9jb21iby9IT1NUX2xpbnV4Lm1rCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGNvcmUvY29tYm8vSE9TVF9saW51eC14ODYubWsKcmVuYW1lIHRvIGNvcmUvY29tYm8vSE9TVF9saW51eC5tawppbmRleCAzZjRlYzBhLi5iZmRkM2ViIDEwMDY0NAotLS0gYS9jb3JlL2NvbWJvL0hPU1RfbGludXgteDg2Lm1rCisrKyBiL2NvcmUvY29tYm8vSE9TVF9saW51eC5tawpAQCAtMTQsNyArMTQsNyBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBDb25maWd1cmF0aW9uIGZvciBidWlsZHMgaG9zdGVkIG9uIGxpbnV4LXg4Ni4KKyMgQ29uZmlndXJhdGlvbiBmb3IgYnVpbGRzIGhvc3RlZCBvbiBsaW51eC4KICMgSW5jbHVkZWQgYnkgY29tYm8vc2VsZWN0Lm1rCiAKIGRlZmluZSAkKGNvbWJvX3Zhcl9wcmVmaXgpdHJhbnNmb3JtLXNoYXJlZC1saWItdG8tdG9jCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL2FyY2gveDg2L2dvbGRtb250LXdpdGhvdXQtc2hhLXhzYXZlcy5tayBiL2NvcmUvY29tYm8vYXJjaC94ODYvZ29sZG1vbnQtd2l0aG91dC1zaGEteHNhdmVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTNjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NvbWJvL2FyY2gveDg2L2dvbGRtb250LXdpdGhvdXQtc2hhLXhzYXZlcy5tawpAQCAtMCwwICsxLDcgQEAKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGZlYXR1cmUgbWFjcm8gZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlCisjIGdvbGRtb250LXdpdGhvdXQteHNhdmVzIGFyY2ggdmFyaWFudC4KKyMKKyMgU2VlIGJ1aWxkL21ha2UvY29yZS9jb21iby9hcmNoL3g4Ni94ODYtYXRvbS5tayBmb3IgZGlmZmVyZW5jZXMuCisjCisKK0FSQ0hfWDg2X0hBVkVfU1NFNF8xIDo9IHRydWUKZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vYXJjaC94ODZfNjQvZ29sZG1vbnQtd2l0aG91dC1zaGEteHNhdmVzLm1rIGIvY29yZS9jb21iby9hcmNoL3g4Nl82NC9nb2xkbW9udC13aXRob3V0LXNoYS14c2F2ZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5M2MxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY29tYm8vYXJjaC94ODZfNjQvZ29sZG1vbnQtd2l0aG91dC1zaGEteHNhdmVzLm1rCkBAIC0wLDAgKzEsNyBAQAorIyBUaGlzIGZpbGUgY29udGFpbnMgZmVhdHVyZSBtYWNybyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUKKyMgZ29sZG1vbnQtd2l0aG91dC14c2F2ZXMgYXJjaCB2YXJpYW50LgorIworIyBTZWUgYnVpbGQvbWFrZS9jb3JlL2NvbWJvL2FyY2gveDg2L3g4Ni1hdG9tLm1rIGZvciBkaWZmZXJlbmNlcy4KKyMKKworQVJDSF9YODZfSEFWRV9TU0U0XzEgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9zZWxlY3QubWsgYi9jb3JlL2NvbWJvL3NlbGVjdC5tawppbmRleCA5YzdlNjllLi5hODM2ZWQ4IDEwMDY0NAotLS0gYS9jb3JlL2NvbWJvL3NlbGVjdC5taworKysgYi9jb3JlL2NvbWJvL3NlbGVjdC5tawpAQCAtMjEsOCArMjEsMTIgQEAKICMJY29tYm9fMm5kX2FyY2hfcHJlZml4IC0tIGl0J3MgZGVmaW5lZCBpZiB0aGlzIGlzIGxvYWRlZCBmb3IgdGhlIDJuZCBhcmNoLgogIwogCi0jIEJ1aWxkIGEgdGFyZ2V0IHN0cmluZyBsaWtlICJsaW51eC1hcm0iIG9yICJkYXJ3aW4teDg2Ii4KLWNvbWJvX29zX2FyY2ggOj0gJCgkKGNvbWJvX3RhcmdldClPUyktJCgkKGNvbWJvX3RhcmdldCkkKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClBUkNIKQoraWZlcSAoJChjb21ib190YXJnZXQpLEhPU1RfKQorICBjb21ib19vc19hcmNoIDo9ICQoSE9TVF9PUykKK2Vsc2UKKyAgIyBCdWlsZCBhIHRhcmdldCBzdHJpbmcgbGlrZSAibGludXgtYXJtIiBvciAiZGFyd2luLXg4NiIuCisgIGNvbWJvX29zX2FyY2ggOj0gJCgkKGNvbWJvX3RhcmdldClPUyktJCgkKGNvbWJvX3RhcmdldCkkKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClBUkNIKQorZW5kaWYKIAogY29tYm9fdmFyX3ByZWZpeCA6PSAkKGNvbWJvXzJuZF9hcmNoX3ByZWZpeCkkKGNvbWJvX3RhcmdldCkKIApkaWZmIC0tZ2l0IGEvY29yZS9jb25maWcubWsgYi9jb3JlL2NvbmZpZy5tawppbmRleCAwYzA4NmVlLi44MmI2M2NmIDEwMDY0NAotLS0gYS9jb3JlL2NvbmZpZy5taworKysgYi9jb3JlL2NvbmZpZy5tawpAQCAtNDIsNiArNDIsOSBAQAogIyBNYXJrIHZhcmlhYmxlcyBkZXByZWNhdGVkL29ic29sZXRlCiBDSEFOR0VTX1VSTCA6PSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9idWlsZC8rL21hc3Rlci9DaGFuZ2VzLm1kCiAuS0FUSV9SRUFET05MWSA6PSBDSEFOR0VTX1VSTAorJChLQVRJX2RlcHJlY2F0ZWRfdmFyIFRBUkdFVF9VU0VTXzY0X0JJVF9CSU5ERVIsQWxsIGRldmljZXMgdXNlIDY0LWJpdCBiaW5kZXIgYnkgZGVmYXVsdCBub3cuIFVzZXMgb2YgVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiBzaG91bGQgYmUgcmVtb3ZlZC4pCiskKEtBVElfZGVwcmVjYXRlZF92YXIgUFJPRFVDVF9TRVBPTElDWV9TUExJVCxBbGwgZGV2aWNlcyBhcmUgYnVpbHQgd2l0aCBzcGxpdCBzZXBvbGljeS4pCiskKEtBVElfZGVwcmVjYXRlZF92YXIgUFJPRFVDVF9TRVBPTElDWV9TUExJVF9PVkVSUklERSxBbGwgZGV2aWNlcyBhcmUgYnVpbHQgd2l0aCBzcGxpdCBzZXBvbGljeS4pCiAkKEtBVElfb2Jzb2xldGVfdmFyIFBBVEgsRG8gbm90IHVzZSBQQVRIIGRpcmVjdGx5LiBTZWUgJChDSEFOR0VTX1VSTCkjUEFUSCkKICQoS0FUSV9vYnNvbGV0ZV92YXIgUFlUSE9OUEFUSCxEbyBub3QgdXNlIFBZVEhPTlBBVEggZGlyZWN0bHkuIFNlZSAkKENIQU5HRVNfVVJMKSNQWVRIT05QQVRIKQogJChLQVRJX29ic29sZXRlX3ZhciBPVVQsVXNlIE9VVF9ESVIgaW5zdGVhZC4gU2VlICQoQ0hBTkdFU19VUkwpI09VVCkKQEAgLTEwNyw2ICsxMTAsNyBAQAogJChLQVRJX29ic29sZXRlX3ZhciBCVUlMRF9CUk9LRU5fRU5HX0RFQlVHX1RBR1MpCiAkKEtBVElfb2Jzb2xldGVfZXhwb3J0IEl0IGlzIGEgZ2xvYmFsIHNldHRpbmcuIFNlZSAkKENIQU5HRVNfVVJMKSNleHBvcnRfa2V5d29yZCkKICQoS0FUSV9vYnNvbGV0ZV92YXIgQlVJTERfQlJPS0VOX0FORFJPSURNS19FWFBPUlRTKQorJChLQVRJX29ic29sZXRlX3ZhciBQUk9EVUNUX05PVElDRV9TUExJVF9PVkVSUklERSxTdG9wIHVzaW5nIHRoaXMsIGtlZXAgY2FsbSwgYW5kIGNhcnJ5IG9uLikKICQoS0FUSV9vYnNvbGV0ZV92YXIgUFJPRFVDVF9TVEFUSUNfQk9PVF9DT05UUk9MX0hBTCxVc2Ugc2hhcmVkIGxpYnJhcnkgbW9kdWxlIGluc3RlYWQuIFNlZSAkKENIQU5HRVNfVVJMKSNQUk9EVUNUX1NUQVRJQ19CT09UX0NPTlRST0xfSEFMKQogJChLQVRJX29ic29sZXRlX3ZhciBcCiAgIEFSQ0hfQVJNX0hBVkVfQVJNVjdBIFwKQEAgLTE2OCw2ICsxNzIsNyBAQAogJChLQVRJX29ic29sZXRlX3ZhciBCT0FSRF9QUkVCVUlMVF9QVk1GV0lNQUdFLHB2bWZ3LmJpbiBpcyBub3cgYnVpbHQgaW4gQU9TUCBhbmQgY3VzdG9tIHZlcnNpb25zIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkKQogJChLQVRJX29ic29sZXRlX3ZhciBCVUlMRElOR19QVk1GV19JTUFHRSxCVUlMRElOR19QVk1GV19JTUFHRSBpcyBubyBsb25nZXIgdXNlZCkKICQoS0FUSV9vYnNvbGV0ZV92YXIgQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UpCiskKEtBVElfb2Jzb2xldGVfdmFyIEZTX0dFVF9TVEFUUykKIAogIyBVc2VkIHRvIGZvcmNlIGdvYWxzIHRvIGJ1aWxkLiAgT25seSB1c2UgZm9yIGNvbmRpdGlvbmFsbHkgZGVmaW5lZCBnb2Fscy4KIC5QSE9OWTogRk9SQ0UKQEAgLTI3MCw3ICsyNzUsNyBAQAogIyBFeDogJChjYWxsIGFkZF9zb29uZ19jb25maWdfbmFtZXNwYWNlLGFjbWUpCiAKIGRlZmluZSBhZGRfc29vbmdfY29uZmlnX25hbWVzcGFjZQotJChldmFsIFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTICs9ICQxKSBcCiskKGV2YWwgU09PTkdfQ09ORklHX05BTUVTUEFDRVMgKz0gJChzdHJpcCAkMSkpIFwKICQoZXZhbCBTT09OR19DT05GSUdfJChzdHJpcCAkMSkgOj0pCiBlbmRlZgogCkBAIC0yODAsOCArMjg1LDggQEAKICMgJDEgaXMgdGhlIG5hbWVzcGFjZS4gJDIgaXMgdGhlIGxpc3Qgb2YgdmFyaWFibGVzLgogIyBFeDogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLGFjbWUsQ09PTF9GRUFUVVJFX0EgQ09PTF9GRUFUVVJFX0IpCiBkZWZpbmUgYWRkX3Nvb25nX2NvbmZpZ192YXIKLSQoZXZhbCBTT09OR19DT05GSUdfJChzdHJpcCAkMSkgKz0gJDIpIFwKLSQoZm9yZWFjaCB2LCQoc3RyaXAgJDIpLCQoZXZhbCBTT09OR19DT05GSUdfJChzdHJpcCAkMSlfJHYgOj0gJCgkdikpKQorJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKSArPSAkKHN0cmlwICQyKSkgXAorJChmb3JlYWNoIHYsJChzdHJpcCAkMiksJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKV8kdiA6PSAkKHN0cmlwICQoJHYpKSkpCiBlbmRlZgogCiAjIFRoZSBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSBmdW5jdGlvbiBkZWZpbmVzIGEgbWFrZSB2YXJpYWJsZSBhbmQgYWxzbyBhZGRzCkBAIC0yOTAsNyArMjk1LDcgQEAKICMgRXg6ICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxhY21lLENPT0xfRkVBVFVSRSx0cnVlKQogCiBkZWZpbmUgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUKLSQoZXZhbCAkMiA6PSAkMykgXAorJChldmFsICQoc3RyaXAgJDIpIDo9ICQoc3RyaXAgJDMpKSBcCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsJDEsJDIpCiBlbmRlZgogCkBAIC0yOTgsOCArMzAzLDggQEAKICMKICMgaW50ZXJuYWwgdXRpbGl0eSB0byBkZWZpbmUgYSBuYW1lc3BhY2UgYW5kIGEgdmFyaWFibGUgaW4gaXQuCiBkZWZpbmUgc29vbmdfY29uZmlnX2RlZmluZV9pbnRlcm5hbAotJChpZiAkKGZpbHRlciAkMSwkKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSksLCQoZXZhbCBTT09OR19DT05GSUdfTkFNRVNQQUNFUzo9JChTT09OR19DT05GSUdfTkFNRVNQQUNFUykgJDEpKSBcCi0kKGlmICQoZmlsdGVyICQyLCQoU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpKSksLCQoZXZhbCBTT09OR19DT05GSUdfJChzdHJpcCAkMSk6PSQoU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpKSAkMikpCiskKGlmICQoZmlsdGVyICQxLCQoU09PTkdfQ09ORklHX05BTUVTUEFDRVMpKSwsJChldmFsIFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTOj0kKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSAkKHN0cmlwICQxKSkpIFwKKyQoaWYgJChmaWx0ZXIgJDIsJChTT09OR19DT05GSUdfJChzdHJpcCAkMSkpKSwsJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKTo9JChTT09OR19DT05GSUdfJChzdHJpcCAkMSkpICQoc3RyaXAgJDIpKSkKIGVuZGVmCiAKICMgc29vbmdfY29uZmlnX3NldCBkZWZpbmVzIHRoZSB2YXJpYWJsZSBpbiB0aGUgZ2l2ZW4gU29vbmcgY29uZmlnIG5hbWVzcGFjZQpAQCAtMzA4LDcgKzMxMywyMCBAQAogIyBFeDogJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYWNtZSxDT09MX0ZFQVRVUkUsdHJ1ZSkKIGRlZmluZSBzb29uZ19jb25maWdfc2V0CiAkKGNhbGwgc29vbmdfY29uZmlnX2RlZmluZV9pbnRlcm5hbCwkMSwkMikgXAotJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKV8kKHN0cmlwICQyKTo9JDMpCiskKGV2YWwgU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpXyQoc3RyaXAgJDIpOj0kKHN0cmlwICQzKSkKK2VuZGVmCisKKyMgc29vbmdfY29uZmlnX3NldF9ib29sIGlzIHRoZSBzYW1lIGFzIHNvb25nX2NvbmZpZ19zZXQsIGJ1dCBpdCB3aWxsCisjIGFsc28gdHlwZSB0aGUgdmFyaWFibGUgYXMgYSBib29sLCBzbyB0aGF0IHdoZW4gdXNpbmcgc2VsZWN0KCkgZXhwcmVzc2lvbnMKKyMgaW4gYmx1ZXByaW50IGZpbGVzIHRoZXkgY2FuIHVzZSBib29sZWFuIHZhbHVlcyBpbnN0ZWFkIG9mIHN0cmluZ3MuCisjIEl0IHdpbGwgb25seSBhY2NlcHQgInRydWUiIGZvciBpdHMgdmFsdWUsIGFueSBvdGhlciB2YWx1ZSB3aWxsIGJlCisjIHRyZWF0ZWQgYXMgZmFsc2UuCisjICQxIGlzIHRoZSBuYW1lc3BhY2UuICQyIGlzIHRoZSB2YXJpYWJsZSBuYW1lLiAkMyBpcyB0aGUgdmFyaWFibGUgdmFsdWUuCisjIEV4OiAkKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGFjbWUsQ09PTF9GRUFUVVJFLHRydWUpCitkZWZpbmUgc29vbmdfY29uZmlnX3NldF9ib29sCiskKGNhbGwgc29vbmdfY29uZmlnX2RlZmluZV9pbnRlcm5hbCwkMSwkMikgXAorJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKV8kKHN0cmlwICQyKTo9JChmaWx0ZXIgdHJ1ZSwkMykpCiskKGV2YWwgU09PTkdfQ09ORklHX1RZUEVfJChzdHJpcCAkMSlfJChzdHJpcCAkMik6PWJvb2wpCiBlbmRlZgogCiAjIHNvb25nX2NvbmZpZ19hcHBlbmQgYXBwZW5kcyB0byB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBnaXZlbiBTb29uZwpAQCAtMzE3LDcgKzMzNSw3IEBACiAjICQxIGlzIHRoZSBuYW1lc3BhY2UsICQyIGlzIHRoZSB2YXJpYWJsZSBuYW1lLCAkMyBpcyB0aGUgdmFsdWUKIGRlZmluZSBzb29uZ19jb25maWdfYXBwZW5kCiAkKGNhbGwgc29vbmdfY29uZmlnX2RlZmluZV9pbnRlcm5hbCwkMSwkMikgXAotJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKV8kKHN0cmlwICQyKTo9JChTT09OR19DT05GSUdfJChzdHJpcCAkMSlfJChzdHJpcCAkMikpICQzKQorJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKV8kKHN0cmlwICQyKTo9JChTT09OR19DT05GSUdfJChzdHJpcCAkMSlfJChzdHJpcCAkMikpICQoc3RyaXAgJDMpKQogZW5kZWYKIAogIyBzb29uZ19jb25maWdfYXBwZW5kIGdldHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpbiB0aGUgZ2l2ZW4gU29vbmcKQEAgLTMzOSw2ICszNTcsMjMgQEAKIEpBVkFfVE1QRElSX0FSRyA6PQogZW5kaWYKIAorIyBUaGVzZSBidWlsZCBicm9rZW4gdmFyaWFibGVzIGFyZSBpbnRlbmRlZCB0byBiZSBzZXQgaW4gYSBidWlsZHNwZWMgZmlsZSwKKyMgd2hpbGUgb3RoZXIgYnVpbGQgYnJva2VuIGZsYWdzIGFyZSBleHBlY3RlZCB0byBiZSBzZXQgaW4gYSBib2FyZCBjb25maWcuCisjIFRoZXNlIGFyZSBidWlsZCBicm9rZW4gdmFyaWFibGVzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGFwcGx5IGFjcm9zcyBib2FyZAorIyBjb25maWdzLCBnZW5lcmFsbHkgZm9yIGNyb3NzLWN1dHRpbmcgZmVhdHVyZXMuCisKKyMgQnVpbGQgYnJva2VuIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGJvb2xlYW5zCitfYnVpbGRfYnJva2VuX2Jvb2xfdmFycyA6PSBcCisgIEJVSUxEX0JST0tFTl9VU0VTX1NPT05HX1BZVEhPTjJfTU9EVUxFUyBcCisKKyMgQnVpbGQgYnJva2VuIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGxpc3RzCitfYnVpbGRfYnJva2VuX2xpc3RfdmFycyA6PSBcCisgIEJVSUxEX0JST0tFTl9QTFVHSU5fVkFMSURBVElPTiBcCisKK19idWlsZF9icm9rZW5fdmFyX25hbWVzIDo9ICQoX2J1aWxkX2Jyb2tlbl9ib29sX3ZhcnMpCitfYnVpbGRfYnJva2VuX3Zhcl9uYW1lcyArPSAkKF9idWlsZF9icm9rZW5fbGlzdF92YXJzKQorJChmb3JlYWNoIHYsJChfYnVpbGRfYnJva2VuX3Zhcl9uYW1lcyksJChldmFsICQodikgOj0pKQorCiAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBJbmNsdWRlIHN1Yi1jb25maWd1cmF0aW9uIGZpbGVzCiAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMzU4LDYgKzM5MywxMyBAQAogIyBhcmUgc3BlY2lmaWMgdG8gdGhlIHVzZXIncyBidWlsZCBjb25maWd1cmF0aW9uLgogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZW52c2V0dXAubWsKIAorCiskKGZvcmVhY2ggdmFyLCQoX2J1aWxkX2Jyb2tlbl9ib29sX3ZhcnMpLCBcCisgICQoaWYgJChmaWx0ZXItb3V0IHRydWUgZmFsc2UsJCgkKHZhcikpKSwgXAorICAgICQoZXJyb3IgVmFsaWQgdmFsdWVzIG9mICQodmFyKSBhcmUgInRydWUiLCAiZmFsc2UiLCBhbmQgIiIuIE5vdCAiJCgkKHZhcikpIikpKQorCisuS0FUSV9SRUFET05MWSA6PSAkKF9idWlsZF9icm9rZW5fdmFyX25hbWVzKQorCiAjIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIGxvdyBtZW1vcnkgZGV2aWNlLCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KIGRlZmluZSBpcy1sb3ctbWVtLWRldmljZQogJChpZiAkKGZpbmRzdHJpbmcgcm8uY29uZmlnLmxvd19yYW09dHJ1ZSwkKFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTKSksdHJ1ZSxcCkBAIC0zNzEsMzggKzQxMyw0MiBAQAogJChpZiAkKGZpbmRzdHJpbmcgcm8uY29uZmlnLmxvd19yYW09dHJ1ZSwkKFBST0RVQ1RfT0RNX1BST1BFUlRJRVMpKSx0cnVlLGZhbHNlKSkpKSkpKSkpCiBlbmRlZgogCi0jIEdldCB0aGUgYm9hcmQgQVBJIGxldmVsLgotYm9hcmRfYXBpX2xldmVsIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCi1pZmRlZiBCT0FSRF9BUElfTEVWRUwKLSAgYm9hcmRfYXBpX2xldmVsIDo9ICQoQk9BUkRfQVBJX0xFVkVMKQotZWxzZSBpZmRlZiBCT0FSRF9TSElQUElOR19BUElfTEVWRUwKLSAgIyBWZW5kb3JzIHdpdGggR1JGIG11c3QgZGVmaW5lIEJPQVJEX1NISVBQSU5HX0FQSV9MRVZFTCBmb3IgdGhlIHZlbmRvciBBUEkgbGV2ZWwuCi0gIGJvYXJkX2FwaV9sZXZlbCA6PSAkKEJPQVJEX1NISVBQSU5HX0FQSV9MRVZFTCkKLWVuZGlmCi0KLSMgQ2FsY3VsYXRlIHRoZSBWU1IgdmVuZG9yIEFQSSBsZXZlbC4KLXZzcl92ZW5kb3JfYXBpX2xldmVsIDo9ICQoYm9hcmRfYXBpX2xldmVsKQotCi1pZmRlZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTAotICB2c3JfdmVuZG9yX2FwaV9sZXZlbCA6PSAkKGNhbGwgbWF0aF9taW4sJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksJChib2FyZF9hcGlfbGV2ZWwpKQotZW5kaWYKLQogIyBTZXQgVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVELgorIyBUQVJHRVRfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQgaW5kaWNhdGVzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIEVMRiBzZWdtZW50cy4KIGlmZGVmIFBST0RVQ1RfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQKICAgVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEIDo9ICQoUFJPRFVDVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCkKIGVsc2UgaWZlcSAoJChzdHJpcCAkKGNhbGwgaXMtbG93LW1lbS1kZXZpY2UpKSx0cnVlKQogICAjIExvdyBtZW1vcnkgZGV2aWNlIHdpbGwgaGF2ZSA0MDk2IGJpbmFyeSBhbGlnbm1lbnQuCiAgIFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCA6PSA0MDk2Ci1lbHNlCi0gICMgVGhlIGRlZmF1bHQgYmluYXJ5IGFsaWdubWVudCBmb3IgdXNlcnNwYWNlIGlzIDQwOTYuCitlbHNlIGlmZXEgKCQoY2FsbCBtYXRoX2x0LCQoVlNSX1ZFTkRPUl9BUElfTEVWRUwpLDM0KSx0cnVlKQogICBUQVJHRVRfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQgOj0gNDA5NgotICAjIFdoZW4gVlNSIHZlbmRvciBBUEkgbGV2ZWwgPj0gMzQsIGJpbmFyeSBhbGlnbm1lbnQgd2lsbCBiZSA2NTUzNi4KLSAgaWZlcSAoJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJCh2c3JfdmVuZG9yX2FwaV9sZXZlbCksMzQpLHRydWUpCi0gICAgICBUQVJHRVRfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQgOj0gNjU1MzYKLSAgZW5kaWYKK2Vsc2UgaWZlcSAoLCQoZmlsdGVyIGFybTY0IHg4Nl82NCwkKFRBUkdFVF9BUkNIKSkpCisgICMgVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEID4gNDA5NiBpcyBvbmx5IHN1cHBvcnRlZCBpbiBhcm02NCBhbmQKKyAgIyB4ODZfNjQgdGFyZ2V0cy4KKyAgVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEIDo9IDQwOTYKK2Vsc2UKKyAgIyBUaGUgZGVmYXVsdCBiaW5hcnkgYWxpZ25tZW50IGZvciB1c2Vyc3BhY2UgaXMgMTYzODQuCisgIFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCA6PSAxNjM4NAogZW5kaWYKIC5LQVRJX1JFQURPTkxZIDo9IFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRAogCitpZmRlZiBQUk9EVUNUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUKKyAgVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUgOj0gJChQUk9EVUNUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUpCitlbHNlCisgIFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9IGZhbHNlCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUKKworIyBCb29sZWFuIHZhcmlhYmxlIGRldGVybWluaW5nIGlmIEFPU1AgcmVsaWVzIG9uIGJpb25pYydzIFBBR0VfU0laRSBtYWNyby4KK2lmZGVmIFBST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTworICBUQVJHRVRfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTyA6PSAkKFBST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTykKK2Vsc2UgaWZlcSAoJChjYWxsIG1hdGhfbHQsJChWU1JfVkVORE9SX0FQSV9MRVZFTCksMzUpLHRydWUpCisgIFRBUkdFVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPIDo9IGZhbHNlCitlbHNlCisgIFRBUkdFVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPIDo9IHRydWUKK2VuZGlmCisuS0FUSV9SRUFET05MWSA6PSBUQVJHRVRfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTworCiAjIFBydW5lZCBkaXJlY3Rvcnkgb3B0aW9ucyB1c2VkIHdoZW4gdXNpbmcgZmluZGxlYXZlcy5weQogIyBTZWUgZW52c2V0dXAubWsgZm9yIGEgZGVzY3JpcHRpb24gb2YgU0NBTl9FWENMVURFX0RJUlMKIEZJTkRfTEVBVkVTX0VYQ0xVREVTIDo9ICQoYWRkcHJlZml4IC0tcHJ1bmU9LCAkKFNDQU5fRVhDTFVERV9ESVJTKSAucmVwbyAuZ2l0KQpAQCAtNDgzLDcgKzUyOSw2IEBACiAKIGlmZXEgKCQoQ0FMTEVEX0ZST01fU0VUVVApLHRydWUpCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jY2FjaGUubWsKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2dvbWEubWsKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3JiZS5tawogZW5kaWYKIApAQCAtNTQ4LDcgKzU5MywxMCBAQAogRElTQUJMRV9QUkVPUFRfQk9PVF9JTUFHRVMgOj0KIGlmbmVxICgsJChUQVJHRVRfQlVJTERfQVBQUykkKFRBUkdFVF9CVUlMRF9VTkJVTkRMRURfSU1BR0UpKQogICBESVNBQkxFX1BSRU9QVCA6PSB0cnVlCi0gIERJU0FCTEVfUFJFT1BUX0JPT1RfSU1BR0VTIDo9IHRydWUKKyAgIyBWU0RLIGJ1aWxkcyBwZXJmb3JtIGRleHByZW9wdCBkdXJpbmcgbWVyZ2VfdGFyZ2V0X2ZpbGVzIGJ1aWxkIHN0ZXAuCisgIGlmbmVxICh0cnVlLCQoQlVJTERJTkdfV0lUSF9WU0RLKSkKKyAgICBESVNBQkxFX1BSRU9QVF9CT09UX0lNQUdFUyA6PSB0cnVlCisgIGVuZGlmCiBlbmRpZgogaWZlcSAodHJ1ZSwkKFRBUkdFVF9CVUlMRF9VTkJVTkRMRUQpKQogICBpZm5lcSAodHJ1ZSwkKFVOQlVORExFRF9CVUlMRF9TREtTX0ZST01fU09VUkNFKSkKQEAgLTU3NCw4ICs2MjIsNiBAQAogcHJlYnVpbHRfYnVpbGRfdG9vbHNfYmluIDo9ICQocHJlYnVpbHRfYnVpbGRfdG9vbHMpLyQoSE9TVF9QUkVCVUlMVF9UQUcpL2FzYW4vYmluCiBlbmRpZgogCi1VU0VfUFJFQlVJTFRfU0RLX1RPT0xTX0lOX1BMQUNFIDo9IHRydWUKLQogIyBXb3JrIGFyb3VuZCBmb3IgYi82ODQwNjIyMAogIyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgc29vbmcgdmVyc2lvbi4KIFVTRV9EOCA6PSB0cnVlCkBAIC02MDksNiArNjU1LDcgQEAKIEZJTEVTTElTVF9VVElMIDo9JD0gYnVpbGQvbWFrZS90b29scy9maWxlc2xpc3RfdXRpbC5weQogSE9TVF9JTklUX1ZFUklGSUVSIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2hvc3RfaW5pdF92ZXJpZmllcgogWE1MTElOVCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS94bWxsaW50CitBQ09ORklHIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fjb25maWcKIAogIyBTT09OR19aSVAgaXMgZXhwb3J0ZWQgYnkgU29vbmcsIGJ1dCBuZWVkcyB0byBiZSBkZWZpbmVkIGVhcmx5IGZvcgogIyAkT1VUL2RleHByZW9wdC5nbG9iYWwuICBJdCB3aWxsIGJlIHZlcmlmaWVkIGFnYWluc3QgdGhlIFNvb25nIHZlcnNpb24uCkBAIC02MjksMjkgKzY3NiwyMyBAQAogIyBGb3Igbm9uLXN1cHBvcnRlZCBob3N0cywgZG8gbm90IGdlbmVyYXRlIGJyZWFrcGFkIHN5bWJvbHMuCiBCUkVBS1BBRF9HRU5FUkFURV9TWU1CT0xTIDo9IGZhbHNlCiBlbmRpZgorR1pJUCA6PSBwcmVidWlsdHMvYnVpbGQtdG9vbHMvcGF0aC8kKEJVSUxEX09TKS0kKEhPU1RfUFJFQlVJTFRfQVJDSCkvZ3ppcAogUFJPVE9DIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fwcm90b2MkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBOQU5PUEJfU1JDUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9wcm90b2MtZ2VuLW5hbm9wYgogTUtCT09URlMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtib290ZnMkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCi1NSU5JR1pJUCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9taW5pZ3ppcCQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKK01JTklHWklQIDo9ICQoR1pJUCkKIExaNCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9sejQkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCi1HRU5FUkFURV9HS0lfQ0VSVElGSUNBVEUgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZ2VuZXJhdGVfZ2tpX2NlcnRpZmljYXRlJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogaWZlcSAoLCQoc3RyaXAgJChCT0FSRF9DVVNUT01fTUtCT09USU1HKSkpCiBNS0JPT1RJTUcgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtib290aW1nJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogZWxzZQogTUtCT09USU1HIDo9ICQoQk9BUkRfQ1VTVE9NX01LQk9PVElNRykKIGVuZGlmCi1pZmVxICgsJChzdHJpcCAkKEJPQVJEX0NVU1RPTV9CUFRUT09MKSkpCi1CUFRUT09MIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2JwdHRvb2wkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCi1lbHNlCi1CUFRUT09MIDo9ICQoQk9BUkRfQ1VTVE9NX0JQVFRPT0wpCi1lbmRpZgogaWZlcSAoLCQoc3RyaXAgJChCT0FSRF9DVVNUT01fQVZCVE9PTCkpKQogQVZCVE9PTCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hdmJ0b29sJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogZWxzZQogQVZCVE9PTCA6PSAkKEJPQVJEX0NVU1RPTV9BVkJUT09MKQogZW5kaWYKIEFQSUNIRUNLIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL21ldGFsYXZhJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCkKLUZTX0dFVF9TVEFUUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9mc19nZXRfc3RhdHMkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBNS0VYVFVTRVJJTUcgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWt1c2VyaW1nX21rZTJmcwogTUtFMkZTX0NPTkYgOj0gc3lzdGVtL2V4dHJhcy9leHQ0X3V0aWxzL21rZTJmcy5jb25mCiBNS0VST0ZTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21rZnMuZXJvZnMKQEAgLTY3Myw4ICs3MTQsMTAgQEAKIEJVSUxEX1NVUEVSX0lNQUdFIDo9ICQoQk9BUkRfQ1VTVE9NX0JVSUxEX1NVUEVSX0lNQUdFKQogZW5kaWYKIElNR19GUk9NX1RBUkdFVF9GSUxFUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9pbWdfZnJvbV90YXJnZXRfZmlsZXMkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCitVTlBBQ0tfQk9PVElNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS91bnBhY2tfYm9vdGltZwogTUFLRV9SRUNPVkVSWV9QQVRDSCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9tYWtlX3JlY292ZXJ5X3BhdGNoJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogT1RBX0ZST01fVEFSR0VUX0ZJTEVTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL290YV9mcm9tX3RhcmdldF9maWxlcyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKK09UQV9GUk9NX1JBV19JTUcgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvb3RhX2Zyb21fcmF3X2ltZyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIFNQQVJTRV9JTUcgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvc3BhcnNlX2ltZyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIENIRUNLX1BBUlRJVElPTl9TSVpFUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jaGVja19wYXJ0aXRpb25fc2l6ZXMkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBTWU1CT0xTX01BUCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9zeW1ib2xzX21hcApAQCAtNjg4LDggKzczMSw2IEBACiBWRVJJVFlfU0lHTkVSIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Zlcml0eV9zaWduZXIKIEJVSUxEX1ZFUklUWV9NRVRBREFUQSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9idWlsZF92ZXJpdHlfbWV0YWRhdGEKIEJVSUxEX1ZFUklUWV9UUkVFIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2J1aWxkX3Zlcml0eV90cmVlCi1GVVRJTElUWSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9mdXRpbGl0eS1ob3N0Ci1WQk9PVF9TSUdORVIgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvdmJvb3Rfc2lnbmVyCiAKIERFWERVTVAgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZGV4ZHVtcCQoQlVJTERfRVhFQ1VUQUJMRV9TVUZGSVgpCiBQUk9GTUFOIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Byb2ZtYW4KQEAgLTcwNiw3ICs3NDcsNyBAQAogIyBQYXRoIHRvIHRvb2xzLmphcgogSE9TVF9KREtfVE9PTFNfSkFSIDo9ICQoQU5EUk9JRF9KQVZBOF9IT01FKS9saWIvdG9vbHMuamFyCiAKLUFQSUNIRUNLX0NPTU1BTkQgOj0gJChKQVZBKSAtWG14NGcgLWphciAkKEFQSUNIRUNLKSAtLW5vLWJhbm5lcgorQVBJQ0hFQ0tfQ09NTUFORCA6PSAkKEpBVkEpIC1YbXg0ZyAtamFyICQoQVBJQ0hFQ0spCiAKICMgQm9vbGVhbiB2YXJpYWJsZSBkZXRlcm1pbmluZyBpZiB0aGUgYWxsb3cgbGlzdCBmb3IgY29tcGF0aWJsZSBwcm9wZXJ0aWVzIGlzIGVuYWJsZWQKIFBST0RVQ1RfQ09NUEFUSUJMRV9QUk9QRVJUWSA6PSB0cnVlCkBAIC03MjcsMTcgKzc2OCw5IEBACiAgIFBST0RVQ1RfRlVMTF9UUkVCTEUgOj0gdHJ1ZQogZW5kaWYKIAotIyBUT0RPKGIvNjk4NjUwMzIpOiBNYWtlIFBST0RVQ1RfTk9USUNFX1NQTElUIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZCByZW1vdmUKLSMgICAgcmVmZXJlbmNlcyB0byBpdCBoZXJlIGFuZCBiZWxvdy4KLWlmZGVmIFBST0RVQ1RfTk9USUNFX1NQTElUX09WRVJSSURFCi0gICAkKGVycm9yIFBST0RVQ1RfTk9USUNFX1NQTElUX09WRVJSSURFIGNhbm5vdCBiZSBzZXQuKQotZW5kaWYKLQogcmVxdWlyZW1lbnRzIDo9IFwKICAgICBQUk9EVUNUX1RSRUJMRV9MSU5LRVJfTkFNRVNQQUNFUyBcCi0gICAgUFJPRFVDVF9TRVBPTElDWV9TUExJVCBcCi0gICAgUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUIFwKLSAgICBQUk9EVUNUX05PVElDRV9TUExJVAorICAgIFBST0RVQ1RfRU5GT1JDRV9WSU5URl9NQU5JRkVTVAogCiAjIElmIGl0IGlzIG92ZXJyaWRlbiwgdGhlbiB0aGUgcmVxdWlyZW1lbnQgb3ZlcnJpZGUgaXMgdGFrZW4sIG90aGVyd2lzZSBpdCdzCiAjIFBST0RVQ1RfRlVMTF9UUkVCTEUKQEAgLTc1MCwxMyArNzgzLDggQEAKIFBST0RVQ1RfRlVMTF9UUkVCTEVfT1ZFUlJJREUgPz0KICQoZm9yZWFjaCByZXEsJChyZXF1aXJlbWVudHMpLCQoZXZhbCAkKHJlcSlfT1ZFUlJJREUgPz0pKQogCi1pZm5lcSAoJChQUk9EVUNUX1NFUE9MSUNZX1NQTElUKSx0cnVlKQotIyBXQVJOSU5HOiBETyBOT1QgQ0hBTkdFOiBpZiB5b3UgYXJlIGRvd25zdHJlYW0gb2YgQU9TUCwgYW5kIHlvdSBjaGFuZ2UgdGhpcywgd2l0aG91dAotIyBsZXR0aW5nIHVwc3RyZWFtIGtub3cgaXQncyBpbXBvcnRhbnQgdG8geW91LCB3ZSBtYXkgZG8gY2xlYW51cCB3aGljaCBicmVha3MgdGhpcwotIyBzaWduaWZpY2FudGx5LiBQbGVhc2UgbGV0IHVzIGtub3cgaWYgeW91IGFyZSBjaGFuZ2luZyB0aGlzLgotIyBUT0RPKGIvMjU3MTc2MDE3KSAtIHVuc3BsaXQgc2Vwb2xpY3kgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZAotUFJPRFVDVF9TRVBPTElDWV9TUExJVCA6PSB0cnVlCi1lbmRpZgorIyB1c2VkIHRvIGJlIGEgcGFydCBvZiBQUk9EVUNUX0ZVTExfVFJFQkxFLCBidXQgbm93IGFsd2F5cyBzZXQgaXQKK1BST0RVQ1RfTk9USUNFX1NQTElUIDo9IHRydWUKIAogIyBUT0RPKGIvMTE0NDg4ODcwKTogZGlzYWxsb3cgUFJPRFVDVF9GVUxMX1RSRUJMRV9PVkVSUklERSBmcm9tIGJlaW5nIHVzZWQuCiAuS0FUSV9SRUFET05MWSA6PSBcCkBAIC03NjQsNiArNzkyLDExIEBACiAgICAgJChmb3JlYWNoIHJlcSwkKHJlcXVpcmVtZW50cyksJChyZXEpX09WRVJSSURFKSBcCiAgICAgJChyZXF1aXJlbWVudHMpIFwKICAgICBQUk9EVUNUX0ZVTExfVFJFQkxFIFwKKyAgICBQUk9EVUNUX05PVElDRV9TUExJVCBcCisKK2lmbmVxICgkKFBST0RVQ1RfRlVMTF9UUkVCTEUpLHRydWUpCisgICAgJCh3YXJuaW5nIFRoaXMgZGV2aWNlIGRvZXMgbm90IGhhdmUgVHJlYmxlIGVuYWJsZWQuIFRoaXMgaXMgdW5zYWZlLikKK2VuZGlmCiAKICQoS0FUSV9vYnNvbGV0ZV92YXIgJChmb3JlYWNoIHJlcSwkKHJlcXVpcmVtZW50cyksJChyZXEpX09WRVJSSURFKSBcCiAgICAgLFRoaXMgc2hvdWxkIGJlIHJlZmVyZW5jZWQgd2l0aG91dCB0aGUgX09WRVJSSURFIHN1ZmZpeC4pCkBAIC03NzgsMzUgKzgxMSwxMyBAQAogICBCT0FSRF9QUk9QRVJUWV9PVkVSUklERVNfU1BMSVRfRU5BQkxFRCA/PSB0cnVlCiBlbmRpZgogCi0jIFN0YXJ0aW5nIGluIEFuZHJvaWQgVSwgbm9uLVZOREsgZGV2aWNlcyBub3Qgc3VwcG9ydGVkCi0jIFdBUk5JTkc6IERPIE5PVCBDSEFOR0U6IGlmIHlvdSBhcmUgZG93bnN0cmVhbSBvZiBBT1NQLCBhbmQgeW91IGNoYW5nZSB0aGlzLCB3aXRob3V0Ci0jIGxldHRpbmcgdXBzdHJlYW0ga25vdyBpdCdzIGltcG9ydGFudCB0byB5b3UsIHdlIG1heSBkbyBjbGVhbnVwIHdoaWNoIGJyZWFrcyB0aGlzCi0jIHNpZ25pZmljYW50bHkuIFBsZWFzZSBsZXQgdXMga25vdyBpZiB5b3UgYXJlIGNoYW5naW5nIHRoaXMuCi1pZm5kZWYgQk9BUkRfVk5ES19WRVJTSU9OCi0jIFJFQUQgV0FSTklORyAtIERPIE5PVCBDSEFOR0UKLUJPQVJEX1ZOREtfVkVSU0lPTiA6PSBjdXJyZW50Ci0jIFJFQUQgV0FSTklORyAtIERPIE5PVCBDSEFOR0UKLWVuZGlmCi0KLWlmZGVmIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04KLSAgaWZuZGVmIEJPQVJEX1ZOREtfVkVSU0lPTgotICAgICMgVk5ESyBmb3IgcHJvZHVjdCBwYXJ0aXRpb24gaXMgbm90IGF2YWlsYWJsZSB1bmxlc3MgQk9BUkRfVk5ES19WRVJTSU9OCi0gICAgIyBkZWZpbmVkLgotICAgICQoZXJyb3IgUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTiBjYW5ub3QgYmUgZGVmaW5lZCB3aXRob3V0IGRlZmluaW5nIEJPQVJEX1ZOREtfVkVSU0lPTikKLSAgZW5kaWYKLWVuZGlmCi0KICMgU2V0IEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUyB0byB0aGUgbGF0ZXN0IFN5c3RlbVNESyB2ZXJzaW9uIHN0YXJ0aW5nIGZyb20gUC1sYXVuY2hpbmcKICMgZGV2aWNlcyBpZiB1bnNldC4KIGlmbmRlZiBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMKLSAgaWZkZWYgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwKLSAgaWZuZXEgKCQoY2FsbCBtYXRoX2d0X29yX2VxLCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLDI4KSwpCi0gICAgaWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCi0gICAgICBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMgOj0gJChQTEFURk9STV9TREtfVkVSU0lPTikKLSAgICBlbHNlCi0gICAgICBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMgOj0gJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKQotICAgIGVuZGlmCi0gIGVuZGlmCisgIGlmZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQorICAgIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUyA6PSAkKFBMQVRGT1JNX1NES19WRVJTSU9OKQorICBlbHNlCisgICAgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TIDo9ICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkKICAgZW5kaWYKIGVuZGlmCiAKQEAgLTgyOCwxNiArODM5LDYgQEAKICAgZWxzZQogICAgIG1pbl9zeXN0ZW1zZGtfdmVyc2lvbiA6PSAkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKQogICBlbmRpZgotICBpZm5lcSAoJChjYWxsIG51bWJlcnNfbGVzc190aGFuLCQobWluX3N5c3RlbXNka192ZXJzaW9uKSwkKEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUykpLCkKLSAgICAkKGVycm9yIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUyAoJChCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMpKSBtdXN0IGFsbCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQk9BUkRfQVBJX0xFVkVMLCBCT0FSRF9TSElQUElOR19BUElfTEVWRUwgb3IgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgKCQobWluX3N5c3RlbXNka192ZXJzaW9uKSkpCi0gIGVuZGlmCi0gIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwyOCksKQotICAgIGlmbmVxICgkKFRBUkdFVF9JU182NF9CSVQpLCB0cnVlKQotICAgICAgaWZuZXEgKCQoVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiksIHRydWUpCi0gICAgICAgICQoZXJyb3IgV2hlbiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA+PSAyOCwgVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiBtdXN0IGJlIHRydWUpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCiAgIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwyOSksKQogICAgIGlmbmVxICgkKEJPQVJEX09UQV9GUkFNRVdPUktfVkJNRVRBX1ZFUlNJT05fT1ZFUlJJREUpLCkKICAgICAgICQoZXJyb3IgV2hlbiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA+PSAyOSwgQk9BUkRfT1RBX0ZSQU1FV09SS19WQk1FVEFfVkVSU0lPTl9PVkVSUklERSBjYW5ub3QgYmUgc2V0KQpAQCAtODYyLDY1ICs4NjMsMzEgQEAKIC5LQVRJX1JFQURPTkxZIDo9IE1BSU5MSU5FX1NFUE9MSUNZX0RFVl9DRVJUSUZJQ0FURVMKIAogQlVJTERfTlVNQkVSX0ZST01fRklMRSA6PSAkJChjYXQgJChTT09OR19PVVRfRElSKS9idWlsZF9udW1iZXIudHh0KQorQlVJTERfSE9TVE5BTUVfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKFNPT05HX09VVF9ESVIpL2J1aWxkX2hvc3RuYW1lLnR4dCkKIEJVSUxEX0RBVEVUSU1FX0ZST01fRklMRSA6PSAkJChjYXQgJChCVUlMRF9EQVRFVElNRV9GSUxFKSkKIAogIyBTRVBvbGljeSB2ZXJzaW9ucwogCi0jIFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04gaXMgYSBudW1iZXIgb2YgdGhlIGZvcm0gIk5OLm0iIHdpdGggIk5OIiBtYXBwaW5nIHRvCi0jIFBMQVRGT1JNX1NES19WRVJTSU9OIGFuZCAibSIgYXMgYSBtaW5vciBudW1iZXIgd2hpY2ggYWxsb3dzIGZvciBTRUxpbnV4Ci0jIGNoYW5nZXMgaW5kZXBlbmRlbnQgb2YgUExBVEZPUk1fU0RLX1ZFUlNJT04uICBUaGlzIHZhbHVlIHdpbGwgYmUgc2V0IHRvCi0jIDEwMDAwLjAgdG8gcmVwcmVzZW50IHRpcC1vZi10cmVlIGRldmVsb3BtZW50IHRoYXQgaXMgaW5oZXJlbnRseSB1bnN0YWJsZSBhbmQKLSMgdGh1cyBkZXNpZ25lZCBub3QgdG8gd29yayB3aXRoIGFueSBzaGlwcGluZyB2ZW5kb3IgcG9saWN5LiAgVGhpcyBpcyBzaW1pbGFyIGluCi0jIHNwaXJpdCB0byBob3cgREVGQVVMVF9BUFBfVEFSR0VUX1NESyBpcyBzZXQuCi0jIFRoZSBtaW5vciB2ZXJzaW9uICgnbScgY29tcG9uZW50KSBtdXN0IGJlIHVwZGF0ZWQgZXZlcnkgdGltZSBhIHBsYXRmb3JtIHJlbGVhc2UKLSMgaXMgbWFkZSB3aGljaCBicmVha3MgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBwcmV2aW91cyBwbGF0Zm9ybSBzZXBvbGljeSB2ZXJzaW9uLAotIyBub3QganVzdCBvbiBldmVyeSBpbmNyZWFzZSBpbiBQTEFURk9STV9TREtfVkVSU0lPTi4gIFRoZSBtaW5vciB2ZXJzaW9uIHNob3VsZAotIyBiZSByZXNldCB0byAwIG9uIGV2ZXJ5IGJ1bXAgb2YgdGhlIFBMQVRGT1JNX1NES19WRVJTSU9OLgotc2Vwb2xpY3lfbWFqb3JfdmVycyA6PSAzNAotc2Vwb2xpY3lfbWlub3JfdmVycyA6PSAwCi0KLWlmbmVxICgkKHNlcG9saWN5X21ham9yX3ZlcnMpLCAkKFBMQVRGT1JNX1NES19WRVJTSU9OKSkKLSQoZXJyb3Igc2Vwb2xpY3lfbWFqb3JfdmVyc2lvbiBkb2VzIG5vdCBtYXRjaCBQTEFURk9STV9TREtfVkVSU0lPTiwgcGxlYXNlIHVwZGF0ZS4pCi1lbmRpZgotCi1UT1RfU0VQT0xJQ1lfVkVSU0lPTiA6PSAxMDAwMC4wCi1pZm5lcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCi0gICAgUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTiA6PSAkKFRPVF9TRVBPTElDWV9WRVJTSU9OKQotZWxzZQotICAgIFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04gOj0gJChqb2luICQoYWRkc3VmZml4IC4sJChzZXBvbGljeV9tYWpvcl92ZXJzKSksICQoc2Vwb2xpY3lfbWlub3JfdmVycykpCi1lbmRpZgotc2Vwb2xpY3lfbWFqb3JfdmVycyA6PQotc2Vwb2xpY3lfbWlub3JfdmVycyA6PQotCi0jIEJPQVJEX1NFUE9MSUNZX1ZFUlMgbXVzdCB0YWtlIHRoZSBmb3JtYXQgIk5OLm0iIGFuZCBjb250YWluIHRoZSBzZXBvbGljeQotIyB2ZXJzaW9uIGlkZW50aWZpZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc2Vwb2xpY3kgb24gd2hpY2ggdGhlIG5vbi1wbGF0Zm9ybQotIyBwb2xpY3kgaXMgdG8gYmUgYmFzZWQuIElmIHVuc3BlY2lmaWVkLCB0aGlzIHdpbGwgYnVpbGQgYWdhaW5zdCB0aGUgY3VycmVudAotIyBwdWJsaWMgcGxhdGZvcm0gcG9saWN5IGluIHRyZWUKLWlmbmRlZiBCT0FSRF9TRVBPTElDWV9WRVJTCi0jIFRoZSBkZWZhdWx0IHBsYXRmb3JtIHBvbGljeSB2ZXJzaW9uLgorIyBQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OIGlzIGEgbnVtYmVyIG9mIHRoZSBmb3JtICJZWVlZTU0iIHdpdGggIllZWVlNTSIKKyMgbWFwcGluZyB0byB2RlJDIHZlcnNpb24uCitQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OIDo9ICQoQk9BUkRfQVBJX0xFVkVMKQogQk9BUkRfU0VQT0xJQ1lfVkVSUyA6PSAkKFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04pCi1lbmRpZgotCi1pZmVxICgkKEJPQVJEX1NFUE9MSUNZX1ZFUlMpLCQoUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTikpCi1JU19UQVJHRVRfTUlYRURfU0VQT0xJQ1kgOj0KLWVsc2UKLUlTX1RBUkdFVF9NSVhFRF9TRVBPTElDWSA6PSB0cnVlCi1lbmRpZgotCi0uS0FUSV9SRUFET05MWSA6PSBJU19UQVJHRVRfTUlYRURfU0VQT0xJQ1kKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04gQk9BUkRfU0VQT0xJQ1lfVkVSUwogCiAjIEEgbGlzdCBvZiBTRVBvbGljeSB2ZXJzaW9ucywgYmVzaWRlcyBQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OLCB0aGF0IHRoZSBmcmFtZXdvcmsgc3VwcG9ydHMuCi1QTEFURk9STV9TRVBPTElDWV9DT01QQVRfVkVSU0lPTlMgOj0gXAorUExBVEZPUk1fU0VQT0xJQ1lfQ09NUEFUX1ZFUlNJT05TIDo9ICQoZmlsdGVyLW91dCAkKFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04pLCBcCiAgICAgMjkuMCBcCiAgICAgMzAuMCBcCiAgICAgMzEuMCBcCiAgICAgMzIuMCBcCiAgICAgMzMuMCBcCisgICAgMzQuMCBcCisgICAgMjAyNDA0IFwKKyAgICApCiAKIC5LQVRJX1JFQURPTkxZIDo9IFwKICAgICBQTEFURk9STV9TRVBPTElDWV9DT01QQVRfVkVSU0lPTlMgXAogICAgIFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04gXAotICAgIFRPVF9TRVBPTElDWV9WRVJTSU9OIFwKIAogaWZlcSAoJChQUk9EVUNUX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OUyksdHJ1ZSkKICAgaWZuZXEgKCQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TKSx0cnVlKQpAQCAtMTIxMCwxNSArMTE3NywxMSBAQAogVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMgOj0gJChmaWx0ZXItb3V0ICUvbW9kdWxlLWxpYiAlL3N5c3RlbS1zZXJ2ZXIsJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykpCiBUQVJHRVRfQVZBSUFMQkxFX1NES19WRVJTSU9OUyA6PSAkKGNhbGwgbnVtZXJpY2FsbHlfc29ydCwkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSkKIAotVEFSR0VUX1NES19WRVJTSU9OU19XSVRIT1VUX0pBVkFfMThfU1VQUE9SVCA6PSAkKGNhbGwgbnVtYmVyc19sZXNzX3RoYW4sMjQsJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykpCi1UQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xOV9TVVBQT1JUIDo9ICQoY2FsbCBudW1iZXJzX2xlc3NfdGhhbiwzMCwkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSkKK1RBUkdFVF9TREtfVkVSU0lPTlNfV0lUSE9VVF9KQVZBXzFfOV9TVVBQT1JUIDo9ICQoY2FsbCBudW1iZXJzX2xlc3NfdGhhbiwzMCwkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSkKK1RBUkdFVF9TREtfVkVSU0lPTlNfV0lUSE9VVF9KQVZBXzExX1NVUFBPUlQgOj0gJChjYWxsIG51bWJlcnNfbGVzc190aGFuLDMyLCQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpKQorVEFSR0VUX1NES19WRVJTSU9OU19XSVRIT1VUX0pBVkFfMTdfU1VQUE9SVCA6PSAkKGNhbGwgbnVtYmVyc19sZXNzX3RoYW4sMzQsJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykpCiAKLSMgTWlzc2luZyBvcHRpb25hbCB1c2VzLWxpYnJhcmllcyBzbyB0aGF0IHRoZSBwbGF0Zm9ybSBkb2Vzbid0IGNyZWF0ZSBidWlsZCBydWxlcyB0aGF0IGRlcGVuZCBvbgotIyB0aGVtLgotSU5URVJOQUxfUExBVEZPUk1fTUlTU0lOR19VU0VTX0xJQlJBUklFUyA6PSBcCi0gIGNvbS5nb29nbGUuYW5kcm9pZC5ibGUgXAotICBjb20uZ29vZ2xlLmFuZHJvaWQubWVkaWEuZWZmZWN0cyBcCi0gIGNvbS5nb29nbGUuYW5kcm9pZC53ZWFyYWJsZSBcCitKQVZBX0xBTkdVQUdFX1ZFUlNJT05TX1dJVEhPVVRfU1lTVEVNX01PRFVMRVMgOj0gMS43IDEuOAogCiAjIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHdheSB0byBuYW1lIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcHJlYnVpbHQgdGFyZ2V0CiAjIG9iamVjdHMuIEUuZy4sIHByZWJ1aWx0LyQoVEFSR0VUX1BSRUJVSUxUX1RBRykvbGliYy5zbwpAQCAtMTIzNiwxNSArMTE5OSwxMSBAQAogUlNDT01QQVRfMzJCSVRfT05MWV9BUElfTEVWRUxTIDo9IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMAogUlNDT01QQVRfTk9fVVNBR0VJT19BUElfTEVWRUxTIDo9IDggOSAxMCAxMSAxMiAxMwogCi0jIEFkZCBCVUlMRF9OVU1CRVIgdG8gYXBwcyBkZWZhdWx0IHZlcnNpb24gbmFtZSBpZiBpdCdzIHVuYnVuZGxlZCBidWlsZC4KLWlmZGVmIFRBUkdFVF9CVUlMRF9BUFBTCi1UQVJHRVRfQlVJTERfV0lUSF9BUFBTX1ZFUlNJT05fTkFNRSA6PSB0cnVlCi1lbmRpZgotCi1pZmRlZiBUQVJHRVRfQlVJTERfV0lUSF9BUFBTX1ZFUlNJT05fTkFNRQotQVBQU19ERUZBVUxUX1ZFUlNJT05fTkFNRSA6PSAkKFBMQVRGT1JNX1ZFUlNJT04pLSQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkKLWVsc2UKIEFQUFNfREVGQVVMVF9WRVJTSU9OX05BTUUgOj0gJChQTEFURk9STV9WRVJTSU9OKQorCisjIEFkZCBCVUlMRF9OVU1CRVIgdG8gYXBwcyBpZiBQUk9EVUNUX0JVSUxEX0FQUFNfV0lUSF9CVUlMRF9OVU1CRVIgaXMgZGVmaW5lZC4KK2lmZXEgKCQoUFJPRFVDVF9CVUlMRF9BUFBTX1dJVEhfQlVJTERfTlVNQkVSKSx0cnVlKQorICBBUFBTX0RFRkFVTFRfVkVSU0lPTl9OQU1FIDo9ICQoUExBVEZPUk1fVkVSU0lPTiktJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKQogZW5kaWYKIAogIyBBTkRST0lEX1dBUk5JTkdfQUxMT1dFRF9QUk9KRUNUUyBpcyBnZW5lcmF0ZWQgYnkgYnVpbGQvc29vbmcuCkBAIC0xMjg1LDIyICsxMjQ0LDQ1IEBACiAKIC5LQVRJX1JFQURPTkxZIDo9IEpBVkFDX05JTkpBX1BPT0wgUjhfTklOSkFfUE9PTCBEOF9OSU5KQV9QT09MCiAKKyMgU29vbmcgbW9kdWxlcyB0aGF0IGFyZSBrbm93biB0byBoYXZlIGJyb2tlbiBvcHRpb25hbF91c2VzX2xpYnMgZGVwZW5kZW5jaWVzLgorQlVJTERfV0FSTklOR19CQURfT1BUSU9OQUxfVVNFU19MSUJTX0FMTE9XTElTVCA6PSBMZWdhY3lDYW1lcmEgR2FsbGVyeTIKKwogIyBUaGVzZSBnb2FscyBkb24ndCBuZWVkIHRvIGNvbGxlY3QgYW5kIGluY2x1ZGUgQW5kcm9pZC5ta3MvQ2xlYW5TcGVjLm1rcwogIyBpbiB0aGUgc291cmNlIHRyZWUuCiBkb250X2JvdGhlcl9nb2FscyA6PSBvdXQgcHJvZHVjdC1ncmFwaAogCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zeXNwcm9wX2NvbmZpZy5taworCiAjIE1ha2UgQU5EUk9JRCBTb29uZyBjb25maWcgdmFyaWFibGVzIHZpc2libGUgdG8gQW5kcm9pZC5tayBmaWxlcywgZm9yCiAjIGNvbnNpc3RlbmN5IHdpdGggdGhvc2UgZGVmaW5lZCBpbiBCb2FyZENvbmZpZy5tayBmaWxlcy4KIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FuZHJvaWRfc29vbmdfY29uZmlnX3ZhcnMubWsKIAorU09PTkdfVkFSSUFCTEVTIDo9ICQoU09PTkdfT1VUX0RJUikvc29vbmcuJChUQVJHRVRfUFJPRFVDVCkudmFyaWFibGVzCitTT09OR19FWFRSQV9WQVJJQUJMRVMgOj0gJChTT09OR19PVVRfRElSKS9zb29uZy4kKFRBUkdFVF9QUk9EVUNUKS5leHRyYS52YXJpYWJsZXMKKwogaWZlcSAoJChDQUxMRURfRlJPTV9TRVRVUCksdHJ1ZSkKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL25pbmphX2NvbmZpZy5tawogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvc29vbmdfY29uZmlnLm1rCiBlbmRpZgogCi0taW5jbHVkZSBleHRlcm5hbC9saW51eC1rc2VsZnRlc3QvYW5kcm9pZC9rc2VsZnRlc3RfdGVzdF9saXN0Lm1rCitTT09OR19WQVJJQUJMRVMgOj0KK1NPT05HX0VYVFJBX1ZBUklBQkxFUyA6PQorCiAtaW5jbHVkZSBleHRlcm5hbC9sdHAvYW5kcm9pZC9sdHBfcGFja2FnZV9saXN0Lm1rCi1ERUZBVUxUX0RBVEFfT1VUX01PRFVMRVMgOj0gbHRwICQobHRwX3BhY2thZ2VzKSAkKGtzZWxmdGVzdF9tb2R1bGVzKQorREVGQVVMVF9EQVRBX09VVF9NT0RVTEVTIDo9IGx0cCAkKGx0cF9wYWNrYWdlcykKIC5LQVRJX1JFQURPTkxZIDo9IERFRkFVTFRfREFUQV9PVVRfTU9EVUxFUwogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kdW1wdmFyLm1rCisKK2lmZGVmIEJPQVJEX1ZOREtfVkVSU0lPTgorQk9BUkRfVk5ES19WRVJTSU9OPQorZW5kaWYKK2lmZGVmIFBMQVRGT1JNX1ZOREtfVkVSU0lPTgorUExBVEZPUk1fVk5ES19WRVJTSU9OPQorZW5kaWYKKworaWZlcSAodHJ1ZSwkKEZVTExfU1lTVEVNX09QVElNSVpFX0pBVkEpKQoraWZlcSAoZmFsc2UsJChTWVNURU1fT1BUSU1JWkVfSkFWQSkpCiskKGVycm9yIFNZU1RFTV9PUFRJTUlaRV9KQVZBIG11c3QgYmUgZW5hYmxlZCB3aGVuIEZVTExfU1lTVEVNX09QVElNSVpFX0pBVkEgaXMgZW5hYmxlZCkKK2VuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9jb25maWdfc2FuaXRpemVycy5tayBiL2NvcmUvY29uZmlnX3Nhbml0aXplcnMubWsKaW5kZXggZWJjZTRjMi4uYWIyZDVjMSAxMDA2NDQKLS0tIGEvY29yZS9jb25maWdfc2FuaXRpemVycy5taworKysgYi9jb3JlL2NvbmZpZ19zYW5pdGl6ZXJzLm1rCkBAIC02NSw2ICs2NSwxOCBAQAogICBlbmRpZgogZW5kaWYKIAorIyBEaXNhYmxlIGdsb2JhbCBIV0FTYW4gaW4gZXhjbHVkZWQgcGF0aHMKK2lmbmVxICgkKGZpbHRlciBod2FkZHJlc3MsICQobXlfZ2xvYmFsX3Nhbml0aXplKSksKQorICBjb21iaW5lZF9leGNsdWRlX3BhdGhzIDo9ICQoSFdBU0FOX0VYQ0xVREVfUEFUSFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfSFdBU0FOX0VYQ0xVREVfUEFUSFMpCisKKyAgaWZuZXEgKCQoc3RyaXAgJChmb3JlYWNoIGRpciwkKHN1YnN0ICQoY29tbWEpLCQoc3BhY2UpLCQoY29tYmluZWRfZXhjbHVkZV9wYXRocykpLFwKKyAgICAgICAgICQoZmlsdGVyICQoZGlyKSUsJChMT0NBTF9QQVRIKSkpKSwpCisgICAgbXlfZ2xvYmFsX3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBod2FkZHJlc3MsJChteV9nbG9iYWxfc2FuaXRpemUpKQorICAgIG15X2dsb2JhbF9zYW5pdGl6ZV9kaWFnIDo9ICQoZmlsdGVyLW91dCBod2FkZHJlc3MsJChteV9nbG9iYWxfc2FuaXRpemVfZGlhZykpCisgIGVuZGlmCitlbmRpZgorCiBpZm5lcSAoJChteV9nbG9iYWxfc2FuaXRpemUpLCkKICAgbXlfc2FuaXRpemUgOj0gJChteV9nbG9iYWxfc2FuaXRpemUpICQobXlfc2FuaXRpemUpCiBlbmRpZgpAQCAtMTQwLDYgKzE1MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX01FTVRBR19IRUFQX0FTWU5DX0lOQ0xVREVfUEFUSFMpCiAgICAgY29tYmluZWRfZXhjbHVkZV9wYXRocyA6PSAkKE1FTVRBR19IRUFQX0VYQ0xVREVfUEFUSFMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9NRU1UQUdfSEVBUF9FWENMVURFX1BBVEhTKQorICAgIGlmbmVxICgkKFBST0RVQ1RfTUVNVEFHX0hFQVBfU0tJUF9ERUZBVUxUX1BBVEhTKSx0cnVlKQorICAgICAgY29tYmluZWRfc3luY19pbmNsdWRlX3BhdGhzICs9ICQoUFJPRFVDVF9NRU1UQUdfSEVBUF9TWU5DX0RFRkFVTFRfSU5DTFVERV9QQVRIUykKKyAgICAgIGNvbWJpbmVkX2FzeW5jX2luY2x1ZGVfcGF0aHMgKz0gJChQUk9EVUNUX01FTVRBR19IRUFQX0FTWU5DX0RFRkFVTFRfSU5DTFVERV9QQVRIUykKKyAgICBlbmRpZgogCiAgICAgaWZlcSAoJChzdHJpcCAkKGZvcmVhY2ggZGlyLCQoc3Vic3QgJChjb21tYSksJChzcGFjZSksJChjb21iaW5lZF9leGNsdWRlX3BhdGhzKSksXAogICAgICAgICAgICQoZmlsdGVyICQoZGlyKSUsJChMT0NBTF9QQVRIKSkpKSwpCkBAIC0xNzYsNiArMTkyLDcgQEAKIGlmbmVxICgkKGZpbHRlciBhZGRyZXNzLCQobXlfc2FuaXRpemUpKSwpCiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBjZmksJChteV9zYW5pdGl6ZSkpCiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfc3RhY2ssJChteV9zYW5pdGl6ZSkpCisgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfZ2xvYmFscywkKG15X3Nhbml0aXplKSkKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19oZWFwLCQobXlfc2FuaXRpemUpKQogICBteV9zYW5pdGl6ZV9kaWFnIDo9ICQoZmlsdGVyLW91dCBjZmksJChteV9zYW5pdGl6ZV9kaWFnKSkKIGVuZGlmCkBAIC0xODMsOCArMjAwLDggQEAKICMgRGlzYWJsZSBtZW10YWcgZm9yIGhvc3QgdGFyZ2V0cy4gSG9zdCBleGVjdXRhYmxlcyBpbiBBbmRyb2lkTWsgZmlsZXMgYXJlCiAjIGRlcHJlY2F0ZWQsIGJ1dCBzb21lIHBhcnRuZXJzIHN0aWxsIGhhdmUgdGhlbSBmbG9hdGluZyBhcm91bmQuCiBpZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgbWVtdGFnX2hlYXAgbWVtdGFnX3N0YWNrLCQobXlfc2FuaXRpemUpKQotICBteV9zYW5pdGl6ZV9kaWFnIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfaGVhcCBtZW10YWdfc3RhY2ssJChteV9zYW5pdGl6ZV9kaWFnKSkKKyAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19oZWFwIG1lbXRhZ19zdGFjayBtZW10YWdfZ2xvYmFscywkKG15X3Nhbml0aXplKSkKKyAgbXlfc2FuaXRpemVfZGlhZyA6PSAkKGZpbHRlci1vdXQgbWVtdGFnX2hlYXAgbWVtdGFnX3N0YWNrIG1lbXRhZ19nbG9iYWxzLCQobXlfc2FuaXRpemVfZGlhZykpCiBlbmRpZgogCiAjIERpc2FibGUgc2FuaXRpemVycyB3aGljaCBuZWVkIHRoZSBVQlNhbiBydW50aW1lIGZvciBob3N0IHRhcmdldHMuCkBAIC0yMTksMTEgKzIzNiwxMyBAQAogICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgaHdhZGRyZXNzLCQobXlfc2FuaXRpemUpKQogICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgbWVtdGFnX2hlYXAsJChteV9zYW5pdGl6ZSkpCiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfc3RhY2ssJChteV9zYW5pdGl6ZSkpCisgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfZ2xvYmFscywkKG15X3Nhbml0aXplKSkKIGVuZGlmCiAKIGlmbmVxICgkKGZpbHRlciBod2FkZHJlc3MsJChteV9zYW5pdGl6ZSkpLCkKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IGFkZHJlc3MsJChteV9zYW5pdGl6ZSkpCiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfc3RhY2ssJChteV9zYW5pdGl6ZSkpCisgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfZ2xvYmFscywkKG15X3Nhbml0aXplKSkKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19oZWFwLCQobXlfc2FuaXRpemUpKQogICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgdGhyZWFkLCQobXlfc2FuaXRpemUpKQogICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgY2ZpLCQobXlfc2FuaXRpemUpKQpAQCAtMjQwLDEyICsyNTksMTIgQEAKICAgZW5kaWYKIGVuZGlmCiAKLWlmbmVxICgkKGZpbHRlciBtZW10YWdfaGVhcCBtZW10YWdfc3RhY2ssJChteV9zYW5pdGl6ZSkpLCkKK2lmbmVxICgkKGZpbHRlciBtZW10YWdfaGVhcCBtZW10YWdfc3RhY2sgbWVtdGFnX2dsb2JhbHMsJChteV9zYW5pdGl6ZSkpLCkKICAgaWZuZXEgKCQoZmlsdGVyIG1lbXRhZ19oZWFwLCQobXlfc2FuaXRpemVfZGlhZykpLCkKLSAgICBteV9jZmxhZ3MgKz0gLWZzYW5pdGl6ZS1tZW10YWctbW9kZT1zeW5jCisgICAgbXlfbGRmbGFncyArPSAtZnNhbml0aXplLW1lbXRhZy1tb2RlPXN5bmMKICAgICBteV9zYW5pdGl6ZV9kaWFnIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfaGVhcCwkKG15X3Nhbml0aXplX2RpYWcpKQogICBlbHNlCi0gICAgbXlfY2ZsYWdzICs9IC1mc2FuaXRpemUtbWVtdGFnLW1vZGU9YXN5bmMKKyAgICBteV9sZGZsYWdzICs9IC1mc2FuaXRpemUtbWVtdGFnLW1vZGU9YXN5bmMKICAgZW5kaWYKIGVuZGlmCiAKQEAgLTI1OCwxNyArMjc3LDI4IEBACiAKIGlmbmVxICgkKGZpbHRlciBtZW10YWdfaGVhcCwkKG15X3Nhbml0aXplKSksKQogICBteV9jZmxhZ3MgKz0gLWZzYW5pdGl6ZT1tZW10YWctaGVhcAorICBteV9sZGZsYWdzICs9IC1mc2FuaXRpemU9bWVtdGFnLWhlYXAKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19oZWFwLCQobXlfc2FuaXRpemUpKQogZW5kaWYKIAogaWZuZXEgKCQoZmlsdGVyIG1lbXRhZ19zdGFjaywkKG15X3Nhbml0aXplKSksKQogICBteV9jZmxhZ3MgKz0gLWZzYW5pdGl6ZT1tZW10YWctc3RhY2sKKyAgbXlfbGRmbGFncyArPSAtZnNhbml0aXplPW1lbXRhZy1zdGFjawogICBteV9jZmxhZ3MgKz0gLW1hcmNoPWFybXY4YSttZW10YWcKICAgbXlfbGRmbGFncyArPSAtbWFyY2g9YXJtdjhhK21lbXRhZwogICBteV9hc2ZsYWdzICs9IC1tYXJjaD1hcm12OGErbWVtdGFnCiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfc3RhY2ssJChteV9zYW5pdGl6ZSkpCiBlbmRpZgogCitpZm5lcSAoJChmaWx0ZXIgbWVtdGFnX2dsb2JhbHMsJChteV9zYW5pdGl6ZSkpLCkKKyAgbXlfY2ZsYWdzICs9IC1mc2FuaXRpemU9bWVtdGFnLWdsb2JhbHMKKyAgbXlfbGRmbGFncyArPSAtZnNhbml0aXplPW1lbXRhZy1nbG9iYWxzCisgICMgVE9ETyhtaXRjaHApOiBGb3Igbm93LCBlbmFibGUgbWVtdGFnLWhlYXAgd2l0aCBtZW10YWctZ2xvYmFscyBiZWNhdXNlIHRoZQorICAjIGxpbmtlciBpc24ndCBuZXcgZW5vdWdoCisgICMgKGh0dHBzOi8vcmV2aWV3cy5sbHZtLm9yZy9kaWZmZXJlbnRpYWwvY2hhbmdlc2V0Lz9yZWY9NDI0MzU2NikuCisgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfZ2xvYmFscywkKG15X3Nhbml0aXplKSkKK2VuZGlmCisKICMgVFNBTiBpcyBub3Qgc3VwcG9ydGVkIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLiBGb3Igbm9uLW11bHRpbGliIGNhc2VzLCBtYWtlCiAjIGl0cyB1c2UgYW4gZXJyb3IuIEZvciBtdWx0aWxpYiBjYXNlcywgZG9uJ3QgdXNlIGl0IGZvciB0aGUgMzItYml0IGNhc2UuCiBpZm5lcSAoJChmaWx0ZXIgdGhyZWFkLCQobXlfc2FuaXRpemUpKSwpCkBAIC0zMjgsNiArMzU4LDEyIEBACiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBjZmksJChteV9zYW5pdGl6ZSkpCiAgIG15X2NmbGFncyArPSAtZm5vLWx0bwogICBteV9sZGZsYWdzICs9IC1mbm8tbHRvCisKKyAgIyBUT0RPKGIvMTQyNDMwNTkyKTogVXBzdHJlYW0gbGlua2VyIHNjcmlwdHMgZm9yIHNhbml0aXplciBydW50aW1lIGxpYnJhcmllcworICAjIGRpc2NhcmQgdGhlIHNhbmNvdl9sb3dlc3Rfc3RhY2sgc3ltYm9sLCBiZWNhdXNlIGl0J3MgZW11bGF0ZWQgVExTIChhbmQgdGh1cworICAjIGRvZXNuJ3QgbWF0Y2ggdGhlIGxpbmtlciBzY3JpcHQgZHVlIHRvIHRoZSAiX19lbXV0bHNfdi4iIHByZWZpeCkuCisgIG15X2NmbGFncyArPSAtZm5vLXNhbml0aXplLWNvdmVyYWdlPXN0YWNrLWRlcHRoCisgIG15X2xkZmxhZ3MgKz0gLWZuby1zYW5pdGl6ZS1jb3ZlcmFnZT1zdGFjay1kZXB0aAogZW5kaWYKIAogaWZuZXEgKCQoZmlsdGVyIGludGVnZXJfb3ZlcmZsb3csJChteV9zYW5pdGl6ZSkpLCkKQEAgLTM3Nyw3ICs0MTMsNiBAQAogICAgIG15X2xkZmxhZ3MgKz0gLWZzYW5pdGl6ZT0kKGZzYW5pdGl6ZV9hcmcpCiAgIGVsc2UKICAgICBteV9jZmxhZ3MgKz0gLWZzYW5pdGl6ZS10cmFwPWFsbAotICAgIG15X2NmbGFncyArPSAtZnRyYXAtZnVuY3Rpb249YWJvcnQKICAgICBpZm5lcSAoJChmaWx0ZXIgYWRkcmVzcyB0aHJlYWQsJChteV9zYW5pdGl6ZSkpLCkKICAgICAgIG15X2NmbGFncyArPSAtZm5vLXNhbml0aXplLXRyYXA9YWRkcmVzcyx0aHJlYWQKICAgICAgIG15X3NoYXJlZF9saWJyYXJpZXMgKz0gbGliZGwKQEAgLTM5OCw3ICs0MzMsNiBAQAogICAgIG15X2NmbGFncyArPSAtZnZpc2liaWxpdHk9ZGVmYXVsdAogICBlbmRpZgogICBteV9sZGZsYWdzICs9ICQoQ0ZJX0VYVFJBX0xERkxBR1MpCi0gIG15X2FyZmxhZ3MgKz0gLS1wbHVnaW4gJChMTFZNX1BSRUJVSUxUU19QQVRIKS8uLi9saWI2NC9MTFZNZ29sZC5zbwogCiAgIGlmZXEgKCQoTE9DQUxfRk9SQ0VfU1RBVElDX0VYRUNVVEFCTEUpLHRydWUpCiAgICAgICAgIG15X2xkZmxhZ3MgOj0gJChmaWx0ZXItb3V0IC1mc2FuaXRpemUtY2ZpLWNyb3NzLWRzbywkKG15X2xkZmxhZ3MpKQpAQCAtNDUzLDYgKzQ4NywxMyBAQAogIyBJZiBsb2NhbCBtb2R1bGUgbmVlZHMgSFdBU0FOLCBhZGQgY29tcGlsZXIgZmxhZ3MuCiBpZm5lcSAoJChmaWx0ZXIgaHdhZGRyZXNzLCQobXlfc2FuaXRpemUpKSwpCiAgIG15X2NmbGFncyArPSAkKEhXQUREUkVTU19TQU5JVElaRVJfQ09ORklHX0VYVFJBX0NGTEFHUykKKworICBpZm5lcSAoJChmaWx0ZXIgRVhFQ1VUQUJMRVMgTkFUSVZFX1RFU1RTLCQoTE9DQUxfTU9EVUxFX0NMQVNTKSksKQorICAgIGlmbmVxICgkKExPQ0FMX0ZPUkNFX1NUQVRJQ19FWEVDVVRBQkxFKSx0cnVlKQorICAgICAgbXlfbGlua2VyIDo9IC9zeXN0ZW0vYmluL2xpbmtlcl9od2FzYW42NAorICAgIGVuZGlmCisgIGVuZGlmCisKIGVuZGlmCiAKICMgVXNlIG1pbmltYWwgZGlhZ25vc3RpY3Mgd2hlbiBpbnRlZ2VyIG92ZXJmbG93IGlzIGVuYWJsZWQ7IG5ldmVyIGRvIGl0IGZvciBIT1NUIG1vZHVsZXMKZGlmZiAtLWdpdCBhL2NvcmUvY29weV9oZWFkZXJzLm1rIGIvY29yZS9jb3B5X2hlYWRlcnMubWsKaW5kZXggMDU0ZDI3MS4uMmU4MmRiNyAxMDA2NDQKLS0tIGEvY29yZS9jb3B5X2hlYWRlcnMubWsKKysrIGIvY29yZS9jb3B5X2hlYWRlcnMubWsKQEAgLTEzLDE1ICsxMywxMiBAQAogICAkKGNhbGwgcHJldHR5LWVycm9yLE1vZHVsZXMgdXNpbmcgTE9DQUxfU0RLX1ZFUlNJT04gbWF5IG5vdCB1c2UgTE9DQUxfQ09QWV9IRUFERVJTKQogZW5kaWYKIAotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbG9jYWxfdm5kay5taworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbG9jYWxfdmVuZG9yX3Byb2R1Y3QubWsKIAotIyBJZiB3ZSdyZSB1c2luZyB0aGUgVk5ESywgb25seSB2ZW5kb3IgbW9kdWxlcyB1c2luZyB0aGUgVk5ESyBtYXkgdXNlCi0jIExPQ0FMX0NPUFlfSEVBREVSUy4gUGxhdGZvcm0gbGlicmFyaWVzIHdpbGwgbm90IGhhdmUgdGhlIGluY2x1ZGUgcGF0aAotIyBwcmVzZW50LgotaWZkZWYgQk9BUkRfVk5ES19WRVJTSU9OCi1pZm5kZWYgTE9DQUxfVVNFX1ZOREsKLSAgJChjYWxsIHByZXR0eS1lcnJvcixPbmx5IHZlbmRvciBtb2R1bGVzIHVzaW5nIExPQ0FMX1VTRV9WTkRLIG1heSB1c2UgTE9DQUxfQ09QWV9IRUFERVJTKQotZW5kaWYKKyMgTW9kdWxlcyBpbiB2ZW5kb3Igb3IgcHJvZHVjdCBtYXkgdXNlIExPQ0FMX0NPUFlfSEVBREVSUy4KKyMgUGxhdGZvcm0gbGlicmFyaWVzIHdpbGwgbm90IGhhdmUgdGhlIGluY2x1ZGUgcGF0aCBwcmVzZW50LgoraWZlcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksKQorICAkKGNhbGwgcHJldHR5LWVycm9yLE9ubHkgbW9kdWxlcyBpbiB2ZW5kb3Igb3IgcHJvZHVjdCBtYXkgdXNlIExPQ0FMX0NPUFlfSEVBREVSUykKIGVuZGlmCiAKICMgQ2xlYW4gdXAgTE9DQUxfQ09QWV9IRUFERVJTX1RPLCBzaW5jZSBzb29uZ191aSB3aWxsIGJlIGNvbXBhcmluZyBjbGVhbmVkCkBAIC01Myw0ICs1MCw1IEBACiBfY2hGcm9tIDo9CiBfY2hUbyA6PQogCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9Q09QWV9IRUFERVJTKSkKIGVuZGlmICMgTE9DQUxfQ09QWV9IRUFERVJTCmRpZmYgLS1naXQgYS9jb3JlL2RlZmluaXRpb25zLm1rIGIvY29yZS9kZWZpbml0aW9ucy5tawppbmRleCBlNGNlZTdhLi5iMzBiMTU5IDEwMDY0NAotLS0gYS9jb3JlL2RlZmluaXRpb25zLm1rCisrKyBiL2NvcmUvZGVmaW5pdGlvbnMubWsKQEAgLTM3LDYgKzM3LDggQEAKICMgc3ViLXZhcmlhYmxlcy4KIEFMTF9NT0RVTEVTOj0KIAorQUxMX01BS0VfTU9EVUxFX0lORk9fSlNPTl9NT0RVTEVTOj0KKwogIyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG5vbi1tb2R1bGUgdGFyZ2V0cyBpbiB0aGUgc3lzdGVtLgogQUxMX05PTl9NT0RVTEVTOj0KIE5PTl9NT0RVTEVTX1dJVEhPVVRfTElDRU5TRV9NRVRBREFUQTo9CkBAIC00OCwyMCArNTAsNiBAQAogIyBzZXQgb2YgaW5zdGFsbGVkIHRhcmdldHMuCiBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUzo9CiAKLSMgVGhlIGxpc3Qgb2YgdGFncyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGJ5Ci0jIExPQ0FMX01PRFVMRV9UQUdTLiAgRWFjaCB3b3JkIGluIHRoaXMgdmFyaWFibGUgbWFwcwotIyB0byBhIGNvcnJlc3BvbmRpbmcgQUxMX01PRFVMRV9UQUdTLjx0YWduYW1lPiB2YXJpYWJsZQotIyB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgSU5TVEFMTEVEX01PRFVMRXMgd2l0aCB0aGF0IHRhZy4KLUFMTF9NT0RVTEVfVEFHUzo9Ci0KLSMgU2ltaWxhciB0byBBTExfTU9EVUxFX1RBR1MsIGJ1dCBjb250YWlucyB0aGUgc2hvcnQgbmFtZXMKLSMgb2YgYWxsIHRhcmdldHMgZm9yIGEgcGFydGljdWxhciB0YWcuICBUaGUgdG9wLWxldmVsIHZhcmlhYmxlCi0jIHdvbid0IGhhdmUgdGhlIGxpc3Qgb2YgdGFnczsgIHVzdCBBTExfTU9EVUxFX1RBR1MgdG8gZ2V0Ci0jIHRoZSBsaXN0IG9mIGFsbCBrbm93biB0YWdzLiAgKFRoaXMgbWVhbnMgdGhhdCB0aGlzIHZhcmlhYmxlCi0jIHdpbGwgYWx3YXlzIGJlIGVtcHR5OyBpdCdzIGp1c3QgaGVyZSBhcyBhIHBsYWNlaG9sZGVyIGZvcgotIyBpdHMgc3ViLXZhcmlhYmxlcy4pCi1BTExfTU9EVUxFX05BTUVfVEFHUzo9Ci0KICMgRnVsbCBwYXRoIHRvIGFsbCBhc20sIEMsIEMrKywgbGV4IGFuZCB5YWNjIGdlbmVyYXRlZCBDIGZpbGVzLgogIyBUaGVzZSBhbGwgaGF2ZSBhbiBvcmRlci1vbmx5IGRlcGVuZGVuY3kgb24gdGhlIGNvcGllZCBoZWFkZXJzCiBBTExfQ19DUFBfRVRDX09CSkVDVFM6PQpAQCAtNzUsOSArNjMsNiBAQAogIyBBbGwgZmluZGJ1Z3MgeG1sIGZpbGVzCiBBTExfRklOREJVR1NfRklMRVM6PQogCi0jIEdQTCBtb2R1bGUgbGljZW5zZSBmaWxlcwotQUxMX0dQTF9NT0RVTEVfTElDRU5TRV9GSUxFUzo9Ci0KICMgUGFja2FnZXMgd2l0aCBjZXJ0aWZpY2F0ZSB2aW9sYXRpb24KIENFUlRJRklDQVRFX1ZJT0xBVElPTl9NT0RVTEVTIDo9CiAKQEAgLTEyMyw5ICsxMDgsNiBAQAogIyBBbGwgbW9kdWxlcyBhbHJlYWR5IGNvbnZlcnRlZCB0byBTb29uZwogU09PTkdfQUxSRUFEWV9DT05WIDo9CiAKLSMgQUxMX0RFUFMuKi5BTExfREVQUyBrZXlzCi1BTExfREVQUy5NT0RVTEVTIDo9Ci0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBEZWJ1Z2dpbmc7IHByaW50cyBhIHZhcmlhYmxlIGxpc3QgdG8gc3Rkb3V0CiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTUwLDYgKzEzMiwxMCBAQAogJChmaWx0ZXIgdHJ1ZSwgJCgxKSkKIGVuZGVmCiAKK2RlZmluZSBib29sZWFuLW5vdAorJChpZiAkKGZpbHRlciB0cnVlLCQoMSkpLCx0cnVlKQorZW5kZWYKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFJ1bGUgZm9yIHRvdWNoaW5nIEdDTk8gZmlsZXMuCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtODk3LDcgKzg4Myw4IEBACiBlbmRlZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgRGVjbGFyZSBsaWNlbnNlIGRlcGVuZGVuY2llcyAkKDIpIGZvciBub24tbW9kdWxlIHRhcmdldCAkKDEpCisjIyBEZWNsYXJlIGxpY2Vuc2UgZGVwZW5kZW5jaWVzICQoMikgd2l0aCBvcHRpb25hbCBjb2xvbi1zZXBhcmF0ZWQKKyMjIGFubm90YXRpb25zIGZvciBub24tbW9kdWxlIHRhcmdldCAkKDEpCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogZGVmaW5lIGRlY2xhcmUtbGljZW5zZS1kZXBzCiAkKHN0cmlwIFwKQEAgLTkwOSw3ICs4OTYsOCBAQAogZW5kZWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIERlY2xhcmUgbGljZW5zZSBkZXBlbmRlbmNpZXMgJCgyKSBmb3Igbm9uLW1vZHVsZSBjb250YWluZXItdHlwZSB0YXJnZXQgJCgxKQorIyMgRGVjbGFyZSBsaWNlbnNlIGRlcGVuZGVuY2llcyAkKDIpIHdpdGggb3B0aW9uYWwgY29sb24tc2VwYXJhdGVkCisjIyBhbm5vdGF0aW9ucyBmb3Igbm9uLW1vZHVsZSBjb250YWluZXItdHlwZSB0YXJnZXQgJCgxKQogIyMKICMjIENvbnRhaW5lci10eXBlIHRhcmdldHMgYXJlIHRhcmdldHMgbGlrZSAuemlwIGZpbGVzIHRoYXQKICMjIG1lcmVseSBhZ2dyZWdhdGUgb3RoZXIgZmlsZXMuCkBAIC0xMjkyLDM4ICsxMjgwLDYgQEAKIGVuZGVmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBNT0RVTEVfVEFHIHNldCBvcGVyYXRpb25zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEdpdmVuIGEgbGlzdCBvZiB0YWdzLCByZXR1cm4gdGhlIHRhcmdldHMgdGhhdCBzcGVjaWZ5Ci0jIGFueSBvZiB0aG9zZSB0YWdzLgotIyAkKDEpOiB0YWcgbGlzdAotZGVmaW5lIG1vZHVsZXMtZm9yLXRhZy1saXN0Ci0kKHNvcnQgJChmb3JlYWNoIHRhZywkKDEpLCQoZm9yZWFjaCBtLCQoQUxMX01PRFVMRV9OQU1FX1RBR1MuJCh0YWcpKSwkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSkpKQotZW5kZWYKLQotIyBTYW1lIGFzIG1vZHVsZXMtZm9yLXRhZy1saXN0LCBidXQgb3BlcmF0ZXMgb24KLSMgQUxMX01PRFVMRV9OQU1FX1RBR1MuCi0jICQoMSk6IHRhZyBsaXN0Ci1kZWZpbmUgbW9kdWxlLW5hbWVzLWZvci10YWctbGlzdAotJChzb3J0ICQoZm9yZWFjaCB0YWcsJCgxKSwkKEFMTF9NT0RVTEVfTkFNRV9UQUdTLiQodGFnKSkpKQotZW5kZWYKLQotIyBHaXZlbiBhbiBhY2NlcHQgYW5kIHJlamVjdCBsaXN0LCBmaW5kIHRoZSBtYXRjaGluZwotIyBzZXQgb2YgdGFyZ2V0cy4gIElmIGEgdGFyZ2V0IGhhcyBtdWx0aXBsZSB0YWdzIGFuZAotIyBhbnkgb2YgdGhlbSBhcmUgcmVqZWN0ZWQsIHRoZSB0YXJnZXQgaXMgcmVqZWN0ZWQuCi0jIFJlamVjdCBvdmVycmlkZXMgYWNjZXB0LgotIyAkKDEpOiBsaXN0IG9mIHRhZ3MgdG8gYWNjZXB0Ci0jICQoMik6IGxpc3Qgb2YgdGFncyB0byByZWplY3QKLSNUT0RPKGRib3J0KTogZG8gJChpZiAkKHN0cmlwICQoMSkpLCQoMSksJChBTExfTU9EVUxFX1RBR1MpKQotI1RPRE8oamJxKTogYXMgb2YgMjAxMDAxMDYgbm9ib2R5IHVzZXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIKLWRlZmluZSBnZXQtdGFnZ2VkLW1vZHVsZXMKLSQoZmlsdGVyLW91dCBcCi0gICQoY2FsbCBtb2R1bGVzLWZvci10YWctbGlzdCwkKDIpKSwgXAotICAgICQoY2FsbCBtb2R1bGVzLWZvci10YWctbGlzdCwkKDEpKSkKLWVuZGVmCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBBcHBlbmQgYSBsZWFmIHRvIGEgYmFzZSBwYXRoLiAgUHJvcGVybHkgZGVhbHMgd2l0aAogIyMgYmFzZSBwYXRocyBlbmRpbmcgaW4gLy4KICMjCkBAIC0xNTQ4LDEwICsxNTA0LDEwIEBACiAjCiAjIFlvdSBtdXN0IGNhbGwgdGhpcyB3aXRoICQoZXZhbCkuCiBkZWZpbmUgZGVmaW5lLWFpZGwtamF2YS1ydWxlCi1kZWZpbmUtYWlkbC1qYXZhLXJ1bGUtc3JjIDo9ICQocGF0c3Vic3QgJS5haWRsLCUuamF2YSwkKHN1YnN0IC4uLyxkb3Rkb3QvLCQoYWRkcHJlZml4ICQoMikvLCQoMSkpKSkKLSQkKGRlZmluZS1haWRsLWphdmEtcnVsZS1zcmMpIDogJChjYWxsIGNsZWFuLXBhdGgsJChMT0NBTF9QQVRIKS8kKDEpKSAkKEFJREwpCitkZWZpbmVfYWlkbF9qYXZhX3J1bGVfc3JjIDo9ICQocGF0c3Vic3QgJS5haWRsLCUuamF2YSwkKHN1YnN0IC4uLyxkb3Rkb3QvLCQoYWRkcHJlZml4ICQoMikvLCQoMSkpKSkKKyQkKGRlZmluZV9haWRsX2phdmFfcnVsZV9zcmMpIDogJChjYWxsIGNsZWFuLXBhdGgsJChMT0NBTF9QQVRIKS8kKDEpKSAkKEFJREwpCiAJJCQodHJhbnNmb3JtLWFpZGwtdG8tamF2YSkKLSQoMykgKz0gJCQoZGVmaW5lLWFpZGwtamF2YS1ydWxlLXNyYykKKyQoMykgKz0gJCQoZGVmaW5lX2FpZGxfamF2YV9ydWxlX3NyYykKIGVuZGVmCiAKICMjIEdpdmVuIGEgLmFpZGwgZmlsZSBwYXRoIGdlbmVyYXRlIHRoZSBydWxlIHRvIGNvbXBpbGUgaXQgYSAuY3BwIGZpbGUuCkBAIC0xNTYxLDEwICsxNTE3LDEwIEBACiAjCiAjIFlvdSBtdXN0IGNhbGwgdGhpcyB3aXRoICQoZXZhbCkuCiBkZWZpbmUgZGVmaW5lLWFpZGwtY3BwLXJ1bGUKLWRlZmluZS1haWRsLWNwcC1ydWxlLXNyYyA6PSAkKHBhdHN1YnN0ICUuYWlkbCwlJChMT0NBTF9DUFBfRVhURU5TSU9OKSwkKHN1YnN0IC4uLyxkb3Rkb3QvLCQoYWRkcHJlZml4ICQoMikvLCQoMSkpKSkKLSQkKGRlZmluZS1haWRsLWNwcC1ydWxlLXNyYykgOiAkKGNhbGwgY2xlYW4tcGF0aCwkKExPQ0FMX1BBVEgpLyQoMSkpICQoQUlETF9DUFApCitkZWZpbmVfYWlkbF9jcHBfcnVsZV9zcmMgOj0gJChwYXRzdWJzdCAlLmFpZGwsJSQoTE9DQUxfQ1BQX0VYVEVOU0lPTiksJChzdWJzdCAuLi8sZG90ZG90LywkKGFkZHByZWZpeCAkKDIpLywkKDEpKSkpCiskJChkZWZpbmVfYWlkbF9jcHBfcnVsZV9zcmMpIDogJChjYWxsIGNsZWFuLXBhdGgsJChMT0NBTF9QQVRIKS8kKDEpKSAkKEFJRExfQ1BQKQogCSQkKHRyYW5zZm9ybS1haWRsLXRvLWNwcCkKLSQoMykgKz0gJCQoZGVmaW5lLWFpZGwtY3BwLXJ1bGUtc3JjKQorJCgzKSArPSAkJChkZWZpbmVfYWlkbF9jcHBfcnVsZV9zcmMpCiBlbmRlZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTU4NiwxMCArMTU0MiwxMCBAQAogIwogIyBZb3UgbXVzdCBjYWxsIHRoaXMgd2l0aCAkKGV2YWwpLgogZGVmaW5lIGRlZmluZS12dHMtY3BwLXJ1bGUKLWRlZmluZS12dHMtY3BwLXJ1bGUtc3JjIDo9ICQocGF0c3Vic3QgJS52dHMsJSQoTE9DQUxfQ1BQX0VYVEVOU0lPTiksJChzdWJzdCAuLi8sZG90ZG90LywkKGFkZHByZWZpeCAkKDIpLywkKDEpKSkpCi0kJChkZWZpbmUtdnRzLWNwcC1ydWxlLXNyYykgOiAkKExPQ0FMX1BBVEgpLyQoMSkgJChWVFNDKQorZGVmaW5lX3Z0c19jcHBfcnVsZV9zcmMgOj0gJChwYXRzdWJzdCAlLnZ0cywlJChMT0NBTF9DUFBfRVhURU5TSU9OKSwkKHN1YnN0IC4uLyxkb3Rkb3QvLCQoYWRkcHJlZml4ICQoMikvLCQoMSkpKSkKKyQkKGRlZmluZV92dHNfY3BwX3J1bGVfc3JjKSA6ICQoTE9DQUxfUEFUSCkvJCgxKSAkKFZUU0MpCiAJJCQodHJhbnNmb3JtLXZ0cy10by1jcHApCi0kKDMpICs9ICQkKGRlZmluZS12dHMtY3BwLXJ1bGUtc3JjKQorJCgzKSArPSAkJChkZWZpbmVfdnRzX2NwcF9ydWxlX3NyYykKIGVuZGVmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0yMzc4LDYgKzIzMzQsNyBAQAogbWtkaXIgLXAgJChQUklWQVRFX0pBVkFfR0VOX0RJUikKICQoY2FsbCBkdW1wLXdvcmRzLXRvLWZpbGUsJChQUklWQVRFX1JFU19GTEFUKSwkKGRpciAkQClhYXB0Mi1mbGF0LWxpc3QpCiAkKGNhbGwgZHVtcC13b3Jkcy10by1maWxlLCQoUFJJVkFURV9PVkVSTEFZX0ZMQVQpLCQoZGlyICRAKWFhcHQyLWZsYXQtb3ZlcmxheS1saXN0KQorY2F0ICQoUFJJVkFURV9TVEFUSUNfTElCUkFSWV9UUkFOU0lUSVZFX1JFU19QQUNLQUdFU19MSVNUUykgfCBzb3J0IC11IHwgdHIgJ1xuJyAnICcgPiAkKGRpciAkQClhYXB0Mi10cmFuc2l0aXZlLW92ZXJsYXktbGlzdAogJChoaWRlKSAkKEFBUFQyKSBsaW5rIC1vICRAIFwKICAgJChQUklWQVRFX0FBUFRfRkxBR1MpIFwKICAgJChpZiAkKFBSSVZBVEVfU1RBVElDX0xJQlJBUllfRVhUUkFfUEFDS0FHRVMpLCQkKGNhdCAkKFBSSVZBVEVfU1RBVElDX0xJQlJBUllfRVhUUkFfUEFDS0FHRVMpKSkgXApAQCAtMjM5Nyw2ICsyMzU0LDcgQEAKICAgJChhZGRwcmVmaXggLS1yZW5hbWUtbWFuaWZlc3QtcGFja2FnZSAsJChQUklWQVRFX01BTklGRVNUX1BBQ0tBR0VfTkFNRSkpIFwKICAgJChhZGRwcmVmaXggLS1yZW5hbWUtaW5zdHJ1bWVudGF0aW9uLXRhcmdldC1wYWNrYWdlICwkKFBSSVZBVEVfTUFOSUZFU1RfSU5TVFJVTUVOVEFUSU9OX0ZPUikpIFwKICAgLVIgXEAkKGRpciAkQClhYXB0Mi1mbGF0LW92ZXJsYXktbGlzdCBcCisgIC1SIFxAJChkaXIgJEApYWFwdDItdHJhbnNpdGl2ZS1vdmVybGF5LWxpc3QgXAogICBcQCQoZGlyICRAKWFhcHQyLWZsYXQtbGlzdAogJChTT09OR19aSVApIC1vICQoUFJJVkFURV9TUkNKQVIpIC1DICQoUFJJVkFURV9KQVZBX0dFTl9ESVIpIC1EICQoUFJJVkFURV9KQVZBX0dFTl9ESVIpCiAkKEVYVFJBQ1RfSkFSX1BBQ0tBR0VTKSAtaSAkKFBSSVZBVEVfU1JDSkFSKSAtbyAkKFBSSVZBVEVfQUFQVF9FWFRSQV9QQUNLQUdFUykgLS1wcmVmaXggJy0tZXh0cmEtcGFja2FnZXMgJwpAQCAtMjYyNiw3ICsyNTg0LDI4IEBACiAgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgOTgwMDEsOTg1MDAsJCgxKSksJCgyKSkKICAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCA5ODUwMSw5OTAwMCwkKDEpKSwkKDIpKQogICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDk5MDAxLDk5NTAwLCQoMSkpLCQoMikpCi0gICAgICAgIEAkKGlmICQod29yZGxpc3QgOTk1MDEsOTk1MDIsJCgxKSksJChlcnJvciBkdW1wLXdvcmRzLXRvLWZpbGU6IFRvbyBtYW55IHdvcmRzICgkKHdvcmRzICQoMSkpKSkpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgOTk1MDEsMTAwMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAwMDAxLDEwMDUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwMDUwMSwxMDEwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDEwMDEsMTAxNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAxNTAxLDEwMjAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwMjAwMSwxMDI1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDI1MDEsMTAzMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAzMDAxLDEwMzUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwMzUwMSwxMDQwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDQwMDEsMTA0NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA0NTAxLDEwNTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwNTAwMSwxMDU1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDU1MDEsMTA2MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA2MDAxLDEwNjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwNjUwMSwxMDcwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDcwMDEsMTA3NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA3NTAxLDEwODAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwODAwMSwxMDg1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDg1MDEsMTA5MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA5MDAxLDEwOTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwOTUwMSwxMTAwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoaWYgJCh3b3JkbGlzdCAxMTAwMDEsMTEwMDAyLCQoMSkpLCQoZXJyb3IgZHVtcC13b3Jkcy10by1maWxlOiBUb28gbWFueSB3b3JkcyAoJCh3b3JkcyAkKDEpKSkpKQogZW5kZWYKICMgUmV0dXJuIGphciBhcmd1bWVudHMgdG8gY29tcHJlc3MgZmlsZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnkKICMgJCgxKTogZGlyZWN0b3J5CkBAIC0yODE2LDYgKzI3OTUsMTAgQEAKICQoaWYgJChMT0NBTF9NSU5fU0RLX1ZFUlNJT04pLCQoTE9DQUxfTUlOX1NES19WRVJTSU9OKSwkKGNhbGwgbW9kdWxlLXRhcmdldC1zZGstdmVyc2lvbikpCiBlbmRlZgogCisjIENoZWNrcyBpZiBtb2R1bGUgaXMgaW4gdmVuZG9yIG9yIHByb2R1Y3QKK2RlZmluZSBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QKKyQoaWYgJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX0lOX1ZFTkRPUikgJChMT0NBTF9JTl9QUk9EVUNUKSksdHJ1ZSkKK2VuZGVmCiAKIGRlZmluZSB0cmFuc2Zvcm0tY2xhc3Nlcy5qYXItdG8tZGV4CiBAZWNobyAidGFyZ2V0IERleDogJChQUklWQVRFX01PRFVMRSkiCkBAIC0yOTQyLDcgKzI5MjUsNyBAQAogZGVmaW5lIGNvbXByZXNzLXBhY2thZ2UKICQoaGlkZSkgXAogICBtdiAkQCAkQC51bmNvbXByZXNzZWQ7IFwKLSAgJChNSU5JR1pJUCkgLWMgJEAudW5jb21wcmVzc2VkID4gJEAuY29tcHJlc3NlZDsgXAorICAkKEdaSVApIC05IC1jICRALnVuY29tcHJlc3NlZCA+ICRALmNvbXByZXNzZWQ7IFwKICAgcm0gLWYgJEAudW5jb21wcmVzc2VkOyBcCiAgIG12ICRALmNvbXByZXNzZWQgJEA7CiBlbmRlZgpAQCAtMjk1MCw3ICsyOTMzLDcgQEAKIGlmZXEgKCQoSE9TVF9PUyksbGludXgpCiAjIFJ1bnMgYXBwY29tcGF0IGFuZCBzdG9yZSBsb2dzIGluICQoUFJPRFVDVF9PVVQpL2FwcGNvbXBhdAogZGVmaW5lIGV4dHJhY3QtcGFja2FnZQotJChBQVBUMikgZHVtcCByZXNvdXJjZXMgJEAgfCBhd2sgLUYgJyB8PScgJy9eUGFja2FnZS97cHJpbnQgJCQzfScgPj4gJChQUk9EVUNUX09VVCkvYXBwY29tcGF0LyQoUFJJVkFURV9NT0RVTEUpLmxvZyAmJgorJChBQVBUMikgZHVtcCByZXNvdXJjZXMgJEAgfCBhd2sgLUYgJyB8PScgJy9eUGFja2FnZS97cHJpbnQgJCQzOyBleGl0fScgPj4gJChQUk9EVUNUX09VVCkvYXBwY29tcGF0LyQoUFJJVkFURV9NT0RVTEUpLmxvZyAmJgogZW5kZWYKIGRlZmluZSBhcHBjb21wYXQtaGVhZGVyCiAkKGhpZGUpIFwKQEAgLTI5NjMsMTkgKzI5NDYsMTUgQEAKICAgZWNobyAiSW5zdGFsbCBwYXRoOiAkKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpLyUsJSwkKFBSSVZBVEVfSU5TVEFMTEVEX01PRFVMRSkpIiA+PiAkKFBST0RVQ1RfT1VUKS9hcHBjb21wYXQvJChQUklWQVRFX01PRFVMRSkubG9nICYmIFwKICAgZWNobyA+PiAkKFBST0RVQ1RfT1VUKS9hcHBjb21wYXQvJChQUklWQVRFX01PRFVMRSkubG9nCiBlbmRlZgotQVJUX1ZFUklERVhfQVBQQ09NUEFUX1NDUklQVDo9JChIT1NUX09VVCkvYmluL2FwcGNvbXBhdC5zaAorQVJUX1ZFUklERVhfQVBQQ09NUEFUOj0kKEhPU1RfT1VUKS9iaW4vYXBwY29tcGF0CiBkZWZpbmUgcnVuLWFwcGNvbXBhdAogJChoaWRlKSBcCi0gIGVjaG8gImFwcGNvbXBhdC5zaCBvdXRwdXQ6IiA+PiAkKFBST0RVQ1RfT1VUKS9hcHBjb21wYXQvJChQUklWQVRFX01PRFVMRSkubG9nICYmIFwKLSAgUEFDS0FHSU5HPSQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvUEFDS0FHSU5HIEFORFJPSURfTE9HX1RBR1M9Iio6ZSIgJChBUlRfVkVSSURFWF9BUFBDT01QQVRfU0NSSVBUKSAtLWRleC1maWxlPSRAIC0tYXBpLWZsYWdzPSQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0ZMQUdTKSAyPiYxID4+ICQoUFJPRFVDVF9PVVQpL2FwcGNvbXBhdC8kKFBSSVZBVEVfTU9EVUxFKS5sb2cKKyAgZWNobyAiYXBwY29tcGF0IG91dHB1dDoiID4+ICQoUFJPRFVDVF9PVVQpL2FwcGNvbXBhdC8kKFBSSVZBVEVfTU9EVUxFKS5sb2cgJiYgXAorICBBTkRST0lEX0xPR19UQUdTPSIqOmUiICQoQVJUX1ZFUklERVhfQVBQQ09NUEFUKSAtLWRleC1maWxlPSRAIDI+JjEgPj4gJChQUk9EVUNUX09VVCkvYXBwY29tcGF0LyQoUFJJVkFURV9NT0RVTEUpLmxvZwogZW5kZWYKIGFwcGNvbXBhdC1maWxlcyA9IFwKICAgJChBQVBUMikgXAotICAkKEFSVF9WRVJJREVYX0FQUENPTVBBVF9TQ1JJUFQpIFwKLSAgJChJTlRFUk5BTF9QTEFURk9STV9ISURERU5BUElfRkxBR1MpIFwKLSAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvdmVyaWRleCBcCi0gICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvUEFDS0FHSU5HL2NvcmVfZGV4X2ludGVybWVkaWF0ZXMvY2xhc3Nlcy5kZXggXAotICAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9vYWhsX2RleF9pbnRlcm1lZGlhdGVzL2NsYXNzZXMuZGV4CisgICQoQVJUX1ZFUklERVhfQVBQQ09NUEFUKSBcCiBlbHNlCiBhcHBjb21wYXQtaGVhZGVyID0KIHJ1bi1hcHBjb21wYXQgPQpAQCAtMzE2NCwxNCArMzE0MywxMiBAQAogCiAjIENvcGllcyBtYW55IGluaXQgc2NyaXB0IGZpbGVzIGFuZCBjaGVjayB0aGV5IGFyZSB3ZWxsLWZvcm1lZC4KICMgJCgxKTogVGhlIGluaXQgc2NyaXB0IGZpbGVzIHRvIGNvcHkuICBFYWNoIGVudHJ5IGlzIGEgJzonIHNlcGFyYXRlZCBzcmM6ZHN0IHBhaXIuCi0jIEV2YWx1YXRlcyB0byB0aGUgbGlzdCBvZiB0aGUgZHN0IGZpbGVzLiAoaWUgc3VpdGFibGUgZm9yIGEgZGVwZW5kZW5jeSBsaXN0LikKIGRlZmluZSBjb3B5LW1hbnktaW5pdC1zY3JpcHQtZmlsZXMtY2hlY2tlZAogJChmb3JlYWNoIGYsICQoMSksICQoc3RyaXAgXAogICAgICQoZXZhbCBfY21mX3R1cGxlIDo9ICQoc3Vic3QgOiwgLCQoZikpKSBcCiAgICAgJChldmFsIF9jbWZfc3JjIDo9ICQod29yZCAxLCQoX2NtZl90dXBsZSkpKSBcCiAgICAgJChldmFsIF9jbWZfZGVzdCA6PSAkKHdvcmQgMiwkKF9jbWZfdHVwbGUpKSkgXAotICAgICQoZXZhbCAkKGNhbGwgY29weS1pbml0LXNjcmlwdC1maWxlLWNoZWNrZWQsJChfY21mX3NyYyksJChfY21mX2Rlc3QpKSkgXAotICAgICQoX2NtZl9kZXN0KSkpCisgICAgJChldmFsICQoY2FsbCBjb3B5LWluaXQtc2NyaXB0LWZpbGUtY2hlY2tlZCwkKF9jbWZfc3JjKSwkKF9jbWZfZGVzdCkpKSkpCiBlbmRlZgogCiAjIENvcHkgdGhlIGZpbGUgb25seSBpZiBpdCdzIGEgd2VsbC1mb3JtZWQgeG1sIGZpbGUuIEZvciB1c2UgdmlhICQoZXZhbCkuCkBAIC0zMjAyLDIwICszMTc5LDE5IEBACiBkZWZpbmUgY29weS12aW50Zi1tYW5pZmVzdC1jaGVja2VkCiAkKDIpOiAkKDEpICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmCiAJQGVjaG8gIkNvcHkgeG1sOiAkJEAiCi0JJChoaWRlKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZiAtaSAkJDwgPi9kZXYvbnVsbCAgIyBEb24ndCBwcmludCB0aGUgeG1sIGZpbGUgdG8gc3Rkb3V0LgotCSQkKGNvcHktZmlsZS10by10YXJnZXQpCisJJChoaWRlKSBta2RpciAtcCAiJCQoZGlyICQkQCkiCisJJChoaWRlKSBWSU5URl9JR05PUkVfVEFSR0VUX0ZDTV9WRVJTSU9OPXRydWVcCisJCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmIC1pICQkPCAtbyAkJEAKIGVuZGVmCiAKICMgQ29waWVzIG1hbnkgdmludGYgbWFuaWZlc3QgZmlsZXMgY2hlY2tlZC4KICMgJCgxKTogVGhlIGZpbGVzIHRvIGNvcHkuICBFYWNoIGVudHJ5IGlzIGEgJzonIHNlcGFyYXRlZCBzcmM6ZHN0IHBhaXIKLSMgRXZhbHVhdGVzIHRvIHRoZSBsaXN0IG9mIHRoZSBkc3QgZmlsZXMgKGllIHN1aXRhYmxlIGZvciBhIGRlcGVuZGVuY3kgbGlzdCkKIGRlZmluZSBjb3B5LW1hbnktdmludGYtbWFuaWZlc3QtZmlsZXMtY2hlY2tlZAogJChmb3JlYWNoIGYsICQoMSksICQoc3RyaXAgXAogICAgICQoZXZhbCBfY21mX3R1cGxlIDo9ICQoc3Vic3QgOiwgLCQoZikpKSBcCiAgICAgJChldmFsIF9jbWZfc3JjIDo9ICQod29yZCAxLCQoX2NtZl90dXBsZSkpKSBcCiAgICAgJChldmFsIF9jbWZfZGVzdCA6PSAkKHdvcmQgMiwkKF9jbWZfdHVwbGUpKSkgXAotICAgICQoZXZhbCAkKGNhbGwgY29weS12aW50Zi1tYW5pZmVzdC1jaGVja2VkLCQoX2NtZl9zcmMpLCQoX2NtZl9kZXN0KSkpIFwKLSAgICAkKF9jbWZfZGVzdCkpKQorICAgICQoZXZhbCAkKGNhbGwgY29weS12aW50Zi1tYW5pZmVzdC1jaGVja2VkLCQoX2NtZl9zcmMpLCQoX2NtZl9kZXN0KSkpKSkKIGVuZGVmCiAKICMgQ29weSB0aGUgZmlsZSBvbmx5IGlmIGl0J3Mgbm90IGFuIEVMRiBmaWxlLiBGb3IgdXNlIHZpYSAkKGV2YWwpLgpAQCAtMzI4MywxNCArMzI1OSw2IEBACiAkKGhpZGUpIGNwIC1wICIkPCIgIiRAIgogZW5kZWYKIAotIyBUaGUgc2FtZSBhcyBjb3B5LWZpbGUtdG8tdGFyZ2V0LCBidXQgc3RyaXAgb3V0ICIjIGNvbW1lbnQiLXN0eWxlCi0jIGNvbW1lbnRzIChmb3IgY29uZmlnIGZpbGVzIGFuZCBzdWNoKS4KLWRlZmluZSBjb3B5LWZpbGUtdG8tdGFyZ2V0LXN0cmlwLWNvbW1lbnRzCi1AbWtkaXIgLXAgJChkaXIgJEApCi0kKGhpZGUpIHJtIC1mICRACi0kKGhpZGUpIHNlZCAtZSAncy8jLiokJC8vJyAtZSAncy9bIFx0XSokJC8vJyAtZSAnL14kJC9kJyA8ICQ8ID4gJEAKLWVuZGVmCi0KICMgVGhlIHNhbWUgYXMgY29weS1maWxlLXRvLXRhcmdldCwgYnV0IGRvbid0IHByZXNlcnZlCiAjIHRoZSBvbGQgbW9kaWZpY2F0aW9uIHRpbWUuCiBkZWZpbmUgY29weS1maWxlLXRvLW5ldy10YXJnZXQKQEAgLTMzMjUsMTIgKzMyOTMsNiBAQAogJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQogZW5kZWYKIAotIyBDb3B5IGEgcHJlYnVpbHQgZmlsZSB0byBhIHRhcmdldCBsb2NhdGlvbiwgc3RyaXBwaW5nICIjIGNvbW1lbnQiIGNvbW1lbnRzLgotZGVmaW5lIHRyYW5zZm9ybS1wcmVidWlsdC10by10YXJnZXQtc3RyaXAtY29tbWVudHMKLUBlY2hvICIkKCQoUFJJVkFURV9QUkVGSVgpRElTUExBWSkgUHJlYnVpbHQ6ICQoUFJJVkFURV9NT0RVTEUpICgkQCkiCi0kKGNvcHktZmlsZS10by10YXJnZXQtc3RyaXAtY29tbWVudHMpCi1lbmRlZgotCiAjIENvcHkgYSBwcmVidWlsdCBmaWxlIHRvIGEgdGFyZ2V0IGxvY2F0aW9uLCBidXQgcHJlc2VydmUgc3ltbGlua3MgcmF0aGVyIHRoYW4KICMgZGVyZWZlcmVuY2UgdGhlbS4KIGRlZmluZSBjb3B5LW9yLWxpbmstcHJlYnVpbHQtdG8tdGFyZ2V0CkBAIC0zMzY1LDcgKzMzMjcsNiBAQAogCUBta2RpciAtcCAkJChkaXIgJCRAKQogCUBybSAtcmYgJCRACiAJJChoaWRlKSBsbiAtc2YgJCgyKSAkJEAKLSQoMyk6IC5LQVRJX1NZTUxJTktfT1VUUFVUUyA6PSAkKDMpCiBlbmRlZgogCiAjIENvcHkgYW4gYXBrIHRvIGEgdGFyZ2V0IGxvY2F0aW9uIHdoaWxlIHJlbW92aW5nIGNsYXNzZXMqLmRleApAQCAtMzQxNiw2ICszMzc3LDEwIEBACiAjICQoMik6IHBhdGggaW4gc3ltYm9scyBkaXJlY3RvcnkKICMgJCgzKTogZmlsZSB0eXBlIChlbGYgb3IgcjgpCiAjICQoNCk6IHBhdGggaW4gdGhlIG1hcHBpbmdzIGRpcmVjdG9yeQorIworIyBSZWdhcmRpbmcgdGhlIHJlc3RhdHMgYXQgdGhlIGVuZDogSSB0aGluayB5b3Ugc2hvdWxkIG9ubHkgbmVlZCB0byB1c2UgS0FUSV9SRVNUQVQgb24gJCgyKSwgYnV0CisjIHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBidWcgaW4ga2F0aSB3aGVyZSBpdCB3YXMgbm90IGFkZGluZyByZXN0YXQ9dHJ1ZSBpbiB0aGUgbmluamEgZmlsZSB1bmxlc3Mgd2UKKyMgYWxzbyBhZGRlZCA0IHRvIEtBVElfUkVTVEFULgogZGVmaW5lIF9jb3B5LXN5bWJvbHMtZmlsZS13aXRoLW1hcHBpbmcKICQoMik6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJCg0KQogJCgyKTogJChTWU1CT0xTX01BUCkKQEAgLTM0MjQsMTYgKzMzODksNyBAQAogCSQkKGNvcHktZmlsZS10by10YXJnZXQpCiAJJChTWU1CT0xTX01BUCkgLSQoc3RyaXAgJCgzKSkgJCgyKSAtd3JpdGVfaWZfY2hhbmdlZCAkKDQpCiAuS0FUSV9SRVNUQVQ6ICQoMikKLWVuZGVmCi0KLSMgUmV0dXJucyB0aGUgZGlyZWN0b3J5IHRvIGNvcHkgcHJvZ3VhcmQgZGljdGlvbmFyaWVzIGludG8KLWRlZmluZSBsb2NhbC1wcm9ndWFyZC1kaWN0aW9uYXJ5LWRpcmVjdG9yeQotJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcscHJvZ3VhcmRfZGljdGlvbmFyeSkvb3V0L3RhcmdldC9jb21tb24vb2JqLyQoTE9DQUxfTU9EVUxFX0NMQVNTKS8kKExPQ0FMX01PRFVMRSlfaW50ZXJtZWRpYXRlcwotZW5kZWYKLQotIyBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgdG8gY29weSBwcm9ndWFyZCBkaWN0aW9uYXJ5IG1hcHBpbmdzIGludG8KLWRlZmluZSBsb2NhbC1wcm9ndWFyZC1kaWN0aW9uYXJ5LW1hcHBpbmctZGlyZWN0b3J5Ci0kKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxwcm9ndWFyZF9kaWN0aW9uYXJ5X21hcHBpbmcpL291dC90YXJnZXQvY29tbW9uL29iai8kKExPQ0FMX01PRFVMRV9DTEFTUykvJChMT0NBTF9NT0RVTEUpX2ludGVybWVkaWF0ZXMKKy5LQVRJX1JFU1RBVDogJCg0KQogZW5kZWYKIAogCkBAIC0zNjUwLDExICszNjA2LDE0IEBACiAgICQoaWYgJChmaWx0ZXIgJChzdWl0ZSksJChBTExfQ09NUEFUSUJJTElUWV9TVUlURVMpKSwsXAogICAgICQoZXZhbCBBTExfQ09NUEFUSUJJTElUWV9TVUlURVMgKz0gJChzdWl0ZSkpIFwKICAgICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5GSUxFUyA6PSkgXAotICAgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLk1PRFVMRVMgOj0pKSBcCisgICAgJChldmFsIENPTVBBVElCSUxJVFkuJChzdWl0ZSkuTU9EVUxFUyA6PSkgXAorICAgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLkFQSV9NQVBfRklMRVMgOj0pKSBcCiAgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLkZJTEVTICs9IFwKICAgICAkJChmb3JlYWNoIGYsJCQobXlfY29tcGF0X2Rpc3RfJChzdWl0ZSkpLCQkKGNhbGwgd29yZC1jb2xvbiwyLCQkKGYpKSkgXAogICAgICQkKGZvcmVhY2ggZiwkJChteV9jb21wYXRfZGlzdF9jb25maWdfJChzdWl0ZSkpLCQkKGNhbGwgd29yZC1jb2xvbiwyLCQkKGYpKSkgXAogICAgICQkKG15X2NvbXBhdF9kaXN0X3Rlc3RfZGF0YV8kKHN1aXRlKSkpIFwKKyAgJChldmFsIENPTVBBVElCSUxJVFkuJChzdWl0ZSkuQVBJX01BUF9GSUxFUyArPSAkJChteV9jb21wYXRfYXBpX21hcF8kKHN1aXRlKSkpIFwKKyAgJChldmFsIENPTVBBVElCSUxJVFkuJChzdWl0ZSkuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUyArPSAkKExPQ0FMX1NPT05HX0lOU1RBTExFRF9DT01QQVRJQklMSVRZX1NVUFBPUlRfRklMRVMpKSBcCiAgICQoZXZhbCBBTExfQ09NUEFUSUJJTElUWV9ESVNUX0ZJTEVTICs9ICQkKG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpKSkgXAogICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5NT0RVTEVTICs9ICQkKG15X3JlZ2lzdGVyX25hbWUpKSkgXAogJChldmFsICQobXlfYWxsX3RhcmdldHMpIDogXApkaWZmIC0tZ2l0IGEvY29yZS9kZXhfcHJlb3B0Lm1rIGIvY29yZS9kZXhfcHJlb3B0Lm1rCmluZGV4IDg2Y2E3MjkuLjI2YjhiMTcgMTAwNjQ0Ci0tLSBhL2NvcmUvZGV4X3ByZW9wdC5taworKysgYi9jb3JlL2RleF9wcmVvcHQubWsKQEAgLTU3LDcgKzU3LDkgQEAKICMgQnVpbGQgdGhlIGJvb3QuemlwIHdoaWNoIGNvbnRhaW5zIHRoZSBib290IGphcnMgYW5kIHRoZWlyIGNvbXBpbGF0aW9uIG91dHB1dAogIyBXZSBjYW4gZG8gdGhpcyBvbmx5IGlmIHByZW9wdCBpcyBlbmFibGVkIGFuZCBpZiB0aGUgcHJvZHVjdCB1c2VzIGxpYmFydCBjb25maWcgKHdoaWNoIHNldHMgdGhlCiAjIGRlZmF1bHQgcHJvcGVydGllcyBmb3IgcHJlb3B0aW5nKS4KKyMgQXQgdGhlIHRpbWUgb2Ygd3JpdGluZywgdGhpcyBpcyBvbmx5IGZvciBBUlQgQ2xvdWQuCiBpZmVxICgkKFdJVEhfREVYUFJFT1BUKSwgdHJ1ZSkKK2lmbmVxICgkKFdJVEhfREVYUFJFT1BUX0FSVF9CT09UX0lNR19PTkxZKSwgdHJ1ZSkKIGlmZXEgKCQoUFJPRFVDVF9VU0VTX0RFRkFVTFRfQVJUX0NPTkZJRyksIHRydWUpCiAKIGJvb3RfemlwIDo9ICQoUFJPRFVDVF9PVVQpL2Jvb3QuemlwCkBAIC05MCwxNyArOTIsMjAgQEAKICMgVGhlIGlucHV0IHZhcmlhYmxlcyBhcmUgd3JpdHRlbiBieSBidWlsZC9zb29uZy9qYXZhL2RleHByZW9wdF9ib290amFycy5nby4gRXhhbXBsZXMgY2FuIGJlIGZvdW5kCiAjIGF0IHRoZSBib3R0b20gb2YgYnVpbGQvc29vbmcvamF2YS9kZXhwcmVvcHRfY29uZmlnX3Rlc3RpbmcuZ28uCiBkZXhwcmVvcHRfcm9vdF9kaXIgOj0gJChkaXIgJChwYXRzdWJzdCAlLywlLCQoZGlyICQoZmlyc3R3b3JkICQoYm9vdGNsYXNzcGF0aF9qYXJzKSkpKSkKLWJvb2NsYXNzcGF0aF9hcmcgOj0gJChzdWJzdCAkKHNwYWNlKSw6LCQocGF0c3Vic3QgJChkZXhwcmVvcHRfcm9vdF9kaXIpJSwlLCQoREVYUFJFT1BUX0JPT1RDTEFTU1BBVEhfREVYX0ZJTEVTKSkpCi1ib29jbGFzc3BhdGhfbG9jYXRpb25zX2FyZyA6PSAkKHN1YnN0ICQoc3BhY2UpLDosJChERVhQUkVPUFRfQk9PVENMQVNTUEFUSF9ERVhfTE9DQVRJT05TKSkKK2Jvb3RjbGFzc3BhdGhfYXJnIDo9ICQoc3Vic3QgJChzcGFjZSksOiwkKHBhdHN1YnN0ICQoZGV4cHJlb3B0X3Jvb3RfZGlyKSUsJSwkKERFWFBSRU9QVF9CT09UQ0xBU1NQQVRIX0RFWF9GSUxFUykpKQorYm9vdGNsYXNzcGF0aF9sb2NhdGlvbnNfYXJnIDo9ICQoc3Vic3QgJChzcGFjZSksOiwkKERFWFBSRU9QVF9CT09UQ0xBU1NQQVRIX0RFWF9MT0NBVElPTlMpKQogYm9vdF9pbWFnZXMgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQoREVYUFJFT1BUX0lNQUdFX0xPQ0FUSU9OU19PTl9ERVZJQ0UkKERFWFBSRU9QVF9JTkZJWCkpKQogYm9vdF9pbWFnZV9hcmcgOj0gJChzdWJzdCAkKHNwYWNlKSw6LCQocGF0c3Vic3QgLyUsJSwkKGJvb3RfaW1hZ2VzKSkpCit1ZmZkX2djX2ZsYWdfdHh0IDo9ICQoT1VUX0RJUikvc29vbmcvZGV4cHJlb3B0L3VmZmRfZ2NfZmxhZy50eHQKIAogYm9vdF96aXBfbWV0YWRhdGFfdHh0IDo9ICQoZGlyICQoYm9vdF96aXApKWJvb3RfemlwL01FVEFEQVRBLnR4dAorJChib290X3ppcF9tZXRhZGF0YV90eHQpOiAkKHVmZmRfZ2NfZmxhZ190eHQpCiAkKGJvb3RfemlwX21ldGFkYXRhX3R4dCk6CiAJcm0gLWYgJEAKLQllY2hvICJib29jbGFzc3BhdGggPSAkKGJvb2NsYXNzcGF0aF9hcmcpIiA+PiAkQAotCWVjaG8gImJvb2NsYXNzcGF0aC1sb2NhdGlvbnMgPSAkKGJvb2NsYXNzcGF0aF9sb2NhdGlvbnNfYXJnKSIgPj4gJEAKKwllY2hvICJib290Y2xhc3NwYXRoID0gJChib290Y2xhc3NwYXRoX2FyZykiID4+ICRACisJZWNobyAiYm9vdGNsYXNzcGF0aC1sb2NhdGlvbnMgPSAkKGJvb3RjbGFzc3BhdGhfbG9jYXRpb25zX2FyZykiID4+ICRACiAJZWNobyAiYm9vdC1pbWFnZSA9ICQoYm9vdF9pbWFnZV9hcmcpIiA+PiAkQAorCWVjaG8gImV4dHJhLWFyZ3MgPSBgY2F0ICQodWZmZF9nY19mbGFnX3R4dClgIiA+PiAkQAogCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRyb2lkY29yZSwgJChib290X3ppcF9tZXRhZGF0YV90eHQpKQogCkBAIC0xMTgsMjIgKzEyMywyOCBAQAogCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRyb2lkY29yZSwgJChib290X3ppcCkpCiAKLWlmbmVxICgsJChmaWx0ZXIgdHJ1ZSwkKEFSVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UpICQoTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKSkpCiAjIEJ1aWxkIHRoZSBzeXN0ZW1fc2VydmVyLnppcCB3aGljaCBjb250YWlucyB0aGUgQXBleCBzeXN0ZW0gc2VydmVyIGphcnMgYW5kIHN0YW5kYWxvbmUgc3lzdGVtIHNlcnZlciBqYXJzCitzeXN0ZW1fc2VydmVyX2RleDJvYXRfZGlyIDo9ICQoU09PTkdfT1VUX0RJUikvc3lzdGVtX3NlcnZlcl9kZXhqYXJzCiBzeXN0ZW1fc2VydmVyX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9zeXN0ZW1fc2VydmVyLnppcAorIyBub25fdXBkYXRhYmxlX3N5c3RlbV9zZXJ2ZXJfamFycyBjb250YWlucyBqYXJzIGluIC9zeXN0ZW0gYW5kIC9zeXN0ZW1fZXh0IHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGFuIGFwZXguCitub25fdXBkYXRhYmxlX3N5c3RlbV9zZXJ2ZXJfamFycyA6PSBcCisgICQoZm9yZWFjaCBtLCQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMpLFwKKyAgICAkKHN5c3RlbV9zZXJ2ZXJfZGV4Mm9hdF9kaXIpLyQoY2FsbCB3b3JkLWNvbG9uLDIsJChtKSkuamFyKQorCiBhcGV4X3N5c3RlbV9zZXJ2ZXJfamFycyA6PSBcCiAgICQoZm9yZWFjaCBtLCQoUFJPRFVDVF9BUEVYX1NZU1RFTV9TRVJWRVJfSkFSUyksXAotICAgICQoUFJPRFVDVF9PVVQpL2FwZXgvJChjYWxsIHdvcmQtY29sb24sMSwkKG0pKS9qYXZhbGliLyQoY2FsbCB3b3JkLWNvbG9uLDIsJChtKSkuamFyKQorICAgICQoc3lzdGVtX3NlcnZlcl9kZXgyb2F0X2RpcikvJChjYWxsIHdvcmQtY29sb24sMiwkKG0pKS5qYXIpCiAKIGFwZXhfc3RhbmRhbG9uZV9zeXN0ZW1fc2VydmVyX2phcnMgOj0gXAogICAkKGZvcmVhY2ggbSwkKFBST0RVQ1RfQVBFWF9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUyksXAotICAgICQoUFJPRFVDVF9PVVQpL2FwZXgvJChjYWxsIHdvcmQtY29sb24sMSwkKG0pKS9qYXZhbGliLyQoY2FsbCB3b3JkLWNvbG9uLDIsJChtKSkuamFyKQorICAgICQoc3lzdGVtX3NlcnZlcl9kZXgyb2F0X2RpcikvJChjYWxsIHdvcmQtY29sb24sMiwkKG0pKS5qYXIpCiAKIHN0YW5kYWxvbmVfc3lzdGVtX3NlcnZlcl9qYXJzIDo9IFwKICAgJChmb3JlYWNoIG0sJChQUk9EVUNUX1NUQU5EQUxPTkVfU1lTVEVNX1NFUlZFUl9KQVJTKSxcCi0gICAgJChQUk9EVUNUX09VVCkvYXBleC8kKGNhbGwgd29yZC1jb2xvbiwxLCQobSkpL2phdmFsaWIvJChjYWxsIHdvcmQtY29sb24sMiwkKG0pKS5qYXIpCisgICAgJChzeXN0ZW1fc2VydmVyX2RleDJvYXRfZGlyKS8kKGNhbGwgd29yZC1jb2xvbiwyLCQobSkpLmphcikKIAotJChzeXN0ZW1fc2VydmVyX3ppcCk6IFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9KQVJTIDo9ICQoc3lzdGVtX3NlcnZlcl9qYXJzKQorJChzeXN0ZW1fc2VydmVyX3ppcCk6IFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUiA6PSAkKHN5c3RlbV9zZXJ2ZXJfZGV4Mm9hdF9kaXIpCiskKHN5c3RlbV9zZXJ2ZXJfemlwKTogUFJJVkFURV9TWVNURU1fU0VSVkVSX0pBUlMgOj0gJChub25fdXBkYXRhYmxlX3N5c3RlbV9zZXJ2ZXJfamFycykKICQoc3lzdGVtX3NlcnZlcl96aXApOiBQUklWQVRFX0FQRVhfU1lTVEVNX1NFUlZFUl9KQVJTIDo9ICQoYXBleF9zeXN0ZW1fc2VydmVyX2phcnMpCiAkKHN5c3RlbV9zZXJ2ZXJfemlwKTogUFJJVkFURV9BUEVYX1NUQU5EQUxPTkVfU1lTVEVNX1NFUlZFUl9KQVJTIDo9ICQoYXBleF9zdGFuZGFsb25lX3N5c3RlbV9zZXJ2ZXJfamFycykKICQoc3lzdGVtX3NlcnZlcl96aXApOiBQUklWQVRFX1NUQU5EQUxPTkVfU1lTVEVNX1NFUlZFUl9KQVJTIDo9ICQoc3RhbmRhbG9uZV9zeXN0ZW1fc2VydmVyX2phcnMpCkBAIC0xNDEsMTMgKzE1MiwxMyBAQAogCUBlY2hvICJDcmVhdGUgc3lzdGVtIHNlcnZlciBwYWNrYWdlOiAkQCIKIAlybSAtZiAkQAogCSQoU09PTkdfWklQKSAtbyAkQCBcCi0JICAtQyAkKFBST0RVQ1RfT1VUKSAkKGFkZHByZWZpeCAtZiAsJChQUklWQVRFX1NZU1RFTV9TRVJWRVJfSkFSUykpIFwKLQkgIC1DICQoUFJPRFVDVF9PVVQpICQoYWRkcHJlZml4IC1mICwkKFBSSVZBVEVfQVBFWF9TWVNURU1fU0VSVkVSX0pBUlMpKSBcCi0gICAgICAgICAgLUMgJChQUk9EVUNUX09VVCkgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9BUEVYX1NUQU5EQUxPTkVfU1lTVEVNX1NFUlZFUl9KQVJTKSkgXAotCSAgLUMgJChQUk9EVUNUX09VVCkgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUykpCisJICAtQyAkKFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUikgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9TWVNURU1fU0VSVkVSX0pBUlMpKSBcCisJICAtQyAkKFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUikgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9BUEVYX1NZU1RFTV9TRVJWRVJfSkFSUykpIFwKKwkgIC1DICQoUFJJVkFURV9TWVNURU1fU0VSVkVSX0RFWDJPQVRfRElSKSAkKGFkZHByZWZpeCAtZiAsJChQUklWQVRFX0FQRVhfU1RBTkRBTE9ORV9TWVNURU1fU0VSVkVSX0pBUlMpKSBcCisJICAtQyAkKFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUikgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUykpCiAKICQoY2FsbCBkaXN0LWZvci1nb2FscywgZHJvaWRjb3JlLCAkKHN5c3RlbV9zZXJ2ZXJfemlwKSkKIAotZW5kaWYgICNBUlRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIHx8IE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRQogZW5kaWYgICNQUk9EVUNUX1VTRVNfREVGQVVMVF9BUlRfQ09ORklHCitlbmRpZiAgI1dJVEhfREVYUFJFT1BUX0FSVF9CT09UX0lNR19PTkxZCiBlbmRpZiAgI1dJVEhfREVYUFJFT1BUCmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHRfY29uZmlnLm1rIGIvY29yZS9kZXhfcHJlb3B0X2NvbmZpZy5tawppbmRleCA3YjljNGRiLi5kNTFkZTMzIDEwMDY0NAotLS0gYS9jb3JlL2RleF9wcmVvcHRfY29uZmlnLm1rCisrKyBiL2NvcmUvZGV4X3ByZW9wdF9jb25maWcubWsKQEAgLTU4LDI1ICs1OCwxMCBAQAogCiAjIENvbmRpdGlvbmFsIHRvIGJ1aWxkaW5nIG9uIGxpbnV4LCBhcyBkZXgyb2F0IGN1cnJlbnRseSBkb2VzIG5vdCB3b3JrIG9uIGRhcndpbi4KIGlmZXEgKCQoSE9TVF9PUyksbGludXgpCi0gIGlmZXEgKGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkKLSAgICAjIEZvciBhbiBlbmcgYnVpbGQgb25seSBwcmUtb3B0IHRoZSBib290IGltYWdlIGFuZCBzeXN0ZW0gc2VydmVyLiBUaGlzIGdpdmVzIHJlYXNvbmFibGUgcGVyZm9ybWFuY2UKLSAgICAjIGFuZCBzdGlsbCBhbGxvd3MgYSBzaW1wbGUgd29ya2Zsb3c6IGJ1aWxkaW5nIGluIGZyYW1ld29ya3MvYmFzZSBhbmQgc3luY2luZy4KLSAgICBXSVRIX0RFWFBSRU9QVF9CT09UX0lNR19BTkRfU1lTVEVNX1NFUlZFUl9PTkxZID89IHRydWUKLSAgZW5kaWYKICAgIyBBZGQgbWluaS1kZWJ1Zy1pbmZvIHRvIHRoZSBib290IGNsYXNzcGF0aCB1bmxlc3MgZXhwbGljaXRseSBhc2tlZCBub3QgdG8uCiAgIGlmbmVxIChmYWxzZSwkKFdJVEhfREVYUFJFT1BUX0RFQlVHX0lORk8pKQogICAgIFBST0RVQ1RfREVYX1BSRU9QVF9CT09UX0ZMQUdTICs9IC0tZ2VuZXJhdGUtbWluaS1kZWJ1Zy1pbmZvCiAgIGVuZGlmCi0KLSAgIyBOb24gZW5nIGxpbnV4IGJ1aWxkcyBtdXN0IGhhdmUgcHJlb3B0IGVuYWJsZWQgc28gdGhhdCBzeXN0ZW0gc2VydmVyIGRvZXNuJ3QgcnVuIGFzIGludGVycHJldGVyCi0gICMgb25seS4gYi83NDIwOTMyOQotICBpZmVxICgsJChmaWx0ZXIgZW5nLCAkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCi0gICAgaWZuZXEgKHRydWUsJChXSVRIX0RFWFBSRU9QVCkpCi0gICAgICBpZm5lcSAodHJ1ZSwkKFdJVEhfREVYUFJFT1BUX0JPT1RfSU1HX0FORF9TWVNURU1fU0VSVkVSX09OTFkpKQotICAgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLCBERVhQUkVPUFQgbXVzdCBiZSBlbmFibGVkIGZvciB1c2VyIGFuZCB1c2VyZGVidWcgYnVpbGRzKQotICAgICAgZW5kaWYKLSAgICBlbmRpZgotICBlbmRpZgogZW5kaWYKIAogIyBHZXQgdmFsdWUgb2YgYSBwcm9wZXJ0eS4gSXQgaXMgZmlyc3Qgc2VhcmNoZWQgZnJvbSBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTCkBAIC0xMDAsNyArODUsNyBAQAogICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgRGlzYWJsZVByZW9wdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGNhbGwgaW52ZXJ0X2Jvb2wsJChFTkFCTEVfUFJFT1BUKSkpCiAgICQoY2FsbCBhZGRfanNvbl9ib29sLCBEaXNhYmxlUHJlb3B0Qm9vdEltYWdlcywgICAgICAgICAgICAgICAgICQoY2FsbCBpbnZlcnRfYm9vbCwkKEVOQUJMRV9QUkVPUFRfQk9PVF9JTUFHRVMpKSkKICAgJChjYWxsIGFkZF9qc29uX2xpc3QsIERpc2FibGVQcmVvcHRNb2R1bGVzLCAgICAgICAgICAgICAgICAgICAgJChERVhQUkVPUFRfRElTQUJMRURfTU9EVUxFUykpCi0gICQoY2FsbCBhZGRfanNvbl9ib29sLCBPbmx5UHJlb3B0Qm9vdEltYWdlQW5kU3lzdGVtU2VydmVyLCAgICAgICQoZmlsdGVyIHRydWUsJChXSVRIX0RFWFBSRU9QVF9CT09UX0lNR19BTkRfU1lTVEVNX1NFUlZFUl9PTkxZKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBPbmx5UHJlb3B0QXJ0Qm9vdEltYWdlICAgICAgICAgICAgLCAgICAgICQoZmlsdGVyIHRydWUsJChXSVRIX0RFWFBSRU9QVF9BUlRfQk9PVF9JTUdfT05MWSkpKQogICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJlb3B0V2l0aFVwZGF0YWJsZUJjcCwgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoREVYX1BSRU9QVF9XSVRIX1VQREFUQUJMRV9CQ1ApKSkKICAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIERvbnRVbmNvbXByZXNzUHJpdkFwcHNEZXgsICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKERPTlRfVU5DT01QUkVTU19QUklWX0FQUFNfREVYUykpKQogICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgTW9kdWxlc0xvYWRlZEJ5UHJpdmlsZWdlZE1vZHVsZXMsICAgICAgICAkKFBST0RVQ1RfTE9BREVEX0JZX1BSSVZJTEVHRURfTU9EVUxFUykpCkBAIC0xMDksOCArOTQsOSBAQAogICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgRGlzYWJsZUdlbmVyYXRlUHJvZmlsZSwgICAgICAgICAgICAgICAgICAkKGZpbHRlciBmYWxzZSwkKFdJVEhfREVYX1BSRU9QVF9HRU5FUkFURV9QUk9GSUxFKSkpCiAgICQoY2FsbCBhZGRfanNvbl9zdHIsICBQcm9maWxlRGlyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9ERVhfUFJFT1BUX1BST0ZJTEVfRElSKSkKICAgJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvb3RKYXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0JPT1RfSkFSUykpCi0gICQoY2FsbCBhZGRfanNvbl9saXN0LCBBcGV4Qm9vdEphcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9BUEVYX0JPT1RfSkFSUykpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBBcGV4Qm9vdEphcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyLW91dCAkKEFQRVhfQk9PVF9KQVJTX0VYQ0xVREVEKSwgJChQUk9EVUNUX0FQRVhfQk9PVF9KQVJTKSkpCiAgICQoY2FsbCBhZGRfanNvbl9saXN0LCBBcnRBcGV4SmFycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyICQoUFJPRFVDVF9CT09UX0pBUlMpLCQoQVJUX0FQRVhfSkFSUykpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgVGVzdE9ubHlBcnRCb290SW1hZ2VKYXJzLCAgICAgICAgICAgICAgICAkKFBST0RVQ1RfVEVTVF9PTkxZX0FSVF9CT09UX0lNQUdFX0pBUlMpKQogICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgU3lzdGVtU2VydmVySmFycywgICAgICAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTKSkKICAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbVNlcnZlckFwcHMsICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQVBQUykpCiAgICQoY2FsbCBhZGRfanNvbl9saXN0LCBBcGV4U3lzdGVtU2VydmVySmFycywgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9BUEVYX1NZU1RFTV9TRVJWRVJfSkFSUykpCkBAIC0xMzYsNyArMTIyLDcgQEAKICAgJChjYWxsIGFkZF9qc29uX3N0ciwgIERleDJvYXRYbXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChERVgyT0FUX1hNWCkpCiAgICQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXgyb2F0WG1zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoREVYMk9BVF9YTVMpKQogICAkKGNhbGwgYWRkX2pzb25fc3RyLCAgRW1wdHlEaXJlY3RvcnksICAgICAgICAgICAgICAgICAgICAgICAgICAkKE9VVF9ESVIpL2VtcHR5KQotICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgRW5hYmxlVWZmZEdjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoRU5BQkxFX1VGRkRfR0MpKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgIEVuYWJsZVVmZmRHYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChFTkFCTEVfVUZGRF9HQykpCiAKIGlmZGVmIFRBUkdFVF9BUkNICiAgICQoY2FsbCBhZGRfanNvbl9tYXAsICBDcHVWYXJpYW50KQpkaWZmIC0tZ2l0IGEvY29yZS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5tayBiL2NvcmUvZGV4X3ByZW9wdF9vZGV4X2luc3RhbGwubWsKaW5kZXggOGViZjM0ZS4uZTcwODZiNyAxMDA2NDQKLS0tIGEvY29yZS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5taworKysgYi9jb3JlL2RleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rCkBAIC02MCwxOCArNjAsOCBAQAogICBMT0NBTF9ERVhfUFJFT1BUIDo9CiBlbmRpZgogCi0jIGlmIFdJVEhfREVYUFJFT1BUX0JPT1RfSU1HX0FORF9TWVNURU1fU0VSVkVSX09OTFk9dHJ1ZSBhbmQgbW9kdWxlIGlzIG5vdCBpbiBib290IGNsYXNzIHBhdGggc2tpcAotIyBBbHNvIHByZW9wdCBzeXN0ZW0gc2VydmVyIGphcnMgc2luY2Ugc2VsaW51eCBwcmV2ZW50cyBzeXN0ZW0gc2VydmVyIGZyb20gbG9hZGluZyBhbnl0aGluZyBmcm9tCi0jIC9kYXRhLiBJZiB3ZSBkb24ndCBkbyB0aGlzIHRoZXkgd2lsbCBuZWVkIHRvIGJlIGV4dHJhY3RlZCB3aGljaCBpcyBub3QgZmF2b3JhYmxlIGZvciBSQU0gdXNhZ2UKLSMgb3IgcGVyZm9ybWFuY2UuIElmIG15X3ByZW9wdF9mb3JfZXh0cmFjdGVkX2FwayBpcyB0cnVlLCB3ZSBpZ25vcmUgdGhlIG9ubHkgcHJlb3B0IGJvb3QgaW1hZ2UKLSMgb3B0aW9ucy4KLXN5c3RlbV9zZXJ2ZXJfamFycyA6PSAkKGZvcmVhY2ggbSwkKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQobSkpKQotaWZuZXEgKHRydWUsJChteV9wcmVvcHRfZm9yX2V4dHJhY3RlZF9hcGspKQotICBpZmVxICh0cnVlLCQoV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWSkpCi0gICAgaWZlcSAoJChmaWx0ZXIgJChzeXN0ZW1fc2VydmVyX2phcnMpICQoREVYUFJFT1BUX0JPT1RfSkFSU19NT0RVTEVTKSwkKExPQ0FMX01PRFVMRSkpLCkKLSAgICAgIExPQ0FMX0RFWF9QUkVPUFQgOj0KLSAgICBlbmRpZgotICBlbmRpZgoraWZlcSAodHJ1ZSwkKFdJVEhfREVYUFJFT1BUX0FSVF9CT09UX0lNR19PTkxZKSkKKyAgTE9DQUxfREVYX1BSRU9QVCA6PQogZW5kaWYKIAogbXlfcHJvY2Vzc19wcm9maWxlIDo9CkBAIC04NCwxMiArNzQsMTMgQEAKIGlmbmRlZiBMT0NBTF9ERVhfUFJFT1BUX0dFTkVSQVRFX1BST0ZJTEUKICAgIyBJZiBMT0NBTF9ERVhfUFJFT1BUX0dFTkVSQVRFX1BST0ZJTEUgaXMgbm90IGRlZmluZWQsIGRlZmF1bHQgaXQgYmFzZWQgb24gdGhlIGV4aXN0ZW5jZSBvZiB0aGUKICAgIyBwcm9maWxlIGNsYXNzIGxpc3RpbmcuIFRPRE86IFVzZSBwcm9kdWN0IHNwZWNpZmljIGRpcmVjdG9yeSBoZXJlLgotICBteV9jbGFzc2VzX2RpcmVjdG9yeSA6PSAkKFBST0RVQ1RfREVYX1BSRU9QVF9QUk9GSUxFX0RJUikKLSAgTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFIDo9ICQobXlfY2xhc3Nlc19kaXJlY3RvcnkpLyQoTE9DQUxfTU9EVUxFKS5wcm9mCisgIGlmZGVmIFBST0RVQ1RfREVYX1BSRU9QVF9QUk9GSUxFX0RJUgorICAgIExPQ0FMX0RFWF9QUkVPUFRfUFJPRklMRSA6PSAkKFBST0RVQ1RfREVYX1BSRU9QVF9QUk9GSUxFX0RJUikvJChMT0NBTF9NT0RVTEUpLnByb2YKIAotICBpZm5lcSAoLCQod2lsZGNhcmQgJChMT0NBTF9ERVhfUFJFT1BUX1BST0ZJTEUpKSkKLSAgICBteV9wcm9jZXNzX3Byb2ZpbGUgOj0gdHJ1ZQotICAgIG15X3Byb2ZpbGVfaXNfdGV4dF9saXN0aW5nIDo9CisgICAgaWZuZXEgKCwkKHdpbGRjYXJkICQoTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFKSkpCisgICAgICBteV9wcm9jZXNzX3Byb2ZpbGUgOj0gdHJ1ZQorICAgICAgbXlfcHJvZmlsZV9pc190ZXh0X2xpc3RpbmcgOj0KKyAgICBlbmRpZgogICBlbmRpZgogZWxzZQogICBteV9wcm9jZXNzX3Byb2ZpbGUgOj0gJChMT0NBTF9ERVhfUFJFT1BUX0dFTkVSQVRFX1BST0ZJTEUpCkBAIC0xMTAsMTggKzEwMSwxOSBAQAogIyBMb2NhbCBtb2R1bGUgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbiBkZXhwcmVvcHQgYW5kIG1hbmlmZXN0X2NoZWNrLgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotbXlfZmlsdGVyZWRfb3B0aW9uYWxfdXNlc19saWJyYXJpZXMgOj0gJChmaWx0ZXItb3V0ICQoSU5URVJOQUxfUExBVEZPUk1fTUlTU0lOR19VU0VTX0xJQlJBUklFUyksIFwKLSAgJChMT0NBTF9PUFRJT05BTF9VU0VTX0xJQlJBUklFUykpCi0KICMgVE9ETyhiLzEzMjM1NzMwMCk6IFRoaXMgbWF5IGZpbHRlciBvdXQgdG9vIG11Y2gsIGFzIFBST0RVQ1RfUEFDS0FHRVMgZG9lc24ndAogIyBpbmNsdWRlIGFsbCBwYWNrYWdlcyAodGhlIGZ1bGwgbGlzdCBpcyB1bmtub3duIHVudGlsIHJlYWRpbmcgYWxsIEFuZHJvaWQubWsKICMgbWFrZWZpbGVzKS4gQXMgYSBjb25zZXF1ZW5jZSwgYSBsaWJyYXJ5IG1heSBiZSBwcmVzZW50IGJ1dCBub3QgaW5jbHVkZWQgaW4KICMgZGV4cHJlb3B0LCB3aGljaCB3aWxsIHJlc3VsdCBpbiBjbGFzcyBsb2FkZXIgY29udGV4dCBtaXNtYXRjaCBhbmQgYSBmYWlsdXJlCi0jIHRvIGxvYWQgZGV4cHJlb3B0IGNvZGUgb24gZGV2aWNlLiBXZSBzaG91bGQgZml4IHRoaXMsIGVpdGhlciBieSBkZWZlcnJpbmcKLSMgZGVwZW5kZW5jeSBjb21wdXRhdGlvbiB1bnRpbCB0aGUgZnVsbCBsaXN0IG9mIHByb2R1Y3QgcGFja2FnZXMgaXMga25vd24sIG9yCi0jIGJ5IGFkZGluZyBwcm9kdWN0LXNwZWNpZmljIGxpc3RzIG9mIG1pc3NpbmcgbGlicmFyaWVzLgorIyB0byBsb2FkIGRleHByZW9wdCBjb2RlIG9uIGRldmljZS4KKyMgSG93ZXZlciwgd2UgaGF2ZSB0byBkbyBmaWx0ZXJpbmcgaGVyZS4gT3RoZXJ3aXNlLCB3ZSBtYXkgaW5jbHVkZSBleHRyYQorIyBsaWJyYXJpZXMgdGhhdCBTb29uZyBhbmQgTWFrZSBkb24ndCBnZW5lcmF0ZSBidWlsZCBydWxlcyBmb3IgKGUuZy4sIGEgbGlicmFyeQorIyB0aGF0IGV4aXN0cyBpbiB0aGUgc291cmNlIHRyZWUgYnV0IG5vdCBpbnN0YWxsYWJsZSksIGFuZCB0aGVyZWZvcmUgZ2V0IE5pbmphCisjIGVycm9ycy4KKyMgV2UgaGF2ZSBkZWZlcnJlZCBDTEMgY29tcHV0YXRpb24gdG8gdGhlIE5pbmphIHBoYXNlLCBidXQgdGhlIGRlcGVuZGVuY3kKKyMgY29tcHV0YXRpb24gc3RpbGwgbmVlZHMgdG8gYmUgZG9uZSBlYXJseS4gRm9yIG5vdywgdGhpcyBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8uCiBteV9maWx0ZXJlZF9vcHRpb25hbF91c2VzX2xpYnJhcmllcyA6PSAkKGZpbHRlciAkKFBST0RVQ1RfUEFDS0FHRVMpLCBcCi0gICQobXlfZmlsdGVyZWRfb3B0aW9uYWxfdXNlc19saWJyYXJpZXMpKQorICAkKExPQ0FMX09QVElPTkFMX1VTRVNfTElCUkFSSUVTKSkKIAogaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLEFQUFMpCiAgICMgY29tcGF0aWJpbGl0eSBsaWJyYXJpZXMgYXJlIGFkZGVkIHRvIGNsYXNzIGxvYWRlciBjb250ZXh0IG9mIGFuIGFwcCBvbmx5IGlmCkBAIC0xNTAsNiArMTQyLDkgQEAKICAgJChMT0NBTF9VU0VTX0xJQlJBUklFUykgXAogICAkKG15X2ZpbHRlcmVkX29wdGlvbmFsX3VzZXNfbGlicmFyaWVzKQogCisjIFRoZSBvcmRlciBuZWVkcyB0byBiZSBkZXRlcm1pbmlzdGljLgorbXlfZGV4cHJlb3B0X2xpYnNfYWxsIDo9ICQoc29ydCAkKG15X2RleHByZW9wdF9saWJzKSAkKG15X2RleHByZW9wdF9saWJzX2NvbXBhdCkpCisKICMgTW9kdWxlIGRleHByZW9wdC5jb25maWcgZGVwZW5kcyBvbiBkZXhwcmVvcHQuY29uZmlnIGZpbGVzIG9mIGVhY2gKICMgPHVzZXMtbGlicmFyeT4gZGVwZW5kZW5jeSwgYmVjYXVzZSB0aGVzZSBsaWJyYXJpZXMgbWF5IGJlIHByb2Nlc3NlZCBhZnRlcgogIyB0aGUgY3VycmVudCBtb2R1bGUgYnkgTWFrZSAodGhlcmUncyBubyB0b3BvbG9naWNhbCBvcmRlciksIHNvIHRoZSBkZXBlbmRlbmN5CkBAIC0yMDcsNiArMjAyLDEyIEBACiBlbmRpZgogaWZuZXEgKCwkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpKQogICBMT0NBTF9FTkZPUkNFX1VTRVNfTElCUkFSSUVTIDo9IGZhbHNlCisKKyAgIyBFbmFibGUgdGhlIGNoZWNrIGZvciBXVFMKKyAgaWZuZXEgKCQoZmlsdGVyIHd0cywkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpKSwpCisgICAgTE9DQUxfRU5GT1JDRV9VU0VTX0xJQlJBUklFUyA6PSB0cnVlCisgIGVuZGlmCisKIGVuZGlmCiAKICMgRGlzYWJsZSB0aGUgY2hlY2sgaWYgdGhlIGFwcCBjb250YWlucyBubyBqYXZhIGNvZGUuCkBAIC0yMjEsNyArMjIyLDcgQEAKICMgYXMgYSBmYWlsdXJlIHRvIGdldCBtYW5pZmVzdCBmcm9tIGFuIEFQSykuCiBpZm5lcSAodHJ1ZSwkKFdJVEhfREVYUFJFT1BUKSkKICAgTE9DQUxfRU5GT1JDRV9VU0VTX0xJQlJBUklFUyA6PSBmYWxzZQotZWxzZSBpZmVxICh0cnVlLCQoV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWSkpCitlbHNlIGlmZXEgKHRydWUsJChXSVRIX0RFWFBSRU9QVF9BUlRfQk9PVF9JTUdfT05MWSkpCiAgIExPQ0FMX0VORk9SQ0VfVVNFU19MSUJSQVJJRVMgOj0gZmFsc2UKIGVuZGlmCiAKQEAgLTI0MCw3ICsyNDEsNyBAQAogICAgIC0tZW5mb3JjZS11c2VzLWxpYnJhcmllcy1yZWxheCwpCiAgIG15X2RleHByZW9wdF9jb25maWdfYXJncyA6PSAkKHBhdHN1YnN0ICUsLS1kZXhwcmVvcHQtY29uZmlnICUsJChteV9kZXhwcmVvcHRfZGVwX2NvbmZpZ3MpKQogCi0gIG15X2VuZm9yY2VkX3VzZXNfbGlicmFyaWVzIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2VuZm9yY2VfdXNlc19saWJyYXJpZXMuc3RhdHVzCisgIG15X2VuZm9yY2VkX3VzZXNfbGlicmFyaWVzIDo9ICQoaW50ZXJtZWRpYXRlcykvZW5mb3JjZV91c2VzX2xpYnJhcmllcy5zdGF0dXMKICAgJChteV9lbmZvcmNlZF91c2VzX2xpYnJhcmllcyk6IFBSSVZBVEVfVVNFU19MSUJSQVJJRVMgOj0gJChteV91c2VzX2xpYnNfYXJncykKICAgJChteV9lbmZvcmNlZF91c2VzX2xpYnJhcmllcyk6IFBSSVZBVEVfT1BUSU9OQUxfVVNFU19MSUJSQVJJRVMgOj0gJChteV9vcHRpb25hbF91c2VzX2xpYnNfYXJncykKICAgJChteV9lbmZvcmNlZF91c2VzX2xpYnJhcmllcyk6IFBSSVZBVEVfREVYUFJFT1BUX0NPTkZJR1MgOj0gJChteV9kZXhwcmVvcHRfY29uZmlnX2FyZ3MpCkBAIC0zOTUsNyArMzk2LDYgQEAKICAgJChjYWxsIGFkZF9qc29uX2xpc3QsIERleFByZW9wdEltYWdlTG9jYXRpb25zT25EZXZpY2UsJChteV9kZXhwcmVvcHRfaW1hZ2VfbG9jYXRpb25zX29uX2RldmljZSkpCiAgICQoY2FsbCBhZGRfanNvbl9saXN0LCBQcmVvcHRCb290Q2xhc3NQYXRoRGV4RmlsZXMsICAgICQoREVYUFJFT1BUX0JPT1RDTEFTU1BBVEhfREVYX0ZJTEVTKSkKICAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFByZW9wdEJvb3RDbGFzc1BhdGhEZXhMb2NhdGlvbnMsJChERVhQUkVPUFRfQk9PVENMQVNTUEFUSF9ERVhfTE9DQVRJT05TKSkKLSAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByZW9wdEV4dHJhY3RlZEFwaywgICAgICAgICAgICAgJChteV9wcmVvcHRfZm9yX2V4dHJhY3RlZF9hcGspKQogICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgTm9DcmVhdGVBcHBJbWFnZSwgICAgICAgICAgICAgICAkKGZpbHRlciBmYWxzZSwkKExPQ0FMX0RFWF9QUkVPUFRfQVBQX0lNQUdFKSkpCiAgICQoY2FsbCBhZGRfanNvbl9ib29sLCBGb3JjZUNyZWF0ZUFwcEltYWdlLCAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChMT0NBTF9ERVhfUFJFT1BUX0FQUF9JTUFHRSkpKQogICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJlc2lnbmVkUHJlYnVpbHQsICAgICAgICAgICAgICAkKGZpbHRlciBQUkVTSUdORUQsJChMT0NBTF9DRVJUSUZJQ0FURSkpKQpAQCAtNDQwLDY2ICs0NDAsMTI0IEBACiAJICBAY3AgJChQUklWQVRFX0JVSUxUX01PRFVMRSkgJEAKICAgZW5kaWYKIAorICAjIFRoZSByb290ICJwcm9kdWN0X3BhY2thZ2VzLnR4dCIgaXMgZ2VuZXJhdGVkIGJ5IGBidWlsZC9tYWtlL2NvcmUvTWFrZWZpbGVgLiBJdCBjb250YWlucyBhIGxpc3QKKyAgIyBvZiBhbGwgcGFja2FnZXMgdGhhdCBhcmUgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UuIFdlIHVzZSBgZ3JlcGAgdG8gZmlsdGVyIHRoZSBsaXN0IGJ5IHRoZSBhcHAncworICAjIGRlcGVuZGVuY2llcyB0byBjcmVhdGUgYSBwZXItYXBwIGxpc3QsIGFuZCB1c2UgYHJzeW5jIC0tY2hlY2tzdW1gIHRvIHByZXZlbnQgdGhlIGZpbGUncyBtdGltZQorICAjIGZyb20gYmVpbmcgY2hhbmdlZCBpZiB0aGUgY29udGVudHMgZG9uJ3QgY2hhbmdlLiBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyeSBkZXhwcmVvcHQgcmVydW5zLgorICBteV9kZXhwcmVvcHRfcHJvZHVjdF9wYWNrYWdlcyA6PSAkKGludGVybWVkaWF0ZXMpL3Byb2R1Y3RfcGFja2FnZXMudHh0CisgIC5LQVRJX1JFU1RBVDogJChteV9kZXhwcmVvcHRfcHJvZHVjdF9wYWNrYWdlcykKKyAgJChteV9kZXhwcmVvcHRfcHJvZHVjdF9wYWNrYWdlcyk6IFBSSVZBVEVfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorICAkKG15X2RleHByZW9wdF9wcm9kdWN0X3BhY2thZ2VzKTogUFJJVkFURV9MSUJTIDo9ICQobXlfZGV4cHJlb3B0X2xpYnNfYWxsKQorICAkKG15X2RleHByZW9wdF9wcm9kdWN0X3BhY2thZ2VzKTogUFJJVkFURV9TVEFHSU5HIDo9ICQobXlfZGV4cHJlb3B0X3Byb2R1Y3RfcGFja2FnZXMpLnRtcAorICAkKG15X2RleHByZW9wdF9wcm9kdWN0X3BhY2thZ2VzKTogJChQUk9EVUNUX09VVCkvcHJvZHVjdF9wYWNrYWdlcy50eHQKKwlAZWNobyAiJChQUklWQVRFX01PRFVMRSkgZGV4cHJlb3B0IHByb2R1Y3RfcGFja2FnZXMiCisgIGlmbmVxICgsJChteV9kZXhwcmVvcHRfbGlic19hbGwpKQorCQlncmVwIC1GIC14IFwKKwkJCSQoYWRkcHJlZml4IC1lICwkKFBSSVZBVEVfTElCUykpIFwKKwkJCSQoUFJPRFVDVF9PVVQpL3Byb2R1Y3RfcGFja2FnZXMudHh0IFwKKwkJCT4gJChQUklWQVRFX1NUQUdJTkcpIFwKKwkJCXx8IHRydWUKKyAgZWxzZQorCQlybSAtZiAkKFBSSVZBVEVfU1RBR0lORykgJiYgdG91Y2ggJChQUklWQVRFX1NUQUdJTkcpCisgIGVuZGlmCisJcnN5bmMgLS1jaGVja3N1bSAkKFBSSVZBVEVfU1RBR0lORykgJEAKKwogICBteV9kZXhwcmVvcHRfc2NyaXB0IDo9ICQoaW50ZXJtZWRpYXRlcykvZGV4cHJlb3B0LnNoCi0gIG15X2RleHByZW9wdF96aXAgOj0gJChpbnRlcm1lZGlhdGVzKS9kZXhwcmVvcHQuemlwCi0gIERFWFBSRU9QVC4kKExPQ0FMX01PRFVMRSkuUE9TVF9JTlNUQUxMRURfREVYUFJFT1BUX1pJUCA6PSAkKG15X2RleHByZW9wdF96aXApCiAgIC5LQVRJX1JFU1RBVDogJChteV9kZXhwcmVvcHRfc2NyaXB0KQogICAkKG15X2RleHByZW9wdF9zY3JpcHQpOiBQUklWQVRFX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKICAgJChteV9kZXhwcmVvcHRfc2NyaXB0KTogUFJJVkFURV9HTE9CQUxfU09PTkdfQ09ORklHIDo9ICQoREVYX1BSRU9QVF9TT09OR19DT05GSUdfRk9SX01BS0UpCiAgICQobXlfZGV4cHJlb3B0X3NjcmlwdCk6IFBSSVZBVEVfR0xPQkFMX0NPTkZJRyA6PSAkKERFWF9QUkVPUFRfQ09ORklHX0ZPUl9NQUtFKQogICAkKG15X2RleHByZW9wdF9zY3JpcHQpOiBQUklWQVRFX01PRFVMRV9DT05GSUcgOj0gJChteV9kZXhwcmVvcHRfY29uZmlnKQorICAkKG15X2RleHByZW9wdF9zY3JpcHQpOiBQUklWQVRFX1BST0RVQ1RfUEFDS0FHRVMgOj0gJChteV9kZXhwcmVvcHRfcHJvZHVjdF9wYWNrYWdlcykKICAgJChteV9kZXhwcmVvcHRfc2NyaXB0KTogJChERVhQUkVPUFRfR0VOKQogICAkKG15X2RleHByZW9wdF9zY3JpcHQpOiAkKG15X2RleHByZW9wdF9qYXJfY29weSkKLSAgJChteV9kZXhwcmVvcHRfc2NyaXB0KTogJChteV9kZXhwcmVvcHRfY29uZmlnKSAkKERFWF9QUkVPUFRfU09PTkdfQ09ORklHX0ZPUl9NQUtFKSAkKERFWF9QUkVPUFRfQ09ORklHX0ZPUl9NQUtFKQorICAkKG15X2RleHByZW9wdF9zY3JpcHQpOiAkKG15X2RleHByZW9wdF9jb25maWcpICQoREVYX1BSRU9QVF9TT09OR19DT05GSUdfRk9SX01BS0UpICQoREVYX1BSRU9QVF9DT05GSUdfRk9SX01BS0UpICQobXlfZGV4cHJlb3B0X3Byb2R1Y3RfcGFja2FnZXMpCiAJQGVjaG8gIiQoUFJJVkFURV9NT0RVTEUpIGRleHByZW9wdCBnZW4iCiAJJChERVhQUkVPUFRfR0VOKSBcCiAJLWdsb2JhbF9zb29uZyAkKFBSSVZBVEVfR0xPQkFMX1NPT05HX0NPTkZJRykgXAogCS1nbG9iYWwgJChQUklWQVRFX0dMT0JBTF9DT05GSUcpIFwKIAktbW9kdWxlICQoUFJJVkFURV9NT0RVTEVfQ09ORklHKSBcCiAJLWRleHByZW9wdF9zY3JpcHQgJEAgXAotCS1vdXRfZGlyICQoT1VUX0RJUikKKwktb3V0X2RpciAkKE9VVF9ESVIpIFwKKwktcHJvZHVjdF9wYWNrYWdlcyAkKFBSSVZBVEVfUFJPRFVDVF9QQUNLQUdFUykKIAogICBteV9kZXhwcmVvcHRfZGVwcyA6PSAkKG15X2RleF9qYXIpCiAgIG15X2RleHByZW9wdF9kZXBzICs9ICQoaWYgJChteV9wcm9jZXNzX3Byb2ZpbGUpLCQoTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFKSkKICAgbXlfZGV4cHJlb3B0X2RlcHMgKz0gXAotICAgICQoZm9yZWFjaCBsaWIsICQobXlfZGV4cHJlb3B0X2xpYnMpICQobXlfZGV4cHJlb3B0X2xpYnNfY29tcGF0KSwgXAorICAgICQoZm9yZWFjaCBsaWIsICQobXlfZGV4cHJlb3B0X2xpYnNfYWxsKSwgXAogICAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUywkKGxpYiksLENPTU1PTikvamF2YWxpYi5qYXIpCiAgIG15X2RleHByZW9wdF9kZXBzICs9ICQobXlfZGV4cHJlb3B0X2ltYWdlc19kZXBzKQogICBteV9kZXhwcmVvcHRfZGVwcyArPSAkKERFWFBSRU9QVF9CT09UQ0xBU1NQQVRIX0RFWF9GSUxFUykKICAgaWZlcSAoJChMT0NBTF9FTkZPUkNFX1VTRVNfTElCUkFSSUVTKSx0cnVlKQotICAgIG15X2RleHByZW9wdF9kZXBzICs9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2VuZm9yY2VfdXNlc19saWJyYXJpZXMuc3RhdHVzCisgICAgbXlfZGV4cHJlb3B0X2RlcHMgKz0gJChpbnRlcm1lZGlhdGVzKS9lbmZvcmNlX3VzZXNfbGlicmFyaWVzLnN0YXR1cwogICBlbmRpZgogCisgICMgV2UgbmVlZCB0byBhZGQgYWxsIHRoZSBpbnN0YWxsZWQgZmlsZXMgdG8gQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRUQgaW4gb3JkZXIKKyAgIyBmb3IgdGhlIGJ1aWxkIHN5c3RlbSB0byBwcm9wZXJseSB0cmFjayBpbnN0YWxsZWQgZmlsZXMuIChmb3Igc2JvbSwgaW5zdGFsbGNsZWFuLCBldGMpCisgICMgV2UgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluIGEgemlwIGZpbGUgZ2VuZXJhdGVkIGF0IGV4ZWN1dGlvbiB0aW1lLCB3aGljaCBtZWFucyB3ZSBoYXZlIHRvIGd1ZXNzCisgICMgd2hhdCdzIGdvaW5nIHRvIGJlIGluIHRoYXQgemlwIGZpbGUgYmVmb3JlIGl0J3MgY3JlYXRlZC4gV2UgdGhlbiBjaGVjayBhdCBleGVjdXRhdGlvbiB0aW1lIHRoYXQKKyAgIyBvdXIgZ3Vlc3MgaXMgY29ycmVjdC4KKyAgIyBfc3lzdGVtX290aGVyIGNvcnJlc3BvbmRzIHRvIE9kZXhPblN5c3RlbU90aGVyQnlOYW1lKCkgaW4gc29vbmcuCisgICMgVGhlIG90aGVyIHBhdGhzIGNvcnJlc3BvbmQgdG8gZGV4cHJlb3B0Q29tbWFuZCgpCisgIF9kZXhsb2NhdGlvbiA6PSAkKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpLyUsJSwkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpKQorICBfZGV4bmFtZSA6PSAkKGJhc2VuYW1lICQobm90ZGlyICQoX2RleGxvY2F0aW9uKSkpCisgIF9zeXN0ZW1fb3RoZXIgOj0gJChzdHJpcCAkKGlmICQoc3RyaXAgJChCT0FSRF9VU0VTX1NZU1RFTV9PVEhFUl9PREVYKSksIFwKKyAgICAkKGlmICQoc3RyaXAgJChTQU5JVElaRV9MSVRFKSksLCBcCisgICAgICAkKGlmICQoZmlsdGVyICQoX2RleG5hbWUpLCQoUFJPRFVDVF9ERVhQUkVPUFRfU1BFRURfQVBQUykpJChmaWx0ZXIgJChfZGV4bmFtZSksJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQVBQUykpLCwgXAorICAgICAgICAkKGlmICQoc3RyaXAgJChmb3JlYWNoIG15ZmlsdGVyLCQoU1lTVEVNX09USEVSX09ERVhfRklMVEVSKSwkKGZpbHRlciBzeXN0ZW0vJChteWZpbHRlciksJChfZGV4bG9jYXRpb24pKSQoZmlsdGVyICQobXlmaWx0ZXIpLCQoX2RleGxvY2F0aW9uKSkpKSwgXAorICAgICAgICAgICAgc3lzdGVtX290aGVyLykpKSkpCisgICMgX2RleGRpciBoYXMgYSB0cmFpbGluZyAvCisgIF9kZXhkaXIgOj0gJChfc3lzdGVtX290aGVyKSQoZGlyICQoX2RleGxvY2F0aW9uKSkKKyAgbXlfZGV4cHJlb3B0X3ppcF9jb250ZW50cyA6PSAkKHNvcnQgXAorICAgICQoZm9yZWFjaCBhcmNoLCQobXlfZGV4cHJlb3B0X2FyY2hzKSwgXAorICAgICAgJChfZGV4ZGlyKW9hdC8kKGFyY2gpLyQoX2RleG5hbWUpLm9kZXggXAorICAgICAgJChfZGV4ZGlyKW9hdC8kKGFyY2gpLyQoX2RleG5hbWUpLnZkZXggXAorICAgICAgJChpZiAkKGZpbHRlciBmYWxzZSwkKExPQ0FMX0RFWF9QUkVPUFRfQVBQX0lNQUdFKSksLCBcCisgICAgICAgICQoaWYgJChteV9wcm9jZXNzX3Byb2ZpbGUpJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX0RFWF9QUkVPUFRfQVBQX0lNQUdFKSksIFwKKyAgICAgICAgICAkKF9kZXhkaXIpb2F0LyQoYXJjaCkvJChfZGV4bmFtZSkuYXJ0KSkpIFwKKyAgICAkKGlmICQobXlfcHJvY2Vzc19wcm9maWxlKSwkKF9kZXhsb2NhdGlvbikucHJvZikpCisgIF9kZXhsb2NhdGlvbiA6PQorICBfZGV4ZGlyIDo9CisgIF9kZXhuYW1lIDo9CisgIF9zeXN0ZW1fb3RoZXIgOj0KKworICBteV9kZXhwcmVvcHRfemlwIDo9ICQoaW50ZXJtZWRpYXRlcykvZGV4cHJlb3B0LnppcAogICAkKG15X2RleHByZW9wdF96aXApOiBQUklWQVRFX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKICAgJChteV9kZXhwcmVvcHRfemlwKTogJChteV9kZXhwcmVvcHRfZGVwcykKICAgJChteV9kZXhwcmVvcHRfemlwKTogfCAkKERFWFBSRU9QVF9HRU5fREVQUykKICAgJChteV9kZXhwcmVvcHRfemlwKTogLktBVElfREVQRklMRSA6PSAkKG15X2RleHByZW9wdF96aXApLmQKICAgJChteV9kZXhwcmVvcHRfemlwKTogUFJJVkFURV9ERVggOj0gJChteV9kZXhfamFyKQogICAkKG15X2RleHByZW9wdF96aXApOiBQUklWQVRFX1NDUklQVCA6PSAkKG15X2RleHByZW9wdF9zY3JpcHQpCisgICQobXlfZGV4cHJlb3B0X3ppcCk6IFBSSVZBVEVfWklQX0NPTlRFTlRTIDo9ICQobXlfZGV4cHJlb3B0X3ppcF9jb250ZW50cykKICAgJChteV9kZXhwcmVvcHRfemlwKTogJChteV9kZXhwcmVvcHRfc2NyaXB0KQogCUBlY2hvICIkKFBSSVZBVEVfTU9EVUxFKSBkZXhwcmVvcHQiCisJcm0gLWYgJEAKKwllY2hvIC1uID4gJEAuY29udGVudHMKKwkkKGZvcmVhY2ggZiwkKFBSSVZBVEVfWklQX0NPTlRFTlRTKSxlY2hvICIkKGYpIiA+PiAkQC5jb250ZW50cyQobmV3bGluZSkpCiAJYmFzaCAkKFBSSVZBVEVfU0NSSVBUKSAkKFBSSVZBVEVfREVYKSAkQAorCWlmICEgZGlmZiA8KHppcGluZm8gLTEgJEAgfCBzb3J0KSAkQC5jb250ZW50cyA+JjI7IHRoZW4gXAorCSAgZWNobyAiQ29udGVudHMgb2YgJEAgZGlkIG5vdCBtYXRjaCB3aGF0IG1ha2Ugd2FzIGV4cGVjdGluZy4iID4mMiAmJiBleGl0IDE7IFwKKwlmaQogCi0gIGlmZGVmIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQKLSAgICAjIEFkZCBhIHNoZWxsIGNvbW1hbmQgc2VwYXJhdG9yCi0gICAgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSAmJgotICBlbmRpZgorICAkKGZvcmVhY2ggaW5zdGFsbGVkX2RleF9maWxlLCQobXlfZGV4cHJlb3B0X3ppcF9jb250ZW50cyksXAorICAgICQoZXZhbCAkKFBST0RVQ1RfT1VUKS8kKGluc3RhbGxlZF9kZXhfZmlsZSk6ICQobXlfZGV4cHJlb3B0X3ppcCkgXAorJChuZXdsaW5lKQl1bnppcCAtcW9ERCAtZCAkKFBST0RVQ1RfT1VUKSAkKG15X2RleHByZW9wdF96aXApICQoaW5zdGFsbGVkX2RleF9maWxlKSkpCiAKLSAgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSBcCi0gICAgZm9yIGkgaW4gJCQoemlwaW5mbyAtMSAkKG15X2RleHByZW9wdF96aXApKTsgXAotICAgICAgZG8gbWtkaXIgLXAgJChQUk9EVUNUX09VVCkvJCQoZGlybmFtZSAkJGkpOyBcCi0gICAgZG9uZSAmJiBcCi0gICAgKCB1bnppcCAtcW9ERCAtZCAkKFBST0RVQ1RfT1VUKSAkKG15X2RleHByZW9wdF96aXApIDI+JjEgfCBncmVwIC12ICJ6aXBmaWxlIGlzIGVtcHR5IjsgZXhpdCAkJHtQSVBFU1RBVFVTWzBdfSApIHx8IFwKLSAgICAgICggY29kZT0kJD87IGlmIFsgJCRjb2RlIC1uZSAwIC1hICQkY29kZSAtbmUgMSBdOyB0aGVuIGV4aXQgJCRjb2RlOyBmaSApCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoYWRkcHJlZml4ICQoUFJPRFVDVF9PVVQpLywkKG15X2RleHByZW9wdF96aXBfY29udGVudHMpKQogCi0gICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6IFBSSVZBVEVfUE9TVF9JTlNUQUxMX0NNRCA6PSAkKExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQpCi0gICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6ICQobXlfZGV4cHJlb3B0X3ppcCkKLQotICAkKG15X2FsbF90YXJnZXRzKTogJChteV9kZXhwcmVvcHRfemlwKQorICAjIE5vcm1hbGx5IHRoaXMgaGFwcGVucyBpbiBzYm9tLm1rLCB3aGljaCBpcyBpbmNsdWRlZCBmcm9tIGJhc2VfcnVsZXMubWsuIEJ1dCBzaW5jZQorICAjIGRleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rIGlzIGluY2x1ZGVkIGFmdGVyIGJhc2VfcnVsZXMubWssIGl0IG1pc3NlcyB0aGVzZSBvZGV4IGZpbGVzLgorICAkKGZvcmVhY2ggaW5zdGFsbGVkX2ZpbGUsJChhZGRwcmVmaXggJChQUk9EVUNUX09VVCkvLCQobXlfZGV4cHJlb3B0X3ppcF9jb250ZW50cykpLCBcCisgICAgJChldmFsIEFMTF9JTlNUQUxMRURfRklMRVMuJChpbnN0YWxsZWRfZmlsZSkgOj0gJChteV9yZWdpc3Rlcl9uYW1lKSkpCiAKICAgbXlfZGV4cHJlb3B0X2NvbmZpZyA6PQorICBteV9kZXhwcmVvcHRfY29uZmlnX2Zvcl9wb3N0cHJvY2Vzc2luZyA6PQorICBteV9kZXhwcmVvcHRfamFyX2NvcHkgOj0KKyAgbXlfZGV4cHJlb3B0X3Byb2R1Y3RfcGFja2FnZXMgOj0KICAgbXlfZGV4cHJlb3B0X3NjcmlwdCA6PQogICBteV9kZXhwcmVvcHRfemlwIDo9Ci0gIG15X2RleHByZW9wdF9jb25maWdfZm9yX3Bvc3Rwcm9jZXNzaW5nIDo9CisgIG15X2RleHByZW9wdF96aXBfY29udGVudHMgOj0KIGVuZGlmICMgTE9DQUxfREVYX1BSRU9QVAogZW5kaWYgIyBteV9jcmVhdGVfZGV4cHJlb3B0X2NvbmZpZworCitteV9kZXhwcmVvcHRfbGlic19hbGwgOj0KZGlmZiAtLWdpdCBhL2NvcmUvZGlzdGRpci5tayBiL2NvcmUvZGlzdGRpci5tawppbmRleCBiY2U4ZTdmLi4wMzJkMWI3IDEwMDY0NAotLS0gYS9jb3JlL2Rpc3RkaXIubWsKKysrIGIvY29yZS9kaXN0ZGlyLm1rCkBAIC00NSw2ICs0NSwxOCBAQAogICAgICQoZXZhbCBfYWxsX2Rpc3RfZ29hbF9vdXRwdXRfcGFpcnMgKz0gJCQoZ29hbCk6JCQoZHN0KSkpKQogZW5kZWYKIAorZGVmaW5lIGFkZF9maWxlX25hbWVfdGFnX3N1ZmZpeAorJChiYXNlbmFtZSAkKG5vdGRpciAkMSkpLUZJTEVfTkFNRV9UQUdfUExBQ0VIT0xERVIkKHN1ZmZpeCAkMSkKK2VuZGVmCisKKyMgVGhpcyBmdW5jdGlvbiBhcHBlbmRzIHN1ZmZpeCBGSUxFX05BTUVfVEFHX1BMQUNFSE9MREVSIGZyb20gdGhlIGlucHV0IGZpbGUKKyMgJCgxKTogYSBsaXN0IG9mIGdvYWxzICAoZS5nLiBkcm9pZCwgc2RrLCBuZGspLiBUaGVzZSBtdXN0IGJlIFBIT05ZCisjICQoMik6IHRoZSBkaXN0IGZpbGVzIHRvIGFkZCB0byB0aG9zZSBnb2Fscy4KK2RlZmluZSBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnCiskKGlmICQoc3RyaXAgJCgyKSksIFwKKyAgJChmb3JlYWNoIGZpbGUsJCgyKSwgXAorICAgICQoY2FsbCBkaXN0LWZvci1nb2FscywkKDEpLCQoZmlsZSk6JChjYWxsIGFkZF9maWxlX25hbWVfdGFnX3N1ZmZpeCwkKGZpbGUpKSkpKQorZW5kZWYKIC5QSE9OWTogc2hhcmVwcm9qZWN0cwogCiBkZWZpbmUgX19zaGFyZS1wcm9qZWN0cy1ydWxlCkBAIC0yMDksNCArMjIxLDQgQEAKICAgICAgICAgICBmaSkpCiBlbmRlZgogCi0uS0FUSV9SRUFET05MWSA6PSBkaXN0LWZvci1nb2FscyBkaXN0LXdyaXRlLWZpbGUKKy5LQVRJX1JFQURPTkxZIDo9IGRpc3QtZm9yLWdvYWxzIGRpc3Qtd3JpdGUtZmlsZSBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnCmRpZmYgLS1naXQgYS9jb3JlL2R1cGNoZWNrLnNoIGIvY29yZS9kdXBjaGVjay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xM2FiNzgyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kdXBjaGVjay5zaApAQCAtMCwwICsxLDExOCBAQAorIyEvYmluL2Jhc2gKKworIyBGaW5kIGR1cGxpY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGJ5IG1kNSBjaGVja3N1bSBhbmQgcG9zc2libGUgZHVwbGljYXRlcyBieSBzaXplLgorIyBSZXN1bHRzIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBvdXQgZGlyZWN0b3J5IG9mIHRoZSBidWlsZC4KKyMgVXNhZ2U6CisjIC4vZHVwY2hlY2suc2ggPG91dF9kaXI+IDxpbWFnZT4KKworT1VUX0RJUj0iJDEiCitJTUc9IiQyIgorVE1QX01ENT0iJHtPVVRfRElSfS9fZHVwX21kNSIKK1RNUF9TSVpFPSIke09VVF9ESVJ9L19kdXBfc2l6ZSIKK1RNUF9DSEVDSz0iJHtPVVRfRElSfS9fZHVwX3RtcF9jaGVjayIKK1RNUF9TSVpFX1JFQUw9IiR7T1VUX0RJUn0vX2R1cF9zaXplX3JlYWwiCitUTVBfRklMRTE9IiR7T1VUX0RJUn0vX2R1cF9mMSIKK1RNUF9GSUxFMj0iJHtPVVRfRElSfS9fZHVwX2YyIgorTUQ1X0RVUExJQ0FURVM9IiR7T1VUX0RJUn0vZHVwbGljYXRlLWxpYnMtbWQ1LSR7SU1HfS50eHQiCitTSVpFX0RVUExJQ0FURVM9IiR7T1VUX0RJUn0vZHVwbGljYXRlLWxpYnMtc2l6ZS0ke0lNR30udHh0IgorCisjIENoZWNrIGFyZ3VtZW50cworaWYgWyAiJCMiIC1uZSAyIF07IHRoZW4KKwllY2hvICJVc2FnZTogLi9kdXBjaGVjay5zaCA8b3V0X2Rpcj4gPGltYWdlPiIKKwlleGl0IDEKK2ZpCisKKyMgQ2hlY2sgaG9zdCBhbmQgdG9vbGNoYWluIHZlcnNpb24KK0NIRUNLX0hPU1Q9JCh1bmFtZSkKK2lmIFsgIiR7Q0hFQ0tfSE9TVH0iID09ICJMaW51eCIgXTsgdGhlbgorCUFSQ0g9ImxpbnV4LXg4NiIKK2Vsc2UKKwlBUkNIPSJkYXJ3aW4teDg2IgorZmkKK0JJTlVUSUxTX1BBVEg9Ii4vcHJlYnVpbHRzL2NsYW5nL2hvc3QvJHtBUkNIfS9sbHZtLWJpbnV0aWxzLXN0YWJsZSIKKworIyBSZW1vdmUgYW55IG9sZCBmaWxlcyBpZiB0aGV5IGV4aXN0LgoraWYgWyAtZiAiJHtNRDVfRFVQTElDQVRFU30iIF07IHRoZW4KKwlybSAiJHtNRDVfRFVQTElDQVRFU30iCitmaQorCitpZiBbIC1mICIke1NJWkVfRFVQTElDQVRFU30iIF07IHRoZW4KKwlybSAiJHtTSVpFX0RVUExJQ0FURVN9IgorZmkKKworIyBGaW5kIGFsbCAuc28gZmlsZXMgYW5kIGNhbGN1bGF0ZSB0aGVpciBtZDUuCitmaW5kIC4vIiR7T1VUX0RJUn0iLyR7SU1HfS8gLW5hbWUgImxpYiouc28iIC10eXBlIGYgLXByaW50MCB8IHhhcmdzIC0wIG1kNXN1bSB8IHNlZCAtZSAicyMgLiovIyAjIiB8IHNvcnQgfCB1bmlxIC1jIHwgc29ydCAtZyB8IHNlZCAiL14uKjEgL2QiIHwgc2VkICJzL14uICpbMC05XSAvLyIgPiAiJHtUTVBfTUQ1fSIgMj4mMQorCitpZiBbIC1zICIke1RNUF9NRDV9IiBdOyB0aGVuCisJd2hpbGUgcmVhZCAtciBsaXN0OyBkbworCQljaGVja3N1bT0kKGVjaG8gIiR7bGlzdH0iIHwgY3V0IC1mMSAtZCAnICcpCisJCWZpbGVuYW1lPSQoZWNobyAiJHtsaXN0fSIgfCBjdXQgLWYyIC1kICcgJykKKwkJIyBGb3IgZWFjaCBtZDUsIGxpc3QgdGhlIGZpbGUgcGF0aHMgdGhhdCBtYXRjaC4KKwkJeworCQkJZWNobyAiTUQ1OiAke2NoZWNrc3VtfSI7CQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgXAorCQkJZmluZCAuLyIke09VVF9ESVJ9Ii8ke0lNR30vIC1uYW1lICIke2ZpbGVuYW1lfSIgLXR5cGUgZiAtcHJpbnQwIHwgeGFyZ3MgLTAgbWQ1c3VtIHwgZ3JlcCAiJHtjaGVja3N1bX0iIHwgc2VkICdzL14uKiAvLyc7CVwKKwkJCWVjaG8gIiI7CQkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICBcCisJCX0gPj4gIiR7TUQ1X0RVUExJQ0FURVN9IgorCWRvbmUgPCIke1RNUF9NRDV9IgorZWxzZQorCWVjaG8gIk5vIGR1cGxpY2F0ZSBmaWxlcyBieSBtZDUgZm91bmQuIiA+PiAiJHtNRDVfRFVQTElDQVRFU30iCitmaQorCisjIENsZWFudXAKK3JtICIke1RNUF9NRDV9IgorCisjIEZpbmQgcG9zc2libGUgZHVwbGljYXRlIC5zbyBmaWxlcyBieSBzaXplLgorZmluZCAuLyIke09VVF9ESVJ9Ii8ke0lNR30vIC1uYW1lICIqLnNvIiAtdHlwZSBmIC1wcmludDAgfCB4YXJncyAtMCBzdGF0IC0tZm9ybWF0PSIlcyAlbiIgMj4vZGV2L251bGwgfCBzZWQgLWUgInMjIC4qLyMgIyIgfCBzb3J0IHwgdW5pcSAtYyB8IHNvcnQgLWcgfCBzZWQgIi9eLioxIC9kIiA+ICIke1RNUF9TSVpFfSIgMj4mMQoraWYgWyAtcyAiJHtUTVBfU0laRX0iIF07IHRoZW4KKwl3aGlsZSByZWFkIC1yIGxpc3Q7IGRvCisJCXNpemU9JChlY2hvICIke2xpc3R9IiB8IGN1dCAtZjIgLWQgJyAnKQorCQlmaWxlbmFtZT0kKGVjaG8gIiR7bGlzdH0iIHwgY3V0IC1mMyAtZCAnICcpCisJCSMgQ2hlY2sgaWYgdGhlIGZpbGVzIGFyZSBub3QgaW4gdGhlIG1kNXN1bSBsaXN0IGFuZCBkbyBub3RoaW5nIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisJCWZpbmQgLi8iJHtPVVRfRElSfSIvJHtJTUd9LyAtbmFtZSAiJHtmaWxlbmFtZX0iIC10eXBlIGYgLXByaW50MCB8IHhhcmdzIC0wIHN0YXQgLS1mb3JtYXQ9IiVzICVuIiAyPi9kZXYvbnVsbCB8IGdyZXAgIiR7c2l6ZX0iIHwgc2VkICJzL14uKiAvLyIgfCBzb3J0ID4gIiR7VE1QX0NIRUNLfSIgMj4mMQorCQl3aGlsZSByZWFkIC1yIGZpbGVwYXRoOyBkbworCQkJZm91bmQ9JChncmVwIC1GICIke2ZpbGVwYXRofSIgIiR7TUQ1X0RVUExJQ0FURVN9IikKKwkJCWlmIFsgLXogIiR7Zm91bmR9IiBdOyB0aGVuCisJCQkJZWNobyAiJHtmaWxlcGF0aH0iID4+ICIke1RNUF9TSVpFX1JFQUx9IgorCQkJZmkKKwkJZG9uZTwiJHtUTVBfQ0hFQ0t9IgorCQkjIEZvciBldmVyeSBkdXBsaWNhdGlvbiBmb3VuZCwgZGlmZiB0aGUgLm5vdGUgYW5kIC50ZXh0IHNlY3Rpb25zLgorCQlpZiBbIC1zICIke1RNUF9TSVpFX1JFQUx9IiBdOyB0aGVuCisJCQl7CisJCQkJZWNobyAiRmlsZTogJHtmaWxlbmFtZX0sIFNpemU6ICR7c2l6ZX0iOwlcCisJCQkJY2F0ICIke1RNUF9TSVpFX1JFQUx9IjsJCQkJXAorCQkJCWVjaG8gIiI7CQkJCQlcCisJCQl9ID4+ICIke1NJWkVfRFVQTElDQVRFU30iCisJCQljb3VudD0kKHdjIC1sICIke1RNUF9TSVpFX1JFQUx9IiB8IGN1dCAtZjEgLWQgJyAnKQorCQkJIyBMaW1pdGF0aW9uOiB0aGlzIG9ubHkgd29ya3MgZm9yIGZpbGUgcGFpcnMuIElmIG1vcmUgdGhhbiB0d28gcG9zc2libGUgZHVwbGljYXRpb25zIGFyZSBmb3VuZCwgdGhlIHVzZXIgbmVlZCB0byBjaGVjayBtYW51YWxseQorCQkJIyBhbGwgdGhlIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyB1c2luZyB0aGUgbGx2bS1yZWFkZWxmIGFuZCBsbHZtLW9iamR1bXAgY29tbWFuZHMgYmVsb3cuCisJCQlpZiBbICIke2NvdW50fSIgPSAyIF07IHRoZW4KKwkJCQlmaWxlMT0kKGhlYWQgLW4gMSAiJHtUTVBfU0laRV9SRUFMfSIpCisJCQkJZmlsZTI9JCh0YWlsIC1uIDEgIiR7VE1QX1NJWkVfUkVBTH0iKQorCQkJCSMgQ2hlY2sgLm5vdGUgc2VjdGlvbgorCQkJCSR7QklOVVRJTFNfUEFUSH0vbGx2bS1yZWFkZWxmIC0td2lkZSAtLW5vdGVzICIke2ZpbGUxfSIgPiAiJHtUTVBfRklMRTF9IiAyPiYxCisJCQkJJHtCSU5VVElMU19QQVRIfS9sbHZtLXJlYWRlbGYgLS13aWRlIC0tbm90ZXMgIiR7ZmlsZTJ9IiA+ICIke1RNUF9GSUxFMn0iIDI+JjEKKwkJCQl7CisJCQkJCWRpZmYgLXUgIiR7VE1QX0ZJTEUxfSIgIiR7VE1QX0ZJTEUyfSIgfCBzZWQgIjFkOzJkOzNkIjsJXAorCQkJCQllY2hvICIiOworCQkJCX0gPj4gIiR7U0laRV9EVVBMSUNBVEVTfSIKKwkJCQkjIENoZWNrIC50ZXh0IHNlY3Rpb24KKwkJCQkke0JJTlVUSUxTX1BBVEh9L2xsdm0tb2JqZHVtcCAtLWxpbmUtbnVtYmVycyAtLWRpc2Fzc2VtYmxlIC0tZGVtYW5nbGUgLS1yZWxvYyAtLW5vLXNob3ctcmF3LWluc24gLS1zZWN0aW9uPS50ZXh0ICIke2ZpbGUxfSIgfCBzZWQgIjFkOzJkIj4gIiR7VE1QX0ZJTEUxfSIgMj4mMQorCQkJCSR7QklOVVRJTFNfUEFUSH0vbGx2bS1vYmpkdW1wIC0tbGluZS1udW1iZXJzIC0tZGlzYXNzZW1ibGUgLS1kZW1hbmdsZSAtLXJlbG9jIC0tbm8tc2hvdy1yYXctaW5zbiAtLXNlY3Rpb249LnRleHQgIiR7ZmlsZTJ9IiB8IHNlZCAiMWQ7MmQiPiAiJHtUTVBfRklMRTJ9IiAyPiYxCisJCQkJeworCQkJCQlkaWZmIC11ICIke1RNUF9GSUxFMX0iICIke1RNUF9GSUxFMn0iIHwgc2VkICIxZDsyZDszZCI7CVwKKwkJCQkJZWNobyAiIjsKKwkJCQl9ID4+ICIke1NJWkVfRFVQTElDQVRFU30iCisJCQkJIyBDbGVhbnVwCisJCQkJcm0gIiR7VE1QX0ZJTEUxfSIgIiR7VE1QX0ZJTEUyfSIKKwkJCWVsc2UKKwkJCQllY2hvICIqTm90ZTogbW9yZSB0aGFuIG9uZSBkdXBsaWNhdGUuIE1hbnVhbGx5IHZlcmlmeSBhbGwgcG9zc2libGUgY29tYmluYXRpb25zLiIgPj4gIiR7U0laRV9EVVBMSUNBVEVTfSIKKwkJCWZpCisJCQlybSAiJHtUTVBfU0laRV9SRUFMfSIKKwkJCWVjaG8gIiIgPj4gIiR7U0laRV9EVVBMSUNBVEVTfSIKKwkJZmkKKwlkb25lIDwiJHtUTVBfU0laRX0iCisJIyBDbGVhbnVwCisJcm0gIiR7VE1QX1NJWkV9IiAiJHtUTVBfQ0hFQ0t9IgorZWxzZQorCWVjaG8gIk5vIGR1cGxpY2F0ZSBmaWxlcyBieSBzaXplIGZvdW5kLiIgPj4gIiR7U0laRV9EVVBMSUNBVEVTfSIKK2ZpCmRpZmYgLS1naXQgYS9jb3JlL2VudnNldHVwLm1rIGIvY29yZS9lbnZzZXR1cC5tawppbmRleCA3ZGQ5YjEyLi5jMDYzZjYwIDEwMDY0NAotLS0gYS9jb3JlL2VudnNldHVwLm1rCisrKyBiL2NvcmUvZW52c2V0dXAubWsKQEAgLTI0LDUwICsyNCw0MiBAQAogIyQod2FybmluZyAkKGNhbGwgZmluZF9hbmRfZWFybGllcixBIEIgQyxDKSkKICMkKHdhcm5pbmcgJChjYWxsIGZpbmRfYW5kX2VhcmxpZXIsQSBCIEMsRCkpCiAKLWRlZmluZSB2ZXJzaW9uLWxpc3QKLSQoMSlQMUEgJCgxKVAxQiAkKDEpUDJBICQoMSlQMkIgJCgxKUQxQSAkKDEpRDFCICQoMSlEMkEgJCgxKUQyQiAkKDEpUTFBICQoMSlRMUIgJCgxKVEyQSAkKDEpUTJCICQoMSlRM0EgJCgxKVEzQgorIyBSdW5zIGEgc3RhcmxhcmsgZmlsZSwgYW5kIHNldHMgYWxsIHRoZSB2YXJpYWJsZXMgaW4gaXRzIHRvcC1sZXZlbAorIyB2YXJpYWJsZXNfdG9fZXhwb3J0X3RvX21ha2UgdmFyaWFibGUgYXMgbWFrZSB2YXJpYWJsZXMuCisjCisjIEluIG9yZGVyIHRvIGF2b2lkIHJ1bm5pbmcgc3RhcmxhcmsgZXZlcnkgdGltZSB0aGUgc3RhbXAgZmlsZSBpcyBjaGVja2VkLCB3ZSB1c2UKKyMgJChLQVRJX3NoZWxsX25vX3JlcnVuKS4gVGhlbiwgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYWN0dWFsbHkgZG8gcmVydW4ga2F0aSB3aGVuCisjIG1vZGlmeWluZyB0aGUgc3RhcmxhcmsgZmlsZXMsIHdlIGFkZCB0aGUgc3RhcmxhcmsgZmlsZXMgdG8gdGhlIGthdGkgc3RhbXAgZmlsZSB3aXRoCisjICQoS0FUSV9leHRyYV9maWxlX2RlcHMpLgorIworIyBBcmd1bWVudHM6CisjICAkKDEpOiBBIHNpbmdsZSBzdGFybGFyayBmaWxlIHRvIHVzZSBhcyB0aGUgZW50cnlwb2ludAorIyAgJCgyKTogQW4gb3B0aW9uYWwgbGlzdCBvZiBzdGFybGFyayBmaWxlcyB0byBOT1QgaW5jbHVkZSBhcyBrYXRpIGRlcGVuZGVuY2llcy4KKyMgICQoMyk6IEFuIG9wdGlvbmFsIGxpc3Qgb2YgZXh0cmEgZmxhZ3MgdG8gcGFzcyB0byByYmNydW4KK2RlZmluZSBydW4tc3RhcmxhcmsKKyQoZXZhbCBfc3RhcmxhcmtfcmVzdWx0cyA6PSAkKE9VVF9ESVIpL3N0YXJsYXJrX3Jlc3VsdHMvJChzdWJzdCAvLF8sJCgxKSkubWspCiskKEtBVElfc2hlbGxfbm9fcmVydW4gbWtkaXIgLXAgJChPVVRfRElSKS9zdGFybGFya19yZXN1bHRzICYmICQoT1VUX0RJUikvcmJjcnVuIC0tbW9kZT1tYWtlICQoMykgJCgxKSA+JChfc3RhcmxhcmtfcmVzdWx0cykgJiYgdG91Y2ggLXQgMjAwMDAxMDEwMDAwICQoX3N0YXJsYXJrX3Jlc3VsdHMpKQorJChpZiAkKGZpbHRlci1vdXQgMCwkKC5TSEVMTFNUQVRVUykpLCQoZXJyb3IgU3RhcmxhcmsgZmFpbGVkIHRvIHJ1bikpCiskKGV2YWwgaW5jbHVkZSAkKF9zdGFybGFya19yZXN1bHRzKSkKKyQoS0FUSV9leHRyYV9maWxlX2RlcHMgJChmaWx0ZXItb3V0ICQoMiksJChMT0FERURfU1RBUkxBUktfRklMRVMpKSkKKyQoZXZhbCBMT0FERURfU1RBUkxBUktfRklMRVMgOj0pCiskKGV2YWwgX3N0YXJsYXJrX3Jlc3VsdHMgOj0pCiBlbmRlZgogCi1QUkVWX1ZFUlNJT05TIDo9IE9QUjEgT1BEMSBPUEQyIE9QTTEgT1BNMiBQUFIxIFBQRDEgUFBEMiBQUE0xIFBQTTIgUVBSMQotQUxMX1ZFUlNJT05TIDo9IFEgUiBTIFQgVSBWIFcgWCBZIFoKLUFMTF9WRVJTSU9OUyA6PSAkKFBSRVZfVkVSU0lPTlMpICQoZm9yZWFjaCB2LCQoQUxMX1ZFUlNJT05TKSwkKGNhbGwgdmVyc2lvbi1saXN0LCQodikpKQotUFJFVl9WRVJTSU9OUyA6PQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVsZWFzZSBjb25maWcKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3JlbGVhc2VfY29uZmlnLm1rCiAKLSMgRmlsdGVycyBBTExfVkVSU0lPTlMgZG93biB0byB0aGUgcmFuZ2UgWyQxLCAkMl0sIGFuZCBlcnJvcnMgaWYgJDEgPiAkMiBvciAkMyBpcwotIyBub3QgaW4gWyQxLCAkMl0KLSMgJCgxKTogbWluIHBsYXRmb3JtIHZlcnNpb24KLSMgJCgyKTogbWF4IHBsYXRmb3JtIHZlcnNpb24KLSMgJCgzKTogZGVmYXVsdCBwbGF0Zm9ybSB2ZXJzaW9uCi1kZWZpbmUgYWxsb3dlZC1wbGF0Zm9ybS12ZXJzaW9ucwotJChzdHJpcCBcCi0gICQoaWYgJChmaWx0ZXIgJChBTExfVkVSU0lPTlMpLCQoMSkpLCwKLSAgICAkKGVycm9yIEludmFsaWQgTUlOX1BMQVRGT1JNX1ZFUlNJT04gJyQoMSknKSkKLSAgJChpZiAkKGZpbHRlciAkKEFMTF9WRVJTSU9OUyksJCgyKSksLAotICAgICQoZXJyb3IgSW52YWxpZCBNQVhfUExBVEZPUk1fVkVSU0lPTiAnJCgyKScpKQotICAkKGlmICQoZmlsdGVyICQoQUxMX1ZFUlNJT05TKSwkKDMpKSwsCi0gICAgJChlcnJvciBJbnZhbGlkIERFRkFVTFRfUExBVEZPUk1fVkVSU0lPTiAnJCgzKScpKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0IHVwIHZlcnNpb24gaW5mb3JtYXRpb24KK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3ZlcnNpb25fdXRpbC5tawogCi0gICQoZXZhbCBhbGxvd2VkX3ZlcnNpb25zXyA6PSAkKGNhbGwgZmluZF9hbmRfZWFybGllciwkKEFMTF9WRVJTSU9OUyksJCgyKSkpCisjIFRoaXMgdXNlZCB0byBiZSBjYWxjdWxhdGVkLCBidXQgaXMgbm93IGZpeGVkIGFuZCBub3QgZXhwZWN0ZWQKKyMgdG8gY2hhbmdlIG92ZXIgdGltZSBhbnltb3JlLiBOZXcgY29kZSBhdHRlbXB0aW5nIHRvIHVzZSBhCisjIHZhcmlhYmxlIGxpa2UgSVNfQVRfTEFTVF8qIHNob3VsZCBpbnN0ZWFkIHVzZSBhCisjIGJ1aWxkIHN5c3RlbSBmbGFnLgogCi0gICQoaWYgJChmaWx0ZXIgJChhbGxvd2VkX3ZlcnNpb25zXyksJCgxKSksLAotICAgICQoZXJyb3IgTUlOX1BMQVRGT1JNX1ZFUlNJT04gJyQoMSknIG11c3QgYmUgYmVmb3JlIE1BWF9QTEFURk9STV9WRVJTSU9OICckKDIpJykpCi0KLSAgJChldmFsIGFsbG93ZWRfdmVyc2lvbnNfIDo9ICQoMSkgXAotICAgICQoZmlsdGVyLW91dCAkKGNhbGwgZmluZF9hbmRfZWFybGllciwkKGFsbG93ZWRfdmVyc2lvbnNfKSwkKDEpKSwkKGFsbG93ZWRfdmVyc2lvbnNfKSkpCi0KLSAgJChpZiAkKGZpbHRlciAkKGFsbG93ZWRfdmVyc2lvbnNfKSwkKDMpKSwsCi0gICAgJChlcnJvciBERUZBVUxUX1BMQVRGT1JNX1ZFUlNJT04gJyQoMyknIG11c3QgYmUgYmV0d2VlbiBNSU5fUExBVEZPUk1fVkVSU0lPTiAnJCgxKScgYW5kIE1BWF9QTEFURk9STV9WRVJTSU9OICckKDIpJykpCi0KLSAgJChhbGxvd2VkX3ZlcnNpb25zXykpCi1lbmRlZgotCi0jJCh3YXJuaW5nICQoY2FsbCBhbGxvd2VkLXBsYXRmb3JtLXZlcnNpb25zLE9QUjEsUFBSMSxPUFIxKSkKLSMkKHdhcm5pbmcgJChjYWxsIGFsbG93ZWQtcGxhdGZvcm0tdmVyc2lvbnMsT1BNMSxQUFIxLE9QUjEpKQotCi0jIFNldCB1cCB2ZXJzaW9uIGluZm9ybWF0aW9uLgotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdmVyc2lvbl9kZWZhdWx0cy5tawotCi1FTkFCTEVEX1ZFUlNJT05TIDo9ICQoY2FsbCBmaW5kX2FuZF9lYXJsaWVyLCQoQUxMX1ZFUlNJT05TKSwkKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKSkKK0VOQUJMRURfVkVSU0lPTlMgOj0gIk9QUjEgT1BEMSBPUEQyIE9QTTEgT1BNMiBQUFIxIFBQRDEgUFBEMiBQUE0xIFBQTTIgUVBSMSBRUDFBIFFQMUIgUVAyQSBRUDJCIFFEMUEgUUQxQiBRRDJBIFFEMkIgUVExQSBRUTFCIFFRMkEgUVEyQiBRUTNBIFFRM0IgUlAxQSBSUDFCIFJQMkEgUlAyQiBSRDFBIFJEMUIgUkQyQSBSRDJCIFJRMUEgUlExQiBSUTJBIFJRMkIgUlEzQSBSUTNCIFNQMUEgU1AxQiBTUDJBIFNQMkIgU0QxQSBTRDFCIFNEMkEgU0QyQiBTUTFBIFNRMUIgU1EyQSBTUTJCIFNRM0EgU1EzQiBUUDFBIFRQMUIgVFAyQSBUUDJCIFREMUEgVEQxQiBURDJBIFREMkIgVFExQSBUUTFCIFRRMkEgVFEyQiBUUTNBIFRRM0IgVVAxQSBVUDFCIFVQMkEgVVAyQiBVRDFBIFVEMUIgVUQyQSBVRDJCIFVRMUEgVVExQiBVUTJBIFVRMkIgVVEzQSBVUTNCIgogCiAkKGZvcmVhY2ggdiwkKEVOQUJMRURfVkVSU0lPTlMpLCBcCiAgICQoZXZhbCBJU19BVF9MRUFTVF8kKHYpIDo9IHRydWUpKQpAQCAtODMsNyArNzUsNyBAQAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgVGhlIHByb2R1Y3QgZGVmYXVsdHMgdG8gZ2VuZXJpYyBvbiBoYXJkd2FyZQogaWZlcSAoJChUQVJHRVRfUFJPRFVDVCksKQotVEFSR0VUX1BST0RVQ1QgOj0gYW9zcF9hcm0KK1RBUkdFVF9QUk9EVUNUIDo9IGFvc3BfYXJtNjQKIGVuZGlmCiAKIApAQCAtMjU2LDYgKzI0OCw3IEBACiBIT1NUX1BSRUJVSUxUX0FSQ0ggOj0geDg2CiAjIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHdheSB0byBuYW1lIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcHJlYnVpbHQgaG9zdAogIyBvYmplY3RzLiBFLmcuLCBwcmVidWlsdC8kKEhPU1RfUFJFQlVJTFRfVEFHKS9jYworIyBUaGlzIG11c3QgbWF0Y2ggdGhlIGxvZ2ljIGluIGdldF9ob3N0X3ByZWJ1aWx0X3ByZWZpeCBpbiBlbnZzZXR1cC5zaAogSE9TVF9QUkVCVUlMVF9UQUcgOj0gJChCVUlMRF9PUyktJChIT1NUX1BSRUJVSUxUX0FSQ0gpCiAKICMgVEFSR0VUX0NPUFlfT1VUXyogYXJlIGFsbCByZWxhdGl2ZSB0byB0aGUgc3RhZ2luZyBkaXJlY3RvcnksIGllIFBST0RVQ1RfT1VULgpAQCAtMzM5LDYgKzMzMiw3IEBACiAgIFJCQ19QUk9EVUNUX0NPTkZJRyBcCiAgIFJCQ19CT0FSRF9DT05GSUcgXAogICBTT09OR18lIFwKKyAgVEFSR0VUX1JFTEVBU0UgXAogICBUT1BESVIgXAogICBUUkFDRV9CRUdJTl9TT09ORyBcCiAgIFVTRVIpCkBAIC0zNzgsNiArMzcyLDggQEAKIFRBUkdFVF9CVUlMRF9UWVBFIDo9IHJlbGVhc2UKIGVuZGlmCiAKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Byb2R1Y3RfdmFsaWRhdGlvbl9jaGVja3MubWsKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgZmlndXJlIG91dCB0aGUgb3V0cHV0IGRpcmVjdG9yaWVzCiAKQEAgLTU1Myw2ICs1NDksOCBAQAogVEFSR0VUX09VVF9OT1RJQ0VfRklMRVMgOj0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURVMpL05PVElDRV9GSUxFUwogVEFSR0VUX09VVF9GQUtFIDo9ICQoUFJPRFVDVF9PVVQpL2Zha2VfcGFja2FnZXMKIFRBUkdFVF9PVVRfVEVTVENBU0VTIDo9ICQoUFJPRFVDVF9PVVQpL3Rlc3RjYXNlcworVEFSR0VUX09VVF9GTEFHUyA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvRkxBR1MKKwogLktBVElfUkVBRE9OTFkgOj0gXAogICBUQVJHRVRfT1VUX0VYRUNVVEFCTEVTIFwKICAgVEFSR0VUX09VVF9PUFRJT05BTF9FWEVDVVRBQkxFUyBcCkBAIC01NjYsNyArNTY0LDggQEAKICAgVEFSR0VUX09VVF9FVEMgXAogICBUQVJHRVRfT1VUX05PVElDRV9GSUxFUyBcCiAgIFRBUkdFVF9PVVRfRkFLRSBcCi0gIFRBUkdFVF9PVVRfVEVTVENBU0VTCisgIFRBUkdFVF9PVVRfVEVTVENBU0VTIFwKKyAgVEFSR0VUX09VVF9GTEFHUwogCiBpZmVxICgkKFNBTklUSVpFX0xJVEUpLHRydWUpCiAjIFdoZW4gdXNpbmcgU0FOSVRJWkVfTElURSwgQVBLcyBtdXN0IG5vdCBiZSBwYWNrYWdlZCB3aXRoIHNhbml0aXplZCBsaWJyYXJpZXMsIGFzIHRoZXkgd2lsbCBub3QKQEAgLTY5NSw2ICs2OTQsNyBAQAogVEFSR0VUX09VVF9WRU5ET1JfQVBQUyA6PSAkKHRhcmdldF9vdXRfdmVuZG9yX2FwcF9iYXNlKS9hcHAKIFRBUkdFVF9PVVRfVkVORE9SX0FQUFNfUFJJVklMRUdFRCA6PSAkKHRhcmdldF9vdXRfdmVuZG9yX2FwcF9iYXNlKS9wcml2LWFwcAogVEFSR0VUX09VVF9WRU5ET1JfRVRDIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2V0YworVEFSR0VUX09VVF9WRU5ET1JfRkFLRSA6PSAkKFBST0RVQ1RfT1VUKS92ZW5kb3JfZmFrZV9wYWNrYWdlcwogLktBVElfUkVBRE9OTFkgOj0gXAogICBUQVJHRVRfT1VUX1ZFTkRPUl9FWEVDVVRBQkxFUyBcCiAgIFRBUkdFVF9PVVRfVkVORE9SX09QVElPTkFMX0VYRUNVVEFCTEVTIFwKQEAgLTcwMyw3ICs3MDMsOCBAQAogICBUQVJHRVRfT1VUX1ZFTkRPUl9KQVZBX0xJQlJBUklFUyBcCiAgIFRBUkdFVF9PVVRfVkVORE9SX0FQUFMgXAogICBUQVJHRVRfT1VUX1ZFTkRPUl9BUFBTX1BSSVZJTEVHRUQgXAotICBUQVJHRVRfT1VUX1ZFTkRPUl9FVEMKKyAgVEFSR0VUX09VVF9WRU5ET1JfRVRDIFwKKyAgVEFSR0VUX09VVF9WRU5ET1JfRkFLRQogCiAkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PVVRfVkVORE9SX0VYRUNVVEFCTEVTIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVhFQ1VUQUJMRVMpCiAkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PVVRfVkVORE9SX1NIQVJFRF9MSUJSQVJJRVMgOj0gJCh0YXJnZXRfb3V0X3ZlbmRvcl9zaGFyZWRfbGlicmFyaWVzX2Jhc2UpL2xpYgpAQCAtNzcwLDYgKzc3MSw3IEBACiBUQVJHRVRfT1VUX09ETV9BUFBTIDo9ICQodGFyZ2V0X291dF9vZG1fYXBwX2Jhc2UpL2FwcAogVEFSR0VUX09VVF9PRE1fQVBQU19QUklWSUxFR0VEIDo9ICQodGFyZ2V0X291dF9vZG1fYXBwX2Jhc2UpL3ByaXYtYXBwCiBUQVJHRVRfT1VUX09ETV9FVEMgOj0gJChUQVJHRVRfT1VUX09ETSkvZXRjCitUQVJHRVRfT1VUX09ETV9GQUtFIDo9ICQoUFJPRFVDVF9PVVQpL29kbV9mYWtlX3BhY2thZ2VzCiAuS0FUSV9SRUFET05MWSA6PSBcCiAgIFRBUkdFVF9PVVRfT0RNIFwKICAgVEFSR0VUX09VVF9PRE1fRVhFQ1VUQUJMRVMgXApAQCAtNzc5LDcgKzc4MSw4IEBACiAgIFRBUkdFVF9PVVRfT0RNX0pBVkFfTElCUkFSSUVTIFwKICAgVEFSR0VUX09VVF9PRE1fQVBQUyBcCiAgIFRBUkdFVF9PVVRfT0RNX0FQUFNfUFJJVklMRUdFRCBcCi0gIFRBUkdFVF9PVVRfT0RNX0VUQworICBUQVJHRVRfT1VUX09ETV9FVEMgXAorICBUQVJHRVRfT1VUX09ETV9GQUtFCiAKICQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9PRE1fRVhFQ1VUQUJMRVMgOj0gJChUQVJHRVRfT1VUX09ETV9FWEVDVVRBQkxFUykKICQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9PRE1fU0hBUkVEX0xJQlJBUklFUyA6PSAkKHRhcmdldF9vdXRfb2RtX3NoYXJlZF9saWJyYXJpZXNfYmFzZSkvbGliCkBAIC05MTcsMTMgKzkyMCwxNSBAQAogVEFSR0VUX09VVF9QUk9EVUNUX0FQUFMgOj0gJCh0YXJnZXRfb3V0X3Byb2R1Y3RfYXBwX2Jhc2UpL2FwcAogVEFSR0VUX09VVF9QUk9EVUNUX0FQUFNfUFJJVklMRUdFRCA6PSAkKHRhcmdldF9vdXRfcHJvZHVjdF9hcHBfYmFzZSkvcHJpdi1hcHAKIFRBUkdFVF9PVVRfUFJPRFVDVF9FVEMgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL2V0YworVEFSR0VUX09VVF9QUk9EVUNUX0ZBS0UgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL3Byb2R1Y3RfZmFrZV9wYWNrYWdlcwogLktBVElfUkVBRE9OTFkgOj0gXAogICBUQVJHRVRfT1VUX1BST0RVQ1RfRVhFQ1VUQUJMRVMgXAogICBUQVJHRVRfT1VUX1BST0RVQ1RfU0hBUkVEX0xJQlJBUklFUyBcCiAgIFRBUkdFVF9PVVRfUFJPRFVDVF9KQVZBX0xJQlJBUklFUyBcCiAgIFRBUkdFVF9PVVRfUFJPRFVDVF9BUFBTIFwKICAgVEFSR0VUX09VVF9QUk9EVUNUX0FQUFNfUFJJVklMRUdFRCBcCi0gIFRBUkdFVF9PVVRfUFJPRFVDVF9FVEMKKyAgVEFSR0VUX09VVF9QUk9EVUNUX0VUQyBcCisgIFRBUkdFVF9PVVRfUFJPRFVDVF9GQUtFCiAKICQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9QUk9EVUNUX0VYRUNVVEFCTEVTIDo9ICQoVEFSR0VUX09VVF9QUk9EVUNUX0VYRUNVVEFCTEVTKQogJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT1VUX1BST0RVQ1RfU0hBUkVEX0xJQlJBUklFUyA6PSAkKHRhcmdldF9vdXRfcHJvZHVjdF9zaGFyZWRfbGlicmFyaWVzX2Jhc2UpL2xpYgpAQCAtOTYwLDEzICs5NjUsMTUgQEAKIFRBUkdFVF9PVVRfU1lTVEVNX0VYVF9BUFBTX1BSSVZJTEVHRUQgOj0gJCh0YXJnZXRfb3V0X3N5c3RlbV9leHRfYXBwX2Jhc2UpL3ByaXYtYXBwCiBUQVJHRVRfT1VUX1NZU1RFTV9FWFRfRVRDIDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKS9ldGMKIFRBUkdFVF9PVVRfU1lTVEVNX0VYVF9FWEVDVVRBQkxFUyA6PSAkKFRBUkdFVF9PVVRfU1lTVEVNX0VYVCkvYmluCitUQVJHRVRfT1VUX1NZU1RFTV9FWFRfRkFLRSA6PSAkKFBST0RVQ1RfT1VUKS9zeXN0ZW1fZXh0X2Zha2VfcGFja2FnZXMKIC5LQVRJX1JFQURPTkxZIDo9IFwKICAgVEFSR0VUX09VVF9TWVNURU1fRVhUX0VYRUNVVEFCTEVTIFwKICAgVEFSR0VUX09VVF9TWVNURU1fRVhUX1NIQVJFRF9MSUJSQVJJRVMgXAogICBUQVJHRVRfT1VUX1NZU1RFTV9FWFRfSkFWQV9MSUJSQVJJRVMgXAogICBUQVJHRVRfT1VUX1NZU1RFTV9FWFRfQVBQUyBcCiAgIFRBUkdFVF9PVVRfU1lTVEVNX0VYVF9BUFBTX1BSSVZJTEVHRUQgXAotICBUQVJHRVRfT1VUX1NZU1RFTV9FWFRfRVRDCisgIFRBUkdFVF9PVVRfU1lTVEVNX0VYVF9FVEMgXAorICBUQVJHRVRfT1VUX1NZU1RFTV9FWFRfRkFLRQogCiAkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PVVRfU1lTVEVNX0VYVF9FWEVDVVRBQkxFUyA6PSAkKFRBUkdFVF9PVVRfU1lTVEVNX0VYVF9FWEVDVVRBQkxFUykKICQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9TWVNURU1fRVhUX1NIQVJFRF9MSUJSQVJJRVMgOj0gJCh0YXJnZXRfb3V0X3N5c3RlbV9leHRfc2hhcmVkX2xpYnJhcmllc19iYXNlKS9saWIKZGlmZiAtLWdpdCBhL2NvcmUvZXhlY3V0YWJsZV9pbnRlcm5hbC5tayBiL2NvcmUvZXhlY3V0YWJsZV9pbnRlcm5hbC5tawppbmRleCBmYjE0Y2NlLi4yYTc2YzlkIDEwMDY0NAotLS0gYS9jb3JlL2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKKysrIGIvY29yZS9leGVjdXRhYmxlX2ludGVybmFsLm1rCkBAIC00NSw3ICs0NSw3IEBACiBteV90YXJnZXRfY3J0YmVnaW5fZHluYW1pY19vIDo9CiBteV90YXJnZXRfY3J0YmVnaW5fc3RhdGljX28gOj0KIG15X3RhcmdldF9jcnRlbmRfbyA6PQotZWxzZSBpZmRlZiBMT0NBTF9VU0VfVk5ESworZWxzZSBpZmVxICh0cnVlLCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpKQogbXlfdGFyZ2V0X2NydGJlZ2luX2R5bmFtaWNfbyA6PSAkKFNPT05HXyQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT0JKRUNUX2NydGJlZ2luX2R5bmFtaWMudmVuZG9yKQogbXlfdGFyZ2V0X2NydGJlZ2luX3N0YXRpY19vIDo9ICQoU09PTkdfJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PQkpFQ1RfY3J0YmVnaW5fc3RhdGljLnZlbmRvcikKIG15X3RhcmdldF9jcnRlbmRfbyA6PSAkKFNPT05HXyQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT0JKRUNUX2NydGVuZF9hbmRyb2lkLnZlbmRvcikKQEAgLTExMCw0ICsxMTAsNiBAQAogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKG15X2NvdmVyYWdlX3BhdGgpLyQoR0NOT19BUkNISVZFKQogZW5kaWYKIAorJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PUVYRUNVVEFCTEUpKQorCiBlbmRpZiAgIyBza2lwX2J1aWxkX2Zyb21fc291cmNlCmRpZmYgLS1naXQgYS9jb3JlL2Z1enpfdGVzdC5tayBiL2NvcmUvZnV6el90ZXN0Lm1rCmluZGV4IDhhNGI4YzMuLjExODFjNjYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnV6el90ZXN0Lm1rCisrKyBiL2NvcmUvZnV6el90ZXN0Lm1rCkBAIC00MywzICs0Myw1IEBACiBlbmRpZgogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PUZVWlpfVEVTVCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9nZW5lcmF0ZV9lbmZvcmNlX3Jyby5tayBiL2NvcmUvZ2VuZXJhdGVfZW5mb3JjZV9ycm8ubWsKaW5kZXggZWQyNThjYy4uYjAwMjQ2OSAxMDA2NDQKLS0tIGEvY29yZS9nZW5lcmF0ZV9lbmZvcmNlX3Jyby5taworKysgYi9jb3JlL2dlbmVyYXRlX2VuZm9yY2VfcnJvLm1rCkBAIC0xLDYgKzEsNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLWVuZm9yY2VfcnJvX21vZHVsZSA6PSAkKGVuZm9yY2VfcnJvX3NvdXJjZV9tb2R1bGUpX19hdXRvX2dlbmVyYXRlZF9ycm9fJChlbmZvcmNlX3Jyb19wYXJ0aXRpb24pCitlbmZvcmNlX3Jyb19tb2R1bGUgOj0gJChlbmZvcmNlX3Jyb19zb3VyY2VfbW9kdWxlKV9fJChQUk9EVUNUX05BTUUpX19hdXRvX2dlbmVyYXRlZF9ycm9fJChlbmZvcmNlX3Jyb19wYXJ0aXRpb24pCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gJChlbmZvcmNlX3Jyb19tb2R1bGUpCiAKIGludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixBUFBTLCQoTE9DQUxfUEFDS0FHRV9OQU1FKSwsQ09NTU9OKQpkaWZmIC0tZ2l0IGEvY29yZS9nb21hLm1rIGIvY29yZS9nb21hLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjUxZDhiLi4wMDAwMDAwCi0tLSBhL2NvcmUvZ29tYS5taworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgTm90aWNlOiB0aGlzIHdvcmtzIG9ubHkgd2l0aCBHb29nbGUncyBHb21hIGJ1aWxkIGluZnJhc3RydWN0dXJlLgotaWZuZXEgKCQoZmlsdGVyLW91dCBmYWxzZSwkKFVTRV9HT01BKSksKQotICBpZmRlZiBHT01BX0RJUgotICAgIGdvbWFfZGlyIDo9ICQoR09NQV9ESVIpCi0gIGVsc2UKLSAgICBnb21hX2RpciA6PSAkKEhPTUUpL2dvbWEKLSAgZW5kaWYKLSAgR09NQV9DQyA6PSAkKGdvbWFfZGlyKS9nb21hY2MKLQotICAjIEFwcGVuZCBnb21hY2MgdG8gZXhpc3RpbmcgKl9XUkFQUEVSIHZhcmlhYmxlcyBzbyBpdCdzIHBvc3NpYmxlIHRvCi0gICMgdXNlIGJvdGggY2NhY2hlIGFuZCBnb21hY2MuCi0gIENDX1dSQVBQRVIgOj0gJChzdHJpcCAkKENDX1dSQVBQRVIpICQoR09NQV9DQykpCi0gIENYWF9XUkFQUEVSIDo9ICQoc3RyaXAgJChDWFhfV1JBUFBFUikgJChHT01BX0NDKSkKLSAgIyBiLzE0MzY1ODk4NDogZ29tYSBjYW4ndCBoYW5kbGUgdGhlIC0tc3lzdGVtIGFyZ3VtZW50IHRvIGphdmFjCi0gICNKQVZBQ19XUkFQUEVSIDo9ICQoc3RyaXAgJChKQVZBQ19XUkFQUEVSKSAkKEdPTUFfQ0MpKQotCi0gIGdvbWFfZGlyIDo9Ci1lbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9oZWFkZXJfbGlicmFyeV9pbnRlcm5hbC5tayBiL2NvcmUvaGVhZGVyX2xpYnJhcnlfaW50ZXJuYWwubWsKaW5kZXggMzVlZTFiYy4uYTIxYzg1MyAxMDA2NDQKLS0tIGEvY29yZS9oZWFkZXJfbGlicmFyeV9pbnRlcm5hbC5taworKysgYi9jb3JlL2hlYWRlcl9saWJyYXJ5X2ludGVybmFsLm1rCkBAIC0xOSwzICsxOSw1IEBACiAKICQoTE9DQUxfQlVJTFRfTU9EVUxFKToKIAkkKGhpZGUpIHRvdWNoICRACisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1IRUFERVJfTElCUkFSWSkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9ob3N0X2V4ZWN1dGFibGVfaW50ZXJuYWwubWsgYi9jb3JlL2hvc3RfZXhlY3V0YWJsZV9pbnRlcm5hbC5tawppbmRleCAyZmY5ZmYyLi43Yzc5YTFlIDEwMDY0NAotLS0gYS9jb3JlL2hvc3RfZXhlY3V0YWJsZV9pbnRlcm5hbC5taworKysgYi9jb3JlL2hvc3RfZXhlY3V0YWJsZV9pbnRlcm5hbC5tawpAQCAtNTcsNCArNTcsNiBAQAogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKGFsbF9vYmplY3RzKSAkKGFsbF9saWJyYXJpZXMpICQoQ0xBTkdfQ1hYKQogCSQodHJhbnNmb3JtLWhvc3Qtby10by1leGVjdXRhYmxlKQogCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9SE9TVF9FWEVDVVRBQkxFKSkKKwogZW5kaWYgICMgc2tpcF9idWlsZF9mcm9tX3NvdXJjZQpkaWZmIC0tZ2l0IGEvY29yZS9ob3N0X2phdmFfbGlicmFyeS5tayBiL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnkubWsKaW5kZXggODlhYTUzYy4uNjUyZWIwZSAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X2phdmFfbGlicmFyeS5taworKysgYi9jb3JlL2hvc3RfamF2YV9saWJyYXJ5Lm1rCkBAIC05OCw5ICs5OCw3IEBACiAkKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoamFyX21hbmlmZXN0X2ZpbGUpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZnVsbF9zdGF0aWNfamF2YV9saWJzKSB8ICQoTUVSR0VfWklQUykKLQkkKGlmICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpLCAkKGhpZGUpIHNlZCAtZSAicy8lQlVJTERfTlVNQkVSJS8kKEJVSUxEX05VTUJFUl9GUk9NX0ZJTEUpLyIgXAotICAgICAgICAgICAgJChQUklWQVRFX0pBUl9NQU5JRkVTVCkgPiAkKGRpciAkQCkvbWFuaWZlc3QubWYpCi0JJChNRVJHRV9aSVBTKSAtaiAtLWlnbm9yZS1kdXBsaWNhdGVzICQoaWYgJChQUklWQVRFX0pBUl9NQU5JRkVTVCksLW0gJChkaXIgJEApL21hbmlmZXN0Lm1mKSBcCisJJChNRVJHRV9aSVBTKSAtaiAtLWlnbm9yZS1kdXBsaWNhdGVzICQoaWYgJChQUklWQVRFX0pBUl9NQU5JRkVTVCksLW0gJChQUklWQVRFX0pBUl9NQU5JRkVTVCkpIFwKICAgICAgICAgICAgICQoaWYgJChQUklWQVRFX0RPTlRfREVMRVRFX0pBUl9NRVRBX0lORiksLC1zdHJpcERpciBNRVRBLUlORiAtemlwVG9Ob3RTdHJpcCAkPCkgXAogICAgICAgICAgICAgJEAgJDwgJChQUklWQVRFX1NUQVRJQ19KQVZBX0xJQlJBUklFUykKIApAQCAtMTI2LDMgKzEyNCw1IEBACiBpZmVxICgkKFRVUkJJTkVfRU5BQkxFRCksZmFsc2UpCiAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9GVUxMX0NMQVNTRVNfSkFDT0NPX0pBUiksJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcikpKQogZW5kaWYKKworJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PUhPU1RfSkFWQV9MSUJSQVJZKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2hvc3RfamF2YV9saWJyYXJ5X2NvbW1vbi5tayBiL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnlfY29tbW9uLm1rCmluZGV4IDBlNjJmNjAuLjAwNmU2ZWMgMTAwNjQ0Ci0tLSBhL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnlfY29tbW9uLm1rCisrKyBiL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnlfY29tbW9uLm1rCkBAIC00Niw1ICs0Niw0IEBACiBlbmRpZgogZW5kaWYKIAotTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRV9ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSAkKHNvcnQgJChMT0NBTF9KQVZBX0xJQlJBUklFUykpCmRpZmYgLS1naXQgYS9jb3JlL2hvc3RfcHJlYnVpbHQubWsgYi9jb3JlL2hvc3RfcHJlYnVpbHQubWsKaW5kZXggNzlmM2ZmYS4uN2RjNjcwNCAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X3ByZWJ1aWx0Lm1rCisrKyBiL2NvcmUvaG9zdF9wcmVidWlsdC5tawpAQCAtMTcsMyArMTcsNSBAQAogJChjYWxsIHJlY29yZC1tb2R1bGUtdHlwZSxIT1NUX1BSRUJVSUxUKQogTE9DQUxfSVNfSE9TVF9NT0RVTEUgOj0gdHJ1ZQogaW5jbHVkZSAkKEJVSUxEX01VTFRJX1BSRUJVSUxUKQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9SE9TVF9QUkVCVUlMVCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9ob3N0X3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rIGIvY29yZS9ob3N0X3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rCmluZGV4IGFlOGI3OTguLjIyYTAyZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvaG9zdF9zaGFyZWRfbGlicmFyeV9pbnRlcm5hbC5taworKysgYi9jb3JlL2hvc3Rfc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsKQEAgLTUzLDQgKzUzLDYgQEAKICAgICAgICAgJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykKIAkkKHRyYW5zZm9ybS1ob3N0LW8tdG8tc2hhcmVkLWxpYikKIAorJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PUhPU1RfU0hBUkVEX0xJQlJBUlkpKQorCiBlbmRpZiAgIyBza2lwX2J1aWxkX2Zyb21fc291cmNlCmRpZmYgLS1naXQgYS9jb3JlL2hvc3Rfc3RhdGljX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL2hvc3Rfc3RhdGljX2xpYnJhcnlfaW50ZXJuYWwubWsKaW5kZXggMzk0NmFhNy4uMDc5YzQ1ZSAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X3N0YXRpY19saWJyYXJ5X2ludGVybmFsLm1rCisrKyBiL2NvcmUvaG9zdF9zdGF0aWNfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtMjMsMyArMjMsNSBAQAogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKGJ1aWx0X3dob2xlX2xpYnJhcmllcykKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChhbGxfb2JqZWN0cykKIAkkKHRyYW5zZm9ybS1ob3N0LW8tdG8tc3RhdGljLWxpYikKKworJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PUhPU1RfU1RBVElDX0xJQlJBUlkpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS5tayBiL2NvcmUvamF2YS5tawppbmRleCBiMTNlZjRkLi41ZmJjOTE2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEubWsKKysrIGIvY29yZS9qYXZhLm1rCkBAIC04Myw4ICs4Myw2IEBACiAgICAgJChmdWxsX2NsYXNzZXNfc3R1YnNfamFyKSBcCiAgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpCiAKLUxPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3NyYwotCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQUlETDogQ29tcGlsZSAuYWlkbCBmaWxlcyB0byAuamF2YQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTI5Niw5ICsyOTQsNyBAQAogJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKTogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGphcl9tYW5pZmVzdF9maWxlKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZ1bGxfc3RhdGljX2phdmFfbGlicykgfCAkKE1FUkdFX1pJUFMpCi0JJChpZiAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSwgJChoaWRlKSBzZWQgLWUgInMvJUJVSUxEX05VTUJFUiUvJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKS8iIFwKLSAgICAgICAgICAgICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpID4gJChkaXIgJEApL21hbmlmZXN0Lm1mKQotCSQoTUVSR0VfWklQUykgLWogLS1pZ25vcmUtZHVwbGljYXRlcyAkKGlmICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpLC1tICQoZGlyICRAKS9tYW5pZmVzdC5tZikgXAorCSQoTUVSR0VfWklQUykgLWogLS1pZ25vcmUtZHVwbGljYXRlcyAkKGlmICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpLC1tICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpKSBcCiAgICAgICAgICAgICAkKGlmICQoUFJJVkFURV9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkYpLCwtc3RyaXBEaXIgTUVUQS1JTkYgLXppcFRvTm90U3RyaXAgJDwpIFwKICAgICAgICAgICAgICRAICQ8ICQoUFJJVkFURV9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpCiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YV9jb21tb24ubWsgYi9jb3JlL2phdmFfY29tbW9uLm1rCmluZGV4IDBlMDNkMGIuLmEyMWYwNjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YV9jb21tb24ubWsKKysrIGIvY29yZS9qYXZhX2NvbW1vbi5tawpAQCAtMTAsOSArMTAsNyBAQAogIyMgSmF2YSB2ZXJzaW9uCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBVc2UgdGhlIExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiBpZiBpdCBpcyBzZXQsIG90aGVyd2lzZQotIyB1c2Ugb25lIGJhc2VkIG9uIHRoZSBMT0NBTF9TREtfVkVSU0lPTi4gSWYgaXQgaXMgPCAyNAotIyBwYXNzICIxLjciIHRvIHRoZSB0b29scywgaWYgaXQgaXMgdW5zZXQsID49IDI0IG9yICJjdXJyZW50IgotIyBwYXNzICIxLjgiLgorIyB1c2Ugb25lIGJhc2VkIG9uIHRoZSBMT0NBTF9TREtfVkVSU0lPTi4KICMKICMgVGhlIExPQ0FMX1NES19WRVJTSU9OIGJlaGF2aW9yIGlzIHRvIGVuc3VyZSB0aGF0LCBieSBkZWZhdWx0LAogIyBjb2RlIHRoYXQgaXMgZXhwZWN0ZWQgdG8gcnVuIG9uIG9sZGVyIHJlbGVhc2VzIG9mIEFuZHJvaWQKQEAgLTI1LDE1ICsyMywxOSBAQAogICAgICMgSG9zdCBtb2R1bGVzIGFsd2F5cyBkZWZhdWx0IHRvIDEuOQogICAgIExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiA6PSAxLjkKICAgZWxzZQotICAgIGlmbmVxICgsJChmaWx0ZXIgJChMT0NBTF9TREtfVkVSU0lPTiksICQoVEFSR0VUX1NES19WRVJTSU9OU19XSVRIT1VUX0pBVkFfMThfU1VQUE9SVCkpKQotICAgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9IDEuNwotICAgIGVsc2UgaWZuZXEgKCwkKGZpbHRlciAkKExPQ0FMX1NES19WRVJTSU9OKSwgJChUQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xOV9TVVBQT1JUKSkpCisgICAgaWZuZXEgKCwkKGZpbHRlciAkKExPQ0FMX1NES19WRVJTSU9OKSwgJChUQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xXzlfU1VQUE9SVCkpKQogICAgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9IDEuOAorICAgIGVsc2UgaWZuZXEgKCwkKGZpbHRlciAkKExPQ0FMX1NES19WRVJTSU9OKSwgJChUQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xMV9TVVBQT1JUKSkpCisgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMS45CisgICAgZWxzZSBpZm5lcSAoLCQoZmlsdGVyICQoTE9DQUxfU0RLX1ZFUlNJT04pLCAkKFRBUkdFVF9TREtfVkVSU0lPTlNfV0lUSE9VVF9KQVZBXzE3X1NVUFBPUlQpKSkKKyAgICAgIExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiA6PSAxMQogICAgIGVsc2UgaWZuZXEgKCwkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX1VTRV9QUkVCVUlMVF9TREtTKSkKICAgICAgICMgVE9ETyhjY3Jvc3MpOiBhbGxvdyAxLjkgZm9yIGN1cnJlbnQgYW5kIHVuYnVuZGxlZCBvbmNlIHdlIGhhdmUgU0RLIHN5c3RlbSBtb2R1bGVzCiAgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMS44CisgICAgZWxzZSBpZmVxICgkKEVYUEVSSU1FTlRBTF9UQVJHRVRfSkFWQV9WRVJTSU9OXzIxKSx0cnVlKQorICAgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9IDIxCiAgICAgZWxzZQotICAgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9IDEuOQorICAgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9IDE3CiAgICAgZW5kaWYKICAgZW5kaWYKIGVuZGlmCkBAIC0xOTAsNyArMTkyLDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBQUklWQVRFIGphdmEgdmFycwogIyBMT0NBTF9TT1VSQ0VfRklMRVNfQUxMX0dFTkVSQVRFRCBpcyBzZXQgb25seSBpZiB0aGUgbW9kdWxlIGRvZXMgbm90IGhhdmUgc3RhdGljIHNvdXJjZSBmaWxlcywKLSMgYnV0IGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgaW4gaXRzIExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VfRElSLgorIyBidXQgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcy4KICMgWW91IGhhdmUgdG8gc2V0IHVwIHRoZSBkZXBlbmRlbmN5IGluIHNvbWUgb3RoZXIgd2F5LgogbmVlZF9jb21waWxlX2phdmEgOj0gJChzdHJpcCAkKGFsbF9qYXZhX3NvdXJjZXMpJChMT0NBTF9TUkNKQVJTKSQoYWxsX3Jlc19hc3NldHMpJChqYXZhX3Jlc291cmNlX3NvdXJjZXMpKSQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSQoZmlsdGVyIHRydWUsJChMT0NBTF9TT1VSQ0VfRklMRVNfQUxMX0dFTkVSQVRFRCkpCiBpZmRlZiBuZWVkX2NvbXBpbGVfamF2YQpAQCAtMjM0LDggKzIzNiw2IEBACiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9KQVZBX1NPVVJDRVMgOj0gJChhbGxfamF2YV9zb3VyY2VzKQogJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSkFWQV9TT1VSQ0VfTElTVCA6PSAkKGphdmFfc291cmNlX2xpc3RfZmlsZSkKIAotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfUk1UWVBFREVGUyA6PSAkKExPQ0FMX1JNVFlQRURFRlMpCi0KICMgUXVpY2tseSBjaGVjayBjbGFzcyBwYXRoIHZhcnMuCiBkaXNhbGxvd2VkX2RlcHMgOj0gJChmb3JlYWNoIHNkaywkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSwkKGNhbGwgcmVzb2x2ZS1wcmVidWlsdC1zZGstbW9kdWxlLCQoc2RrKSkpCiBkaXNhbGxvd2VkX2RlcHMgKz0gJChmb3JlYWNoIHNkaywkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSxcCkBAIC0zODQsNyArMzg0LDcgQEAKIGVuZGlmICMgIUxPQ0FMX0lTX0hPU1RfTU9EVUxFCiAKICMgKGIvMjA0Mzk3MTgwKSBSZWNvcmQgQUxMX0RFUFMgYnkgZGVmYXVsdC4KLUFMTF9ERVBTLiQoTE9DQUxfTU9EVUxFKS5BTExfREVQUyA6PSAkKEFMTF9ERVBTLiQoTE9DQUxfTU9EVUxFKS5BTExfREVQUykgJChmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzKQorQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5BTExfREVQUyA6PSAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQUxMX0RFUFMpICQoZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicykKIAogIyBFeHBvcnQgdGhlIFNESyBsaWJzLiBUaGUgc2RrIGxpYnJhcnkgbmFtZXMgbGlzdGVkIGluIExPQ0FMX1NES19MSUJSQVJJRVMgYXJlIGZpcnN0IGV4cG9ydGVkLgogIyBUaGVuIHNkayBsaWJyYXJ5IG5hbWVzIGV4cG9ydGVkIGZyb20gZGVwZW5kZW5jaWVzIGFyZSBhbGwgcmUtZXhwb3J0ZWQuCkBAIC00MTAsNyArNDEwLDcgQEAKIGZ1bGxfamF2YV9zeXN0ZW1fbW9kdWxlc19kZXBzIDo9CiBteV9zeXN0ZW1fbW9kdWxlc19kaXIgOj0KICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1VTRV9TWVNURU1fTU9EVUxFUyA6PQotaWZlcSAoJChMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04pLDEuOSkKK2lmZXEgKCwkKGZpbHRlciAkKExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiksJChKQVZBX0xBTkdVQUdFX1ZFUlNJT05TX1dJVEhPVVRfU1lTVEVNX01PRFVMRVMpKSkKICAgJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfVVNFX1NZU1RFTV9NT0RVTEVTIDo9IHRydWUKICAgaWZkZWYgbXlfc3lzdGVtX21vZHVsZXMKICAgICBpZm5lcSAoJChteV9zeXN0ZW1fbW9kdWxlcyksbm9uZSkKQEAgLTQ4OCwyMCArNDg4LDYgQEAKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0FMTF9KQVZBX0hFQURFUl9MSUJSQVJJRVMgOj0gJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9TSEFSRURfSkFWQV9IRUFERVJfTElCUkFSSUVTIDo9ICQoZnVsbF9zaGFyZWRfamF2YV9oZWFkZXJfbGlicykKIAotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlRFUk1FRElBVEVfU09VUkNFX0RJUiA6PSBcCi0gICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOVEVSTUVESUFURV9TT1VSQ0VfRElSKSAkKExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VfRElSKQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weSBOT1RJQ0UgZmlsZXMgb2YgdHJhbnNpdGl2ZSBzdGF0aWMgZGVwZW5kZW5jaWVzCi0jIERvbid0IGRvIHRoaXMgaW4gbW0sIHNpbmNlIG1hbnkgb2YgdGhlIHRhcmdldHMgd29uJ3QgZXhpc3QuCi1pbnN0YWxsZWRfc3RhdGljX2xpYnJhcnlfbm90aWNlX2ZpbGVfdGFyZ2V0cyA6PSBcCi0gICAgJChmb3JlYWNoIGxpYiwkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyksIFwKLSAgICAgIE5PVElDRS0kKGlmICQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpLEhPU1QkKGlmICQobXlfaG9zdF9jcm9zcyksX0NST1NTLCksVEFSR0VUKS1KQVZBX0xJQlJBUklFUy0kKGxpYikpCi0KLSQobm90aWNlX3RhcmdldCk6IHwgJChpbnN0YWxsZWRfc3RhdGljX2xpYnJhcnlfbm90aWNlX2ZpbGVfdGFyZ2V0cykKLSQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6IHwgJChub3RpY2VfdGFyZ2V0KQotCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBWZXJpZnkgdGhhdCBhbGwgbGlicmFyaWVzIGFyZSBzYWZlIHRvIHVzZQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YV9saWJyYXJ5Lm1rIGIvY29yZS9qYXZhX2xpYnJhcnkubWsKaW5kZXggM2FjMDNkYy4uOTdjZTkyYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhX2xpYnJhcnkubWsKKysrIGIvY29yZS9qYXZhX2xpYnJhcnkubWsKQEAgLTg4LDMgKzg4LDUgQEAKICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGNvbW1vbl9qYXZhbGliLmphciksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKIAogZW5kaWYgIyAhTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9SkFWQV9MSUJSQVJZKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmFfcHJlYnVpbHRfaW50ZXJuYWwubWsgYi9jb3JlL2phdmFfcHJlYnVpbHRfaW50ZXJuYWwubWsKaW5kZXggYmU3MzNmZi4uNDYzOTNhYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhX3ByZWJ1aWx0X2ludGVybmFsLm1rCisrKyBiL2NvcmUvamF2YV9wcmVidWlsdF9pbnRlcm5hbC5tawpAQCAtMTE1LDExICsxMTUsNiBAQAogaWZuZXEgKCQobXlfc3JjX2FhciksKQogIyBUaGlzIGlzIC5hYXIgZmlsZSwgYXJjaGl2ZSBvZiBjbGFzc2VzLmphciBhbmQgQW5kcm9pZCByZXNvdXJjZXMuCiAKLSMgcnVuIEpldGlmaWVyIGlmIG5lZWRlZAotTE9DQUxfSkVUSUZJRVJfSU5QVVRfRklMRSA6PSAkKG15X3NyY19hYXIpCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9qZXRpZmllci5tawotbXlfc3JjX2FhciA6PSAkKExPQ0FMX0pFVElGSUVSX09VVFBVVF9GSUxFKQotCiBteV9zcmNfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2Fhci9jbGFzc2VzLmphcgogbXlfc3JjX3Byb2d1YXJkX29wdGlvbnMgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvYWFyL3Byb2d1YXJkLnR4dAogbXlfc3JjX2FuZHJvaWRfbWFuaWZlc3QgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvYWFyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTEzNywxMyArMTMyLDYgQEAKICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKG15X3NyY19hbmRyb2lkX21hbmlmZXN0KSwkKG15X3ByZWJ1aWx0X2FuZHJvaWRfbWFuaWZlc3QpKSkKICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKExPQ0FMX0JVSUxUX01PRFVMRSksJChteV9wcmVidWlsdF9hbmRyb2lkX21hbmlmZXN0KSkKIAotZWxzZQotCi0jIHJ1biBKZXRpZmllciBpZiBuZWVkZWQKLUxPQ0FMX0pFVElGSUVSX0lOUFVUX0ZJTEUgOj0gJChteV9zcmNfamFyKQotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvamV0aWZpZXIubWsKLW15X3NyY19qYXIgOj0gJChMT0NBTF9KRVRJRklFUl9PVVRQVVRfRklMRSkKLQogZW5kaWYKIAogJChjb21tb25fY2xhc3Nlc19qYXIpIDogJChteV9zcmNfamFyKQpkaWZmIC0tZ2l0IGEvY29yZS9qZXRpZmllci5tayBiL2NvcmUvamV0aWZpZXIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjQyMzAuLjAwMDAwMDAKLS0tIGEvY29yZS9qZXRpZmllci5taworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBmaWxlIHNldHMgdXAgdGhlIHJ1bm5pbmcgb2YgSmV0aWZpZXIKLQotIyBub3cgYWRkIHRoZSBydWxlIHRvIHJ1biBqZXRpZmllcgotaWZlcSAoJChzdHJpcCAkKExPQ0FMX0pFVElGSUVSX0VOQUJMRUQpKSx0cnVlKQotICBteV9qZXRpZmllcl9pbnB1dF9wYXRoIDo9ICQoTE9DQUxfSkVUSUZJRVJfSU5QVVRfRklMRSkKLSAgbXlfZmlsZXMgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamV0aWZpZXIKLSAgbXlfamV0aWZpZXJfb3V0cHV0X3BhdGggOj0gJChteV9maWxlcykvamV0aWZpZWQtJChub3RkaXIgJChteV9qZXRpZmllcl9pbnB1dF9wYXRoKSkKLQotJChteV9qZXRpZmllcl9vdXRwdXRfcGF0aCkgOiAkKG15X2pldGlmaWVyX2lucHV0X3BhdGgpICQoSkVUSUZJRVIpCi0Jcm0gLXJmICRACi0JJChKRVRJRklFUikgLWwgZXJyb3IgLW8gJEAgLWkgJDwKLQotICBMT0NBTF9KRVRJRklFUl9PVVRQVVRfRklMRSA6PSAkKG15X2pldGlmaWVyX291dHB1dF9wYXRoKQotICBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSAkKExPQ0FMX0pFVElGSUVSX09VVFBVVF9GSUxFKQotZWxzZQotICBMT0NBTF9KRVRJRklFUl9PVVRQVVRfRklMRSA6PSAkKExPQ0FMX0pFVElGSUVSX0lOUFVUX0ZJTEUpCi1lbmRpZgotCmRpZmYgLS1naXQgYS9jb3JlL2xheW91dGxpYl9kYXRhLm1rIGIvY29yZS9sYXlvdXRsaWJfZGF0YS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVmN2VmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sYXlvdXRsaWJfZGF0YS5tawpAQCAtMCwwICsxLDE1MyBAQAorIyBEYXRhIGZpbGVzIGZvciBsYXlvdXRsaWIKKworRk9OVF9URU1QIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGZvbnRzLEhPU1QsQ09NTU9OKQorCisjIFRoZSBmb250IGNvbmZpZ3VyYXRpb24gZmlsZXMgLSBzeXN0ZW1fZm9udHMueG1sLCBmYWxsYmFja19mb250cy54bWwgZXRjLgorZm9udF9jb25maWcgOj0gJChzb3J0ICQod2lsZGNhcmQgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvKi54bWwpKQorZm9udF9jb25maWcgOj0gJChhZGRwcmVmaXggJChGT05UX1RFTVApLywgJChub3RkaXIgJChmb250X2NvbmZpZykpKQorCiskKGZvbnRfY29uZmlnKTogJChGT05UX1RFTVApLyUueG1sOiBcCisJCQlmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy8lLnhtbAorCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBjcCAtdmYgJDwgJEAKKworIyBMaXN0IG9mIGZvbnRzIG9uIHRoZSBkZXZpY2UgdGhhdCB3ZSB3YW50IHRvIHNoaXAuIFRoaXMgaXMgYWxsIC50dGYsIC50dGMgYW5kIC5vdGYgZm9udHMuCitmb250c19kZXZpY2UgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUKS9mb250cy8lLnR0ZiAkKFRBUkdFVF9PVVQpL2ZvbnRzLyUudHRjICQoVEFSR0VUX09VVCkvZm9udHMvJS5vdGYsICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpKQorZm9udHNfZGV2aWNlIDo9ICQoYWRkcHJlZml4ICQoRk9OVF9URU1QKS8sICQobm90ZGlyICQoZm9udHNfZGV2aWNlKSkpCisKKyMgVE9ETzogSWYgdGhlIGZvbnQgZmlsZSBpcyBhIHN5bWxpbmssIHJldXNlIHRoZSBmb250IHJlbmFtZWQgZnJvbSB0aGUgc3ltbGluaworIyB0YXJnZXQuCiskKGZvbnRzX2RldmljZSk6ICQoRk9OVF9URU1QKS8lOiAkKFRBUkdFVF9PVVQpL2ZvbnRzLyUKKwkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQorCSQoaGlkZSkgY3AgLXZmICQ8ICRACisKK0tFWUJPQVJEX1RFTVAgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsa2V5Ym9hcmRzLEhPU1QsQ09NTU9OKQorCisjIFRoZSBrZXkgY2hhcmFjdGVyIG1hcCBmaWxlcyBuZWVkZWQgZm9yIHN1cHBvcnRpbmcgS2V5RXZlbnQKK2tleWJvYXJkcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9rZXlib2FyZHMvKi5rY20pKQora2V5Ym9hcmRzIDo9ICQoYWRkcHJlZml4ICQoS0VZQk9BUkRfVEVNUCkvLCAkKG5vdGRpciAkKGtleWJvYXJkcykpKQorCiskKGtleWJvYXJkcyk6ICQoS0VZQk9BUkRfVEVNUCkvJS5rY206IGZyYW1ld29ya3MvYmFzZS9kYXRhL2tleWJvYXJkcy8lLmtjbQorCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBjcCAtdmYgJDwgJEAKKworIyBMaXN0IG9mIGFsbCBkYXRhIGZpbGVzIC0gZm9udCBmaWxlcywgZm9udCBjb25maWd1cmF0aW9uIGZpbGVzLCBrZXkgY2hhcmFjdGVyIG1hcCBmaWxlcworTEFZT1VUTElCX0ZJTEVTIDo9ICQoZm9udHNfZGV2aWNlKSAkKGZvbnRfY29uZmlnKSAkKGtleWJvYXJkcykKKworLlBIT05ZOiBsYXlvdXRsaWIgbGF5b3V0bGliLXRlc3RzCitsYXlvdXRsaWIgbGF5b3V0bGliLXRlc3RzOiAkKExBWU9VVExJQl9GSUxFUykKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBsYXlvdXRsaWIsICQoZm9yZWFjaCBtLCQoZm9udHNfZGV2aWNlKSwgJChtKTpsYXlvdXRsaWJfbmF0aXZlL2ZvbnRzLyQobm90ZGlyICQobSkpKSkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgbGF5b3V0bGliLCAkKGZvcmVhY2ggbSwkKGZvbnRfY29uZmlnKSwgJChtKTpsYXlvdXRsaWJfbmF0aXZlL2ZvbnRzLyQobm90ZGlyICQobSkpKSkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgbGF5b3V0bGliLCAkKGZvcmVhY2ggbSwkKGtleWJvYXJkcyksICQobSk6bGF5b3V0bGliX25hdGl2ZS9rZXlib2FyZHMvJChub3RkaXIgJChtKSkpKQorCitGT05UX1RFTVAgOj0KK2ZvbnRfY29uZmlnIDo9Citmb250c19kZXZpY2UgOj0KK0ZPTlRfRklMRVMgOj0KKworIyBUaGUgZm9sbG93aW5nIGJ1aWxkIHByb2Nlc3Mgb2YgYnVpbGQucHJvcCwgbGF5b3V0bGliLXJlcy56aXAgaXMgbW92ZWQgaGVyZSBmcm9tIHJlbGVhc2VfbGF5b3V0bGliLnNoCisjIHNvIHRoZSBTQk9NIG9mIGFsbCBwbGF0Zm9ybSBuZXV0cmFsIGFydGlmYWN0cyBhbmQgTGludXgvV2luZG93cyBhcnRpZmFjdHMgb2YgbGF5b3V0bGliIGNhbiBiZSBidWlsdCBpbiBNYWtlL1Nvb25nLgorIyBTZWUgZ28vbGF5b3V0bGliLXNib20uCisKKyMgYnVpbGQucHJvcCBzaGlwcGVkIHdpdGggbGF5b3V0bGliCitMQVlPVVRMSUJfQlVJTERfUFJPUCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxsYXlvdXRsaWItYnVpbGQtcHJvcCxIT1NULENPTU1PTikKKyQoTEFZT1VUTElCX0JVSUxEX1BST1ApL2xheW91dGxpYi1idWlsZC5wcm9wOiAkKElOU1RBTExFRF9TREtfQlVJTERfUFJPUF9UQVJHRVQpCisJcm0gLXJmICRACisJY3AgJDwgJEAKKwkjIFJlbW92ZSBhbGwgdGhlIHVuY29tbW9uIGJ1aWxkIHByb3BlcnRpZXMKKwlzZWQgLWkgJy9ecm9cLlwoYnVpbGRcfHByb2R1Y3RcfGNvbmZpZ1x8c3lzdGVtXCkvIWQnICRACisJIyBNYXJrIHRoZSBidWlsZCBhcyBsYXlvdXRsaWIuIFRoaXMgY2FuIGJlIHJlYWQgYXQgcnVudGltZSBieSBhcHBzCisJc2VkIC1pICdzfHJvLnByb2R1Y3QuYnJhbmQ9Z2VuZXJpY3xyby5wcm9kdWN0LmJyYW5kPXN0dWRpb3wnICRACisJc2VkIC1pICdzfHJvLnByb2R1Y3QuZGV2aWNlPWdlbmVyaWN8cm8ucHJvZHVjdC5kZXZpY2U9bGF5b3V0bGlifCcgJEAKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLGxheW91dGxpYiwkKExBWU9VVExJQl9CVUlMRF9QUk9QKS9sYXlvdXRsaWItYnVpbGQucHJvcDpsYXlvdXRsaWJfbmF0aXZlL2J1aWxkLnByb3ApCisKKyMgUmVzb3VyY2UgZmlsZXMgZnJvbSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzCitMQVlPVVRMSUJfUkVTIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGxheW91dGxpYi1yZXMsSE9TVCxDT01NT04pCitMQVlPVVRMSUJfUkVTX0ZJTEVTIDo9ICQoc2hlbGwgZmluZCBmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzIC10eXBlIGYgLW5vdCAtcGF0aCAnZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbVtuY11jKicgfCBzb3J0KQorJChMQVlPVVRMSUJfUkVTKS9sYXlvdXRsaWItcmVzLnppcDogJChTT09OR19aSVApICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FhcHQyICQoTEFZT1VUTElCX1JFU19GSUxFUykKKwlybSAtcmYgJEAKKwllY2hvICQoTEFZT1VUTElCX1JFU19GSUxFUykgPiAkKExBWU9VVExJQl9SRVMpL2ZpbGVsaXN0LnR4dAorCSQoU09PTkdfWklQKSAtQyBmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMgLWwgJChMQVlPVVRMSUJfUkVTKS9maWxlbGlzdC50eHQgLW8gJChMQVlPVVRMSUJfUkVTKS90ZW1wLnppcAorCXJtIC1yZiAkKExBWU9VVExJQl9SRVMpL2RhdGEgJiYgdW56aXAgLXEgLWQgJChMQVlPVVRMSUJfUkVTKS9kYXRhICQoTEFZT1VUTElCX1JFUykvdGVtcC56aXAKKwlybSAtcmYgJChMQVlPVVRMSUJfUkVTKS9jb21waWxlZCAmJiBta2RpciAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkICYmICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FhcHQyIGNvbXBpbGUgJChMQVlPVVRMSUJfUkVTKS9kYXRhL3Jlcy8qKi8qLjkucG5nIC1vICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWQKKwlwcmludGYgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+XG48bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBwYWNrYWdlPSJjb20uZ29vZ2xlLmFuZHJvaWQubGF5b3V0bGliIiAvPicgPiAkKExBWU9VVExJQl9SRVMpL0FuZHJvaWRNYW5pZmVzdC54bWwKKwkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hYXB0MiBsaW5rIC1SICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWQvKiAtbyAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkLmFwayAtLW1hbmlmZXN0ICQoTEFZT1VUTElCX1JFUykvQW5kcm9pZE1hbmlmZXN0LnhtbAorCXJtIC1yZiAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkX2FwayAmJiB1bnppcCAtcSAtZCAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkX2FwayAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkLmFwaworCWZvciBmIGluICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWRfYXBrL3Jlcy8qOyBkbyBtdiAiJCRmIiAiJCR7Zi8tdjQvfSI7ZG9uZQorCWZvciBmIGluICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWRfYXBrL3Jlcy8qKi8qLjkucG5nOyBkbyBtdiAiJCRmIiAiJCR7Zi8uOS5wbmcvLmNvbXBpbGVkLjkucG5nfSI7ZG9uZQorCWNwIC1yICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWRfYXBrL3JlcyAkKExBWU9VVExJQl9SRVMpL2RhdGEKKwkkKFNPT05HX1pJUCkgLUMgJChMQVlPVVRMSUJfUkVTKS9kYXRhIC1EICQoTEFZT1VUTElCX1JFUykvZGF0YS9yZXMgLW8gJEAKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLGxheW91dGxpYiwkKExBWU9VVExJQl9SRVMpL2xheW91dGxpYi1yZXMuemlwOmxheW91dGxpYl9uYXRpdmUvcmVzLnppcCkKKworIyBTQk9NIG9mIGxheW91dGxpYiBhcnRpZmFjdHMKK0xBWU9VVExJQl9TQk9NIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGxheW91dGxpYi1zYm9tLEhPU1QpCitfbGF5b3V0bGliX2ZvbnRfY29uZmlnX2ZpbGVzIDo9ICQoc29ydCAkKHdpbGRjYXJkIGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzLyoueG1sKSkKK19sYXlvdXRsaWJfZm9udHNfZmlsZXMgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUKS9mb250cy8lLnR0ZiAkKFRBUkdFVF9PVVQpL2ZvbnRzLyUudHRjICQoVEFSR0VUX09VVCkvZm9udHMvJS5vdGYsICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpKQorX2xheW91dGxpYl9rZXlib2FyZF9maWxlcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9rZXlib2FyZHMvKi5rY20pKQorCisjIEZpbmQgb3V0IGZpbGVzIGRpc3RlZCB3aXRoIGxheW91dGxpYiBpbiBTb29uZy4KKyMjIyBGaWx0ZXIgb3V0IHN0YXRpYyBsaWJyYXJpZXMgZm9yIFdpbmRvd3MgYW5kIGZpbGVzIGFscmVhZHkgaGFuZGxlZCBpbiBtYWtlLgorX2xheW91dGxpYl9maWx0ZXJfb3V0X2Rpc3RlZCA6PSAkKGFkZHByZWZpeCBsYXlvdXRsaWJfbmF0aXZlLyxmb250cy8lIGtleWJvYXJkcy8lIGJ1aWxkLnByb3AgcmVzLnppcCB3aW5kb3dzLyUuYSkKK19sYXlvdXRsaWJfZmlsZXNfZGlzdGVkX2J5X3Nvb25nIDo9IFwKKyAgJChzdHJpcCBcCisgICAgJChmb3JlYWNoIHAsJChfYWxsX2Rpc3Rfc3JjX2RzdF9wYWlycyksIFwKKyAgICAgICQoaWYgJChmaWx0ZXItb3V0ICQoX2xheW91dGxpYl9maWx0ZXJfb3V0X2Rpc3RlZCksJChmaWx0ZXIgbGF5b3V0bGliX25hdGl2ZS8lIGxheW91dGxpYi5qYXIsJChjYWxsIHdvcmQtY29sb24sMiwkcCkpKSwkcCkpKQorCiskKExBWU9VVExJQl9TQk9NKS9zYm9tLW1ldGFkYXRhLmNzdjoKKwlybSAtcmYgJEAKKwllY2hvIGluc3RhbGxlZF9maWxlLG1vZHVsZV9wYXRoLHNvb25nX21vZHVsZV90eXBlLGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlLHByb2R1Y3RfY29weV9maWxlcyxrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMsaXNfcGxhdGZvcm1fZ2VuZXJhdGVkLGJ1aWxkX291dHB1dF9wYXRoLHN0YXRpY19saWJyYXJpZXMsd2hvbGVfc3RhdGljX2xpYnJhcmllcyxpc19zdGF0aWNfbGliID4+ICRACisJZWNobyBidWlsZC5wcm9wLCwsLCwsWSwkKExBWU9VVExJQl9CVUlMRF9QUk9QKS9sYXlvdXRsaWItYnVpbGQucHJvcCwsLCA+PiAkQAorCisJJChmb3JlYWNoIGYsJChfbGF5b3V0bGliX2ZvbnRfY29uZmlnX2ZpbGVzKSxcCisJICBlY2hvIGRhdGEvZm9udHMvJChub3RkaXIgJGYpLGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzLHByZWJ1aWx0X2V0YywsLCwsJGYsLCwgPj4gJEA7IFwKKwkpCisKKwkkKGZvcmVhY2ggZiwkKF9sYXlvdXRsaWJfZm9udHNfZmlsZXMpLCBcCisJICAkKGV2YWwgX21vZHVsZV9uYW1lIDo9ICQoQUxMX0lOU1RBTExFRF9GSUxFUy4kZikpIFwKKwkgICQoZXZhbCBfbW9kdWxlX3BhdGggOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuUEFUSCkpKSkgXAorCSAgJChldmFsIF9zb29uZ19tb2R1bGVfdHlwZSA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5TT09OR19NT0RVTEVfVFlQRSkpKSkgXAorCSAgZWNobyBkYXRhL2ZvbnRzLyQobm90ZGlyICRmKSwkKF9tb2R1bGVfcGF0aCksJChfc29vbmdfbW9kdWxlX3R5cGUpLCwsLCwkZiwsLCA+PiAkQDsgXAorCSkKKworCSQoZm9yZWFjaCBmLCQoX2xheW91dGxpYl9rZXlib2FyZF9maWxlcyksIFwKKwkgIGVjaG8gZGF0YS9rZXlib2FyZHMvJChub3RkaXIgJGYpLGZyYW1ld29ya3MvYmFzZS9kYXRhL2tleWJvYXJkcyxwcmVidWlsdF9ldGMsLCwsLCRmLCwsID4+ICRAOyBcCisJKQorCisJJChmb3JlYWNoIGYsJChfbGF5b3V0bGliX2ZpbGVzX2Rpc3RlZF9ieV9zb29uZyksIFwKKwkgICQoZXZhbCBfcHJlYnVpbHRfbW9kdWxlX2ZpbGUgOj0gJChjYWxsIHdvcmQtY29sb24sMSwkZikpIFwKKwkgICQoZXZhbCBfZGlzdF9maWxlIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDIsJGYpKSBcCisJICAkKGV2YWwgX2Rpc3RfZmlsZSA6PSAkKHBhdHN1YnN0IGRhdGEvd2luZG93cy8lLGRhdGEvd2luL2xpYjY0LyUsJChwYXRzdWJzdCBsYXlvdXRsaWJfbmF0aXZlLyUsZGF0YS8lLCQoX2Rpc3RfZmlsZSkpKSkgXAorCSAgJChldmFsIF9kaXN0X2ZpbGUgOj0gJChzdWJzdCBsYXlvdXRsaWIuamFyLGRhdGEvbGF5b3V0bGliLmphciwkKF9kaXN0X2ZpbGUpKSkgXAorCSAgJChldmFsIF9tb2R1bGVfbmFtZSA6PSAkKHN0cmlwICQoZm9yZWFjaCBtLCQoQUxMX01PRFVMRVMpLCQoaWYgJChmaWx0ZXIgJChfcHJlYnVpbHRfbW9kdWxlX2ZpbGUpLCQoQUxMX01PRFVMRVMuJG0uQ0hFQ0tFRCkpLCRtKSkpKSBcCisJICAkKGV2YWwgX21vZHVsZV9wYXRoIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLlBBVEgpKSkpIFwKKwkgICQoZXZhbCBfc29vbmdfbW9kdWxlX3R5cGUgOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuU09PTkdfTU9EVUxFX1RZUEUpKSkpIFwKKwkgIGVjaG8gJChwYXRzdWJzdCBsYXlvdXRsaWJfbmF0aXZlLyUsJSwkKF9kaXN0X2ZpbGUpKSwkKF9tb2R1bGVfcGF0aCksJChfc29vbmdfbW9kdWxlX3R5cGUpLCwsLCwkKF9wcmVidWlsdF9tb2R1bGVfZmlsZSksLCwgPj4gJEA7IFwKKwkpCisKKwkkKGZvcmVhY2ggZiwkKExBWU9VVExJQl9SRVNfRklMRVMpLCBcCisJICAkKGV2YWwgX3BhdGggOj0gJChzdWJzdCBmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMsZGF0YSwkZikpIFwKKwkgIGVjaG8gJChfcGF0aCksLCwsLCxZLCRmLCwsID4+ICRAOyBcCisJKQorCisuUEhPTlk6IGxheW91dGxpYi1zYm9tCitsYXlvdXRsaWItc2JvbTogJChMQVlPVVRMSUJfU0JPTSkvbGF5b3V0bGliLnNwZHguanNvbgorJChMQVlPVVRMSUJfU0JPTSkvbGF5b3V0bGliLnNwZHguanNvbjogJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0ICQoR0VOX1NCT00pICQoTEFZT1VUTElCX1NCT00pL3Nib20tbWV0YWRhdGEuY3N2ICQoX2xheW91dGxpYl9mb250X2NvbmZpZ19maWxlcykgJChfbGF5b3V0bGliX2ZvbnRzX2ZpbGVzKSAkKExBWU9VVExJQl9CVUlMRF9QUk9QKS9sYXlvdXRsaWItYnVpbGQucHJvcCAkKF9sYXlvdXRsaWJfa2V5Ym9hcmRfZmlsZXMpICQoTEFZT1VUTElCX1JFU19GSUxFUykKKwlybSAtcmYgJEAKKwkkKEdFTl9TQk9NKSAtLW91dHB1dF9maWxlICRAIC0tbWV0YWRhdGEgJChMQVlPVVRMSUJfU0JPTSkvc2JvbS1tZXRhZGF0YS5jc3YgLS1idWlsZF92ZXJzaW9uICQoQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFKSAtLXByb2R1Y3RfbWZyICIkKFBST0RVQ1RfTUFOVUZBQ1RVUkVSKSIgLS1tb2R1bGVfbmFtZSAibGF5b3V0bGliIiAtLWpzb24KKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLGxheW91dGxpYiwkKExBWU9VVExJQl9TQk9NKS9sYXlvdXRsaWIuc3BkeC5qc29uOmxheW91dGxpYl9uYXRpdmUvc2JvbS9sYXlvdXRsaWIuc3BkeC5qc29uKQorCisjIEdlbmVyYXRlIFNCT00gb2YgZnJhbWV3b3JrX3Jlcy5qYXIgdGhhdCBpcyBjcmVhdGVkIGluIHJlbGVhc2VfbGF5b3V0bGliLnNoLgorIyBUaGUgZ2VuZXJhdGVkIFNCT00gY29udGFpbnMgcGxhY2Vob2xkZXJzIGZvciByZWxlYXNlX2xheW90bGliLnNoIHRvIHN1YnN0aXR1dGUsIGFuZCB0aGUgcGxhY2Vob2xkZXJzIGluY2x1ZGU6CisjIGRvY3VtZW50IG5hbWUsIGRvY3VtZW50IG5hbWVzcGFjZSwgZG9jdW1lbnQgY3JlYXRpb24gaW5mbywgb3JnYW5pemF0aW9uIGFuZCBTSEExIHZhbHVlIG9mIGZyYW1ld29ya19yZXMuamFyLgorR0VOX1NCT01fRlJBTUVXT1JLX1JFUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9nZW5lcmF0ZS1zYm9tLWZyYW1ld29ya19yZXMKKy5QSE9OWTogbGF5b3V0bGliLWZyYW1ld29ya19yZXMtc2JvbQorbGF5b3V0bGliLWZyYW1ld29ya19yZXMtc2JvbTogJChMQVlPVVRMSUJfU0JPTSkvZnJhbWV3b3JrX3Jlcy5qYXIuc3BkeC5qc29uCiskKExBWU9VVExJQl9TQk9NKS9mcmFtZXdvcmtfcmVzLmphci5zcGR4Lmpzb246ICQoTEFZT1VUTElCX1NCT00pL2xheW91dGxpYi5zcGR4Lmpzb24gJChHRU5fU0JPTV9GUkFNRVdPUktfUkVTKQorCXJtIC1yZiAkQAorCSQoR0VOX1NCT01fRlJBTUVXT1JLX1JFUykgLS1vdXRwdXRfZmlsZSAkKExBWU9VVExJQl9TQk9NKS9mcmFtZXdvcmtfcmVzLmphci5zcGR4Lmpzb24gLS1sYXlvdXRsaWJfc2JvbSAkKExBWU9VVExJQl9TQk9NKS9sYXlvdXRsaWIuc3BkeC5qc29uCisKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxsYXlvdXRsaWIsJChMQVlPVVRMSUJfU0JPTSkvZnJhbWV3b3JrX3Jlcy5qYXIuc3BkeC5qc29uOmxheW91dGxpYl9uYXRpdmUvc2JvbS9mcmFtZXdvcmtfcmVzLmphci5zcGR4Lmpzb24pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9sYXlvdXRsaWJfZm9udHMubWsgYi9jb3JlL2xheW91dGxpYl9mb250cy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhODE0Zi4uMDAwMDAwMAotLS0gYS9jb3JlL2xheW91dGxpYl9mb250cy5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgRm9udHMgZm9yIGxheW91dGxpYgotCi1GT05UX1RFTVAgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZm9udHMsSE9TVCxDT01NT04pCi0KLSMgVGhlIGZvbnQgY29uZmlndXJhdGlvbiBmaWxlcyAtIHN5c3RlbV9mb250cy54bWwsIGZhbGxiYWNrX2ZvbnRzLnhtbCBldGMuCi1mb250X2NvbmZpZyA6PSAkKHNvcnQgJCh3aWxkY2FyZCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy8qLnhtbCkpCi1mb250X2NvbmZpZyA6PSAkKGFkZHByZWZpeCAkKEZPTlRfVEVNUCkvLCAkKG5vdGRpciAkKGZvbnRfY29uZmlnKSkpCi0KLSQoZm9udF9jb25maWcpOiAkKEZPTlRfVEVNUCkvJS54bWw6IFwKLQkJCWZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzLyUueG1sCi0JJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpIGNwIC12ZiAkPCAkQAotCi0jIExpc3Qgb2YgZm9udHMgb24gdGhlIGRldmljZSB0aGF0IHdlIHdhbnQgdG8gc2hpcC4gVGhpcyBpcyBhbGwgLnR0ZiwgLnR0YyBhbmQgLm90ZiBmb250cy4KLWZvbnRzX2RldmljZSA6PSAkKGZpbHRlciAkKFRBUkdFVF9PVVQpL2ZvbnRzLyUudHRmICQoVEFSR0VUX09VVCkvZm9udHMvJS50dGMgJChUQVJHRVRfT1VUKS9mb250cy8lLm90ZiwgJChJTlRFUk5BTF9TWVNURU1JTUFHRV9GSUxFUykpCi1mb250c19kZXZpY2UgOj0gJChhZGRwcmVmaXggJChGT05UX1RFTVApLywgJChub3RkaXIgJChmb250c19kZXZpY2UpKSkKLQotIyBUT0RPOiBJZiB0aGUgZm9udCBmaWxlIGlzIGEgc3ltbGluaywgcmV1c2UgdGhlIGZvbnQgcmVuYW1lZCBmcm9tIHRoZSBzeW1saW5rCi0jIHRhcmdldC4KLSQoZm9udHNfZGV2aWNlKTogJChGT05UX1RFTVApLyU6ICQoVEFSR0VUX09VVCkvZm9udHMvJQotCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0JJChoaWRlKSBjcCAtdmYgJDwgJEAKLQotIyBMaXN0IG9mIGFsbCBkZXBlbmRlbmNpZXMgLSBhbGwgZm9udHMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi1GT05UX0ZJTEVTIDo9ICQoZm9udHNfZGV2aWNlKSAkKGZvbnRfY29uZmlnKQotCi0uUEhPTlk6IGxheW91dGxpYiBsYXlvdXRsaWItdGVzdHMKLWxheW91dGxpYiBsYXlvdXRsaWItdGVzdHM6ICQoRk9OVF9GSUxFUykKLQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBsYXlvdXRsaWIsICQoZm9yZWFjaCBtLCQoRk9OVF9GSUxFUyksICQobSk6bGF5b3V0bGliX25hdGl2ZS9mb250cy8kKG5vdGRpciAkKG0pKSkpCi0KLUZPTlRfVEVNUCA6PQotZm9udF9jb25maWcgOj0KLWZvbnRzX2RldmljZSA6PQotRk9OVF9GSUxFUyA6PQpkaWZmIC0tZ2l0IGEvY29yZS9sb2NhbF9jdXJyZW50X3Nkay5tayBiL2NvcmUvbG9jYWxfY3VycmVudF9zZGsubWsKaW5kZXggZWE3ZGE4YS4uY2NkYmY3NyAxMDA2NDQKLS0tIGEvY29yZS9sb2NhbF9jdXJyZW50X3Nkay5taworKysgYi9jb3JlL2xvY2FsX2N1cnJlbnRfc2RrLm1rCkBAIC0xNCwxMyArMTQsMjQgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiBpZmRlZiBCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMKLSAgaWZuZXEgKGN1cnJlbnQsJChCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMpKQorICBfb3ZlcnJpZGVfdG8gOj0gJChCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMpCisKKyAgIyBiLzMxNDAxMTA3NTogYXBrcyBhbmQgamFycyBpbiB0aGUgdmVuZG9yIG9yIG9kbSBwYXJ0aXRpb25zIGNhbm5vdCB1c2UKKyAgIyBzeXN0ZW0gU0RLIDM1IGFuZCBiZXlvbmQuIEluIG9yZGVyIG5vdCB0byBzdWRkZW5seSBicmVhayB0aG9zZSB2ZW5kb3IKKyAgIyBtb2R1bGVzIHVzaW5nIGN1cnJlbnQgb3Igc3lzdGVtX2N1cnJlbnQgYXMgdGhlaXIgTE9DQUxfU0RLX1ZFUlNJT04sCisgICMgb3ZlcnJpZGUgaXQgdG8gMzQsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIEFQSSBsZXZlbCBhbGxvd2VkIGZvciB0aGVtLgorICBpZm5lcSAoLCQoZmlsdGVyIEpBVkFfTElCUkFSSUVTIEFQUFMsJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSkKKyAgICBfb3ZlcnJpZGVfdG8gOj0gMzQKKyAgZW5kaWYKKworICBpZm5lcSAoY3VycmVudCwkKF9vdmVycmlkZV90bykpCiAgICAgaWZuZXEgKCwkKGZpbHRlciB0cnVlLCQoTE9DQUxfVkVORE9SX01PRFVMRSkgJChMT0NBTF9PRE1fTU9EVUxFKSAkKExPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSkpKQogICAgICAgaWZlcSAoY3VycmVudCwkKExPQ0FMX1NES19WRVJTSU9OKSkKLSAgICAgICAgTE9DQUxfU0RLX1ZFUlNJT04gOj0gJChCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMpCisgICAgICAgIExPQ0FMX1NES19WRVJTSU9OIDo9ICQoX292ZXJyaWRlX3RvKQogICAgICAgZWxzZSBpZmVxIChzeXN0ZW1fY3VycmVudCwkKExPQ0FMX1NES19WRVJTSU9OKSkKLSAgICAgICAgTE9DQUxfU0RLX1ZFUlNJT04gOj0gc3lzdGVtXyQoQk9BUkRfQ1VSUkVOVF9BUElfTEVWRUxfRk9SX1ZFTkRPUl9NT0RVTEVTKQorICAgICAgICBMT0NBTF9TREtfVkVSU0lPTiA6PSBzeXN0ZW1fJChfb3ZlcnJpZGVfdG8pCiAgICAgICBlbmRpZgogICAgIGVuZGlmCiAgIGVuZGlmCisgIF9vdmVycmlkZV90byA6PQogZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbG9jYWxfc3lzdGVtc2RrLm1rIGIvY29yZS9sb2NhbF9zeXN0ZW1zZGsubWsKaW5kZXggNDYwMDczZC4uMzMwN2U3MiAxMDA2NDQKLS0tIGEvY29yZS9sb2NhbF9zeXN0ZW1zZGsubWsKKysrIGIvY29yZS9sb2NhbF9zeXN0ZW1zZGsubWsKQEAgLTMzLDYgKzMzLDkgQEAKICAgICAgICAgICAjIFJ1bnRpbWUgcmVzb3VyY2Ugb3ZlcmxheXMgYXJlIGV4ZW1wdGVkIGZyb20gYnVpbGRpbmcgYWdhaW5zdCBTeXN0ZW0gU0RLLgogICAgICAgICAgICMgVE9ETyhiLzE1NTAyNzAxOSk6IHJlbW92ZSB0aGlzLCBhZnRlciBubyBwcm9kdWN0L3ZlbmRvciBhcHBzIHJlbHkgb24gdGhpcyBiZWhhdmlvci4KICAgICAgICAgICBMT0NBTF9TREtfVkVSU0lPTiA6PSBzeXN0ZW1fY3VycmVudAorICAgICAgICAgICMgV2UgaGF2ZSBydW4gYmVsb3cgYWdhaW4gc2luY2UgTE9DQUxfU0RLX1ZFUlNJT04gaXMgbmV3bHkgc2V0IGFuZCB0aGUgIl9jdXJyZW50IgorICAgICAgICAgICMgbWF5IGhhdmUgdG8gYmUgdXBkYXRlZAorICAgICAgICAgIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xvY2FsX2N1cnJlbnRfc2RrLm1rCiAgICAgICAgIGVuZGlmCiAgICAgICBlbmRpZgogICAgIGVuZGlmCkBAIC01NCwxMCArNTcsMzUgQEAKICAgICAjIElmIG5vdCwgdmVuZG9yIGFwa3MgYXJlIHRyZWF0ZWQgZXF1YWxseSB0byBzeXN0ZW0gYXBwcwogICAgIF9zdXBwb3J0ZWRfc3lzdGVtc2RrX3ZlcnNpb25zIDo9ICQoUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TKQogICBlbmRpZgorCisgICMgYi8zMTQwMTEwNzU6IGFwa3MgYW5kIGphcnMgaW4gdGhlIHZlbmRvciBvciBvZG0gcGFydGl0aW9ucyBjYW5ub3QgdXNlIHN5c3RlbSBTREsgMzUgYW5kIGJleW9uZC4KKyAgIyBUaGlzIGlzIHRvIGRpc2NvdXJhZ2UgdGhlIHVzZSBvZiBKYXZhIEFQSXMgaW4gdGhlIHBhcnRpdGlvbnMsIHdoaWNoIGhhc24ndCBiZWVuIHN1cHBvcnRlZCBzaW5jZQorICAjIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2plY3QgVHJlYmxlIGJhY2sgaW4gQW5kcm9pZCAxMC4gVWx0aW1hdGVseSwgd2UnZCBsaWtlIHRvIGNvbXBsZXRlbHkKKyAgIyBkaXNhbGxvdyBhbnkgSmF2YSBBUEkgaW4gdGhlIHBhcnRpdGlvbnMsIGJ1dCBpdCBzaGFsbCBiZSBkb25lIHByb2dyZXNzaXZlbHkuCisgIGlmbmVxICgsJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX1ZFTkRPUl9NT0RVTEUpICQoTE9DQUxfT0RNX01PRFVMRSkgJChMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUpKSkKKyAgICAjIDI4IGlzIHRoZSBBUEkgbGV2ZWwgd2hlbiBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMgd2FzIGludHJvZHVjZWQuIFNvLCBpdCdzIHRoZSBvbGRzZXQgQVBJCisgICAgIyB3ZSBhbGxvdy4KKyAgICBfc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucyA6PSAkKGNhbGwgaW50X3JhbmdlX2xpc3QsIDI4LCAzNCkKKyAgZW5kaWYKKworICAjIEV4dHJhY3QgdmVyc2lvbiBudW1iZXIgZnJvbSBMT0NBTF9TREtfVkVSU0lPTiAoZXg6IHN5c3RlbV8zNCAtPiAzNCkKICAgX3N5c3RlbV9zZGtfdmVyc2lvbiA6PSAkKGNhbGwgZ2V0LW51bWVyaWMtc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpCisgICMgSG93ZXZlciwgdGhlIGV4dHJhY3Rpb24gbWF5IGZhaWwgaWYgaXQgZG9lc24ndCBoYXZlIGFueSBudW1iZXIgKGkuZS4gY3VycmVudCwgY29yZV9jdXJyZW50LAorICAjIHN5c3RlbV9jdXJyZW50LCBvciBzaW1pbGFyKSBUaGVuIHVzZSB0aGUgbGF0ZXN0IHBsYXRmb3JtIFNESyB2ZXJzaW9uIG51bWJlciBvciB0aGUgYWN0dWFsCisgICMgY29kZW5hbWUuCisgIGlmZXEgKCwkKF9zeXN0ZW1fc2RrX3ZlcnNpb24pCisgICAgaWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCisgICAgICBfc3lzdGVtX3Nka192ZXJzaW9uIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCisgICAgZWxzZQorICAgICAgX3N5c3RlbV9zZGtfdmVyc2lvbiA6PSAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpCisgICAgZW5kaWYKKyAgZW5kaWYKKwogICBpZm5lcSAoJChfc3lzdGVtX3Nka192ZXJzaW9uKSwkKGZpbHRlciAkKF9zeXN0ZW1fc2RrX3ZlcnNpb24pLCQoX3N1cHBvcnRlZF9zeXN0ZW1zZGtfdmVyc2lvbnMpKSkKLSAgICAkKGNhbGwgcHJldHR5LWVycm9yLEluY29tcGF0aWJsZSBMT0NBTF9TREtfVkVSU0lPTiAnJChMT0NBTF9TREtfVkVSU0lPTiknLiBcCi0gICAgICAgICAgIFN5c3RlbSBTREsgdmVyc2lvbiAnJChfc3lzdGVtX3Nka192ZXJzaW9uKScgaXMgbm90IHN1cHBvcnRlZC4gU3VwcG9ydGVkIHZlcnNpb25zIGFyZTogJChfc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucykpCisgICAgaWZuZXEgKHRydWUsJChCVUlMRF9CUk9LRU5fRE9OVF9DSEVDS19TWVNURU1TREspCisgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLEluY29tcGF0aWJsZSBMT0NBTF9TREtfVkVSU0lPTiAnJChMT0NBTF9TREtfVkVSU0lPTiknLiBcCisgICAgICAgICAgICAgU3lzdGVtIFNESyB2ZXJzaW9uICckKF9zeXN0ZW1fc2RrX3ZlcnNpb24pJyBpcyBub3Qgc3VwcG9ydGVkLiBTdXBwb3J0ZWQgdmVyc2lvbnMgYXJlOiAkKF9zdXBwb3J0ZWRfc3lzdGVtc2RrX3ZlcnNpb25zKSkKKyAgICBlbmRpZgogICBlbmRpZgogICBfc3lzdGVtX3Nka192ZXJzaW9uIDo9CiAgIF9zdXBwb3J0ZWRfc3lzdGVtc2RrX3ZlcnNpb25zIDo9CmRpZmYgLS1naXQgYS9jb3JlL2xvY2FsX3ZlbmRvcl9wcm9kdWN0Lm1rIGIvY29yZS9sb2NhbF92ZW5kb3JfcHJvZHVjdC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTk4MmNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sb2NhbF92ZW5kb3JfcHJvZHVjdC5tawpAQCAtMCwwICsxLDIyIEBACisjIExPQ0FMX1VTRV9WTkRLIGlzIG5vdCB0aGUgdmFyaWFibGUgd2hpY2ggc2V0IGJ5IG1vZHVsZSBkaXJlY3RseSwgYnV0IHRoZXJlIGFyZSBzb21lIG1vZHVsZXMgZG8gc28uCisjIFNldCB0aG9zZSBhcyBMT0NBTF9JTl9WRU5ET1IgdG8gbWFrZSB0aG9zZSBtb2R1bGVzIHdvcmsgYXMgZXhwZWN0ZWQuCitpZmVxICh0cnVlLCQoTE9DQUxfVVNFX1ZOREspKQorICAkKHdhcm5pbmcgTE9DQUxfVVNFX1ZOREsgbXVzdCBub3QgYmUgdXNlZC4gUGxlYXNlIHVzZSBMT0NBTF9WRU5ET1JfTU9EVUxFIG9yIExPQ0FMX1BST0RVQ1RfTU9EVUxFIGluc3RlYWQuKQorICBMT0NBTF9JTl9WRU5ET1I6PXRydWUKK2VuZGlmCisKKyMgU2V0IExPQ0FMX0lOX1ZFTkRPUiBmb3IgbW9kdWxlcyBnb2luZyBpbnRvIHZlbmRvciBvciBvZG0gcGFydGl0aW9uIGFuZCBMT0NBTF9JTl9QUk9EVUNUIGZvciBwcm9kdWN0CisjIGV4Y2VwdCBmb3IgaG9zdCBtb2R1bGVzLiBJZiBMT0NBTF9TREtfVkVSU0lPTiBpcyBzZXQsIHRoYXRzIGEgbW9yZSByZXN0cmljdGl2ZSBzZXQsIHNvIHRoZXkgZG9uJ3QgbmVlZAorIyBMT0NBTF9JTl9WRU5ET1Igb3IgTE9DQUxfSU5fUFJPRFVDVAoraWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCitpZm5kZWYgTE9DQUxfU0RLX1ZFUlNJT04KKyAgaWZuZXEgKCwkKGZpbHRlciB0cnVlLCQoTE9DQUxfVkVORE9SX01PRFVMRSkgJChMT0NBTF9PRE1fTU9EVUxFKSAkKExPQ0FMX09FTV9NT0RVTEUpICQoTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFKSkpCisgICAgTE9DQUxfSU5fVkVORE9SOj10cnVlCisgICAgIyBOb3RlOiBubyBuZWVkIHRvIGNoZWNrIExPQ0FMX01PRFVMRV9QQVRIKiBzaW5jZSBMT0NBTF9bVkVORE9SfE9ETXxPRU1dX01PRFVMRSBpcyBhbHJlYWR5CisgICAgIyBzZXQgY29ycmVjdGx5IGJlZm9yZSB0aGlzIGlzIGluY2x1ZGVkLgorICBlbmRpZgorICBpZmVxICh0cnVlLCQoTE9DQUxfUFJPRFVDVF9NT0RVTEUpKQorICAgIExPQ0FMX0lOX1BST0RVQ1Q6PXRydWUKKyAgZW5kaWYKK2VuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9sb2NhbF92bmRrLm1rIGIvY29yZS9sb2NhbF92bmRrLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWZiYzU5Li4wMDAwMDAwCi0tLSBhL2NvcmUvbG9jYWxfdm5kay5taworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLQotI1NldCBMT0NBTF9VU0VfVk5ESyBmb3IgbW9kdWxlcyBnb2luZyBpbnRvIHByb2R1Y3QsIHZlbmRvciBvciBvZG0gcGFydGl0aW9uLCBleGNlcHQgZm9yIGhvc3QgbW9kdWxlcwotI0lmIExPQ0FMX1NES19WRVJTSU9OIGlzIHNldCwgdGhhdHMgYSBtb3JlIHJlc3RyaWN0aXZlIHNldCwgc28gdGhleSBkb250IG5lZWQgTE9DQUxfVVNFX1ZOREsKLWlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotaWZuZGVmIExPQ0FMX1NES19WRVJTSU9OCi0gIGlmbmVxICgsJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX1ZFTkRPUl9NT0RVTEUpICQoTE9DQUxfT0RNX01PRFVMRSkgJChMT0NBTF9PRU1fTU9EVUxFKSAkKExPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSkpKQotICAgIExPQ0FMX1VTRV9WTkRLOj10cnVlCi0gICAgTE9DQUxfVVNFX1ZOREtfVkVORE9SOj10cnVlCi0gICAgIyBOb3RlOiBubyBuZWVkIHRvIGNoZWNrIExPQ0FMX01PRFVMRV9QQVRIKiBzaW5jZSBMT0NBTF9bVkVORE9SfE9ETXxPRU1dX01PRFVMRSBpcyBhbHJlYWR5Ci0gICAgIyBzZXQgY29ycmVjdGx5IGJlZm9yZSB0aGlzIGlzIGluY2x1ZGVkLgotICBlbmRpZgotICBpZmRlZiBQUk9EVUNUX1BST0RVQ1RfVk5ES19WRVJTSU9OCi0gICAgIyBQcm9kdWN0IG1vZHVsZXMgYWxzbyB1c2UgVk5ESyB3aGVuIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04gaXMgZGVmaW5lZC4KLSAgICBpZmVxICh0cnVlLCQoTE9DQUxfUFJPRFVDVF9NT0RVTEUpKQotICAgICAgTE9DQUxfVVNFX1ZOREs6PXRydWUKLSAgICAgIExPQ0FMX1VTRV9WTkRLX1BST0RVQ1Q6PXRydWUKLSAgICBlbmRpZgotICBlbmRpZgotZW5kaWYKLWVuZGlmCi0KLSMgVmVyaWZ5IExPQ0FMX1VTRV9WTkRLIHVzYWdlLCBhbmQgc2V0IExPQ0FMX1NES19WRVJTSU9OIGlmIG5lY2Vzc2FyeQotCi1pZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotICBpZmRlZiBMT0NBTF9VU0VfVk5ESwotICAgICQoc2hlbGwgZWNobyAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6ICQoTE9DQUxfTU9EVUxFKTogRG8gbm90IHVzZSBMT0NBTF9VU0VfVk5ESyB3aXRoIGhvc3QgbW9kdWxlcyA+JjIpCi0gICAgJChlcnJvciBkb25lKQotICBlbmRpZgotZW5kaWYKLWlmZGVmIExPQ0FMX1VTRV9WTkRLCi0gIGlmbmVxICgkKExPQ0FMX1VTRV9WTkRLKSx0cnVlKQotICAgICQoc2hlbGwgZWNobyAnJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpOiAkKExPQ0FMX01PRFVMRSk6IExPQ0FMX1VTRV9WTkRLIG11c3QgYmUgInRydWUiIG9yIGVtcHR5LCBub3QgIiQoTE9DQUxfVVNFX1ZOREspIicgPiYyKQotICAgICQoZXJyb3IgZG9uZSkKLSAgZW5kaWYKLQotICBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgotICAgICQoc2hlbGwgZWNobyAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6ICQoTE9DQUxfTU9EVUxFKTogTE9DQUxfVVNFX1ZOREsgbXVzdCBub3QgYmUgdXNlZCB3aXRoIExPQ0FMX1NES19WRVJTSU9OID4mMikKLSAgICAkKGVycm9yIGRvbmUpCi0gIGVuZGlmCi0KLSAgIyBJZiB3ZSdyZSBub3QgdXNpbmcgdGhlIFZOREssIGRyb3AgYWxsIHJlc3RyaWN0aW9ucwotICBpZm5kZWYgQk9BUkRfVk5ES19WRVJTSU9OCi0gICAgTE9DQUxfVVNFX1ZOREs6PQotICAgIExPQ0FMX1VTRV9WTkRLX1ZFTkRPUjo9Ci0gICAgTE9DQUxfVVNFX1ZOREtfUFJPRFVDVDo9Ci0gIGVuZGlmCi1lbmRpZgotCmRpZmYgLS1naXQgYS9jb3JlL21haW4ubWsgYi9jb3JlL21haW4ubWsKaW5kZXggY2I0ZGNhNi4uOGQ3Mzc5MyAxMDA2NDQKLS0tIGEvY29yZS9tYWluLm1rCisrKyBiL2NvcmUvbWFpbi5tawpAQCAtNCw3ICs0LDcgQEAKICQoZXJyb3IgZG9uZSkKIGVuZGlmCiAKLSQoaW5mbyBbMS8xXSBpbml0aWFsaXppbmcgYnVpbGQgc3lzdGVtIC4uLikKKyQoaW5mbyBbMS8xXSBpbml0aWFsaXppbmcgbGVnYWN5IE1ha2UgbW9kdWxlIHBhcnNlciAuLi4pCiAKICMgQWJzb2x1dGUgcGF0aCBvZiB0aGUgcHJlc2VudCB3b3JraW5nIGRpcmVjb3RyeS4KICMgVGhpcyBvdmVycmlkZXMgdGhlIHNoZWxsIHZhcmlhYmxlICRQV0QsIHdoaWNoIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHBvaW50cyB0bwpAQCAtNDAsMzEgKzQwLDIzIEBACiAjIFdyaXRlIHRoZSBidWlsZCBudW1iZXIgdG8gYSBmaWxlIHNvIGl0IGNhbiBiZSByZWFkIGJhY2sgaW4KICMgd2l0aG91dCBjaGFuZ2luZyB0aGUgY29tbWFuZCBsaW5lIGV2ZXJ5IHRpbWUuICBBdm9pZHMgcmVidWlsZHMKICMgd2hlbiB1c2luZyBuaW5qYS4KLSQoc2hlbGwgbWtkaXIgLXAgJChTT09OR19PVVRfRElSKSAmJiBcCi0gICAgZWNobyAtbiAkKEJVSUxEX05VTUJFUikgPiAkKFNPT05HX09VVF9ESVIpL2J1aWxkX251bWJlci50bXA7IFwKLSAgICBpZiAhIGNtcCAtcyAkKFNPT05HX09VVF9ESVIpL2J1aWxkX251bWJlci50bXAgJChTT09OR19PVVRfRElSKS9idWlsZF9udW1iZXIudHh0OyB0aGVuIFwKLSAgICAgICAgbXYgJChTT09OR19PVVRfRElSKS9idWlsZF9udW1iZXIudG1wICQoU09PTkdfT1VUX0RJUikvYnVpbGRfbnVtYmVyLnR4dDsgXAotICAgIGVsc2UgXAotICAgICAgICBybSAkKFNPT05HX09VVF9ESVIpL2J1aWxkX251bWJlci50bXA7IFwKLSAgICBmaSkKIEJVSUxEX05VTUJFUl9GSUxFIDo9ICQoU09PTkdfT1VUX0RJUikvYnVpbGRfbnVtYmVyLnR4dAotLktBVElfUkVBRE9OTFkgOj0gQlVJTERfTlVNQkVSX0ZJTEUKICQoS0FUSV9vYnNvbGV0ZV92YXIgQlVJTERfTlVNQkVSLFNlZSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9idWlsZC8rL21hc3Rlci9DaGFuZ2VzLm1kI0JVSUxEX05VTUJFUikKK0JVSUxEX0hPU1ROQU1FX0ZJTEUgOj0gJChTT09OR19PVVRfRElSKS9idWlsZF9ob3N0bmFtZS50eHQKKyQoS0FUSV9vYnNvbGV0ZV92YXIgQlVJTERfSE9TVE5BTUUsVXNlIEJVSUxEX0hPU1ROQU1FX0ZST01fRklMRSBpbnN0ZWFkKQorJChLQVRJX29ic29sZXRlX3ZhciBGSUxFX05BTUVfVEFHLGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2J1aWxkLysvbWFzdGVyL0NoYW5nZXMubWQjRklMRV9OQU1FX1RBRykKKwogJChCVUlMRF9OVU1CRVJfRklMRSk6Ci0JdG91Y2ggJEAKKwkjIGVtcHR5IHJ1bGUgdG8gcHJldmVudCBkYW5nbGluZyBydWxlIGVycm9yIGZvciBhIGZpbGUgdGhhdCBpcyB3cml0dGVuIGJ5IHNvb25nX3VpCiskKEJVSUxEX0hPU1ROQU1FX0ZJTEUpOgorCSMgZW1wdHkgcnVsZSB0byBwcmV2ZW50IGRhbmdsaW5nIHJ1bGUgZXJyb3IgZm9yIGEgZmlsZSB0aGF0IGlzIHdyaXR0ZW4gYnkgc29vbmdfdWkKKworLktBVElfUkVTVEFUOiAkKEJVSUxEX05VTUJFUl9GSUxFKQorLktBVElfUkVTVEFUOiAkKEJVSUxEX0hPU1ROQU1FX0ZJTEUpCiAKIERBVEVfRlJPTV9GSUxFIDo9IGRhdGUgLWQgQCQoQlVJTERfREFURVRJTUVfRlJPTV9GSUxFKQogLktBVElfUkVBRE9OTFkgOj0gREFURV9GUk9NX0ZJTEUKIAotIyBQaWNrIGEgcmVhc29uYWJsZSBzdHJpbmcgdG8gdXNlIHRvIGlkZW50aWZ5IGZpbGVzLgotaWZlcSAoJChzdHJpcCAkKEhBU19CVUlMRF9OVU1CRVIpKSxmYWxzZSkKLSAgIyBCVUlMRF9OVU1CRVIgaGFzIGEgdGltZXN0YW1wIGluIGl0LCB3aGljaCBtZWFucyB0aGF0Ci0gICMgaXQgd2lsbCBjaGFuZ2UgZXZlcnkgdGltZS4gIFBpY2sgYSBzdGFibGUgdmFsdWUuCi0gIEZJTEVfTkFNRV9UQUcgOj0gZW5nLiQoQlVJTERfVVNFUk5BTUUpCi1lbHNlCi0gIEZJTEVfTkFNRV9UQUcgOj0gJChmaWxlIDwkKEJVSUxEX05VTUJFUl9GSUxFKSkKLWVuZGlmCi0uS0FUSV9SRUFET05MWSA6PSBGSUxFX05BTUVfVEFHCiAKICMgTWFrZSBhbiBlbXB0eSBkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1ha2UgZW1wdHkgamFycwogRU1QVFlfRElSRUNUT1JZIDo9ICQoT1VUX0RJUikvZW1wdHkKQEAgLTEyMSwzNyArMTEzLDggQEAKICAgIyAkKGVycm9yIFRBUkdFVF9BUkNIX1NVSVRFIGlzIG5vdCBzdXBwb3J0ZWQgaW4ga2F0aS9tYWtlIGJ1aWxkcykKIGVuZGlmCiAKLSMgQURESVRJT05BTF88cGFydGl0aW9uPl9QUk9QRVJUSUVTIGFyZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGRldGVybWluZWQgYnkgdGhlCi0jIGJ1aWxkIHN5c3RlbSBpdHNlbGYuIERvbid0IGxldCBpdCBiZSBkZWZpbmVkIGZyb20gb3V0c2lkZSBvZiB0aGUgY29yZSBidWlsZAotIyBzeXN0ZW0gbGlrZSBBbmRyb2lkLm1rIG9yIDxwcm9kdWN0Pi5tayBmaWxlcy4KLV9hZGRpdGlvbmFsX3Byb3BfdmFyX25hbWVzIDo9IFwKLSAgICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTIFwKLSAgICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTIFwKLSAgICBBRERJVElPTkFMX09ETV9QUk9QRVJUSUVTIFwKLSAgICBBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUwotCi0kKGZvcmVhY2ggbmFtZSwgJChfYWRkaXRpb25hbF9wcm9wX3Zhcl9uYW1lcyksXAotICAkKGlmICQoJChuYW1lKSksXAotICAgICQoZXJyb3IgJChuYW1lKSBtdXN0IG5vdCBzZXQgYmVmb3JlIGhlcmUuICQoJChuYW1lKSkpXAotICAsKVwKLSAgJChldmFsICQobmFtZSkgOj0pXAotKQotX2FkZGl0aW9uYWxfcHJvcF92YXJfbmFtZXMgOj0KLQogJChLQVRJX29ic29sZXRlX3ZhciBBRERJVElPTkFMX0JVSUxEX1BST1BFUlRJRVMsIFBsZWFzZSB1c2UgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUykKIAotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBZGQgdGhlIHByb2R1Y3QtZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIHRoZSBidWlsZCBwcm9wZXJ0aWVzLgotaWZuZXEgKCQoQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQpLCB0cnVlKQotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9ICQoUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMpCi1lbHNlCi0gIGlmbmRlZiBCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFCi0gICAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSAkKFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTKQotICBlbmRpZgotZW5kaWYKLQotCiAjIEJyaW5nIGluIHN0YW5kYXJkIGJ1aWxkIHN5c3RlbSBkZWZpbml0aW9ucy4KIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2RlZmluaXRpb25zLm1rCiAKQEAgLTE4MywxNzQgKzE0Niw4IEBACiAjIFBESyBidWlsZHMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQsIHRoaXMgaXMgYWx3YXlzIHBsYXRmb3JtCiBUQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMIDo9JD0gcGxhdGZvcm0KIAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLnRyZWJsZS5lbmFibGVkPSR7UFJPRFVDVF9GVUxMX1RSRUJMRX0KLQogJChLQVRJX29ic29sZXRlX3ZhciBQUk9EVUNUX0ZVTExfVFJFQkxFLFwKLQlDb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvIHdvcmsgcmVnYXJkbGVzcyBvZiBhIGRldmljZSBiZWluZyBUcmVibGUgb3IgXAotCXZhcmlhYmxlcyBsaWtlIFBST0RVQ1RfU0VQT0xJQ1lfU1BMSVQgc2hvdWxkIGJlIHVzZWQgdW50aWwgdGhhdCBpcyBcCi0JcG9zc2libGUuKQotCi0jIFNldHMgcm8uYWN0aW9uYWJsZV9jb21wYXRpYmxlX3Byb3BlcnR5LmVuYWJsZWQgdG8ga25vdyBvbiBydW50aW1lIHdoZXRoZXIgdGhlCi0jIGFsbG93ZWQgbGlzdCBvZiBhY3Rpb25hYmxlIGNvbXBhdGlibGUgcHJvcGVydGllcyBpcyBlbmFibGVkIG9yIG5vdC4KLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uYWN0aW9uYWJsZV9jb21wYXRpYmxlX3Byb3BlcnR5LmVuYWJsZWQ9dHJ1ZQotCi0jIEFkZCB0aGUgc3lzdGVtIHNlcnZlciBjb21waWxlciBmaWx0ZXIgaWYgdGhleSBhcmUgc3BlY2lmaWVkIGZvciB0aGUgcHJvZHVjdC4KLWlmbmVxICgsJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSKSkKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IGRhbHZpay52bS5zeXN0ZW1zZXJ2ZXJjb21waWxlcmZpbHRlcj0kKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9DT01QSUxFUl9GSUxURVIpCi1lbmRpZgotCi0jIEVuYWJsZSBjb3JlIHBsYXRmb3JtIEFQSSB2aW9sYXRpb24gd2FybmluZ3Mgb24gdXNlcmRlYnVnIGFuZCBlbmcgYnVpbGRzLgotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXIpCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHBlcnNpc3QuZGVidWcuZGFsdmlrLnZtLmNvcmVfcGxhdGZvcm1fYXBpX3BvbGljeT1qdXN0LXdhcm4KLWVuZGlmCi0KLSMgRGVmaW5lIHJvLnNhbml0aXplLjxuYW1lPiBwcm9wZXJ0aWVzIGZvciBhbGwgZ2xvYmFsIHNhbml0aXplcnMuCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9ICQoZm9yZWFjaCBzLCQoU0FOSVRJWkVfVEFSR0VUKSxyby5zYW5pdGl6ZS4kKHMpPXRydWUpCi0KLSMgU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiByby5wb3N0aW5zdGFsbC5mc3RhYi5wcmVmaXggdG8gL3N5c3RlbS4KLSMgRGV2aWNlIGJvYXJkIGNvbmZpZyBzaG91bGQgb3ZlcnJpZGUgdGhlIHZhbHVlIHRvIC9wcm9kdWN0IHdoZW4gbmVlZGVkIGJ5OgotIwotIyAgICAgUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gcm8ucG9zdGluc3RhbGwuZnN0YWIucHJlZml4PS9wcm9kdWN0Ci0jCi0jIEl0IHRoZW4gdXNlcyAke3JvLnBvc3RpbnN0YWxsLmZzdGFiLnByZWZpeH0vZXRjL2ZzdGFiLnBvc3RpbnN0YWxsIHRvCi0jIG1vdW50IHN5c3RlbV9vdGhlciBwYXJ0aXRpb24uCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLnBvc3RpbnN0YWxsLmZzdGFiLnByZWZpeD0vc3lzdGVtCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyB3aWxsIGJlIGluc3RhbGxlZCBpbiB2ZW5kb3IvYnVpbGQucHJvcCBpZgotIyBwcm9wZXJ0eV9vdmVycmlkZXNfc3BsaXRfZW5hYmxlZCBpcyB0cnVlLiBPdGhlcndpc2UgaXQgd2lsbCBiZSBpbnN0YWxsZWQgaW4KLSMgL3N5c3RlbS9idWlsZC5wcm9wCi1pZmRlZiBCT0FSRF9WTkRLX1ZFUlNJT04KLSAgaWZlcSAoJChCT0FSRF9WTkRLX1ZFUlNJT04pLGN1cnJlbnQpCi0gICAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyA6PSByby52bmRrLnZlcnNpb249JChQTEFURk9STV9WTkRLX1ZFUlNJT04pCi0gIGVsc2UKLSAgICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTIDo9IHJvLnZuZGsudmVyc2lvbj0kKEJPQVJEX1ZOREtfVkVSU0lPTikKLSAgZW5kaWYKLWVuZGlmCi0KLSMgQWRkIGNwdSBwcm9wZXJ0aWVzIGZvciBiaW9uaWMgYW5kIEFSVC4KLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8uYmlvbmljLmFyY2g9JChUQVJHRVRfQVJDSCkKLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8uYmlvbmljLmNwdV92YXJpYW50PSQoVEFSR0VUX0NQVV9WQVJJQU5UX1JVTlRJTUUpCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy4ybmRfYXJjaD0kKFRBUkdFVF8yTkRfQVJDSCkKLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8uYmlvbmljLjJuZF9jcHVfdmFyaWFudD0kKFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlRfUlVOVElNRSkKLQotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBwZXJzaXN0LnN5cy5kYWx2aWsudm0ubGliLjI9bGliYXJ0LnNvCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IGRhbHZpay52bS5pc2EuJChUQVJHRVRfQVJDSCkudmFyaWFudD0kKERFWDJPQVRfVEFSR0VUX0NQVV9WQVJJQU5UX1JVTlRJTUUpCi1pZm5lcSAoJChERVgyT0FUX1RBUkdFVF9JTlNUUlVDVElPTl9TRVRfRkVBVFVSRVMpLCkKLSAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaXNhLiQoVEFSR0VUX0FSQ0gpLmZlYXR1cmVzPSQoREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKQotZW5kaWYKLQotaWZkZWYgVEFSR0VUXzJORF9BUkNICi0gIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gZGFsdmlrLnZtLmlzYS4kKFRBUkdFVF8yTkRfQVJDSCkudmFyaWFudD0kKCQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfQ1BVX1ZBUklBTlRfUlVOVElNRSkKLSAgaWZuZXEgKCQoJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClERVgyT0FUX1RBUkdFVF9JTlNUUlVDVElPTl9TRVRfRkVBVFVSRVMpLCkKLSAgICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IGRhbHZpay52bS5pc2EuJChUQVJHRVRfMk5EX0FSQ0gpLmZlYXR1cmVzPSQoJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClERVgyT0FUX1RBUkdFVF9JTlNUUlVDVElPTl9TRVRfRkVBVFVSRVMpCi0gIGVuZGlmCi1lbmRpZgotCi0jIEFsdGhvdWdoIHRoZXNlIHZhcmlhYmxlcyBhcmUgcHJlZml4ZWQgd2l0aCBUQVJHRVRfUkVDT1ZFUllfLCB0aGV5IGFyZSBhbHNvIG5lZWRlZCB1bmRlciBjaGFyZ2VyCi0jIG1vZGUgKHZpYSBsaWJtaW51aSkuCi1pZmRlZiBUQVJHRVRfUkVDT1ZFUllfREVGQVVMVF9ST1RBVElPTgotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8ubWludWkuZGVmYXVsdF9yb3RhdGlvbj0kKFRBUkdFVF9SRUNPVkVSWV9ERUZBVUxUX1JPVEFUSU9OKQotZW5kaWYKLWlmZGVmIFRBUkdFVF9SRUNPVkVSWV9PVkVSU0NBTl9QRVJDRU5UCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKLSAgICByby5taW51aS5vdmVyc2Nhbl9wZXJjZW50PSQoVEFSR0VUX1JFQ09WRVJZX09WRVJTQ0FOX1BFUkNFTlQpCi1lbmRpZgotaWZkZWYgVEFSR0VUX1JFQ09WRVJZX1BJWEVMX0ZPUk1BVAotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8ubWludWkucGl4ZWxfZm9ybWF0PSQoVEFSR0VUX1JFQ09WRVJZX1BJWEVMX0ZPUk1BVCkKLWVuZGlmCi0KLWlmZGVmIFBST0RVQ1RfVVNFX0RZTkFNSUNfUEFSVElUSU9OUwotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8uYm9vdC5keW5hbWljX3BhcnRpdGlvbnM9JChQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTlMpCi1lbmRpZgotCi1pZmRlZiBQUk9EVUNUX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OUwotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8uYm9vdC5keW5hbWljX3BhcnRpdGlvbnNfcmV0cm9maXQ9JChQUk9EVUNUX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OUykKLWVuZGlmCi0KLWlmZGVmIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKLSAgICByby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbD0kKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKQotZW5kaWYKLQotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXIpCi0gIGlmZGVmIFBST0RVQ1RfU0VUX0RFQlVHRlNfUkVTVFJJQ1RJT05TCi0gICAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgICByby5wcm9kdWN0LmRlYnVnZnNfcmVzdHJpY3Rpb25zLmVuYWJsZWQ9JChQUk9EVUNUX1NFVF9ERUJVR0ZTX1JFU1RSSUNUSU9OUykKLSAgZW5kaWYKLWVuZGlmCi0KLSMgVmVuZG9ycyB3aXRoIEdSRiBtdXN0IGRlZmluZSBCT0FSRF9TSElQUElOR19BUElfTEVWRUwgZm9yIHRoZSB2ZW5kb3IgQVBJIGxldmVsLgotIyBUaGlzIG11c3Qgbm90IGJlIGRlZmluZWQgZm9yIHRoZSBub24tR1JGIGRldmljZXMuCi1pZmRlZiBCT0FSRF9TSElQUElOR19BUElfTEVWRUwKLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbD0kKEJPQVJEX1NISVBQSU5HX0FQSV9MRVZFTCkKLQotIyBUbyBtYW51YWxseSBzZXQgdGhlIHZlbmRvciBBUEkgbGV2ZWwgb2YgdGhlIHZlbmRvciBtb2R1bGVzLCBCT0FSRF9BUElfTEVWRUwgY2FuIGJlIHVzZWQuCi0jIFRoZSB2YWx1ZXMgb2YgdGhlIEdSRiBwcm9wZXJ0aWVzIHdpbGwgYmUgdmVyaWZpZWQgYnkgcG9zdF9wcm9jZXNzX3Byb3BzLnB5Ci1pZmRlZiBCT0FSRF9BUElfTEVWRUwKLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLmJvYXJkLmFwaV9sZXZlbD0kKEJPQVJEX0FQSV9MRVZFTCkKLWVuZGlmCi1lbmRpZgotCi0jIFNldCBidWlsZCBwcm9wLiBUaGlzIHByb3AgaXMgcmVhZCBieSBvdGFfZnJvbV90YXJnZXRfZmlsZXMgd2hlbiBnZW5lcmF0aW5nIE9UQSwKLSMgdG8gZGVjaWRlIGlmIFZBQkMgc2hvdWxkIGJlIGRpc2FibGVkLgotaWZlcSAoJChCT0FSRF9ET05UX1VTRV9WQUJDX09UQSksdHJ1ZSkKLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLnZlbmRvci5idWlsZC5kb250X3VzZV92YWJjPXRydWUKLWVuZGlmCi0KLSMgU2V0IHRoZSBmbGFnIGluIHZlbmRvci4gU28gVlRTIHdvdWxkIGtub3cgaWYgdGhlIG5ldyBmaW5nZXJwcmludCBmb3JtYXQgaXMgaW4gdXNlIHdoZW4KLSMgdGhlIHN5c3RlbSBpbWFnZXMgYXJlIHJlcGxhY2VkIGJ5IEdTSS4KLWlmZXEgKCQoQk9BUkRfVVNFX1ZCTUVUQV9ESUdURVNUX0lOX0ZJTkdFUlBSSU5UKSx0cnVlKQotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50X2hhc19kaWdlc3Q9MQotZW5kaWYKLQotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8udmVuZG9yLmJ1aWxkLnNlY3VyaXR5X3BhdGNoPSQoVkVORE9SX1NFQ1VSSVRZX1BBVENIKSBcCi0gICAgcm8ucHJvZHVjdC5ib2FyZD0kKFRBUkdFVF9CT09UTE9BREVSX0JPQVJEX05BTUUpIFwKLSAgICByby5ib2FyZC5wbGF0Zm9ybT0kKFRBUkdFVF9CT0FSRF9QTEFURk9STSkgXAotICAgIHJvLmh3dWkudXNlX3Z1bGthbj0kKFRBUkdFVF9VU0VTX1ZVTEtBTikKLQotaWZkZWYgVEFSR0VUX1NDUkVFTl9ERU5TSVRZCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKLSAgICByby5zZi5sY2RfZGVuc2l0eT0kKFRBUkdFVF9TQ1JFRU5fREVOU0lUWSkKLWVuZGlmCi0KLWlmZGVmIEFCX09UQV9VUERBVEVSCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKLSAgICByby5idWlsZC5hYl91cGRhdGU9JChBQl9PVEFfVVBEQVRFUikKLWVuZGlmCi0KLSMgU2V0IHJvLnByb2R1Y3Qudm5kay52ZXJzaW9uIHRvIGtub3cgdGhlIFZOREsgdmVyc2lvbiByZXF1aXJlZCBieSBwcm9kdWN0Ci0jIG1vZHVsZXMuIEl0IHVzZXMgdGhlIHZlcnNpb24gaW4gUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTi4gSWYgdGhlIHZhbHVlCi0jIGlzICJjdXJyZW50IiwgdXNlIFBMQVRGT1JNX1ZOREtfVkVSU0lPTi4KLWlmZGVmIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04KLWlmZXEgKCQoUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTiksY3VycmVudCkKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3Qudm5kay52ZXJzaW9uPSQoUExBVEZPUk1fVk5ES19WRVJTSU9OKQotZWxzZQotQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gcm8ucHJvZHVjdC52bmRrLnZlcnNpb249JChQUk9EVUNUX1BST0RVQ1RfVk5ES19WRVJTSU9OKQotZW5kaWYKLWVuZGlmCi0KLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLmJ1aWxkLmNoYXJhY3RlcmlzdGljcz0kKFRBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUykKLQotaWZlcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3QuYWJfb3RhX3BhcnRpdGlvbnM9JChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKHNvcnQgJChBQl9PVEFfUEFSVElUSU9OUykpKQotZW5kaWYKLQotIyBTZXQgdGhpcyBwcm9wZXJ0eSBmb3IgVlRTIHRvIHNraXAgbGFyZ2UgcGFnZSBzaXplIHRlc3RzIG9uIHVuc3VwcG9ydGVkIGRldmljZXMuCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSBcCi0gICAgcm8ucHJvZHVjdC5jcHUucGFnZXNpemUubWF4PSQoVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEKQotCisJQ29kZSBzaG91bGQgYmUgd3JpdHRlbiB0byB3b3JrIHJlZ2FyZGxlc3Mgb2YgYSBkZXZpY2UgYmVpbmcgVHJlYmxlKQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyMjCiAjIyMgSW4gdGhpcyBzZWN0aW9uIHdlIHNldCB1cCB0aGUgdGhpbmdzIHRoYXQgYXJlIGRpZmZlcmVudApAQCAtMzYzLDY0ICsxNjAsMTUgQEAKIGlzX3Nka19idWlsZCA6PSB0cnVlCiBlbmRpZgogCi0jIyB1c2VyL3VzZXJkZWJ1ZyAjIwotCi11c2VyX3ZhcmlhbnQgOj0gJChmaWx0ZXIgdXNlciB1c2VyZGVidWcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpCi1lbmFibGVfdGFyZ2V0X2RlYnVnZ2luZyA6PSB0cnVlCiB0YWdzX3RvX2luc3RhbGwgOj0KLWlmbmVxICgsJCh1c2VyX3ZhcmlhbnQpKQotICAjIFRhcmdldCBpcyBzZWN1cmUgaW4gdXNlciBidWlsZHMuCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uc2VjdXJlPTEKLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBzZWN1cml0eS5wZXJmX2hhcmRlbj0xCiAKLSAgaWZlcSAoJCh1c2VyX3ZhcmlhbnQpLHVzZXIpCi0gICAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5hZGIuc2VjdXJlPTEKLSAgZW5kaWYKLQotICBpZmVxICgkKHVzZXJfdmFyaWFudCksdXNlcmRlYnVnKQotICAgICMgUGljayB1cCBzb21lIGV4dHJhIHVzZWZ1bCB0b29scwotICAgIHRhZ3NfdG9faW5zdGFsbCArPSBkZWJ1ZwotICBlbHNlCi0gICAgIyBEaXNhYmxlIGRlYnVnZ2luZyBpbiBwbGFpbiB1c2VyIGJ1aWxkcy4KLSAgICBlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZyA6PQotICBlbmRpZgotCi0gICMgRGlzYWxsb3cgbW9jayBsb2NhdGlvbnMgYnkgZGVmYXVsdCBmb3IgdXNlciBidWlsZHMKLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5hbGxvdy5tb2NrLmxvY2F0aW9uPTAKLQotZWxzZSAjICF1c2VyX3ZhcmlhbnQKLSAgIyBUdXJuIG9uIGNoZWNram5pIGZvciBub24tdXNlciBidWlsZHMuCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8ua2VybmVsLmFuZHJvaWQuY2hlY2tqbmk9MQotICAjIFNldCBkZXZpY2UgaW5zZWN1cmUgZm9yIG5vbi11c2VyIGJ1aWxkcy4KLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5zZWN1cmU9MAotICAjIEFsbG93IG1vY2sgbG9jYXRpb25zIGJ5IGRlZmF1bHQgZm9yIG5vbiB1c2VyIGJ1aWxkcwotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmFsbG93Lm1vY2subG9jYXRpb249MQotZW5kaWYgIyAhdXNlcl92YXJpYW50Ci0KLWlmZXEgKHRydWUsJChzdHJpcCAkKGVuYWJsZV90YXJnZXRfZGVidWdnaW5nKSkpCi0gICMgVGFyZ2V0IGlzIG1vcmUgZGVidWdnYWJsZSBhbmQgYWRiZCBpcyBvbiBieSBkZWZhdWx0Ci0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uZGVidWdnYWJsZT0xCi0gICMgRW5hYmxlIERhbHZpayBsb2NrIGNvbnRlbnRpb24gbG9nZ2luZy4KLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBkYWx2aWsudm0ubG9ja3Byb2YudGhyZXNob2xkPTUwMAotZWxzZSAjICFlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZwotICAjIFRhcmdldCBpcyBsZXNzIGRlYnVnZ2FibGUgYW5kIGFkYmQgaXMgb2ZmIGJ5IGRlZmF1bHQKLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5kZWJ1Z2dhYmxlPTAKLWVuZGlmICMgIWVuYWJsZV90YXJnZXRfZGVidWdnaW5nCi0KLSMjIGVuZyAjIworaWZlcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksdXNlcmRlYnVnKQorIyBQaWNrIHVwIHNvbWUgZXh0cmEgdXNlZnVsIHRvb2xzCit0YWdzX3RvX2luc3RhbGwgOj0gZGVidWcKK2VuZGlmCiAKIGlmZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLGVuZykKIHRhZ3NfdG9faW5zdGFsbCA6PSBkZWJ1ZyBlbmcKLWlmbmVxICgkKGZpbHRlciByby5zZXR1cHdpemFyZC5tb2RlPUVOQUJMRUQsICQoY2FsbCBjb2xsYXBzZS1wYWlycywgJChBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTKSkpLCkKLSAgIyBEb24ndCByZXF1aXJlIHRoZSBzZXR1cCB3aXphcmQgb24gZW5nIGJ1aWxkcwotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTIDo9ICQoZmlsdGVyLW91dCByby5zZXR1cHdpemFyZC5tb2RlPSUsXAotICAgICAgICAgICQoY2FsbCBjb2xsYXBzZS1wYWlycywgJChBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTKSkpIFwKLSAgICAgICAgICByby5zZXR1cHdpemFyZC5tb2RlPU9QVElPTkFMCi1lbmRpZgotaWZuZGVmIGlzX3Nka19idWlsZAotICAjIFRvIHNwZWVkdXAgc3RhcnR1cCBvZiBub24tcHJlb3B0ZWQgYnVpbGRzLCBkb24ndCB2ZXJpZnkgb3IgY29tcGlsZSB0aGUgYm9vdCBpbWFnZS4KLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaW1hZ2UtZGV4Mm9hdC1maWx0ZXI9ZXh0cmFjdAotZW5kaWYKIGVuZGlmCiAKICMjIGFzYW4gIyMKQEAgLTQ1NiwxOCArMjA0LDExIEBACiAjIFRPRE86IHRoaXMgc2hvdWxkIGJlIGVuZyBJIHRoaW5rLiAgU2luY2UgdGhlIHNkayBpcyBidWlsdCBmcm9tIHRoZSBlbmcKICMgdmFyaWFudC4KIHRhZ3NfdG9faW5zdGFsbCA6PSBkZWJ1ZyBlbmcKLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0geG1wcC5hdXRvLXByZXNlbmNlPXRydWUKLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uY29uZmlnLm5vY2hlY2tpbj15ZXMKIGVsc2UgIyAhc2RrCiBlbmRpZgogCiBCVUlMRF9XSVRIT1VUX1BWIDo9IHRydWUKIAotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBuZXQuYnQubmFtZT1BbmRyb2lkCi0KLSMgVGhpcyBwcm9wZXJ0eSBpcyBzZXQgYnkgZmxhc2hpbmcgZGVidWcgYm9vdCBpbWFnZSwgc28gZGVmYXVsdCB0byBmYWxzZS4KLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uZm9yY2UuZGVidWdnYWJsZT0wCi0KICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIERlZmluZSBhIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEgbGlzdCBvZiBtb2R1bGUgdGFncywgcmV0dXJucwogIyBub24tZW1wdHkgaWYgdGhhdCBtb2R1bGUgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiAvc3lzdGVtLgpAQCAtNTA4LDEwICsyNDksNiBAQAogCiAjIFN0cmlwIGFuZCByZWFkb25seSBhIGZldyBtb3JlIHZhcmlhYmxlcyBzbyB0aGV5IHdvbid0IGJlIG1vZGlmaWVkLgogJChyZWFkb25seS1maW5hbC1wcm9kdWN0LXZhcnMpCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTKSkKLS5LQVRJX1JFQURPTkxZIDo9IEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUykpCi0uS0FUSV9SRUFET05MWSA6PSBBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUwogCiBpZm5lcSAoJChQUk9EVUNUX0VORk9SQ0VfUlJPX1RBUkdFVFMpLCkKIEVORk9SQ0VfUlJPX1NPVVJDRVMgOj0KQEAgLTU1NSw2ICsyOTIsNyBAQAogIyBzb3VyY2VzIG9yIGRlcGVuZGVuY2llcyBmb3IgdGhlc2UgdG9vbHMgbWF5IGJlIG1pc3NpbmcgZnJvbSB0aGUgdHJlZS4KIGlmZXEgKCwkKFRBUkdFVF9CVUlMRF9VTkJVTkRMRURfSU1BR0UpKQogZHJvaWRfdGFyZ2V0cyA6IGJsdWVwcmludF90b29scworY2hlY2tidWlsZDogYmx1ZXByaW50X3Rlc3RzCiBlbmRpZgogCiBlbmRpZiAjIGRvbnRfYm90aGVyCkBAIC01NjMsNyArMzAxLDcgQEAKIHN1YmRpcl9tYWtlZmlsZXNfdG90YWwgOj0gJCh3b3JkcyBpbml0IHBvc3QgZmluaXNoKQogZW5kaWYKIAotJChpbmZvIFskKGNhbGwgaW5jX2FuZF9wcmludCxzdWJkaXJfbWFrZWZpbGVzX2luYykvJChzdWJkaXJfbWFrZWZpbGVzX3RvdGFsKV0gZmluaXNoaW5nIGJ1aWxkIHJ1bGVzIC4uLikKKyQoaW5mbyBbJChjYWxsIGluY19hbmRfcHJpbnQsc3ViZGlyX21ha2VmaWxlc19pbmMpLyQoc3ViZGlyX21ha2VmaWxlc190b3RhbCldIGZpbmlzaGluZyBsZWdhY3kgTWFrZSBtb2R1bGUgcGFyc2luZyAuLi4pCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBBbGwgbW9kdWxlIG1ha2VmaWxlcyBoYXZlIGJlZW4gaW5jbHVkZWQgYXQgdGhpcyBwb2ludC4KQEAgLTgxOSwxMiArNTU3LDE0IEBACiAKICMgU2V0cyB1cCBkZXBlbmRlbmNpZXMgc3VjaCB0aGF0IHdoZW5ldmVyIGEgdGFyZ2V0IG1vZHVsZSBpcyBpbnN0YWxsZWQsCiAjIGFueSBvdGhlciB0YXJnZXQgbW9kdWxlcyBsaXN0ZWQgaW4gJChBTExfTU9EVUxFUy4kKG0pLlJFUVVJUkVEX0ZST01fVEFSR0VUKSB3aWxsIGFsc28gYmUgaW5zdGFsbGVkCisjIFRoaXMgZG9lc24ndCBhcHBseSB0byBPUkRFUk9OTFlfSU5TVEFMTEVEIGl0ZW1zLgogZGVmaW5lIGFkZC1hbGwtdGFyZ2V0LXRvLXRhcmdldC1yZXF1aXJlZC1tb2R1bGVzLWRlcHMKICQoZm9yZWFjaCBtLCQoQUxMX01PRFVMRVMpLCBcCiAgICQoZXZhbCByIDo9ICQoQUxMX01PRFVMRVMuJChtKS5SRVFVSVJFRF9GUk9NX1RBUkdFVCkpIFwKICAgJChpZiAkKHIpLCBcCiAgICAgJChldmFsIHIgOj0gJChjYWxsIG1vZHVsZS1pbnN0YWxsZWQtZmlsZXMsJChyKSkpIFwKICAgICAkKGV2YWwgdF9tIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVF9ST09UKS8lLCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSkpIFwKKyAgICAkKGV2YWwgdF9tIDo9ICQoZmlsdGVyLW91dCAkKEFMTF9NT0RVTEVTLiQobSkuT1JERVJPTkxZX0lOU1RBTExFRCksICQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSkgXAogICAgICQoZXZhbCB0X3IgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUX1JPT1QpLyUsICQocikpKSBcCiAgICAgJChldmFsIHRfciA6PSAkKGZpbHRlci1vdXQgJCh0X20pLCAkKHRfcikpKSBcCiAgICAgJChpZiAkKHRfbSksICQoZXZhbCAkKGNhbGwgYWRkLXJlcXVpcmVkLWRlcHMsICQodF9tKSwkKHRfcikpKSkgXApAQCAtOTQ4LDExICs2ODgsMTYgQEAKICAgICAgICAgICAkKGV2YWwgbXlfdGVzdGNhc2VzIDo9ICQoSE9TVF9PVVRfVEVTVENBU0VTKSksXAogICAgICAgICAgICQoZXZhbCBteV90ZXN0Y2FzZXMgOj0gJCQoQ09NUEFUSUJJTElUWV9URVNUQ0FTRVNfT1VUXyQoc3VpdGUpKSkpXAogICAgICAgICAkKGV2YWwgdGFyZ2V0IDo9ICQobXlfdGVzdGNhc2VzKS8kKGxhc3R3b3JkICQoc3Vic3QgLywgLCQoZGlyICQoZikpKSkvJChub3RkaXIgJChmKSkpXAorICAgICAgICAkKGV2YWwgbGlua190YXJnZXQgOj0gLi4vLi4vLi4vJChsYXN0d29yZCAkKHN1YnN0IC8sICwkKGRpciAkKGYpKSkpLyQobm90ZGlyICQoZikpKVwKKyAgICAgICAgJChldmFsIHN5bWxpbmsgOj0gJChteV90ZXN0Y2FzZXMpLyQobSkvc2hhcmVkX2xpYnMvJChsYXN0d29yZCAkKHN1YnN0IC8sICwkKGRpciAkKGYpKSkpLyQobm90ZGlyICQoZikpKVwKKyAgICAgICAgJChldmFsIENPTVBBVElCSUxJVFkuJChzdWl0ZSkuU1lNTElOS1MgOj0gXAorICAgICAgICAgICQkKENPTVBBVElCSUxJVFkuJChzdWl0ZSkuU1lNTElOS1MpICQoZik6JChsaW5rX3RhcmdldCk6JChzeW1saW5rKSlcCiAgICAgICAgICQoaWYgJChzdHJpcCAkKEFMTF9UQVJHRVRTLiQodGFyZ2V0KS5NRVRBX0xJQykpLCwkKGNhbGwgZGVjbGFyZS1jb3B5LXRhcmdldC1saWNlbnNlLW1ldGFkYXRhLCQodGFyZ2V0KSwkKGYpKSlcCiAgICAgICAgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMgOj0gXAogICAgICAgICAgICQkKENPTVBBVElCSUxJVFkuJChzdWl0ZSkuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUykgJChmKTokKHRhcmdldCkpXAogICAgICAgICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTIDo9IFwKLSAgICAgICAgICAkKHNvcnQgJChDT01QQVRJQklMSVRZLiQoc3VpdGUpLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpKSkpKSkpCisgICAgICAgICAgJChzb3J0ICQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSkpKSkpXAorICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TWU1MSU5LUyA6PSAkKHNvcnQgJChDT01QQVRJQklMSVRZLiQoc3VpdGUpLlNZTUxJTktTKSkpKQogZW5kZWYKIAogJChjYWxsIHJlc29sdmUtc2hhcmVkLWxpYnMtZGVwZXMsVEFSR0VUXykKQEAgLTEyMjUsNyArOTcwLDcgQEAKICMgUmV0dXJucyBtb2R1bGVzIGluY2x1ZGVkIGF1dG9tYXRpY2FsbHkgYXMgYSByZXN1bHQgb2YgY2VydGFpbiBCb2FyZENvbmZpZwogIyB2YXJpYWJsZXMgYmVpbmcgc2V0LgogZGVmaW5lIGF1dG8taW5jbHVkZWQtbW9kdWxlcwotICAkKGlmICQoQk9BUkRfVk5ES19WRVJTSU9OKSx2bmRrX3BhY2thZ2UpIFwKKyAgbGxuZGtfaW5fc3lzdGVtIFwKICAgJChpZiAkKERFVklDRV9NQU5JRkVTVF9GSUxFKSx2ZW5kb3JfbWFuaWZlc3QueG1sKSBcCiAgICQoaWYgJChERVZJQ0VfTUFOSUZFU1RfU0tVUyksJChmb3JlYWNoIHNrdSwgJChERVZJQ0VfTUFOSUZFU1RfU0tVUyksdmVuZG9yX21hbmlmZXN0XyQoc2t1KS54bWwpKSBcCiAgICQoaWYgJChPRE1fTUFOSUZFU1RfRklMRVMpLG9kbV9tYW5pZmVzdC54bWwpIFwKQEAgLTEyMzMsOSArOTc4LDcgQEAKIAogZW5kZWYKIAotIyBMaXN0cyBtb3N0IG9mIHRoZSBmaWxlcyBhIHBhcnRpY3VsYXIgcHJvZHVjdCBpbnN0YWxscywgaW5jbHVkaW5nOgotIyAtIFBST0RVQ1RfUEFDS0FHRVMsIGFuZCB0aGVpciBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTCi0jIC0gUFJPRFVDVF9DT1BZX0ZJTEVTCisjIExpc3RzIHRoZSBtb2R1bGVzIHBhcnRpY3VsYXIgcHJvZHVjdCBpbnN0YWxscy4KICMgVGhlIGJhc2UgbGlzdCBvZiBtb2R1bGVzIHRvIGJ1aWxkIGZvciB0aGlzIHByb2R1Y3QgaXMgc3BlY2lmaWVkCiAjIGJ5IHRoZSBhcHByb3ByaWF0ZSBwcm9kdWN0IGRlZmluaXRpb24gZmlsZSwgd2hpY2ggd2FzIGluY2x1ZGVkCiAjIGJ5IHByb2R1Y3RfY29uZmlnLm1rLgpAQCAtMTI0Nyw4ICs5OTAsNyBAQAogIyBOYW1lIHJlc29sdXRpb24gZm9yIExPQ0FMX1JFUVVJUkVEX01PRFVMRVM6CiAjICAgU2VlIHRoZSBzZWxlY3QtYml0bmVzcy1vZi1yZXF1aXJlZC1tb2R1bGVzIGRlZmluaXRpb24uCiAjICQoMSk6IHByb2R1Y3QgbWFrZWZpbGUKLQotZGVmaW5lIHByb2R1Y3QtaW5zdGFsbGVkLWZpbGVzCitkZWZpbmUgcHJvZHVjdC1pbnN0YWxsZWQtbW9kdWxlcwogICAkKGV2YWwgX3BpZl9tb2R1bGVzIDo9IFwKICAgICAkKGNhbGwgZ2V0LXByb2R1Y3QtdmFyLCQoMSksUFJPRFVDVF9QQUNLQUdFUykgXAogICAgICQoaWYgJChmaWx0ZXIgZW5nLCQodGFnc190b19pbnN0YWxsKSksJChjYWxsIGdldC1wcm9kdWN0LXZhciwkKDEpLFBST0RVQ1RfUEFDS0FHRVNfRU5HKSkgXApAQCAtMTI1Nyw2ICs5OTksMTEgQEAKICAgICAkKGlmICQoZmlsdGVyIGFzYW4sJCh0YWdzX3RvX2luc3RhbGwpKSwkKGNhbGwgZ2V0LXByb2R1Y3QtdmFyLCQoMSksUFJPRFVDVF9QQUNLQUdFU19ERUJVR19BU0FOKSkgXAogICAgICQoaWYgJChmaWx0ZXIgamF2YV9jb3ZlcmFnZSwkKHRhZ3NfdG9faW5zdGFsbCkpLCQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHX0pBVkFfQ09WRVJBR0UpKSBcCiAgICAgJChpZiAkKGZpbHRlciBhcm02NCwkKFRBUkdFVF9BUkNIKSAkKFRBUkdFVF8yTkRfQVJDSCkpLCQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTX0FSTTY0KSkgXAorICAgICQoaWYgJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksIFwKKyAgICAgICQoaWYgJChjYWxsIG1hdGhfZ3Rfb3JfZXEsMjksJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpLCQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8yOSkpIFwKKyAgICAgICQoaWYgJChjYWxsIG1hdGhfZ3Rfb3JfZXEsMzMsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpLCQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8zMykpIFwKKyAgICAgICQoaWYgJChjYWxsIG1hdGhfZ3Rfb3JfZXEsMzQsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpLCQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8zNCkpIFwKKyAgICApIFwKICAgICAkKGNhbGwgYXV0by1pbmNsdWRlZC1tb2R1bGVzKSBcCiAgICkgXAogICAkKGV2YWwgIyMjIEZpbHRlciBvdXQgdGhlIG92ZXJyaWRkZW4gcGFja2FnZXMgYW5kIGV4ZWN1dGFibGVzIGJlZm9yZSBkb2luZyBleHBhbnNpb24pIFwKQEAgLTEyNjUsNyArMTAxMiwxNCBAQAogICAkKGV2YWwgIyMjIFJlc29sdmUgdGhlIDozMiA6NjQgbW9kdWxlIG5hbWUpIFwKICAgJChldmFsIF9waWZfbW9kdWxlcyA6PSAkKHNvcnQgJChjYWxsIHJlc29sdmUtYml0bmVzcy1mb3ItbW9kdWxlcyxUQVJHRVQsJChfcGlmX21vZHVsZXMpKSkpIFwKICAgJChjYWxsIGV4cGFuZC1yZXF1aXJlZC1tb2R1bGVzLF9waWZfbW9kdWxlcywkKF9waWZfbW9kdWxlcyksJChfcGlmX292ZXJyaWRlcykpIFwKLSAgJChmaWx0ZXItb3V0ICQoSE9TVF9PVVRfUk9PVCkvJSwkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywgJChfcGlmX21vZHVsZXMpKSkgXAorICAkKF9waWZfbW9kdWxlcykKK2VuZGVmCisKKyMgTGlzdHMgbW9zdCBvZiB0aGUgZmlsZXMgYSBwYXJ0aWN1bGFyIHByb2R1Y3QgaW5zdGFsbHMuCisjIEl0IGdpdmVzIGFsbCB0aGUgaW5zdGFsbGVkIGZpbGVzIGZvciBhbGwgbW9kdWxlcyByZXR1cm5lZCBieSBwcm9kdWN0LWluc3RhbGxlZC1tb2R1bGVzLAorIyBhbmQgYWxzbyBpbmNsdWRlcyBQUk9EVUNUX0NPUFlfRklMRVMuCitkZWZpbmUgcHJvZHVjdC1pbnN0YWxsZWQtZmlsZXMKKyAgJChmaWx0ZXItb3V0ICQoSE9TVF9PVVRfUk9PVCkvJSwkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywgJChjYWxsIHByb2R1Y3QtaW5zdGFsbGVkLW1vZHVsZXMsJCgxKSkpKSBcCiAgICQoY2FsbCByZXNvbHZlLXByb2R1Y3QtcmVsYXRpdmUtcGF0aHMsXAogICAgICQoZm9yZWFjaCBjZiwkKGNhbGwgZ2V0LXByb2R1Y3QtdmFyLCQoMSksUFJPRFVDVF9DT1BZX0ZJTEVTKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQoY2YpKSkpCiBlbmRlZgpAQCAtMTM2NSw2ICsxMTE5LDcgQEAKICAgcHJvZHVjdF9ob3N0X0ZJTEVTIDo9ICQoY2FsbCBob3N0LWluc3RhbGxlZC1maWxlcywkKElOVEVSTkFMX1BST0RVQ1QpKQogICBwcm9kdWN0X3RhcmdldF9GSUxFUyA6PSAkKGNhbGwgcHJvZHVjdC1pbnN0YWxsZWQtZmlsZXMsICQoSU5URVJOQUxfUFJPRFVDVCkpCiAgICMgV0FSTklORzogVGhlIHByb2R1Y3RfTU9EVUxFUyB2YXJpYWJsZSBpcyBkZXBlbmRlZCBvbiBieSBleHRlcm5hbCBmaWxlcy4KKyAgIyBJdCBjb250YWlucyB0aGUgbGlzdCBvZiByZWdpc3RlciBuYW1lcyB0aGF0IHdpbGwgYmUgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UKICAgcHJvZHVjdF9NT0RVTEVTIDo9ICQoX3BpZl9tb2R1bGVzKQogCiAgICMgVmVyaWZ5IHRoZSBhcnRpZmFjdCBwYXRoIHJlcXVpcmVtZW50cyBtYWRlIGJ5IGluY2x1ZGVkIHByb2R1Y3RzLgpAQCAtMTM5MCwzMyArMTE0NSwxMiBAQAogICAgICQoQ1VTVE9NX01PRFVMRVMpIFwKICAgKQogCi0jIERlZHB1bGljYXRlIGNvbXBhdGliaWxpdHkgc3VpdGUgZGlzdCBmaWxlcyBhY3Jvc3MgbW9kdWxlcyBhbmQgcGFja2FnZXMgYmVmb3JlCisjIERlZHVwbGljYXRlIGNvbXBhdGliaWxpdHkgc3VpdGUgZGlzdCBmaWxlcyBhY3Jvc3MgbW9kdWxlcyBhbmQgcGFja2FnZXMgYmVmb3JlCiAjIGNvcHlpbmcgdGhlbSB0byB0aGVpciByZXF1ZXN0ZWQgbG9jYXRpb25zLiBBc3NpZ24gdGhlIGV2YWwgcmVzdWx0IHRvIGFuIHVudXNlZAogIyB2YXIgdG8gcHJldmVudCBNYWtlIGZyb20gdHJ5aW5nIHRvIG1ha2UgYSBzZW5zZSBvZiBpdC4KIF91bnVzZWQgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywgJChzb3J0ICQoQUxMX0NPTVBBVElCSUxJVFlfRElTVF9GSUxFUykpKQogCi0jIERvbid0IGluY2x1ZGUgYW55IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHNoYXJlZCBvYmplY3RzIG9yIHN0YXRpYwotIyBsaWJyYXJpZXMgaW4gU0RLIGltYWdlcy4gIEdQTCBleGVjdXRhYmxlcyAobm90IHN0YXRpYy9keW5hbWljIGxpYnJhcmllcykKLSMgYXJlIG9rYXkgaWYgdGhleSBkb24ndCBsaW5rIGFnYWluc3QgYW55IGNsb3NlZCBzb3VyY2UgbGlicmFyaWVzIChkaXJlY3RseQotIyBvciBpbmRpcmVjdGx5KQotCi0jIEl0J3Mgb2sgKGFuZCBuZWNlc3NhcnkpIHRvIGJ1aWxkIHRoZSBob3N0IHRvb2xzLCBidXQgbm90aGluZyB0aGF0J3MKLSMgZ29pbmcgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSB0YXJnZXQgKGluY2x1ZGluZyBzdGF0aWMgbGlicmFyaWVzKS4KLQogaWZkZWYgaXNfc2RrX2J1aWxkCi0gIHRhcmdldF9nbnVfTU9EVUxFUyA6PSBcCi0gICAgICAgICAgICAgICQoZmlsdGVyIFwKLSAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvJSBcCi0gICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfT1VUKS8lIFwKLSAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9PVVRfREFUQSkvJSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzb3J0ICQoY2FsbCBnZXQtdGFnZ2VkLW1vZHVsZXMsZ251KSkpCi0gIHRhcmdldF9nbnVfTU9EVUxFUyA6PSAkKGZpbHRlci1vdXQgJChUQVJHRVRfT1VUX0VYRUNVVEFCTEVTKS8lLCQodGFyZ2V0X2dudV9NT0RVTEVTKSkKLSAgdGFyZ2V0X2dudV9NT0RVTEVTIDo9ICQoZmlsdGVyLW91dCAlL2xpYm9wZW5qZGtqdm10aS5zbywkKHRhcmdldF9nbnVfTU9EVUxFUykpCi0gIHRhcmdldF9nbnVfTU9EVUxFUyA6PSAkKGZpbHRlci1vdXQgJS9saWJvcGVuamRranZtdGlkLnNvLCQodGFyZ2V0X2dudV9NT0RVTEVTKSkKLSAgJChpbmZvIFJlbW92aW5nIGZyb20gc2RrOikkKGZvcmVhY2ggZCwkKHRhcmdldF9nbnVfTU9EVUxFUyksJChpbmZvIDogJChkKSkpCi0gIG1vZHVsZXNfdG9faW5zdGFsbCA6PSBcCi0gICAgICAgICAgICAgICQoZmlsdGVyLW91dCAkKHRhcmdldF9nbnVfTU9EVUxFUyksJChtb2R1bGVzX3RvX2luc3RhbGwpKQotCiAgICMgRW5zdXJlIGV2ZXJ5IG1vZHVsZSBsaXN0ZWQgaW4gUFJPRFVDVF9QQUNLQUdFUyogZ2V0cyBzb21ldGhpbmcgaW5zdGFsbGVkCiAgICMgVE9ETzogU2hvdWxkIHdlIGRvIHRoaXMgZm9yIGFsbCBidWlsZHMgYW5kIG5vdCBqdXN0IHRoZSBzZGs/CiAgIGRhbmdsaW5nX21vZHVsZXMgOj0KQEAgLTE0MzcsNiArMTE3MSwxNiBAQAogICAgICAgJCh3YXJuaW5nICQoQUxMX01PRFVMRVMuJChtKS5NQUtFRklMRSk6IE1vZHVsZSAnJChtKScgaW4gUFJPRFVDVF9QQUNLQUdFU19URVNUUyBoYXMgbm90aGluZyB0byBpbnN0YWxsISkpKQogZW5kaWYKIAoraWZuZXEgKCQoVEFSR0VUX0JVSUxEX0FQUFMpLCkKKyAgIyBJZiB0aGlzIGJ1aWxkIGlzIGp1c3QgZm9yIGFwcHMsIG9ubHkgYnVpbGQgYXBwcyBhbmQgbm90IHRoZSBmdWxsIHN5c3RlbSBieSBkZWZhdWx0LgorICBpZm5lcSAoJChmaWx0ZXIgYWxsLCQoVEFSR0VUX0JVSUxEX0FQUFMpKSwpCisgICAgIyBJZiB0aGV5IHVzZWQgdGhlIG1hZ2ljIGdvYWwgImFsbCIgdGhlbiBidWlsZCBhbGwgYXBwcyBpbiB0aGUgc291cmNlIHRyZWUuCisgICAgdW5idW5kbGVkX2J1aWxkX21vZHVsZXMgOj0gJChmb3JlYWNoIG0sJChzb3J0ICQoQUxMX01PRFVMRVMpKSwkKGlmICQoZmlsdGVyIEFQUFMsJChBTExfTU9EVUxFUy4kKG0pLkNMQVNTKSksJChtKSkpCisgIGVsc2UKKyAgICB1bmJ1bmRsZWRfYnVpbGRfbW9kdWxlcyA6PSAkKHNvcnQgJChUQVJHRVRfQlVJTERfQVBQUykpCisgIGVuZGlmCitlbmRpZgorCiAjIGJ1aWxkL21ha2UvY29yZS9NYWtlZmlsZSBjb250YWlucyBleHRyYSBzdHVmZiB0aGF0IHdlIGRvbid0IHdhbnQgdG8gcG9sbHV0ZSB0aGlzCiAjIHRvcC1sZXZlbCBtYWtlZmlsZSB3aXRoLiAgSXQgZXhwZWN0cyB0aGF0IEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTCiAjIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCdzIGJ1aWx0IGR1cmluZyB0aGUgY3VycmVudCBtYWtlLCBidXQgaXQgYWxzbyBmdXJ0aGVyCkBAIC0xNjU0LDYgKzEzOTgsNyBAQAogICAgICQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfU1VQRVJJTUFHRV9FTVBUWV9UQVJHRVQpIFwKICAgICAkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKSBcCisgICAgJChJTlNUQUxMRURfU1lTVEVNX0VYVElNQUdFX1RBUkdFVCkgXAogICAgICQoSU5TVEFMTEVEX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfVEVTVF9IQVJORVNTX1JBTURJU0tfVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfVEVTVF9IQVJORVNTX0JPT1RJTUFHRV9UQVJHRVQpIFwKQEAgLTE2OTksMTAgKzE0NDQsOCBAQAogIyBkaXN0X2ZpbGVzIG9ubHkgZm9yIHB1dHRpbmcgeW91ciBsaWJyYXJ5IGludG8gdGhlIGRpc3QgZGlyZWN0b3J5IHdpdGggYSBmdWxsIGJ1aWxkLgogLlBIT05ZOiBkaXN0X2ZpbGVzCiAKLWlmZXEgKCQoU09PTkdfQ09MTEVDVF9KQVZBX0RFUFMpLCB0cnVlKQotICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRpc3RfZmlsZXMsICQoU09PTkdfT1VUX0RJUikvbW9kdWxlX2JwX2phdmFfZGVwcy5qc29uKQotICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRpc3RfZmlsZXMsICQoUFJPRFVDVF9PVVQpL21vZHVsZS1pbmZvLmpzb24pCi1lbmRpZgorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkaXN0X2ZpbGVzLCAkKFNPT05HX09VVF9ESVIpL21vZHVsZV9icF9qYXZhX2RlcHMuanNvbikKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgZGlzdF9maWxlcywgJChQUk9EVUNUX09VVCkvbW9kdWxlLWluZm8uanNvbikKIAogLlBIT05ZOiBhcHBzX29ubHkKIGlmZXEgKCQoSE9TVF9PUyksZGFyd2luKQpAQCAtMTcxMiwxNiArMTQ1NSwxMCBAQAogZWxzZSBpZm5lcSAoJChUQVJHRVRfQlVJTERfQVBQUyksKQogICAjIElmIHRoaXMgYnVpbGQgaXMganVzdCBmb3IgYXBwcywgb25seSBidWlsZCBhcHBzIGFuZCBub3QgdGhlIGZ1bGwgc3lzdGVtIGJ5IGRlZmF1bHQuCiAKLSAgdW5idW5kbGVkX2J1aWxkX21vZHVsZXMgOj0KLSAgaWZuZXEgKCQoZmlsdGVyIGFsbCwkKFRBUkdFVF9CVUlMRF9BUFBTKSksKQotICAgICMgSWYgdGhleSB1c2VkIHRoZSBtYWdpYyBnb2FsICJhbGwiIHRoZW4gYnVpbGQgYWxsIGFwcHMgaW4gdGhlIHNvdXJjZSB0cmVlLgotICAgIHVuYnVuZGxlZF9idWlsZF9tb2R1bGVzIDo9ICQoZm9yZWFjaCBtLCQoc29ydCAkKEFMTF9NT0RVTEVTKSksJChpZiAkKGZpbHRlciBBUFBTLCQoQUxMX01PRFVMRVMuJChtKS5DTEFTUykpLCQobSkpKQotICBlbHNlCi0gICAgdW5idW5kbGVkX2J1aWxkX21vZHVsZXMgOj0gJChUQVJHRVRfQlVJTERfQVBQUykKLSAgZW5kaWYKLQotICAjIERpc3QgdGhlIGluc3RhbGxlZCBmaWxlcyBpZiB0aGV5IGV4aXN0LgotICBhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzIDo9ICQoZm9yZWFjaCBtLCQodW5idW5kbGVkX2J1aWxkX21vZHVsZXMpLCQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKQorICAjIERpc3QgdGhlIGluc3RhbGxlZCBmaWxlcyBpZiB0aGV5IGV4aXN0LCBleGNlcHQgdGhlIGluc3RhbGxlZCBzeW1saW5rcy4gZGlzdC1mb3ItZ29hbHMgZW1pdHMKKyAgIyBgY3Agc3JjIGRlc3RgIGNvbW1hbmRzLCB3aGljaCB3aWxsIGZhaWwgdG8gY29weSBkYW5nbGluZyBzeW1saW5rcy4KKyAgYXBwc19vbmx5X2luc3RhbGxlZF9maWxlcyA6PSAkKGZvcmVhY2ggbSwkKHVuYnVuZGxlZF9idWlsZF9tb2R1bGVzKSxcCisgICAgJChmaWx0ZXItb3V0ICQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRURfU1lNTElOS1MpLCQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSkKICAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLGFwcHNfb25seSwgJChhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzKSkKIAogICAjIERpc3QgdGhlIGJ1bmRsZSBmaWxlcyBpZiB0aGV5IGV4aXN0LgpAQCAtMTc1MSwxNSArMTQ4OCwxNSBAQAogICBlbmRpZgogCiAgICQoUFJPR1VBUkRfRElDVF9aSVApIDogJChhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzKQotICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsYXBwc19vbmx5LCAkKFBST0dVQVJEX0RJQ1RfWklQKSAkKFBST0dVQVJEX0RJQ1RfTUFQUElORykpCisgICQoY2FsbCBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnLGFwcHNfb25seSwgJChQUk9HVUFSRF9ESUNUX1pJUCkgJChQUk9HVUFSRF9ESUNUX1pJUCkgJChQUk9HVUFSRF9ESUNUX01BUFBJTkcpKQogICAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoUFJPR1VBUkRfRElDVF9aSVApLCQoYXBwc19vbmx5X2luc3RhbGxlZF9maWxlcyksJChQUk9EVUNUX09VVCkvOi8pCiAKICAgJChQUk9HVUFSRF9VU0FHRV9aSVApIDogJChhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzKQotICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsYXBwc19vbmx5LCAkKFBST0dVQVJEX1VTQUdFX1pJUCkpCisgICQoY2FsbCBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnLGFwcHNfb25seSwgJChQUk9HVUFSRF9VU0FHRV9aSVApKQogICAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoUFJPR1VBUkRfVVNBR0VfWklQKSwkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpLCQoUFJPRFVDVF9PVVQpLzovKQogCiAgICQoU1lNQk9MU19aSVApIDogJChhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzKQotICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsYXBwc19vbmx5LCAkKFNZTUJPTFNfWklQKSAkKFNZTUJPTFNfTUFQUElORykpCisgICQoY2FsbCBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnLGFwcHNfb25seSwgJChTWU1CT0xTX1pJUCkgJChTWU1CT0xTX01BUFBJTkcpKQogICAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoU1lNQk9MU19aSVApLCQoYXBwc19vbmx5X2luc3RhbGxlZF9maWxlcyksJChQUk9EVUNUX09VVCkvOi8pCiAKICAgJChDT1ZFUkFHRV9aSVApIDogJChhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzKQpAQCAtMTgwNSwxNyArMTU0MiwyMyBAQAogICAjIGF2b2lkIGRpc3RpbmcgdGFyZ2V0cyB0aGF0IHdvdWxkIGNhdXNlIGJ1aWxkaW5nIGZyYW1ld29yayBqYXZhIHNvdXJjZXMsCiAgICMgd2hpY2ggd2Ugd2FudCB0byBhdm9pZCBpbiBhbiB1bmJ1bmRsZWQgYnVpbGQuCiAKLSAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkcm9pZGNvcmUtdW5idW5kbGVkLCBcCisgICQoY2FsbCBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnLCBkcm9pZGNvcmUtdW5idW5kbGVkLCBcCiAgICAgJChJTlRFUk5BTF9VUERBVEVfUEFDS0FHRV9UQVJHRVQpIFwKICAgICAkKElOVEVSTkFMX09UQV9QQUNLQUdFX1RBUkdFVCkgXAotICAgICQoSU5URVJOQUxfT1RBX01FVEFEQVRBKSBcCiAgICAgJChJTlRFUk5BTF9PVEFfUEFSVElBTF9QQUNLQUdFX1RBUkdFVCkgXAorICAgICQoQlVJTFRfUkFNRElTS18xNktfVEFSR0VUKSBcCisgICAgJChCVUlMVF9LRVJORUxfMTZLX1RBUkdFVCkgXAogICAgICQoSU5URVJOQUxfT1RBX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OU19QQUNLQUdFX1RBUkdFVCkgXAogICAgICQoU1lNQk9MU19aSVApIFwKICAgICAkKFNZTUJPTFNfTUFQUElORykgXAogICAgICQoUFJPR1VBUkRfRElDVF9aSVApIFwKICAgICAkKFBST0dVQVJEX0RJQ1RfTUFQUElORykgXAogICAgICQoUFJPR1VBUkRfVVNBR0VfWklQKSBcCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkgXAorICApCisKKyAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkcm9pZGNvcmUtdW5idW5kbGVkLCBcCisgICAgJChJTlRFUk5BTF9PVEFfTUVUQURBVEEpIFwKICAgICAkKENPVkVSQUdFX1pJUCkgXAogICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEUpIFwKICAgICAkKElOU1RBTExFRF9GSUxFU19KU09OKSBcCkBAIC0xODM3LDEzICsxNTgwLDEyIEBACiAgICAgJChJTlNUQUxMRURfRklMRVNfSlNPTl9TWVNURU1PVEhFUikgXAogICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfUkVDT1ZFUlkpIFwKICAgICAkKElOU1RBTExFRF9GSUxFU19KU09OX1JFQ09WRVJZKSBcCi0gICAgJChJTlNUQUxMRURfQlVJTERfUFJPUF9UQVJHRVQpOmJ1aWxkLnByb3AgXAotICAgICQoSU5TVEFMTEVEX1ZFTkRPUl9CVUlMRF9QUk9QX1RBUkdFVCk6YnVpbGQucHJvcC12ZW5kb3IgXAotICAgICQoSU5TVEFMTEVEX1BST0RVQ1RfQlVJTERfUFJPUF9UQVJHRVQpOmJ1aWxkLnByb3AtcHJvZHVjdCBcCi0gICAgJChJTlNUQUxMRURfT0RNX0JVSUxEX1BST1BfVEFSR0VUKTpidWlsZC5wcm9wLW9kbSBcCi0gICAgJChJTlNUQUxMRURfU1lTVEVNX0VYVF9CVUlMRF9QUk9QX1RBUkdFVCk6YnVpbGQucHJvcC1zeXN0ZW1fZXh0IFwKLSAgICAkKElOU1RBTExFRF9SQU1ESVNLX0JVSUxEX1BST1BfVEFSR0VUKTpidWlsZC5wcm9wLXJhbWRpc2sgXAotICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpIFwKKyAgICAkKGlmICQoQlVJTERJTkdfU1lTVEVNX0lNQUdFKSwgJChJTlNUQUxMRURfQlVJTERfUFJPUF9UQVJHRVQpOmJ1aWxkLnByb3ApIFwKKyAgICAkKGlmICQoQlVJTERJTkdfVkVORE9SX0lNQUdFKSwgJChJTlNUQUxMRURfVkVORE9SX0JVSUxEX1BST1BfVEFSR0VUKTpidWlsZC5wcm9wLXZlbmRvcikgXAorICAgICQoaWYgJChCVUlMRElOR19QUk9EVUNUX0lNQUdFKSwgJChJTlNUQUxMRURfUFJPRFVDVF9CVUlMRF9QUk9QX1RBUkdFVCk6YnVpbGQucHJvcC1wcm9kdWN0KSBcCisgICAgJChpZiAkKEJVSUxESU5HX09ETV9JTUFHRSksICQoSU5TVEFMTEVEX09ETV9CVUlMRF9QUk9QX1RBUkdFVCk6YnVpbGQucHJvcC1vZG0pIFwKKyAgICAkKGlmICQoQlVJTERJTkdfU1lTVEVNX0VYVF9JTUFHRSksICQoSU5TVEFMTEVEX1NZU1RFTV9FWFRfQlVJTERfUFJPUF9UQVJHRVQpOmJ1aWxkLnByb3Atc3lzdGVtX2V4dCkgXAorICAgICQoaWYgJChCVUlMRElOR19SQU1ESVNLX0lNQUdFKSwgJChJTlNUQUxMRURfUkFNRElTS19CVUlMRF9QUk9QX1RBUkdFVCk6YnVpbGQucHJvcC1yYW1kaXNrKSBcCiAgICAgJChJTlNUQUxMRURfQU5EUk9JRF9JTkZPX1RYVF9UQVJHRVQpIFwKICAgICAkKElOU1RBTExFRF9NSVNDX0lORk9fVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfUkFNRElTS19UQVJHRVQpIFwKQEAgLTE4NTUsNyArMTU5Nyw3IEBACiAgICAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkcm9pZGNvcmUtdW5idW5kbGVkLCAkKGYpKSkKIAogICBpZm5lcSAoJChBTkRST0lEX0JVSUxEX0VNQkVEREVEKSx0cnVlKQotICAgICQoY2FsbCBkaXN0LWZvci1nb2FscywgZHJvaWRjb3JlLCBcCisgICAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLXdpdGgtZmlsZW5hbWV0YWcsIGRyb2lkY29yZSwgXAogICAgICAgJChBUFBTX1pJUCkgXAogICAgICAgJChJTlRFUk5BTF9FTVVMQVRPUl9QQUNLQUdFX1RBUkdFVCkgXAogICAgICkKQEAgLTE5MTQsNyArMTY1Niw3IEBACiAgICQoYXBpX3htbHMpOgogCSQoaGlkZSkgZWNobyAiQ29udmVydGluZyBBUEkgZmlsZSB0byBYTUw6ICRAIgogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0JJChoaWRlKSAkKEFQSUNIRUNLX0NPTU1BTkQpIC0taW5wdXQtYXBpLWphciAkPCAtLWFwaS14bWwgJEAKKwkkKGhpZGUpICQoQVBJQ0hFQ0tfQ09NTUFORCkgamFyLXRvLWpkaWZmICQ8ICRACiAKICAgJChmb3JlYWNoIHhtbCwkKHNvcnQgJChhcGlfeG1scykpLCQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKHhtbCksKSkKIApAQCAtMTk1NSwxMCArMTY5Nyw4IEBACiBpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQogQUxMX1NES19UQVJHRVRTIDo9ICQoSU5URVJOQUxfU0RLX1RBUkdFVCkKIHNkazogJChBTExfU0RLX1RBUkdFVFMpCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsc2RrLCBcCi0gICAgJChBTExfU0RLX1RBUkdFVFMpIFwKLSAgICAkKElOU1RBTExFRF9CVUlMRF9QUk9QX1RBUkdFVCkgXAotKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLXdpdGgtZmlsZW5hbWV0YWcsc2RrLCQoQUxMX1NES19UQVJHRVRTKSkKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxzZGssJChJTlNUQUxMRURfQlVJTERfUFJPUF9UQVJHRVQpKQogZW5kaWYKIAogIyB1bWJyZWxsYSB0YXJnZXRzIHRvIGFzc2l0IGVuZ2luZWVycyBpbiB2ZXJpZnlpbmcgYnVpbGRzCkBAIC0xOTgzLDI3ICsxNzIzLDkgQEAKIC5QSE9OWTogZmluZGJ1Z3MKIGZpbmRidWdzOiAkKElOVEVSTkFMX0ZJTkRCVUdTX0hUTUxfVEFSR0VUKSAkKElOVEVSTkFMX0ZJTkRCVUdTX1hNTF9UQVJHRVQpCiAKLUxTRFVNUF9QQVRIU19GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2xzZHVtcF9wYXRocy50eHQKLQotLlBIT05ZOiBmaW5kbHNkdW1wcwotIyBMU0RVTVBfUEFUSFMgaXMgYSBsaXN0IG9mIHRhZzpwYXRoLgotZmluZGxzZHVtcHM6ICQoTFNEVU1QX1BBVEhTX0ZJTEUpICQoZm9yZWFjaCBwLCQoTFNEVU1QX1BBVEhTKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQocCkpKQotCi0kKExTRFVNUF9QQVRIU19GSUxFKTogUFJJVkFURV9MU0RVTVBfUEFUSFMgOj0gJChMU0RVTVBfUEFUSFMpCi0kKExTRFVNUF9QQVRIU19GSUxFKToKLQlAZWNobyAiR2VuZXJhdGUgJEAiCi0JQHJtIC1yZiAkQCAmJiBlY2hvIC1lICIkKHN1YnN0IDosOiQoc3BhY2UpLCQoc3Vic3QgJChzcGFjZSksXG4sJChQUklWQVRFX0xTRFVNUF9QQVRIUykpKSIgPiAkQAotCiAuUEhPTlk6IGNoZWNrLWVsZi1maWxlcwogY2hlY2stZWxmLWZpbGVzOgogCi0jeHh4IHNjcmFwZSB0aGlzIGZyb20gQUxMX01PRFVMRV9OQU1FX1RBR1MKLS5QSE9OWTogbW9kdWxlcwotbW9kdWxlczoKLQlAZWNobyAiQXZhaWxhYmxlIHN1Yi1tb2R1bGVzOiIKLQlAZWNobyAiJChjYWxsIG1vZHVsZS1uYW1lcy1mb3ItdGFnLWxpc3QsJChBTExfTU9EVUxFX1RBR1MpKSIgfCBcCi0JICAgICAgdHIgLXMgJyAnICdcbicgfCBzb3J0IC11Ci0KIC5QSE9OWTogZHVtcC1maWxlcwogZHVtcC1maWxlczoKIAlAZWNobyAiVGFyZ2V0IGZpbGVzIGZvciAkKFRBUkdFVF9QUk9EVUNUKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSAoJChJTlRFUk5BTF9QUk9EVUNUKSk6IgpAQCAtMjE1NywxMyArMTg3OSwxOCBAQAogIyAgICAgICBpc19rZXJuZWxfbW9kdWxlc19ibG9ja2xpc3Q6IG1vZHVsZXMuYmxvY2tsaXN0IGNyZWF0ZWQgZm9yIF9kbGttIHBhcnRpdGlvbnMsIHNlZSBtYWNybyBidWlsZC1pbWFnZS1rZXJuZWwtbW9kdWxlcy1kaXIgaW4gTWFrZWZpbGUuCiAjICAgICAgIGlzX2ZzdmVyaXR5X2J1aWxkX21hbmlmZXN0X2FwazogQnVpbGRNYW5pZmVzdDxwYXJ0Pi5hcGsgZmlsZXMgZm9yIHN5c3RlbSBhbmQgc3lzdGVtX2V4dCBwYXJ0aXRpb24sIHNlZSBBTExfRlNWRVJJVFlfQlVJTERfTUFOSUZFU1RfQVBLIGluIE1ha2VmaWxlLgogIyAgICAgICBpc19saW5rZXJfY29uZmlnOiBzZWUgU1lTVEVNX0xJTktFUl9DT05GSUcgYW5kIHZlbmRvcl9saW5rZXJfY29uZmlnX2ZpbGUgaW4gTWFrZWZpbGUuCisjICAgYnVpbGRfb3V0cHV0X3BhdGg6IHRoZSBwYXRoIG9mIHRoZSBidWlsdCBmaWxlLCB1c2VkIHRvIGNhbGN1bGF0ZSBjaGVja3N1bQorIyAgIHN0YXRpY19saWJyYXJpZXMvd2hvbGVfc3RhdGljX2xpYnJhcmllczogbGlzdCBvZiBtb2R1bGUgbmFtZSBvZiB0aGUgc3RhdGljIGxpYnJhcmllcyB0aGUgZmlsZSBsaW5rcyBhZ2FpbnN0LCBlLmcuIGxpYmNsYW5nX3J0LmJ1aWx0aW5zIG9yIGxpYmNsYW5nX3J0LmJ1aWx0aW5zXzMyCisjICAgICAgIEluZm8gb2YgYWxsIHN0YXRpYyBsaWJyYXJpZXMgb2YgYWxsIGluc3RhbGxlZCBmaWxlcyBhcmUgY29sbGVjdGVkIGluIHZhcmlhYmxlIF9hbGxfc3RhdGljX2xpYnMgdGhhdCBpcyB1c2VkIHRvIGxpc3QgYWxsIHRoZSBzdGF0aWMgbGlicmFyeSBmaWxlcyBpbiBzYm9tLW1ldGFkYXRhLmNzdi4KKyMgICAgICAgU2VlIHRoZSBzZWNvbmQgZm9yZWFjaCBsb29wIGluIHRoZSBydWxlIG9mIHNib20tbWV0YWRhdGEuY3N2IGZvciB0aGUgZGV0YWlsZWQgaW5mbyBvZiBzdGF0aWMgbGlicmFyaWVzIGNvbGxlY3RlZCBpbiBfYWxsX3N0YXRpY19saWJzLgorIyAgIGlzX3N0YXRpY19saWI6IHdoZXRoZXIgdGhlIGZpbGUgaXMgYSBzdGF0aWMgbGlicmFyeQogCi0jIChUT0RPOiBiLzI3MjM1ODU4MyBmaW5kIGFub3RoZXIgd2F5IG9mIGFsd2F5cyByZWJ1aWxkaW5nIHRoaXMgdGFyZ2V0KQotIyBSZW1vdmUgdGhlIHNib20tbWV0YWRhdGEuY3N2IHdoZW5ldmVyIG1ha2VmaWxlIGlzIGV2YWx1YXRlZAotJChzaGVsbCBybSAkKFBST0RVQ1RfT1VUKS9zYm9tLW1ldGFkYXRhLmNzdiA+L2Rldi9udWxsIDI+JjEpCi0kKFBST0RVQ1RfT1VUKS9zYm9tLW1ldGFkYXRhLmNzdjogJChpbnN0YWxsZWRfZmlsZXMpCittZXRhZGF0YV9saXN0IDo9ICQoT1VUX0RJUikvLm1vZHVsZV9wYXRocy9NRVRBREFUQS5saXN0CittZXRhZGF0YV9maWxlcyA6PSAkKHN1YnN0ICQobmV3bGluZSksJChzcGFjZSksJChmaWxlIDwkKG1ldGFkYXRhX2xpc3QpKSkKKyQoUFJPRFVDVF9PVVQpL3Nib20tbWV0YWRhdGEuY3N2OgogCXJtIC1mICRACi0JQGVjaG8gaW5zdGFsbGVkX2ZpbGUkKGNvbW1hKW1vZHVsZV9wYXRoJChjb21tYSlzb29uZ19tb2R1bGVfdHlwZSQoY29tbWEpaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGUkKGNvbW1hKXByb2R1Y3RfY29weV9maWxlcyQoY29tbWEpa2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJChjb21tYSlpc19wbGF0Zm9ybV9nZW5lcmF0ZWQsYnVpbGRfb3V0cHV0X3BhdGggPj4gJEAKKwllY2hvICdpbnN0YWxsZWRfZmlsZSxtb2R1bGVfcGF0aCxzb29uZ19tb2R1bGVfdHlwZSxpc19wcmVidWlsdF9tYWtlX21vZHVsZSxwcm9kdWN0X2NvcHlfZmlsZXMsa2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzLGlzX3BsYXRmb3JtX2dlbmVyYXRlZCxidWlsZF9vdXRwdXRfcGF0aCxzdGF0aWNfbGlicmFyaWVzLHdob2xlX3N0YXRpY19saWJyYXJpZXMsaXNfc3RhdGljX2xpYicgPj4gJEAKKwkkKGV2YWwgX2FsbF9zdGF0aWNfbGlicyA6PSkKIAkkKGZvcmVhY2ggZiwkKGluc3RhbGxlZF9maWxlcyksXAogCSAgJChldmFsIF9tb2R1bGVfbmFtZSA6PSAkKEFMTF9JTlNUQUxMRURfRklMRVMuJGYpKSBcCiAJICAkKGV2YWwgX3BhdGhfb25fZGV2aWNlIDo9ICQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwlLCRmKSkgXApAQCAtMjE3MSw3ICsxODk4LDYgQEAKIAkgICQoZXZhbCBfbW9kdWxlX3BhdGggOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuUEFUSCkpKSkgXAogCSAgJChldmFsIF9zb29uZ19tb2R1bGVfdHlwZSA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5TT09OR19NT0RVTEVfVFlQRSkpKSkgXAogCSAgJChldmFsIF9pc19wcmVidWlsdF9tYWtlX21vZHVsZSA6PSAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5JU19QUkVCVUlMVF9NQUtFX01PRFVMRSkpIFwKLQkgICQoZXZhbCBfcG9zdF9pbnN0YWxsZWRfZGV4cHJlb3B0X3ppcCA6PSAkKERFWFBSRU9QVC4kKF9tb2R1bGVfbmFtZSkuUE9TVF9JTlNUQUxMRURfREVYUFJFT1BUX1pJUCkpIFwKIAkgICQoZXZhbCBfcHJvZHVjdF9jb3B5X2ZpbGVzIDo9ICQoc29ydCAkKGZpbHRlciAlOiQoX3BhdGhfb25fZGV2aWNlKSwkKHByb2R1Y3RfY29weV9maWxlc193aXRob3V0X293bmVyKSkpKSBcCiAJICAkKGV2YWwgX2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyA6PSAkKHNvcnQgJChmaWx0ZXIgJSQoX3BhdGhfb25fZGV2aWNlKSwkKEtFUk5FTF9NT0RVTEVfQ09QWV9GSUxFUykpKSkgXAogCSAgJChldmFsIF9pc19idWlsZF9wcm9wIDo9ICQoY2FsbCBpcy1idWlsZC1wcm9wLCRmKSkgXApAQCAtMjE4NCwzOCArMTkxMCwxNDUgQEAKIAkgICQoZXZhbCBfaXNfZnN2ZXJpdHlfYnVpbGRfbWFuaWZlc3RfYXBrIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoQUxMX0ZTVkVSSVRZX0JVSUxEX01BTklGRVNUX0FQSykpLFkpKSBcCiAJICAkKGV2YWwgX2lzX2xpbmtlcl9jb25maWcgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChTWVNURU1fTElOS0VSX0NPTkZJRykgJCh2ZW5kb3JfbGlua2VyX2NvbmZpZ19maWxlKSksWSkpIFwKIAkgICQoZXZhbCBfaXNfcGFydGl0aW9uX2NvbXBhdF9zeW1saW5rIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoUEFSVElUSU9OX0NPTVBBVF9TWU1MSU5LUykpLFkpKSBcCi0JICAkKGV2YWwgX2lzX3BsYXRmb3JtX2dlbmVyYXRlZCA6PSAkKF9pc19idWlsZF9wcm9wKSQoX2lzX25vdGljZV9maWxlKSQoX2lzX2RleHByZW9wdF9pbWFnZV9wcm9maWxlKSQoX2lzX3Byb2R1Y3Rfc3lzdGVtX290aGVyX2F2YmtleSkkKF9pc19ldmVudF9sb2dfdGFnc19maWxlKSQoX2lzX3N5c3RlbV9vdGhlcl9vZGV4X21hcmtlcikkKF9pc19rZXJuZWxfbW9kdWxlc19ibG9ja2xpc3QpJChfaXNfZnN2ZXJpdHlfYnVpbGRfbWFuaWZlc3RfYXBrKSQoX2lzX2xpbmtlcl9jb25maWcpJChfaXNfcGFydGl0aW9uX2NvbXBhdF9zeW1saW5rKSkgXAotCSAgQGVjaG8gLyQoX3BhdGhfb25fZGV2aWNlKSQoY29tbWEpJChfbW9kdWxlX3BhdGgpJChjb21tYSkkKF9zb29uZ19tb2R1bGVfdHlwZSkkKGNvbW1hKSQoX2lzX3ByZWJ1aWx0X21ha2VfbW9kdWxlKSQoY29tbWEpJChfcHJvZHVjdF9jb3B5X2ZpbGVzKSQoY29tbWEpJChfa2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzKSQoY29tbWEpJChfaXNfcGxhdGZvcm1fZ2VuZXJhdGVkKSQoY29tbWEpJChfYnVpbGRfb3V0cHV0X3BhdGgpID4+ICRAICQobmV3bGluZSkgXAotCSAgJChpZiAkKF9wb3N0X2luc3RhbGxlZF9kZXhwcmVvcHRfemlwKSwgXAotCSAgZm9yIGkgaW4gJCQoemlwaW5mbyAtMSAkKF9wb3N0X2luc3RhbGxlZF9kZXhwcmVvcHRfemlwKSk7IGRvIGVjaG8gLyQkaSQoY29tbWEpJChfbW9kdWxlX3BhdGgpJChjb21tYSkkKF9zb29uZ19tb2R1bGVfdHlwZSkkKGNvbW1hKSQoX2lzX3ByZWJ1aWx0X21ha2VfbW9kdWxlKSQoY29tbWEpJChfcHJvZHVjdF9jb3B5X2ZpbGVzKSQoY29tbWEpJChfa2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzKSQoY29tbWEpJChfaXNfcGxhdGZvcm1fZ2VuZXJhdGVkKSQoY29tbWEpJChQUk9EVUNUX09VVCkvJCRpID4+ICRAIDsgZG9uZSAkKG5ld2xpbmUpIFwKKwkgICQoZXZhbCBfaXNfZmxhZ3NfZmlsZSA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwgJChBTExfRkxBR1NfRklMRVMpKSxZKSkgXAorCSAgJChldmFsIF9pc19yb290ZGlyX3N5bWxpbmsgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsICQoQUxMX1JPT1RESVJfU1lNTElOS1MpKSxZKSkgXAorCSAgJChldmFsIF9pc19wbGF0Zm9ybV9nZW5lcmF0ZWQgOj0gJChfaXNfYnVpbGRfcHJvcCkkKF9pc19ub3RpY2VfZmlsZSkkKF9pc19kZXhwcmVvcHRfaW1hZ2VfcHJvZmlsZSkkKF9pc19wcm9kdWN0X3N5c3RlbV9vdGhlcl9hdmJrZXkpJChfaXNfZXZlbnRfbG9nX3RhZ3NfZmlsZSkkKF9pc19zeXN0ZW1fb3RoZXJfb2RleF9tYXJrZXIpJChfaXNfa2VybmVsX21vZHVsZXNfYmxvY2tsaXN0KSQoX2lzX2ZzdmVyaXR5X2J1aWxkX21hbmlmZXN0X2FwaykkKF9pc19saW5rZXJfY29uZmlnKSQoX2lzX3BhcnRpdGlvbl9jb21wYXRfc3ltbGluaykkKF9pc19mbGFnc19maWxlKSQoX2lzX3Jvb3RkaXJfc3ltbGluaykpIFwKKwkgICQoZXZhbCBfc3RhdGljX2xpYnMgOj0gJChBTExfSU5TVEFMTEVEX0ZJTEVTLiRmLlNUQVRJQ19MSUJSQVJJRVMpKSBcCisJICAkKGV2YWwgX3dob2xlX3N0YXRpY19saWJzIDo9ICQoQUxMX0lOU1RBTExFRF9GSUxFUy4kZi5XSE9MRV9TVEFUSUNfTElCUkFSSUVTKSkgXAorCSAgJChmb3JlYWNoIGwsJChfc3RhdGljX2xpYnMpLCQoZXZhbCBfYWxsX3N0YXRpY19saWJzICs9ICRsOiQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJGwuUEFUSCkpKTokKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiRsLlNPT05HX01PRFVMRV9UWVBFKSkpOiQoQUxMX1NUQVRJQ19MSUJSQVJJRVMuJGwuQlVJTFRfRklMRSkpKSBcCisJICAkKGZvcmVhY2ggbCwkKF93aG9sZV9zdGF0aWNfbGlicyksJChldmFsIF9hbGxfc3RhdGljX2xpYnMgKz0gJGw6JChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kbC5QQVRIKSkpOiQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJGwuU09PTkdfTU9EVUxFX1RZUEUpKSk6JChBTExfU1RBVElDX0xJQlJBUklFUy4kbC5CVUlMVF9GSUxFKSkpIFwKKwkgIGVjaG8gJy8kKF9wYXRoX29uX2RldmljZSksJChfbW9kdWxlX3BhdGgpLCQoX3Nvb25nX21vZHVsZV90eXBlKSwkKF9pc19wcmVidWlsdF9tYWtlX21vZHVsZSksJChfcHJvZHVjdF9jb3B5X2ZpbGVzKSwkKF9rZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMpLCQoX2lzX3BsYXRmb3JtX2dlbmVyYXRlZCksJChfYnVpbGRfb3V0cHV0X3BhdGgpLCQoX3N0YXRpY19saWJzKSwkKF93aG9sZV9zdGF0aWNfbGlicyksJyA+PiAkQDsgXAorCSkKKwkkKGZvcmVhY2ggbCwkKHNvcnQgJChfYWxsX3N0YXRpY19saWJzKSksIFwKKwkgICQoZXZhbCBfbGliX3N0ZW0gOj0gJChjYWxsIHdvcmQtY29sb24sMSwkbCkpIFwKKwkgICQoZXZhbCBfbW9kdWxlX3BhdGggOj0gJChjYWxsIHdvcmQtY29sb24sMiwkbCkpIFwKKwkgICQoZXZhbCBfc29vbmdfbW9kdWxlX3R5cGUgOj0gJChjYWxsIHdvcmQtY29sb24sMywkbCkpIFwKKwkgICQoZXZhbCBfYnVpbHRfZmlsZSA6PSAkKGNhbGwgd29yZC1jb2xvbiw0LCRsKSkgXAorCSAgJChldmFsIF9zdGF0aWNfbGlicyA6PSAkKEFMTF9TVEFUSUNfTElCUkFSSUVTLiRsLlNUQVRJQ19MSUJSQVJJRVMpKSBcCisJICAkKGV2YWwgX3dob2xlX3N0YXRpY19saWJzIDo9ICQoQUxMX1NUQVRJQ19MSUJSQVJJRVMuJGwuV0hPTEVfU1RBVElDX0xJQlJBUklFUykpIFwKKwkgICQoZXZhbCBfaXNfc3RhdGljX2xpYiA6PSBZKSBcCisJICBlY2hvICckKF9saWJfc3RlbSkuYSwkKF9tb2R1bGVfcGF0aCksJChfc29vbmdfbW9kdWxlX3R5cGUpLCwsLCwkKF9idWlsdF9maWxlKSwkKF9zdGF0aWNfbGlicyksJChfd2hvbGVfc3RhdGljX2xpYnMpLCQoX2lzX3N0YXRpY19saWIpJyA+PiAkQDsgXAorCSkKKworIyBDcmVhdGUgbWV0YWRhdGEgZm9yIGNvbXBsaWFuY2Ugc3VwcG9ydCBpbiBTb29uZworLlBIT05ZOiBtYWtlLWNvbXBsaWFuY2UtbWV0YWRhdGEKK21ha2UtY29tcGxpYW5jZS1tZXRhZGF0YTogXAorICAgICQoU09PTkdfT1VUX0RJUikvY29tcGxpYW5jZS1tZXRhZGF0YS8kKFRBUkdFVF9QUk9EVUNUKS9tYWtlLW1ldGFkYXRhLmNzdiBcCisgICAgJChTT09OR19PVVRfRElSKS9jb21wbGlhbmNlLW1ldGFkYXRhLyQoVEFSR0VUX1BST0RVQ1QpL21ha2UtbW9kdWxlcy5jc3YKKworJChTT09OR19PVVRfRElSKS9jb21wbGlhbmNlLW1ldGFkYXRhLyQoVEFSR0VUX1BST0RVQ1QpL21ha2UtbWV0YWRhdGEuY3N2OgorCXJtIC1mICRACisJZWNobyAnaW5zdGFsbGVkX2ZpbGUsbW9kdWxlX3BhdGgsaXNfc29vbmdfbW9kdWxlLGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlLHByb2R1Y3RfY29weV9maWxlcyxrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMsaXNfcGxhdGZvcm1fZ2VuZXJhdGVkLHN0YXRpY19saWJzLHdob2xlX3N0YXRpY19saWJzLGxpY2Vuc2VfdGV4dCcgPj4gJEAKKwkkKGZvcmVhY2ggZiwkKGluc3RhbGxlZF9maWxlcyksXAorCSAgJChldmFsIF9tb2R1bGVfbmFtZSA6PSAkKEFMTF9JTlNUQUxMRURfRklMRVMuJGYpKSBcCisJICAkKGV2YWwgX3BhdGhfb25fZGV2aWNlIDo9ICQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwlLCRmKSkgXAorCSAgJChldmFsIF9idWlsZF9vdXRwdXRfcGF0aCA6PSAkKFBST0RVQ1RfT1VUKS8kKF9wYXRoX29uX2RldmljZSkpIFwKKwkgICQoZXZhbCBfbW9kdWxlX3BhdGggOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuUEFUSCkpKSkgXAorCSAgJChldmFsIF9pc19zb29uZ19tb2R1bGUgOj0gJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuSVNfU09PTkdfTU9EVUxFKSkgXAorCSAgJChldmFsIF9pc19wcmVidWlsdF9tYWtlX21vZHVsZSA6PSAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5JU19QUkVCVUlMVF9NQUtFX01PRFVMRSkpIFwKKwkgICQoZXZhbCBfcHJvZHVjdF9jb3B5X2ZpbGVzIDo9ICQoc29ydCAkKGZpbHRlciAlOiQoX3BhdGhfb25fZGV2aWNlKSwkKHByb2R1Y3RfY29weV9maWxlc193aXRob3V0X293bmVyKSkpKSBcCisJICAkKGV2YWwgX2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyA6PSAkKHNvcnQgJChmaWx0ZXIgJSQoX3BhdGhfb25fZGV2aWNlKSwkKEtFUk5FTF9NT0RVTEVfQ09QWV9GSUxFUykpKSkgXAorCSAgJChldmFsIF9pc19idWlsZF9wcm9wIDo9ICQoY2FsbCBpcy1idWlsZC1wcm9wLCRmKSkgXAorCSAgJChldmFsIF9pc19ub3RpY2VfZmlsZSA6PSAkKGNhbGwgaXMtbm90aWNlLWZpbGUsJGYpKSBcCisJICAkKGV2YWwgX2lzX2RleHByZW9wdF9pbWFnZV9wcm9maWxlIDo9ICQoaWYgJChmaWx0ZXIgJTovJChfcGF0aF9vbl9kZXZpY2UpLCQoREVYUFJFT1BUX0lNQUdFX1BST0ZJTEVfQlVJTFRfSU5TVEFMTEVEKSksWSkpIFwKKwkgICQoZXZhbCBfaXNfcHJvZHVjdF9zeXN0ZW1fb3RoZXJfYXZia2V5IDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoSU5TVEFMTEVEX1BST0RVQ1RfU1lTVEVNX09USEVSX0FWQktFWV9UQVJHRVQpKSxZKSkgXAorCSAgJChldmFsIF9pc19ldmVudF9sb2dfdGFnc19maWxlIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoZXZlbnRfbG9nX3RhZ3NfZmlsZSkpLFkpKSBcCisJICAkKGV2YWwgX2lzX3N5c3RlbV9vdGhlcl9vZGV4X21hcmtlciA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwkKElOU1RBTExFRF9TWVNURU1fT1RIRVJfT0RFWF9NQVJLRVIpKSxZKSkgXAorCSAgJChldmFsIF9pc19rZXJuZWxfbW9kdWxlc19ibG9ja2xpc3QgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChBTExfS0VSTkVMX01PRFVMRVNfQkxPQ0tMSVNUKSksWSkpIFwKKwkgICQoZXZhbCBfaXNfZnN2ZXJpdHlfYnVpbGRfbWFuaWZlc3RfYXBrIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoQUxMX0ZTVkVSSVRZX0JVSUxEX01BTklGRVNUX0FQSykpLFkpKSBcCisJICAkKGV2YWwgX2lzX2xpbmtlcl9jb25maWcgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChTWVNURU1fTElOS0VSX0NPTkZJRykgJCh2ZW5kb3JfbGlua2VyX2NvbmZpZ19maWxlKSksWSkpIFwKKwkgICQoZXZhbCBfaXNfcGFydGl0aW9uX2NvbXBhdF9zeW1saW5rIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoUEFSVElUSU9OX0NPTVBBVF9TWU1MSU5LUykpLFkpKSBcCisJICAkKGV2YWwgX2lzX2ZsYWdzX2ZpbGUgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsICQoQUxMX0ZMQUdTX0ZJTEVTKSksWSkpIFwKKwkgICQoZXZhbCBfaXNfcm9vdGRpcl9zeW1saW5rIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCAkKEFMTF9ST09URElSX1NZTUxJTktTKSksWSkpIFwKKwkgICQoZXZhbCBfaXNfcGxhdGZvcm1fZ2VuZXJhdGVkIDo9ICQoX2lzX2J1aWxkX3Byb3ApJChfaXNfbm90aWNlX2ZpbGUpJChfaXNfZGV4cHJlb3B0X2ltYWdlX3Byb2ZpbGUpJChfaXNfcHJvZHVjdF9zeXN0ZW1fb3RoZXJfYXZia2V5KSQoX2lzX2V2ZW50X2xvZ190YWdzX2ZpbGUpJChfaXNfc3lzdGVtX290aGVyX29kZXhfbWFya2VyKSQoX2lzX2tlcm5lbF9tb2R1bGVzX2Jsb2NrbGlzdCkkKF9pc19mc3Zlcml0eV9idWlsZF9tYW5pZmVzdF9hcGspJChfaXNfbGlua2VyX2NvbmZpZykkKF9pc19wYXJ0aXRpb25fY29tcGF0X3N5bWxpbmspJChfaXNfZmxhZ3NfZmlsZSkkKF9pc19yb290ZGlyX3N5bWxpbmspKSBcCisJICAkKGV2YWwgX3N0YXRpY19saWJzIDo9ICQoaWYgJChfaXNfc29vbmdfbW9kdWxlKSwsJChBTExfSU5TVEFMTEVEX0ZJTEVTLiRmLlNUQVRJQ19MSUJSQVJJRVMpKSkgXAorCSAgJChldmFsIF93aG9sZV9zdGF0aWNfbGlicyA6PSAkKGlmICQoX2lzX3Nvb25nX21vZHVsZSksLCQoQUxMX0lOU1RBTExFRF9GSUxFUy4kZi5XSE9MRV9TVEFUSUNfTElCUkFSSUVTKSkpIFwKKwkgICQoZXZhbCBfbGljZW5zZV90ZXh0IDo9ICQoaWYgJChmaWx0ZXIgJChfYnVpbGRfb3V0cHV0X3BhdGgpLCQoQUxMX05PTl9NT0RVTEVTKSksJChBTExfTk9OX01PRFVMRVMuJChfYnVpbGRfb3V0cHV0X3BhdGgpLk5PVElDRVMpKSkgXAorCSAgZWNobyAnJChfYnVpbGRfb3V0cHV0X3BhdGgpLCQoX21vZHVsZV9wYXRoKSwkKF9pc19zb29uZ19tb2R1bGUpLCQoX2lzX3ByZWJ1aWx0X21ha2VfbW9kdWxlKSwkKF9wcm9kdWN0X2NvcHlfZmlsZXMpLCQoX2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyksJChfaXNfcGxhdGZvcm1fZ2VuZXJhdGVkKSwkKF9zdGF0aWNfbGlicyksJChfd2hvbGVfc3RhdGljX2xpYnMpLCQoX2xpY2Vuc2VfdGV4dCknID4+ICRAOyBcCisJKQorCiskKFNPT05HX09VVF9ESVIpL2NvbXBsaWFuY2UtbWV0YWRhdGEvJChUQVJHRVRfUFJPRFVDVCkvbWFrZS1tb2R1bGVzLmNzdjoKKwlybSAtZiAkQAorCWVjaG8gJ25hbWUsbW9kdWxlX3BhdGgsbW9kdWxlX2NsYXNzLG1vZHVsZV90eXBlLHN0YXRpY19saWJzLHdob2xlX3N0YXRpY19saWJzLGJ1aWx0X2ZpbGVzLGluc3RhbGxlZF9maWxlcycgPj4gJEAKKwkkKGZvcmVhY2ggbSwkKEFMTF9NT0RVTEVTKSwgXAorCSAgJChldmFsIF9tb2R1bGVfbmFtZSA6PSAkbSkgXAorCSAgJChldmFsIF9tb2R1bGVfcGF0aCA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5QQVRIKSkpKSBcCisJICAkKGV2YWwgX21ha2VfbW9kdWxlX2NsYXNzIDo9ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLkNMQVNTKSkgXAorCSAgJChldmFsIF9tYWtlX21vZHVsZV90eXBlIDo9ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLk1BS0VfTU9EVUxFX1RZUEUpKSBcCisJICAkKGV2YWwgX3N0YXRpY19saWJzIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLlNUQVRJQ19MSUJTKSkpKSBcCisJICAkKGV2YWwgX3dob2xlX3N0YXRpY19saWJzIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLldIT0xFX1NUQVRJQ19MSUJTKSkpKSBcCisJICAkKGV2YWwgX2J1aWx0X2ZpbGVzIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLkJVSUxUKSkpKSBcCisJICAkKGV2YWwgX2luc3RhbGxlZF9maWxlcyA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5JTlNUQUxMRUQpKSkpIFwKKwkgICQoZXZhbCBfaXNfc29vbmdfbW9kdWxlIDo9ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLklTX1NPT05HX01PRFVMRSkpIFwKKwkgICQoaWYgJChfaXNfc29vbmdfbW9kdWxlKSwsIFwKKwkJZWNobyAnJChfbW9kdWxlX25hbWUpLCQoX21vZHVsZV9wYXRoKSwkKF9tYWtlX21vZHVsZV9jbGFzcyksJChfbWFrZV9tb2R1bGVfdHlwZSksJChfc3RhdGljX2xpYnMpLCQoX3dob2xlX3N0YXRpY19saWJzKSwkKF9idWlsdF9maWxlcyksJChfaW5zdGFsbGVkX2ZpbGVzKScgPj4gJEA7IFwKIAkgICkgXAogCSkKIAorJChTT09OR19PVVRfRElSKS9jb21wbGlhbmNlLW1ldGFkYXRhLyQoVEFSR0VUX1BST0RVQ1QpL2luc3RhbGxlZF9maWxlcy5zdGFtcDogJChpbnN0YWxsZWRfZmlsZXMpCisJdG91Y2ggJEAKKworIyAoVE9ETzogYi8yNzIzNTg1ODMgZmluZCBhbm90aGVyIHdheSBvZiBhbHdheXMgcmVidWlsZGluZyBzYm9tLnNwZHgpCisjIFJlbW92ZSB0aGUgYWx3YXlzX2RpcnR5X2ZpbGUudHh0IHdoZW5ldmVyIHRoZSBtYWtlZmlsZSBpcyBldmFsdWF0ZWQKKyQoc2hlbGwgcm0gLWYgJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0KQorJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0OgorCXRvdWNoICRACisKIC5QSE9OWTogc2JvbQogaWZlcSAoJChUQVJHRVRfQlVJTERfQVBQUyksKQogc2JvbTogJChQUk9EVUNUX09VVCkvc2JvbS5zcGR4Lmpzb24KICQoUFJPRFVDVF9PVVQpL3Nib20uc3BkeC5qc29uOiAkKFBST0RVQ1RfT1VUKS9zYm9tLnNwZHgKLSQoUFJPRFVDVF9PVVQpL3Nib20uc3BkeDogJChQUk9EVUNUX09VVCkvc2JvbS1tZXRhZGF0YS5jc3YgJChHRU5fU0JPTSkKKyQoUFJPRFVDVF9PVVQpL3Nib20uc3BkeDogJChQUk9EVUNUX09VVCkvc2JvbS1tZXRhZGF0YS5jc3YgJChHRU5fU0JPTSkgJChpbnN0YWxsZWRfZmlsZXMpICQobWV0YWRhdGFfbGlzdCkgJChtZXRhZGF0YV9maWxlcykgJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0CiAJcm0gLXJmICRACiAJJChHRU5fU0JPTSkgLS1vdXRwdXRfZmlsZSAkQCAtLW1ldGFkYXRhICQoUFJPRFVDVF9PVVQpL3Nib20tbWV0YWRhdGEuY3N2IC0tYnVpbGRfdmVyc2lvbiAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZST01fRklMRSkgLS1wcm9kdWN0X21mciAiJChQUk9EVUNUX01BTlVGQUNUVVJFUikiIC0tanNvbgogCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWQsJChQUk9EVUNUX09VVCkvc2JvbS5zcGR4Lmpzb246c2JvbS9zYm9tLnNwZHguanNvbikKIGVsc2UKLWFwcHNfb25seV9zYm9tX2ZpbGVzIDo9ICQoc29ydCAkKHBhdHN1YnN0ICUsJS5zcGR4Lmpzb24sJChmaWx0ZXIgJS5hcGssJChhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzKSkpKQotJChhcHBzX29ubHlfc2JvbV9maWxlcyk6ICQoUFJPRFVDVF9PVVQpL3Nib20tbWV0YWRhdGEuY3N2ICQoR0VOX1NCT00pCi0Jcm0gLXJmICRACi0JJChHRU5fU0JPTSkgLS1vdXRwdXRfZmlsZSAkQCAtLW1ldGFkYXRhICQoUFJPRFVDVF9PVVQpL3Nib20tbWV0YWRhdGEuY3N2IC0tYnVpbGRfdmVyc2lvbiAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZST01fRklMRSkgLS1wcm9kdWN0X21mciAiJChQUk9EVUNUX01BTlVGQUNUVVJFUikiIC0tdW5idW5kbGVkX2FwaworIyBDcmVhdGUgYnVpbGQgcnVsZXMgZm9yIGdlbmVyYXRpbmcgU0JPTXMgb2YgdW5idW5kbGVkIEFQS3MgYW5kIEFQRVhzCisjICQxOiBzYm9tIGZpbGUKKyMgJDI6IHNib20gZnJhZ21lbnQgZmlsZQorIyAkMzogaW5zdGFsbGVkIGZpbGUKKyMgJDQ6IHNib20tbWV0YWRhdGEuY3N2IGZpbGUKK2RlZmluZSBnZW5lcmF0ZS1hcHAtc2JvbQorJChldmFsIF9wYXRoX29uX2RldmljZSA6PSAkKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpLyUsJSwkKDMpKSkKKyQoZXZhbCBfbW9kdWxlX25hbWUgOj0gJChBTExfSU5TVEFMTEVEX0ZJTEVTLiQoMykpKQorJChldmFsIF9tb2R1bGVfcGF0aCA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5QQVRIKSkpKQorJChldmFsIF9zb29uZ19tb2R1bGVfdHlwZSA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5TT09OR19NT0RVTEVfVFlQRSkpKSkKKyQoZXZhbCBfZGVwX21vZHVsZXMgOj0gJChmaWx0ZXIgJS4kKF9tb2R1bGVfbmFtZSksJChBTExfTU9EVUxFUykpICQoZmlsdGVyICUuJChfbW9kdWxlX25hbWUpJChUQVJHRVRfMk5EX0FSQ0hfTU9EVUxFX1NVRkZJWCksJChBTExfTU9EVUxFUykpKQorJChldmFsIF9pc19hcGV4IDo9ICQoZmlsdGVyICUuYXBleCwkKDMpKSkKKworJCg0KToKKwlybSAtcmYgJCRACisJZWNobyBpbnN0YWxsZWRfZmlsZSxtb2R1bGVfcGF0aCxzb29uZ19tb2R1bGVfdHlwZSxpc19wcmVidWlsdF9tYWtlX21vZHVsZSxwcm9kdWN0X2NvcHlfZmlsZXMsa2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzLGlzX3BsYXRmb3JtX2dlbmVyYXRlZCxidWlsZF9vdXRwdXRfcGF0aCxzdGF0aWNfbGlicmFyaWVzLHdob2xlX3N0YXRpY19saWJyYXJpZXMsaXNfc3RhdGljX2xpYiA+PiAkJEAKKwllY2hvIC8kKF9wYXRoX29uX2RldmljZSksJChfbW9kdWxlX3BhdGgpLCQoX3Nvb25nX21vZHVsZV90eXBlKSwsLCwsJCgzKSwsLCA+PiAkJEAKKwkkKGlmICQoZmlsdGVyICUuYXBleCwkKDMpKSxcCisJICAkKGZvcmVhY2ggbSwkKF9kZXBfbW9kdWxlcyksXAorCSAgICBlY2hvICQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvYXBleC8kKF9tb2R1bGVfbmFtZSkvJSwlLCQoQUxMX01PRFVMRVMuJG0uSU5TVEFMTEVEKSksJChzb3J0ICQoQUxMX01PRFVMRVMuJG0uUEFUSCkpLCQoc29ydCAkKEFMTF9NT0RVTEVTLiRtLlNPT05HX01PRFVMRV9UWVBFKSksLCwsLCQoc3RyaXAgJChBTExfTU9EVUxFUy4kbS5CVUlMVCkpLCwsID4+ICQkQDspKQorCiskKDIpOiAkKDEpCiskKDEpOiAkKDQpICQoMykgJChHRU5fU0JPTSkgJChpbnN0YWxsZWRfZmlsZXMpICQobWV0YWRhdGFfbGlzdCkgJChtZXRhZGF0YV9maWxlcykKKwlybSAtcmYgJCRACisJJChHRU5fU0JPTSkgLS1vdXRwdXRfZmlsZSAkJEAgLS1tZXRhZGF0YSAkKDQpIC0tYnVpbGRfdmVyc2lvbiAkJChCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUpIC0tcHJvZHVjdF9tZnIgIiQoUFJPRFVDVF9NQU5VRkFDVFVSRVIpIiAtLWpzb24gJChpZiAkKGZpbHRlciAlLmFwaywkKDMpKSwtLXVuYnVuZGxlZF9hcGssLS11bmJ1bmRsZWRfYXBleCkKK2VuZGVmCisKK2FwcHNfb25seV9zYm9tX2ZpbGVzIDo9CithcHBzX29ubHlfZnJhZ21lbnRfZmlsZXMgOj0KKyQoZm9yZWFjaCBmLCQoZmlsdGVyICUuYXBrICUuYXBleCwkKGluc3RhbGxlZF9maWxlcykpLCBcCisgICQoZXZhbCBfbWV0YWRhdGFfY3N2X2ZpbGUgOj0gJChwYXRzdWJzdCAlLCUtc2JvbS1tZXRhZGF0YS5jc3YsJGYpKSBcCisgICQoZXZhbCBfc2JvbV9maWxlIDo9ICQocGF0c3Vic3QgJSwlLnNwZHguanNvbiwkZikpIFwKKyAgJChldmFsIF9mcmFnbWVudF9maWxlIDo9ICQocGF0c3Vic3QgJSwlLWZyYWdtZW50LnNwZHgsJGYpKSBcCisgICQoZXZhbCBhcHBzX29ubHlfc2JvbV9maWxlcyArPSAkKF9zYm9tX2ZpbGUpKSBcCisgICQoZXZhbCBhcHBzX29ubHlfZnJhZ21lbnRfZmlsZXMgKz0gJChfZnJhZ21lbnRfZmlsZSkpIFwKKyAgJChldmFsICQoY2FsbCBnZW5lcmF0ZS1hcHAtc2JvbSwkKF9zYm9tX2ZpbGUpLCQoX2ZyYWdtZW50X2ZpbGUpLCRmLCQoX21ldGFkYXRhX2Nzdl9maWxlKSkpIFwKKykKIAogc2JvbTogJChhcHBzX29ubHlfc2JvbV9maWxlcykKIAotJChmb3JlYWNoIGYsJChhcHBzX29ubHlfc2JvbV9maWxlcyksJChldmFsICQocGF0c3Vic3QgJS5zcGR4Lmpzb24sJS1mcmFnbWVudC5zcGR4LCRmKTogJGYpKQotYXBwc19vbmx5X2ZyYWdtZW50X2ZpbGVzIDo9ICQocGF0c3Vic3QgJS5zcGR4Lmpzb24sJS1mcmFnbWVudC5zcGR4LCQoYXBwc19vbmx5X3Nib21fZmlsZXMpKQogJChmb3JlYWNoIGYsJChhcHBzX29ubHlfZnJhZ21lbnRfZmlsZXMpLCQoZXZhbCBhcHBzX29ubHlfZnJhZ21lbnRfZGlzdF9maWxlcyArPSA6c2JvbS8kKG5vdGRpciAkZikpKQotCiAkKGZvcmVhY2ggZiwkKGFwcHNfb25seV9zYm9tX2ZpbGVzKSwkKGV2YWwgYXBwc19vbmx5X3Nib21fZGlzdF9maWxlcyArPSA6c2JvbS8kKG5vdGRpciAkZikpKQogJChjYWxsIGRpc3QtZm9yLWdvYWxzLGFwcHNfb25seSwkKGpvaW4gJChhcHBzX29ubHlfc2JvbV9maWxlcyksJChhcHBzX29ubHlfc2JvbV9kaXN0X2ZpbGVzKSkgJChqb2luICQoYXBwc19vbmx5X2ZyYWdtZW50X2ZpbGVzKSwkKGFwcHNfb25seV9mcmFnbWVudF9kaXN0X2ZpbGVzKSkpCiBlbmRpZgogCiAkKGNhbGwgZGlzdC13cml0ZS1maWxlLCQoS0FUSV9QQUNLQUdFX01LX0RJUikvZGlzdC5taykKIAotJChpbmZvIFskKGNhbGwgaW5jX2FuZF9wcmludCxzdWJkaXJfbWFrZWZpbGVzX2luYykvJChzdWJkaXJfbWFrZWZpbGVzX3RvdGFsKV0gd3JpdGluZyBidWlsZCBydWxlcyAuLi4pCiskKGluZm8gWyQoY2FsbCBpbmNfYW5kX3ByaW50LHN1YmRpcl9tYWtlZmlsZXNfaW5jKS8kKHN1YmRpcl9tYWtlZmlsZXNfdG90YWwpXSB3cml0aW5nIGxlZ2FjeSBNYWtlIG1vZHVsZSBydWxlcyAuLi4pCmRpZmYgLS1naXQgYS9jb3JlL21pc2NfcHJlYnVpbHRfaW50ZXJuYWwubWsgYi9jb3JlL21pc2NfcHJlYnVpbHRfaW50ZXJuYWwubWsKaW5kZXggOTIxZWE1Mi4uYTU2MjIwNyAxMDA2NDQKLS0tIGEvY29yZS9taXNjX3ByZWJ1aWx0X2ludGVybmFsLm1rCisrKyBiL2NvcmUvbWlzY19wcmVidWlsdF9pbnRlcm5hbC5tawpAQCAtMjcsOSArMjcsNiBAQAogCiBpZm5lcSAoJChmaWx0ZXIgaW5pdCVyYywkKG5vdGRpciAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpKSkkKGZpbHRlciAlL2V0Yy9pbml0LCQoZGlyICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkpKSwpCiAgICQoZXZhbCAkKGNhbGwgY29weS1pbml0LXNjcmlwdC1maWxlLWNoZWNrZWQsJChteV9wcmVidWlsdF9zcmNfZmlsZSksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKLWVsc2UgaWZuZXEgKCQoTE9DQUxfUFJFQlVJTFRfU1RSSVBfQ09NTUVOVFMpLCkKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQobXlfcHJlYnVpbHRfc3JjX2ZpbGUpCi0JJCh0cmFuc2Zvcm0tcHJlYnVpbHQtdG8tdGFyZ2V0LXN0cmlwLWNvbW1lbnRzKQogZWxzZQogJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChteV9wcmVidWlsdF9zcmNfZmlsZSkKIAkkKHRyYW5zZm9ybS1wcmVidWlsdC10by10YXJnZXQpCmRpZmYgLS1naXQgYS9jb3JlL211bHRpX3ByZWJ1aWx0Lm1rIGIvY29yZS9tdWx0aV9wcmVidWlsdC5tawppbmRleCBjOTdkNDgxLi40MTU0MDFiIDEwMDY0NAotLS0gYS9jb3JlL211bHRpX3ByZWJ1aWx0Lm1rCisrKyBiL2NvcmUvbXVsdGlfcHJlYnVpbHQubWsKQEAgLTEzMiwzICsxMzIsNSBAQAogcHJlYnVpbHRfc3RhdGljX2phdmFfbGlicmFyaWVzIDo9CiBwcmVidWlsdF9pc19ob3N0IDo9CiBwcmVidWlsdF9tb2R1bGVfdGFncyA6PQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9TVVMVElfUFJFQlVJTFQpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvbmF0aXZlX3Rlc3QubWsgYi9jb3JlL25hdGl2ZV90ZXN0Lm1rCmluZGV4IDhiNDlmYmQuLmMxMmIyMTEgMTAwNjQ0Ci0tLSBhL2NvcmUvbmF0aXZlX3Rlc3QubWsKKysrIGIvY29yZS9uYXRpdmVfdGVzdC5tawpAQCAtMjEsMyArMjEsNSBAQAogZW5kaWYKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1OQVRJVkVfVEVTVCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9uaW5qYV9jb25maWcubWsgYi9jb3JlL25pbmphX2NvbmZpZy5tawppbmRleCAyYjVjZWVlLi5kNGI3YzZkIDEwMDY0NAotLS0gYS9jb3JlL25pbmphX2NvbmZpZy5taworKysgYi9jb3JlL25pbmphX2NvbmZpZy5tawpAQCAtMTQsNyArMTQsNiBAQAogCSQoUEFSU0VfVElNRV9NQUtFX0dPQUxTKSBcCiAJJChkb250X2JvdGhlcl9nb2FscykgXAogCWFsbCBcCi0JRUNMSVBTRS0lIFwKIAlicmlsbG9fdGVzdHMgXAogCWJ0bm9kIFwKIAlidWlsZC1hcnQlIFwKZGlmZiAtLWdpdCBhL2NvcmUvbm9kZV9mbnMubWsgYi9jb3JlL25vZGVfZm5zLm1rCmluZGV4IDE0NGViOGIuLmQyY2VlOWUgMTAwNjQ0Ci0tLSBhL2NvcmUvbm9kZV9mbnMubWsKKysrIGIvY29yZS9ub2RlX2Zucy5tawpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICQoY2FsbCBfZXhwYW5kLWluaGVyaXRlZC12YWx1ZXMsJCgxKSwkKDIpLCQoMyksJCg0KSkKIAogICAkKGV2YWwgJCgxKS4kKDIpLmluaGVyaXRlZCA6PSkKLSAgJChldmFsIF9pbmNsdWRlX3N0YWNrIDo9ICQod29yZGxpc3QgMiw5OTk5LCQkKF9pbmNsdWRlX3N0YWNrKSkpCisgICQoZXZhbCBfaW5jbHVkZV9zdGFjayA6PSAkKHdvcmRsaXN0IDIsOTk5OSwkKF9pbmNsdWRlX3N0YWNrKSkpCiBlbmRlZgogCiAjCmRpZmYgLS1naXQgYS9jb3JlL25vdGljZV9maWxlcy5tayBiL2NvcmUvbm90aWNlX2ZpbGVzLm1rCmluZGV4IGE1ODUyY2MuLjY5MzUxMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvbm90aWNlX2ZpbGVzLm1rCisrKyBiL2NvcmUvbm90aWNlX2ZpbGVzLm1rCkBAIC0xLDE2NyArMSwxNDQgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBUcmFjayBOT1RJQ0UgZmlsZXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0kKGNhbGwgcmVjb3JkLW1vZHVsZS10eXBlLE5PVElDRV9GSUxFKQogCi1pZm5lcSAoJChMT0NBTF9OT1RJQ0VfRklMRSksKQotbm90aWNlX2ZpbGU6PSQoc3RyaXAgJChMT0NBTF9OT1RJQ0VfRklMRSkpCittb2R1bGVfbGljZW5zZV9tZXRhZGF0YSA6PSAkKGNhbGwgbG9jYWwtbWV0YS1pbnRlcm1lZGlhdGVzLWRpcikvJChteV9yZWdpc3Rlcl9uYW1lKS5tZXRhX2xpYworCiskKGZvcmVhY2ggdGFyZ2V0LCQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVCkgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRCkgJChmb3JlYWNoIGJpLCQoTE9DQUxfU09PTkdfQlVJTFRfSU5TVEFMTEVEKSwkKGNhbGwgd29yZC1jb2xvbiwxLCQoYmkpKSksXAorICAkKGV2YWwgQUxMX1RBUkdFVFMuJCh0YXJnZXQpLk1FVEFfTElDIDo9ICQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpKSkKKworJChmb3JlYWNoIGYsJChteV90ZXN0X2RhdGEpICQobXlfdGVzdF9jb25maWcpLFwKKyAgJChpZiAkKHN0cmlwICQoQUxMX1RBUkdFVFMuJChjYWxsIHdvcmQtY29sb24sMSwkKGYpKS5NRVRBX0xJQykpLCBcCisgICAgJChjYWxsIGRlY2xhcmUtY29weS10YXJnZXQtbGljZW5zZS1tZXRhZGF0YSwkKGNhbGwgd29yZC1jb2xvbiwyLCQoZikpLCQoY2FsbCB3b3JkLWNvbG9uLDEsJChmKSkpLCBcCisgICAgJChldmFsIEFMTF9UQVJHRVRTLiQoY2FsbCB3b3JkLWNvbG9uLDIsJChmKSkuTUVUQV9MSUMgOj0gJChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkpKSkKKworQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NRVRBX0xJQyA6PSAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NRVRBX0xJQykgJChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkpCisKK2lmZGVmIExPQ0FMX1NPT05HX0xJQ0VOU0VfTUVUQURBVEEKKyAgIyBTb29uZyBtb2R1bGVzIGhhdmUgYWxyZWFkeSBwcm9kdWNlZCBhIGxpY2Vuc2UgbWV0YWRhdGEgZmlsZSwgY29weSBpdCB0byB3aGVyZSBNYWtlIGV4cGVjdHMgaXQuCisgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtbGljZW5zZS1tZXRhZGF0YS1maWxlLCAkKExPQ0FMX1NPT05HX0xJQ0VOU0VfTUVUQURBVEEpLCAkKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKSwkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFQpLCQoQUxMX01PRFVFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRCkpKQogZWxzZQotbm90aWNlX2ZpbGU6PSQoc3RyaXAgJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL0xJQ0VOU0UgJChMT0NBTF9QQVRIKS9MSUNFTkNFICQoTE9DQUxfUEFUSCkvTk9USUNFKSkKLWVuZGlmCisgICMgTWFrZSBtb2R1bGVzIGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHByb2R1Y2UgYSBsaWNlbnNlIG1ldGFkYXRhIHJ1bGUgdW50aWwgYWZ0ZXIgZml4LW5vdGljZS1kZXBzCisgICMgaGFzIGJlZW4gY2FsbGVkLCBzdG9yZSB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHVudGlsIGxhdGVyLgogCi1pZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX1BBQ0tBR0VfTkFNRSkpKQotbGljZW5zZV9wYWNrYWdlX25hbWU6PSQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX1BBQ0tBR0VfTkFNRSkpCi1lbHNlCi1saWNlbnNlX3BhY2thZ2VfbmFtZTo9Ci1lbmRpZgotCi1pZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX0lOU1RBTExfTUFQKSkpCi1pbnN0YWxsX21hcDo9JChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfSU5TVEFMTF9NQVApKQotZWxzZQotaW5zdGFsbF9tYXA6PQotZW5kaWYKLQotaWZuZXEgKCwkKHN0cmlwICQoTE9DQUxfTElDRU5TRV9LSU5EUykpKQotbGljZW5zZV9raW5kczo9JChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfS0lORFMpKQotZWxzZQotbGljZW5zZV9raW5kczo9bGVnYWN5X2J5X2V4Y2VwdGlvbl9vbmx5Ci1lbmRpZgotCi1pZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMpKSkKLWxpY2Vuc2VfY29uZGl0aW9uczo9JChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUykpCi1lbHNlCi1saWNlbnNlX2NvbmRpdGlvbnM6PWJ5X2V4Y2VwdGlvbl9vbmx5Ci1lbmRpZgotCi1pZmVxICgkKExPQ0FMX01PRFVMRV9DTEFTUyksR1lQKQotICAjIFdlIGlnbm9yZSBOT1RJQ0UgZmlsZXMgZm9yIG1vZHVsZXMgb2YgdHlwZSBHWVAuCi0gIG5vdGljZV9maWxlIDo9Ci1lbmRpZgotCi1pZmVxICgkKExPQ0FMX01PRFVMRV9DTEFTUyksRkFLRSkKLSAgIyBXZSBpZ25vcmUgTk9USUNFIGZpbGVzIGZvciBtb2R1bGVzIG9mIHR5cGUgRkFLRS4KLSAgbm90aWNlX2ZpbGUgOj0KLWVuZGlmCi0KLSMgU29vbmcgZ2VuZXJhdGVzIHN0dWIgbGlicmFyaWVzIHRoYXQgZG9uJ3QgbmVlZCBOT1RJQ0UgZmlsZXMKLWlmZGVmIExPQ0FMX05PX05PVElDRV9GSUxFCi0gIGlmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKLSAgICAkKGNhbGwgcHJldHR5LWVycm9yLExPQ0FMX05PX05PVElDRV9GSUxFIHNob3VsZCBub3QgYmUgdXNlZCBieSBBbmRyb2lkLm1rIGZpbGVzKQotICBlbmRpZgotICBub3RpY2VfZmlsZSA6PQotZW5kaWYKLQotaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLE5PVElDRV9GSUxFUykKLSMgSWYgdGhpcyBpcyBhIE5PVElDRS1vbmx5IG1vZHVsZSwgd2UgZG9uJ3QgaW5jbHVkZSBiYXNlX3J1bGUubWssCi0jIHNvIG15X3ByZWZpeCBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQuCi1pZmVxICgkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSx0cnVlKQotICBteV9wcmVmaXggOj0gSE9TVF8KLSAgTE9DQUxfSE9TVF9QUkVGSVggOj0KLWVsc2UKLSAgbXlfcHJlZml4IDo9IFRBUkdFVF8KLWVuZGlmCi1lbmRpZgotCi1pbnN0YWxsZWRfbm90aWNlX2ZpbGUgOj0KLQotaXNfY29udGFpbmVyOj0kKHN0cmlwICQoTE9DQUxfTU9EVUxFX0lTX0NPTlRBSU5FUikpCi1pZmVxICgsJChpc19jb250YWluZXIpKQotaWZuZXEgKCwkKHN0cmlwICQoZmlsdGVyICUuemlwICUudGFyICUudGd6ICUudGFyLmd6ICUuYXBrICUuaW1nICUuc3Jjc3ppcCAlLmFwZXgsICQoTE9DQUxfQlVJTFRfTU9EVUxFKSkpKQotaXNfY29udGFpbmVyOj10cnVlCi1lbHNlCi1pc19jb250YWluZXI6PWZhbHNlCi1lbmRpZgotZWxzZSBpZm5lcSAoLCQoc3RyaXAgJChmaWx0ZXItb3V0IHRydWUgZmFsc2UsJChpc19jb250YWluZXIpKSkpCi0kKGVycm9yIFVucmVjb2duaXplZCB2YWx1ZSAnJChpc19jb250YWluZXIpJyBmb3IgTE9DQUxfTU9EVUxFX0lTX0NPTlRBSU5FUikKLWVuZGlmCi0KLWlmZXEgKHRydWUsJChpc19jb250YWluZXIpKQotIyBJbmNsdWRlIHNoYXJlZCBsaWJyYXJpZXMnIG5vdGljZXMgZm9yICJjb250YWluZXIiIHR5cGVzLCBidXQgbm90IGZvciBiaW5hcmllcyBldGMuCi1ub3RpY2VfZGVwcyA6PSBcCi0gICAgJChzdHJpcCBcCi0gICAgICAgICQoZm9yZWFjaCBkLCBcCi0gICAgICAgICAgICAkKExPQ0FMX1JFUVVJUkVEX01PRFVMRVMpIFwKLSAgICAgICAgICAgICQoTE9DQUxfU1RBVElDX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMpIFwKLSAgICAgICAgICAgICQoTE9DQUxfRFlMSUJfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX1JMSUJfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX1BST0NfTUFDUk9fTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX0hFQURFUl9MSUJSQVJJRVMpIFwKLSAgICAgICAgICAgICQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAsJChzdWJzdCA6LF8sJChkKSk6c3RhdGljIFwKLSAgICAgICAgKSBcCi0gICAgKQotZWxzZQotbm90aWNlX2RlcHMgOj0gXAotICAgICQoc3RyaXAgXAotICAgICAgICAkKGZvcmVhY2ggZCwgXAotICAgICAgICAgICAgJChMT0NBTF9SRVFVSVJFRF9NT0RVTEVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpIFwKLSAgICAgICAgICAgICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9STElCX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9QUk9DX01BQ1JPX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9IRUFERVJfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUykgXAotICAgICAgICAgICAgLCQoc3Vic3QgOixfLCQoZCkpOnN0YXRpYyBcCi0gICAgICAgICkkKGZvcmVhY2ggZCwgXAotICAgICAgICAgICAgJChMT0NBTF9TSEFSRURfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX0RZTElCX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9KQVZBX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUykgXAotICAgICAgICAgICAgLCQoc3Vic3QgOixfLCQoZCkpOmR5bmFtaWMgXAotICAgICAgICApIFwKLSAgICApCi1lbmRpZgotaWZlcSAoJChMT0NBTF9JU19IT1NUX01PRFVMRSksdHJ1ZSkKLW5vdGljZV9kZXBzIDo9ICQoc3RyaXAgJChub3RpY2VfZGVwcykgJChmb3JlYWNoIGQsJChMT0NBTF9IT1NUX1JFUVVJUkVEX01PRFVMRVMpLCQoc3Vic3QgOixfLCQoZCkpOnN0YXRpYykpCi1lbHNlCi1ub3RpY2VfZGVwcyA6PSAkKHN0cmlwICQobm90aWNlX2RlcHMpICQoZm9yZWFjaCBkLCQoTE9DQUxfVEFSR0VUX1JFUVVJUkVEX01PRFVMRVMpLCQoc3Vic3QgOixfLCQoZCkpOnN0YXRpYykpCi1lbmRpZgotCi1sb2NhbF9wYXRoIDo9ICQoTE9DQUxfUEFUSCkKLQotCi1tb2R1bGVfbGljZW5zZV9tZXRhZGF0YSA6PQotCi1pZmRlZiBteV9yZWdpc3Rlcl9uYW1lCi0gIG1vZHVsZV9saWNlbnNlX21ldGFkYXRhIDo9ICQoY2FsbCBsb2NhbC1tZXRhLWludGVybWVkaWF0ZXMtZGlyKS8kKG15X3JlZ2lzdGVyX25hbWUpLm1ldGFfbGljCi0KLSAgJChmb3JlYWNoIHRhcmdldCwkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFQpICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRUQpICQoZm9yZWFjaCBiaSwkKExPQ0FMX1NPT05HX0JVSUxUX0lOU1RBTExFRCksJChjYWxsIHdvcmQtY29sb24sMSwkKGJpKSkpLFwKLSAgICAkKGV2YWwgQUxMX1RBUkdFVFMuJCh0YXJnZXQpLk1FVEFfTElDIDo9ICQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpKSkKLQotICAkKGZvcmVhY2ggZiwkKG15X3Rlc3RfZGF0YSkgJChteV90ZXN0X2NvbmZpZyksXAotICAgICQoaWYgJChzdHJpcCAkKEFMTF9UQVJHRVRTLiQoY2FsbCB3b3JkLWNvbG9uLDEsJChmKSkuTUVUQV9MSUMpKSwgXAotICAgICAgJChjYWxsIGRlY2xhcmUtY29weS10YXJnZXQtbGljZW5zZS1tZXRhZGF0YSwkKGNhbGwgd29yZC1jb2xvbiwyLCQoZikpLCQoY2FsbCB3b3JkLWNvbG9uLDEsJChmKSkpLCBcCi0gICAgICAkKGV2YWwgQUxMX1RBUkdFVFMuJChjYWxsIHdvcmQtY29sb24sMiwkKGYpKS5NRVRBX0xJQyA6PSAkKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKSkpKQotCi0gIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUVUQV9MSUMgOj0gJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUVUQV9MSUMpICQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpKQotCi0gIGlmZGVmIExPQ0FMX1NPT05HX0xJQ0VOU0VfTUVUQURBVEEKLSAgICAjIFNvb25nIG1vZHVsZXMgaGF2ZSBhbHJlYWR5IHByb2R1Y2VkIGEgbGljZW5zZSBtZXRhZGF0YSBmaWxlLCBjb3B5IGl0IHRvIHdoZXJlIE1ha2UgZXhwZWN0cyBpdC4KLSAgICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWxpY2Vuc2UtbWV0YWRhdGEtZmlsZSwgJChMT0NBTF9TT09OR19MSUNFTlNFX01FVEFEQVRBKSwgJChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSksJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkJVSUxUKSwkKEFMTF9NT0RVRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRUQpKSkKKyAgaWZuZXEgKCQoTE9DQUxfTk9USUNFX0ZJTEUpLCkKKyAgICBub3RpY2VfZmlsZTo9JChzdHJpcCAkKExPQ0FMX05PVElDRV9GSUxFKSkKICAgZWxzZQotICAgICMgTWFrZSBtb2R1bGVzIGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHByb2R1Y2UgYSBsaWNlbnNlIG1ldGFkYXRhIHJ1bGUgdW50aWwgYWZ0ZXIgZml4LW5vdGljZS1kZXBzCi0gICAgIyBoYXMgYmVlbiBjYWxsZWQsIHN0b3JlIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdW50aWwgbGF0ZXIuCi0gICAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5ERUxBWUVEX01FVEFfTElDIDo9ICQoc3RyaXAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkRFTEFZRURfTUVUQV9MSUMpICQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpKQotICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTElDRU5TRV9QQUNLQUdFX05BTUUgOj0gJChzdHJpcCAkKGxpY2Vuc2VfcGFja2FnZV9uYW1lKSkKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1PRFVMRV9UWVBFIDo9ICQoc3RyaXAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1PRFVMRV9UWVBFKSAkKExPQ0FMX01PRFVMRV9UWVBFKSkKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1PRFVMRV9DTEFTUyA6PSAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NT0RVTEVfQ0xBU1MpICQoTE9DQUxfTU9EVUxFX0NMQVNTKSkKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfS0lORFMgOj0gJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfS0lORFMpICQobGljZW5zZV9raW5kcykKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfQ09ORElUSU9OUyA6PSAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTElDRU5TRV9DT05ESVRJT05TKSAkKGxpY2Vuc2VfY29uZGl0aW9ucykKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfSU5TVEFMTF9NQVAgOj0gJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfSU5TVEFMTF9NQVApICQoaW5zdGFsbF9tYXApCi0gICAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5OT1RJQ0VfREVQUyA6PSAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFX0RFUFMpICQobm90aWNlX2RlcHMpCi0gICAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JU19DT05UQUlORVIgOj0gJChzdHJpcCAkKGZpbHRlci1vdXQgZmFsc2UsJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklTX0NPTlRBSU5FUikgJChpc19jb250YWluZXIpKSkKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBBVEggOj0gJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuUEFUSCkgJChsb2NhbF9wYXRoKSkKKyAgICBub3RpY2VfZmlsZTo9JChzdHJpcCAkKHdpbGRjYXJkICQoTE9DQUxfUEFUSCkvTElDRU5TRSAkKExPQ0FMX1BBVEgpL0xJQ0VOQ0UgJChMT0NBTF9QQVRIKS9OT1RJQ0UpKQogICBlbmRpZgorCisgIGlmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSxHWVApCisgICAgIyBXZSBpZ25vcmUgTk9USUNFIGZpbGVzIGZvciBtb2R1bGVzIG9mIHR5cGUgR1lQLgorICAgIG5vdGljZV9maWxlIDo9CisgIGVuZGlmCisKKyAgaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLEZBS0UpCisgICAgIyBXZSBpZ25vcmUgTk9USUNFIGZpbGVzIGZvciBtb2R1bGVzIG9mIHR5cGUgRkFLRS4KKyAgICBub3RpY2VfZmlsZSA6PQorICBlbmRpZgorCisgICMgU29vbmcgZ2VuZXJhdGVzIHN0dWIgbGlicmFyaWVzIHRoYXQgZG9uJ3QgbmVlZCBOT1RJQ0UgZmlsZXMKKyAgaWZkZWYgTE9DQUxfTk9fTk9USUNFX0ZJTEUKKyAgICBpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCisgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLExPQ0FMX05PX05PVElDRV9GSUxFIHNob3VsZCBub3QgYmUgdXNlZCBieSBBbmRyb2lkLm1rIGZpbGVzKQorICAgIGVuZGlmCisgICAgbm90aWNlX2ZpbGUgOj0KKyAgZW5kaWYKKworICBpZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX1BBQ0tBR0VfTkFNRSkpKQorICAgIGxpY2Vuc2VfcGFja2FnZV9uYW1lOj0kKHN0cmlwICQoTE9DQUxfTElDRU5TRV9QQUNLQUdFX05BTUUpKQorICBlbHNlCisgICAgbGljZW5zZV9wYWNrYWdlX25hbWU6PQorICBlbmRpZgorCisgIGlmbmVxICgsJChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfSU5TVEFMTF9NQVApKSkKKyAgICBpbnN0YWxsX21hcDo9JChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfSU5TVEFMTF9NQVApKQorICBlbHNlCisgICAgaW5zdGFsbF9tYXA6PQorICBlbmRpZgorCisgIGlmbmVxICgsJChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfS0lORFMpKSkKKyAgICBsaWNlbnNlX2tpbmRzOj0kKHN0cmlwICQoTE9DQUxfTElDRU5TRV9LSU5EUykpCisgIGVsc2UKKyAgICBsaWNlbnNlX2tpbmRzOj1sZWdhY3lfYnlfZXhjZXB0aW9uX29ubHkKKyAgZW5kaWYKKworICBpZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMpKSkKKyAgICBsaWNlbnNlX2NvbmRpdGlvbnM6PSQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMpKQorICBlbHNlCisgICAgbGljZW5zZV9jb25kaXRpb25zOj1ieV9leGNlcHRpb25fb25seQorICBlbmRpZgorCisgIGlzX2NvbnRhaW5lcjo9JChzdHJpcCAkKExPQ0FMX01PRFVMRV9JU19DT05UQUlORVIpKQorICBpZmVxICgsJChpc19jb250YWluZXIpKQorICAgIGlmbmVxICgsJChzdHJpcCAkKGZpbHRlciAlLnppcCAlLnRhciAlLnRneiAlLnRhci5neiAlLmFwayAlLmltZyAlLnNyY3N6aXAgJS5hcGV4LCAkKExPQ0FMX0JVSUxUX01PRFVMRSkpKSkKKyAgICAgIGlzX2NvbnRhaW5lcjo9dHJ1ZQorICAgIGVsc2UKKyAgICAgIGlzX2NvbnRhaW5lcjo9ZmFsc2UKKyAgICBlbmRpZgorICBlbHNlIGlmbmVxICgsJChzdHJpcCAkKGZpbHRlci1vdXQgdHJ1ZSBmYWxzZSwkKGlzX2NvbnRhaW5lcikpKSkKKyAgICAkKGVycm9yIFVucmVjb2duaXplZCB2YWx1ZSAnJChpc19jb250YWluZXIpJyBmb3IgTE9DQUxfTU9EVUxFX0lTX0NPTlRBSU5FUikKKyAgZW5kaWYKKworICBpZmVxICh0cnVlLCQoaXNfY29udGFpbmVyKSkKKyAgICAjIEluY2x1ZGUgc2hhcmVkIGxpYnJhcmllcycgbm90aWNlcyBmb3IgImNvbnRhaW5lciIgdHlwZXMsIGJ1dCBub3QgZm9yIGJpbmFyaWVzIGV0Yy4KKyAgICBub3RpY2VfZGVwcyA6PSBcCisgICAgICAgICQoc3RyaXAgXAorICAgICAgICAgICAgJChmb3JlYWNoIGQsIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1JFUVVJUkVEX01PRFVMRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX0RZTElCX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfUkxJQl9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1BST0NfTUFDUk9fTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9IRUFERVJfTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICwkKHN1YnN0IDosXywkKGQpKTpzdGF0aWMgXAorICAgICAgICAgICAgKSBcCisgICAgICAgICkKKyAgZWxzZQorICAgIG5vdGljZV9kZXBzIDo9IFwKKyAgICAgICAgJChzdHJpcCBcCisgICAgICAgICAgICAkKGZvcmVhY2ggZCwgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfUkVRVUlSRURfTU9EVUxFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfU1RBVElDX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfUkxJQl9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1BST0NfTUFDUk9fTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9IRUFERVJfTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAsJChzdWJzdCA6LF8sJChkKSk6c3RhdGljIFwKKyAgICAgICAgICAgICkkKGZvcmVhY2ggZCwgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfU0hBUkVEX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfRFlMSUJfTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9KQVZBX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAsJChzdWJzdCA6LF8sJChkKSk6ZHluYW1pYyBcCisgICAgICAgICAgICApIFwKKyAgICAgICAgKQorICBlbmRpZgorICBpZmVxICgkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSx0cnVlKQorICAgIG5vdGljZV9kZXBzIDo9ICQoc3RyaXAgJChub3RpY2VfZGVwcykgJChmb3JlYWNoIGQsJChMT0NBTF9IT1NUX1JFUVVJUkVEX01PRFVMRVMpLCQoc3Vic3QgOixfLCQoZCkpOnN0YXRpYykpCisgIGVsc2UKKyAgICBub3RpY2VfZGVwcyA6PSAkKHN0cmlwICQobm90aWNlX2RlcHMpICQoZm9yZWFjaCBkLCQoTE9DQUxfVEFSR0VUX1JFUVVJUkVEX01PRFVMRVMpLCQoc3Vic3QgOixfLCQoZCkpOnN0YXRpYykpCisgIGVuZGlmCisKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5ERUxBWUVEX01FVEFfTElDIDo9ICQoc3RyaXAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkRFTEFZRURfTUVUQV9MSUMpICQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfUEFDS0FHRV9OQU1FIDo9ICQoc3RyaXAgJChsaWNlbnNlX3BhY2thZ2VfbmFtZSkpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTU9EVUxFX1RZUEUgOj0gJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTU9EVUxFX1RZUEUpICQoTE9DQUxfTU9EVUxFX1RZUEUpKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1PRFVMRV9DTEFTUyA6PSAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NT0RVTEVfQ0xBU1MpICQoTE9DQUxfTU9EVUxFX0NMQVNTKSkKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5MSUNFTlNFX0tJTkRTIDo9ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5MSUNFTlNFX0tJTkRTKSAkKGxpY2Vuc2Vfa2luZHMpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTElDRU5TRV9DT05ESVRJT05TIDo9ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5MSUNFTlNFX0NPTkRJVElPTlMpICQobGljZW5zZV9jb25kaXRpb25zKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfSU5TVEFMTF9NQVAgOj0gJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfSU5TVEFMTF9NQVApICQoaW5zdGFsbF9tYXApCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFX0RFUFMgOj0gJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk5PVElDRV9ERVBTKSAkKG5vdGljZV9kZXBzKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklTX0NPTlRBSU5FUiA6PSAkKHN0cmlwICQoZmlsdGVyLW91dCBmYWxzZSwkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSVNfQ09OVEFJTkVSKSAkKGlzX2NvbnRhaW5lcikpKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBBVEggOj0gJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuUEFUSCkgJChsb2NhbF9wYXRoKSkKKworICBpZmRlZiBub3RpY2VfZmlsZQorICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFUyA6PSAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFUykgJChub3RpY2VfZmlsZSkKKyAgZW5kaWYgICMgbm90aWNlX2ZpbGUKIGVuZGlmCiAKLWlmZGVmIG5vdGljZV9maWxlCi0KLWlmZGVmIG15X3JlZ2lzdGVyX25hbWUKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFUyA6PSAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFUykgJChub3RpY2VfZmlsZSkKLWVuZGlmCi0KLWVuZGlmICAjIG5vdGljZV9maWxlCmRpZmYgLS1naXQgYS9jb3JlL3BhY2thZ2VfaW50ZXJuYWwubWsgYi9jb3JlL3BhY2thZ2VfaW50ZXJuYWwubWsKaW5kZXggM2U5MTA2Yi4uYTdlYjU3MiAxMDA2NDQKLS0tIGEvY29yZS9wYWNrYWdlX2ludGVybmFsLm1rCisrKyBiL2NvcmUvcGFja2FnZV9pbnRlcm5hbC5tawpAQCAtMjAzLDEwICsyMDMsMTAgQEAKIGFsbF9yZXNvdXJjZXMgOj0gJChzdHJpcCAkKG15X3Jlc19yZXNvdXJjZXMpICQobXlfb3ZlcmxheV9yZXNvdXJjZXMpKQogCiAjIFRoZSBsaW5rZWQgcmVzb3VyY2UgcGFja2FnZS4KLW15X3Jlc19wYWNrYWdlIDo9ICQoaW50ZXJtZWRpYXRlcykvcGFja2FnZS1yZXMuYXBrCitteV9yZXNfcGFja2FnZSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wYWNrYWdlLXJlcy5hcGsKIExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTICs9ICQobXlfcmVzX3BhY2thZ2UpCiAKLW15X2J1bmRsZV9tb2R1bGUgOj0gJChpbnRlcm1lZGlhdGVzKS9iYXNlLnppcAorbXlfYnVuZGxlX21vZHVsZSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9iYXNlLnppcAogTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMgKz0gJChteV9idW5kbGVfbW9kdWxlKQogCiAjIEFsd2F5cyBydW4gYWFwdDIsIGJlY2F1c2Ugd2UgbmVlZCB0byBhdCBsZWFzdCBjb21waWxlIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sLgpAQCAtNTMxLDcgKzUzMSw3IEBACiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfUkVTX1BBQ0tBR0UgOj0gJChteV9yZXNfcGFja2FnZSkKICQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQobXlfcmVzX3BhY2thZ2UpICQoQUFQVDIpCiBpZmRlZiBMT0NBTF9DT01QUkVTU0VEX01PRFVMRQotJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChNSU5JR1pJUCkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQoR1pJUCkKIGVuZGlmCiBpZmVxICh0cnVlLCAkKExPQ0FMX1VOQ09NUFJFU1NfREVYKSkKICQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQoWklQMlpJUCkKQEAgLTU3Miw3ICs1NzIsNyBAQAogCSQoY29tcHJlc3MtcGFja2FnZSkKIGVuZGlmICAjIExPQ0FMX0NPTVBSRVNTRURfTU9EVUxFCiAKLW15X3BhY2thZ2VfcmVzX3BiIDo9ICQoaW50ZXJtZWRpYXRlcykvcGFja2FnZS1yZXMucGIuYXBrCitteV9wYWNrYWdlX3Jlc19wYiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wYWNrYWdlLXJlcy5wYi5hcGsKICQobXlfcGFja2FnZV9yZXNfcGIpOiAkKG15X3Jlc19wYWNrYWdlKSAkKEFBUFQyKQogCSQoQUFQVDIpIGNvbnZlcnQgLS1vdXRwdXQtZm9ybWF0IHByb3RvICQ8IC1vICRACiAKQEAgLTczMSwzICs3MzEsNSBAQAogICAgICkKICAgZW5kaWYKIGVuZGlmCisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1QQUNLQUdFKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3BhY2thZ2luZy9mbGFncy5tayBiL2NvcmUvcGFja2FnaW5nL2ZsYWdzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Nzk1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3BhY2thZ2luZy9mbGFncy5tawpAQCAtMCwwICsxLDE3OCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYnVpbGQvbWFrZS9jb3JlL01ha2VmaWxlLCBhbmQgY29udGFpbnMgdGhlIGxvZ2ljIGZvcgorIyB0aGUgY29tYmluZWQgZmxhZ3MgZmlsZXMuCisjCisKKyMgVE9ETzogU2hvdWxkIHdlIGRvIGFsbCBvZiB0aGUgaW1hZ2VzIGluICQoSU1BR0VTX1RPX0JVSUxEKT8KK19GTEFHX1BBUlRJVElPTlMgOj0gcHJvZHVjdCBzeXN0ZW0gc3lzdGVtX2V4dCB2ZW5kb3IKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFjb25maWcgRmxhZ3MKKworIyBDcmVhdGUgYSBzdW1tYXJ5IGZpbGUgb2YgYnVpbGQgZmxhZ3MgZm9yIGVhY2ggcGFydGl0aW9uCisjICQoMSk6IGJ1aWx0IGFjb25maWcgZmxhZ3MgZmlsZSAob3V0KQorIyAkKDIpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBmaWxlIChvdXQpCisjICQoMyk6IHRoZSBwYXJ0aXRpb24gKGluKQorIyAkKDQpOiBpbnB1dCBhY29uZmlnIGZpbGVzIGZvciB0aGUgcGFydGl0aW9uIChpbikKK2RlZmluZSBnZW5lcmF0ZS1wYXJ0aXRpb24tYWNvbmZpZy1mbGFnLWZpbGUKKyQoZXZhbCAkKHN0cmlwICQoMSkpOiBQUklWQVRFX09VVCA6PSAkKHN0cmlwICQoMSkpKQorJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfSU4gOj0gJChzdHJpcCAkKDQpKSkKKyQoc3RyaXAgJCgxKSk6ICQoQUNPTkZJRykgJChzdHJpcCAkKDQpKQorCW1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX09VVCkpCisJJCQoaWYgJCQoUFJJVkFURV9JTiksIFwKKwkJJCQoQUNPTkZJRykgZHVtcCAtLWRlZHVwIC0tZm9ybWF0IHByb3RvYnVmIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSBcCisJCQktLWZpbHRlciBjb250YWluZXI6JCQoc3RyaXAgJCgzKSkgJCQoYWRkcHJlZml4IC0tY2FjaGUgLCQkKFBSSVZBVEVfSU4pKSwgXAorCQllY2hvIC1uID4gJCQoUFJJVkFURV9PVVQpIFwKKwkpCiskKGNhbGwgY29weS1vbmUtZmlsZSwgJCgxKSwgJCgyKSkKK2VuZGVmCisKKyMgQ3JlYXRlIGEgc3VtbWFyeSBmaWxlIG9mIGJ1aWxkIGZsYWdzIGZvciBlYWNoIHBhcnRpdGlvbgorIyAkKDEpOiBidWlsdCBhY29uZmlnIGZsYWdzIGZpbGUgKG91dCkKKyMgJCgyKTogaW5zdGFsbGVkIGFjb25maWcgZmxhZ3MgZmlsZSAob3V0KQorIyAkKDMpOiBpbnB1dCBhY29uZmlnIGZpbGVzIGZvciB0aGUgcGFydGl0aW9uIChpbikKK2RlZmluZSBnZW5lcmF0ZS1nbG9iYWwtYWNvbmZpZy1mbGFnLWZpbGUKKyQoZXZhbCAkKHN0cmlwICQoMSkpOiBQUklWQVRFX09VVCA6PSAkKHN0cmlwICQoMSkpKQorJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfSU4gOj0gJChzdHJpcCAkKDMpKSkKKyQoc3RyaXAgJCgxKSk6ICQoQUNPTkZJRykgJChzdHJpcCAkKDMpKQorCW1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX09VVCkpCisJJCQoaWYgJCQoUFJJVkFURV9JTiksIFwKKwkJJCQoQUNPTkZJRykgZHVtcCAtLWRlZHVwIC0tZm9ybWF0IHByb3RvYnVmIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSBcCisJCQkkJChhZGRwcmVmaXggLS1jYWNoZSAsJCQoUFJJVkFURV9JTikpLCBcCisJCWVjaG8gLW4gPiAkJChQUklWQVRFX09VVCkgXAorCSkKKyQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKDEpLCAkKDIpKQorZW5kZWYKKworCiskKGZvcmVhY2ggcGFydGl0aW9uLCAkKF9GTEFHX1BBUlRJVElPTlMpLCBcCisJJChldmFsIGFjb25maWdfZmxhZ19zdW1tYXJpZXNfcHJvdG9idWYuJChwYXJ0aXRpb24pIDo9ICQoUFJPRFVDVF9PVVQpLyQocGFydGl0aW9uKS9ldGMvYWNvbmZpZ19mbGFncy5wYikgXAorCSQoZXZhbCAkKGNhbGwgZ2VuZXJhdGUtcGFydGl0aW9uLWFjb25maWctZmxhZy1maWxlLCBcCisJCQkJJChUQVJHRVRfT1VUX0ZMQUdTKS8kKHBhcnRpdGlvbikvYWNvbmZpZ19mbGFncy5wYiwgXAorCQkJCSQoYWNvbmZpZ19mbGFnX3N1bW1hcmllc19wcm90b2J1Zi4kKHBhcnRpdGlvbikpLCBcCisJCQkJJChwYXJ0aXRpb24pLCBcCisJCQkJJChzb3J0ICQoZm9yZWFjaCBtLCQoY2FsbCByZWdpc3Rlci1uYW1lcy1mb3ItcGFydGl0aW9uLCAkKHBhcnRpdGlvbikpLCBcCisJCQkJCSQoQUxMX01PRFVMRVMuJChtKS5BQ09ORklHX0ZJTEVTKSBcCisJCQkJKSksIFwKKwkpKSBcCispCisKKyMgQ29sbGVjdCB0aGUgb24tZGV2aWNlIGZsYWdzIGludG8gYSBzaW5nbGUgZmlsZSwgc2ltaWxhciB0byBhbGxfYWNvbmZpZ19kZWNsYXJhdGlvbnMuCityZXF1aXJlZF9hY29uZmlnX2ZsYWdzX2ZpbGVzIDo9IFwKKwkJJChzb3J0ICQoZm9yZWFjaCBwYXJ0aXRpb24sICQoZmlsdGVyICQoSU1BR0VTX1RPX0JVSUxEKSwgJChfRkxBR19QQVJUSVRJT05TKSksIFwKKwkJCSQoYWNvbmZpZ19mbGFnX3N1bW1hcmllc19wcm90b2J1Zi4kKHBhcnRpdGlvbikpIFwKKwkJKSkKKworLlBIT05ZOiBkZXZpY2VfYWNvbmZpZ19kZWNsYXJhdGlvbnMKK2RldmljZV9hY29uZmlnX2RlY2xhcmF0aW9uczogJChQUk9EVUNUX09VVCkvZGV2aWNlX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiCiskKGV2YWwgJChjYWxsIGdlbmVyYXRlLWdsb2JhbC1hY29uZmlnLWZsYWctZmlsZSwgXAorCQkJJChUQVJHRVRfT1VUX0ZMQUdTKS9kZXZpY2VfYWNvbmZpZ19kZWNsYXJhdGlvbnMucGIsIFwKKwkJCSQoUFJPRFVDVF9PVVQpL2RldmljZV9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYiwgXAorCQkJJChzb3J0ICQocmVxdWlyZWRfYWNvbmZpZ19mbGFnc19maWxlcykpIFwKKykpIFwKKworIyBDcmVhdGUgYSBzZXQgb2Ygc3RvcmFnZSBmaWxlIGZvciBlYWNoIHBhcnRpdGlvbgorIyAkKDEpOiBidWlsdCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgcGFja2FnZSBtYXAgZmlsZSAob3V0KQorIyAkKDIpOiBidWlsdCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyBtYXAgZmlsZSAob3V0KQorIyAkKDMpOiBidWlsdCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyB2YWwgZmlsZSAob3V0KQorIyAkKDQpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBzdG9yYWdlIHBhY2thZ2UgbWFwIGZpbGUgKG91dCkKKyMgJCg1KTogaW5zdGFsbGVkIGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIG1hcCBmaWxlIChvdXQpCisjICQoNik6IGluc3RhbGxlZCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyB2YWx1ZSBmaWxlIChvdXQpCisjICQoNyk6IGlucHV0IGFjb25maWcgZmlsZXMgZm9yIHRoZSBwYXJ0aXRpb24gKGluKQorIyAkKDgpOiBwYXJ0aXRpb24gbmFtZQorZGVmaW5lIGdlbmVyYXRlLXBhcnRpdGlvbi1hY29uZmlnLXN0b3JhZ2UtZmlsZQorJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCgxKSkpCiskKGV2YWwgJChzdHJpcCAkKDEpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoNykpKQorJChzdHJpcCAkKDEpKTogJChBQ09ORklHKSAkKHN0cmlwICQoNykpCisJbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKKwkkJChpZiAkJChQUklWQVRFX0lOKSwgXAorCQkkJChBQ09ORklHKSBjcmVhdGUtc3RvcmFnZSAtLWNvbnRhaW5lciAkKDgpIC0tZmlsZSBwYWNrYWdlX21hcCAtLW91dCAkJChQUklWQVRFX09VVCkgXAorCQkJJCQoYWRkcHJlZml4IC0tY2FjaGUgLCQkKFBSSVZBVEVfSU4pKSwgXAorCSkKKwl0b3VjaCAkJChQUklWQVRFX09VVCkKKyQoZXZhbCAkKHN0cmlwICQoMikpOiBQUklWQVRFX09VVCA6PSAkKHN0cmlwICQoMikpKQorJChldmFsICQoc3RyaXAgJCgyKSk6IFBSSVZBVEVfSU4gOj0gJChzdHJpcCAkKDcpKSkKKyQoc3RyaXAgJCgyKSk6ICQoQUNPTkZJRykgJChzdHJpcCAkKDcpKQorCW1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX09VVCkpCisJJCQoaWYgJCQoUFJJVkFURV9JTiksIFwKKwkJJCQoQUNPTkZJRykgY3JlYXRlLXN0b3JhZ2UgLS1jb250YWluZXIgJCg4KSAtLWZpbGUgZmxhZ19tYXAgLS1vdXQgJCQoUFJJVkFURV9PVVQpIFwKKwkJCSQkKGFkZHByZWZpeCAtLWNhY2hlICwkJChQUklWQVRFX0lOKSksIFwKKwkpCisJdG91Y2ggJCQoUFJJVkFURV9PVVQpCiskKGV2YWwgJChzdHJpcCAkKDMpKTogUFJJVkFURV9PVVQgOj0gJChzdHJpcCAkKDMpKSkKKyQoZXZhbCAkKHN0cmlwICQoMykpOiBQUklWQVRFX0lOIDo9ICQoc3RyaXAgJCg3KSkpCiskKHN0cmlwICQoMykpOiAkKEFDT05GSUcpICQoc3RyaXAgJCg3KSkKKwlta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9PVVQpKQorCSQkKGlmICQkKFBSSVZBVEVfSU4pLCBcCisJCSQkKEFDT05GSUcpIGNyZWF0ZS1zdG9yYWdlIC0tY29udGFpbmVyICQoOCkgLS1maWxlIGZsYWdfdmFsIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSBcCisJCSQkKGFkZHByZWZpeCAtLWNhY2hlICwkJChQUklWQVRFX0lOKSksIFwKKwkpCisJdG91Y2ggJCQoUFJJVkFURV9PVVQpCiskKGNhbGwgY29weS1vbmUtZmlsZSwgJChzdHJpcCAkKDEpKSwgJCg0KSkKKyQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKHN0cmlwICQoMikpLCAkKDUpKQorJChjYWxsIGNvcHktb25lLWZpbGUsICQoc3RyaXAgJCgzKSksICQoNikpCitlbmRlZgorCitpZmVxICgkKFJFTEVBU0VfQ1JFQVRFX0FDT05GSUdfU1RPUkFHRV9GSUxFKSx0cnVlKQorJChmb3JlYWNoIHBhcnRpdGlvbiwgJChfRkxBR19QQVJUSVRJT05TKSwgXAorCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfcGFja2FnZV9tYXAuJChwYXJ0aXRpb24pIDo9ICQoUFJPRFVDVF9PVVQpLyQocGFydGl0aW9uKS9ldGMvYWNvbmZpZy9wYWNrYWdlLm1hcCkgXAorCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfZmxhZ19tYXAuJChwYXJ0aXRpb24pIDo9ICQoUFJPRFVDVF9PVVQpLyQocGFydGl0aW9uKS9ldGMvYWNvbmZpZy9mbGFnLm1hcCkgXAorCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfZmxhZ192YWwuJChwYXJ0aXRpb24pIDo9ICQoUFJPRFVDVF9PVVQpLyQocGFydGl0aW9uKS9ldGMvYWNvbmZpZy9mbGFnLnZhbCkgXAorCSQoZXZhbCAkKGNhbGwgZ2VuZXJhdGUtcGFydGl0aW9uLWFjb25maWctc3RvcmFnZS1maWxlLCBcCisJCQkJJChUQVJHRVRfT1VUX0ZMQUdTKS8kKHBhcnRpdGlvbikvcGFja2FnZS5tYXAsIFwKKwkJCQkkKFRBUkdFVF9PVVRfRkxBR1MpLyQocGFydGl0aW9uKS9mbGFnLm1hcCwgXAorCQkJCSQoVEFSR0VUX09VVF9GTEFHUykvJChwYXJ0aXRpb24pL2ZsYWcudmFsLCBcCisJCQkJJChhY29uZmlnX3N0b3JhZ2VfcGFja2FnZV9tYXAuJChwYXJ0aXRpb24pKSwgXAorCQkJCSQoYWNvbmZpZ19zdG9yYWdlX2ZsYWdfbWFwLiQocGFydGl0aW9uKSksIFwKKwkJCQkkKGFjb25maWdfc3RvcmFnZV9mbGFnX3ZhbC4kKHBhcnRpdGlvbikpLCBcCisJCQkJJChhY29uZmlnX2ZsYWdfc3VtbWFyaWVzX3Byb3RvYnVmLiQocGFydGl0aW9uKSksIFwKKwkJCQkkKHBhcnRpdGlvbiksIFwKKwkpKSBcCispCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEluc3RhbGwgdGhlIG9uZXMgd2UgbmVlZCBmb3IgdGhlIGNvbmZpZ3VyZWQgcHJvZHVjdAorcmVxdWlyZWRfZmxhZ3NfZmlsZXMgOj0gXAorCQkkKHNvcnQgJChmb3JlYWNoIHBhcnRpdGlvbiwgJChmaWx0ZXIgJChJTUFHRVNfVE9fQlVJTEQpLCAkKF9GTEFHX1BBUlRJVElPTlMpKSwgXAorCQkJJChidWlsZF9mbGFnX3N1bW1hcmllcy4kKHBhcnRpdGlvbikpIFwKKwkJCSQoYWNvbmZpZ19mbGFnX3N1bW1hcmllc19wcm90b2J1Zi4kKHBhcnRpdGlvbikpIFwKKwkJCSQoYWNvbmZpZ19zdG9yYWdlX3BhY2thZ2VfbWFwLiQocGFydGl0aW9uKSkgXAorCQkJJChhY29uZmlnX3N0b3JhZ2VfZmxhZ19tYXAuJChwYXJ0aXRpb24pKSBcCisJCQkkKGFjb25maWdfc3RvcmFnZV9mbGFnX3ZhbC4kKHBhcnRpdGlvbikpIFwKKwkJKSkKKworQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChyZXF1aXJlZF9mbGFnc19maWxlcykKK0FMTF9GTEFHU19GSUxFUyA6PSAkKHJlcXVpcmVkX2ZsYWdzX2ZpbGVzKQorCisjIFRPRE86IFJlbW92ZQorLlBIT05ZOiBmbGFnLWZpbGVzCitmbGFnLWZpbGVzOiAkKHJlcXVpcmVkX2ZsYWdzX2ZpbGVzKQorCisKKyMgQ2xlYW4gdXAKK3JlcXVpcmVkX2ZsYWdzX2ZpbGVzOj0KK3JlcXVpcmVkX2Fjb25maWdfZmxhZ3NfZmlsZXM6PQorJChmb3JlYWNoIHBhcnRpdGlvbiwgJChfRkxBR19QQVJUSVRJT05TKSwgXAorCSQoZXZhbCBidWlsZF9mbGFnX3N1bW1hcmllcy4kKHBhcnRpdGlvbik6PSkgXAorCSQoZXZhbCBhY29uZmlnX2ZsYWdfc3VtbWFyaWVzX3Byb3RvYnVmLiQocGFydGl0aW9uKTo9KSBcCisJJChldmFsIGFjb25maWdfc3RvcmFnZV9wYWNrYWdlX21hcC4kKHBhcnRpdGlvbik6PSkgXAorCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfZmxhZ19tYXAuJChwYXJ0aXRpb24pOj0pIFwKKwkkKGV2YWwgYWNvbmZpZ19zdG9yYWdlX2ZsYWdfdmFsLiQocGFydGl0aW9uKTo9KSBcCispCisKZGlmZiAtLWdpdCBhL2NvcmUvcGhvbnlfcGFja2FnZS5tayBiL2NvcmUvcGhvbnlfcGFja2FnZS5tawppbmRleCA1NzhkNjI5Li5jOTc4NzkzIDEwMDY0NAotLS0gYS9jb3JlL3Bob255X3BhY2thZ2UubWsKKysrIGIvY29yZS9waG9ueV9wYWNrYWdlLm1rCkBAIC0xMiwzICsxMiw1IEBACiAJJChoaWRlKSBlY2hvICJGYWtlOiAkQCIKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQogCSQoaGlkZSkgdG91Y2ggJEAKKworJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PVBIT05ZX1BBQ0tBR0UpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcHJlYnVpbHRfaW50ZXJuYWwubWsgYi9jb3JlL3ByZWJ1aWx0X2ludGVybmFsLm1rCmluZGV4IDViZWE5YjYuLmQ1MjYxZjQgMTAwNjQ0Ci0tLSBhL2NvcmUvcHJlYnVpbHRfaW50ZXJuYWwubWsKKysrIGIvY29yZS9wcmVidWlsdF9pbnRlcm5hbC5tawpAQCAtNjMsNCArNjMsNSBAQAogJChidWlsdF9tb2R1bGUpIDogJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykKIAogbXlfcHJlYnVpbHRfc3JjX2ZpbGUgOj0KLW15X3ByZW9wdF9mb3JfZXh0cmFjdGVkX2FwayA6PQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9UFJFQlVJTFQpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcHJvZHVjdC5tayBiL2NvcmUvcHJvZHVjdC5tawppbmRleCBlOTBlMjdiLi44MzJkMDk0IDEwMDY0NAotLS0gYS9jb3JlL3Byb2R1Y3QubWsKKysrIGIvY29yZS9wcm9kdWN0Lm1rCkBAIC0zMiw2ICszMiwxMCBAQAogIyBQUk9EVUNUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEPTY1NTM2LCB0aGUgcG9zc2libGUgdmFsdWVzIGZvciBQQUdFX1NJWkUgY291bGQgYmUKICMgNDA5NiwgMTYzODQgYW5kIDY1NTM2LgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRAorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFCisKKyMgQm9vbGVhbiB2YXJpYWJsZSBkZXRlcm1pbmluZyBpZiBBT1NQIHJlbGllcyBvbiBiaW9uaWMncyBQQUdFX1NJWkUgbWFjcm8uCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8KIAogIyBUaGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBwcm9kdWN0LgogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfTE9DQUxFUwpAQCAtNDMsNiArNDcsMTMgQEAKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHCiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9QQUNLQUdFU19ERUJVR19BU0FOCiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9QQUNLQUdFU19BUk02NAorCisjIHBhY2thZ2VzIHRoYXQgYXJlIGFkZGVkIHRvIFBST0RVQ1RfUEFDS0FHRVMgYmFzZWQgb24gdGhlIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCisjIFRoZXNlIGFyZSBvbmx5IGFkZGVkIGlmIHRoZSBzaGlwcGluZyBBUEkgbGV2ZWwgaXMgdGhhdCBsZXZlbCBvciBsb3dlcgorX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzI5CitfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9QQUNLQUdFU19TSElQUElOR19BUElfTEVWRUxfMzMKK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8zNAorCiAjIFBhY2thZ2VzIGluY2x1ZGVkIG9ubHkgZm9yIGVuZy91c2VyZGVidWcgYnVpbGRzLCB3aGVuIGJ1aWxkaW5nIHdpdGggRU1NQV9JTlNUUlVNRU5UPXRydWUKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHX0pBVkFfQ09WRVJBR0UKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1BBQ0tBR0VTX0VORwpAQCAtMTQ2LDcgKzE1Nyw5IEBACiAjIFBST0RVQ1RfQk9PVF9KQVJTLCBzbyB0aGF0IGRldmljZS1zcGVjaWZpYyBqYXJzIGdvIGFmdGVyIGNvbW1vbiBqYXJzLgogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfQk9PVF9KQVJTX0VYVFJBCiAKLV9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QKKyMgTGlzdCBvZiBqYXJzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBBUlQgYm9vdCBpbWFnZSBmb3IgdGVzdGluZy4KK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1RFU1RfT05MWV9BUlRfQk9PVF9JTUFHRV9KQVJTCisKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQVBQUwogIyBMaXN0IG9mIHN5c3RlbV9zZXJ2ZXIgY2xhc3NwYXRoIGphcnMgb24gdGhlIHBsYXRmb3JtLgogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTCkBAIC0xNjksOCArMTgyLDYgQEAKICMgU2V0IHRvIHRydWUgdG8gZGlzYWJsZSA8dXNlcy1saWJyYXJ5PiBjaGVja3MgZm9yIGEgcHJvZHVjdC4KIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0JST0tFTl9WRVJJRllfVVNFU19MSUJSQVJJRVMKIAotIyBBbGwgb2YgdGhlIGFwcHMgdGhhdCB3ZSBmb3JjZSBwcmVvcHQsIHRoaXMgb3ZlcnJpZGVzIFdJVEhfREVYUFJFT1BULgotX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfQUxXQVlTX1BSRU9QVF9FWFRSQUNURURfQVBLCiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9ERVhQUkVPUFRfU1BFRURfQVBQUwogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfTE9BREVEX0JZX1BSSVZJTEVHRURfTU9EVUxFUwogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWQpAQCAtMjE4LDYgKzIyOSw5IEBACiAjIFRoZSBmaXJzdCBBUEkgbGV2ZWwgdGhpcyBwcm9kdWN0IHNoaXBwZWQgd2l0aAogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwKIAorIyBUaGUgZmlyc3QgdmVuZG9yIEFQSSBsZXZlbCB0aGlzIHByb2R1Y3Qgc2hpcHBlZCB3aXRoCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX1NISVBQSU5HX1ZFTkRPUl9BUElfTEVWRUwKKwogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFZFTkRPUl9QUk9EVUNUX1JFU1RSSUNUX1ZFTkRPUl9GSUxFUwogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFZFTkRPUl9FWENFUFRJT05fTU9EVUxFUwogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFZFTkRPUl9FWENFUFRJT05fUEFUSFMKQEAgLTI0Nyw2ICsyNjEsMTkgQEAKICMgV2hldGhlciBhbnkgcGF0aHMgc2hvdWxkIGhhdmUgSFdBU2FuIGVuYWJsZWQgZm9yIGNvbXBvbmVudHMKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0hXQVNBTl9JTkNMVURFX1BBVEhTCiAKKyMgV2hldGhlciBhbnkgcGF0aHMgYXJlIGV4Y2x1ZGVkIGZyb20gc2FuaXRpemF0aW9uIHdoZW4gU0FOSVRJWkVfVEFSR0VUPWh3YWRkcmVzcworX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfSFdBU0FOX0VYQ0xVREVfUEFUSFMKKworIyBXaGV0aGVyIGFueSBwYXRocyBzaG91bGQgaGF2ZSBNZW10YWdfaGVhcCBlbmFibGVkIGZvciBjb21wb25lbnRzCitfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9NRU1UQUdfSEVBUF9BU1lOQ19JTkNMVURFX1BBVEhTCitfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9NRU1UQUdfSEVBUF9BU1lOQ19ERUZBVUxUX0lOQ0xVREVfUEFUSFMKK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX01FTVRBR19IRUFQX1NZTkNfSU5DTFVERV9QQVRIUworX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfTUVNVEFHX0hFQVBfU1lOQ19ERUZBVUxUX0lOQ0xVREVfUEFUSFMKK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX01FTVRBR19IRUFQX0VYQ0xVREVfUEFUSFMKKworIyBXaGV0aGVyIHRoaXMgcHJvZHVjdCB3YW50cyB0byBzdGFydCB3aXRoIGFuIGVtcHR5IGxpc3Qgb2YgZGVmYXVsdCBtZW10YWdfaGVhcCBpbmNsdWRlIHBhdGhzCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX01FTVRBR19IRUFQX1NLSVBfREVGQVVMVF9QQVRIUworCiAjIFdoZXRoZXIgdGhlIFNjdWRvIGhhcmRlbmVkIGFsbG9jYXRvciBpcyBkaXNhYmxlZCBwbGF0Zm9ybS13aWRlCiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0RJU0FCTEVfU0NVRE8KIApAQCAtMjc2LDkgKzMwMyw2IEBACiAjIFRoaXMgZmxhZyBpbXBsaWVzIFBST0RVQ1RfVVNFX0RZTkFNSUNfUEFSVElUSU9OUy4KIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TCiAKLSMgTGlzdCBvZiB0YWdzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdhdGUgYmx1ZXByaW50IG1vZHVsZXMgZnJvbSB0aGUgYnVpbGQgZ3JhcGgKLV9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0lOQ0xVREVfVEFHUwotCiAjIExpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZ2F0ZSBibHVlcHJpbnQgbW9kdWxlcyBmcm9tIHRoZSBidWlsZCBncmFwaAogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfU09VUkNFX1JPT1RfRElSUwogCkBAIC0yOTgsNiArMzIyLDEzIEBACiAjIHNldCB0aGlzIHZhcmlhYmxlIHRvIHByZXZlbnQgT1RBIGZhaWx1cmVzLgogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfT1RBX0VORk9SQ0VfVklOVEZfS0VSTkVMX1JFUVVJUkVNRU5UUwogCisjIElmIHNldCB0byB0cnVlLCB0aGlzIHByb2R1Y3QgZm9yY2VzIEhJREwgdG8gYmUgZW5hYmxlZCBieSBkZWNsYXJpbmcgYW5kcm9pZC5oaWRsLm1hbmFnZXIKKyMgYW5kIGFuZHJvaWQuaGlkbC50b2tlbiBpbiB0aGUgZnJhbWV3b3JrIG1hbmlmZXN0LiBUaGUgcHJvZHVjdCB3aWxsIGFsc28gbmVlZCB0byBhZGQgdGhlCisjICdod3NlcnZpY2VtYW5hZ2VyJyBzZXJ2aWNlIHRvIFBST0RVQ1RfUEFDS0FHRVMgaWYgaXRzIFNISVBQSU5HX0FQSV9MRVZFTCBpcyBncmVhdGVyIHRoYW4gMzQuCisjIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcgYnJpbmd1cCBmb3IgZGV2aWNlcyB0aGF0IGFyZSB0YXJnZXRpbmcgRkNNIDIwMjQwNCBhbmQgc3RpbGwKKyMgaGF2ZSBwYXJ0bmVyLW93bmVkIEhJREwgaW50ZXJmYWNlcyB0aGF0IGFyZSBiZWluZyBjb252ZXJ0ZWQgdG8gQUlETC4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfSElETF9FTkFCTEVECisKICMgSWYgc2V0IHRvIHRydWUsIHRoaXMgcHJvZHVjdCBidWlsZHMgYSBnZW5lcmljIE9UQSBwYWNrYWdlLCB3aGljaCBpbnN0YWxscyBnZW5lcmljIHN5c3RlbSBpbWFnZXMKICMgb250byBtYXRjaGluZyBkZXZpY2VzLiBUaGUgcHJvZHVjdCBtYXkgb25seSBidWlsZCBhIHN1YnNldCBvZiBzeXN0ZW0gaW1hZ2VzIChlLmcuIG9ubHkKICMgc3lzdGVtLmltZyksIHNvIGRldmljZXMgbmVlZCB0byBpbnN0YWxsIHRoZSBwYWNrYWdlIGluIGEgc3lzdGVtLW9ubHkgT1RBIG1hbm5lci4KQEAgLTMwNyw2ICszMzgsMTAgQEAKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1BBQ0tBR0VfTkFNRV9PVkVSUklERVMKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0NFUlRJRklDQVRFX09WRVJSSURFUwogCisjIE92ZXJyaWRlcyB0aGUgKGFwZXgsIGphcikgcGFpcnMgYWJvdmUgd2hlbiBkZXRlcm1pbmluZyB0aGUgb24tZGV2aWNlIGxvY2F0aW9uLiBUaGUgZm9ybWF0IGlzOgorIyA8b2xkX2FwZXg+OjxvbGRfamFyPjo8bmV3X2FwZXg+OjxuZXdfamFyPgorX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfQ09ORklHVVJFRF9KQVJfTE9DQVRJT05fT1ZFUlJJREVTCisKICMgQ29udHJvbHMgZm9yIHdoZXRoZXIgZGlmZmVyZW50IHBhcnRpdGlvbnMgYXJlIGJ1aWx0IGZvciB0aGUgY3VycmVudCBwcm9kdWN0LgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9TWVNURU1fSU1BR0UKIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQlVJTERfU1lTVEVNX09USEVSX0lNQUdFCkBAIC0zNjgsOCArNDAzLDYgQEAKICMgYSBqYXZhX3Nka19saWJyYXJ5IG1vZHVsZS4KIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0lOVEVSX1BBUlRJVElPTl9KQVZBX0xJQlJBUllfQUxMT1dMSVNUCiAKLV9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfSU5TVEFMTF9FWFRSQV9GTEFUVEVORURfQVBFWEVTCi0KICMgSW5zdGFsbCBhIGNvcHkgb2YgdGhlIGRlYnVnIHBvbGljeSB0byB0aGUgc3lzdGVtX2V4dCBwYXJ0aXRpb24sIGFuZCBhbGxvdwogIyBpbml0LXNlY29uZC1zdGFnZSB0byBsb2FkIGRlYnVnIHBvbGljeSBmcm9tIHN5c3RlbV9leHQuCiAjIFRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbnQgdG8gYmUgc2V0IGJ5IGNvbXBsaWFuY2UgR1NJIHRhcmdldHMuCkBAIC0zODIsMTMgKzQxNSwyNiBAQAogIyAvc3lzdGVtL2V0Yy9zZWN1cml0eS9mc3Zlcml0eS9CdWlsZE1hbmlmZXN0LmFwawogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9GU1ZFUklUWV9HRU5FUkFURV9NRVRBREFUQQogCi0jIElmIHRydWUsIHNldHMgdGhlIGRlZmF1bHQgZm9yIE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRS4gVGhpcyBvdmVycmlkZXMKLSMgQlJBTkNIX0RFRkFVTFRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIGJ1dCBub3QgYW4gZXhwbGljaXRseSBzZXQgdmFsdWUuCisjIElmIHRydWUsIHRoaXMgYnVpbGRzIHRoZSBtYWlubGluZSBtb2R1bGVzIGZyb20gc291cmNlLiBUaGlzIG92ZXJyaWRlcyBhbnkKKyMgcHJlYnVpbHRzIHNlbGVjdGVkIHZpYSBSRUxFQVNFX0FQRVhfQ09OVFJJQlVUSU9OU18qIGJ1aWxkIGZsYWdzIGZvciB0aGUKKyMgY3VycmVudCByZWxlYXNlIGNvbmZpZy4KIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFCiAKICMgSWYgdHJ1ZSwgaW5zdGFsbHMgYSBmdWxsIHZlcnNpb24gb2YgY29tLmFuZHJvaWQudmlydCBBUEVYLgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9BVkZfRU5BQkxFRAogCisjIElmIGZhbHNlLCBkaXNhYmxlIHRoZSBBVkYgcmVtb3RlIGF0dGVzdGF0b24gZmVhdHVyZS4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQVZGX1JFTU9URV9BVFRFU1RBVElPTl9ESVNBQkxFRAorCisjIElmIHRydWUsIGtlcm5lbCB3aXRoIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGZvciBNaWNyb2Ryb2lkIFZNcy4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQVZGX0tFUk5FTF9NT0RVTEVTX0VOQUJMRUQKKworIyBJZiB0cnVlLCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgd2lsbCBiZSBmb3JjZS1lbmFibGVkIGluIHRoZSBjZ3JvdXAgdjIgaGllcmFyY2h5CitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX01FTUNHX1YyX0ZPUkNFX0VOQUJMRUQKKworIyBJZiB0cnVlLCB0aGUgY2dyb3VwIHYyIGhpZXJhcmNoeSB3aWxsIGJlIHNwbGl0IGludG8gYXBwcy9zeXN0ZW0gc3VidHJlZXMKK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQ0dST1VQX1YyX1NZU19BUFBfSVNPTEFUSU9OX0VOQUJMRUQKKwogIyBMaXN0IG9mIC5qc29uIGZpbGVzIHRvIGJlIG1lcmdlZC9jb21waWxlZCBpbnRvIHZlbmRvci9ldGMvbGlua2VyLmNvbmZpZy5wYgogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfVkVORE9SX0xJTktFUl9DT05GSUdfRlJBR01FTlRTCiAKQEAgLTQwMSwxMSArNDQ3LDU3IEBACiAjICAgZGV2aWNlIG1heSBoYXZlIHRvIHJlLWNvbXBpbGUgZXZlcnl0aGluZyBvbiB0aGUgZmlyc3QgYm9vdCBpZiB0aGUga2VybmVsIGRvZXNuJ3Qgc3VwcG9ydAogIyAgIHVzZXJmYXVsdGZkCiAjIC0gImZhbHNlIjogZGlzYWxsb3dzIHRoZSBidWlsZCBzeXN0ZW0gYW5kIHRoZSBydW50aW1lIHRvIHVzZSB1c2VyZmF1bHRmZCBHQyBldmVuIGlmIHRoZSBkZXZpY2UKLSMgICBzdXBwb3J0cyBpdAorIyAgIHN1cHBvcnRzIGl0LiBUaGlzIG9wdGlvbiBpcyB0ZW1wb3JhcnkgLSB0aGUgcGxhbiBpcyB0byByZW1vdmUgaXQgYnkgQXVnIDIwMjUsIGF0IHdoaWNoIHRpbWUKKyMgICBNYWlubGluZSB1cGRhdGVzIG9mIHRoZSBBUlQgbW9kdWxlIHdpbGwgaWdub3JlIGl0IGFzIHdlbGwuCiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0VOQUJMRV9VRkZEX0dDCiAKKyMgU3BlY2lmaWVzIENPVyB2ZXJzaW9uIHRvIGJlIHVzZWQgYnkgdXBkYXRlX2VuZ2luZSBhbmQgbGlic25hcHNob3QuIElmIHRoaXMgdmFsdWUgaXMgbm90CisjIHNwZWNpZmllZCB3ZSBkZWZhdWx0IHRvIENPVyB2ZXJzaW9uIDIgaW4gdXBkYXRlX2VuZ2luZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfVklSVFVBTF9BQl9DT1dfVkVSU0lPTgorCisjIFNwZWNpZmllcyBtYXhpbXVtIGJ5dGVzIHRvIGJlIGNvbXByZXNzZWQgYXQgb25jZSBkdXJpbmcgb3RhLiBPcHRpb25zOiA0MDk2LCA4MTkyLCAxNjM4NCwgMzI3NjgsIDY1NTM2LCAxMzEwNzIsIDI2MjE0NC4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfVklSVFVBTF9BQl9DT01QUkVTU0lPTl9GQUNUT1IKKworIyBJZiBzZXQsIGRldGVybWluZXMgd2hldGhlciB0aGUgYnVpbGQgc3lzdGVtIGNoZWNrcyB2ZW5kb3Igc2VhcHAgY29udGV4dHMgdmlvbGF0aW9ucy4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQ0hFQ0tfVkVORE9SX1NFQVBQX1ZJT0xBVElPTlMKKworIyBJZiBzZXQsIGRldGVybWluZXMgd2hldGhlciB0aGUgYnVpbGQgc3lzdGVtIGNoZWNrcyBkZXYgdHlwZSB2aW9sYXRpb25zLgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9DSEVDS19ERVZfVFlQRV9WSU9MQVRJT05TCisKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0FGRE9fUFJPRklMRVMKIAorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9TQ1VET19BTExPQ0FUSU9OX1JJTkdfQlVGRkVSX1NJWkUKKworX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUworCitfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUworCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0JVSUxEX0ZST01fU09VUkNFX1NUVUIKKworX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9JR05PUkVfQVBFWF9DT05UUklCVVRJT05fQ09OVEVOVFMKKworX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9ISURERU5fQVBJX0VYUE9SVEFCTEVfU1RVQlMKKworX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9FWFBPUlRfUlVOVElNRV9BUElTCisKKyMgSWYgc2V0LCBkZXRlcm1pbmVzIHdoaWNoIHZlcnNpb24gb2YgdGhlIEdLSSBpcyB1c2VkIGFzIGd1ZXN0IGtlcm5lbCBmb3IgTWljcm9kcm9pZCBWTXMuCisjIFRPRE8oYi8zMjU5OTE3MzUpOiBsaW5rIHRvIGRvY3VtZW50YXRpb24gb25jZSBpdCBpcyBkb25lLgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9BVkZfTUlDUk9EUk9JRF9HVUVTVF9HS0lfVkVSU0lPTgorCisjIEVuYWJsZXMgMTZLQiBkZXZlbG9wZXIgb3B0aW9uIGZvciBkZXZpY2UgaWYgc2V0LgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF8xNktfREVWRUxPUEVSX09QVElPTgorCisjIElmIHNldCwgYWRiIHJvb3Qgd2lsbCBiZSBkaXNhYmxlZCAocmVhbGx5IHJvLmRlYnVnZ2FibGU9MCkgaW4gdXNlcmRlYnVnCisjIGJ1aWxkcy4gSXQncyBhbHJlYWR5IG9mZiBkaXNhYmxlZCBpbiB1c2VyIGJ1aWxkcy4gRW5nIGJ1aWxkcyBhcmUgdW5hZmZlY3RlZAorIyBieSB0aGlzIGZsYWcuCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX05PVF9ERUJVR0dBQkxFX0lOX1VTRVJERUJVRworCisjIElmIHNldCwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHZlcnNpb25OYW1lIG9mIGFwcHMgd2lsbCBpbmNsdWRlIHRoZSBidWlsZCBudW1iZXIuCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0JVSUxEX0FQUFNfV0lUSF9CVUlMRF9OVU1CRVIKKworIyBJZiBzZXQsIGJ1aWxkIHdvdWxkIGdlbmVyYXRlIHN5c3RlbSBpbWFnZSBmcm9tIFNvb25nLWRlZmluZWQgbW9kdWxlLgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRQorCiAuS0FUSV9SRUFET05MWSA6PSBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyBfcHJvZHVjdF9saXN0X3ZhcnMKIF9wcm9kdWN0X3Zhcl9saXN0IDo9JD0gJChfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycykgJChfcHJvZHVjdF9saXN0X3ZhcnMpCiAKQEAgLTUwMyw3ICs1OTUsNyBAQAogIyBiZSBjbGVhbmVkIHVwIHRvIG5vdCBiZSBwcm9kdWN0IHZhcmlhYmxlcy4KIF9yZWFkb25seV9sYXRlX3ZhcmlhYmxlcyA6PSBcCiAgIERFVklDRV9QQUNLQUdFX09WRVJMQVlTIFwKLSAgV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWSBcCisgIFdJVEhfREVYUFJFT1BUX0FSVF9CT09UX0lNR19PTkxZIFwKIAogIyBNb2RpZmllZCBpbnRlcm5hbGx5IGluIHRoZSBidWlsZCBzeXN0ZW0KIF9yZWFkb25seV9sYXRlX3ZhcmlhYmxlcyArPSBcCmRpZmYgLS1naXQgYS9jb3JlL3Byb2R1Y3RfY29uZmlnLm1rIGIvY29yZS9wcm9kdWN0X2NvbmZpZy5tawppbmRleCA1ZDc2ZWViLi5jYzJmZWE5IDEwMDY0NAotLS0gYS9jb3JlL3Byb2R1Y3RfY29uZmlnLm1rCisrKyBiL2NvcmUvcHJvZHVjdF9jb25maWcubWsKQEAgLTIyMyw3ICsyMjMsNyBAQAogZW5kaWYKIAogaWZlcSAoLCQoY3VycmVudF9wcm9kdWN0X21ha2VmaWxlKSkKLSAgJChlcnJvciBDYW4gbm90IGxvY2F0ZSBjb25maWcgbWFrZWZpbGUgZm9yIHByb2R1Y3QgIiQoVEFSR0VUX1BST0RVQ1QpIikKKyAgJChlcnJvciBDYW5ub3QgbG9jYXRlIGNvbmZpZyBtYWtlZmlsZSBmb3IgcHJvZHVjdCAiJChUQVJHRVRfUFJPRFVDVCkiKQogZW5kaWYKIAogaWZuZXEgKCwkKGZpbHRlciAkKFRBUkdFVF9QUk9EVUNUKSwkKHByb2R1Y3RzX3VzaW5nX3N0YXJsYXJrX2NvbmZpZykpKQpAQCAtMjM2LDE0ICsyMzYsMjIgQEAKICAgJChzaGVsbCBta2RpciAtcCAkKE9VVF9ESVIpL3JiYykKICAgJChjYWxsIGR1bXAtdmFyaWFibGVzLXJiYywgJChPVVRfRElSKS9yYmMvbWFrZV92YXJzX3ByZV9wcm9kdWN0X2NvbmZpZy5taykKIAotICAkKHNoZWxsIGJ1aWxkL3Nvb25nL3NjcmlwdHMvdXBkYXRlX291dCBcCi0gICAgJChPVVRfRElSKS9yYmMvcmJjX3Byb2R1Y3RfY29uZmlnX3Jlc3VsdHMubWsgXAotICAgIGJ1aWxkL3Nvb25nL3NjcmlwdHMvcmJjLXJ1biBcCi0gICAgJChjdXJyZW50X3Byb2R1Y3RfbWFrZWZpbGUpIFwKLSAgICAkKE9VVF9ESVIpL3JiYy9tYWtlX3ZhcnNfcHJlX3Byb2R1Y3RfY29uZmlnLm1rKQorICAkKHNoZWxsICQoT1VUX0RJUikvbWsycmJjIFwKKyAgICAtLW1vZGU9d3JpdGUgLXIgLS1vdXRkaXIgJChPVVRfRElSKS9yYmMgXAorICAgIC0tbGF1bmNoZXI9JChPVVRfRElSKS9yYmMvbGF1bmNoZXIucmJjIFwKKyAgICAtLWlucHV0X3ZhcmlhYmxlcz0kKE9VVF9ESVIpL3JiYy9tYWtlX3ZhcnNfcHJlX3Byb2R1Y3RfY29uZmlnLm1rIFwKKyAgICAtLW1ha2VmaWxlX2xpc3Q9JChPVVRfRElSKS8ubW9kdWxlX3BhdGhzL2NvbmZpZ3VyYXRpb24ubGlzdCBcCisgICAgJChjdXJyZW50X3Byb2R1Y3RfbWFrZWZpbGUpKQogICBpZm5lcSAoJCguU0hFTExTVEFUVVMpLDApCiAgICAgJChlcnJvciBwcm9kdWN0IGNvbmZpZ3VyYXRpb24gY29udmVydGVyIGZhaWxlZDogJCguU0hFTExTVEFUVVMpKQogICBlbmRpZgorCisgICQoc2hlbGwgYnVpbGQvc29vbmcvc2NyaXB0cy91cGRhdGVfb3V0ICQoT1VUX0RJUikvcmJjL3JiY19wcm9kdWN0X2NvbmZpZ19yZXN1bHRzLm1rIFwKKyAgICAkKE9VVF9ESVIpL3JiY3J1biAtLW1vZGU9cmJjICQoT1VUX0RJUikvcmJjL2xhdW5jaGVyLnJiYykKKyAgaWZuZXEgKCQoLlNIRUxMU1RBVFVTKSwwKQorICAgICQoZXJyb3IgcHJvZHVjdCBjb25maWd1cmF0aW9uIHJ1bm5lciBmYWlsZWQ6ICQoLlNIRUxMU1RBVFVTKSkKKyAgZW5kaWYKKwogICBpbmNsdWRlICQoT1VUX0RJUikvcmJjL3JiY19wcm9kdWN0X2NvbmZpZ19yZXN1bHRzLm1rCiBlbmRpZgogCkBAIC0yNzIsMjAgKzI4MCwyOSBAQAogCiBjdXJyZW50X3Byb2R1Y3RfbWFrZWZpbGUgOj0KIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ2hlY2sgcHJvZHVjdCBpbmNsdWRlIHRhZyBhbGxvd2xpc3QKLUJMVUVQUklOVF9JTkNMVURFX1RBR1NfQUxMT1dMSVNUIDo9IGNvbS5hbmRyb2lkLm1haW5saW5lX2dvIGNvbS5hbmRyb2lkLm1haW5saW5lCi0uS0FUSV9SRUFET05MWSA6PSBCTFVFUFJJTlRfSU5DTFVERV9UQUdTX0FMTE9XTElTVAotJChmb3JlYWNoIGluY2x1ZGVfdGFnLCQoUFJPRFVDVF9JTkNMVURFX1RBR1MpLCBcCi0JJChpZiAkKGZpbHRlciAkKGluY2x1ZGVfdGFnKSwkKEJMVUVQUklOVF9JTkNMVURFX1RBR1NfQUxMT1dMSVNUKSksLFwKLQkkKGNhbGwgcHJldHR5LWVycm9yLCAkKGluY2x1ZGVfdGFnKSBpcyBub3QgaW4gQkxVRVBSSU5UX0lOQ0xVREVfVEFHU19BTExPV0xJU1Q6ICQoQkxVRVBSSU5UX0lOQ0xVREVfVEFHU19BTExPV0xJU1QpKSkpCi0jIENyZWF0ZSBkZWZhdWx0IFBST0RVQ1RfSU5DTFVERV9UQUdTCi1pZmVxICgsICQoUFJPRFVDVF9JTkNMVURFX1RBR1MpKQotIyBTb29uZyBhbmFseXNpcyBpcyBnbG9iYWw6IGV2ZW4gdGhvdWdoIGEgbW9kdWxlIG1pZ2h0IG5vdCBiZSByZWxldmFudCB0byBhIHNwZWNpZmljIHByb2R1Y3QgKGUuZy4gYnVpbGRfdG9vbHMgZm9yIGFvc3BfYXJtKSwKLSMgd2Ugc3RpbGwgYW5hbHlzZSBpdC4KLSMgVGhpcyBtZWFucyB0aGF0IGluIHNldHVwcyB3aGVyZSB3ZSB0d28gaGF2ZSB0d28gcHJlYnVpbHRzIG9mIG1vZHVsZV9zZGssIHdlIG5lZWQgYSAiZGVmYXVsdCIgdG8gdXNlIGluIGFuYWx5c2lzCi0jIFRoaXMgc2hvdWxkIGJlIGEgbm8tb3AgaW4gYW9zcCBhbmQgaW50ZXJuYWwgc2luY2Ugbm8gQW5kcm9pZC5icCBmaWxlIGNvbnRhaW5zIGJsdWVwcmludF9wYWNrYWdlX2luY2x1ZGVzCi1QUk9EVUNUX0lOQ0xVREVfVEFHUyArPSBjb20uYW5kcm9pZC5tYWlubGluZSAjIFVzZSB0aGUgYmlnIGFuZHJvaWQgb25lIGJ5IGRlZmF1bHQKKyMgQU9TUCBhbmQgR29vZ2xlIHByb2R1Y3RzIGN1cnJlbnRseSBzaGFyZSB0aGUgc2FtZSBgYXBleF9jb250cmlidXRpb25zYCBpbiBuZXh0LgorIyBUaGlzIGNhdXNlcyBpc3N1ZXMgd2hlbiBidWlsZGluZyA8YW9zcF9wcm9kdWN0Pi1uZXh0LXVzZXJkZWJ1ZyBpbiBtYWluLgorIyBDcmVhdGUgYSB0ZW1wb3JhcnkgYWxsb3dsaXN0IHRvIGlnbm9yZSB0aGUgZ29vZ2xlIGFwZXhlcyBsaXN0ZWQgaW4gYGNvbnRlbnRzYCBvZiBhcGV4X2NvbnRyaWJ1dGlvbnMgb2YgYG5leHRgCisjICpmb3IgYW9zcCBwcm9kdWN0cyouCisjIFRPRE8oYi8zMDgxODcyNjgpOiBSZW1vdmUgdGhpcyBkZW55bGlzdCBtZWNoYW5pc20KKyMgVXNlIFBST0RVQ1RfUEFDS0FHRVMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYW4gYW9zcCBwcm9kdWN0LiBhb3NwIHByb2R1Y3RzIGRvIG5vdCB1c2UgZ29vZ2xlIHNpZ25lZCBhcGV4ZXMuCitpZ25vcmVfYXBleF9jb250cmlidXRpb25zIDo9CitpZmVxICgsJChmaW5kc3RyaW5nIGNvbS5nb29nbGUuYW5kcm9pZC5jb25zY3J5cHQsJChQUk9EVUNUX1BBQ0tBR0VTKSkkKGZpbmRzdHJpbmcgY29tLmdvb2dsZS5hbmRyb2lkLmdvLmNvbnNjcnlwdCwkKFBST0RVQ1RfUEFDS0FHRVMpKSkKKyAgaWdub3JlX2FwZXhfY29udHJpYnV0aW9ucyA6PSB0cnVlCitlbmRpZgoraWZlcSAodHJ1ZSwkKFBST0RVQ1RfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKSkKKyAgaWdub3JlX2FwZXhfY29udHJpYnV0aW9ucyA6PSB0cnVlCitlbmRpZgoraWZuZXEgKCQoRU1NQV9JTlNUUlVNRU5UKSQoRU1NQV9JTlNUUlVNRU5UX1NUQVRJQykkKEVNTUFfSU5TVFJVTUVOVF9GUkFNRVdPUkspJChDTEFOR19DT1ZFUkFHRSkkKE5BVElWRV9DT1ZFUkFHRV9QQVRIUyksKQorIyBDb3ZlcmFnZSBidWlsZHMgZm9yIFRBUkdFVF9SRUxFQVNFPWZvbyBzaG91bGQgYWx3YXlzIGJ1aWxkIGZyb20gc291cmNlLAorIyBldmVuIGlmIFRBUkdFVF9SRUxFQVNFPWZvbyB1c2VzIHByZWJ1aWx0IG1haW5saW5lIG1vZHVsZXMuCisjIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGNoZWNrZWQtaW4gcHJlYnVpbHRzIHdlcmUgZ2VuZXJhdGVkIHdpdGgKKyMgaW5zdHJ1bWVudGF0aW9uIHR1cm5lZCBvZmYuCisgIGlnbm9yZV9hcGV4X2NvbnRyaWJ1dGlvbnMgOj0gdHJ1ZQorZW5kaWYKKworaWZlcSAodHJ1ZSwgJChpZ25vcmVfYXBleF9jb250cmlidXRpb25zKSkKK1BST0RVQ1RfQlVJTERfSUdOT1JFX0FQRVhfQ09OVFJJQlVUSU9OX0NPTlRFTlRTIDo9IHRydWUKIGVuZGlmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0zODgsNiArNDA1LDEwIEBACiAgIFRBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUyA6PSAkKFBST0RVQ1RfQ0hBUkFDVEVSSVNUSUNTKQogZW5kaWYKIAoraWZuZGVmIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCisgIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMIDo9IDEwMDAwCitlbmRpZgorCiBpZmRlZiBQUk9EVUNUX0RFRkFVTFRfREVWX0NFUlRJRklDQVRFCiAgIGlmbmVxICgxLCQod29yZHMgJChQUk9EVUNUX0RFRkFVTFRfREVWX0NFUlRJRklDQVRFKSkpCiAgICAgJChlcnJvciBQUk9EVUNUX0RFRkFVTFRfREVWX0NFUlRJRklDQVRFPSckKFBST0RVQ1RfREVGQVVMVF9ERVZfQ0VSVElGSUNBVEUpJywgXApAQCAtNDA3LDYgKzQyOCw4IEBACiBQUk9EVUNUX0VYVFJBX09UQV9LRVlTIDo9ICQoc29ydCAkKFBST0RVQ1RfRVhUUkFfT1RBX0tFWVMpKQogUFJPRFVDVF9FWFRSQV9SRUNPVkVSWV9LRVlTIDo9ICQoc29ydCAkKFBST0RVQ1RfRVhUUkFfUkVDT1ZFUllfS0VZUykpCiAKK1BST0RVQ1RfVkFMSURBVElPTl9DSEVDS1MgOj0gJChzb3J0ICQoUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUykpCisKICMgUmVzb2x2ZSBhbmQgc2V0dXAgcGVyLW1vZHVsZSBkZXgtcHJlb3B0IGNvbmZpZ3MuCiBERVhQUkVPUFRfRElTQUJMRURfTU9EVUxFUyA6PQogIyBJZiBhIG1vZHVsZSBoYXMgbXVsdGlwbGUgc2V0dXBzLCB0aGUgZmlyc3QgdGFrZXMgcHJlY2VkZW5jZS4KQEAgLTQ4NSwxNSArNTA4LDYgQEAKICAgZW5kaWYKIGVuZGlmCiAKLWlmZGVmIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCi0gIGlmbmVxICgsJChjYWxsIG1hdGhfZ3Rfb3JfZXEsMjksJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpKQotICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gJChQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8yOSkKLSAgZW5kaWYKLSAgaWZuZXEgKCwkKGNhbGwgbWF0aF9ndF9vcl9lcSwzMywkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSkpCi0gICAgUFJPRFVDVF9QQUNLQUdFUyArPSAkKFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzMzKQotICBlbmRpZgotZW5kaWYKLQogIyBJZiBidWlsZCBjb21tYW5kIGRlZmluZXMgT1ZFUlJJREVfUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TLAogIyBvdmVycmlkZSBQUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMgd2l0aCBpdC4KIGlmZGVmIE9WRVJSSURFX1BST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUwpAQCAtNTI2LDcgKzU0MCw4IEBACiAgICAgUFJPRFVDVF9FTkZPUkNFX1BST0RVQ1RfUEFSVElUSU9OX0lOVEVSRkFDRSA6PSAkKE9WRVJSSURFX1BST0RVQ1RfRU5GT1JDRV9QUk9EVUNUX1BBUlRJVElPTl9JTlRFUkZBQ0UpCiAgIGVuZGlmCiBlbHNlIGlmZXEgKCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLCkKLSAgIyBObyBzaGlwcGluZyBsZXZlbCBkZWZpbmVkCisgICMgTm8gc2hpcHBpbmcgbGV2ZWwgZGVmaW5lZC4gRW5mb3JjZSB0aGUgcHJvZHVjdCBpbnRlcmZhY2UgYnkgZGVmYXVsdC4KKyAgUFJPRFVDVF9FTkZPUkNFX1BST0RVQ1RfUEFSVElUSU9OX0lOVEVSRkFDRSA6PSB0cnVlCiBlbHNlIGlmZXEgKCQoY2FsbCBtYXRoX2d0LCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLDI5KSx0cnVlKQogICAjIEVuZm9yY2UgcHJvZHVjdCBpbnRlcmZhY2UgaWYgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgaXMgZ3JlYXRlciB0aGFuIDI5LgogICBQUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFIDo9IHRydWUKQEAgLTUzNCwzNCArNTQ5LDc0IEBACiAKICQoS0FUSV9vYnNvbGV0ZV92YXIgT1ZFUlJJREVfUFJPRFVDVF9FTkZPUkNFX1BST0RVQ1RfUEFSVElUSU9OX0lOVEVSRkFDRSxVc2UgUFJPRFVDVF9FTkZPUkNFX1BST0RVQ1RfUEFSVElUSU9OX0lOVEVSRkFDRSBpbnN0ZWFkKQogCi0jIElmIGJ1aWxkIGNvbW1hbmQgZGVmaW5lcyBQUk9EVUNUX1VTRV9QUk9EVUNUX1ZOREtfT1ZFUlJJREUgYXMgYGZhbHNlYCwKLSMgUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTiB3aWxsIG5vdCBiZSBkZWZpbmVkIGF1dG9tYXRpY2FsbHkuCi0jIFBST0RVQ1RfVVNFX1BST0RVQ1RfVk5ES19PVkVSUklERSBjYW4gYmUgdXNlZCBmb3IgdGVzdGluZyBvbmx5LgotUFJPRFVDVF9VU0VfUFJPRFVDVF9WTkRLIDo9IGZhbHNlCi1pZm5lcSAoJChQUk9EVUNUX1VTRV9QUk9EVUNUX1ZOREtfT1ZFUlJJREUpLCkKLSAgUFJPRFVDVF9VU0VfUFJPRFVDVF9WTkRLIDo9ICQoUFJPRFVDVF9VU0VfUFJPRFVDVF9WTkRLX09WRVJSSURFKQotZWxzZSBpZmVxICgkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwpCi0gICMgTm8gc2hpcHBpbmcgbGV2ZWwgZGVmaW5lZAotZWxzZSBpZmVxICgkKGNhbGwgbWF0aF9ndCwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwyOSksdHJ1ZSkKLSAgIyBFbmZvcmNlIHByb2R1Y3QgaW50ZXJmYWNlIGZvciBWTkRLIGlmIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMIGlzIGdyZWF0ZXIKLSAgIyB0aGFuIDI5LgotICBQUk9EVUNUX1VTRV9QUk9EVUNUX1ZOREsgOj0gdHJ1ZQorIyBGcm9tIEFuZHJvaWQgViwgRGVmaW5lIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04gYXMgY3VycmVudCBieSBkZWZhdWx0LgorIyBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgYWxsIGRldmljZXMgaGF2ZSBwcm9kdWN0IHZhcmlhbnRzLgoraWZuZGVmIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04KKyAgUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTiA6PSBjdXJyZW50CiBlbmRpZgogCi1pZmVxICgkKFBST0RVQ1RfVVNFX1BST0RVQ1RfVk5ESyksdHJ1ZSkKLSAgaWZuZGVmIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04KLSAgICBQUk9EVUNUX1BST0RVQ1RfVk5ES19WRVJTSU9OIDo9IGN1cnJlbnQKLSAgZW5kaWYKLWVuZGlmCi0KLSQoS0FUSV9vYnNvbGV0ZV92YXIgUFJPRFVDVF9VU0VfUFJPRFVDVF9WTkRLLFVzZSBQUk9EVUNUX1BST0RVQ1RfVk5ES19WRVJTSU9OIGluc3RlYWQpCi0kKEtBVElfb2Jzb2xldGVfdmFyIFBST0RVQ1RfVVNFX1BST0RVQ1RfVk5ES19PVkVSUklERSxVc2UgUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTiBpbnN0ZWFkKQotCiBpZmRlZiBQUk9EVUNUX0VORk9SQ0VfUlJPX0VYRU1QVEVEX1RBUkdFVFMKICAgICAkKGVycm9yIFBST0RVQ1RfRU5GT1JDRV9SUk9fRVhFTVBURURfVEFSR0VUUyBpcyBkZXByZWNhdGVkLCBjb25zaWRlciB1c2luZyBSUk8gZm9yIFwKICAgICAgICQoUFJPRFVDVF9FTkZPUkNFX1JST19FWEVNUFRFRF9UQVJHRVRTKSkKIGVuZGlmCiAKKyMgVGhpcyB0YWJsZSBtYXBzIHNkayB2ZXJzaW9uIDM1IHRvIHZlbmRvciBhcGkgbGV2ZWwgMjAyNDA0IGFuZCBhc3N1bWVzIHllYXJseQorIyByZWxlYXNlIGZvciB0aGUgc2FtZSBtb250aC4gSWYgMTAwMDAgQVBJIGxldmVsIG9yIG1vcmUgaXMgdXNlZCwgd2hpY2ggdXN1YWxseQorIyByZXByZXNlbnRzICdjdXJyZW50JyBvciAnZnV0dXJlJyBBUEkgbGV2ZWxzLCBzZXZlcmFsIHplcm9zIGFyZSBhZGRlZCB0bworIyBwcmVzZXJ2ZSBvcmRlcmluZy4gU3BlY2lmaWNhbGx5IEFQSSBsZXZlbCAxMCwwMDAgaXMgY29udmVydGVkIHRvIDEwLDAwMCwwMDAKKyMgd2hpY2ggaW1wb3J0YW50bHkgaXMgZ3JlYXRlciB0aGFuIDIwMjQwNCA9IDIwMiw0MDQuIFRoaXMgY29udmVudGlvbiB3aWxsIGJyZWFrCisjIGluIDEwMCwwMDAgQ0UsIHdoaWNoIGlzIHRoZSBjbG9zZXN0IG11bHRpcGxlIG9mIDEwIHRoYXQgZG9lc24ndCBicmVhayBlYXJsaWVyCisjIHRoYW4gMTAsMDAwIGFzIGFuIEFQSSBsZXZlbCBicmVha3MuCitkZWZpbmUgc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwKKyQoaWYgJChjYWxsIG1hdGhfbHRfb3JfZXEsJCgxKSwzNCksJCgxKSwkKGlmICQoY2FsbCBtYXRoX2x0LCQoMSksMTAwMDApLDIwJChjYWxsIGludF9zdWJ0cmFjdCwkKDEpLDExKTA0LCQoMSkwMDApKQorZW5kZWYKKworaWZuZXEgKCQoY2FsbCBzZGstdG8tdmVuZG9yLWFwaS1sZXZlbCwzNCksMzQpCiskKGVycm9yIHNkay10by12ZW5kb3ItYXBpLWxldmVsIGlzIGJyb2tlbiBmb3IgcHJlLVRydW5rLVN0YWJsZSBTREtzKQorZW5kaWYKK2lmbmVxICgkKGNhbGwgc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwsMzUpLDIwMjQwNCkKKyQoZXJyb3Igc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwgaXMgYnJva2VuIGZvciBwb3N0LVRydW5rLVN0YWJsZSBTREtzKQorZW5kaWYKK2lmbmVxICgkKGNhbGwgc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwsMTAwMDApLDEwMDAwMDAwKQorJChlcnJvciBzZGstdG8tdmVuZG9yLWFwaS1sZXZlbCBpcyBicm9rZW4gZm9yIGN1cnJlbnQgJChjYWxsIHNkay10by12ZW5kb3ItYXBpLWxldmVsLDEwMDAwKSkKK2VuZGlmCisKK2lmZGVmIFBST0RVQ1RfU0hJUFBJTkdfVkVORE9SX0FQSV9MRVZFTAorIyBGb2xsb3cgdGhlIHZlcnNpb24gdGhhdCBpcyBzZXQgbWFudWFsbHkuCisgIFZTUl9WRU5ET1JfQVBJX0xFVkVMIDo9ICQoUFJPRFVDVF9TSElQUElOR19WRU5ET1JfQVBJX0xFVkVMKQorZWxzZQorICAjIFZTUiBBUEkgbGV2ZWwgaXMgdGhlIHZlbmRvciBhcGkgbGV2ZWwgb2YgdGhlIHByb2R1Y3Qgc2hpcHBpbmcgQVBJIGxldmVsLgorICBWU1JfVkVORE9SX0FQSV9MRVZFTCA6PSAkKGNhbGwgc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwsJChQTEFURk9STV9TREtfVkVSU0lPTikpCisgIGlmZGVmIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCisgICAgVlNSX1ZFTkRPUl9BUElfTEVWRUwgOj0gJChjYWxsIHNkay10by12ZW5kb3ItYXBpLWxldmVsLCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpKQorICBlbmRpZgorICBpZmRlZiBCT0FSRF9TSElQUElOR19BUElfTEVWRUwKKyAgICAjIFZlbmRvcnMgd2l0aCBHUkYgbXVzdCBkZWZpbmUgQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMIGZvciB0aGUgdmVuZG9yIEFQSSBsZXZlbC4KKyAgICAjIEluIHRoaXMgY2FzZSwgdGhlIFZTUiBBUEkgbGV2ZWwgaXMgdGhlIG1pbmltdW0gb2YgdGhlIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCisgICAgIyBhbmQgUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwKKyAgICBWU1JfVkVORE9SX0FQSV9MRVZFTCA6PSAkKGNhbGwgbWF0aF9taW4sJChWU1JfVkVORE9SX0FQSV9MRVZFTCksJChSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTCkpCisgIGVuZGlmCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gVlNSX1ZFTkRPUl9BUElfTEVWRUwKKworIyBCb29sZWFuIHZhcmlhYmxlIGRldGVybWluaW5nIGlmIHZlbmRvciBzZWFwcCBjb250ZXh0cyBpcyBlbmZvcmNlZAorQ0hFQ0tfVkVORE9SX1NFQVBQX1ZJT0xBVElPTlMgOj0gZmFsc2UKK2lmbmVxICgkKGNhbGwgbWF0aF9ndCwkKFZTUl9WRU5ET1JfQVBJX0xFVkVMKSwzNCksKQorICBDSEVDS19WRU5ET1JfU0VBUFBfVklPTEFUSU9OUyA6PSB0cnVlCitlbHNlIGlmbmVxICgkKFBST0RVQ1RfQ0hFQ0tfVkVORE9SX1NFQVBQX1ZJT0xBVElPTlMpLCkKKyAgQ0hFQ0tfVkVORE9SX1NFQVBQX1ZJT0xBVElPTlMgOj0gJChQUk9EVUNUX0NIRUNLX1ZFTkRPUl9TRUFQUF9WSU9MQVRJT05TKQorZW5kaWYKKy5LQVRJX1JFQURPTkxZIDo9IENIRUNLX1ZFTkRPUl9TRUFQUF9WSU9MQVRJT05TCisKKyMgQm9vbGVhbiB2YXJpYWJsZSBkZXRlcm1pbmluZyBpZiBzZWxpbnV4IGxhYmVscyBvZiAvZGV2IGFyZSBlbmZvcmNlZAorQ0hFQ0tfREVWX1RZUEVfVklPTEFUSU9OUyA6PSBmYWxzZQoraWZuZXEgKCQoY2FsbCBtYXRoX2d0LCQoVlNSX1ZFTkRPUl9BUElfTEVWRUwpLDIwMjQwNCksKQorICBDSEVDS19ERVZfVFlQRV9WSU9MQVRJT05TIDo9IHRydWUKK2Vsc2UgaWZuZXEgKCQoUFJPRFVDVF9DSEVDS19ERVZfVFlQRV9WSU9MQVRJT05TKSwpCisgIENIRUNLX0RFVl9UWVBFX1ZJT0xBVElPTlMgOj0gJChQUk9EVUNUX0NIRUNLX0RFVl9UWVBFX1ZJT0xBVElPTlMpCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gQ0hFQ0tfREVWX1RZUEVfVklPTEFUSU9OUworCiBkZWZpbmUgcHJvZHVjdC1vdmVycmlkZXMtY29uZmlnCiAkJChmb3JlYWNoIHJ1bGUsJCQoUFJPRFVDVF8kKDEpX09WRVJSSURFUyksXAogICAgICQkKGlmICQkKGZpbHRlciAyLCQkKHdvcmRzICQkKHN1YnN0IDosJCQoc3BhY2UpLCQkKHJ1bGUpKSkpLCxcCkBAIC01ODEsNiArNjM2LDE1IEBACiBlbmRpZgogZW5kZWYKIAoraWZuZGVmIFBST0RVQ1RfVklSVFVBTF9BQl9DT1dfVkVSU0lPTgorICBQUk9EVUNUX1ZJUlRVQUxfQUJfQ09XX1ZFUlNJT04gOj0gMgorICBpZmRlZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTAorICAgIGlmZXEgKHRydWUsJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksMzQpKQorICAgICAgUFJPRFVDVF9WSVJUVUFMX0FCX0NPV19WRVJTSU9OIDo9IDMKKyAgICBlbmRpZgorICBlbmRpZgorZW5kaWYKKwogIyBDb3B5IGFuZCBjaGVjayB0aGUgdmFsdWUgb2YgZWFjaCBQUk9EVUNUX0JVSUxEXypfSU1BR0UgdmFyaWFibGUKICQoZm9yZWFjaCBpbWFnZSwgXAogICAgIFBWTUZXIFwKZGlmZiAtLWdpdCBhL2NvcmUvcHJvZHVjdF9jb25maWcucmJjIGIvY29yZS9wcm9kdWN0X2NvbmZpZy5yYmMKaW5kZXggOTdjMWQwMC4uNTllMmM5NSAxMDA2NDQKLS0tIGEvY29yZS9wcm9kdWN0X2NvbmZpZy5yYmMKKysrIGIvY29yZS9wcm9kdWN0X2NvbmZpZy5yYmMKQEAgLTU0LDI1ICs1NCwxNiBAQAogICAgIGlmIHZhbHVlID09IE5vbmU6CiAgICAgICAgIHJldHVybgogICAgIGlmIHR5cGUodmFsdWUpID09ICJsaXN0IjoKLSAgICAgICAgaWYgX29wdGlvbnMucmVhcnJhbmdlOgotICAgICAgICAgICAgdmFsdWUgPSBfX3ByaW50dmFyc19yZWFycmFuZ2VfbGlzdCh2YWx1ZSkKLSAgICAgICAgaWYgX29wdGlvbnMuZm9ybWF0ID09ICJwcmV0dHkiOgotICAgICAgICAgICAgcHJpbnQoYXR0ciwgIj0iLCByZXByKHZhbHVlKSkKLSAgICAgICAgZWxpZiBfb3B0aW9ucy5mb3JtYXQgPT0gIm1ha2UiOgotICAgICAgICAgICAgdmFsdWUgPSBsaXN0KHZhbHVlKQotICAgICAgICAgICAgZm9yIGksIHggaW4gZW51bWVyYXRlKHZhbHVlKToKLSAgICAgICAgICAgICAgICBpZiB0eXBlKHgpID09ICJ0dXBsZSIgYW5kIGxlbih4KSA9PSAxOgotICAgICAgICAgICAgICAgICAgICB2YWx1ZVtpXSA9ICJAaW5oZXJpdDoiICsgeFswXSArICIubWsiCi0gICAgICAgICAgICAgICAgZWxpZiB0eXBlKHgpICE9ICJzdHJpbmciOgotICAgICAgICAgICAgICAgICAgICBmYWlsKCJXYXNuJ3QgYSBsaXN0IG9mIHN0cmluZ3M6IiwgYXR0ciwgIiB2YWx1ZToiLCB2YWx1ZSkKLSAgICAgICAgICAgIHByaW50KGF0dHIsICI6PSIsICIgIi5qb2luKHZhbHVlKSkKLSAgICBlbGlmIF9vcHRpb25zLmZvcm1hdCA9PSAicHJldHR5IjoKLSAgICAgICAgcHJpbnQoYXR0ciwgIj0iLCByZXByKHZhbHVlKSkKLSAgICBlbGlmIF9vcHRpb25zLmZvcm1hdCA9PSAibWFrZSI6CisgICAgICAgIHZhbHVlID0gbGlzdCh2YWx1ZSkKKyAgICAgICAgZm9yIGksIHggaW4gZW51bWVyYXRlKHZhbHVlKToKKyAgICAgICAgICAgIGlmIHR5cGUoeCkgPT0gInR1cGxlIiBhbmQgbGVuKHgpID09IDE6CisgICAgICAgICAgICAgICAgdmFsdWVbaV0gPSAiQGluaGVyaXQ6IiArIHhbMF0gKyAiLm1rIgorICAgICAgICAgICAgZWxpZiB0eXBlKHgpICE9ICJzdHJpbmciOgorICAgICAgICAgICAgICAgIGZhaWwoIldhc24ndCBhIGxpc3Qgb2Ygc3RyaW5nczoiLCBhdHRyLCAiIHZhbHVlOiIsIHZhbHVlKQorICAgICAgICBwcmludChhdHRyLCAiOj0iLCAiICIuam9pbih2YWx1ZSkpCisgICAgZWxzZToKICAgICAgICAgIyBUcmltIGFsbCBzcGFjaW5nIHRvIGEgc2luZ2xlIHNwYWNlCiAgICAgICAgIHByaW50KGF0dHIsICI6PSIsIF9ta3N0cmlwKHZhbHVlKSkKLSAgICBlbHNlOgotICAgICAgICBmYWlsKCJiYWQgb3V0cHV0IGZvcm1hdCIsIF9vcHRpb25zLmZvcm1hdCkKIAogZGVmIF9wcmludHZhcnMoc3RhdGUpOgogICAgICIiIlByaW50cyBjb25maWd1cmF0aW9uIGFuZCBnbG9iYWwgdmFyaWFibGVzLiIiIgpAQCAtODMsOCArNzQsNyBAQAogICAgICAgICAgICAgZm9yIG5zbmFtZSwgbnN2YXJzIGluIHNvcnRlZCh2YWwuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICAgIyBEZWZpbmUgU09PTkdfQ09ORklHXzxucz4gZm9yIE1ha2UsIG90aGV3aXNlCiAgICAgICAgICAgICAgICAgIyBpdCBjYW5ub3QgYmUgYWRkZWQgdG8gLktBVElfUkVBRE9OTFkgbGlzdAotICAgICAgICAgICAgICAgIGlmIF9vcHRpb25zLmZvcm1hdCA9PSAibWFrZSI6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KCJTT09OR19DT05GSUdfIiArIG5zbmFtZSwgIjo9IiwgIiAiLmpvaW4obnN2YXJzLmtleXMoKSkpCisgICAgICAgICAgICAgICAgcHJpbnQoIlNPT05HX0NPTkZJR18iICsgbnNuYW1lLCAiOj0iLCAiICIuam9pbihuc3ZhcnMua2V5cygpKSkKICAgICAgICAgICAgICAgICBmb3IgdmFyLCB2YWwgaW4gc29ydGVkKG5zdmFycy5pdGVtcygpKToKICAgICAgICAgICAgICAgICAgICAgaWYgdmFsOgogICAgICAgICAgICAgICAgICAgICAgICAgX19wcmludF9hdHRyKCJTT09OR19DT05GSUdfJXNfJXMiICUgKG5zbmFtZSwgdmFyKSwgdmFsKQpAQCAtMTA1LDExICs5NSw2IEBACiAgICAgICAgIGVsaWYgYXR0ciBub3QgaW4gZ2xvYmFsc19iYXNlIG9yIGdsb2JhbHNfYmFzZVthdHRyXSAhPSB2YWw6CiAgICAgICAgICAgICBfX3ByaW50X2F0dHIoYXR0ciwgdmFsKQogCi1kZWYgX19wcmludHZhcnNfcmVhcnJhbmdlX2xpc3QodmFsdWVfbGlzdCk6Ci0gICAgIiIiUmVhcnJhbmdlIHZhbHVlIGxpc3Q6IHJldHVybiBvbmx5IGRpc3RpbmN0IGVsZW1lbnRzLCBtYXliZSBzb3J0ZWQuIiIiCi0gICAgc2VlbiA9IHtpdGVtOiAwIGZvciBpdGVtIGluIHZhbHVlX2xpc3R9Ci0gICAgcmV0dXJuIHNvcnRlZChzZWVuLmtleXMoKSkgaWYgX29wdGlvbnMucmVhcnJhbmdlID09ICJzb3J0IiBlbHNlIHNlZW4ua2V5cygpCi0KIGRlZiBfX3NvcnRfcGNtX25hbWVzKHBjbV9uYW1lcyk6CiAgICAgIyBXZSBoYXZlIHRvIGFkZCBhbiBleHRlbnNpb24gYmFjayBvbnRvIHRoZSBwY20gbmFtZXMgd2hlbiBzb3J0aW5nLAogICAgICMgb3IgZWxzZSB0aGUgc29ydCBvcmRlciBjb3VsZCBiZSB3cm9uZyB3aGVuIG9uZSBpcyBhIHByZWZpeCBvZiBhbm90aGVyLgpAQCAtMzY2LDYgKzM1MSw3IEBACiAgICAgICAgICAgICAgICAgaWYgY2ZnLmdldChhdHRyLCAiIikgPT0gIiI6CiAgICAgICAgICAgICAgICAgICAgIGNmZ1thdHRyXSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgIHBlcmNvbGF0ZWRfYXR0cnNbYXR0cl0gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGNoaWxkX2NmZy5wb3AoYXR0cikKIAogICAgIGZvciBhdHRyIGluIF9vcHRpb25zLnRyYWNlX3ZhcmlhYmxlczoKICAgICAgICAgaWYgYXR0ciBpbiBwZXJjb2xhdGVkX2F0dHJzOgpAQCAtMzc1LDcgKzM2MSw3IEBACiAgICAgdmFsdWUgPSBmcm9tX2NmZy5nZXQoYXR0ciwgW10pCiAgICAgaWYgdmFsdWU6CiAgICAgICAgIHRvX2xpc3QuZXh0ZW5kKHZhbHVlKQotICAgICAgICBmcm9tX2NmZ1thdHRyXSA9IFtdCisgICAgICAgIGZyb21fY2ZnLnBvcChhdHRyKQogCiBkZWYgX2luZGlyZWN0KHBjbV9uYW1lKToKICAgICAiIiJSZXR1cm5zIGNvbmZpZ3VyYXRpb24gaXRlbSBmb3IgdGhlIGluaGVyaXRlZCBtb2R1bGUuIiIiCkBAIC0zOTQsNyArMzgwLDcgQEAKIGRlZiBfc29vbmdfY29uZmlnX3NldChnLCBuc25hbWUsIHZhciwgdmFsdWUpOgogICAgICIiIkFzc2lnbnMgdGhlIHZhbHVlIHRvIHRoZSB2YXJpYWJsZSBpbiB0aGUgbmFtZXNwYWNlLiIiIgogICAgIF9zb29uZ19jb25maWdfbmFtZXNwYWNlKGcsIG5zbmFtZSkKLSAgICBnW19zb29uZ19jb25maWdfbmFtZXNwYWNlc19rZXldW25zbmFtZV1bdmFyXT12YWx1ZQorICAgIGdbX3Nvb25nX2NvbmZpZ19uYW1lc3BhY2VzX2tleV1bbnNuYW1lXVt2YXJdPV9ta3N0cmlwKHZhbHVlKQogCiBkZWYgX3Nvb25nX2NvbmZpZ19hcHBlbmQoZywgbnNuYW1lLCB2YXIsIHZhbHVlKToKICAgICAiIiJBcHBlbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIG5hbWVzcGFjZS4iIiIKQEAgLTQwMiw5ICszODgsOSBAQAogICAgIG5zID0gZ1tfc29vbmdfY29uZmlnX25hbWVzcGFjZXNfa2V5XVtuc25hbWVdCiAgICAgb2xkdiA9IG5zLmdldCh2YXIpCiAgICAgaWYgb2xkdiA9PSBOb25lOgotICAgICAgICBuc1t2YXJdID0gdmFsdWUKKyAgICAgICAgbnNbdmFyXSA9IF9ta3N0cmlwKHZhbHVlKQogICAgIGVsc2U6Ci0gICAgICAgIG5zW3Zhcl0gKz0gIiAiICsgdmFsdWUKKyAgICAgICAgbnNbdmFyXSArPSAiICIgKyBfbWtzdHJpcCh2YWx1ZSkKIAogCiBkZWYgX3Nvb25nX2NvbmZpZ19nZXQoZywgbnNuYW1lLCB2YXIpOgpAQCAtNjkxLDE2ICs2NzcsOCBAQAogICAgIHJibGZfbG9nKGZpbGUsICJ3YXJuaW5nIiwgbWVzc2FnZSwgc2VwID0gJzonKQogCiBkZWYgX21rMnJiY19lcnJvcihsb2MsIG1lc3NhZ2UpOgotICAgICIiIlByaW50cyBhIG1lc3NhZ2UgYWJvdXQgY29udmVyc2lvbiBlcnJvciBhbmQgc3RvcHMuCi0KLSAgICBJZiBSQkNfTUsyUkJDX0NPTlRJTlVFIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwKLSAgICB0aGUgZXhlY3V0aW9uIHdpbGwgY29udGludWUgYWZ0ZXIgdGhlIG1lc3NhZ2UgaXMgcHJpbnRlZC4KLSAgICAiIiIKLSAgICBpZiBfb3B0aW9ucy5tazJyYmNfY29udGludWU6Ci0gICAgICAgIHJibGZfbG9nKGxvYywgbWVzc2FnZSwgc2VwID0gJzonKQotICAgIGVsc2U6Ci0gICAgICAgIF9ta2Vycm9yKGxvYywgbWVzc2FnZSkKLQorICAgICIiIlByaW50cyBhIG1lc3NhZ2UgYWJvdXQgY29udmVyc2lvbiBlcnJvciBhbmQgc3RvcHMuIiIiCisgICAgX21rZXJyb3IobG9jLCBtZXNzYWdlKQogCiBkZWYgX21raW5mbyhmaWxlLCBtZXNzYWdlID0gIiIpOgogICAgICIiIlByaW50cyBpbmZvLiIiIgpAQCAtODczLDM5ICs4NTEsMTIgQEAKICAgICAgICAgICAgICMgQ2F1c2UgdGhlIHZhcmlhYmxlIHRvIGFwcGVhciBzZXQgbGlrZSB0aGUgbWFrZSB2ZXJzaW9uIGRvZXMKICAgICAgICAgICAgIGdbdl0gPSAiIgogCi0KLWRlZiBfX2dldF9vcHRpb25zKCk6Ci0gICAgIiIiUmV0dXJucyBzdHJ1Y3QgY29udGFpbmluZyBydW50aW1lIGdsb2JhbCBzZXR0aW5ncy4iIiIKLSAgICBzZXR0aW5ncyA9IGRpY3QoCi0gICAgICAgIGZvcm1hdCA9ICJwcmV0dHkiLAotICAgICAgICByZWFycmFuZ2UgPSAiIiwKLSAgICAgICAgdHJhY2VfbW9kdWxlcyA9IEZhbHNlLAotICAgICAgICB0cmFjZV92YXJpYWJsZXMgPSBbXSwKLSAgICAgICAgbWsycmJjX2NvbnRpbnVlID0gRmFsc2UsCi0gICAgKQotICAgIGZvciB4IGluIGdldGF0dHIocmJsZl9jbGksICJSQkNfT1VUIiwgIiIpLnNwbGl0KCIsIik6Ci0gICAgICAgIGlmIHggPT0gInNvcnQiIG9yIHggPT0gInVuaXF1ZSI6Ci0gICAgICAgICAgICBpZiBzZXR0aW5nc1sicmVhcnJhbmdlIl06Ci0gICAgICAgICAgICAgICAgZmFpbCgiUkJDX09VVDogZWl0aGVyIHNvcnQgb3IgdW5pcXVlIGlzIGFsbG93ZWQgKGFuZCBzb3J0IGltcGxpZXMgdW5pcXVlKSIpCi0gICAgICAgICAgICBzZXR0aW5nc1sicmVhcnJhbmdlIl0gPSB4Ci0gICAgICAgIGVsaWYgeCA9PSAicHJldHR5IiBvciB4ID09ICJtYWtlIjoKLSAgICAgICAgICAgIHNldHRpbmdzWyJmb3JtYXQiXSA9IHgKLSAgICAgICAgZWxpZiB4ID09ICJnbG9iYWwiOgotICAgICAgICAgICAgIyBUT0RPOiBSZW1vdmUgdGhpcywga2VwdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxpZiB4ICE9ICIiOgotICAgICAgICAgICAgZmFpbCgiUkJDX09VVDogZ290ICVzLCBzaG91bGQgYmUgb25lIG9mOiBbcHJldHR5fG1ha2VdIFtzb3J0fHVuaXF1ZV0iICUgeCkKLSAgICBmb3IgeCBpbiBnZXRhdHRyKHJibGZfY2xpLCAiUkJDX0RFQlVHIiwgIiIpLnNwbGl0KCIsIik6Ci0gICAgICAgIGlmIHggPT0gIiF0cmFjZSI6Ci0gICAgICAgICAgICBzZXR0aW5nc1sidHJhY2VfbW9kdWxlcyJdID0gVHJ1ZQotICAgICAgICBlbGlmIHggIT0gIiI6Ci0gICAgICAgICAgICBzZXR0aW5nc1sidHJhY2VfdmFyaWFibGVzIl0uYXBwZW5kKHgpCi0gICAgaWYgZ2V0YXR0cihyYmxmX2NsaSwgIlJCQ19NSzJSQkNfQ09OVElOVUUiLCAiIik6Ci0gICAgICAgIHNldHRpbmdzWyJtazJyYmNfY29udGludWUiXSA9IFRydWUKLSAgICByZXR1cm4gc3RydWN0KCoqc2V0dGluZ3MpCi0KICMgU2V0dGluZ3MgdXNlZCBkdXJpbmcgZGVidWdnaW5nLgotX29wdGlvbnMgPSBfX2dldF9vcHRpb25zKCkKK19vcHRpb25zID0gc3RydWN0KAorICAgIHRyYWNlX21vZHVsZXMgPSBGYWxzZSwKKyAgICB0cmFjZV92YXJpYWJsZXMgPSBbXSwKKykKKwogcmJsZiA9IHN0cnVjdCgKICAgICBzb29uZ19jb25maWdfbmFtZXNwYWNlID0gX3Nvb25nX2NvbmZpZ19uYW1lc3BhY2UsCiAgICAgc29vbmdfY29uZmlnX2FwcGVuZCA9IF9zb29uZ19jb25maWdfYXBwZW5kLApkaWZmIC0tZ2l0IGEvY29yZS9wcm9kdWN0X3ZhbGlkYXRpb25fY2hlY2tzLm1rIGIvY29yZS9wcm9kdWN0X3ZhbGlkYXRpb25fY2hlY2tzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZDk3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Byb2R1Y3RfdmFsaWRhdGlvbl9jaGVja3MubWsKQEAgLTAsMCArMSw3MiBAQAorIyBQUk9EVUNUX1ZBTElEQVRJT05fQ0hFQ0tTIGFsbG93cyB5b3UgdG8gZW5mb3JjZSB0aGF0IHlvdXIgcHJvZHVjdCBjb25maWcgdmFyaWFibGVzIGZvbGxvdyBzb21lCisjIHJ1bGVzLiBUbyB1c2UgaXQsIGFkZCB0aGUgcGF0aHMgdG8gc3RhcmxhcmsgY29uZmlndXJhdGlvbiBsYW5ndWFnZSAoc2NsKSBmaWxlcyBpbgorIyBQUk9EVUNUX1ZBTElEQVRJT05fQ0hFQ0tTLiBBIHZhbGlkYXRlX3Byb2R1Y3RfdmFyaWFibGVzIGZ1bmN0aW9uIGluIHRob3NlIGZpbGVzIHdpbGwgYmUgY2FsbGVkCisjIHdpdGggYSBzaW5nbGUgImNvbnRleHQiIG9iamVjdC4KKyMKKyMgVGhlIGNvbnRleHQgb2JqZWN0IGN1cnJlbnRseSAyIGF0dHJpYnV0ZXM6CisjICAgLSBwcm9kdWN0X3ZhcmlhYmxlczogVGhpcyBoYXMgYWxsIHRoZSBwcm9kdWN0IHZhcmlhYmxlcy4gQWxsIHRoZSB2YXJpYWJsZXMgYXJlIGVpdGhlciBvZiB0eXBlCisjICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9yIGxpc3QsIG1vcmUgYWNjdXJhdGUgdHlwaW5nIChsaWtlIGJvb2wpIGlzbid0IGtub3duLgorIyAgIC0gYm9hcmRfdmFyaWFibGVzOiBUaGlzIG9ubHkgaGFzIGEgc21hbGwgc3Vic2V0IG9mIHRoZSBib2FyZCB2YXJpYWJsZXMsIGJlY2F1c2UgdGhlcmUgaXNuJ3QgYQorIyAgICAgICAgICAgICAgICAgICAgICBrbm93biBsaXN0IG9mIGJvYXJkIHZhcmlhYmxlcy4gRmVlbCBmcmVlIHRvIGV4cGFuZCB0aGUgc3Vic2V0IGlmIHlvdSBuZWVkIGEKKyMgICAgICAgICAgICAgICAgICAgICAgbmV3IHZhcmlhYmxlLgorIworIyBZb3UgY2FuIHRoZW4gaW5zcGVjdCAoYnV0IG5vdCBtb2RpZnkpIHRoZXNlIHZhcmlhYmxlcyBhbmQgZmFpbCgpIGlmIHRoZXkgZG9uJ3QgbWVldCB5b3VyCisjIHJlcXVpcmVtZW50cy4gRXhhbXBsZToKKyMKKyMgSW4gYSBwcm9kdWN0IGNvbmZpZyBmaWxlOiBQUk9EVUNUX1ZBTElEQVRJT05fQ0hFQ0tTICs9IC8vcGF0aC90by9teV92YWxpZGF0aW9ucy5zY2wKKyMgSW4gbXlfdmFsaWRhdGlvbnMuc2NsOgorIyBkZWYgdmFsaWRhdGVfcHJvZHVjdF92YXJpYWJsZXMoY3R4KToKKyMgICAgIGZvciBkaXIgaW4gY3R4LmJvYXJkX3ZhcmlhYmxlcy5CT0FSRF9TRVBPTElDWV9ESVJTOgorIyAgICAgICAgIGlmIG5vdCBkaXIuc3RhcnRzd2l0aCgnc3lzdGVtL3NlcG9saWN5LycpOgorIyAgICAgICAgICAgICBmYWlsKCdPbmx5IHNlcG9saWNpZXMgaW4gc3lzdGVtL3NlcGxpY3kgYXJlIGFsbG93ZWQsIGZvdW5kOiAnICsgZGlyKQorCitpZmRlZiBQUk9EVUNUX1ZBTElEQVRJT05fQ0hFQ0tTCisKKyQoaWYgJChmaWx0ZXItb3V0IC8vJS5zY2wsJChQUk9EVUNUX1ZBTElEQVRJT05fQ0hFQ0tTKSksIFwKKwkkKGVycm9yIEFsbCBQUk9EVUNUX1ZBTElEQVRJT05fQ0hFQ0tTIGZpbGVzIG11c3Qgc3RhcnQgd2l0aCAvLyBhbmQgZW5kIHdpdGggLnNjbCwgZXhjZXB0aW9uczogJChmaWx0ZXItb3V0IC8vJS5zY2wsJChQUk9EVUNUX1ZBTElEQVRJT05fQ0hFQ0tTKSkpKQorCitrbm93bl9ib2FyZF92YXJpYWJsZXMgOj0gXAorICBCT0FSRF9WRU5ET1JfU0VQT0xJQ1lfRElSUyBCT0FSRF9TRVBPTElDWV9ESVJTIFwKKyAgU1lTVEVNX0VYVF9QUklWQVRFX1NFUE9MSUNZX0RJUlMgXAorICBTWVNURU1fRVhUX1BVQkxJQ19TRVBPTElDWV9ESVJTIFwKKyAgUFJPRFVDVF9QVUJMSUNfU0VQT0xJQ1lfRElSUyBcCisgIFBST0RVQ1RfUFJJVkFURV9TRVBPTElDWV9ESVJTCisKK2tub3duX2JvYXJkX2xpc3RfdmFyaWFibGVzIDo9IFwKKyAgQk9BUkRfVkVORE9SX1NFUE9MSUNZX0RJUlMgQk9BUkRfU0VQT0xJQ1lfRElSUyBcCisgIFNZU1RFTV9FWFRfUFJJVkFURV9TRVBPTElDWV9ESVJTIFwKKyAgU1lTVEVNX0VYVF9QVUJMSUNfU0VQT0xJQ1lfRElSUyBcCisgIFBST0RVQ1RfUFVCTElDX1NFUE9MSUNZX0RJUlMgXAorICBQUk9EVUNUX1BSSVZBVEVfU0VQT0xJQ1lfRElSUworCitlc2NhcGVfc3Rhcmxhcmtfc3RyaW5nPSQoc3Vic3QgIixcIiwkKHN1YnN0IFwsXFwsJCgxKSkpCitwcm9kdWN0X3ZhcmlhYmxlX3N0YXJsYXJrX3ZhbHVlPSQoaWYgJChmaWx0ZXIgJCgxKSwkKF9wcm9kdWN0X2xpc3RfdmFycykgJChrbm93bl9ib2FyZF9saXN0X3ZhcmlhYmxlcykpLFskKGZvcmVhY2ggdywkKCQoMSkpLCIkKGNhbGwgZXNjYXBlX3N0YXJsYXJrX3N0cmluZywkKHcpKSIsICldLCIkKGNhbGwgZXNjYXBlX3N0YXJsYXJrX3N0cmluZywkKDEpKSIpCitmaWxlbmFtZV90b19zdGFybGFyaz0kKHN1YnN0IC0sXywkKHN1YnN0IC8sXywkKHN1YnN0IC4sXywkKDEpKSkpCitfYzo9JChmb3JlYWNoIGYsJChQUk9EVUNUX1ZBTElEQVRJT05fQ0hFQ0tTKSwkKG5ld2xpbmUpbG9hZCgiJChmKSIsIHZhbGlkYXRlX3Byb2R1Y3RfdmFyaWFibGVzXyQoY2FsbCBmaWxlbmFtZV90b19zdGFybGFyaywkKGYpKSA9ICJ2YWxpZGF0ZV9wcm9kdWN0X3ZhcmlhYmxlcyIpKQorIyBUT0RPOiB3ZSBzaG91bGQgZnJlZXplIHRoZSBjb250ZXh0IGJlY2F1c2UgaXQgY29udGFpbnMgbXV0YWJsZSBsaXN0cywgc28gdGhhdCB2YWxpZGF0aW9uIGNoZWNrcyBjYW4ndCBhZmZlY3QgZWFjaCBvdGhlcgorX2MrPSQobmV3bGluZSlfY3R4ID0gc3RydWN0KAorX2MrPSQobmV3bGluZSlwcm9kdWN0X3ZhcmlhYmxlcyA9IHN0cnVjdCgKK19jKz0kKGZvcmVhY2ggdiwkKF9wcm9kdWN0X3Zhcl9saXN0KSwkKG5ld2xpbmUpICAkKHYpID0gJChjYWxsIHByb2R1Y3RfdmFyaWFibGVfc3RhcmxhcmtfdmFsdWUsJCh2KSksKQorX2MrPSQobmV3bGluZSkpLAorX2MrPSQobmV3bGluZSlib2FyZF92YXJpYWJsZXMgPSBzdHJ1Y3QoCitfYys9JChmb3JlYWNoIHYsJChrbm93bl9ib2FyZF92YXJpYWJsZXMpLCQobmV3bGluZSkgICQodikgPSAkKGNhbGwgcHJvZHVjdF92YXJpYWJsZV9zdGFybGFya192YWx1ZSwkKHYpKSwpCitfYys9JChuZXdsaW5lKSkKK19jKz0kKG5ld2xpbmUpKQorX2MrPSQoZm9yZWFjaCBmLCQoUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUyksJChuZXdsaW5lKXZhbGlkYXRlX3Byb2R1Y3RfdmFyaWFibGVzXyQoY2FsbCBmaWxlbmFtZV90b19zdGFybGFyaywkKGYpKShfY3R4KSkKK19jKz0kKG5ld2xpbmUpdmFyaWFibGVzX3RvX2V4cG9ydF90b19tYWtlID0ge30KKyQoS0FUSV9maWxlX25vX3JlcnVuID4kKE9VVF9ESVIpL3Byb2R1Y3RfdmFsaWRhdGlvbl9jaGVja3NfZW50cnlwb2ludC5zY2wsJChfYykpCitmaWxlbmFtZV90b19zdGFybGFyazo9Citlc2NhcGVfc3Rhcmxhcmtfc3RyaW5nOj0KK3Byb2R1Y3RfdmFyaWFibGVfc3RhcmxhcmtfdmFsdWU6PQora25vd25fYm9hcmRfdmFyaWFibGVzIDo9Citrbm93bl9ib2FyZF9saXN0X3ZhcmlhYmxlcyA6PQorCisjIEV4Y2x1ZGUgdGhlIGVudHJ5cG9pbnQgZmlsZSBhcyBhIGRlcGVuZGVuY3kgKGJ5IHBhc3NpbmcgaXQgYXMgdGhlIDJuZCBhcmd1bWVudCkgc28gdGhhdCB3ZSBkb24ndAorIyByZXJ1biBrYXRpIGV2ZXJ5IGJ1aWxkLiBFdmVuIHRob3VnaCB3ZSdyZSB1c2luZyBLQVRJX2ZpbGVfbm9fcmVydW4sIHByb2R1Y3QgY29uZmlnIGlzIHJ1biBldmVyeQorIyBidWlsZCwgc28gdGhlIGZpbGUgd2lsbCBzdGlsbCBiZSByZXdyaXR0ZW4uCisjCisjIFdlIGFsc28gbmVlZCB0byBwYXNzIC0tYWxsb3dfZXh0ZXJuYWxfZW50cnlwb2ludCB0byByYmNydW4gaW4gY2FzZSB0aGUgT1VUX0RJUiBpcyBzZXQgdG8gc29tZXRoaW5nCisjIG91dHNpZGUgb2YgdGhlIHNvdXJjZSB0cmVlLgorJChjYWxsIHJ1bi1zdGFybGFyaywkKE9VVF9ESVIpL3Byb2R1Y3RfdmFsaWRhdGlvbl9jaGVja3NfZW50cnlwb2ludC5zY2wsJChPVVRfRElSKS9wcm9kdWN0X3ZhbGlkYXRpb25fY2hlY2tzX2VudHJ5cG9pbnQuc2NsLC0tYWxsb3dfZXh0ZXJuYWxfZW50cnlwb2ludCkKKworZW5kaWYgIyBpZmRlZiBQUk9EVUNUX1ZBTElEQVRJT05fQ0hFQ0tTCmRpZmYgLS1naXQgYS9jb3JlL3Byb2d1YXJkLmZsYWdzIGIvY29yZS9wcm9ndWFyZC5mbGFncwppbmRleCBkNzkwMDYxLi5hYTQwNmI5IDEwMDY0NAotLS0gYS9jb3JlL3Byb2d1YXJkLmZsYWdzCisrKyBiL2NvcmUvcHJvZ3VhcmQuZmxhZ3MKQEAgLTE1LDYgKzE1LDEzIEBACiAgICAgQGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nICo7CiB9CiAKKyMgS2VlcCBjbGFzc2VzIGFuZCBtZW1iZXJzIHdpdGggcGxhdGZvcm0gQFRlc3RBcGkgYW5ub3RhdGlvbnMsIHNpbWlsYXIgdG8KKyMgQFZpc2libGVGb3JUZXN0aW5nLgorLWtlZXAgQGFuZHJvaWQuYW5ub3RhdGlvbi5UZXN0QXBpIGNsYXNzICoKKy1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzICogeworICAgIEBhbmRyb2lkLmFubm90YXRpb24uVGVzdEFwaSAqOworfQorCiAjIEtlZXAgY2xhc3NlcyBhbmQgbWVtYmVycyB3aXRoIG5vbi1wbGF0Zm9ybSBAVmlzaWJsZUZvclRlc3RpbmcgYW5ub3RhdGlvbnMsIGJ1dAogIyBvbmx5IHdpdGhpbiBwbGF0Zm9ybS1kZWZpbmVkIHBhY2thZ2VzLiBUaGlzIGF2b2lkcyBrZWVwaW5nIGV4dGVybmFsLCBsaWJyYXJ5LXNwZWNpZmljCiAjIHRlc3QgY29kZSB0aGF0IGlzbid0IGFjdHVhbGx5IG5lZWRlZCBmb3IgcGxhdGZvcm0gdGVzdGluZy4KQEAgLTUxLDQgKzU4LDE0IEBACiAgICAgQCoqYW5kcm9pZCoqLmFubm90YXRpb24qLktlZXAgPGluaXQ+KC4uLik7CiB9CiAKKyMgS2VlcCBEYWx2aWsgb3B0aW1pemF0aW9uIGFubm90YXRpb25zLiBUaGVzZSBhbm5vdGF0aW9ucyBhcmUgc3BlY2lhbCBpbiB0aGF0CisjIDEpIHdlIHdhbnQgdGhlbSBwcmVzZXJ2ZWQgZm9yIHZpc2liaWxpdHkgd2l0aCBBUlQsIGJ1dCAyKSB0aGV5IGRvbid0IGhhdmUKKyMgUlVOVElNRSByZXRlbnRpb24uIFRoZXNlIG1pbmltYWwga2VlcCBydWxlcyBlbnN1cmUgdGhleSdyZSBub3Qgc3RyaXBwZWQgYnkgUjguCisjIFRPRE8oYi8yMTU0MTczODgpOiBFeHBvcnQgdGhpcyBydWxlIGZyb20gdGhlIG93bmluZyBsaWJyYXJ5LCBjb3JlLWxpYmFydCwKKyMgdmlhIGV4cG9ydF9wcm9ndWFyZF9mbGFnc19maWxlcy4KKy1rZWVwY2xhc3NtZW1iZXJzLGFsbG93c2hyaW5raW5nLGFsbG93b3B0aW1pemF0aW9uLGFsbG93b2JmdXNjYXRpb24sYWxsb3dhY2Nlc3Ntb2RpZmljYXRpb24gY2xhc3MgKiB7CisgICAgQGRhbHZpay5hbm5vdGF0aW9uLm9wdGltaXphdGlvbi4qKiAqOworfQorCiAtaW5jbHVkZSBwcm9ndWFyZF9iYXNpY19rZWVwcy5mbGFncworLWluY2x1ZGUgcHJvZ3VhcmQva290bGluLmZsYWdzCmRpZmYgLS1naXQgYS9jb3JlL3Byb2d1YXJkL2tvdGxpbi5mbGFncyBiL2NvcmUvcHJvZ3VhcmQva290bGluLmZsYWdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNmJmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Byb2d1YXJkL2tvdGxpbi5mbGFncwpAQCAtMCwwICsxLDIxIEBACisjIElnbm9yZSBtaXNzaW5nIEtvdGxpbiBtZXRhLWFubm90YXRpb25zIHNvIHRoYXQgSmF2YS1vbmx5IHByb2plY3RzIGNhbiBkZXBlbmQKKyMgb24gcHJvamVjdHMgdGhhdCBoYXBwZW4gdG8gYmUgd3JpdHRlbiBpbiBLb3RsaW4gYnV0IGRvIG5vdCBoYXZlIGEgcnVuLXRpbWUKKyMgZGVwZW5kZW5jeSBvbiB0aGUgS290bGluIHN0YW5kYXJkIGxpYnJhcnkuIE5vdGUgdGhlc2UgYW5ub3RhdGlvbnMgYXJlIFJVTlRJTUUKKyMgcmV0ZW50aW9uLCBidXQgd2Ugd29uJ3QgbmVlZCB0aGVtIGF2YWlsYWJsZSBpbiBKYXZhLW9ubHkgcHJvamVjdHMuCistZG9udHdhcm4ga290bGluLk1ldGFkYXRhCistZG9udHdhcm4ga290bGluLmFubm90YXRpb24uQW5ub3RhdGlvblJldGVudGlvbgorLWRvbnR3YXJuIGtvdGxpbi5hbm5vdGF0aW9uLkFubm90YXRpb25UYXJnZXQKKy1kb250d2FybiBrb3RsaW4uYW5ub3RhdGlvbi5SZXRlbnRpb24KKy1kb250d2FybiBrb3RsaW4uYW5ub3RhdGlvbi5UYXJnZXQKKworIyBLb3RsaW4gRGVidWdNZXRhZGF0YSBoYXMgbm8gdmFsdWUgaW4gcmVsZWFzZSBidWlsZHMsIHRoZXNlIHR3byBydWxlcywgd2lsbAorIyBhbGxvdyBBcHBSZWR1Y2UgdG8gc3RyaXAgb3V0IERlYnV0TWV0YWRhdGEuCisjIFRPRE8oYi8zMDIzODMzMjgpOiBSZXN0b3JlIHRoZSBiZWxvdyBjaGVja2Rpc2NhcmQgYWZ0ZXIgcmVzb2x2aW5nIHRyYW5zaXRpdmUKKyMgaW5jbHVzaW9uIG9mIGtvdGxpbi1zdGRsaWIgZnJvbSBhbmRyb2lkeC5hbm5vdGF0aW9uIGxpYnJhcnkgZGVwcy4KKyMgLWNoZWNrZGlzY2FyZCBpbnRlcmZhY2Uga290bGluLmNvcm91dGluZXMuanZtLmludGVybmFsLkRlYnVnTWV0YWRhdGEKKy1hc3N1bWVub3NpZGVlZmZlY3RzIGNsYXNzIGtvdGxpbi5jb3JvdXRpbmVzLmp2bS5pbnRlcm5hbC5EZWJ1Z01ldGFkYXRhS3QgeworICAqKiogZ2V0RGVidWdNZXRhZGF0YUFubm90YXRpb24oLi4uKTsKK30KKy1hc3N1bWV2YWx1ZXMgY2xhc3Mga290bGluLmNvcm91dGluZXMuanZtLmludGVybmFsLkRlYnVnTWV0YWRhdGFLdCB7CisgICoqKiBnZXREZWJ1Z01ldGFkYXRhQW5ub3RhdGlvbiguLi4pIHJldHVybiBudWxsOworfQpkaWZmIC0tZ2l0IGEvY29yZS9wcm9ndWFyZF9iYXNpY19rZWVwcy5mbGFncyBiL2NvcmUvcHJvZ3VhcmRfYmFzaWNfa2VlcHMuZmxhZ3MKaW5kZXggYjU5NTI3YS4uZjZiMzRiOCAxMDA2NDQKLS0tIGEvY29yZS9wcm9ndWFyZF9iYXNpY19rZWVwcy5mbGFncworKysgYi9jb3JlL3Byb2d1YXJkX2Jhc2ljX2tlZXBzLmZsYWdzCkBAIC0xMCw2ICsxMCwxMiBAQAogIyBhbmQgUnVudGltZVZpc2libGVUeXBlQW5ub3RhdGlvbnMsIGFzIHdlbGwgYXMgYXNzb2NpYXRlZCBkZWZhdWx0cy4KIC1rZWVwYXR0cmlidXRlcyBSdW50aW1lVmlzaWJsZSpBbm5vdGF0aW9uKixBbm5vdGF0aW9uRGVmYXVsdAogCisjIFdpdGggUjggZnVsbCBtb2RlLCBjZXJ0YWluIGF0dHJpYnV0ZXMgYXJlIG9ubHkga2VwdCB3aGVuIG1hdGNoZWQgd2l0aCBhbgorIyBleHBsaWNpdCBrZWVwIHJ1bGUgZm9yIHRoYXQgdGFyZ2V0LCBldmVuIHdpdGggYSBnbG9iYWwgLWtlZXBhdHRyaWJ1dGVzIHJ1bGUuCisjIEFzIHN1Y2gsIHdlIGNhbiBhZGQgdGhlIGdsb2JhbCBrZWVwIHJ1bGUgaGVyZSB3aXRoIG1pbmltYWwgY29zdCB3aGlsZQorIyBzaW1wbGlmeWluZyBpbmNyZW1lbnRhbCBkZXZlbG9wbWVudC4KKy1rZWVwYXR0cmlidXRlcyBFeGNlcHRpb25zCisKICMgRm9yIGVudW1lcmF0aW9uIGNsYXNzZXMsIHNlZSBodHRwOi8vcHJvZ3VhcmQuc291cmNlZm9yZ2UubmV0L21hbnVhbC9leGFtcGxlcy5odG1sI2VudW1lcmF0aW9ucwogLWtlZXBjbGFzc21lbWJlcnMgZW51bSAqIHsKICAgICBwdWJsaWMgc3RhdGljICoqW10gdmFsdWVzKCk7CmRpZmYgLS1naXQgYS9jb3JlL3B5dGhvbl9iaW5hcnlfaG9zdF9tb2JseV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwgYi9jb3JlL3B5dGhvbl9iaW5hcnlfaG9zdF9tb2JseV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKaW5kZXggYTY1NzZjZC4uYTk4NmRmMiAxMDA2NDQKLS0tIGEvY29yZS9weXRob25fYmluYXJ5X2hvc3RfbW9ibHlfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sCisrKyBiL2NvcmUvcHl0aG9uX2JpbmFyeV9ob3N0X21vYmx5X3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbApAQCAtMTMsMTMgKzEzLDkgQEAKIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIHtNT0RVTEV9IG1vYmx5IHRlc3QiPgogICAgIHtFWFRSQV9DT05GSUdTfQogCi0gICAgPGRldmljZSBuYW1lPSJkZXZpY2UxIj48L2RldmljZT4KLSAgICA8ZGV2aWNlIG5hbWU9ImRldmljZTIiPjwvZGV2aWNlPgorICAgIDxkZXZpY2UgbmFtZT0iQW5kcm9pZFJlYWxEZXZpY2UiPjwvZGV2aWNlPgorICAgIDxkZXZpY2UgbmFtZT0iQW5kcm9pZFJlYWxEZXZpY2UiPjwvZGV2aWNlPgogCi0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLm1vYmx5Lk1vYmx5QmluYXJ5SG9zdFRlc3QiPgotICAgICAgPCEtLSBUaGUgbW9ibHktcGFyLWZpbGUtbmFtZSBzaG91bGQgbWF0Y2ggdGhlIG1vZHVsZSBuYW1lIC0tPgotICAgICAgPG9wdGlvbiBuYW1lPSJtb2JseS1wYXItZmlsZS1uYW1lIiB2YWx1ZT0ie01PRFVMRX0iIC8+Ci0gICAgICA8IS0tIFRpbWVvdXQgbGltaXQgaW4gbWlsbGlzZWNvbmRzIGZvciBhbGwgdGVzdCBjYXNlcyBvZiB0aGUgcHl0aG9uIGJpbmFyeSAtLT4KLSAgICAgIDxvcHRpb24gbmFtZT0ibW9ibHktdGVzdC10aW1lb3V0IiB2YWx1ZT0iMzAwMDAwIiAvPgotICAgIDwvdGVzdD4KKyAgICA8b3B0aW9uIG5hbWU9Im1vYmx5X3BrZyIga2V5PSJmaWxlIiB2YWx1ZT0ie01PRFVMRX0iIC8+CisgICAgPHRlc3QgY2xhc3M9Ik1vYmx5QW9zcFBhY2thZ2VUZXN0IiAvPgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvY29yZS9yYXZlbndvb2RfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sIGIvY29yZS9yYXZlbndvb2RfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTIyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3JhdmVud29vZF90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVGhpcyB0ZXN0IGNvbmZpZyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAtLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIHtNT0RVTEV9Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0icmF2ZW53b29kIiAvPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJyYXZlbndvb2QtdGVzdHMiIC8+CisKKyAgICA8b3B0aW9uIG5hbWU9ImphdmEtZm9sZGVyIiB2YWx1ZT0icHJlYnVpbHRzL2pkay9qZGsxNy9saW51eC14ODYvIiAvPgorICAgIDxvcHRpb24gbmFtZT0idXNlLXJhdmVud29vZC1yZXNvdXJjZXMiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxvcHRpb24gbmFtZT0iZXhjbHVkZS1wYXRocyIgdmFsdWU9ImphdmEiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJzb2NrZXQtdGltZW91dCIgdmFsdWU9IjEwMDAwIiAvPgorICAgIDxvcHRpb24gbmFtZT0ibnVsbC1kZXZpY2UiIHZhbHVlPSJ0cnVlIiAvPgorCisgICAge0VYVFJBX0NPTkZJR1N9CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSXNvbGF0ZWRIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IntNT0RVTEV9LmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtbW9kdWxlcz1qZGsuY29tcGlsZXIiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtZXhwb3J0cz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5hcGk9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtZXhwb3J0cz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5jb2RlPUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMuY29tcD1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmZpbGU9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtZXhwb3J0cz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5tYWluPUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMucGFyc2VyPUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMudHJlZT1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLnV0aWw9QUxMLVVOTkFNRUQiLz4KKworICAgICAgICA8IS0tIE5lZWRlZCBmb3Igc3VwcG9ydGluZyBQYXJjZWxGaWxlRGVzY3JpcHRvciBpbnRlcm5hbHMgLS0+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHM9amF2YS5iYXNlL2pkay5pbnRlcm5hbC5hY2Nlc3M9QUxMLVVOTkFNRUQiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9jb3JlL3JiZS5tayBiL2NvcmUvcmJlLm1rCmluZGV4IDY3NTRiMGEuLjBmOTBkZGQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmJlLm1rCisrKyBiL2NvcmUvcmJlLm1rCkBAIC02NCw3ICs2NCw3IEBACiAgICAgZDhfZXhlY19zdHJhdGVneSA6PSByZW1vdGVfbG9jYWxfZmFsbGJhY2sKICAgZW5kaWYKIAotICBwbGF0Zm9ybSA6PSBjb250YWluZXItaW1hZ2U9ZG9ja2VyOi8vZ2NyLmlvL2FuZHJvaWRidWlsZC1yZS1kb2NrZXJpbWFnZS9hbmRyb2lkLWJ1aWxkLXJlbW90ZWV4ZWMtaW1hZ2VAc2hhMjU2OjU4MmVmYjM4ZjBjMjI5ZWEzOTk1MmZmZjllMTMyY2NiZTE4M2UxNDg2OWIzOTg4ODAxMGRhY2Y1NmIzNjBkNjIKKyAgcGxhdGZvcm0gOj0gY29udGFpbmVyLWltYWdlPWRvY2tlcjovL2djci5pby9hbmRyb2lkYnVpbGQtcmUtZG9ja2VyaW1hZ2UvYW5kcm9pZC1idWlsZC1yZW1vdGVleGVjLWltYWdlQHNoYTI1NjoxZWI3ZjY0YjllMTcxMDJiOTcwYmQ3YTFhZjdkYWFlYmRiMDFjM2ZiNzc3NzE1ODk5ZWY0NjJkNmM2ZDAxYTQ1CiAgIGN4eF9wbGF0Zm9ybSA6PSAkKHBsYXRmb3JtKSxQb29sPSQoY3h4X3Bvb2wpCiAgIGphdmFfcjhfZDhfcGxhdGZvcm0gOj0gJChwbGF0Zm9ybSksUG9vbD0kKGphdmFfcG9vbCkKIApkaWZmIC0tZ2l0IGEvY29yZS9yZWxlYXNlX2NvbmZpZy5tayBiL2NvcmUvcmVsZWFzZV9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5ODg2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVsZWFzZV9jb25maWcubWsKQEAgLTAsMCArMSwzODQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZXRlcm1pbmUgd2hpY2ggcGFzcyB0aGlzIGlzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPbiB0aGUgZmlyc3QgcGFzcywgd2UgYXJlIGFza2VkIGZvciBvbmx5IFBST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUywKKyMgb24gdGhlIHNlY29uZCBwYXNzLCB3ZSBhcmUgYXNrZWQgZm9yIHdoYXRldmVyIGVsc2UgaXMgd2FudGVkLgorX2ZpbmFsX3Byb2R1Y3RfY29uZmlnX3Bhc3M6PQoraWZuZXEgKFBST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUywkKERVTVBfTUFOWV9WQVJTKSkKKyAgICBfZmluYWxfcHJvZHVjdF9jb25maWdfcGFzczo9dHJ1ZQorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaG9vc2UgdGhlIGZsYWcgZmlsZXMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVsZWFzZSBjb25maWdzIGFyZSBkZWZpbmVkIGluIHJlZmxlYXNlX2NvbmZpZ19tYXAgZmlsZXMsIHdoaWNoIG1hcAorIyB0aGUgc2hvcnQgbmFtZSAoZS5nLiAtbmV4dCkgdXNlZCBpbiBsdW5jaCB0byB0aGUgc3RhcmxhcmsgZmlsZXMKKyMgZGVmaW5pbmcgdGhlIGJ1aWxkIGZsYWcgdmFsdWVzLgorIworIyAoSWYgeW91J3JlIHRoaW5raW5nIGFib3V0IGFjb25maWcgZmxhZ3MsIHRoZXJlIGlzIG9uZSBidWlsZCBmbGFnLAorIyBSRUxFQVNFX0FDT05GSUdfVkFMVUVfU0VUUywgdGhhdCBzZXRzIHdoaWNoIGFjb25maWdfdmFsdWVfc2V0CisjIG1vZHVsZSB0byB1c2UgdG8gc2V0IHRoZSBhY29uZmlnIGZsYWcgdmFsdWVzLikKKyMKKyMgVGhlIHNob3J0IHJlbGVhc2UgY29uZmlnIG5hbWVzICpjYW4qIGFwcGVhciBtdWx0aXBsZSB0aW1lcywgdG8gYWxsb3cKKyMgZm9yIEFPU1AgYW5kIHZlbmRvciBzcGVjaWZpYyBmbGFncyB1bmRlciB0aGUgc2FtZSBuYW1lLCBidXQgdGhlCisjIGluZGl2aWR1YWwgZmxhZyB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gZXhhY3RseSBvbmUgY29uZmlnLiAgVmVuZG9yCisjIGRvZXMgbm90IG92ZXJyaWRlIEFPU1AsIG9yIGFueXRoaW5nIGxpa2UgdGhhdC4gIFRoaXMgaXMgYmVjYXVzZQorIyB2ZW5kb3IgY29kZSB1c3VhbGx5IGluY2x1ZGVzIHByZWJ1aWx0cywgYW5kIGhhdmluZyB2ZW5kb3IgY29tcGlsZQorIyB3aXRoIGRpZmZlcmVudCBmbGFncyBmcm9tIEFPU1AgaW5jcmVhc2VzIHRoZSBsaWtlbGlob29kIG9mIGZsYWcKKyMgbWlzbWF0Y2guCisKKyMgRG8gdGhpcyBmaXJzdCwgYmVjYXVzZSB3ZSdyZSBnb2luZyB0byB1bnNldCBUQVJHRVRfUkVMRUFTRSBiZWZvcmUKKyMgaW5jbHVkaW5nIGFueW9uZSwgc28gdGhleSBkb24ndCBzdGFydCBtYWtpbmcgY29uZGl0aW9uYWxzIGJhc2VkIG9uIGl0LgorIyBUaGlzIGxvZ2ljIGlzIGluIG1ha2UgYmVjYXVzZSBzdGFybGFyayBkb2Vzbid0IHVuZGVyc3RhbmQgb3B0aW9uYWwKKyMgdmVuZG9yIGZpbGVzLgorCisjIElmIHRoaXMgaXMgYSBnb29nbGUgc291cmNlIHRyZWUsIHJlc3RyaWN0IGl0IHRvIG9ubHkgdGhlIG9uZSBmaWxlCisjIHdoaWNoIGhhcyBPV05FUlMgY29udHJvbC4gIElmIGl0IGlzbid0IGxldCBvdGhlcnMgZGVmaW5lIHRoZWlyIG93bi4KK2NvbmZpZ19tYXBfZmlsZXMgOj0gJCh3aWxkY2FyZCBidWlsZC9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC5taykgXAorICAgICQod2lsZGNhcmQgdmVuZG9yL2dvb2dsZV9zaGFyZWQvYnVpbGQvcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAubWspIFwKKyAgICAkKGlmICQod2lsZGNhcmQgdmVuZG9yL2dvb2dsZS9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC5tayksIFwKKyAgICAgICAgdmVuZG9yL2dvb2dsZS9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC5taywgXAorICAgICAgICAkKHNvcnQgXAorICAgICAgICAgICAgJCh3aWxkY2FyZCBkZXZpY2UvKi9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC5taykgXAorICAgICAgICAgICAgJCh3aWxkY2FyZCBkZXZpY2UvKi8qL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLm1rKSBcCisgICAgICAgICAgICAkKHdpbGRjYXJkIHZlbmRvci8qL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLm1rKSBcCisgICAgICAgICAgICAkKHdpbGRjYXJkIHZlbmRvci8qLyovcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAubWspIFwKKyAgICAgICAgKSBcCisgICAgKQorCitwcm90b2J1Zl9tYXBfZmlsZXMgOj0gYnVpbGQvcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAudGV4dHByb3RvIFwKKyAgICAkKHdpbGRjYXJkIHZlbmRvci9nb29nbGVfc2hhcmVkL2J1aWxkL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykgXAorICAgICQoaWYgJCh3aWxkY2FyZCB2ZW5kb3IvZ29vZ2xlL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90byksIFwKKyAgICAgICAgdmVuZG9yL2dvb2dsZS9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC50ZXh0cHJvdG8sIFwKKyAgICAgICAgJChzb3J0IFwKKyAgICAgICAgICAgICQod2lsZGNhcmQgZGV2aWNlLyovcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAudGV4dHByb3RvKSBcCisgICAgICAgICAgICAkKHdpbGRjYXJkIGRldmljZS8qLyovcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAudGV4dHByb3RvKSBcCisgICAgICAgICAgICAkKHdpbGRjYXJkIHZlbmRvci8qL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykgXAorICAgICAgICAgICAgJCh3aWxkY2FyZCB2ZW5kb3IvKi8qL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykgXAorICAgICAgICApIFwKKyAgICApCisKKyMgUmVtb3ZlIHN1cHBvcnQgZm9yIHRoZSBsZWdhY3kgYXBwcm9hY2guCitfbXVzdF9wcm90b2J1ZiA6PSB0cnVlCisKKyMgUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTIGlzIHNldCBieSBTb29uZyB1c2luZyBhbiBpbml0aWFsIHJ1biBvZiBwcm9kdWN0CisjIGNvbmZpZyB0byBjYXB0dXJlIG9ubHkgdGhlIGxpc3Qgb2YgY29uZmlnIG1hcHMgbmVlZGVkIGJ5IHRoZSBidWlsZC4KKyMgS2VlcCB0aGVtIGluIHRoZSBvcmRlciBwcm92aWRlZCwgYnV0IHJlbW92ZSBkdXBsaWNhdGVzLgorIyBUcmVhdCAubWsgYW5kIC50ZXh0cHJvdG8gYXMgZXF1YWwgZm9yIGR1cGxpY2F0ZSBlbGltaW5hdGlvbiwgYnV0IGZvcmNlCisjIHByb3RvYnVmIGlmIGFueSBQUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMgc3BlY2lmeSAudGV4dHByb3RvLgorJChmb3JlYWNoIG1hcCwkKFBST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUyksIFwKKyAgICAkKGlmICQoZmlsdGVyICQoYmFzZW5hbWUgJChtYXApKSwkKGJhc2VuYW1lICQoY29uZmlnX21hcF9maWxlcykpKSwsIFwKKyAgICAgICAgJChldmFsIGNvbmZpZ19tYXBfZmlsZXMgKz0gJChtYXApKSkgXAorICAgICQoaWYgJChmaWx0ZXIgJChiYXNlbmFtZSAkKG1hcCkpLnRleHRwcm90bywkKG1hcCkpLCQoZXZhbCBfbXVzdF9wcm90b2J1ZiA6PSB0cnVlKSkgXAorKQorCisKKyMgSWYgd2UgYXJlIG1pc3NpbmcgdGhlIHRleHRwcm90byB2ZXJzaW9uIG9mIGFueSBvZiAkKGNvbmZpZ19tYXBfZmlsZXMpLCB3ZSBjYW5ub3QgdXNlIHByb3RvYnVmLgorX2Nhbl9wcm90b2J1ZiA6PSB0cnVlCiskKGZvcmVhY2ggbWFwLCQoY29uZmlnX21hcF9maWxlcyksIFwKKyAgICAkKGlmICQod2lsZGNhcmQgJChiYXNlbmFtZSAkKG1hcCkpLnRleHRwcm90byksLCQoZXZhbCBfY2FuX3Byb3RvYnVmIDo9KSkgXAorKQorIyBJZiB3ZSBhcmUgbWlzc2luZyB0aGUgbWsgdmVyc2lvbiBvZiBhbnkgb2YgJChwcm90b2J1Zl9tYXBfZmlsZXMpLCB3ZSBtdXN0IHVzZSBwcm90b2J1Zi4KKyQoZm9yZWFjaCBtYXAsJChwcm90b2J1Zl9tYXBfZmlsZXMpLCBcCisgICAgJChpZiAkKHdpbGRjYXJkICQoYmFzZW5hbWUgJChtYXApKS5tayksLCQoZXZhbCBfbXVzdF9wcm90b2J1ZiA6PSB0cnVlKSkgXAorKQorCitpZm5lcSAoLCQoX211c3RfcHJvdG9idWYpKQorICAgIGlmZXEgKCwkKF9jYW5fcHJvdG9idWYpKQorICAgICAgICAjIFdlIG11c3QgdXNlIHByb3RvYnVmLCBidXQgd2UgY2Fubm90IHVzZSBwcm90b2J1Zi4KKyAgICAgICAgJChlcnJvciByZWxlYXNlIGNvbmZpZyBpcyBhIG1peHR1cmUgb2YgLnNjbCBhbmQgLnRleHRwcm90bykKKyAgICBlbmRpZgorZW5kaWYKKworX3VzZV9wcm90b2J1ZiA6PQoraWZuZXEgKCwkKF9tdXN0X3Byb3RvYnVmKSkKKyAgICBfdXNlX3Byb3RvYnVmIDo9IHRydWUKK2Vsc2UKKyAgICBpZm5lcSAoJChfY2FuX3Byb3RvYnVmKSwpCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0CisgICAgICAgICQoZm9yZWFjaCBtYXAsJChjb25maWdfbWFwX2ZpbGVzKSwgXAorICAgICAgICAgICAgJChpZiAkKHdpbGRjYXJkICQoZGlyICQobWFwKSkvYnVpbGRfY29uZmlnL0RFRkFVTFQ9cHJvdG8pLCQoZXZhbCBfdXNlX3Byb3RvYnVmIDo9IHRydWUpKSBcCisgICAgICAgICAgICAkKGlmICQod2lsZGNhcmQgJChkaXIgJChtYXApKS9idWlsZF9jb25maWcvREVGQVVMVD1tYWtlKSwkKGV2YWwgX3VzZV9wcm90b2J1ZiA6PSApKSBcCisgICAgICAgICkKKyAgICAgICAgIyBVcGRhdGUgZm9yIHRoaXMgc3BlY2lmaWMgcmVsZWFzZSBjb25maWcgb25seSAobm8gaW5oZXJpdGFuY2UpLgorICAgICAgICAkKGZvcmVhY2ggbWFwLCQoY29uZmlnX21hcF9maWxlcyksIFwKKyAgICAgICAgICAgICQoaWYgJCh3aWxkY2FyZCAkKGRpciAkKG1hcCkpL2J1aWxkX2NvbmZpZy8kKFRBUkdFVF9SRUxFQVNFKT1wcm90byksJChldmFsIF91c2VfcHJvdG9idWYgOj0gdHJ1ZSkpIFwKKyAgICAgICAgICAgICQoaWYgJCh3aWxkY2FyZCAkKGRpciAkKG1hcCkpL2J1aWxkX2NvbmZpZy8kKFRBUkdFVF9SRUxFQVNFKT1tYWtlKSwkKGV2YWwgX3VzZV9wcm90b2J1ZiA6PSApKSBcCisgICAgICAgICkKKyAgICBlbmRpZgorZW5kaWYKKworaWZuZXEgKCwkKF91c2VfcHJvdG9idWYpKQorICAgICMgVGhlIC50ZXh0cHJvdG8gZmlsZXMgYXJlIHRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRydXRoLgorICAgIF9hcmdzIDo9ICQoZm9yZWFjaCBtYXAsJChjb25maWdfbWFwX2ZpbGVzKSwgLS1tYXAgJChtYXApICkKKyAgICBpZm5lcSAoLCQoX211c3RfcHJvdG9idWYpKQorICAgICAgICAjIERpc2FibGUgdGhlIGJ1aWxkIGZsYWcgaW4gcmVsZWFzZS1jb25maWcuCisgICAgICAgIF9hcmdzICs9IC0tZ3VhcmQ9ZmFsc2UKKyAgICBlbmRpZgorICAgIF9hcmdzICs9IC0tYWxsb3ctbWlzc2luZz10cnVlCisgICAgX2ZsYWdzX2Rpcjo9JChPVVRfRElSKS9zb29uZy9yZWxlYXNlLWNvbmZpZworICAgIF9mbGFnc19maWxlOj0kKF9mbGFnc19kaXIpL3JlbGVhc2VfY29uZmlnLSQoVEFSR0VUX1BST0RVQ1QpLSQoVEFSR0VUX1JFTEVBU0UpLnZhcnMKKyAgICAjIHJlbGVhc2UtY29uZmlnIGdlbmVyYXRlcyAkKF9mbGFnc192YXJtaykKKyAgICBfZmxhZ3NfdmFybWs6PSQoX2ZsYWdzX2ZpbGU6LnZhcnM9LnZhcm1rKQorICAgICQoc2hlbGwgJChPVVRfRElSKS9yZWxlYXNlLWNvbmZpZyAkKF9hcmdzKSA+JChPVVRfRElSKS9yZWxlYXNlLWNvbmZpZy5vdXQgJiYgdG91Y2ggLXQgMjAwMDAxMDEwMDAwICQoX2ZsYWdzX3Zhcm1rKSkKKyAgICAkKGlmICQoZmlsdGVyLW91dCAwLCQoLlNIRUxMU1RBVFVTKSksJChlcnJvciByZWxlYXNlLWNvbmZpZyBmYWlsZWQgdG8gcnVuKSkKKyAgICBpZm5lcSAoLCQoX2ZpbmFsX3Byb2R1Y3RfY29uZmlnX3Bhc3MpKQorICAgICAgICAjIFNhdmUgdGhlIGZpbmFsIHZlcnNpb24gb2YgdGhlIGNvbmZpZy4KKyAgICAgICAgJChzaGVsbCBpZiAhIGNtcCAtLXF1aWV0ICQoX2ZsYWdzX3Zhcm1rKSAkKF9mbGFnc19maWxlKTsgdGhlbiBjcCAkKF9mbGFnc192YXJtaykgJChfZmxhZ3NfZmlsZSk7IGZpKQorICAgICAgICAjIFRoaXMgd2lsbCBhbHNvIHNldCBBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUIGFuZCBfdXNlZF9maWxlcyBmb3IgdXMuCisgICAgICAgICQoZXZhbCBpbmNsdWRlICQoX2ZsYWdzX2ZpbGUpKQorICAgICAgICAkKEtBVElfZXh0cmFfZmlsZV9kZXBzICQoT1VUX0RJUikvcmVsZWFzZS1jb25maWcgJChwcm90b2J1Zl9tYXBfZmlsZXMpICQoX2ZsYWdzX2ZpbGUpKQorICAgIGVsc2UKKyAgICAgICAgIyBUaGlzIGlzIHRoZSBmaXJzdCBwYXNzIG9mIHByb2R1Y3QgY29uZmlnLgorICAgICAgICAkKGV2YWwgaW5jbHVkZSAkKF9mbGFnc192YXJtaykpCisgICAgZW5kaWYKKyAgICBfdXNlZF9maWxlcyA6PQorICAgIGlmZXEgKCwkKF9tdXN0X3Byb3RvYnVmKSQoUkVMRUFTRV9CVUlMRF9GTEFHU19JTl9QUk9UT0JVRikpCisgICAgICAgIF91c2VfcHJvdG9idWYgOj0KKyAgICBlbHNlCisgICAgICAgIF9iYXNlX2FsbF9yZWxlYXNlIDo9IGFsbF9yZWxlYXNlX2NvbmZpZ3MtJChUQVJHRVRfUFJPRFVDVCkKKyAgICAgICAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRyb2lkLFwKKyAgICAgICAgICAgICQoX2ZsYWdzX2RpcikvJChfYmFzZV9hbGxfcmVsZWFzZSkucGI6YnVpbGRfZmxhZ3MvYWxsX3JlbGVhc2VfY29uZmlncy5wYiBcCisgICAgICAgICAgICAkKF9mbGFnc19kaXIpLyQoX2Jhc2VfYWxsX3JlbGVhc2UpLnRleHRwcm90bzpidWlsZF9mbGFncy9hbGxfcmVsZWFzZV9jb25maWdzLnRleHRwcm90byBcCisgICAgICAgICAgICAkKF9mbGFnc19kaXIpLyQoX2Jhc2VfYWxsX3JlbGVhc2UpLmpzb246YnVpbGRfZmxhZ3MvYWxsX3JlbGVhc2VfY29uZmlncy5qc29uIFwKKyAgICAgICAgICAgICQoX2ZsYWdzX2RpcikvaW5oZXJpdGFuY2VfZ3JhcGgtJChUQVJHRVRfUFJPRFVDVCkuZG90OmJ1aWxkX2ZsYWdzL2luaGVyaXRhbmNlX2dyYXBoLSQoVEFSR0VUX1BST0RVQ1QpLmRvdCBcCisgICAgICAgICkKKyMgVGhlc2UgYXJlIGFsd2F5cyBjcmVhdGVkLCBhZGQgYW4gZW1wdHkgcnVsZSBmb3IgdGhlbSB0byBrZWVwIG5pbmphIGhhcHB5LgorJChfZmxhZ3NfZGlyKS9pbmhlcml0YW5jZV9ncmFwaC0kKFRBUkdFVF9QUk9EVUNUKS5kb3Q6CisJOiBjcmVhdGVkIGJ5ICQoT1VUX0RJUikvcmVsZWFzZS1jb25maWcKKyQoX2ZsYWdzX2RpcikvJChfYmFzZV9hbGxfcmVsZWFzZSkucGIgJChfZmxhZ3NfZGlyKS8kKF9iYXNlX2FsbF9yZWxlYXNlKS50ZXh0cHJvdG8gJChfZmxhZ3NfZGlyKS8kKF9iYXNlX2FsbF9yZWxlYXNlKS5qc29uOgorCTogY3JlYXRlZCBieSAkKE9VVF9ESVIpL3JlbGVhc2UtY29uZmlnCisgICAgICAgIF9iYXNlX2FsbF9yZWxlYXNlIDo9CisgICAgZW5kaWYKKyAgICBfZmxhZ3NfZGlyOj0KKyAgICBfZmxhZ3NfZmlsZTo9CisgICAgX2ZsYWdzX3Zhcm1rOj0KK2VuZGlmCitpZmVxICgsJChfdXNlX3Byb3RvYnVmKSkKKyAgICAjIFRoZSAubWsgZmlsZXMgYXJlIHRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRydXRoLgorCisKKyMgRGVjbGFyZSBhbiBhbGlhcyByZWxlYXNlLWNvbmZpZworIworIyBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGRlY2xhcmUgYSByZWxlYXNlIGFzIGFuIGFsaWFzIG9mIGFub3RoZXIsIG1lYW5pbmcgbm8KKyMgcmVsZWFzZSBjb25maWcgZmlsZXMgc2hvdWxkIGJlIHByZXNlbnQuCisjCisjICQxIGNvbmZpZyBuYW1lCisjICQyIHJlbGVhc2UgY29uZmlnIGZvciB3aGljaCBpdCBpcyBhbiBhbGlhcworZGVmaW5lIGFsaWFzLXJlbGVhc2UtY29uZmlnCisgICAgJChjYWxsIF9kZWNsYXJlLXJlbGVhc2UtY29uZmlnLCQoMSksLCQoMiksdHJ1ZSkKK2VuZGVmCisKKyMgRGVjbGFyZSBvciBleHRlbmQgYSByZWxlYXNlLWNvbmZpZy4KKyMKKyMgVGhlIG9yZGVyIG9mIHByb2Nlc3NpbmcgaXM6CisjIDEuIFJlY3Vyc2l2ZWx5IGFwcGx5IGFueSBvdmVycmlkZGVuIHJlbGVhc2UgY29uZmlncy4gIE9ubHkgYXBwbHkgZWFjaCBjb25maWcKKyMgICAgdGhlIGZpcnN0IHRpbWUgd2UgcmVhY2ggaXQuCisjIDIuIEFwcGx5IGFueSBmaWxlcyBmb3IgdGhpcyByZWxlYXNlIGNvbmZpZywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZCB0bworIyAgICB0aGUgZGVjbGFyYXRpb24uCisjCisjIEV4YW1wbGU6CisjICAgV2l0aCB0aGVzZSBkZWNsYXJhdGlvbnM6CisjICAgICAkKGRlY2xhcmUtcmVsZWFzZS1jb25maWcgZm9vLCBmb28uc2NsKQorIyAgICAgJChkZWNsYXJlLXJlbGVhc2UtY29uZmlnIGJhciwgYmFyLnNjbCwgZm9vKQorIyAgICAgJChkZWNsYXJlLXJlbGVhc2UtY29uZmlnIGJheiwgYmF6LnNjbCwgYmFyKQorIyAgICAgJChkZWNsYXJlLXJlbGVhc2UtY29uZmlnIGJpZiwgYmlmLnNjbCwgZm9vIGJheikKKyMgICAgICQoZGVjbGFyZS1yZWxlYXNlLWNvbmZpZyBib3AsIGJvcC5zY2wsIGJhciBiYXopCisjCisjICAgVEFSR0VUX1JFTEVBU0U6CisjICAgICAtIGJhciB3aWxsIHVzZTogZm9vLnNjbCBiYXIuc2NsCisjICAgICAtIGJheiB3aWxsIHVzZTogZm9vLnNjbCBiYXIuc2NsIGJhei5zY2wKKyMgICAgIC0gYmlmIHdpbGwgdXNlOiBmb28uc2NsIGJhci5zY2wgYmF6LnNjbCBiaWYuc2NsCisjICAgICAtIGJvcCB3aWxsIHVzZTogZm9vLnNjbCBiYXIuc2NsIGJhei5zY2wgYm9wLnNjbAorIworIyAkMSBjb25maWcgbmFtZQorIyAkMiByZWxlYXNlIGNvbmZpZyBmaWxlcworIyAkMyBvdmVycmlkZGVuIHJlbGVhc2UgY29uZmlnCitkZWZpbmUgZGVjbGFyZS1yZWxlYXNlLWNvbmZpZworICAgICQoY2FsbCBfZGVjbGFyZS1yZWxlYXNlLWNvbmZpZywkKDEpLCQoMiksJCgzKSwpCitlbmRlZgorCitkZWZpbmUgX2RlY2xhcmUtcmVsZWFzZS1jb25maWcKKyAgICAkKGlmICQoc3RyaXAgJCgyKSQoMykpLCwgIFwKKyAgICAgICAgJChlcnJvciBkZWNsYXJlLXJlbGVhc2UtY29uZmlnOiBjb25maWcgJChzdHJpcCAkKDEpKSBtdXN0IGhhdmUgcmVsZWFzZSBjb25maWcgZmlsZXMsIG92ZXJyaWRlIGFub3RoZXIgcmVsZWFzZSBjb25maWcsIG9yIGJvdGgpIFwKKyAgICApCisgICAgJChpZiAkKHN0cmlwICQoNCkpLCQoZXZhbCBfYWxsX3JlbGVhc2VfY29uZmlncy4kKHN0cmlwICQoMSkpLkFMSUFTIDo9IHRydWUpKQorICAgICQoZXZhbCBBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUIDo9ICQoc29ydCAkKEFMTF9SRUxFQVNFX0NPTkZJR1NfRk9SX1BST0RVQ1QpICQoc3RyaXAgJCgxKSkpKQorICAgICQoaWYgJChzdHJpcCAkKDMpKSwgXAorICAgICAgJChpZiAkKGZpbHRlciAkKEFMTF9SRUxFQVNFX0NPTkZJR1NfRk9SX1BST0RVQ1QpLCAkKHN0cmlwICQoMykpKSwKKyAgICAgICAgJChpZiAkKGZpbHRlciAkKF9hbGxfcmVsZWFzZV9jb25maWdzLiQoc3RyaXAgJCgxKSkuT1ZFUlJJREVTKSwkKHN0cmlwICQoMykpKSwsCisgICAgICAgICAgJChldmFsIF9hbGxfcmVsZWFzZV9jb25maWdzLiQoc3RyaXAgJCgxKSkuT1ZFUlJJREVTIDo9ICQoX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChzdHJpcCAkKDEpKS5PVkVSUklERVMpICQoc3RyaXAgJCgzKSkpKSwgXAorICAgICAgICAkKGVycm9yIE5vIHJlbGVhc2UgY29uZmlnICQoc3RyaXAgJCgzKSkpIFwKKyAgICAgICkgXAorICAgICkKKyAgICAkKGV2YWwgX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChzdHJpcCAkKDEpKS5ERUNMQVJFRF9JTiA6PSAkKF9pbmNsdWRlZCkgJChfYWxsX3JlbGVhc2VfY29uZmlncy4kKHN0cmlwICQoMSkpLkRFQ0xBUkVEX0lOKSkKKyAgICAkKGV2YWwgX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChzdHJpcCAkKDEpKS5GSUxFUyA6PSAkKF9hbGxfcmVsZWFzZV9jb25maWdzLiQoc3RyaXAgJCgxKSkuRklMRVMpICQoc3RyaXAgJCgyKSkpCitlbmRlZgorCisjIEluY2x1ZGUgdGhlIGNvbmZpZyBtYXAgZmlsZXMgYW5kIHBvcHVsYXRlIF9mbGFnX2RlY2xhcmF0aW9uX2ZpbGVzLgorIyBJZiB0aGUgZmlsZSBpcyBmb3VuZCBtb3JlIHRoYW4gb25jZSwgb25seSBpbmNsdWRlIGl0IHRoZSBmaXJzdCB0aW1lLgorX2ZsYWdfZGVjbGFyYXRpb25fZmlsZXMgOj0KK19pbmNsdWRlZF9jb25maWdfbWFwX2ZpbGVzIDo9CiskKGZvcmVhY2ggZiwgJChjb25maWdfbWFwX2ZpbGVzKSwgXAorICAgICQoZXZhbCBGTEFHX0RFQ0xBUkFUSU9OX0ZJTEVTOj0gKSBcCisgICAgJChpZiAkKGZpbHRlciAkKF9pbmNsdWRlZF9jb25maWdfbWFwX2ZpbGVzKSwkKGYpKSwsXAorICAgICAgICAkKGV2YWwgX2luY2x1ZGVkIDo9ICQoZikpIFwKKyAgICAgICAgJChldmFsIGluY2x1ZGUgJChmKSkgXAorICAgICAgICAkKGV2YWwgX2ZsYWdfZGVjbGFyYXRpb25fZmlsZXMgKz0gJChGTEFHX0RFQ0xBUkFUSU9OX0ZJTEVTKSkgXAorICAgICAgICAkKGV2YWwgX2luY2x1ZGVkX2NvbmZpZ19tYXBfZmlsZXMgKz0gJChmKSkgXAorICAgICkgXAorKQorRkxBR19ERUNMQVJBVElPTl9GSUxFUyA6PQorCisjIFZlcmlmeSB0aGF0IGFsbCBpbmhlcml0ZWQvb3ZlcnJpZGRlbiByZWxlYXNlIGNvbmZpZ3MgYXJlIGRlY2xhcmVkLgorJChmb3JlYWNoIGNvbmZpZywkKEFMTF9SRUxFQVNFX0NPTkZJR1NfRk9SX1BST0RVQ1QpLFwKKyAgJChmb3JlYWNoIHIsJChhbGxfcmVsZWFzZV9jb25maWdzLiQocikuT1ZFUlJJREVTKSxcCisgICAgJChpZiAkKHN0cmlwICQoX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChyKS5GSUxFUykkKF9hbGxfcmVsZWFzZV9jb25maWdzLiQocikuT1ZFUlJJREVTKSksLFwKKyAgICAkKGVycm9yIFJlbGVhc2UgY29uZmlnICQoY29uZmlnKSBbZGVjbGFyZWQgaW46ICQoX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChyKS5ERUNMQVJFRF9JTildIGluaGVyaXRzIGZyb20gbm9uLWV4aXN0ZW50ICQocikuKVwKKykpKQorIyBWZXJpZnkgdGhhdCBhbGlhcyBjb25maWdzIGRvIG5vdCBoYXZlIGNvbmZpZyBmaWxlcy4KKyQoZm9yZWFjaCByLCQoQUxMX1JFTEVBU0VfQ09ORklHU19GT1JfUFJPRFVDVCksXAorICAkKGlmICQoX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChyKS5BTElBUyksJChpZiAkKF9hbGxfcmVsZWFzZV9jb25maWdzLiQocikuRklMRVMpLFwKKyAgICAkKGVycm9yIEFsaWFzIHJlbGVhc2UgY29uZmlnICIkKHIpIiBtYXkgbm90IHNwZWNpZnkgcmVsZWFzZSBjb25maWcgZmlsZXMgJChfYWxsX3JlbGVhc2VfY29uZmlncy4kKHIpLkZJTEVTKSlcCispKSkKKworIyBVc2UgbWFrZWZpbGVzCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9SRUxFQVNFKSwpCisgICAgIyBXZSBhbGxvdyBzb21lIGludGVybmFsIHBhdGhzIHRvIGV4cGxpY2l0bHkgc2V0IFRBUkdFVF9SRUxFQVNFIHRvIHRoZQorICAgICMgZW1wdHkgc3RyaW5nLiAgRm9yIHRoZSBtb3N0IHBhcnQsICdtYWtlJyB0cmVhdHMgdW5zZXQgYW5kIGVtcHR5IHN0cmluZyBhcworICAgICMgdGhlIHNhbWUuICBCdXQgdGhlIGZvbGxvd2luZyBsaW5lIGRpZmZlcmVudGlhdGVzLCBhbmQgd2lsbCBvbmx5IGFzc2lnbgorICAgICMgaWYgdGhlIHZhcmlhYmxlIHdhcyBjb21wbGV0ZWx5IHVuc2V0LgorICAgIFRBUkdFVF9SRUxFQVNFID89IHdhc191bnNldAorICAgIGlmZXEgKCQoVEFSR0VUX1JFTEVBU0UpLHdhc191bnNldCkKKyAgICAgICAgJChlcnJvciBObyByZWxlYXNlIGNvbmZpZyBzZXQgZm9yIHRhcmdldDsgcGxlYXNlIHNldCBUQVJHRVRfUkVMRUFTRSwgb3IgaWYgYnVpbGRpbmcgb24gdGhlIGNvbW1hbmQgbGluZSB1c2UgJ2x1bmNoIDx0YXJnZXQ+LTxyZWxlYXNlPi08YnVpbGRfdHlwZT4nLCB3aGVyZSByZWxlYXNlIGlzIG9uZSBvZjogJChBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUKSkKKyAgICBlbmRpZgorICAgICMgSW5zdGVhZCBvZiBsZWF2aW5nIHRoaXMgc3RyaW5nIGVtcHR5LCB3ZSB3YW50IHRvIGRlZmF1bHQgdG8gYSB2YWxpZAorICAgICMgc2V0dGluZy4gIEZ1bGwgYnVpbGRzIGNvbWluZyB0aHJvdWdoIHRoaXMgcGF0aCBpcyBhIGJ1ZywgYnV0IGluIGNhc2UKKyAgICAjIG9mIHN1Y2ggYSBidWcsIHdlIHdhbnQgdG8gYXQgbGVhc3QgZ2V0IGNvbnNpc3RlbnQsIHZhbGlkIHJlc3VsdHMuCisgICAgVEFSR0VUX1JFTEVBU0UgPSB0cnVua19zdGFnaW5nCitlbmRpZgorCisjIER1cmluZyBwYXNzIDEgb2YgcHJvZHVjdCBjb25maWcsIHVzaW5nIGEgbm9uLWV4aXN0ZW50IHJlbGVhc2UgY29uZmlnIGlzIG5vdCBhbiBlcnJvci4KKyMgV2UgY2FuIHNhZmVseSBhc3N1bWUgdGhhdCB3ZSBhcmUgZG9pbmcgcGFzcyAxIGlmIERVTVBfTUFOWV9WQVJTPT0iUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTIi4KK2lmbmVxICgsJChfZmluYWxfcHJvZHVjdF9jb25maWdfcGFzcykpCisgICAgaWZlcSAoJChmaWx0ZXIgJChBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUKSwgJChUQVJHRVRfUkVMRUFTRSkpLCkKKyAgICAgICAgJChlcnJvciBObyByZWxlYXNlIGNvbmZpZyBmb3VuZCBmb3IgVEFSR0VUX1JFTEVBU0U6ICQoVEFSR0VUX1JFTEVBU0UpLiBBdmFpbGFibGUgcmVsZWFzZXMgYXJlOiAkKEFMTF9SRUxFQVNFX0NPTkZJR1NfRk9SX1BST0RVQ1QpKQorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICgsJChfdXNlX3Byb3RvYnVmKSkKKyMgQ2hvb3NlIGZsYWcgZmlsZXMKKyMgRG9uJ3Qgc29ydCB0aGlzLCB1c2UgaXQgaW4gdGhlIG9yZGVyIHRoZXkgZ2F2ZSB1cy4KKyMgRG8gYWxsb3cgZHVwbGljYXRlIGVudHJpZXMsIHJldGFpbmluZyBvbmx5IHRoZSBmaXJzdCB1c2FnZS4KK2ZsYWdfdmFsdWVfZmlsZXMgOj0KKworIyBBcHBseSBvdmVycmlkZXMgcmVjdXJzaXZlbHkKKyMKKyMgJDEgcmVsZWFzZSBjb25maWcgdGhhdCB3ZSBvdmVycmlkZQorYXBwbGllZF9yZWxlYXNlcyA6PQorZGVmaW5lIF9hcHBseS1yZWxlYXNlLWNvbmZpZy1vdmVycmlkZXMKKyQoZm9yZWFjaCByLCQoMSksIFwKKyAgJChpZiAkKGZpbHRlciAkKHIpLCQoYXBwbGllZF9yZWxlYXNlcykpLCwgXAorICAgICQoZm9yZWFjaCBvLCQoX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChyKS5PVkVSUklERVMpLCQoY2FsbCBfYXBwbHktcmVsZWFzZS1jb25maWctb3ZlcnJpZGVzLCQobykpKVwKKyAgICAkKGV2YWwgYXBwbGllZF9yZWxlYXNlcyArPSAkKHIpKVwKKyAgICAkKGZvcmVhY2ggZiwkKF9hbGxfcmVsZWFzZV9jb25maWdzLiQocikuRklMRVMpLCBcCisgICAgICAkKGlmICQoZmlsdGVyICQoZiksJChmbGFnX3ZhbHVlX2ZpbGVzKSksLCQoZXZhbCBmbGFnX3ZhbHVlX2ZpbGVzICs9ICQoZikpKVwKKyAgICApXAorICApXAorKQorZW5kZWYKKyQoY2FsbCBfYXBwbHktcmVsZWFzZS1jb25maWctb3ZlcnJpZGVzLCQoVEFSR0VUX1JFTEVBU0UpKQorIyBVbnNldCB2YXJpYWJsZXMgc28gdGhleSBjYW4ndCB1c2UgdGhlbQorZGVmaW5lIGRlY2xhcmUtcmVsZWFzZS1jb25maWcKKyQoZXJyb3IgZGVjbGFyZS1yZWxlYXNlLWNvbmZpZyBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgcmVsZWFzZV9jb25maWdfbWFwLm1rIGZpbGVzKQorZW5kZWYKK2RlZmluZSBfYXBwbHktcmVsZWFzZS1jb25maWctb3ZlcnJpZGVzCiskKGVycm9yIGludmFsaWQgdXNlIG9mIGFwcGx5LXJlbGVhc2UtY29uZmlnLW92ZXJyaWRlcykKK2VuZGVmCisKKyMgdXNlIG1ha2VmaWxlcworZW5kaWYKKworIyBUT0RPOiBSZW1vdmUgdGhpcyBjaGVjayBhZnRlciBlbm91Z2ggcGVvcGxlIGhhdmUgc291cmNlZCBsdW5jaCB0aGF0IHdlIGRvbid0CisjIG5lZWQgdG8gd29ycnkgYWJvdXQgaXQgdHJ5aW5nIHRvIGRvIGdldF9idWlsZF92YXJzIFRBUkdFVF9SRUxFQVNFLiBNYXliZSBhZnRlciB+OS8yMDIzCitpZm5lcSAoJChDQUxMRURfRlJPTV9TRVRVUCksdHJ1ZSkKK2RlZmluZSBUQVJHRVRfUkVMRUFTRQorJChlcnJvciBUQVJHRVRfUkVMRUFTRSBtYXkgbm90IGJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBVc2UgaW5kaXZpZHVhbCBmbGFncy4pCitlbmRlZgorZWxzZQorVEFSR0VUX1JFTEVBU0U6PQorZW5kaWYKKy5LQVRJX1JFQURPTkxZIDo9IFRBUkdFVF9SRUxFQVNFCisKK2lmZXEgKCwkKF91c2VfcHJvdG9idWYpKQorJChmb3JlYWNoIGNvbmZpZywgJChBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUKSwgXAorICAgICQoZXZhbCBfYWxsX3JlbGVhc2VfY29uZmlncy4kKGNvbmZpZykuREVDTEFSRURfSU46PSApIFwKKyAgICAkKGV2YWwgX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChjb25maWcpLkZJTEVTOj0gKSBcCispCithcHBsaWVkX3JlbGVhc2VzOj0KKyMgdXNlIG1ha2VmaWxlcworZW5kaWYKK2NvbmZpZ19tYXBfZmlsZXM6PQorcHJvdG9idWZfbWFwX2ZpbGVzOj0KKworCitpZmVxICgsJChfdXNlX3Byb3RvYnVmKSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmxhZyBkZWNsYXJhdGlvbnMgYW5kIHZhbHVlcworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIHBhcnQgaXMgaW4gc3RhcmxhcmsuICBXZSBnZW5lcmF0ZSBhIHJvb3Qgc3RhcmxhcmsgZmlsZSB0aGF0IGxvYWRzCisjIGFsbCBvZiB0aGUgZmxhZ3MgZGVjbGFyYXRpb24gZmlsZXMgdGhhdCB3ZSBmb3VuZCwgYW5kIHRoZSBmbGFnX3ZhbHVlX2ZpbGVzCisjIHRoYXQgd2UgY2hvc2UgZnJvbSB0aGUgY29uZmlnIG1hcCBhYm92ZS4gIFRoZW4gd2UgcnVuIHRoYXQsIGFuZCBsb2FkIHRoZQorIyByZXN1bHRzIG9mIHRoYXQgaW50byB0aGUgbWFrZSBlbnZpcm9ubWVudC4KKworIyBfZmxhZ19kZWNsYXJhdGlvbl9maWxlcyBpcyB0aGUgY29tYmluZWQgbGlzdCBvZiBGTEFHX0RFQ0xBUkFUSU9OX0ZJTEVTIHNldCBieQorIyByZWxlYXNlX2NvbmZpZ19tYXAubWsgZmlsZXMgYWJvdmUuCisKKyMgQmVjYXVzZSBzdGFybGFyayBjYW4ndCBmaW5kIGZpbGVzIHdpdGggJCh3aWxkY2FyZCksIHdyaXRlIGFuIGVudHJ5cG9pbnQgc3Rhcmxhcmsgc2NyaXB0IHRoYXQKKyMgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgYWJvdmUgd2lsZGNhcmRzIGZvciB0aGUgc3RhcmxhcmsgY29kZSB0byB1c2UuCitmaWxlbmFtZV90b19zdGFybGFyaz0kKHN1YnN0IC8sXywkKHN1YnN0IC4sXywkKDEpKSkKK19jOj1sb2FkKCIvL2J1aWxkL21ha2UvY29yZS9yZWxlYXNlX2NvbmZpZy5zY2wiLCAicmVsZWFzZV9jb25maWciKQorX2MrPSQobmV3bGluZSlkZWYgYWRkKGQsIGssIHYpOgorX2MrPSQobmV3bGluZSkkKHNwYWNlKWQgPSBkaWN0KGQpCitfYys9JChuZXdsaW5lKSQoc3BhY2UpZFtrXSA9IHYKK19jKz0kKG5ld2xpbmUpJChzcGFjZSlyZXR1cm4gZAorX2MrPSQoZm9yZWFjaCBmLCQoX2ZsYWdfZGVjbGFyYXRpb25fZmlsZXMpLCQobmV3bGluZSlsb2FkKCIkKGYpIiwgZmxhZ3NfJChjYWxsIGZpbGVuYW1lX3RvX3N0YXJsYXJrLCQoZikpID0gImZsYWdzIikpCitfYys9JChuZXdsaW5lKWFsbF9mbGFncyA9IFtdICQoZm9yZWFjaCBmLCQoX2ZsYWdfZGVjbGFyYXRpb25fZmlsZXMpLCsgW2FkZCh4LCAiZGVjbGFyZWRfaW4iLCAiJChmKSIpIGZvciB4IGluIGZsYWdzXyQoY2FsbCBmaWxlbmFtZV90b19zdGFybGFyaywkKGYpKV0pCitfYys9JChmb3JlYWNoIGYsJChmbGFnX3ZhbHVlX2ZpbGVzKSwkKG5ld2xpbmUpbG9hZCgiLy8kKGYpIiwgdmFsdWVzXyQoY2FsbCBmaWxlbmFtZV90b19zdGFybGFyaywkKGYpKSA9ICJ2YWx1ZXMiKSkKK19jKz0kKG5ld2xpbmUpYWxsX3ZhbHVlcyA9IFtdICQoZm9yZWFjaCBmLCQoZmxhZ192YWx1ZV9maWxlcyksKyBbYWRkKHgsICJzZXRfaW4iLCAiJChmKSIpIGZvciB4IGluIHZhbHVlc18kKGNhbGwgZmlsZW5hbWVfdG9fc3RhcmxhcmssJChmKSldKQorX2MrPSQobmV3bGluZSl2YXJpYWJsZXNfdG9fZXhwb3J0X3RvX21ha2UgPSByZWxlYXNlX2NvbmZpZyhhbGxfZmxhZ3MsIGFsbF92YWx1ZXMpCiskKGZpbGUgPiQoT1VUX0RJUikvcmVsZWFzZV9jb25maWdfZW50cnlwb2ludC5zY2wsJChfYykpCitfYzo9CitmaWxlbmFtZV90b19zdGFybGFyazo9CisKKyMgRXhjbHVkZSB0aGUgZW50cnlwb2ludCBmaWxlIGFzIGEgZGVwZW5kZW5jeSAoYnkgcGFzc2luZyBpdCBhcyB0aGUgMm5kIGFyZ3VtZW50KSBzbyB0aGF0IHdlIGRvbid0CisjIHJlcnVuIGthdGkgZXZlcnkgYnVpbGQuIEthdGkgd2lsbCByZXBsYXkgdGhlICQoZmlsZSkgY29tbWFuZCB0aGF0IGdlbmVyYXRlcyBpdCBldmVyeSBidWlsZCwKKyMgdXBkYXRpbmcgaXRzIHRpbWVzdGFtcC4KKyMKKyMgV2UgYWxzbyBuZWVkIHRvIHBhc3MgLS1hbGxvd19leHRlcm5hbF9lbnRyeXBvaW50IHRvIHJiY3J1biBpbiBjYXNlIHRoZSBPVVRfRElSIGlzIHNldCB0byBzb21ldGhpbmcKKyMgb3V0c2lkZSBvZiB0aGUgc291cmNlIHRyZWUuCiskKGNhbGwgcnVuLXN0YXJsYXJrLCQoT1VUX0RJUikvcmVsZWFzZV9jb25maWdfZW50cnlwb2ludC5zY2wsJChPVVRfRElSKS9yZWxlYXNlX2NvbmZpZ19lbnRyeXBvaW50LnNjbCwtLWFsbG93X2V4dGVybmFsX2VudHJ5cG9pbnQpCisKKyMgdXNlIG1ha2VmaWxlcworZW5kaWYKK19jYW5fcHJvdG9idWYgOj0KK19tdXN0X3Byb3RvYnVmIDo9CitfdXNlX3Byb3RvYnVmIDo9CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVsZWFzZV9jb25maWcuc2NsIGIvY29yZS9yZWxlYXNlX2NvbmZpZy5zY2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4MTVkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVsZWFzZV9jb25maWcuc2NsCkBAIC0wLDAgKzEsMjQzIEBACisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiCitFeHBvcnQgYnVpbGQgZmxhZ3MgKHdpdGggdmFsdWVzKSB0byBtYWtlLgorIiIiCisKK2xvYWQoIi8vYnVpbGQvYmF6ZWwvdXRpbHM6c2NoZW1hX3ZhbGlkYXRpb24uc2NsIiwgInZhbGlkYXRlIikKKworIyBQYXJ0aXRpb25zIHRoYXQgZ2V0IGJ1aWxkIHN5c3RlbSBmbGFnIHN1bW1hcmllcworX2ZsYWdfcGFydGl0aW9ucyA9IFsKKyAgICAicHJvZHVjdCIsCisgICAgInN5c3RlbSIsCisgICAgInN5c3RlbV9leHQiLAorICAgICJ2ZW5kb3IiLAorXQorCitBTEwgPSBbImFsbCJdCitQUk9EVUNUID0gWyJwcm9kdWN0Il0KK1NZU1RFTSA9IFsic3lzdGVtIl0KK1NZU1RFTV9FWFQgPSBbInN5c3RlbV9leHQiXQorVkVORE9SID0gWyJ2ZW5kb3IiXQorCitfdmFsaWRfdHlwZXMgPSBbIk5vbmVUeXBlIiwgImJvb2wiLCAibGlzdCIsICJzdHJpbmciLCAiaW50Il0KKworX2FsbF9mbGFnc19zY2hlbWEgPSB7CisgICAgInR5cGUiOiAibGlzdCIsCisgICAgIm9mIjogeworICAgICAgICAidHlwZSI6ICJkaWN0IiwKKyAgICAgICAgInJlcXVpcmVkX2tleXMiOiB7CisgICAgICAgICAgICAibmFtZSI6IHsidHlwZSI6ICJzdHJpbmcifSwKKyAgICAgICAgICAgICJwYXJ0aXRpb25zIjogeworICAgICAgICAgICAgICAgICJ0eXBlIjogImxpc3QiLAorICAgICAgICAgICAgICAgICJvZiI6IHsKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgImNob2ljZXMiOiBfZmxhZ19wYXJ0aXRpb25zICsgWyJhbGwiXSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJ1bmlxdWUiOiBUcnVlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJkZWZhdWx0IjogeworICAgICAgICAgICAgICAgICJvciI6IFsKKyAgICAgICAgICAgICAgICAgICAgeyJ0eXBlIjogdH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIHQgaW4gX3ZhbGlkX3R5cGVzCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAib3JpZ2luIjogeyJ0eXBlIjogInN0cmluZyJ9LAorICAgICAgICAgICAgImRlY2xhcmVkX2luIjogeyJ0eXBlIjogInN0cmluZyJ9LAorICAgICAgICB9LAorICAgICAgICAib3B0aW9uYWxfa2V5cyI6IHsKKyAgICAgICAgICAgICJhcHBlbmRzIjogeworICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2wiLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitfYWxsX3ZhbHVlc19zY2hlbWEgPSB7CisgICAgInR5cGUiOiAibGlzdCIsCisgICAgIm9mIjogeworICAgICAgICAidHlwZSI6ICJkaWN0IiwKKyAgICAgICAgInJlcXVpcmVkX2tleXMiOiB7CisgICAgICAgICAgICAibmFtZSI6IHsidHlwZSI6ICJzdHJpbmcifSwKKyAgICAgICAgICAgICJ2YWx1ZSI6IHsKKyAgICAgICAgICAgICAgICAib3IiOiBbCisgICAgICAgICAgICAgICAgICAgIHsidHlwZSI6IHR9CisgICAgICAgICAgICAgICAgICAgIGZvciB0IGluIF92YWxpZF90eXBlcworICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInNldF9pbiI6IHsidHlwZSI6ICJzdHJpbmcifSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitkZWYgZmxhZyhuYW1lLCBwYXJ0aXRpb25zLCBkZWZhdWx0LCAqLCBvcmlnaW4gPSAiVW5rbm93biIsIGFwcGVuZHMgPSBGYWxzZSk6CisgICAgIiIiRGVjbGFyZSBhIGZsYWcuCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogbmFtZSBvZiB0aGUgZmxhZworICAgICAgcGFydGl0aW9uczogdGhlIHBhcnRpdGlvbnMgd2hlcmUgdGhpcyBzaG91bGQgYmUgcmVjb3JkZWQuCisgICAgICBkZWZhdWx0OiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZmxhZy4KKyAgICAgIG9yaWdpbjogVGhlIG9yaWdpbiBvZiB0aGlzIGZsYWcuCisgICAgICBhcHBlbmRzOiBXaGV0aGVyIG5ldyB2YWx1ZXMgc2hvdWxkIGJlIGFwcGVuZCAobm90IHJlcGxhY2UpIHRoZSBvbGQuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGZsYWcgZGVjbGFyYXRpb24uCisgICAgIiIiCisgICAgaWYgbm90IHBhcnRpdGlvbnM6CisgICAgICAgIGZhaWwoIkF0IGxlYXN0IDEgcGFydGl0aW9uIGlzIHJlcXVpcmVkIikKKyAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCJSRUxFQVNFXyIpOgorICAgICAgICBmYWlsKCJSZWxlYXNlIGZsYWcgbmFtZXMgbXVzdCBzdGFydCB3aXRoIFJFTEVBU0VfIikKKyAgICBpZiAiICIgaW4gbmFtZSBvciAiXHQiIGluIG5hbWUgb3IgIlxuIiBpbiBuYW1lOgorICAgICAgICBmYWlsKCJGbGFnIG5hbWVzIG11c3Qgbm90IGNvbnRhaW4gd2hpdGVzcGFjZTogXCIiICsgbmFtZSArICJcIiIpCisgICAgZm9yIHBhcnRpdGlvbiBpbiBwYXJ0aXRpb25zOgorICAgICAgICBpZiBwYXJ0aXRpb24gPT0gImFsbCI6CisgICAgICAgICAgICBpZiBsZW4ocGFydGl0aW9ucykgPiAxOgorICAgICAgICAgICAgICAgIGZhaWwoIlwiYWxsXCIgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciBwYXJ0aXRpb25zOiAiICsgc3RyKHBhcnRpdGlvbnMpKQorICAgICAgICBlbGlmIHBhcnRpdGlvbiBub3QgaW4gX2ZsYWdfcGFydGl0aW9uczoKKyAgICAgICAgICAgIGZhaWwoIkludmFsaWQgcGFydGl0aW9uOiAiICsgcGFydGl0aW9uICsgIiwgYWxsb3dlZCBwYXJ0aXRpb25zOiAiICsKKyAgICAgICAgICAgICAgICAgc3RyKF9mbGFnX3BhcnRpdGlvbnMpKQorICAgIGlmIHR5cGUoZGVmYXVsdCkgbm90IGluIF92YWxpZF90eXBlczoKKyAgICAgICAgZmFpbCgiSW52YWxpZCB0eXBlIG9mIGRlZmF1bHQgZm9yIGZsYWcgXCIiICsgbmFtZSArICJcIiAoIiArIHR5cGUoZGVmYXVsdCkgKyAiKSIpCisgICAgcmV0dXJuIHsKKyAgICAgICAgIm5hbWUiOiBuYW1lLAorICAgICAgICAicGFydGl0aW9ucyI6IHBhcnRpdGlvbnMsCisgICAgICAgICJkZWZhdWx0IjogZGVmYXVsdCwKKyAgICAgICAgImFwcGVuZHMiOiBhcHBlbmRzLAorICAgICAgICAib3JpZ2luIjogb3JpZ2luLAorICAgIH0KKworZGVmIHZhbHVlKG5hbWUsIHZhbHVlKToKKyAgICAiIiJEZWZpbmUgdGhlIGZsYWcgdmFsdWUgZm9yIGEgcGFydGljdWxhciBjb25maWd1cmF0aW9uLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBmbGFnLgorICAgICAgdmFsdWU6IFRoZSB2YWx1ZSBmb3IgdGhlIGZsYWcuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG5hbWUgYW5kIHZhbHVlIHRvIGJlIHVzZWQuCisgICAgIiIiCisgICAgcmV0dXJuIHsKKyAgICAgICAgIm5hbWUiOiBuYW1lLAorICAgICAgICAidmFsdWUiOiB2YWx1ZSwKKyAgICB9CisKK2RlZiBfZm9ybWF0X3ZhbHVlKHZhbCk6CisgICAgIiIiRm9ybWF0IHRoZSBzdGFybGFyayB0eXBlIGNvcnJlY3RseSBmb3IgbWFrZS4KKworICAgIEFyZ3M6CisgICAgICB2YWw6IFRoZSB2YWx1ZSB0byBmb3JtYXQKKworICAgIFJldHVybnM6CisgICAgICBUaGUgdmFsdWUsIGZvcm1hdHRlZCBjb3JyZWN0bHkgZm9yIG1ha2UuCisgICAgIiIiCisgICAgaWYgdHlwZSh2YWwpID09ICJOb25lVHlwZSI6CisgICAgICAgIHJldHVybiAiIgorICAgIGVsaWYgdHlwZSh2YWwpID09ICJib29sIjoKKyAgICAgICAgcmV0dXJuICJ0cnVlIiBpZiB2YWwgZWxzZSAiIgorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB2YWwKKworZGVmIGVxdWFsX2ZsYWdfZGVjbGFyYXRpb24oZmxhZywgb3RoZXIpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBmbGFnIGRlY2xhcmF0aW9ucyBhcmUgZXF1YWwuCisKKyAgICBBcmdzOgorICAgICAgZmxhZzogVGhpcyBmbGFnIGRlY2xhcmF0aW9uLgorICAgICAgb3RoZXI6IEFub3RoZXIgZmxhZyBkZWNsYXJhdGlvbi4KKworICAgIFJldHVybnM6CisgICAgICBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbnMgYXJlIHRoZSBzYW1lLgorICAgICIiIgorICAgIGZvciBrZXkgaW4gIm5hbWUiLCAicGFydGl0aW9ucyIsICJkZWZhdWx0IiwgImFwcGVuZHMiOgorICAgICAgICBpZiBmbGFnW2tleV0gIT0gb3RoZXJba2V5XToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICMgRm9yIG5vdywgYWxsb3cgVW5rbm93biB0byBtYXRjaCBhbnkgb3RoZXIgb3JpZ2luLgorICAgIGlmIGZsYWdbIm9yaWdpbiJdID09ICJVbmtub3duIiBvciBvdGhlclsib3JpZ2luIl0gPT0gIlVua25vd24iOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBmbGFnWyJvcmlnaW4iXSA9PSBvdGhlclsib3JpZ2luIl0KKworZGVmIHJlbGVhc2VfY29uZmlnKGFsbF9mbGFncywgYWxsX3ZhbHVlcyk6CisgICAgIiIiUmV0dXJuIHRoZSBtYWtlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBiZSBzZXQgZm9yIHRoaXMgcmVsZWFzZSBjb25maWcuCisKKyAgICBBcmdzOgorICAgICAgYWxsX2ZsYWdzOiBBIGxpc3Qgb2YgZmxhZyBvYmplY3RzIChmcm9tIGZsYWcoKSBjYWxscykuCisgICAgICBhbGxfdmFsdWVzOiBBIGxpc3Qgb2YgdmFsdWUgb2JqZWN0cyAoZnJvbSB2YWx1ZSgpIGNhbGxzKS4KKworICAgIFJldHVybnM6CisgICAgICBBIGRpY3Rpb25hcnkgb2Yge25hbWU6IHZhbHVlfSB2YXJpYWJsZXMgZm9yIG1ha2UuCisgICAgIiIiCisgICAgdmFsaWRhdGUoYWxsX2ZsYWdzLCBfYWxsX2ZsYWdzX3NjaGVtYSkKKyAgICB2YWxpZGF0ZShhbGxfdmFsdWVzLCBfYWxsX3ZhbHVlc19zY2hlbWEpCisKKyAgICAjIEZpbmFsIHZhbHVlcy4KKyAgICB2YWx1ZXMgPSB7fQorICAgICMgVmFsaWRhdGUgZmxhZ3MKKyAgICBmbGFnX25hbWVzID0gW10KKyAgICBmbGFnc19kaWN0ID0ge30KKyAgICBmb3IgZmxhZyBpbiBhbGxfZmxhZ3M6CisgICAgICAgIG5hbWUgPSBmbGFnWyJuYW1lIl0KKyAgICAgICAgaWYgbmFtZSBpbiBmbGFnX25hbWVzOgorICAgICAgICAgICAgaWYgZXF1YWxfZmxhZ19kZWNsYXJhdGlvbihmbGFnLCBmbGFnc19kaWN0W25hbWVdKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmYWlsKGZsYWdbImRlY2xhcmVkX2luIl0gKyAiOiBEdXBsaWNhdGUgZGVjbGFyYXRpb24gb2YgZmxhZyAiICsgbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAiIChkZWNsYXJlZCBmaXJzdCBpbiAiICsgZmxhZ3NfZGljdFtuYW1lXVsiZGVjbGFyZWRfaW4iXSArICIpIikKKyAgICAgICAgZmxhZ19uYW1lcy5hcHBlbmQobmFtZSkKKyAgICAgICAgZmxhZ3NfZGljdFtuYW1lXSA9IGZsYWcKKyAgICAgICAgIyBTZXQgdGhlIGZsYWcgdmFsdWUgdG8gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICAgIHZhbHVlc1tuYW1lXSA9IHsibmFtZSI6IG5hbWUsICJ2YWx1ZSI6IF9mb3JtYXRfdmFsdWUoZmxhZ1siZGVmYXVsdCJdKSwgInNldF9pbiI6IGZsYWdbImRlY2xhcmVkX2luIl19CisKKyAgICAjIFJlY29yZCB3aGljaCBmbGFncyBnbyBvbiB3aGljaCBwYXJ0aXRpb24KKyAgICBwYXJ0aXRpb25zID0ge30KKyAgICBmb3IgZmxhZyBpbiBhbGxfZmxhZ3M6CisgICAgICAgIGZvciBwYXJ0aXRpb24gaW4gZmxhZ1sicGFydGl0aW9ucyJdOgorICAgICAgICAgICAgaWYgcGFydGl0aW9uID09ICJhbGwiOgorICAgICAgICAgICAgICAgIGlmIGxlbihmbGFnWyJwYXJ0aXRpb25zIl0pID4gMToKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiXCJhbGxcIiBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIG90aGVyIHBhcnRpdGlvbnM6ICIgKyBzdHIoZmxhZ1sicGFydGl0aW9ucyJdKSkKKyAgICAgICAgICAgICAgICBmb3IgcGFydGl0aW9uIGluIF9mbGFnX3BhcnRpdGlvbnM6CisgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbnMuc2V0ZGVmYXVsdChwYXJ0aXRpb24sIFtdKS5hcHBlbmQoZmxhZ1sibmFtZSJdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25zLnNldGRlZmF1bHQocGFydGl0aW9uLCBbXSkuYXBwZW5kKGZsYWdbIm5hbWUiXSkKKworICAgICMgR2VuZXJhdGUgZmluYWwgdmFsdWVzLgorICAgICMgT25seSBkZWNsYXJlZCBmbGFncyBtYXkgaGF2ZSBhIHZhbHVlLgorICAgIGZvciB2YWx1ZSBpbiBhbGxfdmFsdWVzOgorICAgICAgICBuYW1lID0gdmFsdWVbIm5hbWUiXQorICAgICAgICBpZiBuYW1lIG5vdCBpbiBmbGFnX25hbWVzOgorICAgICAgICAgICAgZmFpbCh2YWx1ZVsic2V0X2luIl0gKyAiOiBWYWx1ZSBzZXQgZm9yIHVuZGVjbGFyZWQgYnVpbGQgZmxhZzogIiArIG5hbWUpCisgICAgICAgIGlmIGZsYWdzX2RpY3RbbmFtZV1bImFwcGVuZHMiXToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gdmFsdWVzOgorICAgICAgICAgICAgICAgIHZhbHVlc1tuYW1lXVsidmFsdWUiXSArPSAiICIgKyB2YWx1ZVsidmFsdWUiXQorICAgICAgICAgICAgICAgIHZhbHVlc1tuYW1lXVsic2V0X2luIl0gKz0gIiAiICsgdmFsdWVbInNldF9pbiJdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlc1tuYW1lXSA9IHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZXNbbmFtZV0gPSB2YWx1ZQorCisgICAgIyBDb2xsZWN0IHZhbHVlcworICAgIHJlc3VsdCA9IHsKKyAgICAgICAgIl9BTExfUkVMRUFTRV9GTEFHUyI6IHNvcnRlZChmbGFnX25hbWVzKSwKKyAgICB9CisgICAgZm9yIHBhcnRpdGlvbiwgbmFtZXMgaW4gcGFydGl0aW9ucy5pdGVtcygpOgorICAgICAgICByZXN1bHRbIl9BTExfUkVMRUFTRV9GTEFHUy5QQVJUSVRJT05TLiIgKyBwYXJ0aXRpb25dID0gbmFtZXMKKyAgICBmb3IgZmxhZyBpbiBhbGxfZmxhZ3M6CisgICAgICAgIHZhbCA9IF9mb3JtYXRfdmFsdWUodmFsdWVzW2ZsYWdbIm5hbWUiXV1bInZhbHVlIl0pCisgICAgICAgIHJlc3VsdFtmbGFnWyJuYW1lIl1dID0gdmFsCisgICAgICAgIHJlc3VsdFsiX0FMTF9SRUxFQVNFX0ZMQUdTLiIgKyBmbGFnWyJuYW1lIl0gKyAiLlBBUlRJVElPTlMiXSA9IGZsYWdbInBhcnRpdGlvbnMiXQorICAgICAgICByZXN1bHRbIl9BTExfUkVMRUFTRV9GTEFHUy4iICsgZmxhZ1sibmFtZSJdICsgIi5ERUZBVUxUIl0gPSBfZm9ybWF0X3ZhbHVlKGZsYWdbImRlZmF1bHQiXSkKKyAgICAgICAgcmVzdWx0WyJfQUxMX1JFTEVBU0VfRkxBR1MuIiArIGZsYWdbIm5hbWUiXSArICIuVkFMVUUiXSA9IHZhbAorICAgICAgICByZXN1bHRbIl9BTExfUkVMRUFTRV9GTEFHUy4iICsgZmxhZ1sibmFtZSJdICsgIi5ERUNMQVJFRF9JTiJdID0gZmxhZ1siZGVjbGFyZWRfaW4iXQorICAgICAgICByZXN1bHRbIl9BTExfUkVMRUFTRV9GTEFHUy4iICsgZmxhZ1sibmFtZSJdICsgIi5TRVRfSU4iXSA9IHZhbHVlc1tmbGFnWyJuYW1lIl1dWyJzZXRfaW4iXQorICAgICAgICByZXN1bHRbIl9BTExfUkVMRUFTRV9GTEFHUy4iICsgZmxhZ1sibmFtZSJdICsgIi5PUklHSU4iXSA9IGZsYWdbIm9yaWdpbiJdCisKKyAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS9jb3JlL3J1c3RfZGV2aWNlX2JlbmNobWFya19jb25maWdfdGVtcGxhdGUueG1sIGIvY29yZS9ydXN0X2RldmljZV9iZW5jaG1hcmtfY29uZmlnX3RlbXBsYXRlLnhtbAppbmRleCAyMDU1ZGYyLi41NDE2MzBjIDEwMDY0NAotLS0gYS9jb3JlL3J1c3RfZGV2aWNlX2JlbmNobWFya19jb25maWdfdGVtcGxhdGUueG1sCisrKyBiL2NvcmUvcnVzdF9kZXZpY2VfYmVuY2htYXJrX2NvbmZpZ190ZW1wbGF0ZS54bWwKQEAgLTE2LDcgKzE2LDcgQEAKIDwhLS0gVGhpcyB0ZXN0IGNvbmZpZyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAtLT4KIDxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgdG8gcnVuIHtNT0RVTEV9IHJ1c3QgYmVuY2htYXJrIHRlc3RzLiI+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IntNT0RVTEV9LT4vZGF0YS9sb2NhbC90bXAve01PRFVMRX0iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcnVzdF9kZXZpY2VfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sIGIvY29yZS9ydXN0X2RldmljZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKaW5kZXggYmZkMmY0Ny4uYWFjYWJjYiAxMDA2NDQKLS0tIGEvY29yZS9ydXN0X2RldmljZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKKysrIGIvY29yZS9ydXN0X2RldmljZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKQEAgLTIwLDExICsyMCwxMSBAQAogCiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ie01PRFVMRX0tPi9kYXRhL2xvY2FsL3RtcC97TU9EVUxFfSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ie01PRFVMRX0tPntURVNUX0lOU1RBTExfQkFTRX0ve01PRFVMRX0iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUucnVzdC5SdXN0QmluYXJ5VGVzdCIgPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9IntURVNUX0lOU1RBTExfQkFTRX0iIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJ7TU9EVUxFfSIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9jb3JlL3Nib20ubWsgYi9jb3JlL3Nib20ubWsKaW5kZXggZTIzYmJjMS4uMzljMjUxYSAxMDA2NDQKLS0tIGEvY29yZS9zYm9tLm1rCisrKyBiL2NvcmUvc2JvbS5tawpAQCAtMyw5ICszLDIwIEBACiAjIHVubGVzcyBhIC5tayBmaWxlIGNoYW5nZXMgaXRzIGluc3RhbGxlZCBmaWxlIGFmdGVyIGluY2x1ZGluZyBiYXNlX3J1bGVzLm1rLgogCiBpZmRlZiBteV9yZWdpc3Rlcl9uYW1lCisgICMgQUxMX0lOU1RBTExFRF9GSUxFUy4kKGluc3RhbGxlZF9maWxlKS5TVEFUSUNfTElCUkFSSUVTOiBsaXN0IG9mIG1vZHVsZSBuYW1lIG9mIHN0YXRpYyBsaWJyYXJpZXMsIGUuZy4gbGliYysrZGVtYW5nbGUgbGliY2xhbmdfcnQuYnVpbHRpbnMsIGZvciBwcmltYXJ5IGFyY2gKKyAgIyBBTExfSU5TVEFMTEVEX0ZJTEVTLiQoaW5zdGFsbGVkX2ZpbGUpLldIT0xFX1NUQVRJQ19MSUJSQVJJRVM6IGxpc3Qgb2YgbW9kdWxlIG5hbWUgb2Ygc3RhdGljIGxpYnJhcmllcywgZS5nLiBsaWJjKytkZW1hbmdsZV8zMiBsaWJjbGFuZ19ydC5idWlsdGluc18zMiwgZm9yIDJuZCBhcmNoLgogICBpZm5lcSAoLCAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRUQpKSkKICAgICAkKGZvcmVhY2ggaW5zdGFsbGVkX2ZpbGUsJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRCksXAogICAgICAgJChldmFsIEFMTF9JTlNUQUxMRURfRklMRVMuJChpbnN0YWxsZWRfZmlsZSkgOj0gJChteV9yZWdpc3Rlcl9uYW1lKSlcCisgICAgICAkKGV2YWwgQUxMX0lOU1RBTExFRF9GSUxFUy4kKGluc3RhbGxlZF9maWxlKS5TVEFUSUNfTElCUkFSSUVTIDo9ICQoZm9yZWFjaCBsLCQoc3RyaXAgJChzb3J0ICQoTE9DQUxfU1RBVElDX0xJQlJBUklFUykpKSwkbCQoaWYgJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKSwkKCQobXlfcHJlZml4KTJORF9BUkNIX01PRFVMRV9TVUZGSVgpKSkpXAorICAgICAgJChldmFsIEFMTF9JTlNUQUxMRURfRklMRVMuJChpbnN0YWxsZWRfZmlsZSkuV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSAkKGZvcmVhY2ggbCwkKHN0cmlwICQoc29ydCAkKExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMpKSksJGwkKGlmICQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCksJCgkKG15X3ByZWZpeCkyTkRfQVJDSF9NT0RVTEVfU1VGRklYKSkpKVwKICAgICApCiAgIGVuZGlmCisgIGlmZXEgKFNUQVRJQ19MSUJSQVJJRVMsJChMT0NBTF9NT0RVTEVfQ0xBU1MpKQorICBBTExfU1RBVElDX0xJQlJBUklFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNUQVRJQ19MSUJSQVJJRVMgOj0gJChmb3JlYWNoIGwsJChzdHJpcCAkKHNvcnQgJChMT0NBTF9TVEFUSUNfTElCUkFSSUVTKSkpLCRsJCgkKG15X3ByZWZpeCkyTkRfQVJDSF9NT0RVTEVfU1VGRklYKSkKKyAgQUxMX1NUQVRJQ19MSUJSQVJJRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9ICQoZm9yZWFjaCBsLCQoc3RyaXAgJChzb3J0ICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykpKSwkbCQoJChteV9wcmVmaXgpMk5EX0FSQ0hfTU9EVUxFX1NVRkZJWCkpCisgIGlmZGVmIExPQ0FMX1NPT05HX01PRFVMRV9UWVBFCisgICAgQUxMX1NUQVRJQ19MSUJSQVJJRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVF9GSUxFIDo9ICQoTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUpCisgIGVuZGlmCisgIGVuZGlmCiBlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rCmluZGV4IDEzOWRlMTAuLmFlMzRjYjggMTAwNjQ0Ci0tLSBhL2NvcmUvc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsKKysrIGIvY29yZS9zaGFyZWRfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtNDIsNyArNDIsNyBAQAogaWZlcSAoJChMT0NBTF9OT19DUlQpLHRydWUpCiBteV90YXJnZXRfY3J0YmVnaW5fc29fbyA6PQogbXlfdGFyZ2V0X2NydGVuZF9zb19vIDo9Ci1lbHNlIGlmZGVmIExPQ0FMX1VTRV9WTkRLCitlbHNlIGlmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLHRydWUpCiBteV90YXJnZXRfY3J0YmVnaW5fc29fbyA6PSAkKFNPT05HXyQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT0JKRUNUX2NydGJlZ2luX3NvLnZlbmRvcikKIG15X3RhcmdldF9jcnRlbmRfc29fbyA6PSAkKFNPT05HXyQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT0JKRUNUX2NydGVuZF9zby52ZW5kb3IpCiBlbHNlCkBAIC0xMDEsNCArMTAxLDYgQEAKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChteV9jb3ZlcmFnZV9wYXRoKS8kKEdDTk9fQVJDSElWRSkKIGVuZGlmCiAKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1TSEFSRURfTElCUkFSWSkpCisKIGVuZGlmICAjIHNraXBfYnVpbGRfZnJvbV9zb3VyY2UKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfYXBwX3ByZWJ1aWx0Lm1rIGIvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKaW5kZXggY2NjNTQ0OS4uM2FhMjQ0YyAxMDA2NDQKLS0tIGEvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKKysrIGIvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKQEAgLTczLDEyICs3MywxNCBAQAogIyBXZSBza2lwIGl0IGZvciB1bmJ1bmRsZWQgYXBwIGJ1aWxkcyB3aGVyZSB3ZSBjYW5ub3QgYnVpbGQgdmVyaWRleC4KIG1vZHVsZV9ydW5fYXBwY29tcGF0IDo9CiBpZmVxICh0cnVlLCQobm9uX3N5c3RlbV9tb2R1bGUpKQotaWZlcSAoLCQoVEFSR0VUX0JVSUxEX0FQUFMpKSAgIyAhIHVuYnVuZGxlZCBhcHAgYnVpbGQKK2lmZXEgKCwkKFRBUkdFVF9CVUlMRF9BUFBTKSkgICMgbm90IHVuYnVuZGxlZCBhcHAgYnVpbGQKK2lmZXEgKCwkKGZpbHRlciBzZGssJChNQUtFQ01ER09BTFMpKSkgIyBub3Qgc2RrIGJ1aWxkICh3aGljaCBpcyBhbm90aGVyIGZvcm0gb2YgdW5idW5kbGVkIGJ1aWxkKQogaWZuZXEgKCQoVU5TQUZFX0RJU0FCTEVfSElEREVOQVBJX0ZMQUdTKSx0cnVlKQogICBtb2R1bGVfcnVuX2FwcGNvbXBhdCA6PSB0cnVlCiBlbmRpZgogZW5kaWYKIGVuZGlmCitlbmRpZgogCiBpZmVxICgkKG1vZHVsZV9ydW5fYXBwY29tcGF0KSx0cnVlKQogICAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoYXBwY29tcGF0LWZpbGVzKQpAQCAtMTAwLDMxICsxMDIsMjQgQEAKIGVuZGlmCiAKIGlmZGVmIExPQ0FMX1NPT05HX1BST0dVQVJEX0RJQ1QKLSAgbXlfcHJvZ3VhcmRfZGljdGlvbmFyeV9kaXJlY3RvcnkgOj0gJChsb2NhbC1wcm9ndWFyZC1kaWN0aW9uYXJ5LWRpcmVjdG9yeSkKLSAgbXlfcHJvZ3VhcmRfZGljdGlvbmFyeV9tYXBwaW5nX2RpcmVjdG9yeSA6PSAkKGxvY2FsLXByb2d1YXJkLWRpY3Rpb25hcnktbWFwcGluZy1kaXJlY3RvcnkpCi0gICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX1BST0dVQVJEX0RJQ1QpLFwKLSAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5KSkKICAgJChldmFsICQoY2FsbCBjb3B5LXI4LWRpY3Rpb25hcnktZmlsZS13aXRoLW1hcHBpbmcsXAogICAgICQoTE9DQUxfU09PTkdfUFJPR1VBUkRfRElDVCksXAotICAgICQobXlfcHJvZ3VhcmRfZGljdGlvbmFyeV9kaXJlY3RvcnkpL3Byb2d1YXJkX2RpY3Rpb25hcnksXAotICAgICQobXlfcHJvZ3VhcmRfZGljdGlvbmFyeV9tYXBwaW5nX2RpcmVjdG9yeSkvcHJvZ3VhcmRfZGljdGlvbmFyeS50ZXh0cHJvdG8pKQotICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9TT09OR19DTEFTU0VTX0pBUiksXAotICAgICQobXlfcHJvZ3VhcmRfZGljdGlvbmFyeV9kaXJlY3RvcnkpL2NsYXNzZXMuamFyKSkKLSAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSxcCi0gICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeSkKLSAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X2RpcmVjdG9yeSkvcHJvZ3VhcmRfZGljdGlvbmFyeSkKLSAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X21hcHBpbmdfZGlyZWN0b3J5KS9wcm9ndWFyZF9kaWN0aW9uYXJ5LnRleHRwcm90bykKLSAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X2RpcmVjdG9yeSkvY2xhc3Nlcy5qYXIpCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeSxcCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeS50ZXh0cHJvdG8pKQorCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuUFJPR1VBUkRfRElDVElPTkFSWV9GSUxFUyA6PSBcCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeSBcCisgICAgJChMT0NBTF9TT09OR19DTEFTU0VTX0pBUikKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5QUk9HVUFSRF9ESUNUSU9OQVJZX1NPT05HX1pJUF9BUkdVTUVOVFMgOj0gXAorICAgIC1lIG91dC90YXJnZXQvY29tbW9uL29iai8kKExPQ0FMX01PRFVMRV9DTEFTUykvJChMT0NBTF9NT0RVTEUpX2ludGVybWVkaWF0ZXMvcHJvZ3VhcmRfZGljdGlvbmFyeSBcCisgICAgLWYgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeSBcCisgICAgLWUgb3V0L3RhcmdldC9jb21tb24vb2JqLyQoTE9DQUxfTU9EVUxFX0NMQVNTKS8kKExPQ0FMX01PRFVMRSlfaW50ZXJtZWRpYXRlcy9jbGFzc2VzLmphciBcCisgICAgLWYgJChMT0NBTF9TT09OR19DTEFTU0VTX0pBUikKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5QUk9HVUFSRF9ESUNUSU9OQVJZX01BUFBJTkcgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeS50ZXh0cHJvdG8KIGVuZGlmCiAKIGlmZGVmIExPQ0FMX1NPT05HX1BST0dVQVJEX1VTQUdFX1pJUAotICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9TT09OR19QUk9HVUFSRF9VU0FHRV9aSVApLFwKLSAgICAkKGNhbGwgbG9jYWwtcGFja2FnaW5nLWRpcixwcm9ndWFyZF91c2FnZSkvcHJvZ3VhcmRfdXNhZ2UuemlwKSkKLSAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSxcCi0gICAgJChjYWxsIGxvY2FsLXBhY2thZ2luZy1kaXIscHJvZ3VhcmRfdXNhZ2UpL3Byb2d1YXJkX3VzYWdlLnppcCkKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5QUk9HVUFSRF9VU0FHRV9aSVAgOj0gJChMT0NBTF9TT09OR19QUk9HVUFSRF9VU0FHRV9aSVApCiBlbmRpZgogCiBpZmRlZiBMT0NBTF9TT09OR19SRVNPVVJDRV9FWFBPUlRfUEFDS0FHRQpkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19jY19ydXN0X3ByZWJ1aWx0Lm1rIGIvY29yZS9zb29uZ19jY19ydXN0X3ByZWJ1aWx0Lm1rCmluZGV4IDA1YjRiNmIuLmExYzY0NzggMTAwNjQ0Ci0tLSBhL2NvcmUvc29vbmdfY2NfcnVzdF9wcmVidWlsdC5taworKysgYi9jb3JlL3Nvb25nX2NjX3J1c3RfcHJlYnVpbHQubWsKQEAgLTM4LDE0ICszOCw2IEBACiAgIGVuZGlmCiBlbmRpZgogCi0jIERvbid0IGluc3RhbGwgbW9kdWxlcyBvZiBjdXJyZW50IFZOREsgd2hlbiBpdCBpcyB0b2xkIHNvCi1pZmVxICgkKFRBUkdFVF9TS0lQX0NVUlJFTlRfVk5ESyksdHJ1ZSkKLSAgaWZlcSAoJChMT0NBTF9TT09OR19WTkRLX1ZFUlNJT04pLCQoUExBVEZPUk1fVk5ES19WRVJTSU9OKSkKLSAgICBMT0NBTF9VTklOU1RBTExBQkxFX01PRFVMRSA6PSB0cnVlCi0gIGVuZGlmCi1lbmRpZgotCi0KICMgVXNlIHRoZSBTb29uZyBvdXRwdXQgYXMgdGhlIGNoZWNrYnVpbGQgdGFyZ2V0IGluc3RlYWQgb2YgTE9DQUxfQlVJTFRfTU9EVUxFCiAjIHRvIGF2b2lkIGNoZWNrYnVpbGRzIG1ha2luZyBhbiBleHRyYSBjb3B5IG9mIGV2ZXJ5IG1vZHVsZS4KIExPQ0FMX0NIRUNLRURfTU9EVUxFIDo9ICQoTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUpCkBAIC05OSw3ICs5MSw3IEBACiAgIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xpbmtfdHlwZS5tawogZW5kaWYKIAotaWZkZWYgTE9DQUxfVVNFX1ZOREsKK2lmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLHRydWUpCiAgIGlmbmVxICgkKExPQ0FMX1ZOREtfREVQRU5EX09OX0NPUkVfVkFSSUFOVCksdHJ1ZSkKICAgICBuYW1lX3dpdGhvdXRfc3VmZml4IDo9ICQocGF0c3Vic3QgJS52ZW5kb3IsJSwkKExPQ0FMX01PRFVMRSkpCiAgICAgaWZuZXEgKCQobmFtZV93aXRob3V0X3N1ZmZpeCksJChMT0NBTF9NT0RVTEUpKQpAQCAtMTI4LDkgKzEyMCwxNCBAQAogaWZkZWYgTE9DQUxfSU5TVEFMTEVEX01PRFVMRQogICBpZmRlZiBMT0NBTF9TSEFSRURfTElCUkFSSUVTCiAgICAgbXlfc2hhcmVkX2xpYnJhcmllcyA6PSAkKExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMpCi0gICAgaWZkZWYgTE9DQUxfVVNFX1ZOREsKLSAgICAgIG15X3NoYXJlZF9saWJyYXJpZXMgOj0gJChmb3JlYWNoIGwsJChteV9zaGFyZWRfbGlicmFyaWVzKSxcCi0gICAgICAgICQoaWYgJChTUExJVF9WRU5ET1IuU0hBUkVEX0xJQlJBUklFUy4kKGwpKSwkKGwpLnZlbmRvciwkKGwpKSkKKyAgICBpZmVxICgkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSx0cnVlKQorICAgICAgaWZkZWYgTE9DQUxfSU5fUFJPRFVDVAorICAgICAgICBteV9zaGFyZWRfbGlicmFyaWVzIDo9ICQoZm9yZWFjaCBsLCQobXlfc2hhcmVkX2xpYnJhcmllcyksXAorICAgICAgICAgICQoaWYgJChTUExJVF9QUk9EVUNULlNIQVJFRF9MSUJSQVJJRVMuJChsKSksJChsKS5wcm9kdWN0LCQobCkpKQorICAgICAgZWxzZQorICAgICAgICBteV9zaGFyZWRfbGlicmFyaWVzIDo9ICQoZm9yZWFjaCBsLCQobXlfc2hhcmVkX2xpYnJhcmllcyksXAorICAgICAgICAgICQoaWYgJChTUExJVF9WRU5ET1IuU0hBUkVEX0xJQlJBUklFUy4kKGwpKSwkKGwpLnZlbmRvciwkKGwpKSkKKyAgICAgIGVuZGlmCiAgICAgZW5kaWYKICAgICAkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpREVQRU5ERU5DSUVTX09OX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAogICAgICAgJChteV9yZWdpc3Rlcl9uYW1lKTokKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChteV9zaGFyZWRfbGlicmFyaWVzKSkKQEAgLTEzOCw5ICsxMzUsMTQgQEAKICAgaWZkZWYgTE9DQUxfRFlMSUJfTElCUkFSSUVTCiAgICAgbXlfZHlsaWJzIDo9ICQoTE9DQUxfRFlMSUJfTElCUkFSSUVTKQogICAgICMgVHJlYXQgdGhlc2UgYXMgc2hhcmVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGZvciBpbnN0YWxsYXRpb24gcHVycG9zZXMuCi0gICAgaWZkZWYgTE9DQUxfVVNFX1ZOREsKLSAgICAgIG15X2R5bGlicyA6PSAkKGZvcmVhY2ggbCwkKG15X2R5bGlicyksXAotICAgICAgICAkKGlmICQoU1BMSVRfVkVORE9SLlNIQVJFRF9MSUJSQVJJRVMuJChsKSksJChsKS52ZW5kb3IsJChsKSkpCisgICAgaWZlcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksdHJ1ZSkKKyAgICAgIGlmZGVmIExPQ0FMX0lOX1BST0RVQ1QKKyAgICAgICAgbXlfZHlsaWJzIDo9ICQoZm9yZWFjaCBsLCQobXlfZHlsaWJzKSxcCisgICAgICAgICAgJChpZiAkKFNQTElUX1BST0RVQ1QuU0hBUkVEX0xJQlJBUklFUy4kKGwpKSwkKGwpLnByb2R1Y3QsJChsKSkpCisgICAgICBlbHNlCisgICAgICAgIG15X2R5bGlicyA6PSAkKGZvcmVhY2ggbCwkKG15X2R5bGlicyksXAorICAgICAgICAgICQoaWYgJChTUExJVF9WRU5ET1IuU0hBUkVEX0xJQlJBUklFUy4kKGwpKSwkKGwpLnZlbmRvciwkKGwpKSkKKyAgICAgIGVuZGlmCiAgICAgZW5kaWYKICAgICAkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpREVQRU5ERU5DSUVTX09OX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAogICAgICAgJChteV9yZWdpc3Rlcl9uYW1lKTokKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChteV9keWxpYnMpKQpAQCAtMjUxLDMwICsyNTMsNiBAQAogCiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpCiAKLSMgV2UgZG9uJ3QgY2FyZSBhYm91dCBpbnN0YWxsZWQgcmxpYi9zdGF0aWMgbGlicmFyaWVzLCBzaW5jZSB0aGUgbGlicmFyaWVzIGhhdmUKLSMgYWxyZWFkeSBiZWVuIGxpbmtlZCBpbnRvIHRoZSBtb2R1bGUgYXQgdGhhdCBwb2ludC4gV2UgZG8sIGhvd2V2ZXIsIGNhcmUKLSMgYWJvdXQgdGhlIE5PVElDRSBmaWxlcyBmb3IgYW55IHJsaWIvc3RhdGljIGxpYnJhcmllcyB0aGF0IHdlIHVzZS4KLSMgKHNlZSBub3RpY2VfZmlsZXMubWspCi0jCi0jIEZpbHRlciBvdXQgc29tZSBOREsgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBiZWluZyBleHBvcnRlZC4KLW15X3N0YXRpY19saWJyYXJpZXMgOj0gXAotICAgICQoZmlsdGVyLW91dCBuZGtfbGliYysrX3N0YXRpYyBuZGtfbGliYysrYWJpIG5ka19saWJhbmRyb2lkX3N1cHBvcnQgbmRrX2xpYnVud2luZCBcCi0gICAgICBuZGtfbGliYysrX3N0YXRpYy5uYXRpdmVfYnJpZGdlIG5ka19saWJjKythYmkubmF0aXZlX2JyaWRnZSBcCi0gICAgICBuZGtfbGliYW5kcm9pZF9zdXBwb3J0Lm5hdGl2ZV9icmlkZ2UgbmRrX2xpYnVud2luZC5uYXRpdmVfYnJpZGdlLCBcCi0gICAgICAkKExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpKQotaW5zdGFsbGVkX3N0YXRpY19saWJyYXJ5X25vdGljZV9maWxlX3RhcmdldHMgOj0gXAotICAgICQoZm9yZWFjaCBsaWIsJChteV9zdGF0aWNfbGlicmFyaWVzKSAkKExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMpLCBcCi0gICAgICBOT1RJQ0UtJChpZiAkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSxIT1NUJChpZiAkKG15X2hvc3RfY3Jvc3MpLF9DUk9TUywpLFRBUkdFVCktU1RBVElDX0xJQlJBUklFUy0kKGxpYikpCi1pbnN0YWxsZWRfc3RhdGljX2xpYnJhcnlfbm90aWNlX2ZpbGVfdGFyZ2V0cyArPSBcCi0gICAgJChmb3JlYWNoIGxpYiwkKExPQ0FMX1JMSUJfTElCUkFSSUVTKSwgXAotICAgICAgTk9USUNFLSQoaWYgJChMT0NBTF9JU19IT1NUX01PRFVMRSksSE9TVCQoaWYgJChteV9ob3N0X2Nyb3NzKSxfQ1JPU1MsKSxUQVJHRVQpLVJMSUJfTElCUkFSSUVTLSQobGliKSkKLWluc3RhbGxlZF9zdGF0aWNfbGlicmFyeV9ub3RpY2VfZmlsZV90YXJnZXRzICs9IFwKLSAgICAkKGZvcmVhY2ggbGliLCQoTE9DQUxfUFJPQ19NQUNST19MSUJSQVJJRVMpLCBcCi0gICAgICBOT1RJQ0UtJChpZiAkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSxIT1NUJChpZiAkKG15X2hvc3RfY3Jvc3MpLF9DUk9TUywpLFRBUkdFVCktUFJPQ19NQUNST19MSUJSQVJJRVMtJChsaWIpKQotCi0kKG5vdGljZV90YXJnZXQpOiB8ICQoaW5zdGFsbGVkX3N0YXRpY19saWJyYXJ5X25vdGljZV9maWxlX3RhcmdldHMpCi0kKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiB8ICQobm90aWNlX3RhcmdldCkKLQogIyBSZWluc3RhbGwgc2hhcmVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzIG9mIGZ1enogdGFyZ2V0cyB0byAvZGF0YS9mdXp6LyAoZm9yCiAjIHRhcmdldCkgb3IgL2RhdGEvIChmb3IgaG9zdCkuCiBpZmRlZiBMT0NBTF9JU19GVVpaX1RBUkdFVApkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19jb25maWcubWsgYi9jb3JlL3Nvb25nX2NvbmZpZy5tawppbmRleCBhMTQ5ZTJhLi4xMmI0MTM1IDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2NvbmZpZy5taworKysgYi9jb3JlL3Nvb25nX2NvbmZpZy5tawpAQCAtMSwyMCArMSwxMyBAQAogU09PTkdfTUFLRVZBUlNfTUsgOj0gJChTT09OR19PVVRfRElSKS9tYWtlX3ZhcnMtJChUQVJHRVRfUFJPRFVDVCkubWsKLVNPT05HX1ZBUklBQkxFUyA6PSAkKFNPT05HX09VVF9ESVIpL3Nvb25nLnZhcmlhYmxlcwogU09PTkdfQU5EUk9JRF9NSyA6PSAkKFNPT05HX09VVF9ESVIpL0FuZHJvaWQtJChUQVJHRVRfUFJPRFVDVCkubWsKIAotQklOREVSMzJCSVQgOj0KLWlmbmVxICgkKFRBUkdFVF9VU0VTXzY0X0JJVF9CSU5ERVIpLHRydWUpCi1pZm5lcSAoJChUQVJHRVRfSVNfNjRfQklUKSx0cnVlKQotQklOREVSMzJCSVQgOj0gdHJ1ZQotZW5kaWYKLWVuZGlmCi0KIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FydF9jb25maWcubWsKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2RleF9wcmVvcHRfY29uZmlnLm1rCiAKIGlmbmRlZiBBRkRPX1BST0ZJTEVTCiAjIFNldCBBRkRPX1BST0ZJTEVTCiAtaW5jbHVkZSB2ZW5kb3IvZ29vZ2xlX2RhdGEvcGdvX3Byb2ZpbGUvc2FtcGxpbmcvYWZkb19wcm9maWxlcy5taworaW5jbHVkZSB0b29sY2hhaW4vcGdvLXByb2ZpbGVzL3NhbXBsaW5nL2FmZG9fcHJvZmlsZXMubWsKIGVsc2UKICQoZXJyb3IgQUZET19QUk9GSUxFUyBjYW4gb25seSBiZSBzZXQgZnJvbSBzb29uZ19jb25maWcubWsuIEZvciBwcm9kdWN0LXNwZWNpZmljIGZkb19wcm9maWxlcywgcGxlYXNlIHVzZSBQUk9EVUNUX0FGRE9fUFJPRklMRVMpCiBlbmRpZgpAQCAtMjIsNiArMTUsMTAgQEAKICMgUFJPRFVDVF9BRkRPX1BST0ZJTEVTIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBwcm9kdWN0LWFnbm9zdGljIHByb2ZpbGVzIGluIEFGRE9fUFJPRklMRVMKIEFMTF9BRkRPX1BST0ZJTEVTIDo9ICQoUFJPRFVDVF9BRkRPX1BST0ZJTEVTKSAkKEFGRE9fUFJPRklMRVMpCiAKK2lmbmVxICgsJChmaWx0ZXItb3V0IGVudmlyb25tZW50IHVuZGVmaW5lZCwkKG9yaWdpbiBHRU5SVUxFX1NBTkRCT1hJTkcpKSkKKyAgJChlcnJvciBHRU5SVUxFX1NBTkRCT1hJTkcgY2FuIG9ubHkgYmUgcHJvdmlkZWQgdmlhIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCB1c2UgQlVJTERfQlJPS0VOX0dFTlJVTEVfU0FOREJPWElORyB0byBkaXNhYmxlIGdlbnJ1bGUgc2FuZGJveGluZyBpbiBib2FyZCBjb25maWcpCitlbmRpZgorCiBpZmVxICgkKFdSSVRFX1NPT05HX1ZBUklBQkxFUyksdHJ1ZSkKIAogIyBDcmVhdGUgc29vbmcudmFyaWFibGVzIHdpdGggY29waWVzIG9mIG1ha2VmaWxlIHNldHRpbmdzLiAgUnVucyBldmVyeSBidWlsZCwKQEAgLTMyLDggKzI5LDEzIEBACiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgTWFrZV9zdWZmaXgsIC0kKFRBUkdFVF9QUk9EVUNUKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ1aWxkSWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCVUlMRF9JRCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgQnVpbGRGaW5nZXJwcmludEZpbGUsICAgICAgICAgICAgICBidWlsZF9maW5nZXJwcmludC50eHQpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgQnVpbGROdW1iZXJGaWxlLCAgICAgICAgICAgICAgICAgICBidWlsZF9udW1iZXIudHh0KQorJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ1aWxkSG9zdG5hbWVGaWxlLCAgICAgICAgICAgICAgICAgYnVpbGRfaG9zdG5hbWUudHh0KQorJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ1aWxkVGh1bWJwcmludEZpbGUsICAgICAgICAgICAgICAgYnVpbGRfdGh1bWJwcmludC50eHQpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgRGlzcGxheUJ1aWxkTnVtYmVyLCAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoRElTUExBWV9CVUlMRF9OVU1CRVIpKSkKIAorJChjYWxsIGFkZF9qc29uX3N0ciwgIFBsYXRmb3JtX2Rpc3BsYXlfdmVyc2lvbl9uYW1lLCAgICAgJChQTEFURk9STV9ESVNQTEFZX1ZFUlNJT04pKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFBsYXRmb3JtX3ZlcnNpb25fbmFtZSwgICAgICAgICAgICAgJChQTEFURk9STV9WRVJTSU9OKSkKICQoY2FsbCBhZGRfanNvbl92YWwsICBQbGF0Zm9ybV9zZGtfdmVyc2lvbiwgICAgICAgICAgICAgICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFBsYXRmb3JtX3Nka19jb2RlbmFtZSwgICAgICAgICAgICAgJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKQEAgLTQ4LDcgKzUwLDcgQEAKICQoY2FsbCBhZGRfanNvbl9zdHIsICBQbGF0Zm9ybV92ZXJzaW9uX2xhc3Rfc3RhYmxlLCAgICAgICQoUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUGxhdGZvcm1fdmVyc2lvbl9rbm93bl9jb2RlbmFtZXMsICAkKFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTKSkKIAotJChjYWxsIGFkZF9qc29uX3N0ciwgIFBsYXRmb3JtX21pbl9zdXBwb3J0ZWRfdGFyZ2V0X3Nka192ZXJzaW9uLCAkKFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBSZWxlYXNlX2FpZGxfdXNlX3VuZnJvemVuLCAgICAgICAgICQoUkVMRUFTRV9BSURMX1VTRV9VTkZST1pFTikpCiAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBBbGxvd19taXNzaW5nX2RlcGVuZGVuY2llcywgICAgICAgICQoZmlsdGVyIHRydWUsJChBTExPV19NSVNTSU5HX0RFUEVOREVOQ0lFUykpKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVuYnVuZGxlZF9idWlsZCwgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKQEAgLTU4LDYgKzYwLDcgQEAKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIERlYnVnZ2FibGUsICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgdXNlcmRlYnVnIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgRW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ1aWxkVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQlVJTERfVFlQRSkpCiAKICQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXZpY2VOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0RFVklDRSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlUHJvZHVjdCwgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9QUk9EVUNUKSkKQEAgLTEwNiw2ICsxMDksOCBAQAogJChjYWxsIGFkZF9qc29uX2xpc3QsIEFBUFRQcmVidWlsdERQSSwgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0FBUFRfUFJFQlVJTFRfRFBJKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIERlZmF1bHRBcHBDZXJ0aWZpY2F0ZSwgICAgICAgICAgICAgJChQUk9EVUNUX0RFRkFVTFRfREVWX0NFUlRJRklDQVRFKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBFeHRyYU90YUtleXMsICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9FWFRSQV9PVEFfS0VZUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRXh0cmFPdGFSZWNvdmVyeUtleXMsICAgICAgICAgICAgICAkKFBST0RVQ1RfRVhUUkFfUkVDT1ZFUllfS0VZUykpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgTWFpbmxpbmVTZXBvbGljeURldkNlcnRpZmljYXRlcywgICAkKE1BSU5MSU5FX1NFUE9MSUNZX0RFVl9DRVJUSUZJQ0FURVMpKQogCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgQXBwc0RlZmF1bHRWZXJzaW9uTmFtZSwgICAgICAgICAgICAkKEFQUFNfREVGQVVMVF9WRVJTSU9OX05BTUUpKQpAQCAtMTIxLDEwICsxMjYsMTEgQEAKICQoY2FsbCBhZGRfanNvbl9saXN0LCBDRklJbmNsdWRlUGF0aHMsICAgICAgICAgICAgICAgICAgICQoQ0ZJX0lOQ0xVREVfUEFUSFMpICQoUFJPRFVDVF9DRklfSU5DTFVERV9QQVRIUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgSW50ZWdlck92ZXJmbG93RXhjbHVkZVBhdGhzLCAgICAgICAkKElOVEVHRVJfT1ZFUkZMT1dfRVhDTFVERV9QQVRIUykgJChQUk9EVUNUX0lOVEVHRVJfT1ZFUkZMT1dfRVhDTFVERV9QQVRIUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgSFdBU2FuSW5jbHVkZVBhdGhzLCAgICAgICAgICAgICAgICAkKEhXQVNBTl9JTkNMVURFX1BBVEhTKSAkKFBST0RVQ1RfSFdBU0FOX0lOQ0xVREVfUEFUSFMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEhXQVNhbkV4Y2x1ZGVQYXRocywgICAgICAgICAgICAgICAgJChIV0FTQU5fRVhDTFVERV9QQVRIUykgJChQUk9EVUNUX0hXQVNBTl9FWENMVURFX1BBVEhTKSkKIAogJChjYWxsIGFkZF9qc29uX2xpc3QsIE1lbXRhZ0hlYXBFeGNsdWRlUGF0aHMsICAgICAgICAgICAgJChNRU1UQUdfSEVBUF9FWENMVURFX1BBVEhTKSAkKFBST0RVQ1RfTUVNVEFHX0hFQVBfRVhDTFVERV9QQVRIUykpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgTWVtdGFnSGVhcEFzeW5jSW5jbHVkZVBhdGhzLCAgICAgICAkKE1FTVRBR19IRUFQX0FTWU5DX0lOQ0xVREVfUEFUSFMpICQoUFJPRFVDVF9NRU1UQUdfSEVBUF9BU1lOQ19JTkNMVURFX1BBVEhTKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBNZW10YWdIZWFwU3luY0luY2x1ZGVQYXRocywgICAgICAgICQoTUVNVEFHX0hFQVBfU1lOQ19JTkNMVURFX1BBVEhTKSAkKFBST0RVQ1RfTUVNVEFHX0hFQVBfU1lOQ19JTkNMVURFX1BBVEhTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBNZW10YWdIZWFwQXN5bmNJbmNsdWRlUGF0aHMsICAgICAgICQoTUVNVEFHX0hFQVBfQVNZTkNfSU5DTFVERV9QQVRIUykgJChQUk9EVUNUX01FTVRBR19IRUFQX0FTWU5DX0lOQ0xVREVfUEFUSFMpICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfTUVNVEFHX0hFQVBfU0tJUF9ERUZBVUxUX1BBVEhTKSksLCQoUFJPRFVDVF9NRU1UQUdfSEVBUF9BU1lOQ19ERUZBVUxUX0lOQ0xVREVfUEFUSFMpKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBNZW10YWdIZWFwU3luY0luY2x1ZGVQYXRocywgICAgICAgJChNRU1UQUdfSEVBUF9TWU5DX0lOQ0xVREVfUEFUSFMpICQoUFJPRFVDVF9NRU1UQUdfSEVBUF9TWU5DX0lOQ0xVREVfUEFUSFMpICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfTUVNVEFHX0hFQVBfU0tJUF9ERUZBVUxUX1BBVEhTKSksLCQoUFJPRFVDVF9NRU1UQUdfSEVBUF9TWU5DX0RFRkFVTFRfSU5DTFVERV9QQVRIUykpKQogCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgRGlzYWJsZVNjdWRvLCAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9ESVNBQkxFX1NDVURPKSkpCiAKQEAgLTE0MCwzNCArMTQ2LDM4IEBACiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgTmF0aXZlQ292ZXJhZ2VQYXRocywgICAgICAgICAgICAgICAkKE5BVElWRV9DT1ZFUkFHRV9QQVRIUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgTmF0aXZlQ292ZXJhZ2VFeGNsdWRlUGF0aHMsICAgICAgICAkKE5BVElWRV9DT1ZFUkFHRV9FWENMVURFX1BBVEhTKSkKIAotJChjYWxsIGFkZF9qc29uX2Jvb2wsIFNhbXBsaW5nUEdPLCAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFNBTVBMSU5HX1BHTykpKQotCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQXJ0VXNlUmVhZEJhcnJpZXIsICAgICAgICAgICAgICAgICAkKGNhbGwgaW52ZXJ0X2Jvb2wsJChmaWx0ZXIgZmFsc2UsJChQUk9EVUNUX0FSVF9VU0VfUkVBRF9CQVJSSUVSKSkpKQotJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJpbmRlcjMyYml0LCAgICAgICAgICAgICAgICAgICAgICAgJChCSU5ERVIzMkJJVCkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgQnRDb25maWdJbmNsdWRlRGlyLCAgICAgICAgICAgICAgICAkKEJPQVJEX0JMVUVUT09USF9CRFJPSURfQlVJTERDRkdfSU5DTFVERV9ESVIpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIERldmljZUtlcm5lbEhlYWRlcnMsICAgICAgICAgICAgICAgJChUQVJHRVRfREVWSUNFX0tFUk5FTF9IRUFERVJTKSAkKFRBUkdFVF9CT0FSRF9LRVJORUxfSEVBREVSUykgJChUQVJHRVRfUFJPRFVDVF9LRVJORUxfSEVBREVSUykpCi0kKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlVm5ka1ZlcnNpb24sICAgICAgICAgICAgICAgICAkKEJPQVJEX1ZOREtfVkVSU0lPTikpCi0kKGNhbGwgYWRkX2pzb25fc3RyLCAgUGxhdGZvcm1fdm5ka192ZXJzaW9uLCAgICAgICAgICAgICAkKFBMQVRGT1JNX1ZOREtfVkVSU0lPTikpCi0kKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdFZuZGtWZXJzaW9uLCAgICAgICAgICAgICAgICAkKFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFZlbmRvckFwaUxldmVsLCAgICAgICAgICAgICAgICAgICAgJChCT0FSRF9BUElfTEVWRUwpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIEV4dHJhVm5ka1ZlcnNpb25zLCAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIERldmljZVN5c3RlbVNka1ZlcnNpb25zLCAgICAgICAgICAgJChCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFJlY292ZXJ5U25hcHNob3RWZXJzaW9uLCAgICAgICAgICAgJChSRUNPVkVSWV9TTkFQU0hPVF9WRVJTSU9OKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBQbGF0Zm9ybV9zeXN0ZW1zZGtfdmVyc2lvbnMsICAgICAgICQoUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TKSkKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBNYWxsb2Nfbm90X3N2ZWx0ZSwgICAgICAgICAgICAgICAgICQoY2FsbCBpbnZlcnRfYm9vbCwkKGZpbHRlciB0cnVlLCQoTUFMTE9DX1NWRUxURSkpKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBNYWxsb2NfbG93X21lbW9yeSwgICAgICAgICAgICAgICAgICQoZmluZHN0cmluZyB0cnVlLCQoTUFMTE9DX1NWRUxURSkgJChNQUxMT0NfTE9XX01FTU9SWSkpKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIE1hbGxvY196ZXJvX2NvbnRlbnRzLCAgICAgICAgICAgICAgJChjYWxsIGludmVydF9ib29sLCQoZmlsdGVyIGZhbHNlLCQoTUFMTE9DX1pFUk9fQ09OVEVOVFMpKSkpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgTWFsbG9jX3BhdHRlcm5fZmlsbF9jb250ZW50cywgICAgICAkKE1BTExPQ19QQVRURVJOX0ZJTExfQ09OVEVOVFMpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIE92ZXJyaWRlX3JzX2RyaXZlciwgICAgICAgICAgICAgICAgJChPVkVSUklERV9SU19EUklWRVIpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIERldmljZU1heFBhZ2VTaXplU3VwcG9ydGVkLCAgICAgICAgJChUQVJHRVRfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIERldmljZU5vQmlvbmljUGFnZVNpemVNYWNybywgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPKSkpCiAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBVbmNvbXByZXNzUHJpdkFwcERleCwgICAgICAgICAgICAgICQoY2FsbCBpbnZlcnRfYm9vbCwkKGZpbHRlciB0cnVlLCQoRE9OVF9VTkNPTVBSRVNTX1BSSVZfQVBQU19ERVhTKSkpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIE1vZHVsZXNMb2FkZWRCeVByaXZpbGVnZWRNb2R1bGVzLCAgJChQUk9EVUNUX0xPQURFRF9CWV9QUklWSUxFR0VEX01PRFVMRVMpKQogCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9vdEphcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfQk9PVF9KQVJTKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBBcGV4Qm9vdEphcnMsICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9BUEVYX0JPT1RfSkFSUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgQXBleEJvb3RKYXJzLCAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlci1vdXQgJChBUEVYX0JPT1RfSkFSU19FWENMVURFRCksICQoUFJPRFVDVF9BUEVYX0JPT1RfSkFSUykpKQogCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgVm5ka1VzZUNvcmVWYXJpYW50LCAgICAgICAgICAgICAgICAkKFRBUkdFVF9WTkRLX1VTRV9DT1JFX1ZBUklBTlQpKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFZuZGtTbmFwc2hvdEJ1aWxkQXJ0aWZhY3RzLCAgICAgICAgJChWTkRLX1NOQVBTSE9UX0JVSUxEX0FSVElGQUNUUykpCiAKKyQoY2FsbCBhZGRfanNvbl9tYXAsICBCdWlsZEZsYWdzKQorJChmb3JlYWNoIGZsYWcsJChfQUxMX1JFTEVBU0VfRkxBR1MpLFwKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwkKGZsYWcpLCQoX0FMTF9SRUxFQVNFX0ZMQUdTLiQoZmxhZykuVkFMVUUpKSkKKyQoY2FsbCBlbmRfanNvbl9tYXApCiskKGNhbGwgYWRkX2pzb25fbWFwLCAgQnVpbGRGbGFnVHlwZXMpCiskKGZvcmVhY2ggZmxhZywkKF9BTExfUkVMRUFTRV9GTEFHUyksXAorICAkKGNhbGwgYWRkX2pzb25fc3RyLCQoZmxhZyksJChfQUxMX1JFTEVBU0VfRkxBR1MuJChmbGFnKS5UWVBFKSkpCiskKGNhbGwgZW5kX2pzb25fbWFwKQorCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgRGlyZWN0ZWRWZW5kb3JTbmFwc2hvdCwgICAgICAgICAgICAkKERJUkVDVEVEX1ZFTkRPUl9TTkFQU0hPVCkpCiAkKGNhbGwgYWRkX2pzb25fbWFwLCAgVmVuZG9yU25hcHNob3RNb2R1bGVzKQogJChmb3JlYWNoIG1vZHVsZSwkKFZFTkRPUl9TTkFQU0hPVF9NT0RVTEVTKSxcCkBAIC0xOTQsOSArMjA0LDYgQEAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBVbWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFUl9NT0RFX0xJTlVYKSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgVmVuZG9yUGF0aCwgICAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIE9kbVBhdGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfT0RNKSkKLSQoY2FsbCBhZGRfanNvbl9zdHIsICBWZW5kb3JEbGttUGF0aCwgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUl9ETEtNKSkKLSQoY2FsbCBhZGRfanNvbl9zdHIsICBPZG1EbGttUGF0aCwgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX09ETV9ETEtNKSkKLSQoY2FsbCBhZGRfanNvbl9zdHIsICBTeXN0ZW1EbGttUGF0aCwgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX1NZU1RFTV9ETEtNKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBQcm9kdWN0UGF0aCwgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFN5c3RlbUV4dFBhdGgsICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfU1lTVEVNX0VYVCkpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgTWluaW1pemVKYXZhRGVidWdJbmZvLCAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9NSU5JTUlaRV9KQVZBX0RFQlVHX0lORk8pKSkKQEAgLTIxMiwxNyArMjE5LDggQEAKIAogJChjYWxsIGFkZF9qc29uX2xpc3QsIFBnb0FkZGl0aW9uYWxQcm9maWxlRGlycywgICAgICAgICAgJChQR09fQURESVRJT05BTF9QUk9GSUxFX0RJUlMpKQogCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9hcmRQbGF0VmVuZG9yUG9saWN5LCAgICAgICAgICAgICAkKEJPQVJEX1BMQVRfVkVORE9SX1BPTElDWSkpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9hcmRSZXFkTWFza1BvbGljeSwgICAgICAgICAgICAgICAkKEJPQVJEX1JFUURfTUFTS19QT0xJQ1kpKQotJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvYXJkU3lzdGVtRXh0UHVibGljUHJlYnVpbHREaXJzLCAgJChCT0FSRF9TWVNURU1fRVhUX1BVQkxJQ19QUkVCVUlMVF9ESVJTKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZFN5c3RlbUV4dFByaXZhdGVQcmVidWlsdERpcnMsICQoQk9BUkRfU1lTVEVNX0VYVF9QUklWQVRFX1BSRUJVSUxUX0RJUlMpKQotJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvYXJkUHJvZHVjdFB1YmxpY1ByZWJ1aWx0RGlycywgICAgJChCT0FSRF9QUk9EVUNUX1BVQkxJQ19QUkVCVUlMVF9ESVJTKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZFByb2R1Y3RQcml2YXRlUHJlYnVpbHREaXJzLCAgICQoQk9BUkRfUFJPRFVDVF9QUklWQVRFX1BSRUJVSUxUX0RJUlMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvYXJkVmVuZG9yU2Vwb2xpY3lEaXJzLCAgICAgICAgICAgJChCT0FSRF9WRU5ET1JfU0VQT0xJQ1lfRElSUykgJChCT0FSRF9TRVBPTElDWV9ESVJTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZE9kbVNlcG9saWN5RGlycywgICAgICAgICAgICAgICQoQk9BUkRfT0RNX1NFUE9MSUNZX0RJUlMpKQotJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvYXJkVmVuZG9yRGxrbVNlcG9saWN5RGlycywgICAgICAgJChCT0FSRF9WRU5ET1JfRExLTV9TRVBPTElDWV9ESVJTKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZE9kbURsa21TZXBvbGljeURpcnMsICAgICAgICAgICQoQk9BUkRfT0RNX0RMS01fU0VQT0xJQ1lfRElSUykpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9hcmRTeXN0ZW1EbGttU2Vwb2xpY3lEaXJzLCAgICAgICAkKEJPQVJEX1NZU1RFTV9ETEtNX1NFUE9MSUNZX0RJUlMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbUV4dFB1YmxpY1NlcG9saWN5RGlycywgICAgICAgJChTWVNURU1fRVhUX1BVQkxJQ19TRVBPTElDWV9ESVJTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBTeXN0ZW1FeHRQcml2YXRlU2Vwb2xpY3lEaXJzLCAgICAgICQoU1lTVEVNX0VYVF9QUklWQVRFX1NFUE9MSUNZX0RJUlMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvYXJkU2Vwb2xpY3lNNERlZnMsICAgICAgICAgICAgICAgJChCT0FSRF9TRVBPTElDWV9NNERFRlMpKQpAQCAtMjMxLDEwICsyMjksOCBAQAogJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RTZXBvbGljeVByZWJ1aWx0QXBpRGlyLCAgICAgJChCT0FSRF9QUk9EVUNUX1BSRUJVSUxUX0RJUikpCiAKICQoY2FsbCBhZGRfanNvbl9zdHIsICBQbGF0Zm9ybVNlcG9saWN5VmVyc2lvbiwgICAgICAgICAgICQoUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTikpCi0kKGNhbGwgYWRkX2pzb25fc3RyLCAgVG90U2Vwb2xpY3lWZXJzaW9uLCAgICAgICAgICAgICAgICAkKFRPVF9TRVBPTElDWV9WRVJTSU9OKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBQbGF0Zm9ybVNlcG9saWN5Q29tcGF0VmVyc2lvbnMsICAgICQoUExBVEZPUk1fU0VQT0xJQ1lfQ09NUEFUX1ZFUlNJT05TKSkKIAotJChjYWxsIGFkZF9qc29uX2Jvb2wsIEZsYXR0ZW5fYXBleCwgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9GTEFUVEVOX0FQRVgpKSkKICQoY2FsbCBhZGRfanNvbl9ib29sLCBGb3JjZUFwZXhTeW1saW5rT3B0aW1pemF0aW9uLCAgICAgICQoZmlsdGVyIHRydWUsJChUQVJHRVRfRk9SQ0VfQVBFWF9TWU1MSU5LX09QVElNSVpBVElPTikpKQogCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV4cHJlb3B0R2xvYmFsQ29uZmlnLCAgICAgICAgICAgICAkKERFWF9QUkVPUFRfQ09ORklHKSkKQEAgLTI0NCw2ICsyNDAsNyBAQAogJChjYWxsIGFkZF9qc29uX2xpc3QsIE1hbmlmZXN0UGFja2FnZU5hbWVPdmVycmlkZXMsICAgICAgJChQUk9EVUNUX01BTklGRVNUX1BBQ0tBR0VfTkFNRV9PVkVSUklERVMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIFBhY2thZ2VOYW1lT3ZlcnJpZGVzLCAgICAgICAgICAgICAgJChQUk9EVUNUX1BBQ0tBR0VfTkFNRV9PVkVSUklERVMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIENlcnRpZmljYXRlT3ZlcnJpZGVzLCAgICAgICAgICAgICAgJChQUk9EVUNUX0NFUlRJRklDQVRFX09WRVJSSURFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgQ29uZmlndXJlZEphckxvY2F0aW9uT3ZlcnJpZGVzLCAgICAkKFBST0RVQ1RfQ09ORklHVVJFRF9KQVJfTE9DQVRJT05fT1ZFUlJJREVTKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgQXBleEdsb2JhbE1pblNka1ZlcnNpb25PdmVycmlkZSwgICAgJChBUEVYX0dMT0JBTF9NSU5fU0RLX1ZFUlNJT05fT1ZFUlJJREUpKQogCkBAIC0yNTksOCArMjU2LDYgQEAKIAogJChjYWxsIGFkZF9qc29uX2xpc3QsIFRhcmdldEZTQ29uZmlnR2VuLCAgICAgICAgICAgICAgICAgJChUQVJHRVRfRlNfQ09ORklHX0dFTikpCiAKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBNaXNzaW5nVXNlc0xpYnJhcmllcywgICAgICAgICAgICAgICQoSU5URVJOQUxfUExBVEZPUk1fTUlTU0lOR19VU0VTX0xJQlJBUklFUykpCi0KICQoY2FsbCBhZGRfanNvbl9tYXAsIFZlbmRvclZhcnMpCiAkKGZvcmVhY2ggbmFtZXNwYWNlLCQoc29ydCAkKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSksXAogICAkKGNhbGwgYWRkX2pzb25fbWFwLCAkKG5hbWVzcGFjZSkpXApAQCAtMjY5LDE0ICsyNjQsMjQgQEAKICAgJChjYWxsIGVuZF9qc29uX21hcCkpCiAkKGNhbGwgZW5kX2pzb25fbWFwKQogCisjIEFkZCB0aGUgdHlwZXMgb2YgdGhlIHZhcmlhYmxlcyBpbiBWZW5kb3JWYXJzLiBTaW5jZSB0aGlzIGlzIG11Y2ggbmV3ZXIKKyMgdGhhbiBWZW5kb3JWYXJzLCB3aGljaCBoYXMgYSBoaXN0b3J5IG9mIGp1c3QgdXNpbmcgc3RyaW5nIHZhbHVlcyBmb3IgZXZlcnl0aGluZywKKyMgdmFyaWFibGVzIGFyZSBhc3N1bWVkIHRvIGJlIHN0cmluZ3MgYnkgZGVmYXVsdC4gRm9yIHN0cmluZ3MsIFNPT05HX0NPTkZJR19UWVBFXyoKKyMgd2lsbCBub3QgYmUgc2V0LCBhbmQgdGhleSB3aWxsIG5vdCBoYXZlIGFuIGVudHJ5IGluIHRoZSBWZW5kb3JWYXJUeXBlcyBtYXAuCiskKGNhbGwgYWRkX2pzb25fbWFwLCBWZW5kb3JWYXJUeXBlcykKKyQoZm9yZWFjaCBuYW1lc3BhY2UsJChzb3J0ICQoU09PTkdfQ09ORklHX05BTUVTUEFDRVMpKSxcCisgICQoY2FsbCBhZGRfanNvbl9tYXAsICQobmFtZXNwYWNlKSlcCisgICQoZm9yZWFjaCBrZXksJChzb3J0ICQoU09PTkdfQ09ORklHXyQobmFtZXNwYWNlKSkpLFwKKyAgICAkKGlmICQoU09PTkdfQ09ORklHX1RZUEVfJChuYW1lc3BhY2UpXyQoa2V5KSksJChjYWxsIGFkZF9qc29uX3N0ciwkKGtleSksJChzdWJzdCAiLFwiLCQoU09PTkdfQ09ORklHX1RZUEVfJChuYW1lc3BhY2UpXyQoa2V5KSkpKSkpXAorICAkKGNhbGwgZW5kX2pzb25fbWFwKSkKKyQoY2FsbCBlbmRfanNvbl9tYXApCisKICQoY2FsbCBhZGRfanNvbl9ib29sLCBFbmZvcmNlUHJvZHVjdFBhcnRpdGlvbkludGVyZmFjZSwgICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFKSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlQ3VycmVudEFwaUxldmVsRm9yVmVuZG9yTW9kdWxlcywgICQoQk9BUkRfQ1VSUkVOVF9BUElfTEVWRUxfRk9SX1ZFTkRPUl9NT0RVTEVTKSkKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIEVuZm9yY2VJbnRlclBhcnRpdGlvbkphdmFTZGtMaWJyYXJ5LCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9FTkZPUkNFX0lOVEVSX1BBUlRJVElPTl9KQVZBX1NES19MSUJSQVJZKSkpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgSW50ZXJQYXJ0aXRpb25KYXZhTGlicmFyeUFsbG93TGlzdCwgJChQUk9EVUNUX0lOVEVSX1BBUlRJVElPTl9KQVZBX0xJQlJBUllfQUxMT1dMSVNUKSkKIAotJChjYWxsIGFkZF9qc29uX2Jvb2wsIEluc3RhbGxFeHRyYUZsYXR0ZW5lZEFwZXhlcywgJChQUk9EVUNUX0lOU1RBTExfRVhUUkFfRkxBVFRFTkVEX0FQRVhFUykpCi0KICQoY2FsbCBhZGRfanNvbl9ib29sLCBDb21wcmVzc2VkQXBleCwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfQ09NUFJFU1NFRF9BUEVYKSkpCiAKIGlmbmRlZiBBUEVYX0JVSUxEX0ZPUl9QUkVfU19ERVZJQ0VTCkBAIC0yOTEsMTcgKzI5NiwyNCBAQAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJvYXJkTW92ZVJlY292ZXJ5UmVzb3VyY2VzVG9WZW5kb3JCb290LCAkKGZpbHRlciB0cnVlLCQoQk9BUkRfTU9WRV9SRUNPVkVSWV9SRVNPVVJDRVNfVE9fVkVORE9SX0JPT1QpKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBQcmVidWlsdEhpZGRlbkFwaURpciwgJChCT0FSRF9QUkVCVUlMVF9ISURERU5BUElfRElSKSkKIAotJChjYWxsIGFkZF9qc29uX3N0ciwgIFNoaXBwaW5nQXBpTGV2ZWwsICQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFNoaXBwaW5nX2FwaV9sZXZlbCwgJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpCiAKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlbkNsYW5nUHJvcGVydHksICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0NMQU5HX1BST1BFUlRZKSkpCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5DbGFuZ0FzRmxhZ3MsICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9DTEFOR19BU0ZMQUdTKSkpCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5DbGFuZ0NGbGFncywgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9DTEFOR19DRkxBR1MpKSkKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlbkRlcGZpbGUsICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0RFUEZJTEUpKSkKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlbkVuZm9yY2VTeXNwcm9wT3duZXIsICAgICAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0VORk9SQ0VfU1lTUFJPUF9PV05FUikpKQotJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuVHJlYmxlU3lzcHJvcE5ldmVyYWxsb3csICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fVFJFQkxFX1NZU1BST1BfTkVWRVJBTExPVykpKQotJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuVXNlc1Nvb25nUHl0aG9uMk1vZHVsZXMsICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fVVNFU19TT09OR19QWVRIT04yX01PRFVMRVMpKSkKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlblZlbmRvclByb3BlcnR5TmFtZXNwYWNlLCAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX1ZFTkRPUl9QUk9QRVJUWV9OQU1FU1BBQ0UpKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBCdWlsZEJyb2tlbklucHV0RGlyTW9kdWxlcywgJChCVUlMRF9CUk9LRU5fSU5QVVRfRElSX01PRFVMRVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEJ1aWxkQnJva2VuUGx1Z2luVmFsaWRhdGlvbiwgICAgICAgICAkKEJVSUxEX0JST0tFTl9QTFVHSU5fVkFMSURBVElPTikpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5DbGFuZ1Byb3BlcnR5LCAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fQ0xBTkdfUFJPUEVSVFkpKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlbkNsYW5nQXNGbGFncywgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9DTEFOR19BU0ZMQUdTKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5DbGFuZ0NGbGFncywgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fQ0xBTkdfQ0ZMQUdTKSkpCisjIFVzZSB0aGUgdmFsdWUgb2YgR0VOUlVMRV9TQU5EQk9YSU5HIGlmIHNldCwgb3RoZXJ3aXNlIHVzZSB0aGUgaW52ZXJzZSBvZiBCVUlMRF9CUk9LRU5fR0VOUlVMRV9TQU5EQk9YSU5HCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgR2VucnVsZVNhbmRib3hpbmcsICAgICAgICAgICAgICAgICAgICQoaWYgJChHRU5SVUxFX1NBTkRCT1hJTkcpLCQoZmlsdGVyIHRydWUsJChHRU5SVUxFX1NBTkRCT1hJTkcpKSwkKGlmICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fR0VOUlVMRV9TQU5EQk9YSU5HKSksLHRydWUpKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlbkVuZm9yY2VTeXNwcm9wT3duZXIsICAgICAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9FTkZPUkNFX1NZU1BST1BfT1dORVIpKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlblRyZWJsZVN5c3Byb3BOZXZlcmFsbG93LCAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9UUkVCTEVfU1lTUFJPUF9ORVZFUkFMTE9XKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5Vc2VzU29vbmdQeXRob24yTW9kdWxlcywgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fVVNFU19TT09OR19QWVRIT04yX01PRFVMRVMpKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlblZlbmRvclByb3BlcnR5TmFtZXNwYWNlLCAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9WRU5ET1JfUFJPUEVSVFlfTkFNRVNQQUNFKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5JbmNvcnJlY3RQYXJ0aXRpb25JbWFnZXMsICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBCdWlsZEJyb2tlbklucHV0RGlyTW9kdWxlcywgICAgICAgICAgJChCVUlMRF9CUk9LRU5fSU5QVVRfRElSX01PRFVMRVMpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuRG9udENoZWNrU3lzdGVtU2RrLCAgICAgICAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0RPTlRfQ0hFQ0tfU1lTVEVNU0RLKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5EdXBTeXNwcm9wLCAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fRFVQX1NZU1BST1ApKSkKKworJChjYWxsIGFkZF9qc29uX2xpc3QsIEJ1aWxkV2FybmluZ0JhZE9wdGlvbmFsVXNlc0xpYnNBbGxvd2xpc3QsICAgICQoQlVJTERfV0FSTklOR19CQURfT1BUSU9OQUxfVVNFU19MSUJTX0FMTE9XTElTVCkpCiAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZERlYnVnZnNSZXN0cmljdGlvbnNFbmFibGVkLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9TRVRfREVCVUdGU19SRVNUUklDVElPTlMpKSkKIApAQCAtMzA5LDggKzMyMSw2IEBACiAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBTZWxpbnV4SWdub3JlTmV2ZXJhbGxvd3MsICQoZmlsdGVyIHRydWUsJChTRUxJTlVYX0lHTk9SRV9ORVZFUkFMTE9XUykpKQogCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgU2Vwb2xpY3lTcGxpdCwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfU0VQT0xJQ1lfU1BMSVQpKSkKLQogJChjYWxsIGFkZF9qc29uX2xpc3QsIFNlcG9saWN5RnJlZXplVGVzdEV4dHJhRGlycywgICAgICAgICAkKFNFUE9MSUNZX0ZSRUVaRV9URVNUX0VYVFJBX0RJUlMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIFNlcG9saWN5RnJlZXplVGVzdEV4dHJhUHJlYnVpbHREaXJzLCAkKFNFUE9MSUNZX0ZSRUVaRV9URVNUX0VYVFJBX1BSRUJVSUxUX0RJUlMpKQogCkBAIC0zMTgsMTQgKzMyOCwzOCBAQAogCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgSWdub3JlUHJlZmVyMzJPbkRldmljZSwgJChmaWx0ZXIgdHJ1ZSwkKElHTk9SRV9QUkVGRVIzMl9PTl9ERVZJQ0UpKSkKIAotJChjYWxsIGFkZF9qc29uX2xpc3QsIEluY2x1ZGVUYWdzLCAgICAgICAgICAgICAgICAkKFBST0RVQ1RfSU5DTFVERV9UQUdTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBTb3VyY2VSb290RGlycywgICAgICAgICAgICAgJChQUk9EVUNUX1NPVVJDRV9ST09UX0RJUlMpKQogCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQWZkb1Byb2ZpbGVzLCAgICAgICAgICAgICAgICAkKEFMTF9BRkRPX1BST0ZJTEVTKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RNYW51ZmFjdHVyZXIsICQoUFJPRFVDVF9NQU5VRkFDVFVSRVIpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RCcmFuZCwgICAgICAgICQoUFJPRFVDVF9CUkFORCkpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgQnVpbGRWZXJzaW9uVGFncywgICAgJChCVUlMRF9WRVJTSU9OX1RBR1MpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBSZWxlYXNlVmVyc2lvbiwgICAgJChfUkVMRUFTRV9WRVJTSU9OKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBSZWxlYXNlQWNvbmZpZ1ZhbHVlU2V0cywgICAgJChSRUxFQVNFX0FDT05GSUdfVkFMVUVfU0VUUykpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBSZWxlYXNlQWNvbmZpZ0ZsYWdEZWZhdWx0UGVybWlzc2lvbiwgICAgJChSRUxFQVNFX0FDT05GSUdfRkxBR19ERUZBVUxUX1BFUk1JU1NJT04pKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgUmVsZWFzZURlZmF1bHRNb2R1bGVCdWlsZEZyb21Tb3VyY2UsICAgJChSRUxFQVNFX0RFRkFVTFRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIENoZWNrVmVuZG9yU2VhcHBWaW9sYXRpb25zLCAkKGZpbHRlciB0cnVlLCQoQ0hFQ0tfVkVORE9SX1NFQVBQX1ZJT0xBVElPTlMpKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkSWdub3JlQXBleENvbnRyaWJ1dGlvbkNvbnRlbnRzLCAkKFBST0RVQ1RfQlVJTERfSUdOT1JFX0FQRVhfQ09OVFJJQlVUSU9OX0NPTlRFTlRTKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkRnJvbVNvdXJjZVN0dWIsICQoZmluZHN0cmluZyB0cnVlLCQoUFJPRFVDVF9CVUlMRF9GUk9NX1NPVVJDRV9TVFVCKSAkKEJVSUxEX0ZST01fU09VUkNFX1NUVUIpKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIEhpZGRlbmFwaUV4cG9ydGFibGVTdHVicywgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfSElEREVOX0FQSV9FWFBPUlRBQkxFX1NUVUJTKSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBFeHBvcnRSdW50aW1lQXBpcywgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfRVhQT1JUX1JVTlRJTUVfQVBJUykpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBBY29uZmlnQ29udGFpbmVyVmFsaWRhdGlvbiwgJChBQ09ORklHX0NPTlRBSU5FUl9WQUxJREFUSU9OKSkKKworJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RMb2NhbGVzLCAkKHN1YnN0IF8sLSwkKFBST0RVQ1RfTE9DQUxFUykpKQorCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUHJvZHVjdERlZmF1bHRXaWZpQ2hhbm5lbHMsICQoUFJPRFVDVF9ERUZBVUxUX1dJRklfQ0hBTk5FTFMpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQm9hcmRVc2VWYm1ldGFEaWdlc3RJbkZpbmdlcnByaW50LCAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFX1ZCTUVUQV9ESUdURVNUX0lOX0ZJTkdFUlBSSU5UKSkpCisKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBPZW1Qcm9wZXJ0aWVzLCAkKFBST0RVQ1RfT0VNX1BST1BFUlRJRVMpKQogCiAkKGNhbGwganNvbl9lbmQpCiAKQEAgLTMzNyw0ICszNzEsNiBAQAogCSAgcm0gJChTT09OR19WQVJJQUJMRVMpLnRtcDsgXAogCWZpKQogCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zb29uZ19leHRyYV9jb25maWcubWsKKwogZW5kaWYgIyBDT05GSUdVUkVfU09PTkcKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfZXh0cmFfY29uZmlnLm1rIGIvY29yZS9zb29uZ19leHRyYV9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0MzJkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc29vbmdfZXh0cmFfY29uZmlnLm1rCkBAIC0wLDAgKzEsMTA1IEBACiskKGNhbGwganNvbl9zdGFydCkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgRGV2aWNlQ3B1VmFyaWFudFJ1bnRpbWUsICAgICAgICAgICAkKFRBUkdFVF9DUFVfVkFSSUFOVF9SVU5USU1FKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIERldmljZUFiaUxpc3QsICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ1BVX0FCSV9MSVNUKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIERldmljZUFiaUxpc3QzMiwgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ1BVX0FCSV9MSVNUXzMyX0JJVCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBEZXZpY2VBYmlMaXN0NjQsICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NQVV9BQklfTElTVF82NF9CSVQpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgRGV2aWNlU2Vjb25kYXJ5Q3B1VmFyaWFudFJ1bnRpbWUsICAkKFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlRfUlVOVElNRSkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIERleDJvYXRUYXJnZXRDcHVWYXJpYW50UnVudGltZSwgICAgICAgICAkKERFWDJPQVRfVEFSR0VUX0NQVV9WQVJJQU5UX1JVTlRJTUUpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgRGV4Mm9hdFRhcmdldEluc3RydWN0aW9uU2V0RmVhdHVyZXMsICAgICQoREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFNlY29uZGFyeURleDJvYXRDcHVWYXJpYW50UnVudGltZSwgICAgICAkKCQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfQ1BVX1ZBUklBTlRfUlVOVElNRSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBTZWNvbmRhcnlEZXgyb2F0SW5zdHJ1Y3Rpb25TZXRGZWF0dXJlcywgJCgkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKURFWDJPQVRfVEFSR0VUX0lOU1RSVUNUSU9OX1NFVF9GRUFUVVJFUykpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkUGxhdGZvcm0sICAgICAgICAgICQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkU2hpcHBpbmdBcGlMZXZlbCwgICQoQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFNoaXBwaW5nQXBpTGV2ZWwsICAgICAgICQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgU2hpcHBpbmdWZW5kb3JBcGlMZXZlbCwgJChQUk9EVUNUX1NISVBQSU5HX1ZFTkRPUl9BUElfTEVWRUwpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0TW9kZWwsICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9NT0RFTCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0TW9kZWxGb3JBdHRlc3RhdGlvbiwgICAgICAgICQoUFJPRFVDVF9NT0RFTF9GT1JfQVRURVNUQVRJT04pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdEJyYW5kRm9yQXR0ZXN0YXRpb24sICAgICAgICAkKFBST0RVQ1RfQlJBTkRfRk9SX0FUVEVTVEFUSU9OKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3ROYW1lRm9yQXR0ZXN0YXRpb24sICAgICAgICAgJChQUk9EVUNUX05BTUVfRk9SX0FUVEVTVEFUSU9OKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3REZXZpY2VGb3JBdHRlc3RhdGlvbiwgICAgICAgJChQUk9EVUNUX0RFVklDRV9GT1JfQVRURVNUQVRJT04pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdE1hbnVmYWN0dXJlckZvckF0dGVzdGF0aW9uLCAkKFBST0RVQ1RfTUFOVUZBQ1RVUkVSX0ZPUl9BVFRFU1RBVElPTikpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFN5c3RlbUJyYW5kLCAkKFBST0RVQ1RfU1lTVEVNX0JSQU5EKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFN5c3RlbURldmljZSwgJChQUk9EVUNUX1NZU1RFTV9ERVZJQ0UpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgU3lzdGVtTWFudWZhY3R1cmVyLCAkKFBST0RVQ1RfU1lTVEVNX01BTlVGQUNUVVJFUikpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBTeXN0ZW1Nb2RlbCwgJChQUk9EVUNUX1NZU1RFTV9NT0RFTCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBTeXN0ZW1OYW1lLCAkKFBST0RVQ1RfU1lTVEVNX05BTUUpKQorCisjIENvbGxhcHNlcyA/PSBhbmQgPSBvcGVyYXRvcnMgZm9yIHN5c3RlbSBwcm9wZXJ0eSB2YXJpYWJsZXMuIEFsc28gcmVtb3ZlcyBkb3VibGUgcXVvdGVzIHRvIHByZXZlbnQKKyMgbWFsZm9ybWVkIEpTT04uIFRoaXMgY2hhbmdlIGFsaWducyB3aXRoIHRoZSBleGlzdGluZyBiZWhhdmlvciBvZiBzeXNwcm9wLm1rLCB3aGljaCBwYXNzZXMgcHJvcGVydHkKKyMgdmFyaWFibGVzIHRvIHRoZSBlY2hvIGNvbW1hbmQsIGVmZmVjdGl2ZWx5IGRpc2NhcmRpbmcgc3Vycm91bmRpbmcgZG91YmxlIHF1b3Rlcy4KK2RlZmluZSBjb2xsYXBzZS1wcm9wLXBhaXJzCiskKHN1YnN0ICIsLCQoY2FsbCBjb2xsYXBzZS1wYWlycywkKGNhbGwgY29sbGFwc2UtcGFpcnMsJCQoJCgxKSksPz0pLD0pKQorZW5kZWYKKworJChjYWxsIGFkZF9qc29uX2xpc3QsIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMsICAgICAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTLCAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFBST0RVQ1RfU1lTVEVNX0VYVF9QUk9QRVJUSUVTLCAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9TWVNURU1fRVhUX1BST1BFUlRJRVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMsICAgICAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMsICAgICAgICAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9PRE1fUFJPUEVSVElFUywgICAgICAgICAgICAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX09ETV9QUk9QRVJUSUVTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUywgICAgICAgICQoY2FsbCBjb2xsYXBzZS1wcm9wLXBhaXJzLFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgQm9vdGxvYWRlckJvYXJkTmFtZSwgJChUQVJHRVRfQk9PVExPQURFUl9CT0FSRF9OQU1FKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFNka0J1aWxkLCAkKGZpbHRlciBzZGsgc2RrX2FkZG9uLCQoTUFLRUNNREdPQUxTKSkpCisKK19jb25maWdfZW5hYmxlX3VmZmRfZ2MgOj0gXAorICAkKGZpcnN0d29yZCAkKE9WRVJSSURFX0VOQUJMRV9VRkZEX0dDKSAkKFBST0RVQ1RfRU5BQkxFX1VGRkRfR0MpIGRlZmF1bHQpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBFbmFibGVVZmZkR2MsICQoX2NvbmZpZ19lbmFibGVfdWZmZF9nYykpCitfY29uZmlnX2VuYWJsZV91ZmZkX2djIDo9CisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFN5c3RlbVNlcnZlckNvbXBpbGVyRmlsdGVyLCAkKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9DT01QSUxFUl9GSUxURVIpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdDE2S0RldmVsb3Blck9wdGlvbiwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfMTZLX0RFVkVMT1BFUl9PUFRJT04pKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgUmVjb3ZlcnlEZWZhdWx0Um90YXRpb24sICQoVEFSR0VUX1JFQ09WRVJZX0RFRkFVTFRfUk9UQVRJT04pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgUmVjb3ZlcnlPdmVyc2NhblBlcmNlbnQsICQoVEFSR0VUX1JFQ09WRVJZX09WRVJTQ0FOX1BFUkNFTlQpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgUmVjb3ZlcnlQaXhlbEZvcm1hdCwgJChUQVJHRVRfUkVDT1ZFUllfUElYRUxfRk9STUFUKSkKKworaWZkZWYgQUJfT1RBX1VQREFURVIKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBBYk90YVVwZGF0ZXIsICQoZmlsdGVyIHRydWUsJChBQl9PVEFfVVBEQVRFUikpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgQWJPdGFQYXJ0aXRpb25zLCAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoc29ydCAkKEFCX09UQV9QQVJUSVRJT05TKSkpKQorZW5kaWYKKworaWZkZWYgUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgVXNlRHluYW1pY1BhcnRpdGlvbnMsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTlMpKSkKK2VuZGlmCisKK2lmZGVmIFBST0RVQ1RfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgUmV0cm9maXREeW5hbWljUGFydGl0aW9ucywgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TKSkpCitlbmRpZgorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgRG9udFVzZVZhYmNPdGEsICQoZmlsdGVyIHRydWUsJChCT0FSRF9ET05UX1VTRV9WQUJDX09UQSkpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgRnVsbFRyZWJsZSwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfRlVMTF9UUkVCTEUpKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIE5vQmlvbmljUGFnZVNpemVNYWNybywgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTykpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvcGVydHlTcGxpdEVuYWJsZWQsICQoZmlsdGVyIHRydWUsJChCT0FSRF9QUk9QRVJUWV9PVkVSUklERVNfU1BMSVRfRU5BQkxFRCkpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBTY3JlZW5EZW5zaXR5LCAkKFRBUkdFVF9TQ1JFRU5fREVOU0lUWSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBVc2VzVnVsa2FuLCAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1VTRVNfVlVMS0FOKSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBaeWdvdGVGb3JjZTY0LCAkKGZpbHRlciB0cnVlLCQoWllHT1RFX0ZPUkNFXzY0KSkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFZlbmRvclNlY3VyaXR5UGF0Y2gsICAgICAgICQoVkVORE9SX1NFQ1VSSVRZX1BBVENIKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFZlbmRvckltYWdlRmlsZVN5c3RlbVR5cGUsICQoQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRSkpCisKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBCdWlsZFZlcnNpb25UYWdzLCAkKEJVSUxEX1ZFUlNJT05fVEFHUykpCisKKyQoY2FsbCBqc29uX2VuZCkKKworJChzaGVsbCBta2RpciAtcCAkKGRpciAkKFNPT05HX0VYVFJBX1ZBUklBQkxFUykpKQorJChmaWxlID4kKFNPT05HX0VYVFJBX1ZBUklBQkxFUykudG1wLCQoanNvbl9jb250ZW50cykpCisKKyQoc2hlbGwgaWYgISBjbXAgLXMgJChTT09OR19FWFRSQV9WQVJJQUJMRVMpLnRtcCAkKFNPT05HX0VYVFJBX1ZBUklBQkxFUyk7IHRoZW4gXAorCSAgbXYgJChTT09OR19FWFRSQV9WQVJJQUJMRVMpLnRtcCAkKFNPT05HX0VYVFJBX1ZBUklBQkxFUyk7IFwKKwllbHNlIFwKKwkgIHJtICQoU09PTkdfRVhUUkFfVkFSSUFCTEVTKS50bXA7IFwKKwlmaSkKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfamF2YV9wcmVidWlsdC5tayBiL2NvcmUvc29vbmdfamF2YV9wcmVidWlsdC5tawppbmRleCBhOGY0NzVmLi43Zjg1MjMxIDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2phdmFfcHJlYnVpbHQubWsKKysrIGIvY29yZS9zb29uZ19qYXZhX3ByZWJ1aWx0Lm1rCkBAIC02MiwzMSArNjIsMjQgQEAKIGVuZGlmCiAKIGlmZGVmIExPQ0FMX1NPT05HX1BST0dVQVJEX0RJQ1QKLSAgbXlfcHJvZ3VhcmRfZGljdGlvbmFyeV9kaXJlY3RvcnkgOj0gJChsb2NhbC1wcm9ndWFyZC1kaWN0aW9uYXJ5LWRpcmVjdG9yeSkKLSAgbXlfcHJvZ3VhcmRfZGljdGlvbmFyeV9tYXBwaW5nX2RpcmVjdG9yeSA6PSAkKGxvY2FsLXByb2d1YXJkLWRpY3Rpb25hcnktbWFwcGluZy1kaXJlY3RvcnkpCi0gICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX1BST0dVQVJEX0RJQ1QpLFwKLSAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5KSkKICAgJChldmFsICQoY2FsbCBjb3B5LXI4LWRpY3Rpb25hcnktZmlsZS13aXRoLW1hcHBpbmcsXAogICAgICQoTE9DQUxfU09PTkdfUFJPR1VBUkRfRElDVCksXAotICAgICQobXlfcHJvZ3VhcmRfZGljdGlvbmFyeV9kaXJlY3RvcnkpL3Byb2d1YXJkX2RpY3Rpb25hcnksXAotICAgICQobXlfcHJvZ3VhcmRfZGljdGlvbmFyeV9tYXBwaW5nX2RpcmVjdG9yeSkvcHJvZ3VhcmRfZGljdGlvbmFyeS50ZXh0cHJvdG8pKQotICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9TT09OR19DTEFTU0VTX0pBUiksXAotICAgICQobXlfcHJvZ3VhcmRfZGljdGlvbmFyeV9kaXJlY3RvcnkpL2NsYXNzZXMuamFyKSkKLSAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoY29tbW9uX2phdmFsaWIuamFyKSxcCi0gICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeSkKLSAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoY29tbW9uX2phdmFsaWIuamFyKSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X2RpcmVjdG9yeSkvcHJvZ3VhcmRfZGljdGlvbmFyeSkKLSAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoY29tbW9uX2phdmFsaWIuamFyKSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X21hcHBpbmdfZGlyZWN0b3J5KS9wcm9ndWFyZF9kaWN0aW9uYXJ5LnRleHRwcm90bykKLSAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoY29tbW9uX2phdmFsaWIuamFyKSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X2RpcmVjdG9yeSkvY2xhc3Nlcy5qYXIpCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeSxcCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeS50ZXh0cHJvdG8pKQorCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuUFJPR1VBUkRfRElDVElPTkFSWV9GSUxFUyA6PSBcCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeSBcCisgICAgJChMT0NBTF9TT09OR19DTEFTU0VTX0pBUikKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5QUk9HVUFSRF9ESUNUSU9OQVJZX1NPT05HX1pJUF9BUkdVTUVOVFMgOj0gXAorICAgIC1lIG91dC90YXJnZXQvY29tbW9uL29iai8kKExPQ0FMX01PRFVMRV9DTEFTUykvJChMT0NBTF9NT0RVTEUpX2ludGVybWVkaWF0ZXMvcHJvZ3VhcmRfZGljdGlvbmFyeSBcCisgICAgLWYgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeSBcCisgICAgLWUgb3V0L3RhcmdldC9jb21tb24vb2JqLyQoTE9DQUxfTU9EVUxFX0NMQVNTKS8kKExPQ0FMX01PRFVMRSlfaW50ZXJtZWRpYXRlcy9jbGFzc2VzLmphciBcCisgICAgLWYgJChMT0NBTF9TT09OR19DTEFTU0VTX0pBUikKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5QUk9HVUFSRF9ESUNUSU9OQVJZX01BUFBJTkcgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeS50ZXh0cHJvdG8KIGVuZGlmCiAKIGlmZGVmIExPQ0FMX1NPT05HX1BST0dVQVJEX1VTQUdFX1pJUAotICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9TT09OR19QUk9HVUFSRF9VU0FHRV9aSVApLFwKLSAgICAkKGNhbGwgbG9jYWwtcGFja2FnaW5nLWRpcixwcm9ndWFyZF91c2FnZSkvcHJvZ3VhcmRfdXNhZ2UuemlwKSkKLSAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoY29tbW9uX2phdmFsaWIuamFyKSxcCi0gICAgJChjYWxsIGxvY2FsLXBhY2thZ2luZy1kaXIscHJvZ3VhcmRfdXNhZ2UpL3Byb2d1YXJkX3VzYWdlLnppcCkKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5QUk9HVUFSRF9VU0FHRV9aSVAgOj0gJChMT0NBTF9TT09OR19QUk9HVUFSRF9VU0FHRV9aSVApCiBlbmRpZgogCiAKQEAgLTk5LDE2ICs5MiwxMiBAQAogCiAgICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKExPQ0FMX0JVSUxUX01PRFVMRSksJChteV9yZXNfcGFja2FnZSkpCiAKLSAgbXlfcHJvZ3VhcmRfZmxhZ3MgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZXhwb3J0X3Byb2d1YXJkX2ZsYWdzCi0gICQobXlfcHJvZ3VhcmRfZmxhZ3MpOiAkKExPQ0FMX1NPT05HX0VYUE9SVF9QUk9HVUFSRF9GTEFHUykKLQlAZWNobyAiRXhwb3J0IHByb2d1YXJkIGZsYWdzOiAkQCIKLQlybSAtZiAkQAotCXRvdWNoICRACi0JZm9yIGYgaW4gJCs7IGRvIFwKLQkJZWNobyAtZSAiXG4jIGluY2x1ZGluZyAkJGYiID4+JEA7IFwKLQkJY2F0ICQkZiA+PiRAOyBcCi0JZG9uZQorICBteV90cmFuc2l0aXZlX3Jlc19wYWNrYWdlcyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS90cmFuc2l0aXZlLXJlcy1wYWNrYWdlcworICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9TT09OR19UUkFOU0lUSVZFX1JFU19QQUNLQUdFUyksJChteV90cmFuc2l0aXZlX3Jlc19wYWNrYWdlcykpKQorICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChteV9yZXNfcGFja2FnZSksJChteV90cmFuc2l0aXZlX3Jlc19wYWNrYWdlcykpCiAKKyAgbXlfcHJvZ3VhcmRfZmxhZ3MgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZXhwb3J0X3Byb2d1YXJkX2ZsYWdzCisgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX0VYUE9SVF9QUk9HVUFSRF9GTEFHUyksJChteV9wcm9ndWFyZF9mbGFncykpKQogICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChMT0NBTF9CVUlMVF9NT0RVTEUpLCQobXlfcHJvZ3VhcmRfZmxhZ3MpKQogCiAgIG15X3N0YXRpY19saWJyYXJ5X2V4dHJhX3BhY2thZ2VzIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2V4dHJhX3BhY2thZ2VzCmRpZmYgLS1naXQgYS9jb3JlL3N0YXRpY19qYXZhX2xpYnJhcnkubWsgYi9jb3JlL3N0YXRpY19qYXZhX2xpYnJhcnkubWsKaW5kZXggNDA1Mzk4NS4uZGQxZDhiNSAxMDA2NDQKLS0tIGEvY29yZS9zdGF0aWNfamF2YV9saWJyYXJ5Lm1rCisrKyBiL2NvcmUvc3RhdGljX2phdmFfbGlicmFyeS5tawpAQCAtMTI3LDYgKzEyNywxMiBAQAogZW5kaWYKIGVuZGlmCiAKKyMgdHJhbnNpdGl2ZS1yZXMtcGFja2FnZXMgaXMgb25seSBwb3B1bGF0ZWQgZm9yIFNvb25nIG1vZHVsZXMgZm9yIG5vdywgYnV0IG5lZWRzCisjIHRvIGV4aXN0IHNvIHRoYXQgb3RoZXIgTWFrZSBtb2R1bGVzIGNhbiBkZXBlbmQgb24gaXQuICBDcmVhdGUgYW4gZW1wdHkgZmlsZS4KK215X3RyYW5zaXRpdmVfcmVzX3BhY2thZ2VzIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3RyYW5zaXRpdmUtcmVzLXBhY2thZ2VzCiskKG15X3RyYW5zaXRpdmVfcmVzX3BhY2thZ2VzKToKKwl0b3VjaCAkQAorCiBpbXBvcnRfcHJvZ3VhcmRfZmxhZ19maWxlcyA6PSAkKHN0cmlwICQoZm9yZWFjaCBsLCQoTE9DQUxfU1RBVElDX0FORFJPSURfTElCUkFSSUVTKSAkKExPQ0FMX1NUQVRJQ19KQVZBX0FBUl9MSUJSQVJJRVMpLFwKICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLCQobCksLENPTU1PTikvZXhwb3J0X3Byb2d1YXJkX2ZsYWdzKSkKICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2V4cG9ydF9wcm9ndWFyZF9mbGFnczogJChpbXBvcnRfcHJvZ3VhcmRfZmxhZ19maWxlcykgJChhZGRwcmVmaXggJChMT0NBTF9QQVRIKS8sJChMT0NBTF9FWFBPUlRfUFJPR1VBUkRfRkxBR19GSUxFUykpCkBAIC0yMjMsMyArMjI5LDUgQEAKIGFhcl9jbGFzc2VzX2phciA6PQogYWxsX3Jlc19hc3NldHMgOj0KIExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkgOj0KKworJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PVNUQVRJQ19KQVZBX0xJQlJBUlkpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvc3RhdGljX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL3N0YXRpY19saWJyYXJ5X2ludGVybmFsLm1rCmluZGV4IDAzOTI0NjAuLjg0NDM2MGUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3RhdGljX2xpYnJhcnlfaW50ZXJuYWwubWsKKysrIGIvY29yZS9zdGF0aWNfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtNDEsMyArNDEsNSBAQAogJChpbnRlcm1lZGlhdGVzKS8kKEdDTk9fQVJDSElWRSkgOiAkKExPQ0FMX0dDTk9fRklMRVMpICQoYnVpbHRfd2hvbGVfZ2Nub19saWJyYXJpZXMpCiAJJChwYWNrYWdlLWNvdmVyYWdlLWZpbGVzKQogZW5kaWYKKworJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PVNUQVRJQ19MSUJSQVJZKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3N5c3Byb3AubWsgYi9jb3JlL3N5c3Byb3AubWsKaW5kZXggYmQ2ZjNkOS4uNDdkOGE0MSAxMDA2NDQKLS0tIGEvY29yZS9zeXNwcm9wLm1rCisrKyBiL2NvcmUvc3lzcHJvcC5tawpAQCAtMjMsNyArMjMsNiBAQAogICBwcm9wZXJ0eV9vdmVycmlkZXNfc3BsaXRfZW5hYmxlZCA6PSB0cnVlCiBlbmRpZgogCi1CVUlMRElORk9fU0ggOj0gYnVpbGQvbWFrZS90b29scy9idWlsZGluZm8uc2gKIFBPU1RfUFJPQ0VTU19QUk9QUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9wb3N0X3Byb2Nlc3NfcHJvcHMkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiAKICMgRW1pdHMgYSBzZXQgb2Ygc3lzcHJvcHMgY29tbW9uIHRvIGFsbCBwYXJ0aXRpb25zIHRvIGEgZmlsZS4KQEAgLTQ2LDEwICs0NSwyMSBAQAogICAgICAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubWFudWZhY3R1cmVyPSQoUFJPRFVDVF9NQU5VRkFDVFVSRVIpIiA+PiAkKDIpO1wKICAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLm1vZGVsPSQoUFJPRFVDVF9NT0RFTCkiID4+ICQoMik7XAogICAgICAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubmFtZT0kKFRBUkdFVF9QUk9EVUNUKSIgPj4gJCgyKTtcCi0gICAgICAgICMgQXR0ZXN0YXRpb24gc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQU9TUC9HU0kgYnVpbGQgcnVubmluZyBvbiBkZXZpY2UuCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QubW9kZWxfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9NT0RFTF9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC5icmFuZF9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX0JSQU5EX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAotICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm5hbWVfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9OQU1FX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAorICAgICAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9NT0RFTF9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCisgICAgICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm1vZGVsX2Zvcl9hdHRlc3RhdGlvbj0kKFBST0RVQ1RfTU9ERUxfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCisgICAgICAgIGZpOyBcCisgICAgICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX0JSQU5EX0ZPUl9BVFRFU1RBVElPTikpIiBdOyB0aGVuIFwKKyAgICAgICAgICAgIGVjaG8gInJvLnByb2R1Y3QuYnJhbmRfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9CUkFORF9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKKyAgICAgICAgZmk7IFwKKyAgICAgICAgaWYgWyAtbiAiJChzdHJpcCAkKFBST0RVQ1RfTkFNRV9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCisgICAgICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm5hbWVfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9OQU1FX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAorICAgICAgICBmaTsgXAorICAgICAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAorICAgICAgICAgICAgZWNobyAicm8ucHJvZHVjdC5kZXZpY2VfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCisgICAgICAgIGZpOyBcCisgICAgICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX01BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCisgICAgICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcl9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX01BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKKyAgICAgICAgZmk7IFwKICAgICApXAogICAgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFpZR09URV9GT1JDRV82NCkpLFwKICAgICAgICAgJChpZiAkKGZpbHRlciB2ZW5kb3IsJCgxKSksXApAQCAtNjYsOSArNzYsMTIgQEAKICAgICApXAogICAgIGVjaG8gInJvLiQoMSkuYnVpbGQuZGF0ZT1gJChEQVRFX0ZST01fRklMRSlgIiA+PiAkKDIpO1wKICAgICBlY2hvICJyby4kKDEpLmJ1aWxkLmRhdGUudXRjPWAkKERBVEVfRlJPTV9GSUxFKSArJXNgIiA+PiAkKDIpO1wKLSAgICBlY2hvICJyby4kKDEpLmJ1aWxkLmZpbmdlcnByaW50PSQoQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFKSIgPj4gJCgyKTtcCi0gICAgZWNobyAicm8uJCgxKS5idWlsZC5pZD0kKEJVSUxEX0lEKSIgPj4gJCgyKTtcCi0gICAgZWNobyAicm8uJCgxKS5idWlsZC50YWdzPSQoQlVJTERfVkVSU0lPTl9UQUdTKSIgPj4gJCgyKTtcCisgICAgIyBBbGxvdyBvcHRpb25hbCBhc3NpZ25tZW50cyBmb3IgQVJDIGZvcndhcmQtZGVjbGFyYXRpb25zIChiLzI0OTE2ODY1NykKKyAgICAjIFRPRE86IFJlbW92ZSBhbnkgdGFnLXJlbGF0ZWQgaW5jb25zaXN0ZW5jaWVzIG9uY2UgdGhlIGdvYWxzIGZyb20KKyAgICAjIGdvL2FyYy1hbmRyb2lkLXNpZ3Byb3AtY2hhbmdlcyBoYXZlIGJlZW4gYWNoaWV2ZWQuCisgICAgZWNobyAicm8uJCgxKS5idWlsZC5maW5nZXJwcmludD89JChCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUpIiA+PiAkKDIpO1wKKyAgICBlY2hvICJyby4kKDEpLmJ1aWxkLmlkPz0kKEJVSUxEX0lEKSIgPj4gJCgyKTtcCisgICAgZWNobyAicm8uJCgxKS5idWlsZC50YWdzPz0kKEJVSUxEX1ZFUlNJT05fVEFHUykiID4+ICQoMik7XAogICAgIGVjaG8gInJvLiQoMSkuYnVpbGQudHlwZT0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSIgPj4gJCgyKTtcCiAgICAgZWNobyAicm8uJCgxKS5idWlsZC52ZXJzaW9uLmluY3JlbWVudGFsPSQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkiID4+ICQoMik7XAogICAgIGVjaG8gInJvLiQoMSkuYnVpbGQudmVyc2lvbi5yZWxlYXNlPSQoUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSkiID4+ICQoMik7XApAQCAtMTEwLDcgKzEyMyw3IEBACiAgICAgJChldmFsIF9vcHRpb24gOj0gLS1hbGxvdy1kdXApXAogKQogCi0kKDIpOiAkKFBPU1RfUFJPQ0VTU19QUk9QUykgJChJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSkgJCgzKSAkKDYpCiskKDIpOiAkKFBPU1RfUFJPQ0VTU19QUk9QUykgJChJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSkgJCgzKSAkKDYpICQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRV9GT1JfVUZGRF9HQykKIAkkKGhpZGUpIGVjaG8gQnVpbGRpbmcgJCRACiAJJChoaWRlKSBta2RpciAtcCAkJChkaXIgJCRAKQogCSQoaGlkZSkgcm0gLWYgJCRAICYmIHRvdWNoICQkQApAQCAtMTM0LDcgKzE0NywxMCBAQAogCSAgICAgICAgZWNobyAiJCQobGluZSkiID4+ICQkQDtcCiAJICAgIClcCiAJKQotCSQoaGlkZSkgJChQT1NUX1BST0NFU1NfUFJPUFMpICQkKF9vcHRpb24pIC0tc2RrLXZlcnNpb24gJChQTEFURk9STV9TREtfVkVSU0lPTikgJCRAICQoNSkKKwkkKGhpZGUpICQoUE9TVF9QUk9DRVNTX1BST1BTKSAkJChfb3B0aW9uKSBcCisJICAtLXNkay12ZXJzaW9uICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pIFwKKwkgIC0ta2VybmVsLXZlcnNpb24tZmlsZS1mb3ItdWZmZC1nYyAiJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFX0ZPUl9VRkZEX0dDKSIgXAorCSAgJCRAICQoNSkKIAkkKGhpZGUpICQoZm9yZWFjaCBmaWxlLCQoc3RyaXAgJCg2KSksXAogCSAgICBpZiBbIC1mICIkKGZpbGUpIiBdOyB0aGVuXAogCSAgICAgICAgY2F0ICQoZmlsZSkgPj4gJCRAO1wKQEAgLTE3MSwxNSArMTg3LDggQEAKICMgQlVJTERfRklOR0VSUFJJTlQgaXMgdXNlZCB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb21iaW5lZCBidWlsZCBhbmQKICMgcHJvZHVjdDsgdXNlZCBieSB0aGUgT1RBIHNlcnZlci4KIGlmZXEgKCwkKHN0cmlwICQoQlVJTERfRklOR0VSUFJJTlQpKSkKLSAgaWZlcSAoJChzdHJpcCAkKEhBU19CVUlMRF9OVU1CRVIpKSxmYWxzZSkKLSAgICBCRl9CVUlMRF9OVU1CRVIgOj0gJChCVUlMRF9VU0VSTkFNRSkkJCgkKERBVEVfRlJPTV9GSUxFKSArJW0lZCVIJU0pCi0gIGVsc2UKLSAgICBCRl9CVUlMRF9OVU1CRVIgOj0gJChmaWxlIDwkKEJVSUxEX05VTUJFUl9GSUxFKSkKLSAgZW5kaWYKLSAgQlVJTERfRklOR0VSUFJJTlQgOj0gJChQUk9EVUNUX0JSQU5EKS8kKFRBUkdFVF9QUk9EVUNUKS8kKFRBUkdFVF9ERVZJQ0UpOiQoUExBVEZPUk1fVkVSU0lPTikvJChCVUlMRF9JRCkvJChCRl9CVUlMRF9OVU1CRVIpOiQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLyQoQlVJTERfVkVSU0lPTl9UQUdTKQorICBCVUlMRF9GSU5HRVJQUklOVCA6PSAkKFBST0RVQ1RfQlJBTkQpLyQoVEFSR0VUX1BST0RVQ1QpLyQoVEFSR0VUX0RFVklDRSk6JChQTEFURk9STV9WRVJTSU9OKS8kKEJVSUxEX0lEKS8kKEJVSUxEX05VTUJFUl9GUk9NX0ZJTEUpOiQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLyQoQlVJTERfVkVSU0lPTl9UQUdTKQogZW5kaWYKLSMgdW5zZXQgaXQgZm9yIHNhZmV0eS4KLUJGX0JVSUxEX05VTUJFUiA6PQogCiBCVUlMRF9GSU5HRVJQUklOVF9GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX2ZpbmdlcnByaW50LnR4dAogaWZuZXEgKCwkKHNoZWxsIG1rZGlyIC1wICQoUFJPRFVDVF9PVVQpICYmIGVjaG8gJChCVUlMRF9GSU5HRVJQUklOVCkgPiQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKSkpCkBAIC0xOTYsNDcgKzIwNSwxNiBAQAogZW5kaWYKIAogQlVJTERfVEhVTUJQUklOVF9GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX3RodW1icHJpbnQudHh0CitpZmVxICgkKHN0cmlwICQoSEFTX0JVSUxEX05VTUJFUikpLHRydWUpCiskKEJVSUxEX1RIVU1CUFJJTlRfRklMRSk6ICQoQlVJTERfTlVNQkVSX0ZJTEUpCitlbmRpZgogaWZuZXEgKCwkKHNoZWxsIG1rZGlyIC1wICQoUFJPRFVDVF9PVVQpICYmIGVjaG8gJChCVUlMRF9USFVNQlBSSU5UKSA+JChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpICYmIGdyZXAgIiAiICQoQlVJTERfVEhVTUJQUklOVF9GSUxFKSkpCiAgICQoZXJyb3IgQlVJTERfVEhVTUJQUklOVCBjYW5ub3QgY29udGFpbiBzcGFjZXM6ICIkKGZpbGUgPCQoQlVJTERfVEhVTUJQUklOVF9GSUxFKSkiKQogZW5kaWYKLUJVSUxEX1RIVU1CUFJJTlRfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKEJVSUxEX1RIVU1CUFJJTlRfRklMRSkpCiAjIHVuc2V0IGl0IGZvciBzYWZldHkuCitCVUlMRF9USFVNQlBSSU5UX0ZJTEUgOj0KIEJVSUxEX1RIVU1CUFJJTlQgOj0KIAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgaHVtYW4gcmVhZGFibGUgc3RyaW5ncyB0aGF0IGRlc2NyaWJlIHRoaXMgYnVpbGQKLSMKLQotIyBCVUlMRF9JRDogZGV0YWlsIGluZm87IGhhcyB0aGUgc2FtZSBpbmZvIGFzIHRoZSBidWlsZCBmaW5nZXJwcmludAotQlVJTERfREVTQyA6PSAkKFRBUkdFVF9QUk9EVUNUKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSAkKFBMQVRGT1JNX1ZFUlNJT04pICQoQlVJTERfSUQpICQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkgJChCVUlMRF9WRVJTSU9OX1RBR1MpCi0KLSMgQlVJTERfRElTUExBWV9JRCBpcyBzaG93biB1bmRlciBTZXR0aW5ncyAtPiBBYm91dCBQaG9uZQotaWZlcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksdXNlcikKLSAgIyBVc2VyIGJ1aWxkcyBzaG91bGQgc2hvdzoKLSAgIyByZWxlYXNlIGJ1aWxkIG51bWJlciBvciBicmFuY2guYnVsZF9udW1iZXIgbm9uLXJlbGVhc2UgYnVpbGRzCi0KLSAgIyBEZXYuIGJyYW5jaGVzIHNob3VsZCBoYXZlIERJU1BMQVlfQlVJTERfTlVNQkVSIHNldAotICBpZmVxICh0cnVlLCQoRElTUExBWV9CVUlMRF9OVU1CRVIpKQotICAgIEJVSUxEX0RJU1BMQVlfSUQgOj0gJChCVUlMRF9JRCkuJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKSAkKEJVSUxEX0tFWVMpCi0gIGVsc2UKLSAgICBCVUlMRF9ESVNQTEFZX0lEIDo9ICQoQlVJTERfSUQpICQoQlVJTERfS0VZUykKLSAgZW5kaWYKLWVsc2UKLSAgIyBOb24tdXNlciBidWlsZHMgc2hvdWxkIHNob3cgZGV0YWlsZWQgYnVpbGQgaW5mb3JtYXRpb24KLSAgQlVJTERfRElTUExBWV9JRCA6PSAkKEJVSUxEX0RFU0MpCi1lbmRpZgotCi0jIFRBUkdFVF9CVUlMRF9GTEFWT1IgYW5kIHJvLmJ1aWxkLmZsYXZvciBhcmUgdXNlZCBvbmx5IGJ5IHRoZSB0ZXN0Ci0jIGhhcm5lc3MgdG8gZGlzdGluZ3Vpc2ggYnVpbGRzLiBPbmx5IGFkZCBfYXNhbiBmb3IgYSBzYW5pdGl6ZWQgYnVpbGQKLSMgaWYgaXQgaXNuJ3QgYWxyZWFkeSBhIHBhcnQgb2YgdGhlIGZsYXZvciAodmlhIGEgZGVkaWNhdGVkIGx1bmNoCi0jIGNvbmZpZyBmb3IgZXhhbXBsZSkuCi1UQVJHRVRfQlVJTERfRkxBVk9SIDo9ICQoVEFSR0VUX1BST0RVQ1QpLSQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpCi1pZm5lcSAoLCAkKGZpbHRlciBhZGRyZXNzLCAkKFNBTklUSVpFX1RBUkdFVCkpKQotaWZlcSAoLCQoZmluZHN0cmluZyBfYXNhbiwkKFRBUkdFVF9CVUlMRF9GTEFWT1IpKSkKLVRBUkdFVF9CVUlMRF9GTEFWT1IgOj0gJChUQVJHRVRfQlVJTERfRkxBVk9SKV9hc2FuCi1lbmRpZgotZW5kaWYKLQogS05PV05fT0VNX1RIVU1CUFJJTlRfUFJPUEVSVElFUyA6PSBcCiAgICAgcm8ucHJvZHVjdC5icmFuZCBcCiAgICAgcm8ucHJvZHVjdC5uYW1lIFwKQEAgLTI1MSw1MCArMjI5LDcgQEAKICMgTm90ZTogcGFydHMgb2YgdGhpcyBmaWxlIHRoYXQgY2FuJ3QgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBidWlsZC1wcm9wZXJ0aWVzCiAjIG1hY3JvIGFyZSBtYW51YWxseSBjcmVhdGVkIGFzIHNlcGFyYXRlIGZpbGVzIGFuZCB0aGVuIGZlZCBpbnRvIHRoZSBtYWNybwogCi0jIEFjY2VwdHMgYSB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIHByb2R1Y3QgbG9jYWxlcyBzdWNoIGFzCi0jIChlbl9VUyBlbl9BVSBlbl9HQi4uLikgYW5kIHJldHVybnMgdGhlIGZpcnN0IGxvY2FsZSBpbiB0aGUgbGlzdCB3aXRoCi0jIHVuZGVyc2NvcmVzIHJlcGxhY2VkIHdpdGggaHlwaGVucy4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoaXMgd2lsbAotIyByZXR1cm4gImVuLVVTIi4KLWRlZmluZSBnZXQtZGVmYXVsdC1wcm9kdWN0LWxvY2FsZQotJChzdHJpcCAkKHN1YnN0IF8sLSwgJChmaXJzdHdvcmQgJCgxKSkpKQotZW5kZWYKLQotZ2VuX2Zyb21fYnVpbGRpbmZvX3NoIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHN5c3RlbV9idWlsZF9wcm9wKS9idWlsZGluZm8ucHJvcAotJChnZW5fZnJvbV9idWlsZGluZm9fc2gpOiAkKElOVEVSTkFMX0JVSUxEX0lEX01BS0VGSUxFKSAkKEFQSV9GSU5HRVJQUklOVCkgfCAkKEJVSUxEX0RBVEVUSU1FX0ZJTEUpICQoQlVJTERfTlVNQkVSX0ZJTEUpCi0JJChoaWRlKSBUQVJHRVRfQlVJTERfVFlQRT0iJChUQVJHRVRfQlVJTERfVkFSSUFOVCkiIFwKLQkgICAgICAgIFRBUkdFVF9CVUlMRF9GTEFWT1I9IiQoVEFSR0VUX0JVSUxEX0ZMQVZPUikiIFwKLQkgICAgICAgIFRBUkdFVF9ERVZJQ0U9IiQoVEFSR0VUX0RFVklDRSkiIFwKLQkgICAgICAgIFBST0RVQ1RfREVGQVVMVF9MT0NBTEU9IiQoY2FsbCBnZXQtZGVmYXVsdC1wcm9kdWN0LWxvY2FsZSwkKFBST0RVQ1RfTE9DQUxFUykpIiBcCi0JICAgICAgICBQUk9EVUNUX0RFRkFVTFRfV0lGSV9DSEFOTkVMUz0iJChQUk9EVUNUX0RFRkFVTFRfV0lGSV9DSEFOTkVMUykiIFwKLQkgICAgICAgIFBSSVZBVEVfQlVJTERfREVTQz0iJChCVUlMRF9ERVNDKSIgXAotCSAgICAgICAgQlVJTERfSUQ9IiQoQlVJTERfSUQpIiBcCi0JICAgICAgICBCVUlMRF9ESVNQTEFZX0lEPSIkKEJVSUxEX0RJU1BMQVlfSUQpIiBcCi0JICAgICAgICBEQVRFPSIkKERBVEVfRlJPTV9GSUxFKSIgXAotCSAgICAgICAgQlVJTERfVVNFUk5BTUU9IiQoQlVJTERfVVNFUk5BTUUpIiBcCi0JICAgICAgICBCVUlMRF9IT1NUTkFNRT0iJChCVUlMRF9IT1NUTkFNRSkiIFwKLQkgICAgICAgIEJVSUxEX05VTUJFUj0iJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKSIgXAotCSAgICAgICAgQk9BUkRfVVNFX1ZCTUVUQV9ESUdURVNUX0lOX0ZJTkdFUlBSSU5UPSIkKEJPQVJEX1VTRV9WQk1FVEFfRElHVEVTVF9JTl9GSU5HRVJQUklOVCkiIFwKLQkgICAgICAgIFBMQVRGT1JNX1ZFUlNJT049IiQoUExBVEZPUk1fVkVSU0lPTikiIFwKLQkgICAgICAgIFBMQVRGT1JNX0RJU1BMQVlfVkVSU0lPTj0iJChQTEFURk9STV9ESVNQTEFZX1ZFUlNJT04pIiBcCi0JICAgICAgICBQTEFURk9STV9WRVJTSU9OX0xBU1RfU1RBQkxFPSIkKFBMQVRGT1JNX1ZFUlNJT05fTEFTVF9TVEFCTEUpIiBcCi0JICAgICAgICBQTEFURk9STV9TRUNVUklUWV9QQVRDSD0iJChQTEFURk9STV9TRUNVUklUWV9QQVRDSCkiIFwKLQkgICAgICAgIFBMQVRGT1JNX0JBU0VfT1M9IiQoUExBVEZPUk1fQkFTRV9PUykiIFwKLQkgICAgICAgIFBMQVRGT1JNX1NES19WRVJTSU9OPSIkKFBMQVRGT1JNX1NES19WRVJTSU9OKSIgXAotCSAgICAgICAgUExBVEZPUk1fUFJFVklFV19TREtfVkVSU0lPTj0iJChQTEFURk9STV9QUkVWSUVXX1NES19WRVJTSU9OKSIgXAotCSAgICAgICAgUExBVEZPUk1fUFJFVklFV19TREtfRklOR0VSUFJJTlQ9IiQkKGNhdCAkKEFQSV9GSU5HRVJQUklOVCkpIiBcCi0JICAgICAgICBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FPSIkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpIiBcCi0JICAgICAgICBQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVM9IiQoUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTKSIgXAotCSAgICAgICAgUExBVEZPUk1fVkVSU0lPTl9LTk9XTl9DT0RFTkFNRVM9IiQoUExBVEZPUk1fVkVSU0lPTl9LTk9XTl9DT0RFTkFNRVMpIiBcCi0JICAgICAgICBQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTj0iJChQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTikiIFwKLQkgICAgICAgIEJVSUxEX1ZFUlNJT05fVEFHUz0iJChCVUlMRF9WRVJTSU9OX1RBR1MpIiBcCi0JICAgICAgICAkKGlmICQoT0VNX1RIVU1CUFJJTlRfUFJPUEVSVElFUyksQlVJTERfVEhVTUJQUklOVD0iJChCVUlMRF9USFVNQlBSSU5UX0ZST01fRklMRSkiKSBcCi0JICAgICAgICBUQVJHRVRfQ1BVX0FCSV9MSVNUPSIkKFRBUkdFVF9DUFVfQUJJX0xJU1QpIiBcCi0JICAgICAgICBUQVJHRVRfQ1BVX0FCSV9MSVNUXzMyX0JJVD0iJChUQVJHRVRfQ1BVX0FCSV9MSVNUXzMyX0JJVCkiIFwKLQkgICAgICAgIFRBUkdFVF9DUFVfQUJJX0xJU1RfNjRfQklUPSIkKFRBUkdFVF9DUFVfQUJJX0xJU1RfNjRfQklUKSIgXAotCSAgICAgICAgVEFSR0VUX0NQVV9BQkk9IiQoVEFSR0VUX0NQVV9BQkkpIiBcCi0JICAgICAgICBUQVJHRVRfQ1BVX0FCSTI9IiQoVEFSR0VUX0NQVV9BQkkyKSIgXAotCSAgICAgICAgWllHT1RFX0ZPUkNFXzY0X0JJVD0iJChaWUdPVEVfRk9SQ0VfNjRfQklUKSIgXAotCSAgICAgICAgYmFzaCAkKEJVSUxESU5GT19TSCkgPiAkQAorYnVpbGRpbmZvX3Byb3AgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMsYnVpbGRpbmZvLnByb3ApL2J1aWxkaW5mby5wcm9wCiAKIGlmZGVmIFRBUkdFVF9TWVNURU1fUFJPUAogc3lzdGVtX3Byb3BfZmlsZSA6PSAkKFRBUkdFVF9TWVNURU1fUFJPUCkKQEAgLTMwMyw3ICsyMzgsNyBAQAogZW5kaWYKIAogX3Byb3BfZmlsZXNfIDo9IFwKLSAgJChnZW5fZnJvbV9idWlsZGluZm9fc2gpIFwKKyAgJChidWlsZGluZm9fcHJvcCkgXAogICAkKHN5c3RlbV9wcm9wX2ZpbGUpCiAKICMgT3JkZXIgbWF0dGVycyBoZXJlLiBXaGVuIHRoZXJlIGFyZSBkdXBsaWNhdGVzLCB0aGUgbGFzdCBvbmUgd2lucy4KQEAgLTU1OCw0ICs0OTMsNCBAQAogIyAkMSBpbnN0YWxsZWQgZmlsZSBwYXRoLCBlLmcuIG91dC90YXJnZXQvcHJvZHVjdC92c29jX3g4Nl82NC9zeXN0ZW0vYnVpbGQucHJvcAogZGVmaW5lIGlzLWJ1aWxkLXByb3AKICQoaWYgJChmaW5kc3RyaW5nICQxLCQoQUxMX0lOU1RBTExFRF9CVUlMRF9QUk9QX0ZJTEVTKSksWSkKLWVuZGVmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kZWYKZGlmZiAtLWdpdCBhL2NvcmUvc3lzcHJvcF9jb25maWcubWsgYi9jb3JlL3N5c3Byb3BfY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjlkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3N5c3Byb3BfY29uZmlnLm1rCkBAIC0wLDAgKzEsMzAxIEBACisjIEFERElUSU9OQUxfPHBhcnRpdGlvbj5fUFJPUEVSVElFUyBhcmUgcHJvcGVydGllcyB0aGF0IGFyZSBkZXRlcm1pbmVkIGJ5IHRoZQorIyBidWlsZCBzeXN0ZW0gaXRzZWxmLiBEb24ndCBsZXQgaXQgYmUgZGVmaW5lZCBmcm9tIG91dHNpZGUgb2YgdGhlIGNvcmUgYnVpbGQKKyMgc3lzdGVtIGxpa2UgQW5kcm9pZC5tayBvciA8cHJvZHVjdD4ubWsgZmlsZXMuCitfYWRkaXRpb25hbF9wcm9wX3Zhcl9uYW1lcyA6PSBcCisgICAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyBcCisgICAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyBcCisgICAgQURESVRJT05BTF9PRE1fUFJPUEVSVElFUyBcCisgICAgQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMKKworJChmb3JlYWNoIG5hbWUsICQoX2FkZGl0aW9uYWxfcHJvcF92YXJfbmFtZXMpLFwKKyAgJChpZiAkKCQobmFtZSkpLFwKKyAgICAkKGVycm9yICQobmFtZSkgbXVzdCBub3Qgc2V0IGJlZm9yZSBoZXJlLiAkKCQobmFtZSkpKVwKKyAgLClcCisgICQoZXZhbCAkKG5hbWUpIDo9KVwKKykKK19hZGRpdGlvbmFsX3Byb3BfdmFyX25hbWVzIDo9CisKKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQWRkIHRoZSBwcm9kdWN0LWRlZmluZWQgcHJvcGVydGllcyB0byB0aGUgYnVpbGQgcHJvcGVydGllcy4KK2lmbmVxICgkKEJPQVJEX1BST1BFUlRZX09WRVJSSURFU19TUExJVF9FTkFCTEVEKSwgdHJ1ZSkKKyAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSAkKFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTKQorZWxzZQorICBpZm5kZWYgQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRQorICAgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gJChQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUykKKyAgZW5kaWYKK2VuZGlmCisKK0FERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8udHJlYmxlLmVuYWJsZWQ9JHtQUk9EVUNUX0ZVTExfVFJFQkxFfQorCisjIFNldCByby5sbG5kay5hcGlfbGV2ZWwgdG8gc2hvdyB0aGUgbWF4aW11bSB2ZW5kb3IgQVBJIGxldmVsIHRoYXQgdGhlIExMTkRLIGluCisjIHRoZSBzeXN0ZW0gcGFydGl0aW9uIHN1cHBvcnRzLgoraWZkZWYgUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwKK0FERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8ubGxuZGsuYXBpX2xldmVsPSQoUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwpCitlbmRpZgorCisjIFNldHMgcm8uYWN0aW9uYWJsZV9jb21wYXRpYmxlX3Byb3BlcnR5LmVuYWJsZWQgdG8ga25vdyBvbiBydW50aW1lIHdoZXRoZXIgdGhlCisjIGFsbG93ZWQgbGlzdCBvZiBhY3Rpb25hYmxlIGNvbXBhdGlibGUgcHJvcGVydGllcyBpcyBlbmFibGVkIG9yIG5vdC4KK0FERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uYWN0aW9uYWJsZV9jb21wYXRpYmxlX3Byb3BlcnR5LmVuYWJsZWQ9dHJ1ZQorCisjIEFkZCB0aGUgc3lzdGVtIHNlcnZlciBjb21waWxlciBmaWx0ZXIgaWYgdGhleSBhcmUgc3BlY2lmaWVkIGZvciB0aGUgcHJvZHVjdC4KK2lmbmVxICgsJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSKSkKK0FERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IGRhbHZpay52bS5zeXN0ZW1zZXJ2ZXJjb21waWxlcmZpbHRlcj0kKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9DT01QSUxFUl9GSUxURVIpCitlbmRpZgorCisjIEFkZCB0aGUgMTZLIGRldmVsb3BlciBvcHRpb24gaWYgaXQgaXMgZGVmaW5lZCBmb3IgdGhlIHByb2R1Y3QuCitpZmVxICgkKFBST0RVQ1RfMTZLX0RFVkVMT1BFUl9PUFRJT04pLHRydWUpCitBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5wcm9kdWN0LmJ1aWxkLjE2a19wYWdlLmVuYWJsZWQ9dHJ1ZQorZWxzZQorQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gcm8ucHJvZHVjdC5idWlsZC4xNmtfcGFnZS5lbmFibGVkPWZhbHNlCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9CT09UU18xNkspLHRydWUpCitBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5wcm9kdWN0LnBhZ2Vfc2l6ZT0xNjM4NAorZWxzZQorQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gcm8ucHJvZHVjdC5wYWdlX3NpemU9NDA5NgorZW5kaWYKKworIyBFbmFibGUgY29yZSBwbGF0Zm9ybSBBUEkgdmlvbGF0aW9uIHdhcm5pbmdzIG9uIHVzZXJkZWJ1ZyBhbmQgZW5nIGJ1aWxkcy4KK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQorQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBwZXJzaXN0LmRlYnVnLmRhbHZpay52bS5jb3JlX3BsYXRmb3JtX2FwaV9wb2xpY3k9anVzdC13YXJuCitlbmRpZgorCisjIERlZmluZSByby5zYW5pdGl6ZS48bmFtZT4gcHJvcGVydGllcyBmb3IgYWxsIGdsb2JhbCBzYW5pdGl6ZXJzLgorQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSAkKGZvcmVhY2ggcywkKFNBTklUSVpFX1RBUkdFVCkscm8uc2FuaXRpemUuJChzKT10cnVlKQorCisjIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygcm8ucG9zdGluc3RhbGwuZnN0YWIucHJlZml4IHRvIC9zeXN0ZW0uCisjIERldmljZSBib2FyZCBjb25maWcgc2hvdWxkIG92ZXJyaWRlIHRoZSB2YWx1ZSB0byAvcHJvZHVjdCB3aGVuIG5lZWRlZCBieToKKyMKKyMgICAgIFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnBvc3RpbnN0YWxsLmZzdGFiLnByZWZpeD0vcHJvZHVjdAorIworIyBJdCB0aGVuIHVzZXMgJHtyby5wb3N0aW5zdGFsbC5mc3RhYi5wcmVmaXh9L2V0Yy9mc3RhYi5wb3N0aW5zdGFsbCB0bworIyBtb3VudCBzeXN0ZW1fb3RoZXIgcGFydGl0aW9uLgorQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5wb3N0aW5zdGFsbC5mc3RhYi5wcmVmaXg9L3N5c3RlbQorCisjIEFkZCBjcHUgcHJvcGVydGllcyBmb3IgYmlvbmljIGFuZCBBUlQuCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5hcmNoPSQoVEFSR0VUX0FSQ0gpCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5jcHVfdmFyaWFudD0kKFRBUkdFVF9DUFVfVkFSSUFOVF9SVU5USU1FKQorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSByby5iaW9uaWMuMm5kX2FyY2g9JChUQVJHRVRfMk5EX0FSQ0gpCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy4ybmRfY3B1X3ZhcmlhbnQ9JChUQVJHRVRfMk5EX0NQVV9WQVJJQU5UX1JVTlRJTUUpCisKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gcGVyc2lzdC5zeXMuZGFsdmlrLnZtLmxpYi4yPWxpYmFydC5zbworQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaXNhLiQoVEFSR0VUX0FSQ0gpLnZhcmlhbnQ9JChERVgyT0FUX1RBUkdFVF9DUFVfVkFSSUFOVF9SVU5USU1FKQoraWZuZXEgKCQoREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKSwpCisgIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gZGFsdmlrLnZtLmlzYS4kKFRBUkdFVF9BUkNIKS5mZWF0dXJlcz0kKERFWDJPQVRfVEFSR0VUX0lOU1RSVUNUSU9OX1NFVF9GRUFUVVJFUykKK2VuZGlmCisKK2lmZGVmIFRBUkdFVF8yTkRfQVJDSAorICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IGRhbHZpay52bS5pc2EuJChUQVJHRVRfMk5EX0FSQ0gpLnZhcmlhbnQ9JCgkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKURFWDJPQVRfVEFSR0VUX0NQVV9WQVJJQU5UX1JVTlRJTUUpCisgIGlmbmVxICgkKCQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKSwpCisgICAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaXNhLiQoVEFSR0VUXzJORF9BUkNIKS5mZWF0dXJlcz0kKCQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKQorICBlbmRpZgorZW5kaWYKKworIyBBbHRob3VnaCB0aGVzZSB2YXJpYWJsZXMgYXJlIHByZWZpeGVkIHdpdGggVEFSR0VUX1JFQ09WRVJZXywgdGhleSBhcmUgYWxzbyBuZWVkZWQgdW5kZXIgY2hhcmdlcgorIyBtb2RlICh2aWEgbGlibWludWkpLgoraWZkZWYgVEFSR0VUX1JFQ09WRVJZX0RFRkFVTFRfUk9UQVRJT04KK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLm1pbnVpLmRlZmF1bHRfcm90YXRpb249JChUQVJHRVRfUkVDT1ZFUllfREVGQVVMVF9ST1RBVElPTikKK2VuZGlmCitpZmRlZiBUQVJHRVRfUkVDT1ZFUllfT1ZFUlNDQU5fUEVSQ0VOVAorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8ubWludWkub3ZlcnNjYW5fcGVyY2VudD0kKFRBUkdFVF9SRUNPVkVSWV9PVkVSU0NBTl9QRVJDRU5UKQorZW5kaWYKK2lmZGVmIFRBUkdFVF9SRUNPVkVSWV9QSVhFTF9GT1JNQVQKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLm1pbnVpLnBpeGVsX2Zvcm1hdD0kKFRBUkdFVF9SRUNPVkVSWV9QSVhFTF9GT1JNQVQpCitlbmRpZgorCitpZmRlZiBQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTlMKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLmJvb3QuZHluYW1pY19wYXJ0aXRpb25zPSQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TKQorZW5kaWYKKworaWZkZWYgUFJPRFVDVF9SRVRST0ZJVF9EWU5BTUlDX1BBUlRJVElPTlMKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLmJvb3QuZHluYW1pY19wYXJ0aXRpb25zX3JldHJvZml0PSQoUFJPRFVDVF9SRVRST0ZJVF9EWU5BTUlDX1BBUlRJVElPTlMpCitlbmRpZgorCitpZmRlZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTAorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWw9JChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkKK2VuZGlmCisKK2lmZGVmIFBST0RVQ1RfU0hJUFBJTkdfVkVORE9SX0FQSV9MRVZFTAorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8udmVuZG9yLmFwaV9sZXZlbD0kKFBST0RVQ1RfU0hJUFBJTkdfVkVORE9SX0FQSV9MRVZFTCkKK2VuZGlmCisKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQorICBpZmRlZiBQUk9EVUNUX1NFVF9ERUJVR0ZTX1JFU1RSSUNUSU9OUworICAgIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgICAgcm8ucHJvZHVjdC5kZWJ1Z2ZzX3Jlc3RyaWN0aW9ucy5lbmFibGVkPSQoUFJPRFVDVF9TRVRfREVCVUdGU19SRVNUUklDVElPTlMpCisgIGVuZGlmCitlbmRpZgorCisjIFZlbmRvcnMgd2l0aCBHUkYgbXVzdCBkZWZpbmUgQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMIGZvciB0aGUgdmVuZG9yIEFQSSBsZXZlbC4KKyMgVGhpcyBtdXN0IG5vdCBiZSBkZWZpbmVkIGZvciB0aGUgbm9uLUdSRiBkZXZpY2VzLgorIyBUaGUgdmFsdWVzIG9mIHRoZSBHUkYgcHJvcGVydGllcyB3aWxsIGJlIHZlcmlmaWVkIGJ5IHBvc3RfcHJvY2Vzc19wcm9wcy5weQoraWZkZWYgQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKKyAgICByby5ib2FyZC5maXJzdF9hcGlfbGV2ZWw9JChCT0FSRF9TSElQUElOR19BUElfTEVWRUwpCitlbmRpZgorCisjIEJ1aWxkIHN5c3RlbSBzZXQgQk9BUkRfQVBJX0xFVkVMIHRvIHNob3cgdGhlIGFwaSBsZXZlbCBvZiB0aGUgdmVuZG9yIEFQSSBzdXJmYWNlLgorIyBUaGlzIG11c3Qgbm90IGJlIGFsdGVyZWQgb3V0c2lkZSBvZiBidWlsZCBzeXN0ZW0uCitpZmRlZiBCT0FSRF9BUElfTEVWRUwKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLmJvYXJkLmFwaV9sZXZlbD0kKEJPQVJEX0FQSV9MRVZFTCkKK2VuZGlmCisjIFJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMX0ZST1pFTiBpcyB0cnVlIHdoZW4gdGhlIHZlbmRvciBBUEkgc3VyZmFjZSBpcyBmcm96ZW4uCitpZmRlZiBSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4KK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLmJvYXJkLmFwaV9mcm96ZW49JChSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4pCitlbmRpZgorCisjIFNldCBidWlsZCBwcm9wLiBUaGlzIHByb3AgaXMgcmVhZCBieSBvdGFfZnJvbV90YXJnZXRfZmlsZXMgd2hlbiBnZW5lcmF0aW5nIE9UQSwKKyMgdG8gZGVjaWRlIGlmIFZBQkMgc2hvdWxkIGJlIGRpc2FibGVkLgoraWZlcSAoJChCT0FSRF9ET05UX1VTRV9WQUJDX09UQSksdHJ1ZSkKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLnZlbmRvci5idWlsZC5kb250X3VzZV92YWJjPXRydWUKK2VuZGlmCisKKyMgU2V0IHRoZSBmbGFnIGluIHZlbmRvci4gU28gVlRTIHdvdWxkIGtub3cgaWYgdGhlIG5ldyBmaW5nZXJwcmludCBmb3JtYXQgaXMgaW4gdXNlIHdoZW4KKyMgdGhlIHN5c3RlbSBpbWFnZXMgYXJlIHJlcGxhY2VkIGJ5IEdTSS4KK2lmZXEgKCQoQk9BUkRfVVNFX1ZCTUVUQV9ESUdURVNUX0lOX0ZJTkdFUlBSSU5UKSx0cnVlKQorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50X2hhc19kaWdlc3Q9MQorZW5kaWYKKworQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8udmVuZG9yLmJ1aWxkLnNlY3VyaXR5X3BhdGNoPSQoVkVORE9SX1NFQ1VSSVRZX1BBVENIKSBcCisgICAgcm8ucHJvZHVjdC5ib2FyZD0kKFRBUkdFVF9CT09UTE9BREVSX0JPQVJEX05BTUUpIFwKKyAgICByby5ib2FyZC5wbGF0Zm9ybT0kKFRBUkdFVF9CT0FSRF9QTEFURk9STSkgXAorICAgIHJvLmh3dWkudXNlX3Z1bGthbj0kKFRBUkdFVF9VU0VTX1ZVTEtBTikKKworaWZkZWYgVEFSR0VUX1NDUkVFTl9ERU5TSVRZCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKKyAgICByby5zZi5sY2RfZGVuc2l0eT0kKFRBUkdFVF9TQ1JFRU5fREVOU0lUWSkKK2VuZGlmCisKK2lmZGVmIEFCX09UQV9VUERBVEVSCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKKyAgICByby5idWlsZC5hYl91cGRhdGU9JChBQl9PVEFfVVBEQVRFUikKK2VuZGlmCisKK0FERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLmJ1aWxkLmNoYXJhY3RlcmlzdGljcz0kKFRBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUykKKworaWZlcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKK0FERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3QuYWJfb3RhX3BhcnRpdGlvbnM9JChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKHNvcnQgJChBQl9PVEFfUEFSVElUSU9OUykpKQorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52ZW5kb3IuYnVpbGQuYWJfb3RhX3BhcnRpdGlvbnM9JChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKHNvcnQgJChBQl9PVEFfUEFSVElUSU9OUykpKQorZW5kaWYKKworIyBTZXQgdGhpcyBwcm9wZXJ0eSBmb3IgVlRTIHRvIHNraXAgbGFyZ2UgcGFnZSBzaXplIHRlc3RzIG9uIHVuc3VwcG9ydGVkIGRldmljZXMuCitBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSBcCisgICAgcm8ucHJvZHVjdC5jcHUucGFnZXNpemUubWF4PSQoVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEKQorCitpZmVxICgkKFBST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTyksdHJ1ZSkKK0FERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3QuYnVpbGQubm9fYmlvbmljX3BhZ2Vfc2l6ZV9tYWNybz10cnVlCitlbmRpZgorCit1c2VyX3ZhcmlhbnQgOj0gJChmaWx0ZXIgdXNlciB1c2VyZGVidWcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpCitlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZyA6PSB0cnVlCitlbmFibGVfZGFsdmlrX2xvY2tfY29udGVudGlvbl9sb2dnaW5nIDo9IHRydWUKK2lmbmVxICgsJCh1c2VyX3ZhcmlhbnQpKQorICAjIFRhcmdldCBpcyBzZWN1cmUgaW4gdXNlciBidWlsZHMuCisgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uc2VjdXJlPTEKKyAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBzZWN1cml0eS5wZXJmX2hhcmRlbj0xCisKKyAgaWZlcSAoJCh1c2VyX3ZhcmlhbnQpLHVzZXIpCisgICAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5hZGIuc2VjdXJlPTEKKyAgZW5kaWYKKworICBpZm5lcSAoJCh1c2VyX3ZhcmlhbnQpLHVzZXJkZWJ1ZykKKyAgICAjIERpc2FibGUgZGVidWdnaW5nIGluIHBsYWluIHVzZXIgYnVpbGRzLgorICAgIGVuYWJsZV90YXJnZXRfZGVidWdnaW5nIDo9CisgICAgZW5hYmxlX2RhbHZpa19sb2NrX2NvbnRlbnRpb25fbG9nZ2luZyA6PQorICBlbHNlCisgICAgIyBEaXNhYmxlIGRlYnVnZ2luZyBpbiB1c2VyZGVidWcgYnVpbGRzIGlmIFBST0RVQ1RfTk9UX0RFQlVHR0FCTEVfSU5fVVNFUkRFQlVHCisgICAgIyBpcyBzZXQuCisgICAgaWZuZXEgKCwkKHN0cmlwICQoUFJPRFVDVF9OT1RfREVCVUdHQUJMRV9JTl9VU0VSREVCVUcpKSkKKyAgICAgIGVuYWJsZV90YXJnZXRfZGVidWdnaW5nIDo9CisgICAgZW5kaWYKKyAgZW5kaWYKKworICAjIERpc2FsbG93IG1vY2sgbG9jYXRpb25zIGJ5IGRlZmF1bHQgZm9yIHVzZXIgYnVpbGRzCisgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uYWxsb3cubW9jay5sb2NhdGlvbj0wCisKK2Vsc2UgIyAhdXNlcl92YXJpYW50CisgICMgVHVybiBvbiBjaGVja2puaSBmb3Igbm9uLXVzZXIgYnVpbGRzLgorICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmtlcm5lbC5hbmRyb2lkLmNoZWNram5pPTEKKyAgIyBTZXQgZGV2aWNlIGluc2VjdXJlIGZvciBub24tdXNlciBidWlsZHMuCisgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uc2VjdXJlPTAKKyAgIyBBbGxvdyBtb2NrIGxvY2F0aW9ucyBieSBkZWZhdWx0IGZvciBub24gdXNlciBidWlsZHMKKyAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5hbGxvdy5tb2NrLmxvY2F0aW9uPTEKK2VuZGlmICMgIXVzZXJfdmFyaWFudAorCitpZmVxICh0cnVlLCQoc3RyaXAgJChlbmFibGVfZGFsdmlrX2xvY2tfY29udGVudGlvbl9sb2dnaW5nKSkpCisgICMgRW5hYmxlIERhbHZpayBsb2NrIGNvbnRlbnRpb24gbG9nZ2luZy4KKyAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBkYWx2aWsudm0ubG9ja3Byb2YudGhyZXNob2xkPTUwMAorZW5kaWYgIyAhZW5hYmxlX2RhbHZpa19sb2NrX2NvbnRlbnRpb25fbG9nZ2luZworCitpZmVxICh0cnVlLCQoc3RyaXAgJChlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZykpKQorICAjIFRhcmdldCBpcyBtb3JlIGRlYnVnZ2FibGUgYW5kIGFkYmQgaXMgb24gYnkgZGVmYXVsdAorICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmRlYnVnZ2FibGU9MQorZWxzZSAjICFlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZworICAjIFRhcmdldCBpcyBsZXNzIGRlYnVnZ2FibGUgYW5kIGFkYmQgaXMgb2ZmIGJ5IGRlZmF1bHQKKyAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5kZWJ1Z2dhYmxlPTAKK2VuZGlmICMgIWVuYWJsZV90YXJnZXRfZGVidWdnaW5nCisKK2VuYWJsZV90YXJnZXRfZGVidWdnaW5nOj0KK2VuYWJsZV9kYWx2aWtfbG9ja19jb250ZW50aW9uX2xvZ2dpbmc6PQorCitpZm5lcSAoJChmaWx0ZXIgc2RrIHNka19hZGRvbiwkKE1BS0VDTURHT0FMUykpLCkKK19pc19zZGtfYnVpbGQgOj0gdHJ1ZQorZW5kaWYKKworaWZlcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksZW5nKQoraWZuZXEgKCQoZmlsdGVyIHJvLnNldHVwd2l6YXJkLm1vZGU9RU5BQkxFRCwgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMpKSksKQorICAjIERvbid0IHJlcXVpcmUgdGhlIHNldHVwIHdpemFyZCBvbiBlbmcgYnVpbGRzCisgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgOj0gJChmaWx0ZXItb3V0IHJvLnNldHVwd2l6YXJkLm1vZGU9JSxcCisgICAgICAgICAgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMpKSkgXAorICAgICAgICAgIHJvLnNldHVwd2l6YXJkLm1vZGU9T1BUSU9OQUwKK2VuZGlmCitpZm5kZWYgX2lzX3Nka19idWlsZAorICAjIFRvIHNwZWVkdXAgc3RhcnR1cCBvZiBub24tcHJlb3B0ZWQgYnVpbGRzLCBkb24ndCB2ZXJpZnkgb3IgY29tcGlsZSB0aGUgYm9vdCBpbWFnZS4KKyAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaW1hZ2UtZGV4Mm9hdC1maWx0ZXI9ZXh0cmFjdAorZW5kaWYKKyMgYi8zMjM1NjY1MzUKK0FERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gaW5pdC5zdmNfZGVidWcubm9fZmF0YWwuenlnb3RlPXRydWUKK2VuZGlmCisKK2lmZGVmIF9pc19zZGtfYnVpbGQKK0FERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0geG1wcC5hdXRvLXByZXNlbmNlPXRydWUKK0FERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uY29uZmlnLm5vY2hlY2tpbj15ZXMKK2VuZGlmCisKK19pc19zZGtfYnVpbGQgOj0KKworQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBuZXQuYnQubmFtZT1BbmRyb2lkCisKKyMgVGhpcyBwcm9wZXJ0eSBpcyBzZXQgYnkgZmxhc2hpbmcgZGVidWcgYm9vdCBpbWFnZSwgc28gZGVmYXVsdCB0byBmYWxzZS4KK0FERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uZm9yY2UuZGVidWdnYWJsZT0wCisKK2NvbmZpZ19lbmFibGVfdWZmZF9nYyA6PSBcCisgICQoZmlyc3R3b3JkICQoT1ZFUlJJREVfRU5BQkxFX1VGRkRfR0MpICQoUFJPRFVDVF9FTkFCTEVfVUZGRF9HQykgZGVmYXVsdCkKKworIyBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN5c3RlbSBwcm9wZXJ0eSB0aGF0IGNvbnRyb2xzIHRoZSBBUlQgbW9kdWxlLiBUaGUgcGxhbiBpcworIyB0byByZW1vdmUgaXQgYnkgQXVnIDIwMjUsIGF0IHdoaWNoIHRpbWUgTWFpbmxpbmUgdXBkYXRlcyBvZiB0aGUgQVJUIG1vZHVsZQorIyB3aWxsIGlnbm9yZSBpdCBhcyB3ZWxsLgorIyBJZiB0aGUgdmFsdWUgaXMgImRlZmF1bHQiLCBpdCB3aWxsIGJlIG1hbmdsZWQgYnkgcG9zdF9wcm9jZXNzX3Byb3BzLnB5LgorQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gcm8uZGFsdmlrLnZtLmVuYWJsZV91ZmZkX2djPSQoY29uZmlnX2VuYWJsZV91ZmZkX2djKQorCitBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTKSkKK0FERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUykpCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTKSkKKworLktBVElfUkVBRE9OTFkgKz0gXAorICAgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgXAorICAgIEFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTIFwKKyAgICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2FydC1ob3N0LXRlc3RzLm1rIGIvY29yZS90YXNrcy9hcnQtaG9zdC10ZXN0cy5tawppbmRleCBmZjllYjA5Li5jOTVmNmU3IDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2FydC1ob3N0LXRlc3RzLm1rCisrKyBiL2NvcmUvdGFza3MvYXJ0LWhvc3QtdGVzdHMubWsKQEAgLTUwLDcgKzUwLDggQEAKIAlncmVwICQoVEFSR0VUX09VVF9URVNUQ0FTRVMpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0Lmxpc3QgfHwgdHJ1ZQogCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0Lmxpc3QgXAogCSAgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0Lmxpc3QgXAotCSAgLVAgaG9zdC90ZXN0Y2FzZXMgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9zaGFyZWQtbGlicy5saXN0CisJICAtUCBob3N0L3Rlc3RjYXNlcyAtQyAkKEhPU1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3NoYXJlZC1saWJzLmxpc3QgXAorCSAgLXNoYTI1NgogCWdyZXAgLWUgLipcXC5jb25maWckJCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QubGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCiAJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0Lmxpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCiAJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2FydF9ob3N0X3Rlc3RzX2NvbmZpZ3NfemlwKSBcCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2FydC5tayBiL2NvcmUvdGFza3MvYXJ0Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDYxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL2FydC5tawpAQCAtMCwwICsxLDI2IEBACisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY2xlYW4tb2F0IHJ1bGVzCisjCisKKy5QSE9OWTogY2xlYW4tb2F0CitjbGVhbi1vYXQ6IGNsZWFuLW9hdC1ob3N0IGNsZWFuLW9hdC10YXJnZXQKKworLlBIT05ZOiBjbGVhbi1vYXQtaG9zdAorY2xlYW4tb2F0LWhvc3Q6CisJZmluZCAkKE9VVF9ESVIpICcoJyAtbmFtZSAnKi5vYXQnIC1vIC1uYW1lICcqLm9kZXgnIC1vIC1uYW1lICcqLmFydCcgLW8gLW5hbWUgJyoudmRleCcgJyknIC1hIC10eXBlIGYgfCB4YXJncyBybSAtZgorCXJtIC1yZiAkKFRNUERJUikvKi90ZXN0LSovZGFsdmlrLWNhY2hlLyoKKwlybSAtcmYgJChUTVBESVIpL2FuZHJvaWQtZGF0YS9kYWx2aWstY2FjaGUvKgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9hdXRvbW90aXZlLXNkdi10ZXN0cy5tayBiL2NvcmUvdGFza3MvYXV0b21vdGl2ZS1zZHYtdGVzdHMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3MDZjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvYXV0b21vdGl2ZS1zZHYtdGVzdHMubWsKQEAgLTAsMCArMSw2MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisuUEhPTlk6IGF1dG9tb3RpdmUtc2R2LXRlc3RzCisKK2F1dG9tb3RpdmUtc2R2LXRlc3RzLXppcCA6PSAkKFBST0RVQ1RfT1VUKS9hdXRvbW90aXZlLXNkdi10ZXN0cy56aXAKKyMgQ3JlYXRlIGFuIGFydGlmYWN0IHRvIGluY2x1ZGUgYSBsaXN0IG9mIHRlc3QgY29uZmlnIGZpbGVzIGluIGF1dG9tb3RpdmUtc2R2LXRlc3RzLgorYXV0b21vdGl2ZS1zZHYtdGVzdHMtbGlzdC16aXAgOj0gJChQUk9EVUNUX09VVCkvYXV0b21vdGl2ZS1zZHYtdGVzdHNfbGlzdC56aXAKKyMgQ3JlYXRlIGFuIGFydGlmYWN0IHRvIGluY2x1ZGUgYWxsIHRlc3QgY29uZmlnIGZpbGVzIGluIGF1dG9tb3RpdmUtc2R2LXRlc3RzLgorYXV0b21vdGl2ZS1zZHYtdGVzdHMtY29uZmlncy16aXAgOj0gJChQUk9EVUNUX09VVCkvYXV0b21vdGl2ZS1zZHYtdGVzdHNfY29uZmlncy56aXAKK215X2hvc3Rfc2hhcmVkX2xpYl9mb3JfYXV0b21vdGl2ZV9zZHZfdGVzdHMgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKENPTVBBVElCSUxJVFkuYXV0b21vdGl2ZS1zZHYtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUykpCithdXRvbW90aXZlX3Nkdl90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9hdXRvbW90aXZlLXNkdi10ZXN0c19ob3N0LXNoYXJlZC1saWJzLnppcAorCiskKGF1dG9tb3RpdmUtc2R2LXRlc3RzLXppcCkgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoYXV0b21vdGl2ZS1zZHYtdGVzdHMtbGlzdC16aXApICQoYXV0b21vdGl2ZS1zZHYtdGVzdHMtY29uZmlncy16aXApICQoYXV0b21vdGl2ZV9zZHZfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApCiskKGF1dG9tb3RpdmUtc2R2LXRlc3RzLXppcCkgOiBQUklWQVRFX2F1dG9tb3RpdmVfc2R2X3Rlc3RzX2xpc3QgOj0gJChQUk9EVUNUX09VVCkvYXV0b21vdGl2ZS1zZHYtdGVzdHNfbGlzdAorJChhdXRvbW90aXZlLXNkdi10ZXN0cy16aXApIDogUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTIDo9ICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9hdXRvbW90aXZlX3Nkdl90ZXN0cykKKyQoYXV0b21vdGl2ZS1zZHYtdGVzdHMtemlwKSA6IFBSSVZBVEVfYXV0b21vdGl2ZV9ob3N0X3NoYXJlZF9saWJzX3ppcCA6PSAkKGF1dG9tb3RpdmVfc2R2X3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKQorJChhdXRvbW90aXZlLXNkdi10ZXN0cy16aXApIDogJChDT01QQVRJQklMSVRZLmF1dG9tb3RpdmUtc2R2LXRlc3RzLkZJTEVTKSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfYXV0b21vdGl2ZV9zZHZfdGVzdHMpICQoU09PTkdfWklQKQorCXJtIC1mICRALXNoYXJlZC1saWJzLmxpc3QKKwllY2hvICQoc29ydCAkKENPTVBBVElCSUxJVFkuYXV0b21vdGl2ZS1zZHYtdGVzdHMuRklMRVMpKSB8IHRyICIgIiAiXG4iID4gJEAubGlzdAorCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICRALmxpc3QgPiAkQC1ob3N0Lmxpc3QgfHwgdHJ1ZQorCWdyZXAgLWUgLipcXC5jb25maWckJCAkQC1ob3N0Lmxpc3QgPiAkQC1ob3N0LXRlc3QtY29uZmlncy5saXN0IHx8IHRydWUKKwkkKGhpZGUpIGZvciBzaGFyZWRfbGliIGluICQoUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTKTsgZG8gXAorCSAgZWNobyAkJHNoYXJlZF9saWIgPj4gJEAtaG9zdC5saXN0OyBcCisJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkQC1zaGFyZWQtbGlicy5saXN0OyBcCisJZG9uZQorCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICRALXNoYXJlZC1saWJzLmxpc3QgPiAkQC1ob3N0LXNoYXJlZC1saWJzLmxpc3QgfHwgdHJ1ZQorCWdyZXAgJChUQVJHRVRfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALXRhcmdldC5saXN0IHx8IHRydWUKKwlncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtdGFyZ2V0Lmxpc3QgPiAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQorCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC5saXN0IC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkQC10YXJnZXQubGlzdAorCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICQoYXV0b21vdGl2ZS1zZHYtdGVzdHMtY29uZmlncy16aXApIFwKKwkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCBcCisJICAtUCB0YXJnZXQgLUMgJChQUk9EVUNUX09VVCkgLWwgJEAtdGFyZ2V0LXRlc3QtY29uZmlncy5saXN0CisJJChTT09OR19aSVApIC1kIC1vICQoUFJJVkFURV9hdXRvbW90aXZlX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSBcCisJICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICRALWhvc3Qtc2hhcmVkLWxpYnMubGlzdAorCXJtIC1mICQoUFJJVkFURV9hdXRvbW90aXZlX3Nkdl90ZXN0c19saXN0KQorCSQoaGlkZSkgZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALWhvc3QubGlzdCB8IHNlZCBzJSQoSE9TVF9PVVQpJWhvc3QlZyA+ICQoUFJJVkFURV9hdXRvbW90aXZlX3Nkdl90ZXN0c19saXN0KQorCSQoaGlkZSkgZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALXRhcmdldC5saXN0IHwgc2VkIHMlJChQUk9EVUNUX09VVCkldGFyZ2V0JWcgPj4gJChQUklWQVRFX2F1dG9tb3RpdmVfc2R2X3Rlc3RzX2xpc3QpCisJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChhdXRvbW90aXZlLXNkdi10ZXN0cy1saXN0LXppcCkgLUMgJChkaXIgJEApIC1mICQoUFJJVkFURV9hdXRvbW90aXZlX3Nkdl90ZXN0c19saXN0KQorCXJtIC1mICRALmxpc3QgJEAtaG9zdC5saXN0ICRALXRhcmdldC5saXN0ICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgJEAtdGFyZ2V0LXRlc3QtY29uZmlncy5saXN0IFwKKwkgICRALXNoYXJlZC1saWJzLmxpc3QgJEAtaG9zdC1zaGFyZWQtbGlicy5saXN0ICQoUFJJVkFURV9hdXRvbW90aXZlX3Nkdl90ZXN0c19saXN0KQorCithdXRvbW90aXZlLXNkdi10ZXN0czogJChhdXRvbW90aXZlLXNkdi10ZXN0cy16aXApCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGF1dG9tb3RpdmUtc2R2LXRlc3RzLCAkKGF1dG9tb3RpdmUtc2R2LXRlc3RzLXppcCkgJChhdXRvbW90aXZlLXNkdi10ZXN0cy1saXN0LXppcCkgJChhdXRvbW90aXZlLXNkdi10ZXN0cy1jb25maWdzLXppcCkgJChhdXRvbW90aXZlX3Nkdl90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkpCisKKyQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKGF1dG9tb3RpdmUtc2R2LXRlc3RzLXppcCksKQorJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKGF1dG9tb3RpdmUtc2R2LXRlc3RzLXppcCksJChDT01QQVRJQklMSVRZLmF1dG9tb3RpdmUtc2R2LXRlc3RzLkZJTEVTKSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfYXV0b21vdGl2ZV9zZHZfdGVzdHMpLCQoUFJPRFVDVF9PVVQpLzovKQorCit0ZXN0czogYXV0b21vdGl2ZS1zZHYtdGVzdHMKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsgYi9jb3JlL3Rhc2tzL2JlcmJlcmlzX3Rlc3QubWsKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKY29weSB0byBjb3JlL3Rhc2tzL2JlcmJlcmlzX3Rlc3QubWsKaW5kZXggNWY2NTUzZS4uODYwNDcwOSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5taworKysgYi9jb3JlL3Rhc2tzL2JlcmJlcmlzX3Rlc3QubWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCw4ICsxNCwxMiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBEb24ndCBtb2RpZnkgdGhpcyBmaWxlIC0gSXQncyBqdXN0IGFuIGFsaWFzIQorQkVSQkVSSVNfRElSIDo9IGZyYW1ld29ya3MvbGlicy9iaW5hcnlfdHJhbnNsYXRpb24KIAotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9zZGtfcGhvbmVfeDg2XzY0Lm1rKQorIyBCZXJiZXJpcyBpbmNsdWRlcyBzb21lIGNvbXBvbmVudHMgd2hpY2ggbWF5IGNvbmZsaWN0IHdpdGggb3RoZXIgcGFja2FnZXMuCisjIE9ubHkgYnVpbGQgaXQgd2hlbiByZXF1ZXN0ZWQgZXhwbGljaXRseS4KK2lmZXEgKCQoQlVJTERfQkVSQkVSSVMpLHRydWUpCiAKLVBST0RVQ1RfTkFNRSA6PSBzZGtfeDg2XzY0CitpbmNsdWRlICQoQkVSQkVSSVNfRElSKS90ZXN0cy9ydW5faG9zdF90ZXN0cy5taworCitlbmRpZiAgIyBCVUlMRF9CRVJCRVJJUwpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9jb2xsZWN0X2dwbF9zb3VyY2VzLm1rIGIvY29yZS90YXNrcy9jb2xsZWN0X2dwbF9zb3VyY2VzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTlhYjhlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGFza3MvY29sbGVjdF9ncGxfc291cmNlcy5taworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgVGhlIHJ1bGUgYmVsb3cgZG9lc24ndCBoYXZlIGRlcGVuZGVuaWNlcyBvbiB0aGUgZmlsZXMgdGhhdCBpdCBjb3BpZXMsCi0jIHNvIG1hbnVhbGx5IGdlbmVyYXRlIGludG8gYSBQQUNLQUdJTkcgaW50ZXJtZWRpYXRlIGRpciwgd2hpY2ggaXMgd2lwZWQKLSMgaW4gaW5zdGFsbGNsZWFuIGJldHdlZW4gaW5jcmVtZW50YWwgYnVpbGRzIG9uIGJ1aWxkIHNlcnZlcnMuCi1ncGxfc291cmNlX3RneiA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxncGxfc291cmNlKS9ncGxfc291cmNlLnRnegotCi1BTExfR1BMX01PRFVMRV9MSUNFTlNFX0ZJTEVTIDo9ICQoc29ydCAkKEFMTF9HUExfTU9EVUxFX0xJQ0VOU0VfRklMRVMpKQotCi0jIEZPUkNFIHNpbmNlIHdlIGNhbid0IGtub3cgd2hldGhlciBhbnkgb2YgdGhlIHNvdXJjZXMgY2hhbmdlZAotJChncGxfc291cmNlX3Rneik6IFBSSVZBVEVfUEFUSFMgOj0gJChzb3J0ICQocGF0c3Vic3QgJS8sICUsICQoZGlyICQoQUxMX0dQTF9NT0RVTEVfTElDRU5TRV9GSUxFUykpKSkKLSQoZ3BsX3NvdXJjZV90Z3opIDogJChBTExfR1BMX01PRFVMRV9MSUNFTlNFX0ZJTEVTKQotCUBlY2hvIFBhY2thZ2UgR1BMIHNvdXJjZXM6ICRACi0JJChoaWRlKSB0YXIgY2Z6ICRAIC0tZXhjbHVkZSAiLmdpdCoiICQoUFJJVkFURV9QQVRIUykKLQotIyBEaXN0IHRoZSB0Z3ogb25seSBpZiB3ZSBhcmUgZG9pbmcgYSBmdWxsIGJ1aWxkCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWRjb3JlLXVuYnVuZGxlZCwkKGdwbF9zb3VyY2VfdGd6KSkKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvY3RzLm1rIGIvY29yZS90YXNrcy9jdHMubWsKaW5kZXggNjc0YWZiNS4uMjk0Y2I1NyAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9jdHMubWsKKysrIGIvY29yZS90YXNrcy9jdHMubWsKQEAgLTM5LDE2ICszOSwxOCBAQAogICBjdHNfcGxhdGZvcm1fcmVsZWFzZV9wYXRoIDo9IGN0cy90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fcmVsZWFzZXMudHh0CiAgIGN0c19wbGF0Zm9ybV9yZWxlYXNlX3N0cmluZyA6PSAkKHNoZWxsIGNhdCAkKGN0c19wbGF0Zm9ybV9yZWxlYXNlX3BhdGgpKQogCi0gIGlmZXEgKCwkKGZpbmRzdHJpbmcgJChQTEFURk9STV9WRVJTSU9OKSwkKGN0c19wbGF0Zm9ybV92ZXJzaW9uX3N0cmluZykpKQotICAgIGRlZmluZSBlcnJvcl9tc2cKLSAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgQ291bGQgbm90IGZpbmQgdmVyc2lvbiAiJChQTEFURk9STV9WRVJTSU9OKSIgaW4gQ1RTIHBsYXRmb3JtIHZlcnNpb24gZmlsZToKLSAgICAgICQoY3RzX3BsYXRmb3JtX3ZlcnNpb25fcGF0aCkKLSAgICAgIE1vc3QgbGlrZWx5IFBMQVRGT1JNX1ZFUlNJT04gaW4gYnVpbGQvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rCi0gICAgICBoYXMgY2hhbmdlZCBhbmQgYSBuZXcgdmVyc2lvbiBtdXN0IGJlIGFkZGVkIHRvIHRoaXMgQ1RTIGZpbGUuCi0gICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBlbmRlZgotICAgICQoZXJyb3IgJChlcnJvcl9tc2cpKQorICBpZm5lcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCisgICAgaWZlcSAoLCQoZmluZHN0cmluZyAkKFBMQVRGT1JNX1ZFUlNJT04pLCQoY3RzX3BsYXRmb3JtX3ZlcnNpb25fc3RyaW5nKSkpCisgICAgICBkZWZpbmUgZXJyb3JfbXNnCisgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBDb3VsZCBub3QgZmluZCB2ZXJzaW9uICIkKFBMQVRGT1JNX1ZFUlNJT04pIiBpbiBDVFMgcGxhdGZvcm0gdmVyc2lvbiBmaWxlOgorICAgICAgICAkKGN0c19wbGF0Zm9ybV92ZXJzaW9uX3BhdGgpCisgICAgICAgIE1vc3QgbGlrZWx5IFBMQVRGT1JNX1ZFUlNJT04gaW4gYnVpbGQvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rCisgICAgICAgIGhhcyBjaGFuZ2VkIGFuZCBhIG5ldyB2ZXJzaW9uIG11c3QgYmUgYWRkZWQgdG8gdGhpcyBDVFMgZmlsZS4KKyAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBlbmRlZgorICAgICAgJChlcnJvciAkKGVycm9yX21zZykpCisgICAgZW5kaWYKICAgZW5kaWYKICAgaWZlcSAoLCQoZmluZHN0cmluZyAkKFBMQVRGT1JNX1ZFUlNJT05fTEFTVF9TVEFCTEUpLCQoY3RzX3BsYXRmb3JtX3JlbGVhc2Vfc3RyaW5nKSkpCiAgICAgZGVmaW5lIGVycm9yX21zZwpAQCAtOTAsOCArOTIsMTYgQEAKIAogY3RzX2FwaV9jb3ZlcmFnZV9leGUgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvY3RzLWFwaS1jb3ZlcmFnZQogZGV4ZGVwc19leGUgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZGV4ZGVwcworY3RzX2FwaV9tYXBfZXhlIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2N0cy1hcGktbWFwCiAKIGNvdmVyYWdlX291dCA6PSAkKEhPU1RfT1VUKS9jdHMtYXBpLWNvdmVyYWdlCithcGlfbWFwX291dCA6PSAkKEhPU1RfT1VUKS9jdHMtYXBpLW1hcAorCitjdHNfamFyX2ZpbGVzIDo9ICQoYXBpX21hcF9vdXQpL2FwaV9tYXBfZmlsZXMudHh0CiskKGN0c19qYXJfZmlsZXMpOiBQUklWQVRFX0FQSV9NQVBfRklMRVMgOj0gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5jdHMuQVBJX01BUF9GSUxFUykpCiskKGN0c19qYXJfZmlsZXMpOgorCW1rZGlyIC1wICQoZGlyICRAKQorCWVjaG8gJChQUklWQVRFX0FQSV9NQVBfRklMRVMpID4gJEAKIAogYXBpX3htbF9kZXNjcmlwdGlvbiA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL2FwaS54bWwKIApAQCAtMTE0LDYgKzEyNCwxNCBAQAogY3RzX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMgOj0gJChjdHNfYXBpX2NvdmVyYWdlX2V4ZSkgJChkZXhkZXBzX2V4ZSkgJChhcGlfeG1sX2Rlc2NyaXB0aW9uKSAkKG5hcGlfeG1sX2Rlc2NyaXB0aW9uKQogY3RzX3N5c3RlbV9hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzIDo9ICQoY3RzX2FwaV9jb3ZlcmFnZV9leGUpICQoZGV4ZGVwc19leGUpICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiAKK2N0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL2FwaS1tYXAueG1sCitjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQgOj0gJChhcGlfbWFwX291dCkvYXBpLW1hcC5odG1sCitjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQgOj0gJChhcGlfbWFwX291dCkvc3lzdGVtLWFwaS1tYXAueG1sCitjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL3N5c3RlbS1hcGktbWFwLmh0bWwKKworY3RzX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcyA6PSAkKGN0c19hcGlfbWFwX2V4ZSkgJChzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbikgJChjdHNfamFyX2ZpbGVzKQorY3RzX2FwaV9tYXBfZGVwZW5kZW5jaWVzIDo9ICQoY3RzX2FwaV9tYXBfZXhlKSAkKGFwaV94bWxfZGVzY3JpcHRpb24pICQoY3RzX2phcl9maWxlcykKKwogYW5kcm9pZF9jdHNfemlwIDo9ICQoSE9TVF9PVVQpL2N0cy9hbmRyb2lkLWN0cy56aXAKIGN0c192ZXJpZmllcl9hcGsgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixBUFBTLEN0c1ZlcmlmaWVyKS9wYWNrYWdlLmFwawogCkBAIC0xNDQsMzAgKzE2MiwzMCBAQAogCSQoY2FsbCBnZW5lcmF0ZS1jb3ZlcmFnZS1yZXBvcnQtY3RzLCJDVFMgU3lzdGVtIEFQSSBDb3ZlcmFnZSBSZXBvcnQgLSBYTUwiLFwKIAkJCSQoUFJJVkFURV9URVNUX0NBU0VTKSx4bWwpCiAKLSQoY3RzLXZlcmlmaWVyLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfVEVTVF9DQVNFUyA6PSAkKGN0c192ZXJpZmllcl9hcGspCiskKGN0cy12ZXJpZmllci1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX1RFU1RfQ0FTRVMgOj0gJChmb3JlYWNoIGMsICQoY3RzX3ZlcmlmaWVyX2FwaykgJCh2ZXJpZmllci1kaXIpLCAkKGMpKQogJChjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX0NPVkVSQUdFX0VYRSA6PSAkKGN0c19hcGlfY292ZXJhZ2VfZXhlKQogJChjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0KTogUFJJVkFURV9ERVhERVBTX0VYRSA6PSAkKGRleGRlcHNfZXhlKQogJChjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0KTogUFJJVkFURV9BUElfWE1MX0RFU0MgOj0gJChhcGlfeG1sX2Rlc2NyaXB0aW9uKQogJChjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0KTogUFJJVkFURV9OQVBJX1hNTF9ERVNDIDo9ICQobmFwaV94bWxfZGVzY3JpcHRpb24pCi0kKGN0cy12ZXJpZmllci1jb3ZlcmFnZS1yZXBvcnQpIDogJChjdHNfdmVyaWZpZXJfYXBrKSAkKGN0c19hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQorJChjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0KSA6ICQoY3RzX3ZlcmlmaWVyX2FwaykgJCh2ZXJpZmllci16aXApICQoY3RzX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCiAJJChjYWxsIGdlbmVyYXRlLWNvdmVyYWdlLXJlcG9ydC1jdHMsIkNUUyBWZXJpZmllciBBUEkgQ292ZXJhZ2UgUmVwb3J0IixcCiAJCQkkKFBSSVZBVEVfVEVTVF9DQVNFUyksaHRtbCkKIAotJChjdHMtY29tYmluZWQtY292ZXJhZ2UtcmVwb3J0KTogUFJJVkFURV9URVNUX0NBU0VTIDo9ICQoZm9yZWFjaCBjLCAkKGN0c192ZXJpZmllcl9hcGspICQoQ09NUEFUSUJJTElUWV9URVNUQ0FTRVNfT1VUX2N0cyksICQoYykpCiskKGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX1RFU1RfQ0FTRVMgOj0gJChmb3JlYWNoIGMsICQoY3RzX3ZlcmlmaWVyX2FwaykgJChDT01QQVRJQklMSVRZX1RFU1RDQVNFU19PVVRfY3RzKSAkKHZlcmlmaWVyLWRpciksICQoYykpCiAkKGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX0NUU19BUElfQ09WRVJBR0VfRVhFIDo9ICQoY3RzX2FwaV9jb3ZlcmFnZV9leGUpCiAkKGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX0RFWERFUFNfRVhFIDo9ICQoZGV4ZGVwc19leGUpCiAkKGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX0FQSV9YTUxfREVTQyA6PSAkKGFwaV94bWxfZGVzY3JpcHRpb24pCiAkKGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX05BUElfWE1MX0RFU0MgOj0gJChuYXBpX3htbF9kZXNjcmlwdGlvbikKLSQoY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCkgOiAkKGFuZHJvaWRfY3RzX3ppcCkgJChjdHNfdmVyaWZpZXJfYXBrKSAkKGN0c19hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQorJChjdHMtY29tYmluZWQtY292ZXJhZ2UtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c192ZXJpZmllcl9hcGspICQodmVyaWZpZXItemlwKSAkKGN0c19hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQogCSQoY2FsbCBnZW5lcmF0ZS1jb3ZlcmFnZS1yZXBvcnQtY3RzLCJDVFMgQ29tYmluZWQgQVBJIENvdmVyYWdlIFJlcG9ydCIsXAogCQkJJChQUklWQVRFX1RFU1RfQ0FTRVMpLGh0bWwpCiAKLSQoY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX1RFU1RfQ0FTRVMgOj0gJChmb3JlYWNoIGMsICQoY3RzX3ZlcmlmaWVyX2FwaykgJChDT01QQVRJQklMSVRZX1RFU1RDQVNFU19PVVRfY3RzKSwgJChjKSkKKyQoY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX1RFU1RfQ0FTRVMgOj0gJChmb3JlYWNoIGMsICQoY3RzX3ZlcmlmaWVyX2FwaykgJChDT01QQVRJQklMSVRZX1RFU1RDQVNFU19PVVRfY3RzKSAkKHZlcmlmaWVyLWRpciksICQoYykpCiAkKGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX0NPVkVSQUdFX0VYRSA6PSAkKGN0c19hcGlfY292ZXJhZ2VfZXhlKQogJChjdHMtY29tYmluZWQteG1sLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfREVYREVQU19FWEUgOj0gJChkZXhkZXBzX2V4ZSkKICQoY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX0FQSV9YTUxfREVTQyA6PSAkKGFwaV94bWxfZGVzY3JpcHRpb24pCiAkKGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0KTogUFJJVkFURV9OQVBJX1hNTF9ERVNDIDo9ICQobmFwaV94bWxfZGVzY3JpcHRpb24pCi0kKGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c192ZXJpZmllcl9hcGspICQoY3RzX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCiskKGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c192ZXJpZmllcl9hcGspICQodmVyaWZpZXItemlwKSAkKGN0c19hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQogCSQoY2FsbCBnZW5lcmF0ZS1jb3ZlcmFnZS1yZXBvcnQtY3RzLCJDVFMgQ29tYmluZWQgQVBJIENvdmVyYWdlIFJlcG9ydCAtIFhNTCIsXAogCQkJJChQUklWQVRFX1RFU1RfQ0FTRVMpLHhtbCkKIApAQCAtMTkyLDYgKzIxMCw0OCBAQAogLlBIT05ZOiBjdHMtY292ZXJhZ2UtcmVwb3J0LWFsbCBjdHMtYXBpLWNvdmVyYWdlCiBjdHMtY292ZXJhZ2UtcmVwb3J0LWFsbDogY3RzLXRlc3QtY292ZXJhZ2UgY3RzLXZlcmlmaWVyLWNvdmVyYWdlIGN0cy1jb21iaW5lZC1jb3ZlcmFnZSBjdHMtY29tYmluZWQteG1sLWNvdmVyYWdlCiAKKyQoY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX01BUF9FWEUgOj0gJChjdHNfYXBpX21hcF9leGUpCiskKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiskKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfSkFSX0ZJTEVTIDo9ICQoY3RzX2phcl9maWxlcykKKyQoY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c19zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCisJJChjYWxsIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cywiQ1RTIFN5c3RlbSBBUEkgTUFQIFJlcG9ydCAtIFhNTCIsXAorCQkJJChQUklWQVRFX0pBUl9GSUxFUykseG1sKQorCiskKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0NUU19BUElfTUFQX0VYRSA6PSAkKGN0c19hcGlfbWFwX2V4ZSkKKyQoY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiskKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19qYXJfZmlsZXMpCiskKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpIDogJChhbmRyb2lkX2N0c196aXApICQoY3RzX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKKwkkKGNhbGwgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzLCJDVFMgU3lzdGVtIEFQSSBNQVAgUmVwb3J0IC0gSFRNTCIsXAorCQkJJChQUklWQVRFX0pBUl9GSUxFUyksaHRtbCkKKworJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQorJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoYXBpX3htbF9kZXNjcmlwdGlvbikKKyQoY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19qYXJfZmlsZXMpCiskKGN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c19hcGlfbWFwX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKKwkkKGNhbGwgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzLCJDVFMgQVBJIE1BUCBSZXBvcnQgLSBYTUwiLFwKKwkJCSQoUFJJVkFURV9KQVJfRklMRVMpLHhtbCkKKworJChjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0NUU19BUElfTUFQX0VYRSA6PSAkKGN0c19hcGlfbWFwX2V4ZSkKKyQoY3RzLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9BUElfWE1MX0RFU0MgOj0gJChhcGlfeG1sX2Rlc2NyaXB0aW9uKQorJChjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19qYXJfZmlsZXMpCiskKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCkgOiAkKGFuZHJvaWRfY3RzX3ppcCkgJChjdHNfYXBpX21hcF9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCisJJChjYWxsIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cywiQ1RTIEFQSSBNQVAgUmVwb3J0IC0gSFRNTCIsXAorCQkJJChQUklWQVRFX0pBUl9GSUxFUyksaHRtbCkKKworLlBIT05ZOiBjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcAorY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAgOiAkKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkKKworLlBIT05ZOiBjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAKK2N0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcCA6ICQoY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCkKKworLlBIT05ZOiBjdHMtYXBpLXhtbC1hcGktbWFwCitjdHMtYXBpLXhtbC1hcGktbWFwIDogJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkKKworLlBIT05ZOiBjdHMtYXBpLWh0bWwtYXBpLW1hcAorY3RzLWFwaS1odG1sLWFwaS1tYXAgOiAkKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCkKKworLlBIT05ZOiBjdHMtYXBpLW1hcC1hbGwKKwogIyBQdXQgdGhlIHRlc3QgY292ZXJhZ2UgcmVwb3J0IGluIHRoZSBkaXN0IGRpciBpZiAiY3RzLWFwaS1jb3ZlcmFnZSIgaXMgYW1vbmcgdGhlIGJ1aWxkIGdvYWxzLgogJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLWNvdmVyYWdlLCAkKGN0cy10ZXN0LWNvdmVyYWdlLXJlcG9ydCk6Y3RzLXRlc3QtY292ZXJhZ2UtcmVwb3J0Lmh0bWwpCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktY292ZXJhZ2UsICQoY3RzLXN5c3RlbS1hcGktY292ZXJhZ2UtcmVwb3J0KTpjdHMtc3lzdGVtLWFwaS1jb3ZlcmFnZS1yZXBvcnQuaHRtbCkKQEAgLTIwNyw2ICsyNjcsMTcgQEAKIEFMTF9UQVJHRVRTLiQoY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCiBBTExfVEFSR0VUUy4kKGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0KS5NRVRBX0xJQzo9JChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkKIAorIyBQdXQgdGhlIHRlc3QgYXBpIG1hcCByZXBvcnQgaW4gdGhlIGRpc3QgZGlyIGlmICJjdHMtYXBpLW1hcC1hbGwiIGlzIGFtb25nIHRoZSBidWlsZCBnb2Fscy4KKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWFwaS1tYXAtYWxsLCAkKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6Y3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0LnhtbCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWFwaS1tYXAtYWxsLCAkKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOmN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQuaHRtbCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWFwaS1tYXAtYWxsLCAkKGN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KTpjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydC54bWwpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktbWFwLWFsbCwgJChjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOmN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydC5odG1sKQorCitBTExfVEFSR0VUUy4kKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCitBTExfVEFSR0VUUy4kKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQorQUxMX1RBUkdFVFMuJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCitBTExfVEFSR0VUUy4kKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCisKICMgQXJndW1lbnRzOwogIyAgMSAtIE5hbWUgb2YgdGhlIHJlcG9ydCBwcmludGVkIG91dCBvbiB0aGUgc2NyZWVuCiAjICAyIC0gTGlzdCBvZiBhcGsgZmlsZXMgdGhhdCB3aWxsIGJlIHNjYW5uZWQgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydApAQCAtMjE3LDIyICsyODgsNDYgQEAKIAlAIGVjaG8gJCgxKTogZmlsZTovLyQkKGNkICQoZGlyICRAKTsgcHdkKS8kKG5vdGRpciAkQCkKIGVuZGVmCiAKKyMgQXJndW1lbnRzOworIyAgMSAtIE5hbWUgb2YgdGhlIHJlcG9ydCBwcmludGVkIG91dCBvbiB0aGUgc2NyZWVuCisjICAyIC0gQSBmaWxlIGNvbnRhaW5pbmcgbGlzdCBvZiBmaWxlcyB0aGF0IHRvIGJlIGFuYWx5emVkCisjICAzIC0gRm9ybWF0IG9mIHRoZSByZXBvcnQKK2RlZmluZSBnZW5lcmF0ZS1hcGktbWFwLXJlcG9ydC1jdHMKKwkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQorCSQoaGlkZSkgJChQUklWQVRFX0NUU19BUElfTUFQX0VYRSkgLWogOCAtYSAkKFBSSVZBVEVfQVBJX1hNTF9ERVNDKSAtaSAkKDIpIC1mICQoMykgLW8gJEAKKwlAIGVjaG8gJCgxKTogZmlsZTovLyQkKGNkICQoZGlyICRAKTsgcHdkKS8kKG5vdGRpciAkQCkKK2VuZGVmCisKICMgUmVzZXQgdGVtcCB2YXJzCiBjdHNfYXBpX2NvdmVyYWdlX2RlcGVuZGVuY2llcyA6PQogY3RzX3N5c3RlbV9hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzIDo9CitjdHNfYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0KK2N0c19zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0KIGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQgOj0KIGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0IDo9CiBjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0IDo9CiBjdHMtdGVzdC1jb3ZlcmFnZS1yZXBvcnQgOj0KIGN0cy1zeXN0ZW0tYXBpLWNvdmVyYWdlLXJlcG9ydCA6PQogY3RzLXN5c3RlbS1hcGkteG1sLWNvdmVyYWdlLXJlcG9ydCA6PQorY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQgOj0KK2N0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCA6PQorY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0IDo9CitjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0IDo9CiBhcGlfeG1sX2Rlc2NyaXB0aW9uIDo9CiBhcGlfdGV4dF9kZXNjcmlwdGlvbiA6PQogc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24gOj0KIG5hcGlfeG1sX2Rlc2NyaXB0aW9uIDo9CiBuYXBpX3RleHRfZGVzY3JpcHRpb24gOj0KIGNvdmVyYWdlX291dCA6PQorYXBpX21hcF9vdXQgOj0KK2N0c19qYXJfZmlsZXMgOj0KIGRleGRlcHNfZXhlIDo9CiBjdHNfYXBpX2NvdmVyYWdlX2V4ZSA6PQorY3RzX2FwaV9tYXBfZXhlIDo9CiBjdHNfdmVyaWZpZXJfYXBrIDo9CiBhbmRyb2lkX2N0c196aXAgOj0KK2N0cy1kaXIgOj0KK3ZlcmlmaWVyLWRpci1uYW1lIDo9Cit2ZXJpZmllci1kaXIgOj0KK3ZlcmlmaWVyLXppcC1uYW1lIDo9Cit2ZXJpZmllci16aXAgOj0KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvZGV2aWNlLXBsYXRpbnVtLXRlc3RzLm1rIGIvY29yZS90YXNrcy9kZXZpY2UtcGxhdGludW0tdGVzdHMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmNGM0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvZGV2aWNlLXBsYXRpbnVtLXRlc3RzLm1rCkBAIC0wLDAgKzEsNzEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworLlBIT05ZOiBkZXZpY2UtcGxhdGludW0tdGVzdHMKKworZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9kZXZpY2UtcGxhdGludW0tdGVzdHMuemlwCisjIENyZWF0ZSBhbiBhcnRpZmFjdCB0byBpbmNsdWRlIGEgbGlzdCBvZiB0ZXN0IGNvbmZpZyBmaWxlcyBpbiBkZXZpY2UtcGxhdGludW0tdGVzdHMuCitkZXZpY2VfcGxhdGludW1fdGVzdHNfbGlzdF96aXAgOj0gJChQUk9EVUNUX09VVCkvZGV2aWNlLXBsYXRpbnVtLXRlc3RzX2xpc3QuemlwCisjIENyZWF0ZSBhbiBhcnRpZmFjdCB0byBpbmNsdWRlIGFsbCB0ZXN0IGNvbmZpZyBmaWxlcyBpbiBkZXZpY2UtcGxhdGludW0tdGVzdHMuCitkZXZpY2VfcGxhdGludW1fdGVzdHNfY29uZmlnc196aXAgOj0gJChQUk9EVUNUX09VVCkvZGV2aWNlLXBsYXRpbnVtLXRlc3RzX2NvbmZpZ3MuemlwCitteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV9wbGF0aW51bV90ZXN0cyA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQoQ09NUEFUSUJJTElUWS5kZXZpY2UtcGxhdGludW0tdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUykpCitkZXZpY2VfcGxhdGludW1fdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXAgOj0gJChQUk9EVUNUX09VVCkvZGV2aWNlLXBsYXRpbnVtLXRlc3RzX2hvc3Qtc2hhcmVkLWxpYnMuemlwCisKKyQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX3ppcCkgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2xpc3RfemlwKSAkKGRldmljZV9wbGF0aW51bV90ZXN0c19jb25maWdzX3ppcCkgJChkZXZpY2VfcGxhdGludW1fdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApCiskKGRldmljZV9wbGF0aW51bV90ZXN0c196aXApIDogUFJJVkFURV9kZXZpY2VfcGxhdGludW1fdGVzdHNfbGlzdF96aXAgOj0gJChkZXZpY2VfcGxhdGludW1fdGVzdHNfbGlzdF96aXApCiskKGRldmljZV9wbGF0aW51bV90ZXN0c196aXApIDogUFJJVkFURV9kZXZpY2VfcGxhdGludW1fdGVzdHNfY29uZmlnc196aXAgOj0gJChkZXZpY2VfcGxhdGludW1fdGVzdHNfY29uZmlnc196aXApCiskKGRldmljZV9wbGF0aW51bV90ZXN0c196aXApIDogUFJJVkFURV9kZXZpY2VfcGxhdGludW1fdGVzdHNfbGlzdCA6PSAkKFBST0RVQ1RfT1VUKS9kZXZpY2UtcGxhdGludW0tdGVzdHNfbGlzdAorJChkZXZpY2VfcGxhdGludW1fdGVzdHNfemlwKSA6IFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyA6PSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzKQorJChkZXZpY2VfcGxhdGludW1fdGVzdHNfemlwKSA6IFBSSVZBVEVfZGV2aWNlX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9ICQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKQorJChkZXZpY2VfcGxhdGludW1fdGVzdHNfemlwKSA6ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtcGxhdGludW0tdGVzdHMuRklMRVMpICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9kZXZpY2VfcGxhdGludW1fdGVzdHMpICQoU09PTkdfWklQKQorCXJtIC1mICRALXNoYXJlZC1saWJzLmxpc3QKKwlybSAtZiAkKFBSSVZBVEVfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2xpc3RfemlwKQorCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtcGxhdGludW0tdGVzdHMuRklMRVMpKSB8IHRyICIgIiAiXG4iID4gJEAubGlzdAorCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICRALmxpc3QgPiAkQC1ob3N0Lmxpc3QgfHwgdHJ1ZQorCWdyZXAgLWUgLipcXC5jb25maWckJCAkQC1ob3N0Lmxpc3QgPiAkQC1ob3N0LXRlc3QtY29uZmlncy5saXN0IHx8IHRydWUKKwkkKGhpZGUpIGZvciBzaGFyZWRfbGliIGluICQoUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTKTsgZG8gXAorCSAgZWNobyAkJHNoYXJlZF9saWIgPj4gJEAtaG9zdC5saXN0OyBcCisJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkQC1zaGFyZWQtbGlicy5saXN0OyBcCisJZG9uZQorCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICRALXNoYXJlZC1saWJzLmxpc3QgPiAkQC1ob3N0LXNoYXJlZC1saWJzLmxpc3QgfHwgdHJ1ZQorCWdyZXAgJChUQVJHRVRfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALXRhcmdldC5saXN0IHx8IHRydWUKKwlncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtdGFyZ2V0Lmxpc3QgPiAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQorCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC5saXN0IC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkQC10YXJnZXQubGlzdCAtc2hhMjU2CisJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2RldmljZV9wbGF0aW51bV90ZXN0c19jb25maWdzX3ppcCkgXAorCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0LXRlc3QtY29uZmlncy5saXN0IFwKKwkgIC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QKKwkkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2RldmljZV9ob3N0X3NoYXJlZF9saWJzX3ppcCkgXAorCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0LXNoYXJlZC1saWJzLmxpc3QKKwlybSAtZiAkKFBSSVZBVEVfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2xpc3QpCisJJChoaWRlKSBncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtaG9zdC5saXN0IHwgc2VkIHMlJChIT1NUX09VVCklaG9zdCVnID4gJChQUklWQVRFX2RldmljZV9wbGF0aW51bV90ZXN0c19saXN0KQorCSQoaGlkZSkgZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALXRhcmdldC5saXN0IHwgc2VkIHMlJChQUk9EVUNUX09VVCkldGFyZ2V0JWcgPj4gJChQUklWQVRFX2RldmljZV9wbGF0aW51bV90ZXN0c19saXN0KQorCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICQoUFJJVkFURV9kZXZpY2VfcGxhdGludW1fdGVzdHNfbGlzdF96aXApIC1DICQoZGlyICRAKSAtZiAkKFBSSVZBVEVfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2xpc3QpCisJcm0gLWYgJEAubGlzdCAkQC1ob3N0Lmxpc3QgJEAtdGFyZ2V0Lmxpc3QgJEAtaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QgXAorCSAgJEAtc2hhcmVkLWxpYnMubGlzdCAkQC1ob3N0LXNoYXJlZC1saWJzLmxpc3QgJChQUklWQVRFX2RldmljZV9wbGF0aW51bV90ZXN0c19saXN0KQorCitkZXZpY2UtcGxhdGludW0tdGVzdHM6ICQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX3ppcCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgZGV2aWNlLXBsYXRpbnVtLXRlc3RzLCAkKGRldmljZV9wbGF0aW51bV90ZXN0c196aXApICQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2xpc3RfemlwKSAkKGRldmljZV9wbGF0aW51bV90ZXN0c19jb25maWdzX3ppcCkgJChkZXZpY2VfcGxhdGludW1fdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApKQorCiskKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChkZXZpY2VfcGxhdGludW1fdGVzdHNfemlwKSwpCiskKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX3ppcCksJChDT01QQVRJQklMSVRZLmRldmljZS1wbGF0aW51bS10ZXN0cy5GSUxFUykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV9wbGF0aW51bV90ZXN0cyksJChQUk9EVUNUX09VVCkvOi8pCisKK3Rlc3RzOiBkZXZpY2UtcGxhdGludW0tdGVzdHMKKworIyBSZXNldCB0ZW1wIHZhcnMKK2RldmljZV9wbGF0aW51bV90ZXN0c196aXAgOj0KK2RldmljZV9wbGF0aW51bV90ZXN0c19saXN0X3ppcCA6PQorZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2NvbmZpZ3NfemlwIDo9CitteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV9wbGF0aW51bV90ZXN0cyA6PQorZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9CmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2RldmljZS10ZXN0cy5tayBiL2NvcmUvdGFza3MvZGV2aWNlLXRlc3RzLm1rCmluZGV4IDQxNjdhN2UuLjU4NTBjNGUgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvZGV2aWNlLXRlc3RzLm1rCisrKyBiL2NvcmUvdGFza3MvZGV2aWNlLXRlc3RzLm1rCkBAIC0yNyw5ICsyNyw5IEBACiAkKGRldmljZS10ZXN0cy16aXApIDogUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCA6PSAkKFBST0RVQ1RfT1VUKS9kZXZpY2UtdGVzdHNfbGlzdAogJChkZXZpY2UtdGVzdHMtemlwKSA6IFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyA6PSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3Rlc3RzKQogJChkZXZpY2UtdGVzdHMtemlwKSA6IFBSSVZBVEVfZGV2aWNlX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9ICQoZGV2aWNlX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKQotJChkZXZpY2UtdGVzdHMtemlwKSA6ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuRklMRVMpICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9kZXZpY2VfdGVzdHMpICQoU09PTkdfWklQKQorJChkZXZpY2UtdGVzdHMtemlwKSA6ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuRklMRVMpICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV90ZXN0cykgJChTT09OR19aSVApCiAJcm0gLWYgJEAtc2hhcmVkLWxpYnMubGlzdAotCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuRklMRVMpKSB8IHRyICIgIiAiXG4iID4gJEAubGlzdAorCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuRklMRVMpICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkQC5saXN0CiAJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALWhvc3QubGlzdCB8fCB0cnVlCiAJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALWhvc3QubGlzdCA+ICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQogCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2ZvbnRjaGFpbl9saW50Lm1rIGIvY29yZS90YXNrcy9mb250Y2hhaW5fbGludC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGMzOTZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9mb250Y2hhaW5fbGludC5tawpAQCAtMCwwICsxLDQzIEBACisjIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFJ1biBzYW5pdHkgdGVzdHMgb24gZm9udHMgb24gY2hlY2tidWlsZAorY2hlY2tidWlsZDogZm9udGNoYWluX2xpbnQKKworRk9OVENIQUlOX0xJTlRFUiA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9mb250Y2hhaW5fbGludGVyCitpZmVxICgkKE1JTklNQUxfRk9OVF9GT09UUFJJTlQpLHRydWUpCitDSEVDS19FTU9KSSA6PSBmYWxzZQorZWxzZQorQ0hFQ0tfRU1PSkkgOj0gdHJ1ZQorZW5kaWYKKworZm9udGNoYWluX2xpbnRfdGltZXN0YW1wIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGZvbnRjaGFpbl9saW50KS9zdGFtcAorCisuUEhPTlk6IGZvbnRjaGFpbl9saW50Citmb250Y2hhaW5fbGludDogJChmb250Y2hhaW5fbGludF90aW1lc3RhbXApCisKK2ZvbnRjaGFpbl9saW50X2RlcHMgOj0gXAorICAgIGV4dGVybmFsL3VuaWNvZGUvRGVyaXZlZEFnZS50eHQgXAorICAgIGV4dGVybmFsL3VuaWNvZGUvZW1vamktZGF0YS50eHQgXAorICAgIGV4dGVybmFsL3VuaWNvZGUvZW1vamktc2VxdWVuY2VzLnR4dCBcCisgICAgZXh0ZXJuYWwvdW5pY29kZS9lbW9qaS12YXJpYXRpb24tc2VxdWVuY2VzLnR4dCBcCisgICAgZXh0ZXJuYWwvdW5pY29kZS9lbW9qaS16d2otc2VxdWVuY2VzLnR4dCBcCisgICAgZXh0ZXJuYWwvdW5pY29kZS9hZGRpdGlvbnMvZW1vamktZGF0YS50eHQgXAorICAgIGV4dGVybmFsL3VuaWNvZGUvYWRkaXRpb25zL2Vtb2ppLXNlcXVlbmNlcy50eHQgXAorICAgIGV4dGVybmFsL3VuaWNvZGUvYWRkaXRpb25zL2Vtb2ppLXp3ai1zZXF1ZW5jZXMudHh0IFwKKworJChmb250Y2hhaW5fbGludF90aW1lc3RhbXApOiAkKEZPTlRDSEFJTl9MSU5URVIpICQoVEFSR0VUX09VVCkvZXRjL2ZvbnRzLnhtbCAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0uaW1nICQoZm9udGNoYWluX2xpbnRfZGVwcykKKwlAZWNobyBSdW5uaW5nIGZvbnRjaGFpbiBsaW50CisJJChGT05UQ0hBSU5fTElOVEVSKSAkKFRBUkdFVF9PVVQpICQoQ0hFQ0tfRU1PSkkpIGV4dGVybmFsL3VuaWNvZGUKKwl0b3VjaCAkQApkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLXNoYXJlZC1saWJzLm1rIGIvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLXNoYXJlZC1saWJzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDUxNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL2dlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnMubWsKQEAgLTAsMCArMSw1MiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLlBIT05ZOiBnZW5lcmFsLXRlc3RzLXNoYXJlZC1saWJzCisKK2ludGVybWVkaWF0ZXNfZGlyIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGdlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnMpCisKK2dlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwIDo9ICQoUFJPRFVDVF9PVVQpL2dlbmVyYWwtdGVzdHNfaG9zdC1zaGFyZWQtbGlicy56aXAKKworIyBGaWx0ZXIgc2hhcmVkIGVudHJpZXMgYmV0d2VlbiBnZW5lcmFsLXRlc3RzIGFuZCBkZXZpY2UtdGVzdHMncyBIT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTLAorIyB0byBhdm9pZCB3YXJuaW5nIGFib3V0IG92ZXJyaWRpbmcgY29tbWFuZHMuCitteV9ob3N0X3NoYXJlZF9saWJfZm9yX2dlbmVyYWxfdGVzdHMgOj0gXAorICAkKGZvcmVhY2ggbSwkKGZpbHRlciAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpLFwKKwkgICAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSksJChjYWxsIHdvcmQtY29sb24sMiwkKG0pKSkKK215X2dlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYl9maWxlcyA6PSBcCisgICQoZmlsdGVyLW91dCAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpLFwKKwkgJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUykpCisKK215X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cyArPSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobXlfZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGliX2ZpbGVzKSkKKworJChnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCkgOiBQUklWQVRFX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlc19kaXIpCiskKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKSA6IFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyA6PSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cykKKyQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApIDogUFJJVkFURV9nZW5lcmFsX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9ICQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApCiskKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKSA6ICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9nZW5lcmFsX3Rlc3RzKSAkKFNPT05HX1pJUCkKKwlybSAtcmYgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKQorCW1rZGlyIC1wICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90b29scworCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCisJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3NoYXJlZC1saWJzLmxpc3Q7IFwKKwlkb25lCisJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9zaGFyZWQtbGlicy5saXN0ID4gJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXNoYXJlZC1saWJzLmxpc3QgfHwgdHJ1ZQorCSQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfZ2VuZXJhbF9ob3N0X3NoYXJlZF9saWJzX3ppcCkgXAorCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3Qtc2hhcmVkLWxpYnMubGlzdAorCitnZW5lcmFsLXRlc3RzLXNoYXJlZC1saWJzOiAkKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBnZW5lcmFsLXRlc3RzLXNoYXJlZC1saWJzLCAkKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKSkKKworJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApLCkKKyQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCksJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2dlbmVyYWxfdGVzdHMpLCQoUFJPRFVDVF9PVVQpLzovKQorCitpbnRlcm1lZGlhdGVzX2RpciA6PQorZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXAgOj0KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy5tayBiL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy5tawppbmRleCA4ZGJjNzZmLi5kNmZjMDcyIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2dlbmVyYWwtdGVzdHMubWsKKysrIGIvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLm1rCkBAIC0yNCw2NSArMjQsMzkgQEAKICMgQ3JlYXRlIGFuIGFydGlmYWN0IHRvIGluY2x1ZGUgYSBsaXN0IG9mIHRlc3QgY29uZmlnIGZpbGVzIGluIGdlbmVyYWwtdGVzdHMuCiBnZW5lcmFsX3Rlc3RzX2xpc3RfemlwIDo9ICQoUFJPRFVDVF9PVVQpL2dlbmVyYWwtdGVzdHNfbGlzdC56aXAKIAotIyBGaWx0ZXIgc2hhcmVkIGVudHJpZXMgYmV0d2VlbiBnZW5lcmFsLXRlc3RzIGFuZCBkZXZpY2UtdGVzdHMncyBIT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTLAotIyB0byBhdm9pZCB3YXJuaW5nIGFib3V0IG92ZXJyaWRpbmcgY29tbWFuZHMuCi1teV9ob3N0X3NoYXJlZF9saWJfZm9yX2dlbmVyYWxfdGVzdHMgOj0gXAotICAkKGZvcmVhY2ggbSwkKGZpbHRlciAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpLFwKLQkgICAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSksJChjYWxsIHdvcmQtY29sb24sMiwkKG0pKSkKLW15X2dlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYl9maWxlcyA6PSBcCi0gICQoZmlsdGVyLW91dCAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpLFwKLQkgJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUykpCi0KLW15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cyArPSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobXlfZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGliX2ZpbGVzKSkKLQogIyBDcmVhdGUgYW4gYXJ0aWZhY3QgdG8gaW5jbHVkZSBhbGwgdGVzdCBjb25maWcgZmlsZXMgaW4gZ2VuZXJhbC10ZXN0cy4KIGdlbmVyYWxfdGVzdHNfY29uZmlnc196aXAgOj0gJChQUk9EVUNUX09VVCkvZ2VuZXJhbC10ZXN0c19jb25maWdzLnppcAotIyBDcmVhdGUgYW4gYXJ0aWZhY3QgdG8gaW5jbHVkZSBhbGwgc2hhcmVkIGxpYnJhcml5IGZpbGVzIGluIGdlbmVyYWwtdGVzdHMuCi1nZW5lcmFsX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9ICQoUFJPRFVDVF9PVVQpL2dlbmVyYWwtdGVzdHNfaG9zdC1zaGFyZWQtbGlicy56aXAKIAogIyBDb3B5IGtlcm5lbCB0ZXN0IG1vZHVsZXMgdG8gdGVzdGNhc2VzIGRpcmVjdG9yaWVzCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy92dHMta2VybmVsLXRlc3RzLm1rCiBsdHBfY29weV9wYWlycyA6PSBcCiAgICQoY2FsbCB0YXJnZXQtbmF0aXZlLWNvcHktcGFpcnMsJChrZXJuZWxfbHRwX21vZHVsZXMpLCQoa2VybmVsX2x0cF9ob3N0X291dCkpCi1rc2VsZnRlc3RfY29weV9wYWlycyA6PSBcCi0gICQoY2FsbCB0YXJnZXQtbmF0aXZlLWNvcHktcGFpcnMsJChrZXJuZWxfa3NlbGZ0ZXN0X21vZHVsZXMpLCQoa2VybmVsX2tzZWxmdGVzdF9ob3N0X291dCkpCiBjb3B5X2x0cF90ZXN0cyA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobHRwX2NvcHlfcGFpcnMpKQotY29weV9rc2VsZnRlc3RfdGVzdHMgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKGtzZWxmdGVzdF9jb3B5X3BhaXJzKSkKIAotIyBQSE9OWSB0YXJnZXQgdG8gYmUgdXNlZCB0byBidWlsZCBhbmQgdGVzdCBgdnRzX2x0cF90ZXN0c2AgYW5kIGB2dHNfa3NlbGZ0ZXN0X3Rlc3RzYCB3aXRob3V0IGJ1aWxkaW5nIGZ1bGwgdnRzCisjIFBIT05ZIHRhcmdldCB0byBiZSB1c2VkIHRvIGJ1aWxkIGFuZCB0ZXN0IGB2dHNfbHRwX3Rlc3RzYCB3aXRob3V0IGJ1aWxkaW5nIGZ1bGwgdnRzCiAuUEhPTlk6IHZ0c19rZXJuZWxfbHRwX3Rlc3RzCiB2dHNfa2VybmVsX2x0cF90ZXN0czogJChjb3B5X2x0cF90ZXN0cykKIAotLlBIT05ZOiB2dHNfa2VybmVsX2tzZWxmdGVzdF90ZXN0cwotdnRzX2tlcm5lbF9rc2VsZnRlc3RfdGVzdHM6ICQoY29weV9rc2VsZnRlc3RfdGVzdHMpCitnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9nZW5lcmFsLXRlc3RzX2hvc3Qtc2hhcmVkLWxpYnMuemlwCiAKKyQoZ2VuZXJhbF90ZXN0c196aXApIDogJChnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCkKICQoZ2VuZXJhbF90ZXN0c196aXApIDogJChjb3B5X2x0cF90ZXN0cykKLSQoZ2VuZXJhbF90ZXN0c196aXApIDogJChjb3B5X2tzZWxmdGVzdF90ZXN0cykKICQoZ2VuZXJhbF90ZXN0c196aXApIDogUFJJVkFURV9LRVJORUxfTFRQX0hPU1RfT1VUIDo9ICQoa2VybmVsX2x0cF9ob3N0X291dCkKLSQoZ2VuZXJhbF90ZXN0c196aXApIDogUFJJVkFURV9LRVJORUxfS1NFTEZURVNUX0hPU1RfT1VUIDo9ICQoa2VybmVsX2tzZWxmdGVzdF9ob3N0X291dCkKICQoZ2VuZXJhbF90ZXN0c196aXApIDogUFJJVkFURV9nZW5lcmFsX3Rlc3RzX2xpc3RfemlwIDo9ICQoZ2VuZXJhbF90ZXN0c19saXN0X3ppcCkKLSQoZ2VuZXJhbF90ZXN0c196aXApIDogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKGdlbmVyYWxfdGVzdHNfbGlzdF96aXApICQoZ2VuZXJhbF90ZXN0c19jb25maWdzX3ppcCkgJChnZW5lcmFsX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKQorJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoZ2VuZXJhbF90ZXN0c19saXN0X3ppcCkgJChnZW5lcmFsX3Rlc3RzX2NvbmZpZ3NfemlwKQogJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX1RPT0xTIDo9ICQoZ2VuZXJhbF90ZXN0c190b29scykKICQoZ2VuZXJhbF90ZXN0c196aXApIDogUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUiA6PSAkKGludGVybWVkaWF0ZXNfZGlyKQotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMgOj0gJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2dlbmVyYWxfdGVzdHMpCiAkKGdlbmVyYWxfdGVzdHNfemlwKSA6IFBSSVZBVEVfZ2VuZXJhbF90ZXN0c19jb25maWdzX3ppcCA6PSAkKGdlbmVyYWxfdGVzdHNfY29uZmlnc196aXApCi0kKGdlbmVyYWxfdGVzdHNfemlwKSA6IFBSSVZBVEVfZ2VuZXJhbF9ob3N0X3NoYXJlZF9saWJzX3ppcCA6PSAkKGdlbmVyYWxfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApCi0kKGdlbmVyYWxfdGVzdHNfemlwKSA6ICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkZJTEVTKSAkKGdlbmVyYWxfdGVzdHNfdG9vbHMpICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9nZW5lcmFsX3Rlc3RzKSAkKFNPT05HX1pJUCkKKyQoZ2VuZXJhbF90ZXN0c196aXApIDogJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuRklMRVMpICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLlNPT05HX0lOU1RBTExFRF9DT01QQVRJQklMSVRZX1NVUFBPUlRfRklMRVMpICQoZ2VuZXJhbF90ZXN0c190b29scykgJChTT09OR19aSVApCiAJcm0gLXJmICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikKIAlybSAtZiAkQCAkKFBSSVZBVEVfZ2VuZXJhbF90ZXN0c19saXN0X3ppcCkKIAlta2RpciAtcCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdG9vbHMKLQllY2hvICQoc29ydCAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QKKwllY2hvICQoc29ydCAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5GSUxFUykgJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QKIAlmaW5kICQoUFJJVkFURV9LRVJORUxfTFRQX0hPU1RfT1VUKSA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QKLQlmaW5kICQoUFJJVkFURV9LRVJORUxfS1NFTEZURVNUX0hPU1RfT1VUKSA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QKIAlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QubGlzdCB8fCB0cnVlCiAJZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC5saXN0IHx8IHRydWUKIAlncmVwIC1lIC4qXFwuY29uZmlnJCQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0Lmxpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQogCWdyZXAgLWUgLipcXC5jb25maWckJCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC5saXN0ID4gJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90YXJnZXQtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQotCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCi0JICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QubGlzdDsgXAotCSAgZWNobyAkJHNoYXJlZF9saWIgPj4gJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9zaGFyZWQtbGlicy5saXN0OyBcCi0JZG9uZQotCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvc2hhcmVkLWxpYnMubGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC1zaGFyZWQtbGlicy5saXN0IHx8IHRydWUKIAljcCAtZnAgJChQUklWQVRFX1RPT0xTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3Rvb2xzLwogCSQoU09PTkdfWklQKSAtZCAtbyAkQCBcCiAJICAtUCBob3N0IC1DICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikgLUQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90b29scyBcCkBAIC05MiwyMSArNjYsMTkgQEAKIAkkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2dlbmVyYWxfdGVzdHNfY29uZmlnc196aXApIFwKIAkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXRlc3QtY29uZmlncy5saXN0IFwKIAkgIC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC10ZXN0LWNvbmZpZ3MubGlzdAotCSQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfZ2VuZXJhbF9ob3N0X3NoYXJlZF9saWJzX3ppcCkgXAotCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3Qtc2hhcmVkLWxpYnMubGlzdAogCWdyZXAgLWUgLipcXC5jb25maWckJCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QubGlzdCB8IHNlZCBzJSQoSE9TVF9PVVQpJWhvc3QlZyA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvZ2VuZXJhbC10ZXN0c19saXN0CiAJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0Lmxpc3QgfCBzZWQgcyUkKFBST0RVQ1RfT1VUKSV0YXJnZXQlZyA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2dlbmVyYWwtdGVzdHNfbGlzdAogCSQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfZ2VuZXJhbF90ZXN0c19saXN0X3ppcCkgLUMgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKSAtZiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2dlbmVyYWwtdGVzdHNfbGlzdAogCiBnZW5lcmFsLXRlc3RzOiAkKGdlbmVyYWxfdGVzdHNfemlwKQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBnZW5lcmFsLXRlc3RzLCAkKGdlbmVyYWxfdGVzdHNfemlwKSAkKGdlbmVyYWxfdGVzdHNfbGlzdF96aXApICQoZ2VuZXJhbF90ZXN0c19jb25maWdzX3ppcCkgJChnZW5lcmFsX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgZ2VuZXJhbC10ZXN0cywgJChnZW5lcmFsX3Rlc3RzX3ppcCkgJChnZW5lcmFsX3Rlc3RzX2xpc3RfemlwKSAkKGdlbmVyYWxfdGVzdHNfY29uZmlnc196aXApICQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApKQogCiAkKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChnZW5lcmFsX3Rlc3RzX3ppcCksKQotJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKGdlbmVyYWxfdGVzdHNfemlwKSwkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5GSUxFUykgJChnZW5lcmFsX3Rlc3RzX3Rvb2xzKSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cyksJChQUk9EVUNUX09VVCkvOi8pCiskKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoZ2VuZXJhbF90ZXN0c196aXApLCQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkZJTEVTKSAkKGdlbmVyYWxfdGVzdHNfdG9vbHMpLCQoUFJPRFVDVF9PVVQpLzovKQogCiBpbnRlcm1lZGlhdGVzX2RpciA6PQogZ2VuZXJhbF90ZXN0c190b29scyA6PQogZ2VuZXJhbF90ZXN0c196aXAgOj0KIGdlbmVyYWxfdGVzdHNfbGlzdF96aXAgOj0KIGdlbmVyYWxfdGVzdHNfY29uZmlnc196aXAgOj0KLWdlbmVyYWxfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXAgOj0KK2dlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwIDo9CmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2hvc3QtdW5pdC10ZXN0cy5tayBiL2NvcmUvdGFza3MvaG9zdC11bml0LXRlc3RzLm1rCmluZGV4IDczM2EyZTIuLjRjYjIzYzAgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvaG9zdC11bml0LXRlc3RzLm1rCisrKyBiL2NvcmUvdGFza3MvaG9zdC11bml0LXRlc3RzLm1rCkBAIC0yOSwxNSArMjksMjggQEAKICAgICAkKGV2YWwgX2NtZl9zcmMgOj0gJCh3b3JkIDEsJChfY21mX3R1cGxlKSkpIFwKICAgICAkKF9jbWZfc3JjKSkpCiAKK215X3N5bWxpbmtzX2Zvcl9ob3N0X3VuaXRfdGVzdHMgOj0gJChmb3JlYWNoIGYsJChDT01QQVRJQklMSVRZLmhvc3QtdW5pdC10ZXN0cy5TWU1MSU5LUyksXAorCSQoc3RyaXAgJChldmFsIF9jbWZfdHVwbGUgOj0gJChzdWJzdCA6LCAsJChmKSkpIFwKKwkkKGV2YWwgX2NtZl9kZXAgOj0gJCh3b3JkIDEsJChfY21mX3R1cGxlKSkpIFwKKwkkKGV2YWwgX2NtZl9zcmMgOj0gJCh3b3JkIDIsJChfY21mX3R1cGxlKSkpIFwKKwkkKGV2YWwgX2NtZl9kZXN0IDo9ICQod29yZCAzLCQoX2NtZl90dXBsZSkpKSBcCisJJChjYWxsIHN5bWxpbmstZmlsZSwkKF9jbWZfZGVwKSwkKF9jbWZfc3JjKSwkKF9jbWZfZGVzdCkpIFwKKwkkKF9jbWZfZGVzdCkpKQorCiAkKGhvc3RfdW5pdF90ZXN0c196aXApIDogUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTIDo9ICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9ob3N0X3VuaXRfdGVzdHMpCiAKLSQoaG9zdF91bml0X3Rlc3RzX3ppcCkgOiAkKENPTVBBVElCSUxJVFkuaG9zdC11bml0LXRlc3RzLkZJTEVTKSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfaG9zdF91bml0X3Rlc3RzKSAkKFNPT05HX1pJUCkKKyQoaG9zdF91bml0X3Rlc3RzX3ppcCkgOiBQUklWQVRFX1NZTUxJTktTIDo9ICQobXlfc3ltbGlua3NfZm9yX2hvc3RfdW5pdF90ZXN0cykKKworJChob3N0X3VuaXRfdGVzdHNfemlwKSA6ICQoQ09NUEFUSUJJTElUWS5ob3N0LXVuaXQtdGVzdHMuRklMRVMpICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9ob3N0X3VuaXRfdGVzdHMpICQobXlfc3ltbGlua3NfZm9yX2hvc3RfdW5pdF90ZXN0cykgJChTT09OR19aSVApCiAJZWNobyAkKHNvcnQgJChDT01QQVRJQklMSVRZLmhvc3QtdW5pdC10ZXN0cy5GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkQC5saXN0CiAJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALWhvc3QubGlzdCB8fCB0cnVlCiAJZWNobyAiIiA+PiAkQC1ob3N0LWxpYnMubGlzdAogCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCiAJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkQC1ob3N0LWxpYnMubGlzdDsgXAogCWRvbmUKKwkkKGhpZGUpIGZvciBzeW1saW5rIGluICQoUFJJVkFURV9TWU1MSU5LUyk7IGRvIFwKKwkgIGVjaG8gJCRzeW1saW5rID4+ICRALWhvc3QubGlzdDsgXAorCWRvbmUKIAlncmVwICQoVEFSR0VUX09VVF9URVNUQ0FTRVMpICRALmxpc3QgPiAkQC10YXJnZXQubGlzdCB8fCB0cnVlCiAJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJEAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0Lmxpc3QgXAogCSAgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICRALXRhcmdldC5saXN0IFwKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvaWRlLm1rIGIvY29yZS90YXNrcy9pZGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYWEwY2QuLjAwMDAwMDAKLS0tIGEvY29yZS90YXNrcy9pZGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1kZWZpbmUgZmlsdGVyLWlkZS1nb2FscwotJChzdHJpcCAkKGZpbHRlciAkKDEpLSUsJChNQUtFQ01ER09BTFMpKSkKLWVuZGVmCi0KLWRlZmluZSBmaWx0ZXItaWRlLW1vZHVsZXMKLSQoc3RyaXAgJChzdWJzdCAtLCQoc3BhY2UpLCQocGF0c3Vic3QgJCgxKS0lLCUsJCgyKSkpKQotZW5kZWYKLQotIyBlY2xpcHNlCi1lY2xpcHNlX3Byb2plY3RfZ29hbHMgOj0gJChjYWxsIGZpbHRlci1pZGUtZ29hbHMsRUNMSVBTRSkKLWlmZGVmIGVjbGlwc2VfcHJvamVjdF9nb2FscwotICBpZm5lcSAoJCh3b3JkcyAkKGVjbGlwc2VfcHJvamVjdF9nb2FscykpLDEpCi0gICAgJChlcnJvciBPbmx5IG9uZSBFQ0xJUFNFLSBnb2FsIG1heSBiZSBzcGVjaWZpZWQ6ICQoZWNsaXBzZV9wcm9qZWN0X2dvYWxzKSkKLSAgZW5kaWYKLSAgZWNsaXBzZV9wcm9qZWN0X21vZHVsZXMgOj0gJChjYWxsIGZpbHRlci1pZGUtbW9kdWxlcyxFQ0xJUFNFLCQoZWNsaXBzZV9wcm9qZWN0X2dvYWxzKSkKLQotICBpZm5lcSAoJChmaWx0ZXIgbHVuY2gsJChlY2xpcHNlX3Byb2plY3RfbW9kdWxlcykpLCkKLSAgICBlY2xpcHNlX3Byb2plY3RfbW9kdWxlcyA6PSAkKGZpbHRlci1vdXQgbHVuY2gsJChlY2xpcHNlX3Byb2plY3RfbW9kdWxlcykpCi0gICAgaW5zdGFsbGVkX21vZHVsZXMgOj0gJChmb3JlYWNoIG0sJChBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyksXAotICAgICAgICAkKElOU1RBTExBQkxFX0ZJTEVTLiQobSkuTU9EVUxFKSkKLSAgICBqYXZhX21vZHVsZXMgOj0gJChmb3JlYWNoIG0sJChpbnN0YWxsZWRfbW9kdWxlcyksXAotICAgICAgICAkKGlmICQoZmlsdGVyIEpBVkFfTElCUkFSSUVTIEFQUFMsJChBTExfTU9EVUxFUy4kKG0pLkNMQVNTKSksJChtKSwpKQotICAgIGVjbGlwc2VfcHJvamVjdF9tb2R1bGVzIDo9ICQoc29ydCAkKGVjbGlwc2VfcHJvamVjdF9tb2R1bGVzKSAkKGphdmFfbW9kdWxlcykpCi0gIGVuZGlmCi0KLSAgc291cmNlX3BhdGhzIDo9ICQoZm9yZWFjaCBtLCQoZWNsaXBzZV9wcm9qZWN0X21vZHVsZXMpLCQoQUxMX01PRFVMRVMuJChtKS5QQVRIKSkgXAotICAgICAgICAgICAgICAkKGZvcmVhY2ggbSwkKGVjbGlwc2VfcHJvamVjdF9tb2R1bGVzKSwkKEFMTF9NT0RVTEVTLiQobSkuSU5URVJNRURJQVRFX1NPVVJDRV9ESVIpKQotICBzb3VyY2VfcGF0aHMgOj0gJChzb3J0ICQoc291cmNlX3BhdGhzKSkKLQotLmNsYXNzcGF0aDogUFJJVkFURV9NT0RVTEVTIDo9ICQoZWNsaXBzZV9wcm9qZWN0X21vZHVsZXMpCi0uY2xhc3NwYXRoOiBQUklWQVRFX0RJUlMgOj0gJChzb3VyY2VfcGF0aHMpCi0KLSMgdGhlIG1lc3MgYmVsb3cgd2l0aCAuL3NyYyB0cmllcyB0byBndWVzcyB3aGV0aGVyIHRoZSBzcmMKLSQoZWNsaXBzZV9wcm9qZWN0X2dvYWxzKTogLmNsYXNzcGF0aAotLmNsYXNzcGF0aDogRk9SQ0UKLQkkKGhpZGUpIGVjaG8gR2VuZXJhdGluZyAuY2xhc3NwYXRoIGZvciBlY2xpcHNlCi0JJChoaWRlKSBlY2hvICc8Y2xhc3NwYXRoPicgPiAkQAotCSQoaGlkZSkgZm9yIHAgaW4gJChQUklWQVRFX0RJUlMpIDsgZG8gXAotCQllY2hvIC1uICcgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IicgPj4gJEAgOyBcCi0JCSggaWYgWyAtZCAkJHAvc3JjIF0gOyB0aGVuIGVjaG8gLW4gJCRwL3NyYyA7IGVsc2UgZWNobyAtbiAkJHAgOyBmaSApID4+ICRAIDsgXAotCQllY2hvICciLz4nID4+ICRAIDsgXAotCWRvbmUKLQkkKGhpZGUpIGVjaG8gJzwvY2xhc3NwYXRoPicgPj4gJEAKLWVuZGlmCi0KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvbWN0cy5tayBiL2NvcmUvdGFza3MvbWN0cy5tawppbmRleCA2YTU2MjI4Li4wOWE0MTkxIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL21jdHMubWsKKysrIGIvY29yZS90YXNrcy9tY3RzLm1rCkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjAsMTMgKzIwLDEzIEBACiAkKGZvcmVhY2ggbW9kdWxlLCAkKG10c19tb2R1bGVzKSwgJChldmFsIG1jdHNfdGVzdF9zdWl0ZXMgKz0gbWN0cy0kKG1vZHVsZSkpKQogCiAkKGZvcmVhY2ggc3VpdGUsICQobWN0c190ZXN0X3N1aXRlcyksIFwKLSAgICAgICAgJChldmFsIHRlc3Rfc3VpdGVfbmFtZSA6PSAkKHN1aXRlKSkgXAotICAgICAgICAkKGV2YWwgdGVzdF9zdWl0ZV90cmFkZWZlZCA6PSBtdHMtdHJhZGVmZWQpIFwKLSAgICAgICAgJChldmFsIHRlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3QvbXRzL1JFQURNRS5tZCkgXAotICAgICAgICAkKGV2YWwgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5taykgXAotICAgICAgICAkKGV2YWwgLlBIT05ZOiAkKHN1aXRlKSkgXAotICAgICAgICAkKGV2YWwgJChzdWl0ZSk6ICQoY29tcGF0aWJpbGl0eV96aXApKSBcCi0gICAgICAgICQoZXZhbCAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsICQoc3VpdGUpLCAkKGNvbXBhdGliaWxpdHlfemlwKSkpIFwKKwkkKGV2YWwgdGVzdF9zdWl0ZV9uYW1lIDo9ICQoc3VpdGUpKSBcCisJJChldmFsIHRlc3Rfc3VpdGVfdHJhZGVmZWQgOj0gbXRzLXRyYWRlZmVkKSBcCisJJChldmFsIHRlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3QvbXRzL1JFQURNRS5tZCkgXAorCSQoZXZhbCBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rKSBcCisJJChldmFsIC5QSE9OWTogJChzdWl0ZSkpIFwKKwkkKGV2YWwgJChzdWl0ZSk6ICQoY29tcGF0aWJpbGl0eV96aXApKSBcCisJJChldmFsICQoY2FsbCBkaXN0LWZvci1nb2FscywgJChzdWl0ZSksICQoY29tcGF0aWJpbGl0eV96aXApKSkgXAogKQogCiBlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9tZXRhLWxpYy5tayBiL2NvcmUvdGFza3MvbWV0YS1saWMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzNTdlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvbWV0YS1saWMubWsKQEAgLTAsMCArMSwxOTMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgRGVjbGFyZSBsaWNlbnNlIG1ldGFkYXRhIGZvciBub24tbW9kdWxlIGZpbGVzIHJlbGVhc2VkIHdpdGggcHJvZHVjdHMuCisKKyMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nZW5lcmljL2Nhci9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9jYXIsKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dlbmVyaWMvdHJ1c3R5L0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL3RydXN0eSwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBkZXZpY2UvZ2VuZXJpYy91bWwvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvdW1sLCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nb29nbGVfY2FyL2NvbW1vbi9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlX2Nhci9jb21tb24sKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dvb2dsZS9hdHYvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9hdHYsYXR2LWNvbXBvbmVudC1vdmVycmlkZXMueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvYXR2LHR2X2NvcmVfaGFyZHdhcmUueG1sKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dvb2dsZS9icmFtYmxlL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLGRlZmF1bHQtcGVybWlzc2lvbnMueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLGxpYm5mYy1uY2kuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSxmc3RhYi5wb3N0aW5zdGFsbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSx1ZXZlbnRkLnJjLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JyYW1ibGUsaGFscy5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLG1lZGlhX3Byb2ZpbGVzX1YxXzAueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLG1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JyYW1ibGUsZGV2aWNlX3N0YXRlX2NvbmZpZ3VyYXRpb24ueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLHRhc2tfcHJvZmlsZXMuanNvbixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSxwMnBfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JyYW1ibGUsd3BhX3N1cHBsaWNhbnRfb3ZlcmxheS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9icmFtYmxlLGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nb29nbGUvYmFyYmV0L0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsZGVmYXVsdC1wZXJtaXNzaW9ucy54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JhcmJldCxsaWJuZmMtbmNpLmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JhcmJldCxmc3RhYi5wb3N0aW5zdGFsbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYmFyYmV0LHVldmVudGQucmMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JhcmJldCx3cGFfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsaGFscy5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsbWVkaWFfcHJvZmlsZXNfVjFfMC54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JhcmJldCxtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsZGV2aWNlX3N0YXRlX2NvbmZpZ3VyYXRpb24ueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsdGFza19wcm9maWxlcy5qc29uLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQscDJwX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYmFyYmV0LHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JhcmJldCx3cGFfc3VwcGxpY2FudF9vdmVybGF5LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2JhcmJldCxhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBkZXZpY2UvZ29vZ2xlL2NvcmFsL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jb3JhbCxkZWZhdWx0LXBlcm1pc3Npb25zLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsbGlibmZjLW5jaS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jb3JhbCxmc3RhYi5wb3N0aW5zdGFsbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsdWV2ZW50ZC5yYyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsd3BhX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsaGFscy5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jb3JhbCxtZWRpYV9wcm9maWxlc19WMV8wLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsbWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsZGV2aWNlX3N0YXRlX2NvbmZpZ3VyYXRpb24ueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jb3JhbCx0YXNrX3Byb2ZpbGVzLmpzb24sU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2NvcmFsLHAycF9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2NvcmFsLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2NvcmFsLHdwYV9zdXBwbGljYW50X292ZXJsYXkuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsZGlzcGxheV8xOTI2MTEzMjU1MDY1NDU5My54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2NvcmFsLGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2NvcmFsLGRpc3BsYXlfMTkyNjA1MDQ1NzUwOTA4MTcueG1sKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dvb2dsZS9nczEwMS9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsZGVmYXVsdC1wZXJtaXNzaW9ucy54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLGxpYm5mYy1uY2kuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsZnN0YWIucG9zdGluc3RhbGwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLHVldmVudGQucmMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLGhhbHMuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsbWVkaWFfcHJvZmlsZXNfVjFfMC54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLG1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLGRldmljZV9zdGF0ZV9jb25maWd1cmF0aW9uLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsdGFza19wcm9maWxlcy5qc29uLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9nczEwMSxwMnBfc3VwcGxpY2FudF9vdmVybGF5LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLHdwYV9zdXBwbGljYW50X292ZXJsYXkuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCisKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvZ3MxMDEsYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sKSkKKworIyBNb3ZlIGhlcmUgZnJvbSBkZXZpY2UvZ29vZ2xlL3JhdmlvbGUvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsZGVmYXVsdC1wZXJtaXNzaW9ucy54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsbGlibmZjLW5jaS1yYXZlbi5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yYXZpb2xlLGxpYm5mYy1uY2kuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmF2aW9sZSxmc3RhYi5wb3N0aW5zdGFsbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmF2aW9sZSx1ZXZlbnRkLnJjLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yYXZpb2xlLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsaGFscy5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yYXZpb2xlLG1lZGlhX3Byb2ZpbGVzX1YxXzAueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yYXZpb2xlLG1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsZGV2aWNlX3N0YXRlX2NvbmZpZ3VyYXRpb24ueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yYXZpb2xlLHRhc2tfcHJvZmlsZXMuanNvbixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmF2aW9sZSxwMnBfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yYXZpb2xlLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsd3BhX3N1cHBsaWNhbnRfb3ZlcmxheS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9yYXZpb2xlLGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nb29nbGUvcmVkZmluL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yZWRmaW4sZGVmYXVsdC1wZXJtaXNzaW9ucy54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbixsaWJuZmMtbmNpLmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbixmc3RhYi5wb3N0aW5zdGFsbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmVkZmluLHVldmVudGQucmMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbix3cGFfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yZWRmaW4saGFscy5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yZWRmaW4sbWVkaWFfcHJvZmlsZXNfVjFfMC54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbixtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yZWRmaW4sZGV2aWNlX3N0YXRlX2NvbmZpZ3VyYXRpb24ueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yZWRmaW4sdGFza19wcm9maWxlcy5qc29uLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yZWRmaW4scDJwX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmVkZmluLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbix3cGFfc3VwcGxpY2FudF9vdmVybGF5LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL3JlZGZpbixhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBkZXZpY2Uvc2FtcGxlL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9zYW1wbGUsKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dvb2dsZS90cm91dC9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL3Ryb3V0LCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGZyYW1ld29ya3MvYXYvbWVkaWEvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzLGF1ZGlvX2VmZmVjdHMuY29uZikpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMsYXVkaW9fZWZmZWN0cy54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3ksKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZnJhbWV3b3Jrcy9iYXNlL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGZyYW1ld29ya3MvYmFzZSwub2dnKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGZyYW1ld29ya3MvYmFzZSwua2wpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9iYXNlLC5rY20pKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9iYXNlLC5pZGMpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9iYXNlLGRpcnR5LWltYWdlLW9iamVjdHMpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9iYXNlL2NvbmZpZywpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YSwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBoYXJkd2FyZS9nb29nbGUvY2FtZXJhL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGhhcmR3YXJlL2dvb2dsZS9jYW1lcmEsKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gaGFyZHdhcmUvaW50ZXJmYWNlcy90di9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxoYXJkd2FyZS9pbnRlcmZhY2VzL3R2LHR1bmVyX3Z0c19jb25maWdfMV8wLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxoYXJkd2FyZS9pbnRlcmZhY2VzL3R2LHR1bmVyX3Z0c19jb25maWdfMV8xLnhtbCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2lucHV0LCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC93aWZpLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jYW1lcmEsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLGhhbHMuY29uZikpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxpbml0LnFlbXUtYWRiLWtleXMuc2gpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsaW5pdC5zeXN0ZW1fZXh0LnJjKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLC5qc29uKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLHVldmVudGQucmMpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsd3BhX3N1cHBsaWNhbnQuY29uZikpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxtZWRpYV9wcm9maWxlc19WMV8wLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxpbml0LnJhbmNodS5yYykpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxmc3RhYi5yYW5jaHUpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsZGlzcGxheV9zZXR0aW5ncy54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsZGlzcGxheV9zZXR0aW5nc19mcmVlZm9ybS54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsZGV2aWNlX3N0YXRlX2NvbmZpZ3VyYXRpb24ueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLGluaXQucmFuY2h1LWNvcmUuc2gpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsaW5pdC5yYW5jaHUtbmV0LnNoKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIHBhY2thZ2VzL3NlcnZpY2VzL0Nhci9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxwYWNrYWdlcy9zZXJ2aWNlcy9DYXIsKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5L0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGhhcmR3YXJlL2xpYmhhcmR3YXJlX2xlZ2FjeSwpKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9tb2R1bGUtaW5mby5tayBiL2NvcmUvdGFza3MvbW9kdWxlLWluZm8ubWsKaW5kZXggZTgzZDQwOC4uNzU5MzY2OCAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9tb2R1bGUtaW5mby5taworKysgYi9jb3JlL3Rhc2tzL21vZHVsZS1pbmZvLm1rCkBAIC0yLDQwICsyLDYwIEBACiAjIEN1cnJlbnRseSBydW50aW1lX2RlcGVuZGVuY2llcyBvbmx5IGluY2x1ZGUgdGhlIHJ1bnRpbWUgbGlicyBpbmZvcm1hdGlvbiBmb3IgY2MgYmluYXJpZXMuCiAKIE1PRFVMRV9JTkZPX0pTT04gOj0gJChQUk9EVUNUX09VVCkvbW9kdWxlLWluZm8uanNvbgorQ09NTUEgOj0gLAorX05FV0xJTkUgOj0gJ1xuJwogCi0kKE1PRFVMRV9JTkZPX0pTT04pOgorZGVmaW5lIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdAorJChpZiAkKHN0cmlwICQoMikpLCckKENPTU1BKSQoc3RyaXAgJCgxKSk6IFskKEtBVElfZm9yZWFjaF9zZXAgdywkKENPTU1BKSAsJCgyKSwiJCh3KSIpXScpCitlbmRlZgorCitkZWZpbmUgd3JpdGUtb3B0aW9uYWwtanNvbi1ib29sCiskKGlmICQoc3RyaXAgJCgyKSksJyQoQ09NTUEpJChzdHJpcCAkKDEpKTogIiQoc3RyaXAgJCgyKSkiJykKK2VuZGVmCisKK1NPT05HX01PRFVMRV9JTkZPIDo9ICQoU09PTkdfT1VUX0RJUikvbW9kdWxlLWluZm8tJChUQVJHRVRfUFJPRFVDVCkuanNvbgorCiskKE1PRFVMRV9JTkZPX0pTT04pOiBQUklWQVRFX1NPT05HX01PRFVMRV9JTkZPIDo9ICQoU09PTkdfTU9EVUxFX0lORk8pCiskKE1PRFVMRV9JTkZPX0pTT04pOiBQUklWQVRFX01FUkdFX0pTT05fT0JKRUNUUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9tZXJnZV9tb2R1bGVfaW5mb19qc29uCiskKE1PRFVMRV9JTkZPX0pTT04pOiAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9tZXJnZV9tb2R1bGVfaW5mb19qc29uCiskKE1PRFVMRV9JTkZPX0pTT04pOiAkKFNPT05HX01PRFVMRV9JTkZPKQogCUBlY2hvIEdlbmVyYXRpbmcgJEAKLQkkKGhpZGUpIGVjaG8gLW5lICd7XG4gJyA+ICRACi0JJChoaWRlKSBlY2hvIC1uZSAkKGZvcmVhY2ggbSwgJChzb3J0ICQoQUxMX01PRFVMRVMpKSwgXAotCQknICIkKG0pIjogeycgXAotCQkJJyJjbGFzcyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLkNMQVNTKSksIiQodykiLCApXSwgJyBcCi0JCQknInBhdGgiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5QQVRIKSksIiQodykiLCApXSwgJyBcCi0JCQknInRhZ3MiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5UQUdTKSksIiQodykiLCApXSwgJyBcCi0JCQknImluc3RhbGxlZCI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLklOU1RBTExFRCkpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJjb21wYXRpYmlsaXR5X3N1aXRlcyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLkNPTVBBVElCSUxJVFlfU1VJVEVTKSksIiQodykiLCApXSwgJyBcCi0JCQknImF1dG9fdGVzdF9jb25maWciOiBbJChBTExfTU9EVUxFUy4kKG0pLmF1dG9fdGVzdF9jb25maWcpXSwgJyBcCi0JCQknIm1vZHVsZV9uYW1lIjogIiQoQUxMX01PRFVMRVMuJChtKS5NT0RVTEVfTkFNRSkiLCAnIFwKLQkJCScidGVzdF9jb25maWciOiBbJChmb3JlYWNoIHcsJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobSkuVEVTVF9DT05GSUcpICQoQUxMX01PRFVMRVMuJChtKS5FWFRSQV9URVNUX0NPTkZJR1MpKSwiJCh3KSIsICldLCAnIFwKLQkJCSciZGVwZW5kZW5jaWVzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9ERVBTLiQobSkuQUxMX0RFUFMpKSwiJCh3KSIsICldLCAnIFwKLQkJCScic2hhcmVkX2xpYnMiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5TSEFSRURfTElCUykpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJzeXN0ZW1fc2hhcmVkX2xpYnMiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5TWVNURU1fU0hBUkVEX0xJQlMpKSwiJCh3KSIsICldLCAnIFwKLQkJCScic3JjcyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlNSQ1MpKSwiJCh3KSIsICldLCAnIFwKLQkJCScic3JjamFycyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlNSQ0pBUlMpKSwiJCh3KSIsICldLCAnIFwKLQkJCSciY2xhc3Nlc19qYXIiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5DTEFTU0VTX0pBUikpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJ0ZXN0X21haW5saW5lX21vZHVsZXMiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5URVNUX01BSU5MSU5FX01PRFVMRVMpKSwiJCh3KSIsICldLCAnIFwKLQkJCSciaXNfdW5pdF90ZXN0IjogIiQoQUxMX01PRFVMRVMuJChtKS5JU19VTklUX1RFU1QpIiwgJyBcCi0JCQknInRlc3Rfb3B0aW9uc190YWdzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuVEVTVF9PUFRJT05TX1RBR1MpKSwiJCh3KSIsICldLCAnIFwKLQkJCSciZGF0YSI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlRFU1RfREFUQSkpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJydW50aW1lX2RlcGVuZGVuY2llcyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLkxPQ0FMX1JVTlRJTUVfTElCUkFSSUVTKSksIiQodykiLCApXSwgJyBcCi0JCQknInN0YXRpY19kZXBlbmRlbmNpZXMiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5MT0NBTF9TVEFUSUNfTElCUkFSSUVTKSksIiQodykiLCApXSwgJyBcCi0JCQknImRhdGFfZGVwZW5kZW5jaWVzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuVEVTVF9EQVRBX0JJTlMpKSwiJCh3KSIsICldLCAnIFwKLQkJCScic3VwcG9ydGVkX3ZhcmlhbnRzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuU1VQUE9SVEVEX1ZBUklBTlRTKSksIiQodykiLCApXSwgJyBcCi0JCQknImhvc3RfZGVwZW5kZW5jaWVzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuSE9TVF9SRVFVSVJFRF9GUk9NX1RBUkdFVCkpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJ0YXJnZXRfZGVwZW5kZW5jaWVzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuVEFSR0VUX1JFUVVJUkVEX0ZST01fSE9TVCkpLCIkKHcpIiwgKV0sICcgXAotCQkJJ30sXG4nIFwKLQkgKSB8IHNlZCAtZSAncy8sICpcXS9dL2cnIC1lICdzLywgKlx9LyB9L2cnIC1lICckJHMvLCQkLy8nID4+ICRACi0JJChoaWRlKSBlY2hvICd9JyA+PiAkQAorCSQoaGlkZSkgZWNobyAtbmUgJ3tcbiAnID4gJEAudG1wCisJJChoaWRlKSBlY2hvIC1uZSAkKEtBVElfZm9yZWFjaF9zZXAgbSwkKENPTU1BKSQoX05FV0xJTkUpLCAkKHNvcnQgJChBTExfTUFLRV9NT0RVTEVfSU5GT19KU09OX01PRFVMRVMpKSxcCisJCSciJChtKSI6IHsnIFwKKwkJCScibW9kdWxlX25hbWUiOiAiJChBTExfTU9EVUxFUy4kKG0pLk1PRFVMRV9OQU1FKSInIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJjbGFzcyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuQ0xBU1MpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInBhdGgiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlBBVEgpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInRhZ3MiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlRBR1MpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgImluc3RhbGxlZCIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJjb21wYXRpYmlsaXR5X3N1aXRlcyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuQ09NUEFUSUJJTElUWV9TVUlURVMpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgImF1dG9fdGVzdF9jb25maWciLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLmF1dG9fdGVzdF9jb25maWcpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInRlc3RfY29uZmlnIiwgJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobSkuVEVTVF9DT05GSUcpICQoQUxMX01PRFVMRVMuJChtKS5FWFRSQV9URVNUX0NPTkZJR1MpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgImRlcGVuZGVuY2llcyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuQUxMX0RFUFMpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInJlcXVpcmVkIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5SRVFVSVJFRF9GUk9NX1RBUkdFVCkpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAic2hhcmVkX2xpYnMiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlNIQVJFRF9MSUJTKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJzdGF0aWNfbGlicyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuU1RBVElDX0xJQlMpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInN5c3RlbV9zaGFyZWRfbGlicyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuU1lTVEVNX1NIQVJFRF9MSUJTKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJzcmNzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5TUkNTKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJzcmNqYXJzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5TUkNKQVJTKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJjbGFzc2VzX2phciIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuQ0xBU1NFU19KQVIpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInRlc3RfbWFpbmxpbmVfbW9kdWxlcyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuVEVTVF9NQUlOTElORV9NT0RVTEVTKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWJvb2wsICJpc191bml0X3Rlc3QiLCAkKEFMTF9NT0RVTEVTLiQobSkuSVNfVU5JVF9URVNUKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInRlc3Rfb3B0aW9uc190YWdzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5URVNUX09QVElPTlNfVEFHUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAiZGF0YSIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuVEVTVF9EQVRBKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJydW50aW1lX2RlcGVuZGVuY2llcyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuTE9DQUxfUlVOVElNRV9MSUJSQVJJRVMpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInN0YXRpY19kZXBlbmRlbmNpZXMiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLkxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgImRhdGFfZGVwZW5kZW5jaWVzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5URVNUX0RBVEFfQklOUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAic3VwcG9ydGVkX3ZhcmlhbnRzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5TVVBQT1JURURfVkFSSUFOVFMpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgImhvc3RfZGVwZW5kZW5jaWVzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5IT1NUX1JFUVVJUkVEX0ZST01fVEFSR0VUKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJ0YXJnZXRfZGVwZW5kZW5jaWVzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5UQVJHRVRfUkVRVUlSRURfRlJPTV9IT1NUKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWJvb2wsICJ0ZXN0X21vZHVsZV9jb25maWdfYmFzZSIsICQoQUxMX01PRFVMRVMuJChtKS5URVNUX01PRFVMRV9DT05GSUdfQkFTRSkpIFwKKwkJJ30nKSdcbn1cbicgPj4gJEAudG1wCisJJChQUklWQVRFX01FUkdFX0pTT05fT0JKRUNUUykgLW8gJEAgJChQUklWQVRFX1NPT05HX01PRFVMRV9JTkZPKSAkQC50bXAKKwlybSAkQC50bXAKIAorLlBIT05ZOiBtb2R1bGUtaW5mbworbW9kdWxlLWluZm86ICQoTU9EVUxFX0lORk9fSlNPTikKIAogZHJvaWRjb3JlLXVuYnVuZGxlZDogJChNT0RVTEVfSU5GT19KU09OKQogCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL29mZmxpbmUtc2RrLWRvY3MubWsgYi9jb3JlL3Rhc2tzL29mZmxpbmUtc2RrLWRvY3MubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllODAwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3Mvb2ZmbGluZS1zZGstZG9jcy5tawpAQCAtMCwwICsxLDI2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIHNkay5hdHJlZSBuZWVkcyB0byBjb3B5IHRoZSB3aG9sZSBkaXI6ICQoT1VUX0RPQ1MpL29mZmxpbmUtc2RrIHRvIHRoZSBmaW5hbCB6aXAuCisjIFNvIGtlZXAgb2ZmbGluZS1zZGstdGltZXN0YW1wIHRhcmdldCBoZXJlLCBhbmQgdW56aXAgb2ZmbGluZS1zZGstZG9jcy56aXAgdG8KKyMgJChPVVRfRE9DUykvb2ZmbGluZS1zZGsuCiskKE9VVF9ET0NTKS9vZmZsaW5lLXNkay10aW1lc3RhbXA6ICQoT1VUX0RPQ1MpL29mZmxpbmUtc2RrLWRvY3MtZG9jcy56aXAKKwkkKGhpZGUpIHJtIC1yZiAkKE9VVF9ET0NTKS9vZmZsaW5lLXNkaworCSQoaGlkZSkgbWtkaXIgLXAgJChPVVRfRE9DUykvb2ZmbGluZS1zZGsKKwkoIHVuemlwIC1xbyAkPCAtZCAkKE9VVF9ET0NTKS9vZmZsaW5lLXNkayAmJiB0b3VjaCAtZiAkQCApIHx8IGV4aXQgMQorCisuUEhPTlk6IGRvY3Mgb2ZmbGluZS1zZGstZG9jcworZG9jcyBvZmZsaW5lLXNkay1kb2NzOiAkKE9VVF9ET0NTKS9vZmZsaW5lLXNkay10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvcGVyZm9ybWFuY2UtdGVzdHMubWsgYi9jb3JlL3Rhc2tzL3BlcmZvcm1hbmNlLXRlc3RzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDI3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL3BlcmZvcm1hbmNlLXRlc3RzLm1rCkBAIC0wLDAgKzEsNTYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworLlBIT05ZOiBwZXJmb3JtYW5jZS10ZXN0cworCitwZXJmb3JtYW5jZV90ZXN0c196aXAgOj0gJChQUk9EVUNUX09VVCkvcGVyZm9ybWFuY2UtdGVzdHMuemlwCisjIENyZWF0ZSBhbiBhcnRpZmFjdCB0byBpbmNsdWRlIGEgbGlzdCBvZiB0ZXN0IGNvbmZpZyBmaWxlcyBpbiBwZXJmb3JtYW5jZS10ZXN0cy4KK3BlcmZvcm1hbmNlX3Rlc3RzX2xpc3RfemlwIDo9ICQoUFJPRFVDVF9PVVQpL3BlcmZvcm1hbmNlLXRlc3RzX2xpc3QuemlwCisjIENyZWF0ZSBhbiBhcnRpZmFjdCB0byBpbmNsdWRlIGFsbCB0ZXN0IGNvbmZpZyBmaWxlcyBpbiBwZXJmb3JtYW5jZS10ZXN0cy4KK3BlcmZvcm1hbmNlX3Rlc3RzX2NvbmZpZ3NfemlwIDo9ICQoUFJPRFVDVF9PVVQpL3BlcmZvcm1hbmNlLXRlc3RzX2NvbmZpZ3MuemlwCisKKyQocGVyZm9ybWFuY2VfdGVzdHNfemlwKSA6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChwZXJmb3JtYW5jZV90ZXN0c19saXN0X3ppcCkgJChwZXJmb3JtYW5jZV90ZXN0c19jb25maWdzX3ppcCkKKyQocGVyZm9ybWFuY2VfdGVzdHNfemlwKSA6IFBSSVZBVEVfcGVyZm9ybWFuY2VfdGVzdHNfbGlzdF96aXAgOj0gJChwZXJmb3JtYW5jZV90ZXN0c19saXN0X3ppcCkKKyQocGVyZm9ybWFuY2VfdGVzdHNfemlwKSA6IFBSSVZBVEVfcGVyZm9ybWFuY2VfdGVzdHNfY29uZmlnc196aXAgOj0gJChwZXJmb3JtYW5jZV90ZXN0c19jb25maWdzX3ppcCkKKyQocGVyZm9ybWFuY2VfdGVzdHNfemlwKSA6IFBSSVZBVEVfcGVyZm9ybWFuY2VfdGVzdHNfbGlzdCA6PSAkKFBST0RVQ1RfT1VUKS9wZXJmb3JtYW5jZS10ZXN0c19saXN0CiskKHBlcmZvcm1hbmNlX3Rlc3RzX3ppcCkgOiAkKENPTVBBVElCSUxJVFkucGVyZm9ybWFuY2UtdGVzdHMuRklMRVMpICQoU09PTkdfWklQKQorCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5wZXJmb3JtYW5jZS10ZXN0cy5GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkQC5saXN0CisJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALWhvc3QubGlzdCB8fCB0cnVlCisJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALWhvc3QubGlzdCA+ICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQorCWdyZXAgJChUQVJHRVRfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALXRhcmdldC5saXN0IHx8IHRydWUKKwlncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtdGFyZ2V0Lmxpc3QgPiAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQorCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC5saXN0IC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkQC10YXJnZXQubGlzdCAtc2hhMjU2CisJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX3BlcmZvcm1hbmNlX3Rlc3RzX2NvbmZpZ3NfemlwKSBcCisJICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgXAorCSAgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICRALXRhcmdldC10ZXN0LWNvbmZpZ3MubGlzdAorCXJtIC1mICQoUFJJVkFURV9wZXJmb3JtYW5jZV90ZXN0c19saXN0KQorCSQoaGlkZSkgZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALWhvc3QubGlzdCB8IHNlZCBzJSQoSE9TVF9PVVQpJWhvc3QlZyA+ICQoUFJJVkFURV9wZXJmb3JtYW5jZV90ZXN0c19saXN0KQorCSQoaGlkZSkgZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALXRhcmdldC5saXN0IHwgc2VkIHMlJChQUk9EVUNUX09VVCkldGFyZ2V0JWcgPj4gJChQUklWQVRFX3BlcmZvcm1hbmNlX3Rlc3RzX2xpc3QpCisJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX3BlcmZvcm1hbmNlX3Rlc3RzX2xpc3RfemlwKSAtQyAkKGRpciAkQCkgLWYgJChQUklWQVRFX3BlcmZvcm1hbmNlX3Rlc3RzX2xpc3QpCisJcm0gLWYgJEAubGlzdCAkQC1ob3N0Lmxpc3QgJEAtdGFyZ2V0Lmxpc3QgJEAtaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QgXAorCSAgJChQUklWQVRFX3BlcmZvcm1hbmNlX3Rlc3RzX2xpc3QpCisKK3BlcmZvcm1hbmNlLXRlc3RzOiAkKHBlcmZvcm1hbmNlX3Rlc3RzX3ppcCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgcGVyZm9ybWFuY2UtdGVzdHMsICQocGVyZm9ybWFuY2VfdGVzdHNfemlwKSAkKHBlcmZvcm1hbmNlX3Rlc3RzX2xpc3RfemlwKSAkKHBlcmZvcm1hbmNlX3Rlc3RzX2NvbmZpZ3NfemlwKSkKKworJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQocGVyZm9ybWFuY2VfdGVzdHNfemlwKSwpCiskKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQocGVyZm9ybWFuY2VfdGVzdHNfemlwKSwkKENPTVBBVElCSUxJVFkucGVyZm9ybWFuY2UtdGVzdHMuRklMRVMpLCQoUFJPRFVDVF9PVVQpLzovKQorCit0ZXN0czogcGVyZm9ybWFuY2UtdGVzdHMKKworIyBSZXNldCB0ZW1wIHZhcnMKK3BlcmZvcm1hbmNlX3Rlc3RzX3ppcCA6PQorcGVyZm9ybWFuY2VfdGVzdHNfbGlzdF96aXAgOj0KK3BlcmZvcm1hbmNlX3Rlc3RzX2NvbmZpZ3NfemlwIDo9CmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Nkay1hZGRvbi5tayBiL2NvcmUvdGFza3Mvc2RrLWFkZG9uLm1rCmluZGV4IDUwOTdmMTIuLjJmZDRjZTkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3Mvc2RrLWFkZG9uLm1rCisrKyBiL2NvcmUvdGFza3Mvc2RrLWFkZG9uLm1rCkBAIC0xOSwxMiArMTksMTMgQEAKIGFkZG9uX25hbWUgOj0gJChQUk9EVUNUX1NES19BRERPTl9OQU1FKQogaWZuZXEgKCQoYWRkb25fbmFtZSksKQogCi1hZGRvbl9kaXJfbGVhZiAgOj0gJChhZGRvbl9uYW1lKS0kKEZJTEVfTkFNRV9UQUcpLSQoSU5URVJOQUxfU0RLX0hPU1RfT1NfTkFNRSkKLWFkZG9uX2Rpcl9pbWcgICA6PSAkKGFkZG9uX2Rpcl9sZWFmKS1pbWcKLWludGVybWVkaWF0ZXMgICA6PSAkKEhPU1RfT1VUX0lOVEVSTUVESUFURVMpL1NES19BRERPTi8kKGFkZG9uX25hbWUpX2ludGVybWVkaWF0ZXMKLWZ1bGxfdGFyZ2V0ICAgICA6PSAkKEhPU1RfT1VUX1NES19BRERPTikvJChhZGRvbl9kaXJfbGVhZikuemlwCi1mdWxsX3RhcmdldF9pbWcgOj0gJChIT1NUX09VVF9TREtfQURET04pLyQoYWRkb25fZGlyX2ltZykuemlwCi1zdGFnaW5nICAgICAgICAgOj0gJChpbnRlcm1lZGlhdGVzKQorYWRkb25fZGlyX2xlYWYgICAgICAgIDo9ICQoYWRkb25fbmFtZSktJChJTlRFUk5BTF9TREtfSE9TVF9PU19OQU1FKQorYWRkb25fZGlyX2ltZyAgICAgICAgIDo9ICQoYWRkb25fZGlyX2xlYWYpLWltZworaW50ZXJtZWRpYXRlcyAgICAgICAgIDo9ICQoSE9TVF9PVVRfSU5URVJNRURJQVRFUykvU0RLX0FERE9OLyQoYWRkb25fbmFtZSlfaW50ZXJtZWRpYXRlcworZnVsbF90YXJnZXQgICAgICAgICAgIDo9ICQoSE9TVF9PVVRfU0RLX0FERE9OKS8kKGFkZG9uX2Rpcl9sZWFmKS56aXAKK2Z1bGxfdGFyZ2V0X2Rpc3RfbmFtZSA6PSAkKGFkZG9uX25hbWUpLUZJTEVfTkFNRV9UQUdfUExBQ0VIT0xERVItJChJTlRFUk5BTF9TREtfSE9TVF9PU19OQU1FKQorZnVsbF90YXJnZXRfaW1nICAgICAgIDo9ICQoSE9TVF9PVVRfU0RLX0FERE9OKS8kKGFkZG9uX2Rpcl9pbWcpLnppcAorc3RhZ2luZyAgICAgICAgICAgICAgIDo9ICQoaW50ZXJtZWRpYXRlcykKIAogc2RrX2FkZG9uX2RlcHMgOj0KIGZpbGVzX3RvX2NvcHkgOj0KQEAgLTEyNSw3ICsxMjYsNyBAQAogJChmdWxsX3RhcmdldF9pbWcpOiAkKGZ1bGxfdGFyZ2V0KSAkKGFkZG9uX2ltZ19zb3VyY2VfcHJvcCkgfCAkKFNPT05HX1pJUCkKIAlAZWNobyBQYWNrYWdpbmcgU0RLIEFkZG9uIFN5c3RlbS1JbWFnZTogJEAKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotCWNwIC1SICQoUFJPRFVDVF9PVVQpL2RhdGEgJChQUklWQVRFX1NUQUdJTkdfRElSKS9kYXRhCisJY3AgLVIgJChQUk9EVUNUX09VVCkvZGF0YSAkKFBSSVZBVEVfU1RBR0lOR19ESVIpCiAJJChoaWRlKSAkKFNPT05HX1pJUCkgLW8gJEAgLUMgJChkaXIgJChQUklWQVRFX1NUQUdJTkdfRElSKSkgLUQgJChQUklWQVRFX1NUQUdJTkdfRElSKQogCiAKQEAgLTE0MCw3ICsxNDEsNyBAQAogZWxzZQogIyBXaGVuIG5vdCBidWlsZGluZyBhbiBzZGtfcmVwbywganVzdCBkaXN0IHRoZSBhZGRvbiB6aXAgZmlsZQogIyBhcy1pcy4KLSQoY2FsbCBkaXN0LWZvci1nb2Fscywgc2RrX2FkZG9uLCAkKGZ1bGxfdGFyZ2V0KSkKKyQoY2FsbCBkaXN0LWZvci1nb2Fscywgc2RrX2FkZG9uLCAkKGZ1bGxfdGFyZ2V0KTokKGZ1bGxfdGFyZ2V0X2Rpc3RfbmFtZSkpCiBlbmRpZgogCiBlbHNlICMgYWRkb25fbmFtZQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90b29scy9idWlsZF9jdXN0b21faW1hZ2UubWsgYi9jb3JlL3Rhc2tzL3Rvb2xzL2J1aWxkX2N1c3RvbV9pbWFnZS5tawppbmRleCAyNjI2MTIwLi5iYTk3ZThhIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Rvb2xzL2J1aWxkX2N1c3RvbV9pbWFnZS5taworKysgYi9jb3JlL3Rhc2tzL3Rvb2xzL2J1aWxkX2N1c3RvbV9pbWFnZS5tawpAQCAtMTA1LDYgKzEwNSw5IEBACiBlbHNlIGlmbmVxICgsJChmaWx0ZXIgdHJ1ZSwgJChDVVNUT01fSU1BR0VfQVZCX0hBU0hfRU5BQkxFKSAkKENVU1RPTV9JTUFHRV9BVkJfSEFTSFRSRUVfRU5BQkxFKSkpCiAgICQoZXJyb3IgQ2Fubm90IHNldCBib3RoIENVU1RPTV9JTUFHRV9BVkJfSEFTSF9FTkFCTEUgYW5kIENVU1RPTV9JTUFHRV9BVkJfSEFTSFRSRUVfRU5BQkxFIHRvIHRydWUpCiBlbmRpZgoraWZlcSAoJChzdHJpcCAkKEhBU19CVUlMRF9OVU1CRVIpKSx0cnVlKQorJChteV9idWlsdF9jdXN0b21faW1hZ2UpOiAkKEJVSUxEX05VTUJFUl9GSUxFKQorZW5kaWYKICQobXlfYnVpbHRfY3VzdG9tX2ltYWdlKTogJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQobXlfYnVpbHRfbW9kdWxlcykgJChteV9pbWFnZV9jb3B5X2ZpbGVzKSAkKG15X2N1c3RvbV9pbWFnZV9tb2R1bGVzX2RlcCkgXAogICAkKENVU1RPTV9JTUFHRV9ESUNUX0ZJTEUpCiAJQGVjaG8gIkJ1aWxkIGltYWdlICRAIgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rIGIvY29yZS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCmluZGV4IGI0MjQ3NmQuLjkxODljMmQgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5taworKysgYi9jb3JlL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKQEAgLTI2LDE3ICsyNiwyNyBAQAogIyBPdXRwdXQgdmFyaWFibGVzOgogIyAgIGNvbXBhdGliaWxpdHlfemlwOiB0aGUgcGF0aCB0byB0aGUgb3V0cHV0IHppcCBmaWxlLgogCi10ZXN0X3N1aXRlX3N1YmRpciA6PSBhbmRyb2lkLSQodGVzdF9zdWl0ZV9uYW1lKQorc3BlY2lhbF9tdHNfdGVzdF9zdWl0ZXMgOj0KK3NwZWNpYWxfbXRzX3Rlc3Rfc3VpdGVzICs9IG1jdHMKK3NwZWNpYWxfbXRzX3Rlc3Rfc3VpdGVzICs9ICQobXRzX21vZHVsZXMpCitpZm5lcSAoJChmaWx0ZXIgJChzcGVjaWFsX210c190ZXN0X3N1aXRlcyksJChwYXRzdWJzdCBtY3RzLSUsJSwkKHRlc3Rfc3VpdGVfbmFtZSkpKSwpCisJdGVzdF9zdWl0ZV9zdWJkaXIgOj0gYW5kcm9pZC1tdHMKK2Vsc2UgaWZuZXEgKCQoZmlsdGVyICQoc3BlY2lhbF9tdHNfdGVzdF9zdWl0ZXMpLCQocGF0c3Vic3QgbXRzLSUsJSwkKHRlc3Rfc3VpdGVfbmFtZSkpKSwpCisJdGVzdF9zdWl0ZV9zdWJkaXIgOj0gYW5kcm9pZC1tdHMKK2Vsc2UKKwl0ZXN0X3N1aXRlX3N1YmRpciA6PSBhbmRyb2lkLSQodGVzdF9zdWl0ZV9uYW1lKQorZW5kaWYKKwogb3V0X2RpciA6PSAkKEhPU1RfT1VUKS8kKHRlc3Rfc3VpdGVfbmFtZSkvJCh0ZXN0X3N1aXRlX3N1YmRpcikKIHRlc3RfYXJ0aWZhY3RzIDo9ICQoQ09NUEFUSUJJTElUWS4kKHRlc3Rfc3VpdGVfbmFtZSkuRklMRVMpCiB0ZXN0X3Rvb2xzIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL3RyYWRlZmVkLmphciBcCi0gICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL3RyYWRlZmVkLXRlc3QtZnJhbWV3b3JrLmphciBcCiAgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2xvZ2FuYWx5c2lzLmphciBcCiAgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2NvbXBhdGliaWxpdHktaG9zdC11dGlsLmphciBcCiAgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2NvbXBhdGliaWxpdHktdHJhZGVmZWQuamFyIFwKICAgJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvJCh0ZXN0X3N1aXRlX3RyYWRlZmVkKS5qYXIgXAogICAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS8kKHRlc3Rfc3VpdGVfdHJhZGVmZWQpLXRlc3RzLmphciBcCiAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpLyQodGVzdF9zdWl0ZV90cmFkZWZlZCkgXAorICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS90ZXN0LXV0aWxzLXNjcmlwdCBcCiAgICQodGVzdF9zdWl0ZV9yZWFkbWUpCiAKICQoZm9yZWFjaCBmLCQodGVzdF9zdWl0ZV9yZWFkbWUpLCQoaWYgJChzdHJpcCAkKEFMTF9UQVJHRVRTLiQoZikuTUVUQV9MSUMpKSwsJChldmFsIEFMTF9UQVJHRVRTLiQoZikuTUVUQV9MSUMgOj0gJChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkpKSkKQEAgLTQ1LDEwICs1NSwxNiBAQAogCiAjIFRoZSBKREsgdG8gcGFja2FnZSBpbnRvIHRoZSB0ZXN0IHN1aXRlIHppcCBmaWxlLiAgQWx3YXlzIHBhY2thZ2UgdGhlIGxpbnV4IEpESy4KIHRlc3Rfc3VpdGVfamRrX2RpciA6PSAkKEFORFJPSURfSkFWQV9IT01FKS8uLi9saW51eC14ODYKK2lmbmRlZiB0ZXN0X3N1aXRlX2pka19maWxlcworICAjIFRoaXMgZmlsZSBnZXRzIGluY2x1ZGVkIG1hbnkgdGltZXMsIHNvIG1ha2Ugc3VyZSB3ZSBvbmx5IHJ1biB0aGUgJChzaGVsbCkgb25jZS4KKyAgIyBPdGhlcndpc2UgaXQgd2lsbCBzbG93IGRvd24gZXZlcnkgYnVpbGQgZHVlIHRvIGFsbCBjb3BpZXMgb2YgaXQgYmVpbmcgcmVydW4gd2hlbiBrYXRpCisgICMgY2hlY2tzIHRoZSBzdGFtcCBmaWxlLgorICB0ZXN0X3N1aXRlX2pka19maWxlcyA6PSQ9ICQoc2hlbGwgZmluZCAkKHRlc3Rfc3VpdGVfamRrX2RpcikgLXR5cGUgZiB8IHNvcnQpCitlbmRpZgogdGVzdF9zdWl0ZV9qZGsgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsJCh0ZXN0X3N1aXRlX25hbWUpX2pkayxIT1NUKS9qZGsuemlwCiAkKHRlc3Rfc3VpdGVfamRrKTogUFJJVkFURV9KREtfRElSIDo9ICQodGVzdF9zdWl0ZV9qZGtfZGlyKQogJCh0ZXN0X3N1aXRlX2pkayk6IFBSSVZBVEVfU1VCRElSIDo9ICQodGVzdF9zdWl0ZV9zdWJkaXIpCi0kKHRlc3Rfc3VpdGVfamRrKTogJChzaGVsbCBmaW5kICQodGVzdF9zdWl0ZV9qZGtfZGlyKSAtdHlwZSBmIHwgc29ydCkKKyQodGVzdF9zdWl0ZV9qZGspOiAkKHRlc3Rfc3VpdGVfamRrX2ZpbGVzKQogJCh0ZXN0X3N1aXRlX2pkayk6ICQoU09PTkdfWklQKQogCSQoU09PTkdfWklQKSAtbyAkQCAtUCAkKFBSSVZBVEVfU1VCRElSKS9qZGsgLUMgJChQUklWQVRFX0pES19ESVIpIC1EICQoUFJJVkFURV9KREtfRElSKSAtc2hhMjU2CiAKQEAgLTEwMSw5ICsxMTcsOSBAQAogY29tcGF0aWJpbGl0eV96aXBfZGVwcyArPSAkKHRlc3Rfc3VpdGVfbm90aWNlX3R4dCkKIGNvbXBhdGliaWxpdHlfemlwX3Jlc291cmNlcyArPSAkKHRlc3Rfc3VpdGVfbm90aWNlX3R4dCkKIAotY29tcGF0aWJpbGl0eV90ZXN0c19saXN0X3ppcCA6PSAkKG91dF9kaXIpLXRlc3RzX2xpc3QuemlwCitjb21wYXRpYmlsaXR5X3Rlc3RzX2xpc3RfemlwIDo9ICQoSE9TVF9PVVQpLyQodGVzdF9zdWl0ZV9uYW1lKS9hbmRyb2lkLSQodGVzdF9zdWl0ZV9uYW1lKS10ZXN0c19saXN0LnppcAogCi1jb21wYXRpYmlsaXR5X3ppcCA6PSAkKG91dF9kaXIpLnppcAorY29tcGF0aWJpbGl0eV96aXAgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpL2FuZHJvaWQtJCh0ZXN0X3N1aXRlX25hbWUpLnppcAogJChjb21wYXRpYmlsaXR5X3ppcCkgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoY29tcGF0aWJpbGl0eV90ZXN0c19saXN0X3ppcCkKICQoY29tcGF0aWJpbGl0eV96aXApOiBQUklWQVRFX09VVF9ESVIgOj0gJChvdXRfZGlyKQogJChjb21wYXRpYmlsaXR5X3ppcCk6IFBSSVZBVEVfVE9PTFMgOj0gJCh0ZXN0X3Rvb2xzKSAkKHRlc3Rfc3VpdGVfcHJlYnVpbHRfdG9vbHMpCkBAIC0xMTMsNiArMTI5LDkgQEAKICQoY29tcGF0aWJpbGl0eV96aXApOiBQUklWQVRFX0pESyA6PSAkKHRlc3Rfc3VpdGVfamRrKQogJChjb21wYXRpYmlsaXR5X3ppcCk6IFBSSVZBVEVfdGVzdHNfbGlzdCA6PSAkKG91dF9kaXIpLXRlc3RzX2xpc3QKICQoY29tcGF0aWJpbGl0eV96aXApOiBQUklWQVRFX3Rlc3RzX2xpc3RfemlwIDo9ICQoY29tcGF0aWJpbGl0eV90ZXN0c19saXN0X3ppcCkKK2lmZXEgKCQoc3RyaXAgJChIQVNfQlVJTERfTlVNQkVSKSksdHJ1ZSkKKyQoY29tcGF0aWJpbGl0eV96aXApOiAkKEJVSUxEX05VTUJFUl9GSUxFKQorZW5kaWYKICQoY29tcGF0aWJpbGl0eV96aXApOiAkKGNvbXBhdGliaWxpdHlfemlwX2RlcHMpIHwgJChBREIpICQoQUNQKQogIyBNYWtlIGRpciBzdHJ1Y3R1cmUKIAlta2RpciAtcCAkKFBSSVZBVEVfT1VUX0RJUikvdG9vbHMgJChQUklWQVRFX09VVF9ESVIpL3Rlc3RjYXNlcwpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90b29scy9wYWNrYWdlLW1vZHVsZXMubWsgYi9jb3JlL3Rhc2tzL3Rvb2xzL3BhY2thZ2UtbW9kdWxlcy5tawppbmRleCBiMTVkZjI4Li40ZWM1NTIwIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Rvb2xzL3BhY2thZ2UtbW9kdWxlcy5taworKysgYi9jb3JlL3Rhc2tzL3Rvb2xzL3BhY2thZ2UtbW9kdWxlcy5tawpAQCAtMTA2LDYgKzEwNiw3IEBACiAJJChoaWRlKSAkKGZvcmVhY2ggZiwgJChQUklWQVRFX1BJQ0tVUF9GSUxFUyksXAogCSAgY3AgLVJmTCAkKGYpICQoUFJJVkFURV9TVEFHSU5HX0RJUikgJiYgKSB0cnVlCiAJJChoaWRlKSBjZCAkKFBSSVZBVEVfU1RBR0lOR19ESVIpICYmIHppcCAtcnFYIC4uLyQobm90ZGlyICRAKSAqCisJcm0gLXJmICQoUFJJVkFURV9TVEFHSU5HX0RJUikKIAogbXlfbWFrZWZpbGUgOj0KIG15X3N0YWdpbmdfZGlyIDo9CmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL3Z0cy1rZXJuZWwtdGVzdHMubWsgYi9jb3JlL3Rhc2tzL3Rvb2xzL3Z0cy1rZXJuZWwtdGVzdHMubWsKaW5kZXggYmQxMTVjOS4uZTcyN2RjMSAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy90b29scy92dHMta2VybmVsLXRlc3RzLm1rCisrKyBiL2NvcmUvdGFza3MvdG9vbHMvdnRzLWtlcm5lbC10ZXN0cy5tawpAQCAtMTIsNyArMTIsNiBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0taW5jbHVkZSBleHRlcm5hbC9saW51eC1rc2VsZnRlc3QvYW5kcm9pZC9rc2VsZnRlc3RfdGVzdF9saXN0Lm1rCiAtaW5jbHVkZSBleHRlcm5hbC9sdHAvYW5kcm9pZC9sdHBfcGFja2FnZV9saXN0Lm1rCiAKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL3Z0c19wYWNrYWdlX3V0aWxzLm1rCkBAIC0yMyw3ICsyMiwzIEBACiBrZXJuZWxfbHRwX21vZHVsZXMgOj0gXAogICAgIGx0cCBcCiAgICAgJChsdHBfcGFja2FnZXMpCi0KLWtlcm5lbF9rc2VsZnRlc3RfaG9zdF9vdXQgOj0gJChIT1NUX09VVF9URVNUQ0FTRVMpL3Z0c19rZXJuZWxfa3NlbGZ0ZXN0X3Rlc3RzCi1rZXJuZWxfa3NlbGZ0ZXN0X3Z0c19vdXQgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpL2FuZHJvaWQtJCh0ZXN0X3N1aXRlX25hbWUpL3Rlc3RjYXNlcy92dHNfa2VybmVsX2tzZWxmdGVzdF90ZXN0cwota2VybmVsX2tzZWxmdGVzdF9tb2R1bGVzIDo9ICQoa3NlbGZ0ZXN0X21vZHVsZXMpCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL3Z0c19wYWNrYWdlX3V0aWxzLm1rIGIvY29yZS90YXNrcy90b29scy92dHNfcGFja2FnZV91dGlscy5tawppbmRleCAwNjE2MWYwLi4xYTgxOWYyIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Rvb2xzL3Z0c19wYWNrYWdlX3V0aWxzLm1rCisrKyBiL2NvcmUvdGFza3MvdG9vbHMvdnRzX3BhY2thZ2VfdXRpbHMubWsKQEAgLTIxLDcgKzIxLDcgQEAKICQoZm9yZWFjaCBtLCQoMSksXAogICAkKGV2YWwgX2J1aWx0X2ZpbGVzIDo9ICQoc3RyaXAgJChBTExfTU9EVUxFUy4kKG0pLkJVSUxUX0lOU1RBTExFRClcCiAgICQoQUxMX01PRFVMRVMuJChtKSQoVEFSR0VUXzJORF9BUkNIX01PRFVMRV9TVUZGSVgpLkJVSUxUX0lOU1RBTExFRCkpKVwKLSAgJChmb3JlYWNoIGksICQoX2J1aWx0X2ZpbGVzKSxcCisgICQoZm9yZWFjaCBpLCAkKHNvcnQgJChfYnVpbHRfZmlsZXMpKSxcCiAgICAgJChldmFsIGJ1aV9pbnMgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQoaSkpKVwKICAgICAkKGV2YWwgaW5zIDo9ICQod29yZCAyLCQoYnVpX2lucykpKVwKICAgICAkKGlmICQoZmlsdGVyICQoVEFSR0VUX09VVF9ST09UKS8lLCQoaW5zKSksXApkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy92bmRrLm1rIGIvY29yZS90YXNrcy92bmRrLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU5YmQ0Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGFza3Mvdm5kay5taworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWN1cnJlbnRfbWFrZWZpbGUgOj0gJChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKQotCi0jIEJPQVJEX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldCB0byAnY3VycmVudCcgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYSBWTkRLIHNuYXBzaG90LgotaWZlcSAoJChCT0FSRF9WTkRLX1ZFUlNJT04pLGN1cnJlbnQpCi0KLSMgUExBVEZPUk1fVk5ES19WRVJTSU9OIG11c3QgYmUgc2V0LgotaWZuZXEgKCwkKFBMQVRGT1JNX1ZOREtfVkVSU0lPTikpCi0KLS5QSE9OWTogdm5kawotdm5kazogJChTT09OR19WTkRLX1NOQVBTSE9UX1pJUCkKLQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCB2bmRrLCAkKFNPT05HX1ZOREtfU05BUFNIT1RfWklQKSkKLQotZWxzZSAjIFBMQVRGT1JNX1ZOREtfVkVSU0lPTiBpcyBOT1Qgc2V0Ci1lcnJvcl9tc2cgOj0gIkNBTk5PVCBnZW5lcmF0ZSBWTkRLIHNuYXBzaG90LiBQTEFURk9STV9WTkRLX1ZFUlNJT04gbXVzdCBiZSBzZXQuIgotZW5kaWYgIyBQTEFURk9STV9WTkRLX1ZFUlNJT04KLQotZWxzZSAjIEJPQVJEX1ZOREtfVkVSU0lPTiBpcyBOT1Qgc2V0IHRvICdjdXJyZW50JwotZXJyb3JfbXNnIDo9ICJDQU5OT1QgZ2VuZXJhdGUgVk5ESyBzbmFwc2hvdC4gQk9BUkRfVk5ES19WRVJTSU9OIG11c3QgYmUgc2V0IHRvICdjdXJyZW50Jy4iCi1lbmRpZiAjIEJPQVJEX1ZOREtfVkVSU0lPTgotCi1pZm5lcSAoLCQoZXJyb3JfbXNnKSkKLQotLlBIT05ZOiB2bmRrCi12bmRrOiBQUklWQVRFX01BS0VGSUxFIDo9ICQoY3VycmVudF9tYWtlZmlsZSkKLXZuZGs6Ci0JJChjYWxsIGVjaG8tZXJyb3IsJChQUklWQVRFX01BS0VGSUxFKSwkKGVycm9yX21zZykpCi0JZXhpdCAxCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Z0cy1jb3JlLXRlc3RzLm1rIGIvY29yZS90YXNrcy92dHMtY29yZS10ZXN0cy5tawppbmRleCBiZDc2NTJiLi4xZWViMDc4IDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Z0cy1jb3JlLXRlc3RzLm1rCisrKyBiL2NvcmUvdGFza3MvdnRzLWNvcmUtdGVzdHMubWsKQEAgLTIwLDEzICsyMCwxMCBAQAogCiBsdHBfY29weV9wYWlycyA6PSBcCiAgICQoY2FsbCB0YXJnZXQtbmF0aXZlLWNvcHktcGFpcnMsJChrZXJuZWxfbHRwX21vZHVsZXMpLCQoa2VybmVsX2x0cF92dHNfb3V0KSkKLWtzZWxmdGVzdF9jb3B5X3BhaXJzIDo9IFwKLSAgJChjYWxsIHRhcmdldC1uYXRpdmUtY29weS1wYWlycywkKGtlcm5lbF9rc2VsZnRlc3RfbW9kdWxlcyksJChrZXJuZWxfa3NlbGZ0ZXN0X3Z0c19vdXQpKQogCiBjb3B5X2x0cF90ZXN0cyA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobHRwX2NvcHlfcGFpcnMpKQotY29weV9rc2VsZnRlc3RfdGVzdHMgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKGtzZWxmdGVzdF9jb3B5X3BhaXJzKSkKIAotdGVzdF9zdWl0ZV9leHRyYV9kZXBzIDo9ICQoY29weV9sdHBfdGVzdHMpICQoY29weV9rc2VsZnRlc3RfdGVzdHMpCit0ZXN0X3N1aXRlX2V4dHJhX2RlcHMgOj0gJChjb3B5X2x0cF90ZXN0cykKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5tawogCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3dpdGgtbGljZW5zZS5tayBiL2NvcmUvdGFza3Mvd2l0aC1saWNlbnNlLm1rCmluZGV4IGQ0MWU3N2EuLjVjYTk3NGEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3Mvd2l0aC1saWNlbnNlLm1rCisrKyBiL2NvcmUvdGFza3Mvd2l0aC1saWNlbnNlLm1rCkBAIC0yMCw3ICsyMCw4IEBACiAJbmFtZSA6PSAkKG5hbWUpX2RlYnVnCiBlbmRpZgogCi1uYW1lIDo9ICQobmFtZSktZmxhc2hhYmxlLSQoRklMRV9OQU1FX1RBRyktd2l0aC1saWNlbnNlCitkaXN0X25hbWUgOj0gJChuYW1lKS1mbGFzaGFibGUtRklMRV9OQU1FX1RBR19QTEFDRUhPTERFUi13aXRoLWxpY2Vuc2UKK25hbWUgOj0gJChuYW1lKS1mbGFzaGFibGUtd2l0aC1saWNlbnNlCiAKIHdpdGhfbGljZW5zZV9pbnRlcm1lZGlhdGVzIDo9IFwKIAkkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx3aXRoX2xpY2Vuc2UpCkBAIC00Miw2ICs0Myw3IEBACiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItZGVwcywkKGxpY2Vuc2VfaW1hZ2VfaW5wdXRfemlwKSwkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKSkKIAogd2l0aF9saWNlbnNlX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS8kKG5hbWUpLnNoCitkaXN0X25hbWUgOj0gJChkaXN0X25hbWUpLnNoCiAkKHdpdGhfbGljZW5zZV96aXApOiBQUklWQVRFX05BTUUgOj0gJChuYW1lKQogJCh3aXRoX2xpY2Vuc2VfemlwKTogUFJJVkFURV9JTlBVVF9aSVAgOj0gJChsaWNlbnNlX2ltYWdlX2lucHV0X3ppcCkKICQod2l0aF9saWNlbnNlX3ppcCk6IFBSSVZBVEVfVkVORE9SX0JMT0JTX0xJQ0VOU0UgOj0gJChWRU5ET1JfQkxPQlNfTElDRU5TRSkKQEAgLTUxLDcgKzUzLDcgQEAKIAkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9nZW5lcmF0ZS1zZWxmLWV4dHJhY3RpbmctYXJjaGl2ZSAkQCBcCiAJCSQoUFJJVkFURV9JTlBVVF9aSVApICQoUFJJVkFURV9OQU1FKSAkKFBSSVZBVEVfVkVORE9SX0JMT0JTX0xJQ0VOU0UpCiB3aXRoLWxpY2Vuc2UgOiAkKHdpdGhfbGljZW5zZV96aXApCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHdpdGgtbGljZW5zZSwgJCh3aXRoX2xpY2Vuc2VfemlwKSkKKyQoY2FsbCBkaXN0LWZvci1nb2Fscywgd2l0aC1saWNlbnNlLCAkKHdpdGhfbGljZW5zZV96aXApOiQoZGlzdF9uYW1lKSkKIAogJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQod2l0aF9saWNlbnNlX3ppcCksKQogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKHdpdGhfbGljZW5zZV96aXApLCQobGljZW5zZV9pbWFnZV9pbnB1dF96aXApLCQod2l0aF9saWNlbnNlX3ppcCk6KQpkaWZmIC0tZ2l0IGEvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rIGIvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM0MjU3Li4wMDAwMDAwCi0tLSBhL2NvcmUvdmVyc2lvbl9kZWZhdWx0cy5taworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jCi0jIEhhbmRsZSB2YXJpb3VzIGJ1aWxkIHZlcnNpb24gaW5mb3JtYXRpb24uCi0jCi0jIEd1YXJhbnRlZXMgdGhhdCB0aGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkOgotIyAgICAgUExBVEZPUk1fVkVSU0lPTgotIyAgICAgUExBVEZPUk1fRElTUExBWV9WRVJTSU9OCi0jICAgICBQTEFURk9STV9TREtfVkVSU0lPTgotIyAgICAgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRQotIyAgICAgREVGQVVMVF9BUFBfVEFSR0VUX1NESwotIyAgICAgQlVJTERfSUQKLSMgICAgIEJVSUxEX05VTUJFUgotIyAgICAgUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0gKLSMgICAgIFBMQVRGT1JNX1ZOREtfVkVSU0lPTgotIyAgICAgUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TCi0jCi0KLSMgTG9vayBmb3IgYW4gb3B0aW9uYWwgZmlsZSBjb250YWluaW5nIG92ZXJyaWRlcyBvZiB0aGUgZGVmYXVsdHMsCi0jIGJ1dCBkb24ndCBjcnkgaWYgd2UgZG9uJ3QgZmluZCBpdC4gIFdlIGNvdWxkIGp1c3QgdXNlIC1pbmNsdWRlLCBidXQKLSMgdGhlIGJ1aWxkLnByb3AgdGFyZ2V0IGFsc28gd2FudHMgSU5URVJOQUxfQlVJTERfSURfTUFLRUZJTEUgdG8gYmUgc2V0Ci0jIGlmIHRoZSBmaWxlIGV4aXN0cy4KLSMKLUlOVEVSTkFMX0JVSUxEX0lEX01BS0VGSUxFIDo9ICQod2lsZGNhcmQgJChCVUlMRF9TWVNURU0pL2J1aWxkX2lkLm1rKQotaWZkZWYgSU5URVJOQUxfQlVJTERfSURfTUFLRUZJTEUKLSAgaW5jbHVkZSAkKElOVEVSTkFMX0JVSUxEX0lEX01BS0VGSUxFKQotZW5kaWYKLQotREVGQVVMVF9QTEFURk9STV9WRVJTSU9OIDo9IFVQMUEKLS5LQVRJX1JFQURPTkxZIDo9IERFRkFVTFRfUExBVEZPUk1fVkVSU0lPTgotTUlOX1BMQVRGT1JNX1ZFUlNJT04gOj0gVVAxQQotTUFYX1BMQVRGT1JNX1ZFUlNJT04gOj0gVlAxQQotCi0jIFRoZSBsYXN0IHN0YWJsZSB2ZXJzaW9uIG5hbWUgb2YgdGhlIHBsYXRmb3JtIHRoYXQgd2FzIHJlbGVhc2VkLiAgRHVyaW5nCi0jIGRldmVsb3BtZW50LCB0aGlzIHN0YXlzIGF0IHRoYXQgcHJldmlvdXMgdmVyc2lvbiwgd2hpbGUgdGhlIGNvZGVuYW1lIGluZGljYXRlcwotIyBmdXJ0aGVyIHdvcmsgYmFzZWQgb24gdGhlIHByZXZpb3VzIHZlcnNpb24uCi1QTEFURk9STV9WRVJTSU9OX0xBU1RfU1RBQkxFIDo9IDE0Ci0uS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9WRVJTSU9OX0xBU1RfU1RBQkxFCi0KLSMgVGhlc2UgYXJlIHRoZSBjdXJyZW50IGRldmVsb3BtZW50IGNvZGVuYW1lcywgaWYgdGhlIGJ1aWxkIGlzIG5vdCBhIGZpbmFsCi0jIHJlbGVhc2UgYnVpbGQuICBJZiB0aGlzIGlzIGEgZmluYWwgcmVsZWFzZSBidWlsZCwgaXQgaXMgc2ltcGx5ICJSRUwiLgotUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRS5VUDFBIDo9IFJFTAotUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRS5WUDFBIDo9IFZhbmlsbGFJY2VDcmVhbQotCi0jIFRoaXMgaXMgdGhlIHVzZXItdmlzaWJsZSB2ZXJzaW9uLiAgSW4gYSBmaW5hbCByZWxlYXNlIGJ1aWxkIGl0IHNob3VsZAotIyBiZSBlbXB0eSB0byB1c2UgUExBVEZPUk1fVkVSU0lPTiBhcyB0aGUgdXNlci12aXNpYmxlIHZlcnNpb24uICBGb3IKLSMgYSBwcmV2aWV3IHJlbGVhc2UgaXQgY2FuIGJlIHNldCB0byBhIHVzZXItZnJpZW5kbHkgdmFsdWUgbGlrZSBgMTIgUHJldmlldyAxYAotUExBVEZPUk1fRElTUExBWV9WRVJTSU9OIDo9Ci0KLWlmbmRlZiBQTEFURk9STV9TREtfVkVSU0lPTgotICAjIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBkZWZpbml0aW9uIG9mIHRoZSBTREsgdmVyc2lvbiwgd2hpY2ggZGVmaW5lcwotICAjIHRoZSBzZXQgb2YgQVBJcyBhbmQgZnVuY3Rpb25hbGl0eSBhdmFpbGFibGUgaW4gdGhlIHBsYXRmb3JtLiAgSXQKLSAgIyBpcyBhIHNpbmdsZSBpbnRlZ2VyIHRoYXQgaW5jcmVhc2VzIG1vbm90b25pY2FsbHkgYXMgdXBkYXRlcyB0bwotICAjIHRoZSBTREsgYXJlIHJlbGVhc2VkLiAgSXQgc2hvdWxkIG9ubHkgYmUgaW5jcmVtZW50ZWQgd2hlbiB0aGUgQVBJcyBmb3IKLSAgIyB0aGUgbmV3IHJlbGVhc2UgYXJlIGZyb3plbiAoc28gdGhhdCBkZXZlbG9wZXJzIGRvbid0IHdyaXRlIGFwcHMgYWdhaW5zdAotICAjIGludGVybWVkaWF0ZSBidWlsZHMpLiAgRHVyaW5nIGRldmVsb3BtZW50LCB0aGlzIG51bWJlciByZW1haW5zIGF0IHRoZQotICAjIFNESyB2ZXJzaW9uIHRoZSBicmFuY2ggaXMgYmFzZWQgb24gYW5kIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgaG9sZHMKLSAgIyB0aGUgY29kZS1uYW1lIG9mIHRoZSBuZXcgZGV2ZWxvcG1lbnQgd29yay4KLQotICAjIFdoZW4geW91IGluY3JlbWVudCB0aGUgUExBVEZPUk1fU0RLX1ZFUlNJT04gcGxlYXNlIGVuc3VyZSB5b3UgYWxzbwotICAjIGNsZWFyIG91dCB0aGUgZm9sbG93aW5nIHRleHQgZmlsZSBvZiBhbGwgb2xkZXIgUExBVEZPUk1fVkVSU0lPTidzOgotICAjIGN0cy90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fdmVyc2lvbnMudHh0Ci0gIFBMQVRGT1JNX1NES19WRVJTSU9OIDo9IDM0Ci1lbmRpZgotLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fU0RLX1ZFUlNJT04KLQotIyBUaGlzIGlzIHRoZSBzZGsgZXh0ZW5zaW9uIHZlcnNpb24gb2YgdGhpcyB0cmVlLgotUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OIDo9IDcKLS5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTgotCi0jIFRoaXMgaXMgdGhlIHNkayBleHRlbnNpb24gdmVyc2lvbiB0aGF0IFBMQVRGT1JNX1NES19WRVJTSU9OIHNoaXBzIHdpdGguCi1QTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTiA6PSAkKFBMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTikKLS5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OCi0KLSMgVGhpcyBhcmUgYWxsIGtub3duIGNvZGVuYW1lcy4KLVBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTIDo9IFwKLUJhc2UgQmFzZTExIEN1cGNha2UgRG9udXQgRWNsYWlyIEVjbGFpcjAxIEVjbGFpck1yMSBGcm95byBHaW5nZXJicmVhZCBHaW5nZXJicmVhZE1yMSBcCi1Ib25leWNvbWIgSG9uZXljb21iTXIxIEhvbmV5Y29tYk1yMiBJY2VDcmVhbVNhbmR3aWNoIEljZUNyZWFtU2FuZHdpY2hNcjEgXAotSmVsbHlCZWFuIEplbGx5QmVhbk1yMSBKZWxseUJlYW5NcjIgS2l0a2F0IEtpdGthdFdhdGNoIExvbGxpcG9wIExvbGxpcG9wTXIxIE0gTiBOTXIxIE8gT01yMSBQIFwKLVEgUiBTIFN2MiBUaXJhbWlzdSBVcHNpZGVEb3duQ2FrZQotCi0jIENvbnZlcnQgZnJvbSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCB0byBjb21tYSBzZXBhcmF0ZWQKLVBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTIDo9IFwKLSAgJChjYWxsIG5vcm1hbGl6ZS1jb21tYS1saXN0LCQoUExBVEZPUk1fVkVSU0lPTl9LTk9XTl9DT0RFTkFNRVMpKQotLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fVkVSU0lPTl9LTk9XTl9DT0RFTkFNRVMKLQotaWZuZGVmIFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENICi0gICAgIyAgVXNlZCB0byBpbmRpY2F0ZSB0aGUgc2VjdXJpdHkgcGF0Y2ggdGhhdCBoYXMgYmVlbiBhcHBsaWVkIHRvIHRoZSBkZXZpY2UuCi0gICAgIyAgSXQgbXVzdCBzaWduaWZ5IHRoYXQgdGhlIGJ1aWxkIGluY2x1ZGVzIGFsbCBzZWN1cml0eSBwYXRjaGVzIGlzc3VlZCB1cCB0aHJvdWdoIHRoZSBkZXNpZ25hdGVkIEFuZHJvaWQgUHVibGljIFNlY3VyaXR5IEJ1bGxldGluLgotICAgICMgIEl0IG11c3QgYmUgb2YgdGhlIGZvcm0gIllZWVktTU0tREQiIG9uIHByb2R1Y3Rpb24gZGV2aWNlcy4KLSAgICAjICBJdCBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgQW5kcm9pZCBTZWN1cml0eSBQYXRjaCBMZXZlbCBzdHJpbmdzIG9mIHRoZSBQdWJsaWMgU2VjdXJpdHkgQnVsbGV0aW5zLgotICAgICMgIElmIHRoZXJlIGlzIG5vICRQTEFURk9STV9TRUNVUklUWV9QQVRDSCBzZXQsIGtlZXAgaXQgZW1wdHkuCi0gICAgUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0ggOj0gMjAyMy0wOC0wNQotZW5kaWYKLQotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdmVyc2lvbl91dGlsLm1rCmRpZmYgLS1naXQgYS9jb3JlL3ZlcnNpb25fdXRpbC5tayBiL2NvcmUvdmVyc2lvbl91dGlsLm1rCmluZGV4IDBhNDUyOTYuLmViNTY4YmUgMTAwNjQ0Ci0tLSBhL2NvcmUvdmVyc2lvbl91dGlsLm1rCisrKyBiL2NvcmUvdmVyc2lvbl91dGlsLm1rCkBAIC0xNCwxMDMgKzE0LDkyIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCisKKyMKKyMgSGFuZGxlIHZhcmlvdXMgYnVpbGQgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyMKKyMgR3VhcmFudGVlcyB0aGF0IHRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQ6CisjICAgICBQTEFURk9STV9WRVJTSU9OCisjICAgICBQTEFURk9STV9ESVNQTEFZX1ZFUlNJT04KKyMgICAgIFBMQVRGT1JNX1NES19WRVJTSU9OCisjICAgICBQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04KKyMgICAgIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUKKyMgICAgIERFRkFVTFRfQVBQX1RBUkdFVF9TREsKKyMgICAgIEJVSUxEX0lECisjICAgICBCVUlMRF9OVU1CRVIKKyMgICAgIFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENICisjICAgICBQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMKKyMgICAgIFBMQVRGT1JNX1ZFUlNJT05fTEFTVF9TVEFCTEUKKyMgICAgIFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTCiAjCiAKLUFMTE9XRURfVkVSU0lPTlMgOj0gJChjYWxsIGFsbG93ZWQtcGxhdGZvcm0tdmVyc2lvbnMsXAotICAkKE1JTl9QTEFURk9STV9WRVJTSU9OKSxcCi0gICQoTUFYX1BMQVRGT1JNX1ZFUlNJT04pLFwKLSAgJChERUZBVUxUX1BMQVRGT1JNX1ZFUlNJT04pKQotCi1pZm5kZWYgVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04KLSAgVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04gOj0gJChERUZBVUxUX1BMQVRGT1JNX1ZFUlNJT04pCisjIExvb2sgZm9yIGFuIG9wdGlvbmFsIGZpbGUgY29udGFpbmluZyBvdmVycmlkZXMgb2YgdGhlIGRlZmF1bHRzLAorIyBidXQgZG9uJ3QgY3J5IGlmIHdlIGRvbid0IGZpbmQgaXQuICBXZSBjb3VsZCBqdXN0IHVzZSAtaW5jbHVkZSwgYnV0CisjIHRoZSBidWlsZC5wcm9wIHRhcmdldCBhbHNvIHdhbnRzIElOVEVSTkFMX0JVSUxEX0lEX01BS0VGSUxFIHRvIGJlIHNldAorIyBpZiB0aGUgZmlsZSBleGlzdHMuCisjCitJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSA6PSAkKHdpbGRjYXJkICQoQlVJTERfU1lTVEVNKS9idWlsZF9pZC5taykKK2lmZGVmIElOVEVSTkFMX0JVSUxEX0lEX01BS0VGSUxFCisgIGluY2x1ZGUgJChJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSkKIGVuZGlmCiAKLWlmZXEgKCwkKGZpbHRlciAkKEFMTE9XRURfVkVSU0lPTlMpLCAkKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKSkpCi0gICQod2FybmluZyBJbnZhbGlkIFRBUkdFVF9QTEFURk9STV9WRVJTSU9OICckKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKScsIG11c3QgYmUgb25lIG9mKQotICAkKGVycm9yICQoQUxMT1dFRF9WRVJTSU9OUykpCitpZmRlZiBUQVJHRVRfUExBVEZPUk1fVkVSU0lPTgorICAkKGVycm9yIERvIG5vdCBzZXQgVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04gZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT04uIHZhbHVlOiAkKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKSkKIGVuZGlmCi1BTExPV0VEX1ZFUlNJT05TIDo9Ci1NSU5fUExBVEZPUk1fVkVSU0lPTiA6PQotTUFYX1BMQVRGT1JNX1ZFUlNJT04gOj0KLQorVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04gOj0gJChSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT04pCiAuS0FUSV9SRUFET05MWSA6PSBUQVJHRVRfUExBVEZPUk1fVkVSU0lPTgogCi0jIERlZmF1bHQgdmVyc2lvbnMgZm9yIGVhY2ggVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04KLSMgVE9ETzogUExBVEZPUk1fVkVSU0lPTiwgUExBVEZPUk1fU0RLX1ZFUlNJT04sIGV0Yy4gc2hvdWxkIGJlIGNvbmRpdGlvbmFsCi0jIG9uIHRoaXMKLQotIyBUaGlzIGlzIHRoZSBjYW5vbmljYWwgZGVmaW5pdGlvbiBvZiB0aGUgcGxhdGZvcm0gdmVyc2lvbiwKLSMgd2hpY2ggaXMgdGhlIHZlcnNpb24gdGhhdCB3ZSByZXZlYWwgdG8gdGhlIGVuZCB1c2VyLgotIyBVcGRhdGUgdGhpcyB2YWx1ZSB3aGVuIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIGNoYW5nZXMgKHJhdGhlcgotIyB0aGFuIG92ZXJyaWRpbmcgaXQgc29tZXdoZXJlIGVsc2UpLiAgQ2FuIGJlIGFuIGFyYml0cmFyeSBzdHJpbmcuCi0KLSMgV2hlbiB5b3UgY2hhbmdlIFBMQVRGT1JNX1ZFUlNJT04gZm9yIGEgZ2l2ZW4gUExBVEZPUk1fU0RLX1ZFUlNJT04KLSMgcGxlYXNlIGFkZCB0aGF0IFBMQVRGT1JNX1ZFUlNJT04gYXMgd2VsbCBhcyBjbGVhbiB1cCBvYnNvbGV0ZSBQTEFURk9STV9WRVJTSU9OJ3MKLSMgaW4gdGhlIGZvbGxvd2luZyB0ZXh0IGZpbGU6Ci0jIGN0cy90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fdmVyc2lvbnMudHh0Ci0KLSMgTm90ZSB0aGF0IHRoZXJlIHNob3VsZCBiZSBvbmUgUExBVEZPUk1fVkVSU0lPTiBhbmQgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRQotIyBlbnRyeSBmb3IgZWFjaCB1bnJlbGVhc2VkIEFQSSBsZXZlbCwgcmVnYXJkbGVzcyBvZgotIyBNSU5fUExBVEZPUk1fVkVSU0lPTi9NQVhfUExBVEZPUk1fVkVSU0lPTi4gUExBVEZPUk1fVkVSU0lPTiBpcyB1c2VkIHRvCi0jIGdlbmVyYXRlIHRoZSByYW5nZSBvZiBhbGxvd2VkIFNESyB2ZXJzaW9ucywgc28gaXQgbXVzdCBoYXZlIGFuIGVudHJ5IGZvciBldmVyeQotIyB1bnJlbGVhc2VkIEFQSSBsZXZlbCB0YXJnZXRhYmxlIGJ5IHRoaXMgYnJhbmNoLCBub3QganVzdCB0aG9zZSB0aGF0IGFyZSB2YWxpZAotIyBsdW5jaCB0YXJnZXRzIGZvciB0aGlzIGJyYW5jaC4KLQotUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSA6PSAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuJChUQVJHRVRfUExBVEZPUk1fVkVSU0lPTikpCi1pZm5kZWYgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRQotICAjIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgZmFsbHMgYmFjayB0byBUQVJHRVRfUExBVEZPUk1fVkVSU0lPTgotICBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIDo9ICQoVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04pCitpZmRlZiBQTEFURk9STV9TRUNVUklUWV9QQVRDSAorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0ggZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX1NFQ1VSSVRZX1BBVENILiB2YWx1ZTogJChQTEFURk9STV9TRUNVUklUWV9QQVRDSCkpCiBlbmRpZgorUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0ggOj0gJChSRUxFQVNFX1BMQVRGT1JNX1NFQ1VSSVRZX1BBVENIKQorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0gKIAotIyBUaGlzIGlzIGFsbCBvZiB0aGUgKmFjdGl2ZSogZGV2ZWxvcG1lbnQgY29kZW5hbWVzLgotIyBUaGlzIGNvbmZ1c2luZyBuYW1lIGlzIG5lZWRlZCBiZWNhdXNlCi0jIGFsbF9jb2RlbmFtZXMgaGFzIGJlZW4gYmFrZWQgaW50byBidWlsZC5wcm9wIGZvciBhZ2VzLgotIwotIyBTaG91bGQgYmUgZWl0aGVyIHRoZSBzYW1lIGFzIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgb3IgYSBjb21tYS1zZXBhcmF0ZWQKLSMgbGlzdCBvZiBhZGRpdGlvbmFsIGNvZGVuYW1lcyBhZnRlciBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FLgotUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTIDo9Ci0KLSMgQnVpbGQgYSBsaXN0IG9mIGFsbCBhY3RpdmUgY29kZSBuYW1lcy4gQXZvaWQgZHVwbGljYXRlcywgYW5kIHN0b3Agd2hlbiB3ZQotIyByZWFjaCBhIGNvZGVuYW1lIHRoYXQgbWF0Y2hlcyBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIChhbnl0aGluZyBiZXlvbmQKLSMgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gb3VyIGJ1aWxkKS4KLV92ZXJzaW9uc19pbl90YXJnZXQgOj0gXAotICAkKGNhbGwgZmluZF9hbmRfZWFybGllciwkKEFMTF9WRVJTSU9OUyksJChUQVJHRVRfUExBVEZPUk1fVkVSU0lPTikpCi0kKGZvcmVhY2ggdmVyc2lvbiwkKF92ZXJzaW9uc19pbl90YXJnZXQpLFwKLSAgJChldmFsIF9jb2RlbmFtZSA6PSAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuJCh2ZXJzaW9uKSkpXAotICAkKGlmICQoZmlsdGVyICQoX2NvZGVuYW1lKSwkKFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUykpLCxcCi0gICAgJChldmFsIFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUyArPSAkKF9jb2RlbmFtZSkpKSkKLQotIyBBbmQgdGhlIGxpc3Qgb2YgYWN0dWFsbHkgYWxsIHRoZSBjb2RlbmFtZXMgdGhhdCBhcmUgaW4gcHJldmlldy4gVGhlCi0jIEFMTF9DT0RFTkFNRVMgdmFyaWFibGUgaXMgc29ydCBvZiBhIGxpZSBmb3IgaGlzdG9yaWNhbCByZWFzb25zIGFuZCBvbmx5Ci0jIGluY2x1ZGVzIGNvZGVuYW1lcyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvZGVuYW1lLCB3aGVyZWFzCi0jIHRoaXMgdmFyaWFibGUgYWxzbyBpbmNsdWRlcyBmdXR1cmUgY29kZW5hbWVzLiBGb3IgZXhhbXBsZSwgd2hpbGUgQU9TUCBpcyBzdGlsbAotIyBtZXJnaW5nIGludG8gVSwgYnV0IFYgZGV2ZWxvcG1lbnQgaGFzIHN0YXJ0ZWQsIEFMTF9DT0RFTkFNRVMgd2lsbCBvbmx5IGJlIFUsCi0jIGJ1dCBBTExfUFJFVklFV19DT0RFTkFNRVMgd2lsbCBiZSBVIGFuZCBWLgotUExBVEZPUk1fVkVSU0lPTl9BTExfUFJFVklFV19DT0RFTkFNRVMgOj0KLSQoZm9yZWFjaCB2ZXJzaW9uLCQoQUxMX1ZFUlNJT05TKSxcCi0gICQoZXZhbCBfY29kZW5hbWUgOj0gJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FLiQodmVyc2lvbikpKVwKLSAgJChpZiAkKGZpbHRlciAkKF9jb2RlbmFtZSksJChQTEFURk9STV9WRVJTSU9OX0FMTF9QUkVWSUVXX0NPREVOQU1FUykpLCxcCi0gICAgJChldmFsIFBMQVRGT1JNX1ZFUlNJT05fQUxMX1BSRVZJRVdfQ09ERU5BTUVTICs9ICQoX2NvZGVuYW1lKSkpKQotCi0jIEFuZCBjb252ZXJ0IGZyb20gc3BhY2Ugc2VwYXJhdGVkIHRvIGNvbW1hIHNlcGFyYXRlZC4KLVBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUyA6PSBcCi0gICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzdHJpcCAkKFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUykpKQotUExBVEZPUk1fVkVSU0lPTl9BTExfUFJFVklFV19DT0RFTkFNRVMgOj0gXAotICAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoc3RyaXAgJChQTEFURk9STV9WRVJTSU9OX0FMTF9QUkVWSUVXX0NPREVOQU1FUykpKQotCi0uS0FUSV9SRUFET05MWSA6PSBcCi0gIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgXAotICBQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMgXAotICBQTEFURk9STV9WRVJTSU9OX0FMTF9QUkVWSUVXX0NPREVOQU1FUyBcCi0KLWlmbmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKLSAgY29kZW5hbWVzIDo9IFwKLSAgICAkKHN1YnN0ICQoY29tbWEpLCQoc3BhY2UpLCQoc3RyaXAgJChQTEFURk9STV9WRVJTSU9OX0tOT1dOX0NPREVOQU1FUykpKQotICBpZmVxICgkKGZpbHRlciAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpLCQoY29kZW5hbWVzKSksKQotICAgICQoZXJyb3IgJyQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSknIGlzIG5vdCBpbiAnJChjb2RlbmFtZXMpJy4gXAotICAgICAgICBBZGQgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSB0byBQTEFURk9STV9WRVJTSU9OX0tOT1dOX0NPREVOQU1FUykKLSAgZW5kaWYKK2lmZGVmIFBMQVRGT1JNX1NES19WRVJTSU9OCisgICQoZXJyb3IgRG8gbm90IHNldCBQTEFURk9STV9TREtfVkVSU0lPTiBkaXJlY3RseS4gVXNlIFJFTEVBU0VfUExBVEZPUk1fU0RLX1ZFUlNJT04uIHZhbHVlOiAkKFBMQVRGT1JNX1NES19WRVJTSU9OKSkKIGVuZGlmCitQTEFURk9STV9TREtfVkVSU0lPTiA6PSAkKFJFTEVBU0VfUExBVEZPUk1fU0RLX1ZFUlNJT04pCisuS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9TREtfVkVSU0lPTgorCitpZmRlZiBQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04KKyAgJChlcnJvciBEbyBub3Qgc2V0IFBMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTiBkaXJlY3RseS4gVXNlIFJFTEVBU0VfUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OLiB2YWx1ZTogJChQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04pKQorZW5kaWYKK1BMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTiA6PSAkKFJFTEVBU0VfUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OKQorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OCisKKyMgVGhpcyBpcyB0aGUgc2RrIGV4dGVuc2lvbiB2ZXJzaW9uIHRoYXQgUExBVEZPUk1fU0RLX1ZFUlNJT04gc2hpcHMgd2l0aC4KK1BMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OIDo9ICQoUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OKQorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04KKworaWZkZWYgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRQorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSBkaXJlY3RseS4gVXNlIFJFTEVBU0VfUExBVEZPUk1fVkVSU0lPTi4gdmFsdWU6ICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCitlbmRpZgorUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSA6PSAkKFJFTEVBU0VfUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUKKworaWZkZWYgUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTCisgICQoZXJyb3IgRG8gbm90IHNldCBQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMgZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUy4gdmFsdWU6ICQoUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTKSkKK2VuZGlmCitQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMgOj0gJChSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUykKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUworCitpZmRlZiBQTEFURk9STV9WRVJTSU9OX0FMTF9QUkVWSUVXX0NPREVOQU1FUworICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fVkVSU0lPTl9BTExfUFJFVklFV19DT0RFTkFNRVMgZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT05fQUxMX1BSRVZJRVdfQ09ERU5BTUVTLiB2YWx1ZTogJChQTEFURk9STV9WRVJTSU9OX0FMTF9QUkVWSUVXX0NPREVOQU1FUykpCitlbmRpZgorUExBVEZPUk1fVkVSU0lPTl9BTExfUFJFVklFV19DT0RFTkFNRVMgOj0gJChSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT05fQUxMX1BSRVZJRVdfQ09ERU5BTUVTKQorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fVkVSU0lPTl9BTExfUFJFVklFV19DT0RFTkFNRVMKKworaWZkZWYgUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRQorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSBkaXJlY3RseS4gVXNlIFJFTEVBU0VfUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRS4gdmFsdWU6ICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCitlbmRpZgorUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSA6PSAkKFJFTEVBU0VfUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSkKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZFUlNJT05fTEFTVF9TVEFCTEUKKworaWZkZWYgUExBVEZPUk1fVkVSU0lPTl9LTk9XTl9DT0RFTkFNRVMKKyAgJChlcnJvciBEbyBub3Qgc2V0IFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTIGRpcmVjdGx5LiBVc2UgUkVMRUFTRV9QTEFURk9STV9WRVJTSU9OX0tOT1dOX0NPREVOQU1FUy4gdmFsdWU6ICQoUExBVEZPUk1fVkVSU0lPTl9LTk9XTl9DT0RFTkFNRVMpKQorZW5kaWYKK1BMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTIDo9ICQoUkVMRUFTRV9QTEFURk9STV9WRVJTSU9OX0tOT1dOX0NPREVOQU1FUykKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTCiAKIGlmbmRlZiBQTEFURk9STV9WRVJTSU9OCiAgIGlmZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQpAQCAtMTYxLDI1ICsxNTAsNiBAQAogZW5kaWYKIC5LQVRJX1JFQURPTkxZIDo9IERFRkFVTFRfQVBQX1RBUkdFVF9TREsKIAotaWZuZGVmIFBMQVRGT1JNX1ZOREtfVkVSU0lPTgotICAjIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIFZOREsgdmVyc2lvbiBmb3IgdGhlIGN1cnJlbnQgVk5ESyBsaWJyYXJpZXMuCi0gICMgVGhlIHZlcnNpb24gaXMgb25seSBhdmFpbGFibGUgd2hlbiBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FID09IFJFTC4KLSAgIyBPdGhlcndpc2UsIGl0IHdpbGwgYmUgc2V0IHRvIGEgQ09ERU5BTUUgdmVyc2lvbi4gVGhlIEFCSSBpcyBhbGxvd2VkIHRvIGJlCi0gICMgY2hhbmdlZCBvbmx5IGJlZm9yZSB0aGUgQW5kcm9pZCB2ZXJzaW9uIGlzIHJlbGVhc2VkLiBPbmNlCi0gICMgUExBVEZPUk1fVk5ES19WRVJTSU9OIGlzIHNldCB0byBhY3R1YWwgdmVyc2lvbiwgdGhlIEFCSSBmb3IgdGhpcyB2ZXJzaW9uCi0gICMgd2lsbCBiZSBmcm96b24gYW5kIGVtaXQgYnVpbGQgZXJyb3JzIGlmIGFueSBBQkkgZm9yIHRoZSBWTkRLIGxpYnMgYXJlCi0gICMgY2hhbmdlZC4KLSAgIyBBZnRlciB0aGF0IHRoZSBzbmFwc2hvdCBvZiB0aGUgVk5ESyB3aXRoIHRoaXMgdmVyc2lvbiB3aWxsIGJlIGdlbmVyYXRlZC4KLSAgIwotICAjIFRoZSBWTkRLIHZlcnNpb24gZm9sbG93cyBQTEFURk9STV9TREtfVkVSU0lPTi4KLSAgaWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCi0gICAgUExBVEZPUk1fVk5ES19WRVJTSU9OIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCi0gIGVsc2UKLSAgICBQTEFURk9STV9WTkRLX1ZFUlNJT04gOj0gJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKQotICBlbmRpZgotZW5kaWYKLS5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZOREtfVkVSU0lPTgotCiBpZm5kZWYgUExBVEZPUk1fU1lTVEVNU0RLX01JTl9WRVJTSU9OCiAgICMgVGhpcyBpcyB0aGUgb2xkZXN0IHZlcnNpb24gb2Ygc3lzdGVtIFNESyB0aGF0IHRoZSBwbGF0Zm9ybSBzdXBwb3J0cy4gQ29udHJhcnkKICAgIyB0byB0aGUgcHVibGljIFNESyB3aGVyZSBwbGF0Zm9ybSBlc3NlbnRpYWxseSBzdXBwb3J0cyBhbGwgcHJldmlvdXMgU0RLIHZlcnNpb25zLApAQCAtMjQ2LDI2ICsyMTYsMTMgQEAKICMgdG8gc29vbmdfdWkuCiAkKEtBVElfb2Jzb2xldGVfdmFyIEJVSUxEX0RBVEVUSU1FLFVzZSBCVUlMRF9EQVRFVElNRV9GUk9NX0ZJTEUpCiAKLUhBU19CVUlMRF9OVU1CRVIgOj0gdHJ1ZQotaWZuZGVmIEJVSUxEX05VTUJFUgotICAjIEJVSUxEX05VTUJFUiBzaG91bGQgYmUgc2V0IHRvIHRoZSBzb3VyY2UgY29udHJvbCB2YWx1ZSB0aGF0Ci0gICMgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc291cmNlIGNvZGUuICBFLmcuLCBhCi0gICMgcGVyZm9yY2UgY2hhbmdlbGlzdCBudW1iZXIgb3IgYSBnaXQgaGFzaC4gIENhbiBiZSBhbiBhcmJpdHJhcnkgc3RyaW5nCi0gICMgKHRvIGFsbG93IGZvciBzb3VyY2UgY29udHJvbCB0aGF0IHVzZXMgc29tZXRoaW5nIG90aGVyIHRoYW4gbnVtYmVycyksCi0gICMgYnV0IG11c3QgYmUgYSBzaW5nbGUgd29yZCBhbmQgYSB2YWxpZCBmaWxlIG5hbWUuCi0gICMKLSAgIyBJZiBubyBCVUlMRF9OVU1CRVIgaXMgc2V0LCBjcmVhdGUgYSB1c2VmdWwgIkkgYW0gYW4gZW5naW5lZXJpbmcgYnVpbGQKLSAgIyBmcm9tIHRoaXMgZGF0ZS90aW1lIiB2YWx1ZS4gIE1ha2UgaXQgc3RhcnQgd2l0aCBhIG5vbi1kaWdpdCBzbyB0aGF0Ci0gICMgYW55b25lIHRyeWluZyB0byBwYXJzZSBpdCBhcyBhbiBpbnRlZ2VyIHdpbGwgcHJvYmFibHkgZ2V0ICIwIi4KLSAgQlVJTERfTlVNQkVSIDo9IGVuZy4kKHNoZWxsIGVjaG8gJCR7QlVJTERfVVNFUk5BTUU6MDo2fSkuJChzaGVsbCAkKERBVEUpICslWSVtJWQuJUglTSVTKQoraWZuZGVmIEhBU19CVUlMRF9OVU1CRVIKICAgSEFTX0JVSUxEX05VTUJFUiA6PSBmYWxzZQogZW5kaWYKLS5LQVRJX1JFQURPTkxZIDo9IEJVSUxEX05VTUJFUiBIQVNfQlVJTERfTlVNQkVSCisuS0FUSV9SRUFET05MWSA6PSBIQVNfQlVJTERfTlVNQkVSCiAKLWlmbmRlZiBQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTgotICAjIFVzZWQgdG8gc2V0IG1pbmltdW0gc3VwcG9ydGVkIHRhcmdldCBzZGsgdmVyc2lvbi4gQXBwcyB0YXJnZXRpbmcgc2RrCi0gICMgdmVyc2lvbiBsb3dlciB0aGFuIHRoZSBzZXQgdmFsdWUgd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nIGJlaW5nIHNob3duCi0gICMgd2hlbiBhbnkgYWN0aXZpdHkgZnJvbSB0aGUgYXBwIGlzIHN0YXJ0ZWQuCi0gIFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OIDo9IDI4CitpZmRlZiBQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTgorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fTUlOX1NVUFBPUlRFRF9UQVJHRVRfU0RLX1ZFUlNJT04gZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OLiB2YWx1ZTogJChQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTikpCiBlbmRpZgorUExBVEZPUk1fTUlOX1NVUFBPUlRFRF9UQVJHRVRfU0RLX1ZFUlNJT04gOj0gJChSRUxFQVNFX1BMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OKQogLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fTUlOX1NVUFBPUlRFRF9UQVJHRVRfU0RLX1ZFUlNJT04KZGlmZiAtLWdpdCBhL2VudnNldHVwLnNoIGIvZW52c2V0dXAuc2gKaW5kZXggOTA1NjM1Yy4uMDZkYWRkMyAxMDA2NDQKLS0tIGEvZW52c2V0dXAuc2gKKysrIGIvZW52c2V0dXAuc2gKQEAgLTQ4LDgxICs0OCwxMyBAQAogZmkKIElNUE9SVElOR19FTlZTRVRVUD10cnVlIHNvdXJjZSAkVC9idWlsZC9tYWtlL3NoZWxsX3V0aWxzLnNoCiAKLQotIyBIZWxwCi1mdW5jdGlvbiBobW0oKSB7Ci1jYXQgPDxFT0YKLQotUnVuICJtIGhlbHAiIGZvciBoZWxwIHdpdGggdGhlIGJ1aWxkIHN5c3RlbSBpdHNlbGYuCi0KLUludm9rZSAiLiBidWlsZC9lbnZzZXR1cC5zaCIgZnJvbSB5b3VyIHNoZWxsIHRvIGFkZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byB5b3VyIGVudmlyb25tZW50OgotLSBsdW5jaDogICAgICBsdW5jaCA8cHJvZHVjdF9uYW1lPi08YnVpbGRfdmFyaWFudD4KLSAgICAgICAgICAgICAgU2VsZWN0cyA8cHJvZHVjdF9uYW1lPiBhcyB0aGUgcHJvZHVjdCB0byBidWlsZCwgYW5kIDxidWlsZF92YXJpYW50PiBhcyB0aGUgdmFyaWFudCB0bwotICAgICAgICAgICAgICBidWlsZCwgYW5kIHN0b3JlcyB0aG9zZSBzZWxlY3Rpb25zIGluIHRoZSBlbnZpcm9ubWVudCB0byBiZSByZWFkIGJ5IHN1YnNlcXVlbnQKLSAgICAgICAgICAgICAgaW52b2NhdGlvbnMgb2YgJ20nIGV0Yy4KLS0gdGFwYXM6ICAgICAgdGFwYXMgWzxBcHAxPiA8QXBwMj4gLi4uXSBbYXJtfHg4Nnxhcm02NHx4ODZfNjRdIFtlbmd8dXNlcmRlYnVnfHVzZXJdCi0gICAgICAgICAgICAgIFNldHMgdXAgdGhlIGJ1aWxkIGVudmlyb25tZW50IGZvciBidWlsZGluZyB1bmJ1bmRsZWQgYXBwcyAoQVBLcykuCi0tIGJhbmNoYW46ICAgIGJhbmNoYW4gPG1vZHVsZTE+IFs8bW9kdWxlMj4gLi4uXSBbYXJtfHg4Nnxhcm02NHx4ODZfNjR8YXJtNjRfb25seXx4ODZfNjRvbmx5XSBcCi0gICAgICAgICAgICAgICAgICAgICAgW2VuZ3x1c2VyZGVidWd8dXNlcl0KLSAgICAgICAgICAgICAgU2V0cyB1cCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgZm9yIGJ1aWxkaW5nIHVuYnVuZGxlZCBtb2R1bGVzIChBUEVYZXMpLgotLSBjcm9vdDogICAgICBDaGFuZ2VzIGRpcmVjdG9yeSB0byB0aGUgdG9wIG9mIHRoZSB0cmVlLCBvciBhIHN1YmRpcmVjdG9yeSB0aGVyZW9mLgotLSBtOiAgICAgICAgICBNYWtlcyBmcm9tIHRoZSB0b3Agb2YgdGhlIHRyZWUuCi0tIG1tOiAgICAgICAgIEJ1aWxkcyBhbmQgaW5zdGFsbHMgYWxsIG9mIHRoZSBtb2R1bGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIHRoZWlyCi0gICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4KLS0gbW1tOiAgICAgICAgQnVpbGRzIGFuZCBpbnN0YWxscyBhbGwgb2YgdGhlIG1vZHVsZXMgaW4gdGhlIHN1cHBsaWVkIGRpcmVjdG9yaWVzLCBhbmQgdGhlaXIKLSAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLgotICAgICAgICAgICAgICBUbyBsaW1pdCB0aGUgbW9kdWxlcyBiZWluZyBidWlsdCB1c2UgdGhlIHN5bnRheDogbW1tIGRpci86dGFyZ2V0MSx0YXJnZXQyLgotLSBtbWE6ICAgICAgICBTYW1lIGFzICdtbScKLS0gbW1tYTogICAgICAgU2FtZSBhcyAnbW1tJwotLSBwcm92aXNpb246ICBGbGFzaCBkZXZpY2Ugd2l0aCBhbGwgcmVxdWlyZWQgcGFydGl0aW9ucy4gT3B0aW9ucyB3aWxsIGJlIHBhc3NlZCBvbiB0byBmYXN0Ym9vdC4KLS0gY2dyZXA6ICAgICAgR3JlcHMgb24gYWxsIGxvY2FsIEMvQysrIGZpbGVzLgotLSBnZ3JlcDogICAgICBHcmVwcyBvbiBhbGwgbG9jYWwgR3JhZGxlIGZpbGVzLgotLSBnb2dyZXA6ICAgICBHcmVwcyBvbiBhbGwgbG9jYWwgR28gZmlsZXMuCi0tIGpncmVwOiAgICAgIEdyZXBzIG9uIGFsbCBsb2NhbCBKYXZhIGZpbGVzLgotLSBqc29uZ3JlcDogICBHcmVwcyBvbiBhbGwgbG9jYWwgSnNvbiBmaWxlcy4KLS0ga3RncmVwOiAgICAgR3JlcHMgb24gYWxsIGxvY2FsIEtvdGxpbiBmaWxlcy4KLS0gcmVzZ3JlcDogICAgR3JlcHMgb24gYWxsIGxvY2FsIHJlcy8qLnhtbCBmaWxlcy4KLS0gbWFuZ3JlcDogICAgR3JlcHMgb24gYWxsIGxvY2FsIEFuZHJvaWRNYW5pZmVzdC54bWwgZmlsZXMuCi0tIG1ncmVwOiAgICAgIEdyZXBzIG9uIGFsbCBsb2NhbCBNYWtlZmlsZXMgYW5kICouYnAgZmlsZXMuCi0tIG93bmdyZXA6ICAgIEdyZXBzIG9uIGFsbCBsb2NhbCBPV05FUlMgZmlsZXMuCi0tIHJzZ3JlcDogICAgIEdyZXBzIG9uIGFsbCBsb2NhbCBSdXN0IGZpbGVzLgotLSBzZXBncmVwOiAgICBHcmVwcyBvbiBhbGwgbG9jYWwgc2Vwb2xpY3kgZmlsZXMuCi0tIHNncmVwOiAgICAgIEdyZXBzIG9uIGFsbCBsb2NhbCBzb3VyY2UgZmlsZXMuCi0tIHRvbWxncmVwOiAgIEdyZXBzIG9uIGFsbCBsb2NhbCBUb21sIGZpbGVzLgotLSBweWdyZXA6ICAgICBHcmVwcyBvbiBhbGwgbG9jYWwgUHl0aG9uIGZpbGVzLgotLSBnb2RpcjogICAgICBHbyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBmaWxlLgotLSBhbGxtb2Q6ICAgICBMaXN0IGFsbCBtb2R1bGVzLgotLSBnb21vZDogICAgICBHbyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBtb2R1bGUuCi0tIGJtb2Q6ICAgICAgIEdldCB0aGUgQmF6ZWwgbGFiZWwgb2YgYSBTb29uZyBtb2R1bGUgaWYgaXQgaXMgY29udmVydGVkIHdpdGggYnAyYnVpbGQuCi0tIHBhdGhtb2Q6ICAgIEdldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBtb2R1bGUuCi0tIG91dG1vZDogICAgIEdldHMgdGhlIGxvY2F0aW9uIG9mIGEgbW9kdWxlJ3MgaW5zdGFsbGVkIG91dHB1dHMgd2l0aCBhIGNlcnRhaW4gZXh0ZW5zaW9uLgotLSBkaXJtb2RzOiAgICBHZXRzIHRoZSBtb2R1bGVzIGRlZmluZWQgaW4gYSBnaXZlbiBkaXJlY3RvcnkuCi0tIGluc3RhbGxtb2Q6IEFkYiBpbnN0YWxscyBhIG1vZHVsZSdzIGJ1aWx0IEFQSy4KLS0gcmVmcmVzaG1vZDogUmVmcmVzaCBsaXN0IG9mIG1vZHVsZXMgZm9yIGFsbG1vZC9nb21vZC9wYXRobW9kL291dG1vZC9pbnN0YWxsbW9kLgotLSBzeXN3cml0ZTogICBSZW1vdW50IHBhcnRpdGlvbnMgKGUuZy4gc3lzdGVtLmltZykgYXMgd3JpdGFibGUsIHJlYm9vdGluZyBpZiBuZWNlc3NhcnkuCi0KLUVudmlyb25tZW50IG9wdGlvbnM6Ci0tIFNBTklUSVpFX0hPU1Q6IFNldCB0byAnYWRkcmVzcycgdG8gdXNlIEFTQU4gZm9yIGFsbCBob3N0IG1vZHVsZXMuCi0tIEFORFJPSURfUVVJRVRfQlVJTEQ6IHNldCB0byAndHJ1ZScgdG8gZGlzcGxheSBvbmx5IHRoZSBlc3NlbnRpYWwgbWVzc2FnZXMuCi0KLUxvb2sgYXQgdGhlIHNvdXJjZSB0byB2aWV3IG1vcmUgZnVuY3Rpb25zLiBUaGUgY29tcGxldGUgbGlzdCBpczoKLUVPRgotICAgIGxvY2FsIFQ9JChnZXR0b3ApCi0gICAgbG9jYWwgQT0iIgotICAgIGxvY2FsIGkKLSAgICBmb3IgaSBpbiBgY2F0ICRUL2J1aWxkL2VudnNldHVwLnNoIHwgc2VkIC1uICIvXltbOmJsYW5rOl1dKmZ1bmN0aW9uIC9zL2Z1bmN0aW9uIFwoW2Etel9dKlwpLiovXDEvcCIgfCBzb3J0IHwgdW5pcWA7IGRvCi0gICAgICBBPSIkQSAkaSIKLSAgICBkb25lCi0gICAgZWNobyAkQQotfQotCiAjIEdldCBhbGwgdGhlIGJ1aWxkIHZhcmlhYmxlcyBuZWVkZWQgYnkgdGhpcyBzY3JpcHQgaW4gYSBzaW5nbGUgY2FsbCB0byB0aGUgYnVpbGQgc3lzdGVtLgogZnVuY3Rpb24gYnVpbGRfYnVpbGRfdmFyX2NhY2hlKCkKIHsKICAgICBsb2NhbCBUPSQoZ2V0dG9wKQogICAgICMgR3JlcCBvdXQgdGhlIHZhcmlhYmxlIG5hbWVzIGZyb20gdGhlIHNjcmlwdC4KLSAgICBjYWNoZWRfdmFycz0oYGNhdCAkVC9idWlsZC9lbnZzZXR1cC5zaCB8IHRyICcoKScgJyAgJyB8IGF3ayAne2ZvcihpPTE7aTw9TkY7aSsrKSBpZigkaX4vZ2V0X2J1aWxkX3Zhci8pIHByaW50ICQoaSsxKX0nIHwgc29ydCAtdSB8IHRyICdcbicgJyAnYCkKLSAgICBjYWNoZWRfYWJzX3ZhcnM9KGBjYXQgJFQvYnVpbGQvZW52c2V0dXAuc2ggfCB0ciAnKCknICcgICcgfCBhd2sgJ3tmb3IoaT0xO2k8PU5GO2krKykgaWYoJGl+L2dldF9hYnNfYnVpbGRfdmFyLykgcHJpbnQgJChpKzEpfScgfCBzb3J0IC11IHwgdHIgJ1xuJyAnICdgKQorICAgIGNhY2hlZF92YXJzPShgY2F0ICRUL2J1aWxkL2VudnNldHVwLnNoIHwgdHIgJygpJyAnICAnIHwgYXdrICd7Zm9yKGk9MTtpPD1ORjtpKyspIGlmKCRpfi9fZ2V0X2J1aWxkX3Zhcl9jYWNoZWQvKSBwcmludCAkKGkrMSl9JyB8IHNvcnQgLXUgfCB0ciAnXG4nICcgJ2ApCisgICAgY2FjaGVkX2Fic192YXJzPShgY2F0ICRUL2J1aWxkL2VudnNldHVwLnNoIHwgdHIgJygpJyAnICAnIHwgYXdrICd7Zm9yKGk9MTtpPD1ORjtpKyspIGlmKCRpfi9fZ2V0X2Fic19idWlsZF92YXJfY2FjaGVkLykgcHJpbnQgJChpKzEpfScgfCBzb3J0IC11IHwgdHIgJ1xuJyAnICdgKQogICAgICMgQ2FsbCB0aGUgYnVpbGQgc3lzdGVtIHRvIGR1bXAgdGhlICI8dmFsPj08dmFsdWU+IiBwYWlycyBhcyBhIHNoZWxsIHNjcmlwdC4KICAgICBidWlsZF9kaWN0c19zY3JpcHQ9YFxidWlsdGluIGNkICRUOyBidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tZHVtcHZhcnMtbW9kZSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAtLXZhcnM9IiR7Y2FjaGVkX3ZhcnNbKl19IiBcCkBAIC0xNjMsNyArOTUsNyBAQAogfQogCiAjIEdldCB0aGUgdmFsdWUgb2YgYSBidWlsZCB2YXJpYWJsZSBhcyBhbiBhYnNvbHV0ZSBwYXRoLgotZnVuY3Rpb24gZ2V0X2Fic19idWlsZF92YXIoKQorZnVuY3Rpb24gX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCgpCiB7CiAgICAgaWYgWyAiJEJVSUxEX1ZBUl9DQUNIRV9SRUFEWSIgPSAidHJ1ZSIgXQogICAgIHRoZW4KQEAgLTE4MCw3ICsxMTIsNyBAQAogfQogCiAjIEdldCB0aGUgZXhhY3QgdmFsdWUgb2YgYSBidWlsZCB2YXJpYWJsZS4KLWZ1bmN0aW9uIGdldF9idWlsZF92YXIoKQorZnVuY3Rpb24gX2dldF9idWlsZF92YXJfY2FjaGVkKCkKIHsKICAgICBpZiBbICIkQlVJTERfVkFSX0NBQ0hFX1JFQURZIiA9ICJ0cnVlIiBdCiAgICAgdGhlbgpAQCAtMTk2LDM5ICsxMjgsMTkgQEAKICAgICAoXGNkICRUOyBidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tZHVtcHZhci1tb2RlICQxKQogfQogCi0jIGNoZWNrIHRvIHNlZSBpZiB0aGUgc3VwcGxpZWQgcHJvZHVjdCBpcyBvbmUgd2UgY2FuIGJ1aWxkCi1mdW5jdGlvbiBjaGVja19wcm9kdWN0KCkKKyMgVGhpcyBsb2dpYyBtYXRjaGVzIGVudnNldHVwLm1rCitmdW5jdGlvbiBnZXRfaG9zdF9wcmVidWlsdF9wcmVmaXgKIHsKLSAgICBsb2NhbCBUPSQoZ2V0dG9wKQotICAgIGlmIFsgISAiJFQiIF07IHRoZW4KLSAgICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIiA+JjIKLSAgICAgICAgcmV0dXJuCi0gICAgZmkKLSAgICAgICAgVEFSR0VUX1BST0RVQ1Q9JDEgXAotICAgICAgICBUQVJHRVRfQlVJTERfVkFSSUFOVD0gXAotICAgICAgICBUQVJHRVRfQlVJTERfVFlQRT0gXAotICAgICAgICBUQVJHRVRfQlVJTERfQVBQUz0gXAotICAgICAgICBnZXRfYnVpbGRfdmFyIFRBUkdFVF9ERVZJQ0UgPiAvZGV2L251bGwKLSAgICAjIGhpZGUgc3VjY2Vzc2Z1bCBhbnN3ZXJzLCBidXQgYWxsb3cgdGhlIGVycm9ycyB0byBzaG93CisgIGxvY2FsIHVuPSQodW5hbWUpCisgIGlmIFtbICR1biA9PSAiTGludXgiIF1dIDsgdGhlbgorICAgIGVjaG8gbGludXgteDg2CisgIGVsaWYgW1sgJHVuID09ICJEYXJ3aW4iIF1dIDsgdGhlbgorICAgIGVjaG8gZGFyd2luLXg4NgorICBlbHNlCisgICAgZWNobyAiRXJyb3I6IEludmFsaWQgaG9zdCBvcGVyYXRpbmcgc3lzdGVtOiAkdW4iIDE+JjIKKyAgZmkKIH0KIAotVkFSSUFOVF9DSE9JQ0VTPSh1c2VyIHVzZXJkZWJ1ZyBlbmcpCi0KLSMgY2hlY2sgdG8gc2VlIGlmIHRoZSBzdXBwbGllZCB2YXJpYW50IGlzIHZhbGlkCi1mdW5jdGlvbiBjaGVja192YXJpYW50KCkKLXsKLSAgICBsb2NhbCB2Ci0gICAgZm9yIHYgaW4gJHtWQVJJQU5UX0NIT0lDRVNbQF19Ci0gICAgZG8KLSAgICAgICAgaWYgWyAiJHYiID0gIiQxIiBdCi0gICAgICAgIHRoZW4KLSAgICAgICAgICAgIHJldHVybiAwCi0gICAgICAgIGZpCi0gICAgZG9uZQotICAgIHJldHVybiAxCi19Ci0KLQogIyBBZGQgZGlyZWN0b3JpZXMgdG8gUEFUSCB0aGF0IGFyZSBkZXBlbmRlbnQgb24gdGhlIGx1bmNoIHRhcmdldC4KICMgRm9yIGRpcmVjdG9yaWVzIHRoYXQgYXJlIG5vdCBsdW5jaC1zcGVjaWZpYywgYWRkIHRoZW0gaW4gc2V0X2dsb2JhbF9wYXRocwogZnVuY3Rpb24gc2V0X2x1bmNoX3BhdGhzKCkKQEAgLTI1Myw3ICsxNjUsNyBAQAogICAgICMgTm90ZTogb24gd2luZG93cy9jeWd3aW4sIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMgd2lsbCBjb250YWluIHNwYWNlcwogICAgICMgZHVlIHRvICJDOlxQcm9ncmFtIEZpbGVzIiBiZWluZyBpbiB0aGUgcGF0aC4KIAotICAgICMgSGFuZGxlIGNvbXBhdCB3aXRoIHRoZSBvbGQgQU5EUk9JRF9CVUlMRF9QQVRIUyB2YXJpYWJsZS4gCisgICAgIyBIYW5kbGUgY29tcGF0IHdpdGggdGhlIG9sZCBBTkRST0lEX0JVSUxEX1BBVEhTIHZhcmlhYmxlLgogICAgICMgVE9ETzogUmVtb3ZlIHRoaXMgYWZ0ZXIgd2UgdGhpbmsgZXZlcnlvbmUgaGFzIGx1bmNoZWQgYWdhaW4uCiAgICAgaWYgWyAteiAiJEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMiIC1hIC1uICIkQU5EUk9JRF9CVUlMRF9QQVRIUyIgXSA7IHRoZW4KICAgICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFM9IiRBTkRST0lEX0JVSUxEX1BBVEhTIgpAQCAtMjcyLDI1ICsxODQsMjUgQEAKICAgICBmaQogCiAgICAgIyBBbmQgaW4gd2l0aCB0aGUgbmV3Li4uCi0gICAgQU5EUk9JRF9MVU5DSF9CVUlMRF9QQVRIUz0kKGdldF9hYnNfYnVpbGRfdmFyIFNPT05HX0hPU1RfT1VUX0VYRUNVVEFCTEVTKQotICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMrPTokKGdldF9hYnNfYnVpbGRfdmFyIEhPU1RfT1VUX0VYRUNVVEFCTEVTKQorICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFM9JChfZ2V0X2Fic19idWlsZF92YXJfY2FjaGVkIFNPT05HX0hPU1RfT1VUX0VYRUNVVEFCTEVTKQorICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMrPTokKF9nZXRfYWJzX2J1aWxkX3Zhcl9jYWNoZWQgSE9TVF9PVVRfRVhFQ1VUQUJMRVMpCiAKICAgICAjIEFwcGVuZCBsbHZtIGJpbnV0aWxzIHByZWJ1aWx0cyBwYXRoIHRvIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMuCi0gICAgbG9jYWwgQU5EUk9JRF9MTFZNX0JJTlVUSUxTPSQoZ2V0X2Fic19idWlsZF92YXIgQU5EUk9JRF9DTEFOR19QUkVCVUlMVFMpL2xsdm0tYmludXRpbHMtc3RhYmxlCisgICAgbG9jYWwgQU5EUk9JRF9MTFZNX0JJTlVUSUxTPSQoX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCBBTkRST0lEX0NMQU5HX1BSRUJVSUxUUykvbGx2bS1iaW51dGlscy1zdGFibGUKICAgICBBTkRST0lEX0xVTkNIX0JVSUxEX1BBVEhTKz06JEFORFJPSURfTExWTV9CSU5VVElMUwogCiAgICAgIyBTZXQgdXAgQVNBTl9TWU1CT0xJWkVSX1BBVEggZm9yIFNBTklUSVpFX0hPU1Q9YWRkcmVzcyBidWlsZHMuCiAgICAgZXhwb3J0IEFTQU5fU1lNQk9MSVpFUl9QQVRIPSRBTkRST0lEX0xMVk1fQklOVVRJTFMvbGx2bS1zeW1ib2xpemVyCiAKICAgICAjIEFwcGVuZCBhc3VpdGUgcHJlYnVpbHRzIHBhdGggdG8gQU5EUk9JRF9MVU5DSF9CVUlMRF9QQVRIUy4KLSAgICBsb2NhbCBvc19hcmNoPSQoZ2V0X2J1aWxkX3ZhciBIT1NUX1BSRUJVSUxUX1RBRykKKyAgICBsb2NhbCBvc19hcmNoPSQoX2dldF9idWlsZF92YXJfY2FjaGVkIEhPU1RfUFJFQlVJTFRfVEFHKQogICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMrPTokVC9wcmVidWlsdHMvYXN1aXRlL2FjbG91ZC8kb3NfYXJjaAogICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMrPTokVC9wcmVidWlsdHMvYXN1aXRlL2FpZGVnZW4vJG9zX2FyY2gKICAgICBBTkRST0lEX0xVTkNIX0JVSUxEX1BBVEhTKz06JFQvcHJlYnVpbHRzL2FzdWl0ZS9hdGVzdC8kb3NfYXJjaAogCi0gICAgZXhwb3J0IEFORFJPSURfSkFWQV9IT01FPSQoZ2V0X2Fic19idWlsZF92YXIgQU5EUk9JRF9KQVZBX0hPTUUpCisgICAgZXhwb3J0IEFORFJPSURfSkFWQV9IT01FPSQoX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCBBTkRST0lEX0pBVkFfSE9NRSkKICAgICBleHBvcnQgSkFWQV9IT01FPSRBTkRST0lEX0pBVkFfSE9NRQotICAgIGV4cG9ydCBBTkRST0lEX0pBVkFfVE9PTENIQUlOPSQoZ2V0X2Fic19idWlsZF92YXIgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTikKKyAgICBleHBvcnQgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTj0kKF9nZXRfYWJzX2J1aWxkX3Zhcl9jYWNoZWQgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTikKICAgICBBTkRST0lEX0xVTkNIX0JVSUxEX1BBVEhTKz06JEFORFJPSURfSkFWQV9UT09MQ0hBSU4KIAogICAgICMgRml4IHVwIFBZVEhPTlBBVEgKQEAgLTMxMiwyNyArMjI0LDI3IEBACiAgICAgIyB3b3VsZCBwcmV2ZW50IGV4cG9ydGluZyB0eXBlIGluZm8gZnJvbSB0aG9zZSBwYWNrYWdlcy4KICAgICAjCiAgICAgIyBodHRwOi8vYi8yNjY2ODgwODYKLSAgICBleHBvcnQgQU5EUk9JRF9QWVRIT05QQVRIPSRUL2RldmVsb3BtZW50L3B5dGhvbi1wYWNrYWdlcy9hZGI6JFQvZGV2ZWxvcG1lbnQvcHl0aG9uLXBhY2thZ2VzOgorICAgIGV4cG9ydCBBTkRST0lEX1BZVEhPTlBBVEg9JFQvZGV2ZWxvcG1lbnQvcHl0aG9uLXBhY2thZ2VzL2FkYjokVC9kZXZlbG9wbWVudC9weXRob24tcGFja2FnZXMvZ2RicnVubmVyOiRUL2RldmVsb3BtZW50L3B5dGhvbi1wYWNrYWdlczoKICAgICBpZiBbIC1uICRWRU5ET1JfUFlUSE9OUEFUSCBdOyB0aGVuCiAgICAgICAgIEFORFJPSURfUFlUSE9OUEFUSD0kQU5EUk9JRF9QWVRIT05QQVRIJFZFTkRPUl9QWVRIT05QQVRICiAgICAgZmkKICAgICBleHBvcnQgUFlUSE9OUEFUSD0kQU5EUk9JRF9QWVRIT05QQVRIJFBZVEhPTlBBVEgKIAogICAgIHVuc2V0IEFORFJPSURfUFJPRFVDVF9PVVQKLSAgICBleHBvcnQgQU5EUk9JRF9QUk9EVUNUX09VVD0kKGdldF9hYnNfYnVpbGRfdmFyIFBST0RVQ1RfT1VUKQorICAgIGV4cG9ydCBBTkRST0lEX1BST0RVQ1RfT1VUPSQoX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCBQUk9EVUNUX09VVCkKICAgICBleHBvcnQgT1VUPSRBTkRST0lEX1BST0RVQ1RfT1VUCiAKICAgICB1bnNldCBBTkRST0lEX0hPU1RfT1VUCi0gICAgZXhwb3J0IEFORFJPSURfSE9TVF9PVVQ9JChnZXRfYWJzX2J1aWxkX3ZhciBIT1NUX09VVCkKKyAgICBleHBvcnQgQU5EUk9JRF9IT1NUX09VVD0kKF9nZXRfYWJzX2J1aWxkX3Zhcl9jYWNoZWQgSE9TVF9PVVQpCiAKICAgICB1bnNldCBBTkRST0lEX1NPT05HX0hPU1RfT1VUCi0gICAgZXhwb3J0IEFORFJPSURfU09PTkdfSE9TVF9PVVQ9JChnZXRfYWJzX2J1aWxkX3ZhciBTT09OR19IT1NUX09VVCkKKyAgICBleHBvcnQgQU5EUk9JRF9TT09OR19IT1NUX09VVD0kKF9nZXRfYWJzX2J1aWxkX3Zhcl9jYWNoZWQgU09PTkdfSE9TVF9PVVQpCiAKICAgICB1bnNldCBBTkRST0lEX0hPU1RfT1VUX1RFU1RDQVNFUwotICAgIGV4cG9ydCBBTkRST0lEX0hPU1RfT1VUX1RFU1RDQVNFUz0kKGdldF9hYnNfYnVpbGRfdmFyIEhPU1RfT1VUX1RFU1RDQVNFUykKKyAgICBleHBvcnQgQU5EUk9JRF9IT1NUX09VVF9URVNUQ0FTRVM9JChfZ2V0X2Fic19idWlsZF92YXJfY2FjaGVkIEhPU1RfT1VUX1RFU1RDQVNFUykKIAogICAgIHVuc2V0IEFORFJPSURfVEFSR0VUX09VVF9URVNUQ0FTRVMKLSAgICBleHBvcnQgQU5EUk9JRF9UQVJHRVRfT1VUX1RFU1RDQVNFUz0kKGdldF9hYnNfYnVpbGRfdmFyIFRBUkdFVF9PVVRfVEVTVENBU0VTKQorICAgIGV4cG9ydCBBTkRST0lEX1RBUkdFVF9PVVRfVEVTVENBU0VTPSQoX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCBUQVJHRVRfT1VUX1RFU1RDQVNFUykKIAogICAgICMgRmluYWxseSwgc2V0IFBBVEgKICAgICBleHBvcnQgUEFUSD0kQU5EUk9JRF9MVU5DSF9CVUlMRF9QQVRIUzokUEFUSApAQCAtMzY1LDcgKzI3Nyw4IEBACiAgICAgZmkKIAogICAgICMgQW5kIGluIHdpdGggdGhlIG5ldy4uLgotICAgIEFORFJPSURfR0xPQkFMX0JVSUxEX1BBVEhTPSRUL2J1aWxkL2JhemVsL2JpbgorICAgIEFORFJPSURfR0xPQkFMX0JVSUxEX1BBVEhTPSRUL2J1aWxkL3Nvb25nL2JpbgorICAgIEFORFJPSURfR0xPQkFMX0JVSUxEX1BBVEhTKz06JFQvYnVpbGQvYmF6ZWwvYmluCiAgICAgQU5EUk9JRF9HTE9CQUxfQlVJTERfUEFUSFMrPTokVC9kZXZlbG9wbWVudC9zY3JpcHRzCiAgICAgQU5EUk9JRF9HTE9CQUxfQlVJTERfUEFUSFMrPTokVC9wcmVidWlsdHMvZGV2dG9vbHMvdG9vbHMKIApAQCAtNDA0LDcgKzMxNyw3IEBACiAgICAgICAgIGVjaG8gIkNvdWxkbid0IGxvY2F0ZSB0aGUgdG9wIG9mIHRoZSB0cmVlLiAgVHJ5IHNldHRpbmcgVE9QLiIgPiYyCiAgICAgICAgIHJldHVybgogICAgIGZpCi0gICAgZ2V0X2J1aWxkX3ZhciByZXBvcnRfY29uZmlnCisgICAgX2dldF9idWlsZF92YXJfY2FjaGVkIHJlcG9ydF9jb25maWcKIH0KIAogZnVuY3Rpb24gc2V0X3N0dWZmX2Zvcl9lbnZpcm9ubWVudCgpCkBAIC00NjUsOSArMzc4LDYgQEAKICAgICAgICAgZmkKICAgICBkb25lCiAKLSAgICBpZiBzaG91bGRfYWRkX2NvbXBsZXRpb24gYml0IDsgdGhlbgotICAgICAgICBjb21wbGV0ZSAtQyAiYml0IC0tdGFiIiBiaXQKLSAgICBmaQogICAgIGlmIFsgLXogIiRaU0hfVkVSU0lPTiIgXTsgdGhlbgogICAgICAgICAjIERvZXNuJ3Qgd29yayBpbiB6c2guCiAgICAgICAgIGNvbXBsZXRlIC1vIG5vc3BhY2UgLUYgX2Nyb290IGNyb290CkBAIC00NzUsMjQ1ICszODUsMTUgQEAKICAgICAgICAgY29tcGxldGUgLUYgX2JhemVsX19jb21wbGV0ZSAtbyBub3NwYWNlIGIKICAgICBmaQogICAgIGNvbXBsZXRlIC1GIF9sdW5jaCBsdW5jaAorICAgIGNvbXBsZXRlIC1GIF9sdW5jaF9jb21wbGV0aW9uIGx1bmNoMgogCiAgICAgY29tcGxldGUgLUYgX2NvbXBsZXRlX2FuZHJvaWRfbW9kdWxlX25hbWVzIHBhdGhtb2QKICAgICBjb21wbGV0ZSAtRiBfY29tcGxldGVfYW5kcm9pZF9tb2R1bGVfbmFtZXMgZ29tb2QKICAgICBjb21wbGV0ZSAtRiBfY29tcGxldGVfYW5kcm9pZF9tb2R1bGVfbmFtZXMgb3V0bW9kCiAgICAgY29tcGxldGUgLUYgX2NvbXBsZXRlX2FuZHJvaWRfbW9kdWxlX25hbWVzIGluc3RhbGxtb2QKLSAgICBjb21wbGV0ZSAtRiBfY29tcGxldGVfYW5kcm9pZF9tb2R1bGVfbmFtZXMgYm1vZAogICAgIGNvbXBsZXRlIC1GIF9jb21wbGV0ZV9hbmRyb2lkX21vZHVsZV9uYW1lcyBtCiB9CiAKLWZ1bmN0aW9uIG11bHRpdHJlZV9sdW5jaF9oZWxwKCkKLXsKLSAgICBlY2hvICJ1c2FnZTogbHVuY2ggUFJPRFVDVC1WQVJJQU5UIiAxPiYyCi0gICAgZWNobyAiICAgIFNldCB1cCBhbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IGJhc2VkIG9uIGEgcHJvZHVjdCBzaG9ydCBuYW1lIGFuZCB2YXJpYW50IiAxPiYyCi0gICAgZWNobyAxPiYyCi0gICAgZWNobyAibHVuY2ggQ09NQk9fRklMRSBWQVJJQU5UIiAxPiYyCi0gICAgZWNobyAiICAgIFNldCB1cCBhbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IGJhc2VkIG9uIGEgc3BlY2lmaWMgbHVuY2ggY29tYm8gZmlsZSIgMT4mMgotICAgIGVjaG8gIiAgICBhbmQgdmFyaWFudC4iIDE+JjIKLSAgICBlY2hvIDE+JjIKLSAgICBlY2hvICJsdW5jaCAtLXByaW50IFtDT05GSUddIiAxPiYyCi0gICAgZWNobyAiICAgIFByaW50IHRoZSBjb250ZW50cyBvZiBhIGNvbmZpZ3VyYXRpb24uICBJZiBDT05GSUcgaXMgc3VwcGxpZWQsIHRoYXQgY29uZmlnIiAxPiYyCi0gICAgZWNobyAiICAgIHdpbGwgYmUgZmxhdHRlbmVkIGFuZCBwcmludGVkLiAgSWYgQ09ORklHIGlzIG5vdCBzdXBwbGllZCwgdGhlIGN1cnJlbnRseSIgMT4mMgotICAgIGVjaG8gIiAgICBzZWxlY3RlZCBjb25maWcgd2lsbCBiZSBwcmludGVkLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3Igbm9uemVybyBvbiBlcnJvci4iIDE+JjIKLSAgICBlY2hvIDE+JjIKLSAgICBlY2hvICJsdW5jaCAtLWxpc3QiIDE+JjIKLSAgICBlY2hvICIgICAgTGlzdCBhbGwgcG9zc2libGUgY29tYm8gZmlsZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUiIDE+JjIKLSAgICBlY2hvIDE+JjIKLSAgICBlY2hvICJsdW5jaCAtLWhlbHAiIDE+JjIKLSAgICBlY2hvICJsdW5jaCAtaCIgMT4mMgotICAgIGVjaG8gIiAgICBQcmludHMgdGhpcyBtZXNzYWdlLiIgMT4mMgotfQotCi1mdW5jdGlvbiBtdWx0aXRyZWVfbHVuY2goKQotewotICAgIGxvY2FsIGNvZGUKLSAgICBsb2NhbCByZXN1bHRzCi0gICAgIyBMdW5jaCBtdXN0IGJlIHJ1biBpbiB0aGUgdG9wZGlyLCBidXQgdGhpcyB3YXkgd2UgZ2V0IGEgY2xlYXIgZXJyb3IKLSAgICAjIG1lc3NhZ2UsIGluc3RlYWQgb2YgRmlsZU5vdEZvdW5kLgotICAgIGxvY2FsIFQ9JChtdWx0aXRyZWVfZ2V0dG9wKQotICAgIGlmIFsgLXogIiRUIiBdOyB0aGVuCi0gICAgICBfbXVsdGl0cmVlX2x1bmNoX2Vycm9yCi0gICAgICByZXR1cm4gMQotICAgIGZpCi0gICAgaWYgJChlY2hvICIkMSIgfCBncmVwIC1xICdeLScpIDsgdGhlbgotICAgICAgICAjIENhbGxzIHN0YXJ0aW5nIHdpdGggYSAtLSBhcmd1bWVudCBhcmUgcGFzc2VkIGRpcmVjdGx5IGFuZCB0aGUgZnVuY3Rpb24KLSAgICAgICAgIyByZXR1cm5zIHdpdGggdGhlIGx1bmNoLnB5IGV4aXQgY29kZS4KLSAgICAgICAgIiR7VH0vb3JjaGVzdHJhdG9yL2J1aWxkL29yY2hlc3RyYXRvci9jb3JlL2x1bmNoLnB5IiAiJEAiCi0gICAgICAgIGNvZGU9JD8KLSAgICAgICAgaWYgW1sgJGNvZGUgLWVxIDIgXV0gOyB0aGVuCi0gICAgICAgICAgZWNobyAxPiYyCi0gICAgICAgICAgbXVsdGl0cmVlX2x1bmNoX2hlbHAKLSAgICAgICAgICByZXR1cm4gJGNvZGUKLSAgICAgICAgZWxpZiBbWyAkY29kZSAtbmUgMCBdXSA7IHRoZW4KLSAgICAgICAgICByZXR1cm4gJGNvZGUKLSAgICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAgICMgQWxsIG90aGVyIGNhbGxzIGdvIHRocm91Z2ggdGhlIC0tbHVuY2ggdmFyaWFudCBvZiBsdW5jaC5weQotICAgICAgICByZXN1bHRzPSgkKCR7VH0vb3JjaGVzdHJhdG9yL2J1aWxkL29yY2hlc3RyYXRvci9jb3JlL2x1bmNoLnB5IC0tbHVuY2ggIiRAIikpCi0gICAgICAgIGNvZGU9JD8KLSAgICAgICAgaWYgW1sgJGNvZGUgLWVxIDIgXV0gOyB0aGVuCi0gICAgICAgICAgZWNobyAxPiYyCi0gICAgICAgICAgbXVsdGl0cmVlX2x1bmNoX2hlbHAKLSAgICAgICAgICByZXR1cm4gJGNvZGUKLSAgICAgICAgZWxpZiBbWyAkY29kZSAtbmUgMCBdXSA7IHRoZW4KLSAgICAgICAgICByZXR1cm4gJGNvZGUKLSAgICAgICAgZmkKLQotICAgICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX0NPTUJPPSR7cmVzdWx0c1swXX0KLSAgICAgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPSR7cmVzdWx0c1sxXX0KLSAgICBmaQotfQotCi1mdW5jdGlvbiBjaG9vc2V0eXBlKCkKLXsKLSAgICBlY2hvICJCdWlsZCB0eXBlIGNob2ljZXMgYXJlOiIKLSAgICBlY2hvICIgICAgIDEuIHJlbGVhc2UiCi0gICAgZWNobyAiICAgICAyLiBkZWJ1ZyIKLSAgICBlY2hvCi0KLSAgICBsb2NhbCBERUZBVUxUX05VTSBERUZBVUxUX1ZBTFVFCi0gICAgREVGQVVMVF9OVU09MQotICAgIERFRkFVTFRfVkFMVUU9cmVsZWFzZQotCi0gICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9UWVBFPQotICAgIGxvY2FsIEFOU1dFUgotICAgIHdoaWxlIFsgLXogJFRBUkdFVF9CVUlMRF9UWVBFIF0KLSAgICBkbwotICAgICAgICBlY2hvIC1uICJXaGljaCB3b3VsZCB5b3UgbGlrZT8gWyIkREVGQVVMVF9OVU0iXSAiCi0gICAgICAgIGlmIFsgLXogIiQxIiBdIDsgdGhlbgotICAgICAgICAgICAgcmVhZCBBTlNXRVIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAkMQotICAgICAgICAgICAgQU5TV0VSPSQxCi0gICAgICAgIGZpCi0gICAgICAgIGNhc2UgJEFOU1dFUiBpbgotICAgICAgICAiIikKLSAgICAgICAgICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVFlQRT0kREVGQVVMVF9WQUxVRQotICAgICAgICAgICAgOzsKLSAgICAgICAgMSkKLSAgICAgICAgICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVFlQRT1yZWxlYXNlCi0gICAgICAgICAgICA7OwotICAgICAgICByZWxlYXNlKQotICAgICAgICAgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9UWVBFPXJlbGVhc2UKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIDIpCi0gICAgICAgICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1RZUEU9ZGVidWcKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIGRlYnVnKQotICAgICAgICAgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9UWVBFPWRlYnVnCi0gICAgICAgICAgICA7OwotICAgICAgICAqKQotICAgICAgICAgICAgZWNobwotICAgICAgICAgICAgZWNobyAiSSBkaWRuJ3QgdW5kZXJzdGFuZCB5b3VyIHJlc3BvbnNlLiAgUGxlYXNlIHRyeSBhZ2Fpbi4iCi0gICAgICAgICAgICBlY2hvCi0gICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIGlmIFsgLW4gIiQxIiBdIDsgdGhlbgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi0KLSAgICBidWlsZF9idWlsZF92YXJfY2FjaGUKLSAgICBzZXRfc3R1ZmZfZm9yX2Vudmlyb25tZW50Ci0gICAgZGVzdHJveV9idWlsZF92YXJfY2FjaGUKLX0KLQotIwotIyBUaGlzIGZ1bmN0aW9uIGlzbid0IHJlYWxseSByaWdodDogIEl0IGNob29zZXMgYSBUQVJHRVRfUFJPRFVDVAotIyBiYXNlZCBvbiB0aGUgbGlzdCBvZiBib2FyZHMuICBVc3VhbGx5LCB0aGF0IGdldHMgeW91IHNvbWV0aGluZwotIyB0aGF0IGtpbmRhIHdvcmtzIHdpdGggYSBnZW5lcmljIHByb2R1Y3QsIGJ1dCByZWFsbHksIHlvdSBzaG91bGQKLSMgcGljayBhIHByb2R1Y3QgYnkgbmFtZS4KLSMKLWZ1bmN0aW9uIGNob29zZXByb2R1Y3QoKQotewotICAgIGxvY2FsIGRlZmF1bHRfdmFsdWUKLSAgICBpZiBbICJ4JFRBUkdFVF9QUk9EVUNUIiAhPSB4IF0gOyB0aGVuCi0gICAgICAgIGRlZmF1bHRfdmFsdWU9JFRBUkdFVF9QUk9EVUNUCi0gICAgZWxzZQotICAgICAgICBkZWZhdWx0X3ZhbHVlPWFvc3BfYXJtCi0gICAgZmkKLQotICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfQVBQUz0KLSAgICBleHBvcnQgVEFSR0VUX1BST0RVQ1Q9Ci0gICAgbG9jYWwgQU5TV0VSCi0gICAgd2hpbGUgWyAteiAiJFRBUkdFVF9QUk9EVUNUIiBdCi0gICAgZG8KLSAgICAgICAgZWNobyAtbiAiV2hpY2ggcHJvZHVjdCB3b3VsZCB5b3UgbGlrZT8gWyRkZWZhdWx0X3ZhbHVlXSAiCi0gICAgICAgIGlmIFsgLXogIiQxIiBdIDsgdGhlbgotICAgICAgICAgICAgcmVhZCBBTlNXRVIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAkMQotICAgICAgICAgICAgQU5TV0VSPSQxCi0gICAgICAgIGZpCi0KLSAgICAgICAgaWYgWyAteiAiJEFOU1dFUiIgXSA7IHRoZW4KLSAgICAgICAgICAgIGV4cG9ydCBUQVJHRVRfUFJPRFVDVD0kZGVmYXVsdF92YWx1ZQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiBjaGVja19wcm9kdWN0ICRBTlNXRVIKLSAgICAgICAgICAgIHRoZW4KLSAgICAgICAgICAgICAgICBleHBvcnQgVEFSR0VUX1BST0RVQ1Q9JEFOU1dFUgotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVjaG8gIioqIE5vdCBhIHZhbGlkIHByb2R1Y3Q6ICRBTlNXRVIiCi0gICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgICAgICBpZiBbIC1uICIkMSIgXSA7IHRoZW4KLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgYnVpbGRfYnVpbGRfdmFyX2NhY2hlCi0gICAgc2V0X3N0dWZmX2Zvcl9lbnZpcm9ubWVudAotICAgIGRlc3Ryb3lfYnVpbGRfdmFyX2NhY2hlCi19Ci0KLWZ1bmN0aW9uIGNob29zZXZhcmlhbnQoKQotewotICAgIGVjaG8gIlZhcmlhbnQgY2hvaWNlcyBhcmU6IgotICAgIGxvY2FsIGluZGV4PTEKLSAgICBsb2NhbCB2Ci0gICAgZm9yIHYgaW4gJHtWQVJJQU5UX0NIT0lDRVNbQF19Ci0gICAgZG8KLSAgICAgICAgIyBUaGUgcHJvZHVjdCBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZwotICAgICAgICAjIHRoZSBtYWtlZmlsZSB3ZSBmb3VuZCwgYWJvdmUuCi0gICAgICAgIGVjaG8gIiAgICAgJGluZGV4LiAkdiIKLSAgICAgICAgaW5kZXg9JCgoJGluZGV4KzEpKQotICAgIGRvbmUKLQotICAgIGxvY2FsIGRlZmF1bHRfdmFsdWU9ZW5nCi0gICAgbG9jYWwgQU5TV0VSCi0KLSAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9Ci0gICAgd2hpbGUgWyAteiAiJFRBUkdFVF9CVUlMRF9WQVJJQU5UIiBdCi0gICAgZG8KLSAgICAgICAgZWNobyAtbiAiV2hpY2ggd291bGQgeW91IGxpa2U/IFskZGVmYXVsdF92YWx1ZV0gIgotICAgICAgICBpZiBbIC16ICIkMSIgXSA7IHRoZW4KLSAgICAgICAgICAgIHJlYWQgQU5TV0VSCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVjaG8gJDEKLSAgICAgICAgICAgIEFOU1dFUj0kMQotICAgICAgICBmaQotCi0gICAgICAgIGlmIFsgLXogIiRBTlNXRVIiIF0gOyB0aGVuCi0gICAgICAgICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9JGRlZmF1bHRfdmFsdWUKLSAgICAgICAgZWxpZiAoZWNobyAtbiAkQU5TV0VSIHwgZ3JlcCAtcSAtZSAiXlswLTldWzAtOV0qJCIpIDsgdGhlbgotICAgICAgICAgICAgaWYgWyAiJEFOU1dFUiIgLWxlICIkeyNWQVJJQU5UX0NIT0lDRVNbQF19IiBdIDsgdGhlbgotICAgICAgICAgICAgICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVkFSSUFOVD0ke1ZBUklBTlRfQ0hPSUNFU1tAXTokKCgkQU5TV0VSLTEpKToxfQotICAgICAgICAgICAgZmkKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYgY2hlY2tfdmFyaWFudCAkQU5TV0VSCi0gICAgICAgICAgICB0aGVuCi0gICAgICAgICAgICAgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPSRBTlNXRVIKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlY2hvICIqKiBOb3QgYSB2YWxpZCB2YXJpYW50OiAkQU5TV0VSIgotICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgICAgaWYgWyAtbiAiJDEiIF0gOyB0aGVuCi0gICAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLX0KLQotZnVuY3Rpb24gY2hvb3NlY29tYm8oKQotewotICAgIGNob29zZXR5cGUgJDEKLQotICAgIGVjaG8KLSAgICBlY2hvCi0gICAgY2hvb3NlcHJvZHVjdCAkMgotCi0gICAgZWNobwotICAgIGVjaG8KLSAgICBjaG9vc2V2YXJpYW50ICQzCi0KLSAgICBlY2hvCi0gICAgYnVpbGRfYnVpbGRfdmFyX2NhY2hlCi0gICAgc2V0X3N0dWZmX2Zvcl9lbnZpcm9ubWVudAotICAgIHByaW50Y29uZmlnCi0gICAgZGVzdHJveV9idWlsZF92YXJfY2FjaGUKLX0KLQogZnVuY3Rpb24gYWRkX2x1bmNoX2NvbWJvKCkKIHsKICAgICBpZiBbIC1uICIkWlNIX1ZFUlNJT04iIF07IHRoZW4KQEAgLTcyOCw3ICs0MDgsNyBAQAogewogICAgIGxvY2FsIHVuYW1lPSQodW5hbWUpCiAgICAgbG9jYWwgY2hvaWNlcwotICAgIGNob2ljZXM9JChUQVJHRVRfQlVJTERfQVBQUz0gVEFSR0VUX1BST0RVQ1Q9IFRBUkdFVF9CVUlMRF9WQVJJQU5UPSBnZXRfYnVpbGRfdmFyIENPTU1PTl9MVU5DSF9DSE9JQ0VTIDI+L2Rldi9udWxsKQorICAgIGNob2ljZXM9JChUQVJHRVRfQlVJTERfQVBQUz0gVEFSR0VUX1BST0RVQ1Q9IFRBUkdFVF9SRUxFQVNFPSBUQVJHRVRfQlVJTERfVkFSSUFOVD0gX2dldF9idWlsZF92YXJfY2FjaGVkIENPTU1PTl9MVU5DSF9DSE9JQ0VTIDI+L2Rldi9udWxsKQogICAgIGxvY2FsIHJldD0kPwogCiAgICAgZWNobwpAQCAtNzc0LDggKzQ1NCw4IEBACiAgICAgICAgIGFuc3dlcj0kMQogICAgIGVsc2UKICAgICAgICAgcHJpbnRfbHVuY2hfbWVudQotICAgICAgICBlY2hvICJXaGljaCB3b3VsZCB5b3UgbGlrZT8gW2Fvc3BfYXJtLWVuZ10iCi0gICAgICAgIGVjaG8gLW4gIlBpY2sgZnJvbSBjb21tb24gY2hvaWNlcyBhYm92ZSAoZS5nLiAxMykgb3Igc3BlY2lmeSB5b3VyIG93biAoZS5nLiBhb3NwX2JhcmJldC1lbmcpOiAiCisgICAgICAgIGVjaG8gIldoaWNoIHdvdWxkIHlvdSBsaWtlPyBbYW9zcF9jZl94ODZfNjRfcGhvbmUtdHJ1bmtfc3RhZ2luZy1lbmddIgorICAgICAgICBlY2hvIC1uICJQaWNrIGZyb20gY29tbW9uIGNob2ljZXMgYWJvdmUgKGUuZy4gMTMpIG9yIHNwZWNpZnkgeW91ciBvd24gKGUuZy4gYW9zcF9iYXJiZXQtdHJ1bmtfc3RhZ2luZy1lbmcpOiAiCiAgICAgICAgIHJlYWQgYW5zd2VyCiAgICAgICAgIHVzZWRfbHVuY2hfbWVudT0xCiAgICAgZmkKQEAgLTc4NCwxMCArNDY0LDEwIEBACiAKICAgICBpZiBbIC16ICIkYW5zd2VyIiBdCiAgICAgdGhlbgotICAgICAgICBzZWxlY3Rpb249YW9zcF9hcm0tZW5nCisgICAgICAgIHNlbGVjdGlvbj1hb3NwX2NmX3g4Nl82NF9waG9uZS10cnVua19zdGFnaW5nLWVuZwogICAgIGVsaWYgKGVjaG8gLW4gJGFuc3dlciB8IGdyZXAgLXEgLWUgIl5bMC05XVswLTldKiQiKQogICAgIHRoZW4KLSAgICAgICAgbG9jYWwgY2hvaWNlcz0oJChUQVJHRVRfQlVJTERfQVBQUz0gZ2V0X2J1aWxkX3ZhciBDT01NT05fTFVOQ0hfQ0hPSUNFUykpCisgICAgICAgIGxvY2FsIGNob2ljZXM9KCQoVEFSR0VUX0JVSUxEX0FQUFM9IFRBUkdFVF9QUk9EVUNUPSBUQVJHRVRfUkVMRUFTRT0gVEFSR0VUX0JVSUxEX1ZBUklBTlQ9IF9nZXRfYnVpbGRfdmFyX2NhY2hlZCBDT01NT05fTFVOQ0hfQ0hPSUNFUyAyPi9kZXYvbnVsbCkpCiAgICAgICAgIGlmIFsgJGFuc3dlciAtbGUgJHsjY2hvaWNlc1tAXX0gXQogICAgICAgICB0aGVuCiAgICAgICAgICAgICAjIGFycmF5IGluIHpzaCBzdGFydHMgZnJvbSAxIGluc3RlYWQgb2YgMC4KQEAgLTgwNCwyNiArNDg0LDMxIEBACiAKICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX0FQUFM9CiAKLSAgICBsb2NhbCBwcm9kdWN0IHZhcmlhbnRfYW5kX3ZlcnNpb24gdmFyaWFudCB2ZXJzaW9uCi0gICAgcHJvZHVjdD0ke3NlbGVjdGlvbiUlLSp9ICMgVHJpbSBldmVyeXRoaW5nIGFmdGVyIGZpcnN0IGRhc2gKLSAgICB2YXJpYW50X2FuZF92ZXJzaW9uPSR7c2VsZWN0aW9uIyotfSAjIFRyaW0gZXZlcnl0aGluZyB1cCB0byBmaXJzdCBkYXNoCi0gICAgaWYgWyAiJHZhcmlhbnRfYW5kX3ZlcnNpb24iICE9ICIkc2VsZWN0aW9uIiBdOyB0aGVuCi0gICAgICAgIHZhcmlhbnQ9JHt2YXJpYW50X2FuZF92ZXJzaW9uJSUtKn0KLSAgICAgICAgaWYgWyAiJHZhcmlhbnQiICE9ICIkdmFyaWFudF9hbmRfdmVyc2lvbiIgXTsgdGhlbgotICAgICAgICAgICAgdmVyc2lvbj0ke3ZhcmlhbnRfYW5kX3ZlcnNpb24jKi19Ci0gICAgICAgIGZpCi0gICAgZmkKKyAgICAjIFRoaXMgbXVzdCBiZSA8cHJvZHVjdD4tPHJlbGVhc2U+LTx2YXJpYW50PgorICAgIGxvY2FsIHByb2R1Y3QgcmVsZWFzZSB2YXJpYW50CisgICAgIyBTcGxpdCBzdHJpbmcgb24gdGhlICctJyBjaGFyYWN0ZXIuCisgICAgSUZTPSItIiByZWFkIC1yIHByb2R1Y3QgcmVsZWFzZSB2YXJpYW50IDw8PCAiJHNlbGVjdGlvbiIKIAotICAgIGlmIFsgLXogIiRwcm9kdWN0IiBdCisgICAgaWYgW1sgLXogIiRwcm9kdWN0IiBdXSB8fCBbWyAteiAiJHJlbGVhc2UiIF1dIHx8IFtbIC16ICIkdmFyaWFudCIgXV0KICAgICB0aGVuCiAgICAgICAgIGVjaG8KICAgICAgICAgZWNobyAiSW52YWxpZCBsdW5jaCBjb21ibzogJHNlbGVjdGlvbiIKKyAgICAgICAgZWNobyAiVmFsaWQgY29tYm9zIG11c3QgYmUgb2YgdGhlIGZvcm0gPHByb2R1Y3Q+LTxyZWxlYXNlPi08dmFyaWFudD4iCiAgICAgICAgIHJldHVybiAxCiAgICAgZmkKIAorICAgIF9sdW5jaF9tZWF0ICRwcm9kdWN0ICRyZWxlYXNlICR2YXJpYW50Cit9CisKK2Z1bmN0aW9uIF9sdW5jaF9tZWF0KCkKK3sKKyAgICBsb2NhbCBwcm9kdWN0PSQxCisgICAgbG9jYWwgcmVsZWFzZT0kMgorICAgIGxvY2FsIHZhcmlhbnQ9JDMKKwogICAgIFRBUkdFVF9QUk9EVUNUPSRwcm9kdWN0IFwKKyAgICBUQVJHRVRfUkVMRUFTRT0kcmVsZWFzZSBcCiAgICAgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9JHZhcmlhbnQgXAotICAgIFRBUkdFVF9QTEFURk9STV9WRVJTSU9OPSR2ZXJzaW9uIFwKICAgICBidWlsZF9idWlsZF92YXJfY2FjaGUKICAgICBpZiBbICQ/IC1uZSAwIF0KICAgICB0aGVuCkBAIC04MzMsMjQgKzUxOCwyNCBAQAogICAgICAgICBmaQogICAgICAgICByZXR1cm4gMQogICAgIGZpCi0gICAgZXhwb3J0IFRBUkdFVF9QUk9EVUNUPSQoZ2V0X2J1aWxkX3ZhciBUQVJHRVRfUFJPRFVDVCkKLSAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9JChnZXRfYnVpbGRfdmFyIFRBUkdFVF9CVUlMRF9WQVJJQU5UKQotICAgIGlmIFsgLW4gIiR2ZXJzaW9uIiBdOyB0aGVuCi0gICAgICBleHBvcnQgVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT049JChnZXRfYnVpbGRfdmFyIFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKQotICAgIGVsc2UKLSAgICAgIHVuc2V0IFRBUkdFVF9QTEFURk9STV9WRVJTSU9OCi0gICAgZmkKKyAgICBleHBvcnQgVEFSR0VUX1BST0RVQ1Q9JChfZ2V0X2J1aWxkX3Zhcl9jYWNoZWQgVEFSR0VUX1BST0RVQ1QpCisgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPSQoX2dldF9idWlsZF92YXJfY2FjaGVkIFRBUkdFVF9CVUlMRF9WQVJJQU5UKQorICAgIGV4cG9ydCBUQVJHRVRfUkVMRUFTRT0kcmVsZWFzZQorICAgICMgTm90ZSB0aGlzIGlzIHRoZSBzdHJpbmcgInJlbGVhc2UiLCBub3QgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4KICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1RZUEU9cmVsZWFzZQogCi0gICAgaWYgWyAkdXNlZF9sdW5jaF9tZW51IC1lcSAxIF07IHRoZW4KLSAgICAgIGVjaG8KLSAgICAgIGVjaG8gIkhpbnQ6IG5leHQgdGltZSB5b3UgY2FuIHNpbXBseSBydW4gJ2x1bmNoICRzZWxlY3Rpb24nIgotICAgIGZpCi0KICAgICBbWyAtbiAiJHtBTkRST0lEX1FVSUVUX0JVSUxEOi19IiBdXSB8fCBlY2hvCiAKICAgICBzZXRfc3R1ZmZfZm9yX2Vudmlyb25tZW50CiAgICAgW1sgLW4gIiR7QU5EUk9JRF9RVUlFVF9CVUlMRDotfSIgXV0gfHwgcHJpbnRjb25maWcKKworICAgIGlmIFtbIC16ICIke0FORFJPSURfUVVJRVRfQlVJTER9IiBdXTsgdGhlbgorICAgICAgICBsb2NhbCBzcGFtX2Zvcl9sdW5jaD0kKGdldHRvcCkvYnVpbGQvbWFrZS90b29scy9lbnZzZXR1cC9zcGFtX2Zvcl9sdW5jaAorICAgICAgICBpZiBbWyAteCAkc3BhbV9mb3JfbHVuY2ggXV07IHRoZW4KKyAgICAgICAgICAgICRzcGFtX2Zvcl9sdW5jaAorICAgICAgICBmaQorICAgIGZpCisKICAgICBkZXN0cm95X2J1aWxkX3Zhcl9jYWNoZQogCiAgICAgaWYgW1sgLW4gIiR7Q0hFQ0tfTVVfQ09ORklHOi19IiBdXTsgdGhlbgpAQCAtODY4LDE5ICs1NTMsMTI3IEBACiAgICAgcHJldj0iJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkQtMV19IgogCiAgICAgaWYgWyAteiAiJENPTU1PTl9MVU5DSF9DSE9JQ0VTX0NBQ0hFIiBdOyB0aGVuCi0gICAgICAgIENPTU1PTl9MVU5DSF9DSE9JQ0VTX0NBQ0hFPSQoVEFSR0VUX0JVSUxEX0FQUFM9IGdldF9idWlsZF92YXIgQ09NTU9OX0xVTkNIX0NIT0lDRVMpCisgICAgICAgIENPTU1PTl9MVU5DSF9DSE9JQ0VTX0NBQ0hFPSQoVEFSR0VUX0JVSUxEX0FQUFM9IF9nZXRfYnVpbGRfdmFyX2NhY2hlZCBDT01NT05fTFVOQ0hfQ0hPSUNFUykKICAgICBmaQogCiAgICAgQ09NUFJFUExZPSggJChjb21wZ2VuIC1XICIke0NPTU1PTl9MVU5DSF9DSE9JQ0VTX0NBQ0hFfSIgLS0gJHtjdXJ9KSApCiAgICAgcmV0dXJuIDAKIH0KIAorZnVuY3Rpb24gX2x1bmNoX3VzYWdlKCkKK3sKKyAgICAoCisgICAgICAgIGVjaG8gIlRoZSBsdW5jaCBjb21tYW5kIHNlbGVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciBzdWJzZXF1ZW50IgorICAgICAgICBlY2hvICJBbmRyb2lkIGJ1aWxkcy4iCisgICAgICAgIGVjaG8KKyAgICAgICAgZWNobyAiVXNhZ2U6IGx1bmNoIFRBUkdFVF9QUk9EVUNUIFtUQVJHRVRfUkVMRUFTRSBbVEFSR0VUX0JVSUxEX1ZBUklBTlRdXSIKKyAgICAgICAgZWNobworICAgICAgICBlY2hvICIgIENob29zZSB0aGUgcHJvZHVjdCwgcmVsZWFzZSBhbmQgdmFyaWFudCB0byB1c2UuIElmIG5vdCIKKyAgICAgICAgZWNobyAiICBzdXBwbGllZCwgVEFSR0VUX1JFTEVBU0Ugd2lsbCBiZSAndHJ1bmtfc3RhZ2luZycgYW5kIgorICAgICAgICBlY2hvICIgIFRBUkdFVF9CVUlMRF9WQVJJQU5UIHdpbGwgYmUgJ2VuZyciCisgICAgICAgIGVjaG8KKyAgICAgICAgZWNobworICAgICAgICBlY2hvICJVc2FnZTogbHVuY2ggVEFSR0VUX1BST0RVQ1QtVEFSR0VUX1JFTEVBU0UtVEFSR0VUX0JVSUxEX1ZBUklBTlQiCisgICAgICAgIGVjaG8KKyAgICAgICAgZWNobyAiICBDaG9zZSB0aGUgcHJvZHVjdCwgcmVsZWFzZSBhbmQgdmFyaWFudCB0byB1c2UuIFRoaXMiCisgICAgICAgIGVjaG8gIiAgbGVnYWN5IGZvcm1hdCBpcyBtYWludGFpbmVkIGZvciBjb21wYXRpYmlsaXR5LiIKKyAgICAgICAgZWNobworICAgICAgICBlY2hvCisgICAgICAgIGVjaG8gIk5vdGUgdGhhdCB0aGUgcHJldmlvdXMgaW50ZXJhY3RpdmUgbWVudSBhbmQgbGlzdCBvZiBoYXJkLWNvZGVkIgorICAgICAgICBlY2hvICJsaXN0IG9mIGN1cmF0ZWQgdGFyZ2V0cyBoYXMgYmVlbiByZW1vdmVkLiBJZiB5b3Ugd291bGQgbGlrZSB0aGUiCisgICAgICAgIGVjaG8gImxpc3Qgb2YgcHJvZHVjdHMsIHJlbGVhc2UgY29uZmlncyBmb3IgYSBwYXJ0aWN1bGFyIHByb2R1Y3QsIG9yIgorICAgICAgICBlY2hvICJ2YXJpYW50cywgcnVuIGxpc3RfcHJvZHVjdHMsIGxpc3RfcmVsZWFzZV9jb25maWdzLCBsaXN0X3ZhcmlhbnRzIgorICAgICAgICBlY2hvICJyZXNwZWN0aXZlbHkuIgorICAgICAgICBlY2hvCisgICAgKSAxPiYyCit9CisKK2Z1bmN0aW9uIGx1bmNoMigpCit7CisgICAgaWYgW1sgJCMgLWVxIDEgJiYgJDEgPSAiLS1oZWxwIiBdXTsgdGhlbgorICAgICAgICBfbHVuY2hfdXNhZ2UKKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIGlmIFtbICQjIC1lcSAwIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIk5vIHRhcmdldCBzcGVjaWZpZWQuIFNlZSBsdW5jaCAtLWhlbHAiIDE+JjIKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorICAgIGlmIFtbICQjIC1ndCAzIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIlRvbyBtYW55IHBhcmFtZXRlcnMgZ2l2ZW4uIFNlZSBsdW5jaCAtLWhlbHAiIDE+JjIKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorCisgICAgbG9jYWwgcHJvZHVjdCByZWxlYXNlIHZhcmlhbnQKKworICAgICMgSGFuZGxlIHRoZSBsZWdhY3kgZm9ybWF0CisgICAgbG9jYWwgbGVnYWN5PSQoZWNobyAkMSB8IGdyZXAgIi0iKQorICAgIGlmIFtbICQjIC1lcSAxICYmIC1uICRsZWdhY3kgXV07IHRoZW4KKyAgICAgICAgSUZTPSItIiByZWFkIC1yIHByb2R1Y3QgcmVsZWFzZSB2YXJpYW50IDw8PCAiJDEiCisgICAgICAgIGlmIFtbIC16ICIkcHJvZHVjdCIgXV0gfHwgW1sgLXogIiRyZWxlYXNlIiBdXSB8fCBbWyAteiAiJHZhcmlhbnQiIF1dOyB0aGVuCisgICAgICAgICAgICBlY2hvICJJbnZhbGlkIGx1bmNoIGNvbWJvOiAkMSIgMT4mMgorICAgICAgICAgICAgZWNobyAiVmFsaWQgY29tYm9zIG11c3QgYmUgb2YgdGhlIGZvcm0gPHByb2R1Y3Q+LTxyZWxlYXNlPi08dmFyaWFudD4gd2hlbiB1c2luZyIgMT4mMgorICAgICAgICAgICAgZWNobyAidGhlIGxlZ2FjeSBmb3JtYXQuICBSdW4gJ2x1bmNoIC0taGVscCcgZm9yIHVzYWdlLiIgMT4mMgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgIyBIYW5kbGUgdGhlIG5ldyBmb3JtYXQuCisgICAgaWYgW1sgLXogJGxlZ2FjeSBdXTsgdGhlbgorICAgICAgICBwcm9kdWN0PSQxCisgICAgICAgIHJlbGVhc2U9JDIKKyAgICAgICAgaWYgW1sgLXogJHJlbGVhc2UgXV07IHRoZW4KKyAgICAgICAgICAgIHJlbGVhc2U9dHJ1bmtfc3RhZ2luZworICAgICAgICBmaQorICAgICAgICB2YXJpYW50PSQzCisgICAgICAgIGlmIFtbIC16ICR2YXJpYW50IF1dOyB0aGVuCisgICAgICAgICAgICB2YXJpYW50PWVuZworICAgICAgICBmaQorICAgIGZpCisKKyAgICAjIFZhbGlkYXRlIHRoZSBzZWxlY3Rpb24gYW5kIHNldCBhbGwgdGhlIGVudmlyb25tZW50IHN0dWZmCisgICAgX2x1bmNoX21lYXQgJHByb2R1Y3QgJHJlbGVhc2UgJHZhcmlhbnQKK30KKwordW5zZXQgQU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX1BST0RVQ1RfQ0FDSEUKK3Vuc2V0IEFORFJPSURfTFVOQ0hfQ09NUExFVElPTl9DSE9TRU5fUFJPRFVDVAordW5zZXQgQU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX1JFTEVBU0VfQ0FDSEUKKyMgVGFiIGNvbXBsZXRpb24gZm9yIGx1bmNoLgorZnVuY3Rpb24gX2x1bmNoX2NvbXBsZXRpb24oKQoreworICAgICMgQXZhaWxhYmxlIHByb2R1Y3RzCisgICAgaWYgW1sgJENPTVBfQ1dPUkQgLWVxIDEgXV0gOyB0aGVuCisgICAgICAgIGlmIFtbIC16ICRBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUFJPRFVDVF9DQUNIRSBdXTsgdGhlbgorICAgICAgICAgICAgQU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX1BST0RVQ1RfQ0FDSEU9JChsaXN0X3Byb2R1Y3RzKQorICAgICAgICBmaQorICAgICAgICBDT01QUkVQTFk9KCAkKGNvbXBnZW4gLVcgIiR7QU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX1BST0RVQ1RfQ0FDSEV9IiAtLSAiJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfSIpICkKKyAgICBmaQorCisgICAgIyBBdmFpbGFibGUgcmVsZWFzZSBjb25maWdzCisgICAgaWYgW1sgJENPTVBfQ1dPUkQgLWVxIDIgXV0gOyB0aGVuCisgICAgICAgIGlmIFtbIC16ICRBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUkVMRUFTRV9DQUNIRSB8fCAkQU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX0NIT1NFTl9QUk9EVUNUICE9ICR7Q09NUF9XT1JEU1sxXX0gXV0gOyB0aGVuCisgICAgICAgICAgICBBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUkVMRUFTRV9DQUNIRT0kKGxpc3RfcmVsZWFzZXMgJHtDT01QX1dPUkRTWzFdfSkKKyAgICAgICAgICAgIEFORFJPSURfTFVOQ0hfQ09NUExFVElPTl9DSE9TRU5fUFJPRFVDVD0ke0NPTVBfV09SRFNbMV19CisgICAgICAgIGZpCisgICAgICAgIENPTVBSRVBMWT0oICQoY29tcGdlbiAtVyAiJHtBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUkVMRUFTRV9DQUNIRX0iIC0tICIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IikgKQorICAgIGZpCisKKyAgICAjIEF2YWlsYWJsZSB2YXJpYW50cworICAgIGlmIFtbICRDT01QX0NXT1JEIC1lcSAzIF1dIDsgdGhlbgorICAgICAgICBDT01QUkVQTFk9KHVzZXIgdXNlcmRlYnVnIGVuZykKKyAgICBmaQorCisgICAgcmV0dXJuIDAKK30KKworCiAjIENvbmZpZ3VyZXMgdGhlIGJ1aWxkIHRvIGJ1aWxkIHVuYnVuZGxlZCBhcHBzLgogIyBSdW4gdGFwYXMgd2l0aCBvbmUgb3IgbW9yZSBhcHAgbmFtZXMgKGZyb20gTE9DQUxfUEFDS0FHRV9OQU1FKQogZnVuY3Rpb24gdGFwYXMoKQogewogICAgIGxvY2FsIHNob3dIZWxwPSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAnXihoZWxwKSQnIHwgeGFyZ3MpIgogICAgIGxvY2FsIGFyY2g9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKGFybXx4ODZ8YXJtNjR8eDg2XzY0KSQnIHwgeGFyZ3MpIgorICAgICMgVE9ETyhiLzMwNzk3NTI5Myk6IEV4cGFuZCB0YXBhcyB0byB0YWtlIHJlbGVhc2UgYXJndW1lbnRzIChhbmQgdXBkYXRlIGhtbSgpIHVzYWdlKS4KKyAgICBsb2NhbCByZWxlYXNlPSJ0cnVua19zdGFnaW5nIgogICAgIGxvY2FsIHZhcmlhbnQ9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKHVzZXJ8dXNlcmRlYnVnfGVuZykkJyB8IHhhcmdzKSIKICAgICBsb2NhbCBkZW5zaXR5PSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAnXihsZHBpfG1kcGl8dHZkcGl8aGRwaXx4aGRwaXx4eGhkcGl8eHh4aGRwaXxhbGxkcGkpJCcgfCB4YXJncykiCiAgICAgbG9jYWwga2V5cz0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgJ14oZGV2a2V5cykkJyB8IHhhcmdzKSIKQEAgLTg5Niw2ICs2ODksMTAgQEAKICAgICAgICAgZWNobyAidGFwYXM6IEVycm9yOiBNdWx0aXBsZSBidWlsZCBhcmNocyBzdXBwbGllZDogJGFyY2giCiAgICAgICAgIHJldHVybgogICAgIGZpCisgICAgaWYgWyAkKGVjaG8gJHJlbGVhc2UgfCB3YyAtdykgLWd0IDEgXTsgdGhlbgorICAgICAgICBlY2hvICJ0YXBhczogRXJyb3I6IE11bHRpcGxlIGJ1aWxkIHJlbGVhc2VzIHN1cHBsaWVkOiAkcmVsZWFzZSIKKyAgICAgICAgcmV0dXJuCisgICAgZmkKICAgICBpZiBbICQoZWNobyAkdmFyaWFudCB8IHdjIC13KSAtZ3QgMSBdOyB0aGVuCiAgICAgICAgIGVjaG8gInRhcGFzOiBFcnJvcjogTXVsdGlwbGUgYnVpbGQgdmFyaWFudHMgc3VwcGxpZWQ6ICR2YXJpYW50IgogICAgICAgICByZXR1cm4KQEAgLTkzMCw2ICs3MjcsNyBAQAogICAgIGZpCiAKICAgICBleHBvcnQgVEFSR0VUX1BST0RVQ1Q9JHByb2R1Y3QKKyAgICBleHBvcnQgVEFSR0VUX1JFTEVBU0U9JHJlbGVhc2UKICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9JHZhcmlhbnQKICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX0RFTlNJVFk9JGRlbnNpdHkKICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1RZUEU9cmVsZWFzZQpAQCAtOTQ2LDkgKzc0NCwxMSBAQAogZnVuY3Rpb24gYmFuY2hhbigpCiB7CiAgICAgbG9jYWwgc2hvd0hlbHA9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKGhlbHApJCcgfCB4YXJncykiCi0gICAgbG9jYWwgcHJvZHVjdD0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgJ14oLipfKT8oYXJtfHg4Nnxhcm02NHx4ODZfNjR8YXJtNjRvbmx5fHg4Nl82NG9ubHkpJCcgfCB4YXJncykiCisgICAgbG9jYWwgcHJvZHVjdD0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgJ14oLipfKT8oYXJtfHg4Nnxhcm02NHxyaXNjdjY0fHg4Nl82NHxhcm02NG9ubHl8eDg2XzY0b25seSkkJyB8IHhhcmdzKSIKKyAgICAjIFRPRE86IEV4cGFuZCBiYW5jaGFuIHRvIHRha2UgcmVsZWFzZSBhcmd1bWVudHMgKGFuZCB1cGRhdGUgaG1tKCkgdXNhZ2UpLgorICAgIGxvY2FsIHJlbGVhc2U9InRydW5rX3N0YWdpbmciCiAgICAgbG9jYWwgdmFyaWFudD0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgJ14odXNlcnx1c2VyZGVidWd8ZW5nKSQnIHwgeGFyZ3MpIgotICAgIGxvY2FsIGFwcHM9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FIC12ICdeKHVzZXJ8dXNlcmRlYnVnfGVuZ3woLipfKT8oYXJtfHg4Nnxhcm02NHx4ODZfNjQpKSQnIHwgeGFyZ3MpIgorICAgIGxvY2FsIGFwcHM9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FIC12ICdeKHVzZXJ8dXNlcmRlYnVnfGVuZ3woLipfKT8oYXJtfHg4Nnxhcm02NHxyaXNjdjY0fHg4Nl82NCkpJCcgfCB4YXJncykiCiAKICAgICBpZiBbICIkc2hvd0hlbHAiICE9ICIiIF07IHRoZW4KICAgICAgICQoZ2V0dG9wKS9idWlsZC9tYWtlL2JhbmNoYW5IZWxwLnNoCkBAIC05NjEsNiArNzYxLDEwIEBACiAgICAgICAgIGVjaG8gImJhbmNoYW46IEVycm9yOiBNdWx0aXBsZSBidWlsZCBhcmNocyBvciBwcm9kdWN0cyBzdXBwbGllZDogJHByb2R1Y3RzIgogICAgICAgICByZXR1cm4KICAgICBmaQorICAgIGlmIFsgJChlY2hvICRyZWxlYXNlIHwgd2MgLXcpIC1ndCAxIF07IHRoZW4KKyAgICAgICAgZWNobyAiYmFuY2hhbjogRXJyb3I6IE11bHRpcGxlIGJ1aWxkIHJlbGVhc2VzIHN1cHBsaWVkOiAkcmVsZWFzZSIKKyAgICAgICAgcmV0dXJuCisgICAgZmkKICAgICBpZiBbICQoZWNobyAkdmFyaWFudCB8IHdjIC13KSAtZ3QgMSBdOyB0aGVuCiAgICAgICAgIGVjaG8gImJhbmNoYW46IEVycm9yOiBNdWx0aXBsZSBidWlsZCB2YXJpYW50cyBzdXBwbGllZDogJHZhcmlhbnQiCiAgICAgICAgIHJldHVybgpAQCAtOTc0LDYgKzc3OCw3IEBACiAgICAgICBhcm0pICAgIHByb2R1Y3Q9bW9kdWxlX2FybTs7CiAgICAgICB4ODYpICAgIHByb2R1Y3Q9bW9kdWxlX3g4Njs7CiAgICAgICBhcm02NCkgIHByb2R1Y3Q9bW9kdWxlX2FybTY0OzsKKyAgICAgIHJpc2N2NjQpIHByb2R1Y3Q9bW9kdWxlX3Jpc2N2NjQ7OwogICAgICAgeDg2XzY0KSBwcm9kdWN0PW1vZHVsZV94ODZfNjQ7OwogICAgICAgYXJtNjRvbmx5KSAgcHJvZHVjdD1tb2R1bGVfYXJtNjRvbmx5OzsKICAgICAgIHg4Nl82NG9ubHkpIHByb2R1Y3Q9bW9kdWxlX3g4Nl82NG9ubHk7OwpAQCAtOTgzLDYgKzc4OCw3IEBACiAgICAgZmkKIAogICAgIGV4cG9ydCBUQVJHRVRfUFJPRFVDVD0kcHJvZHVjdAorICAgIGV4cG9ydCBUQVJHRVRfUkVMRUFTRT0kcmVsZWFzZQogICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVkFSSUFOVD0kdmFyaWFudAogICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfREVOU0lUWT1hbGxkcGkKICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1RZUEU9cmVsZWFzZQpAQCAtOTk3LDM0ICs4MDMsNiBAQAogICAgIGRlc3Ryb3lfYnVpbGRfdmFyX2NhY2hlCiB9CiAKLSMgVE9ETzogTWVyZ2UgaW50byBnZXR0b3AgYXMgcGFydCBvZiBsYXVuY2hpbmcgbXVsdGl0cmVlCi1mdW5jdGlvbiBtdWx0aXRyZWVfZ2V0dG9wCi17Ci0gICAgbG9jYWwgVE9QRklMRT1vcmNoZXN0cmF0b3IvYnVpbGQvbWFrZS9jb3JlL2VudnNldHVwLm1rCi0gICAgaWYgWyAtbiAiJFRPUCIgLWEgLWYgIiRUT1AvJFRPUEZJTEUiIF0gOyB0aGVuCi0gICAgICAgICMgVGhlIGZvbGxvd2luZyBjaXJjdW1sb2N1dGlvbiBlbnN1cmVzIHdlIHJlbW92ZSBzeW1saW5rcyBmcm9tIFRPUC4KLSAgICAgICAgKGNkICIkVE9QIjsgUFdEPSAvYmluL3B3ZCkKLSAgICBlbHNlCi0gICAgICAgIGlmIFsgLWYgJFRPUEZJTEUgXSA7IHRoZW4KLSAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBjaXJjdW1sb2N1dGlvbiAocmVwZWF0ZWQgYmVsb3cgYXMgd2VsbCkgZW5zdXJlcwotICAgICAgICAgICAgIyB0aGF0IHdlIHJlY29yZCB0aGUgdHJ1ZSBkaXJlY3RvcnkgbmFtZSBhbmQgbm90IG9uZSB0aGF0IGlzCi0gICAgICAgICAgICAjIGZha2VkIHVwIHdpdGggc3ltbGluayBuYW1lcy4KLSAgICAgICAgICAgIFBXRD0gL2Jpbi9wd2QKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbG9jYWwgSEVSRT0kUFdECi0gICAgICAgICAgICBsb2NhbCBUPQotICAgICAgICAgICAgd2hpbGUgWyBcKCAhIFwoIC1mICRUT1BGSUxFIFwpIFwpIC1hIFwoICIkUFdEIiAhPSAiLyIgXCkgXTsgZG8KLSAgICAgICAgICAgICAgICBcY2QgLi4KLSAgICAgICAgICAgICAgICBUPWBQV0Q9IC9iaW4vcHdkIC1QYAotICAgICAgICAgICAgZG9uZQotICAgICAgICAgICAgXGNkICIkSEVSRSIKLSAgICAgICAgICAgIGlmIFsgLWYgIiRULyRUT1BGSUxFIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgZWNobyAiJFQiCi0gICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgIGZpCi19Ci0KIGZ1bmN0aW9uIGNyb290KCkKIHsKICAgICBsb2NhbCBUPSQoZ2V0dG9wKQpAQCAtMTA2OCwzMzQgKzg0NiwzMyBAQAogICAgIGVjaG8gImNhbid0IGZpbmQgQW5kcm9pZC5tayIKIH0KIAotIyBzaW1wbGlmaWVkIHZlcnNpb24gb2YgcHM7IG91dHB1dCBpbiB0aGUgZm9ybQotIyA8cGlkPiA8cHJvY25hbWU+Ci1mdW5jdGlvbiBxcGlkKCkgewotICAgIGxvY2FsIHByZXBlbmQ9JycKLSAgICBsb2NhbCBhcHBlbmQ9JycKLSAgICBpZiBbICIkMSIgPSAiLS1leGFjdCIgXTsgdGhlbgotICAgICAgICBwcmVwZW5kPScgJwotICAgICAgICBhcHBlbmQ9JyQnCi0gICAgICAgIHNoaWZ0Ci0gICAgZWxpZiBbICIkMSIgPSAiLS1oZWxwIiAtbyAiJDEiID0gIi1oIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gInVzYWdlOiBxcGlkIFtbLS1leGFjdF0gPHByb2Nlc3MgbmFtZXxwaWQ+IgotICAgICAgICByZXR1cm4gMjU1CisjIEVuc3VyZSB0aGF0IHdlJ3JlIGFsd2F5cyB1c2luZyB0aGUgYWRiIGluIHRoZSB0cmVlLiBUaGlzIHdvcmtzIGFyb3VuZCB0aGUgZmFjdAorIyB0aGF0IGJhc2ggY2FjaGVzICRQQVRIIGxvb2t1cHMsIHNvIGlmIHlvdSB1c2UgYWRiIGJlZm9yZSBsdW5jaGluZy9idWlsZGluZyB0aGUKKyMgb25lIGluIHlvdXIgdHJlZSwgeW91J2xsIGNvbnRpbnVlIHRvIGdldCAvdXNyL2Jpbi9hZGIgb3Igd2hhdGV2ZXIgZXZlbiBhZnRlcgorIyB5b3UgaGF2ZSB0aGUgb25lIGZyb20geW91ciBjdXJyZW50IHRyZWUgb24geW91ciBwYXRoLiBIaXN0b3JpY2FsbHkgdGhpcyB3b3VsZAorIyBjYXVzZSBjb25mdXNpb24gYmVjYXVzZSBnbGludXggaGFkIGFkYiBpbiAvdXNyL2Jpbi8gYnkgZGVmYXVsdCwgdGhvdWdoIHRoYXQKKyMgZG9lc24ndCBhcHBlYXIgdG8gYmUgdGhlIGNhc2Ugb24gbXkgcm9kZXRlIGhvc3RzOyBpdCBpcyBob3dldmVyIHN0aWxsIHRoZSBjYXNlCisjIHRoYXQgbXkgTWFjIGhhcyAvdXNyL2xvY2FsL2Jpbi9hZGIgaW5zdGFsbGVkIGJ5IGRlZmF1bHQgYW5kIG9uIHRoZSBkZWZhdWx0CisjIHBhdGguCitmdW5jdGlvbiBhZGIoKSB7CisgICAgIyBXZSBuZWVkIGBjb21tYW5kIHdoaWNoYCBiZWNhdXNlIHpzaCBoYXMgYSBidWlsdC1pbiBgd2hpY2hgIHRoYXQncyBtb3JlCisgICAgIyBsaWtlIGB0eXBlYC4KKyAgICBsb2NhbCBBREI9JChjb21tYW5kIHdoaWNoIGFkYikKKyAgICBpZiBbIC16ICIkQURCIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIkNvbW1hbmQgYWRiIG5vdCBmb3VuZDsgdHJ5IGx1bmNoIChhbmQgYnVpbGRpbmcpIGZpcnN0PyIKKyAgICAgICAgcmV0dXJuIDEKICAgICBmaQorICAgIHJ1bl90b29sX3dpdGhfbG9nZ2luZyAiQURCIiAkQURCICIke0B9IgorfQogCi0gICAgbG9jYWwgRVhFPSIkMSIKLSAgICBpZiBbICIkRVhFIiBdIDsgdGhlbgotICAgICAgICBxcGlkIHwgXGdyZXAgIiRwcmVwZW5kJEVYRSRhcHBlbmQiCi0gICAgZWxzZQotICAgICAgICBhZGIgc2hlbGwgcHMgXAotICAgICAgICAgICAgfCB0ciAtZCAnXHInIFwKLSAgICAgICAgICAgIHwgc2VkIC1lIDFkIC1lICdzL15bXiBdKiAqXChbMC05XSpcKS4qIFwoW14gXSpcKSQvXDEgXDIvJworZnVuY3Rpb24gZmFzdGJvb3QoKSB7CisgICAgbG9jYWwgRkFTVEJPT1Q9JChjb21tYW5kIHdoaWNoIGZhc3Rib290KQorICAgIGlmIFsgLXogIiRGQVNUQk9PVCIgXTsgdGhlbgorICAgICAgICBlY2hvICJDb21tYW5kIGZhc3Rib290IG5vdCBmb3VuZDsgdHJ5IGx1bmNoIChhbmQgYnVpbGRpbmcpIGZpcnN0PyIKKyAgICAgICAgcmV0dXJuIDEKICAgICBmaQotfQotCi0jIHN5c3dyaXRlIC0gZGlzYWJsZSB2ZXJpdHksIHJlYm9vdCBpZiBuZWVkZWQsIGFuZCByZW1vdW50IGltYWdlCi0jCi0jIEVhc3kgd2F5IHRvIG1ha2Ugc3lzdGVtLmltZy9ldGMgd3JpdGFibGUKLWZ1bmN0aW9uIHN5c3dyaXRlKCkgewotICBhZGIgd2FpdC1mb3ItZGV2aWNlICYmIGFkYiByb290IHx8IHJldHVybiAxCi0gIGlmIFtbICQoYWRiIGRpc2FibGUtdmVyaXR5IHwgZ3JlcCAtaSAicmVib290IikgXV07IHRoZW4KLSAgICAgIGVjaG8gInJlYm9vdGluZyIKLSAgICAgIGFkYiByZWJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSAmJiBhZGIgcm9vdCB8fCByZXR1cm4gMQotICBmaQotICBhZGIgd2FpdC1mb3ItZGV2aWNlICYmIGFkYiByZW1vdW50IHx8IHJldHVybiAxCi19Ci0KLSMgY29yZWR1bXBfc2V0dXAgLSBlbmFibGUgY29yZSBkdW1wcyBnbG9iYWxseSBmb3IgYW55IHByb2Nlc3MKLSMgICAgICAgICAgICAgICAgICB0aGF0IGhhcyB0aGUgY29yZS1maWxlLXNpemUgbGltaXQgc2V0IGNvcnJlY3RseQotIwotIyBOT1RFOiBZb3UgbXVzdCBjYWxsIGFsc28gY29yZWR1bXBfZW5hYmxlIGZvciBhIHNwZWNpZmljIHByb2Nlc3MKLSMgICAgICAgaWYgaXRzIGNvcmUtZmlsZS1zaXplIGxpbWl0IGlzIG5vdCBzZXQgYWxyZWFkeS4KLSMgTk9URTogQ29yZSBkdW1wcyBhcmUgd3JpdHRlbiB0byByYW1kaXNrOyB0aGV5IHdpbGwgbm90IHN1cnZpdmUgYSByZWJvb3QhCi0KLWZ1bmN0aW9uIGNvcmVkdW1wX3NldHVwKCkKLXsKLSAgICBlY2hvICJHZXR0aW5nIHJvb3QuLi4iOwotICAgIGFkYiByb290OwotICAgIGFkYiB3YWl0LWZvci1kZXZpY2U7Ci0KLSAgICBlY2hvICJSZW1vdW50aW5nIHJvb3QgcGFydGl0aW9uIHJlYWQtd3JpdGUuLi4iOwotICAgIGFkYiBzaGVsbCBtb3VudCAtdyAtbyByZW1vdW50IC10IHJvb3RmcyByb290ZnM7Ci0gICAgc2xlZXAgMTsKLSAgICBhZGIgd2FpdC1mb3ItZGV2aWNlOwotICAgIGFkYiBzaGVsbCBta2RpciAtcCAvY29yZXM7Ci0gICAgYWRiIHNoZWxsIG1vdW50IC10IHRtcGZzIHRtcGZzIC9jb3JlczsKLSAgICBhZGIgc2hlbGwgY2htb2QgMDc3NyAvY29yZXM7Ci0KLSAgICBlY2hvICJHcmFudGluZyBTRUxpbnV4IHBlcm1pc3Npb24gdG8gZHVtcCBpbiAvY29yZXMuLi4iOwotICAgIGFkYiBzaGVsbCByZXN0b3JlY29uIC1SIC9jb3JlczsKLQotICAgIGVjaG8gIlNldCBjb3JlIHBhdHRlcm4uIjsKLSAgICBhZGIgc2hlbGwgJ2VjaG8gL2NvcmVzL2NvcmUuJXAgPiAvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybic7Ci0KLSAgICBlY2hvICJEb25lLiIKLX0KLQotIyBjb3JlZHVtcF9lbmFibGUgLSBlbmFibGUgY29yZSBkdW1wcyBmb3IgdGhlIHNwZWNpZmllZCBwcm9jZXNzCi0jICQxID0gUElEIG9mIHByb2Nlc3MgKGUuZy4sICQocGlkIG1lZGlhc2VydmVyKSkKLSMKLSMgTk9URTogY29yZWR1bXBfc2V0dXAgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGFzIHdlbGwgZm9yIGEgY29yZQotIyAgICAgICBkdW1wIHRvIGFjdHVhbGx5IGJlIGdlbmVyYXRlZC4KLQotZnVuY3Rpb24gY29yZWR1bXBfZW5hYmxlKCkKLXsKLSAgICBsb2NhbCBQSUQ9JDE7Ci0gICAgaWYgWyAteiAiJFBJRCIgXTsgdGhlbgotICAgICAgICBwcmludGYgIkV4cGVjdGluZyBhIFBJRCFcbiI7Ci0gICAgICAgIHJldHVybjsKLSAgICBmaTsKLSAgICBlY2hvICJTZXR0aW5nIGNvcmUgbGltaXQgZm9yICRQSUQgdG8gaW5maW5pdGUuLi4iOwotICAgIGFkYiBzaGVsbCAvc3lzdGVtL2Jpbi91bGltaXQgLVAgJFBJRCAtYyB1bmxpbWl0ZWQKLX0KLQotIyBjb3JlIC0gc2VuZCBTSUdWIGFuZCBwdWxsIHRoZSBjb3JlIGZvciBwcm9jZXNzCi0jICQxID0gUElEIG9mIHByb2Nlc3MgKGUuZy4sICQocGlkIG1lZGlhc2VydmVyKSkKLSMKLSMgTk9URTogY29yZWR1bXBfc2V0dXAgbXVzdCBiZSBjYWxsZWQgb25jZSBwZXIgYm9vdCBmb3IgY29yZSBkdW1wcyB0byBiZQotIyAgICAgICBlbmFibGVkIGdsb2JhbGx5LgotCi1mdW5jdGlvbiBjb3JlKCkKLXsKLSAgICBsb2NhbCBQSUQ9JDE7Ci0KLSAgICBpZiBbIC16ICIkUElEIiBdOyB0aGVuCi0gICAgICAgIHByaW50ZiAiRXhwZWN0aW5nIGEgUElEIVxuIjsKLSAgICAgICAgcmV0dXJuOwotICAgIGZpOwotCi0gICAgbG9jYWwgQ09SRU5BTUU9Y29yZS4kUElEOwotICAgIGxvY2FsIENPUkVQQVRIPS9jb3Jlcy8kQ09SRU5BTUU7Ci0gICAgbG9jYWwgU0lHPVNFR1Y7Ci0KLSAgICBjb3JlZHVtcF9lbmFibGUgJDE7Ci0KLSAgICBsb2NhbCBkb25lPTA7Ci0gICAgd2hpbGUgWyAkKGFkYiBzaGVsbCAiWyAtZCAvcHJvYy8kUElEIF0gJiYgZWNobyAtbiB5ZXMiKSBdOyBkbwotICAgICAgICBwcmludGYgIlx0U2VuZGluZyBTSUclcyB0byAlZC4uLlxuIiAkU0lHICRQSUQ7Ci0gICAgICAgIGFkYiBzaGVsbCBraWxsIC0kU0lHICRQSUQ7Ci0gICAgICAgIHNsZWVwIDE7Ci0gICAgZG9uZTsKLQotICAgIGFkYiBzaGVsbCAid2hpbGUgWyAhIC1mICRDT1JFUEFUSCBdIDsgZG8gZWNobyB3YWl0aW5nIGZvciAkQ09SRVBBVEggdG8gYmUgZ2VuZXJhdGVkOyBzbGVlcCAxOyBkb25lIgotICAgIGVjaG8gIkRvbmU6IGNvcmUgaXMgdW5kZXIgJENPUkVQQVRIIG9uIGRldmljZS4iOwotfQotCi0jIHN5c3RlbXN0YWNrIC0gZHVtcCB0aGUgY3VycmVudCBzdGFjayB0cmFjZSBvZiBhbGwgdGhyZWFkcyBpbiB0aGUgc3lzdGVtIHByb2Nlc3MKLSMgdG8gdGhlIHVzdWFsIEFOUiB0cmFjZXMgZmlsZQotZnVuY3Rpb24gc3lzdGVtc3RhY2soKQotewotICAgIHN0YWNrcyBzeXN0ZW1fc2VydmVyCi19Ci0KLSMgUmVhZCB0aGUgRUxGIGhlYWRlciBmcm9tIC9wcm9jLyRQSUQvZXhlIHRvIGRldGVybWluZSBpZiB0aGUgcHJvY2VzcyBpcwotIyA2NC1iaXQuCi1mdW5jdGlvbiBpczY0Yml0KCkKLXsKLSAgICBsb2NhbCBQSUQ9IiQxIgotICAgIGlmIFsgIiRQSUQiIF0gOyB0aGVuCi0gICAgICAgIGlmIFtbICIkKGFkYiBzaGVsbCBjYXQgL3Byb2MvJFBJRC9leGUgfCB4eGQgLWwgMSAtcyA0IC1wKSIgLWVxICIwMiIgXV0gOyB0aGVuCi0gICAgICAgICAgICBlY2hvICI2NCIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAiIgotICAgICAgICBmaQotICAgIGVsc2UKLSAgICAgICAgZWNobyAiIgotICAgIGZpCi19Ci0KLWNhc2UgYHVuYW1lIC1zYCBpbgotICAgIERhcndpbikKLSAgICAgICAgZnVuY3Rpb24gc2dyZXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5kIC1FIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vICAtdHlwZSBmIC1pcmVnZXggJy4qXC4oY3xofGNjfGNwcHxocHB8U3xqYXZhfGt0fHhtbHxzaHxta3xhaWRsfHZ0c3xwcm90b3xyc3xnbyknIFwKLSAgICAgICAgICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gIiRAIiB7fSArCi0gICAgICAgIH0KLQotICAgICAgICA7OwotICAgICopCi0gICAgICAgIGZ1bmN0aW9uIHNncmVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAgLXR5cGUgZiAtaXJlZ2V4ICcuKlwuXChjXHxoXHxjY1x8Y3BwXHxocHBcfFNcfGphdmFcfGt0XHx4bWxcfHNoXHxta1x8YWlkbFx8dnRzXHxwcm90b1x8cnNcfGdvXCknIFwKLSAgICAgICAgICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gIiRAIiB7fSArCi0gICAgICAgIH0KLSAgICAgICAgOzsKLWVzYWMKLQotZnVuY3Rpb24gZ2V0dGFyZ2V0YXJjaAotewotICAgIGdldF9idWlsZF92YXIgVEFSR0VUX0FSQ0gKLX0KLQotZnVuY3Rpb24gZ2dyZXAoKQotewotICAgIGZpbmQgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gLW5hbWUgb3V0IC1wcnVuZSAtbyAtdHlwZSBmIC1uYW1lICIqXC5ncmFkbGUiIFwKLSAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotfQotCi1mdW5jdGlvbiBnb2dyZXAoKQotewotICAgIGZpbmQgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gLW5hbWUgb3V0IC1wcnVuZSAtbyAtdHlwZSBmIC1uYW1lICIqXC5nbyIgXAotICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gIiRAIiB7fSArCi19Ci0KLWZ1bmN0aW9uIGpncmVwKCkKLXsKLSAgICBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1uYW1lIG91dCAtcHJ1bmUgLW8gLXR5cGUgZiAtbmFtZSAiKlwuamF2YSIgXAotICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gIiRAIiB7fSArCi19Ci0KLWZ1bmN0aW9uIHJzZ3JlcCgpCi17Ci0gICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtbmFtZSBvdXQgLXBydW5lIC1vIC10eXBlIGYgLW5hbWUgIipcLnJzIiBcCi0gICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLX0KLQotZnVuY3Rpb24ganNvbmdyZXAoKQotewotICAgIGZpbmQgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gLW5hbWUgb3V0IC1wcnVuZSAtbyAtdHlwZSBmIC1uYW1lICIqXC5qc29uIiBcCi0gICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLX0KLQotZnVuY3Rpb24gdG9tbGdyZXAoKQotewotICAgIGZpbmQgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gLW5hbWUgb3V0IC1wcnVuZSAtbyAtdHlwZSBmIC1uYW1lICIqXC50b21sIiBcCi0gICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLX0KLQotZnVuY3Rpb24ga3RncmVwKCkKLXsKLSAgICBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1uYW1lIG91dCAtcHJ1bmUgLW8gLXR5cGUgZiAtbmFtZSAiKlwua3QiIFwKLSAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotfQotCi1mdW5jdGlvbiBjZ3JlcCgpCi17Ci0gICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtbmFtZSBvdXQgLXBydW5lIC1vIC10eXBlIGYgXCggLW5hbWUgJyouYycgLW8gLW5hbWUgJyouY2MnIC1vIC1uYW1lICcqLmNwcCcgLW8gLW5hbWUgJyouaCcgLW8gLW5hbWUgJyouaHBwJyBcKSBcCi0gICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLX0KLQotZnVuY3Rpb24gcmVzZ3JlcCgpCi17Ci0gICAgbG9jYWwgZGlyCi0gICAgZm9yIGRpciBpbiBgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtbmFtZSBvdXQgLXBydW5lIC1vIC1uYW1lIHJlcyAtdHlwZSBkYDsgZG8KLSAgICAgICAgZmluZCAkZGlyIC10eXBlIGYgLW5hbWUgJypcLnhtbCcgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotICAgIGRvbmUKLX0KLQotZnVuY3Rpb24gbWFuZ3JlcCgpCi17Ci0gICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtcGF0aCAuL291dCAtcHJ1bmUgLW8gLXR5cGUgZiAtbmFtZSAnQW5kcm9pZE1hbmlmZXN0LnhtbCcgXAotICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gIiRAIiB7fSArCi19Ci0KLWZ1bmN0aW9uIG93bmdyZXAoKQotewotICAgIGZpbmQgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gLXBhdGggLi9vdXQgLXBydW5lIC1vIC10eXBlIGYgLW5hbWUgJ09XTkVSUycgXAotICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gIiRAIiB7fSArCi19Ci0KLWZ1bmN0aW9uIHNlcGdyZXAoKQotewotICAgIGZpbmQgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gLXBhdGggLi9vdXQgLXBydW5lIC1vIC1uYW1lIHNlcG9saWN5IC10eXBlIGQgXAotICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gLXIgLS1leGNsdWRlLWRpcj1cLmdpdCAiJEAiIHt9ICsKLX0KLQotZnVuY3Rpb24gcmNncmVwKCkKLXsKLSAgICBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1uYW1lIG91dCAtcHJ1bmUgLW8gLXR5cGUgZiAtbmFtZSAiKlwucmMqIiBcCi0gICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLX0KLQotZnVuY3Rpb24gcHlncmVwKCkKLXsKLSAgICBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1uYW1lIG91dCAtcHJ1bmUgLW8gLXR5cGUgZiAtbmFtZSAiKlwucHkiIFwKLSAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotfQotCi1jYXNlIGB1bmFtZSAtc2AgaW4KLSAgICBEYXJ3aW4pCi0gICAgICAgIGZ1bmN0aW9uIG1ncmVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluZCAtRSAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtcGF0aCAuL291dCAtcHJ1bmUgLW8gXCggLWlyZWdleCAnLiovKE1ha2VmaWxlfE1ha2VmaWxlXC4uKnwuKlwubWFrZXwuKlwubWFrfC4qXC5ta3wuKlwuYnApJyAtbyAtcmVnZXggJyguKi8pPyhidWlsZHxzb29uZykvLipbXi9dKlwuZ28nIFwpIC10eXBlIGYgXAotICAgICAgICAgICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIHRyZWVncmVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluZCAtRSAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtdHlwZSBmIC1pcmVnZXggJy4qXC4oY3xofGNwcHxocHB8U3xqYXZhfGt0fHhtbCknIFwKLSAgICAgICAgICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gLWkgIiRAIiB7fSArCi0gICAgICAgIH0KLQotICAgICAgICA7OwotICAgICopCi0gICAgICAgIGZ1bmN0aW9uIG1ncmVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtcGF0aCAuL291dCAtcHJ1bmUgLW8gXCggLXJlZ2V4dHlwZSBwb3NpeC1lZ3JlcCAtaXJlZ2V4ICcoLipcL01ha2VmaWxlfC4qXC9NYWtlZmlsZVwuLip8LipcLm1ha2V8LipcLm1ha3wuKlwubWt8LipcLmJwKScgLW8gLXJlZ2V4dHlwZSBwb3NpeC1leHRlbmRlZCAtcmVnZXggJyguKi8pPyhidWlsZHxzb29uZykvLipbXi9dKlwuZ28nIFwpIC10eXBlIGYgXAotICAgICAgICAgICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIHRyZWVncmVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtcmVnZXh0eXBlIHBvc2l4LWVncmVwIC1pcmVnZXggJy4qXC4oY3xofGNwcHxocHB8U3xqYXZhfGt0fHhtbCknIC10eXBlIGYgXAotICAgICAgICAgICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAtaSAiJEAiIHt9ICsKLSAgICAgICAgfQotCi0gICAgICAgIDs7Ci1lc2FjCi0KLWZ1bmN0aW9uIGdldHByZWJ1aWx0Ci17Ci0gICAgZ2V0X2Fic19idWlsZF92YXIgQU5EUk9JRF9QUkVCVUlMVFMKLX0KLQotZnVuY3Rpb24gdHJhY2VkbWR1bXAoKQotewotICAgIGxvY2FsIFQ9JChnZXR0b3ApCi0gICAgaWYgWyAhICIkVCIgXTsgdGhlbgotICAgICAgICBlY2hvICJDb3VsZG4ndCBsb2NhdGUgdGhlIHRvcCBvZiB0aGUgdHJlZS4gIFRyeSBzZXR0aW5nIFRPUC4iCi0gICAgICAgIHJldHVybgotICAgIGZpCi0gICAgbG9jYWwgcHJlYnVpbHRkaXI9JChnZXRwcmVidWlsdCkKLSAgICBsb2NhbCBhcmNoPSQoZ2V0dGFyZ2V0YXJjaCkKLSAgICBsb2NhbCBLRVJORUw9JFQvcHJlYnVpbHRzL3FlbXUta2VybmVsLyRhcmNoL3ZtbGludXgtcWVtdQotCi0gICAgbG9jYWwgVFJBQ0U9JDEKLSAgICBpZiBbICEgIiRUUkFDRSIgXSA7IHRoZW4KLSAgICAgICAgZWNobyAidXNhZ2U6ICB0cmFjZWRtZHVtcCAgdHJhY2VuYW1lIgotICAgICAgICByZXR1cm4KLSAgICBmaQotCi0gICAgaWYgWyAhIC1yICIkS0VSTkVMIiBdIDsgdGhlbgotICAgICAgICBlY2hvICJFcnJvcjogY2Fubm90IGZpbmQga2VybmVsOiAnJEtFUk5FTCciCi0gICAgICAgIHJldHVybgotICAgIGZpCi0KLSAgICBsb2NhbCBCQVNFVFJBQ0U9JChiYXNlbmFtZSAkVFJBQ0UpCi0gICAgaWYgWyAiJEJBU0VUUkFDRSIgPSAiJFRSQUNFIiBdIDsgdGhlbgotICAgICAgICBUUkFDRT0kQU5EUk9JRF9QUk9EVUNUX09VVC90cmFjZXMvJFRSQUNFCi0gICAgZmkKLQotICAgIGVjaG8gInBvc3QtcHJvY2Vzc2luZyB0cmFjZXMuLi4iCi0gICAgcm0gLWYgJFRSQUNFL3F0cmFjZS5kZXhsaXN0Ci0gICAgcG9zdF90cmFjZSAkVFJBQ0UKLSAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KLSAgICAgICAgZWNobyAiKioqIgotICAgICAgICBlY2hvICIqKiogRXJyb3I6IG1hbGZvcm1lZCB0cmFjZS4gIERpZCB5b3UgcmVtZW1iZXIgdG8gZXhpdCB0aGUgZW11bGF0b3I/IgotICAgICAgICBlY2hvICIqKioiCi0gICAgICAgIHJldHVybgotICAgIGZpCi0gICAgZWNobyAiZ2VuZXJhdGluZyBkZXhsaXN0IG91dHB1dC4uLiIKLSAgICAvYmluL2xzICRBTkRST0lEX1BST0RVQ1RfT1VUL3N5c3RlbS9mcmFtZXdvcmsvKi5qYXIgJEFORFJPSURfUFJPRFVDVF9PVVQvc3lzdGVtL2FwcC8qLmFwayAkQU5EUk9JRF9QUk9EVUNUX09VVC9kYXRhL2FwcC8qLmFwayAyPi9kZXYvbnVsbCB8IHhhcmdzIGRleGxpc3QgPiAkVFJBQ0UvcXRyYWNlLmRleGxpc3QKLSAgICBlY2hvICJnZW5lcmF0aW5nIGRtdHJhY2UgZGF0YS4uLiIKLSAgICBxMmRtIC1yICRBTkRST0lEX1BST0RVQ1RfT1VUL3N5bWJvbHMgJFRSQUNFICRLRVJORUwgJFRSQUNFL2RtdHJhY2UgfHwgcmV0dXJuCi0gICAgZWNobyAiZ2VuZXJhdGluZyBodG1sIGZpbGUuLi4iCi0gICAgZG10cmFjZWR1bXAgLWggJFRSQUNFL2RtdHJhY2UgPnwgJFRSQUNFL2RtdHJhY2UuaHRtbCB8fCByZXR1cm4KLSAgICBlY2hvICJkb25lLCBzZWUgJFRSQUNFL2RtdHJhY2UuaHRtbCBmb3IgZGV0YWlscyIKLSAgICBlY2hvICJvciBydW46IgotICAgIGVjaG8gIiAgICB0cmFjZXZpZXcgJFRSQUNFL2RtdHJhY2UiCisgICAgIyBTdXBwb3J0IHRvb2wgZXZlbnQgbG9nZ2luZyBmb3IgZmFzdGJvb3QgY29tbWFuZC4KKyAgICBydW5fdG9vbF93aXRoX2xvZ2dpbmcgIkZBU1RCT09UIiAkRkFTVEJPT1QgIiR7QH0iCiB9CiAKICMgY29tbXVuaWNhdGUgd2l0aCBhIHJ1bm5pbmcgZGV2aWNlIG9yIGVtdWxhdG9yLCBzZXQgdXAgbmVjZXNzYXJ5IHN0YXRlLApAQCAtMTQ1MCwxMTEgKzkyNyw2IEBACiAgICAgaGF0IC1KWG14NTEybSAkbG9jYWxGaWxlCiB9CiAKLWZ1bmN0aW9uIGdldGJ1Z3JlcG9ydHMoKQotewotICAgIGxvY2FsIHJlcG9ydHM9KGBhZGIgc2hlbGwgbHMgL3NkY2FyZC9idWdyZXBvcnRzIHwgdHIgLWQgJ1xyJ2ApCi0KLSAgICBpZiBbICEgIiRyZXBvcnRzIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIkNvdWxkIG5vdCBsb2NhdGUgYW55IGJ1Z3JlcG9ydHMuIgotICAgICAgICByZXR1cm4KLSAgICBmaQotCi0gICAgbG9jYWwgcmVwb3J0Ci0gICAgZm9yIHJlcG9ydCBpbiAke3JlcG9ydHNbQF19Ci0gICAgZG8KLSAgICAgICAgZWNobyAiL3NkY2FyZC9idWdyZXBvcnRzLyR7cmVwb3J0fSIKLSAgICAgICAgYWRiIHB1bGwgL3NkY2FyZC9idWdyZXBvcnRzLyR7cmVwb3J0fSAke3JlcG9ydH0KLSAgICAgICAgZ3VuemlwICR7cmVwb3J0fQotICAgIGRvbmUKLX0KLQotZnVuY3Rpb24gZ2V0c2RjYXJkcGF0aCgpCi17Ci0gICAgYWRiICR7YWRiT3B0aW9uc30gc2hlbGwgZWNobyAtbiBcJFx7RVhURVJOQUxfU1RPUkFHRVx9Ci19Ci0KLWZ1bmN0aW9uIGdldHNjcmVlbnNob3RwYXRoKCkKLXsKLSAgICBlY2hvICIkKGdldHNkY2FyZHBhdGgpL1BpY3R1cmVzL1NjcmVlbnNob3RzIgotfQotCi1mdW5jdGlvbiBnZXRsYXN0c2NyZWVuc2hvdCgpCi17Ci0gICAgbG9jYWwgc2NyZWVuc2hvdF9wYXRoPSQoZ2V0c2NyZWVuc2hvdHBhdGgpCi0gICAgbG9jYWwgc2NyZWVuc2hvdD1gYWRiICR7YWRiT3B0aW9uc30gbHMgJHtzY3JlZW5zaG90X3BhdGh9IHwgZ3JlcCBTY3JlZW5zaG90X1swLTktXSouKlwucG5nIHwgc29ydCAtcmsgMyB8IGN1dCAtZCAiICIgLWYgNCB8IGhlYWQgLW4gMWAKLSAgICBpZiBbICIkc2NyZWVuc2hvdCIgPSAiIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIk5vIHNjcmVlbnNob3RzIGZvdW5kLiIKLSAgICAgICAgcmV0dXJuCi0gICAgZmkKLSAgICBlY2hvICIke3NjcmVlbnNob3R9IgotICAgIGFkYiAke2FkYk9wdGlvbnN9IHB1bGwgJHtzY3JlZW5zaG90X3BhdGh9LyR7c2NyZWVuc2hvdH0KLX0KLQotZnVuY3Rpb24gc3RhcnR2aWV3c2VydmVyKCkKLXsKLSAgICBsb2NhbCBwb3J0PTQ5MzkKLSAgICBpZiBbICQjIC1ndCAwIF07IHRoZW4KLSAgICAgICAgICAgIHBvcnQ9JDEKLSAgICBmaQotICAgIGFkYiBzaGVsbCBzZXJ2aWNlIGNhbGwgd2luZG93IDEgaTMyICRwb3J0Ci19Ci0KLWZ1bmN0aW9uIHN0b3B2aWV3c2VydmVyKCkKLXsKLSAgICBhZGIgc2hlbGwgc2VydmljZSBjYWxsIHdpbmRvdyAyCi19Ci0KLWZ1bmN0aW9uIGlzdmlld3NlcnZlcnN0YXJ0ZWQoKQotewotICAgIGFkYiBzaGVsbCBzZXJ2aWNlIGNhbGwgd2luZG93IDMKLX0KLQotZnVuY3Rpb24ga2V5X2hvbWUoKQotewotICAgIGFkYiBzaGVsbCBpbnB1dCBrZXlldmVudCAzCi19Ci0KLWZ1bmN0aW9uIGtleV9iYWNrKCkKLXsKLSAgICBhZGIgc2hlbGwgaW5wdXQga2V5ZXZlbnQgNAotfQotCi1mdW5jdGlvbiBrZXlfbWVudSgpCi17Ci0gICAgYWRiIHNoZWxsIGlucHV0IGtleWV2ZW50IDgyCi19Ci0KLWZ1bmN0aW9uIHNtb2tldGVzdCgpCi17Ci0gICAgaWYgWyAhICIkQU5EUk9JRF9QUk9EVUNUX09VVCIgXTsgdGhlbgotICAgICAgICBlY2hvICJDb3VsZG4ndCBsb2NhdGUgb3V0cHV0IGZpbGVzLiAgVHJ5IHJ1bm5pbmcgJ2x1bmNoJyBmaXJzdC4iID4mMgotICAgICAgICByZXR1cm4KLSAgICBmaQotICAgIGxvY2FsIFQ9JChnZXR0b3ApCi0gICAgaWYgWyAhICIkVCIgXTsgdGhlbgotICAgICAgICBlY2hvICJDb3VsZG4ndCBsb2NhdGUgdGhlIHRvcCBvZiB0aGUgdHJlZS4gIFRyeSBzZXR0aW5nIFRPUC4iID4mMgotICAgICAgICByZXR1cm4KLSAgICBmaQotCi0gICAgKFxjZCAiJFQiICYmIG1tbSB0ZXN0cy9TbW9rZVRlc3QpICYmCi0gICAgICBhZGIgdW5pbnN0YWxsIGNvbS5hbmRyb2lkLnNtb2tldGVzdCA+IC9kZXYvbnVsbCAmJgotICAgICAgYWRiIHVuaW5zdGFsbCBjb20uYW5kcm9pZC5zbW9rZXRlc3QudGVzdHMgPiAvZGV2L251bGwgJiYKLSAgICAgIGFkYiBpbnN0YWxsICRBTkRST0lEX1BST0RVQ1RfT1VUL2RhdGEvYXBwL1Ntb2tlVGVzdEFwcC5hcGsgJiYKLSAgICAgIGFkYiBpbnN0YWxsICRBTkRST0lEX1BST0RVQ1RfT1VUL2RhdGEvYXBwL1Ntb2tlVGVzdC5hcGsgJiYKLSAgICAgIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IGNvbS5hbmRyb2lkLnNtb2tldGVzdC50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgotfQotCi0jIHNpbXBsZSBzaG9ydGN1dCB0byB0aGUgcnVudGVzdCBjb21tYW5kCi1mdW5jdGlvbiBydW50ZXN0KCkKLXsKLSAgICBsb2NhbCBUPSQoZ2V0dG9wKQotICAgIGlmIFsgISAiJFQiIF07IHRoZW4KLSAgICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIiA+JjIKLSAgICAgICAgcmV0dXJuCi0gICAgZmkKLSAgICAoIiRUIi9kZXZlbG9wbWVudC90ZXN0cnVubmVyL3J1bnRlc3QucHkgJEApCi19Ci0KIGZ1bmN0aW9uIGdvZGlyICgpIHsKICAgICBpZiBbWyAteiAiJDEiIF1dOyB0aGVuCiAgICAgICAgIGVjaG8gIlVzYWdlOiBnb2RpciA8cmVnZXg+IgpAQCAtMTYwNiwxNDEgKzk3OCwxMCBAQAogICAgIFxjZCAkVC8kcGF0aG5hbWUKIH0KIAotIyBVcGRhdGUgbW9kdWxlLWluZm8uanNvbiBpbiBvdXQuCi1mdW5jdGlvbiByZWZyZXNobW9kKCkgewotICAgIGlmIFsgISAiJEFORFJPSURfUFJPRFVDVF9PVVQiIF07IHRoZW4KLSAgICAgICAgZWNobyAiTm8gQU5EUk9JRF9QUk9EVUNUX09VVC4gVHJ5IHJ1bm5pbmcgJ2x1bmNoJyBmaXJzdC4iID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICBlY2hvICJSZWZyZXNoaW5nIG1vZHVsZXMgKGJ1aWxkaW5nIG1vZHVsZS1pbmZvLmpzb24pLiBMb2cgYXQgJEFORFJPSURfUFJPRFVDVF9PVVQvbW9kdWxlLWluZm8uanNvbi5idWlsZC5sb2cuIiA+JjIKLQotICAgICMgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG5leHQgY29tbWFuZAotICAgIG1rZGlyIC1wICRBTkRST0lEX1BST0RVQ1RfT1VUIHx8IHJldHVybiAxCi0KLSAgICAjIE5vdGUsIGNhbid0IHVzZSBhYnNvbHV0ZSBwYXRoIGJlY2F1c2Ugb2YgdGhlIHdheSBtYWtlIHdvcmtzLgotICAgIG0gJChnZXRfYnVpbGRfdmFyIFBST0RVQ1RfT1VUKS9tb2R1bGUtaW5mby5qc29uIFwKLSAgICAgICAgPiAkQU5EUk9JRF9QUk9EVUNUX09VVC9tb2R1bGUtaW5mby5qc29uLmJ1aWxkLmxvZyAyPiYxCi19Ci0KLSMgVmVyaWZpZXMgdGhhdCBtb2R1bGUtaW5mby50eHQgZXhpc3RzLCByZXR1cm5pbmcgbm9uemVybyBpZiBpdCBkb2Vzbid0LgotZnVuY3Rpb24gdmVyaWZ5bW9kaW5mbygpIHsKLSAgICBpZiBbICEgIiRBTkRST0lEX1BST0RVQ1RfT1VUIiBdOyB0aGVuCi0gICAgICAgIGlmIFsgIiRRVUlFVF9WRVJJRllNT0RJTkZPIiAhPSAidHJ1ZSIgXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gIk5vIEFORFJPSURfUFJPRFVDVF9PVVQuIFRyeSBydW5uaW5nICdsdW5jaCcgZmlyc3QuIiA+JjIKLSAgICAgICAgZmkKLSAgICAgICAgcmV0dXJuIDEKLSAgICBmaQotCi0gICAgaWYgWyAhIC1mICIkQU5EUk9JRF9QUk9EVUNUX09VVC9tb2R1bGUtaW5mby5qc29uIiBdOyB0aGVuCi0gICAgICAgIGlmIFsgIiRRVUlFVF9WRVJJRllNT0RJTkZPIiAhPSAidHJ1ZSIgXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gIkNvdWxkIG5vdCBmaW5kIG1vZHVsZS1pbmZvLmpzb24uIFBsZWFzZSBydW4gJ3JlZnJlc2htb2QnIGZpcnN0LiIgPiYyCi0gICAgICAgIGZpCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLX0KLQotIyBMaXN0IGFsbCBtb2R1bGVzIGZvciB0aGUgY3VycmVudCBkZXZpY2UsIGFzIGNhY2hlZCBpbiBhbGxfbW9kdWxlcy50eHQuIElmIGFueSBidWlsZCBjaGFuZ2UgaXMKLSMgbWFkZSBhbmQgaXQgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgb3V0cHV0LCB5b3Ugc2hvdWxkIHJ1biBgbSBub3RoaW5nYCBmaXJzdC4KLWZ1bmN0aW9uIGFsbG1vZCgpIHsKLSAgICBjYXQgJEFORFJPSURfUFJPRFVDVF9PVVQvYWxsX21vZHVsZXMudHh0IDI+L2Rldi9udWxsCi19Ci0KLSMgUmV0dXJuIHRoZSBCYXplbCBsYWJlbCBvZiBhIFNvb25nIG1vZHVsZSBpZiBpdCBpcyBjb252ZXJ0ZWQgd2l0aCBicDJidWlsZC4KLWZ1bmN0aW9uIGJtb2QoKQotKAotICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgotICAgICAgICBlY2hvICJ1c2FnZTogYm1vZCA8bW9kdWxlPiIgPiYyCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLQotICAgICMgV2UgY291bGQgcnVuIGJwMmJ1aWxkIGhlcmUsIGJ1dCBpdCBtaWdodCB0cmlnZ2VyIGJwMmJ1aWxkIGludmFsaWRhdGlvbgotICAgICMgd2hlbiB1c2VkIHdpdGggYGJgIChlLmcuIC0tcnVuX3Nvb25nX3Rlc3RzKSBhbmQvb3IgYWRkIHVubmVjZXNzYXJ5IHdhaXRpbmcKLSAgICAjIHRpbWUgb3ZlcmhlYWQuCi0gICAgIwotICAgICMgRm9yIGEgc25hcHB5IHJlc3VsdCwgdXNlIHRoZSBsYXRlc3QgZ2VuZXJhdGVkIHZlcnNpb24gaW4gc29vbmdfaW5qZWN0aW9uLAotICAgICMgYW5kIGFzayB1c2VycyB0byBydW4gbSBicDJidWlsZCBpZiBpdCBkb2Vzbid0IGV4aXN0LgotICAgIGNvbnZlcnRlZF9qc29uPSIkKGdldF9hYnNfYnVpbGRfdmFyIE9VVF9ESVIpL3Nvb25nL3Nvb25nX2luamVjdGlvbi9tZXRyaWNzL2NvbnZlcnRlZF9tb2R1bGVzX3BhdGhfbWFwLmpzb24iCi0KLSAgICBpZiBbICEgLWYgJHtjb252ZXJ0ZWRfanNvbn0gXTsgdGhlbgotICAgICAgZWNobyAiYnAyYnVpbGQgZmlsZXMgbm90IGZvdW5kLiBIYXZlIHlvdSByYW4gJ20gYnAyYnVpbGQnPyIgPiYyCi0gICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICBsb2NhbCB0YXJnZXRfbGFiZWw9JChweXRob24zIC1jICJpbXBvcnQganNvbgotbW9kdWxlID0gJyQxJwotY29udmVydGVkX2pzb249JyRjb252ZXJ0ZWRfanNvbicKLWJwMmJ1aWxkX2NvbnZlcnRlZF9tYXAgPSBqc29uLmxvYWQob3Blbihjb252ZXJ0ZWRfanNvbikpCi1pZiBtb2R1bGUgbm90IGluIGJwMmJ1aWxkX2NvbnZlcnRlZF9tYXA6Ci0gICAgZXhpdCgxKQotcHJpbnQoYnAyYnVpbGRfY29udmVydGVkX21hcFttb2R1bGVdICsgJzonICsgbW9kdWxlKSIpCi0KLSAgICBpZiBbIC16ICIke3RhcmdldF9sYWJlbH0iIF07IHRoZW4KLSAgICAgIGVjaG8gIiQxIGlzIG5vdCBjb252ZXJ0ZWQgdG8gQmF6ZWwuIiA+JjIKLSAgICAgIHJldHVybiAxCi0gICAgZWxzZQotICAgICAgZWNobyAiJHt0YXJnZXRfbGFiZWx9IgotICAgIGZpCi0pCi0KLSMgR2V0IHRoZSBwYXRoIG9mIGEgc3BlY2lmaWMgbW9kdWxlIGluIHRoZSBhbmRyb2lkIHRyZWUsIGFzIGNhY2hlZCBpbiBtb2R1bGUtaW5mby5qc29uLgotIyBJZiBhbnkgYnVpbGQgY2hhbmdlIGlzIG1hZGUsIGFuZCBpdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSBvdXRwdXQsIHlvdSBzaG91bGQgcnVuCi0jICdyZWZyZXNobW9kJyBmaXJzdC4gIE5vdGU6IFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgZGlybW9kcy4KLWZ1bmN0aW9uIHBhdGhtb2QoKSB7Ci0gICAgaWYgW1sgJCMgLW5lIDEgXV07IHRoZW4KLSAgICAgICAgZWNobyAidXNhZ2U6IHBhdGhtb2QgPG1vZHVsZT4iID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICB2ZXJpZnltb2RpbmZvIHx8IHJldHVybiAxCi0KLSAgICBsb2NhbCByZWxwYXRoPSQocHl0aG9uMyAtYyAiaW1wb3J0IGpzb24sIG9zCi1tb2R1bGUgPSAnJDEnCi1tb2R1bGVfaW5mbyA9IGpzb24ubG9hZChvcGVuKCckQU5EUk9JRF9QUk9EVUNUX09VVC9tb2R1bGUtaW5mby5qc29uJykpCi1pZiBtb2R1bGUgbm90IGluIG1vZHVsZV9pbmZvOgotICAgIGV4aXQoMSkKLXByaW50KG1vZHVsZV9pbmZvW21vZHVsZV1bJ3BhdGgnXVswXSkiIDI+L2Rldi9udWxsKQotCi0gICAgaWYgWyAteiAiJHJlbHBhdGgiIF07IHRoZW4KLSAgICAgICAgZWNobyAiQ291bGQgbm90IGZpbmQgbW9kdWxlICckMScgKHRyeSAncmVmcmVzaG1vZCcgaWYgdGhlcmUgaGF2ZSBiZWVuIGJ1aWxkIGNoYW5nZXM/KS4iID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGVsc2UKLSAgICAgICAgZWNobyAiJEFORFJPSURfQlVJTERfVE9QLyRyZWxwYXRoIgotICAgIGZpCi19Ci0KLSMgR2V0IHRoZSBwYXRoIG9mIGEgc3BlY2lmaWMgbW9kdWxlIGluIHRoZSBhbmRyb2lkIHRyZWUsIGFzIGNhY2hlZCBpbiBtb2R1bGUtaW5mby5qc29uLgotIyBJZiBhbnkgYnVpbGQgY2hhbmdlIGlzIG1hZGUsIGFuZCBpdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSBvdXRwdXQsIHlvdSBzaG91bGQgcnVuCi0jICdyZWZyZXNobW9kJyBmaXJzdC4gIE5vdGU6IFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgcGF0aG1vZC4KLWZ1bmN0aW9uIGRpcm1vZHMoKSB7Ci0gICAgaWYgW1sgJCMgLW5lIDEgXV07IHRoZW4KLSAgICAgICAgZWNobyAidXNhZ2U6IGRpcm1vZHMgPHBhdGg+IiA+JjIKLSAgICAgICAgcmV0dXJuIDEKLSAgICBmaQotCi0gICAgdmVyaWZ5bW9kaW5mbyB8fCByZXR1cm4gMQotCi0gICAgcHl0aG9uMyAtYyAiaW1wb3J0IGpzb24sIG9zCi1kaXIgPSAnJDEnCi13aGlsZSBkaXIuZW5kc3dpdGgoJy8nKToKLSAgICBkaXIgPSBkaXJbOi0xXQotcHJlZml4ID0gZGlyICsgJy8nCi1tb2R1bGVfaW5mbyA9IGpzb24ubG9hZChvcGVuKCckQU5EUk9JRF9QUk9EVUNUX09VVC9tb2R1bGUtaW5mby5qc29uJykpCi1yZXN1bHRzID0gc2V0KCkKLWZvciBtIGluIG1vZHVsZV9pbmZvLnZhbHVlcygpOgotICAgIGZvciBwYXRoIGluIG0uZ2V0KHUncGF0aCcsIFtdKToKLSAgICAgICAgaWYgcGF0aCA9PSBkaXIgb3IgcGF0aC5zdGFydHN3aXRoKHByZWZpeCk6Ci0gICAgICAgICAgICBuYW1lID0gbS5nZXQodSdtb2R1bGVfbmFtZScpCi0gICAgICAgICAgICBpZiBuYW1lOgotICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG5hbWUpCi1mb3IgbmFtZSBpbiBzb3J0ZWQocmVzdWx0cyk6Ci0gICAgcHJpbnQobmFtZSkKLSIKLX0KLQotCiAjIEdvIHRvIGEgc3BlY2lmaWMgbW9kdWxlIGluIHRoZSBhbmRyb2lkIHRyZWUsIGFzIGNhY2hlZCBpbiBtb2R1bGUtaW5mby5qc29uLiBJZiBhbnkgYnVpbGQgY2hhbmdlCiAjIGlzIG1hZGUsIGFuZCBpdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSBvdXRwdXQsIHlvdSBzaG91bGQgcnVuICdyZWZyZXNobW9kJyBmaXJzdC4KKyMgTm90ZTogVGhpcyBmdW5jdGlvbiBpcyBpbiBlbnZzZXR1cCBiZWNhdXNlIGNoYW5naW5nIHRoZSBkaXJlY3RvcnkgbmVlZHMgdG8gaGFwcGVuIGluIHRoZSBjdXJyZW50CisjIHNoZWxsLiBBbGwgb3RoZXIgZnVuY3Rpb25zIHRoYXQgdXNlIG1vZHVsZS1pbmZvLmpzb24gc2hvdWxkIGJlIGluIGJ1aWxkL3Nvb25nL2Jpbi4KIGZ1bmN0aW9uIGdvbW9kKCkgewogICAgIGlmIFtbICQjIC1uZSAxIF1dOyB0aGVuCiAgICAgICAgIGVjaG8gInVzYWdlOiBnb21vZCA8bW9kdWxlPiIgPiYyCkBAIC0xNzU0LDkwICs5OTUsMTEgQEAKICAgICBjZCAkcGF0aAogfQogCi0jIEdldHMgdGhlIGxpc3Qgb2YgYSBtb2R1bGUncyBpbnN0YWxsZWQgb3V0cHV0cywgYXMgY2FjaGVkIGluIG1vZHVsZS1pbmZvLmpzb24uCi0jIElmIGFueSBidWlsZCBjaGFuZ2UgaXMgbWFkZSwgYW5kIGl0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIG91dHB1dCwgeW91IHNob3VsZCBydW4gJ3JlZnJlc2htb2QnIGZpcnN0LgotZnVuY3Rpb24gb3V0bW9kKCkgewotICAgIGlmIFtbICQjIC1uZSAxIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gInVzYWdlOiBvdXRtb2QgPG1vZHVsZT4iID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICB2ZXJpZnltb2RpbmZvIHx8IHJldHVybiAxCi0KLSAgICBsb2NhbCByZWxwYXRoCi0gICAgcmVscGF0aD0kKHB5dGhvbjMgLWMgImltcG9ydCBqc29uLCBvcwotbW9kdWxlID0gJyQxJwotbW9kdWxlX2luZm8gPSBqc29uLmxvYWQob3BlbignJEFORFJPSURfUFJPRFVDVF9PVVQvbW9kdWxlLWluZm8uanNvbicpKQotaWYgbW9kdWxlIG5vdCBpbiBtb2R1bGVfaW5mbzoKLSAgICBleGl0KDEpCi1mb3Igb3V0cHV0IGluIG1vZHVsZV9pbmZvW21vZHVsZV1bJ2luc3RhbGxlZCddOgotICAgIHByaW50KG9zLnBhdGguam9pbignJEFORFJPSURfQlVJTERfVE9QJywgb3V0cHV0KSkiIDI+L2Rldi9udWxsKQotCi0gICAgaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0gICAgICAgIGVjaG8gIkNvdWxkIG5vdCBmaW5kIG1vZHVsZSAnJDEnICh0cnkgJ3JlZnJlc2htb2QnIGlmIHRoZXJlIGhhdmUgYmVlbiBidWlsZCBjaGFuZ2VzPykiID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGVsaWYgWyAhIC16ICIkcmVscGF0aCIgXTsgdGhlbgotICAgICAgICBlY2hvICIkcmVscGF0aCIKLSAgICBmaQotfQotCi0jIGFkYiBpbnN0YWxsIGEgbW9kdWxlJ3MgYXBrLCBhcyBjYWNoZWQgaW4gbW9kdWxlLWluZm8uanNvbi4gSWYgYW55IGJ1aWxkIGNoYW5nZQotIyBpcyBtYWRlLCBhbmQgaXQgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgb3V0cHV0LCB5b3Ugc2hvdWxkIHJ1biAncmVmcmVzaG1vZCcgZmlyc3QuCi0jIFVzYWdlOiBpbnN0YWxsbW9kIFthZGIgaW5zdGFsbCBhcmd1bWVudHNdIDxtb2R1bGU+Ci0jIEZvciBleGFtcGxlOiBpbnN0YWxsbW9kIC1yIERpYWxlciAtPiBhZGIgaW5zdGFsbCAtciAvcGF0aC90by9EaWFsZXIuYXBrCi1mdW5jdGlvbiBpbnN0YWxsbW9kKCkgewotICAgIGlmIFtbICQjIC1lcSAwIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gInVzYWdlOiBpbnN0YWxsbW9kIFthZGIgaW5zdGFsbCBhcmd1bWVudHNdIDxtb2R1bGU+IiA+JjIKLSAgICAgICAgZWNobyAiIiA+JjIKLSAgICAgICAgZWNobyAiT25seSBmbGFncyB0byBiZSBwYXNzZWQgYWZ0ZXIgdGhlIFwiaW5zdGFsbFwiIGluIGFkYiBpbnN0YWxsIGFyZSBzdXBwb3J0ZWQsIiA+JjIKLSAgICAgICAgZWNobyAid2l0aCB0aGUgZXhjZXB0aW9uIG9mIC1zLiBJZiAtcyBpcyBwYXNzZWQgaXQgd2lsbCBiZSBwbGFjZWQgYmVmb3JlIHRoZSBcImluc3RhbGxcIi4iID4mMgotICAgICAgICBlY2hvICItcyBtdXN0IGJlIHRoZSBmaXJzdCBmbGFnIHBhc3NlZCBpZiBpdCBleGlzdHMuIiA+JjIKLSAgICAgICAgcmV0dXJuIDEKLSAgICBmaQotCi0gICAgbG9jYWwgX3BhdGgKLSAgICBfcGF0aD0kKG91dG1vZCAke0A6JCM6MX0pCi0gICAgaWYgWyAkPyAtbmUgMCBdOyB0aGVuCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLQotICAgIF9wYXRoPSQoZWNobyAiJF9wYXRoIiB8IGdyZXAgLUUgXFwuYXBrJCB8IGhlYWQgLW4gMSkKLSAgICBpZiBbIC16ICIkX3BhdGgiIF07IHRoZW4KLSAgICAgICAgZWNobyAiTW9kdWxlICckMScgZG9lcyBub3QgcHJvZHVjZSBhIGZpbGUgZW5kaW5nIHdpdGggLmFwayAodHJ5ICdyZWZyZXNobW9kJyBpZiB0aGVyZSBoYXZlIGJlZW4gYnVpbGQgY2hhbmdlcz8pIiA+JjIKLSAgICAgICAgcmV0dXJuIDEKLSAgICBmaQotICAgIGxvY2FsIHNlcmlhbF9kZXZpY2U9IiIKLSAgICBpZiBbWyAiJDEiID09ICItcyIgXV07IHRoZW4KLSAgICAgICAgaWYgW1sgJCMgLWxlIDIgXV07IHRoZW4KLSAgICAgICAgICAgIGVjaG8gIi1zIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiA+JjIKLSAgICAgICAgICAgIHJldHVybiAxCi0gICAgICAgIGZpCi0gICAgICAgIHNlcmlhbF9kZXZpY2U9Ii1zICQyIgotICAgICAgICBzaGlmdCAyCi0gICAgZmkKLSAgICBsb2NhbCBsZW5ndGg9JCgoICQjIC0gMSApKQotICAgIGVjaG8gYWRiICRzZXJpYWxfZGV2aWNlIGluc3RhbGwgJHtAOjE6JGxlbmd0aH0gJF9wYXRoCi0gICAgYWRiICRzZXJpYWxfZGV2aWNlIGluc3RhbGwgJHtAOjE6JGxlbmd0aH0gJF9wYXRoCi19Ci0KIGZ1bmN0aW9uIF9jb21wbGV0ZV9hbmRyb2lkX21vZHVsZV9uYW1lcygpIHsKICAgICBsb2NhbCB3b3JkPSR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0KICAgICBDT01QUkVQTFk9KCAkKGFsbG1vZCB8IGdyZXAgLUUgIl4kd29yZCIpICkKIH0KIAotIyBQcmludCBjb2xvcmVkIGV4aXQgY29uZGl0aW9uCi1mdW5jdGlvbiBwZXogewotICAgICIkQCIKLSAgICBsb2NhbCByZXR2YWw9JD8KLSAgICBpZiBbICRyZXR2YWwgLW5lIDAgXQotICAgIHRoZW4KLSAgICAgICAgZWNobyAkJ1xFJyJbMDszMW1GQUlMVVJFXGVbMDBtIgotICAgIGVsc2UKLSAgICAgICAgZWNobyAkJ1xFJyJbMDszMm1TVUNDRVNTXGVbMDBtIgotICAgIGZpCi0gICAgcmV0dXJuICRyZXR2YWwKLX0KLQogZnVuY3Rpb24gZ2V0X21ha2VfY29tbWFuZCgpCiB7CiAgICAgIyBJZiB3ZSdyZSBpbiB0aGUgdG9wIG9mIGFuIEFuZHJvaWQgdHJlZSwgdXNlIHNvb25nX3VpLmJhc2ggaW5zdGVhZCBvZiBtYWtlCkBAIC0xODU1LDEzNyArMTAxNywxMSBAQAogICAgIGZpCiB9CiAKLWZ1bmN0aW9uIF93cmFwX2J1aWxkKCkKLXsKLSAgICBpZiBbWyAiJHtBTkRST0lEX1FVSUVUX0JVSUxEOi19IiA9PSB0cnVlIF1dOyB0aGVuCi0gICAgICAiJEAiCi0gICAgICByZXR1cm4gJD8KLSAgICBmaQotICAgIGxvY2FsIHN0YXJ0X3RpbWU9JChkYXRlICsiJXMiKQotICAgICIkQCIKLSAgICBsb2NhbCByZXQ9JD8KLSAgICBsb2NhbCBlbmRfdGltZT0kKGRhdGUgKyIlcyIpCi0gICAgbG9jYWwgdGRpZmY9JCgoJGVuZF90aW1lLSRzdGFydF90aW1lKSkKLSAgICBsb2NhbCBob3Vycz0kKCgkdGRpZmYgLyAzNjAwICkpCi0gICAgbG9jYWwgbWlucz0kKCgoJHRkaWZmICUgMzYwMCkgLyA2MCkpCi0gICAgbG9jYWwgc2Vjcz0kKCgkdGRpZmYgJSA2MCkpCi0gICAgbG9jYWwgbmNvbG9ycz0kKHRwdXQgY29sb3JzIDI+L2Rldi9udWxsKQotICAgIGlmIFsgLW4gIiRuY29sb3JzIiBdICYmIFsgJG5jb2xvcnMgLWdlIDggXTsgdGhlbgotICAgICAgICBjb2xvcl9mYWlsZWQ9JCdcRSciWzA7MzFtIgotICAgICAgICBjb2xvcl9zdWNjZXNzPSQnXEUnIlswOzMybSIKLSAgICAgICAgY29sb3Jfd2FybmluZz0kJ1xFJyJbMDszM20iCi0gICAgICAgIGNvbG9yX3Jlc2V0PSQnXEUnIlswMG0iCi0gICAgZWxzZQotICAgICAgICBjb2xvcl9mYWlsZWQ9IiIKLSAgICAgICAgY29sb3Jfc3VjY2Vzcz0iIgotICAgICAgICBjb2xvcl9yZXNldD0iIgotICAgIGZpCi0KLSAgICBlY2hvCi0gICAgaWYgWyAkcmV0IC1lcSAwIF0gOyB0aGVuCi0gICAgICAgIGVjaG8gLW4gIiR7Y29sb3Jfc3VjY2Vzc30jIyMjIGJ1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgIgotICAgIGVsc2UKLSAgICAgICAgZWNobyAtbiAiJHtjb2xvcl9mYWlsZWR9IyMjIyBmYWlsZWQgdG8gYnVpbGQgc29tZSB0YXJnZXRzICIKLSAgICBmaQotICAgIGlmIFsgJGhvdXJzIC1ndCAwIF0gOyB0aGVuCi0gICAgICAgIHByaW50ZiAiKCUwMmc6JTAyZzolMDJnIChoaDptbTpzcykpIiAkaG91cnMgJG1pbnMgJHNlY3MKLSAgICBlbGlmIFsgJG1pbnMgLWd0IDAgXSA7IHRoZW4KLSAgICAgICAgcHJpbnRmICIoJTAyZzolMDJnIChtbTpzcykpIiAkbWlucyAkc2VjcwotICAgIGVsaWYgWyAkc2VjcyAtZ3QgMCBdIDsgdGhlbgotICAgICAgICBwcmludGYgIiglcyBzZWNvbmRzKSIgJHNlY3MKLSAgICBmaQotICAgIGVjaG8gIiAjIyMjJHtjb2xvcl9yZXNldH0iCi0gICAgZWNobwotICAgIHJldHVybiAkcmV0Ci19Ci0KLWZ1bmN0aW9uIF90cmlnZ2VyX2J1aWxkKCkKLSgKLSAgICBsb2NhbCAtciBiYz0iJDEiOyBzaGlmdAotICAgIGxvY2FsIFQ9JChnZXR0b3ApCi0gICAgaWYgWyAtbiAiJFQiIF07IHRoZW4KLSAgICAgIF93cmFwX2J1aWxkICIkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIiAtLWJ1aWxkLW1vZGUgLS0ke2JjfSAtLWRpcj0iJChwd2QpIiAiJEAiCi0gICAgZWxzZQotICAgICAgPiYyIGVjaG8gIkNvdWxkbid0IGxvY2F0ZSB0aGUgdG9wIG9mIHRoZSB0cmVlLiBUcnkgc2V0dGluZyBUT1AuIgotICAgICAgcmV0dXJuIDEKLSAgICBmaQotKQotCi1mdW5jdGlvbiBtKCkKLSgKLSAgICBfdHJpZ2dlcl9idWlsZCAiYWxsLW1vZHVsZXMiICIkQCIKLSkKLQotZnVuY3Rpb24gbW0oKQotKAotICAgIF90cmlnZ2VyX2J1aWxkICJtb2R1bGVzLWluLWEtZGlyLW5vLWRlcHMiICIkQCIKLSkKLQotZnVuY3Rpb24gbW1tKCkKLSgKLSAgICBfdHJpZ2dlcl9idWlsZCAibW9kdWxlcy1pbi1kaXJzLW5vLWRlcHMiICIkQCIKLSkKLQotZnVuY3Rpb24gbW1hKCkKLSgKLSAgICBfdHJpZ2dlcl9idWlsZCAibW9kdWxlcy1pbi1hLWRpciIgIiRAIgotKQotCi1mdW5jdGlvbiBtbW1hKCkKLSgKLSAgICBfdHJpZ2dlcl9idWlsZCAibW9kdWxlcy1pbi1kaXJzIiAiJEAiCi0pCi0KIGZ1bmN0aW9uIG1ha2UoKQogewogICAgIF93cmFwX2J1aWxkICQoZ2V0X21ha2VfY29tbWFuZCAiJEAiKSAiJEAiCiB9CiAKLWZ1bmN0aW9uIF9tdWx0aXRyZWVfbHVuY2hfZXJyb3IoKQotewotICAgICAgPiYyIGVjaG8gIkNvdWxkbid0IGxvY2F0ZSB0aGUgdG9wIG9mIHRoZSB0cmVlLiBQbGVhc2UgcnVuIFwnc291cmNlIGJ1aWxkL2VudnNldHVwLnNoXCcgYW5kIG11bHRpdHJlZV9sdW5jaCBmcm9tIHRoZSByb290IG9mIHlvdXIgd29ya3NwYWNlLiIKLX0KLQotZnVuY3Rpb24gbXVsdGl0cmVlX2J1aWxkKCkKLXsKLSAgICBsb2NhbCBUPSQobXVsdGl0cmVlX2dldHRvcCkKLSAgICBpZiBbIC1uICIkVCIgXTsgdGhlbgotICAgICAgIiRUL29yY2hlc3RyYXRvci9idWlsZC9vcmNoZXN0cmF0b3IvY29yZS9vcmNoZXN0cmF0b3IucHkiICIkQCIKLSAgICBlbHNlCi0gICAgICBfbXVsdGl0cmVlX2x1bmNoX2Vycm9yCi0gICAgICByZXR1cm4gMQotICAgIGZpCi19Ci0KLWZ1bmN0aW9uIHByb3Zpc2lvbigpCi17Ci0gICAgaWYgWyAhICIkQU5EUk9JRF9QUk9EVUNUX09VVCIgXTsgdGhlbgotICAgICAgICBlY2hvICJDb3VsZG4ndCBsb2NhdGUgb3V0cHV0IGZpbGVzLiAgVHJ5IHJ1bm5pbmcgJ2x1bmNoJyBmaXJzdC4iID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0gICAgaWYgWyAhIC1lICIkQU5EUk9JRF9QUk9EVUNUX09VVC9wcm92aXNpb24tZGV2aWNlIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIlRoZXJlIGlzIG5vIHByb3Zpc2lvbmluZyBzY3JpcHQgZm9yIHRoZSBkZXZpY2UuIiA+JjIKLSAgICAgICAgcmV0dXJuIDEKLSAgICBmaQotCi0gICAgIyBDaGVjayBpZiB1c2VyIHJlYWxseSB3YW50cyB0byBkbyB0aGlzLgotICAgIGlmIFsgIiQxIiA9ICItLW5vLWNvbmZpcm1hdGlvbiIgXTsgdGhlbgotICAgICAgICBzaGlmdCAxCi0gICAgZWxzZQotICAgICAgICBlY2hvICJUaGlzIGFjdGlvbiB3aWxsIHJlZmxhc2ggeW91ciBkZXZpY2UuIgotICAgICAgICBlY2hvICIiCi0gICAgICAgIGVjaG8gIkFMTCBEQVRBIE9OIFRIRSBERVZJQ0UgV0lMTCBCRSBJUlJFVk9DQUJMWSBFUkFTRUQuIgotICAgICAgICBlY2hvICIiCi0gICAgICAgIGVjaG8gLW4gIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkbyB0aGlzICh5ZXMvbm8pPyAiCi0gICAgICAgIHJlYWQKLSAgICAgICAgaWYgW1sgIiR7UkVQTFl9IiAhPSAieWVzIiBdXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gIk5vdCB0YWtpbmcgYW55IGFjdGlvbi4gRXhpdGluZy4iID4mMgotICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgZmkKLSAgICBmaQotICAgICIkQU5EUk9JRF9QUk9EVUNUX09VVC9wcm92aXNpb24tZGV2aWNlIiAiJEAiCi19Ci0KICMgWnNoIG5lZWRzIGJhc2hjb21waW5pdCBjYWxsZWQgdG8gc3VwcG9ydCBiYXNoLXN0eWxlIGNvbXBsZXRpb24uCiBmdW5jdGlvbiBlbmFibGVfenNoX2NvbXBsZXRpb24oKSB7CiAgICAgIyBEb24ndCBvdmVycmlkZSB1c2VyJ3Mgb3B0aW9ucyBpZiBiYXNoLXN0eWxlIGNvbXBsZXRpb24gaXMgYWxyZWFkeSBlbmFibGVkLgpAQCAtMjA0Miw2ICsxMDc4LDExIEBACiAgICAgICAgICAgICBmaQogICAgICAgICBkb25lCiAgICAgZG9uZQorCisgICAgaWYgW1sgIiR7UFdEfSIgPT0gL2dvb2dsZS9jb2cvKiBdXTsgdGhlbgorICAgICAgICBmPSJidWlsZC9tYWtlL2NvZ3NldHVwLnNoIgorICAgICAgICBlY2hvICJpbmNsdWRpbmcgJGYiOyAuICIkVC8kZiIKKyAgICBmaQogfQogCiBmdW5jdGlvbiBzaG93Y29tbWFuZHMoKSB7CkBAIC0yMDYyLDcgKzExMDMsNyBAQAogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICA7OwogICAgIGVzYWMKLSAgICBPVVRfRElSPSIkKGdldF9hYnNfYnVpbGRfdmFyIE9VVF9ESVIpIgorICAgIE9VVF9ESVI9IiQoX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCBPVVRfRElSKSIKICAgICBpZiBbWyAiJDEiID09ICItLXJlZ2VuZXJhdGUiIF1dOyB0aGVuCiAgICAgICBzaGlmdCAxCiAgICAgICBOSU5KQV9BUkdTPSItdCBjb21tYW5kcyAkQCIgbQpAQCAtMjA3MywxNSArMTExNCw2OCBAQAogICAgIGZpCiB9CiAKLWZ1bmN0aW9uIGF2YnRvb2woKSB7Ci0gICAgaWYgW1sgISAtZiAiJEFORFJPSURfU09PTkdfSE9TVF9PVVQiL2Jpbi9hdmJ0b29sIF1dOyB0aGVuCi0gICAgICAgIG0gYXZidG9vbAotICAgIGZpCi0gICAgIiRBTkRST0lEX1NPT05HX0hPU1RfT1VUIi9iaW4vYXZidG9vbCAkQAotfQorIyBUaGVzZSBmdW5jdGlvbnMgdXNlZCB0byBiZSBoZXJlIGJ1dCBhcmUgbm93IHN0YW5kYWxvbmUgc2NyaXB0cworIyBpbiBidWlsZC9zb29uZy9iaW4uICBVbnNldCB0aGVzZSBmb3IgdGhlIHRpbWUgYmVpbmcgc28gdGhlIHJlYWwKKyMgc2NyaXB0IGlzIHBpY2tlZCB1cC4KKyMgVE9ETzogUmVtb3ZlIHRoaXMgc29tZSB0aW1lIGFmdGVyIGEgc3VpdGFibGUgZGVsYXkgKG1heWJlIDIwMjU/KQordW5zZXQgYWxsbW9kCit1bnNldCBhbmluamEKK3Vuc2V0IGNncmVwCit1bnNldCBjb3JlCit1bnNldCBjb3JlZHVtcF9lbmFibGUKK3Vuc2V0IGNvcmVkdW1wX3NldHVwCit1bnNldCBkaXJtb2RzCit1bnNldCBnZXRfYnVpbGRfdmFyCit1bnNldCBnZXRfYWJzX2J1aWxkX3ZhcgordW5zZXQgZ2V0bGFzdHNjcmVlbnNob3QKK3Vuc2V0IGdldHByZWJ1aWx0Cit1bnNldCBnZXRzY3JlZW5zaG90cGF0aAordW5zZXQgZ2V0c2RjYXJkcGF0aAordW5zZXQgZ2V0dGFyZ2V0YXJjaAordW5zZXQgZ2dyZXAKK3Vuc2V0IGdvZ3JlcAordW5zZXQgaG1tCit1bnNldCBpbnN0YWxsbW9kCit1bnNldCBpczY0Yml0Cit1bnNldCBpc3ZpZXdzZXJ2ZXJzdGFydGVkCit1bnNldCBqZ3JlcAordW5zZXQganNvbmdyZXAKK3Vuc2V0IGtleV9iYWNrCit1bnNldCBrZXlfaG9tZQordW5zZXQga2V5X21lbnUKK3Vuc2V0IGt0Z3JlcAordW5zZXQgbQordW5zZXQgbWFuZ3JlcAordW5zZXQgbWdyZXAKK3Vuc2V0IG1tCit1bnNldCBtbWEKK3Vuc2V0IG1tbQordW5zZXQgbW1tYQordW5zZXQgb3V0bW9kCit1bnNldCBvdmVycmlkZWZsYWdzCit1bnNldCBvd25ncmVwCit1bnNldCBwYXRobW9kCit1bnNldCBwZXoKK3Vuc2V0IHB5Z3JlcAordW5zZXQgcXBpZAordW5zZXQgcmNncmVwCit1bnNldCByZWZyZXNobW9kCit1bnNldCByZXNncmVwCit1bnNldCByc2dyZXAKK3Vuc2V0IHJ1bl90b29sX3dpdGhfbG9nZ2luZwordW5zZXQgc2VwZ3JlcAordW5zZXQgc2dyZXAKK3Vuc2V0IHN0YXJ0dmlld3NlcnZlcgordW5zZXQgc3RvcHZpZXdzZXJ2ZXIKK3Vuc2V0IHN5c3RlbXN0YWNrCit1bnNldCBzeXN3cml0ZQordW5zZXQgdG9tbGdyZXAKK3Vuc2V0IHRyZWVncmVwCisKIAogdmFsaWRhdGVfY3VycmVudF9zaGVsbAogc2V0X2dsb2JhbF9wYXRocwogc291cmNlX3ZlbmRvcnNldHVwCiBhZGRjb21wbGV0aW9ucwogCisKZGlmZiAtLWdpdCBhL3BhY2thZ2luZy9kaXN0ZGlyLm1rIGIvcGFja2FnaW5nL2Rpc3RkaXIubWsKaW5kZXggMjY0YThiMC4uMTUzZWNmNiAxMDA2NDQKLS0tIGEvcGFja2FnaW5nL2Rpc3RkaXIubWsKKysrIGIvcGFja2FnaW5nL2Rpc3RkaXIubWsKQEAgLTE4LDE2ICsxOCwxOSBAQAogRElTVF9HT0FMX09VVFBVVF9QQUlSUyA6PQogRElTVF9TUkNfRFNUX1BBSVJTIDo9CiBpbmNsdWRlICQoS0FUSV9QQUNLQUdFX01LX0RJUikvZGlzdC5taworRklMRV9OQU1FX1RBRyA6PSAkKGZpbGUgPCQoT1VUX0RJUikvZmlsZV9uYW1lX3RhZy50eHQpCisuS0FUSV9SRUFET05MWSA6PSBGSUxFX05BTUVfVEFHCiAKICQoZm9yZWFjaCBwYWlyLCQoRElTVF9HT0FMX09VVFBVVF9QQUlSUyksIFwKICAgJChldmFsIGdvYWwgOj0gJChjYWxsIHdvcmQtY29sb24sMSwkKHBhaXIpKSkgXAotICAkKGV2YWwgb3V0cHV0IDo9ICQoY2FsbCB3b3JkLWNvbG9uLDIsJChwYWlyKSkpIFwKKyAgJChldmFsIG91dHB1dCA6PSAkKHN1YnN0IEZJTEVfTkFNRV9UQUdfUExBQ0VIT0xERVIsJChGSUxFX05BTUVfVEFHKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQocGFpcikpKSkgXAogICAkKGV2YWwgLlBIT05ZOiBfZGlzdF8kJChnb2FsKSkgXAogICAkKGlmICQoY2FsbCBzdHJlcSwkKERJU1QpLHRydWUpLFwKICAgICAkKGV2YWwgX2Rpc3RfJCQoZ29hbCk6ICQkKERJU1RfRElSKS8kJChvdXRwdXQpKSwgXAogICAgICQoZXZhbCBfZGlzdF8kJChnb2FsKTopKSkKIAogZGVmaW5lIGNvcHktb25lLWRpc3QtZmlsZQorJCgyKTogLktBVElfVEFHUyArPSA7cnVsZV9uYW1lPWRpc3QtY3AKICQoMik6ICQoMSkKIAlAZWNobyAiRGlzdDogJCRAIgogCXJtIC1mICQkQApAQCAtMzcsNyArNDAsNyBAQAogaWZlcSAoJChESVNUKSx0cnVlKQogICAkKGZvcmVhY2ggcGFpciwkKERJU1RfU1JDX0RTVF9QQUlSUyksIFwKICAgICAkKGV2YWwgc3JjIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDEsJChwYWlyKSkpIFwKLSAgICAkKGV2YWwgZHN0IDo9ICQoRElTVF9ESVIpLyQoY2FsbCB3b3JkLWNvbG9uLDIsJChwYWlyKSkpIFwKKyAgICAkKGV2YWwgZHN0IDo9ICQoc3Vic3QgRklMRV9OQU1FX1RBR19QTEFDRUhPTERFUiwkKEZJTEVfTkFNRV9UQUcpLCQoRElTVF9ESVIpLyQoY2FsbCB3b3JkLWNvbG9uLDIsJChwYWlyKSkpKSBcCiAgICAgJChldmFsICQoY2FsbCBjb3B5LW9uZS1kaXN0LWZpbGUsJChzcmMpLCQoZHN0KSkpKQogZW5kaWYKIApkaWZmIC0tZ2l0IGEvcmJlc2V0dXAuc2ggYi9yYmVzZXR1cC5zaAppbmRleCA4Mzg2NjI4Li4wZGE3YTU3IDEwMDY0NAotLS0gYS9yYmVzZXR1cC5zaAorKysgYi9yYmVzZXR1cC5zaApAQCAtMzQsNyArMzQsNyBAQAogIyBmb3IgdGhlIGJ1aWxkIHRvIGJlIGV4ZWN1dGVkIHdpdGggUkJFLgogZnVuY3Rpb24gdXNlX3JiZSgpIHsKICAgbG9jYWwgUkJFX0JJTkFSSUVTX0RJUj0icHJlYnVpbHRzL3JlbW90ZWV4ZWN1dGlvbi1jbGllbnQvbGF0ZXN0IgotICBsb2NhbCBET0NLRVJfSU1BR0U9Imdjci5pby9hbmRyb2lkYnVpbGQtcmUtZG9ja2VyaW1hZ2UvYW5kcm9pZC1idWlsZC1yZW1vdGVleGVjLWltYWdlQHNoYTI1Njo1ODJlZmIzOGYwYzIyOWVhMzk5NTJmZmY5ZTEzMmNjYmUxODNlMTQ4NjliMzk4ODgwMTBkYWNmNTZiMzYwZDYyIgorICBsb2NhbCBET0NLRVJfSU1BR0U9Imdjci5pby9hbmRyb2lkYnVpbGQtcmUtZG9ja2VyaW1hZ2UvYW5kcm9pZC1idWlsZC1yZW1vdGVleGVjLWltYWdlQHNoYTI1NjoxZWI3ZjY0YjllMTcxMDJiOTcwYmQ3YTFhZjdkYWFlYmRiMDFjM2ZiNzc3NzE1ODk5ZWY0NjJkNmM2ZDAxYTQ1IgogCiAgICMgRG8gbm90IHNldCBhbiBpbnZvY2F0aW9uLUlEIGFuZCBsZXQgcmVwcm94eSBhdXRvLWdlbmVyYXRlIG9uZS4KICAgVVNFX1JCRT0idHJ1ZSIgXApkaWZmIC0tZ2l0IGEvc2hlbGxfdXRpbHMuc2ggYi9zaGVsbF91dGlscy5zaAppbmRleCA5ZGU1YTUwLi44NmYzZjQ5IDEwMDY0NAotLS0gYS9zaGVsbF91dGlscy5zaAorKysgYi9zaGVsbF91dGlscy5zaApAQCAtNDAsMTUgKzQwLDI0IEBACiAgICAgZmkKIH0KIAotIyBTZXRzIFRPUCwgb3IgaWYgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgY2FuJ3QgYmUgZm91bmQsIHByaW50cyBhIG1lc3NhZ2UgYW5kCi0jIGV4aXRzLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBleGl0cywgaXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBmdW5jdGlvbnMKLSMgZGVmaW5lZCBpbiBlbnZzZXR1cC5zaC4KKyMgQXNzZXJ0cyB0aGF0IHRoZSByb290IG9mIHRoZSB0cmVlIGNhbiBiZSBmb3VuZC4KIGlmIFsgLXogIiR7SU1QT1JUSU5HX0VOVlNFVFVQOi19IiBdIDsgdGhlbgogZnVuY3Rpb24gcmVxdWlyZV90b3AKIHsKICAgICBUT1A9JChnZXR0b3ApCiAgICAgaWYgW1sgISAkVE9QIF1dIDsgdGhlbgotICAgICAgICBlY2hvICJDYW4gbm90IGxvY2F0ZSByb290IG9mIHNvdXJjZSB0cmVlLiAkKGJhc2VuYW1lICQwKSBtdXN0IGJlIHJ1biBmcm9tIHdpdGhpbiB0aGUgQW5kcm9pZCBzb3VyY2UgdHJlZS4iID4mMgorICAgICAgICBlY2hvICJDYW4gbm90IGxvY2F0ZSByb290IG9mIHNvdXJjZSB0cmVlLiAkKGJhc2VuYW1lICQwKSBtdXN0IGJlIHJ1biBmcm9tIHdpdGhpbiB0aGUgQW5kcm9pZCBzb3VyY2UgdHJlZSBvciBUT1AgbXVzdCBiZSBzZXQuIiA+JjIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKK30KK2ZpCisKKyMgQXNzZXJ0cyB0aGF0IHRoZSBsdW5jaCB2YXJpYWJsZXMgaGF2ZSBiZWVuIHNldAoraWYgWyAteiAiJHtJTVBPUlRJTkdfRU5WU0VUVVA6LX0iIF0gOyB0aGVuCitmdW5jdGlvbiByZXF1aXJlX2x1bmNoCit7CisgICAgaWYgW1sgISAkVEFSR0VUX1BST0RVQ1QgfHwgISAkVEFSR0VUX1JFTEVBU0UgfHwgISAkVEFSR0VUX0JVSUxEX1ZBUklBTlQgIF1dIDsgdGhlbgorICAgICAgICBlY2hvICJQbGVhc2UgcnVuIGx1bmNoIGFuZCB0cnkgYWdhaW4uIiA+JjIKICAgICAgICAgZXhpdCAxCiAgICAgZmkKIH0KQEAgLTcxLDQgKzgwLDczIEBACiAgICAgZWNobyAiJHtvdXRfZGlyfSIKIH0KIAorIyBQcmV0dHkgcHJpbnQgdGhlIGJ1aWxkIHN0YXR1cyBhbmQgZHVyYXRpb24KK2Z1bmN0aW9uIF93cmFwX2J1aWxkKCkKK3sKKyAgICBpZiBbWyAiJHtBTkRST0lEX1FVSUVUX0JVSUxEOi19IiA9PSB0cnVlIF1dOyB0aGVuCisgICAgICAiJEAiCisgICAgICByZXR1cm4gJD8KKyAgICBmaQorICAgIGxvY2FsIHN0YXJ0X3RpbWU9JChkYXRlICsiJXMiKQorICAgICIkQCIKKyAgICBsb2NhbCByZXQ9JD8KKyAgICBsb2NhbCBlbmRfdGltZT0kKGRhdGUgKyIlcyIpCisgICAgbG9jYWwgdGRpZmY9JCgoJGVuZF90aW1lLSRzdGFydF90aW1lKSkKKyAgICBsb2NhbCBob3Vycz0kKCgkdGRpZmYgLyAzNjAwICkpCisgICAgbG9jYWwgbWlucz0kKCgoJHRkaWZmICUgMzYwMCkgLyA2MCkpCisgICAgbG9jYWwgc2Vjcz0kKCgkdGRpZmYgJSA2MCkpCisgICAgbG9jYWwgbmNvbG9ycz0kKHRwdXQgY29sb3JzIDI+L2Rldi9udWxsKQorICAgIGlmIFsgLW4gIiRuY29sb3JzIiBdICYmIFsgJG5jb2xvcnMgLWdlIDggXTsgdGhlbgorICAgICAgICBjb2xvcl9mYWlsZWQ9JCdcRSciWzA7MzFtIgorICAgICAgICBjb2xvcl9zdWNjZXNzPSQnXEUnIlswOzMybSIKKyAgICAgICAgY29sb3Jfd2FybmluZz0kJ1xFJyJbMDszM20iCisgICAgICAgIGNvbG9yX3Jlc2V0PSQnXEUnIlswMG0iCisgICAgZWxzZQorICAgICAgICBjb2xvcl9mYWlsZWQ9IiIKKyAgICAgICAgY29sb3Jfc3VjY2Vzcz0iIgorICAgICAgICBjb2xvcl9yZXNldD0iIgorICAgIGZpCisKKyAgICBlY2hvCisgICAgaWYgWyAkcmV0IC1lcSAwIF0gOyB0aGVuCisgICAgICAgIGVjaG8gLW4gIiR7Y29sb3Jfc3VjY2Vzc30jIyMjIGJ1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgIgorICAgIGVsc2UKKyAgICAgICAgZWNobyAtbiAiJHtjb2xvcl9mYWlsZWR9IyMjIyBmYWlsZWQgdG8gYnVpbGQgc29tZSB0YXJnZXRzICIKKyAgICBmaQorICAgIGlmIFsgJGhvdXJzIC1ndCAwIF0gOyB0aGVuCisgICAgICAgIHByaW50ZiAiKCUwMmc6JTAyZzolMDJnIChoaDptbTpzcykpIiAkaG91cnMgJG1pbnMgJHNlY3MKKyAgICBlbGlmIFsgJG1pbnMgLWd0IDAgXSA7IHRoZW4KKyAgICAgICAgcHJpbnRmICIoJTAyZzolMDJnIChtbTpzcykpIiAkbWlucyAkc2VjcworICAgIGVsaWYgWyAkc2VjcyAtZ3QgMCBdIDsgdGhlbgorICAgICAgICBwcmludGYgIiglcyBzZWNvbmRzKSIgJHNlY3MKKyAgICBmaQorICAgIGVjaG8gIiAjIyMjJHtjb2xvcl9yZXNldH0iCisgICAgZWNobworICAgIHJldHVybiAkcmV0Cit9CisKKworZnVuY3Rpb24gbG9nX3Rvb2xfaW52b2NhdGlvbigpCit7CisgICAgaWYgW1sgLXogJEFORFJPSURfVE9PTF9MT0dHRVIgXV07IHRoZW4KKyAgICAgICAgcmV0dXJuCisgICAgZmkKKworICAgIExPR19UT09MX1RBRz0kMQorICAgIExPR19TVEFSVF9USU1FPSQoZGF0ZSArJXMuJU4pCisgICAgdHJhcCAnCisgICAgICAgIGV4aXRfY29kZT0kPzsKKyAgICAgICAgIyBSZW1vdmUgdGhlIHRyYXAgdG8gcHJldmVudCBkdXBsaWNhdGUgbG9nLgorICAgICAgICB0cmFwIC0gRVhJVDsKKyAgICAgICAgJEFORFJPSURfVE9PTF9MT0dHRVIgXAorICAgICAgICAgICAgICAgIC0tdG9vbF90YWc9IiR7TE9HX1RPT0xfVEFHfSIgXAorICAgICAgICAgICAgICAgIC0tc3RhcnRfdGltZXN0YW1wPSIke0xPR19TVEFSVF9USU1FfSIgXAorICAgICAgICAgICAgICAgIC0tZW5kX3RpbWVzdGFtcD0iJChkYXRlICslcy4lTikiIFwKKyAgICAgICAgICAgICAgICAtLXRvb2xfYXJncz0iJCoiIFwKKyAgICAgICAgICAgICAgICAtLWV4aXRfY29kZT0iJHtleGl0X2NvZGV9IiBcCisgICAgICAgICAgICAgICAgJHtBTkRST0lEX1RPT0xfTE9HR0VSX0VYVFJBX0FSR1N9IFwKKyAgICAgICAgICAgPiAvZGV2L251bGwgMj4mMSAmCisgICAgICAgIGV4aXQgJHtleGl0X2NvZGV9CisgICAgJyBTSUdJTlQgU0lHVEVSTSBTSUdRVUlUIEVYSVQKK30KIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL0FuZHJvaWQubWsgYi90YXJnZXQvYm9hcmQvQW5kcm9pZC5tawppbmRleCAyMWMwYzEwLi5kZWNjMzQ1IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvQW5kcm9pZC5taworKysgYi90YXJnZXQvYm9hcmQvQW5kcm9pZC5tawpAQCAtMTAsMTUgKzEwLDI5IEBACiAjIGRldmljZSB3ZSdyZSBidWlsZGluZyBmb3IuICBUaGlzIGZpbGUgaXMgdHlwaWNhbGx5IHBhY2thZ2VkIHVwCiAjIHdpdGggZXZlcnl0aGluZyBlbHNlLgogIwotIyBJZiBUQVJHRVRfQk9BUkRfSU5GT19GSUxFICh3aGljaCBjYW4gYmUgc2V0IGluIEJvYXJkQ29uZmlnLm1rKSBpcwotIyBkZWZpbmVkLCBpdCBpcyB1c2VkLCBvdGhlcndpc2UgYm9hcmQtaW5mby50eHQgaXMgbG9va2VkIGZvciBpbgotIyAkKFRBUkdFVF9ERVZJQ0VfRElSKS4KKyMgVGhlIGZvbGxvd2luZyBsb2dpYyBpcyB1c2VkIHRvIGZpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbmZvIGZpbGU6CisjICAgMS4gVEFSR0VUX0JPQVJEX0lORk9fRklMRVMgKGNhbiBiZSBzZXQgaW4gQm9hcmRDb25maWcubWspIHdpbGwgYmUgY29tYmluZWQuCisjICAgMi4gVEFSR0VUX0JPQVJEX0lORk9fRklMRSAoY2FuIGJlIHNldCBpbiBCb2FyZENvbmZpZy5taykgd2lsbCBiZSB1c2VkLgorIyAgIDMuICQoVEFSR0VUX0RFVklDRV9ESVIpL2JvYXJkLWluZm8udHh0IHdpbGwgYmUgdXNlZCBpZiBwcmVzZW50LgorIworIyBTcGVjaWZ5aW5nIGJvdGggVEFSR0VUX0JPQVJEX0lORk9fRklMRVMgYW5kIFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEUgaXMgYW4KKyMgZXJyb3IuCiAjCiBJTlNUQUxMRURfQU5EUk9JRF9JTkZPX1RYVF9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvYW5kcm9pZC1pbmZvLnR4dAotYm9hcmRfaW5mb190eHQgOj0gJChUQVJHRVRfQk9BUkRfSU5GT19GSUxFKQotaWZuZGVmIGJvYXJkX2luZm9fdHh0Ci1ib2FyZF9pbmZvX3R4dCA6PSAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL2JvYXJkLWluZm8udHh0KQoraWZkZWYgVEFSR0VUX0JPQVJEX0lORk9fRklMRVMKKyAgaWZkZWYgVEFSR0VUX0JPQVJEX0lORk9fRklMRQorICAgICQod2FybmluZyBCb3RoIFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEVTIGFuZCBUQVJHRVRfQk9BUkRfSU5GT19GSUxFIGFyZSBkZWZpbmVkLikKKyAgICAkKHdhcm5pbmcgVXNpbmcgJChUQVJHRVRfQk9BUkRfSU5GT19GSUxFUykgcmF0aGVyIHRoYW4gJChUQVJHRVRfQk9BUkRfSU5GT19GSUxFKSBmb3IgYW5kcm9pZC1pbmZvLnR4dCkKKyAgZW5kaWYKKyAgYm9hcmRfaW5mb190eHQgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsYm9hcmQtaW5mbykvYm9hcmQtaW5mby50eHQKKyQoYm9hcmRfaW5mb190eHQpOiAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEVTKQorCSQoaGlkZSkgY2F0ICQoVEFSR0VUX0JPQVJEX0lORk9fRklMRVMpID4gJEAKK2Vsc2UgaWZkZWYgVEFSR0VUX0JPQVJEX0lORk9fRklMRQorICBib2FyZF9pbmZvX3R4dCA6PSAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEUpCitlbHNlCisgIGJvYXJkX2luZm9fdHh0IDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvYm9hcmQtaW5mby50eHQpCiBlbmRpZgorCiBDSEVDS19SQURJT19WRVJTSU9OUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jaGVja19yYWRpb192ZXJzaW9ucyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKICQoSU5TVEFMTEVEX0FORFJPSURfSU5GT19UWFRfVEFSR0VUKTogJChib2FyZF9pbmZvX3R4dCkgJChDSEVDS19SQURJT19WRVJTSU9OUykKIAkkKGhpZGUpICQoQ0hFQ0tfUkFESU9fVkVSU0lPTlMpIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tayBiL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkMDhmMC4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdFbXVDb21tb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIEJvYXJkQ29uZmlnRW11Q29tbW9uLm1rCi0jCi0jIENvbW1vbiBjb21waWxlLXRpbWUgZGVmaW5pdGlvbnMgZm9yIGVtdWxhdG9yCi0jCi0KLUhBVkVfSFRDX0FVRElPX0RSSVZFUiA6PSB0cnVlCi1CT0FSRF9VU0VTX0dFTkVSSUNfQVVESU8gOj0gdHJ1ZQotVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSA6PSBnb2xkZmlzaF8kKFRBUkdFVF9BUkNIKQotCi0jIE5vIEtlcm5lbAotVEFSR0VUX05PX0tFUk5FTCA6PSB0cnVlCi0KLSMgbm8gaGFyZHdhcmUgY2FtZXJhCi1VU0VfQ0FNRVJBX1NUVUIgOj0gdHJ1ZQotCi1OVU1fRlJBTUVCVUZGRVJfU1VSRkFDRV9CVUZGRVJTIDo9IDMKLQotIyBCdWlsZCBPcGVuR0xFUyBlbXVsYXRpb24gZ3Vlc3QgYW5kIGhvc3QgbGlicmFyaWVzCi1CVUlMRF9FTVVMQVRPUl9PUEVOR0wgOj0gdHJ1ZQotQlVJTERfUUVNVV9JTUFHRVMgOj0gdHJ1ZQotCi0jIEJ1aWxkIGFuZCBlbmFibGUgdGhlIE9wZW5HTCBFUyBWaWV3IHJlbmRlcmVyLiBXaGVuIHJ1bm5pbmcgb24gdGhlIGVtdWxhdG9yLAotIyB0aGUgR0xFUyByZW5kZXJlciBkaXNhYmxlcyBpdHNlbGYgaWYgaG9zdCBHTCBhY2NlbGVyYXRpb24gaXNuJ3QgYXZhaWxhYmxlLgotVVNFX09QRU5HTF9SRU5ERVJFUiA6PSB0cnVlCi0KLSMgRW11bGF0b3IgZG9lc24ndCBzdXBwb3J0IHNwYXJzZSBpbWFnZSBmb3JtYXQuCi1UQVJHRVRfVVNFUklNQUdFU19TUEFSU0VfRVhUX0RJU0FCTEVEIDo9IHRydWUKLQotIyBlbXVsYXRvciBpcyBOb24tQS9CIGRldmljZQotQUJfT1RBX1VQREFURVIgOj0gZmFsc2UKLQotIyBlbXVsYXRvciBuZWVkcyBzdXBlci5pbWcKLUJPQVJEX0JVSUxEX1NVUEVSX0lNQUdFX0JZX0RFRkFVTFQgOj0gdHJ1ZQotCi0jIDhHICsgOE0KLUJPQVJEX1NVUEVSX1BBUlRJVElPTl9TSVpFID89IDg1OTgzMjMyMDAKLUJPQVJEX1NVUEVSX1BBUlRJVElPTl9HUk9VUFMgOj0gZW11bGF0b3JfZHluYW1pY19wYXJ0aXRpb25zCi0KLUJPQVJEX0VNVUxBVE9SX0RZTkFNSUNfUEFSVElUSU9OU19QQVJUSVRJT05fTElTVCA6PSBcCi0gIHN5c3RlbSBcCi0gIHN5c3RlbV9kbGttIFwKLSAgc3lzdGVtX2V4dCBcCi0gIHByb2R1Y3QgXAotICB2ZW5kb3IKLQotVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QgOj0gcHJvZHVjdAotQk9BUkRfUFJPRFVDVElNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAotVEFSR0VUX0NPUFlfT1VUX1NZU1RFTV9FWFQgOj0gc3lzdGVtX2V4dAotQk9BUkRfU1lTVEVNX0VYVElNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAotCi1CT0FSRF9VU0VTX1NZU1RFTV9ETEtNSU1BR0UgOj0gdHJ1ZQotQk9BUkRfU1lTVEVNX0RMS01JTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGVyb2ZzCi1UQVJHRVRfQ09QWV9PVVRfU1lTVEVNX0RMS00gOj0gc3lzdGVtX2Rsa20KLQotIyA4RwotQk9BUkRfRU1VTEFUT1JfRFlOQU1JQ19QQVJUSVRJT05TX1NJWkUgPz0gODU4OTkzNDU5MgotCi0jdmVuZG9yIGJvb3QKLUJPQVJEX0lOQ0xVREVfRFRCX0lOX0JPT1RJTUcgOj0gZmFsc2UKLUJPQVJEX0JPT1RfSEVBREVSX1ZFUlNJT04gOj0gNAotQk9BUkRfTUtCT09USU1HX0FSR1MgKz0gLS1oZWFkZXJfdmVyc2lvbiAkKEJPQVJEX0JPT1RfSEVBREVSX1ZFUlNJT04pCi1CT0FSRF9WRU5ET1JfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDB4MDYwMDAwMDAKLUJPQVJEX1JBTURJU0tfVVNFX0xaNCA6PSB0cnVlCi0KLSMgRW5hYmxlIGNoYWluIHBhcnRpdGlvbiBmb3Igc3lzdGVtLgotQk9BUkRfQVZCX1NZU1RFTV9LRVlfUEFUSCA6PSBleHRlcm5hbC9hdmIvdGVzdC9kYXRhL3Rlc3RrZXlfcnNhMjA0OC5wZW0KLUJPQVJEX0FWQl9TWVNURU1fQUxHT1JJVEhNIDo9IFNIQTI1Nl9SU0EyMDQ4Ci1CT0FSRF9BVkJfU1lTVEVNX1JPTExCQUNLX0lOREVYIDo9ICQoUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0hfVElNRVNUQU1QKQotQk9BUkRfQVZCX1NZU1RFTV9ST0xMQkFDS19JTkRFWF9MT0NBVElPTiA6PSAxCi0KLUJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAotQk9BUkRfRkxBU0hfQkxPQ0tfU0laRSA6PSA1MTIKLQotQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS9jb21tb24KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0dzaUNvbW1vbi5tayBiL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0dzaUNvbW1vbi5tawppbmRleCA0ZDk1YjMzLi42N2UzMWRmIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdHc2lDb21tb24ubWsKKysrIGIvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnR3NpQ29tbW9uLm1rCkBAIC0zNiw2ICszNiw3IEBACiBUQVJHRVRfQ09QWV9PVVRfUFJPRFVDVCA6PSBzeXN0ZW0vcHJvZHVjdAogVEFSR0VUX0NPUFlfT1VUX1NZU1RFTV9FWFQgOj0gc3lzdGVtL3N5c3RlbV9leHQKIEJPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9CitCT0FSRF9TWVNURU1fRVhUSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PQogCiAjIENyZWF0ZXMgbWV0YWRhdGEgcGFydGl0aW9uIG1vdW50IHBvaW50IHVuZGVyIHJvb3QgZm9yCiAjIHRoZSBkZXZpY2VzIHdpdGggbWV0YWRhdGEgcGFyaXRpb24KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01haW5saW5lQ29tbW9uLm1rIGIvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKaW5kZXggMDBmNmU1Yi4uYjVlM2RjMiAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKKysrIGIvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKQEAgLTIsNiArMiw5IEBACiAjCiAjIENvbW1vbiBjb21waWxlLXRpbWUgZGVmaW5pdGlvbnMgZm9yIG1haW5saW5lIGltYWdlcy4KIAorIyBFbnN1cmUgYWxsIHRydW5rLXN0YWJsZSBmbGFncyBhcmUgYXZhaWxhYmxlLgoraW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5taworCiAjIFRoZSBnZW5lcmljIHByb2R1Y3QgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSBhbnkgaGFyZHdhcmUtc3BlY2lmaWMgcGllY2VzLgogVEFSR0VUX05PX0JPT1RMT0FERVIgOj0gdHJ1ZQogVEFSR0VUX05PX1JFQ09WRVJZIDo9IHRydWUKQEAgLTE0LDE3ICsxNywxMyBAQAogVEFSR0VUX0NPUFlfT1VUX1NZU1RFTV9FWFQgOj0gc3lzdGVtX2V4dAogVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUiA6PSB2ZW5kb3IKIFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUIDo9IHByb2R1Y3QKK0JPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKK0JPQVJEX1NZU1RFTV9FWFRJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKIAogIyBDcmVhdGVzIG1ldGFkYXRhIHBhcnRpdGlvbiBtb3VudCBwb2ludCB1bmRlciByb290IGZvcgogIyB0aGUgZGV2aWNlcyB3aXRoIG1ldGFkYXRhIHBhcml0aW9uCiBCT0FSRF9VU0VTX01FVEFEQVRBX1BBUlRJVElPTiA6PSB0cnVlCiAKLSMgRGVmYXVsdCBpcyBjdXJyZW50LCBidXQgYWxsb3cgZGV2aWNlcyB0byBvdmVycmlkZSB2bmRrIHZlcnNpb24gaWYgbmVlZGVkLgotQk9BUkRfVk5ES19WRVJTSU9OID89IGN1cnJlbnQKLQotIyBSZXF1aXJlZCBmbGFnIGZvciBub24tNjQgYml0IGRldmljZXMgZnJvbSBQLgotVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiA6PSB0cnVlCi0KICMgNjQgYml0IG1lZGlhZHJtc2VydmVyCiBUQVJHRVRfRU5BQkxFX01FRElBRFJNXzY0IDo9IHRydWUKIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTW9kdWxlQ29tbW9uLm1rIGIvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTW9kdWxlQ29tbW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGMwMWE1Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01vZHVsZUNvbW1vbi5taworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBCb2FyZENvbmZpZ01vZHVsZUNvbW1vbi5tawotIwotIyBDb21tb24gY29tcGlsZS10aW1lIHNldHRpbmdzIGZvciBtb2R1bGUgYnVpbGRzLgotCi0jIFJlcXVpcmVkIGZvciBhbGwgbW9kdWxlIGRldmljZXMuCi1UQVJHRVRfVVNFU182NF9CSVRfQklOREVSIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm0vQW5kcm9pZEJvYXJkLm1rIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybS9BbmRyb2lkQm9hcmQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTFmNjEuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybS9BbmRyb2lkQm9hcmQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtL0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybS9Cb2FyZENvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3ODI0Zi4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtL0JvYXJkQ29uZmlnLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBhcm0gZW11bGF0b3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMKLVRBUkdFVF9BUkNIIDo9IGFybQotVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSBhcm12Ny1hLW5lb24KLVRBUkdFVF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCi1UQVJHRVRfQ1BVX0FCSSA6PSBhcm1lYWJpLXY3YQotVEFSR0VUX0NQVV9BQkkyIDo9IGFybWVhYmkKLQotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0dzaUNvbW1vbi5tawotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tawotCi1CT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDU3NjcxNjgwMAotCi0jIFdpZmkuCi1CT0FSRF9XTEFOX0RFVklDRSAgICAgICAgICAgOj0gZW11bGF0b3IKLUJPQVJEX0hPU1RBUERfRFJJVkVSICAgICAgICA6PSBOTDgwMjExCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgOj0gTkw4MDIxMQotQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQiAgIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1XUEFfU1VQUExJQ0FOVF9WRVJTSU9OICAgICAgOj0gVkVSXzBfOF9YCi1XSUZJX0RSSVZFUl9GV19QQVRIX1BBUkFNICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfU1RBICAgICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9BUCAgICAgIDo9ICIvZGV2L251bGwiCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtL2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm0vZGV2aWNlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjAyM2ViLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm0vZGV2aWNlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotUFJPRFVDVF9TT09OR19OQU1FU1BBQ0VTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoICMgZm9yIGxpYndpZmktaGFsLWVtdQotUFJPRFVDVF9TT09OR19OQU1FU1BBQ0VTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoLW9wZW5nbCAjIGZvciBnb2xkZmlzaCBkZXBzLgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybS9zeXN0ZW1fZXh0LnByb3AgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtL3N5c3RlbV9leHQucHJvcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4MjlmMy4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtL3N5c3RlbV9leHQucHJvcAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIwotIyBzeXN0ZW0ucHJvcCBmb3IgZ2VuZXJpYyBzZGsKLSMKLQotcmlsZC5saWJwYXRoPS92ZW5kb3IvbGliL2xpYnJlZmVyZW5jZS1yaWwuc28KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm02NC9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm02NC9Cb2FyZENvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYzZTU1OC4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtNjQvQm9hcmRDb25maWcubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIGFybTY0IGVtdWxhdG9yIHNwZWNpZmljIGRlZmluaXRpb25zCi1UQVJHRVRfQVJDSCA6PSBhcm02NAotVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCi1UQVJHRVRfQ1BVX1ZBUklBTlQgOj0gZ2VuZXJpYwotVEFSR0VUX0NQVV9BQkkgOj0gYXJtNjQtdjhhCi0KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9BUFBTKSQoZmlsdGVyIGN0cyBzZGssJChNQUtFQ01ER09BTFMpKSwpCi0jIERPIE5PVCBVU0UKLSMgRE8gTk9UIFVTRQotIwotIyBUaGlzIGFyY2hpdGVjdHVyZSAvIENQVSB2YXJpYW50IG11c3QgTk9UIGJlIHVzZWQgZm9yIGFueSA2NCBiaXQKLSMgcGxhdGZvcm0gYnVpbGRzLiBJdCBpcyB0aGUgbG93ZXN0IGNvbW1vbiBkZW5vbWluYXRvciByZXF1aXJlZAotIyB0byBidWlsZCBhbiB1bmJ1bmRsZWQgYXBwbGljYXRpb24gb3IgY3RzIGZvciBhbGwgc3VwcG9ydGVkIDMyIGFuZCA2NCBiaXQKLSMgcGxhdGZvcm1zLgotIwotIyBJZiB5b3UncmUgYnVpbGRpbmcgYSA2NCBiaXQgcGxhdGZvcm0gKGFuZCBub3QgYW4gYXBwbGljYXRpb24pIHRoZQotIyBBUk0tdjggc3BlY2lmaWNhdGlvbiBhbGxvd3MgeW91IHRvIGFzc3VtZSBhbGwgdGhlIGZlYXR1cmVzIGF2YWlsYWJsZSBpbiBhbgotIyBhcm12Ny1hLW5lb24gQ1BVLiBZb3Ugc2hvdWxkIHNldCB0aGUgZm9sbG93aW5nIGFzIDJuZCBhcmNoL2NwdSB2YXJpYW50OgotIwotIyBUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCi0jIFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQgOj0gZ2VuZXJpYwotIwotIyBETyBOT1QgVVNFCi0jIERPIE5PVCBVU0UKLVRBUkdFVF8yTkRfQVJDSF9WQVJJQU5UIDo9IGFybXY3LWEtbmVvbgotIyBETyBOT1QgVVNFCi0jIERPIE5PVCBVU0UKLVRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQgOj0gZ2VuZXJpYwotIyBETyBOT1QgVVNFCi0jIERPIE5PVCBVU0UKLWVsc2UKLVRBUkdFVF8yTkRfQVJDSF9WQVJJQU5UIDo9IGFybXY4LWEKLVRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQgOj0gZ2VuZXJpYwotZW5kaWYKLQotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0dzaUNvbW1vbi5tawotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tawotCi1UQVJHRVRfTk9fS0VSTkVMIDo9IGZhbHNlCi1CT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QgOj0gdHJ1ZQotCi1CT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMHgwMjAwMDAwMAotQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA1NzY3MTY4MDAKLQotIyBXaWZpLgotQk9BUkRfV0xBTl9ERVZJQ0UgICAgICAgICAgIDo9IGVtdWxhdG9yCi1CT0FSRF9IT1NUQVBEX0RSSVZFUiAgICAgICAgOj0gTkw4MDIxMQotQk9BUkRfV1BBX1NVUFBMSUNBTlRfRFJJVkVSIDo9IE5MODAyMTEKLUJPQVJEX0hPU1RBUERfUFJJVkFURV9MSUIgICA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLUJPQVJEX1dQQV9TVVBQTElDQU5UX1BSSVZBVEVfTElCIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiAgICAgIDo9IFZFUl8wXzhfWAotV0lGSV9EUklWRVJfRldfUEFUSF9QQVJBTSAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX1NUQSAgICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfQVAgICAgICA6PSAiL2Rldi9udWxsIgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybTY0L2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm02NC9kZXZpY2UubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjFlNjQuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybTY0L2RldmljZS5taworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCAjIGZvciBsaWJ3aWZpLWhhbC1lbXUKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC1vcGVuZ2wgIyBmb3IgZ29sZGZpc2ggZGVwcy4KLQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybTY0L3N5c3RlbV9leHQucHJvcCBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm02NC9zeXN0ZW1fZXh0LnByb3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOGY4MDMuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybTY0L3N5c3RlbV9leHQucHJvcAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIwotIyBzeXN0ZW0ucHJvcCBmb3IgZW11bGF0b3IgYXJtNjQgc2RrCi0jCi0KLXJpbGQubGlicGF0aD0vdmVuZG9yL2xpYjY0L2xpYnJlZmVyZW5jZS1yaWwuc28KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODYvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2L0JvYXJkQ29uZmlnLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjc5MTY2Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODYvQm9hcmRDb25maWcubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIHg4NiBlbXVsYXRvciBzcGVjaWZpYyBkZWZpbml0aW9ucwotVEFSR0VUX0NQVV9BQkkgOj0geDg2Ci1UQVJHRVRfQVJDSCA6PSB4ODYKLVRBUkdFVF9BUkNIX1ZBUklBTlQgOj0geDg2Ci0KLVRBUkdFVF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQotCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnR3NpQ29tbW9uLm1rCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnRW11Q29tbW9uLm1rCi0KLSMgUmVzaXplIHRvIDRHIHRvIGFjY29tbW9kYXRlIEFTQU4gYW5kIENUUwotQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA0Mjk0OTY3Mjk2Ci0KLUJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvc2Vwb2xpY3kveDg2Ci0KLSMgV2lmaS4KLUJPQVJEX1dMQU5fREVWSUNFICAgICAgICAgICA6PSBlbXVsYXRvcgotQk9BUkRfSE9TVEFQRF9EUklWRVIgICAgICAgIDo9IE5MODAyMTEKLUJPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUiA6PSBOTDgwMjExCi1CT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCICAgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQiA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLVdQQV9TVVBQTElDQU5UX1ZFUlNJT04gICAgICA6PSBWRVJfMF84X1gKLVdJRklfRFJJVkVSX0ZXX1BBVEhfUEFSQU0gICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9TVEEgICAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX0FQICAgICAgOj0gIi9kZXYvbnVsbCIKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODYvZGV2aWNlLm1rIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Ni9kZXZpY2UubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOWQ4ZGEuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Ni9kZXZpY2UubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2ggIyBmb3IgbGlid2lmaS1oYWwtZW11Ci1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gtb3BlbmdsICMgZm9yIGdvbGRmaXNoIGRlcHMuCi0KLWlmZGVmIE5FVF9FVEgwX1NUQVJUT05CT09UCi0gIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gbmV0LmV0aDAuc3RhcnRvbmJvb3Q9MQotZW5kaWYKLQotIyBFbnN1cmUgd2UgcGFja2FnZSB0aGUgQklPUyBmaWxlcyB0b28uCi1QUk9EVUNUX0hPU1RfUEFDS0FHRVMgKz0gXAotCWJpb3MuYmluIFwKLQl2Z2FiaW9zLWNpcnJ1cy5iaW4gXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Ni9zeXN0ZW1fZXh0LnByb3AgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2L3N5c3RlbV9leHQucHJvcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4MjlmMy4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2L3N5c3RlbV9leHQucHJvcAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIwotIyBzeXN0ZW0ucHJvcCBmb3IgZ2VuZXJpYyBzZGsKLSMKLQotcmlsZC5saWJwYXRoPS92ZW5kb3IvbGliL2xpYnJlZmVyZW5jZS1yaWwuc28KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjQvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0L0JvYXJkQ29uZmlnLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOWNiZDhhLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjQvQm9hcmRDb25maWcubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIHg4Nl82NCBlbXVsYXRvciBzcGVjaWZpYyBkZWZpbml0aW9ucwotVEFSR0VUX0NQVV9BQkkgOj0geDg2XzY0Ci1UQVJHRVRfQVJDSCA6PSB4ODZfNjQKLVRBUkdFVF9BUkNIX1ZBUklBTlQgOj0geDg2XzY0Ci0KLVRBUkdFVF8yTkRfQ1BVX0FCSSA6PSB4ODYKLVRBUkdFVF8yTkRfQVJDSCA6PSB4ODYKLVRBUkdFVF8yTkRfQVJDSF9WQVJJQU5UIDo9IHg4Nl82NAotCi1UQVJHRVRfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdHc2lDb21tb24ubWsKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdFbXVDb21tb24ubWsKLQotQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA1NzY3MTY4MDAKLQotQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS94ODYKLQotIyBXaWZpLgotQk9BUkRfV0xBTl9ERVZJQ0UgICAgICAgICAgIDo9IGVtdWxhdG9yCi1CT0FSRF9IT1NUQVBEX0RSSVZFUiAgICAgICAgOj0gTkw4MDIxMQotQk9BUkRfV1BBX1NVUFBMSUNBTlRfRFJJVkVSIDo9IE5MODAyMTEKLUJPQVJEX0hPU1RBUERfUFJJVkFURV9MSUIgICA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLUJPQVJEX1dQQV9TVVBQTElDQU5UX1BSSVZBVEVfTElCIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiAgICAgIDo9IFZFUl8wXzhfWAotV0lGSV9EUklWRVJfRldfUEFUSF9QQVJBTSAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX1NUQSAgICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfQVAgICAgICA6PSAiL2Rldi9udWxsIgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NC9kZXZpY2UubWsgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0L2RldmljZS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE5ZDhkYS4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0L2RldmljZS5taworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCAjIGZvciBsaWJ3aWZpLWhhbC1lbXUKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC1vcGVuZ2wgIyBmb3IgZ29sZGZpc2ggZGVwcy4KLQotaWZkZWYgTkVUX0VUSDBfU1RBUlRPTkJPT1QKLSAgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSBuZXQuZXRoMC5zdGFydG9uYm9vdD0xCi1lbmRpZgotCi0jIEVuc3VyZSB3ZSBwYWNrYWdlIHRoZSBCSU9TIGZpbGVzIHRvby4KLVBST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCi0JYmlvcy5iaW4gXAotCXZnYWJpb3MtY2lycnVzLmJpbiBcCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0L3N5c3RlbV9leHQucHJvcCBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjQvc3lzdGVtX2V4dC5wcm9wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDlkMTczLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjQvc3lzdGVtX2V4dC5wcm9wCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jCi0jIHN5c3RlbS5wcm9wIGZvciBnZW5lcmljIHNkawotIwotCi1yaWxkLmxpYnBhdGg9L3ZlbmRvci9saWI2NC9saWJyZWZlcmVuY2UtcmlsLnNvCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0X2FybTY0L0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NF9hcm02NC9Cb2FyZENvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZiNjFhNi4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0X2FybTY0L0JvYXJkQ29uZmlnLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyB4ODZfNjQgZW11bGF0b3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMKLVRBUkdFVF9DUFVfQUJJIDo9IHg4Nl82NAotVEFSR0VUX0FSQ0ggOj0geDg2XzY0Ci1UQVJHRVRfQVJDSF9WQVJJQU5UIDo9IHg4Nl82NAotCi1UQVJHRVRfMk5EX0NQVV9BQkkgOj0geDg2Ci1UQVJHRVRfMk5EX0FSQ0ggOj0geDg2Ci1UQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSB4ODZfNjQKLQotVEFSR0VUX05BVElWRV9CUklER0VfQVJDSCA6PSBhcm02NAotVEFSR0VUX05BVElWRV9CUklER0VfQVJDSF9WQVJJQU5UIDo9IGFybXY4LWEKLVRBUkdFVF9OQVRJVkVfQlJJREdFX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKLVRBUkdFVF9OQVRJVkVfQlJJREdFX0FCSSA6PSBhcm02NC12OGEKLQotVEFSR0VUX05BVElWRV9CUklER0VfMk5EX0FSQ0ggOj0gYXJtCi1UQVJHRVRfTkFUSVZFX0JSSURHRV8yTkRfQVJDSF9WQVJJQU5UIDo9IGFybXY3LWEtbmVvbgotVEFSR0VUX05BVElWRV9CUklER0VfMk5EX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKLVRBUkdFVF9OQVRJVkVfQlJJREdFXzJORF9BQkkgOj0gYXJtZWFiaS12N2EgYXJtZWFiaQotCi1CVUlMRF9CUk9LRU5fRFVQX1JVTEVTIDo9IHRydWUKLQotVEFSR0VUX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi0KLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdNYWlubGluZUNvbW1vbi5tawotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tawotCi0jIHRoZSBzZXR0aW5ncyBkaWZmZXIgZnJvbSBCb2FyZENvbmZpZ01haW5saW5lQ29tbW9uLm1rCi1CT0FSRF9VU0VTX1NZU1RFTV9PVEhFUl9PREVYIDo9Ci0KLSMgUmVzaXplIHRvIDRHIHRvIGFjY29tbW9kYXRlIEFTQU4gYW5kIENUUwotQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA0Mjk0OTY3Mjk2Ci0KLUJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvc2Vwb2xpY3kveDg2Ci0KLSMgV2lmaS4KLUJPQVJEX1dMQU5fREVWSUNFICAgICAgICAgICA6PSBlbXVsYXRvcgotQk9BUkRfSE9TVEFQRF9EUklWRVIgICAgICAgIDo9IE5MODAyMTEKLUJPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUiA6PSBOTDgwMjExCi1CT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCICAgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQiA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLVdQQV9TVVBQTElDQU5UX1ZFUlNJT04gICAgICA6PSBWRVJfMF84X1gKLVdJRklfRFJJVkVSX0ZXX1BBVEhfUEFSQU0gICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9TVEEgICAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX0FQICAgICAgOj0gIi9kZXYvbnVsbCIKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjRfYXJtNjQvZGV2aWNlLm1rIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NF9hcm02NC9kZXZpY2UubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmMDIzZWIuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NF9hcm02NC9kZXZpY2UubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2ggIyBmb3IgbGlid2lmaS1oYWwtZW11Ci1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gtb3BlbmdsICMgZm9yIGdvbGRmaXNoIGRlcHMuCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0X2FybTY0L3N5c3RlbV9leHQucHJvcCBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjRfYXJtNjQvc3lzdGVtX2V4dC5wcm9wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDlkMTczLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjRfYXJtNjQvc3lzdGVtX2V4dC5wcm9wCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jCi0jIHN5c3RlbS5wcm9wIGZvciBnZW5lcmljIHNkawotIwotCi1yaWxkLmxpYnBhdGg9L3ZlbmRvci9saWI2NC9saWJyZWZlcmVuY2UtcmlsLnNvCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2X2FybS9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfYXJtL0JvYXJkQ29uZmlnLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWZkYmM4Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfYXJtL0JvYXJkQ29uZmlnLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyB4ODYgZW11bGF0b3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMKLVRBUkdFVF9DUFVfQUJJIDo9IHg4NgotVEFSR0VUX0FSQ0ggOj0geDg2Ci1UQVJHRVRfQVJDSF9WQVJJQU5UIDo9IHg4NgotCi1UQVJHRVRfTkFUSVZFX0JSSURHRV9BUkNIIDo9IGFybQotVEFSR0VUX05BVElWRV9CUklER0VfQVJDSF9WQVJJQU5UIDo9IGFybXY3LWEtbmVvbgotVEFSR0VUX05BVElWRV9CUklER0VfQ1BVX1ZBUklBTlQgOj0gZ2VuZXJpYwotVEFSR0VUX05BVElWRV9CUklER0VfQUJJIDo9IGFybWVhYmktdjdhIGFybWVhYmkKLQotQlVJTERfQlJPS0VOX0RVUF9SVUxFUyA6PSB0cnVlCi0KLSMKLSMgVGhlIGluY2x1c2lvbiBvcmRlciBiZWxvdyBpcyBpbXBvcnRhbnQuCi0jIFRoZSBzZXR0aW5ncyBpbiBsYXR0ZXIgbWFrZWZpbGVzIG92ZXJ3cml0ZSB0aG9zZSBpbiB0aGUgZm9ybWVyLgotIwotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01haW5saW5lQ29tbW9uLm1rCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnRW11Q29tbW9uLm1rCi0KLSMgdGhlIHNldHRpbmdzIGRpZmZlciBmcm9tIEJvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKLUJPQVJEX1VTRVNfU1lTVEVNX09USEVSX09ERVggOj0KLQotIyBSZXNpemUgdG8gNEcgdG8gYWNjb21tb2RhdGUgQVNBTiBhbmQgQ1RTCi1CT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDQyOTQ5NjcyOTYKLQotQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS94ODYKLQotIyBXaWZpLgotQk9BUkRfV0xBTl9ERVZJQ0UgICAgICAgICAgIDo9IGVtdWxhdG9yCi1CT0FSRF9IT1NUQVBEX0RSSVZFUiAgICAgICAgOj0gTkw4MDIxMQotQk9BUkRfV1BBX1NVUFBMSUNBTlRfRFJJVkVSIDo9IE5MODAyMTEKLUJPQVJEX0hPU1RBUERfUFJJVkFURV9MSUIgICA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLUJPQVJEX1dQQV9TVVBQTElDQU5UX1BSSVZBVEVfTElCIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiAgICAgIDo9IFZFUl8wXzhfWAotV0lGSV9EUklWRVJfRldfUEFUSF9QQVJBTSAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX1NUQSAgICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfQVAgICAgICA6PSAiL2Rldi9udWxsIgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl9hcm0vZGV2aWNlLm1rIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl9hcm0vZGV2aWNlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjAyM2ViLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfYXJtL2RldmljZS5taworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCAjIGZvciBsaWJ3aWZpLWhhbC1lbXUKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC1vcGVuZ2wgIyBmb3IgZ29sZGZpc2ggZGVwcy4KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfYXJtL3N5c3RlbV9leHQucHJvcCBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfYXJtL3N5c3RlbV9leHQucHJvcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4MjlmMy4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2X2FybS9zeXN0ZW1fZXh0LnByb3AKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMKLSMgc3lzdGVtLnByb3AgZm9yIGdlbmVyaWMgc2RrCi0jCi0KLXJpbGQubGlicGF0aD0vdmVuZG9yL2xpYi9saWJyZWZlcmVuY2UtcmlsLnNvCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljL0JvYXJkQ29uZmlnLm1rCmluZGV4IDg3YzE2ZGEuLjY3MjBkZGIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljL0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljL0JvYXJkQ29uZmlnLm1rCkBAIC0zMCwyMCArMzAsMyBAQAogVEFSR0VUX0NQVV9BQkkyIDo9IGFybWVhYmkKIAogaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0dzaUNvbW1vbi5tawotCi1pZm5kZWYgQlVJTERJTkdfR1NJCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnRW11Q29tbW9uLm1rCi0KLUJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNTc2NzE2ODAwCi0KLSMgV2lmaS4KLUJPQVJEX1dMQU5fREVWSUNFICAgICAgICAgICA6PSBlbXVsYXRvcgotQk9BUkRfSE9TVEFQRF9EUklWRVIgICAgICAgIDo9IE5MODAyMTEKLUJPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUiA6PSBOTDgwMjExCi1CT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCICAgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQiA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLVdQQV9TVVBQTElDQU5UX1ZFUlNJT04gICAgICA6PSBWRVJfMF84X1gKLVdJRklfRFJJVkVSX0ZXX1BBVEhfUEFSQU0gICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9TVEEgICAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX0FQICAgICAgOj0gIi9kZXYvbnVsbCIKLWVuZGlmCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9kZXZpY2UubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9kZXZpY2UubWsKaW5kZXggNzYyNDJjOS4uNzZlZGY2YiAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvZGV2aWNlLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljL2RldmljZS5tawpAQCAtMTQsNSArMTQsMyBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotUFJPRFVDVF9TT09OR19OQU1FU1BBQ0VTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoICMgZm9yIGxpYndpZmktaGFsLWVtdQotUFJPRFVDVF9TT09OR19OQU1FU1BBQ0VTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoLW9wZW5nbCAjIGZvciBnb2xkZmlzaCBkZXBzLgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfNjRiaXRvbmx5X3g4Nl82NC9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljXzY0Yml0b25seV94ODZfNjQvQm9hcmRDb25maWcubWsKaW5kZXggYTI0MGVhYi4uYTEyOWVhMCAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfNjRiaXRvbmx5X3g4Nl82NC9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY182NGJpdG9ubHlfeDg2XzY0L0JvYXJkQ29uZmlnLm1rCkBAIC0yOCwyMyArMjgsMyBAQAogVEFSR0VUX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCiAKIGluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdHc2lDb21tb24ubWsKLQotaWZuZGVmIEJVSUxESU5HX0dTSQotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tawotCi1CT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDU3NjcxNjgwMAotCi1CT0FSRF9TRVBPTElDWV9ESVJTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3NlcG9saWN5L3g4NgotCi0jIFdpZmkuCi1CT0FSRF9XTEFOX0RFVklDRSAgICAgICAgICAgOj0gZW11bGF0b3IKLUJPQVJEX0hPU1RBUERfRFJJVkVSICAgICAgICA6PSBOTDgwMjExCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgOj0gTkw4MDIxMQotQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQiAgIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1XUEFfU1VQUExJQ0FOVF9WRVJTSU9OICAgICAgOj0gVkVSXzBfOF9YCi1XSUZJX0RSSVZFUl9GV19QQVRIX1BBUkFNICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfU1RBICAgICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9BUCAgICAgIDo9ICIvZGV2L251bGwiCi0KLWVuZGlmICMgIUJVSUxESU5HX0dTSQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L0JvYXJkQ29uZmlnLm1rCmluZGV4IDQ3ZmQzODQuLjI2YmVkZTggMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvQm9hcmRDb25maWcubWsKQEAgLTE5LDIzICsxOSwzIEBACiBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IHg4NgogCiBpbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnR3NpQ29tbW9uLm1rCi0KLWlmbmRlZiBCVUlMRElOR19HU0kKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdFbXVDb21tb24ubWsKLQotIyBSZXNpemUgdG8gNEcgdG8gYWNjb21vZGF0ZSBBU0FOIGFuZCBDVFMKLUJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNDI5NDk2NzI5NgotCi1CT0FSRF9TRVBPTElDWV9ESVJTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3NlcG9saWN5L3g4NgotCi0jIFdpZmkuCi1CT0FSRF9XTEFOX0RFVklDRSAgICAgICAgICAgOj0gZW11bGF0b3IKLUJPQVJEX0hPU1RBUERfRFJJVkVSICAgICAgICA6PSBOTDgwMjExCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgOj0gTkw4MDIxMQotQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQiAgIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1XUEFfU1VQUExJQ0FOVF9WRVJTSU9OICAgICAgOj0gVkVSXzBfOF9YCi1XSUZJX0RSSVZFUl9GV19QQVRIX1BBUkFNICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfU1RBICAgICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9BUCAgICAgIDo9ICIvZGV2L251bGwiCi1lbmRpZgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9kZXZpY2UubWsKaW5kZXggNWFkMDA4Zi4uNjBmMGNjMyAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L2RldmljZS5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvZGV2aWNlLm1rCkBAIC0xNCw5ICsxNCw2IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2ggIyBmb3IgbGlid2lmaS1oYWwtZW11Ci1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gtb3BlbmdsICMgZm9yIGdvbGRmaXNoIGRlcHMuCi0KIGlmZGVmIE5FVF9FVEgwX1NUQVJUT05CT09UCiAgIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gbmV0LmV0aDAuc3RhcnRvbmJvb3Q9MQogZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NC9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NC9Cb2FyZENvbmZpZy5tawpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDM2MTM2ZjQuLjY0ZGE1NzgKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0L0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NC9Cb2FyZENvbmZpZy5tawpAQCAtMjgsMjMgKzI4LDMgQEAKIFRBUkdFVF9EWU5BTUlDXzY0XzMyX0RSTVNFUlZFUiA6PSB0cnVlCiAKIGluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdHc2lDb21tb24ubWsKLQotaWZuZGVmIEJVSUxESU5HX0dTSQotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tawotCi1CT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDU3NjcxNjgwMAotCi1CT0FSRF9TRVBPTElDWV9ESVJTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3NlcG9saWN5L3g4NgotCi0jIFdpZmkuCi1CT0FSRF9XTEFOX0RFVklDRSAgICAgICAgICAgOj0gZW11bGF0b3IKLUJPQVJEX0hPU1RBUERfRFJJVkVSICAgICAgICA6PSBOTDgwMjExCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgOj0gTkw4MDIxMQotQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQiAgIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1XUEFfU1VQUExJQ0FOVF9WRVJTSU9OICAgICAgOj0gVkVSXzBfOF9YCi1XSUZJX0RSSVZFUl9GV19QQVRIX1BBUkFNICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfU1RBICAgICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9BUCAgICAgIDo9ICIvZGV2L251bGwiCi0KLWVuZGlmICMgIUJVSUxESU5HX0dTSQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0X2FybTY0L0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0X2FybTY0L0JvYXJkQ29uZmlnLm1rCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjUyODI5NC4uODE4ZWM0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjRfYXJtNjQvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0X2FybTY0L0JvYXJkQ29uZmlnLm1rCkBAIC0xMyw3ICsxMyw2IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIHg4Nl82NCBlbXVsYXRvciBzcGVjaWZpYyBkZWZpbml0aW9ucwogVEFSR0VUX0NQVV9BQkkgOj0geDg2XzY0CiBUQVJHRVRfQVJDSCA6PSB4ODZfNjQKIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0geDg2XzY0CkBAIC0zNywyMyArMzYsOSBAQAogVEFSR0VUX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCiAKIGluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdNYWlubGluZUNvbW1vbi5tawotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tawogCiAjIHRoZSBzZXR0aW5ncyBkaWZmZXIgZnJvbSBCb2FyZENvbmZpZ01haW5saW5lQ29tbW9uLm1rCiBCT0FSRF9VU0VTX1NZU1RFTV9PVEhFUl9PREVYIDo9CiAKICMgUmVzaXplIHRvIDRHIHRvIGFjY29tbW9kYXRlIEFTQU4gYW5kIENUUwogQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA0Mjk0OTY3Mjk2Ci0KLUJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvc2Vwb2xpY3kveDg2Ci0KLSMgV2lmaS4KLUJPQVJEX1dMQU5fREVWSUNFICAgICAgICAgICA6PSBlbXVsYXRvcgotQk9BUkRfSE9TVEFQRF9EUklWRVIgICAgICAgIDo9IE5MODAyMTEKLUJPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUiA6PSBOTDgwMjExCi1CT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCICAgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQiA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLVdQQV9TVVBQTElDQU5UX1ZFUlNJT04gICAgICA6PSBWRVJfMF84X1gKLVdJRklfRFJJVkVSX0ZXX1BBVEhfUEFSQU0gICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9TVEEgICAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX0FQICAgICAgOj0gIi9kZXYvbnVsbCIKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NF9hcm02NC9kZXZpY2UubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjRfYXJtNjQvZGV2aWNlLm1rCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNzYyNDJjOS4uNzZlZGY2YgotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjRfYXJtNjQvZGV2aWNlLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NF9hcm02NC9kZXZpY2UubWsKQEAgLTE0LDUgKzE0LDMgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCAjIGZvciBsaWJ3aWZpLWhhbC1lbXUKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC1vcGVuZ2wgIyBmb3IgZ29sZGZpc2ggZGVwcy4KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl9hcm0vQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfYXJtL0JvYXJkQ29uZmlnLm1rCmluZGV4IGY2NTg5YjAuLjYyYmI1ZWIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl9hcm0vQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2X2FybS9Cb2FyZENvbmZpZy5tawpAQCAtMTMsNyArMTMsNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyB4ODYgZW11bGF0b3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMKIFRBUkdFVF9DUFVfQUJJIDo9IHg4NgogVEFSR0VUX0FSQ0ggOj0geDg2CiBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IHg4NgpAQCAtMzAsMjMgKzI5LDkgQEAKICMgVGhlIHNldHRpbmdzIGluIGxhdHRlciBtYWtlZmlsZXMgb3ZlcndyaXRlIHRob3NlIGluIHRoZSBmb3JtZXIuCiAjCiBpbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdFbXVDb21tb24ubWsKIAogIyB0aGUgc2V0dGluZ3MgZGlmZmVyIGZyb20gQm9hcmRDb25maWdNYWlubGluZUNvbW1vbi5tawogQk9BUkRfVVNFU19TWVNURU1fT1RIRVJfT0RFWCA6PQogCiAjIFJlc2l6ZSB0byA0RyB0byBhY2NvbW9kYXRlIEFTQU4gYW5kIENUUwogQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA0Mjk0OTY3Mjk2Ci0KLUJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvc2Vwb2xpY3kveDg2Ci0KLSMgV2lmaS4KLUJPQVJEX1dMQU5fREVWSUNFICAgICAgICAgICA6PSBlbXVsYXRvcgotQk9BUkRfSE9TVEFQRF9EUklWRVIgICAgICAgIDo9IE5MODAyMTEKLUJPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUiA6PSBOTDgwMjExCi1CT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCICAgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQiA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLVdQQV9TVVBQTElDQU5UX1ZFUlNJT04gICAgICA6PSBWRVJfMF84X1gKLVdJRklfRFJJVkVSX0ZXX1BBVEhfUEFSQU0gICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9TVEEgICAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX0FQICAgICAgOj0gIi9kZXYvbnVsbCIKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl9hcm0vZGV2aWNlLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2X2FybS9kZXZpY2UubWsKaW5kZXggNzYyNDJjOS4uNzZlZGY2YiAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2X2FybS9kZXZpY2UubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2X2FybS9kZXZpY2UubWsKQEAgLTE0LDUgKzE0LDMgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCAjIGZvciBsaWJ3aWZpLWhhbC1lbXUKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC1vcGVuZ2wgIyBmb3IgZ29sZGZpc2ggZGVwcy4KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9tYWlubGluZV9zZGsvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvbWFpbmxpbmVfc2RrL0JvYXJkQ29uZmlnLm1rCmluZGV4IGY1YzJkYzYuLmU0YzZhOGMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9tYWlubGluZV9zZGsvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL21haW5saW5lX3Nkay9Cb2FyZENvbmZpZy5tawpAQCAtMTMsMTEgKzEzLDExIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCisjIEVuc3VyZSBhbGwgdHJ1bmstc3RhYmxlIGZsYWdzIGFyZSBhdmFpbGFibGUuCitpbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvYnVpbGRfdmFyaWFibGVzLm1rCisKIFRBUkdFVF9BUkNIX1NVSVRFIDo9IG1haW5saW5lX3NkawogCiBIT1NUX0NST1NTX09TIDo9IGxpbnV4X2Jpb25pYwogSE9TVF9DUk9TU19BUkNIIDo9IHg4Nl82NAogSE9TVF9DUk9TU18yTkRfQVJDSCA6PQotCi0jIFJlcXVpcmVkIGZsYWcgZm9yIG5vbi02NCBiaXQgZGV2aWNlcyBmcm9tIFAuCi1UQVJHRVRfVVNFU182NF9CSVRfQklOREVSIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9tb2R1bGVfYXJtL0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV9hcm0vQm9hcmRDb25maWcubWsKaW5kZXggM2YzNWMwNi4uNTY1ZWZjOCAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL21vZHVsZV9hcm0vQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV9hcm0vQm9hcmRDb25maWcubWsKQEAgLTEzLDggKzEzLDYgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdNb2R1bGVDb21tb24ubWsKLQogVEFSR0VUX0FSQ0ggOj0gYXJtCiBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IGFybXY3LWEtbmVvbgogVEFSR0VUX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9tb2R1bGVfYXJtNjQvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvbW9kdWxlX2FybTY0L0JvYXJkQ29uZmlnLm1rCmluZGV4IDM3MDAwNTYuLjY2ZTM3OTIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9tb2R1bGVfYXJtNjQvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV9hcm02NC9Cb2FyZENvbmZpZy5tawpAQCAtMTMsOCArMTMsNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01vZHVsZUNvbW1vbi5tawotCiBUQVJHRVRfQVJDSCA6PSBhcm02NAogVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCiBUQVJHRVRfQ1BVX1ZBUklBTlQgOj0gZ2VuZXJpYwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL21vZHVsZV9hcm02NG9ubHkvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvbW9kdWxlX2FybTY0b25seS9Cb2FyZENvbmZpZy5tawppbmRleCAzY2FiZjA1Li42YzI2NTc5IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvbW9kdWxlX2FybTY0b25seS9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvbW9kdWxlX2FybTY0b25seS9Cb2FyZENvbmZpZy5tawpAQCAtMTMsOCArMTMsNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01vZHVsZUNvbW1vbi5tawotCiBUQVJHRVRfQVJDSCA6PSBhcm02NAogVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCiBUQVJHRVRfQ1BVX1ZBUklBTlQgOj0gZ2VuZXJpYwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5tayBiL3RhcmdldC9ib2FyZC9tb2R1bGVfcmlzY3Y2NC9Cb2FyZENvbmZpZy5tawpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5tawpjb3B5IHRvIHRhcmdldC9ib2FyZC9tb2R1bGVfcmlzY3Y2NC9Cb2FyZENvbmZpZy5tawppbmRleCA1ZjY1NTNlLi44YmMxOTk5IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2XzY0Lm1rCisrKyBiL3RhcmdldC9ib2FyZC9tb2R1bGVfcmlzY3Y2NC9Cb2FyZENvbmZpZy5tawpAQCAtMSw1ICsxLDQgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDggKzEzLDEwIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIERvbid0IG1vZGlmeSB0aGlzIGZpbGUgLSBJdCdzIGp1c3QgYW4gYWxpYXMhCitUQVJHRVRfQVJDSCA6PSByaXNjdjY0CitUQVJHRVRfQVJDSF9WQVJJQU5UIDo9CitUQVJHRVRfQ1BVX1ZBUklBTlQgOj0gZ2VuZXJpYworVEFSR0VUX0NQVV9BQkkgOj0gcmlzY3Y2NAogCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWspCi0KLVBST0RVQ1RfTkFNRSA6PSBzZGtfeDg2XzY0CisjIFRlbXBvcmFyeSBoYWNrIHdoaWxlIHByZWJ1aWx0IG1vZHVsZXMgYXJlIG1pc3NpbmcgcmlzY3Y2NC4KK0FMTE9XX01JU1NJTkdfREVQRU5ERU5DSUVTIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9tb2R1bGVfcmlzY3Y2NC9SRUFETUUubWQgYi90YXJnZXQvYm9hcmQvbW9kdWxlX3Jpc2N2NjQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZWJhYTkKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvYm9hcmQvbW9kdWxlX3Jpc2N2NjQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMiBAQAorVGhpcyBkZXZpY2UgaXMgc3VpdGFibGUgZm9yIGFuIHVuYnVuZGxlZCBtb2R1bGUgdGFyZ2V0ZWQgc3BlY2lmaWNhbGx5IHRvIGEKK3Jpc2N2NjQgZGV2aWNlLiBUaGlzIGlzIGEgNjQtYml0IG9ubHkgZGV2aWNlIChubyAzMi1iaXQgc3VwcG9ydCkuCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvbW9kdWxlX3g4Ni9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9tb2R1bGVfeDg2L0JvYXJkQ29uZmlnLm1rCmluZGV4IGE5M2FjOTcuLmFmM2ZmZmQgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9tb2R1bGVfeDg2L0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9tb2R1bGVfeDg2L0JvYXJkQ29uZmlnLm1rCkBAIC0xMyw4ICsxMyw2IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTW9kdWxlQ29tbW9uLm1rCi0KIFRBUkdFVF9DUFVfQUJJIDo9IHg4NgogVEFSR0VUX0FSQ0ggOj0geDg2CiBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IHg4NgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL21vZHVsZV94ODZfNjQvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvbW9kdWxlX3g4Nl82NC9Cb2FyZENvbmZpZy5tawppbmRleCAxZWQzYmUwLi4xYWRhMDI3IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvbW9kdWxlX3g4Nl82NC9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvbW9kdWxlX3g4Nl82NC9Cb2FyZENvbmZpZy5tawpAQCAtMTMsOCArMTMsNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01vZHVsZUNvbW1vbi5tawotCiBUQVJHRVRfQ1BVX0FCSSA6PSB4ODZfNjQKIFRBUkdFVF9BUkNIIDo9IHg4Nl82NAogVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSB4ODZfNjQKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9tb2R1bGVfeDg2XzY0b25seS9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9tb2R1bGVfeDg2XzY0b25seS9Cb2FyZENvbmZpZy5tawppbmRleCBiMDY3NmNiLi41Yjg2ZjBhIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvbW9kdWxlX3g4Nl82NG9ubHkvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV94ODZfNjRvbmx5L0JvYXJkQ29uZmlnLm1rCkBAIC0xMyw4ICsxMyw2IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTW9kdWxlQ29tbW9uLm1rCi0KIFRBUkdFVF9DUFVfQUJJIDo9IHg4Nl82NAogVEFSR0VUX0FSQ0ggOj0geDg2XzY0CiBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IHg4Nl82NApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL25kay9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9uZGsvQm9hcmRDb25maWcubWsKaW5kZXggZGE4YjVmMy4uZTM2NzkxOCAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL25kay9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvbmRrL0JvYXJkQ29uZmlnLm1rCkBAIC0xNCw4ICsxNCwzIEBACiAjCiAKIFRBUkdFVF9BUkNIX1NVSVRFIDo9IG5kawotVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiA6PSB0cnVlCi0KLU1BTExPQ19TVkVMVEUgOj0gdHJ1ZQotCi1VU0VfU0FGRVNUQUNLIDo9IGZhbHNlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9BbmRyb2lkUHJvZHVjdHMubWsgYi90YXJnZXQvcHJvZHVjdC9BbmRyb2lkUHJvZHVjdHMubWsKaW5kZXggMTMzZGM3My4uMDdlYjk2ZCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvQW5kcm9pZFByb2R1Y3RzLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L0FuZHJvaWRQcm9kdWN0cy5tawpAQCAtNjYsMTQgKzY2LDggQEAKICAgICAkKExPQ0FMX0RJUikvbWFpbmxpbmVfc3lzdGVtX3g4Nl82NC5tayBcCiAgICAgJChMT0NBTF9ESVIpL21haW5saW5lX3N5c3RlbV94ODZfYXJtLm1rIFwKICAgICAkKExPQ0FMX0RJUikvbmRrLm1rIFwKLSAgICAkKExPQ0FMX0RJUikvc2RrX2FybTY0Lm1rIFwKICAgICAkKExPQ0FMX0RJUikvc2RrLm1rIFwKLSAgICAkKExPQ0FMX0RJUikvc2RrX3Bob25lX2FybTY0Lm1rIFwKLSAgICAkKExPQ0FMX0RJUikvc2RrX3Bob25lX2FybXY3Lm1rIFwKLSAgICAkKExPQ0FMX0RJUikvc2RrX3Bob25lX3g4Nl82NC5tayBcCi0gICAgJChMT0NBTF9ESVIpL3Nka19waG9uZV94ODYubWsgXAotICAgICQoTE9DQUxfRElSKS9zZGtfeDg2XzY0Lm1rIFwKLSAgICAkKExPQ0FMX0RJUikvc2RrX3g4Ni5tayBcCisgICAgJChMT0NBTF9ESVIpL3Nka193aXRoX3J1bnRpbWVfYXBpcy5tayBcCiAKIGVuZGlmCiAKQEAgLTgzLDEyICs3NywxMyBAQAogICAgICQoTE9DQUxfRElSKS9tb2R1bGVfYXJtLm1rIFwKICAgICAkKExPQ0FMX0RJUikvbW9kdWxlX2FybTY0Lm1rIFwKICAgICAkKExPQ0FMX0RJUikvbW9kdWxlX2FybTY0b25seS5tayBcCisgICAgJChMT0NBTF9ESVIpL21vZHVsZV9yaXNjdjY0Lm1rIFwKICAgICAkKExPQ0FMX0RJUikvbW9kdWxlX3g4Ni5tayBcCiAgICAgJChMT0NBTF9ESVIpL21vZHVsZV94ODZfNjQubWsgXAogICAgICQoTE9DQUxfRElSKS9tb2R1bGVfeDg2XzY0b25seS5tayBcCiAKIENPTU1PTl9MVU5DSF9DSE9JQ0VTIDo9IFwKLSAgICBhb3NwX2FybTY0LWVuZyBcCi0gICAgYW9zcF9hcm0tZW5nIFwKLSAgICBhb3NwX3g4Nl82NC1lbmcgXAotICAgIGFvc3BfeDg2LWVuZyBcCisgICAgYW9zcF9hcm02NC10cnVua19zdGFnaW5nLWVuZyBcCisgICAgYW9zcF9hcm0tdHJ1bmtfc3RhZ2luZy1lbmcgXAorICAgIGFvc3BfeDg2XzY0LXRydW5rX3N0YWdpbmctZW5nIFwKKyAgICBhb3NwX3g4Ni10cnVua19zdGFnaW5nLWVuZyBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9PV05FUlMgYi90YXJnZXQvcHJvZHVjdC9PV05FUlMKaW5kZXggMDA4ZTRhMi4uNDhkM2YyYSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvT1dORVJTCisrKyBiL3RhcmdldC9wcm9kdWN0L09XTkVSUwpAQCAtMSw0ICsxLDQgQEAKLXBlci1maWxlIHJ1bnRpbWVfbGliYXJ0Lm1rID0gY2FsaW5AZ29vZ2xlLmNvbSwgbWFzdEBnb29nbGUuY29tLCBuZ2VvZmZyYXlAZ29vZ2xlLmNvbSwgb3RoQGdvb2dsZS5jb20sIHJwbEBnb29nbGUuY29tLCB2bWFya29AZ29vZ2xlLmNvbQorcGVyLWZpbGUgcnVudGltZV9saWJhcnQubWsgPSBtYXN0QGdvb2dsZS5jb20sIG5nZW9mZnJheUBnb29nbGUuY29tLCBycGxAZ29vZ2xlLmNvbSwgdm1hcmtvQGdvb2dsZS5jb20KIAogIyBHU0kKIHBlci1maWxlIGdzaV9yZWxlYXNlLm1rID0gZmlsZTovdGFyZ2V0L3Byb2R1Y3QvZ3NpL09XTkVSUwpAQCAtNyw0ICs3LDQgQEAKICMgQW5kcm9pZCBHbwogcGVyLWZpbGUgZ29fZGVmYXVsdHMubWsgPSBna2Fpc2VyQGdvb2dsZS5jb20sIGt1c2hnQGdvb2dsZS5jb20sIHJhamVrdW1hckBnb29nbGUuY29tCiBwZXItZmlsZSBnb19kZWZhdWx0c181MTIubWsgPSBna2Fpc2VyQGdvb2dsZS5jb20sIGt1c2hnQGdvb2dsZS5jb20sIHJhamVrdW1hckBnb29nbGUuY29tCi1wZXItZmlsZSBnb19kZWZhdWx0c19jb21tb24ubWsgPSBna2Fpc2VyQGdvb2dsZS5jb20sIGt1c2hnQGdvb2dsZS5jb20sIHJhamVrdW1hckBnb29nbGUuY29tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorcGVyLWZpbGUgZ29fZGVmYXVsdHNfY29tbW9uLm1rID0gZ2thaXNlckBnb29nbGUuY29tLCBrdXNoZ0Bnb29nbGUuY29tLCByYWpla3VtYXJAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW5nbGVfZGVmYXVsdC5tayBiL3RhcmdldC9wcm9kdWN0L2FuZ2xlX2RlZmF1bHQubWsKaW5kZXggYmVhMGJlNi4uNzI4NDZkMyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW5nbGVfZGVmYXVsdC5taworKysgYi90YXJnZXQvcHJvZHVjdC9hbmdsZV9kZWZhdWx0Lm1rCkBAIC0xNSw5ICsxNSw3IEBACiAjCiAKICMgVG8gZW5hYmxlIEFOR0xFIGFzIHRoZSBkZWZhdWx0IHN5c3RlbSBHTEVTIGRyaXZlcnMsIGFkZAotIyAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2FuZ2xlX2VuYWJsZWQubWspIHRvIHRoZSBNYWtlZmlsZS4KKyMgJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hbmdsZV9kZWZhdWx0Lm1rKSB0byB0aGUgTWFrZWZpbGUuCiAKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW5nbGVfc3VwcG9ydGVkLm1rKQotCi1QUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKK1BST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gXAogICAgIHBlcnNpc3QuZ3JhcGhpY3MuZWdsPWFuZ2xlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hbmdsZV9zdXBwb3J0ZWQubWsgYi90YXJnZXQvcHJvZHVjdC9hbmdsZV9zdXBwb3J0ZWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4M2ZmNWYuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW5nbGVfc3VwcG9ydGVkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAyMyBUaGUgQW5kcm9pZCBPcGVuLVNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIFRvIGluY2x1ZGUgQU5HTEUgaW50byB0aGUgaW1hZ2UgYnVpbGQsIGFkZAotIyAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2FuZ2xlX3N1cHBvcnRlZC5taykgdG8gdGhlIE1ha2VmaWxlLgotIyBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgYWxsb3cgQU5HTEUgYmluYXJpZXMgdG8gY29leGlzdCB3aXRoIG5hdGl2ZSBHTEVTIGRyaXZlcnMuCi0KLVBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIGxpYkVHTF9hbmdsZSBcCi0gICAgbGliR0xFU3YxX0NNX2FuZ2xlIFwKLSAgICBsaWJHTEVTdjJfYW5nbGUKLQotIyBTZXQgcm8uZ2Z4LmFuZ2xlLnN1cHBvcnRlZCBiYXNlZCBvbiBpZiBBTkdMRSBpcyBpbnN0YWxsZWQgaW4gdmVuZG9yIHBhcnRpdGlvbgotUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby5nZnguYW5nbGUuc3VwcG9ydGVkPXRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfNjRiaXRvbmx5X3g4Nl82NC5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfNjRiaXRvbmx5X3g4Nl82NC5tawppbmRleCA3NWZkM2M4Li5jZjgxMmEyIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwXzY0Yml0b25seV94ODZfNjQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF82NGJpdG9ubHlfeDg2XzY0Lm1rCkBAIC01MSw3ICs1MSw2IEBACiAjCiAjIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHZlbmRvciBpbWFnZQogIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9nZW5lcmljX3g4Nl82NC9kZXZpY2UubWspCiAKICMKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm0ubWsKaW5kZXggNjFjMTMxNi4uZDljMzYyZSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm0ubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm0ubWsKQEAgLTUwLDcgKzUwLDYgQEAKICMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gdmVuZG9yIGltYWdlCiAjCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9yYW1kaXNrX3N0dWIubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yX3ZlbmRvci5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL2JvYXJkL2dlbmVyaWNfeDg2L2RldmljZS5taykKIAogIwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm02NC5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtNjQubWsKaW5kZXggNmM5MDdkYi4uN2E5MzI1ZCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm02NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX2FybTY0Lm1rCkBAIC00NCw3ICs0NCw3IEBACiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3RlbGVwaG9ueV9zeXN0ZW1fZXh0Lm1rKQogCiAjIHBLVk0KLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIHBhY2thZ2VzL21vZHVsZXMvVmlydHVhbGl6YXRpb24vYXBleC9wcm9kdWN0X3BhY2thZ2VzLm1rKQorJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIHBhY2thZ2VzL21vZHVsZXMvVmlydHVhbGl6YXRpb24vYXBleC9wcm9kdWN0X3BhY2thZ2VzLm1rKQogCiAjCiAjIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHByb2R1Y3QgaW1hZ2UKQEAgLTU0LDkgKzU0LDkgQEAKICMKICMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gdmVuZG9yIG9yIHZlbmRvcl9ib290IGltYWdlCiAjCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yX3ZlbmRvci5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL2JvYXJkL2dlbmVyaWNfYXJtNjQvZGV2aWNlLm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9ub25fYWJfZGV2aWNlLm1rKQorQUJfT1RBX1VQREFURVIgOj0gdHJ1ZQorQUJfT1RBX1BBUlRJVElPTlMgPz0gc3lzdGVtCiAKICMKICMgU3BlY2lhbCBzZXR0aW5ncyBmb3IgR1NJIHJlbGVhc2luZwpAQCAtNzMsMyArNzMsNSBAQAogUFJPRFVDVF9ERVZJQ0UgOj0gZ2VuZXJpY19hcm02NAogUFJPRFVDVF9CUkFORCA6PSBBbmRyb2lkCiBQUk9EVUNUX01PREVMIDo9IEFPU1Agb24gQVJNNjQKKworUFJPRFVDVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfcHJvZHVjdC5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfcHJvZHVjdC5tawppbmRleCBhNGMzYTkxLi4zYTViNjIyIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX3Byb2R1Y3QubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9wcm9kdWN0Lm1rCkBAIC0zMyw3ICszMyw3IEBACiAgICAgbWVzc2FnaW5nIFwKICAgICBQaG90b1RhYmxlIFwKICAgICBwcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0tYW9zcC1wcm9kdWN0LnhtbCBcCi0gICAgV2FsbHBhcGVyUGlja2VyIFwKKyAgICBUaGVtZVBpY2tlciBcCiAKICMgVGVsZXBob255OgogIyAgIFByb3ZpZGUgYSBBUE4gY29uZmlndXJhdGlvbiB0byBHU0kgcHJvZHVjdApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9yaXNjdjY0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9yaXNjdjY0Lm1rCmluZGV4IDI3MGE5ODkuLmZhNTAzZmYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfcmlzY3Y2NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3Jpc2N2NjQubWsKQEAgLTQ2LDcgKzQ2LDYgQEAKICMKICMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gdmVuZG9yIGltYWdlCiAjCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yX3ZlbmRvci5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL2JvYXJkL2dlbmVyaWNfcmlzY3Y2NC9kZXZpY2UubWspCiAKICMKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODYubWsKaW5kZXggYTJmMDM5MC4uYzI2YThiZiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODYubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODYubWsKQEAgLTQ3LDcgKzQ3LDYgQEAKICMKICMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gdmVuZG9yIGltYWdlCiAjCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yX3ZlbmRvci5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL2JvYXJkL2dlbmVyaWNfeDg2L2RldmljZS5taykKIAogCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2XzY0Lm1rCmluZGV4IDUzNWVlM2YuLjU5NTk0MGQgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2XzY0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2XzY0Lm1rCkBAIC01Niw5ICs1Niw5IEBACiAjCiAjIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHZlbmRvciBpbWFnZQogIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9nZW5lcmljX3g4Nl82NC9kZXZpY2UubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L25vbl9hYl9kZXZpY2UubWspCitBQl9PVEFfVVBEQVRFUiA6PSB0cnVlCitBQl9PVEFfUEFSVElUSU9OUyA/PSBzeXN0ZW0KIAogIwogIyBTcGVjaWFsIHNldHRpbmdzIGZvciBHU0kgcmVsZWFzaW5nCkBAIC03NSwzICs3NSw1IEBACiBQUk9EVUNUX0RFVklDRSA6PSBnZW5lcmljX3g4Nl82NAogUFJPRFVDVF9CUkFORCA6PSBBbmRyb2lkCiBQUk9EVUNUX01PREVMIDo9IEFPU1Agb24geDg2XzY0CisKK1BST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTyA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl9hcm0ubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl9hcm0ubWsKaW5kZXggMzlhZDBkOC4uYTEwM2IxYSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfYXJtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2X2FybS5tawpAQCAtNDUsNyArNDUsNiBAQAogIwogIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byB2ZW5kb3IgaW1hZ2UKICMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZW11bGF0b3JfdmVuZG9yLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvZ2VuZXJpY194ODZfYXJtL2RldmljZS5taykKIAogCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9iYXNlX3Byb2R1Y3QubWsgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3Byb2R1Y3QubWsKaW5kZXggNTQ0NjA2NC4uMGFjMjIwYiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9wcm9kdWN0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Jhc2VfcHJvZHVjdC5tawpAQCAtMTYsNiArMTYsNyBAQAogCiAjIEJhc2UgbW9kdWxlcyBhbmQgc2V0dGluZ3MgZm9yIHRoZSBwcm9kdWN0IHBhcnRpdGlvbi4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGJ1aWxkX2ZsYWdfcHJvZHVjdCBcCiAgICAgZnNfY29uZmlnX2RpcnNfcHJvZHVjdCBcCiAgICAgZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3QgXAogICAgIGdyb3VwX3Byb2R1Y3QgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW0ubWsgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbS5tawppbmRleCBhM2Y1YWIzLi45YTY3NDZmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbS5taworKysgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbS5tawpAQCAtMTcsMTMgKzE3LDEyIEBACiAjIEJhc2UgbW9kdWxlcyBhbmQgc2V0dGluZ3MgZm9yIHRoZSBzeXN0ZW0gcGFydGl0aW9uLgogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgYWJ4IFwKKyAgICBhY29uZmlnZCBcCiAgICAgYWRiZF9zeXN0ZW1fYXBpIFwKKyAgICBhZmxhZ3MgXAogICAgIGFtIFwKLSAgICBhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMC1zZXJ2aWNlIFwKICAgICBhbmRyb2lkLmhpZGwuYmFzZS1WMS4wLWphdmEgXAogICAgIGFuZHJvaWQuaGlkbC5tYW5hZ2VyLVYxLjAtamF2YSBcCi0gICAgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAtaW1wbCBcCi0gICAgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAtaW1wbC52ZW5kb3IgXAogICAgIGFuZHJvaWQuc3lzdGVtLnN1c3BlbmQtc2VydmljZSBcCiAgICAgYW5kcm9pZC50ZXN0LmJhc2UgXAogICAgIGFuZHJvaWQudGVzdC5tb2NrIFwKQEAgLTQ2LDYgKzQ1LDcgQEAKICAgICBidSBcCiAgICAgYnVncmVwb3J0IFwKICAgICBidWdyZXBvcnR6IFwKKyAgICBidWlsZF9mbGFnX3N5c3RlbSBcCiAgICAgY2dyb3Vwcy5qc29uIFwKICAgICBjaGFyZ2VyIFwKICAgICBjbWQgXApAQCAtNzMsNyArNzMsNyBAQAogICAgIGNvbS5hbmRyb2lkLnNjaGVkdWxpbmcgXAogICAgIGNvbS5hbmRyb2lkLnNka2V4dCBcCiAgICAgY29tLmFuZHJvaWQudGV0aGVyaW5nIFwKLSAgICBjb20uYW5kcm9pZC50emRhdGEgXAorICAgICQoUkVMRUFTRV9QQUNLQUdFX1RaREFUQV9NT0RVTEUpIFwKICAgICBjb20uYW5kcm9pZC51d2IgXAogICAgIGNvbS5hbmRyb2lkLnZpcnQgXAogICAgIGNvbS5hbmRyb2lkLndpZmkgXApAQCAtOTEsMTkgKzkxLDIyIEBACiAgICAgZHVtcC5lcm9mcyBcCiAgICAgZHVtcHN0YXRlIFwKICAgICBkdW1wc3lzIFwKLSAgICBEeW5hbWljU3lzdGVtSW5zdGFsbGF0aW9uU2VydmljZSBcCisgICAgRTJlZUNvbnRhY3RLZXlzUHJvdmlkZXIgXAogICAgIGUyZnNjayBcCisgICAgZW5oYW5jZWQtY29uZmlybWF0aW9uLnhtbCBcCiAgICAgRXh0U2hhcmVkIFwKICAgICBmbGFnc19oZWFsdGhfY2hlY2sgXAogICAgIGZyYW1ld29yay1ncmFwaGljcyBcCisgICAgZnJhbWV3b3JrLWxvY2F0aW9uIFwKICAgICBmcmFtZXdvcmstbWludXMtYXBleCBcCi0gICAgZnJhbWV3b3JrLXJlcyBcCisgICAgZnJhbWV3b3JrLW1pbnVzLWFwZXgtaW5zdGFsbC1kZXBlbmRlbmNpZXMgXAogICAgIGZyYW1ld29yay1zeXNjb25maWcueG1sIFwKICAgICBmc2NrLmVyb2ZzIFwKICAgICBmc2NrX21zZG9zIFwKICAgICBmc3Zlcml0eS1yZWxlYXNlLWNlcnQtZGVyIFwKICAgICBmc19jb25maWdfZmlsZXNfc3lzdGVtIFwKICAgICBmc19jb25maWdfZGlyc19zeXN0ZW0gXAorICAgIGdwdV9jb3VudGVyX3Byb2R1Y2VyIFwKICAgICBncm91cF9zeXN0ZW0gXAogICAgIGdzaWQgXAogICAgIGdzaV90b29sIFwKQEAgLTExMiw3ICsxMTUsNiBAQAogICAgIGdhdGVrZWVwZXJkIFwKICAgICBncHVzZXJ2aWNlIFwKICAgICBoaWQgXAotICAgIGh3c2VydmljZW1hbmFnZXIgXAogICAgIGlkbWFwMiBcCiAgICAgaWRtYXAyZCBcCiAgICAgaW1lIFwKQEAgLTEyOSw4ICsxMzEsOCBAQAogICAgIEludGVudFJlc29sdmVyIFwKICAgICBpcCBcCiAgICAgaXB0YWJsZXMgXAotICAgIGlwLXVwLXZwbiBcCiAgICAgamF2YXgub2JleCBcCisgICAga2NtZGxpbmVjdHJsIFwKICAgICBrZXlzdG9yZTIgXAogICAgIGNyZWRzdG9yZSBcCiAgICAgbGQubWMgXApAQCAtMTczLDcgKzE3NSw2IEBACiAgICAgbGlianBlZyBcCiAgICAgbGlibG9nIFwKICAgICBsaWJtLmJvb3RzdHJhcCBcCi0gICAgbGlibWRuc3NkIFwKICAgICBsaWJtZWRpYSBcCiAgICAgbGlibWVkaWFfam5pIFwKICAgICBsaWJtZWRpYW5kayBcCkBAIC0yMDUsNiArMjA2LDcgQEAKICAgICBsaWJ1aSBcCiAgICAgbGlidXNiaG9zdCBcCiAgICAgbGlidXRpbHMgXAorICAgIGxpYnZpbnRmX2puaSBcCiAgICAgbGlidnVsa2FuIFwKICAgICBsaWJ3aWxoZWxtIFwKICAgICBsaW5rZXIgXApAQCAtMjI2LDggKzIyOCw4IEBACiAgICAgbWtlMmZzIFwKICAgICBta2ZzLmVyb2ZzIFwKICAgICBtb25rZXkgXAorICAgIG1pc2N0cmwgXAogICAgIG10ZWN0cmwgXAotICAgIG10cGQgXAogICAgIG5kYyBcCiAgICAgbmV0ZCBcCiAgICAgTmV0d29ya1N0YWNrIFwKQEAgLTIzNSwxOCArMjM3LDIxIEBACiAgICAgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBcCiAgICAgb3RhY2VydHMgXAogICAgIFBhY2thZ2VJbnN0YWxsZXIgXAorICAgIHBhY2thZ2Utc2hhcmVkdWlkLWFsbG93bGlzdC54bWwgXAogICAgIHBhc3N3ZF9zeXN0ZW0gXAogICAgIHBlcmZldHRvIFwKKyAgICBwZXJmZXR0by1leHRyYXMgXAogICAgIHBpbmcgXAogICAgIHBpbmc2IFwKKyAgICBwaW50b29sIFwKICAgICBwbGF0Zm9ybS54bWwgXAogICAgIHBtIFwKLSAgICBwcHBkIFwKICAgICBwcmVpbnN0YWxsZWQtcGFja2FnZXMtYXNsLWZpbGVzLnhtbCBcCiAgICAgcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLnhtbCBcCisgICAgcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXN0cmljdC1zaWduYXR1cmUueG1sIFwKKyAgICBwcmludGZsYWdzIFwKICAgICBwcml2YXBwLXBlcm1pc3Npb25zLXBsYXRmb3JtLnhtbCBcCiAgICAgcHJuZ19zZWVkZXIgXAotICAgIHJhY29vbiBcCiAgICAgcmVjb3ZlcnktcGVyc2lzdCBcCiAgICAgcmVzaXplMmZzIFwKICAgICByc3NfaHdtX3Jlc2V0IFwKQEAgLTI2NCwxMyArMjY5LDEzIEBACiAgICAgc2VydmljZXMgXAogICAgIHNldHRpbmdzIFwKICAgICBTZXR0aW5nc1Byb3ZpZGVyIFwKKyAgICBzZmRvIFwKICAgICBzZ2Rpc2sgXAogICAgIFNoZWxsIFwKICAgICBzaGVsbF9hbmRfdXRpbGl0aWVzX3N5c3RlbSBcCiAgICAgc20gXAogICAgIHNuYXBzaG90Y3RsIFwKICAgICBzbmFwdXNlcmQgXAotICAgIFNvdW5kUGlja2VyIFwKICAgICBzdG9yYWdlZCBcCiAgICAgc3VyZmFjZWZsaW5nZXIgXAogICAgIHN2YyBcCkBAIC0yODUsOSArMjkwLDEwIEBACiAgICAgdWlhdXRvbWF0b3IgXAogICAgIHVpbnB1dCBcCiAgICAgdW5jcnlwdCBcCisgICAgdXByb2Jlc3RhdHMgXAogICAgIHVzYmQgXAogICAgIHZkYyBcCi0gICAgdmlld2NvbXBpbGVyIFwKKyAgICB2aW50ZiBcCiAgICAgdm9pcC1jb21tb24gXAogICAgIHZvbGQgXAogICAgIHdhdGNoZG9nZCBcCkBAIC0yOTUsMTEgKzMwMSw2NiBAQAogICAgIHdpZmkucmMgXAogICAgIHdtIFwKIAorIyBXaGVuIHdlIHJlbGVhc2UgY3Jhc2hyZWNvdmVyeSBtb2R1bGUKK2lmZXEgKCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSksdHJ1ZSkKKyAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLmNyYXNocmVjb3ZlcnkgXAorCitlbmRpZgorCisjIFRoZXNlIHBhY2thZ2VzIGFyZSBub3QgdXNlZCBvbiBBbmRyb2lkIFRWCitpZm5lcSAoJChQUk9EVUNUX0lTX0FUViksdHJ1ZSkKKyAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAkKFJFTEVBU0VfUEFDS0FHRV9TT1VORF9QSUNLRVIpIFwKKworZW5kaWYKKworIyBQcm9kdWN0IGRvZXMgbm90IHN1cHBvcnQgRHluYW1pYyBTeXN0ZW0gVXBkYXRlCitpZm5lcSAoJChQUk9EVUNUX05PX0RZTkFNSUNfU1lTVEVNX1VQREFURSksdHJ1ZSkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgRHluYW1pY1N5c3RlbUluc3RhbGxhdGlvblNlcnZpY2UgXAorCitlbmRpZgorCisjIENoZWNrIGlmIHRoZSBidWlsZCBzdXBwb3J0cyBORkMgYXBleCBvciBub3QKK2lmZXEgKCQoUkVMRUFTRV9QQUNLQUdFX05GQ19TVEFDSyksTmZjTmNpKQorICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgICBmcmFtZXdvcmstbmZjIFwKKyAgICAgICAgTmZjTmNpCitlbHNlCisgICAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLm5mY3NlcnZpY2VzCitlbmRpZgorCisjIENoZWNrIGlmIHRoZSBidWlsZCBzdXBwb3J0cyBQcm9maWxpbmcgbW9kdWxlCitpZmVxICgkKFJFTEVBU0VfUEFDS0FHRV9QUk9GSUxJTkdfTU9EVUxFKSx0cnVlKQorICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgIGNvbS5hbmRyb2lkLnByb2ZpbGluZyBcCisgICAgICAgdHJhY2VfcmVkYWN0b3IKK2VuZGlmCisKK2lmZXEgKCQoUkVMRUFTRV9VU0VfV0VCVklFV19CT09UU1RSQVBfTU9EVUxFKSx0cnVlKQorICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgICBjb20uYW5kcm9pZC53ZWJ2aWV3LmJvb3RzdHJhcAorZW5kaWYKKwogIyBWSU5URiBkYXRhIGZvciBzeXN0ZW0gaW1hZ2UKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHN5c3RlbV9tYW5pZmVzdC54bWwgXAogICAgIHN5c3RlbV9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwgXAogCisjIEJhc2UgbW9kdWxlcyB3aGVuIHNoaXBwaW5nIGFwaSBsZXZlbCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzQKK1BST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0ICs9IFwKKyAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMC1pbXBsIFwKKworIyBod3NlcnZpY2VtYW5hZ2VyIGlzIG5vdyBpbnN0YWxsZWQgb24gc3lzdGVtX2V4dCwgYnV0IGFwZXhlcyBtaWdodCBiZSB1c2luZworIyBvbGQgbGlicmFyaWVzIHRoYXQgYXJlIGV4cGVjdGluZyBpdCB0byBiZSBpbnN0YWxsZWQgb24gc3lzdGVtLiBUaGlzIGFsbG93cworIyB0aG9zZSBhcGV4ZXMgdG8gY29udGludWUgd29ya2luZy4gVGhlIHN5bWxpbmsgY2FuIGJlIHJlbW92ZWQgb25jZSB3ZSBhcmUgc3VyZQorIyB0aGVyZSBhcmUgbm8gZGV2aWNlcyB1c2luZyBod3NlcnZpY2VtYW5hZ2VyICh3aGVuIEFuZHJvaWQgViBsYXVuY2hpbmcgZGV2aWNlcworIyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCBmb3IgZGVzc2VydCB1cGdyYWRlcykuCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBod3NlcnZpY2VtYW5hZ2VyX2NvbXBhdF9zeW1saW5rX21vZHVsZSBcCisKIFBST0RVQ1RfUEFDS0FHRVNfQVJNNjQgOj0gbGliY2xhbmdfcnQuaHdhc2FuIFwKICBsaWJjbGFuZ19ydC5od2FzYW4uYm9vdHN0cmFwIFwKICBsaWJjX2h3YXNhbiBcCkBAIC0zMjYsNiArMzg3LDExIEBACiAgICAgV2FsbHBhcGVyQmFja3VwCiBlbmRpZgogCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBsaWJFR0xfYW5nbGUgXAorICAgIGxpYkdMRVN2MV9DTV9hbmdsZSBcCisgICAgbGliR0xFU3YyX2FuZ2xlCisKICMgRm9yIHRlc3RpbmcgcHVycG9zZXMKIGlmZXEgKCQoRk9SQ0VfQVVESU9fU0lMRU5UKSwgdHJ1ZSkKICAgICBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmF1ZGlvLnNpbGVudD0xCkBAIC0zMzUsNiArNDAxLDcgQEAKIFBST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCiAgICAgQnVnUmVwb3J0IFwKICAgICBhZGIgXAorICAgIGFkZXZpY2UgXAogICAgIGFydC10b29scyBcCiAgICAgYXRlc3QgXAogICAgIGJjYyBcCkBAIC0zNDUsMTIgKzQxMiwxMSBAQAogICAgIGZsYWdzX2hlYWx0aF9jaGVjayBcCiAgICAgZnNjay5lcm9mcyBcCiAgICAgaWN1LWRhdGFfaG9zdF9pMThuX2FwZXggXAotICAgIGljdV90emRhdGEuZGF0X2hvc3RfdHpkYXRhX2FwZXggXAorICAgIHR6ZGF0YV9pY3VfcmVzX2ZpbGVzX2hvc3RfcHJlYnVpbHRzIFwKICAgICBpZG1hcDIgXAogICAgIGluY2lkZW50X3JlcG9ydCBcCiAgICAgbGQubWMgXAogICAgIGxwZHVtcCBcCi0gICAgbWluaWd6aXAgXAogICAgIG1rZTJmcyBcCiAgICAgbWtmcy5lcm9mcyBcCiAgICAgcmVzaXplMmZzIFwKQEAgLTM2MSwzMCArNDI3LDM0IEBACiAgICAgdW53aW5kX2luZm8gXAogICAgIHVud2luZF9yZWdfaW5mbyBcCiAgICAgdW53aW5kX3N5bWJvbHMgXAotICAgIHZpZXdjb21waWxlciBcCiAgICAgdHpkYXRhX2hvc3QgXAogICAgIHR6ZGF0YV9ob3N0X3R6ZGF0YV9hcGV4IFwKICAgICB0emxvb2t1cC54bWxfaG9zdF90emRhdGFfYXBleCBcCiAgICAgdHpfdmVyc2lvbl9ob3N0IFwKICAgICB0el92ZXJzaW9uX2hvc3RfdHpkYXRhX2FwZXggXAogCitQUk9EVUNUX1BBQ0tBR0VTICs9IGluaXQudXNiLnJjIGluaXQudXNiLmNvbmZpZ2ZzLnJjCiAKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCi0gICAgc3lzdGVtL2NvcmUvcm9vdGRpci9pbml0LnVzYi5yYzpzeXN0ZW0vZXRjL2luaXQvaHcvaW5pdC51c2IucmMgXAotICAgIHN5c3RlbS9jb3JlL3Jvb3RkaXIvaW5pdC51c2IuY29uZmlnZnMucmM6c3lzdGVtL2V0Yy9pbml0L2h3L2luaXQudXNiLmNvbmZpZ2ZzLnJjIFwKLSAgICBzeXN0ZW0vY29yZS9yb290ZGlyL2V0Yy9ob3N0czpzeXN0ZW0vZXRjL2hvc3RzCitQUk9EVUNUX1BBQ0tBR0VTICs9IGV0Y19ob3N0cwogCi1QUk9EVUNUX0NPUFlfRklMRVMgKz0gc3lzdGVtL2NvcmUvcm9vdGRpci9pbml0Lnp5Z290ZTMyLnJjOnN5c3RlbS9ldGMvaW5pdC9ody9pbml0Lnp5Z290ZTMyLnJjCitQUk9EVUNUX1BBQ0tBR0VTICs9IGluaXQuenlnb3RlMzIucmMKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8uenlnb3RlPz16eWdvdGUzMgogCiBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IGRlYnVnLmF0cmFjZS50YWdzLmVuYWJsZWZsYWdzPTAKIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gcGVyc2lzdC50cmFjZWQuZW5hYmxlPTEKIAorIyBJbmNsdWRlIGtlcm5lbCBjb25maWdzLgorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgYXBwcm92ZWQtb2draS1idWlsZHMueG1sIFwKKyAgICBrZXJuZWwtbGlmZXRpbWVzLnhtbAorCiAjIFBhY2thZ2VzIGluY2x1ZGVkIG9ubHkgZm9yIGVuZyBvciB1c2VyZGVidWcgYnVpbGRzLCBwcmV2aW91c2x5IGRlYnVnIHRhZ2dlZAogUFJPRFVDVF9QQUNLQUdFU19ERUJVRyA6PSBcCiAgICAgYWRiX2tleXMgXAorICAgIGFkZXZpY2VfZmluZ2VycHJpbnQgXAogICAgIGFycGluZyBcCiAgICAgZG11c2VyZCBcCisgICAgZXZlbXUtcmVjb3JkIFwKICAgICBpZGxjbGkgXAogICAgIGluaXQtZGVidWcucmMgXAogICAgIGlvdG9wIFwKQEAgLTM5NCw2ICs0NjQsOCBAQAogICAgIGxpYmNsYW5nX3J0LnVic2FuX3N0YW5kYWxvbmUgXAogICAgIGxvZ3BlcnNpc3Quc3RhcnQgXAogICAgIGxvZ3RhZ2QucmMgXAorICAgIG90LWNsaS1mdGQgXAorICAgIG90LWN0bCBcCiAgICAgcHJvY3JhbmsgXAogICAgIHByb2Zjb2xsZWN0ZCBcCiAgICAgcHJvZmNvbGxlY3RjdGwgXApAQCAtNDI4LDkgKzUwMCwyMiBAQAogUFJPRFVDVF9DT1BZX0ZJTEVTICs9ICQoY2FsbCBhZGQtdG8tcHJvZHVjdC1jb3B5LWZpbGVzLWlmLWV4aXN0cyxcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL2NvbmZpZy9wcmVsb2FkZWQtY2xhc3NlczpzeXN0ZW0vZXRjL3ByZWxvYWRlZC1jbGFzc2VzKQogCi0jIE5vdGU6IGl0IGlzIGFjY2VwdGFibGUgdG8gbm90IGhhdmUgYSBkaXJ0eS1pbWFnZS1vYmplY3RzIGZpbGUuIEluIHRoYXQgY2FzZSwgdGhlIHNwZWNpYWwgYmluCi0jICAgICAgIGZvciBrbm93biBkaXJ0eSBvYmplY3RzIGluIHRoZSBpbWFnZSB3aWxsIGJlIGVtcHR5LgotUFJPRFVDVF9DT1BZX0ZJTEVTICs9ICQoY2FsbCBhZGQtdG8tcHJvZHVjdC1jb3B5LWZpbGVzLWlmLWV4aXN0cyxcCi0gICAgZnJhbWV3b3Jrcy9iYXNlL2NvbmZpZy9kaXJ0eS1pbWFnZS1vYmplY3RzOnN5c3RlbS9ldGMvZGlydHktaW1hZ2Utb2JqZWN0cykKKyMgRW5hYmxlIGRpcnR5IGltYWdlIG9iamVjdCBiaW5uaW5nIHRvIHJlZHVjZSBkaXJ0eSBwYWdlcyBpbiB0aGUgaW1hZ2UuCitQUk9EVUNUX1BBQ0tBR0VTICs9IGRpcnR5LWltYWdlLW9iamVjdHMKKworIyBFbmFibGUgZ28vcGVyZmV0dG8tcGVyc2lzdGVudC10cmFjaW5nIGZvciBlbmcgYnVpbGRzCitpZm5lcSAoLCQoZmlsdGVyIGVuZywgJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorICAgIFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHBlcnNpc3QuZGVidWcucGVyZmV0dG8ucGVyc2lzdGVudF9zeXN1aV90cmFjaW5nX2Zvcl9idWdyZXBvcnQ9MQorZW5kaWYKIAogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5taykKKworIyBFbnN1cmUgYWxsIHRydW5rLXN0YWJsZSBmbGFncyBhcmUgYXZhaWxhYmxlLgorJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9idWlsZF92YXJpYWJsZXMubWspCisKKyMgVXNlICJpbWFnZSIgQVBFWGVzIGFsd2F5cy4KKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC91cGRhdGFibGVfYXBleC5taykKKworJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsIGJpb25pYywgbGFyZ2Vfc3lzdGVtX3Byb3BlcnR5X25vZGUsICQoUkVMRUFTRV9MQVJHRV9TWVNURU1fUFJPUEVSVFlfTk9ERSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgQWNvbmZpZywgcmVhZF9mcm9tX25ld19zdG9yYWdlLCAkKFJFTEVBU0VfUkVBRF9GUk9NX05FV19TVE9SQUdFKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCBTZXR0aW5nc0xpYiwgbGVnYWN5X2F2YXRhcl9waWNrZXJfYXBwX2VuYWJsZWQsICQoaWYgJChSRUxFQVNFX0FWQVRBUl9QSUNLRVJfQVBQKSwsdHJ1ZSkpCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbV9leHQubWsgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbV9leHQubWsKaW5kZXggODUyZDdjYS4uOTJjYTIyNyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW1fZXh0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtX2V4dC5tawpAQCAtMTYsOSArMTYsMTYgQEAKIAogIyBCYXNlIG1vZHVsZXMgYW5kIHNldHRpbmdzIGZvciB0aGUgc3lzdGVtX2V4dCBwYXJ0aXRpb24uCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBidWlsZF9mbGFnX3N5c3RlbV9leHQgXAogICAgIGZzX2NvbmZpZ19kaXJzX3N5c3RlbV9leHQgXAogICAgIGZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0IFwKICAgICBncm91cF9zeXN0ZW1fZXh0IFwKICAgICBwYXNzd2Rfc3lzdGVtX2V4dCBcCisgICAgU2F0ZWxsaXRlQ2xpZW50IFwKICAgICBzZWxpbnV4X3BvbGljeV9zeXN0ZW1fZXh0IFwKICAgICBzeXN0ZW1fZXh0X21hbmlmZXN0LnhtbCBcCisKKyMgQmFzZSBtb2R1bGVzIHdoZW4gc2hpcHBpbmcgYXBpIGxldmVsIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzNAorUFJPRFVDVF9QQUNLQUdFU19TSElQUElOR19BUElfTEVWRUxfMzQgKz0gXAorICAgIGh3c2VydmljZW1hbmFnZXIgXAorICAgIGFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wLXNlcnZpY2UgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV92ZW5kb3IubWsgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3ZlbmRvci5tawppbmRleCA5NzgwOWMyLi4xODU0Zjk3IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9iYXNlX3ZlbmRvci5taworKysgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3ZlbmRvci5tawpAQCAtMTgsNiArMTgsNyBAQAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgYWRiZC5yZWNvdmVyeSBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLWltcGwtZGVmYXVsdC5yZWNvdmVyeSBcCisgICAgYnVpbGRfZmxhZ192ZW5kb3IgXAogICAgIGNncm91cHMucmVjb3ZlcnkuanNvbiBcCiAgICAgY2hhcmdlci5yZWNvdmVyeSBcCiAgICAgaW5pdF9zZWNvbmRfc3RhZ2UucmVjb3ZlcnkgXApAQCAtNDYsMTIgKzQ3LDExIEBACiAKICMgQmFzZSBtb2R1bGVzIGFuZCBzZXR0aW5ncyBmb3IgdGhlIHZlbmRvciBwYXJ0aXRpb24uCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhcy1zZXJ2aWNlLmV4YW1wbGUgXAorICAgIGNvbS5hbmRyb2lkLmhhcmR3YXJlLmNhcyBcCiAgICAgYm9yaW5nc3NsX3NlbGZfdGVzdF92ZW5kb3IgXAogICAgIGR1bXBzeXNfdmVuZG9yIFwKICAgICBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIFwKICAgICBmc19jb25maWdfZGlyc19ub25zeXN0ZW0gXAotICAgIGdwdV9jb3VudGVyX3Byb2R1Y2VyIFwKICAgICBncmFsbG9jLmRlZmF1bHQgXAogICAgIGdyb3VwX29kbSBcCiAgICAgZ3JvdXBfdmVuZG9yIFwKQEAgLTc0LDYgKzc0LDEwIEBACiAgICAgc2VsaW51eF9wb2xpY3lfbm9uc3lzdGVtIFwKICAgICBzaGVsbF9hbmRfdXRpbGl0aWVzX3ZlbmRvciBcCiAKKyMgQmFzZSBtb2R1bGVzIHdoZW4gc2hpcHBpbmcgYXBpIGxldmVsIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzNAorUFJPRFVDVF9QQUNLQUdFU19TSElQUElOR19BUElfTEVWRUxfMzQgKz0gXAorICAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMC1pbXBsLnZlbmRvciBcCisKICMgT01YIG5vdCBzdXBwb3J0ZWQgZm9yIDY0Yml0X29ubHkgYnVpbGRzCiAjIE9ubHkgc3VwcG9ydGVkIHdoZW4gU0hJUFBJTkdfQVBJX0xFVkVMIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzMwogaWZuZXEgKCQoVEFSR0VUX1NVUFBPUlRTX09NWF9TRVJWSUNFKSxmYWxzZSkKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9idWlsZF92YXJpYWJsZXMubWsKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKY29weSB0byB0YXJnZXQvcHJvZHVjdC9idWlsZF92YXJpYWJsZXMubWsKaW5kZXggNWY2NTUzZS4uNWZlNTMzMyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9idWlsZF92YXJpYWJsZXMubWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCw4ICsxNCw4IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIERvbid0IG1vZGlmeSB0aGlzIGZpbGUgLSBJdCdzIGp1c3QgYW4gYWxpYXMhCisjIFRoaXMgZmlsZSBjb250YWlucyB0aGUgdHJ1bmstc3RhYmxlIGZsYWdzIHRoYXQgc2hvdWxkIGJlIGV4cG9ydGVkIHRvIGFsbAorIyBBbmRyb2lkIHRhcmdldHMuCiAKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX3Bob25lX3g4Nl82NC5taykKLQotUFJPRFVDVF9OQU1FIDo9IHNka194ODZfNjQKKyMgVXNlIHRoZSBjb25maWd1cmVkIHJlbGVhc2Ugb2Ygc3FsaXRlCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgbGlic3FsaXRlMywgcmVsZWFzZV9wYWNrYWdlX2xpYnNxbGl0ZTMsICQoUkVMRUFTRV9QQUNLQUdFX0xJQlNRTElURTMpKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvY29yZV82NF9iaXQubWsgYi90YXJnZXQvcHJvZHVjdC9jb3JlXzY0X2JpdC5tawppbmRleCBlMGM0ZDUzLi43OTBmNTdiIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9jb3JlXzY0X2JpdC5taworKysgYi90YXJnZXQvcHJvZHVjdC9jb3JlXzY0X2JpdC5tawpAQCAtMjMsOSArMjMsNyBAQAogIyBmb3IgMzItYml0IG9ubHkuCiAKICMgQ29weSB0aGUgNjQtYml0IHByaW1hcnksIDMyLWJpdCBzZWNvbmRhcnkgenlnb3RlIHN0YXJ0dXAgc2NyaXB0Ci1QUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIHN5c3RlbS9jb3JlL3Jvb3RkaXIvaW5pdC56eWdvdGU2NC5yYzpzeXN0ZW0vZXRjL2luaXQvaHcvaW5pdC56eWdvdGU2NC5yYyBcCi0gICAgc3lzdGVtL2NvcmUvcm9vdGRpci9pbml0Lnp5Z290ZTY0XzMyLnJjOnN5c3RlbS9ldGMvaW5pdC9ody9pbml0Lnp5Z290ZTY0XzMyLnJjIFwKK1BST0RVQ1RfUEFDS0FHRVMgKz0gaW5pdC56eWdvdGU2NC5yYyBpbml0Lnp5Z290ZTY0XzMyLnJjCiAKICMgU2V0IHRoZSB6eWdvdGUgcHJvcGVydHkgdG8gc2VsZWN0IHRoZSA2NC1iaXQgcHJpbWFyeSwgMzItYml0IHNlY29uZGFyeSBzY3JpcHQKICMgVGhpcyBsaW5lIG11c3QgYmUgcGFyc2VkIGJlZm9yZSB0aGUgb25lIGluIGNvcmVfbWluaW1hbC5tawpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvY29yZV82NF9iaXRfb25seS5tayBiL3RhcmdldC9wcm9kdWN0L2NvcmVfNjRfYml0X29ubHkubWsKaW5kZXggZmMyYjhlNS4uZmZhNTU2NyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvY29yZV82NF9iaXRfb25seS5taworKysgYi90YXJnZXQvcHJvZHVjdC9jb3JlXzY0X2JpdF9vbmx5Lm1rCkBAIC0yMCw3ICsyMCw3IEBACiAjIHRvIGNvcmVfbWluaW1hbC5tay4KIAogIyBDb3B5IHRoZSA2NC1iaXQgenlnb3RlIHN0YXJ0dXAgc2NyaXB0Ci1QUk9EVUNUX0NPUFlfRklMRVMgKz0gc3lzdGVtL2NvcmUvcm9vdGRpci9pbml0Lnp5Z290ZTY0LnJjOnN5c3RlbS9ldGMvaW5pdC9ody9pbml0Lnp5Z290ZTY0LnJjCitQUk9EVUNUX1BBQ0tBR0VTICs9IGluaXQuenlnb3RlNjQucmMKIAogIyBTZXQgdGhlIHp5Z290ZSBwcm9wZXJ0eSB0byBzZWxlY3QgdGhlIDY0LWJpdCBzY3JpcHQuCiAjIFRoaXMgbGluZSBtdXN0IGJlIHBhcnNlZCBiZWZvcmUgdGhlIG9uZSBpbiBjb3JlX21pbmltYWwubWsKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2RlZmF1bHRfYXJ0X2NvbmZpZy5tayBiL3RhcmdldC9wcm9kdWN0L2RlZmF1bHRfYXJ0X2NvbmZpZy5tawppbmRleCBkOTcwMjAzLi4xYTNmMmNmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9kZWZhdWx0X2FydF9jb25maWcubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rCkBAIC0zOCwxNiArMzgsMjcgQEAKIFBST0RVQ1RfQk9PVF9KQVJTIDo9IFwKICAgICAkKEFSVF9BUEVYX0pBUlMpCiAKKyMgTGlzdCBvZiBqYXJzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBBUlQgYm9vdCBpbWFnZSBmb3IgdGVzdGluZy4KKyMgRE8gTk9UIHJlb3JkZXIgdGhpcyBsaXN0LiBUaGUgb3JkZXIgbXVzdCBtYXRjaCB0aGUgb25lIGRlc2NyaWJlZCBhYm92ZS4KKyMgTm90ZTogV2UgdXNlIHRoZSBob3N0IHZhcmlhbnQgb2YgImNvcmUtaWN1NGoiIGFuZCAiY29uc2NyeXB0IiBmb3IgdGVzdGluZy4KK1BST0RVQ1RfVEVTVF9PTkxZX0FSVF9CT09UX0lNQUdFX0pBUlMgOj0gXAorICAgICQoQVJUX0FQRVhfSkFSUykgXAorICAgIHBsYXRmb3JtOmNvcmUtaWN1NGotaG9zdCBcCisgICAgcGxhdGZvcm06Y29uc2NyeXB0LWhvc3QgXAorCiAjIC9zeXN0ZW0gYW5kIC9zeXN0ZW1fZXh0IGJvb3QgamFycy4KIFBST0RVQ1RfQk9PVF9KQVJTICs9IFwKICAgICBmcmFtZXdvcmstbWludXMtYXBleCBcCiAgICAgZnJhbWV3b3JrLWdyYXBoaWNzIFwKKyAgICBmcmFtZXdvcmstbG9jYXRpb24gXAogICAgIGV4dCBcCiAgICAgdGVsZXBob255LWNvbW1vbiBcCiAgICAgdm9pcC1jb21tb24gXAogICAgIGltcy1jb21tb24KIAogIyBBUEVYIGJvb3QgamFycy4gS2VlcCB0aGUgbGlzdCBzb3J0ZWQgYnkgbW9kdWxlIG5hbWVzIGFuZCB0aGVuIGxpYnJhcnkgbmFtZXMuCisjIE5vdGU6IElmIHRoZSBleGlzdGluZyBhcGV4IGludHJvZHVjZXMgdGhlIG5ldyBqYXIsIGFsc28gYWRkIGl0IHRvCisjIFBST0RVQ1RfQVBFWF9CT09UX0pBUlNfRk9SX1NPVVJDRV9CVUlMRF9PTkxZIGJlbG93LgogIyBOb3RlOiBjb3JlLWljdTRqIGlzIG1vdmVkIGJhY2sgdG8gUFJPRFVDVF9CT09UX0pBUlMgaW4gcHJvZHVjdF9jb25maWcubWsgYXQgYSBsYXRlciBzdGFnZS4KICMgTm90ZTogRm9yIG1vZHVsZXMgYXZhaWxhYmxlIGluIFEsIERPIE5PVCBhZGQgbmV3IGVudHJpZXMgaGVyZS4KIFBST0RVQ1RfQVBFWF9CT09UX0pBUlMgOj0gXApAQCAtNjMsNiArNzQsOCBAQAogICAgIGNvbS5hbmRyb2lkLmlwc2VjOmFuZHJvaWQubmV0Lmlwc2VjLmlrZSBcCiAgICAgY29tLmFuZHJvaWQubWVkaWE6dXBkYXRhYmxlLW1lZGlhIFwKICAgICBjb20uYW5kcm9pZC5tZWRpYXByb3ZpZGVyOmZyYW1ld29yay1tZWRpYXByb3ZpZGVyIFwKKyAgICBjb20uYW5kcm9pZC5tZWRpYXByb3ZpZGVyOmZyYW1ld29yay1wZGYgXAorICAgIGNvbS5hbmRyb2lkLm1lZGlhcHJvdmlkZXI6ZnJhbWV3b3JrLXBkZi12IFwKICAgICBjb20uYW5kcm9pZC5vbmRldmljZXBlcnNvbmFsaXphdGlvbjpmcmFtZXdvcmstb25kZXZpY2VwZXJzb25hbGl6YXRpb24gXAogICAgIGNvbS5hbmRyb2lkLm9zLnN0YXRzZDpmcmFtZXdvcmstc3RhdHNkIFwKICAgICBjb20uYW5kcm9pZC5wZXJtaXNzaW9uOmZyYW1ld29yay1wZXJtaXNzaW9uIFwKQEAgLTc2LDYgKzg5LDMwIEBACiAgICAgY29tLmFuZHJvaWQudmlydDpmcmFtZXdvcmstdmlydHVhbGl6YXRpb24gXAogICAgIGNvbS5hbmRyb2lkLndpZmk6ZnJhbWV3b3JrLXdpZmkgXAogCisjIFdoZW4gd2UgcmVsZWFzZSBjcmFzaHJlY292ZXJ5IG1vZHVsZQoraWZlcSAoJChSRUxFQVNFX0NSQVNIUkVDT1ZFUllfTU9EVUxFKSx0cnVlKQorICBQUk9EVUNUX0FQRVhfQk9PVF9KQVJTICs9IFwKKyAgICAgICAgY29tLmFuZHJvaWQuY3Jhc2hyZWNvdmVyeTpmcmFtZXdvcmstY3Jhc2hyZWNvdmVyeSBcCisKK2VuZGlmCisKKyMgQ2hlY2sgaWYgdGhlIGJ1aWxkIHN1cHBvcnRzIE5GQyBhcGV4IG9yIG5vdAoraWZlcSAoJChSRUxFQVNFX1BBQ0tBR0VfTkZDX1NUQUNLKSxOZmNOY2kpCisgICAgUFJPRFVDVF9CT09UX0pBUlMgKz0gXAorICAgICAgICBmcmFtZXdvcmstbmZjCitlbHNlCisgICAgUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLm5mY3NlcnZpY2VzOmZyYW1ld29yay1uZmMKKyAgICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLG5mY19hcGV4X2Jvb3RjbGFzc3BhdGhfZnJhZ21lbnQsdHJ1ZSkKK2VuZGlmCisKKyMgQ2hlY2sgaWYgYnVpbGQgc3VwcG9ydHMgUHJvZmlsaW5nIG1vZHVsZS4KK2lmZXEgKCQoUkVMRUFTRV9QQUNLQUdFX1BST0ZJTElOR19NT0RVTEUpLHRydWUpCisgICAgUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLnByb2ZpbGluZzpmcmFtZXdvcmstcHJvZmlsaW5nIFwKKworZW5kaWYKKwogIyBMaXN0IG9mIHN5c3RlbV9zZXJ2ZXIgY2xhc3NwYXRoIGphcnMgZGVsaXZlcmVkIHZpYSBhcGV4LgogIyBLZWVwIHRoZSBsaXN0IHNvcnRlZCBieSBtb2R1bGUgbmFtZXMgYW5kIHRoZW4gbGlicmFyeSBuYW1lcy4KICMgTm90ZTogRm9yIG1vZHVsZXMgYXZhaWxhYmxlIGluIFEsIERPIE5PVCBhZGQgbmV3IGVudHJpZXMgaGVyZS4KQEAgLTkxLDYgKzEyOCwxNyBAQAogICAgIGNvbS5hbmRyb2lkLnBlcm1pc3Npb246c2VydmljZS1wZXJtaXNzaW9uIFwKICAgICBjb20uYW5kcm9pZC5ya3BkOnNlcnZpY2UtcmtwIFwKIAorIyBXaGVuIHdlIHJlbGVhc2UgY3Jhc2hyZWNvdmVyeSBtb2R1bGUKK2lmZXEgKCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSksdHJ1ZSkKKyAgUFJPRFVDVF9BUEVYX1NZU1RFTV9TRVJWRVJfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLmNyYXNocmVjb3Zlcnk6c2VydmljZS1jcmFzaHJlY292ZXJ5IFwKKworZW5kaWYKKworaWZlcSAoJChSRUxFQVNFX0FWRl9FTkFCTEVfTExQVk1fQ0hBTkdFUyksdHJ1ZSkKKyAgUFJPRFVDVF9BUEVYX1NZU1RFTV9TRVJWRVJfSkFSUyArPSBjb20uYW5kcm9pZC52aXJ0OnNlcnZpY2UtdmlydHVhbGl6YXRpb24KK2VuZGlmCisKICMgVXNlICQod2lsZGNhcmQpIHRvIGF2b2lkIHJlZmVyZW5jaW5nIHRoZSBwcm9maWxlIGluIHRoaW4gbWFuaWZlc3RzIHRoYXQgZG9uJ3QgaGF2ZSB0aGUKICMgYXJ0IHByb2plY3QuCiBpZm5lcSAoLCQod2lsZGNhcmQgYXJ0KSkKQEAgLTExMyw2ICsxNjEsMjAgQEAKICAgICBjb20uYW5kcm9pZC51d2I6c2VydmljZS11d2IgXAogICAgIGNvbS5hbmRyb2lkLndpZmk6c2VydmljZS13aWZpIFwKIAorIyBDaGVjayBpZiBidWlsZCBzdXBwb3J0cyBQcm9maWxpbmcgbW9kdWxlLgoraWZlcSAoJChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSksdHJ1ZSkKKyAgICBQUk9EVUNUX0FQRVhfU1RBTkRBTE9ORV9TWVNURU1fU0VSVkVSX0pBUlMgKz0gXAorICAgICAgICBjb20uYW5kcm9pZC5wcm9maWxpbmc6c2VydmljZS1wcm9maWxpbmcgXAorCitlbmRpZgorCisjIE92ZXJyaWRlcyB0aGUgKGFwZXgsIGphcikgcGFpcnMgYWJvdmUgd2hlbiBkZXRlcm1pbmluZyB0aGUgb24tZGV2aWNlIGxvY2F0aW9uLiBUaGUgZm9ybWF0IGlzOgorIyA8b2xkX2FwZXg+OjxvbGRfamFyPjo8bmV3X2FwZXg+OjxuZXdfamFyPgorUFJPRFVDVF9DT05GSUdVUkVEX0pBUl9MT0NBVElPTl9PVkVSUklERVMgOj0gXAorICAgIHBsYXRmb3JtOmZyYW1ld29yay1taW51cy1hcGV4OnBsYXRmb3JtOmZyYW1ld29yayBcCisgICAgcGxhdGZvcm06Y29yZS1pY3U0ai1ob3N0OmNvbS5hbmRyb2lkLmkxOG46Y29yZS1pY3U0aiBcCisgICAgcGxhdGZvcm06Y29uc2NyeXB0LWhvc3Q6Y29tLmFuZHJvaWQuY29uc2NyeXB0OmNvbnNjcnlwdCBcCisKICMgTWluaW1hbCBjb25maWd1cmF0aW9uIGZvciBydW5uaW5nIGRleDJvYXQgKGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzKS4KICMgUFJPRFVDVF9VU0VTX0RFRkFVTFRfQVJUX0NPTkZJRyBtdXN0IGJlIHRydWUgdG8gZW5hYmxlIGJvb3QgaW1hZ2UgY29tcGlsYXRpb24uCiBQUk9EVUNUX1VTRVNfREVGQVVMVF9BUlRfQ09ORklHIDo9IHRydWUKQEAgLTEyMiw0ICsxODQsNCBAQAogICAgIGRhbHZpay52bS5kZXgyb2F0LVhtcz02NG0gXAogICAgIGRhbHZpay52bS5kZXgyb2F0LVhteD01MTJtIFwKIAotUFJPRFVDVF9FTkFCTEVfVUZGRF9HQyA6PSBmYWxzZSAgIyBUT0RPKGppYWthaXopOiBDaGFuZ2UgdGhpcyB0byAiZGVmYXVsdCIuCitQUk9EVUNUX0VOQUJMRV9VRkZEX0dDIDo9IGRlZmF1bHQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2VtdWxhdG9yX3N5c3RlbS5tayBiL3RhcmdldC9wcm9kdWN0L2VtdWxhdG9yX3N5c3RlbS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlN2NmYS4uMDAwMDAwMAotLS0gYS90YXJnZXQvcHJvZHVjdC9lbXVsYXRvcl9zeXN0ZW0ubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyBUaGlzIGZpbGUgbGlzdHMgZW11bGF0b3IgZXhwZXJpbWVudGFsIG1vZHVsZXMgYWRkZWQgdG8gUFJPRFVDVF9QQUNLQUdFUywKLSMgb25seSBpbmNsdWRlZCBieSB0YXJnZXRzIHNka19waG9uZV94ODYvNjQgYW5kIHNka19ncGhvbmVfeDg2LzY0Ci0KLVBST0RVQ1RfQVJUSUZBQ1RfUEFUSF9SRVFVSVJFTUVOVF9BTExPV0VEX0xJU1QgOj0gXAotICAgIHN5c3RlbS9saWIvbGliZW11bGF0b3JfbXVsdGlkaXNwbGF5X2puaS5zbyBcCi0gICAgc3lzdGVtL2xpYjY0L2xpYmVtdWxhdG9yX211bHRpZGlzcGxheV9qbmkuc28gXAotICAgIHN5c3RlbS9wcml2LWFwcC9NdWx0aURpc3BsYXlQcm92aWRlci9NdWx0aURpc3BsYXlQcm92aWRlci5hcGsgXAotCi1QUk9EVUNUX1BBQ0tBR0VTICs9IE11bHRpRGlzcGxheVByb3ZpZGVyCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWsgYi90YXJnZXQvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWIyNzUuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZW11bGF0b3JfdmVuZG9yLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIwotIyBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgb3RoZXIgcHJvZHVjdCBtYWtlZmlsZXMgdG8gYWRkIGFsbCB0aGUKLSMgZW11bGF0b3ItcmVsYXRlZCBtb2R1bGVzIHRvIFBST0RVQ1RfUEFDS0FHRVMuCi0jCi0KLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvaGFuZGhlbGRfdmVuZG9yLm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC90ZWxlcGhvbnlfdmVuZG9yLm1rKQotCi0jIG5lZWQgdGhpcyBmb3IgZ2xlcyBsaWJyYXJpZXMgdG8gbG9hZCBwcm9wZXJseQotIyBhZnRlciBtb3ZpbmcgdG8gL3ZlbmRvci9saWIvCi1QUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICB2bmRrLXNwCi0KLURFVklDRV9QQUNLQUdFX09WRVJMQVlTIDo9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL292ZXJsYXkKLQotUFJPRFVDVF9DSEFSQUNURVJJU1RJQ1MgOj0gZW11bGF0b3IKLQotUFJPRFVDVF9GVUxMX1RSRUJMRV9PVkVSUklERSA6PSB0cnVlCi0KLSMgZ29sZGZpc2ggdmVuZG9yIHBhcnRpdGlvbiBjb25maWd1cmF0aW9ucwotJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3ZlbmRvci5taykKLQotI3dhdGNoZG9nIHRpZ2dlcnMgcmVib290IGJlY2F1c2UgbG9jYXRpb24gc2VydmljZSBpcyBub3QKLSNyZXNwb25kaW5nLCBkaXNibGUgaXQgZm9yIG5vdy4KLSNzdGlsbCBrZWVwIGl0IG9uIGludGVybmFsIG1haW4gKG1hc3RlcikgYXMgaXQgaXMgc3RpbGwgd29ya2luZwotI29uY2UgaXQgaXMgZml4ZWQgaW4gYW9zcCwgcmVtb3ZlIHRoaXMgYmxvY2sgb2YgY29tbWVudC4KLSNQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKLSNjb25maWcuZGlzYWJsZV9sb2NhdGlvbj10cnVlCi0KLSMgZW5hYmxlIEdvb2dsZS1zcGVjaWZpYyBsb2NhdGlvbiBmZWF0dXJlcywKLSMgbGlrZSBOZXR3b3JrTG9jYXRpb25Qcm92aWRlciBhbmQgTG9jYXRpb25Db2xsZWN0b3IKLVBST0RVQ1RfU1lTVEVNX0VYVF9QUk9QRVJUSUVTICs9IFwKLSAgICByby5jb20uZ29vZ2xlLmxvY2F0aW9uZmVhdHVyZXM9MQotCi0jIGRpc2FibGUgc2V0dXB3aXphcmQKLVBST0RVQ1RfU1lTVEVNX0VYVF9QUk9QRVJUSUVTICs9IFwKLSAgICByby5zZXR1cHdpemFyZC5tb2RlPz1ESVNBQkxFRApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZnVsbC5tYW5pZmVzdC54bWwgYi90YXJnZXQvcHJvZHVjdC9mdWxsLm1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGIwZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbC5tYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyIEBACis8bWFuaWZlc3QgdmVyc2lvbj0iMS4wIiB0eXBlPSJkZXZpY2UiIHRhcmdldC1sZXZlbD0iNyI+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZnVsbC5tayBiL3RhcmdldC9wcm9kdWN0L2Z1bGwubWsKaW5kZXggOTQ1OTU3Zi4uZGEwNGY0OSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZnVsbC5taworKysgYi90YXJnZXQvcHJvZHVjdC9mdWxsLm1rCkBAIC0yMCwxMCArMjAsMTEgQEAKICMgZW50aXJlbHkgYXBwcm9wcmlhdGUgdG8gaW5oZXJpdCBmcm9tIGZvciBvbi1kZXZpY2UgY29uZmlndXJhdGlvbnMuCiAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3JhbWRpc2tfc3R1Yi5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZW11bGF0b3JfdmVuZG9yLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hb3NwX2Jhc2VfdGVsZXBob255Lm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvZ2VuZXJpYy9kZXZpY2UubWspCiAKK0RFVklDRV9NQU5JRkVTVF9GSUxFICs9IGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvZnVsbC5tYW5pZmVzdC54bWwKKwogIyBFbmFibGUgZHluYW1pYyBwYXJ0aXRpb24gc2l6ZQogUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05fU0laRSA6PSB0cnVlCiAKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Z1bGxfeDg2Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbF94ODYubWsKaW5kZXggMGYzYmU5MS4uMDdmNjQ3MiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZnVsbF94ODYubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbF94ODYubWsKQEAgLTIzLDEwICsyMywxMSBAQAogIyB0aGF0IGlzbid0IGEgd2lmaSBjb25uZWN0aW9uLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgaW5pdC5yYyB0byBlbmFibGUgdGhlCiAjIG5ldHdvcmsgY29ubmVjdGlvbiBzbyB0aGF0IHlvdSBjYW4gdXNlIGl0IHdpdGggQURCCiAKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZW11bGF0b3JfdmVuZG9yLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hb3NwX2Jhc2VfdGVsZXBob255Lm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvZ2VuZXJpY194ODYvZGV2aWNlLm1rKQogCitERVZJQ0VfTUFOSUZFU1RfRklMRSArPSBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2Z1bGwubWFuaWZlc3QueG1sCisKIGlmZGVmIE5FVF9FVEgwX1NUQVJUT05CT09UCiAgIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gbmV0LmV0aDAuc3RhcnRvbmJvb3Q9MQogZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Z1bGxtdGUubWsgYi90YXJnZXQvcHJvZHVjdC9mdWxsbXRlLm1rCmluZGV4IGQ0N2M2ODUuLmI2MjI0OTYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Z1bGxtdGUubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbG10ZS5tawpAQCAtMjQsMyArMjQsNCBAQAogICBTQU5JVElaRV9UQVJHRVRfRElBRyA6PSAkKHN0cmlwICQoU0FOSVRJWkVfVEFSR0VUX0RJQUcpIG1lbXRhZ19oZWFwKQogZW5kaWYKIFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHBlcnNpc3QuYXJtNjQubWVtdGFnLmRlZmF1bHQ9c3luYworUFJPRFVDVF9TQ1VET19BTExPQ0FUSU9OX1JJTkdfQlVGRkVSX1NJWkUgOj0gMTMxMDcyCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy5tawppbmRleCBmYjViNzI3Li5mZDNiM2ZiIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWMubWsKQEAgLTE0LDkgKzE0LDYgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCAjIGZvciBsaWJ3aWZpLWhhbC1lbXUKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC1vcGVuZ2wgIyBmb3IgZ29sZGZpc2ggZGVwcy4KLQogIyBUaGlzIGlzIGEgZ2VuZXJpYyBwaG9uZSBwcm9kdWN0IHRoYXQgaXNuJ3Qgc3BlY2lhbGl6ZWQgZm9yIGEgc3BlY2lmaWMgZGV2aWNlLgogIyBJdCBpbmNsdWRlcyB0aGUgYmFzZSBBbmRyb2lkIHBsYXRmb3JtLgogCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX3N5c3RlbS5tayBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCmluZGV4IDk4ZDYwNDYuLjBhMDllYjEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCkBAIC0zNiw2ICszNiwxMSBAQAogICAgIFN0ayBcCiAgICAgVGFnIFwKIAoraWZlcSAoJChSRUxFQVNFX0FWQVRBUl9QSUNLRVJfQVBQKSx0cnVlKQorICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBBdmF0YXJQaWNrZXIKK2VuZGlmCisKICMgT1RBIHN1cHBvcnQKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHJlY292ZXJ5LXJlZnJlc2ggXApAQCAtNjgsNyArNzMsNiBAQAogICAgIGFuZHJvaWQuaGFyZHdhcmUucmFkaW8uY29uZmlnQDEuMCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5kZXByZWNhdGVkQDEuMCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5zZWN1cmVfZWxlbWVudEAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUud2lmaSBcCiAgICAgbGliYXVkaW8tcmVzYW1wbGVyIFwKICAgICBsaWJhdWRpb2hhbCBcCiAgICAgbGliZHJtIFwKQEAgLTEwMywxMSArMTA3LDIyIEBACiAgICAgbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUgXAogICAgIGxpYnBvbGljeS1zdWJzeXN0ZW0KIAorIyBBZGQgYWxsIG9mIHRoZSBwYWNrYWdlcyB1c2VkIHRvIHN1cHBvcnQgb2xkZXIvdXBncmFkaW5nIGRldmljZXMKKyMgVGhlc2UgY2FuIGJlIHJlbW92ZWQgYXMgd2UgZHJvcCBzdXBwb3J0IGZvciB0aGUgb2xkZXIgQVBJIGxldmVscworUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgJChQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8yOSkgXAorICAgICQoUFJPRFVDVF9QQUNLQUdFU19TSElQUElOR19BUElfTEVWRUxfMzMpIFwKKyAgICAkKFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0KQorCiAjIEluY2x1ZGUgYWxsIHp5Z290ZSBpbml0IHNjcmlwdHMuICJyby56eWdvdGUiIHdpbGwgc2VsZWN0IG9uZSBvZiB0aGVtLgotUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKLSAgICBzeXN0ZW0vY29yZS9yb290ZGlyL2luaXQuenlnb3RlMzIucmM6c3lzdGVtL2V0Yy9pbml0L2h3L2luaXQuenlnb3RlMzIucmMgXAotICAgIHN5c3RlbS9jb3JlL3Jvb3RkaXIvaW5pdC56eWdvdGU2NC5yYzpzeXN0ZW0vZXRjL2luaXQvaHcvaW5pdC56eWdvdGU2NC5yYyBcCi0gICAgc3lzdGVtL2NvcmUvcm9vdGRpci9pbml0Lnp5Z290ZTY0XzMyLnJjOnN5c3RlbS9ldGMvaW5pdC9ody9pbml0Lnp5Z290ZTY0XzMyLnJjIFwKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGluaXQuenlnb3RlMzIucmMgXAorICAgIGluaXQuenlnb3RlNjQucmMgXAorICAgIGluaXQuenlnb3RlNjRfMzIucmMKKworIyBTdXBwb3J0IENyZWRlbnRpYWwgTWFuYWdlcgorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgYW5kcm9pZC5zb2Z0d2FyZS5jcmVkZW50aWFscy5wcmVidWlsdC54bWwKIAogIyBFbmFibGUgZHluYW1pYyBwYXJ0aXRpb24gc2l6ZQogUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05fU0laRSA6PSB0cnVlCkBAIC0xMzUsMyArMTUwLDYgQEAKICAgJChUQVJHRVRfQ09QWV9PVVRfU1lTVEVNKS8gXAogCiAkKGNhbGwgcmVxdWlyZS1hcnRpZmFjdHMtaW4tcGF0aCwgJChfbXlfcGF0aHMpLCAkKF9teV9hbGxvd2VkX2xpc3QpKQorCisjIFByb2R1Y3QgY29uZmlnIG1hcCB0byB0b2dnbGUgYmV0d2VlbiBzb3VyY2VzIGFuZCBwcmVidWlsdHMgb2YgcmVxdWlyZWQgbWFpbmxpbmUgbW9kdWxlcworUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTICs9ICQod2lsZGNhcmQgdmVuZG9yL2dvb2dsZV9zaGFyZWQvYnVpbGQvcmVsZWFzZS9nbXNfbWFpbmxpbmUvcmVxdWlyZWQvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHMubWsKaW5kZXggYjcxNzQ4Ni4uYzkyODUzMCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHMubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHMubWsKQEAgLTE3LDYgKzE3LDkgQEAKICMgSW5oZXJpdCBjb21tb24gQW5kcm9pZCBHbyBkZWZhdWx0cy4KICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHNfY29tbW9uLm1rKQogCisjIFByb2R1Y3QgY29uZmlnIG1hcCB0byB0b2dnbGUgYmV0d2VlbiBzb3VyY2VzIGFuZCBwcmVidWlsdHMgb2YgcmVxdWlyZWQgbWFpbmxpbmUgbW9kdWxlcworUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTICs9ICQod2lsZGNhcmQgdmVuZG9yL2dvb2dsZV9zaGFyZWQvYnVpbGQvcmVsZWFzZS9nbXNfbWFpbmxpbmVfZ28vcmVxdWlyZWQvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykKKwogIyBBZGQgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzLgogVEFSR0VUX1NZU1RFTV9QUk9QICs9IFwKICAgICBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9nb19kZWZhdWx0cy5wcm9wCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsgYi90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsKaW5kZXggNTFhMWVmNi4uNTIxOGYyOSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHNfY29tbW9uLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5tawpAQCAtMjQsMTAgKzI0LDYgQEAKICMgU3BlZWQgcHJvZmlsZSBzZXJ2aWNlcyBhbmQgd2lmaS1zZXJ2aWNlIHRvIHJlZHVjZSBSQU0gYW5kIHN0b3JhZ2UuCiBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSIDo9IHNwZWVkLXByb2ZpbGUKIAotIyBBbHdheXMgcHJlb3B0IGV4dHJhY3RlZCBBUEtzIHRvIHByZXZlbnQgZXh0cmFjdGluZyBvdXQgb2YgdGhlIEFQSyBmb3IgZ21zCi0jIG1vZHVsZXMuCi1QUk9EVUNUX0FMV0FZU19QUkVPUFRfRVhUUkFDVEVEX0FQSyA6PSB0cnVlCi0KICMgVXNlIGEgcHJvZmlsZSBiYXNlZCBib290IGltYWdlIGZvciB0aGlzIGRldmljZS4gTm90ZSB0aGF0IHRoaXMgaXMgY3VycmVudGx5IGEKICMgZ2VuZXJpYyBwcm9maWxlIGFuZCBub3QgQW5kcm9pZCBHbyBvcHRpbWl6ZWQuCiBQUk9EVUNUX1VTRV9QUk9GSUxFX0ZPUl9CT09UX0lNQUdFIDo9IHRydWUKQEAgLTUzLDYgKzQ5LDMgQEAKICMgdXNlIHRoZSBnbyBzcGVjaWZpYyBoYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbCBmcm9tIGZyYW1ld29ya3MKIFBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCiAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvZ29faGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWw6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9ldGMvcGVybWlzc2lvbnMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWwKLQotIyBEZWR1cGUgVk5ESyBsaWJyYXJpZXMgd2l0aCBpZGVudGljYWwgY29yZSB2YXJpYW50cy4KLVRBUkdFVF9WTkRLX1VTRV9DT1JFX1ZBUklBTlQgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpL0FuZHJvaWQuYnAgYi90YXJnZXQvcHJvZHVjdC9nc2kvQW5kcm9pZC5icAppbmRleCBhOGFmOWM0Li40NWJhMTQzIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nc2kvQW5kcm9pZC5icAorKysgYi90YXJnZXQvcHJvZHVjdC9nc2kvQW5kcm9pZC5icApAQCAtMjMsMyArMjMsMjYgQEAKICAgICAgICAgIioudHh0IiwKICAgICBdLAogfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJnc2lfc2tpcF9tb3VudC5jZmciLAorICAgIGZpbGVuYW1lOiAic2tpcF9tb3VudC5jZmciLAorICAgIHNyYzogImdzaV9za2lwX21vdW50LmNmZyIsCisKKyAgICBzeXN0ZW1fZXh0X3NwZWNpZmljOiB0cnVlLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImluaXQvY29uZmlnIiwKKworICAgIHJlcXVpcmVkOiBbImdzaV9za2lwX21vdW50X2NvbXBhdF9zeW1saW5rIl0sCit9CisKKy8vIEFkZHMgYSBzeW1saW5rIHVuZGVyIC9zeXN0ZW0vZXRjL2luaXQvY29uZmlnIHBvaW50aW5nIHRvIC9zeXN0ZW0vc3lzdGVtX2V4dC9ldGMvaW5pdC9jb25maWcKKy8vIGJlY2F1c2UgZmlyc3Qtc3RhZ2UgaW5pdCBpbiBBbmRyb2lkIDEwLjAgd2lsbCByZWFkIHRoZSBza2lwX21vdW50LmNmZyBmcm9tIC9zeXN0ZW0vZXRjLyogYWZ0ZXIKKy8vIGNocm9vdCAvc3lzdGVtLgorLy8gVE9ETzogcmVtb3ZlIHRoaXMgc3ltbGluayB3aGVuIG5vIG5lZWQgdG8gc3VwcG9ydCBuZXcgR1NJIG9uIEFuZHJvaWQgMTAuCisvLyBUaGUgYWN0dWFsIGZpbGUgbmVlZHMgdG8gYmUgdW5kZXIgL3N5c3RlbS9zeXN0ZW1fZXh0IGJlY2F1c2UgaXQncyBHU0ktc3BlY2lmaWMgYW5kIGRvZXMgbm90CisvLyBiZWxvbmcgdG8gY29yZSBDU0kuCitpbnN0YWxsX3N5bWxpbmsgeworICAgIG5hbWU6ICJnc2lfc2tpcF9tb3VudF9jb21wYXRfc3ltbGluayIsCisgICAgaW5zdGFsbGVkX2xvY2F0aW9uOiAiZXRjL2luaXQvY29uZmlnIiwKKyAgICBzeW1saW5rX3RhcmdldDogIi9zeXN0ZW0vc3lzdGVtX2V4dC9ldGMvaW5pdC9jb25maWciLAorfQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpL0FuZHJvaWQubWsgYi90YXJnZXQvcHJvZHVjdC9nc2kvQW5kcm9pZC5tawppbmRleCAxMDdjOTRmLi4zNjg5N2ZlIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nc2kvQW5kcm9pZC5taworKysgYi90YXJnZXQvcHJvZHVjdC9nc2kvQW5kcm9pZC5tawpAQCAtMSwxMTMgKzEsNjAgQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgbGlzdCBvZiB2bmRrIGxpYnJhcmllcyBmcm9tIHRoZSBzb3VyY2UgY29kZS4KLUlOVEVSTkFMX1ZOREtfTElCX0xJU1QgOj0gJChTT09OR19WTkRLX0xJQlJBUklFU19GSUxFKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBpcyB0aGUgdXAtdG8tZGF0ZSBsaXN0IG9mIHZuZGsgbGlicy4KLSMgVE9ETyhiLzYyMDEyMjg1KTogdGhlIGxpYiBsaXN0IHNob3VsZCBiZSBzdG9yZWQgc29tZXdoZXJlIHVuZGVyCi0jIC9wcmVidWlsdHMvdm5kawotaWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCi1MQVRFU1RfVk5ES19MSUJfTElTVCA6PSAkKExPQ0FMX1BBVEgpLyQoUExBVEZPUk1fVk5ES19WRVJTSU9OKS50eHQKLWlmZXEgKCQod2lsZGNhcmQgJChMQVRFU1RfVk5ES19MSUJfTElTVCkpLCkKLSQoZXJyb3IgJChMQVRFU1RfVk5ES19MSUJfTElTVCkgZmlsZSBub3QgZm91bmQuIFBsZWFzZSBjb3B5ICIkKExPQ0FMX1BBVEgpL2N1cnJlbnQudHh0IiB0byAiJChMQVRFU1RfVk5ES19MSUJfTElTVCkiIGFuZCBjb21taXQgYSBDTCBmb3IgcmVsZWFzZSBicmFuY2gpCi1lbmRpZgotZWxzZQotTEFURVNUX1ZOREtfTElCX0xJU1QgOj0gJChMT0NBTF9QQVRIKS9jdXJyZW50LnR4dAotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIENoZWNrIHRoZSBnZW5lcmF0ZSBsaXN0IGFnYWluc3QgdGhlIGxhdGVzdCBsaXN0IHN0b3JlZCBpbiB0aGUKICMgc291cmNlIHRyZWUKLS5QSE9OWTogY2hlY2stdm5kay1saXN0CisuUEhPTlk6IGNoZWNrLWFiaS1kdW1wLWxpc3QKIAogIyBDaGVjayBpZiB2bmRrIGxpc3QgaXMgY2hhbmdlZAotZHJvaWRjb3JlOiBjaGVjay12bmRrLWxpc3QKK2Ryb2lkY29yZTogY2hlY2stYWJpLWR1bXAtbGlzdAogCi1jaGVjay12bmRrLWxpc3QtdGltZXN0YW1wIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZuZGspL2NoZWNrLWxpc3QtdGltZXN0YW1wCi1jaGVjay12bmRrLWFiaS1kdW1wLWxpc3QtdGltZXN0YW1wIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZuZGspL2NoZWNrLWFiaS1kdW1wLWxpc3QtdGltZXN0YW1wCitjaGVjay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2bmRrKS9jaGVjay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcAogCi1pZmVxICgkKFRBUkdFVF9JU182NF9CSVQpfCQoVEFSR0VUXzJORF9BUkNIKSx0cnVlfCkKLSMgVE9ETyhiLzExMDQyOTc1NCkgcmVtb3ZlIHRoaXMgY29uZGl0aW9uIHdoZW4gd2Ugc3VwcG9ydCA2NC1iaXQtb25seSBkZXZpY2UKLWNoZWNrLXZuZGstbGlzdDogOwotZWxzZSBpZmVxICgkKFRBUkdFVF9TS0lQX0NVUlJFTlRfVk5ESyksdHJ1ZSkKLWNoZWNrLXZuZGstbGlzdDogOwotZWxzZSBpZmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksKQotIyBiLzE0MzIzMzYyNiBkbyBub3QgY2hlY2sgdm5kay1saXN0IHdoZW4gdm5kayBsaWJzIGFyZSBub3QgYnVpbHQKLWNoZWNrLXZuZGstbGlzdDogOwotZWxzZQotY2hlY2stdm5kay1saXN0OiAkKGNoZWNrLXZuZGstbGlzdC10aW1lc3RhbXApCi1pZm5lcSAoJChTS0lQX0FCSV9DSEVDS1MpLHRydWUpCi1jaGVjay12bmRrLWxpc3Q6ICQoY2hlY2stdm5kay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcCkKKyMgVGhlIEFCSSB0b29sIGRvZXMgbm90IHN1cHBvcnQgc2FuaXRpemVyIGFuZCBjb3ZlcmFnZSBidWlsZHMuCitpZmVxICgsJChmaWx0ZXIgdHJ1ZSwkKFNLSVBfQUJJX0NIRUNLUykgJChDTEFOR19DT1ZFUkFHRSkpKQoraWZlcSAoLCQoU0FOSVRJWkVfVEFSR0VUKSkKK2NoZWNrLWFiaS1kdW1wLWxpc3Q6ICQoY2hlY2stYWJpLWR1bXAtbGlzdC10aW1lc3RhbXApCiBlbmRpZgogZW5kaWYKIAotX3ZuZGtfY2hlY2tfZmFpbHVyZV9tZXNzYWdlIDo9ICIgZXJyb3I6IFZOREsgbGlicmFyeSBsaXN0IGhhcyBiZWVuIGNoYW5nZWQuXG4iCi1pZmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKLV92bmRrX2NoZWNrX2ZhaWx1cmVfbWVzc2FnZSArPSAiICAgICAgIENoYW5naW5nIHRoZSBWTkRLIGxpYnJhcnkgbGlzdCBpcyBub3QgYWxsb3dlZCBpbiBBUEkgbG9ja2VkIGJyYW5jaGVzLiIKLWVsc2UKLV92bmRrX2NoZWNrX2ZhaWx1cmVfbWVzc2FnZSArPSAiICAgICAgIFJ1biBcYHVwZGF0ZS12bmRrLWxpc3Quc2hcYCB0byB1cGRhdGUgJChMQVRFU1RfVk5ES19MSUJfTElTVCkiCi1lbmRpZgotCi0jIFRoZSAqLW5ka19wbGF0Zm9ybS5zbyBsaWJyYXJpZXMgbm8gbG9uZ2VyIGV4aXN0IGFuZCBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBWTkRLIHNldC4gSG93ZXZlciwgdGhleQotIyBjYW4gZXhpc3QgaWYgTkVFRF9BSURMX05ES19QTEFURk9STV9CQUNLRU5EIGlzIHNldCB0byB0cnVlIGZvciBsZWdhY3kgZGV2aWNlcy4gRG9uJ3QgYmUgYm90aGVyZWQKLSMgd2l0aCB0aGUgZXh0cmFuZW91cyBsaWJyYXJpZXMuCi1pZmVxICgkKE5FRURfQUlETF9OREtfUExBVEZPUk1fQkFDS0VORCksdHJ1ZSkKLQlfUkVBRF9JTlRFUk5BTF9WTkRLX0xJQl9MSVNUIDo9IHNlZCAvbmRrX3BsYXRmb3JtLnNvL2QgJChJTlRFUk5BTF9WTkRLX0xJQl9MSVNUKQotZWxzZQotCV9SRUFEX0lOVEVSTkFMX1ZOREtfTElCX0xJU1QgOj0gY2F0ICQoSU5URVJOQUxfVk5ES19MSUJfTElTVCkKLWVuZGlmCi0KLSQoY2hlY2stdm5kay1saXN0LXRpbWVzdGFtcCk6ICQoSU5URVJOQUxfVk5ES19MSUJfTElTVCkgJChMQVRFU1RfVk5ES19MSUJfTElTVCkgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvdXBkYXRlLXZuZGstbGlzdC5zaAotCSQoaGlkZSkgKCQoX1JFQURfSU5URVJOQUxfVk5ES19MSUJfTElTVCkgfCBzb3J0IHwgXAotCWRpZmYgLS1vbGQtbGluZS1mb3JtYXQ9IlJlbW92ZWQgJUwiIFwKLQkgIC0tbmV3LWxpbmUtZm9ybWF0PSJBZGRlZCAlTCIgXAotCSAgLS11bmNoYW5nZWQtbGluZS1mb3JtYXQ9IiIgXAotCSAgPChjYXQgJChMQVRFU1RfVk5ES19MSUJfTElTVCkgfCBzb3J0KSAtIFwKLQkgIHx8ICggZWNobyAtZSAkKF92bmRrX2NoZWNrX2ZhaWx1cmVfbWVzc2FnZSk7IGV4aXQgMSApKQotCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0JJChoaWRlKSB0b3VjaCAkQAotCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU2NyaXB0IHRvIHVwZGF0ZSB0aGUgbGF0ZXN0IFZOREsgbGliIGxpc3QKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IHVwZGF0ZS12bmRrLWxpc3Quc2gKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVYRUNVVEFCTEVTCi1MT0NBTF9NT0RVTEVfU1RFTSA6PSAkKExPQ0FMX01PRFVMRSkKLUxPQ0FMX0lTX0hPU1RfTU9EVUxFIDo9IHRydWUKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9JTlRFUk5BTF9WTkRLX0xJQl9MSVNUIDo9ICQoSU5URVJOQUxfVk5ES19MSUJfTElTVCkKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9MQVRFU1RfVk5ES19MSUJfTElTVCA6PSAkKExBVEVTVF9WTkRLX0xJQl9MSVNUKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOgotCUBlY2hvICJHZW5lcmF0ZTogJEAiCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCUBybSAtZiAkQAotCSQoaGlkZSkgZWNobyAiIyEvYmluL2Jhc2giID4gJEAKLWlmZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQotCSQoaGlkZSkgZWNobyAiZWNobyBVcGRhdGluZyBWTkRLIGxpYnJhcnkgbGlzdCBpcyBOT1QgYWxsb3dlZCBpbiBBUEkgbG9ja2VkIGJyYW5jaGVzLiIgPj4gJEA7IFwKLQkgICAgICAgIGVjaG8gImV4aXQgMSIgPj4gJEAKLWVsc2UKLQkkKGhpZGUpIGVjaG8gImlmIFsgLXogXCJcJCR7QU5EUk9JRF9CVUlMRF9UT1B9XCIgXTsgdGhlbiIgPj4gJEA7IFwKLQkgICAgICAgIGVjaG8gIiAgZWNobyBSdW4gbHVuY2ggb3IgY2hvb3NlY29tYm8gZmlyc3QiID4+ICRAOyBcCi0JICAgICAgICBlY2hvICIgIGV4aXQgMSIgPj4gJEA7IFwKLQkgICAgICAgIGVjaG8gImZpIiA+PiAkQDsgXAotCSAgICAgICAgZWNobyAiY2QgXCQke0FORFJPSURfQlVJTERfVE9QfSIgPj4gJEAKLWlmZXEgKCQoTkVFRF9BSURMX05ES19QTEFURk9STV9CQUNLRU5EKSx0cnVlKQotCSQoaGlkZSkgZWNobyAic2VkIC9uZGtfcGxhdGZvcm0uc28vZCAkKFBSSVZBVEVfSU5URVJOQUxfVk5ES19MSUJfTElTVCkgPiAkKFBSSVZBVEVfTEFURVNUX1ZOREtfTElCX0xJU1QpIiA+PiAkQAotZWxzZQotCSQoaGlkZSkgZWNobyAiY3AgJChQUklWQVRFX0lOVEVSTkFMX1ZOREtfTElCX0xJU1QpICQoUFJJVkFURV9MQVRFU1RfVk5ES19MSUJfTElTVCkiID4+ICRACi1lbmRpZgotCSQoaGlkZSkgZWNobyAiZWNobyAkKFBSSVZBVEVfTEFURVNUX1ZOREtfTElCX0xJU1QpIHVwZGF0ZWQuIiA+PiAkQAotZW5kaWYKLQlAY2htb2QgYSt4ICRACisjIEFCSSByZWZlcmVuY2UgZHVtcHMuCisKKyMgTFNEVU1QX1BBVEhTIGlzIGEgbGlzdCBvZiB0YWc6cGF0aC4gVGhleSBhcmUgd3JpdHRlbiB0byBMU0RVTVBfUEFUSFNfRklMRS4KK0xTRFVNUF9QQVRIU19GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2xzZHVtcF9wYXRocy50eHQKKworJChMU0RVTVBfUEFUSFNfRklMRSk6IFBSSVZBVEVfTFNEVU1QX1BBVEhTIDo9ICQoTFNEVU1QX1BBVEhTKQorJChMU0RVTVBfUEFUSFNfRklMRSk6CisJQGVjaG8gIkdlbmVyYXRlICRAIgorCUBybSAtcmYgJEAgJiYgZWNobyAtZSAiJChzdWJzdCA6LDokKHNwYWNlKSwkKHN1YnN0ICQoc3BhY2UpLFxuLCQoUFJJVkFURV9MU0RVTVBfUEFUSFMpKSkiID4gJEAKKworIyAkKDEpOiBBIGxpc3Qgb2YgdGFncy4KKyMgJCgyKTogQSBsaXN0IG9mIHRhZzpwYXRoLgorIyBSZXR1cm4gdGhlIGZpbGUgcGF0aHMgb2YgdGhlIEFCSSBkdW1wcyB0aGF0IG1hdGNoIHRoZSB0YWdzLgorZGVmaW5lIGZpbHRlci1hYmktZHVtcC1wYXRocworJChldmFsIHRhZ19wYXR0ZXJucyA6PSAkKGFkZHN1ZmZpeCA6JSwkKDEpKSkKKyQocGF0c3Vic3QgJCh0YWdfcGF0dGVybnMpLCUsJChmaWx0ZXIgJCh0YWdfcGF0dGVybnMpLCQoMikpKQorZW5kZWYKKworIyBTdWJzZXRzIG9mIExTRFVNUF9QQVRIUy4KKy5QSE9OWTogZmluZGxzZHVtcHNfQVBFWAorZmluZGxzZHVtcHNfQVBFWDogJChMU0RVTVBfUEFUSFNfRklMRSkgJChjYWxsIGZpbHRlci1hYmktZHVtcC1wYXRocyxBUEVYLCQoTFNEVU1QX1BBVEhTKSkKKworLlBIT05ZOiBmaW5kbHNkdW1wc19MTE5ESworZmluZGxzZHVtcHNfTExOREs6ICQoTFNEVU1QX1BBVEhTX0ZJTEUpICQoY2FsbCBmaWx0ZXItYWJpLWR1bXAtcGF0aHMsTExOREssJChMU0RVTVBfUEFUSFMpKQorCisuUEhPTlk6IGZpbmRsc2R1bXBzX05ESworZmluZGxzZHVtcHNfTkRLOiAkKExTRFVNUF9QQVRIU19GSUxFKSAkKGNhbGwgZmlsdGVyLWFiaS1kdW1wLXBhdGhzLE5ESywkKExTRFVNUF9QQVRIUykpCisKKy5QSE9OWTogZmluZGxzZHVtcHNfUExBVEZPUk0KK2ZpbmRsc2R1bXBzX1BMQVRGT1JNOiAkKExTRFVNUF9QQVRIU19GSUxFKSAkKGNhbGwgZmlsdGVyLWFiaS1kdW1wLXBhdGhzLFBMQVRGT1JNLCQoTFNEVU1QX1BBVEhTKSkKKworLlBIT05ZOiBmaW5kbHNkdW1wcworZmluZGxzZHVtcHM6ICQoTFNEVU1QX1BBVEhTX0ZJTEUpICQoZm9yZWFjaCBwLCQoTFNEVU1QX1BBVEhTKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQocCkpKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgQ2hlY2sgdGhhdCBhbGwgQUJJIHJlZmVyZW5jZSBkdW1wcyBoYXZlIGNvcnJlc3BvbmRpbmcKLSMgTkRLL1ZOREsvUExBVEZPUk0gbGlicmFyaWVzLgorIyBBUEVYL0xMTkRLL1BMQVRGT1JNIGxpYnJhcmllcy4KIAogIyAkKDEpOiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgQUJJIGR1bXBzLgogIyBSZXR1cm4gYSBsaXN0IG9mIEFCSSBkdW1wIHBhdGhzIGVuZGluZyB3aXRoIC5zby5sc2R1bXAuCkBAIC0xMTksMTI4ICs2Niw3OCBAQAogCiAjICQoMSk6IEEgbGlzdCBvZiB0YWdzLgogIyAkKDIpOiBBIGxpc3Qgb2YgdGFnOnBhdGguCi0jIFJldHVybiB0aGUgZmlsZSBuYW1lcyBvZiB0aGUgQUJJIGR1bXBzIHRoYXQgbWF0Y2ggdGhlIHRhZ3MuCi1kZWZpbmUgZmlsdGVyLWFiaS1kdW1wLXBhdGhzCi0kKGV2YWwgdGFnX3BhdHRlcm5zIDo9ICQoZm9yZWFjaCB0YWcsJCgxKSwkKHRhZyk6JSkpCi0kKG5vdGRpciAkKHBhdHN1YnN0ICQodGFnX3BhdHRlcm5zKSwlLCQoZmlsdGVyICQodGFnX3BhdHRlcm5zKSwkKDIpKSkpCisjIFJldHVybiB0aGUgZmlsZSBuYW1lcyBvZiB0aGUgQUJJIGR1bXBzIHRoYXQgbWF0Y2ggdGhlIHRhZ3MsIGFuZCByZXBsYWNlIHRoZQorIyBmaWxlIG5hbWUgZXh0ZW5zaW9ucyB3aXRoIC5zby5sc2R1bXAuCitkZWZpbmUgZmlsdGVyLWFiaS1kdW1wLW5hbWVzCiskKHBhdHN1YnN0ICUuc28ubGxuZGsubHNkdW1wLCUuc28ubHNkdW1wLCBcCisgICQocGF0c3Vic3QgJS5zby5hcGV4LmxzZHVtcCwlLnNvLmxzZHVtcCwgXAorICAgICQobm90ZGlyICQoY2FsbCBmaWx0ZXItYWJpLWR1bXAtcGF0aHMsJCgxKSwkKDIpKSkpKQogZW5kZWYKIAotVk5ES19BQklfRFVNUF9ESVIgOj0gcHJlYnVpbHRzL2FiaS1kdW1wcy92bmRrLyQoUExBVEZPUk1fVk5ES19WRVJTSU9OKQorVk5ES19BQklfRFVNUF9ESVIgOj0gcHJlYnVpbHRzL2FiaS1kdW1wcy92bmRrLyQoUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwpCiBpZmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKLSAgICBOREtfQUJJX0RVTVBfRElSIDo9IHByZWJ1aWx0cy9hYmktZHVtcHMvbmRrLyQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCiAgICAgUExBVEZPUk1fQUJJX0RVTVBfRElSIDo9IHByZWJ1aWx0cy9hYmktZHVtcHMvcGxhdGZvcm0vJChQTEFURk9STV9TREtfVkVSU0lPTikKIGVsc2UKLSAgICBOREtfQUJJX0RVTVBfRElSIDo9IHByZWJ1aWx0cy9hYmktZHVtcHMvbmRrL2N1cnJlbnQKICAgICBQTEFURk9STV9BQklfRFVNUF9ESVIgOj0gcHJlYnVpbHRzL2FiaS1kdW1wcy9wbGF0Zm9ybS9jdXJyZW50CiBlbmRpZgogVk5ES19BQklfRFVNUFMgOj0gJChjYWxsIGZpbmQtYWJpLWR1bXAtcGF0aHMsJChWTkRLX0FCSV9EVU1QX0RJUikpCi1OREtfQUJJX0RVTVBTIDo9ICQoY2FsbCBmaW5kLWFiaS1kdW1wLXBhdGhzLCQoTkRLX0FCSV9EVU1QX0RJUikpCiBQTEFURk9STV9BQklfRFVNUFMgOj0gJChjYWxsIGZpbmQtYWJpLWR1bXAtcGF0aHMsJChQTEFURk9STV9BQklfRFVNUF9ESVIpKQogCiAjIENoZWNrIGZvciBzdXBlcmZsdW91cyBsc2R1bXAgZmlsZXMuIFNpbmNlIExTRFVNUF9QQVRIUyBvbmx5IGNvdmVycyB0aGUKICMgbGlicmFyaWVzIHRoYXQgY2FuIGJlIGJ1aWx0IGZyb20gc291cmNlIGluIHRoZSBjdXJyZW50IGJ1aWxkLCBhbmQgcHJlYnVpbHRzIG9mCiAjIE1haW5saW5lIG1vZHVsZXMgbWF5IGJlIGluIHVzZSwgd2UgYWxzbyBhbGxvdyB0aGUgbGlicyBpbiBTVFVCX0xJQlJBUklFUyBmb3IKLSMgTkRLIGFuZCBwbGF0Zm9ybSBBQklzLgorIyBwbGF0Zm9ybSBBQklzLgorIyBJbiBhZGRpdGlvbiwgbGliUlMgaXMgYWxsb3dlZCBiZWNhdXNlIGl0J3MgZGlzYWJsZWQgZm9yIFJJU0MtVi4KIAotJChjaGVjay12bmRrLWFiaS1kdW1wLWxpc3QtdGltZXN0YW1wKTogUFJJVkFURV9MU0RVTVBfUEFUSFMgOj0gJChMU0RVTVBfUEFUSFMpCi0kKGNoZWNrLXZuZGstYWJpLWR1bXAtbGlzdC10aW1lc3RhbXApOiBQUklWQVRFX1NUVUJfTElCUkFSSUVTIDo9ICQoU1RVQl9MSUJSQVJJRVMpCi0kKGNoZWNrLXZuZGstYWJpLWR1bXAtbGlzdC10aW1lc3RhbXApOgorJChjaGVjay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcCk6IFBSSVZBVEVfTFNEVU1QX1BBVEhTIDo9ICQoTFNEVU1QX1BBVEhTKQorJChjaGVjay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcCk6IFBSSVZBVEVfU1RVQl9MSUJSQVJJRVMgOj0gJChTVFVCX0xJQlJBUklFUykKKyQoY2hlY2stYWJpLWR1bXAtbGlzdC10aW1lc3RhbXApOgogCSQoZXZhbCBhZGRlZF92bmRrX2FiaV9kdW1wcyA6PSAkKHN0cmlwICQoc29ydCAkKGZpbHRlci1vdXQgXAotCSAgJChjYWxsIGZpbHRlci1hYmktZHVtcC1wYXRocyxWTkRLLVNQIFZOREstY29yZSwkKFBSSVZBVEVfTFNEVU1QX1BBVEhTKSksIFwKKwkgICQoY2FsbCBmaWx0ZXItYWJpLWR1bXAtbmFtZXMsTExOREssJChQUklWQVRFX0xTRFVNUF9QQVRIUykpIGxpYlJTLnNvLmxzZHVtcCwgXAogCSAgJChub3RkaXIgJChWTkRLX0FCSV9EVU1QUykpKSkpKQogCSQoaWYgJChhZGRlZF92bmRrX2FiaV9kdW1wcyksIFwKIAkgIGVjaG8gLWUgIkZvdW5kIHVuZXhwZWN0ZWQgQUJJIHJlZmVyZW5jZSBkdW1wIGZpbGVzIHVuZGVyICQoVk5ES19BQklfRFVNUF9ESVIpLiBJdCBpcyBjYXVzZWQgYnkgbWlzbWF0Y2ggYmV0d2VlbiBBbmRyb2lkLmJwIGFuZCB0aGUgZHVtcCBmaWxlcy4gUnVuIFxgZmluZCBcJCR7QU5EUk9JRF9CVUlMRF9UT1B9LyQoVk5ES19BQklfRFVNUF9ESVIpICcoJyAtbmFtZSAkKHN1YnN0ICQoc3BhY2UpLCAtb3IgLW5hbWUgLCQoYWRkZWRfdm5ka19hYmlfZHVtcHMpKSAnKScgLWRlbGV0ZVxgIHRvIGRlbGV0ZSB0aGUgZHVtcCBmaWxlcy4iKQogCi0JJChldmFsIGFkZGVkX25ka19hYmlfZHVtcHMgOj0gJChzdHJpcCAkKHNvcnQgJChmaWx0ZXItb3V0IFwKLQkgICQoY2FsbCBmaWx0ZXItYWJpLWR1bXAtcGF0aHMsTkRLLCQoUFJJVkFURV9MU0RVTVBfUEFUSFMpKSBcCi0JICAkKGFkZHN1ZmZpeCAubHNkdW1wLCQoUFJJVkFURV9TVFVCX0xJQlJBUklFUykpLCBcCi0JICAkKG5vdGRpciAkKE5ES19BQklfRFVNUFMpKSkpKSkKLQkkKGlmICQoYWRkZWRfbmRrX2FiaV9kdW1wcyksIFwKLQkgIGVjaG8gLWUgIkZvdW5kIHVuZXhwZWN0ZWQgQUJJIHJlZmVyZW5jZSBkdW1wIGZpbGVzIHVuZGVyICQoTkRLX0FCSV9EVU1QX0RJUikuIEl0IGlzIGNhdXNlZCBieSBtaXNtYXRjaCBiZXR3ZWVuIEFuZHJvaWQuYnAgYW5kIHRoZSBkdW1wIGZpbGVzLiBSdW4gXGBmaW5kIFwkJHtBTkRST0lEX0JVSUxEX1RPUH0vJChOREtfQUJJX0RVTVBfRElSKSAnKCcgLW5hbWUgJChzdWJzdCAkKHNwYWNlKSwgLW9yIC1uYW1lICwkKGFkZGVkX25ka19hYmlfZHVtcHMpKSAnKScgLWRlbGV0ZVxgIHRvIGRlbGV0ZSB0aGUgZHVtcCBmaWxlcy4iKQotCisJIyBUT0RPKGIvMzE0MDEwNzY0KTogUmVtb3ZlIExMTkRLIHRhZyBhZnRlciBQTEFURk9STV9TREtfVkVSU0lPTiBpcyB1cGdyYWRlZCB0byAzNS4KIAkkKGV2YWwgYWRkZWRfcGxhdGZvcm1fYWJpX2R1bXBzIDo9ICQoc3RyaXAgJChzb3J0ICQoZmlsdGVyLW91dCBcCi0JICAkKGNhbGwgZmlsdGVyLWFiaS1kdW1wLXBhdGhzLExMTkRLIFBMQVRGT1JNLCQoUFJJVkFURV9MU0RVTVBfUEFUSFMpKSBcCi0JICAkKGFkZHN1ZmZpeCAubHNkdW1wLCQoUFJJVkFURV9TVFVCX0xJQlJBUklFUykpLCBcCisJICAkKGNhbGwgZmlsdGVyLWFiaS1kdW1wLW5hbWVzLEFQRVggTExOREsgUExBVEZPUk0sJChQUklWQVRFX0xTRFVNUF9QQVRIUykpIFwKKwkgICQoYWRkc3VmZml4IC5sc2R1bXAsJChQUklWQVRFX1NUVUJfTElCUkFSSUVTKSkgbGliUlMuc28ubHNkdW1wLCBcCiAJICAkKG5vdGRpciAkKFBMQVRGT1JNX0FCSV9EVU1QUykpKSkpKQogCSQoaWYgJChhZGRlZF9wbGF0Zm9ybV9hYmlfZHVtcHMpLCBcCiAJICBlY2hvIC1lICJGb3VuZCB1bmV4cGVjdGVkIEFCSSByZWZlcmVuY2UgZHVtcCBmaWxlcyB1bmRlciAkKFBMQVRGT1JNX0FCSV9EVU1QX0RJUikuIEl0IGlzIGNhdXNlZCBieSBtaXNtYXRjaCBiZXR3ZWVuIEFuZHJvaWQuYnAgYW5kIHRoZSBkdW1wIGZpbGVzLiBSdW4gXGBmaW5kIFwkJHtBTkRST0lEX0JVSUxEX1RPUH0vJChQTEFURk9STV9BQklfRFVNUF9ESVIpICcoJyAtbmFtZSAkKHN1YnN0ICQoc3BhY2UpLCAtb3IgLW5hbWUgLCQoYWRkZWRfcGxhdGZvcm1fYWJpX2R1bXBzKSkgJyknIC1kZWxldGVcYCB0byBkZWxldGUgdGhlIGR1bXAgZmlsZXMuIikKIAotCSQoaWYgJChhZGRlZF92bmRrX2FiaV9kdW1wcykkKGFkZGVkX25ka19hYmlfZHVtcHMpJChhZGRlZF9wbGF0Zm9ybV9hYmlfZHVtcHMpLGV4aXQgMSkKKwkkKGlmICQoYWRkZWRfdm5ka19hYmlfZHVtcHMpJChhZGRlZF9wbGF0Zm9ybV9hYmlfZHVtcHMpLGV4aXQgMSkKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQogCSQoaGlkZSkgdG91Y2ggJEAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIFZOREsgcGFja2FnZSBhbmQgc25hcHNob3QuCiAKLWlmbmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksKQotCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSB2bmRrX3BhY2thZ2UKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotIyBGaWx0ZXIgTExOREsgbGlicyBtb3ZlZCB0byBBUEVYIHRvIGF2b2lkIHB1bGxpbmcgdGhlbSBpbnRvIC9zeXN0ZW0vTElCCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKLSAgICAkKGZpbHRlci1vdXQgJChMTE5ES19NT1ZFRF9UT19BUEVYX0xJQlJBUklFUyksJChMTE5ES19MSUJSQVJJRVMpKQogCi1pZm5lcSAoJChUQVJHRVRfU0tJUF9DVVJSRU5UX1ZOREspLHRydWUpCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTICs9IFwKLSAgICB2bmRrY29yZXZhcmlhbnQubGlicmFyaWVzLnR4dCBcCi0gICAgJChhZGRzdWZmaXggLnZlbmRvciwkKFZOREtfQ09SRV9MSUJSQVJJRVMpKSBcCi0gICAgJChhZGRzdWZmaXggLnZlbmRvciwkKFZOREtfU0FNRVBST0NFU1NfTElCUkFSSUVTKSkgXAotICAgICQoVk5ES19VU0lOR19DT1JFX1ZBUklBTlRfTElCUkFSSUVTKSBcCi0gICAgY29tLmFuZHJvaWQudm5kay5jdXJyZW50Ci0KLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTICs9ICQoY2FsbCBtb2R1bGUtYnVpbHQtZmlsZXMsXAotICAgICQoYWRkc3VmZml4IC52ZW5kb3IsJChWTkRLX0NPUkVfTElCUkFSSUVTKSAkKFZOREtfU0FNRVBST0NFU1NfTElCUkFSSUVTKSkpCi0KLWVuZGlmCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1fdm5ka192ZXJzaW9ucyA6PQotaWZlcSAoJChmaWx0ZXIgY29tLmFuZHJvaWQudm5kay5jdXJyZW50Lm9uX3ZlbmRvciwgJChQUk9EVUNUX1BBQ0tBR0VTKSksKQotCV92bmRrX3ZlcnNpb25zICs9ICQoUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TKQotZW5kaWYKLWlmbmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksY3VycmVudCkKLQlfdm5ka192ZXJzaW9ucyArPSAkKEJPQVJEX1ZOREtfVkVSU0lPTikKLWVuZGlmCiBMT0NBTF9NT0RVTEUgOj0gdm5ka19hcGV4X3NuYXBzaG90X3BhY2thZ2UKIExPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAogTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQogTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSAkKGZvcmVhY2ggdm5ka192ZXIsJChfdm5ka192ZXJzaW9ucyksY29tLmFuZHJvaWQudm5kay52JCh2bmRrX3ZlcikpCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9ICQoZm9yZWFjaCB2bmRrX3ZlciwkKFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUyksY29tLmFuZHJvaWQudm5kay52JCh2bmRrX3ZlcikpCiBpbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKIAotX3ZuZGtfdmVyc2lvbnMgOj0KLQotZW5kaWYgIyBCT0FSRF9WTkRLX1ZFUlNJT04gaXMgc2V0Ci0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBza2lwX21vdW50LmNmZywgcmVhZCBieSBpbml0IHRvIHNraXAgbW91bnRpbmcgc29tZSBwYXJ0aXRpb25zIHdoZW4gR1NJIGlzIHVzZWQuCi0KKyMgRGVmaW5lIFBob255IG1vZHVsZSB0byBpbnN0YWxsIExMTkRLIG1vZHVsZXMgd2hpY2ggYXJlIGluc3RhbGxlZCBpbgorIyB0aGUgc3lzdGVtIGltYWdlCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBnc2lfc2tpcF9tb3VudC5jZmcKK0xPQ0FMX01PRFVMRSA6PSBsbG5ka19pbl9zeXN0ZW0KIExPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAogTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQogTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX1NURU0gOj0gc2tpcF9tb3VudC5jZmcKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX01PRFVMRSkKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX1NZU1RFTV9FWFRfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGluaXQvY29uZmlnCiAKLSMgQWRkcyBhIHN5bWxpbmsgdW5kZXIgL3N5c3RlbS9ldGMvaW5pdC9jb25maWcgcG9pbnRpbmcgdG8gL3N5c3RlbS9zeXN0ZW1fZXh0L2V0Yy9pbml0L2NvbmZpZwotIyBiZWNhdXNlIGZpcnN0LXN0YWdlIGluaXQgaW4gQW5kcm9pZCAxMC4wIHdpbGwgcmVhZCB0aGUgc2tpcF9tb3VudC5jZmcgZnJvbSAvc3lzdGVtL2V0Yy8qIGFmdGVyCi0jIGNocm9vdCAvc3lzdGVtLgotIyBUT0RPOiByZW1vdmUgdGhpcyBzeW1saW5rIHdoZW4gbm8gbmVlZCB0byBzdXBwb3J0IG5ldyBHU0kgb24gQW5kcm9pZCAxMC4KLSMgVGhlIGFjdHVhbCBmaWxlIG5lZWRzIHRvIGJlIHVuZGVyIC9zeXN0ZW0vc3lzdGVtX2V4dCBiZWNhdXNlIGl0J3MgR1NJLXNwZWNpZmljIGFuZCBkb2VzIG5vdAotIyBiZWxvbmcgdG8gY29yZSBDU0kuCi1MT0NBTF9QT1NUX0lOU1RBTExfQ01EIDo9IFwKLSAgICBta2RpciAtcCAkKFRBUkdFVF9PVVQpL2V0Yy9pbml0OyBcCi0gICAgbG4gLXNmIC9zeXN0ZW0vc3lzdGVtX2V4dC9ldGMvaW5pdC9jb25maWcgJChUQVJHRVRfT1VUKS9ldGMvaW5pdC9jb25maWcKKyMgRmlsdGVyIExMTkRLIGxpYnMgbW92ZWQgdG8gQVBFWCB0byBhdm9pZCBwdWxsaW5nIHRoZW0gaW50byAvc3lzdGVtL0xJQgorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgJChmaWx0ZXItb3V0ICQoTExOREtfTU9WRURfVE9fQVBFWF9MSUJSQVJJRVMpLCQoTExOREtfTElCUkFSSUVTKSkgXAorICAgIGxsbmRrLmxpYnJhcmllcy50eHQKIAotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIGluaXQuZ3NpLnJjLCBHU0ktc3BlY2lmaWMgaW5pdCBzY3JpcHQuCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nc2kvY3VycmVudC50eHQgYi90YXJnZXQvcHJvZHVjdC9nc2kvY3VycmVudC50eHQKaW5kZXggY2ViMjA2MC4uZjc3MTkxNiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpL2N1cnJlbnQudHh0CisrKyBiL3RhcmdldC9wcm9kdWN0L2dzaS9jdXJyZW50LnR4dApAQCAtNCw2ICs0LDcgQEAKIExMTkRLOiBsaWJHTEVTdjMuc28KIExMTkRLOiBsaWJSUy5zbwogTExOREs6IGxpYmFuZHJvaWRfbmV0LnNvCitMTE5ESzogbGliYXBleHN1cHBvcnQuc28KIExMTkRLOiBsaWJiaW5kZXJfbmRrLnNvCiBMTE5ESzogbGliYy5zbwogTExOREs6IGxpYmNncm91cHJjLnNvCkBAIC0xNywxMSArMTgsMTMgQEAKIExMTkRLOiBsaWJuZXVyYWxuZXR3b3Jrcy5zbwogTExOREs6IGxpYnNlbGludXguc28KIExMTkRLOiBsaWJzeW5jLnNvCitMTE5ESzogbGlidmVuZG9yc3VwcG9ydC5zbwogTExOREs6IGxpYnZuZGtzdXBwb3J0LnNvCiBMTE5ESzogbGlidnVsa2FuLnNvCiBWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi1WMi1uZGsuc28KIFZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS1WMS1uZGsuc28KLVZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uLVY0LW5kay5zbworVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3ItVjItbmRrLnNvCitWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbi1WNS1uZGsuc28KIFZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMC5zbwogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4xLnNvCiBWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbkAxLjIuc28KQEAgLTMwLDEwICszMyw4IEBACiBWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjEuc28KIFZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDMuMC5zbwogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJANC4wLnNvCi1WTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvci1WMi1uZGsuc28KIFZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUucmVuZGVyc2NyaXB0QDEuMC5zbwogVk5ESy1TUDogYW5kcm9pZC5oaWRsLm1lbW9yeS50b2tlbkAxLjAuc28KLVZOREstU1A6IGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wLWltcGwuc28KIFZOREstU1A6IGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wLnNvCiBWTkRLLVNQOiBhbmRyb2lkLmhpZGwuc2FmZV91bmlvbkAxLjAuc28KIFZOREstU1A6IGxpYlJTQ3B1UmVmLnNvCkBAIC01OSw4ICs2MCw4IEBACiBWTkRLLVNQOiBsaWJ1dGlsc2NhbGxzdGFjay5zbwogVk5ESy1TUDogbGliei5zbwogVk5ESy1jb3JlOiBhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb24tVjEtbmRrLnNvCi1WTkRLLWNvcmU6IGFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmRldmljZS1WMS1uZGsuc28KLVZOREstY29yZTogYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZS1WMS1uZGsuc28KK1ZOREstY29yZTogYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlLVYyLW5kay5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlLVYyLW5kay5zbwogVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAuc28KIFZOREstY29yZTogYW5kcm9pZC5oYXJkd2FyZS5jb25maWdzdG9yZS11dGlscy5zbwogVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNvbmZpZ3N0b3JlQDEuMC5zbwpAQCAtOTMsNyArOTQsNiBAQAogVk5ESy1jb3JlOiBsaWJjcnlwdG8uc28KIFZOREstY29yZTogbGliY3J5cHRvX3V0aWxzLnNvCiBWTkRLLWNvcmU6IGxpYmN1cmwuc28KLVZOREstY29yZTogbGliZGlza2NvbmZpZy5zbwogVk5ESy1jb3JlOiBsaWJkdW1wc3RhdGV1dGlsLnNvCiBWTkRLLWNvcmU6IGxpYmV2ZW50LnNvCiBWTkRLLWNvcmU6IGxpYmV4aWYuc28KQEAgLTEzOCw2ICsxMzgsNyBAQAogVk5ESy1jb3JlOiBsaWJ4bWwyLnNvCiBWTkRLLWNvcmU6IGxpYnl1di5zbwogVk5ESy1jb3JlOiBsaWJ6aXBhcmNoaXZlLnNvCitWTkRLLWNvcmU6IHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3Muc28KIFZOREstcHJpdmF0ZTogbGliYmxhcy5zbwogVk5ESy1wcml2YXRlOiBsaWJjb21waWxlcl9ydC5zbwogVk5ESy1wcml2YXRlOiBsaWJmdDIuc28KQEAgLTIwOCwzICsyMDksNCBAQAogVk5ESy1wcm9kdWN0OiBsaWJ5dXYuc28KIFZOREstcHJvZHVjdDogbGliei5zbwogVk5ESy1wcm9kdWN0OiBsaWJ6aXBhcmNoaXZlLnNvCitWTkRLLXByb2R1Y3Q6IHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3Muc28KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dzaV9yZWxlYXNlLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWsKaW5kZXggM2I5Nzc5Mi4uMzk0MjhkMiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWsKQEAgLTI4LDggKzI4LDggQEAKIAogQlVJTERJTkdfR1NJIDo9IHRydWUKIAotIyBFeGNsdWRlIGFsbCBmaWxlcyB1bmRlciBzeXN0ZW0vcHJvZHVjdCBhbmQgc3lzdGVtL3N5c3RlbV9leHQKIFBST0RVQ1RfQVJUSUZBQ1RfUEFUSF9SRVFVSVJFTUVOVF9BTExPV0VEX0xJU1QgKz0gXAorICAgIHN5c3RlbS9ldGMvaW5pdC9jb25maWcgXAogICAgIHN5c3RlbS9wcm9kdWN0LyUgXAogICAgIHN5c3RlbS9zeXN0ZW1fZXh0LyUKIApAQCAtNDQsMzggKzQ0LDI5IEBACiAjIEVuYWJsZSBkeW5hbWljIHBhcnRpdGlvbiBzaXplCiBQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTl9TSVpFIDo9IHRydWUKIAotIyBEaXNhYmxlIHRoZSBidWlsZC10aW1lIGRlYnVnZnMgcmVzdHJpY3Rpb25zIG9uIEdTSSBidWlsZHMKLVBST0RVQ1RfU0VUX0RFQlVHRlNfUkVTVFJJQ1RJT05TIDo9IGZhbHNlCi0KLSMgR1NJIHRhcmdldHMgc2hvdWxkIGluc3RhbGwgInVuZmxhdHRlbmVkIiBBUEVYZXMgaW4gL3N5c3RlbQotVEFSR0VUX0ZMQVRURU5fQVBFWCA6PSBmYWxzZQotCi0jIEdTSSB0YXJnZXRzIHNob3VsZCBpbnN0YWxsICJmbGF0dGVuZWQiIEFQRVhlcyBpbiAvc3lzdGVtX2V4dCBhcyB3ZWxsCi1QUk9EVUNUX0lOU1RBTExfRVhUUkFfRkxBVFRFTkVEX0FQRVhFUyA6PSB0cnVlCi0KLSMgVGhlIGZsYXR0ZW5lZCB2ZXJzaW9uIG9mIGNvbS5hbmRyb2lkLmFwZXguY3RzLnNoaW0udjEgc2hvdWxkIGJlIGV4cGxpY2l0bHkgaW5zdGFsbGVkCi0jIGJlY2F1c2UgdGhlIHNoaW0gYXBleCBpcyBwcmVidWlsdCBvbmUgYW5kIFBST0RVQ1RfSU5TVEFMTF9FWFRSQV9GTEFUVEVORURfQVBFWEVTIGlzIG5vdAotIyBzdXBwb3J0ZWQgZm9yIHByZWJ1aWx0X2FwZXggbW9kdWxlcyB5ZXQuCi1QUk9EVUNUX1BBQ0tBR0VTICs9IGNvbS5hbmRyb2lkLmFwZXguY3RzLnNoaW0udjFfd2l0aF9wcmVidWlsdHMuZmxhdHRlbmVkCi0KICMgR1NJIHNwZWNpZmljIHRhc2tzIG9uIGJvb3QKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIGdzaV9za2lwX21vdW50LmNmZyBcCiAgICAgaW5pdC5nc2kucmMgXAogICAgIGluaXQudm5kay1ub2RlZi5yYyBcCiAKLSMgT3ZlcmxheSB0aGUgR1NJIHNwZWNpZmljIFN5c3RlbVVJIHNldHRpbmcKLVBST0RVQ1RfUEFDS0FHRVMgKz0gZ3NpX292ZXJsYXlfc3lzdGVtdWkKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCi0gICAgZGV2aWNlL2dlbmVyaWMvY29tbW9uL292ZXJsYXlzL292ZXJsYXktY29uZmlnLnhtbDokKFRBUkdFVF9DT1BZX09VVF9TWVNURU1fRVhUKS9vdmVybGF5L2NvbmZpZy9jb25maWcueG1sCisKKyMgT3ZlcmxheSB0aGUgR1NJIHNwZWNpZmljIHNldHRpbmcgZm9yIGZyYW1ld29yayBhbmQgU3lzdGVtVUkKK2lmbmVxICgkKFBST0RVQ1RfSVNfQVVUT01PVElWRSksdHJ1ZSkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgZ3NpX292ZXJsYXlfZnJhbWV3b3JrIFwKKyAgICAgICAgZ3NpX292ZXJsYXlfc3lzdGVtdWkgXAorICAgIFBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCisgICAgICAgIGRldmljZS9nZW5lcmljL2NvbW1vbi9vdmVybGF5cy9vdmVybGF5LWNvbmZpZy54bWw6JChUQVJHRVRfQ09QWV9PVVRfU1lTVEVNX0VYVCkvb3ZlcmxheS9jb25maWcvY29uZmlnLnhtbAorZW5kaWYKIAogIyBTdXBwb3J0IGFkZGl0aW9uYWwgVk5ESyBzbmFwc2hvdHMKIFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUyA6PSBcCi0gICAgMjkgXAogICAgIDMwIFwKICAgICAzMSBcCiAgICAgMzIgXAogICAgIDMzIFwKKyAgICAzNCBcCiAKICMgRG8gbm90IGJ1aWxkIG5vbi1HU0kgcGFydGl0aW9uIGltYWdlcy4KIFBST0RVQ1RfQlVJTERfQ0FDSEVfSU1BR0UgOj0gZmFsc2UKQEAgLTkxLDMgKzgyLDE1IEBACiAjIEFkZGl0aW9uYWwgc2V0dGluZ3MgdXNlZCBpbiBhbGwgR1NJIGJ1aWxkcwogUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gXAogICAgIHJvLmNyeXB0by5tZXRhZGF0YV9pbml0X2RlbGV0ZV9hbGxfa2V5cy5lbmFibGVkPWZhbHNlIFwKKworIyBXaW5kb3cgRXh0ZW5zaW9ucworaWZuZXEgKCQoUFJPRFVDVF9JU19BVFYpLHRydWUpCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3dpbmRvd19leHRlbnNpb25zLm1rKQorZW5kaWYKKworIyBBIEdTSSBpcyB0byBiZSBtaXhlZCB3aXRoIGRpZmZlcmVudCBib290IGltYWdlcy4gVGhhdCBtZWFucyB3ZSBjYW4ndCBkZXRlcm1pbmUKKyMgdGhlIGtlcm5lbCB2ZXJzaW9uIHdoZW4gYnVpbGRpbmcgYSBHU0kuCisjIEFzc3VtZSB0aGUgZGV2aWNlIHN1cHBvcnRzIFVGRkQuIElmIGl0IGRvZXNuJ3QsIHRoZSBBUlQgcnVudGltZSB3aWxsIGZhbGwgYmFjaworIyB0byBDQywgYW5kIG9kcmVmcmVzaCB3aWxsIHJlZ2VuZXJhdGUgY29yZSBkZXhvcHQgYXJ0aWZhY3RzIG9uIHRoZSBmaXJzdCBib290LAorIyBzbyB0aGlzIGlzIG9rYXkuCitQUk9EVUNUX0VOQUJMRV9VRkZEX0dDIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2hhbmRoZWxkX3N5c3RlbS5tayBiL3RhcmdldC9wcm9kdWN0L2hhbmRoZWxkX3N5c3RlbS5tawppbmRleCA1MmY5ZWUxLi41NDZiYmU3IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW0ubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtLm1rCkBAIC0yNywxMSArMjcsMTMgQEAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBleHRlcm5hbC9nb29nbGUtZm9udHMvc291cmNlLXNhbnMtcHJvL2ZvbnRzLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGV4dGVybmFsL25vdG8tZm9udHMvZm9udHMubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZXh0ZXJuYWwvcm9ib3RvLWZvbnRzL2ZvbnRzLm1rKQorJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGV4dGVybmFsL3JvYm90by1mbGV4LWZvbnRzL2ZvbnRzLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGV4dGVybmFsL2h5cGhlbmF0aW9uLXBhdHRlcm5zL3BhdHRlcm5zLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGZyYW1ld29ya3MvYmFzZS9kYXRhL2tleWJvYXJkcy9rZXlib2FyZHMubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZnJhbWV3b3Jrcy93ZWJ2aWV3L2Nocm9taXVtL2Nocm9taXVtLm1rKQogCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBhbmRyb2lkLnNvZnR3YXJlLndpbmRvd19tYWduaWZpY2F0aW9uLnByZWJ1aWx0LnhtbCBcCiAgICAgQmFzaWNEcmVhbXMgXAogICAgIEJsb2NrZWROdW1iZXJQcm92aWRlciBcCiAgICAgQmx1ZXRvb3RoTWlkaVNlcnZpY2UgXApAQCAtNDMsNiArNDUsOCBAQAogICAgIENhcHRpdmVQb3J0YWxMb2dpbiBcCiAgICAgQ2VydEluc3RhbGxlciBcCiAgICAgQ3JlZGVudGlhbE1hbmFnZXIgXAorICAgIERldmljZUFzV2ViY2FtIFwKKyAgICBEZXZpY2VEaWFnbm9zdGljcyBcCiAgICAgRG9jdW1lbnRzVUkgXAogICAgIERvd25sb2FkUHJvdmlkZXJVaSBcCiAgICAgRWFzdGVyRWdnIFwKQEAgLTU1LDcgKzU5LDYgQEAKICAgICBNbXNTZXJ2aWNlIFwKICAgICBNdHBTZXJ2aWNlIFwKICAgICBNdXNpY0ZYIFwKLSAgICBOZmNOY2kgXAogICAgIFBhY1Byb2Nlc3NvciBcCiAgICAgcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWhhbmRoZWxkLXN5c3RlbS54bWwgXAogICAgIFByaW50UmVjb21tZW5kYXRpb25TZXJ2aWNlIFwKQEAgLTczLDYgKzc2LDExIEBACiAgICAgVnBuRGlhbG9ncyBcCiAgICAgdnIgXAogCitQUk9EVUNUX1BBQ0tBR0VTICs9ICQoUkVMRUFTRV9QQUNLQUdFX1ZJUlRVQUxfQ0FNRVJBKQorIyBTZXQgdmlydHVhbF9jYW1lcmFfc2VydmljZV9lbmFibGVkIHNvb25nIGNvbmZpZyB2YXJpYWJsZSBiYXNlZCBvbiB0aGUKKyMgUkVMRUFTRV9QQUNLQUdFX1ZJUlRVQUxfQ0FNRVJBIGJ1aWxkLiB2aXJ0dWFsX2NhbWVyYV9zZXJ2aWNlX2VuYWJsZWQgc29vbmcgY29uZmlnCisjIHZhcmlhYmxlIGlzIHVzZWQgdG8gcHJldmVudCBhY2Nlc3NpbmcgdGhlIHNlcnZpY2Ugd2hlbiBpdCdzIG5vdCBwcmVzZW50IGluIHRoZSBidWlsZC4KKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LHZkbSx2aXJ0dWFsX2NhbWVyYV9zZXJ2aWNlX2VuYWJsZWQsJChpZiAkKFJFTEVBU0VfUEFDS0FHRV9WSVJUVUFMX0NBTUVSQSksdHJ1ZSxmYWxzZSkpCiAKIFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9BUFBTICs9IFwKICAgICBGdXNlZExvY2F0aW9uIFwKQEAgLTgwLDkgKzg4LDcgQEAKICAgICBLZXlDaGFpbiBcCiAgICAgVGVsZWNvbSBcCiAKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy54bWw6c3lzdGVtL2V0Yy9hdWRpb19lZmZlY3RzLnhtbCBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvYW5kcm9pZC5zb2Z0d2FyZS53aW5kb3dfbWFnbmlmaWNhdGlvbi54bWw6JChUQVJHRVRfQ09QWV9PVVRfU1lTVEVNKS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS53aW5kb3dfbWFnbmlmaWNhdGlvbi54bWwgXAorUFJPRFVDVF9QQUNLQUdFUyArPSBmcmFtZXdvcmstYXVkaW9fZWZmZWN0cy54bWwKIAogUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCiAgICAgcm8uY2Fycmllcj89dW5rbm93biBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9tYWlubGluZV9zZGsubWsgYi90YXJnZXQvcHJvZHVjdC9tYWlubGluZV9zZGsubWsKaW5kZXggMzQzYWVkNi4uMTBiYjBhMCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvbWFpbmxpbmVfc2RrLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L21haW5saW5lX3Nkay5tawpAQCAtMTYsMyArMTYsNSBAQAogUFJPRFVDVF9OQU1FIDo9IG1haW5saW5lX3NkawogUFJPRFVDVF9CUkFORCA6PSBBbmRyb2lkCiBQUk9EVUNUX0RFVklDRSA6PSBtYWlubGluZV9zZGsKKworUFJPRFVDVF9CVUlMRF9GUk9NX1NPVVJDRV9TVFVCIDo9IHRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9tZWRpYV9zeXN0ZW0ubWsgYi90YXJnZXQvcHJvZHVjdC9tZWRpYV9zeXN0ZW0ubWsKaW5kZXggNzliZDc0YS4uYWYzODU3ZSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L21lZGlhX3N5c3RlbS5tawpAQCAtMjEsNiArMjEsNyBAQAogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9iYXNlX3N5c3RlbS5taykKIAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgYW5kcm9pZC5zb2Z0d2FyZS53ZWJ2aWV3LnByZWJ1aWx0LnhtbCBcCiAgICAgY29tLmFuZHJvaWQuZnV0dXJlLnVzYi5hY2Nlc3NvcnkgXAogICAgIGNvbS5hbmRyb2lkLm1lZGlhZHJtLnNpZ25lciBcCiAgICAgY29tLmFuZHJvaWQubWVkaWEucmVtb3RlZGlzcGxheSBcCkBAIC0zOSwxMiArNDAsOSBAQAogUFJPRFVDVF9IT1NUX1BBQ0tBR0VTICs9IFwKICAgICBmc2NrLmYyZnMgXAogCi1QUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2RhdGEvZXRjL2FuZHJvaWQuc29mdHdhcmUud2Vidmlldy54bWw6c3lzdGVtL2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLnNvZnR3YXJlLndlYnZpZXcueG1sCi0KIGlmbmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvYW5kcm9pZC5zb2Z0d2FyZS5wcmV2aWV3X3Nkay54bWw6c3lzdGVtL2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLnNvZnR3YXJlLnByZXZpZXdfc2RrLnhtbAorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgYW5kcm9pZC5zb2Z0d2FyZS5wcmV2aWV3X3Nkay5wcmVidWlsdC54bWwKIGVuZGlmCiAKICMgVGhlIG9yZGVyIGhlcmUgaXMgdGhlIHNhbWUgb3JkZXIgdGhleSBlbmQgdXAgb24gdGhlIGNsYXNzcGF0aCwgc28gaXQgbWF0dGVycy4KQEAgLTU5LDEwICs1Nyw2IEBACiBQUk9EVUNUX0NPUFlfRklMRVMgKz0gJChjYWxsIGFkZC10by1wcm9kdWN0LWNvcHktZmlsZXMtaWYtZXhpc3RzLFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvY29uZmlnL2NvbXBpbGVkLWNsYXNzZXMtcGhvbmU6c3lzdGVtL2V0Yy9jb21waWxlZC1jbGFzc2VzKQogCi0jIEVuYWJsZSBkaXJ0eSBpbWFnZSBvYmplY3QgYmlubmluZyB0byByZWR1Y2UgZGlydHkgcGFnZXMgaW4gdGhlIGltYWdlLgotUFJPRFVDVF9DT1BZX0ZJTEVTICs9ICQoY2FsbCBhZGQtdG8tcHJvZHVjdC1jb3B5LWZpbGVzLWlmLWV4aXN0cyxcCi0gICAgZnJhbWV3b3Jrcy9iYXNlL2RpcnR5LWltYWdlLW9iamVjdHMtcGhvbmU6c3lzdGVtL2V0Yy9kaXJ0eS1pbWFnZS1vYmplY3RzKQotCiAjIE9uIHVzZXJkZWJ1ZyBidWlsZHMsIGNvbGxlY3QgbW9yZSB0b21ic3RvbmVzIGJ5IGRlZmF1bHQuCiBpZm5lcSAoLCQoZmlsdGVyIHVzZXJkZWJ1ZyBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQogUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCkBAIC03NiwzICs3MCw3IEBACiAjIEVuYWJsZSBDRkkgZm9yIHNlY3VyaXR5LXNlbnNpdGl2ZSBjb21wb25lbnRzCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2NmaS1jb21tb24ubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgdmVuZG9yL2dvb2dsZS9wcm9kdWN0cy9jZmktdmVuZG9yLm1rKQorCisjIEVuYWJsZSBNVEUgZm9yIHNlY3VyaXR5LXNlbnNpdGl2ZSBjb21wb25lbnRzCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L21lbXRhZy1jb21tb24ubWspCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgdmVuZG9yL2dvb2dsZS9wcm9kdWN0cy9tZW10YWctdmVuZG9yLm1rKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtX2V4dC5tayBiL3RhcmdldC9wcm9kdWN0L21lZGlhX3N5c3RlbV9leHQubWsKaW5kZXggMmUyMGFmMy4uMzBkZDJlMiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtX2V4dC5taworKysgYi90YXJnZXQvcHJvZHVjdC9tZWRpYV9zeXN0ZW1fZXh0Lm1rCkBAIC0yMywzICsyMyw2IEBACiAjIC9zeXN0ZW1fZXh0IHBhY2thZ2VzCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKICAgICB2bmRrX2FwZXhfc25hcHNob3RfcGFja2FnZSBcCisKKyMgV2luZG93IEV4dGVuc2lvbnMKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvd2luZG93X2V4dGVuc2lvbnNfYmFzZS5taykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L21lbXRhZy1jb21tb24ubWsgYi90YXJnZXQvcHJvZHVjdC9tZW10YWctY29tbW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOWNiNDEKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9tZW10YWctY29tbW9uLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgVGhpcyBpcyBhIHJlY29tbWVuZGVkIHNldCBvZiBjb21tb24gY29tcG9uZW50cyB0byBlbmFibGUgTVRFIGZvci4KKworUFJPRFVDVF9NRU1UQUdfSEVBUF9BU1lOQ19ERUZBVUxUX0lOQ0xVREVfUEFUSFMgOj0gXAorICAgIGV4dGVybmFsL2FuZHJvaWQtY2xhdCBcCisgICAgZXh0ZXJuYWwvaXByb3V0ZTIgXAorICAgIGV4dGVybmFsL2lwdGFibGVzIFwKKyAgICBleHRlcm5hbC9tdHBkIFwKKyAgICBleHRlcm5hbC9wcHAgXAorICAgIGhhcmR3YXJlL3N0L25mYyBcCisgICAgaGFyZHdhcmUvc3Qvc2VjdXJlX2VsZW1lbnQgXAorICAgIGhhcmR3YXJlL3N0L3NlY3VyZV9lbGVtZW50MiBcCisgICAgcGFja2FnZXMvbW9kdWxlcy9TdGF0c0QgXAorICAgIHN5c3RlbS9icGYgXAorICAgIHN5c3RlbS9uZXRkL25ldHV0aWxfd3JhcHBlcnMgXAorICAgIHN5c3RlbS9uZXRkL3NlcnZlcgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX2FybTY0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX2FybTY0Lm1rCmluZGV4IDJlOGM4YTcuLmQ2NDg3Y2EgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L21vZHVsZV9hcm02NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9tb2R1bGVfYXJtNjQubWsKQEAgLTE5LDMgKzE5LDYgQEAKIAogUFJPRFVDVF9OQU1FIDo9IG1vZHVsZV9hcm02NAogUFJPRFVDVF9ERVZJQ0UgOj0gbW9kdWxlX2FybTY0CisKK1BST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTyA6PSB0cnVlCitQUk9EVUNUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEIDo9IDE2Mzg0CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9tb2R1bGVfYXJtNjRvbmx5Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX2FybTY0b25seS5tawppbmRleCBjMDc2OWJmLi4xMzc3MDFhIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9tb2R1bGVfYXJtNjRvbmx5Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L21vZHVsZV9hcm02NG9ubHkubWsKQEAgLTE5LDMgKzE5LDYgQEAKIAogUFJPRFVDVF9OQU1FIDo9IG1vZHVsZV9hcm02NG9ubHkKIFBST0RVQ1RfREVWSUNFIDo9IG1vZHVsZV9hcm02NG9ubHkKKworUFJPRFVDVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPIDo9IHRydWUKK1BST0RVQ1RfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQgOj0gMTYzODQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L21vZHVsZV9jb21tb24ubWsgYi90YXJnZXQvcHJvZHVjdC9tb2R1bGVfY29tbW9uLm1rCmluZGV4IDg0YmQ3OTkuLmRhNGVhMjMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L21vZHVsZV9jb21tb24ubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX2NvbW1vbi5tawpAQCAtMTQsMTYgKzE0LDE5IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9sYW5ndWFnZXNfZGVmYXVsdC5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvY2ZpLWNvbW1vbi5taykKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvbWVtdGFnLWNvbW1vbi5taykKIAogIyBFbmFibGVzIHRyZWJsZSwgd2hpY2ggZW5hYmxlZCBjZXJ0YWluIC1EIGNvbXBpbGF0aW9uIGZsYWdzLiBJbiBwYXJ0aWN1bGFyLCBsaWJoaWRsYmFzZQogIyB1c2VzIC1ERU5GT1JDRV9WSU5URl9NQU5JRkVTVC4gU2VlIGIvMTg1NzU5ODc3CiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA6PSAyOQogCi0jIEJ1aWxkcyB1c2luZyBhIG1vZHVsZSBwcm9kdWN0IHNob3VsZCBidWlsZCBtb2R1bGVzIGZyb20gc291cmNlLCBldmVuIGlmCi0jIEJSQU5DSF9ERUZBVUxUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSBzYXlzIG90aGVyd2lzZS4KKyMgSWYgdHJ1ZSwgdGhpcyBidWlsZHMgdGhlIG1haW5saW5lIG1vZHVsZXMgZnJvbSBzb3VyY2UuIFRoaXMgb3ZlcnJpZGVzIGFueQorIyBwcmVidWlsdHMgc2VsZWN0ZWQgdmlhIFJFTEVBU0VfQVBFWF9DT05UUklCVVRJT05TXyogYnVpbGQgZmxhZ3MgZm9yIHRoZQorIyBjdXJyZW50IHJlbGVhc2UgY29uZmlnLgogUFJPRFVDVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UgOj0gdHJ1ZQogCiAjIEJ1aWxkIHNkayBmcm9tIHNvdXJjZSBpZiB0aGUgYnJhbmNoIGlzIG5vdCB1c2luZyBzbGltIG1hbmlmZXN0cy4KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9tb2R1bGVfcmlzY3Y2NC5tawpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5tawpjb3B5IHRvIHRhcmdldC9wcm9kdWN0L21vZHVsZV9yaXNjdjY0Lm1rCmluZGV4IDVmNjU1M2UuLjRmZDM4YzAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX3Jpc2N2NjQubWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCw4ICsxNCw4IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIERvbid0IG1vZGlmeSB0aGlzIGZpbGUgLSBJdCdzIGp1c3QgYW4gYWxpYXMhCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L21vZHVsZV9jb21tb24ubWspCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2NvcmVfNjRfYml0X29ubHkubWspCiAKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX3Bob25lX3g4Nl82NC5taykKLQotUFJPRFVDVF9OQU1FIDo9IHNka194ODZfNjQKK1BST0RVQ1RfTkFNRSA6PSBtb2R1bGVfcmlzY3Y2NAorUFJPRFVDVF9ERVZJQ0UgOj0gbW9kdWxlX3Jpc2N2NjQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L21vZHVsZV94ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9tb2R1bGVfeDg2XzY0Lm1rCmluZGV4IDIwZjQ0M2EuLmUxODJiZjYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L21vZHVsZV94ODZfNjQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX3g4Nl82NC5tawpAQCAtMTksMyArMTksNiBAQAogCiBQUk9EVUNUX05BTUUgOj0gbW9kdWxlX3g4Nl82NAogUFJPRFVDVF9ERVZJQ0UgOj0gbW9kdWxlX3g4Nl82NAorCitQUk9EVUNUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8gOj0gdHJ1ZQorUFJPRFVDVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCA6PSAgMTYzODQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L21vZHVsZV94ODZfNjRvbmx5Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX3g4Nl82NG9ubHkubWsKaW5kZXggYjBkNzJiZi4uZmE0YTA0ZCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX3g4Nl82NG9ubHkubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX3g4Nl82NG9ubHkubWsKQEAgLTE5LDMgKzE5LDYgQEAKIAogUFJPRFVDVF9OQU1FIDo9IG1vZHVsZV94ODZfNjRvbmx5CiBQUk9EVUNUX0RFVklDRSA6PSBtb2R1bGVfeDg2XzY0b25seQorCitQUk9EVUNUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8gOj0gdHJ1ZQorUFJPRFVDVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCA6PSAxNjM4NApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbmRrLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbmRrLm1rCmluZGV4IDFkZmQwZGIuLmU0Zjc3ZjcgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L25kay5taworKysgYi90YXJnZXQvcHJvZHVjdC9uZGsubWsKQEAgLTE5LDMgKzE5LDUgQEAKIFBST0RVQ1RfTkFNRSA6PSBuZGsKIFBST0RVQ1RfQlJBTkQgOj0gQW5kcm9pZAogUFJPRFVDVF9ERVZJQ0UgOj0gbmRrCisKK1BST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTyA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5tayBiL3RhcmdldC9wcm9kdWN0L3J1bnRpbWVfbGliYXJ0Lm1rCmluZGV4IDY4ZWQyNDkuLjU4MjM0YTggMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3J1bnRpbWVfbGliYXJ0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3J1bnRpbWVfbGliYXJ0Lm1rCkBAIC0xMDIsMzkgKzEwMiw0OCBAQAogUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUyArPSBcCiAgICAgcm8uZGFsdmlrLnZtLm5hdGl2ZS5icmlkZ2U/PTAKIAotIyBEaWZmZXJlbnQgZGV4b3B0IHR5cGVzIGZvciBkaWZmZXJlbnQgcGFja2FnZSB1cGRhdGUvaW5zdGFsbCB0aW1lcy4KLSMgT24gZW5nIGJ1aWxkcywgbWFrZSAiYm9vdCIgcmVhc29ucyBvbmx5IGV4dHJhY3QgZm9yIGZhc3RlciB0dXJuYXJvdW5kLgotaWZlcSAoZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKQotICAgIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gXAotICAgICAgICBwbS5kZXhvcHQuZmlyc3QtYm9vdD89ZXh0cmFjdCBcCi0gICAgICAgIHBtLmRleG9wdC5ib290LWFmdGVyLW90YT89ZXh0cmFjdAotZWxzZQotICAgIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gXAotICAgICAgICBwbS5kZXhvcHQuZmlyc3QtYm9vdD89dmVyaWZ5IFwKLSAgICAgICAgcG0uZGV4b3B0LmJvb3QtYWZ0ZXItb3RhPz12ZXJpZnkKLWVuZGlmCi0KICMgVGhlIGluc3RhbGwgZmlsdGVyIGlzIHNwZWVkLXByb2ZpbGUgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSB1c2Ugb2YKICMgcHJvZmlsZXMgZnJvbSB0aGUgZGV4IG1ldGFkYXRhIGZpbGVzLiBOb3RlIHRoYXQgaWYgYSBwcm9maWxlIGlzIG5vdCBwcm92aWRlZAogIyBvciBpZiBpdCBpcyBlbXB0eSBzcGVlZC1wcm9maWxlIGlzIGVxdWl2YWxlbnQgdG8gKHF1aWNrZW4gKyBlbXB0eSBhcHAgaW1hZ2UpLgogIyBOb3RlIHRoYXQgYGNtZGxpbmVgIGlzIG5vdCBzdHJpY3RseSBuZWVkZWQgYnV0IGl0IHNpbXBsaWZpZXMgdGhlIG1hbmFnZW1lbnQKICMgb2YgY29tcGlsYXRpb24gcmVhc29uIGluIHRoZSBwbGF0Zm9ybSAoYXMgd2UgaGF2ZSBhIHVuaWZpZWQsIHNpbmdsZSBwYXRoLAogIyB3aXRob3V0IGV4Y2VwdGlvbnMpLgorIyBUT0RPKGIvMjQzNjQ2ODc2KTogUmVtb3ZlIGBwbS5kZXhvcHQucG9zdC1ib290YC4KIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gXAotICAgIHBtLmRleG9wdC5wb3N0LWJvb3Q/PWV4dHJhY3QgXAorICAgIHBtLmRleG9wdC5wb3N0LWJvb3Q/PXZlcmlmeSBcCisgICAgcG0uZGV4b3B0LmZpcnN0LWJvb3Q/PXZlcmlmeSBcCisgICAgcG0uZGV4b3B0LmJvb3QtYWZ0ZXItb3RhPz12ZXJpZnkgXAogICAgIHBtLmRleG9wdC5ib290LWFmdGVyLW1haW5saW5lLXVwZGF0ZT89dmVyaWZ5IFwKICAgICBwbS5kZXhvcHQuaW5zdGFsbD89c3BlZWQtcHJvZmlsZSBcCiAgICAgcG0uZGV4b3B0Lmluc3RhbGwtZmFzdD89c2tpcCBcCiAgICAgcG0uZGV4b3B0Lmluc3RhbGwtYnVsaz89c3BlZWQtcHJvZmlsZSBcCiAgICAgcG0uZGV4b3B0Lmluc3RhbGwtYnVsay1zZWNvbmRhcnk/PXZlcmlmeSBcCiAgICAgcG0uZGV4b3B0Lmluc3RhbGwtYnVsay1kb3duZ3JhZGVkPz12ZXJpZnkgXAotICAgIHBtLmRleG9wdC5pbnN0YWxsLWJ1bGstc2Vjb25kYXJ5LWRvd25ncmFkZWQ/PWV4dHJhY3QgXAorICAgIHBtLmRleG9wdC5pbnN0YWxsLWJ1bGstc2Vjb25kYXJ5LWRvd25ncmFkZWQ/PXZlcmlmeSBcCiAgICAgcG0uZGV4b3B0LmJnLWRleG9wdD89c3BlZWQtcHJvZmlsZSBcCiAgICAgcG0uZGV4b3B0LmFiLW90YT89c3BlZWQtcHJvZmlsZSBcCiAgICAgcG0uZGV4b3B0LmluYWN0aXZlPz12ZXJpZnkgXAogICAgIHBtLmRleG9wdC5jbWRsaW5lPz12ZXJpZnkgXAogICAgIHBtLmRleG9wdC5zaGFyZWQ/PXNwZWVkCiAKK2lmbmVxICgsJChmaWx0ZXIgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKKyAgICBPVkVSUklERV9ESVNBQkxFX0RFWE9QVF9BTEwgPz0gdHJ1ZQorZW5kaWYKKworIyBPVkVSUklERV9ESVNBQkxFX0RFWE9QVF9BTEwgZGlzYWJsZXMgYWxsIGRleHByZW9wdCAoYnVpbGQtdGltZSkgYW5kIGRleG9wdCAob24tZGV2aWNlKSBhY3Rpdml0aWVzLgorIyBUaGlzIG9wdGlvbiBpcyBmb3IgZmFzdGVyIGl0ZXJhdGlvbiBkdXJpbmcgZGV2ZWxvcG1lbnQgYW5kIHNob3VsZCBuZXZlciBiZSBlbmFibGVkIGZvciBwcm9kdWN0aW9uLgoraWZuZXEgKCwkKGZpbHRlciB0cnVlLCQoT1ZFUlJJREVfRElTQUJMRV9ERVhPUFRfQUxMKSkpCisgIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gXAorICAgIGRhbHZpay52bS5kaXNhYmxlLWFydC1zZXJ2aWNlLWRleG9wdD10cnVlIFwKKyAgICBkYWx2aWsudm0uZGlzYWJsZS1vZHJlZnJlc2g9dHJ1ZQorCisgICMgRGlzYWJsZSBhbGwgZGV4cHJlb3B0IGFjdGl2aXRpZXMgZXhjZXB0IGZvciB0aGUgQVJUIGJvb3QgaW1hZ2UuCisgICMgV2UgaGF2ZSB0byBkZXhwcmVvcHQgdGhlIEFSVCBib290IGltYWdlIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBieSBBUlQgdGVzdHMuIFRoaXMgc2hvdWxkIG5vdAorICAjIGJlIHRvbyBtdWNoIG9mIGEgcHJvYmxlbSBmb3IgcGxhdGZvcm0gZGV2ZWxvcGVycyBiZWNhdXNlIGEgY2hhbmdlIHRvIGZyYW1ld29yayBjb2RlIHNob3VsZCBub3QKKyAgIyB0cmlnZ2VyIGRleHByZW9wdCBmb3IgdGhlIEFSVCBib290IGltYWdlLgorICBXSVRIX0RFWFBSRU9QVF9BUlRfQk9PVF9JTUdfT05MWSA6PSB0cnVlCitlbmRpZgorCiAjIEVuYWJsZSByZXNvbHV0aW9uIG9mIHN0YXJ0dXAgY29uc3Qgc3RyaW5ncy4KIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gXAogICAgIGRhbHZpay52bS5kZXgyb2F0LXJlc29sdmUtc3RhcnR1cC1zdHJpbmdzPXRydWUKQEAgLTE2NiwxNSArMTc1LDkgQEAKICAgICBkYWx2aWsudm0udXNhcF9wb29sX3NpemVfbWluPz0xIFwKICAgICBkYWx2aWsudm0udXNhcF9wb29sX3JlZmlsbF9kZWxheV9tcz89MzAwMAogCi0jIEFsbG93IGRleG9wdCBmaWxlcyB0aGF0IGFyZSBzaWRlLWVmZmVjdHMgb2YgYWxyZWFkeSBhbGxvd2xpc3RlZCBmaWxlcy4KLSMgVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIEFSVCBpcyBwcmVidWlsdC4KLWlmZXEgKGZhbHNlLCQoQVJUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSkpCi0gIFBST0RVQ1RfQVJUSUZBQ1RfUEFUSF9SRVFVSVJFTUVOVF9BTExPV0VEX0xJU1QgKz0gXAotICAgICAgc3lzdGVtL2ZyYW1ld29yay8lLmFydCBcCi0gICAgICBzeXN0ZW0vZnJhbWV3b3JrLyUub2F0IFwKLSAgICAgIHN5c3RlbS9mcmFtZXdvcmsvJS5vZGV4IFwKLSAgICAgIHN5c3RlbS9mcmFtZXdvcmsvJS52ZGV4Ci1lbmRpZgotCiBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IFwKLSAgICBkYWx2aWsudm0udXNlYXJ0c2VydmljZT10cnVlCisgICAgZGFsdmlrLnZtLnVzZWFydHNlcnZpY2U9dHJ1ZSBcCisgICAgZGFsdmlrLnZtLmVuYWJsZV9wcl9kZXhvcHQ9dHJ1ZQorCisjIENvcHkgcHJlb3B0ZWQgZmlsZXMgZnJvbSBzeXN0ZW1fYiBvbiBmaXJzdCBib290LgorUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUyArPSByby5jcF9zeXN0ZW1fb3RoZXJfb2RleD0xCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGsubWsgYi90YXJnZXQvcHJvZHVjdC9zZGsubWsKaW5kZXggZmE3ZTFhZC4uM2Q1NmE4MCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3Nkay5tawpAQCAtMTcsOCArMTcsMjkgQEAKICMgVGhpcyBpcyBhIHNpbXBsZSBwcm9kdWN0IHRoYXQgdXNlcyBjb25maWd1cmVzIHRoZSBtaW5pbXVtIGFtb3VudAogIyBuZWVkZWQgdG8gYnVpbGQgdGhlIFNESyAod2l0aG91dCB0aGUgZW11bGF0b3IpLgogCisjIEVuc3VyZSBhbGwgdHJ1bmstc3RhYmxlIGZsYWdzIGFyZSBhdmFpbGFibGUuCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5taykKKworIyBJbiBvcmRlciB0byBidWlsZCB0aGUgYm9vdGNsYXNzcGF0aCBzb3VyY2VzLCB0aGUgYm9vdGNsYXNzcGF0aCBuZWVkcyB0bworIyBiZSBzZXR1cCB2aWEgZGVmYXVsdF9hcnRfY29uZmlnLm1rLiBUaGUgc291cmNlcyBvbmx5IHJlYWxseSBtYWtlIHNlbnNlCisjIHRvZ2V0aGVyIHdpdGggYSBkZXZpY2UgKGUuZy4gdGhlIGVtdWxhdG9yKS4gU28gaWYgdGhlIFNESyBzb3VyY2VzIGNoYW5nZQorIyB0byBiZSBidWlsdCB3aXRoIHRoZSBkZXZpY2UsIHRoaXMgY291bGQgYmUgcmVtb3ZlZC4KKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rKQorCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2xhbmd1YWdlc19kZWZhdWx0Lm1rKQogCiBQUk9EVUNUX05BTUUgOj0gc2RrCiBQUk9EVUNUX0JSQU5EIDo9IEFuZHJvaWQKIFBST0RVQ1RfREVWSUNFIDo9IG1haW5saW5lX3g4NgorCitQUk9EVUNUX0JVSUxEX0ZST01fU09VUkNFX1NUVUIgOj0gdHJ1ZQorCisjIFVzZSBzb3VyY2VzIG9mIG1haW5saW5lIG1vZHVsZXMKK1BST0RVQ1RfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIDo9IHRydWUKKworaWZlcSAoJChXSVRIT1VUX0NIRUNLX0FQSSksdHJ1ZSkKKyAgJChlcnJvciBXSVRIT1VUX0NIRUNLX0FQSSBjYW5ub3QgYmUgc2V0IHRvIHRydWUgZm9yIFNESyBwcm9kdWN0IGJ1aWxkcykKK2VuZGlmCisKKyMgSW5jbHVkZSBXZWFyIGZsYWcgdmFsdWVzIHNvIHRoYXQgV2Vhci1yZWxhdGVkIEFQSXMgYXJlIGJ1aWxkIGluIHNka3MuCitQUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMgKz0gJCh3aWxkY2FyZCB2ZW5kb3IvZ29vZ2xlX3NoYXJlZC93ZWFyL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka19hcm02NC5tayBiL3RhcmdldC9wcm9kdWN0L3Nka19hcm02NC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiMzhmNC4uMDAwMDAwMAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfYXJtNjQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIERvbid0IG1vZGlmeSB0aGlzIGZpbGUgLSBJdCdzIGp1c3QgYW4gYWxpYXMhCi0KLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX3Bob25lX2FybTY0Lm1rKQotCi1QUk9EVUNUX05BTUUgOj0gc2RrX2FybTY0CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfYXJtNjQubWsgYi90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfYXJtNjQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODE2MTUuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX2FybTY0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLVBST0RVQ1RfVVNFX0RZTkFNSUNfUEFSVElUSU9OUyA6PSB0cnVlCi0KLSMgVGhpcyBpcyBhIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZm9yIGEgZnVsbC1mZWF0dXJlZCBidWlsZCBvZiB0aGUKLSMgT3Blbi1Tb3VyY2UgcGFydCBvZiB0aGUgdHJlZS4gSXQncyBnZWFyZWQgdG93YXJkIGEgVVMtY2VudHJpYwotIyBidWlsZCBxdWl0ZSBzcGVjaWZpY2FsbHkgZm9yIHRoZSBlbXVsYXRvciwgYW5kIG1pZ2h0IG5vdCBiZQotIyBlbnRpcmVseSBhcHByb3ByaWF0ZSB0byBpbmhlcml0IGZyb20gZm9yIG9uLWRldmljZSBjb25maWd1cmF0aW9ucy4KLQotIyBFbmFibGUgbWFpbmxpbmUgY2hlY2tpbmcgZm9yIGV4YWN0IHRoaXMgcHJvZHVjdCBuYW1lCi1pZmVxIChzZGtfcGhvbmVfYXJtNjQsJChUQVJHRVRfUFJPRFVDVCkpCi1QUk9EVUNUX0VORk9SQ0VfQVJUSUZBQ1RfUEFUSF9SRVFVSVJFTUVOVFMgOj0gcmVsYXhlZAotZW5kaWYKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBzeXN0ZW0gaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvY29yZV82NF9iaXQubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rKQotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHN5c3RlbV9leHQgaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtX2V4dC5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvdGVsZXBob255X3N5c3RlbV9leHQubWspCi0KLSMKLSMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gcHJvZHVjdCBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hb3NwX3Byb2R1Y3QubWspCi0KLSMKLSMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gdmVuZG9yIG9yIHZlbmRvcl9ib290IGltYWdlCi0jCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvYXJtNjQtdmVuZG9yLm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9lbXVsYXRvcl9hcm02NC9kZXZpY2UubWspCi0KLSMga2VlcCB0aGlzIGFwayBmb3Igc2RrIHRhcmdldHMgZm9yIG5vdwotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgRW11bGF0b3JTbW9rZVRlc3RzCi0KLSMgT3ZlcnJpZGVzCi1QUk9EVUNUX0JSQU5EIDo9IEFuZHJvaWQKLVBST0RVQ1RfTkFNRSA6PSBzZGtfcGhvbmVfYXJtNjQKLVBST0RVQ1RfREVWSUNFIDo9IGVtdWxhdG9yX2FybTY0Ci1QUk9EVUNUX01PREVMIDo9IEFuZHJvaWQgU0RLIGJ1aWx0IGZvciBhcm02NAotIyBEaXNhYmxlIDx1c2VzLWxpYnJhcnk+IGNoZWNrcyBmb3IgU0RLIHByb2R1Y3QuIEl0IGxhY2tzIHNvbWUgbGlicmFyaWVzIChlLmcuCi0jIFJhZGlvQ29uZmlnTGliKSwgd2hpY2ggbWFrZXMgaXQgaW1wb3NzaWJsZSB0byB0cmFuc2xhdGUgdGhlaXIgbW9kdWxlIG5hbWVzIHRvCi0jIGxpYnJhcnkgbmFtZSwgc28gdGhlIGNoZWNrIGZhaWxzLgotUFJPRFVDVF9CUk9LRU5fVkVSSUZZX1VTRVNfTElCUkFSSUVTIDo9IHRydWUKLQotCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfYXJtdjcubWsgYi90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfYXJtdjcubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTBlM2IuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX2FybXY3Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLVBST0RVQ1RfVVNFX0RZTkFNSUNfUEFSVElUSU9OUyA6PSB0cnVlCi0KLSMgVGhpcyBpcyBhIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZm9yIGEgZnVsbC1mZWF0dXJlZCBidWlsZCBvZiB0aGUKLSMgT3Blbi1Tb3VyY2UgcGFydCBvZiB0aGUgdHJlZS4gSXQncyBnZWFyZWQgdG93YXJkIGEgVVMtY2VudHJpYwotIyBidWlsZCBxdWl0ZSBzcGVjaWZpY2FsbHkgZm9yIHRoZSBlbXVsYXRvciwgYW5kIG1pZ2h0IG5vdCBiZQotIyBlbnRpcmVseSBhcHByb3ByaWF0ZSB0byBpbmhlcml0IGZyb20gZm9yIG9uLWRldmljZSBjb25maWd1cmF0aW9ucy4KLQotIyBFbmFibGUgbWFpbmxpbmUgY2hlY2tpbmcgZm9yIGV4YWN0IHRoaXMgcHJvZHVjdCBuYW1lCi1pZmVxIChzZGtfcGhvbmVfYXJtdjcsJChUQVJHRVRfUFJPRFVDVCkpCi1QUk9EVUNUX0VORk9SQ0VfQVJUSUZBQ1RfUEFUSF9SRVFVSVJFTUVOVFMgOj0gcmVsYXhlZAotZW5kaWYKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBzeXN0ZW0gaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZ2VuZXJpY19zeXN0ZW0ubWspCi0KLSMKLSMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gc3lzdGVtX2V4dCBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW1fZXh0Lm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC90ZWxlcGhvbnlfc3lzdGVtX2V4dC5taykKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBwcm9kdWN0IGltYWdlCi0jCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Fvc3BfcHJvZHVjdC5taykKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byB2ZW5kb3IgaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3JhbWRpc2tfc3R1Yi5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZW11bGF0b3JfdmVuZG9yLm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvZW11bGF0b3JfYXJtL2RldmljZS5taykKLQotIyBrZWVwIHRoaXMgYXBrIGZvciBzZGsgdGFyZ2V0cyBmb3Igbm93Ci1QUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICBFbXVsYXRvclNtb2tlVGVzdHMKLQotCi0jIE92ZXJyaWRlcwotUFJPRFVDVF9CUkFORCA6PSBBbmRyb2lkCi1QUk9EVUNUX05BTUUgOj0gc2RrX3Bob25lX2FybXY3Ci1QUk9EVUNUX0RFVklDRSA6PSBlbXVsYXRvcl9hcm0KLVBST0RVQ1RfTU9ERUwgOj0gQW5kcm9pZCBTREsgYnVpbHQgZm9yIGFybQotIyBEaXNhYmxlIDx1c2VzLWxpYnJhcnk+IGNoZWNrcyBmb3IgU0RLIHByb2R1Y3QuIEl0IGxhY2tzIHNvbWUgbGlicmFyaWVzIChlLmcuCi0jIFJhZGlvQ29uZmlnTGliKSwgd2hpY2ggbWFrZXMgaXQgaW1wb3NzaWJsZSB0byB0cmFuc2xhdGUgdGhlaXIgbW9kdWxlIG5hbWVzIHRvCi0jIGxpYnJhcnkgbmFtZSwgc28gdGhlIGNoZWNrIGZhaWxzLgotUFJPRFVDVF9CUk9LRU5fVkVSSUZZX1VTRVNfTElCUkFSSUVTIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODYubWsgYi90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfeDg2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjhiNTA4Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODYubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TIDo9IHRydWUKLQotIyBUaGlzIGlzIGEgYnVpbGQgY29uZmlndXJhdGlvbiBmb3IgYSBmdWxsLWZlYXR1cmVkIGJ1aWxkIG9mIHRoZQotIyBPcGVuLVNvdXJjZSBwYXJ0IG9mIHRoZSB0cmVlLiBJdCdzIGdlYXJlZCB0b3dhcmQgYSBVUy1jZW50cmljCi0jIGJ1aWxkIHF1aXRlIHNwZWNpZmljYWxseSBmb3IgdGhlIGVtdWxhdG9yLCBhbmQgbWlnaHQgbm90IGJlCi0jIGVudGlyZWx5IGFwcHJvcHJpYXRlIHRvIGluaGVyaXQgZnJvbSBmb3Igb24tZGV2aWNlIGNvbmZpZ3VyYXRpb25zLgotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHN5c3RlbSBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9nZW5lcmljX3N5c3RlbS5taykKLQotIyBFbmFibGUgbWFpbmxpbmUgY2hlY2tpbmcgZm9yIGV4YWN0IHRoaXMgcHJvZHVjdCBuYW1lCi1pZmVxIChzZGtfcGhvbmVfeDg2LCQoVEFSR0VUX1BST0RVQ1QpKQotUFJPRFVDVF9FTkZPUkNFX0FSVElGQUNUX1BBVEhfUkVRVUlSRU1FTlRTIDo9IHJlbGF4ZWQKLWVuZGlmCi0KLSMKLSMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gc3lzdGVtX2V4dCBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW1fZXh0Lm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC90ZWxlcGhvbnlfc3lzdGVtX2V4dC5taykKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBwcm9kdWN0IGltYWdlCi0jCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Fvc3BfcHJvZHVjdC5taykKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byB2ZW5kb3IgaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC94ODYtdmVuZG9yLm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9lbXVsYXRvcl94ODYvZGV2aWNlLm1rKQotCi0jIE92ZXJyaWRlcwotUFJPRFVDVF9CUkFORCA6PSBBbmRyb2lkCi1QUk9EVUNUX05BTUUgOj0gc2RrX3Bob25lX3g4NgotUFJPRFVDVF9ERVZJQ0UgOj0gZW11bGF0b3JfeDg2Ci1QUk9EVUNUX01PREVMIDo9IEFuZHJvaWQgU0RLIGJ1aWx0IGZvciB4ODYKLSMgRGlzYWJsZSA8dXNlcy1saWJyYXJ5PiBjaGVja3MgZm9yIFNESyBwcm9kdWN0LiBJdCBsYWNrcyBzb21lIGxpYnJhcmllcyAoZS5nLgotIyBSYWRpb0NvbmZpZ0xpYiksIHdoaWNoIG1ha2VzIGl0IGltcG9zc2libGUgdG8gdHJhbnNsYXRlIHRoZWlyIG1vZHVsZSBuYW1lcyB0bwotIyBsaWJyYXJ5IG5hbWUsIHNvIHRoZSBjaGVjayBmYWlscy4KLVBST0RVQ1RfQlJPS0VOX1ZFUklGWV9VU0VTX0xJQlJBUklFUyA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfeDg2XzY0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX3g4Nl82NC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkOTAyOC4uMDAwMDAwMAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfeDg2XzY0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLVBST0RVQ1RfVVNFX0RZTkFNSUNfUEFSVElUSU9OUyA6PSB0cnVlCi0KLSMgVGhpcyBpcyBhIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZm9yIGEgZnVsbC1mZWF0dXJlZCBidWlsZCBvZiB0aGUKLSMgT3Blbi1Tb3VyY2UgcGFydCBvZiB0aGUgdHJlZS4gSXQncyBnZWFyZWQgdG93YXJkIGEgVVMtY2VudHJpYwotIyBidWlsZCBxdWl0ZSBzcGVjaWZpY2FsbHkgZm9yIHRoZSBlbXVsYXRvciwgYW5kIG1pZ2h0IG5vdCBiZQotIyBlbnRpcmVseSBhcHByb3ByaWF0ZSB0byBpbmhlcml0IGZyb20gZm9yIG9uLWRldmljZSBjb25maWd1cmF0aW9ucy4KLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBzeXN0ZW0gaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvY29yZV82NF9iaXQubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rKQotCi0jIEVuYWJsZSBtYWlubGluZSBjaGVja2luZyBmb3IgZXhhY3QgdGhpcyBwcm9kdWN0IG5hbWUKLWlmZXEgKHNka19waG9uZV94ODZfNjQsJChUQVJHRVRfUFJPRFVDVCkpCi1QUk9EVUNUX0VORk9SQ0VfQVJUSUZBQ1RfUEFUSF9SRVFVSVJFTUVOVFMgOj0gcmVsYXhlZAotZW5kaWYKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBzeXN0ZW1fZXh0IGltYWdlCi0jCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2hhbmRoZWxkX3N5c3RlbV9leHQubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3RlbGVwaG9ueV9zeXN0ZW1fZXh0Lm1rKQotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHByb2R1Y3QgaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW9zcF9wcm9kdWN0Lm1rKQotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHZlbmRvciBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3g4Nl82NC12ZW5kb3IubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yX3ZlbmRvci5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL2JvYXJkL2VtdWxhdG9yX3g4Nl82NC9kZXZpY2UubWspCi0KLSMgT3ZlcnJpZGVzCi1QUk9EVUNUX0JSQU5EIDo9IEFuZHJvaWQKLVBST0RVQ1RfTkFNRSA6PSBzZGtfcGhvbmVfeDg2XzY0Ci1QUk9EVUNUX0RFVklDRSA6PSBlbXVsYXRvcl94ODZfNjQKLVBST0RVQ1RfTU9ERUwgOj0gQW5kcm9pZCBTREsgYnVpbHQgZm9yIHg4Nl82NAotIyBEaXNhYmxlIDx1c2VzLWxpYnJhcnk+IGNoZWNrcyBmb3IgU0RLIHByb2R1Y3QuIEl0IGxhY2tzIHNvbWUgbGlicmFyaWVzIChlLmcuCi0jIFJhZGlvQ29uZmlnTGliKSwgd2hpY2ggbWFrZXMgaXQgaW1wb3NzaWJsZSB0byB0cmFuc2xhdGUgdGhlaXIgbW9kdWxlIG5hbWVzIHRvCi0jIGxpYnJhcnkgbmFtZSwgc28gdGhlIGNoZWNrIGZhaWxzLgotUFJPRFVDVF9CUk9LRU5fVkVSSUZZX1VTRVNfTElCUkFSSUVTIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9zZGtfd2l0aF9ydW50aW1lX2FwaXMubWsKc2ltaWxhcml0eSBpbmRleCA3MCUKcmVuYW1lIGZyb20gdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5tawpyZW5hbWUgdG8gdGFyZ2V0L3Byb2R1Y3Qvc2RrX3dpdGhfcnVudGltZV9hcGlzLm1rCmluZGV4IDVmNjU1M2UuLmU4MGI0ZmIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3dpdGhfcnVudGltZV9hcGlzLm1rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsOCArMTQsOSBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBEb24ndCBtb2RpZnkgdGhpcyBmaWxlIC0gSXQncyBqdXN0IGFuIGFsaWFzIQorJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9zZGsubWspCiAKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX3Bob25lX3g4Nl82NC5taykKK1BST0RVQ1RfTkFNRSA6PSBzZGtfd2l0aF9ydW50aW1lX2FwaXMKIAotUFJPRFVDVF9OQU1FIDo9IHNka194ODZfNjQKK1BST0RVQ1RfSElEREVOX0FQSV9FWFBPUlRBQkxFX1NUVUJTIDo9IHRydWUKK1BST0RVQ1RfRVhQT1JUX1JVTlRJTUVfQVBJUyA6PSB0cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5icCBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQuYnAKaW5kZXggMWUyNmQ1OS4uMGQ3YjM1ZSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5icAorKysgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLmJwCkBAIC0yNSwzICsyNSwxNSBAQAogICAgIHN1Yl9kaXI6ICJzZWN1cml0eS9mc3Zlcml0eSIsCiAgICAgZmlsZW5hbWVfZnJvbV9zcmM6IHRydWUsCiB9CisKKy8vIG90YWNlcnRzOiBBIGtleXN0b3JlIHdpdGggdGhlIGF1dGhvcml6ZWQga2V5cyBpbiBpdCwgd2hpY2ggaXMgdXNlZCB0byB2ZXJpZnkKKy8vIHRoZSBhdXRoZW50aWNpdHkgb2YgZG93bmxvYWRlZCBPVEEgcGFja2FnZXMuCisvLyBUaGlzIG1vZHVsZSB6aXBzIGZpbGVzIGRlZmluZWQgaW4gUFJPRFVDVF9ERUZBVUxUX0RFVl9DRVJUSUZJQ0FURSBhbmQKKy8vIFBST0RVQ1RfRVhUUkFfT1RBX0tFWVMgZm9yIHN5c3RlbSBvciBQUk9EVUNUX0VYVFJBX1JFQ09WRVJZX0tFWVMgZm9yIHJlY292ZXJ5CisvLyBpbWFnZQorb3RhY2VydHNfemlwIHsKKyAgICBuYW1lOiAib3RhY2VydHMiLAorICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzZWN1cml0eSIsCisgICAgZmlsZW5hbWU6ICJvdGFjZXJ0cy56aXAiLAorfQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5tayBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsKaW5kZXggNGJkOGVmYy4uOTFiMjcyYyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5taworKysgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLm1rCkBAIC0xNSw1NCArMTUsMyBAQAogICAgIGluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKICAgZW5kaWYKIGVuZGlmCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIG90YWNlcnRzOiBBIGtleXN0b3JlIHdpdGggdGhlIGF1dGhvcml6ZWQga2V5cyBpbiBpdCwgd2hpY2ggaXMgdXNlZCB0byB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZgotIyBkb3dubG9hZGVkIE9UQSBwYWNrYWdlcy4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gb3RhY2VydHMKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1NURU0gOj0gb3RhY2VydHMuemlwCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9zZWN1cml0eQotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotCi1leHRyYV9vdGFfa2V5cyA6PSAkKGFkZHN1ZmZpeCAueDUwOS5wZW0sJChQUk9EVUNUX0VYVFJBX09UQV9LRVlTKSkKLQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0NFUlQgOj0gJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLng1MDkucGVtCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfRVhUUkFfT1RBX0tFWVMgOj0gJChleHRyYV9vdGFfa2V5cykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogXAotCSAgICAkKFNPT05HX1pJUCkgXAotCSAgICAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkueDUwOS5wZW0gXAotCSAgICAkKGV4dHJhX290YV9rZXlzKQotCSQoU09PTkdfWklQKSAtbyAkQCAtaiAtc3ltbGlua3M9ZmFsc2UgXAotCSAgICAkKGFkZHByZWZpeCAtZiAsJChQUklWQVRFX0NFUlQpICQoUFJJVkFURV9FWFRSQV9PVEFfS0VZUykpCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIG90YWNlcnRzIGZvciByZWNvdmVyeSBpbWFnZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gb3RhY2VydHMucmVjb3ZlcnkKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1NURU0gOj0gb3RhY2VydHMuemlwCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvc3lzdGVtL2V0Yy9zZWN1cml0eQotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotCi1leHRyYV9yZWNvdmVyeV9rZXlzIDo9ICQoYWRkc3VmZml4IC54NTA5LnBlbSwkKFBST0RVQ1RfRVhUUkFfUkVDT1ZFUllfS0VZUykpCi0KLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9DRVJUIDo9ICQoREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFKS54NTA5LnBlbQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0VYVFJBX1JFQ09WRVJZX0tFWVMgOj0gJChleHRyYV9yZWNvdmVyeV9rZXlzKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBcCi0JICAgICQoU09PTkdfWklQKSBcCi0JICAgICQoREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFKS54NTA5LnBlbSBcCi0JICAgICQoZXh0cmFfcmVjb3Zlcnlfa2V5cykKLQkkKFNPT05HX1pJUCkgLW8gJEAgLWogLXN5bWxpbmtzPWZhbHNlIFwKLQkgICAgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9DRVJUKSAkKFBSSVZBVEVfRVhUUkFfUkVDT1ZFUllfS0VZUykpCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9SRUFETUUgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9SRUFETUUKaW5kZXggMmIxNjFiYi4uMWUwMTVmMCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvUkVBRE1FCisrKyBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L1JFQURNRQpAQCAtMzcsMyArMzcsMzEgQEAKIAogVGhpcyBpcyBjYWxsZWQgYnkgYnVpbGQvbWFrZS9jb3JlL01ha2VmaWxlIHRvIGluY29ycG9yYXRlIHRoZSBPVEEgc2lnbmluZyBrZXlzCiBpbnRvIHRoZSByZWNvdmVyeSBpbWFnZS4KKworY29udmVydGluZyB0byBqYXZhIGtleXN0b3JlIGZvciBBbmRyb2lkIFN0dWRpbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdXBwb3NlIHdlIHdhbnQgdG8gY29udmVydCBzaGFyZWQucGs4IGFuZCBzaGFyZWQueDUwOS5wZW0gdG8gc2hhcmVkLmtleXN0b3JlLgorCisgJCBvcGVuc3NsIHBrY3M4IC1pbmZvcm0gREVSIC1ub2NyeXB0ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIC1pbiBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3NoYXJlZC5wazggICAgICAgXAorICAgLW91dCBzaGFyZWQucGVtCisgJCBvcGVuc3NsIHBrY3MxMiAtZXhwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIC1pbiBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3NoYXJlZC54NTA5LnBlbSAgXAorICAgLWlua2V5IHNoYXJlZC5wZW0gLW91dCBzaGFyZWQucDEyICAgICAgICAgICAgICAgICAgICAgICBcCisgICAtcGFzc3dvcmQgcGFzczphbmRyb2lkIC1uYW1lIEFuZHJvaWREZWJ1Z0tleQorICQga2V5dG9vbCAtaW1wb3J0a2V5c3RvcmUgLWRlc3RzdG9yZXBhc3MgYW5kcm9pZCAgICAgICAgICBcCisgICAtZGVzdGtleXN0b3JlIHNoYXJlZC5rZXlzdG9yZSAtc3Jja2V5c3RvcmUgc2hhcmVkLnAxMiAgIFwKKyAgIC1zcmNzdG9yZXR5cGUgUEtDUzEyIC1zcmNzdG9yZXBhc3MgYW5kcm9pZAorCitUaGUga2V5c3RvcmUgY2FuIGJlIHVzZWQgaW4gYnVpbGQuZ3JhZGxlIGFzIGZvbGxvd3MuCisKK3NpZ25pbmdDb25maWdzIHsKKyAgICBzaGFyZWQgeworICAgICAgICBzdG9yZUZpbGUgZmlsZSgic2hhcmVkLmtleXN0b3JlIikKKyAgICAgICAgc3RvcmVQYXNzd29yZCAiYW5kcm9pZCIKKyAgICAgICAga2V5UGFzc3dvcmQgImFuZHJvaWQiCisgICAgICAgIGtleUFsaWFzICJBbmRyb2lkRGVidWdLZXkiCisgICAgfQorfQorCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9uZmMucGs4IGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvbmZjLnBrOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTVlMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvbmZjLnBrOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9uZmMueDUwOS5wZW0gYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9uZmMueDUwOS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiZmY2YQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L25mYy54NTA5LnBlbQpAQCAtMCwwICsxLDI5IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0NCitNSUlGMkRDQ0E4Q2dBd0lCQWdJVUM5NHEzNDhoRmFQbTJqb3czUjg0WmpORmMzRXdEUVlKS29aSWh2Y05BUUVMQlFBd2ZERUxNQWtHDQorQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERVMXZkVzUwWVdsdUlGWnBaWGN4RkRBUw0KK0JnTlZCQW9UQzBkdmIyZHNaU0JKYm1NdU1SQXdEZ1lEVlFRTEV3ZEJibVJ5YjJsa01SZ3dGZ1lEVlFRRERBOWpiMjFmWVc1a2NtOXANCitaRjl1Wm1Nd0lCY05Nak14TVRBeE1qRXpOekUxV2hnUE1qQTFNekV4TURFeU1UTTNNVFZhTUh3eEN6QUpCZ05WQkFZVEFsVlRNUk13DQorRVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RIYjI5bg0KK2JHVWdTVzVqTGpFUU1BNEdBMVVFQ3hNSFFXNWtjbTlwWkRFWU1CWUdBMVVFQXd3UFkyOXRYMkZ1WkhKdmFXUmZibVpqTUlJQ0lqQU4NCitCZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFycGd3S3lMRGw4TTNLUmIxRnhzM1AybW50ODFzQjN1R1pzNDRSNkM2DQorQ3dGaGlpQUNPbUVRQmNtNzlCVUtCTXJFOWRVYnlPTC9HS2x1TnpEMDI2VXNERStOMndEUThzaVR4YWxqREF3aFpCcHVyaE91NHVIOA0KK0JLSk96b2N6QWxKRk1IcEZJTUNLUVh3b3RNalQ5M0J1aGxTbzAyNFE1UURkMmo3R2FqazIxVGtreVFObEJPaXlFcEtrclJQQnVBcncNCisya25xaHVYK25MWWtKNXJvQU5hSlZEc2lLTURHL21Lbmp3QW5kcmdWYkJpS2FPZGZ1UmQrcEpsZU4zTFVrQWZZSEhCcWxPSm5QR1NJDQoramZZSys5VGpzSUVZVkVPYjRTTUkzQ2JXd0hmT2RFSUJnejNJUHFNdGFtRW5iWkhObGZWV1VSVE5HQUYyY28rREYzVERHREVqcmFLNA0KK1I1cFhEay9XKzRFeDc3d1FQQ0lUK2Q5ODF6a2JUcGdzUFh2Wm1zQnpDWU13NnRZa3NQajg2ZlNWSlVySmhsaWJEazRZSFZGc0Y3T0sNCithck5mMDQ0eVBoWitXVUlEcVdKNkdCMEdVOExXR2JiZThpYVAwcm85UTFEWWdZYzZidVlXSWNYODFYWk8raEhnV3RVYjJyTnFJVXNwDQorLzREbVQxdmd6N1RpTVdjWTdwanJIbE5IdFZmNGpDK09VMmMrcDh1NFhVR1F4ZElLR2daU29IbGR0QWNud3FHdUlwYXQ5bFMrZ3RWbA0KK3ZKVXA4dzNaMmd2NHEvYkJWWjNOTmFzQTFkM0hYVlFVV2l3c3pjamlWdm9TUmEvQWxNVlVHdXJlR1Jic2lLc3lIaXNZcDlyeGsxREINCitkUFM5aDd0TXMvNXJWNlJNMm5aZmRmUXI3MXpYOWllU296MENBd0VBQWFOUU1FNHdEQVlEVlIwVEJBVXdBd0VCL3pBZEJnTlZIUTRFDQorRmdRVTl2OVNMMFFJVTlmcTdhQjcwL2pxVkJMbVpKVXdId1lEVlIwakJCZ3dGb0FVOXY5U0wwUUlVOWZxN2FCNzAvanFWQkxtWkpVdw0KK0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFFeHQyL05GdCsySWhDNSsvY2dpOGh6dndaS1F5bWwxTVE5cGpya2ZReTBKR3pHVE9QRHINCisrTlB1VDVqaC9TT2ZHemRCc0dWczNodks3aEZ2WHNGRVd3VlFhRE9rS2hjcnVrcytnN0Z4bGRoWEMyejlpS2dqTnJPZVVYb0U3U2lFDQorelhBL3AxS2lCY1JMM01TTWJnL2lRalFWeGxKa3k0QkRvMzlTb0VnRGVMOStpN0w0Y0J3WlEyTEJCTFBJT2RFN0cvY0cxUTZVRStLTg0KKy9tbnowa2szK0ZJZzBxNHN6WER4SCtvMlY0WllIU095OFA2VEJXOGdFUTcxUkdPbmgwd3RhVEl4MlJEL3pxSkFpK0J6V01Mc0M2MzYNCitUTk1tcUthc3NHNE1INDQ1dWwydzBaek9DbEo0Z2tsMWU3ZHRLNy9LZXM0a2NMT0kvaTRKSExPY3lkRXF1bSt0OGdRdE1ZeUdNMUt2DQorbVZwQzNoRXYycFl3RmZoZzhoZzMxTWxqWm1MRDc2MWtMT0xmdzk4TjM1MGg2ZE5kUTBqY2kvM3JxYmJqVmluVlFvUVNWRXpKY0E5UQ0KK2dRaFJMS0hpTzdvUm1odDZpbFJMRnRHWmQvUHdJTVdNTnFrc1RmVk01ZnJNSUlaWGRmZXcrZWZISUo3WCtaZ0p1M3RHV2NiRllGdGUNCitLL0JibVBMbnAzYUFHZy93d1UxZHF3Q0FOZjUzb1VjNFp6cVJtOWVvdmxWc3JGaVJNL0RHdDIvdDR1am9yVTZVd3d0MituMDVRVTdiDQorN1BYaGM3YlRQNmFkVVdNTk14U05JUG82d0htc1RiMnBDZytLNUx1Tk1GSnpYY29JM3VCVzlRdTRNL3RMUnY0a1JLWnpwaHFVYlgrZQ0KKy81aFcybXl3MkJ2YmR3V0ZyejZYQmdreg0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0NCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWFvc3AtcHJvZHVjdC54bWwgYi90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWFvc3AtcHJvZHVjdC54bWwKaW5kZXggMTI5NWUxYy4uZDNlMjgwOCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc3lzY29uZmlnL3ByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1hb3NwLXByb2R1Y3QueG1sCisrKyBiL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0tYW9zcC1wcm9kdWN0LnhtbApAQCAtMjcsNSArMjcsNiBAQAogICAgICAgICA8aW5zdGFsbC1pbiB1c2VyLXR5cGU9IkZVTEwiIC8+CiAgICAgICAgIDxpbnN0YWxsLWluIHVzZXItdHlwZT0iUFJPRklMRSIgLz4KICAgICAgICAgPGRvLW5vdC1pbnN0YWxsLWluIHVzZXItdHlwZT0iYW5kcm9pZC5vcy51c2VydHlwZS5wcm9maWxlLkNMT05FIiAvPgorICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuUFJJVkFURSIgLz4KICAgICA8L2luc3RhbGwtaW4tdXNlci10eXBlPgogPC9jb25maWc+CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWdlbmVyaWMtc3lzdGVtLnhtbCBiL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0tZ2VuZXJpYy1zeXN0ZW0ueG1sCmluZGV4IGUyNDgyZTEuLmVmODA1NmYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0tZ2VuZXJpYy1zeXN0ZW0ueG1sCisrKyBiL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0tZ2VuZXJpYy1zeXN0ZW0ueG1sCkBAIC0yNCw2ICsyNCw3IEBACiAgICAgICAgIDxpbnN0YWxsLWluIHVzZXItdHlwZT0iRlVMTCIgLz4KICAgICAgICAgPGluc3RhbGwtaW4gdXNlci10eXBlPSJQUk9GSUxFIiAvPgogICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuQ0xPTkUiIC8+CisgICAgICAgIDxkby1ub3QtaW5zdGFsbC1pbiB1c2VyLXR5cGU9ImFuZHJvaWQub3MudXNlcnR5cGUucHJvZmlsZS5QUklWQVRFIiAvPgogICAgIDwvaW5zdGFsbC1pbi11c2VyLXR5cGU+CiA8L2NvbmZpZz4KIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc3lzY29uZmlnL3ByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1oYW5kaGVsZC1wcm9kdWN0LnhtbCBiL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0taGFuZGhlbGQtcHJvZHVjdC54bWwKaW5kZXggNTRhZGQyMi4uNTM2YzM1YiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc3lzY29uZmlnL3ByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1oYW5kaGVsZC1wcm9kdWN0LnhtbAorKysgYi90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWhhbmRoZWxkLXByb2R1Y3QueG1sCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICAgIDxpbnN0YWxsLWluIHVzZXItdHlwZT0iRlVMTCIgLz4KICAgICAgICAgPGluc3RhbGwtaW4gdXNlci10eXBlPSJQUk9GSUxFIiAvPgogICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuQ0xPTkUiIC8+CisgICAgICAgIDxkby1ub3QtaW5zdGFsbC1pbiB1c2VyLXR5cGU9ImFuZHJvaWQub3MudXNlcnR5cGUucHJvZmlsZS5QUklWQVRFIiAvPgogICAgIDwvaW5zdGFsbC1pbi11c2VyLXR5cGU+CiAKICAgICA8IS0tICBDYW1lcmEgKENhbWVyYTIpIC0tPgpAQCAtNDIsNiArNDMsNyBAQAogICAgIDxpbnN0YWxsLWluLXVzZXItdHlwZSBwYWNrYWdlPSJjb20uYW5kcm9pZC5kZXNrY2xvY2siPgogICAgICAgICA8aW5zdGFsbC1pbiB1c2VyLXR5cGU9IkZVTEwiIC8+CiAgICAgICAgIDxkby1ub3QtaW5zdGFsbC1pbiB1c2VyLXR5cGU9ImFuZHJvaWQub3MudXNlcnR5cGUucHJvZmlsZS5DTE9ORSIgLz4KKyAgICAgICAgPGRvLW5vdC1pbnN0YWxsLWluIHVzZXItdHlwZT0iYW5kcm9pZC5vcy51c2VydHlwZS5wcm9maWxlLlBSSVZBVEUiIC8+CiAgICAgPC9pbnN0YWxsLWluLXVzZXItdHlwZT4KIAogICAgIDwhLS0gIENvbnRhY3RzIC0tPgpAQCAtNTYsNiArNTgsNyBAQAogICAgICAgICA8aW5zdGFsbC1pbiB1c2VyLXR5cGU9IkZVTEwiIC8+CiAgICAgICAgIDxpbnN0YWxsLWluIHVzZXItdHlwZT0iUFJPRklMRSIgLz4KICAgICAgICAgPGRvLW5vdC1pbnN0YWxsLWluIHVzZXItdHlwZT0iYW5kcm9pZC5vcy51c2VydHlwZS5wcm9maWxlLkNMT05FIiAvPgorICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuUFJJVkFURSIgLz4KICAgICA8L2luc3RhbGwtaW4tdXNlci10eXBlPgogCiAgICAgPCEtLSAgU2VhcmNoIChRdWlja1NlYXJjaEJveCkgVE9ETyhiLzI1ODA1NTQ3OSkgLS0+CkBAIC02NCw2ICs2Nyw3IEBACiAgICAgICAgIDxpbnN0YWxsLWluIHVzZXItdHlwZT0iRlVMTCIgLz4KICAgICAgICAgPGluc3RhbGwtaW4gdXNlci10eXBlPSJQUk9GSUxFIiAvPgogICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuQ0xPTkUiIC8+CisgICAgICAgIDxkby1ub3QtaW5zdGFsbC1pbiB1c2VyLXR5cGU9ImFuZHJvaWQub3MudXNlcnR5cGUucHJvZmlsZS5QUklWQVRFIiAvPgogICAgIDwvaW5zdGFsbC1pbi11c2VyLXR5cGU+CiAKICAgICA8IS0tIFdhbGxwYXBlckNyb3BwZXIgLS0+CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLXRlbGVwaG9ueS1wcm9kdWN0LnhtbCBiL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0tdGVsZXBob255LXByb2R1Y3QueG1sCmluZGV4IGNjMWMxMzUuLjY3YTJhMDEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0tdGVsZXBob255LXByb2R1Y3QueG1sCisrKyBiL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0tdGVsZXBob255LXByb2R1Y3QueG1sCkBAIC0yNCw2ICsyNCw3IEBACiAgICAgICAgIDxpbnN0YWxsLWluIHVzZXItdHlwZT0iRlVMTCIgLz4KICAgICAgICAgPGluc3RhbGwtaW4gdXNlci10eXBlPSJQUk9GSUxFIiAvPgogICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuQ0xPTkUiIC8+CisgICAgICAgIDxkby1ub3QtaW5zdGFsbC1pbiB1c2VyLXR5cGU9ImFuZHJvaWQub3MudXNlcnR5cGUucHJvZmlsZS5QUklWQVRFIiAvPgogICAgIDwvaW5zdGFsbC1pbi11c2VyLXR5cGU+CiA8L2NvbmZpZz4KIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdGVsZXBob255X3N5c3RlbV9leHQubWsgYi90YXJnZXQvcHJvZHVjdC90ZWxlcGhvbnlfc3lzdGVtX2V4dC5tawppbmRleCBmODFhNjA3Li5mODIxMzgxIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC90ZWxlcGhvbnlfc3lzdGVtX2V4dC5taworKysgYi90YXJnZXQvcHJvZHVjdC90ZWxlcGhvbnlfc3lzdGVtX2V4dC5tawpAQCAtMjEsMyArMjEsNyBAQAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgQ2FycmllckNvbmZpZyBcCiAgICAgRW1lcmdlbmN5SW5mbyBcCisKK1BST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0ICs9IFwKKyAgICBod3NlcnZpY2VtYW5hZ2VyIFwKKyAgICBhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMC1zZXJ2aWNlIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3VwZGF0YWJsZV9hcGV4Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdXBkYXRhYmxlX2FwZXgubWsKaW5kZXggZDYwNmUwMC4uODM1N2ZkZiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdXBkYXRhYmxlX2FwZXgubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvdXBkYXRhYmxlX2FwZXgubWsKQEAgLTE0LDE3ICsxNCwxMyBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBJbmhlcml0IHRoaXMgd2hlbiB0aGUgdGFyZ2V0IG5lZWRzIHRvIHN1cHBvcnQgdXBkYXRpbmcgQVBFWGVzCisjwqBjb20uYW5kcm9pZC5hcGV4LmN0cy5zaGltLnYxX3ByZWJ1aWx0IG92ZXJyaWRlcyBDdHNTaGltUHJlYnVpbHQKKyMgYW5kIEN0c1NoaW1Qcml2UHJlYnVpbHQgc2luY2UgdGhleSBhcmUgcGFja2FnZWQgaW5zaWRlIHRoZSBBUEVYLgorUFJPRFVDVF9QQUNLQUdFUyArPSBjb20uYW5kcm9pZC5hcGV4LmN0cy5zaGltLnYxX3ByZWJ1aWx0CitQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTIDo9IHJvLmFwZXgudXBkYXRhYmxlPXRydWUKIAotaWZuZXEgKCQoT1ZFUlJJREVfVEFSR0VUX0ZMQVRURU5fQVBFWCksdHJ1ZSkKLSAgI8KgY29tLmFuZHJvaWQuYXBleC5jdHMuc2hpbS52MV9wcmVidWlsdCBvdmVycmlkZXMgQ3RzU2hpbVByZWJ1aWx0Ci0gICMgYW5kIEN0c1NoaW1Qcml2UHJlYnVpbHQgc2luY2UgdGhleSBhcmUgcGFja2FnZWQgaW5zaWRlIHRoZSBBUEVYLgotICBQUk9EVUNUX1BBQ0tBR0VTICs9IGNvbS5hbmRyb2lkLmFwZXguY3RzLnNoaW0udjFfcHJlYnVpbHQKLSAgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyA6PSByby5hcGV4LnVwZGF0YWJsZT10cnVlCi0gIFRBUkdFVF9GTEFUVEVOX0FQRVggOj0gZmFsc2UKLSAgIyBVc2UgY29tcHJlc3NlZCBhcGV4ZXMgaW4gcHJlLWluc3RhbGxlZCBwYXJ0aXRpb25zLgotICAjIE5vdGU6IHRoaXMgZG9lc24ndCBtZWFuIHRoYXQgYWxsIHByZS1pbnN0YWxsZWQgYXBleGVzIHdpbGwgYmUgY29tcHJlc3NlZC4KLSAgIyAgV2hldGhlciBhbiBhcGV4IGlzIGNvbXByZXNzZWQgb3Igbm90IGlzIGNvbnRyb2xsZWQgYXQgYXBleCBTb29uZyBtb2R1bGUKLSAgIyAgdmlhIGNvbXByZXNpYmxlIHByb3BlcnR5LgotICBQUk9EVUNUX0NPTVBSRVNTRURfQVBFWCA6PSB0cnVlCi1lbmRpZgorIyBVc2UgY29tcHJlc3NlZCBhcGV4ZXMgaW4gcHJlLWluc3RhbGxlZCBwYXJ0aXRpb25zLgorIyBOb3RlOiB0aGlzIGRvZXNuJ3QgbWVhbiB0aGF0IGFsbCBwcmUtaW5zdGFsbGVkIGFwZXhlcyB3aWxsIGJlIGNvbXByZXNzZWQuCisjICBXaGV0aGVyIGFuIGFwZXggaXMgY29tcHJlc3NlZCBvciBub3QgaXMgY29udHJvbGxlZCBhdCBhcGV4IFNvb25nIG1vZHVsZQorIyAgdmlhIGNvbXByZXNpYmxlIHByb3BlcnR5LgorUFJPRFVDVF9DT01QUkVTU0VEX0FQRVggOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmJvb3QubWsgYi90YXJnZXQvcHJvZHVjdC92Ym9vdC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhNDg4My4uMDAwMDAwMAotLS0gYS90YXJnZXQvcHJvZHVjdC92Ym9vdC5taworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgUHJvdmlkZXMgZGVwZW5kZW5jaWVzIG5lY2Vzc2FyeSBmb3IgdmVyaWZpZWQgYm9vdAotCi1QUk9EVUNUX1NVUFBPUlRTX1ZCT09UIDo9IHRydWUKLQotIyBUaGUgZGV2IGtleSBpcyB1c2VkIHRvIHNpZ24gYm9vdCBhbmQgcmVjb3ZlcnkgaW1hZ2VzLgotIyBXZSBleHBlY3QgdGhpcyBmaWxlIHRvIGV4aXN0IHdpdGggdGhlIHN1ZmZpeGVzICIudmJwcml2ayIgYW5kICIudmJwdXBrIi4KLSMgVE9ETzogZmluZCBhIHByb3BlciBsb2NhdGlvbiBmb3IgdGhpcwotUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSA6PSBleHRlcm5hbC92Ym9vdF9yZWZlcmVuY2UvdGVzdHMvZGV2a2V5cy9rZXJuZWxfZGF0YV9rZXkKLVBST0RVQ1RfVkJPT1RfU0lHTklOR19TVUJLRVkgOj0gZXh0ZXJuYWwvdmJvb3RfcmVmZXJlbmNlL3Rlc3RzL2RldmtleXMva2VybmVsX3N1YmtleQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvT1dORVJTIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjA2ODYKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS9PV05FUlMKQEAgLTAsMCArMSw0IEBACit6aGFuZ2tlbHZpbkBnb29nbGUuY29tCitkdmFuZGVyQGdvb2dsZS5jb20KK2FrYWlsYXNoQGdvb2dsZS5jb20KKwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvdmFiY19mZWF0dXJlcy5tayBiL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL3ZhYmNfZmVhdHVyZXMubWsKaW5kZXggODc0ZWI5Yy4uZTI3NDVhMSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvdmFiY19mZWF0dXJlcy5taworKysgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS92YWJjX2ZlYXR1cmVzLm1rCkBAIC0zNCwxMCArMzQsMjkgQEAKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5pb191cmluZy5lbmFibGVkPXRydWUKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi54b3IuZW5hYmxlZD10cnVlCiBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIuYmF0Y2hfd3JpdGVzPXRydWUKKyMgTG93IG1lbW9yeSBkZXZpY2UgY29uZmlndXJhdGlvbnMuIElmIG1lbW9yeSB1c2FnZSBhbmQgY3B1IHV0aWxpemF0aW9uIGlzCisjIGEgYm90dGxlbmVjayBkdXJpbmcgT1RBLCB0aGUgYmVsb3cgY29uZmlndXJhdGlvbnMgY2FuIGJlIGFkZGVkIHRvIGEKKyMgZGV2aWNlJ3MgLm1rIGZpbGUgaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3IgbG93IG1lbSBkZXZpY2VzLiBEaXNhYmxpbmcKKyMgcm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi54b3IuZW5hYmxlZCBhbmQgcm8udmlydHVhbF9hYi5pb191cmluZy5lbmFibGVkCisjIGlzIGFsc28gcmVjb21tZW5kZWQKKyMKKyMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLnJlYWRfYWhlYWRfc2l6ZT0xNgorIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIub19kaXJlY3QuZW5hYmxlZD10cnVlCisjIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5tZXJnZV90aHJlYWRfcHJpb3JpdHk9MTkKKyMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLndvcmtlcl90aHJlYWRfcHJpb3JpdHk9MAorIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIubnVtX3dvcmtlcl90aHJlYWRzPTMKKyMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLm51bV9tZXJnZV90aHJlYWRzPTEKKyMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLm51bV92ZXJpZnlfdGhyZWFkcz0xCisjIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5jb3dfb3BfbWVyZ2Vfc2l6ZT0xNgorIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIudmVyaWZ5X3RocmVzaG9sZF9zaXplPTEwNzM3NDE4MjQKKyMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLnZlcmlmeV9ibG9ja19zaXplPTEwNDg1NzYKIAogIyBFbmFibGluZyB0aGlzIHByb3BlcnR5LCB3aWxsIGltcHJvdmUgT1RBIGluc3RhbGwgdGltZQogIyBidXQgd2lsbCB1c2UgYW4gYWRkaXRpb25hbCBDUFUgY29yZQogIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIuY29tcHJlc3Npb24udGhyZWFkcz10cnVlCitpZm5kZWYgUFJPRFVDVF9WSVJUVUFMX0FCX0NPTVBSRVNTSU9OX0ZBQ1RPUgorICAgIFBST0RVQ1RfVklSVFVBTF9BQl9DT01QUkVTU0lPTl9GQUNUT1IgOj0gNjU1MzYKK2VuZGlmCiAKIFBST0RVQ1RfVklSVFVBTF9BQl9DT01QUkVTU0lPTiA6PSB0cnVlCiBQUk9EVUNUX1ZJUlRVQUxfQUJfQ09NUFJFU1NJT05fTUVUSE9EID89IG5vbmUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3dpbmRvd19leHRlbnNpb25zLm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvd2luZG93X2V4dGVuc2lvbnMubWsKaW5kZXggNWY1NDMxZi4uZDI3YTYxMyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvd2luZG93X2V4dGVuc2lvbnMubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvd2luZG93X2V4dGVuc2lvbnMubWsKQEAgLTE0LDExICsxNCwxNCBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyAvc3lzdGVtX2V4dCBwYWNrYWdlcwotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgYW5kcm9pZHgud2luZG93LmV4dGVuc2lvbnMgXAotICAgIGFuZHJvaWR4LndpbmRvdy5zaWRlY2FyCi0KLSMgcHJvcGVydGllcworIyBFeHRlbnNpb24gb2Ygd2luZG93X2V4dGVuc2lvbnNfYmFzZS5tayB0byBlbmFibGUgdGhlIGFjdGl2aXR5IGVtYmVkZGluZworIyBmZWF0dXJlIGZvciBhbGwgYXBwcyBieSBkZWZhdWx0LiBBbGwgbGFyZ2Ugc2NyZWVuIGRldmljZXMgbXVzdCBpbmhlcml0CisjIHRoaXMgaW4gYnVpbGQuIE9wdGlvbmFsIGZvciBvdGhlciBmb3JtIGZhY3RvcnMuCisjCisjIEluZGljYXRlZCB3aGV0aGVyIHRoZSBBY3Rpdml0eSBFbWJlZGRpbmcgZmVhdHVyZSBzaG91bGQgYmUgZ3VhcmRlZCBieQorIyBBbmRyb2lkIDE1IHRvIGF2b2lkIGFwcCBjb21wYXQgaW1wYWN0LgorIyBJZiB0cnVlIChvciBub3Qgc2V0KSwgdGhlIGZlYXR1cmUgaXMgb25seSBlbmFibGVkIGZvciBhcHBzIHdpdGggdGFyZ2V0CisjIFNESyBvZiBBbmRyb2lkIDE1IG9yIGFib3ZlLgorIyBJZiBmYWxzZSwgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCBmb3IgYWxsIGFwcHMuCiBQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUyArPSBcCi0gICAgcGVyc2lzdC53bS5leHRlbnNpb25zLmVuYWJsZWQ9dHJ1ZQorICAgIHBlcnNpc3Qud20uZXh0ZW5zaW9ucy5hY3Rpdml0eV9lbWJlZGRpbmdfZ3VhcmRfd2l0aF9hbmRyb2lkXzE1PWZhbHNlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC93aW5kb3dfZXh0ZW5zaW9uc19iYXNlLm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvd2luZG93X2V4dGVuc2lvbnNfYmFzZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTBlNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvd2luZG93X2V4dGVuc2lvbnNfYmFzZS5tawpAQCAtMCwwICsxLDMzIEBACisjCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFRoZSBiYXNlIHZlcnNpb24gb2Ygd2luZG93X2V4dGVuc2lvbnMubWsgdG8gYmUgaW5jbHVkZWQgb24gYWxsIG5vbi13ZWFyYWJsZQorIyBkZXZpY2VzLiBEZXZpY2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtdWx0aS13aW5kb3cgY2FuIGNob29zZSB0byBkcm9wIHRoaXMuCisjCisjIE5vdGU6IGJ5IGRlZmF1bHQgdGhlIEFjdGl2aXR5IEVtYmVkZGluZyBmZWF0dXJlIGlzIGd1YXJkZWQgYnkgYXBwJ3MKKyMgdGFyZ2V0U0RLIG9uIEFuZHJvaWQgMTUgdG8gYXZvaWQgYXBwIGNvbXBhdCBpbXBhY3QuCisjCisjIExhcmdlIHNjcmVlbiBkZXZpY2VzIG11c3QgaW5oZXJpdCB3aW5kb3dfZXh0ZW5zaW9ucy5tayB0byBlbmFibGUgdGhlCisjIEFjdGl2aXR5IEVtYmVkZGluZyBmZWF0dXJlIGZvciBhbGwgYXBwcy4KKworIyAvc3lzdGVtX2V4dCBwYWNrYWdlcworUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgYW5kcm9pZHgud2luZG93LmV4dGVuc2lvbnMgXAorICAgIGFuZHJvaWR4LndpbmRvdy5zaWRlY2FyCisKKyMgcHJvcGVydGllcworUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gXAorICAgIHBlcnNpc3Qud20uZXh0ZW5zaW9ucy5lbmFibGVkPXRydWUKZGlmZiAtLWdpdCBhL3RlYW1zL0FuZHJvaWQuYnAgYi90ZWFtcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Njk5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZWFtcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDQyMSBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9xbWNfcHNzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzNDI1NDQ4NDEzNzU3NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzNDI1NDQ4NDEzNzU3NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY3B1X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTExOTA1OTc0NzMwNzUyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTExOTA1OTc0NzMwNzUyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wd2dfbW9iaWxlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NjkyNzQ1ODgzMTU2NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4NjkyNzQ1ODgzMTU2NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGNlX3dldSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjA1NzI1OTY4ODkxOTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjA1NzI1OTY4ODkxOTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BlZXBzX3RfcGdtX2FuZHJvaWRfZW5ncHJvZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82Mjg4Mjg0OTYwMzU4NDAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2Mjg4Mjg0OTYwMzU4NDAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FwcHNlYXJjaCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDc1NjYxNzE2ODE1ODcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDc1NjYxNzE2ODE1ODcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NoYXliYV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMTMxMzUwMjAyMjg2MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMTMxMzUwMjAyMjg2MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2Nsb3VkX3BsYXRmb3JtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5MTc3NjI1MjYyODE3MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5MTc3NjI1MjYyODE3MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3NvZnR3YXJlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NTYwMDUxMjA2MjI1OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4NTYwMDUxMjA2MjI1OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGxhdGZvcm1fZW5hYmxlcl9mcmFtZXdvcmtfbWFrZV9waXhlbF8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg5Mzk0NDA5NzI0MzEzNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg5Mzk0NDA5NzI0MzEzNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfcG93ZXJfc3ciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjcwMzE4NDY1NTI4NjI3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjcwMzE4NDY1NTI4NjI3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tYXJ2aW5wYXVsX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDgwMDY4OTY5MjkwMTM3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDgwMDY4OTY5MjkwMTM3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pbnRlcmFjdGl2ZV90diIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTUwNTc3ODUzNjYxMTg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTUwNTc3ODUzNjYxMTg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19zZW5zb3JfZnJhbWV3b3JrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwMDUzMTA1NjcyODQ3MzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwMDUzMTA1NjcyODQ3MzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX2FyY2giLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjE3Mzc2OTgwNjUxMjEyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjE3Mzc2OTgwNjUxMjEyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9sYW5lY2hyX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY3NDU5NDIwNDgxMTI2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY3NDU5NDIwNDgxMTI2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90ZXN0X2VuZ19hbmRyb2lkX2Zvcl93b3JrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5MDk4ODcwMTU4NDU4ODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5MDk4ODcwMTU4NDU4ODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2FtZXJhX2FwcCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjE2NjQ0OTM0NTMzMTIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjE2NjQ0OTM0NTMzMTIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3ZhbWFyYWp1X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE1MDUxMDk2MDc3MTA3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE1MDUxMDk2MDc3MTA3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX2F1ZGlvX2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODIzNTc1MzUzMDY1NDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODIzNTc1MzUzMDY1NDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N1cGVyZ2x1ZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjExNjY3ODgyOTk5ODA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjExNjY3ODgyOTk5ODA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Rpc3BsYXlfZnJhbWV3b3JrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwMzU2MDA5MjUxNjM1MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwMzU2MDA5MjUxNjM1MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5hbnRoYWtfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NzA2MDQzMzAxMjk4MTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NzA2MDQzMzAxMjk4MTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3FtY19wcW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDcxNTI2NzYzMjI2NzI2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDcxNTI2NzYzMjI2NzI2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zZWFyY2hfYWxsYXBwcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTI2MTYwNjcwMTk1NzEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTI2MTYwNjcwMTk1NzEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NvbW11bmFsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzODA2Njk5NDI1MzAwNDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzODA2Njk5NDI1MzAwNDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbm92YSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDE4OTU1MDc0MDQzOTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDE4OTU1MDc0MDQzOTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfZnJhbWV3b3JrX29fbyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTk5NDk3MjEzNTA5NjMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTk5NDk3MjEzNTA5NjMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfZ28iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU0MzIwNTcxMzQ0NDg2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU0MzIwNTcxMzQ0NDg2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfZnJhbWV3b3JrcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTM4MzkyNDA4ODE3NjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTM4MzkyNDA4ODE3NjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NzZF9zZW5zb3IiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA4NDcwMzUzOTIwMDAwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA4NDcwMzUzOTIwMDAwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kb250ZWtfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzQ2MDc2Mjg1MDQyNjg4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzQ2MDc2Mjg1MDQyNjg4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NhcnJpZXJfZmllbGRfdGVzdCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDA5NzY2NjQwOTc1ODcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDA5NzY2NjQwOTc1ODcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Btd19zdGFuZGFyZHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQyODgwNjgyMjUyNjk3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQyODgwNjgyMjUyNjk3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9idWlsZF9pbmZyYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTE2MTg0MTY0NDMzOTIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTE2MTg0MTY0NDMzOTIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3FtY19nZnQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ1NDEzOTQ0NjEzMjczNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ1NDEzOTQ0NjEzMjczNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3N0b3JhZ2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMwMTU5NDkzNjA0OTY2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMwMTU5NDkzNjA0OTY2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9tb2JpbGVfd2lyZWxlc3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDgyMTkxODE3NTg4NzM2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDgyMTkxODE3NTg4NzM2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmFfZnJvbV9nb29nbGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc5OTY5NDEwNDg1NDUyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc5OTY5NDEwNDg1NDUyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9jb25uZWN0aXZpdHlfc2V0dGluZ3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTYyMjQ5NjQ1MDg3MTI5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTYyMjQ5NjQ1MDg3MTI5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkYnVndG9vbF9hYnRfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1MzE4MTc3ODE0OTM3NjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1MzE4MTc3ODE0OTM3NjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3NlY3VyaXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMjU2OTkzMjUzNjIxNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMjU2OTkzMjUzNjIxNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGFzY2FsbG91aXNfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTExMjM4Mjc2MzE3MTg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTExMjM4Mjc2MzE3MTg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfY2FtZXJhX2Vjb3N5c3RlbV9lbmFibGluZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTI5MjkwMjY5MzI3MzYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTI5MjkwMjY5MzI3MzYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NhbGVuZGFyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY3MTkxMjc1NzM4ODkwMjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY3MTkxMjc1NzM4ODkwMjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2djIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1OTAzMTU0OTkwNjEyNDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1OTAzMTU0OTkwNjEyNDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGlhZ25vc3RpY190b29sIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2ODk5MjQ1NjQ3NDYyNDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2ODk5MjQ1NjQ3NDYyNDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfY2FtZXJhX3N5c3RlbV9zb2Z0d2FyZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82Mzg2NTI1MzA2NDg2Nzg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2Mzg2NTI1MzA2NDg2Nzg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NyZWRlbnRpYWxfbWFuYWdlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Mjc2NDAzNDI4NjU1MTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Mjc2NDAzNDI4NjU1MTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd3RpX3dlYXJfdG9vbHNfYW5kX2luZnJhXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjI1NTcxMzA2NDM4NjU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjI1NTcxMzA2NDM4NjU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2Jpb21ldHJpY3NfZmFjZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDI4NzA1OTI2NzQyMDE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDI4NzA1OTI2NzQyMDE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2xvY2F0aW9uX3RpbWUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg4MzgwNzYwMDAxNzQwOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg4MzgwNzYwMDAxNzQwOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2hhcmR3YXJlX2JhY2tlZF9zZWN1cml0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82Mzk4NTk1NTU2MzQzODA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2Mzk4NTk1NTU2MzQzODA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BsYXlfbmV3c3N0YW5kIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxNzEwMTUyMDE5ODA0MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxNzEwMTUyMDE5ODA0MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVwcmVjYXRlZF9mcmFtZXdvcmtfamFnZ2llcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzUzMjA2NjA4ODg3ODA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzUzMjA2NjA4ODg3ODA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21ha2VfcGl4ZWxfdHBnbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDYxMDY5ODY0NjY1MDg4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDYxMDY5ODY0NjY1MDg4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21ha2VfdHJhbnNmb3JtZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIyNDUzOTQyNzQzODU5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIyNDUzOTQyNzQzODU5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93aXR0cm9ja190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3MDc0MTIwODM0NzQ0MzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3MDc0MTIwODM0NzQ0MzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2FuZHJvaWRfY29tcGFuaW9uX3NkayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODY0OTIzNjM3MDIyNzIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODY0OTIzNjM3MDIyNzIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Fzc2lzdGFudF9zeXN1aV9pbnRlZ3JhdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODg0MjgyNTc1MDYwOTkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODg0MjgyNTc1MDYwOTkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RoaW5ncyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjA2MTk5NTc0MDY5MjQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjA2MTk5NTc0MDY5MjQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF93MTMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTYxMjQ2OTEyMDUzMjQ4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTYxMjQ2OTEyMDUzMjQ4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pcWJhbGFzaWZfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTEyMDQ5ODEzMDk0NDAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTEyMDQ5ODEzMDk0NDAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Jpb21ldHJpY19zZWN1cml0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Nzk3OTExOTYwNjQ5NzI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Nzk3OTExOTYwNjQ5NzI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NpbGJlcnN0X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcxMDg5MjU4NDA0MjQ5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcxMDg5MjU4NDA0MjQ5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbXdfdGVsZXBob255IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwMjkxMjE0NDQxNTEyOTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwMjkxMjE0NDQxNTEyOTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fenp6IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzNTEzNDA5MzQzOTc5NTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzNTEzNDA5MzQzOTc5NTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbGl0ZV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NDc5MjU4MTMzNDYzMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NDc5MjU4MTMzNDYzMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ21zX2NvcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTczNTYxNDQyMjg0MzM5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTczNTYxNDQyMjg0MzM5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kaWFsZXJfbWFrZV9waXhlbF8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTEyNjM5NjUwOTk3ODYyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTEyNjM5NjUwOTk3ODYyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfY29sb3IiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ4OTIzNjEyNTU4MTMxMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ4OTIzNjEyNTU4MTMxMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfbm90aWZpY2F0aW9uc19hbGVydHNfYXR0ZW50aW9uX21hbmFnZW1lbnQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI2NzY0MzY4MTk5NjgwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI2NzY0MzY4MTk5NjgwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9md2tfbmZjIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5NjIzMTI1MTI4NjQyNTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5NjIzMTI1MTI4NjQyNTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9wZXJzb25hbGl6YXRpb25fZGV2ZWxvcGVyX3N1cmZhY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4MTk4OTA5ODg4MTAyNDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4MTk4OTA5ODg4MTAyNDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3Jhamt1bWFyX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3MDA1Mzg5NDAxMjkyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE3MDA1Mzg5NDAxMjkyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pbl9tYXJrZXRfdHBtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzNTI1NDk4ODgxOTY2MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzNTI1NDk4ODgxOTY2MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbGVhbm5vZ2FzYXdhcmFfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTA1NDY3MTk4NDcyMTkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTA1NDY3MTk4NDcyMTkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3p1cmlrZW1wX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDU1OTc5NjYwMzg3OTQyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDU1OTc5NjYwMzg3OTQyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3RlbGVtZXRyeV9pbmZyYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Mjk1ODA5NzcxNzMyOTkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Mjk1ODA5NzcxNzMyOTkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbV91aV9zZW5zb3JzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NDc2NTM0OTI2MjEzMTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NDc2NTM0OTI2MjEzMTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2luZG93aW5nX2FuaW1hdGlvbnNfdHJhbnNpdGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDgwMzA0MDMzNzM2Mjk0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDgwMzA0MDMzNzM2Mjk0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2ZyYW1ld29ya19qamFnZ2kiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ3MTc0MjI3MDg5ODE3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ3MTc0MjI3MDg5ODE3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X2hlYXJpbmdfYWlkcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NjYxMjI2MzQwMjUzNjk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NjYxMjI2MzQwMjUzNjk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BlcmZvcm1hbmNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NDIwMDA1MjE2MjU2MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4NDIwMDA1MjE2MjU2MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2xvdWRfYW5kcm9pZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTgwMjU1NzYwMDIzNTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTgwMjU1NzYwMDIzNTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Zpc3VhbF9kZXNpZ24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDUwNDE2MTM5OTczNDI3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDUwNDE2MTM5OTczNDI3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93aWxraW5zb25jbGF5X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY4MDk5NzEyODYzNDM2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY4MDk5NzEyODYzNDM2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90Y2N5cF9uYWRpYWUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU1NjUxODgzMTY1Mjg2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU1NjUxODgzMTY1Mjg2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X3NldHRpbmdzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NDE4MDY1MTA1ODc5MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NDE4MDY1MTA1ODc5MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faGFuc211bGxlcl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNjkxOTIyNTc3NjUzNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNjkxOTIyNTc3NjUzNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcmV0YWlsX2RlbW9fbW9kZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTIwNzg3NTMxMjM1MzI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTIwNzg3NTMxMjM1MzI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2xzZV9kcmVhbXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMxNzU1ODg0MjA5NzY2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMxNzU1ODg0MjA5NzY2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3VzYiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDkwNzA3ODU0NDI2MTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDkwNzA3ODU0NDI2MTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2N1cnRpc2dhbGxvd2F5X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcwNjg1NzczMDcwMzM2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcwNjg1NzczMDcwMzM2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmFfYWxnb3JpdGhtcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTQ0ODU0OTgwODg2NTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTQ0ODU0OTgwODg2NTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Nhc3RfM3AiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU4NTU2NDk3Mjg3NTc3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU4NTU2NDk3Mjg3NTc3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90ZXN0X2VuZ19hbmRyb2lkX3dlYXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk3OTE1MDQyMjkzMzUwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDk3OTE1MDQyMjkzMzUwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tZXNjaF90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyMDU0NjU4OTkzNjg0NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyMDU0NjU4OTkzNjg0NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2F1ZGlvX2FyY2giLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTU2MDUwMTM3NzA3MzE1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTU2MDUwMTM3NzA3MzE1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZWZ1bmN0X3VzZV9jb250cm9sc19xdWlja19zZXR0aW5ncyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NjY3ODYxMDQzNDEyOTkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NjY3ODYxMDQzNDEyOTkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9kZXZlbG9wZXJfZGV2eCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODk0ODkwNzY0Njk3NjAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODk0ODkwNzY0Njk3NjAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcnVzdCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODQ0NjAwNTg2MzA1NTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODQ0NjAwNTg2MzA1NTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FpbGFicyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NjczNDcwNTM4Mjg1MDU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NjczNDcwNTM4Mjg1MDU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9jb25uZWN0aXZpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI0NTE0OTQ2NjI2MzU1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI0NTE0OTQ2NjI2MzU1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2NvcmVfZXhwZXJpbWVudHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcwOTY1NDk2NTc4MDQ4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcwOTY1NDk2NTc4MDQ4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9uYXRpdmVfdG9vbHNfbGlicmFyaWVzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5MjAzMzIzNzYzMDk3NjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5MjAzMzIzNzYzMDk3NjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXBwX2NvbXBhdCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTA3MTMyNDExMzE0MTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTA3MTMyNDExMzE0MTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3pyYV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMjc2MTUyNjc1ODYwNDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMjc2MTUyNjc1ODYwNDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfd2F0Y2hfc3lzdGVtX3NvZnR3YXJlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyOTU5OTQ1MDA5NzI1NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyOTU5OTQ1MDA5NzI1NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3VyZmFjZXNfZW5ncHJvZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTU0NDc4MTc2NjAwMDY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTU0NDc4MTc2NjAwMDY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcGVybWlzc2lvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTUzMzk3NzM0MDMxMzYwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTUzMzk3NzM0MDMxMzYwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbGF0Zm9ybV9wcm9ncmFtX21ncnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc2NjM5NDkyMjk1ODg0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc2NjM5NDkyMjk1ODg0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX3N5c3RlbV9oZWFsdGgiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg2NDgwMTIxMzY0NDgwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg2NDgwMTIxMzY0NDgwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tZXNzYWdlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTM3NDgwMDk3MzMzMjQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTM3NDgwMDk3MzMzMjQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BhbG1lcl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NDM1NzAwNTIyMzUyNjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NDM1NzAwNTIyMzUyNjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF92aWRlb19pbWFnZV9jb2RlY3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTczMzI0NjExMDQzMzI4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTczMzI0NjExMDQzMzI4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbGF5X211c2ljIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwMTU0NDAxMzIxMTIzODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwMTU0NDAxMzIxMTIzODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX2Nsb2Nrd29ya19pbnRlcm5hbF8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUwOTY3MDYwODc5NzY5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUwOTY3MDYwODc5NzY5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tdWx0aXRhc2tpbmdfd2luZG93aW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxNDkxODU0MzY5NzUxMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxNDkxODU0MzY5NzUxMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdnIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg1NDM1NTg1MzE4MDkyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg1NDM1NTg1MzE4MDkyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tYXJ1ZWxfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzAyNTUxODEwMTQ2MzA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzAyNTUxODEwMTQ2MzA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3R2X29zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2NjI0OTEwNzQxMzQwMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2NjI0OTEwNzQxMzQwMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXV0b19lbmdwcm9kIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxOTk5NDk0NzU0Nzk1NTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxOTk5NDk0NzU0Nzk1NTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc2FyYWhjb2JiX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc1NTY5MjE3OTk0NzUyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc1NTY5MjE3OTk0NzUyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X3NlcnZpY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzNjcyODM4NTMwMDA3MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzNjcyODM4NTMwMDA3MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZG9jdW1lbnRzdWkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTgwNTk4MzE2NzAyMTA1NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTgwNTk4MzE2NzAyMTA1NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYXJyaWVyX2NlcnRfZm9sbG93X3VwIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY3NTE5MTIwOTk3NDE2OTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY3NTE5MTIwOTk3NDE2OTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbW9iaWxlX2RldmljZV9wYXJ0bmVycyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODMzMDU3NzE3MDkyMzUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODMzMDU3NzE3MDkyMzUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FjdGl2aXR5X3JlY29nbml0aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMDQ3MDEyNjgwMDA3NjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMDQ3MDEyNjgwMDA3NjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1famFzb25jYW1wYmVsbF90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4MzQ5NzI1MjQ1MTEyMzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4MzQ5NzI1MjQ1MTEyMzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93YWxsZXRfb25fd2VhciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzI0OTYwNDM3NzMxMzI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzI0OTYwNDM3NzMxMzI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2dsYW5jZWFibGVzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2NTgyMjIwMDQ2MDA4MzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2NTgyMjIwMDQ2MDA4MzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9zYWZlX2Jyb3dzaW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2ODU3MTMyNDQ3ODI1OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2ODU3MTMyNDQ3ODI1OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9pbnB1dCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTQxOTk0Nzc1ODA1OTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTQxOTk0Nzc1ODA1OTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcnVzdF90b29sY2hhaW4iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUzMDU5MDk4OTk3NTU1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUzMDU5MDk4OTk3NTU1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9leG8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTYzMTU0NTI0ODA4ODA2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTYzMTU0NTI0ODA4ODA2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmF4IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNzI1OTA2Njk0Nzk5MzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNzI1OTA2Njk0Nzk5MzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYWNjZXNzaWJpbGl0eV9zb3VuZF9hbXBsaWZpZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY3NDg0MDMxMjAyMDk5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY3NDg0MDMxMjAyMDk5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3ByaW50aW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNTc1MjgxNDYwNjc0NTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNTc1MjgxNDYwNjc0NTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZHRpc2VsaWNlX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3NzkzNDI1MzAzMTQyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE3NzkzNDI1MzAzMTQyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wZXJzb25hbF9zYWZldHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIyMjI4NTE0NzExMTQyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIyMjI4NTE0NzExMTQyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ub3RpZmljYXRpb25zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5OTM1MjEzNTU1ODc1ODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5OTM1MjEzNTU1ODc1ODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1famF2YV9jb3JlX2xpYnJhcmllcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzY4MDQ0MTkwNDAwNTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzY4MDQ0MTkwNDAwNTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3VwZGF0YWJsZV9zZGtfYXBpcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODQwMjE1MTM5NDgzNjQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODQwMjE1MTM5NDgzNjQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfbG93X3Bvd2VyX21jdV9leHBlcmllbmNlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTcyODc4MDEzNjI4NDE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTcyODc4MDEzNjI4NDE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Jpb21ldHJpY3NfZnJhbWV3b3JrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMDU0MTU0MjU5OTg4NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMDU0MTU0MjU5OTg4NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGVzdG8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTU1MTA5ODUyODgyNTM0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTU1MTA5ODUyODgyNTM0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX2VuZ2luZWVyaW5nX2ZvdW5kYXRpb25zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzNjY5MzYyNzU2ODEyODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzNjY5MzYyNzU2ODEyODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93Y3NfZGV2ZWxvcGVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMTQxOTk1Nzk0NTk1ODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMTQxOTk1Nzk0NTk1ODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYWFvc19mcmFtZXdvcmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU0Nzc5NDIyMzMzMzM3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU0Nzc5NDIyMzMzMzM3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyXzN4cCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjkyMzE3NjEyNTM5OTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjkyMzE3NjEyNTM5OTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Nsb2Nrd29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTA4NzgxNjc4NzU1ODQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTA4NzgxNjc4NzU1ODQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2Nvbm5lY3Rpdml0eV93aWZpX2RyaXZlcnNfZmlybXdhcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDU4MzMyNjIzNjkzNDE0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDU4MzMyNjIzNjkzNDE0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9nYW1lcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NzM2NzE5NzU5OTMzNDQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NzM2NzE5NzU5OTMzNDQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbXNfbjRfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0NzQ0ODYyMzY3MDg4NjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0NzQ0ODYyMzY3MDg4NjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9rdm0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUyOTMxODE4NDcxNDI0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUyOTMxODE4NDcxNDI0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2RfdzIyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1ODAwMzkzNTI5NzUzNjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1ODAwMzkzNTI5NzUzNjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9zdWRvIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzMjkzNDQ4NzYzODAxNjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzMjkzNDQ4NzYzODAxNjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3N5c3RlbV9oZWFsdGhfYW5kX3Bvd2VyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyMTkxNDc0NTc2NTg4ODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyMTkxNDc0NTc2NTg4ODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9idWlsZF9yZWxlYXNlX3Rvb2xzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNjA1NTgxMDc4MDM2NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNjA1NTgxMDc4MDM2NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZnVzZWRfcHJlc2VuY2VfcHJvdmlkZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUzNjM0NDc1MzMwNzY0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUzNjM0NDc1MzMwNzY0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hZ3NhIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxNTc4MjY4ODc5MDkzNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxNTc4MjY4ODc5MDkzNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2RldmVsb3Blcl90aWxlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NjMzNzc3Mzk2NjEzMTIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NjMzNzc3Mzk2NjEzMTIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Vzc2VudGlhbF9hcHBsaWNhdGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDkyNjM3Mzg2NDgwMDI1NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDkyNjM3Mzg2NDgwMDI1NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9tb2JpbGVfZGF0YSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTk2NzQyNjA4OTc3OTIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTk2NzQyNjA4OTc3OTIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF93NTIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI4MDk3MjE5MDIyMDI4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI4MDk3MjE5MDIyMDI4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9tb2JpbGVfY29ubmVjdGl2aXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY3NTQzMTE5NDU5Nzc4NTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY3NTQzMTE5NDU5Nzc4NTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZXNzZW50aWFsYXBwc19jbG9ja19jYWxjdWxhdG9yIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNzAzNjM3Mjg2NzQ4MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNzAzNjM3Mjg2NzQ4MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3NkX3N5c3RlbV9oZWFsdGgiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ1Njg5NDA1MDY2NDQ0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ1Njg5NDA1MDY2NDQ0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9jb250aW51aXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3ODY2MzU1NTEzMDk4MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3ODY2MzU1NTEzMDk4MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9zb2Z0d2FyZV9udGkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE2NDk3MzU1ODc1OTQyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE2NDk3MzU1ODc1OTQyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tYWNoaW5lX2xlYXJuaW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNzY1NjgzMTgyNDY5MTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNzY1NjgzMTgyNDY5MTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfbWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTMzOTg4MzEwODk5MDk3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTMzOTg4MzEwODk5MDk3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9leF9lbnRlcnByaXNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY3MzgzNjkwMjczNzUxMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY3MzgzNjkwMjczNzUxMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2FvYyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzEyNDY0OTgzNDI1MDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzEyNDY0OTgzNDI1MDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcGxhdGZvcm1fY29tbXVuaWNhdGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU3NzUwNTQxNTEwMjQ2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU3NzUwNTQxNTEwMjQ2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zdW5zaGluZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTA1MDUwMzI5Nzc2MTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTA1MDUwMzI5Nzc2MTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3FtY19pcXRfdGFvIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNjU0NjIwODU3MTM5MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNjU0NjIwODU3MTM5MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWNraWxsb3BfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTI2NTg5NTk5NzQ0MDAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTI2NTg5NTk5NzQ0MDAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3Byb2Nlc3NfZXhwZXJpZW5jZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzQ1NDM2NjMzMjM1NDU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzQ1NDM2NjMzMjM1NDU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF9sMSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTE5ODg3OTExMjg4ODMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTE5ODg3OTExMjg4ODMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZvbGRhYmxlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTQ5NDIxMzkyOTIwNTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTQ5NDIxMzkyOTIwNTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FyY19uZXh0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMzg5MTc2NTkzNjEyODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMzg5MTc2NTkzNjEyODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9ydWJpZGl1bSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDk4MDEyNTI5Mjk1MzYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDk4MDEyNTI5Mjk1MzYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9wb3dlcl9lbXVsYXRvciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTYwMzM4OTM2NzI1NTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTYwMzM4OTM2NzI1NTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfZnJhbWV3b3JrX3N2ZXRvc2xhdmdhbm92IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0MDQxMTc0OTI1MzEyMDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0MDQxMTc0OTI1MzEyMDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ3JlZ3NpbW9uX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcwMjAxODUxMDUyMDMyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcwMjAxODUxMDUyMDMyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX29wdXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA5ODM1MTYzNjY3NjYwOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA5ODM1MTYzNjY3NjYwOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90ZXh0X3RvX3NwZWVjaCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzY4OTMzMTIwNDQyMzY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzY4OTMzMTIwNDQyMzY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19hdWRpbyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDkyMDc4NDIyNzUzMjgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDkyMDc4NDIyNzUzMjgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RyYW5zZm9ybWVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5NjQzMTI4NDE0MjA4MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5NjQzMTI4NDE0MjA4MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X3ZpZGVvIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0NDIzNjE3Mjg2OTYzMjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0NDIzNjE3Mjg2OTYzMjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbHNlX2FwcF9jb21wYXQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE4MDgyNzc0OTE1NDgxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE4MDgyNzc0OTE1NDgxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX2xlYWRzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0ODc2NzQ1NTA3Nzk5MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0ODc2NzQ1NTA3Nzk5MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fa291c2hhX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE1NzMzODY3Njg4NzU1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE1NzMzODY3Njg4NzU1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zZWN1cml0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjQxMzgzOTQ2MTU4MDgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjQxMzgzOTQ2MTU4MDgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19iYXR0ZXJ5X2xpZmVfc3lzdGVtX3Bvd2VyXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTEyOTU3NDkyNzU2NDgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTEyOTU3NDkyNzU2NDgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2VnZ3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDU2ODkyOTE5ODMwOTM3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDU2ODkyOTE5ODMwOTM3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9qZXJlbXltYW5zb25fdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDk1ODY5NzQ5Mjk3MTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDk1ODY5NzQ5Mjk3MTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2V4Y2hhbmdlX2FjdGl2ZV9zeW5jX2luX2dtYWlsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzODIxMjE0MzQ1MTM0MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzODIxMjE0MzQ1MTM0MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faW9zX2JhY2t1cF9yZXN0b3JlX21ha2VfcGl4ZWxfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3NTIxNjA4NjM0MjA0MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3NTIxNjA4NjM0MjA0MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVwcmVjYXRlZF9sb2NhdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjI4MTk1NjMyMDg3MDQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjI4MTk1NjMyMDg3MDQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2lucHV0X2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTk5NDM2MzU3MjM4Nzg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTk5NDM2MzU3MjM4Nzg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfZGV2ZWxvcGVyX2ZvdW5kYXRpb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTIzOTEyNzEwODY0ODk2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTIzOTEyNzEwODY0ODk2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90cG1fdHZjIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzOTA2ODMzMzMyMzA1OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzOTA2ODMzMzMyMzA1OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3V4IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3ODIwOTc0MTEwODAxOTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3ODIwOTc0MTEwODAxOTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbHNlX2Rlc2t0b3Bfb3NfZXhwZXJpZW5jZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTI1MjM0OTAwNDM0OTQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTI1MjM0OTAwNDM0OTQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfZm9yX2luZGlhX2RldmljZV9leHBlcmllbmNlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Mzk1NDEzNjUyMTExMzYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Mzk1NDEzNjUyMTExMzYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3pvbWJpZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDc0NjQ2OTEwNTMzNjMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDc0NjQ2OTEwNTMzNjMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfb25ib2FyZGluZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTUyMjcxOTc0MzY3MjMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTUyMjcxOTc0MzY3MjMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2F1ZGlvIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0MzY1NDcyNjAwODgzMjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0MzY1NDcyNjAwODgzMjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfY29ubmVjdGl2aXR5X2J0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMjgwMzU0MjM0NTMxODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMjgwMzU0MjM0NTMxODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX3cxMiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzMzNzQ4NzQ4MzUzNTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzMzNzQ4NzQ4MzUzNTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3FtY19tdnQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDU3Mjg4MDg3NjQ3MDI3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDU3Mjg4MDg3NjQ3MDI3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zd2l0Y2hfYWNjZXNzX3ZvaWNlX2FjY2VzcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80Nzk0NDMyNDY5NDY3MTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0Nzk0NDMyNDY5NDY3MTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21haW5saW5lX21vZHVsYXJpemF0aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NDUwODQxNDMzODY2MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4NDUwODQxNDMzODY2MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZndrX3RlbGVjb20iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTMzMDk5NDE0MzgyMTgyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTMzMDk5NDE0MzgyMTgyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2ZyYW1ld29ya19ha3VsaWFuIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzMjMyMTA4NzI3NTAwODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzMjMyMTA4NzI3NTAwODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2lkZW50aXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwMTc3MzIzODYzOTAwMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwMTc3MzIzODYzOTAwMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9wZGYiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3NTEzNjQzMzA0NTUwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE3NTEzNjQzMzA0NTUwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXZlbG9wZXJfcmVsYXRpb25zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3MDkyMjYxNDM3NzY3NjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3MDkyMjYxNDM3NzY3NjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX2ludGVsbGlnZW5jZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODQ5Njc1OTk1NzA5NDQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODQ5Njc1OTk1NzA5NDQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21haW5saW5lX3VwZGF0ZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg0NTgxMDgwOTk5NTI2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg0NTgxMDgwOTk5NTI2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9uX2FfMSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTQ2NzIwNjU1Mzc2Mzg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTQ2NzIwNjU1Mzc2Mzg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2dvb2dsZV9kcml2ZV9kb2NzX3NoZWV0c19hbmRfc2xpZGVzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2MTM1NzQ0NTc2MjI1MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2MTM1NzQ0NTc2MjI1MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVwcmVjYXRlZF9hd2FyZW5lc3NfaGVhbHRoX2V4cGVyaWVuY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2Mjc4NjYzOTU5Njc0ODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2Mjc4NjYzOTU5Njc0ODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY29udGV4dF9pbmZyYXN0cnVjdHVyZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzAxMjY4MDQwNjQ2NjU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzAxMjY4MDQwNjQ2NjU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfbWVkaWFfc29sdXRpb25zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3NTA0NTIwMDQzNTYwOTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3NTA0NTIwMDQzNTYwOTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9kZXZpY2VfYW5kX2luZnJhc3RydWN0dXJlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzNTgwNjkzNjk3OTg2NTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzNTgwNjkzNjk3OTg2NTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfYmlvbWV0cmljcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzgwODc1NzQ4NzM3MDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzgwODc1NzQ4NzM3MDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FwcF9rbm93bGVkZ2VfcGxhdGZvcm0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI3MjI2NjM5MDYzNDQ5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI3MjI2NjM5MDYzNDQ5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2QiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY4MDA4MzI2MDE3ODQzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDY4MDA4MzI2MDE3ODQzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zZWciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA2NzExMTM1MzE1NTU4NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA2NzExMTM1MzE1NTU4NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXZpbmxhd3Nvbl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4MDU5MDA5NzE0NDIxNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4MDU5MDA5NzE0NDIxNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2FtZXJhX2hhcmR3YXJlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwODc0NTgxNDM3MzE3MTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwODc0NTgxNDM3MzE3MTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2FtZXJhX2ltYWdlX3F1YWxpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQwMTM2Mjg4Nzk5OTQ4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQwMTM2Mjg4Nzk5OTQ4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfYXNzaXN0YW50IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NDgwNzUzMDYxNzI0MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4NDgwNzUzMDYxNzI0MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9wb3dlcl9hbmRfY29tbXNfaW5mcmEiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTMyNTU0NzY1MzMzMjk5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTMyNTU0NzY1MzMzMjk5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbXdfcG1vIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2NTYyOTkyNzA1MDQ0NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2NTYyOTkyNzA1MDQ0NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZmlsYW1lbnQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjAzMTQyNTkxNTQ4NjIwOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjAzMTQyNTkxNTQ4NjIwOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfYnNwY29yZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTA4MDIxMzQxMzU2MDMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTA4MDIxMzQxMzU2MDMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Bvd2VybWFuYWdlcl9mcmFtZXdvcmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTExNjE2MjEyMTU2NDE2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTExNjE2MjEyMTU2NDE2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3JvbWFuZXNjbyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTEyNTIwMDYyNjk3NDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTEyNTIwMDYyNjk3NDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfdGhlbWluZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTc5MzA4MTc5ODgxOTg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTc5MzA4MTc5ODgxOTg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3JlY29yZGVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwODUwMzUzMzczODM5MzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwODUwMzUzMzczODM5MzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZnJhbWV3b3JrX2FjY2Vzc2liaWxpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ3NDc1MTE3MDAxOTMyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ3NDc1MTE3MDAxOTMyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93aW5kb3dpbmdfaW5mcmFfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1Nzg0NDA2MDk0MzE1NTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1Nzg0NDA2MDk0MzE1NTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcG13X21jcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODY0NzMzNTUwNjA4Mzg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODY0NzMzNTUwNjA4Mzg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9zeXN1aV9jdHJsX2Nhcm91c2VsX3RpbGVzX3JlY2VudHNfbGF1bmNoZXJfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4MjAxMzE5NzY3NDA4NjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4MjAxMzE5NzY3NDA4NjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2FjY2Vzc2liaWxpdHlfY29tcGxpYW5jZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzgxNzE5NTUzMTE0MTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzgxNzE5NTUzMTE0MTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19wZXJmb3JtYW5jZV90aGVybWFsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxNDYyNzYxOTAzNTU0NTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxNDYyNzYxOTAzNTU0NTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbmVlbHNhX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTczNjc1MDk3ODMzNDcyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTczNjc1MDk3ODMzNDcyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9jYW1lcmFfZW5naW5lZXJpbmdfZXhwZXJpZW5jZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTkwMjU2NjU1NDY2NDk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTkwMjU2NjU1NDY2NDk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2VtYmVkZGVkX3dlYl9vbl9hbmRyb2lkIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMDA2MTMwNjU3Njg5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMwMDYxMzA2NTc2ODk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2dhbnRyeSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Njc3MDE5MTUzODU4NTYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Njc3MDE5MTUzODU4NTYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19iYXR0ZXJ5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwNTIyNzM3NzE2NDI4ODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwNTIyNzM3NzE2NDI4ODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZW5pZ21hIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzOTYzMzgzNjE1OTc5NTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzOTYzMzgzNjE1OTc5NTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfZ3BzX3Bvd2VyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNzU5MDc0NDYxNzc3OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNzU5MDc0NDYxNzc3OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdG9vbF9mcmFuayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjAwMjA5OTc2MzYwOTYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjAwMjA5OTc2MzYwOTYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3JnaW5kYV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwMzEzNjcxMDUzMTQ4MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwMzEzNjcxMDUzMTQ4MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X3NvY19wb3dlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDAwNzcxMzU4Nzg1NTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDAwNzcxMzU4Nzg1NTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfY3J1bXBldCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTk5NzA0NDc4MzUxMzYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTk5NzA0NDc4MzUxMzYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dhbGxwYXBlcnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTEyNTQxMTMwNjM3MzEyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTEyNTQxMTMwNjM3MzEyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX3ZvbHRhIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMTYxNTY1NjIzMDkxMjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMTYxNTY1NjIzMDkxMjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2FtZXJhX21hY2hpbmVfaW50ZWxsaWdlbmNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1NzgzOTAwODU1MzM2OTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1NzgzOTAwODU1MzM2OTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc2hlZXBvX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA2ODA2MTM3Mjc0MzY4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA2ODA2MTM3Mjc0MzY4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3Byb2ZpbGVfZXhwZXJpZW5jZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTkxNDkxOTQ2MjQwNDA5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTkxNDkxOTQ2MjQwNDA5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9yZXZpZXdfcGxhdGZvcm0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTk1MjkwNTU3NDUxNDY4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTk1MjkwNTU3NDUxNDY4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hYmFydGhfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODU3NTI4Nzg2NzgwMTYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODU3NTI4Nzg2NzgwMTYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RyZWJsZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDUyNDkwMTc4NjkxMDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDUyNDkwMTc4NjkxMDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2pzYXNpbm93c2tpX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIzOTI1OTc2Mjc4NjMwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIzOTI1OTc2Mjc4NjMwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV92YWFzX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTEwNjc1NDI5NjkwNTcyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTEwNjc1NDI5NjkwNTcyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pbnRlcm5hdGlvbmFsaXphdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTExNTM2MjgzMjg3NTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTExNTM2MjgzMjg3NTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfc2FmZXJfYXBwcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTQzMTc5MDA1MDM0NDk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTQzMTc5MDA1MDM0NDk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Nvbm5lY3Rpdml0eV90ZWxlbWV0cnkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA4NDQ5MTM0OTM5MzQwOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA4NDQ5MTM0OTM5MzQwOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9lc2VpZGVsX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ1Mzk5NzczODcyMTI4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ1Mzk5NzczODcyMTI4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90ZXN0X2VuZ19pbmZyYXN0cnVjdHVyZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTgxOTA1MDI3NDY1MjE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTgxOTA1MDI3NDY1MjE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl93Y3Nfbm90aWZpY2F0aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4MDU4NzE1Mjc2OTAyNDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4MDU4NzE1Mjc2OTAyNDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fa29ua2Vyc190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3NTExNDc3MDE4OTUxNjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3NTExNDc3MDE4OTUxNjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWtlYXJuZXlfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDgyNTkwODQ0NDUyODY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDgyNTkwODQ0NDUyODY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfa2VybmVsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwMTQzMzQ3OTUwMjIzMzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwMTQzMzQ3OTUwMjIzMzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2hyb21lIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0MzkzMDE4NjQ2MjAwMzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0MzkzMDE4NjQ2MjAwMzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2RpYWxlcl9tZXNzYWdlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTA2NzMyODc4NzI1MTIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTA2NzMyODc4NzI1MTIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfdHZfZW5ncHJvZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTM4MDgxMTU3MTg1NTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTM4MDgxMTU3MTg1NTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25pY29oX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY2MjI5MjAwOTE4OTM3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY2MjI5MjAwOTE4OTM3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX2FwcHNfZWNvc3lzdGVtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5MDg0MTM4NzE4ODIyNDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5MDg0MTM4NzE4ODIyNDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2VsbHVsYXJfc2VjdXJpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUyOTAwNDAxMTY4Mzg0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUyOTAwNDAxMTY4Mzg0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kaGFsb25pX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIxMzU1NjQ5NzQ0ODk2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIxMzU1NjQ5NzQ0ODk2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hcHBsaWNhdGlvbnNfZ29vZ2xlX3dpZGVfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxMjA5OTMyNDgzNzg4ODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxMjA5OTMyNDgzNzg4ODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVmdW5jdF9zeXN0ZW1fdWlfaW50ZWxsaWdlbmNlX2RmZW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1NzcyODQ3NDg0NDM2NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1NzcyODQ3NDg0NDM2NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fb3NsbyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Nzc5NTk0ODg3OTU0NDMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Nzc5NTk0ODg3OTU0NDMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2JsdWV0b290aCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjI2NTQ2MzY0NjQ1Mzc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjI2NTQ2MzY0NjQ1Mzc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2xvY2FsaXphdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzUxNTU3MzQxNDQ2MTQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzUxNTU3MzQxNDQ2MTQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NzZF9zZWN1cml0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NjA4MDY1MjQ4NTU5MTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NjA4MDY1MjQ4NTU5MTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd191c2IiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTEwMDY0NjQ1NzgwMjc1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTEwMDY0NjQ1NzgwMjc1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9oaXJvc2hpX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc1NjU2NDY2MjI4ODM4NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc1NjU2NDY2MjI4ODM4NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jb250YWN0cyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzMyODU5ODE4MzExNjgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzMyODU5ODE4MzExNjgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF93MiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTQ1MDcxMzg3OTM0NzIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTQ1MDcxMzg3OTM0NzIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF93NTEiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY5ODc4MDc4MzMxMjg5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY5ODc4MDc4MzMxMjg5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9lcmFobV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NjYzNDc4MDczMDk4MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NjYzNDc4MDczMDk4MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX3c1MyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODQxMTY3NTM5MTA5ODg4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODQxMTY3NTM5MTA5ODg4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZyYW1ld29ya19vdmVyZ3JvdW5kIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMzU4MzA4Mjk4OTE1ODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMzU4MzA4Mjk4OTE1ODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9wZXJmb3JtYW5jZV9jb25zb2xlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3NjE2NjIzNTU5NjM5MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3NjE2NjIzNTU5NjM5MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGFydG5lcl9tb2RlbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTAyNzEwMzI5Mzc2NzY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTAyNzEwMzI5Mzc2NzY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NjZF90b29sIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyMjU0NDEwMjc1NTUzMjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyMjU0NDEwMjc1NTUzMjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ3R3X3N3IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwNjk4NjU5NTc2ODcyOTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwNjk4NjU5NTc2ODcyOTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2VhcmFibGVzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxMjI2NDI1MTU4MjA1NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxMjI2NDI1MTU4MjA1NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF90ZXh0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxOTQwODU1ODUyODkyMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxOTQwODU1ODUyODkyMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9oZWFsdGgiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3Nzc3MjcwNjAwNDk5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE3Nzc3MjcwNjAwNDk5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2RfdzIzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxOTEzNjE5OTI1NTY1NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxOTEzNjE5OTI1NTY1NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfY29ubmVjdGl2aXR5X25ldHdvcmtpbmciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjY4NTU5MjQ2OTI0MTg1NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjY4NTU5MjQ2OTI0MTg1NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wcGlfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTcxOTMzNjQ2ODQ4MDAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTcxOTMzNjQ2ODQ4MDAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NzZF9tbV9wZXJpcGhlcmFsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2MjQwMTk4MTgwODY0MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2MjQwMTk4MTgwODY0MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbl9hIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4OTExODk0OTI3MTE0MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4OTExODk0OTI3MTE0MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2hpZF9kcml2ZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDUzNDEzMDQyNTEwMjMzNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDUzNDEzMDQyNTEwMjMzNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJhYmxlX21vdGlvbl9hbGdvcml0aG1zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzOTc1NTAxOTg1ODczOTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzOTc1NTAxOTg1ODczOTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3N5c3VpX25vdGlmaWNhdGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTI1NjI1NzE4MzA1NTg3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTI1NjI1NzE4MzA1NTg3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2NhbWVyYV9lbmdwcm9kIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1OTQzODI4NDMyODE0MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1OTQzODI4NDMyODE0MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbG9ja3NjcmVlbl9hb2QiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTUwMzk3OTY0MTAxMjIyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTUwMzk3OTY0MTAxMjIyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93aW5kb3dpbmdfc2RrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2ODMwMzcwMDg3MjM5NjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2ODMwMzcwMDg3MjM5NjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2lubWFya2V0X3Bvd2VyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2NzU4OTEzMzExNzAzMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2NzU4OTEzMzExNzAzMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYmV0dGVyYnVnIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5MTA0MDA2NTI2MDc0ODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5MTA0MDA2NTI2MDc0ODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X3NlY3VyaXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwMzAyNzc3MTM2MjUwODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwMzAyNzc3MTM2MjUwODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfZW5lcmdpemVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5NzA2MDUyNzAzMDI3MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5NzA2MDUyNzAzMDI3MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZndrX2NvcmVfbmV0d29ya2luZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTU5NjkyNTYyMzk5MjMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTU5NjkyNTYyMzk5MjMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Nocm9taXVtX3dlYnZpZXciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTYzMDA2MTMwNjU3Njg5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTYzMDA2MTMwNjU3Njg5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9mcmFtZXdvcmtfY2RtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3OTM3MjE4ODcwMzEyOTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3OTM3MjE4ODcwMzEyOTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX3dhbGxleWVfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NjUyNDU2Nzg2NjU3MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NjUyNDU2Nzg2NjU3MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX21hcmxpbl9zYWlsZmlzaF8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDcxMzYxODM2NDgyNTYwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDcxMzYxODM2NDgyNTYwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9xbWMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTIwNzg0ODg0MTUxMDkxMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTIwNzg0ODg0MTUxMDkxMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3dhbGxldF9pbnRlZ3JhdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Nzg1Nzc3OTk1MTUzNDA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Nzg1Nzc3OTk1MTUzNDA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25vcmVlbnRfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzY2Mjk5ODQzMTk4OTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzY2Mjk5ODQzMTk4OTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2luayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NjIwMjI1MTYyNjA4NjQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NjIwMjI1MTYyNjA4NjQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21ha2VfcGl4ZWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjE0MDIzNDcwMTg2NDk2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjE0MDIzNDcwMTg2NDk2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jaGlsbGVyc190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2MzE2NDc4ODcyOTQ0NjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2MzE2NDc4ODcyOTQ0NjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX2V4cGVyaWVuY2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA4MzYzMzUyMTk1MDcyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA4MzYzMzUyMTk1MDcyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2ZyYW1ld29ya19yb29zYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NzA4MDY3MDc0OTk4MjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NzA4MDY3MDc0OTk4MjcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2J1aWxkIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1NDIxMDAzNzYzNTQ4MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1NDIxMDAzNzYzNTQ4MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGxheV9zdG9yZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODAzMjI4NTYyNDg5MzQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODAzMjI4NTYyNDg5MzQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Nsb2NrcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzI3MDU4MzkxMDA3MjMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzI3MDU4MzkxMDA3MjMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FzYWZpX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIxNzczNTM5OTk2NDY3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIxNzczNTM5OTk2NDY3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfc3RvcmFnZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NjQ0ODk4ODg4MDg5NjAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NjQ0ODk4ODg4MDg5NjAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BsYXlfbW92aWVzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4Mzg0MTI5MzQ1NzgxNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4Mzg0MTI5MzQ1NzgxNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX2hhbW1lcmhlYWRfY2FtZXJhXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTk3NjMxNTM5MDE5Nzc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTk3NjMxNTM5MDE5Nzc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9zeXN1aV9hcHBsaWNhdGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDkyOTgzMzQ5NDU0NDM4NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDkyOTgzMzQ5NDU0NDM4NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfdHBtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2MTI5MjI5ODExMjIwNDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2MTI5MjI5ODExMjIwNDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcW1jX3NjcmlwdF9hdXRvbWF0aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNDc4Njk4OTk2Njk1MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNDc4Njk4OTk2Njk1MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3dfdHBtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1MDY5MTYwMDQyNjU5ODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1MDY5MTYwMDQyNjU5ODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGV2aWNlX2FuZF9mYWN0b3J5X3RwbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTc0NTMwMTQzOTExOTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTc0NTMwMTQzOTExOTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Btd19tc3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDUyNTI2MjAzMjg5NjAwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDUyNTI2MjAzMjg5NjAwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfZXNpbV9hbmRfY2FycmllcnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA0NTE2ODExMzYxNDg0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA0NTE2ODExMzYxNDg0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3BpeGVsX2NvbnRleHRfaHViIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzNzU5NzAyMDA5NDQ2NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzNzU5NzAyMDA5NDQ2NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc2V0dGluZ19leHAiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc1ODAxMDkzNjI5NTQyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc1ODAxMDkzNjI5NTQyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZWZ1bmN0X3N5c3RlbV91aV9pbnRlbGxpZ2VuY2VfcHJhdmVlbmoiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjY0ODc1ODgyOTcxMTM2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjY0ODc1ODgyOTcxMTM2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zeXN0ZW1fYnVsbGhlYWRfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1OTIxMjIzMjk5NTYzNTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1OTIxMjIzMjk5NTYzNTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2ZpbmdlcnByaW50IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzODAxODEyODU1Njg1MTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzODAxODEyODU1Njg1MTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9zZGxjIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0OTI4OTY1MDQxNTIwNjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0OTI4OTY1MDQxNTIwNjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9jb3JlX2dyYXBoaWNzX3N0YWNrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNjA2MjUzOTk2NDQxNjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNjA2MjUzOTk2NDQxNjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYWNjZXNzaWJpbGl0eV9zd2l0Y2hfYWNjZXNzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwMjY4NjkwMzk4NTc2NjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwMjY4NjkwMzk4NTc2NjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3FhX21ha2VfcGl4ZWxfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2MTA4MTk4NTMwOTA4MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2MTA4MTk4NTMwOTA4MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY29udHJvbHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTAwNTk5NDEwMjI1OTcxMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTAwNTk5NDEwMjI1OTcxMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9yZW5kZXJzY3JpcHRfbm5hcGkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUyNzI2Mjc5NDg0MjExMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUyNzI2Mjc5NDg0MjExMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90ZXN0X2luZnJhc3RydWN0dXJlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMzAxODkxMTU2NTQxNDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMzAxODkxMTU2NTQxNDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3NkX3BlcmlwaGVyYWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMxNDUwNzI5NDg2NzQ1NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMxNDUwNzI5NDg2NzQ1NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXZpY2VfY29ubmVjdGl2aXR5X2V4cGVyaWVuY2VzX21ha2VfcGl4ZWxfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzNDg1ODYzMjk4NjYyNDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzNDg1ODYzMjk4NjYyNDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbmFuZHVuYWlyX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg3NDUwMDM4NDEyOTAyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg3NDUwMDM4NDEyOTAyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9nb2RvZnJlZG9jX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg5MjUyODcxMDE1NjI4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg5MjUyODcxMDE1NjI4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ndHdfbWlzYyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDM3NjUyNTk3MTc4MzY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDM3NjUyNTk3MTc4MzY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BlcmNlcHRpb25fdmlydHVhbGl6YXRpb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTEzMzkzMTkyNTg5NzIxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTEzMzkzMTkyNTg5NzIxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zYWZldHlfZWxzX2VhcnRocXVha2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUwODQ5ODE2NTA3MTg3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUwODQ5ODE2NTA3MTg3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV94cl9mcmFtZXdvcmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc5ODA0MDU0MjQ0NTU2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc5ODA0MDU0MjQ0NTU2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zeXN0ZW1fdWlfcGxlYXNlX3VzZV9hX21vcmVfc3BlY2lmaWNfc3VidGVhbV9pZl9wb3NzaWJsZV8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQwMjQ2ODIyNTA4OTUzNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQwMjQ2ODIyNTA4OTUzNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX3JlbGlhYmlsaXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0ODkzMjM4MTgyMjE1NjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0ODkzMjM4MTgyMjE1NjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3NlcnZpY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxNDA1NjY3NTcxNzkzOTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxNDA1NjY3NTcxNzkzOTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcW1jX3BkYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTU1MDcyMjgzMzc3NjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTU1MDcyMjgzMzc3NjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3ZzbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTYyNDQ3MTY2OTMwOTQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTYyNDQ3MTY2OTMwOTQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcmVsZWFzZV9tZXRyaWNzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwMTg5MjU3NTkyMDEyODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwMTg5MjU3NTkyMDEyODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGVzdGluZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODkyMjk0ODI5ODAxNDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODkyMjk0ODI5ODAxNDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfd2FsbGV0X2ludGVncmF0aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyODY3MjYwNDIyODgxMjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyODY3MjYwNDIyODgxMjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbGVvbmFyZGNoYW5fdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjYwOTk0NTc5MDA1NDQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjYwOTk0NTc5MDA1NDQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbV9wZXJmb3JtYW5jZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTg4NjA3Mzg4MDI0ODMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTg4NjA3Mzg4MDI0ODMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbV9wb3dlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODIwODIwNzQ4NTMzNzYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODIwODIwNzQ4NTMzNzYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfZ2RtX2xvY2F0aW9uX2Fkc19tYXJrZXRwbGFjZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTI2MTYzNjgxMjU3MDYyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTI2MTYzNjgxMjU3MDYyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfZGlnaXRhbF9rZXkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ0NDg5Njc2NjAzMzkyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ0NDg5Njc2NjAzMzkyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hb3NwIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NjA4NTUzNzgwMTgzMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4NjA4NTUzNzgwMTgzMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbGF1bmNoZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTEwMjI5NTcyNTI0NDQxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTEwMjI5NTcyNTI0NDQxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pbWUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjA4NTgwODg3NjI5MDA0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjA4NTgwODg3NjI5MDA0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9qeW90aXJhanVfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzIwOTc3MTY3MjUzNTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzIwOTc3MTY3MjUzNTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NhbWVyYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzE4MDIyMjM2Nzk4OTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzE4MDIyMjM2Nzk4OTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9iYWNrdXBfcmVzdG9yZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODc1OTgyMTcxMTc2OTYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODc1OTgyMTcxMTc2OTYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9kZXZlbG9wZXJfd2F0Y2hfZmFjZXNfY29tcGxpY2F0aW9ucyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjM4MjEzMDM3MDk2OTYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjM4MjEzMDM3MDk2OTYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21haW5saW5lX3JlYWNoIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3MDEzODYwMTIwOTg1NjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3MDEzODYwMTIwOTg1NjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3NkX2JzcCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODc2MzUxOTExMTk4NzIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODc2MzUxOTExMTk4NzIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3V4X2Rlc2lnbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80Njc4NDMzOTkyNzM2NzY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0Njc4NDMzOTkyNzM2NzY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FjY2Vzc2liaWxpdHlfZndfbWFrZV9waXhlbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTIyODU4OTIyODY4NzM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTIyODU4OTIyODY4NzM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9tZWRpYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzY1NDExNTQ1NTEzOTg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzY1NDExNTQ1NTEzOTg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbV9hbmdsZXJfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1OTMyMjc2NjcwNDY0MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1OTMyMjc2NjcwNDY0MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X3Rvb2xzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0NjA0NzU1NzI5MTIxMjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0NjA0NzU1NzI5MTIxMjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGxhdGZvcm1fYnVpbGQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc3NDQwMzU3ODkyMDk2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc3NDQwMzU3ODkyMDk2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wY2hpdG9vcl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5NjI1NzczMTUyNjY1NjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5NjI1NzczMTUyNjY1NjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbXVsdGlfZGV2aWNlX3BsYXRmb3JtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NTAxNTMwOTA3MTE1NTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4NTAxNTMwOTA3MTE1NTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc2FmZXR5bmV0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3NDg4MDI3MzY5MTQ0MzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3NDg4MDI3MzY5MTQ0MzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9yZXNvdXJjZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY3ODc2NzAyMDcwMzc0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDY3ODc2NzAyMDcwMzc0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9qb3NoY29ubmVyX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIyNjgyODI0ODM4MzQ4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIyNjgyODI0ODM4MzQ4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9xbWNfYWl0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxNzU0MTkwNzM5NTM3OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxNzU0MTkwNzM5NTM3OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfZ2xvYmFsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2MDk3MTQ1MTYwMDA3NjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2MDk3MTQ1MTYwMDA3NjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcWFfYXV0b21hdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTU5ODc4MzAzNjc4NDY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTU5ODc4MzAzNjc4NDY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfZ3B1IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxMDU4NDg1NjUxMDQ2NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxMDU4NDg1NjUxMDQ2NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcW1jX2F0ZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODE5MTcxNDgxMDkyMDk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODE5MTcxNDgxMDkyMDk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2hhbmdvdXRzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNjMzODAwMDQxNzU4NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNjMzODAwMDQxNzU4NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY3Jvc3NfZGV2aWNlX2NvbnRyb2wiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg4ODYwNzE5Nzc1NzQ0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg4ODYwNzE5Nzc1NzQ0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pbnRlcmFjdGlvbnNfZnJhbWV3b3JrcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80Nzk1MTI0MDI5NDg5MTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0Nzk1MTI0MDI5NDg5MTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfZnJhbWV3b3JrX3NhbnRvc2NvcmRvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDQ5MjQyNTM3OTUxMjMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDQ5MjQyNTM3OTUxMjMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2F1dGhlbnRpY2F0aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5MDE5MDkzODA5ODg5MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5MDE5MDkzODA5ODg5MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3R5bHVzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2ODUwMDMyMTg3NDczOTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2ODUwMDMyMTg3NDczOTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbGludXNfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjEwMDM1MTAwODQ0MDMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjEwMDM1MTAwODQ0MDMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3ZpcnR1YWxpemF0aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMTcxMzE1MTk3ODcwMDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMTcxMzE1MTk3ODcwMDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYmlsbHN0ZXZlbnNvbl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2MzEwNjQ3NDQ4MjA3MzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2MzEwNjQ3NDQ4MjA3MzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9zbWFydG9zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2Mzc5NzMzMjU0MTQ0MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2Mzc5NzMzMjU0MTQ0MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXJ0X3BlcmZvcm1hbmNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMTA2MDM0NDYwNDI2MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMTA2MDM0NDYwNDI2MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3NkIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NTg3NTk3MjUxNTQzMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4NTg3NTk3MjUxNTQzMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYWJjX2VuZ29wcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjczNTc4OTI4NTA0ODMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjczNTc4OTI4NTA0ODMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2VhdGhlcl9hbmRyb2lkX2FwcCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDk2NDE1NTY4MDAzMDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDk2NDE1NTY4MDAzMDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3J1YmlkaXVtX3Nka19ydW50aW1lIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyODY1MDgzNTU5MTE2ODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyODY1MDgzNTU5MTE2ODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYm9ydGhha3VyX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk2MjI0MzA1OTAyMzg3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDk2MjI0MzA1OTAyMzg3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfZ3JhcGhpY3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc5MTY0NDkwNzExMDQwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc5MTY0NDkwNzExMDQwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tYWtlX2NyZWF0aXZlX2FuZHJvaWRfa2V5X2V4cGVyaWVuY2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcxNjczODUxNTE3MzM3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcxNjczODUxNTE3MzM3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbXdfbDFyZiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzAyOTA2OTE1Njg0MzUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzAyOTA2OTE1Njg0MzUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Rlc3RfZW5nX2NvbW1zX3Bvd2VyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2MzI4MTU5MTExMDg2MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2MzI4MTU5MTExMDg2MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2FyY2hpdGVjdHVyZV9ncm91cCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjA5OTI4MDYwMjA3MTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjA5OTI4MDYwMjA3MTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9lc2ltX2NhcnJpZXJzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5MjgzNjE0OTg5MzUyOTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5MjgzNjE0OTg5MzUyOTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfY29ubmVjdGl2aXR5X2dwcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTIwNjYwNTM5ODk5OTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTIwNjYwNTM5ODk5OTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FkdmVyc2FyaWFsX2NvZGVfYWlfYXJjX2FpXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODUwMjEzNjU3NjczNzI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODUwMjEzNjU3NjczNzI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfYmluYXJ5X3RyYW5zcGFyZW5jeSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTg1MzY1MjQzMDAyODgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTg1MzY1MjQzMDAyODgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Rlc3RfZW5nX2F1dG9tb3RpdmVfdHYiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjE1NjE3NzYyMDQ2NzcxMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjE1NjE3NzYyMDQ2NzcxMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90Z29zc2VsYWFyX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg5NzYzODA3NzA3MTM2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg5NzYzODA3NzA3MTM2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9jb25uZWN0aXZpdHlfd2lmaSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80Nzc2MjE5MzEzMzQwNDE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0Nzc2MjE5MzEzMzQwNDE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NldHVwX3dpemFyZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDE3MzA1ODA2NjAyMjQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDE3MzA1ODA2NjAyMjQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NlY3VyaXR5X3ZhbGlkYXRpb25fZW5naW5lZXJpbmdfc3ZlXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODUwOTQzMDUwOTA3NjQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODUwOTQzMDUwOTA3NjQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF9mdW5jdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NjUwNDA4MDk3MTUzMDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NjUwNDA4MDk3MTUzMDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BsYXRmb3JtX3Byb2R1Y3RfbWdycyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDgzMjgyMzI5NzMxMDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDgzMjgyMzI5NzMxMDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BhcnRuZXJfdGVsZXBob255IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3Njc4ODIxMjAyNjU3MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3Njc4ODIxMjAyNjU3MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY3Jqb2huc190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4MDQxMDE0NzM5OTI3MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4MDQxMDE0NzM5OTI3MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX2ltcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDUwNjI0NTA0MjAxMjE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDUwNjI0NTA0MjAxMjE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl93ZWF0aGVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0NjQxNjQ0MTk5MjgwNjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0NjQxNjQ0MTk5MjgwNjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ3VwdGFyaXR1X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE0MjY3OTYyNDc3NzcyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE0MjY3OTYyNDc3NzcyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfZGV2ZWxvcGVyX3Rvb2xzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMjg5MTU4NzgwMDI2ODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMjg5MTU4NzgwMDI2ODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGxheV9ib29rcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzY5MTQ5NTI3NDkwNTYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzY5MTQ5NTI3NDkwNTYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21lbGlzc2FkYW5pZWxzX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcxNTExMjkyNjI4MTcyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcxNTExMjkyNjI4MTcyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3NoYXJlZF9jb250ZXh0X3N0YXRlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzMjkxMDczNDQ1ODg4MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzMjkxMDczNDQ1ODg4MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbW90aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMzEzNTEyNjkyNzc2OTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMzEzNTEyNjkyNzc2OTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ3BwX29uX2RldmljZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTgxOTYxNTA0OTgwOTkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTgxOTYxNTA0OTgwOTkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfc2V0dGluZ3NfYXBwIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMDQ0MDA4ODQxNTQzNjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMDQ0MDA4ODQxNTQzNjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbDFfaW5tYXJrZXQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3Mjg0NjQ1MDczNzE1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE3Mjg0NjQ1MDczNzE1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJmbG93IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5NDcyNTA0Mjk1NTg3ODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5NDcyNTA0Mjk1NTg3ODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZW50ZXJwcmlzZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzY2MTc4NTE1OTEwNjU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzY2MTc4NTE1OTEwNjU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfZnJhbWV3b3JrX21pY2hhZWx3ciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTc0Mjc3MTI0OTE1MjAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTc0Mjc3MTI0OTE1MjAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NvbG9yIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMDUyMDgwODY3MjQ2MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMDUyMDgwODY3MjQ2MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fb3Nib3JuY190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMTk1MDQ2NTAwNDMzOTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMTk1MDQ2NTAwNDMzOTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGlhbGVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1OTU5ODIyNzE1NzgxMTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1OTU5ODIyNzE1NzgxMTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZnJhbWV3b3JrX2JwbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDk4MTE5OTExMjQzNzc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDk4MTE5OTExMjQzNzc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF9jb3JlX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjY4Mzk0MzIwMTgwMDE5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjY4Mzk0MzIwMTgwMDE5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9jb25uZWN0aXZpdHlfcmlsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5OTUwOTMzNDE1MzYyNTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5OTUwOTMzNDE1MzYyNTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGVyZmV0dG8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc4Mzk4NzEwOTAwMzI2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc4Mzk4NzEwOTAwMzI2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wYXJ0bmVyX2RldnJlbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTM3Njk2NTA0MzgxNDQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTM3Njk2NTA0MzgxNDQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Z3a190aHJlYWRfbmV0d29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDk0Njg1Nzc1MTM0NzIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDk0Njg1Nzc1MTM0NzIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RoYXRndXlfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Njg4MzY5Nzc1NTQyMjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Njg4MzY5Nzc1NTQyMjcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZpbmRlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDkyODMxMDI1MzY0OTkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDkyODMxMDI1MzY0OTkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Jvb3RfdGltZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDE3MDg5Mzk5NTU0MDQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDE3MDg5Mzk5NTU0MDQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2NzX2JldG8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDkxMDk0NTQzNjMzNjEyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDkxMDk0NTQzNjMzNjEyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9yZXNwb25zaWJsZV9hcGlzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NTE5NjI4NTQxNzg4MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NTE5NjI4NTQxNzg4MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2NvcmVic3AiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDYyNjY3MzY5OTU1MzI4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDYyNjY3MzY5OTU1MzI4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9lZHVjYXRpb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg4OTU0MDIyNTI2OTc2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg4OTU0MDIyNTI2OTc2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbGFybV9jbG9jayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTkzMDExMjU5OTk4MjA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTkzMDExMjU5OTk4MjA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Btd190dmMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDUyNjI4ODc2NDk2MDc2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDUyNjI4ODc2NDk2MDc2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX3BpeGVsX3dpZmkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc0MTQwNTQxMzkwMDI4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc0MTQwNTQxMzkwMDI4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hYmR1bGxhX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIyMzU4NTE0NTQyMTgyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIyMzU4NTE0NTQyMTgyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9oYXJkd2FyZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzU3MzgyNDIyODg4NDQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzU3MzgyNDIyODg4NDQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N0YXR1c19iYXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMyOTUxNjA0MzE3Mzg4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMyOTUxNjA0MzE3Mzg4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfc3lzdWlfYmlnX3BpY3R1cmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA4MTM1NjcxOTUyMTc5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA4MTM1NjcxOTUyMTc5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX21hdGVyaWFsX2Rlc2lnbl9mb3Jfd2Vhcm9zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3OTI5NDIzMzM5NTIwMDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3OTI5NDIzMzM5NTIwMDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGxhdGZvcm1fc2VjdXJpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTI0MzAzMzIxMzU5OTc0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTI0MzAzMzIxMzU5OTc0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9sbHZtX2FuZF90b29sY2hhaW5zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5OTA3MDExMjA0ODc0MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5OTA3MDExMjA0ODc0MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fam1jY2FuZGxlc3NfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjI3Nzk0MjI2MzgwODAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjI3Nzk0MjI2MzgwODAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NhZmV0eV9jZW50ZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTkzMDI3Mzg0MzYwOTYwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTkzMDI3Mzg0MzYwOTYwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfc3lzdGVtc19lbmdpbmVlcmluZ19hbmRfZGV2aWNlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDA3ODQ3Mjk4NzkzNDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDA3ODQ3Mjk4NzkzNDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZyYW1ld29ya19hbmRyb2lkX211bHRpdXNlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTgxNTI1NzMyMzkyOTYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTgxNTI1NzMyMzkyOTYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfdGVzdDIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDU5MDk1ODY5MDA3NDYyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDU5MDk1ODY5MDA3NDYyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9xbWNfaXF0X3RwZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NjY4MDAwMjgzMTk3NDQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NjY4MDAwMjgzMTk3NDQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19mYWN0b3J5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNjcwMzI1NzM3MzkwMDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNjcwMzI1NzM3MzkwMDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXV0b21vdGl2ZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzcwNzk4Nzk0OTMyMjI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzcwNzk4Nzk0OTMyMjI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NhbWVyYV9odGNfbGdfcXVhbGNvbW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMzMjA5OTQ4MDkxMTg3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMzMjA5OTQ4MDkxMTg3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ya3Bfa2V5c3RvcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTYzNDMwNDM3NDUwNTQ3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTYzNDMwNDM3NDUwNTQ3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfd2F0Y2hfZmFjZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg4NTcwODE5NTQ5NTkzNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg4NTcwODE5NTQ5NTkzNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hcmNfYXBwX2NvbXBhdCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODExODk0NDQxMjc5NDg4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODExODk0NDQxMjc5NDg4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Bzb2huX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg1MjY3Mzk0NzAwOTAyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg1MjY3Mzk0NzAwOTAyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ob2xsYW5kZV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzNTY1MzMxODY3MjM4NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzNTY1MzMxODY3MjM4NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3BhcnRuZXJfcHJvZ3JhbXNfYW5kX2VuZ2luZWVyaW5nX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDkzNDk5NzU3MTk2MDgzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDkzNDk5NzU3MTk2MDgzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9jb25uZWN0aXZpdHlfbmZjIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2MzEyNzIwNTE5NjU5NTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2MzEyNzIwNTE5NjU5NTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2lvc19jb25uZWN0aXZpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDcwMjQ1NTY0NDE5Mjc2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDcwMjQ1NTY0NDE5Mjc2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hcmNfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1NTY5Mzc5NTc4Njc1MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1NTY5Mzc5NTc4Njc1MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9vbmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI3MjE3NjA5NzE5ODA4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI3MjE3NjA5NzE5ODA4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jY2hlcnViaW5vX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg0NjQ3MTE5MjE1MDAxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg0NjQ3MTE5MjE1MDAxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2JsdWV0b290aF9hbmRfbmZjIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNTkyODA4NTE0MzU1MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNTkyODA4NTE0MzU1MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGVzdF9lbmdfYWZ3X2F1dGhfbG9jYXRpb25fY2FtZXJhX21lZGlhIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyOTg1NjQzNzYyNjQ3MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyOTg1NjQzNzYyNjQ3MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZnJvdXNzZWF1X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcxODI5NjQzNjU3MjE2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcxODI5NjQzNjU3MjE2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfdG91Y2hfaGFwdGljIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0NjkyNjQzMzAwOTY2NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0NjkyNjQzMzAwOTY2NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGFydG5lcl9lbmciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3MjY2NDQ2OTQyMjA4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE3MjY2NDQ2OTQyMjA4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kb2dmb29kZXJzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2NDMyNDk2MjA2NDc5MzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2NDMyNDk2MjA2NDc5MzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX2V4dGVybmFsXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTU4MDQzMjk0OTU3NTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTU4MDQzMjk0OTU3NTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZvdW5kYXRpb25zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMTYyNTA5NTI2Nzk0MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMTYyNTA5NTI2Nzk0MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2FtZXJhX2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDU1MjQ0NzgzMjIyNzg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDU1MjQ0NzgzMjIyNzg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2J1Z2p1Z2dsZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ3MjgzNjk2OTI2NzIwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ3MjgzNjk2OTI2NzIwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jbGlnaF90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNzM3Nzg0NTUzMTQ0MzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNzM3Nzg0NTUzMTQ0MzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF90ZXN0aW5nX2V4cGVyaWVuY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NTMxMzcwNTYzNjY1OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NTMxMzcwNTYzNjY1OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZHgiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY3Nzk3NzE2ODI4MTYwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY3Nzk3NzE2ODI4MTYwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9mcmFtZXdvcmtfYmFja3N0YWdlX3Bvd2VyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMTQwNjY5NjQyODMzOTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMTQwNjY5NjQyODMzOTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcmxiX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTIwNjg1ODg3ODA1ODQ5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTIwNjg1ODg3ODA1ODQ5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfcHRzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1NTM3MjU2NjM1MTA1MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1NTM3MjU2NjM1MTA1MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fa2Vpcl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3MzE3MDAwODk5Nzg4ODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3MzE3MDAwODk5Nzg4ODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX3RhaW1lbl8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQyMTcwOTY3ODU3NTYxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQyMTcwOTY3ODU3NTYxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zZWN1cml0eV9yZXNwb25zZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDMxOTI2OTgxMDY2NzUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDMxOTI2OTgxMDY2NzUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3ByZWxvYWRfc2FmZXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1ODQ2MDk1ODA3NDQ3MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1ODQ2MDk1ODA3NDQ3MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfY3VzdG9taXphdGlvbnNfbWFrZV8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE1NTY0MzgzNjM2Njg0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE1NTY0MzgzNjM2Njg0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90b29sdG9waWEiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ1NjQ3Mjg4MzEwMTY5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ1NjQ3Mjg4MzEwMTY5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X2xpdmVfdHJhbnNjcmliZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82Mjk5Njk1NjQyMzQ1NDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2Mjk5Njk1NjQyMzQ1NDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RydXN0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTA5MzE5NTQ5NjE2MTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTA5MzE5NTQ5NjE2MTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FtYXRoZXNfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTU3NzE1ODYyMjU3NjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTU3NzE1ODYyMjU3NjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9kZXZlbG9wZXJfYW5kcm9pZF9kZXZyZWxfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NjE4MjA1OTQwMjg1NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4NjE4MjA1OTQwMjg1NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fb3ZlcnZpZXciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA3MTc5MDU3NTU1MDQ2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA3MTc5MDU3NTU1MDQ2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3NlbnNvcnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc3NjM3MTA5MDI1OTk2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc3NjM3MTA5MDI1OTk2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV91aV90b29sa2l0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2Mzg4NTczOTk1OTkxMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2Mzg4NTczOTk1OTkxMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ2VzdHVyZV9uYXYiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMwNDQwNTM5MTMxMDg0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMwNDQwNTM5MTMxMDg0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9xbWNfd2lmaV9zdG9yYWdlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5MjQ3MjQ1OTczNTg1OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5MjQ3MjQ1OTczNTg1OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX3cxMSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTI5MTI4NDY5MzMxOTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTI5MTI4NDY5MzMxOTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZzYW11ZWxfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzUzNTE0NDk3MzEwNzIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzUzNTE0NDk3MzEwNzIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2hhcHRpYyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTE5MDEzMDAzNDkzMzc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTE5MDEzMDAzNDkzMzc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3JldGVudGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjQ3OTg1MjkwODA1MjQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjQ3OTg1MjkwODA1MjQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX29uYm9hcmRpbmciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTUzMTM0MDgxMTk2MDMyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTUzMTM0MDgxMTk2MDMyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2Rfc3RhbmRhcmQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI5NjkxNTEwODgyMzA0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI5NjkxNTEwODgyMzA0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hcnRfbWFpbmxpbmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTczMzk2NTE1NTQwMTcyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTczMzk2NTE1NTQwMTcyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zaGFkZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjQ2NzE1MTcwMjI2MTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjQ2NzE1MTcwMjI2MTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2djaGlwc19jb21wdXRlX3N3IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNDU3ODc4MTgxMzE0NTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNDU3ODc4MTgxMzE0NTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faGFwdGljc19mcmFtZXdvcmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg5NTQzODUwOTQ0MTAyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg5NTQzODUwOTQ0MTAyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X2JyYWlsbGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk5MjUzMDIwNTkzMzU2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDk5MjUzMDIwNTkzMzU2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9xbWNfdXRkIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1MjQ1MDgxOTAzMTA0MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1MjQ1MDgxOTAzMTA0MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9vbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTM5MzQ1NzcxODIzMTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTM5MzQ1NzcxODIzMTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZpdCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjI4NDEyMDM5MTM1MjMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjI4NDEyMDM5MTM1MjMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Z3a191d2IiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTk4MzczMzQwODIzNTUyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTk4MzczMzQwODIzNTUyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9haWRyb2lkIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2OTc2NzU0NDYyMjI4NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2OTc2NzU0NDYyMjI4NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVwcmVjYXRlZF90ZXN0MSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjEyNzUyNDY3NDYwMDk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjEyNzUyNDY3NDYwMDk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9yZWxlYXNlc190ZWxlbWV0cnlfYW5kX2FuYWx5dGljcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODkyMDU3Mjk4MDEwMTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODkyMDU3Mjk4MDEwMTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NvbnRleHRfaHViIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwODA3MDQ0Njc1MDEwNTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwODA3MDQ0Njc1MDEwNTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2Fycmllcl9mb2xsb3dfdXAiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjYxNTIyMzcyNTA2NDE5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjYxNTIyMzcyNTA2NDE5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X2xpdmVfY2FwdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzY0NTI5NjY1NDA5MDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzY0NTI5NjY1NDA5MDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19kaXNwbGF5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNjE3MzA3MzY3MzQyMDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNjE3MzA3MzY3MzQyMDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZm91bmRhdGlvbl9zZWN1cml0eV9ydXN0X3Brdm1fIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNzEzNTQ0MjEwODQxNjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNzEzNTQ0MjEwODQxNjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfcmVwYWlyX21vZGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjA4Mzc3NTg2NzgxMzg4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjA4Mzc3NTg2NzgxMzg4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYXB0dXJlX2FuZF9zaGFyZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjQ0NTIzNzQ2Nzg3MzI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjQ0NTIzNzQ2Nzg3MzI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2tlZXAiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTgzOTUxODI3MTY2ODIyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTgzOTUxODI3MTY2ODIyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hYW9zX3NlY3VyaXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNjQzOTQzNjMwNzY2MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNjQzOTQzNjMwNzY2MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1femVyb19qYW5rIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3NjQ4NzQxMzM4OTcyMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3NjQ4NzQxMzM4OTcyMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF91bmlmaWVkX2NvcmVfaW5mcmFzdHJ1Y3R1cmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg0MjE3Mjk2MTkxNDg4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg0MjE3Mjk2MTkxNDg4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX2NvZGVjX2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTQzOTY2MDUwODQ0NjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTQzOTY2MDUwODQ0NjcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbV9nbl8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc4NTYzNjM3NjQ0NDkyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc4NTYzNjM3NjQ0NDkyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2FuZHJvaWRfYXV0aF9jbGllbnQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ3MTczMTYzMjE3NzE1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ3MTczMTYzMjE3NzE1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfaW9zX2NvbXBhbmlvbl9zZGsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTczNzA0NDg2NTA4OTUzNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTczNzA0NDg2NTA4OTUzNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9uZWFyYnkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk1OTkwODk2OTQ0NzQyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDk1OTkwODk2OTQ0NzQyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmF4X21ha2VfcGl4ZWxfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1MjE3NTM1ODU3Nzg2ODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1MjE3NTM1ODU3Nzg2ODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2hlYWx0aF9zZXJ2aWNlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTI2MTgyNjg2MDk3NDA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTI2MTgyNjg2MDk3NDA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21lZGlhX3ZvbHVtZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzYwMTQyMDcwODQxMzQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzYwMTQyMDcwODQxMzQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2xhcmdlX3NjcmVlbl9leHBlcmllbmNlc19zeXN1aSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODU1MjE0MTMwMDY5NTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODU1MjE0MTMwMDY5NTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21haW5saW5lX2VuZ3Byb2QiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ3NDYzNDc4OTg0NzA0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ3NDYzNDc4OTg0NzA0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfcG93ZXJfZm91bmRhdGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI5MjkwOTE5NjIxNDI3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI5MjkwOTE5NjIxNDI3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93aW5kb3dpbmdfdG9vbHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjM4Mjc3ODM4MjE4ODU0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjM4Mjc3ODM4MjE4ODU0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2ZyYW1ld29ya19hcHBjb21wYXQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTM4Mzc3MDcwMTk1NTA3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTM4Mzc3MDcwMTk1NTA3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9maXRiaXQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ5Nzg4NTMyNzM2MDAwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ5Nzg4NTMyNzM2MDAwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9vdmVyZHJpdmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk2MTU1ODIzNjg4OTA4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDk2MTU1ODIzNjg4OTA4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9mcmFtZXdvcmtfYW5kcm9pZF9wYWNrYWdlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTg5NzYyNDA3MTA0NTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTg5NzYyNDA3MTA0NTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RraWxib3Vybl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NTY2NDY3MDc4NzE3NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4NTY2NDY3MDc4NzE3NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbGFyZ2Vfc2NyZWVuX2V4cGVyaWVuY2VzX3BsYXRmb3JtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4MjY0NjI5MzczMTczNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4MjY0NjI5MzczMTczNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3NlcnZpY2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTgwMjY0Mzc5MDEzNTI5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTgwMjY0Mzc5MDEzNTI5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2RldmVsb3Blcl90b29scyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjAxODA3MzUzMDIwNDE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjAxODA3MzUzMDIwNDE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2F1dG9maWxsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2NzYyMDM0NjAzMjk0NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2NzYyMDM0NjAzMjk0NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX3c1IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2MjczMDY3MDIwNDUxODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2MjczMDY3MDIwNDUxODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3hmb29kX3h3ZWFyX2FuZF9sb2dpc3RpY3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU5OTA4OTMxMTM1MDc4NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU5OTA4OTMxMTM1MDc4NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX2RybSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzExNzUyNjkwMzM1NzQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzExNzUyNjkwMzM1NzQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25zeWx2YWluX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTEyOTA2Mjg5MzkxMjA2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTEyOTA2Mjg5MzkxMjA2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9md2tfd2lmaV9oYWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ3MDA4MjM2NDczNTQ4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ3MDA4MjM2NDczNTQ4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90b21iZXJnYW5fdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzY0MDMxMTk0NDk3MDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzY0MDMxMTk0NDk3MDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9wbGF0Zm9ybV9wcm9ncmFtX3BhcnRuZXJfZW5nXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDcyMjYxMDcwODE1MjMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDcyMjYxMDcwODE1MjMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21hc2RfcGl4ZWxfa2V5X2V4cGVyaWVuY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NzM1OTczMDY2NjcwMDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4NzM1OTczMDY2NjcwMDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZXh0ZXJuYWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjAzMzAzMjMxODE1NjgwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjAzMzAzMjMxODE1NjgwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9md2tfdGVsZXBob255IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NjM1OTY0MTEyMjQwNjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NjM1OTY0MTEyMjQwNjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY3VzdG9taXphdGlvbl9waWNrZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMxMTE0MjE3MzA4MTYwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMxMTE0MjE3MzA4MTYwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3Rlc3Rfc3VyZmFjZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg3OTE0OTY1MTA5OTY0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg3OTE0OTY1MTA5OTY0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pbnN0YW50X2FwcHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjcyMDc3Njg0MTMzMDY4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjcyMDc3Njg0MTMzMDY4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X2FhcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDQzMTk4MjI4Mjk5Nzc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDQzMTk4MjI4Mjk5Nzc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfZW5ncHJvZF9sb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQzMjI0MzE2Mzc5MTM2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQzMjI0MzE2Mzc5MTM2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbXdfbWNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0MjQ3MjM4Njg5MDk1NjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0MjQ3MjM4Njg5MDk1NjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2tlcm5lbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDM2ODAyNzExODQ2OTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDM2ODAyNzExODQ2OTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25nYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTk0ODc2OTM0NDg4MDY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTk0ODc2OTM0NDg4MDY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYl9vbl9hbmRyb2lkX3BlcmZvcm1hbmNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NjQ4NTE3NDg4NDc2MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4NjQ4NTE3NDg4NDc2MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcmV2ZW1hbl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMTMyNzQwNTcyNjEwNTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMTMyNzQwNTcyNjEwNTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGVzdF9lbmdfb3RhX2ZyYW1ld29ya19zeXN1aV9zdXdfYWJ2dF9jdHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY1MzY5NDk4MTExMTgwOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDY1MzY5NDk4MTExMTgwOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9iYWNrdXBfcmVzdG9yZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDQ5NTE5MTY3MTExMTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDQ5NTE5MTY3MTExMTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19icmluZ3VwX2FuZF9mYWN0b3J5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5OTk3NTI2NjUyNjgyMjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5OTk3NTI2NjUyNjgyMjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2NhbGxpbmdfbWVzc2FnaW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0MDEyNzQ4MDc2NDgyNTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0MDEyNzQ4MDc2NDgyNTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9pbWFnaW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4Mzg1MzgxMTMzODQ0NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4Mzg1MzgxMTMzODQ0NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X3NlbnNvciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTA0NDE3NTU3NjQzMjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTA0NDE3NTU3NjQzMjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RvZ2Zvb2RfdHJpYWdlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMzA4MjM5ODEyMzYyMjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMzA4MjM5ODEyMzYyMjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faW5wdXRfbWV0aG9kX2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82Mzk0MjAxNzcwNDU5MTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2Mzk0MjAxNzcwNDU5MTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9wbGF0Zm9ybV9kZXZfbGVhZF9kZXZpY2VfcHJvZ3JhbV8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY0MjM5MzE5NDEzNTU1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDY0MjM5MzE5NDEzNTU1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX2JvbmFfY29tcGFuaW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3MjE5MzI3ODQwMDkyMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3MjE5MzI3ODQwMDkyMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2NvbXBvc2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk1ODQwNDI3MTMwODgwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDk1ODQwNDI3MTMwODgwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zeXN0ZW1fZnVndV8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY4MjgzNzg2NDcxMDE0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY4MjgzNzg2NDcxMDE0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90dm9sa2VydF90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwOTMwMTQ2OTY1MjU4MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwOTMwMTQ2OTY1MjU4MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWVkaWFfZnJhbWV3b3JrX2RybSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzExNzUyNjkwMzM1NzQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzExNzUyNjkwMzM1NzQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21lZGlhX2ZyYW1ld29ya19hdWRpbyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODIzNTc1MzUzMDY1NDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODIzNTc1MzUzMDY1NDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3BlYXJsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMjYyMTk2MDIyMzEyOTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMjYyMTk2MDIyMzEyOTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXJfc2Vuc29yc19jb250ZXh0X2h1YiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80Nzc2MzcxMDkwMjU5OTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0Nzc2MzcxMDkwMjU5OTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21lZGlhX2NvZGVjX2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTQzOTY2MDUwODQ0NjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTQzOTY2MDUwODQ0NjcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcGxhdGZvcm1fcGVyZm9ybWFuY2VfdGVzdGluZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODEwMDk3ODM2NjIxODI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODEwMDk3ODM2NjIxODI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FkdGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTU1MTA5ODUyODgyNTM0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTU1MTA5ODUyODgyNTM0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pbmNyZW1lbnRhbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTU1NDA1NTU5MjAxNzkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTU1NDA1NTU5MjAxNzkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfbWVkaWFfYmV0dGVyX3RvZ2V0aGVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2MTczMDA0NTE3MjEyMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2MTczMDA0NTE3MjEyMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXR0YWNrX3Rvb2xzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3MDU2MjkxODUwODEzNDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3MDU2MjkxODUwODEzNDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9tZWRpYV9zb2x1dGlvbnNfZWRpdGluZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzUwNzUwMTkyNzYyODgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzUwNzUwMTkyNzYyODgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfdGVsZW1ldHJ5X2NsaWVudF9pbmZyYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDAzMjQ1MDc3NDMwMjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDAzMjQ1MDc3NDMwMjcyIiwKK30KZGlmZiAtLWdpdCBhL3RlYW1zL09XTkVSUyBiL3RlYW1zL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWU2OWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVhbXMvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAorZGFyaW9mcmVuaUBnb29nbGUuY29tCityb25pc2hAZ29vZ2xlLmNvbQorY2FkaXR5YUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90ZXN0cy9iX3Rlc3RzLnNoIGIvdGVzdHMvYl90ZXN0cy5zaAppbmRleCA0OTFkNzYyLi42OGExM2UzIDEwMDc1NQotLS0gYS90ZXN0cy9iX3Rlc3RzLnNoCisrKyBiL3Rlc3RzL2JfdGVzdHMuc2gKQEAgLTIzLDYgKzIzLDEwIEBACiAKIHRlc3RfdGFyZ2V0PS8vYnVpbGQvYmF6ZWwvc2NyaXB0cy9kaWZmdG9vbDpkaWZmdG9vbAogCitpZiBiIGJ1aWxkIC8vYnVpbGQvYmF6ZWw6bm9uZXhpc3RlbnRfbW9kdWxlICY+L2Rldi9udWxsIDsgdGhlbgorICAgIGVjaG8gImIgZGlkIG5vdCBmYWlsIHdoZW4gYnVpbGRpbmcgYSBub25leGlzdGVudCBtb2R1bGUiID4mMgorICAgIGV4aXQgMQorZmkKIGIgYnVpbGQgIiR0ZXN0X3RhcmdldCIKIGIgYnVpbGQgLS0gIiR0ZXN0X3RhcmdldCIKIGIgYnVpbGQgIiR0ZXN0X3RhcmdldCIgLS1ydW4tc29vbmctdGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL2x1bmNoX3Rlc3RzLnNoIGIvdGVzdHMvbHVuY2hfdGVzdHMuc2gKaW5kZXggNDI4NWQxMy4uOWIxNDJlZSAxMDA3NTUKLS0tIGEvdGVzdHMvbHVuY2hfdGVzdHMuc2gKKysrIGIvdGVzdHMvbHVuY2hfdGVzdHMuc2gKQEAgLTI4LDcgKzI4LDcgQEAKICAgICBbICIkVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04iID0gIiQ0IiBdIHx8ICggZWNobyAibHVuY2ggJDE6IGV4cGVjdGVkIFRBUkdFVF9QTEFURk9STV9WRVJTSU9OPSckNCcsIGdvdCAnJFRBUkdFVF9QTEFURk9STV9WRVJTSU9OJyIgJiYgZXhpdCAxICkKICkKIAotZGVmYXVsdF92ZXJzaW9uPSQoZ2V0X2J1aWxkX3ZhciBERUZBVUxUX1BMQVRGT1JNX1ZFUlNJT04pCitkZWZhdWx0X3ZlcnNpb249JChnZXRfYnVpbGRfdmFyIFJFTEVBU0VfUExBVEZPUk1fVkVSU0lPTikKIAogIyBsdW5jaCB0ZXN0cwogY2hlY2tfbHVuY2ggImFvc3BfYXJtNjQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW9zcF9hcm02NCIgImVuZyIgICAgICAgIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Byb2R1Y3QucmJjIGIvdGVzdHMvcHJvZHVjdC5yYmMKaW5kZXggOWFlNjM5My4uYjRjNmQ0NSAxMDA2NDQKLS0tIGEvdGVzdHMvcHJvZHVjdC5yYmMKKysrIGIvdGVzdHMvcHJvZHVjdC5yYmMKQEAgLTU0LDYgKzU0LDcgQEAKICAgcmJsZi5zb29uZ19jb25maWdfYXBwZW5kKGcsICJOUzEiLCAidjIiLCAiZGVmIikKICAgcmJsZi5zb29uZ19jb25maWdfc2V0KGcsICJOUzIiLCAidjMiLCAiYWJjIikKICAgcmJsZi5zb29uZ19jb25maWdfc2V0KGcsICJOUzIiLCAidjMiLCAieHl6IikKKyAgcmJsZi5zb29uZ19jb25maWdfc2V0KGcsICJOUzIiLCAidjQiLCAieHl6ICAgIikKIAogICByYmxmLm1rZGlzdF9mb3JfZ29hbHMoZywgImdvYWwiLCAiZGlyMS9maWxlMTpvdXQxIGRpcjEvZmlsZTI6b3V0MiIpCiAgIHJibGYubWtkaXN0X2Zvcl9nb2FscyhnLCAiZ29hbCIsICJkaXIyL2ZpbGUyOiIpCmRpZmYgLS1naXQgYS90ZXN0cy9ydW4ucmJjIGIvdGVzdHMvcnVuLnJiYwppbmRleCAzMzU4M2ViLi4yMjFiNDBmIDEwMDY0NAotLS0gYS90ZXN0cy9ydW4ucmJjCisrKyBiL3Rlc3RzL3J1bi5yYmMKQEAgLTI2LDYgKzI2LDcgQEAKIGxvYWQoIjpib2FyZC5yYmMiLCBib2FyZF9pbml0ID0gImluaXQiKQogbG9hZCgiOmJvYXJkX2lucHV0X3ZhcnMucmJjIiwgYm9hcmRfaW5wdXRfdmFyc19pbml0ID0gImluaXQiKQogbG9hZCgiLy9idWlsZC9tYWtlL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZTp0ZXN0LnJiYyIsIHRlc3Rfc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlID0gInRlc3QiKQorbG9hZCgiLy9idWlsZC9tYWtlL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yOnRlc3QucmJjIiwgdGVzdF9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMiA9ICJ0ZXN0IikKIGxvYWQoIi8vYnVpbGQvbWFrZS90ZXN0cy9hcnRpZmFjdF9wYXRoX3JlcXVpcmVtZW50czp0ZXN0LnJiYyIsIHRlc3RfYXJ0aWZhY3RfcGF0aF9yZXF1aXJlbWVudHMgPSAidGVzdCIpCiBsb2FkKCIvL2J1aWxkL21ha2UvdGVzdHMvcHJlZml4ZWRfc29ydF9vcmRlcjp0ZXN0LnJiYyIsIHRlc3RfcHJlZml4ZWRfc29ydF9vcmRlciA9ICJ0ZXN0IikKIGxvYWQoIi8vYnVpbGQvbWFrZS90ZXN0cy9pbmhlcml0c19pbl9yZWd1bGFyX3ZhcmlhYmxlczp0ZXN0LnJiYyIsIHRlc3RfaW5oZXJpdHNfaW5fcmVndWxhcl92YXJpYWJsZXMgPSAidGVzdCIpCkBAIC0xNDQsNyArMTQ1LDggQEAKICAgICAgICAgICAgICJ2MiI6ICJkZWYiCiAgICAgICAgIH0sCiAgICAgICAgICJOUzIiOiB7Ci0gICAgICAgICAgICAidjMiOiAieHl6IgorICAgICAgICAgICAgInYzIjogInh5eiIsCisgICAgICAgICAgICAidjQiOiAieHl6IgogICAgICAgICB9CiAgICAgfSwKICAgICB7azp2IGZvciBrLCB2IGluIHNvcnRlZChucy5pdGVtcygpKSB9CkBAIC0xODAsNiArMTgyLDcgQEAKIGFzc2VydF9lcSgiIiwgZy5nZXQoIk5FV1ZBUiIpKQogCiB0ZXN0X3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZSgpCit0ZXN0X3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yKCkKIHRlc3RfYXJ0aWZhY3RfcGF0aF9yZXF1aXJlbWVudHMoKQogdGVzdF9wcmVmaXhlZF9zb3J0X29yZGVyKCkKIHRlc3RfaW5oZXJpdHNfaW5fcmVndWxhcl92YXJpYWJsZXMoKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Ni5tayBiL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL2EucmJjCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODYubWsKcmVuYW1lIHRvIHRlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL2EucmJjCmluZGV4IDEzZWU1N2QuLmZlMTg2YzcgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka194ODYubWsKKysrIGIvdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvYS5yYmMKQEAgLTEsMjEgKzEsMjAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IDIwMjQgR29vZ2xlIExMQwogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCiAKLSMgRG9uJ3QgbW9kaWZ5IHRoaXMgZmlsZSAtIEl0J3MganVzdCBhbiBhbGlhcyEKK2xvYWQoIi8vYnVpbGQvbWFrZS9jb3JlOnByb2R1Y3RfY29uZmlnLnJiYyIsICJyYmxmIikKIAotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9zZGtfcGhvbmVfeDg2Lm1rKQorZGVmIGluaXQoZywgaGFuZGxlKToKKyAgY2ZnID0gcmJsZi5jZmcoaGFuZGxlKQogCi1QUk9EVUNUX05BTUUgOj0gc2RrX3g4NgorICBjZmdbIlBST0RVQ1RfRU5BQkxFX1VGRkRfR0MiXSA9ICJ0cnVlIgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Ni5tayBiL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL2IucmJjCnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSB0YXJnZXQvcHJvZHVjdC9zZGtfeDg2Lm1rCmNvcHkgdG8gdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvYi5yYmMKaW5kZXggMTNlZTU3ZC4uN2Q5NTc0OSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Ni5taworKysgYi90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9iLnJiYwpAQCAtMSwyMSArMSwyMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgTExDCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKIAotIyBEb24ndCBtb2RpZnkgdGhpcyBmaWxlIC0gSXQncyBqdXN0IGFuIGFsaWFzIQorbG9hZCgiLy9idWlsZC9tYWtlL2NvcmU6cHJvZHVjdF9jb25maWcucmJjIiwgInJibGYiKQogCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3Nka19waG9uZV94ODYubWspCitkZWYgaW5pdChnLCBoYW5kbGUpOgorICBjZmcgPSByYmxmLmNmZyhoYW5kbGUpCiAKLVBST0RVQ1RfTkFNRSA6PSBzZGtfeDg2CisgIGNmZ1siUFJPRFVDVF9FTkFCTEVfVUZGRF9HQyJdID0gImRlZmF1bHQiCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2XzY0Lm1rIGIvdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvYy5yYmMKc2ltaWxhcml0eSBpbmRleCA2NSUKY29weSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKY29weSB0byB0ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9jLnJiYwppbmRleCA1ZjY1NTNlLi5lOTBlMzdkIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2XzY0Lm1rCisrKyBiL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL2MucmJjCkBAIC0xLDIxICsxLDIxIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAyMDI0IEdvb2dsZSBMTEMKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwogCi0jIERvbid0IG1vZGlmeSB0aGlzIGZpbGUgLSBJdCdzIGp1c3QgYW4gYWxpYXMhCitsb2FkKCIvL2J1aWxkL21ha2UvY29yZTpwcm9kdWN0X2NvbmZpZy5yYmMiLCAicmJsZiIpCitsb2FkKCI6Yi5yYmMiLCBfYl9pbml0ID0gImluaXQiKQogCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWspCitkZWYgaW5pdChnLCBoYW5kbGUpOgorICBjZmcgPSByYmxmLmNmZyhoYW5kbGUpCiAKLVBST0RVQ1RfTkFNRSA6PSBzZGtfeDg2XzY0CisgIHJibGYuaW5oZXJpdChoYW5kbGUsICJ0ZXN0L2IiLCBfYl9pbml0KQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvZC5yYmMgYi90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9kLnJiYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTg4YzJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvZC5yYmMKQEAgLTAsMCArMSwyMyBAQAorIyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgTExDCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworbG9hZCgiLy9idWlsZC9tYWtlL2NvcmU6cHJvZHVjdF9jb25maWcucmJjIiwgInJibGYiKQorbG9hZCgiOmMucmJjIiwgX2NfaW5pdCA9ICJpbml0IikKK2xvYWQoIjphLnJiYyIsIF9hX2luaXQgPSAiaW5pdCIpCisKK2RlZiBpbml0KGcsIGhhbmRsZSk6CisgIGNmZyA9IHJibGYuY2ZnKGhhbmRsZSkKKworICByYmxmLmluaGVyaXQoaGFuZGxlLCAidGVzdC9hIiwgX2FfaW5pdCkKKyAgcmJsZi5pbmhlcml0KGhhbmRsZSwgInRlc3QvYyIsIF9jX2luaXQpCmRpZmYgLS1naXQgYS90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9wcm9kdWN0LnJiYyBiL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL3Byb2R1Y3QucmJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzY2NGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9wcm9kdWN0LnJiYwpAQCAtMCwwICsxLDIzIEBACisjIENvcHlyaWdodCAyMDI0IEdvb2dsZSBMTEMKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsb2FkKCIvL2J1aWxkL21ha2UvY29yZTpwcm9kdWN0X2NvbmZpZy5yYmMiLCAicmJsZiIpCitsb2FkKCI6Yi5yYmMiLCBfYl9pbml0ID0gImluaXQiKQorbG9hZCgiOmQucmJjIiwgX2RfaW5pdCA9ICJpbml0IikKKworZGVmIGluaXQoZywgaGFuZGxlKToKKyAgY2ZnID0gcmJsZi5jZmcoaGFuZGxlKQorCisgIHJibGYuaW5oZXJpdChoYW5kbGUsICJ0ZXN0L2IiLCBfYl9pbml0KQorICByYmxmLmluaGVyaXQoaGFuZGxlLCAidGVzdC9kIiwgX2RfaW5pdCkKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL3Rlc3QucmJjIGIvdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvdGVzdC5yYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5M2FhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL3Rlc3QucmJjCkBAIC0wLDAgKzEsNDAgQEAKKyMgQ29weXJpZ2h0IDIwMjQgR29vZ2xlIExMQworIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xvYWQoIi8vYnVpbGQvbWFrZS9jb3JlOnByb2R1Y3RfY29uZmlnLnJiYyIsICJyYmxmIikKK2xvYWQoIi8vYnVpbGQvbWFrZS90ZXN0cy9pbnB1dF92YXJpYWJsZXMucmJjIiwgaW5wdXRfdmFyaWFibGVzX2luaXQgPSAiaW5pdCIpCitsb2FkKCI6cHJvZHVjdC5yYmMiLCAiaW5pdCIpCisKKworZGVmIGFzc2VydF9lcShleHBlY3RlZCwgYWN0dWFsKToKKyAgICBpZiBleHBlY3RlZCAhPSBhY3R1YWw6CisgICAgICAgIGZhaWwoIkV4cGVjdGVkICclcycsIGdvdCAnJXMnIiAlIChleHBlY3RlZCwgYWN0dWFsKSkKKworIyBUaGlzIHRlc3QgaXMgdGVzdGluZyB0aGF0IHNpbmdsZSB2YWx1ZSB2YXJpYWJsZXMgYXJlICJzdG9sZW4iIHdoZW4gcHJvY2Vzc2luZyB0aGUgaW5oZXJpdGFuY2UKKyMgZ3JhcGguIGkuZS4gaWYgeW91IGhhdmUgYSBncmFwaCBsaWtlIHRoaXM6CisjCisjICAgQiAgIEEKKyMgICB8XCAgfAorIyAgIHwgQyB8CisjICAgIFwgXHwKKyMgICAgIFwgRAorIyAgICAgIFx8CisjICAgICAgIEUKKyMKKyMgVGhlIHNhbWUgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiBib3RoIEEgYW5kIEIuIEluIEQsIHRoZSB2YWx1ZSBmcm9tIEEgaXMgY2hvc2VuIGJlY2F1c2UgaXQgY29tZXMKKyMgYWxwaGFiZXRpY2FsbHkgYmVmb3JlIEMuIEJ1dCB0aGVuIGluIEUsIHRoZSB2YWx1ZSBmcm9tIEQgaXMgY2hvc2VuIGluc3RlYWQgb2YgdGhlIHZhbHVlIGZyb20gQiwKKyMgYmVjYXVzZSB0aGUgdmFsdWUgb2YgQiB3YXMgInN0b2xlbiIgYW5kIHN1Y2tlZCBpbnRvIEMsIGxlYXZpbmcgQiB3aXRoIG5vIHZhbHVlIHNldC4KK2RlZiB0ZXN0KCk6CisgICAgKGdsb2JhbHMsIGdsb2JhbHNfYmFzZSkgPSByYmxmLnByb2R1Y3RfY29uZmlndXJhdGlvbigidGVzdC9kZXZpY2UiLCBpbml0LCBpbnB1dF92YXJpYWJsZXNfaW5pdCkKKyAgICBhc3NlcnRfZXEoInRydWUiLCBnbG9iYWxzWyJQUk9EVUNUUy50ZXN0L2RldmljZS5tay5QUk9EVUNUX0VOQUJMRV9VRkZEX0dDIl0pCmRpZmYgLS1naXQgYS90b29scy9BbmRyb2lkLmJwIGIvdG9vbHMvQW5kcm9pZC5icAppbmRleCBiZWEwNjAyLi41OTgzMWE2IDEwMDY0NAotLS0gYS90b29scy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL0FuZHJvaWQuYnAKQEAgLTE4LDU2ICsxOCw2NSBAQAogfQogCiBweXRob25fYmluYXJ5X2hvc3QgewotICBuYW1lOiAiZ2VuZXJhdGUtc2VsZi1leHRyYWN0aW5nLWFyY2hpdmUiLAotICBzcmNzOiBbImdlbmVyYXRlLXNlbGYtZXh0cmFjdGluZy1hcmNoaXZlLnB5Il0sCisgICAgbmFtZTogImdlbmVyYXRlLXNlbGYtZXh0cmFjdGluZy1hcmNoaXZlIiwKKyAgICBzcmNzOiBbImdlbmVyYXRlLXNlbGYtZXh0cmFjdGluZy1hcmNoaXZlLnB5Il0sCiB9CiAKIHB5dGhvbl9iaW5hcnlfaG9zdCB7Ci0gIG5hbWU6ICJwb3N0X3Byb2Nlc3NfcHJvcHMiLAotICBzcmNzOiBbInBvc3RfcHJvY2Vzc19wcm9wcy5weSJdLAorICAgIG5hbWU6ICJwb3N0X3Byb2Nlc3NfcHJvcHMiLAorICAgIHNyY3M6IFsicG9zdF9wcm9jZXNzX3Byb3BzLnB5Il0sCisgICAgbGliczogWworICAgICAgICAidWZmZF9nY191dGlscyIsCisgICAgXSwKIH0KIAogcHl0aG9uX3Rlc3RfaG9zdCB7Ci0gIG5hbWU6ICJwb3N0X3Byb2Nlc3NfcHJvcHNfdW5pdHRlc3QiLAotICBtYWluOiAidGVzdF9wb3N0X3Byb2Nlc3NfcHJvcHMucHkiLAotICBzcmNzOiBbCi0gICAgInBvc3RfcHJvY2Vzc19wcm9wcy5weSIsCi0gICAgInRlc3RfcG9zdF9wcm9jZXNzX3Byb3BzLnB5IiwKLSAgXSwKLSAgdGVzdF9jb25maWc6ICJwb3N0X3Byb2Nlc3NfcHJvcHNfdW5pdHRlc3QueG1sIiwKLSAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorICAgIG5hbWU6ICJwb3N0X3Byb2Nlc3NfcHJvcHNfdW5pdHRlc3QiLAorICAgIG1haW46ICJ0ZXN0X3Bvc3RfcHJvY2Vzc19wcm9wcy5weSIsCisgICAgc3JjczogWworICAgICAgICAicG9zdF9wcm9jZXNzX3Byb3BzLnB5IiwKKyAgICAgICAgInRlc3RfcG9zdF9wcm9jZXNzX3Byb3BzLnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgInVmZmRfZ2NfdXRpbHMiLAorICAgIF0sCisgICAgdGVzdF9jb25maWc6ICJwb3N0X3Byb2Nlc3NfcHJvcHNfdW5pdHRlc3QueG1sIiwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCiB9CiAKIHB5dGhvbl9iaW5hcnlfaG9zdCB7Ci0gIG5hbWU6ICJleHRyYWN0X2tlcm5lbCIsCi0gIHNyY3M6IFsiZXh0cmFjdF9rZXJuZWwucHkiXSwKKyAgICBuYW1lOiAiZXh0cmFjdF9rZXJuZWwiLAorICAgIHNyY3M6IFsiZXh0cmFjdF9rZXJuZWwucHkiXSwKIH0KIAogZ2VucnVsZV9kZWZhdWx0cyB7Ci0gIG5hbWU6ICJleHRyYWN0X2tlcm5lbF9yZWxlYXNlX2RlZmF1bHRzIiwKLSAgdG9vbHM6IFsiZXh0cmFjdF9rZXJuZWwiLCAibHo0Il0sCi0gIG91dDogWyJrZXJuZWxfcmVsZWFzZS50eHQiXSwKLSAgY21kOiAiJChsb2NhdGlvbikgLS10b29scyBsejQ6JChsb2NhdGlvbiBsejQpIC0taW5wdXQgJChpbikgLS1vdXRwdXQtcmVsZWFzZSA+ICQob3V0KSIKKyAgICBuYW1lOiAiZXh0cmFjdF9rZXJuZWxfcmVsZWFzZV9kZWZhdWx0cyIsCisgICAgdG9vbHM6IFsKKyAgICAgICAgImV4dHJhY3Rfa2VybmVsIiwKKyAgICAgICAgImx6NCIsCisgICAgXSwKKyAgICBvdXQ6IFsia2VybmVsX3JlbGVhc2UudHh0Il0sCisgICAgY21kOiAiJChsb2NhdGlvbikgLS10b29scyBsejQ6JChsb2NhdGlvbiBsejQpIC0taW5wdXQgJChpbikgLS1vdXRwdXQtcmVsZWFzZSA+ICQob3V0KSIsCiB9CiAKIGNjX2JpbmFyeV9ob3N0IHsKLSAgbmFtZTogImJ1aWxkLXJ1bmZpbGVzIiwKLSAgc3JjczogWyJidWlsZC1ydW5maWxlcy5jYyJdLAorICAgIG5hbWU6ICJidWlsZC1ydW5maWxlcyIsCisgICAgc3JjczogWyJidWlsZC1ydW5maWxlcy5jYyJdLAogfQogCiBweXRob25fYmluYXJ5X2hvc3QgewotICBuYW1lOiAiY2hlY2tfcmFkaW9fdmVyc2lvbnMiLAotICBzcmNzOiBbImNoZWNrX3JhZGlvX3ZlcnNpb25zLnB5Il0sCisgICAgbmFtZTogImNoZWNrX3JhZGlvX3ZlcnNpb25zIiwKKyAgICBzcmNzOiBbImNoZWNrX3JhZGlvX3ZlcnNpb25zLnB5Il0sCiB9CiAKIHB5dGhvbl9iaW5hcnlfaG9zdCB7Ci0gIG5hbWU6ICJjaGVja19lbGZfZmlsZSIsCi0gIHNyY3M6IFsiY2hlY2tfZWxmX2ZpbGUucHkiXSwKKyAgICBuYW1lOiAiY2hlY2tfZWxmX2ZpbGUiLAorICAgIHNyY3M6IFsiY2hlY2tfZWxmX2ZpbGUucHkiXSwKIH0KIAogcHl0aG9uX2JpbmFyeV9ob3N0IHsKLSAgbmFtZTogImdlbmVyYXRlX2d0c19zaGFyZWRfcmVwb3J0IiwKLSAgc3JjczogWyJnZW5lcmF0ZV9ndHNfc2hhcmVkX3JlcG9ydC5weSJdLAorICAgIG5hbWU6ICJnZW5lcmF0ZV9ndHNfc2hhcmVkX3JlcG9ydCIsCisgICAgc3JjczogWyJnZW5lcmF0ZV9ndHNfc2hhcmVkX3JlcG9ydC5weSJdLAogfQogCiBweXRob25fYmluYXJ5X2hvc3QgewpAQCAtNzcsOCArODYsNDAgQEAKICAgICAgICAgImxpc3RfZmlsZXMucHkiLAogICAgIF0sCiAgICAgdmVyc2lvbjogewotICAgICAgcHkzOiB7Ci0gICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAotICAgICAgfQotICAgIH0KKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiYXV0b19nZW5fdGVzdF9jb25maWdfdGVzdCIsCisgICAgbWFpbjogImF1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImF1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5IiwKKyAgICAgICAgImF1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkiLAorICAgIF0sCisgICAgYXV0b19nZW5fY29uZmlnOiB0cnVlLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKKyAgICB0ZXN0X29wdGlvbnM6IHsKKyAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAorICAgIH0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImNoYXJhY3RlcmlzdGljc19ycm9fZ2VuZXJhdG9yIiwKKyAgICBzcmNzOiBbImNoYXJhY3RlcmlzdGljc19ycm9fZ2VuZXJhdG9yLnB5Il0sCisgICAgdmVyc2lvbjogeworICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogIm1lcmdlLWV2ZW50LWxvZy10YWdzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJldmVudF9sb2dfdGFncy5weSIsCisgICAgICAgICJtZXJnZS1ldmVudC1sb2ctdGFncy5weSIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL0JVSUxELmJhemVsIGIvdG9vbHMvQlVJTEQuYmF6ZWwKaW5kZXggMGRlMTc4Yi4uOWVjMGRjZSAxMDA2NDQKLS0tIGEvdG9vbHMvQlVJTEQuYmF6ZWwKKysrIGIvdG9vbHMvQlVJTEQuYmF6ZWwKQEAgLTEsNiArMSw3IEBACiBweV9saWJyYXJ5KAogICAgIG5hbWUgPSAiZXZlbnRfbG9nX3RhZ3MiLAogICAgIHNyY3MgPSBbImV2ZW50X2xvZ190YWdzLnB5Il0sCisgICAgaW1wb3J0cyA9IFsiLiJdLAogKQogCiBweV9iaW5hcnkoCkBAIC0yNSwzICsyNiwxMCBAQAogICAgIHB5dGhvbl92ZXJzaW9uID0gIlBZMyIsCiAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAogKQorCitweV9iaW5hcnkoCisgICAgbmFtZSA9ICJhdXRvX2dlbl90ZXN0X2NvbmZpZyIsCisgICAgc3JjcyA9IFsiYXV0b19nZW5fdGVzdF9jb25maWcucHkiXSwKKyAgICBweXRob25fdmVyc2lvbiA9ICJQWTMiLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKykKZGlmZiAtLWdpdCBhL3Rvb2xzL09XTkVSUyBiL3Rvb2xzL09XTkVSUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2NjZmMS4uMDAwMDAwMAotLS0gYS90b29scy9PV05FUlMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wZXItZmlsZSB3YXJuLnB5LGNoZWNrb3duZXJzLnB5ID0gY2hoQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvLmVkaXRvcmNvbmZpZyBiL3Rvb2xzL2Fjb25maWcvLmVkaXRvcmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzU5ODVmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy8uZWRpdG9yY29uZmlnCkBAIC0wLDAgKzEsOSBAQAorIyBFZGl0b3JDb25maWcgaXMgYXdlc29tZTogaHR0cHM6Ly9FZGl0b3JDb25maWcub3JnCisKKyMgdG9wLW1vc3QgRWRpdG9yQ29uZmlnIGZpbGUKK3Jvb3QgPSB0cnVlCisKK1sqLmphdmFdCitpbmRlbnRfc3R5bGUgPSB0YWIKK2luZGVudF9zaXplID0gNAorCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnLy5naXRpZ25vcmUgYi90b29scy9hY29uZmlnLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3MjQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKy9DYXJnby5sb2NrCisvdGFyZ2V0CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL0NhcmdvLnRvbWwgYi90b29scy9hY29uZmlnL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1ZTFhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE0IEBACitbd29ya3NwYWNlXQorCittZW1iZXJzID0gWworICAgICJhY29uZmlnIiwKKyAgICAiYWNvbmZpZ19kZXZpY2VfcGF0aHMiLAorICAgICJhY29uZmlnX3Byb3RvcyIsCisgICAgImFjb25maWdfc3RvcmFnZV9maWxlIiwKKyAgICAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKKyAgICAiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaSIsCisgICAgImFmbGFncyIsCisgICAgInByaW50ZmxhZ3MiCitdCisKK3Jlc29sdmVyID0gIjIiCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi90b29scy9hY29uZmlnL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9PV05FUlMgYi90b29scy9hY29uZmlnL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTc2Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9PV05FUlMKQEAgLTAsMCArMSw3IEBACithbWhrQGdvb2dsZS5jb20KK2R6c2hlbkBnb29nbGUuY29tCitqaGFtQGdvb2dsZS5jb20KK2pvZW9AZ29vZ2xlLmNvbQorb3BnQGdvb2dsZS5jb20KK3RlZGJhdWVyQGdvb2dsZS5jb20KK3poaWRvdUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL1BSRVVQTE9BRC5jZmcgYi90b29scy9hY29uZmlnL1BSRVVQTE9BRC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlZDU3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvUFJFVVBMT0FELmNmZwpAQCAtMCwwICsxLDUgQEAKK1tCdWlsdGluIEhvb2tzXQorcnVzdGZtdCA9IHRydWUKKworW0J1aWx0aW4gSG9va3MgT3B0aW9uc10KK3J1c3RmbXQgPSAtLWNvbmZpZy1wYXRoPXJ1c3RmbXQudG9tbApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9URVNUX01BUFBJTkcgYi90b29scy9hY29uZmlnL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWU0MTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMTMgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAvLyBhY29uZmlnIHVuaXQgdGVzdHMKKyAgICAgICJuYW1lIjogImFjb25maWcudGVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWcgSmF2YSBpbnRlZ3JhdGlvbiB0ZXN0cyAoaG9zdCkKKyAgICAgICJuYW1lIjogIkFjb25maWdKYXZhSG9zdFRlc3QiCisgICAgfSwKKyAgICB7CisgICAgICAvLyBhY29uZmlnIEphdmEgaW50ZWdyYXRpb24gdGVzdHMKKyAgICAgICJuYW1lIjogImFjb25maWcudGVzdC5qYXZhIgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZyBDKysgaW50ZWdyYXRpb24gdGVzdHMgKHByb2R1Y3Rpb24gbW9kZSBhdXRvLWdlbmVyYXRlZCBjb2RlKQorICAgICAgIm5hbWUiOiAiYWNvbmZpZy50ZXN0LmNwcCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWcgQysrIGludGVncmF0aW9uIHRlc3RzICh0ZXN0IG1vZGUgYXV0by1nZW5lcmF0ZWQgY29kZSkKKyAgICAgICJuYW1lIjogImFjb25maWcudGVzdC5jcHAudGVzdF9tb2RlIgorICAgIH0sCisgICAgLy8gVE9ETyhiLzMyNzQyMDY3OSk6IEVuYWJsZSBleHBvcnQgbW9kZSBmb3IgbmF0aXZlIGZsYWcgbGlicmFyeQorICAgIC8vIHsKKyAgICAvLyAgIC8vIGFjb25maWcgQysrIGludGVncmF0aW9uIHRlc3RzIChleHBvcnRlZCBtb2RlIGF1dG8tZ2VuZXJhdGVkIGNvZGUpCisgICAgLy8gICAibmFtZSI6ICJhY29uZmlnLnRlc3QuY3BwLmV4cG9ydGVkX21vZGUiCisgICAgLy8gfSwKKyAgICB7CisgICAgICAvLyBhY29uZmlnIFJ1c3QgaW50ZWdyYXRpb24gdGVzdHMgKHByb2R1Y3Rpb24gbW9kZSBhdXRvLWdlbmVyYXRlZCBjb2RlKQorICAgICAgIm5hbWUiOiAiYWNvbmZpZy5wcm9kX21vZGUudGVzdC5ydXN0IgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZyBSdXN0IGludGVncmF0aW9uIHRlc3RzICh0ZXN0IG1vZGUgYXV0by1nZW5lcmF0ZWQgY29kZSkKKyAgICAgICJuYW1lIjogImFjb25maWcudGVzdF9tb2RlLnRlc3QucnVzdCIKKyAgICB9LAorICAgIC8vIFRPRE8oYi8zMjc0MjA2NzkpOiBFbmFibGUgZXhwb3J0IG1vZGUgZm9yIG5hdGl2ZSBmbGFnIGxpYnJhcnkKKyAgICAvLyB7CisgICAgLy8gICAvLyBhY29uZmlnIFJ1c3QgaW50ZWdyYXRpb24gdGVzdHMgKGV4cG9ydGVkIG1vZGUgYXV0by1nZW5lcmF0ZWQgY29kZSkKKyAgICAvLyAgICJuYW1lIjogImFjb25maWcuZXhwb3J0ZWRfbW9kZS50ZXN0LnJ1c3QiCisgICAgLy8gfSwKKyAgICB7CisgICAgICAvLyBhZmxhZ3MgQ0xJIHVuaXQgdGVzdHMKKyAgICAgICJuYW1lIjogImFmbGFncy50ZXN0IgorICAgIH0sCisgICAgeworICAgICAgLy8gcHJpbnRmbGFncyB1bml0IHRlc3RzCisgICAgICAibmFtZSI6ICJwcmludGZsYWdzLnRlc3QiCisgICAgfSwKKyAgICB7CisgICAgICAvLyBhY29uZmlnX3Byb3RvcyB1bml0IHRlc3RzCisgICAgICAibmFtZSI6ICJhY29uZmlnX3Byb3Rvcy50ZXN0IgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlX2ZpbGUgdW5pdCB0ZXN0cworICAgICAgIm5hbWUiOiAiYWNvbmZpZ19zdG9yYWdlX2ZpbGUudGVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIEVuc3VyZSBjaGFuZ2VzIG9uIGFjb25maWcgYXV0byBnZW5lcmF0ZWQgbGlicmFyeSBpcyBjb21wYXRpYmxlIHdpdGgKKyAgICAgIC8vIHRlc3QgdGVzdGluZyBmaWx0ZXJpbmcgbG9naWMuIEJyZWFrYWdlIG9uIHRoaXMgdGVzdCBtZWFucyBhbGwgdGVzdHMKKyAgICAgIC8vIHRoYXQgdXNpbmcgdGhlIGZsYWcgYW5ub3RhdGlvbnMgdG8gZG8gZmlsdGVyaW5nIHdpbGwgZ2V0IGFmZmVjdGVkLgorICAgICAgIm5hbWUiOiAiRmxhZ0Fubm90YXRpb25UZXN0cyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLmN0cy5mbGFncy50ZXN0cy5GbGFnQW5ub3RhdGlvblRlc3QiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgIC8vIEVuc3VyZSBjaGFuZ2VzIG9uIGFjb25maWcgYXV0byBnZW5lcmF0ZWQgbGlicmFyeSBpcyBjb21wYXRpYmxlIHdpdGgKKyAgICAgIC8vIHRlc3QgdGVzdGluZyBmaWx0ZXJpbmcgbG9naWMuIEJyZWFrYWdlIG9uIHRoaXMgdGVzdCBtZWFucyBhbGwgdGVzdHMKKyAgICAgIC8vIHRoYXQgdXNpbmcgdGhlIGZsYWcgbWFjcm9zIHRvIGRvIGZpbHRlcmluZyB3aWxsIGdldCBhZmZlY3RlZC4KKyAgICAgICJuYW1lIjogIkZsYWdNYWNyb3NUZXN0cyIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkgdW5pdCB0ZXN0cworICAgICAgIm5hbWUiOiAiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS50ZXN0IgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIHVuaXQgdGVzdHMKKyAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS50ZXN0IgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlIHdyaXRlIGFwaSBydXN0IGludGVncmF0aW9uIHRlc3RzCisgICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLnRlc3QucnVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWdfc3RvcmFnZSB3cml0ZSBhcGkgY3BwIGludGVncmF0aW9uIHRlc3RzCisgICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLnRlc3QuY3BwIgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlIHJlYWQgYXBpIHJ1c3QgaW50ZWdyYXRpb24gdGVzdHMKKyAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS50ZXN0LnJ1c3QiCisgICAgfSwKKyAgICB7CisgICAgICAvLyBhY29uZmlnX3N0b3JhZ2UgcmVhZCBhcGkgY3BwIGludGVncmF0aW9uIHRlc3RzCisgICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkudGVzdC5jcHAiCisgICAgfSwKKyAgICB7CisgICAgICAvLyBhY29uZmlnX3N0b3JhZ2UgZmlsZSBjcHAgaW50ZWdyYXRpb24gdGVzdHMKKyAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV9maWxlLnRlc3QuY3BwIgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlIGZpbGUgamF2YSBpbnRlZ3JhdGlvbiB0ZXN0cworICAgICAgIm5hbWUiOiAiYWNvbmZpZ19zdG9yYWdlX2ZpbGUudGVzdC5qYXZhIgorICAgIH0KKyAgXSwKKyAgInBvc3RzdWJtaXQiOiBbCisgICAgeworICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlIHJlYWQgYXBpIGphdmEgaW50ZWdyYXRpb24gdGVzdHMKKyAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS50ZXN0LmphdmEiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTIxYWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvQW5kcm9pZC5icApAQCAtMCwwICsxLDMwNSBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitydXN0X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWNvbmZpZy5kZWZhdWx0cyIsCisgICAgZWRpdGlvbjogIjIwMjEiLAorICAgIGNsaXBweV9saW50czogImFuZHJvaWQiLAorICAgIGxpbnRzOiAiYW5kcm9pZCIsCisgICAgc3JjczogWyJzcmMvbWFpbi5ycyJdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3Byb3RvcyIsCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZSIsCisgICAgICAgICJsaWJhbnlob3ciLAorICAgICAgICAibGliY2xhcCIsCisgICAgICAgICJsaWJpdGVydG9vbHMiLAorICAgICAgICAibGlicHJvdG9idWYiLAorICAgICAgICAibGlic2VyZGUiLAorICAgICAgICAibGlic2VyZGVfanNvbiIsCisgICAgICAgICJsaWJ0aW55dGVtcGxhdGUiLAorICAgIF0sCit9CisKK3J1c3RfYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJhY29uZmlnIiwKKyAgICBkZWZhdWx0czogWyJhY29uZmlnLmRlZmF1bHRzIl0sCit9CisKK3J1c3RfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0IiwKKyAgICBkZWZhdWx0czogWyJhY29uZmlnLmRlZmF1bHRzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYml0ZXJ0b29scyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKKy8vIGludGVncmF0aW9uIHRlc3RzOiBnZW5lcmFsCisKK2Fjb25maWdfZGVjbGFyYXRpb25zIHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IiwKKyAgICBjb250YWluZXI6ICJzeXN0ZW0iLAorICAgIHNyY3M6IFsidGVzdHMvdGVzdC5hY29uZmlnIl0sCit9CisKK2Fjb25maWdfZGVjbGFyYXRpb25zIHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmV4cG9ydGVkLmZsYWdzIiwKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmV4cG9ydGVkIiwKKyAgICBleHBvcnRhYmxlOiB0cnVlLAorICAgIGNvbnRhaW5lcjogInN5c3RlbSIsCisgICAgc3JjczogWyJ0ZXN0cy90ZXN0X2V4cG9ydGVkLmFjb25maWciXSwKK30KKworYWNvbmZpZ19kZWNsYXJhdGlvbnMgeworICAgIG5hbWU6ICJhY29uZmlnLnRlc3QuZm9yY2VyZWFkb25seS5mbGFncyIsCisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5mb3JjZXJlYWRvbmx5IiwKKyAgICBjb250YWluZXI6ICJzeXN0ZW0iLAorICAgIHNyY3M6IFsidGVzdHMvdGVzdF9mb3JjZV9yZWFkX29ubHkuYWNvbmZpZyJdLAorfQorCithY29uZmlnX3ZhbHVlcyB7CisgICAgbmFtZTogImFjb25maWcudGVzdC5mbGFnLnZhbHVlcyIsCisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvZmlyc3QudmFsdWVzIiwKKyAgICAgICAgInRlc3RzL3NlY29uZC52YWx1ZXMiLAorICAgIF0sCit9CisKK2Fjb25maWdfdmFsdWVfc2V0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmZsYWcudmFsdWVfc2V0IiwKKyAgICB2YWx1ZXM6IFsKKyAgICAgICAgImFjb25maWcudGVzdC5mbGFnLnZhbHVlcyIsCisgICAgXSwKK30KKworLy8gaW50ZWdyYXRpb24gdGVzdHM6IGphdmEKKworamF2YV9hY29uZmlnX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX3Rlc3RfamF2YV9saWJyYXJ5IiwKKyAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWcudGVzdC5mbGFncyIsCit9CisKK2phdmFfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ190ZXN0X2phdmFfbGlicmFyeV9leHBvcnRlZCIsCisgICAgYWNvbmZpZ19kZWNsYXJhdGlvbnM6ICJhY29uZmlnLnRlc3QuZXhwb3J0ZWQuZmxhZ3MiLAorICAgIG1vZGU6ICJleHBvcnRlZCIsCit9CisKK2phdmFfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ190ZXN0X2phdmFfbGlicmFyeV9mb3JjZXJlYWRvbmx5IiwKKyAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWcudGVzdC5mb3JjZXJlYWRvbmx5LmZsYWdzIiwKKyAgICBtb2RlOiAiZm9yY2UtcmVhZC1vbmx5IiwKK30KKworYW5kcm9pZF90ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmphdmEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL0Fjb25maWdUZXN0LmphdmEiLAorICAgIF0sCisgICAgbWFuaWZlc3Q6ICJ0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIiwKKyAgICBjZXJ0aWZpY2F0ZTogInBsYXRmb3JtIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYWNvbmZpZ190ZXN0X2phdmFfbGlicmFyeSIsCisgICAgICAgICJhY29uZmlnX3Rlc3RfamF2YV9saWJyYXJ5X2V4cG9ydGVkIiwKKyAgICAgICAgImFjb25maWdfdGVzdF9qYXZhX2xpYnJhcnlfZm9yY2VyZWFkb25seSIsCisgICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bGVzIiwKKyAgICAgICAgInRlc3RuZyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKK2phdmFfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19ob3N0X3Rlc3RfamF2YV9saWJyYXJ5IiwKKyAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWcudGVzdC5mbGFncyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgbW9kZTogInRlc3QiLAorfQorCitqYXZhX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogIkFjb25maWdKYXZhSG9zdFRlc3QiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL0Fjb25maWdIb3N0VGVzdC5qYXZhIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhY29uZmlnX2hvc3RfdGVzdF9qYXZhX2xpYnJhcnkiLAorICAgICAgICAianVuaXQiLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQorCisvLyBpbnRlZ3JhdGlvbiB0ZXN0czogQysrCisKK2NjX2Fjb25maWdfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfdGVzdF9jcHBfbGlicmFyeSIsCisgICAgYWNvbmZpZ19kZWNsYXJhdGlvbnM6ICJhY29uZmlnLnRlc3QuZmxhZ3MiLAorfQorCitjY19hY29uZmlnX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX3Rlc3RfY3BwX2xpYnJhcnlfdGVzdF92YXJpYW50IiwKKyAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWcudGVzdC5mbGFncyIsCisgICAgbW9kZTogInRlc3QiLAorfQorCitjY19hY29uZmlnX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX3Rlc3RfY3BwX2xpYnJhcnlfZm9yY2VfcmVhZF9vbmx5X3ZhcmlhbnQiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKKyAgICBtb2RlOiAiZm9yY2UtcmVhZC1vbmx5IiwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImFjb25maWcudGVzdC5jcHAiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL2Fjb25maWdfdGVzdC5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFjb25maWdfdGVzdF9jcHBfbGlicmFyeSIsCisgICAgICAgICJsaWJnbW9jayIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAic2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFncyIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiYWNvbmZpZ19saWJfY2Nfc3RhdGljX2xpbmsuZGVmYXVsdHMiLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmNwcC50ZXN0X21vZGUiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL2Fjb25maWdfdGVzdF90ZXN0X3ZhcmlhbnQuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhY29uZmlnX3Rlc3RfY3BwX2xpYnJhcnlfdGVzdF92YXJpYW50IiwKKyAgICAgICAgImxpYmdtb2NrIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJhY29uZmlnX2xpYl9jY19zdGF0aWNfbGluay5kZWZhdWx0cyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKKy8vIFRPRE8oMzI3NDIwNjc5KTogRW5hYmxlIGV4cG9ydCBtb2RlIGZvciBuYXRpdmUgZmxhZyBsaWJyYXJ5CisvKgorY2NfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ190ZXN0X2NwcF9saWJyYXJ5X2V4cG9ydGVkX3ZhcmlhbnQiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKKyAgICBtb2RlOiAiZXhwb3J0ZWQiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmNwcC5leHBvcnRlZF9tb2RlIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9hY29uZmlnX2V4cG9ydGVkX21vZGVfdGVzdC5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFjb25maWdfdGVzdF9jcHBfbGlicmFyeV9leHBvcnRlZF92YXJpYW50IiwKKyAgICAgICAgImxpYmdtb2NrIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJhY29uZmlnX2xpYl9jY19zdGF0aWNfbGluay5kZWZhdWx0cyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmNwcC5mb3JjZV9yZWFkX29ubHlfbW9kZSIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvYWNvbmZpZ19mb3JjZV9yZWFkX29ubHlfbW9kZV90ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYWNvbmZpZ190ZXN0X2NwcF9saWJyYXJ5X2ZvcmNlX3JlYWRfb25seV92YXJpYW50IiwKKyAgICAgICAgImxpYmdtb2NrIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJhY29uZmlnX2xpYl9jY19zdGF0aWNfbGluay5kZWZhdWx0cyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKK3J1c3RfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnkiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKK30KKworcnVzdF90ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy5wcm9kX21vZGUudGVzdC5ydXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9hY29uZmlnX3Byb2RfbW9kZV90ZXN0LnJzIiwKKyAgICBdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5IiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KKworcnVzdF9hY29uZmlnX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5X3dpdGhfdGVzdF9tb2RlIiwKKyAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeSIsCisgICAgYWNvbmZpZ19kZWNsYXJhdGlvbnM6ICJhY29uZmlnLnRlc3QuZmxhZ3MiLAorICAgIG1vZGU6ICJ0ZXN0IiwKK30KKworcnVzdF90ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0X21vZGUudGVzdC5ydXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9hY29uZmlnX3Rlc3RfbW9kZV90ZXN0LnJzIiwKKyAgICBdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5X3dpdGhfdGVzdF9tb2RlIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KKworLy8gVE9ETygzMjc0MjA2NzkpOiBFbmFibGUgZXhwb3J0IG1vZGUgZm9yIG5hdGl2ZSBmbGFnIGxpYnJhcnkKKy8qCitydXN0X2Fjb25maWdfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnlfd2l0aF9leHBvcnRlZF9tb2RlIiwKKyAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeSIsCisgICAgYWNvbmZpZ19kZWNsYXJhdGlvbnM6ICJhY29uZmlnLnRlc3QuZmxhZ3MiLAorICAgIG1vZGU6ICJleHBvcnRlZCIsCit9CisKK3J1c3RfdGVzdCB7CisgICAgbmFtZTogImFjb25maWcuZXhwb3J0ZWRfbW9kZS50ZXN0LnJ1c3QiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL2Fjb25maWdfZXhwb3J0ZWRfbW9kZV90ZXN0LnJzIiwKKyAgICBdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5X3dpdGhfZXhwb3J0ZWRfbW9kZSIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisqLworCitydXN0X2Fjb25maWdfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnlfd2l0aF9mb3JjZV9yZWFkX29ubHlfbW9kZSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnkiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKKyAgICBtb2RlOiAiZm9yY2UtcmVhZC1vbmx5IiwKK30KKworcnVzdF90ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy5mb3JjZV9yZWFkX29ubHlfbW9kZS50ZXN0LnJ1c3QiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL2Fjb25maWdfZm9yY2VfcmVhZF9vbmx5X21vZGVfdGVzdC5ycyIsCisgICAgXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeV93aXRoX2ZvcmNlX3JlYWRfb25seV9tb2RlIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9DYXJnby50b21sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkM2VlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTkgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJhY29uZmlnIgordmVyc2lvbiA9ICIwLjEuMCIKK2VkaXRpb24gPSAiMjAyMSIKKworW2ZlYXR1cmVzXQorZGVmYXVsdCA9IFsiY2FyZ28iXQorY2FyZ28gPSBbXQorCitbZGVwZW5kZW5jaWVzXQorYW55aG93ID0gIjEuMC42OSIKK2NsYXAgPSB7IHZlcnNpb24gPSAiNC4xLjgiLCBmZWF0dXJlcyA9IFsiZGVyaXZlIl0gfQoraXRlcnRvb2xzID0gIjAuMTAuNSIKK3Byb3RvYnVmID0gIjMuMi4wIgorc2VyZGUgPSB7IHZlcnNpb24gPSAiMS4wLjE1MiIsIGZlYXR1cmVzID0gWyJkZXJpdmUiXSB9CitzZXJkZV9qc29uID0gIjEuMC45MyIKK3Rpbnl0ZW1wbGF0ZSA9ICIxLjIuMSIKK2Fjb25maWdfcHJvdG9zID0geyBwYXRoID0gIi4uL2Fjb25maWdfcHJvdG9zIiB9CithY29uZmlnX3N0b3JhZ2VfZmlsZSA9IHsgcGF0aCA9ICIuLi9hY29uZmlnX3N0b3JhZ2VfZmlsZSIgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2NwcC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9jcHAucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0M2IyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9jcHAucnMKQEAgLTAsMCArMSwxMjg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNlIGFueWhvdzo6e2Vuc3VyZSwgUmVzdWx0fTsKK3VzZSBzZXJkZTo6U2VyaWFsaXplOwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpwYXRoOjpQYXRoQnVmOwordXNlIHRpbnl0ZW1wbGF0ZTo6VGlueVRlbXBsYXRlOworCit1c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZSwgUHJvdG9QYXJzZWRGbGFnfTsKKwordXNlIGNyYXRlOjpjb2RlZ2VuOwordXNlIGNyYXRlOjpjb2RlZ2VuOjpDb2RlZ2VuTW9kZTsKK3VzZSBjcmF0ZTo6Y29tbWFuZHM6Ok91dHB1dEZpbGU7CisKK3B1YiBmbiBnZW5lcmF0ZV9jcHBfY29kZTxJPigKKyAgICBwYWNrYWdlOiAmc3RyLAorICAgIHBhcnNlZF9mbGFnc19pdGVyOiBJLAorICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCisgICAgZmxhZ19pZHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LAorICAgIGFsbG93X2luc3RydW1lbnRhdGlvbjogYm9vbCwKKykgLT4gUmVzdWx0PFZlYzxPdXRwdXRGaWxlPj4KK3doZXJlCisgICAgSTogSXRlcmF0b3I8SXRlbSA9IFByb3RvUGFyc2VkRmxhZz4sCit7CisgICAgbGV0IG11dCByZWFkd3JpdGVfY291bnQgPSAwOworICAgIGxldCBjbGFzc19lbGVtZW50czogVmVjPENsYXNzRWxlbWVudD4gPSBwYXJzZWRfZmxhZ3NfaXRlcgorICAgICAgICAubWFwKHxwZnwgY3JlYXRlX2NsYXNzX2VsZW1lbnQocGFja2FnZSwgJnBmLCBmbGFnX2lkcy5jbG9uZSgpLCAmbXV0IHJlYWR3cml0ZV9jb3VudCkpCisgICAgICAgIC5jb2xsZWN0KCk7CisgICAgbGV0IHJlYWR3cml0ZSA9IHJlYWR3cml0ZV9jb3VudCA+IDA7CisgICAgbGV0IGhhc19maXhlZF9yZWFkX29ubHkgPSBjbGFzc19lbGVtZW50cy5pdGVyKCkuYW55KHxpdGVtfCBpdGVtLmlzX2ZpeGVkX3JlYWRfb25seSk7CisgICAgbGV0IGhlYWRlciA9IHBhY2thZ2UucmVwbGFjZSgnLicsICJfIik7CisgICAgbGV0IHBhY2thZ2VfbWFjcm8gPSBoZWFkZXIudG9fdXBwZXJjYXNlKCk7CisgICAgbGV0IGNwcF9uYW1lc3BhY2UgPSBwYWNrYWdlLnJlcGxhY2UoJy4nLCAiOjoiKTsKKyAgICBlbnN1cmUhKGNvZGVnZW46OmlzX3ZhbGlkX25hbWVfaWRlbnQoJmhlYWRlcikpOworICAgIGxldCBjb250ZXh0ID0gQ29udGV4dCB7CisgICAgICAgIGhlYWRlcjogJmhlYWRlciwKKyAgICAgICAgcGFja2FnZV9tYWNybzogJnBhY2thZ2VfbWFjcm8sCisgICAgICAgIGNwcF9uYW1lc3BhY2U6ICZjcHBfbmFtZXNwYWNlLAorICAgICAgICBwYWNrYWdlLAorICAgICAgICBoYXNfZml4ZWRfcmVhZF9vbmx5LAorICAgICAgICByZWFkd3JpdGUsCisgICAgICAgIHJlYWR3cml0ZV9jb3VudCwKKyAgICAgICAgaXNfdGVzdF9tb2RlOiBjb2RlZ2VuX21vZGUgPT0gQ29kZWdlbk1vZGU6OlRlc3QsCisgICAgICAgIGNsYXNzX2VsZW1lbnRzLAorICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb24sCisgICAgfTsKKworICAgIGxldCBmaWxlcyA9IFsKKyAgICAgICAgRmlsZVNwZWMgeworICAgICAgICAgICAgbmFtZTogJmZvcm1hdCEoInt9LmgiLCBoZWFkZXIpLAorICAgICAgICAgICAgdGVtcGxhdGU6IGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL2NwcF9leHBvcnRlZF9oZWFkZXIudGVtcGxhdGUiKSwKKyAgICAgICAgICAgIGRpcjogImluY2x1ZGUiLAorICAgICAgICB9LAorICAgICAgICBGaWxlU3BlYyB7CisgICAgICAgICAgICBuYW1lOiAmZm9ybWF0ISgie30uY2MiLCBoZWFkZXIpLAorICAgICAgICAgICAgdGVtcGxhdGU6IGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL2NwcF9zb3VyY2VfZmlsZS50ZW1wbGF0ZSIpLAorICAgICAgICAgICAgZGlyOiAiIiwKKyAgICAgICAgfSwKKyAgICBdOworICAgIGZpbGVzLml0ZXIoKS5tYXAofGZpbGV8IGdlbmVyYXRlX2ZpbGUoZmlsZSwgJmNvbnRleHQpKS5jb2xsZWN0KCkKK30KKworcHViIGZuIGdlbmVyYXRlX2ZpbGUoZmlsZTogJkZpbGVTcGVjLCBjb250ZXh0OiAmQ29udGV4dCkgLT4gUmVzdWx0PE91dHB1dEZpbGU+IHsKKyAgICBsZXQgbXV0IHRlbXBsYXRlID0gVGlueVRlbXBsYXRlOjpuZXcoKTsKKyAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoZmlsZS5uYW1lLCBmaWxlLnRlbXBsYXRlKT87CisgICAgbGV0IGNvbnRlbnRzID0gdGVtcGxhdGUucmVuZGVyKGZpbGUubmFtZSwgJmNvbnRleHQpPzsKKyAgICBsZXQgcGF0aDogUGF0aEJ1ZiA9IFsmZmlsZS5kaXIsICZmaWxlLm5hbWVdLml0ZXIoKS5jb2xsZWN0KCk7CisgICAgT2soT3V0cHV0RmlsZSB7IGNvbnRlbnRzOiBjb250ZW50cy5pbnRvKCksIHBhdGggfSkKK30KKworI1tkZXJpdmUoU2VyaWFsaXplKV0KK3B1YiBzdHJ1Y3QgRmlsZVNwZWM8J2E+IHsKKyAgICBwdWIgbmFtZTogJidhIHN0ciwKKyAgICBwdWIgdGVtcGxhdGU6ICYnYSBzdHIsCisgICAgcHViIGRpcjogJidhIHN0ciwKK30KKworI1tkZXJpdmUoU2VyaWFsaXplKV0KK3B1YiBzdHJ1Y3QgQ29udGV4dDwnYT4geworICAgIHB1YiBoZWFkZXI6ICYnYSBzdHIsCisgICAgcHViIHBhY2thZ2VfbWFjcm86ICYnYSBzdHIsCisgICAgcHViIGNwcF9uYW1lc3BhY2U6ICYnYSBzdHIsCisgICAgcHViIHBhY2thZ2U6ICYnYSBzdHIsCisgICAgcHViIGhhc19maXhlZF9yZWFkX29ubHk6IGJvb2wsCisgICAgcHViIHJlYWR3cml0ZTogYm9vbCwKKyAgICBwdWIgcmVhZHdyaXRlX2NvdW50OiBpMzIsCisgICAgcHViIGlzX3Rlc3RfbW9kZTogYm9vbCwKKyAgICBwdWIgY2xhc3NfZWxlbWVudHM6IFZlYzxDbGFzc0VsZW1lbnQ+LAorICAgIHB1YiBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCit9CisKKyNbZGVyaXZlKFNlcmlhbGl6ZSldCitwdWIgc3RydWN0IENsYXNzRWxlbWVudCB7CisgICAgcHViIHJlYWR3cml0ZV9pZHg6IGkzMiwKKyAgICBwdWIgcmVhZHdyaXRlOiBib29sLAorICAgIHB1YiBpc19maXhlZF9yZWFkX29ubHk6IGJvb2wsCisgICAgcHViIGRlZmF1bHRfdmFsdWU6IFN0cmluZywKKyAgICBwdWIgZmxhZ19uYW1lOiBTdHJpbmcsCisgICAgcHViIGZsYWdfbWFjcm86IFN0cmluZywKKyAgICBwdWIgZmxhZ19vZmZzZXQ6IHUxNiwKKyAgICBwdWIgZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2U6IFN0cmluZywKKyAgICBwdWIgZGV2aWNlX2NvbmZpZ19mbGFnOiBTdHJpbmcsCisgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAorfQorCitmbiBjcmVhdGVfY2xhc3NfZWxlbWVudCgKKyAgICBwYWNrYWdlOiAmc3RyLAorICAgIHBmOiAmUHJvdG9QYXJzZWRGbGFnLAorICAgIGZsYWdfaWRzOiBIYXNoTWFwPFN0cmluZywgdTE2PiwKKyAgICByd19jb3VudDogJm11dCBpMzIsCispIC0+IENsYXNzRWxlbWVudCB7CisgICAgQ2xhc3NFbGVtZW50IHsKKyAgICAgICAgcmVhZHdyaXRlX2lkeDogaWYgcGYucGVybWlzc2lvbigpID09IFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUgeworICAgICAgICAgICAgbGV0IGluZGV4ID0gKnJ3X2NvdW50OworICAgICAgICAgICAgKnJ3X2NvdW50ICs9IDE7CisgICAgICAgICAgICBpbmRleAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLTEKKyAgICAgICAgfSwKKyAgICAgICAgcmVhZHdyaXRlOiBwZi5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKKyAgICAgICAgaXNfZml4ZWRfcmVhZF9vbmx5OiBwZi5pc19maXhlZF9yZWFkX29ubHkoKSwKKyAgICAgICAgZGVmYXVsdF92YWx1ZTogaWYgcGYuc3RhdGUoKSA9PSBQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCB7CisgICAgICAgICAgICAidHJ1ZSIudG9fc3RyaW5nKCkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICJmYWxzZSIudG9fc3RyaW5nKCkKKyAgICAgICAgfSwKKyAgICAgICAgZmxhZ19uYW1lOiBwZi5uYW1lKCkudG9fc3RyaW5nKCksCisgICAgICAgIGZsYWdfbWFjcm86IHBmLm5hbWUoKS50b191cHBlcmNhc2UoKSwKKyAgICAgICAgZmxhZ19vZmZzZXQ6ICpmbGFnX2lkcy5nZXQocGYubmFtZSgpKS5leHBlY3QoInZhbHVlcyBjaGVja2VkIGF0IGZsYWcgcGFyc2UgdGltZSIpLAorICAgICAgICBkZXZpY2VfY29uZmlnX25hbWVzcGFjZTogcGYubmFtZXNwYWNlKCkudG9fc3RyaW5nKCksCisgICAgICAgIGRldmljZV9jb25maWdfZmxhZzogY29kZWdlbjo6Y3JlYXRlX2RldmljZV9jb25maWdfaWRlbnQocGFja2FnZSwgcGYubmFtZSgpKQorICAgICAgICAgICAgLmV4cGVjdCgidmFsdWVzIGNoZWNrZWQgYXQgZmxhZyBwYXJzZSB0aW1lIiksCisgICAgICAgIGNvbnRhaW5lcjogcGYuY29udGFpbmVyKCkudG9fc3RyaW5nKCksCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhY29uZmlnX3Byb3Rvczo6UHJvdG9QYXJzZWRGbGFnczsKKyAgICB1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKKworICAgIGNvbnN0IEVYUE9SVEVEX1BST0RfSEVBREVSX0VYUEVDVEVEOiAmc3RyID0gciMiCisjcHJhZ21hIG9uY2UKKworI2lmbmRlZiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1QKKyNkZWZpbmUgQ09NX0FORFJPSURfQUNPTkZJR19URVNUKEZMQUcpIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF8jI0ZMQUcKKyNlbmRpZgorCisjaWZuZGVmIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPCisjZGVmaW5lIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPIHRydWUKKyNlbmRpZgorCisjaWZuZGVmIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVECisjZGVmaW5lIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVEIHRydWUKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdCB7CisKK2NsYXNzIGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5mbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ybygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ydygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9yd19leHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm8oKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9yb19leHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3J3KCkgPSAwOworfTsKKworZXh0ZXJuIHN0ZDo6dW5pcXVlX3B0cjxmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZT4gcHJvdmlkZXJfOworCitpbmxpbmUgYm9vbCBkaXNhYmxlZF9ybygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIGRpc2FibGVkX3J3KCkgeworICAgIHJldHVybiBwcm92aWRlcl8tPmRpc2FibGVkX3J3KCk7Cit9CisKK2lubGluZSBib29sIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgeworICAgIHJldHVybiBwcm92aWRlcl8tPmRpc2FibGVkX3J3X2V4cG9ydGVkKCk7Cit9CisKK2lubGluZSBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpIHsKKyAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk87Cit9CisKK2lubGluZSBib29sIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVEOworfQorCitpbmxpbmUgYm9vbCBlbmFibGVkX3JvKCkgeworICAgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgYm9vbCBlbmFibGVkX3JvX2V4cG9ydGVkKCkgeworICAgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgYm9vbCBlbmFibGVkX3J3KCkgeworICAgIHJldHVybiBwcm92aWRlcl8tPmVuYWJsZWRfcncoKTsKK30KKworfQorCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ydygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19leHBvcnRlZCgpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKTsKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm8oKTsKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9yb19leHBvcnRlZCgpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3J3KCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKyIjOworCisgICAgY29uc3QgRVhQT1JURURfVEVTVF9IRUFERVJfRVhQRUNURUQ6ICZzdHIgPSByIyIKKyNwcmFnbWEgb25jZQorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdCB7CisKK2NsYXNzIGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlIHsKK3B1YmxpYzoKKworICAgIHZpcnR1YWwgfmZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3JvKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGRpc2FibGVkX3JvKGJvb2wgdmFsKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcncoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzYWJsZWRfcncoYm9vbCB2YWwpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9yd19leHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9yd19leHBvcnRlZChib29sIHZhbCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoYm9vbCB2YWwpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfZml4ZWRfcm8oYm9vbCB2YWwpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoYm9vbCB2YWwpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfcm8oYm9vbCB2YWwpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvX2V4cG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfcm9fZXhwb3J0ZWQoYm9vbCB2YWwpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3J3KCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfcncoYm9vbCB2YWwpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZXNldF9mbGFncygpIHt9Cit9OworCitleHRlcm4gc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl87CisKK2lubGluZSBib29sIGRpc2FibGVkX3JvKCkgeworICAgIHJldHVybiBwcm92aWRlcl8tPmRpc2FibGVkX3JvKCk7Cit9CisKK2lubGluZSB2b2lkIGRpc2FibGVkX3JvKGJvb2wgdmFsKSB7CisgICAgcHJvdmlkZXJfLT5kaXNhYmxlZF9ybyh2YWwpOworfQorCitpbmxpbmUgYm9vbCBkaXNhYmxlZF9ydygpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5kaXNhYmxlZF9ydygpOworfQorCitpbmxpbmUgdm9pZCBkaXNhYmxlZF9ydyhib29sIHZhbCkgeworICAgIHByb3ZpZGVyXy0+ZGlzYWJsZWRfcncodmFsKTsKK30KKworaW5saW5lIGJvb2wgZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyXy0+ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKTsKK30KKworaW5saW5lIHZvaWQgZGlzYWJsZWRfcndfZXhwb3J0ZWQoYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmRpc2FibGVkX3J3X2V4cG9ydGVkKHZhbCk7Cit9CisKK2lubGluZSBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKTsKK30KKworaW5saW5lIHZvaWQgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKGJvb2wgdmFsKSB7CisgICAgcHJvdmlkZXJfLT5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UodmFsKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5lbmFibGVkX2ZpeGVkX3JvKCk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZWRfZml4ZWRfcm8oYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmVuYWJsZWRfZml4ZWRfcm8odmFsKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQodmFsKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9ybygpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5lbmFibGVkX3JvKCk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZWRfcm8oYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmVuYWJsZWRfcm8odmFsKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9yb19leHBvcnRlZCgpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5lbmFibGVkX3JvX2V4cG9ydGVkKCk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZWRfcm9fZXhwb3J0ZWQoYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmVuYWJsZWRfcm9fZXhwb3J0ZWQodmFsKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9ydygpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5lbmFibGVkX3J3KCk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZWRfcncoYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmVuYWJsZWRfcncodmFsKTsKK30KKworaW5saW5lIHZvaWQgcmVzZXRfZmxhZ3MoKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyXy0+cmVzZXRfZmxhZ3MoKTsKK30KKworfQorCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpOworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcm8oYm9vbCB2YWwpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ydygpOworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcncoYm9vbCB2YWwpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19leHBvcnRlZCgpOworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfZXhwb3J0ZWQoYm9vbCB2YWwpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKTsKKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZShib29sIHZhbCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm8oKTsKKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm8oYm9vbCB2YWwpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7CisKK3ZvaWQgc2V0X2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKGJvb2wgdmFsKTsKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybygpOworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybyhib29sIHZhbCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKTsKKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoYm9vbCB2YWwpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3J3KCk7CisKK3ZvaWQgc2V0X2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3J3KGJvb2wgdmFsKTsKKwordm9pZCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfcmVzZXRfZmxhZ3MoKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworIiM7CisKKyAgICBjb25zdCBFWFBPUlRFRF9FWFBPUlRFRF9IRUFERVJfRVhQRUNURUQ6ICZzdHIgPSByIyIKKyNwcmFnbWEgb25jZQorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdCB7CisKK2NsYXNzIGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5mbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9yd19leHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSA9IDA7Cit9OworCitleHRlcm4gc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl87CisKK2lubGluZSBib29sIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgeworICAgIHJldHVybiBwcm92aWRlcl8tPmRpc2FibGVkX3J3X2V4cG9ydGVkKCk7Cit9CisKK2lubGluZSBib29sIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyXy0+ZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpOworfQorCitpbmxpbmUgYm9vbCBlbmFibGVkX3JvX2V4cG9ydGVkKCkgeworICAgIHJldHVybiBwcm92aWRlcl8tPmVuYWJsZWRfcm9fZXhwb3J0ZWQoKTsKK30KKworfQorCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19leHBvcnRlZCgpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorIiM7CisKKyAgICBjb25zdCBFWFBPUlRFRF9GT1JDRV9SRUFEX09OTFlfSEVBREVSX0VYUEVDVEVEOiAmc3RyID0gciMiCisjcHJhZ21hIG9uY2UKKworI2lmbmRlZiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1QKKyNkZWZpbmUgQ09NX0FORFJPSURfQUNPTkZJR19URVNUKEZMQUcpIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF8jI0ZMQUcKKyNlbmRpZgorCisjaWZuZGVmIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPCisjZGVmaW5lIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPIHRydWUKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdCB7CisKK2NsYXNzIGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5mbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ybygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ydygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcncoKSA9IDA7Cit9OworCitleHRlcm4gc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl87CisKK2lubGluZSBib29sIGRpc2FibGVkX3JvKCkgeworICAgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgZGlzYWJsZWRfcncoKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBlbmFibGVkX2ZpeGVkX3JvKCkgeworICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STzsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9ybygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9ydygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfQorCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ydygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKTsKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcncoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorIiM7CisKKyAgICBjb25zdCBQUk9EX1NPVVJDRV9GSUxFX0VYUEVDVEVEOiAmc3RyID0gciMiCisjaW5jbHVkZSAiY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0LmgiCisjaW5jbHVkZSA8c2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFncy9nZXRfZmxhZ3MuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3QgeworCisgICAgY2xhc3MgZmxhZ19wcm92aWRlciA6IHB1YmxpYyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSB7CisgICAgICAgIHB1YmxpYzoKKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3JvKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIGlmIChjYWNoZV9bMF0gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVfWzBdID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIGlmIChjYWNoZV9bMV0gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVfWzFdID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1sxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVfWzJdID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlX1syXSA9IHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVfWzJdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvX2V4cG9ydGVkKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9ydygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVfWzNdID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlX1szXSA9IHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVfWzNdOworICAgICAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50OF90PiBjYWNoZV8gPSBzdGQ6OnZlY3RvcjxpbnQ4X3Q+KDQsIC0xKTsKKyAgICB9OworCisgICAgc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl8gPQorICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGZsYWdfcHJvdmlkZXI+KCk7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3JvKCkgeworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcncoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcncoKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgeworICAgIHJldHVybiBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3Q6OmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKCkgeworICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STzsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIHsKKyAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQ7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm8oKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcncoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9ydygpOworfQorCisiIzsKKworICAgIGNvbnN0IFRFU1RfU09VUkNFX0ZJTEVfRVhQRUNURUQ6ICZzdHIgPSByIyIKKyNpbmNsdWRlICJjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3QuaCIKKyNpbmNsdWRlIDxzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzL2dldF9mbGFncy5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0IHsKKworICAgIGNsYXNzIGZsYWdfcHJvdmlkZXIgOiBwdWJsaWMgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgeworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBib29sPiBvdmVycmlkZXNfOworCisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGZsYWdfcHJvdmlkZXIoKQorICAgICAgICAgICAgICAgIDogb3ZlcnJpZGVzXygpCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZGlzYWJsZWRfcm8iKTsKKyAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBvdmVycmlkZXNfLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9ybyhib29sIHZhbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlc19bImRpc2FibGVkX3JvIl0gPSB2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ydygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gb3ZlcnJpZGVzXy5maW5kKCJkaXNhYmxlZF9ydyIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKKyAgICAgICAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZGlzYWJsZWRfcncoYm9vbCB2YWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZXNfWyJkaXNhYmxlZF9ydyJdID0gdmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZGlzYWJsZWRfcndfZXhwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBvdmVycmlkZXNfLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIGRpc2FibGVkX3J3X2V4cG9ydGVkKGJvb2wgdmFsKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgb3ZlcnJpZGVzX1siZGlzYWJsZWRfcndfZXhwb3J0ZWQiXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gb3ZlcnJpZGVzXy5maW5kKCJkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiKTsKKyAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBvdmVycmlkZXNfLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLm90aGVyX25hbWVzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoYm9vbCB2YWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZXNfWyJkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfZml4ZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZW5hYmxlZF9maXhlZF9ybyIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9maXhlZF9ybyhib29sIHZhbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlc19bImVuYWJsZWRfZml4ZWRfcm8iXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZChib29sIHZhbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlc19bImVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZW5hYmxlZF9ybyIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9ybyhib29sIHZhbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlc19bImVuYWJsZWRfcm8iXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZW5hYmxlZF9yb19leHBvcnRlZCIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9yb19leHBvcnRlZChib29sIHZhbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlc19bImVuYWJsZWRfcm9fZXhwb3J0ZWQiXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcncoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZW5hYmxlZF9ydyIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAorICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfcncoYm9vbCB2YWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZXNfWyJlbmFibGVkX3J3Il0gPSB2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZXNldF9mbGFncygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZXNfLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgfTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZT4gcHJvdmlkZXJfID0KKyAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxmbGFnX3Byb3ZpZGVyPigpOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpIHsKKyAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjpkaXNhYmxlZF9ybygpOworfQorCisKK3ZvaWQgc2V0X2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybyhib29sIHZhbCkgeworICAgIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcm8odmFsKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcncoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcncoKTsKK30KKworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcncoYm9vbCB2YWwpIHsKKyAgICBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3Q6OmRpc2FibGVkX3J3KHZhbCk7Cit9CisKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKTsKK30KKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2V4cG9ydGVkKGJvb2wgdmFsKSB7CisgICAgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjpkaXNhYmxlZF9yd19leHBvcnRlZCh2YWwpOworfQorCisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIHsKKyAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjpkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKTsKK30KKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZShib29sIHZhbCkgeworICAgIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKHZhbCk7Cit9CisKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9ybygpIHsKKyAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX2ZpeGVkX3JvKCk7Cit9CisKK3ZvaWQgc2V0X2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKGJvb2wgdmFsKSB7CisgICAgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX2ZpeGVkX3JvKHZhbCk7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpOworfQorCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZChib29sIHZhbCkgeworICAgIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCh2YWwpOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvKCkgeworICAgIHJldHVybiBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3Q6OmVuYWJsZWRfcm8oKTsKK30KKworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybyhib29sIHZhbCkgeworICAgIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9ybyh2YWwpOworfQorCisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9yb19leHBvcnRlZCgpOworfQorCisKK3ZvaWQgc2V0X2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvX2V4cG9ydGVkKGJvb2wgdmFsKSB7CisgICAgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX3JvX2V4cG9ydGVkKHZhbCk7Cit9CisKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ydygpIHsKKyAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX3J3KCk7Cit9CisKKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcncoYm9vbCB2YWwpIHsKKyAgICBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3Q6OmVuYWJsZWRfcncodmFsKTsKK30KKwordm9pZCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfcmVzZXRfZmxhZ3MoKSB7CisgICAgIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6cmVzZXRfZmxhZ3MoKTsKK30KKworIiM7CisKKyAgICBjb25zdCBFWFBPUlRFRF9TT1VSQ0VfRklMRV9FWFBFQ1RFRDogJnN0ciA9IHIjIgorI2luY2x1ZGUgImNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdC5oIgorI2luY2x1ZGUgPHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3MvZ2V0X2ZsYWdzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0IHsKKworICAgIGNsYXNzIGZsYWdfcHJvdmlkZXIgOiBwdWJsaWMgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlX1swXSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZV9bMF0gPSBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVfWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVfWzFdID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlX1sxXSA9IHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1sxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlX1syXSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZV9bMl0gPSBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZV9bMl07CisgICAgICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ4X3Q+IGNhY2hlXyA9IHN0ZDo6dmVjdG9yPGludDhfdD4oMywgLTEpOworICAgIH07CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2U+IHByb3ZpZGVyXyA9CisgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8ZmxhZ19wcm92aWRlcj4oKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIHsKKyAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9yb19leHBvcnRlZCgpOworfQorCisKKyIjOworCisgICAgY29uc3QgRk9SQ0VfUkVBRF9PTkxZX1NPVVJDRV9GSUxFX0VYUEVDVEVEOiAmc3RyID0gciMiCisjaW5jbHVkZSAiY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0LmgiCisKK25hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3QgeworCisgICAgY2xhc3MgZmxhZ19wcm92aWRlciA6IHB1YmxpYyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSB7CisgICAgICAgIHB1YmxpYzoKKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3JvKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3J3KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2U+IHByb3ZpZGVyXyA9CisgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8ZmxhZ19wcm92aWRlcj4oKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcm8oKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ydygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm8oKSB7CisgICAgcmV0dXJuIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvKCkgeworICAgIHJldHVybiB0cnVlOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3J3KCkgeworICAgIHJldHVybiB0cnVlOworfQorCisiIzsKKworICAgIGNvbnN0IFJFQURfT05MWV9FWFBPUlRFRF9QUk9EX0hFQURFUl9FWFBFQ1RFRDogJnN0ciA9IHIjIgorI3ByYWdtYSBvbmNlCisKKyNpZm5kZWYgQ09NX0FORFJPSURfQUNPTkZJR19URVNUCisjZGVmaW5lIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVChGTEFHKSBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfIyNGTEFHCisjZW5kaWYKKworI2lmbmRlZiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRElTQUJMRURfRklYRURfUk8KKyNkZWZpbmUgQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0RJU0FCTEVEX0ZJWEVEX1JPIGZhbHNlCisjZW5kaWYKKworI2lmbmRlZiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STworI2RlZmluZSBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STyB0cnVlCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3QgeworCitjbGFzcyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfZml4ZWRfcm8oKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcm8oKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvKCkgPSAwOworfTsKKworZXh0ZXJuIHN0ZDo6dW5pcXVlX3B0cjxmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZT4gcHJvdmlkZXJfOworCitpbmxpbmUgYm9vbCBkaXNhYmxlZF9maXhlZF9ybygpIHsKKyAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0RJU0FCTEVEX0ZJWEVEX1JPOworfQorCitpbmxpbmUgYm9vbCBkaXNhYmxlZF9ybygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIGVuYWJsZWRfZml4ZWRfcm8oKSB7CisgICAgcmV0dXJuIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPOworfQorCitpbmxpbmUgYm9vbCBlbmFibGVkX3JvKCkgeworICAgIHJldHVybiB0cnVlOworfQorfQorCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9maXhlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm8oKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorIiM7CisKKyAgICBjb25zdCBSRUFEX09OTFlfUFJPRF9TT1VSQ0VfRklMRV9FWFBFQ1RFRDogJnN0ciA9IHIjIgorI2luY2x1ZGUgImNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdC5oIgorCituYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0IHsKKworICAgIGNsYXNzIGZsYWdfcHJvdmlkZXIgOiBwdWJsaWMgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgeworICAgICAgICBwdWJsaWM6CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9maXhlZF9ybygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0RJU0FCTEVEX0ZJWEVEX1JPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2U+IHByb3ZpZGVyXyA9CisgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8ZmxhZ19wcm92aWRlcj4oKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfZml4ZWRfcm8oKSB7CisgICAgcmV0dXJuIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9ESVNBQkxFRF9GSVhFRF9STzsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcm8oKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKCkgeworICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STzsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKyIjOworICAgIHVzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKKworICAgIGZuIHRlc3RfZ2VuZXJhdGVfY3BwX2NvZGUoCisgICAgICAgIHBhcnNlZF9mbGFnczogUHJvdG9QYXJzZWRGbGFncywKKyAgICAgICAgbW9kZTogQ29kZWdlbk1vZGUsCisgICAgICAgIGV4cGVjdGVkX2hlYWRlcjogJnN0ciwKKyAgICAgICAgZXhwZWN0ZWRfc3JjOiAmc3RyLAorICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCisgICAgKSB7CisgICAgICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjptb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBtb2RlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0KKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGdlbmVyYXRlZCA9IGdlbmVyYXRlX2NwcF9jb2RlKAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKKyAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgICAgIGFsbG93X2luc3RydW1lbnRhdGlvbiwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgZ2VuZXJhdGVkX2ZpbGVzX21hcCA9IEhhc2hNYXA6Om5ldygpOworICAgICAgICBmb3IgZmlsZSBpbiBnZW5lcmF0ZWQgeworICAgICAgICAgICAgZ2VuZXJhdGVkX2ZpbGVzX21hcC5pbnNlcnQoCisgICAgICAgICAgICAgICAgU3RyaW5nOjpmcm9tKGZpbGUucGF0aC50b19zdHIoKS51bndyYXAoKSksCisgICAgICAgICAgICAgICAgU3RyaW5nOjpmcm9tX3V0ZjgoZmlsZS5jb250ZW50cykudW53cmFwKCksCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCB0YXJnZXRfZmlsZV9wYXRoID0gU3RyaW5nOjpmcm9tKCJpbmNsdWRlL2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdC5oIik7CisgICAgICAgIGFzc2VydCEoZ2VuZXJhdGVkX2ZpbGVzX21hcC5jb250YWluc19rZXkoJnRhcmdldF9maWxlX3BhdGgpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6Zmlyc3Rfc2lnbmlmaWNhbnRfY29kZV9kaWZmKAorICAgICAgICAgICAgICAgIGV4cGVjdGVkX2hlYWRlciwKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRfZmlsZXNfbWFwLmdldCgmdGFyZ2V0X2ZpbGVfcGF0aCkudW53cmFwKCkKKyAgICAgICAgICAgICkKKyAgICAgICAgKTsKKworICAgICAgICB0YXJnZXRfZmlsZV9wYXRoID0gU3RyaW5nOjpmcm9tKCJjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3QuY2MiKTsKKyAgICAgICAgYXNzZXJ0IShnZW5lcmF0ZWRfZmlsZXNfbWFwLmNvbnRhaW5zX2tleSgmdGFyZ2V0X2ZpbGVfcGF0aCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc3JjLAorICAgICAgICAgICAgICAgIGdlbmVyYXRlZF9maWxlc19tYXAuZ2V0KCZ0YXJnZXRfZmlsZV9wYXRoKS51bndyYXAoKQorICAgICAgICAgICAgKQorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlX2Zvcl9wcm9kKCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9jcHBfY29kZSgKKyAgICAgICAgICAgIHBhcnNlZF9mbGFncywKKyAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uLAorICAgICAgICAgICAgRVhQT1JURURfUFJPRF9IRUFERVJfRVhQRUNURUQsCisgICAgICAgICAgICBQUk9EX1NPVVJDRV9GSUxFX0VYUEVDVEVELAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZ2VuZXJhdGVfY3BwX2NvZGVfZm9yX3Rlc3QoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlKAorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLAorICAgICAgICAgICAgQ29kZWdlbk1vZGU6OlRlc3QsCisgICAgICAgICAgICBFWFBPUlRFRF9URVNUX0hFQURFUl9FWFBFQ1RFRCwKKyAgICAgICAgICAgIFRFU1RfU09VUkNFX0ZJTEVfRVhQRUNURUQsCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9jcHBfY29kZV9mb3JfZXhwb3J0ZWQoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlKAorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLAorICAgICAgICAgICAgQ29kZWdlbk1vZGU6OkV4cG9ydGVkLAorICAgICAgICAgICAgRVhQT1JURURfRVhQT1JURURfSEVBREVSX0VYUEVDVEVELAorICAgICAgICAgICAgRVhQT1JURURfU09VUkNFX0ZJTEVfRVhQRUNURUQsCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9jcHBfY29kZV9mb3JfZm9yY2VfcmVhZF9vbmx5KCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9jcHBfY29kZSgKKyAgICAgICAgICAgIHBhcnNlZF9mbGFncywKKyAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5LAorICAgICAgICAgICAgRVhQT1JURURfRk9SQ0VfUkVBRF9PTkxZX0hFQURFUl9FWFBFQ1RFRCwKKyAgICAgICAgICAgIEZPUkNFX1JFQURfT05MWV9TT1VSQ0VfRklMRV9FWFBFQ1RFRCwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlX2Zvcl9yZWFkX29ubHlfcHJvZCgpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV9yZWFkX29ubHlfdGVzdF9mbGFncygpOworICAgICAgICB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlKAorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLAorICAgICAgICAgICAgQ29kZWdlbk1vZGU6OlByb2R1Y3Rpb24sCisgICAgICAgICAgICBSRUFEX09OTFlfRVhQT1JURURfUFJPRF9IRUFERVJfRVhQRUNURUQsCisgICAgICAgICAgICBSRUFEX09OTFlfUFJPRF9TT1VSQ0VfRklMRV9FWFBFQ1RFRCwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9qYXZhLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2phdmEucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyMmViYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9qYXZhLnJzCkBAIC0wLDAgKzEsMTMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzZSBhbnlob3c6OlJlc3VsdDsKK3VzZSBzZXJkZTo6U2VyaWFsaXplOwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OwordXNlIHN0ZDo6cGF0aDo6UGF0aEJ1ZjsKK3VzZSB0aW55dGVtcGxhdGU6OlRpbnlUZW1wbGF0ZTsKKwordXNlIGNyYXRlOjpjb2RlZ2VuOwordXNlIGNyYXRlOjpjb2RlZ2VuOjpDb2RlZ2VuTW9kZTsKK3VzZSBjcmF0ZTo6Y29tbWFuZHM6Ok91dHB1dEZpbGU7Cit1c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZSwgUHJvdG9QYXJzZWRGbGFnfTsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOworCitwdWIgZm4gZ2VuZXJhdGVfamF2YV9jb2RlPEk+KAorICAgIHBhY2thZ2U6ICZzdHIsCisgICAgcGFyc2VkX2ZsYWdzX2l0ZXI6IEksCisgICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKKyAgICBmbGFnX2lkczogSGFzaE1hcDxTdHJpbmcsIHUxNj4sCisgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorKSAtPiBSZXN1bHQ8VmVjPE91dHB1dEZpbGU+Pgord2hlcmUKKyAgICBJOiBJdGVyYXRvcjxJdGVtID0gUHJvdG9QYXJzZWRGbGFnPiwKK3sKKyAgICBsZXQgZmxhZ19lbGVtZW50czogVmVjPEZsYWdFbGVtZW50PiA9CisgICAgICAgIHBhcnNlZF9mbGFnc19pdGVyLm1hcCh8cGZ8IGNyZWF0ZV9mbGFnX2VsZW1lbnQocGFja2FnZSwgJnBmLCBmbGFnX2lkcy5jbG9uZSgpKSkuY29sbGVjdCgpOworICAgIGxldCBuYW1lc3BhY2VfZmxhZ3MgPSBnZW5fZmxhZ3NfYnlfbmFtZXNwYWNlKCZmbGFnX2VsZW1lbnRzKTsKKyAgICBsZXQgcHJvcGVydGllc19zZXQ6IEJUcmVlU2V0PFN0cmluZz4gPQorICAgICAgICBmbGFnX2VsZW1lbnRzLml0ZXIoKS5tYXAofGZlfCBmb3JtYXRfcHJvcGVydHlfbmFtZSgmZmUuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2UpKS5jb2xsZWN0KCk7CisgICAgbGV0IGlzX3Rlc3RfbW9kZSA9IGNvZGVnZW5fbW9kZSA9PSBDb2RlZ2VuTW9kZTo6VGVzdDsKKyAgICBsZXQgbGlicmFyeV9leHBvcnRlZCA9IGNvZGVnZW5fbW9kZSA9PSBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQ7CisgICAgbGV0IHJ1bnRpbWVfbG9va3VwX3JlcXVpcmVkID0KKyAgICAgICAgZmxhZ19lbGVtZW50cy5pdGVyKCkuYW55KHxlbGVtfCBlbGVtLmlzX3JlYWRfd3JpdGUpIHx8IGxpYnJhcnlfZXhwb3J0ZWQ7CisgICAgbGV0IGNvbnRhaW5lciA9IChmbGFnX2VsZW1lbnRzLmZpcnN0KCkuZXhwZWN0KCJ6ZXJvIHRlbXBsYXRlIGZsYWdzIikuY29udGFpbmVyKS50b19zdHJpbmcoKTsKKworICAgIGxldCBjb250ZXh0ID0gQ29udGV4dCB7CisgICAgICAgIGZsYWdfZWxlbWVudHMsCisgICAgICAgIG5hbWVzcGFjZV9mbGFncywKKyAgICAgICAgaXNfdGVzdF9tb2RlLAorICAgICAgICBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCwKKyAgICAgICAgcHJvcGVydGllc19zZXQsCisgICAgICAgIHBhY2thZ2VfbmFtZTogcGFja2FnZS50b19zdHJpbmcoKSwKKyAgICAgICAgbGlicmFyeV9leHBvcnRlZCwKKyAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgICAgICBjb250YWluZXIsCisgICAgfTsKKyAgICBsZXQgbXV0IHRlbXBsYXRlID0gVGlueVRlbXBsYXRlOjpuZXcoKTsKKyAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoIkZsYWdzLmphdmEiLCBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9GbGFncy5qYXZhLnRlbXBsYXRlIikpPzsKKyAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoCisgICAgICAgICJGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUiKSwKKyAgICApPzsKKyAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoCisgICAgICAgICJGZWF0dXJlRmxhZ3MuamF2YSIsCisgICAgICAgIGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL0ZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlIiksCisgICAgKT87CisgICAgdGVtcGxhdGUuYWRkX3RlbXBsYXRlKAorICAgICAgICAiQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEiLAorICAgICAgICBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9DdXN0b21GZWF0dXJlRmxhZ3MuamF2YS50ZW1wbGF0ZSIpLAorICAgICk/OworICAgIHRlbXBsYXRlLmFkZF90ZW1wbGF0ZSgKKyAgICAgICAgIkZha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9GYWtlRmVhdHVyZUZsYWdzSW1wbC5qYXZhLnRlbXBsYXRlIiksCisgICAgKT87CisKKyAgICBsZXQgcGF0aDogUGF0aEJ1ZiA9IHBhY2thZ2Uuc3BsaXQoJy4nKS5jb2xsZWN0KCk7CisgICAgWworICAgICAgICAiRmxhZ3MuamF2YSIsCisgICAgICAgICJGZWF0dXJlRmxhZ3MuamF2YSIsCisgICAgICAgICJGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICAiQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEiLAorICAgICAgICAiRmFrZUZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCisgICAgXQorICAgIC5pdGVyKCkKKyAgICAubWFwKHxmaWxlfCB7CisgICAgICAgIE9rKE91dHB1dEZpbGUgeyBjb250ZW50czogdGVtcGxhdGUucmVuZGVyKGZpbGUsICZjb250ZXh0KT8uaW50bygpLCBwYXRoOiBwYXRoLmpvaW4oZmlsZSkgfSkKKyAgICB9KQorICAgIC5jb2xsZWN0Ojo8UmVzdWx0PFZlYzxPdXRwdXRGaWxlPj4+KCkKK30KKworZm4gZ2VuX2ZsYWdzX2J5X25hbWVzcGFjZShmbGFnczogJltGbGFnRWxlbWVudF0pIC0+IFZlYzxOYW1lc3BhY2VGbGFncz4geworICAgIGxldCBtdXQgbmFtZXNwYWNlX3RvX2ZsYWc6IEJUcmVlTWFwPFN0cmluZywgVmVjPEZsYWdFbGVtZW50Pj4gPSBCVHJlZU1hcDo6bmV3KCk7CisKKyAgICBmb3IgZmxhZyBpbiBmbGFncyB7CisgICAgICAgIG1hdGNoIG5hbWVzcGFjZV90b19mbGFnLmdldF9tdXQoJmZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2UpIHsKKyAgICAgICAgICAgIFNvbWUoZmxhZ19saXN0KSA9PiBmbGFnX2xpc3QucHVzaChmbGFnLmNsb25lKCkpLAorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlX3RvX2ZsYWcuaW5zZXJ0KGZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2UuY2xvbmUoKSwgdmVjIVtmbGFnLmNsb25lKCldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG5hbWVzcGFjZV90b19mbGFnCisgICAgICAgIC5pdGVyKCkKKyAgICAgICAgLm1hcCh8KG5hbWVzcGFjZSwgZmxhZ3MpfCBOYW1lc3BhY2VGbGFncyB7CisgICAgICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZS50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIGZsYWdzOiBmbGFncy5jbG9uZSgpLAorICAgICAgICB9KQorICAgICAgICAuY29sbGVjdCgpCit9CisKKyNbZGVyaXZlKFNlcmlhbGl6ZSldCitzdHJ1Y3QgQ29udGV4dCB7CisgICAgcHViIGZsYWdfZWxlbWVudHM6IFZlYzxGbGFnRWxlbWVudD4sCisgICAgcHViIG5hbWVzcGFjZV9mbGFnczogVmVjPE5hbWVzcGFjZUZsYWdzPiwKKyAgICBwdWIgaXNfdGVzdF9tb2RlOiBib29sLAorICAgIHB1YiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZDogYm9vbCwKKyAgICBwdWIgcHJvcGVydGllc19zZXQ6IEJUcmVlU2V0PFN0cmluZz4sCisgICAgcHViIHBhY2thZ2VfbmFtZTogU3RyaW5nLAorICAgIHB1YiBsaWJyYXJ5X2V4cG9ydGVkOiBib29sLAorICAgIHB1YiBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCisgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAorfQorCisjW2Rlcml2ZShTZXJpYWxpemUsIERlYnVnKV0KK3N0cnVjdCBOYW1lc3BhY2VGbGFncyB7CisgICAgcHViIG5hbWVzcGFjZTogU3RyaW5nLAorICAgIHB1YiBmbGFnczogVmVjPEZsYWdFbGVtZW50PiwKK30KKworI1tkZXJpdmUoU2VyaWFsaXplLCBDbG9uZSwgRGVidWcpXQorc3RydWN0IEZsYWdFbGVtZW50IHsKKyAgICBwdWIgY29udGFpbmVyOiBTdHJpbmcsCisgICAgcHViIGRlZmF1bHRfdmFsdWU6IGJvb2wsCisgICAgcHViIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBTdHJpbmcsCisgICAgcHViIGRldmljZV9jb25maWdfZmxhZzogU3RyaW5nLAorICAgIHB1YiBmbGFnX25hbWVfY29uc3RhbnRfc3VmZml4OiBTdHJpbmcsCisgICAgcHViIGZsYWdfb2Zmc2V0OiB1MTYsCisgICAgcHViIGlzX3JlYWRfd3JpdGU6IGJvb2wsCisgICAgcHViIG1ldGhvZF9uYW1lOiBTdHJpbmcsCisgICAgcHViIHByb3BlcnRpZXM6IFN0cmluZywKK30KKworZm4gY3JlYXRlX2ZsYWdfZWxlbWVudCgKKyAgICBwYWNrYWdlOiAmc3RyLAorICAgIHBmOiAmUHJvdG9QYXJzZWRGbGFnLAorICAgIGZsYWdfb2Zmc2V0czogSGFzaE1hcDxTdHJpbmcsIHUxNj4sCispIC0+IEZsYWdFbGVtZW50IHsKKyAgICBsZXQgZGV2aWNlX2NvbmZpZ19mbGFnID0gY29kZWdlbjo6Y3JlYXRlX2RldmljZV9jb25maWdfaWRlbnQocGFja2FnZSwgcGYubmFtZSgpKQorICAgICAgICAuZXhwZWN0KCJ2YWx1ZXMgY2hlY2tlZCBhdCBmbGFnIHBhcnNlIHRpbWUiKTsKKyAgICBGbGFnRWxlbWVudCB7CisgICAgICAgIGNvbnRhaW5lcjogcGYuY29udGFpbmVyKCkudG9fc3RyaW5nKCksCisgICAgICAgIGRlZmF1bHRfdmFsdWU6IHBmLnN0YXRlKCkgPT0gUHJvdG9GbGFnU3RhdGU6OkVOQUJMRUQsCisgICAgICAgIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBwZi5uYW1lc3BhY2UoKS50b19zdHJpbmcoKSwKKyAgICAgICAgZGV2aWNlX2NvbmZpZ19mbGFnLAorICAgICAgICBmbGFnX25hbWVfY29uc3RhbnRfc3VmZml4OiBwZi5uYW1lKCkudG9fYXNjaWlfdXBwZXJjYXNlKCksCisgICAgICAgIGZsYWdfb2Zmc2V0OiAqZmxhZ19vZmZzZXRzLmdldChwZi5uYW1lKCkpLmV4cGVjdCgiZGlkbnQgZmluZCBwYWNrYWdlIG9mZnNldCA6KCIpLAorICAgICAgICBpc19yZWFkX3dyaXRlOiBwZi5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKKyAgICAgICAgbWV0aG9kX25hbWU6IGZvcm1hdF9qYXZhX21ldGhvZF9uYW1lKHBmLm5hbWUoKSksCisgICAgICAgIHByb3BlcnRpZXM6IGZvcm1hdF9wcm9wZXJ0eV9uYW1lKHBmLm5hbWVzcGFjZSgpKSwKKyAgICB9Cit9CisKK2ZuIGZvcm1hdF9qYXZhX21ldGhvZF9uYW1lKGZsYWdfbmFtZTogJnN0cikgLT4gU3RyaW5nIHsKKyAgICBsZXQgc3BsaXRzOiBWZWM8JnN0cj4gPSBmbGFnX25hbWUuc3BsaXQoJ18nKS5maWx0ZXIofCZ3b3JkfCAhd29yZC5pc19lbXB0eSgpKS5jb2xsZWN0KCk7CisgICAgaWYgc3BsaXRzLmxlbigpID09IDEgeworICAgICAgICBsZXQgbmFtZSA9IHNwbGl0c1swXTsKKyAgICAgICAgbmFtZVswLi4xXS50b19hc2NpaV9sb3dlcmNhc2UoKSArICZuYW1lWzEuLl0KKyAgICB9IGVsc2UgeworICAgICAgICBzcGxpdHMKKyAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgIC5lbnVtZXJhdGUoKQorICAgICAgICAgICAgLm1hcCh8KGluZGV4LCB3b3JkKXwgeworICAgICAgICAgICAgICAgIGlmIGluZGV4ID09IDAgeworICAgICAgICAgICAgICAgICAgICB3b3JkLnRvX2FzY2lpX2xvd2VyY2FzZSgpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd29yZFswLi4xXS50b19hc2NpaV91cHBlcmNhc2UoKSArICZ3b3JkWzEuLl0udG9fYXNjaWlfbG93ZXJjYXNlKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmNvbGxlY3Q6OjxWZWM8U3RyaW5nPj4oKQorICAgICAgICAgICAgLmpvaW4oIiIpCisgICAgfQorfQorCitmbiBmb3JtYXRfcHJvcGVydHlfbmFtZShwcm9wZXJ0eV9uYW1lOiAmc3RyKSAtPiBTdHJpbmcgeworICAgIGxldCBuYW1lID0gZm9ybWF0X2phdmFfbWV0aG9kX25hbWUocHJvcGVydHlfbmFtZSk7CisgICAgZm9ybWF0ISgibVByb3BlcnRpZXN7fXt9IiwgJm5hbWVbMC4uMV0udG9fYXNjaWlfdXBwZXJjYXNlKCksICZuYW1lWzEuLl0pCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjpjb21tYW5kczo6YXNzaWduX2ZsYWdfaWRzOworICAgIHVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOworCisgICAgY29uc3QgRVhQRUNURURfRkVBVFVSRUZMQUdTX0NPTU1PTl9DT05URU5UOiAmc3RyID0gciMiCisgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisgICAgLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCisgICAgaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVGbGFncyB7CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZUZhbHNlRm9yUjgKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBib29sZWFuIGRpc2FibGVkUm8oKTsKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBib29sZWFuIGRpc2FibGVkUncoKTsKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpOworICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIGJvb2xlYW4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UoKTsKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpOworICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVUcnVlRm9yUjgKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkUm8oKTsKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpOworICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIGJvb2xlYW4gZW5hYmxlZFJ3KCk7CisgICAgfQorICAgICIjOworCisgICAgY29uc3QgRVhQRUNURURfRkxBR19DT01NT05fQ09OVEVOVDogJnN0ciA9IHIjIgorICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgIC8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgorICAgIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIGZpbmFsIGNsYXNzIEZsYWdzIHsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUk8gPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3JvIjsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUlcgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IjsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUldfRVhQT1JURUQgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIjsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUldfSU5fT1RIRVJfTkFNRVNQQUNFID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiOworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX0ZJWEVEX1JPID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvIjsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRCA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCI7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0VOQUJMRURfUk8gPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm8iOworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU5BQkxFRF9SVyA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydyI7CisKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lRmFsc2VGb3JSOAorICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJvKCkgeworICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSbygpOworICAgICAgICB9CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUncoKSB7CisgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5kaXNhYmxlZFJ3KCk7CisgICAgICAgIH0KKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5kaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpOworICAgICAgICB9CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZVRydWVGb3JSOAorICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpIHsKKyAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmVuYWJsZWRGaXhlZFJvKCk7CisgICAgICAgIH0KKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5lbmFibGVkRml4ZWRSb0V4cG9ydGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZWRSbygpIHsKKyAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmVuYWJsZWRSbygpOworICAgICAgICB9CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZVRydWVGb3JSOAorICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmVuYWJsZWRSb0V4cG9ydGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJ3KCkgeworICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZW5hYmxlZFJ3KCk7CisgICAgICAgIH0KKyAgICAiIzsKKworICAgIGNvbnN0IEVYUEVDVEVEX0NVU1RPTUZFQVRVUkVGTEFHU19DT05URU5UOiAmc3RyID0gciMiCisgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisKKyAgICAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KKyAgICBpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworICAgIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworICAgIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKyAgICBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisgICAgaW1wb3J0IGphdmEudXRpbC5TZXQ7CisgICAgaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaVByZWRpY2F0ZTsKKyAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBjbGFzcyBDdXN0b21GZWF0dXJlRmxhZ3MgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgeworCisgICAgICAgIHByaXZhdGUgQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gbUdldFZhbHVlSW1wbDsKKworICAgICAgICBwdWJsaWMgQ3VzdG9tRmVhdHVyZUZsYWdzKEJpUHJlZGljYXRlPFN0cmluZywgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4+IGdldFZhbHVlSW1wbCkgeworICAgICAgICAgICAgbUdldFZhbHVlSW1wbCA9IGdldFZhbHVlSW1wbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJvKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRElTQUJMRURfUk8sCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZGlzYWJsZWRSbyk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUncoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19ESVNBQkxFRF9SVywKKyAgICAgICAgICAgICAgICBGZWF0dXJlRmxhZ3M6OmRpc2FibGVkUncpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICBGZWF0dXJlRmxhZ3M6OmRpc2FibGVkUndFeHBvcnRlZCk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRElTQUJMRURfUldfSU5fT1RIRVJfTkFNRVNQQUNFLAorICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk8sCisgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkRml4ZWRSbyk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVELAorICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSbygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUk8sCisgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkUm8pOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkUm9FeHBvcnRlZCk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSdygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUlcsCisgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkUncpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGbGFnUmVhZE9ubHlPcHRpbWl6ZWQoU3RyaW5nIGZsYWdOYW1lKSB7CisgICAgICAgICAgICBpZiAobVJlYWRPbmx5RmxhZ3NTZXQuY29udGFpbnMoZmxhZ05hbWUpICYmCisgICAgICAgICAgICAgICAgaXNPcHRpbWl6YXRpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVUcnVlRm9yUjgKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzT3B0aW1pemF0aW9uRW5hYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZhbHVlKFN0cmluZyBmbGFnTmFtZSwgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4gZ2V0dGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbUdldFZhbHVlSW1wbC50ZXN0KGZsYWdOYW1lLCBnZXR0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRGbGFnTmFtZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JPLAorICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRElTQUJMRURfUlcsCisgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0lOX09USEVSX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk8sCisgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVELAorICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9STywKKyAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX1JXCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtUmVhZE9ubHlGbGFnc1NldCA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRElTQUJMRURfUk8sCisgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPLAorICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfUk8sCisgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVELAorICAgICAgICAgICAgICAgICIiCisgICAgICAgICAgICApCisgICAgICAgICk7CisgICAgfQorICAgICIjOworCisgICAgY29uc3QgRVhQRUNURURfRkFLRUZFQVRVUkVGTEFHU0lNUExfQ09OVEVOVDogJnN0ciA9IHIjIgorICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworCisgICAgaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworICAgIGltcG9ydCBqYXZhLnV0aWwuTWFwOworICAgIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIGNsYXNzIEZha2VGZWF0dXJlRmxhZ3NJbXBsIGV4dGVuZHMgQ3VzdG9tRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBCb29sZWFuPiBtRmxhZ01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGZWF0dXJlRmxhZ3MgbURlZmF1bHRzOworCisgICAgICAgIHB1YmxpYyBGYWtlRmVhdHVyZUZsYWdzSW1wbCgpIHsKKyAgICAgICAgICAgIHRoaXMobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmFrZUZlYXR1cmVGbGFnc0ltcGwoRmVhdHVyZUZsYWdzIGRlZmF1bHRzKSB7CisgICAgICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgICAgIG1EZWZhdWx0cyA9IGRlZmF1bHRzOworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbWFwIHdpdGggbnVsbCB2YWx1ZXMKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGZsYWdOYW1lIDogZ2V0RmxhZ05hbWVzKCkpIHsKKyAgICAgICAgICAgICAgICBtRmxhZ01hcC5wdXQoZmxhZ05hbWUsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZhbHVlKFN0cmluZyBmbGFnTmFtZSwgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4gZ2V0dGVyKSB7CisgICAgICAgICAgICBCb29sZWFuIHZhbHVlID0gdGhpcy5tRmxhZ01hcC5nZXQoZmxhZ05hbWUpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURlZmF1bHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyLnRlc3QobURlZmF1bHRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZmxhZ05hbWUgKyAiIGlzIG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZsYWcoU3RyaW5nIGZsYWdOYW1lLCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMubUZsYWdNYXAuY29udGFpbnNLZXkoZmxhZ05hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gc3VjaCBmbGFnICIgKyBmbGFnTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLm1GbGFnTWFwLnB1dChmbGFnTmFtZSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXRBbGwoKSB7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeSBlbnRyeSA6IG1GbGFnTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAiIzsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX2phdmFfY29kZV9wcm9kdWN0aW9uKCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IG1vZGUgPSBDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbjsKKyAgICAgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9CisgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ19pZHMgPQorICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0gZ2VuZXJhdGVfamF2YV9jb2RlKAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKKyAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdF9mbGFnc19jb250ZW50ID0gRVhQRUNURURfRkxBR19DT01NT05fQ09OVEVOVC50b19zdHJpbmcoKQorICAgICAgICAgICAgKyByIyIKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTID0gbmV3IEZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgfSIjOworCisgICAgICAgIGxldCBleHBlY3RfZmVhdHVyZWZsYWdzaW1wbF9jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgICAgICAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KKyAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnOworICAgICAgICBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuUHJvcGVydGllczsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBvdGhlcl9uYW1lc3BhY2VfaXNfY2FjaGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUncgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWRSdyA9IHRydWU7CisKKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygiYWNvbmZpZ190ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUncgPQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRElTQUJMRURfUlcsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0V4cG9ydGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVELCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSdyA9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19FTkFCTEVEX1JXLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIHZhbHVlIGZyb20gbmFtZXNwYWNlIGFjb25maWdfdGVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJmcm9tIERldmljZUNvbmZpZy4gSXQgY291bGQgYmUgdGhhdCB0aGUgY29kZSB1c2luZyBmbGFnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImV4ZWN1dGVkIGJlZm9yZSBTZXR0aW5nc1Byb3ZpZGVyIGluaXRpYWxpemF0aW9uLiBQbGVhc2UgdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImZpeGVkIHJlYWQtb25seSBmbGFnIGJ5IGFkZGluZyBpc19maXhlZF9yZWFkX29ubHk6IHRydWUgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY29uZmlnX3Rlc3RfaXNfY2FjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX290aGVyX25hbWVzcGFjZSgpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygib3RoZXJfbmFtZXNwYWNlIik7CisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0lOX09USEVSX05BTUVTUEFDRSwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdmFsdWUgZnJvbSBuYW1lc3BhY2Ugb3RoZXJfbmFtZXNwYWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImZyb20gRGV2aWNlQ29uZmlnLiBJdCBjb3VsZCBiZSB0aGF0IHRoZSBjb2RlIHVzaW5nIGZsYWcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXhlY3V0ZWQgYmVmb3JlIFNldHRpbmdzUHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uIFBsZWFzZSB1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZml4ZWQgcmVhZC1vbmx5IGZsYWcgYnkgYWRkaW5nIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJmbGFnIGRlY2xhcmF0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG90aGVyX25hbWVzcGFjZV9pc19jYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJvKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUncoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhY29uZmlnX3Rlc3RfaXNfY2FjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWRSdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFjb25maWdfdGVzdF9pc19jYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZF9vdmVycmlkZXNfYWNvbmZpZ190ZXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZFJ3RXhwb3J0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW90aGVyX25hbWVzcGFjZV9pc19jYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZF9vdmVycmlkZXNfb3RoZXJfbmFtZXNwYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSbygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJ3KCkgeworICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWRSdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IG11dCBmaWxlX3NldCA9IEhhc2hNYXA6OmZyb20oWworICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmxhZ3MuamF2YSIsIGV4cGVjdF9mbGFnc19jb250ZW50LmFzX3N0cigpKSwKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFnc0ltcGwuamF2YSIsIGV4cGVjdF9mZWF0dXJlZmxhZ3NpbXBsX2NvbnRlbnQpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzLmphdmEiLCBFWFBFQ1RFRF9GRUFUVVJFRkxBR1NfQ09NTU9OX0NPTlRFTlQpLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEiLAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0NVU1RPTUZFQVRVUkVGTEFHU19DT05URU5ULAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0Zha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0ZBS0VGRUFUVVJFRkxBR1NJTVBMX0NPTlRFTlQsCisgICAgICAgICAgICApLAorICAgICAgICBdKTsKKworICAgICAgICBmb3IgZmlsZSBpbiBnZW5lcmF0ZWRfZmlsZXMgeworICAgICAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGUucGF0aC50b19zdHIoKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydCEoZmlsZV9zZXQuY29udGFpbnNfa2V5KGZpbGVfcGF0aCksICJDYW5ub3QgZmluZCB7fSIsIGZpbGVfcGF0aCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OmZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9zZXQuZ2V0KGZpbGVfcGF0aCkudW53cmFwKCksCisgICAgICAgICAgICAgICAgICAgICZTdHJpbmc6OmZyb21fdXRmOChmaWxlLmNvbnRlbnRzKS51bndyYXAoKQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgIkZpbGUge30gY29udGVudCBpcyBub3QgY29ycmVjdCIsCisgICAgICAgICAgICAgICAgZmlsZV9wYXRoCisgICAgICAgICAgICApOworICAgICAgICAgICAgZmlsZV9zZXQucmVtb3ZlKGZpbGVfcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmlzX2VtcHR5KCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX2phdmFfY29kZV9leHBvcnRlZCgpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBtb2RlID0gQ29kZWdlbk1vZGU6OkV4cG9ydGVkOworICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9CisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMoY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAorICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAorICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworCisgICAgICAgIGxldCBleHBlY3RfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGbGFncyB7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUldfRVhQT1JURUQgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5lbmFibGVkRml4ZWRSb0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZW5hYmxlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTID0gbmV3IEZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfaW1wbF9jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgICAgICBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWc7CisgICAgICAgIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkRldmljZUNvbmZpZy5Qcm9wZXJ0aWVzOworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgeworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhY29uZmlnX3Rlc3RfaXNfY2FjaGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkID0gZmFsc2U7CisKKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygiYWNvbmZpZ190ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUndFeHBvcnRlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBlbmFibGVkRml4ZWRSb0V4cG9ydGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFJvRXhwb3J0ZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRU5BQkxFRF9ST19FWFBPUlRFRCwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdmFsdWUgZnJvbSBuYW1lc3BhY2UgYWNvbmZpZ190ZXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImZyb20gRGV2aWNlQ29uZmlnLiBJdCBjb3VsZCBiZSB0aGF0IHRoZSBjb2RlIHVzaW5nIGZsYWcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXhlY3V0ZWQgYmVmb3JlIFNldHRpbmdzUHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uIFBsZWFzZSB1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZml4ZWQgcmVhZC1vbmx5IGZsYWcgYnkgYWRkaW5nIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJmbGFnIGRlY2xhcmF0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFjb25maWdfdGVzdF9pc19jYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhY29uZmlnX3Rlc3RfaXNfY2FjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWRSd0V4cG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWRSb0V4cG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICB9IiM7CisKKyAgICAgICAgbGV0IGV4cGVjdF9jdXN0b21fZmVhdHVyZV9mbGFnc19jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworCisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKyAgICAgICAgaW1wb3J0IGphdmEudXRpbC5TZXQ7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgY2xhc3MgQ3VzdG9tRmVhdHVyZUZsYWdzIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIHsKKworICAgICAgICAgICAgcHJpdmF0ZSBCaVByZWRpY2F0ZTxTdHJpbmcsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+PiBtR2V0VmFsdWVJbXBsOworCisgICAgICAgICAgICBwdWJsaWMgQ3VzdG9tRmVhdHVyZUZsYWdzKEJpUHJlZGljYXRlPFN0cmluZywgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4+IGdldFZhbHVlSW1wbCkgeworICAgICAgICAgICAgICAgIG1HZXRWYWx1ZUltcGwgPSBnZXRWYWx1ZUltcGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVELAorICAgICAgICAgICAgICAgICAgICBGZWF0dXJlRmxhZ3M6OmRpc2FibGVkUndFeHBvcnRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkRml4ZWRSb0V4cG9ydGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRU5BQkxFRF9ST19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkUm9FeHBvcnRlZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZhbHVlKFN0cmluZyBmbGFnTmFtZSwgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4gZ2V0dGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1HZXRWYWx1ZUltcGwudGVzdChmbGFnTmFtZSwgZ2V0dGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRGbGFnTmFtZXMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRElTQUJMRURfUldfRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVECisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtUmVhZE9ubHlGbGFnc1NldCA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgIiIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgIiM7CisKKyAgICAgICAgbGV0IG11dCBmaWxlX3NldCA9IEhhc2hNYXA6OmZyb20oWworICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmxhZ3MuamF2YSIsIGV4cGVjdF9mbGFnc19jb250ZW50KSwKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFncy5qYXZhIiwgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfY29udGVudCksCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GZWF0dXJlRmxhZ3NJbXBsLmphdmEiLCBleHBlY3RfZmVhdHVyZV9mbGFnc19pbXBsX2NvbnRlbnQpLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEiLAorICAgICAgICAgICAgICAgIGV4cGVjdF9jdXN0b21fZmVhdHVyZV9mbGFnc19jb250ZW50LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0Zha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0ZBS0VGRUFUVVJFRkxBR1NJTVBMX0NPTlRFTlQsCisgICAgICAgICAgICApLAorICAgICAgICBdKTsKKworICAgICAgICBmb3IgZmlsZSBpbiBnZW5lcmF0ZWRfZmlsZXMgeworICAgICAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGUucGF0aC50b19zdHIoKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydCEoZmlsZV9zZXQuY29udGFpbnNfa2V5KGZpbGVfcGF0aCksICJDYW5ub3QgZmluZCB7fSIsIGZpbGVfcGF0aCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OmZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9zZXQuZ2V0KGZpbGVfcGF0aCkudW53cmFwKCksCisgICAgICAgICAgICAgICAgICAgICZTdHJpbmc6OmZyb21fdXRmOChmaWxlLmNvbnRlbnRzKS51bndyYXAoKQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgIkZpbGUge30gY29udGVudCBpcyBub3QgY29ycmVjdCIsCisgICAgICAgICAgICAgICAgZmlsZV9wYXRoCisgICAgICAgICAgICApOworICAgICAgICAgICAgZmlsZV9zZXQucmVtb3ZlKGZpbGVfcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmlzX2VtcHR5KCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX2phdmFfY29kZV90ZXN0KCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IG1vZGUgPSBDb2RlZ2VuTW9kZTo6VGVzdDsKKyAgICAgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9CisgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ19pZHMgPQorICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0gZ2VuZXJhdGVfamF2YV9jb2RlKAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKKyAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKworICAgICAgICBsZXQgZXhwZWN0X2ZsYWdzX2NvbnRlbnQgPSBFWFBFQ1RFRF9GTEFHX0NPTU1PTl9DT05URU5ULnRvX3N0cmluZygpCisgICAgICAgICAgICArIHIjIgorICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZlYXR1cmVGbGFncyhGZWF0dXJlRmxhZ3MgZmVhdHVyZUZsYWdzKSB7CisgICAgICAgICAgICAgICAgRmxhZ3MuRkVBVFVSRV9GTEFHUyA9IGZlYXR1cmVGbGFnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bnNldEZlYXR1cmVGbGFncygpIHsKKyAgICAgICAgICAgICAgICBGbGFncy5GRUFUVVJFX0ZMQUdTID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTOworICAgICAgICB9CisgICAgICAgICIjOworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVmbGFnc2ltcGxfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSbygpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3KCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSbygpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUncoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgbXV0IGZpbGVfc2V0ID0gSGFzaE1hcDo6ZnJvbShbCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GbGFncy5qYXZhIiwgZXhwZWN0X2ZsYWdzX2NvbnRlbnQuYXNfc3RyKCkpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzLmphdmEiLCBFWFBFQ1RFRF9GRUFUVVJFRkxBR1NfQ09NTU9OX0NPTlRFTlQpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwgZXhwZWN0X2ZlYXR1cmVmbGFnc2ltcGxfY29udGVudCksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9DdXN0b21GZWF0dXJlRmxhZ3MuamF2YSIsCisgICAgICAgICAgICAgICAgRVhQRUNURURfQ1VTVE9NRkVBVFVSRUZMQUdTX0NPTlRFTlQsCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmFrZUZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRkFLRUZFQVRVUkVGTEFHU0lNUExfQ09OVEVOVCwKKyAgICAgICAgICAgICksCisgICAgICAgIF0pOworCisgICAgICAgIGZvciBmaWxlIGluIGdlbmVyYXRlZF9maWxlcyB7CisgICAgICAgICAgICBsZXQgZmlsZV9wYXRoID0gZmlsZS5wYXRoLnRvX3N0cigpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0IShmaWxlX3NldC5jb250YWluc19rZXkoZmlsZV9wYXRoKSwgIkNhbm5vdCBmaW5kIHt9IiwgZmlsZV9wYXRoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6Zmlyc3Rfc2lnbmlmaWNhbnRfY29kZV9kaWZmKAorICAgICAgICAgICAgICAgICAgICBmaWxlX3NldC5nZXQoZmlsZV9wYXRoKS51bndyYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgJlN0cmluZzo6ZnJvbV91dGY4KGZpbGUuY29udGVudHMpLnVud3JhcCgpCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAiRmlsZSB7fSBjb250ZW50IGlzIG5vdCBjb3JyZWN0IiwKKyAgICAgICAgICAgICAgICBmaWxlX3BhdGgKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBmaWxlX3NldC5yZW1vdmUoZmlsZV9wYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCEoZmlsZV9zZXQuaXNfZW1wdHkoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZ2VuZXJhdGVfamF2YV9jb2RlX2ZvcmNlX3JlYWRfb25seSgpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBtb2RlID0gQ29kZWdlbk1vZGU6OkZvcmNlUmVhZE9ubHk7CisgICAgICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjptb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBtb2RlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0KKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGdlbmVyYXRlZF9maWxlcyA9IGdlbmVyYXRlX2phdmFfY29kZSgKKyAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsCisgICAgICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RfZmVhdHVyZWZsYWdzX2NvbnRlbnQgPSByIyIKKyAgICAgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisgICAgICAgIC8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgorICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIGludGVyZmFjZSBGZWF0dXJlRmxhZ3MgeworICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lRmFsc2VGb3JSOAorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWRSbygpOworICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lRmFsc2VGb3JSOAorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWRSdygpOworICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lRmFsc2VGb3JSOAorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UoKTsKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZVRydWVGb3JSOAorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm8oKTsKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZVRydWVGb3JSOAorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZFJvKCk7CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVUcnVlRm9yUjgKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWRSdygpOworICAgICAgICB9IiM7CisKKyAgICAgICAgbGV0IGV4cGVjdF9mZWF0dXJlZmxhZ3NpbXBsX2NvbnRlbnQgPSByIyIKKyAgICAgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisgICAgICAgIC8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgorICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSbygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJ3KCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICIjOworCisgICAgICAgIGxldCBleHBlY3RfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCisgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRmxhZ3MgeworICAgICAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0RJU0FCTEVEX1JPID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ybyI7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUlcgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19ESVNBQkxFRF9SV19JTl9PVEhFUl9OQU1FU1BBQ0UgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSI7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU5BQkxFRF9GSVhFRF9STyA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9ybyI7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU5BQkxFRF9STyA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ybyI7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU5BQkxFRF9SVyA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydyI7CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVGYWxzZUZvclI4CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUm8oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSbygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lRmFsc2VGb3JSOAorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmRpc2FibGVkUncoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZUZhbHNlRm9yUjgKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZVRydWVGb3JSOAorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5lbmFibGVkRml4ZWRSbygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZWRSbygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5lbmFibGVkUm8oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZVRydWVGb3JSOAorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmFibGVkUncoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZW5hYmxlZFJ3KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBGZWF0dXJlRmxhZ3MgRkVBVFVSRV9GTEFHUyA9IG5ldyBGZWF0dXJlRmxhZ3NJbXBsKCk7CisgICAgICAgIH0iIzsKKworICAgICAgICBsZXQgZXhwZWN0X2N1c3RvbWZlYXR1cmVmbGFnc19jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworCisgICAgICAgIC8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgorICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKyAgICAgICAgaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuU2V0OworICAgICAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOworICAgICAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIGNsYXNzIEN1c3RvbUZlYXR1cmVGbGFncyBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CisKKyAgICAgICAgICAgIHByaXZhdGUgQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gbUdldFZhbHVlSW1wbDsKKworICAgICAgICAgICAgcHVibGljIEN1c3RvbUZlYXR1cmVGbGFncyhCaVByZWRpY2F0ZTxTdHJpbmcsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+PiBnZXRWYWx1ZUltcGwpIHsKKyAgICAgICAgICAgICAgICBtR2V0VmFsdWVJbXBsID0gZ2V0VmFsdWVJbXBsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJvKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0RJU0FCTEVEX1JPLAorICAgICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjpkaXNhYmxlZFJvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUncoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRElTQUJMRURfUlcsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZGlzYWJsZWRSdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19JTl9PVEhFUl9OQU1FU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm8oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRU5BQkxFRF9GSVhFRF9STywKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkRml4ZWRSbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUm8oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRU5BQkxFRF9STywKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkUm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJ3KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUlcsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZFJ3KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGbGFnUmVhZE9ubHlPcHRpbWl6ZWQoU3RyaW5nIGZsYWdOYW1lKSB7CisgICAgICAgICAgICAgICAgaWYgKG1SZWFkT25seUZsYWdzU2V0LmNvbnRhaW5zKGZsYWdOYW1lKSAmJgorICAgICAgICAgICAgICAgICAgICBpc09wdGltaXphdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNPcHRpbWl6YXRpb25FbmFibGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0VmFsdWUoU3RyaW5nIGZsYWdOYW1lLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPiBnZXR0ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUdldFZhbHVlSW1wbC50ZXN0KGZsYWdOYW1lLCBnZXR0ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEZsYWdOYW1lcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19ESVNBQkxFRF9STywKKyAgICAgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19ESVNBQkxFRF9SVywKKyAgICAgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19JTl9PVEhFUl9OQU1FU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9GSVhFRF9STywKKyAgICAgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX1JPLAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfUlcKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1SZWFkT25seUZsYWdzU2V0ID0gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JPLAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JXLAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0lOX09USEVSX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPLAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfUk8sCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9SVywKKyAgICAgICAgICAgICAgICAgICAgIiIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgICIjOworCisgICAgICAgIGxldCBtdXQgZmlsZV9zZXQgPSBIYXNoTWFwOjpmcm9tKFsKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZsYWdzLmphdmEiLCBleHBlY3RfZmxhZ3NfY29udGVudCksCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GZWF0dXJlRmxhZ3NJbXBsLmphdmEiLCBleHBlY3RfZmVhdHVyZWZsYWdzaW1wbF9jb250ZW50KSwKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFncy5qYXZhIiwgZXhwZWN0X2ZlYXR1cmVmbGFnc19jb250ZW50KSwKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhIiwgZXhwZWN0X2N1c3RvbWZlYXR1cmVmbGFnc19jb250ZW50KSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0Zha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0ZBS0VGRUFUVVJFRkxBR1NJTVBMX0NPTlRFTlQsCisgICAgICAgICAgICApLAorICAgICAgICBdKTsKKworICAgICAgICBmb3IgZmlsZSBpbiBnZW5lcmF0ZWRfZmlsZXMgeworICAgICAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGUucGF0aC50b19zdHIoKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydCEoZmlsZV9zZXQuY29udGFpbnNfa2V5KGZpbGVfcGF0aCksICJDYW5ub3QgZmluZCB7fSIsIGZpbGVfcGF0aCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OmZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9zZXQuZ2V0KGZpbGVfcGF0aCkudW53cmFwKCksCisgICAgICAgICAgICAgICAgICAgICZTdHJpbmc6OmZyb21fdXRmOChmaWxlLmNvbnRlbnRzKS51bndyYXAoKQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgIkZpbGUge30gY29udGVudCBpcyBub3QgY29ycmVjdCIsCisgICAgICAgICAgICAgICAgZmlsZV9wYXRoCisgICAgICAgICAgICApOworICAgICAgICAgICAgZmlsZV9zZXQucmVtb3ZlKGZpbGVfcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmlzX2VtcHR5KCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2Zvcm1hdF9qYXZhX21ldGhvZF9uYW1lKCkgeworICAgICAgICBsZXQgZXhwZWN0ZWQgPSAic29tZVNuYWtlTmFtZSI7CisgICAgICAgIGxldCBpbnB1dCA9ICJfX19fc29tZV9zbmFrZV9fX25hbWVfX19fIjsKKyAgICAgICAgbGV0IGZvcm1hdHRlZF9uYW1lID0gZm9ybWF0X2phdmFfbWV0aG9kX25hbWUoaW5wdXQpOworICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkLCBmb3JtYXR0ZWRfbmFtZSk7CisKKyAgICAgICAgbGV0IGlucHV0ID0gInNvbWVTbmFrZU5hbWUiOworICAgICAgICBsZXQgZm9ybWF0dGVkX25hbWUgPSBmb3JtYXRfamF2YV9tZXRob2RfbmFtZShpbnB1dCk7CisgICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWQsIGZvcm1hdHRlZF9uYW1lKTsKKworICAgICAgICBsZXQgaW5wdXQgPSAiU29tZVNuYWtlTmFtZSI7CisgICAgICAgIGxldCBmb3JtYXR0ZWRfbmFtZSA9IGZvcm1hdF9qYXZhX21ldGhvZF9uYW1lKGlucHV0KTsKKyAgICAgICAgYXNzZXJ0X2VxIShleHBlY3RlZCwgZm9ybWF0dGVkX25hbWUpOworCisgICAgICAgIGxldCBpbnB1dCA9ICJTb21lU25ha2VOYW1lXyI7CisgICAgICAgIGxldCBmb3JtYXR0ZWRfbmFtZSA9IGZvcm1hdF9qYXZhX21ldGhvZF9uYW1lKGlucHV0KTsKKyAgICAgICAgYXNzZXJ0X2VxIShleHBlY3RlZCwgZm9ybWF0dGVkX25hbWUpOworCisgICAgICAgIGxldCBpbnB1dCA9ICJfU29tZVNuYWtlTmFtZSI7CisgICAgICAgIGxldCBmb3JtYXR0ZWRfbmFtZSA9IGZvcm1hdF9qYXZhX21ldGhvZF9uYW1lKGlucHV0KTsKKyAgICAgICAgYXNzZXJ0X2VxIShleHBlY3RlZCwgZm9ybWF0dGVkX25hbWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2Zvcm1hdF9wcm9wZXJ0eV9uYW1lKCkgeworICAgICAgICBsZXQgZXhwZWN0ZWQgPSAibVByb3BlcnRpZXNTb21lU25ha2VOYW1lIjsKKyAgICAgICAgbGV0IGlucHV0ID0gIl9fX19zb21lX3NuYWtlX19fbmFtZV9fX18iOworICAgICAgICBsZXQgZm9ybWF0dGVkX25hbWUgPSBmb3JtYXRfcHJvcGVydHlfbmFtZShpbnB1dCk7CisgICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWQsIGZvcm1hdHRlZF9uYW1lKTsKKworICAgICAgICBsZXQgaW5wdXQgPSAic29tZVNuYWtlTmFtZSI7CisgICAgICAgIGxldCBmb3JtYXR0ZWRfbmFtZSA9IGZvcm1hdF9wcm9wZXJ0eV9uYW1lKGlucHV0KTsKKyAgICAgICAgYXNzZXJ0X2VxIShleHBlY3RlZCwgZm9ybWF0dGVkX25hbWUpOworCisgICAgICAgIGxldCBpbnB1dCA9ICJTb21lU25ha2VOYW1lIjsKKyAgICAgICAgbGV0IGZvcm1hdHRlZF9uYW1lID0gZm9ybWF0X3Byb3BlcnR5X25hbWUoaW5wdXQpOworICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkLCBmb3JtYXR0ZWRfbmFtZSk7CisKKyAgICAgICAgbGV0IGlucHV0ID0gIlNvbWVTbmFrZU5hbWVfIjsKKyAgICAgICAgbGV0IGZvcm1hdHRlZF9uYW1lID0gZm9ybWF0X3Byb3BlcnR5X25hbWUoaW5wdXQpOworICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkLCBmb3JtYXR0ZWRfbmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL21vZC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhM2IzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9tb2QucnMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWIgbW9kIGNwcDsKK3B1YiBtb2QgamF2YTsKK3B1YiBtb2QgcnVzdDsKKwordXNlIGFjb25maWdfcHJvdG9zOjp7aXNfdmFsaWRfbmFtZV9pZGVudCwgaXNfdmFsaWRfcGFja2FnZV9pZGVudH07Cit1c2UgYW55aG93Ojp7ZW5zdXJlLCBSZXN1bHR9OwordXNlIGNsYXA6OlZhbHVlRW51bTsKKworcHViIGZuIGNyZWF0ZV9kZXZpY2VfY29uZmlnX2lkZW50KHBhY2thZ2U6ICZzdHIsIGZsYWdfbmFtZTogJnN0cikgLT4gUmVzdWx0PFN0cmluZz4geworICAgIGVuc3VyZSEoaXNfdmFsaWRfcGFja2FnZV9pZGVudChwYWNrYWdlKSwgImJhZCBwYWNrYWdlIik7CisgICAgZW5zdXJlIShpc192YWxpZF9uYW1lX2lkZW50KGZsYWdfbmFtZSksICJiYWQgZmxhZyBuYW1lIik7CisgICAgT2soZm9ybWF0ISgie30ue30iLCBwYWNrYWdlLCBmbGFnX25hbWUpKQorfQorCisjW2Rlcml2ZShDb3B5LCBDbG9uZSwgRGVidWcsIFBhcnRpYWxFcSwgRXEsIFZhbHVlRW51bSldCitwdWIgZW51bSBDb2RlZ2VuTW9kZSB7CisgICAgRXhwb3J0ZWQsCisgICAgRm9yY2VSZWFkT25seSwKKyAgICBQcm9kdWN0aW9uLAorICAgIFRlc3QsCit9CisKK2ltcGwgc3RkOjpmbXQ6OkRpc3BsYXkgZm9yIENvZGVnZW5Nb2RlIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoIHNlbGYgeworICAgICAgICAgICAgQ29kZWdlbk1vZGU6OkV4cG9ydGVkID0+IHdyaXRlIShmLCAiZXhwb3J0ZWQiKSwKKyAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5ID0+IHdyaXRlIShmLCAiZm9yY2UtcmVhZC1vbmx5IiksCisgICAgICAgICAgICBDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbiA9PiB3cml0ZSEoZiwgInByb2R1Y3Rpb24iKSwKKyAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpUZXN0ID0+IHdyaXRlIShmLCAidGVzdCIpLAorICAgICAgICB9CisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhY29uZmlnX3Byb3Rvczo6aXNfdmFsaWRfY29udGFpbmVyX2lkZW50OworCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfaXNfdmFsaWRfbmFtZV9pZGVudCgpIHsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9uYW1lX2lkZW50KCJmb28iKSk7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfbmFtZV9pZGVudCgiZm9vX2Jhcl8xMjMiKSk7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfbmFtZV9pZGVudCgiZm9vXyIpKTsKKworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9uYW1lX2lkZW50KCIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX25hbWVfaWRlbnQoIjEyM19mb28iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX25hbWVfaWRlbnQoImZvby1iYXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX25hbWVfaWRlbnQoImZvby1iXHV7MDBlNX1yIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9uYW1lX2lkZW50KCJmb29fX2JhciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfbmFtZV9pZGVudCgiX2ZvbyIpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9pc192YWxpZF9wYWNrYWdlX2lkZW50KCkgeworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby5iYXIiKSk7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLmJhcl9iYXoiKSk7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLmJhci5hMTIzIikpOworCisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvb19iYXJfMTIzIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby5fYmFyIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoIjEyM19mb28iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby1iYXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby1iXHV7MDBlNX1yIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uYmFyLjEyMyIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiLmZvby5iYXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby5iYXIuIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCIuIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCIuLiIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLi5iYXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby5fX2JhciIpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9pc192YWxpZF9jb250YWluZXJfaWRlbnQoKSB7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28uYmFyIikpOworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLmJhcl9iYXoiKSk7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28uYmFyLmExMjMiKSk7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28iKSk7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb29fYmFyXzEyMyIpKTsKKworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoIiIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28uX2JhciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJfZm9vIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoIjEyM19mb28iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLWJhciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28tYlx1ezAwZTV9ciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28uYmFyLjEyMyIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCIuZm9vLmJhciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28uYmFyLiIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCIuIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoIi4uIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby4uYmFyIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5fX2JhciIpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9jcmVhdGVfZGV2aWNlX2NvbmZpZ19pZGVudCgpIHsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICJjb20uZm9vLmJhci5zb21lX2ZsYWciLAorICAgICAgICAgICAgY3JlYXRlX2RldmljZV9jb25maWdfaWRlbnQoImNvbS5mb28uYmFyIiwgInNvbWVfZmxhZyIpLnVud3JhcCgpCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL3J1c3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vcnVzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ4OGIwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL3J1c3QucnMKQEAgLTAsMCArMSwxMzUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNlIGFueWhvdzo6UmVzdWx0OwordXNlIHNlcmRlOjpTZXJpYWxpemU7Cit1c2UgdGlueXRlbXBsYXRlOjpUaW55VGVtcGxhdGU7CisKK3VzZSBhY29uZmlnX3Byb3Rvczo6e1Byb3RvRmxhZ1Blcm1pc3Npb24sIFByb3RvRmxhZ1N0YXRlLCBQcm90b1BhcnNlZEZsYWd9OworCit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKKwordXNlIGNyYXRlOjpjb2RlZ2VuOwordXNlIGNyYXRlOjpjb2RlZ2VuOjpDb2RlZ2VuTW9kZTsKK3VzZSBjcmF0ZTo6Y29tbWFuZHM6Ok91dHB1dEZpbGU7CisKK3B1YiBmbiBnZW5lcmF0ZV9ydXN0X2NvZGU8ST4oCisgICAgcGFja2FnZTogJnN0ciwKKyAgICBmbGFnX2lkczogSGFzaE1hcDxTdHJpbmcsIHUxNj4sCisgICAgcGFyc2VkX2ZsYWdzX2l0ZXI6IEksCisgICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKKyAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCispIC0+IFJlc3VsdDxPdXRwdXRGaWxlPgord2hlcmUKKyAgICBJOiBJdGVyYXRvcjxJdGVtID0gUHJvdG9QYXJzZWRGbGFnPiwKK3sKKyAgICBsZXQgdGVtcGxhdGVfZmxhZ3M6IFZlYzxUZW1wbGF0ZVBhcnNlZEZsYWc+ID0gcGFyc2VkX2ZsYWdzX2l0ZXIKKyAgICAgICAgLm1hcCh8cGZ8IFRlbXBsYXRlUGFyc2VkRmxhZzo6bmV3KHBhY2thZ2UsIGZsYWdfaWRzLmNsb25lKCksICZwZikpCisgICAgICAgIC5jb2xsZWN0KCk7CisgICAgbGV0IGhhc19yZWFkd3JpdGUgPSB0ZW1wbGF0ZV9mbGFncy5pdGVyKCkuYW55KHxpdGVtfCBpdGVtLnJlYWR3cml0ZSk7CisgICAgbGV0IGNvbnRhaW5lciA9ICh0ZW1wbGF0ZV9mbGFncy5maXJzdCgpLmV4cGVjdCgiemVybyB0ZW1wbGF0ZSBmbGFncyIpLmNvbnRhaW5lcikudG9fc3RyaW5nKCk7CisgICAgbGV0IGNvbnRleHQgPSBUZW1wbGF0ZUNvbnRleHQgeworICAgICAgICBwYWNrYWdlOiBwYWNrYWdlLnRvX3N0cmluZygpLAorICAgICAgICB0ZW1wbGF0ZV9mbGFncywKKyAgICAgICAgbW9kdWxlczogcGFja2FnZS5zcGxpdCgnLicpLm1hcCh8c3wgcy50b19zdHJpbmcoKSkuY29sbGVjdDo6PFZlYzxfPj4oKSwKKyAgICAgICAgaGFzX3JlYWR3cml0ZSwKKyAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgICAgICBjb250YWluZXIsCisgICAgfTsKKyAgICBsZXQgbXV0IHRlbXBsYXRlID0gVGlueVRlbXBsYXRlOjpuZXcoKTsKKyAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoCisgICAgICAgICJydXN0X2NvZGVfZ2VuIiwKKyAgICAgICAgbWF0Y2ggY29kZWdlbl9tb2RlIHsKKyAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpUZXN0ID0+IGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL3J1c3RfdGVzdC50ZW1wbGF0ZSIpLAorICAgICAgICAgICAgQ29kZWdlbk1vZGU6OkV4cG9ydGVkIHwgQ29kZWdlbk1vZGU6OkZvcmNlUmVhZE9ubHkgfCBDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbiA9PiB7CisgICAgICAgICAgICAgICAgaW5jbHVkZV9zdHIhKCIuLi8uLi90ZW1wbGF0ZXMvcnVzdC50ZW1wbGF0ZSIpCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgKT87CisgICAgbGV0IGNvbnRlbnRzID0gdGVtcGxhdGUucmVuZGVyKCJydXN0X2NvZGVfZ2VuIiwgJmNvbnRleHQpPzsKKyAgICBsZXQgcGF0aCA9IFsic3JjIiwgImxpYi5ycyJdLml0ZXIoKS5jb2xsZWN0KCk7CisgICAgT2soT3V0cHV0RmlsZSB7IGNvbnRlbnRzOiBjb250ZW50cy5pbnRvKCksIHBhdGggfSkKK30KKworI1tkZXJpdmUoU2VyaWFsaXplKV0KK3N0cnVjdCBUZW1wbGF0ZUNvbnRleHQgeworICAgIHB1YiBwYWNrYWdlOiBTdHJpbmcsCisgICAgcHViIHRlbXBsYXRlX2ZsYWdzOiBWZWM8VGVtcGxhdGVQYXJzZWRGbGFnPiwKKyAgICBwdWIgbW9kdWxlczogVmVjPFN0cmluZz4sCisgICAgcHViIGhhc19yZWFkd3JpdGU6IGJvb2wsCisgICAgcHViIGFsbG93X2luc3RydW1lbnRhdGlvbjogYm9vbCwKKyAgICBwdWIgY29udGFpbmVyOiBTdHJpbmcsCit9CisKKyNbZGVyaXZlKFNlcmlhbGl6ZSldCitzdHJ1Y3QgVGVtcGxhdGVQYXJzZWRGbGFnIHsKKyAgICBwdWIgcmVhZHdyaXRlOiBib29sLAorICAgIHB1YiBkZWZhdWx0X3ZhbHVlOiBTdHJpbmcsCisgICAgcHViIG5hbWU6IFN0cmluZywKKyAgICBwdWIgY29udGFpbmVyOiBTdHJpbmcsCisgICAgcHViIGZsYWdfb2Zmc2V0OiB1MTYsCisgICAgcHViIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBTdHJpbmcsCisgICAgcHViIGRldmljZV9jb25maWdfZmxhZzogU3RyaW5nLAorfQorCitpbXBsIFRlbXBsYXRlUGFyc2VkRmxhZyB7CisgICAgI1thbGxvdyhjbGlwcHk6Om5vbm1pbmltYWxfYm9vbCldCisgICAgZm4gbmV3KHBhY2thZ2U6ICZzdHIsIGZsYWdfb2Zmc2V0czogSGFzaE1hcDxTdHJpbmcsIHUxNj4sIHBmOiAmUHJvdG9QYXJzZWRGbGFnKSAtPiBTZWxmIHsKKyAgICAgICAgU2VsZiB7CisgICAgICAgICAgICByZWFkd3JpdGU6IHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAorICAgICAgICAgICAgZGVmYXVsdF92YWx1ZTogbWF0Y2ggcGYuc3RhdGUoKSB7CisgICAgICAgICAgICAgICAgUHJvdG9GbGFnU3RhdGU6OkVOQUJMRUQgPT4gInRydWUiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRCA9PiAiZmFsc2UiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5hbWU6IHBmLm5hbWUoKS50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIGNvbnRhaW5lcjogcGYuY29udGFpbmVyKCkudG9fc3RyaW5nKCksCisgICAgICAgICAgICBmbGFnX29mZnNldDogKmZsYWdfb2Zmc2V0cy5nZXQocGYubmFtZSgpKS5leHBlY3QoImRpZG50IGZpbmQgcGFja2FnZSBvZmZzZXQgOigiKSwKKyAgICAgICAgICAgIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBwZi5uYW1lc3BhY2UoKS50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIGRldmljZV9jb25maWdfZmxhZzogY29kZWdlbjo6Y3JlYXRlX2RldmljZV9jb25maWdfaWRlbnQocGFja2FnZSwgcGYubmFtZSgpKQorICAgICAgICAgICAgICAgIC5leHBlY3QoInZhbHVlcyBjaGVja2VkIGF0IGZsYWcgcGFyc2UgdGltZSIpLAorICAgICAgICB9CisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworCisgICAgY29uc3QgUFJPRF9FWFBFQ1RFRDogJnN0ciA9IHIjIgorLy8hIGNvZGVnZW5lcmF0ZWQgcnVzdCBmbGFnIGxpYgordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6e01tYXAsIEFjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZSwgUGFja2FnZVJlYWRDb250ZXh0LCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSwgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0fTsKK3VzZSBzdGQ6OnBhdGg6OlBhdGg7Cit1c2Ugc3RkOjppbzo6V3JpdGU7Cit1c2UgbG9nOjp7bG9nLCBMZXZlbEZpbHRlciwgTGV2ZWx9OworCitzdGF0aWMgU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEU6ICZzdHIgPQorICAgICIvbWV0YWRhdGEvYWNvbmZpZ190ZXN0X21pc3Npb25zL21pc3Npb25fMSI7CitzdGF0aWMgTUlHUkFUSU9OX0xPR19UQUc6ICZzdHIgPSAiQWNvbmZpZ1Rlc3RNaXNzaW9uMSI7CisKKy8vLyBmbGFnIHByb3ZpZGVyCitwdWIgc3RydWN0IEZsYWdQcm92aWRlcjsKKworbGF6eV9zdGF0aWM6Omxhenlfc3RhdGljISB7CisgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3CisgICAgc3RhdGljIHJlZiBDQUNIRURfZGlzYWJsZWRfcnc6IGJvb2wgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKKyAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworCisgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3X2V4cG9ydGVkCisgICAgc3RhdGljIHJlZiBDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQ6IGJvb2wgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKKyAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworCisgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZQorICAgIHN0YXRpYyByZWYgQ0FDSEVEX2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZTogYm9vbCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICJhY29uZmlnX2ZsYWdzLm90aGVyX25hbWVzcGFjZSIsCisgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIiwKKyAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworCisgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGVuYWJsZWRfcncKKyAgICBzdGF0aWMgcmVmIENBQ0hFRF9lbmFibGVkX3J3OiBib29sID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKKyAgICAgICAgInRydWUiKSA9PSAidHJ1ZSI7CisKK30KKworaW1wbCBGbGFnUHJvdmlkZXIgeworICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3JvCisgICAgcHViIGZuIGRpc2FibGVkX3JvKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgZmFsc2UKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ydworICAgIHB1YiBmbiBkaXNhYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZGlzYWJsZWRfcncKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZAorICAgIHB1YiBmbiBkaXNhYmxlZF9yd19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyAgICBwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgKkNBQ0hFRF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvCisgICAgcHViIGZuIGVuYWJsZWRfZml4ZWRfcm8oJnNlbGYpIC0+IGJvb2wgeworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAorICAgIHB1YiBmbiBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm8KKyAgICBwdWIgZm4gZW5hYmxlZF9ybygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHRydWUKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCisgICAgcHViIGZuIGVuYWJsZWRfcm9fZXhwb3J0ZWQoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ydworICAgIHB1YiBmbiBlbmFibGVkX3J3KCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgKkNBQ0hFRF9lbmFibGVkX3J3CisgICAgfQorfQorCisvLy8gZmxhZyBwcm92aWRlcgorcHViIHN0YXRpYyBQUk9WSURFUjogRmxhZ1Byb3ZpZGVyID0gRmxhZ1Byb3ZpZGVyOworCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ybworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9ybygpIC0+IGJvb2wgeworICAgIGZhbHNlCit9CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3CisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3J3KCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIuZGlzYWJsZWRfcncoKQorfQorCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZAorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9yd19leHBvcnRlZCgpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmRpc2FibGVkX3J3X2V4cG9ydGVkKCkKK30KKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm8KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9maXhlZF9ybygpIC0+IGJvb2wgeworICAgIHRydWUKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgLT4gYm9vbCB7CisgICAgdHJ1ZQorfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcm8oKSAtPiBib29sIHsKKyAgICB0cnVlCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm9fZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9yb19leHBvcnRlZCgpIC0+IGJvb2wgeworICAgIHRydWUKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ydworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX3J3KCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIuZW5hYmxlZF9ydygpCit9CisiIzsKKworICAgIGNvbnN0IFBST0RfSU5TVFJVTUVOVEVEX0VYUEVDVEVEOiAmc3RyID0gciMiCisvLyEgY29kZWdlbmVyYXRlZCBydXN0IGZsYWcgbGliCit1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjp7TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBQYWNrYWdlUmVhZENvbnRleHQsIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlLCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlLCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHR9OwordXNlIHN0ZDo6cGF0aDo6UGF0aDsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSBsb2c6Ontsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CisKK3N0YXRpYyBTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRTogJnN0ciA9CisgICAgIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIjsKK3N0YXRpYyBNSUdSQVRJT05fTE9HX1RBRzogJnN0ciA9ICJBY29uZmlnVGVzdE1pc3Npb24xIjsKKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOworCitsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWMhIHsKKworICAgIHN0YXRpYyByZWYgUEFDS0FHRV9PRkZTRVQ6IFJlc3VsdDxPcHRpb248dTMyPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gPSB1bnNhZmUgeworICAgICAgICBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKQorICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2VfbWFwfCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikpCisgICAgICAgIC5tYXAofGNvbnRleHR8IGNvbnRleHQubWFwKHxjfCBjLmJvb2xlYW5fc3RhcnRfaW5kZXgpKQorICAgIH07CisKKyAgICBzdGF0aWMgcmVmIEZMQUdfVkFMX01BUDogUmVzdWx0PE1tYXAsIEFjb25maWdTdG9yYWdlRXJyb3I+ID0gdW5zYWZlIHsKKyAgICAgICAgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkKKyAgICB9OworICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9ydworCisgICAgc3RhdGljIHJlZiBDQUNIRURfZGlzYWJsZWRfcnc6IGJvb2wgPSB7CisgICAgICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciLAorICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworCisgICAgICAgIGlmIFBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgeworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgICAgICAgICAgbG9nZ2VyOjppbml0KAorICAgICAgICAgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKKyAgICAgICAgICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7CisKKyAgICAgICAgICAgIGxldCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0ID0gRkxBR19WQUxfTUFQCisgICAgICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IHsKKyAgICAgICAgICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKCJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlICdjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QnIi50b19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbWF0Y2ggYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCB7CisgICAgICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpIGlmIHN0b3JhZ2VfcmVzdWx0ID09IHJlc3VsdCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkluZm8sICJBY29uZmlnVGVzdE1pc3Npb24xOiBzdWNjZXNzISBmbGFnICdkaXNhYmxlZF9ydycgY29udGFpbmVkIGNvcnJlY3QgdmFsdWUuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IG1pc21hdGNoIGZvciBmbGFnICdkaXNhYmxlZF9ydycuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjoge2Vycn0iKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdAorICAgICAgICB9OworCisgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3X2V4cG9ydGVkCisKKyAgICBzdGF0aWMgcmVmIENBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZDogYm9vbCA9IHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCisgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisKKyAgICAgICAgaWYgUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCisgICAgICAgICAgICBsb2dnZXI6OmluaXQoCisgICAgICAgICAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQorICAgICAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKKworICAgICAgICAgICAgbGV0IGFjb25maWdfc3RvcmFnZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgeworICAgICAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAorICAgICAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIoIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgJ2NvbS5hbmRyb2lkLmFjb25maWcudGVzdCciLnRvX3N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBtYXRjaCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0IHsKKyAgICAgICAgICAgICAgICBPayhzdG9yYWdlX3Jlc3VsdCkgaWYgc3RvcmFnZV9yZXN1bHQgPT0gcmVzdWx0ID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6SW5mbywgIkFjb25maWdUZXN0TWlzc2lvbjE6IHN1Y2Nlc3MhIGZsYWcgJ2Rpc2FibGVkX3J3X2V4cG9ydGVkJyBjb250YWluZWQgY29ycmVjdCB2YWx1ZS4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3N0b3JhZ2VfcmVzdWx0fSIpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogbWlzbWF0Y2ggZm9yIGZsYWcgJ2Rpc2FibGVkX3J3X2V4cG9ydGVkJy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3N0b3JhZ2VfcmVzdWx0fSIpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiB7ZXJyfSIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0CisgICAgICAgIH07CisKKyAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCisKKyAgICBzdGF0aWMgcmVmIENBQ0hFRF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2U6IGJvb2wgPSB7CisgICAgICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgImFjb25maWdfZmxhZ3Mub3RoZXJfbmFtZXNwYWNlIiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIiwKKyAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKworICAgICAgICBpZiBQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBub29wcy4KKyAgICAgICAgICAgIGxvZ2dlcjo6aW5pdCgKKyAgICAgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCisgICAgICAgICAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOworCisgICAgICAgICAgICBsZXQgYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCB7CisgICAgICAgICAgICAgICAgICAgIFBBQ0tBR0VfT0ZGU0VUCisgICAgICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIG9mZnNldDoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8cGFja2FnZV9vZmZzZXR8IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBwYWNrYWdlX29mZnNldCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIG9mZnNldCArIDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IEVycigibm8gY29udGV4dCBmb3VuZCBmb3IgcGFja2FnZSAnY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0JyIudG9fc3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIG1hdGNoIGFjb25maWdfc3RvcmFnZV9yZXN1bHQgeworICAgICAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSBpZiBzdG9yYWdlX3Jlc3VsdCA9PSByZXN1bHQgPT4geworICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpJbmZvLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogc3VjY2VzcyEgZmxhZyAnZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlJyBjb250YWluZWQgY29ycmVjdCB2YWx1ZS4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3N0b3JhZ2VfcmVzdWx0fSIpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogbWlzbWF0Y2ggZm9yIGZsYWcgJ2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZScuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjoge2Vycn0iKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdAorICAgICAgICB9OworCisgICAgLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGVuYWJsZWRfcncKKworICAgIHN0YXRpYyByZWYgQ0FDSEVEX2VuYWJsZWRfcnc6IGJvb2wgPSB7CisgICAgICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydyIsCisgICAgICAgICAgICAidHJ1ZSIpID09ICJ0cnVlIjsKKworICAgICAgICBpZiBQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBub29wcy4KKyAgICAgICAgICAgIGxvZ2dlcjo6aW5pdCgKKyAgICAgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCisgICAgICAgICAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOworCisgICAgICAgICAgICBsZXQgYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCB7CisgICAgICAgICAgICAgICAgICAgIFBBQ0tBR0VfT0ZGU0VUCisgICAgICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIG9mZnNldDoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8cGFja2FnZV9vZmZzZXR8IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBwYWNrYWdlX29mZnNldCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIG9mZnNldCArIDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IEVycigibm8gY29udGV4dCBmb3VuZCBmb3IgcGFja2FnZSAnY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0JyIudG9fc3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIG1hdGNoIGFjb25maWdfc3RvcmFnZV9yZXN1bHQgeworICAgICAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSBpZiBzdG9yYWdlX3Jlc3VsdCA9PSByZXN1bHQgPT4geworICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpJbmZvLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogc3VjY2VzcyEgZmxhZyAnZW5hYmxlZF9ydycgY29udGFpbmVkIGNvcnJlY3QgdmFsdWUuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IG1pc21hdGNoIGZvciBmbGFnICdlbmFibGVkX3J3Jy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3N0b3JhZ2VfcmVzdWx0fSIpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiB7ZXJyfSIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0CisgICAgICAgIH07CisKK30KKworaW1wbCBGbGFnUHJvdmlkZXIgeworCisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ybworICAgIHB1YiBmbiBkaXNhYmxlZF9ybygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIGZhbHNlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcncKKyAgICBwdWIgZm4gZGlzYWJsZWRfcncoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICAqQ0FDSEVEX2Rpc2FibGVkX3J3CisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyAgICBwdWIgZm4gZGlzYWJsZWRfcndfZXhwb3J0ZWQoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICAqQ0FDSEVEX2Rpc2FibGVkX3J3X2V4cG9ydGVkCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCisgICAgcHViIGZuIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9ybworICAgIHB1YiBmbiBlbmFibGVkX2ZpeGVkX3JvKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKKyAgICBwdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHRydWUKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvCisgICAgcHViIGZuIGVuYWJsZWRfcm8oJnNlbGYpIC0+IGJvb2wgeworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9yb19leHBvcnRlZAorICAgIHB1YiBmbiBlbmFibGVkX3JvX2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcncKKyAgICBwdWIgZm4gZW5hYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZW5hYmxlZF9ydworICAgIH0KKworCit9CisKKy8vLyBmbGFnIHByb3ZpZGVyCitwdWIgc3RhdGljIFBST1ZJREVSOiBGbGFnUHJvdmlkZXIgPSBGbGFnUHJvdmlkZXI7CisKKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcm8KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcm8oKSAtPiBib29sIHsKKworCisgICAgbGV0IHJlc3VsdCA9IGZhbHNlOworICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdAorICAgIC8vIGFyZSBub29wcy4KKyAgICBsb2dnZXI6OmluaXQoCisgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pLAorICAgICk7CisKKyAgICB1bnNhZmUgeworICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSB7CisgICAgICAgICAgICBPayhmaWxlKSA9PiBmaWxlLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2Rpc2FibGVkX3JvJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGxldCBwYWNrYWdlX3JlYWRfY29udGV4dCA9IG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSB7CisgICAgICAgICAgICBPayhTb21lKGNvbnRleHQpKSA9PiBjb250ZXh0LAorICAgICAgICAgICAgT2soTm9uZSkgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2Rpc2FibGVkX3JvJzogZGlkIG5vdCBnZXQgY29udGV4dCIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2Rpc2FibGVkX3JvJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBsZXQgZmxhZ192YWxfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkgeworICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdkaXNhYmxlZF9ybyc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHZhbHVlID0gbWF0Y2ggZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCAwICsgcGFja2FnZV9yZWFkX2NvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCkgeworICAgICAgICAgICAgT2sodmFsKSA9PiB2YWwsCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZGlzYWJsZWRfcm8nOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaWYgcmVzdWx0ICE9IHZhbHVlIHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZsYWcgbWlzbWF0Y2ggZm9yICdkaXNhYmxlZF9ybycuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldCBkZWZhdWx0X3ZhbHVlID0gZmFsc2U7CisgICAgICAgICAgICBsb2chKExldmVsOjpJbmZvLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogc3VjY2VzcyEgZmxhZyAnZGlzYWJsZWRfcm8nIGNvbnRhaW5lZCBjb3JyZWN0IHZhbHVlLiBMZWdhY3kgc3RvcmFnZSB3YXMge2RlZmF1bHRfdmFsdWV9LCBuZXcgc3RvcmFnZSB3YXMge3ZhbHVlfSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0CisKK30KKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcncKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcncoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5kaXNhYmxlZF9ydygpCit9CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIuZGlzYWJsZWRfcndfZXhwb3J0ZWQoKQorfQorCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9ybworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX2ZpeGVkX3JvKCkgLT4gYm9vbCB7CisKKworICAgIGxldCByZXN1bHQgPSB0cnVlOworICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdAorICAgIC8vIGFyZSBub29wcy4KKyAgICBsb2dnZXI6OmluaXQoCisgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pLAorICAgICk7CisKKyAgICB1bnNhZmUgeworICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSB7CisgICAgICAgICAgICBPayhmaWxlKSA9PiBmaWxlLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm8nOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IHBhY2thZ2VfcmVhZF9jb250ZXh0ID0gbWF0Y2ggZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpIHsKKyAgICAgICAgICAgIE9rKFNvbWUoY29udGV4dCkpID0+IGNvbnRleHQsCisgICAgICAgICAgICBPayhOb25lKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9ybyc6IGRpZCBub3QgZ2V0IGNvbnRleHQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBsZXQgZmxhZ192YWxfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkgeworICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIDQgKyBwYWNrYWdlX3JlYWRfY29udGV4dC5ib29sZWFuX3N0YXJ0X2luZGV4KSB7CisgICAgICAgICAgICBPayh2YWwpID0+IHZhbCwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGlmIHJlc3VsdCAhPSB2YWx1ZSB7CisgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmbGFnIG1pc21hdGNoIGZvciAnZW5hYmxlZF9maXhlZF9ybycuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldCBkZWZhdWx0X3ZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkluZm8sICJBY29uZmlnVGVzdE1pc3Npb24xOiBzdWNjZXNzISBmbGFnICdlbmFibGVkX2ZpeGVkX3JvJyBjb250YWluZWQgY29ycmVjdCB2YWx1ZS4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtkZWZhdWx0X3ZhbHVlfSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdAorCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIC0+IGJvb2wgeworCisKKyAgICBsZXQgcmVzdWx0ID0gdHJ1ZTsKKyAgICBpZiAhUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QKKyAgICAvLyBhcmUgbm9vcHMuCisgICAgbG9nZ2VyOjppbml0KAorICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQorICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSwKKyAgICApOworCisgICAgdW5zYWZlIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCkgeworICAgICAgICAgICAgT2soZmlsZSkgPT4gZmlsZSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGxldCBwYWNrYWdlX3JlYWRfY29udGV4dCA9IG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSB7CisgICAgICAgICAgICBPayhTb21lKGNvbnRleHQpKSA9PiBjb250ZXh0LAorICAgICAgICAgICAgT2soTm9uZSkgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQnOiBkaWQgbm90IGdldCBjb250ZXh0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGZsYWdfdmFsX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpIHsKKyAgICAgICAgICAgIE9rKHZhbF9tYXApID0+IHZhbF9tYXAsCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHZhbHVlID0gbWF0Y2ggZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCA1ICsgcGFja2FnZV9yZWFkX2NvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCkgeworICAgICAgICAgICAgT2sodmFsKSA9PiB2YWwsCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBpZiByZXN1bHQgIT0gdmFsdWUgeworICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmxhZyBtaXNtYXRjaCBmb3IgJ2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQnLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7dmFsdWV9Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXQgZGVmYXVsdF92YWx1ZSA9IHRydWU7CisgICAgICAgICAgICBsb2chKExldmVsOjpJbmZvLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogc3VjY2VzcyEgZmxhZyAnZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCcgY29udGFpbmVkIGNvcnJlY3QgdmFsdWUuIExlZ2FjeSBzdG9yYWdlIHdhcyB7ZGVmYXVsdF92YWx1ZX0sIG5ldyBzdG9yYWdlIHdhcyB7dmFsdWV9Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQKKworfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcm8oKSAtPiBib29sIHsKKworCisgICAgbGV0IHJlc3VsdCA9IHRydWU7CisgICAgaWYgIVBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0CisgICAgLy8gYXJlIG5vb3BzLgorICAgIGxvZ2dlcjo6aW5pdCgKKyAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKKyAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbyksCisgICAgKTsKKworICAgIHVuc2FmZSB7CisgICAgICAgIGxldCBwYWNrYWdlX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApIHsKKyAgICAgICAgICAgIE9rKGZpbGUpID0+IGZpbGUsCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9ybyc6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBsZXQgcGFja2FnZV9yZWFkX2NvbnRleHQgPSBtYXRjaCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikgeworICAgICAgICAgICAgT2soU29tZShjb250ZXh0KSkgPT4gY29udGV4dCwKKyAgICAgICAgICAgIE9rKE5vbmUpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvJzogZGlkIG5vdCBnZXQgY29udGV4dCIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm8nOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGxldCBmbGFnX3ZhbF9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKSB7CisgICAgICAgICAgICBPayh2YWxfbWFwKSA9PiB2YWxfbWFwLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm8nOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGxldCB2YWx1ZSA9IG1hdGNoIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgNiArIHBhY2thZ2VfcmVhZF9jb250ZXh0LmJvb2xlYW5fc3RhcnRfaW5kZXgpIHsKKyAgICAgICAgICAgIE9rKHZhbCkgPT4gdmFsLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm8nOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaWYgcmVzdWx0ICE9IHZhbHVlIHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZsYWcgbWlzbWF0Y2ggZm9yICdlbmFibGVkX3JvJy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3ZhbHVlfSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGV0IGRlZmF1bHRfdmFsdWUgPSB0cnVlOworICAgICAgICAgICAgbG9nIShMZXZlbDo6SW5mbywgIkFjb25maWdUZXN0TWlzc2lvbjE6IHN1Y2Nlc3MhIGZsYWcgJ2VuYWJsZWRfcm8nIGNvbnRhaW5lZCBjb3JyZWN0IHZhbHVlLiBMZWdhY3kgc3RvcmFnZSB3YXMge2RlZmF1bHRfdmFsdWV9LCBuZXcgc3RvcmFnZSB3YXMge3ZhbHVlfSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0CisKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9yb19leHBvcnRlZAorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX3JvX2V4cG9ydGVkKCkgLT4gYm9vbCB7CisKKworICAgIGxldCByZXN1bHQgPSB0cnVlOworICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdAorICAgIC8vIGFyZSBub29wcy4KKyAgICBsb2dnZXI6OmluaXQoCisgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pLAorICAgICk7CisKKyAgICB1bnNhZmUgeworICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSB7CisgICAgICAgICAgICBPayhmaWxlKSA9PiBmaWxlLAorICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm9fZXhwb3J0ZWQnOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IHBhY2thZ2VfcmVhZF9jb250ZXh0ID0gbWF0Y2ggZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpIHsKKyAgICAgICAgICAgIE9rKFNvbWUoY29udGV4dCkpID0+IGNvbnRleHQsCisgICAgICAgICAgICBPayhOb25lKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9yb19leHBvcnRlZCc6IGRpZCBub3QgZ2V0IGNvbnRleHQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBsZXQgZmxhZ192YWxfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkgeworICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIDcgKyBwYWNrYWdlX3JlYWRfY29udGV4dC5ib29sZWFuX3N0YXJ0X2luZGV4KSB7CisgICAgICAgICAgICBPayh2YWwpID0+IHZhbCwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGlmIHJlc3VsdCAhPSB2YWx1ZSB7CisgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmbGFnIG1pc21hdGNoIGZvciAnZW5hYmxlZF9yb19leHBvcnRlZCcuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldCBkZWZhdWx0X3ZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkluZm8sICJBY29uZmlnVGVzdE1pc3Npb24xOiBzdWNjZXNzISBmbGFnICdlbmFibGVkX3JvX2V4cG9ydGVkJyBjb250YWluZWQgY29ycmVjdCB2YWx1ZS4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtkZWZhdWx0X3ZhbHVlfSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdAorCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcncKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9ydygpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmVuYWJsZWRfcncoKQorfQorIiM7CisKKyAgICBjb25zdCBURVNUX0VYUEVDVEVEOiAmc3RyID0gciMiCisvLyEgY29kZWdlbmVyYXRlZCBydXN0IGZsYWcgbGliCisKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpCVHJlZU1hcDsKK3VzZSBzdGQ6OnN5bmM6Ok11dGV4OworCisvLy8gZmxhZyBwcm92aWRlcgorcHViIHN0cnVjdCBGbGFnUHJvdmlkZXIgeworICAgIG92ZXJyaWRlczogQlRyZWVNYXA8JidzdGF0aWMgc3RyLCBib29sPiwKK30KKworaW1wbCBGbGFnUHJvdmlkZXIgeworICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3JvCisgICAgcHViIGZuIGRpc2FibGVkX3JvKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuZ2V0KCJkaXNhYmxlZF9ybyIpLmNvcGllZCgpLnVud3JhcF9vcigKKyAgICAgICAgICAgIGZhbHNlCisgICAgICAgICkKKyAgICB9CisKKyAgICAvLy8gc2V0IGZsYWcgZGlzYWJsZWRfcm8KKyAgICBwdWIgZm4gc2V0X2Rpc2FibGVkX3JvKCZtdXQgc2VsZiwgdmFsOiBib29sKSB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmluc2VydCgiZGlzYWJsZWRfcm8iLCB2YWwpOworICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3CisgICAgcHViIGZuIGRpc2FibGVkX3J3KCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuZ2V0KCJkaXNhYmxlZF9ydyIpLmNvcGllZCgpLnVud3JhcF9vcigKKyAgICAgICAgICAgIGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKKyAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSIKKyAgICAgICAgKQorICAgIH0KKworICAgIC8vLyBzZXQgZmxhZyBkaXNhYmxlZF9ydworICAgIHB1YiBmbiBzZXRfZGlzYWJsZWRfcncoJm11dCBzZWxmLCB2YWw6IGJvb2wpIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuaW5zZXJ0KCJkaXNhYmxlZF9ydyIsIHZhbCk7CisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyAgICBwdWIgZm4gZGlzYWJsZWRfcndfZXhwb3J0ZWQoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5nZXQoImRpc2FibGVkX3J3X2V4cG9ydGVkIikuY29waWVkKCkudW53cmFwX29yKAorICAgICAgICAgICAgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLAorICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIgorICAgICAgICApCisgICAgfQorCisgICAgLy8vIHNldCBmbGFnIGRpc2FibGVkX3J3X2V4cG9ydGVkCisgICAgcHViIGZuIHNldF9kaXNhYmxlZF9yd19leHBvcnRlZCgmbXV0IHNlbGYsIHZhbDogYm9vbCkgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5pbnNlcnQoImRpc2FibGVkX3J3X2V4cG9ydGVkIiwgdmFsKTsKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyAgICBwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuZ2V0KCJkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiKS5jb3BpZWQoKS51bndyYXBfb3IoCisgICAgICAgICAgICBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLm90aGVyX25hbWVzcGFjZSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIgorICAgICAgICApCisgICAgfQorCisgICAgLy8vIHNldCBmbGFnIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZQorICAgIHB1YiBmbiBzZXRfZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCZtdXQgc2VsZiwgdmFsOiBib29sKSB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmluc2VydCgiZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIiwgdmFsKTsKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvCisgICAgcHViIGZuIGVuYWJsZWRfZml4ZWRfcm8oJnNlbGYpIC0+IGJvb2wgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5nZXQoImVuYWJsZWRfZml4ZWRfcm8iKS5jb3BpZWQoKS51bndyYXBfb3IoCisgICAgICAgICAgICB0cnVlCisgICAgICAgICkKKyAgICB9CisKKyAgICAvLy8gc2V0IGZsYWcgZW5hYmxlZF9maXhlZF9ybworICAgIHB1YiBmbiBzZXRfZW5hYmxlZF9maXhlZF9ybygmbXV0IHNlbGYsIHZhbDogYm9vbCkgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5pbnNlcnQoImVuYWJsZWRfZml4ZWRfcm8iLCB2YWwpOworICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKKyAgICBwdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmdldCgiZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIpLmNvcGllZCgpLnVud3JhcF9vcigKKyAgICAgICAgICAgIHRydWUKKyAgICAgICAgKQorICAgIH0KKworICAgIC8vLyBzZXQgZmxhZyBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkCisgICAgcHViIGZuIHNldF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCZtdXQgc2VsZiwgdmFsOiBib29sKSB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmluc2VydCgiZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIsIHZhbCk7CisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ybworICAgIHB1YiBmbiBlbmFibGVkX3JvKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuZ2V0KCJlbmFibGVkX3JvIikuY29waWVkKCkudW53cmFwX29yKAorICAgICAgICAgICAgdHJ1ZQorICAgICAgICApCisgICAgfQorCisgICAgLy8vIHNldCBmbGFnIGVuYWJsZWRfcm8KKyAgICBwdWIgZm4gc2V0X2VuYWJsZWRfcm8oJm11dCBzZWxmLCB2YWw6IGJvb2wpIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuaW5zZXJ0KCJlbmFibGVkX3JvIiwgdmFsKTsKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCisgICAgcHViIGZuIGVuYWJsZWRfcm9fZXhwb3J0ZWQoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5nZXQoImVuYWJsZWRfcm9fZXhwb3J0ZWQiKS5jb3BpZWQoKS51bndyYXBfb3IoCisgICAgICAgICAgICB0cnVlCisgICAgICAgICkKKyAgICB9CisKKyAgICAvLy8gc2V0IGZsYWcgZW5hYmxlZF9yb19leHBvcnRlZAorICAgIHB1YiBmbiBzZXRfZW5hYmxlZF9yb19leHBvcnRlZCgmbXV0IHNlbGYsIHZhbDogYm9vbCkgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5pbnNlcnQoImVuYWJsZWRfcm9fZXhwb3J0ZWQiLCB2YWwpOworICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcncKKyAgICBwdWIgZm4gZW5hYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmdldCgiZW5hYmxlZF9ydyIpLmNvcGllZCgpLnVud3JhcF9vcigKKyAgICAgICAgICAgIGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAorICAgICAgICAgICAgICAgICJ0cnVlIikgPT0gInRydWUiCisgICAgICAgICkKKyAgICB9CisKKyAgICAvLy8gc2V0IGZsYWcgZW5hYmxlZF9ydworICAgIHB1YiBmbiBzZXRfZW5hYmxlZF9ydygmbXV0IHNlbGYsIHZhbDogYm9vbCkgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5pbnNlcnQoImVuYWJsZWRfcnciLCB2YWwpOworICAgIH0KKworICAgIC8vLyBjbGVhciBhbGwgZmxhZyBvdmVycmlkZXMKKyAgICBwdWIgZm4gcmVzZXRfZmxhZ3MoJm11dCBzZWxmKSB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmNsZWFyKCk7CisgICAgfQorfQorCisvLy8gZmxhZyBwcm92aWRlcgorcHViIHN0YXRpYyBQUk9WSURFUjogTXV0ZXg8RmxhZ1Byb3ZpZGVyPiA9IE11dGV4OjpuZXcoCisgICAgRmxhZ1Byb3ZpZGVyIHtvdmVycmlkZXM6IEJUcmVlTWFwOjpuZXcoKX0KKyk7CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3JvKCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLmRpc2FibGVkX3JvKCkKK30KKworLy8vIHNldCBmbGFnIGRpc2FibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIHNldF9kaXNhYmxlZF9ybyh2YWw6IGJvb2wpIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuc2V0X2Rpc2FibGVkX3JvKHZhbCk7Cit9CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3CisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3J3KCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLmRpc2FibGVkX3J3KCkKK30KKworLy8vIHNldCBmbGFnIGRpc2FibGVkX3J3CisjW2lubGluZShhbHdheXMpXQorcHViIGZuIHNldF9kaXNhYmxlZF9ydyh2YWw6IGJvb2wpIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuc2V0X2Rpc2FibGVkX3J3KHZhbCk7Cit9CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLmRpc2FibGVkX3J3X2V4cG9ydGVkKCkKK30KKworLy8vIHNldCBmbGFnIGRpc2FibGVkX3J3X2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIHNldF9kaXNhYmxlZF9yd19leHBvcnRlZCh2YWw6IGJvb2wpIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuc2V0X2Rpc2FibGVkX3J3X2V4cG9ydGVkKHZhbCk7Cit9CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZQorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkKK30KKworLy8vIHNldCBmbGFnIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZQorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBzZXRfZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKHZhbDogYm9vbCkgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5zZXRfZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKHZhbCk7Cit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm8KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9maXhlZF9ybygpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5lbmFibGVkX2ZpeGVkX3JvKCkKK30KKworLy8vIHNldCBmbGFnIGVuYWJsZWRfZml4ZWRfcm8KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gc2V0X2VuYWJsZWRfZml4ZWRfcm8odmFsOiBib29sKSB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLnNldF9lbmFibGVkX2ZpeGVkX3JvKHZhbCk7Cit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkKK30KKworLy8vIHNldCBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gc2V0X2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQodmFsOiBib29sKSB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLnNldF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKHZhbCk7Cit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm8KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9ybygpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5lbmFibGVkX3JvKCkKK30KKworLy8vIHNldCBmbGFnIGVuYWJsZWRfcm8KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gc2V0X2VuYWJsZWRfcm8odmFsOiBib29sKSB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLnNldF9lbmFibGVkX3JvKHZhbCk7Cit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm9fZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9yb19leHBvcnRlZCgpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5lbmFibGVkX3JvX2V4cG9ydGVkKCkKK30KKworLy8vIHNldCBmbGFnIGVuYWJsZWRfcm9fZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gc2V0X2VuYWJsZWRfcm9fZXhwb3J0ZWQodmFsOiBib29sKSB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLnNldF9lbmFibGVkX3JvX2V4cG9ydGVkKHZhbCk7Cit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcncKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9ydygpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5lbmFibGVkX3J3KCkKK30KKworLy8vIHNldCBmbGFnIGVuYWJsZWRfcncKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gc2V0X2VuYWJsZWRfcncodmFsOiBib29sKSB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLnNldF9lbmFibGVkX3J3KHZhbCk7Cit9CisKKy8vLyBjbGVhciBhbGwgZmxhZyBvdmVycmlkZQorcHViIGZuIHJlc2V0X2ZsYWdzKCkgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5yZXNldF9mbGFncygpCit9CisiIzsKKworICAgIGNvbnN0IEVYUE9SVEVEX0VYUEVDVEVEOiAmc3RyID0gciMiCisvLyEgY29kZWdlbmVyYXRlZCBydXN0IGZsYWcgbGliCit1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjp7TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBQYWNrYWdlUmVhZENvbnRleHQsIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlLCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlLCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHR9OwordXNlIHN0ZDo6cGF0aDo6UGF0aDsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSBsb2c6Ontsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CisKK3N0YXRpYyBTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRTogJnN0ciA9CisgICAgIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIjsKK3N0YXRpYyBNSUdSQVRJT05fTE9HX1RBRzogJnN0ciA9ICJBY29uZmlnVGVzdE1pc3Npb24xIjsKKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOworCitsYXp5X3N0YXRpYzo6bGF6eV9zdGF0aWMhIHsKKyAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyAgICBzdGF0aWMgcmVmIENBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZDogYm9vbCA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLAorICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisKKyAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAorICAgIHN0YXRpYyByZWYgQ0FDSEVEX2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQ6IGJvb2wgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisKKyAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZW5hYmxlZF9yb19leHBvcnRlZAorICAgIHN0YXRpYyByZWYgQ0FDSEVEX2VuYWJsZWRfcm9fZXhwb3J0ZWQ6IGJvb2wgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisKK30KKworaW1wbCBGbGFnUHJvdmlkZXIgeworICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2V4cG9ydGVkCisgICAgcHViIGZuIGRpc2FibGVkX3J3X2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgKkNBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZAorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKKyAgICBwdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm9fZXhwb3J0ZWQKKyAgICBwdWIgZm4gZW5hYmxlZF9yb19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZW5hYmxlZF9yb19leHBvcnRlZAorICAgIH0KK30KKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdGF0aWMgUFJPVklERVI6IEZsYWdQcm92aWRlciA9IEZsYWdQcm92aWRlcjsKKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5kaXNhYmxlZF9yd19leHBvcnRlZCgpCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKQorfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5lbmFibGVkX3JvX2V4cG9ydGVkKCkKK30KKyIjOworCisgICAgY29uc3QgRk9SQ0VfUkVBRF9PTkxZX0VYUEVDVEVEOiAmc3RyID0gciMiCisvLyEgY29kZWdlbmVyYXRlZCBydXN0IGZsYWcgbGliCit1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjp7TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBQYWNrYWdlUmVhZENvbnRleHQsIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlLCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlLCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHR9OwordXNlIHN0ZDo6cGF0aDo6UGF0aDsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSBsb2c6Ontsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CisKK3N0YXRpYyBTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRTogJnN0ciA9CisgICAgIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIjsKK3N0YXRpYyBNSUdSQVRJT05fTE9HX1RBRzogJnN0ciA9ICJBY29uZmlnVGVzdE1pc3Npb24xIjsKKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOworCitpbXBsIEZsYWdQcm92aWRlciB7CisgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcm8KKyAgICBwdWIgZm4gZGlzYWJsZWRfcm8oJnNlbGYpIC0+IGJvb2wgeworICAgICAgICBmYWxzZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3CisgICAgcHViIGZuIGRpc2FibGVkX3J3KCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgZmFsc2UKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyAgICBwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgZmFsc2UKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvCisgICAgcHViIGZuIGVuYWJsZWRfZml4ZWRfcm8oJnNlbGYpIC0+IGJvb2wgeworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ybworICAgIHB1YiBmbiBlbmFibGVkX3JvKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcncKKyAgICBwdWIgZm4gZW5hYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHRydWUKKyAgICB9Cit9CisKKy8vLyBmbGFnIHByb3ZpZGVyCitwdWIgc3RhdGljIFBST1ZJREVSOiBGbGFnUHJvdmlkZXIgPSBGbGFnUHJvdmlkZXI7CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3JvKCkgLT4gYm9vbCB7CisgICAgZmFsc2UKK30KKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcncKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcncoKSAtPiBib29sIHsKKyAgICBmYWxzZQorfQorCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgLT4gYm9vbCB7CisgICAgZmFsc2UKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9ybworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX2ZpeGVkX3JvKCkgLT4gYm9vbCB7CisgICAgdHJ1ZQorfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcm8oKSAtPiBib29sIHsKKyAgICB0cnVlCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcncKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9ydygpIC0+IGJvb2wgeworICAgIHRydWUKK30KKyIjOworICAgIHVzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKKworICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKG1vZGU6IENvZGVnZW5Nb2RlLCBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsIGV4cGVjdGVkOiAmc3RyKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9CisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMoY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBnZW5lcmF0ZWQgPSBnZW5lcmF0ZV9ydXN0X2NvZGUoCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgic3JjL2xpYi5ycyIsIGZvcm1hdCEoInt9IiwgZ2VuZXJhdGVkLnBhdGguZGlzcGxheSgpKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OmZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigKKyAgICAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAmU3RyaW5nOjpmcm9tX3V0ZjgoZ2VuZXJhdGVkLmNvbnRlbnRzKS51bndyYXAoKQorICAgICAgICAgICAgKQorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZV9mb3JfcHJvZCgpIHsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUoQ29kZWdlbk1vZGU6OlByb2R1Y3Rpb24sIGZhbHNlLCBQUk9EX0VYUEVDVEVEKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGVfZm9yX3Byb2RfaW5zdHJ1bWVudGVkKCkgeworICAgICAgICB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZShDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbiwgdHJ1ZSwgUFJPRF9JTlNUUlVNRU5URURfRVhQRUNURUQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZV9mb3JfdGVzdCgpIHsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUoQ29kZWdlbk1vZGU6OlRlc3QsIGZhbHNlLCBURVNUX0VYUEVDVEVEKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGVfZm9yX2V4cG9ydGVkKCkgeworICAgICAgICB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZShDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQsIGZhbHNlLCBFWFBPUlRFRF9FWFBFQ1RFRCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlX2Zvcl9mb3JjZV9yZWFkX29ubHkoKSB7CisgICAgICAgIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5LCBmYWxzZSwgRk9SQ0VfUkVBRF9PTkxZX0VYUEVDVEVEKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvbW1hbmRzLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb21tYW5kcy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWYwNjYyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb21tYW5kcy5ycwpAQCAtMCwwICsxLDc2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzZSBhbnlob3c6OntiYWlsLCBlbnN1cmUsIENvbnRleHQsIFJlc3VsdH07Cit1c2UgaXRlcnRvb2xzOjpJdGVydG9vbHM7Cit1c2UgcHJvdG9idWY6Ok1lc3NhZ2U7Cit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKK3VzZSBzdGQ6OmlvOjpSZWFkOwordXNlIHN0ZDo6cGF0aDo6UGF0aEJ1ZjsKKwordXNlIGNyYXRlOjpjb2RlZ2VuOjpjcHA6OmdlbmVyYXRlX2NwcF9jb2RlOwordXNlIGNyYXRlOjpjb2RlZ2VuOjpqYXZhOjpnZW5lcmF0ZV9qYXZhX2NvZGU7Cit1c2UgY3JhdGU6OmNvZGVnZW46OnJ1c3Q6OmdlbmVyYXRlX3J1c3RfY29kZTsKK3VzZSBjcmF0ZTo6Y29kZWdlbjo6Q29kZWdlbk1vZGU7Cit1c2UgY3JhdGU6OmR1bXA6OntEdW1wRm9ybWF0LCBEdW1wUHJlZGljYXRlfTsKK3VzZSBjcmF0ZTo6c3RvcmFnZTo6Z2VuZXJhdGVfc3RvcmFnZV9maWxlOwordXNlIGFjb25maWdfcHJvdG9zOjp7CisgICAgUGFyc2VkRmxhZ0V4dCwgUHJvdG9GbGFnTWV0YWRhdGEsIFByb3RvRmxhZ1Blcm1pc3Npb24sIFByb3RvRmxhZ1N0YXRlLCBQcm90b1BhcnNlZEZsYWcsCisgICAgUHJvdG9QYXJzZWRGbGFncywgUHJvdG9UcmFjZXBvaW50LAorfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6U3RvcmFnZUZpbGVUeXBlOworCitwdWIgc3RydWN0IElucHV0IHsKKyAgICBwdWIgc291cmNlOiBTdHJpbmcsCisgICAgcHViIHJlYWRlcjogQm94PGR5biBSZWFkPiwKK30KKworaW1wbCBJbnB1dCB7CisgICAgZm4gdHJ5X3BhcnNlX2ZsYWdzKCZtdXQgc2VsZikgLT4gUmVzdWx0PFByb3RvUGFyc2VkRmxhZ3M+IHsKKyAgICAgICAgbGV0IG11dCBidWZmZXIgPSBWZWM6Om5ldygpOworICAgICAgICBzZWxmLnJlYWRlcgorICAgICAgICAgICAgLnJlYWRfdG9fZW5kKCZtdXQgYnVmZmVyKQorICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gcmVhZCB7fSIsIHNlbGYuc291cmNlKSk/OworICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmJ1ZmZlcikKKyAgICAgICAgICAgIC53aXRoX2NvbnRleHQofHwgc2VsZi5lcnJvcl9jb250ZXh0KCkpCisgICAgfQorCisgICAgZm4gZXJyb3JfY29udGV4dCgmc2VsZikgLT4gU3RyaW5nIHsKKyAgICAgICAgZm9ybWF0ISgiZmFpbGVkIHRvIHBhcnNlIHt9Iiwgc2VsZi5zb3VyY2UpCisgICAgfQorfQorCitwdWIgc3RydWN0IE91dHB1dEZpbGUgeworICAgIHB1YiBwYXRoOiBQYXRoQnVmLCAvLyByZWxhdGl2ZSB0byBzb21lIHJvb3QgZGlyZWN0b3J5IG9ubHkgbWFpbiBrbm93cyBhYm91dAorICAgIHB1YiBjb250ZW50czogVmVjPHU4PiwKK30KKworcHViIGNvbnN0IERFRkFVTFRfRkxBR19TVEFURTogUHJvdG9GbGFnU3RhdGUgPSBQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQ7CitwdWIgY29uc3QgREVGQVVMVF9GTEFHX1BFUk1JU1NJT046IFByb3RvRmxhZ1Blcm1pc3Npb24gPSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFOworCitwdWIgZm4gcGFyc2VfZmxhZ3MoCisgICAgcGFja2FnZTogJnN0ciwKKyAgICBjb250YWluZXI6IE9wdGlvbjwmc3RyPiwKKyAgICBkZWNsYXJhdGlvbnM6IFZlYzxJbnB1dD4sCisgICAgdmFsdWVzOiBWZWM8SW5wdXQ+LAorICAgIGRlZmF1bHRfcGVybWlzc2lvbjogUHJvdG9GbGFnUGVybWlzc2lvbiwKKykgLT4gUmVzdWx0PFZlYzx1OD4+IHsKKyAgICBsZXQgbXV0IHBhcnNlZF9mbGFncyA9IFByb3RvUGFyc2VkRmxhZ3M6Om5ldygpOworCisgICAgZm9yIG11dCBpbnB1dCBpbiBkZWNsYXJhdGlvbnMgeworICAgICAgICBsZXQgbXV0IGNvbnRlbnRzID0gU3RyaW5nOjpuZXcoKTsKKyAgICAgICAgaW5wdXQKKyAgICAgICAgICAgIC5yZWFkZXIKKyAgICAgICAgICAgIC5yZWFkX3RvX3N0cmluZygmbXV0IGNvbnRlbnRzKQorICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gcmVhZCB7fSIsIGlucHV0LnNvdXJjZSkpPzsKKworICAgICAgICBsZXQgZmxhZ19kZWNsYXJhdGlvbnMgPSBhY29uZmlnX3Byb3Rvczo6ZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oJmNvbnRlbnRzKQorICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBpbnB1dC5lcnJvcl9jb250ZXh0KCkpPzsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIHBhY2thZ2UgPT0gZmxhZ19kZWNsYXJhdGlvbnMucGFja2FnZSgpLAorICAgICAgICAgICAgImZhaWxlZCB0byBwYXJzZSB7fTogZXhwZWN0ZWQgcGFja2FnZSB7fSwgZ290IHt9IiwKKyAgICAgICAgICAgIGlucHV0LnNvdXJjZSwKKyAgICAgICAgICAgIHBhY2thZ2UsCisgICAgICAgICAgICBmbGFnX2RlY2xhcmF0aW9ucy5wYWNrYWdlKCkKKyAgICAgICAgKTsKKyAgICAgICAgaWYgbGV0IFNvbWUoYykgPSBjb250YWluZXIgeworICAgICAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgICAgICBjID09IGZsYWdfZGVjbGFyYXRpb25zLmNvbnRhaW5lcigpLAorICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcGFyc2Uge306IGV4cGVjdGVkIGNvbnRhaW5lciB7fSwgZ290IHt9IiwKKyAgICAgICAgICAgICAgICBpbnB1dC5zb3VyY2UsCisgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICBmbGFnX2RlY2xhcmF0aW9ucy5jb250YWluZXIoKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgbXV0IGZsYWdfZGVjbGFyYXRpb24gaW4gZmxhZ19kZWNsYXJhdGlvbnMuZmxhZy5pbnRvX2l0ZXIoKSB7CisgICAgICAgICAgICBhY29uZmlnX3Byb3Rvczo6ZmxhZ19kZWNsYXJhdGlvbjo6dmVyaWZ5X2ZpZWxkcygmZmxhZ19kZWNsYXJhdGlvbikKKyAgICAgICAgICAgICAgICAud2l0aF9jb250ZXh0KHx8IGlucHV0LmVycm9yX2NvbnRleHQoKSk/OworCisgICAgICAgICAgICAvLyBjcmVhdGUgUGFyc2VkRmxhZyB1c2luZyBGbGFnRGVjbGFyYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzCisgICAgICAgICAgICBsZXQgbXV0IHBhcnNlZF9mbGFnID0gUHJvdG9QYXJzZWRGbGFnOjpuZXcoKTsKKyAgICAgICAgICAgIGlmIGxldCBTb21lKGMpID0gY29udGFpbmVyIHsKKyAgICAgICAgICAgICAgICBwYXJzZWRfZmxhZy5zZXRfY29udGFpbmVyKGMudG9fc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X3BhY2thZ2UocGFja2FnZS50b19zdHJpbmcoKSk7CisgICAgICAgICAgICBwYXJzZWRfZmxhZy5zZXRfbmFtZShmbGFnX2RlY2xhcmF0aW9uLnRha2VfbmFtZSgpKTsKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnLnNldF9uYW1lc3BhY2UoZmxhZ19kZWNsYXJhdGlvbi50YWtlX25hbWVzcGFjZSgpKTsKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnLnNldF9kZXNjcmlwdGlvbihmbGFnX2RlY2xhcmF0aW9uLnRha2VfZGVzY3JpcHRpb24oKSk7CisgICAgICAgICAgICBwYXJzZWRfZmxhZy5idWcuYXBwZW5kKCZtdXQgZmxhZ19kZWNsYXJhdGlvbi5idWcpOworICAgICAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X3N0YXRlKERFRkFVTFRfRkxBR19TVEFURSk7CisgICAgICAgICAgICBsZXQgZmxhZ19wZXJtaXNzaW9uID0gaWYgZmxhZ19kZWNsYXJhdGlvbi5pc19maXhlZF9yZWFkX29ubHkoKSB7CisgICAgICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlZmF1bHRfcGVybWlzc2lvbgorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnLnNldF9wZXJtaXNzaW9uKGZsYWdfcGVybWlzc2lvbik7CisgICAgICAgICAgICBwYXJzZWRfZmxhZy5zZXRfaXNfZml4ZWRfcmVhZF9vbmx5KGZsYWdfZGVjbGFyYXRpb24uaXNfZml4ZWRfcmVhZF9vbmx5KCkpOworICAgICAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X2lzX2V4cG9ydGVkKGZsYWdfZGVjbGFyYXRpb24uaXNfZXhwb3J0ZWQoKSk7CisgICAgICAgICAgICBsZXQgbXV0IHRyYWNlcG9pbnQgPSBQcm90b1RyYWNlcG9pbnQ6Om5ldygpOworICAgICAgICAgICAgdHJhY2Vwb2ludC5zZXRfc291cmNlKGlucHV0LnNvdXJjZS5jbG9uZSgpKTsKKyAgICAgICAgICAgIHRyYWNlcG9pbnQuc2V0X3N0YXRlKERFRkFVTFRfRkxBR19TVEFURSk7CisgICAgICAgICAgICB0cmFjZXBvaW50LnNldF9wZXJtaXNzaW9uKGZsYWdfcGVybWlzc2lvbik7CisgICAgICAgICAgICBwYXJzZWRfZmxhZy50cmFjZS5wdXNoKHRyYWNlcG9pbnQpOworCisgICAgICAgICAgICBsZXQgbXV0IG1ldGFkYXRhID0gUHJvdG9GbGFnTWV0YWRhdGE6Om5ldygpOworICAgICAgICAgICAgbGV0IHB1cnBvc2UgPSBmbGFnX2RlY2xhcmF0aW9uLm1ldGFkYXRhLnB1cnBvc2UoKTsKKyAgICAgICAgICAgIG1ldGFkYXRhLnNldF9wdXJwb3NlKHB1cnBvc2UpOworICAgICAgICAgICAgcGFyc2VkX2ZsYWcubWV0YWRhdGEgPSBTb21lKG1ldGFkYXRhKS5pbnRvKCk7CisKKyAgICAgICAgICAgIC8vIHZlcmlmeSBQYXJzZWRGbGFnIGxvb2tzIHJlYXNvbmFibGUKKyAgICAgICAgICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZzo6dmVyaWZ5X2ZpZWxkcygmcGFyc2VkX2ZsYWcpPzsKKworICAgICAgICAgICAgLy8gdmVyaWZ5IFBhcnNlZEZsYWcgY2FuIGJlIGFkZGVkCisgICAgICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgICAgIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5pdGVyKCkuYWxsKHxvdGhlcnwgb3RoZXIubmFtZSgpICE9IHBhcnNlZF9mbGFnLm5hbWUoKSksCisgICAgICAgICAgICAgICAgImZhaWxlZCB0byBkZWNsYXJlIGZsYWcge30gZnJvbSB7fTogZmxhZyBhbHJlYWR5IGRlY2xhcmVkIiwKKyAgICAgICAgICAgICAgICBwYXJzZWRfZmxhZy5uYW1lKCksCisgICAgICAgICAgICAgICAgaW5wdXQuc291cmNlCisgICAgICAgICAgICApOworCisgICAgICAgICAgICAvLyBhZGQgUGFyc2VkRmxhZyB0byBQYXJzZWRGbGFncworICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLnB1c2gocGFyc2VkX2ZsYWcpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIG11dCBpbnB1dCBpbiB2YWx1ZXMgeworICAgICAgICBsZXQgbXV0IGNvbnRlbnRzID0gU3RyaW5nOjpuZXcoKTsKKyAgICAgICAgaW5wdXQKKyAgICAgICAgICAgIC5yZWFkZXIKKyAgICAgICAgICAgIC5yZWFkX3RvX3N0cmluZygmbXV0IGNvbnRlbnRzKQorICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gcmVhZCB7fSIsIGlucHV0LnNvdXJjZSkpPzsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVzID0gYWNvbmZpZ19wcm90b3M6OmZsYWdfdmFsdWVzOjp0cnlfZnJvbV90ZXh0X3Byb3RvKCZjb250ZW50cykKKyAgICAgICAgICAgIC53aXRoX2NvbnRleHQofHwgaW5wdXQuZXJyb3JfY29udGV4dCgpKT87CisgICAgICAgIGZvciBmbGFnX3ZhbHVlIGluIGZsYWdfdmFsdWVzLmZsYWdfdmFsdWUuaW50b19pdGVyKCkgeworICAgICAgICAgICAgYWNvbmZpZ19wcm90b3M6OmZsYWdfdmFsdWU6OnZlcmlmeV9maWVsZHMoJmZsYWdfdmFsdWUpCisgICAgICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBpbnB1dC5lcnJvcl9jb250ZXh0KCkpPzsKKworICAgICAgICAgICAgbGV0IFNvbWUocGFyc2VkX2ZsYWcpID0gcGFyc2VkX2ZsYWdzCisgICAgICAgICAgICAgICAgLnBhcnNlZF9mbGFnCisgICAgICAgICAgICAgICAgLml0ZXJfbXV0KCkKKyAgICAgICAgICAgICAgICAuZmluZCh8cGZ8IHBmLnBhY2thZ2UoKSA9PSBmbGFnX3ZhbHVlLnBhY2thZ2UoKSAmJiBwZi5uYW1lKCkgPT0gZmxhZ192YWx1ZS5uYW1lKCkpCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyAoc2lsZW50bHkpIHNraXAgdW5rbm93biBmbGFncworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgICAgICAhcGFyc2VkX2ZsYWcuaXNfZml4ZWRfcmVhZF9vbmx5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgZmxhZ192YWx1ZS5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLAorICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHBlcm1pc3Npb24gb2YgZmxhZyB7fSwgc2luY2UgdGhpcyBmbGFnIGlzIGZpeGVkIHJlYWQgb25seSBmbGFnIiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlLm5hbWUoKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X3N0YXRlKGZsYWdfdmFsdWUuc3RhdGUoKSk7CisgICAgICAgICAgICBwYXJzZWRfZmxhZy5zZXRfcGVybWlzc2lvbihmbGFnX3ZhbHVlLnBlcm1pc3Npb24oKSk7CisgICAgICAgICAgICBsZXQgbXV0IHRyYWNlcG9pbnQgPSBQcm90b1RyYWNlcG9pbnQ6Om5ldygpOworICAgICAgICAgICAgdHJhY2Vwb2ludC5zZXRfc291cmNlKGlucHV0LnNvdXJjZS5jbG9uZSgpKTsKKyAgICAgICAgICAgIHRyYWNlcG9pbnQuc2V0X3N0YXRlKGZsYWdfdmFsdWUuc3RhdGUoKSk7CisgICAgICAgICAgICB0cmFjZXBvaW50LnNldF9wZXJtaXNzaW9uKGZsYWdfdmFsdWUucGVybWlzc2lvbigpKTsKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnLnRyYWNlLnB1c2godHJhY2Vwb2ludCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBzb3J0ZWQgcGFyc2VkX2ZsYWdzCisgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6c29ydF9wYXJzZWRfZmxhZ3MoJm11dCBwYXJzZWRfZmxhZ3MpOworICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6OnZlcmlmeV9maWVsZHMoJnBhcnNlZF9mbGFncyk/OworICAgIGxldCBtdXQgb3V0cHV0ID0gVmVjOjpuZXcoKTsKKyAgICBwYXJzZWRfZmxhZ3Mud3JpdGVfdG9fdmVjKCZtdXQgb3V0cHV0KT87CisgICAgT2sob3V0cHV0KQorfQorCitwdWIgZm4gY3JlYXRlX2phdmFfbGliKAorICAgIG11dCBpbnB1dDogSW5wdXQsCisgICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKKyAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCispIC0+IFJlc3VsdDxWZWM8T3V0cHV0RmlsZT4+IHsKKyAgICBsZXQgcGFyc2VkX2ZsYWdzID0gaW5wdXQudHJ5X3BhcnNlX2ZsYWdzKCk/OworICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPSBtb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBjb2RlZ2VuX21vZGUpPzsKKyAgICBsZXQgU29tZShwYWNrYWdlKSA9IGZpbmRfdW5pcXVlX3BhY2thZ2UoJm1vZGlmaWVkX3BhcnNlZF9mbGFncykgZWxzZSB7CisgICAgICAgIGJhaWwhKCJubyBwYXJzZWQgZmxhZ3MsIG9yIHRoZSBwYXJzZWQgZmxhZ3MgdXNlIGRpZmZlcmVudCBwYWNrYWdlcyIpOworICAgIH07CisgICAgbGV0IHBhY2thZ2UgPSBwYWNrYWdlLnRvX3N0cmluZygpOworICAgIGxldCBmbGFnX2lkcyA9IGFzc2lnbl9mbGFnX2lkcygmcGFja2FnZSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSk/OworICAgIGdlbmVyYXRlX2phdmFfY29kZSgKKyAgICAgICAgJnBhY2thZ2UsCisgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgY29kZWdlbl9tb2RlLAorICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgICkKK30KKworcHViIGZuIGNyZWF0ZV9jcHBfbGliKAorICAgIG11dCBpbnB1dDogSW5wdXQsCisgICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKKyAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCispIC0+IFJlc3VsdDxWZWM8T3V0cHV0RmlsZT4+IHsKKyAgICAvLyBUT0RPKDMyNzQyMDY3OSk6IEVuYWJsZSBleHBvcnQgbW9kZSBmb3IgbmF0aXZlIGZsYWcgbGlicmFyeQorICAgIGVuc3VyZSEoCisgICAgICAgIGNvZGVnZW5fbW9kZSAhPSBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQsCisgICAgICAgICJFeHBvcnRlZCBtb2RlIGZvciBnZW5lcmF0ZWQgYy9jKysgZmxhZyBsaWJyYXJ5IGlzIGRpc2FibGVkIgorICAgICk7CisgICAgbGV0IHBhcnNlZF9mbGFncyA9IGlucHV0LnRyeV9wYXJzZV9mbGFncygpPzsKKyAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0gbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgY29kZWdlbl9tb2RlKT87CisgICAgbGV0IFNvbWUocGFja2FnZSkgPSBmaW5kX3VuaXF1ZV9wYWNrYWdlKCZtb2RpZmllZF9wYXJzZWRfZmxhZ3MpIGVsc2UgeworICAgICAgICBiYWlsISgibm8gcGFyc2VkIGZsYWdzLCBvciB0aGUgcGFyc2VkIGZsYWdzIHVzZSBkaWZmZXJlbnQgcGFja2FnZXMiKTsKKyAgICB9OworICAgIGxldCBwYWNrYWdlID0gcGFja2FnZS50b19zdHJpbmcoKTsKKyAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMoJnBhY2thZ2UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpPzsKKyAgICBnZW5lcmF0ZV9jcHBfY29kZSgKKyAgICAgICAgJnBhY2thZ2UsCisgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgY29kZWdlbl9tb2RlLAorICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgICkKK30KKworcHViIGZuIGNyZWF0ZV9ydXN0X2xpYigKKyAgICBtdXQgaW5wdXQ6IElucHV0LAorICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCisgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorKSAtPiBSZXN1bHQ8T3V0cHV0RmlsZT4geworICAgIC8vIC8vIFRPRE8oMzI3NDIwNjc5KTogRW5hYmxlIGV4cG9ydCBtb2RlIGZvciBuYXRpdmUgZmxhZyBsaWJyYXJ5CisgICAgZW5zdXJlISgKKyAgICAgICAgY29kZWdlbl9tb2RlICE9IENvZGVnZW5Nb2RlOjpFeHBvcnRlZCwKKyAgICAgICAgIkV4cG9ydGVkIG1vZGUgZm9yIGdlbmVyYXRlZCBydXN0IGZsYWcgbGlicmFyeSBpcyBkaXNhYmxlZCIKKyAgICApOworICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBpbnB1dC50cnlfcGFyc2VfZmxhZ3MoKT87CisgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9IG1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIGNvZGVnZW5fbW9kZSk/OworICAgIGxldCBTb21lKHBhY2thZ2UpID0gZmluZF91bmlxdWVfcGFja2FnZSgmbW9kaWZpZWRfcGFyc2VkX2ZsYWdzKSBlbHNlIHsKKyAgICAgICAgYmFpbCEoIm5vIHBhcnNlZCBmbGFncywgb3IgdGhlIHBhcnNlZCBmbGFncyB1c2UgZGlmZmVyZW50IHBhY2thZ2VzIik7CisgICAgfTsKKyAgICBsZXQgcGFja2FnZSA9IHBhY2thZ2UudG9fc3RyaW5nKCk7CisgICAgbGV0IGZsYWdfaWRzID0gYXNzaWduX2ZsYWdfaWRzKCZwYWNrYWdlLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKT87CisgICAgZ2VuZXJhdGVfcnVzdF9jb2RlKAorICAgICAgICAmcGFja2FnZSwKKyAgICAgICAgZmxhZ19pZHMsCisgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgY29kZWdlbl9tb2RlLAorICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb24sCisgICAgKQorfQorCitwdWIgZm4gY3JlYXRlX3N0b3JhZ2UoCisgICAgY2FjaGVzOiBWZWM8SW5wdXQ+LAorICAgIGNvbnRhaW5lcjogJnN0ciwKKyAgICBmaWxlOiAmU3RvcmFnZUZpbGVUeXBlLAorKSAtPiBSZXN1bHQ8VmVjPHU4Pj4geworICAgIGxldCBwYXJzZWRfZmxhZ3NfdmVjOiBWZWM8UHJvdG9QYXJzZWRGbGFncz4gPQorICAgICAgICBjYWNoZXMuaW50b19pdGVyKCkubWFwKHxtdXQgaW5wdXR8IGlucHV0LnRyeV9wYXJzZV9mbGFncygpKS5jb2xsZWN0Ojo8UmVzdWx0PFZlYzxfPj4+KCk/OworICAgIGdlbmVyYXRlX3N0b3JhZ2VfZmlsZShjb250YWluZXIsIHBhcnNlZF9mbGFnc192ZWMuaXRlcigpLCBmaWxlKQorfQorCitwdWIgZm4gY3JlYXRlX2RldmljZV9jb25maWdfZGVmYXVsdHMobXV0IGlucHV0OiBJbnB1dCkgLT4gUmVzdWx0PFZlYzx1OD4+IHsKKyAgICBsZXQgcGFyc2VkX2ZsYWdzID0gaW5wdXQudHJ5X3BhcnNlX2ZsYWdzKCk/OworICAgIGxldCBtdXQgb3V0cHV0ID0gVmVjOjpuZXcoKTsKKyAgICBmb3IgcGFyc2VkX2ZsYWcgaW4gcGFyc2VkX2ZsYWdzCisgICAgICAgIC5wYXJzZWRfZmxhZworICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgLmZpbHRlcih8cGZ8IHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFKQorICAgIHsKKyAgICAgICAgbGV0IGxpbmUgPSBmb3JtYXQhKAorICAgICAgICAgICAgInt9Ont9PXt9XG4iLAorICAgICAgICAgICAgcGFyc2VkX2ZsYWcubmFtZXNwYWNlKCksCisgICAgICAgICAgICBwYXJzZWRfZmxhZy5mdWxseV9xdWFsaWZpZWRfbmFtZSgpLAorICAgICAgICAgICAgbWF0Y2ggcGFyc2VkX2ZsYWcuc3RhdGUoKSB7CisgICAgICAgICAgICAgICAgUHJvdG9GbGFnU3RhdGU6OkVOQUJMRUQgPT4gImVuYWJsZWQiLAorICAgICAgICAgICAgICAgIFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRCA9PiAiZGlzYWJsZWQiLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBvdXRwdXQuZXh0ZW5kX2Zyb21fc2xpY2UobGluZS5hc19ieXRlcygpKTsKKyAgICB9CisgICAgT2sob3V0cHV0KQorfQorCitwdWIgZm4gY3JlYXRlX2RldmljZV9jb25maWdfc3lzcHJvcHMobXV0IGlucHV0OiBJbnB1dCkgLT4gUmVzdWx0PFZlYzx1OD4+IHsKKyAgICBsZXQgcGFyc2VkX2ZsYWdzID0gaW5wdXQudHJ5X3BhcnNlX2ZsYWdzKCk/OworICAgIGxldCBtdXQgb3V0cHV0ID0gVmVjOjpuZXcoKTsKKyAgICBmb3IgcGFyc2VkX2ZsYWcgaW4gcGFyc2VkX2ZsYWdzCisgICAgICAgIC5wYXJzZWRfZmxhZworICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgLmZpbHRlcih8cGZ8IHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFKQorICAgIHsKKyAgICAgICAgbGV0IGxpbmUgPSBmb3JtYXQhKAorICAgICAgICAgICAgInBlcnNpc3QuZGV2aWNlX2NvbmZpZy57fT17fVxuIiwKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnLmZ1bGx5X3F1YWxpZmllZF9uYW1lKCksCisgICAgICAgICAgICBtYXRjaCBwYXJzZWRfZmxhZy5zdGF0ZSgpIHsKKyAgICAgICAgICAgICAgICBQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCA9PiAidHJ1ZSIsCisgICAgICAgICAgICAgICAgUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVEID0+ICJmYWxzZSIsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIG91dHB1dC5leHRlbmRfZnJvbV9zbGljZShsaW5lLmFzX2J5dGVzKCkpOworICAgIH0KKyAgICBPayhvdXRwdXQpCit9CisKK3B1YiBmbiBkdW1wX3BhcnNlZF9mbGFncygKKyAgICBtdXQgaW5wdXQ6IFZlYzxJbnB1dD4sCisgICAgZm9ybWF0OiBEdW1wRm9ybWF0LAorICAgIGZpbHRlcnM6ICZbJnN0cl0sCisgICAgZGVkdXA6IGJvb2wsCispIC0+IFJlc3VsdDxWZWM8dTg+PiB7CisgICAgbGV0IGluZGl2aWR1YWxseV9wYXJzZWRfZmxhZ3M6IFJlc3VsdDxWZWM8UHJvdG9QYXJzZWRGbGFncz4+ID0KKyAgICAgICAgaW5wdXQuaXRlcl9tdXQoKS5tYXAofGl8IGkudHJ5X3BhcnNlX2ZsYWdzKCkpLmNvbGxlY3QoKTsKKyAgICBsZXQgcGFyc2VkX2ZsYWdzOiBQcm90b1BhcnNlZEZsYWdzID0KKyAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6bWVyZ2UoaW5kaXZpZHVhbGx5X3BhcnNlZF9mbGFncz8sIGRlZHVwKT87CisgICAgbGV0IGZpbHRlcnM6IFZlYzxCb3g8RHVtcFByZWRpY2F0ZT4+ID0gaWYgZmlsdGVycy5pc19lbXB0eSgpIHsKKyAgICAgICAgdmVjIVtCb3g6Om5ldyh8X3wgdHJ1ZSldCisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsdGVycworICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgLm1hcCh8ZnwgY3JhdGU6OmR1bXA6OmNyZWF0ZV9maWx0ZXJfcHJlZGljYXRlKGYpKQorICAgICAgICAgICAgLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPF8+Pj4oKT8KKyAgICB9OworICAgIGNyYXRlOjpkdW1wOjpkdW1wX3BhcnNlZF9mbGFncygKKyAgICAgICAgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmludG9faXRlcigpLmZpbHRlcih8ZmxhZ3wgZmlsdGVycy5pdGVyKCkuYW55KHxwfCBwKGZsYWcpKSksCisgICAgICAgIGZvcm1hdCwKKyAgICApCit9CisKK2ZuIGZpbmRfdW5pcXVlX3BhY2thZ2UocGFyc2VkX2ZsYWdzOiAmW1Byb3RvUGFyc2VkRmxhZ10pIC0+IE9wdGlvbjwmc3RyPiB7CisgICAgbGV0IHBhY2thZ2UgPSBwYXJzZWRfZmxhZ3MuZmlyc3QoKS5tYXAofHBmfCBwZi5wYWNrYWdlKCkpPzsKKyAgICBpZiBwYXJzZWRfZmxhZ3MuaXRlcigpLmFueSh8cGZ8IHBmLnBhY2thZ2UoKSAhPSBwYWNrYWdlKSB7CisgICAgICAgIHJldHVybiBOb25lOworICAgIH0KKyAgICBTb21lKHBhY2thZ2UpCit9CisKK3B1YiBmbiBtb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUoCisgICAgcGFyc2VkX2ZsYWdzOiBQcm90b1BhcnNlZEZsYWdzLAorICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCispIC0+IFJlc3VsdDxWZWM8UHJvdG9QYXJzZWRGbGFnPj4geworICAgIGZuIGV4cG9ydGVkX21vZGVfZmxhZ19tb2RpZmllcihtdXQgcGFyc2VkX2ZsYWc6IFByb3RvUGFyc2VkRmxhZykgLT4gUHJvdG9QYXJzZWRGbGFnIHsKKyAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X3N0YXRlKFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRCk7CisgICAgICAgIHBhcnNlZF9mbGFnLnNldF9wZXJtaXNzaW9uKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUpOworICAgICAgICBwYXJzZWRfZmxhZy5zZXRfaXNfZml4ZWRfcmVhZF9vbmx5KGZhbHNlKTsKKyAgICAgICAgcGFyc2VkX2ZsYWcKKyAgICB9CisKKyAgICBmbiBmb3JjZV9yZWFkX29ubHlfbW9kZV9mbGFnX21vZGlmaWVyKG11dCBwYXJzZWRfZmxhZzogUHJvdG9QYXJzZWRGbGFnKSAtPiBQcm90b1BhcnNlZEZsYWcgeworICAgICAgICBwYXJzZWRfZmxhZy5zZXRfcGVybWlzc2lvbihQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFkpOworICAgICAgICBwYXJzZWRfZmxhZworICAgIH0KKworICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3M6IFZlYzxfPiA9IG1hdGNoIGNvZGVnZW5fbW9kZSB7CisgICAgICAgIENvZGVnZW5Nb2RlOjpFeHBvcnRlZCA9PiBwYXJzZWRfZmxhZ3MKKyAgICAgICAgICAgIC5wYXJzZWRfZmxhZworICAgICAgICAgICAgLmludG9faXRlcigpCisgICAgICAgICAgICAuZmlsdGVyKHxwZnwgcGYuaXNfZXhwb3J0ZWQoKSkKKyAgICAgICAgICAgIC5tYXAoZXhwb3J0ZWRfbW9kZV9mbGFnX21vZGlmaWVyKQorICAgICAgICAgICAgLmNvbGxlY3QoKSwKKyAgICAgICAgQ29kZWdlbk1vZGU6OkZvcmNlUmVhZE9ubHkgPT4gcGFyc2VkX2ZsYWdzCisgICAgICAgICAgICAucGFyc2VkX2ZsYWcKKyAgICAgICAgICAgIC5pbnRvX2l0ZXIoKQorICAgICAgICAgICAgLmZpbHRlcih8cGZ8ICFwZi5pc19leHBvcnRlZCgpKQorICAgICAgICAgICAgLm1hcChmb3JjZV9yZWFkX29ubHlfbW9kZV9mbGFnX21vZGlmaWVyKQorICAgICAgICAgICAgLmNvbGxlY3QoKSwKKyAgICAgICAgQ29kZWdlbk1vZGU6OlByb2R1Y3Rpb24gfCBDb2RlZ2VuTW9kZTo6VGVzdCA9PiB7CisgICAgICAgICAgICBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaW50b19pdGVyKCkuY29sbGVjdCgpCisgICAgICAgIH0KKyAgICB9OworICAgIGlmIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pc19lbXB0eSgpIHsKKyAgICAgICAgYmFpbCEoIntjb2RlZ2VuX21vZGV9IGxpYnJhcnkgY29udGFpbnMgbm8ge2NvZGVnZW5fbW9kZX0gZmxhZ3MiKTsKKyAgICB9CisKKyAgICBPayhtb2RpZmllZF9wYXJzZWRfZmxhZ3MpCit9CisKK3B1YiBmbiBhc3NpZ25fZmxhZ19pZHM8J2EsIEk+KHBhY2thZ2U6ICZzdHIsIHBhcnNlZF9mbGFnc19pdGVyOiBJKSAtPiBSZXN1bHQ8SGFzaE1hcDxTdHJpbmcsIHUxNj4+Cit3aGVyZQorICAgIEk6IEl0ZXJhdG9yPEl0ZW0gPSAmJ2EgUHJvdG9QYXJzZWRGbGFnPiArIENsb25lLAoreworICAgIGFzc2VydCEocGFyc2VkX2ZsYWdzX2l0ZXIuY2xvbmUoKS50dXBsZV93aW5kb3dzKCkuYWxsKHwoYSwgYil8IGEubmFtZSgpIDw9IGIubmFtZSgpKSk7CisgICAgbGV0IG11dCBmbGFnX2lkcyA9IEhhc2hNYXA6Om5ldygpOworICAgIGZvciAoaWRfdG9fYXNzaWduLCBwZikgaW4gKDBfdTMyLi4pLnppcChwYXJzZWRfZmxhZ3NfaXRlcikgeworICAgICAgICBpZiBwYWNrYWdlICE9IHBmLnBhY2thZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gRXJyKGFueWhvdzo6YW55aG93ISgiZW5jb3VudGVyZWQgYSBmbGFnIG5vdCBpbiBjdXJyZW50IHBhY2thZ2UiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdXQgYSBjYXAgb24gaG93IG1hbnkgZmxhZ3MgYSBwYWNrYWdlIGNhbiBjb250YWluIHRvIDY1NTM1CisgICAgICAgIGlmIGlkX3RvX2Fzc2lnbiA+IHUxNjo6TUFYIGFzIHUzMiB7CisgICAgICAgICAgICByZXR1cm4gRXJyKGFueWhvdzo6YW55aG93ISgidGhlIG51bWJlciBvZiBmbGFncyBpbiBhIHBhY2thZ2UgY2Fubm90IGV4Y2VlZCA2NTUzNSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsYWdfaWRzLmluc2VydChwZi5uYW1lKCkudG9fc3RyaW5nKCksIGlkX3RvX2Fzc2lnbiBhcyB1MTYpOworICAgIH0KKyAgICBPayhmbGFnX2lkcykKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvRmxhZ1B1cnBvc2U7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZV9mbGFncygpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzKCk7IC8vIGNhbGxzIHBhcnNlX2ZsYWdzCisgICAgICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6OnZlcmlmeV9maWVsZHMoJnBhcnNlZF9mbGFncykudW53cmFwKCk7CisKKyAgICAgICAgbGV0IGVuYWJsZWRfcm8gPQorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLml0ZXIoKS5maW5kKHxwZnwgcGYubmFtZSgpID09ICJlbmFibGVkX3JvIikudW53cmFwKCk7CisgICAgICAgIGFzc2VydCEoYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnOjp2ZXJpZnlfZmllbGRzKGVuYWJsZWRfcm8pLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiLCBlbmFibGVkX3JvLnBhY2thZ2UoKSk7CisgICAgICAgIGFzc2VydF9lcSEoImVuYWJsZWRfcm8iLCBlbmFibGVkX3JvLm5hbWUoKSk7CisgICAgICAgIGFzc2VydF9lcSEoIlRoaXMgZmxhZyBpcyBFTkFCTEVEICsgUkVBRF9PTkxZIiwgZW5hYmxlZF9yby5kZXNjcmlwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCwgZW5hYmxlZF9yby5zdGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksIGVuYWJsZWRfcm8ucGVybWlzc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQdXJwb3NlOjpQVVJQT1NFX0JVR0ZJWCwgZW5hYmxlZF9yby5tZXRhZGF0YS5wdXJwb3NlKCkpOworICAgICAgICBhc3NlcnRfZXEhKDMsIGVuYWJsZWRfcm8udHJhY2UubGVuKCkpOworICAgICAgICBhc3NlcnQhKCFlbmFibGVkX3JvLmlzX2ZpeGVkX3JlYWRfb25seSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgidGVzdHMvdGVzdC5hY29uZmlnIiwgZW5hYmxlZF9yby50cmFjZVswXS5zb3VyY2UoKSk7CisgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVELCBlbmFibGVkX3JvLnRyYWNlWzBdLnN0YXRlKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUsIGVuYWJsZWRfcm8udHJhY2VbMF0ucGVybWlzc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgidGVzdHMvZmlyc3QudmFsdWVzIiwgZW5hYmxlZF9yby50cmFjZVsxXS5zb3VyY2UoKSk7CisgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVELCBlbmFibGVkX3JvLnRyYWNlWzFdLnN0YXRlKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUsIGVuYWJsZWRfcm8udHJhY2VbMV0ucGVybWlzc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgidGVzdHMvc2Vjb25kLnZhbHVlcyIsIGVuYWJsZWRfcm8udHJhY2VbMl0uc291cmNlKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1N0YXRlOjpFTkFCTEVELCBlbmFibGVkX3JvLnRyYWNlWzJdLnN0YXRlKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwgZW5hYmxlZF9yby50cmFjZVsyXS5wZXJtaXNzaW9uKCkpOworCisgICAgICAgIGFzc2VydF9lcSEoOSwgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmxlbigpKTsKKyAgICAgICAgZm9yIHBmIGluIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5pdGVyKCkgeworICAgICAgICAgICAgaWYgcGYubmFtZSgpLnN0YXJ0c193aXRoKCJlbmFibGVkX2ZpeGVkX3JvIikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV0IGZpcnN0ID0gcGYudHJhY2UuZmlyc3QoKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoREVGQVVMVF9GTEFHX1NUQVRFLCBmaXJzdC5zdGF0ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoREVGQVVMVF9GTEFHX1BFUk1JU1NJT04sIGZpcnN0LnBlcm1pc3Npb24oKSk7CisKKyAgICAgICAgICAgIGxldCBsYXN0ID0gcGYudHJhY2UubGFzdCgpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShwZi5zdGF0ZSgpLCBsYXN0LnN0YXRlKCkpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShwZi5wZXJtaXNzaW9uKCksIGxhc3QucGVybWlzc2lvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBlbmFibGVkX2ZpeGVkX3JvID0KKyAgICAgICAgICAgIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5pdGVyKCkuZmluZCh8cGZ8IHBmLm5hbWUoKSA9PSAiZW5hYmxlZF9maXhlZF9ybyIpLnVud3JhcCgpOworICAgICAgICBhc3NlcnQhKGVuYWJsZWRfZml4ZWRfcm8uaXNfZml4ZWRfcmVhZF9vbmx5KCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1N0YXRlOjpFTkFCTEVELCBlbmFibGVkX2ZpeGVkX3JvLnN0YXRlKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwgZW5hYmxlZF9maXhlZF9yby5wZXJtaXNzaW9uKCkpOworICAgICAgICBhc3NlcnRfZXEhKDIsIGVuYWJsZWRfZml4ZWRfcm8udHJhY2UubGVuKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwgZW5hYmxlZF9maXhlZF9yby50cmFjZVswXS5wZXJtaXNzaW9uKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwgZW5hYmxlZF9maXhlZF9yby50cmFjZVsxXS5wZXJtaXNzaW9uKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3BhcnNlX2ZsYWdzX3NldHRpbmdfZGVmYXVsdCgpIHsKKyAgICAgICAgbGV0IGZpcnN0X2ZsYWcgPSByIyIKKyAgICAgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICAgICAgZmxhZyB7CisgICAgICAgICAgICBuYW1lOiAiZmlyc3QiCisgICAgICAgICAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIgorICAgICAgICAgICAgYnVnOiAiMTIzIgorICAgICAgICB9CisgICAgICAgICIjOworICAgICAgICBsZXQgZGVjbGFyYXRpb24gPQorICAgICAgICAgICAgdmVjIVtJbnB1dCB7IHNvdXJjZTogIm1vbWVyeSIudG9fc3RyaW5nKCksIHJlYWRlcjogQm94OjpuZXcoZmlyc3RfZmxhZy5hc19ieXRlcygpKSB9XTsKKyAgICAgICAgbGV0IHZhbHVlOiBWZWM8SW5wdXQ+ID0gdmVjIVtdOworCisgICAgICAgIGxldCBmbGFnc19ieXRlcyA9IGNyYXRlOjpjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAiY29tLmZpcnN0IiwKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICBkZWNsYXJhdGlvbiwKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9CisgICAgICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmZsYWdzX2J5dGVzKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgxLCBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcubGVuKCkpOworICAgICAgICBsZXQgcGFyc2VkX2ZsYWcgPSBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuZmlyc3QoKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQsIHBhcnNlZF9mbGFnLnN0YXRlKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwgcGFyc2VkX2ZsYWcucGVybWlzc2lvbigpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZV9mbGFnc19wYWNrYWdlX21pc21hdGNoX2JldHdlZW5fZGVjbGFyYXRpb25fYW5kX2NvbW1hbmRfbGluZSgpIHsKKyAgICAgICAgbGV0IGZpcnN0X2ZsYWcgPSByIyIKKyAgICAgICAgcGFja2FnZTogImNvbS5kZWNsYXJhdGlvbi5wYWNrYWdlIgorICAgICAgICBjb250YWluZXI6ICJmaXJzdC5jb250YWluZXIiCisgICAgICAgIGZsYWcgeworICAgICAgICAgICAgbmFtZTogImZpcnN0IgorICAgICAgICAgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgICAgICAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICAgICAgICAgIGJ1ZzogIjEyMyIKKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IGRlY2xhcmF0aW9uID0KKyAgICAgICAgICAgIHZlYyFbSW5wdXQgeyBzb3VyY2U6ICJtZW1vcnkiLnRvX3N0cmluZygpLCByZWFkZXI6IEJveDo6bmV3KGZpcnN0X2ZsYWcuYXNfYnl0ZXMoKSkgfV07CisKKyAgICAgICAgbGV0IHZhbHVlOiBWZWM8SW5wdXQ+ID0gdmVjIVtdOworCisgICAgICAgIGxldCBlcnJvciA9IGNyYXRlOjpjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAiY29tLmFyZ3VtZW50LnBhY2thZ2UiLAorICAgICAgICAgICAgU29tZSgiZmlyc3QuY29udGFpbmVyIiksCisgICAgICAgICAgICBkZWNsYXJhdGlvbiwKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgICJmYWlsZWQgdG8gcGFyc2UgbWVtb3J5OiBleHBlY3RlZCBwYWNrYWdlIGNvbS5hcmd1bWVudC5wYWNrYWdlLCBnb3QgY29tLmRlY2xhcmF0aW9uLnBhY2thZ2UiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3NfY29udGFpbmVyX21pc21hdGNoX2JldHdlZW5fZGVjbGFyYXRpb25fYW5kX2NvbW1hbmRfbGluZSgpIHsKKyAgICAgICAgbGV0IGZpcnN0X2ZsYWcgPSByIyIKKyAgICAgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICAgICAgY29udGFpbmVyOiAiZGVjbGFyYXRpb24uY29udGFpbmVyIgorICAgICAgICBmbGFnIHsKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgICAgICAgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgICAgICAgICBidWc6ICIxMjMiCisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9CisgICAgICAgICAgICB2ZWMhW0lucHV0IHsgc291cmNlOiAibWVtb3J5Ii50b19zdHJpbmcoKSwgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnLmFzX2J5dGVzKCkpIH1dOworCisgICAgICAgIGxldCB2YWx1ZTogVmVjPElucHV0PiA9IHZlYyFbXTsKKworICAgICAgICBsZXQgZXJyb3IgPSBjcmF0ZTo6Y29tbWFuZHM6OnBhcnNlX2ZsYWdzKAorICAgICAgICAgICAgImNvbS5maXJzdCIsCisgICAgICAgICAgICBTb21lKCJhcmd1bWVudC5jb250YWluZXIiKSwKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgImZhaWxlZCB0byBwYXJzZSBtZW1vcnk6IGV4cGVjdGVkIGNvbnRhaW5lciBhcmd1bWVudC5jb250YWluZXIsIGdvdCBkZWNsYXJhdGlvbi5jb250YWluZXIiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3Nfb3ZlcnJpZGVfZml4ZWRfcmVhZF9vbmx5KCkgeworICAgICAgICBsZXQgZmlyc3RfZmxhZyA9IHIjIgorICAgICAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgICAgICBjb250YWluZXI6ICJjb20uZmlyc3QuY29udGFpbmVyIgorICAgICAgICBmbGFnIHsKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgICAgICAgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgICAgICAgICBidWc6ICIxMjMiCisgICAgICAgICAgICBpc19maXhlZF9yZWFkX29ubHk6IHRydWUKKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IGRlY2xhcmF0aW9uID0KKyAgICAgICAgICAgIHZlYyFbSW5wdXQgeyBzb3VyY2U6ICJtZW1vcnkiLnRvX3N0cmluZygpLCByZWFkZXI6IEJveDo6bmV3KGZpcnN0X2ZsYWcuYXNfYnl0ZXMoKSkgfV07CisKKyAgICAgICAgbGV0IGZpcnN0X2ZsYWdfdmFsdWUgPSByIyIKKyAgICAgICAgZmxhZ192YWx1ZSB7CisgICAgICAgICAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgICAgICAgICAgbmFtZTogImZpcnN0IgorICAgICAgICAgICAgc3RhdGU6IERJU0FCTEVECisgICAgICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCB2YWx1ZSA9IHZlYyFbSW5wdXQgeworICAgICAgICAgICAgc291cmNlOiAibWVtb3J5Ii50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIHJlYWRlcjogQm94OjpuZXcoZmlyc3RfZmxhZ192YWx1ZS5hc19ieXRlcygpKSwKKyAgICAgICAgfV07CisgICAgICAgIGxldCBlcnJvciA9IGNyYXRlOjpjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAiY29tLmZpcnN0IiwKKyAgICAgICAgICAgIFNvbWUoImNvbS5maXJzdC5jb250YWluZXIiKSwKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgcGVybWlzc2lvbiBvZiBmbGFnIGZpcnN0LCBzaW5jZSB0aGlzIGZsYWcgaXMgZml4ZWQgcmVhZCBvbmx5IGZsYWciCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3NfbWV0YWRhdGEoKSB7CisgICAgICAgIGxldCBtZXRhZGF0YV9mbGFnID0gciMiCisgICAgICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgICAgIGZsYWcgeworICAgICAgICAgICAgbmFtZTogImZpcnN0IgorICAgICAgICAgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgICAgICAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmVhdHVyZSBmbGFnLiIKKyAgICAgICAgICAgIGJ1ZzogIjEyMyIKKyAgICAgICAgICAgIG1ldGFkYXRhIHsKKyAgICAgICAgICAgICAgICBwdXJwb3NlOiBQVVJQT1NFX0ZFQVRVUkUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IGRlY2xhcmF0aW9uID0gdmVjIVtJbnB1dCB7CisgICAgICAgICAgICBzb3VyY2U6ICJtZW1vcnkiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhtZXRhZGF0YV9mbGFnLmFzX2J5dGVzKCkpLAorICAgICAgICB9XTsKKyAgICAgICAgbGV0IHZhbHVlOiBWZWM8SW5wdXQ+ID0gdmVjIVtdOworCisgICAgICAgIGxldCBmbGFnc19ieXRlcyA9IGNyYXRlOjpjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAiY29tLmZpcnN0IiwKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICBkZWNsYXJhdGlvbiwKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9CisgICAgICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmZsYWdzX2J5dGVzKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgxLCBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcubGVuKCkpOworICAgICAgICBsZXQgcGFyc2VkX2ZsYWcgPSBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuZmlyc3QoKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQdXJwb3NlOjpQVVJQT1NFX0ZFQVRVUkUsIHBhcnNlZF9mbGFnLm1ldGFkYXRhLnB1cnBvc2UoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfY3JlYXRlX2RldmljZV9jb25maWdfZGVmYXVsdHMoKSB7CisgICAgICAgIGxldCBpbnB1dCA9IHBhcnNlX3Rlc3RfZmxhZ3NfYXNfaW5wdXQoKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gY3JlYXRlX2RldmljZV9jb25maWdfZGVmYXVsdHMoaW5wdXQpLnVud3JhcCgpOworICAgICAgICBsZXQgdGV4dCA9IHN0ZDo6c3RyOjpmcm9tX3V0ZjgoJmJ5dGVzKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgiYWNvbmZpZ190ZXN0OmNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydz1kaXNhYmxlZFxuYWNvbmZpZ190ZXN0OmNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZD1kaXNhYmxlZFxub3RoZXJfbmFtZXNwYWNlOmNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2U9ZGlzYWJsZWRcbmFjb25maWdfdGVzdDpjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydz1lbmFibGVkXG4iLCB0ZXh0KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9jcmVhdGVfZGV2aWNlX2NvbmZpZ19zeXNwcm9wcygpIHsKKyAgICAgICAgbGV0IGlucHV0ID0gcGFyc2VfdGVzdF9mbGFnc19hc19pbnB1dCgpOworICAgICAgICBsZXQgYnl0ZXMgPSBjcmVhdGVfZGV2aWNlX2NvbmZpZ19zeXNwcm9wcyhpbnB1dCkudW53cmFwKCk7CisgICAgICAgIGxldCB0ZXh0ID0gc3RkOjpzdHI6OmZyb21fdXRmOCgmYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKCJwZXJzaXN0LmRldmljZV9jb25maWcuY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3PWZhbHNlXG5wZXJzaXN0LmRldmljZV9jb25maWcuY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkPWZhbHNlXG5wZXJzaXN0LmRldmljZV9jb25maWcuY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZT1mYWxzZVxucGVyc2lzdC5kZXZpY2VfY29uZmlnLmNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3PXRydWVcbiIsIHRleHQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2R1bXAoKSB7CisgICAgICAgIGxldCBpbnB1dCA9IHBhcnNlX3Rlc3RfZmxhZ3NfYXNfaW5wdXQoKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gZHVtcF9wYXJzZWRfZmxhZ3MoCisgICAgICAgICAgICB2ZWMhW2lucHV0XSwKKyAgICAgICAgICAgIER1bXBGb3JtYXQ6OkN1c3RvbSgie2Z1bGx5X3F1YWxpZmllZF9uYW1lfSIudG9fc3RyaW5nKCkpLAorICAgICAgICAgICAgJltdLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgdGV4dCA9IHN0ZDo6c3RyOjpmcm9tX3V0ZjgoJmJ5dGVzKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0ISh0ZXh0LmNvbnRhaW5zKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcm8iKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZHVtcF90ZXh0cHJvdG9fZm9ybWF0X2RlZHVwKCkgeworICAgICAgICBsZXQgaW5wdXQgPSBwYXJzZV90ZXN0X2ZsYWdzX2FzX2lucHV0KCk7CisgICAgICAgIGxldCBpbnB1dDIgPSBwYXJzZV90ZXN0X2ZsYWdzX2FzX2lucHV0KCk7CisgICAgICAgIGxldCBieXRlcyA9CisgICAgICAgICAgICBkdW1wX3BhcnNlZF9mbGFncyh2ZWMhW2lucHV0LCBpbnB1dDJdLCBEdW1wRm9ybWF0OjpUZXh0cHJvdG8sICZbXSwgdHJ1ZSkudW53cmFwKCk7CisgICAgICAgIGxldCB0ZXh0ID0gc3RkOjpzdHI6OmZyb21fdXRmOCgmYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoCisgICAgICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfRkxBR1NfVEVYVFBST1RPLnRyaW0oKSwKKyAgICAgICAgICAgICAgICB0ZXh0LnRyaW0oKQorICAgICAgICAgICAgKQorICAgICAgICApOworICAgIH0KKworICAgIGZuIHBhcnNlX3Rlc3RfZmxhZ3NfYXNfaW5wdXQoKSAtPiBJbnB1dCB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgYmluYXJ5X3Byb3RvID0gcGFyc2VkX2ZsYWdzLndyaXRlX3RvX2J5dGVzKCkudW53cmFwKCk7CisgICAgICAgIGxldCBjdXJzb3IgPSBzdGQ6OmlvOjpDdXJzb3I6Om5ldyhiaW5hcnlfcHJvdG8pOworICAgICAgICBsZXQgcmVhZGVyID0gQm94OjpuZXcoY3Vyc29yKTsKKyAgICAgICAgSW5wdXQgeyBzb3VyY2U6ICJ0ZXN0LmRhdGEiLnRvX3N0cmluZygpLCByZWFkZXIgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X21vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZV9wcm9kKCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IHBfcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgICAgIG1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MuY2xvbmUoKSwgQ29kZWdlbk1vZGU6OlByb2R1Y3Rpb24pCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5sZW4oKSwgcF9wYXJzZWRfZmxhZ3MubGVuKCkpOworICAgICAgICBmb3IgKGksIGl0ZW0pIGluIHBfcGFyc2VkX2ZsYWdzLml0ZXIoKS5lbnVtZXJhdGUoKSB7CisgICAgICAgICAgICBhc3NlcnQhKHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZ1tpXS5lcShpdGVtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9tb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGVfZXhwb3J0ZWQoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgcF9wYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgQ29kZWdlbk1vZGU6OkV4cG9ydGVkKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgzLCBwX3BhcnNlZF9mbGFncy5sZW4oKSk7CisgICAgICAgIGZvciBmbGFnIGluIHBfcGFyc2VkX2ZsYWdzLml0ZXIoKSB7CisgICAgICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRCwgZmxhZy5zdGF0ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwgZmxhZy5wZXJtaXNzaW9uKCkpOworICAgICAgICAgICAgYXNzZXJ0ISghZmxhZy5pc19maXhlZF9yZWFkX29ubHkoKSk7CisgICAgICAgICAgICBhc3NlcnQhKGZsYWcuaXNfZXhwb3J0ZWQoKSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5yZXRhaW4ofHBmfCAhcGYuaXNfZXhwb3J0ZWQoKSk7CisgICAgICAgIGxldCBlcnJvciA9CisgICAgICAgICAgICBtb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQpLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgiZXhwb3J0ZWQgbGlicmFyeSBjb250YWlucyBubyBleHBvcnRlZCBmbGFncyIsIGZvcm1hdCEoIns6P30iLCBlcnJvcikpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2Fzc2lnbl9mbGFnX2lkcygpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBwYWNrYWdlID0gZmluZF91bmlxdWVfcGFja2FnZSgmcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnKS51bndyYXAoKS50b19zdHJpbmcoKTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0gYXNzaWduX2ZsYWdfaWRzKCZwYWNrYWdlLCBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2ZsYWdfaWRzID0gSGFzaE1hcDo6ZnJvbShbCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9ybyIpLCAwX3UxNiksCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9ydyIpLCAxX3UxNiksCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9yd19leHBvcnRlZCIpLCAyX3UxNiksCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiKSwgM191MTYpLAorICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9maXhlZF9ybyIpLCA0X3UxNiksCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiksIDVfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImVuYWJsZWRfcm8iKSwgNl91MTYpLAorICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9yb19leHBvcnRlZCIpLCA3X3UxNiksCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX3J3IiksIDhfdTE2KSwKKyAgICAgICAgXSk7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19pZHMsIGV4cGVjdGVkX2ZsYWdfaWRzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9tb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGVfZm9yY2VfcmVhZF9vbmx5KCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IHBfcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgICAgIG1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MuY2xvbmUoKSwgQ29kZWdlbk1vZGU6OkZvcmNlUmVhZE9ubHkpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKDYsIHBfcGFyc2VkX2ZsYWdzLmxlbigpKTsKKyAgICAgICAgZm9yIHBmIGluIHBfcGFyc2VkX2ZsYWdzIHsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLCBwZi5wZXJtaXNzaW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcucmV0YWluX211dCh8cGZ8IHBmLmlzX2V4cG9ydGVkKCkpOworICAgICAgICBsZXQgZXJyb3IgPSBtb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBDb2RlZ2VuTW9kZTo6Rm9yY2VSZWFkT25seSkKKyAgICAgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICAiZm9yY2UtcmVhZC1vbmx5IGxpYnJhcnkgY29udGFpbnMgbm8gZm9yY2UtcmVhZC1vbmx5IGZsYWdzIiwKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvcikKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2R1bXAucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2R1bXAucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyOWMyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvZHVtcC5ycwpAQCAtMCwwICsxLDQwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzZSBhY29uZmlnX3Byb3Rvczo6eworICAgIFBhcnNlZEZsYWdFeHQsIFByb3RvRmxhZ01ldGFkYXRhLCBQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZSwgUHJvdG9UcmFjZXBvaW50LAorfTsKK3VzZSBhY29uZmlnX3Byb3Rvczo6e1Byb3RvUGFyc2VkRmxhZywgUHJvdG9QYXJzZWRGbGFnc307Cit1c2UgYW55aG93Ojp7YW55aG93LCBiYWlsLCBDb250ZXh0LCBSZXN1bHR9OwordXNlIHByb3RvYnVmOjpNZXNzYWdlOworCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIFBhcnRpYWxFcSwgRXEpXQorcHViIGVudW0gRHVtcEZvcm1hdCB7CisgICAgUHJvdG9idWYsCisgICAgVGV4dHByb3RvLAorICAgIEN1c3RvbShTdHJpbmcpLAorfQorCitpbXBsIFRyeUZyb208JnN0cj4gZm9yIER1bXBGb3JtYXQgeworICAgIHR5cGUgRXJyb3IgPSBhbnlob3c6OkVycm9yOworCisgICAgZm4gdHJ5X2Zyb20odmFsdWU6ICZzdHIpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyb3I+IHsKKyAgICAgICAgbWF0Y2ggdmFsdWUgeworICAgICAgICAgICAgLy8gcHJvdG9idWYgZm9ybWF0cworICAgICAgICAgICAgInByb3RvYnVmIiA9PiBPayhTZWxmOjpQcm90b2J1ZiksCisgICAgICAgICAgICAidGV4dHByb3RvIiA9PiBPayhTZWxmOjpUZXh0cHJvdG8pLAorICAgICAgICAgICAgLy8gY3VzdG9tIGZvcm1hdAorICAgICAgICAgICAgXyA9PiBPayhTZWxmOjpDdXN0b20odmFsdWUudG9fb3duZWQoKSkpLAorICAgICAgICB9CisgICAgfQorfQorCitwdWIgZm4gZHVtcF9wYXJzZWRfZmxhZ3M8ST4ocGFyc2VkX2ZsYWdzX2l0ZXI6IEksIGZvcm1hdDogRHVtcEZvcm1hdCkgLT4gUmVzdWx0PFZlYzx1OD4+Cit3aGVyZQorICAgIEk6IEl0ZXJhdG9yPEl0ZW0gPSBQcm90b1BhcnNlZEZsYWc+LAoreworICAgIGxldCBtdXQgb3V0cHV0ID0gVmVjOjpuZXcoKTsKKyAgICBtYXRjaCBmb3JtYXQgeworICAgICAgICBEdW1wRm9ybWF0OjpQcm90b2J1ZiA9PiB7CisgICAgICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgICAgICAgICBQcm90b1BhcnNlZEZsYWdzIHsgcGFyc2VkX2ZsYWc6IHBhcnNlZF9mbGFnc19pdGVyLmNvbGxlY3QoKSwgLi5EZWZhdWx0OjpkZWZhdWx0KCkgfTsKKyAgICAgICAgICAgIHBhcnNlZF9mbGFncy53cml0ZV90b192ZWMoJm11dCBvdXRwdXQpPzsKKyAgICAgICAgfQorICAgICAgICBEdW1wRm9ybWF0OjpUZXh0cHJvdG8gPT4geworICAgICAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9CisgICAgICAgICAgICAgICAgUHJvdG9QYXJzZWRGbGFncyB7IHBhcnNlZF9mbGFnOiBwYXJzZWRfZmxhZ3NfaXRlci5jb2xsZWN0KCksIC4uRGVmYXVsdDo6ZGVmYXVsdCgpIH07CisgICAgICAgICAgICBsZXQgcyA9IHByb3RvYnVmOjp0ZXh0X2Zvcm1hdDo6cHJpbnRfdG9fc3RyaW5nX3ByZXR0eSgmcGFyc2VkX2ZsYWdzKTsKKyAgICAgICAgICAgIG91dHB1dC5leHRlbmRfZnJvbV9zbGljZShzLmFzX2J5dGVzKCkpOworICAgICAgICB9CisgICAgICAgIER1bXBGb3JtYXQ6OkN1c3RvbShmb3JtYXQpID0+IHsKKyAgICAgICAgICAgIGZvciBmbGFnIGluIHBhcnNlZF9mbGFnc19pdGVyIHsKKyAgICAgICAgICAgICAgICBkdW1wX2N1c3RvbV9mb3JtYXQoJmZsYWcsICZmb3JtYXQsICZtdXQgb3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBPayhvdXRwdXQpCit9CisKK2ZuIGR1bXBfY3VzdG9tX2Zvcm1hdChmbGFnOiAmUHJvdG9QYXJzZWRGbGFnLCBmb3JtYXQ6ICZzdHIsIG91dHB1dDogJm11dCBWZWM8dTg+KSB7CisgICAgZm4gZm9ybWF0X3RyYWNlKHRyYWNlOiAmW1Byb3RvVHJhY2Vwb2ludF0pIC0+IFN0cmluZyB7CisgICAgICAgIHRyYWNlCisgICAgICAgICAgICAuaXRlcigpCisgICAgICAgICAgICAubWFwKHx0cmFjZXBvaW50fCB7CisgICAgICAgICAgICAgICAgZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAgICAgInt9OiB7Oj99ICsgezo/fSIsCisgICAgICAgICAgICAgICAgICAgIHRyYWNlcG9pbnQuc291cmNlKCksCisgICAgICAgICAgICAgICAgICAgIHRyYWNlcG9pbnQucGVybWlzc2lvbigpLAorICAgICAgICAgICAgICAgICAgICB0cmFjZXBvaW50LnN0YXRlKCkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmNvbGxlY3Q6OjxWZWM8Xz4+KCkKKyAgICAgICAgICAgIC5qb2luKCIsICIpCisgICAgfQorCisgICAgZm4gZm9ybWF0X3RyYWNlX3BhdGhzKHRyYWNlOiAmW1Byb3RvVHJhY2Vwb2ludF0pIC0+IFN0cmluZyB7CisgICAgICAgIHRyYWNlLml0ZXIoKS5tYXAofHRyYWNlcG9pbnR8IHRyYWNlcG9pbnQuc291cmNlKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkuam9pbigiLCAiKQorICAgIH0KKworICAgIGZuIGZvcm1hdF9tZXRhZGF0YShtZXRhZGF0YTogJlByb3RvRmxhZ01ldGFkYXRhKSAtPiBTdHJpbmcgeworICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgbWV0YWRhdGEucHVycG9zZSgpKQorICAgIH0KKworICAgIGxldCBtdXQgc3RyID0gZm9ybWF0CisgICAgICAgIC8vIFByb3RvUGFyc2VkRmxhZyBmaWVsZHMKKyAgICAgICAgLnJlcGxhY2UoIntwYWNrYWdlfSIsIGZsYWcucGFja2FnZSgpKQorICAgICAgICAucmVwbGFjZSgie25hbWV9IiwgZmxhZy5uYW1lKCkpCisgICAgICAgIC5yZXBsYWNlKCJ7bmFtZXNwYWNlfSIsIGZsYWcubmFtZXNwYWNlKCkpCisgICAgICAgIC5yZXBsYWNlKCJ7ZGVzY3JpcHRpb259IiwgZmxhZy5kZXNjcmlwdGlvbigpKQorICAgICAgICAucmVwbGFjZSgie2J1Z30iLCAmZmxhZy5idWcuam9pbigiLCAiKSkKKyAgICAgICAgLnJlcGxhY2UoIntzdGF0ZX0iLCAmZm9ybWF0ISgiezo/fSIsIGZsYWcuc3RhdGUoKSkpCisgICAgICAgIC5yZXBsYWNlKCJ7c3RhdGU6Ym9vbH0iLCAmZm9ybWF0ISgie30iLCBmbGFnLnN0YXRlKCkgPT0gUHJvdG9GbGFnU3RhdGU6OkVOQUJMRUQpKQorICAgICAgICAucmVwbGFjZSgie3Blcm1pc3Npb259IiwgJmZvcm1hdCEoIns6P30iLCBmbGFnLnBlcm1pc3Npb24oKSkpCisgICAgICAgIC5yZXBsYWNlKCJ7dHJhY2V9IiwgJmZvcm1hdF90cmFjZSgmZmxhZy50cmFjZSkpCisgICAgICAgIC5yZXBsYWNlKCJ7dHJhY2U6cGF0aHN9IiwgJmZvcm1hdF90cmFjZV9wYXRocygmZmxhZy50cmFjZSkpCisgICAgICAgIC5yZXBsYWNlKCJ7aXNfZml4ZWRfcmVhZF9vbmx5fSIsICZmb3JtYXQhKCJ7fSIsIGZsYWcuaXNfZml4ZWRfcmVhZF9vbmx5KCkpKQorICAgICAgICAucmVwbGFjZSgie2lzX2V4cG9ydGVkfSIsICZmb3JtYXQhKCJ7fSIsIGZsYWcuaXNfZXhwb3J0ZWQoKSkpCisgICAgICAgIC5yZXBsYWNlKCJ7Y29udGFpbmVyfSIsIGZsYWcuY29udGFpbmVyKCkpCisgICAgICAgIC5yZXBsYWNlKCJ7bWV0YWRhdGF9IiwgJmZvcm1hdF9tZXRhZGF0YSgmZmxhZy5tZXRhZGF0YSkpCisgICAgICAgIC8vIFBhcnNlZEZsYWdFeHQgZnVuY3Rpb25zCisgICAgICAgIC5yZXBsYWNlKCJ7ZnVsbHlfcXVhbGlmaWVkX25hbWV9IiwgJmZsYWcuZnVsbHlfcXVhbGlmaWVkX25hbWUoKSk7CisgICAgc3RyLnB1c2goJ1xuJyk7CisgICAgb3V0cHV0LmV4dGVuZF9mcm9tX3NsaWNlKHN0ci5hc19ieXRlcygpKTsKK30KKworcHViIHR5cGUgRHVtcFByZWRpY2F0ZSA9IGR5biBGbigmUHJvdG9QYXJzZWRGbGFnKSAtPiBib29sOworCitwdWIgZm4gY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUoZmlsdGVyOiAmc3RyKSAtPiBSZXN1bHQ8Qm94PER1bXBQcmVkaWNhdGU+PiB7CisgICAgbGV0IHByZWRpY2F0ZXMgPSBmaWx0ZXIKKyAgICAgICAgLnNwbGl0KCcrJykKKyAgICAgICAgLm1hcCh8c3ViX2ZpbHRlcnwgY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGVfc2luZ2xlKHN1Yl9maWx0ZXIpKQorICAgICAgICAuY29sbGVjdDo6PFJlc3VsdDxWZWM8Xz4+PigpPzsKKyAgICBPayhCb3g6Om5ldyhtb3ZlIHxmbGFnfCBwcmVkaWNhdGVzLml0ZXIoKS5hbGwofHB8IHAoZmxhZykpKSkKK30KKworZm4gY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGVfc2luZ2xlKGZpbHRlcjogJnN0cikgLT4gUmVzdWx0PEJveDxEdW1wUHJlZGljYXRlPj4geworICAgIGZuIGVudW1fZnJvbV9zdHI8VD4oZXhwZWN0ZWQ6ICZbVF0sIHM6ICZzdHIpIC0+IFJlc3VsdDxUPgorICAgIHdoZXJlCisgICAgICAgIFQ6IHN0ZDo6Zm10OjpEZWJ1ZyArIENvcHksCisgICAgeworICAgICAgICBmb3IgY2FuZGlkYXRlIGluIGV4cGVjdGVkLml0ZXIoKSB7CisgICAgICAgICAgICBpZiBzID09IGZvcm1hdCEoIns6P30iLCBjYW5kaWRhdGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT2soKmNhbmRpZGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGV0IGV4cGVjdGVkID0KKyAgICAgICAgICAgIGV4cGVjdGVkLml0ZXIoKS5tYXAofHN0YXRlfCBmb3JtYXQhKCJ7Oj99Iiwgc3RhdGUpKS5jb2xsZWN0Ojo8VmVjPF8+PigpLmpvaW4oIiwgIik7CisgICAgICAgIGJhaWwhKCJcIntzfVwiOiBub3QgYSB2YWxpZCBmbGFnIHN0YXRlLCBleHBlY3RlZCBvbmUgb2Yge2V4cGVjdGVkfSIpOworICAgIH0KKworICAgIGxldCBlcnJvcl9tc2cgPSBmb3JtYXQhKCJcIntmaWx0ZXJ9XCI6IGZpbHRlciBzeW50YXggZXJyb3IiKTsKKyAgICBsZXQgKHdoYXQsIGFyZykgPSBmaWx0ZXIuc3BsaXRfb25jZSgnOicpLm9rX29yX2Vsc2UofHwgYW55aG93IShlcnJvcl9tc2cuY2xvbmUoKSkpPzsKKyAgICBtYXRjaCB3aGF0IHsKKyAgICAgICAgInBhY2thZ2UiID0+IHsKKyAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IGFyZy50b19vd25lZCgpOworICAgICAgICAgICAgT2soQm94OjpuZXcobW92ZSB8ZmxhZzogJlByb3RvUGFyc2VkRmxhZ3wgZmxhZy5wYWNrYWdlKCkgPT0gZXhwZWN0ZWQpKQorICAgICAgICB9CisgICAgICAgICJuYW1lIiA9PiB7CisgICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSBhcmcudG9fb3duZWQoKTsKKyAgICAgICAgICAgIE9rKEJveDo6bmV3KG1vdmUgfGZsYWc6ICZQcm90b1BhcnNlZEZsYWd8IGZsYWcubmFtZSgpID09IGV4cGVjdGVkKSkKKyAgICAgICAgfQorICAgICAgICAibmFtZXNwYWNlIiA9PiB7CisgICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSBhcmcudG9fb3duZWQoKTsKKyAgICAgICAgICAgIE9rKEJveDo6bmV3KG1vdmUgfGZsYWc6ICZQcm90b1BhcnNlZEZsYWd8IGZsYWcubmFtZXNwYWNlKCkgPT0gZXhwZWN0ZWQpKQorICAgICAgICB9CisgICAgICAgIC8vIGRlc2NyaXB0aW9uOiBub3Qgc3VwcG9ydGVkIHlldAorICAgICAgICAiYnVnIiA9PiB7CisgICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSBhcmcudG9fb3duZWQoKTsKKyAgICAgICAgICAgIE9rKEJveDo6bmV3KG1vdmUgfGZsYWc6ICZQcm90b1BhcnNlZEZsYWd8IGZsYWcuYnVnLmpvaW4oIiwgIikgPT0gZXhwZWN0ZWQpKQorICAgICAgICB9CisgICAgICAgICJzdGF0ZSIgPT4geworICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gZW51bV9mcm9tX3N0cigmW1Byb3RvRmxhZ1N0YXRlOjpFTkFCTEVELCBQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRURdLCBhcmcpCisgICAgICAgICAgICAgICAgLmNvbnRleHQoZXJyb3JfbXNnKT87CisgICAgICAgICAgICBPayhCb3g6Om5ldyhtb3ZlIHxmbGFnOiAmUHJvdG9QYXJzZWRGbGFnfCBmbGFnLnN0YXRlKCkgPT0gZXhwZWN0ZWQpKQorICAgICAgICB9CisgICAgICAgICJwZXJtaXNzaW9uIiA9PiB7CisgICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSBlbnVtX2Zyb21fc3RyKAorICAgICAgICAgICAgICAgICZbUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLCBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFXSwKKyAgICAgICAgICAgICAgICBhcmcsCisgICAgICAgICAgICApCisgICAgICAgICAgICAuY29udGV4dChlcnJvcl9tc2cpPzsKKyAgICAgICAgICAgIE9rKEJveDo6bmV3KG1vdmUgfGZsYWc6ICZQcm90b1BhcnNlZEZsYWd8IGZsYWcucGVybWlzc2lvbigpID09IGV4cGVjdGVkKSkKKyAgICAgICAgfQorICAgICAgICAvLyB0cmFjZTogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgImlzX2ZpeGVkX3JlYWRfb25seSIgPT4geworICAgICAgICAgICAgbGV0IGV4cGVjdGVkOiBib29sID0gYXJnLnBhcnNlKCkuY29udGV4dChlcnJvcl9tc2cpPzsKKyAgICAgICAgICAgIE9rKEJveDo6bmV3KG1vdmUgfGZsYWc6ICZQcm90b1BhcnNlZEZsYWd8IGZsYWcuaXNfZml4ZWRfcmVhZF9vbmx5KCkgPT0gZXhwZWN0ZWQpKQorICAgICAgICB9CisgICAgICAgICJpc19leHBvcnRlZCIgPT4geworICAgICAgICAgICAgbGV0IGV4cGVjdGVkOiBib29sID0gYXJnLnBhcnNlKCkuY29udGV4dChlcnJvcl9tc2cpPzsKKyAgICAgICAgICAgIE9rKEJveDo6bmV3KG1vdmUgfGZsYWc6ICZQcm90b1BhcnNlZEZsYWd8IGZsYWcuaXNfZXhwb3J0ZWQoKSA9PSBleHBlY3RlZCkpCisgICAgICAgIH0KKyAgICAgICAgImNvbnRhaW5lciIgPT4geworICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gYXJnLnRvX293bmVkKCk7CisgICAgICAgICAgICBPayhCb3g6Om5ldyhtb3ZlIHxmbGFnOiAmUHJvdG9QYXJzZWRGbGFnfCBmbGFnLmNvbnRhaW5lcigpID09IGV4cGVjdGVkKSkKKyAgICAgICAgfQorICAgICAgICAvLyBtZXRhZGF0YTogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgImZ1bGx5X3F1YWxpZmllZF9uYW1lIiA9PiB7CisgICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSBhcmcudG9fb3duZWQoKTsKKyAgICAgICAgICAgIE9rKEJveDo6bmV3KG1vdmUgfGZsYWc6ICZQcm90b1BhcnNlZEZsYWd8IGZsYWcuZnVsbHlfcXVhbGlmaWVkX25hbWUoKSA9PSBleHBlY3RlZCkpCisgICAgICAgIH0KKyAgICAgICAgXyA9PiBFcnIoYW55aG93IShlcnJvcl9tc2cpKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzOworICAgIHVzZSBhY29uZmlnX3Byb3Rvczo6UHJvdG9QYXJzZWRGbGFnczsKKyAgICB1c2UgcHJvdG9idWY6Ok1lc3NhZ2U7CisKKyAgICBmbiBwYXJzZV9lbmFibGVkX3JvX2ZsYWcoKSAtPiBQcm90b1BhcnNlZEZsYWcgeworICAgICAgICBwYXJzZV90ZXN0X2ZsYWdzKCkucGFyc2VkX2ZsYWcuaW50b19pdGVyKCkuZmluZCh8cGZ8IHBmLm5hbWUoKSA9PSAiZW5hYmxlZF9ybyIpLnVud3JhcCgpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZHVtcGZvcm1hdF9mcm9tX3N0cigpIHsKKyAgICAgICAgLy8gc3VwcG9ydGVkIGZvcm1hdCB0eXBlcworICAgICAgICBhc3NlcnRfZXEhKER1bXBGb3JtYXQ6OnRyeV9mcm9tKCJwcm90b2J1ZiIpLnVud3JhcCgpLCBEdW1wRm9ybWF0OjpQcm90b2J1Zik7CisgICAgICAgIGFzc2VydF9lcSEoRHVtcEZvcm1hdDo6dHJ5X2Zyb20oInRleHRwcm90byIpLnVud3JhcCgpLCBEdW1wRm9ybWF0OjpUZXh0cHJvdG8pOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgRHVtcEZvcm1hdDo6dHJ5X2Zyb20oImZvb2JhciIpLnVud3JhcCgpLAorICAgICAgICAgICAgRHVtcEZvcm1hdDo6Q3VzdG9tKCJmb29iYXIiLnRvX293bmVkKCkpCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZHVtcF9wYXJzZWRfZmxhZ3NfcHJvdG9idWZfZm9ybWF0KCkgeworICAgICAgICBsZXQgZXhwZWN0ZWQgPSBwcm90b2J1Zjo6dGV4dF9mb3JtYXQ6OnBhcnNlX2Zyb21fc3RyOjo8UHJvdG9QYXJzZWRGbGFncz4oCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9GTEFHU19URVhUUFJPVE8sCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpCisgICAgICAgIC53cml0ZV90b19ieXRlcygpCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IHBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IGFjdHVhbCA9CisgICAgICAgICAgICBkdW1wX3BhcnNlZF9mbGFncyhwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaW50b19pdGVyKCksIER1bXBGb3JtYXQ6OlByb3RvYnVmKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9kdW1wX3BhcnNlZF9mbGFnc190ZXh0cHJvdG9fZm9ybWF0KCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gcGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgYnl0ZXMgPQorICAgICAgICAgICAgZHVtcF9wYXJzZWRfZmxhZ3MocGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmludG9faXRlcigpLCBEdW1wRm9ybWF0OjpUZXh0cHJvdG8pLnVud3JhcCgpOworICAgICAgICBsZXQgdGV4dCA9IHN0ZDo6c3RyOjpmcm9tX3V0ZjgoJmJ5dGVzKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShjcmF0ZTo6dGVzdDo6VEVTVF9GTEFHU19URVhUUFJPVE8udHJpbSgpLCB0ZXh0LnRyaW0oKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZHVtcF9wYXJzZWRfZmxhZ3NfY3VzdG9tX2Zvcm1hdCgpIHsKKyAgICAgICAgbWFjcm9fcnVsZXMhIGFzc2VydF9kdW1wX3BhcnNlZF9mbGFnc19jdXN0b21fZm9ybWF0X2NvbnRhaW5zIHsKKyAgICAgICAgICAgICgkZm9ybWF0OmV4cHIsICRleHBlY3RlZDpleHByKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IHBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgICAgICAgICBsZXQgYnl0ZXMgPSBkdW1wX3BhcnNlZF9mbGFncygKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmludG9faXRlcigpLAorICAgICAgICAgICAgICAgICAgICAkZm9ybWF0LnRyeV9pbnRvKCkudW53cmFwKCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IHN0ZDo6c3RyOjpmcm9tX3V0ZjgoJmJ5dGVzKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQhKHRleHQuY29udGFpbnMoJGV4cGVjdGVkKSk7CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgLy8gY3VzdG9tIGZvcm1hdAorICAgICAgICBhc3NlcnRfZHVtcF9wYXJzZWRfZmxhZ3NfY3VzdG9tX2Zvcm1hdF9jb250YWlucyEoCisgICAgICAgICAgICAie2Z1bGx5X3F1YWxpZmllZF9uYW1lfT17cGVybWlzc2lvbn0gKyB7c3RhdGV9IiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ybz1SRUFEX09OTFkgKyBFTkFCTEVEIgorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2R1bXBfY3VzdG9tX2Zvcm1hdCgpIHsKKyAgICAgICAgbWFjcm9fcnVsZXMhIGFzc2VydF9jdXN0b21fZm9ybWF0IHsKKyAgICAgICAgICAgICgkZm9ybWF0OmV4cHIsICRleHBlY3RlZDpleHByKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGZsYWcgPSBwYXJzZV9lbmFibGVkX3JvX2ZsYWcoKTsKKyAgICAgICAgICAgICAgICBsZXQgbXV0IGJ5dGVzID0gdmVjIVtdOworICAgICAgICAgICAgICAgIGR1bXBfY3VzdG9tX2Zvcm1hdCgmZmxhZywgJGZvcm1hdCwgJm11dCBieXRlcyk7CisgICAgICAgICAgICAgICAgbGV0IHRleHQgPSBzdGQ6OnN0cjo6ZnJvbV91dGY4KCZieXRlcykudW53cmFwKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0X2VxISh0ZXh0LCAkZXhwZWN0ZWQpOworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgie3BhY2thZ2V9IiwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdFxuIik7CisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgie25hbWV9IiwgImVuYWJsZWRfcm9cbiIpOworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoIntuYW1lc3BhY2V9IiwgImFjb25maWdfdGVzdFxuIik7CisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgie2Rlc2NyaXB0aW9ufSIsICJUaGlzIGZsYWcgaXMgRU5BQkxFRCArIFJFQURfT05MWVxuIik7CisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgie2J1Z30iLCAiYWJjXG4iKTsKKyAgICAgICAgYXNzZXJ0X2N1c3RvbV9mb3JtYXQhKCJ7c3RhdGV9IiwgIkVOQUJMRURcbiIpOworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoIntzdGF0ZTpib29sfSIsICJ0cnVlXG4iKTsKKyAgICAgICAgYXNzZXJ0X2N1c3RvbV9mb3JtYXQhKCJ7cGVybWlzc2lvbn0iLCAiUkVBRF9PTkxZXG4iKTsKKyAgICAgICAgYXNzZXJ0X2N1c3RvbV9mb3JtYXQhKCJ7dHJhY2V9IiwgInRlc3RzL3Rlc3QuYWNvbmZpZzogUkVBRF9XUklURSArIERJU0FCTEVELCB0ZXN0cy9maXJzdC52YWx1ZXM6IFJFQURfV1JJVEUgKyBESVNBQkxFRCwgdGVzdHMvc2Vjb25kLnZhbHVlczogUkVBRF9PTkxZICsgRU5BQkxFRFxuIik7CisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgKKyAgICAgICAgICAgICJ7dHJhY2U6cGF0aHN9IiwKKyAgICAgICAgICAgICJ0ZXN0cy90ZXN0LmFjb25maWcsIHRlc3RzL2ZpcnN0LnZhbHVlcywgdGVzdHMvc2Vjb25kLnZhbHVlc1xuIgorICAgICAgICApOworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoIntpc19maXhlZF9yZWFkX29ubHl9IiwgImZhbHNlXG4iKTsKKyAgICAgICAgYXNzZXJ0X2N1c3RvbV9mb3JtYXQhKCJ7aXNfZXhwb3J0ZWR9IiwgImZhbHNlXG4iKTsKKyAgICAgICAgYXNzZXJ0X2N1c3RvbV9mb3JtYXQhKCJ7Y29udGFpbmVyfSIsICJzeXN0ZW1cbiIpOworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoInttZXRhZGF0YX0iLCAiUFVSUE9TRV9CVUdGSVhcbiIpOworCisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgibmFtZT17bmFtZX18c3RhdGU9e3N0YXRlfSIsICJuYW1lPWVuYWJsZWRfcm98c3RhdGU9RU5BQkxFRFxuIik7CisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgie3N0YXRlfXtzdGF0ZX17c3RhdGV9IiwgIkVOQUJMRURFTkFCTEVERU5BQkxFRFxuIik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUoKSB7CisgICAgICAgIG1hY3JvX3J1bGVzISBhc3NlcnRfY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUgeworICAgICAgICAgICAgKCRmaWx0ZXI6ZXhwciwgJGV4cGVjdGVkOmV4cHIpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gcGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICAgICAgICAgIGxldCBwcmVkaWNhdGUgPSBjcmVhdGVfZmlsdGVyX3ByZWRpY2F0ZSgkZmlsdGVyKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICBsZXQgbXV0IGZpbHRlcmVkX2ZsYWdzOiBWZWM8U3RyaW5nPiA9IHBhcnNlZF9mbGFncworICAgICAgICAgICAgICAgICAgICAucGFyc2VkX2ZsYWcKKyAgICAgICAgICAgICAgICAgICAgLmludG9faXRlcigpCisgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocHJlZGljYXRlKQorICAgICAgICAgICAgICAgICAgICAubWFwKHxmbGFnfCBmbGFnLmZ1bGx5X3F1YWxpZmllZF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KCk7CisgICAgICAgICAgICAgICAgZmlsdGVyZWRfZmxhZ3Muc29ydCgpOworICAgICAgICAgICAgICAgIGFzc2VydF9lcSEoJmZpbHRlcmVkX2ZsYWdzLCAkZXhwZWN0ZWQpOworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydF9jcmVhdGVfZmlsdGVyX3ByZWRpY2F0ZSEoCisgICAgICAgICAgICAicGFja2FnZTpjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiLAorICAgICAgICAgICAgJlsKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3JvIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ybyIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAorICAgICAgICAgICAgXQorICAgICAgICApOworICAgICAgICBhc3NlcnRfY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUhKAorICAgICAgICAgICAgIm5hbWU6ZGlzYWJsZWRfcnciLAorICAgICAgICAgICAgJlsiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3Il0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2NyZWF0ZV9maWx0ZXJfcHJlZGljYXRlISgKKyAgICAgICAgICAgICJuYW1lc3BhY2U6b3RoZXJfbmFtZXNwYWNlIiwKKyAgICAgICAgICAgICZbImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiXQorICAgICAgICApOworICAgICAgICAvLyBkZXNjcmlwdGlvbjogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgYXNzZXJ0X2NyZWF0ZV9maWx0ZXJfcHJlZGljYXRlISgiYnVnOjEyMyIsICZbImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ybyIsXSk7CisgICAgICAgIGFzc2VydF9jcmVhdGVfZmlsdGVyX3ByZWRpY2F0ZSEoCisgICAgICAgICAgICAic3RhdGU6RU5BQkxFRCIsCisgICAgICAgICAgICAmWworICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9ybyIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm8iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2NyZWF0ZV9maWx0ZXJfcHJlZGljYXRlISgKKyAgICAgICAgICAgICJwZXJtaXNzaW9uOlJFQURfT05MWSIsCisgICAgICAgICAgICAmWworICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcm8iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9ybyIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm8iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICBdCisgICAgICAgICk7CisgICAgICAgIC8vIHRyYWNlOiBub3Qgc3VwcG9ydGVkIHlldAorICAgICAgICBhc3NlcnRfY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUhKAorICAgICAgICAgICAgImlzX2ZpeGVkX3JlYWRfb25seTp0cnVlIiwKKyAgICAgICAgICAgICZbCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgXQorICAgICAgICApOworICAgICAgICBhc3NlcnRfY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUhKAorICAgICAgICAgICAgImlzX2V4cG9ydGVkOnRydWUiLAorICAgICAgICAgICAgJlsKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICBdCisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9jcmVhdGVfZmlsdGVyX3ByZWRpY2F0ZSEoCisgICAgICAgICAgICAiY29udGFpbmVyOnN5c3RlbSIsCisgICAgICAgICAgICAmWworICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcm8iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm8iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydyIsCisgICAgICAgICAgICBdCisgICAgICAgICk7CisgICAgICAgIC8vIG1ldGFkYXRhOiBub3Qgc3VwcG9ydGVkIHlldAorCisgICAgICAgIC8vIHN5bnRoZXNpemVkIGZpZWxkcworICAgICAgICBhc3NlcnRfY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUhKAorICAgICAgICAgICAgImZ1bGx5X3F1YWxpZmllZF9uYW1lOmNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydyIsCisgICAgICAgICAgICAmWyJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciXQorICAgICAgICApOworCisgICAgICAgIC8vIG11bHRpcGxlIHN1YiBmaWx0ZXJzCisgICAgICAgIGFzc2VydF9jcmVhdGVfZmlsdGVyX3ByZWRpY2F0ZSEoCisgICAgICAgICAgICAicGVybWlzc2lvbjpSRUFEX09OTFkrc3RhdGU6RU5BQkxFRCIsCisgICAgICAgICAgICAmWworICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9ybyIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm8iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICBdCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9tYWluLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9tYWluLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYjY0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL21haW4ucnMKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYGFjb25maWdgIGlzIGEgYnVpbGQgdGltZSB0b29sIHRvIG1hbmFnZSBidWlsZCB0aW1lIGNvbmZpZ3VyYXRpb25zLCBzdWNoIGFzIGZlYXR1cmUgZmxhZ3MuCisKK3VzZSBhbnlob3c6Onthbnlob3csIGJhaWwsIENvbnRleHQsIFJlc3VsdH07Cit1c2UgY2xhcDo6e2J1aWxkZXI6OkFyZ0FjdGlvbiwgYnVpbGRlcjo6RW51bVZhbHVlUGFyc2VyLCBBcmcsIEFyZ01hdGNoZXMsIENvbW1hbmR9OwordXNlIGNvcmU6OmFueTo6QW55OwordXNlIHN0ZDo6ZnM7Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSBzdGQ6OnBhdGg6OntQYXRoLCBQYXRoQnVmfTsKKworbW9kIGNvZGVnZW47Cittb2QgY29tbWFuZHM7Cittb2QgZHVtcDsKK21vZCBzdG9yYWdlOworCit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OlN0b3JhZ2VGaWxlVHlwZTsKK3VzZSBjb2RlZ2VuOjpDb2RlZ2VuTW9kZTsKK3VzZSBkdW1wOjpEdW1wRm9ybWF0OworCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0OworCit1c2UgY29tbWFuZHM6OntJbnB1dCwgT3V0cHV0RmlsZX07CisKK2NvbnN0IEhFTFBfRFVNUF9GSUxURVI6ICZzdHIgPSByIyIKK0xpbWl0IHdoaWNoIGZsYWdzIHRvIG91dHB1dC4gSWYgbXVsdGlwbGUgLS1maWx0ZXIgYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIG91dHB1dCB3aWxsIGJlCitsaW1pdGVkIHRvIGZsYWdzIHRoYXQgbWF0Y2ggYW55IG9mIHRoZSBmaWx0ZXJzLgorIiM7CisKK2ZuIGNsaSgpIC0+IENvbW1hbmQgeworICAgIENvbW1hbmQ6Om5ldygiYWNvbmZpZyIpCisgICAgICAgIC5zdWJjb21tYW5kX3JlcXVpcmVkKHRydWUpCisgICAgICAgIC5zdWJjb21tYW5kKAorICAgICAgICAgICAgQ29tbWFuZDo6bmV3KCJjcmVhdGUtY2FjaGUiKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoInBhY2thZ2UiKS5sb25nKCJwYWNrYWdlIikucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzMxMjc2OTcxMCk6IE1ha2UgdGhpcyBhcmd1bWVudCByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjb250YWluZXIiKS5sb25nKCJjb250YWluZXIiKSkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJkZWNsYXJhdGlvbnMiKS5sb25nKCJkZWNsYXJhdGlvbnMiKS5hY3Rpb24oQXJnQWN0aW9uOjpBcHBlbmQpKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoInZhbHVlcyIpLmxvbmcoInZhbHVlcyIpLmFjdGlvbihBcmdBY3Rpb246OkFwcGVuZCkpCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImRlZmF1bHQtcGVybWlzc2lvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygiZGVmYXVsdC1wZXJtaXNzaW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIoYWNvbmZpZ19wcm90b3M6OmZsYWdfcGVybWlzc2lvbjo6cGFyc2VfZnJvbV9zdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZShhY29uZmlnX3Byb3Rvczo6ZmxhZ19wZXJtaXNzaW9uOjp0b19zdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmRzOjpERUZBVUxUX0ZMQUdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICkpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikucmVxdWlyZWQodHJ1ZSkpLAorICAgICAgICApCisgICAgICAgIC5zdWJjb21tYW5kKAorICAgICAgICAgICAgQ29tbWFuZDo6bmV3KCJjcmVhdGUtamF2YS1saWIiKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImNhY2hlIikubG9uZygiY2FjaGUiKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJvdXQiKS5sb25nKCJvdXQiKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygibW9kZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygibW9kZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKEVudW1WYWx1ZVBhcnNlcjo6PENvZGVnZW5Nb2RlPjo6bmV3KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgicHJvZHVjdGlvbiIpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygiYWxsb3ctaW5zdHJ1bWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJhbGxvdy1pbnN0cnVtZW50YXRpb24iKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcihjbGFwOjp2YWx1ZV9wYXJzZXIhKGJvb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoImZhbHNlIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgKQorICAgICAgICAuc3ViY29tbWFuZCgKKyAgICAgICAgICAgIENvbW1hbmQ6Om5ldygiY3JlYXRlLWNwcC1saWIiKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImNhY2hlIikubG9uZygiY2FjaGUiKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJvdXQiKS5sb25nKCJvdXQiKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygibW9kZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygibW9kZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKEVudW1WYWx1ZVBhcnNlcjo6PENvZGVnZW5Nb2RlPjo6bmV3KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgicHJvZHVjdGlvbiIpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygiYWxsb3ctaW5zdHJ1bWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJhbGxvdy1pbnN0cnVtZW50YXRpb24iKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcihjbGFwOjp2YWx1ZV9wYXJzZXIhKGJvb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoImZhbHNlIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgKQorICAgICAgICAuc3ViY29tbWFuZCgKKyAgICAgICAgICAgIENvbW1hbmQ6Om5ldygiY3JlYXRlLXJ1c3QtbGliIikKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImFsbG93LWluc3RydW1lbnRhdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygiYWxsb3ctaW5zdHJ1bWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIoY2xhcDo6dmFsdWVfcGFyc2VyIShib29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKCJmYWxzZSIpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygibW9kZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygibW9kZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKEVudW1WYWx1ZVBhcnNlcjo6PENvZGVnZW5Nb2RlPjo6bmV3KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgicHJvZHVjdGlvbiIpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICkKKyAgICAgICAgLnN1YmNvbW1hbmQoCisgICAgICAgICAgICBDb21tYW5kOjpuZXcoImNyZWF0ZS1kZXZpY2UtY29uZmlnLWRlZmF1bHRzIikKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJvdXQiKS5sb25nKCJvdXQiKS5kZWZhdWx0X3ZhbHVlKCItIikpLAorICAgICAgICApCisgICAgICAgIC5zdWJjb21tYW5kKAorICAgICAgICAgICAgQ29tbWFuZDo6bmV3KCJjcmVhdGUtZGV2aWNlLWNvbmZpZy1zeXNwcm9wcyIpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygiY2FjaGUiKS5sb25nKCJjYWNoZSIpLmFjdGlvbihBcmdBY3Rpb246OkFwcGVuZCkucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikuZGVmYXVsdF92YWx1ZSgiLSIpKSwKKyAgICAgICAgKQorICAgICAgICAuc3ViY29tbWFuZCgKKyAgICAgICAgICAgIENvbW1hbmQ6Om5ldygiZHVtcC1jYWNoZSIpCisgICAgICAgICAgICAgICAgLmFsaWFzKCJkdW1wIikKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKSkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygiZm9ybWF0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJmb3JtYXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcih8czogJnN0cnwgRHVtcEZvcm1hdDo6dHJ5X2Zyb20ocykpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAie2Z1bGx5X3F1YWxpZmllZF9uYW1lfSBbe2NvbnRhaW5lcn1dOiB7cGVybWlzc2lvbn0gKyB7c3RhdGV9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJmaWx0ZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoImZpbHRlciIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlbHAoSEVMUF9EVU1QX0ZJTFRFUi50cmltKCkpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJkZWR1cCIpLmxvbmcoImRlZHVwIikubnVtX2FyZ3MoMCkuYWN0aW9uKEFyZ0FjdGlvbjo6U2V0VHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikuZGVmYXVsdF92YWx1ZSgiLSIpKSwKKyAgICAgICAgKQorICAgICAgICAuc3ViY29tbWFuZCgKKyAgICAgICAgICAgIENvbW1hbmQ6Om5ldygiY3JlYXRlLXN0b3JhZ2UiKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJjb250YWluZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoImNvbnRhaW5lciIpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWlyZWQodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWxwKCJUaGUgdGFyZ2V0IGNvbnRhaW5lciBmb3IgdGhlIGdlbmVyYXRlZCBzdG9yYWdlIGZpbGUuIiksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJmaWxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJmaWxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIofHM6ICZzdHJ8IFN0b3JhZ2VGaWxlVHlwZTo6dHJ5X2Zyb20ocykpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJvdXQiKS5sb25nKCJvdXQiKS5yZXF1aXJlZCh0cnVlKSksCisgICAgICAgICkKK30KKworZm4gZ2V0X3JlcXVpcmVkX2FyZzwnYSwgVD4obWF0Y2hlczogJidhIEFyZ01hdGNoZXMsIGFyZ19uYW1lOiAmc3RyKSAtPiBSZXN1bHQ8JidhIFQ+Cit3aGVyZQorICAgIFQ6IEFueSArIENsb25lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAoreworICAgIG1hdGNoZXMKKyAgICAgICAgLmdldF9vbmU6OjxUPihhcmdfbmFtZSkKKyAgICAgICAgLm9rX29yKGFueWhvdyEoImludGVybmFsIGVycm9yOiByZXF1aXJlZCBhcmd1bWVudCAne30nIG5vdCBmb3VuZCIsIGFyZ19uYW1lKSkKK30KKworZm4gZ2V0X29wdGlvbmFsX2FyZzwnYSwgVD4obWF0Y2hlczogJidhIEFyZ01hdGNoZXMsIGFyZ19uYW1lOiAmc3RyKSAtPiBPcHRpb248JidhIFQ+Cit3aGVyZQorICAgIFQ6IEFueSArIENsb25lICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAoreworICAgIG1hdGNoZXMuZ2V0X29uZTo6PFQ+KGFyZ19uYW1lKQorfQorCitmbiBvcGVuX3plcm9fb3JfbW9yZV9maWxlcyhtYXRjaGVzOiAmQXJnTWF0Y2hlcywgYXJnX25hbWU6ICZzdHIpIC0+IFJlc3VsdDxWZWM8SW5wdXQ+PiB7CisgICAgbGV0IG11dCBvcGVuZWRfZmlsZXMgPSB2ZWMhW107CisgICAgZm9yIHBhdGggaW4gbWF0Y2hlcy5nZXRfbWFueTo6PFN0cmluZz4oYXJnX25hbWUpLnVud3JhcF9vcl9kZWZhdWx0KCkgeworICAgICAgICBsZXQgZmlsZSA9IEJveDo6bmV3KGZzOjpGaWxlOjpvcGVuKHBhdGgpPyk7CisgICAgICAgIG9wZW5lZF9maWxlcy5wdXNoKElucHV0IHsgc291cmNlOiBwYXRoLnRvX3N0cmluZygpLCByZWFkZXI6IGZpbGUgfSk7CisgICAgfQorICAgIE9rKG9wZW5lZF9maWxlcykKK30KKworZm4gb3Blbl9zaW5nbGVfZmlsZShtYXRjaGVzOiAmQXJnTWF0Y2hlcywgYXJnX25hbWU6ICZzdHIpIC0+IFJlc3VsdDxJbnB1dD4geworICAgIGxldCBTb21lKHBhdGgpID0gbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPihhcmdfbmFtZSkgZWxzZSB7CisgICAgICAgIGJhaWwhKCJtaXNzaW5nIGFyZ3VtZW50IHt9IiwgYXJnX25hbWUpOworICAgIH07CisgICAgbGV0IGZpbGUgPSBCb3g6Om5ldyhmczo6RmlsZTo6b3BlbihwYXRoKT8pOworICAgIE9rKElucHV0IHsgc291cmNlOiBwYXRoLnRvX3N0cmluZygpLCByZWFkZXI6IGZpbGUgfSkKK30KKworZm4gd3JpdGVfb3V0cHV0X2ZpbGVfcmVhbHRpdmVfdG9fZGlyKHJvb3Q6ICZQYXRoLCBvdXRwdXRfZmlsZTogJk91dHB1dEZpbGUpIC0+IFJlc3VsdDwoKT4geworICAgIGxldCBwYXRoID0gcm9vdC5qb2luKCZvdXRwdXRfZmlsZS5wYXRoKTsKKyAgICBsZXQgcGFyZW50ID0gcGF0aAorICAgICAgICAucGFyZW50KCkKKyAgICAgICAgLm9rX29yKGFueWhvdyEoInVuYWJsZSB0byBsb2NhdGUgcGFyZW50IG9mIG91dHB1dCBmaWxlIHt9IiwgcGF0aC5kaXNwbGF5KCkpKT87CisgICAgZnM6OmNyZWF0ZV9kaXJfYWxsKHBhcmVudCkKKyAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSB7fSIsIHBhcmVudC5kaXNwbGF5KCkpKT87CisgICAgbGV0IG11dCBmaWxlID0KKyAgICAgICAgZnM6OkZpbGU6OmNyZWF0ZSgmcGF0aCkud2l0aF9jb250ZXh0KHx8IGZvcm1hdCEoImZhaWxlZCB0byBvcGVuIHt9IiwgcGF0aC5kaXNwbGF5KCkpKT87CisgICAgZmlsZS53cml0ZV9hbGwoJm91dHB1dF9maWxlLmNvbnRlbnRzKQorICAgICAgICAud2l0aF9jb250ZXh0KHx8IGZvcm1hdCEoImZhaWxlZCB0byB3cml0ZSB0byB7fSIsIHBhdGguZGlzcGxheSgpKSk/OworICAgIE9rKCgpKQorfQorCitmbiB3cml0ZV9vdXRwdXRfdG9fZmlsZV9vcl9zdGRvdXQocGF0aDogJnN0ciwgZGF0YTogJlt1OF0pIC0+IFJlc3VsdDwoKT4geworICAgIGlmIHBhdGggPT0gIi0iIHsKKyAgICAgICAgaW86OnN0ZG91dCgpLndyaXRlX2FsbChkYXRhKS5jb250ZXh0KCJmYWlsZWQgdG8gd3JpdGUgdG8gc3Rkb3V0Iik/OworICAgIH0gZWxzZSB7CisgICAgICAgIGZzOjpGaWxlOjpjcmVhdGUocGF0aCkKKyAgICAgICAgICAgIC53aXRoX2NvbnRleHQofHwgZm9ybWF0ISgiZmFpbGVkIHRvIG9wZW4ge30iLCBwYXRoKSk/CisgICAgICAgICAgICAud3JpdGVfYWxsKGRhdGEpCisgICAgICAgICAgICAud2l0aF9jb250ZXh0KHx8IGZvcm1hdCEoImZhaWxlZCB0byB3cml0ZSB0byB7fSIsIHBhdGgpKT87CisgICAgfQorICAgIE9rKCgpKQorfQorCitmbiBtYWluKCkgLT4gUmVzdWx0PCgpPiB7CisgICAgbGV0IG1hdGNoZXMgPSBjbGkoKS5nZXRfbWF0Y2hlcygpOworICAgIG1hdGNoIG1hdGNoZXMuc3ViY29tbWFuZCgpIHsKKyAgICAgICAgU29tZSgoImNyZWF0ZS1jYWNoZSIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IHBhY2thZ2UgPSBnZXRfcmVxdWlyZWRfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgInBhY2thZ2UiKT87CisgICAgICAgICAgICBsZXQgY29udGFpbmVyID0KKyAgICAgICAgICAgICAgICBnZXRfb3B0aW9uYWxfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgImNvbnRhaW5lciIpLm1hcCh8Y3wgYy5hc19zdHIoKSk7CisgICAgICAgICAgICBsZXQgZGVjbGFyYXRpb25zID0gb3Blbl96ZXJvX29yX21vcmVfZmlsZXMoc3ViX21hdGNoZXMsICJkZWNsYXJhdGlvbnMiKT87CisgICAgICAgICAgICBsZXQgdmFsdWVzID0gb3Blbl96ZXJvX29yX21vcmVfZmlsZXMoc3ViX21hdGNoZXMsICJ2YWx1ZXMiKT87CisgICAgICAgICAgICBsZXQgZGVmYXVsdF9wZXJtaXNzaW9uID0gZ2V0X3JlcXVpcmVkX2FyZzo6PGFjb25maWdfcHJvdG9zOjpQcm90b0ZsYWdQZXJtaXNzaW9uPigKKyAgICAgICAgICAgICAgICBzdWJfbWF0Y2hlcywKKyAgICAgICAgICAgICAgICAiZGVmYXVsdC1wZXJtaXNzaW9uIiwKKyAgICAgICAgICAgICk/OworICAgICAgICAgICAgbGV0IG91dHB1dCA9IGNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICAgICBwYWNrYWdlLAorICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMsCisgICAgICAgICAgICAgICAgdmFsdWVzLAorICAgICAgICAgICAgICAgICpkZWZhdWx0X3Blcm1pc3Npb24sCisgICAgICAgICAgICApCisgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBjYWNoZSIpPzsKKyAgICAgICAgICAgIGxldCBwYXRoID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKKyAgICAgICAgICAgIHdyaXRlX291dHB1dF90b19maWxlX29yX3N0ZG91dChwYXRoLCAmb3V0cHV0KT87CisgICAgICAgIH0KKyAgICAgICAgU29tZSgoImNyZWF0ZS1qYXZhLWxpYiIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IGNhY2hlID0gb3Blbl9zaW5nbGVfZmlsZShzdWJfbWF0Y2hlcywgImNhY2hlIik/OworICAgICAgICAgICAgbGV0IG1vZGUgPSBnZXRfcmVxdWlyZWRfYXJnOjo8Q29kZWdlbk1vZGU+KHN1Yl9tYXRjaGVzLCAibW9kZSIpPzsKKyAgICAgICAgICAgIGxldCBhbGxvd19pbnN0cnVtZW50YXRpb24gPQorICAgICAgICAgICAgICAgIGdldF9yZXF1aXJlZF9hcmc6Ojxib29sPihzdWJfbWF0Y2hlcywgImFsbG93LWluc3RydW1lbnRhdGlvbiIpPzsKKyAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBjb21tYW5kczo6Y3JlYXRlX2phdmFfbGliKGNhY2hlLCAqbW9kZSwgKmFsbG93X2luc3RydW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBqYXZhIGxpYiIpPzsKKyAgICAgICAgICAgIGxldCBkaXIgPSBQYXRoQnVmOjpmcm9tKGdldF9yZXF1aXJlZF9hcmc6OjxTdHJpbmc+KHN1Yl9tYXRjaGVzLCAib3V0Iik/KTsKKyAgICAgICAgICAgIGdlbmVyYXRlZF9maWxlcworICAgICAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgICAgICAudHJ5X2Zvcl9lYWNoKHxmaWxlfCB3cml0ZV9vdXRwdXRfZmlsZV9yZWFsdGl2ZV90b19kaXIoJmRpciwgZmlsZSkpPzsKKyAgICAgICAgfQorICAgICAgICBTb21lKCgiY3JlYXRlLWNwcC1saWIiLCBzdWJfbWF0Y2hlcykpID0+IHsKKyAgICAgICAgICAgIGxldCBjYWNoZSA9IG9wZW5fc2luZ2xlX2ZpbGUoc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKKyAgICAgICAgICAgIGxldCBtb2RlID0gZ2V0X3JlcXVpcmVkX2FyZzo6PENvZGVnZW5Nb2RlPihzdWJfbWF0Y2hlcywgIm1vZGUiKT87CisgICAgICAgICAgICBsZXQgYWxsb3dfaW5zdHJ1bWVudGF0aW9uID0KKyAgICAgICAgICAgICAgICBnZXRfcmVxdWlyZWRfYXJnOjo8Ym9vbD4oc3ViX21hdGNoZXMsICJhbGxvdy1pbnN0cnVtZW50YXRpb24iKT87CisgICAgICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0gY29tbWFuZHM6OmNyZWF0ZV9jcHBfbGliKGNhY2hlLCAqbW9kZSwgKmFsbG93X2luc3RydW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBjcHAgbGliIik/OworICAgICAgICAgICAgbGV0IGRpciA9IFBhdGhCdWY6OmZyb20oZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJvdXQiKT8pOworICAgICAgICAgICAgZ2VuZXJhdGVkX2ZpbGVzCisgICAgICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgICAgIC50cnlfZm9yX2VhY2gofGZpbGV8IHdyaXRlX291dHB1dF9maWxlX3JlYWx0aXZlX3RvX2RpcigmZGlyLCBmaWxlKSk/OworICAgICAgICB9CisgICAgICAgIFNvbWUoKCJjcmVhdGUtcnVzdC1saWIiLCBzdWJfbWF0Y2hlcykpID0+IHsKKyAgICAgICAgICAgIGxldCBjYWNoZSA9IG9wZW5fc2luZ2xlX2ZpbGUoc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKKyAgICAgICAgICAgIGxldCBtb2RlID0gZ2V0X3JlcXVpcmVkX2FyZzo6PENvZGVnZW5Nb2RlPihzdWJfbWF0Y2hlcywgIm1vZGUiKT87CisgICAgICAgICAgICBsZXQgYWxsb3dfaW5zdHJ1bWVudGF0aW9uID0KKyAgICAgICAgICAgICAgICBnZXRfcmVxdWlyZWRfYXJnOjo8Ym9vbD4oc3ViX21hdGNoZXMsICJhbGxvdy1pbnN0cnVtZW50YXRpb24iKT87CisgICAgICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGUgPSBjb21tYW5kczo6Y3JlYXRlX3J1c3RfbGliKGNhY2hlLCAqbW9kZSwgKmFsbG93X2luc3RydW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBydXN0IGxpYiIpPzsKKyAgICAgICAgICAgIGxldCBkaXIgPSBQYXRoQnVmOjpmcm9tKGdldF9yZXF1aXJlZF9hcmc6OjxTdHJpbmc+KHN1Yl9tYXRjaGVzLCAib3V0Iik/KTsKKyAgICAgICAgICAgIHdyaXRlX291dHB1dF9maWxlX3JlYWx0aXZlX3RvX2RpcigmZGlyLCAmZ2VuZXJhdGVkX2ZpbGUpPzsKKyAgICAgICAgfQorICAgICAgICBTb21lKCgiY3JlYXRlLWRldmljZS1jb25maWctZGVmYXVsdHMiLCBzdWJfbWF0Y2hlcykpID0+IHsKKyAgICAgICAgICAgIGxldCBjYWNoZSA9IG9wZW5fc2luZ2xlX2ZpbGUoc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKKyAgICAgICAgICAgIGxldCBvdXRwdXQgPSBjb21tYW5kczo6Y3JlYXRlX2RldmljZV9jb25maWdfZGVmYXVsdHMoY2FjaGUpCisgICAgICAgICAgICAgICAgLmNvbnRleHQoImZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGNvbmZpZyBkZWZhdWx0cyIpPzsKKyAgICAgICAgICAgIGxldCBwYXRoID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJvdXQiKT87CisgICAgICAgICAgICB3cml0ZV9vdXRwdXRfdG9fZmlsZV9vcl9zdGRvdXQocGF0aCwgJm91dHB1dCk/OworICAgICAgICB9CisgICAgICAgIFNvbWUoKCJjcmVhdGUtZGV2aWNlLWNvbmZpZy1zeXNwcm9wcyIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IGNhY2hlID0gb3Blbl9zaW5nbGVfZmlsZShzdWJfbWF0Y2hlcywgImNhY2hlIik/OworICAgICAgICAgICAgbGV0IG91dHB1dCA9IGNvbW1hbmRzOjpjcmVhdGVfZGV2aWNlX2NvbmZpZ19zeXNwcm9wcyhjYWNoZSkKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2UgY29uZmlnIHN5c3Byb3BzIik/OworICAgICAgICAgICAgbGV0IHBhdGggPSBnZXRfcmVxdWlyZWRfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgIm91dCIpPzsKKyAgICAgICAgICAgIHdyaXRlX291dHB1dF90b19maWxlX29yX3N0ZG91dChwYXRoLCAmb3V0cHV0KT87CisgICAgICAgIH0KKyAgICAgICAgU29tZSgoImR1bXAtY2FjaGUiLCBzdWJfbWF0Y2hlcykpID0+IHsKKyAgICAgICAgICAgIGxldCBpbnB1dCA9IG9wZW5femVyb19vcl9tb3JlX2ZpbGVzKHN1Yl9tYXRjaGVzLCAiY2FjaGUiKT87CisgICAgICAgICAgICBsZXQgZm9ybWF0ID0gZ2V0X3JlcXVpcmVkX2FyZzo6PER1bXBGb3JtYXQ+KHN1Yl9tYXRjaGVzLCAiZm9ybWF0IikKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGR1bXAgcHJldmlvdXNseSBwYXJzZWQgZmxhZ3MiKT87CisgICAgICAgICAgICBsZXQgZmlsdGVycyA9IHN1Yl9tYXRjaGVzCisgICAgICAgICAgICAgICAgLmdldF9tYW55Ojo8U3RyaW5nPigiZmlsdGVyIikKKyAgICAgICAgICAgICAgICAudW53cmFwX29yX2RlZmF1bHQoKQorICAgICAgICAgICAgICAgIC5tYXAoU3RyaW5nOjphc19yZWYpCisgICAgICAgICAgICAgICAgLmNvbGxlY3Q6OjxWZWM8Xz4+KCk7CisgICAgICAgICAgICBsZXQgZGVkdXAgPSBnZXRfcmVxdWlyZWRfYXJnOjo8Ym9vbD4oc3ViX21hdGNoZXMsICJkZWR1cCIpPzsKKyAgICAgICAgICAgIGxldCBvdXRwdXQgPSBjb21tYW5kczo6ZHVtcF9wYXJzZWRfZmxhZ3MoaW5wdXQsIGZvcm1hdC5jbG9uZSgpLCAmZmlsdGVycywgKmRlZHVwKT87CisgICAgICAgICAgICBsZXQgcGF0aCA9IGdldF9yZXF1aXJlZF9hcmc6OjxTdHJpbmc+KHN1Yl9tYXRjaGVzLCAib3V0Iik/OworICAgICAgICAgICAgd3JpdGVfb3V0cHV0X3RvX2ZpbGVfb3Jfc3Rkb3V0KHBhdGgsICZvdXRwdXQpPzsKKyAgICAgICAgfQorICAgICAgICBTb21lKCgiY3JlYXRlLXN0b3JhZ2UiLCBzdWJfbWF0Y2hlcykpID0+IHsKKyAgICAgICAgICAgIGxldCBmaWxlID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0b3JhZ2VGaWxlVHlwZT4oc3ViX21hdGNoZXMsICJmaWxlIikKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiSW52YWxpZCBzdG9yYWdlIGZpbGUgc2VsZWN0aW9uIik/OworICAgICAgICAgICAgbGV0IGNhY2hlID0gb3Blbl96ZXJvX29yX21vcmVfZmlsZXMoc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKKyAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBnZXRfcmVxdWlyZWRfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgImNvbnRhaW5lciIpPzsKKyAgICAgICAgICAgIGxldCBwYXRoID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJvdXQiKT87CisgICAgICAgICAgICBsZXQgb3V0cHV0ID0gY29tbWFuZHM6OmNyZWF0ZV9zdG9yYWdlKGNhY2hlLCBjb250YWluZXIsIGZpbGUpCisgICAgICAgICAgICAgICAgLmNvbnRleHQoImZhaWxlZCB0byBjcmVhdGUgc3RvcmFnZSBmaWxlcyIpPzsKKyAgICAgICAgICAgIHdyaXRlX291dHB1dF90b19maWxlX29yX3N0ZG91dChwYXRoLCAmb3V0cHV0KT87CisgICAgICAgIH0KKyAgICAgICAgXyA9PiB1bnJlYWNoYWJsZSEoKSwKKyAgICB9CisgICAgT2soKCkpCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ190YWJsZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3RhYmxlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzEyMTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ190YWJsZS5ycwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKK3VzZSBjcmF0ZTo6c3RvcmFnZTo6RmxhZ1BhY2thZ2U7Cit1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvRmxhZ1Blcm1pc3Npb247Cit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnsKKyAgICBnZXRfdGFibGVfc2l6ZSwgRmxhZ1RhYmxlLCBGbGFnVGFibGVIZWFkZXIsIEZsYWdUYWJsZU5vZGUsIFN0b3JhZ2VGaWxlVHlwZSwgU3RvcmVkRmxhZ1R5cGUsCisgICAgRklMRV9WRVJTSU9OLAorfTsKK3VzZSBhbnlob3c6Onthbnlob3csIFJlc3VsdH07CisKK2ZuIG5ld19oZWFkZXIoY29udGFpbmVyOiAmc3RyLCBudW1fZmxhZ3M6IHUzMikgLT4gRmxhZ1RhYmxlSGVhZGVyIHsKKyAgICBGbGFnVGFibGVIZWFkZXIgeworICAgICAgICB2ZXJzaW9uOiBGSUxFX1ZFUlNJT04sCisgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKGNvbnRhaW5lciksCisgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpGbGFnTWFwIGFzIHU4LAorICAgICAgICBmaWxlX3NpemU6IDAsCisgICAgICAgIG51bV9mbGFncywKKyAgICAgICAgYnVja2V0X29mZnNldDogMCwKKyAgICAgICAgbm9kZV9vZmZzZXQ6IDAsCisgICAgfQorfQorCisvLyBhIHN0cnVjdCB0aGF0IGNvbnRhaW5zIEZsYWdUYWJsZU5vZGUgYW5kIGEgYnVuY2ggb2Ygb3RoZXIgaW5mb3JtYXRpb24gdG8gaGVscAorLy8gZmxhZyB0YWJsZSBjcmVhdGlvbgorI1tkZXJpdmUoUGFydGlhbEVxLCBEZWJ1ZywgQ2xvbmUpXQorc3RydWN0IEZsYWdUYWJsZU5vZGVXcmFwcGVyIHsKKyAgICBwdWIgbm9kZTogRmxhZ1RhYmxlTm9kZSwKKyAgICBwdWIgYnVja2V0X2luZGV4OiB1MzIsCit9CisKK2ltcGwgRmxhZ1RhYmxlTm9kZVdyYXBwZXIgeworICAgIGZuIG5ldygKKyAgICAgICAgcGFja2FnZV9pZDogdTMyLAorICAgICAgICBmbGFnX25hbWU6ICZzdHIsCisgICAgICAgIGZsYWdfdHlwZTogU3RvcmVkRmxhZ1R5cGUsCisgICAgICAgIGZsYWdfaW5kZXg6IHUxNiwKKyAgICAgICAgbnVtX2J1Y2tldHM6IHUzMiwKKyAgICApIC0+IFNlbGYgeworICAgICAgICBsZXQgYnVja2V0X2luZGV4ID0gRmxhZ1RhYmxlTm9kZTo6ZmluZF9idWNrZXRfaW5kZXgocGFja2FnZV9pZCwgZmxhZ19uYW1lLCBudW1fYnVja2V0cyk7CisgICAgICAgIGxldCBub2RlID0gRmxhZ1RhYmxlTm9kZSB7CisgICAgICAgICAgICBwYWNrYWdlX2lkLAorICAgICAgICAgICAgZmxhZ19uYW1lOiBmbGFnX25hbWUudG9fc3RyaW5nKCksCisgICAgICAgICAgICBmbGFnX3R5cGUsCisgICAgICAgICAgICBmbGFnX2luZGV4LAorICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IE5vbmUsCisgICAgICAgIH07CisgICAgICAgIFNlbGYgeyBub2RlLCBidWNrZXRfaW5kZXggfQorICAgIH0KKworICAgIGZuIGNyZWF0ZV9ub2RlcyhwYWNrYWdlOiAmRmxhZ1BhY2thZ2UsIG51bV9idWNrZXRzOiB1MzIpIC0+IFJlc3VsdDxWZWM8U2VsZj4+IHsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0KKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhwYWNrYWdlLnBhY2thZ2VfbmFtZSwgcGFja2FnZS5ib29sZWFuX2ZsYWdzLml0ZXIoKS5jb3BpZWQoKSk/OworICAgICAgICBwYWNrYWdlCisgICAgICAgICAgICAuYm9vbGVhbl9mbGFncworICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgLm1hcCh8JnBmfCB7CisgICAgICAgICAgICAgICAgbGV0IGZpZCA9IGZsYWdfaWRzCisgICAgICAgICAgICAgICAgICAgIC5nZXQocGYubmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAub2tfb3IoYW55aG93IShmb3JtYXQhKCJtaXNzaW5nIGZsYWcgaWQgZm9yIHt9IiwgcGYubmFtZSgpKSkpPzsKKyAgICAgICAgICAgICAgICBsZXQgZmxhZ190eXBlID0gaWYgcGYuaXNfZml4ZWRfcmVhZF9vbmx5KCkgeworICAgICAgICAgICAgICAgICAgICBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCBwZi5wZXJtaXNzaW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSA9PiBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSA9PiBTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuLAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBPayhTZWxmOjpuZXcocGFja2FnZS5wYWNrYWdlX2lkLCBwZi5uYW1lKCksIGZsYWdfdHlwZSwgKmZpZCwgbnVtX2J1Y2tldHMpKQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5jb2xsZWN0Ojo8UmVzdWx0PFZlYzxfPj4+KCkKKyAgICB9Cit9CisKK3B1YiBmbiBjcmVhdGVfZmxhZ190YWJsZShjb250YWluZXI6ICZzdHIsIHBhY2thZ2VzOiAmW0ZsYWdQYWNrYWdlXSkgLT4gUmVzdWx0PEZsYWdUYWJsZT4geworICAgIC8vIGNyZWF0ZSB0YWJsZQorICAgIGxldCBudW1fZmxhZ3MgPSBwYWNrYWdlcy5pdGVyKCkubWFwKHxwa2d8IHBrZy5ib29sZWFuX2ZsYWdzLmxlbigpIGFzIHUzMikuc3VtKCk7CisgICAgbGV0IG51bV9idWNrZXRzID0gZ2V0X3RhYmxlX3NpemUobnVtX2ZsYWdzKT87CisKKyAgICBsZXQgbXV0IGhlYWRlciA9IG5ld19oZWFkZXIoY29udGFpbmVyLCBudW1fZmxhZ3MpOworICAgIGxldCBtdXQgYnVja2V0cyA9IHZlYyFbTm9uZTsgbnVtX2J1Y2tldHMgYXMgdXNpemVdOworICAgIGxldCBtdXQgbm9kZV93cmFwcGVycyA9IHBhY2thZ2VzCisgICAgICAgIC5pdGVyKCkKKyAgICAgICAgLm1hcCh8cGtnfCBGbGFnVGFibGVOb2RlV3JhcHBlcjo6Y3JlYXRlX25vZGVzKHBrZywgbnVtX2J1Y2tldHMpKQorICAgICAgICAuY29sbGVjdDo6PFJlc3VsdDxWZWM8Xz4+PigpPworICAgICAgICAuY29uY2F0KCk7CisKKyAgICAvLyBpbml0aWFsaXplIGFsbCBoZWFkZXIgZmllbGRzCisgICAgaGVhZGVyLmJ1Y2tldF9vZmZzZXQgPSBoZWFkZXIuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKKyAgICBoZWFkZXIubm9kZV9vZmZzZXQgPSBoZWFkZXIuYnVja2V0X29mZnNldCArIG51bV9idWNrZXRzICogNDsKKyAgICBoZWFkZXIuZmlsZV9zaXplID0gaGVhZGVyLm5vZGVfb2Zmc2V0CisgICAgICAgICsgbm9kZV93cmFwcGVycy5pdGVyKCkubWFwKHx4fCB4Lm5vZGUuaW50b19ieXRlcygpLmxlbigpKS5zdW06Ojx1c2l6ZT4oKSBhcyB1MzI7CisKKyAgICAvLyBzb3J0IG5vZGVzIGJ5IGJ1Y2tldCBpbmRleCBmb3IgZWZmaWNpZW5jeQorICAgIG5vZGVfd3JhcHBlcnMuc29ydF9ieSh8YSwgYnwgYS5idWNrZXRfaW5kZXguY21wKCZiLmJ1Y2tldF9pbmRleCkpOworCisgICAgLy8gZmlsbCBhbGwgbm9kZSBvZmZzZXQKKyAgICBsZXQgbXV0IG9mZnNldCA9IGhlYWRlci5ub2RlX29mZnNldDsKKyAgICBmb3IgaSBpbiAwLi5ub2RlX3dyYXBwZXJzLmxlbigpIHsKKyAgICAgICAgbGV0IG5vZGVfYnVja2V0X2lkeCA9IG5vZGVfd3JhcHBlcnNbaV0uYnVja2V0X2luZGV4OworICAgICAgICBsZXQgbmV4dF9ub2RlX2J1Y2tldF9pZHggPSBpZiBpICsgMSA8IG5vZGVfd3JhcHBlcnMubGVuKCkgeworICAgICAgICAgICAgU29tZShub2RlX3dyYXBwZXJzW2kgKyAxXS5idWNrZXRfaW5kZXgpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBOb25lCisgICAgICAgIH07CisKKyAgICAgICAgaWYgYnVja2V0c1tub2RlX2J1Y2tldF9pZHggYXMgdXNpemVdLmlzX25vbmUoKSB7CisgICAgICAgICAgICBidWNrZXRzW25vZGVfYnVja2V0X2lkeCBhcyB1c2l6ZV0gPSBTb21lKG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IG5vZGVfd3JhcHBlcnNbaV0ubm9kZS5pbnRvX2J5dGVzKCkubGVuKCkgYXMgdTMyOworCisgICAgICAgIGlmIGxldCBTb21lKGluZGV4KSA9IG5leHRfbm9kZV9idWNrZXRfaWR4IHsKKyAgICAgICAgICAgIGlmIGluZGV4ID09IG5vZGVfYnVja2V0X2lkeCB7CisgICAgICAgICAgICAgICAgbm9kZV93cmFwcGVyc1tpXS5ub2RlLm5leHRfb2Zmc2V0ID0gU29tZShvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbGV0IHRhYmxlID0KKyAgICAgICAgRmxhZ1RhYmxlIHsgaGVhZGVyLCBidWNrZXRzLCBub2Rlczogbm9kZV93cmFwcGVycy5pbnRvX2l0ZXIoKS5tYXAofG53fCBudy5ub2RlKS5jb2xsZWN0KCkgfTsKKworICAgIE9rKHRhYmxlKQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6c3RvcmFnZTo6e2dyb3VwX2ZsYWdzX2J5X3BhY2thZ2UsIHRlc3RzOjpwYXJzZV9hbGxfdGVzdF9mbGFnc307CisKKyAgICBmbiBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlX2Zyb21fc291cmNlKCkgLT4gUmVzdWx0PEZsYWdUYWJsZT4geworICAgICAgICBsZXQgY2FjaGVzID0gcGFyc2VfYWxsX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IHBhY2thZ2VzID0gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZShjYWNoZXMuaXRlcigpKTsKKyAgICAgICAgY3JlYXRlX2ZsYWdfdGFibGUoIm1vY2t1cCIsICZwYWNrYWdlcykKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHRhYmxlIGNyZWF0aW9uIGFuZCBlYWNoIGZpZWxkCisgICAgZm4gdGVzdF90YWJsZV9jb250ZW50cygpIHsKKyAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlX2Zyb21fc291cmNlKCk7CisgICAgICAgIGFzc2VydCEoZmxhZ190YWJsZS5pc19vaygpKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2ZsYWdfdGFibGUgPSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdGFibGUudW53cmFwKCksIGV4cGVjdGVkX2ZsYWdfdGFibGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3ZhbHVlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL2ZsYWdfdmFsdWUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1YmE1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3ZhbHVlLnJzCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgY3JhdGU6OmNvbW1hbmRzOjphc3NpZ25fZmxhZ19pZHM7Cit1c2UgY3JhdGU6OnN0b3JhZ2U6OkZsYWdQYWNrYWdlOwordXNlIGFjb25maWdfcHJvdG9zOjpQcm90b0ZsYWdTdGF0ZTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e0ZsYWdWYWx1ZUhlYWRlciwgRmxhZ1ZhbHVlTGlzdCwgU3RvcmFnZUZpbGVUeXBlLCBGSUxFX1ZFUlNJT059OwordXNlIGFueWhvdzo6e2FueWhvdywgUmVzdWx0fTsKKworZm4gbmV3X2hlYWRlcihjb250YWluZXI6ICZzdHIsIG51bV9mbGFnczogdTMyKSAtPiBGbGFnVmFsdWVIZWFkZXIgeworICAgIEZsYWdWYWx1ZUhlYWRlciB7CisgICAgICAgIHZlcnNpb246IEZJTEVfVkVSU0lPTiwKKyAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oY29udGFpbmVyKSwKKyAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwgYXMgdTgsCisgICAgICAgIGZpbGVfc2l6ZTogMCwKKyAgICAgICAgbnVtX2ZsYWdzLAorICAgICAgICBib29sZWFuX3ZhbHVlX29mZnNldDogMCwKKyAgICB9Cit9CisKK3B1YiBmbiBjcmVhdGVfZmxhZ192YWx1ZShjb250YWluZXI6ICZzdHIsIHBhY2thZ2VzOiAmW0ZsYWdQYWNrYWdlXSkgLT4gUmVzdWx0PEZsYWdWYWx1ZUxpc3Q+IHsKKyAgICAvLyBjcmVhdGUgbGlzdAorICAgIGxldCBudW1fZmxhZ3MgPSBwYWNrYWdlcy5pdGVyKCkubWFwKHxwa2d8IHBrZy5ib29sZWFuX2ZsYWdzLmxlbigpIGFzIHUzMikuc3VtKCk7CisKKyAgICBsZXQgbXV0IGxpc3QgPSBGbGFnVmFsdWVMaXN0IHsKKyAgICAgICAgaGVhZGVyOiBuZXdfaGVhZGVyKGNvbnRhaW5lciwgbnVtX2ZsYWdzKSwKKyAgICAgICAgYm9vbGVhbnM6IHZlYyFbZmFsc2U7IG51bV9mbGFncyBhcyB1c2l6ZV0sCisgICAgfTsKKworICAgIGZvciBwa2cgaW4gcGFja2FnZXMuaXRlcigpIHsKKyAgICAgICAgbGV0IHN0YXJ0X2luZGV4ID0gcGtnLmJvb2xlYW5fc3RhcnRfaW5kZXggYXMgdXNpemU7CisgICAgICAgIGxldCBmbGFnX2lkcyA9IGFzc2lnbl9mbGFnX2lkcyhwa2cucGFja2FnZV9uYW1lLCBwa2cuYm9vbGVhbl9mbGFncy5pdGVyKCkuY29waWVkKCkpPzsKKyAgICAgICAgZm9yIHBmIGluIHBrZy5ib29sZWFuX2ZsYWdzLml0ZXIoKSB7CisgICAgICAgICAgICBsZXQgZmlkID0gZmxhZ19pZHMKKyAgICAgICAgICAgICAgICAuZ2V0KHBmLm5hbWUoKSkKKyAgICAgICAgICAgICAgICAub2tfb3IoYW55aG93IShmb3JtYXQhKCJtaXNzaW5nIGZsYWcgaWQgZm9yIHt9IiwgcGYubmFtZSgpKSkpPzsKKworICAgICAgICAgICAgbGlzdC5ib29sZWFuc1tzdGFydF9pbmRleCArICgqZmlkIGFzIHVzaXplKV0gPSBwZi5zdGF0ZSgpID09IFByb3RvRmxhZ1N0YXRlOjpFTkFCTEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBhbGwgaGVhZGVyIGZpZWxkcworICAgIGxpc3QuaGVhZGVyLmJvb2xlYW5fdmFsdWVfb2Zmc2V0ID0gbGlzdC5oZWFkZXIuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKKyAgICBsaXN0LmhlYWRlci5maWxlX3NpemUgPSBsaXN0LmhlYWRlci5ib29sZWFuX3ZhbHVlX29mZnNldCArIG51bV9mbGFnczsKKworICAgIE9rKGxpc3QpCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjpzdG9yYWdlOjp7Z3JvdXBfZmxhZ3NfYnlfcGFja2FnZSwgdGVzdHM6OnBhcnNlX2FsbF90ZXN0X2ZsYWdzfTsKKworICAgIHB1YiBmbiBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3RfZnJvbV9zb3VyY2UoKSAtPiBSZXN1bHQ8RmxhZ1ZhbHVlTGlzdD4geworICAgICAgICBsZXQgY2FjaGVzID0gcGFyc2VfYWxsX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IHBhY2thZ2VzID0gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZShjYWNoZXMuaXRlcigpKTsKKyAgICAgICAgY3JlYXRlX2ZsYWdfdmFsdWUoIm1vY2t1cCIsICZwYWNrYWdlcykKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIGZsYWcgdmFsdWUgY3JlYXRpb24gYW5kIGVhY2ggZmllbGQKKyAgICBmbiB0ZXN0X2xpc3RfY29udGVudHMoKSB7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3RfZnJvbV9zb3VyY2UoKTsKKyAgICAgICAgYXNzZXJ0IShmbGFnX3ZhbHVlX2xpc3QuaXNfb2soKSk7CisgICAgICAgIGxldCBleHBlY3RlZF9mbGFnX3ZhbHVlX2xpc3QgPQorICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdmFsdWVfbGlzdC51bndyYXAoKSwgZXhwZWN0ZWRfZmxhZ192YWx1ZV9saXN0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvbW9kLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL21vZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzMzOWYyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL21vZC5ycwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3B1YiBtb2QgZmxhZ190YWJsZTsKK3B1YiBtb2QgZmxhZ192YWx1ZTsKK3B1YiBtb2QgcGFja2FnZV90YWJsZTsKKwordXNlIGFueWhvdzo6e2FueWhvdywgUmVzdWx0fTsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7SGFzaE1hcCwgSGFzaFNldH07CisKK3VzZSBjcmF0ZTo6c3RvcmFnZTo6eworICAgIGZsYWdfdGFibGU6OmNyZWF0ZV9mbGFnX3RhYmxlLCBmbGFnX3ZhbHVlOjpjcmVhdGVfZmxhZ192YWx1ZSwKKyAgICBwYWNrYWdlX3RhYmxlOjpjcmVhdGVfcGFja2FnZV90YWJsZSwKK307Cit1c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b1BhcnNlZEZsYWcsIFByb3RvUGFyc2VkRmxhZ3N9OwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpTdG9yYWdlRmlsZVR5cGU7CisKK3B1YiBzdHJ1Y3QgRmxhZ1BhY2thZ2U8J2E+IHsKKyAgICBwdWIgcGFja2FnZV9uYW1lOiAmJ2Egc3RyLAorICAgIHB1YiBwYWNrYWdlX2lkOiB1MzIsCisgICAgcHViIGZsYWdfbmFtZXM6IEhhc2hTZXQ8JidhIHN0cj4sCisgICAgcHViIGJvb2xlYW5fZmxhZ3M6IFZlYzwmJ2EgUHJvdG9QYXJzZWRGbGFnPiwKKyAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJvb2xlYW4gZmxhZyBpbiB0aGlzIGFjb25maWcgcGFja2FnZSBhbW9uZyBhbGwgYm9vbGVhbgorICAgIC8vIGZsYWdzIGluIHRoaXMgY29udGFpbmVyLgorICAgIHB1YiBib29sZWFuX3N0YXJ0X2luZGV4OiB1MzIsCit9CisKK2ltcGw8J2E+IEZsYWdQYWNrYWdlPCdhPiB7CisgICAgZm4gbmV3KHBhY2thZ2VfbmFtZTogJidhIHN0ciwgcGFja2FnZV9pZDogdTMyKSAtPiBTZWxmIHsKKyAgICAgICAgRmxhZ1BhY2thZ2UgeworICAgICAgICAgICAgcGFja2FnZV9uYW1lLAorICAgICAgICAgICAgcGFja2FnZV9pZCwKKyAgICAgICAgICAgIGZsYWdfbmFtZXM6IEhhc2hTZXQ6Om5ldygpLAorICAgICAgICAgICAgYm9vbGVhbl9mbGFnczogdmVjIVtdLAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogMCwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGluc2VydCgmbXV0IHNlbGYsIHBmOiAmJ2EgUHJvdG9QYXJzZWRGbGFnKSB7CisgICAgICAgIGlmIHNlbGYuZmxhZ19uYW1lcy5pbnNlcnQocGYubmFtZSgpKSB7CisgICAgICAgICAgICBzZWxmLmJvb2xlYW5fZmxhZ3MucHVzaChwZik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3B1YiBmbiBncm91cF9mbGFnc19ieV9wYWNrYWdlPCdhLCBJPihwYXJzZWRfZmxhZ3NfdmVjX2l0ZXI6IEkpIC0+IFZlYzxGbGFnUGFja2FnZTwnYT4+Cit3aGVyZQorICAgIEk6IEl0ZXJhdG9yPEl0ZW0gPSAmJ2EgUHJvdG9QYXJzZWRGbGFncz4sCit7CisgICAgLy8gZ3JvdXAgZmxhZ3MgYnkgcGFja2FnZQorICAgIGxldCBtdXQgcGFja2FnZXM6IFZlYzxGbGFnUGFja2FnZTwnYT4+ID0gVmVjOjpuZXcoKTsKKyAgICBsZXQgbXV0IHBhY2thZ2VfaW5kZXg6IEhhc2hNYXA8JnN0ciwgdXNpemU+ID0gSGFzaE1hcDo6bmV3KCk7CisgICAgZm9yIHBhcnNlZF9mbGFncyBpbiBwYXJzZWRfZmxhZ3NfdmVjX2l0ZXIgeworICAgICAgICBmb3IgcGFyc2VkX2ZsYWcgaW4gcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLml0ZXIoKSB7CisgICAgICAgICAgICBsZXQgaW5kZXggPSAqKHBhY2thZ2VfaW5kZXguZW50cnkocGFyc2VkX2ZsYWcucGFja2FnZSgpKS5vcl9pbnNlcnQocGFja2FnZXMubGVuKCkpKTsKKyAgICAgICAgICAgIGlmIGluZGV4ID09IHBhY2thZ2VzLmxlbigpIHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlcy5wdXNoKEZsYWdQYWNrYWdlOjpuZXcocGFyc2VkX2ZsYWcucGFja2FnZSgpLCBpbmRleCBhcyB1MzIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhY2thZ2VzW2luZGV4XS5pbnNlcnQocGFyc2VkX2ZsYWcpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY2FjbHVhdGUgYm9vbGVhbiBmbGFnIHN0YXJ0IGluZGV4IGZvciBlYWNoIHBhY2thZ2UKKyAgICBsZXQgbXV0IGJvb2xlYW5fc3RhcnRfaW5kZXggPSAwOworICAgIGZvciBwIGluIHBhY2thZ2VzLml0ZXJfbXV0KCkgeworICAgICAgICBwLmJvb2xlYW5fc3RhcnRfaW5kZXggPSBib29sZWFuX3N0YXJ0X2luZGV4OworICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4ICs9IHAuYm9vbGVhbl9mbGFncy5sZW4oKSBhcyB1MzI7CisgICAgfQorCisgICAgcGFja2FnZXMKK30KKworcHViIGZuIGdlbmVyYXRlX3N0b3JhZ2VfZmlsZTwnYSwgST4oCisgICAgY29udGFpbmVyOiAmc3RyLAorICAgIHBhcnNlZF9mbGFnc192ZWNfaXRlcjogSSwKKyAgICBmaWxlOiAmU3RvcmFnZUZpbGVUeXBlLAorKSAtPiBSZXN1bHQ8VmVjPHU4Pj4KK3doZXJlCisgICAgSTogSXRlcmF0b3I8SXRlbSA9ICYnYSBQcm90b1BhcnNlZEZsYWdzPiwKK3sKKyAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKHBhcnNlZF9mbGFnc192ZWNfaXRlcik7CisKKyAgICBtYXRjaCBmaWxlIHsKKyAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwID0+IHsKKyAgICAgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3BhY2thZ2VfdGFibGUoY29udGFpbmVyLCAmcGFja2FnZXMpPzsKKyAgICAgICAgICAgIE9rKHBhY2thZ2VfdGFibGUuaW50b19ieXRlcygpKQorICAgICAgICB9CisgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCA9PiB7CisgICAgICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV9mbGFnX3RhYmxlKGNvbnRhaW5lciwgJnBhY2thZ2VzKT87CisgICAgICAgICAgICBPayhmbGFnX3RhYmxlLmludG9fYnl0ZXMoKSkKKyAgICAgICAgfQorICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwgPT4geworICAgICAgICAgICAgbGV0IGZsYWdfdmFsdWUgPSBjcmVhdGVfZmxhZ192YWx1ZShjb250YWluZXIsICZwYWNrYWdlcyk/OworICAgICAgICAgICAgT2soZmxhZ192YWx1ZS5pbnRvX2J5dGVzKCkpCisgICAgICAgIH0KKyAgICAgICAgXyA9PiBFcnIoYW55aG93ISgiYWNvbmZpZyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjcmVhdGlvbiBvZiB0aGlzIHN0b3JhZ2UgZmlsZSB0eXBlIikpLAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgY3JhdGU6OklucHV0OworCisgICAgcHViIGZuIHBhcnNlX2FsbF90ZXN0X2ZsYWdzKCkgLT4gVmVjPFByb3RvUGFyc2VkRmxhZ3M+IHsKKyAgICAgICAgbGV0IGFjb25maWdfZmlsZXMgPSBbCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgICJzdG9yYWdlX3Rlc3RfMS5hY29uZmlnIiwKKyAgICAgICAgICAgICAgICBpbmNsdWRlX2J5dGVzISgiLi4vLi4vdGVzdHMvc3RvcmFnZV90ZXN0XzEuYWNvbmZpZyIpLmFzX3NsaWNlKCksCisgICAgICAgICAgICAgICAgInN0b3JhZ2VfdGVzdF8xLnZhbHVlIiwKKyAgICAgICAgICAgICAgICBpbmNsdWRlX2J5dGVzISgiLi4vLi4vdGVzdHMvc3RvcmFnZV90ZXN0XzEudmFsdWVzIikuYXNfc2xpY2UoKSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgICJzdG9yYWdlX3Rlc3RfMi5hY29uZmlnIiwKKyAgICAgICAgICAgICAgICBpbmNsdWRlX2J5dGVzISgiLi4vLi4vdGVzdHMvc3RvcmFnZV90ZXN0XzIuYWNvbmZpZyIpLmFzX3NsaWNlKCksCisgICAgICAgICAgICAgICAgInN0b3JhZ2VfdGVzdF8yLnZhbHVlIiwKKyAgICAgICAgICAgICAgICBpbmNsdWRlX2J5dGVzISgiLi4vLi4vdGVzdHMvc3RvcmFnZV90ZXN0XzIudmFsdWVzIikuYXNfc2xpY2UoKSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLAorICAgICAgICAgICAgICAgICJzdG9yYWdlX3Rlc3RfNC5hY29uZmlnIiwKKyAgICAgICAgICAgICAgICBpbmNsdWRlX2J5dGVzISgiLi4vLi4vdGVzdHMvc3RvcmFnZV90ZXN0XzQuYWNvbmZpZyIpLmFzX3NsaWNlKCksCisgICAgICAgICAgICAgICAgInN0b3JhZ2VfdGVzdF80LnZhbHVlIiwKKyAgICAgICAgICAgICAgICBpbmNsdWRlX2J5dGVzISgiLi4vLi4vdGVzdHMvc3RvcmFnZV90ZXN0XzQudmFsdWVzIikuYXNfc2xpY2UoKSwKKyAgICAgICAgICAgICksCisgICAgICAgIF07CisgICAgICAgIGFjb25maWdfZmlsZXMKKyAgICAgICAgICAgIC5pbnRvX2l0ZXIoKQorICAgICAgICAgICAgLm1hcCh8KHBrZywgYWNvbmZpZ19maWxlLCBhY29uZmlnX2NvbnRlbnQsIHZhbHVlX2ZpbGUsIHZhbHVlX2NvbnRlbnQpfCB7CisgICAgICAgICAgICAgICAgbGV0IGJ5dGVzID0gY3JhdGU6OmNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICAgICAgICAgcGtnLAorICAgICAgICAgICAgICAgICAgICBTb21lKCJzeXN0ZW0iKSwKKyAgICAgICAgICAgICAgICAgICAgdmVjIVtJbnB1dCB7CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZvcm1hdCEoInRlc3RzL3t9IiwgYWNvbmZpZ19maWxlKS50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcjogQm94OjpuZXcoYWNvbmZpZ19jb250ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIHZlYyFbSW5wdXQgeworICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmb3JtYXQhKCJ0ZXN0cy97fSIsIHZhbHVlX2ZpbGUpLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyh2YWx1ZV9jb250ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6REVGQVVMVF9GTEFHX1BFUk1JU1NJT04sCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmJ5dGVzKS51bndyYXAoKQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5jb2xsZWN0KCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9mbGFnX3BhY2thZ2UoKSB7CisgICAgICAgIGxldCBjYWNoZXMgPSBwYXJzZV9hbGxfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCkpOworCisgICAgICAgIGZvciBwa2cgaW4gcGFja2FnZXMuaXRlcigpIHsKKyAgICAgICAgICAgIGxldCBwa2dfbmFtZSA9IHBrZy5wYWNrYWdlX25hbWU7CisgICAgICAgICAgICBhc3NlcnRfZXEhKHBrZy5mbGFnX25hbWVzLmxlbigpLCBwa2cuYm9vbGVhbl9mbGFncy5sZW4oKSk7CisgICAgICAgICAgICBmb3IgcGYgaW4gcGtnLmJvb2xlYW5fZmxhZ3MuaXRlcigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQhKHBrZy5mbGFnX25hbWVzLmNvbnRhaW5zKHBmLm5hbWUoKSkpOworICAgICAgICAgICAgICAgIGFzc2VydF9lcSEocGYucGFja2FnZSgpLCBwa2dfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzLmxlbigpLCAzKTsKKworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzBdLnBhY2thZ2VfbmFtZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5wYWNrYWdlX2lkLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5mbGFnX25hbWVzLmxlbigpLCAzKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1swXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJlbmFibGVkX3J3IikpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMuY29udGFpbnMoImRpc2FibGVkX3J3IikpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcm8iKSk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMF0uYm9vbGVhbl9zdGFydF9pbmRleCwgMCk7CisKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1sxXS5wYWNrYWdlX25hbWUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIik7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMV0ucGFja2FnZV9pZCwgMSk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMV0uZmxhZ19uYW1lcy5sZW4oKSwgMyk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMV0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9ybyIpKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1sxXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJkaXNhYmxlZF9ydyIpKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1sxXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJlbmFibGVkX2ZpeGVkX3JvIikpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzFdLmJvb2xlYW5fc3RhcnRfaW5kZXgsIDMpOworCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMl0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLnBhY2thZ2VfaWQsIDIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLmZsYWdfbmFtZXMubGVuKCksIDIpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzJdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcnciKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMl0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9maXhlZF9ybyIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1syXS5ib29sZWFuX3N0YXJ0X2luZGV4LCA2KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvcGFja2FnZV90YWJsZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9wYWNrYWdlX3RhYmxlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzYwMmYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvcGFja2FnZV90YWJsZS5ycwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzZSBhbnlob3c6OlJlc3VsdDsKKwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7CisgICAgZ2V0X3RhYmxlX3NpemUsIFBhY2thZ2VUYWJsZSwgUGFja2FnZVRhYmxlSGVhZGVyLCBQYWNrYWdlVGFibGVOb2RlLCBTdG9yYWdlRmlsZVR5cGUsCisgICAgRklMRV9WRVJTSU9OLAorfTsKKwordXNlIGNyYXRlOjpzdG9yYWdlOjpGbGFnUGFja2FnZTsKKworZm4gbmV3X2hlYWRlcihjb250YWluZXI6ICZzdHIsIG51bV9wYWNrYWdlczogdTMyKSAtPiBQYWNrYWdlVGFibGVIZWFkZXIgeworICAgIFBhY2thZ2VUYWJsZUhlYWRlciB7CisgICAgICAgIHZlcnNpb246IEZJTEVfVkVSU0lPTiwKKyAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oY29udGFpbmVyKSwKKyAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgYXMgdTgsCisgICAgICAgIGZpbGVfc2l6ZTogMCwKKyAgICAgICAgbnVtX3BhY2thZ2VzLAorICAgICAgICBidWNrZXRfb2Zmc2V0OiAwLAorICAgICAgICBub2RlX29mZnNldDogMCwKKyAgICB9Cit9CisKKy8vIGEgc3RydWN0IHRoYXQgY29udGFpbnMgUGFja2FnZVRhYmxlTm9kZSBhbmQgYSBidW5jaCBvZiBvdGhlciBpbmZvcm1hdGlvbiB0byBoZWxwCisvLyBwYWNrYWdlIHRhYmxlIGNyZWF0aW9uCisjW2Rlcml2ZShQYXJ0aWFsRXEsIERlYnVnKV0KK3N0cnVjdCBQYWNrYWdlVGFibGVOb2RlV3JhcHBlciB7CisgICAgcHViIG5vZGU6IFBhY2thZ2VUYWJsZU5vZGUsCisgICAgcHViIGJ1Y2tldF9pbmRleDogdTMyLAorfQorCitpbXBsIFBhY2thZ2VUYWJsZU5vZGVXcmFwcGVyIHsKKyAgICBmbiBuZXcocGFja2FnZTogJkZsYWdQYWNrYWdlLCBudW1fYnVja2V0czogdTMyKSAtPiBTZWxmIHsKKyAgICAgICAgbGV0IG5vZGUgPSBQYWNrYWdlVGFibGVOb2RlIHsKKyAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKHBhY2thZ2UucGFja2FnZV9uYW1lKSwKKyAgICAgICAgICAgIHBhY2thZ2VfaWQ6IHBhY2thZ2UucGFja2FnZV9pZCwKKyAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IHBhY2thZ2UuYm9vbGVhbl9zdGFydF9pbmRleCwKKyAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBOb25lLAorICAgICAgICB9OworICAgICAgICBsZXQgYnVja2V0X2luZGV4ID0gUGFja2FnZVRhYmxlTm9kZTo6ZmluZF9idWNrZXRfaW5kZXgocGFja2FnZS5wYWNrYWdlX25hbWUsIG51bV9idWNrZXRzKTsKKyAgICAgICAgU2VsZiB7IG5vZGUsIGJ1Y2tldF9pbmRleCB9CisgICAgfQorfQorCitwdWIgZm4gY3JlYXRlX3BhY2thZ2VfdGFibGUoY29udGFpbmVyOiAmc3RyLCBwYWNrYWdlczogJltGbGFnUGFja2FnZV0pIC0+IFJlc3VsdDxQYWNrYWdlVGFibGU+IHsKKyAgICAvLyBjcmVhdGUgdGFibGUKKyAgICBsZXQgbnVtX3BhY2thZ2VzID0gcGFja2FnZXMubGVuKCkgYXMgdTMyOworICAgIGxldCBudW1fYnVja2V0cyA9IGdldF90YWJsZV9zaXplKG51bV9wYWNrYWdlcyk/OworICAgIGxldCBtdXQgaGVhZGVyID0gbmV3X2hlYWRlcihjb250YWluZXIsIG51bV9wYWNrYWdlcyk7CisgICAgbGV0IG11dCBidWNrZXRzID0gdmVjIVtOb25lOyBudW1fYnVja2V0cyBhcyB1c2l6ZV07CisgICAgbGV0IG11dCBub2RlX3dyYXBwZXJzOiBWZWM8Xz4gPQorICAgICAgICBwYWNrYWdlcy5pdGVyKCkubWFwKHxwa2d8IFBhY2thZ2VUYWJsZU5vZGVXcmFwcGVyOjpuZXcocGtnLCBudW1fYnVja2V0cykpLmNvbGxlY3QoKTsKKworICAgIC8vIGluaXRpYWxpemUgYWxsIGhlYWRlciBmaWVsZHMKKyAgICBoZWFkZXIuYnVja2V0X29mZnNldCA9IGhlYWRlci5pbnRvX2J5dGVzKCkubGVuKCkgYXMgdTMyOworICAgIGhlYWRlci5ub2RlX29mZnNldCA9IGhlYWRlci5idWNrZXRfb2Zmc2V0ICsgbnVtX2J1Y2tldHMgKiA0OworICAgIGhlYWRlci5maWxlX3NpemUgPSBoZWFkZXIubm9kZV9vZmZzZXQKKyAgICAgICAgKyBub2RlX3dyYXBwZXJzLml0ZXIoKS5tYXAofHh8IHgubm9kZS5pbnRvX2J5dGVzKCkubGVuKCkpLnN1bTo6PHVzaXplPigpIGFzIHUzMjsKKworICAgIC8vIHNvcnQgbm9kZV93cmFwcGVycyBieSBidWNrZXQgaW5kZXggZm9yIGVmZmljaWVuY3kKKyAgICBub2RlX3dyYXBwZXJzLnNvcnRfYnkofGEsIGJ8IGEuYnVja2V0X2luZGV4LmNtcCgmYi5idWNrZXRfaW5kZXgpKTsKKworICAgIC8vIGZpbGwgYWxsIG5vZGUgb2Zmc2V0CisgICAgbGV0IG11dCBvZmZzZXQgPSBoZWFkZXIubm9kZV9vZmZzZXQ7CisgICAgZm9yIGkgaW4gMC4ubm9kZV93cmFwcGVycy5sZW4oKSB7CisgICAgICAgIGxldCBub2RlX2J1Y2tldF9pZHggPSBub2RlX3dyYXBwZXJzW2ldLmJ1Y2tldF9pbmRleDsKKyAgICAgICAgbGV0IG5leHRfbm9kZV9idWNrZXRfaWR4ID0gaWYgaSArIDEgPCBub2RlX3dyYXBwZXJzLmxlbigpIHsKKyAgICAgICAgICAgIFNvbWUobm9kZV93cmFwcGVyc1tpICsgMV0uYnVja2V0X2luZGV4KQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTm9uZQorICAgICAgICB9OworCisgICAgICAgIGlmIGJ1Y2tldHNbbm9kZV9idWNrZXRfaWR4IGFzIHVzaXplXS5pc19ub25lKCkgeworICAgICAgICAgICAgYnVja2V0c1tub2RlX2J1Y2tldF9pZHggYXMgdXNpemVdID0gU29tZShvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBub2RlX3dyYXBwZXJzW2ldLm5vZGUuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKKworICAgICAgICBpZiBsZXQgU29tZShpbmRleCkgPSBuZXh0X25vZGVfYnVja2V0X2lkeCB7CisgICAgICAgICAgICBpZiBpbmRleCA9PSBub2RlX2J1Y2tldF9pZHggeworICAgICAgICAgICAgICAgIG5vZGVfd3JhcHBlcnNbaV0ubm9kZS5uZXh0X29mZnNldCA9IFNvbWUob2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGxldCB0YWJsZSA9IFBhY2thZ2VUYWJsZSB7CisgICAgICAgIGhlYWRlciwKKyAgICAgICAgYnVja2V0cywKKyAgICAgICAgbm9kZXM6IG5vZGVfd3JhcHBlcnMuaW50b19pdGVyKCkubWFwKHxud3wgbncubm9kZSkuY29sbGVjdCgpLAorICAgIH07CisgICAgT2sodGFibGUpCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjpzdG9yYWdlOjp7Z3JvdXBfZmxhZ3NfYnlfcGFja2FnZSwgdGVzdHM6OnBhcnNlX2FsbF90ZXN0X2ZsYWdzfTsKKworICAgIHB1YiBmbiBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlX2Zyb21fc291cmNlKCkgLT4gUmVzdWx0PFBhY2thZ2VUYWJsZT4geworICAgICAgICBsZXQgY2FjaGVzID0gcGFyc2VfYWxsX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IHBhY2thZ2VzID0gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZShjYWNoZXMuaXRlcigpKTsKKyAgICAgICAgY3JlYXRlX3BhY2thZ2VfdGFibGUoIm1vY2t1cCIsICZwYWNrYWdlcykKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHRhYmxlIGNyZWF0aW9uIGFuZCBlYWNoIGZpZWxkCisgICAgZm4gdGVzdF90YWJsZV9jb250ZW50cygpIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlX2Zyb21fc291cmNlKCk7CisgICAgICAgIGFzc2VydCEocGFja2FnZV90YWJsZS5pc19vaygpKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfdGFibGUgPSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfdGFibGUudW53cmFwKCksIGV4cGVjdGVkX3BhY2thZ2VfdGFibGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvdGVzdC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvdGVzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA5Y2RhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy90ZXN0LnJzCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI1tjZmcodGVzdCldCitwdWIgdXNlIHRlc3RfdXRpbHM6Oio7CisKKyNbY2ZnKHRlc3QpXQorcHViIG1vZCB0ZXN0X3V0aWxzIHsKKyAgICB1c2UgY3JhdGU6OmNvbW1hbmRzOjpJbnB1dDsKKyAgICB1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvUGFyc2VkRmxhZ3M7CisgICAgdXNlIGl0ZXJ0b29sczsKKworICAgIHB1YiBjb25zdCBURVNUX1BBQ0tBR0U6ICZzdHIgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IjsKKworICAgIHB1YiBjb25zdCBURVNUX0ZMQUdTX1RFWFRQUk9UTzogJnN0ciA9IHIjIgorcGFyc2VkX2ZsYWcgeworICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IgorICBuYW1lOiAiZGlzYWJsZWRfcm8iCisgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRElTQUJMRUQgKyBSRUFEX09OTFkiCisgIGJ1ZzogIjEyMyIKKyAgc3RhdGU6IERJU0FCTEVECisgIHBlcm1pc3Npb246IFJFQURfT05MWQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvdGVzdC5hY29uZmlnIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgfQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvZmlyc3QudmFsdWVzIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICB9CisgIGlzX2ZpeGVkX3JlYWRfb25seTogZmFsc2UKKyAgaXNfZXhwb3J0ZWQ6IGZhbHNlCisgIGNvbnRhaW5lcjogInN5c3RlbSIKKyAgbWV0YWRhdGEgeworICAgIHB1cnBvc2U6IFBVUlBPU0VfVU5TUEVDSUZJRUQKKyAgfQorfQorcGFyc2VkX2ZsYWcgeworICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IgorICBuYW1lOiAiZGlzYWJsZWRfcnciCisgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRElTQUJMRUQgKyBSRUFEX1dSSVRFIgorICBidWc6ICI0NTYiCisgIHN0YXRlOiBESVNBQkxFRAorICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy90ZXN0LmFjb25maWciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICB9CisgIGlzX2ZpeGVkX3JlYWRfb25seTogZmFsc2UKKyAgaXNfZXhwb3J0ZWQ6IGZhbHNlCisgIGNvbnRhaW5lcjogInN5c3RlbSIKKyAgbWV0YWRhdGEgeworICAgIHB1cnBvc2U6IFBVUlBPU0VfVU5TUEVDSUZJRUQKKyAgfQorfQorcGFyc2VkX2ZsYWcgeworICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IgorICBuYW1lOiAiZGlzYWJsZWRfcndfZXhwb3J0ZWQiCisgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRElTQUJMRUQgKyBSRUFEX1dSSVRFIGFuZCBleHBvcnRlZCIKKyAgYnVnOiAiMTExIgorICBzdGF0ZTogRElTQUJMRUQKKyAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvdGVzdC5hY29uZmlnIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgfQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvZmlyc3QudmFsdWVzIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgfQorICBpc19maXhlZF9yZWFkX29ubHk6IGZhbHNlCisgIGlzX2V4cG9ydGVkOiB0cnVlCisgIGNvbnRhaW5lcjogInN5c3RlbSIKKyAgbWV0YWRhdGEgeworICAgIHB1cnBvc2U6IFBVUlBPU0VfVU5TUEVDSUZJRUQKKyAgfQorfQorcGFyc2VkX2ZsYWcgeworICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IgorICBuYW1lOiAiZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIgorICBuYW1lc3BhY2U6ICJvdGhlcl9uYW1lc3BhY2UiCisgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIERJU0FCTEVEICsgUkVBRF9XUklURSwgYW5kIGlzIGRlZmluZWQgaW4gYW5vdGhlciBuYW1lc3BhY2UiCisgIGJ1ZzogIjk5OSIKKyAgc3RhdGU6IERJU0FCTEVECisgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL3Rlc3QuYWNvbmZpZyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgIH0KKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL2ZpcnN0LnZhbHVlcyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgIH0KKyAgaXNfZml4ZWRfcmVhZF9vbmx5OiBmYWxzZQorICBpc19leHBvcnRlZDogZmFsc2UKKyAgY29udGFpbmVyOiAic3lzdGVtIgorICBtZXRhZGF0YSB7CisgICAgcHVycG9zZTogUFVSUE9TRV9VTlNQRUNJRklFRAorICB9Cit9CitwYXJzZWRfZmxhZyB7CisgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgIG5hbWU6ICJlbmFibGVkX2ZpeGVkX3JvIgorICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIGZpeGVkIFJFQURfT05MWSArIEVOQUJMRUQiCisgIGJ1ZzogIiIKKyAgc3RhdGU6IEVOQUJMRUQKKyAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy90ZXN0LmFjb25maWciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgIH0KKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL2ZpcnN0LnZhbHVlcyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICB9CisgIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZQorICBpc19leHBvcnRlZDogZmFsc2UKKyAgY29udGFpbmVyOiAic3lzdGVtIgorICBtZXRhZGF0YSB7CisgICAgcHVycG9zZTogUFVSUE9TRV9VTlNQRUNJRklFRAorICB9Cit9CitwYXJzZWRfZmxhZyB7CisgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgIG5hbWU6ICJlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIgorICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIGZpeGVkIEVOQUJMRUQgKyBSRUFEX09OTFkgYW5kIGV4cG9ydGVkIgorICBidWc6ICIxMTEiCisgIHN0YXRlOiBFTkFCTEVECisgIHBlcm1pc3Npb246IFJFQURfT05MWQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvdGVzdC5hY29uZmlnIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICB9CisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy9maXJzdC52YWx1ZXMiCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgfQorICBpc19maXhlZF9yZWFkX29ubHk6IHRydWUKKyAgaXNfZXhwb3J0ZWQ6IHRydWUKKyAgY29udGFpbmVyOiAic3lzdGVtIgorICBtZXRhZGF0YSB7CisgICAgcHVycG9zZTogUFVSUE9TRV9VTlNQRUNJRklFRAorICB9Cit9CitwYXJzZWRfZmxhZyB7CisgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgIG5hbWU6ICJlbmFibGVkX3JvIgorICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIEVOQUJMRUQgKyBSRUFEX09OTFkiCisgIGJ1ZzogImFiYyIKKyAgc3RhdGU6IEVOQUJMRUQKKyAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy90ZXN0LmFjb25maWciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICB9CisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy9maXJzdC52YWx1ZXMiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICB9CisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy9zZWNvbmQudmFsdWVzIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgIH0KKyAgaXNfZml4ZWRfcmVhZF9vbmx5OiBmYWxzZQorICBpc19leHBvcnRlZDogZmFsc2UKKyAgY29udGFpbmVyOiAic3lzdGVtIgorICBtZXRhZGF0YSB7CisgICAgcHVycG9zZTogUFVSUE9TRV9CVUdGSVgKKyAgfQorfQorcGFyc2VkX2ZsYWcgeworICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IgorICBuYW1lOiAiZW5hYmxlZF9yb19leHBvcnRlZCIKKyAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBFTkFCTEVEICsgUkVBRF9PTkxZIGFuZCBleHBvcnRlZCIKKyAgYnVnOiAiMTExIgorICBzdGF0ZTogRU5BQkxFRAorICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL3Rlc3QuYWNvbmZpZyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgIH0KKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL2ZpcnN0LnZhbHVlcyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICB9CisgIGlzX2ZpeGVkX3JlYWRfb25seTogZmFsc2UKKyAgaXNfZXhwb3J0ZWQ6IHRydWUKKyAgY29udGFpbmVyOiAic3lzdGVtIgorICBtZXRhZGF0YSB7CisgICAgcHVycG9zZTogUFVSUE9TRV9VTlNQRUNJRklFRAorICB9Cit9CitwYXJzZWRfZmxhZyB7CisgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgIG5hbWU6ICJlbmFibGVkX3J3IgorICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIEVOQUJMRUQgKyBSRUFEX1dSSVRFIgorICBidWc6ICIiCisgIHN0YXRlOiBFTkFCTEVECisgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL3Rlc3QuYWNvbmZpZyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgIH0KKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL2ZpcnN0LnZhbHVlcyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgfQorICBpc19maXhlZF9yZWFkX29ubHk6IGZhbHNlCisgIGlzX2V4cG9ydGVkOiBmYWxzZQorICBjb250YWluZXI6ICJzeXN0ZW0iCisgIG1ldGFkYXRhIHsKKyAgICBwdXJwb3NlOiBQVVJQT1NFX1VOU1BFQ0lGSUVECisgIH0KK30KKyIjOworCisgICAgcHViIGZuIHBhcnNlX3JlYWRfb25seV90ZXN0X2ZsYWdzKCkgLT4gUHJvdG9QYXJzZWRGbGFncyB7CisgICAgICAgIGxldCBieXRlcyA9IGNyYXRlOjpjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IiwKKyAgICAgICAgICAgIFNvbWUoInN5c3RlbSIpLAorICAgICAgICAgICAgdmVjIVtJbnB1dCB7CisgICAgICAgICAgICAgICAgc291cmNlOiAidGVzdHMvcmVhZF9vbmx5X3Rlc3QuYWNvbmZpZyIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhpbmNsdWRlX2J5dGVzISgiLi4vdGVzdHMvcmVhZF9vbmx5X3Rlc3QuYWNvbmZpZyIpLmFzX3NsaWNlKCkpLAorICAgICAgICAgICAgfV0sCisgICAgICAgICAgICB2ZWMhW0lucHV0IHsKKyAgICAgICAgICAgICAgICBzb3VyY2U6ICJ0ZXN0cy9yZWFkX29ubHlfdGVzdC52YWx1ZXMiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHJlYWRlcjogQm94OjpuZXcoaW5jbHVkZV9ieXRlcyEoIi4uL3Rlc3RzL3JlYWRfb25seV90ZXN0LnZhbHVlcyIpLmFzX3NsaWNlKCkpLAorICAgICAgICAgICAgfV0sCisgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6OkRFRkFVTFRfRkxBR19QRVJNSVNTSU9OLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZieXRlcykudW53cmFwKCkKKyAgICB9CisKKyAgICBwdWIgZm4gcGFyc2VfdGVzdF9mbGFncygpIC0+IFByb3RvUGFyc2VkRmxhZ3MgeworICAgICAgICBsZXQgYnl0ZXMgPSBjcmF0ZTo6Y29tbWFuZHM6OnBhcnNlX2ZsYWdzKAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIsCisgICAgICAgICAgICBTb21lKCJzeXN0ZW0iKSwKKyAgICAgICAgICAgIHZlYyFbSW5wdXQgeworICAgICAgICAgICAgICAgIHNvdXJjZTogInRlc3RzL3Rlc3QuYWNvbmZpZyIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhpbmNsdWRlX2J5dGVzISgiLi4vdGVzdHMvdGVzdC5hY29uZmlnIikuYXNfc2xpY2UoKSksCisgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgIHZlYyFbCisgICAgICAgICAgICAgICAgSW5wdXQgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJ0ZXN0cy9maXJzdC52YWx1ZXMiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICByZWFkZXI6IEJveDo6bmV3KGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy9maXJzdC52YWx1ZXMiKS5hc19zbGljZSgpKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIElucHV0IHsKKyAgICAgICAgICAgICAgICAgICAgc291cmNlOiAidGVzdHMvc2Vjb25kLnZhbHVlcyIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIHJlYWRlcjogQm94OjpuZXcoaW5jbHVkZV9ieXRlcyEoIi4uL3Rlc3RzL3NlY29uZC52YWx1ZXMiKS5hc19zbGljZSgpKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6REVGQVVMVF9GTEFHX1BFUk1JU1NJT04sCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmJ5dGVzKS51bndyYXAoKQorICAgIH0KKworICAgIHB1YiBmbiBmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoYTogJnN0ciwgYjogJnN0cikgLT4gT3B0aW9uPFN0cmluZz4geworICAgICAgICBsZXQgYSA9IGEubGluZXMoKS5tYXAofGxpbmV8IGxpbmUudHJpbV9zdGFydCgpKS5maWx0ZXIofGxpbmV8ICFsaW5lLmlzX2VtcHR5KCkpOworICAgICAgICBsZXQgYiA9IGIubGluZXMoKS5tYXAofGxpbmV8IGxpbmUudHJpbV9zdGFydCgpKS5maWx0ZXIofGxpbmV8ICFsaW5lLmlzX2VtcHR5KCkpOworICAgICAgICBtYXRjaCBpdGVydG9vbHM6OmRpZmZfd2l0aChhLCBiLCB8bGVmdCwgcmlnaHR8IGxlZnQgPT0gcmlnaHQpIHsKKyAgICAgICAgICAgIFNvbWUoaXRlcnRvb2xzOjpEaWZmOjpGaXJzdE1pc21hdGNoKF8sIG11dCBsZWZ0LCBtdXQgcmlnaHQpKSA9PiB7CisgICAgICAgICAgICAgICAgU29tZShmb3JtYXQhKCIne30nIHZzICd7fSciLCBsZWZ0Lm5leHQoKS51bndyYXAoKSwgcmlnaHQubmV4dCgpLnVud3JhcCgpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNvbWUoaXRlcnRvb2xzOjpEaWZmOjpTaG9ydGVyKF8sIG11dCBsZWZ0KSkgPT4geworICAgICAgICAgICAgICAgIFNvbWUoZm9ybWF0ISgiTEhTIHRyYWlsaW5nIGRhdGE6ICd7fSciLCBsZWZ0Lm5leHQoKS51bndyYXAoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBTb21lKGl0ZXJ0b29sczo6RGlmZjo6TG9uZ2VyKF8sIG11dCByaWdodCkpID0+IHsKKyAgICAgICAgICAgICAgICBTb21lKGZvcm1hdCEoIlJIUyB0cmFpbGluZyBkYXRhOiAne30nIiwgcmlnaHQubmV4dCgpLnVud3JhcCgpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vbmUgPT4gTm9uZSwKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigpIHsKKyAgICAgICAgYXNzZXJ0IShmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoIiIsICIiKS5pc19ub25lKCkpOworICAgICAgICBhc3NlcnQhKGZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigiICAgYSIsICJcblxuYVxuIikuaXNfbm9uZSgpKTsKKyAgICAgICAgbGV0IGEgPSByIyIKKyAgICAgICAgcHVibGljIGNsYXNzIEEgeworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTyA9ICJGT08iOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRk9PPSIgKyBGT08pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICIjOworICAgICAgICBsZXQgYiA9IHIjIgorICAgICAgICBwdWJsaWMgY2xhc3MgQSB7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9PID0gIkJBUiI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmb289IiArIEZPTyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGFzc2VydF9lcSEoU29tZShyIyIncHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTyA9ICJGT08iOycgdnMgJ3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT08gPSAiQkFSIjsnIiMudG9fc3RyaW5nKCkpLCBmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoYSwgYikpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgU29tZSgiTEhTIHRyYWlsaW5nIGRhdGE6ICdiJyIudG9fc3RyaW5nKCkpLAorICAgICAgICAgICAgZmlyc3Rfc2lnbmlmaWNhbnRfY29kZV9kaWZmKCJhXG5iIiwgImEiKQorICAgICAgICApOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgU29tZSgiUkhTIHRyYWlsaW5nIGRhdGE6ICdiJyIudG9fc3RyaW5nKCkpLAorICAgICAgICAgICAgZmlyc3Rfc2lnbmlmaWNhbnRfY29kZV9kaWZmKCJhIiwgImFcbmIiKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmI5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCkBAIC0wLDAgKzEsNzAgQEAKK3BhY2thZ2Uge3BhY2thZ2VfbmFtZX07CisKK3t7IGlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkLSB9fQorLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCitpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOwore3sgLWVuZGlmIH19CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaVByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21GZWF0dXJlRmxhZ3MgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKKworICAgIHByaXZhdGUgQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gbUdldFZhbHVlSW1wbDsKKworICAgIHB1YmxpYyBDdXN0b21GZWF0dXJlRmxhZ3MoQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gZ2V0VmFsdWVJbXBsKSBceworICAgICAgICBtR2V0VmFsdWVJbXBsID0gZ2V0VmFsdWVJbXBsOworICAgIH0KKwore3sgLWZvciBpdGVtIGluIGZsYWdfZWxlbWVudHN9fQorICAgIEBPdmVycmlkZQore3sgaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQgfX0gICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2V7eyAtZW5kaWYgfX0KKyAgICBwdWJsaWMgYm9vbGVhbiB7aXRlbS5tZXRob2RfbmFtZX0oKSBceworICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR197aXRlbS5mbGFnX25hbWVfY29uc3RhbnRfc3VmZml4fSwKKyAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6e2l0ZW0ubWV0aG9kX25hbWV9KTsKKyAgICB9Cit7eyBlbmRmb3IgfX0KKwore3sgLWlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkIH19CisgICAgcHVibGljIGJvb2xlYW4gaXNGbGFnUmVhZE9ubHlPcHRpbWl6ZWQoU3RyaW5nIGZsYWdOYW1lKSBceworICAgICAgICBpZiAobVJlYWRPbmx5RmxhZ3NTZXQuY29udGFpbnMoZmxhZ05hbWUpICYmCisgICAgICAgICAgICBpc09wdGltaXphdGlvbkVuYWJsZWQoKSkgXHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgcHJpdmF0ZSBib29sZWFuIGlzT3B0aW1pemF0aW9uRW5hYmxlZCgpIFx7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit7eyAtZW5kaWYgfX0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZhbHVlKFN0cmluZyBmbGFnTmFtZSwgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4gZ2V0dGVyKSBceworICAgICAgICByZXR1cm4gbUdldFZhbHVlSW1wbC50ZXN0KGZsYWdOYW1lLCBnZXR0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmxhZ05hbWVzKCkgXHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICB7eyAtZm9yIGl0ZW0gaW4gZmxhZ19lbGVtZW50cyB9fQorICAgICAgICAgICAgRmxhZ3MuRkxBR197aXRlbS5mbGFnX25hbWVfY29uc3RhbnRfc3VmZml4fQorICAgICAgICAgICAge3sgLWlmIG5vdCBAbGFzdCB9fSx7eyBlbmRpZiB9fQorICAgICAgICAgICAge3sgLWVuZGZvciB9fQorICAgICAgICApOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVJlYWRPbmx5RmxhZ3NTZXQgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAge3sgLWZvciBpdGVtIGluIGZsYWdfZWxlbWVudHMgfX0KKyAgICAgICAgICAgIHt7IC1pZiBub3QgaXRlbS5pc19yZWFkX3dyaXRlIH19CisgICAgICAgICAgICBGbGFncy5GTEFHX3tpdGVtLmZsYWdfbmFtZV9jb25zdGFudF9zdWZmaXh9LAorICAgICAgICAgICAge3sgLWVuZGlmIH19CisgICAgICAgICAgICB7eyAtZW5kZm9yIH19CisgICAgICAgICAgICAiInsjIFRoZSBlbXB0eSBzdHJpbmcgaGVyZSBpcyB0byByZXNvbHZlIHRoZSBlbmRpbmcgY29tbWEgI30KKyAgICAgICAgKQorICAgICk7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0Zha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0Zha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwZDJjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmFrZUZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIHtwYWNrYWdlX25hbWV9OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBGYWtlRmVhdHVyZUZsYWdzSW1wbCBleHRlbmRzIEN1c3RvbUZlYXR1cmVGbGFncyBceworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQm9vbGVhbj4gbUZsYWdNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBGZWF0dXJlRmxhZ3MgbURlZmF1bHRzOworCisgICAgcHVibGljIEZha2VGZWF0dXJlRmxhZ3NJbXBsKCkgXHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFrZUZlYXR1cmVGbGFnc0ltcGwoRmVhdHVyZUZsYWdzIGRlZmF1bHRzKSBceworICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgbURlZmF1bHRzID0gZGVmYXVsdHM7CisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIG1hcCB3aXRoIG51bGwgdmFsdWVzCisgICAgICAgIGZvciAoU3RyaW5nIGZsYWdOYW1lIDogZ2V0RmxhZ05hbWVzKCkpIFx7CisgICAgICAgICAgICBtRmxhZ01hcC5wdXQoZmxhZ05hbWUsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0VmFsdWUoU3RyaW5nIGZsYWdOYW1lLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPiBnZXR0ZXIpIFx7CisgICAgICAgIEJvb2xlYW4gdmFsdWUgPSB0aGlzLm1GbGFnTWFwLmdldChmbGFnTmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSBceworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChtRGVmYXVsdHMgIT0gbnVsbCkgXHsKKyAgICAgICAgICAgIHJldHVybiBnZXR0ZXIudGVzdChtRGVmYXVsdHMpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZmxhZ05hbWUgKyAiIGlzIG5vdCBzZXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGbGFnKFN0cmluZyBmbGFnTmFtZSwgYm9vbGVhbiB2YWx1ZSkgXHsKKyAgICAgICAgaWYgKCF0aGlzLm1GbGFnTWFwLmNvbnRhaW5zS2V5KGZsYWdOYW1lKSkgXHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIHN1Y2ggZmxhZyAiICsgZmxhZ05hbWUpOworICAgICAgICB9CisgICAgICAgIHRoaXMubUZsYWdNYXAucHV0KGZsYWdOYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXRBbGwoKSBceworICAgICAgICBmb3IgKE1hcC5FbnRyeSBlbnRyeSA6IG1GbGFnTWFwLmVudHJ5U2V0KCkpIFx7CisgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmVhdHVyZUZsYWdzLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzhmMTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2Uge3BhY2thZ2VfbmFtZX07Cit7eyBpZiBub3QgbGlicmFyeV9leHBvcnRlZC0gfX0KKy8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgoraW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKK3t7IC1lbmRpZiB9fQorLyoqIEBoaWRlICovCitwdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVGbGFncyBcewore3sgZm9yIGl0ZW0gaW4gZmxhZ19lbGVtZW50cyB9fQore3sgLWlmIG5vdCBpdGVtLmlzX3JlYWRfd3JpdGUgfX0KK3t7IC1pZiBpdGVtLmRlZmF1bHRfdmFsdWUgfX0KKyAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVUcnVlRm9yUjgKK3t7IC1lbHNlIH19CisgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lRmFsc2VGb3JSOAore3sgLWVuZGlmLSB9fQore3sgLWVuZGlmIH19Cit7eyAtaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQgfX0KKyAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKK3t7IC1lbmRpZiB9fQorICAgIGJvb2xlYW4ge2l0ZW0ubWV0aG9kX25hbWV9KCk7Cit7eyAtZW5kZm9yIH19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDJlM2RiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUKQEAgLTAsMCArMSwxMjMgQEAKK3BhY2thZ2Uge3BhY2thZ2VfbmFtZX07Cit7eyAtaWYgbm90IGlzX3Rlc3RfbW9kZSB9fQore3sgaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQtIH19CisvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KK2ltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7Cit7eyAtZW5kaWYgfX0KKwore3sgLWlmIHJ1bnRpbWVfbG9va3VwX3JlcXVpcmVkIH19CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWc7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuUHJvcGVydGllczsKKworCit7eyAtaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUludGVybmFsUmVhZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7Cit7eyAtZW5kaWYgfX0KKwore3sgLWVuZGlmIH19CisvKiogQGhpZGUgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIFx7Cit7eyAtaWYgcnVudGltZV9sb29rdXBfcmVxdWlyZWQgfX0KK3t7IC1mb3IgbmFtZXNwYWNlX3dpdGhfZmxhZ3MgaW4gbmFtZXNwYWNlX2ZsYWdzIH19CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB7bmFtZXNwYWNlX3dpdGhfZmxhZ3MubmFtZXNwYWNlfV9pc19jYWNoZWQgPSBmYWxzZTsKK3t7IC1lbmRmb3ItIH19CisKK3t7IGZvciBmbGFnIGluIGZsYWdfZWxlbWVudHMgfX0KK3t7LSBpZiBmbGFnLmlzX3JlYWRfd3JpdGUgfX0KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHtmbGFnLm1ldGhvZF9uYW1lfSA9IHtmbGFnLmRlZmF1bHRfdmFsdWV9Owore3sgLWVuZGlmIH19Cit7eyAtZW5kZm9yIH19Cit7eyAtaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CisgICAgU3RvcmFnZUludGVybmFsUmVhZGVyIHJlYWRlcjsKKyAgICBib29sZWFuIHJlYWRGcm9tTmV3U3RvcmFnZTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQWNvbmZpZ0phdmFDb2RlZ2VuIjsKKworICAgIHB1YmxpYyBGZWF0dXJlRmxhZ3NJbXBsKCkgXHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIik7CisgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSBceworICAgICAgICAgICAgcmVhZEZyb21OZXdTdG9yYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIoIntjb250YWluZXJ9IiwgIntwYWNrYWdlX25hbWV9Iik7CisgICAgICAgIH0KKyAgICB9Cit7eyAtZW5kaWYgfX0KK3t7IGZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KKyAgICBwcml2YXRlIHZvaWQgbG9hZF9vdmVycmlkZXNfe25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX0oKSBceworICAgICAgICB0cnkgXHsKK3t7IC1pZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KKyAgICAgICAgICAgIGJvb2xlYW4gdmFsOwore3sgLWVuZGlmIH19CisgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygie25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX0iKTsKK3t7IC1mb3IgZmxhZyBpbiBuYW1lc3BhY2Vfd2l0aF9mbGFncy5mbGFncyB9fQore3sgLWlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQorICAgICAgICAgICAge2ZsYWcubWV0aG9kX25hbWV9ID0KKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR197ZmxhZy5mbGFnX25hbWVfY29uc3RhbnRfc3VmZml4fSwge2ZsYWcuZGVmYXVsdF92YWx1ZX0pOwore3sgLWlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQorICAgICAgICAgICAgaWYgKHJlYWRGcm9tTmV3U3RvcmFnZSkgXHsKKyAgICAgICAgICAgICAgICB0cnkgXHsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoe2ZsYWcuZmxhZ19vZmZzZXR9KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB7ZmxhZy5tZXRob2RfbmFtZX0pIFx7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJzdWNjZXNzOiB7ZmxhZy5tZXRob2RfbmFtZX0gdmFsdWUgbWF0Y2hlcyIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgXHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3I6IHtmbGFnLm1ldGhvZF9uYW1lfSB2YWx1ZSBtaXNtYXRjaCwgbmV3IHN0b3JhZ2UgdmFsdWUgaXMgJXMsIG9sZCBzdG9yYWdlIHZhbHVlIGlzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIHtmbGFnLm1ldGhvZF9uYW1lfSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIFx7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywiZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgdmFsdWUgb2Yge2ZsYWcubWV0aG9kX25hbWV9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQore3sgLWVuZGlmIH19Cit7eyAtZW5kaWYgfX0KK3t7IC1lbmRmb3IgfX0KKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgXHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCB2YWx1ZSBmcm9tIG5hbWVzcGFjZSB7bmFtZXNwYWNlX3dpdGhfZmxhZ3MubmFtZXNwYWNlfSAiCisgICAgICAgICAgICAgICAgKyAiZnJvbSBEZXZpY2VDb25maWcuIEl0IGNvdWxkIGJlIHRoYXQgdGhlIGNvZGUgdXNpbmcgZmxhZyAiCisgICAgICAgICAgICAgICAgKyAiZXhlY3V0ZWQgYmVmb3JlIFNldHRpbmdzUHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uIFBsZWFzZSB1c2UgIgorICAgICAgICAgICAgICAgICsgImZpeGVkIHJlYWQtb25seSBmbGFnIGJ5IGFkZGluZyBpc19maXhlZF9yZWFkX29ubHk6IHRydWUgaW4gIgorICAgICAgICAgICAgICAgICsgImZsYWcgZGVjbGFyYXRpb24uIiwKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9X2lzX2NhY2hlZCA9IHRydWU7CisgICAgfQore3sgZW5kZm9yLSB9fQore3sgLWVuZGlmIH19eyMtIGVuZCBvZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCAjfQore3sgLWZvciBmbGFnIGluIGZsYWdfZWxlbWVudHMgfX0KKyAgICBAT3ZlcnJpZGUKK3t7IC1pZiBub3QgbGlicmFyeV9leHBvcnRlZCB9fQorICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQore3sgLWVuZGlmIH19CisgICAgcHVibGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9KCkgXHsKK3t7IC1pZiBmbGFnLmlzX3JlYWRfd3JpdGUgfX0KKyAgICAgICAgaWYgKCF7ZmxhZy5kZXZpY2VfY29uZmlnX25hbWVzcGFjZX1faXNfY2FjaGVkKSBceworICAgICAgICAgICAgbG9hZF9vdmVycmlkZXNfe2ZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHtmbGFnLm1ldGhvZF9uYW1lfTsKK3t7IC1lbHNlIH19CisgICAgICAgIHJldHVybiB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKK3t7IC1lbmRpZiB9fQorICAgIH0KK3t7IGVuZGZvciB9fQorfQore3sgZWxzZSB9fQoreyMtIEdlbmVyYXRlIG9ubHkgc3R1YiBpZiBpbiB0ZXN0IG1vZGUgI30KKy8qKiBAaGlkZSAqLworcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKK3t7IGZvciBmbGFnIGluIGZsYWdfZWxlbWVudHMgfX0KKyAgICBAT3ZlcnJpZGUKK3t7IC1pZiBub3QgbGlicmFyeV9leHBvcnRlZCB9fQorICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKK3t7IC1lbmRpZiB9fQorICAgIHB1YmxpYyBib29sZWFuIHtmbGFnLm1ldGhvZF9uYW1lfSgpIFx7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgIH0KK3t7IGVuZGZvci0gfX0KK30KK3t7IGVuZGlmIH19CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZsYWdzLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZsYWdzLmphdmEudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmNzBiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmxhZ3MuamF2YS50ZW1wbGF0ZQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIHtwYWNrYWdlX25hbWV9Owore3sgaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQtIH19CisvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KK2ltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7Cit7eyAtZW5kaWYgfX0KKy8qKiBAaGlkZSAqLworcHVibGljIGZpbmFsIGNsYXNzIEZsYWdzIFx7Cit7eyAtZm9yIGl0ZW0gaW4gZmxhZ19lbGVtZW50c319CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR197aXRlbS5mbGFnX25hbWVfY29uc3RhbnRfc3VmZml4fSA9ICJ7aXRlbS5kZXZpY2VfY29uZmlnX2ZsYWd9IjsKK3t7LSBlbmRmb3IgfX0KK3t7IC1mb3IgaXRlbSBpbiBmbGFnX2VsZW1lbnRzfX0KK3t7IC1pZiBub3QgaXRlbS5pc19yZWFkX3dyaXRlIH19Cit7eyAtaWYgaXRlbS5kZWZhdWx0X3ZhbHVlIH19CisgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4Cit7eyAtZWxzZSB9fQorICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZUZhbHNlRm9yUjgKK3t7IC1lbmRpZiB9fQore3sgLWVuZGlmIH19Cit7eyAtaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQgfX0KKyAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKK3t7IC1lbmRpZiB9fQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB7aXRlbS5tZXRob2RfbmFtZX0oKSBceworICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy57aXRlbS5tZXRob2RfbmFtZX0oKTsKKyAgICB9Cit7eyAtZW5kZm9yIH19Cit7eyAtaWYgaXNfdGVzdF9tb2RlIH19CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZlYXR1cmVGbGFncyhGZWF0dXJlRmxhZ3MgZmVhdHVyZUZsYWdzKSBceworICAgICAgICBGbGFncy5GRUFUVVJFX0ZMQUdTID0gZmVhdHVyZUZsYWdzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bnNldEZlYXR1cmVGbGFncygpIFx7CisgICAgICAgIEZsYWdzLkZFQVRVUkVfRkxBR1MgPSBudWxsOworICAgIH0KK3t7IC1lbmRpZiB9fQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRmVhdHVyZUZsYWdzIEZFQVRVUkVfRkxBR1N7eyAtaWYgbm90IGlzX3Rlc3RfbW9kZSB9fSA9IG5ldyBGZWF0dXJlRmxhZ3NJbXBsKCl7eyAtZW5kaWYtIH19OworCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9leHBvcnRlZF9oZWFkZXIudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9leHBvcnRlZF9oZWFkZXIudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3ODUzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvY3BwX2V4cG9ydGVkX2hlYWRlci50ZW1wbGF0ZQpAQCAtMCwwICsxLDkyIEBACisjcHJhZ21hIG9uY2UKKwore3sgaWYgbm90IGlzX3Rlc3RfbW9kZS0gfX0KK3t7IGlmIGhhc19maXhlZF9yZWFkX29ubHktIH19CisjaWZuZGVmIHtwYWNrYWdlX21hY3JvfQorI2RlZmluZSB7cGFja2FnZV9tYWNyb30oRkxBRykge3BhY2thZ2VfbWFjcm99XyMjRkxBRworI2VuZGlmCit7eyBmb3IgaXRlbSBpbiBjbGFzc19lbGVtZW50cyB9fQore3sgLWlmIGl0ZW0uaXNfZml4ZWRfcmVhZF9vbmx5IH19CisjaWZuZGVmIHtwYWNrYWdlX21hY3JvfV97aXRlbS5mbGFnX21hY3JvfQorI2RlZmluZSB7cGFja2FnZV9tYWNyb31fe2l0ZW0uZmxhZ19tYWNyb30ge2l0ZW0uZGVmYXVsdF92YWx1ZX0KKyNlbmRpZgore3sgLWVuZGlmIH19Cit7eyAtZW5kZm9yIH19Cit7eyAtZW5kaWYgfX0KK3t7IC1lbmRpZiB9fQorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIHtjcHBfbmFtZXNwYWNlfSBceworCitjbGFzcyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSBceworcHVibGljOgorICAgIHZpcnR1YWwgfmZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlKCkgPSBkZWZhdWx0OworICAgIHt7IC1mb3IgaXRlbSBpbiBjbGFzc19lbGVtZW50c319CisgICAgdmlydHVhbCBib29sIHtpdGVtLmZsYWdfbmFtZX0oKSA9IDA7CisKKyAgICB7eyAtaWYgaXNfdGVzdF9tb2RlIH19CisgICAgdmlydHVhbCB2b2lkIHtpdGVtLmZsYWdfbmFtZX0oYm9vbCB2YWwpID0gMDsKKyAgICB7eyAtZW5kaWYgfX0KKyAgICB7eyAtZW5kZm9yIH19CisKKyAgICB7eyAtaWYgaXNfdGVzdF9tb2RlIH19CisgICAgdmlydHVhbCB2b2lkIHJlc2V0X2ZsYWdzKCkgXHt9CisgICAge3sgLWVuZGlmIH19Cit9OworCitleHRlcm4gc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl87CisKK3t7IGZvciBpdGVtIGluIGNsYXNzX2VsZW1lbnRzfX0KK2lubGluZSBib29sIHtpdGVtLmZsYWdfbmFtZX0oKSBceworICAgIHt7IC1pZiBpc190ZXN0X21vZGUgfX0KKyAgICByZXR1cm4gcHJvdmlkZXJfLT57aXRlbS5mbGFnX25hbWV9KCk7CisgICAge3sgLWVsc2UgfX0KKyAgICB7eyAtaWYgaXRlbS5yZWFkd3JpdGUgfX0KKyAgICByZXR1cm4gcHJvdmlkZXJfLT57aXRlbS5mbGFnX25hbWV9KCk7CisgICAge3sgLWVsc2UgfX0KKyAgICB7eyAtaWYgaXRlbS5pc19maXhlZF9yZWFkX29ubHkgfX0KKyAgICByZXR1cm4ge3BhY2thZ2VfbWFjcm99X3tpdGVtLmZsYWdfbWFjcm99OworICAgIHt7IC1lbHNlIH19CisgICAgcmV0dXJuIHtpdGVtLmRlZmF1bHRfdmFsdWV9OworICAgIHt7IC1lbmRpZiB9fQorICAgIHt7IC1lbmRpZiB9fQorICAgIHt7IC1lbmRpZiB9fQorfQorCit7eyAtaWYgaXNfdGVzdF9tb2RlIH19CitpbmxpbmUgdm9pZCB7aXRlbS5mbGFnX25hbWV9KGJvb2wgdmFsKSBceworICAgIHByb3ZpZGVyXy0+e2l0ZW0uZmxhZ19uYW1lfSh2YWwpOworfQore3sgLWVuZGlmIH19Cit7eyAtZW5kZm9yIH19CisKK3t7IC1pZiBpc190ZXN0X21vZGUgfX0KK2lubGluZSB2b2lkIHJlc2V0X2ZsYWdzKCkgXHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5yZXNldF9mbGFncygpOworfQore3sgLWVuZGlmIH19CisKK30KKworZXh0ZXJuICJDIiBceworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKK3t7IGZvciBpdGVtIGluIGNsYXNzX2VsZW1lbnRzIH19Citib29sIHtoZWFkZXJ9X3tpdGVtLmZsYWdfbmFtZX0oKTsKKwore3sgLWlmIGlzX3Rlc3RfbW9kZSB9fQordm9pZCBzZXRfe2hlYWRlcn1fe2l0ZW0uZmxhZ19uYW1lfShib29sIHZhbCk7Cit7eyAtZW5kaWYgfX0KK3t7IC1lbmRmb3IgfX0KKwore3sgLWlmIGlzX3Rlc3RfbW9kZSB9fQordm9pZCB7aGVhZGVyfV9yZXNldF9mbGFncygpOwore3sgLWVuZGlmIH19CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfc291cmNlX2ZpbGUudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9zb3VyY2VfZmlsZS50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGRkYTdkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfc291cmNlX2ZpbGUudGVtcGxhdGUKQEAgLTAsMCArMSwxODkgQEAKKyNpbmNsdWRlICJ7aGVhZGVyfS5oIgorCit7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuaHBwIgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisKKyNkZWZpbmUgQUxPR0kobXNnLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIkFjb25maWdUZXN0TWlzc2lvbjEiLCAobXNnKSwgX19WQV9BUkdTX18pCisKK3t7IGVuZGlmIH19CisKK3t7IGlmIHJlYWR3cml0ZS0gfX0KKyNpbmNsdWRlIDxzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzL2dldF9mbGFncy5oPgore3sgZW5kaWYgfX0KK3t7IGlmIGlzX3Rlc3RfbW9kZSB9fQorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8c3RyaW5nPgore3sgLWVsc2UtIH19Cit7eyBpZiByZWFkd3JpdGUtIH19CisjaW5jbHVkZSA8dmVjdG9yPgore3sgLWVuZGlmIH19Cit7eyAtZW5kaWYgfX0KKworbmFtZXNwYWNlIHtjcHBfbmFtZXNwYWNlfSBceworCit7eyBpZiBpc190ZXN0X21vZGUgfX0KKyAgICBjbGFzcyBmbGFnX3Byb3ZpZGVyIDogcHVibGljIGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlIFx7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBib29sPiBvdmVycmlkZXNfOworCisgICAgcHVibGljOgorICAgICAgICBmbGFnX3Byb3ZpZGVyKCkKKyAgICAgICAgICAgIDogb3ZlcnJpZGVzXygpCisgICAgICAgIFx7fQorCit7eyBmb3IgaXRlbSBpbiBjbGFzc19lbGVtZW50cyB9fQorICAgICAgICB2aXJ0dWFsIGJvb2wge2l0ZW0uZmxhZ19uYW1lfSgpIG92ZXJyaWRlIFx7CisgICAgICAgICAgICBhdXRvIGl0ID0gb3ZlcnJpZGVzXy5maW5kKCJ7aXRlbS5mbGFnX25hbWV9Iik7CisgICAgICAgICAgICAgIGlmIChpdCAhPSBvdmVycmlkZXNfLmVuZCgpKSBceworICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICB9IGVsc2UgXHsKKyAgICAgICAgICAgICAge3sgaWYgaXRlbS5yZWFkd3JpdGUtIH19CisgICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3Mue2l0ZW0uZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9IiwKKyAgICAgICAgICAgICAgICAgICJ7aXRlbS5kZXZpY2VfY29uZmlnX2ZsYWd9IiwKKyAgICAgICAgICAgICAgICAgICJ7aXRlbS5kZWZhdWx0X3ZhbHVlfSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAge3sgLWVsc2UgfX0KKyAgICAgICAgICAgICAgICAgIHJldHVybiB7aXRlbS5kZWZhdWx0X3ZhbHVlfTsKKyAgICAgICAgICAgICAge3sgLWVuZGlmIH19CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQge2l0ZW0uZmxhZ19uYW1lfShib29sIHZhbCkgb3ZlcnJpZGUgXHsKKyAgICAgICAgICAgIG92ZXJyaWRlc19bIntpdGVtLmZsYWdfbmFtZX0iXSA9IHZhbDsKKyAgICAgICAgfQore3sgZW5kZm9yIH19CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlc2V0X2ZsYWdzKCkgb3ZlcnJpZGUgXHsKKyAgICAgICAgICAgIG92ZXJyaWRlc18uY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH07CisKK3t7IC1lbHNlLSB9fQorCisgICAgY2xhc3MgZmxhZ19wcm92aWRlciA6IHB1YmxpYyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSBceworICAgIHB1YmxpYzoKKworICAgICAgICB7eyAtZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHMgfX0KKworICAgICAgICB2aXJ0dWFsIGJvb2wge2l0ZW0uZmxhZ19uYW1lfSgpIG92ZXJyaWRlIFx7CisgICAgICAgICAgICB7eyAtaWYgaXRlbS5yZWFkd3JpdGUgfX0KKyAgICAgICAgICAgIGlmIChjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dID09IC0xKSBceworICAgICAgICAgICAgICAgIGNhY2hlX1t7aXRlbS5yZWFkd3JpdGVfaWR4fV0gPSBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy57aXRlbS5kZXZpY2VfY29uZmlnX25hbWVzcGFjZX0iLAorICAgICAgICAgICAgICAgICAgICAie2l0ZW0uZGV2aWNlX2NvbmZpZ19mbGFnfSIsCisgICAgICAgICAgICAgICAgICAgICJ7aXRlbS5kZWZhdWx0X3ZhbHVlfSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dOworICAgICAgICAgICAge3sgLWVsc2UgfX0KKyAgICAgICAgICAgIHt7IC1pZiBpdGVtLmlzX2ZpeGVkX3JlYWRfb25seSB9fQorICAgICAgICAgICAgcmV0dXJuIHtwYWNrYWdlX21hY3JvfV97aXRlbS5mbGFnX21hY3JvfTsKKyAgICAgICAgICAgIHt7IC1lbHNlIH19CisgICAgICAgICAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07CisgICAgICAgICAgICB7eyAtZW5kaWYgfX0KKyAgICAgICAgICAgIHt7IC1lbmRpZiB9fQorICAgICAgICB9CisgICAgICAgIHt7IC1lbmRmb3IgfX0KKyAgICB7eyBpZiByZWFkd3JpdGUtIH19CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50OF90PiBjYWNoZV8gPSBzdGQ6OnZlY3RvcjxpbnQ4X3Q+KHtyZWFkd3JpdGVfY291bnR9LCAtMSk7CisgICAge3sgLWVuZGlmIH19CisgICAgfTsKKworCit7eyAtZW5kaWYgfX0KKworc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl8gPQorICAgIHN0ZDo6bWFrZV91bmlxdWU8ZmxhZ19wcm92aWRlcj4oKTsKK30KKwore3sgZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHMgfX0KK2Jvb2wge2hlYWRlcn1fe2l0ZW0uZmxhZ19uYW1lfSgpIFx7CisgICAge3sgLWlmIGlzX3Rlc3RfbW9kZSB9fQorICAgIHJldHVybiB7Y3BwX25hbWVzcGFjZX06OntpdGVtLmZsYWdfbmFtZX0oKTsKKyAgICB7eyAtZWxzZSB9fQorICAgIHt7IC1pZiBpdGVtLnJlYWR3cml0ZSB9fQorICAgIHJldHVybiB7Y3BwX25hbWVzcGFjZX06OntpdGVtLmZsYWdfbmFtZX0oKTsKKyAgICB7eyAtZWxzZSB9fQorICAgIHt7IGlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQorICAgIGF1dG8gcmVzdWx0ID0KKyAgICAgICAge3sgaWYgaXRlbS5pc19maXhlZF9yZWFkX29ubHkgfX0KKwkgICAge3BhY2thZ2VfbWFjcm99X3tpdGVtLmZsYWdfbWFjcm99CisJe3sgZWxzZSB9fQorCSAgICB7aXRlbS5kZWZhdWx0X3ZhbHVlfQorCXt7IGVuZGlmIH19OworCisgICAgc3RydWN0IHN0YXQgYnVmZmVyOworICAgIGlmIChzdGF0KCIvbWV0YWRhdGEvYWNvbmZpZ190ZXN0X21pc3Npb25zL21pc3Npb25fMSIsICZidWZmZXIpICE9IDApIFx7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYXV0byBwYWNrYWdlX21hcF9maWxlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCisgICAgICAgICJ7aXRlbS5jb250YWluZXJ9IiwKKyAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OnBhY2thZ2VfbWFwKTsKKyAgICBpZiAoIXBhY2thZ2VfbWFwX2ZpbGUub2soKSkgXHsKKyAgICAgICAgQUxPR0koImVycm9yOiBmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgbWFwIGZpbGU6ICVzIiwgcGFja2FnZV9tYXBfZmlsZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGF1dG8gcGFja2FnZV9yZWFkX2NvbnRleHQgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgKKyAgICAgICAgKipwYWNrYWdlX21hcF9maWxlLCAie3BhY2thZ2V9Iik7CisgICAgaWYgKCFwYWNrYWdlX3JlYWRfY29udGV4dC5vaygpKSBceworICAgICAgICBBTE9HSSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIGNvbnRleHQ6ICVzIiwgcGFja2FnZV9tYXBfZmlsZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGRlbGV0ZSAqcGFja2FnZV9tYXBfZmlsZTsKKworICAgIGF1dG8gZmxhZ192YWxfbWFwID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCisgICAgICAgICJ7aXRlbS5jb250YWluZXJ9IiwKKyAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfdmFsKTsKKyAgICBpZiAoIWZsYWdfdmFsX21hcC5vaygpKSBceworICAgICAgICBBTE9HSSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiAlcyIsIHBhY2thZ2VfbWFwX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBhdXRvIHZhbHVlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKAorICAgICAgICAqKmZsYWdfdmFsX21hcCwKKyAgICAgICAgcGFja2FnZV9yZWFkX2NvbnRleHQtPmJvb2xlYW5fc3RhcnRfaW5kZXggKyB7aXRlbS5mbGFnX29mZnNldH0pOworICAgIGlmICghdmFsdWUub2soKSkgXHsKKyAgICAgICAgQUxPR0koImVycm9yOiBmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsOiAlcyIsIHBhY2thZ2VfbWFwX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBkZWxldGUgKmZsYWdfdmFsX21hcDsKKworICAgIGlmICgqdmFsdWUgIT0gcmVzdWx0KSBceworICAgICAgICBBTE9HSSgiZXJyb3I6IG5ldyBzdG9yYWdlIHZhbHVlICclZCcgZG9lcyBub3QgbWF0Y2ggY3VycmVudCB2YWx1ZSAnJWQnIiwgKnZhbHVlLCByZXN1bHQpOworICAgIH0gZWxzZSBceworICAgICAgICBBTE9HSSgic3VjY2VzczogbmV3IHN0b3JhZ2UgdmFsdWUgd2FzICclZCwgbGVnYWN5IHN0b3JhZ2Ugd2FzICclZCciLCAqdmFsdWUsIHJlc3VsdCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB7eyBlbHNlIH19CisgICAge3sgLWlmIGl0ZW0uaXNfZml4ZWRfcmVhZF9vbmx5IH19CisgICAgcmV0dXJuIHtwYWNrYWdlX21hY3JvfV97aXRlbS5mbGFnX21hY3JvfTsKKyAgICB7eyAtZWxzZSB9fQorICAgIHJldHVybiB7aXRlbS5kZWZhdWx0X3ZhbHVlfTsKKyAgICB7eyAtZW5kaWYgfX0KKyAgICB7eyAtZW5kaWYgfX0KKyAgICB7eyAtZW5kaWYgfX0KKyAgICB7eyAtZW5kaWYgfX0KK30KKwore3sgLWlmIGlzX3Rlc3RfbW9kZSB9fQordm9pZCBzZXRfe2hlYWRlcn1fe2l0ZW0uZmxhZ19uYW1lfShib29sIHZhbCkgXHsKKyAgICB7Y3BwX25hbWVzcGFjZX06OntpdGVtLmZsYWdfbmFtZX0odmFsKTsKK30KK3t7IC1lbmRpZiB9fQore3sgZW5kZm9yIH19CisKK3t7IC1pZiBpc190ZXN0X21vZGUgfX0KK3ZvaWQge2hlYWRlcn1fcmVzZXRfZmxhZ3MoKSBceworICAgICB7Y3BwX25hbWVzcGFjZX06OnJlc2V0X2ZsYWdzKCk7Cit9Cit7eyAtZW5kaWYgfX0KKworCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3QudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3QudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkOWQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvcnVzdC50ZW1wbGF0ZQpAQCAtMCwwICsxLDE3OSBAQAorLy8hIGNvZGVnZW5lcmF0ZWQgcnVzdCBmbGFnIGxpYgordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6XHtNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGUsIFBhY2thZ2VSZWFkQ29udGV4dCwgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUsIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUsIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dH07Cit1c2Ugc3RkOjpwYXRoOjpQYXRoOwordXNlIHN0ZDo6aW86OldyaXRlOwordXNlIGxvZzo6XHtsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CisKK3N0YXRpYyBTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRTogJnN0ciA9CisgICAgIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIjsKK3N0YXRpYyBNSUdSQVRJT05fTE9HX1RBRzogJnN0ciA9ICJBY29uZmlnVGVzdE1pc3Npb24xIjsKKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOworCit7eyBpZiBoYXNfcmVhZHdyaXRlLSB9fQorbGF6eV9zdGF0aWM6Omxhenlfc3RhdGljISBceworICAgIHt7IGlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQorICAgIHN0YXRpYyByZWYgUEFDS0FHRV9PRkZTRVQ6IFJlc3VsdDxPcHRpb248dTMyPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gPSB1bnNhZmUgXHsKKyAgICAgICAgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoIntjb250YWluZXJ9IiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKQorICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2VfbWFwfCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwLCAie3BhY2thZ2V9IikpCisgICAgICAgIC5tYXAofGNvbnRleHR8IGNvbnRleHQubWFwKHxjfCBjLmJvb2xlYW5fc3RhcnRfaW5kZXgpKQorICAgIH07CisKKyAgICBzdGF0aWMgcmVmIEZMQUdfVkFMX01BUDogUmVzdWx0PE1tYXAsIEFjb25maWdTdG9yYWdlRXJyb3I+ID0gdW5zYWZlIFx7CisgICAgICAgIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7Y29udGFpbmVyfSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkKKyAgICB9OworICAgIHt7IC1lbmRpZiB9fQorCit7eyAtZm9yIGZsYWcgaW4gdGVtcGxhdGVfZmxhZ3MgfX0KKyAgICB7eyAtaWYgZmxhZy5yZWFkd3JpdGUgfX0KKyAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3Ige2ZsYWcubmFtZX0KKyAgICB7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KKyAgICBzdGF0aWMgcmVmIENBQ0hFRF97ZmxhZy5uYW1lfTogYm9vbCA9IFx7CisgICAgICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgImFjb25maWdfZmxhZ3Mue2ZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9IiwKKyAgICAgICAgICAgICJ7ZmxhZy5kZXZpY2VfY29uZmlnX2ZsYWd9IiwKKyAgICAgICAgICAgICJ7ZmxhZy5kZWZhdWx0X3ZhbHVlfSIpID09ICJ0cnVlIjsKKworICAgICAgICBpZiBQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIFx7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCisgICAgICAgICAgICBsb2dnZXI6OmluaXQoCisgICAgICAgICAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQorICAgICAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKKworICAgICAgICAgICAgbGV0IGFjb25maWdfc3RvcmFnZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDogXHtlcnJ9IikpCisgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IFx7CisgICAgICAgICAgICAgICAgICAgIFBBQ0tBR0VfT0ZGU0VUCisgICAgICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIG9mZnNldDogXHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCBceworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IFx7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiBceworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyB7ZmxhZy5mbGFnX29mZnNldH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiBce2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIoIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgJ3twYWNrYWdlfSciLnRvX3N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBtYXRjaCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0IFx7CisgICAgICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpIGlmIHN0b3JhZ2VfcmVzdWx0ID09IHJlc3VsdCA9PiBceworICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpJbmZvLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogc3VjY2VzcyEgZmxhZyAne2ZsYWcubmFtZX0nIGNvbnRhaW5lZCBjb3JyZWN0IHZhbHVlLiBMZWdhY3kgc3RvcmFnZSB3YXMgXHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMgXHtzdG9yYWdlX3Jlc3VsdH0iKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSA9PiBceworICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBtaXNtYXRjaCBmb3IgZmxhZyAne2ZsYWcubmFtZX0nLiBMZWdhY3kgc3RvcmFnZSB3YXMgXHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMgXHtzdG9yYWdlX3Jlc3VsdH0iKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEVycihlcnIpID0+IFx7CisgICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IFx7ZXJyfSIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0CisgICAgICAgIH07CisgICAge3sgZWxzZSB9fQorICAgIHN0YXRpYyByZWYgQ0FDSEVEX3tmbGFnLm5hbWV9OiBib29sID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgImFjb25maWdfZmxhZ3Mue2ZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9IiwKKyAgICAgICAgIntmbGFnLmRldmljZV9jb25maWdfZmxhZ30iLAorICAgICAgICAie2ZsYWcuZGVmYXVsdF92YWx1ZX0iKSA9PSAidHJ1ZSI7CisgICAge3sgZW5kaWYgfX0KKyAgICB7eyAtZW5kaWYgfX0KK3t7IC1lbmRmb3IgfX0KK30KK3t7IC1lbmRpZiB9fQorCitpbXBsIEZsYWdQcm92aWRlciBceworCit7eyBmb3IgZmxhZyBpbiB0ZW1wbGF0ZV9mbGFncyB9fQorICAgIC8vLyBxdWVyeSBmbGFnIHtmbGFnLm5hbWV9CisgICAgcHViIGZuIHtmbGFnLm5hbWV9KCZzZWxmKSAtPiBib29sIFx7CisgICAgICAgIHt7IC1pZiBmbGFnLnJlYWR3cml0ZSB9fQorICAgICAgICAqQ0FDSEVEX3tmbGFnLm5hbWV9CisgICAgICAgIHt7IC1lbHNlIH19CisgICAgICAgIHtmbGFnLmRlZmF1bHRfdmFsdWV9CisgICAgICAgIHt7IC1lbmRpZiB9fQorICAgIH0KK3t7IGVuZGZvciB9fQorCit9CisKKy8vLyBmbGFnIHByb3ZpZGVyCitwdWIgc3RhdGljIFBST1ZJREVSOiBGbGFnUHJvdmlkZXIgPSBGbGFnUHJvdmlkZXI7CisKK3t7IGZvciBmbGFnIGluIHRlbXBsYXRlX2ZsYWdzIH19CisvLy8gcXVlcnkgZmxhZyB7ZmxhZy5uYW1lfQorI1tpbmxpbmUoYWx3YXlzKV0KK3t7IC1pZiBmbGFnLnJlYWR3cml0ZSB9fQorcHViIGZuIHtmbGFnLm5hbWV9KCkgLT4gYm9vbCBceworICAgIFBST1ZJREVSLntmbGFnLm5hbWV9KCkKK3t7IC1lbHNlIH19CitwdWIgZm4ge2ZsYWcubmFtZX0oKSAtPiBib29sIFx7CisgICAge3sgaWYgbm90IGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQorICAgIHtmbGFnLmRlZmF1bHRfdmFsdWV9CisgICAge3sgZWxzZSB9fQorCisgICAgbGV0IHJlc3VsdCA9IHtmbGFnLmRlZmF1bHRfdmFsdWV9OworICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIFx7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QKKyAgICAvLyBhcmUgbm9vcHMuCisgICAgbG9nZ2VyOjppbml0KAorICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQorICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSwKKyAgICApOworCisgICAgdW5zYWZlIFx7CisgICAgICAgIGxldCBwYWNrYWdlX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7ZmxhZy5jb250YWluZXJ9IiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSBceworICAgICAgICAgICAgT2soZmlsZSkgPT4gZmlsZSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IFx7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBce2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGxldCBwYWNrYWdlX3JlYWRfY29udGV4dCA9IG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJ7cGFja2FnZX0iKSBceworICAgICAgICAgICAgT2soU29tZShjb250ZXh0KSkgPT4gY29udGV4dCwKKyAgICAgICAgICAgIE9rKE5vbmUpID0+IFx7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBkaWQgbm90IGdldCBjb250ZXh0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJyKSA9PiBceworICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ3tmbGFnLm5hbWV9JzogXHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGZsYWdfdmFsX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7ZmxhZy5jb250YWluZXJ9IiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKSBceworICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKKyAgICAgICAgICAgIEVycihlcnIpID0+IFx7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBce2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIHtmbGFnLmZsYWdfb2Zmc2V0fSArIHBhY2thZ2VfcmVhZF9jb250ZXh0LmJvb2xlYW5fc3RhcnRfaW5kZXgpIFx7CisgICAgICAgICAgICBPayh2YWwpID0+IHZhbCwKKyAgICAgICAgICAgIEVycihlcnIpID0+IFx7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBce2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGlmIHJlc3VsdCAhPSB2YWx1ZSBceworICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmxhZyBtaXNtYXRjaCBmb3IgJ3tmbGFnLm5hbWV9Jy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIFx7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIFx7dmFsdWV9Iik7CisgICAgICAgIH0gZWxzZSBceworICAgICAgICAgICAgbGV0IGRlZmF1bHRfdmFsdWUgPSB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkluZm8sICJBY29uZmlnVGVzdE1pc3Npb24xOiBzdWNjZXNzISBmbGFnICd7ZmxhZy5uYW1lfScgY29udGFpbmVkIGNvcnJlY3QgdmFsdWUuIExlZ2FjeSBzdG9yYWdlIHdhcyBce2RlZmF1bHRfdmFsdWV9LCBuZXcgc3RvcmFnZSB3YXMgXHt2YWx1ZX0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdAorICAgIHt7IGVuZGlmIH19Cit7eyAtZW5kaWYgfX0KK30KK3t7IGVuZGZvciB9fQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9ydXN0X3Rlc3QudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3RfdGVzdC50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDFmNDBhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9ydXN0X3Rlc3QudGVtcGxhdGUKQEAgLTAsMCArMSw2MSBAQAorLy8hIGNvZGVnZW5lcmF0ZWQgcnVzdCBmbGFnIGxpYgorCit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6QlRyZWVNYXA7Cit1c2Ugc3RkOjpzeW5jOjpNdXRleDsKKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyIFx7CisgICAgb3ZlcnJpZGVzOiBCVHJlZU1hcDwmJ3N0YXRpYyBzdHIsIGJvb2w+LAorfQorCitpbXBsIEZsYWdQcm92aWRlciBcewore3sgZm9yIGZsYWcgaW4gdGVtcGxhdGVfZmxhZ3MgfX0KKyAgICAvLy8gcXVlcnkgZmxhZyB7ZmxhZy5uYW1lfQorICAgIHB1YiBmbiB7ZmxhZy5uYW1lfSgmc2VsZikgLT4gYm9vbCBceworICAgICAgICBzZWxmLm92ZXJyaWRlcy5nZXQoIntmbGFnLm5hbWV9IikuY29waWVkKCkudW53cmFwX29yKAorICAgICAgICB7eyBpZiBmbGFnLnJlYWR3cml0ZSAtfX0KKyAgICAgICAgICBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgImFjb25maWdfZmxhZ3Mue2ZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9IiwKKyAgICAgICAgICAgICJ7ZmxhZy5kZXZpY2VfY29uZmlnX2ZsYWd9IiwKKyAgICAgICAgICAgICJ7ZmxhZy5kZWZhdWx0X3ZhbHVlfSIpID09ICJ0cnVlIgorICAgICAgICB7eyAtZWxzZS0gfX0KKyAgICAgICAgICAge2ZsYWcuZGVmYXVsdF92YWx1ZX0KKyAgICAgICAge3sgLWVuZGlmIH19CisgICAgICAgICkKKyAgICB9CisKKyAgICAvLy8gc2V0IGZsYWcge2ZsYWcubmFtZX0KKyAgICBwdWIgZm4gc2V0X3tmbGFnLm5hbWV9KCZtdXQgc2VsZiwgdmFsOiBib29sKSBceworICAgICAgICBzZWxmLm92ZXJyaWRlcy5pbnNlcnQoIntmbGFnLm5hbWV9IiwgdmFsKTsKKyAgICB9Cit7eyBlbmRmb3IgfX0KKworICAgIC8vLyBjbGVhciBhbGwgZmxhZyBvdmVycmlkZXMKKyAgICBwdWIgZm4gcmVzZXRfZmxhZ3MoJm11dCBzZWxmKSBceworICAgICAgICBzZWxmLm92ZXJyaWRlcy5jbGVhcigpOworICAgIH0KK30KKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdGF0aWMgUFJPVklERVI6IE11dGV4PEZsYWdQcm92aWRlcj4gPSBNdXRleDo6bmV3KAorICAgIEZsYWdQcm92aWRlciBce292ZXJyaWRlczogQlRyZWVNYXA6Om5ldygpfQorKTsKKwore3sgZm9yIGZsYWcgaW4gdGVtcGxhdGVfZmxhZ3MgfX0KKy8vLyBxdWVyeSBmbGFnIHtmbGFnLm5hbWV9CisjW2lubGluZShhbHdheXMpXQorcHViIGZuIHtmbGFnLm5hbWV9KCkgLT4gYm9vbCBceworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS57ZmxhZy5uYW1lfSgpCit9CisKKy8vLyBzZXQgZmxhZyB7ZmxhZy5uYW1lfQorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBzZXRfe2ZsYWcubmFtZX0odmFsOiBib29sKSBceworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5zZXRfe2ZsYWcubmFtZX0odmFsKTsKK30KK3t7IGVuZGZvciB9fQorCisvLy8gY2xlYXIgYWxsIGZsYWcgb3ZlcnJpZGUKK3B1YiBmbiByZXNldF9mbGFncygpIFx7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLnJlc2V0X2ZsYWdzKCkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9BY29uZmlnSG9zdFRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9BY29uZmlnSG9zdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTcxYjdlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL0Fjb25maWdIb3N0VGVzdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GYWtlRmVhdHVyZUZsYWdzSW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmVhdHVyZUZsYWdzOworaW1wb3J0IGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GZWF0dXJlRmxhZ3NJbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GbGFnczsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGZpbmFsIGNsYXNzIEFjb25maWdIb3N0VGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyb3dzRXhjZXB0aW9uSWZGbGFnTm90U2V0KCkgeworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IEZsYWdzLmRpc2FibGVkUm8oKSk7CisgICAgICAgIEZha2VGZWF0dXJlRmxhZ3NJbXBsIGZlYXR1cmVGbGFncyA9IG5ldyBGYWtlRmVhdHVyZUZsYWdzSW1wbCgpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBmZWF0dXJlRmxhZ3MuZGlzYWJsZWRSbygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGbGFnSW5GYWtlRmVhdHVyZUZsYWdzSW1wbCgpIHsKKyAgICAgICAgRmFrZUZlYXR1cmVGbGFnc0ltcGwgZmVhdHVyZUZsYWdzID0gbmV3IEZha2VGZWF0dXJlRmxhZ3NJbXBsKCk7CisgICAgICAgIGZlYXR1cmVGbGFncy5zZXRGbGFnKEZsYWdzLkZMQUdfRU5BQkxFRF9SVywgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoZmVhdHVyZUZsYWdzLmVuYWJsZWRSdygpKTsKKyAgICAgICAgZmVhdHVyZUZsYWdzLnNldEZsYWcoRmxhZ3MuRkxBR19FTkFCTEVEX1JXLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKGZlYXR1cmVGbGFncy5lbmFibGVkUncoKSk7CisKKyAgICAgICAgLy9TZXQgRmxhZ3MKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBGbGFncy5lbmFibGVkUncoKSk7CisgICAgICAgIEZsYWdzLnNldEZlYXR1cmVGbGFncyhmZWF0dXJlRmxhZ3MpOworICAgICAgICBmZWF0dXJlRmxhZ3Muc2V0RmxhZyhGbGFncy5GTEFHX0VOQUJMRURfUlcsIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKEZsYWdzLmVuYWJsZWRSdygpKTsKKyAgICAgICAgRmxhZ3MudW5zZXRGZWF0dXJlRmxhZ3MoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGbGFnV2l0aFJhbmRvbU5hbWUoKSB7CisgICAgICAgIEZha2VGZWF0dXJlRmxhZ3NJbXBsIGZlYXR1cmVGbGFncyA9IG5ldyBGYWtlRmVhdHVyZUZsYWdzSW1wbCgpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgKCkgLT4gZmVhdHVyZUZsYWdzLnNldEZsYWcoIlJhbmRvbWVfbmFtZSIsIHRydWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNldEZsYWdzSW5GYWtlRmVhdHVyZUZsYWdzSW1wbCgpIHsKKyAgICAgICAgRmFrZUZlYXR1cmVGbGFnc0ltcGwgZmVhdHVyZUZsYWdzID0gbmV3IEZha2VGZWF0dXJlRmxhZ3NJbXBsKCk7CisgICAgICAgIGZlYXR1cmVGbGFncy5zZXRGbGFnKEZsYWdzLkZMQUdfRU5BQkxFRF9STywgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoZmVhdHVyZUZsYWdzLmVuYWJsZWRSbygpKTsKKyAgICAgICAgZmVhdHVyZUZsYWdzLnJlc2V0QWxsKCk7CisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+IGZlYXR1cmVGbGFncy5lbmFibGVkUm8oKSk7CisKKyAgICAgICAgLy8gU2V0IHZhbHVlIGFmdGVyIHJlc2V0CisgICAgICAgIGZlYXR1cmVGbGFncy5zZXRGbGFnKEZsYWdzLkZMQUdfRU5BQkxFRF9STywgZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShmZWF0dXJlRmxhZ3MuZW5hYmxlZFJvKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsYWdzU2V0RmVhdHVyZUZsYWdzKCkgeworICAgICAgICBGYWtlRmVhdHVyZUZsYWdzSW1wbCBmZWF0dXJlRmxhZ3MgPSBuZXcgRmFrZUZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgZmVhdHVyZUZsYWdzLnNldEZsYWcoRmxhZ3MuRkxBR19FTkFCTEVEX1JXLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBGbGFncy5lbmFibGVkUncoKSk7CisgICAgICAgIEZsYWdzLnNldEZlYXR1cmVGbGFncyhmZWF0dXJlRmxhZ3MpOworICAgICAgICBhc3NlcnRUcnVlKEZsYWdzLmVuYWJsZWRSdygpKTsKKyAgICAgICAgRmxhZ3MudW5zZXRGZWF0dXJlRmxhZ3MoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnc1Vuc2V0RmVhdHVyZUZsYWdzKCkgeworICAgICAgICBGYWtlRmVhdHVyZUZsYWdzSW1wbCBmZWF0dXJlRmxhZ3MgPSBuZXcgRmFrZUZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgZmVhdHVyZUZsYWdzLnNldEZsYWcoRmxhZ3MuRkxBR19FTkFCTEVEX1JXLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBGbGFncy5lbmFibGVkUncoKSk7CisgICAgICAgIEZsYWdzLnNldEZlYXR1cmVGbGFncyhmZWF0dXJlRmxhZ3MpOworICAgICAgICBhc3NlcnRUcnVlKEZsYWdzLmVuYWJsZWRSdygpKTsKKworICAgICAgICBGbGFncy51bnNldEZlYXR1cmVGbGFncygpOworICAgICAgICBhc3NlcnRUaHJvd3MoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MsICgpIC0+IEZsYWdzLmVuYWJsZWRSdygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlRmxhZ3NJbXBsTm90SW1wbCgpIHsKKyAgICAgICAgRmVhdHVyZUZsYWdzIGZlYXR1cmVGbGFncyA9IG5ldyBGZWF0dXJlRmxhZ3NJbXBsKCk7CisgICAgICAgIGFzc2VydFRocm93cyhVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICgpIC0+IGZlYXR1cmVGbGFncy5lbmFibGVkUncoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL0Fjb25maWdUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvQWNvbmZpZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc2ZWZiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL0Fjb25maWdUZXN0LmphdmEKQEAgLTAsMCArMSw3NSBAQAoraW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmxhZ3MuRkxBR19ESVNBQkxFRF9STzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LkZsYWdzLkZMQUdfRElTQUJMRURfUlc7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk87CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GbGFncy5GTEFHX0VOQUJMRURfUk87CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GbGFncy5GTEFHX0VOQUJMRURfUlc7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GbGFncy5kaXNhYmxlZFJvOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmxhZ3MuZGlzYWJsZWRSdzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LkZsYWdzLmVuYWJsZWRGaXhlZFJvOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmxhZ3MuZW5hYmxlZFJvOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmxhZ3MuZW5hYmxlZFJ3OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZXhwb3J0ZWQuRmxhZ3MuZXhwb3J0ZWRGbGFnOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZXhwb3J0ZWQuRmxhZ3MuRkxBR19FWFBPUlRFRF9GTEFHOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZm9yY2VyZWFkb25seS5GbGFncy5mcm9SdzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LkZha2VGZWF0dXJlRmxhZ3NJbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GZWF0dXJlRmxhZ3M7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBmaW5hbCBjbGFzcyBBY29uZmlnVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRSZWFkT25seUZsYWcoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3JvIiwgRkxBR19ESVNBQkxFRF9STyk7CisgICAgICAgIGFzc2VydEZhbHNlKGRpc2FibGVkUm8oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlZFJlYWRPbmx5RmxhZygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciLCBGTEFHX0RJU0FCTEVEX1JXKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbmFibGVkUm8oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlZEZpeGVkUmVhZE9ubHlGbGFnKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvIiwgRkxBR19FTkFCTEVEX0ZJWEVEX1JPKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbmFibGVkRml4ZWRSbygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZFJlYWRXcml0ZUZsYWcoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm8iLCBGTEFHX0VOQUJMRURfUk8pOworICAgICAgICBhc3NlcnRGYWxzZShkaXNhYmxlZFJ3KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRSZWFkV3JpdGVGbGFnKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwgRkxBR19FTkFCTEVEX1JXKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbmFibGVkUncoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFrZUZlYXR1cmVGbGFnc0ltcGxJbXBsZWQoKSB7CisgICAgICAgIEZha2VGZWF0dXJlRmxhZ3NJbXBsIGZha2VGZWF0dXJlRmxhZ3MgPSBuZXcgRmFrZUZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgZmFrZUZlYXR1cmVGbGFncy5zZXRGbGFnKEZMQUdfRU5BQkxFRF9SVywgZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShmYWtlRmVhdHVyZUZsYWdzLmVuYWJsZWRSdygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBvcnRlZEZsYWcoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmV4cG9ydGVkLmV4cG9ydGVkX2ZsYWciLCBGTEFHX0VYUE9SVEVEX0ZMQUcpOworICAgICAgICBhc3NlcnRGYWxzZShleHBvcnRlZEZsYWcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yY2VSZWFkT25seSgpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZnJvUncoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDAwMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhY29uZmlnLnRlc3QuamF2YSI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfREVWSUNFX0NPTkZJRyIgLz4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhY29uZmlnLnRlc3QuamF2YSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iYWNvbmZpZyBpbnRlZ3JhdGlvbiB0ZXN0cyAoamF2YSkiIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfZXhwb3J0ZWRfbW9kZV90ZXN0LmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX2V4cG9ydGVkX21vZGVfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlYWI0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX2V4cG9ydGVkX21vZGVfdGVzdC5jcHAKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyBuYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OworCitURVNUKEFjb25maWdUZXN0LCBUZXN0RGlzYWJsZWRSd0V4cG9ydGVkRmxhZykgeworICBBU1NFUlRfRkFMU0UoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2V4cG9ydGVkKCkpOworICBBU1NFUlRfRkFMU0UocHJvdmlkZXJfLT5kaXNhYmxlZF9yd19leHBvcnRlZCgpKTsKKyAgQVNTRVJUX0ZBTFNFKGRpc2FibGVkX3J3X2V4cG9ydGVkKCkpOworfQorCitURVNUKEFjb25maWdUZXN0LCBUZXN0RW5hYmxlZEZpeGVkUm9FeHBvcnRlZEZsYWcpIHsKKyAgLy8gVE9ETzogY2hhbmdlIHRvIGFzc2VydFRydWUoZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCgpKSB3aGVuIHRoZSBidWlsZCBzdXBwb3J0cyByZWFkaW5nIHRlc3RzLyoudmFsdWVzCisgIEFTU0VSVF9GQUxTRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpKTsKKyAgQVNTRVJUX0ZBTFNFKHByb3ZpZGVyXy0+ZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpKTsKKyAgQVNTRVJUX0ZBTFNFKGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSk7Cit9CisKK1RFU1QoQWNvbmZpZ1Rlc3QsIFRlc3RFbmFibGVkUm9FeHBvcnRlZEZsYWcpIHsKKyAgLy8gVE9ETzogY2hhbmdlIHRvIGFzc2VydFRydWUoZW5hYmxlZFJvRXhwb3J0ZWQoKSkgd2hlbiB0aGUgYnVpbGQgc3VwcG9ydHMgcmVhZGluZyB0ZXN0cy8qLnZhbHVlcworICBBU1NFUlRfRkFMU0UoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKSk7CisgIEFTU0VSVF9GQUxTRShwcm92aWRlcl8tPmVuYWJsZWRfcm9fZXhwb3J0ZWQoKSk7CisgIEFTU0VSVF9GQUxTRShlbmFibGVkX3JvX2V4cG9ydGVkKCkpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX2V4cG9ydGVkX21vZGVfdGVzdC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX2V4cG9ydGVkX21vZGVfdGVzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQ4MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfZXhwb3J0ZWRfbW9kZV90ZXN0LnJzCkBAIC0wLDAgKzEsNyBAQAorI1tjZmcobm90KGZlYXR1cmUgPSAiY2FyZ28iKSldCisjW3Rlc3RdCitmbiB0ZXN0X2ZsYWdzKCkgeworICAgIGFzc2VydCEoIWFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmRpc2FibGVkX3J3X2V4cG9ydGVkKCkpOworICAgIGFzc2VydCEoIWFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSk7CisgICAgYXNzZXJ0ISghYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZW5hYmxlZF9yb19leHBvcnRlZCgpKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX2ZvcmNlX3JlYWRfb25seV9tb2RlX3Rlc3QuY3BwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfZm9yY2VfcmVhZF9vbmx5X21vZGVfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlYzQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX2ZvcmNlX3JlYWRfb25seV9tb2RlX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDsKKworVEVTVChBY29uZmlnVGVzdCwgVGVzdERpc2FibGVkUmVhZE9ubHlGbGFnKSB7CisgIEFTU0VSVF9GQUxTRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcm8oKSk7CisgIEFTU0VSVF9GQUxTRShwcm92aWRlcl8tPmRpc2FibGVkX3JvKCkpOworICBBU1NFUlRfRkFMU0UoZGlzYWJsZWRfcm8oKSk7Cit9CisKK1RFU1QoQWNvbmZpZ1Rlc3QsIFRlc3RFbmFibGVkUmVhZE9ubHlGbGFnKSB7CisgIEFTU0VSVF9UUlVFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvKCkpOworICBBU1NFUlRfVFJVRShwcm92aWRlcl8tPmVuYWJsZWRfcm8oKSk7CisgIEFTU0VSVF9UUlVFKGVuYWJsZWRfcm8oKSk7Cit9CisKK1RFU1QoQWNvbmZpZ1Rlc3QsIFRlc3REaXNhYmxlZFJlYWRXcml0ZUZsYWcpIHsKKyAgQVNTRVJUX0ZBTFNFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ydygpKTsKKyAgQVNTRVJUX0ZBTFNFKHByb3ZpZGVyXy0+ZGlzYWJsZWRfcncoKSk7CisgIEFTU0VSVF9GQUxTRShkaXNhYmxlZF9ydygpKTsKK30KKworVEVTVChBY29uZmlnVGVzdCwgVGVzdEVuYWJsZWRSZWFkV3JpdGVGbGFnKSB7CisgIEFTU0VSVF9UUlVFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3J3KCkpOworICBBU1NFUlRfVFJVRShwcm92aWRlcl8tPmVuYWJsZWRfcncoKSk7CisgIEFTU0VSVF9UUlVFKGVuYWJsZWRfcncoKSk7Cit9CisKK1RFU1QoQWNvbmZpZ1Rlc3QsIFRlc3RFbmFibGVkRml4ZWRSZWFkT25seUZsYWcpIHsKKyAgQVNTRVJUX1RSVUUoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm8oKSk7CisgIEFTU0VSVF9UUlVFKHByb3ZpZGVyXy0+ZW5hYmxlZF9maXhlZF9ybygpKTsKKyAgQVNTRVJUX1RSVUUoZW5hYmxlZF9maXhlZF9ybygpKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX2ZvcmNlX3JlYWRfb25seV9tb2RlX3Rlc3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19mb3JjZV9yZWFkX29ubHlfbW9kZV90ZXN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDVlMjYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19mb3JjZV9yZWFkX29ubHlfbW9kZV90ZXN0LnJzCkBAIC0wLDAgKzEsMTAgQEAKKyNbY2ZnKG5vdChmZWF0dXJlID0gImNhcmdvIikpXQorI1t0ZXN0XQorZm4gdGVzdF9mbGFncygpIHsKKyAgICBhc3NlcnQhKCFhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpkaXNhYmxlZF9ybygpKTsKKyAgICBhc3NlcnQhKCFhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpkaXNhYmxlZF9ydygpKTsKKyAgICBhc3NlcnQhKCFhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKSk7CisgICAgYXNzZXJ0IShhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjplbmFibGVkX2ZpeGVkX3JvKCkpOworICAgIGFzc2VydCEoYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZW5hYmxlZF9ybygpKTsKKyAgICBhc3NlcnQhKGFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmVuYWJsZWRfcncoKSk7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19wcm9kX21vZGVfdGVzdC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX3Byb2RfbW9kZV90ZXN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZmI4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19wcm9kX21vZGVfdGVzdC5ycwpAQCAtMCwwICsxLDggQEAKKyNbY2ZnKG5vdChmZWF0dXJlID0gImNhcmdvIikpXQorI1t0ZXN0XQorZm4gdGVzdF9mbGFncygpIHsKKyAgICBhc3NlcnQhKCFhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpkaXNhYmxlZF9ybygpKTsKKyAgICBhc3NlcnQhKCFhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpkaXNhYmxlZF9ydygpKTsKKyAgICBhc3NlcnQhKGFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmVuYWJsZWRfcm8oKSk7CisgICAgYXNzZXJ0IShhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjplbmFibGVkX3J3KCkpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfdGVzdC5jcHAgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGVjNDgxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfdGVzdC5jcHAKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3QuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCit1c2luZyBuYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OworCitURVNUKEFjb25maWdUZXN0LCBUZXN0RGlzYWJsZWRSZWFkT25seUZsYWcpIHsKKyAgQVNTRVJUX0ZBTFNFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpKTsKKyAgQVNTRVJUX0ZBTFNFKHByb3ZpZGVyXy0+ZGlzYWJsZWRfcm8oKSk7CisgIEFTU0VSVF9GQUxTRShkaXNhYmxlZF9ybygpKTsKK30KKworVEVTVChBY29uZmlnVGVzdCwgVGVzdEVuYWJsZWRSZWFkT25seUZsYWcpIHsKKyAgQVNTRVJUX1RSVUUoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm8oKSk7CisgIEFTU0VSVF9UUlVFKHByb3ZpZGVyXy0+ZW5hYmxlZF9ybygpKTsKKyAgQVNTRVJUX1RSVUUoZW5hYmxlZF9ybygpKTsKK30KKworVEVTVChBY29uZmlnVGVzdCwgVGVzdERpc2FibGVkUmVhZFdyaXRlRmxhZykgeworICBBU1NFUlRfRkFMU0UoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3KCkpOworICBBU1NFUlRfRkFMU0UocHJvdmlkZXJfLT5kaXNhYmxlZF9ydygpKTsKKyAgQVNTRVJUX0ZBTFNFKGRpc2FibGVkX3J3KCkpOworfQorCitURVNUKEFjb25maWdUZXN0LCBUZXN0RW5hYmxlZFJlYWRXcml0ZUZsYWcpIHsKKyAgQVNTRVJUX1RSVUUoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcncoKSk7CisgIEFTU0VSVF9UUlVFKHByb3ZpZGVyXy0+ZW5hYmxlZF9ydygpKTsKKyAgQVNTRVJUX1RSVUUoZW5hYmxlZF9ydygpKTsKK30KKworVEVTVChBY29uZmlnVGVzdCwgVGVzdEVuYWJsZWRGaXhlZFJlYWRPbmx5RmxhZykgeworICBBU1NFUlRfVFJVRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9ybygpKTsKKyAgQVNTRVJUX1RSVUUocHJvdmlkZXJfLT5lbmFibGVkX2ZpeGVkX3JvKCkpOworICBBU1NFUlRfVFJVRShlbmFibGVkX2ZpeGVkX3JvKCkpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfdGVzdF9tb2RlX3Rlc3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ190ZXN0X21vZGVfdGVzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDhmYmFiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfdGVzdF9tb2RlX3Rlc3QucnMKQEAgLTAsMCArMSwyMyBAQAorI1tjZmcobm90KGZlYXR1cmUgPSAiY2FyZ28iKSldCisjW3Rlc3RdCitmbiB0ZXN0X2ZsYWdzKCkgeworICAgIGFzc2VydCEoIWFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmRpc2FibGVkX3JvKCkpOworICAgIGFzc2VydCEoIWFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmRpc2FibGVkX3J3KCkpOworICAgIGFzc2VydCEoYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZW5hYmxlZF9ybygpKTsKKyAgICBhc3NlcnQhKGFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmVuYWJsZWRfcncoKSk7CisKKyAgICBhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpzZXRfZGlzYWJsZWRfcm8odHJ1ZSk7CisgICAgYXNzZXJ0IShhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpkaXNhYmxlZF9ybygpKTsKKyAgICBhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpzZXRfZGlzYWJsZWRfcncodHJ1ZSk7CisgICAgYXNzZXJ0IShhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpkaXNhYmxlZF9ydygpKTsKKyAgICBhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpzZXRfZW5hYmxlZF9ybyhmYWxzZSk7CisgICAgYXNzZXJ0ISghYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZW5hYmxlZF9ybygpKTsKKyAgICBhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpzZXRfZW5hYmxlZF9ydyhmYWxzZSk7CisgICAgYXNzZXJ0ISghYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZW5hYmxlZF9ydygpKTsKKworICAgIGFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OnJlc2V0X2ZsYWdzKCk7CisgICAgYXNzZXJ0ISghYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZGlzYWJsZWRfcm8oKSk7CisgICAgYXNzZXJ0ISghYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZGlzYWJsZWRfcncoKSk7CisgICAgYXNzZXJ0IShhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjplbmFibGVkX3JvKCkpOworICAgIGFzc2VydCEoYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZW5hYmxlZF9ydygpKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX3Rlc3RfdGVzdF92YXJpYW50LmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX3Rlc3RfdGVzdF92YXJpYW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NmNzEwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfdGVzdF90ZXN0X3ZhcmlhbnQuY3BwCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDsKKworY2xhc3MgQWNvbmZpZ1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgcmVzZXRfZmxhZ3MoKTsKKyAgfQorfTsKKworVEVTVF9GKEFjb25maWdUZXN0LCBUZXN0RGlzYWJsZWRSZWFkT25seUZsYWcpIHsKKyAgQVNTRVJUX0ZBTFNFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpKTsKKyAgQVNTRVJUX0ZBTFNFKHByb3ZpZGVyXy0+ZGlzYWJsZWRfcm8oKSk7CisgIEFTU0VSVF9GQUxTRShkaXNhYmxlZF9ybygpKTsKK30KKworVEVTVF9GKEFjb25maWdUZXN0LCBUZXN0RW5hYmxlZFJlYWRPbmx5RmxhZykgeworICBBU1NFUlRfVFJVRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybygpKTsKKyAgQVNTRVJUX1RSVUUocHJvdmlkZXJfLT5lbmFibGVkX3JvKCkpOworICBBU1NFUlRfVFJVRShlbmFibGVkX3JvKCkpOworfQorCitURVNUX0YoQWNvbmZpZ1Rlc3QsIFRlc3REaXNhYmxlZFJlYWRXcml0ZUZsYWcpIHsKKyAgQVNTRVJUX0ZBTFNFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ydygpKTsKKyAgQVNTRVJUX0ZBTFNFKHByb3ZpZGVyXy0+ZGlzYWJsZWRfcncoKSk7CisgIEFTU0VSVF9GQUxTRShkaXNhYmxlZF9ydygpKTsKK30KKworVEVTVF9GKEFjb25maWdUZXN0LCBUZXN0RW5hYmxlZFJlYWRXcml0ZUZsYWcpIHsKKyAgQVNTRVJUX1RSVUUoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcncoKSk7CisgIEFTU0VSVF9UUlVFKHByb3ZpZGVyXy0+ZW5hYmxlZF9ydygpKTsKKyAgQVNTRVJUX1RSVUUoZW5hYmxlZF9ydygpKTsKK30KKworVEVTVF9GKEFjb25maWdUZXN0LCBUZXN0RW5hYmxlZEZpeGVkUmVhZE9ubHlGbGFnKSB7CisgIEFTU0VSVF9UUlVFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKCkpOworICBBU1NFUlRfVFJVRShwcm92aWRlcl8tPmVuYWJsZWRfZml4ZWRfcm8oKSk7CisgIEFTU0VSVF9UUlVFKGVuYWJsZWRfZml4ZWRfcm8oKSk7Cit9CisKK1RFU1RfRihBY29uZmlnVGVzdCwgT3ZlcnJpZGVGbGFnVmFsdWUpIHsKKyAgQVNTRVJUX0ZBTFNFKGRpc2FibGVkX3JvKCkpOworICBkaXNhYmxlZF9ybyh0cnVlKTsKKyAgQVNTRVJUX1RSVUUoZGlzYWJsZWRfcm8oKSk7Cit9CisKK1RFU1RfRihBY29uZmlnVGVzdCwgUmVzZXRGbGFnVmFsdWUpIHsKKyAgQVNTRVJUX0ZBTFNFKGRpc2FibGVkX3JvKCkpOworICBBU1NFUlRfVFJVRShlbmFibGVkX3JvKCkpOworICBkaXNhYmxlZF9ybyh0cnVlKTsKKyAgZW5hYmxlZF9ybyhmYWxzZSk7CisgIEFTU0VSVF9UUlVFKGRpc2FibGVkX3JvKCkpOworICBBU1NFUlRfRkFMU0UoZW5hYmxlZF9ybygpKTsKKyAgcmVzZXRfZmxhZ3MoKTsKKyAgQVNTRVJUX0ZBTFNFKGRpc2FibGVkX3JvKCkpOworICBBU1NFUlRfVFJVRShlbmFibGVkX3JvKCkpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2ZpcnN0LnZhbHVlcyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9maXJzdC52YWx1ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmYjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9maXJzdC52YWx1ZXMKQEAgLTAsMCArMSw0OCBAQAorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgICBuYW1lOiAiZGlzYWJsZWRfcm8iCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCit9CitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IgorICAgIG5hbWU6ICJlbmFibGVkX3JvIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgICAgbmFtZTogImVuYWJsZWRfcnciCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCit9CitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IgorICAgIG5hbWU6ICJkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgICBuYW1lOiAiZW5hYmxlZF9maXhlZF9ybyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgICBuYW1lOiAiZW5hYmxlZF9yb19leHBvcnRlZCIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgICBuYW1lOiAiZGlzYWJsZWRfcndfZXhwb3J0ZWQiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgICBuYW1lOiAiZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3JlYWRfb25seV90ZXN0LmFjb25maWcgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvcmVhZF9vbmx5X3Rlc3QuYWNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI1MDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3JlYWRfb25seV90ZXN0LmFjb25maWcKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKK2NvbnRhaW5lcjogInN5c3RlbSIKKworZmxhZyB7CisgICAgbmFtZTogImVuYWJsZWRfcm8iCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIEVOQUJMRUQgKyBSRUFEX09OTFkiCisgICAgYnVnOiAiYWJjIgorfQorCitmbGFnIHsKKyAgICBuYW1lOiAiZGlzYWJsZWRfcm8iCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIERJU0FCTEVEICsgUkVBRF9PTkxZIgorICAgIGJ1ZzogIjEyMyIKK30KKworZmxhZyB7CisgICAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm8iCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIGZpeGVkIFJFQURfT05MWSArIEVOQUJMRUQiCisgICAgYnVnOiAiIgorICAgIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZQorfQorCitmbGFnIHsKKyAgICBuYW1lOiAiZGlzYWJsZWRfZml4ZWRfcm8iCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIGZpeGVkIFJFQURfT05MWSArIERJU0FCTEVEIgorICAgIGJ1ZzogIiIKKyAgICBpc19maXhlZF9yZWFkX29ubHk6IHRydWUKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9yZWFkX29ubHlfdGVzdC52YWx1ZXMgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvcmVhZF9vbmx5X3Rlc3QudmFsdWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWM3YWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvcmVhZF9vbmx5X3Rlc3QudmFsdWVzCkBAIC0wLDAgKzEsMTggQEAKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgICAgbmFtZTogImRpc2FibGVkX3JvIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgICBuYW1lOiAiZW5hYmxlZF9ybyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgICBuYW1lOiAiZW5hYmxlZF9maXhlZF9ybyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3NlY29uZC52YWx1ZXMgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc2Vjb25kLnZhbHVlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTA5Y2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3NlY29uZC52YWx1ZXMKQEAgLTAsMCArMSw2IEBACitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IgorICAgIG5hbWU6ICJlbmFibGVkX3JvIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzEuYWNvbmZpZyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfMS5hY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjJjNTcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzEuYWNvbmZpZwpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIKK2NvbnRhaW5lcjogInN5c3RlbSIKKworZmxhZyB7CisgICAgbmFtZTogImVuYWJsZWRfcnciCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIEVOQUJMRUQgKyBSRUFEX1dSSVRFIgorICAgIGJ1ZzogIiIKK30KKworZmxhZyB7CisgICAgbmFtZTogImRpc2FibGVkX3J3IgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBESVNBQkxFRCArIFJFQURfV1JJVEUiCisgICAgYnVnOiAiNDU2IgorICAgIGlzX2V4cG9ydGVkOiB0cnVlCit9CisKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX3JvIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBFTkFCTEVEICsgUkVBRF9PTkxZIgorICAgIGJ1ZzogImFiYyIKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfMS52YWx1ZXMgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzEudmFsdWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NTQ4YWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzEudmFsdWVzCkBAIC0wLDAgKzEsMTggQEAKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIgorICAgIG5hbWU6ICJlbmFibGVkX3J3IgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiCisgICAgbmFtZTogImRpc2FibGVkX3J3IgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIgorICAgIG5hbWU6ICJlbmFibGVkX3JvIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzIuYWNvbmZpZyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfMi5hY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzdmN2EKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzIuYWNvbmZpZwpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIKK2NvbnRhaW5lcjogInN5c3RlbSIKKworZmxhZyB7CisgICAgbmFtZTogImVuYWJsZWRfcm8iCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIEVOQUJMRUQgKyBSRUFEX09OTFkiCisgICAgYnVnOiAiYWJjIgorfQorCitmbGFnIHsKKyAgICBuYW1lOiAiZGlzYWJsZWRfcnciCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIERJU0FCTEVEICsgUkVBRF9PTkxZIgorICAgIGJ1ZzogIjEyMyIKK30KKworZmxhZyB7CisgICAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm8iCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIGZpeGVkIFJFQURfT05MWSArIEVOQUJMRUQiCisgICAgYnVnOiAiIgorICAgIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF8yLnZhbHVlcyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfMi52YWx1ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1MDcyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfMi52YWx1ZXMKQEAgLTAsMCArMSwxOCBAQAorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiCisgICAgbmFtZTogImVuYWJsZWRfcm8iCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIgorICAgIG5hbWU6ICJkaXNhYmxlZF9ydyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCit9CitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIKKyAgICBuYW1lOiAiZW5hYmxlZF9maXhlZF9ybyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF80LmFjb25maWcgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzQuYWNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODAyYTczCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF80LmFjb25maWcKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiCitjb250YWluZXI6ICJzeXN0ZW0iCisKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX3J3IgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBFTkFCTEVEICsgUkVBRF9PTkxZIgorICAgIGJ1ZzogImFiYyIKK30KKworZmxhZyB7CisgICAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm8iCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIGZpeGVkIFJFQURfT05MWSArIEVOQUJMRUQiCisgICAgYnVnOiAiIgorICAgIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF80LnZhbHVlcyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfNC52YWx1ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0Yjc0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfNC52YWx1ZXMKQEAgLTAsMCArMSwxMiBAQAorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiCisgICAgbmFtZTogImVuYWJsZWRfcnciCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCit9CitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIKKyAgICBuYW1lOiAiZW5hYmxlZF9maXhlZF9ybyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3Rlc3QuYWNvbmZpZyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0LmFjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExNTA4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0LmFjb25maWcKQEAgLTAsMCArMSw4OSBAQAorcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKK2NvbnRhaW5lcjogInN5c3RlbSIKKworIyBUaGlzIGZsYWcncyBmaW5hbCB2YWx1ZSBpcyBjYWxjdWxhdGVkIGZyb206CisjIC0gdGVzdC5hY29uZmlnOiBESVNBQkxFRCArIFJFQURfV1JJVEUgKGRlZmF1bHQpCisjIC0gZmlyc3QudmFsdWVzOiBESVNBQkxFRCArIFJFQURfV1JJVEUKKyMgLSBzZWNvbmQudmFsdWVzOiBFTkFCTEVEICsgUkVBRF9PTkxZCitmbGFnIHsKKyAgICBuYW1lOiAiZW5hYmxlZF9ybyIKKyAgICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRU5BQkxFRCArIFJFQURfT05MWSIKKyAgICBidWc6ICJhYmMiCisgICAgbWV0YWRhdGEgeworICAgICAgICBwdXJwb3NlOiBQVVJQT1NFX0JVR0ZJWAorICAgIH0KK30KKworIyBUaGlzIGZsYWcncyBmaW5hbCB2YWx1ZSBpcyBjYWxjdWxhdGVkIGZyb206CisjIC0gdGVzdC5hY29uZmlnOiBESVNBQkxFRCArIFJFQURfV1JJVEUgKGRlZmF1bHQpCisjIC0gZmlyc3QudmFsdWVzOiBFTkFCTEVEICsgUkVBRF9XUklURQorZmxhZyB7CisgICAgbmFtZTogImVuYWJsZWRfcnciCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIEVOQUJMRUQgKyBSRUFEX1dSSVRFIgorICAgICMgZm9yIGJ1ZyBmaWVsZHMsIHRoZSBlbXB0eSBzdHJpbmcgaXMgYSBkaXNjb3VyYWdlZCBidXQgdmFsaWQgdmFsdWUKKyAgICBidWc6ICIiCit9CisKKyMgVGhpcyBmbGFnJ3MgZmluYWwgdmFsdWUgaXMgY2FsY3VsYXRlZCBmcm9tOgorIyAtIHRlc3QuYWNvbmZpZzogRElTQUJMRUQgKyBSRUFEX1dSSVRFIChkZWZhdWx0KQorIyAtIGZpcnN0LnZhbHVlczogRElTQUJMRUQgKyBSRUFEX09OTFkKK2ZsYWcgeworICAgIG5hbWU6ICJkaXNhYmxlZF9ybyIKKyAgICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRElTQUJMRUQgKyBSRUFEX09OTFkiCisgICAgYnVnOiAiMTIzIgorfQorCisjIFRoaXMgZmxhZydzIGZpbmFsIHZhbHVlIGlzIGNhbGN1bGF0ZWQgZnJvbToKKyMgLSB0ZXN0LmFjb25maWc6IERJU0FCTEVEICsgUkVBRF9XUklURSAoZGVmYXVsdCkKK2ZsYWcgeworICAgIG5hbWU6ICJkaXNhYmxlZF9ydyIKKyAgICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRElTQUJMRUQgKyBSRUFEX1dSSVRFIgorICAgIGJ1ZzogIjQ1NiIKK30KKworIyBUaGlzIGZsYWcncyBmaW5hbCB2YWx1ZSBjYWxjdWxhdGVkIGZyb206CisjIC0gdGVzdC5hY29uZmlnOiBESVNBQkxFRCArIFJFQURfT05MWQorIyAtIGZpcnN0LnZhbHVlczogRU5BQkxFRCArIFJFQURfT05MWQorZmxhZyB7CisgICAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm8iCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIGZpeGVkIFJFQURfT05MWSArIEVOQUJMRUQiCisgICAgYnVnOiAiIgorICAgIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZQorfQorCitmbGFnIHsKKyAgICBuYW1lOiAiZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIgorICAgIG5hbWVzcGFjZTogIm90aGVyX25hbWVzcGFjZSIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBESVNBQkxFRCArIFJFQURfV1JJVEUsIGFuZCBpcyBkZWZpbmVkIGluIGFub3RoZXIgbmFtZXNwYWNlIgorICAgIGJ1ZzogIjk5OSIKK30KKworZmxhZyB7CisgICAgbmFtZTogImVuYWJsZWRfcm9fZXhwb3J0ZWQiCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIEVOQUJMRUQgKyBSRUFEX09OTFkgYW5kIGV4cG9ydGVkIgorICAgIGJ1ZzogIjExMSIKKyAgICBpc19leHBvcnRlZDogdHJ1ZQorfQorCitmbGFnIHsKKyAgICBuYW1lOiAiZGlzYWJsZWRfcndfZXhwb3J0ZWQiCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIERJU0FCTEVEICsgUkVBRF9XUklURSBhbmQgZXhwb3J0ZWQiCisgICAgYnVnOiAiMTExIgorICAgIGlzX2V4cG9ydGVkOiB0cnVlCit9CisKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBmaXhlZCBFTkFCTEVEICsgUkVBRF9PTkxZIGFuZCBleHBvcnRlZCIKKyAgICBidWc6ICIxMTEiCisgICAgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlCisgICAgaXNfZXhwb3J0ZWQ6IHRydWUKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvdGVzdF9leHBvcnRlZC5hY29uZmlnIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3Rlc3RfZXhwb3J0ZWQuYWNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGYyM2EzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3Rlc3RfZXhwb3J0ZWQuYWNvbmZpZwpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmV4cG9ydGVkIgorY29udGFpbmVyOiAic3lzdGVtIgorCitmbGFnIHsKKyAgICBuYW1lOiAiZXhwb3J0ZWRfZmxhZyIKKyAgICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIGFuIGV4cG9ydGVkIGZsYWciCisgICAgaXNfZXhwb3J0ZWQ6IHRydWUKKyAgICBidWc6ICI4ODgiCit9CisKK2ZsYWcgeworICAgIG5hbWU6ICJub3RfZXhwb3J0ZWRfZmxhZyIKKyAgICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgbm90IGV4cG9ydGVkIgorICAgIGJ1ZzogIjc3NyIKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X2ZvcmNlX3JlYWRfb25seS5hY29uZmlnIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3Rlc3RfZm9yY2VfcmVhZF9vbmx5LmFjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhYjBlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X2ZvcmNlX3JlYWRfb25seS5hY29uZmlnCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZm9yY2VyZWFkb25seSIKK2NvbnRhaW5lcjogInN5c3RlbSIKKworZmxhZyB7CisgICAgbmFtZTogImZyb19leHBvcnRlZCIKKyAgICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIGFuIGV4cG9ydGVkIGZsYWciCisgICAgaXNfZXhwb3J0ZWQ6IHRydWUKKyAgICBidWc6ICI4ODgiCit9CisKK2ZsYWcgeworICAgIG5hbWU6ICJmcm9fcnciCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIG5vdCBleHBvcnRlZCIKKyAgICBidWc6ICI3NzciCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5NDNkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitydXN0X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19kZXZpY2VfcGF0aHMuZGVmYXVsdHMiLAorICAgIGVkaXRpb246ICIyMDIxIiwKKyAgICBjbGlwcHlfbGludHM6ICJhbmRyb2lkIiwKKyAgICBsaW50czogImFuZHJvaWQiLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3Byb3RvcyIsCisgICAgICAgICJsaWJhbnlob3ciLAorICAgICAgICAibGlicHJvdG9idWYiLAorICAgICAgICAibGlicmVnZXgiLAorICAgIF0sCit9CisKK3J1c3RfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfZGV2aWNlX3BhdGhzIiwKKyAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ19kZXZpY2VfcGF0aHMiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGRlZmF1bHRzOiBbImxpYmFjb25maWdfZGV2aWNlX3BhdGhzLmRlZmF1bHRzIl0sCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX2phdmFfZGV2aWNlX3BhdGhzX3NyYyIsCisgICAgc3JjczogWyJzcmMvRGV2aWNlUGF0aHNUZW1wbGF0ZS5qYXZhIl0sCisgICAgb3V0OiBbIkRldmljZVBhdGhzLmphdmEiXSwKKyAgICB0b29sX2ZpbGVzOiBbInBhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dCJdLAorICAgIGNtZDogInNlZCAtZSAnL1RFTVBMQVRFL3tyJChsb2NhdGlvbiBwYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQpJyAtZSAnZH0nICQoaW4pID4gJChvdXQpIiwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19kZXZpY2VfcGF0aHNfamF2YSIsCisgICAgc3JjczogWyI6bGliYWNvbmZpZ19qYXZhX2RldmljZV9wYXRoc19zcmMiXSwKKyAgICBzZGtfdmVyc2lvbjogImNvcmVfY3VycmVudCIsCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0NhcmdvLnRvbWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlOWIzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvQ2FyZ28udG9tbApAQCAtMCwwICsxLDkgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJhY29uZmlnX2RldmljZV9wYXRocyIKK3ZlcnNpb24gPSAiMC4xLjAiCitlZGl0aW9uID0gIjIwMjEiCisKKyMgU2VlIG1vcmUga2V5cyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMgYXQgaHR0cHM6Ly9kb2MucnVzdC1sYW5nLm9yZy9jYXJnby9yZWZlcmVuY2UvbWFuaWZlc3QuaHRtbAorCitbZGVwZW5kZW5jaWVzXQorYW55aG93ID0gIjEuMC44MiIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0IGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9wYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwY2QyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0CkBAIC0wLDAgKzEsNCBAQAorIi9zeXN0ZW0vZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9zeXN0ZW1fZXh0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvcHJvZHVjdC9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL3ZlbmRvci9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9EZXZpY2VQYXRoc1RlbXBsYXRlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9EZXZpY2VQYXRoc1RlbXBsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzNTVhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVBhdGhzVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgRGV2aWNlUGF0aHMgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIUyA9IHsKKyAgICAgICAgVEVNUExBVEUKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQRVhfRElSID0gIi9hcGV4IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBFWF9BQ09ORklHX1BBVEhfU1VGRklYID0gIi9ldGMvYWNvbmZpZ19mbGFncy5wYiI7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIG9uLWRldmljZSBhY29uZmlnIHByb3RvcyBwYXRocy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHBhcnNlZEZsYWdzUHJvdG9QYXRocygpIHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoUEFUSFMpKTsKKworICAgICAgICBGaWxlIGFwZXhEaXJlY3RvcnkgPSBuZXcgRmlsZShBUEVYX0RJUik7CisgICAgICAgIGlmICghYXBleERpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aHM7CisgICAgICAgIH0KKworICAgICAgICBGaWxlW10gc3ViZGlycyA9IGFwZXhEaXJlY3RvcnkubGlzdEZpbGVzKCk7CisgICAgICAgIGlmIChzdWJkaXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoRmlsZSBwcmVmaXggOiBzdWJkaXJzKSB7CisgICAgICAgICAgICAvLyBGb3IgZWFjaCBtYWlubGluZSBtb2R1bGVzLCB0aGVyZSBhcmUgdHdvIGRpcmVjdG9yaWVzLCBvbmUgPG1vZHVsZXBhY2thZ2U+LywKKyAgICAgICAgICAgIC8vIGFuZCBvbmUgPG1vZHVsZXBhY2thZ2U+QDx2ZXJzaW9uY29kZT4vLiBKdXN0IHJlYWQgdGhlIGZvcm1lci4KKyAgICAgICAgICAgIGlmIChwcmVmaXguZ2V0QWJzb2x1dGVQYXRoKCkuY29udGFpbnMoIkAiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlIHByb3RvUGF0aCA9IG5ldyBGaWxlKHByZWZpeCArIEFQRVhfQUNPTkZJR19QQVRIX1NVRkZJWCk7CisgICAgICAgICAgICBpZiAoIXByb3RvUGF0aC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXRocy5hZGQocHJvdG9QYXRoLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGF0aHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjljZWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9saWIucnMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vISBMaWJyYXJ5IGZvciBmaW5kaW5nIGFsbCBhY29uZmlnIG9uLWRldmljZSBwcm90b2J1ZiBmaWxlIHBhdGhzLgorCit1c2UgYW55aG93OjpSZXN1bHQ7Cit1c2Ugc3RkOjpwYXRoOjpQYXRoQnVmOworCit1c2Ugc3RkOjpmczsKKworZm4gcmVhZF9wYXJ0aXRpb25fcGF0aHMoKSAtPiBWZWM8UGF0aEJ1Zj4geworICAgIGluY2x1ZGVfc3RyISgiLi4vcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0IikKKyAgICAgICAgLnNwbGl0KCcsJykKKyAgICAgICAgLm1hcCh8c3wgcy50cmltKCkudHJpbV9tYXRjaGVzKCciJykpCisgICAgICAgIC5maWx0ZXIofHN8ICFzLmlzX2VtcHR5KCkpCisgICAgICAgIC5tYXAofHN8IFBhdGhCdWY6OmZyb20ocy50b19zdHJpbmcoKSkpCisgICAgICAgIC5jb2xsZWN0KCkKK30KKworLy8vIERldGVybWluZXMgYWxsIHBhdGhzIHRoYXQgY29udGFpbiBhbiBhY29uZmlnIHByb3RvYnVmIGZpbGUsCisvLy8gZmlsdGVyaW5nIG91dCBub25leGlzdGVudCBwYXJ0aXRpb24gcHJvdG9idWYgZmlsZXMuCitwdWIgZm4gcGFyc2VkX2ZsYWdzX3Byb3RvX3BhdGhzKCkgLT4gUmVzdWx0PFZlYzxQYXRoQnVmPj4geworICAgIGxldCBtdXQgcmVzdWx0OiBWZWM8UGF0aEJ1Zj4gPQorICAgICAgICByZWFkX3BhcnRpdGlvbl9wYXRocygpLmludG9faXRlcigpLmZpbHRlcih8c3wgcy5leGlzdHMoKSkuY29sbGVjdCgpOworCisgICAgZm9yIGRpciBpbiBmczo6cmVhZF9kaXIoIi9hcGV4Iik/IHsKKyAgICAgICAgbGV0IGRpciA9IGRpcj87CisKKyAgICAgICAgLy8gT25seSBzY2FuIHRoZSBjdXJyZW50bHkgYWN0aXZlIHZlcnNpb24gb2YgZWFjaCBtYWlubGluZSBtb2R1bGU7IHNraXAgdGhlIEB2ZXJzaW9uIGRpcnMuCisgICAgICAgIGlmIGRpci5maWxlX25hbWUoKS5hc19lbmNvZGVkX2J5dGVzKCkuaXRlcigpLmFueSh8JmJ8IGIgPT0gYidAJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IHBhdGggPSBQYXRoQnVmOjpmcm9tKCIvYXBleCIpOworICAgICAgICBwYXRoLnB1c2goZGlyLnBhdGgoKSk7CisgICAgICAgIHBhdGgucHVzaCgiZXRjIik7CisgICAgICAgIHBhdGgucHVzaCgiYWNvbmZpZ19mbGFncy5wYiIpOworICAgICAgICBpZiBwYXRoLmV4aXN0cygpIHsKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgT2socmVzdWx0KQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcmVhZF9wYXJ0aXRpb25fcGF0aHMoKSB7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9wYXJ0aXRpb25fcGF0aHMoKS5sZW4oKSwgNCk7CisKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfcGFydGl0aW9uX3BhdGhzKCksCisgICAgICAgICAgICB2ZWMhWworICAgICAgICAgICAgICAgIFBhdGhCdWY6OmZyb20oIi9zeXN0ZW0vZXRjL2Fjb25maWdfZmxhZ3MucGIiKSwKKyAgICAgICAgICAgICAgICBQYXRoQnVmOjpmcm9tKCIvc3lzdGVtX2V4dC9ldGMvYWNvbmZpZ19mbGFncy5wYiIpLAorICAgICAgICAgICAgICAgIFBhdGhCdWY6OmZyb20oIi9wcm9kdWN0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiksCisgICAgICAgICAgICAgICAgUGF0aEJ1Zjo6ZnJvbSgiL3ZlbmRvci9ldGMvYWNvbmZpZ19mbGFncy5wYiIpCisgICAgICAgICAgICBdCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNDE5OTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5MCBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCisvLyBwcm90byBsaWJyYXJpZXMgZm9yIGNvbnN1bWVycyBvZiBgYWNvbmZpZyBkdW1wIC0tZm9ybWF0PXByb3RvYnVmYCBvdXRwdXQKKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19qYXZhX3Byb3RvX2xpdGUiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsicHJvdG9zL2Fjb25maWcucHJvdG8iXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJwcm90b2J1Zi1qYXZhLWxpdGUiXSwKKyAgICBwcm90bzogeworICAgICAgICB0eXBlOiAibGl0ZSIsCisgICAgfSwKKyAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIlVwc2lkZURvd25DYWtlIiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiY29tLmFuZHJvaWQuY29uZmlnaW5mcmFzdHJ1Y3R1cmUiLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgXSwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19qYXZhX3Byb3RvX25hbm8iLAorICAgIHNyY3M6IFsicHJvdG9zL2Fjb25maWcucHJvdG8iXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJwcm90b2J1Zi1qYXZhLW5hbm8iXSwKKyAgICBwcm90bzogeworICAgICAgICB0eXBlOiAibmFubyIsCisgICAgfSwKKyAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIlVwc2lkZURvd25DYWtlIiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgXSwKKyAgICBqYXJqYXJfcnVsZXM6ICJqYXJqYXItbmFuby1ydWxlcy50eHQiLAorfQorCitqYXZhX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImxpYmFjb25maWdfamF2YV9wcm90b19mdWxsIiwKKyAgICBzcmNzOiBbInByb3Rvcy9hY29uZmlnLnByb3RvIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGlicHJvdG9idWYtamF2YS1mdWxsIl0sCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImZ1bGwiLAorICAgIH0sCit9CisKK3B5dGhvbl9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3B5dGhvbl9wcm90byIsCisgICAgc3JjczogWyJwcm90b3MvYWNvbmZpZy5wcm90byJdLAorICAgIHByb3RvOiB7CisgICAgICAgIGNhbm9uaWNhbF9wYXRoX2Zyb21fcm9vdDogZmFsc2UsCisgICAgfSwKK30KKworcnVzdF9wcm90b2J1ZiB7CisgICAgbmFtZTogImxpYmFjb25maWdfcnVzdF9wcm90byIsCisgICAgcHJvdG9zOiBbInByb3Rvcy9hY29uZmlnLnByb3RvIl0sCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfcnVzdF9wcm90byIsCisgICAgc291cmNlX3N0ZW06ICJhY29uZmlnX3J1c3RfcHJvdG8iLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorfQorCitydXN0X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWNvbmZpZ19wcm90b3MuZGVmYXVsdHMiLAorICAgIGVkaXRpb246ICIyMDIxIiwKKyAgICBjbGlwcHlfbGludHM6ICJhbmRyb2lkIiwKKyAgICBsaW50czogImFuZHJvaWQiLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3J1c3RfcHJvdG8iLAorICAgICAgICAibGliYW55aG93IiwKKyAgICAgICAgImxpYnByb3RvYnVmIiwKKyAgICBdLAorICAgIHByb2NfbWFjcm9zOiBbCisgICAgICAgICJsaWJwYXN0ZSIsCisgICAgXSwKK30KKworcnVzdF9saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19wcm90b3MiLAorICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3Byb3RvcyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19wcm90b3MuZGVmYXVsdHMiXSwKK30KKworcnVzdF90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJhY29uZmlnX3Byb3Rvcy50ZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCisgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19wcm90b3MuZGVmYXVsdHMiXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRjZjgwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTcgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJhY29uZmlnX3Byb3RvcyIKK3ZlcnNpb24gPSAiMC4xLjAiCitlZGl0aW9uID0gIjIwMjEiCitidWlsZCA9ICJidWlsZC5ycyIKKworW2ZlYXR1cmVzXQorZGVmYXVsdCA9IFsiY2FyZ28iXQorY2FyZ28gPSBbXQorCitbZGVwZW5kZW5jaWVzXQorYW55aG93ID0gIjEuMC42OSIKK3Bhc3RlID0gIjEuMC4xMSIKK3Byb3RvYnVmID0gIjMuMi4wIgorCitbYnVpbGQtZGVwZW5kZW5jaWVzXQorcHJvdG9idWYtY29kZWdlbiA9ICIzLjIuMCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvYnVpbGQucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL2J1aWxkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjViNjAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL2J1aWxkLnJzCkBAIC0wLDAgKzEsMTcgQEAKK3VzZSBwcm90b2J1Zl9jb2RlZ2VuOjpDb2RlZ2VuOworCitmbiBtYWluKCkgeworICAgIGxldCBwcm90b19maWxlcyA9IHZlYyFbInByb3Rvcy9hY29uZmlnLnByb3RvIl07CisKKyAgICAvLyB0ZWxsIGNhcmdvIHRvIG9ubHkgcmUtcnVuIHRoZSBidWlsZCBzY3JpcHQgaWYgYW55IG9mIHRoZSBwcm90byBmaWxlcyBoYXMgY2hhbmdlZAorICAgIGZvciBwYXRoIGluICZwcm90b19maWxlcyB7CisgICAgICAgIHByaW50bG4hKCJjYXJnbzpyZXJ1bi1pZi1jaGFuZ2VkPXt9IiwgcGF0aCk7CisgICAgfQorCisgICAgQ29kZWdlbjo6bmV3KCkKKyAgICAgICAgLnB1cmUoKQorICAgICAgICAuaW5jbHVkZSgicHJvdG9zIikKKyAgICAgICAgLmlucHV0cyhwcm90b19maWxlcykKKyAgICAgICAgLmNhcmdvX291dF9kaXIoImFjb25maWdfcHJvdG8iKQorICAgICAgICAucnVuX2Zyb21fc2NyaXB0KCk7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL2phcmphci1uYW5vLXJ1bGVzLnR4dCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvamFyamFyLW5hbm8tcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGZhNjQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL2phcmphci1uYW5vLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGNvbS5nb29nbGUucHJvdG9idWYuKiogYW5kcm9pZC5pbnRlcm5hbC5mcmFtZXdvcmsucHJvdG9idWYuQDEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL3Byb3Rvcy9hY29uZmlnLnByb3RvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9wcm90b3MvYWNvbmZpZy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFiOGNiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9wcm90b3MvYWNvbmZpZy5wcm90bwpAQCAtMCwwICsxLDE5NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKworLy8gVGhpcyBpcyB0aGUgc2NoZW1hIGRlZmluaXRpb24gZm9yIGFjb25maWcgZmlsZXMuIE1vZGlmaWNhdGlvbnMgbmVlZCB0byBiZQorLy8gZWl0aGVyIGJhY2t3YXJkcyBjb21wYXRpYmxlLCBvciBpbmNsdWRlIHVwZGF0ZXMgdG8gYWxsIGFjb25maWcgZmlsZXMgaW4gdGhlCisvLyBBbmRyb2lkIHRyZWUuCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZzsKKworLy8gVGhpcyBwcm90b2J1ZiBmaWxlIGRlZmluZXMgbWVzc2FnZXMgdXNlZCB0byByZXByZXNlbnQgYW5kIG1hbmFnZSBmbGFncyBpbiB0aGUgImFjb25maWciIHN5c3RlbQorLy8gVGhlIGZvbGxvd2luZyBmb3JtYXQgcmVxdWlyZW1lbnRzIGFwcGx5IGFjcm9zcyB2YXJpb3VzIG1lc3NhZ2UgZmllbGRzOgorLy8KKy8vICMgbmFtZTogbmFtZSBvZiB0aGUgZmxhZworLy8KKy8vICAgIGZvcm1hdDogYSBsb3dlcmNhc2Ugc3RyaW5nIGluIHNuYWtlX2Nhc2UgZm9ybWF0LCBubyBjb25zZWN1dGl2ZSB1bmRlcnNjb3JlcywgYW5kIG5vIGxlYWRpbmcKKy8vICAgICAgZGlnaXQuIEZvciBleGFtcGxlIGFkanVzdF9yYXRlIGlzIGEgdmFsaWQgbmFtZSwgd2hpbGUgQWRqdXN0UmF0ZSwgYWRqdXN0X19yYXRlLCBhbmQKKy8vICAgICAgYWRqdXN0X3JhdGUgYXJlIGludmFsaWQKKy8vCisvLyAjIG5hbWVzcGFjZTogbmFtZXNwYWNlIHRoZSBmbGFnIGJlbG9uZ3MgdG8KKy8vCisvLyAgICBmb3JtYXQ6IGEgbG93ZXJjYXNlIHN0cmluZyBpbiBzbmFrZV9jYXNlIGZvcm1hdCwgbm8gY29uc2VjdXRpdmUgdW5kZXJzY29yZXMsIGFuZCBubyBsZWFkaW5nCisvLyAgICAgIGRpZ2l0LiBGb3IgZXhhbXBsZSBhbmRyb2lkX2Jhcl9zeXN0ZW0KKy8vCisvLyAjIHBhY2thZ2U6IHBhY2thZ2UgdG8gd2hpY2ggdGhlIGZsYWcgYmVsb25ncworLy8KKy8vICAgIGZvcm1hdDogbG93ZXJjYXNlIHN0cmluZ3MgaW4gc25ha2VfY2FzZSBmb3JtYXQsIGRlbGltaXRlZCBieSBkb3RzLCBubyBjb25zZWN1dGl2ZSB1bmRlcnNjb3JlcworLy8gICAgICBhbmQgbm8gbGVhZGluZyBkaWdpdCBpbiBlYWNoIHN0cmluZy4gRm9yIGV4YW1wbGUgY29tLmFuZHJvaWQubXlwYWNrYWdlIGlzIGEgdmFsaWQgbmFtZQorLy8gICAgICB3aGlsZSBjb20uYW5kcm9pZC5teVBhY2thZ2UsIGNvbS5hbmRyb2lkLjFteXBhY2thZ2UgYXJlIGludmFsaWQKKy8vCisvLyAjIGNvbnRhaW5lcjogY29udGFpbmVyIGFzIHNvZnR3YXJlIGJ1aWx0IGluIGl0cyBlbnRpcmV0eSB1c2luZyB0aGUgc2FtZSBidWlsZCBlbnZpcm9ubWVudCBhbmQKKy8vICAgIGFsd2F5cyBpbnN0YWxsZWQgYXMgYSBzaW5nbGUgdW5pdAorLy8KKy8vICAgIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgYXJlIGFsbCBzZXBhcmF0ZSBjb250YWluZXJzOgorLy8gICAgICAgICogdGhlIHN5c3RlbSBwYXJ0aXRpb24KKy8vICAgICAgICAqIHRoZSB2ZW5kb3IgcGFydGl0aW9uCisvLyAgICAgICAgKiBhcGV4ZXM6IGVhY2ggQVBFWCBpcyBpdHMgb3duIGNvbnRhaW5lcgorLy8gICAgICAgICogQVBLczogZm9yIEFQS3Mgd2hpY2ggYXJlIHJlbGVhc2VkIGluZGVwZW5kZW50bHkgdmlhIFBsYXksIGVhY2ggQVBLIGlzIGl0cyBvd24gY29udGFpbmVyLgorLy8gICAgICAgICAgICBJZiBhbiBBUEsgaXMgcmVsZWFzZWQgYXMgcGFydCBvZiBhIE1haW5saW5lIG1vZHVsZSwgb3IgYXMgcGFydCBvZiB0aGUgc3lzdGVtIHBhcnRpdGlvbgorLy8gICAgICAgICAgICB2aWEgT1RBLCB0aGVuIHRoZXkgYXJlIHBhcnQgb2YgdGhlIGFwZXggb3IgdGhlIHN5c3RlbSBwYXJ0aXRpb24gY29udGFpbmVyCisvLworLy8gICAgZm9ybWF0OiBsb3dlcmNhc2Ugc3RyaW5ncyBpbiBzbmFrZV9jYXNlIGZvcm1hdCwgZGVsaW1pdGVkIGJ5IGRvdHMgaWYgbXVsdGlwbGUsIG5vIGNvbnNlY3V0aXZlCisvLyAgICAgIHVuZGVyc2NvcmVzIG9yIGxlYWRpbmcgZGlnaXRzIGluIGVhY2ggc3RyaW5nLiBUaGUgcmVjb21tZW5kZWQgY29udGFpbmVyIHZhbHVlcyBhcmUgdGhlCisvLyAgICAgIHBhcnRpdGlvbiBuYW1lcyBvciB0aGUgbW9kdWxlIG5hbWVzCisKKy8vIG1lc3NhZ2VzIHVzZWQgaW4gYm90aCBhY29uZmlnIGlucHV0IGFuZCBvdXRwdXQKKworZW51bSBmbGFnX3N0YXRlIHsKKyAgRU5BQkxFRCA9IDE7CisgIERJU0FCTEVEID0gMjsKK30KKworZW51bSBmbGFnX3Blcm1pc3Npb24geworICBSRUFEX09OTFkgPSAxOworICBSRUFEX1dSSVRFID0gMjsKK30KKworLy8gYWNvbmZpZyBpbnB1dCBtZXNzYWdlczogZmxhZyBkZWNsYXJhdGlvbnMgYW5kIHZhbHVlcworCittZXNzYWdlIGZsYWdfZGVjbGFyYXRpb24geworICAvLyBOYW1lIG9mIHRoZSBmbGFnIChyZXF1aXJlZCkKKyAgLy8gU2VlICMgbmFtZSBmb3IgZm9ybWF0IGRldGFpbAorICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisKKyAgLy8gTmFtZXNwYWNlIHRoZSBmbGFnIGJlbG9uZ3MgdG8gKHJlcXVpcmVkKQorICAvLyBTZWUgIyBuYW1lc3BhY2UgZm9yIGZvcm1hdCBkZXRhaWwKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWVzcGFjZSA9IDI7CisKKyAgLy8gVGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmxhZydzIHB1cnBvc2UgKHJlcXVpcmVkKQorICBvcHRpb25hbCBzdHJpbmcgZGVzY3JpcHRpb24gPSAzOworCisgIC8vIFNpbmdsZSBidWcgaWQgcmVsYXRlZCB0byB0aGUgZmxhZyAocmVxdWlyZWQpCisgIHJlcGVhdGVkIHN0cmluZyBidWcgPSA0OworCisgIC8vIEluZGljYXRlcyBpZiB0aGUgZmxhZyBpcyBwZXJtYW5lbnRseSByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkCisgIC8vIHZpYSByZWxlYXNlIGNvbmZpZ3MgKG9wdGlvbmFsKQorICAvLyBEZWZhdWx0IHZhbHVlIGZhbHNlCisgIG9wdGlvbmFsIGJvb2wgaXNfZml4ZWRfcmVhZF9vbmx5ID0gNTsKKworICAvLyBJbmRpY2F0ZXMgaWYgdGhlIGZsYWcgaXMgZXhwb3J0ZWQgYW5kIGFjY2Vzc2libGUgYmV5b25kIGl0cyBvcmlnaW5hdGluZyBjb250YWluZXIgKG9wdGlvbmFsKQorICAvLyBEZWZhdWx0IHZhbHVlIGZhbHNlCisgIG9wdGlvbmFsIGJvb2wgaXNfZXhwb3J0ZWQgPSA2OworCisgIC8vIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZsYWcsIGluY2x1ZGluZyBpdHMgcHVycG9zZSBhbmQgZm9ybSBmYWN0b3JzIChvcHRpb25hbCkKKyAgb3B0aW9uYWwgZmxhZ19tZXRhZGF0YSBtZXRhZGF0YSA9IDc7Cit9OworCisvLyBPcHRpb25hbCBtZXRhZGF0YSBhYm91dCB0aGUgZmxhZywgc3VjaCBhcyBpdHMgcHVycG9zZSBhbmQgaXRzIGludGVuZGVkIGZvcm0gZmFjdG9ycy4KKy8vIENhbiBpbmZsdWVuY2UgdGhlIGFwcGxpZWQgcG9saWNpZXMgYW5kIHRlc3Rpbmcgc3RyYXRlZ3kuCittZXNzYWdlIGZsYWdfbWV0YWRhdGEgeworICBlbnVtIGZsYWdfcHVycG9zZSB7CisgICAgUFVSUE9TRV9VTlNQRUNJRklFRCA9IDA7CisgICAgUFVSUE9TRV9GRUFUVVJFID0gMTsKKyAgICBQVVJQT1NFX0JVR0ZJWCA9IDI7CisgIH0KKworICBvcHRpb25hbCBmbGFnX3B1cnBvc2UgcHVycG9zZSA9IDE7CisKKyAgLy8gVE9ETyhiLzMxNTAyNTkzMCk6IEFkZCBmaWVsZCB0byBkZXNpZ25hdGUgaW50ZW5kZWQgdGFyZ2V0IGRldmljZSBmb3JtIGZhY3RvcihzKSwgc3VjaCBhcyBwaG9uZSwgd2F0Y2ggb3Igb3RoZXIuCit9CisKK21lc3NhZ2UgZmxhZ19kZWNsYXJhdGlvbnMgeworICAvLyBQYWNrYWdlIHRvIHdoaWNoIHRoZSBmbGFnIGJlbG9uZ3MgKHJlcXVpcmVkKQorICAvLyBTZWUgIyBwYWNrYWdlIGZvciBmb3JtYXQgZGV0YWlsCisgIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMTsKKworICAvLyBMaXN0IG9mIGZsYWdfZGVjbGFyYXRpb24gb2JqZWN0cyAocmVxdWlyZWQpCisgIHJlcGVhdGVkIGZsYWdfZGVjbGFyYXRpb24gZmxhZyA9IDI7CisKKyAgLy8gQ29udGFpbmVyIHRoZSBmbGFnIGJlbG9uZ3MgdG8gKG9wdGlvbmFsKQorICAvLyBTZWUgIyBjb250YWluZXIgZm9yIGZvcm1hdCBkZXRhaWwKKyAgb3B0aW9uYWwgc3RyaW5nIGNvbnRhaW5lciA9IDM7Cit9OworCittZXNzYWdlIGZsYWdfdmFsdWUgeworICAvLyBQYWNrYWdlIHRvIHdoaWNoIHRoZSBmbGFnIGJlbG9uZ3MgKHJlcXVpcmVkKQorICAvLyBTZWUgIyBwYWNrYWdlIGZvciBmb3JtYXQgZGV0YWlsCisgIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMTsKKworICAvLyBOYW1lIG9mIHRoZSBmbGFnIChyZXF1aXJlZCkKKyAgLy8gU2VlICMgbmFtZSBmb3IgZm9ybWF0IGRldGFpbAorICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDI7CisKKyAgb3B0aW9uYWwgZmxhZ19zdGF0ZSBzdGF0ZSA9IDM7CisgIG9wdGlvbmFsIGZsYWdfcGVybWlzc2lvbiBwZXJtaXNzaW9uID0gNDsKK307CisKK21lc3NhZ2UgZmxhZ192YWx1ZXMgeworICByZXBlYXRlZCBmbGFnX3ZhbHVlIGZsYWdfdmFsdWUgPSAxOworfTsKKworLy8gYWNvbmZpZyBvdXRwdXQgbWVzc2FnZXM6IHBhcnNlZCBhbmQgdmVyaWZpZWQgZmxhZyBkZWNsYXJhdGlvbnMgYW5kIHZhbHVlcworCittZXNzYWdlIHRyYWNlcG9pbnQgeworICAvLyBwYXRoIHRvIGRlY2xhcmF0aW9uIG9yIHZhbHVlIGZpbGUgcmVsYXRpdmUgdG8gJFRPUAorICBvcHRpb25hbCBzdHJpbmcgc291cmNlID0gMTsKKyAgb3B0aW9uYWwgZmxhZ19zdGF0ZSBzdGF0ZSA9IDI7CisgIG9wdGlvbmFsIGZsYWdfcGVybWlzc2lvbiBwZXJtaXNzaW9uID0gMzsKK30KKworbWVzc2FnZSBwYXJzZWRfZmxhZyB7CisgIC8vIFBhY2thZ2UgdG8gd2hpY2ggdGhlIGZsYWcgYmVsb25ncyAocmVxdWlyZWQpCisgIC8vIFNlZSAjIHBhY2thZ2UgZm9yIGZvcm1hdCBkZXRhaWwKKyAgb3B0aW9uYWwgc3RyaW5nIHBhY2thZ2UgPSAxOworCisgIC8vIE5hbWUgb2YgdGhlIGZsYWcgKHJlcXVpcmVkKQorICAvLyBTZWUgIyBuYW1lIGZvciBmb3JtYXQgZGV0YWlsCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMjsKKworICAvLyBOYW1lc3BhY2UgdGhlIGZsYWcgYmVsb25ncyB0byAocmVxdWlyZWQpCisgIC8vIFNlZSAjIG5hbWVzcGFjZSBmb3IgZm9ybWF0IGRldGFpbAorICBvcHRpb25hbCBzdHJpbmcgbmFtZXNwYWNlID0gMzsKKworICAvLyBUZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmbGFnJ3MgcHVycG9zZSAocmVxdWlyZWQpCisgIG9wdGlvbmFsIHN0cmluZyBkZXNjcmlwdGlvbiA9IDQ7CisKKyAgLy8gU2luZ2xlIGJ1ZyBpZCByZWxhdGVkIHRvIHRoZSBmbGFnIChyZXF1aXJlZCkKKyAgcmVwZWF0ZWQgc3RyaW5nIGJ1ZyA9IDU7CisKKyAgb3B0aW9uYWwgZmxhZ19zdGF0ZSBzdGF0ZSA9IDY7CisgIG9wdGlvbmFsIGZsYWdfcGVybWlzc2lvbiBwZXJtaXNzaW9uID0gNzsKKyAgcmVwZWF0ZWQgdHJhY2Vwb2ludCB0cmFjZSA9IDg7CisKKyAgLy8gSW5kaWNhdGVzIGlmIHRoZSBmbGFnIGlzIHBlcm1hbmVudGx5IHJlYWQtb25seSBhbmQgY2Fubm90IGJlIGNoYW5nZWQKKyAgLy8gdmlhIHJlbGVhc2UgY29uZmlncyAob3B0aW9uYWwpCisgIC8vIERlZmF1bHQgdmFsdWUgZmFsc2UKKyAgb3B0aW9uYWwgYm9vbCBpc19maXhlZF9yZWFkX29ubHkgPSA5OworCisgIC8vIEluZGljYXRlcyBpZiB0aGUgZmxhZyBpcyBleHBvcnRlZCBhbmQgYWNjZXNzaWJsZSBiZXlvbmQgaXRzIG9yaWdpbmF0aW5nIGNvbnRhaW5lciAob3B0aW9uYWwpCisgIC8vIERlZmF1bHQgdmFsdWUgZmFsc2UKKyAgb3B0aW9uYWwgYm9vbCBpc19leHBvcnRlZCA9IDEwOworCisgIC8vIENvbnRhaW5lciB0aGUgZmxhZyBiZWxvbmdzIHRvIChvcHRpb25hbCkKKyAgLy8gU2VlICMgY29udGFpbmVyIGZvciBmb3JtYXQgZGV0YWlsCisgIG9wdGlvbmFsIHN0cmluZyBjb250YWluZXIgPSAxMTsKKworICAvLyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmbGFnLCBpbmNsdWRpbmcgaXRzIHB1cnBvc2UgYW5kIGZvcm0gZmFjdG9ycyAob3B0aW9uYWwpCisgIG9wdGlvbmFsIGZsYWdfbWV0YWRhdGEgbWV0YWRhdGEgPSAxMjsKK30KKworbWVzc2FnZSBwYXJzZWRfZmxhZ3MgeworICByZXBlYXRlZCBwYXJzZWRfZmxhZyBwYXJzZWRfZmxhZyA9IDE7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL3NyYy9saWIucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiYmQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3Mvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDEwNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYGFjb25maWdfcHJvdG9zYCBpcyBhIGNyYXRlIGZvciB0aGUgcHJvdG9zIGRlZmluZWQgZm9yIGFjb25maWcKKy8vIFdoZW4gYnVpbGRpbmcgd2l0aCB0aGUgQW5kcm9pZCB0b29sLWNoYWluCisvLworLy8gICAtIGFuIGV4dGVybmFsIGNyYXRlIGBhY29uZmlnX3Byb3Rvc2Agd2lsbCBiZSBnZW5lcmF0ZWQKKy8vICAgLSB0aGUgZmVhdHVyZSAiY2FyZ28iIHdpbGwgYmUgZGlzYWJsZWQKKy8vCisvLyBXaGVuIGJ1aWxkaW5nIHdpdGggY2FyZ28KKy8vCisvLyAgIC0gYSBsb2NhbCBzdWItbW9kdWxlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIE9VVF9ESVIgYW5kIGluY2x1ZGVkIGluIHRoaXMgZmlsZQorLy8gICAtIHRoZSBmZWF0dXJlICJjYXJnbyIgd2lsbCBiZSBlbmFibGVkCisvLworLy8gVGhpcyBtb2R1bGUgaGlkZXMgdGhlc2UgZGlmZmVyZW5jZXMgZnJvbSB0aGUgcmVzdCBvZiBhY29uZmlnLgorCisvLyAtLS0tIFdoZW4gYnVpbGRpbmcgd2l0aCB0aGUgQW5kcm9pZCB0b29sLWNoYWluIC0tLS0KKyNbY2ZnKG5vdChmZWF0dXJlID0gImNhcmdvIikpXQorbW9kIGF1dG9fZ2VuZXJhdGVkIHsKKyAgICBwdWIgdXNlIGFjb25maWdfcnVzdF9wcm90bzo6YWNvbmZpZzo6ZmxhZ19tZXRhZGF0YTo6RmxhZ19wdXJwb3NlIGFzIFByb3RvRmxhZ1B1cnBvc2U7CisgICAgcHViIHVzZSBhY29uZmlnX3J1c3RfcHJvdG86OmFjb25maWc6OkZsYWdfZGVjbGFyYXRpb24gYXMgUHJvdG9GbGFnRGVjbGFyYXRpb247CisgICAgcHViIHVzZSBhY29uZmlnX3J1c3RfcHJvdG86OmFjb25maWc6OkZsYWdfZGVjbGFyYXRpb25zIGFzIFByb3RvRmxhZ0RlY2xhcmF0aW9uczsKKyAgICBwdWIgdXNlIGFjb25maWdfcnVzdF9wcm90bzo6YWNvbmZpZzo6RmxhZ19tZXRhZGF0YSBhcyBQcm90b0ZsYWdNZXRhZGF0YTsKKyAgICBwdWIgdXNlIGFjb25maWdfcnVzdF9wcm90bzo6YWNvbmZpZzo6RmxhZ19wZXJtaXNzaW9uIGFzIFByb3RvRmxhZ1Blcm1pc3Npb247CisgICAgcHViIHVzZSBhY29uZmlnX3J1c3RfcHJvdG86OmFjb25maWc6OkZsYWdfc3RhdGUgYXMgUHJvdG9GbGFnU3RhdGU7CisgICAgcHViIHVzZSBhY29uZmlnX3J1c3RfcHJvdG86OmFjb25maWc6OkZsYWdfdmFsdWUgYXMgUHJvdG9GbGFnVmFsdWU7CisgICAgcHViIHVzZSBhY29uZmlnX3J1c3RfcHJvdG86OmFjb25maWc6OkZsYWdfdmFsdWVzIGFzIFByb3RvRmxhZ1ZhbHVlczsKKyAgICBwdWIgdXNlIGFjb25maWdfcnVzdF9wcm90bzo6YWNvbmZpZzo6UGFyc2VkX2ZsYWcgYXMgUHJvdG9QYXJzZWRGbGFnOworICAgIHB1YiB1c2UgYWNvbmZpZ19ydXN0X3Byb3RvOjphY29uZmlnOjpQYXJzZWRfZmxhZ3MgYXMgUHJvdG9QYXJzZWRGbGFnczsKKyAgICBwdWIgdXNlIGFjb25maWdfcnVzdF9wcm90bzo6YWNvbmZpZzo6VHJhY2Vwb2ludCBhcyBQcm90b1RyYWNlcG9pbnQ7Cit9CisKKy8vIC0tLS0gV2hlbiBidWlsZGluZyB3aXRoIGNhcmdvIC0tLS0KKyNbY2ZnKGZlYXR1cmUgPSAiY2FyZ28iKV0KK21vZCBhdXRvX2dlbmVyYXRlZCB7CisgICAgLy8gaW5jbHVkZSEgc3RhdGVtZW50cyBzaG91bGQgYmUgYXZvaWRlZCAoYmVjYXVzZSB0aGV5IGltcG9ydCBmaWxlIGNvbnRlbnRzIHZlcmJhdGltKSwgYnV0CisgICAgLy8gYmVjYXVzZSB0aGlzIGlzIG9ubHkgdXNlZCBkdXJpbmcgbG9jYWwgZGV2ZWxvcG1lbnQsIGFuZCBvbmx5IGlmIHVzaW5nIGNhcmdvIGluc3RlYWQgb2YgdGhlCisgICAgLy8gQW5kcm9pZCB0b29sLWNoYWluLCB3ZSBhbGxvdyBpdAorICAgIGluY2x1ZGUhKGNvbmNhdCEoZW52ISgiT1VUX0RJUiIpLCAiL2Fjb25maWdfcHJvdG8vbW9kLnJzIikpOworICAgIHB1YiB1c2UgYWNvbmZpZzo6ZmxhZ19tZXRhZGF0YTo6RmxhZ19wdXJwb3NlIGFzIFByb3RvRmxhZ1B1cnBvc2U7CisgICAgcHViIHVzZSBhY29uZmlnOjpGbGFnX2RlY2xhcmF0aW9uIGFzIFByb3RvRmxhZ0RlY2xhcmF0aW9uOworICAgIHB1YiB1c2UgYWNvbmZpZzo6RmxhZ19kZWNsYXJhdGlvbnMgYXMgUHJvdG9GbGFnRGVjbGFyYXRpb25zOworICAgIHB1YiB1c2UgYWNvbmZpZzo6RmxhZ19tZXRhZGF0YSBhcyBQcm90b0ZsYWdNZXRhZGF0YTsKKyAgICBwdWIgdXNlIGFjb25maWc6OkZsYWdfcGVybWlzc2lvbiBhcyBQcm90b0ZsYWdQZXJtaXNzaW9uOworICAgIHB1YiB1c2UgYWNvbmZpZzo6RmxhZ19zdGF0ZSBhcyBQcm90b0ZsYWdTdGF0ZTsKKyAgICBwdWIgdXNlIGFjb25maWc6OkZsYWdfdmFsdWUgYXMgUHJvdG9GbGFnVmFsdWU7CisgICAgcHViIHVzZSBhY29uZmlnOjpGbGFnX3ZhbHVlcyBhcyBQcm90b0ZsYWdWYWx1ZXM7CisgICAgcHViIHVzZSBhY29uZmlnOjpQYXJzZWRfZmxhZyBhcyBQcm90b1BhcnNlZEZsYWc7CisgICAgcHViIHVzZSBhY29uZmlnOjpQYXJzZWRfZmxhZ3MgYXMgUHJvdG9QYXJzZWRGbGFnczsKKyAgICBwdWIgdXNlIGFjb25maWc6OlRyYWNlcG9pbnQgYXMgUHJvdG9UcmFjZXBvaW50OworfQorCisvLyAtLS0tIENvbW1vbiBmb3IgYm90aCB0aGUgQW5kcm9pZCB0b29sLWNoYWluIGFuZCBjYXJnbyAtLS0tCitwdWIgdXNlIGF1dG9fZ2VuZXJhdGVkOjoqOworCit1c2UgYW55aG93OjpSZXN1bHQ7Cit1c2UgcGFzdGU6OnBhc3RlOworCisvLy8gUGF0aCB0byBwcm90byBmaWxlCitjb25zdCBBQ09ORklHX1BST1RPX1BBVEg6ICZzdHIgPSAiLy9idWlsZC9tYWtlL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvcHJvdG9zL2Fjb25maWcucHJvdG8iOworCisvLy8gQ2hlY2sgaWYgdGhlIG5hbWUgaWRlbnRpZmllciBpcyB2YWxpZAorcHViIGZuIGlzX3ZhbGlkX25hbWVfaWRlbnQoczogJnN0cikgLT4gYm9vbCB7CisgICAgLy8gSWRlbnRpZmllcnMgbXVzdCBtYXRjaCBbYS16XVthLXowLTlfXSosIGV4Y2VwdCBjb25zZWN1dGl2ZSB1bmRlcnNjb3JlcyBhcmUgbm90IGFsbG93ZWQKKyAgICBpZiBzLmNvbnRhaW5zKCJfXyIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBsZXQgbXV0IGNoYXJzID0gcy5jaGFycygpOworICAgIGxldCBTb21lKGZpcnN0KSA9IGNoYXJzLm5leHQoKSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisgICAgaWYgIWZpcnN0LmlzX2FzY2lpX2xvd2VyY2FzZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjaGFycy5hbGwofGNofCBjaC5pc19hc2NpaV9sb3dlcmNhc2UoKSB8fCBjaC5pc19hc2NpaV9kaWdpdCgpIHx8IGNoID09ICdfJykKK30KKworLy8vIENoZWNrIGlmIHRoZSBwYWNrYWdlIGlkZW50aWZpZXIgaXMgdmFsaWQKK3B1YiBmbiBpc192YWxpZF9wYWNrYWdlX2lkZW50KHM6ICZzdHIpIC0+IGJvb2wgeworICAgIGlmICFzLmNvbnRhaW5zKCcuJykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHMuc3BsaXQoJy4nKS5hbGwoaXNfdmFsaWRfbmFtZV9pZGVudCkKK30KKworLy8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaWRlbnRpZmllciBpcyB2YWxpZAorcHViIGZuIGlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudChzOiAmc3RyKSAtPiBib29sIHsKKyAgICBzLnNwbGl0KCcuJykuYWxsKGlzX3ZhbGlkX25hbWVfaWRlbnQpCit9CisKK2ZuIHRyeV9mcm9tX3RleHRfcHJvdG88VD4oczogJnN0cikgLT4gUmVzdWx0PFQ+Cit3aGVyZQorICAgIFQ6IHByb3RvYnVmOjpNZXNzYWdlRnVsbCwKK3sKKyAgICBwcm90b2J1Zjo6dGV4dF9mb3JtYXQ6OnBhcnNlX2Zyb21fc3RyKHMpLm1hcF9lcnIofGV8IGUuaW50bygpKQorfQorCittYWNyb19ydWxlcyEgZW5zdXJlX3JlcXVpcmVkX2ZpZWxkcyB7CisgICAgKCR0eXBlOmV4cHIsICRzdHJ1Y3Q6ZXhwciwgJCgkZmllbGQ6ZXhwciksKykgPT4geworICAgICAgICAkKAorICAgICAgICBwYXN0ZSEgeworICAgICAgICAgICAgZW5zdXJlISgkc3RydWN0Lls8aGFzXyAkZmllbGQ+XSgpLCAiYmFkIHt9OiBtaXNzaW5nIHt9IiwgJHR5cGUsICRmaWVsZCk7CisgICAgICAgIH0KKyAgICAgICAgKSsKKyAgICB9OworfQorCisvLy8gVXRpbGl0eSBtb2R1bGUgZm9yIGZsYWdfZGVjbGFyYXRpb24gcHJvdG8KK3B1YiBtb2QgZmxhZ19kZWNsYXJhdGlvbiB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhbnlob3c6OmVuc3VyZTsKKworICAgIC8vLyBFbnN1cmUgdGhlIHByb3RvIGluc3RhbmNlIGlzIHZhbGlkIGJ5IGNoZWNraW5nIGl0cyBmaWVsZHMKKyAgICBwdWIgZm4gdmVyaWZ5X2ZpZWxkcyhwZGY6ICZQcm90b0ZsYWdEZWNsYXJhdGlvbikgLT4gUmVzdWx0PCgpPiB7CisgICAgICAgIGVuc3VyZV9yZXF1aXJlZF9maWVsZHMhKCJmbGFnIGRlY2xhcmF0aW9uIiwgcGRmLCAibmFtZSIsICJuYW1lc3BhY2UiLCAiZGVzY3JpcHRpb24iKTsKKworICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgaXNfdmFsaWRfbmFtZV9pZGVudChwZGYubmFtZSgpKSwKKyAgICAgICAgICAgICJiYWQgZmxhZyBkZWNsYXJhdGlvbjogYmFkIG5hbWUge30gZXhwZWN0ZWQgc25ha2VfY2FzZSBzdHJpbmc7IFwKKyAgICAgICAgc2VlIHtBQ09ORklHX1BST1RPX1BBVEh9IGZvciBkZXRhaWxzIiwKKyAgICAgICAgICAgIHBkZi5uYW1lKCkKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGlzX3ZhbGlkX25hbWVfaWRlbnQocGRmLm5hbWVzcGFjZSgpKSwKKyAgICAgICAgICAgICJiYWQgZmxhZyBkZWNsYXJhdGlvbjogYmFkIG5hbWVzcGFjZSB7fSBleHBlY3RlZCBzbmFrZV9jYXNlIHN0cmluZzsgXAorICAgICAgICBzZWUge0FDT05GSUdfUFJPVE9fUEFUSH0gZm9yIGRldGFpbHMiLAorICAgICAgICAgICAgcGRmLm5hbWVzcGFjZSgpCisgICAgICAgICk7CisgICAgICAgIGVuc3VyZSEoIXBkZi5kZXNjcmlwdGlvbigpLmlzX2VtcHR5KCksICJiYWQgZmxhZyBkZWNsYXJhdGlvbjogZW1wdHkgZGVzY3JpcHRpb24iKTsKKyAgICAgICAgZW5zdXJlIShwZGYuYnVnLmxlbigpID09IDEsICJiYWQgZmxhZyBkZWNsYXJhdGlvbjogZXhhY3RseSBvbmUgYnVnIHJlcXVpcmVkIik7CisKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCisvLy8gVXRpbGl0eSBtb2R1bGUgZm9yIGZsYWdfZGVjbGFyYXRpb25zIHByb3RvCitwdWIgbW9kIGZsYWdfZGVjbGFyYXRpb25zIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFueWhvdzo6ZW5zdXJlOworCisgICAgLy8vIENvbnN0cnVjdCBhIHByb3RvIGluc3RhbmNlIGZyb20gYSB0ZXh0cHJvdG8gc3RyaW5nIGNvbnRlbnQKKyAgICBwdWIgZm4gdHJ5X2Zyb21fdGV4dF9wcm90byhzOiAmc3RyKSAtPiBSZXN1bHQ8UHJvdG9GbGFnRGVjbGFyYXRpb25zPiB7CisgICAgICAgIGxldCBwZGY6IFByb3RvRmxhZ0RlY2xhcmF0aW9ucyA9IHN1cGVyOjp0cnlfZnJvbV90ZXh0X3Byb3RvKHMpPzsKKyAgICAgICAgdmVyaWZ5X2ZpZWxkcygmcGRmKT87CisgICAgICAgIE9rKHBkZikKKyAgICB9CisKKyAgICAvLy8gRW5zdXJlIHRoZSBwcm90byBpbnN0YW5jZSBpcyB2YWxpZCBieSBjaGVja2luZyBpdHMgZmllbGRzCisgICAgcHViIGZuIHZlcmlmeV9maWVsZHMocGRmOiAmUHJvdG9GbGFnRGVjbGFyYXRpb25zKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAgZW5zdXJlX3JlcXVpcmVkX2ZpZWxkcyEoImZsYWcgZGVjbGFyYXRpb25zIiwgcGRmLCAicGFja2FnZSIpOworICAgICAgICAvLyBUT0RPKGIvMzEyNzY5NzEwKTogTWFrZSB0aGUgY29udGFpbmVyIGZpZWxkIHJlcXVpcmVkLgorICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgaXNfdmFsaWRfcGFja2FnZV9pZGVudChwZGYucGFja2FnZSgpKSwKKyAgICAgICAgICAgICJiYWQgZmxhZyBkZWNsYXJhdGlvbnM6IGJhZCBwYWNrYWdlIHt9IGV4cGVjdGVkIHNuYWtlX2Nhc2Ugc3RyaW5ncyBkZWxpbWl0ZWQgYnkgZG90czsgXAorICAgICAgICBzZWUge0FDT05GSUdfUFJPVE9fUEFUSH0gZm9yIGRldGFpbHMiLAorICAgICAgICAgICAgcGRmLnBhY2thZ2UoKQorICAgICAgICApOworICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgIXBkZi5oYXNfY29udGFpbmVyKCkgfHwgaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KHBkZi5jb250YWluZXIoKSksCisgICAgICAgICAgICAiYmFkIGZsYWcgZGVjbGFyYXRpb25zOiBiYWQgY29udGFpbmVyIgorICAgICAgICApOworICAgICAgICBmb3IgZmxhZ19kZWNsYXJhdGlvbiBpbiBwZGYuZmxhZy5pdGVyKCkgeworICAgICAgICAgICAgc3VwZXI6OmZsYWdfZGVjbGFyYXRpb246OnZlcmlmeV9maWVsZHMoZmxhZ19kZWNsYXJhdGlvbik/OworICAgICAgICB9CisKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCisvLy8gVXRpbGl0eSBtb2R1bGUgZm9yIGZsYWdfdmFsdWUgcHJvdG8KK3B1YiBtb2QgZmxhZ192YWx1ZSB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhbnlob3c6OmVuc3VyZTsKKworICAgIC8vLyBFbnN1cmUgdGhlIHByb3RvIGluc3RhbmNlIGlzIHZhbGlkIGJ5IGNoZWNraW5nIGl0cyBmaWVsZHMKKyAgICBwdWIgZm4gdmVyaWZ5X2ZpZWxkcyhmdjogJlByb3RvRmxhZ1ZhbHVlKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAgZW5zdXJlX3JlcXVpcmVkX2ZpZWxkcyEoImZsYWcgdmFsdWUiLCBmdiwgInBhY2thZ2UiLCAibmFtZSIsICJzdGF0ZSIsICJwZXJtaXNzaW9uIik7CisKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoZnYucGFja2FnZSgpKSwKKyAgICAgICAgICAgICJiYWQgZmxhZyB2YWx1ZTogYmFkIHBhY2thZ2Uge30gZXhwZWN0ZWQgc25ha2VfY2FzZSBzdHJpbmdzIGRlbGltaXRlZCBieSBkb3RzOyBcCisgICAgICAgIHNlZSB7QUNPTkZJR19QUk9UT19QQVRIfSBmb3IgZGV0YWlscyIsCisgICAgICAgICAgICBmdi5wYWNrYWdlKCkKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGlzX3ZhbGlkX25hbWVfaWRlbnQoZnYubmFtZSgpKSwKKyAgICAgICAgICAgICJiYWQgZmxhZyB2YWx1ZTogYmFkIG5hbWUge30gZXhwZWN0ZWQgc25ha2VfY2FzZSBzdHJpbmc7IFwKKyAgICAgICAgc2VlIHtBQ09ORklHX1BST1RPX1BBVEh9IGZvciBkZXRhaWxzIiwKKyAgICAgICAgICAgIGZ2Lm5hbWUoKQorICAgICAgICApOworCisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworLy8vIFV0aWxpdHkgbW9kdWxlIGZvciBmbGFnX3ZhbHVlcyBwcm90bworcHViIG1vZCBmbGFnX3ZhbHVlcyB7CisgICAgdXNlIHN1cGVyOjoqOworCisgICAgLy8vIENvbnN0cnVjdCBhIHByb3RvIGluc3RhbmNlIGZyb20gYSB0ZXh0cHJvdG8gc3RyaW5nIGNvbnRlbnQKKyAgICBwdWIgZm4gdHJ5X2Zyb21fdGV4dF9wcm90byhzOiAmc3RyKSAtPiBSZXN1bHQ8UHJvdG9GbGFnVmFsdWVzPiB7CisgICAgICAgIGxldCBwZnY6IFByb3RvRmxhZ1ZhbHVlcyA9IHN1cGVyOjp0cnlfZnJvbV90ZXh0X3Byb3RvKHMpPzsKKyAgICAgICAgdmVyaWZ5X2ZpZWxkcygmcGZ2KT87CisgICAgICAgIE9rKHBmdikKKyAgICB9CisKKyAgICAvLy8gRW5zdXJlIHRoZSBwcm90byBpbnN0YW5jZSBpcyB2YWxpZCBieSBjaGVja2luZyBpdHMgZmllbGRzCisgICAgcHViIGZuIHZlcmlmeV9maWVsZHMocGZ2OiAmUHJvdG9GbGFnVmFsdWVzKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAgZm9yIGZsYWdfdmFsdWUgaW4gcGZ2LmZsYWdfdmFsdWUuaXRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyOjpmbGFnX3ZhbHVlOjp2ZXJpZnlfZmllbGRzKGZsYWdfdmFsdWUpPzsKKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKKy8vLyBVdGlsaXR5IG1vZHVsZSBmb3IgZmxhZ19wZXJtaXNzaW9uIHByb3RvIGVudW0KK3B1YiBtb2QgZmxhZ19wZXJtaXNzaW9uIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFueWhvdzo6YmFpbDsKKworICAgIC8vLyBDb25zdHJ1Y3QgYSBmbGFnIHBlcm1pc3Npb24gcHJvdG8gZW51bSBmcm9tIHN0cmluZworICAgIHB1YiBmbiBwYXJzZV9mcm9tX3N0cihwZXJtaXNzaW9uOiAmc3RyKSAtPiBSZXN1bHQ8UHJvdG9GbGFnUGVybWlzc2lvbj4geworICAgICAgICBtYXRjaCBwZXJtaXNzaW9uLnRvX2FzY2lpX2xvd2VyY2FzZSgpLmFzX3N0cigpIHsKKyAgICAgICAgICAgICJyZWFkX3dyaXRlIiA9PiBPayhQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFKSwKKyAgICAgICAgICAgICJyZWFkX29ubHkiID0+IE9rKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSksCisgICAgICAgICAgICBfID0+IGJhaWwhKCJQZXJtaXNzaW9uIG5lZWRzIHRvIGJlIHJlYWRfb25seSBvciByZWFkX3dyaXRlLiIpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFNlcmlhbGl6ZSBmbGFnIHBlcm1pc3Npb24gcHJvdG8gZW51bSB0byBzdHJpbmcKKyAgICBwdWIgZm4gdG9fc3RyaW5nKHBlcm1pc3Npb246ICZQcm90b0ZsYWdQZXJtaXNzaW9uKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggcGVybWlzc2lvbiB7CisgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFID0+ICJyZWFkX3dyaXRlIiwKKyAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSA9PiAicmVhZF9vbmx5IiwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFV0aWxpdHkgbW9kdWxlIGZvciB0cmFjZXBvaW50IHByb3RvCitwdWIgbW9kIHRyYWNlcG9pbnQgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgYW55aG93OjplbnN1cmU7CisKKyAgICAvLy8gRW5zdXJlIHRoZSBwcm90byBpbnN0YW5jZSBpcyB2YWxpZCBieSBjaGVja2luZyBpdHMgZmllbGRzCisgICAgcHViIGZuIHZlcmlmeV9maWVsZHModHA6ICZQcm90b1RyYWNlcG9pbnQpIC0+IFJlc3VsdDwoKT4geworICAgICAgICBlbnN1cmVfcmVxdWlyZWRfZmllbGRzISgidHJhY2Vwb2ludCIsIHRwLCAic291cmNlIiwgInN0YXRlIiwgInBlcm1pc3Npb24iKTsKKworICAgICAgICBlbnN1cmUhKCF0cC5zb3VyY2UoKS5pc19lbXB0eSgpLCAiYmFkIHRyYWNlcG9pbnQ6IGVtcHR5IHNvdXJjZSIpOworCisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworLy8vIFV0aWxpdHkgbW9kdWxlIGZvciBwYXJzZWRfZmxhZyBwcm90bworcHViIG1vZCBwYXJzZWRfZmxhZyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhbnlob3c6OmVuc3VyZTsKKworICAgIC8vLyBFbnN1cmUgdGhlIHByb3RvIGluc3RhbmNlIGlzIHZhbGlkIGJ5IGNoZWNraW5nIGl0cyBmaWVsZHMKKyAgICBwdWIgZm4gdmVyaWZ5X2ZpZWxkcyhwZjogJlByb3RvUGFyc2VkRmxhZykgLT4gUmVzdWx0PCgpPiB7CisgICAgICAgIGVuc3VyZV9yZXF1aXJlZF9maWVsZHMhKAorICAgICAgICAgICAgInBhcnNlZCBmbGFnIiwKKyAgICAgICAgICAgIHBmLAorICAgICAgICAgICAgInBhY2thZ2UiLAorICAgICAgICAgICAgIm5hbWUiLAorICAgICAgICAgICAgIm5hbWVzcGFjZSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgInN0YXRlIiwKKyAgICAgICAgICAgICJwZXJtaXNzaW9uIgorICAgICAgICApOworCisgICAgICAgIGVuc3VyZSEoCisgICAgICAgICAgICBpc192YWxpZF9wYWNrYWdlX2lkZW50KHBmLnBhY2thZ2UoKSksCisgICAgICAgICAgICAiYmFkIHBhcnNlZCBmbGFnOiBiYWQgcGFja2FnZSB7fSBleHBlY3RlZCBzbmFrZV9jYXNlIHN0cmluZ3MgZGVsaW1pdGVkIGJ5IGRvdHM7IFwKKyAgICAgICAgc2VlIHtBQ09ORklHX1BST1RPX1BBVEh9IGZvciBkZXRhaWxzIiwKKyAgICAgICAgICAgIHBmLnBhY2thZ2UoKQorICAgICAgICApOworICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgIXBmLmhhc19jb250YWluZXIoKSB8fCBpc192YWxpZF9jb250YWluZXJfaWRlbnQocGYuY29udGFpbmVyKCkpLAorICAgICAgICAgICAgImJhZCBwYXJzZWQgZmxhZzogYmFkIGNvbnRhaW5lciIKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGlzX3ZhbGlkX25hbWVfaWRlbnQocGYubmFtZSgpKSwKKyAgICAgICAgICAgICJiYWQgcGFyc2VkIGZsYWc6IGJhZCBuYW1lIHt9IGV4cGVjdGVkIHNuYWtlX2Nhc2Ugc3RyaW5nOyBcCisgICAgICAgIHNlZSB7QUNPTkZJR19QUk9UT19QQVRIfSBmb3IgZGV0YWlscyIsCisgICAgICAgICAgICBwZi5uYW1lKCkKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGlzX3ZhbGlkX25hbWVfaWRlbnQocGYubmFtZXNwYWNlKCkpLAorICAgICAgICAgICAgImJhZCBwYXJzZWQgZmxhZzogYmFkIG5hbWVzcGFjZSB7fSBleHBlY3RlZCBzbmFrZV9jYXNlIHN0cmluZzsgXAorICAgICAgICBzZWUge0FDT05GSUdfUFJPVE9fUEFUSH0gZm9yIGRldGFpbHMiLAorICAgICAgICAgICAgcGYubmFtZXNwYWNlKCkKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlISghcGYuZGVzY3JpcHRpb24oKS5pc19lbXB0eSgpLCAiYmFkIHBhcnNlZCBmbGFnOiBlbXB0eSBkZXNjcmlwdGlvbiIpOworICAgICAgICBlbnN1cmUhKCFwZi50cmFjZS5pc19lbXB0eSgpLCAiYmFkIHBhcnNlZCBmbGFnOiBlbXB0eSB0cmFjZSIpOworICAgICAgICBmb3IgdHAgaW4gcGYudHJhY2UuaXRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyOjp0cmFjZXBvaW50Ojp2ZXJpZnlfZmllbGRzKHRwKT87CisgICAgICAgIH0KKyAgICAgICAgZW5zdXJlIShwZi5idWcubGVuKCkgPT0gMSwgImJhZCBmbGFnIGRlY2xhcmF0aW9uOiBleGFjdGx5IG9uZSBidWcgcmVxdWlyZWQiKTsKKyAgICAgICAgaWYgcGYuaXNfZml4ZWRfcmVhZF9vbmx5KCkgeworICAgICAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgICAgICBwZi5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLAorICAgICAgICAgICAgICAgICJiYWQgcGFyc2VkIGZsYWc6IGZsYWcgaXMgaXNfZml4ZWRfcmVhZF9vbmx5IGJ1dCBwZXJtaXNzaW9uIGlzIG5vdCBSRUFEX09OTFkiCisgICAgICAgICAgICApOworICAgICAgICAgICAgZm9yIHRwIGluIHBmLnRyYWNlLml0ZXIoKSB7CisgICAgICAgICAgICAgICAgZW5zdXJlISh0cC5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLAorICAgICAgICAgICAgICAgICJiYWQgcGFyc2VkIGZsYWc6IGZsYWcgaXMgaXNfZml4ZWRfcmVhZF9vbmx5IGJ1dCBhIHRyYWNlcG9pbnQncyBwZXJtaXNzaW9uIGlzIG5vdCBSRUFEX09OTFkiCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGZpbGUgcGF0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBmbGFnIGRlY2xhcmF0aW9uCisgICAgcHViIGZuIHBhdGhfdG9fZGVjbGFyYXRpb24ocGY6ICZQcm90b1BhcnNlZEZsYWcpIC0+ICZzdHIgeworICAgICAgICBkZWJ1Z19hc3NlcnQhKCFwZi50cmFjZS5pc19lbXB0eSgpKTsKKyAgICAgICAgcGYudHJhY2VbMF0uc291cmNlKCkKKyAgICB9Cit9CisKKy8vLyBVdGlsaXR5IG1vZHVsZSBmb3IgcGFyc2VkX2ZsYWdzIHByb3RvCitwdWIgbW9kIHBhcnNlZF9mbGFncyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhbnlob3c6OmJhaWw7CisgICAgdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKKworICAgIC8vLyBDb25zdHJ1Y3QgYSBwcm90byBpbnN0YW5jZSBmcm9tIGEgYmluYXJ5IHByb3RvIGJ5dGVzCisgICAgcHViIGZuIHRyeV9mcm9tX2JpbmFyeV9wcm90byhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxQcm90b1BhcnNlZEZsYWdzPiB7CisgICAgICAgIGxldCBtZXNzYWdlOiBQcm90b1BhcnNlZEZsYWdzID0gcHJvdG9idWY6Ok1lc3NhZ2U6OnBhcnNlX2Zyb21fYnl0ZXMoYnl0ZXMpPzsKKyAgICAgICAgdmVyaWZ5X2ZpZWxkcygmbWVzc2FnZSk/OworICAgICAgICBPayhtZXNzYWdlKQorICAgIH0KKworICAgIC8vLyBFbnN1cmUgdGhlIHByb3RvIGluc3RhbmNlIGlzIHZhbGlkIGJ5IGNoZWNraW5nIGl0cyBmaWVsZHMKKyAgICBwdWIgZm4gdmVyaWZ5X2ZpZWxkcyhwZjogJlByb3RvUGFyc2VkRmxhZ3MpIC0+IFJlc3VsdDwoKT4geworICAgICAgICB1c2UgY3JhdGU6OnBhcnNlZF9mbGFnOjpwYXRoX3RvX2RlY2xhcmF0aW9uOworCisgICAgICAgIGxldCBtdXQgcHJldmlvdXM6IE9wdGlvbjwmUHJvdG9QYXJzZWRGbGFnPiA9IE5vbmU7CisgICAgICAgIGZvciBwYXJzZWRfZmxhZyBpbiBwZi5wYXJzZWRfZmxhZy5pdGVyKCkgeworICAgICAgICAgICAgaWYgbGV0IFNvbWUocHJldikgPSBwcmV2aW91cyB7CisgICAgICAgICAgICAgICAgbGV0IGEgPSBjcmVhdGVfc29ydGluZ19rZXkocHJldik7CisgICAgICAgICAgICAgICAgbGV0IGIgPSBjcmVhdGVfc29ydGluZ19rZXkocGFyc2VkX2ZsYWcpOworICAgICAgICAgICAgICAgIG1hdGNoIGEuY21wKCZiKSB7CisgICAgICAgICAgICAgICAgICAgIE9yZGVyaW5nOjpMZXNzID0+IHt9CisgICAgICAgICAgICAgICAgICAgIE9yZGVyaW5nOjpFcXVhbCA9PiBiYWlsISgKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgcGFyc2VkIGZsYWdzOiBkdXBsaWNhdGUgZmxhZyB7fSAoZGVmaW5lZCBpbiB7fSBhbmQge30pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX3RvX2RlY2xhcmF0aW9uKHByZXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF90b19kZWNsYXJhdGlvbihwYXJzZWRfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgT3JkZXJpbmc6OkdyZWF0ZXIgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgYmFpbCEoImJhZCBwYXJzZWQgZmxhZ3M6IG5vdCBzb3J0ZWQ6IHt9IGNvbWVzIGJlZm9yZSB7fSIsIGEsIGIpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlcjo6cGFyc2VkX2ZsYWc6OnZlcmlmeV9maWVsZHMocGFyc2VkX2ZsYWcpPzsKKyAgICAgICAgICAgIHByZXZpb3VzID0gU29tZShwYXJzZWRfZmxhZyk7CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8vIE1lcmdlIG11bHRpcGUgcGFyc2VkX2ZsYWdzIHByb3RvCisgICAgcHViIGZuIG1lcmdlKHBhcnNlZF9mbGFnczogVmVjPFByb3RvUGFyc2VkRmxhZ3M+LCBkZWR1cDogYm9vbCkgLT4gUmVzdWx0PFByb3RvUGFyc2VkRmxhZ3M+IHsKKyAgICAgICAgbGV0IG11dCBtZXJnZWQgPSBQcm90b1BhcnNlZEZsYWdzOjpuZXcoKTsKKyAgICAgICAgZm9yIG11dCBwZnMgaW4gcGFyc2VkX2ZsYWdzLmludG9faXRlcigpIHsKKyAgICAgICAgICAgIG1lcmdlZC5wYXJzZWRfZmxhZy5hcHBlbmQoJm11dCBwZnMucGFyc2VkX2ZsYWcpOworICAgICAgICB9CisgICAgICAgIG1lcmdlZC5wYXJzZWRfZmxhZy5zb3J0X2J5X2NhY2hlZF9rZXkoY3JlYXRlX3NvcnRpbmdfa2V5KTsKKyAgICAgICAgaWYgZGVkdXAgeworICAgICAgICAgICAgLy8gRGVkdXBsaWNhdGUgaWRlbnRpY2FsIHByb3RvYnVmIG1lc3NhZ2VzLiAgTWVzc2FnZXMgd2l0aCB0aGUgc2FtZSBzb3J0aW5nIGtleSBidXQKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBmaWVsZHMgKGluY2x1ZGluZyB0aGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUpIHdpbGwgbm90IGJlCisgICAgICAgICAgICAvLyBkZWR1cGxpY2F0ZWQgYW5kIHRyaWdnZXIgYW4gZXJyb3IgaW4gdmVyaWZ5X2ZpZWxkcy4KKyAgICAgICAgICAgIG1lcmdlZC5wYXJzZWRfZmxhZy5kZWR1cCgpOworICAgICAgICB9CisgICAgICAgIHZlcmlmeV9maWVsZHMoJm1lcmdlZCk/OworICAgICAgICBPayhtZXJnZWQpCisgICAgfQorCisgICAgLy8vIFNvcnQgcGFyc2VkIGZsYWdzCisgICAgcHViIGZuIHNvcnRfcGFyc2VkX2ZsYWdzKHBmOiAmbXV0IFByb3RvUGFyc2VkRmxhZ3MpIHsKKyAgICAgICAgcGYucGFyc2VkX2ZsYWcuc29ydF9ieV9rZXkoY3JlYXRlX3NvcnRpbmdfa2V5KTsKKyAgICB9CisKKyAgICBmbiBjcmVhdGVfc29ydGluZ19rZXkocGY6ICZQcm90b1BhcnNlZEZsYWcpIC0+IFN0cmluZyB7CisgICAgICAgIHBmLmZ1bGx5X3F1YWxpZmllZF9uYW1lKCkKKyAgICB9Cit9CisKKy8vLyBQYXJzZWRGbGFnRXh0IHRyYWl0CitwdWIgdHJhaXQgUGFyc2VkRmxhZ0V4dCB7CisgICAgLy8vIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKKyAgICBmbiBmdWxseV9xdWFsaWZpZWRfbmFtZSgmc2VsZikgLT4gU3RyaW5nOworfQorCitpbXBsIFBhcnNlZEZsYWdFeHQgZm9yIFByb3RvUGFyc2VkRmxhZyB7CisgICAgZm4gZnVsbHlfcXVhbGlmaWVkX25hbWUoJnNlbGYpIC0+IFN0cmluZyB7CisgICAgICAgIGZvcm1hdCEoInt9Lnt9Iiwgc2VsZi5wYWNrYWdlKCksIHNlbGYubmFtZSgpKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZsYWdfZGVjbGFyYXRpb25zX3RyeV9mcm9tX3RleHRfcHJvdG8oKSB7CisgICAgICAgIC8vIHZhbGlkIGlucHV0CisgICAgICAgIGxldCBmbGFnX2RlY2xhcmF0aW9ucyA9IGZsYWdfZGVjbGFyYXRpb25zOjp0cnlfZnJvbV90ZXh0X3Byb3RvKAorICAgICAgICAgICAgciMiCitwYWNrYWdlOiAiY29tLmZvby5iYXIiCitjb250YWluZXI6ICJzeXN0ZW0iCitmbGFnIHsKKyAgICBuYW1lOiAiZmlyc3QiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgYnVnOiAiMTIzIgorICAgIGlzX2V4cG9ydGVkOiB0cnVlCit9CitmbGFnIHsKKyAgICBuYW1lOiAic2Vjb25kIgorICAgIG5hbWVzcGFjZTogInNlY29uZF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWNvbmQgZmxhZy4iCisgICAgYnVnOiAiYWJjIgorICAgIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZQorfQorIiMsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfZGVjbGFyYXRpb25zLnBhY2thZ2UoKSwgImNvbS5mb28uYmFyIik7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19kZWNsYXJhdGlvbnMuY29udGFpbmVyKCksICJzeXN0ZW0iKTsKKyAgICAgICAgbGV0IGZpcnN0ID0gZmxhZ19kZWNsYXJhdGlvbnMuZmxhZy5pdGVyKCkuZmluZCh8cGZ8IHBmLm5hbWUoKSA9PSAiZmlyc3QiKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmaXJzdC5uYW1lKCksICJmaXJzdCIpOworICAgICAgICBhc3NlcnRfZXEhKGZpcnN0Lm5hbWVzcGFjZSgpLCAiZmlyc3RfbnMiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmaXJzdC5kZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIik7CisgICAgICAgIGFzc2VydF9lcSEoZmlyc3QuYnVnLCB2ZWMhWyIxMjMiXSk7CisgICAgICAgIGFzc2VydCEoIWZpcnN0LmlzX2ZpeGVkX3JlYWRfb25seSgpKTsKKyAgICAgICAgYXNzZXJ0IShmaXJzdC5pc19leHBvcnRlZCgpKTsKKyAgICAgICAgbGV0IHNlY29uZCA9IGZsYWdfZGVjbGFyYXRpb25zLmZsYWcuaXRlcigpLmZpbmQofHBmfCBwZi5uYW1lKCkgPT0gInNlY29uZCIpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5uYW1lKCksICJzZWNvbmQiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZWNvbmQubmFtZXNwYWNlKCksICJzZWNvbmRfbnMiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZWNvbmQuZGVzY3JpcHRpb24oKSwgIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWNvbmQgZmxhZy4iKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZWNvbmQuYnVnLCB2ZWMhWyJhYmMiXSk7CisgICAgICAgIGFzc2VydCEoc2Vjb25kLmlzX2ZpeGVkX3JlYWRfb25seSgpKTsKKyAgICAgICAgYXNzZXJ0ISghc2Vjb25kLmlzX2V4cG9ydGVkKCkpOworCisgICAgICAgIC8vIHZhbGlkIGlucHV0OiBtaXNzaW5nIGNvbnRhaW5lciBpbiBmbGFnIGRlY2xhcmF0aW9ucyBpcyBzdXBwb3J0ZWQKKyAgICAgICAgbGV0IGZsYWdfZGVjbGFyYXRpb25zID0gZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oCisgICAgICAgICAgICByIyIKK3BhY2thZ2U6ICJjb20uZm9vLmJhciIKK2ZsYWcgeworICAgIG5hbWU6ICJmaXJzdCIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBidWc6ICIxMjMiCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19kZWNsYXJhdGlvbnMuY29udGFpbmVyKCksICIiKTsKKyAgICAgICAgYXNzZXJ0ISghZmxhZ19kZWNsYXJhdGlvbnMuaGFzX2NvbnRhaW5lcigpKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IG1pc3NpbmcgcGFja2FnZSBpbiBmbGFnIGRlY2xhcmF0aW9ucworICAgICAgICBsZXQgZXJyb3IgPSBmbGFnX2RlY2xhcmF0aW9uczo6dHJ5X2Zyb21fdGV4dF9wcm90bygKKyAgICAgICAgICAgIHIjIgorY29udGFpbmVyOiAic3lzdGVtIgorZmxhZyB7CisgICAgbmFtZTogImZpcnN0IgorICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIgorfQorZmxhZyB7CisgICAgbmFtZTogInNlY29uZCIKKyAgICBuYW1lc3BhY2U6ICJzZWNvbmRfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2Vjb25kIGZsYWcuIgorfQorIiMsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLCAiYmFkIGZsYWcgZGVjbGFyYXRpb25zOiBtaXNzaW5nIHBhY2thZ2UiKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IG1pc3NpbmcgbmFtZXNwYWNlIGluIGZsYWcgZGVjbGFyYXRpb24KKyAgICAgICAgbGV0IGVycm9yID0gZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oCisgICAgICAgICAgICByIyIKK3BhY2thZ2U6ICJjb20uZm9vLmJhciIKK2NvbnRhaW5lcjogInN5c3RlbSIKK2ZsYWcgeworICAgIG5hbWU6ICJmaXJzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKK30KK2ZsYWcgeworICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIKK30KKyIjLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgiezo/fSIsIGVycm9yKSwgImJhZCBmbGFnIGRlY2xhcmF0aW9uOiBtaXNzaW5nIG5hbWVzcGFjZSIpOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogYmFkIHBhY2thZ2UgbmFtZSBpbiBmbGFnIGRlY2xhcmF0aW9ucworICAgICAgICBsZXQgZXJyb3IgPSBmbGFnX2RlY2xhcmF0aW9uczo6dHJ5X2Zyb21fdGV4dF9wcm90bygKKyAgICAgICAgICAgIHIjIgorcGFja2FnZTogIl9jb20uRk9PX19CQVIiCitjb250YWluZXI6ICJzeXN0ZW0iCitmbGFnIHsKKyAgICBuYW1lOiAiZmlyc3QiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCit9CitmbGFnIHsKKyAgICBuYW1lOiAic2Vjb25kIgorICAgIG5hbWVzcGFjZTogInNlY29uZF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWNvbmQgZmxhZy4iCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnQhKGZvcm1hdCEoIns6P30iLCBlcnJvcikuY29udGFpbnMoImJhZCBmbGFnIGRlY2xhcmF0aW9uczogYmFkIHBhY2thZ2UiKSk7CisKKyAgICAgICAgLy8gYmFkIGlucHV0OiBiYWQgbmFtZSBpbiBmbGFnIGRlY2xhcmF0aW9uCisgICAgICAgIGxldCBlcnJvciA9IGZsYWdfZGVjbGFyYXRpb25zOjp0cnlfZnJvbV90ZXh0X3Byb3RvKAorICAgICAgICAgICAgciMiCitwYWNrYWdlOiAiY29tLmZvby5iYXIiCitjb250YWluZXI6ICJzeXN0ZW0iCitmbGFnIHsKKyAgICBuYW1lOiAiRklSU1QiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCit9CitmbGFnIHsKKyAgICBuYW1lOiAic2Vjb25kIgorICAgIG5hbWVzcGFjZTogInNlY29uZF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWNvbmQgZmxhZy4iCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnQhKGZvcm1hdCEoIns6P30iLCBlcnJvcikuY29udGFpbnMoImJhZCBmbGFnIGRlY2xhcmF0aW9uOiBiYWQgbmFtZSIpKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IG5vIGJ1ZyBlbnRyaWVzIGluIGZsYWcgZGVjbGFyYXRpb24KKyAgICAgICAgbGV0IGVycm9yID0gZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oCisgICAgICAgICAgICByIyIKK3BhY2thZ2U6ICJjb20uZm9vLmJhciIKK2NvbnRhaW5lcjogInN5c3RlbSIKK2ZsYWcgeworICAgIG5hbWU6ICJmaXJzdCIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKK30KKyIjLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydCEoZm9ybWF0ISgiezo/fSIsIGVycm9yKS5jb250YWlucygiYmFkIGZsYWcgZGVjbGFyYXRpb246IGV4YWN0bHkgb25lIGJ1ZyByZXF1aXJlZCIpKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IG11bHRpcGxlIGJ1ZyBlbnRyaWVzIGluIGZsYWcgZGVjbGFyYXRpb24KKyAgICAgICAgbGV0IGVycm9yID0gZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oCisgICAgICAgICAgICByIyIKK3BhY2thZ2U6ICJjb20uZm9vLmJhciIKK2NvbnRhaW5lcjogInN5c3RlbSIKK2ZsYWcgeworICAgIG5hbWU6ICJmaXJzdCIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBidWc6ICIxMjMiCisgICAgYnVnOiAiYWJjIgorfQorIiMsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0IShmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLmNvbnRhaW5zKCJiYWQgZmxhZyBkZWNsYXJhdGlvbjogZXhhY3RseSBvbmUgYnVnIHJlcXVpcmVkIikpOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogaW52YWxpZCBjb250YWluZXIgbmFtZSBpbiBmbGFnIGRlY2xhcmF0aW9uCisgICAgICAgIGxldCBlcnJvciA9IGZsYWdfZGVjbGFyYXRpb25zOjp0cnlfZnJvbV90ZXh0X3Byb3RvKAorICAgICAgICAgICAgciMiCitwYWNrYWdlOiAiY29tLmZvby5iYXIiCitjb250YWluZXI6ICJfX2JhZF9iYWRfY29udGFpbmVyLmNvbSIKK2ZsYWcgeworICAgIG5hbWU6ICJmaXJzdCIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBidWc6ICIxMjMiCisgICAgYnVnOiAiYWJjIgorfQorIiMsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0IShmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLmNvbnRhaW5zKCJiYWQgZmxhZyBkZWNsYXJhdGlvbnM6IGJhZCBjb250YWluZXIiKSk7CisKKyAgICAgICAgLy8gVE9ETyhiLzMxMjc2OTcxMCk6IFZlcmlmeSBlcnJvciB3aGVuIGNvbnRhaW5lciBpcyBtaXNzaW5nLgorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZsYWdfdmFsdWVzX3RyeV9mcm9tX3RleHRfcHJvdG8oKSB7CisgICAgICAgIC8vIHZhbGlkIGlucHV0CisgICAgICAgIGxldCBmbGFnX3ZhbHVlcyA9IGZsYWdfdmFsdWVzOjp0cnlfZnJvbV90ZXh0X3Byb3RvKAorICAgICAgICAgICAgciMiCitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgIG5hbWU6ICJmaXJzdCIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uc2Vjb25kIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmaXJzdCA9IGZsYWdfdmFsdWVzLmZsYWdfdmFsdWUuaXRlcigpLmZpbmQofGZ2fCBmdi5uYW1lKCkgPT0gImZpcnN0IikudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoZmlyc3QucGFja2FnZSgpLCAiY29tLmZpcnN0Iik7CisgICAgICAgIGFzc2VydF9lcSEoZmlyc3QubmFtZSgpLCAiZmlyc3QiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmaXJzdC5zdGF0ZSgpLCBQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQpOworICAgICAgICBhc3NlcnRfZXEhKGZpcnN0LnBlcm1pc3Npb24oKSwgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZKTsKKyAgICAgICAgbGV0IHNlY29uZCA9IGZsYWdfdmFsdWVzLmZsYWdfdmFsdWUuaXRlcigpLmZpbmQofGZ2fCBmdi5uYW1lKCkgPT0gInNlY29uZCIpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5wYWNrYWdlKCksICJjb20uc2Vjb25kIik7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLm5hbWUoKSwgInNlY29uZCIpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5zdGF0ZSgpLCBQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCk7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLnBlcm1pc3Npb24oKSwgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSk7CisKKyAgICAgICAgLy8gYmFkIGlucHV0OiBiYWQgcGFja2FnZSBpbiBmbGFnIHZhbHVlCisgICAgICAgIGxldCBlcnJvciA9IGZsYWdfdmFsdWVzOjp0cnlfZnJvbV90ZXh0X3Byb3RvKAorICAgICAgICAgICAgciMiCitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiQ09NLkZJUlNUIgorICAgIG5hbWU6ICJmaXJzdCIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KKyIjLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydCEoZm9ybWF0ISgiezo/fSIsIGVycm9yKS5jb250YWlucygiYmFkIGZsYWcgdmFsdWU6IGJhZCBwYWNrYWdlIikpOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogYmFkIG5hbWUgaW4gZmxhZyB2YWx1ZQorICAgICAgICBsZXQgZXJyb3IgPSBmbGFnX3ZhbHVlczo6dHJ5X2Zyb21fdGV4dF9wcm90bygKKyAgICAgICAgICAgIHIjIgorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICBuYW1lOiAiRklSU1QiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnQhKGZvcm1hdCEoIns6P30iLCBlcnJvcikuY29udGFpbnMoImJhZCBmbGFnIHZhbHVlOiBiYWQgbmFtZSIpKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IG1pc3Npbmcgc3RhdGUgaW4gZmxhZyB2YWx1ZQorICAgICAgICBsZXQgZXJyb3IgPSBmbGFnX3ZhbHVlczo6dHJ5X2Zyb21fdGV4dF9wcm90bygKKyAgICAgICAgICAgIHIjIgorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICBuYW1lOiAiZmlyc3QiCisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKGZvcm1hdCEoIns6P30iLCBlcnJvciksICJiYWQgZmxhZyB2YWx1ZTogbWlzc2luZyBzdGF0ZSIpOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogbWlzc2luZyBwZXJtaXNzaW9uIGluIGZsYWcgdmFsdWUKKyAgICAgICAgbGV0IGVycm9yID0gZmxhZ192YWx1ZXM6OnRyeV9mcm9tX3RleHRfcHJvdG8oCisgICAgICAgICAgICByIyIKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgbmFtZTogImZpcnN0IgorICAgIHN0YXRlOiBESVNBQkxFRAorfQorIiMsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLCAiYmFkIGZsYWcgdmFsdWU6IG1pc3NpbmcgcGVybWlzc2lvbiIpOworICAgIH0KKworICAgIGZuIHRyeV9mcm9tX2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bzogJnN0cikgLT4gUmVzdWx0PFByb3RvUGFyc2VkRmxhZ3M+IHsKKyAgICAgICAgdXNlIHByb3RvYnVmOjpNZXNzYWdlOworCisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3M6IFByb3RvUGFyc2VkRmxhZ3MgPSB0cnlfZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pPzsKKyAgICAgICAgbGV0IG11dCBiaW5hcnlfcHJvdG8gPSBWZWM6Om5ldygpOworICAgICAgICBwYXJzZWRfZmxhZ3Mud3JpdGVfdG9fdmVjKCZtdXQgYmluYXJ5X3Byb3RvKT87CisgICAgICAgIHBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZiaW5hcnlfcHJvdG8pCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VkX2ZsYWdzX3RyeV9mcm9tX3RleHRfcHJvdG8oKSB7CisgICAgICAgIC8vIHZhbGlkIGlucHV0CisgICAgICAgIGxldCB0ZXh0X3Byb3RvID0gciMiCitwYXJzZWRfZmxhZyB7CisgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICBuYW1lOiAiZmlyc3QiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgYnVnOiAiU09NRV9CVUciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uc2Vjb25kIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIKKyAgICBidWc6ICJTT01FX0JVRyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MuZGVjbGFyYXRpb25zIgorICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MudmFsdWVzIgorICAgICAgICBzdGF0ZTogRU5BQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlCisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorIiM7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSB0cnlfZnJvbV9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5sZW4oKSwgMik7CisgICAgICAgIGxldCBzZWNvbmQgPSBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaXRlcigpLmZpbmQofGZ2fCBmdi5uYW1lKCkgPT0gInNlY29uZCIpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5wYWNrYWdlKCksICJjb20uc2Vjb25kIik7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLm5hbWUoKSwgInNlY29uZCIpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5uYW1lc3BhY2UoKSwgInNlY29uZF9ucyIpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5kZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5idWcsIHZlYyFbIlNPTUVfQlVHIl0pOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5zdGF0ZSgpLCBQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCk7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLnBlcm1pc3Npb24oKSwgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZKTsKKyAgICAgICAgYXNzZXJ0X2VxISgyLCBzZWNvbmQudHJhY2UubGVuKCkpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC50cmFjZVswXS5zb3VyY2UoKSwgImZsYWdzLmRlY2xhcmF0aW9ucyIpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC50cmFjZVswXS5zdGF0ZSgpLCBQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC50cmFjZVswXS5wZXJtaXNzaW9uKCksIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSk7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLnRyYWNlWzFdLnNvdXJjZSgpLCAiZmxhZ3MudmFsdWVzIik7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLnRyYWNlWzFdLnN0YXRlKCksIFByb3RvRmxhZ1N0YXRlOjpFTkFCTEVEKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZWNvbmQudHJhY2VbMV0ucGVybWlzc2lvbigpLCBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFkpOworICAgICAgICBhc3NlcnQhKHNlY29uZC5pc19maXhlZF9yZWFkX29ubHkoKSk7CisKKyAgICAgICAgLy8gdmFsaWQgaW5wdXQ6IGVtcHR5CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSB0cnlfZnJvbV9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKCIiKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0IShwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaXNfZW1wdHkoKSk7CisKKyAgICAgICAgLy8gYmFkIGlucHV0OiBlbXB0eSB0cmFjZQorICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgbmFtZTogImZpcnN0IgorICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KKyIjOworICAgICAgICBsZXQgZXJyb3IgPSB0cnlfZnJvbV9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLCAiYmFkIHBhcnNlZCBmbGFnOiBlbXB0eSB0cmFjZSIpOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogbWlzc2luZyBuYW1lc3BhY2UgaW4gcGFyc2VkX2ZsYWcKKyAgICAgICAgbGV0IHRleHRfcHJvdG8gPSByIyIKK3BhcnNlZF9mbGFnIHsKKyAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgIG5hbWU6ICJmaXJzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB0cmFjZSB7CisgICAgICAgIHNvdXJjZTogImZsYWdzLmRlY2xhcmF0aW9ucyIKKyAgICAgICAgc3RhdGU6IERJU0FCTEVECisgICAgICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIH0KKyAgICBjb250YWluZXI6ICJzeXN0ZW0iCit9CisiIzsKKyAgICAgICAgbGV0IGVycm9yID0gdHJ5X2Zyb21fYmluYXJ5X3Byb3RvX2Zyb21fdGV4dF9wcm90byh0ZXh0X3Byb3RvKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgiezo/fSIsIGVycm9yKSwgImJhZCBwYXJzZWQgZmxhZzogbWlzc2luZyBuYW1lc3BhY2UiKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IHBhcnNlZF9mbGFnIG5vdCBzb3J0ZWQgYnkgcGFja2FnZQorICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJiYmIuYmJiIgorICAgIG5hbWU6ICJmaXJzdCIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBidWc6ICIiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJhYWEuYWFhIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIKKyAgICBidWc6ICIiCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorIiM7CisgICAgICAgIGxldCBlcnJvciA9IHRyeV9mcm9tX2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bykudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgICJiYWQgcGFyc2VkIGZsYWdzOiBub3Qgc29ydGVkOiBiYmIuYmJiLmZpcnN0IGNvbWVzIGJlZm9yZSBhYWEuYWFhLnNlY29uZCIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IHBhcnNlZF9mbGFnIG5vdCBzb3J0ZWQgYnkgbmFtZQorICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uZm9vIgorICAgIG5hbWU6ICJiYmIiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgYnVnOiAiIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MuZGVjbGFyYXRpb25zIgorICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KK3BhcnNlZF9mbGFnIHsKKyAgICBwYWNrYWdlOiAiY29tLmZvbyIKKyAgICBuYW1lOiAiYWFhIgorICAgIG5hbWVzcGFjZTogInNlY29uZF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWNvbmQgZmxhZy4iCisgICAgYnVnOiAiIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MuZGVjbGFyYXRpb25zIgorICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KKyIjOworICAgICAgICBsZXQgZXJyb3IgPSB0cnlfZnJvbV9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCisgICAgICAgICAgICAiYmFkIHBhcnNlZCBmbGFnczogbm90IHNvcnRlZDogY29tLmZvby5iYmIgY29tZXMgYmVmb3JlIGNvbS5mb28uYWFhIgorICAgICAgICApOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogZHVwbGljYXRlIGZsYWdzCisgICAgICAgIGxldCB0ZXh0X3Byb3RvID0gciMiCitwYXJzZWRfZmxhZyB7CisgICAgcGFja2FnZTogImNvbS5mb28iCisgICAgbmFtZTogImJhciIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBidWc6ICIiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uZm9vIgorICAgIG5hbWU6ICJiYXIiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIKKyAgICBidWc6ICIiCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorIiM7CisgICAgICAgIGxldCBlcnJvciA9IHRyeV9mcm9tX2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bykudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKGZvcm1hdCEoIns6P30iLCBlcnJvciksICJiYWQgcGFyc2VkIGZsYWdzOiBkdXBsaWNhdGUgZmxhZyBjb20uZm9vLmJhciAoZGVmaW5lZCBpbiBmbGFncy5kZWNsYXJhdGlvbnMgYW5kIGZsYWdzLmRlY2xhcmF0aW9ucykiKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZWRfZmxhZ19wYXRoX3RvX2RlY2xhcmF0aW9uKCkgeworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uZm9vIgorICAgIG5hbWU6ICJiYXIiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgYnVnOiAiYi8xMjM0NTY3OCIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB0cmFjZSB7CisgICAgICAgIHNvdXJjZTogImZsYWdzLmRlY2xhcmF0aW9ucyIKKyAgICAgICAgc3RhdGU6IERJU0FCTEVECisgICAgICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIH0KKyAgICB0cmFjZSB7CisgICAgICAgIHNvdXJjZTogImZsYWdzLnZhbHVlcyIKKyAgICAgICAgc3RhdGU6IEVOQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KKyIjOworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gdHJ5X2Zyb21fYmluYXJ5X3Byb3RvX2Zyb21fdGV4dF9wcm90byh0ZXh0X3Byb3RvKS51bndyYXAoKTsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFnID0gJnBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZ1swXTsKKyAgICAgICAgYXNzZXJ0X2VxIShjcmF0ZTo6cGFyc2VkX2ZsYWc6OnBhdGhfdG9fZGVjbGFyYXRpb24ocGFyc2VkX2ZsYWcpLCAiZmxhZ3MuZGVjbGFyYXRpb25zIik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VkX2ZsYWdzX21lcmdlKCkgeworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgbmFtZTogImZpcnN0IgorICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIgorICAgIGJ1ZzogImEiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uc2Vjb25kIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIKKyAgICBidWc6ICJiIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MuZGVjbGFyYXRpb25zIgorICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KKyIjOworICAgICAgICBsZXQgZXhwZWN0ZWQgPSB0cnlfZnJvbV9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcCgpOworCisgICAgICAgIGxldCB0ZXh0X3Byb3RvID0gciMiCitwYXJzZWRfZmxhZyB7CisgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICBuYW1lOiAiZmlyc3QiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgYnVnOiAiYSIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB0cmFjZSB7CisgICAgICAgIHNvdXJjZTogImZsYWdzLmRlY2xhcmF0aW9ucyIKKyAgICAgICAgc3RhdGU6IERJU0FCTEVECisgICAgICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIH0KKyAgICBjb250YWluZXI6ICJzeXN0ZW0iCit9CisiIzsKKyAgICAgICAgbGV0IGZpcnN0ID0gdHJ5X2Zyb21fYmluYXJ5X3Byb3RvX2Zyb21fdGV4dF9wcm90byh0ZXh0X3Byb3RvKS51bndyYXAoKTsKKworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uc2Vjb25kIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGJ1ZzogImIiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2Vjb25kIGZsYWcuIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MuZGVjbGFyYXRpb25zIgorICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KKyIjOworICAgICAgICBsZXQgc2Vjb25kID0gdHJ5X2Zyb21fYmluYXJ5X3Byb3RvX2Zyb21fdGV4dF9wcm90byh0ZXh0X3Byb3RvKS51bndyYXAoKTsKKworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uc2Vjb25kIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGJ1ZzogImIiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2Vjb25kIGZsYWcuIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZHVwbGljYXRlL2ZsYWdzLmRlY2xhcmF0aW9ucyIKKyAgICAgICAgc3RhdGU6IERJU0FCTEVECisgICAgICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIH0KK30KKyIjOworICAgICAgICBsZXQgc2Vjb25kX2R1cGxpY2F0ZSA9IHRyeV9mcm9tX2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bykudW53cmFwKCk7CisKKyAgICAgICAgLy8gYmFkIGNhc2VzCisKKyAgICAgICAgLy8gdHdvIG9mIHRoZSBzYW1lIGZsYWcgd2l0aCBkZWR1cCBkaXNhYmxlZAorICAgICAgICBsZXQgZXJyb3IgPSBwYXJzZWRfZmxhZ3M6Om1lcmdlKHZlYyFbZmlyc3QuY2xvbmUoKSwgZmlyc3QuY2xvbmUoKV0sIGZhbHNlKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgiezo/fSIsIGVycm9yKSwgImJhZCBwYXJzZWQgZmxhZ3M6IGR1cGxpY2F0ZSBmbGFnIGNvbS5maXJzdC5maXJzdCAoZGVmaW5lZCBpbiBmbGFncy5kZWNsYXJhdGlvbnMgYW5kIGZsYWdzLmRlY2xhcmF0aW9ucykiKTsKKworICAgICAgICAvLyB0d28gY29uZmxpY3RpbmcgZmxhZ3Mgd2l0aCBkZWR1cCBkaXNhYmxlZAorICAgICAgICBsZXQgZXJyb3IgPQorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW3NlY29uZC5jbG9uZSgpLCBzZWNvbmRfZHVwbGljYXRlLmNsb25lKCldLCBmYWxzZSkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKGZvcm1hdCEoIns6P30iLCBlcnJvciksICJiYWQgcGFyc2VkIGZsYWdzOiBkdXBsaWNhdGUgZmxhZyBjb20uc2Vjb25kLnNlY29uZCAoZGVmaW5lZCBpbiBmbGFncy5kZWNsYXJhdGlvbnMgYW5kIGR1cGxpY2F0ZS9mbGFncy5kZWNsYXJhdGlvbnMpIik7CisKKyAgICAgICAgLy8gdHdvIGNvbmZsaWN0aW5nIGZsYWdzIHdpdGggZGVkdXAgZW5hYmxlZAorICAgICAgICBsZXQgZXJyb3IgPQorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW3NlY29uZC5jbG9uZSgpLCBzZWNvbmRfZHVwbGljYXRlLmNsb25lKCldLCB0cnVlKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgiezo/fSIsIGVycm9yKSwgImJhZCBwYXJzZWQgZmxhZ3M6IGR1cGxpY2F0ZSBmbGFnIGNvbS5zZWNvbmQuc2Vjb25kIChkZWZpbmVkIGluIGZsYWdzLmRlY2xhcmF0aW9ucyBhbmQgZHVwbGljYXRlL2ZsYWdzLmRlY2xhcmF0aW9ucykiKTsKKworICAgICAgICAvLyB2YWxpZCBjYXNlcworICAgICAgICBhc3NlcnQhKHBhcnNlZF9mbGFnczo6bWVyZ2UodmVjIVtdLCBmYWxzZSkudW53cmFwKCkucGFyc2VkX2ZsYWcuaXNfZW1wdHkoKSk7CisgICAgICAgIGFzc2VydCEocGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW10sIHRydWUpLnVud3JhcCgpLnBhcnNlZF9mbGFnLmlzX2VtcHR5KCkpOworICAgICAgICBhc3NlcnRfZXEhKGZpcnN0LCBwYXJzZWRfZmxhZ3M6Om1lcmdlKHZlYyFbZmlyc3QuY2xvbmUoKV0sIGZhbHNlKS51bndyYXAoKSk7CisgICAgICAgIGFzc2VydF9lcSEoZmlyc3QsIHBhcnNlZF9mbGFnczo6bWVyZ2UodmVjIVtmaXJzdC5jbG9uZSgpXSwgdHJ1ZSkudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZXhwZWN0ZWQsCisgICAgICAgICAgICBwYXJzZWRfZmxhZ3M6Om1lcmdlKHZlYyFbZmlyc3QuY2xvbmUoKSwgc2Vjb25kLmNsb25lKCldLCBmYWxzZSkudW53cmFwKCkKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW2ZpcnN0LmNsb25lKCksIHNlY29uZC5jbG9uZSgpXSwgdHJ1ZSkudW53cmFwKCkKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW3NlY29uZC5jbG9uZSgpLCBmaXJzdC5jbG9uZSgpXSwgZmFsc2UpLnVud3JhcCgpCisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnczo6bWVyZ2UodmVjIVtzZWNvbmQuY2xvbmUoKSwgZmlyc3QuY2xvbmUoKV0sIHRydWUpLnVud3JhcCgpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gdHdvIGlkZW50aWNhbCBmbGFncyB3aXRoIGRlZHVwIGVuYWJsZWQKKyAgICAgICAgYXNzZXJ0X2VxIShmaXJzdCwgcGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW2ZpcnN0LmNsb25lKCksIGZpcnN0LmNsb25lKCldLCB0cnVlKS51bndyYXAoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTkxOTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNDggQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworcnVzdF9kZWZhdWx0cyB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlLmRlZmF1bHRzIiwKKyAgICBlZGl0aW9uOiAiMjAyMSIsCisgICAgbGludHM6ICJub25lIiwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYW55aG93IiwKKyAgICAgICAgImxpYnRoaXNlcnJvciIsCisgICAgICAgICJsaWJ0ZW1wZmlsZSIsCisgICAgICAgICJsaWJwcm90b2J1ZiIsCisgICAgICAgICJsaWJjbGFwIiwKKyAgICAgICAgImxpYmN4eCIsCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcHJvdG9zIiwKKyAgICBdLAorfQorCitydXN0X2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJhY29uZmlnX3N0b3JhZ2VfZmlsZS5kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBwcm9kdWN0X2F2YWlsYWJsZTogdHJ1ZSwKK30KKworcnVzdF9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImFjb25maWctc3RvcmFnZSIsCisgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19zdG9yYWdlX2ZpbGUuZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInNyYy9tYWluLnJzIl0sCisgICAgcnVzdGxpYnM6IFsibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiXSwKK30KKworcnVzdF90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfZmlsZS50ZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCisgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19zdG9yYWdlX2ZpbGUuZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInNyYy9saWIucnMiXSwKK30KKworcnVzdF9wcm90b2J1ZiB7CisgICAgbmFtZTogImxpYmFjb25maWdfc3RvcmFnZV9wcm90b3MiLAorICAgIHByb3RvczogWyJwcm90b3MvYWNvbmZpZ19zdG9yYWdlX21ldGFkYXRhLnByb3RvIl0sCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfc3RvcmFnZV9wcm90b3MiLAorICAgIHNvdXJjZV9zdGVtOiAiYWNvbmZpZ19zdG9yYWdlX3Byb3RvcyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTphbnlhcGV4IiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHByb2R1Y3RfYXZhaWxhYmxlOiB0cnVlLAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19zdG9yYWdlX3Byb3Rvc19jYyIsCisgICAgcHJvdG86IHsKKyAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorICAgIHNyY3M6IFsicHJvdG9zL2Fjb25maWdfc3RvcmFnZV9tZXRhZGF0YS5wcm90byJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBwcm9kdWN0X2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCit9CisKKy8vIGN4eCBzb3VyY2UgY29kZWdlbiBmcm9tIHJ1c3QgYXBpCitnZW5ydWxlIHsKKyAgICBuYW1lOiAibGliY3h4X2Fjb25maWdfc3RvcmFnZV9maWxlX2JyaWRnZV9jb2RlIiwKKyAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgPiAkKG91dCkiLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIG91dDogWyJhY29uZmlnX3N0b3JhZ2UvbGliLnJzLmNjIl0sCit9CisKKy8vIGN4eCBoZWFkZXIgY29kZWdlbiBmcm9tIHJ1c3QgYXBpCitnZW5ydWxlIHsKKyAgICBuYW1lOiAibGliY3h4X2Fjb25maWdfc3RvcmFnZV9maWxlX2JyaWRnZV9oZWFkZXIiLAorICAgIHRvb2xzOiBbImN4eGJyaWRnZSJdLAorICAgIGNtZDogIiQobG9jYXRpb24gY3h4YnJpZGdlKSAkKGluKSAtLWhlYWRlciA+ICQob3V0KSIsCisgICAgc3JjczogWyJzcmMvbGliLnJzIl0sCisgICAgb3V0OiBbImFjb25maWdfc3RvcmFnZS9saWIucnMuaCJdLAorfQorCisvLyBhIHN0YXRpYyBjYyBsaWIgYmFzZWQgb24gZ2VuZXJhdGVkIGNvZGUKK3J1c3RfZmZpX3N0YXRpYyB7CisgICAgbmFtZTogImxpYmFjb25maWdfc3RvcmFnZV9maWxlX2N4eF9icmlkZ2UiLAorICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3N0b3JhZ2VfZmlsZV9jeHhfYnJpZGdlIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHByb2R1Y3RfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIGRlZmF1bHRzOiBbImFjb25maWdfc3RvcmFnZV9maWxlLmRlZmF1bHRzIl0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTphbnlhcGV4IiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKK30KKworLy8gc3RvcmFnZSBmaWxlIHBhcnNlIGFwaSBjYyBpbnRlcmZhY2UKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZV9jYyIsCisgICAgc3JjczogWyJhY29uZmlnX3N0b3JhZ2VfZmlsZS5jcHAiXSwKKyAgICBnZW5lcmF0ZWRfaGVhZGVyczogWworICAgICAgICAiY3h4LWJyaWRnZS1oZWFkZXIiLAorICAgICAgICAibGliY3h4X2Fjb25maWdfc3RvcmFnZV9maWxlX2JyaWRnZV9oZWFkZXIiLAorICAgIF0sCisgICAgZ2VuZXJhdGVkX3NvdXJjZXM6IFsibGliY3h4X2Fjb25maWdfc3RvcmFnZV9maWxlX2JyaWRnZV9jb2RlIl0sCisgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGVfY3h4X2JyaWRnZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgcHJvZHVjdF9hdmFpbGFibGU6IHRydWUsCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgIF0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTphbnlhcGV4IiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCit9CisKKy8vIHN0b3JhZ2UgZmlsZSBwYXJzZSBhcGkgamF2YSBjY19saWJyYXJ5CitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfZmlsZV9qYXZhIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmNzLyoqLyouamF2YSIsCisgICAgXSwKKyAgICBzZGtfdmVyc2lvbjogImNvcmVfY3VycmVudCIsCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9DYXJnby50b21sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmRmYWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwyNCBAQAorW3BhY2thZ2VdCituYW1lID0gImFjb25maWdfc3RvcmFnZV9maWxlIgordmVyc2lvbiA9ICIwLjEuMCIKK2VkaXRpb24gPSAiMjAyMSIKKworW2ZlYXR1cmVzXQorZGVmYXVsdCA9IFsiY2FyZ28iXQorY2FyZ28gPSBbXQorCitbZGVwZW5kZW5jaWVzXQorYW55aG93ID0gIjEuMC42OSIKK3Byb3RvYnVmID0gIjMuMi4wIgordGVtcGZpbGUgPSAiMy45LjAiCit0aGlzZXJyb3IgPSAiMS4wLjU2IgorY2xhcCA9IHsgdmVyc2lvbiA9ICI0LjEuOCIsIGZlYXR1cmVzID0gWyJkZXJpdmUiXSB9CitjeHggPSAiMS4wIgorCitbW2Jpbl1dCituYW1lID0gImFjb25maWctc3RvcmFnZSIKK3BhdGggPSAic3JjL21haW4ucnMiCisKK1tidWlsZC1kZXBlbmRlbmNpZXNdCitwcm90b2J1Zi1jb2RlZ2VuID0gIjMuMi4wIgorY3h4LWJ1aWxkID0gIjEuMCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvYWNvbmZpZ19zdG9yYWdlX2ZpbGUuY3BwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9hY29uZmlnX3N0b3JhZ2VfZmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmMDI0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvYWNvbmZpZ19zdG9yYWdlX2ZpbGUuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKyNpbmNsdWRlICJydXN0L2N4eC5oIgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9saWIucnMuaCIKKworI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfZmlsZS5ocHAiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOworCituYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlIHsKKworUmVzdWx0PHN0ZDo6dmVjdG9yPEZsYWdWYWx1ZVN1bW1hcnk+PiBsaXN0X2ZsYWdzKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlX21hcCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ19tYXAsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfdmFsKSB7CisgIGF1dG8gZmxhZ19saXN0X2N4eCA9IGxpc3RfZmxhZ3NfY3h4KHJ1c3Q6OlN0cihwYWNrYWdlX21hcC5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVzdDo6U3RyKGZsYWdfbWFwLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydXN0OjpTdHIoZmxhZ192YWwuY19zdHIoKSkpOworICBpZiAoZmxhZ19saXN0X2N4eC5xdWVyeV9zdWNjZXNzKSB7CisgICAgYXV0byBmbGFnX2xpc3QgPSBzdGQ6OnZlY3RvcjxGbGFnVmFsdWVTdW1tYXJ5PigpOworICAgIGZvciAoY29uc3QgYXV0byYgZmxhZ19jeHggOiBmbGFnX2xpc3RfY3h4LmZsYWdzKSB7CisgICAgICBhdXRvIGZsYWcgPSBGbGFnVmFsdWVTdW1tYXJ5KCk7CisgICAgICBmbGFnLnBhY2thZ2VfbmFtZSA9IHN0ZDo6c3RyaW5nKGZsYWdfY3h4LnBhY2thZ2VfbmFtZSk7CisgICAgICBmbGFnLmZsYWdfbmFtZSA9IHN0ZDo6c3RyaW5nKGZsYWdfY3h4LmZsYWdfbmFtZSk7CisgICAgICBmbGFnLmZsYWdfdmFsdWUgPSBzdGQ6OnN0cmluZyhmbGFnX2N4eC5mbGFnX3ZhbHVlKTsKKyAgICAgIGZsYWcudmFsdWVfdHlwZSA9IHN0ZDo6c3RyaW5nKGZsYWdfY3h4LnZhbHVlX3R5cGUpOworICAgICAgZmxhZ19saXN0LnB1c2hfYmFjayhmbGFnKTsKKyAgICB9CisgICAgcmV0dXJuIGZsYWdfbGlzdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRXJyb3IoKSA8PCBmbGFnX2xpc3RfY3h4LmVycm9yX21lc3NhZ2U7CisgIH0KK30KKworUmVzdWx0PHN0ZDo6dmVjdG9yPEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5Pj4gbGlzdF9mbGFnc193aXRoX2luZm8oCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2VfbWFwLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX21hcCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ192YWwsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfaW5mbykgeworICBhdXRvIGZsYWdfbGlzdF9jeHggPSBsaXN0X2ZsYWdzX3dpdGhfaW5mb19jeHgocnVzdDo6U3RyKHBhY2thZ2VfbWFwLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVzdDo6U3RyKGZsYWdfbWFwLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVzdDo6U3RyKGZsYWdfdmFsLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVzdDo6U3RyKGZsYWdfaW5mby5jX3N0cigpKSk7CisgIGlmIChmbGFnX2xpc3RfY3h4LnF1ZXJ5X3N1Y2Nlc3MpIHsKKyAgICBhdXRvIGZsYWdfbGlzdCA9IHN0ZDo6dmVjdG9yPEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5PigpOworICAgIGZvciAoY29uc3QgYXV0byYgZmxhZ19jeHggOiBmbGFnX2xpc3RfY3h4LmZsYWdzKSB7CisgICAgICBhdXRvIGZsYWcgPSBGbGFnVmFsdWVBbmRJbmZvU3VtbWFyeSgpOworICAgICAgZmxhZy5wYWNrYWdlX25hbWUgPSBzdGQ6OnN0cmluZyhmbGFnX2N4eC5wYWNrYWdlX25hbWUpOworICAgICAgZmxhZy5mbGFnX25hbWUgPSBzdGQ6OnN0cmluZyhmbGFnX2N4eC5mbGFnX25hbWUpOworICAgICAgZmxhZy5mbGFnX3ZhbHVlID0gc3RkOjpzdHJpbmcoZmxhZ19jeHguZmxhZ192YWx1ZSk7CisgICAgICBmbGFnLnZhbHVlX3R5cGUgPSBzdGQ6OnN0cmluZyhmbGFnX2N4eC52YWx1ZV90eXBlKTsKKyAgICAgIGZsYWcuaXNfcmVhZHdyaXRlID0gZmxhZ19jeHguaXNfcmVhZHdyaXRlOworICAgICAgZmxhZy5oYXNfc2VydmVyX292ZXJyaWRlID0gZmxhZ19jeHguaGFzX3NlcnZlcl9vdmVycmlkZTsKKyAgICAgIGZsYWcuaGFzX2xvY2FsX292ZXJyaWRlID0gZmxhZ19jeHguaGFzX2xvY2FsX292ZXJyaWRlOworICAgICAgZmxhZ19saXN0LnB1c2hfYmFjayhmbGFnKTsKKyAgICB9CisgICAgcmV0dXJuIGZsYWdfbGlzdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRXJyb3IoKSA8PCBmbGFnX2xpc3RfY3h4LmVycm9yX21lc3NhZ2U7CisgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL2J1aWxkLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9idWlsZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGFkZTJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9idWlsZC5ycwpAQCAtMCwwICsxLDE5IEBACit1c2UgcHJvdG9idWZfY29kZWdlbjo6Q29kZWdlbjsKKworZm4gbWFpbigpIHsKKyAgICBsZXQgcHJvdG9fZmlsZXMgPSB2ZWMhWyJwcm90b3MvYWNvbmZpZ19zdG9yYWdlX21ldGFkYXRhLnByb3RvIl07CisKKyAgICAvLyB0ZWxsIGNhcmdvIHRvIG9ubHkgcmUtcnVuIHRoZSBidWlsZCBzY3JpcHQgaWYgYW55IG9mIHRoZSBwcm90byBmaWxlcyBoYXMgY2hhbmdlZAorICAgIGZvciBwYXRoIGluICZwcm90b19maWxlcyB7CisgICAgICAgIHByaW50bG4hKCJjYXJnbzpyZXJ1bi1pZi1jaGFuZ2VkPXt9IiwgcGF0aCk7CisgICAgfQorCisgICAgQ29kZWdlbjo6bmV3KCkKKyAgICAgICAgLnB1cmUoKQorICAgICAgICAuaW5jbHVkZSgicHJvdG9zIikKKyAgICAgICAgLmlucHV0cyhwcm90b19maWxlcykKKyAgICAgICAgLmNhcmdvX291dF9kaXIoImFjb25maWdfc3RvcmFnZV9wcm90b3MiKQorICAgICAgICAucnVuX2Zyb21fc2NyaXB0KCk7CisKKyAgICBsZXQgXyA9IGN4eF9idWlsZDo6YnJpZGdlKCJzcmMvbGliLnJzIik7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL2luY2x1ZGUvYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV9maWxlLmhwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvaW5jbHVkZS9hY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX2ZpbGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmM2NkYjAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL2luY2x1ZGUvYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV9maWxlLmhwcApAQCAtMCwwICsxLDQ4IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgorCituYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlIHsKKworLy8vIEZsYWcgdmFsdWUgc3VtbWFyeSBmb3IgYSBmbGFnCitzdHJ1Y3QgRmxhZ1ZhbHVlU3VtbWFyeSB7CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZTsKKyAgc3RkOjpzdHJpbmcgZmxhZ19uYW1lOworICBzdGQ6OnN0cmluZyBmbGFnX3ZhbHVlOworICBzdGQ6OnN0cmluZyB2YWx1ZV90eXBlOworfTsKKworLy8vIExpc3QgYWxsIGZsYWcgdmFsdWVzCisvLy8gXGlucHV0IHBhY2thZ2VfbWFwOiBwYWNrYWdlIG1hcCBmaWxlCisvLy8gXGlucHV0IGZsYWdfbWFwOiBmbGFnIG1hcCBmaWxlCisvLy8gXGlucHV0IGZsYWdfdmFsOiBmbGFnIHZhbHVlIGZpbGUKK2FuZHJvaWQ6OmJhc2U6OlJlc3VsdDxzdGQ6OnZlY3RvcjxGbGFnVmFsdWVTdW1tYXJ5Pj4gbGlzdF9mbGFncygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9tYXAsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfbWFwLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX3ZhbCk7CisKKy8vLyBGbGFnIHZhbHVlIGFuZCBpbmZvIHN1bW1hcnkgZm9yIGEgZmxhZworc3RydWN0IEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5IHsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lOworICBzdGQ6OnN0cmluZyBmbGFnX25hbWU7CisgIHN0ZDo6c3RyaW5nIGZsYWdfdmFsdWU7CisgIHN0ZDo6c3RyaW5nIHZhbHVlX3R5cGU7CisgIGJvb2wgaXNfcmVhZHdyaXRlOworICBib29sIGhhc19zZXJ2ZXJfb3ZlcnJpZGU7CisgIGJvb2wgaGFzX2xvY2FsX292ZXJyaWRlOworfTsKKworLy8vIExpc3QgYWxsIGZsYWcgdmFsdWVzIHdpdGggdGhlaXIgZmxhZyBpbmZvCisvLy8gXGlucHV0IHBhY2thZ2VfbWFwOiBwYWNrYWdlIG1hcCBmaWxlCisvLy8gXGlucHV0IGZsYWdfbWFwOiBmbGFnIG1hcCBmaWxlCisvLy8gXGlucHV0IGZsYWdfdmFsOiBmbGFnIHZhbHVlIGZpbGUKKy8vLyBcaW5wdXQgZmxhZ19pbmZvOiBmbGFnIGluZm8gZmlsZQorYW5kcm9pZDo6YmFzZTo6UmVzdWx0PHN0ZDo6dmVjdG9yPEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5Pj4gbGlzdF9mbGFnc193aXRoX2luZm8oCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2VfbWFwLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX21hcCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ192YWwsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfaW5mbyk7CisKK30vLyBuYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Byb3Rvcy9hY29uZmlnX3N0b3JhZ2VfbWV0YWRhdGEucHJvdG8gYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Byb3Rvcy9hY29uZmlnX3N0b3JhZ2VfbWV0YWRhdGEucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjMWM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvcHJvdG9zL2Fjb25maWdfc3RvcmFnZV9tZXRhZGF0YS5wcm90bwpAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorCisvLyBUaGlzIGlzIHRoZSBzY2hlbWEgZGVmaW5pdGlvbiBmb3IgYWNvbmZpZyBmaWxlcy4gTW9kaWZpY2F0aW9ucyBuZWVkIHRvIGJlCisvLyBlaXRoZXIgYmFja3dhcmRzIGNvbXBhdGlibGUsIG9yIGluY2x1ZGUgdXBkYXRlcyB0byBhbGwgYWNvbmZpZyBmaWxlcyBpbiB0aGUKKy8vIEFuZHJvaWQgdHJlZS4KKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnX3N0b3JhZ2VfbWV0YWRhdGE7CisKK21lc3NhZ2Ugc3RvcmFnZV9maWxlX2luZm8geworICBvcHRpb25hbCB1aW50MzIgdmVyc2lvbiA9IDE7CisgIG9wdGlvbmFsIHN0cmluZyBjb250YWluZXIgPSAyOworICBvcHRpb25hbCBzdHJpbmcgcGFja2FnZV9tYXAgPSAzOworICBvcHRpb25hbCBzdHJpbmcgZmxhZ19tYXAgPSA0OworICBvcHRpb25hbCBzdHJpbmcgZmxhZ192YWwgPSA1OworICBvcHRpb25hbCBzdHJpbmcgZmxhZ19pbmZvID0gNjsKKyAgb3B0aW9uYWwgaW50NjQgdGltZXN0YW1wID0gNzsKK30KKworbWVzc2FnZSBzdG9yYWdlX2ZpbGVzIHsKKyAgcmVwZWF0ZWQgc3RvcmFnZV9maWxlX2luZm8gZmlsZXMgPSAxOworfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfaW5mby5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfaW5mby5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWFjMzhkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ19pbmZvLnJzCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGZsYWcgaW5mbyBtb2R1bGUgZGVmaW5lcyB0aGUgZmxhZyBpbmZvIGZpbGUgZm9ybWF0IGFuZCBtZXRob2RzIGZvciBzZXJpYWxpemF0aW9uCisvLyEgYW5kIGRlc2VyaWFsaXphdGlvbgorCit1c2UgY3JhdGU6OntyZWFkX3N0cl9mcm9tX2J5dGVzLCByZWFkX3UzMl9mcm9tX2J5dGVzLCByZWFkX3U4X2Zyb21fYnl0ZXN9OwordXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlfTsKK3VzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBzdGQ6OmZtdDsKKworLy8vIEZsYWcgaW5mbyBoZWFkZXIgc3RydWN0CisjW2Rlcml2ZShQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBGbGFnSW5mb0hlYWRlciB7CisgICAgcHViIHZlcnNpb246IHUzMiwKKyAgICBwdWIgY29udGFpbmVyOiBTdHJpbmcsCisgICAgcHViIGZpbGVfdHlwZTogdTgsCisgICAgcHViIGZpbGVfc2l6ZTogdTMyLAorICAgIHB1YiBudW1fZmxhZ3M6IHUzMiwKKyAgICBwdWIgYm9vbGVhbl9mbGFnX29mZnNldDogdTMyLAorfQorCisvLy8gSW1wbGVtZW50IGRlYnVnIHByaW50IHRyYWl0IGZvciBoZWFkZXIKK2ltcGwgZm10OjpEZWJ1ZyBmb3IgRmxhZ0luZm9IZWFkZXIgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiVmVyc2lvbjoge30sIENvbnRhaW5lcjoge30sIEZpbGUgVHlwZTogezo/fSwgRmlsZSBTaXplOiB7fSIsCisgICAgICAgICAgICBzZWxmLnZlcnNpb24sCisgICAgICAgICAgICBzZWxmLmNvbnRhaW5lciwKKyAgICAgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6dHJ5X2Zyb20oc2VsZi5maWxlX3R5cGUpLAorICAgICAgICAgICAgc2VsZi5maWxlX3NpemUKKyAgICAgICAgKT87CisgICAgICAgIHdyaXRlbG4hKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJOdW0gb2YgRmxhZ3M6IHt9LCBCb29sZWFuIEZsYWcgT2Zmc2V0Ont9IiwKKyAgICAgICAgICAgIHNlbGYubnVtX2ZsYWdzLCBzZWxmLmJvb2xlYW5fZmxhZ19vZmZzZXQKKyAgICAgICAgKT87CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworaW1wbCBGbGFnSW5mb0hlYWRlciB7CisgICAgLy8vIFNlcmlhbGl6ZSB0byBieXRlcworICAgIHB1YiBmbiBpbnRvX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IG11dCByZXN1bHQgPSBWZWM6Om5ldygpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYudmVyc2lvbi50b19sZV9ieXRlcygpKTsKKyAgICAgICAgbGV0IGNvbnRhaW5lcl9ieXRlcyA9IHNlbGYuY29udGFpbmVyLmFzX2J5dGVzKCk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmKGNvbnRhaW5lcl9ieXRlcy5sZW4oKSBhcyB1MzIpLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoY29udGFpbmVyX2J5dGVzKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmZpbGVfdHlwZS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmZpbGVfc2l6ZS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLm51bV9mbGFncy50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmJvb2xlYW5fZmxhZ19vZmZzZXQudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdAorICAgIH0KKworICAgIC8vLyBEZXNlcmlhbGl6ZSBmcm9tIGJ5dGVzCisgICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOworICAgICAgICBsZXQgbGlzdCA9IFNlbGYgeworICAgICAgICAgICAgdmVyc2lvbjogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBjb250YWluZXI6IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV90eXBlOiByZWFkX3U4X2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV9zaXplOiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG51bV9mbGFnczogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBib29sZWFuX2ZsYWdfb2Zmc2V0OiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgfTsKKyAgICAgICAgaWYgbGlzdC5maWxlX3R5cGUgIT0gU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbyBhcyB1OCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoCisgICAgICAgICAgICAgICAgImJpbmFyeSBmaWxlIGlzIG5vdCBhIGZsYWcgaW5mbyBmaWxlIgorICAgICAgICAgICAgKSkpOworICAgICAgICB9CisgICAgICAgIE9rKGxpc3QpCisgICAgfQorfQorCisvLy8gYml0IGZpZWxkIGZvciBmbGFnIGluZm8KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgUGFydGlhbEVxLCBFcSldCitwdWIgZW51bSBGbGFnSW5mb0JpdCB7CisgICAgSGFzU2VydmVyT3ZlcnJpZGUgPSAxIDw8IDAsCisgICAgSXNSZWFkV3JpdGUgPSAxIDw8IDEsCisgICAgSGFzTG9jYWxPdmVycmlkZSA9IDEgPDwgMiwKK30KKworLy8vIEZsYWcgaW5mbyBub2RlIHN0cnVjdAorI1tkZXJpdmUoUGFydGlhbEVxLCBDbG9uZSldCitwdWIgc3RydWN0IEZsYWdJbmZvTm9kZSB7CisgICAgcHViIGF0dHJpYnV0ZXM6IHU4LAorfQorCisvLy8gSW1wbGVtZW50IGRlYnVnIHByaW50IHRyYWl0IGZvciBub2RlCitpbXBsIGZtdDo6RGVidWcgZm9yIEZsYWdJbmZvTm9kZSB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGZtdDo6Rm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlbG4hKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJyZWFkd3JpdGU6IHt9LCBzZXJ2ZXIgb3ZlcnJpZGU6IHt9LCBsb2NhbCBvdmVycmlkZToge30iLAorICAgICAgICAgICAgc2VsZi5hdHRyaWJ1dGVzICYgKEZsYWdJbmZvQml0OjpJc1JlYWRXcml0ZSBhcyB1OCkgIT0gMCwKKyAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlcyAmIChGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpICE9IDAsCisgICAgICAgICAgICBzZWxmLmF0dHJpYnV0ZXMgJiAoRmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUgYXMgdTgpICE9IDAsCisgICAgICAgICk/OworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKK2ltcGwgRmxhZ0luZm9Ob2RlIHsKKyAgICAvLy8gU2VyaWFsaXplIHRvIGJ5dGVzCisgICAgcHViIGZuIGludG9fYnl0ZXMoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgbXV0IHJlc3VsdCA9IFZlYzo6bmV3KCk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5hdHRyaWJ1dGVzLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQKKyAgICB9CisKKyAgICAvLy8gRGVzZXJpYWxpemUgZnJvbSBieXRlcworICAgIHB1YiBmbiBmcm9tX2J5dGVzKGJ5dGVzOiAmW3U4XSkgLT4gUmVzdWx0PFNlbGYsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBoZWFkID0gMDsKKyAgICAgICAgbGV0IG5vZGUgPSBTZWxmIHsgYXR0cmlidXRlczogcmVhZF91OF9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPyB9OworICAgICAgICBPayhub2RlKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgZmxhZyBpbmZvIG5vZGUKKyAgICBwdWIgZm4gY3JlYXRlKGlzX2ZsYWdfcnc6IGJvb2wpIC0+IFNlbGYgeworICAgICAgICBTZWxmIHsgYXR0cmlidXRlczogaWYgaXNfZmxhZ19ydyB7IEZsYWdJbmZvQml0OjpJc1JlYWRXcml0ZSBhcyB1OCB9IGVsc2UgeyAwdTggfSB9CisgICAgfQorfQorCisvLy8gRmxhZyBpbmZvIGxpc3Qgc3RydWN0CisjW2Rlcml2ZShQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBGbGFnSW5mb0xpc3QgeworICAgIHB1YiBoZWFkZXI6IEZsYWdJbmZvSGVhZGVyLAorICAgIHB1YiBub2RlczogVmVjPEZsYWdJbmZvTm9kZT4sCit9CisKKy8vLyBJbXBsZW1lbnQgZGVidWcgcHJpbnQgdHJhaXQgZm9yIGZsYWcgaW5mbyBsaXN0CitpbXBsIGZtdDo6RGVidWcgZm9yIEZsYWdJbmZvTGlzdCB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGZtdDo6Rm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlbG4hKGYsICJIZWFkZXI6Iik/OworICAgICAgICB3cml0ZSEoZiwgIns6P30iLCBzZWxmLmhlYWRlcik/OworICAgICAgICB3cml0ZWxuIShmLCAiTm9kZXM6Iik/OworICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLm5vZGVzLml0ZXIoKSB7CisgICAgICAgICAgICB3cml0ZSEoZiwgIns6P30iLCBub2RlKT87CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIEZsYWdJbmZvTGlzdCB7CisgICAgLy8vIFNlcmlhbGl6ZSB0byBieXRlcworICAgIHB1YiBmbiBpbnRvX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgWworICAgICAgICAgICAgc2VsZi5oZWFkZXIuaW50b19ieXRlcygpLAorICAgICAgICAgICAgc2VsZi5ub2Rlcy5pdGVyKCkubWFwKHx2fCB2LmludG9fYnl0ZXMoKSkuY29sbGVjdDo6PFZlYzxfPj4oKS5jb25jYXQoKSwKKyAgICAgICAgXQorICAgICAgICAuY29uY2F0KCkKKyAgICB9CisKKyAgICAvLy8gRGVzZXJpYWxpemUgZnJvbSBieXRlcworICAgIHB1YiBmbiBmcm9tX2J5dGVzKGJ5dGVzOiAmW3U4XSkgLT4gUmVzdWx0PFNlbGYsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICAgICAgbGV0IGhlYWRlciA9IEZsYWdJbmZvSGVhZGVyOjpmcm9tX2J5dGVzKGJ5dGVzKT87CisgICAgICAgIGxldCBudW1fZmxhZ3MgPSBoZWFkZXIubnVtX2ZsYWdzOworICAgICAgICBsZXQgbXV0IGhlYWQgPSBoZWFkZXIuaW50b19ieXRlcygpLmxlbigpOworICAgICAgICBsZXQgbm9kZXMgPSAoMC4ubnVtX2ZsYWdzKQorICAgICAgICAgICAgLm1hcCh8X3wgeworICAgICAgICAgICAgICAgIGxldCBub2RlID0gRmxhZ0luZm9Ob2RlOjpmcm9tX2J5dGVzKCZieXRlc1toZWFkLi5dKT87CisgICAgICAgICAgICAgICAgaGVhZCArPSBub2RlLmludG9fYnl0ZXMoKS5sZW4oKTsKKyAgICAgICAgICAgICAgICBPayhub2RlKQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5jb2xsZWN0Ojo8UmVzdWx0PFZlYzxfPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+KCkKKyAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUVycm9yOjpCeXRlc1BhcnNlRmFpbChhbnlob3chKAorICAgICAgICAgICAgICAgICAgICAiZmFpbCB0byBwYXJzZSBmbGFnIGluZm8gbGlzdDoge30iLAorICAgICAgICAgICAgICAgICAgICBlcnJtc2cKKyAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgfSk/OworICAgICAgICBsZXQgbGlzdCA9IFNlbGYgeyBoZWFkZXIsIG5vZGVzIH07CisgICAgICAgIE9rKGxpc3QpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3Q7CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHZhbHVlIGxpc3Qgc2VyaWFsaXphdGlvbgorICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKTsKKworICAgICAgICBsZXQgaGVhZGVyOiAmRmxhZ0luZm9IZWFkZXIgPSAmZmxhZ19pbmZvX2xpc3QuaGVhZGVyOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9oZWFkZXIgPSBGbGFnSW5mb0hlYWRlcjo6ZnJvbV9ieXRlcygmaGVhZGVyLmludG9fYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF9oZWFkZXIuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoaGVhZGVyLCAmcmVpbnRlcnByZXRlZF9oZWFkZXIudW53cmFwKCkpOworCisgICAgICAgIGxldCBub2RlczogJlZlYzxGbGFnSW5mb05vZGU+ID0gJmZsYWdfaW5mb19saXN0Lm5vZGVzOworICAgICAgICBmb3Igbm9kZSBpbiBub2Rlcy5pdGVyKCkgeworICAgICAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfbm9kZSA9IEZsYWdJbmZvTm9kZTo6ZnJvbV9ieXRlcygmbm9kZS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLCAmcmVpbnRlcnByZXRlZF9ub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBmbGFnX2luZm9fYnl0ZXMgPSBmbGFnX2luZm9fbGlzdC5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCByZWludGVycHJldGVkX2luZm9fbGlzdCA9IEZsYWdJbmZvTGlzdDo6ZnJvbV9ieXRlcygmZmxhZ19pbmZvX2J5dGVzKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2luZm9fbGlzdC5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmZmxhZ19pbmZvX2xpc3QsICZyZWludGVycHJldGVkX2luZm9fbGlzdC51bndyYXAoKSk7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19pbmZvX2J5dGVzLmxlbigpIGFzIHUzMiwgaGVhZGVyLmZpbGVfc2l6ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoYXQgdmVyc2lvbiBudW1iZXIgc2hvdWxkIGJlIGF0IHRoZSB0b3Agb2Ygc2VyaWFsaXplZAorICAgIC8vIGJ5dGVzCisgICAgZm4gdGVzdF92ZXJzaW9uX251bWJlcigpIHsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gJmZsYWdfaW5mb19saXN0LmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IG11dCBoZWFkID0gMDsKKyAgICAgICAgbGV0IHZlcnNpb24gPSByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHZlcnNpb24sIDEpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmaWxlIHR5cGUgY2hlY2sKKyAgICBmbiB0ZXN0X2ZpbGVfdHlwZV9jaGVjaygpIHsKKyAgICAgICAgbGV0IG11dCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCk7CisgICAgICAgIGZsYWdfaW5mb19saXN0LmhlYWRlci5maWxlX3R5cGUgPSAxMjN1ODsKKyAgICAgICAgbGV0IGVycm9yID0gRmxhZ0luZm9MaXN0Ojpmcm9tX2J5dGVzKCZmbGFnX2luZm9fbGlzdC5pbnRvX2J5dGVzKCkpLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCisgICAgICAgICAgICBmb3JtYXQhKCJCeXRlc1BhcnNlRmFpbChiaW5hcnkgZmlsZSBpcyBub3QgYSBmbGFnIGluZm8gZmlsZSkiKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfdGFibGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3RhYmxlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YjkwZWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3RhYmxlLnJzCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGZsYWcgdGFibGUgbW9kdWxlIGRlZmluZXMgdGhlIGZsYWcgdGFibGUgZmlsZSBmb3JtYXQgYW5kIG1ldGhvZHMgZm9yIHNlcmlhbGl6YXRpb24KKy8vISBhbmQgZGVzZXJpYWxpemF0aW9uCisKK3VzZSBjcmF0ZTo6eworICAgIGdldF9idWNrZXRfaW5kZXgsIHJlYWRfc3RyX2Zyb21fYnl0ZXMsIHJlYWRfdTE2X2Zyb21fYnl0ZXMsIHJlYWRfdTMyX2Zyb21fYnl0ZXMsCisgICAgcmVhZF91OF9mcm9tX2J5dGVzLAorfTsKK3VzZSBjcmF0ZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZSwgU3RvcmVkRmxhZ1R5cGV9OwordXNlIGFueWhvdzo6YW55aG93OwordXNlIHN0ZDo6Zm10OworCisvLy8gRmxhZyB0YWJsZSBoZWFkZXIgc3RydWN0CisjW2Rlcml2ZShQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBGbGFnVGFibGVIZWFkZXIgeworICAgIHB1YiB2ZXJzaW9uOiB1MzIsCisgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAorICAgIHB1YiBmaWxlX3R5cGU6IHU4LAorICAgIHB1YiBmaWxlX3NpemU6IHUzMiwKKyAgICBwdWIgbnVtX2ZsYWdzOiB1MzIsCisgICAgcHViIGJ1Y2tldF9vZmZzZXQ6IHUzMiwKKyAgICBwdWIgbm9kZV9vZmZzZXQ6IHUzMiwKK30KKworLy8vIEltcGxlbWVudCBkZWJ1ZyBwcmludCB0cmFpdCBmb3IgaGVhZGVyCitpbXBsIGZtdDo6RGVidWcgZm9yIEZsYWdUYWJsZUhlYWRlciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGZtdDo6Rm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlbG4hKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJWZXJzaW9uOiB7fSwgQ29udGFpbmVyOiB7fSwgRmlsZSBUeXBlOiB7Oj99LCBGaWxlIFNpemU6IHt9IiwKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbiwKKyAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLAorICAgICAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjp0cnlfZnJvbShzZWxmLmZpbGVfdHlwZSksCisgICAgICAgICAgICBzZWxmLmZpbGVfc2l6ZQorICAgICAgICApPzsKKyAgICAgICAgd3JpdGVsbiEoCisgICAgICAgICAgICBmLAorICAgICAgICAgICAgIk51bSBvZiBGbGFnczoge30sIEJ1Y2tldCBPZmZzZXQ6e30sIE5vZGUgT2Zmc2V0OiB7fSIsCisgICAgICAgICAgICBzZWxmLm51bV9mbGFncywgc2VsZi5idWNrZXRfb2Zmc2V0LCBzZWxmLm5vZGVfb2Zmc2V0CisgICAgICAgICk/OworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKK2ltcGwgRmxhZ1RhYmxlSGVhZGVyIHsKKyAgICAvLy8gU2VyaWFsaXplIHRvIGJ5dGVzCisgICAgcHViIGZuIGludG9fYnl0ZXMoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgbXV0IHJlc3VsdCA9IFZlYzo6bmV3KCk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi52ZXJzaW9uLnRvX2xlX2J5dGVzKCkpOworICAgICAgICBsZXQgY29udGFpbmVyX2J5dGVzID0gc2VsZi5jb250YWluZXIuYXNfYnl0ZXMoKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCYoY29udGFpbmVyX2J5dGVzLmxlbigpIGFzIHUzMikudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZShjb250YWluZXJfYnl0ZXMpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuZmlsZV90eXBlLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuZmlsZV9zaXplLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYubnVtX2ZsYWdzLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuYnVja2V0X29mZnNldC50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLm5vZGVfb2Zmc2V0LnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQKKyAgICB9CisKKyAgICAvLy8gRGVzZXJpYWxpemUgZnJvbSBieXRlcworICAgIHB1YiBmbiBmcm9tX2J5dGVzKGJ5dGVzOiAmW3U4XSkgLT4gUmVzdWx0PFNlbGYsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBoZWFkID0gMDsKKyAgICAgICAgbGV0IHRhYmxlID0gU2VsZiB7CisgICAgICAgICAgICB2ZXJzaW9uOiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIGNvbnRhaW5lcjogcmVhZF9zdHJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBmaWxlX3R5cGU6IHJlYWRfdThfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBmaWxlX3NpemU6IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgbnVtX2ZsYWdzOiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIGJ1Y2tldF9vZmZzZXQ6IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgbm9kZV9vZmZzZXQ6IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICB9OworICAgICAgICBpZiB0YWJsZS5maWxlX3R5cGUgIT0gU3RvcmFnZUZpbGVUeXBlOjpGbGFnTWFwIGFzIHU4IHsKKyAgICAgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6Qnl0ZXNQYXJzZUZhaWwoYW55aG93ISgKKyAgICAgICAgICAgICAgICAiYmluYXJ5IGZpbGUgaXMgbm90IGEgZmxhZyBtYXAiCisgICAgICAgICAgICApKSk7CisgICAgICAgIH0KKyAgICAgICAgT2sodGFibGUpCisgICAgfQorfQorCisvLy8gRmxhZyB0YWJsZSBub2RlIHN0cnVjdAorI1tkZXJpdmUoUGFydGlhbEVxLCBDbG9uZSldCitwdWIgc3RydWN0IEZsYWdUYWJsZU5vZGUgeworICAgIHB1YiBwYWNrYWdlX2lkOiB1MzIsCisgICAgcHViIGZsYWdfbmFtZTogU3RyaW5nLAorICAgIHB1YiBmbGFnX3R5cGU6IFN0b3JlZEZsYWdUeXBlLAorICAgIC8vIHdpdGhpbiBwYWNrYWdlIGZsYWcgaW5kZXggb2YgdGhpcyBmbGFnIHR5cGUKKyAgICBwdWIgZmxhZ19pbmRleDogdTE2LAorICAgIHB1YiBuZXh0X29mZnNldDogT3B0aW9uPHUzMj4sCit9CisKKy8vLyBJbXBsZW1lbnQgZGVidWcgcHJpbnQgdHJhaXQgZm9yIG5vZGUKK2ltcGwgZm10OjpEZWJ1ZyBmb3IgRmxhZ1RhYmxlTm9kZSB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IGZtdDo6Rm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlbG4hKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJQYWNrYWdlIElkOiB7fSwgRmxhZzoge30sIFR5cGU6IHs6P30sIEluZGV4OiB7fSwgTmV4dDogezo/fSIsCisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfaWQsIHNlbGYuZmxhZ19uYW1lLCBzZWxmLmZsYWdfdHlwZSwgc2VsZi5mbGFnX2luZGV4LCBzZWxmLm5leHRfb2Zmc2V0CisgICAgICAgICk/OworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKK2ltcGwgRmxhZ1RhYmxlTm9kZSB7CisgICAgLy8vIFNlcmlhbGl6ZSB0byBieXRlcworICAgIHB1YiBmbiBpbnRvX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IG11dCByZXN1bHQgPSBWZWM6Om5ldygpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYucGFja2FnZV9pZC50b19sZV9ieXRlcygpKTsKKyAgICAgICAgbGV0IG5hbWVfYnl0ZXMgPSBzZWxmLmZsYWdfbmFtZS5hc19ieXRlcygpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJihuYW1lX2J5dGVzLmxlbigpIGFzIHUzMikudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZShuYW1lX2J5dGVzKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCYoc2VsZi5mbGFnX3R5cGUgYXMgdTE2KS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmZsYWdfaW5kZXgudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5uZXh0X29mZnNldC51bndyYXBfb3IoMCkudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdAorICAgIH0KKworICAgIC8vLyBEZXNlcmlhbGl6ZSBmcm9tIGJ5dGVzCisgICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOworICAgICAgICBsZXQgbm9kZSA9IFNlbGYgeworICAgICAgICAgICAgcGFja2FnZV9pZDogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBmbGFnX25hbWU6IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmxhZ190eXBlOiBTdG9yZWRGbGFnVHlwZTo6dHJ5X2Zyb20ocmVhZF91MTZfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8pPywKKyAgICAgICAgICAgIGZsYWdfaW5kZXg6IHJlYWRfdTE2X2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IG1hdGNoIHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/IHsKKyAgICAgICAgICAgICAgICAwID0+IE5vbmUsCisgICAgICAgICAgICAgICAgdmFsID0+IFNvbWUodmFsKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH07CisgICAgICAgIE9rKG5vZGUpCisgICAgfQorCisgICAgLy8vIENhbGN1bGF0ZSBub2RlIGJ1Y2tldCBpbmRleAorICAgIHB1YiBmbiBmaW5kX2J1Y2tldF9pbmRleChwYWNrYWdlX2lkOiB1MzIsIGZsYWdfbmFtZTogJnN0ciwgbnVtX2J1Y2tldHM6IHUzMikgLT4gdTMyIHsKKyAgICAgICAgbGV0IGZ1bGxfZmxhZ19uYW1lID0gcGFja2FnZV9pZC50b19zdHJpbmcoKSArICIvIiArIGZsYWdfbmFtZTsKKyAgICAgICAgZ2V0X2J1Y2tldF9pbmRleCgmZnVsbF9mbGFnX25hbWUsIG51bV9idWNrZXRzKQorICAgIH0KK30KKworI1tkZXJpdmUoUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgRmxhZ1RhYmxlIHsKKyAgICBwdWIgaGVhZGVyOiBGbGFnVGFibGVIZWFkZXIsCisgICAgcHViIGJ1Y2tldHM6IFZlYzxPcHRpb248dTMyPj4sCisgICAgcHViIG5vZGVzOiBWZWM8RmxhZ1RhYmxlTm9kZT4sCit9CisKKy8vLyBJbXBsZW1lbnQgZGVidWcgcHJpbnQgdHJhaXQgZm9yIGZsYWcgdGFibGUKK2ltcGwgZm10OjpEZWJ1ZyBmb3IgRmxhZ1RhYmxlIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgZm10OjpGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGVsbiEoZiwgIkhlYWRlcjoiKT87CisgICAgICAgIHdyaXRlIShmLCAiezo/fSIsIHNlbGYuaGVhZGVyKT87CisgICAgICAgIHdyaXRlbG4hKGYsICJCdWNrZXRzOiIpPzsKKyAgICAgICAgd3JpdGVsbiEoZiwgIns6P30iLCBzZWxmLmJ1Y2tldHMpPzsKKyAgICAgICAgd3JpdGVsbiEoZiwgIk5vZGVzOiIpPzsKKyAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5ub2Rlcy5pdGVyKCkgeworICAgICAgICAgICAgd3JpdGUhKGYsICJ7Oj99Iiwgbm9kZSk/OworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworLy8vIEZsYWcgdGFibGUgc3RydWN0CitpbXBsIEZsYWdUYWJsZSB7CisgICAgLy8vIFNlcmlhbGl6ZSB0byBieXRlcworICAgIHB1YiBmbiBpbnRvX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgWworICAgICAgICAgICAgc2VsZi5oZWFkZXIuaW50b19ieXRlcygpLAorICAgICAgICAgICAgc2VsZi5idWNrZXRzLml0ZXIoKS5tYXAofHZ8IHYudW53cmFwX29yKDApLnRvX2xlX2J5dGVzKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkuY29uY2F0KCksCisgICAgICAgICAgICBzZWxmLm5vZGVzLml0ZXIoKS5tYXAofHZ8IHYuaW50b19ieXRlcygpKS5jb2xsZWN0Ojo8VmVjPF8+PigpLmNvbmNhdCgpLAorICAgICAgICBdCisgICAgICAgIC5jb25jYXQoKQorICAgIH0KKworICAgIC8vLyBEZXNlcmlhbGl6ZSBmcm9tIGJ5dGVzCisgICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgICAgICBsZXQgaGVhZGVyID0gRmxhZ1RhYmxlSGVhZGVyOjpmcm9tX2J5dGVzKGJ5dGVzKT87CisgICAgICAgIGxldCBudW1fZmxhZ3MgPSBoZWFkZXIubnVtX2ZsYWdzOworICAgICAgICBsZXQgbnVtX2J1Y2tldHMgPSBjcmF0ZTo6Z2V0X3RhYmxlX3NpemUobnVtX2ZsYWdzKT87CisgICAgICAgIGxldCBtdXQgaGVhZCA9IGhlYWRlci5pbnRvX2J5dGVzKCkubGVuKCk7CisgICAgICAgIGxldCBidWNrZXRzID0gKDAuLm51bV9idWNrZXRzKQorICAgICAgICAgICAgLm1hcCh8X3wgbWF0Y2ggcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKS51bndyYXAoKSB7CisgICAgICAgICAgICAgICAgMCA9PiBOb25lLAorICAgICAgICAgICAgICAgIHZhbCA9PiBTb21lKHZhbCksCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmNvbGxlY3QoKTsKKyAgICAgICAgbGV0IG5vZGVzID0gKDAuLm51bV9mbGFncykKKyAgICAgICAgICAgIC5tYXAofF98IHsKKyAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IEZsYWdUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJmJ5dGVzW2hlYWQuLl0pPzsKKyAgICAgICAgICAgICAgICBoZWFkICs9IG5vZGUuaW50b19ieXRlcygpLmxlbigpOworICAgICAgICAgICAgICAgIE9rKG5vZGUpCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPF8+LCBBY29uZmlnU3RvcmFnZUVycm9yPj4oKQorICAgICAgICAgICAgLm1hcF9lcnIofGVycm1zZ3wgeworICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoImZhaWwgdG8gcGFyc2UgZmxhZyB0YWJsZToge30iLCBlcnJtc2cpKQorICAgICAgICAgICAgfSk/OworCisgICAgICAgIGxldCB0YWJsZSA9IFNlbGYgeyBoZWFkZXIsIGJ1Y2tldHMsIG5vZGVzIH07CisgICAgICAgIE9rKHRhYmxlKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgY3JhdGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdGFibGU7CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHRhYmxlIHNlcmlhbGl6YXRpb24KKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb24oKSB7CisgICAgICAgIGxldCBmbGFnX3RhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpOworCisgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnVGFibGVIZWFkZXIgPSAmZmxhZ190YWJsZS5oZWFkZXI7CisgICAgICAgIGxldCByZWludGVycHJldGVkX2hlYWRlciA9IEZsYWdUYWJsZUhlYWRlcjo6ZnJvbV9ieXRlcygmaGVhZGVyLmludG9fYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF9oZWFkZXIuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoaGVhZGVyLCAmcmVpbnRlcnByZXRlZF9oZWFkZXIudW53cmFwKCkpOworCisgICAgICAgIGxldCBub2RlczogJlZlYzxGbGFnVGFibGVOb2RlPiA9ICZmbGFnX3RhYmxlLm5vZGVzOworICAgICAgICBmb3Igbm9kZSBpbiBub2Rlcy5pdGVyKCkgeworICAgICAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfbm9kZSA9IEZsYWdUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJm5vZGUuaW50b19ieXRlcygpKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZSwgJnJlaW50ZXJwcmV0ZWRfbm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgZmxhZ190YWJsZV9ieXRlcyA9IGZsYWdfdGFibGUuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF90YWJsZSA9IEZsYWdUYWJsZTo6ZnJvbV9ieXRlcygmZmxhZ190YWJsZV9ieXRlcyk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF90YWJsZS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmZmxhZ190YWJsZSwgJnJlaW50ZXJwcmV0ZWRfdGFibGUudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdGFibGVfYnl0ZXMubGVuKCkgYXMgdTMyLCBoZWFkZXIuZmlsZV9zaXplKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhhdCB2ZXJzaW9uIG51bWJlciBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiBzZXJpYWxpemVkCisgICAgLy8gYnl0ZXMKKyAgICBmbiB0ZXN0X3ZlcnNpb25fbnVtYmVyKCkgeworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gJmZsYWdfdGFibGUuaW50b19ieXRlcygpOworICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOworICAgICAgICBsZXQgdmVyc2lvbiA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEodmVyc2lvbiwgMSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZpbGUgdHlwZSBjaGVjaworICAgIGZuIHRlc3RfZmlsZV90eXBlX2NoZWNrKCkgeworICAgICAgICBsZXQgbXV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCk7CisgICAgICAgIGZsYWdfdGFibGUuaGVhZGVyLmZpbGVfdHlwZSA9IDEyM3U4OworICAgICAgICBsZXQgZXJyb3IgPSBGbGFnVGFibGU6OmZyb21fYnl0ZXMoJmZsYWdfdGFibGUuaW50b19ieXRlcygpKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgZm9ybWF0ISgiQnl0ZXNQYXJzZUZhaWwoYmluYXJ5IGZpbGUgaXMgbm90IGEgZmxhZyBtYXApIikKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3ZhbHVlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ192YWx1ZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDY5MjRiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ192YWx1ZS5ycwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vISBmbGFnIHZhbHVlIG1vZHVsZSBkZWZpbmVzIHRoZSBmbGFnIHZhbHVlIGZpbGUgZm9ybWF0IGFuZCBtZXRob2RzIGZvciBzZXJpYWxpemF0aW9uCisvLyEgYW5kIGRlc2VyaWFsaXphdGlvbgorCit1c2UgY3JhdGU6OntyZWFkX3N0cl9mcm9tX2J5dGVzLCByZWFkX3UzMl9mcm9tX2J5dGVzLCByZWFkX3U4X2Zyb21fYnl0ZXN9OwordXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlfTsKK3VzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBzdGQ6OmZtdDsKKworLy8vIEZsYWcgdmFsdWUgaGVhZGVyIHN0cnVjdAorI1tkZXJpdmUoUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgRmxhZ1ZhbHVlSGVhZGVyIHsKKyAgICBwdWIgdmVyc2lvbjogdTMyLAorICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKKyAgICBwdWIgZmlsZV90eXBlOiB1OCwKKyAgICBwdWIgZmlsZV9zaXplOiB1MzIsCisgICAgcHViIG51bV9mbGFnczogdTMyLAorICAgIHB1YiBib29sZWFuX3ZhbHVlX29mZnNldDogdTMyLAorfQorCisvLy8gSW1wbGVtZW50IGRlYnVnIHByaW50IHRyYWl0IGZvciBoZWFkZXIKK2ltcGwgZm10OjpEZWJ1ZyBmb3IgRmxhZ1ZhbHVlSGVhZGVyIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgZm10OjpGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGVsbiEoCisgICAgICAgICAgICBmLAorICAgICAgICAgICAgIlZlcnNpb246IHt9LCBDb250YWluZXI6IHt9LCBGaWxlIFR5cGU6IHs6P30sIEZpbGUgU2l6ZToge30iLAorICAgICAgICAgICAgc2VsZi52ZXJzaW9uLAorICAgICAgICAgICAgc2VsZi5jb250YWluZXIsCisgICAgICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OnRyeV9mcm9tKHNlbGYuZmlsZV90eXBlKSwKKyAgICAgICAgICAgIHNlbGYuZmlsZV9zaXplCisgICAgICAgICk/OworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiTnVtIG9mIEZsYWdzOiB7fSwgVmFsdWUgT2Zmc2V0Ont9IiwKKyAgICAgICAgICAgIHNlbGYubnVtX2ZsYWdzLCBzZWxmLmJvb2xlYW5fdmFsdWVfb2Zmc2V0CisgICAgICAgICk/OworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKK2ltcGwgRmxhZ1ZhbHVlSGVhZGVyIHsKKyAgICAvLy8gU2VyaWFsaXplIHRvIGJ5dGVzCisgICAgcHViIGZuIGludG9fYnl0ZXMoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgbXV0IHJlc3VsdCA9IFZlYzo6bmV3KCk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi52ZXJzaW9uLnRvX2xlX2J5dGVzKCkpOworICAgICAgICBsZXQgY29udGFpbmVyX2J5dGVzID0gc2VsZi5jb250YWluZXIuYXNfYnl0ZXMoKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCYoY29udGFpbmVyX2J5dGVzLmxlbigpIGFzIHUzMikudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZShjb250YWluZXJfYnl0ZXMpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuZmlsZV90eXBlLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuZmlsZV9zaXplLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYubnVtX2ZsYWdzLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuYm9vbGVhbl92YWx1ZV9vZmZzZXQudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdAorICAgIH0KKworICAgIC8vLyBEZXNlcmlhbGl6ZSBmcm9tIGJ5dGVzCisgICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOworICAgICAgICBsZXQgbGlzdCA9IFNlbGYgeworICAgICAgICAgICAgdmVyc2lvbjogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBjb250YWluZXI6IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV90eXBlOiByZWFkX3U4X2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV9zaXplOiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG51bV9mbGFnczogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBib29sZWFuX3ZhbHVlX29mZnNldDogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgIH07CisgICAgICAgIGlmIGxpc3QuZmlsZV90eXBlICE9IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCBhcyB1OCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoCisgICAgICAgICAgICAgICAgImJpbmFyeSBmaWxlIGlzIG5vdCBhIGZsYWcgdmFsdWUgZmlsZSIKKyAgICAgICAgICAgICkpKTsKKyAgICAgICAgfQorICAgICAgICBPayhsaXN0KQorICAgIH0KK30KKworLy8vIEZsYWcgdmFsdWUgbGlzdCBzdHJ1Y3QKKyNbZGVyaXZlKFBhcnRpYWxFcSldCitwdWIgc3RydWN0IEZsYWdWYWx1ZUxpc3QgeworICAgIHB1YiBoZWFkZXI6IEZsYWdWYWx1ZUhlYWRlciwKKyAgICBwdWIgYm9vbGVhbnM6IFZlYzxib29sPiwKK30KKworLy8vIEltcGxlbWVudCBkZWJ1ZyBwcmludCB0cmFpdCBmb3IgZmxhZyB2YWx1ZQoraW1wbCBmbXQ6OkRlYnVnIGZvciBGbGFnVmFsdWVMaXN0IHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgZm10OjpGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGVsbiEoZiwgIkhlYWRlcjoiKT87CisgICAgICAgIHdyaXRlIShmLCAiezo/fSIsIHNlbGYuaGVhZGVyKT87CisgICAgICAgIHdyaXRlbG4hKGYsICJWYWx1ZXM6Iik/OworICAgICAgICB3cml0ZWxuIShmLCAiezo/fSIsIHNlbGYuYm9vbGVhbnMpPzsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIEZsYWdWYWx1ZUxpc3QgeworICAgIC8vLyBTZXJpYWxpemUgdG8gYnl0ZXMKKyAgICBwdWIgZm4gaW50b19ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIFsKKyAgICAgICAgICAgIHNlbGYuaGVhZGVyLmludG9fYnl0ZXMoKSwKKyAgICAgICAgICAgIHNlbGYuYm9vbGVhbnMuaXRlcigpLm1hcCh8JnZ8IHU4Ojpmcm9tKHYpLnRvX2xlX2J5dGVzKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkuY29uY2F0KCksCisgICAgICAgIF0KKyAgICAgICAgLmNvbmNhdCgpCisgICAgfQorCisgICAgLy8vIERlc2VyaWFsaXplIGZyb20gYnl0ZXMKKyAgICBwdWIgZm4gZnJvbV9ieXRlcyhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIGxldCBoZWFkZXIgPSBGbGFnVmFsdWVIZWFkZXI6OmZyb21fYnl0ZXMoYnl0ZXMpPzsKKyAgICAgICAgbGV0IG51bV9mbGFncyA9IGhlYWRlci5udW1fZmxhZ3M7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IGhlYWRlci5pbnRvX2J5dGVzKCkubGVuKCk7CisgICAgICAgIGxldCBib29sZWFucyA9CisgICAgICAgICAgICAoMC4ubnVtX2ZsYWdzKS5tYXAofF98IHJlYWRfdThfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKS51bndyYXAoKSA9PSAxKS5jb2xsZWN0KCk7CisgICAgICAgIGxldCBsaXN0ID0gU2VsZiB7IGhlYWRlciwgYm9vbGVhbnMgfTsKKyAgICAgICAgT2sobGlzdCkKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3Q7CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHZhbHVlIGxpc3Qgc2VyaWFsaXphdGlvbgorICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbigpIHsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOworCisgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnVmFsdWVIZWFkZXIgPSAmZmxhZ192YWx1ZV9saXN0LmhlYWRlcjsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ1ZhbHVlSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2hlYWRlci5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShoZWFkZXIsICZyZWludGVycHJldGVkX2hlYWRlci51bndyYXAoKSk7CisKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfYnl0ZXMgPSBmbGFnX3ZhbHVlX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF92YWx1ZV9saXN0ID0gRmxhZ1ZhbHVlTGlzdDo6ZnJvbV9ieXRlcygmZmxhZ192YWx1ZV9ieXRlcyk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF92YWx1ZV9saXN0LmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZmbGFnX3ZhbHVlX2xpc3QsICZyZWludGVycHJldGVkX3ZhbHVlX2xpc3QudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdmFsdWVfYnl0ZXMubGVuKCkgYXMgdTMyLCBoZWFkZXIuZmlsZV9zaXplKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhhdCB2ZXJzaW9uIG51bWJlciBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiBzZXJpYWxpemVkCisgICAgLy8gYnl0ZXMKKyAgICBmbiB0ZXN0X3ZlcnNpb25fbnVtYmVyKCkgeworICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KCk7CisgICAgICAgIGxldCBieXRlcyA9ICZmbGFnX3ZhbHVlX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOworICAgICAgICBsZXQgdmVyc2lvbiA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEodmVyc2lvbiwgMSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZpbGUgdHlwZSBjaGVjaworICAgIGZuIHRlc3RfZmlsZV90eXBlX2NoZWNrKCkgeworICAgICAgICBsZXQgbXV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOworICAgICAgICBmbGFnX3ZhbHVlX2xpc3QuaGVhZGVyLmZpbGVfdHlwZSA9IDEyM3U4OworICAgICAgICBsZXQgZXJyb3IgPSBGbGFnVmFsdWVMaXN0Ojpmcm9tX2J5dGVzKCZmbGFnX3ZhbHVlX2xpc3QuaW50b19ieXRlcygpKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgZm9ybWF0ISgiQnl0ZXNQYXJzZUZhaWwoYmluYXJ5IGZpbGUgaXMgbm90IGEgZmxhZyB2YWx1ZSBmaWxlKSIpCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZTljMWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9saWIucnMKQEAgLTAsMCArMSw2NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYGFjb25maWdfc3RvcmFnZV9maWxlYCBpcyBhIGNyYXRlIHRoYXQgZGVmaW5lcyBhY29uZmlnIHN0b3JhZ2UgZmlsZSBmb3JtYXQsIGl0CisvLyEgYWxzbyBpbmNsdWRlcyBhcGlzIHRvIHJlYWQgZmxhZ3MgZnJvbSBzdG9yYWdlIGZpbGVzLiBJdCBwcm92aWRlcyB0aHJlZSBhcGlzIHRvCisvLyEgaW50ZXJmYWNlIHdpdGggc3RvcmFnZSBmaWxlczoKKy8vIQorLy8hIDEsIGZ1bmN0aW9uIHRvIGdldCBwYWNrYWdlIGZsYWcgdmFsdWUgc3RhcnQgb2Zmc2V0CisvLyEgcHViIGZuIGdldF9wYWNrYWdlX29mZnNldChjb250YWluZXI6ICZzdHIsIHBhY2thZ2U6ICZzdHIpIC0+IGBSZXN1bHQ8T3B0aW9uPFBhY2thZ2VPZmZzZXQ+Pj5gCisvLyEKKy8vISAyLCBmdW5jdGlvbiB0byBnZXQgZmxhZyBvZmZzZXQgd2l0aGluIGEgc3BlY2lmaWMgcGFja2FnZQorLy8hIHB1YiBmbiBnZXRfZmxhZ19vZmZzZXQoY29udGFpbmVyOiAmc3RyLCBwYWNrYWdlX2lkOiB1MzIsIGZsYWc6ICZzdHIpIC0+IGBSZXN1bHQ8T3B0aW9uPHUxNj4+PmAKKy8vIQorLy8hIDMsIGZ1bmN0aW9uIHRvIGdldCB0aGUgYWN0dWFsIGZsYWcgdmFsdWUgZ2l2ZW4gdGhlIGdsb2JhbCBvZmZzZXQgKGNvbWJpbmVkIHBhY2thZ2UgYW5kCisvLyEgZmxhZyBvZmZzZXQpLgorLy8hIHB1YiBmbiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKGNvbnRhaW5lcjogJnN0ciwgb2Zmc2V0OiB1MzIpIC0+IGBSZXN1bHQ8Ym9vbD5gCisvLyEKKy8vISBOb3RlIHRoZXNlIGFyZSBsb3cgbGV2ZWwgYXBpcyB0aGF0IGFyZSBleHBlY3RlZCB0byBiZSBvbmx5IHVzZWQgaW4gYXV0byBnZW5lcmF0ZWQgZmxhZworLy8hIGFwaXMuIERPIE5PVCBESVJFQ1RMWSBVU0UgVEhFU0UgQVBJUyBJTiBZT1VSIFNPVVJDRSBDT0RFLiBGb3IgYXV0byBnZW5lcmF0ZWQgZmxhZyBhcGlzCisvLyEgcGxlYXNlIHJlZmVyIHRvIHRoZSBnM2RvYyBnby9hbmRyb2lkLWZsYWdzCisKK3B1YiBtb2QgZmxhZ19pbmZvOworcHViIG1vZCBmbGFnX3RhYmxlOworcHViIG1vZCBmbGFnX3ZhbHVlOworcHViIG1vZCBwYWNrYWdlX3RhYmxlOworcHViIG1vZCBwcm90b3M7CitwdWIgbW9kIHRlc3RfdXRpbHM7CisKK3VzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBzdGQ6OmNtcDo6T3JkZXJpbmc7Cit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6aGFzaF9tYXA6OkRlZmF1bHRIYXNoZXI7Cit1c2Ugc3RkOjpmczo6RmlsZTsKK3VzZSBzdGQ6Omhhc2g6OntIYXNoLCBIYXNoZXJ9OwordXNlIHN0ZDo6aW86OlJlYWQ7CisKK3B1YiB1c2UgY3JhdGU6OmZsYWdfaW5mbzo6e0ZsYWdJbmZvQml0LCBGbGFnSW5mb0hlYWRlciwgRmxhZ0luZm9MaXN0LCBGbGFnSW5mb05vZGV9OworcHViIHVzZSBjcmF0ZTo6ZmxhZ190YWJsZTo6e0ZsYWdUYWJsZSwgRmxhZ1RhYmxlSGVhZGVyLCBGbGFnVGFibGVOb2RlfTsKK3B1YiB1c2UgY3JhdGU6OmZsYWdfdmFsdWU6OntGbGFnVmFsdWVIZWFkZXIsIEZsYWdWYWx1ZUxpc3R9OworcHViIHVzZSBjcmF0ZTo6cGFja2FnZV90YWJsZTo6e1BhY2thZ2VUYWJsZSwgUGFja2FnZVRhYmxlSGVhZGVyLCBQYWNrYWdlVGFibGVOb2RlfTsKKwordXNlIGNyYXRlOjpBY29uZmlnU3RvcmFnZUVycm9yOjp7CisgICAgQnl0ZXNQYXJzZUZhaWwsIEhhc2hUYWJsZVNpemVMaW1pdCwgSW52YWxpZEZsYWdWYWx1ZVR5cGUsIEludmFsaWRTdG9yZWRGbGFnVHlwZSwKK307CisKKy8vLyBTdG9yYWdlIGZpbGUgdmVyc2lvbgorcHViIGNvbnN0IEZJTEVfVkVSU0lPTjogdTMyID0gMTsKKworLy8vIEdvb2QgaGFzaCB0YWJsZSBwcmltZSBudW1iZXIKK3B1YihjcmF0ZSkgY29uc3QgSEFTSF9QUklNRVM6IFt1MzI7IDI5XSA9IFsKKyAgICA3LCAxNywgMjksIDUzLCA5NywgMTkzLCAzODksIDc2OSwgMTU0MywgMzA3OSwgNjE1MSwgMTIyODksIDI0NTkzLCA0OTE1NywgOTgzMTcsIDE5NjYxMywgMzkzMjQxLAorICAgIDc4NjQzMywgMTU3Mjg2OSwgMzE0NTczOSwgNjI5MTQ2OSwgMTI1ODI5MTcsIDI1MTY1ODQzLCA1MDMzMTY1MywgMTAwNjYzMzE5LCAyMDEzMjY2MTEsCisgICAgNDAyNjUzMTg5LCA4MDUzMDY0NTcsIDE2MTA2MTI3NDEsCitdOworCisvLy8gU3RvcmFnZSBmaWxlIHR5cGUgZW51bQorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBQYXJ0aWFsRXEsIEVxKV0KK3B1YiBlbnVtIFN0b3JhZ2VGaWxlVHlwZSB7CisgICAgUGFja2FnZU1hcCA9IDAsCisgICAgRmxhZ01hcCA9IDEsCisgICAgRmxhZ1ZhbCA9IDIsCisgICAgRmxhZ0luZm8gPSAzLAorfQorCitpbXBsIFRyeUZyb208JnN0cj4gZm9yIFN0b3JhZ2VGaWxlVHlwZSB7CisgICAgdHlwZSBFcnJvciA9IGFueWhvdzo6RXJyb3I7CisKKyAgICBmbiB0cnlfZnJvbSh2YWx1ZTogJnN0cikgLT4gc3RkOjpyZXN1bHQ6OlJlc3VsdDxTZWxmLCBTZWxmOjpFcnJvcj4geworICAgICAgICBtYXRjaCB2YWx1ZSB7CisgICAgICAgICAgICAicGFja2FnZV9tYXAiID0+IE9rKFNlbGY6OlBhY2thZ2VNYXApLAorICAgICAgICAgICAgImZsYWdfbWFwIiA9PiBPayhTZWxmOjpGbGFnTWFwKSwKKyAgICAgICAgICAgICJmbGFnX3ZhbCIgPT4gT2soU2VsZjo6RmxhZ1ZhbCksCisgICAgICAgICAgICAiZmxhZ19pbmZvIiA9PiBPayhTZWxmOjpGbGFnSW5mbyksCisgICAgICAgICAgICBfID0+IEVycihhbnlob3chKAorICAgICAgICAgICAgICAgICJJbnZhbGlkIHN0b3JhZ2UgZmlsZSB0eXBlLCB2YWxpZCB0eXBlcyBhcmUgcGFja2FnZV9tYXB8ZmxhZ19tYXB8ZmxhZ192YWx8ZmxhZ19pbmZvIgorICAgICAgICAgICAgKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTx1OD4gZm9yIFN0b3JhZ2VGaWxlVHlwZSB7CisgICAgdHlwZSBFcnJvciA9IGFueWhvdzo6RXJyb3I7CisKKyAgICBmbiB0cnlfZnJvbSh2YWx1ZTogdTgpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnJvcj4geworICAgICAgICBtYXRjaCB2YWx1ZSB7CisgICAgICAgICAgICB4IGlmIHggPT0gU2VsZjo6UGFja2FnZU1hcCBhcyB1OCA9PiBPayhTZWxmOjpQYWNrYWdlTWFwKSwKKyAgICAgICAgICAgIHggaWYgeCA9PSBTZWxmOjpGbGFnTWFwIGFzIHU4ID0+IE9rKFNlbGY6OkZsYWdNYXApLAorICAgICAgICAgICAgeCBpZiB4ID09IFNlbGY6OkZsYWdWYWwgYXMgdTggPT4gT2soU2VsZjo6RmxhZ1ZhbCksCisgICAgICAgICAgICB4IGlmIHggPT0gU2VsZjo6RmxhZ0luZm8gYXMgdTggPT4gT2soU2VsZjo6RmxhZ0luZm8pLAorICAgICAgICAgICAgXyA9PiBFcnIoYW55aG93ISgiSW52YWxpZCBzdG9yYWdlIGZpbGUgdHlwZSIpKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIEZsYWcgdHlwZSBlbnVtIGFzIHN0b3JlZCBieSBzdG9yYWdlIGZpbGUKKy8vLyBPTkxZIEFQUEVORCwgTkVWRVIgUkVNT1ZFIEZPUiBCQUNLV0FSRCBDT01QQVRJQklMSVRZLiBUSEUgTUFYIElTIFUxNi4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgUGFydGlhbEVxLCBFcSldCitwdWIgZW51bSBTdG9yZWRGbGFnVHlwZSB7CisgICAgUmVhZFdyaXRlQm9vbGVhbiA9IDAsCisgICAgUmVhZE9ubHlCb29sZWFuID0gMSwKKyAgICBGaXhlZFJlYWRPbmx5Qm9vbGVhbiA9IDIsCit9CisKK2ltcGwgVHJ5RnJvbTx1MTY+IGZvciBTdG9yZWRGbGFnVHlwZSB7CisgICAgdHlwZSBFcnJvciA9IEFjb25maWdTdG9yYWdlRXJyb3I7CisKKyAgICBmbiB0cnlfZnJvbSh2YWx1ZTogdTE2KSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyb3I+IHsKKyAgICAgICAgbWF0Y2ggdmFsdWUgeworICAgICAgICAgICAgeCBpZiB4ID09IFNlbGY6OlJlYWRXcml0ZUJvb2xlYW4gYXMgdTE2ID0+IE9rKFNlbGY6OlJlYWRXcml0ZUJvb2xlYW4pLAorICAgICAgICAgICAgeCBpZiB4ID09IFNlbGY6OlJlYWRPbmx5Qm9vbGVhbiBhcyB1MTYgPT4gT2soU2VsZjo6UmVhZE9ubHlCb29sZWFuKSwKKyAgICAgICAgICAgIHggaWYgeCA9PSBTZWxmOjpGaXhlZFJlYWRPbmx5Qm9vbGVhbiBhcyB1MTYgPT4gT2soU2VsZjo6Rml4ZWRSZWFkT25seUJvb2xlYW4pLAorICAgICAgICAgICAgXyA9PiBFcnIoSW52YWxpZFN0b3JlZEZsYWdUeXBlKGFueWhvdyEoIkludmFsaWQgc3RvcmVkIGZsYWcgdHlwZSIpKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBGbGFnIHZhbHVlIHR5cGUgZW51bSwgb25lIEZsYWdWYWx1ZVR5cGUgbWFwcyB0byBtYW55IFN0b3JlZEZsYWdUeXBlCisvLy8gT05MWSBBUFBFTkQsIE5FVkVSIFJFTU9WRSBGT1IgQkFDS1dBUkQgQ09NUEFUSUJJTElUWS4gVEhFIE1BWCBJUyBVMTYKKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgUGFydGlhbEVxLCBFcSldCitwdWIgZW51bSBGbGFnVmFsdWVUeXBlIHsKKyAgICBCb29sZWFuID0gMCwKK30KKworaW1wbCBUcnlGcm9tPFN0b3JlZEZsYWdUeXBlPiBmb3IgRmxhZ1ZhbHVlVHlwZSB7CisgICAgdHlwZSBFcnJvciA9IEFjb25maWdTdG9yYWdlRXJyb3I7CisKKyAgICBmbiB0cnlfZnJvbSh2YWx1ZTogU3RvcmVkRmxhZ1R5cGUpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnJvcj4geworICAgICAgICBtYXRjaCB2YWx1ZSB7CisgICAgICAgICAgICBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiA9PiBPayhTZWxmOjpCb29sZWFuKSwKKyAgICAgICAgICAgIFN0b3JlZEZsYWdUeXBlOjpSZWFkT25seUJvb2xlYW4gPT4gT2soU2VsZjo6Qm9vbGVhbiksCisgICAgICAgICAgICBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4gPT4gT2soU2VsZjo6Qm9vbGVhbiksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTx1MTY+IGZvciBGbGFnVmFsdWVUeXBlIHsKKyAgICB0eXBlIEVycm9yID0gQWNvbmZpZ1N0b3JhZ2VFcnJvcjsKKworICAgIGZuIHRyeV9mcm9tKHZhbHVlOiB1MTYpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnJvcj4geworICAgICAgICBtYXRjaCB2YWx1ZSB7CisgICAgICAgICAgICB4IGlmIHggPT0gU2VsZjo6Qm9vbGVhbiBhcyB1MTYgPT4gT2soU2VsZjo6Qm9vbGVhbiksCisgICAgICAgICAgICBfID0+IEVycihJbnZhbGlkRmxhZ1ZhbHVlVHlwZShhbnlob3chKCJJbnZhbGlkIGZsYWcgdmFsdWUgdHlwZSIpKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBTdG9yYWdlIHF1ZXJ5IGFwaSBlcnJvcgorI1tub25fZXhoYXVzdGl2ZV0KKyNbZGVyaXZlKHRoaXNlcnJvcjo6RXJyb3IsIERlYnVnKV0KK3B1YiBlbnVtIEFjb25maWdTdG9yYWdlRXJyb3IgeworICAgICNbZXJyb3IoImZhaWxlZCB0byByZWFkIHRoZSBmaWxlIildCisgICAgRmlsZVJlYWRGYWlsKCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKKworICAgICNbZXJyb3IoImZhaWwgdG8gcGFyc2UgcHJvdG9idWYiKV0KKyAgICBQcm90b2J1ZlBhcnNlRmFpbCgjW3NvdXJjZV0gYW55aG93OjpFcnJvciksCisKKyAgICAjW2Vycm9yKCJzdG9yYWdlIGZpbGVzIG5vdCBmb3VuZCBmb3IgdGhpcyBjb250YWluZXIiKV0KKyAgICBTdG9yYWdlRmlsZU5vdEZvdW5kKCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKKworICAgICNbZXJyb3IoImZhaWwgdG8gbWFwIHN0b3JhZ2UgZmlsZSIpXQorICAgIE1hcEZpbGVGYWlsKCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKKworICAgICNbZXJyb3IoImZhaWwgdG8gZ2V0IG1hcHBlZCBmaWxlIildCisgICAgT2J0YWluTWFwcGVkRmlsZUZhaWwoI1tzb3VyY2VdIGFueWhvdzo6RXJyb3IpLAorCisgICAgI1tlcnJvcigiZmFpbCB0byBmbHVzaCBtYXBwZWQgc3RvcmFnZSBmaWxlIildCisgICAgTWFwRmx1c2hGYWlsKCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKKworICAgICNbZXJyb3IoIm51bWJlciBvZiBpdGVtcyBpbiBoYXNoIHRhYmxlIGV4Y2VlZCBsaW1pdCIpXQorICAgIEhhc2hUYWJsZVNpemVMaW1pdCgjW3NvdXJjZV0gYW55aG93OjpFcnJvciksCisKKyAgICAjW2Vycm9yKCJmYWlsZWQgdG8gcGFyc2UgYnl0ZXMgaW50byBkYXRhIildCisgICAgQnl0ZXNQYXJzZUZhaWwoI1tzb3VyY2VdIGFueWhvdzo6RXJyb3IpLAorCisgICAgI1tlcnJvcigiY2Fubm90IHBhcnNlIHN0b3JhZ2UgZmlsZXMgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIildCisgICAgSGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKKworICAgICNbZXJyb3IoImludmFsaWQgc3RvcmFnZSBmaWxlIGJ5dGUgb2Zmc2V0IildCisgICAgSW52YWxpZFN0b3JhZ2VGaWxlT2Zmc2V0KCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKKworICAgICNbZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgZmlsZSIpXQorICAgIEZpbGVDcmVhdGlvbkZhaWwoI1tzb3VyY2VdIGFueWhvdzo6RXJyb3IpLAorCisgICAgI1tlcnJvcigiaW52YWxpZCBzdG9yZWQgZmxhZyB0eXBlIildCisgICAgSW52YWxpZFN0b3JlZEZsYWdUeXBlKCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKKworICAgICNbZXJyb3IoImludmFsaWQgZmxhZyB2YWx1ZSB0eXBlIildCisgICAgSW52YWxpZEZsYWdWYWx1ZVR5cGUoI1tzb3VyY2VdIGFueWhvdzo6RXJyb3IpLAorfQorCisvLy8gR2V0IHRoZSByaWdodCBoYXNoIHRhYmxlIHNpemUgZ2l2ZW4gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlLiBVc2UgYQorLy8vIGxvYWQgZmFjdG9yIG9mIDAuNSBmb3IgcGVyZm9ybWFuY2UuCitwdWIgZm4gZ2V0X3RhYmxlX3NpemUoZW50cmllczogdTMyKSAtPiBSZXN1bHQ8dTMyLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgSEFTSF9QUklNRVMKKyAgICAgICAgLml0ZXIoKQorICAgICAgICAuZmluZCh8JiZudW18IG51bSA+PSAyICogZW50cmllcykKKyAgICAgICAgLmNvcGllZCgpCisgICAgICAgIC5va19vcihIYXNoVGFibGVTaXplTGltaXQoYW55aG93ISgiTnVtYmVyIG9mIGl0ZW1zIGluIGEgaGFzaCB0YWJsZSBleGNlZWRzIGxpbWl0IikpKQorfQorCisvLy8gR2V0IHRoZSBjb3JyZXNwb25kaW5nIGJ1Y2tldCBpbmRleCBnaXZlbiB0aGUga2V5IGFuZCBudW1iZXIgb2YgYnVja2V0cworcHViKGNyYXRlKSBmbiBnZXRfYnVja2V0X2luZGV4PFQ6IEhhc2g+KHZhbDogJlQsIG51bV9idWNrZXRzOiB1MzIpIC0+IHUzMiB7CisgICAgbGV0IG11dCBzID0gRGVmYXVsdEhhc2hlcjo6bmV3KCk7CisgICAgdmFsLmhhc2goJm11dCBzKTsKKyAgICAocy5maW5pc2goKSAlIG51bV9idWNrZXRzIGFzIHU2NCkgYXMgdTMyCit9CisKKy8vLyBSZWFkIGFuZCBwYXJzZSBieXRlcyBhcyB1OAorcHViIGZuIHJlYWRfdThfZnJvbV9ieXRlcyhidWY6ICZbdThdLCBoZWFkOiAmbXV0IHVzaXplKSAtPiBSZXN1bHQ8dTgsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgdmFsID0KKyAgICAgICAgdTg6OmZyb21fbGVfYnl0ZXMoYnVmWypoZWFkLi4qaGVhZCArIDFdLnRyeV9pbnRvKCkubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgICAgICBCeXRlc1BhcnNlRmFpbChhbnlob3chKCJmYWlsIHRvIHBhcnNlIHU4IGZyb20gYnl0ZXM6IHt9IiwgZXJybXNnKSkKKyAgICAgICAgfSk/KTsKKyAgICAqaGVhZCArPSAxOworICAgIE9rKHZhbCkKK30KKworLy8vIFJlYWQgYW5kIHBhcnNlIGJ5dGVzIGFzIHUxNgorcHViKGNyYXRlKSBmbiByZWFkX3UxNl9mcm9tX2J5dGVzKAorICAgIGJ1ZjogJlt1OF0sCisgICAgaGVhZDogJm11dCB1c2l6ZSwKKykgLT4gUmVzdWx0PHUxNiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCB2YWwgPQorICAgICAgICB1MTY6OmZyb21fbGVfYnl0ZXMoYnVmWypoZWFkLi4qaGVhZCArIDJdLnRyeV9pbnRvKCkubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgICAgICBCeXRlc1BhcnNlRmFpbChhbnlob3chKCJmYWlsIHRvIHBhcnNlIHUxNiBmcm9tIGJ5dGVzOiB7fSIsIGVycm1zZykpCisgICAgICAgIH0pPyk7CisgICAgKmhlYWQgKz0gMjsKKyAgICBPayh2YWwpCit9CisKKy8vLyBSZWFkIGFuZCBwYXJzZSBieXRlcyBhcyB1MzIKK3B1YiBmbiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ1ZjogJlt1OF0sIGhlYWQ6ICZtdXQgdXNpemUpIC0+IFJlc3VsdDx1MzIsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgdmFsID0KKyAgICAgICAgdTMyOjpmcm9tX2xlX2J5dGVzKGJ1ZlsqaGVhZC4uKmhlYWQgKyA0XS50cnlfaW50bygpLm1hcF9lcnIofGVycm1zZ3wgeworICAgICAgICAgICAgQnl0ZXNQYXJzZUZhaWwoYW55aG93ISgiZmFpbCB0byBwYXJzZSB1MzIgZnJvbSBieXRlczoge30iLCBlcnJtc2cpKQorICAgICAgICB9KT8pOworICAgICpoZWFkICs9IDQ7CisgICAgT2sodmFsKQorfQorCisvLy8gUmVhZCBhbmQgcGFyc2UgYnl0ZXMgYXMgc3RyaW5nCitwdWIoY3JhdGUpIGZuIHJlYWRfc3RyX2Zyb21fYnl0ZXMoCisgICAgYnVmOiAmW3U4XSwKKyAgICBoZWFkOiAmbXV0IHVzaXplLAorKSAtPiBSZXN1bHQ8U3RyaW5nLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IG51bV9ieXRlcyA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnVmLCBoZWFkKT8gYXMgdXNpemU7CisgICAgbGV0IHZhbCA9IFN0cmluZzo6ZnJvbV91dGY4KGJ1ZlsqaGVhZC4uKmhlYWQgKyBudW1fYnl0ZXNdLnRvX3ZlYygpKQorICAgICAgICAubWFwX2Vycih8ZXJybXNnfCBCeXRlc1BhcnNlRmFpbChhbnlob3chKCJmYWlsIHRvIHBhcnNlIHN0cmluZyBmcm9tIGJ5dGVzOiB7fSIsIGVycm1zZykpKT87CisgICAgKmhlYWQgKz0gbnVtX2J5dGVzOworICAgIE9rKHZhbCkKK30KKworLy8vIFJlYWQgaW4gc3RvcmFnZSBmaWxlIGFzIGJ5dGVzCitwdWIgZm4gcmVhZF9maWxlX3RvX2J5dGVzKGZpbGVfcGF0aDogJnN0cikgLT4gUmVzdWx0PFZlYzx1OD4sIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgbXV0IGZpbGUgPSBGaWxlOjpvcGVuKGZpbGVfcGF0aCkubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVSZWFkRmFpbChhbnlob3chKCJGYWlsZWQgdG8gb3BlbiBmaWxlIHt9OiB7fSIsIGZpbGVfcGF0aCwgZXJybXNnKSkKKyAgICB9KT87CisgICAgbGV0IG11dCBidWZmZXIgPSBWZWM6Om5ldygpOworICAgIGZpbGUucmVhZF90b19lbmQoJm11dCBidWZmZXIpLm1hcF9lcnIofGVycm1zZ3wgeworICAgICAgICBBY29uZmlnU3RvcmFnZUVycm9yOjpGaWxlUmVhZEZhaWwoYW55aG93ISgKKyAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBieXRlcyBmcm9tIGZpbGUge306IHt9IiwKKyAgICAgICAgICAgIGZpbGVfcGF0aCwKKyAgICAgICAgICAgIGVycm1zZworICAgICAgICApKQorICAgIH0pPzsKKyAgICBPayhidWZmZXIpCit9CisKKy8vLyBGbGFnIHZhbHVlIHN1bW1hcnkKKyNbZGVyaXZlKERlYnVnLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBGbGFnVmFsdWVTdW1tYXJ5IHsKKyAgICBwdWIgcGFja2FnZV9uYW1lOiBTdHJpbmcsCisgICAgcHViIGZsYWdfbmFtZTogU3RyaW5nLAorICAgIHB1YiBmbGFnX3ZhbHVlOiBTdHJpbmcsCisgICAgcHViIHZhbHVlX3R5cGU6IFN0b3JlZEZsYWdUeXBlLAorfQorCisvLy8gTGlzdCBmbGFnIHZhbHVlcyBmcm9tIHN0b3JhZ2UgZmlsZXMKK3B1YiBmbiBsaXN0X2ZsYWdzKAorICAgIHBhY2thZ2VfbWFwOiAmc3RyLAorICAgIGZsYWdfbWFwOiAmc3RyLAorICAgIGZsYWdfdmFsOiAmc3RyLAorKSAtPiBSZXN1bHQ8VmVjPEZsYWdWYWx1ZVN1bW1hcnk+LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBQYWNrYWdlVGFibGU6OmZyb21fYnl0ZXMoJnJlYWRfZmlsZV90b19ieXRlcyhwYWNrYWdlX21hcCk/KT87CisgICAgbGV0IGZsYWdfdGFibGUgPSBGbGFnVGFibGU6OmZyb21fYnl0ZXMoJnJlYWRfZmlsZV90b19ieXRlcyhmbGFnX21hcCk/KT87CisgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IEZsYWdWYWx1ZUxpc3Q6OmZyb21fYnl0ZXMoJnJlYWRfZmlsZV90b19ieXRlcyhmbGFnX3ZhbCk/KT87CisKKyAgICBsZXQgbXV0IHBhY2thZ2VfaW5mbyA9IHZlYyFbKCIiLCAwKTsgcGFja2FnZV90YWJsZS5oZWFkZXIubnVtX3BhY2thZ2VzIGFzIHVzaXplXTsKKyAgICBmb3Igbm9kZSBpbiBwYWNrYWdlX3RhYmxlLm5vZGVzLml0ZXIoKSB7CisgICAgICAgIHBhY2thZ2VfaW5mb1tub2RlLnBhY2thZ2VfaWQgYXMgdXNpemVdID0gKCZub2RlLnBhY2thZ2VfbmFtZSwgbm9kZS5ib29sZWFuX3N0YXJ0X2luZGV4KTsKKyAgICB9CisKKyAgICBsZXQgbXV0IGZsYWdzID0gVmVjOjpuZXcoKTsKKyAgICBmb3Igbm9kZSBpbiBmbGFnX3RhYmxlLm5vZGVzLml0ZXIoKSB7CisgICAgICAgIGxldCAocGFja2FnZV9uYW1lLCBib29sZWFuX3N0YXJ0X2luZGV4KSA9IHBhY2thZ2VfaW5mb1tub2RlLnBhY2thZ2VfaWQgYXMgdXNpemVdOworICAgICAgICBsZXQgZmxhZ19pbmRleCA9IGJvb2xlYW5fc3RhcnRfaW5kZXggKyBub2RlLmZsYWdfaW5kZXggYXMgdTMyOworICAgICAgICBsZXQgZmxhZ192YWx1ZSA9IGZsYWdfdmFsdWVfbGlzdC5ib29sZWFuc1tmbGFnX2luZGV4IGFzIHVzaXplXTsKKyAgICAgICAgZmxhZ3MucHVzaChGbGFnVmFsdWVTdW1tYXJ5IHsKKyAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKHBhY2thZ2VfbmFtZSksCisgICAgICAgICAgICBmbGFnX25hbWU6IG5vZGUuZmxhZ19uYW1lLmNsb25lKCksCisgICAgICAgICAgICBmbGFnX3ZhbHVlOiBmbGFnX3ZhbHVlLnRvX3N0cmluZygpLAorICAgICAgICAgICAgdmFsdWVfdHlwZTogbm9kZS5mbGFnX3R5cGUsCisgICAgICAgIH0pOworICAgIH0KKworICAgIGZsYWdzLnNvcnRfYnkofHYxLCB2MnwgbWF0Y2ggdjEucGFja2FnZV9uYW1lLmNtcCgmdjIucGFja2FnZV9uYW1lKSB7CisgICAgICAgIE9yZGVyaW5nOjpFcXVhbCA9PiB2MS5mbGFnX25hbWUuY21wKCZ2Mi5mbGFnX25hbWUpLAorICAgICAgICBvdGhlciA9PiBvdGhlciwKKyAgICB9KTsKKyAgICBPayhmbGFncykKK30KKworLy8vIEZsYWcgdmFsdWUgYW5kIGluZm8gc3VtbWFyeQorI1tkZXJpdmUoRGVidWcsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5IHsKKyAgICBwdWIgcGFja2FnZV9uYW1lOiBTdHJpbmcsCisgICAgcHViIGZsYWdfbmFtZTogU3RyaW5nLAorICAgIHB1YiBmbGFnX3ZhbHVlOiBTdHJpbmcsCisgICAgcHViIHZhbHVlX3R5cGU6IFN0b3JlZEZsYWdUeXBlLAorICAgIHB1YiBpc19yZWFkd3JpdGU6IGJvb2wsCisgICAgcHViIGhhc19zZXJ2ZXJfb3ZlcnJpZGU6IGJvb2wsCisgICAgcHViIGhhc19sb2NhbF9vdmVycmlkZTogYm9vbCwKK30KKworLy8vIExpc3QgZmxhZyB2YWx1ZXMgYW5kIGluZm8gZnJvbSBzdG9yYWdlIGZpbGVzCitwdWIgZm4gbGlzdF9mbGFnc193aXRoX2luZm8oCisgICAgcGFja2FnZV9tYXA6ICZzdHIsCisgICAgZmxhZ19tYXA6ICZzdHIsCisgICAgZmxhZ192YWw6ICZzdHIsCisgICAgZmxhZ19pbmZvOiAmc3RyLAorKSAtPiBSZXN1bHQ8VmVjPEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBwYWNrYWdlX3RhYmxlID0gUGFja2FnZVRhYmxlOjpmcm9tX2J5dGVzKCZyZWFkX2ZpbGVfdG9fYnl0ZXMocGFja2FnZV9tYXApPyk/OworICAgIGxldCBmbGFnX3RhYmxlID0gRmxhZ1RhYmxlOjpmcm9tX2J5dGVzKCZyZWFkX2ZpbGVfdG9fYnl0ZXMoZmxhZ19tYXApPyk/OworICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBGbGFnVmFsdWVMaXN0Ojpmcm9tX2J5dGVzKCZyZWFkX2ZpbGVfdG9fYnl0ZXMoZmxhZ192YWwpPyk/OworICAgIGxldCBmbGFnX2luZm8gPSBGbGFnSW5mb0xpc3Q6OmZyb21fYnl0ZXMoJnJlYWRfZmlsZV90b19ieXRlcyhmbGFnX2luZm8pPyk/OworCisgICAgbGV0IG11dCBwYWNrYWdlX2luZm8gPSB2ZWMhWygiIiwgMCk7IHBhY2thZ2VfdGFibGUuaGVhZGVyLm51bV9wYWNrYWdlcyBhcyB1c2l6ZV07CisgICAgZm9yIG5vZGUgaW4gcGFja2FnZV90YWJsZS5ub2Rlcy5pdGVyKCkgeworICAgICAgICBwYWNrYWdlX2luZm9bbm9kZS5wYWNrYWdlX2lkIGFzIHVzaXplXSA9ICgmbm9kZS5wYWNrYWdlX25hbWUsIG5vZGUuYm9vbGVhbl9zdGFydF9pbmRleCk7CisgICAgfQorCisgICAgbGV0IG11dCBmbGFncyA9IFZlYzo6bmV3KCk7CisgICAgZm9yIG5vZGUgaW4gZmxhZ190YWJsZS5ub2Rlcy5pdGVyKCkgeworICAgICAgICBsZXQgKHBhY2thZ2VfbmFtZSwgYm9vbGVhbl9zdGFydF9pbmRleCkgPSBwYWNrYWdlX2luZm9bbm9kZS5wYWNrYWdlX2lkIGFzIHVzaXplXTsKKyAgICAgICAgbGV0IGZsYWdfaW5kZXggPSBib29sZWFuX3N0YXJ0X2luZGV4ICsgbm9kZS5mbGFnX2luZGV4IGFzIHUzMjsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWUgPSBmbGFnX3ZhbHVlX2xpc3QuYm9vbGVhbnNbZmxhZ19pbmRleCBhcyB1c2l6ZV07CisgICAgICAgIGxldCBmbGFnX2F0dHJpYnV0ZSA9IGZsYWdfaW5mby5ub2Rlc1tmbGFnX2luZGV4IGFzIHVzaXplXS5hdHRyaWJ1dGVzOworICAgICAgICBmbGFncy5wdXNoKEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5IHsKKyAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKHBhY2thZ2VfbmFtZSksCisgICAgICAgICAgICBmbGFnX25hbWU6IG5vZGUuZmxhZ19uYW1lLmNsb25lKCksCisgICAgICAgICAgICBmbGFnX3ZhbHVlOiBmbGFnX3ZhbHVlLnRvX3N0cmluZygpLAorICAgICAgICAgICAgdmFsdWVfdHlwZTogbm9kZS5mbGFnX3R5cGUsCisgICAgICAgICAgICBpc19yZWFkd3JpdGU6IGZsYWdfYXR0cmlidXRlICYgKEZsYWdJbmZvQml0OjpJc1JlYWRXcml0ZSBhcyB1OCkgIT0gMCwKKyAgICAgICAgICAgIGhhc19zZXJ2ZXJfb3ZlcnJpZGU6IGZsYWdfYXR0cmlidXRlICYgKEZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSBhcyB1OCkgIT0gMCwKKyAgICAgICAgICAgIGhhc19sb2NhbF9vdmVycmlkZTogZmxhZ19hdHRyaWJ1dGUgJiAoRmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUgYXMgdTgpICE9IDAsCisgICAgICAgIH0pOworICAgIH0KKworICAgIGZsYWdzLnNvcnRfYnkofHYxLCB2MnwgbWF0Y2ggdjEucGFja2FnZV9uYW1lLmNtcCgmdjIucGFja2FnZV9uYW1lKSB7CisgICAgICAgIE9yZGVyaW5nOjpFcXVhbCA9PiB2MS5mbGFnX25hbWUuY21wKCZ2Mi5mbGFnX25hbWUpLAorICAgICAgICBvdGhlciA9PiBvdGhlciwKKyAgICB9KTsKKyAgICBPayhmbGFncykKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCisvLyBDQyBJTlRFUkxPUAorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCisKKy8vIEV4cG9ydGVkIHJ1c3QgZGF0YSBzdHJ1Y3R1cmUgYW5kIG1ldGhvZHMsIGMrKyBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkCisjW2N4eDo6YnJpZGdlXQorbW9kIGZmaSB7CisgICAgLy8vIGZsYWcgdmFsdWUgc3VtbWFyeSBjeHggcmV0dXJuCisgICAgcHViIHN0cnVjdCBGbGFnVmFsdWVTdW1tYXJ5Q1hYIHsKKyAgICAgICAgcHViIHBhY2thZ2VfbmFtZTogU3RyaW5nLAorICAgICAgICBwdWIgZmxhZ19uYW1lOiBTdHJpbmcsCisgICAgICAgIHB1YiBmbGFnX3ZhbHVlOiBTdHJpbmcsCisgICAgICAgIHB1YiB2YWx1ZV90eXBlOiBTdHJpbmcsCisgICAgfQorCisgICAgLy8vIGZsYWcgdmFsdWUgYW5kIGluZm8gc3VtbWFyeSBjeHggcmV0dXJuCisgICAgcHViIHN0cnVjdCBGbGFnVmFsdWVBbmRJbmZvU3VtbWFyeUNYWCB7CisgICAgICAgIHB1YiBwYWNrYWdlX25hbWU6IFN0cmluZywKKyAgICAgICAgcHViIGZsYWdfbmFtZTogU3RyaW5nLAorICAgICAgICBwdWIgZmxhZ192YWx1ZTogU3RyaW5nLAorICAgICAgICBwdWIgdmFsdWVfdHlwZTogU3RyaW5nLAorICAgICAgICBwdWIgaXNfcmVhZHdyaXRlOiBib29sLAorICAgICAgICBwdWIgaGFzX3NlcnZlcl9vdmVycmlkZTogYm9vbCwKKyAgICAgICAgcHViIGhhc19sb2NhbF9vdmVycmlkZTogYm9vbCwKKyAgICB9CisKKyAgICAvLy8gbGlzdCBmbGFnIHJlc3VsdCBjeHggcmV0dXJuCisgICAgcHViIHN0cnVjdCBMaXN0RmxhZ1ZhbHVlUmVzdWx0Q1hYIHsKKyAgICAgICAgcHViIHF1ZXJ5X3N1Y2Nlc3M6IGJvb2wsCisgICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCisgICAgICAgIHB1YiBmbGFnczogVmVjPEZsYWdWYWx1ZVN1bW1hcnlDWFg+LAorICAgIH0KKworICAgIC8vLyBsaXN0IGZsYWcgd2l0aCBpbmZvIHJlc3VsdCBjeHggcmV0dXJuCisgICAgcHViIHN0cnVjdCBMaXN0RmxhZ1ZhbHVlQW5kSW5mb1Jlc3VsdENYWCB7CisgICAgICAgIHB1YiBxdWVyeV9zdWNjZXNzOiBib29sLAorICAgICAgICBwdWIgZXJyb3JfbWVzc2FnZTogU3RyaW5nLAorICAgICAgICBwdWIgZmxhZ3M6IFZlYzxGbGFnVmFsdWVBbmRJbmZvU3VtbWFyeUNYWD4sCisgICAgfQorCisgICAgLy8gUnVzdCBleHBvcnQgdG8gYysrCisgICAgZXh0ZXJuICJSdXN0IiB7CisgICAgICAgIHB1YiBmbiBsaXN0X2ZsYWdzX2N4eCgKKyAgICAgICAgICAgIHBhY2thZ2VfbWFwOiAmc3RyLAorICAgICAgICAgICAgZmxhZ19tYXA6ICZzdHIsCisgICAgICAgICAgICBmbGFnX3ZhbDogJnN0ciwKKyAgICAgICAgKSAtPiBMaXN0RmxhZ1ZhbHVlUmVzdWx0Q1hYOworCisgICAgICAgIHB1YiBmbiBsaXN0X2ZsYWdzX3dpdGhfaW5mb19jeHgoCisgICAgICAgICAgICBwYWNrYWdlX21hcDogJnN0ciwKKyAgICAgICAgICAgIGZsYWdfbWFwOiAmc3RyLAorICAgICAgICAgICAgZmxhZ192YWw6ICZzdHIsCisgICAgICAgICAgICBmbGFnX2luZm86ICZzdHIsCisgICAgICAgICkgLT4gTGlzdEZsYWdWYWx1ZUFuZEluZm9SZXN1bHRDWFg7CisgICAgfQorfQorCisvLy8gaW1wbGVtZW50IGZsYWcgdmFsdWUgc3VtbWFyeSBjeHggcmV0dXJuIHR5cGUKK2ltcGwgZmZpOjpGbGFnVmFsdWVTdW1tYXJ5Q1hYIHsKKyAgICBwdWIoY3JhdGUpIGZuIG5ldyhzdW1tYXJ5OiBGbGFnVmFsdWVTdW1tYXJ5KSAtPiBTZWxmIHsKKyAgICAgICAgU2VsZiB7CisgICAgICAgICAgICBwYWNrYWdlX25hbWU6IHN1bW1hcnkucGFja2FnZV9uYW1lLAorICAgICAgICAgICAgZmxhZ19uYW1lOiBzdW1tYXJ5LmZsYWdfbmFtZSwKKyAgICAgICAgICAgIGZsYWdfdmFsdWU6IHN1bW1hcnkuZmxhZ192YWx1ZSwKKyAgICAgICAgICAgIHZhbHVlX3R5cGU6IGZvcm1hdCEoIns6P30iLCBzdW1tYXJ5LnZhbHVlX3R5cGUpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gaW1wbGVtZW50IGZsYWcgdmFsdWUgYW5kIGluZm8gc3VtbWFyeSBjeHggcmV0dXJuIHR5cGUKK2ltcGwgZmZpOjpGbGFnVmFsdWVBbmRJbmZvU3VtbWFyeUNYWCB7CisgICAgcHViKGNyYXRlKSBmbiBuZXcoc3VtbWFyeTogRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkpIC0+IFNlbGYgeworICAgICAgICBTZWxmIHsKKyAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogc3VtbWFyeS5wYWNrYWdlX25hbWUsCisgICAgICAgICAgICBmbGFnX25hbWU6IHN1bW1hcnkuZmxhZ19uYW1lLAorICAgICAgICAgICAgZmxhZ192YWx1ZTogc3VtbWFyeS5mbGFnX3ZhbHVlLAorICAgICAgICAgICAgdmFsdWVfdHlwZTogZm9ybWF0ISgiezo/fSIsIHN1bW1hcnkudmFsdWVfdHlwZSksCisgICAgICAgICAgICBpc19yZWFkd3JpdGU6IHN1bW1hcnkuaXNfcmVhZHdyaXRlLAorICAgICAgICAgICAgaGFzX3NlcnZlcl9vdmVycmlkZTogc3VtbWFyeS5oYXNfc2VydmVyX292ZXJyaWRlLAorICAgICAgICAgICAgaGFzX2xvY2FsX292ZXJyaWRlOiBzdW1tYXJ5Lmhhc19sb2NhbF9vdmVycmlkZSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIGltcGxlbWVudCBsaXN0IGZsYWcgY3h4IGludGVybG9wCitwdWIgZm4gbGlzdF9mbGFnc19jeHgoCisgICAgcGFja2FnZV9tYXA6ICZzdHIsCisgICAgZmxhZ19tYXA6ICZzdHIsCisgICAgZmxhZ192YWw6ICZzdHIsCispIC0+IGZmaTo6TGlzdEZsYWdWYWx1ZVJlc3VsdENYWCB7CisgICAgbWF0Y2ggbGlzdF9mbGFncyhwYWNrYWdlX21hcCwgZmxhZ19tYXAsIGZsYWdfdmFsKSB7CisgICAgICAgIE9rKHN1bW1hcnkpID0+IGZmaTo6TGlzdEZsYWdWYWx1ZVJlc3VsdENYWCB7CisgICAgICAgICAgICBxdWVyeV9zdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpuZXcoKSwKKyAgICAgICAgICAgIGZsYWdzOiBzdW1tYXJ5LmludG9faXRlcigpLm1hcChmZmk6OkZsYWdWYWx1ZVN1bW1hcnlDWFg6Om5ldykuY29sbGVjdCgpLAorICAgICAgICB9LAorICAgICAgICBFcnIoZXJybXNnKSA9PiBmZmk6Okxpc3RGbGFnVmFsdWVSZXN1bHRDWFggeworICAgICAgICAgICAgcXVlcnlfc3VjY2VzczogZmFsc2UsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBmb3JtYXQhKCJ7Oj99IiwgZXJybXNnKSwKKyAgICAgICAgICAgIGZsYWdzOiBWZWM6Om5ldygpLAorICAgICAgICB9LAorICAgIH0KK30KKworLy8vIGltcGxlbWVudCBsaXN0IGZsYWcgd2l0aCBpbmZvIGN4eCBpbnRlcmxvcAorcHViIGZuIGxpc3RfZmxhZ3Nfd2l0aF9pbmZvX2N4eCgKKyAgICBwYWNrYWdlX21hcDogJnN0ciwKKyAgICBmbGFnX21hcDogJnN0ciwKKyAgICBmbGFnX3ZhbDogJnN0ciwKKyAgICBmbGFnX2luZm86ICZzdHIsCispIC0+IGZmaTo6TGlzdEZsYWdWYWx1ZUFuZEluZm9SZXN1bHRDWFggeworICAgIG1hdGNoIGxpc3RfZmxhZ3Nfd2l0aF9pbmZvKHBhY2thZ2VfbWFwLCBmbGFnX21hcCwgZmxhZ192YWwsIGZsYWdfaW5mbykgeworICAgICAgICBPayhzdW1tYXJ5KSA9PiBmZmk6Okxpc3RGbGFnVmFsdWVBbmRJbmZvUmVzdWx0Q1hYIHsKKyAgICAgICAgICAgIHF1ZXJ5X3N1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBTdHJpbmc6Om5ldygpLAorICAgICAgICAgICAgZmxhZ3M6IHN1bW1hcnkuaW50b19pdGVyKCkubWFwKGZmaTo6RmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnlDWFg6Om5ldykuY29sbGVjdCgpLAorICAgICAgICB9LAorICAgICAgICBFcnIoZXJybXNnKSA9PiBmZmk6Okxpc3RGbGFnVmFsdWVBbmRJbmZvUmVzdWx0Q1hYIHsKKyAgICAgICAgICAgIHF1ZXJ5X3N1Y2Nlc3M6IGZhbHNlLAorICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogZm9ybWF0ISgiezo/fSIsIGVycm1zZyksCisgICAgICAgICAgICBmbGFnczogVmVjOjpuZXcoKSwKKyAgICAgICAgfSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjp0ZXN0X3V0aWxzOjp7CisgICAgICAgIGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0LCBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlLCBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QsCisgICAgICAgIGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUsIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSwKKyAgICB9OworCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSBmbGFnIGxpc3QgYXBpCisgICAgZm4gdGVzdF9saXN0X2ZsYWcoKSB7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0KKyAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3RhYmxlID0gd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCkuaW50b19ieXRlcygpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9CisgICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGVfcGF0aCA9IHBhY2thZ2VfdGFibGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKyAgICAgICAgbGV0IGZsYWdfdGFibGVfcGF0aCA9IGZsYWdfdGFibGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdF9wYXRoID0gZmxhZ192YWx1ZV9saXN0LnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisKKyAgICAgICAgbGV0IGZsYWdzID0KKyAgICAgICAgICAgIGxpc3RfZmxhZ3MoJnBhY2thZ2VfdGFibGVfcGF0aCwgJmZsYWdfdGFibGVfcGF0aCwgJmZsYWdfdmFsdWVfbGlzdF9wYXRoKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkID0gWworICAgICAgICAgICAgRmxhZ1ZhbHVlU3VtbWFyeSB7CisgICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKSwKKyAgICAgICAgICAgICAgICBmbGFnX25hbWU6IFN0cmluZzo6ZnJvbSgiZGlzYWJsZWRfcnciKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oImZhbHNlIiksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlU3VtbWFyeSB7CisgICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKSwKKyAgICAgICAgICAgICAgICBmbGFnX25hbWU6IFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9ybyIpLAorICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU6IFN0b3JlZEZsYWdUeXBlOjpSZWFkT25seUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlU3VtbWFyeSB7CisgICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKSwKKyAgICAgICAgICAgICAgICBmbGFnX25hbWU6IFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9ydyIpLAorICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU6IFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLAorICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU6IFN0cmluZzo6ZnJvbSgidHJ1ZSIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZVN1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImRpc2FibGVkX3J3IiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJmYWxzZSIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZVN1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfZml4ZWRfcm8iKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlU3VtbWFyeSB7CisgICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKSwKKyAgICAgICAgICAgICAgICBmbGFnX25hbWU6IFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9ybyIpLAorICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU6IFN0b3JlZEZsYWdUeXBlOjpSZWFkT25seUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlU3VtbWFyeSB7CisgICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKSwKKyAgICAgICAgICAgICAgICBmbGFnX25hbWU6IFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9maXhlZF9ybyIpLAorICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU6IFN0b3JlZEZsYWdUeXBlOjpGaXhlZFJlYWRPbmx5Qm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oInRydWUiKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBGbGFnVmFsdWVTdW1tYXJ5IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpLAorICAgICAgICAgICAgICAgIGZsYWdfbmFtZTogU3RyaW5nOjpmcm9tKCJlbmFibGVkX3J3IiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICB9LAorICAgICAgICBdOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdzLCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSBmbGFnIGxpc3Qgd2l0aCBpbmZvIGFwaQorICAgIGZuIHRlc3RfbGlzdF9mbGFnX3dpdGhfaW5mbygpIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPQorICAgICAgICAgICAgd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKCkuaW50b19ieXRlcygpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfdGFibGUgPSB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoKS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0KKyAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KCkuaW50b19ieXRlcygpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0KKyAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOworCisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlX3BhdGggPSBwYWNrYWdlX3RhYmxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisgICAgICAgIGxldCBmbGFnX3RhYmxlX3BhdGggPSBmbGFnX3RhYmxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3RfcGF0aCA9IGZsYWdfdmFsdWVfbGlzdC5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3RfcGF0aCA9IGZsYWdfaW5mb19saXN0LnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisKKyAgICAgICAgbGV0IGZsYWdzID0gbGlzdF9mbGFnc193aXRoX2luZm8oCisgICAgICAgICAgICAmcGFja2FnZV90YWJsZV9wYXRoLAorICAgICAgICAgICAgJmZsYWdfdGFibGVfcGF0aCwKKyAgICAgICAgICAgICZmbGFnX3ZhbHVlX2xpc3RfcGF0aCwKKyAgICAgICAgICAgICZmbGFnX2luZm9fbGlzdF9wYXRoLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkID0gWworICAgICAgICAgICAgRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImRpc2FibGVkX3J3IiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJmYWxzZSIpLAorICAgICAgICAgICAgICAgIGlzX3JlYWR3cml0ZTogdHJ1ZSwKKyAgICAgICAgICAgICAgICBoYXNfc2VydmVyX292ZXJyaWRlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBoYXNfbG9jYWxfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpLAorICAgICAgICAgICAgICAgIGZsYWdfbmFtZTogU3RyaW5nOjpmcm9tKCJlbmFibGVkX3JvIiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oInRydWUiKSwKKyAgICAgICAgICAgICAgICBpc19yZWFkd3JpdGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19zZXJ2ZXJfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19sb2NhbF9vdmVycmlkZTogZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfcnciKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oInRydWUiKSwKKyAgICAgICAgICAgICAgICBpc19yZWFkd3JpdGU6IHRydWUsCisgICAgICAgICAgICAgICAgaGFzX3NlcnZlcl9vdmVycmlkZTogZmFsc2UsCisgICAgICAgICAgICAgICAgaGFzX2xvY2FsX292ZXJyaWRlOiBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBGbGFnVmFsdWVBbmRJbmZvU3VtbWFyeSB7CisgICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKSwKKyAgICAgICAgICAgICAgICBmbGFnX25hbWU6IFN0cmluZzo6ZnJvbSgiZGlzYWJsZWRfcnciKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oImZhbHNlIiksCisgICAgICAgICAgICAgICAgaXNfcmVhZHdyaXRlOiB0cnVlLAorICAgICAgICAgICAgICAgIGhhc19zZXJ2ZXJfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19sb2NhbF9vdmVycmlkZTogZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfZml4ZWRfcm8iKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICAgICAgaXNfcmVhZHdyaXRlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBoYXNfc2VydmVyX292ZXJyaWRlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBoYXNfbG9jYWxfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpLAorICAgICAgICAgICAgICAgIGZsYWdfbmFtZTogU3RyaW5nOjpmcm9tKCJlbmFibGVkX3JvIiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oInRydWUiKSwKKyAgICAgICAgICAgICAgICBpc19yZWFkd3JpdGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19zZXJ2ZXJfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19sb2NhbF9vdmVycmlkZTogZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfZml4ZWRfcm8iKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICAgICAgaXNfcmVhZHdyaXRlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBoYXNfc2VydmVyX292ZXJyaWRlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBoYXNfbG9jYWxfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpLAorICAgICAgICAgICAgICAgIGZsYWdfbmFtZTogU3RyaW5nOjpmcm9tKCJlbmFibGVkX3J3IiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICAgICAgaXNfcmVhZHdyaXRlOiB0cnVlLAorICAgICAgICAgICAgICAgIGhhc19zZXJ2ZXJfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19sb2NhbF9vdmVycmlkZTogZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICBdOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdzLCBleHBlY3RlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL21haW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZTM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL21haW4ucnMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYGFjb25maWctc3RvcmFnZWAgaXMgYSBkZWJ1Z2dpbmcgdG9vbCB0byBwYXJzZSBzdG9yYWdlIGZpbGVzCisKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6eworICAgIGxpc3RfZmxhZ3MsIGxpc3RfZmxhZ3Nfd2l0aF9pbmZvLCByZWFkX2ZpbGVfdG9fYnl0ZXMsIEFjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdJbmZvTGlzdCwKKyAgICBGbGFnVGFibGUsIEZsYWdWYWx1ZUxpc3QsIFBhY2thZ2VUYWJsZSwgU3RvcmFnZUZpbGVUeXBlLAorfTsKKwordXNlIGNsYXA6OntidWlsZGVyOjpBcmdBY3Rpb24sIEFyZywgQ29tbWFuZH07CisKK2ZuIGNsaSgpIC0+IENvbW1hbmQgeworICAgIENvbW1hbmQ6Om5ldygiYWNvbmZpZy1zdG9yYWdlIikKKyAgICAgICAgLnN1YmNvbW1hbmRfcmVxdWlyZWQodHJ1ZSkKKyAgICAgICAgLnN1YmNvbW1hbmQoCisgICAgICAgICAgICBDb21tYW5kOjpuZXcoInByaW50IikKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJmaWxlIikubG9uZygiZmlsZSIpLnJlcXVpcmVkKHRydWUpLmFjdGlvbihBcmdBY3Rpb246OlNldCkpCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoInR5cGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoInR5cGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVpcmVkKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKHxzOiAmc3RyfCBTdG9yYWdlRmlsZVR5cGU6OnRyeV9mcm9tKHMpKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICApCisgICAgICAgIC5zdWJjb21tYW5kKAorICAgICAgICAgICAgQ29tbWFuZDo6bmV3KCJsaXN0IikKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygicGFja2FnZS1tYXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoInBhY2thZ2UtbWFwIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1aXJlZCh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjdGlvbihBcmdBY3Rpb246OlNldCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImZsYWctbWFwIikubG9uZygiZmxhZy1tYXAiKS5yZXF1aXJlZCh0cnVlKS5hY3Rpb24oQXJnQWN0aW9uOjpTZXQpKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImZsYWctdmFsIikubG9uZygiZmxhZy12YWwiKS5yZXF1aXJlZCh0cnVlKS5hY3Rpb24oQXJnQWN0aW9uOjpTZXQpKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJmbGFnLWluZm8iKS5sb25nKCJmbGFnLWluZm8iKS5yZXF1aXJlZChmYWxzZSkuYWN0aW9uKEFyZ0FjdGlvbjo6U2V0KSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICApCit9CisKK2ZuIHByaW50X3N0b3JhZ2VfZmlsZSgKKyAgICBmaWxlX3BhdGg6ICZzdHIsCisgICAgZmlsZV90eXBlOiAmU3RvcmFnZUZpbGVUeXBlLAorKSAtPiBSZXN1bHQ8KCksIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgYnl0ZXMgPSByZWFkX2ZpbGVfdG9fYnl0ZXMoZmlsZV9wYXRoKT87CisgICAgbWF0Y2ggZmlsZV90eXBlIHsKKyAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwID0+IHsKKyAgICAgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gUGFja2FnZVRhYmxlOjpmcm9tX2J5dGVzKCZieXRlcyk/OworICAgICAgICAgICAgcHJpbnRsbiEoIns6P30iLCBwYWNrYWdlX3RhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAgPT4geworICAgICAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBGbGFnVGFibGU6OmZyb21fYnl0ZXMoJmJ5dGVzKT87CisgICAgICAgICAgICBwcmludGxuISgiezo/fSIsIGZsYWdfdGFibGUpOworICAgICAgICB9CisgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCA9PiB7CisgICAgICAgICAgICBsZXQgZmxhZ192YWx1ZSA9IEZsYWdWYWx1ZUxpc3Q6OmZyb21fYnl0ZXMoJmJ5dGVzKT87CisgICAgICAgICAgICBwcmludGxuISgiezo/fSIsIGZsYWdfdmFsdWUpOworICAgICAgICB9CisgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gPT4geworICAgICAgICAgICAgbGV0IGZsYWdfaW5mbyA9IEZsYWdJbmZvTGlzdDo6ZnJvbV9ieXRlcygmYnl0ZXMpPzsKKyAgICAgICAgICAgIHByaW50bG4hKCJ7Oj99IiwgZmxhZ19pbmZvKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBPaygoKSkKK30KKworZm4gbWFpbigpIC0+IFJlc3VsdDwoKSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBtYXRjaGVzID0gY2xpKCkuZ2V0X21hdGNoZXMoKTsKKyAgICBtYXRjaCBtYXRjaGVzLnN1YmNvbW1hbmQoKSB7CisgICAgICAgIFNvbWUoKCJwcmludCIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IGZpbGVfcGF0aCA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdHJpbmc+KCJmaWxlIikudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgZmlsZV90eXBlID0gc3ViX21hdGNoZXMuZ2V0X29uZTo6PFN0b3JhZ2VGaWxlVHlwZT4oInR5cGUiKS51bndyYXAoKTsKKyAgICAgICAgICAgIHByaW50X3N0b3JhZ2VfZmlsZShmaWxlX3BhdGgsIGZpbGVfdHlwZSk/CisgICAgICAgIH0KKyAgICAgICAgU29tZSgoImxpc3QiLCBzdWJfbWF0Y2hlcykpID0+IHsKKyAgICAgICAgICAgIGxldCBwYWNrYWdlX21hcCA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdHJpbmc+KCJwYWNrYWdlLW1hcCIpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IGZsYWdfbWFwID0gc3ViX21hdGNoZXMuZ2V0X29uZTo6PFN0cmluZz4oImZsYWctbWFwIikudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgZmxhZ192YWwgPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigiZmxhZy12YWwiKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBmbGFnX2luZm8gPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigiZmxhZy1pbmZvIik7CisgICAgICAgICAgICBtYXRjaCBmbGFnX2luZm8geworICAgICAgICAgICAgICAgIFNvbWUoaW5mb19maWxlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBmbGFncyA9IGxpc3RfZmxhZ3Nfd2l0aF9pbmZvKHBhY2thZ2VfbWFwLCBmbGFnX21hcCwgZmxhZ192YWwsIGluZm9fZmlsZSk/OworICAgICAgICAgICAgICAgICAgICBmb3IgZmxhZyBpbiBmbGFncy5pdGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRsbiEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInt9IHt9IHt9IHs6P30gSXNSZWFkV3JpdGU6IHt9LCBIYXNTZXJ2ZXJPdmVycmlkZToge30sIEhhc0xvY2FsT3ZlcnJpZGU6IHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLnBhY2thZ2VfbmFtZSwgZmxhZy5mbGFnX25hbWUsIGZsYWcuZmxhZ192YWx1ZSwgZmxhZy52YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcuaXNfcmVhZHdyaXRlLCBmbGFnLmhhc19zZXJ2ZXJfb3ZlcnJpZGUsIGZsYWcuaGFzX2xvY2FsX292ZXJyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGZsYWdzID0gbGlzdF9mbGFncyhwYWNrYWdlX21hcCwgZmxhZ19tYXAsIGZsYWdfdmFsKT87CisgICAgICAgICAgICAgICAgICAgIGZvciBmbGFnIGluIGZsYWdzLml0ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuISgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAie30ge30ge30gezo/fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy5wYWNrYWdlX25hbWUsIGZsYWcuZmxhZ19uYW1lLCBmbGFnLmZsYWdfdmFsdWUsIGZsYWcudmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgXyA9PiB1bnJlYWNoYWJsZSEoKSwKKyAgICB9CisgICAgT2soKCkpCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9wYWNrYWdlX3RhYmxlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvcGFja2FnZV90YWJsZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzM0OTcyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvcGFja2FnZV90YWJsZS5ycwpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vISBwYWNrYWdlIHRhYmxlIG1vZHVsZSBkZWZpbmVzIHRoZSBwYWNrYWdlIHRhYmxlIGZpbGUgZm9ybWF0IGFuZCBtZXRob2RzIGZvciBzZXJpYWxpemF0aW9uCisvLyEgYW5kIGRlc2VyaWFsaXphdGlvbgorCit1c2UgY3JhdGU6OntnZXRfYnVja2V0X2luZGV4LCByZWFkX3N0cl9mcm9tX2J5dGVzLCByZWFkX3UzMl9mcm9tX2J5dGVzLCByZWFkX3U4X2Zyb21fYnl0ZXN9OwordXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlfTsKK3VzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBzdGQ6OmZtdDsKKworLy8vIFBhY2thZ2UgdGFibGUgaGVhZGVyIHN0cnVjdAorI1tkZXJpdmUoUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgUGFja2FnZVRhYmxlSGVhZGVyIHsKKyAgICBwdWIgdmVyc2lvbjogdTMyLAorICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKKyAgICBwdWIgZmlsZV90eXBlOiB1OCwKKyAgICBwdWIgZmlsZV9zaXplOiB1MzIsCisgICAgcHViIG51bV9wYWNrYWdlczogdTMyLAorICAgIHB1YiBidWNrZXRfb2Zmc2V0OiB1MzIsCisgICAgcHViIG5vZGVfb2Zmc2V0OiB1MzIsCit9CisKKy8vLyBJbXBsZW1lbnQgZGVidWcgcHJpbnQgdHJhaXQgZm9yIGhlYWRlcgoraW1wbCBmbXQ6OkRlYnVnIGZvciBQYWNrYWdlVGFibGVIZWFkZXIgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiVmVyc2lvbjoge30sIENvbnRhaW5lcjoge30sIEZpbGUgVHlwZTogezo/fSwgRmlsZSBTaXplOiB7fSIsCisgICAgICAgICAgICBzZWxmLnZlcnNpb24sCisgICAgICAgICAgICBzZWxmLmNvbnRhaW5lciwKKyAgICAgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6dHJ5X2Zyb20oc2VsZi5maWxlX3R5cGUpLAorICAgICAgICAgICAgc2VsZi5maWxlX3NpemUKKyAgICAgICAgKT87CisgICAgICAgIHdyaXRlbG4hKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJOdW0gb2YgUGFja2FnZXM6IHt9LCBCdWNrZXQgT2Zmc2V0Ont9LCBOb2RlIE9mZnNldDoge30iLAorICAgICAgICAgICAgc2VsZi5udW1fcGFja2FnZXMsIHNlbGYuYnVja2V0X29mZnNldCwgc2VsZi5ub2RlX29mZnNldAorICAgICAgICApPzsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIFBhY2thZ2VUYWJsZUhlYWRlciB7CisgICAgLy8vIFNlcmlhbGl6ZSB0byBieXRlcworICAgIHB1YiBmbiBpbnRvX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IG11dCByZXN1bHQgPSBWZWM6Om5ldygpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYudmVyc2lvbi50b19sZV9ieXRlcygpKTsKKyAgICAgICAgbGV0IGNvbnRhaW5lcl9ieXRlcyA9IHNlbGYuY29udGFpbmVyLmFzX2J5dGVzKCk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmKGNvbnRhaW5lcl9ieXRlcy5sZW4oKSBhcyB1MzIpLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoY29udGFpbmVyX2J5dGVzKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmZpbGVfdHlwZS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmZpbGVfc2l6ZS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLm51bV9wYWNrYWdlcy50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmJ1Y2tldF9vZmZzZXQudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5ub2RlX29mZnNldC50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0CisgICAgfQorCisgICAgLy8vIERlc2VyaWFsaXplIGZyb20gYnl0ZXMKKyAgICBwdWIgZm4gZnJvbV9ieXRlcyhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7CisgICAgICAgIGxldCB0YWJsZSA9IFNlbGYgeworICAgICAgICAgICAgdmVyc2lvbjogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBjb250YWluZXI6IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV90eXBlOiByZWFkX3U4X2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV9zaXplOiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG51bV9wYWNrYWdlczogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBidWNrZXRfb2Zmc2V0OiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG5vZGVfb2Zmc2V0OiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgfTsKKyAgICAgICAgaWYgdGFibGUuZmlsZV90eXBlICE9IFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCBhcyB1OCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoCisgICAgICAgICAgICAgICAgImJpbmFyeSBmaWxlIGlzIG5vdCBhIHBhY2thZ2UgbWFwIgorICAgICAgICAgICAgKSkpOworICAgICAgICB9CisgICAgICAgIE9rKHRhYmxlKQorICAgIH0KK30KKworLy8vIFBhY2thZ2UgdGFibGUgbm9kZSBzdHJ1Y3QKKyNbZGVyaXZlKFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFBhY2thZ2VUYWJsZU5vZGUgeworICAgIHB1YiBwYWNrYWdlX25hbWU6IFN0cmluZywKKyAgICBwdWIgcGFja2FnZV9pZDogdTMyLAorICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYm9vbGVhbiBmbGFnIGluIHRoaXMgYWNvbmZpZyBwYWNrYWdlIGFtb25nIGFsbCBib29sZWFuCisgICAgLy8gZmxhZ3MgaW4gdGhpcyBjb250YWluZXIuCisgICAgcHViIGJvb2xlYW5fc3RhcnRfaW5kZXg6IHUzMiwKKyAgICBwdWIgbmV4dF9vZmZzZXQ6IE9wdGlvbjx1MzI+LAorfQorCisvLy8gSW1wbGVtZW50IGRlYnVnIHByaW50IHRyYWl0IGZvciBub2RlCitpbXBsIGZtdDo6RGVidWcgZm9yIFBhY2thZ2VUYWJsZU5vZGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiUGFja2FnZToge30sIElkOiB7fSwgQm9vbGVhbiBmbGFnIHN0YXJ0IGluZGV4OiB7fSwgTmV4dDogezo/fSIsCisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfbmFtZSwgc2VsZi5wYWNrYWdlX2lkLCBzZWxmLmJvb2xlYW5fc3RhcnRfaW5kZXgsIHNlbGYubmV4dF9vZmZzZXQKKyAgICAgICAgKT87CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworaW1wbCBQYWNrYWdlVGFibGVOb2RlIHsKKyAgICAvLy8gU2VyaWFsaXplIHRvIGJ5dGVzCisgICAgcHViIGZuIGludG9fYnl0ZXMoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgbXV0IHJlc3VsdCA9IFZlYzo6bmV3KCk7CisgICAgICAgIGxldCBuYW1lX2J5dGVzID0gc2VsZi5wYWNrYWdlX25hbWUuYXNfYnl0ZXMoKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCYobmFtZV9ieXRlcy5sZW4oKSBhcyB1MzIpLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UobmFtZV9ieXRlcyk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5wYWNrYWdlX2lkLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuYm9vbGVhbl9zdGFydF9pbmRleC50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLm5leHRfb2Zmc2V0LnVud3JhcF9vcigwKS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0CisgICAgfQorCisgICAgLy8vIERlc2VyaWFsaXplIGZyb20gYnl0ZXMKKyAgICBwdWIgZm4gZnJvbV9ieXRlcyhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7CisgICAgICAgIGxldCBub2RlID0gU2VsZiB7CisgICAgICAgICAgICBwYWNrYWdlX25hbWU6IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgcGFja2FnZV9pZDogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBtYXRjaCByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPyB7CisgICAgICAgICAgICAgICAgMCA9PiBOb25lLAorICAgICAgICAgICAgICAgIHZhbCA9PiBTb21lKHZhbCksCisgICAgICAgICAgICB9LAorICAgICAgICB9OworICAgICAgICBPayhub2RlKQorICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGJ1Y2tldCBpbmRleCBmb3IgYSBwYWNrYWdlIHRhYmxlIG5vZGUsIGRlZmluZWQgaXQgaGVyZSBzbyB0aGUKKyAgICAvLy8gY29uc3RydWN0aW9uIHNpZGUgKGFjb25maWcgYmluYXJ5KSBhbmQgY29uc3VtcHRpb24gc2lkZSAoZmxhZyByZWFkIGxpYikKKyAgICAvLy8gdXNlIHRoZSBzYW1lIG1ldGhvZCBvZiBoYXNoaW5nCisgICAgcHViIGZuIGZpbmRfYnVja2V0X2luZGV4KHBhY2thZ2U6ICZzdHIsIG51bV9idWNrZXRzOiB1MzIpIC0+IHUzMiB7CisgICAgICAgIGdldF9idWNrZXRfaW5kZXgoJnBhY2thZ2UsIG51bV9idWNrZXRzKQorICAgIH0KK30KKworLy8vIFBhY2thZ2UgdGFibGUgc3RydWN0CisjW2Rlcml2ZShQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBQYWNrYWdlVGFibGUgeworICAgIHB1YiBoZWFkZXI6IFBhY2thZ2VUYWJsZUhlYWRlciwKKyAgICBwdWIgYnVja2V0czogVmVjPE9wdGlvbjx1MzI+PiwKKyAgICBwdWIgbm9kZXM6IFZlYzxQYWNrYWdlVGFibGVOb2RlPiwKK30KKworLy8vIEltcGxlbWVudCBkZWJ1ZyBwcmludCB0cmFpdCBmb3IgcGFja2FnZSB0YWJsZQoraW1wbCBmbXQ6OkRlYnVnIGZvciBQYWNrYWdlVGFibGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuIShmLCAiSGVhZGVyOiIpPzsKKyAgICAgICAgd3JpdGUhKGYsICJ7Oj99Iiwgc2VsZi5oZWFkZXIpPzsKKyAgICAgICAgd3JpdGVsbiEoZiwgIkJ1Y2tldHM6Iik/OworICAgICAgICB3cml0ZWxuIShmLCAiezo/fSIsIHNlbGYuYnVja2V0cyk/OworICAgICAgICB3cml0ZWxuIShmLCAiTm9kZXM6Iik/OworICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLm5vZGVzLml0ZXIoKSB7CisgICAgICAgICAgICB3cml0ZSEoZiwgIns6P30iLCBub2RlKT87CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIFBhY2thZ2VUYWJsZSB7CisgICAgLy8vIFNlcmlhbGl6ZSB0byBieXRlcworICAgIHB1YiBmbiBpbnRvX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgWworICAgICAgICAgICAgc2VsZi5oZWFkZXIuaW50b19ieXRlcygpLAorICAgICAgICAgICAgc2VsZi5idWNrZXRzLml0ZXIoKS5tYXAofHZ8IHYudW53cmFwX29yKDApLnRvX2xlX2J5dGVzKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkuY29uY2F0KCksCisgICAgICAgICAgICBzZWxmLm5vZGVzLml0ZXIoKS5tYXAofHZ8IHYuaW50b19ieXRlcygpKS5jb2xsZWN0Ojo8VmVjPF8+PigpLmNvbmNhdCgpLAorICAgICAgICBdCisgICAgICAgIC5jb25jYXQoKQorICAgIH0KKworICAgIC8vLyBEZXNlcmlhbGl6ZSBmcm9tIGJ5dGVzCisgICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgICAgICBsZXQgaGVhZGVyID0gUGFja2FnZVRhYmxlSGVhZGVyOjpmcm9tX2J5dGVzKGJ5dGVzKT87CisgICAgICAgIGxldCBudW1fcGFja2FnZXMgPSBoZWFkZXIubnVtX3BhY2thZ2VzOworICAgICAgICBsZXQgbnVtX2J1Y2tldHMgPSBjcmF0ZTo6Z2V0X3RhYmxlX3NpemUobnVtX3BhY2thZ2VzKT87CisgICAgICAgIGxldCBtdXQgaGVhZCA9IGhlYWRlci5pbnRvX2J5dGVzKCkubGVuKCk7CisgICAgICAgIGxldCBidWNrZXRzID0gKDAuLm51bV9idWNrZXRzKQorICAgICAgICAgICAgLm1hcCh8X3wgbWF0Y2ggcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKS51bndyYXAoKSB7CisgICAgICAgICAgICAgICAgMCA9PiBOb25lLAorICAgICAgICAgICAgICAgIHZhbCA9PiBTb21lKHZhbCksCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmNvbGxlY3QoKTsKKyAgICAgICAgbGV0IG5vZGVzID0gKDAuLm51bV9wYWNrYWdlcykKKyAgICAgICAgICAgIC5tYXAofF98IHsKKyAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IFBhY2thZ2VUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJmJ5dGVzW2hlYWQuLl0pPzsKKyAgICAgICAgICAgICAgICBoZWFkICs9IG5vZGUuaW50b19ieXRlcygpLmxlbigpOworICAgICAgICAgICAgICAgIE9rKG5vZGUpCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPF8+LCBBY29uZmlnU3RvcmFnZUVycm9yPj4oKQorICAgICAgICAgICAgLm1hcF9lcnIofGVycm1zZ3wgeworICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoCisgICAgICAgICAgICAgICAgICAgICJmYWlsIHRvIHBhcnNlIHBhY2thZ2UgdGFibGU6IHt9IiwKKyAgICAgICAgICAgICAgICAgICAgZXJybXNnCisgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgIH0pPzsKKworICAgICAgICBsZXQgdGFibGUgPSBTZWxmIHsgaGVhZGVyLCBidWNrZXRzLCBub2RlcyB9OworICAgICAgICBPayh0YWJsZSkKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlOworCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB0YWJsZSBzZXJpYWxpemF0aW9uCisgICAgZm4gdGVzdF9zZXJpYWxpemF0aW9uKCkgeworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKTsKKyAgICAgICAgbGV0IGhlYWRlcjogJlBhY2thZ2VUYWJsZUhlYWRlciA9ICZwYWNrYWdlX3RhYmxlLmhlYWRlcjsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gUGFja2FnZVRhYmxlSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2hlYWRlci5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShoZWFkZXIsICZyZWludGVycHJldGVkX2hlYWRlci51bndyYXAoKSk7CisKKyAgICAgICAgbGV0IG5vZGVzOiAmVmVjPFBhY2thZ2VUYWJsZU5vZGU+ID0gJnBhY2thZ2VfdGFibGUubm9kZXM7CisgICAgICAgIGZvciBub2RlIGluIG5vZGVzLml0ZXIoKSB7CisgICAgICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9ub2RlID0gUGFja2FnZVRhYmxlTm9kZTo6ZnJvbV9ieXRlcygmbm9kZS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLCAmcmVpbnRlcnByZXRlZF9ub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlX2J5dGVzID0gcGFja2FnZV90YWJsZS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCByZWludGVycHJldGVkX3RhYmxlID0gUGFja2FnZVRhYmxlOjpmcm9tX2J5dGVzKCZwYWNrYWdlX3RhYmxlX2J5dGVzKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX3RhYmxlLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZwYWNrYWdlX3RhYmxlLCAmcmVpbnRlcnByZXRlZF90YWJsZS51bndyYXAoKSk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV90YWJsZV9ieXRlcy5sZW4oKSBhcyB1MzIsIGhlYWRlci5maWxlX3NpemUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGF0IHZlcnNpb24gbnVtYmVyIHNob3VsZCBiZSBhdCB0aGUgdG9wIG9mIHNlcmlhbGl6ZWQKKyAgICAvLyBieXRlcworICAgIGZuIHRlc3RfdmVyc2lvbl9udW1iZXIoKSB7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpOworICAgICAgICBsZXQgYnl0ZXMgPSAmcGFja2FnZV90YWJsZS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7CisgICAgICAgIGxldCB2ZXJzaW9uID0gcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh2ZXJzaW9uLCAxKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmlsZSB0eXBlIGNoZWNrCisgICAgZm4gdGVzdF9maWxlX3R5cGVfY2hlY2soKSB7CisgICAgICAgIGxldCBtdXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKTsKKyAgICAgICAgcGFja2FnZV90YWJsZS5oZWFkZXIuZmlsZV90eXBlID0gMTIzdTg7CisgICAgICAgIGxldCBlcnJvciA9IFBhY2thZ2VUYWJsZTo6ZnJvbV9ieXRlcygmcGFja2FnZV90YWJsZS5pbnRvX2J5dGVzKCkpLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCisgICAgICAgICAgICBmb3JtYXQhKCJCeXRlc1BhcnNlRmFpbChiaW5hcnkgZmlsZSBpcyBub3QgYSBwYWNrYWdlIG1hcCkiKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3Byb3Rvcy5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3Byb3Rvcy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjg2MjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvcHJvdG9zLnJzCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gV2hlbiBidWlsZGluZyB3aXRoIHRoZSBBbmRyb2lkIHRvb2wtY2hhaW4KKy8vCisvLyAgIC0gYW4gZXh0ZXJuYWwgY3JhdGUgYGFjb25maWdfc3RvcmFnZV9tZXRhZGF0YV9wcm90b3NgIHdpbGwgYmUgZ2VuZXJhdGVkCisvLyAgIC0gdGhlIGZlYXR1cmUgImNhcmdvIiB3aWxsIGJlIGRpc2FibGVkCisvLworLy8gV2hlbiBidWlsZGluZyB3aXRoIGNhcmdvCisvLworLy8gICAtIGEgbG9jYWwgc3ViLW1vZHVsZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiBPVVRfRElSIGFuZCBpbmNsdWRlZCBpbiB0aGlzIGZpbGUKKy8vICAgLSB0aGUgZmVhdHVyZSAiY2FyZ28iIHdpbGwgYmUgZW5hYmxlZAorLy8KKy8vIFRoaXMgbW9kdWxlIGhpZGVzIHRoZXNlIGRpZmZlcmVuY2VzIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGNvZGViYXNlLgorCisvLyAtLS0tIFdoZW4gYnVpbGRpbmcgd2l0aCB0aGUgQW5kcm9pZCB0b29sLWNoYWluIC0tLS0KKyNbY2ZnKG5vdChmZWF0dXJlID0gImNhcmdvIikpXQorbW9kIGF1dG9fZ2VuZXJhdGVkIHsKKyAgICBwdWIgdXNlIGFjb25maWdfc3RvcmFnZV9wcm90b3M6OmFjb25maWdfc3RvcmFnZV9tZXRhZGF0YSBhcyBQcm90b1N0b3JhZ2U7CisgICAgcHViIHVzZSBQcm90b1N0b3JhZ2U6OlN0b3JhZ2VfZmlsZV9pbmZvIGFzIFByb3RvU3RvcmFnZUZpbGVJbmZvOworICAgIHB1YiB1c2UgUHJvdG9TdG9yYWdlOjpTdG9yYWdlX2ZpbGVzIGFzIFByb3RvU3RvcmFnZUZpbGVzOworfQorCisvLyAtLS0tIFdoZW4gYnVpbGRpbmcgd2l0aCBjYXJnbyAtLS0tCisjW2NmZyhmZWF0dXJlID0gImNhcmdvIildCittb2QgYXV0b19nZW5lcmF0ZWQgeworICAgIC8vIGluY2x1ZGUhIHN0YXRlbWVudHMgc2hvdWxkIGJlIGF2b2lkZWQgKGJlY2F1c2UgdGhleSBpbXBvcnQgZmlsZSBjb250ZW50cyB2ZXJiYXRpbSksIGJ1dAorICAgIC8vIGJlY2F1c2UgdGhpcyBpcyBvbmx5IHVzZWQgZHVyaW5nIGxvY2FsIGRldmVsb3BtZW50LCBhbmQgb25seSBpZiB1c2luZyBjYXJnbyBpbnN0ZWFkIG9mIHRoZQorICAgIC8vIEFuZHJvaWQgdG9vbC1jaGFpbiwgd2UgYWxsb3cgaXQKKyAgICBpbmNsdWRlIShjb25jYXQhKGVudiEoIk9VVF9ESVIiKSwgIi9hY29uZmlnX3N0b3JhZ2VfcHJvdG9zL21vZC5ycyIpKTsKKyAgICBwdWIgdXNlIGFjb25maWdfc3RvcmFnZV9tZXRhZGF0YTo6U3RvcmFnZV9maWxlX2luZm8gYXMgUHJvdG9TdG9yYWdlRmlsZUluZm87CisgICAgcHViIHVzZSBhY29uZmlnX3N0b3JhZ2VfbWV0YWRhdGE6OlN0b3JhZ2VfZmlsZXMgYXMgUHJvdG9TdG9yYWdlRmlsZXM7Cit9CisKKy8vIC0tLS0gQ29tbW9uIGZvciBib3RoIHRoZSBBbmRyb2lkIHRvb2wtY2hhaW4gYW5kIGNhcmdvIC0tLS0KK3B1YiB1c2UgYXV0b19nZW5lcmF0ZWQ6Oio7CisKK3VzZSBhbnlob3c6OlJlc3VsdDsKK3VzZSBwcm90b2J1Zjo6TWVzc2FnZTsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSB0ZW1wZmlsZTo6TmFtZWRUZW1wRmlsZTsKKworcHViIG1vZCBzdG9yYWdlX3JlY29yZF9wYiB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhbnlob3c6OmVuc3VyZTsKKworICAgIHB1YiBmbiB0cnlfZnJvbV9iaW5hcnlfcHJvdG8oYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8UHJvdG9TdG9yYWdlRmlsZXM+IHsKKyAgICAgICAgbGV0IG1lc3NhZ2U6IFByb3RvU3RvcmFnZUZpbGVzID0gcHJvdG9idWY6Ok1lc3NhZ2U6OnBhcnNlX2Zyb21fYnl0ZXMoYnl0ZXMpPzsKKyAgICAgICAgdmVyaWZ5X2ZpZWxkcygmbWVzc2FnZSk/OworICAgICAgICBPayhtZXNzYWdlKQorICAgIH0KKworICAgIHB1YiBmbiB2ZXJpZnlfZmllbGRzKHN0b3JhZ2VfZmlsZXM6ICZQcm90b1N0b3JhZ2VGaWxlcykgLT4gUmVzdWx0PCgpPiB7CisgICAgICAgIGZvciBzdG9yYWdlX2ZpbGVfaW5mbyBpbiBzdG9yYWdlX2ZpbGVzLmZpbGVzLml0ZXIoKSB7CisgICAgICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgICAgICFzdG9yYWdlX2ZpbGVfaW5mby5wYWNrYWdlX21hcCgpLmlzX2VtcHR5KCksCisgICAgICAgICAgICAgICAgImludmFsaWQgc3RvcmFnZSBmaWxlIHJlY29yZDogbWlzc2luZyBwYWNrYWdlIG1hcCBmaWxlIGZvciBjb250YWluZXIge30iLAorICAgICAgICAgICAgICAgIHN0b3JhZ2VfZmlsZV9pbmZvLmNvbnRhaW5lcigpCisgICAgICAgICAgICApOworICAgICAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgICAgICAhc3RvcmFnZV9maWxlX2luZm8uZmxhZ19tYXAoKS5pc19lbXB0eSgpLAorICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0b3JhZ2UgZmlsZSByZWNvcmQ6IG1pc3NpbmcgZmxhZyBtYXAgZmlsZSBmb3IgY29udGFpbmVyIHt9IiwKKyAgICAgICAgICAgICAgICBzdG9yYWdlX2ZpbGVfaW5mby5jb250YWluZXIoKQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGVuc3VyZSEoCisgICAgICAgICAgICAgICAgIXN0b3JhZ2VfZmlsZV9pbmZvLmZsYWdfdmFsKCkuaXNfZW1wdHkoKSwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBzdG9yYWdlIGZpbGUgcmVjb3JkOiBtaXNzaW5nIGZsYWcgdmFsIGZpbGUgZm9yIGNvbnRhaW5lciB7fSIsCisgICAgICAgICAgICAgICAgc3RvcmFnZV9maWxlX2luZm8uY29udGFpbmVyKCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgcHViIGZuIGdldF9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG86ICZzdHIpIC0+IFJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIGxldCBzdG9yYWdlX2ZpbGVzOiBQcm90b1N0b3JhZ2VGaWxlcyA9IHByb3RvYnVmOjp0ZXh0X2Zvcm1hdDo6cGFyc2VfZnJvbV9zdHIodGV4dF9wcm90byk/OworICAgICAgICBsZXQgbXV0IGJpbmFyeV9wcm90byA9IFZlYzo6bmV3KCk7CisgICAgICAgIHN0b3JhZ2VfZmlsZXMud3JpdGVfdG9fdmVjKCZtdXQgYmluYXJ5X3Byb3RvKT87CisgICAgICAgIE9rKGJpbmFyeV9wcm90bykKKyAgICB9CisKKyAgICBwdWIgZm4gd3JpdGVfcHJvdG9fdG9fdGVtcF9maWxlKHRleHRfcHJvdG86ICZzdHIpIC0+IFJlc3VsdDxOYW1lZFRlbXBGaWxlPiB7CisgICAgICAgIGxldCBieXRlcyA9IGdldF9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcCgpOworICAgICAgICBsZXQgbXV0IGZpbGUgPSBOYW1lZFRlbXBGaWxlOjpuZXcoKT87CisgICAgICAgIGxldCBfID0gZmlsZS53cml0ZV9hbGwoJmJ5dGVzKTsKKyAgICAgICAgT2soZmlsZSkKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZV9zdG9yYWdlX3JlY29yZF9wYigpIHsKKyAgICAgICAgbGV0IHRleHRfcHJvdG8gPSByIyIKK2ZpbGVzIHsKKyAgICB2ZXJzaW9uOiAwCisgICAgY29udGFpbmVyOiAic3lzdGVtIgorICAgIHBhY2thZ2VfbWFwOiAiL3N5c3RlbS9ldGMvcGFja2FnZS5tYXAiCisgICAgZmxhZ19tYXA6ICIvc3lzdGVtL2V0Yy9mbGFnLm1hcCIKKyAgICBmbGFnX3ZhbDogIi9tZXRhZGF0YS9hY29uZmlnL3N5c3RlbS52YWwiCisgICAgdGltZXN0YW1wOiAxMjM0NQorfQorZmlsZXMgeworICAgIHZlcnNpb246IDEKKyAgICBjb250YWluZXI6ICJwcm9kdWN0IgorICAgIHBhY2thZ2VfbWFwOiAiL3Byb2R1Y3QvZXRjL3BhY2thZ2UubWFwIgorICAgIGZsYWdfbWFwOiAiL3Byb2R1Y3QvZXRjL2ZsYWcubWFwIgorICAgIGZsYWdfdmFsOiAiL21ldGFkYXRhL2Fjb25maWcvcHJvZHVjdC52YWwiCisgICAgdGltZXN0YW1wOiA1NDMyMQorfQorIiM7CisgICAgICAgIGxldCBiaW5hcnlfcHJvdG9fYnl0ZXMgPQorICAgICAgICAgICAgc3RvcmFnZV9yZWNvcmRfcGI6OmdldF9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcCgpOworICAgICAgICBsZXQgc3RvcmFnZV9maWxlcyA9IHN0b3JhZ2VfcmVjb3JkX3BiOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmJpbmFyeV9wcm90b19ieXRlcykudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoc3RvcmFnZV9maWxlcy5maWxlcy5sZW4oKSwgMik7CisgICAgICAgIGxldCBzeXN0ZW1fZmlsZSA9ICZzdG9yYWdlX2ZpbGVzLmZpbGVzWzBdOworICAgICAgICBhc3NlcnRfZXEhKHN5c3RlbV9maWxlLnZlcnNpb24oKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoc3lzdGVtX2ZpbGUuY29udGFpbmVyKCksICJzeXN0ZW0iKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzeXN0ZW1fZmlsZS5wYWNrYWdlX21hcCgpLCAiL3N5c3RlbS9ldGMvcGFja2FnZS5tYXAiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzeXN0ZW1fZmlsZS5mbGFnX21hcCgpLCAiL3N5c3RlbS9ldGMvZmxhZy5tYXAiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzeXN0ZW1fZmlsZS5mbGFnX3ZhbCgpLCAiL21ldGFkYXRhL2Fjb25maWcvc3lzdGVtLnZhbCIpOworICAgICAgICBhc3NlcnRfZXEhKHN5c3RlbV9maWxlLnRpbWVzdGFtcCgpLCAxMjM0NSk7CisgICAgICAgIGxldCBwcm9kdWN0X2ZpbGUgPSAmc3RvcmFnZV9maWxlcy5maWxlc1sxXTsKKyAgICAgICAgYXNzZXJ0X2VxIShwcm9kdWN0X2ZpbGUudmVyc2lvbigpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwcm9kdWN0X2ZpbGUuY29udGFpbmVyKCksICJwcm9kdWN0Iik7CisgICAgICAgIGFzc2VydF9lcSEocHJvZHVjdF9maWxlLnBhY2thZ2VfbWFwKCksICIvcHJvZHVjdC9ldGMvcGFja2FnZS5tYXAiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwcm9kdWN0X2ZpbGUuZmxhZ19tYXAoKSwgIi9wcm9kdWN0L2V0Yy9mbGFnLm1hcCIpOworICAgICAgICBhc3NlcnRfZXEhKHByb2R1Y3RfZmlsZS5mbGFnX3ZhbCgpLCAiL21ldGFkYXRhL2Fjb25maWcvcHJvZHVjdC52YWwiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwcm9kdWN0X2ZpbGUudGltZXN0YW1wKCksIDU0MzIxKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZV9pbnZhbGlkX3N0b3JhZ2VfcmVjb3JkX3BiKCkgeworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorZmlsZXMgeworICAgIHZlcnNpb246IDAKKyAgICBjb250YWluZXI6ICJzeXN0ZW0iCisgICAgcGFja2FnZV9tYXA6ICIiCisgICAgZmxhZ19tYXA6ICIvc3lzdGVtL2V0Yy9mbGFnLm1hcCIKKyAgICBmbGFnX3ZhbDogIi9tZXRhZGF0YS9hY29uZmlnL3N5c3RlbS52YWwiCisgICAgdGltZXN0YW1wOiAxMjM0NQorfQorIiM7CisgICAgICAgIGxldCBiaW5hcnlfcHJvdG9fYnl0ZXMgPQorICAgICAgICAgICAgc3RvcmFnZV9yZWNvcmRfcGI6OmdldF9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcCgpOworICAgICAgICBsZXQgZXJyID0gc3RvcmFnZV9yZWNvcmRfcGI6OnRyeV9mcm9tX2JpbmFyeV9wcm90bygmYmluYXJ5X3Byb3RvX2J5dGVzKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyKSwKKyAgICAgICAgICAgICJpbnZhbGlkIHN0b3JhZ2UgZmlsZSByZWNvcmQ6IG1pc3NpbmcgcGFja2FnZSBtYXAgZmlsZSBmb3IgY29udGFpbmVyIHN5c3RlbSIKKyAgICAgICAgKTsKKworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorZmlsZXMgeworICAgIHZlcnNpb246IDAKKyAgICBjb250YWluZXI6ICJzeXN0ZW0iCisgICAgcGFja2FnZV9tYXA6ICIvc3lzdGVtL2V0Yy9wYWNrYWdlLm1hcCIKKyAgICBmbGFnX21hcDogIiIKKyAgICBmbGFnX3ZhbDogIi9tZXRhZGF0YS9hY29uZmlnL3N5c3RlbS52YWwiCisgICAgdGltZXN0YW1wOiAxMjM0NQorfQorIiM7CisgICAgICAgIGxldCBiaW5hcnlfcHJvdG9fYnl0ZXMgPQorICAgICAgICAgICAgc3RvcmFnZV9yZWNvcmRfcGI6OmdldF9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcCgpOworICAgICAgICBsZXQgZXJyID0gc3RvcmFnZV9yZWNvcmRfcGI6OnRyeV9mcm9tX2JpbmFyeV9wcm90bygmYmluYXJ5X3Byb3RvX2J5dGVzKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyKSwKKyAgICAgICAgICAgICJpbnZhbGlkIHN0b3JhZ2UgZmlsZSByZWNvcmQ6IG1pc3NpbmcgZmxhZyBtYXAgZmlsZSBmb3IgY29udGFpbmVyIHN5c3RlbSIKKyAgICAgICAgKTsKKworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorZmlsZXMgeworICAgIHZlcnNpb246IDAKKyAgICBjb250YWluZXI6ICJzeXN0ZW0iCisgICAgcGFja2FnZV9tYXA6ICIvc3lzdGVtL2V0Yy9wYWNrYWdlLm1hcCIKKyAgICBmbGFnX21hcDogIi9zeXN0ZW0vZXRjL2ZsYWcubWFwIgorICAgIGZsYWdfdmFsOiAiIgorICAgIHRpbWVzdGFtcDogMTIzNDUKK30KKyIjOworICAgICAgICBsZXQgYmluYXJ5X3Byb3RvX2J5dGVzID0KKyAgICAgICAgICAgIHN0b3JhZ2VfcmVjb3JkX3BiOjpnZXRfYmluYXJ5X3Byb3RvX2Zyb21fdGV4dF9wcm90byh0ZXh0X3Byb3RvKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGVyciA9IHN0b3JhZ2VfcmVjb3JkX3BiOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmJpbmFyeV9wcm90b19ieXRlcykudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVyciksCisgICAgICAgICAgICAiaW52YWxpZCBzdG9yYWdlIGZpbGUgcmVjb3JkOiBtaXNzaW5nIGZsYWcgdmFsIGZpbGUgZm9yIGNvbnRhaW5lciBzeXN0ZW0iCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvdGVzdF91dGlscy5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3Rlc3RfdXRpbHMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2NjY2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3Rlc3RfdXRpbHMucnMKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgY3JhdGU6OmZsYWdfaW5mbzo6e0ZsYWdJbmZvSGVhZGVyLCBGbGFnSW5mb0xpc3QsIEZsYWdJbmZvTm9kZX07Cit1c2UgY3JhdGU6OmZsYWdfdGFibGU6OntGbGFnVGFibGUsIEZsYWdUYWJsZUhlYWRlciwgRmxhZ1RhYmxlTm9kZX07Cit1c2UgY3JhdGU6OmZsYWdfdmFsdWU6OntGbGFnVmFsdWVIZWFkZXIsIEZsYWdWYWx1ZUxpc3R9OwordXNlIGNyYXRlOjpwYWNrYWdlX3RhYmxlOjp7UGFja2FnZVRhYmxlLCBQYWNrYWdlVGFibGVIZWFkZXIsIFBhY2thZ2VUYWJsZU5vZGV9OwordXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBTdG9yZWRGbGFnVHlwZX07CisKK3VzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSB0ZW1wZmlsZTo6TmFtZWRUZW1wRmlsZTsKKworcHViIGZuIGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKSAtPiBQYWNrYWdlVGFibGUgeworICAgIGxldCBoZWFkZXIgPSBQYWNrYWdlVGFibGVIZWFkZXIgeworICAgICAgICB2ZXJzaW9uOiAxLAorICAgICAgICBjb250YWluZXI6IFN0cmluZzo6ZnJvbSgibW9ja3VwIiksCisgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwIGFzIHU4LAorICAgICAgICBmaWxlX3NpemU6IDIwOSwKKyAgICAgICAgbnVtX3BhY2thZ2VzOiAzLAorICAgICAgICBidWNrZXRfb2Zmc2V0OiAzMSwKKyAgICAgICAgbm9kZV9vZmZzZXQ6IDU5LAorICAgIH07CisgICAgbGV0IGJ1Y2tldHM6IFZlYzxPcHRpb248dTMyPj4gPSB2ZWMhW1NvbWUoNTkpLCBOb25lLCBOb25lLCBTb21lKDEwOSksIE5vbmUsIE5vbmUsIE5vbmVdOworICAgIGxldCBmaXJzdF9ub2RlID0gUGFja2FnZVRhYmxlTm9kZSB7CisgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiksCisgICAgICAgIHBhY2thZ2VfaWQ6IDEsCisgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDMsCisgICAgICAgIG5leHRfb2Zmc2V0OiBOb25lLAorICAgIH07CisgICAgbGV0IHNlY29uZF9ub2RlID0gUGFja2FnZVRhYmxlTm9kZSB7CisgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiksCisgICAgICAgIHBhY2thZ2VfaWQ6IDAsCisgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDAsCisgICAgICAgIG5leHRfb2Zmc2V0OiBTb21lKDE1OSksCisgICAgfTsKKyAgICBsZXQgdGhpcmRfbm9kZSA9IFBhY2thZ2VUYWJsZU5vZGUgeworICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpLAorICAgICAgICBwYWNrYWdlX2lkOiAyLAorICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiA2LAorICAgICAgICBuZXh0X29mZnNldDogTm9uZSwKKyAgICB9OworICAgIGxldCBub2RlcyA9IHZlYyFbZmlyc3Rfbm9kZSwgc2Vjb25kX25vZGUsIHRoaXJkX25vZGVdOworICAgIFBhY2thZ2VUYWJsZSB7IGhlYWRlciwgYnVja2V0cywgbm9kZXMgfQorfQorCitpbXBsIEZsYWdUYWJsZU5vZGUgeworICAgIC8vIGNyZWF0ZSB0ZXN0IGJhc2VsaW5lLCBzeW50YWN0aWMgc3VnYXIKKyAgICBmbiBuZXdfZXhwZWN0ZWQoCisgICAgICAgIHBhY2thZ2VfaWQ6IHUzMiwKKyAgICAgICAgZmxhZ19uYW1lOiAmc3RyLAorICAgICAgICBmbGFnX3R5cGU6IHUxNiwKKyAgICAgICAgZmxhZ19pbmRleDogdTE2LAorICAgICAgICBuZXh0X29mZnNldDogT3B0aW9uPHUzMj4sCisgICAgKSAtPiBTZWxmIHsKKyAgICAgICAgU2VsZiB7CisgICAgICAgICAgICBwYWNrYWdlX2lkLAorICAgICAgICAgICAgZmxhZ19uYW1lOiBmbGFnX25hbWUudG9fc3RyaW5nKCksCisgICAgICAgICAgICBmbGFnX3R5cGU6IFN0b3JlZEZsYWdUeXBlOjp0cnlfZnJvbShmbGFnX3R5cGUpLnVud3JhcCgpLAorICAgICAgICAgICAgZmxhZ19pbmRleCwKKyAgICAgICAgICAgIG5leHRfb2Zmc2V0LAorICAgICAgICB9CisgICAgfQorfQorCitwdWIgZm4gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpIC0+IEZsYWdUYWJsZSB7CisgICAgbGV0IGhlYWRlciA9IEZsYWdUYWJsZUhlYWRlciB7CisgICAgICAgIHZlcnNpb246IDEsCisgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKCJtb2NrdXAiKSwKKyAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAgYXMgdTgsCisgICAgICAgIGZpbGVfc2l6ZTogMzIxLAorICAgICAgICBudW1fZmxhZ3M6IDgsCisgICAgICAgIGJ1Y2tldF9vZmZzZXQ6IDMxLAorICAgICAgICBub2RlX29mZnNldDogOTksCisgICAgfTsKKyAgICBsZXQgYnVja2V0czogVmVjPE9wdGlvbjx1MzI+PiA9IHZlYyFbCisgICAgICAgIFNvbWUoOTkpLAorICAgICAgICBTb21lKDEyNSksCisgICAgICAgIE5vbmUsCisgICAgICAgIE5vbmUsCisgICAgICAgIE5vbmUsCisgICAgICAgIE5vbmUsCisgICAgICAgIFNvbWUoMTc3KSwKKyAgICAgICAgU29tZSgyMDQpLAorICAgICAgICBOb25lLAorICAgICAgICBTb21lKDI2MiksCisgICAgICAgIE5vbmUsCisgICAgICAgIE5vbmUsCisgICAgICAgIE5vbmUsCisgICAgICAgIE5vbmUsCisgICAgICAgIE5vbmUsCisgICAgICAgIFNvbWUoMjk0KSwKKyAgICAgICAgTm9uZSwKKyAgICBdOworICAgIGxldCBub2RlcyA9IHZlYyFbCisgICAgICAgIEZsYWdUYWJsZU5vZGU6Om5ld19leHBlY3RlZCgwLCAiZW5hYmxlZF9ybyIsIDEsIDEsIE5vbmUpLAorICAgICAgICBGbGFnVGFibGVOb2RlOjpuZXdfZXhwZWN0ZWQoMCwgImVuYWJsZWRfcnciLCAwLCAyLCBTb21lKDE1MSkpLAorICAgICAgICBGbGFnVGFibGVOb2RlOjpuZXdfZXhwZWN0ZWQoMiwgImVuYWJsZWRfcnciLCAwLCAxLCBOb25lKSwKKyAgICAgICAgRmxhZ1RhYmxlTm9kZTo6bmV3X2V4cGVjdGVkKDEsICJkaXNhYmxlZF9ydyIsIDAsIDAsIE5vbmUpLAorICAgICAgICBGbGFnVGFibGVOb2RlOjpuZXdfZXhwZWN0ZWQoMSwgImVuYWJsZWRfZml4ZWRfcm8iLCAyLCAxLCBTb21lKDIzNikpLAorICAgICAgICBGbGFnVGFibGVOb2RlOjpuZXdfZXhwZWN0ZWQoMSwgImVuYWJsZWRfcm8iLCAxLCAyLCBOb25lKSwKKyAgICAgICAgRmxhZ1RhYmxlTm9kZTo6bmV3X2V4cGVjdGVkKDIsICJlbmFibGVkX2ZpeGVkX3JvIiwgMiwgMCwgTm9uZSksCisgICAgICAgIEZsYWdUYWJsZU5vZGU6Om5ld19leHBlY3RlZCgwLCAiZGlzYWJsZWRfcnciLCAwLCAwLCBOb25lKSwKKyAgICBdOworICAgIEZsYWdUYWJsZSB7IGhlYWRlciwgYnVja2V0cywgbm9kZXMgfQorfQorCitwdWIgZm4gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KCkgLT4gRmxhZ1ZhbHVlTGlzdCB7CisgICAgbGV0IGhlYWRlciA9IEZsYWdWYWx1ZUhlYWRlciB7CisgICAgICAgIHZlcnNpb246IDEsCisgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKCJtb2NrdXAiKSwKKyAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwgYXMgdTgsCisgICAgICAgIGZpbGVfc2l6ZTogMzUsCisgICAgICAgIG51bV9mbGFnczogOCwKKyAgICAgICAgYm9vbGVhbl92YWx1ZV9vZmZzZXQ6IDI3LAorICAgIH07CisgICAgbGV0IGJvb2xlYW5zOiBWZWM8Ym9vbD4gPSB2ZWMhW2ZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV07CisgICAgRmxhZ1ZhbHVlTGlzdCB7IGhlYWRlciwgYm9vbGVhbnMgfQorfQorCitwdWIgZm4gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKSAtPiBGbGFnSW5mb0xpc3QgeworICAgIGxldCBoZWFkZXIgPSBGbGFnSW5mb0hlYWRlciB7CisgICAgICAgIHZlcnNpb246IDEsCisgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKCJtb2NrdXAiKSwKKyAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OkZsYWdJbmZvIGFzIHU4LAorICAgICAgICBmaWxlX3NpemU6IDM1LAorICAgICAgICBudW1fZmxhZ3M6IDgsCisgICAgICAgIGJvb2xlYW5fZmxhZ19vZmZzZXQ6IDI3LAorICAgIH07CisgICAgbGV0IGlzX2ZsYWdfcncgPSBbdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWVdOworICAgIGxldCBub2RlcyA9IGlzX2ZsYWdfcncuaXRlcigpLm1hcCh8JnJ3fCBGbGFnSW5mb05vZGU6OmNyZWF0ZShydykpLmNvbGxlY3QoKTsKKyAgICBGbGFnSW5mb0xpc3QgeyBoZWFkZXIsIG5vZGVzIH0KK30KKworcHViIGZuIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZShieXRlczogJlt1OF0pIC0+IFJlc3VsdDxOYW1lZFRlbXBGaWxlLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IG11dCBmaWxlID0gTmFtZWRUZW1wRmlsZTo6bmV3KCkubWFwX2Vycih8X3wgeworICAgICAgICBBY29uZmlnU3RvcmFnZUVycm9yOjpGaWxlQ3JlYXRpb25GYWlsKGFueWhvdyEoIkZhaWxlZCB0byBjcmVhdGUgdGVtcCBmaWxlIikpCisgICAgfSk/OworICAgIGxldCBfID0gZmlsZS53cml0ZV9hbGwoJmJ5dGVzKTsKKyAgICBPayhmaWxlKQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlRXhjZXB0aW9uLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE3NWYyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK3B1YmxpYyBjbGFzcyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIHB1YmxpYyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQnl0ZUJ1ZmZlclJlYWRlci5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0J5dGVCdWZmZXJSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzcyMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0J5dGVCdWZmZXJSZWFkZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworcHVibGljIGNsYXNzIEJ5dGVCdWZmZXJSZWFkZXIgeworCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1CeXRlQnVmZmVyOworCisgICAgcHVibGljIEJ5dGVCdWZmZXJSZWFkZXIoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyKSB7CisgICAgICAgIHRoaXMubUJ5dGVCdWZmZXIgPSBieXRlQnVmZmVyOworICAgICAgICB0aGlzLm1CeXRlQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRCeXRlKCkgeworICAgICAgICByZXR1cm4gQnl0ZS50b1Vuc2lnbmVkSW50KG1CeXRlQnVmZmVyLmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRTaG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIFNob3J0LnRvVW5zaWduZWRJbnQobUJ5dGVCdWZmZXIuZ2V0U2hvcnQoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkSW50KCkgeworICAgICAgICByZXR1cm4gdGhpcy5tQnl0ZUJ1ZmZlci5nZXRJbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgICAgIGludCBsZW5ndGggPSByZWFkSW50KCk7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIG1CeXRlQnVmZmVyLmdldChieXRlcywgMCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc2l0aW9uKGludCBuZXdQb3NpdGlvbikgeworICAgICAgICBtQnl0ZUJ1ZmZlci5wb3NpdGlvbihuZXdQb3NpdGlvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZpbGVUeXBlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmlsZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGIxYjliCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZpbGVUeXBlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK3B1YmxpYyBlbnVtIEZpbGVUeXBlIHsKKyAgICBQQUNLQUdFX01BUCgwKSwKKyAgICBGTEFHX01BUCgxKSwKKyAgICBGTEFHX1ZBTCgyKSwKKyAgICBGTEFHX0lORk8oMyk7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7CisKKyAgICBGaWxlVHlwZShpbnQgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZVR5cGUgZnJvbUludChpbnQgaW5kZXgpIHsKKyAgICAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBQQUNLQUdFX01BUDsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gRkxBR19NQVA7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMQUdfVkFMOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHJldHVybiBGTEFHX0lORk87CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUYWJsZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWZkZWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1RhYmxlLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitwdWJsaWMgY2xhc3MgRmxhZ1RhYmxlIHsKKworICAgIHByaXZhdGUgSGVhZGVyIG1IZWFkZXI7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBOb2RlPiBtTm9kZU1hcDsKKworICAgIHB1YmxpYyBzdGF0aWMgRmxhZ1RhYmxlIGZyb21CeXRlcyhCeXRlQnVmZmVyIGJ5dGVzKSB7CisgICAgICAgIEZsYWdUYWJsZSBmbGFnVGFibGUgPSBuZXcgRmxhZ1RhYmxlKCk7CisgICAgICAgIEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyID0gbmV3IEJ5dGVCdWZmZXJSZWFkZXIoYnl0ZXMpOworICAgICAgICBIZWFkZXIgaGVhZGVyID0gSGVhZGVyLmZyb21CeXRlcyhyZWFkZXIpOworICAgICAgICBmbGFnVGFibGUubUhlYWRlciA9IGhlYWRlcjsKKyAgICAgICAgZmxhZ1RhYmxlLm1Ob2RlTWFwID0gbmV3IEhhc2hNYXAoVGFibGVVdGlscy5nZXRUYWJsZVNpemUoaGVhZGVyLm1OdW1GbGFncykpOworICAgICAgICByZWFkZXIucG9zaXRpb24oaGVhZGVyLm1Ob2RlT2Zmc2V0KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXIubU51bUZsYWdzOyBpKyspIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IE5vZGUuZnJvbUJ5dGVzKHJlYWRlcik7CisgICAgICAgICAgICBmbGFnVGFibGUubU5vZGVNYXAucHV0KG1ha2VLZXkobm9kZS5tUGFja2FnZUlkLCBub2RlLm1GbGFnTmFtZSksIG5vZGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmbGFnVGFibGU7CisgICAgfQorCisgICAgcHVibGljIE5vZGUgZ2V0KGludCBwYWNrYWdlSWQsIFN0cmluZyBmbGFnTmFtZSkgeworICAgICAgICByZXR1cm4gbU5vZGVNYXAuZ2V0KG1ha2VLZXkocGFja2FnZUlkLCBmbGFnTmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyBIZWFkZXIgZ2V0SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gbUhlYWRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZUtleShpbnQgcGFja2FnZUlkLCBTdHJpbmcgZmxhZ05hbWUpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByZXR1cm4gcmV0LmFwcGVuZChwYWNrYWdlSWQpLmFwcGVuZCgnLycpLmFwcGVuZChmbGFnTmFtZSkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlYWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVZlcnNpb247CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Db250YWluZXI7CisgICAgICAgIHByaXZhdGUgRmlsZVR5cGUgbUZpbGVUeXBlOworICAgICAgICBwcml2YXRlIGludCBtRmlsZVNpemU7CisgICAgICAgIHByaXZhdGUgaW50IG1OdW1GbGFnczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUJ1Y2tldE9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU5vZGVPZmZzZXQ7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBIZWFkZXIgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworICAgICAgICAgICAgaGVhZGVyLm1WZXJzaW9uID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tQ29udGFpbmVyID0gcmVhZGVyLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGhlYWRlci5tRmlsZVR5cGUgPSBGaWxlVHlwZS5mcm9tSW50KHJlYWRlci5yZWFkQnl0ZSgpKTsKKyAgICAgICAgICAgIGhlYWRlci5tRmlsZVNpemUgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1OdW1GbGFncyA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubUJ1Y2tldE9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubU5vZGVPZmZzZXQgPSByZWFkZXIucmVhZEludCgpOworCisgICAgICAgICAgICBpZiAoaGVhZGVyLm1GaWxlVHlwZSAhPSBGaWxlVHlwZS5GTEFHX01BUCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigiYmluYXJ5IGZpbGUgaXMgbm90IGEgZmxhZyBtYXAiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhlYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250YWluZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZVR5cGUgZ2V0RmlsZVR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZpbGVUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRGaWxlU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmlsZVNpemU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE51bUZsYWdzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OdW1GbGFnczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QnVja2V0T2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1CdWNrZXRPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE5vZGVPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5vZGVPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vZGUgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1GbGFnTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBGbGFnVHlwZSBtRmxhZ1R5cGU7CisgICAgICAgIHByaXZhdGUgaW50IG1QYWNrYWdlSWQ7CisgICAgICAgIHByaXZhdGUgaW50IG1GbGFnSW5kZXg7CisgICAgICAgIHByaXZhdGUgaW50IG1OZXh0T2Zmc2V0OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTm9kZSBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG5ldyBOb2RlKCk7CisgICAgICAgICAgICBub2RlLm1QYWNrYWdlSWQgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tRmxhZ05hbWUgPSByZWFkZXIucmVhZFN0cmluZygpOworICAgICAgICAgICAgbm9kZS5tRmxhZ1R5cGUgPSBGbGFnVHlwZS5mcm9tSW50KHJlYWRlci5yZWFkU2hvcnQoKSk7CisgICAgICAgICAgICBub2RlLm1GbGFnSW5kZXggPSByZWFkZXIucmVhZFNob3J0KCk7CisgICAgICAgICAgICBub2RlLm1OZXh0T2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG5vZGUubU5leHRPZmZzZXQgPSBub2RlLm1OZXh0T2Zmc2V0ID09IDAgPyAtMSA6IG5vZGUubU5leHRPZmZzZXQ7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChtRmxhZ05hbWUsIG1GbGFnVHlwZSwgbVBhY2thZ2VJZCwgbUZsYWdJbmRleCwgbU5leHRPZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgTm9kZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE5vZGUgb3RoZXIgPSAoTm9kZSkgb2JqOworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKG1GbGFnTmFtZSwgb3RoZXIubUZsYWdOYW1lKQorICAgICAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyhtRmxhZ1R5cGUsIG90aGVyLm1GbGFnVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbVBhY2thZ2VJZCA9PSBvdGhlci5tUGFja2FnZUlkCisgICAgICAgICAgICAgICAgICAgICYmIG1GbGFnSW5kZXggPT0gb3RoZXIubUZsYWdJbmRleAorICAgICAgICAgICAgICAgICAgICAmJiBtTmV4dE9mZnNldCA9PSBvdGhlci5tTmV4dE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmxhZ05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZsYWdOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZsYWdUeXBlIGdldEZsYWdUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GbGFnVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UGFja2FnZUlkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWNrYWdlSWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEZsYWdJbmRleCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmxhZ0luZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXROZXh0T2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1OZXh0T2Zmc2V0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUeXBlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODVlMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUeXBlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK3B1YmxpYyBlbnVtIEZsYWdUeXBlIHsKKyAgICBSZWFkV3JpdGVCb29sZWFuICgwKSwKKyAgICBSZWFkT25seUJvb2xlYW4oMSksCisgICAgRml4ZWRSZWFkT25seUJvb2xlYW4oMik7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7CisKKyAgICBGbGFnVHlwZShpbnQgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmxhZ1R5cGUgZnJvbUludChpbnQgaW5kZXgpIHsKKyAgICAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBSZWFkV3JpdGVCb29sZWFuOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHJldHVybiBSZWFkT25seUJvb2xlYW47CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZpeGVkUmVhZE9ubHlCb29sZWFuOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVmFsdWVMaXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1ZhbHVlTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZGMxNDcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1ZhbHVlTGlzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEZsYWdWYWx1ZUxpc3QgeworCisgICAgcHJpdmF0ZSBIZWFkZXIgbUhlYWRlcjsKKyAgICBwcml2YXRlIExpc3Q8Qm9vbGVhbj4gbUxpc3Q7CisKKyAgICBwcml2YXRlIGludCBtU2l6ZTsKKworICAgIHB1YmxpYyBzdGF0aWMgRmxhZ1ZhbHVlTGlzdCBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlciBieXRlcykgeworICAgICAgICBGbGFnVmFsdWVMaXN0IGZsYWdWYWx1ZUxpc3QgPSBuZXcgRmxhZ1ZhbHVlTGlzdCgpOworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ5dGVzKTsKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IEhlYWRlci5mcm9tQnl0ZXMocmVhZGVyKTsKKyAgICAgICAgZmxhZ1ZhbHVlTGlzdC5tSGVhZGVyID0gaGVhZGVyOworICAgICAgICBmbGFnVmFsdWVMaXN0Lm1MaXN0ID0gbmV3IEFycmF5TGlzdChoZWFkZXIubU51bUZsYWdzKTsKKyAgICAgICAgcmVhZGVyLnBvc2l0aW9uKGhlYWRlci5tQm9vbGVhblZhbHVlT2Zmc2V0KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXIubU51bUZsYWdzOyBpKyspIHsKKyAgICAgICAgICAgIGJvb2xlYW4gdmFsID0gcmVhZGVyLnJlYWRCeXRlKCkgPT0gMTsKKyAgICAgICAgICAgIGZsYWdWYWx1ZUxpc3QubUxpc3QuYWRkKHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ1ZhbHVlTGlzdC5tU2l6ZSA9IGZsYWdWYWx1ZUxpc3QubUxpc3Quc2l6ZSgpOworICAgICAgICByZXR1cm4gZmxhZ1ZhbHVlTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXQoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBtTGlzdC5nZXQoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBIZWFkZXIgZ2V0SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gbUhlYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBtU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlYWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVZlcnNpb247CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Db250YWluZXI7CisgICAgICAgIHByaXZhdGUgRmlsZVR5cGUgbUZpbGVUeXBlOworICAgICAgICBwcml2YXRlIGludCBtRmlsZVNpemU7CisgICAgICAgIHByaXZhdGUgaW50IG1OdW1GbGFnczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUJvb2xlYW5WYWx1ZU9mZnNldDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgICAgICBoZWFkZXIubVZlcnNpb24gPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1Db250YWluZXIgPSByZWFkZXIucmVhZFN0cmluZygpOworICAgICAgICAgICAgaGVhZGVyLm1GaWxlVHlwZSA9IEZpbGVUeXBlLmZyb21JbnQocmVhZGVyLnJlYWRCeXRlKCkpOworICAgICAgICAgICAgaGVhZGVyLm1GaWxlU2l6ZSA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubU51bUZsYWdzID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tQm9vbGVhblZhbHVlT2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoKTsKKworICAgICAgICAgICAgaWYgKGhlYWRlci5tRmlsZVR5cGUgIT0gRmlsZVR5cGUuRkxBR19WQUwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oImJpbmFyeSBmaWxlIGlzIG5vdCBhIGZsYWcgdmFsdWUgZmlsZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1WZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbnRhaW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlVHlwZSBnZXRGaWxlVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmlsZVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEZpbGVTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GaWxlU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TnVtRmxhZ3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbU51bUZsYWdzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRCb29sZWFuVmFsdWVPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJvb2xlYW5WYWx1ZU9mZnNldDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlVGFibGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDRlMWFjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1BhY2thZ2VUYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworcHVibGljIGNsYXNzIFBhY2thZ2VUYWJsZSB7CisKKyAgICBwcml2YXRlIEhlYWRlciBtSGVhZGVyOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgTm9kZT4gbU5vZGVNYXA7CisKKyAgICBwdWJsaWMgc3RhdGljIFBhY2thZ2VUYWJsZSBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlciBieXRlcykgeworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0gbmV3IFBhY2thZ2VUYWJsZSgpOworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ5dGVzKTsKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IEhlYWRlci5mcm9tQnl0ZXMocmVhZGVyKTsKKyAgICAgICAgcGFja2FnZVRhYmxlLm1IZWFkZXIgPSBoZWFkZXI7CisgICAgICAgIHBhY2thZ2VUYWJsZS5tTm9kZU1hcCA9IG5ldyBIYXNoTWFwKFRhYmxlVXRpbHMuZ2V0VGFibGVTaXplKGhlYWRlci5tTnVtUGFja2FnZXMpKTsKKyAgICAgICAgcmVhZGVyLnBvc2l0aW9uKGhlYWRlci5tTm9kZU9mZnNldCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLm1OdW1QYWNrYWdlczsgaSsrKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBOb2RlLmZyb21CeXRlcyhyZWFkZXIpOworICAgICAgICAgICAgcGFja2FnZVRhYmxlLm1Ob2RlTWFwLnB1dChub2RlLm1QYWNrYWdlTmFtZSwgbm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhY2thZ2VUYWJsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9kZSBnZXQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHJldHVybiBtTm9kZU1hcC5nZXQocGFja2FnZU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBIZWFkZXIgZ2V0SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gbUhlYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlYWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVZlcnNpb247CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Db250YWluZXI7CisgICAgICAgIHByaXZhdGUgRmlsZVR5cGUgbUZpbGVUeXBlOworICAgICAgICBwcml2YXRlIGludCBtRmlsZVNpemU7CisgICAgICAgIHByaXZhdGUgaW50IG1OdW1QYWNrYWdlczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUJ1Y2tldE9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU5vZGVPZmZzZXQ7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBIZWFkZXIgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworICAgICAgICAgICAgaGVhZGVyLm1WZXJzaW9uID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tQ29udGFpbmVyID0gcmVhZGVyLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGhlYWRlci5tRmlsZVR5cGUgPSBGaWxlVHlwZS5mcm9tSW50KHJlYWRlci5yZWFkQnl0ZSgpKTsKKyAgICAgICAgICAgIGhlYWRlci5tRmlsZVNpemUgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1OdW1QYWNrYWdlcyA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubUJ1Y2tldE9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubU5vZGVPZmZzZXQgPSByZWFkZXIucmVhZEludCgpOworCisgICAgICAgICAgICBpZiAoaGVhZGVyLm1GaWxlVHlwZSAhPSBGaWxlVHlwZS5QQUNLQUdFX01BUCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigiYmluYXJ5IGZpbGUgaXMgbm90IGEgcGFja2FnZSBtYXAiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhlYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250YWluZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZVR5cGUgZ2V0RmlsZVR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZpbGVUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRGaWxlU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmlsZVNpemU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE51bVBhY2thZ2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OdW1QYWNrYWdlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QnVja2V0T2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1CdWNrZXRPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE5vZGVPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5vZGVPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vZGUgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVBhY2thZ2VJZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUJvb2xlYW5TdGFydEluZGV4OworICAgICAgICBwcml2YXRlIGludCBtTmV4dE9mZnNldDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIE5vZGUgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBuZXcgTm9kZSgpOworICAgICAgICAgICAgbm9kZS5tUGFja2FnZU5hbWUgPSByZWFkZXIucmVhZFN0cmluZygpOworICAgICAgICAgICAgbm9kZS5tUGFja2FnZUlkID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG5vZGUubUJvb2xlYW5TdGFydEluZGV4ID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG5vZGUubU5leHRPZmZzZXQgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tTmV4dE9mZnNldCA9IG5vZGUubU5leHRPZmZzZXQgPT0gMCA/IC0xIDogbm9kZS5tTmV4dE9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1QYWNrYWdlTmFtZSwgbVBhY2thZ2VJZCwgbUJvb2xlYW5TdGFydEluZGV4LCBtTmV4dE9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG9iaikgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBOb2RlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTm9kZSBvdGhlciA9IChOb2RlKSBvYmo7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMobVBhY2thZ2VOYW1lLCBvdGhlci5tUGFja2FnZU5hbWUpCisgICAgICAgICAgICAgICAgICAgICYmIG1QYWNrYWdlSWQgPT0gb3RoZXIubVBhY2thZ2VJZAorICAgICAgICAgICAgICAgICAgICAmJiBtQm9vbGVhblN0YXJ0SW5kZXggPT0gb3RoZXIubUJvb2xlYW5TdGFydEluZGV4CisgICAgICAgICAgICAgICAgICAgICYmIG1OZXh0T2Zmc2V0ID09IG90aGVyLm1OZXh0T2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFBhY2thZ2VJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFja2FnZUlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRCb29sZWFuU3RhcnRJbmRleCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQm9vbGVhblN0YXJ0SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE5leHRPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5leHRPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvVGFibGVVdGlscy5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1RhYmxlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTRiNTNiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1RhYmxlVXRpbHMuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworcHVibGljIGNsYXNzIFRhYmxlVXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gSEFTSF9QUklNRVMgPQorICAgICAgICAgICAgbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICA3LAorICAgICAgICAgICAgICAgIDE3LAorICAgICAgICAgICAgICAgIDI5LAorICAgICAgICAgICAgICAgIDUzLAorICAgICAgICAgICAgICAgIDk3LAorICAgICAgICAgICAgICAgIDE5MywKKyAgICAgICAgICAgICAgICAzODksCisgICAgICAgICAgICAgICAgNzY5LAorICAgICAgICAgICAgICAgIDE1NDMsCisgICAgICAgICAgICAgICAgMzA3OSwKKyAgICAgICAgICAgICAgICA2MTUxLAorICAgICAgICAgICAgICAgIDEyMjg5LAorICAgICAgICAgICAgICAgIDI0NTkzLAorICAgICAgICAgICAgICAgIDQ5MTU3LAorICAgICAgICAgICAgICAgIDk4MzE3LAorICAgICAgICAgICAgICAgIDE5NjYxMywKKyAgICAgICAgICAgICAgICAzOTMyNDEsCisgICAgICAgICAgICAgICAgNzg2NDMzLAorICAgICAgICAgICAgICAgIDE1NzI4NjksCisgICAgICAgICAgICAgICAgMzE0NTczOSwKKyAgICAgICAgICAgICAgICA2MjkxNDY5LAorICAgICAgICAgICAgICAgIDEyNTgyOTE3LAorICAgICAgICAgICAgICAgIDI1MTY1ODQzLAorICAgICAgICAgICAgICAgIDUwMzMxNjUzLAorICAgICAgICAgICAgICAgIDEwMDY2MzMxOSwKKyAgICAgICAgICAgICAgICAyMDEzMjY2MTEsCisgICAgICAgICAgICAgICAgNDAyNjUzMTg5LAorICAgICAgICAgICAgICAgIDgwNTMwNjQ1NywKKyAgICAgICAgICAgICAgICAxNjEwNjEyNzQxCisgICAgICAgICAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VGFibGVTaXplKGludCBudW1FbnRyaWVzKSB7CisgICAgICAgIGZvciAoaW50IGkgOiBIQVNIX1BSSU1FUykgeworICAgICAgICAgICAgaWYgKGkgPCAyICogbnVtRW50cmllcykgY29udGludWU7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oIk51bWJlciBvZiBpdGVtcyBpbiBhIGhhc2ggdGFibGUgZXhjZWVkcyBsaW1pdCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzMxMjdmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDYgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfZmlsZS50ZXN0LmNwcCIsCisgICAgdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfY29yZV9leHBlcmltZW50cyIsCisgICAgc3JjczogWworICAgICAgICAic3RvcmFnZV9maWxlX3Rlc3QuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJnbW9jayIsCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZV9jYyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICBdLAorICAgIGRhdGE6IFsKKyAgICAgICAgInBhY2thZ2UubWFwIiwKKyAgICAgICAgImZsYWcubWFwIiwKKyAgICAgICAgImZsYWcudmFsIiwKKyAgICAgICAgImZsYWcuaW5mbyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWworICAgICAgICAiZGV2aWNlLXRlc3RzIiwKKyAgICAgICAgImdlbmVyYWwtdGVzdHMiLAorICAgIF0sCit9CisKK2FuZHJvaWRfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlLnRlc3QuamF2YSIsCisgICAgdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfY29yZV9leHBlcmltZW50cyIsCisgICAgc3JjczogWworICAgICAgICAic3Jjcy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFjb25maWdfc3RvcmFnZV9maWxlX2phdmEiLAorICAgICAgICAiYW5kcm9pZHgudGVzdC5ydW5uZXIiLAorICAgICAgICAianVuaXQiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJ0ZXN0X2N1cnJlbnQiLAorICAgIHRlc3RfY29uZmlnOiAiQW5kcm9pZFN0b3JhZ2VKYXZlVGVzdC54bWwiLAorICAgIGRhdGE6IFsKKyAgICAgICAgInBhY2thZ2UubWFwIiwKKyAgICAgICAgImZsYWcubWFwIiwKKyAgICAgICAgImZsYWcudmFsIiwKKyAgICAgICAgImZsYWcuaW5mbyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWworICAgICAgICAiZ2VuZXJhbC10ZXN0cyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTAxODc5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QiPgorICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QiIC8+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWRTdG9yYWdlSmF2ZVRlc3QueG1sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkU3RvcmFnZUphdmVUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDUyZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkU3RvcmFnZUphdmVUZXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IGFjb25maWcgc3RvcmFnZSBqYXZhIHRlc3RzIj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iYWNvbmZpZ19zdG9yYWdlX2ZpbGUudGVzdC5qYXZhLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJwYWNrYWdlLm1hcC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9wYWNrYWdlLm1hcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZy5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvZmxhZy5tYXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWcudmFsLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL2ZsYWcudmFsIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnLmluZm8tPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvZmxhZy5pbmZvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMW0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZmxhZy5pbmZvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9mbGFnLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyM2VkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZmxhZy5pbmZvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZmxhZy5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2ZsYWcubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NjhmNTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2ZsYWcubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZmxhZy52YWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2ZsYWcudmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjAzZDQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2ZsYWcudmFsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvcGFja2FnZS5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3BhY2thZ2UubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDZhMDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3BhY2thZ2UubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9CeXRlQnVmZmVyUmVhZGVyVGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0J5dGVCdWZmZXJSZWFkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhODE2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9CeXRlQnVmZmVyUmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5CeXRlQnVmZmVyUmVhZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEJ5dGVCdWZmZXJSZWFkZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRCeXRlKCkgeworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSk7CisgICAgICAgIGJ5dGUgZXhwZWN0ID0gMTA7CisgICAgICAgIGJ1ZmZlci5wdXQoZXhwZWN0KS5yZXdpbmQoKTsKKworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ1ZmZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3QsIHJlYWRlci5yZWFkQnl0ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkU2hvcnQoKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKyAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgc2hvcnQgZXhwZWN0ID0gU2hvcnQuTUFYX1ZBTFVFOworICAgICAgICBidWZmZXIucHV0U2hvcnQoZXhwZWN0KS5yZXdpbmQoKTsKKworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ1ZmZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3QsIHJlYWRlci5yZWFkU2hvcnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEludCgpIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDQpOworICAgICAgICBidWZmZXIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOworICAgICAgICBpbnQgZXhwZWN0ID0gMTAwMDA7CisgICAgICAgIGJ1ZmZlci5wdXRJbnQoZXhwZWN0KS5yZXdpbmQoKTsKKworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ1ZmZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3QsIHJlYWRlci5yZWFkSW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBleHBlY3QgPSAidGVzdCByZWFkIHN0cmluZyI7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IGV4cGVjdC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoZXhwZWN0Lmxlbmd0aCgpICogMiArIDQpOworICAgICAgICBidWZmZXIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOworICAgICAgICBidWZmZXIucHV0SW50KGV4cGVjdC5sZW5ndGgoKSkucHV0KGJ5dGVzKS5yZXdpbmQoKTsKKworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ1ZmZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdCwgcmVhZGVyLnJlYWRTdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdUYWJsZVRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVGFibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0MGQ0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVGFibGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GaWxlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVGFibGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1R5cGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRmxhZ1RhYmxlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVGFibGVfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmxhZ1RhYmxlIGZsYWdUYWJsZSA9IEZsYWdUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoKSk7CisgICAgICAgIEZsYWdUYWJsZS5IZWFkZXIgaGVhZGVyID0gZmxhZ1RhYmxlLmdldEhlYWRlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGVhZGVyLmdldFZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibW9ja3VwIiwgaGVhZGVyLmdldENvbnRhaW5lcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVUeXBlLkZMQUdfTUFQLCBoZWFkZXIuZ2V0RmlsZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMjEsIGhlYWRlci5nZXRGaWxlU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGhlYWRlci5nZXROdW1GbGFncygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMxLCBoZWFkZXIuZ2V0QnVja2V0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoOTksIGhlYWRlci5nZXROb2RlT2Zmc2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsYWdUYWJsZV9yaWdodE5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmxhZ1RhYmxlIGZsYWdUYWJsZSA9IEZsYWdUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoKSk7CisKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTEgPSBmbGFnVGFibGUuZ2V0KDAsICJlbmFibGVkX3JvIik7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGUyID0gZmxhZ1RhYmxlLmdldCgwLCAiZW5hYmxlZF9ydyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlMyA9IGZsYWdUYWJsZS5nZXQoMiwgImVuYWJsZWRfcnciKTsKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTQgPSBmbGFnVGFibGUuZ2V0KDEsICJkaXNhYmxlZF9ydyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlNSA9IGZsYWdUYWJsZS5nZXQoMSwgImVuYWJsZWRfZml4ZWRfcm8iKTsKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTYgPSBmbGFnVGFibGUuZ2V0KDEsICJlbmFibGVkX3JvIik7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGU3ID0gZmxhZ1RhYmxlLmdldCgyLCAiZW5hYmxlZF9maXhlZF9ybyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlOCA9IGZsYWdUYWJsZS5nZXQoMCwgImRpc2FibGVkX3J3Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbmFibGVkX3JvIiwgbm9kZTEuZ2V0RmxhZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW5hYmxlZF9ydyIsIG5vZGUyLmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuYWJsZWRfcnciLCBub2RlMy5nZXRGbGFnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXNhYmxlZF9ydyIsIG5vZGU0LmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuYWJsZWRfZml4ZWRfcm8iLCBub2RlNS5nZXRGbGFnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbmFibGVkX3JvIiwgbm9kZTYuZ2V0RmxhZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW5hYmxlZF9maXhlZF9ybyIsIG5vZGU3LmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRpc2FibGVkX3J3Iiwgbm9kZTguZ2V0RmxhZ05hbWUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUxLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUyLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGUzLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGU0LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGU1LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGU2LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGU3LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGU4LmdldFBhY2thZ2VJZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoRmxhZ1R5cGUuUmVhZE9ubHlCb29sZWFuLCBub2RlMS5nZXRGbGFnVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLlJlYWRXcml0ZUJvb2xlYW4sIG5vZGUyLmdldEZsYWdUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmxhZ1R5cGUuUmVhZFdyaXRlQm9vbGVhbiwgbm9kZTMuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5SZWFkV3JpdGVCb29sZWFuLCBub2RlNC5nZXRGbGFnVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLkZpeGVkUmVhZE9ubHlCb29sZWFuLCBub2RlNS5nZXRGbGFnVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLlJlYWRPbmx5Qm9vbGVhbiwgbm9kZTYuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5GaXhlZFJlYWRPbmx5Qm9vbGVhbiwgbm9kZTcuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5SZWFkV3JpdGVCb29sZWFuLCBub2RlOC5nZXRGbGFnVHlwZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTEuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZTIuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTMuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTQuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTUuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZTYuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTcuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTguZ2V0RmxhZ0luZGV4KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTEuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE1MSwgbm9kZTIuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlMy5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU0LmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMzYsIG5vZGU1LmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTYuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlNy5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU4LmdldE5leHRPZmZzZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvRmxhZ1ZhbHVlTGlzdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTg1OTBhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmlsZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEZsYWdWYWx1ZUxpc3RUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsYWdWYWx1ZUxpc3RfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmbGFnVmFsdWVMaXN0ID0KKyAgICAgICAgICAgICAgICBGbGFnVmFsdWVMaXN0LmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnVmFsQnl0ZUJ1ZmZlcigpKTsKKyAgICAgICAgRmxhZ1ZhbHVlTGlzdC5IZWFkZXIgaGVhZGVyID0gZmxhZ1ZhbHVlTGlzdC5nZXRIZWFkZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGhlYWRlci5nZXRWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1vY2t1cCIsIGhlYWRlci5nZXRDb250YWluZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGaWxlVHlwZS5GTEFHX1ZBTCwgaGVhZGVyLmdldEZpbGVUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzUsIGhlYWRlci5nZXRGaWxlU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGhlYWRlci5nZXROdW1GbGFncygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI3LCBoZWFkZXIuZ2V0Qm9vbGVhblZhbHVlT2Zmc2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsYWdWYWx1ZUxpc3RfcmlnaHROb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZsYWdWYWx1ZUxpc3QgZmxhZ1ZhbHVlTGlzdCA9CisgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoKSk7CisKKyAgICAgICAgYm9vbGVhbltdIGV4cGVjdGVkID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgZmxhZ1ZhbHVlTGlzdC5zaXplKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ1ZhbHVlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2ldLCBmbGFnVmFsdWVMaXN0LmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVmFsdWVMaXN0X2dldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoKSk7CisgICAgICAgIEZsYWdUYWJsZSBmbGFnVGFibGUgPSBGbGFnVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdNYXBCeXRlQnVmZmVyKCkpOworCisgICAgICAgIEZsYWdWYWx1ZUxpc3QgZmxhZ1ZhbHVlTGlzdCA9CisgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoKSk7CisKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgcE5vZGUgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIGZOb2RlID0gZmxhZ1RhYmxlLmdldChwTm9kZS5nZXRQYWNrYWdlSWQoKSwgImVuYWJsZWRfcnciKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnVmFsdWVMaXN0LmdldChwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpICsgZk5vZGUuZ2V0RmxhZ0luZGV4KCkpKTsKKworICAgICAgICBwTm9kZSA9IHBhY2thZ2VUYWJsZS5nZXQoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKTsKKyAgICAgICAgZk5vZGUgPSBmbGFnVGFibGUuZ2V0KHBOb2RlLmdldFBhY2thZ2VJZCgpLCAiZW5hYmxlZF9maXhlZF9ybyIpOworICAgICAgICBhc3NlcnRUcnVlKGZsYWdWYWx1ZUxpc3QuZ2V0KHBOb2RlLmdldEJvb2xlYW5TdGFydEluZGV4KCkgKyBmTm9kZS5nZXRGbGFnSW5kZXgoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9QYWNrYWdlVGFibGVUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvUGFja2FnZVRhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTE5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvUGFja2FnZVRhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GaWxlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlVGFibGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGFja2FnZVRhYmxlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVGFibGVfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9CisgICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigpKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLkhlYWRlciBoZWFkZXIgPSBwYWNrYWdlVGFibGUuZ2V0SGVhZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2NrdXAiLCBoZWFkZXIuZ2V0Q29udGFpbmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZVR5cGUuUEFDS0FHRV9NQVAsIGhlYWRlci5nZXRGaWxlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwOSwgaGVhZGVyLmdldEZpbGVTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaGVhZGVyLmdldE51bVBhY2thZ2VzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzEsIGhlYWRlci5nZXRCdWNrZXRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1OSwgaGVhZGVyLmdldE5vZGVPZmZzZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVRhYmxlX3JpZ2h0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0KKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKCkpOworCisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIG5vZGUxID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBub2RlMiA9IHBhY2thZ2VUYWJsZS5nZXQoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTQgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgbm9kZTEuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsIG5vZGUyLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCBub2RlNC5nZXRQYWNrYWdlTmFtZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTEuZ2V0UGFja2FnZUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTIuZ2V0UGFja2FnZUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZTQuZ2V0UGFja2FnZUlkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlMS5nZXRCb29sZWFuU3RhcnRJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG5vZGUyLmdldEJvb2xlYW5TdGFydEluZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgbm9kZTQuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE1OSwgbm9kZTEuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlMi5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU0LmdldE5leHRPZmZzZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1Rlc3REYXRhVXRpbHMuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9UZXN0RGF0YVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1OTUyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9UZXN0RGF0YVV0aWxzLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworcHVibGljIGZpbmFsIGNsYXNzIFRlc3REYXRhVXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBQ0tBR0VfTUFQX1BBVEggPSAicGFja2FnZS5tYXAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfTUFQX1BBVEggPSAiZmxhZy5tYXAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfVkFMX1BBVEggPSAiZmxhZy52YWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfSU5GT19QQVRIID0gImZsYWcuaW5mbyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVERBVEFfUEFUSCA9CisgICAgICAgICAgICAiL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS8iOworCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFRFU1RfUEFDS0FHRV9NQVBfUEFUSCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFRFU1RfRkxBR19NQVBfUEFUSCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RGbGFnVmFsQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFRFU1RfRkxBR19WQUxfUEFUSCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RGbGFnSW5mb0J5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFRFU1REQVRBX1BBVEggKyBURVNUX0ZMQUdfSU5GT19QQVRIKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIHJlYWRGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoaW5wdXQucmVhZEFsbEJ5dGVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3RvcmFnZV9maWxlX3Rlc3QuY3BwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zdG9yYWdlX2ZpbGVfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkMWRkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3RvcmFnZV9maWxlX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlICJhY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX2ZpbGUuaHBwIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKK3VzaW5nIG5hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2U7CisKK3ZvaWQgdmVyaWZ5X3ZhbHVlKGNvbnN0IEZsYWdWYWx1ZVN1bW1hcnkmIGZsYWcsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfbmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX3ZhbCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZV90eXBlKSB7CisgIEFTU0VSVF9FUShmbGFnLnBhY2thZ2VfbmFtZSwgcGFja2FnZV9uYW1lKTsKKyAgQVNTRVJUX0VRKGZsYWcuZmxhZ19uYW1lLCBmbGFnX25hbWUpOworICBBU1NFUlRfRVEoZmxhZy5mbGFnX3ZhbHVlLCBmbGFnX3ZhbCk7CisgIEFTU0VSVF9FUShmbGFnLnZhbHVlX3R5cGUsIHZhbHVlX3R5cGUpOworfQorCit2b2lkIHZlcmlmeV92YWx1ZV9pbmZvKGNvbnN0IEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5JiBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ192YWwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlYWR3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfc2VydmVyX292ZXJyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19sb2NhbF9vdmVycmlkZSkgeworICBBU1NFUlRfRVEoZmxhZy5wYWNrYWdlX25hbWUsIHBhY2thZ2VfbmFtZSk7CisgIEFTU0VSVF9FUShmbGFnLmZsYWdfbmFtZSwgZmxhZ19uYW1lKTsKKyAgQVNTRVJUX0VRKGZsYWcuZmxhZ192YWx1ZSwgZmxhZ192YWwpOworICBBU1NFUlRfRVEoZmxhZy52YWx1ZV90eXBlLCB2YWx1ZV90eXBlKTsKKyAgQVNTRVJUX0VRKGZsYWcuaXNfcmVhZHdyaXRlLCBpc19yZWFkd3JpdGUpOworICBBU1NFUlRfRVEoZmxhZy5oYXNfc2VydmVyX292ZXJyaWRlLCBoYXNfc2VydmVyX292ZXJyaWRlKTsKKyAgQVNTRVJUX0VRKGZsYWcuaGFzX2xvY2FsX292ZXJyaWRlLCBoYXNfbG9jYWxfb3ZlcnJpZGUpOworfQorCitURVNUKEFjb25maWdTdG9yYWdlRmlsZVRlc3QsIHRlc3RfbGlzdF9mbGFnKSB7CisgIGF1dG8gY29uc3QgdGVzdF9kaXIgPSBHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7CisgIGF1dG8gY29uc3QgcGFja2FnZV9tYXAgPSB0ZXN0X2RpciArICIvcGFja2FnZS5tYXAiOworICBhdXRvIGNvbnN0IGZsYWdfbWFwID0gdGVzdF9kaXIgKyAiL2ZsYWcubWFwIjsKKyAgYXV0byBjb25zdCBmbGFnX3ZhbCA9IHRlc3RfZGlyICsgIi9mbGFnLnZhbCI7CisgIGF1dG8gZmxhZ19saXN0X3Jlc3VsdCA9IGFjb25maWdfc3RvcmFnZTo6bGlzdF9mbGFncygKKyAgICAgIHBhY2thZ2VfbWFwLCBmbGFnX21hcCwgZmxhZ192YWwpOworICBBU1NFUlRfVFJVRShmbGFnX2xpc3RfcmVzdWx0Lm9rKCkpOworCisgIGF1dG8gY29uc3QmIGZsYWdfbGlzdCA9ICpmbGFnX2xpc3RfcmVzdWx0OworICBBU1NFUlRfRVEoZmxhZ19saXN0LnNpemUoKSwgOCk7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbMF0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgImRpc2FibGVkX3J3IiwKKyAgICAgICAgICAgICAgICJmYWxzZSIsICJSZWFkV3JpdGVCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbMV0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgImVuYWJsZWRfcm8iLAorICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbMl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgImVuYWJsZWRfcnciLAorICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzNdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJkaXNhYmxlZF9ydyIsCisgICAgICAgICAgICAgICAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzRdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJlbmFibGVkX2ZpeGVkX3JvIiwKKyAgICAgICAgICAgICAgICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbNV0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwgImVuYWJsZWRfcm8iLAorICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbNl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwgImVuYWJsZWRfZml4ZWRfcm8iLAorICAgICAgICAgICAgICAgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFs3XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCAiZW5hYmxlZF9ydyIsCisgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIik7Cit9CisKK1RFU1QoQWNvbmZpZ1N0b3JhZ2VGaWxlVGVzdCwgdGVzdF9saXN0X2ZsYWdfd2l0aF9pbmZvKSB7CisgIGF1dG8gY29uc3QgdGVzdF9kaXIgPSBHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7CisgIGF1dG8gY29uc3QgcGFja2FnZV9tYXAgPSB0ZXN0X2RpciArICIvcGFja2FnZS5tYXAiOworICBhdXRvIGNvbnN0IGZsYWdfbWFwID0gdGVzdF9kaXIgKyAiL2ZsYWcubWFwIjsKKyAgYXV0byBjb25zdCBmbGFnX3ZhbCA9IHRlc3RfZGlyICsgIi9mbGFnLnZhbCI7CisgIGF1dG8gY29uc3QgZmxhZ19pbmZvID0gdGVzdF9kaXIgKyAiL2ZsYWcuaW5mbyI7CisgIGF1dG8gZmxhZ19saXN0X3Jlc3VsdCA9IGFjb25maWdfc3RvcmFnZTo6bGlzdF9mbGFnc193aXRoX2luZm8oCisgICAgICBwYWNrYWdlX21hcCwgZmxhZ19tYXAsIGZsYWdfdmFsLCBmbGFnX2luZm8pOworICBBU1NFUlRfVFJVRShmbGFnX2xpc3RfcmVzdWx0Lm9rKCkpOworCisgIGF1dG8gY29uc3QmIGZsYWdfbGlzdCA9ICpmbGFnX2xpc3RfcmVzdWx0OworICBBU1NFUlRfRVEoZmxhZ19saXN0LnNpemUoKSwgOCk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFswXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCAiZGlzYWJsZWRfcnciLAorICAgICAgICAgICAgICAgICAgICAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFsxXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCAiZW5hYmxlZF9ybyIsCisgICAgICAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbMl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgImVuYWJsZWRfcnciLAorICAgICAgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzNdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJkaXNhYmxlZF9ydyIsCisgICAgICAgICAgICAgICAgICAgICJmYWxzZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzRdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJlbmFibGVkX2ZpeGVkX3JvIiwKKyAgICAgICAgICAgICAgICAgICAgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzVdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJlbmFibGVkX3JvIiwKKyAgICAgICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs2XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCAiZW5hYmxlZF9maXhlZF9ybyIsCisgICAgICAgICAgICAgICAgICAgICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs3XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCAiZW5hYmxlZF9ydyIsCisgICAgICAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmNGMxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNzggQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworcnVzdF9kZWZhdWx0cyB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5kZWZhdWx0cyIsCisgICAgZWRpdGlvbjogIjIwMjEiLAorICAgIGxpbnRzOiAibm9uZSIsCisgICAgc3JjczogWyJzcmMvbGliLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFueWhvdyIsCisgICAgICAgICJsaWJtZW1tYXAyIiwKKyAgICAgICAgImxpYmN4eCIsCisgICAgICAgICJsaWJ0aGlzZXJyb3IiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAorICAgIF0sCit9CisKK3J1c3RfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLmRlZmF1bHRzIl0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTphbnlhcGV4IiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKK30KKworcnVzdF90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkudGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorICAgIGRlZmF1bHRzOiBbImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5kZWZhdWx0cyJdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJyYW5kIiwKKyAgICBdLAorICAgIGRhdGE6IFsKKyAgICAgICAgInRlc3RzL3BhY2thZ2UubWFwIiwKKyAgICAgICAgInRlc3RzL2ZsYWcubWFwIiwKKyAgICAgICAgInRlc3RzL2ZsYWcudmFsIiwKKyAgICAgICAgInRlc3RzL2ZsYWcuaW5mbyIsCisgICAgXSwKK30KKworLy8gY3h4IHNvdXJjZSBjb2RlZ2VuIGZyb20gcnVzdCBhcGkKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJsaWJjeHhfYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2JyaWRnZV9jb2RlIiwKKyAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgPiAkKG91dCkiLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIG91dDogWyJhY29uZmlnX3N0b3JhZ2UvbGliLnJzLmNjIl0sCit9CisKKy8vIGN4eCBoZWFkZXIgY29kZWdlbiBmcm9tIHJ1c3QgYXBpCitnZW5ydWxlIHsKKyAgICBuYW1lOiAibGliY3h4X2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9icmlkZ2VfaGVhZGVyIiwKKyAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgLS1oZWFkZXIgPiAkKG91dCkiLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIG91dDogWyJhY29uZmlnX3N0b3JhZ2UvbGliLnJzLmgiXSwKK30KKworLy8gYSBzdGF0aWMgY2MgbGliIGJhc2VkIG9uIGdlbmVyYXRlZCBjb2RlCitydXN0X2ZmaV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY3h4X2JyaWRnZSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jeHhfYnJpZGdlIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHByb2R1Y3RfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRlZmF1bHRzOiBbImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5kZWZhdWx0cyJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCit9CisKKy8vIGZsYWcgcmVhZCBhcGkgY2MgaW50ZXJmYWNlCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2NjIiwKKyAgICBzcmNzOiBbImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5jcHAiXSwKKyAgICBnZW5lcmF0ZWRfaGVhZGVyczogWworICAgICAgICAiY3h4LWJyaWRnZS1oZWFkZXIiLAorICAgICAgICAibGliY3h4X2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9icmlkZ2VfaGVhZGVyIiwKKyAgICBdLAorICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbImxpYmN4eF9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfYnJpZGdlX2NvZGUiXSwKKyAgICB3aG9sZV9zdGF0aWNfbGliczogWyJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY3h4X2JyaWRnZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgcHJvZHVjdF9hdmFpbGFibGU6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTphbnlhcGV4IiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgbGludXg6IHsKKyAgICAgICAgICAgIHZlcnNpb25fc2NyaXB0OiAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2NjLm1hcCIsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCisgICAgYWZkbzogdHJ1ZSwKK30KKworc29vbmdfY29uZmlnX21vZHVsZV90eXBlIHsKKyAgICBuYW1lOiAiYWNvbmZpZ19saWJfY2Nfc2hhcmVkX2xpbmtfZGVmYXVsdHMiLAorICAgIG1vZHVsZV90eXBlOiAiY2NfZGVmYXVsdHMiLAorICAgIGNvbmZpZ19uYW1lc3BhY2U6ICJBY29uZmlnIiwKKyAgICBib29sX3ZhcmlhYmxlczogWworICAgICAgICAicmVhZF9mcm9tX25ld19zdG9yYWdlIiwKKyAgICBdLAorICAgIHByb3BlcnRpZXM6IFsKKyAgICAgICAgInNoYXJlZF9saWJzIiwKKyAgICBdLAorfQorCitzb29uZ19jb25maWdfYm9vbF92YXJpYWJsZSB7CisgICAgbmFtZTogInJlYWRfZnJvbV9uZXdfc3RvcmFnZSIsCit9CisKK2Fjb25maWdfbGliX2NjX3NoYXJlZF9saW5rX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWNvbmZpZ19saWJfY2Nfc2hhcmVkX2xpbmsuZGVmYXVsdHMiLAorICAgIHNvb25nX2NvbmZpZ192YXJpYWJsZXM6IHsKKyAgICAgICAgcmVhZF9mcm9tX25ld19zdG9yYWdlOiB7CisgICAgICAgICAgICBzaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY2MiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImFjb25maWdfbGliX2NjX3N0YXRpY19saW5rLmRlZmF1bHRzIiwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2NjIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKK30KKworcnVzdF9mZmlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX3J1c3Rfam5pIiwKKyAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX3J1c3Rfam5pIiwKKyAgICBzcmNzOiBbInNyY3MvbGliLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSIsCisgICAgICAgICJsaWJhbnlob3ciLAorICAgICAgICAibGliam5pIiwKKyAgICBdLAorICAgIHByZWZlcl9ybGliOiB0cnVlLAorfQorCitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfamF2YSIsCisgICAgc3JjczogWworICAgICAgICAic3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZVJlYWRBUEkuamF2YSIsCisgICAgICAgICJzcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdSZWFkQ29udGV4dC5qYXZhIiwKKyAgICAgICAgInNyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVJlYWRDb250ZXh0LmphdmEiLAorICAgIF0sCisgICAgcmVxdWlyZWQ6IFsibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX3J1c3Rfam5pIl0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiVXBzaWRlRG93bkNha2UiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgXSwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRlcl9qYXZhIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VJbnRlcm5hbFJlYWRlci5qYXZhIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhY29uZmlnX3N0b3JhZ2VfZmlsZV9qYXZhIiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAiY29yZV9jdXJyZW50IiwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL0NhcmdvLnRvbWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjdlNGIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9DYXJnby50b21sCkBAIC0wLDAgKzEsMjAgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkiCit2ZXJzaW9uID0gIjAuMS4wIgorZWRpdGlvbiA9ICIyMDIxIgorCitbZmVhdHVyZXNdCitkZWZhdWx0ID0gWyJjYXJnbyJdCitjYXJnbyA9IFtdCisKK1tkZXBlbmRlbmNpZXNdCityYW5kID0gIjAuOC41IgorYW55aG93ID0gIjEuMC42OSIKK21lbW1hcDIgPSAiMC44LjAiCitjeHggPSAiMS4wIgordGhpc2Vycm9yID0gIjEuMC41NiIKK2Fjb25maWdfc3RvcmFnZV9maWxlID0geyBwYXRoID0gIi4uL2Fjb25maWdfc3RvcmFnZV9maWxlIiB9CisKK1tidWlsZC1kZXBlbmRlbmNpZXNdCitwcm90b2J1Zi1jb2RlZ2VuID0gIjMuMi4wIgorY3h4LWJ1aWxkID0gIjEuMCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5jcHAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YWRhM2EKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuY3BwCkBAIC0wLDAgKzEsMjAyIEBACisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInJ1c3QvY3h4LmgiCisjaW5jbHVkZSAiYWNvbmZpZ19zdG9yYWdlL2xpYi5ycy5oIgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuaHBwIgorCituYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlIHsKKworLy8vIFN0b3JhZ2UgbG9jYXRpb24gcGIgZmlsZQorc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtTdG9yYWdlRGlyW10gPSAiL21ldGFkYXRhL2Fjb25maWciOworCisvLy8gZGVzdHJ1Y3RvcgorTWFwcGVkU3RvcmFnZUZpbGU6On5NYXBwZWRTdG9yYWdlRmlsZSgpIHsKKyAgbXVubWFwKGZpbGVfcHRyLCBmaWxlX3NpemUpOworfQorCisvLy8gR2V0IHN0b3JhZ2UgZmlsZSBwYXRoCitzdGF0aWMgUmVzdWx0PHN0ZDo6c3RyaW5nPiBmaW5kX3N0b3JhZ2VfZmlsZSgKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgc3RvcmFnZV9kaXIsCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIGNvbnRhaW5lciwKKyAgICBTdG9yYWdlRmlsZVR5cGUgZmlsZV90eXBlKSB7CisgIHN3aXRjaChmaWxlX3R5cGUpIHsKKyAgICBjYXNlIFN0b3JhZ2VGaWxlVHlwZTo6cGFja2FnZV9tYXA6CisgICAgICByZXR1cm4gc3RvcmFnZV9kaXIgKyAiL21hcHMvIiArIGNvbnRhaW5lciArICIucGFja2FnZS5tYXAiOworICAgIGNhc2UgU3RvcmFnZUZpbGVUeXBlOjpmbGFnX21hcDoKKyAgICAgIHJldHVybiBzdG9yYWdlX2RpciArICIvbWFwcy8iICsgY29udGFpbmVyICsgIi5mbGFnLm1hcCI7CisgICAgY2FzZSBTdG9yYWdlRmlsZVR5cGU6OmZsYWdfdmFsOgorICAgICAgcmV0dXJuIHN0b3JhZ2VfZGlyICsgIi9ib290LyIgKyBjb250YWluZXIgKyAiLnZhbCI7CisgICAgY2FzZSBTdG9yYWdlRmlsZVR5cGU6OmZsYWdfaW5mbzoKKyAgICAgIHJldHVybiBzdG9yYWdlX2RpciArICIvYm9vdC8iICsgY29udGFpbmVyICsgIi5pbmZvIjsKKyAgICBkZWZhdWx0OgorICAgICAgYXV0byByZXN1bHQgPSBSZXN1bHQ8c3RkOjpzdHJpbmc+KCk7CisgICAgICByZXN1bHQuZXJybXNnID0gIkludmFsaWQgc3RvcmFnZSBmaWxlIHR5cGUiOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCituYW1lc3BhY2UgcHJpdmF0ZV9pbnRlcm5hbF9hcGkgeworCisvLy8gR2V0IG1hcHBlZCBmaWxlIGltcGxlbWVudGF0aW9uLgorUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4gZ2V0X21hcHBlZF9maWxlX2ltcGwoCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIHN0b3JhZ2VfZGlyLAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBjb250YWluZXIsCisgICAgU3RvcmFnZUZpbGVUeXBlIGZpbGVfdHlwZSkgeworICBhdXRvIGZpbGVfcmVzdWx0ID0gZmluZF9zdG9yYWdlX2ZpbGUoc3RvcmFnZV9kaXIsIGNvbnRhaW5lciwgZmlsZV90eXBlKTsKKyAgaWYgKCFmaWxlX3Jlc3VsdC5vaygpKSB7CisgICAgYXV0byByZXN1bHQgPSBSZXN1bHQ8TWFwcGVkU3RvcmFnZUZpbGUqPigpOworICAgIHJlc3VsdC5lcnJtc2cgPSBmaWxlX3Jlc3VsdC5lcnJvcigpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgcmV0dXJuIG1hcF9zdG9yYWdlX2ZpbGUoKmZpbGVfcmVzdWx0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgcHJpdmF0ZSBpbnRlcm5hbCBhcGkKKworLy8vIE1hcCBhIHN0b3JhZ2UgZmlsZQorUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4gbWFwX3N0b3JhZ2VfZmlsZShzdGQ6OnN0cmluZyBjb25zdCYgZmlsZSkgeworICBpbnQgZmQgPSBvcGVuKGZpbGUuY19zdHIoKSwgT19DTE9FWEVDIHwgT19OT0ZPTExPVyB8IE9fUkRPTkxZKTsKKyAgaWYgKGZkID09IC0xKSB7CisgICAgYXV0byByZXN1bHQgPSBSZXN1bHQ8TWFwcGVkU3RvcmFnZUZpbGUqPigpOworICAgIHJlc3VsdC5lcnJtc2cgPSBzdGQ6OnN0cmluZygiZmFpbGVkIHRvIG9wZW4gIikgKyBmaWxlICsgIjogIiArIHN0cmVycm9yKGVycm5vKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9OworCisgIHN0cnVjdCBzdGF0IGZkX3N0YXQ7CisgIGlmIChmc3RhdChmZCwgJmZkX3N0YXQpIDwgMCkgeworICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4oKTsKKyAgICByZXN1bHQuZXJybXNnID0gc3RkOjpzdHJpbmcoImZzdGF0IGZhaWxlZDogIikgKyBzdHJlcnJvcihlcnJubyk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBzaXplX3QgZmlsZV9zaXplID0gZmRfc3RhdC5zdF9zaXplOworCisgIHZvaWQqIGNvbnN0IG1hcF9yZXN1bHQgPSBtbWFwKG51bGxwdHIsIGZpbGVfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7CisgIGlmIChtYXBfcmVzdWx0ID09IE1BUF9GQUlMRUQpIHsKKyAgICBhdXRvIHJlc3VsdCA9IFJlc3VsdDxNYXBwZWRTdG9yYWdlRmlsZSo+KCk7CisgICAgcmVzdWx0LmVycm1zZyA9IHN0ZDo6c3RyaW5nKCJtbWFwIGZhaWxlZDogIikgKyBzdHJlcnJvcihlcnJubyk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGF1dG8gbWFwcGVkX2ZpbGUgPSBuZXcgTWFwcGVkU3RvcmFnZUZpbGUoKTsKKyAgbWFwcGVkX2ZpbGUtPmZpbGVfcHRyID0gbWFwX3Jlc3VsdDsKKyAgbWFwcGVkX2ZpbGUtPmZpbGVfc2l6ZSA9IGZpbGVfc2l6ZTsKKworICByZXR1cm4gbWFwcGVkX2ZpbGU7Cit9CisKKy8vLyBNYXAgZnJvbSBTdG9yZWRGbGFnVHlwZSB0byBGbGFnVmFsdWVUeXBlCitSZXN1bHQ8RmxhZ1ZhbHVlVHlwZT4gbWFwX3RvX2ZsYWdfdmFsdWVfdHlwZSgKKyAgICBTdG9yZWRGbGFnVHlwZSBzdG9yZWRfdHlwZSkgeworICBzd2l0Y2ggKHN0b3JlZF90eXBlKSB7CisgICAgY2FzZSBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbjoKKyAgICBjYXNlIFN0b3JlZEZsYWdUeXBlOjpSZWFkT25seUJvb2xlYW46CisgICAgY2FzZSBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW46CisgICAgICByZXR1cm4gRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbjsKKyAgICBkZWZhdWx0OgorICAgICAgYXV0byByZXN1bHQgPSBSZXN1bHQ8RmxhZ1ZhbHVlVHlwZT4oKTsKKyAgICAgIHJlc3VsdC5lcnJtc2cgPSAiVW5zdXBwb3J0ZWQgc3RvcmVkIGZsYWcgdHlwZSI7CisgICAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKKy8vLyBHZXQgbWFwcGVkIHN0b3JhZ2UgZmlsZQorUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4gZ2V0X21hcHBlZF9maWxlKAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBjb250YWluZXIsCisgICAgU3RvcmFnZUZpbGVUeXBlIGZpbGVfdHlwZSkgeworICByZXR1cm4gcHJpdmF0ZV9pbnRlcm5hbF9hcGk6OmdldF9tYXBwZWRfZmlsZV9pbXBsKAorICAgICAga1N0b3JhZ2VEaXIsIGNvbnRhaW5lciwgZmlsZV90eXBlKTsKK30KKworLy8vIEdldCBzdG9yYWdlIGZpbGUgdmVyc2lvbiBudW1iZXIKK1Jlc3VsdDx1aW50MzJfdD4gZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlX3BhdGgpIHsKKyAgYXV0byB2ZXJzaW9uX2N4eCA9IGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbl9jeHgoCisgICAgICBydXN0OjpTdHIoZmlsZV9wYXRoLmNfc3RyKCkpKTsKKyAgaWYgKHZlcnNpb25fY3h4LnF1ZXJ5X3N1Y2Nlc3MpIHsKKyAgICByZXR1cm4gdmVyc2lvbl9jeHgudmVyc2lvbl9udW1iZXI7CisgIH0gZWxzZSB7CisgICAgYXV0byByZXN1bHQgPSBSZXN1bHQ8dWludDMyX3Q+KCk7CisgICAgcmVzdWx0LmVycm1zZyA9IHZlcnNpb25fY3h4LmVycm9yX21lc3NhZ2UuY19zdHIoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKKy8vLyBHZXQgcGFja2FnZSBjb250ZXh0CitSZXN1bHQ8UGFja2FnZVJlYWRDb250ZXh0PiBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoCisgICAgTWFwcGVkU3RvcmFnZUZpbGUgY29uc3QmIGZpbGUsCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIHBhY2thZ2UpIHsKKyAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4oCisgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZmlsZS5maWxlX3B0ciksIGZpbGUuZmlsZV9zaXplKTsKKyAgYXV0byBjb250ZXh0X2N4eCA9IGdldF9wYWNrYWdlX3JlYWRfY29udGV4dF9jeHgoY29udGVudCwgcnVzdDo6U3RyKHBhY2thZ2UuY19zdHIoKSkpOworICBpZiAoY29udGV4dF9jeHgucXVlcnlfc3VjY2VzcykgeworICAgIGF1dG8gY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCgpOworICAgIGNvbnRleHQucGFja2FnZV9leGlzdHMgPSBjb250ZXh0X2N4eC5wYWNrYWdlX2V4aXN0czsKKyAgICBjb250ZXh0LnBhY2thZ2VfaWQgPSBjb250ZXh0X2N4eC5wYWNrYWdlX2lkOworICAgIGNvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCA9IGNvbnRleHRfY3h4LmJvb2xlYW5fc3RhcnRfaW5kZXg7CisgICAgcmV0dXJuIGNvbnRleHQ7CisgIH0gZWxzZSB7CisgICAgYXV0byByZXN1bHQgPSBSZXN1bHQ8UGFja2FnZVJlYWRDb250ZXh0PigpOworICAgIHJlc3VsdC5lcnJtc2cgPSBjb250ZXh0X2N4eC5lcnJvcl9tZXNzYWdlLmNfc3RyKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCisvLy8gR2V0IGZsYWcgcmVhZCBjb250ZXh0CitSZXN1bHQ8RmxhZ1JlYWRDb250ZXh0PiBnZXRfZmxhZ19yZWFkX2NvbnRleHQoCisgICAgTWFwcGVkU3RvcmFnZUZpbGUgY29uc3QmIGZpbGUsCisgICAgdWludDMyX3QgcGFja2FnZV9pZCwKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgZmxhZ19uYW1lKXsKKyAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4oCisgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZmlsZS5maWxlX3B0ciksIGZpbGUuZmlsZV9zaXplKTsKKyAgYXV0byBjb250ZXh0X2N4eCA9IGdldF9mbGFnX3JlYWRfY29udGV4dF9jeHgoY29udGVudCwgcGFja2FnZV9pZCwgcnVzdDo6U3RyKGZsYWdfbmFtZS5jX3N0cigpKSk7CisgIGlmIChjb250ZXh0X2N4eC5xdWVyeV9zdWNjZXNzKSB7CisgICAgYXV0byBjb250ZXh0ID0gRmxhZ1JlYWRDb250ZXh0KCk7CisgICAgY29udGV4dC5mbGFnX2V4aXN0cyA9IGNvbnRleHRfY3h4LmZsYWdfZXhpc3RzOworICAgIGNvbnRleHQuZmxhZ190eXBlID0gc3RhdGljX2Nhc3Q8U3RvcmVkRmxhZ1R5cGU+KGNvbnRleHRfY3h4LmZsYWdfdHlwZSk7CisgICAgY29udGV4dC5mbGFnX2luZGV4ID0gY29udGV4dF9jeHguZmxhZ19pbmRleDsKKyAgICByZXR1cm4gY29udGV4dDsKKyAgfSBlbHNlIHsKKyAgICBhdXRvIHJlc3VsdCA9IFJlc3VsdDxGbGFnUmVhZENvbnRleHQ+KCk7CisgICAgcmVzdWx0LmVycm1zZyA9IGNvbnRleHRfY3h4LmVycm9yX21lc3NhZ2UuY19zdHIoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKKy8vLyBHZXQgYm9vbGVhbiBmbGFnIHZhbHVlCitSZXN1bHQ8Ym9vbD4gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICBNYXBwZWRTdG9yYWdlRmlsZSBjb25zdCYgZmlsZSwKKyAgICB1aW50MzJfdCBpbmRleCkgeworICBhdXRvIGNvbnRlbnQgPSBydXN0OjpTbGljZTxjb25zdCB1aW50OF90PigKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihmaWxlLmZpbGVfcHRyKSwgZmlsZS5maWxlX3NpemUpOworICBhdXRvIHZhbHVlX2N4eCA9IGdldF9ib29sZWFuX2ZsYWdfdmFsdWVfY3h4KGNvbnRlbnQsIGluZGV4KTsKKyAgaWYgKHZhbHVlX2N4eC5xdWVyeV9zdWNjZXNzKSB7CisgICAgcmV0dXJuIHZhbHVlX2N4eC5mbGFnX3ZhbHVlOworICB9IGVsc2UgeworICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0PGJvb2w+KCk7CisgICAgcmVzdWx0LmVycm1zZyA9IHZhbHVlX2N4eC5lcnJvcl9tZXNzYWdlLmNfc3RyKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCisvLy8gR2V0IGJvb2xlYW4gZmxhZyBhdHRyaWJ1dGUKK1Jlc3VsdDx1aW50OF90PiBnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgTWFwcGVkU3RvcmFnZUZpbGUgY29uc3QmIGZpbGUsCisgICAgRmxhZ1ZhbHVlVHlwZSB2YWx1ZV90eXBlLAorICAgIHVpbnQzMl90IGluZGV4KSB7CisgIGF1dG8gY29udGVudCA9IHJ1c3Q6OlNsaWNlPGNvbnN0IHVpbnQ4X3Q+KAorICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGZpbGUuZmlsZV9wdHIpLCBmaWxlLmZpbGVfc2l6ZSk7CisgIGF1dG8gaW5mb19jeHggPSBnZXRfZmxhZ19hdHRyaWJ1dGVfY3h4KAorICAgICAgY29udGVudCwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHZhbHVlX3R5cGUpLCBpbmRleCk7CisgIGlmIChpbmZvX2N4eC5xdWVyeV9zdWNjZXNzKSB7CisgICAgcmV0dXJuIGluZm9fY3h4LmZsYWdfYXR0cmlidXRlOworICB9IGVsc2UgeworICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0PHVpbnQ4X3Q+KCk7CisgICAgcmVzdWx0LmVycm1zZyA9IGluZm9fY3h4LmVycm9yX21lc3NhZ2UuY19zdHIoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9Cit9IC8vIG5hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2J1aWxkLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvYnVpbGQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxYWE1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2J1aWxkLnJzCkBAIC0wLDAgKzEsNCBAQAorZm4gbWFpbigpIHsKKyAgICBsZXQgXyA9IGN4eF9idWlsZDo6YnJpZGdlKCJzcmMvbGliLnJzIik7CisgICAgcHJpbnRsbiEoImNhcmdvOnJlcnVuLWlmLWNoYW5nZWQ9c3JjL2xpYi5ycyIpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvaW5jbHVkZS9hY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLmhwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2luY2x1ZGUvYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwOTM1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2luY2x1ZGUvYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5ocHAKQEAgLTAsMCArMSwxNzEgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UgeworCisvLy8gU3RvcmFnZSBmaWxlIHR5cGUgZW51bSwgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBvbmUgZGVmaW5lZCBpbgorLy8vIGFjb25maWdfc3RvcmFnZV9maWxlL3NyYy9saWIucnMKK2VudW0gU3RvcmFnZUZpbGVUeXBlIHsKKyAgcGFja2FnZV9tYXAsCisgIGZsYWdfbWFwLAorICBmbGFnX3ZhbCwKKyAgZmxhZ19pbmZvCit9OworCisvLy8gRmxhZyB0eXBlIGVudW0sIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgb25lIGRlZmluZWQgaW4KKy8vLyBhY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbGliLnJzCitlbnVtIFN0b3JlZEZsYWdUeXBlIHsKKyAgUmVhZFdyaXRlQm9vbGVhbiA9IDAsCisgIFJlYWRPbmx5Qm9vbGVhbiA9IDEsCisgIEZpeGVkUmVhZE9ubHlCb29sZWFuID0gMiwKK307CisKKy8vLyBGbGFnIHZhbHVlIHR5cGUgZW51bSwgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBvbmUgZGVmaW5lZCBpbgorLy8vIGFjb25maWdfc3RvcmFnZV9maWxlL3NyYy9saWIucnMKK2VudW0gRmxhZ1ZhbHVlVHlwZSB7CisgIEJvb2xlYW4gPSAwLAorfTsKKworLy8vIEZsYWcgaW5mbyBlbnVtLCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG9uZSBkZWZpbmVkIGluCisvLy8gYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfaW5mby5ycworZW51bSBGbGFnSW5mb0JpdCB7CisgIEhhc1NlcnZlck92ZXJyaWRlID0gMTw8MCwKKyAgSXNSZWFkV3JpdGUgPSAxPDwxLAorICBIYXNMb2NhbE92ZXJyaWRlID0gMTw8MiwKK307CisKKy8vLyBNYXBwZWQgc3RvcmFnZSBmaWxlCitzdHJ1Y3QgTWFwcGVkU3RvcmFnZUZpbGUgeworICB2b2lkKiBmaWxlX3B0cjsKKyAgc2l6ZV90IGZpbGVfc2l6ZTsKKyAgdmlydHVhbCB+TWFwcGVkU3RvcmFnZUZpbGUoKTsKK307CisKKy8vLyBQYWNrYWdlIHJlYWQgY29udGV4dCBxdWVyeSByZXN1bHQKK3N0cnVjdCBQYWNrYWdlUmVhZENvbnRleHQgeworICBib29sIHBhY2thZ2VfZXhpc3RzOworICB1aW50MzJfdCBwYWNrYWdlX2lkOworICB1aW50MzJfdCBib29sZWFuX3N0YXJ0X2luZGV4OworfTsKKworLy8vIEZsYWcgcmVhZCBjb250ZXh0IHF1ZXJ5IHJlc3VsdAorc3RydWN0IEZsYWdSZWFkQ29udGV4dCB7CisgIGJvb2wgZmxhZ19leGlzdHM7CisgIFN0b3JlZEZsYWdUeXBlIGZsYWdfdHlwZTsKKyAgdWludDE2X3QgZmxhZ19pbmRleDsKK307CisKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBSZXN1bHQgeworICBwdWJsaWM6CisKKyAgUmVzdWx0KCkKKyAgICAgIDogZGF0YSgpCisgICAgICAsIGVycm1zZygpCisgICAgICAsIGhhc19kYXRhKGZhbHNlKQorICB7fQorCisgIFJlc3VsdChUIGNvbnN0JiB2YWx1ZSkKKyAgICAgIDogZGF0YSh2YWx1ZSkKKyAgICAgICwgZXJybXNnKCkKKyAgICAgICwgaGFzX2RhdGEodHJ1ZSkKKyAge30KKworICBib29sIG9rKCkgeworICAgIHJldHVybiBoYXNfZGF0YTsKKyAgfQorCisgIFQmIG9wZXJhdG9yKigpIHsKKyAgICBhc3NlcnQoaGFzX2RhdGEpOworICAgIHJldHVybiBkYXRhOworICB9CisKKyAgVCogb3BlcmF0b3ItPigpIHsKKyAgICBhc3NlcnQoaGFzX2RhdGEpOworICAgIHJldHVybiAmZGF0YTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0JiBlcnJvcigpIHsKKyAgICBhc3NlcnQoIWhhc19kYXRhKTsKKyAgICByZXR1cm4gZXJybXNnOworICB9CisKKyAgVCBkYXRhOworICBzdGQ6OnN0cmluZyBlcnJtc2c7CisgIGJvb2wgaGFzX2RhdGE7Cit9OworCisvLy8gRE8gTk9UIFVTRSBBUElTIElOIFRIRSBGT0xMT1dJTkcgTkFNRVNQQUNFIERJUkVDVExZCituYW1lc3BhY2UgcHJpdmF0ZV9pbnRlcm5hbF9hcGkgeworCitSZXN1bHQ8TWFwcGVkU3RvcmFnZUZpbGUqPiBnZXRfbWFwcGVkX2ZpbGVfaW1wbCgKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgcGJfZmlsZSwKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgY29udGFpbmVyLAorICAgIFN0b3JhZ2VGaWxlVHlwZSBmaWxlX3R5cGUpOworfSAvLyBuYW1lc3BhY2UgcHJpdmF0ZV9pbnRlcm5hbF9hcGkKKworLy8vIE1hcCBhIHN0b3JhZ2UgZmlsZQorUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4gbWFwX3N0b3JhZ2VfZmlsZSgKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZSk7CisKKworLy8vIE1hcCBmcm9tIFN0b3JlZEZsYWdUeXBlIHRvIEZsYWdWYWx1ZVR5cGUKKy8vLyBcaW5wdXQgc3RvcmVkX3R5cGU6IHN0b3JlZCBmbGFnIHR5cGUgaW4gdGhlIHN0b3JhZ2UgZmlsZQorLy8vIFxyZXR1cm5zIHRoZSBmbGFnIHZhbHVlIHR5cGUgZW51bQorUmVzdWx0PEZsYWdWYWx1ZVR5cGU+IG1hcF90b19mbGFnX3ZhbHVlX3R5cGUoCisgICAgU3RvcmVkRmxhZ1R5cGUgc3RvcmVkX3R5cGUpOworCisvLy8gR2V0IG1hcHBlZCBzdG9yYWdlIGZpbGUKKy8vLyBcaW5wdXQgY29udGFpbmVyOiBzdG9hcmdlIGNvbnRhaW5lciBuYW1lCisvLy8gXGlucHV0IGZpbGVfdHlwZTogc3RvcmFnZSBmaWxlIHR5cGUgZW51bQorLy8vIFxyZXR1cm5zIGEgTWFwcGVkU3RvcmFnZUZpbGVRdWVyeQorUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4gZ2V0X21hcHBlZF9maWxlKAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBjb250YWluZXIsCisgICAgU3RvcmFnZUZpbGVUeXBlIGZpbGVfdHlwZSk7CisKKy8vLyBHZXQgc3RvcmFnZSBmaWxlIHZlcnNpb24gbnVtYmVyCisvLy8gXGlucHV0IGZpbGVfcGF0aDogdGhlIHBhdGggdG8gdGhlIHN0b3JhZ2UgZmlsZQorLy8vIFxyZXR1cm5zIHRoZSBzdG9yYWdlIGZpbGUgdmVyc2lvbgorUmVzdWx0PHVpbnQzMl90PiBnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVfcGF0aCk7CisKKy8vLyBHZXQgcGFja2FnZSByZWFkIGNvbnRleHQKKy8vLyBcaW5wdXQgZmlsZTogbWFwcGVkIHN0b3JhZ2UgZmlsZQorLy8vIFxpbnB1dCBwYWNrYWdlOiB0aGUgZmxhZyBwYWNrYWdlIG5hbWUKKy8vLyBccmV0dXJucyBhIHBhY2thZ2UgcmVhZCBjb250ZXh0CitSZXN1bHQ8UGFja2FnZVJlYWRDb250ZXh0PiBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoCisgICAgTWFwcGVkU3RvcmFnZUZpbGUgY29uc3QmIGZpbGUsCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIHBhY2thZ2UpOworCisvLy8gR2V0IGZsYWcgcmVhZCBjb250ZXh0CisvLy8gXGlucHV0IGZpbGU6IG1hcHBlZCBzdG9yYWdlIGZpbGUKKy8vLyBcaW5wdXQgcGFja2FnZV9pZDogdGhlIGZsYWcgcGFja2FnZSBpZCBvYnRhaW5lZCBmcm9tIHBhY2thZ2Ugb2Zmc2V0IHF1ZXJ5CisvLy8gXGlucHV0IGZsYWdfbmFtZTogZmxhZyBuYW1lCisvLy8gXHJldHVybnMgdGhlIGZsYWcgcmVhZCBjb250ZXh0CitSZXN1bHQ8RmxhZ1JlYWRDb250ZXh0PiBnZXRfZmxhZ19yZWFkX2NvbnRleHQoCisgICAgTWFwcGVkU3RvcmFnZUZpbGUgY29uc3QmIGZpbGUsCisgICAgdWludDMyX3QgcGFja2FnZV9pZCwKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgZmxhZ19uYW1lKTsKKworLy8vIEdldCBib29sZWFuIGZsYWcgdmFsdWUKKy8vLyBcaW5wdXQgZmlsZTogbWFwcGVkIHN0b3JhZ2UgZmlsZQorLy8vIFxpbnB1dCBpbmRleDogdGhlIGJvb2xlYW4gZmxhZyBpbmRleCBpbiB0aGUgZmlsZQorLy8vIFxyZXR1cm5zIHRoZSBib29sZWFuIGZsYWcgdmFsdWUKK1Jlc3VsdDxib29sPiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKAorICAgIE1hcHBlZFN0b3JhZ2VGaWxlIGNvbnN0JiBmaWxlLAorICAgIHVpbnQzMl90IGluZGV4KTsKKworLy8vIEdldCBib29sZWFuIGZsYWcgYXR0cmlidXRlCisvLy8gXGlucHV0IGZpbGU6IG1hcHBlZCBzdG9yYWdlIGZpbGUKKy8vLyBcaW5wdXQgdmFsdWVfdHlwZTogZmxhZyB2YWx1ZSB0eXBlCisvLy8gXGlucHV0IGluZGV4OiB0aGUgYm9vbGVhbiBmbGFnIGluZGV4IGluIHRoZSBmaWxlCisvLy8gXHJldHVybnMgdGhlIGJvb2xlYW4gZmxhZyBhdHRyaWJ1dGUKK1Jlc3VsdDx1aW50OF90PiBnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgTWFwcGVkU3RvcmFnZUZpbGUgY29uc3QmIGZpbGUsCisgICAgRmxhZ1ZhbHVlVHlwZSB2YWx1ZV90eXBlLAorICAgIHVpbnQzMl90IGluZGV4KTsKK30gLy8gbmFtZXNwYWNlIGFjb25maWdfc3RvcmFnZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvbGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2NjLm1hcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2xpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jYy5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0N2UwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2xpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jYy5tYXAKQEAgLTAsMCArMSwxMSBAQAorTElCQUNPTkZJR19TVE9SQUdFX1JFQURfQVBJX0NDIHsKKyAgIyBFeHBvcnQgZXZlcnl0aGluZyBpbiB0aGUgYWNvbmZpZ19zdG9yYWdlIG5hbWVzcGFjZS4gVGhpcyBpbmNsdWRlcyBib3RoIHRoZQorICAjIHB1YmxpYyBBUEkgYW5kIGxpYnJhcnkgaW50ZXJuYWxzLgorICBnbG9iYWw6CisgICAgZXh0ZXJuICJDKysiIHsKKyAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjoqOworICAgIH07CisgICMgSGlkZSBldmVyeXRoaW5nIGVsc2UuCisgIGxvY2FsOgorICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2ZsYWdfaW5mb19xdWVyeS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX2luZm9fcXVlcnkucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwMzM3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX2luZm9fcXVlcnkucnMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgZmxhZyB2YWx1ZSBxdWVyeSBtb2R1bGUgZGVmaW5lcyB0aGUgZmxhZyB2YWx1ZSBmaWxlIHJlYWQgZnJvbSBtYXBwZWQgYnl0ZXMKKwordXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRklMRV9WRVJTSU9OfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e2ZsYWdfaW5mbzo6RmxhZ0luZm9IZWFkZXIsIHJlYWRfdThfZnJvbV9ieXRlcywgRmxhZ1ZhbHVlVHlwZX07Cit1c2UgYW55aG93Ojphbnlob3c7CisKKy8vLyBHZXQgZmxhZyBhdHRyaWJ1dGUgYml0ZmllbGQKK3B1YiBmbiBmaW5kX2ZsYWdfYXR0cmlidXRlKAorICAgIGJ1ZjogJlt1OF0sCisgICAgZmxhZ190eXBlOiBGbGFnVmFsdWVUeXBlLAorICAgIGZsYWdfaW5kZXg6IHUzMiwKKykgLT4gUmVzdWx0PHU4LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdJbmZvSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OworICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gY3JhdGU6OkZJTEVfVkVSU0lPTiB7CisgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKGFueWhvdyEoCisgICAgICAgICAgICAiQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9IiwKKyAgICAgICAgICAgIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uLAorICAgICAgICAgICAgRklMRV9WRVJTSU9OCisgICAgICAgICkpKTsKKyAgICB9CisKKyAgICAvLyBnZXQgYnl0ZSBvZmZzZXQgdG8gdGhlIGZsYWcgaW5mbworICAgIGxldCBtdXQgaGVhZCA9IG1hdGNoIGZsYWdfdHlwZSB7CisgICAgICAgIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4gPT4gKGludGVycHJldGVkX2hlYWRlci5ib29sZWFuX2ZsYWdfb2Zmc2V0ICsgZmxhZ19pbmRleCkgYXMgdXNpemUsCisgICAgfTsKKworICAgIGlmIGhlYWQgPj0gaW50ZXJwcmV0ZWRfaGVhZGVyLmZpbGVfc2l6ZSBhcyB1c2l6ZSB7CisgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SW52YWxpZFN0b3JhZ2VGaWxlT2Zmc2V0KGFueWhvdyEoCisgICAgICAgICAgICAiRmxhZyBpbmZvIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLiIKKyAgICAgICAgKSkpOworICAgIH0KKworICAgIGxldCB2YWwgPSByZWFkX3U4X2Zyb21fYnl0ZXMoYnVmLCAmbXV0IGhlYWQpPzsKKyAgICBPayh2YWwpCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QsIEZsYWdJbmZvQml0fTsKKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBpZiBmbGFnIGhhcyBzZXJ2ZXIgb3ZlcnJpZGUKKyAgICBmbiB0ZXN0X2lzX2ZsYWdfc3RpY2t5KCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgZm9yIG9mZnNldCBpbiAwLi44IHsKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQorICAgICAgICAgICAgICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19saXN0Wy4uXSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoKGF0dHJpYnV0ZSAmIEZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSBhcyB1OCkgIT0gMHU4LCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgaWYgZmxhZyBpcyByZWFkd3JpdGUKKyAgICBmbiB0ZXN0X2lzX2ZsYWdfcmVhZHdyaXRlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGJhc2VsaW5lOiBWZWM8Ym9vbD4gPSB2ZWMhW3RydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlXTsKKyAgICAgICAgZm9yIG9mZnNldCBpbiAwLi44IHsKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQorICAgICAgICAgICAgICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19saXN0Wy4uXSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICAgICAgKGF0dHJpYnV0ZSAmIEZsYWdJbmZvQml0OjpJc1JlYWRXcml0ZSBhcyB1OCkgIT0gMHU4LAorICAgICAgICAgICAgICAgIGJhc2VsaW5lW29mZnNldCBhcyB1c2l6ZV0KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgaWYgZmxhZyBoYXMgbG9jYWwgb3ZlcnJpZGUKKyAgICBmbiB0ZXN0X2ZsYWdfaGFzX292ZXJyaWRlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgZm9yIG9mZnNldCBpbiAwLi44IHsKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQorICAgICAgICAgICAgICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19saXN0Wy4uXSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoKGF0dHJpYnV0ZSAmIEZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlIGFzIHU4KSAhPSAwdTgsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBiZXlvbmQgdGhlIGVuZCBvZiBib29sZWFuIHNlY3Rpb24KKyAgICBmbiB0ZXN0X2Jvb2xlYW5fb3V0X29mX3JhbmdlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGVycm9yID0KKyAgICAgICAgICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19saXN0Wy4uXSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgOCkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgICJJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoRmxhZyBpbmZvIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLikiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHF1ZXJ5IGVycm9yIHdoZW4gZmlsZSBoYXMgYSBoaWdoZXIgdmVyc2lvbgorICAgIGZuIHRlc3RfaGlnaGVyX3ZlcnNpb25fc3RvcmFnZV9maWxlKCkgeworICAgICAgICBsZXQgbXV0IGluZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCk7CisgICAgICAgIGluZm9fbGlzdC5oZWFkZXIudmVyc2lvbiA9IGNyYXRlOjpGSUxFX1ZFUlNJT04gKyAxOworICAgICAgICBsZXQgZmxhZ19pbmZvID0gaW5mb19saXN0LmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGVycm9yID0gZmluZF9mbGFnX2F0dHJpYnV0ZSgmZmxhZ19pbmZvWy4uXSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgNCkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgIGZvcm1hdCEoCisgICAgICAgICAgICAgICAgIkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30pIiwKKyAgICAgICAgICAgICAgICBjcmF0ZTo6RklMRV9WRVJTSU9OICsgMSwKKyAgICAgICAgICAgICAgICBjcmF0ZTo6RklMRV9WRVJTSU9OCisgICAgICAgICAgICApCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2ZsYWdfdGFibGVfcXVlcnkucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ190YWJsZV9xdWVyeS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWE0NzkzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2ZsYWdfdGFibGVfcXVlcnkucnMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgZmxhZyB0YWJsZSBxdWVyeSBtb2R1bGUgZGVmaW5lcyB0aGUgZmxhZyB0YWJsZSBmaWxlIHJlYWQgZnJvbSBtYXBwZWQgYnl0ZXMKKwordXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRklMRV9WRVJTSU9OfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6eworICAgIGZsYWdfdGFibGU6OkZsYWdUYWJsZUhlYWRlciwgZmxhZ190YWJsZTo6RmxhZ1RhYmxlTm9kZSwgcmVhZF91MzJfZnJvbV9ieXRlcywgU3RvcmVkRmxhZ1R5cGUsCit9OwordXNlIGFueWhvdzo6YW55aG93OworCisvLy8gRmxhZyB0YWJsZSBxdWVyeSByZXR1cm4KKyNbZGVyaXZlKFBhcnRpYWxFcSwgRGVidWcpXQorcHViIHN0cnVjdCBGbGFnUmVhZENvbnRleHQgeworICAgIHB1YiBmbGFnX3R5cGU6IFN0b3JlZEZsYWdUeXBlLAorICAgIHB1YiBmbGFnX2luZGV4OiB1MTYsCit9CisKKy8vLyBRdWVyeSBmbGFnIHJlYWQgY29udGV4dDogZmxhZyB0eXBlIGFuZCB3aXRoaW4gcGFja2FnZSBmbGFnIGluZGV4CitwdWIgZm4gZmluZF9mbGFnX3JlYWRfY29udGV4dCgKKyAgICBidWY6ICZbdThdLAorICAgIHBhY2thZ2VfaWQ6IHUzMiwKKyAgICBmbGFnOiAmc3RyLAorKSAtPiBSZXN1bHQ8T3B0aW9uPEZsYWdSZWFkQ29udGV4dD4sIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ1RhYmxlSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OworICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gY3JhdGU6OkZJTEVfVkVSU0lPTiB7CisgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKGFueWhvdyEoCisgICAgICAgICAgICAiQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9IiwKKyAgICAgICAgICAgIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uLAorICAgICAgICAgICAgRklMRV9WRVJTSU9OCisgICAgICAgICkpKTsKKyAgICB9CisKKyAgICBsZXQgbnVtX2J1Y2tldHMgPSAoaW50ZXJwcmV0ZWRfaGVhZGVyLm5vZGVfb2Zmc2V0IC0gaW50ZXJwcmV0ZWRfaGVhZGVyLmJ1Y2tldF9vZmZzZXQpIC8gNDsKKyAgICBsZXQgYnVja2V0X2luZGV4ID0gRmxhZ1RhYmxlTm9kZTo6ZmluZF9idWNrZXRfaW5kZXgocGFja2FnZV9pZCwgZmxhZywgbnVtX2J1Y2tldHMpOworCisgICAgbGV0IG11dCBwb3MgPSAoaW50ZXJwcmV0ZWRfaGVhZGVyLmJ1Y2tldF9vZmZzZXQgKyA0ICogYnVja2V0X2luZGV4KSBhcyB1c2l6ZTsKKyAgICBsZXQgbXV0IGZsYWdfbm9kZV9vZmZzZXQgPSByZWFkX3UzMl9mcm9tX2J5dGVzKGJ1ZiwgJm11dCBwb3MpPyBhcyB1c2l6ZTsKKyAgICBpZiBmbGFnX25vZGVfb2Zmc2V0IDwgaW50ZXJwcmV0ZWRfaGVhZGVyLm5vZGVfb2Zmc2V0IGFzIHVzaXplCisgICAgICAgIHx8IGZsYWdfbm9kZV9vZmZzZXQgPj0gaW50ZXJwcmV0ZWRfaGVhZGVyLmZpbGVfc2l6ZSBhcyB1c2l6ZQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9rKE5vbmUpOworICAgIH0KKworICAgIGxvb3AgeworICAgICAgICBsZXQgaW50ZXJwcmV0ZWRfbm9kZSA9IEZsYWdUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJmJ1ZltmbGFnX25vZGVfb2Zmc2V0Li5dKT87CisgICAgICAgIGlmIGludGVycHJldGVkX25vZGUucGFja2FnZV9pZCA9PSBwYWNrYWdlX2lkICYmIGludGVycHJldGVkX25vZGUuZmxhZ19uYW1lID09IGZsYWcgeworICAgICAgICAgICAgcmV0dXJuIE9rKFNvbWUoRmxhZ1JlYWRDb250ZXh0IHsKKyAgICAgICAgICAgICAgICBmbGFnX3R5cGU6IGludGVycHJldGVkX25vZGUuZmxhZ190eXBlLAorICAgICAgICAgICAgICAgIGZsYWdfaW5kZXg6IGludGVycHJldGVkX25vZGUuZmxhZ19pbmRleCwKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorICAgICAgICBtYXRjaCBpbnRlcnByZXRlZF9ub2RlLm5leHRfb2Zmc2V0IHsKKyAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiBmbGFnX25vZGVfb2Zmc2V0ID0gb2Zmc2V0IGFzIHVzaXplLAorICAgICAgICAgICAgTm9uZSA9PiByZXR1cm4gT2soTm9uZSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3RhYmxlOworCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRhYmxlIHF1ZXJ5CisgICAgZm4gdGVzdF9mbGFnX3F1ZXJ5KCkgeworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBiYXNlbGluZSA9IHZlYyFbCisgICAgICAgICAgICAoMCwgImVuYWJsZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuLCAxdTE2KSwKKyAgICAgICAgICAgICgwLCAiZW5hYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAydTE2KSwKKyAgICAgICAgICAgICgyLCAiZW5hYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAxdTE2KSwKKyAgICAgICAgICAgICgxLCAiZGlzYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwgMHUxNiksCisgICAgICAgICAgICAoMSwgImVuYWJsZWRfZml4ZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sIDF1MTYpLAorICAgICAgICAgICAgKDEsICJlbmFibGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwgMnUxNiksCisgICAgICAgICAgICAoMiwgImVuYWJsZWRfZml4ZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sIDB1MTYpLAorICAgICAgICAgICAgKDAsICJkaXNhYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAwdTE2KSwKKyAgICAgICAgXTsKKyAgICAgICAgZm9yIChwYWNrYWdlX2lkLCBmbGFnX25hbWUsIGZsYWdfdHlwZSwgZmxhZ19pbmRleCkgaW4gYmFzZWxpbmUuaW50b19pdGVyKCkgeworICAgICAgICAgICAgbGV0IGZsYWdfY29udGV4dCA9CisgICAgICAgICAgICAgICAgZmluZF9mbGFnX3JlYWRfY29udGV4dCgmZmxhZ190YWJsZVsuLl0sIHBhY2thZ2VfaWQsIGZsYWdfbmFtZSkudW53cmFwKCkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGZsYWdfY29udGV4dC5mbGFnX3R5cGUsIGZsYWdfdHlwZSk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGZsYWdfY29udGV4dC5mbGFnX2luZGV4LCBmbGFnX2luZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0YWJsZSBxdWVyeSBvZiBhIG5vbiBleGlzdCBmbGFnCisgICAgZm4gdGVzdF9ub3RfZXhpc3RlZF9mbGFnX3F1ZXJ5KCkgeworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBmbGFnX2NvbnRleHQgPSBmaW5kX2ZsYWdfcmVhZF9jb250ZXh0KCZmbGFnX3RhYmxlWy4uXSwgMSwgImRpc2FibGVkX2ZpeGVkX3JvIikudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19jb250ZXh0LCBOb25lKTsKKyAgICAgICAgbGV0IGZsYWdfY29udGV4dCA9IGZpbmRfZmxhZ19yZWFkX2NvbnRleHQoJmZsYWdfdGFibGVbLi5dLCAyLCAiZGlzYWJsZWRfcnciKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2NvbnRleHQsIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBlcnJvciB3aGVuIGZpbGUgaGFzIGEgaGlnaGVyIHZlcnNpb24KKyAgICBmbiB0ZXN0X2hpZ2hlcl92ZXJzaW9uX3N0b3JhZ2VfZmlsZSgpIHsKKyAgICAgICAgbGV0IG11dCB0YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoKTsKKyAgICAgICAgdGFibGUuaGVhZGVyLnZlcnNpb24gPSBjcmF0ZTo6RklMRV9WRVJTSU9OICsgMTsKKyAgICAgICAgbGV0IGZsYWdfdGFibGUgPSB0YWJsZS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBlcnJvciA9IGZpbmRfZmxhZ19yZWFkX2NvbnRleHQoJmZsYWdfdGFibGVbLi5dLCAwLCAiZW5hYmxlZF9ybyIpLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCisgICAgICAgICAgICBmb3JtYXQhKAorICAgICAgICAgICAgICAgICJIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9KSIsCisgICAgICAgICAgICAgICAgY3JhdGU6OkZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgY3JhdGU6OkZJTEVfVkVSU0lPTgorICAgICAgICAgICAgKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3ZhbHVlX3F1ZXJ5LnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2ZsYWdfdmFsdWVfcXVlcnkucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzMmExNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3ZhbHVlX3F1ZXJ5LnJzCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgZmxhZyB2YWx1ZSBxdWVyeSBtb2R1bGUgZGVmaW5lcyB0aGUgZmxhZyB2YWx1ZSBmaWxlIHJlYWQgZnJvbSBtYXBwZWQgYnl0ZXMKKwordXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRklMRV9WRVJTSU9OfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e2ZsYWdfdmFsdWU6OkZsYWdWYWx1ZUhlYWRlciwgcmVhZF91OF9mcm9tX2J5dGVzfTsKK3VzZSBhbnlob3c6OmFueWhvdzsKKworLy8vIFF1ZXJ5IGZsYWcgdmFsdWUKK3B1YiBmbiBmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZShidWY6ICZbdThdLCBmbGFnX2luZGV4OiB1MzIpIC0+IFJlc3VsdDxib29sLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdWYWx1ZUhlYWRlcjo6ZnJvbV9ieXRlcyhidWYpPzsKKyAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IGNyYXRlOjpGSUxFX1ZFUlNJT04geworICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihhbnlob3chKAorICAgICAgICAgICAgIkNhbm5vdCByZWFkIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSIsCisgICAgICAgICAgICBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiwKKyAgICAgICAgICAgIEZJTEVfVkVSU0lPTgorICAgICAgICApKSk7CisgICAgfQorCisgICAgLy8gRmluZCBieXRlIG9mZnNldCB0byB0aGUgZmxhZyB2YWx1ZSwgZWFjaCBib29sZWFuIGZsYWcgY29zdCBvbmUgYnl0ZSB0byBzdG9yZQorICAgIGxldCBtdXQgaGVhZCA9IChpbnRlcnByZXRlZF9oZWFkZXIuYm9vbGVhbl92YWx1ZV9vZmZzZXQgKyBmbGFnX2luZGV4KSBhcyB1c2l6ZTsKKyAgICBpZiBoZWFkID49IGludGVycHJldGVkX2hlYWRlci5maWxlX3NpemUgYXMgdXNpemUgeworICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkludmFsaWRTdG9yYWdlRmlsZU9mZnNldChhbnlob3chKAorICAgICAgICAgICAgIkZsYWcgdmFsdWUgb2Zmc2V0IGdvZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUuIgorICAgICAgICApKSk7CisgICAgfQorCisgICAgbGV0IHZhbCA9IHJlYWRfdThfZnJvbV9ieXRlcyhidWYsICZtdXQgaGVhZCk/OworICAgIE9rKHZhbCA9PSAxKQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0OworCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZsYWcgdmFsdWUgcXVlcnkKKyAgICBmbiB0ZXN0X2ZsYWdfdmFsdWVfcXVlcnkoKSB7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBiYXNlbGluZTogVmVjPGJvb2w+ID0gdmVjIVtmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWVdOworICAgICAgICBmb3IgKG9mZnNldCwgZXhwZWN0ZWRfdmFsdWUpIGluIGJhc2VsaW5lLmludG9faXRlcigpLmVudW1lcmF0ZSgpIHsKKyAgICAgICAgICAgIGxldCBmbGFnX3ZhbHVlID0gZmluZF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsdWVfbGlzdFsuLl0sIG9mZnNldCBhcyB1MzIpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShmbGFnX3ZhbHVlLCBleHBlY3RlZF92YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgYmV5b25kIHRoZSBlbmQgb2YgYm9vbGVhbiBzZWN0aW9uCisgICAgZm4gdGVzdF9ib29sZWFuX291dF9vZl9yYW5nZSgpIHsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGVycm9yID0gZmluZF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsdWVfbGlzdFsuLl0sIDgpLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCisgICAgICAgICAgICAiSW52YWxpZFN0b3JhZ2VGaWxlT2Zmc2V0KEZsYWcgdmFsdWUgb2Zmc2V0IGdvZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUuKSIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgZXJyb3Igd2hlbiBmaWxlIGhhcyBhIGhpZ2hlciB2ZXJzaW9uCisgICAgZm4gdGVzdF9oaWdoZXJfdmVyc2lvbl9zdG9yYWdlX2ZpbGUoKSB7CisgICAgICAgIGxldCBtdXQgdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOworICAgICAgICB2YWx1ZV9saXN0LmhlYWRlci52ZXJzaW9uID0gY3JhdGU6OkZJTEVfVkVSU0lPTiArIDE7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlID0gdmFsdWVfbGlzdC5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBlcnJvciA9IGZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbHVlWy4uXSwgNCkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgIGZvcm1hdCEoCisgICAgICAgICAgICAgICAgIkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30pIiwKKyAgICAgICAgICAgICAgICBjcmF0ZTo6RklMRV9WRVJTSU9OICsgMSwKKyAgICAgICAgICAgICAgICBjcmF0ZTo6RklMRV9WRVJTSU9OCisgICAgICAgICAgICApCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2Y2YzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9saWIucnMKQEAgLTAsMCArMSw1MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaWAgaXMgYSBjcmF0ZSB0aGF0IGRlZmluZXMgcmVhZCBhcGlzIHRvIHJlYWQgZmxhZ3MgZnJvbSBzdG9yYWdlCisvLyEgZmlsZXMuIEl0IHByb3ZpZGVzIGZvdXIgYXBpcyB0byBpbnRlcmZhY2Ugd2l0aCBzdG9yYWdlIGZpbGVzOgorLy8hCisvLyEgMSwgZnVuY3Rpb24gdG8gZ2V0IHBhY2thZ2UgcmVhZCBjb250ZXh0CisvLyEgcHViIGZuIGdldF9wYWNrYWdlcl9yZWFkX2NvbnRleHQoY29udGFpbmVyOiAmc3RyLCBwYWNrYWdlOiAmc3RyKQorLy8hIC0+IGBSZXN1bHQ8T3B0aW9uPFBhY2thZ2VSZWFkQ29udGV4dD4+PmAKKy8vIQorLy8hIDIsIGZ1bmN0aW9uIHRvIGdldCBmbGFnIHJlYWQgY29udGV4dAorLy8hIHB1YiBmbiBnZXRfZmxhZ19yZWFkX2NvbnRleHQoY29udGFpbmVyOiAmc3RyLCBwYWNrYWdlX2lkOiB1MzIsIGZsYWc6ICZzdHIpCisvLyEgLT4gYFJlc3VsdDxPcHRpb248RmxhZ1JlYWRDb250ZXh0Pj4+YAorLy8hCisvLyEgMywgZnVuY3Rpb24gdG8gZ2V0IHRoZSBhY3R1YWwgZmxhZyB2YWx1ZSBnaXZlbiB0aGUgZ2xvYmFsIGluZGV4IChjb21iaW5lZCBwYWNrYWdlIGFuZAorLy8hIGZsYWcgaW5kZXgpLgorLy8hIHB1YiBmbiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKGNvbnRhaW5lcjogJnN0ciwgb2Zmc2V0OiB1MzIpIC0+IGBSZXN1bHQ8Ym9vbD5gCisvLyEKKy8vISA0LCBmdW5jdGlvbiB0byBnZXQgc3RvcmFnZSBmaWxlIHZlcnNpb24gd2l0aG91dCBtbWFwcGluZyB0aGUgZmlsZS4KKy8vISBwdWIgZm4gZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKGZpbGVfcGF0aDogJnN0cikgLT4gUmVzdWx0PHUzMiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4KKy8vIQorLy8hIE5vdGUgdGhlc2UgYXJlIGxvdyBsZXZlbCBhcGlzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIG9ubHkgdXNlZCBpbiBhdXRvIGdlbmVyYXRlZCBmbGFnCisvLyEgYXBpcy4gRE8gTk9UIERJUkVDVExZIFVTRSBUSEVTRSBBUElTIElOIFlPVVIgU09VUkNFIENPREUuIEZvciBhdXRvIGdlbmVyYXRlZCBmbGFnIGFwaXMKKy8vISBwbGVhc2UgcmVmZXIgdG8gdGhlIGczZG9jIGdvL2FuZHJvaWQtZmxhZ3MKKworcHViIG1vZCBmbGFnX2luZm9fcXVlcnk7CitwdWIgbW9kIGZsYWdfdGFibGVfcXVlcnk7CitwdWIgbW9kIGZsYWdfdmFsdWVfcXVlcnk7CitwdWIgbW9kIG1hcHBlZF9maWxlOworcHViIG1vZCBwYWNrYWdlX3RhYmxlX3F1ZXJ5OworCitwdWIgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRmxhZ1ZhbHVlVHlwZSwgU3RvcmFnZUZpbGVUeXBlfTsKK3B1YiB1c2UgZmxhZ190YWJsZV9xdWVyeTo6RmxhZ1JlYWRDb250ZXh0OworcHViIHVzZSBwYWNrYWdlX3RhYmxlX3F1ZXJ5OjpQYWNrYWdlUmVhZENvbnRleHQ7CisKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e3JlYWRfdTMyX2Zyb21fYnl0ZXMsIEZJTEVfVkVSU0lPTn07Cit1c2UgZmxhZ19pbmZvX3F1ZXJ5OjpmaW5kX2ZsYWdfYXR0cmlidXRlOwordXNlIGZsYWdfdGFibGVfcXVlcnk6OmZpbmRfZmxhZ19yZWFkX2NvbnRleHQ7Cit1c2UgZmxhZ192YWx1ZV9xdWVyeTo6ZmluZF9ib29sZWFuX2ZsYWdfdmFsdWU7Cit1c2UgcGFja2FnZV90YWJsZV9xdWVyeTo6ZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dDsKKwordXNlIGFueWhvdzo6YW55aG93OworcHViIHVzZSBtZW1tYXAyOjpNbWFwOwordXNlIHN0ZDo6ZnM6OkZpbGU7Cit1c2Ugc3RkOjppbzo6UmVhZDsKKworLy8vIFN0b3JhZ2UgZmlsZSBsb2NhdGlvbgorcHViIGNvbnN0IFNUT1JBR0VfTE9DQVRJT046ICZzdHIgPSAiL21ldGFkYXRhL2Fjb25maWciOworCisvLy8gR2V0IHJlYWQgb25seSBtYXBwZWQgc3RvcmFnZSBmaWxlcy4KKy8vLworLy8vIFxpbnB1dCBjb250YWluZXI6IHRoZSBmbGFnIHBhY2thZ2UgY29udGFpbmVyCisvLy8gXGlucHV0IGZpbGVfdHlwZTogc3RvYXJnZSBmaWxlIHR5cGUgZW51bQorLy8vIFxyZXR1cm4gYSByZXN1bHQgb2YgcmVhZCBvbmx5IG1hcHBlZCBmaWxlCisvLy8KKy8vLyAjIFNhZmV0eQorLy8vCisvLy8gVGhlIG1lbW9yeSBtYXBwZWQgZmlsZSBtYXkgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgaWYgdGhlcmUgYXJlIHdyaXRlcyB0byB0aGlzCisvLy8gZmlsZSBhZnRlciBiZWluZyBtYXBwZWQuIEVuc3VyZSBubyB3cml0ZXMgY2FuIGhhcHBlbiB0byB0aGlzIGZpbGUgd2hpbGUgdGhpcworLy8vIG1hcHBpbmcgc3RheXMgYWxpdmUuCitwdWIgdW5zYWZlIGZuIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKAorICAgIGNvbnRhaW5lcjogJnN0ciwKKyAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZSwKKykgLT4gUmVzdWx0PE1tYXAsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICB1bnNhZmUgeyBjcmF0ZTo6bWFwcGVkX2ZpbGU6OmdldF9tYXBwZWRfZmlsZShTVE9SQUdFX0xPQ0FUSU9OLCBjb250YWluZXIsIGZpbGVfdHlwZSkgfQorfQorCisvLy8gR2V0IHBhY2thZ2UgcmVhZCBjb250ZXh0IGZvciBhIHNwZWNpZmljIHBhY2thZ2UuCisvLy8KKy8vLyBcaW5wdXQgZmlsZTogbWFwcGVkIHBhY2thZ2UgZmlsZQorLy8vIFxpbnB1dCBwYWNrYWdlOiBwYWNrYWdlIG5hbWUKKy8vLworLy8vIFxyZXR1cm4KKy8vLyBJZiBhIHBhY2thZ2UgaXMgZm91bmQsIGl0IHJldHVybnMgT2soU29tZShQYWNrYWdlUmVhZENvbnRleHQpKQorLy8vIElmIGEgcGFja2FnZSBpcyBub3QgZm91bmQsIGl0IHJldHVybnMgT2soTm9uZSkKKy8vLyBJZiBlcnJvcnMgb3V0LCBpdCByZXR1cm5zIGFuIEVycihlcnJtc2cpCitwdWIgZm4gZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAorICAgIGZpbGU6ICZNbWFwLAorICAgIHBhY2thZ2U6ICZzdHIsCispIC0+IFJlc3VsdDxPcHRpb248UGFja2FnZVJlYWRDb250ZXh0PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoZmlsZSwgcGFja2FnZSkKK30KKworLy8vIEdldCBmbGFnIHJlYWQgY29udGV4dCBmb3IgYSBzcGVjaWZpYyBmbGFnLgorLy8vCisvLy8gXGlucHV0IGZpbGU6IG1hcHBlZCBmbGFnIGZpbGUKKy8vLyBcaW5wdXQgcGFja2FnZV9pZDogcGFja2FnZSBpZCBvYnRhaW5lZCBmcm9tIHBhY2thZ2UgbWFwcGluZyBmaWxlCisvLy8gXGlucHV0IGZsYWc6IGZsYWcgbmFtZQorLy8vCisvLy8gXHJldHVybgorLy8vIElmIGEgZmxhZyBpcyBmb3VuZCwgaXQgcmV0dXJucyBPayhTb21lKEZsYWdSZWFkQ29udGV4dCkpCisvLy8gSWYgYSBmbGFnIGlzIG5vdCBmb3VuZCwgaXQgcmV0dXJucyBPayhOb25lKQorLy8vIElmIGVycm9ycyBvdXQsIGl0IHJldHVybnMgYW4gRXJyKGVycm1zZykKK3B1YiBmbiBnZXRfZmxhZ19yZWFkX2NvbnRleHQoCisgICAgZmlsZTogJk1tYXAsCisgICAgcGFja2FnZV9pZDogdTMyLAorICAgIGZsYWc6ICZzdHIsCispIC0+IFJlc3VsdDxPcHRpb248RmxhZ1JlYWRDb250ZXh0PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGZpbmRfZmxhZ19yZWFkX2NvbnRleHQoZmlsZSwgcGFja2FnZV9pZCwgZmxhZykKK30KKworLy8vIEdldCB0aGUgYm9vbGVhbiBmbGFnIHZhbHVlLgorLy8vCisvLy8gXGlucHV0IGZpbGU6IG1hcHBlZCBmbGFnIGZpbGUKKy8vLyBcaW5wdXQgaW5kZXg6IGJvb2xlYW4gZmxhZyBvZmZzZXQKKy8vLworLy8vIFxyZXR1cm4KKy8vLyBJZiB0aGUgcHJvdmlkZSBvZmZzZXQgaXMgdmFsaWQsIGl0IHJldHVybnMgdGhlIGJvb2xlYW4gZmxhZyB2YWx1ZSwgb3RoZXJ3aXNlIGl0CisvLy8gcmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZS4KK3B1YiBmbiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKGZpbGU6ICZNbWFwLCBpbmRleDogdTMyKSAtPiBSZXN1bHQ8Ym9vbCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlKGZpbGUsIGluZGV4KQorfQorCisvLy8gR2V0IHN0b3JhZ2UgZmlsZSB2ZXJzaW9uIG51bWJlcgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiB3b3VsZCByZWFkIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBmaWxlIGFuZCBpbnRlcnByZXQgaXQgYXMgdGhlCisvLy8gdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUuIFRoZXJlIGFyZSB1bml0IHRlc3RzIGluIGFjb25maWdfc3RvcmFnZV9maWxlIGNyYXRlIHRvCisvLy8gbG9jayBkb3duIHRoYXQgZm9yIGFsbCBzdG9yYWdlIGZpbGVzLCB0aGUgZmlyc3QgZm91ciBieXRlcyB3aWxsIGJlIHRoZSB2ZXJzaW9uCisvLy8gbnVtYmVyIG9mIHRoZSBzdG9yYWdlIGZpbGUKK3B1YiBmbiBnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oZmlsZV9wYXRoOiAmc3RyKSAtPiBSZXN1bHQ8dTMyLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IG11dCBmaWxlID0gRmlsZTo6b3BlbihmaWxlX3BhdGgpLm1hcF9lcnIofGVycm1zZ3wgeworICAgICAgICBBY29uZmlnU3RvcmFnZUVycm9yOjpGaWxlUmVhZEZhaWwoYW55aG93ISgiRmFpbGVkIHRvIG9wZW4gZmlsZSB7fToge30iLCBmaWxlX3BhdGgsIGVycm1zZykpCisgICAgfSk/OworICAgIGxldCBtdXQgYnVmZmVyID0gWzA7IDRdOworICAgIGZpbGUucmVhZCgmbXV0IGJ1ZmZlcikubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVSZWFkRmFpbChhbnlob3chKAorICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIDQgYnl0ZXMgZnJvbSBmaWxlIHt9OiB7fSIsCisgICAgICAgICAgICBmaWxlX3BhdGgsCisgICAgICAgICAgICBlcnJtc2cKKyAgICAgICAgKSkKKyAgICB9KT87CisgICAgbGV0IG11dCBoZWFkID0gMDsKKyAgICByZWFkX3UzMl9mcm9tX2J5dGVzKCZidWZmZXIsICZtdXQgaGVhZCkKK30KKworLy8vIEdldCB0aGUgZmxhZyBhdHRyaWJ1dGUuCisvLy8KKy8vLyBcaW5wdXQgZmlsZTogbWFwcGVkIGZsYWcgaW5mbyBmaWxlCisvLy8gXGlucHV0IGZsYWdfdHlwZTogZmxhZyB2YWx1ZSB0eXBlCisvLy8gXGlucHV0IGZsYWdfaW5kZXg6IGZsYWcgaW5kZXgKKy8vLworLy8vIFxyZXR1cm4KKy8vLyBJZiB0aGUgcHJvdmlkZSBvZmZzZXQgaXMgdmFsaWQsIGl0IHJldHVybnMgdGhlIGZsYWcgYXR0cmlidXRlIGJpdGZpbGVkLCBvdGhlcndpc2UgaXQKKy8vLyByZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlLgorcHViIGZuIGdldF9mbGFnX2F0dHJpYnV0ZSgKKyAgICBmaWxlOiAmTW1hcCwKKyAgICBmbGFnX3R5cGU6IEZsYWdWYWx1ZVR5cGUsCisgICAgZmxhZ19pbmRleDogdTMyLAorKSAtPiBSZXN1bHQ8dTgsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBmaW5kX2ZsYWdfYXR0cmlidXRlKGZpbGUsIGZsYWdfdHlwZSwgZmxhZ19pbmRleCkKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCisvLyBDQyBJTlRFUkxPUAorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCisKKy8vIEV4cG9ydGVkIHJ1c3QgZGF0YSBzdHJ1Y3R1cmUgYW5kIG1ldGhvZHMsIGMrKyBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkCisjW2N4eDo6YnJpZGdlXQorbW9kIGZmaSB7CisgICAgLy8gU3RvcmFnZSBmaWxlIHZlcnNpb24gcXVlcnkgcmV0dXJuIGZvciBjYyBpbnRlcmxvcAorICAgIHB1YiBzdHJ1Y3QgVmVyc2lvbk51bWJlclF1ZXJ5Q1hYIHsKKyAgICAgICAgcHViIHF1ZXJ5X3N1Y2Nlc3M6IGJvb2wsCisgICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCisgICAgICAgIHB1YiB2ZXJzaW9uX251bWJlcjogdTMyLAorICAgIH0KKworICAgIC8vIFBhY2thZ2UgdGFibGUgcXVlcnkgcmV0dXJuIGZvciBjYyBpbnRlcmxvcAorICAgIHB1YiBzdHJ1Y3QgUGFja2FnZVJlYWRDb250ZXh0UXVlcnlDWFggeworICAgICAgICBwdWIgcXVlcnlfc3VjY2VzczogYm9vbCwKKyAgICAgICAgcHViIGVycm9yX21lc3NhZ2U6IFN0cmluZywKKyAgICAgICAgcHViIHBhY2thZ2VfZXhpc3RzOiBib29sLAorICAgICAgICBwdWIgcGFja2FnZV9pZDogdTMyLAorICAgICAgICBwdWIgYm9vbGVhbl9zdGFydF9pbmRleDogdTMyLAorICAgIH0KKworICAgIC8vIEZsYWcgdGFibGUgcXVlcnkgcmV0dXJuIGZvciBjYyBpbnRlcmxvcAorICAgIHB1YiBzdHJ1Y3QgRmxhZ1JlYWRDb250ZXh0UXVlcnlDWFggeworICAgICAgICBwdWIgcXVlcnlfc3VjY2VzczogYm9vbCwKKyAgICAgICAgcHViIGVycm9yX21lc3NhZ2U6IFN0cmluZywKKyAgICAgICAgcHViIGZsYWdfZXhpc3RzOiBib29sLAorICAgICAgICBwdWIgZmxhZ190eXBlOiB1MTYsCisgICAgICAgIHB1YiBmbGFnX2luZGV4OiB1MTYsCisgICAgfQorCisgICAgLy8gRmxhZyB2YWx1ZSBxdWVyeSByZXR1cm4gZm9yIGNjIGludGVybG9wCisgICAgcHViIHN0cnVjdCBCb29sZWFuRmxhZ1ZhbHVlUXVlcnlDWFggeworICAgICAgICBwdWIgcXVlcnlfc3VjY2VzczogYm9vbCwKKyAgICAgICAgcHViIGVycm9yX21lc3NhZ2U6IFN0cmluZywKKyAgICAgICAgcHViIGZsYWdfdmFsdWU6IGJvb2wsCisgICAgfQorCisgICAgLy8gRmxhZyBpbmZvIHF1ZXJ5IHJldHVybiBmb3IgY2MgaW50ZXJsb3AKKyAgICBwdWIgc3RydWN0IEZsYWdBdHRyaWJ1dGVRdWVyeUNYWCB7CisgICAgICAgIHB1YiBxdWVyeV9zdWNjZXNzOiBib29sLAorICAgICAgICBwdWIgZXJyb3JfbWVzc2FnZTogU3RyaW5nLAorICAgICAgICBwdWIgZmxhZ19hdHRyaWJ1dGU6IHU4LAorICAgIH0KKworICAgIC8vIFJ1c3QgZXhwb3J0IHRvIGMrKworICAgIGV4dGVybiAiUnVzdCIgeworICAgICAgICBwdWIgZm4gZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uX2N4eChmaWxlX3BhdGg6ICZzdHIpIC0+IFZlcnNpb25OdW1iZXJRdWVyeUNYWDsKKworICAgICAgICBwdWIgZm4gZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0X2N4eCgKKyAgICAgICAgICAgIGZpbGU6ICZbdThdLAorICAgICAgICAgICAgcGFja2FnZTogJnN0ciwKKyAgICAgICAgKSAtPiBQYWNrYWdlUmVhZENvbnRleHRRdWVyeUNYWDsKKworICAgICAgICBwdWIgZm4gZ2V0X2ZsYWdfcmVhZF9jb250ZXh0X2N4eCgKKyAgICAgICAgICAgIGZpbGU6ICZbdThdLAorICAgICAgICAgICAgcGFja2FnZV9pZDogdTMyLAorICAgICAgICAgICAgZmxhZzogJnN0ciwKKyAgICAgICAgKSAtPiBGbGFnUmVhZENvbnRleHRRdWVyeUNYWDsKKworICAgICAgICBwdWIgZm4gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9jeHgoZmlsZTogJlt1OF0sIG9mZnNldDogdTMyKSAtPiBCb29sZWFuRmxhZ1ZhbHVlUXVlcnlDWFg7CisKKyAgICAgICAgcHViIGZuIGdldF9mbGFnX2F0dHJpYnV0ZV9jeHgoCisgICAgICAgICAgICBmaWxlOiAmW3U4XSwKKyAgICAgICAgICAgIGZsYWdfdHlwZTogdTE2LAorICAgICAgICAgICAgZmxhZ19pbmRleDogdTMyLAorICAgICAgICApIC0+IEZsYWdBdHRyaWJ1dGVRdWVyeUNYWDsKKyAgICB9Cit9CisKKy8vLyBJbXBsZW1lbnQgdGhlIHBhY2thZ2Ugb2Zmc2V0IGludGVybG9wIHJldHVybiB0eXBlLCBjcmVhdGUgZnJvbSBhY3R1YWwgcGFja2FnZSBvZmZzZXQgYXBpIHJldHVybiB0eXBlCitpbXBsIGZmaTo6UGFja2FnZVJlYWRDb250ZXh0UXVlcnlDWFggeworICAgIHB1YihjcmF0ZSkgZm4gbmV3KAorICAgICAgICBvZmZzZXRfcmVzdWx0OiBSZXN1bHQ8T3B0aW9uPFBhY2thZ2VSZWFkQ29udGV4dD4sIEFjb25maWdTdG9yYWdlRXJyb3I+LAorICAgICkgLT4gU2VsZiB7CisgICAgICAgIG1hdGNoIG9mZnNldF9yZXN1bHQgeworICAgICAgICAgICAgT2sob2Zmc2V0X29wdCkgPT4gbWF0Y2ggb2Zmc2V0X29wdCB7CisgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IFNlbGYgeworICAgICAgICAgICAgICAgICAgICBxdWVyeV9zdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBTdHJpbmc6OmZyb20oIiIpLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0czogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9pZDogb2Zmc2V0LnBhY2thZ2VfaWQsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IG9mZnNldC5ib29sZWFuX3N0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgTm9uZSA9PiBTZWxmIHsKKyAgICAgICAgICAgICAgICAgICAgcXVlcnlfc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHM6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2lkOiAwLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiAwLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRXJyKGVycm1zZykgPT4gU2VsZiB7CisgICAgICAgICAgICAgICAgcXVlcnlfc3VjY2VzczogZmFsc2UsCisgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogZm9ybWF0ISgiezo/fSIsIGVycm1zZyksCisgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHM6IGZhbHNlLAorICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQ6IDAsCisgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogMCwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBJbXBsZW1lbnQgdGhlIGZsYWcgb2Zmc2V0IGludGVybG9wIHJldHVybiB0eXBlLCBjcmVhdGUgZnJvbSBhY3R1YWwgZmxhZyBvZmZzZXQgYXBpIHJldHVybiB0eXBlCitpbXBsIGZmaTo6RmxhZ1JlYWRDb250ZXh0UXVlcnlDWFggeworICAgIHB1YihjcmF0ZSkgZm4gbmV3KG9mZnNldF9yZXN1bHQ6IFJlc3VsdDxPcHRpb248RmxhZ1JlYWRDb250ZXh0PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4pIC0+IFNlbGYgeworICAgICAgICBtYXRjaCBvZmZzZXRfcmVzdWx0IHsKKyAgICAgICAgICAgIE9rKG9mZnNldF9vcHQpID0+IG1hdGNoIG9mZnNldF9vcHQgeworICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiBTZWxmIHsKKyAgICAgICAgICAgICAgICAgICAgcXVlcnlfc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ19leGlzdHM6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIGZsYWdfdHlwZTogb2Zmc2V0LmZsYWdfdHlwZSBhcyB1MTYsCisgICAgICAgICAgICAgICAgICAgIGZsYWdfaW5kZXg6IG9mZnNldC5mbGFnX2luZGV4LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgTm9uZSA9PiBTZWxmIHsKKyAgICAgICAgICAgICAgICAgICAgcXVlcnlfc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ19leGlzdHM6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmbGFnX3R5cGU6IDB1MTYsCisgICAgICAgICAgICAgICAgICAgIGZsYWdfaW5kZXg6IDB1MTYsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJybXNnKSA9PiBTZWxmIHsKKyAgICAgICAgICAgICAgICBxdWVyeV9zdWNjZXNzOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBmb3JtYXQhKCJ7Oj99IiwgZXJybXNnKSwKKyAgICAgICAgICAgICAgICBmbGFnX2V4aXN0czogZmFsc2UsCisgICAgICAgICAgICAgICAgZmxhZ190eXBlOiAwdTE2LAorICAgICAgICAgICAgICAgIGZsYWdfaW5kZXg6IDB1MTYsCisgICAgICAgICAgICB9LAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gSW1wbGVtZW50IHRoZSBmbGFnIHZhbHVlIGludGVybG9wIHJldHVybiB0eXBlLCBjcmVhdGUgZnJvbSBhY3R1YWwgZmxhZyB2YWx1ZSBhcGkgcmV0dXJuIHR5cGUKK2ltcGwgZmZpOjpCb29sZWFuRmxhZ1ZhbHVlUXVlcnlDWFggeworICAgIHB1YihjcmF0ZSkgZm4gbmV3KHZhbHVlX3Jlc3VsdDogUmVzdWx0PGJvb2wsIEFjb25maWdTdG9yYWdlRXJyb3I+KSAtPiBTZWxmIHsKKyAgICAgICAgbWF0Y2ggdmFsdWVfcmVzdWx0IHsKKyAgICAgICAgICAgIE9rKHZhbHVlKSA9PiB7CisgICAgICAgICAgICAgICAgU2VsZiB7IHF1ZXJ5X3N1Y2Nlc3M6IHRydWUsIGVycm9yX21lc3NhZ2U6IFN0cmluZzo6ZnJvbSgiIiksIGZsYWdfdmFsdWU6IHZhbHVlIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVycihlcnJtc2cpID0+IFNlbGYgeworICAgICAgICAgICAgICAgIHF1ZXJ5X3N1Y2Nlc3M6IGZhbHNlLAorICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAorICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU6IGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIEltcGxlbWVudCB0aGUgZmxhZyBpbmZvIGludGVybG9wIHJldHVybiB0eXBlLCBjcmVhdGUgZnJvbSBhY3R1YWwgZmxhZyBpbmZvIGFwaSByZXR1cm4gdHlwZQoraW1wbCBmZmk6OkZsYWdBdHRyaWJ1dGVRdWVyeUNYWCB7CisgICAgcHViKGNyYXRlKSBmbiBuZXcoaW5mb19yZXN1bHQ6IFJlc3VsdDx1OCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4pIC0+IFNlbGYgeworICAgICAgICBtYXRjaCBpbmZvX3Jlc3VsdCB7CisgICAgICAgICAgICBPayhpbmZvKSA9PiB7CisgICAgICAgICAgICAgICAgU2VsZiB7IHF1ZXJ5X3N1Y2Nlc3M6IHRydWUsIGVycm9yX21lc3NhZ2U6IFN0cmluZzo6ZnJvbSgiIiksIGZsYWdfYXR0cmlidXRlOiBpbmZvIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVycihlcnJtc2cpID0+IFNlbGYgeworICAgICAgICAgICAgICAgIHF1ZXJ5X3N1Y2Nlc3M6IGZhbHNlLAorICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAorICAgICAgICAgICAgICAgIGZsYWdfYXR0cmlidXRlOiAwdTgsCisgICAgICAgICAgICB9LAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gSW1wbGVtZW50IHRoZSBzdG9yYWdlIHZlcnNpb24gbnVtYmVyIGludGVybG9wIHJldHVybiB0eXBlLCBjcmVhdGUgZnJvbSBhY3R1YWwgdmVyc2lvbiBudW1iZXIKKy8vLyBhcGkgcmV0dXJuIHR5cGUKK2ltcGwgZmZpOjpWZXJzaW9uTnVtYmVyUXVlcnlDWFggeworICAgIHB1YihjcmF0ZSkgZm4gbmV3KHZlcnNpb25fcmVzdWx0OiBSZXN1bHQ8dTMyLCBBY29uZmlnU3RvcmFnZUVycm9yPikgLT4gU2VsZiB7CisgICAgICAgIG1hdGNoIHZlcnNpb25fcmVzdWx0IHsKKyAgICAgICAgICAgIE9rKHZlcnNpb24pID0+IFNlbGYgeworICAgICAgICAgICAgICAgIHF1ZXJ5X3N1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSwKKyAgICAgICAgICAgICAgICB2ZXJzaW9uX251bWJlcjogdmVyc2lvbiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJybXNnKSA9PiBTZWxmIHsKKyAgICAgICAgICAgICAgICBxdWVyeV9zdWNjZXNzOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBmb3JtYXQhKCJ7Oj99IiwgZXJybXNnKSwKKyAgICAgICAgICAgICAgICB2ZXJzaW9uX251bWJlcjogMCwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBHZXQgcGFja2FnZSByZWFkIGNvbnRleHQgY2MgaW50ZXJsb3AKK3B1YiBmbiBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHRfY3h4KGZpbGU6ICZbdThdLCBwYWNrYWdlOiAmc3RyKSAtPiBmZmk6OlBhY2thZ2VSZWFkQ29udGV4dFF1ZXJ5Q1hYIHsKKyAgICBmZmk6OlBhY2thZ2VSZWFkQ29udGV4dFF1ZXJ5Q1hYOjpuZXcoZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dChmaWxlLCBwYWNrYWdlKSkKK30KKworLy8vIEdldCBmbGFnIHJlYWQgY29udGV4dCBjYyBpbnRlcmxvcAorcHViIGZuIGdldF9mbGFnX3JlYWRfY29udGV4dF9jeHgoCisgICAgZmlsZTogJlt1OF0sCisgICAgcGFja2FnZV9pZDogdTMyLAorICAgIGZsYWc6ICZzdHIsCispIC0+IGZmaTo6RmxhZ1JlYWRDb250ZXh0UXVlcnlDWFggeworICAgIGZmaTo6RmxhZ1JlYWRDb250ZXh0UXVlcnlDWFg6Om5ldyhmaW5kX2ZsYWdfcmVhZF9jb250ZXh0KGZpbGUsIHBhY2thZ2VfaWQsIGZsYWcpKQorfQorCisvLy8gR2V0IGJvb2xlYW4gZmxhZyB2YWx1ZSBjYyBpbnRlcmxvcAorcHViIGZuIGdldF9ib29sZWFuX2ZsYWdfdmFsdWVfY3h4KGZpbGU6ICZbdThdLCBvZmZzZXQ6IHUzMikgLT4gZmZpOjpCb29sZWFuRmxhZ1ZhbHVlUXVlcnlDWFggeworICAgIGZmaTo6Qm9vbGVhbkZsYWdWYWx1ZVF1ZXJ5Q1hYOjpuZXcoZmluZF9ib29sZWFuX2ZsYWdfdmFsdWUoZmlsZSwgb2Zmc2V0KSkKK30KKworLy8vIEdldCBmbGFnIGF0dHJpYnV0ZSBjYyBpbnRlcmxvcAorcHViIGZuIGdldF9mbGFnX2F0dHJpYnV0ZV9jeHgoCisgICAgZmlsZTogJlt1OF0sCisgICAgZmxhZ190eXBlOiB1MTYsCisgICAgZmxhZ19pbmRleDogdTMyLAorKSAtPiBmZmk6OkZsYWdBdHRyaWJ1dGVRdWVyeUNYWCB7CisgICAgbWF0Y2ggRmxhZ1ZhbHVlVHlwZTo6dHJ5X2Zyb20oZmxhZ190eXBlKSB7CisgICAgICAgIE9rKHZhbHVlX3R5cGUpID0+IHsKKyAgICAgICAgICAgIGZmaTo6RmxhZ0F0dHJpYnV0ZVF1ZXJ5Q1hYOjpuZXcoZmluZF9mbGFnX2F0dHJpYnV0ZShmaWxlLCB2YWx1ZV90eXBlLCBmbGFnX2luZGV4KSkKKyAgICAgICAgfQorICAgICAgICBFcnIoZXJybXNnKSA9PiBmZmk6OkZsYWdBdHRyaWJ1dGVRdWVyeUNYWDo6bmV3KEVycihlcnJtc2cpKSwKKyAgICB9Cit9CisKKy8vLyBHZXQgc3RvcmFnZSB2ZXJzaW9uIG51bWJlciBjYyBpbnRlcmxvcAorcHViIGZuIGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbl9jeHgoZmlsZV9wYXRoOiAmc3RyKSAtPiBmZmk6OlZlcnNpb25OdW1iZXJRdWVyeUNYWCB7CisgICAgZmZpOjpWZXJzaW9uTnVtYmVyUXVlcnlDWFg6Om5ldyhnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oZmlsZV9wYXRoKSkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgY3JhdGU6Om1hcHBlZF9maWxlOjpnZXRfbWFwcGVkX2ZpbGU7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7RmxhZ0luZm9CaXQsIFN0b3JlZEZsYWdUeXBlfTsKKyAgICB1c2UgcmFuZDo6Um5nOworICAgIHVzZSBzdGQ6OmZzOworCisgICAgZm4gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygpIC0+IFN0cmluZyB7CisgICAgICAgIGxldCBtdXQgcm5nID0gcmFuZDo6dGhyZWFkX3JuZygpOworICAgICAgICBsZXQgbnVtYmVyOiB1MzIgPSBybmcuZ2VuKCk7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IFN0cmluZzo6ZnJvbSgiL3RtcC8iKSArICZudW1iZXIudG9fc3RyaW5nKCk7CisgICAgICAgIGlmIHN0ZDo6ZnM6Om1ldGFkYXRhKCZzdG9yYWdlX2RpcikuaXNfb2soKSB7CisgICAgICAgICAgICBmczo6cmVtb3ZlX2Rpcl9hbGwoJnN0b3JhZ2VfZGlyKS51bndyYXAoKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgbWFwc19kaXIgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9tYXBzIjsKKyAgICAgICAgbGV0IGJvb3RfZGlyID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvYm9vdCI7CisgICAgICAgIGZzOjpjcmVhdGVfZGlyKCZzdG9yYWdlX2RpcikudW53cmFwKCk7CisgICAgICAgIGZzOjpjcmVhdGVfZGlyKCZtYXBzX2RpcikudW53cmFwKCk7CisgICAgICAgIGZzOjpjcmVhdGVfZGlyKCZib290X2RpcikudW53cmFwKCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfbWFwID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvbWFwcy9tb2NrdXAucGFja2FnZS5tYXAiOworICAgICAgICBsZXQgZmxhZ19tYXAgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9tYXBzL21vY2t1cC5mbGFnLm1hcCI7CisgICAgICAgIGxldCBmbGFnX3ZhbCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QvbW9ja3VwLnZhbCI7CisgICAgICAgIGxldCBmbGFnX2luZm8gPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9ib290L21vY2t1cC5pbmZvIjsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvcGFja2FnZS5tYXAiLCAmcGFja2FnZV9tYXApLnVud3JhcCgpOworICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9mbGFnLm1hcCIsICZmbGFnX21hcCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2ZsYWcudmFsIiwgJmZsYWdfdmFsKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZmxhZy5pbmZvIiwgJmZsYWdfaW5mbykudW53cmFwKCk7CisKKyAgICAgICAgcmV0dXJuIHN0b3JhZ2VfZGlyOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmbGFnIHBhY2thZ2UgcmVhZCBjb250ZXh0IHF1ZXJ5CisgICAgZm4gdGVzdF9wYWNrYWdlX2NvbnRleHRfcXVlcnkoKSB7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgbGV0IHBhY2thZ2VfbWFwcGVkX2ZpbGUgPSB1bnNhZmUgeworICAgICAgICAgICAgZ2V0X21hcHBlZF9maWxlKCZzdG9yYWdlX2RpciwgIm1vY2t1cCIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCkudW53cmFwKCkKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDAsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAxLCBib29sZWFuX3N0YXJ0X2luZGV4OiAzIH07CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOworCisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcHBlZF9maWxlLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMiwgYm9vbGVhbl9zdGFydF9pbmRleDogNiB9OworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmxhZyByZWFkIGNvbnRleHQgcXVlcnkKKyAgICBmbiB0ZXN0X2ZsYWdfY29udGV4dF9xdWVyeSgpIHsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygpOworICAgICAgICBsZXQgZmxhZ19tYXBwZWRfZmlsZSA9CisgICAgICAgICAgICB1bnNhZmUgeyBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnTWFwKS51bndyYXAoKSB9OworCisgICAgICAgIGxldCBiYXNlbGluZSA9IHZlYyFbCisgICAgICAgICAgICAoMCwgImVuYWJsZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuLCAxdTE2KSwKKyAgICAgICAgICAgICgwLCAiZW5hYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAydTE2KSwKKyAgICAgICAgICAgICgyLCAiZW5hYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAxdTE2KSwKKyAgICAgICAgICAgICgxLCAiZGlzYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwgMHUxNiksCisgICAgICAgICAgICAoMSwgImVuYWJsZWRfZml4ZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sIDF1MTYpLAorICAgICAgICAgICAgKDEsICJlbmFibGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwgMnUxNiksCisgICAgICAgICAgICAoMiwgImVuYWJsZWRfZml4ZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sIDB1MTYpLAorICAgICAgICAgICAgKDAsICJkaXNhYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAwdTE2KSwKKyAgICAgICAgXTsKKyAgICAgICAgZm9yIChwYWNrYWdlX2lkLCBmbGFnX25hbWUsIGZsYWdfdHlwZSwgZmxhZ19pbmRleCkgaW4gYmFzZWxpbmUuaW50b19pdGVyKCkgeworICAgICAgICAgICAgbGV0IGZsYWdfY29udGV4dCA9CisgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfcmVhZF9jb250ZXh0KCZmbGFnX21hcHBlZF9maWxlLCBwYWNrYWdlX2lkLCBmbGFnX25hbWUpLnVud3JhcCgpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2NvbnRleHQuZmxhZ190eXBlLCBmbGFnX3R5cGUpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2NvbnRleHQuZmxhZ19pbmRleCwgZmxhZ19pbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmxhZyB2YWx1ZSBxdWVyeQorICAgIGZuIHRlc3RfZmxhZ192YWx1ZV9xdWVyeSgpIHsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygpOworICAgICAgICBsZXQgZmxhZ192YWx1ZV9maWxlID0KKyAgICAgICAgICAgIHVuc2FmZSB7IGdldF9tYXBwZWRfZmlsZSgmc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpLnVud3JhcCgpIH07CisgICAgICAgIGxldCBiYXNlbGluZTogVmVjPGJvb2w+ID0gdmVjIVtmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWVdOworICAgICAgICBmb3IgKG9mZnNldCwgZXhwZWN0ZWRfdmFsdWUpIGluIGJhc2VsaW5lLmludG9faXRlcigpLmVudW1lcmF0ZSgpIHsKKyAgICAgICAgICAgIGxldCBmbGFnX3ZhbHVlID0gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWx1ZV9maWxlLCBvZmZzZXQgYXMgdTMyKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoZmxhZ192YWx1ZSwgZXhwZWN0ZWRfdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb253IGZsYWcgaW5mbyBxdWVyeQorICAgIGZuIHRlc3RfZmxhZ19pbmZvX3F1ZXJ5KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIGxldCBmbGFnX2luZm9fZmlsZSA9CisgICAgICAgICAgICB1bnNhZmUgeyBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbykudW53cmFwKCkgfTsKKyAgICAgICAgbGV0IGlzX3J3OiBWZWM8Ym9vbD4gPSB2ZWMhW3RydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlXTsKKyAgICAgICAgZm9yIChvZmZzZXQsIGV4cGVjdGVkX3ZhbHVlKSBpbiBpc19ydy5pbnRvX2l0ZXIoKS5lbnVtZXJhdGUoKSB7CisgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICBnZXRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19maWxlLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQgYXMgdTMyKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoKGF0dHJpYnV0ZSAmIEZsYWdJbmZvQml0OjpJc1JlYWRXcml0ZSBhcyB1OCkgIT0gMHU4LCBleHBlY3RlZF92YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnQhKChhdHRyaWJ1dGUgJiBGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpID09IDB1OCk7CisgICAgICAgICAgICBhc3NlcnQhKChhdHRyaWJ1dGUgJiBGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkgPT0gMHU4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmbGFnIHN0b3JhZ2UgZmlsZSB2ZXJzaW9uIG51bWJlciBxdWVyeSBhcGkKKyAgICBmbiB0ZXN0X3N0b3JhZ2VfdmVyc2lvbl9xdWVyeSgpIHsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vdGVzdHMvcGFja2FnZS5tYXAiKS51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL3Rlc3RzL2ZsYWcubWFwIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi90ZXN0cy9mbGFnLnZhbCIpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vdGVzdHMvZmxhZy5pbmZvIikudW53cmFwKCksIDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9tYXBwZWRfZmlsZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9tYXBwZWRfZmlsZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTE2NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL21hcHBlZF9maWxlLnJzCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNlIGFueWhvdzo6YW55aG93OwordXNlIG1lbW1hcDI6Ok1tYXA7Cit1c2Ugc3RkOjpmczo6RmlsZTsKKwordXNlIGNyYXRlOjpBY29uZmlnU3RvcmFnZUVycm9yOjp7c2VsZiwgRmlsZVJlYWRGYWlsLCBNYXBGaWxlRmFpbCwgU3RvcmFnZUZpbGVOb3RGb3VuZH07Cit1c2UgY3JhdGU6OlN0b3JhZ2VGaWxlVHlwZTsKKworLy8vIEdldCB0aGUgcmVhZCBvbmx5IG1lbW9yeSBtYXBwaW5nIG9mIGEgc3RvcmFnZSBmaWxlCisvLy8KKy8vLyAjIFNhZmV0eQorLy8vCisvLy8gVGhlIG1lbW9yeSBtYXBwZWQgZmlsZSBtYXkgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgaWYgdGhlcmUgYXJlIHdyaXRlcyB0byB0aGlzCisvLy8gZmlsZSBhZnRlciBiZWluZyBtYXBwZWQuIEVuc3VyZSBubyB3cml0ZXMgY2FuIGhhcHBlbiB0byB0aGlzIGZpbGUgd2hpbGUgdGhpcworLy8vIG1hcHBpbmcgc3RheXMgYWxpdmUuCit1bnNhZmUgZm4gbWFwX2ZpbGUoZmlsZV9wYXRoOiAmc3RyKSAtPiBSZXN1bHQ8TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBmaWxlID0gRmlsZTo6b3BlbihmaWxlX3BhdGgpCisgICAgICAgIC5tYXBfZXJyKHxlcnJtc2d8IEZpbGVSZWFkRmFpbChhbnlob3chKCJGYWlsZWQgdG8gb3BlbiBmaWxlIHt9OiB7fSIsIGZpbGVfcGF0aCwgZXJybXNnKSkpPzsKKyAgICB1bnNhZmUgeworICAgICAgICBsZXQgbWFwcGVkX2ZpbGUgPSBNbWFwOjptYXAoJmZpbGUpLm1hcF9lcnIofGVycm1zZ3wgeworICAgICAgICAgICAgTWFwRmlsZUZhaWwoYW55aG93ISgiZmFpbCB0byBtYXAgc3RvcmFnZSBmaWxlIHt9OiB7fSIsIGZpbGVfcGF0aCwgZXJybXNnKSkKKyAgICAgICAgfSk/OworICAgICAgICBPayhtYXBwZWRfZmlsZSkKKyAgICB9Cit9CisKKy8vLyBHZXQgYSBtYXBwZWQgc3RvcmFnZSBmaWxlIGdpdmVuIHRoZSBjb250YWluZXIgYW5kIGZpbGUgdHlwZQorLy8vCisvLy8gIyBTYWZldHkKKy8vLworLy8vIFRoZSBtZW1vcnkgbWFwcGVkIGZpbGUgbWF5IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGlmIHRoZXJlIGFyZSB3cml0ZXMgdG8gdGhpcworLy8vIGZpbGUgYWZ0ZXIgYmVpbmcgbWFwcGVkLiBFbnN1cmUgbm8gd3JpdGVzIGNhbiBoYXBwZW4gdG8gdGhpcyBmaWxlIHdoaWxlIHRoaXMKKy8vLyBtYXBwaW5nIHN0YXlzIGFsaXZlLgorcHViIHVuc2FmZSBmbiBnZXRfbWFwcGVkX2ZpbGUoCisgICAgc3RvcmFnZV9kaXI6ICZzdHIsCisgICAgY29udGFpbmVyOiAmc3RyLAorICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlLAorKSAtPiBSZXN1bHQ8TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBzdG9yYWdlX2ZpbGUgPSBtYXRjaCBmaWxlX3R5cGUgeworICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgPT4geworICAgICAgICAgICAgU3RyaW5nOjpmcm9tKHN0b3JhZ2VfZGlyKSArICIvbWFwcy8iICsgY29udGFpbmVyICsgIi5wYWNrYWdlLm1hcCIKKyAgICAgICAgfQorICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAgPT4gU3RyaW5nOjpmcm9tKHN0b3JhZ2VfZGlyKSArICIvbWFwcy8iICsgY29udGFpbmVyICsgIi5mbGFnLm1hcCIsCisgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCA9PiBTdHJpbmc6OmZyb20oc3RvcmFnZV9kaXIpICsgIi9ib290LyIgKyBjb250YWluZXIgKyAiLnZhbCIsCisgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gPT4gU3RyaW5nOjpmcm9tKHN0b3JhZ2VfZGlyKSArICIvYm9vdC8iICsgY29udGFpbmVyICsgIi5pbmZvIiwKKyAgICB9OworICAgIGlmIHN0ZDo6ZnM6Om1ldGFkYXRhKCZzdG9yYWdlX2ZpbGUpLmlzX2VycigpIHsKKyAgICAgICAgcmV0dXJuIEVycihTdG9yYWdlRmlsZU5vdEZvdW5kKGFueWhvdyEoInN0b3JhZ2UgZmlsZSB7fSBkb2VzIG5vdCBleGlzdCIsIHN0b3JhZ2VfZmlsZSkpKTsKKyAgICB9CisgICAgdW5zYWZlIHsgbWFwX2ZpbGUoJnN0b3JhZ2VfZmlsZSkgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSByYW5kOjpSbmc7CisgICAgdXNlIHN0ZDo6ZnM7CisgICAgdXNlIHN0ZDo6aW86OlJlYWQ7CisKKyAgICBmbiBtYXBfYW5kX3ZlcmlmeShzdG9yYWdlX2RpcjogJnN0ciwgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGUsIGFjdHVhbF9maWxlOiAmc3RyKSB7CisgICAgICAgIGxldCBtdXQgb3BlbmVkX2ZpbGUgPSBGaWxlOjpvcGVuKGFjdHVhbF9maWxlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCBjb250ZW50ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgb3BlbmVkX2ZpbGUucmVhZF90b19lbmQoJm11dCBjb250ZW50KS51bndyYXAoKTsKKyAgICAgICAgbGV0IG1tYXBlZF9maWxlID0gdW5zYWZlIHsgZ2V0X21hcHBlZF9maWxlKHN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgZmlsZV90eXBlKS51bndyYXAoKSB9OworICAgICAgICBhc3NlcnRfZXEhKG1tYXBlZF9maWxlWy4uXSwgY29udGVudFsuLl0pOworICAgIH0KKworICAgIGZuIGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKSAtPiBTdHJpbmcgeworICAgICAgICBsZXQgbXV0IHJuZyA9IHJhbmQ6OnRocmVhZF9ybmcoKTsKKyAgICAgICAgbGV0IG51bWJlcjogdTMyID0gcm5nLmdlbigpOworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBTdHJpbmc6OmZyb20oIi90bXAvIikgKyAmbnVtYmVyLnRvX3N0cmluZygpOworICAgICAgICBpZiBzdGQ6OmZzOjptZXRhZGF0YSgmc3RvcmFnZV9kaXIpLmlzX29rKCkgeworICAgICAgICAgICAgZnM6OnJlbW92ZV9kaXJfYWxsKCZzdG9yYWdlX2RpcikudW53cmFwKCk7CisgICAgICAgIH0KKyAgICAgICAgbGV0IG1hcHNfZGlyID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvbWFwcyI7CisgICAgICAgIGxldCBib290X2RpciA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QiOworICAgICAgICBmczo6Y3JlYXRlX2Rpcigmc3RvcmFnZV9kaXIpLnVud3JhcCgpOworICAgICAgICBmczo6Y3JlYXRlX2RpcigmbWFwc19kaXIpLnVud3JhcCgpOworICAgICAgICBmczo6Y3JlYXRlX2RpcigmYm9vdF9kaXIpLnVud3JhcCgpOworCisgICAgICAgIGxldCBwYWNrYWdlX21hcCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIjsKKyAgICAgICAgbGV0IGZsYWdfbWFwID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvbWFwcy9tb2NrdXAuZmxhZy5tYXAiOworICAgICAgICBsZXQgZmxhZ192YWwgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9ib290L21vY2t1cC52YWwiOworICAgICAgICBsZXQgZmxhZ19pbmZvID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvYm9vdC9tb2NrdXAuaW5mbyI7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL3BhY2thZ2UubWFwIiwgJnBhY2thZ2VfbWFwKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZmxhZy5tYXAiLCAmZmxhZ19tYXApLnVud3JhcCgpOworICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9mbGFnLnZhbCIsICZmbGFnX3ZhbCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2ZsYWcuaW5mbyIsICZmbGFnX2luZm8pLnVud3JhcCgpOworCisgICAgICAgIHJldHVybiBzdG9yYWdlX2RpcjsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9tYXBwZWRfZmlsZV9jb250ZW50cygpIHsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygpOworICAgICAgICBtYXBfYW5kX3ZlcmlmeSgmc3RvcmFnZV9kaXIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCwgIi4vdGVzdHMvcGFja2FnZS5tYXAiKTsKKyAgICAgICAgbWFwX2FuZF92ZXJpZnkoJnN0b3JhZ2VfZGlyLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAsICIuL3Rlc3RzL2ZsYWcubWFwIik7CisgICAgICAgIG1hcF9hbmRfdmVyaWZ5KCZzdG9yYWdlX2RpciwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsLCAiLi90ZXN0cy9mbGFnLnZhbCIpOworICAgICAgICBtYXBfYW5kX3ZlcmlmeSgmc3RvcmFnZV9kaXIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8sICIuL3Rlc3RzL2ZsYWcuaW5mbyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9wYWNrYWdlX3RhYmxlX3F1ZXJ5LnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL3BhY2thZ2VfdGFibGVfcXVlcnkucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiODU0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9wYWNrYWdlX3RhYmxlX3F1ZXJ5LnJzCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIHBhY2thZ2UgdGFibGUgcXVlcnkgbW9kdWxlIGRlZmluZXMgdGhlIHBhY2thZ2UgdGFibGUgZmlsZSByZWFkIGZyb20gbWFwcGVkIGJ5dGVzCisKK3VzZSBjcmF0ZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIEZJTEVfVkVSU0lPTn07Cit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnsKKyAgICBwYWNrYWdlX3RhYmxlOjpQYWNrYWdlVGFibGVIZWFkZXIsIHBhY2thZ2VfdGFibGU6OlBhY2thZ2VUYWJsZU5vZGUsIHJlYWRfdTMyX2Zyb21fYnl0ZXMsCit9OwordXNlIGFueWhvdzo6YW55aG93OworCisvLy8gUGFja2FnZSB0YWJsZSBxdWVyeSByZXR1cm4KKyNbZGVyaXZlKFBhcnRpYWxFcSwgRGVidWcpXQorcHViIHN0cnVjdCBQYWNrYWdlUmVhZENvbnRleHQgeworICAgIHB1YiBwYWNrYWdlX2lkOiB1MzIsCisgICAgcHViIGJvb2xlYW5fc3RhcnRfaW5kZXg6IHUzMiwKK30KKworLy8vIFF1ZXJ5IHBhY2thZ2UgcmVhZCBjb250ZXh0OiBwYWNrYWdlIGlkIGFuZCBzdGFydCBpbmRleAorcHViIGZuIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoCisgICAgYnVmOiAmW3U4XSwKKyAgICBwYWNrYWdlOiAmc3RyLAorKSAtPiBSZXN1bHQ8T3B0aW9uPFBhY2thZ2VSZWFkQ29udGV4dD4sIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgaW50ZXJwcmV0ZWRfaGVhZGVyID0gUGFja2FnZVRhYmxlSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OworICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gRklMRV9WRVJTSU9OIHsKKyAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oYW55aG93ISgKKyAgICAgICAgICAgICJDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30iLAorICAgICAgICAgICAgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24sCisgICAgICAgICAgICBGSUxFX1ZFUlNJT04KKyAgICAgICAgKSkpOworICAgIH0KKworICAgIGxldCBudW1fYnVja2V0cyA9IChpbnRlcnByZXRlZF9oZWFkZXIubm9kZV9vZmZzZXQgLSBpbnRlcnByZXRlZF9oZWFkZXIuYnVja2V0X29mZnNldCkgLyA0OworICAgIGxldCBidWNrZXRfaW5kZXggPSBQYWNrYWdlVGFibGVOb2RlOjpmaW5kX2J1Y2tldF9pbmRleChwYWNrYWdlLCBudW1fYnVja2V0cyk7CisKKyAgICBsZXQgbXV0IHBvcyA9IChpbnRlcnByZXRlZF9oZWFkZXIuYnVja2V0X29mZnNldCArIDQgKiBidWNrZXRfaW5kZXgpIGFzIHVzaXplOworICAgIGxldCBtdXQgcGFja2FnZV9ub2RlX29mZnNldCA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnVmLCAmbXV0IHBvcyk/IGFzIHVzaXplOworICAgIGlmIHBhY2thZ2Vfbm9kZV9vZmZzZXQgPCBpbnRlcnByZXRlZF9oZWFkZXIubm9kZV9vZmZzZXQgYXMgdXNpemUKKyAgICAgICAgfHwgcGFja2FnZV9ub2RlX29mZnNldCA+PSBpbnRlcnByZXRlZF9oZWFkZXIuZmlsZV9zaXplIGFzIHVzaXplCisgICAgeworICAgICAgICByZXR1cm4gT2soTm9uZSk7CisgICAgfQorCisgICAgbG9vcCB7CisgICAgICAgIGxldCBpbnRlcnByZXRlZF9ub2RlID0gUGFja2FnZVRhYmxlTm9kZTo6ZnJvbV9ieXRlcygmYnVmW3BhY2thZ2Vfbm9kZV9vZmZzZXQuLl0pPzsKKyAgICAgICAgaWYgaW50ZXJwcmV0ZWRfbm9kZS5wYWNrYWdlX25hbWUgPT0gcGFja2FnZSB7CisgICAgICAgICAgICByZXR1cm4gT2soU29tZShQYWNrYWdlUmVhZENvbnRleHQgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQ6IGludGVycHJldGVkX25vZGUucGFja2FnZV9pZCwKKyAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiBpbnRlcnByZXRlZF9ub2RlLmJvb2xlYW5fc3RhcnRfaW5kZXgsCisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKyAgICAgICAgbWF0Y2ggaW50ZXJwcmV0ZWRfbm9kZS5uZXh0X29mZnNldCB7CisgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gcGFja2FnZV9ub2RlX29mZnNldCA9IG9mZnNldCBhcyB1c2l6ZSwKKyAgICAgICAgICAgIE5vbmUgPT4gcmV0dXJuIE9rKE5vbmUpLAorICAgICAgICB9CisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZTsKKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0YWJsZSBxdWVyeQorICAgIGZuIHRlc3RfcGFja2FnZV9xdWVyeSgpIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMCwgYm9vbGVhbl9zdGFydF9pbmRleDogMCB9OworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX3RhYmxlWy4uXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDEsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDMgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV90YWJsZVsuLl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAyLCBib29sZWFuX3N0YXJ0X2luZGV4OiA2IH07CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0YWJsZSBxdWVyeSBvZiBhIG5vbiBleGlzdCBwYWNrYWdlCisgICAgZm4gdGVzdF9ub3RfZXhpc3RlZF9wYWNrYWdlX3F1ZXJ5KCkgeworICAgICAgICAvLyB0aGlzIHdpbGwgbGFuZCBhdCBhbiBlbXB0eSBidWNrZXQKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMyIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgTm9uZSk7CisgICAgICAgIC8vIHRoaXMgd2lsbCBsYW5kIGF0IHRoZSBlbmQgb2YgYSBsaW5rZWQgbGlzdAorICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNSIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHF1ZXJ5IGVycm9yIHdoZW4gZmlsZSBoYXMgYSBoaWdoZXIgdmVyc2lvbgorICAgIGZuIHRlc3RfaGlnaGVyX3ZlcnNpb25fc3RvcmFnZV9maWxlKCkgeworICAgICAgICBsZXQgbXV0IHRhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpOworICAgICAgICB0YWJsZS5oZWFkZXIudmVyc2lvbiA9IGNyYXRlOjpGSUxFX1ZFUlNJT04gKyAxOworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IHRhYmxlLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGVycm9yID0KKyAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpCisgICAgICAgICAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCisgICAgICAgICAgICBmb3JtYXQhKAorICAgICAgICAgICAgICAgICJIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9KSIsCisgICAgICAgICAgICAgICAgY3JhdGU6OkZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgY3JhdGU6OkZJTEVfVkVSU0lPTgorICAgICAgICAgICAgKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlUmVhZEFQSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNmZmMjQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlUmVhZEFQSS5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CitpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbC5NYXBNb2RlOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVJlYWRDb250ZXh0OworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdSZWFkQ29udGV4dDsKKworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLm9wdGltaXphdGlvbi5GYXN0TmF0aXZlOworCitwdWJsaWMgY2xhc3MgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJIHsKKworICAgIC8vIFN0b3JhZ2UgZmlsZSBkaXIgb24gZGV2aWNlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JBR0VESVIgPSAiL21ldGFkYXRhL2Fjb25maWciOworCisgICAgLy8gU3RvYXJnZSBmaWxlIHR5cGUKKyAgICBwdWJsaWMgZW51bSBTdG9yYWdlRmlsZVR5cGUgeworICAgICAgICBQQUNLQUdFX01BUCwKKyAgICAgICAgRkxBR19NQVAsCisgICAgICAgIEZMQUdfVkFMLAorICAgICAgICBGTEFHX0lORk8KKyAgICB9CisKKyAgICAvLyBNYXAgYSBzdG9yYWdlIGZpbGUgZ2l2ZW4gZmlsZSBwYXRoCisgICAgcHVibGljIHN0YXRpYyBNYXBwZWRCeXRlQnVmZmVyIG1hcFN0b3JhZ2VGaWxlKFN0cmluZyBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgRmlsZUNoYW5uZWwgY2hhbm5lbCA9IHN0cmVhbS5nZXRDaGFubmVsKCk7CisgICAgICAgIHJldHVybiBjaGFubmVsLm1hcChGaWxlQ2hhbm5lbC5NYXBNb2RlLlJFQURfT05MWSwgMCwgY2hhbm5lbC5zaXplKCkpOworICAgIH0KKworICAgIC8vIE1hcCBhIHN0b3JhZ2UgZmlsZSBnaXZlbiBjb250YWluZXIgYW5kIGZpbGUgdHlwZQorICAgIHB1YmxpYyBzdGF0aWMgTWFwcGVkQnl0ZUJ1ZmZlciBnZXRNYXBwZWRGaWxlKAorICAgICAgICBTdHJpbmcgY29udGFpbmVyLAorICAgICAgICBTdG9yYWdlRmlsZVR5cGUgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUEFDS0FHRV9NQVA6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcFN0b3JhZ2VGaWxlKFNUT1JBR0VESVIgKyAiL21hcHMvIiArIGNvbnRhaW5lciArICIucGFja2FnZS5tYXAiKTsKKyAgICAgICAgICAgIGNhc2UgRkxBR19NQVA6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcFN0b3JhZ2VGaWxlKFNUT1JBR0VESVIgKyAiL21hcHMvIiArIGNvbnRhaW5lciArICIuZmxhZy5tYXAiKTsKKyAgICAgICAgICAgIGNhc2UgRkxBR19WQUw6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcFN0b3JhZ2VGaWxlKFNUT1JBR0VESVIgKyAiL2Jvb3QvIiArIGNvbnRhaW5lciArICIudmFsIik7CisgICAgICAgICAgICBjYXNlIEZMQUdfSU5GTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwU3RvcmFnZUZpbGUoU1RPUkFHRURJUiArICIvYm9vdC8iICsgY29udGFpbmVyICsgIi5pbmZvIik7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW52YWxpZCBzdG9yYWdlIGZpbGUgdHlwZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSk5JIGludGVyZmFjZSB0byBnZXQgcGFja2FnZSByZWFkIGNvbnRleHQKKyAgICAvLyBAcGFyYW0gbWFwcGVkRmlsZTogbWVtb3J5IG1hcHBlZCBwYWNrYWdlIG1hcCBmaWxlCisgICAgLy8gQHBhcmFtIHBhY2thZ2VOYW1lOiBwYWNrYWdlIG5hbWUKKyAgICAvLyBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZmlsZSBpcyBub3QgYSB2YWxpZCBwYWNrYWdlIG1hcCBmaWxlCisgICAgQEZhc3ROYXRpdmUKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQnl0ZUJ1ZmZlciBnZXRQYWNrYWdlUmVhZENvbnRleHRJbXBsKAorICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLy8gQVBJIHRvIGdldCBwYWNrYWdlIHJlYWQgY29udGV4dAorICAgIC8vIEBwYXJhbSBtYXBwZWRGaWxlOiBtZW1vcnkgbWFwcGVkIHBhY2thZ2UgbWFwIGZpbGUKKyAgICAvLyBAcGFyYW0gcGFja2FnZU5hbWU6IHBhY2thZ2UgbmFtZQorICAgIC8vIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHBhc3NlZCBpbiBmaWxlIGlzIG5vdCBhIHZhbGlkIHBhY2thZ2UgbWFwIGZpbGUKKyAgICBzdGF0aWMgcHVibGljIFBhY2thZ2VSZWFkQ29udGV4dCBnZXRQYWNrYWdlUmVhZENvbnRleHQgKAorICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBnZXRQYWNrYWdlUmVhZENvbnRleHRJbXBsKG1hcHBlZEZpbGUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQYWNrYWdlUmVhZENvbnRleHQoYnVmZmVyLmdldEludCgpLCBidWZmZXIuZ2V0SW50KDQpKTsKKyAgICB9CisKKyAgICAvLyBKTkkgaW50ZXJmYWNlIHRvIGdldCBmbGFnIHJlYWQgY29udGV4dAorICAgIC8vIEBwYXJhbSBtYXBwZWRGaWxlOiBtZW1vcnkgbWFwcGVkIGZsYWcgbWFwIGZpbGUKKyAgICAvLyBAcGFyYW0gcGFja2FnZUlkOiBwYWNrYWdlIGlkIHRvIHJlcHJlc2VudCBhIHNwZWNpZmljIHBhY2thZ2UsIG9idGFpbmVkIGZyb20KKyAgICAvLyBwYWNrYWdlIG1hcCBmaWxlCisgICAgLy8gQHBhcmFtIGZsYWdOYW1lOiBmbGFnIG5hbWUKKyAgICAvLyBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZmlsZSBpcyBub3QgYSB2YWxpZCBmbGFnIG1hcCBmaWxlCisgICAgQEZhc3ROYXRpdmUKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQnl0ZUJ1ZmZlciBnZXRGbGFnUmVhZENvbnRleHRJbXBsKAorICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIGludCBwYWNrYWdlSWQsIFN0cmluZyBmbGFnTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLy8gQVBJIHRvIGdldCBmbGFnIHJlYWQgY29udGV4dAorICAgIC8vIEBwYXJhbSBtYXBwZWRGaWxlOiBtZW1vcnkgbWFwcGVkIGZsYWcgbWFwIGZpbGUKKyAgICAvLyBAcGFyYW0gcGFja2FnZUlkOiBwYWNrYWdlIGlkIHRvIHJlcHJlc2VudCBhIHNwZWNpZmljIHBhY2thZ2UsIG9idGFpbmVkIGZyb20KKyAgICAvLyBwYWNrYWdlIG1hcCBmaWxlCisgICAgLy8gQHBhcmFtIGZsYWdOYW1lOiBmbGFnIG5hbWUKKyAgICAvLyBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZmlsZSBpcyBub3QgYSB2YWxpZCBmbGFnIG1hcCBmaWxlCisgICAgcHVibGljIHN0YXRpYyBGbGFnUmVhZENvbnRleHQgZ2V0RmxhZ1JlYWRDb250ZXh0KAorICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIGludCBwYWNrYWdlSWQsIFN0cmluZyBmbGFnTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBnZXRGbGFnUmVhZENvbnRleHRJbXBsKG1hcHBlZEZpbGUsIHBhY2thZ2VJZCwgZmxhZ05hbWUpOworICAgICAgICBidWZmZXIub3JkZXIoQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pOworICAgICAgICByZXR1cm4gbmV3IEZsYWdSZWFkQ29udGV4dChidWZmZXIuZ2V0SW50KCksIGJ1ZmZlci5nZXRJbnQoNCkpOworICAgIH0KKworICAgIC8vIEpOSSBpbnRlcmZhY2UgdG8gZ2V0IGJvb2xlYW4gZmxhZyB2YWx1ZQorICAgIC8vIEBwYXJhbSBtYXBwZWRGaWxlOiBtZW1vcnkgbWFwcGVkIGZsYWcgdmFsdWUgZmlsZQorICAgIC8vIEBwYXJhbSBmbGFnSW5kZXg6IGZsYWcgZ2xvYmFsIGluZGV4IGluIHRoZSBmbGFnIHZhbHVlIGFycmF5CisgICAgLy8gQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgcGFzc2VkIGluIGZpbGUgaXMgbm90IGEgdmFsaWQgZmxhZyB2YWx1ZSBmaWxlIG9yIHRoZQorICAgIC8vIGZsYWcgaW5kZXggd2VudCBvdmVyIHRoZSBmaWxlIGJvdW5kYXJ5LgorICAgIEBGYXN0TmF0aXZlCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRCb29sZWFuRmxhZ1ZhbHVlKAorICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIGludCBmbGFnSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX3J1c3Rfam5pIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnUmVhZENvbnRleHQuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1JlYWRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1NTlhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1JlYWRDb250ZXh0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgY2xhc3MgRmxhZ1JlYWRDb250ZXh0IHsKKyAgICBwdWJsaWMgU3RvcmVkRmxhZ1R5cGUgbUZsYWdUeXBlOworICAgIHB1YmxpYyBpbnQgbUZsYWdJbmRleDsKKworICAgIHB1YmxpYyBGbGFnUmVhZENvbnRleHQoaW50IGZsYWdUeXBlLAorICAgICAgICAgICAgaW50IGZsYWdJbmRleCkgeworICAgICAgICBtRmxhZ1R5cGUgPSBTdG9yZWRGbGFnVHlwZS5mcm9tSW50ZWdlcihmbGFnVHlwZSk7CisgICAgICAgIG1GbGFnSW5kZXggPSBmbGFnSW5kZXg7CisgICAgfQorCisgICAgLy8gRmxhZyB0eXBlIGVudW0sIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGVmaW5pdGlvbiBpbiBhY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbGliLnJzCisgICAgcHVibGljIGVudW0gU3RvcmVkRmxhZ1R5cGUgeworICAgICAgICBSZWFkV3JpdGVCb29sZWFuLAorICAgICAgICBSZWFkT25seUJvb2xlYW4sCisgICAgICAgIEZpeGVkUmVhZE9ubHlCb29sZWFuOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RvcmVkRmxhZ1R5cGUgZnJvbUludGVnZXIoaW50IHgpIHsKKyAgICAgICAgICAgIHN3aXRjaCh4KSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhZFdyaXRlQm9vbGVhbjsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFkT25seUJvb2xlYW47CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRml4ZWRSZWFkT25seUJvb2xlYW47CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1BhY2thZ2VSZWFkQ29udGV4dC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlUmVhZENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzgxZDliCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlUmVhZENvbnRleHQuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlOworLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3B1YmxpYyBjbGFzcyBQYWNrYWdlUmVhZENvbnRleHQgeworICAgIHB1YmxpYyBpbnQgbVBhY2thZ2VJZDsKKyAgICBwdWJsaWMgaW50IG1Cb29sZWFuU3RhcnRJbmRleDsKKworICAgIHB1YmxpYyBQYWNrYWdlUmVhZENvbnRleHQoaW50IHBhY2thZ2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib29sZWFuU3RhcnRJbmRleCkgeworICAgICAgICBtUGFja2FnZUlkID0gcGFja2FnZUlkOworICAgICAgICBtQm9vbGVhblN0YXJ0SW5kZXggPSBib29sZWFuU3RhcnRJbmRleDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VJbnRlcm5hbFJlYWRlci5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlSW50ZXJuYWxSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjMxMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlSW50ZXJuYWxSZWFkZXIuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9QQVRIID0gIi9tZXRhZGF0YS9hY29uZmlnL21hcHMvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVF9QQVRIID0gIi9tZXRhZGF0YS9hY29uZmlnL2Jvb3QvIjsKKworICAgIHByaXZhdGUgUGFja2FnZVRhYmxlIG1QYWNrYWdlVGFibGU7CisgICAgcHJpdmF0ZSBGbGFnVmFsdWVMaXN0IG1GbGFnVmFsdWVMaXN0OworCisgICAgcHJpdmF0ZSBpbnQgbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQ7CisKKyAgICBwdWJsaWMgU3RvcmFnZUludGVybmFsUmVhZGVyKFN0cmluZyBjb250YWluZXIsIFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICB0aGlzKHBhY2thZ2VOYW1lLCBNQVBfUEFUSCArIGNvbnRhaW5lciArICIucGFja2FnZS5tYXAiLCBCT09UX1BBVEggKyBjb250YWluZXIgKyAiLnZhbCIpOworICAgIH0KKworICAgIHB1YmxpYyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcGFja2FnZU1hcEZpbGUsIFN0cmluZyBmbGFnVmFsdWVGaWxlKSB7CisgICAgICAgIG1QYWNrYWdlVGFibGUgPSBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKG1hcFN0b3JhZ2VGaWxlKHBhY2thZ2VNYXBGaWxlKSk7CisgICAgICAgIG1GbGFnVmFsdWVMaXN0ID0gRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMobWFwU3RvcmFnZUZpbGUoZmxhZ1ZhbHVlRmlsZSkpOworICAgICAgICBtUGFja2FnZUJvb2xlYW5TdGFydE9mZnNldCA9IGdldFBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQocGFja2FnZU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoaW50IGluZGV4KSB7CisgICAgICAgIGluZGV4ICs9IG1QYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0OworICAgICAgICBpZiAoaW5kZXggPj0gbUZsYWdWYWx1ZUxpc3Quc2l6ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oIkZhaWwgdG8gZ2V0IGJvb2xlYW4gZmxhZyB2YWx1ZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRmxhZ1ZhbHVlTGlzdC5nZXQoaW5kZXgpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIHBOb2RlID0gbVBhY2thZ2VUYWJsZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICBpZiAocE5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgUGFja2FnZVRhYmxlLkhlYWRlciBoZWFkZXIgPSBtUGFja2FnZVRhYmxlLmdldEhlYWRlcigpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsIHRvIGdldCBwYWNrYWdlICVzIGZyb20gY29udGFpbmVyICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgaGVhZGVyLmdldENvbnRhaW5lcigpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBOb2RlLmdldEJvb2xlYW5TdGFydEluZGV4KCk7CisgICAgfQorCisgICAgLy8gTWFwIGEgc3RvcmFnZSBmaWxlIGdpdmVuIGZpbGUgcGF0aAorICAgIHByaXZhdGUgc3RhdGljIE1hcHBlZEJ5dGVCdWZmZXIgbWFwU3RvcmFnZUZpbGUoU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgRmlsZUNoYW5uZWwgY2hhbm5lbCA9IHN0cmVhbS5nZXRDaGFubmVsKCk7CisgICAgICAgICAgICByZXR1cm4gY2hhbm5lbC5tYXAoRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIDAsIGNoYW5uZWwuc2l6ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbCB0byBtbWFwIHN0b3JhZ2UgZmlsZSAlcyIsIGZpbGUpLCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0YTA1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvbGliLnJzCkBAIC0wLDAgKzEsMTYwIEBACisvLyEgYWNvbmZpZyBzdG9yYWdlIHJlYWQgYXBpIGphdmEgcnVzdCBpbnRlcmxvcAorCit1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpmbGFnX3RhYmxlX3F1ZXJ5OjpmaW5kX2ZsYWdfcmVhZF9jb250ZXh0OwordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6ZmxhZ192YWx1ZV9xdWVyeTo6ZmluZF9ib29sZWFuX2ZsYWdfdmFsdWU7Cit1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpwYWNrYWdlX3RhYmxlX3F1ZXJ5OjpmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0OwordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6e0ZsYWdSZWFkQ29udGV4dCwgUGFja2FnZVJlYWRDb250ZXh0fTsKKwordXNlIGFueWhvdzo6UmVzdWx0OwordXNlIGpuaTo6b2JqZWN0czo6e0pCeXRlQnVmZmVyLCBKQ2xhc3MsIEpTdHJpbmd9OwordXNlIGpuaTo6c3lzOjp7amJvb2xlYW4sIGppbnR9OwordXNlIGpuaTo6Sk5JRW52OworCisvLy8gQ2FsbCBydXN0IGZpbmQgcGFja2FnZSByZWFkIGNvbnRleHQKK2ZuIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dF9qYXZhKAorICAgIGVudjogJm11dCBKTklFbnYsCisgICAgZmlsZTogSkJ5dGVCdWZmZXIsCisgICAgcGFja2FnZTogSlN0cmluZywKKykgLT4gUmVzdWx0PE9wdGlvbjxQYWNrYWdlUmVhZENvbnRleHQ+PiB7CisgICAgLy8gU0FGRVRZOgorICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSBwYWNrYWdlIG5hbWUgaXMgZ3VhcmFudGVlZCB0byBiZSBhIGphdmEgc3RyaW5nCisgICAgbGV0IHBhY2thZ2VfbmFtZTogU3RyaW5nID0gdW5zYWZlIHsgZW52LmdldF9zdHJpbmdfdW5jaGVja2VkKCZwYWNrYWdlKT8uaW50bygpIH07CisgICAgbGV0IGJ1ZmZlcl9wdHIgPSBlbnYuZ2V0X2RpcmVjdF9idWZmZXJfYWRkcmVzcygmZmlsZSk/OworICAgIGxldCBidWZmZXJfc2l6ZSA9IGVudi5nZXRfZGlyZWN0X2J1ZmZlcl9jYXBhY2l0eSgmZmlsZSk/OworICAgIC8vIFNBRkVUWToKKyAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyBvbmx5IG5vbiBudWxsIE1lbW9yeU1hcHBlZEJ1ZmZlciB3aWxsIGJlIHBhc3NlZCBpbiwKKyAgICAvLyBzbyB0aGUgY29udmVyc2lvbiB0byBzbGljZSBpcyBndWFyYW50ZWVkIHRvIGJlIHZhbGlkCisgICAgbGV0IGJ1ZmZlciA9IHVuc2FmZSB7IHN0ZDo6c2xpY2U6OmZyb21fcmF3X3BhcnRzKGJ1ZmZlcl9wdHIsIGJ1ZmZlcl9zaXplKSB9OworICAgIE9rKGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoYnVmZmVyLCAmcGFja2FnZV9uYW1lKT8pCit9CisKKy8vLyBHZXQgcGFja2FnZSByZWFkIGNvbnRleHQgSk5JCisjW25vX21hbmdsZV0KKyNbYWxsb3codW51c2VkKV0KK3B1YiBleHRlcm4gInN5c3RlbSIgZm4gSmF2YV9hbmRyb2lkX2Fjb25maWdfc3RvcmFnZV9BY29uZmlnU3RvcmFnZVJlYWRBUElfZ2V0UGFja2FnZVJlYWRDb250ZXh0SW1wbDwKKyAgICAnbG9jYWwsCis+KAorICAgIG11dCBlbnY6IEpOSUVudjwnbG9jYWw+LAorICAgIGNsYXNzOiBKQ2xhc3M8J2xvY2FsPiwKKyAgICBmaWxlOiBKQnl0ZUJ1ZmZlcjwnbG9jYWw+LAorICAgIHBhY2thZ2U6IEpTdHJpbmc8J2xvY2FsPiwKKykgLT4gSkJ5dGVCdWZmZXI8J2xvY2FsPiB7CisgICAgbGV0IG11dCBwYWNrYWdlX2lkID0gLTE7CisgICAgbGV0IG11dCBib29sZWFuX3N0YXJ0X2luZGV4ID0gLTE7CisKKyAgICBtYXRjaCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHRfamF2YSgmbXV0IGVudiwgZmlsZSwgcGFja2FnZSkgeworICAgICAgICBPayhjb250ZXh0X29wdCkgPT4geworICAgICAgICAgICAgaWYgbGV0IFNvbWUoY29udGV4dCkgPSBjb250ZXh0X29wdCB7CisgICAgICAgICAgICAgICAgcGFja2FnZV9pZCA9IGNvbnRleHQucGFja2FnZV9pZCBhcyBpMzI7CisgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleCA9IGNvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCBhcyBpMzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXJyKGVycm1zZykgPT4geworICAgICAgICAgICAgZW52LnRocm93KCgiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGVycm1zZy50b19zdHJpbmcoKSkpLmV4cGVjdCgiZmFpbGVkIHRvIHRocm93Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZXQgbXV0IGJ5dGVzID0gVmVjOjpuZXcoKTsKKyAgICBieXRlcy5leHRlbmRfZnJvbV9zbGljZSgmcGFja2FnZV9pZC50b19sZV9ieXRlcygpKTsKKyAgICBieXRlcy5leHRlbmRfZnJvbV9zbGljZSgmYm9vbGVhbl9zdGFydF9pbmRleC50b19sZV9ieXRlcygpKTsKKyAgICBsZXQgKGFkZHIsIGxlbikgPSB7CisgICAgICAgIGxldCBidWYgPSBieXRlcy5sZWFrKCk7CisgICAgICAgIChidWYuYXNfbXV0X3B0cigpLCBidWYubGVuKCkpCisgICAgfTsKKyAgICAvLyBTQUZFVFk6CisgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIGNvbnRlbnQgaXMgZW5zdXJlZCB0byBiZSB2YWxpZAorICAgIHVuc2FmZSB7IGVudi5uZXdfZGlyZWN0X2J5dGVfYnVmZmVyKGFkZHIsIGxlbikuZXhwZWN0KCJmYWlsZWQgdG8gY3JlYXRlIGJ5dGUgYnVmZmVyIikgfQorfQorCisvLy8gQ2FsbCBydXN0IGZpbmQgZmxhZyByZWFkIGNvbnRleHQKK2ZuIGdldF9mbGFnX3JlYWRfY29udGV4dF9qYXZhKAorICAgIGVudjogJm11dCBKTklFbnYsCisgICAgZmlsZTogSkJ5dGVCdWZmZXIsCisgICAgcGFja2FnZV9pZDogamludCwKKyAgICBmbGFnOiBKU3RyaW5nLAorKSAtPiBSZXN1bHQ8T3B0aW9uPEZsYWdSZWFkQ29udGV4dD4+IHsKKyAgICAvLyBTQUZFVFk6CisgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIGZsYWcgbmFtZSBpcyBndWFyYW50ZWVkIHRvIGJlIGEgamF2YSBzdHJpbmcKKyAgICBsZXQgZmxhZ19uYW1lOiBTdHJpbmcgPSB1bnNhZmUgeyBlbnYuZ2V0X3N0cmluZ191bmNoZWNrZWQoJmZsYWcpPy5pbnRvKCkgfTsKKyAgICBsZXQgYnVmZmVyX3B0ciA9IGVudi5nZXRfZGlyZWN0X2J1ZmZlcl9hZGRyZXNzKCZmaWxlKT87CisgICAgbGV0IGJ1ZmZlcl9zaXplID0gZW52LmdldF9kaXJlY3RfYnVmZmVyX2NhcGFjaXR5KCZmaWxlKT87CisgICAgLy8gU0FGRVRZOgorICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIG9ubHkgbm9uIG51bGwgTWVtb3J5TWFwcGVkQnVmZmVyIHdpbGwgYmUgcGFzc2VkIGluLAorICAgIC8vIHNvIHRoZSBjb252ZXJzaW9uIHRvIHNsaWNlIGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQKKyAgICBsZXQgYnVmZmVyID0gdW5zYWZlIHsgc3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoYnVmZmVyX3B0ciwgYnVmZmVyX3NpemUpIH07CisgICAgT2soZmluZF9mbGFnX3JlYWRfY29udGV4dChidWZmZXIsIHBhY2thZ2VfaWQgYXMgdTMyLCAmZmxhZ19uYW1lKT8pCit9CisKKy8vLyBHZXQgZmxhZyByZWFkIGNvbnRleHQgSk5JCisjW25vX21hbmdsZV0KKyNbYWxsb3codW51c2VkKV0KK3B1YiBleHRlcm4gInN5c3RlbSIgZm4gSmF2YV9hbmRyb2lkX2Fjb25maWdfc3RvcmFnZV9BY29uZmlnU3RvcmFnZVJlYWRBUElfZ2V0RmxhZ1JlYWRDb250ZXh0SW1wbDwKKyAgICAnbG9jYWwsCis+KAorICAgIG11dCBlbnY6IEpOSUVudjwnbG9jYWw+LAorICAgIGNsYXNzOiBKQ2xhc3M8J2xvY2FsPiwKKyAgICBmaWxlOiBKQnl0ZUJ1ZmZlcjwnbG9jYWw+LAorICAgIHBhY2thZ2VfaWQ6IGppbnQsCisgICAgZmxhZzogSlN0cmluZzwnbG9jYWw+LAorKSAtPiBKQnl0ZUJ1ZmZlcjwnbG9jYWw+IHsKKyAgICBsZXQgbXV0IGZsYWdfdHlwZSA9IC0xOworICAgIGxldCBtdXQgZmxhZ19pbmRleCA9IC0xOworCisgICAgbWF0Y2ggZ2V0X2ZsYWdfcmVhZF9jb250ZXh0X2phdmEoJm11dCBlbnYsIGZpbGUsIHBhY2thZ2VfaWQsIGZsYWcpIHsKKyAgICAgICAgT2soY29udGV4dF9vcHQpID0+IHsKKyAgICAgICAgICAgIGlmIGxldCBTb21lKGNvbnRleHQpID0gY29udGV4dF9vcHQgeworICAgICAgICAgICAgICAgIGZsYWdfdHlwZSA9IGNvbnRleHQuZmxhZ190eXBlIGFzIGkzMjsKKyAgICAgICAgICAgICAgICBmbGFnX2luZGV4ID0gY29udGV4dC5mbGFnX2luZGV4IGFzIGkzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFcnIoZXJybXNnKSA9PiB7CisgICAgICAgICAgICBlbnYudGhyb3coKCJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgZXJybXNnLnRvX3N0cmluZygpKSkuZXhwZWN0KCJmYWlsZWQgdG8gdGhyb3ciKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxldCBtdXQgYnl0ZXMgPSBWZWM6Om5ldygpOworICAgIGJ5dGVzLmV4dGVuZF9mcm9tX3NsaWNlKCZmbGFnX3R5cGUudG9fbGVfYnl0ZXMoKSk7CisgICAgYnl0ZXMuZXh0ZW5kX2Zyb21fc2xpY2UoJmZsYWdfaW5kZXgudG9fbGVfYnl0ZXMoKSk7CisgICAgbGV0IChhZGRyLCBsZW4pID0geworICAgICAgICBsZXQgYnVmID0gYnl0ZXMubGVhaygpOworICAgICAgICAoYnVmLmFzX211dF9wdHIoKSwgYnVmLmxlbigpKQorICAgIH07CisgICAgLy8gU0FGRVRZOgorICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSBjb250ZW50IGlzIGVuc3VyZWQgdG8gYmUgdmFsaWQKKyAgICB1bnNhZmUgeyBlbnYubmV3X2RpcmVjdF9ieXRlX2J1ZmZlcihhZGRyLCBsZW4pLmV4cGVjdCgiZmFpbGVkIHRvIGNyZWF0ZSBieXRlIGJ1ZmZlciIpIH0KK30KKworLy8vIENhbGwgcnVzdCBmaW5kIGJvb2xlYW4gZmxhZyB2YWx1ZQorZm4gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9qYXZhKAorICAgIGVudjogJm11dCBKTklFbnYsCisgICAgZmlsZTogSkJ5dGVCdWZmZXIsCisgICAgZmxhZ19pbmRleDogamludCwKKykgLT4gUmVzdWx0PGJvb2w+IHsKKyAgICBsZXQgYnVmZmVyX3B0ciA9IGVudi5nZXRfZGlyZWN0X2J1ZmZlcl9hZGRyZXNzKCZmaWxlKT87CisgICAgbGV0IGJ1ZmZlcl9zaXplID0gZW52LmdldF9kaXJlY3RfYnVmZmVyX2NhcGFjaXR5KCZmaWxlKT87CisgICAgLy8gU0FGRVRZOgorICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIG9ubHkgbm9uIG51bGwgTWVtb3J5TWFwcGVkQnVmZmVyIHdpbGwgYmUgcGFzc2VkIGluLAorICAgIC8vIHNvIHRoZSBjb252ZXJzaW9uIHRvIHNsaWNlIGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQKKyAgICBsZXQgYnVmZmVyID0gdW5zYWZlIHsgc3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoYnVmZmVyX3B0ciwgYnVmZmVyX3NpemUpIH07CisgICAgT2soZmluZF9ib29sZWFuX2ZsYWdfdmFsdWUoYnVmZmVyLCBmbGFnX2luZGV4IGFzIHUzMik/KQorfQorCisvLy8gR2V0IGZsYWcgdmFsdWUgSk5JCisjW25vX21hbmdsZV0KKyNbYWxsb3codW51c2VkKV0KK3B1YiBleHRlcm4gInN5c3RlbSIgZm4gSmF2YV9hbmRyb2lkX2Fjb25maWdfc3RvcmFnZV9BY29uZmlnU3RvcmFnZVJlYWRBUElfZ2V0Qm9vbGVhbkZsYWdWYWx1ZTwKKyAgICAnbG9jYWwsCis+KAorICAgIG11dCBlbnY6IEpOSUVudjwnbG9jYWw+LAorICAgIGNsYXNzOiBKQ2xhc3M8J2xvY2FsPiwKKyAgICBmaWxlOiBKQnl0ZUJ1ZmZlcjwnbG9jYWw+LAorICAgIGZsYWdfaW5kZXg6IGppbnQsCispIC0+IGpib29sZWFuIHsKKyAgICBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlX2phdmEoJm11dCBlbnYsIGZpbGUsIGZsYWdfaW5kZXgpIHsKKyAgICAgICAgT2sodmFsdWUpID0+IHZhbHVlIGFzIHU4LAorICAgICAgICBFcnIoZXJybXNnKSA9PiB7CisgICAgICAgICAgICBlbnYudGhyb3coKCJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgZXJybXNnLnRvX3N0cmluZygpKSkuZXhwZWN0KCJmYWlsZWQgdG8gdGhyb3ciKTsKKyAgICAgICAgICAgIDB1OAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwYzcyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NSBAQAorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAicmVhZF9hcGlfdGVzdF9zdG9yYWdlX2ZpbGVzIiwKKyAgICBzcmNzOiBbInBhY2thZ2UubWFwIiwKKyAgICAgICAgImZsYWcubWFwIiwKKyAgICAgICAgImZsYWcudmFsIiwKKyAgICAgICAgImZsYWcuaW5mbyIKKyAgICBdLAorfQorCitydXN0X3Rlc3QgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkudGVzdC5ydXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzdG9yYWdlX3JlYWRfYXBpX3Rlc3QucnMiLAorICAgIF0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFueWhvdyIsCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZSIsCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkiLAorICAgICAgICAibGlicmFuZCIsCisgICAgXSwKKyAgICBkYXRhOiBbCisgICAgICAgICI6cmVhZF9hcGlfdGVzdF9zdG9yYWdlX2ZpbGVzIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS50ZXN0LmNwcCIsCisgICAgc3JjczogWworICAgICAgICAic3RvcmFnZV9yZWFkX2FwaV90ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ21vY2siLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2NjIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGRhdGE6IFsKKyAgICAgICAgIjpyZWFkX2FwaV90ZXN0X3N0b3JhZ2VfZmlsZXMiLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImRldmljZS10ZXN0cyIsCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZmxhZy5pbmZvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZmxhZy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjNlZGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mbGFnLmluZm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZmxhZy5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mbGFnLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODY4ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZmxhZy5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZmxhZy52YWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mbGFnLnZhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDIwM2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZmxhZy52YWwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0Fjb25maWdTdG9yYWdlUmVhZEFQSVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZiMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0LmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlUmVhZEFQSTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlUmVhZENvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1JlYWRDb250ZXh0OworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdSZWFkQ29udGV4dC5TdG9yZWRGbGFnVHlwZTsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEFjb25maWdTdG9yYWdlUmVhZEFQSVRlc3R7CisKKyAgICBwcml2YXRlIFN0cmluZyBtU3RvcmFnZURpciA9ICIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19qYXZhX2FwaV90ZXN0IjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VDb250ZXh0UXVlcnkoKSB7CisgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgcGFja2FnZU1hcCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYWNrYWdlTWFwID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKAorICAgICAgICAgICAgICAgIG1TdG9yYWdlRGlyICsgIi9tYXBzL21vY2t1cC5wYWNrYWdlLm1hcCIpOworICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZU1hcCAhPSBudWxsKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IGNvbnRleHQgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0UGFja2FnZVJlYWRDb250ZXh0KAorICAgICAgICAgICAgICAgIHBhY2thZ2VNYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tUGFja2FnZUlkLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1Cb29sZWFuU3RhcnRJbmRleCwgMCk7CisKKyAgICAgICAgICAgIGNvbnRleHQgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0UGFja2FnZVJlYWRDb250ZXh0KAorICAgICAgICAgICAgICAgIHBhY2thZ2VNYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tUGFja2FnZUlkLCAxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1Cb29sZWFuU3RhcnRJbmRleCwgMyk7CisKKyAgICAgICAgICAgIGNvbnRleHQgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0UGFja2FnZVJlYWRDb250ZXh0KAorICAgICAgICAgICAgICAgIHBhY2thZ2VNYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tUGFja2FnZUlkLCAyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1Cb29sZWFuU3RhcnRJbmRleCwgNik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkV4aXN0UGFja2FnZUNvbnRleHRRdWVyeSgpIHsKKyAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBwYWNrYWdlTWFwID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhY2thZ2VNYXAgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUoCisgICAgICAgICAgICAgICAgbVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIik7CisgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShwYWNrYWdlTWFwICE9IG51bGwpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQgY29udGV4dCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRQYWNrYWdlUmVhZENvbnRleHQoCisgICAgICAgICAgICAgICAgcGFja2FnZU1hcCwgInVua25vd24iKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1QYWNrYWdlSWQsIC0xKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1Cb29sZWFuU3RhcnRJbmRleCwgLTEpOworICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ0NvbnRleHRRdWVyeSgpIHsKKyAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBmbGFnTWFwID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsYWdNYXAgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUoCisgICAgICAgICAgICAgICAgbVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLmZsYWcubWFwIik7CisgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnTWFwIT0gbnVsbCk7CisKKyAgICAgICAgY2xhc3MgQmFzZWxpbmUgeworICAgICAgICAgICAgcHVibGljIGludCBtUGFja2FnZUlkOworICAgICAgICAgICAgcHVibGljIFN0cmluZyBtRmxhZ05hbWU7CisgICAgICAgICAgICBwdWJsaWMgU3RvcmVkRmxhZ1R5cGUgbUZsYWdUeXBlOworICAgICAgICAgICAgcHVibGljIGludCBtRmxhZ0luZGV4OworCisgICAgICAgICAgICBwdWJsaWMgQmFzZWxpbmUoaW50IHBhY2thZ2VJZCwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZsYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICBTdG9yZWRGbGFnVHlwZSBmbGFnVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdJbmRleCkgeworICAgICAgICAgICAgICAgIG1QYWNrYWdlSWQgPSBwYWNrYWdlSWQ7CisgICAgICAgICAgICAgICAgbUZsYWdOYW1lID0gZmxhZ05hbWU7CisgICAgICAgICAgICAgICAgbUZsYWdUeXBlID0gZmxhZ1R5cGU7CisgICAgICAgICAgICAgICAgbUZsYWdJbmRleCA9IGZsYWdJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8QmFzZWxpbmU+IGJhc2VsaW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgYmFzZWxpbmVzLmFkZChuZXcgQmFzZWxpbmUoMCwgImVuYWJsZWRfcm8iLCBTdG9yZWRGbGFnVHlwZS5SZWFkT25seUJvb2xlYW4sIDEpKTsKKyAgICAgICAgYmFzZWxpbmVzLmFkZChuZXcgQmFzZWxpbmUoMCwgImVuYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZS5SZWFkV3JpdGVCb29sZWFuLCAyKSk7CisgICAgICAgIGJhc2VsaW5lcy5hZGQobmV3IEJhc2VsaW5lKDIsICJlbmFibGVkX3J3IiwgU3RvcmVkRmxhZ1R5cGUuUmVhZFdyaXRlQm9vbGVhbiwgMSkpOworICAgICAgICBiYXNlbGluZXMuYWRkKG5ldyBCYXNlbGluZSgxLCAiZGlzYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZS5SZWFkV3JpdGVCb29sZWFuLCAwKSk7CisgICAgICAgIGJhc2VsaW5lcy5hZGQobmV3IEJhc2VsaW5lKDEsICJlbmFibGVkX2ZpeGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGUuRml4ZWRSZWFkT25seUJvb2xlYW4sIDEpKTsKKyAgICAgICAgYmFzZWxpbmVzLmFkZChuZXcgQmFzZWxpbmUoMSwgImVuYWJsZWRfcm8iLCBTdG9yZWRGbGFnVHlwZS5SZWFkT25seUJvb2xlYW4sIDIpKTsKKyAgICAgICAgYmFzZWxpbmVzLmFkZChuZXcgQmFzZWxpbmUoMiwgImVuYWJsZWRfZml4ZWRfcm8iLCBTdG9yZWRGbGFnVHlwZS5GaXhlZFJlYWRPbmx5Qm9vbGVhbiwgMCkpOworICAgICAgICBiYXNlbGluZXMuYWRkKG5ldyBCYXNlbGluZSgwLCAiZGlzYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZS5SZWFkV3JpdGVCb29sZWFuLCAwKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoQmFzZWxpbmUgYmFzZWxpbmUgOiBiYXNlbGluZXMpIHsKKyAgICAgICAgICAgICAgICBGbGFnUmVhZENvbnRleHQgY29udGV4dCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoCisgICAgICAgICAgICAgICAgICAgIGZsYWdNYXAsIGJhc2VsaW5lLm1QYWNrYWdlSWQsICBiYXNlbGluZS5tRmxhZ05hbWUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1GbGFnVHlwZSwgYmFzZWxpbmUubUZsYWdUeXBlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tRmxhZ0luZGV4LCBiYXNlbGluZS5tRmxhZ0luZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRXhpc3RGbGFnQ29udGV4dFF1ZXJ5KCkgeworICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGZsYWdNYXAgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmxhZ01hcCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZSgKKyAgICAgICAgICAgICAgICBtU3RvcmFnZURpciArICIvbWFwcy9tb2NrdXAuZmxhZy5tYXAiKTsKKyAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGZsYWdNYXAhPSBudWxsKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmxhZ1JlYWRDb250ZXh0IGNvbnRleHQgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0RmxhZ1JlYWRDb250ZXh0KAorICAgICAgICAgICAgICAgIGZsYWdNYXAsIDAsICAidW5rbm93biIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdUeXBlLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1GbGFnSW5kZXgsIC0xKTsKKworICAgICAgICAgICAgY29udGV4dCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoCisgICAgICAgICAgICAgICAgZmxhZ01hcCwgMywgICJlbmFibGVkX3JvIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tRmxhZ1R5cGUsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdJbmRleCwgLTEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFuRmxhZ1ZhbHVlUXVlcnkoKSB7CisgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgZmxhZ1ZhbCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbGFnVmFsID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKAorICAgICAgICAgICAgICAgIG1TdG9yYWdlRGlyICsgIi9ib290L21vY2t1cC52YWwiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoZmxhZ1ZhbCE9IG51bGwpOworCisgICAgICAgIGJvb2xlYW5bXSBiYXNlbGluZXMgPSB7ZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQm9vbGVhbiB2YWx1ZSA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRCb29sZWFuRmxhZ1ZhbHVlKGZsYWdWYWwsIGkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgYmFzZWxpbmVzW2ldKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQm9vbGVhbkZsYWdWYWx1ZVF1ZXJ5KCkgeworICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGZsYWdWYWwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmxhZ1ZhbCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZSgKKyAgICAgICAgICAgICAgICBtU3RvcmFnZURpciArICIvYm9vdC9tb2NrdXAudmFsIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGZsYWdWYWwhPSBudWxsKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQm9vbGVhbiB2YWx1ZSA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRCb29sZWFuRmxhZ1ZhbHVlKGZsYWdWYWwsIDkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIHRocm93IiwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkRXJybXNnID0gImludmFsaWQgc3RvcmFnZSBmaWxlIGJ5dGUgb2Zmc2V0IjsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZXgudG9TdHJpbmcoKS5jb250YWlucyhleHBlY3RlZEVycm1zZykpOworICAgICAgICB9CisgICAgfQorIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWIzODI0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKK2FuZHJvaWRfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS50ZXN0LmphdmEiLAorICAgIHNyY3M6IFsiLi8qKi8qLmphdmEiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYWNvbmZpZ19zdG9yYWdlX3JlYWRlcl9qYXZhIiwKKyAgICAgICAgImFuZHJvaWR4LnRlc3QucnVsZXMiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2phdmEiLAorICAgICAgICAianVuaXQiLAorICAgIF0sCisgICAgam5pX2xpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9ydXN0X2puaSIsCisgICAgXSwKKyAgICBkYXRhOiBbCisgICAgICAgICI6cmVhZF9hcGlfdGVzdF9zdG9yYWdlX2ZpbGVzIiwKKyAgICBdLAorICAgIHBsYXRmb3JtX2FwaXM6IHRydWUsCisgICAgY2VydGlmaWNhdGU6ICJwbGF0Zm9ybSIsCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImdlbmVyYWwtdGVzdHMiLAorICAgIF0sCisgICAgdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfY29yZV9leHBlcmltZW50cyIsCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiZmIzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgcGFja2FnZT0iYW5kcm9pZC5hY29uZmlnX3N0b3JhZ2UudGVzdCI+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5hY29uZmlnX3N0b3JhZ2UudGVzdCIgLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZFRlc3QueG1sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljOWUyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIGFjb25maWcgc3RvcmFnZSByZWFkIGphdmEgYXBpIHRlc3RzIj4KKyAgICA8IS0tIE5lZWQgcm9vdCB0byBzdGFydCB2aXJ0dWFsaXphdGlvbnNlcnZpY2UgLS0+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5Sb290VGFyZ2V0UHJlcGFyZXIiLz4KKworICAgIDwhLS0gUHJlcGFyZSB0ZXN0IGRpcmVjdG9yaWVzLiAtLT4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJ1bkNvbW1hbmRUYXJnZXRQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGhyb3ctaWYtY21kLWZhaWwiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bi1jb21tYW5kIiB2YWx1ZT0ibWtkaXIgLXAgL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfamF2YV9hcGkiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVhcmRvd24tY29tbWFuZCIgdmFsdWU9InJtIC1yZiAvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19qYXZhX2FwaSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGVzdEFwcEluc3RhbGxTZXR1cCI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkudGVzdC5qYXZhLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuRGlzYWJsZVNFTGludXhUYXJnZXRQcmVwYXJlciIgLz4KKworICAgIDwhLS0gVGVzdCBkYXRhIGZpbGVzIC0tPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iYWJvcnQtb24tcHVzaC1mYWlsdXJlIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0icGFja2FnZS5tYXAiCisgICAgICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX2phdmFfYXBpX3Rlc3QvbWFwcy9tb2NrdXAucGFja2FnZS5tYXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIiBrZXk9ImZsYWcubWFwIgorICAgICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19qYXZhX2FwaV90ZXN0L21hcHMvbW9ja3VwLmZsYWcubWFwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIga2V5PSJmbGFnLnZhbCIKKyAgICAgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfamF2YV9hcGlfdGVzdC9ib290L21vY2t1cC52YWwiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5hY29uZmlnX3N0b3JhZ2UudGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxbSIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL1N0b3JhZ2VJbnRlcm5hbFJlYWRlclRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvU3RvcmFnZUludGVybmFsUmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMWJiYTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL1N0b3JhZ2VJbnRlcm5hbFJlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlN0b3JhZ2VJbnRlcm5hbFJlYWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTdG9yYWdlSW50ZXJuYWxSZWFkZXJUZXN0IHsKKworICAgIHByaXZhdGUgU3RyaW5nIG1TdG9yYWdlRGlyID0gIi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX2phdmFfYXBpX3Rlc3QiOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmFnZUludGVybmFsUmVhZGVyX2dldEZsYWcoKSB7CisKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VNYXBGaWxlID0gbVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIjsKKyAgICAgICAgU3RyaW5nIGZsYWdWYWx1ZUZpbGUgPSBtU3RvcmFnZURpciArICIvYm9vdC9tb2NrdXAudmFsIjsKKworICAgICAgICBTdG9yYWdlSW50ZXJuYWxSZWFkZXIgcmVhZGVyID0KKyAgICAgICAgICAgICAgICBuZXcgU3RvcmFnZUludGVybmFsUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCBwYWNrYWdlTWFwRmlsZSwgZmxhZ1ZhbHVlRmlsZSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDApKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgxKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvcGFja2FnZS5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9wYWNrYWdlLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzQ2YTAzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvcGFja2FnZS5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvc3RvcmFnZV9yZWFkX2FwaV90ZXN0LmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3N0b3JhZ2VfcmVhZF9hcGlfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyOTA0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3N0b3JhZ2VfcmVhZF9hcGlfdGVzdC5jcHAKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJhY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLmhwcCIKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKKworbmFtZXNwYWNlIGFwaSA9IGFjb25maWdfc3RvcmFnZTsKK25hbWVzcGFjZSBwcml2YXRlX2FwaSA9IGFjb25maWdfc3RvcmFnZTo6cHJpdmF0ZV9pbnRlcm5hbF9hcGk7CisKK2NsYXNzIEFjb25maWdTdG9yYWdlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgUmVzdWx0PHZvaWQ+IGNvcHlfZmlsZShzdGQ6OnN0cmluZyBjb25zdCYgc3JjX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGRzdF9maWxlKSB7CisgICAgYXV0byBjb250ZW50ID0gc3RkOjpzdHJpbmcoKTsKKyAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcoc3JjX2ZpbGUsICZjb250ZW50KSkgeworICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZhaWxlZCB0byByZWFkIGZpbGU6ICIgPDwgc3JjX2ZpbGU7CisgICAgfQorICAgIGlmICghV3JpdGVTdHJpbmdUb0ZpbGUoY29udGVudCwgZHN0X2ZpbGUpKSB7CisgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiZmFpbGVkIHRvIGNvcHkgZmlsZTogIiA8PCBkc3RfZmlsZTsKKyAgICB9CisgICAgcmV0dXJuIHt9OworICB9CisKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBhdXRvIGNvbnN0IHRlc3RfZGlyID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOworICAgIHN0b3JhZ2VfZGlyID0gc3RkOjpzdHJpbmcocm9vdF9kaXIucGF0aCk7CisgICAgYXV0byBtYXBzX2RpciA9IHN0b3JhZ2VfZGlyICsgIi9tYXBzIjsKKyAgICBhdXRvIGJvb3RfZGlyID0gc3RvcmFnZV9kaXIgKyAiL2Jvb3QiOworICAgIG1rZGlyKG1hcHNfZGlyLmNfc3RyKCksIDA3NzUpOworICAgIG1rZGlyKGJvb3RfZGlyLmNfc3RyKCksIDA3NzUpOworICAgIHBhY2thZ2VfbWFwID0gc3RkOjpzdHJpbmcobWFwc19kaXIpICsgIi9tb2NrdXAucGFja2FnZS5tYXAiOworICAgIGZsYWdfbWFwID0gc3RkOjpzdHJpbmcobWFwc19kaXIpICsgIi9tb2NrdXAuZmxhZy5tYXAiOworICAgIGZsYWdfdmFsID0gc3RkOjpzdHJpbmcoYm9vdF9kaXIpICsgIi9tb2NrdXAudmFsIjsKKyAgICBmbGFnX2luZm8gPSBzdGQ6OnN0cmluZyhib290X2RpcikgKyAiL21vY2t1cC5pbmZvIjsKKyAgICBjb3B5X2ZpbGUodGVzdF9kaXIgKyAiL3BhY2thZ2UubWFwIiwgcGFja2FnZV9tYXApOworICAgIGNvcHlfZmlsZSh0ZXN0X2RpciArICIvZmxhZy5tYXAiLCBmbGFnX21hcCk7CisgICAgY29weV9maWxlKHRlc3RfZGlyICsgIi9mbGFnLnZhbCIsIGZsYWdfdmFsKTsKKyAgICBjb3B5X2ZpbGUodGVzdF9kaXIgKyAiL2ZsYWcuaW5mbyIsIGZsYWdfaW5mbyk7CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIHN0ZDo6cmVtb3ZlKHBhY2thZ2VfbWFwLmNfc3RyKCkpOworICAgIHN0ZDo6cmVtb3ZlKGZsYWdfbWFwLmNfc3RyKCkpOworICAgIHN0ZDo6cmVtb3ZlKGZsYWdfdmFsLmNfc3RyKCkpOworICAgIHN0ZDo6cmVtb3ZlKGZsYWdfaW5mby5jX3N0cigpKTsKKyAgfQorCisgIFRlbXBvcmFyeURpciByb290X2RpcjsKKyAgc3RkOjpzdHJpbmcgc3RvcmFnZV9kaXI7CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbWFwOworICBzdGQ6OnN0cmluZyBmbGFnX21hcDsKKyAgc3RkOjpzdHJpbmcgZmxhZ192YWw7CisgIHN0ZDo6c3RyaW5nIGZsYWdfaW5mbzsKK307CisKKy8vLyBUZXN0IHRvIGxvY2sgZG93biBzdG9yYWdlIGZpbGUgdmVyc2lvbiBxdWVyeSBhcGkKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3Rfc3RvcmFnZV92ZXJzaW9uX3F1ZXJ5KSB7CisgIGF1dG8gdmVyc2lvbiA9IGFwaTo6Z2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKHBhY2thZ2VfbWFwKTsKKyAgQVNTRVJUX1RSVUUodmVyc2lvbi5vaygpKTsKKyAgQVNTRVJUX0VRKCp2ZXJzaW9uLCAxKTsKKyAgdmVyc2lvbiA9IGFwaTo6Z2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKGZsYWdfbWFwKTsKKyAgQVNTRVJUX1RSVUUodmVyc2lvbi5vaygpKTsKKyAgQVNTRVJUX0VRKCp2ZXJzaW9uLCAxKTsKKyAgdmVyc2lvbiA9IGFwaTo6Z2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKGZsYWdfdmFsKTsKKyAgQVNTRVJUX1RSVUUodmVyc2lvbi5vaygpKTsKKyAgQVNTRVJUX0VRKCp2ZXJzaW9uLCAxKTsKKyAgdmVyc2lvbiA9IGFwaTo6Z2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKGZsYWdfaW5mbyk7CisgIEFTU0VSVF9UUlVFKHZlcnNpb24ub2soKSk7CisgIEFTU0VSVF9FUSgqdmVyc2lvbiwgMSk7Cit9CisKKy8vLyBOZWdhdGl2ZSB0ZXN0IHRvIGxvY2sgZG93biB0aGUgZXJyb3Igd2hlbiBtYXBwaW5nIG5vbmUgZXhpc3Qgc3RvcmFnZSBmaWxlcworVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9ub25lX2V4aXN0X3N0b3JhZ2VfZmlsZV9tYXBwaW5nKSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gcHJpdmF0ZV9hcGk6OmdldF9tYXBwZWRfZmlsZV9pbXBsKAorICAgICAgc3RvcmFnZV9kaXIsICJ2ZW5kb3IiLCBhcGk6OlN0b3JhZ2VGaWxlVHlwZTo6cGFja2FnZV9tYXApOworICBBU1NFUlRfRkFMU0UobWFwcGVkX2ZpbGVfcmVzdWx0Lm9rKCkpOworICBBU1NFUlRfRVEobWFwcGVkX2ZpbGVfcmVzdWx0LmVycm9yKCksCisgICAgICAgICAgICBzdGQ6OnN0cmluZygiZmFpbGVkIHRvIG9wZW4gIikgKyBzdG9yYWdlX2RpcgorICAgICAgICAgICAgKyAiL21hcHMvdmVuZG9yLnBhY2thZ2UubWFwOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Iik7Cit9CisKKy8vLyBUZXN0IHRvIGxvY2sgZG93biBzdG9yYWdlIHBhY2thZ2UgY29udGV4dCBxdWVyeSBhcGkKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3RfcGFja2FnZV9jb250ZXh0X3F1ZXJ5KSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gcHJpdmF0ZV9hcGk6OmdldF9tYXBwZWRfZmlsZV9pbXBsKAorICAgICAgc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBhcGk6OlN0b3JhZ2VGaWxlVHlwZTo6cGFja2FnZV9tYXApOworICBBU1NFUlRfVFJVRShtYXBwZWRfZmlsZV9yZXN1bHQub2soKSk7CisgIGF1dG8gbWFwcGVkX2ZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8YXBpOjpNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisKKyAgYXV0byBjb250ZXh0ID0gYXBpOjpnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoCisgICAgICAqbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CisgIEFTU0VSVF9UUlVFKGNvbnRleHQub2soKSk7CisgIEFTU0VSVF9UUlVFKGNvbnRleHQtPnBhY2thZ2VfZXhpc3RzKTsKKyAgQVNTRVJUX0VRKGNvbnRleHQtPnBhY2thZ2VfaWQsIDApOworICBBU1NFUlRfRVEoY29udGV4dC0+Ym9vbGVhbl9zdGFydF9pbmRleCwgMCk7CisKKyAgY29udGV4dCA9IGFwaTo6Z2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAorICAgICAgKm1hcHBlZF9maWxlLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpOworICBBU1NFUlRfVFJVRShjb250ZXh0Lm9rKCkpOworICBBU1NFUlRfVFJVRShjb250ZXh0LT5wYWNrYWdlX2V4aXN0cyk7CisgIEFTU0VSVF9FUShjb250ZXh0LT5wYWNrYWdlX2lkLCAxKTsKKyAgQVNTRVJUX0VRKGNvbnRleHQtPmJvb2xlYW5fc3RhcnRfaW5kZXgsIDMpOworCisgIGNvbnRleHQgPSBhcGk6OmdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgKKyAgICAgICptYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKTsKKyAgQVNTRVJUX1RSVUUoY29udGV4dC5vaygpKTsKKyAgQVNTRVJUX1RSVUUoY29udGV4dC0+cGFja2FnZV9leGlzdHMpOworICBBU1NFUlRfRVEoY29udGV4dC0+cGFja2FnZV9pZCwgMik7CisgIEFTU0VSVF9FUShjb250ZXh0LT5ib29sZWFuX3N0YXJ0X2luZGV4LCA2KTsKK30KKworLy8vIFRlc3QgdG8gbG9jayBkb3duIHdoZW4gcXVlcnlpbmcgbm9uZSBleGlzdCBwYWNrYWdlCitURVNUX0YoQWNvbmZpZ1N0b3JhZ2VUZXN0LCB0ZXN0X25vbmVfZXhpc3RlbnRfcGFja2FnZV9jb250ZXh0X3F1ZXJ5KSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gcHJpdmF0ZV9hcGk6OmdldF9tYXBwZWRfZmlsZV9pbXBsKAorICAgICAgc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBhcGk6OlN0b3JhZ2VGaWxlVHlwZTo6cGFja2FnZV9tYXApOworICBBU1NFUlRfVFJVRShtYXBwZWRfZmlsZV9yZXN1bHQub2soKSk7CisgIGF1dG8gbWFwcGVkX2ZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8YXBpOjpNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisKKyAgYXV0byBjb250ZXh0ID0gYXBpOjpnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoCisgICAgICAqbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8zIik7CisgIEFTU0VSVF9UUlVFKGNvbnRleHQub2soKSk7CisgIEFTU0VSVF9GQUxTRShjb250ZXh0LT5wYWNrYWdlX2V4aXN0cyk7Cit9CisKKy8vLyBUZXN0IHRvIGxvY2sgZG93biBzdG9yYWdlIGZsYWcgY29udGV4dCBxdWVyeSBhcGkKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3RfZmxhZ19jb250ZXh0X3F1ZXJ5KSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gcHJpdmF0ZV9hcGk6OmdldF9tYXBwZWRfZmlsZV9pbXBsKAorICAgICAgc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBhcGk6OlN0b3JhZ2VGaWxlVHlwZTo6ZmxhZ19tYXApOworICBBU1NFUlRfVFJVRShtYXBwZWRfZmlsZV9yZXN1bHQub2soKSk7CisgIGF1dG8gbWFwcGVkX2ZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8YXBpOjpNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisKKyAgYXV0byBiYXNlbGluZSA9IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8aW50LCBzdGQ6OnN0cmluZywgYXBpOjpTdG9yZWRGbGFnVHlwZSwgaW50Pj57CisgICAgezAsICJlbmFibGVkX3JvIiwgYXBpOjpTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuLCAxfSwKKyAgICB7MCwgImVuYWJsZWRfcnciLCBhcGk6OlN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAyfSwKKyAgICB7MiwgImVuYWJsZWRfcnciLCBhcGk6OlN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAxfSwKKyAgICB7MSwgImRpc2FibGVkX3J3IiwgYXBpOjpTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwgMH0sCisgICAgezEsICJlbmFibGVkX2ZpeGVkX3JvIiwgYXBpOjpTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sIDF9LAorICAgIHsxLCAiZW5hYmxlZF9ybyIsIGFwaTo6U3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwgMn0sCisgICAgezIsICJlbmFibGVkX2ZpeGVkX3JvIiwgYXBpOjpTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sIDB9LAorICAgIHswLCAiZGlzYWJsZWRfcnciLCBhcGk6OlN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAwfSwKKyAgfTsKKyAgZm9yIChhdXRvIGNvbnN0JltwYWNrYWdlX2lkLCBmbGFnX25hbWUsIGZsYWdfdHlwZSwgZmxhZ19pbmRleF0gOiBiYXNlbGluZSkgeworICAgIGF1dG8gY29udGV4dCA9IGFwaTo6Z2V0X2ZsYWdfcmVhZF9jb250ZXh0KCptYXBwZWRfZmlsZSwgcGFja2FnZV9pZCwgZmxhZ19uYW1lKTsKKyAgICBBU1NFUlRfVFJVRShjb250ZXh0Lm9rKCkpOworICAgIEFTU0VSVF9UUlVFKGNvbnRleHQtPmZsYWdfZXhpc3RzKTsKKyAgICBBU1NFUlRfRVEoY29udGV4dC0+ZmxhZ190eXBlLCBmbGFnX3R5cGUpOworICAgIEFTU0VSVF9FUShjb250ZXh0LT5mbGFnX2luZGV4LCBmbGFnX2luZGV4KTsKKyAgfQorfQorCisvLy8gVGVzdCB0byBsb2NrIGRvd24gd2hlbiBxdWVyeWluZyBub25lIGV4aXN0IGZsYWcKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3Rfbm9uZV9leGlzdGVudF9mbGFnX2NvbnRleHRfcXVlcnkpIHsKKyAgYXV0byBtYXBwZWRfZmlsZV9yZXN1bHQgPSBwcml2YXRlX2FwaTo6Z2V0X21hcHBlZF9maWxlX2ltcGwoCisgICAgICBzdG9yYWdlX2RpciwgIm1vY2t1cCIsIGFwaTo6U3RvcmFnZUZpbGVUeXBlOjpmbGFnX21hcCk7CisgIEFTU0VSVF9UUlVFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBtYXBwZWRfZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxhcGk6Ok1hcHBlZFN0b3JhZ2VGaWxlPigqbWFwcGVkX2ZpbGVfcmVzdWx0KTsKKworICBhdXRvIGNvbnRleHQgPSBhcGk6OmdldF9mbGFnX3JlYWRfY29udGV4dCgqbWFwcGVkX2ZpbGUsIDAsICJub25lX2V4aXN0Iik7CisgIEFTU0VSVF9UUlVFKGNvbnRleHQub2soKSk7CisgIEFTU0VSVF9GQUxTRShjb250ZXh0LT5mbGFnX2V4aXN0cyk7CisKKyAgY29udGV4dCA9IGFwaTo6Z2V0X2ZsYWdfcmVhZF9jb250ZXh0KCptYXBwZWRfZmlsZSwgMywgImVuYWJsZWRfcm8iKTsKKyAgQVNTRVJUX1RSVUUoY29udGV4dC5vaygpKTsKKyAgQVNTRVJUX0ZBTFNFKGNvbnRleHQtPmZsYWdfZXhpc3RzKTsKK30KKworLy8vIFRlc3QgdG8gbG9jayBkb3duIHN0b3JhZ2UgZmxhZyB2YWx1ZSBxdWVyeSBhcGkKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3RfYm9vbGVhbl9mbGFnX3ZhbHVlX3F1ZXJ5KSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gcHJpdmF0ZV9hcGk6OmdldF9tYXBwZWRfZmlsZV9pbXBsKAorICAgICAgc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBhcGk6OlN0b3JhZ2VGaWxlVHlwZTo6ZmxhZ192YWwpOworICBBU1NFUlRfVFJVRShtYXBwZWRfZmlsZV9yZXN1bHQub2soKSk7CisgIGF1dG8gbWFwcGVkX2ZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8YXBpOjpNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisKKyAgYXV0byBleHBlY3RlZF92YWx1ZSA9IHN0ZDo6dmVjdG9yPGJvb2w+eworICAgIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZX07CisgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCA4OyArK2luZGV4KSB7CisgICAgYXV0byB2YWx1ZSA9IGFwaTo6Z2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgqbWFwcGVkX2ZpbGUsIGluZGV4KTsKKyAgICBBU1NFUlRfVFJVRSh2YWx1ZS5vaygpKTsKKyAgICBBU1NFUlRfRVEoKnZhbHVlLCBleHBlY3RlZF92YWx1ZVtpbmRleF0pOworICB9Cit9CisKKy8vLyBOZWdhdGl2ZSB0ZXN0IHRvIGxvY2sgZG93biB0aGUgZXJyb3Igd2hlbiBxdWVyeWluZyBmbGFnIHZhbHVlIG91dCBvZiByYW5nZQorVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9pbnZhbGlkX2Jvb2xlYW5fZmxhZ192YWx1ZV9xdWVyeSkgeworICBhdXRvIG1hcHBlZF9maWxlX3Jlc3VsdCA9IHByaXZhdGVfYXBpOjpnZXRfbWFwcGVkX2ZpbGVfaW1wbCgKKyAgICAgIHN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgYXBpOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfdmFsKTsKKyAgQVNTRVJUX1RSVUUobWFwcGVkX2ZpbGVfcmVzdWx0Lm9rKCkpOworICBhdXRvIG1hcHBlZF9maWxlID0gc3RkOjp1bmlxdWVfcHRyPGFwaTo6TWFwcGVkU3RvcmFnZUZpbGU+KCptYXBwZWRfZmlsZV9yZXN1bHQpOworCisgIGF1dG8gdmFsdWUgPSBhcGk6OmdldF9ib29sZWFuX2ZsYWdfdmFsdWUoKm1hcHBlZF9maWxlLCA4KTsKKyAgQVNTRVJUX0ZBTFNFKHZhbHVlLm9rKCkpOworICBBU1NFUlRfRVEodmFsdWUuZXJyb3IoKSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoRmxhZyB2YWx1ZSBvZmZzZXQgZ29lcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZS4pIikpOworfQorCisvLy8gVGVzdCB0byBsb2NrIGRvd24gc3RvcmFnZSBmbGFnIGluZm8gcXVlcnkgYXBpCitURVNUX0YoQWNvbmZpZ1N0b3JhZ2VUZXN0LCB0ZXN0X2Jvb2xlYW5fZmxhZ19pbmZvX3F1ZXJ5KSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gcHJpdmF0ZV9hcGk6OmdldF9tYXBwZWRfZmlsZV9pbXBsKAorICAgICAgc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBhcGk6OlN0b3JhZ2VGaWxlVHlwZTo6ZmxhZ19pbmZvKTsKKyAgQVNTRVJUX1RSVUUobWFwcGVkX2ZpbGVfcmVzdWx0Lm9rKCkpOworICBhdXRvIG1hcHBlZF9maWxlID0gc3RkOjp1bmlxdWVfcHRyPGFwaTo6TWFwcGVkU3RvcmFnZUZpbGU+KCptYXBwZWRfZmlsZV9yZXN1bHQpOworCisgIGF1dG8gZXhwZWN0ZWRfdmFsdWUgPSBzdGQ6OnZlY3Rvcjxib29sPnsKKyAgICB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZX07CisgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCA4OyArK2luZGV4KSB7CisgICAgYXV0byBhdHRyaWJ1dGUgPSBhcGk6OmdldF9mbGFnX2F0dHJpYnV0ZSgqbWFwcGVkX2ZpbGUsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaW5kZXgpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5vaygpKTsKKyAgICBBU1NFUlRfRVEoKmF0dHJpYnV0ZSAmIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFwaTo6RmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlKSwgMCk7CisgICAgQVNTRVJUX0VRKCgqYXR0cmlidXRlICYgc3RhdGljX2Nhc3Q8dWludDhfdD4oYXBpOjpGbGFnSW5mb0JpdDo6SXNSZWFkV3JpdGUpKSAhPSAwLAorICAgICAgICAgICAgICBleHBlY3RlZF92YWx1ZVtpbmRleF0pOworICAgIEFTU0VSVF9FUSgqYXR0cmlidXRlICYgc3RhdGljX2Nhc3Q8dWludDhfdD4oYXBpOjpGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSksIDApOworICB9Cit9CisKKy8vLyBOZWdhdGl2ZSB0ZXN0IHRvIGxvY2sgZG93biB0aGUgZXJyb3Igd2hlbiBxdWVyeWluZyBmbGFnIGluZm8gb3V0IG9mIHJhbmdlCitURVNUX0YoQWNvbmZpZ1N0b3JhZ2VUZXN0LCB0ZXN0X2ludmFsaWRfYm9vbGVhbl9mbGFnX2luZm9fcXVlcnkpIHsKKyAgYXV0byBtYXBwZWRfZmlsZV9yZXN1bHQgPSBwcml2YXRlX2FwaTo6Z2V0X21hcHBlZF9maWxlX2ltcGwoCisgICAgICBzdG9yYWdlX2RpciwgIm1vY2t1cCIsIGFwaTo6U3RvcmFnZUZpbGVUeXBlOjpmbGFnX2luZm8pOworICBBU1NFUlRfVFJVRShtYXBwZWRfZmlsZV9yZXN1bHQub2soKSk7CisgIGF1dG8gbWFwcGVkX2ZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8YXBpOjpNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisKKyAgYXV0byBhdHRyaWJ1dGUgPSBhcGk6OmdldF9mbGFnX2F0dHJpYnV0ZSgqbWFwcGVkX2ZpbGUsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgOCk7CisgIEFTU0VSVF9GQUxTRShhdHRyaWJ1dGUub2soKSk7CisgIEFTU0VSVF9FUShhdHRyaWJ1dGUuZXJyb3IoKSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoRmxhZyBpbmZvIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLikiKSk7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9zdG9yYWdlX3JlYWRfYXBpX3Rlc3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9zdG9yYWdlX3JlYWRfYXBpX3Rlc3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjNDRkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3N0b3JhZ2VfcmVhZF9hcGlfdGVzdC5ycwpAQCAtMCwwICsxLDIwOCBAQAorI1tjZmcobm90KGZlYXR1cmUgPSAiY2FyZ28iKSldCittb2QgYWNvbmZpZ19zdG9yYWdlX3J1c3RfdGVzdCB7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7RmxhZ0luZm9CaXQsIEZsYWdWYWx1ZVR5cGUsIFN0b3JhZ2VGaWxlVHlwZSwgU3RvcmVkRmxhZ1R5cGV9OworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OnsKKyAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSwgZ2V0X2ZsYWdfYXR0cmlidXRlLCBnZXRfZmxhZ19yZWFkX2NvbnRleHQsCisgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCwgZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uLCBtYXBwZWRfZmlsZTo6Z2V0X21hcHBlZF9maWxlLAorICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQsCisgICAgfTsKKyAgICB1c2UgcmFuZDo6Um5nOworICAgIHVzZSBzdGQ6OmZzOworCisgICAgZm4gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygpIC0+IFN0cmluZyB7CisgICAgICAgIGxldCBtdXQgcm5nID0gcmFuZDo6dGhyZWFkX3JuZygpOworICAgICAgICBsZXQgbnVtYmVyOiB1MzIgPSBybmcuZ2VuKCk7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IFN0cmluZzo6ZnJvbSgiL3RtcC8iKSArICZudW1iZXIudG9fc3RyaW5nKCk7CisgICAgICAgIGlmIHN0ZDo6ZnM6Om1ldGFkYXRhKCZzdG9yYWdlX2RpcikuaXNfb2soKSB7CisgICAgICAgICAgICBmczo6cmVtb3ZlX2Rpcl9hbGwoJnN0b3JhZ2VfZGlyKS51bndyYXAoKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgbWFwc19kaXIgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9tYXBzIjsKKyAgICAgICAgbGV0IGJvb3RfZGlyID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvYm9vdCI7CisgICAgICAgIGZzOjpjcmVhdGVfZGlyKCZzdG9yYWdlX2RpcikudW53cmFwKCk7CisgICAgICAgIGZzOjpjcmVhdGVfZGlyKG1hcHNfZGlyKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXIoYm9vdF9kaXIpLnVud3JhcCgpOworCisgICAgICAgIGxldCBwYWNrYWdlX21hcCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIjsKKyAgICAgICAgbGV0IGZsYWdfbWFwID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvbWFwcy9tb2NrdXAuZmxhZy5tYXAiOworICAgICAgICBsZXQgZmxhZ192YWwgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9ib290L21vY2t1cC52YWwiOworICAgICAgICBsZXQgZmxhZ19pbmZvID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvYm9vdC9tb2NrdXAuaW5mbyI7CisgICAgICAgIGZzOjpjb3B5KCIuL3BhY2thZ2UubWFwIiwgcGFja2FnZV9tYXApLnVud3JhcCgpOworICAgICAgICBmczo6Y29weSgiLi9mbGFnLm1hcCIsIGZsYWdfbWFwKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vZmxhZy52YWwiLCBmbGFnX3ZhbCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL2ZsYWcuaW5mbyIsIGZsYWdfaW5mbykudW53cmFwKCk7CisKKyAgICAgICAgc3RvcmFnZV9kaXIKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF91bmF2YWlsYWJsZV9zdG9hcmdlKCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgZXJyID0gdW5zYWZlIHsKKyAgICAgICAgICAgIGdldF9tYXBwZWRfZmlsZSgmc3RvcmFnZV9kaXIsICJ2ZW5kb3IiLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApLnVud3JhcF9lcnIoKQorICAgICAgICB9OworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVyciksCisgICAgICAgICAgICBmb3JtYXQhKAorICAgICAgICAgICAgICAgICJTdG9yYWdlRmlsZU5vdEZvdW5kKHN0b3JhZ2UgZmlsZSB7fS9tYXBzL3ZlbmRvci5wYWNrYWdlLm1hcCBkb2VzIG5vdCBleGlzdCkiLAorICAgICAgICAgICAgICAgIHN0b3JhZ2VfZGlyCisgICAgICAgICAgICApCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFja2FnZV9jb250ZXh0X3F1ZXJ5KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgcGFja2FnZV9tYXBwZWRfZmlsZSA9IHVuc2FmZSB7CisgICAgICAgICAgICBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKS51bndyYXAoKQorICAgICAgICB9OworCisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcHBlZF9maWxlLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMCwgYm9vbGVhbl9zdGFydF9pbmRleDogMCB9OworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKKworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDEsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDMgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAyLCBib29sZWFuX3N0YXJ0X2luZGV4OiA2IH07CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X25vbmVfZXhpc3RfcGFja2FnZV9jb250ZXh0X3F1ZXJ5KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgcGFja2FnZV9tYXBwZWRfZmlsZSA9IHVuc2FmZSB7CisgICAgICAgICAgICBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKS51bndyYXAoKQorICAgICAgICB9OworCisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHRfb3B0aW9uID0KKyAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzMiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHRfb3B0aW9uLCBOb25lKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9mbGFnX2NvbnRleHRfcXVlcnkoKSB7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgLy8gU0FGRVRZOgorICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCisgICAgICAgIGxldCBmbGFnX21hcHBlZF9maWxlID0KKyAgICAgICAgICAgIHVuc2FmZSB7IGdldF9tYXBwZWRfZmlsZSgmc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXApLnVud3JhcCgpIH07CisKKyAgICAgICAgbGV0IGJhc2VsaW5lID0gdmVjIVsKKyAgICAgICAgICAgICgwLCAiZW5hYmxlZF9ybyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkT25seUJvb2xlYW4sIDF1MTYpLAorICAgICAgICAgICAgKDAsICJlbmFibGVkX3J3IiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sIDJ1MTYpLAorICAgICAgICAgICAgKDIsICJlbmFibGVkX3J3IiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sIDF1MTYpLAorICAgICAgICAgICAgKDEsICJkaXNhYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAwdTE2KSwKKyAgICAgICAgICAgICgxLCAiZW5hYmxlZF9maXhlZF9ybyIsIFN0b3JlZEZsYWdUeXBlOjpGaXhlZFJlYWRPbmx5Qm9vbGVhbiwgMXUxNiksCisgICAgICAgICAgICAoMSwgImVuYWJsZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuLCAydTE2KSwKKyAgICAgICAgICAgICgyLCAiZW5hYmxlZF9maXhlZF9ybyIsIFN0b3JlZEZsYWdUeXBlOjpGaXhlZFJlYWRPbmx5Qm9vbGVhbiwgMHUxNiksCisgICAgICAgICAgICAoMCwgImRpc2FibGVkX3J3IiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sIDB1MTYpLAorICAgICAgICBdOworICAgICAgICBmb3IgKHBhY2thZ2VfaWQsIGZsYWdfbmFtZSwgZmxhZ190eXBlLCBmbGFnX2luZGV4KSBpbiBiYXNlbGluZS5pbnRvX2l0ZXIoKSB7CisgICAgICAgICAgICBsZXQgZmxhZ19jb250ZXh0ID0KKyAgICAgICAgICAgICAgICBnZXRfZmxhZ19yZWFkX2NvbnRleHQoJmZsYWdfbWFwcGVkX2ZpbGUsIHBhY2thZ2VfaWQsIGZsYWdfbmFtZSkudW53cmFwKCkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGZsYWdfY29udGV4dC5mbGFnX3R5cGUsIGZsYWdfdHlwZSk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGZsYWdfY29udGV4dC5mbGFnX2luZGV4LCBmbGFnX2luZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X25vbmVfZXhpc3RfZmxhZ19jb250ZXh0X3F1ZXJ5KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgZmxhZ19tYXBwZWRfZmlsZSA9CisgICAgICAgICAgICB1bnNhZmUgeyBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnTWFwKS51bndyYXAoKSB9OworICAgICAgICBsZXQgZmxhZ19jb250ZXh0X29wdGlvbiA9CisgICAgICAgICAgICBnZXRfZmxhZ19yZWFkX2NvbnRleHQoJmZsYWdfbWFwcGVkX2ZpbGUsIDAsICJub25lX2V4aXN0IikudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19jb250ZXh0X29wdGlvbiwgTm9uZSk7CisKKyAgICAgICAgbGV0IGZsYWdfY29udGV4dF9vcHRpb24gPQorICAgICAgICAgICAgZ2V0X2ZsYWdfcmVhZF9jb250ZXh0KCZmbGFnX21hcHBlZF9maWxlLCAzLCAiZW5hYmxlZF9ybyIpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfY29udGV4dF9vcHRpb24sIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2Jvb2xlYW5fZmxhZ192YWx1ZV9xdWVyeSgpIHsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygpOworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSB0ZXN0IHByb2Nlc3Mgd2lsbCBub3Qgd3JpdGUgdG8gdGVtcCBzdG9yYWdlIGZpbGUKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfZmlsZSA9CisgICAgICAgICAgICB1bnNhZmUgeyBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKS51bndyYXAoKSB9OworICAgICAgICBsZXQgYmFzZWxpbmU6IFZlYzxib29sPiA9IHZlYyFbZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXTsKKyAgICAgICAgZm9yIChvZmZzZXQsIGV4cGVjdGVkX3ZhbHVlKSBpbiBiYXNlbGluZS5pbnRvX2l0ZXIoKS5lbnVtZXJhdGUoKSB7CisgICAgICAgICAgICBsZXQgZmxhZ192YWx1ZSA9IGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsdWVfZmlsZSwgb2Zmc2V0IGFzIHUzMikudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdmFsdWUsIGV4cGVjdGVkX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ludmFsaWRfYm9vbGVhbl9mbGFnX3ZhbHVlX3F1ZXJ5KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgZmxhZ192YWx1ZV9maWxlID0KKyAgICAgICAgICAgIHVuc2FmZSB7IGdldF9tYXBwZWRfZmlsZSgmc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpLnVud3JhcCgpIH07CisgICAgICAgIGxldCBlcnIgPSBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbHVlX2ZpbGUsIDh1MzIpLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnIpLAorICAgICAgICAgICAgIkludmFsaWRTdG9yYWdlRmlsZU9mZnNldChGbGFnIHZhbHVlIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLikiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZmxhZ19pbmZvX3F1ZXJ5KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPQorICAgICAgICAgICAgdW5zYWZlIHsgZ2V0X21hcHBlZF9maWxlKCZzdG9yYWdlX2RpciwgIm1vY2t1cCIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8pLnVud3JhcCgpIH07CisgICAgICAgIGxldCBpc19ydzogVmVjPGJvb2w+ID0gdmVjIVt0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZV07CisgICAgICAgIGZvciAob2Zmc2V0LCBleHBlY3RlZF92YWx1ZSkgaW4gaXNfcncuaW50b19pdGVyKCkuZW51bWVyYXRlKCkgeworICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9CisgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfYXR0cmlidXRlKCZmbGFnX2luZm9fZmlsZSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0IGFzIHUzMikudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnQhKChhdHRyaWJ1dGUgJiBGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpID09IDB1OCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKChhdHRyaWJ1dGUgJiBGbGFnSW5mb0JpdDo6SXNSZWFkV3JpdGUgYXMgdTgpICE9IDB1OCwgZXhwZWN0ZWRfdmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0ISgoYXR0cmlidXRlICYgRmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUgYXMgdTgpID09IDB1OCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9pbnZhbGlkX2Jvb2xlYW5fZmxhZ19pbmZvX3F1ZXJ5KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPQorICAgICAgICAgICAgdW5zYWZlIHsgZ2V0X21hcHBlZF9maWxlKCZzdG9yYWdlX2RpciwgIm1vY2t1cCIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8pLnVud3JhcCgpIH07CisgICAgICAgIGxldCBlcnIgPSBnZXRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19maWxlLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCA4dTMyKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyKSwKKyAgICAgICAgICAgICJJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoRmxhZyBpbmZvIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLikiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfc3RvcmFnZV92ZXJzaW9uX3F1ZXJ5KCkgeworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9wYWNrYWdlLm1hcCIpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vZmxhZy5tYXAiKS51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2ZsYWcudmFsIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9mbGFnLmluZm8iKS51bndyYXAoKSwgMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjE5NjJjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw4MyBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitydXN0X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5kZWZhdWx0cyIsCisgICAgZWRpdGlvbjogIjIwMjEiLAorICAgIGxpbnRzOiAibm9uZSIsCisgICAgc3JjczogWyJzcmMvbGliLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFueWhvdyIsCisgICAgICAgICJsaWJ0ZW1wZmlsZSIsCisgICAgICAgICJsaWJtZW1tYXAyIiwKKyAgICAgICAgImxpYmN4eCIsCisgICAgICAgICJsaWJ0aGlzZXJyb3IiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKKyAgICBdLAorfQorCitydXN0X2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpIiwKKyAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5kZWZhdWx0cyJdLAorfQorCitydXN0X3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkudGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorICAgIGRlZmF1bHRzOiBbImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuZGVmYXVsdHMiXSwKKyAgICBkYXRhOiBbCisgICAgICAgICJ0ZXN0cy9mbGFnLnZhbCIsCisgICAgICAgICJ0ZXN0cy9mbGFnLmluZm8iLAorICAgIF0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSIsCisgICAgXSwKK30KKworLy8gY3h4IHNvdXJjZSBjb2RlZ2VuIGZyb20gcnVzdCBhcGkKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJsaWJjeHhfYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaV9icmlkZ2VfY29kZSIsCisgICAgdG9vbHM6IFsiY3h4YnJpZGdlIl0sCisgICAgY21kOiAiJChsb2NhdGlvbiBjeHhicmlkZ2UpICQoaW4pID4gJChvdXQpIiwKKyAgICBzcmNzOiBbInNyYy9saWIucnMiXSwKKyAgICBvdXQ6IFsiYWNvbmZpZ19zdG9yYWdlL2xpYi5ycy5jYyJdLAorfQorCisvLyBjeHggaGVhZGVyIGNvZGVnZW4gZnJvbSBydXN0IGFwaQorZ2VucnVsZSB7CisgICAgbmFtZTogImxpYmN4eF9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpX2JyaWRnZV9oZWFkZXIiLAorICAgIHRvb2xzOiBbImN4eGJyaWRnZSJdLAorICAgIGNtZDogIiQobG9jYXRpb24gY3h4YnJpZGdlKSAkKGluKSAtLWhlYWRlciA+ICQob3V0KSIsCisgICAgc3JjczogWyJzcmMvbGliLnJzIl0sCisgICAgb3V0OiBbImFjb25maWdfc3RvcmFnZS9saWIucnMuaCJdLAorfQorCisvLyBhIHN0YXRpYyBjYyBsaWIgYmFzZWQgb24gZ2VuZXJhdGVkIGNvZGUKK3J1c3RfZmZpX3N0YXRpYyB7CisgICAgbmFtZTogImxpYmFjb25maWdfc3RvcmFnZV93cml0ZV9hcGlfY3h4X2JyaWRnZSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGlfY3h4X2JyaWRnZSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5kZWZhdWx0cyJdLAorfQorCisvLyBmbGFnIHdyaXRlIGFwaSBjYyBpbnRlcmZhY2UKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaV9jYyIsCisgICAgc3JjczogWyJhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmNwcCJdLAorICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCisgICAgICAgICJjeHgtYnJpZGdlLWhlYWRlciIsCisgICAgICAgICJsaWJjeHhfYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaV9icmlkZ2VfaGVhZGVyIiwKKyAgICBdLAorICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbImxpYmN4eF9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpX2JyaWRnZV9jb2RlIl0sCisgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaV9jeHhfYnJpZGdlIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jYyIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0NhcmdvLnRvbWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2U2ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwyMCBAQAorW3BhY2thZ2VdCituYW1lID0gImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkiCit2ZXJzaW9uID0gIjAuMS4wIgorZWRpdGlvbiA9ICIyMDIxIgorCitbZmVhdHVyZXNdCitkZWZhdWx0ID0gWyJjYXJnbyJdCitjYXJnbyA9IFtdCisKK1tkZXBlbmRlbmNpZXNdCithbnlob3cgPSAiMS4wLjY5IgorY3h4ID0gIjEuMCIKK21lbW1hcDIgPSAiMC44LjAiCit0ZW1wZmlsZSA9ICIzLjkuMCIKK3RoaXNlcnJvciA9ICIxLjAuNTYiCithY29uZmlnX3N0b3JhZ2VfZmlsZSA9IHsgcGF0aCA9ICIuLi9hY29uZmlnX3N0b3JhZ2VfZmlsZSIgfQorYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpID0geyBwYXRoID0gIi4uL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaSIgfQorCitbYnVpbGQtZGVwZW5kZW5jaWVzXQorY3h4LWJ1aWxkID0gIjEuMCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQzNTc0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuY3BwCkBAIC0wLDAgKzEsMTE3IEBACisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJydXN0L2N4eC5oIgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9saWIucnMuaCIKKyNpbmNsdWRlICJhY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5ocHAiCisKK25hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UgeworCisvLy8gTWFwIGEgc3RvcmFnZSBmaWxlCithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8TXV0YWJsZU1hcHBlZFN0b3JhZ2VGaWxlICo+IG1hcF9tdXRhYmxlX3N0b3JhZ2VfZmlsZSgKKyAgICBzdGQ6OnN0cmluZyBjb25zdCAmZmlsZSkgeworICBzdHJ1Y3Qgc3RhdCBmaWxlX3N0YXQ7CisgIGlmIChzdGF0KGZpbGUuY19zdHIoKSwgJmZpbGVfc3RhdCkgPCAwKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm5vRXJyb3IoKSA8PCAic3RhdCBmYWlsZWQiOworICB9CisKKyAgaWYgKChmaWxlX3N0YXQuc3RfbW9kZSAmIChTX0lXVVNSIHwgU19JV0dSUCB8IFNfSVdPVEgpKSA9PSAwKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm9yKCkgPDwgImNhbm5vdCBtYXAgbm9ud3JpdGVhYmxlIGZpbGUiOworICB9CisKKyAgc2l6ZV90IGZpbGVfc2l6ZSA9IGZpbGVfc3RhdC5zdF9zaXplOworCisgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCB1ZmQob3BlbihmaWxlLmNfc3RyKCksIE9fUkRXUiB8IE9fTk9GT0xMT1cgfCBPX0NMT0VYRUMpKTsKKyAgaWYgKHVmZC5nZXQoKSA9PSAtMSkgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpFcnJub0Vycm9yKCkgPDwgImZhaWxlZCB0byBvcGVuICIgPDwgZmlsZTsKKyAgfTsKKworICB2b2lkICpjb25zdCBtYXBfcmVzdWx0ID0KKyAgICAgIG1tYXAobnVsbHB0ciwgZmlsZV9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCB1ZmQuZ2V0KCksIDApOworICBpZiAobWFwX3Jlc3VsdCA9PSBNQVBfRkFJTEVEKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm5vRXJyb3IoKSA8PCAibW1hcCBmYWlsZWQiOworICB9CisKKyAgYXV0byBtYXBwZWRfZmlsZSA9IG5ldyBNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUoKTsKKyAgbWFwcGVkX2ZpbGUtPmZpbGVfcHRyID0gbWFwX3Jlc3VsdDsKKyAgbWFwcGVkX2ZpbGUtPmZpbGVfc2l6ZSA9IGZpbGVfc2l6ZTsKKworICByZXR1cm4gbWFwcGVkX2ZpbGU7Cit9CisKKy8vLyBTZXQgYm9vbGVhbiBmbGFnIHZhbHVlCithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8dm9pZD4gc2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICBjb25zdCBNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUgJmZpbGUsCisgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgIGJvb2wgdmFsdWUpIHsKKyAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8dWludDhfdD4oCisgICAgICBzdGF0aWNfY2FzdDx1aW50OF90ICo+KGZpbGUuZmlsZV9wdHIpLCBmaWxlLmZpbGVfc2l6ZSk7CisgIGF1dG8gdXBkYXRlX2N4eCA9IHVwZGF0ZV9ib29sZWFuX2ZsYWdfdmFsdWVfY3h4KGNvbnRlbnQsIG9mZnNldCwgdmFsdWUpOworICBpZiAoIXVwZGF0ZV9jeHgudXBkYXRlX3N1Y2Nlc3MpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJyb3IoKSA8PCB1cGRhdGVfY3h4LmVycm9yX21lc3NhZ2UuY19zdHIoKTsKKyAgfQorICBpZiAoIW1zeW5jKHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZmlsZS5maWxlX3B0cikgKyB1cGRhdGVfY3h4Lm9mZnNldCwgMSwgTVNfU1lOQykpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJybm9FcnJvcigpIDw8ICJtc3luYyBmYWlsZWQiOworICB9CisgIHJldHVybiB7fTsKK30KKworLy8vIFNldCBpZiBmbGFnIGhhcyBzZXJ2ZXIgb3ZlcnJpZGUKK2FuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiBzZXRfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKAorICAgIGNvbnN0IE11dGFibGVNYXBwZWRTdG9yYWdlRmlsZSAmZmlsZSwKKyAgICBGbGFnVmFsdWVUeXBlIHZhbHVlX3R5cGUsCisgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgIGJvb2wgdmFsdWUpIHsKKyAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8dWludDhfdD4oCisgICAgICBzdGF0aWNfY2FzdDx1aW50OF90ICo+KGZpbGUuZmlsZV9wdHIpLCBmaWxlLmZpbGVfc2l6ZSk7CisgIGF1dG8gdXBkYXRlX2N4eCA9IHVwZGF0ZV9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGVfY3h4KAorICAgICAgY29udGVudCwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHZhbHVlX3R5cGUpLCBvZmZzZXQsIHZhbHVlKTsKKyAgaWYgKCF1cGRhdGVfY3h4LnVwZGF0ZV9zdWNjZXNzKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm9yKCkgPDwgdXBkYXRlX2N4eC5lcnJvcl9tZXNzYWdlLmNfc3RyKCk7CisgIH0KKyAgaWYgKCFtc3luYyhzdGF0aWNfY2FzdDx1aW50OF90ICo+KGZpbGUuZmlsZV9wdHIpICsgdXBkYXRlX2N4eC5vZmZzZXQsIDEsIE1TX1NZTkMpKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm5vRXJyb3IoKSA8PCAibXN5bmMgZmFpbGVkIjsKKyAgfQorICByZXR1cm4ge307Cit9CisKKy8vLyBTZXQgaWYgZmxhZyBoYXMgbG9jYWwgb3ZlcnJpZGUKK2FuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiBzZXRfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoCisgICAgY29uc3QgTXV0YWJsZU1hcHBlZFN0b3JhZ2VGaWxlICZmaWxlLAorICAgIEZsYWdWYWx1ZVR5cGUgdmFsdWVfdHlwZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsCisgICAgYm9vbCB2YWx1ZSkgeworICBhdXRvIGNvbnRlbnQgPSBydXN0OjpTbGljZTx1aW50OF90PigKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZmlsZS5maWxlX3B0ciksIGZpbGUuZmlsZV9zaXplKTsKKyAgYXV0byB1cGRhdGVfY3h4ID0gdXBkYXRlX2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlX2N4eCgKKyAgICAgIGNvbnRlbnQsIHN0YXRpY19jYXN0PHVpbnQxNl90Pih2YWx1ZV90eXBlKSwgb2Zmc2V0LCB2YWx1ZSk7CisgIGlmICghdXBkYXRlX2N4eC51cGRhdGVfc3VjY2VzcykgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpFcnJvcigpIDw8IHVwZGF0ZV9jeHguZXJyb3JfbWVzc2FnZS5jX3N0cigpOworICB9CisgIGlmICghbXN5bmMoc3RhdGljX2Nhc3Q8dWludDhfdCAqPihmaWxlLmZpbGVfcHRyKSArIHVwZGF0ZV9jeHgub2Zmc2V0LCAxLCBNU19TWU5DKSkgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpFcnJub0Vycm9yKCkgPDwgIm1zeW5jIGZhaWxlZCI7CisgIH0KKyAgcmV0dXJuIHt9OworfQorCithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8dm9pZD4gY3JlYXRlX2ZsYWdfaW5mbygKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgcGFja2FnZV9tYXAsCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIGZsYWdfbWFwLAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBmbGFnX2luZm9fb3V0KSB7CisgIGF1dG8gY3JlYXRpb25fY3h4ID0gY3JlYXRlX2ZsYWdfaW5mb19jeHgoCisgICAgICBydXN0OjpTdHIocGFja2FnZV9tYXAuY19zdHIoKSksCisgICAgICBydXN0OjpTdHIoZmxhZ19tYXAuY19zdHIoKSksCisgICAgICBydXN0OjpTdHIoZmxhZ19pbmZvX291dC5jX3N0cigpKSk7CisgIGlmIChjcmVhdGlvbl9jeHguc3VjY2VzcykgeworICAgIHJldHVybiB7fTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJyb3IoKSA8PCBjcmVhdGlvbl9jeHguZXJyb3JfbWVzc2FnZTsKKyAgfQorfQorfSAvLyBuYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvYnVpbGQucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvYnVpbGQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxYWE1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9idWlsZC5ycwpAQCAtMCwwICsxLDQgQEAKK2ZuIG1haW4oKSB7CisgICAgbGV0IF8gPSBjeHhfYnVpbGQ6OmJyaWRnZSgic3JjL2xpYi5ycyIpOworICAgIHByaW50bG4hKCJjYXJnbzpyZXJ1bi1pZi1jaGFuZ2VkPXNyYy9saWIucnMiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9pbmNsdWRlL2Fjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmhwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9pbmNsdWRlL2Fjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmJhN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2luY2x1ZGUvYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuaHBwCkBAIC0wLDAgKzEsNDggQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgorI2luY2x1ZGUgPGFjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuaHBwPgorCisKK25hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UgeworCisvLy8gTWFwcGVkIGZsYWcgdmFsdWUgZmlsZQorc3RydWN0IE11dGFibGVNYXBwZWRTdG9yYWdlRmlsZSA6IE1hcHBlZFN0b3JhZ2VGaWxlIHt9OworCisvLy8gTWFwIGEgc3RvcmFnZSBmaWxlCithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8TXV0YWJsZU1hcHBlZFN0b3JhZ2VGaWxlKj4gbWFwX211dGFibGVfc3RvcmFnZV9maWxlKAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlKTsKKworLy8vIFNldCBib29sZWFuIGZsYWcgdmFsdWUKK2FuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiBzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKAorICAgIGNvbnN0IE11dGFibGVNYXBwZWRTdG9yYWdlRmlsZSYgZmlsZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsCisgICAgYm9vbCB2YWx1ZSk7CisKKy8vLyBTZXQgaWYgZmxhZyBoYXMgc2VydmVyIG92ZXJyaWRlCithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8dm9pZD4gc2V0X2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgKKyAgICBjb25zdCBNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUmIGZpbGUsCisgICAgRmxhZ1ZhbHVlVHlwZSB2YWx1ZV90eXBlLAorICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICBib29sIHZhbHVlKTsKKworLy8vIFNldCBpZiBmbGFnIGhhcyBsb2NhbCBvdmVycmlkZQorYW5kcm9pZDo6YmFzZTo6UmVzdWx0PHZvaWQ+IHNldF9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSgKKyAgICBjb25zdCBNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUmIGZpbGUsCisgICAgRmxhZ1ZhbHVlVHlwZSB2YWx1ZV90eXBlLAorICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICBib29sIHZhbHVlKTsKKworLy8vIENyZWF0ZSBmbGFnIGluZm8gZmlsZSBiYXNlZCBvbiBwYWNrYWdlIGFuZCBmbGFnIG1hcAorLy8vIFxpbnB1dCBwYWNrYWdlX21hcDogcGFja2FnZSBtYXAgZmlsZQorLy8vIFxpbnB1dCBmbGFnX21hcDogZmxhZyBtYXAgZmlsZQorLy8vIFxpbnB1dCBmbGFnX2luZm9fb3V0OiBmbGFnIGluZm8gZmlsZSB0byBiZSBjcmVhdGVkCithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8dm9pZD4gY3JlYXRlX2ZsYWdfaW5mbygKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgcGFja2FnZV9tYXAsCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIGZsYWdfbWFwLAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBmbGFnX2luZm9fb3V0KTsKKworfSAvLyBuYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfaW5mb191cGRhdGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfaW5mb191cGRhdGUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2MDcxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ19pbmZvX3VwZGF0ZS5ycwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vISBmbGFnIGluZm8gdXBkYXRlIG1vZHVsZSBkZWZpbmVzIHRoZSBmbGFnIGluZm8gZmlsZSB3cml0ZSB0byBtYXBwZWQgYnl0ZXMKKwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7CisgICAgcmVhZF91OF9mcm9tX2J5dGVzLCBBY29uZmlnU3RvcmFnZUVycm9yLCBGbGFnSW5mb0JpdCwgRmxhZ0luZm9IZWFkZXIsIEZsYWdWYWx1ZVR5cGUsCisgICAgRklMRV9WRVJTSU9OLAorfTsKK3VzZSBhbnlob3c6OmFueWhvdzsKKworZm4gZ2V0X2ZsYWdfaW5mb19vZmZzZXQoCisgICAgYnVmOiAmbXV0IFt1OF0sCisgICAgZmxhZ190eXBlOiBGbGFnVmFsdWVUeXBlLAorICAgIGZsYWdfaW5kZXg6IHUzMiwKKykgLT4gUmVzdWx0PHVzaXplLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdJbmZvSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OworICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gRklMRV9WRVJTSU9OIHsKKyAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oYW55aG93ISgKKyAgICAgICAgICAgICJDYW5ub3Qgd3JpdGUgdG8gc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9IiwKKyAgICAgICAgICAgIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uLAorICAgICAgICAgICAgRklMRV9WRVJTSU9OCisgICAgICAgICkpKTsKKyAgICB9CisKKyAgICAvLyBnZXQgYnl0ZSBvZmZzZXQgdG8gdGhlIGZsYWcgaW5mbworICAgIGxldCBoZWFkID0gbWF0Y2ggZmxhZ190eXBlIHsKKyAgICAgICAgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiA9PiAoaW50ZXJwcmV0ZWRfaGVhZGVyLmJvb2xlYW5fZmxhZ19vZmZzZXQgKyBmbGFnX2luZGV4KSBhcyB1c2l6ZSwKKyAgICB9OworCisgICAgaWYgaGVhZCA+PSBpbnRlcnByZXRlZF9oZWFkZXIuZmlsZV9zaXplIGFzIHVzaXplIHsKKyAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoYW55aG93ISgKKyAgICAgICAgICAgICJGbGFnIHZhbHVlIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLiIKKyAgICAgICAgKSkpOworICAgIH0KKworICAgIE9rKGhlYWQpCit9CisKK2ZuIGdldF9mbGFnX2F0dHJpYnV0ZV9hbmRfb2Zmc2V0KAorICAgIGJ1ZjogJm11dCBbdThdLAorICAgIGZsYWdfdHlwZTogRmxhZ1ZhbHVlVHlwZSwKKyAgICBmbGFnX2luZGV4OiB1MzIsCispIC0+IFJlc3VsdDwodTgsIHVzaXplKSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBoZWFkID0gZ2V0X2ZsYWdfaW5mb19vZmZzZXQoYnVmLCBmbGFnX3R5cGUsIGZsYWdfaW5kZXgpPzsKKyAgICBsZXQgbXV0IHBvcyA9IGhlYWQ7CisgICAgbGV0IGF0dHJpYnV0ZSA9IHJlYWRfdThfZnJvbV9ieXRlcyhidWYsICZtdXQgcG9zKT87CisgICAgT2soKGF0dHJpYnV0ZSwgaGVhZCkpCit9CisKKy8vLyBTZXQgaWYgZmxhZyBoYXMgc2VydmVyIG92ZXJyaWRlCitwdWIgZm4gdXBkYXRlX2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgKKyAgICBidWY6ICZtdXQgW3U4XSwKKyAgICBmbGFnX3R5cGU6IEZsYWdWYWx1ZVR5cGUsCisgICAgZmxhZ19pbmRleDogdTMyLAorICAgIHZhbHVlOiBib29sLAorKSAtPiBSZXN1bHQ8dXNpemUsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgKGF0dHJpYnV0ZSwgaGVhZCkgPSBnZXRfZmxhZ19hdHRyaWJ1dGVfYW5kX29mZnNldChidWYsIGZsYWdfdHlwZSwgZmxhZ19pbmRleCk/OworICAgIGxldCBoYXNfb3ZlcnJpZGUgPSAoYXR0cmlidXRlICYgKEZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSBhcyB1OCkpICE9IDA7CisgICAgaWYgaGFzX292ZXJyaWRlICE9IHZhbHVlIHsKKyAgICAgICAgYnVmW2hlYWRdID0gKGF0dHJpYnV0ZSBeIEZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSBhcyB1OCkudG9fbGVfYnl0ZXMoKVswXTsKKyAgICB9CisgICAgT2soaGVhZCkKK30KKworLy8vIFNldCBpZiBmbGFnIGhhcyBsb2NhbCBvdmVycmlkZQorcHViIGZuIHVwZGF0ZV9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSgKKyAgICBidWY6ICZtdXQgW3U4XSwKKyAgICBmbGFnX3R5cGU6IEZsYWdWYWx1ZVR5cGUsCisgICAgZmxhZ19pbmRleDogdTMyLAorICAgIHZhbHVlOiBib29sLAorKSAtPiBSZXN1bHQ8dXNpemUsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgKGF0dHJpYnV0ZSwgaGVhZCkgPSBnZXRfZmxhZ19hdHRyaWJ1dGVfYW5kX29mZnNldChidWYsIGZsYWdfdHlwZSwgZmxhZ19pbmRleCk/OworICAgIGxldCBoYXNfb3ZlcnJpZGUgPSAoYXR0cmlidXRlICYgKEZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlIGFzIHU4KSkgIT0gMDsKKyAgICBpZiBoYXNfb3ZlcnJpZGUgIT0gdmFsdWUgeworICAgICAgICBidWZbaGVhZF0gPSAoYXR0cmlidXRlIF4gRmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUgYXMgdTgpLnRvX2xlX2J5dGVzKClbMF07CisgICAgfQorICAgIE9rKGhlYWQpCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdDsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpmbGFnX2luZm9fcXVlcnk6OmZpbmRfZmxhZ19hdHRyaWJ1dGU7CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gaGFzIHNlcnZlciBvdmVycmlkZSB1cGRhdGUKKyAgICBmbiB0ZXN0X3VwZGF0ZV9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoKSB7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCk7CisgICAgICAgIGxldCBtdXQgYnVmID0gZmxhZ19pbmZvX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBmb3IgaSBpbiAwLi5mbGFnX2luZm9fbGlzdC5oZWFkZXIubnVtX2ZsYWdzIHsKKyAgICAgICAgICAgIHVwZGF0ZV9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoJm11dCBidWYsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIHRydWUpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9IGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmJ1ZiwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnQhKChhdHRyaWJ1dGUgJiAoRmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlIGFzIHU4KSkgIT0gMCk7CisgICAgICAgICAgICB1cGRhdGVfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKCZtdXQgYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gZmluZF9mbGFnX2F0dHJpYnV0ZSgmYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpKSA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBoYXMgbG9jYWwgb3ZlcnJpZGUgdXBkYXRlCisgICAgZm4gdGVzdF91cGRhdGVfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoKSB7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCk7CisgICAgICAgIGxldCBtdXQgYnVmID0gZmxhZ19pbmZvX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBmb3IgaSBpbiAwLi5mbGFnX2luZm9fbGlzdC5oZWFkZXIubnVtX2ZsYWdzIHsKKyAgICAgICAgICAgIHVwZGF0ZV9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSgmbXV0IGJ1ZiwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSwgdHJ1ZSkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gZmluZF9mbGFnX2F0dHJpYnV0ZSgmYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkpICE9IDApOworICAgICAgICAgICAgdXBkYXRlX2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKCZtdXQgYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gZmluZF9mbGFnX2F0dHJpYnV0ZSgmYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkpID09IDApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX3ZhbHVlX3VwZGF0ZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ192YWx1ZV91cGRhdGUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxNWM5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ192YWx1ZV91cGRhdGUucnMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vISBmbGFnIHZhbHVlIHVwZGF0ZSBtb2R1bGUgZGVmaW5lcyB0aGUgZmxhZyB2YWx1ZSBmaWxlIHdyaXRlIHRvIG1hcHBlZCBieXRlcworCit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBGbGFnVmFsdWVIZWFkZXIsIEZJTEVfVkVSU0lPTn07Cit1c2UgYW55aG93Ojphbnlob3c7CisKKy8vLyBTZXQgZmxhZyB2YWx1ZQorcHViIGZuIHVwZGF0ZV9ib29sZWFuX2ZsYWdfdmFsdWUoCisgICAgYnVmOiAmbXV0IFt1OF0sCisgICAgZmxhZ19pbmRleDogdTMyLAorICAgIGZsYWdfdmFsdWU6IGJvb2wsCispIC0+IFJlc3VsdDx1c2l6ZSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBpbnRlcnByZXRlZF9oZWFkZXIgPSBGbGFnVmFsdWVIZWFkZXI6OmZyb21fYnl0ZXMoYnVmKT87CisgICAgaWYgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24gPiBGSUxFX1ZFUlNJT04geworICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihhbnlob3chKAorICAgICAgICAgICAgIkNhbm5vdCB3cml0ZSB0byBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30iLAorICAgICAgICAgICAgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24sCisgICAgICAgICAgICBGSUxFX1ZFUlNJT04KKyAgICAgICAgKSkpOworICAgIH0KKworICAgIC8vIGdldCBieXRlIG9mZnNldCB0byB0aGUgZmxhZworICAgIGxldCBoZWFkID0gKGludGVycHJldGVkX2hlYWRlci5ib29sZWFuX3ZhbHVlX29mZnNldCArIGZsYWdfaW5kZXgpIGFzIHVzaXplOworICAgIGlmIGhlYWQgPj0gaW50ZXJwcmV0ZWRfaGVhZGVyLmZpbGVfc2l6ZSBhcyB1c2l6ZSB7CisgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SW52YWxpZFN0b3JhZ2VGaWxlT2Zmc2V0KGFueWhvdyEoCisgICAgICAgICAgICAiRmxhZyB2YWx1ZSBvZmZzZXQgZ29lcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZS4iCisgICAgICAgICkpKTsKKyAgICB9CisKKyAgICBidWZbaGVhZF0gPSB1ODo6ZnJvbShmbGFnX3ZhbHVlKS50b19sZV9ieXRlcygpWzBdOworICAgIE9rKGhlYWQpCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3Q7CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmxhZyB2YWx1ZSB1cGRhdGUKKyAgICBmbiB0ZXN0X2Jvb2xlYW5fZmxhZ192YWx1ZV91cGRhdGUoKSB7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoKTsKKyAgICAgICAgbGV0IHZhbHVlX29mZnNldCA9IGZsYWdfdmFsdWVfbGlzdC5oZWFkZXIuYm9vbGVhbl92YWx1ZV9vZmZzZXQ7CisgICAgICAgIGxldCBtdXQgY29udGVudCA9IGZsYWdfdmFsdWVfbGlzdC5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCB0cnVlX2J5dGUgPSB1ODo6ZnJvbSh0cnVlKS50b19sZV9ieXRlcygpWzBdOworICAgICAgICBsZXQgZmFsc2VfYnl0ZSA9IHU4Ojpmcm9tKGZhbHNlKS50b19sZV9ieXRlcygpWzBdOworCisgICAgICAgIGZvciBpIGluIDAuLmZsYWdfdmFsdWVfbGlzdC5oZWFkZXIubnVtX2ZsYWdzIHsKKyAgICAgICAgICAgIGxldCBvZmZzZXQgPSAodmFsdWVfb2Zmc2V0ICsgaSkgYXMgdXNpemU7CisgICAgICAgICAgICB1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgY29udGVudCwgaSwgdHJ1ZSkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGNvbnRlbnRbb2Zmc2V0XSwgdHJ1ZV9ieXRlKTsKKyAgICAgICAgICAgIHVwZGF0ZV9ib29sZWFuX2ZsYWdfdmFsdWUoJm11dCBjb250ZW50LCBpLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGNvbnRlbnRbb2Zmc2V0XSwgZmFsc2VfYnl0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdXBkYXRlIGJleW9uZCB0aGUgZW5kIG9mIGJvb2xlYW4gc2VjdGlvbgorICAgIGZuIHRlc3RfYm9vbGVhbl9vdXRfb2ZfcmFuZ2UoKSB7CisgICAgICAgIGxldCBtdXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgZXJyb3IgPSB1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgZmxhZ192YWx1ZV9saXN0Wy4uXSwgOCwgdHJ1ZSkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgICJJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoRmxhZyB2YWx1ZSBvZmZzZXQgZ29lcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZS4pIgorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBlcnJvciB3aGVuIGZpbGUgaGFzIGEgaGlnaGVyIHZlcnNpb24KKyAgICBmbiB0ZXN0X2hpZ2hlcl92ZXJzaW9uX3N0b3JhZ2VfZmlsZSgpIHsKKyAgICAgICAgbGV0IG11dCB2YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KCk7CisgICAgICAgIHZhbHVlX2xpc3QuaGVhZGVyLnZlcnNpb24gPSBGSUxFX1ZFUlNJT04gKyAxOworICAgICAgICBsZXQgbXV0IGZsYWdfdmFsdWUgPSB2YWx1ZV9saXN0LmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGVycm9yID0gdXBkYXRlX2Jvb2xlYW5fZmxhZ192YWx1ZSgmbXV0IGZsYWdfdmFsdWVbLi5dLCA0LCB0cnVlKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAiSGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKENhbm5vdCB3cml0ZSB0byBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30pIiwKKyAgICAgICAgICAgICAgICBGSUxFX1ZFUlNJT04gKyAxLAorICAgICAgICAgICAgICAgIEZJTEVfVkVSU0lPTgorICAgICAgICAgICAgKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5NmE2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbGliLnJzCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGBhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpYCBpcyBhIGNyYXRlIHRoYXQgZGVmaW5lcyB3cml0ZSBhcGlzIHRvIHVwZGF0ZSBmbGFnIHZhbHVlCisvLyEgaW4gc3RvcmFnZSBmaWxlLiBJdCBwcm92aWRlcyBvbmUgYXBpIHRvIGludGVyZmFjZSB3aXRoIHN0b3JhZ2UgZmlsZXMuCisKK3B1YiBtb2QgZmxhZ19pbmZvX3VwZGF0ZTsKK3B1YiBtb2QgZmxhZ192YWx1ZV91cGRhdGU7CitwdWIgbW9kIG1hcHBlZF9maWxlOworCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0X3V0aWxzOworCit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnsKKyAgICBBY29uZmlnU3RvcmFnZUVycm9yLCBGbGFnSW5mb0hlYWRlciwgRmxhZ0luZm9MaXN0LCBGbGFnSW5mb05vZGUsIEZsYWdUYWJsZSwgRmxhZ1ZhbHVlVHlwZSwKKyAgICBQYWNrYWdlVGFibGUsIFN0b3JhZ2VGaWxlVHlwZSwgU3RvcmVkRmxhZ1R5cGUsIEZJTEVfVkVSU0lPTiwKK307CisKK3VzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBtZW1tYXAyOjpNbWFwTXV0OwordXNlIHN0ZDo6ZnM6OkZpbGU7Cit1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKworLy8vIEdldCByZWFkIHdyaXRlIG1hcHBlZCBzdG9yYWdlIGZpbGVzLgorLy8vCisvLy8gXGlucHV0IGZpbGVfcGF0aDogcGF0aCB0byB0aGUgc3RvcmFnZSBmaWxlCisvLy8KKy8vLyAjIFNhZmV0eQorLy8vCisvLy8gVGhlIG1lbW9yeSBtYXBwZWQgZmlsZSBtYXkgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgaWYgdGhlcmUgYXJlIHdyaXRlcyB0byB0aGlzCisvLy8gZmlsZSBub3QgdGhydSB0aGlzIG1lbW9yeSBtYXBwZWQgZmlsZSBvciB0aGVyZSBhcmUgY29uY3VycmVudCB3cml0ZXMgdG8gdGhpcworLy8vIG1lbW9yeSBtYXBwZWQgZmlsZS4gRW5zdXJlIGFsbCB3cml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgZmlsZSBhcmUgdGhydSB0aGlzIG1lbW9yeQorLy8vIG1hcHBlZCBmaWxlIGFuZCB0aGVyZSBhcmUgbm8gY29uY3VycmVudCB3cml0ZXMuCitwdWIgdW5zYWZlIGZuIG1hcF9tdXRhYmxlX3N0b3JhZ2VfZmlsZShmaWxlX3BhdGg6ICZzdHIpIC0+IFJlc3VsdDxNbWFwTXV0LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgY3JhdGU6Om1hcHBlZF9maWxlOjptYXBfZmlsZShmaWxlX3BhdGgpCit9CisKKy8vLyBTZXQgYm9vbGVhbiBmbGFnIHZhbHVlIHRocnUgbWFwcGVkIGZpbGUgYW5kIGZsdXNoIHRoZSBjaGFuZ2UgdG8gZmlsZQorLy8vCisvLy8gXGlucHV0IG1hcHBlZF9maWxlOiB0aGUgbWFwcGVkIGZsYWcgdmFsdWUgZmlsZQorLy8vIFxpbnB1dCBpbmRleDogZmxhZyBpbmRleAorLy8vIFxpbnB1dCB2YWx1ZTogdXBkYXRlZCBmbGFnIHZhbHVlCisvLy8gXHJldHVybiBhIHJlc3VsdCBvZiAoKQorLy8vCitwdWIgZm4gc2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICBmaWxlOiAmbXV0IE1tYXBNdXQsCisgICAgaW5kZXg6IHUzMiwKKyAgICB2YWx1ZTogYm9vbCwKKykgLT4gUmVzdWx0PCgpLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgY3JhdGU6OmZsYWdfdmFsdWVfdXBkYXRlOjp1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlKGZpbGUsIGluZGV4LCB2YWx1ZSk/OworICAgIGZpbGUuZmx1c2goKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6TWFwRmx1c2hGYWlsKGFueWhvdyEoImZhaWwgdG8gZmx1c2ggc3RvcmFnZSBmaWxlOiB7fSIsIGVycm1zZykpCisgICAgfSkKK30KKworLy8vIFNldCBpZiBmbGFnIGlzIGhhcyBzZXJ2ZXIgb3ZlcnJpZGUgdGhydSBtYXBwZWQgZmlsZSBhbmQgZmx1c2ggdGhlIGNoYW5nZSB0byBmaWxlCisvLy8KKy8vLyBcaW5wdXQgbWFwcGVkX2ZpbGU6IHRoZSBtYXBwZWQgZmxhZyBpbmZvIGZpbGUKKy8vLyBcaW5wdXQgaW5kZXg6IGZsYWcgaW5kZXgKKy8vLyBcaW5wdXQgdmFsdWU6IHVwZGF0ZWQgZmxhZyBoYXMgc2VydmVyIG92ZXJyaWRlIHZhbHVlCisvLy8gXHJldHVybiBhIHJlc3VsdCBvZiAoKQorLy8vCitwdWIgZm4gc2V0X2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgKKyAgICBmaWxlOiAmbXV0IE1tYXBNdXQsCisgICAgZmxhZ190eXBlOiBGbGFnVmFsdWVUeXBlLAorICAgIGluZGV4OiB1MzIsCisgICAgdmFsdWU6IGJvb2wsCispIC0+IFJlc3VsdDwoKSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGNyYXRlOjpmbGFnX2luZm9fdXBkYXRlOjp1cGRhdGVfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKGZpbGUsIGZsYWdfdHlwZSwgaW5kZXgsIHZhbHVlKT87CisgICAgZmlsZS5mbHVzaCgpLm1hcF9lcnIofGVycm1zZ3wgeworICAgICAgICBBY29uZmlnU3RvcmFnZUVycm9yOjpNYXBGbHVzaEZhaWwoYW55aG93ISgiZmFpbCB0byBmbHVzaCBzdG9yYWdlIGZpbGU6IHt9IiwgZXJybXNnKSkKKyAgICB9KQorfQorCisvLy8gU2V0IGlmIGZsYWcgaGFzIGxvY2FsIG92ZXJyaWRlIHRocnUgbWFwcGVkIGZpbGUgYW5kIGZsdXNoIHRoZSBjaGFuZ2UgdG8gZmlsZQorLy8vCisvLy8gXGlucHV0IG1hcHBlZF9maWxlOiB0aGUgbWFwcGVkIGZsYWcgaW5mbyBmaWxlCisvLy8gXGlucHV0IGluZGV4OiBmbGFnIGluZGV4CisvLy8gXGlucHV0IHZhbHVlOiB1cGRhdGVkIGZsYWcgaGFzIGxvY2FsIG92ZXJyaWRlIHZhbHVlCisvLy8gXHJldHVybiBhIHJlc3VsdCBvZiAoKQorLy8vCitwdWIgZm4gc2V0X2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKAorICAgIGZpbGU6ICZtdXQgTW1hcE11dCwKKyAgICBmbGFnX3R5cGU6IEZsYWdWYWx1ZVR5cGUsCisgICAgaW5kZXg6IHUzMiwKKyAgICB2YWx1ZTogYm9vbCwKKykgLT4gUmVzdWx0PCgpLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgY3JhdGU6OmZsYWdfaW5mb191cGRhdGU6OnVwZGF0ZV9mbGFnX2hhc19sb2NhbF9vdmVycmlkZShmaWxlLCBmbGFnX3R5cGUsIGluZGV4LCB2YWx1ZSk/OworICAgIGZpbGUuZmx1c2goKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6TWFwRmx1c2hGYWlsKGFueWhvdyEoImZhaWwgdG8gZmx1c2ggc3RvcmFnZSBmaWxlOiB7fSIsIGVycm1zZykpCisgICAgfSkKK30KKworLy8vIFJlYWQgaW4gc3RvcmFnZSBmaWxlIGFzIGJ5dGVzCitmbiByZWFkX2ZpbGVfdG9fYnl0ZXMoZmlsZV9wYXRoOiAmc3RyKSAtPiBSZXN1bHQ8VmVjPHU4PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6Om9wZW4oZmlsZV9wYXRoKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZVJlYWRGYWlsKGFueWhvdyEoIkZhaWxlZCB0byBvcGVuIGZpbGUge306IHt9IiwgZmlsZV9wYXRoLCBlcnJtc2cpKQorICAgIH0pPzsKKyAgICBsZXQgbXV0IGJ1ZmZlciA9IFZlYzo6bmV3KCk7CisgICAgZmlsZS5yZWFkX3RvX2VuZCgmbXV0IGJ1ZmZlcikubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVSZWFkRmFpbChhbnlob3chKAorICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGJ5dGVzIGZyb20gZmlsZSB7fToge30iLAorICAgICAgICAgICAgZmlsZV9wYXRoLAorICAgICAgICAgICAgZXJybXNnCisgICAgICAgICkpCisgICAgfSk/OworICAgIE9rKGJ1ZmZlcikKK30KKworLy8vIENyZWF0ZSBmbGFnIGluZm8gZmlsZSBnaXZlbiBwYWNrYWdlIG1hcCBmaWxlIGFuZCBmbGFnIG1hcCBmaWxlCisvLy8gXGlucHV0IHBhY2thZ2VfbWFwOiBwYWNrYWdlIG1hcCBmaWxlCisvLy8gXGlucHV0IGZsYWdfbWFwOiBmbGFnIG1hcCBmaWxlCisvLy8gXG91dHB1dCBmbGFnX2luZm9fb3V0OiBjcmVhdGVkIGZsYWcgaW5mbyBmaWxlCitwdWIgZm4gY3JlYXRlX2ZsYWdfaW5mbygKKyAgICBwYWNrYWdlX21hcDogJnN0ciwKKyAgICBmbGFnX21hcDogJnN0ciwKKyAgICBmbGFnX2luZm9fb3V0OiAmc3RyLAorKSAtPiBSZXN1bHQ8KCksIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgcGFja2FnZV90YWJsZSA9IFBhY2thZ2VUYWJsZTo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKHBhY2thZ2VfbWFwKT8pPzsKKyAgICBsZXQgZmxhZ190YWJsZSA9IEZsYWdUYWJsZTo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKGZsYWdfbWFwKT8pPzsKKworICAgIGlmIHBhY2thZ2VfdGFibGUuaGVhZGVyLmNvbnRhaW5lciAhPSBmbGFnX3RhYmxlLmhlYWRlci5jb250YWluZXIgeworICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVDcmVhdGlvbkZhaWwoYW55aG93ISgKKyAgICAgICAgICAgICJjb250YWluZXIgZm9yIHBhY2thZ2UgbWFwIHt9IGFuZCBmbGFnIG1hcCB7fSBkb2VzIG5vdCBtYXRjaCIsCisgICAgICAgICAgICBwYWNrYWdlX3RhYmxlLmhlYWRlci5jb250YWluZXIsCisgICAgICAgICAgICBmbGFnX3RhYmxlLmhlYWRlci5jb250YWluZXIsCisgICAgICAgICkpKTsKKyAgICB9CisKKyAgICBsZXQgbXV0IHBhY2thZ2Vfc3RhcnRfaW5kZXggPSB2ZWMhWzA7IHBhY2thZ2VfdGFibGUuaGVhZGVyLm51bV9wYWNrYWdlcyBhcyB1c2l6ZV07CisgICAgZm9yIG5vZGUgaW4gcGFja2FnZV90YWJsZS5ub2Rlcy5pdGVyKCkgeworICAgICAgICBwYWNrYWdlX3N0YXJ0X2luZGV4W25vZGUucGFja2FnZV9pZCBhcyB1c2l6ZV0gPSBub2RlLmJvb2xlYW5fc3RhcnRfaW5kZXg7CisgICAgfQorCisgICAgbGV0IG11dCBpc19mbGFnX3J3ID0gdmVjIVtmYWxzZTsgZmxhZ190YWJsZS5oZWFkZXIubnVtX2ZsYWdzIGFzIHVzaXplXTsKKyAgICBmb3Igbm9kZSBpbiBmbGFnX3RhYmxlLm5vZGVzLml0ZXIoKSB7CisgICAgICAgIGxldCBmbGFnX2luZGV4ID0gcGFja2FnZV9zdGFydF9pbmRleFtub2RlLnBhY2thZ2VfaWQgYXMgdXNpemVdICsgbm9kZS5mbGFnX2luZGV4IGFzIHUzMjsKKyAgICAgICAgaXNfZmxhZ19yd1tmbGFnX2luZGV4IGFzIHVzaXplXSA9IG5vZGUuZmxhZ190eXBlID09IFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuOworICAgIH0KKworICAgIGxldCBtdXQgbGlzdCA9IEZsYWdJbmZvTGlzdCB7CisgICAgICAgIGhlYWRlcjogRmxhZ0luZm9IZWFkZXIgeworICAgICAgICAgICAgdmVyc2lvbjogRklMRV9WRVJTSU9OLAorICAgICAgICAgICAgY29udGFpbmVyOiBmbGFnX3RhYmxlLmhlYWRlci5jb250YWluZXIsCisgICAgICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gYXMgdTgsCisgICAgICAgICAgICBmaWxlX3NpemU6IDAsCisgICAgICAgICAgICBudW1fZmxhZ3M6IGZsYWdfdGFibGUuaGVhZGVyLm51bV9mbGFncywKKyAgICAgICAgICAgIGJvb2xlYW5fZmxhZ19vZmZzZXQ6IDAsCisgICAgICAgIH0sCisgICAgICAgIG5vZGVzOiBpc19mbGFnX3J3Lml0ZXIoKS5tYXAofCZyd3wgRmxhZ0luZm9Ob2RlOjpjcmVhdGUocncpKS5jb2xsZWN0KCksCisgICAgfTsKKworICAgIGxpc3QuaGVhZGVyLmJvb2xlYW5fZmxhZ19vZmZzZXQgPSBsaXN0LmhlYWRlci5pbnRvX2J5dGVzKCkubGVuKCkgYXMgdTMyOworICAgIGxpc3QuaGVhZGVyLmZpbGVfc2l6ZSA9IGxpc3QuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKKworICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6OmNyZWF0ZShmbGFnX2luZm9fb3V0KS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZUNyZWF0aW9uRmFpbChhbnlob3chKAorICAgICAgICAgICAgImZhaWwgdG8gY3JlYXRlIGZpbGUge306IHt9IiwKKyAgICAgICAgICAgIGZsYWdfaW5mb19vdXQsCisgICAgICAgICAgICBlcnJtc2cKKyAgICAgICAgKSkKKyAgICB9KT87CisgICAgZmlsZS53cml0ZV9hbGwoJmxpc3QuaW50b19ieXRlcygpKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZUNyZWF0aW9uRmFpbChhbnlob3chKAorICAgICAgICAgICAgImZhaWwgdG8gd3JpdGUgdG8gZmlsZSB7fToge30iLAorICAgICAgICAgICAgZmxhZ19pbmZvX291dCwKKyAgICAgICAgICAgIGVycm1zZworICAgICAgICApKQorICAgIH0pPzsKKworICAgIE9rKCgpKQorfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KKy8vIENDIElOVEVSTE9QCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KKworLy8gRXhwb3J0ZWQgcnVzdCBkYXRhIHN0cnVjdHVyZSBhbmQgbWV0aG9kcywgYysrIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQKKyNbY3h4OjpicmlkZ2VdCittb2QgZmZpIHsKKyAgICAvLyBGbGFnIHZhbHVlIHVwZGF0ZSByZXR1cm4gZm9yIGNjIGludGVybG9wCisgICAgcHViIHN0cnVjdCBCb29sZWFuRmxhZ1ZhbHVlVXBkYXRlQ1hYIHsKKyAgICAgICAgcHViIHVwZGF0ZV9zdWNjZXNzOiBib29sLAorICAgICAgICBwdWIgb2Zmc2V0OiB1c2l6ZSwKKyAgICAgICAgcHViIGVycm9yX21lc3NhZ2U6IFN0cmluZywKKyAgICB9CisKKyAgICAvLyBGbGFnIGhhcyBzZXJ2ZXIgb3ZlcnJpZGUgdXBkYXRlIHJldHVybiBmb3IgY2MgaW50ZXJsb3AKKyAgICBwdWIgc3RydWN0IEZsYWdIYXNTZXJ2ZXJPdmVycmlkZVVwZGF0ZUNYWCB7CisgICAgICAgIHB1YiB1cGRhdGVfc3VjY2VzczogYm9vbCwKKyAgICAgICAgcHViIG9mZnNldDogdXNpemUsCisgICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCisgICAgfQorCisgICAgLy8gRmxhZyBoYXMgbG9jYWwgb3ZlcnJpZGUgdXBkYXRlIHJldHVybiBmb3IgY2MgaW50ZXJsb3AKKyAgICBwdWIgc3RydWN0IEZsYWdIYXNMb2NhbE92ZXJyaWRlVXBkYXRlQ1hYIHsKKyAgICAgICAgcHViIHVwZGF0ZV9zdWNjZXNzOiBib29sLAorICAgICAgICBwdWIgb2Zmc2V0OiB1c2l6ZSwKKyAgICAgICAgcHViIGVycm9yX21lc3NhZ2U6IFN0cmluZywKKyAgICB9CisKKyAgICAvLyBGbGFnIGluZm8gZmlsZSBjcmVhdGlvbiByZXR1cm4gZm9yIGNjIGludGVybG9wCisgICAgcHViIHN0cnVjdCBGbGFnSW5mb0NyZWF0aW9uQ1hYIHsKKyAgICAgICAgcHViIHN1Y2Nlc3M6IGJvb2wsCisgICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCisgICAgfQorCisgICAgLy8gUnVzdCBleHBvcnQgdG8gYysrCisgICAgZXh0ZXJuICJSdXN0IiB7CisgICAgICAgIHB1YiBmbiB1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlX2N4eCgKKyAgICAgICAgICAgIGZpbGU6ICZtdXQgW3U4XSwKKyAgICAgICAgICAgIG9mZnNldDogdTMyLAorICAgICAgICAgICAgdmFsdWU6IGJvb2wsCisgICAgICAgICkgLT4gQm9vbGVhbkZsYWdWYWx1ZVVwZGF0ZUNYWDsKKworICAgICAgICBwdWIgZm4gdXBkYXRlX2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZV9jeHgoCisgICAgICAgICAgICBmaWxlOiAmbXV0IFt1OF0sCisgICAgICAgICAgICBmbGFnX3R5cGU6IHUxNiwKKyAgICAgICAgICAgIG9mZnNldDogdTMyLAorICAgICAgICAgICAgdmFsdWU6IGJvb2wsCisgICAgICAgICkgLT4gRmxhZ0hhc1NlcnZlck92ZXJyaWRlVXBkYXRlQ1hYOworCisgICAgICAgIHB1YiBmbiB1cGRhdGVfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGVfY3h4KAorICAgICAgICAgICAgZmlsZTogJm11dCBbdThdLAorICAgICAgICAgICAgZmxhZ190eXBlOiB1MTYsCisgICAgICAgICAgICBvZmZzZXQ6IHUzMiwKKyAgICAgICAgICAgIHZhbHVlOiBib29sLAorICAgICAgICApIC0+IEZsYWdIYXNMb2NhbE92ZXJyaWRlVXBkYXRlQ1hYOworCisgICAgICAgIHB1YiBmbiBjcmVhdGVfZmxhZ19pbmZvX2N4eCgKKyAgICAgICAgICAgIHBhY2thZ2VfbWFwOiAmc3RyLAorICAgICAgICAgICAgZmxhZ19tYXA6ICZzdHIsCisgICAgICAgICAgICBmbGFnX2luZm9fb3V0OiAmc3RyLAorICAgICAgICApIC0+IEZsYWdJbmZvQ3JlYXRpb25DWFg7CisgICAgfQorfQorCitwdWIoY3JhdGUpIGZuIHVwZGF0ZV9ib29sZWFuX2ZsYWdfdmFsdWVfY3h4KAorICAgIGZpbGU6ICZtdXQgW3U4XSwKKyAgICBvZmZzZXQ6IHUzMiwKKyAgICB2YWx1ZTogYm9vbCwKKykgLT4gZmZpOjpCb29sZWFuRmxhZ1ZhbHVlVXBkYXRlQ1hYIHsKKyAgICBtYXRjaCBjcmF0ZTo6ZmxhZ192YWx1ZV91cGRhdGU6OnVwZGF0ZV9ib29sZWFuX2ZsYWdfdmFsdWUoZmlsZSwgb2Zmc2V0LCB2YWx1ZSkgeworICAgICAgICBPayhoZWFkKSA9PiBmZmk6OkJvb2xlYW5GbGFnVmFsdWVVcGRhdGVDWFggeworICAgICAgICAgICAgdXBkYXRlX3N1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICBvZmZzZXQ6IGhlYWQsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBTdHJpbmc6OmZyb20oIiIpLAorICAgICAgICB9LAorICAgICAgICBFcnIoZXJybXNnKSA9PiBmZmk6OkJvb2xlYW5GbGFnVmFsdWVVcGRhdGVDWFggeworICAgICAgICAgICAgdXBkYXRlX3N1Y2Nlc3M6IGZhbHNlLAorICAgICAgICAgICAgb2Zmc2V0OiB1c2l6ZTo6TUFYLAorICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogZm9ybWF0ISgiezo/fSIsIGVycm1zZyksCisgICAgICAgIH0sCisgICAgfQorfQorCitwdWIoY3JhdGUpIGZuIHVwZGF0ZV9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGVfY3h4KAorICAgIGZpbGU6ICZtdXQgW3U4XSwKKyAgICBmbGFnX3R5cGU6IHUxNiwKKyAgICBvZmZzZXQ6IHUzMiwKKyAgICB2YWx1ZTogYm9vbCwKKykgLT4gZmZpOjpGbGFnSGFzU2VydmVyT3ZlcnJpZGVVcGRhdGVDWFggeworICAgIG1hdGNoIEZsYWdWYWx1ZVR5cGU6OnRyeV9mcm9tKGZsYWdfdHlwZSkgeworICAgICAgICBPayh2YWx1ZV90eXBlKSA9PiB7CisgICAgICAgICAgICBtYXRjaCBjcmF0ZTo6ZmxhZ19pbmZvX3VwZGF0ZTo6dXBkYXRlX2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgKKyAgICAgICAgICAgICAgICBmaWxlLCB2YWx1ZV90eXBlLCBvZmZzZXQsIHZhbHVlLAorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgT2soaGVhZCkgPT4gZmZpOjpGbGFnSGFzU2VydmVyT3ZlcnJpZGVVcGRhdGVDWFggeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVfc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBoZWFkLAorICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBTdHJpbmc6OmZyb20oIiIpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgRXJyKGVycm1zZykgPT4gZmZpOjpGbGFnSGFzU2VydmVyT3ZlcnJpZGVVcGRhdGVDWFggeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVfc3VjY2VzczogZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdXNpemU6Ok1BWCwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogZm9ybWF0ISgiezo/fSIsIGVycm1zZyksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFcnIoZXJybXNnKSA9PiBmZmk6OkZsYWdIYXNTZXJ2ZXJPdmVycmlkZVVwZGF0ZUNYWCB7CisgICAgICAgICAgICB1cGRhdGVfc3VjY2VzczogZmFsc2UsCisgICAgICAgICAgICBvZmZzZXQ6IHVzaXplOjpNQVgsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBmb3JtYXQhKCJ7Oj99IiwgZXJybXNnKSwKKyAgICAgICAgfSwKKyAgICB9Cit9CisKK3B1YihjcmF0ZSkgZm4gdXBkYXRlX2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlX2N4eCgKKyAgICBmaWxlOiAmbXV0IFt1OF0sCisgICAgZmxhZ190eXBlOiB1MTYsCisgICAgb2Zmc2V0OiB1MzIsCisgICAgdmFsdWU6IGJvb2wsCispIC0+IGZmaTo6RmxhZ0hhc0xvY2FsT3ZlcnJpZGVVcGRhdGVDWFggeworICAgIG1hdGNoIEZsYWdWYWx1ZVR5cGU6OnRyeV9mcm9tKGZsYWdfdHlwZSkgeworICAgICAgICBPayh2YWx1ZV90eXBlKSA9PiB7CisgICAgICAgICAgICBtYXRjaCBjcmF0ZTo6ZmxhZ19pbmZvX3VwZGF0ZTo6dXBkYXRlX2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKAorICAgICAgICAgICAgICAgIGZpbGUsIHZhbHVlX3R5cGUsIG9mZnNldCwgdmFsdWUsCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBPayhoZWFkKSA9PiBmZmk6OkZsYWdIYXNMb2NhbE92ZXJyaWRlVXBkYXRlQ1hYIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3N1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldDogaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEVycihlcnJtc2cpID0+IGZmaTo6RmxhZ0hhc0xvY2FsT3ZlcnJpZGVVcGRhdGVDWFggeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVfc3VjY2VzczogZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdXNpemU6Ok1BWCwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogZm9ybWF0ISgiezo/fSIsIGVycm1zZyksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFcnIoZXJybXNnKSA9PiBmZmk6OkZsYWdIYXNMb2NhbE92ZXJyaWRlVXBkYXRlQ1hYIHsKKyAgICAgICAgICAgIHVwZGF0ZV9zdWNjZXNzOiBmYWxzZSwKKyAgICAgICAgICAgIG9mZnNldDogdXNpemU6Ok1BWCwKKyAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAorICAgICAgICB9LAorICAgIH0KK30KKworLy8vIENyZWF0ZSBmbGFnIGluZm8gZmlsZSBjYyBpbnRlcmxvcAorcHViKGNyYXRlKSBmbiBjcmVhdGVfZmxhZ19pbmZvX2N4eCgKKyAgICBwYWNrYWdlX21hcDogJnN0ciwKKyAgICBmbGFnX21hcDogJnN0ciwKKyAgICBmbGFnX2luZm9fb3V0OiAmc3RyLAorKSAtPiBmZmk6OkZsYWdJbmZvQ3JlYXRpb25DWFggeworICAgIG1hdGNoIGNyZWF0ZV9mbGFnX2luZm8ocGFja2FnZV9tYXAsIGZsYWdfbWFwLCBmbGFnX2luZm9fb3V0KSB7CisgICAgICAgIE9rKCgpKSA9PiBmZmk6OkZsYWdJbmZvQ3JlYXRpb25DWFggeyBzdWNjZXNzOiB0cnVlLCBlcnJvcl9tZXNzYWdlOiBTdHJpbmc6OmZyb20oIiIpIH0sCisgICAgICAgIEVycihlcnJtc2cpID0+IHsKKyAgICAgICAgICAgIGZmaTo6RmxhZ0luZm9DcmVhdGlvbkNYWCB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcl9tZXNzYWdlOiBmb3JtYXQhKCJ7Oj99IiwgZXJybXNnKSB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjp0ZXN0X3V0aWxzOjpjb3B5X3RvX3RlbXBfZmlsZTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnRlc3RfdXRpbHM6OnsKKyAgICAgICAgY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QsIGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUsIGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUsCisgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSwKKyAgICB9OworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6RmxhZ0luZm9CaXQ7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6ZmxhZ19pbmZvX3F1ZXJ5OjpmaW5kX2ZsYWdfYXR0cmlidXRlOworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OmZsYWdfdmFsdWVfcXVlcnk6OmZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlOworICAgIHVzZSBzdGQ6OmZzOjpGaWxlOworICAgIHVzZSBzdGQ6OmlvOjpSZWFkOworICAgIHVzZSB0ZW1wZmlsZTo6TmFtZWRUZW1wRmlsZTsKKworICAgIGZuIGdldF9ib29sZWFuX2ZsYWdfdmFsdWVfYXRfb2Zmc2V0KGZpbGU6ICZzdHIsIG9mZnNldDogdTMyKSAtPiBib29sIHsKKyAgICAgICAgbGV0IG11dCBmID0gRmlsZTo6b3BlbigmZmlsZSkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnl0ZXMgPSBWZWM6Om5ldygpOworICAgICAgICBmLnJlYWRfdG9fZW5kKCZtdXQgYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZSgmYnl0ZXMsIG9mZnNldCkudW53cmFwKCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9zZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCkgeworICAgICAgICBsZXQgZmxhZ192YWx1ZV9maWxlID0gY29weV90b190ZW1wX2ZpbGUoIi4vdGVzdHMvZmxhZy52YWwiLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX3BhdGggPSBmbGFnX3ZhbHVlX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBndWFyYW50ZWVkIGFzIG9ubHkgdGhpcyBzaW5nbGUgdGhyZWFkZWQgdGVzdCBwcm9jZXNzIHdpbGwKKyAgICAgICAgLy8gd3JpdGUgdG8gdGhpcyBmaWxlCisgICAgICAgIHVuc2FmZSB7CisgICAgICAgICAgICBsZXQgbXV0IGZpbGUgPSBtYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoJmZsYWdfdmFsdWVfcGF0aCkudW53cmFwKCk7CisgICAgICAgICAgICBmb3IgaSBpbiAwLi44IHsKKyAgICAgICAgICAgICAgICBzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgZmlsZSwgaSwgdHJ1ZSkudW53cmFwKCk7CisgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9hdF9vZmZzZXQoJmZsYWdfdmFsdWVfcGF0aCwgaSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0X2VxISh2YWx1ZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgZmlsZSwgaSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldF9ib29sZWFuX2ZsYWdfdmFsdWVfYXRfb2Zmc2V0KCZmbGFnX3ZhbHVlX3BhdGgsIGkpOworICAgICAgICAgICAgICAgIGFzc2VydF9lcSEodmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGdldF9mbGFnX2F0dHJpYnV0ZV9hdF9vZmZzZXQoZmlsZTogJnN0ciwgdmFsdWVfdHlwZTogRmxhZ1ZhbHVlVHlwZSwgb2Zmc2V0OiB1MzIpIC0+IHU4IHsKKyAgICAgICAgbGV0IG11dCBmID0gRmlsZTo6b3BlbigmZmlsZSkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnl0ZXMgPSBWZWM6Om5ldygpOworICAgICAgICBmLnJlYWRfdG9fZW5kKCZtdXQgYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBmaW5kX2ZsYWdfYXR0cmlidXRlKCZieXRlcywgdmFsdWVfdHlwZSwgb2Zmc2V0KS51bndyYXAoKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3NldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoKSB7CisgICAgICAgIGxldCBmbGFnX2luZm9fZmlsZSA9IGNvcHlfdG9fdGVtcF9maWxlKCIuL3Rlc3RzL2ZsYWcuaW5mbyIsIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19wYXRoID0gZmxhZ19pbmZvX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBndWFyYW50ZWVkIGFzIG9ubHkgdGhpcyBzaW5nbGUgdGhyZWFkZWQgdGVzdCBwcm9jZXNzIHdpbGwKKyAgICAgICAgLy8gd3JpdGUgdG8gdGhpcyBmaWxlCisgICAgICAgIHVuc2FmZSB7CisgICAgICAgICAgICBsZXQgbXV0IGZpbGUgPSBtYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoJmZsYWdfaW5mb19wYXRoKS51bndyYXAoKTsKKyAgICAgICAgICAgIGZvciBpIGluIDAuLjggeworICAgICAgICAgICAgICAgIHNldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoJm11dCBmaWxlLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCB0cnVlKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfYXR0cmlidXRlX2F0X29mZnNldCgmZmxhZ19pbmZvX3BhdGgsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGkpOworICAgICAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBzZXRfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKCZtdXQgZmlsZSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQorICAgICAgICAgICAgICAgICAgICBnZXRfZmxhZ19hdHRyaWJ1dGVfYXRfb2Zmc2V0KCZmbGFnX2luZm9fcGF0aCwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0ISgoYXR0cmlidXRlICYgKEZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSBhcyB1OCkpID09IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfc2V0X2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPSBjb3B5X3RvX3RlbXBfZmlsZSgiLi90ZXN0cy9mbGFnLmluZm8iLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2luZm9fcGF0aCA9IGZsYWdfaW5mb19maWxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisKKyAgICAgICAgLy8gU0FGRVRZOgorICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZ3VhcmFudGVlZCBhcyBvbmx5IHRoaXMgc2luZ2xlIHRocmVhZGVkIHRlc3QgcHJvY2VzcyB3aWxsCisgICAgICAgIC8vIHdyaXRlIHRvIHRoaXMgZmlsZQorICAgICAgICB1bnNhZmUgeworICAgICAgICAgICAgbGV0IG11dCBmaWxlID0gbWFwX211dGFibGVfc3RvcmFnZV9maWxlKCZmbGFnX2luZm9fcGF0aCkudW53cmFwKCk7CisgICAgICAgICAgICBmb3IgaSBpbiAwLi44IHsKKyAgICAgICAgICAgICAgICBzZXRfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoJm11dCBmaWxlLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCB0cnVlKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfYXR0cmlidXRlX2F0X29mZnNldCgmZmxhZ19pbmZvX3BhdGgsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGkpOworICAgICAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkpICE9IDApOworICAgICAgICAgICAgICAgIHNldF9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSgmbXV0IGZpbGUsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfYXR0cmlidXRlX2F0X29mZnNldCgmZmxhZ19pbmZvX3BhdGgsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGkpOworICAgICAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkpID09IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gY3JlYXRlX2VtcHR5X3RlbXBfZmlsZSgpIC0+IFJlc3VsdDxOYW1lZFRlbXBGaWxlLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIGxldCBmaWxlID0gTmFtZWRUZW1wRmlsZTo6bmV3KCkubWFwX2Vycih8X3wgeworICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZUNyZWF0aW9uRmFpbChhbnlob3chKCJGYWlsZWQgdG8gY3JlYXRlIHRlbXAgZmlsZSIpKQorICAgICAgICB9KT87CisgICAgICAgIE9rKGZpbGUpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSBmbGFnIGluZm8gY3JlYXRpb24KKyAgICBmbiB0ZXN0X2NyZWF0ZV9mbGFnX2luZm8oKSB7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0KKyAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3RhYmxlID0gd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCkuaW50b19ieXRlcygpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mbyA9IGNyZWF0ZV9lbXB0eV90ZW1wX2ZpbGUoKS51bndyYXAoKTsKKworICAgICAgICBsZXQgcGFja2FnZV90YWJsZV9wYXRoID0gcGFja2FnZV90YWJsZS5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOworICAgICAgICBsZXQgZmxhZ190YWJsZV9wYXRoID0gZmxhZ190YWJsZS5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOworICAgICAgICBsZXQgZmxhZ19pbmZvX3BhdGggPSBmbGFnX2luZm8ucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICBhc3NlcnQhKGNyZWF0ZV9mbGFnX2luZm8oJnBhY2thZ2VfdGFibGVfcGF0aCwgJmZsYWdfdGFibGVfcGF0aCwgJmZsYWdfaW5mb19wYXRoKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZmxhZ19pbmZvID0KKyAgICAgICAgICAgIEZsYWdJbmZvTGlzdDo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKCZmbGFnX2luZm9fcGF0aCkudW53cmFwKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZmxhZ19pbmZvID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2luZm8sIGV4cGVjdGVkX2ZsYWdfaW5mbyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9tYXBwZWRfZmlsZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbWFwcGVkX2ZpbGUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxZDZiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbWFwcGVkX2ZpbGUucnMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgYW55aG93Ojphbnlob3c7Cit1c2UgbWVtbWFwMjo6TW1hcE11dDsKK3VzZSBzdGQ6OmZzOjp7c2VsZiwgT3Blbk9wdGlvbnN9OworCit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OkFjb25maWdTdG9yYWdlRXJyb3I6OntzZWxmLCBGaWxlUmVhZEZhaWwsIE1hcEZpbGVGYWlsfTsKKworLy8vIEdldCB0aGUgbXV0YWJsZSBtZW1vcnkgbWFwcGluZyBvZiBhIHN0b3JhZ2UgZmlsZQorLy8vCisvLy8gIyBTYWZldHkKKy8vLworLy8vIFRoZSBtZW1vcnkgbWFwcGVkIGZpbGUgbWF5IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGlmIHRoZXJlIGFyZSB3cml0ZXMgdG8gdGhpcworLy8vIGZpbGUgbm90IHRocnUgdGhpcyBtZW1vcnkgbWFwcGVkIGZpbGUgb3IgdGhlcmUgYXJlIGNvbmN1cnJlbnQgd3JpdGVzIHRvIHRoaXMKKy8vLyBtZW1vcnkgbWFwcGVkIGZpbGUuIEVuc3VyZSBhbGwgd3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIGZpbGUgYXJlIHRocnUgdGhpcyBtZW1vcnkKKy8vLyBtYXBwZWQgZmlsZSBhbmQgdGhlcmUgYXJlIG5vIGNvbmN1cnJlbnQgd3JpdGVzLgorcHViKGNyYXRlKSB1bnNhZmUgZm4gbWFwX2ZpbGUoZmlsZV9wYXRoOiAmc3RyKSAtPiBSZXN1bHQ8TW1hcE11dCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIC8vIG1ha2Ugc3VyZSBmaWxlIGhhcyByZWFkIHdyaXRlIHBlcm1pc3Npb24KKyAgICBsZXQgcGVybXMgPSBmczo6bWV0YWRhdGEoZmlsZV9wYXRoKS51bndyYXAoKS5wZXJtaXNzaW9ucygpOworICAgIGlmIHBlcm1zLnJlYWRvbmx5KCkgeworICAgICAgICByZXR1cm4gRXJyKE1hcEZpbGVGYWlsKGFueWhvdyEoImZhaWwgdG8gbWFwIG5vbiByZWFkIHdyaXRlIHN0b3JhZ2UgZmlsZSB7fSIsIGZpbGVfcGF0aCkpKTsKKyAgICB9CisKKyAgICBsZXQgZmlsZSA9CisgICAgICAgIE9wZW5PcHRpb25zOjpuZXcoKS5yZWFkKHRydWUpLndyaXRlKHRydWUpLm9wZW4oZmlsZV9wYXRoKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgICAgIEZpbGVSZWFkRmFpbChhbnlob3chKCJGYWlsZWQgdG8gb3BlbiBmaWxlIHt9OiB7fSIsIGZpbGVfcGF0aCwgZXJybXNnKSkKKyAgICAgICAgfSk/OworCisgICAgdW5zYWZlIHsKKyAgICAgICAgbGV0IG1hcHBlZF9maWxlID0gTW1hcE11dDo6bWFwX211dCgmZmlsZSkubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgICAgICBNYXBGaWxlRmFpbChhbnlob3chKCJmYWlsIHRvIG1hcCBzdG9yYWdlIGZpbGUge306IHt9IiwgZmlsZV9wYXRoLCBlcnJtc2cpKQorICAgICAgICB9KT87CisgICAgICAgIE9rKG1hcHBlZF9maWxlKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgY3JhdGU6OnRlc3RfdXRpbHM6OmNvcHlfdG9fdGVtcF9maWxlOworICAgIHVzZSBzdGQ6OmlvOjpSZWFkOworCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfbWFwcGVkX2ZpbGVfY29udGVudHMoKSB7CisgICAgICAgIGxldCBtdXQgcndfdmFsX2ZpbGUgPSBjb3B5X3RvX3RlbXBfZmlsZSgiLi90ZXN0cy9mbGFnLnZhbCIsIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCByd19pbmZvX2ZpbGUgPSBjb3B5X3RvX3RlbXBfZmlsZSgiLi90ZXN0cy9mbGFnLmluZm8iLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3ZhbCA9IHJ3X3ZhbF9maWxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisgICAgICAgIGxldCBmbGFnX2luZm8gPSByd19pbmZvX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICBsZXQgbXV0IGNvbnRlbnQgPSBWZWM6Om5ldygpOworICAgICAgICByd192YWxfZmlsZS5yZWFkX3RvX2VuZCgmbXV0IGNvbnRlbnQpLnVud3JhcCgpOworCisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGd1YXJhbnRlZWQgaGVyZSBhcyBubyB3cml0ZXMgaGFwcGVucyB0byB0aGlzIHRlbXAgZmlsZQorICAgICAgICB1bnNhZmUgeworICAgICAgICAgICAgbGV0IG1tYXBlZF9maWxlID0gbWFwX2ZpbGUoJmZsYWdfdmFsKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobW1hcGVkX2ZpbGVbLi5dLCBjb250ZW50Wy4uXSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IGNvbnRlbnQgPSBWZWM6Om5ldygpOworICAgICAgICByd19pbmZvX2ZpbGUucmVhZF90b19lbmQoJm11dCBjb250ZW50KS51bndyYXAoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBndWFyYW50ZWVkIGhlcmUgYXMgbm8gd3JpdGVzIGhhcHBlbnMgdG8gdGhpcyB0ZW1wIGZpbGUKKyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIGxldCBtbWFwZWRfZmlsZSA9IG1hcF9maWxlKCZmbGFnX2luZm8pLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShtbWFwZWRfZmlsZVsuLl0sIGNvbnRlbnRbLi5dKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X21hcHBlZF9yZWFkX29ubHlfZmlsZSgpIHsKKyAgICAgICAgbGV0IHJvX3ZhbF9maWxlID0gY29weV90b190ZW1wX2ZpbGUoIi4vdGVzdHMvZmxhZy52YWwiLCB0cnVlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsID0gcm9fdmFsX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBndWFyYW50ZWVkIGhlcmUgYXMgbm8gd3JpdGVzIGhhcHBlbnMgdG8gdGhpcyB0ZW1wIGZpbGUKKyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIGxldCBlcnJvciA9IG1hcF9maWxlKCZmbGFnX3ZhbCkudW53cmFwX2VycigpOworICAgICAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgICAgIGZvcm1hdCEoIk1hcEZpbGVGYWlsKGZhaWwgdG8gbWFwIG5vbiByZWFkIHdyaXRlIHN0b3JhZ2UgZmlsZSB7fSkiLCBmbGFnX3ZhbCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL3Rlc3RfdXRpbHMucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL3Rlc3RfdXRpbHMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlMmUyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvdGVzdF91dGlscy5ycwpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNlIGFueWhvdzo6UmVzdWx0OwordXNlIHN0ZDo6ZnM7Cit1c2UgdGVtcGZpbGU6Ok5hbWVkVGVtcEZpbGU7CisKKy8vLyBDcmVhdGUgdGVtcCBmaWxlIGNvcHkKK3B1YihjcmF0ZSkgZm4gY29weV90b190ZW1wX2ZpbGUoc291cmNlX2ZpbGU6ICZzdHIsIHJlYWRfb25seTogYm9vbCkgLT4gUmVzdWx0PE5hbWVkVGVtcEZpbGU+IHsKKyAgICBsZXQgZmlsZSA9IE5hbWVkVGVtcEZpbGU6Om5ldygpPzsKKyAgICBmczo6Y29weShzb3VyY2VfZmlsZSwgZmlsZS5wYXRoKCkpPzsKKyAgICBpZiByZWFkX29ubHkgeworICAgICAgICBsZXQgZmlsZV9uYW1lID0gZmlsZS5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOworICAgICAgICBsZXQgbXV0IHBlcm1zID0gZnM6Om1ldGFkYXRhKGZpbGVfbmFtZSkudW53cmFwKCkucGVybWlzc2lvbnMoKTsKKyAgICAgICAgcGVybXMuc2V0X3JlYWRvbmx5KHRydWUpOworICAgICAgICBmczo6c2V0X3Blcm1pc3Npb25zKGZpbGUucGF0aCgpLCBwZXJtcy5jbG9uZSgpKS51bndyYXAoKTsKKyAgICB9CisgICAgT2soZmlsZSkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwOGRhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKK3J1c3RfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkudGVzdC5ydXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzdG9yYWdlX3dyaXRlX2FwaV90ZXN0LnJzIiwKKyAgICBdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhbnlob3ciLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkiLAorICAgICAgICAibGlicHJvdG9idWYiLAorICAgICAgICAibGlidGVtcGZpbGUiLAorICAgIF0sCisgICAgZGF0YTogWworICAgICAgICAiZmxhZy52YWwiLAorICAgICAgICAiZmxhZy5pbmZvIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkudGVzdC5jcHAiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInN0b3JhZ2Vfd3JpdGVfYXBpX3Rlc3QuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJnbW9jayIsCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY2MiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaV9jYyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBkYXRhOiBbCisgICAgICAgICJmbGFnLnZhbCIsCisgICAgICAgICJmbGFnLmluZm8iLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImRldmljZS10ZXN0cyIsCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKKyAgICBdLAorICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCisgICAgICAgICJjeHgtYnJpZGdlLWhlYWRlciIsCisgICAgICAgICJsaWJjeHhfYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2JyaWRnZV9oZWFkZXIiLAorICAgIF0sCisgICAgZ2VuZXJhdGVkX3NvdXJjZXM6IFsibGliY3h4X2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9icmlkZ2VfY29kZSJdLAorICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jeHhfYnJpZGdlIl0sCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvZmxhZy5pbmZvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL2ZsYWcuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjIzZWRmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL2ZsYWcuaW5mbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvZmxhZy52YWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvZmxhZy52YWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMDNkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9mbGFnLnZhbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvc3RvcmFnZV93cml0ZV9hcGlfdGVzdC5jcHAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvc3RvcmFnZV93cml0ZV9hcGlfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzZjVhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9zdG9yYWdlX3dyaXRlX2FwaV90ZXN0LmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNzdGRpbz4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5ocHAiCisjaW5jbHVkZSAiYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuaHBwIgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CisKKyNpbmNsdWRlICJydXN0L2N4eC5oIgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9saWIucnMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK25hbWVzcGFjZSBhcGkgPSBhY29uZmlnX3N0b3JhZ2U7CituYW1lc3BhY2UgcHJpdmF0ZV9hcGkgPSBhY29uZmlnX3N0b3JhZ2U6OnByaXZhdGVfaW50ZXJuYWxfYXBpOworCitjbGFzcyBBY29uZmlnU3RvcmFnZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFJlc3VsdDxzdGQ6OnN0cmluZz4gY29weV90b19yd190ZW1wX2ZpbGUoc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZV9maWxlKSB7CisgICAgYXV0byB0ZW1wX2ZpbGUgPSBzdGQ6OnN0cmluZyhzdGQ6OnRtcG5hbShudWxscHRyKSk7CisgICAgYXV0byBjb250ZW50ID0gc3RkOjpzdHJpbmcoKTsKKyAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcoc291cmNlX2ZpbGUsICZjb250ZW50KSkgeworICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZhaWxlZCB0byByZWFkIGZpbGU6ICIgPDwgc291cmNlX2ZpbGU7CisgICAgfQorICAgIGlmICghV3JpdGVTdHJpbmdUb0ZpbGUoY29udGVudCwgdGVtcF9maWxlKSkgeworICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZhaWxlZCB0byBjb3B5IGZpbGU6ICIgPDwgc291cmNlX2ZpbGU7CisgICAgfQorICAgIGlmIChjaG1vZCh0ZW1wX2ZpbGUuY19zdHIoKSwKKyAgICAgICAgICAgICAgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RIIHwgU19JV1VTUiB8IFNfSVdHUlAgfCBTX0lXT1RIKSA9PSAtMSkgeworICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZhaWxlZCB0byBjaG1vZCI7CisgICAgfQorICAgIHJldHVybiB0ZW1wX2ZpbGU7CisgIH0KKworICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIGF1dG8gY29uc3QgdGVzdF9kaXIgPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7CisgICAgZmxhZ192YWwgPSAqY29weV90b19yd190ZW1wX2ZpbGUodGVzdF9kaXIgKyAiL2ZsYWcudmFsIik7CisgICAgZmxhZ19pbmZvID0gKmNvcHlfdG9fcndfdGVtcF9maWxlKHRlc3RfZGlyICsgIi9mbGFnLmluZm8iKTsKKyAgfQorCisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgc3RkOjpyZW1vdmUoZmxhZ192YWwuY19zdHIoKSk7CisgICAgc3RkOjpyZW1vdmUoZmxhZ19pbmZvLmNfc3RyKCkpOworICB9CisKKyAgc3RkOjpzdHJpbmcgZmxhZ192YWw7CisgIHN0ZDo6c3RyaW5nIGZsYWdfaW5mbzsKK307CisKKy8vLyBOZWdhdGl2ZSB0ZXN0IHRvIGxvY2sgZG93biB0aGUgZXJyb3Igd2hlbiBtYXBwaW5nIGEgbm9uIHdyaXRlYWJsZSBzdG9yYWdlIGZpbGUKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3Rfbm9uX3dyaXRhYmxlX3N0b3JhZ2VfZmlsZV9tYXBwaW5nKSB7CisgIEFTU0VSVF9UUlVFKGNobW9kKGZsYWdfdmFsLmNfc3RyKCksIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCkgIT0gLTEpOworICBhdXRvIG1hcHBlZF9maWxlX3Jlc3VsdCA9IGFwaTo6bWFwX211dGFibGVfc3RvcmFnZV9maWxlKGZsYWdfdmFsKTsKKyAgQVNTRVJUX0ZBTFNFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBpdCA9IG1hcHBlZF9maWxlX3Jlc3VsdC5lcnJvcigpLm1lc3NhZ2UoKS5maW5kKCJjYW5ub3QgbWFwIG5vbndyaXRlYWJsZSBmaWxlIik7CisgIEFTU0VSVF9UUlVFKGl0ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSA8PCBtYXBwZWRfZmlsZV9yZXN1bHQuZXJyb3IoKS5tZXNzYWdlKCk7Cit9CisKKy8vLyBUZXN0IHRvIGxvY2sgZG93biBzdG9yYWdlIGZsYWcgdmFsdWUgdXBkYXRlIGFwaQorVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9ib29sZWFuX2ZsYWdfdmFsdWVfdXBkYXRlKSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gYXBpOjptYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoZmxhZ192YWwpOworICBBU1NFUlRfVFJVRShtYXBwZWRfZmlsZV9yZXN1bHQub2soKSk7CisgIGF1dG8gbWFwcGVkX2ZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8YXBpOjpNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGU+KCptYXBwZWRfZmlsZV9yZXN1bHQpOworCisgIGZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IDg7ICsrb2Zmc2V0KSB7CisgICAgYXV0byB1cGRhdGVfcmVzdWx0ID0gYXBpOjpzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCptYXBwZWRfZmlsZSwgb2Zmc2V0LCB0cnVlKTsKKyAgICBBU1NFUlRfVFJVRSh1cGRhdGVfcmVzdWx0Lm9rKCkpOworICAgIGF1dG8gdmFsdWUgPSBhcGk6OmdldF9ib29sZWFuX2ZsYWdfdmFsdWUoKm1hcHBlZF9maWxlLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKHZhbHVlLm9rKCkpOworICAgIEFTU0VSVF9UUlVFKCp2YWx1ZSk7CisgIH0KKworICAvLyBsb2FkIHRoZSBmaWxlIG9uIGRpc2sgYW5kIGNoZWNrIGhhcyBiZWVuIHVwZGF0ZWQKKyAgc3RkOjppZnN0cmVhbSBmaWxlKGZsYWdfdmFsLCBzdGQ6Omlvczo6YmluYXJ5IHwgc3RkOjppb3M6OmF0ZSk7CisgIHN0ZDo6c3RyZWFtc2l6ZSBzaXplID0gZmlsZS50ZWxsZygpOworICBmaWxlLnNlZWtnKDAsIHN0ZDo6aW9zOjpiZWcpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihzaXplKTsKKyAgZmlsZS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihidWZmZXIuZGF0YSgpKSwgc2l6ZSk7CisKKyAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4oCisgICAgICBidWZmZXIuZGF0YSgpLCBtYXBwZWRfZmlsZS0+ZmlsZV9zaXplKTsKKworICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCA4OyArK29mZnNldCkgeworICAgIGF1dG8gdmFsdWVfY3h4ID0gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9jeHgoY29udGVudCwgb2Zmc2V0KTsKKyAgICBBU1NFUlRfVFJVRSh2YWx1ZV9jeHgucXVlcnlfc3VjY2Vzcyk7CisgICAgQVNTRVJUX1RSVUUodmFsdWVfY3h4LmZsYWdfdmFsdWUpOworICB9Cit9CisKKy8vLyBOZWdhdGl2ZSB0ZXN0IHRvIGxvY2sgZG93biB0aGUgZXJyb3Igd2hlbiBxdWVyeWluZyBmbGFnIHZhbHVlIG91dCBvZiByYW5nZQorVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9pbnZhbGlkX2Jvb2xlYW5fZmxhZ192YWx1ZV91cGRhdGUpIHsKKyAgYXV0byBtYXBwZWRfZmlsZV9yZXN1bHQgPSBhcGk6Om1hcF9tdXRhYmxlX3N0b3JhZ2VfZmlsZShmbGFnX3ZhbCk7CisgIEFTU0VSVF9UUlVFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBtYXBwZWRfZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxhcGk6Ok11dGFibGVNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisgIGF1dG8gdXBkYXRlX3Jlc3VsdCA9IGFwaTo6c2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgqbWFwcGVkX2ZpbGUsIDgsIHRydWUpOworICBBU1NFUlRfRkFMU0UodXBkYXRlX3Jlc3VsdC5vaygpKTsKKyAgQVNTRVJUX0VRKHVwZGF0ZV9yZXN1bHQuZXJyb3IoKS5tZXNzYWdlKCksCisgICAgICAgICAgICBzdGQ6OnN0cmluZygiSW52YWxpZFN0b3JhZ2VGaWxlT2Zmc2V0KEZsYWcgdmFsdWUgb2Zmc2V0IGdvZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUuKSIpKTsKK30KKworLy8vIFRlc3QgdG8gbG9jayBkb3duIHN0b3JhZ2UgZmxhZyBoYXMgc2VydmVyIG92ZXJyaWRlIHVwZGF0ZSBhcGkKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3RfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlX3VwZGF0ZSkgeworICBhdXRvIG1hcHBlZF9maWxlX3Jlc3VsdCA9IGFwaTo6bWFwX211dGFibGVfc3RvcmFnZV9maWxlKGZsYWdfaW5mbyk7CisgIEFTU0VSVF9UUlVFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBtYXBwZWRfZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxhcGk6Ok11dGFibGVNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisKKyAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgODsgKytvZmZzZXQpIHsKKyAgICBhdXRvIHVwZGF0ZV9yZXN1bHQgPSBhcGk6OnNldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQsIHRydWUpOworICAgIEFTU0VSVF9UUlVFKHVwZGF0ZV9yZXN1bHQub2soKSkgPDwgdXBkYXRlX3Jlc3VsdC5lcnJvcigpOworICAgIGF1dG8gYXR0cmlidXRlID0gYXBpOjpnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5vaygpKTsKKyAgICBBU1NFUlRfVFJVRSgqYXR0cmlidXRlICYgYXBpOjpGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUpOworICB9CisKKyAgLy8gbG9hZCB0aGUgZmlsZSBvbiBkaXNrIGFuZCBjaGVjayBoYXMgYmVlbiB1cGRhdGVkCisgIHN0ZDo6aWZzdHJlYW0gZmlsZShmbGFnX2luZm8sIHN0ZDo6aW9zOjpiaW5hcnkgfCBzdGQ6Omlvczo6YXRlKTsKKyAgc3RkOjpzdHJlYW1zaXplIHNpemUgPSBmaWxlLnRlbGxnKCk7CisgIGZpbGUuc2Vla2coMCwgc3RkOjppb3M6OmJlZyk7CisKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyKHNpemUpOworICBmaWxlLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KGJ1ZmZlci5kYXRhKCkpLCBzaXplKTsKKworICBhdXRvIGNvbnRlbnQgPSBydXN0OjpTbGljZTxjb25zdCB1aW50OF90PigKKyAgICAgIGJ1ZmZlci5kYXRhKCksIG1hcHBlZF9maWxlLT5maWxlX3NpemUpOworCisgIGZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IDg7ICsrb2Zmc2V0KSB7CisgICAgYXV0byBhdHRyaWJ1dGUgPSBnZXRfZmxhZ19hdHRyaWJ1dGVfY3h4KGNvbnRlbnQsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KTsKKyAgICBBU1NFUlRfVFJVRShhdHRyaWJ1dGUucXVlcnlfc3VjY2Vzcyk7CisgICAgQVNTRVJUX1RSVUUoYXR0cmlidXRlLmZsYWdfYXR0cmlidXRlICYgYXBpOjpGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUpOworICB9CisKKyAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgODsgKytvZmZzZXQpIHsKKyAgICBhdXRvIHVwZGF0ZV9yZXN1bHQgPSBhcGk6OnNldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQsIGZhbHNlKTsKKyAgICBBU1NFUlRfVFJVRSh1cGRhdGVfcmVzdWx0Lm9rKCkpOworICAgIGF1dG8gYXR0cmlidXRlID0gYXBpOjpnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5vaygpKTsKKyAgICBBU1NFUlRfRkFMU0UoKmF0dHJpYnV0ZSAmIGFwaTo6RmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlKTsKKyAgfQorCisgIHN0ZDo6aWZzdHJlYW0gZmlsZTIoZmxhZ19pbmZvLCBzdGQ6Omlvczo6YmluYXJ5KTsKKyAgYnVmZmVyLmNsZWFyKCk7CisgIGZpbGUyLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KGJ1ZmZlci5kYXRhKCkpLCBzaXplKTsKKyAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgODsgKytvZmZzZXQpIHsKKyAgICBhdXRvIGF0dHJpYnV0ZSA9IGdldF9mbGFnX2F0dHJpYnV0ZV9jeHgoY29udGVudCwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5xdWVyeV9zdWNjZXNzKTsKKyAgICBBU1NFUlRfRkFMU0UoYXR0cmlidXRlLmZsYWdfYXR0cmlidXRlICYgYXBpOjpGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUpOworICB9Cit9CisKKy8vLyBUZXN0IHRvIGxvY2sgZG93biBzdG9yYWdlIGZsYWcgaGFzIGxvY2FsIG92ZXJyaWRlIHVwZGF0ZSBhcGkKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3RfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGVfdXBkYXRlKSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gYXBpOjptYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoZmxhZ19pbmZvKTsKKyAgQVNTRVJUX1RSVUUobWFwcGVkX2ZpbGVfcmVzdWx0Lm9rKCkpOworICBhdXRvIG1hcHBlZF9maWxlID0gc3RkOjp1bmlxdWVfcHRyPGFwaTo6TXV0YWJsZU1hcHBlZFN0b3JhZ2VGaWxlPigqbWFwcGVkX2ZpbGVfcmVzdWx0KTsKKworICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCA4OyArK29mZnNldCkgeworICAgIGF1dG8gdXBkYXRlX3Jlc3VsdCA9IGFwaTo6c2V0X2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKAorICAgICAgICAqbWFwcGVkX2ZpbGUsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0LCB0cnVlKTsKKyAgICBBU1NFUlRfVFJVRSh1cGRhdGVfcmVzdWx0Lm9rKCkpOworICAgIGF1dG8gYXR0cmlidXRlID0gYXBpOjpnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5vaygpKTsKKyAgICBBU1NFUlRfVFJVRSgqYXR0cmlidXRlICYgYXBpOjpGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSk7CisgIH0KKworICAvLyBsb2FkIHRoZSBmaWxlIG9uIGRpc2sgYW5kIGNoZWNrIGhhcyBiZWVuIHVwZGF0ZWQKKyAgc3RkOjppZnN0cmVhbSBmaWxlKGZsYWdfaW5mbywgc3RkOjppb3M6OmJpbmFyeSB8IHN0ZDo6aW9zOjphdGUpOworICBzdGQ6OnN0cmVhbXNpemUgc2l6ZSA9IGZpbGUudGVsbGcoKTsKKyAgZmlsZS5zZWVrZygwLCBzdGQ6Omlvczo6YmVnKTsKKworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoc2l6ZSk7CisgIGZpbGUucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIgKj4oYnVmZmVyLmRhdGEoKSksIHNpemUpOworCisgIGF1dG8gY29udGVudCA9IHJ1c3Q6OlNsaWNlPGNvbnN0IHVpbnQ4X3Q+KAorICAgICAgYnVmZmVyLmRhdGEoKSwgbWFwcGVkX2ZpbGUtPmZpbGVfc2l6ZSk7CisKKyAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgODsgKytvZmZzZXQpIHsKKyAgICBhdXRvIGF0dHJpYnV0ZSA9IGdldF9mbGFnX2F0dHJpYnV0ZV9jeHgoY29udGVudCwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5xdWVyeV9zdWNjZXNzKTsKKyAgICBBU1NFUlRfVFJVRShhdHRyaWJ1dGUuZmxhZ19hdHRyaWJ1dGUgJiBhcGk6OkZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlKTsKKyAgfQorCisgIGZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IDg7ICsrb2Zmc2V0KSB7CisgICAgYXV0byB1cGRhdGVfcmVzdWx0ID0gYXBpOjpzZXRfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQsIGZhbHNlKTsKKyAgICBBU1NFUlRfVFJVRSh1cGRhdGVfcmVzdWx0Lm9rKCkpOworICAgIGF1dG8gYXR0cmlidXRlID0gYXBpOjpnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5vaygpKTsKKyAgICBBU1NFUlRfRkFMU0UoKmF0dHJpYnV0ZSAmIGFwaTo6RmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUpOworICB9CisKKyAgc3RkOjppZnN0cmVhbSBmaWxlMihmbGFnX2luZm8sIHN0ZDo6aW9zOjpiaW5hcnkpOworICBidWZmZXIuY2xlYXIoKTsKKyAgZmlsZTIucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIgKj4oYnVmZmVyLmRhdGEoKSksIHNpemUpOworICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCA4OyArK29mZnNldCkgeworICAgIGF1dG8gYXR0cmlidXRlID0gZ2V0X2ZsYWdfYXR0cmlidXRlX2N4eChjb250ZW50LCBhcGk6OkZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIG9mZnNldCk7CisgICAgQVNTRVJUX1RSVUUoYXR0cmlidXRlLnF1ZXJ5X3N1Y2Nlc3MpOworICAgIEFTU0VSVF9GQUxTRShhdHRyaWJ1dGUuZmxhZ19hdHRyaWJ1dGUgJiBhcGk6OkZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL3N0b3JhZ2Vfd3JpdGVfYXBpX3Rlc3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvc3RvcmFnZV93cml0ZV9hcGlfdGVzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjc1NjlkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL3N0b3JhZ2Vfd3JpdGVfYXBpX3Rlc3QucnMKQEAgLTAsMCArMSwxMDIgQEAKKyNbY2ZnKG5vdChmZWF0dXJlID0gImNhcmdvIikpXQorbW9kIGFjb25maWdfc3RvcmFnZV93cml0ZV9hcGlfdGVzdCB7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7RmxhZ0luZm9CaXQsIEZsYWdWYWx1ZVR5cGV9OworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OmZsYWdfaW5mb19xdWVyeTo6ZmluZF9mbGFnX2F0dHJpYnV0ZTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpmbGFnX3ZhbHVlX3F1ZXJ5OjpmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaTo6eworICAgICAgICBtYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUsIHNldF9ib29sZWFuX2ZsYWdfdmFsdWUsIHNldF9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSwKKyAgICAgICAgc2V0X2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSwKKyAgICB9OworCisgICAgdXNlIHN0ZDo6ZnM6OntzZWxmLCBGaWxlfTsKKyAgICB1c2Ugc3RkOjppbzo6UmVhZDsKKyAgICB1c2UgdGVtcGZpbGU6Ok5hbWVkVGVtcEZpbGU7CisKKyAgICAvLy8gQ3JlYXRlIHRlbXAgZmlsZSBjb3B5CisgICAgZm4gY29weV90b190ZW1wX3J3X2ZpbGUoc291cmNlX2ZpbGU6ICZzdHIpIC0+IE5hbWVkVGVtcEZpbGUgeworICAgICAgICBsZXQgZmlsZSA9IE5hbWVkVGVtcEZpbGU6Om5ldygpLnVud3JhcCgpOworICAgICAgICBmczo6Y29weShzb3VyY2VfZmlsZSwgZmlsZS5wYXRoKCkpLnVud3JhcCgpOworICAgICAgICBmaWxlCisgICAgfQorCisgICAgLy8vIEdldCBib29sZWFuIGZsYWcgdmFsdWUgZnJvbSBvZmZzZXQKKyAgICBmbiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlX2F0X29mZnNldChmaWxlOiAmc3RyLCBvZmZzZXQ6IHUzMikgLT4gYm9vbCB7CisgICAgICAgIGxldCBtdXQgZiA9IEZpbGU6Om9wZW4oZmlsZSkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnl0ZXMgPSBWZWM6Om5ldygpOworICAgICAgICBmLnJlYWRfdG9fZW5kKCZtdXQgYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZSgmYnl0ZXMsIG9mZnNldCkudW53cmFwKCkKKyAgICB9CisKKyAgICAvLy8gR2V0IGZsYWcgYXR0cmlidXRlIGF0IG9mZnNldAorICAgIGZuIGdldF9mbGFnX2F0dHJpYnV0ZV9hdF9vZmZzZXQoZmlsZTogJnN0ciwgdmFsdWVfdHlwZTogRmxhZ1ZhbHVlVHlwZSwgb2Zmc2V0OiB1MzIpIC0+IHU4IHsKKyAgICAgICAgbGV0IG11dCBmID0gRmlsZTo6b3BlbihmaWxlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCBieXRlcyA9IFZlYzo6bmV3KCk7CisgICAgICAgIGYucmVhZF90b19lbmQoJm11dCBieXRlcykudW53cmFwKCk7CisgICAgICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmJ5dGVzLCB2YWx1ZV90eXBlLCBvZmZzZXQpLnVud3JhcCgpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vLyBUZXN0IHRvIGxvY2sgZG93biBmbGFnIHZhbHVlIHVwZGF0ZSBhcGkKKyAgICBmbiB0ZXN0X2Jvb2xlYW5fZmxhZ192YWx1ZV91cGRhdGUoKSB7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2ZpbGUgPSBjb3B5X3RvX3RlbXBfcndfZmlsZSgiLi9mbGFnLnZhbCIpOworICAgICAgICBsZXQgZmxhZ192YWx1ZV9wYXRoID0gZmxhZ192YWx1ZV9maWxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisKKyAgICAgICAgLy8gU0FGRVRZOgorICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyBvbmx5IHRoaXMgc2luZ2xlIHRocmVhZGVkIHRlc3QgcHJvY2VzcyB3aWxsCisgICAgICAgIC8vIHdyaXRlIHRvIHRoaXMgZmlsZQorICAgICAgICBsZXQgbXV0IGZpbGUgPSB1bnNhZmUgeyBtYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoJmZsYWdfdmFsdWVfcGF0aCkudW53cmFwKCkgfTsKKyAgICAgICAgZm9yIGkgaW4gMC4uOCB7CisgICAgICAgICAgICBzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgZmlsZSwgaSwgdHJ1ZSkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlX2F0X29mZnNldCgmZmxhZ192YWx1ZV9wYXRoLCBpKTsKKyAgICAgICAgICAgIGFzc2VydCEodmFsdWUpOworCisgICAgICAgICAgICBzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgZmlsZSwgaSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9hdF9vZmZzZXQoJmZsYWdfdmFsdWVfcGF0aCwgaSk7CisgICAgICAgICAgICBhc3NlcnQhKCF2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8vIFRlc3QgdG8gbG9jayBkb3duIGZsYWcgaGFzIHNlcnZlciBvdmVycmlkZSB1cGRhdGUgYXBpCisgICAgZm4gdGVzdF9zZXRfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPSBjb3B5X3RvX3RlbXBfcndfZmlsZSgiLi9mbGFnLmluZm8iKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19wYXRoID0gZmxhZ19pbmZvX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIG9ubHkgdGhpcyBzaW5nbGUgdGhyZWFkZWQgdGVzdCBwcm9jZXNzIHdpbGwKKyAgICAgICAgLy8gd3JpdGUgdG8gdGhpcyBmaWxlCisgICAgICAgIGxldCBtdXQgZmlsZSA9IHVuc2FmZSB7IG1hcF9tdXRhYmxlX3N0b3JhZ2VfZmlsZSgmZmxhZ19pbmZvX3BhdGgpLnVud3JhcCgpIH07CisgICAgICAgIGZvciBpIGluIDAuLjggeworICAgICAgICAgICAgc2V0X2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgmbXV0IGZpbGUsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIHRydWUpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9CisgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfYXR0cmlidXRlX2F0X29mZnNldCgmZmxhZ19pbmZvX3BhdGgsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGkpOworICAgICAgICAgICAgYXNzZXJ0ISgoYXR0cmlidXRlICYgKEZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSBhcyB1OCkpICE9IDApOworICAgICAgICAgICAgc2V0X2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgmbXV0IGZpbGUsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQorICAgICAgICAgICAgICAgIGdldF9mbGFnX2F0dHJpYnV0ZV9hdF9vZmZzZXQoJmZsYWdfaW5mb19wYXRoLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpKTsKKyAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpKSA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLy8gVGVzdCB0byBsb2NrIGRvd24gZmxhZyBoYXMgbG9jYWwgb3ZlcnJpZGUgdXBkYXRlIGFwaQorICAgIGZuIHRlc3Rfc2V0X2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPSBjb3B5X3RvX3RlbXBfcndfZmlsZSgiLi9mbGFnLmluZm8iKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19wYXRoID0gZmxhZ19pbmZvX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIG9ubHkgdGhpcyBzaW5nbGUgdGhyZWFkZWQgdGVzdCBwcm9jZXNzIHdpbGwKKyAgICAgICAgLy8gd3JpdGUgdG8gdGhpcyBmaWxlCisgICAgICAgIGxldCBtdXQgZmlsZSA9IHVuc2FmZSB7IG1hcF9tdXRhYmxlX3N0b3JhZ2VfZmlsZSgmZmxhZ19pbmZvX3BhdGgpLnVud3JhcCgpIH07CisgICAgICAgIGZvciBpIGluIDAuLjggeworICAgICAgICAgICAgc2V0X2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKCZtdXQgZmlsZSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSwgdHJ1ZSkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICBnZXRfZmxhZ19hdHRyaWJ1dGVfYXRfb2Zmc2V0KCZmbGFnX2luZm9fcGF0aCwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSk7CisgICAgICAgICAgICBhc3NlcnQhKChhdHRyaWJ1dGUgJiAoRmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUgYXMgdTgpKSAhPSAwKTsKKyAgICAgICAgICAgIHNldF9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSgmbXV0IGZpbGUsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQorICAgICAgICAgICAgICAgIGdldF9mbGFnX2F0dHJpYnV0ZV9hdF9vZmZzZXQoJmZsYWdfaW5mb19wYXRoLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpKTsKKyAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkpID09IDApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwMjM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitydXN0X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWZsYWdzLmRlZmF1bHRzIiwKKyAgICBlZGl0aW9uOiAiMjAyMSIsCisgICAgY2xpcHB5X2xpbnRzOiAiYW5kcm9pZCIsCisgICAgbGludHM6ICJhbmRyb2lkIiwKKyAgICBzcmNzOiBbInNyYy9tYWluLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfZGV2aWNlX3BhdGhzIiwKKyAgICAgICAgImxpYmFjb25maWdfcHJvdG9zIiwKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSIsCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZSIsCisgICAgICAgICJsaWJhbnlob3ciLAorICAgICAgICAibGliY2xhcCIsCisgICAgICAgICJsaWJuaXgiLAorICAgICAgICAibGlicHJvdG9idWYiLAorICAgICAgICAibGlicmVnZXgiLAorICAgIF0sCit9CisKK3J1c3RfYmluYXJ5IHsKKyAgICBuYW1lOiAiYWZsYWdzIiwKKyAgICBkZWZhdWx0czogWyJhZmxhZ3MuZGVmYXVsdHMiXSwKK30KKworcnVzdF90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJhZmxhZ3MudGVzdCIsCisgICAgZGVmYXVsdHM6IFsiYWZsYWdzLmRlZmF1bHRzIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhZTI5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxNiBAQAorW3BhY2thZ2VdCituYW1lID0gImFmbGFncyIKK3ZlcnNpb24gPSAiMC4xLjAiCitlZGl0aW9uID0gIjIwMjEiCisKK1tkZXBlbmRlbmNpZXNdCithbnlob3cgPSAiMS4wLjY5IgorcGFzdGUgPSAiMS4wLjExIgorcHJvdG9idWYgPSAiMy4yLjAiCityZWdleCA9ICIxLjEwLjMiCithY29uZmlnX3Byb3RvcyA9IHsgcGF0aCA9ICIuLi9hY29uZmlnX3Byb3RvcyIgfQorbml4ID0geyB2ZXJzaW9uID0gIjAuMjguMCIsIGZlYXR1cmVzID0gWyJ1c2VyIl0gfQorYWNvbmZpZ19zdG9yYWdlX2ZpbGUgPSB7IHZlcnNpb24gPSAiMC4xLjAiLCBwYXRoID0gIi4uL2Fjb25maWdfc3RvcmFnZV9maWxlIiB9CithY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkgPSB7IHZlcnNpb24gPSAiMC4xLjAiLCBwYXRoID0gIi4uL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaSIgfQorY2xhcCA9IHt2ZXJzaW9uID0gIjQuNS4yIiB9CithY29uZmlnX2RldmljZV9wYXRocyA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19kZXZpY2VfcGF0aHMiIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9hY29uZmlnX3N0b3JhZ2Vfc291cmNlLnJzIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2Fjb25maWdfc3RvcmFnZV9zb3VyY2UucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxNDBjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9hY29uZmlnX3N0b3JhZ2Vfc291cmNlLnJzCkBAIC0wLDAgKzEsNTUgQEAKK3VzZSBjcmF0ZTo6e0ZsYWcsIEZsYWdQZXJtaXNzaW9uLCBGbGFnU291cmNlLCBGbGFnVmFsdWUsIFZhbHVlUGlja2VkRnJvbX07Cit1c2UgYW55aG93Ojp7YW55aG93LCBSZXN1bHR9OworCit1c2Ugc3RkOjpmczo6RmlsZTsKK3VzZSBzdGQ6OmlvOjpSZWFkOworCitwdWIgc3RydWN0IEFjb25maWdTdG9yYWdlU291cmNlIHt9CisKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6cHJvdG9zOjpQcm90b1N0b3JhZ2VGaWxlczsKKworc3RhdGljIFNUT1JBR0VfSU5GT19GSUxFX1BBVEg6ICZzdHIgPSAiL21ldGFkYXRhL2Fjb25maWcvcGVyc2lzdGVudF9zdG9yYWdlX2ZpbGVfcmVjb3Jkcy5wYiI7CisKK2ltcGwgRmxhZ1NvdXJjZSBmb3IgQWNvbmZpZ1N0b3JhZ2VTb3VyY2UgeworICAgIGZuIGxpc3RfZmxhZ3MoKSAtPiBSZXN1bHQ8VmVjPEZsYWc+PiB7CisgICAgICAgIGxldCBtdXQgcmVzdWx0ID0gVmVjOjpuZXcoKTsKKworICAgICAgICBsZXQgbXV0IGZpbGUgPSBGaWxlOjpvcGVuKFNUT1JBR0VfSU5GT19GSUxFX1BBVEgpPzsKKyAgICAgICAgbGV0IG11dCBieXRlcyA9IFZlYzo6bmV3KCk7CisgICAgICAgIGZpbGUucmVhZF90b19lbmQoJm11dCBieXRlcyk/OworICAgICAgICBsZXQgc3RvcmFnZV9maWxlX2luZm86IFByb3RvU3RvcmFnZUZpbGVzID0gcHJvdG9idWY6Ok1lc3NhZ2U6OnBhcnNlX2Zyb21fYnl0ZXMoJmJ5dGVzKT87CisKKyAgICAgICAgZm9yIGZpbGVfaW5mbyBpbiBzdG9yYWdlX2ZpbGVfaW5mby5maWxlcyB7CisgICAgICAgICAgICBsZXQgcGFja2FnZV9tYXAgPQorICAgICAgICAgICAgICAgIGZpbGVfaW5mby5wYWNrYWdlX21hcC5va19vcihhbnlob3chKCJzdG9yYWdlIGZpbGUgaXMgbWlzc2luZyBwYWNrYWdlIG1hcCIpKT87CisgICAgICAgICAgICBsZXQgZmxhZ19tYXAgPSBmaWxlX2luZm8uZmxhZ19tYXAub2tfb3IoYW55aG93ISgic3RvcmFnZSBmaWxlIGlzIG1pc3NpbmcgZmxhZyBtYXAiKSk/OworICAgICAgICAgICAgbGV0IGZsYWdfdmFsID0gZmlsZV9pbmZvLmZsYWdfdmFsLm9rX29yKGFueWhvdyEoInN0b3JhZ2UgZmlsZSBpcyBtaXNzaW5nIGZsYWcgdmFsIikpPzsKKyAgICAgICAgICAgIGxldCBjb250YWluZXIgPQorICAgICAgICAgICAgICAgIGZpbGVfaW5mby5jb250YWluZXIub2tfb3IoYW55aG93ISgic3RvcmFnZSBmaWxlIGlzIG1pc3NpbmcgY29udGFpbmVyIikpPzsKKworICAgICAgICAgICAgZm9yIGxpc3RlZF9mbGFnIGluIGFjb25maWdfc3RvcmFnZV9maWxlOjpsaXN0X2ZsYWdzKCZwYWNrYWdlX21hcCwgJmZsYWdfbWFwLCAmZmxhZ192YWwpPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKEZsYWcgeworICAgICAgICAgICAgICAgICAgICBuYW1lOiBsaXN0ZWRfZmxhZy5mbGFnX25hbWUsCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U6IGxpc3RlZF9mbGFnLnBhY2thZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEZsYWdWYWx1ZTo6dHJ5X2Zyb20obGlzdGVkX2ZsYWcuZmxhZ192YWx1ZS5hc19zdHIoKSk/LAorICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lci50b19zdHJpbmcoKSwKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMzI0NDM2MTQ1KTogZGVsZXRlIG5hbWVzcGFjZSBmaWVsZCBvbmNlIERldmljZUNvbmZpZyBpc24ndCBpbiBDTEkuCisgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogIi0iLnRvX3N0cmluZygpLAorCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8zMjQ0MzYxNDUpOiBQb3B1bGF0ZSB3aXRoIHJlYWwgdmFsdWVzIG9uY2UgQVBJIGlzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgc3RhZ2VkX3ZhbHVlOiBOb25lLAorICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uOiBGbGFnUGVybWlzc2lvbjo6UmVhZE9ubHksCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX3BpY2tlZF9mcm9tOiBWYWx1ZVBpY2tlZEZyb206OkRlZmF1bHQsCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPayhyZXN1bHQpCisgICAgfQorCisgICAgZm4gb3ZlcnJpZGVfZmxhZyhfbmFtZXNwYWNlOiAmc3RyLCBfcXVhbGlmaWVkX25hbWU6ICZzdHIsIF92YWx1ZTogJnN0cikgLT4gUmVzdWx0PCgpPiB7CisgICAgICAgIHRvZG8hKCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2FmbGFncy9zcmMvZGV2aWNlX2NvbmZpZ19zb3VyY2UucnMgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvZGV2aWNlX2NvbmZpZ19zb3VyY2UucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2YWIyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9kZXZpY2VfY29uZmlnX3NvdXJjZS5ycwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzZSBjcmF0ZTo6bG9hZF9wcm90b3M7Cit1c2UgY3JhdGU6OntGbGFnLCBGbGFnU291cmNlLCBGbGFnVmFsdWUsIFZhbHVlUGlja2VkRnJvbX07CisKK3VzZSBhbnlob3c6Onthbnlob3csIGJhaWwsIFJlc3VsdH07Cit1c2UgcmVnZXg6OlJlZ2V4OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpwcm9jZXNzOjpDb21tYW5kOwordXNlIHN0ZDo6c3RyOworCitwdWIgc3RydWN0IERldmljZUNvbmZpZ1NvdXJjZSB7fQorCitmbiBwYXJzZV9kZXZpY2VfY29uZmlnKHJhdzogJnN0cikgLT4gUmVzdWx0PEhhc2hNYXA8U3RyaW5nLCBGbGFnVmFsdWU+PiB7CisgICAgbGV0IG11dCBmbGFncyA9IEhhc2hNYXA6Om5ldygpOworICAgIGxldCByZWdleCA9IFJlZ2V4OjpuZXcociIoP20pXihbW1s6YWxudW06XV1fXSsvW1tbOmFsbnVtOl1dX1wuXSspPSh0cnVlfGZhbHNlKSQiKT87CisgICAgZm9yIGNhcHR1cmUgaW4gcmVnZXguY2FwdHVyZXNfaXRlcihyYXcpIHsKKyAgICAgICAgbGV0IGtleSA9CisgICAgICAgICAgICBjYXB0dXJlLmdldCgxKS5va19vcihhbnlob3chKCJpbnZhbGlkIGRldmljZV9jb25maWcgb3V0cHV0IikpPy5hc19zdHIoKS50b19zdHJpbmcoKTsKKyAgICAgICAgbGV0IHZhbHVlID0gRmxhZ1ZhbHVlOjp0cnlfZnJvbSgKKyAgICAgICAgICAgIGNhcHR1cmUuZ2V0KDIpLm9rX29yKGFueWhvdyEoImludmFsaWQgZGV2aWNlX2NvbmZpZyBvdXRwdXQiKSk/LmFzX3N0cigpLAorICAgICAgICApPzsKKyAgICAgICAgZmxhZ3MuaW5zZXJ0KGtleSwgdmFsdWUpOworICAgIH0KKyAgICBPayhmbGFncykKK30KKworZm4gcmVhZF9kZXZpY2VfY29uZmlnX291dHB1dChjb21tYW5kOiAmWyZzdHJdKSAtPiBSZXN1bHQ8U3RyaW5nPiB7CisgICAgbGV0IG91dHB1dCA9IENvbW1hbmQ6Om5ldygiL3N5c3RlbS9iaW4vZGV2aWNlX2NvbmZpZyIpLmFyZ3MoY29tbWFuZCkub3V0cHV0KCk/OworICAgIGlmICFvdXRwdXQuc3RhdHVzLnN1Y2Nlc3MoKSB7CisgICAgICAgIGxldCByZWFzb24gPSBtYXRjaCBvdXRwdXQuc3RhdHVzLmNvZGUoKSB7CisgICAgICAgICAgICBTb21lKGNvZGUpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgb3V0cHV0ID0gc3RyOjpmcm9tX3V0ZjgoJm91dHB1dC5zdGRvdXQpPzsKKyAgICAgICAgICAgICAgICBpZiAhb3V0cHV0LmlzX2VtcHR5KCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQhKCJleGl0IGNvZGUge2NvZGV9LCBvdXRwdXQgd2FzIHtvdXRwdXR9IikKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQhKCJleGl0IGNvZGUge2NvZGV9IikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb25lID0+ICJ0ZXJtaW5hdGVkIGJ5IHNpZ25hbCIudG9fc3RyaW5nKCksCisgICAgICAgIH07CisgICAgICAgIGJhaWwhKCJmYWlsZWQgdG8gYWNjZXNzIGZsYWcgc3RvcmFnZToge30iLCByZWFzb24pOworICAgIH0KKyAgICBPayhzdHI6OmZyb21fdXRmOCgmb3V0cHV0LnN0ZG91dCk/LnRvX3N0cmluZygpKQorfQorCitmbiByZWFkX2RldmljZV9jb25maWdfZmxhZ3MoKSAtPiBSZXN1bHQ8SGFzaE1hcDxTdHJpbmcsIEZsYWdWYWx1ZT4+IHsKKyAgICBsZXQgbGlzdF9vdXRwdXQgPSByZWFkX2RldmljZV9jb25maWdfb3V0cHV0KCZbImxpc3QiXSk/OworICAgIHBhcnNlX2RldmljZV9jb25maWcoJmxpc3Rfb3V0cHV0KQorfQorCisvLy8gUGFyc2UgdGhlIGxpc3Qgb2YgbmV3bGluZS1zZXBhcmF0ZWQgc3RhZ2VkIGZsYWdzLgorLy8vCisvLy8gVGhlIG91dHB1dCBpcyBhIG5ld2xpbmUtc2VwYWFyYXRlZCBsaXN0IG9mIGVudHJpZXMgd2hpY2ggZm9sbG93IHRoaXMgZm9ybWF0OgorLy8vICAgYG5hbWVzcGFjZSpmbGFnbmFtZT12YWx1ZWAKKy8vLworLy8vIFRoZSByZXN1bHRpbmcgbWFwIG1hcHMgZnJvbSBgbmFtZXNwYWNlL2ZsYWduYW1lYCB0byBgdmFsdWVgLCBpZiBhIHN0YWdlZCBmbGFnIGV4aXN0cyBmb3IKKy8vLyBgbmFtZXNwYWNlL2ZsYWduYW1lYC4KK2ZuIHBhcnNlX3N0YWdlZF9mbGFncyhyYXc6ICZzdHIpIC0+IFJlc3VsdDxIYXNoTWFwPFN0cmluZywgRmxhZ1ZhbHVlPj4geworICAgIGxldCBtdXQgZmxhZ3MgPSBIYXNoTWFwOjpuZXcoKTsKKyAgICBmb3IgbGluZSBpbiByYXcuc3BsaXQoJ1xuJykgeworICAgICAgICBtYXRjaCAobGluZS5maW5kKCcqJyksIGxpbmUuZmluZCgnPScpKSB7CisgICAgICAgICAgICAoU29tZShzdGFyX2luZGV4KSwgU29tZShlcXVhbF9pbmRleCkpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZXNwYWNlID0gJmxpbmVbLi5zdGFyX2luZGV4XTsKKyAgICAgICAgICAgICAgICBsZXQgZmxhZyA9ICZsaW5lW3N0YXJfaW5kZXggKyAxLi5lcXVhbF9pbmRleF07CisgICAgICAgICAgICAgICAgaWYgbGV0IE9rKHZhbHVlKSA9IEZsYWdWYWx1ZTo6dHJ5X2Zyb20oJmxpbmVbZXF1YWxfaW5kZXggKyAxLi5dKSB7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzLmluc2VydChuYW1lc3BhY2UudG9fb3duZWQoKSArICIvIiArIGZsYWcsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IGNvbnRpbnVlLAorICAgICAgICB9OworICAgIH0KKyAgICBPayhmbGFncykKK30KKworZm4gcmVhZF9zdGFnZWRfZmxhZ3MoKSAtPiBSZXN1bHQ8SGFzaE1hcDxTdHJpbmcsIEZsYWdWYWx1ZT4+IHsKKyAgICBsZXQgc3RhZ2VkX2ZsYWdzX291dHB1dCA9IHJlYWRfZGV2aWNlX2NvbmZpZ19vdXRwdXQoJlsibGlzdCIsICJzdGFnZWQiXSk/OworICAgIHBhcnNlX3N0YWdlZF9mbGFncygmc3RhZ2VkX2ZsYWdzX291dHB1dCkKK30KKworZm4gcmVjb25jaWxlKAorICAgIHBiX2ZsYWdzOiAmW0ZsYWddLAorICAgIGRjX2ZsYWdzOiBIYXNoTWFwPFN0cmluZywgRmxhZ1ZhbHVlPiwKKyAgICBzdGFnZWRfZmxhZ3M6IEhhc2hNYXA8U3RyaW5nLCBGbGFnVmFsdWU+LAorKSAtPiBWZWM8RmxhZz4geworICAgIHBiX2ZsYWdzCisgICAgICAgIC5pdGVyKCkKKyAgICAgICAgLm1hcCh8ZnwgeworICAgICAgICAgICAgbGV0IHNlcnZlcl9vdmVycmlkZSA9IGRjX2ZsYWdzLmdldCgmZm9ybWF0ISgie30ve30iLCBmLm5hbWVzcGFjZSwgZi5xdWFsaWZpZWRfbmFtZSgpKSk7CisgICAgICAgICAgICBsZXQgKHZhbHVlX3BpY2tlZF9mcm9tLCBzZWxlY3RlZF92YWx1ZSkgPSBtYXRjaCBzZXJ2ZXJfb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIFNvbWUodmFsdWUpIGlmICp2YWx1ZSAhPSBmLnZhbHVlID0+IChWYWx1ZVBpY2tlZEZyb206OlNlcnZlciwgKnZhbHVlKSwKKyAgICAgICAgICAgICAgICBfID0+IChWYWx1ZVBpY2tlZEZyb206OkRlZmF1bHQsIGYudmFsdWUpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIEZsYWcgeyB2YWx1ZV9waWNrZWRfZnJvbSwgdmFsdWU6IHNlbGVjdGVkX3ZhbHVlLCAuLmYuY2xvbmUoKSB9CisgICAgICAgIH0pCisgICAgICAgIC5tYXAofGZ8IHsKKyAgICAgICAgICAgIGxldCBzdGFnZWRfdmFsdWUgPSBzdGFnZWRfZmxhZ3MKKyAgICAgICAgICAgICAgICAuZ2V0KCZmb3JtYXQhKCJ7fS97fSIsIGYubmFtZXNwYWNlLCBmLnF1YWxpZmllZF9uYW1lKCkpKQorICAgICAgICAgICAgICAgIC5tYXAofHZhbHVlfCBpZiAqdmFsdWUgIT0gZi52YWx1ZSB7IFNvbWUoKnZhbHVlKSB9IGVsc2UgeyBOb25lIH0pCisgICAgICAgICAgICAgICAgLnVud3JhcF9vcihOb25lKTsKKyAgICAgICAgICAgIEZsYWcgeyBzdGFnZWRfdmFsdWUsIC4uZiB9CisgICAgICAgIH0pCisgICAgICAgIC5jb2xsZWN0KCkKK30KKworaW1wbCBGbGFnU291cmNlIGZvciBEZXZpY2VDb25maWdTb3VyY2UgeworICAgIGZuIGxpc3RfZmxhZ3MoKSAtPiBSZXN1bHQ8VmVjPEZsYWc+PiB7CisgICAgICAgIGxldCBwYl9mbGFncyA9IGxvYWRfcHJvdG9zOjpsb2FkKCk/OworICAgICAgICBsZXQgZGNfZmxhZ3MgPSByZWFkX2RldmljZV9jb25maWdfZmxhZ3MoKT87CisgICAgICAgIGxldCBzdGFnZWRfZmxhZ3MgPSByZWFkX3N0YWdlZF9mbGFncygpPzsKKworICAgICAgICBsZXQgZmxhZ3MgPSByZWNvbmNpbGUoJnBiX2ZsYWdzLCBkY19mbGFncywgc3RhZ2VkX2ZsYWdzKTsKKyAgICAgICAgT2soZmxhZ3MpCisgICAgfQorCisgICAgZm4gb3ZlcnJpZGVfZmxhZyhuYW1lc3BhY2U6ICZzdHIsIHF1YWxpZmllZF9uYW1lOiAmc3RyLCB2YWx1ZTogJnN0cikgLT4gUmVzdWx0PCgpPiB7CisgICAgICAgIHJlYWRfZGV2aWNlX2NvbmZpZ19vdXRwdXQoJlsicHV0IiwgbmFtZXNwYWNlLCBxdWFsaWZpZWRfbmFtZSwgdmFsdWVdKS5tYXAofF98ICgpKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3BhcnNlX2RldmljZV9jb25maWcoKSB7CisgICAgICAgIGxldCBpbnB1dCA9IHIjIgorbmFtZXNwYWNlX29uZS9jb20uZm9vLmJhci5mbGFnX29uZT10cnVlCituYW1lc3BhY2Vfb25lL2NvbS5mb28uYmFyLmZsYWdfdHdvPWZhbHNlCityYW5kb21fbm9pc2U7CituYW1lc3BhY2VfdHdvL2FuZHJvaWQuZmxhZ19vbmU9dHJ1ZQorbmFtZXNwYWNlX3R3by9hbmRyb2lkLmZsYWdfdHdvPW5vbnNlbnNlCisiIzsKKyAgICAgICAgbGV0IGV4cGVjdGVkID0gSGFzaE1hcDo6ZnJvbShbCisgICAgICAgICAgICAoIm5hbWVzcGFjZV9vbmUvY29tLmZvby5iYXIuZmxhZ19vbmUiLnRvX3N0cmluZygpLCBGbGFnVmFsdWU6OkVuYWJsZWQpLAorICAgICAgICAgICAgKCJuYW1lc3BhY2Vfb25lL2NvbS5mb28uYmFyLmZsYWdfdHdvIi50b19zdHJpbmcoKSwgRmxhZ1ZhbHVlOjpEaXNhYmxlZCksCisgICAgICAgICAgICAoIm5hbWVzcGFjZV90d28vYW5kcm9pZC5mbGFnX29uZSIudG9fc3RyaW5nKCksIEZsYWdWYWx1ZTo6RW5hYmxlZCksCisgICAgICAgIF0pOworICAgICAgICBsZXQgYWN0dWFsID0gcGFyc2VfZGV2aWNlX2NvbmZpZyhpbnB1dCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2xvYWRfcHJvdG9zLnJzIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2xvYWRfcHJvdG9zLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZDg1OTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvbG9hZF9wcm90b3MucnMKQEAgLTAsMCArMSw2MiBAQAordXNlIGNyYXRlOjp7RmxhZywgRmxhZ1Blcm1pc3Npb24sIEZsYWdWYWx1ZSwgVmFsdWVQaWNrZWRGcm9tfTsKK3VzZSBhY29uZmlnX3Byb3Rvczo6UHJvdG9GbGFnUGVybWlzc2lvbiBhcyBQcm90b1Blcm1pc3Npb247Cit1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvRmxhZ1N0YXRlIGFzIFByb3RvU3RhdGU7Cit1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvUGFyc2VkRmxhZzsKK3VzZSBhY29uZmlnX3Byb3Rvczo6UHJvdG9QYXJzZWRGbGFnczsKK3VzZSBhbnlob3c6OlJlc3VsdDsKK3VzZSBzdGQ6OmZzOwordXNlIHN0ZDo6cGF0aDo6UGF0aDsKKworLy8gVE9ETyhiLzMyOTg3NTU3OCk6IHVzZSBjb250YWluZXIgZmllbGQgZGlyZWN0bHkgaW5zdGVhZCBvZiBpbmZlcnJpbmcuCitmbiBpbmZlcl9jb250YWluZXIocGF0aDogJlBhdGgpIC0+IFN0cmluZyB7CisgICAgbGV0IHBhdGhfc3RyID0gcGF0aC50b19zdHJpbmdfbG9zc3koKTsKKyAgICBwYXRoX3N0cgorICAgICAgICAuc3RyaXBfcHJlZml4KCIvYXBleC8iKQorICAgICAgICAub3JfZWxzZSh8fCBwYXRoX3N0ci5zdHJpcF9wcmVmaXgoJy8nKSkKKyAgICAgICAgLnVud3JhcF9vcigmcGF0aF9zdHIpCisgICAgICAgIC5zdHJpcF9zdWZmaXgoIi9ldGMvYWNvbmZpZ19mbGFncy5wYiIpCisgICAgICAgIC51bndyYXBfb3IoJnBhdGhfc3RyKQorICAgICAgICAudG9fc3RyaW5nKCkKK30KKworZm4gY29udmVydF9wYXJzZWRfZmxhZyhwYXRoOiAmUGF0aCwgZmxhZzogJlByb3RvUGFyc2VkRmxhZykgLT4gRmxhZyB7CisgICAgbGV0IG5hbWVzcGFjZSA9IGZsYWcubmFtZXNwYWNlKCkudG9fc3RyaW5nKCk7CisgICAgbGV0IHBhY2thZ2UgPSBmbGFnLnBhY2thZ2UoKS50b19zdHJpbmcoKTsKKyAgICBsZXQgbmFtZSA9IGZsYWcubmFtZSgpLnRvX3N0cmluZygpOworCisgICAgbGV0IHZhbHVlID0gbWF0Y2ggZmxhZy5zdGF0ZSgpIHsKKyAgICAgICAgUHJvdG9TdGF0ZTo6RU5BQkxFRCA9PiBGbGFnVmFsdWU6OkVuYWJsZWQsCisgICAgICAgIFByb3RvU3RhdGU6OkRJU0FCTEVEID0+IEZsYWdWYWx1ZTo6RGlzYWJsZWQsCisgICAgfTsKKworICAgIGxldCBwZXJtaXNzaW9uID0gbWF0Y2ggZmxhZy5wZXJtaXNzaW9uKCkgeworICAgICAgICBQcm90b1Blcm1pc3Npb246OlJFQURfT05MWSA9PiBGbGFnUGVybWlzc2lvbjo6UmVhZE9ubHksCisgICAgICAgIFByb3RvUGVybWlzc2lvbjo6UkVBRF9XUklURSA9PiBGbGFnUGVybWlzc2lvbjo6UmVhZFdyaXRlLAorICAgIH07CisKKyAgICBGbGFnIHsKKyAgICAgICAgbmFtZXNwYWNlLAorICAgICAgICBwYWNrYWdlLAorICAgICAgICBuYW1lLAorICAgICAgICBjb250YWluZXI6IGluZmVyX2NvbnRhaW5lcihwYXRoKSwKKyAgICAgICAgdmFsdWUsCisgICAgICAgIHN0YWdlZF92YWx1ZTogTm9uZSwKKyAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgdmFsdWVfcGlja2VkX2Zyb206IFZhbHVlUGlja2VkRnJvbTo6RGVmYXVsdCwKKyAgICB9Cit9CisKK3B1YihjcmF0ZSkgZm4gbG9hZCgpIC0+IFJlc3VsdDxWZWM8RmxhZz4+IHsKKyAgICBsZXQgbXV0IHJlc3VsdCA9IFZlYzo6bmV3KCk7CisKKyAgICBsZXQgcGF0aHMgPSBhY29uZmlnX2RldmljZV9wYXRoczo6cGFyc2VkX2ZsYWdzX3Byb3RvX3BhdGhzKCk/OworICAgIGZvciBwYXRoIGluIHBhdGhzIHsKKyAgICAgICAgbGV0IGJ5dGVzID0gZnM6OnJlYWQocGF0aC5jbG9uZSgpKT87CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3M6IFByb3RvUGFyc2VkRmxhZ3MgPSBwcm90b2J1Zjo6TWVzc2FnZTo6cGFyc2VfZnJvbV9ieXRlcygmYnl0ZXMpPzsKKyAgICAgICAgZm9yIGZsYWcgaW4gcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnIHsKKyAgICAgICAgICAgIC8vIFRPRE8oYi8zMzQ5NTQ3NDgpOiBlbmZvcmNlIG9uZS1jb250YWluZXItcGVyLWZsYWcgaW52YXJpYW50LgorICAgICAgICAgICAgcmVzdWx0LnB1c2goY29udmVydF9wYXJzZWRfZmxhZygmcGF0aCwgJmZsYWcpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBPayhyZXN1bHQpCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2FmbGFncy9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9tYWluLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMGYyZTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvbWFpbi5ycwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vISBgYWZsYWdzYCBpcyBhIGRldmljZSBiaW5hcnkgdG8gcmVhZCBhbmQgd3JpdGUgYWNvbmZpZyBmbGFncy4KKwordXNlIGFueWhvdzo6e2FueWhvdywgZW5zdXJlLCBSZXN1bHR9OwordXNlIGNsYXA6OlBhcnNlcjsKKworbW9kIGRldmljZV9jb25maWdfc291cmNlOwordXNlIGRldmljZV9jb25maWdfc291cmNlOjpEZXZpY2VDb25maWdTb3VyY2U7CisKK21vZCBhY29uZmlnX3N0b3JhZ2Vfc291cmNlOwordXNlIGFjb25maWdfc3RvcmFnZV9zb3VyY2U6OkFjb25maWdTdG9yYWdlU291cmNlOworCittb2QgbG9hZF9wcm90b3M7CisKKyNbZGVyaXZlKENsb25lLCBQYXJ0aWFsRXEsIERlYnVnKV0KK2VudW0gRmxhZ1Blcm1pc3Npb24geworICAgIFJlYWRPbmx5LAorICAgIFJlYWRXcml0ZSwKK30KKworaW1wbCBzdGQ6OmZtdDo6RGlzcGxheSBmb3IgRmxhZ1Blcm1pc3Npb24geworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAie30iLAorICAgICAgICAgICAgbWF0Y2ggJnNlbGYgeworICAgICAgICAgICAgICAgIFNlbGY6OlJlYWRPbmx5ID0+ICJyZWFkLW9ubHkiLAorICAgICAgICAgICAgICAgIFNlbGY6OlJlYWRXcml0ZSA9PiAicmVhZC13cml0ZSIsCisgICAgICAgICAgICB9CisgICAgICAgICkKKyAgICB9Cit9CisKKyNbZGVyaXZlKENsb25lLCBEZWJ1ZyldCitlbnVtIFZhbHVlUGlja2VkRnJvbSB7CisgICAgRGVmYXVsdCwKKyAgICBTZXJ2ZXIsCit9CisKK2ltcGwgc3RkOjpmbXQ6OkRpc3BsYXkgZm9yIFZhbHVlUGlja2VkRnJvbSB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGUhKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJ7fSIsCisgICAgICAgICAgICBtYXRjaCAmc2VsZiB7CisgICAgICAgICAgICAgICAgU2VsZjo6RGVmYXVsdCA9PiAiZGVmYXVsdCIsCisgICAgICAgICAgICAgICAgU2VsZjo6U2VydmVyID0+ICJzZXJ2ZXIiLAorICAgICAgICAgICAgfQorICAgICAgICApCisgICAgfQorfQorCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgUGFydGlhbEVxLCBFcSwgRGVidWcpXQorZW51bSBGbGFnVmFsdWUgeworICAgIEVuYWJsZWQsCisgICAgRGlzYWJsZWQsCit9CisKK2ltcGwgVHJ5RnJvbTwmc3RyPiBmb3IgRmxhZ1ZhbHVlIHsKKyAgICB0eXBlIEVycm9yID0gYW55aG93OjpFcnJvcjsKKworICAgIGZuIHRyeV9mcm9tKHZhbHVlOiAmc3RyKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PFNlbGYsIFNlbGY6OkVycm9yPiB7CisgICAgICAgIG1hdGNoIHZhbHVlIHsKKyAgICAgICAgICAgICJ0cnVlIiB8ICJlbmFibGVkIiA9PiBPayhTZWxmOjpFbmFibGVkKSwKKyAgICAgICAgICAgICJmYWxzZSIgfCAiZGlzYWJsZWQiID0+IE9rKFNlbGY6OkRpc2FibGVkKSwKKyAgICAgICAgICAgIF8gPT4gRXJyKGFueWhvdyEoImNhbm5vdCBjb252ZXJ0IHN0cmluZyAne30nIHRvIEZsYWdWYWx1ZSIsIHZhbHVlKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgc3RkOjpmbXQ6OkRpc3BsYXkgZm9yIEZsYWdWYWx1ZSB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGUhKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJ7fSIsCisgICAgICAgICAgICBtYXRjaCAmc2VsZiB7CisgICAgICAgICAgICAgICAgU2VsZjo6RW5hYmxlZCA9PiAiZW5hYmxlZCIsCisgICAgICAgICAgICAgICAgU2VsZjo6RGlzYWJsZWQgPT4gImRpc2FibGVkIiwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKQorICAgIH0KK30KKworI1tkZXJpdmUoQ2xvbmUsIERlYnVnKV0KK3N0cnVjdCBGbGFnIHsKKyAgICBuYW1lc3BhY2U6IFN0cmluZywKKyAgICBuYW1lOiBTdHJpbmcsCisgICAgcGFja2FnZTogU3RyaW5nLAorICAgIGNvbnRhaW5lcjogU3RyaW5nLAorICAgIHZhbHVlOiBGbGFnVmFsdWUsCisgICAgc3RhZ2VkX3ZhbHVlOiBPcHRpb248RmxhZ1ZhbHVlPiwKKyAgICBwZXJtaXNzaW9uOiBGbGFnUGVybWlzc2lvbiwKKyAgICB2YWx1ZV9waWNrZWRfZnJvbTogVmFsdWVQaWNrZWRGcm9tLAorfQorCitpbXBsIEZsYWcgeworICAgIGZuIHF1YWxpZmllZF9uYW1lKCZzZWxmKSAtPiBTdHJpbmcgeworICAgICAgICBmb3JtYXQhKCJ7fS57fSIsIHNlbGYucGFja2FnZSwgc2VsZi5uYW1lKQorICAgIH0KKworICAgIGZuIGRpc3BsYXlfc3RhZ2VkX3ZhbHVlKCZzZWxmKSAtPiBTdHJpbmcgeworICAgICAgICBtYXRjaCBzZWxmLnN0YWdlZF92YWx1ZSB7CisgICAgICAgICAgICBTb21lKHYpID0+IGZvcm1hdCEoIigtPnt9KSIsIHYpLAorICAgICAgICAgICAgTm9uZSA9PiAiLSIudG9fc3RyaW5nKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKK3RyYWl0IEZsYWdTb3VyY2UgeworICAgIGZuIGxpc3RfZmxhZ3MoKSAtPiBSZXN1bHQ8VmVjPEZsYWc+PjsKKyAgICBmbiBvdmVycmlkZV9mbGFnKG5hbWVzcGFjZTogJnN0ciwgcXVhbGlmaWVkX25hbWU6ICZzdHIsIHZhbHVlOiAmc3RyKSAtPiBSZXN1bHQ8KCk+OworfQorCitlbnVtIEZsYWdTb3VyY2VUeXBlIHsKKyAgICBEZXZpY2VDb25maWcsCisgICAgQWNvbmZpZ1N0b3JhZ2UsCit9CisKK2NvbnN0IEFCT1VUX1RFWFQ6ICZzdHIgPSAiVG9vbCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBmbGFncy4KKworUm93cyBpbiB0aGUgdGFibGUgZnJvbSB0aGUgYGxpc3RgIGNvbW1hbmQgZm9sbG93IHRoaXMgZm9ybWF0OgorCisgIHBhY2thZ2UgZmxhZ19uYW1lIHZhbHVlIHByb3ZlbmFuY2UgcGVybWlzc2lvbiBjb250YWluZXIKKworICAqIGBwYWNrYWdlYDogcGFja2FnZSBzZXQgZm9yIHRoaXMgZmxhZyBpbiBpdHMgLmFjb25maWcgZGVmaW5pdGlvbi4KKyAgKiBgZmxhZ19uYW1lYDogZmxhZyBuYW1lLCBhbHNvIHNldCBpbiBkZWZpbml0aW9uLgorICAqIGB2YWx1ZWA6IHRoZSB2YWx1ZSByZWFkIGZyb20gdGhlIGZsYWcuCisgICogYHN0YWdlZF92YWx1ZWA6IHRoZSB2YWx1ZSBvbiBuZXh0IGJvb3Q6CisgICAgKyBgLWA6IHNhbWUgYXMgY3VycmVudCB2YWx1ZQorICAgICsgYCgtPmVuYWJsZWQpIGZsaXBwZWQgdG8gZW5hYmxlZCBvbiBib290LgorICAgICsgYCgtPmRpc2FibGVkKSBmbGlwcGVkIHRvIGRpc2FibGVkIG9uIGJvb3QuCisgICogYHByb3ZlbmFuY2VgOiBvbmUgb2Y6CisgICAgKyBgZGVmYXVsdGA6IHRoZSBmbGFnIHZhbHVlIGNvbWVzIGZyb20gaXRzIGJ1aWxkLXRpbWUgZGVmYXVsdC4KKyAgICArIGBzZXJ2ZXJgOiB0aGUgZmxhZyB2YWx1ZSBjb21lcyBmcm9tIGEgc2VydmVyIG92ZXJyaWRlLgorICAqIGBwZXJtaXNzaW9uYDogcmVhZC13cml0ZSBvciByZWFkLW9ubHkuCisgICogYGNvbnRhaW5lcmA6IHRoZSBjb250YWluZXIgZm9yIHRoZSBmbGFnLCBjb25maWd1cmVkIGluIGl0cyBkZWZpbml0aW9uLgorIjsKKworI1tkZXJpdmUoUGFyc2VyLCBEZWJ1ZyldCisjW2NsYXAobG9uZ19hYm91dD1BQk9VVF9URVhUKV0KK3N0cnVjdCBDbGkgeworICAgICNbY2xhcChzdWJjb21tYW5kKV0KKyAgICBjb21tYW5kOiBDb21tYW5kLAorfQorCisjW2Rlcml2ZShQYXJzZXIsIERlYnVnKV0KK2VudW0gQ29tbWFuZCB7CisgICAgLy8vIExpc3QgYWxsIGFjb25maWcgZmxhZ3Mgb24gdGhpcyBkZXZpY2UuCisgICAgTGlzdCB7CisgICAgICAgIC8vLyBSZWFkIGZyb20gdGhlIG5ldyBmbGFnIHN0b3JhZ2UuCisgICAgICAgICNbY2xhcChsb25nKV0KKyAgICAgICAgdXNlX25ld19zdG9yYWdlOiBib29sLAorCisgICAgICAgIC8vLyBPcHRpb25hbGx5IGZpbHRlciBieSBjb250YWluZXIgbmFtZS4KKyAgICAgICAgI1tjbGFwKHNob3J0ID0gJ2MnLCBsb25nID0gImNvbnRhaW5lciIpXQorICAgICAgICBjb250YWluZXI6IE9wdGlvbjxTdHJpbmc+LAorICAgIH0sCisKKyAgICAvLy8gRW5hYmxlIGFuIGFjb25maWcgZmxhZyBvbiB0aGlzIGRldmljZSwgb24gdGhlIG5leHQgYm9vdC4KKyAgICBFbmFibGUgeworICAgICAgICAvLy8gPHBhY2thZ2U+LjxmbGFnX25hbWU+CisgICAgICAgIHF1YWxpZmllZF9uYW1lOiBTdHJpbmcsCisgICAgfSwKKworICAgIC8vLyBEaXNhYmxlIGFuIGFjb25maWcgZmxhZyBvbiB0aGlzIGRldmljZSwgb24gdGhlIG5leHQgYm9vdC4KKyAgICBEaXNhYmxlIHsKKyAgICAgICAgLy8vIDxwYWNrYWdlPi48ZmxhZ19uYW1lPgorICAgICAgICBxdWFsaWZpZWRfbmFtZTogU3RyaW5nLAorICAgIH0sCit9CisKK3N0cnVjdCBQYWRkaW5nSW5mbyB7CisgICAgbG9uZ2VzdF9mbGFnX2NvbDogdXNpemUsCisgICAgbG9uZ2VzdF92YWxfY29sOiB1c2l6ZSwKKyAgICBsb25nZXN0X3N0YWdlZF92YWxfY29sOiB1c2l6ZSwKKyAgICBsb25nZXN0X3ZhbHVlX3BpY2tlZF9mcm9tX2NvbDogdXNpemUsCisgICAgbG9uZ2VzdF9wZXJtaXNzaW9uX2NvbDogdXNpemUsCit9CisKK3N0cnVjdCBGaWx0ZXIgeworICAgIGNvbnRhaW5lcjogT3B0aW9uPFN0cmluZz4sCit9CisKK2ltcGwgRmlsdGVyIHsKKyAgICBmbiBhcHBseSgmc2VsZiwgZmxhZ3M6ICZbRmxhZ10pIC0+IFZlYzxGbGFnPiB7CisgICAgICAgIGZsYWdzCisgICAgICAgICAgICAuaXRlcigpCisgICAgICAgICAgICAuZmlsdGVyKHxmbGFnfCBtYXRjaCAmc2VsZi5jb250YWluZXIgeworICAgICAgICAgICAgICAgIFNvbWUoYykgPT4gZmxhZy5jb250YWluZXIgPT0gKmMsCisgICAgICAgICAgICAgICAgTm9uZSA9PiB0cnVlLAorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5jbG9uZWQoKQorICAgICAgICAgICAgLmNvbGxlY3QoKQorICAgIH0KK30KKworZm4gZm9ybWF0X2ZsYWdfcm93KGZsYWc6ICZGbGFnLCBpbmZvOiAmUGFkZGluZ0luZm8pIC0+IFN0cmluZyB7CisgICAgbGV0IGZ1bGxfbmFtZSA9IGZsYWcucXVhbGlmaWVkX25hbWUoKTsKKyAgICBsZXQgcDAgPSBpbmZvLmxvbmdlc3RfZmxhZ19jb2wgKyAxOworCisgICAgbGV0IHZhbCA9IGZsYWcudmFsdWUudG9fc3RyaW5nKCk7CisgICAgbGV0IHAxID0gaW5mby5sb25nZXN0X3ZhbF9jb2wgKyAxOworCisgICAgbGV0IHN0YWdlZF92YWwgPSBmbGFnLmRpc3BsYXlfc3RhZ2VkX3ZhbHVlKCk7CisgICAgbGV0IHAyID0gaW5mby5sb25nZXN0X3N0YWdlZF92YWxfY29sICsgMTsKKworICAgIGxldCB2YWx1ZV9waWNrZWRfZnJvbSA9IGZsYWcudmFsdWVfcGlja2VkX2Zyb20udG9fc3RyaW5nKCk7CisgICAgbGV0IHAzID0gaW5mby5sb25nZXN0X3ZhbHVlX3BpY2tlZF9mcm9tX2NvbCArIDE7CisKKyAgICBsZXQgcGVybSA9IGZsYWcucGVybWlzc2lvbi50b19zdHJpbmcoKTsKKyAgICBsZXQgcDQgPSBpbmZvLmxvbmdlc3RfcGVybWlzc2lvbl9jb2wgKyAxOworCisgICAgbGV0IGNvbnRhaW5lciA9ICZmbGFnLmNvbnRhaW5lcjsKKworICAgIGZvcm1hdCEoCisgICAgICAgICJ7ZnVsbF9uYW1lOnAwJH17dmFsOnAxJH17c3RhZ2VkX3ZhbDpwMiR9e3ZhbHVlX3BpY2tlZF9mcm9tOnAzJH17cGVybTpwNCR9e2NvbnRhaW5lcn1cbiIKKyAgICApCit9CisKK2ZuIHNldF9mbGFnKHF1YWxpZmllZF9uYW1lOiAmc3RyLCB2YWx1ZTogJnN0cikgLT4gUmVzdWx0PCgpPiB7CisgICAgbGV0IGZsYWdzX2JpbmRpbmcgPSBEZXZpY2VDb25maWdTb3VyY2U6Omxpc3RfZmxhZ3MoKT87CisgICAgbGV0IGZsYWcgPSBmbGFnc19iaW5kaW5nLml0ZXIoKS5maW5kKHxmfCBmLnF1YWxpZmllZF9uYW1lKCkgPT0gcXVhbGlmaWVkX25hbWUpLm9rX29yKAorICAgICAgICBhbnlob3chKCJubyBhY29uZmlnIGZsYWcgJ3txdWFsaWZpZWRfbmFtZX0nLiBEb2VzIHRoZSBmbGFnIGhhdmUgYW4gLmFjb25maWcgZGVmaW5pdGlvbj8iKSwKKyAgICApPzsKKworICAgIGVuc3VyZSEoZmxhZy5wZXJtaXNzaW9uID09IEZsYWdQZXJtaXNzaW9uOjpSZWFkV3JpdGUsCisgICAgICAgICAgICBmb3JtYXQhKCJjb3VsZCBub3Qgd3JpdGUgZmxhZyAne3F1YWxpZmllZF9uYW1lfScsIGl0IGlzIHJlYWQtb25seSBmb3IgdGhlIGN1cnJlbnQgcmVsZWFzZSBjb25maWd1cmF0aW9uLiIpKTsKKworICAgIERldmljZUNvbmZpZ1NvdXJjZTo6b3ZlcnJpZGVfZmxhZygmZmxhZy5uYW1lc3BhY2UsIHF1YWxpZmllZF9uYW1lLCB2YWx1ZSk/OworCisgICAgT2soKCkpCit9CisKK2ZuIGxpc3Qoc291cmNlX3R5cGU6IEZsYWdTb3VyY2VUeXBlLCBjb250YWluZXI6IE9wdGlvbjxTdHJpbmc+KSAtPiBSZXN1bHQ8U3RyaW5nPiB7CisgICAgbGV0IGZsYWdzX3VuZmlsdGVyZWQgPSBtYXRjaCBzb3VyY2VfdHlwZSB7CisgICAgICAgIEZsYWdTb3VyY2VUeXBlOjpEZXZpY2VDb25maWcgPT4gRGV2aWNlQ29uZmlnU291cmNlOjpsaXN0X2ZsYWdzKCk/LAorICAgICAgICBGbGFnU291cmNlVHlwZTo6QWNvbmZpZ1N0b3JhZ2UgPT4gQWNvbmZpZ1N0b3JhZ2VTb3VyY2U6Omxpc3RfZmxhZ3MoKT8sCisgICAgfTsKKyAgICBsZXQgZmxhZ3MgPSAoRmlsdGVyIHsgY29udGFpbmVyIH0pLmFwcGx5KCZmbGFnc191bmZpbHRlcmVkKTsKKyAgICBsZXQgcGFkZGluZ19pbmZvID0gUGFkZGluZ0luZm8geworICAgICAgICBsb25nZXN0X2ZsYWdfY29sOiBmbGFncy5pdGVyKCkubWFwKHxmfCBmLnF1YWxpZmllZF9uYW1lKCkubGVuKCkpLm1heCgpLnVud3JhcF9vcigwKSwKKyAgICAgICAgbG9uZ2VzdF92YWxfY29sOiBmbGFncy5pdGVyKCkubWFwKHxmfCBmLnZhbHVlLnRvX3N0cmluZygpLmxlbigpKS5tYXgoKS51bndyYXBfb3IoMCksCisgICAgICAgIGxvbmdlc3Rfc3RhZ2VkX3ZhbF9jb2w6IGZsYWdzCisgICAgICAgICAgICAuaXRlcigpCisgICAgICAgICAgICAubWFwKHxmfCBmLmRpc3BsYXlfc3RhZ2VkX3ZhbHVlKCkubGVuKCkpCisgICAgICAgICAgICAubWF4KCkKKyAgICAgICAgICAgIC51bndyYXBfb3IoMCksCisgICAgICAgIGxvbmdlc3RfdmFsdWVfcGlja2VkX2Zyb21fY29sOiBmbGFncworICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgLm1hcCh8ZnwgZi52YWx1ZV9waWNrZWRfZnJvbS50b19zdHJpbmcoKS5sZW4oKSkKKyAgICAgICAgICAgIC5tYXgoKQorICAgICAgICAgICAgLnVud3JhcF9vcigwKSwKKyAgICAgICAgbG9uZ2VzdF9wZXJtaXNzaW9uX2NvbDogZmxhZ3MKKyAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgIC5tYXAofGZ8IGYucGVybWlzc2lvbi50b19zdHJpbmcoKS5sZW4oKSkKKyAgICAgICAgICAgIC5tYXgoKQorICAgICAgICAgICAgLnVud3JhcF9vcigwKSwKKyAgICB9OworCisgICAgbGV0IG11dCByZXN1bHQgPSBTdHJpbmc6OmZyb20oIiIpOworICAgIGZvciBmbGFnIGluIGZsYWdzIHsKKyAgICAgICAgbGV0IHJvdyA9IGZvcm1hdF9mbGFnX3JvdygmZmxhZywgJnBhZGRpbmdfaW5mbyk7CisgICAgICAgIHJlc3VsdC5wdXNoX3N0cigmcm93KTsKKyAgICB9CisgICAgT2socmVzdWx0KQorfQorCitmbiBtYWluKCkgLT4gUmVzdWx0PCgpPiB7CisgICAgZW5zdXJlIShuaXg6OnVuaXN0ZDo6VWlkOjpjdXJyZW50KCkuaXNfcm9vdCgpLCAibXVzdCBiZSByb290Iik7CisKKyAgICBsZXQgY2xpID0gQ2xpOjpwYXJzZSgpOworICAgIGxldCBvdXRwdXQgPSBtYXRjaCBjbGkuY29tbWFuZCB7CisgICAgICAgIENvbW1hbmQ6Okxpc3QgeyB1c2VfbmV3X3N0b3JhZ2U6IHRydWUsIGNvbnRhaW5lciB9ID0+IHsKKyAgICAgICAgICAgIGxpc3QoRmxhZ1NvdXJjZVR5cGU6OkFjb25maWdTdG9yYWdlLCBjb250YWluZXIpLm1hcChTb21lKQorICAgICAgICB9CisgICAgICAgIENvbW1hbmQ6Okxpc3QgeyB1c2VfbmV3X3N0b3JhZ2U6IGZhbHNlLCBjb250YWluZXIgfSA9PiB7CisgICAgICAgICAgICBsaXN0KEZsYWdTb3VyY2VUeXBlOjpEZXZpY2VDb25maWcsIGNvbnRhaW5lcikubWFwKFNvbWUpCisgICAgICAgIH0KKyAgICAgICAgQ29tbWFuZDo6RW5hYmxlIHsgcXVhbGlmaWVkX25hbWUgfSA9PiBzZXRfZmxhZygmcXVhbGlmaWVkX25hbWUsICJ0cnVlIikubWFwKHxffCBOb25lKSwKKyAgICAgICAgQ29tbWFuZDo6RGlzYWJsZSB7IHF1YWxpZmllZF9uYW1lIH0gPT4gc2V0X2ZsYWcoJnF1YWxpZmllZF9uYW1lLCAiZmFsc2UiKS5tYXAofF98IE5vbmUpLAorICAgIH07CisgICAgbWF0Y2ggb3V0cHV0IHsKKyAgICAgICAgT2soU29tZSh0ZXh0KSkgPT4gcHJpbnRsbiEoInt0ZXh0fSIpLAorICAgICAgICBPayhOb25lKSA9PiAoKSwKKyAgICAgICAgRXJyKG1lc3NhZ2UpID0+IHByaW50bG4hKCJFcnJvcjoge21lc3NhZ2V9IiksCisgICAgfQorCisgICAgT2soKCkpCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9maWx0ZXJfY29udGFpbmVyKCkgeworICAgICAgICBsZXQgZmxhZ3MgPSB2ZWMhWworICAgICAgICAgICAgRmxhZyB7CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiAibmFtZXNwYWNlIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBuYW1lOiAidGVzdDEiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHBhY2thZ2U6ICJwYWNrYWdlIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICB2YWx1ZTogRmxhZ1ZhbHVlOjpEaXNhYmxlZCwKKyAgICAgICAgICAgICAgICBzdGFnZWRfdmFsdWU6IE5vbmUsCisgICAgICAgICAgICAgICAgcGVybWlzc2lvbjogRmxhZ1Blcm1pc3Npb246OlJlYWRXcml0ZSwKKyAgICAgICAgICAgICAgICB2YWx1ZV9waWNrZWRfZnJvbTogVmFsdWVQaWNrZWRGcm9tOjpEZWZhdWx0LAorICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogInN5c3RlbSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZyB7CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiAibmFtZXNwYWNlIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBuYW1lOiAidGVzdDIiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHBhY2thZ2U6ICJwYWNrYWdlIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICB2YWx1ZTogRmxhZ1ZhbHVlOjpEaXNhYmxlZCwKKyAgICAgICAgICAgICAgICBzdGFnZWRfdmFsdWU6IE5vbmUsCisgICAgICAgICAgICAgICAgcGVybWlzc2lvbjogRmxhZ1Blcm1pc3Npb246OlJlYWRXcml0ZSwKKyAgICAgICAgICAgICAgICB2YWx1ZV9waWNrZWRfZnJvbTogVmFsdWVQaWNrZWRGcm9tOjpEZWZhdWx0LAorICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogIm5vdF9zeXN0ZW0iLnRvX3N0cmluZygpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWcgeworICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogIm5hbWVzcGFjZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgbmFtZTogInRlc3QzIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBwYWNrYWdlOiAicGFja2FnZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgdmFsdWU6IEZsYWdWYWx1ZTo6RGlzYWJsZWQsCisgICAgICAgICAgICAgICAgc3RhZ2VkX3ZhbHVlOiBOb25lLAorICAgICAgICAgICAgICAgIHBlcm1pc3Npb246IEZsYWdQZXJtaXNzaW9uOjpSZWFkV3JpdGUsCisgICAgICAgICAgICAgICAgdmFsdWVfcGlja2VkX2Zyb206IFZhbHVlUGlja2VkRnJvbTo6RGVmYXVsdCwKKyAgICAgICAgICAgICAgICBjb250YWluZXI6ICJzeXN0ZW0iLnRvX3N0cmluZygpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXEhKChGaWx0ZXIgeyBjb250YWluZXI6IFNvbWUoInN5c3RlbSIudG9fc3RyaW5nKCkpIH0pLmFwcGx5KCZmbGFncykubGVuKCksIDIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZpbHRlcl9ub19jb250YWluZXIoKSB7CisgICAgICAgIGxldCBmbGFncyA9IHZlYyFbCisgICAgICAgICAgICBGbGFnIHsKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2U6ICJuYW1lc3BhY2UiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIG5hbWU6ICJ0ZXN0MSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgcGFja2FnZTogInBhY2thZ2UiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHZhbHVlOiBGbGFnVmFsdWU6OkRpc2FibGVkLAorICAgICAgICAgICAgICAgIHN0YWdlZF92YWx1ZTogTm9uZSwKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uOiBGbGFnUGVybWlzc2lvbjo6UmVhZFdyaXRlLAorICAgICAgICAgICAgICAgIHZhbHVlX3BpY2tlZF9mcm9tOiBWYWx1ZVBpY2tlZEZyb206OkRlZmF1bHQsCisgICAgICAgICAgICAgICAgY29udGFpbmVyOiAic3lzdGVtIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBGbGFnIHsKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2U6ICJuYW1lc3BhY2UiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIG5hbWU6ICJ0ZXN0MiIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgcGFja2FnZTogInBhY2thZ2UiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHZhbHVlOiBGbGFnVmFsdWU6OkRpc2FibGVkLAorICAgICAgICAgICAgICAgIHN0YWdlZF92YWx1ZTogTm9uZSwKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uOiBGbGFnUGVybWlzc2lvbjo6UmVhZFdyaXRlLAorICAgICAgICAgICAgICAgIHZhbHVlX3BpY2tlZF9mcm9tOiBWYWx1ZVBpY2tlZEZyb206OkRlZmF1bHQsCisgICAgICAgICAgICAgICAgY29udGFpbmVyOiAibm90X3N5c3RlbSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZyB7CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiAibmFtZXNwYWNlIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBuYW1lOiAidGVzdDMiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHBhY2thZ2U6ICJwYWNrYWdlIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICB2YWx1ZTogRmxhZ1ZhbHVlOjpEaXNhYmxlZCwKKyAgICAgICAgICAgICAgICBzdGFnZWRfdmFsdWU6IE5vbmUsCisgICAgICAgICAgICAgICAgcGVybWlzc2lvbjogRmxhZ1Blcm1pc3Npb246OlJlYWRXcml0ZSwKKyAgICAgICAgICAgICAgICB2YWx1ZV9waWNrZWRfZnJvbTogVmFsdWVQaWNrZWRGcm9tOjpEZWZhdWx0LAorICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogInN5c3RlbSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICB9LAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcSEoKEZpbHRlciB7IGNvbnRhaW5lcjogTm9uZSB9KS5hcHBseSgmZmxhZ3MpLmxlbigpLCAzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTY2YmY5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvQW5kcm9pZC5icApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworamF2YV9saWJyYXJ5IHsKKwluYW1lOiAiZmFrZV9kZXZpY2VfY29uZmlnIiwKKwlzcmNzOiBbInNyYy8qKi8qLmphdmEiXSwKKwlzZGtfdmVyc2lvbjogIm5vbmUiLAorCXN5c3RlbV9tb2R1bGVzOiAiY29yZS1hbGwtc3lzdGVtLW1vZHVsZXMiLAorCWhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorfQorCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9wcm92aWRlci9EZXZpY2VDb25maWcuamF2YSBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL0RldmljZUNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjA3YWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9wcm92aWRlci9EZXZpY2VDb25maWcuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOworCisvKgorICogVGhpcyBjbGFzcyBhbGxvd3MgZ2VuZXJhdGVkIGFjb25maWcgY29kZSB0byBjb21waWxlIGluZGVwZW5kZW50bHkgb2YgdGhlIGZyYW1ld29yay4KKyAqLworcHVibGljIGNsYXNzIERldmljZUNvbmZpZyB7CisJcHJpdmF0ZSBEZXZpY2VDb25maWcoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWYpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZy4uLiBuYW1lcykgeworCQlyZXR1cm4gbmV3IFByb3BlcnRpZXMoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BlcnRpZXMgeworCQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lLCBib29sZWFuIGRlZikgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9vdmVycmlkZWZsYWdzL292ZXJyaWRlZmxhZ3MucHkgYi90b29scy9hY29uZmlnL292ZXJyaWRlZmxhZ3Mvb3ZlcnJpZGVmbGFncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzU1YzIxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9vdmVycmlkZWZsYWdzL292ZXJyaWRlZmxhZ3MucHkKQEAgLTAsMCArMSwxMjcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisiIiJDcmVhdGUgQWNvbmZpZyB2YWx1ZSBidWlsZGluZyBydWxlcy4KKworVGhpcyBzY3JpcHQgd2lsbCBoZWxwIHRvIGNyZWF0ZSBBY29uZmlnIGZsYWcgdmFsdWUgYnVpbGRpbmcgcnVsZXMuIEl0IHdpbGwKK3BhcnNlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiB0aGUgdmFsdWUgZmlsZSB0byBjcmVhdGUgdGhlIGJ1aWxkaW5nIHJ1bGVzLCBidXQKK2l0IHdpbGwgbm90IHZhbGlkYXRlIHRoZSB2YWx1ZSBmaWxlLiBUaGUgdmFsaWRhdGlvbiB3aWxsIGRlZmVyIHRvIHRoZSBidWlsZGluZworc3lzdGVtLgorIiIiCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHBhdGhsaWIKK2ltcG9ydCByZQoraW1wb3J0IHN5cworCisKK19WQUxVRV9MSVNUX1RFTVBMQVRFOiBzdHIgPSAiIiIKK0FDT05GSUdfVkFMVUVTX0xJU1RfTE9DQUwgPSBbe31dCisiIiIKKworX0FDT05GSUdfVkFMVUVTX1RFTVBMQVRFOiBzdHIgPSAiIiIKK2Fjb25maWdfdmFsdWVzIHt7CisgICAgbmFtZTogInt9IiwKKyAgICBwYWNrYWdlOiAie30iLAorICAgIHNyY3M6IFsKKyAgICAgICAgInt9IiwKKyAgICBdCit9fQorIiIiCisKK19BQ09ORklHX1ZBTFVFU19OQU1FX1NVRkZJWDogc3RyID0gImFjb25maWctbG9jYWwtb3ZlcnJpZGUte30iCisKK19QQUNLQUdFX1JFR0VYID0gcmUuY29tcGlsZShyIl5wYWNrYWdlXDpccypcIihbXHdcZFwuXSspXCIiKQorX0FORFJPSURfQlBfRklMRV9OQU1FID0gciJBbmRyb2lkLmJwIgorCisKK2RlZiBfcGFyc2VfcGFja2FnZXMoZmlsZTogcGF0aGxpYi5QYXRoKSAtPiBzZXRbc3RyXToKKyAgcGFja2FnZXMgPSBzZXQoKQorICB3aXRoIG9wZW4oZmlsZSkgYXMgZjoKKyAgICBmb3IgbGluZSBpbiBmOgorICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgcGFja2FnZV9tYXRjaCA9IF9QQUNLQUdFX1JFR0VYLm1hdGNoKGxpbmUpCisgICAgICBpZiBwYWNrYWdlX21hdGNoIGlzIE5vbmU6CisgICAgICAgIGNvbnRpbnVlCisgICAgICBwYWNrYWdlX25hbWUgPSBwYWNrYWdlX21hdGNoLmdyb3VwKDEpCisgICAgICBwYWNrYWdlcy5hZGQocGFja2FnZV9uYW1lKQorCisgIHJldHVybiBwYWNrYWdlcworCisKK2RlZiBfY3JlYXRlX2FuZHJvaWRfYnAocGFja2FnZXM6IHNldFtzdHJdLCBmaWxlX25hbWU6IHN0cikgLT4gc3RyOgorICBhbmRyb2lkX2JwID0gIiIKKyAgdmFsdWVfbGlzdCA9ICIsXG4gICAgIi5qb2luKAorICAgICAgbWFwKGYnIntfQUNPTkZJR19WQUxVRVNfTkFNRV9TVUZGSVh9IicuZm9ybWF0LCBwYWNrYWdlcykKKyAgKQorICBpZiB2YWx1ZV9saXN0OgorICAgIHZhbHVlX2xpc3QgPSAiXG4gICAgIiArIHZhbHVlX2xpc3QgKyAiXG4iCisgIGFuZHJvaWRfYnAgKz0gX1ZBTFVFX0xJU1RfVEVNUExBVEUuZm9ybWF0KHZhbHVlX2xpc3QpICsgIlxuIgorCisgIGZvciBwYWNrYWdlIGluIHBhY2thZ2VzOgorICAgIGFuZHJvaWRfYnAgKz0gX0FDT05GSUdfVkFMVUVTX1RFTVBMQVRFLmZvcm1hdCgKKyAgICAgICAgX0FDT05GSUdfVkFMVUVTX05BTUVfU1VGRklYLmZvcm1hdChwYWNrYWdlKSwgcGFja2FnZSwgZmlsZV9uYW1lCisgICAgKQorICAgIGFuZHJvaWRfYnAgKz0gIlxuIgorCisgIHJldHVybiBhbmRyb2lkX2JwCisKKworZGVmIF93cml0ZV9hbmRyb2lkX2JwKG5ld19hbmRyb2lkX2JwOiBzdHIsIG91dDogcGF0aGxpYi5QYXRoKSAtPiBOb25lOgorICBpZiBub3Qgb3V0LmlzX2RpcigpOgorICAgIG91dC5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisKKyAgb3V0cHV0ID0gb3V0LmpvaW5wYXRoKF9BTkRST0lEX0JQX0ZJTEVfTkFNRSkKKyAgd2l0aCBvcGVuKG91dHB1dCwgInIrIiwgZW5jb2Rpbmc9InV0ZjgiKSBhcyBmaWxlOgorICAgIGxpbmVzID0gW10KKyAgICBmb3IgbGluZSBpbiBmaWxlOgorICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCJcbiIpCisgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIkFDT05GSUdfVkFMVUVTX0xJU1RfTE9DQUwiKToKKyAgICAgICAgYnJlYWsKKyAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICMgT3ZlcndyaXRlIHRoZSBmaWxlIHdpdGggdGhlIHVwZGF0ZWQgY29udGVudHMuCisgICAgZmlsZS5zZWVrKDApCisgICAgZmlsZS50cnVuY2F0ZSgpCisgICAgZmlsZS53cml0ZSgiXG4iLmpvaW4obGluZXMpKQorICAgIGZpbGUud3JpdGUobmV3X2FuZHJvaWRfYnApCisKKworZGVmIG1haW4oYXJncyk6CisgICIiIlByb2dyYW0gZW50cnkgcG9pbnQuIiIiCisgIGFyZ3NfcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICBhcmdzX3BhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAiLS1vdmVycmlkZXMiLAorICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgIGhlbHA9IlRoZSBwYXRoIHRvIG92ZXJyaWRlIGZpbGUuIiwKKyAgKQorICBhcmdzX3BhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAiLS1vdXQiLAorICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgIGhlbHA9IlRoZSBwYXRoIHRvIG91dHB1dCBkaXJlY3RvcnkuIiwKKyAgKQorCisgIGFyZ3MgPSBhcmdzX3BhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisgIGZpbGUgPSBwYXRobGliLlBhdGgoYXJncy5vdmVycmlkZXMpCisgIG91dCA9IHBhdGhsaWIuUGF0aChhcmdzLm91dCkKKyAgaWYgbm90IGZpbGUuaXNfZmlsZSgpOgorICAgIHJhaXNlIEZpbGVOb3RGb3VuZEVycm9yKGYiRmlsZSAne2ZpbGV9JyBpcyBub3QgZm91bmQiKQorCisgIHBhY2thZ2VzID0gX3BhcnNlX3BhY2thZ2VzKGZpbGUpCisgIG5ld19hbmRyb2lkX2JwID0gX2NyZWF0ZV9hbmRyb2lkX2JwKHBhY2thZ2VzLCBmaWxlLm5hbWUpCisgIF93cml0ZV9hbmRyb2lkX2JwKG5ld19hbmRyb2lkX2JwLCBvdXQpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgbWFpbihzeXMuYXJndlsxOl0pCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL3ByaW50ZmxhZ3MvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvcHJpbnRmbGFncy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MGE3N2QKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL3ByaW50ZmxhZ3MvQW5kcm9pZC5icApAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK3J1c3RfZGVmYXVsdHMgeworICAgIG5hbWU6ICJwcmludGZsYWdzLmRlZmF1bHRzIiwKKyAgICBlZGl0aW9uOiAiMjAyMSIsCisgICAgY2xpcHB5X2xpbnRzOiAiYW5kcm9pZCIsCisgICAgbGludHM6ICJhbmRyb2lkIiwKKyAgICBzcmNzOiBbInNyYy9tYWluLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfcHJvdG9zIiwKKyAgICAgICAgImxpYmFueWhvdyIsCisgICAgICAgICJsaWJwcm90b2J1ZiIsCisgICAgICAgICJsaWJyZWdleCIsCisgICAgXSwKK30KKworcnVzdF9iaW5hcnkgeworICAgIG5hbWU6ICJwcmludGZsYWdzIiwKKyAgICBkZWZhdWx0czogWyJwcmludGZsYWdzLmRlZmF1bHRzIl0sCit9CisKK3J1c3RfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAicHJpbnRmbGFncy50ZXN0IiwKKyAgICBkZWZhdWx0czogWyJwcmludGZsYWdzLmRlZmF1bHRzIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9wcmludGZsYWdzL0NhcmdvLnRvbWwgYi90b29scy9hY29uZmlnL3ByaW50ZmxhZ3MvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzEzZjVkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9wcmludGZsYWdzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxNSBAQAorW3BhY2thZ2VdCituYW1lID0gInByaW50ZmxhZ3MiCit2ZXJzaW9uID0gIjAuMS4wIgorZWRpdGlvbiA9ICIyMDIxIgorCitbZmVhdHVyZXNdCitkZWZhdWx0ID0gWyJjYXJnbyJdCitjYXJnbyA9IFtdCisKK1tkZXBlbmRlbmNpZXNdCithbnlob3cgPSAiMS4wLjY5IgorcGFzdGUgPSAiMS4wLjExIgorcHJvdG9idWYgPSAiMy4yLjAiCityZWdleCA9ICIxLjEwLjMiCithY29uZmlnX3Byb3RvcyA9IHsgcGF0aCA9ICIuLi9hY29uZmlnX3Byb3RvcyIgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9wcmludGZsYWdzL3NyYy9tYWluLnJzIGIvdG9vbHMvYWNvbmZpZy9wcmludGZsYWdzL3NyYy9tYWluLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzhiNTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL3ByaW50ZmxhZ3Mvc3JjL21haW4ucnMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYHByaW50ZmxhZ3NgIGlzIGEgZGV2aWNlIGJpbmFyeSB0byBwcmludCBmZWF0dXJlIGZsYWdzLgorCit1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvRmxhZ1N0YXRlIGFzIFN0YXRlOwordXNlIGFjb25maWdfcHJvdG9zOjpQcm90b1BhcnNlZEZsYWdzOwordXNlIGFueWhvdzo6e2JhaWwsIENvbnRleHQsIFJlc3VsdH07Cit1c2UgcmVnZXg6OlJlZ2V4OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OkJUcmVlTWFwOwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpwcm9jZXNzOjpDb21tYW5kOwordXNlIHN0ZDo6e2ZzLCBzdHJ9OworCitmbiBwYXJzZV9kZXZpY2VfY29uZmlnKHJhdzogJnN0cikgLT4gSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4geworICAgIGxldCBtdXQgZmxhZ3MgPSBIYXNoTWFwOjpuZXcoKTsKKyAgICBsZXQgcmVnZXggPSBSZWdleDo6bmV3KHIiKD9tKV4oW1tbOmFsbnVtOl1dX10rL1tbWzphbG51bTpdXV9cLl0rKT0odHJ1ZXxmYWxzZSkkIikudW53cmFwKCk7CisgICAgZm9yIGNhcHR1cmUgaW4gcmVnZXguY2FwdHVyZXNfaXRlcihyYXcpIHsKKyAgICAgICAgbGV0IGtleSA9IGNhcHR1cmUuZ2V0KDEpLnVud3JhcCgpLmFzX3N0cigpLnRvX3N0cmluZygpOworICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBjYXB0dXJlLmdldCgyKS51bndyYXAoKS5hc19zdHIoKSB7CisgICAgICAgICAgICAidHJ1ZSIgPT4gZm9ybWF0ISgiezo/fSAoZGV2aWNlX2NvbmZpZykiLCBTdGF0ZTo6RU5BQkxFRCksCisgICAgICAgICAgICAiZmFsc2UiID0+IGZvcm1hdCEoIns6P30gKGRldmljZV9jb25maWcpIiwgU3RhdGU6OkRJU0FCTEVEKSwKKyAgICAgICAgICAgIF8gPT4gcGFuaWMhKCksCisgICAgICAgIH07CisgICAgICAgIGZsYWdzLmluc2VydChrZXksIHZhbHVlKTsKKyAgICB9CisgICAgZmxhZ3MKK30KKworZm4geHhkKGJ5dGVzOiAmW3U4XSkgLT4gU3RyaW5nIHsKKyAgICBsZXQgbiA9IDgubWluKGJ5dGVzLmxlbigpKTsKKyAgICBsZXQgbXV0IHYgPSBWZWM6OndpdGhfY2FwYWNpdHkobik7CisgICAgZm9yIGJ5dGUgaW4gYnl0ZXMuaXRlcigpLnRha2UobikgeworICAgICAgICB2LnB1c2goZm9ybWF0ISgiezowMnh9IiwgYnl0ZSkpOworICAgIH0KKyAgICBsZXQgdHJhaWxlciA9IG1hdGNoIGJ5dGVzLmxlbigpIHsKKyAgICAgICAgMC4uPTggPT4gIiIsCisgICAgICAgIF8gPT4gIiAuLiIsCisgICAgfTsKKyAgICBmb3JtYXQhKCJbe317fV0iLCB2LmpvaW4oIiAiKSwgdHJhaWxlcikKK30KKworZm4gbWFpbigpIC0+IFJlc3VsdDwoKT4geworICAgIC8vIHJlYWQgZGV2aWNlX2NvbmZpZworICAgIGxldCBvdXRwdXQgPSBDb21tYW5kOjpuZXcoIi9zeXN0ZW0vYmluL2RldmljZV9jb25maWciKS5hcmcoImxpc3QiKS5vdXRwdXQoKT87CisgICAgaWYgIW91dHB1dC5zdGF0dXMuc3VjY2VzcygpIHsKKyAgICAgICAgbGV0IHJlYXNvbiA9IG1hdGNoIG91dHB1dC5zdGF0dXMuY29kZSgpIHsKKyAgICAgICAgICAgIFNvbWUoY29kZSkgPT4gZm9ybWF0ISgiZXhpdCBjb2RlIHt9IiwgY29kZSksCisgICAgICAgICAgICBOb25lID0+ICJ0ZXJtaW5hdGVkIGJ5IHNpZ25hbCIudG9fc3RyaW5nKCksCisgICAgICAgIH07CisgICAgICAgIGJhaWwhKCJmYWlsZWQgdG8gZXhlY3V0ZSBkZXZpY2VfY29uZmlnOiB7fSIsIHJlYXNvbik7CisgICAgfQorICAgIGxldCBkY19zdGRvdXQgPSBzdHI6OmZyb21fdXRmOCgmb3V0cHV0LnN0ZG91dCk/OworICAgIGxldCBkZXZpY2VfY29uZmlnX2ZsYWdzID0gcGFyc2VfZGV2aWNlX2NvbmZpZyhkY19zdGRvdXQpOworCisgICAgLy8gcmVhZCBhY29uZmlnX2ZsYWdzLnBiIGZpbGVzCisgICAgbGV0IGFwZXhfcGF0dGVybiA9IFJlZ2V4OjpuZXcociJeL2FwZXgvW15AXStcLlteQF0rJCIpLnVud3JhcCgpOworICAgIGxldCBtdXQgbW91bnRfcG9pbnRzID0gdmVjIVsKKyAgICAgICAgInN5c3RlbSIudG9fc3RyaW5nKCksCisgICAgICAgICJzeXN0ZW1fZXh0Ii50b19zdHJpbmcoKSwKKyAgICAgICAgInByb2R1Y3QiLnRvX3N0cmluZygpLAorICAgICAgICAidmVuZG9yIi50b19zdHJpbmcoKSwKKyAgICBdOworICAgIGZvciBhcGV4IGluIGZzOjpyZWFkX2RpcigiL2FwZXgiKT8geworICAgICAgICBsZXQgcGF0aF9uYW1lID0gYXBleD8ucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKyAgICAgICAgaWYgbGV0IFNvbWUoY2Fub25pY2FsX3BhdGgpID0gYXBleF9wYXR0ZXJuLmNhcHR1cmVzKCZwYXRoX25hbWUpIHsKKyAgICAgICAgICAgIG1vdW50X3BvaW50cy5wdXNoKGNhbm9uaWNhbF9wYXRoLmdldCgwKS51bndyYXAoKS5hc19zdHIoKS50b19vd25lZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxldCBtdXQgZmxhZ3M6IEJUcmVlTWFwPFN0cmluZywgVmVjPFN0cmluZz4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgIGZvciBtb3VudF9wb2ludCBpbiBtb3VudF9wb2ludHMgeworICAgICAgICBsZXQgcGF0aCA9IGZvcm1hdCEoIi97fS9ldGMvYWNvbmZpZ19mbGFncy5wYiIsIG1vdW50X3BvaW50KTsKKyAgICAgICAgbGV0IE9rKGJ5dGVzKSA9IGZzOjpyZWFkKCZwYXRoKSBlbHNlIHsKKyAgICAgICAgICAgIGVwcmludGxuISgid2FybmluZzogZmFpbGVkIHRvIHJlYWQge30iLCBwYXRoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9OworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzOiBQcm90b1BhcnNlZEZsYWdzID0gcHJvdG9idWY6Ok1lc3NhZ2U6OnBhcnNlX2Zyb21fYnl0ZXMoJmJ5dGVzKQorICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCB7CisgICAgICAgICAgICAgICAgZm9ybWF0ISgiZmFpbGVkIHRvIHBhcnNlIHt9ICh7fSwge30gYnl0ZShzKSkiLCBwYXRoLCB4eGQoJmJ5dGVzKSwgYnl0ZXMubGVuKCkpCisgICAgICAgICAgICB9KT87CisgICAgICAgIGZvciBmbGFnIGluIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZyB7CisgICAgICAgICAgICBsZXQga2V5ID0gZm9ybWF0ISgie30ve30ue30iLCBmbGFnLm5hbWVzcGFjZSgpLCBmbGFnLnBhY2thZ2UoKSwgZmxhZy5uYW1lKCkpOworICAgICAgICAgICAgbGV0IHZhbHVlID0gZm9ybWF0ISgiezo/fSArIHs6P30gKHt9KSIsIGZsYWcucGVybWlzc2lvbigpLCBmbGFnLnN0YXRlKCksIG1vdW50X3BvaW50KTsKKyAgICAgICAgICAgIGZsYWdzLmVudHJ5KGtleSkub3JfZGVmYXVsdCgpLnB1c2godmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcHJpbnQgZmxhZ3MKKyAgICBmb3IgKGtleSwgbXV0IHZhbHVlKSBpbiBmbGFncyB7CisgICAgICAgIGlmIGxldCBTb21lKGRjX3ZhbHVlKSA9IGRldmljZV9jb25maWdfZmxhZ3MuZ2V0KCZrZXkpIHsKKyAgICAgICAgICAgIHZhbHVlLnB1c2goZGNfdmFsdWUudG9fc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHByaW50bG4hKCJ7fToge30iLCBrZXksIHZhbHVlLmpvaW4oIiwgIikpOworICAgIH0KKworICAgIE9rKCgpKQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZGV2aWNlX2NvbmZpZygpIHsKKyAgICAgICAgbGV0IGlucHV0ID0gciMiCituYW1lc3BhY2Vfb25lL2NvbS5mb28uYmFyLmZsYWdfb25lPXRydWUKK25hbWVzcGFjZV9vbmUvY29tLmZvby5iYXIuZmxhZ190d289ZmFsc2UKK3JhbmRvbV9ub2lzZTsKK25hbWVzcGFjZV90d28vYW5kcm9pZC5mbGFnX29uZT10cnVlCituYW1lc3BhY2VfdHdvL2FuZHJvaWQuZmxhZ190d289bm9uc2Vuc2UKKyIjOworICAgICAgICBsZXQgZXhwZWN0ZWQgPSBIYXNoTWFwOjpmcm9tKFsKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAibmFtZXNwYWNlX29uZS9jb20uZm9vLmJhci5mbGFnX29uZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgIkVOQUJMRUQgKGRldmljZV9jb25maWcpIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgIm5hbWVzcGFjZV9vbmUvY29tLmZvby5iYXIuZmxhZ190d28iLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgICJESVNBQkxFRCAoZGV2aWNlX2NvbmZpZykiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgibmFtZXNwYWNlX3R3by9hbmRyb2lkLmZsYWdfb25lIi50b19zdHJpbmcoKSwgIkVOQUJMRUQgKGRldmljZV9jb25maWcpIi50b19zdHJpbmcoKSksCisgICAgICAgIF0pOworICAgICAgICBsZXQgYWN0dWFsID0gcGFyc2VfZGV2aWNlX2NvbmZpZyhpbnB1dCk7CisgICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfeHhkKCkgeworICAgICAgICBsZXQgaW5wdXQgPSBbMHgwLCAweDEsIDB4MiwgMHgzLCAweDQsIDB4NSwgMHg2LCAweDcsIDB4OCwgMHg5XTsKKyAgICAgICAgYXNzZXJ0X2VxISgiW10iLCAmeHhkKCZpbnB1dFswLi4wXSkpOworICAgICAgICBhc3NlcnRfZXEhKCJbMDBdIiwgJnh4ZCgmaW5wdXRbMC4uMV0pKTsKKyAgICAgICAgYXNzZXJ0X2VxISgiWzAwIDAxXSIsICZ4eGQoJmlucHV0WzAuLjJdKSk7CisgICAgICAgIGFzc2VydF9lcSEoIlswMCAwMSAwMiAwMyAwNCAwNSAwNl0iLCAmeHhkKCZpbnB1dFswLi43XSkpOworICAgICAgICBhc3NlcnRfZXEhKCJbMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDddIiwgJnh4ZCgmaW5wdXRbMC4uOF0pKTsKKyAgICAgICAgYXNzZXJ0X2VxISgiWzAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IC4uXSIsICZ4eGQoJmlucHV0WzAuLjldKSk7CisgICAgICAgIGFzc2VydF9lcSEoIlswMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAuLl0iLCAmeHhkKCZpbnB1dCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvcnVzdGZtdC50b21sIGIvdG9vbHMvYWNvbmZpZy9ydXN0Zm10LnRvbWwKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjkxZTk5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvcnVzdGZtdC50b21sCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL3Nvb25nL3NjcmlwdHMvcnVzdGZtdC50b21sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWcucHkgYi90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZy5weQppbmRleCBjZTY0MTYwLi44ZWU1OTlhIDEwMDc1NQotLS0gYS90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZy5weQorKysgYi90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZy5weQpAQCAtMTcsNiArMTcsOCBAQAogIiIiQSB0b29sIHRvIGdlbmVyYXRlIFRyYWRlRmVkIHRlc3QgY29uZmlnIGZpbGUuCiAiIiIKIAoraW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgcmUKIGltcG9ydCBvcwogaW1wb3J0IHNodXRpbAogaW1wb3J0IHN5cwpAQCAtNDIsNDIgKzQ0LDg1IEBACiAgIFJldHVybnM6CiAgICAgMCBpZiBubyBlcnJvciwgb3RoZXJ3aXNlIDEuCiAgICIiIgotICBpZiBsZW4oYXJndikgIT0gNCBhbmQgbGVuKGFyZ3YpICE9IDY6Ci0gICAgc3lzLnN0ZGVyci53cml0ZSgKLSAgICAgICAgJ0ludmFsaWQgYXJndW1lbnRzLiBUaGUgc2NyaXB0IHJlcXVpcmVzIDQgYXJndW1lbnRzIGZvciBmaWxlIHBhdGhzOiAnCi0gICAgICAgICd0YXJnZXRfY29uZmlnIGFuZHJvaWRfbWFuaWZlc3QgZW1wdHlfY29uZmlnICcKLSAgICAgICAgJ2luc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZSAnCi0gICAgICAgICdhbmQgMiBvcHRpb25hbCBhcmd1bWVudHMgZm9yIGV4dHJhIGNvbmZpZ3M6ICcKLSAgICAgICAgJy0tZXh0cmEtY29uZmlncyBcJ0VYVFJBX0NPTkZJR1NcJy5cbicpCi0gICAgcmV0dXJuIDEKIAotICB0YXJnZXRfY29uZmlnID0gYXJndlswXQotICBhbmRyb2lkX21hbmlmZXN0ID0gYXJndlsxXQotICBlbXB0eV9jb25maWcgPSBhcmd2WzJdCi0gIGluc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZSA9IGFyZ3ZbM10KLSAgZXh0cmFfY29uZmlncyA9ICdcbicuam9pbihhcmd2WzVdLnNwbGl0KCdcXG4nKSkgaWYgbGVuKGFyZ3YpID09IDYgZWxzZSAnJworICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAidGFyZ2V0X2NvbmZpZyIsCisgICAgICBoZWxwPSJQYXRoIHRvIHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGNvbmZpZy4iKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgImFuZHJvaWRfbWFuaWZlc3QiLAorICAgICAgaGVscD0iUGF0aCB0byBBbmRyb2lkTWFuaWZlc3QueG1sIG9yIG91dHB1dCBvZiAnYWFwdDIgZHVtcCB4bWx0cmVlJyB3aXRoIC54bWx0cmVlIGV4dGVuc2lvbi4iKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgImVtcHR5X2NvbmZpZyIsCisgICAgICBoZWxwPSJQYXRoIHRvIHRoZSBlbXB0eSBjb25maWcgdGVtcGxhdGUuIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICJpbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGUiLAorICAgICAgaGVscD0iUGF0aCB0byB0aGUgaW5zdHJ1bWVudGF0aW9uIHRlc3QgY29uZmlnIHRlbXBsYXRlLiIpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZXh0cmEtY29uZmlncyIsIGRlZmF1bHQ9IiIpCisgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQogCi0gIG1hbmlmZXN0ID0gcGFyc2UoYW5kcm9pZF9tYW5pZmVzdCkKLSAgaW5zdHJ1bWVudGF0aW9uX2VsZW1lbnRzID0gbWFuaWZlc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2luc3RydW1lbnRhdGlvbicpCi0gIG1hbmlmZXN0X2VsZW1lbnRzID0gbWFuaWZlc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21hbmlmZXN0JykKLSAgaWYgbGVuKGluc3RydW1lbnRhdGlvbl9lbGVtZW50cykgIT0gMSBvciBsZW4obWFuaWZlc3RfZWxlbWVudHMpICE9IDE6Ci0gICAgIyBGYWlsZWQgdG8gbG9jYXRlIGluc3RydW1lbnRhdGlvbiBvciBtYW5pZmVzdCBlbGVtZW50IGluIEFuZHJvaWRNYW5pZmVzdC4KLSAgICAjIGZpbGUuIEVtcHR5IHRlc3QgY29uZmlnIGZpbGUgd2lsbCBiZSBjcmVhdGVkLgotICAgIHNodXRpbC5jb3B5ZmlsZShlbXB0eV9jb25maWcsIHRhcmdldF9jb25maWcpCi0gICAgcmV0dXJuIDAKKyAgdGFyZ2V0X2NvbmZpZyA9IGFyZ3MudGFyZ2V0X2NvbmZpZworICBhbmRyb2lkX21hbmlmZXN0ID0gYXJncy5hbmRyb2lkX21hbmlmZXN0CisgIGVtcHR5X2NvbmZpZyA9IGFyZ3MuZW1wdHlfY29uZmlnCisgIGluc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZSA9IGFyZ3MuaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlCisgIGV4dHJhX2NvbmZpZ3MgPSAnXG4nLmpvaW4oYXJncy5leHRyYV9jb25maWdzLnNwbGl0KCdcXG4nKSkKIAogICBtb2R1bGUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUodGFyZ2V0X2NvbmZpZykpWzBdCi0gIGluc3RydW1lbnRhdGlvbiA9IGluc3RydW1lbnRhdGlvbl9lbGVtZW50c1swXQotICBtYW5pZmVzdCA9IG1hbmlmZXN0X2VsZW1lbnRzWzBdCi0gIGlmIEFUVFJJQlVURV9MQUJFTCBpbiBpbnN0cnVtZW50YXRpb24uYXR0cmlidXRlczoKLSAgICBsYWJlbCA9IGluc3RydW1lbnRhdGlvbi5hdHRyaWJ1dGVzW0FUVFJJQlVURV9MQUJFTF0udmFsdWUKLSAgZWxzZToKKworICAjIElmIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIGlzIG5vdCBhdmFpbGFibGUsIGJ1dCB0aGUgQVBLIGlzLCB0aGlzIHRvb2wgYWxzbworICAjIGFjY2VwdHMgdGhlIG91dHB1dCBvZiBgYWFwdDIgZHVtcCB4bWx0cmVlIDxhcGs+IEFuZHJvaWRNYW5pZmVzdC54bWxgIHdyaXR0ZW4KKyAgIyBpbnRvIGEgZmlsZS4gVGhpcyBpcyBhIGN1c3RvbSBzdHJ1Y3R1cmVkIGFhcHQyIG91dHB1dCAtIG5vdCByYXcgWE1MIQorICBpZiBhbmRyb2lkX21hbmlmZXN0LmVuZHN3aXRoKCIueG1sdHJlZSIpOgogICAgIGxhYmVsID0gbW9kdWxlCi0gIHJ1bm5lciA9IGluc3RydW1lbnRhdGlvbi5hdHRyaWJ1dGVzW0FUVFJJQlVURV9SVU5ORVJdLnZhbHVlCi0gIHBhY2thZ2UgPSBtYW5pZmVzdC5hdHRyaWJ1dGVzW0FUVFJJQlVURV9QQUNLQUdFXS52YWx1ZQorICAgIHdpdGggb3BlbihhbmRyb2lkX21hbmlmZXN0LCBlbmNvZGluZz0idXRmLTgiKSBhcyBtYW5pZmVzdDoKKyAgICAgICMgZS5nLiBBOiBwYWNrYWdlPSJhbmRyb2lkLnRlc3QuZXhhbXBsZS5oZWxsb3dvcmxkIiAoUmF3OiAiYW5kcm9pZC50ZXN0LmV4YW1wbGUuaGVsbG93b3JsZCIpCisgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKHIiXChSYXc6XHNcIiguKilcIlwpJCIpCisgICAgICBjdXJyX2VsZW1lbnQgPSBOb25lCisgICAgICBmb3IgbGluZSBpbiBtYW5pZmVzdDoKKyAgICAgICAgY3Vycl9saW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgIGlmIGN1cnJfbGluZS5zdGFydHN3aXRoKCJFOiIpOgorICAgICAgICAgICMgZS5nLiAiRTogaW5zdHJ1bWVudGF0aW9uIChsaW5lPTkpIgorICAgICAgICAgICMgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eCisgICAgICAgICAgY3Vycl9lbGVtZW50ID0gY3Vycl9saW5lLnNwbGl0KCIgIilbMV0KKyAgICAgICAgaWYgY3Vycl9lbGVtZW50ID09ICJpbnN0cnVtZW50YXRpb24iOgorICAgICAgICAgIGlmIEFUVFJJQlVURV9SVU5ORVIgaW4gY3Vycl9saW5lOgorICAgICAgICAgICAgcnVubmVyID0gIHJlLmZpbmRhbGwocGF0dGVybiwgY3Vycl9saW5lKVswXQorICAgICAgICAgIGlmIEFUVFJJQlVURV9MQUJFTCBpbiBjdXJyX2xpbmU6CisgICAgICAgICAgICBsYWJlbCA9IHJlLmZpbmRhbGwocGF0dGVybiwgY3Vycl9saW5lKVswXQorICAgICAgICBpZiBjdXJyX2VsZW1lbnQgPT0gIm1hbmlmZXN0IjoKKyAgICAgICAgICBpZiBBVFRSSUJVVEVfUEFDS0FHRSBpbiBjdXJyX2xpbmU6CisgICAgICAgICAgICBwYWNrYWdlID0gcmUuZmluZGFsbChwYXR0ZXJuLCBjdXJyX2xpbmUpWzBdCisKKyAgICBpZiBub3QgKHJ1bm5lciBhbmQgbGFiZWwgYW5kIHBhY2thZ2UpOgorICAgICAgIyBGYWlsZWQgdG8gbG9jYXRlIGluc3RydW1lbnRhdGlvbiBvciBtYW5pZmVzdCBlbGVtZW50IGluIEFuZHJvaWRNYW5pZmVzdC4KKyAgICAgICMgZmlsZS4gRW1wdHkgdGVzdCBjb25maWcgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICBzaHV0aWwuY29weWZpbGUoZW1wdHlfY29uZmlnLCB0YXJnZXRfY29uZmlnKQorICAgICAgcmV0dXJuIDAKKworICBlbHNlOgorICAgICMgSWYgdGhlIEFuZHJvaWRNYW5pZmVzdC54bWwgZmlsZSBpcyBkaXJlY3RseSBhdmFpbGFibGUsIHJlYWQgaXQgYXMgYW4gWE1MIGZpbGUuCisgICAgbWFuaWZlc3QgPSBwYXJzZShhbmRyb2lkX21hbmlmZXN0KQorICAgIGluc3RydW1lbnRhdGlvbl9lbGVtZW50cyA9IG1hbmlmZXN0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnN0cnVtZW50YXRpb24nKQorICAgIG1hbmlmZXN0X2VsZW1lbnRzID0gbWFuaWZlc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21hbmlmZXN0JykKKyAgICBpZiBsZW4oaW5zdHJ1bWVudGF0aW9uX2VsZW1lbnRzKSAhPSAxIG9yIGxlbihtYW5pZmVzdF9lbGVtZW50cykgIT0gMToKKyAgICAgICMgRmFpbGVkIHRvIGxvY2F0ZSBpbnN0cnVtZW50YXRpb24gb3IgbWFuaWZlc3QgZWxlbWVudCBpbiBBbmRyb2lkTWFuaWZlc3QuCisgICAgICAjIGZpbGUuIEVtcHR5IHRlc3QgY29uZmlnIGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorICAgICAgc2h1dGlsLmNvcHlmaWxlKGVtcHR5X2NvbmZpZywgdGFyZ2V0X2NvbmZpZykKKyAgICAgIHJldHVybiAwCisKKyAgICBpbnN0cnVtZW50YXRpb24gPSBpbnN0cnVtZW50YXRpb25fZWxlbWVudHNbMF0KKyAgICBtYW5pZmVzdCA9IG1hbmlmZXN0X2VsZW1lbnRzWzBdCisgICAgaWYgQVRUUklCVVRFX0xBQkVMIGluIGluc3RydW1lbnRhdGlvbi5hdHRyaWJ1dGVzOgorICAgICAgbGFiZWwgPSBpbnN0cnVtZW50YXRpb24uYXR0cmlidXRlc1tBVFRSSUJVVEVfTEFCRUxdLnZhbHVlCisgICAgZWxzZToKKyAgICAgIGxhYmVsID0gbW9kdWxlCisgICAgcnVubmVyID0gaW5zdHJ1bWVudGF0aW9uLmF0dHJpYnV0ZXNbQVRUUklCVVRFX1JVTk5FUl0udmFsdWUKKyAgICBwYWNrYWdlID0gbWFuaWZlc3QuYXR0cmlidXRlc1tBVFRSSUJVVEVfUEFDS0FHRV0udmFsdWUKKwogICB0ZXN0X3R5cGUgPSAoJ0luc3RydW1lbnRhdGlvblRlc3QnCi0gICAgICAgICAgICAgICBpZiBydW5uZXIuZW5kc3dpdGgoJy5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyJykKLSAgICAgICAgICAgICAgIGVsc2UgJ0FuZHJvaWRKVW5pdFRlc3QnKQorICAgICAgICAgICAgICBpZiBydW5uZXIuZW5kc3dpdGgoJy5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyJykKKyAgICAgICAgICAgICAgZWxzZSAnQW5kcm9pZEpVbml0VGVzdCcpCiAKICAgd2l0aCBvcGVuKGluc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZSkgYXMgdGVtcGxhdGU6CiAgICAgY29uZmlnID0gdGVtcGxhdGUucmVhZCgpCmRpZmYgLS1naXQgYS90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZ190ZXN0LnB5IGIvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWdfdGVzdC5weQppbmRleCA1MWE4NTgzLi5iN2VmMGIwIDEwMDY0NAotLS0gYS90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZ190ZXN0LnB5CisrKyBiL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkKQEAgLTMwLDYgKzMwLDI0IEBACiA8L21hbmlmZXN0PgogIiIiCiAKK1hNTFRSRUVfSlVOSVRfVEVTVCA9ICIiIk46IGFuZHJvaWQ9aHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIChsaW5lPTIpCisgIEU6IG1hbmlmZXN0IChsaW5lPTIpCisgICAgQTogcGFja2FnZT0iY29tLmFuZHJvaWQubXkudGVzdHMueCIgKFJhdzogImNvbS5hbmRyb2lkLm15LnRlc3RzLngiKQorICAgICAgRTogaW5zdHJ1bWVudGF0aW9uIChsaW5lPTkpCisgICAgICAgIEE6IGh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZDpsYWJlbCgweDAxMDEwMDAxKT0iVGVzdE1vZHVsZSIgKFJhdzogIlRlc3RNb2R1bGUiKQorICAgICAgICBBOiBodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQ6bmFtZSgweDAxMDEwMDAzKT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiAoUmF3OiAiYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIikKKyAgICAgICAgQTogaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkOnRhcmdldFBhY2thZ2UoMHgwMTAxMDAyMSk9ImNvbS5hbmRyb2lkLm15LnRlc3RzIiAoUmF3OiAiY29tLmFuZHJvaWQubXkudGVzdHMiKQorIiIiCisKK1hNTFRSRUVfSU5TVFJVTUVOVEFUSU9OX1RFU1QgPSAiIiJOOiBhbmRyb2lkPWh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCAobGluZT0yKQorICBFOiBtYW5pZmVzdCAobGluZT0yKQorICAgIEE6IHBhY2thZ2U9ImNvbS5hbmRyb2lkLm15LnRlc3RzLngiIChSYXc6ICJjb20uYW5kcm9pZC5teS50ZXN0cy54IikKKyAgICAgIEU6IGluc3RydW1lbnRhdGlvbiAobGluZT05KQorICAgICAgICBBOiBodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQ6bGFiZWwoMHgwMTAxMDAwMSk9IlRlc3RNb2R1bGUiIChSYXc6ICJUZXN0TW9kdWxlIikKKyAgICAgICAgQTogaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkOm5hbWUoMHgwMTAxMDAwMyk9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIiAoUmF3OiAiYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiKQorICAgICAgICBBOiBodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQ6dGFyZ2V0UGFja2FnZSgweDAxMDEwMDIxKT0iY29tLmFuZHJvaWQubXkudGVzdHMiIChSYXc6ICJjb20uYW5kcm9pZC5teS50ZXN0cyIpCisiIiIKKwogTUFOSUZFU1RfSlVOSVRfVEVTVCA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICBwYWNrYWdlPSJjb20uYW5kcm9pZC5teS50ZXN0cy54Ij4KQEAgLTQ1LDEyICs2MywxMiBAQAogICAgIDxpbnN0cnVtZW50YXRpb24KICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5teS50ZXN0cyIKLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iTXkgVGVzdHMiIC8+CisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3RNb2R1bGUiIC8+CiA8L21hbmlmZXN0PgogIiIiCiAKIEVYUEVDVEVEX0pVTklUX1RFU1RfQ09ORklHID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKIAogICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNjYsNyArODQsMTEgQEAKIC0tPgogPCEtLSBUaGlzIHRlc3QgY29uZmlnIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlJ1bnMgVGVzdE1vZHVsZS4iPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJhcGN0IiAvPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJhcGN0LWluc3RydW1lbnRhdGlvbiIgLz4KKwogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJUZXN0TW9kdWxlLmFwayIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIApAQCAtNzgsNyArMTAwLDcgQEAKICIiIgogCiBFWFBFQ1RFRF9JTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUcgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogCiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC05Myw4ICsxMTUsMTIgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDwhLS0gVGhpcyB0ZXN0IGNvbmZpZyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAtLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIE15IFRlc3RzLiI+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBUZXN0TW9kdWxlLiI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImFwY3QiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImFwY3QtaW5zdHJ1bWVudGF0aW9uIiAvPgorCiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IlRlc3RNb2R1bGUuYXBrIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCkBAIC0xMDUsMTEgKzEzMSw1OCBAQAogPC9jb25maWd1cmF0aW9uPgogIiIiCiAKLVRPT0xTX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQotRU1QVFlfVEVTVF9DT05GSUcgPSBvcy5wYXRoLmpvaW4oCi0gICAgVE9PTFNfRElSLCAnLi4nLCAnY29yZScsICdlbXB0eV90ZXN0X2NvbmZpZy54bWwnKQotSU5TVFJVTUVOVEFUSU9OX1RFU1RfQ09ORklHX1RFTVBMQVRFID0gb3MucGF0aC5qb2luKAotICAgIFRPT0xTX0RJUiwgJy4uJywgJ2NvcmUnLCAnaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbCcpCitFTVBUWV9URVNUX0NPTkZJR19DT05URU5UID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gTm8gQW5kcm9pZFRlc3QueG1sIHdhcyBwcm92aWRlZCBhbmQgdGhlIG1hbmlmZXN0IGRvZXMgbm90IGluY2x1ZGUKKyAgICAgaW5zdHJ1bWVudGF0aW9uLCBoZW5jZSB0aGlzIGFwayBpcyBub3QgaW5zdHJ1bWVudGFibGUuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJFbXB0eSBDb25maWd1cmF0aW9uIiAvPgorIiIiCisKK0lOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJR19URU1QTEFURV9DT05URU5UID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVGhpcyB0ZXN0IGNvbmZpZyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAtLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIHtMQUJFTH0uIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iYXBjdCIgLz4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iYXBjdC1pbnN0cnVtZW50YXRpb24iIC8+Cit7RVhUUkFfQ09ORklHU30KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0ie01PRFVMRX0uYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLntURVNUX1RZUEV9IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9IntQQUNLQUdFfSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJydW5uZXIiIHZhbHVlPSJ7UlVOTkVSfSIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CisiIiIKIAogCiBjbGFzcyBBdXRvR2VuVGVzdENvbmZpZ1VuaXR0ZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0xMjAsNiArMTkzLDE2IEBACiAgICAgc2VsZi50ZXN0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgIHNlbGYuY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0X2RpciwgVEVTVF9NT0RVTEUgKyAnLmNvbmZpZycpCiAgICAgc2VsZi5tYW5pZmVzdF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdF9kaXIsICdBbmRyb2lkTWFuaWZlc3QueG1sJykKKyAgICBzZWxmLnhtbHRyZWVfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RfZGlyLCBURVNUX01PRFVMRSArICcueG1sdHJlZScpCisgICAgc2VsZi5lbXB0eV90ZXN0X2NvbmZpZ19maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdF9kaXIsICdlbXB0eS5jb25maWcnKQorICAgIHNlbGYuaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlX2ZpbGUgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIHNlbGYudGVzdF9kaXIsICdpbnN0cnVtZW50YXRpb24uY29uZmlnJykKKworICAgIHdpdGggb3BlbihzZWxmLmVtcHR5X3Rlc3RfY29uZmlnX2ZpbGUsICd3JykgYXMgZjoKKyAgICAgIGYud3JpdGUoRU1QVFlfVEVTVF9DT05GSUdfQ09OVEVOVCkKKworICAgIHdpdGggb3BlbihzZWxmLmluc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZV9maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKElOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJR19URU1QTEFURV9DT05URU5UKQogCiAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAiIiJDbGVhbnVwIHRoZSB0ZXN0IGRpcmVjdG9yeS4iIiIKQEAgLTEzMywxMSArMjE2LDExIEBACiAKICAgICBhcmd2ID0gW3NlbGYuY29uZmlnX2ZpbGUsCiAgICAgICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGUsCi0gICAgICAgICAgICBFTVBUWV9URVNUX0NPTkZJRywKLSAgICAgICAgICAgIElOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJR19URU1QTEFURV0KKyAgICAgICAgICAgIHNlbGYuZW1wdHlfdGVzdF9jb25maWdfZmlsZSwKKyAgICAgICAgICAgIHNlbGYuaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlX2ZpbGVdCiAgICAgYXV0b19nZW5fdGVzdF9jb25maWcubWFpbihhcmd2KQogICAgIHdpdGggb3BlbihzZWxmLmNvbmZpZ19maWxlKSBhcyBjb25maWdfZmlsZToKLSAgICAgIHdpdGggb3BlbihFTVBUWV9URVNUX0NPTkZJRykgYXMgZW1wdHlfY29uZmlnOgorICAgICAgd2l0aCBvcGVuKHNlbGYuZW1wdHlfdGVzdF9jb25maWdfZmlsZSkgYXMgZW1wdHlfY29uZmlnOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbmZpZ19maWxlLnJlYWQoKSwgZW1wdHlfY29uZmlnLnJlYWQoKSkKIAogICBkZWYgdGVzdENyZWF0ZUpVbml0VGVzdENvbmZpZyhzZWxmKToKQEAgLTE0OCw4ICsyMzEsOCBAQAogCiAgICAgYXJndiA9IFtzZWxmLmNvbmZpZ19maWxlLAogICAgICAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlLAotICAgICAgICAgICAgRU1QVFlfVEVTVF9DT05GSUcsCi0gICAgICAgICAgICBJTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUdfVEVNUExBVEVdCisgICAgICAgICAgICBzZWxmLmVtcHR5X3Rlc3RfY29uZmlnX2ZpbGUsCisgICAgICAgICAgICBzZWxmLmluc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZV9maWxlXQogICAgIGF1dG9fZ2VuX3Rlc3RfY29uZmlnLm1haW4oYXJndikKICAgICB3aXRoIG9wZW4oc2VsZi5jb25maWdfZmlsZSkgYXMgY29uZmlnX2ZpbGU6CiAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbmZpZ19maWxlLnJlYWQoKSwgRVhQRUNURURfSlVOSVRfVEVTVF9DT05GSUcpCkBAIC0xNjIsOCArMjQ1LDM3IEBACiAKICAgICBhcmd2ID0gW3NlbGYuY29uZmlnX2ZpbGUsCiAgICAgICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGUsCi0gICAgICAgICAgICBFTVBUWV9URVNUX0NPTkZJRywKLSAgICAgICAgICAgIElOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJR19URU1QTEFURV0KKyAgICAgICAgICAgIHNlbGYuZW1wdHlfdGVzdF9jb25maWdfZmlsZSwKKyAgICAgICAgICAgIHNlbGYuaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlX2ZpbGVdCisgICAgYXV0b19nZW5fdGVzdF9jb25maWcubWFpbihhcmd2KQorICAgIHdpdGggb3BlbihzZWxmLmNvbmZpZ19maWxlKSBhcyBjb25maWdfZmlsZToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgY29uZmlnX2ZpbGUucmVhZCgpLCBFWFBFQ1RFRF9JTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUcpCisKKyAgZGVmIHRlc3RDcmVhdGVKVW5pdFRlc3RDb25maWdXaXRoWE1MVHJlZShzZWxmKToKKyAgICAiIiJUZXN0IGNyZWF0aW5nIHRlc3QgY29uZmlnIGZvciBBbmRyb2lkSlVuaXRUZXN0LgorICAgICIiIgorICAgIHdpdGggb3BlbihzZWxmLnhtbHRyZWVfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgZi53cml0ZShYTUxUUkVFX0pVTklUX1RFU1QpCisKKyAgICBhcmd2ID0gW3NlbGYuY29uZmlnX2ZpbGUsCisgICAgICAgICAgICBzZWxmLnhtbHRyZWVfZmlsZSwKKyAgICAgICAgICAgIHNlbGYuZW1wdHlfdGVzdF9jb25maWdfZmlsZSwKKyAgICAgICAgICAgIHNlbGYuaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlX2ZpbGVdCisgICAgYXV0b19nZW5fdGVzdF9jb25maWcubWFpbihhcmd2KQorICAgIHdpdGggb3BlbihzZWxmLmNvbmZpZ19maWxlKSBhcyBjb25maWdfZmlsZToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uZmlnX2ZpbGUucmVhZCgpLCBFWFBFQ1RFRF9KVU5JVF9URVNUX0NPTkZJRykKKworICBkZWYgdGVzdENyZWF0ZUluc3RydW1lbnRhdGlvblRlc3RDb25maWdXaXRoWE1MVHJlZShzZWxmKToKKyAgICAiIiJUZXN0IGNyZWF0aW5nIHRlc3QgY29uZmlnIGZvciBJbnN0cnVtZW50YXRpb25UZXN0LgorICAgICIiIgorICAgIHdpdGggb3BlbihzZWxmLnhtbHRyZWVfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgZi53cml0ZShYTUxUUkVFX0lOU1RSVU1FTlRBVElPTl9URVNUKQorCisgICAgYXJndiA9IFtzZWxmLmNvbmZpZ19maWxlLAorICAgICAgICAgICAgc2VsZi54bWx0cmVlX2ZpbGUsCisgICAgICAgICAgICBzZWxmLmVtcHR5X3Rlc3RfY29uZmlnX2ZpbGUsCisgICAgICAgICAgICBzZWxmLmluc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZV9maWxlXQogICAgIGF1dG9fZ2VuX3Rlc3RfY29uZmlnLm1haW4oYXJndikKICAgICB3aXRoIG9wZW4oc2VsZi5jb25maWdfZmlsZSkgYXMgY29uZmlnX2ZpbGU6CiAgICAgICBzZWxmLmFzc2VydEVxdWFsKApkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGRpbmZvLnNoIGIvdG9vbHMvYnVpbGRpbmZvLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMmUzNmRmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2J1aWxkaW5mby5zaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLWVjaG8gIiMgYmVnaW4gYnVpbGQgcHJvcGVydGllcyIKLWVjaG8gIiMgYXV0b2dlbmVyYXRlZCBieSBidWlsZGluZm8uc2giCi0KLSMgVGhlIHJvLmJ1aWxkLmlkIHdpbGwgYmUgc2V0IGR5bmFtaWNhbGx5IGJ5IGluaXQsIGJ5IGFwcGVuZGluZyB0aGUgdW5pcXVlIHZibWV0YSBkaWdlc3QuCi1pZiBbICIkQk9BUkRfVVNFX1ZCTUVUQV9ESUdURVNUX0lOX0ZJTkdFUlBSSU5UIiA9ICJ0cnVlIiBdIDsgdGhlbgotICBlY2hvICJyby5idWlsZC5sZWdhY3kuaWQ9JEJVSUxEX0lEIgotZWxzZQotICBlY2hvICJyby5idWlsZC5pZD0kQlVJTERfSUQiCi1maQotZWNobyAicm8uYnVpbGQuZGlzcGxheS5pZD0kQlVJTERfRElTUExBWV9JRCIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24uaW5jcmVtZW50YWw9JEJVSUxEX05VTUJFUiIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24uc2RrPSRQTEFURk9STV9TREtfVkVSU0lPTiIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24ucHJldmlld19zZGs9JFBMQVRGT1JNX1BSRVZJRVdfU0RLX1ZFUlNJT04iCi1lY2hvICJyby5idWlsZC52ZXJzaW9uLnByZXZpZXdfc2RrX2ZpbmdlcnByaW50PSRQTEFURk9STV9QUkVWSUVXX1NES19GSU5HRVJQUklOVCIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24uY29kZW5hbWU9JFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUiCi1lY2hvICJyby5idWlsZC52ZXJzaW9uLmFsbF9jb2RlbmFtZXM9JFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUyIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24ua25vd25fY29kZW5hbWVzPSRQTEFURk9STV9WRVJTSU9OX0tOT1dOX0NPREVOQU1FUyIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZT0kUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZV9vcl9jb2RlbmFtZT0kUExBVEZPUk1fVkVSU0lPTiIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZV9vcl9wcmV2aWV3X2Rpc3BsYXk9JFBMQVRGT1JNX0RJU1BMQVlfVkVSU0lPTiIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24uc2VjdXJpdHlfcGF0Y2g9JFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENIIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5iYXNlX29zPSRQTEFURk9STV9CQVNFX09TIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5taW5fc3VwcG9ydGVkX3RhcmdldF9zZGs9JFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OIgotZWNobyAicm8uYnVpbGQuZGF0ZT1gJERBVEVgIgotZWNobyAicm8uYnVpbGQuZGF0ZS51dGM9YCREQVRFICslc2AiCi1lY2hvICJyby5idWlsZC50eXBlPSRUQVJHRVRfQlVJTERfVFlQRSIKLWVjaG8gInJvLmJ1aWxkLnVzZXI9JEJVSUxEX1VTRVJOQU1FIgotZWNobyAicm8uYnVpbGQuaG9zdD0kQlVJTERfSE9TVE5BTUUiCi1lY2hvICJyby5idWlsZC50YWdzPSRCVUlMRF9WRVJTSU9OX1RBR1MiCi1lY2hvICJyby5idWlsZC5mbGF2b3I9JFRBUkdFVF9CVUlMRF9GTEFWT1IiCi0KLSMgVGhlc2UgdmFsdWVzIGFyZSBkZXByZWNhdGVkLCB1c2UgInJvLnByb2R1Y3QuY3B1LmFiaWxpc3QiCi0jIGluc3RlYWQgKHNlZSBiZWxvdykuCi1lY2hvICIjIHJvLnByb2R1Y3QuY3B1LmFiaSBhbmQgcm8ucHJvZHVjdC5jcHUuYWJpMiBhcmUgb2Jzb2xldGUsIgotZWNobyAiIyB1c2Ugcm8ucHJvZHVjdC5jcHUuYWJpbGlzdCBpbnN0ZWFkLiIKLWVjaG8gInJvLnByb2R1Y3QuY3B1LmFiaT0kVEFSR0VUX0NQVV9BQkkiCi1pZiBbIC1uICIkVEFSR0VUX0NQVV9BQkkyIiBdIDsgdGhlbgotICBlY2hvICJyby5wcm9kdWN0LmNwdS5hYmkyPSRUQVJHRVRfQ1BVX0FCSTIiCi1maQotCi1pZiBbIC1uICIkUFJPRFVDVF9ERUZBVUxUX0xPQ0FMRSIgXSA7IHRoZW4KLSAgZWNobyAicm8ucHJvZHVjdC5sb2NhbGU9JFBST0RVQ1RfREVGQVVMVF9MT0NBTEUiCi1maQotZWNobyAicm8ud2lmaS5jaGFubmVscz0kUFJPRFVDVF9ERUZBVUxUX1dJRklfQ0hBTk5FTFMiCi0KLWVjaG8gIiMgcm8uYnVpbGQucHJvZHVjdCBpcyBvYnNvbGV0ZTsgdXNlIHJvLnByb2R1Y3QuZGV2aWNlIgotZWNobyAicm8uYnVpbGQucHJvZHVjdD0kVEFSR0VUX0RFVklDRSIKLQotZWNobyAiIyBEbyBub3QgdHJ5IHRvIHBhcnNlIGRlc2NyaXB0aW9uIG9yIHRodW1icHJpbnQiCi1lY2hvICJyby5idWlsZC5kZXNjcmlwdGlvbj0kUFJJVkFURV9CVUlMRF9ERVNDIgotaWYgWyAtbiAiJEJVSUxEX1RIVU1CUFJJTlQiIF0gOyB0aGVuCi0gIGVjaG8gInJvLmJ1aWxkLnRodW1icHJpbnQ9JEJVSUxEX1RIVU1CUFJJTlQiCi1maQotCi1lY2hvICIjIGVuZCBidWlsZCBwcm9wZXJ0aWVzIgpkaWZmIC0tZ2l0IGEvdG9vbHMvY2hhcmFjdGVyaXN0aWNzX3Jyb19nZW5lcmF0b3IucHkgYi90b29scy9jaGFyYWN0ZXJpc3RpY3NfcnJvX2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjg3M2VlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvY2hhcmFjdGVyaXN0aWNzX3Jyb19nZW5lcmF0b3IucHkKQEAgLTAsMCArMSwxNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworaW1wb3J0IHN5cworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGlmIGxlbihzeXMuYXJndikgIT0gMzoKKyAgICAgICAgc3lzLmV4aXQoZiJ1c2FnZToge3N5c19hcmd2WzBdfSB0YXJnZXRfcGFja2FnZV9uYW1lIG91dHB1dFxuIikKKyAgICB3aXRoIG9wZW4oc3lzLmFyZ3ZbMl0sICJ3IikgYXMgZjoKKyAgICAgICAgZi53cml0ZShmJycnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyAgICAgICAgICAgICAgICA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBwYWNrYWdlPSJ7c3lzLmFyZ3ZbMV19LmF1dG9fZ2VuZXJhdGVkX2NoYXJhY3RlcmlzdGljc19ycm8iPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIiAvPgorICAgIDxvdmVybGF5IGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0ie3N5cy5hcmd2WzFdfSIKKyAgICAgICAgICAgICBhbmRyb2lkOmlzU3RhdGljPSJ0cnVlIgorICAgICAgICAgICAgIGFuZHJvaWQ6cHJpb3JpdHk9IjAiIC8+Cis8L21hbmlmZXN0PgorJycnKQpkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL0FuZHJvaWQuYnAgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M5YzhlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfdGVhbTogInRyZW5keV90ZWFtX3VwZGF0YWJsZV9zZGtfYXBpcyIsCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitqYXZhX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiY2hlY2stZmxhZ2dlZC1hcGlzLWRlZmF1bHRzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvY29tL2FuZHJvaWQvY2hlY2tmbGFnZ2VkYXBpcy9NYWluLmt0IiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX2phdmFfcHJvdG9fbGl0ZSIsCisgICAgICAgICJtZXRhbGF2YS1zaWduYXR1cmUtcmVhZGVyIiwKKyAgICAgICAgIm1ldGFsYXZhLXRvb2xzLWNvbW1vbi1tMi1kZXBzIiwKKyAgICBdLAorfQorCitqYXZhX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiY2hlY2stZmxhZ2dlZC1hcGlzIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiY2hlY2stZmxhZ2dlZC1hcGlzLWRlZmF1bHRzIiwKKyAgICBdLAorICAgIG1haW5fY2xhc3M6ICJjb20uYW5kcm9pZC5jaGVja2ZsYWdnZWRhcGlzLk1haW4iLAorfQorCitqYXZhX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImNoZWNrLWZsYWdnZWQtYXBpcy10ZXN0IiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiY2hlY2stZmxhZ2dlZC1hcGlzLWRlZmF1bHRzIiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9jb20vYW5kcm9pZC9jaGVja2ZsYWdnZWRhcGlzL0NoZWNrRmxhZ2dlZEFwaXNUZXN0Lmt0IiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJqdW5pdCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9PV05FUlMgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OWUyMWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvT1dORVJTCkBAIC0wLDAgKzEsNCBAQAorYW1oa0Bnb29nbGUuY29tCitndXJwcmVldGdzQGdvb2dsZS5jb20KK21pY2hhZWx3ckBnb29nbGUuY29tCitwYXVsZHVmZmluQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9jaGVjay1mbGFnZ2VkLWFwaXMuc2ggYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvY2hlY2stZmxhZ2dlZC1hcGlzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwNzhjZDgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvY2hlY2stZmxhZ2dlZC1hcGlzLnNoCkBAIC0wLDAgKzEsMTM2IEBACisjIS9iaW4vYmFzaAorCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFJ1biBjaGVjay1mbGFnZ2VkLWFwaXMgZm9yIHB1YmxpYyBBUElzIGFuZCB0aGUgdGhyZWUgQFN5c3RlbUFwaSBmbGF2b3Vycy4KKyMKKyMgVGhpcyBzY3JpcHQgZXhwZWN0cyBhbiBhcmd1bWVudCB0byB0ZWxsIGl0IHdoaWNoIHN1YmNvbW1hbmQgb2YKKyMgY2hlY2stZmxhZ2dlZC1hcGlzIHRvIGV4ZWN1dGUuIFJ1biB0aGUgc2NyaXB0IHdpdGhvdXQgYW55IGFyZ3VtZW50cyB0byBzZWUKKyMgdGhlIHZhbGlkIG9wdGlvbnMuCisjCisjIFJlbWVtYmVyIHRvIGx1bmNoIHRvIHNlbGVjdCB0aGUgcmVsZXZhbnQgcmVsZWFzZSBjb25maWcgYmVmb3JlIHJ1bm5pbmcgdGhpcyBzY3JpcHQuCisKK3NvdXJjZSAkKGNkICQoZGlybmFtZSAkQkFTSF9TT1VSQ0UpICY+IC9kZXYvbnVsbCAmJiBwd2QpLy4uLy4uL3NoZWxsX3V0aWxzLnNoCityZXF1aXJlX3RvcAorCitQVUJMSUNfWE1MX1ZFUlNJT05TPW91dC90YXJnZXQvY29tbW9uL29iai9QQUNLQUdJTkcvYXBpX3ZlcnNpb25zX3B1YmxpY19nZW5lcmF0ZWQtYXBpLXZlcnNpb25zLnhtbAorU1lTVEVNX1hNTF9WRVJTSU9OUz1vdXQvdGFyZ2V0L2NvbW1vbi9vYmovUEFDS0FHSU5HL2FwaV92ZXJzaW9uc19zeXN0ZW1fZ2VuZXJhdGVkLWFwaS12ZXJzaW9ucy54bWwKK1NZU1RFTV9TRVJWRVJfWE1MX1ZFUlNPTlM9b3V0L3RhcmdldC9jb21tb24vb2JqL1BBQ0tBR0lORy9hcGlfdmVyc2lvbnNfc3lzdGVtX3NlcnZlcl9jb21wbGV0ZV9nZW5lcmF0ZWQtYXBpLXZlcnNpb25zLnhtbAorTU9EVUxFX0xJQl9YTUxfVkVSU0lPTlM9b3V0L3RhcmdldC9jb21tb24vb2JqL1BBQ0tBR0lORy9hcGlfdmVyc2lvbnNfbW9kdWxlX2xpYl9jb21wbGV0ZV9nZW5lcmF0ZWQtYXBpLXZlcnNpb25zLnhtbAorCitmdW5jdGlvbiBtKCkgeworICAgICQoZ2V0dG9wKS9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tYnVpbGQtbW9kZSAtLWFsbC1tb2R1bGVzIC0tZGlyPSIkKHB3ZCkiICIkQCIKK30KKworZnVuY3Rpb24gYnVpbGQoKSB7CisgICAgbSBcCisgICAgICAgIGNoZWNrLWZsYWdnZWQtYXBpcyBcCisgICAgICAgIGFsbF9hY29uZmlnX2RlY2xhcmF0aW9ucyBcCisgICAgICAgIGZyYW1ld29ya3MtYmFzZS1hcGktY3VycmVudC50eHQgXAorICAgICAgICBmcmFtZXdvcmtzLWJhc2UtYXBpLXN5c3RlbS1jdXJyZW50LnR4dCBcCisgICAgICAgIGZyYW1ld29ya3MtYmFzZS1hcGktc3lzdGVtLXNlcnZlci1jdXJyZW50LnR4dCBcCisgICAgICAgIGZyYW1ld29ya3MtYmFzZS1hcGktbW9kdWxlLWxpYi1jdXJyZW50LnR4dCBcCisgICAgICAgICRQVUJMSUNfWE1MX1ZFUlNJT05TIFwKKyAgICAgICAgJFNZU1RFTV9YTUxfVkVSU0lPTlMgXAorICAgICAgICAkU1lTVEVNX1NFUlZFUl9YTUxfVkVSU09OUyBcCisgICAgICAgICRNT0RVTEVfTElCX1hNTF9WRVJTSU9OUworfQorCitmdW5jdGlvbiBub29wKCkgeworICAgIHRydWUKK30KKworZnVuY3Rpb24gYW5pbmphKCkgeworICAgIGxvY2FsIFQ9IiQoZ2V0dG9wKSIKKyAgICAoXGNkICIke1R9IiAmJiBwcmVidWlsdHMvYnVpbGQtdG9vbHMvbGludXgteDg2L2Jpbi9uaW5qYSAtZiBvdXQvY29tYmluZWQtJHtUQVJHRVRfUFJPRFVDVH0ubmluamEgIiRAIikKK30KKworZnVuY3Rpb24gcGF0aF90b19hcGlfc2lnbmF0dXJlX2ZpbGUgeworICAgIGFuaW5qYSAtdCBxdWVyeSBkZXZpY2VfIiQxIl9hbGxfdGFyZ2V0cyB8IGdyZXAgLUExIC1lIGlucHV0OiB8IHRhaWwgLW4xCit9CisKK2Z1bmN0aW9uIHJ1bl9jaGVjaygpIHsKKyAgICBsb2NhbCBlcnJvcnM9MAorCisgICAgZWNobyAiIyBjdXJyZW50IgorICAgIGNoZWNrLWZsYWdnZWQtYXBpcyBjaGVjayBcCisgICAgICAgIC0tYXBpLXNpZ25hdHVyZSAkKHBhdGhfdG9fYXBpX3NpZ25hdHVyZV9maWxlICJmcmFtZXdvcmtzLWJhc2UtYXBpLWN1cnJlbnQudHh0IikgXAorICAgICAgICAtLWZsYWctdmFsdWVzICQoZ2V0dG9wKS9vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiIFwKKyAgICAgICAgLS1hcGktdmVyc2lvbnMgJFBVQkxJQ19YTUxfVkVSU0lPTlMKKyAgICAoKCBlcnJvcnMgKz0gJD8gKSkKKworICAgIGVjaG8KKyAgICBlY2hvICIjIHN5c3RlbS1jdXJyZW50IgorICAgIGNoZWNrLWZsYWdnZWQtYXBpcyBjaGVjayBcCisgICAgICAgIC0tYXBpLXNpZ25hdHVyZSAkKHBhdGhfdG9fYXBpX3NpZ25hdHVyZV9maWxlICJmcmFtZXdvcmtzLWJhc2UtYXBpLXN5c3RlbS1jdXJyZW50LnR4dCIpIFwKKyAgICAgICAgLS1mbGFnLXZhbHVlcyAkKGdldHRvcCkvb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2FsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYiBcCisgICAgICAgIC0tYXBpLXZlcnNpb25zICRTWVNURU1fWE1MX1ZFUlNJT05TCisgICAgKCggZXJyb3JzICs9ICQ/ICkpCisKKyAgICBlY2hvCisgICAgZWNobyAiIyBzeXN0ZW0tc2VydmVyLWN1cnJlbnQiCisgICAgY2hlY2stZmxhZ2dlZC1hcGlzIGNoZWNrIFwKKyAgICAgICAgLS1hcGktc2lnbmF0dXJlICQocGF0aF90b19hcGlfc2lnbmF0dXJlX2ZpbGUgImZyYW1ld29ya3MtYmFzZS1hcGktc3lzdGVtLXNlcnZlci1jdXJyZW50LnR4dCIpIFwKKyAgICAgICAgLS1mbGFnLXZhbHVlcyAkKGdldHRvcCkvb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2FsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYiBcCisgICAgICAgIC0tYXBpLXZlcnNpb25zICRTWVNURU1fU0VSVkVSX1hNTF9WRVJTT05TCisgICAgKCggZXJyb3JzICs9ICQ/ICkpCisKKyAgICBlY2hvCisgICAgZWNobyAiIyBtb2R1bGUtbGliIgorICAgIGNoZWNrLWZsYWdnZWQtYXBpcyBjaGVjayBcCisgICAgICAgIC0tYXBpLXNpZ25hdHVyZSAkKHBhdGhfdG9fYXBpX3NpZ25hdHVyZV9maWxlICJmcmFtZXdvcmtzLWJhc2UtYXBpLW1vZHVsZS1saWItY3VycmVudC50eHQiKSBcCisgICAgICAgIC0tZmxhZy12YWx1ZXMgJChnZXR0b3ApL291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9hbGxfYWNvbmZpZ19kZWNsYXJhdGlvbnMucGIgXAorICAgICAgICAtLWFwaS12ZXJzaW9ucyAkTU9EVUxFX0xJQl9YTUxfVkVSU0lPTlMKKyAgICAoKCBlcnJvcnMgKz0gJD8gKSkKKworICAgIHJldHVybiAkZXJyb3JzCit9CisKK2Z1bmN0aW9uIHJ1bl9saXN0KCkgeworICAgIGVjaG8gIiMgY3VycmVudCIKKyAgICBjaGVjay1mbGFnZ2VkLWFwaXMgbGlzdCBcCisgICAgICAgIC0tYXBpLXNpZ25hdHVyZSAkKHBhdGhfdG9fYXBpX3NpZ25hdHVyZV9maWxlICJmcmFtZXdvcmtzLWJhc2UtYXBpLWN1cnJlbnQudHh0IikgXAorICAgICAgICAtLWZsYWctdmFsdWVzICQoZ2V0dG9wKS9vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiCisKKyAgICBlY2hvCisgICAgZWNobyAiIyBzeXN0ZW0tY3VycmVudCIKKyAgICBjaGVjay1mbGFnZ2VkLWFwaXMgbGlzdCBcCisgICAgICAgIC0tYXBpLXNpZ25hdHVyZSAkKHBhdGhfdG9fYXBpX3NpZ25hdHVyZV9maWxlICJmcmFtZXdvcmtzLWJhc2UtYXBpLXN5c3RlbS1jdXJyZW50LnR4dCIpIFwKKyAgICAgICAgLS1mbGFnLXZhbHVlcyAkKGdldHRvcCkvb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2FsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYgorCisgICAgZWNobworICAgIGVjaG8gIiMgc3lzdGVtLXNlcnZlci1jdXJyZW50IgorICAgIGNoZWNrLWZsYWdnZWQtYXBpcyBsaXN0IFwKKyAgICAgICAgLS1hcGktc2lnbmF0dXJlICQocGF0aF90b19hcGlfc2lnbmF0dXJlX2ZpbGUgImZyYW1ld29ya3MtYmFzZS1hcGktc3lzdGVtLXNlcnZlci1jdXJyZW50LnR4dCIpIFwKKyAgICAgICAgLS1mbGFnLXZhbHVlcyAkKGdldHRvcCkvb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2FsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYgorCisgICAgZWNobworICAgIGVjaG8gIiMgbW9kdWxlLWxpYiIKKyAgICBjaGVjay1mbGFnZ2VkLWFwaXMgbGlzdCBcCisgICAgICAgIC0tYXBpLXNpZ25hdHVyZSAkKHBhdGhfdG9fYXBpX3NpZ25hdHVyZV9maWxlICJmcmFtZXdvcmtzLWJhc2UtYXBpLW1vZHVsZS1saWItY3VycmVudC50eHQiKSBcCisgICAgICAgIC0tZmxhZy12YWx1ZXMgJChnZXR0b3ApL291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9hbGxfYWNvbmZpZ19kZWNsYXJhdGlvbnMucGIKK30KKworYnVpbGRfY21kPWJ1aWxkCitpZiBbWyAiJDEiID09ICItLXNraXAtYnVpbGQiIF1dOyB0aGVuCisgICAgYnVpbGRfY21kPW5vb3AKKyAgICBzaGlmdCAxCitmaQorCitjYXNlICIkMSIgaW4KKyAgICBjaGVjaykgJGJ1aWxkX2NtZCAmJiBydW5fY2hlY2sgOzsKKyAgICBsaXN0KSAkYnVpbGRfY21kICYmIHJ1bl9saXN0IDs7CisgICAgKikgZWNobyAidXNhZ2U6ICQoYmFzZW5hbWUgJDApOiBbLS1za2lwLWJ1aWxkXSBjaGVja3xsaXN0IjsgZXhpdCAxCitlc2FjCmRpZmYgLS1naXQgYS90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvQ2hlY2tGbGFnZ2VkQXBpc1Rlc3Qua3QgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvQ2hlY2tGbGFnZ2VkQXBpc1Rlc3Qua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3YWMxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9zcmMvY29tL2FuZHJvaWQvY2hlY2tmbGFnZ2VkYXBpcy9DaGVja0ZsYWdnZWRBcGlzVGVzdC5rdApAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNoZWNrZmxhZ2dlZGFwaXMKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5BY29uZmlnCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLkFjb25maWcuZmxhZ19zdGF0ZS5ESVNBQkxFRAoraW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5BY29uZmlnLmZsYWdfc3RhdGUuRU5BQkxFRAoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW0KK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFscworaW1wb3J0IG9yZy5qdW5pdC5UZXN0CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0CisKK3ByaXZhdGUgdmFsIEFQSV9TSUdOQVRVUkUgPQorICAgICIiIgorICAgICAgLy8gU2lnbmF0dXJlIGZvcm1hdDogMi4wCisgICAgICBwYWNrYWdlIGFuZHJvaWQgeworICAgICAgICBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBmaW5hbCBjbGFzcyBDbGF6eiB7CisgICAgICAgICAgY3RvciBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBDbGF6eigpOworICAgICAgICAgIGZpZWxkIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9PID0gMTsgLy8gMHgxCisgICAgICAgICAgbWV0aG9kIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGludCBnZXRFcnJvckNvZGUoKTsKKyAgICAgICAgICBtZXRob2QgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgYm9vbGVhbiBzZXREYXRhKGludCwgaW50W11bXSwgQE5vbk51bGwgYW5kcm9pZC51dGlsLlV0aWxpdHk8VCwgVT4pOworICAgICAgICAgIG1ldGhvZCBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBib29sZWFuIHNldFZhcmlhYmxlRGF0YShpbnQsIGFuZHJvaWQudXRpbC5BdG9tLi4uKTsKKyAgICAgICAgICBtZXRob2QgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgYm9vbGVhbiBpbm5lckNsYXNzQXJnKGFuZHJvaWQuQ2xhenouQnVpbGRlcik7CisgICAgICAgIH0KKyAgICAgICAgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5iYXIiKSBwdWJsaWMgc3RhdGljIGNsYXNzIENsYXp6LkJ1aWxkZXIgeworICAgICAgICB9CisgICAgICB9CisiIiIKKyAgICAgICAgLnRyaW0oKQorCitwcml2YXRlIHZhbCBBUElfVkVSU0lPTlMgPQorICAgICIiIgorICAgICAgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyAgICAgIDxhcGkgdmVyc2lvbj0iMyI+CisgICAgICAgIDxjbGFzcyBuYW1lPSJhbmRyb2lkL0NsYXp6IiBzaW5jZT0iMSI+CisgICAgICAgICAgPGV4dGVuZHMgbmFtZT0iamF2YS9sYW5nL09iamVjdCIvPgorICAgICAgICAgIDxtZXRob2QgbmFtZT0iJmx0O2luaXQ+KClWIi8+CisgICAgICAgICAgPGZpZWxkIG5hbWU9IkZPTyIvPgorICAgICAgICAgIDxtZXRob2QgbmFtZT0iZ2V0RXJyb3JDb2RlKClJIi8+CisgICAgICAgICAgPG1ldGhvZCBuYW1lPSJzZXREYXRhKElbW0lMYW5kcm9pZC91dGlsL1V0aWxpdHk7KVoiLz4KKyAgICAgICAgICA8bWV0aG9kIG5hbWU9InNldFZhcmlhYmxlRGF0YShJW0xhbmRyb2lkL3V0aWwvQXRvbTspWiIvPgorICAgICAgICAgIDxtZXRob2QgbmFtZT0iaW5uZXJDbGFzc0FyZyhMYW5kcm9pZC9DbGF6eiR7IiQifUJ1aWxkZXI7KSIvPgorICAgICAgICA8L2NsYXNzPgorICAgICAgICA8Y2xhc3MgbmFtZT0iYW5kcm9pZC9DbGF6eiR7IiQifUJ1aWxkZXIiIHNpbmNlPSIyIj4KKyAgICAgICAgICA8ZXh0ZW5kcyBuYW1lPSJqYXZhL2xhbmcvT2JqZWN0Ii8+CisgICAgICAgIDwvY2xhc3M+CisgICAgICA8L2FwaT4KKyIiIgorICAgICAgICAudHJpbSgpCisKK3ByaXZhdGUgZnVuIGdlbmVyYXRlRmxhZ3NQcm90bygKKyAgICBmb29TdGF0ZTogQWNvbmZpZy5mbGFnX3N0YXRlLAorICAgIGJhclN0YXRlOiBBY29uZmlnLmZsYWdfc3RhdGUKKyk6IElucHV0U3RyZWFtIHsKKyAgdmFsIGZvb0ZsYWcgPQorICAgICAgQWNvbmZpZy5wYXJzZWRfZmxhZworICAgICAgICAgIC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAuc2V0UGFja2FnZSgiYW5kcm9pZC5mbGFnIikKKyAgICAgICAgICAuc2V0TmFtZSgiZm9vIikKKyAgICAgICAgICAuc2V0U3RhdGUoZm9vU3RhdGUpCisgICAgICAgICAgLnNldFBlcm1pc3Npb24oQWNvbmZpZy5mbGFnX3Blcm1pc3Npb24uUkVBRF9PTkxZKQorICAgICAgICAgIC5idWlsZCgpCisgIHZhbCBiYXJGbGFnID0KKyAgICAgIEFjb25maWcucGFyc2VkX2ZsYWcKKyAgICAgICAgICAubmV3QnVpbGRlcigpCisgICAgICAgICAgLnNldFBhY2thZ2UoImFuZHJvaWQuZmxhZyIpCisgICAgICAgICAgLnNldE5hbWUoImJhciIpCisgICAgICAgICAgLnNldFN0YXRlKGJhclN0YXRlKQorICAgICAgICAgIC5zZXRQZXJtaXNzaW9uKEFjb25maWcuZmxhZ19wZXJtaXNzaW9uLlJFQURfT05MWSkKKyAgICAgICAgICAuYnVpbGQoKQorICB2YWwgZmxhZ3MgPQorICAgICAgQWNvbmZpZy5wYXJzZWRfZmxhZ3MubmV3QnVpbGRlcigpLmFkZFBhcnNlZEZsYWcoZm9vRmxhZykuYWRkUGFyc2VkRmxhZyhiYXJGbGFnKS5idWlsZCgpCisgIHZhbCBiaW5hcnlQcm90byA9IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisgIGZsYWdzLndyaXRlVG8oYmluYXJ5UHJvdG8pCisgIHJldHVybiBCeXRlQXJyYXlJbnB1dFN0cmVhbShiaW5hcnlQcm90by50b0J5dGVBcnJheSgpKQorfQorCitAUnVuV2l0aChKVW5pdDQ6OmNsYXNzKQorY2xhc3MgQ2hlY2tGbGFnZ2VkQXBpc1Rlc3QgeworICBAVGVzdAorICBmdW4gdGVzdFBhcnNlQXBpU2lnbmF0dXJlKCkgeworICAgIHZhbCBleHBlY3RlZCA9CisgICAgICAgIHNldE9mKAorICAgICAgICAgICAgUGFpcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlQ2xhc3MoImFuZHJvaWQvQ2xhenoiLCAiamF2YS9sYW5nL09iamVjdCIsIHNldE9mKCkpLAorICAgICAgICAgICAgICAgIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBQYWlyKFN5bWJvbC5jcmVhdGVNZXRob2QoImFuZHJvaWQvQ2xhenoiLCAiQ2xhenooKSIpLCBGbGFnKCJhbmRyb2lkLmZsYWcuZm9vIikpLAorICAgICAgICAgICAgUGFpcihTeW1ib2wuY3JlYXRlRmllbGQoImFuZHJvaWQvQ2xhenoiLCAiRk9PIiksIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBQYWlyKFN5bWJvbC5jcmVhdGVNZXRob2QoImFuZHJvaWQvQ2xhenoiLCAiZ2V0RXJyb3JDb2RlKCkiKSwgRmxhZygiYW5kcm9pZC5mbGFnLmZvbyIpKSwKKyAgICAgICAgICAgIFBhaXIoCisgICAgICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJzZXREYXRhKElbW0lMYW5kcm9pZC91dGlsL1V0aWxpdHk7KSIpLAorICAgICAgICAgICAgICAgIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBQYWlyKAorICAgICAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVNZXRob2QoImFuZHJvaWQvQ2xhenoiLCAic2V0VmFyaWFibGVEYXRhKElbTGFuZHJvaWQvdXRpbC9BdG9tOykiKSwKKyAgICAgICAgICAgICAgICBGbGFnKCJhbmRyb2lkLmZsYWcuZm9vIikpLAorICAgICAgICAgICAgUGFpcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6IiwgImlubmVyQ2xhc3NBcmcoTGFuZHJvaWQvQ2xhenovQnVpbGRlcjspIiksCisgICAgICAgICAgICAgICAgRmxhZygiYW5kcm9pZC5mbGFnLmZvbyIpKSwKKyAgICAgICAgICAgIFBhaXIoCisgICAgICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZUNsYXNzKCJhbmRyb2lkL0NsYXp6L0J1aWxkZXIiLCAiamF2YS9sYW5nL09iamVjdCIsIHNldE9mKCkpLAorICAgICAgICAgICAgICAgIEZsYWcoImFuZHJvaWQuZmxhZy5iYXIiKSksCisgICAgICAgICkKKyAgICB2YWwgYWN0dWFsID0gcGFyc2VBcGlTaWduYXR1cmUoImluLW1lbW9yeSIsIEFQSV9TSUdOQVRVUkUuYnl0ZUlucHV0U3RyZWFtKCkpCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpCisgIH0KKworICBAVGVzdAorICBmdW4gdGVzdFBhcnNlQXBpU2lnbmF0dXJlSW50ZXJmYWNlc0luaGVyaXRGcm9tSmF2YUxhbmdPYmplY3QoKSB7CisgICAgdmFsIGFwaVNpZ25hdHVyZSA9CisgICAgICAgICIiIgorICAgICAgICAgIC8vIFNpZ25hdHVyZSBmb3JtYXQ6IDIuMAorICAgICAgICAgIHBhY2thZ2UgYW5kcm9pZCB7CisgICAgICAgICAgICBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBpbnRlcmZhY2UgSW50ZXJmYWNlIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICIiIgorICAgICAgICAgICAgLnRyaW0oKQorICAgIHZhbCBleHBlY3RlZCA9CisgICAgICAgIHNldE9mKAorICAgICAgICAgICAgUGFpcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlQ2xhc3MoImFuZHJvaWQvSW50ZXJmYWNlIiwgImphdmEvbGFuZy9PYmplY3QiLCBzZXRPZigpKSwKKyAgICAgICAgICAgICAgICBGbGFnKCJhbmRyb2lkLmZsYWcuZm9vIikpKQorICAgIHZhbCBhY3R1YWwgPSBwYXJzZUFwaVNpZ25hdHVyZSgiaW4tbWVtb3J5IiwgYXBpU2lnbmF0dXJlLmJ5dGVJbnB1dFN0cmVhbSgpKQorICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKQorICB9CisKKyAgQFRlc3QKKyAgZnVuIHRlc3RQYXJzZUZsYWdWYWx1ZXMoKSB7CisgICAgdmFsIGV4cGVjdGVkOiBNYXA8RmxhZywgQm9vbGVhbj4gPQorICAgICAgICBtYXBPZihGbGFnKCJhbmRyb2lkLmZsYWcuZm9vIikgdG8gdHJ1ZSwgRmxhZygiYW5kcm9pZC5mbGFnLmJhciIpIHRvIHRydWUpCisgICAgdmFsIGFjdHVhbCA9IHBhcnNlRmxhZ1ZhbHVlcyhnZW5lcmF0ZUZsYWdzUHJvdG8oRU5BQkxFRCwgRU5BQkxFRCkpCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpCisgIH0KKworICBAVGVzdAorICBmdW4gdGVzdFBhcnNlQXBpVmVyc2lvbnMoKSB7CisgICAgdmFsIGV4cGVjdGVkOiBTZXQ8U3ltYm9sPiA9CisgICAgICAgIHNldE9mKAorICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZUNsYXNzKCJhbmRyb2lkL0NsYXp6IiwgImphdmEvbGFuZy9PYmplY3QiLCBzZXRPZigpKSwKKyAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVNZXRob2QoImFuZHJvaWQvQ2xhenoiLCAiQ2xhenooKSIpLAorICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZUZpZWxkKCJhbmRyb2lkL0NsYXp6IiwgIkZPTyIpLAorICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJnZXRFcnJvckNvZGUoKSIpLAorICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJzZXREYXRhKElbW0lMYW5kcm9pZC91dGlsL1V0aWxpdHk7KSIpLAorICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJzZXRWYXJpYWJsZURhdGEoSVtMYW5kcm9pZC91dGlsL0F0b207KSIpLAorICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJpbm5lckNsYXNzQXJnKExhbmRyb2lkL0NsYXp6L0J1aWxkZXI7KSIpLAorICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZUNsYXNzKCJhbmRyb2lkL0NsYXp6L0J1aWxkZXIiLCAiamF2YS9sYW5nL09iamVjdCIsIHNldE9mKCkpLAorICAgICAgICApCisgICAgdmFsIGFjdHVhbCA9IHBhcnNlQXBpVmVyc2lvbnMoQVBJX1ZFUlNJT05TLmJ5dGVJbnB1dFN0cmVhbSgpKQorICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKQorICB9CisKKyAgQFRlc3QKKyAgZnVuIHRlc3RQYXJzZUFwaVZlcnNpb25zTmVzdGVkQ2xhc3NlcygpIHsKKyAgICB2YWwgYXBpVmVyc2lvbnMgPQorICAgICAgICAiIiIKKyAgICAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorICAgICAgICAgIDxhcGkgdmVyc2lvbj0iMyI+CisgICAgICAgICAgICA8Y2xhc3MgbmFtZT0iYW5kcm9pZC9DbGF6eiR7JyQnfUZvbyR7JyQnfUJhciIgc2luY2U9IjEiPgorICAgICAgICAgICAgICA8ZXh0ZW5kcyBuYW1lPSJqYXZhL2xhbmcvT2JqZWN0Ii8+CisgICAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iJmx0O2luaXQ+KClWIi8+CisgICAgICAgICAgICA8L2NsYXNzPgorICAgICAgICAgIDwvYXBpPgorICAgICAgICAiIiIKKyAgICAgICAgICAgIC50cmltKCkKKyAgICB2YWwgZXhwZWN0ZWQ6IFNldDxTeW1ib2w+ID0KKyAgICAgICAgc2V0T2YoCisgICAgICAgICAgICBTeW1ib2wuY3JlYXRlQ2xhc3MoImFuZHJvaWQvQ2xhenovRm9vL0JhciIsICJqYXZhL2xhbmcvT2JqZWN0Iiwgc2V0T2YoKSksCisgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6L0Zvby9CYXIiLCAiQmFyKCkiKSwKKyAgICAgICAgKQorICAgIHZhbCBhY3R1YWwgPSBwYXJzZUFwaVZlcnNpb25zKGFwaVZlcnNpb25zLmJ5dGVJbnB1dFN0cmVhbSgpKQorICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKQorICB9CisKKyAgQFRlc3QKKyAgZnVuIHRlc3RGaW5kRXJyb3JzTm9FcnJvcnMoKSB7CisgICAgdmFsIGV4cGVjdGVkID0gc2V0T2Y8QXBpRXJyb3I+KCkKKyAgICB2YWwgYWN0dWFsID0KKyAgICAgICAgZmluZEVycm9ycygKKyAgICAgICAgICAgIHBhcnNlQXBpU2lnbmF0dXJlKCJpbi1tZW1vcnkiLCBBUElfU0lHTkFUVVJFLmJ5dGVJbnB1dFN0cmVhbSgpKSwKKyAgICAgICAgICAgIHBhcnNlRmxhZ1ZhbHVlcyhnZW5lcmF0ZUZsYWdzUHJvdG8oRU5BQkxFRCwgRU5BQkxFRCkpLAorICAgICAgICAgICAgcGFyc2VBcGlWZXJzaW9ucyhBUElfVkVSU0lPTlMuYnl0ZUlucHV0U3RyZWFtKCkpKQorICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKQorICB9CisKKyAgQFRlc3QKKyAgZnVuIHRlc3RGaW5kRXJyb3JzVmVyaWZ5SW1wbGVtZW50cygpIHsKKyAgICB2YWwgYXBpU2lnbmF0dXJlID0KKyAgICAgICAgIiIiCisgICAgICAgICAgLy8gU2lnbmF0dXJlIGZvcm1hdDogMi4wCisgICAgICAgICAgcGFja2FnZSBhbmRyb2lkIHsKKyAgICAgICAgICAgIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGZpbmFsIGNsYXNzIENsYXp6IGltcGxlbWVudHMgYW5kcm9pZC5JbnRlcmZhY2UgeworICAgICAgICAgICAgICBtZXRob2QgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgYm9vbGVhbiBmb28oKTsKKyAgICAgICAgICAgICAgbWV0aG9kIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGJvb2xlYW4gYmFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIEludGVyZmFjZSB7CisgICAgICAgICAgICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBiYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICIiIgorICAgICAgICAgICAgLnRyaW0oKQorCisgICAgdmFsIGFwaVZlcnNpb25zID0KKyAgICAgICAgIiIiCisgICAgICAgICAgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyAgICAgICAgICA8YXBpIHZlcnNpb249IjMiPgorICAgICAgICAgICAgPGNsYXNzIG5hbWU9ImFuZHJvaWQvQ2xhenoiIHNpbmNlPSIxIj4KKyAgICAgICAgICAgICAgPGV4dGVuZHMgbmFtZT0iamF2YS9sYW5nL09iamVjdCIvPgorICAgICAgICAgICAgICA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkL0ludGVyZmFjZSIvPgorICAgICAgICAgICAgICA8bWV0aG9kIG5hbWU9ImZvbygpWiIvPgorICAgICAgICAgICAgPC9jbGFzcz4KKyAgICAgICAgICAgIDxjbGFzcyBuYW1lPSJhbmRyb2lkL0ludGVyZmFjZSIgc2luY2U9IjEiPgorICAgICAgICAgICAgICA8bWV0aG9kIG5hbWU9ImJhcigpWiIvPgorICAgICAgICAgICAgPC9jbGFzcz4KKyAgICAgICAgICA8L2FwaT4KKyAgICAgICAgIiIiCisgICAgICAgICAgICAudHJpbSgpCisKKyAgICB2YWwgZXhwZWN0ZWQgPSBzZXRPZjxBcGlFcnJvcj4oKQorICAgIHZhbCBhY3R1YWwgPQorICAgICAgICBmaW5kRXJyb3JzKAorICAgICAgICAgICAgcGFyc2VBcGlTaWduYXR1cmUoImluLW1lbW9yeSIsIGFwaVNpZ25hdHVyZS5ieXRlSW5wdXRTdHJlYW0oKSksCisgICAgICAgICAgICBwYXJzZUZsYWdWYWx1ZXMoZ2VuZXJhdGVGbGFnc1Byb3RvKEVOQUJMRUQsIEVOQUJMRUQpKSwKKyAgICAgICAgICAgIHBhcnNlQXBpVmVyc2lvbnMoYXBpVmVyc2lvbnMuYnl0ZUlucHV0U3RyZWFtKCkpKQorICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKQorICB9CisKKyAgQFRlc3QKKyAgZnVuIHRlc3RGaW5kRXJyb3JzVmVyaWZ5U3VwZXJjbGFzcygpIHsKKyAgICB2YWwgYXBpU2lnbmF0dXJlID0KKyAgICAgICAgIiIiCisgICAgICAgICAgLy8gU2lnbmF0dXJlIGZvcm1hdDogMi4wCisgICAgICAgICAgcGFja2FnZSBhbmRyb2lkIHsKKyAgICAgICAgICAgIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGZpbmFsIGNsYXNzIEMgZXh0ZW5kcyBhbmRyb2lkLkIgeworICAgICAgICAgICAgICBtZXRob2QgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgYm9vbGVhbiBjKCk7CisgICAgICAgICAgICAgIG1ldGhvZCBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBib29sZWFuIGIoKTsKKyAgICAgICAgICAgICAgbWV0aG9kIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGJvb2xlYW4gYSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIGZpbmFsIGNsYXNzIEIgZXh0ZW5kcyBhbmRyb2lkLkEgeworICAgICAgICAgICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gYigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIGZpbmFsIGNsYXNzIEEgeworICAgICAgICAgICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gYSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgIiIiCisgICAgICAgICAgICAudHJpbSgpCisKKyAgICB2YWwgYXBpVmVyc2lvbnMgPQorICAgICAgICAiIiIKKyAgICAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorICAgICAgICAgIDxhcGkgdmVyc2lvbj0iMyI+CisgICAgICAgICAgICA8Y2xhc3MgbmFtZT0iYW5kcm9pZC9DIiBzaW5jZT0iMSI+CisgICAgICAgICAgICAgIDxleHRlbmRzIG5hbWU9ImFuZHJvaWQvQiIvPgorICAgICAgICAgICAgICA8bWV0aG9kIG5hbWU9ImMoKVoiLz4KKyAgICAgICAgICAgIDwvY2xhc3M+CisgICAgICAgICAgICA8Y2xhc3MgbmFtZT0iYW5kcm9pZC9CIiBzaW5jZT0iMSI+CisgICAgICAgICAgICAgIDxleHRlbmRzIG5hbWU9ImFuZHJvaWQvQSIvPgorICAgICAgICAgICAgICA8bWV0aG9kIG5hbWU9ImIoKVoiLz4KKyAgICAgICAgICAgIDwvY2xhc3M+CisgICAgICAgICAgICA8Y2xhc3MgbmFtZT0iYW5kcm9pZC9BIiBzaW5jZT0iMSI+CisgICAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iYSgpWiIvPgorICAgICAgICAgICAgPC9jbGFzcz4KKyAgICAgICAgICA8L2FwaT4KKyAgICAgICAgIiIiCisgICAgICAgICAgICAudHJpbSgpCisKKyAgICB2YWwgZXhwZWN0ZWQgPSBzZXRPZjxBcGlFcnJvcj4oKQorICAgIHZhbCBhY3R1YWwgPQorICAgICAgICBmaW5kRXJyb3JzKAorICAgICAgICAgICAgcGFyc2VBcGlTaWduYXR1cmUoImluLW1lbW9yeSIsIGFwaVNpZ25hdHVyZS5ieXRlSW5wdXRTdHJlYW0oKSksCisgICAgICAgICAgICBwYXJzZUZsYWdWYWx1ZXMoZ2VuZXJhdGVGbGFnc1Byb3RvKEVOQUJMRUQsIEVOQUJMRUQpKSwKKyAgICAgICAgICAgIHBhcnNlQXBpVmVyc2lvbnMoYXBpVmVyc2lvbnMuYnl0ZUlucHV0U3RyZWFtKCkpKQorICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKQorICB9CisKKyAgQFRlc3QKKyAgZnVuIHRlc3ROZXN0ZWRGbGFnc091dGVyRmxhZ1dpbnMoKSB7CisgICAgdmFsIGFwaVNpZ25hdHVyZSA9CisgICAgICAgICIiIgorICAgICAgICAgIC8vIFNpZ25hdHVyZSBmb3JtYXQ6IDIuMAorICAgICAgICAgIHBhY2thZ2UgYW5kcm9pZCB7CisgICAgICAgICAgICBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBmaW5hbCBjbGFzcyBBIHsKKyAgICAgICAgICAgICAgbWV0aG9kIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuYmFyIikgcHVibGljIGJvb2xlYW4gbWV0aG9kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmJhciIpIHB1YmxpYyBmaW5hbCBjbGFzcyBCIHsKKyAgICAgICAgICAgICAgbWV0aG9kIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGJvb2xlYW4gbWV0aG9kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAiIiIKKyAgICAgICAgICAgIC50cmltKCkKKworICAgIHZhbCBhcGlWZXJzaW9ucyA9CisgICAgICAgICIiIgorICAgICAgICAgIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgICAgICAgICAgPGFwaSB2ZXJzaW9uPSIzIj4KKyAgICAgICAgICAgIDxjbGFzcyBuYW1lPSJhbmRyb2lkL0IiIHNpbmNlPSIxIj4KKyAgICAgICAgICAgIDxleHRlbmRzIG5hbWU9ImphdmEvbGFuZy9PYmplY3QiLz4KKyAgICAgICAgICAgIDwvY2xhc3M+CisgICAgICAgICAgPC9hcGk+CisgICAgICAgICIiIgorICAgICAgICAgICAgLnRyaW0oKQorCisgICAgdmFsIGV4cGVjdGVkID0gc2V0T2Y8QXBpRXJyb3I+KCkKKyAgICB2YWwgYWN0dWFsID0KKyAgICAgICAgZmluZEVycm9ycygKKyAgICAgICAgICAgIHBhcnNlQXBpU2lnbmF0dXJlKCJpbi1tZW1vcnkiLCBhcGlTaWduYXR1cmUuYnl0ZUlucHV0U3RyZWFtKCkpLAorICAgICAgICAgICAgcGFyc2VGbGFnVmFsdWVzKGdlbmVyYXRlRmxhZ3NQcm90byhESVNBQkxFRCwgRU5BQkxFRCkpLAorICAgICAgICAgICAgcGFyc2VBcGlWZXJzaW9ucyhhcGlWZXJzaW9ucy5ieXRlSW5wdXRTdHJlYW0oKSkpCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpCisgIH0KKworICBAVGVzdAorICBmdW4gdGVzdEZpbmRFcnJvcnNEaXNhYmxlZEZsYWdnZWRBcGlJc1ByZXNlbnQoKSB7CisgICAgdmFsIGV4cGVjdGVkID0KKyAgICAgICAgc2V0T2Y8QXBpRXJyb3I+KAorICAgICAgICAgICAgRGlzYWJsZWRGbGFnZ2VkQXBpSXNQcmVzZW50RXJyb3IoCisgICAgICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZUNsYXNzKCJhbmRyb2lkL0NsYXp6IiwgImphdmEvbGFuZy9PYmplY3QiLCBzZXRPZigpKSwKKyAgICAgICAgICAgICAgICBGbGFnKCJhbmRyb2lkLmZsYWcuZm9vIikpLAorICAgICAgICAgICAgRGlzYWJsZWRGbGFnZ2VkQXBpSXNQcmVzZW50RXJyb3IoCisgICAgICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJDbGF6eigpIiksIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBEaXNhYmxlZEZsYWdnZWRBcGlJc1ByZXNlbnRFcnJvcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlRmllbGQoImFuZHJvaWQvQ2xhenoiLCAiRk9PIiksIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBEaXNhYmxlZEZsYWdnZWRBcGlJc1ByZXNlbnRFcnJvcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6IiwgImdldEVycm9yQ29kZSgpIiksIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBEaXNhYmxlZEZsYWdnZWRBcGlJc1ByZXNlbnRFcnJvcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6IiwgInNldERhdGEoSVtbSUxhbmRyb2lkL3V0aWwvVXRpbGl0eTspIiksCisgICAgICAgICAgICAgICAgRmxhZygiYW5kcm9pZC5mbGFnLmZvbyIpKSwKKyAgICAgICAgICAgIERpc2FibGVkRmxhZ2dlZEFwaUlzUHJlc2VudEVycm9yKAorICAgICAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVNZXRob2QoImFuZHJvaWQvQ2xhenoiLCAic2V0VmFyaWFibGVEYXRhKElbTGFuZHJvaWQvdXRpbC9BdG9tOykiKSwKKyAgICAgICAgICAgICAgICBGbGFnKCJhbmRyb2lkLmZsYWcuZm9vIikpLAorICAgICAgICAgICAgRGlzYWJsZWRGbGFnZ2VkQXBpSXNQcmVzZW50RXJyb3IoCisgICAgICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJpbm5lckNsYXNzQXJnKExhbmRyb2lkL0NsYXp6L0J1aWxkZXI7KSIpLAorICAgICAgICAgICAgICAgIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBEaXNhYmxlZEZsYWdnZWRBcGlJc1ByZXNlbnRFcnJvcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlQ2xhc3MoImFuZHJvaWQvQ2xhenovQnVpbGRlciIsICJqYXZhL2xhbmcvT2JqZWN0Iiwgc2V0T2YoKSksCisgICAgICAgICAgICAgICAgRmxhZygiYW5kcm9pZC5mbGFnLmJhciIpKSwKKyAgICAgICAgKQorICAgIHZhbCBhY3R1YWwgPQorICAgICAgICBmaW5kRXJyb3JzKAorICAgICAgICAgICAgcGFyc2VBcGlTaWduYXR1cmUoImluLW1lbW9yeSIsIEFQSV9TSUdOQVRVUkUuYnl0ZUlucHV0U3RyZWFtKCkpLAorICAgICAgICAgICAgcGFyc2VGbGFnVmFsdWVzKGdlbmVyYXRlRmxhZ3NQcm90byhESVNBQkxFRCwgRElTQUJMRUQpKSwKKyAgICAgICAgICAgIHBhcnNlQXBpVmVyc2lvbnMoQVBJX1ZFUlNJT05TLmJ5dGVJbnB1dFN0cmVhbSgpKSkKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkKKyAgfQorCisgIEBUZXN0CisgIGZ1biB0ZXN0TGlzdEZsYWdnZWRBcGlzKCkgeworICAgIHZhbCBleHBlY3RlZCA9CisgICAgICAgIGxpc3RPZigKKyAgICAgICAgICAgICJhbmRyb2lkLmZsYWcuYmFyIERJU0FCTEVEIGFuZHJvaWQvQ2xhenovQnVpbGRlciIsCisgICAgICAgICAgICAiYW5kcm9pZC5mbGFnLmZvbyBFTkFCTEVEIGFuZHJvaWQvQ2xhenoiLAorICAgICAgICAgICAgImFuZHJvaWQuZmxhZy5mb28gRU5BQkxFRCBhbmRyb2lkL0NsYXp6L0NsYXp6KCkiLAorICAgICAgICAgICAgImFuZHJvaWQuZmxhZy5mb28gRU5BQkxFRCBhbmRyb2lkL0NsYXp6L0ZPTyIsCisgICAgICAgICAgICAiYW5kcm9pZC5mbGFnLmZvbyBFTkFCTEVEIGFuZHJvaWQvQ2xhenovZ2V0RXJyb3JDb2RlKCkiLAorICAgICAgICAgICAgImFuZHJvaWQuZmxhZy5mb28gRU5BQkxFRCBhbmRyb2lkL0NsYXp6L2lubmVyQ2xhc3NBcmcoTGFuZHJvaWQvQ2xhenovQnVpbGRlcjspIiwKKyAgICAgICAgICAgICJhbmRyb2lkLmZsYWcuZm9vIEVOQUJMRUQgYW5kcm9pZC9DbGF6ei9zZXREYXRhKElbW0lMYW5kcm9pZC91dGlsL1V0aWxpdHk7KSIsCisgICAgICAgICAgICAiYW5kcm9pZC5mbGFnLmZvbyBFTkFCTEVEIGFuZHJvaWQvQ2xhenovc2V0VmFyaWFibGVEYXRhKElbTGFuZHJvaWQvdXRpbC9BdG9tOykiKQorICAgIHZhbCBhY3R1YWwgPQorICAgICAgICBsaXN0RmxhZ2dlZEFwaXMoCisgICAgICAgICAgICBwYXJzZUFwaVNpZ25hdHVyZSgiaW4tbWVtb3J5IiwgQVBJX1NJR05BVFVSRS5ieXRlSW5wdXRTdHJlYW0oKSksCisgICAgICAgICAgICBwYXJzZUZsYWdWYWx1ZXMoZ2VuZXJhdGVGbGFnc1Byb3RvKEVOQUJMRUQsIERJU0FCTEVEKSkpCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpCisgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9zcmMvY29tL2FuZHJvaWQvY2hlY2tmbGFnZ2VkYXBpcy9NYWluLmt0IGIvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL3NyYy9jb20vYW5kcm9pZC9jaGVja2ZsYWdnZWRhcGlzL01haW4ua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyM2MyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9zcmMvY29tL2FuZHJvaWQvY2hlY2tmbGFnZ2VkYXBpcy9NYWluLmt0CkBAIC0wLDAgKzEsNTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK0BmaWxlOkp2bU5hbWUoIk1haW4iKQorCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNoZWNrZmxhZ2dlZGFwaXMKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5BY29uZmlnCitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubWV0YWxhdmEubW9kZWwuQmFzZUl0ZW1WaXNpdG9yCitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubWV0YWxhdmEubW9kZWwuQ2FsbGFibGVJdGVtCitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubWV0YWxhdmEubW9kZWwuQ2xhc3NJdGVtCitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubWV0YWxhdmEubW9kZWwuRmllbGRJdGVtCitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubWV0YWxhdmEubW9kZWwuSXRlbQoraW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLm1ldGFsYXZhLm1vZGVsLnRleHQuQXBpRmlsZQoraW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QuY29yZS5DbGlrdENvbW1hbmQKK2ltcG9ydCBjb20uZ2l0aHViLmFqYWx0LmNsaWt0LmNvcmUuUHJvZ3JhbVJlc3VsdAoraW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QuY29yZS5zdWJjb21tYW5kcworaW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QucGFyYW1ldGVycy5vcHRpb25zLmhlbHAKK2ltcG9ydCBjb20uZ2l0aHViLmFqYWx0LmNsaWt0LnBhcmFtZXRlcnMub3B0aW9ucy5vcHRpb24KK2ltcG9ydCBjb20uZ2l0aHViLmFqYWx0LmNsaWt0LnBhcmFtZXRlcnMub3B0aW9ucy5yZXF1aXJlZAoraW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QucGFyYW1ldGVycy50eXBlcy5wYXRoCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbQoraW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlCisKKy8qKgorICogQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzLCBtZXRob2Qgb3IgZmllbGQuCisgKgorICogVGhpcyB0b29sIHJlYWRzIGEgbXVsdGl0dWRlIG9mIGlucHV0IGZvcm1hdHMgYWxsIG9mIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBwYXRoIHRvCisgKiBhIEphdmEgc3ltYm9sIHNsaWdodGx5IGRpZmZlcmVudGx5LiBUbyBrZWVwIHRoaW5ncyBjb25zaXN0ZW50LCBhbGwgcGFyc2VkIEFQSXMgYXJlIGNvbnZlcnRlZCB0bworICogU3ltYm9scy4KKyAqCisgKiBTeW1ib2xzIGFyZSBlbmNvZGVkIHVzaW5nIHRoZSBmb3JtYXQgc2ltaWxhciB0byB0aGUgb25lIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDQuMy4yIG9mIHRoZSBKVk0KKyAqIHNwZWMgWzFdLCB0aGF0IGlzLCAicGFja2FnZS5jbGFzcy5pbm5lci1jbGFzcy5tZXRob2QoaW50LCBpbnRbXSwgYW5kcm9pZC51dGlsLkNsYXp6KSIgaXMKKyAqIHJlcHJlc2VudGVkIGFzCisgKiA8cHJlPgorICogICBwYWNrYWdlLmNsYXNzLmlubmVyLWNsYXNzLm1ldGhvZChJSVtMYW5kcm9pZC91dGlsL0NsYXp6OykKKyAqIDxwcmU+CisgKgorICogV2hlcmUgcG9zc2libGUsIHRoZSBmb3JtYXQgaGFzIGJlZW4gc2ltcGxpZmllZCAodG8gbWFrZSB0cmFuc2xhdGlvbiBvZiB0aGUKKyAqIHZhcmlvdXMgaW5wdXQgZm9ybWF0cyBlYXNpZXIpOiBmb3IgaW5zdGFuY2UsIG9ubHkgLyBpcyB1c2VkIGFzIGRlbGltaXRlciAoIworICogYW5kICQgYXJlIG5ldmVyIHVzZWQpLgorICoKKyAqIDEuIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qdm1zL3NlNy9odG1sL2p2bXMtNC5odG1sI2p2bXMtNC4zLjIKKyAqLworaW50ZXJuYWwgc2VhbGVkIGNsYXNzIFN5bWJvbCB7CisgIGNvbXBhbmlvbiBvYmplY3QgeworICAgIHByaXZhdGUgdmFsIEZPUkJJRERFTl9DSEFSUyA9IGxpc3RPZignIycsICckJywgJy4nKQorCisgICAgZnVuIGNyZWF0ZUNsYXNzKGNsYXp6OiBTdHJpbmcsIHN1cGVyY2xhc3M6IFN0cmluZz8sIGludGVyZmFjZXM6IFNldDxTdHJpbmc+KTogU3ltYm9sIHsKKyAgICAgIHJldHVybiBDbGFzc1N5bWJvbCgKKyAgICAgICAgICB0b0ludGVybmFsRm9ybWF0KGNsYXp6KSwKKyAgICAgICAgICBzdXBlcmNsYXNzPy5sZXQgeyB0b0ludGVybmFsRm9ybWF0KGl0KSB9LAorICAgICAgICAgIGludGVyZmFjZXMubWFwIHsgdG9JbnRlcm5hbEZvcm1hdChpdCkgfS50b1NldCgpKQorICAgIH0KKworICAgIGZ1biBjcmVhdGVGaWVsZChjbGF6ejogU3RyaW5nLCBmaWVsZDogU3RyaW5nKTogU3ltYm9sIHsKKyAgICAgIHJlcXVpcmUoIWZpZWxkLmNvbnRhaW5zKCIoIikgJiYgIWZpZWxkLmNvbnRhaW5zKCIpIikpCisgICAgICByZXR1cm4gTWVtYmVyU3ltYm9sKHRvSW50ZXJuYWxGb3JtYXQoY2xhenopLCB0b0ludGVybmFsRm9ybWF0KGZpZWxkKSkKKyAgICB9CisKKyAgICBmdW4gY3JlYXRlTWV0aG9kKGNsYXp6OiBTdHJpbmcsIG1ldGhvZDogU3RyaW5nKTogU3ltYm9sIHsKKyAgICAgIHJldHVybiBNZW1iZXJTeW1ib2wodG9JbnRlcm5hbEZvcm1hdChjbGF6eiksIHRvSW50ZXJuYWxGb3JtYXQobWV0aG9kKSkKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuIHRvSW50ZXJuYWxGb3JtYXQobmFtZTogU3RyaW5nKTogU3RyaW5nIHsKKyAgICAgIHZhciBpbnRlcm5hbE5hbWUgPSBuYW1lCisgICAgICBmb3IgKGNoIGluIEZPUkJJRERFTl9DSEFSUykgeworICAgICAgICBpbnRlcm5hbE5hbWUgPSBpbnRlcm5hbE5hbWUucmVwbGFjZShjaCwgJy8nKQorICAgICAgfQorICAgICAgcmV0dXJuIGludGVybmFsTmFtZQorICAgIH0KKyAgfQorCisgIGFic3RyYWN0IGZ1biB0b1ByZXR0eVN0cmluZygpOiBTdHJpbmcKK30KKworaW50ZXJuYWwgZGF0YSBjbGFzcyBDbGFzc1N5bWJvbCgKKyAgICB2YWwgY2xheno6IFN0cmluZywKKyAgICB2YWwgc3VwZXJjbGFzczogU3RyaW5nPywKKyAgICB2YWwgaW50ZXJmYWNlczogU2V0PFN0cmluZz4KKykgOiBTeW1ib2woKSB7CisgIG92ZXJyaWRlIGZ1biB0b1ByZXR0eVN0cmluZygpOiBTdHJpbmcgPSAiJGNsYXp6IgorfQorCitpbnRlcm5hbCBkYXRhIGNsYXNzIE1lbWJlclN5bWJvbCh2YWwgY2xheno6IFN0cmluZywgdmFsIG1lbWJlcjogU3RyaW5nKSA6IFN5bWJvbCgpIHsKKyAgb3ZlcnJpZGUgZnVuIHRvUHJldHR5U3RyaW5nKCk6IFN0cmluZyA9ICIkY2xhenovJG1lbWJlciIKK30KKworLyoqCisgKiBDbGFzcyByZXByZXNlbnRpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGFuIGFjb25maWcgZmxhZy4KKyAqCisgKiBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIGZsYWcncyBwYWNrYWdlIGFuZCBuYW1lLCBzZXBhcmF0ZWQgYnkgYSBkb3QsIGUuZy46CisgKiA8cHJlPgorICogICBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcm8KKyAqIDxwcmU+CisgKi8KK0BKdm1JbmxpbmUKK2ludGVybmFsIHZhbHVlIGNsYXNzIEZsYWcodmFsIG5hbWU6IFN0cmluZykgeworICBvdmVycmlkZSBmdW4gdG9TdHJpbmcoKTogU3RyaW5nID0gbmFtZS50b1N0cmluZygpCit9CisKK2ludGVybmFsIHNlYWxlZCBjbGFzcyBBcGlFcnJvciB7CisgIGFic3RyYWN0IHZhbCBzeW1ib2w6IFN5bWJvbAorICBhYnN0cmFjdCB2YWwgZmxhZzogRmxhZworfQorCitpbnRlcm5hbCBkYXRhIGNsYXNzIEVuYWJsZWRGbGFnZ2VkQXBpTm90UHJlc2VudEVycm9yKAorICAgIG92ZXJyaWRlIHZhbCBzeW1ib2w6IFN5bWJvbCwKKyAgICBvdmVycmlkZSB2YWwgZmxhZzogRmxhZworKSA6IEFwaUVycm9yKCkgeworICBvdmVycmlkZSBmdW4gdG9TdHJpbmcoKTogU3RyaW5nIHsKKyAgICByZXR1cm4gImVycm9yOiBlbmFibGVkIEBGbGFnZ2VkQXBpIG5vdCBwcmVzZW50IGluIGJ1aWx0IGFydGlmYWN0OiBzeW1ib2w9JHtzeW1ib2wudG9QcmV0dHlTdHJpbmcoKX0gZmxhZz0kZmxhZyIKKyAgfQorfQorCitpbnRlcm5hbCBkYXRhIGNsYXNzIERpc2FibGVkRmxhZ2dlZEFwaUlzUHJlc2VudEVycm9yKAorICAgIG92ZXJyaWRlIHZhbCBzeW1ib2w6IFN5bWJvbCwKKyAgICBvdmVycmlkZSB2YWwgZmxhZzogRmxhZworKSA6IEFwaUVycm9yKCkgeworICBvdmVycmlkZSBmdW4gdG9TdHJpbmcoKTogU3RyaW5nIHsKKyAgICByZXR1cm4gImVycm9yOiBkaXNhYmxlZCBARmxhZ2dlZEFwaSBpcyBwcmVzZW50IGluIGJ1aWx0IGFydGlmYWN0OiBzeW1ib2w9JHtzeW1ib2wudG9QcmV0dHlTdHJpbmcoKX0gZmxhZz0kZmxhZyIKKyAgfQorfQorCitpbnRlcm5hbCBkYXRhIGNsYXNzIFVua25vd25GbGFnRXJyb3Iob3ZlcnJpZGUgdmFsIHN5bWJvbDogU3ltYm9sLCBvdmVycmlkZSB2YWwgZmxhZzogRmxhZykgOgorICAgIEFwaUVycm9yKCkgeworICBvdmVycmlkZSBmdW4gdG9TdHJpbmcoKTogU3RyaW5nIHsKKyAgICByZXR1cm4gImVycm9yOiB1bmtub3duIGZsYWc6IHN5bWJvbD0ke3N5bWJvbC50b1ByZXR0eVN0cmluZygpfSBmbGFnPSRmbGFnIgorICB9Cit9CisKK3ZhbCBBUkdfQVBJX1NJR05BVFVSRSA9ICItLWFwaS1zaWduYXR1cmUiCit2YWwgQVJHX0FQSV9TSUdOQVRVUkVfSEVMUCA9CisgICAgIiIiCitQYXRoIHRvIEFQSSBzaWduYXR1cmUgZmlsZS4KK1VzdWFsbHkgbmFtZWQgKmN1cnJlbnQudHh0LgorVGlwOiBgbSBmcmFtZXdvcmtzLWJhc2UtYXBpLWN1cnJlbnQudHh0YCB3aWxsIGdlbmVyYXRlIGEgZmlsZSB0aGF0IGluY2x1ZGVzIGFsbCBwbGF0Zm9ybSBhbmQgbWFpbmxpbmUgQVBJcy4KKyIiIgorCit2YWwgQVJHX0ZMQUdfVkFMVUVTID0gIi0tZmxhZy12YWx1ZXMiCit2YWwgQVJHX0ZMQUdfVkFMVUVTX0hFTFAgPQorICAgICIiIgorUGF0aCB0byBhY29uZmlnIHBhcnNlZF9mbGFncyBiaW5hcnkgcHJvdG8gZmlsZS4KK1RpcDogYG0gYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zYCB3aWxsIGdlbmVyYXRlIGEgZmlsZSB0aGF0IGluY2x1ZGVzIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZmxhZ3MuCisiIiIKKwordmFsIEFSR19BUElfVkVSU0lPTlMgPSAiLS1hcGktdmVyc2lvbnMiCit2YWwgQVJHX0FQSV9WRVJTSU9OU19IRUxQID0KKyAgICAiIiIKK1BhdGggdG8gQVBJIHZlcnNpb25zIFhNTCBmaWxlLgorVXN1YWxseSBuYW1lZCB4bWwtdmVyc2lvbnMueG1sLgorVGlwOiBgbSBzZGsgZGlzdGAgd2lsbCBnZW5lcmF0ZSBhIGZpbGUgdGhhdCBpbmNsdWRlcyBhbGwgcGxhdGZvcm0gYW5kIG1haW5saW5lIEFQSXMuCisiIiIKKworY2xhc3MgTWFpbkNvbW1hbmQgOiBDbGlrdENvbW1hbmQoKSB7CisgIG92ZXJyaWRlIGZ1biBydW4oKSB7fQorfQorCitjbGFzcyBDaGVja0NvbW1hbmQgOgorICAgIENsaWt0Q29tbWFuZCgKKyAgICAgICAgaGVscCA9CisgICAgICAgICAgICAiIiIKK0NoZWNrIHRoYXQgYWxsIGZsYWdnZWQgQVBJcyBhcmUgdXNlZCBpbiB0aGUgY29ycmVjdCB3YXkuCisKK1RoaXMgdG9vbCByZWFkcyB0aGUgQVBJIHNpZ25hdHVyZSBmaWxlIGFuZCBjaGVja3MgdGhhdCBhbGwgZmxhZ2dlZCBBUElzIGFyZSB1c2VkIGluIHRoZSBjb3JyZWN0IHdheS4KKworVGhlIHRvb2wgd2lsbCBleGl0IHdpdGggYSBub24temVybyBleGl0IGNvZGUgaWYgYW55IGZsYWdnZWQgQVBJcyBhcmUgZm91bmQgdG8gYmUgdXNlZCBpbiB0aGUgaW5jb3JyZWN0IHdheS4KKyIiIikgeworICBwcml2YXRlIHZhbCBhcGlTaWduYXR1cmVQYXRoIGJ5CisgICAgICBvcHRpb24oQVJHX0FQSV9TSUdOQVRVUkUpCisgICAgICAgICAgLmhlbHAoQVJHX0FQSV9TSUdOQVRVUkVfSEVMUCkKKyAgICAgICAgICAucGF0aChtdXN0RXhpc3QgPSB0cnVlLCBjYW5CZURpciA9IGZhbHNlLCBtdXN0QmVSZWFkYWJsZSA9IHRydWUpCisgICAgICAgICAgLnJlcXVpcmVkKCkKKyAgcHJpdmF0ZSB2YWwgZmxhZ1ZhbHVlc1BhdGggYnkKKyAgICAgIG9wdGlvbihBUkdfRkxBR19WQUxVRVMpCisgICAgICAgICAgLmhlbHAoQVJHX0ZMQUdfVkFMVUVTX0hFTFApCisgICAgICAgICAgLnBhdGgobXVzdEV4aXN0ID0gdHJ1ZSwgY2FuQmVEaXIgPSBmYWxzZSwgbXVzdEJlUmVhZGFibGUgPSB0cnVlKQorICAgICAgICAgIC5yZXF1aXJlZCgpCisgIHByaXZhdGUgdmFsIGFwaVZlcnNpb25zUGF0aCBieQorICAgICAgb3B0aW9uKEFSR19BUElfVkVSU0lPTlMpCisgICAgICAgICAgLmhlbHAoQVJHX0FQSV9WRVJTSU9OU19IRUxQKQorICAgICAgICAgIC5wYXRoKG11c3RFeGlzdCA9IHRydWUsIGNhbkJlRGlyID0gZmFsc2UsIG11c3RCZVJlYWRhYmxlID0gdHJ1ZSkKKyAgICAgICAgICAucmVxdWlyZWQoKQorCisgIG92ZXJyaWRlIGZ1biBydW4oKSB7CisgICAgdmFsIGZsYWdnZWRTeW1ib2xzID0KKyAgICAgICAgYXBpU2lnbmF0dXJlUGF0aC50b0ZpbGUoKS5pbnB1dFN0cmVhbSgpLnVzZSB7CisgICAgICAgICAgcGFyc2VBcGlTaWduYXR1cmUoYXBpU2lnbmF0dXJlUGF0aC50b1N0cmluZygpLCBpdCkKKyAgICAgICAgfQorICAgIHZhbCBmbGFncyA9IGZsYWdWYWx1ZXNQYXRoLnRvRmlsZSgpLmlucHV0U3RyZWFtKCkudXNlIHsgcGFyc2VGbGFnVmFsdWVzKGl0KSB9CisgICAgdmFsIGV4cG9ydGVkU3ltYm9scyA9IGFwaVZlcnNpb25zUGF0aC50b0ZpbGUoKS5pbnB1dFN0cmVhbSgpLnVzZSB7IHBhcnNlQXBpVmVyc2lvbnMoaXQpIH0KKyAgICB2YWwgZXJyb3JzID0gZmluZEVycm9ycyhmbGFnZ2VkU3ltYm9scywgZmxhZ3MsIGV4cG9ydGVkU3ltYm9scykKKyAgICBmb3IgKGUgaW4gZXJyb3JzKSB7CisgICAgICBwcmludGxuKGUpCisgICAgfQorICAgIHRocm93IFByb2dyYW1SZXN1bHQoZXJyb3JzLnNpemUpCisgIH0KK30KKworY2xhc3MgTGlzdENvbW1hbmQgOgorICAgIENsaWt0Q29tbWFuZCgKKyAgICAgICAgaGVscCA9CisgICAgICAgICAgICAiIiIKK0xpc3QgYWxsIGZsYWdnZWQgQVBJcyBhbmQgY29ycmVzcG9uZGluZyBmbGFncy4KKworVGhlIG91dHB1dCBmb3JtYXQgaXMgIjxmdWxseS1xdWFsaWZpZWQtbmFtZS1vZi1mbGFnPiA8c3RhdGUtb2YtZmxhZz4gPEFQST4iLCBvbmUgbGluZSBwZXIgQVBJLgorCitUaGUgb3V0cHV0IGNhbiBiZSBwb3N0LXByb2Nlc3NlZCBieSBlLmcuIHBpcGluZyBpdCB0byBncmVwIHRvIGZpbHRlciBvdXQgb25seSBlbmFibGVkIEFQSXMsIG9yIGFsbCBBUElzIGd1YXJkZWQgYnkgYSBnaXZlbiBmbGFnLgorIiIiKSB7CisgIHByaXZhdGUgdmFsIGFwaVNpZ25hdHVyZVBhdGggYnkKKyAgICAgIG9wdGlvbihBUkdfQVBJX1NJR05BVFVSRSkKKyAgICAgICAgICAuaGVscChBUkdfQVBJX1NJR05BVFVSRV9IRUxQKQorICAgICAgICAgIC5wYXRoKG11c3RFeGlzdCA9IHRydWUsIGNhbkJlRGlyID0gZmFsc2UsIG11c3RCZVJlYWRhYmxlID0gdHJ1ZSkKKyAgICAgICAgICAucmVxdWlyZWQoKQorICBwcml2YXRlIHZhbCBmbGFnVmFsdWVzUGF0aCBieQorICAgICAgb3B0aW9uKEFSR19GTEFHX1ZBTFVFUykKKyAgICAgICAgICAuaGVscChBUkdfRkxBR19WQUxVRVNfSEVMUCkKKyAgICAgICAgICAucGF0aChtdXN0RXhpc3QgPSB0cnVlLCBjYW5CZURpciA9IGZhbHNlLCBtdXN0QmVSZWFkYWJsZSA9IHRydWUpCisgICAgICAgICAgLnJlcXVpcmVkKCkKKworICBvdmVycmlkZSBmdW4gcnVuKCkgeworICAgIHZhbCBmbGFnZ2VkU3ltYm9scyA9CisgICAgICAgIGFwaVNpZ25hdHVyZVBhdGgudG9GaWxlKCkuaW5wdXRTdHJlYW0oKS51c2UgeworICAgICAgICAgIHBhcnNlQXBpU2lnbmF0dXJlKGFwaVNpZ25hdHVyZVBhdGgudG9TdHJpbmcoKSwgaXQpCisgICAgICAgIH0KKyAgICB2YWwgZmxhZ3MgPSBmbGFnVmFsdWVzUGF0aC50b0ZpbGUoKS5pbnB1dFN0cmVhbSgpLnVzZSB7IHBhcnNlRmxhZ1ZhbHVlcyhpdCkgfQorICAgIHZhbCBvdXRwdXQgPSBsaXN0RmxhZ2dlZEFwaXMoZmxhZ2dlZFN5bWJvbHMsIGZsYWdzKQorICAgIGlmIChvdXRwdXQuaXNOb3RFbXB0eSgpKSB7CisgICAgICBwcmludGxuKG91dHB1dC5qb2luVG9TdHJpbmcoIlxuIikpCisgICAgfQorICB9Cit9CisKK2ludGVybmFsIGZ1biBwYXJzZUFwaVNpZ25hdHVyZShwYXRoOiBTdHJpbmcsIGlucHV0OiBJbnB1dFN0cmVhbSk6IFNldDxQYWlyPFN5bWJvbCwgRmxhZz4+IHsKKyAgdmFsIG91dHB1dCA9IG11dGFibGVTZXRPZjxQYWlyPFN5bWJvbCwgRmxhZz4+KCkKKyAgdmFsIHZpc2l0b3IgPQorICAgICAgb2JqZWN0IDogQmFzZUl0ZW1WaXNpdG9yKCkgeworICAgICAgICBvdmVycmlkZSBmdW4gdmlzaXRDbGFzcyhjbHM6IENsYXNzSXRlbSkgeworICAgICAgICAgIGdldEZsYWdPck51bGwoY2xzKT8ubGV0IHsgZmxhZyAtPgorICAgICAgICAgICAgdmFsIHN5bWJvbCA9CisgICAgICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZUNsYXNzKAorICAgICAgICAgICAgICAgICAgICBjbHMuYmFzZWxpbmVFbGVtZW50SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNscy5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgImphdmEvbGFuZy9PYmplY3QiCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgY2xzLnN1cGVyQ2xhc3MoKT8uYmFzZWxpbmVFbGVtZW50SWQoKQorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBjbHMuYWxsSW50ZXJmYWNlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAubWFwIHsgaXQuYmFzZWxpbmVFbGVtZW50SWQoKSB9CisgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyIHsgaXQgIT0gY2xzLmJhc2VsaW5lRWxlbWVudElkKCkgfQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvU2V0KCkpCisgICAgICAgICAgICBvdXRwdXQuYWRkKFBhaXIoc3ltYm9sLCBmbGFnKSkKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdmVycmlkZSBmdW4gdmlzaXRGaWVsZChmaWVsZDogRmllbGRJdGVtKSB7CisgICAgICAgICAgZ2V0RmxhZ09yTnVsbChmaWVsZCk/LmxldCB7IGZsYWcgLT4KKyAgICAgICAgICAgIHZhbCBzeW1ib2wgPQorICAgICAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVGaWVsZChmaWVsZC5jb250YWluaW5nQ2xhc3MoKS5iYXNlbGluZUVsZW1lbnRJZCgpLCBmaWVsZC5uYW1lKCkpCisgICAgICAgICAgICBvdXRwdXQuYWRkKFBhaXIoc3ltYm9sLCBmbGFnKSkKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdmVycmlkZSBmdW4gdmlzaXRDYWxsYWJsZShjYWxsYWJsZTogQ2FsbGFibGVJdGVtKSB7CisgICAgICAgICAgZ2V0RmxhZ09yTnVsbChjYWxsYWJsZSk/LmxldCB7IGZsYWcgLT4KKyAgICAgICAgICAgIHZhbCBjYWxsYWJsZVNpZ25hdHVyZSA9IGJ1aWxkU3RyaW5nIHsKKyAgICAgICAgICAgICAgYXBwZW5kKGNhbGxhYmxlLm5hbWUoKSkKKyAgICAgICAgICAgICAgYXBwZW5kKCIoIikKKyAgICAgICAgICAgICAgY2FsbGFibGUucGFyYW1ldGVycygpLmpvaW5Ubyh0aGlzLCBzZXBhcmF0b3IgPSAiIikgeyBpdC50eXBlKCkuaW50ZXJuYWxOYW1lKCkgfQorICAgICAgICAgICAgICBhcHBlbmQoIikiKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsIHN5bWJvbCA9IFN5bWJvbC5jcmVhdGVNZXRob2QoY2FsbGFibGUuY29udGFpbmluZ0NsYXNzKCkucXVhbGlmaWVkTmFtZSgpLCBjYWxsYWJsZVNpZ25hdHVyZSkKKyAgICAgICAgICAgIG91dHB1dC5hZGQoUGFpcihzeW1ib2wsIGZsYWcpKQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZnVuIGdldEZsYWdPck51bGwoaXRlbTogSXRlbSk6IEZsYWc/IHsKKyAgICAgICAgICByZXR1cm4gaXRlbS5tb2RpZmllcnMKKyAgICAgICAgICAgICAgLmZpbmRBbm5vdGF0aW9uKCJhbmRyb2lkLmFubm90YXRpb24uRmxhZ2dlZEFwaSIpCisgICAgICAgICAgICAgID8uZmluZEF0dHJpYnV0ZSgidmFsdWUiKQorICAgICAgICAgICAgICA/LnZhbHVlCisgICAgICAgICAgICAgID8ubGV0IHsgRmxhZyhpdC52YWx1ZSgpIGFzIFN0cmluZykgfQorICAgICAgICB9CisgICAgICB9CisgIHZhbCBjb2RlYmFzZSA9IEFwaUZpbGUucGFyc2VBcGkocGF0aCwgaW5wdXQpCisgIGNvZGViYXNlLmFjY2VwdCh2aXNpdG9yKQorICByZXR1cm4gb3V0cHV0Cit9CisKK2ludGVybmFsIGZ1biBwYXJzZUZsYWdWYWx1ZXMoaW5wdXQ6IElucHV0U3RyZWFtKTogTWFwPEZsYWcsIEJvb2xlYW4+IHsKKyAgdmFsIHBhcnNlZEZsYWdzID0gQWNvbmZpZy5wYXJzZWRfZmxhZ3MucGFyc2VGcm9tKGlucHV0KS5nZXRQYXJzZWRGbGFnTGlzdCgpCisgIHJldHVybiBwYXJzZWRGbGFncy5hc3NvY2lhdGVCeSgKKyAgICAgIHsgRmxhZygiJHtpdC5nZXRQYWNrYWdlKCl9LiR7aXQuZ2V0TmFtZSgpfSIpIH0sCisgICAgICB7IGl0LmdldFN0YXRlKCkgPT0gQWNvbmZpZy5mbGFnX3N0YXRlLkVOQUJMRUQgfSkKK30KKworaW50ZXJuYWwgZnVuIHBhcnNlQXBpVmVyc2lvbnMoaW5wdXQ6IElucHV0U3RyZWFtKTogU2V0PFN5bWJvbD4geworICBmdW4gTm9kZS5nZXRBdHRyaWJ1dGUobmFtZTogU3RyaW5nKTogU3RyaW5nPyA9IGdldEF0dHJpYnV0ZXMoKT8uZ2V0TmFtZWRJdGVtKG5hbWUpPy5nZXROb2RlVmFsdWUoKQorCisgIHZhbCBvdXRwdXQgPSBtdXRhYmxlU2V0T2Y8U3ltYm9sPigpCisgIHZhbCBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpCisgIHZhbCBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpCisgIHZhbCBkb2N1bWVudCA9IHBhcnNlci5wYXJzZShpbnB1dCkKKworICB2YWwgY2xhc3NlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjbGFzcyIpCisgIC8vIGt0Zm10IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgYC4uPGAgcmFuZ2Ugc3ludGF4OyBleHBsaWNpdGx5IGNhbGwgLnJhbmdlVW50aWwgaW5zdGVhZAorICBmb3IgKGkgaW4gMC5yYW5nZVVudGlsKGNsYXNzZXMuZ2V0TGVuZ3RoKCkpKSB7CisgICAgdmFsIGNscyA9IGNsYXNzZXMuaXRlbShpKQorICAgIHZhbCBjbGFzc05hbWUgPQorICAgICAgICByZXF1aXJlTm90TnVsbChjbHMuZ2V0QXR0cmlidXRlKCJuYW1lIikpIHsKKyAgICAgICAgICAiQmFkIFhNTDogPGNsYXNzPiBlbGVtZW50IHdpdGhvdXQgbmFtZSBhdHRyaWJ1dGUiCisgICAgICAgIH0KKyAgICB2YXIgc3VwZXJjbGFzczogU3RyaW5nPyA9IG51bGwKKyAgICB2YWwgaW50ZXJmYWNlcyA9IG11dGFibGVTZXRPZjxTdHJpbmc+KCkKKyAgICB2YWwgY2hpbGRyZW4gPSBjbHMuZ2V0Q2hpbGROb2RlcygpCisgICAgZm9yIChqIGluIDAucmFuZ2VVbnRpbChjaGlsZHJlbi5nZXRMZW5ndGgoKSkpIHsKKyAgICAgIHZhbCBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaikKKyAgICAgIHdoZW4gKGNoaWxkLmdldE5vZGVOYW1lKCkpIHsKKyAgICAgICAgImV4dGVuZHMiIC0+IHsKKyAgICAgICAgICBzdXBlcmNsYXNzID0KKyAgICAgICAgICAgICAgcmVxdWlyZU5vdE51bGwoY2hpbGQuZ2V0QXR0cmlidXRlKCJuYW1lIikpIHsKKyAgICAgICAgICAgICAgICAiQmFkIFhNTDogPGV4dGVuZHM+IGVsZW1lbnQgd2l0aG91dCBuYW1lIGF0dHJpYnV0ZSIKKyAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICJpbXBsZW1lbnRzIiAtPiB7CisgICAgICAgICAgdmFsIGludGVyZmFjZU5hbWUgPQorICAgICAgICAgICAgICByZXF1aXJlTm90TnVsbChjaGlsZC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkgeworICAgICAgICAgICAgICAgICJCYWQgWE1MOiA8aW1wbGVtZW50cz4gZWxlbWVudCB3aXRob3V0IG5hbWUgYXR0cmlidXRlIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgaW50ZXJmYWNlcy5hZGQoaW50ZXJmYWNlTmFtZSkKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBvdXRwdXQuYWRkKFN5bWJvbC5jcmVhdGVDbGFzcyhjbGFzc05hbWUsIHN1cGVyY2xhc3MsIGludGVyZmFjZXMpKQorICB9CisKKyAgdmFsIGZpZWxkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmaWVsZCIpCisgIC8vIGt0Zm10IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgYC4uPGAgcmFuZ2Ugc3ludGF4OyBleHBsaWNpdGx5IGNhbGwgLnJhbmdlVW50aWwgaW5zdGVhZAorICBmb3IgKGkgaW4gMC5yYW5nZVVudGlsKGZpZWxkcy5nZXRMZW5ndGgoKSkpIHsKKyAgICB2YWwgZmllbGQgPSBmaWVsZHMuaXRlbShpKQorICAgIHZhbCBmaWVsZE5hbWUgPQorICAgICAgICByZXF1aXJlTm90TnVsbChmaWVsZC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkgeworICAgICAgICAgICJCYWQgWE1MOiA8ZmllbGQ+IGVsZW1lbnQgd2l0aG91dCBuYW1lIGF0dHJpYnV0ZSIKKyAgICAgICAgfQorICAgIHZhbCBjbGFzc05hbWUgPQorICAgICAgICByZXF1aXJlTm90TnVsbChmaWVsZC5nZXRQYXJlbnROb2RlKCk/LmdldEF0dHJpYnV0ZSgibmFtZSIpKSB7CisgICAgICAgICAgIkJhZCBYTUw6IHRvcCBsZXZlbCA8ZmllbGQ+IGVsZW1lbnQiCisgICAgICAgIH0KKyAgICBvdXRwdXQuYWRkKFN5bWJvbC5jcmVhdGVGaWVsZChjbGFzc05hbWUsIGZpZWxkTmFtZSkpCisgIH0KKworICB2YWwgbWV0aG9kcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRob2QiKQorICAvLyBrdGZtdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIGAuLjxgIHJhbmdlIHN5bnRheDsgZXhwbGljaXRseSBjYWxsIC5yYW5nZVVudGlsIGluc3RlYWQKKyAgZm9yIChpIGluIDAucmFuZ2VVbnRpbChtZXRob2RzLmdldExlbmd0aCgpKSkgeworICAgIHZhbCBtZXRob2QgPSBtZXRob2RzLml0ZW0oaSkKKyAgICB2YWwgbWV0aG9kU2lnbmF0dXJlID0KKyAgICAgICAgcmVxdWlyZU5vdE51bGwobWV0aG9kLmdldEF0dHJpYnV0ZSgibmFtZSIpKSB7CisgICAgICAgICAgIkJhZCBYTUw6IDxtZXRob2Q+IGVsZW1lbnQgd2l0aG91dCBuYW1lIGF0dHJpYnV0ZSIKKyAgICAgICAgfQorICAgIHZhbCBtZXRob2RTaWduYXR1cmVQYXJ0cyA9IG1ldGhvZFNpZ25hdHVyZS5zcGxpdChSZWdleCgiXFwofFxcKSIpKQorICAgIGlmIChtZXRob2RTaWduYXR1cmVQYXJ0cy5zaXplICE9IDMpIHsKKyAgICAgIHRocm93IEV4Y2VwdGlvbigiQmFkIFhNTDogbWV0aG9kIHNpZ25hdHVyZSAnJG1ldGhvZFNpZ25hdHVyZSciKQorICAgIH0KKyAgICB2YXIgKG1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MsIF8pID0gbWV0aG9kU2lnbmF0dXJlUGFydHMKKyAgICB2YWwgcGFja2FnZUFuZENsYXNzTmFtZSA9CisgICAgICAgIHJlcXVpcmVOb3ROdWxsKG1ldGhvZC5nZXRQYXJlbnROb2RlKCk/LmdldEF0dHJpYnV0ZSgibmFtZSIpKSB7CisgICAgICAgICAgICAgICJCYWQgWE1MOiB0b3AgbGV2ZWwgPG1ldGhvZD4gZWxlbWVudCwgb3IgPGNsYXNzPiBlbGVtZW50IG1pc3NpbmcgbmFtZSBhdHRyaWJ1dGUiCisgICAgICAgICAgICB9CisgICAgICAgICAgICAucmVwbGFjZSgiJCIsICIvIikKKyAgICBpZiAobWV0aG9kTmFtZSA9PSAiPGluaXQ+IikgeworICAgICAgbWV0aG9kTmFtZSA9IHBhY2thZ2VBbmRDbGFzc05hbWUuc3BsaXQoIi8iKS5sYXN0KCkKKyAgICB9CisgICAgb3V0cHV0LmFkZChTeW1ib2wuY3JlYXRlTWV0aG9kKHBhY2thZ2VBbmRDbGFzc05hbWUsICIkbWV0aG9kTmFtZSgkbWV0aG9kQXJncykiKSkKKyAgfQorCisgIHJldHVybiBvdXRwdXQKK30KKworLyoqCisgKiBGaW5kIGVycm9ycyBpbiB0aGUgZ2l2ZW4gZGF0YS4KKyAqCisgKiBAcGFyYW0gZmxhZ2dlZFN5bWJvbHNJblNvdXJjZSB0aGUgc2V0IG9mIHN5bWJvbHMgdGhhdCBhcmUgZmxhZ2dlZCBpbiB0aGUgc291cmNlIGNvZGUKKyAqIEBwYXJhbSBmbGFncyB0aGUgc2V0IG9mIGZsYWdzIGFuZCB0aGVpciB2YWx1ZXMKKyAqIEBwYXJhbSBzeW1ib2xzSW5PdXRwdXQgdGhlIHNldCBvZiBzeW1ib2xzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIG91dHB1dAorICogQHJldHVybiB0aGUgc2V0IG9mIGVycm9ycyBmb3VuZAorICovCitpbnRlcm5hbCBmdW4gZmluZEVycm9ycygKKyAgICBmbGFnZ2VkU3ltYm9sc0luU291cmNlOiBTZXQ8UGFpcjxTeW1ib2wsIEZsYWc+PiwKKyAgICBmbGFnczogTWFwPEZsYWcsIEJvb2xlYW4+LAorICAgIHN5bWJvbHNJbk91dHB1dDogU2V0PFN5bWJvbD4KKyk6IFNldDxBcGlFcnJvcj4geworICBmdW4gU2V0PFN5bWJvbD4uY29udGFpbnNTeW1ib2woc3ltYm9sOiBTeW1ib2wpOiBCb29sZWFuIHsKKyAgICAvLyB0cml2aWFsIGNhc2U6IHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSBsaXN0ZWQgaW4gYXBpLXZlcnNpb25zLnhtbAorICAgIGlmIChjb250YWlucyhzeW1ib2wpKSB7CisgICAgICByZXR1cm4gdHJ1ZQorICAgIH0KKworICAgIC8vIG5vbi10cml2aWFsIGNhc2U6IHRoZSBzeW1ib2wgY291bGQgYmUgcGFydCBvZiB0aGUgc3Vycm91bmRpbmcgY2xhc3MnCisgICAgLy8gc3VwZXIgY2xhc3Mgb3IgaW50ZXJmYWNlcworICAgIHZhbCAoY2xhc3NOYW1lLCBtZW1iZXJOYW1lKSA9CisgICAgICAgIHdoZW4gKHN5bWJvbCkgeworICAgICAgICAgIGlzIENsYXNzU3ltYm9sIC0+IHJldHVybiBmYWxzZQorICAgICAgICAgIGlzIE1lbWJlclN5bWJvbCAtPiB7CisgICAgICAgICAgICBQYWlyKHN5bWJvbC5jbGF6eiwgc3ltYm9sLm1lbWJlcikKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB2YWwgY2xhenogPSBmaW5kIHsgaXQgaXMgQ2xhc3NTeW1ib2wgJiYgaXQuY2xhenogPT0gY2xhc3NOYW1lIH0gYXM/IENsYXNzU3ltYm9sPworICAgIGlmIChjbGF6eiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2UKKyAgICB9CisKKyAgICBmb3IgKGludGVyZmFjZU5hbWUgaW4gY2xhenouaW50ZXJmYWNlcykgeworICAgICAgLy8gY3JlYXRlTWV0aG9kIGlzIHRoZSBzYW1lIGFzIGNyZWF0ZUZpZWxkLCBleGNlcHQgaXQgYWxsb3dzIHBhcmVudGhlc2lzCisgICAgICB2YWwgaW50ZXJmYWNlU3ltYm9sID0gU3ltYm9sLmNyZWF0ZU1ldGhvZChpbnRlcmZhY2VOYW1lLCBtZW1iZXJOYW1lKQorICAgICAgaWYgKGNvbnRhaW5zKGludGVyZmFjZVN5bWJvbCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2xhenouc3VwZXJjbGFzcyAhPSBudWxsKSB7CisgICAgICB2YWwgc3VwZXJjbGFzc1N5bWJvbCA9IFN5bWJvbC5jcmVhdGVNZXRob2QoY2xhenouc3VwZXJjbGFzcywgbWVtYmVyTmFtZSkKKyAgICAgIHJldHVybiBjb250YWluc1N5bWJvbChzdXBlcmNsYXNzU3ltYm9sKQorICAgIH0KKworICAgIHJldHVybiBmYWxzZQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZmxhZyBpcyBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gc3ltYm9sLgorICAgKgorICAgKiBBIGZsYWdnZWQgbWVtYmVyIGluc2lkZSBhIGZsYWdnZWQgY2xhc3MgaXMgaWdub3JlZCAoYW5kIHRoZSBmbGFnIHZhbHVlIGNvbnNpZGVyZWQgZGlzYWJsZWQpIGlmCisgICAqIHRoZSBjbGFzcycgZmxhZyBpcyBkaXNhYmxlZC4KKyAgICoKKyAgICogQHBhcmFtIHN5bWJvbCB0aGUgc3ltYm9sIHRvIGNoZWNrCisgICAqIEBwYXJhbSBmbGFnIHRoZSBmbGFnIHRvIGNoZWNrCisgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmxhZyBpcyBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gc3ltYm9sCisgICAqLworICBmdW4gaXNGbGFnRW5hYmxlZEZvclN5bWJvbChzeW1ib2w6IFN5bWJvbCwgZmxhZzogRmxhZyk6IEJvb2xlYW4geworICAgIHdoZW4gKHN5bWJvbCkgeworICAgICAgaXMgQ2xhc3NTeW1ib2wgLT4gcmV0dXJuIGZsYWdzLmdldFZhbHVlKGZsYWcpCisgICAgICBpcyBNZW1iZXJTeW1ib2wgLT4geworICAgICAgICB2YWwgbWVtYmVyRmxhZ1ZhbHVlID0gZmxhZ3MuZ2V0VmFsdWUoZmxhZykKKyAgICAgICAgaWYgKCFtZW1iZXJGbGFnVmFsdWUpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICAgfQorICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IGlmIHRoZSBNZW1iZXJTeW1ib2wncyBmbGFnIGlzIGVuYWJsZWQsIGJ1dCB0aGUgb3V0ZXIKKyAgICAgICAgLy8gQ2xhc3NTeW1ib2wncyBmbGFnIChpZiB0aGUgY2xhc3MgaXMgZmxhZ2dlZCkgaXMgZGlzYWJsZWQsIGNvbnNpZGVyCisgICAgICAgIC8vIHRoZSBNZW1iZXJTeW1ib2wncyBmbGFnIGFzIGRpc2FibGVkOgorICAgICAgICAvLworICAgICAgICAvLyAgIEBGbGFnZ2VkQXBpKHRoaXMtZmxhZy1pcy1kaXNhYmxlZCkgQ2xhenogeworICAgICAgICAvLyAgICAgICBARmxhZ2dlZEFwaSh0aGlzLWZsYWctaXMtZW5hYmxlZCkgbWV0aG9kKCk7IC8vIFRoZSBDbGF6eicgZmxhZyAid2lucyIKKyAgICAgICAgLy8gICB9CisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGU6IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhbmRsZSBuZXN0ZWQgY2xhc3Nlcy4KKyAgICAgICAgdmFsIGNsYXNzRmxhZ1ZhbHVlID0KKyAgICAgICAgICAgIGZsYWdnZWRTeW1ib2xzSW5Tb3VyY2UKKyAgICAgICAgICAgICAgICAuZmluZCB7IGl0LmZpcnN0LnRvUHJldHR5U3RyaW5nKCkgPT0gc3ltYm9sLmNsYXp6IH0KKyAgICAgICAgICAgICAgICA/LmxldCB7IGZsYWdzLmdldFZhbHVlKGl0LnNlY29uZCkgfQorICAgICAgICAgICAgICAgID86IHRydWUKKyAgICAgICAgcmV0dXJuIGNsYXNzRmxhZ1ZhbHVlCisgICAgICB9CisgICAgfQorICB9CisKKyAgdmFsIGVycm9ycyA9IG11dGFibGVTZXRPZjxBcGlFcnJvcj4oKQorICBmb3IgKChzeW1ib2wsIGZsYWcpIGluIGZsYWdnZWRTeW1ib2xzSW5Tb3VyY2UpIHsKKyAgICB0cnkgeworICAgICAgaWYgKGlzRmxhZ0VuYWJsZWRGb3JTeW1ib2woc3ltYm9sLCBmbGFnKSkgeworICAgICAgICBpZiAoIXN5bWJvbHNJbk91dHB1dC5jb250YWluc1N5bWJvbChzeW1ib2wpKSB7CisgICAgICAgICAgZXJyb3JzLmFkZChFbmFibGVkRmxhZ2dlZEFwaU5vdFByZXNlbnRFcnJvcihzeW1ib2wsIGZsYWcpKQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3ltYm9sc0luT3V0cHV0LmNvbnRhaW5zU3ltYm9sKHN5bWJvbCkpIHsKKyAgICAgICAgICBlcnJvcnMuYWRkKERpc2FibGVkRmxhZ2dlZEFwaUlzUHJlc2VudEVycm9yKHN5bWJvbCwgZmxhZykpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChlOiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKSB7CisgICAgICBlcnJvcnMuYWRkKFVua25vd25GbGFnRXJyb3Ioc3ltYm9sLCBmbGFnKSkKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycm9ycworfQorCisvKioKKyAqIENvbGxlY3QgYWxsIGtub3duIGluZm8gYWJvdXQgYWxsIEBGbGFnZ2VkQXBpIGFubm90YXRlZCBBUElzLgorICoKKyAqIEVhY2ggQVBJIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgYSBTdHJpbmcsIG9uIHRoZSBmb3JtYXQKKyAqIDxwcmU+CisgKiAgICZsdDtmdWxseS1xdWFsaWZpZWQtbmFtZS1vZi1mbGFnJmx0OyAmbHQ7c3RhdGUtb2YtZmxhZyZsdDsgJmx0O0FQSSZsdDsKKyAqIDwvcHJlPgorICoKKyAqIEBwYXJhbSBmbGFnZ2VkU3ltYm9sc0luU291cmNlIHRoZSBzZXQgb2Ygc3ltYm9scyB0aGF0IGFyZSBmbGFnZ2VkIGluIHRoZSBzb3VyY2UgY29kZQorICogQHBhcmFtIGZsYWdzIHRoZSBzZXQgb2YgZmxhZ3MgYW5kIHRoZWlyIHZhbHVlcworICogQHJldHVybiBhIGxpc3Qgb2YgU3RyaW5ncyBlbmNvZGluZyBBUEkgZGF0YSB1c2luZyB0aGUgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZSwgc29ydGVkCisgKiAgIGFscGhhYmV0aWNhbGx5CisgKi8KK2ludGVybmFsIGZ1biBsaXN0RmxhZ2dlZEFwaXMoCisgICAgZmxhZ2dlZFN5bWJvbHNJblNvdXJjZTogU2V0PFBhaXI8U3ltYm9sLCBGbGFnPj4sCisgICAgZmxhZ3M6IE1hcDxGbGFnLCBCb29sZWFuPgorKTogTGlzdDxTdHJpbmc+IHsKKyAgdmFsIG91dHB1dCA9IG11dGFibGVMaXN0T2Y8U3RyaW5nPigpCisgIGZvciAoKHN5bWJvbCwgZmxhZykgaW4gZmxhZ2dlZFN5bWJvbHNJblNvdXJjZSkgeworICAgIHZhbCBmbGFnU3RhdGUgPQorICAgICAgICB3aGVuIChmbGFncy5nZXQoZmxhZykpIHsKKyAgICAgICAgICB0cnVlIC0+ICJFTkFCTEVEIgorICAgICAgICAgIGZhbHNlIC0+ICJESVNBQkxFRCIKKyAgICAgICAgICBudWxsIC0+ICJVTktOT1dOIgorICAgICAgICB9CisgICAgb3V0cHV0LmFkZCgiJGZsYWcgJGZsYWdTdGF0ZSAke3N5bWJvbC50b1ByZXR0eVN0cmluZygpfSIpCisgIH0KKyAgb3V0cHV0LnNvcnQoKQorICByZXR1cm4gb3V0cHV0Cit9CisKK2Z1biBtYWluKGFyZ3M6IEFycmF5PFN0cmluZz4pID0gTWFpbkNvbW1hbmQoKS5zdWJjb21tYW5kcyhDaGVja0NvbW1hbmQoKSwgTGlzdENvbW1hbmQoKSkubWFpbihhcmdzKQpkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2tfZWxmX2ZpbGUucHkgYi90b29scy9jaGVja19lbGZfZmlsZS5weQppbmRleCA1MWVjMjNiLi4xZmQ3OTUwIDEwMDc1NQotLS0gYS90b29scy9jaGVja19lbGZfZmlsZS5weQorKysgYi90b29scy9jaGVja19lbGZfZmlsZS5weQpAQCAtNjcsNyArNjcsNyBAQAogCiBFTEYgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKAogICAnRUxGJywKLSAgKCdkdF9zb25hbWUnLCAnZHRfbmVlZGVkJywgJ2ltcG9ydGVkJywgJ2V4cG9ydGVkJywgJ2hlYWRlcicpKQorICAoJ2FsaWdubWVudHMnLCAnZHRfc29uYW1lJywgJ2R0X25lZWRlZCcsICdpbXBvcnRlZCcsICdleHBvcnRlZCcsICdoZWFkZXInKSkKIAogCiBkZWYgX2dldF9vc19uYW1lKCk6CkBAIC0xOTUsNyArMTk1LDggQEAKICAgQGNsYXNzbWV0aG9kCiAgIGRlZiBfcmVhZF9sbHZtX3JlYWRvYmooY2xzLCBlbGZfZmlsZV9wYXRoLCBoZWFkZXIsIGxsdm1fcmVhZG9iaik6CiAgICAgIiIiUnVuIGxsdm0tcmVhZG9iaiBhbmQgcGFyc2UgdGhlIG91dHB1dC4iIiIKLSAgICBjbWQgPSBbbGx2bV9yZWFkb2JqLCAnLS1keW5hbWljLXRhYmxlJywgJy0tZHluLXN5bWJvbHMnLCBlbGZfZmlsZV9wYXRoXQorICAgIGNtZCA9IFtsbHZtX3JlYWRvYmosICctLXByb2dyYW0taGVhZGVycycsICctLWR5bmFtaWMtdGFibGUnLAorICAgICAgICAgICAnLS1keW4tc3ltYm9scycsIGVsZl9maWxlX3BhdGhdCiAgICAgb3V0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoY21kLCB0ZXh0PVRydWUpCiAgICAgbGluZXMgPSBvdXQuc3BsaXRsaW5lcygpCiAgICAgcmV0dXJuIGNscy5fcGFyc2VfbGx2bV9yZWFkb2JqKGVsZl9maWxlX3BhdGgsIGhlYWRlciwgbGluZXMpCkBAIC0yMDUsOSArMjA2LDU2IEBACiAgIGRlZiBfcGFyc2VfbGx2bV9yZWFkb2JqKGNscywgZWxmX2ZpbGVfcGF0aCwgaGVhZGVyLCBsaW5lcyk6CiAgICAgIiIiUGFyc2UgdGhlIG91dHB1dCBvZiBsbHZtLXJlYWRvYmouIiIiCiAgICAgbGluZXNfaXQgPSBpdGVyKGxpbmVzKQorICAgIGFsaWdubWVudHMgPSBjbHMuX3BhcnNlX3Byb2dyYW1faGVhZGVycyhsaW5lc19pdCkKICAgICBkdF9zb25hbWUsIGR0X25lZWRlZCA9IGNscy5fcGFyc2VfZHluYW1pY190YWJsZShlbGZfZmlsZV9wYXRoLCBsaW5lc19pdCkKICAgICBpbXBvcnRlZCwgZXhwb3J0ZWQgPSBjbHMuX3BhcnNlX2R5bmFtaWNfc3ltYm9scyhsaW5lc19pdCkKLSAgICByZXR1cm4gRUxGKGR0X3NvbmFtZSwgZHRfbmVlZGVkLCBpbXBvcnRlZCwgZXhwb3J0ZWQsIGhlYWRlcikKKyAgICByZXR1cm4gRUxGKGFsaWdubWVudHMsIGR0X3NvbmFtZSwgZHRfbmVlZGVkLCBpbXBvcnRlZCwgZXhwb3J0ZWQsIGhlYWRlcikKKworCisgIF9QUk9HUkFNX0hFQURFUlNfU1RBUlRfUEFUVEVSTiA9ICdQcm9ncmFtSGVhZGVycyBbJworICBfUFJPR1JBTV9IRUFERVJTX0VORF9QQVRURVJOID0gJ10nCisgIF9QUk9HUkFNX0hFQURFUl9TVEFSVF9QQVRURVJOID0gJ1Byb2dyYW1IZWFkZXIgeycKKyAgX1BST0dSQU1fSEVBREVSX1RZUEVfUEFUVEVSTiA9IHJlLmNvbXBpbGUoJ15cXHMrVHlwZTpcXHMrKC4qKSQnKQorICBfUFJPR1JBTV9IRUFERVJfQUxJR05fUEFUVEVSTiA9IHJlLmNvbXBpbGUoJ15cXHMrQWxpZ25tZW50OlxccysoLiopJCcpCisgIF9QUk9HUkFNX0hFQURFUl9FTkRfUEFUVEVSTiA9ICd9JworCisKKyAgQGNsYXNzbWV0aG9kCisgIGRlZiBfcGFyc2VfcHJvZ3JhbV9oZWFkZXJzKGNscywgbGluZXNfaXQpOgorICAgICIiIlBhcnNlIHRoZSBkeW5hbWljIHRhYmxlIHNlY3Rpb24uIiIiCisgICAgYWxpZ25tZW50cyA9IFtdCisKKyAgICBpZiBub3QgY2xzLl9maW5kX3ByZWZpeChjbHMuX1BST0dSQU1fSEVBREVSU19TVEFSVF9QQVRURVJOLCBsaW5lc19pdCk6CisgICAgICByYWlzZSBFTEZFcnJvcigpCisKKyAgICBmb3IgbGluZSBpbiBsaW5lc19pdDoKKyAgICAgICMgUGFyc2UgZWFjaCBwcm9ncmFtIGhlYWRlcgorICAgICAgaWYgbGluZS5zdHJpcCgpID09IGNscy5fUFJPR1JBTV9IRUFERVJfU1RBUlRfUEFUVEVSTjoKKyAgICAgICAgcF9hbGlnbiA9IE5vbmUKKyAgICAgICAgcF90eXBlID0gTm9uZQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lc19pdDoKKyAgICAgICAgICBpZiBsaW5lLnN0cmlwKCkgPT0gY2xzLl9QUk9HUkFNX0hFQURFUl9FTkRfUEFUVEVSTjoKKyAgICAgICAgICAgIGlmIG5vdCBwX2FsaWduOgorICAgICAgICAgICAgICByYWlzZSBFTEZFcnJvcigiQ291bGQgbm90IHBhcnNlIGFsaWdubWVudCBmcm9tIHByb2dyYW0gaGVhZGVyISIpCisgICAgICAgICAgICBpZiBub3QgcF90eXBlOgorICAgICAgICAgICAgICByYWlzZSBFTEZFcnJvcigiQ291bGQgbm90IHBhcnNlIHR5cGUgZnJvbSBwcm9ncmFtIGhlYWRlciEiKQorCisgICAgICAgICAgICBpZiBwX3R5cGUuc3RhcnRzd2l0aCgiUFRfTE9BRCAiKToKKyAgICAgICAgICAgICAgYWxpZ25tZW50cy5hcHBlbmQoaW50KHBfYWxpZ24pKQorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgIG1hdGNoID0gY2xzLl9QUk9HUkFNX0hFQURFUl9UWVBFX1BBVFRFUk4ubWF0Y2gobGluZSkKKyAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHBfdHlwZSA9IG1hdGNoLmdyb3VwKDEpCisKKyAgICAgICAgICBtYXRjaCA9IGNscy5fUFJPR1JBTV9IRUFERVJfQUxJR05fUEFUVEVSTi5tYXRjaChsaW5lKQorICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcF9hbGlnbiA9IG1hdGNoLmdyb3VwKDEpCisKKyAgICAgIGlmIGxpbmUgPT0gY2xzLl9QUk9HUkFNX0hFQURFUlNfRU5EX1BBVFRFUk46CisgICAgICAgIGJyZWFrCisKKyAgICByZXR1cm4gYWxpZ25tZW50cwogCiAKICAgX0RZTkFNSUNfU0VDVElPTl9TVEFSVF9QQVRURVJOID0gJ0R5bmFtaWNTZWN0aW9uIFsnCkBAIC00MzQsNiArNDgyLDI0IEBACiAKICAgICAgIHN5cy5leGl0KDIpCiAKKyAgZGVmIGNoZWNrX21heF9wYWdlX3NpemUoc2VsZiwgbWF4X3BhZ2Vfc2l6ZSk6CisgICAgZm9yIGFsaWdubWVudCBpbiBzZWxmLl9maWxlX3VuZGVyX3Rlc3QuYWxpZ25tZW50czoKKyAgICAgIGlmIGFsaWdubWVudCAlIG1heF9wYWdlX3NpemUgIT0gMDoKKyAgICAgICAgc2VsZi5fZXJyb3IoZidMb2FkIHNlZ21lbnQgaGFzIGFsaWdubWVudCB7YWxpZ25tZW50fSBidXQgJworICAgICAgICAgICAgICAgICAgICBmJ3ttYXhfcGFnZV9zaXplfSByZXF1aXJlZC4nKQorICAgICAgICBzZWxmLl9ub3RlKCkKKyAgICAgICAgc2VsZi5fbm90ZSgnRml4IHN1Z2dlc3Rpb25zOicpCisgICAgICAgIHNlbGYuX25vdGUoZicgIHVzZSBsaW5rZXIgZmxhZyAiLVdsLC16LG1heC1wYWdlLXNpemU9e21heF9wYWdlX3NpemV9IiAnCisgICAgICAgICAgICAgICAgICAgZid3aGVuIGNvbXBpbGluZyB0aGlzIGxpYicpCisgICAgICAgIHNlbGYuX25vdGUoKQorICAgICAgICBzZWxmLl9ub3RlKCdJZiB0aGUgZml4IGFib3ZlIGRvZXNuXCd0IHdvcmssIGJ5cGFzcyB0aGlzIGNoZWNrIHdpdGg6JykKKyAgICAgICAgc2VsZi5fbm90ZSgnICBBbmRyb2lkLmJwOiBpZ25vcmVfbWF4X3BhZ2Vfc2l6ZTogdHJ1ZSwnKQorICAgICAgICBzZWxmLl9ub3RlKCcgIEFuZHJvaWQubWs6IExPQ0FMX0lHTk9SRV9NQVhfUEFHRV9TSVpFIDo9IHRydWUnKQorICAgICAgICBzZWxmLl9ub3RlKCcgIERldmljZSBtazogUFJPRFVDVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9IGZhbHNlJykKKworICAgICAgICAjIFRPRE86IGluc3RlYWQgb2YgZXhpdGluZyBpbW1lZGlhdGVseSwgd2UgbWF5IHdhbnQgdG8gY29sbGVjdCB0aGUKKyAgICAgICAgIyBlcnJvcnMgZnJvbSBhbGwgY2hlY2tzIGFuZCBlbWl0IHRoZW0gYXQgb25jZQorICAgICAgICBzeXMuZXhpdCgyKQogCiAgIEBzdGF0aWNtZXRob2QKICAgZGVmIF9maW5kX3N5bWJvbChsaWIsIG5hbWUsIHZlcnNpb24pOgpAQCAtNTE0LDYgKzU4MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nSWdub3JlIHRoZSBpbnB1dCBmaWxlIHdpdGggdW5rbm93biBtYWNoaW5lIElEJykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hbGxvdy11bmRlZmluZWQtc3ltYm9scycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nSWdub3JlIHVucmVzb2x2ZWQgdW5kZWZpbmVkIHN5bWJvbHMnKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW1heC1wYWdlLXNpemUnLCBhY3Rpb249J3N0b3JlJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUmVxdWlyZWQgcGFnZSBzaXplIGFsaWdubWVudCBzdXBwb3J0JykKIAogICAjIE90aGVyIG9wdGlvbnMKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1sbHZtLXJlYWRvYmonLApAQCAtNTQyLDYgKzYxMCw5IEBACiAKICAgY2hlY2tlci5jaGVja19kdF9uZWVkZWQoYXJncy5zeXN0ZW1fc2hhcmVkX2xpYikKIAorICBpZiBhcmdzLm1heF9wYWdlX3NpemU6CisgICAgY2hlY2tlci5jaGVja19tYXhfcGFnZV9zaXplKGFyZ3MubWF4X3BhZ2Vfc2l6ZSkKKwogICBpZiBub3QgYXJncy5hbGxvd191bmRlZmluZWRfc3ltYm9sczoKICAgICBjaGVja2VyLmNoZWNrX3N5bWJvbHMoKQogCmRpZmYgLS1naXQgYS90b29scy9jaGVja293bmVycy5weSBiL3Rvb2xzL2NoZWNrb3duZXJzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMDM3MzIxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2NoZWNrb3duZXJzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotIyEvdXNyL2Jpbi9weXRob24KLQotIiIiUGFyc2UgYW5kIGNoZWNrIHN5bnRheCBlcnJvcnMgb2YgYSBnaXZlbiBPV05FUlMgZmlsZS4iIiIKLQotaW1wb3J0IGFyZ3BhcnNlCi1pbXBvcnQgcmUKLWltcG9ydCBzeXMKLWltcG9ydCB1cmxsaWIucmVxdWVzdCwgdXJsbGliLnBhcnNlLCB1cmxsaWIuZXJyb3IKLWltcG9ydCB1cmxsaWIucmVxdWVzdCwgdXJsbGliLmVycm9yLCB1cmxsaWIucGFyc2UKLQotcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J0NoZWNrIE9XTkVSUyBmaWxlIHN5bnRheCcpCi1wYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBkZXN0PSd2ZXJib3NlJywKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgaGVscD0nVmVyYm9zZSBvdXRwdXQgdG8gZGVidWcnKQotcGFyc2VyLmFkZF9hcmd1bWVudCgnLWMnLCAnLS1jaGVja19hZGRyZXNzJywgZGVzdD0nY2hlY2tfYWRkcmVzcycsCi0gICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIGhlbHA9J0NoZWNrIGVtYWlsIGFkZHJlc3NlcycpCi1wYXJzZXIuYWRkX2FyZ3VtZW50KGRlc3Q9J293bmVycycsIG1ldGF2YXI9J09XTkVSUycsIG5hcmdzPScrJywKLSAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBPV05FUlMgZmlsZScpCi1hcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotCi1nZXJyaXRfc2VydmVyID0gJ2h0dHBzOi8vYW5kcm9pZC1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbScKLWNoZWNrZWRfYWRkcmVzc2VzID0ge30KLQotCi1kZWYgZWNobyhtc2cpOgotICBpZiBhcmdzLnZlcmJvc2U6Ci0gICAgcHJpbnQobXNnKQotCi0KLWRlZiBmaW5kX2FkZHJlc3MoYWRkcmVzcyk6Ci0gIGlmIGFkZHJlc3Mgbm90IGluIGNoZWNrZWRfYWRkcmVzc2VzOgotICAgIHJlcXVlc3QgPSAoZ2Vycml0X3NlcnZlciArICcvYWNjb3VudHMvP249MSZxPWVtYWlsOicKLSAgICAgICAgICAgICAgICsgdXJsbGliLnBhcnNlLnF1b3RlKGFkZHJlc3MpKQotICAgIGVjaG8oJ0NoZWNraW5nIGVtYWlsIGFkZHJlc3M6ICcgKyBhZGRyZXNzKQotICAgIHJlc3VsdCA9IHVybGxpYi5yZXF1ZXN0LnVybG9wZW4ocmVxdWVzdCkucmVhZCgpCi0gICAgY2hlY2tlZF9hZGRyZXNzZXNbYWRkcmVzc10gPSByZXN1bHQuZmluZCgnIl9hY2NvdW50X2lkIjonKSA+PSAwCi0gICAgaWYgY2hlY2tlZF9hZGRyZXNzZXNbYWRkcmVzc106Ci0gICAgICBlY2hvKCdGb3VuZCBlbWFpbCBhZGRyZXNzOiAnICsgYWRkcmVzcykKLSAgcmV0dXJuIGNoZWNrZWRfYWRkcmVzc2VzW2FkZHJlc3NdCi0KLQotZGVmIGNoZWNrX2FkZHJlc3MoZm5hbWUsIG51bSwgYWRkcmVzcyk6Ci0gIGlmIGZpbmRfYWRkcmVzcyhhZGRyZXNzKToKLSAgICByZXR1cm4gMAotICBwcmludCgnJXM6JWQ6IEVSUk9SOiB1bmtub3duIGVtYWlsIGFkZHJlc3M6ICVzJyAlIChmbmFtZSwgbnVtLCBhZGRyZXNzKSkKLSAgcmV0dXJuIDEKLQotCi1kZWYgbWFpbigpOgotICAjIE9uZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gY2hlY2sgYWxsIHZhbGlkIGxpbmVzLgotICBub3BhcmVudCA9ICdzZXQgK25vcGFyZW50JwotICBlbWFpbCA9ICcoW15AIF0rQFteIEBdK3xcXCopJwotICBlbWFpbHMgPSAnKCVzKCAqLCAqJXMpKiknICUgKGVtYWlsLCBlbWFpbCkKLSAgZmlsZV9kaXJlY3RpdmUgPSAnZmlsZTogKihbXiA6XSsgKjogKik/W14gXSsnCi0gIGRpcmVjdGl2ZSA9ICcoJXN8JXN8JXMpJyAlIChlbWFpbHMsIG5vcGFyZW50LCBmaWxlX2RpcmVjdGl2ZSkKLSAgZ2xvYiA9ICdbYS16QS1aMC05X1xcLlxcLVxcKlxcP10rJwotICBnbG9icyA9ICcoJXMoICosIColcykqKScgJSAoZ2xvYiwgZ2xvYikKLSAgcGVyZmlsZSA9ICdwZXItZmlsZSArJyArIGdsb2JzICsgJyAqPSAqJyArIGRpcmVjdGl2ZQotICBpbmNsdWRlID0gJ2luY2x1ZGUgKyhbXiA6XSsgKjogKik/W14gXSsnCi0gIHBhdHMgPSAnKHwlc3wlc3wlc3wlc3wlcykkJyAlIChub3BhcmVudCwgZW1haWwsIHBlcmZpbGUsIGluY2x1ZGUsIGZpbGVfZGlyZWN0aXZlKQotICBwYXR0ZXJucyA9IHJlLmNvbXBpbGUocGF0cykKLSAgYWRkcmVzc19wYXR0ZXJuID0gcmUuY29tcGlsZSgnKFteQCBdK0BbXiBAXSspJykKLSAgcGVyZmlsZV9wYXR0ZXJuID0gcmUuY29tcGlsZSgncGVyLWZpbGUgKy4qPSguKiknKQotCi0gIGVycm9yID0gMAotICBmb3IgZm5hbWUgaW4gYXJncy5vd25lcnM6Ci0gICAgZWNobygnQ2hlY2tpbmcgZmlsZTogJyArIGZuYW1lKQotICAgIG51bSA9IDAKLSAgICBmb3IgbGluZSBpbiBvcGVuKGZuYW1lLCAncicpOgotICAgICAgbnVtICs9IDEKLSAgICAgIHN0cmlwcGVkX2xpbmUgPSByZS5zdWIoJyMuKiQnLCAnJywgbGluZSkuc3RyaXAoKQotICAgICAgaWYgbm90IHBhdHRlcm5zLm1hdGNoKHN0cmlwcGVkX2xpbmUpOgotICAgICAgICBlcnJvciArPSAxCi0gICAgICAgIHByaW50KCclczolZDogRVJST1I6IHVua25vd24gbGluZSBbJXNdJyAlIChmbmFtZSwgbnVtLCBsaW5lLnN0cmlwKCkpKQotICAgICAgZWxpZiBhcmdzLmNoZWNrX2FkZHJlc3M6Ci0gICAgICAgIGlmIHBlcmZpbGVfcGF0dGVybi5tYXRjaChzdHJpcHBlZF9saW5lKToKLSAgICAgICAgICBmb3IgYWRkciBpbiBwZXJmaWxlX3BhdHRlcm4ubWF0Y2goc3RyaXBwZWRfbGluZSkuZ3JvdXAoMSkuc3BsaXQoJywnKToKLSAgICAgICAgICAgIGEgPSBhZGRyLnN0cmlwKCkKLSAgICAgICAgICAgIGlmIGEgYW5kIGEgIT0gJyonOgotICAgICAgICAgICAgICBlcnJvciArPSBjaGVja19hZGRyZXNzKGZuYW1lLCBudW0sIGFkZHIuc3RyaXAoKSkKLSAgICAgICAgZWxpZiBhZGRyZXNzX3BhdHRlcm4ubWF0Y2goc3RyaXBwZWRfbGluZSk6Ci0gICAgICAgICAgZXJyb3IgKz0gY2hlY2tfYWRkcmVzcyhmbmFtZSwgbnVtLCBzdHJpcHBlZF9saW5lKQotICBzeXMuZXhpdChlcnJvcikKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgbWFpbigpCmRpZmYgLS1naXQgYS90b29scy9jb21wbGlhbmNlL2NtZC9ydHJhY2UvcnRyYWNlLmdvIGIvdG9vbHMvY29tcGxpYW5jZS9jbWQvcnRyYWNlL3J0cmFjZS5nbwppbmRleCA2NjdjZGNlLi4zZTdlNjliIDEwMDY0NAotLS0gYS90b29scy9jb21wbGlhbmNlL2NtZC9ydHJhY2UvcnRyYWNlLmdvCisrKyBiL3Rvb2xzL2NvbXBsaWFuY2UvY21kL3J0cmFjZS9ydHJhY2UuZ28KQEAgLTkzLDE3ICs5MywxNyBAQAogCWZsYWdzLlVzYWdlID0gZnVuYygpIHsKIAkJZm10LkZwcmludGYob3MuU3RkZXJyLCBgVXNhZ2U6ICVzIHtvcHRpb25zfSBmaWxlLm1ldGFfbGljIHtmaWxlLm1ldGFfbGljLi4ufQogCi1PdXRwdXRzIGEgc3BhY2Utc2VwYXJhdGVkIFRhcmdldCBBY3RzT24gT3JpZ2luIENvbmRpdGlvbiB0dXBsZSBmb3IgZWFjaAotcmVzb2x1dGlvbiBpbiB0aGUgZ3JhcGguIFdoZW4gLWRvdCBmbGFnIGdpdmVuLCBvdXRwdXRzIG5vZGVzIGFuZCBlZGdlcwotaW4gZ3JhcGh2aXogZGlyZWN0ZWQgZ3JhcGggZm9ybWF0LgorQ2FsY3VsYXRlcyB0aGUgc291cmNlLXNoYXJpbmcgcmVxdWlyZW1lbnRzIGluIHJldmVyc2Ugc3RhcnRpbmcgYXQgdGhlCistcnRyYWNlIHByb2plY3RzIG9yIG1ldGFkYXRhIGZpbGVzIHRoYXQgaW5oZXJpdGVkIHNvdXJjZS1zaGFyaW5nIGFuZAord29ya2luZyBiYWNrIHRvIHRoZSB0YXJnZXRzIHdoZXJlIHRoZSBzb3VyY2Utc2hhcmluZyByZXF1aXJtZW1lbnRzCitvcmlnaW5hdGUuCiAKLUlmIG9uZSBvciBtb3JlICctYyBjb25kaXRpb24nIGNvbmRpdGlvbnMgYXJlIGdpdmVuLCBvdXRwdXRzIHRoZQotcmVzb2x1dGlvbiBmb3IgdGhlIHVuaW9uIG9mIHRoZSBjb25kaXRpb25zLiBPdGhlcndpc2UsIG91dHB1dHMgdGhlCi1yZXNvbHV0aW9uIGZvciBhbGwgY29uZGl0aW9ucy4KK091dHB1dHMgYSBzcGFjZS1zZXBhcmF0ZWQgcGFpciB3aGVyZSB0aGUgZmlyc3QgZmllbGQgaXMgYW4gb3JpZ2luYXRpbmcKK3RhcmdldCB3aXRoIG9uZSBvciBtb3JlIHJlc3RyaWN0ZWQgY29uZGl0aW9ucyBhbmQgd2hlcmUgdGhlIHNlY29uZAorZmllbGQgaXMgYSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgcmVzdHJpY3RlZCBjb25kaXRpb25zLgogCi1JbiBwbGFpbiB0ZXh0IG1vZGUsIHdoZW4gJy1sYWJlbF9jb25kaXRpb25zJyBpcyByZXF1ZXN0ZWQsIHRoZSBUYXJnZXQKLWFuZCBPcmlnaW4gaGF2ZSBjb2xvbi1zZXBhcmF0ZWQgbGljZW5zZSBjb25kaXRpb25zIGFwcGVuZGVkOgotaS5lLiB0YXJnZXQ6Y29uZGl0aW9uMTpjb25kaXRpb24yIGV0Yy4KK091dHB1dHMgYSBjb3VudCBvZiB0aGUgb3JpZ2luYXRpbmcgdGFyZ2V0cywgYW5kIGlmIHRoZSBjb3VudCBpcyB6ZXJvLAorb3V0cHV0cyBhIHdhcm5pbmcgdG8gY2hlY2sgdGhlIC1ydHJhY2UgcHJvamVjdHMgYW5kL29yIGZpbGVuYW1lcy4KIAogT3B0aW9uczoKIGAsIGZpbGVwYXRoLkJhc2Uob3MuQXJnc1swXSkpCmRpZmYgLS1naXQgYS90b29scy9jb21wbGlhbmNlL2NtZC9zYm9tL3Nib20uZ28gYi90b29scy9jb21wbGlhbmNlL2NtZC9zYm9tL3Nib20uZ28KaW5kZXggYzM3OGUzOS4uYTUzNzQxZiAxMDA2NDQKLS0tIGEvdG9vbHMvY29tcGxpYW5jZS9jbWQvc2JvbS9zYm9tLmdvCisrKyBiL3Rvb2xzL2NvbXBsaWFuY2UvY21kL3Nib20vc2JvbS5nbwpAQCAtMzUsNyArMzUsNyBAQAogCSJnaXRodWIuY29tL2dvb2dsZS9ibHVlcHJpbnQvZGVwdG9vbHMiCiAKIAkiZ2l0aHViLmNvbS9zcGR4L3Rvb2xzLWdvbGFuZy9idWlsZGVyL2J1aWxkZXIydjIiCi0JImdpdGh1Yi5jb20vc3BkeC90b29scy1nb2xhbmcvanNvbiIKKwlzcGR4X2pzb24gImdpdGh1Yi5jb20vc3BkeC90b29scy1nb2xhbmcvanNvbiIKIAkiZ2l0aHViLmNvbS9zcGR4L3Rvb2xzLWdvbGFuZy9zcGR4L2NvbW1vbiIKIAlzcGR4ICJnaXRodWIuY29tL3NwZHgvdG9vbHMtZ29sYW5nL3NwZHgvdjJfMiIKIAkiZ2l0aHViLmNvbS9zcGR4L3Rvb2xzLWdvbGFuZy9zcGR4bGliIgpAQCAtNTUsNiArNTUsNyBAQAogCXByb2R1Y3QgICAgICBzdHJpbmcKIAlzdHJpcFByZWZpeCAgW11zdHJpbmcKIAljcmVhdGlvblRpbWUgY3JlYXRpb25UaW1lR2V0dGVyCisJYnVpbGRpZCAgICAgIHN0cmluZwogfQogCiBmdW5jIChjdHggY29udGV4dCkgc3RyaXAoaW5zdGFsbFBhdGggc3RyaW5nKSBzdHJpbmcgewpAQCAtMTI0LDYgKzEyNSw3IEBACiAJZGVwc0ZpbGUgOj0gZmxhZ3MuU3RyaW5nKCJkIiwgIiIsICJXaGVyZSB0byB3cml0ZSB0aGUgZGVwcyBmaWxlIikKIAlwcm9kdWN0IDo9IGZsYWdzLlN0cmluZygicHJvZHVjdCIsICIiLCAiVGhlIG5hbWUgb2YgdGhlIHByb2R1Y3QgZm9yIHdoaWNoIHRoZSBub3RpY2UgaXMgZ2VuZXJhdGVkLiIpCiAJc3RyaXBQcmVmaXggOj0gbmV3TXVsdGlTdHJpbmcoZmxhZ3MsICJzdHJpcF9wcmVmaXgiLCAiUHJlZml4IHRvIHJlbW92ZSBmcm9tIHBhdGhzLiBpLmUuIHBhdGggdG8gcm9vdCAobXVsdGlwbGUgYWxsb3dlZCkiKQorCWJ1aWxkaWQgOj0gZmxhZ3MuU3RyaW5nKCJidWlsZF9pZCIsICIiLCAiVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgYnVpbGQuIChkZWZhdWx0IHRpbWVzdGFtcCkiKQogCiAJZmxhZ3MuUGFyc2UoZXhwYW5kZWRBcmdzKQogCkBAIC0xNjIsNyArMTY0LDcgQEAKIAkJb2ZpbGUgPSBvYnVmCiAJfQogCi0JY3R4IDo9ICZjb250ZXh0e29maWxlLCBvcy5TdGRlcnIsIGNvbXBsaWFuY2UuRlMsICpwcm9kdWN0LCAqc3RyaXBQcmVmaXgsIGFjdHVhbFRpbWV9CisJY3R4IDo9ICZjb250ZXh0e29maWxlLCBvcy5TdGRlcnIsIGNvbXBsaWFuY2UuRlMsICpwcm9kdWN0LCAqc3RyaXBQcmVmaXgsIGFjdHVhbFRpbWUsICpidWlsZGlkfQogCiAJc3BkeERvYywgZGVwcywgZXJyIDo9IHNib21HZW5lcmF0b3IoY3R4LCBmbGFncy5BcmdzKCkuLi4pCiAKQEAgLTI3Miw3ICsyNzQsNyBAQAogCXRuICpjb21wbGlhbmNlLlRhcmdldE5vZGUpICgqcHJvamVjdG1ldGFkYXRhLlByb2plY3RNZXRhZGF0YSwgZXJyb3IpIHsKIAlwbXMsIGVyciA6PSBwbWl4Lk1ldGFkYXRhRm9yUHJvamVjdHModG4uUHJvamVjdHMoKS4uLikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiVW5hYmxlIHRvIHJlYWQgcHJvamVjdHMgZm9yICVxOiAld1xuIiwgdG4sIGVycikKKwkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiVW5hYmxlIHRvIHJlYWQgcHJvamVjdHMgZm9yICVxOiAld1xuIiwgdG4uTmFtZSgpLCBlcnIpCiAJfQogCWlmIGxlbihwbXMpID09IDAgewogCQlyZXR1cm4gbmlsLCBuaWwKQEAgLTMxNywxNCArMzE5LDIxIEBACiB9CiAKIC8vIGdlbmVyYXRlU1BEWE5hbWVzcGFjZSBnZW5lcmF0ZXMgYSB1bmlxdWUgU1BEWCBEb2N1bWVudCBOYW1lc3BhY2UgdXNpbmcgYSBTSEExIGNoZWNrc3VtCi0vLyBhbmQgdGhlIENyZWF0aW9uSW5mby5DcmVhdGVkIGZpZWxkIGFzIHRoZSBkYXRlLgotZnVuYyBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoY3JlYXRlZCBzdHJpbmcpIHN0cmluZyB7Ci0JLy8gQ29tcHV0ZSBhIFNIQTEgY2hlY2tzdW0gb2YgdGhlIENyZWF0aW9uSW5mby5DcmVhdGVkIGZpZWxkLgotCWhhc2ggOj0gc2hhMS5TdW0oW11ieXRlKGNyZWF0ZWQpKQotCWNoZWNrc3VtIDo9IGhleC5FbmNvZGVUb1N0cmluZyhoYXNoWzpdKQorZnVuYyBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoYnVpbGRpZCBzdHJpbmcsIGNyZWF0ZWQgc3RyaW5nLCBmaWxlcyAuLi5zdHJpbmcpIHN0cmluZyB7CiAKLQkvLyBDb21iaW5lIHRoZSBjaGVja3N1bSBhbmQgdGltZXN0YW1wIHRvIGdlbmVyYXRlIHRoZSBTUERYIE5hbWVzcGFjZS4KLQluYW1lc3BhY2UgOj0gZm10LlNwcmludGYoIlNQRFhSZWYtRE9DVU1FTlQtJXMtJXMiLCBjcmVhdGVkLCBjaGVja3N1bSkKKwlzZWVkIDo9IHN0cmluZ3MuSm9pbihmaWxlcywgIiIpCisKKwlpZiBidWlsZGlkID09ICIiIHsKKwkJc2VlZCArPSBjcmVhdGVkCisJfSBlbHNlIHsKKwkJc2VlZCArPSBidWlsZGlkCisJfQorCisJLy8gQ29tcHV0ZSBhIFNIQTEgY2hlY2tzdW0gb2YgdGhlIHNlZWQuCisJaGFzaCA6PSBzaGExLlN1bShbXWJ5dGUoc2VlZCkpCisJdXVpZCA6PSBoZXguRW5jb2RlVG9TdHJpbmcoaGFzaFs6XSkKKworCW5hbWVzcGFjZSA6PSBmbXQuU3ByaW50ZigiU1BEWFJlZi1ET0NVTUVOVC0lcyIsIHV1aWQpCiAKIAlyZXR1cm4gbmFtZXNwYWNlCiB9CkBAIC01MjMsNyArNTMyLDcgQEAKIAkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCURvY3VtZW50TmFtZTogICAgICBkb2NOYW1lLAotCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKGNpLkNyZWF0ZWQpLAorCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKGN0eC5idWlsZGlkLCBjaS5DcmVhdGVkLCBmaWxlcy4uLiksCiAJCUNyZWF0aW9uSW5mbzogICAgICBjaSwKIAkJUGFja2FnZXM6ICAgICAgICAgIHBrZ3MsCiAJCVJlbGF0aW9uc2hpcHM6ICAgICByZWxhdGlvbnNoaXBzLApkaWZmIC0tZ2l0IGEvdG9vbHMvY29tcGxpYW5jZS9jbWQvc2JvbS9zYm9tX3Rlc3QuZ28gYi90b29scy9jb21wbGlhbmNlL2NtZC9zYm9tL3Nib21fdGVzdC5nbwppbmRleCA2NDcyZjUxLi4xM2JhNjZkIDEwMDY0NAotLS0gYS90b29scy9jb21wbGlhbmNlL2NtZC9zYm9tL3Nib21fdGVzdC5nbworKysgYi90b29scy9jb21wbGlhbmNlL2NtZC9zYm9tL3Nib21fdGVzdC5nbwpAQCAtMjUsNiArMjUsNyBAQAogCSJ0aW1lIgogCiAJImFuZHJvaWQvc29vbmcvdG9vbHMvY29tcGxpYW5jZSIKKwogCSJnaXRodWIuY29tL3NwZHgvdG9vbHMtZ29sYW5nL2J1aWxkZXIvYnVpbGRlcjJ2MiIKIAkiZ2l0aHViLmNvbS9zcGR4L3Rvb2xzLWdvbGFuZy9zcGR4L2NvbW1vbiIKIAlzcGR4ICJnaXRodWIuY29tL3NwZHgvdG9vbHMtZ29sYW5nL3NwZHgvdjJfMiIKQEAgLTU5LDcgKzYwLDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtZmlyc3RwYXJ0eS1oaWdoZXN0LmFwZXgiLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL2ZpcnN0cGFydHkvaGlnaGVzdC5hcGV4Lm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0xODcsNyArMTg4LDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtZmlyc3RwYXJ0eS1hcHBsaWNhdGlvbiIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvZmlyc3RwYXJ0eS9hcHBsaWNhdGlvbi5tZXRhX2xpYyIpLAogCQkJCUNyZWF0aW9uSW5mbzogICAgICBnZXRDcmVhdGlvbkluZm8odCksCiAJCQkJUGFja2FnZXM6IFtdKnNwZHguUGFja2FnZXsKIAkJCQkJewpAQCAtMjY2LDcgKzI2Nyw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLWZpcnN0cGFydHktY29udGFpbmVyLnppcCIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvZmlyc3RwYXJ0eS9jb250YWluZXIuemlwLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0zOTQsNyArMzk1LDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtZmlyc3RwYXJ0eS1iaW4tYmluMSIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvZmlyc3RwYXJ0eS9iaW4vYmluMS5tZXRhX2xpYyIpLAogCQkJCUNyZWF0aW9uSW5mbzogICAgICBnZXRDcmVhdGlvbkluZm8odCksCiAJCQkJUGFja2FnZXM6IFtdKnNwZHguUGFja2FnZXsKIAkJCQkJewpAQCAtNDYwLDcgKzQ2MSw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLWZpcnN0cGFydHktbGliLWxpYmQuc28iLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL2ZpcnN0cGFydHkvbGliL2xpYmQuc28ubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTUwMCw3ICs1MDEsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1ub3RpY2UtaGlnaGVzdC5hcGV4IiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9ub3RpY2UvaGlnaGVzdC5hcGV4Lm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC02MzQsNyArNjM1LDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtbm90aWNlLWNvbnRhaW5lci56aXAiLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL25vdGljZS9jb250YWluZXIuemlwLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC03NjgsNyArNzY5LDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtbm90aWNlLWFwcGxpY2F0aW9uIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9ub3RpY2UvYXBwbGljYXRpb24ubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTg1Myw3ICs4NTQsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1ub3RpY2UtYmluLWJpbjEiLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL25vdGljZS9iaW4vYmluMS5tZXRhX2xpYyIpLAogCQkJCUNyZWF0aW9uSW5mbzogICAgICBnZXRDcmVhdGlvbkluZm8odCksCiAJCQkJUGFja2FnZXM6IFtdKnNwZHguUGFja2FnZXsKIAkJCQkJewpAQCAtOTI1LDcgKzkyNiw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLW5vdGljZS1saWItbGliZC5zbyIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvbm90aWNlL2xpYi9saWJkLnNvLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC05NjUsNyArOTY2LDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtcmVjaXByb2NhbC1oaWdoZXN0LmFwZXgiLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL3JlY2lwcm9jYWwvaGlnaGVzdC5hcGV4Lm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0xMTA1LDcgKzExMDYsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1yZWNpcHJvY2FsLWFwcGxpY2F0aW9uIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9yZWNpcHJvY2FsL2FwcGxpY2F0aW9uLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0xMTk2LDcgKzExOTcsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1yZWNpcHJvY2FsLWJpbi1iaW4xIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9yZWNpcHJvY2FsL2Jpbi9iaW4xLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0xMjY4LDcgKzEyNjksNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1yZWNpcHJvY2FsLWxpYi1saWJkLnNvIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9yZWNpcHJvY2FsL2xpYi9saWJkLnNvLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0xMzA4LDcgKzEzMDksNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1yZXN0cmljdGVkLWhpZ2hlc3QuYXBleCIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvcmVzdHJpY3RlZC9oaWdoZXN0LmFwZXgubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTE0NTQsNyArMTQ1NSw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLXJlc3RyaWN0ZWQtY29udGFpbmVyLnppcCIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvcmVzdHJpY3RlZC9jb250YWluZXIuemlwLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0xNjAwLDcgKzE2MDEsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1yZXN0cmljdGVkLWJpbi1iaW4xIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9yZXN0cmljdGVkL2Jpbi9iaW4xLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0xNjc4LDcgKzE2NzksNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1yZXN0cmljdGVkLWxpYi1saWJkLnNvIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9yZXN0cmljdGVkL2xpYi9saWJkLnNvLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0xNzE4LDcgKzE3MTksNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1wcm9wcmlldGFyeS1oaWdoZXN0LmFwZXgiLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL3Byb3ByaWV0YXJ5L2hpZ2hlc3QuYXBleC5tZXRhX2xpYyIpLAogCQkJCUNyZWF0aW9uSW5mbzogICAgICBnZXRDcmVhdGlvbkluZm8odCksCiAJCQkJUGFja2FnZXM6IFtdKnNwZHguUGFja2FnZXsKIAkJCQkJewpAQCAtMTg2NCw3ICsxODY1LDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtcHJvcHJpZXRhcnktY29udGFpbmVyLnppcCIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvcHJvcHJpZXRhcnkvY29udGFpbmVyLnppcC5tZXRhX2xpYyIpLAogCQkJCUNyZWF0aW9uSW5mbzogICAgICBnZXRDcmVhdGlvbkluZm8odCksCiAJCQkJUGFja2FnZXM6IFtdKnNwZHguUGFja2FnZXsKIAkJCQkJewpAQCAtMjAxMCw3ICsyMDExLDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtcHJvcHJpZXRhcnktYXBwbGljYXRpb24iLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL3Byb3ByaWV0YXJ5L2FwcGxpY2F0aW9uLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0yMTAxLDcgKzIxMDIsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1wcm9wcmlldGFyeS1iaW4tYmluMSIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvcHJvcHJpZXRhcnkvYmluL2JpbjEubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTIxNzMsNyArMjE3NCw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLXByb3ByaWV0YXJ5LWxpYi1saWJkLnNvIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9wcm9wcmlldGFyeS9saWIvbGliZC5zby5tZXRhX2xpYyIpLAogCQkJCUNyZWF0aW9uSW5mbzogICAgICBnZXRDcmVhdGlvbkluZm8odCksCiAJCQkJUGFja2FnZXM6IFtdKnNwZHguUGFja2FnZXsKIAkJCQkJewpAQCAtMjIxNSw3ICsyMjE2LDcgQEAKIAkJCQlyb290RmlsZXMgPSBhcHBlbmQocm9vdEZpbGVzLCAidGVzdGRhdGEvIit0dC5jb25kaXRpb24rIi8iK3IpCiAJCQl9CiAKLQkJCWN0eCA6PSBjb250ZXh0e3N0ZG91dCwgc3RkZXJyLCBjb21wbGlhbmNlLkdldEZTKHR0Lm91dERpciksICIiLCBbXXN0cmluZ3t0dC5zdHJpcFByZWZpeH0sIGZha2VUaW1lfQorCQkJY3R4IDo9IGNvbnRleHR7c3Rkb3V0LCBzdGRlcnIsIGNvbXBsaWFuY2UuR2V0RlModHQub3V0RGlyKSwgIiIsIFtdc3RyaW5ne3R0LnN0cmlwUHJlZml4fSwgZmFrZVRpbWUsICIifQogCiAJCQlzcGR4RG9jLCBkZXBzLCBlcnIgOj0gc2JvbUdlbmVyYXRvcigmY3R4LCByb290RmlsZXMuLi4pCiAJCQlpZiBlcnIgIT0gbmlsIHsKQEAgLTIyNjIsNiArMjI2Myw5NiBAQAogCX0KIH0KIAorZnVuYyBUZXN0R2VuZXJhdGVTUERYTmFtZXNwYWNlKHQgKnRlc3RpbmcuVCkgeworCisJYnVpbGRJRDEgOj0gImV4YW1wbGUtMSIKKwlidWlsZElEMiA6PSAiZXhhbXBsZS0yIgorCWZpbGVzMSA6PSAiZmlsZTEiCisJdGltZXN0YW1wMSA6PSAiMjAyMi0wNS0wMSIKKwl0aW1lc3RhbXAyIDo9ICIyMDIyLTA1LTAyIgorCWZpbGVzMiA6PSAiZmlsZTIiCisKKwkvLyBUZXN0IGNhc2UgMTogZGlmZmVyZW50IHRpbWVzdGFtcHMsIHNhbWUgZmlsZXMKKwluc2gxIDo9IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgdGltZXN0YW1wMSwgZmlsZXMxKQorCW5zaDIgOj0gZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCB0aW1lc3RhbXAyLCBmaWxlczEpCisKKwlpZiBuc2gxID09ICIiIHsKKwkJdC5FcnJvcmYoImdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgbm9uLWVtcHR5IHN0cmluZywgYnV0IGdvdCBlbXB0eSBzdHJpbmciLCAiIiwgdGltZXN0YW1wMSwgZmlsZXMxKQorCX0KKworCWlmIG5zaDIgPT0gIiIgeworCQl0LkVycm9yZigiZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpOiBleHBlY3RlZCBub24tZW1wdHkgc3RyaW5nLCBidXQgZ290IGVtcHR5IHN0cmluZyIsICIiLCB0aW1lc3RhbXAyLCBmaWxlczEpCisJfQorCisJaWYgbnNoMSA9PSBuc2gyIHsKKwkJdC5FcnJvcmYoImdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKSBhbmQgZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpOiBleHBlY3RlZCBkaWZmZXJlbnQgbmFtZXNwYWNlIGhhc2hlcywgYnV0IGdvdCB0aGUgc2FtZSIsICIiLCB0aW1lc3RhbXAxLCBmaWxlczEsICIiLCB0aW1lc3RhbXAyLCBmaWxlczEpCisJfQorCisJLy8gVGVzdCBjYXNlIDI6IGRpZmZlcmVudCBidWlsZCBpZHMsIHNhbWUgdGltZXN0YW1wcyBhbmQgZmlsZXMKKwluc2gxID0gZ2VuZXJhdGVTUERYTmFtZXNwYWNlKGJ1aWxkSUQxLCB0aW1lc3RhbXAxLCBmaWxlczEpCisJbnNoMiA9IGdlbmVyYXRlU1BEWE5hbWVzcGFjZShidWlsZElEMiwgdGltZXN0YW1wMSwgZmlsZXMxKQorCisJaWYgbnNoMSA9PSAiIiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcyk6IGV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmcsIGJ1dCBnb3QgZW1wdHkgc3RyaW5nIiwgYnVpbGRJRDEsIHRpbWVzdGFtcDEsIGZpbGVzMSkKKwl9CisKKwlpZiBuc2gyID09ICIiIHsKKwkJdC5FcnJvcmYoImdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgbm9uLWVtcHR5IHN0cmluZywgYnV0IGdvdCBlbXB0eSBzdHJpbmciLCBidWlsZElEMiwgdGltZXN0YW1wMSwgZmlsZXMxKQorCX0KKworCWlmIG5zaDEgPT0gbnNoMiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcykgYW5kIGdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgZGlmZmVyZW50IG5hbWVzcGFjZSBoYXNoZXMsIGJ1dCBnb3QgdGhlIHNhbWUiLCBidWlsZElEMSwgdGltZXN0YW1wMSwgZmlsZXMxLCBidWlsZElEMiwgdGltZXN0YW1wMSwgZmlsZXMxKQorCX0KKworCS8vIFRlc3QgY2FzZSAzOiBzYW1lIGJ1aWxkIGlkcyBhbmQgZmlsZXMsIGRpZmZlcmVudCB0aW1lc3RhbXBzCisJbnNoMSA9IGdlbmVyYXRlU1BEWE5hbWVzcGFjZShidWlsZElEMSwgdGltZXN0YW1wMSwgZmlsZXMxKQorCW5zaDIgPSBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoYnVpbGRJRDEsIHRpbWVzdGFtcDIsIGZpbGVzMSkKKworCWlmIG5zaDEgPT0gIiIgeworCQl0LkVycm9yZigiZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpOiBleHBlY3RlZCBub24tZW1wdHkgc3RyaW5nLCBidXQgZ290IGVtcHR5IHN0cmluZyIsIGJ1aWxkSUQxLCB0aW1lc3RhbXAxLCBmaWxlczEpCisJfQorCisJaWYgbnNoMiA9PSAiIiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcyk6IGV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmcsIGJ1dCBnb3QgZW1wdHkgc3RyaW5nIiwgYnVpbGRJRDEsIHRpbWVzdGFtcDIsIGZpbGVzMSkKKwl9CisKKwlpZiBuc2gxICE9IG5zaDIgeworCQl0LkVycm9yZigiZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpIGFuZCBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcyk6IGV4cGVjdGVkIHNhbWUgbmFtZXNwYWNlIGhhc2hlcywgYnV0IGdvdCBkaWZmZXJlbnQ6ICVzIGFuZCAlcyIsIGJ1aWxkSUQxLCB0aW1lc3RhbXAxLCBmaWxlczEsIGJ1aWxkSUQyLCB0aW1lc3RhbXAxLCBmaWxlczEsIG5zaDEsIG5zaDIpCisJfQorCisJLy8gVGVzdCBjYXNlIDQ6IHNhbWUgYnVpbGQgaWRzIGFuZCB0aW1lc3RhbXBzLCBkaWZmZXJlbnQgZmlsZXMKKwluc2gxID0gZ2VuZXJhdGVTUERYTmFtZXNwYWNlKGJ1aWxkSUQxLCB0aW1lc3RhbXAxLCBmaWxlczEpCisJbnNoMiA9IGdlbmVyYXRlU1BEWE5hbWVzcGFjZShidWlsZElEMSwgdGltZXN0YW1wMSwgZmlsZXMyKQorCisJaWYgbnNoMSA9PSAiIiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcyk6IGV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmcsIGJ1dCBnb3QgZW1wdHkgc3RyaW5nIiwgYnVpbGRJRDEsIHRpbWVzdGFtcDEsIGZpbGVzMSkKKwl9CisKKwlpZiBuc2gyID09ICIiIHsKKwkJdC5FcnJvcmYoImdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgbm9uLWVtcHR5IHN0cmluZywgYnV0IGdvdCBlbXB0eSBzdHJpbmciLCBidWlsZElEMSwgdGltZXN0YW1wMSwgZmlsZXMyKQorCX0KKworCWlmIG5zaDEgPT0gbnNoMiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcykgYW5kIGdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgZGlmZmVyZW50IG5hbWVzcGFjZSBoYXNoZXMsIGJ1dCBnb3QgdGhlIHNhbWUiLCBidWlsZElEMSwgdGltZXN0YW1wMSwgZmlsZXMxLCBidWlsZElEMSwgdGltZXN0YW1wMSwgZmlsZXMyKQorCX0KKworCS8vIFRlc3QgY2FzZSA1OiBlbXB0eSBidWlsZCBpZHMsIHNhbWUgdGltZXN0YW1wcyBhbmQgZGlmZmVyZW50IGZpbGVzCisJbnNoMSA9IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgdGltZXN0YW1wMSwgZmlsZXMxKQorCW5zaDIgPSBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsIHRpbWVzdGFtcDEsIGZpbGVzMikKKworCWlmIG5zaDEgPT0gIiIgeworCQl0LkVycm9yZigiZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpOiBleHBlY3RlZCBub24tZW1wdHkgc3RyaW5nLCBidXQgZ290IGVtcHR5IHN0cmluZyIsICIiLCB0aW1lc3RhbXAxLCBmaWxlczEpCisJfQorCisJaWYgbnNoMiA9PSAiIiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcyk6IGV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmcsIGJ1dCBnb3QgZW1wdHkgc3RyaW5nIiwgIiIsIHRpbWVzdGFtcDEsIGZpbGVzMikKKwl9CisKKwlpZiBuc2gxID09IG5zaDIgeworCQl0LkVycm9yZigiZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpIGFuZCBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcyk6IGV4cGVjdGVkIGRpZmZlcmVudCBuYW1lc3BhY2UgaGFzaGVzLCBidXQgZ290IHRoZSBzYW1lIiwgIiIsIHRpbWVzdGFtcDEsIGZpbGVzMSwgIiIsIHRpbWVzdGFtcDEsIGZpbGVzMikKKwl9Cit9CisKIGZ1bmMgZ2V0Q3JlYXRpb25JbmZvKHQgKnRlc3RpbmcuVCkgKnNwZHguQ3JlYXRpb25JbmZvIHsKIAljaSwgZXJyIDo9IGJ1aWxkZXIydjIuQnVpbGRDcmVhdGlvbkluZm9TZWN0aW9uMl8yKCJPcmdhbml6YXRpb24iLCAiR29vZ2xlIExMQyIsIG5pbCkKIAlpZiBlcnIgIT0gbmlsIHsKQEAgLTIyODUsOCArMjM3Niw4IEBACiAJaWYgZG9jLkRvY3VtZW50TmFtZSA9PSAiIiB7CiAJCXJldHVybiBmbXQuRXJyb3JmKCJEb2N1bWVudE5hbWU6IGdvdCBub3RoaW5nLCB3YW50IERvY3VtZW50IE5hbWUiKQogCX0KLQlpZiBmbXQuU3ByaW50ZigiJXYiLCBkb2MuQ3JlYXRpb25JbmZvLkNyZWF0b3JzWzFdLkNyZWF0b3IpICE9ICJHb29nbGUgTExDIiB7Ci0JCXJldHVybiBmbXQuRXJyb3JmKCJDcmVhdG9yOiBnb3QgJXYsIHdhbnQgICdHb29nbGUgTExDJyIpCisJaWYgYyA6PSBmbXQuU3ByaW50ZigiJXYiLCBkb2MuQ3JlYXRpb25JbmZvLkNyZWF0b3JzWzFdLkNyZWF0b3IpOyBjICE9ICJHb29nbGUgTExDIiB7CisJCXJldHVybiBmbXQuRXJyb3JmKCJDcmVhdG9yOiBnb3QgJXYsIHdhbnQgICdHb29nbGUgTExDJyIsIGMpCiAJfQogCV8sIGVyciA6PSB0aW1lLlBhcnNlKHRpbWUuUkZDMzMzOSwgZG9jLkNyZWF0aW9uSW5mby5DcmVhdGVkKQogCWlmIGVyciAhPSBuaWwgewpkaWZmIC0tZ2l0IGEvdG9vbHMvY29tcGxpYW5jZS9nby5tb2QgYi90b29scy9jb21wbGlhbmNlL2dvLm1vZAppbmRleCAwODg5MTVhLi41MzJlZmQ0IDEwMDY0NAotLS0gYS90b29scy9jb21wbGlhbmNlL2dvLm1vZAorKysgYi90b29scy9jb21wbGlhbmNlL2dvLm1vZApAQCAtMSwyNiArMSwxMSBAQAorZ28gMS4yMgorCiBtb2R1bGUgYW5kcm9pZC9zb29uZy90b29scy9jb21wbGlhbmNlCiAKLXJlcXVpcmUgZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjAuMC4wCi0KLXJlcGxhY2UgZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjAuMC4wID0+IC4uLy4uLy4uLy4uL2V4dGVybmFsL2dvbGFuZy1wcm90b2J1ZgotCiByZXF1aXJlICgKLQlhbmRyb2lkL3Nvb25nIHYwLjAuMAogCWdpdGh1Yi5jb20vZ29vZ2xlL2JsdWVwcmludCB2MC4wLjAKKwlhbmRyb2lkL3Nvb25nIHYwLjAuMAorCWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmIHYwLjAuMAorCWdpdGh1Yi5jb20vc3BkeC90b29scy1nb2xhbmcgdjAuMC4wCisJZ2l0aHViLmNvbS9nb29nbGUvZ28tY21wIHYwLjAuMAogKQotCi1yZXF1aXJlIGdvbGFuZy5vcmcveC94ZXJyb3JzIHYwLjAuMC0yMDIyMDYwOTE0NDQyOS02NWU2NTQxN2IwMmYgLy8gaW5kaXJlY3QKLQotcmVwbGFjZSBhbmRyb2lkL3Nvb25nIHYwLjAuMCA9PiAuLi8uLi8uLi9zb29uZwotCi1yZXBsYWNlIGdpdGh1Yi5jb20vZ29vZ2xlL2JsdWVwcmludCA9PiAuLi8uLi8uLi9ibHVlcHJpbnQKLQotLy8gSW5kaXJlY3QgZGVwcyBmcm9tIGdvbGFuZy1wcm90b2J1ZgotZXhjbHVkZSBnaXRodWIuY29tL2dvbGFuZy9wcm90b2J1ZiB2MS41LjAKLQotcmVwbGFjZSBnaXRodWIuY29tL2dvb2dsZS9nby1jbXAgdjAuNS41ID0+IC4uLy4uLy4uLy4uL2V4dGVybmFsL2dvLWNtcAotCi0vLyBJbmRpcmVjdCBkZXAgZnJvbSBnby1jbXAKLWV4Y2x1ZGUgZ29sYW5nLm9yZy94L3hlcnJvcnMgdjAuMC4wLTIwMTkxMjA0MTkwNTM2LTliZGZhYmU2ODU0MwotCi1nbyAxLjE4CmRpZmYgLS1naXQgYS90b29scy9jb21wbGlhbmNlL2dvLnN1bSBiL3Rvb2xzL2NvbXBsaWFuY2UvZ28uc3VtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmU3NmQ5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2NvbXBsaWFuY2UvZ28uc3VtCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1nb2xhbmcub3JnL3gveGVycm9ycyB2MC4wLjAtMjAyMjA2MDkxNDQ0MjktNjVlNjU0MTdiMDJmIGgxOnVGNnBhaVFRZWJMZVNYa3JUcUhxejBNWGhYWFMxS2dGNDFlVWRCTnZ4SzA9Ci1nb2xhbmcub3JnL3gveGVycm9ycyB2MC4wLjAtMjAyMjA2MDkxNDQ0MjktNjVlNjU0MTdiMDJmL2dvLm1vZCBoMTpLOCtnaEc1V2FLOXFOcVU1SzNIZElMZk1MeTFmM2FOWUZJL3dubDEwMGE4PQpkaWZmIC0tZ2l0IGEvdG9vbHMvY29tcGxpYW5jZS9nby53b3JrIGIvdG9vbHMvY29tcGxpYW5jZS9nby53b3JrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNGQyZWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jb21wbGlhbmNlL2dvLndvcmsKQEAgLTAsMCArMSwxOCBAQAorZ28gMS4yMgorCit1c2UgKAorCS4KKwkuLi8uLi8uLi8uLi9idWlsZC9ibHVlcHJpbnQKKwkuLi8uLi8uLi8uLi9idWlsZC9zb29uZworCS4uLy4uLy4uLy4uL2V4dGVybmFsL2dvLWNtcAorCS4uLy4uLy4uLy4uL2V4dGVybmFsL2dvbGFuZy1wcm90b2J1ZgorCS4uLy4uLy4uLy4uL2V4dGVybmFsL3NwZHgtdG9vbHMKKykKKworcmVwbGFjZSAoCisJZ2l0aHViLmNvbS9nb29nbGUvYmx1ZXByaW50IHYwLjAuMCA9PiAuLi8uLi8uLi8uLi9idWlsZC9ibHVlcHJpbnQKKwlhbmRyb2lkL3Nvb25nIHYwLjAuMCA9PiAuLi8uLi8uLi8uLi9idWlsZC9zb29uZworCWdpdGh1Yi5jb20vZ29vZ2xlL2dvLWNtcCB2MC4wLjAgPT4gLi4vLi4vLi4vLi4vZXh0ZXJuYWwvZ28tY21wCisJZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjAuMC4wID0+IC4uLy4uLy4uLy4uL2V4dGVybmFsL2dvbGFuZy1wcm90b2J1ZgorCWdpdGh1Yi5jb20vc3BkeC90b29scy1nb2xhbmcgdjAuMC4wID0+IC4uLy4uLy4uLy4uL2V4dGVybmFsL3NwZHgtdG9vbHMKKykKZGlmZiAtLWdpdCBhL3Rvb2xzL2NvbXBsaWFuY2UvcHJvamVjdG1ldGFkYXRhL3Byb2plY3RtZXRhZGF0YS5nbyBiL3Rvb2xzL2NvbXBsaWFuY2UvcHJvamVjdG1ldGFkYXRhL3Byb2plY3RtZXRhZGF0YS5nbwppbmRleCBiMTM3YTEyLi4zMGE2MzI1IDEwMDY0NAotLS0gYS90b29scy9jb21wbGlhbmNlL3Byb2plY3RtZXRhZGF0YS9wcm9qZWN0bWV0YWRhdGEuZ28KKysrIGIvdG9vbHMvY29tcGxpYW5jZS9wcm9qZWN0bWV0YWRhdGEvcHJvamVjdG1ldGFkYXRhLmdvCkBAIC02MywxMiArNjMsMTIgQEAKIAlyZXR1cm4gcG0ucHJvamVjdAogfQogCi0vLyBQcm9qZWN0TmFtZSByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgorLy8gTmFtZSByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgogZnVuYyAocG0gKlByb2plY3RNZXRhZGF0YSkgTmFtZSgpIHN0cmluZyB7CiAJcmV0dXJuIHBtLnByb3RvLkdldE5hbWUoKQogfQogCi0vLyBQcm9qZWN0VmVyc2lvbiByZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGlmIGF2YWlsYWJsZS4KKy8vIFZlcnNpb24gcmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBpZiBhdmFpbGFibGUuCiBmdW5jIChwbSAqUHJvamVjdE1ldGFkYXRhKSBWZXJzaW9uKCkgc3RyaW5nIHsKIAl0cCA6PSBwbS5wcm90by5HZXRUaGlyZFBhcnR5KCkKIAlpZiB0cCAhPSBuaWwgewpkaWZmIC0tZ2l0IGEvdG9vbHMvZW52c2V0dXAvcnVuX2VudnNldHVwX3Rlc3RzIGIvdG9vbHMvZW52c2V0dXAvcnVuX2VudnNldHVwX3Rlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5Nzc0NDgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lbnZzZXR1cC9ydW5fZW52c2V0dXBfdGVzdHMKQEAgLTAsMCArMSwyMjkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKworIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKKworU09VUkNFX0VOVlNFVFVQPSJzb3VyY2UgYnVpbGQvbWFrZS9lbnZzZXR1cC5zaCAmJiAiCisKK2RlZiB1cGRhdGVfZGlzcGxheSgpOgorICAgIHN5cy5zdGRlcnIud3JpdGUoInBhc3NlZFxuIikKKworZGVmIGdvX3RvX3Jvb3QoKToKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygiYnVpbGQvbWFrZS9lbnZzZXR1cC5zaCIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG9zLmdldGN3ZCgpID09ICIvIjoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkNhbid0IGZpbmQgcm9vdCBvZiB0aGUgc291cmNlIHRyZWVcbiIpOworICAgICAgICAgICAgcHJpbnQoIlxuRkFJTEVEIikKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIG9zLmNoZGlyKCIuLiIpCisKK2RlZiBpc190ZXN0KG5hbWUsIHRoaW5nKToKKyAgICBpZiBub3QgY2FsbGFibGUodGhpbmcpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBuYW1lID09ICJ0ZXN0IjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIG5hbWUuc3RhcnRzd2l0aCgidGVzdCIpCisKKworZGVmIHRlc3Qoc2hlbGwsIGNvbW1hbmQsIGV4cGVjdGVkX3JldHVybiwgZXhwZWN0ZWRfc3Rkb3V0LCBleHBlY3RlZF9zdGRlcnIsIGV4cGVjdGVkX2Vudik6CisgICAgY29tbWFuZCArPSAiOyBfcmM9JD8iCisgICAgZm9yIGVudiBpbiBleHBlY3RlZF9lbnYua2V5cygpOgorICAgICAgICBjb21tYW5kICs9IGYiOyBlY2hvIEVOVjoge2Vudn09XFxcIiR7ZW52fVxcXCIiCisgICAgY29tbWFuZCArPSAiOyBleGl0ICRfcmMiCisKKyAgICBjbWQgPSBbc2hlbGwsICItYyIsIGNvbW1hbmRdCisgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oY21kLCBjYXB0dXJlX291dHB1dD1UcnVlLCB0ZXh0PVRydWUpCisKKyAgICBzdGF0dXMgPSBUcnVlCisKKyAgICBpZiByZXN1bHQucmV0dXJuY29kZSAhPSBleHBlY3RlZF9yZXR1cm46CisgICAgICAgIHByaW50KCkKKyAgICAgICAgcHJpbnQoZiJFeHBlY3RlZCByZXR1cm4gY29kZToge2V4cGVjdGVkX3JldHVybn0iKQorICAgICAgICBwcmludChmIkFjdHVhbCByZXR1cm4gY29kZTogICB7cmVzdWx0LnJldHVybmNvZGV9IikKKyAgICAgICAgc3RhdHVzID0gRmFsc2UKKworICAgIHByaW50ZWRfc3Rkb3V0ID0gRmFsc2UKKyAgICBpZiBleHBlY3RlZF9zdGRvdXQgYW5kIGV4cGVjdGVkX3N0ZG91dCBub3QgaW4gcmVzdWx0LnN0ZG91dDoKKyAgICAgICAgcHJpbnQoKQorICAgICAgICBwcmludChmIkV4cGVjdGVkIHN0ZG91dCB0byBjb250YWluOlxue2V4cGVjdGVkX3N0ZG91dH0iKQorICAgICAgICBwcmludChmIlxuQWN0dWFsIHN0ZG91dDpcbntyZXN1bHQuc3Rkb3V0fSIpCisgICAgICAgIHByaW50ZWRfc3Rkb3V0ID0gVHJ1ZQorICAgICAgICBzdGF0dXMgPSBGYWxzZQorCisgICAgaWYgZXhwZWN0ZWRfc3RkZXJyIGFuZCBleHBlY3RlZF9zdGRlcnIgbm90IGluIHJlc3VsdC5zdGRlcnI6CisgICAgICAgIHByaW50KCkKKyAgICAgICAgcHJpbnQoZiJFeHBlY3RlZCBzdGRlcnIgdG8gY29udGFpbjpcbntleHBlY3RlZF9zdGRlcnJ9IikKKyAgICAgICAgcHJpbnQoZiJcbkFjdHVhbCBzdGRlcnI6XG57cmVzdWx0LnN0ZGVycn0iKQorICAgICAgICBzdGF0dXMgPSBGYWxzZQorCisgICAgZW52X2ZhaWx1cmUgPSBGYWxzZQorICAgIGZvciBrLCB2IGluIGV4cGVjdGVkX2Vudi5pdGVtcygpOgorICAgICAgICBpZiBmIntrfT1cInt2fVwiIiBub3QgaW4gcmVzdWx0LnN0ZG91dDoKKyAgICAgICAgICAgIHByaW50KCkKKyAgICAgICAgICAgIHByaW50KGYiRXhwZWN0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGUge2t9IHRvIGJlOiB7dn0gLS0tIHtrfT1cInt2fVwiIikKKyAgICAgICAgICAgIGVudl9mYWlsdXJlID0gVHJ1ZQorICAgICAgICAgICAgc3RhdHVzID0gRmFsc2UKKworICAgIGlmIGVudl9mYWlsdXJlIGFuZCBub3QgcHJpbnRlZF9zdGRvdXQ6CisgICAgICAgIHByaW50KCkKKyAgICAgICAgcHJpbnQoIlNlZSBzdGRvdXQ6IikKKyAgICAgICAgcHJpbnQocmVzdWx0LnN0ZG91dCkKKworICAgIGlmIG5vdCBzdGF0dXM6CisgICAgICAgIHByaW50KCkKKyAgICAgICAgcHJpbnQoIkNvbW1hbmQgdG8gcmVwcm9kdWNlOiIpCisgICAgICAgIHByaW50KGNvbW1hbmQpCisgICAgICAgIHByaW50KCkKKworICAgIHJldHVybiBzdGF0dXMKKworTk9fTFVOQ0ggPSB7CisgICAgIlRBUkdFVF9QUk9EVUNUIjogIiIsCisgICAgIlRBUkdFVF9SRUxFQVNFIjogIiIsCisgICAgIlRBUkdFVF9CVUlMRF9WQVJJQU5UIjogIiIsCit9CisKK2RlZiB0ZXN0X2ludmFsaWRfbHVuY2hfdGFyZ2V0KHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoIGludmFsaWQtdHJ1bmtfc3RhZ2luZy1lbmciLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTEsIGV4cGVjdGVkX3N0ZG91dD1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfc3RkZXJyPSJDYW5ub3QgbG9jYXRlIGNvbmZpZyBtYWtlZmlsZSBmb3IgcHJvZHVjdCIsCisgICAgICAgICBleHBlY3RlZF9lbnY9Tk9fTFVOQ0gpCisKKworZGVmIHRlc3RfYW9zcF9hcm0oc2hlbGwpOgorICAgIHJldHVybiB0ZXN0KHNoZWxsLCBTT1VSQ0VfRU5WU0VUVVAgKyAibHVuY2ggYW9zcF9hcm0tdHJ1bmtfc3RhZ2luZy1lbmciLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTAsIGV4cGVjdGVkX3N0ZG91dD1Ob25lLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj17CisgICAgICAgICAgICAiVEFSR0VUX1BST0RVQ1QiOiAiYW9zcF9hcm0iLAorICAgICAgICAgICAgIlRBUkdFVF9SRUxFQVNFIjogInRydW5rX3N0YWdpbmciLAorICAgICAgICAgICAgIlRBUkdFVF9CVUlMRF9WQVJJQU5UIjogImVuZyIsCisgICAgICAgIH0pCisKKworZGVmIHRlc3RfbHVuY2gyX2VtcHR5KHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoMiIsCisgICAgICAgICBleHBlY3RlZF9yZXR1cm49MSwgZXhwZWN0ZWRfc3Rkb3V0PU5vbmUsCisgICAgICAgICBleHBlY3RlZF9zdGRlcnI9Ik5vIHRhcmdldCBzcGVjaWZpZWQuIFNlZSBsdW5jaCAtLWhlbHAiLAorICAgICAgICAgZXhwZWN0ZWRfZW52PU5PX0xVTkNIKQorCitkZWYgdGVzdF9sdW5jaDJfZm91cl9wYXJhbXMoc2hlbGwpOgorICAgIHJldHVybiB0ZXN0KHNoZWxsLCBTT1VSQ0VfRU5WU0VUVVAgKyAibHVuY2gyIGEgYiBjIGQiLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTEsIGV4cGVjdGVkX3N0ZG91dD1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfc3RkZXJyPSJUb28gbWFueSBwYXJhbWV0ZXJzIGdpdmVuLiBTZWUgbHVuY2ggLS1oZWxwIiwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj1OT19MVU5DSCkKKworZGVmIHRlc3RfbHVuY2gyX2Fvc3BfYXJtKHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoMiBhb3NwX2FybSIsCisgICAgICAgICBleHBlY3RlZF9yZXR1cm49MCwgZXhwZWN0ZWRfc3Rkb3V0PSI9PT09PT09PT0iLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj17CisgICAgICAgICAgICAiVEFSR0VUX1BST0RVQ1QiOiAiYW9zcF9hcm0iLAorICAgICAgICAgICAgIlRBUkdFVF9SRUxFQVNFIjogInRydW5rX3N0YWdpbmciLAorICAgICAgICAgICAgIlRBUkdFVF9CVUlMRF9WQVJJQU5UIjogImVuZyIsCisgICAgICAgIH0pCisKK2RlZiB0ZXN0X2x1bmNoMl9hb3NwX2FybV90cnVua19zdGFnaW5nKHNoZWxsKToKKyAgICAjIFNvbWV3aGF0IHVuZm9ydHVuYXRlIGJlY2F1c2UgdHJ1bmtfc3RhZ2luZyBpcyB0aGUgb25seSBjb25maWcgaW4KKyAgICAjIGFvc3Agc28gd2UgY2FuJ3QgcmVhbGx5IHRlc3QgdGhhdCB0aGlzIGlzbid0IGp1c3QgZ2V0dGluZyB0aGUgZGVmYXVsdAorICAgIHJldHVybiB0ZXN0KHNoZWxsLCBTT1VSQ0VfRU5WU0VUVVAgKyAibHVuY2gyIGFvc3BfYXJtIHRydW5rX3N0YWdpbmciLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTAsIGV4cGVjdGVkX3N0ZG91dD0iPT09PT09PT09IiwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9eworICAgICAgICAgICAgIlRBUkdFVF9QUk9EVUNUIjogImFvc3BfYXJtIiwKKyAgICAgICAgICAgICJUQVJHRVRfUkVMRUFTRSI6ICJ0cnVua19zdGFnaW5nIiwKKyAgICAgICAgICAgICJUQVJHRVRfQlVJTERfVkFSSUFOVCI6ICJlbmciLAorICAgICAgICB9KQorCitkZWYgdGVzdF9sdW5jaDJfYW9zcF9hcm1fdHJ1bmtfc3RhZ2luZ191c2VyZGVidWcoc2hlbGwpOgorICAgIHJldHVybiB0ZXN0KHNoZWxsLCBTT1VSQ0VfRU5WU0VUVVAgKyAibHVuY2gyIGFvc3BfYXJtIHRydW5rX3N0YWdpbmcgdXNlcmRlYnVnIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0wLCBleHBlY3RlZF9zdGRvdXQ9Ij09PT09PT09PSIsIGV4cGVjdGVkX3N0ZGVycj1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfZW52PXsKKyAgICAgICAgICAgICJUQVJHRVRfUFJPRFVDVCI6ICJhb3NwX2FybSIsCisgICAgICAgICAgICAiVEFSR0VUX1JFTEVBU0UiOiAidHJ1bmtfc3RhZ2luZyIsCisgICAgICAgICAgICAiVEFSR0VUX0JVSUxEX1ZBUklBTlQiOiAidXNlcmRlYnVnIiwKKyAgICAgICAgfSkKKworZGVmIHRlc3RfbGlzdF9wcm9kdWN0cyhzaGVsbCk6CisgICAgcmV0dXJuIHRlc3Qoc2hlbGwsICJidWlsZC9zb29uZy9iaW4vbGlzdF9wcm9kdWN0cyIsCisgICAgICAgICBleHBlY3RlZF9yZXR1cm49MCwgZXhwZWN0ZWRfc3Rkb3V0PSJhb3NwX2FybSIsIGV4cGVjdGVkX3N0ZGVycj1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfZW52PU5PX0xVTkNIKQorCitkZWYgdGVzdF9saXN0X3JlbGVhc2VzX3BhcmFtKHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgImJ1aWxkL3Nvb25nL2Jpbi9saXN0X3JlbGVhc2VzIGFvc3BfYXJtIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0wLCBleHBlY3RlZF9zdGRvdXQ9InRydW5rX3N0YWdpbmciLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj1OT19MVU5DSCkKKworZGVmIHRlc3RfbGlzdF9yZWxlYXNlc19lbnYoc2hlbGwpOgorICAgIHJldHVybiB0ZXN0KHNoZWxsLCAiVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm0gYnVpbGQvc29vbmcvYmluL2xpc3RfcmVsZWFzZXMiLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTAsIGV4cGVjdGVkX3N0ZG91dD0idHJ1bmtfc3RhZ2luZyIsIGV4cGVjdGVkX3N0ZGVycj1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfZW52PU5PX0xVTkNIKQorCitkZWYgdGVzdF9saXN0X3JlbGVhc2VzX25vX3Byb2R1Y3Qoc2hlbGwpOgorICAgIHJldHVybiB0ZXN0KHNoZWxsLCAiYnVpbGQvc29vbmcvYmluL2xpc3RfcmVsZWFzZXMiLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTEsIGV4cGVjdGVkX3N0ZG91dD1Ob25lLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj1OT19MVU5DSCkKKworZGVmIHRlc3RfbGlzdF92YXJpYW50cyhzaGVsbCk6CisgICAgcmV0dXJuIHRlc3Qoc2hlbGwsICJidWlsZC9zb29uZy9iaW4vbGlzdF92YXJpYW50cyIsCisgICAgICAgICBleHBlY3RlZF9yZXR1cm49MCwgZXhwZWN0ZWRfc3Rkb3V0PSJ1c2VyZGVidWciLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj1OT19MVU5DSCkKKworCitkZWYgdGVzdF9nZXRfYnVpbGRfdmFyX2luX3BhdGgoc2hlbGwpOgorICAgIHJldHVybiB0ZXN0KHNoZWxsLCBTT1VSQ0VfRU5WU0VUVVAgKyAid2hpY2ggZ2V0X2J1aWxkX3ZhciAiLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTAsIGV4cGVjdGVkX3N0ZG91dD0ic29vbmcvYmluIiwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9Tk9fTFVOQ0gpCisKKworCitURVNUUz1zb3J0ZWQoWyhuYW1lLCB0aGluZykgZm9yIG5hbWUsIHRoaW5nIGluIGxvY2FscygpLml0ZW1zKCkgaWYgaXNfdGVzdChuYW1lLCB0aGluZyldKQorCitkZWYgbWFpbigpOgorICAgIGlmIGFueShbeC5lbmRzd2l0aCgiL3Nvb25nL2JpbiIpIGZvciB4IGluIG9zLmdldGVudigiUEFUSCIpLnNwbGl0KCI6IildKToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgicnVuX2VudnNldHVwX3Rlc3RzIG11c3QgYmUgcnVuIGluIGEgc2hlbGwgdGhhdCBoYXMgbm90IHNvdXJjZWQiCisgICAgICAgICAgICAgICAgKyAiIGVudnNldHVwLnNoXG5cbkZBSUxFRFxuIikKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGdvX3RvX3Jvb3QoKQorCisgICAgdGVzdHMgPSBURVNUUworICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgorICAgICAgICB0ZXN0cyA9IFsobmFtZSwgZnVuYykgZm9yIG5hbWUsIGZ1bmMgaW4gdGVzdHMgaWYgbmFtZSBpbiBzeXMuYXJndl0KKworICAgIHNoZWxscyA9IFsiL3Vzci9iaW4vYmFzaCIsICIvdXNyL2Jpbi96c2giXQorICAgIHRvdGFsX2NvdW50ID0gbGVuKHRlc3RzKSAqIGxlbihzaGVsbHMpCisgICAgaW5kZXggPSAxCisgICAgZmFpbGVkX3Rlc3RzID0gMAorCisgICAgZm9yIG5hbWUsIGZ1bmMgaW4gdGVzdHM6CisgICAgICAgIGZvciBzaGVsbCBpbiBzaGVsbHM6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGYiXDMzWzJLXHJ7aW5kZXh9IG9mIHt0b3RhbF9jb3VudH06IHtuYW1lfSBpbiB7c2hlbGx9IikKKyAgICAgICAgICAgIHBhc3NlZCA9IGZ1bmMoc2hlbGwpCisgICAgICAgICAgICBpZiBub3QgcGFzc2VkOgorICAgICAgICAgICAgICAgIGZhaWxlZF90ZXN0cyArPSAxCisgICAgICAgICAgICBpbmRleCArPSAxCisKKyAgICBpZiBmYWlsZWRfdGVzdHMgPiAwOgorICAgICAgICBwcmludChmIlxuXG5GQUlMRUQ6IHtmYWlsZWRfdGVzdHN9IG9mIHt0b3RhbF9jb3VudH0iKQorICAgICAgICByZXR1cm4gMQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCJcblxuU1VDQ0VTUyIpCisgICAgICAgIHJldHVybiAwCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZW52c2V0dXAvc3BhbV9mb3JfbHVuY2ggYi90b29scy9lbnZzZXR1cC9zcGFtX2Zvcl9sdW5jaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZTE1MGE2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZW52c2V0dXAvc3BhbV9mb3JfbHVuY2gKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL2Jhc2gKKworIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgYWQgaXMga2luZCBvZiBiaWcsIHNvIG9ubHkgc2hvdyBpdCBpZiB0aGlzIGFwcGVhcnMgdG8gYmUgYSBjbGVhbiBidWlsZC4KK3NvdXJjZSAkKGNkICQoZGlybmFtZSAkQkFTSF9TT1VSQ0UpICY+IC9kZXYvbnVsbCAmJiBwd2QpLy4uLy4uL3NoZWxsX3V0aWxzLnNoCitpZiBbWyAhIC1lICQoZ2V0b3V0ZGlyKS9zb29uZy9idWlsZC4ke1RBUkdFVF9QUk9EVUNUfS5uaW5qYSBdXTsgdGhlbgorICBlY2hvCisgIGVjaG8gIn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4iCisgIGVjaG8gIiAgV29uZGVyaW5nIHdoZXRoZXIgdG8gdXNlIHVzZXIsIHVzZXJkZWJ1ZyBvciBlbmc/IgorICBlY2hvCisgIGVjaG8gIiAgdXNlciAgICAgICAgVGhlIGJ1aWxkcyB0aGF0IHNoaXAgdG8gdXNlcnMuIFJlZHVjZWQgZGVidWdhYmlsaXR5LiIKKyAgZWNobyAiICB1c2VyZGVidWcgICBIaWdoIGZpZGVsaXR5IHRvIHVzZXIgYnVpbGRzIGJ1dCB3aXRoIHNvbWUgZGVidWdnaW5nIG9wdGlvbnMiCisgIGVjaG8gIiAgICAgICAgICAgICAgZW5hYmxlZC4gQmVzdCBzdWl0ZWQgZm9yIHBlcmZvcm1hbmNlIHRlc3Rpbmcgb3IgZGF5LXRvLWRheSB1c2UiCisgIGVjaG8gIiAgICAgICAgICAgICAgd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZC4iCisgIGVjaG8gIiAgZW5nICAgICAgICAgTW9yZSBkZWJ1Z2dpbmcgb3B0aW9ucyBlbmFibGVkIGFuZCBmYXN0ZXIgYnVpbGQgdGltZXMsIGJ1dCIKKyAgZWNobyAiICAgICAgICAgICAgICBydW50aW1lIHBlcmZvcm1hbmNlIHRyYWRlb2Zmcy4gQmVzdCBzdWl0ZWQgZm9yIGRheS10by1kYXkiCisgIGVjaG8gIiAgICAgICAgICAgICAgbG9jYWwgZGV2ZWxvcG1lbnQgd2hlbiBub3QgZG9pbmcgcGVyZm9ybWFuY2UgdGVzdGluZy4iCisgIGVjaG8gIn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4iCisgIGVjaG8KK2ZpCisKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9BbmRyb2lkLmJwIGIvdG9vbHMvZmlsZWxpc3RkaWZmL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI3NjZkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImZpbGVfbGlzdF9kaWZmIiwKKyAgICBzcmNzOiBbImZpbGVfbGlzdF9kaWZmLnB5Il0sCit9CisKK3ByZWJ1aWx0X2V0Y19ob3N0IHsKKyAgICBuYW1lOiAic3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0IiwKKyAgICBzcmM6ICJhbGxvd2xpc3QiLAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9hbGxvd2xpc3QgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzEyYTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0CkBAIC0wLDAgKzEsOTkgQEAKKyMgS25vd24gZGlmZnMgb25seSBpbiB0aGUgS0FUSSBzeXN0ZW0gaW1hZ2UKK2V0Yy9OT1RJQ0UueG1sLmd6CitldGMvY29tcGF0Y29uZmlnL1RlbGVTZXJ2aWNlLXBsYXRmb3JtLWNvbXBhdC1jb25maWcueG1sCitldGMvY29tcGF0Y29uZmlnL2NhbGVuZGFyLXByb3ZpZGVyLWNvbXBhdC1jb25maWcueG1sCitldGMvY29tcGF0Y29uZmlnL2NvbnRhY3RzLXByb3ZpZGVyLXBsYXRmb3JtLWNvbXBhdC1jb25maWcueG1sCitldGMvY29tcGF0Y29uZmlnL2RvY3VtZW50cy11aS1jb21wYXQtY29uZmlnLnhtbAorZXRjL2NvbXBhdGNvbmZpZy9mcmFtZXdvcmstbG9jYXRpb24tY29tcGF0LWNvbmZpZy54bWwKK2V0Yy9jb21wYXRjb25maWcvZnJhbWV3b3JrLXBsYXRmb3JtLWNvbXBhdC1jb25maWcueG1sCitldGMvY29tcGF0Y29uZmlnL2ljdTRqLXBsYXRmb3JtLWNvbXBhdC1jb25maWcueG1sCitldGMvY29tcGF0Y29uZmlnL3NlcnZpY2VzLXBsYXRmb3JtLWNvbXBhdC1jb25maWcueG1sCitldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS5jcmVkZW50aWFscy54bWwKK2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLnNvZnR3YXJlLnByZXZpZXdfc2RrLnhtbAorZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuc29mdHdhcmUud2Vidmlldy54bWwKK2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLnNvZnR3YXJlLndpbmRvd19tYWduaWZpY2F0aW9uLnhtbAorZXRjL3Blcm1pc3Npb25zL2NvbS5hbmRyb2lkLmFkc2VydmljZXMuc2Rrc2FuZGJveC54bWwKK2V0Yy9zZWN1cml0eS9vdGFjZXJ0cy56aXAKK2V0Yy92aW50Zi9jb21wYXRpYmlsaXR5X21hdHJpeC4yMDI0MDQueG1sCitldGMvdmludGYvY29tcGF0aWJpbGl0eV9tYXRyaXguMjAyNTA0LnhtbAorZXRjL3ZpbnRmL2NvbXBhdGliaWxpdHlfbWF0cml4LjUueG1sCitldGMvdmludGYvY29tcGF0aWJpbGl0eV9tYXRyaXguNi54bWwKK2V0Yy92aW50Zi9jb21wYXRpYmlsaXR5X21hdHJpeC43LnhtbAorZXRjL3ZpbnRmL2NvbXBhdGliaWxpdHlfbWF0cml4LjgueG1sCitldGMvdmludGYvY29tcGF0aWJpbGl0eV9tYXRyaXguZGV2aWNlLnhtbAorZXRjL3ZpbnRmL21hbmlmZXN0LnhtbAorZnJhbWV3b3JrL2Jvb3QtYXBhY2hlLXhtbC52ZGV4CitmcmFtZXdvcmsvYm9vdC1hcGFjaGUteG1sLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LWJvdW5jeWNhc3RsZS52ZGV4CitmcmFtZXdvcmsvYm9vdC1ib3VuY3ljYXN0bGUudmRleC5mc3ZfbWV0YQorZnJhbWV3b3JrL2Jvb3QtY29yZS1pY3U0ai52ZGV4CitmcmFtZXdvcmsvYm9vdC1jb3JlLWljdTRqLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LWNvcmUtbGliYXJ0LnZkZXgKK2ZyYW1ld29yay9ib290LWNvcmUtbGliYXJ0LnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LWV4dC52ZGV4CitmcmFtZXdvcmsvYm9vdC1leHQudmRleC5mc3ZfbWV0YQorZnJhbWV3b3JrL2Jvb3QtZnJhbWV3b3JrLWFkc2VydmljZXMudmRleAorZnJhbWV3b3JrL2Jvb3QtZnJhbWV3b3JrLWFkc2VydmljZXMudmRleC5mc3ZfbWV0YQorZnJhbWV3b3JrL2Jvb3QtZnJhbWV3b3JrLWdyYXBoaWNzLnZkZXgKK2ZyYW1ld29yay9ib290LWZyYW1ld29yay1ncmFwaGljcy52ZGV4LmZzdl9tZXRhCitmcmFtZXdvcmsvYm9vdC1mcmFtZXdvcmstbG9jYXRpb24udmRleAorZnJhbWV3b3JrL2Jvb3QtZnJhbWV3b3JrLWxvY2F0aW9uLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LWZyYW1ld29yay52ZGV4CitmcmFtZXdvcmsvYm9vdC1mcmFtZXdvcmsudmRleC5mc3ZfbWV0YQorZnJhbWV3b3JrL2Jvb3QtaW1zLWNvbW1vbi52ZGV4CitmcmFtZXdvcmsvYm9vdC1pbXMtY29tbW9uLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LW9raHR0cC52ZGV4CitmcmFtZXdvcmsvYm9vdC1va2h0dHAudmRleC5mc3ZfbWV0YQorZnJhbWV3b3JrL2Jvb3QtdGVsZXBob255LWNvbW1vbi52ZGV4CitmcmFtZXdvcmsvYm9vdC10ZWxlcGhvbnktY29tbW9uLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LXZvaXAtY29tbW9uLnZkZXgKK2ZyYW1ld29yay9ib290LXZvaXAtY29tbW9uLnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9ib290LnZkZXgKK2ZyYW1ld29yay9ib290LnZkZXguZnN2X21ldGEKK2ZyYW1ld29yay9vYXQveDg2XzY0L2FwZXhAY29tLmFuZHJvaWQuY29tcG9zQGphdmFsaWJAc2VydmljZS1jb21wb3MuamFyQGNsYXNzZXMub2RleAorZnJhbWV3b3JrL29hdC94ODZfNjQvYXBleEBjb20uYW5kcm9pZC5jb21wb3NAamF2YWxpYkBzZXJ2aWNlLWNvbXBvcy5qYXJAY2xhc3Nlcy5vZGV4LmZzdl9tZXRhCitmcmFtZXdvcmsvb2F0L3g4Nl82NC9hcGV4QGNvbS5hbmRyb2lkLmNvbXBvc0BqYXZhbGliQHNlcnZpY2UtY29tcG9zLmphckBjbGFzc2VzLnZkZXgKK2ZyYW1ld29yay9vYXQveDg2XzY0L2FwZXhAY29tLmFuZHJvaWQuY29tcG9zQGphdmFsaWJAc2VydmljZS1jb21wb3MuamFyQGNsYXNzZXMudmRleC5mc3ZfbWV0YQorbGliL2FhdWRpby1haWRsLWNwcC5zbworbGliL2FuZHJvaWQuaGFyZHdhcmUuYmlvbWV0cmljcy5maW5nZXJwcmludEAyLjEuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvLmNvbmZpZ0AxLjAuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvLmRlcHJlY2F0ZWRAMS4wLnNvCitsaWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjAuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuMS5zbworbGliL2FuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4yLnNvCitsaWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjMuc28KK2xpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuNC5zbworbGliL2FuZHJvaWQuaGFyZHdhcmUuc2VjdXJlX2VsZW1lbnRAMS4wLnNvCitsaWIvY29tLmFuZHJvaWQubWVkaWEuYWF1ZGlvLWFjb25maWctY2Muc28KK2xpYi9oZWFwcHJvZmRfY2xpZW50LnNvCitsaWIvaGVhcHByb2ZkX2NsaWVudF9hcGkuc28KK2xpYi9saWJhYXVkaW8uc28KK2xpYi9saWJhYXVkaW9faW50ZXJuYWwuc28KK2xpYi9saWJhbGFybV9qbmkuc28KK2xpYi9saWJhbWlkaS5zbworbGliL2xpYmN1cHMuc28KK2xpYi9saWJqbmlfZGV2aWNlQXNXZWJjYW0uc28KK2xpYi9saWJwcmludHNwb29sZXJfam5pLnNvCitsaWIvbGlidmVuZG9yc3VwcG9ydC5zbworbGliL2xpYndmZHMuc28KK2xpYi9saWJ5dXYuc28KKworIyBiLzM1MTI1ODQ2MQorYWRiX2tleXMKK2luaXQuZW52aXJvbi5yYworCisjIEtub3duIGRpZmZzIG9ubHkgaW4gdGhlIFNvb25nIHN5c3RlbSBpbWFnZQorbGliL2xpYmhpZGNvbW1hbmRfam5pLnNvCitsaWIvbGlidWlucHV0Y29tbWFuZF9qbmkuc28KKworIyBLbm93biBkaWZmcyBpbiBpbnRlcm5hbCBzb3VyY2UKK2Jpbi91cHJvYmVzdGF0cworZXRjL2Fjb25maWcvZmxhZy5tYXAKK2V0Yy9hY29uZmlnL2ZsYWcudmFsCitldGMvYWNvbmZpZy9wYWNrYWdlLm1hcAorZXRjL2JwZi91cHJvYmVzdGF0cy9CaXRtYXBBbGxvY2F0aW9uLm8KK2V0Yy9icGYvdXByb2Jlc3RhdHMvR2VuZXJpY0luc3RydW1lbnRhdGlvbi5vCitldGMvaW5pdC9VcHJvYmVTdGF0cy5yYworbGliL2xpYnVwcm9iZXN0YXRzX2NsaWVudC5zbworbGliNjQvbGlidXByb2Jlc3RhdHNfY2xpZW50LnNvCitwcml2LWFwcC9EZXZpY2VEaWFnbm9zdGljcy9EZXZpY2VEaWFnbm9zdGljcy5hcGsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9maWxlbGlzdGRpZmYvZmlsZV9saXN0X2RpZmYucHkgYi90b29scy9maWxlbGlzdGRpZmYvZmlsZV9saXN0X2RpZmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjNWIyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9maWxlX2xpc3RfZGlmZi5weQpAQCAtMCwwICsxLDY2IEBACisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBzeXMKKworQ09MT1JfV0FSTklORyA9ICdcMDMzWzkzbScKK0NPTE9SX0VSUk9SID0gJ1wwMzNbOTFtJworQ09MT1JfTk9STUFMID0gJ1wwMzNbMG0nCisKK2RlZiBmaW5kX3VuaXF1ZV9pdGVtcyhrYXRpX2luc3RhbGxlZF9maWxlcywgc29vbmdfaW5zdGFsbGVkX2ZpbGVzLCBhbGxvd2xpc3QsIHN5c3RlbV9tb2R1bGVfbmFtZSk6CisgICAgd2l0aCBvcGVuKGthdGlfaW5zdGFsbGVkX2ZpbGVzLCAncicpIGFzIGthdGlfbGlzdF9maWxlLCBcCisgICAgICAgICAgICBvcGVuKHNvb25nX2luc3RhbGxlZF9maWxlcywgJ3InKSBhcyBzb29uZ19saXN0X2ZpbGUsIFwKKyAgICAgICAgICAgIG9wZW4oYWxsb3dsaXN0LCAncicpIGFzIGFsbG93bGlzdF9maWxlOgorICAgICAgICBrYXRpX2ZpbGVzID0gc2V0KGthdGlfbGlzdF9maWxlLnJlYWQoKS5zcGxpdCgpKQorICAgICAgICBzb29uZ19maWxlcyA9IHNldChzb29uZ19saXN0X2ZpbGUucmVhZCgpLnNwbGl0KCkpCisgICAgICAgIGFsbG93ZWRfZmlsZXMgPSBzZXQoZmlsdGVyKGxhbWJkYSB4OiBsZW4oeCksIG1hcChsYW1iZGEgeDogeC5sc3RyaXAoKS5zcGxpdCgnIycsMSlbMF0ucnN0cmlwKCkgLCBhbGxvd2xpc3RfZmlsZS5yZWFkKCkuc3BsaXQoJ1xuJykpKSkKKworICAgIGRlZiBpc191bmtub3duX2RpZmYoZmlsZXBhdGgpOgorICAgICAgICByZXR1cm4gbm90IGZpbGVwYXRoIGluIGFsbG93ZWRfZmlsZXMKKworICAgIHVuaXF1ZV9pbl9rYXRpID0gc2V0KGZpbHRlcihpc191bmtub3duX2RpZmYsIGthdGlfZmlsZXMgLSBzb29uZ19maWxlcykpCisgICAgdW5pcXVlX2luX3Nvb25nID0gc2V0KGZpbHRlcihpc191bmtub3duX2RpZmYsIHNvb25nX2ZpbGVzIC0ga2F0aV9maWxlcykpCisKKyAgICBpZiB1bmlxdWVfaW5fa2F0aToKKyAgICAgICAgcHJpbnQoZid7Q09MT1JfRVJST1J9UGxlYXNlIGFkZCBmb2xsb3dpbmcgbW9kdWxlcyBpbnRvIHN5c3RlbSBpbWFnZSBtb2R1bGUge3N5c3RlbV9tb2R1bGVfbmFtZX0ue0NPTE9SX05PUk1BTH0nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfUtBVEkgb25seSBtb2R1bGUocyk6e0NPTE9SX05PUk1BTH0nKQorICAgICAgICBmb3IgaXRlbSBpbiBzb3J0ZWQodW5pcXVlX2luX2thdGkpOgorICAgICAgICAgICAgcHJpbnQoaXRlbSkKKworICAgIGlmIHVuaXF1ZV9pbl9zb29uZzoKKyAgICAgICAgaWYgdW5pcXVlX2luX2thdGk6CisgICAgICAgICAgICBwcmludCgnJykKKworICAgICAgICBwcmludChmJ3tDT0xPUl9FUlJPUn1QbGVhc2UgYWRkIGZvbGxvd2luZyBtb2R1bGVzIGludG8gYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbS5tay57Q09MT1JfTk9STUFMfScpCisgICAgICAgIHByaW50KGYne0NPTE9SX1dBUk5JTkd9U29vbmcgb25seSBtb2R1bGUocyk6e0NPTE9SX05PUk1BTH0nKQorICAgICAgICBmb3IgaXRlbSBpbiBzb3J0ZWQodW5pcXVlX2luX3Nvb25nKToKKyAgICAgICAgICAgIHByaW50KGl0ZW0pCisKKyAgICBpZiB1bmlxdWVfaW5fa2F0aSBvciB1bmlxdWVfaW5fc29vbmc6CisgICAgICAgIHByaW50KCcnKQorICAgICAgICBwcmludChmJ3tDT0xPUl9FUlJPUn1GQUlMRUQ6IFN5c3RlbSBpbWFnZSBmcm9tIEtBVEkgYW5kIFNPT05HIGRpZmZlcnMgZnJvbSBpbnN0YWxsZWQgZmlsZSBsaXN0LntDT0xPUl9OT1JNQUx9JykKKyAgICAgICAgc3lzLmV4aXQoMSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2thdGlfaW5zdGFsbGVkX2ZpbGVfbGlzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnc29vbmdfaW5zdGFsbGVkX2ZpbGVfbGlzdCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnYWxsb3dsaXN0JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdzeXN0ZW1fbW9kdWxlX25hbWUnKQorICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBmaW5kX3VuaXF1ZV9pdGVtcyhhcmdzLmthdGlfaW5zdGFsbGVkX2ZpbGVfbGlzdCwgYXJncy5zb29uZ19pbnN0YWxsZWRfZmlsZV9saXN0LCBhcmdzLmFsbG93bGlzdCwgYXJncy5zeXN0ZW1fbW9kdWxlX25hbWUpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL09XTkVSUyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9PV05FUlMKaW5kZXggNTE4YjYwZC4uYjAwYjc3NCAxMDA2NDQKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL09XTkVSUworKysgYi90b29scy9maW5hbGl6YXRpb24vT1dORVJTCkBAIC0xLDUgKzEsNyBAQAogaW5jbHVkZSBwbGF0Zm9ybS9idWlsZC9zb29uZzovT1dORVJTCi1zbW9yZWxhbmRAZ29vZ2xlLmNvbQotYWxleGJ1eUBnb29nbGUuY29tCithbWhrQGdvb2dsZS5jb20KK2d1cnByZWV0Z3NAZ29vZ2xlLmNvbQorbWljaGFlbHdyQGdvb2dsZS5jb20KIHBhdGJAZ29vZ2xlLmNvbQorc21vcmVsYW5kQGdvb2dsZS5jb20KIHp5eUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vUkVBRE1FLm1kIGIvdG9vbHMvZmluYWxpemF0aW9uL1JFQURNRS5tZAppbmRleCA1MDFmMjYwLi41ZTJhZWNkIDEwMDY0NAotLS0gYS90b29scy9maW5hbGl6YXRpb24vUkVBRE1FLm1kCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9SRUFETUUubWQKQEAgLTMsMjAgKzMsMjQgQEAKIAogIyMgQXV0b21hdGlvbjoKIDEuIFtFbnZpcm9ubWVudCBzZXR1cF0oLi9lbnZpcm9ubWVudC5zaCkuIFNldCB2YWx1ZXMgZm9yIHZhcmlvcyBmaW5hbGl6YXRpb24gY29uc3RhbnRzLgotMi4gW0ZpbmFsaXplIFNES10oLi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaCkuIFByZXBhcmUgdGhlIGJyYW5jaCBmb3IgU0RLIHJlbGVhc2UuIFNESyBjb250YWlucyBBbmRyb2lkIEphdmEgQVBJcyBhbmQgb3RoZXIgc3RhYmxlIEFQSXMuIENvbW1vbmx5IHJlZmVycmVkIGFzIGEgMXN0IHN0ZXAuCi0zLiBbRmluYWxpemUgQW5kcm9pZF0oLi9maW5hbGl6ZS1zZGstcmVsLnNoKS4gTWFyayBicmFuY2ggYXMgIlJFTCIsIGkuZS4gcHJlcGFyZXMgZm9yIEFuZHJvaWQgcmVsZWFzZS4gQW55IHNpZ25lZCBidWlsZCBjb250YWluaW5nIHRoZXNlIGNoYW5nZXMgd2lsbCBiZSBjb25zaWRlcmVkIGFuIG9mZmljaWFsIEFuZHJvaWQgUmVsZWFzZS4gUmVmZXJyZWQgYXMgYSAybmQgZmluYWxpemF0aW9uIHN0ZXAuCi00LiBbRmluYWxpemUgU0RLIGFuZCBzdWJtaXRdKC4vc3RlcC0xLnNoKS4gRG8gW0ZpbmFsaXplIFNES10oLi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaCkgc3RlcCwgY3JlYXRlIENMcywgb3JnYW5pemUgdGhlbSBpbnRvIHRvcGljIGFuZCBzZW5kIHRvIEdlcnJpdC4KLSAgYS4gW1VwZGF0ZSBTREsgYW5kIHN1Ym1pdF0oLi91cGRhdGUtc3RlcC0xLnNoKS4gU2FtZSBhcyBhYm92ZSwgYnV0IHVwZGF0ZXMgdGhlIGV4aXN0aW5ncyBDTHMuCi01LiBbRmluYWxpemUgQW5kcm9pZCBhbmQgc3VibWl0XSguL3N0ZXAtMi5zaCkuIERvIFtGaW5hbGl6ZSBBbmRyb2lkXSguL2ZpbmFsaXplLXNkay1yZWwuc2gpIHN0ZXAsIGNyZWF0ZSAgQ0xzLCBvcmdhbml6ZSB0aGVtIGludG8gdG9waWMgYW5kIHNlbmQgdG8gR2Vycml0LgotICBhLiBbVXBkYXRlIEFuZHJvaWQgYW5kIHN1Ym1pdF0oLi91cGRhdGUtc3RlcC0yLnNoKS4gU2FtZSBhcyBhYm92ZSwgYnV0IHVwZGF0ZXMgdGhlIGV4aXN0aW5ncyBDTHMuCisxLiBbRmluYWxpemUgVklOVEZdKC4vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoKS4gUHJlcGFyZSB0aGUgYnJhbmNoIGZvciBWSU5URiByZWxlYXNlLgorMS4gW0ZpbmFsaXplIFNES10oLi9maW5hbGl6ZS1zZGstcmVzb3VyY2VzLnNoKS4gUHJlcGFyZSB0aGUgYnJhbmNoIGZvciBTREsgcmVsZWFzZS4gU0RLIGNvbnRhaW5zIEFuZHJvaWQgSmF2YSBBUElzIGFuZCBvdGhlciBzdGFibGUgQVBJcy4gQ29tbW9ubHkgcmVmZXJyZWQgYXMgYSAxc3Qgc3RlcC4KKzEuIFtGaW5hbGl6ZSBBbmRyb2lkXSguL2ZpbmFsaXplLXNkay1yZWwuc2gpLiBNYXJrIGJyYW5jaCBhcyAiUkVMIiwgaS5lLiBwcmVwYXJlcyBmb3IgQW5kcm9pZCByZWxlYXNlLiBBbnkgc2lnbmVkIGJ1aWxkIGNvbnRhaW5pbmcgdGhlc2UgY2hhbmdlcyB3aWxsIGJlIGNvbnNpZGVyZWQgYW4gb2ZmaWNpYWwgQW5kcm9pZCBSZWxlYXNlLiBSZWZlcnJlZCBhcyBhIDJuZCBmaW5hbGl6YXRpb24gc3RlcC4KKzEuIFtGaW5hbGl6ZSBWSU5URiBhbmQgc3VibWl0XSguL3N0ZXAtMC5zaCkuIERvIEZpbmFsaXplIFZJTlRGIHN0ZXAsIGNyZWF0ZSBDTHMsIG9yZ2FuaXplIHRoZW0gaW50byB0b3BpYyBhbmQgc2VuZCB0byBHZXJyaXQuCisxLiBbRmluYWxpemUgU0RLIGFuZCBzdWJtaXRdKC4vc3RlcC0xLnNoKS4gRG8gRmluYWxpemUgU0RLIHN0ZXAsIGNyZWF0ZSBDTHMsIG9yZ2FuaXplIHRoZW0gaW50byB0b3BpYyBhbmQgc2VuZCB0byBHZXJyaXQuCisxLiBbRmluYWxpemUgQW5kcm9pZCBhbmQgc3VibWl0XSguL3N0ZXAtMi5zaCkuIERvIFtGaW5hbGl6ZSBBbmRyb2lkXSguL2ZpbmFsaXplLXNkay1yZWwuc2gpIHN0ZXAsIGNyZWF0ZSAgQ0xzLCBvcmdhbml6ZSB0aGVtIGludG8gdG9waWMgYW5kIHNlbmQgdG8gR2Vycml0LgogCiAjIyBDSToKIFBlcmZvcm1lZCBpbiBidWlsZCB0YXJnZXRzIGluIEZpbmFsaXphdGlvbiBicmFuY2hlcy4KLTEuIFtGaW5hbGl6YXRpb24gU3RlcCAxIGZvciBNYWluLCBnaXRfbWFpbi1maW5hLTEtcmVsZWFzZV0oaHR0cHM6Ly9hbmRyb2lkLWJ1aWxkLmdvb2dsZXBsZXguY29tL2J1aWxkcy9icmFuY2hlcy9naXRfbWFpbi1maW5hLTEtcmVsZWFzZS9ncmlkKS4gVGVzdCBbMXN0IHN0ZXAvRmluYWxpemUgU0RLXSguL2ZpbmFsaXplLWFpZGwtdm5kay1zZGstcmVzb3VyY2VzLnNoKS4KLTIuIFtGaW5hbGl6YXRpb24gU3RlcCAxIGZvciBVREMsIGdpdF91ZGMtZmluYS0xLXJlbGVhc2VdKGh0dHBzOi8vYW5kcm9pZC1idWlsZC5nb29nbGVwbGV4LmNvbS9idWlsZHMvYnJhbmNoZXMvZ2l0X3VkYy1maW5hLTEtcmVsZWFzZS9ncmlkKS4gU2FtZSBidXQgZm9yIHVkYy1kZXYuCi0zLiBbRmluYWxpemF0aW9uIFN0ZXAgMiBmb3IgTWFpbiwgZ2l0X21haW4tZmluYS0yLXJlbGVhc2VdKGh0dHBzOi8vYW5kcm9pZC1idWlsZC5nb29nbGVwbGV4LmNvbS9idWlsZHMvYnJhbmNoZXMvZ2l0X21haW4tZmluYS0yLXJlbGVhc2UvZ3JpZCkuIFRlc3QgWzFzdCBzdGVwL0ZpbmFsaXplIFNES10oLi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaCkgYW5kIFsybmQgc3RlcC9GaW5hbGl6ZSBBbmRyb2lkXSguL2ZpbmFsaXplLXNkay1yZWwuc2gpLiBVc2UgW2xvY2FsIGZpbmFsaXphdGlvbl0oLi9sb2NhbG9ubHktc3RlcHMuc2gpIHRvIGJ1aWxkIGFuZCBjb3B5IHByZXN1Ym1pdHMuCi00LiBbRmluYWxpemF0aW9uIFN0ZXAgMiBmb3IgVURDLCBnaXRfdWRjLWZpbmEtMi1yZWxlYXNlXShodHRwczovL2FuZHJvaWQtYnVpbGQuZ29vZ2xlcGxleC5jb20vYnVpbGRzL2JyYW5jaGVzL2dpdF91ZGMtZmluYS0yLXJlbGVhc2UvZ3JpZCkuIFNhbWUgYnV0IGZvciB1ZGMtZGV2LgotNS4gW0xvY2FsIGZpbmFsaXphdGlvbiBzdGVwc10oLi9sb2NhbG9ubHktc3RlcHMuc2gpIGFyZSBkb25lIG9ubHkgZHVyaW5nIGxvY2FsIHRlc3Rpbmcgb3IgaW4gdGhlIENJIGxhYi4gTm9ybWFsbHkgdGhlc2Ugc3RlcHMgdXNlIGFydGlmYWN0cyBmcm9tIG90aGVyIGJ1aWxkcy4KKzEuIFtGaW5hbGl6YXRpb24gU3RlcCAwLCBnaXRfbWFpbi1maW5hLTAtcmVsZWFzZV0oaHR0cHM6Ly9hbmRyb2lkLWJ1aWxkLmNvcnAuZ29vZ2xlLmNvbS9idWlsZF9leHBsb3Jlci9icmFuY2gvZ2l0X21haW4tZmluYS0wLXJlbGVhc2UpLiBUZXN0IEZpbmFsaXplIFZJTlRGLgorMS4gW0ZpbmFsaXphdGlvbiBTdGVwIDEsIGdpdF9tYWluLWZpbmEtMS1yZWxlYXNlXShodHRwczovL2FuZHJvaWQtYnVpbGQuY29ycC5nb29nbGUuY29tL2J1aWxkX2V4cGxvcmVyL2JyYW5jaC9naXRfbWFpbi1maW5hLTEtcmVsZWFzZSkuIFRlc3QgRmluYWxpemUgVklOVEYsIEZpbmFsaXplIFNESy4KKzEuIFtGaW5hbGl6YXRpb24gU3RlcCAyLCBnaXRfbWFpbi1maW5hLTItcmVsZWFzZV0oaHR0cHM6Ly9hbmRyb2lkLWJ1aWxkLmNvcnAuZ29vZ2xlLmNvbS9idWlsZF9leHBsb3Jlci9icmFuY2gvZ2l0X21haW4tZmluYS0yLXJlbGVhc2UpLiBUZXN0IEZpbmFsaXplIFZJTlRGLCBGaW5hbGl6ZSBTREssIGFuZCBbMm5kIHN0ZXAvRmluYWxpemUgQW5kcm9pZF0oLi9maW5hbGl6ZS1zZGstcmVsLnNoKS4gVXNlIFtsb2NhbCBmaW5hbGl6YXRpb25dKC4vbG9jYWxvbmx5LXN0ZXBzLnNoKSB0byBidWlsZCBhbmQgY29weSBwcmVzdWJtaXRzLgorMS4gW0xvY2FsIGZpbmFsaXphdGlvbiBzdGVwc10oLi9sb2NhbG9ubHktc3RlcHMuc2gpIGFyZSBkb25lIG9ubHkgZHVyaW5nIGxvY2FsIHRlc3Rpbmcgb3IgaW4gdGhlIENJIGxhYi4gTm9ybWFsbHkgdGhlc2Ugc3RlcHMgdXNlIGFydGlmYWN0cyBmcm9tIG90aGVyIGJ1aWxkcy4KIAogIyMgVXRpbGl0eToKIFtGdWxsIGNsZWFudXBdKC4vY2xlYW51cC5zaCkuIFJlbW92ZSBhbGwgbG9jYWwgY2hhbmdlcyBhbmQgc3dpdGNoIGVhY2ggcHJvamVjdCBpbnRvIGhlYWQtbGVzcyBzdGF0ZS4gVGhpcyBpcyB0aGUgYmVzdCBzdGF0ZSB0byBzeW5jL3JlYmFzZS9maW5hbGl6ZSB0aGUgYnJhbmNoLgorCisjIyBEcnkgcnVuOgorW0Z1bGwgY2xlYW51cF0oLi9kcnlydW4tY2xlYW51cC5zaCkuIFJlbW92ZSBhbGwgbG9jYWwgY2hhbmdlcyBhbmQgc3dpdGNoIGVhY2ggcHJvamVjdCBpbnRvIGhlYWQtbGVzcyBzdGF0ZS4gQWxzbyByZW1vdmVzICJEcnlSdW4iIGJyYW5jaGVzLgorW1NES10oLi9kcnlydW4tc3RlcC0xLnNoKS4gUGVyZm9ybSBTREsgZmluYWxpemF0aW9uIGFuZCB1cGxvYWQgdGhlIENMcyB0byBHZXJyaXQuCitbU0RLIGFuZCBSRUxdKC4vZHJ5cnVuLXN0ZXAtMS1hbmQtMi5zaCkuIFBlcmZvcm0gU0RLIGZpbmFsaXphdGlvbiwgcGx1cyBhbGwgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gc3dpdGNoIGNvbmZpZ3VyYXRpb24gdG8gUkVMLCBhbmQgdXBsb2FkIHRoZSBDTHMgdG8gR2Vycml0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAuc2ggYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0wLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4MWI3MjAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0wLnNoCkBAIC0wLDAgKzEsMTcgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK3NldCAtZXgKKworZnVuY3Rpb24gZmluYWxpemVfbWFpbl9zdGVwMCgpIHsKKyAgICBsb2NhbCB0b3A9IiQoZGlybmFtZSAiJDAiKSIvLi4vLi4vLi4vLi4KKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAorCisgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSA7IHRoZW4KKyAgICAgICAgIyBWSU5URiBmaW5hbGl6YXRpb24KKyAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCisgICAgZmk7Cit9CisKK2ZpbmFsaXplX21haW5fc3RlcDAKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS1hbmQtMi5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEtYW5kLTIuc2gKaW5kZXggODRlMjc4Mi4uY2EyMjY3OCAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS1hbmQtMi5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0xLWFuZC0yLnNoCkBAIC03LDExICs3LDE2IEBACiAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKIAogICAgIGlmIFsgIiRGSU5BTF9TVEFURSIgPSAidW5maW5hbGl6ZWQiIF0gOyB0aGVuCi0gICAgICAgICMgU0RLIGNvZGVuYW1lIC0+IGludAotICAgICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaAorICAgICAgICAjIFZJTlRGIGZpbmFsaXphdGlvbgorICAgICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS12aW50Zi1yZXNvdXJjZXMuc2gKICAgICBmaTsKIAotICAgIGlmIFsgIiRGSU5BTF9TVEFURSIgPSAidW5maW5hbGl6ZWQiIF0gfHwgWyAiJEZJTkFMX1NUQVRFIiA9ICJzZGsiIF0gOyB0aGVuCisgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSB8fCBbICIkRklOQUxfU1RBVEUiID0gInZpbnRmIiBdIDsgdGhlbgorICAgICAgICAjIFNESyBjb2RlbmFtZSAtPiBpbnQKKyAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaAorICAgIGZpOworCisgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSB8fCBbICIkRklOQUxfU1RBVEUiID0gInZpbnRmIiBdIHx8IFsgIiRGSU5BTF9TVEFURSIgPSAic2RrIiBdIDsgdGhlbgogICAgICAgICAjIEFEQiwgUGxhdGZvcm0vTWFpbmxpbmUgU0RLcyBidWlsZCBhbmQgbW92ZSB0byBwcmVidWlsdHMKICAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vbG9jYWxvbmx5LXN0ZXBzLnNoCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEtYW5kLW0uc2ggYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0xLWFuZC1tLnNoCmluZGV4IDBlNzEyOWYuLjg4YmIzNDcgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEtYW5kLW0uc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS1hbmQtbS5zaApAQCAtOSwxMCArOSw5IEBACiAgICAgbG9jYWwgbT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgogCiAgICAgIyBUaGlzIGNvbW1hbmQgdGVzdHM6Ci0gICAgIyAgIFRoZSByZWxlYXNlIHN0YXRlIGZvciBBSURMLgogICAgICMgICBBQkkgZGlmZmVyZW5jZSBiZXR3ZWVuIHVzZXIgYW5kIHVzZXJkZWJ1ZyBidWlsZHMuCiAgICAgIyAgIFJlc291cmNlL1NESyBmaW5hbGl6YXRpb24uCi0gICAgQUlETF9GUk9aRU5fUkVMPXRydWUgJG0KKyAgICAkbQogfQogCiBmaW5hbGl6ZV9tYWluX3N0ZXAxX2FuZF9tCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0xLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS5zaAppbmRleCAzZDVlYWRiLi43Mjk0Njk4IDEwMDc1NQotLS0gYS90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0xLnNoCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEuc2gKQEAgLTcsOCArNywxMyBAQAogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCiAKICAgICBpZiBbICIkRklOQUxfU1RBVEUiID0gInVuZmluYWxpemVkIiBdIDsgdGhlbgorICAgICAgICAjIFZJTlRGIGZpbmFsaXphdGlvbgorICAgICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS12aW50Zi1yZXNvdXJjZXMuc2gKKyAgICBmaTsKKworICAgIGlmIFsgIiRGSU5BTF9TVEFURSIgPSAidW5maW5hbGl6ZWQiIF0gfHwgWyAiJEZJTkFMX1NUQVRFIiA9ICJ2aW50ZiIgXSA7IHRoZW4KICAgICAgICAgIyBCdWlsZCBmaW5hbGl6YXRpb24gYXJ0aWZhY3RzLgotICAgICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaAorICAgICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVzb3VyY2VzLnNoCiAgICAgZmk7CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9jbGVhbnVwLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2NsZWFudXAuc2gKaW5kZXggY2Q4N2IxZC4uZTJhMDU5MiAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2NsZWFudXAuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2NsZWFudXAuc2gKQEAgLTE0LDggKzE0LDggQEAKIAogICAgIHJlcG8gZm9yYWxsIC1jICdcCiAgICAgICAgIGdpdCBjaGVja291dCAuIDsgZ2l0IHJldmVydCAtLWFib3J0IDsgZ2l0IGNsZWFuIC1mZHggO1wKLSAgICAgICAgZ2l0IGNoZWNrb3V0IEAgOyBnaXQgYnJhbmNoIGZpbmEtc3RlcDEgLUQgOyBnaXQgcmVzZXQgLS1oYXJkOyBcCi0gICAgICAgIHJlcG8gc3RhcnQgZmluYS1zdGVwMSA7IGdpdCBjaGVja291dCBAIDsgZ2l0IGIgZmluYS1zdGVwMSAtRCA7JworICAgICAgICBnaXQgY2hlY2tvdXQgQCAtLWRldGFjaCA7IGdpdCBicmFuY2ggZmluYS1zdGVwMSAtRCA7IGdpdCByZXNldCAtLWhhcmQ7IFwKKyAgICAgICAgcmVwbyBzdGFydCBmaW5hLXN0ZXAxIDsgZ2l0IGNoZWNrb3V0IEAgLS1kZXRhY2ggOyBnaXQgYiBmaW5hLXN0ZXAxIC1EIDsnCiB9CiAKIGZpbmFsaXplX3JldmVydF9sb2NhbF9jaGFuZ2VzX21haW4KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9jb21tYW5kLWxpbmUtb3B0aW9ucy5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9jb21tYW5kLWxpbmUtb3B0aW9ucy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTM5N2MyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2NvbW1hbmQtbGluZS1vcHRpb25zLnNoCkBAIC0wLDAgKzEsOCBAQAorQVJHVj0kKGdldG9wdCAtLW9wdGlvbnMgJycgLS1sb25nIGRyeS1ydW4gLS0gIiRAIikKK2V2YWwgc2V0IC0tICIkQVJHViIKK3doaWxlIHRydWU7IGRvCisgICAgY2FzZSAiJDEiIGluCisgICAgICAgIC0tZHJ5LXJ1bikgcmVwb191cGxvYWRfZHJ5X3J1bl9hcmc9Ii0tZHJ5LXJ1biI7IHJlcG9fYnJhbmNoPSJmaW5hbGl6YXRpb24tZHJ5LXJ1biI7IHNoaWZ0IDs7CisgICAgICAgICopIGJyZWFrCisgICAgZXNhYworZG9uZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2RyeXJ1bi1jbGVhbnVwLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2RyeXJ1bi1jbGVhbnVwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRkYWZmYWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maW5hbGl6YXRpb24vZHJ5cnVuLWNsZWFudXAuc2gKQEAgLTAsMCArMSwyNSBAQAorIyEvYmluL2Jhc2gKKyMgQnJpbmdzIGxvY2FsIHJlcG9zaXRvcnkgdG8gYSByZW1vdGUgaGVhZCBzdGF0ZS4gQWxzbyByZW1vdmVzIGFsbCBkcnlydW4gYnJhbmNoZXMuCisKKyMgc2V0IC1leAorCitmdW5jdGlvbiBmaW5hbGl6ZV9yZXZlcnRfbG9jYWxfY2hhbmdlc19tYWluKCkgeworICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgorICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCisKKyAgICBsb2NhbCBtPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCisKKyAgICAjIHJlbW92ZSB0aGUgb3V0IGZvbGRlcgorICAgICRtIGNsb2JiZXIKKworICAgIHJlcG8gc2VsZnVwZGF0ZQorCisgICAgcmVwbyBmb3JhbGwgLWMgJ1wKKyAgICAgICAgZ2l0IGNoZWNrb3V0IC4gOyBnaXQgcmV2ZXJ0IC0tYWJvcnQgOyBnaXQgY2xlYW4gLWZkeCA7XAorICAgICAgICBnaXQgY2hlY2tvdXQgQCAtLWRldGFjaCA7IGdpdCBicmFuY2ggZmluYS1zdGVwMSAtRCA7IGdpdCByZXNldCAtLWhhcmQ7IFwKKyAgICAgICAgcmVwbyBzdGFydCBmaW5hLXN0ZXAxIDsgZ2l0IGNoZWNrb3V0IEAgLS1kZXRhY2ggOyBnaXQgYiBmaW5hLXN0ZXAxIC1EIDsgXAorICAgICAgICBnaXQgYiAkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbi1EcnlSdW4gLUQ7IFwKKyAgICAgICAgZ2l0IGIgJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FLVNESy1GaW5hbGl6YXRpb24tRHJ5UnVuLVJlbCAtRDsgJworfQorCitmaW5hbGl6ZV9yZXZlcnRfbG9jYWxfY2hhbmdlc19tYWluCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vZHJ5cnVuLXN0ZXAtMS1hbmQtMi5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9kcnlydW4tc3RlcC0xLWFuZC0yLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4ODNiY2EKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maW5hbGl6YXRpb24vZHJ5cnVuLXN0ZXAtMS1hbmQtMi5zaApAQCAtMCwwICsxLDM5IEBACisjIS9iaW4vYmFzaAorIyBTY3JpcHQgdG8gcGVyZm9ybSAxc3QgYW5kIDJuZCBzdGVwIG9mIEFuZHJvaWQgRmluYWxpemF0aW9uLCBjcmVhdGUgQ0xzIGFuZCB1cGxvYWQgdG8gR2Vycml0LgorCitmdW5jdGlvbiBjb21taXRfc3RlcF8yX2NoYW5nZXMoKSB7CisgICAgcmVwbyBmb3JhbGwgLWMgJ1wKKyAgICAgICAgaWYgW1sgJChnaXQgc3RhdHVzIC0tc2hvcnQpIF1dOyB0aGVuCisgICAgICAgICAgICByZXBvIHN0YXJ0ICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbi1EcnlSdW4tUmVsIiA7CisgICAgICAgICAgICBnaXQgYWRkIC1BIC4gOworICAgICAgICAgICAgZ2l0IGNvbW1pdCAtbSAiJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FLyRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiBpcyBub3cgUkVMIiBcCisgICAgICAgICAgICAgICAgICAgICAgIC1tICJJZ25vcmUtQU9TUC1GaXJzdDogJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FIEZpbmFsaXphdGlvbgorQnVnOiAkRklOQUxfQlVHX0lECitUZXN0OiBidWlsZCI7CisKKyAgICAgICAgICAgIHJlcG8gdXBsb2FkIC0tY2JyIC0tbm8tdmVyaWZ5IC1vIG5va2V5Y2hlY2sgLXQgLXkgLiA7CisgICAgICAgIGZpJworfQorCitmdW5jdGlvbiBmaW5hbGl6ZV9zdGVwXzJfbWFpbigpIHsKKyAgICBsb2NhbCB0b3A9IiQoZGlybmFtZSAiJDAiKSIvLi4vLi4vLi4vLi4KKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAorCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaAorCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vbG9jYWxvbmx5LXN0ZXBzLnNoCisKKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVsLnNoCisKKyAgICAjIG1vdmUgYWxsIGNoYW5nZXMgdG8gZmluYWxpemF0aW9uIGJyYW5jaC90b3BpYyBhbmQgdXBsb2FkIHRvIGdlcnJpdAorICAgIGNvbW1pdF9zdGVwXzJfY2hhbmdlcworCisgICAgIyBidWlsZCB0byBjb25maXJtIGV2ZXJ5dGhpbmcgaXMgT0sKKyAgICBsb2NhbCBtX25leHQ9IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUkVMRUFTRT1uZXh0IFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgorICAgICRtX25leHQKKworICAgIGxvY2FsIG1fZmluYT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9SRUxFQVNFPWZpbmFfMiBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKKyAgICAkbV9maW5hCit9CisKK2ZpbmFsaXplX3N0ZXBfMl9tYWluCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vZHJ5cnVuLXN0ZXAtMS5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9kcnlydW4tc3RlcC0xLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmMmJjNjMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maW5hbGl6YXRpb24vZHJ5cnVuLXN0ZXAtMS5zaApAQCAtMCwwICsxLDM1IEBACisjIS9iaW4vYmFzaAorIyBTY3JpcHQgdG8gcGVyZm9ybSBhIGRyeSBydW4gb2Ygc3RlcCAxIG9mIEFuZHJvaWQgRmluYWxpemF0aW9uLCBjcmVhdGUgQ0xzIGFuZCB1cGxvYWQgdG8gR2Vycml0LgorCitmdW5jdGlvbiBjb21taXRfc3RlcF8xX2NoYW5nZXMoKSB7CisgICAgcmVwbyBmb3JhbGwgLWMgJ1wKKyAgICAgICAgaWYgW1sgJChnaXQgc3RhdHVzIC0tc2hvcnQpIF1dOyB0aGVuCisgICAgICAgICAgICByZXBvIHN0YXJ0ICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbi1EcnlSdW4iIDsKKyAgICAgICAgICAgIGdpdCBhZGQgLUEgLiA7CisgICAgICAgICAgICBnaXQgY29tbWl0IC1tICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUgaXMgbm93ICRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiIgXAorICAgICAgICAgICAgICAgICAgICAgICAtbSAiSWdub3JlLUFPU1AtRmlyc3Q6ICRGSU5BTF9QTEFURk9STV9DT0RFTkFNRSBGaW5hbGl6YXRpb24KK0J1ZzogJEZJTkFMX0JVR19JRAorVGVzdDogYnVpbGQiOworCisgICAgICAgICAgICByZXBvIHVwbG9hZCAtLWNiciAtLW5vLXZlcmlmeSAtbyBub2tleWNoZWNrIC10IC15IC4gOworICAgICAgICBmaScKK30KKworZnVuY3Rpb24gZmluYWxpemVfc3RlcF8xX21haW4oKSB7CisgICAgbG9jYWwgdG9wPSIkKGRpcm5hbWUgIiQwIikiLy4uLy4uLy4uLy4uCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKKworICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZXNvdXJjZXMuc2gKKworICAgICMgbW92ZSBhbGwgY2hhbmdlcyB0byBmaW5hbGl6YXRpb24gYnJhbmNoL3RvcGljIGFuZCB1cGxvYWQgdG8gZ2Vycml0CisgICAgY29tbWl0X3N0ZXBfMV9jaGFuZ2VzCisKKyAgICAjIGJ1aWxkIHRvIGNvbmZpcm0gZXZlcnl0aGluZyBpcyBPSworICAgIGxvY2FsIG1fbmV4dD0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9SRUxFQVNFPW5leHQgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCisgICAgJG1fbmV4dAorCisgICAgbG9jYWwgbV9maW5hPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1JFTEVBU0U9ZmluYV8xIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgorICAgICRtX2ZpbmEKK30KKworZmluYWxpemVfc3RlcF8xX21haW4KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAppbmRleCBkOTViZWEwLi5mNjhhNjhiIDEwMDc1NQotLS0gYS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCkBAIC0yLDIwICsyLDMxIEBACiAKIHNldCAtZXgKIAotZXhwb3J0IEZJTkFMX0JVR19JRD0nMjc1NDA5OTgxJworZXhwb3J0IEZJTkFMX0JVR19JRD0nMCcgIyBDSSBvbmx5CiAKLWV4cG9ydCBGSU5BTF9QTEFURk9STV9DT0RFTkFNRT0nVXBzaWRlRG93bkNha2UnCi1leHBvcnQgQ1VSUkVOVF9QTEFURk9STV9DT0RFTkFNRT0nVXBzaWRlRG93bkNha2UnCi1leHBvcnQgRklOQUxfUExBVEZPUk1fQ09ERU5BTUVfSkFWQT0nVVBTSURFX0RPV05fQ0FLRScKLWV4cG9ydCBGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTj0nMzQnCi1leHBvcnQgRklOQUxfUExBVEZPUk1fVkVSU0lPTj0nMTQnCitleHBvcnQgRklOQUxfUExBVEZPUk1fQ09ERU5BTUU9J1ZhbmlsbGFJY2VDcmVhbScKK2V4cG9ydCBDVVJSRU5UX1BMQVRGT1JNX0NPREVOQU1FPSdWYW5pbGxhSWNlQ3JlYW0nCitleHBvcnQgRklOQUxfUExBVEZPUk1fQ09ERU5BTUVfSkFWQT0nVkFOSUxMQV9JQ0VfQ1JFQU0nCitleHBvcnQgRklOQUxfUExBVEZPUk1fVkVSU0lPTj0nMTUnCiAKLWV4cG9ydCBGSU5BTF9CVUlMRF9QUkVGSVg9J1VQMUEnCi0KLWV4cG9ydCBGSU5BTF9NQUlOTElORV9FWFRFTlNJT049JzcnCisjIFNldCBhcmJpdHJhcnkgbGFyZ2UgdmFsdWVzIGZvciBDSS4KKyMgU0RLX1ZFUlNJT04gbmVlZHMgdG8gYmUgPDYxIChsaW50L2xpYnMvbGludC1hcGkvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC90b29scy9saW50L2RldGVjdG9yL2FwaS9BcGlDb25zdHJhaW50Lmt0KQorIyBUaGVyZSBhcmUgbXVsdGlwbGUgcGxhY2VzIHdoZXJlIHdlIHJlbHkgb24gbmV4dCBTREsgdmVyc2lvbiB0byBiZSBwcmV2aW91cyArIDEsIGUuZy4gUkVTT1VSQ0VTX1NES19JTlQuCisjIFdlIG1pZ2h0IG9yIG1pZ2h0IG5vdCBmaXggdGhpcyBpbiBmdXR1cmUsIGJ1dCBmb3Igbm93IGxldCdzIGtlZXAgaXQgKzEuCitleHBvcnQgRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT049JzM1JworIyBGZWVsIGZyZWUgdG8gcmFuZG9taXplIG9uY2UgaW4gYSB3aGlsZSB0byBkZXRlY3QgYnVnZ3kgdmVyc2lvbiBkZXRlY3Rpb24gY29kZS4KK2V4cG9ydCBGSU5BTF9NQUlOTElORV9FWFRFTlNJT049JzEzJwogCiAjIE9wdGlvbnM6CiAjICd1bmZpbmFsaXplZCcgLSBicmFuY2ggaXMgaW4gZGV2ZWxvcG1lbnQgc3RhdGUsCi0jICdzZGsnIC0gU0RLL0FQSSBpcyBmaW5hbGl6ZWQKKyMgJ3ZpbnRmJyAtIFZJTlRGIGlzIGZpbmFsaXplZAorIyAnc2RrJyAtIFZJTlRGIGFuZCBTREsvQVBJIGFyZSBmaW5hbGl6ZWQKICMgJ3JlbCcgLSBicmFuY2ggaXMgZmluYWxpemVkLCBzd2l0Y2hlZCB0byBSRUwKIGV4cG9ydCBGSU5BTF9TVEFURT0ncmVsJworCitleHBvcnQgQlVJTERfRlJPTV9TT1VSQ0VfU1RVQj10cnVlCisKKyMgRklOQUwgdmVyc2lvbnMgZm9yIFZJTlRGCisjIFRPRE8oYi8zMjM5ODUyOTcpOiBUaGUgdmVyc2lvbiBtdXN0IG1hdGNoIHdpdGggdGhhdCBmcm9tIHRoZSByZWxlYXNlIGNvbmZpZ3VyYXRpb24uCisjIEluc3RlYWQgb2YgaGFyZGNvZGluZyB0aGUgdmVyc2lvbiBoZXJlLCByZWFkIGl0IGZyb20gYSByZWxlYXNlIGNvbmZpZ3VyYXRpb24uCitleHBvcnQgRklOQUxfQk9BUkRfQVBJX0xFVkVMPScyMDI0MDQnCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlbC5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVsLnNoCmluZGV4IDZjZjQxMjQuLmM0OWY5NzQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVsLnNoCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVsLnNoCkBAIC00LDE5ICs0LDEzIEBACiAKIGZ1bmN0aW9uIHJldmVydF9kcm9pZHN0dWJzX2hhY2soKSB7CiAgICAgaWYgZ3JlcCAtcSAnU1RPUFNISVA6IFJFU1RPUkUgVEhJUyBMT0dJQyBXSEVOIERFQ0xBUklORyAiUkVMIiBCVUlMRCcgIiR0b3AvYnVpbGQvc29vbmcvamF2YS9kcm9pZHN0dWJzLmdvIiA7IHRoZW4KLSAgICAgICAgZ2l0IC1DICIkdG9wL2J1aWxkL3Nvb25nIiBhcHBseSAtLWFsbG93LWVtcHR5IC4uLy4uL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkX3Nvb25nX2phdmFfZHJvaWRzdHVicy5nby5yZXZlcnRfaGFjay5kaWZmCi0gICAgZmkKLX0KLQotZnVuY3Rpb24gcmV2ZXJ0X3Jlc291cmNlc19zZGtfaW50X2ZpeCgpIHsKLSAgICBpZiBncmVwIC1xICdwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRVNfU0RLX0lOVCA9IFNES19JTlQ7JyAiJHRvcC9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YSIgOyB0aGVuCi0gICAgICAgIGdpdCAtQyAiJHRvcC9mcmFtZXdvcmtzL2Jhc2UiIGFwcGx5IC0tYWxsb3ctZW1wdHkgLi4vLi4vYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZnJhbWV3b3Jrc19iYXNlLnJldmVydF9yZXNvdXJjZV9zZGtfaW50LmRpZmYKKyAgICAgICAgcGF0Y2ggLS1zdHJpcD0xIC0tbm8tYmFja3VwLWlmLW1pc21hdGNoIC0tZGlyZWN0b3J5PSIkdG9wL2J1aWxkL3Nvb25nIiAtLWlucHV0PS4uLy4uL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkX3Nvb25nX2phdmFfZHJvaWRzdHVicy5nby5yZXZlcnRfaGFjay5kaWZmCiAgICAgZmkKIH0KIAogZnVuY3Rpb24gYXBwbHlfcHJlcmVsZWFzZV9zZGtfaGFjaygpIHsKICAgICBpZiAhIGdyZXAgLXEgJ1NUT1BTSElQOiBoYWNrIGZvciB0aGUgcHJlLXJlbGVhc2UgU0RLJyAiJHRvcC9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9wYXJzaW5nL0ZyYW1ld29ya1BhcnNpbmdQYWNrYWdlVXRpbHMuamF2YSIgOyB0aGVuCi0gICAgICAgIGdpdCAtQyAiJHRvcC9mcmFtZXdvcmtzL2Jhc2UiIGFwcGx5IC0tYWxsb3ctZW1wdHkgLi4vLi4vYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZnJhbWV3b3Jrc19iYXNlLmFwcGx5X2hhY2suZGlmZgorICAgICAgICBwYXRjaCAtLXN0cmlwPTEgLS1uby1iYWNrdXAtaWYtbWlzbWF0Y2ggLS1kaXJlY3Rvcnk9IiR0b3AvZnJhbWV3b3Jrcy9iYXNlIiAtLWlucHV0PS4uLy4uL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZyYW1ld29ya3NfYmFzZS5hcHBseV9oYWNrLmRpZmYKICAgICBmaQogfQogCkBAIC0zMCwzNiArMjQsMTggQEAKICAgICAjIGxldCB0aGUgYXBwcyBidWlsdCB3aXRoIHByZS1yZWxlYXNlIFNESyBwYXJzZQogICAgIGFwcGx5X3ByZXJlbGVhc2Vfc2RrX2hhY2sKIAotICAgICMgaW4gUkVMIG1vZGUsIHJlc291cmNlcyB3b3VsZCBjb3JyZWN0bHkgc2V0IHRoZSByZXNvdXJjZXNfc2RrX2ludCwgbm8gZml4IHJlcXVpcmVkCi0gICAgcmV2ZXJ0X3Jlc291cmNlc19zZGtfaW50X2ZpeAotCi0gICAgIyBidWlsZC9tYWtlL2NvcmUvdmVyc2lvbl9kZWZhdWx0cy5tawotICAgIHNlZCAtaSAtZSAicy9QTEFURk9STV9WRVJTSU9OX0NPREVOQU1FLiR7RklOQUxfQlVJTERfUFJFRklYfSA6PSAuKi9QTEFURk9STV9WRVJTSU9OX0NPREVOQU1FLiR7RklOQUxfQlVJTERfUFJFRklYfSA6PSBSRUwvZyIgIiR0b3AvYnVpbGQvbWFrZS9jb3JlL3ZlcnNpb25fZGVmYXVsdHMubWsiCi0KICAgICAjIGN0cwotICAgIGVjaG8gIiRGSU5BTF9QTEFURk9STV9WRVJTSU9OIiA+ICIkdG9wL2N0cy90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fdmVyc2lvbnMudHh0IgorICAgIGlmICEgZ3JlcCAtcSAiJHtGSU5BTF9QTEFURk9STV9WRVJTSU9OfSIgIiR0b3AvY3RzL3Rlc3RzL3Rlc3RzL29zL2Fzc2V0cy9wbGF0Zm9ybV92ZXJzaW9ucy50eHQiIDsgdGhlbgorICAgICAgICBlY2hvICR7RklOQUxfUExBVEZPUk1fVkVSU0lPTn0gPj4gIiR0b3AvY3RzL3Rlc3RzL3Rlc3RzL29zL2Fzc2V0cy9wbGF0Zm9ybV92ZXJzaW9ucy50eHQiCisgICAgZmkKICAgICBpZiBbICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUiICE9ICIkQ1VSUkVOVF9QTEFURk9STV9DT0RFTkFNRSIgXTsgdGhlbgogICAgICAgICBlY2hvICIkQ1VSUkVOVF9QTEFURk9STV9DT0RFTkFNRSIgPj4gIi4vY3RzL3Rlc3RzL3Rlc3RzL29zL2Fzc2V0cy9wbGF0Zm9ybV92ZXJzaW9ucy50eHQiCiAgICAgZmkKICAgICBnaXQgLUMgIiR0b3AvY3RzIiBtdiBob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8ke0ZJTkFMX1BMQVRGT1JNX0NPREVOQU1FfSBob3N0c2lkZXRlc3RzL3RoZW1lL2Fzc2V0cy8ke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfQogCi0gICAgIyBzeXN0ZW0vc2Vwb2xpY3kKLSAgICBta2RpciAtcCAiJHRvcC9zeXN0ZW0vc2Vwb2xpY3kvcHJlYnVpbHRzL2FwaS8ke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfS4wLyIKLSAgICBjcCAtciAiJHRvcC9zeXN0ZW0vc2Vwb2xpY3kvcHVibGljLyIgIiR0b3Avc3lzdGVtL3NlcG9saWN5L3ByZWJ1aWx0cy9hcGkvJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0uMC8iCi0gICAgY3AgLXIgIiR0b3Avc3lzdGVtL3NlcG9saWN5L3ByaXZhdGUvIiAiJHRvcC9zeXN0ZW0vc2Vwb2xpY3kvcHJlYnVpbHRzL2FwaS8ke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfS4wLyIKLQotICAgICMgcHJlYnVpbHRzL2FiaS1kdW1wcy9uZGsKLSAgICBta2RpciAtcCAiJHRvcC9wcmVidWlsdHMvYWJpLWR1bXBzL25kay8kRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT04iCi0gICAgY3AgLXIgIiR0b3AvcHJlYnVpbHRzL2FiaS1kdW1wcy9uZGsvY3VycmVudC82NC8iICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvbmRrLyRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTi8iCi0KICAgICAjIHByZWJ1aWx0cy9hYmktZHVtcHMvcGxhdGZvcm0KLSAgICBta2RpciAtcCAiJHRvcC9wcmVidWlsdHMvYWJpLWR1bXBzL3BsYXRmb3JtLyRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiIKLSAgICBjcCAtciAiJHRvcC9wcmVidWlsdHMvYWJpLWR1bXBzL3BsYXRmb3JtL2N1cnJlbnQvNjQvIiAiJHRvcC9wcmVidWlsdHMvYWJpLWR1bXBzL3BsYXRmb3JtLyRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTi8iCi0KLSAgICBpZiBbICIkRklOQUxfU1RBVEUiICE9ICJzZGsiIF0gOyB0aGVuCi0gICAgICAgICMgcHJlYnVpbHRzL2FiaS1kdW1wcy92bmRrCi0gICAgICAgIG12ICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvdm5kay8kQ1VSUkVOVF9QTEFURk9STV9DT0RFTkFNRSIgIiR0b3AvcHJlYnVpbHRzL2FiaS1kdW1wcy92bmRrLyRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiIKLSAgICBmaTsKKyAgICAiJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIiAtLW1ha2UtbW9kZSBUQVJHRVRfUkVMRUFTRT1uZXh0IFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIGNyZWF0ZV9yZWZlcmVuY2VfZHVtcHMKKyAgICBBTkRST0lEX0JVSUxEX1RPUD0iJHRvcCIgIiR0b3Avb3V0L2hvc3QvbGludXgteDg2L2Jpbi9jcmVhdGVfcmVmZXJlbmNlX2R1bXBzIiAtcmVsZWFzZSBuZXh0IC0tYnVpbGQtdmFyaWFudCB1c2VyZGVidWcgLS1saWItdmFyaWFudCBBUEVYCiB9CiAKIGZpbmFsaXplX3Nka19yZWwKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVzb3VyY2VzLnNoCnNpbWlsYXJpdHkgaW5kZXggNjAlCnJlbmFtZSBmcm9tIHRvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaApyZW5hbWUgdG8gdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZXNvdXJjZXMuc2gKaW5kZXggMDQ5MTcwMS4uMTAyNjZlZCAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLWFpZGwtdm5kay1zZGstcmVzb3VyY2VzLnNoCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVzb3VyY2VzLnNoCkBAIC00LDEzICs0LDggQEAKIAogZnVuY3Rpb24gYXBwbHlfZHJvaWRzdHVic19oYWNrKCkgewogICAgIGlmICEgZ3JlcCAtcSAnU1RPUFNISVA6IFJFU1RPUkUgVEhJUyBMT0dJQyBXSEVOIERFQ0xBUklORyAiUkVMIiBCVUlMRCcgIiR0b3AvYnVpbGQvc29vbmcvamF2YS9kcm9pZHN0dWJzLmdvIiA7IHRoZW4KLSAgICAgICAgZ2l0IC1DICIkdG9wL2J1aWxkL3Nvb25nIiBhcHBseSAtLWFsbG93LWVtcHR5IC4uLy4uL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkX3Nvb25nX2phdmFfZHJvaWRzdHVicy5nby5hcHBseV9oYWNrLmRpZmYKLSAgICBmaQotfQotCi1mdW5jdGlvbiBhcHBseV9yZXNvdXJjZXNfc2RrX2ludF9maXgoKSB7Ci0gICAgaWYgISBncmVwIC1xICdwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRVNfU0RLX0lOVCA9IFNES19JTlQ7JyAiJHRvcC9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YSIgOyB0aGVuCi0gICAgICAgIGdpdCAtQyAiJHRvcC9mcmFtZXdvcmtzL2Jhc2UiIGFwcGx5IC0tYWxsb3ctZW1wdHkgLi4vLi4vYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZnJhbWV3b3Jrc19iYXNlLmFwcGx5X3Jlc291cmNlX3Nka19pbnQuZGlmZgorICAgICAgICBsb2NhbCBidWlsZF9zb29uZ19naXRfcm9vdD0iJChyZWFkbGluayAtZiAkdG9wL2J1aWxkL3Nvb25nKSIKKyAgICAgICAgcGF0Y2ggLS1zdHJpcD0xIC0tbm8tYmFja3VwLWlmLW1pc21hdGNoIC0tZGlyZWN0b3J5PSIkYnVpbGRfc29vbmdfZ2l0X3Jvb3QiIC0taW5wdXQ9Li4vLi4vYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vYnVpbGRfc29vbmdfamF2YV9kcm9pZHN0dWJzLmdvLmFwcGx5X2hhY2suZGlmZgogICAgIGZpCiB9CiAKQEAgLTM5LDcgKzM0LDggQEAKICAgICBlY2hvICIgICAgLyoqIENoZWNrcyBpZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgb24gYSByZWxlYXNlIHZlcnNpb24gb2YgQW5kcm9pZCAkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUgb3IgbmV3ZXIgKi8KICAgICBAQ2hlY2tzU2RrSW50QXRMZWFzdChhcGkgPSAkRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT04gLyogQlVJTERfVkVSU0lPTl9DT0RFUy4kRklOQUxfUExBVEZPUk1fQ09ERU5BTUUgKi8pCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXRMZWFzdCR7RklOQUxfUExBVEZPUk1fQ09ERU5BTUU6MDoxfSgpIHsKLSAgICAgICAgcmV0dXJuIFNES19JTlQgPj0gJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OOworICAgICAgICByZXR1cm4gU0RLX0lOVCA+PSAkRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT04gfHwKKyAgICAgICAgICAgICAgICAoU0RLX0lOVCA9PSAkKCgkRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT04gLSAxKSkgJiYgaXNBdExlYXN0UHJlUmVsZWFzZUNvZGVuYW1lKFwiJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FXCIpKTsKICAgICB9IiA+ICIkdG1wZmlsZSIKIAogICAgIGxvY2FsIGphdmFGdW5jUmVnZXg9J1wvXCpcKltee10qaXNBdExlYXN0JyIke3Nob3J0Q29kZW5hbWV9IicoKSB7W157fV0qfScKQEAgLTUzLDcgKzQ5LDExIEBACiAgICAgICAgICAgIGR9JyAkamF2YVNka0xldmVsCiAKICAgICBlY2hvICIvLyBDaGVja3MgaWYgdGhlIGRldmljZSBpcyBydW5uaW5nIG9uIHJlbGVhc2UgdmVyc2lvbiBvZiBBbmRyb2lkICR7RklOQUxfUExBVEZPUk1fQ09ERU5BTUU6MDoxfSBvciBuZXdlci4KLWlubGluZSBib29sIElzQXRMZWFzdCR7RklOQUxfUExBVEZPUk1fQ09ERU5BTUU6MDoxfSgpIHsgcmV0dXJuIGFuZHJvaWRfZ2V0X2RldmljZV9hcGlfbGV2ZWwoKSA+PSAkRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT047IH0iID4gIiR0bXBmaWxlIgoraW5saW5lIGJvb2wgSXNBdExlYXN0JHtGSU5BTF9QTEFURk9STV9DT0RFTkFNRTowOjF9KCkgeworICByZXR1cm4gYW5kcm9pZF9nZXRfZGV2aWNlX2FwaV9sZXZlbCgpID49ICRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiB8fAorICAgICAgICAgKGFuZHJvaWRfZ2V0X2RldmljZV9hcGlfbGV2ZWwoKSA9PSAkKCgkRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT04gLSAxKSkgJiYKKyAgICAgICAgICBkZXRhaWw6OklzQXRMZWFzdFByZVJlbGVhc2VDb2RlbmFtZShcIiRGSU5BTF9QTEFURk9STV9DT0RFTkFNRVwiKSk7Cit9IiA+ICIkdG1wZmlsZSIKIAogICAgIGxvY2FsIGNwcEZ1bmNSZWdleD0nXC9cL1tee10qSXNBdExlYXN0JyIke3Nob3J0Q29kZW5hbWV9IicoKSB7W157fV0qfScKICAgICBsb2NhbCBjcHBGdW5jUmVwbGFjZT0iTjtOO047TjtOO047IHMvJGNwcEZ1bmNSZWdleC8kbWV0aG9kUGxhY2Vob2xkZXIvOyAvJGNwcEZ1bmNSZWdleC8he1A7RH07IgpAQCAtNjcsMTYgKzY3LDQwIEBACiAgICAgcm0gIiR0bXBmaWxlIgogfQogCi1mdW5jdGlvbiBmaW5hbGl6ZV9haWRsX3ZuZGtfc2RrX3Jlc291cmNlcygpIHsKK2Z1bmN0aW9uIGJ1bXBTZGtFeHRlbnNpb25zVmVyc2lvbigpIHsKKyAgICBsb2NhbCBTREtFWFQ9InBhY2thZ2VzL21vZHVsZXMvU2RrRXh0ZW5zaW9ucy8iCisKKyAgICAjIFRoaXMgdXNlZCB0byBjYWxsIGJ1bXBfc2RrLnNoIHV0aWxpdHkuCisgICAgIyBIb3dldmVyIGR1ZSB0byBUUywgd2UgaGF2ZSB0byBidWlsZCB0aGUgZ2VuX3NkayB3aXRoIGEgY29ycmVjdCBzZXQgb2Ygc2V0dGluZ3MuCisKKyAgICAjICIkdG9wL3BhY2thZ2VzL21vZHVsZXMvU2RrRXh0ZW5zaW9ucy9nZW5fc2RrL2J1bXBfc2RrLnNoIiAke0ZJTkFMX01BSU5MSU5FX0VYVEVOU0lPTn0KKyAgICAjIExlYXZlIHRoZSBsYXN0IGNvbW1pdCBhcyBhIHNldCBvZiBtb2RpZmllZCBmaWxlcy4KKyAgICAjIFRoZSBjb2RlIHRvIGNyZWF0ZSBhIGZpbmFsaXphdGlvbiB0b3BpYyB3aWxsIHBpY2sgaXQgdXAgbGF0ZXIuCisgICAgIyBnaXQgLUMgJHtTREtFWFR9IHJlc2V0IEhFQUR+MQorCisgICAgbG9jYWwgc2RrPSIke0ZJTkFMX01BSU5MSU5FX0VYVEVOU0lPTn0iCisgICAgbG9jYWwgbW9kdWxlc19hcmc9CisKKyAgICBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFwKKyAgICAgICAgVEFSR0VUX1JFTEVBU0U9ZmluYV8xIFwKKyAgICAgICAgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIFwKKyAgICAgICAgRElTVF9ESVI9b3V0L2Rpc3QgXAorICAgICAgICAkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgLS1zb29uZy1vbmx5IGdlbl9zZGsKKworICAgIEFORFJPSURfQlVJTERfVE9QPSIkdG9wIiBvdXQvc29vbmcvaG9zdC9saW51eC14ODYvYmluL2dlbl9zZGsgXAorICAgICAgICAtLWRhdGFiYXNlICR7U0RLRVhUfS9nZW5fc2RrL2V4dGVuc2lvbnNfZGIudGV4dHBiIFwKKyAgICAgICAgLS1hY3Rpb24gbmV3X3NkayBcCisgICAgICAgIC0tc2RrICIkc2RrIiBcCisgICAgICAgICRtb2R1bGVzX2FyZworfQorCitmdW5jdGlvbiBmaW5hbGl6ZV9zZGtfcmVzb3VyY2VzKCkgewogICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCiAKICAgICBsb2NhbCBTREtfQ09ERU5BTUU9InB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICRGSU5BTF9QTEFURk9STV9DT0RFTkFNRV9KQVZBID0gQ1VSX0RFVkVMT1BNRU5UOyIKICAgICBsb2NhbCBTREtfVkVSU0lPTj0icHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FX0pBVkEgPSAkRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT047IgogCi0gICAgIyBkZWZhdWx0IHRhcmdldCB0byBtb2RpZnkgdHJlZSBhbmQgYnVpbGQgU0RLCi0gICAgbG9jYWwgbT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIERJU1RfRElSPW91dC9kaXN0IgotCiAgICAgIyBUaGUgZnVsbCBwcm9jZXNzIGNhbiBiZSBmb3VuZCBhdCAoSU5URVJOQUwpIGdvL2FuZHJvaWQtc2RrLWZpbmFsaXphdGlvbi4KIAogICAgICMgYXBwbHkgZHJvaWRzdHVicyBoYWNrIHRvIHByZXZlbnQgdG9vbHMgZnJvbSBpbmNyZW1lbnRpbmcgYW4gQVBJIHZlcnNpb24KQEAgLTg1LDM0ICsxMDksMTYgQEAKICAgICAjIGJpb25pYy9OREsKICAgICBmaW5hbGl6ZV9iaW9uaWNfbmRrCiAKLSAgICAjIFZOREsgZGVmaW5pdGlvbnMgZm9yIG5ldyBTREsgdmVyc2lvbgotICAgIGNwICIkdG9wL2RldmVsb3BtZW50L3ZuZGsvdG9vbHMvZGVmaW5pdGlvbi10b29sL2RhdGFzZXRzL3ZuZGstbGliLWV4dHJhLWxpc3QtY3VycmVudC50eHQiIFwKLSAgICAgICAiJHRvcC9kZXZlbG9wbWVudC92bmRrL3Rvb2xzL2RlZmluaXRpb24tdG9vbC9kYXRhc2V0cy92bmRrLWxpYi1leHRyYS1saXN0LSRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTi50eHQiCi0KLSAgICBBSURMX1RSQU5TSVRJVkVfRlJFRVpFPXRydWUgJG0gYWlkbC1mcmVlemUtYXBpIGNyZWF0ZV9yZWZlcmVuY2VfZHVtcHMKLQotICAgICMgR2VuZXJhdGUgQUJJIGR1bXBzCi0gICAgQU5EUk9JRF9CVUlMRF9UT1A9IiR0b3AiIFwKLSAgICAgICAgb3V0L2hvc3QvbGludXgteDg2L2Jpbi9jcmVhdGVfcmVmZXJlbmNlX2R1bXBzIFwKLSAgICAgICAgLXAgYW9zcF9hcm02NCAtLWJ1aWxkLXZhcmlhbnQgdXNlcgotCi0gICAgZWNobyAiTk9URTogVEhJUyBJTlRFTlRJT05BTExZIE1BWSBGQUlMIEFORCBSRVBBSVIgSVRTRUxGICh1bnRpbCAnRE9ORScpIgotICAgICMgVXBkYXRlIG5ldyB2ZXJzaW9ucyBvZiBmaWxlcy4gU2VlIHVwZGF0ZS12bmRrLWxpc3Quc2ggKHdoaWNoIHJlcXVpcmVzIGVudnNldHVwLnNoKQotICAgICRtIGNoZWNrLXZuZGstbGlzdCB8fCBcCi0gICAgICAgIHsgY3AgJHRvcC9vdXQvc29vbmcvdm5kay92bmRrLmxpYnJhcmllcy50eHQgJHRvcC9idWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2dzaS9jdXJyZW50LnR4dDsgfQotICAgIGVjaG8gIkRPTkU6IFRISVMgSU5URU5USU9OQUxMWSBNQVkgRkFJTCBBTkQgUkVQQUlSIElUU0VMRiIKLQogICAgICMgRmluYWxpemUgU0RLCiAKICAgICAjIGZyYW1ld29ya3MvbGlicy9tb2R1bGVzLXV0aWxzCiAgICAgZmluYWxpemVfbW9kdWxlc191dGlscwogCi0gICAgIyBidWlsZC9tYWtlCi0gICAgbG9jYWwgdmVyc2lvbl9kZWZhdWx0cz0iJHRvcC9idWlsZC9tYWtlL2NvcmUvdmVyc2lvbl9kZWZhdWx0cy5tayIKLSAgICBzZWQgLWkgLWUgInMvUExBVEZPUk1fU0RLX1ZFUlNJT04gOj0gLiovUExBVEZPUk1fU0RLX1ZFUlNJT04gOj0gJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0vZyIgJHZlcnNpb25fZGVmYXVsdHMKLSAgICBzZWQgLWkgLWUgInMvUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSA6PSAuKi9QTEFURk9STV9WRVJTSU9OX0xBU1RfU1RBQkxFIDo9ICR7RklOQUxfUExBVEZPUk1fVkVSU0lPTn0vZyIgJHZlcnNpb25fZGVmYXVsdHMKLSAgICBzZWQgLWkgLWUgInMvc2Vwb2xpY3lfbWFqb3JfdmVycyA6PSAuKi9zZXBvbGljeV9tYWpvcl92ZXJzIDo9ICR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059L2ciICIkdG9wL2J1aWxkL21ha2UvY29yZS9jb25maWcubWsiCi0gICAgY3AgIiR0b3AvYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9nc2kvY3VycmVudC50eHQiICIkdG9wL2J1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvZ3NpLyRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTi50eHQiCisgICAgIyBkZXZlbG9wbWVudC9zZGsKKyAgICBsb2NhbCBwbGF0Zm9ybV9zb3VyY2U9IiR0b3AvZGV2ZWxvcG1lbnQvc2RrL3BsYXRmb3JtX3NvdXJjZS5wcm9wX3RlbXBsYXRlIgorICAgIHNlZCAtaSAtZSAncy9Qa2dcLlJldmlzaW9uLiovUGtnXC5SZXZpc2lvbj0xL2cnICRwbGF0Zm9ybV9zb3VyY2UKKyAgICBsb2NhbCBidWlsZF90b29sc19zb3VyY2U9IiR0b3AvZGV2ZWxvcG1lbnQvc2RrL2J1aWxkX3Rvb2xzX3NvdXJjZS5wcm9wX3RlbXBsYXRlIgorICAgIHNlZCAtaSAtZSAncy9Qa2dcLlJldmlzaW9uLiovUGtnXC5SZXZpc2lvbj0ke1BMQVRGT1JNX1NES19WRVJTSU9OfS4wLjAvZycgJGJ1aWxkX3Rvb2xzX3NvdXJjZQogCiAgICAgIyBidWlsZC9zb29uZwogICAgIGxvY2FsIGNvZGVuYW1lX3ZlcnNpb249IlwiJHtGSU5BTF9QTEFURk9STV9DT0RFTkFNRX1cIjogICAgICR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059IgpAQCAtMTIxLDggKzEyNywxMiBAQAogICAgIGZpCiAKICAgICAjIGN0cwotICAgIGVjaG8gJHtGSU5BTF9QTEFURk9STV9WRVJTSU9OfSA+ICIkdG9wL2N0cy90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fcmVsZWFzZXMudHh0IgotICAgIHNlZCAtaSAtZSAicy9FWFBFQ1RFRF9TREsgPSAkKCgke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfS0xKSkvRVhQRUNURURfU0RLID0gJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0vZyIgIiR0b3AvY3RzL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9CdWlsZFZlcnNpb25UZXN0LmphdmEiCisgICAgaWYgISBncmVwIC1xICIke0ZJTkFMX1BMQVRGT1JNX1ZFUlNJT059IiAiJHRvcC9jdHMvdGVzdHMvdGVzdHMvb3MvYXNzZXRzL3BsYXRmb3JtX3JlbGVhc2VzLnR4dCIgOyB0aGVuCisgICAgICAgIGVjaG8gJHtGSU5BTF9QTEFURk9STV9WRVJTSU9OfSA+PiAiJHRvcC9jdHMvdGVzdHMvdGVzdHMvb3MvYXNzZXRzL3BsYXRmb3JtX3JlbGVhc2VzLnR4dCIKKyAgICBmaQorICAgIGlmICEgZ3JlcCAtcSAiJCgoJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0tMSkpLCAke0ZJTkFMX1BMQVRGT1JNX1ZFUlNJT059IiAiJHRvcC9jdHMvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0J1aWxkVmVyc2lvblRlc3QuamF2YSIgOyB0aGVuCisgICAgICAgIHNlZCAtaSAtZSAicy8uKkVYUEVDVEVEX1NES1MgPSBMaXN0Lm9mKC4qJCgoJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0tMSkpLyYsICRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTi8iICIkdG9wL2N0cy90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvQnVpbGRWZXJzaW9uVGVzdC5qYXZhIgorICAgIGZpCiAKICAgICAjIGxpYmNvcmUKICAgICBzZWQgLWkgInMlJFNES19DT0RFTkFNRSUkU0RLX1ZFUlNJT04lZyIgIiR0b3AvbGliY29yZS9kYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsvYW5ub3RhdGlvbi9jb21wYXQvVmVyc2lvbkNvZGVzLmphdmEiCkBAIC0xMzEsNiArMTQxLDEzIEBACiAgICAgbG9jYWwgdmVyc2lvbl9jb2Rlcz0iJHRvcC9wbGF0Zm9ybV90ZXN0aW5nL2xpYnJhcmllcy9jb21wYXRpYmlsaXR5LWNvbW1vbi11dGlsL3NyYy9jb20vYW5kcm9pZC9jb21wYXRpYmlsaXR5L2NvbW1vbi91dGlsL1ZlcnNpb25Db2Rlcy5qYXZhIgogICAgIHNlZCAtaSAtZSAiLz0uKiQoKCR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059LTEpKTsvYSBcXCAgICAke1NES19WRVJTSU9OfSIgJHZlcnNpb25fY29kZXMKIAorICAgICMgdG9vbHMvcGxhdGZvcm0tY29tcGF0CisgICAgbG9jYWwgY2xhc3Mybm9uc2RrbGlzdD0iJHRvcC90b29scy9wbGF0Zm9ybS1jb21wYXQvamF2YS9jb20vYW5kcm9pZC9jbGFzczJub25zZGtsaXN0L0NsYXNzMk5vblNka0xpc3QuamF2YSIKKyAgICBpZiAhIGdyZXAgLXEgIlwuKm1hcC5wdXQoJCgoJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0pKSIgJGNsYXNzMm5vbnNka2xpc3QgOyB0aGVuCisgICAgICBsb2NhbCBzZGtfdmVyc2lvbj0ibWFwLnB1dCgke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfSwgRkxBR19VTlNVUFBPUlRFRCk7IgorICAgICAgc2VkIC1pIC1lICIvLiptYXAucHV0KCQoKCR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059LTEpKS9hIFxcICAgICAgICAke3Nka192ZXJzaW9ufSIgJGNsYXNzMm5vbnNka2xpc3QKKyAgICBmaQorCiAgICAgIyBGaW5hbGl6ZSByZXNvdXJjZXMKICAgICAiJHRvcC9mcmFtZXdvcmtzL2Jhc2UvdG9vbHMvYWFwdDIvdG9vbHMvZmluYWxpemVfcmVzLnB5IiBcCiAgICAgICAgICAgICIkdG9wL2ZyYW1ld29ya3MvYmFzZS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy1zdGFnaW5nLnhtbCIgXApAQCAtMTM4LDI0ICsxNTUsMTkgQEAKIAogICAgICMgZnJhbWV3b3Jrcy9iYXNlCiAgICAgc2VkIC1pICJzJSRTREtfQ09ERU5BTUUlJFNES19WRVJTSU9OJWciICIkdG9wL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhIgotICAgIGFwcGx5X3Jlc291cmNlc19zZGtfaW50X2ZpeAogICAgIHNlZCAtaSAtZSAiLz0uKiQoKCR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059LTEpKSwvYSBcXCAgICBTREtfJHtGSU5BTF9QTEFURk9STV9DT0RFTkFNRV9KQVZBfSA9ICR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059LCIgIiR0b3AvZnJhbWV3b3Jrcy9iYXNlL3Rvb2xzL2FhcHQvU2RrQ29uc3RhbnRzLmgiCiAgICAgc2VkIC1pIC1lICIvPS4qJCgoJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0tMSkpLC9hIFxcICBTREtfJHtGSU5BTF9QTEFURk9STV9DT0RFTkFNRV9KQVZBfSA9ICR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059LCIgIiR0b3AvZnJhbWV3b3Jrcy9iYXNlL3Rvb2xzL2FhcHQyL1Nka0NvbnN0YW50cy5oIgogCiAgICAgIyBCdW1wIE1haW5saW5lIFNESyBleHRlbnNpb24gdmVyc2lvbi4KLSAgICBsb2NhbCBTREtFWFQ9InBhY2thZ2VzL21vZHVsZXMvU2RrRXh0ZW5zaW9ucy8iCi0gICAgIiR0b3AvcGFja2FnZXMvbW9kdWxlcy9TZGtFeHRlbnNpb25zL2dlbl9zZGsvYnVtcF9zZGsuc2giICR7RklOQUxfTUFJTkxJTkVfRVhURU5TSU9OfQotICAgICMgTGVhdmUgdGhlIGxhc3QgY29tbWl0IGFzIGEgc2V0IG9mIG1vZGlmaWVkIGZpbGVzLgotICAgICMgVGhlIGNvZGUgdG8gY3JlYXRlIGEgZmluYWxpemF0aW9uIHRvcGljIHdpbGwgcGljayBpdCB1cCBsYXRlci4KLSAgICBnaXQgLUMgJHtTREtFWFR9IHJlc2V0IEhFQUR+MQorICAgIGJ1bXBTZGtFeHRlbnNpb25zVmVyc2lvbgogCi0gICAgbG9jYWwgdmVyc2lvbl9kZWZhdWx0cz0iJHRvcC9idWlsZC9tYWtlL2NvcmUvdmVyc2lvbl9kZWZhdWx0cy5tayIKLSAgICBzZWQgLWkgLWUgInMvUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OIDo9IC4qL1BMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTiA6PSAke0ZJTkFMX01BSU5MSU5FX0VYVEVOU0lPTn0vZyIgJHZlcnNpb25fZGVmYXVsdHMKKyAgICAjIHRhcmdldCB0byBidWlsZCBTREsKKyAgICBsb2NhbCBzZGtfbT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX1JFTEVBU0U9ZmluYV8xIFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyBESVNUX0RJUj1vdXQvZGlzdCIKIAogICAgICMgRm9yY2UgdXBkYXRlIGN1cnJlbnQudHh0Ci0gICAgJG0gY2xvYmJlcgotICAgICRtIHVwZGF0ZS1hcGkKKyAgICAkc2RrX20gY2xvYmJlcgorICAgICRzZGtfbSB1cGRhdGUtYXBpCiB9CiAKLWZpbmFsaXplX2FpZGxfdm5ka19zZGtfcmVzb3VyY2VzCitmaW5hbGl6ZV9zZGtfcmVzb3VyY2VzCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS12aW50Zi1yZXNvdXJjZXMuc2ggYi90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ1MzJiMjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCkBAIC0wLDAgKzEsNjIgQEAKKyMhL2Jpbi9iYXNoCisKK3NldCAtZXgKKworZnVuY3Rpb24gZmluYWxpemVfdmludGZfcmVzb3VyY2VzKCkgeworICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgorICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCisgICAgIyBlbnZpcm9ubWVudCBuZWVkZWQgdG8gYnVpbGQgZGVwZW5kZW5jaWVzIGFuZCBydW4gc2NyaXB0cworICAgICMgVGhlc2Ugc2hvdWxkIHJlbWFpbiB0aGUgc2FtZSBmb3IgYWxsIHN0ZXBzIGhlcmUgdG8gc3BlZWQgdXAgYnVpbGQgdGltZQorICAgIGV4cG9ydCBBTkRST0lEX0JVSUxEX1RPUD0iJHRvcCIKKyAgICBleHBvcnQgQU5EUk9JRF9IT1NUX09VVD0iJEFORFJPSURfQlVJTERfVE9QL291dC9ob3N0L2xpbnV4LXg4NiIKKyAgICBleHBvcnQgQU5EUk9JRF9QUk9EVUNUX09VVD0iJEFORFJPSURfQlVJTERfVE9QL291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljX2FybTY0IgorICAgIGV4cG9ydCBQQVRIPSIkUEFUSDokQU5EUk9JRF9IT1NUX09VVC9iaW4vIgorICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWcKKyAgICBleHBvcnQgRElTVF9ESVI9b3V0L2Rpc3QKKyAgICBleHBvcnQgVEFSR0VUX1JFTEVBU0U9ZmluYV8wCisgICAgZXhwb3J0IFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQKKworICAgICMgc3lzdGVtL3NlcG9saWN5CisgICAgIiR0b3Avc3lzdGVtL3NlcG9saWN5L3Rvb2xzL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaCIgIiR0b3AiICIkRklOQUxfQk9BUkRfQVBJX0xFVkVMIgorCisgICAgY3JlYXRlX25ld19jb21wYXRfbWF0cml4X2FuZF9rZXJuZWxfY29uZmlncworCisgICAgIyBwcmUtZmluYWxpemF0aW9uIGJ1aWxkIHRhcmdldCAodHJ1bmspCisgICAgbG9jYWwgYWlkbF9tPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUiCisgICAgQUlETF9UUkFOU0lUSVZFX0ZSRUVaRT10cnVlICRhaWRsX20gYWlkbC1mcmVlemUtYXBpIGNyZWF0ZV9yZWZlcmVuY2VfZHVtcHMKKworICAgICMgR2VuZXJhdGUgTExOREsgQUJJIGR1bXBzCisgICAgIyBUaGlzIGNvbW1hbmQgZGVwZW5kcyBvbiBBTkRST0lEX0JVSUxEX1RPUAorICAgICIkQU5EUk9JRF9IT1NUX09VVC9iaW4vY3JlYXRlX3JlZmVyZW5jZV9kdW1wcyIgLXJlbGVhc2UgIiRUQVJHRVRfUkVMRUFTRSIgLS1idWlsZC12YXJpYW50ICIkVEFSR0VUX0JVSUxEX1ZBUklBTlQiIC0tbGliLXZhcmlhbnQgTExOREsKK30KKworZnVuY3Rpb24gY3JlYXRlX25ld19jb21wYXRfbWF0cml4X2FuZF9rZXJuZWxfY29uZmlncygpIHsKKyAgICAjIFRoZSBjb21wYXRpYmlsaXR5IG1hdHJpeCB2ZXJzaW9ucyBhcmUgYnVtcGVkIGR1cmluZyB2RlJDCisgICAgIyBUaGVzZSB3aWxsIGNoYW5nZSBldmVyeSB0aW1lIHdlIGhhdmUgYSBuZXcgdkZSQworICAgIGxvY2FsIENVUlJFTlRfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUw9JzIwMjQwNCcKKyAgICBsb2NhbCBORVhUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMPScyMDI1MDQnCisgICAgIyBUaGUga2VybmVsIGNvbmZpZ3MgbmVlZCB0aGUgbGV0dGVyIG9mIHRoZSBBbmRyb2lkIHJlbGVhc2UKKyAgICBsb2NhbCBDVVJSRU5UX1JFTEVBU0VfTEVUVEVSPSd2JworICAgIGxvY2FsIE5FWFRfUkVMRUFTRV9MRVRURVI9J3cnCisKKworICAgICMgYnVpbGQgdGhlIHRhcmdldHMgcmVxdWlyZWQgYmVmb3JlIHRvdWNoaW5nIHRoZSBBbmRyb2lkLmJwL0FuZHJvaWQubWsgZmlsZXMKKyAgICBsb2NhbCBidWlsZF9jbWQ9IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSIKKyAgICAkYnVpbGRfY21kIGJwbW9kaWZ5CisKKyAgICAiJHRvcC9wcmVidWlsdHMvYnVpbGQtdG9vbHMvcGF0aC9saW51eC14ODYvcHl0aG9uMyIgIiR0b3AvaGFyZHdhcmUvaW50ZXJmYWNlcy9jb21wYXRpYmlsaXR5X21hdHJpY2VzL2J1bXAucHkiICIkQ1VSUkVOVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTCIgIiRORVhUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMIiAiJENVUlJFTlRfUkVMRUFTRV9MRVRURVIiICIkTkVYVF9SRUxFQVNFX0xFVFRFUiIKKworICAgICMgRnJlZXplIHRoZSBjdXJyZW50IGZyYW1ld29yayBtYW5pZmVzdCBmaWxlLiBUaGlzIHJlbGllcyBvbiB0aGUKKyAgICAjIGFvc3BfY2ZfeDg2XzY0LXRydW5rX3N0YWdpbmcgYnVpbGQgdGFyZ2V0IHRvIGdldCB0aGUgcmlnaHQgbWFuaWZlc3QKKyAgICAjIGZyYWdtZW50cyBpbnN0YWxsZWQuCisgICAgIiR0b3Avc3lzdGVtL2xpYmhpZGwvdmludGZkYXRhL2ZyZWV6ZS5zaCIgIiRDVVJSRU5UX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMIgorfQorCitmdW5jdGlvbiBmcmVlemVfZnJhbWV3b3JrX21hbmlmZXN0KCkgeworICAgQU5EUk9JRF9QUk9EVUNUX09VVD1+L3dvcmtzcGFjZS9pbnRlcm5hbC9tYWluL291dC90YXJnZXQvcHJvZHVjdC92c29jX3g4NiBBTkRST0lEX0JVSUxEX1RPUD1+L3dvcmtzcGFjZS9pbnRlcm5hbC9tYWluIEFORFJPSURfSE9TVF9PVVQ9fi93b3Jrc3BhY2UvaW50ZXJuYWwvbWFpbi9vdXQvaG9zdC9saW51eC14ODYgLi9mcmVlemUuc2ggMjAyNDA0CisKK30KKworCitmaW5hbGl6ZV92aW50Zl9yZXNvdXJjZXMKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2ZyYW1ld29ya3NfYmFzZS5hcHBseV9yZXNvdXJjZV9zZGtfaW50LmRpZmYgYi90b29scy9maW5hbGl6YXRpb24vZnJhbWV3b3Jrc19iYXNlLmFwcGx5X3Jlc291cmNlX3Nka19pbnQuZGlmZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA1NzZkMC4uMDAwMDAwMAotLS0gYS90b29scy9maW5hbGl6YXRpb24vZnJhbWV3b3Jrc19iYXNlLmFwcGx5X3Jlc291cmNlX3Nka19pbnQuZGlmZgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLUZyb20gY2RiNDdmYzkwYjhkNjg2MGVjMWRjNWVmYWRhMWY5Y2NkNDcxNjE4YiBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IEFsZXggQnV5bnl0c2t5eSA8YWxleGJ1eUBnb29nbGUuY29tPgotRGF0ZTogVHVlLCAxMSBBcHIgMjAyMyAyMjoxMjo0NCArMDAwMAotU3ViamVjdDogW1BBVENIXSBEb24ndCBmb3JjZSArMSBmb3IgcmVzb3VyY2UgcmVzb2x1dGlvbi4KLQotQnVnOiAyNzc2NzQwODgKLUZpeGVzOiAyNzc2NzQwODgKLVRlc3Q6IGJvb3RzLCBubyBjcmFzaGVzCi1DaGFuZ2UtSWQ6IEkxN2U3NDNhMGYxY2Y2Zjk4ZmRkZDQwYzM1OGRlYTVhOGI5Y2M3NzIzCi0tLS0KLQotZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCi1pbmRleCBlYjQ3MTcwLi40ZDNlOTJiIDEwMDc1NQotLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQotKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQotQEAgLTQ5Myw3ICs0OTMsNyBAQAotICAgICAgICAgICogQGhpZGUKLSAgICAgICAgICAqLwotICAgICAgICAgQFRlc3RBcGkKLS0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFU19TREtfSU5UID0gU0RLX0lOVCArIEFDVElWRV9DT0RFTkFNRVMubGVuZ3RoOwotKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VTX1NES19JTlQgPSBTREtfSU5UOwotIAotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBUaGUgY3VycmVudCBsb3dlc3Qgc3VwcG9ydGVkIHZhbHVlIG9mIGFwcCB0YXJnZXQgU0RLLiBBcHBsaWNhdGlvbnMgdGFyZ2V0aW5nCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vZnJhbWV3b3Jrc19iYXNlLnJldmVydF9yZXNvdXJjZV9zZGtfaW50LmRpZmYgYi90b29scy9maW5hbGl6YXRpb24vZnJhbWV3b3Jrc19iYXNlLnJldmVydF9yZXNvdXJjZV9zZGtfaW50LmRpZmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZGU0OTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2ZyYW1ld29ya3NfYmFzZS5yZXZlcnRfcmVzb3VyY2Vfc2RrX2ludC5kaWZmCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotRnJvbSBjN2U0NjBiYjE5MDcxZDg2N2NkN2NhMDQyODJjZTQyNjk0ZjRmMzU4IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQotRnJvbTogQWxleCBCdXlueXRza3l5IDxhbGV4YnV5QGdvb2dsZS5jb20+Ci1EYXRlOiBXZWQsIDEyIEFwciAyMDIzIDAxOjA2OjI2ICswMDAwCi1TdWJqZWN0OiBbUEFUQ0hdIFJldmVydCAiRG9uJ3QgZm9yY2UgKzEgZm9yIHJlc291cmNlIHJlc29sdXRpb24uIgotCi1JdCdzIG5vdCByZXF1aXJlZCBmb3IgbWFzdGVyLgotCi1UaGlzIHJldmVydHMgY29tbWl0IGYxY2I2ODM5ODhmODE1NzlhNzZkZGJmOTk5Mzg0OGE0YTA2ZGQyOGMuCi0KLUJ1ZzogMjc3Njc0MDg4Ci1UZXN0OiBib290cywgbm8gY3Jhc2hlcwotQ2hhbmdlLUlkOiBJYTE2OTI1NDhmMjY0OTZmZGM2ZjFlNGYwNTU3MjEzYzc5OTZkNjgyMwotLS0tCi0KLWRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQotaW5kZXggNGQzZTkyYi4uZWI0NzE3MCAxMDA3NTUKLS0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKLSsrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKLUBAIC00OTMsNyArNDkzLDcgQEAKLSAgICAgICAgICAqIEBoaWRlCi0gICAgICAgICAgKi8KLSAgICAgICAgIEBUZXN0QXBpCi0tICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRVNfU0RLX0lOVCA9IFNES19JTlQ7Ci0rICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRVNfU0RLX0lOVCA9IFNES19JTlQgKyBBQ1RJVkVfQ09ERU5BTUVTLmxlbmd0aDsKLSAKLSAgICAgICAgIC8qKgotICAgICAgICAgICogVGhlIGN1cnJlbnQgbG93ZXN0IHN1cHBvcnRlZCB2YWx1ZSBvZiBhcHAgdGFyZ2V0IFNESy4gQXBwbGljYXRpb25zIHRhcmdldGluZwpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2xvY2Fsb25seS1zdGVwcy5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9sb2NhbG9ubHktc3RlcHMuc2gKaW5kZXggNjEwN2IzZS4uOTRlZTM2OCAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2xvY2Fsb25seS1zdGVwcy5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vbG9jYWxvbmx5LXN0ZXBzLnNoCkBAIC03LDE3ICs3LDE4IEBACiAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKIAogICAgICMgZGVmYXVsdCB0YXJnZXQgdG8gbW9kaWZ5IHRyZWUgYW5kIGJ1aWxkIFNESwotICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyBESVNUX0RJUj1vdXQvZGlzdCIKKyAgICBsb2NhbCBtPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfUkVMRUFTRT1maW5hXzEgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIERJU1RfRElSPW91dC9kaXN0IgogCiAgICAgIyBhZGIga2V5cwotICAgICRtIGFkYgotICAgIExPR05BTUU9YW5kcm9pZC1lbmcgSE9TVE5BTUU9Z29vZ2xlLmNvbSAiJHRvcC9vdXQvaG9zdC9saW51eC14ODYvYmluL2FkYiIga2V5Z2VuICIkdG9wL3ZlbmRvci9nb29nbGUvc2VjdXJpdHkvYWRiLyR7RklOQUxfUExBVEZPUk1fVkVSU0lPTn0uYWRiX2tleSIKKyAgICAjIFRoZSBrZXlzIGFyZSBhbHJlYWR5IGdlbmVyYXRlZCBmb3IgQW5kcm9pZCAxNS4gS2VlcGluZyB0aGUgY29tbWFuZCAoY29tbWVudGVkIG91dCkgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisgICAgIyAkbSBhZGIKKyAgICAjIExPR05BTUU9YW5kcm9pZC1lbmcgSE9TVE5BTUU9Z29vZ2xlLmNvbSAiJHRvcC9vdXQvaG9zdC9saW51eC14ODYvYmluL2FkYiIga2V5Z2VuICIkdG9wL3ZlbmRvci9nb29nbGUvc2VjdXJpdHkvYWRiLyR7RklOQUxfUExBVEZPUk1fVkVSU0lPTn0uYWRiX2tleSIKIAogICAgICMgQnVpbGQgUGxhdGZvcm0gU0RLcy4KLSAgICAkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9c2RrIFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyBzZGsgZGlzdCBzZGtfcmVwbyBESVNUX0RJUj1vdXQvZGlzdAorICAgICR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD1zZGsgVEFSR0VUX1JFTEVBU0U9ZmluYV8xIFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyBzZGsgZGlzdCBzZGtfcmVwbyBESVNUX0RJUj1vdXQvZGlzdAogCiAgICAgIyBCdWlsZCBNb2R1bGVzIFNES3MuCi0gICAgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIFVOQlVORExFRF9CVUlMRF9TREtTX0ZST01fU09VUkNFPXRydWUgRElTVF9ESVI9b3V0L2Rpc3QgIiR0b3AvdmVuZG9yL2dvb2dsZS9idWlsZC9tYWlubGluZV9tb2R1bGVzX3Nka3Muc2giCisgICAgVEFSR0VUX1JFTEVBU0U9ZmluYV8xIFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyBVTkJVTkRMRURfQlVJTERfU0RLU19GUk9NX1NPVVJDRT10cnVlIERJU1RfRElSPW91dC9kaXN0ICIkdG9wL3ZlbmRvci9nb29nbGUvYnVpbGQvbWFpbmxpbmVfbW9kdWxlc19zZGtzLnNoIiAtLWJ1aWxkLXJlbGVhc2U9bmV4dAogCiAgICAgIyBVcGRhdGUgcHJlYnVpbHRzLgogICAgICIkdG9wL3ByZWJ1aWx0cy9idWlsZC10b29scy9wYXRoL2xpbnV4LXg4Ni9weXRob24zIiAtVyBpZ25vcmU6OkRlcHJlY2F0aW9uV2FybmluZyAiJHRvcC9wcmVidWlsdHMvc2RrL3VwZGF0ZV9wcmVidWlsdHMucHkiIC0tbG9jYWxfbW9kZSAtZiAke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfSAtZSAke0ZJTkFMX01BSU5MSU5FX0VYVEVOU0lPTn0gLS1idWcgMSAxCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vc3RlcC0wLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMDg3ZjZlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMC5zaApAQCAtMCwwICsxLDM5IEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisjIFNjcmlwdCB0byBwZXJmb3JtIGEgMHRoIHN0ZXAgb2YgQW5kcm9pZCBGaW5hbGl6YXRpb246IFZJTlRGIGZpbmFsaXphdGlvbiwgY3JlYXRlIENMcyBhbmQgdXBsb2FkIHRvIEdlcnJpdC4KKworc2V0IC1leAorCitmdW5jdGlvbiBjb21taXRfc3RlcF8wX2NoYW5nZXMoKSB7CisgICAgc2V0ICtlCisgICAgcmVwbyBmb3JhbGwgLWMgJ1wKKyAgICAgICAgaWYgW1sgJChnaXQgc3RhdHVzIC0tc2hvcnQpIF1dOyB0aGVuCisgICAgICAgICAgICByZXBvIHN0YXJ0ICInJHJlcG9fYnJhbmNoJyIgOworICAgICAgICAgICAgZ2l0IGFkZCAtQSAuIDsKKyAgICAgICAgICAgIGdpdCBjb21taXQgLW0gIlZlbmRvciBBUEkgbGV2ZWwgJEZJTkFMX0JPQVJEX0FQSV9MRVZFTCBpcyBub3cgZnJvemVuIiBcCisgICAgICAgICAgICAgICAgICAgICAgIC1tICJJZ25vcmUtQU9TUC1GaXJzdDogVklOVEYgJEZJTkFMX0JPQVJEX0FQSV9MRVZFTCBGaW5hbGl6YXRpb24KK0J1ZzogJEZJTkFMX0JVR19JRAorVGVzdDogYnVpbGQiOworICAgICAgICAgICAgcmVwbyB1cGxvYWQgJyIkcmVwb191cGxvYWRfZHJ5X3J1bl9hcmciJyAtLWNiciAtLW5vLXZlcmlmeSAtbyBub2tleWNoZWNrIC10IC15IC4gOworICAgICAgICBmaScKK30KKworZnVuY3Rpb24gZmluYWxpemVfc3RlcF8wX21haW4oKSB7CisgICAgbG9jYWwgdG9wPSIkKGRpcm5hbWUgIiQwIikiLy4uLy4uLy4uLy4uCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKKyAgICBsb2NhbCByZXBvX2JyYW5jaD0iVklOVEYtJEZJTkFMX0JPQVJEX0FQSV9MRVZFTC1GaW5hbGl6YXRpb24iCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vY29tbWFuZC1saW5lLW9wdGlvbnMuc2gKKworICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUkVMRUFTRT1uZXh0IFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgorCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCisKKyAgICAjIG1vdmUgYWxsIGNoYW5nZXMgdG8gZmluYWxpemF0aW9uIGJyYW5jaC90b3BpYyBhbmQgdXBsb2FkIHRvIGdlcnJpdAorICAgIGNvbW1pdF9zdGVwXzBfY2hhbmdlcworCisgICAgIyBidWlsZCB0byBjb25maXJtIGV2ZXJ5dGhpbmcgaXMgT0sKKyAgICBBSURMX0ZST1pFTl9SRUw9dHJ1ZSAkbQorfQorCitmaW5hbGl6ZV9zdGVwXzBfbWFpbiAkQApkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMS5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTEuc2gKaW5kZXggMGRkNGIzYS4uNzM2ZDY0MSAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMS5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vc3RlcC0xLnNoCkBAIC03LDMwICs3LDMzIEBACiAgICAgc2V0ICtlCiAgICAgcmVwbyBmb3JhbGwgLWMgJ1wKICAgICAgICAgaWYgW1sgJChnaXQgc3RhdHVzIC0tc2hvcnQpIF1dOyB0aGVuCi0gICAgICAgICAgICByZXBvIHN0YXJ0ICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbiIgOworICAgICAgICAgICAgcmVwbyBzdGFydCAiJyRyZXBvX2JyYW5jaCciIDsKICAgICAgICAgICAgIGdpdCBhZGQgLUEgLiA7CiAgICAgICAgICAgICBnaXQgY29tbWl0IC1tICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUgaXMgbm93ICRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiBhbmQgZXh0ZW5zaW9uIHZlcnNpb24gJEZJTkFMX01BSU5MSU5FX0VYVEVOU0lPTiIgXAogICAgICAgICAgICAgICAgICAgICAgICAtbSAiSWdub3JlLUFPU1AtRmlyc3Q6ICRGSU5BTF9QTEFURk9STV9DT0RFTkFNRSBGaW5hbGl6YXRpb24KIEJ1ZzogJEZJTkFMX0JVR19JRAogVGVzdDogYnVpbGQiOwotICAgICAgICAgICAgcmVwbyB1cGxvYWQgLS1jYnIgLS1uby12ZXJpZnkgLW8gbm9rZXljaGVjayAtdCAteSAuIDsKKyAgICAgICAgICAgIHJlcG8gdXBsb2FkICciJHJlcG9fdXBsb2FkX2RyeV9ydW5fYXJnIicgLS1jYnIgLS1uby12ZXJpZnkgLW8gbm9rZXljaGVjayAtdCAteSAuIDsKICAgICAgICAgZmknCiB9CiAKIGZ1bmN0aW9uIGZpbmFsaXplX3N0ZXBfMV9tYWluKCkgewogICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCisgICAgbG9jYWwgcmVwb19icmFuY2g9IiRGSU5BTF9QTEFURk9STV9DT0RFTkFNRS1TREstRmluYWxpemF0aW9uIgorICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2NvbW1hbmQtbGluZS1vcHRpb25zLnNoCiAKLSAgICBsb2NhbCBtPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCi0KLSAgICAjIHZuZGsgZXRjIGZpbmFsaXphdGlvbgotICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLWFpZGwtdm5kay1zZGstcmVzb3VyY2VzLnNoCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaAogCiAgICAgIyBtb3ZlIGFsbCBjaGFuZ2VzIHRvIGZpbmFsaXphdGlvbiBicmFuY2gvdG9waWMgYW5kIHVwbG9hZCB0byBnZXJyaXQKICAgICBjb21taXRfc3RlcF8xX2NoYW5nZXMKIAogICAgICMgYnVpbGQgdG8gY29uZmlybSBldmVyeXRoaW5nIGlzIE9LCi0gICAgQUlETF9GUk9aRU5fUkVMPXRydWUgJG0KKyAgICBsb2NhbCBtX25leHQ9IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUkVMRUFTRT1uZXh0IFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgorICAgICRtX25leHQKKworICAgIGxvY2FsIG1fZmluYT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9SRUxFQVNFPWZpbmFfMSBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKKyAgICAkbV9maW5hCiB9CiAKLWZpbmFsaXplX3N0ZXBfMV9tYWluCitmaW5hbGl6ZV9zdGVwXzFfbWFpbiAkQApkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMi5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTIuc2gKaW5kZXggZDBiMjRhZS4uNTJlMzg4NyAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMi5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vc3RlcC0yLnNoCkBAIC00LDIyICs0LDIyIEBACiBmdW5jdGlvbiBjb21taXRfc3RlcF8yX2NoYW5nZXMoKSB7CiAgICAgcmVwbyBmb3JhbGwgLWMgJ1wKICAgICAgICAgaWYgW1sgJChnaXQgc3RhdHVzIC0tc2hvcnQpIF1dOyB0aGVuCi0gICAgICAgICAgICByZXBvIHN0YXJ0ICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbi1SZWwiIDsKKyAgICAgICAgICAgIHJlcG8gc3RhcnQgIickcmVwb19icmFuY2gnIiA7CiAgICAgICAgICAgICBnaXQgYWRkIC1BIC4gOwogICAgICAgICAgICAgZ2l0IGNvbW1pdCAtbSAiJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FLyRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiBpcyBub3cgUkVMIiBcCiAgICAgICAgICAgICAgICAgICAgICAgIC1tICJJZ25vcmUtQU9TUC1GaXJzdDogJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FIEZpbmFsaXphdGlvbgogQnVnOiAkRklOQUxfQlVHX0lECiBUZXN0OiBidWlsZCI7CiAKLSAgICAgICAgICAgIHJlcG8gdXBsb2FkIC0tY2JyIC0tbm8tdmVyaWZ5IC1vIG5va2V5Y2hlY2sgLXQgLXkgLiA7CisgICAgICAgICAgICByZXBvIHVwbG9hZCAnIiRyZXBvX3VwbG9hZF9kcnlfcnVuX2FyZyInIC0tY2JyIC0tbm8tdmVyaWZ5IC1vIG5va2V5Y2hlY2sgLXQgLXkgLiA7CiAgICAgICAgIGZpJwogfQogCiBmdW5jdGlvbiBmaW5hbGl6ZV9zdGVwXzJfbWFpbigpIHsKICAgICBsb2NhbCB0b3A9IiQoZGlybmFtZSAiJDAiKSIvLi4vLi4vLi4vLi4KICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAotCi0gICAgbG9jYWwgbT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgorICAgIGxvY2FsIHJlcG9fYnJhbmNoPSIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbi1SZWwiCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vY29tbWFuZC1saW5lLW9wdGlvbnMuc2gKIAogICAgICMgcHJlYnVpbHRzIGV0YwogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZWwuc2gKQEAgLTI4LDcgKzI4LDExIEBACiAgICAgY29tbWl0X3N0ZXBfMl9jaGFuZ2VzCiAKICAgICAjIGJ1aWxkIHRvIGNvbmZpcm0gZXZlcnl0aGluZyBpcyBPSwotICAgIEFJRExfRlJPWkVOX1JFTD10cnVlICRtCisgICAgbG9jYWwgbV9uZXh0PSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1JFTEVBU0U9bmV4dCBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKKyAgICAkbV9uZXh0CisKKyAgICBsb2NhbCBtX2ZpbmE9IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUkVMRUFTRT1maW5hXzIgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCisgICAgJG1fZmluYQogfQogCi1maW5hbGl6ZV9zdGVwXzJfbWFpbgorZmluYWxpemVfc3RlcF8yX21haW4gJEAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi91cGRhdGUtc3RlcC0xLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL3VwZGF0ZS1zdGVwLTEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0Njk5ODguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL3VwZGF0ZS1zdGVwLTEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBTY3JpcHQgdG8gcGVyZm9ybSBhIDFzdCBzdGVwIG9mIEFuZHJvaWQgRmluYWxpemF0aW9uOiBBUEkvU0RLIGZpbmFsaXphdGlvbiwgdXBkYXRlIENMcyBhbmQgdXBsb2FkIHRvIEdlcnJpdC4KLQotIyBXSVAsIGRvZXMgbm90IHdvcmsgeWV0Ci1leGl0IDEwCi0KLXNldCAtZXgKLQotZnVuY3Rpb24gdXBkYXRlX3N0ZXBfMV9jaGFuZ2VzKCkgewotICAgIHNldCArZQotICAgIHJlcG8gZm9yYWxsIC1jICdcCi0gICAgICAgIGlmIFtbICQoZ2l0IHN0YXR1cyAtLXNob3J0KSBdXTsgdGhlbgotICAgICAgICAgICAgZ2l0IHN0YXNoIC11IDsKLSAgICAgICAgICAgIHJlcG8gc3RhcnQgIiRGSU5BTF9QTEFURk9STV9DT0RFTkFNRS1TREstRmluYWxpemF0aW9uIiA7Ci0gICAgICAgICAgICBnaXQgc3Rhc2ggcG9wIDsKLSAgICAgICAgICAgIGdpdCBhZGQgLUEgLiA7Ci0gICAgICAgICAgICBnaXQgY29tbWl0IC0tYW1lbmQgLS1uby1lZGl0IDsKLSAgICAgICAgICAgIHJlcG8gdXBsb2FkIC0tY2JyIC0tbm8tdmVyaWZ5IC1vIG5va2V5Y2hlY2sgLXQgLXkgLiA7Ci0gICAgICAgIGZpJwotfQotCi1mdW5jdGlvbiB1cGRhdGVfc3RlcF8xX21haW4oKSB7Ci0gICAgbG9jYWwgdG9wPSIkKGRpcm5hbWUgIiQwIikiLy4uLy4uLy4uLy4uCi0gICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKLQotCi0gICAgbG9jYWwgbT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgotCi0gICAgIyB2bmRrIGV0YyBmaW5hbGl6YXRpb24KLSAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaAotCi0gICAgIyB1cGRhdGUgZXhpc3RpbmcgQ0xzIGFuZCB1cGxvYWQgdG8gZ2Vycml0Ci0gICAgdXBkYXRlX3N0ZXBfMV9jaGFuZ2VzCi0KLSAgICAjIGJ1aWxkIHRvIGNvbmZpcm0gZXZlcnl0aGluZyBpcyBPSwotICAgIEFJRExfRlJPWkVOX1JFTD10cnVlICRtCi19Ci0KLXVwZGF0ZV9zdGVwXzFfbWFpbgpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL3VwZGF0ZS1zdGVwLTIuc2ggYi90b29scy9maW5hbGl6YXRpb24vdXBkYXRlLXN0ZXAtMi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDJiODU5Mi4uMDAwMDAwMAotLS0gYS90b29scy9maW5hbGl6YXRpb24vdXBkYXRlLXN0ZXAtMi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jIFNjcmlwdCB0byBwZXJmb3JtIGEgMm5kIHN0ZXAgb2YgQW5kcm9pZCBGaW5hbGl6YXRpb246IFJFTCBmaW5hbGl6YXRpb24sIGNyZWF0ZSBDTHMgYW5kIHVwbG9hZCB0byBHZXJyaXQuCi0KLSMgV0lQLCBkb2VzIG5vdCB3b3JrIHlldAotZXhpdCAxMAotCi1zZXQgLWV4Ci0KLWZ1bmN0aW9uIHVwZGF0ZV9zdGVwXzJfY2hhbmdlcygpIHsKLSAgICBzZXQgK2UKLSAgICByZXBvIGZvcmFsbCAtYyAnXAotICAgICAgICBpZiBbWyAkKGdpdCBzdGF0dXMgLS1zaG9ydCkgXV07IHRoZW4KLSAgICAgICAgICAgIGdpdCBzdGFzaCAtdSA7Ci0gICAgICAgICAgICByZXBvIHN0YXJ0ICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbi1SZWwiIDsKLSAgICAgICAgICAgIGdpdCBzdGFzaCBwb3AgOwotICAgICAgICAgICAgZ2l0IGFkZCAtQSAuIDsKLSAgICAgICAgICAgIGdpdCBjb21taXQgLS1hbWVuZCAtLW5vLWVkaXQgOwotICAgICAgICAgICAgcmVwbyB1cGxvYWQgLS1jYnIgLS1uby12ZXJpZnkgLW8gbm9rZXljaGVjayAtdCAteSAuIDsKLSAgICAgICAgZmknCi19Ci0KLWZ1bmN0aW9uIHVwZGF0ZV9zdGVwXzJfbWFpbigpIHsKLSAgICBsb2NhbCB0b3A9IiQoZGlybmFtZSAiJDAiKSIvLi4vLi4vLi4vLi4KLSAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAotCi0gICAgbG9jYWwgbT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgotCi0gICAgIyBwcmVidWlsdHMgZXRjCi0gICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlbC5zaAotCi0gICAgIyBtb3ZlIGFsbCBjaGFuZ2VzIHRvIGZpbmFsaXphdGlvbiBicmFuY2gvdG9waWMgYW5kIHVwbG9hZCB0byBnZXJyaXQKLSAgICB1cGRhdGVfc3RlcF8yX2NoYW5nZXMKLQotICAgICMgYnVpbGQgdG8gY29uZmlybSBldmVyeXRoaW5nIGlzIE9LCi0gICAgQUlETF9GUk9aRU5fUkVMPXRydWUgJG0KLX0KLQotdXBkYXRlX3N0ZXBfMl9tYWluCmRpZmYgLS1naXQgYS90b29scy9maW5kX3N0YXRpY19jYW5kaWRhdGVzLnB5IGIvdG9vbHMvZmluZF9zdGF0aWNfY2FuZGlkYXRlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTUwNjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZmluZF9zdGF0aWNfY2FuZGlkYXRlcy5weQpAQCAtMCwwICsxLDIzNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworCisiIiJUb29sIHRvIGZpbmQgc3RhdGljIGxpYnJhcmllcyB0aGF0IG1heWJlIHNob3VsZCBiZSBzaGFyZWQgbGlicmFyaWVzIGFuZCBzaGFyZWQgbGlicmFyaWVzIHRoYXQgbWF5YmUgc2hvdWxkIGJlIHN0YXRpYyBsaWJyYXJpZXMuCisKK1RoaXMgdG9vbCBvbmx5IGxvb2tzIGF0IHRoZSBtb2R1bGUtaW5mby5qc29uIGZvciB0aGUgY3VycmVudCB0YXJnZXQuCisKK0V4YW1wbGUgb2YgImNsYXNzIiB0eXBlcyBmb3IgZWFjaCBvZiB0aGUgbW9kdWxlcyBpbiBtb2R1bGUtaW5mby5qc29uCisgICJFWEVDVVRBQkxFUyI6IDIzMDcsCisgICJFVEMiOiA5MDk0LAorICAiTkFUSVZFX1RFU1RTIjogMTA0NjEsCisgICJBUFBTIjogMjg4NSwKKyAgIkpBVkFfTElCUkFSSUVTIjogNTIwNSwKKyAgIkVYRUNVVEFCTEVTL0pBVkFfTElCUkFSSUVTIjogMTE5LAorICAiRkFLRSI6IDU1MywKKyAgIlNIQVJFRF9MSUJSQVJJRVMvU1RBVElDX0xJQlJBUklFUyI6IDc1OTEsCisgICJTVEFUSUNfTElCUkFSSUVTIjogMTE1MzUsCisgICJTSEFSRURfTElCUkFSSUVTIjogMTA4NTIsCisgICJIRUFERVJfTElCUkFSSUVTIjogMTg5NywKKyAgIkRZTElCX0xJQlJBUklFUyI6IDEyNjIsCisgICJSTElCX0xJQlJBUklFUyI6IDM0MTMsCisgICJST0JPTEVDVFJJQyI6IDM5LAorICAiUEFDS0FHSU5HIjogNSwKKyAgIlBST0NfTUFDUk9fTElCUkFSSUVTIjogMzYsCisgICJSRU5ERVJTQ1JJUFRfQklUQ09ERSI6IDE3LAorICAiRFlMSUJfTElCUkFSSUVTL1JMSUJfTElCUkFSSUVTIjogOCwKKyAgIkVUQy9GQUtFIjogMQorCitOb25lIG9mIHRoZSAiU0hBUkVEX0xJQlJBUklFUy9TVEFUSUNfTElCUkFSSUVTIiBhcmUgZG91YmxlIGNvdW50ZWQgaW4gdGhlCittb2R1bGVzIHdpdGggb25lIGNsYXNzCitSTElCLworCitBbGwgb2YgdGhlc2UgY2xhc3NlcyBoYXZlIHNoYXJlZF9saWJzIGFuZC9vciBzdGF0aWNfbGlicworICAgICJFWEVDVVRBQkxFUyIsCisgICAgIlNIQVJFRF9MSUJSQVJJRVMiLAorICAgICJTVEFUSUNfTElCUkFSSUVTIiwKKyAgICAiU0hBUkVEX0xJQlJBUklFUy9TVEFUSUNfTElCUkFSSUVTIiwgIyBjY19saWJyYXJ5CisgICAgIkhFQURFUl9MSUJSQVJJRVMiLAorICAgICJOQVRJVkVfVEVTVFMiLCAjIHRlc3QgbW9kdWxlcworICAgICJEWUxJQl9MSUJSQVJJRVMiLCAjIHJ1c3QKKyAgICAiUkxJQl9MSUJSQVJJRVMiLCAjIHJ1c3QKKyAgICAiRVRDIiwgIyBydXN0X2JpbmRnZW4KKyIiIgorCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAorCitpbXBvcnQganNvbiwgb3MsIGFyZ3BhcnNlCisKK0FORFJPSURfUFJPRFVDVF9PVVQgPSBvcy5lbnZpcm9uLmdldCgiQU5EUk9JRF9QUk9EVUNUX09VVCIpCisjIElmIGEgc2hhcmVkIGxpYnJhcnkgaXMgdXNlZCBsZXNzIHRoYW4gTUFYX1NIQVJFRF9JTkNMVVNJT05TIHRpbWVzIGluIGEgdGFyZ2V0LAorIyB0aGVuIGl0IHdpbGwgbGlrZWx5IHNhdmUgbWVtb3J5IGJ5IGNoYW5naW5nIGl0IHRvIGEgc3RhdGljIGxpYnJhcnkKKyMgVGhpcyBtb3ZlIHdpbGwgYWxzbyB1c2UgbGVzcyBzdG9yYWdlCitNQVhfU0hBUkVEX0lOQ0xVU0lPTlMgPSAyCisjIElmIGEgc3RhdGljIGxpYnJhcnkgaXMgdXNlZCBtb3JlIHRoYW4gTUFYX1NUQVRJQ19JTkNMVVNJT05TIHRpbWVzIGluIGEgdGFyZ2V0LAorIyB0aGVuIGl0IHdpbGwgbGlrZWx5IHNhdmUgbWVtb3J5IGJ5IGNoYW5naW5nIGl0IHRvIGEgc2hhcmVkIGxpYnJhcnkKKyMgVGhpcyBtb3ZlIHdpbGwgYWxzbyBsaWtlbHkgdXNlIGxlc3Mgc3RvcmFnZQorTUlOX1NUQVRJQ19JTkNMVVNJT05TID0gMworCisKK2RlZiBwYXJzZV9hcmdzKCk6CisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAorICAgICAgZGVzY3JpcHRpb249KAorICAgICAgICAgICJQYXJzZSBtb2R1bGUtaW5mby5qc28gYW5kIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgc3RhdGljIGFuZCIKKyAgICAgICAgICAiIHNoYXJlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcy4iCisgICAgICApCisgICkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICItLW1vZHVsZSIsIGRlc3Q9Im1vZHVsZSIsIGhlbHA9IlByaW50IHRoZSBpbmZvIGZvciB0aGUgbW9kdWxlLiIKKyAgKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgIi0tc2hhcmVkIiwKKyAgICAgIGRlc3Q9InByaW50X3NoYXJlZCIsCisgICAgICBhY3Rpb249YXJncGFyc2UuQm9vbGVhbk9wdGlvbmFsQWN0aW9uLAorICAgICAgaGVscD0oCisgICAgICAgICAgIlByaW50IHRoZSBsaXN0IG9mIGxpYnJhcmllcyB0aGF0IGFyZSBzaGFyZWRfbGlicyBmb3IgZmV3ZXIgdGhhbiB7fSIKKyAgICAgICAgICAiIG1vZHVsZXMuIi5mb3JtYXQoTUFYX1NIQVJFRF9JTkNMVVNJT05TKQorICAgICAgKSwKKyAgKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgIi0tc3RhdGljIiwKKyAgICAgIGRlc3Q9InByaW50X3N0YXRpYyIsCisgICAgICBhY3Rpb249YXJncGFyc2UuQm9vbGVhbk9wdGlvbmFsQWN0aW9uLAorICAgICAgaGVscD0oCisgICAgICAgICAgIlByaW50IHRoZSBsaXN0IG9mIGxpYnJhcmllcyB0aGF0IGFyZSBzdGF0aWNfbGlicyBmb3IgbW9yZSB0aGFuIHt9IgorICAgICAgICAgICIgbW9kdWxlcy4iLmZvcm1hdChNSU5fU1RBVElDX0lOQ0xVU0lPTlMpCisgICAgICApLAorICApCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAiLS1yZWN1cnNpdmUiLAorICAgICAgZGVzdD0icmVjdXJzaXZlIiwKKyAgICAgIGFjdGlvbj1hcmdwYXJzZS5Cb29sZWFuT3B0aW9uYWxBY3Rpb24sCisgICAgICBkZWZhdWx0PVRydWUsCisgICAgICBoZWxwPSgKKyAgICAgICAgICAiR2F0aGVyIGFsbCBkZXBlbmRlbmNpZXMgb2YgRVhFQ1VUQUJMRVMgcmVjdXJzdmlseSBiZWZvcmUgY2FsY3VsYXRpbmciCisgICAgICAgICAgIiB0aGUgc3RhdHMuIFRoaXMgZWxpbWluYXRlcyBkdXBsaWNhdGVzIGZyb20gbXVsdGlwbGUgbGlicmFyaWVzIgorICAgICAgICAgICIgaW5jbHVkaW5nIHRoZSBzYW1lIGRlcGVuZGVuY2llcyBpbiBhIHNpbmdsZSBiaW5hcnkuIgorICAgICAgKSwKKyAgKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgIi0tYm90aCIsCisgICAgICBkZXN0PSJib3RoIiwKKyAgICAgIGFjdGlvbj1hcmdwYXJzZS5Cb29sZWFuT3B0aW9uYWxBY3Rpb24sCisgICAgICBkZWZhdWx0PUZhbHNlLAorICAgICAgaGVscD0oCisgICAgICAgICAgIlByaW50IGEgbGlzdCBvZiBsaWJyYXJpZXMgdGhhdCBhcmUgaW5jbHVkaW5nIGxpYnJhcmllcyBhcyBib3RoIgorICAgICAgICAgICIgc3RhdGljIGFuZCBzaGFyZWQiCisgICAgICApLAorICApCisgIHJldHVybiBwYXJzZXIucGFyc2VfYXJncygpCisKKworY2xhc3MgVHJhbnNpdGl2ZUhlbHBlcjoKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgIyBrZWVwIGEgbGlzdCBvZiBhbHJlYWR5IGV4cGFuZGVkIGxpYnJhcmllcyBzbyB3ZSBkb24ndCBlbmQgdXAgaW4gYSBjeWNsZQorICAgIHNlbGYudmlzaXRlZCA9IGRlZmF1bHRkaWN0KGxhbWJkYTogZGVmYXVsdGRpY3Qoc2V0KSkKKworICAjIG1vZHVsZSBpcyBhbiBvYmplY3QgZnJvbSB0aGUgbW9kdWxlLWluZm8gZGljdGlvbmFyeQorICAjIG1vZHVsZV9pbmZvIGlzIHRoZSBkaWN0aW9uYXJ5IGZyb20gbW9kdWxlLWluZm8uanNvbgorICAjIG1vZGlmeSB0aGUgbW9kdWxlJ3Mgc2hhcmVkX2xpYnMgYW5kIHN0YXRpY19saWJzIHdpdGggYWxsIG9mIHRoZSB0cmFuc2llbnQKKyAgIyBkZXBlbmRlbmNpZXMgcmVxdWlyZWQgZnJvbSBhbGwgb2YgdGhlIGV4cGxpY2l0IGRlcGVuZGVuY2llcworICBkZWYgZmxhdHRlbkRlcHMoc2VsZiwgbW9kdWxlLCBtb2R1bGVfaW5mbyk6CisgICAgbGlic19zbmFwc2hvdCA9IGRpY3Qoc2hhcmVkX2xpYnMgPSBzZXQobW9kdWxlLmdldCgic2hhcmVkX2xpYnMiLHt9KSksIHN0YXRpY19saWJzID0gc2V0KG1vZHVsZS5nZXQoInN0YXRpY19saWJzIix7fSkpKQorCisgICAgZm9yIGxpYl9jbGFzcyBpbiBbInNoYXJlZF9saWJzIiwgInN0YXRpY19saWJzIl06CisgICAgICBmb3IgbGliIGluIGxpYnNfc25hcHNob3RbbGliX2NsYXNzXToKKyAgICAgICAgaWYgbm90IGxpYiBvciBsaWIgbm90IGluIG1vZHVsZV9pbmZvIG9yIGxpYl9jbGFzcyBub3QgaW4gbW9kdWxlOgorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGxpYiBpbiBzZWxmLnZpc2l0ZWQ6CisgICAgICAgICAgbW9kdWxlW2xpYl9jbGFzc10udXBkYXRlKHNlbGYudmlzaXRlZFtsaWJdW2xpYl9jbGFzc10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcmVzID0gc2VsZi5mbGF0dGVuRGVwcyhtb2R1bGVfaW5mb1tsaWJdLCBtb2R1bGVfaW5mbykKKyAgICAgICAgICBtb2R1bGVbbGliX2NsYXNzXS51cGRhdGUocmVzLmdldChsaWJfY2xhc3MsIHt9KSkKKyAgICAgICAgICBzZWxmLnZpc2l0ZWRbbGliXVtsaWJfY2xhc3NdLnVwZGF0ZShyZXMuZ2V0KGxpYl9jbGFzcywge30pKQorCisgICAgcmV0dXJuIG1vZHVsZQorCitkZWYgbWFpbigpOgorICBtb2R1bGVfaW5mbyA9IGpzb24ubG9hZChvcGVuKEFORFJPSURfUFJPRFVDVF9PVVQgKyAiL21vZHVsZS1pbmZvLmpzb24iKSkKKworICBhcmdzID0gcGFyc2VfYXJncygpCisKKyAgaWYgYXJncy5tb2R1bGU6CisgICAgaWYgYXJncy5tb2R1bGUgbm90IGluIG1vZHVsZV9pbmZvOgorICAgICAgcHJpbnQoIk1vZHVsZSB7fSBkb2VzIG5vdCBleGlzdCIuZm9ybWF0KGFyZ3MubW9kdWxlKSkKKyAgICAgIGV4aXQoMSkKKworICAjIHR1cm4gYWxsIG9mIHRoZSBzdGF0aWNfbGlicyBhbmQgc2hhcmVkX2xpYnMgbGlzdHMgaW50byBzZXRzIHRvIG1ha2UgdGhlbQorICAjIGVhc2llciB0byB1cGRhdGUKKyAgZm9yIF8sIG1vZHVsZSBpbiBtb2R1bGVfaW5mby5pdGVtcygpOgorICAgIG1vZHVsZVsic2hhcmVkX2xpYnMiXSA9IHNldChtb2R1bGUuZ2V0KCJzaGFyZWRfbGlicyIsIHt9KSkKKyAgICBtb2R1bGVbInN0YXRpY19saWJzIl0gPSBzZXQobW9kdWxlLmdldCgic3RhdGljX2xpYnMiLCB7fSkpCisKKyAgaW5jbHVkZWRTdGF0aWNhbGx5ID0gZGVmYXVsdGRpY3Qoc2V0KQorICBpbmNsdWRlZFNoYXJlZGx5ID0gZGVmYXVsdGRpY3Qoc2V0KQorICBpbmNsdWRlZEJvdGhseSA9IGRlZmF1bHRkaWN0KHNldCkKKyAgdHJhbnNpdGl2ZSA9IFRyYW5zaXRpdmVIZWxwZXIoKQorICBmb3IgbmFtZSwgbW9kdWxlIGluIG1vZHVsZV9pbmZvLml0ZW1zKCk6CisgICAgaWYgYXJncy5yZWN1cnNpdmU6CisgICAgICAjIGluIHRoaXMgcmVjdXJzaXZlIG1vZGUgd2Ugb25seSB3YW50IHRvIHNlZSB3aGF0IGlzIGluY2x1ZGVkIGJ5IHRoZSBleGVjdXRhYmxlcworICAgICAgaWYgIkVYRUNVVEFCTEVTIiBub3QgaW4gbW9kdWxlWyJjbGFzcyJdOgorICAgICAgICBjb250aW51ZQorICAgICAgbW9kdWxlID0gdHJhbnNpdGl2ZS5mbGF0dGVuRGVwcyhtb2R1bGUsIG1vZHVsZV9pbmZvKQorICAgICAgIyBmaWx0ZXIgb3V0IGZ1enplcnMgYnkgdGhlaXIgZGVwZW5kZW5jeSBvbiBjbGFuZworICAgICAgaWYgInN0YXRpY19saWJzIiBpbiBtb2R1bGU6CisgICAgICAgIGlmICJsaWJjbGFuZ19ydC5mdXp6ZXIiIGluIG1vZHVsZVsic3RhdGljX2xpYnMiXToKKyAgICAgICAgICBjb250aW51ZQorICAgIGVsc2U6CisgICAgICBpZiAiTkFUSVZFX1RFU1RTIiBpbiBtb2R1bGVbImNsYXNzIl06CisgICAgICAgICMgV2UgZG9uJ3QgY2FyZSBhYm91dCBob3cgdGVzdHMgYXJlIGluY2x1ZGluZyBsaWJyYXJpZXMKKyAgICAgICAgY29udGludWUKKworICAgICMgY291bnQgYWxsIG9mIHRoZSBzaGFyZWQgYW5kIHN0YXRpYyBsaWJzIGluY2x1ZGVkIGluIHRoaXMgbW9kdWxlCisgICAgaWYgInNoYXJlZF9saWJzIiBpbiBtb2R1bGU6CisgICAgICBmb3IgbGliIGluIG1vZHVsZVsic2hhcmVkX2xpYnMiXToKKyAgICAgICAgaW5jbHVkZWRTaGFyZWRseVtsaWJdLmFkZChuYW1lKQorICAgIGlmICJzdGF0aWNfbGlicyIgaW4gbW9kdWxlOgorICAgICAgZm9yIGxpYiBpbiBtb2R1bGVbInN0YXRpY19saWJzIl06CisgICAgICAgIGluY2x1ZGVkU3RhdGljYWxseVtsaWJdLmFkZChuYW1lKQorCisgICAgaWYgInNoYXJlZF9saWJzIiBpbiBtb2R1bGUgYW5kICAic3RhdGljX2xpYnMiIGluIG1vZHVsZToKKyAgICAgIGludGVyc2VjdGlvbiA9IHNldChtb2R1bGVbInNoYXJlZF9saWJzIl0pLmludGVyc2VjdGlvbigKKyAgICAgICAgICBtb2R1bGVbInN0YXRpY19saWJzIl0KKyAgICAgICkKKyAgICAgIGlmIGludGVyc2VjdGlvbjoKKyAgICAgICAgaW5jbHVkZWRCb3RobHlbbmFtZV0gPSBpbnRlcnNlY3Rpb24KKworICBpZiBhcmdzLnByaW50X3NoYXJlZDoKKyAgICBwcmludCgKKyAgICAgICAgIlNoYXJlZCBsaWJyYXJpZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgZmV3ZXIgdGhhbiB7fSBtb2R1bGVzIG9uIGEiCisgICAgICAgICIgZGV2aWNlOiIuZm9ybWF0KE1BWF9TSEFSRURfSU5DTFVTSU9OUykKKyAgICApCisgICAgZm9yIG5hbWUsIGxpYnMgaW4gaW5jbHVkZWRTaGFyZWRseS5pdGVtcygpOgorICAgICAgaWYgbGVuKGxpYnMpIDwgTUFYX1NIQVJFRF9JTkNMVVNJT05TOgorICAgICAgICBwcmludCgie306IHt9IGluY2x1ZGVkIGJ5OiB7fSIuZm9ybWF0KG5hbWUsIGxlbihsaWJzKSwgbGlicykpCisKKyAgaWYgYXJncy5wcmludF9zdGF0aWM6CisgICAgcHJpbnQoCisgICAgICAgICJMaWJyYXJpZXMgdGhhdCBhcmUgaW5jbHVkZWQgc3RhdGljYWxseSBieSBtb3JlIHRoYW4ge30gbW9kdWxlcyBvbiBhIgorICAgICAgICAiIGRldmljZToiLmZvcm1hdChNSU5fU1RBVElDX0lOQ0xVU0lPTlMpCisgICAgKQorICAgIGZvciBuYW1lLCBsaWJzIGluIGluY2x1ZGVkU3RhdGljYWxseS5pdGVtcygpOgorICAgICAgaWYgbGVuKGxpYnMpID4gTUlOX1NUQVRJQ19JTkNMVVNJT05TOgorICAgICAgICBwcmludCgie306IHt9IGluY2x1ZGVkIGJ5OiB7fSIuZm9ybWF0KG5hbWUsIGxlbihsaWJzKSwgbGlicykpCisKKyAgaWYgYXJncy5ib3RoOgorICAgIGFsbEluY2x1ZGVkQm90aGx5ID0gc2V0KCkKKyAgICBmb3IgbmFtZSwgbGlicyBpbiBpbmNsdWRlZEJvdGhseS5pdGVtcygpOgorICAgICAgYWxsSW5jbHVkZWRCb3RobHkudXBkYXRlKGxpYnMpCisKKyAgICBwcmludCgKKyAgICAgICAgIkxpc3Qgb2YgbGlicmFyaWVzIHVzZWQgYm90aCBzdGF0aWNhbGx5IGFuZCBzaGFyZWQgaW4gdGhlIHNhbWUiCisgICAgICAgICIgcHJvY2Vzc2VzOlxuIHt9XG5cbiIuZm9ybWF0KCJcbiIuam9pbihzb3J0ZWQoYWxsSW5jbHVkZWRCb3RobHkpKSkKKyAgICApCisgICAgcHJpbnQoCisgICAgICAgICJMaXN0IG9mIGxpYnJhcmllcyB1c2VkIGJvdGggc3RhdGljYWxseSBhbmQgc2hhcmVkIGluIGFueSBwcm9jZXNzZXM6XG4ge30iLmZvcm1hdCgiXG4iLmpvaW4oc29ydGVkKGluY2x1ZGVkU3RhdGljYWxseS5rZXlzKCkgJiBpbmNsdWRlZFNoYXJlZGx5LmtleXMoKSkpKSkKKworICBpZiBhcmdzLm1vZHVsZToKKyAgICBwcmludChqc29uLmR1bXBzKG1vZHVsZV9pbmZvW2FyZ3MubW9kdWxlXSwgZGVmYXVsdD1saXN0LCBpbmRlbnQ9MikpCisgICAgcHJpbnQoCisgICAgICAgICJ7fSBpcyBpbmNsdWRlZCBpbiBzaGFyZWRfbGlicyB7fSB0aW1lcyBieSB0aGVzZSBtb2R1bGVzOiB7fSIuZm9ybWF0KAorICAgICAgICAgICAgYXJncy5tb2R1bGUsIGxlbihpbmNsdWRlZFNoYXJlZGx5W2FyZ3MubW9kdWxlXSksCisgICAgICAgICAgICBpbmNsdWRlZFNoYXJlZGx5W2FyZ3MubW9kdWxlXQorICAgICAgICApCisgICAgKQorICAgIHByaW50KAorICAgICAgICAie30gaXMgaW5jbHVkZWQgaW4gc3RhdGljX2xpYnMge30gdGltZXMgYnkgdGhlc2UgbW9kdWxlczoge30iLmZvcm1hdCgKKyAgICAgICAgICAgIGFyZ3MubW9kdWxlLCBsZW4oaW5jbHVkZWRTdGF0aWNhbGx5W2FyZ3MubW9kdWxlXSksCisgICAgICAgICAgICBpbmNsdWRlZFN0YXRpY2FsbHlbYXJncy5tb2R1bGVdCisgICAgICAgICkKKyAgICApCisgICAgcHJpbnQoIlNoYXJlZCBsaWJzIGluY2x1ZGVkIGJ5IHRoaXMgbW9kdWxlIHRoYXQgYXJlIHVzZWQgaW4gZmV3ZXIgdGhhbiB7fSBwcm9jZXNzZXM6XG57fSIuZm9ybWF0KAorICAgICAgICBNQVhfU0hBUkVEX0lOQ0xVU0lPTlMsIFt4IGZvciB4IGluIG1vZHVsZV9pbmZvW2FyZ3MubW9kdWxlXVsic2hhcmVkX2xpYnMiXSBpZiBsZW4oaW5jbHVkZWRTaGFyZWRseVt4XSkgPCBNQVhfU0hBUkVEX0lOQ0xVU0lPTlNdKSkKKworCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQuYnAgYi90b29scy9mc19jb25maWcvQW5kcm9pZC5icAppbmRleCA1NWZkY2E0Li42YWE1Mjg5IDEwMDY0NAotLS0gYS90b29scy9mc19jb25maWcvQW5kcm9pZC5icAorKysgYi90b29scy9mc19jb25maWcvQW5kcm9pZC5icApAQCAtMzUsNyArMzUsNiBAQAogICAgIHNyY3M6IFsiZnNfY29uZmlnLmMiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnNlbGludXgiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIH0KQEAgLTI1OSwzICsyNTgsMTczIEBACiAgICAgc3lzdGVtX2V4dF9zcGVjaWZpYzogdHJ1ZSwKICAgICBzcmM6ICI6Z3JvdXBfZ2VuX3N5c3RlbV9leHQiLAogfQorCitmc19jb25maWdfY21kID0gIiQobG9jYXRpb24gZnNfY29uZmlnX2dlbmVyYXRvcikgZnNjb25maWcgIiArCisgICAgIi0tYWlkLWhlYWRlciAkKGxvY2F0aW9uIDphbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnX2hlYWRlcikgIiArCisgICAgIi0tY2FwYWJpbGl0eS1oZWFkZXIgJChsb2NhdGlvbiA6bGludXhfY2FwYWJpbGl0eV9oZWFkZXIpICIgKworICAgICItLW91dF9maWxlICQob3V0KSAiCitmc19jb25maWdfY21kX2RpcnMgPSBmc19jb25maWdfY21kICsgIi0tZGlycyAiCitmc19jb25maWdfY21kX2ZpbGVzID0gZnNfY29uZmlnX2NtZCArICItLWZpbGVzICIKKworZ2VucnVsZV9kZWZhdWx0cyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kZWZhdWx0cyIsCisgICAgdG9vbHM6IFsiZnNfY29uZmlnX2dlbmVyYXRvciJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnX2hlYWRlciIsCisgICAgICAgICI6bGludXhfY2FwYWJpbGl0eV9oZWFkZXIiLAorICAgICAgICAiOnRhcmdldF9mc19jb25maWdfZ2VuIiwKKyAgICBdLAorICAgIG91dDogWyJvdXQiXSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3N5c3RlbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9kaXJzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHN5c3RlbSAiICsKKyAgICAgICAgIi0tYWxsLXBhcnRpdGlvbnMgdmVuZG9yLG9lbSxvZG0sdmVuZG9yX2Rsa20sb2RtX2Rsa20sc3lzdGVtX2Rsa20gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfc3lzdGVtIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfc3lzdGVtX2dlbiIsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfc3lzdGVtX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2ZpbGVzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHN5c3RlbSAiICsKKyAgICAgICAgIi0tYWxsLXBhcnRpdGlvbnMgdmVuZG9yLG9lbSxvZG0sdmVuZG9yX2Rsa20sb2RtX2Rsa20sc3lzdGVtX2Rsa20gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX3N5c3RlbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZmlsZXMiLAorICAgIHNyYzogIjpmc19jb25maWdfZmlsZXNfc3lzdGVtX2dlbiIsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19zeXN0ZW1fZXh0X2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2RpcnMgKworICAgICAgICAiLS1wYXJ0aXRpb24gc3lzdGVtX2V4dCAiICsKKyAgICAgICAgIiQobG9jYXRpb25zIDp0YXJnZXRfZnNfY29uZmlnX2dlbikiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19zeXN0ZW1fZXh0IiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dF9nZW4iLAorICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfc3lzdGVtX2V4dF9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9maWxlcyArCisgICAgICAgICItLXBhcnRpdGlvbiBzeXN0ZW1fZXh0ICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0IiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19maWxlcyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0X2dlbiIsCisgICAgc3lzdGVtX2V4dF9zcGVjaWZpYzogdHJ1ZSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3Byb2R1Y3RfZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZGlycyArCisgICAgICAgICItLXBhcnRpdGlvbiBwcm9kdWN0ICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3Byb2R1Y3QiLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2RpcnMiLAorICAgIHNyYzogIjpmc19jb25maWdfZGlyc19wcm9kdWN0X2dlbiIsCisgICAgcHJvZHVjdF9zcGVjaWZpYzogdHJ1ZSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19wcm9kdWN0X2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2ZpbGVzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHByb2R1Y3QgIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3QiLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2ZpbGVzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3RfZ2VuIiwKKyAgICBwcm9kdWN0X3NwZWNpZmljOiB0cnVlLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfdmVuZG9yX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2RpcnMgKworICAgICAgICAiLS1wYXJ0aXRpb24gdmVuZG9yICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3ZlbmRvciIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZGlycyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19kaXJzX3ZlbmRvcl9nZW4iLAorICAgIHZlbmRvcjogdHJ1ZSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc192ZW5kb3JfZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZmlsZXMgKworICAgICAgICAiLS1wYXJ0aXRpb24gdmVuZG9yICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc192ZW5kb3IiLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2ZpbGVzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2ZpbGVzX3ZlbmRvcl9nZW4iLAorICAgIHZlbmRvcjogdHJ1ZSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX29kbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9kaXJzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIG9kbSAiICsKKyAgICAgICAgIiQobG9jYXRpb25zIDp0YXJnZXRfZnNfY29uZmlnX2dlbikiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19vZG0iLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2RpcnMiLAorICAgIHNyYzogIjpmc19jb25maWdfZGlyc19vZG1fZ2VuIiwKKyAgICBkZXZpY2Vfc3BlY2lmaWM6IHRydWUsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfb2RtX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2ZpbGVzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIG9kbSAiICsKKyAgICAgICAgIiQobG9jYXRpb25zIDp0YXJnZXRfZnNfY29uZmlnX2dlbikiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfb2RtIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19maWxlcyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19maWxlc19vZG1fZ2VuIiwKKyAgICBkZXZpY2Vfc3BlY2lmaWM6IHRydWUsCit9CisKKy8vIFRPRE8oaml5b25nKTogYWRkIGZzX2NvbmZpZyBmb3Igb2VtLCBzeXN0ZW1fZGxrbSwgdmVuZG9yX2Rsa20sIG9kbV9kbGttIHBhcnRpdGlvbnMKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLm1rIGIvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQubWsKaW5kZXggYzM2YzNhYS4uZTRjMzYyNiAxMDA2NDQKLS0tIGEvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQubWsKKysrIGIvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQubWsKQEAgLTI0LDIzICsyNCw4IEBACiAkKGVycm9yIFVzaW5nICQoVEFSR0VUX0RFVklDRV9ESVIpL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIFRBUkdFVF9GU19DT05GSUdfR0VOIGluc3RlYWQpCiBlbmRpZgogCi1zeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZyA6PSBzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaAotc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyIDo9IGJpb25pYy9saWJjL2tlcm5lbC91YXBpL2xpbnV4L2NhcGFiaWxpdHkuaAotCi0jIFVzZSBzbmFwc2hvdHMgaWYgZXhpc3QKLXZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnIDo9ICQoc3RyaXAgXAotICAkKGlmICQoZmlsdGVyLW91dCBjdXJyZW50LCQoQk9BUkRfVk5ES19WRVJTSU9OKSksIFwKLSAgICAkKFNPT05HX1ZFTkRPUl8kKEJPQVJEX1ZOREtfVkVSU0lPTilfU05BUFNIT1RfRElSKS9pbmNsdWRlLyQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpKSkKLWlmZXEgKCwkKHdpbGRjYXJkICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpKSkKLXZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnIDo9ICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi1lbmRpZgotCi12ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIgOj0gJChzdHJpcCBcCi0gICQoaWYgJChmaWx0ZXItb3V0IGN1cnJlbnQsJChCT0FSRF9WTkRLX1ZFUlNJT04pKSwgXAotICAgICQoU09PTkdfVkVORE9SXyQoQk9BUkRfVk5ES19WRVJTSU9OKV9TTkFQU0hPVF9ESVIpL2luY2x1ZGUvJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpKSkKLWlmZXEgKCwkKHdpbGRjYXJkICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKSkpCi12ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIgOj0gJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCi1lbmRpZgorYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZyA6PSBzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaAorY2FwYWJpbGl0eV9oZWFkZXIgOj0gYmlvbmljL2xpYmMva2VybmVsL3VhcGkvbGludXgvY2FwYWJpbGl0eS5oCiAKICMgTGlzdCBvZiBzdXBwb3J0ZWQgdmVuZG9yLCBvZW0sIG9kbSwgdmVuZG9yX2Rsa20sIG9kbV9kbGttLCBhbmQgc3lzdGVtX2Rsa20gUGFydGl0aW9ucwogZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0IDo9ICQoc3RyaXAgXApAQCAtODUsNTggKzcwLDYgQEAKIGluY2x1ZGUgJChCVUlMRF9QSE9OWV9QQUNLQUdFKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBzeXN0ZW1fZXh0L2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldCBpZiB0aGUKLSMgc3lzdGVtX2V4dCBwYXJ0aXRpb24gaXMgZ2VuZXJhdGVkLiBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dAotIyB0byBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9ICQoaWYgJChCT0FSRF9VU0VTX1NZU1RFTV9FWFRJTUFHRSkkKEJPQVJEX1NZU1RFTV9FWFRJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSxfZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dCkKLWluY2x1ZGUgJChCVUlMRF9QSE9OWV9QQUNLQUdFKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBzeXN0ZW1fZXh0L2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQgaWYgdGhlCi0jIHN5c3RlbV9leHQgcGFydGl0aW9uIGlzIGdlbmVyYXRlZC4gQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfc3lzdGVtX2V4dAotIyB0byBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9leHQKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSAkKGlmICQoQk9BUkRfVVNFU19TWVNURU1fRVhUSU1BR0UpJChCT0FSRF9TWVNURU1fRVhUSU1BR0VfRklMRV9TWVNURU1fVFlQRSksX2ZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0KQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHByb2R1Y3QvZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0IGlmIHRoZQotIyBwcm9kdWN0IHBhcnRpdGlvbiBpcyBnZW5lcmF0ZWQuIEFkZCBmc19jb25maWdfZGlycyBvciBmc19jb25maWdfZGlyc19wcm9kdWN0Ci0jIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZGlyc19wcm9kdWN0Ci1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gJChpZiAkKEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFKSQoQk9BUkRfUFJPRFVDVElNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLF9mc19jb25maWdfZGlyc19wcm9kdWN0KQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHByb2R1Y3QvZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldCBpZiB0aGUKLSMgcHJvZHVjdCBwYXJ0aXRpb24gaXMgZ2VuZXJhdGVkLiBBZGQgZnNfY29uZmlnX2ZpbGVzIG9yIGZzX2NvbmZpZ19maWxlc19wcm9kdWN0Ci0jIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZmlsZXNfcHJvZHVjdAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9ICQoaWYgJChCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRSkkKEJPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSxfZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3QpCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZXMgZm9yIGFsbCBlbmFibGVkIHBhcnRpdGlvbnMKICMgZXhjbHVkaW5nIC9zeXN0ZW0sIC9zeXN0ZW1fZXh0IGFuZCAvcHJvZHVjdC4gQWRkIGZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbSB0bwogIyBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KQEAgLTE0Niw3ICs3OSw3IEBACiBMT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKIExPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKIExPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gJChmb3JlYWNoIHQsJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpLF9mc19jb25maWdfZGlyc18kKHQpKQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSAkKGZvcmVhY2ggdCwkKGZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCksZnNfY29uZmlnX2RpcnNfJCh0KSkKIGluY2x1ZGUgJChCVUlMRF9QSE9OWV9QQUNLQUdFKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xNTksMTIyICs5Miw5IEBACiBMT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKIExPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKIExPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gJChmb3JlYWNoIHQsJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpLF9mc19jb25maWdfZmlsZXNfJCh0KSkKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gJChmb3JlYWNoIHQsJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpLGZzX2NvbmZpZ19maWxlc18kKHQpKQogaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHN5c3RlbS9ldGMvZnNfY29uZmlnX2RpcnMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19kaXJzIG9yIGZzX2NvbmZpZ19kaXJzX3N5c3RlbSB0byBQUk9EVUNUX1BBQ0tBR0VTIGluCi0jIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZGlyc19zeXN0ZW0KLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19kaXJzCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfUEFSVElUSU9OX0xJU1QgOj0gJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIHN5c3RlbSBcCi0JICAgLS1hbGwtcGFydGl0aW9ucyAiJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKFBSSVZBVEVfUEFSVElUSU9OX0xJU1QpKSIgXAotCSAgIC0tZGlycyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgc3lzdGVtL2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4KLSMgdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19maWxlc19zeXN0ZW0KLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1BBUlRJVElPTl9MSVNUIDo9ICQoZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0KQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBzeXN0ZW0gXAotCSAgIC0tYWxsLXBhcnRpdGlvbnMgIiQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChQUklWQVRFX1BBUlRJVElPTl9MSVNUKSkiIFwKLQkgICAtLWZpbGVzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi1pZm5lcSAoJChmaWx0ZXIgdmVuZG9yLCQoZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0KSksKQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgdmVuZG9yL2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZGlyc192ZW5kb3IKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19kaXJzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gdmVuZG9yIFwKLQkgICAtLWRpcnMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHZlbmRvci9ldGMvZnNfY29uZmlnX2ZpbGVzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZmlsZXMgb3IgZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSB0byBQUk9EVUNUX1BBQ0tBR0VTCi0jIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBfZnNfY29uZmlnX2ZpbGVzX3ZlbmRvcgotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2ZpbGVzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gdmVuZG9yIFwKLQkgICAtLWZpbGVzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi1lbmRpZgotCiBpZm5lcSAoJChmaWx0ZXIgb2VtLCQoZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0KSksKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBHZW5lcmF0ZSB0aGUgb2VtL2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldApAQCAtMjgyLDcgKzEwMiw3IEBACiAjIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX01PRFVMRSA6PSBfZnNfY29uZmlnX2RpcnNfb2VtCitMT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2RpcnNfb2VtCiBMT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKIExPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKIExPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKQEAgLTI5MCwxMCArMTEwLDEwIEBACiBMT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRU0pL2V0YwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChjYXBhYmlsaXR5X2hlYWRlcikKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoY2FwYWJpbGl0eV9oZWFkZXIpCiAJQG1rZGlyIC1wICQoZGlyICRAKQogCSQ8IGZzY29uZmlnIFwKIAkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCkBAIC0zMDksNyArMTI5LDcgQEAKICMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZmlsZXNfb2VtCitMT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzX29lbQogTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCiBMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCiBMT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCkBAIC0zMTcsMTAgKzEzNywxMCBAQAogTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX09FTSkvZXRjCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKGNhcGFiaWxpdHlfaGVhZGVyKQogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChjYXBhYmlsaXR5X2hlYWRlcikKIAlAbWtkaXIgLXAgJChkaXIgJEApCiAJJDwgZnNjb25maWcgXAogCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKQEAgLTMzMiw2MyArMTUyLDYgQEAKIAogZW5kaWYKIAotaWZuZXEgKCQoZmlsdGVyIG9kbSwkKGZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCkpLCkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIG9kbS9ldGMvZnNfY29uZmlnX2RpcnMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19kaXJzIG9yIGZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbSB0byBQUk9EVUNUX1BBQ0tBR0VTCi0jIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBfZnNfY29uZmlnX2RpcnNfb2RtCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZGlycwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX09ETSkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIG9kbSBcCi0JICAgLS1kaXJzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBvZG0vZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2ZpbGVzIG9yIGZzX2NvbmZpZ19maWxlc19ub25zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUwotIyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gX2ZzX2NvbmZpZ19maWxlc19vZG0KLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX09ETSkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIG9kbSBcCi0JICAgLS1maWxlcyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotZW5kaWYKLQogaWZuZXEgKCQoZmlsdGVyIHZlbmRvcl9kbGttLCQoZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0KSksKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBHZW5lcmF0ZSB0aGUgdmVuZG9yX2Rsa20vZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0CkBAIC0zOTYsNyArMTU5LDcgQEAKICMgdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZGlyc192ZW5kb3JfZGxrbQorTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19kaXJzX3ZlbmRvcl9kbGttCiBMT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKIExPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKIExPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKQEAgLTQwNCwxMCArMTY3LDEwIEBACiBMT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRExLTSkvZXRjCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKGNhcGFiaWxpdHlfaGVhZGVyKQogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChjYXBhYmlsaXR5X2hlYWRlcikKIAlAbWtkaXIgLXAgJChkaXIgJEApCiAJJDwgZnNjb25maWcgXAogCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKQEAgLTQyMyw3ICsxODYsNyBAQAogIyB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9NT0RVTEUgOj0gX2ZzX2NvbmZpZ19maWxlc192ZW5kb3JfZGxrbQorTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19maWxlc192ZW5kb3JfZGxrbQogTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCiBMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCiBMT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCkBAIC00MzEsMTAgKzE5NCwxMCBAQAogTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9ETEtNKS9ldGMKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoY2FwYWJpbGl0eV9oZWFkZXIpCiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKGNhcGFiaWxpdHlfaGVhZGVyKQogCUBta2RpciAtcCAkKGRpciAkQCkKIAkkPCBmc2NvbmZpZyBcCiAJICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXApAQCAtNDUzLDcgKzIxNiw3IEBACiAjIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX01PRFVMRSA6PSBfZnNfY29uZmlnX2RpcnNfb2RtX2Rsa20KK0xPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZGlyc19vZG1fZGxrbQogTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCiBMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCiBMT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCkBAIC00NjEsMTAgKzIyNCwxMCBAQAogTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19kaXJzCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfT0RNX0RMS00pL2V0YwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChjYXBhYmlsaXR5X2hlYWRlcikKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoY2FwYWJpbGl0eV9oZWFkZXIpCiAJQG1rZGlyIC1wICQoZGlyICRAKQogCSQ8IGZzY29uZmlnIFwKIAkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCkBAIC00ODAsNyArMjQzLDcgQEAKICMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZmlsZXNfb2RtX2Rsa20KK0xPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZmlsZXNfb2RtX2Rsa20KIExPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAogTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQogTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQpAQCAtNDg4LDEwICsyNTEsMTAgQEAKIExPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZmlsZXMKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRE1fRExLTSkvZXRjCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKGNhcGFiaWxpdHlfaGVhZGVyKQogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChjYXBhYmlsaXR5X2hlYWRlcikKIAlAbWtkaXIgLXAgJChkaXIgJEApCiAJJDwgZnNjb25maWcgXAogCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKQEAgLTUxMCw3ICsyNzMsNyBAQAogIyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9NT0RVTEUgOj0gX2ZzX2NvbmZpZ19kaXJzX3N5c3RlbV9kbGttCitMT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2RpcnNfc3lzdGVtX2Rsa20KIExPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAogTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQogTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQpAQCAtNTE4LDEwICsyODEsMTAgQEAKIExPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZGlycwogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKS9ldGMKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoY2FwYWJpbGl0eV9oZWFkZXIpCiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKGNhcGFiaWxpdHlfaGVhZGVyKQogCUBta2RpciAtcCAkKGRpciAkQCkKIAkkPCBmc2NvbmZpZyBcCiAJICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXApAQCAtNTM3LDcgKzMwMCw3IEBACiAjIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX01PRFVMRSA6PSBfZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9kbGttCitMT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9kbGttCiBMT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKIExPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKIExPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKQEAgLTU0NSwxMCArMzA4LDEwIEBACiBMT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2ZpbGVzCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU1lTVEVNX0RMS00pL2V0YwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChjYXBhYmlsaXR5X2hlYWRlcikKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoY2FwYWJpbGl0eV9oZWFkZXIpCiAJQG1rZGlyIC1wICQoZGlyICRAKQogCSQ8IGZzY29uZmlnIFwKIAkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCkBAIC01NjAsMTE4ICszMjMsNiBAQAogCiBlbmRpZgogCi1pZm5lcSAoJChCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRSkkKEJPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSwpCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBwcm9kdWN0L2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfcHJvZHVjdCB0byBQUk9EVUNUX1BBQ0tBR0VTIGluCi0jIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBfZnNfY29uZmlnX2RpcnNfcHJvZHVjdAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9QUk9EVUNUKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gcHJvZHVjdCBcCi0JICAgLS1kaXJzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBwcm9kdWN0L2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfcHJvZHVjdCB0byBQUk9EVUNUX1BBQ0tBR0VTIGluCi0jIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBfZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3QKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBwcm9kdWN0IFwKLQkgICAtLWZpbGVzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotZW5kaWYKLQotaWZuZXEgKCQoQk9BUkRfVVNFU19TWVNURU1fRVhUSU1BR0UpJChCT0FSRF9TWVNURU1fRVhUSU1BR0VfRklMRV9TWVNURU1fVFlQRSksKQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgc3lzdGVtX2V4dC9ldGMvZnNfY29uZmlnX2RpcnMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19kaXJzIG9yIGZzX2NvbmZpZ19kaXJzX3N5c3RlbV9leHQgdG8gUFJPRFVDVF9QQUNLQUdFUyBpbgotIyB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gX2ZzX2NvbmZpZ19kaXJzX3N5c3RlbV9leHQKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19kaXJzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU1lTVEVNX0VYVCkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIHN5c3RlbV9leHQgXAotCSAgIC0tZGlycyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgc3lzdGVtX2V4dC9ldGMvZnNfY29uZmlnX2ZpbGVzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZmlsZXMgb3IgZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9leHQgdG8gUFJPRFVDVF9QQUNLQUdFUyBpbgotIyB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gX2ZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0Ci1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZmlsZXMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gc3lzdGVtX2V4dCBcCi0JICAgLS1maWxlcyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLWVuZGlmCi0KLXN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnIDo9Ci1zeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIgOj0KK2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcgOj0KK2NhcGFiaWxpdHlfaGVhZGVyIDo9CiBmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QgOj0KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZzX2NvbmZpZy9mc19jb25maWcuYyBiL3Rvb2xzL2ZzX2NvbmZpZy9mc19jb25maWcuYwppbmRleCAyYTc1YWRkLi44MGJkM2MxIDEwMDY0NAotLS0gYS90b29scy9mc19jb25maWcvZnNfY29uZmlnLmMKKysrIGIvdG9vbHMvZnNfY29uZmlnL2ZzX2NvbmZpZy5jCkBAIC0yMiw5ICsyMiw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAotI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgotI2luY2x1ZGUgPHNlbGludXgvbGFiZWwuaD4KLQogI2luY2x1ZGUgInByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIgogI2luY2x1ZGUgInByaXZhdGUvZnNfY29uZmlnLmgiCiAKQEAgLTM1LDggKzMyLDggQEAKIC8vCiAvLyBBZnRlciB0aGUgZmlyc3QgNCBjb2x1bW5zLCBvcHRpb25hbCBrZXk9dmFsdWUgcGFpcnMgYXJlIGVtaXR0ZWQKIC8vIGZvciBlYWNoIGZpbGUuICBDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcga2V5cyBhcmUgc3VwcG9ydGVkOgotLy8gKiAtUzogc2VsYWJlbD1bc2VsaW51eF9sYWJlbF0KLS8vICogLUM6IGNhcGFiaWxpdGllcz1baGV4IGNhcGFiaWxpdGllcyB2YWx1ZV0KKy8vCisvLyAgIC1DOiBjYXBhYmlsaXRpZXM9W2hleCBjYXBhYmlsaXRpZXMgdmFsdWVdCiAvLwogLy8gRXhhbXBsZSBpbnB1dDoKIC8vCkBAIC00OCw0NSArNDUsMjQgQEAKIC8vICAgICAgc3lzdGVtL2V0Yy9kYnVzLmNvbmYgMTAwMiAxMDAyIDQ0MAogLy8gICAgICBkYXRhL2FwcCAxMDAwIDEwMDAgNzcxCiAvLwotLy8gICBvciBpZiwgZm9yIGV4YW1wbGUsIC1TIGlzIHVzZWQ6Ci0vLwotLy8gICAgICBzeXN0ZW0vZXRjL2RidXMuY29uZiAxMDAyIDEwMDIgNDQwIHNlbGFiZWw9dTpvYmplY3RfcjpzeXN0ZW1fZmlsZTpzMAotLy8gICAgICBkYXRhL2FwcCAxMDAwIDEwMDAgNzcxIHNlbGFiZWw9dTpvYmplY3RfcjphcGtfZGF0YV9maWxlOnMwCi0vLwogLy8gTm90ZSB0aGF0IHRoZSBvdXRwdXQgd2lsbCBvbWl0IHRoZSB0cmFpbGluZyBzbGFzaCBmcm9tCiAvLyBkaXJlY3Rvcmllcy4KIAotc3RhdGljIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSogZ2V0X3NlaG5kKGNvbnN0IGNoYXIqIGNvbnRleHRfZmlsZSkgewotICBzdHJ1Y3Qgc2VsaW51eF9vcHQgc2VvcHRzW10gPSB7IHsgU0VMQUJFTF9PUFRfUEFUSCwgY29udGV4dF9maWxlIH0gfTsKLSAgc3RydWN0IHNlbGFiZWxfaGFuZGxlKiBzZWhuZCA9IHNlbGFiZWxfb3BlbihTRUxBQkVMX0NUWF9GSUxFLCBzZW9wdHMsIDEpOwotCi0gIGlmICghc2VobmQpIHsKLSAgICBwZXJyb3IoImVycm9yIHJ1bm5pbmcgc2VsYWJlbF9vcGVuIik7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9Ci0gIHJldHVybiBzZWhuZDsKLX0KLQogc3RhdGljIHZvaWQgdXNhZ2UoKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGZzX2NvbmZpZyBbLUQgcHJvZHVjdF9vdXRfcGF0aF0gWy1TIGNvbnRleHRfZmlsZV0gWy1SIHJvb3RdIFstQ11cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBmc19jb25maWcgWy1EIHByb2R1Y3Rfb3V0X3BhdGhdIFstUiByb290XSBbLUNdXG4iKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgIGNoYXIgYnVmZmVyWzEwMjRdOwotICBjb25zdCBjaGFyKiBjb250ZXh0X2ZpbGUgPSBOVUxMOwogICBjb25zdCBjaGFyKiBwcm9kdWN0X291dF9wYXRoID0gTlVMTDsKICAgY2hhciogcm9vdF9wYXRoID0gTlVMTDsKLSAgc3RydWN0IHNlbGFiZWxfaGFuZGxlKiBzZWhuZCA9IE5VTEw7CiAgIGludCBwcmludF9jYXBhYmlsaXRpZXMgPSAwOwogICBpbnQgb3B0OwotICB3aGlsZSgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJDUzpSOkQ6IikpICE9IC0xKSB7CisgIHdoaWxlKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgIkNSOkQ6IikpICE9IC0xKSB7CiAgICAgc3dpdGNoKG9wdCkgewogICAgIGNhc2UgJ0MnOgogICAgICAgcHJpbnRfY2FwYWJpbGl0aWVzID0gMTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1MnOgotICAgICAgY29udGV4dF9maWxlID0gb3B0YXJnOwotICAgICAgYnJlYWs7CiAgICAgY2FzZSAnUic6CiAgICAgICByb290X3BhdGggPSBvcHRhcmc7CiAgICAgICBicmVhazsKQEAgLTk5LDEwICs3NSw2IEBACiAgICAgfQogICB9CiAKLSAgaWYgKGNvbnRleHRfZmlsZSAhPSBOVUxMKSB7Ci0gICAgc2VobmQgPSBnZXRfc2VobmQoY29udGV4dF9maWxlKTsKLSAgfQotCiAgIGlmIChyb290X3BhdGggIT0gTlVMTCkgewogICAgIHNpemVfdCByb290X2xlbiA9IHN0cmxlbihyb290X3BhdGgpOwogICAgIC8qIFRyaW0gYW55IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSB0aGUgcm9vdCBwYXRoLiAqLwpAQCAtMTQxLDMzICsxMTMsNiBAQAogICAgIH0KICAgICBwcmludGYoIiVzICVkICVkICVvIiwgYnVmZmVyLCB1aWQsIGdpZCwgbW9kZSk7CiAKLSAgICBpZiAoc2VobmQgIT0gTlVMTCkgewotICAgICAgc2l6ZV90IGJ1ZmZlcl9zdHJsZW4gPSBzdHJubGVuKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgaWYgKGJ1ZmZlcl9zdHJsZW4gPj0gc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJub24gbnVsbCB0ZXJtaW5hdGVkIGJ1ZmZlciwgYWJvcnRpbmdcbiIpOwotICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgICB9Ci0gICAgICBzaXplX3QgZnVsbF9uYW1lX3NpemUgPSBidWZmZXJfc3RybGVuICsgMjsKLSAgICAgIGNoYXIqIGZ1bGxfbmFtZSA9IChjaGFyKikgbWFsbG9jKGZ1bGxfbmFtZV9zaXplKTsKLSAgICAgIGlmIChmdWxsX25hbWUgPT0gTlVMTCkgewotICAgICAgICBwZXJyb3IoIm1hbGxvYyIpOwotICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgICB9Ci0KLSAgICAgIGZ1bGxfbmFtZVswXSA9ICcvJzsKLSAgICAgIHN0cm5jcHkoZnVsbF9uYW1lICsgMSwgYnVmZmVyLCBmdWxsX25hbWVfc2l6ZSAtIDEpOwotICAgICAgZnVsbF9uYW1lW2Z1bGxfbmFtZV9zaXplIC0gMV0gPSAnXDAnOwotCi0gICAgICBjaGFyKiBzZWNvbnRleHQ7Ci0gICAgICBpZiAoc2VsYWJlbF9sb29rdXAoc2VobmQsICZzZWNvbnRleHQsIGZ1bGxfbmFtZSwgKCBtb2RlIHwgKGlzX2RpciA/IFNfSUZESVIgOiBTX0lGUkVHKSkpKSB7Ci0gICAgICAgIHNlY29udGV4dCA9IHN0cmR1cCgidTpvYmplY3Rfcjp1bmxhYmVsZWQ6czAiKTsKLSAgICAgIH0KLQotICAgICAgcHJpbnRmKCIgc2VsYWJlbD0lcyIsIHNlY29udGV4dCk7Ci0gICAgICBmcmVlKGZ1bGxfbmFtZSk7Ci0gICAgICBmcmVlY29uKHNlY29udGV4dCk7Ci0gICAgfQotCiAgICAgaWYgKHByaW50X2NhcGFiaWxpdGllcykgewogICAgICAgcHJpbnRmKCIgY2FwYWJpbGl0aWVzPTB4JSIgUFJJeDY0LCBjYXBhYmlsaXRpZXMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZzX2dldF9zdGF0cy9BbmRyb2lkLmJwIGIvdG9vbHMvZnNfZ2V0X3N0YXRzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OTc5OTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZnNfZ2V0X3N0YXRzL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAotfQotCi1jY19iaW5hcnlfaG9zdCB7Ci0gICAgbmFtZTogImZzX2dldF9zdGF0cyIsCi0gICAgc3JjczogWyJmc19nZXRfc3RhdHMuYyJdLAotICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS90b29scy9mc19nZXRfc3RhdHMvZnNfZ2V0X3N0YXRzLmMgYi90b29scy9mc19nZXRfc3RhdHMvZnNfZ2V0X3N0YXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZWYwZTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZnNfZ2V0X3N0YXRzL2ZzX2dldF9zdGF0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2ZzX2NvbmZpZy5oPgotCi0jZGVmaW5lIERPX0RFQlVHIDEKLQotI2RlZmluZSBFUlJPUihmbXQsYXJncy4uLikgXAotCWRvIHsgXAotCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiBFUlJPUjogIiBmbXQsICBcCi0JCSAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjI2FyZ3MpOyAgICBcCi0JfSB3aGlsZSAoMCkKLQotI2lmIERPX0RFQlVHCi0jZGVmaW5lIERFQlVHKGZtdCxhcmdzLi4uKSBcCi0JZG8geyBmcHJpbnRmKHN0ZGVyciwgIkRFQlVHOiAiIGZtdCwgIyNhcmdzKTsgfSB3aGlsZSgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUcoeC4uLikgICAgICAgICAgICAgICBkbyB7fSB3aGlsZSgwKQotI2VuZGlmCi0KLXZvaWQKLXByaW50X2hlbHAodm9pZCkKLXsKLQlmcHJpbnRmKHN0ZGVyciwgImZzX2dldF9zdGF0czogcmV0cmlldmUgdGhlIHRhcmdldCBmaWxlIHN0YXRzICIKLQkgICAgICAgICJmb3IgdGhlIHNwZWNpZmllZCBmaWxlXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBmc19nZXRfc3RhdHMgY3VyX3Blcm1zIGlzX2RpciBmaWxlbmFtZSB0YXJnZXRvdXRcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXHRjdXJfcGVybXMgLSBUaGUgY3VycmVudCBwZXJtaXNzaW9ucyBvZiAiCi0JICAgICAgICAidGhlIGZpbGVcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXHRpc19kaXIgICAgLSBJcyBmaWxlbmFtZSBpcyBhIGRpciwgMS4gT3RoZXJ3aXNlLCAwLlxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJcdGZpbGVuYW1lICAtIFRoZSBmaWxlbmFtZSB0byBsb29rdXBcbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXHR0YXJnZXRvdXQgLSBUaGUgdGFyZ2V0IG91dCBwYXRoIHRvIHF1ZXJ5IGRldmljZSBzcGVjaWZpYyBGUyBjb25maWdzXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQotewotCWNoYXIgKmVuZHB0cjsKLQljaGFyIGlzX2RpciA9IDA7Ci0JdW5zaWduZWQgcGVybXMgPSAwOwotCXVuc2lnbmVkIHVpZCA9ICh1bnNpZ25lZCktMTsKLQl1bnNpZ25lZCBnaWQgPSAodW5zaWduZWQpLTE7Ci0KLQlpZiAoYXJnYyA8IDUpIHsKLQkJRVJST1IoIkludmFsaWQgYXJndW1lbnRzXG4iKTsKLQkJcHJpbnRfaGVscCgpOwotCQlleGl0KC0xKTsKLQl9Ci0KLQlwZXJtcyA9ICh1bnNpZ25lZClzdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwdHIsIDApOwotCWlmICghZW5kcHRyIHx8IChlbmRwdHIgPT0gYXJndlsxXSkgfHwgKCplbmRwdHIgIT0gJ1wwJykpIHsKLQkJRVJST1IoImN1cnJlbnQgcGVybWlzc2lvbnMgbXVzdCBiZSBhIG51bWJlci4gR290ICclcycuXG4iLCBhcmd2WzFdKTsKLQkJZXhpdCgtMSk7Ci0JfQotCi0JaWYgKCFzdHJjbXAoYXJndlsyXSwgIjEiKSkKLQkJaXNfZGlyID0gMTsKLQotCXVpbnQ2NF90IGNhcGFiaWxpdGllczsKLQlmc19jb25maWcoYXJndlszXSwgaXNfZGlyLCBhcmd2WzRdLCAmdWlkLCAmZ2lkLCAmcGVybXMsICZjYXBhYmlsaXRpZXMpOwotCWZwcmludGYoc3Rkb3V0LCAiJWQgJWQgMCVvXG4iLCB1aWQsIGdpZCwgcGVybXMpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvT1dORVJTIGIvdG9vbHMvaWRlX3F1ZXJ5L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTRhOWEyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L09XTkVSUwpAQCAtMCwwICsxLDQgQEAKK2lhbGl5ZXZAZ29vZ2xlLmNvbQoraXZhbmtpcmljaGVua29AZ29vZ2xlLmNvbQora2FkaXJjZXRAZ29vZ2xlLmNvbQorbWljaGFlbG1lcmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL0FuZHJvaWQuYnAgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVkNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJpZGVfcXVlcnlfY2NfYW5hbHl6ZXJfZGVmYXVsdHMiLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICI2NCIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxsdm0tYnVpbGQtaG9zdC10b29scy1kZWZhdWx0cyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgLy8gTExWTSBTb3VyY2VzIGRvIGhhdmUgdW51c2VkIHBhcmFtZXRlcnMgOigKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgaG9zdDogeworICAgICAgICAgICAgY3BwZmxhZ3M6IFsKKyAgICAgICAgICAgICAgICAiLWZuby1ydHRpIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfbGlicmFyeV9ob3N0X3N0YXRpYyB7CisgICAgbmFtZTogImJ1aWx0aW5faGVhZGVycyIsCisgICAgc3JjczogWyJidWlsdGluX2hlYWRlcnMuY2MiXSwKKyAgICBnZW5lcmF0ZWRfaGVhZGVyczogWyJjbGFuZ19idWlsdGluX2hlYWRlcnNfcmVzb3VyY2VzIl0sCisgICAgZGVmYXVsdHM6IFsiaWRlX3F1ZXJ5X2NjX2FuYWx5emVyX2RlZmF1bHRzIl0sCit9CisKK2NjX2xpYnJhcnlfaG9zdF9zdGF0aWMgeworICAgIG5hbWU6ICJpbmNsdWRlX3NjYW5uZXIiLAorICAgIHNyY3M6IFsiaW5jbHVkZV9zY2FubmVyLmNjIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliY2xhbmctY3BwX2hvc3QiXSwKKyAgICBzdGF0aWNfbGliczogWyJidWlsdGluX2hlYWRlcnMiXSwKKyAgICBkZWZhdWx0czogWyJpZGVfcXVlcnlfY2NfYW5hbHl6ZXJfZGVmYXVsdHMiXSwKK30KKworY2NfbGlicmFyeV9ob3N0X3N0YXRpYyB7CisgICAgbmFtZTogImFuYWx5emVyIiwKKyAgICBzcmNzOiBbImFuYWx5emVyLmNjIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliY2xhbmctY3BwX2hvc3QiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiaW5jbHVkZV9zY2FubmVyIiwKKyAgICAgICAgImNjX2FuYWx5emVyX3Byb3RvIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbImlkZV9xdWVyeV9jY19hbmFseXplcl9kZWZhdWx0cyJdLAorfQorCitjY19iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImlkZV9xdWVyeV9jY19hbmFseXplciIsCisgICAgZGVmYXVsdHM6IFsiaWRlX3F1ZXJ5X2NjX2FuYWx5emVyX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJtYWluLmNjIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNsYW5nLWNwcF9ob3N0IiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1mdWxsIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJjY19hbmFseXplcl9wcm90byIsCisgICAgICAgICJidWlsdGluX2hlYWRlcnMiLAorICAgICAgICAiaW5jbHVkZV9zY2FubmVyIiwKKyAgICAgICAgImFuYWx5emVyIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2FuYWx5emVyLmNjIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2FuYWx5emVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjY2VjNTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYW5hbHl6ZXIuY2MKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgImFuYWx5emVyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY2NfYW5hbHl6ZXIucGIuaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0pTT05Db21waWxhdGlvbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZV9zY2FubmVyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ZpcnR1YWxGaWxlU3lzdGVtLmgiCisKK25hbWVzcGFjZSB0b29sczo6aWRlX3F1ZXJ5OjpjY19hbmFseXplciB7CituYW1lc3BhY2UgeworbGx2bTo6RXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPGNsYW5nOjp0b29saW5nOjpDb21waWxhdGlvbkRhdGFiYXNlPj4gTG9hZENvbXBEQigKKyAgICBsbHZtOjpTdHJpbmdSZWYgY29tcF9kYl9wYXRoKSB7CisgIHN0ZDo6c3RyaW5nIGVycjsKKyAgc3RkOjp1bmlxdWVfcHRyPGNsYW5nOjp0b29saW5nOjpDb21waWxhdGlvbkRhdGFiYXNlPiBkYiA9CisgICAgICBjbGFuZzo6dG9vbGluZzo6SlNPTkNvbXBpbGF0aW9uRGF0YWJhc2U6OmxvYWRGcm9tRmlsZSgKKyAgICAgICAgICBjb21wX2RiX3BhdGgsIGVyciwgY2xhbmc6OnRvb2xpbmc6OkpTT05Db21tYW5kTGluZVN5bnRheDo6QXV0b0RldGVjdCk7CisgIGlmICghZGIpIHsKKyAgICByZXR1cm4gbGx2bTo6Y3JlYXRlU3RyaW5nRXJyb3IobGx2bTo6aW5jb252ZXJ0aWJsZUVycm9yQ29kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxvYWQgQ0RCOiAiICsgZXJyKTsKKyAgfQorICAvLyBQcm92aWRlIHNvbWUgaGV1cmlzdGljIHN1cHBvcnQgZm9yIG1pc3NpbmcgZmlsZXMuCisgIHJldHVybiBpbmZlck1pc3NpbmdDb21waWxlQ29tbWFuZHMoc3RkOjptb3ZlKGRiKSk7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworOjpjY19hbmFseXplcjo6RGVwc1Jlc3BvbnNlIEdldERlcHMoOjpjY19hbmFseXplcjo6UmVwb1N0YXRlIHN0YXRlKSB7CisgIDo6Y2NfYW5hbHl6ZXI6OkRlcHNSZXNwb25zZSByZXN1bHRzOworICBhdXRvIGRiID0gTG9hZENvbXBEQihzdGF0ZS5jb21wX2RiX3BhdGgoKSk7CisgIGlmICghZGIpIHsKKyAgICByZXN1bHRzLm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CisgICAgcmVzdWx0cy5tdXRhYmxlX3N0YXR1cygpLT5zZXRfbWVzc2FnZShsbHZtOjp0b1N0cmluZyhkYi50YWtlRXJyb3IoKSkpOworICAgIHJldHVybiByZXN1bHRzOworICB9CisgIGZvciAobGx2bTo6U3RyaW5nUmVmIGFjdGl2ZV9maWxlIDogc3RhdGUuYWN0aXZlX2ZpbGVfcGF0aCgpKSB7CisgICAgYXV0byYgcmVzdWx0ID0gKnJlc3VsdHMuYWRkX2RlcHMoKTsKKworICAgIGxsdm06OlNtYWxsU3RyaW5nPDI1Nj4gYWJzX2ZpbGUoc3RhdGUucmVwb19kaXIoKSk7CisgICAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoYWJzX2ZpbGUsIGFjdGl2ZV9maWxlKTsKKyAgICBhdXRvIGNtZHMgPSBkYi0+Z2V0KCktPmdldENvbXBpbGVDb21tYW5kcyhhY3RpdmVfZmlsZSk7CisgICAgaWYgKGNtZHMuZW1wdHkoKSkgeworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CisgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UoCisgICAgICAgICAgbGx2bTo6VHdpbmUoIkNhbid0IGZpbmQgY29tcGlsZSBmbGFncyBmb3IgZmlsZTogIiwgYWJzX2ZpbGUpLnN0cigpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICByZXN1bHQuc2V0X3NvdXJjZV9maWxlKGFjdGl2ZV9maWxlLnN0cigpKTsKKyAgICBsbHZtOjpTdHJpbmdSZWYgZmlsZSA9IGNtZHNbMF0uRmlsZW5hbWU7CisgICAgaWYgKGxsdm06OlN0cmluZ1JlZiBhY3R1YWxfZmlsZShjbWRzWzBdLkhldXJpc3RpYyk7CisgICAgICAgIGFjdHVhbF9maWxlLmNvbnN1bWVfZnJvbnQoImluZmVycmVkIGZyb20gIikpIHsKKyAgICAgIGZpbGUgPSBhY3R1YWxfZmlsZTsKKyAgICB9CisgICAgLy8gVE9ETzogUXVlcnkgbmluamEgZ3JhcGggdG8gZmlndXJlIG91dCBhIG1pbmltYWwgc2V0IG9mIHRhcmdldHMgdG8gYnVpbGQuCisgICAgcmVzdWx0LmFkZF9idWlsZF90YXJnZXQoZmlsZS5zdHIoKSArICJeIik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdHM7Cit9CisKKzo6Y2NfYW5hbHl6ZXI6OklkZUFuYWx5c2lzIEdldEJ1aWxkSW5wdXRzKDo6Y2NfYW5hbHl6ZXI6OlJlcG9TdGF0ZSBzdGF0ZSkgeworICBhdXRvIGRiID0gTG9hZENvbXBEQihzdGF0ZS5jb21wX2RiX3BhdGgoKSk7CisgIDo6Y2NfYW5hbHl6ZXI6OklkZUFuYWx5c2lzIHJlc3VsdHM7CisgIGlmICghZGIpIHsKKyAgICByZXN1bHRzLm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CisgICAgcmVzdWx0cy5tdXRhYmxlX3N0YXR1cygpLT5zZXRfbWVzc2FnZShsbHZtOjp0b1N0cmluZyhkYi50YWtlRXJyb3IoKSkpOworICAgIHJldHVybiByZXN1bHRzOworICB9CisgIHN0ZDo6c3RyaW5nIHJlcG9fZGlyID0gc3RhdGUucmVwb19kaXIoKTsKKyAgaWYgKCFyZXBvX2Rpci5lbXB0eSgpICYmIHJlcG9fZGlyLmJhY2soKSA9PSAnLycpIHJlcG9fZGlyLnBvcF9iYWNrKCk7CisKKyAgbGx2bTo6U21hbGxTdHJpbmc8MjU2PiBnZW5maWxlX3Jvb3RfYWJzKHJlcG9fZGlyKTsKKyAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoZ2VuZmlsZV9yb290X2Ficywgc3RhdGUub3V0X2RpcigpKTsKKyAgaWYgKGdlbmZpbGVfcm9vdF9hYnMuZW1wdHkoKSB8fCBnZW5maWxlX3Jvb3RfYWJzLmJhY2soKSAhPSAnLycpIHsKKyAgICBnZW5maWxlX3Jvb3RfYWJzLnB1c2hfYmFjaygnLycpOworICB9CisKKyAgZm9yIChsbHZtOjpTdHJpbmdSZWYgYWN0aXZlX2ZpbGUgOiBzdGF0ZS5hY3RpdmVfZmlsZV9wYXRoKCkpIHsKKyAgICBhdXRvJiByZXN1bHQgPSAqcmVzdWx0cy5hZGRfc291cmNlcygpOworICAgIHJlc3VsdC5zZXRfcGF0aChhY3RpdmVfZmlsZS5zdHIoKSk7CisKKyAgICBsbHZtOjpTbWFsbFN0cmluZzwyNTY+IGFic19maWxlKHJlcG9fZGlyKTsKKyAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChhYnNfZmlsZSwgYWN0aXZlX2ZpbGUpOworICAgIGF1dG8gY21kcyA9IGRiLT5nZXQoKS0+Z2V0Q29tcGlsZUNvbW1hbmRzKGFic19maWxlKTsKKyAgICBpZiAoY21kcy5lbXB0eSgpKSB7CisgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjpjY19hbmFseXplcjo6U3RhdHVzOjpGQUlMVVJFKTsKKyAgICAgIHJlc3VsdC5tdXRhYmxlX3N0YXR1cygpLT5zZXRfbWVzc2FnZSgKKyAgICAgICAgICBsbHZtOjpUd2luZSgiQ2FuJ3QgZmluZCBjb21waWxlIGZsYWdzIGZvciBmaWxlOiAiLCBhYnNfZmlsZSkuc3RyKCkpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGNvbnN0IGF1dG8mIGNtZCA9IGNtZHMuZnJvbnQoKTsKKyAgICBsbHZtOjpTdHJpbmdSZWYgd29ya2luZ19kaXIgPSBjbWQuRGlyZWN0b3J5OworICAgIGlmICghd29ya2luZ19kaXIuY29uc3VtZV9mcm9udChyZXBvX2RpcikpIHsKKyAgICAgIHJlc3VsdC5tdXRhYmxlX3N0YXR1cygpLT5zZXRfY29kZSg6OmNjX2FuYWx5emVyOjpTdGF0dXM6OkZBSUxVUkUpOworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9tZXNzYWdlKCJDb21tYW5kIHdvcmtpbmcgZGlyICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdfZGlyLnN0cigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG91dHNpZGUgcmVwb3NpdG9yeSAiICsgcmVwb19kaXIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHdvcmtpbmdfZGlyID0gd29ya2luZ19kaXIubHRyaW0oJy8nKTsKKyAgICByZXN1bHQuc2V0X3dvcmtpbmdfZGlyKHdvcmtpbmdfZGlyLnN0cigpKTsKKyAgICBmb3IgKGF1dG8mIGFyZyA6IGNtZC5Db21tYW5kTGluZSkgcmVzdWx0LmFkZF9jb21waWxlcl9hcmd1bWVudHMoYXJnKTsKKworICAgIGF1dG8gaW5jbHVkZXMgPQorICAgICAgICBTY2FuSW5jbHVkZXMoY21kcy5mcm9udCgpLCBsbHZtOjp2ZnM6OmNyZWF0ZVBoeXNpY2FsRmlsZVN5c3RlbSgpKTsKKyAgICBpZiAoIWluY2x1ZGVzKSB7CisgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjpjY19hbmFseXplcjo6U3RhdHVzOjpGQUlMVVJFKTsKKyAgICAgIHJlc3VsdC5tdXRhYmxlX3N0YXR1cygpLT5zZXRfbWVzc2FnZSgKKyAgICAgICAgICBsbHZtOjp0b1N0cmluZyhpbmNsdWRlcy50YWtlRXJyb3IoKSkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBbcmVxX2lucHV0LCBjb250ZW50c10gOiAqaW5jbHVkZXMpIHsKKyAgICAgIGxsdm06OlN0cmluZ1JlZiByZXFfaW5wdXRfcmVmKHJlcV9pbnB1dCk7CisgICAgICAvLyBXZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gZ2VuZXJhdGVkIGZpbGVzLgorICAgICAgaWYgKCFyZXFfaW5wdXRfcmVmLmNvbnN1bWVfZnJvbnQoZ2VuZmlsZV9yb290X2FicykpIGNvbnRpbnVlOworICAgICAgYXV0byYgZ2VuZmlsZSA9ICpyZXN1bHQuYWRkX2dlbmVyYXRlZCgpOworICAgICAgZ2VuZmlsZS5zZXRfcGF0aChyZXFfaW5wdXRfcmVmLnN0cigpKTsKKyAgICAgIGdlbmZpbGUuc2V0X2NvbnRlbnRzKHN0ZDo6bW92ZShjb250ZW50cykpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0czsKK30KK30gIC8vIG5hbWVzcGFjZSB0b29sczo6aWRlX3F1ZXJ5OjpjY19hbmFseXplcgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2FuYWx5emVyLmggYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYW5hbHl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDE5MDgyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2FuYWx5emVyLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RPT0xTX0lERV9RVUVSWV9DQ19BTkFMWVpFUl9BTkFMWVpFUl9IXworI2RlZmluZSBfVE9PTFNfSURFX1FVRVJZX0NDX0FOQUxZWkVSX0FOQUxZWkVSX0hfCisKKyNpbmNsdWRlICJjY19hbmFseXplci5wYi5oIgorCituYW1lc3BhY2UgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXIgeworCisvLyBTY2FucyB0aGUgYnVpbGQgZ3JhcGggYW5kIHJldHVybnMgdGFyZ2V0IG5hbWVzIGZyb20gdGhlIGJ1aWxkIGdyYXBoIHRvCisvLyBnZW5lcmF0ZSBhbGwgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhlIGFjdGl2ZSBmaWxlcy4KKzo6Y2NfYW5hbHl6ZXI6OkRlcHNSZXNwb25zZSBHZXREZXBzKDo6Y2NfYW5hbHl6ZXI6OlJlcG9TdGF0ZSBzdGF0ZSk7CisKKy8vIFNjYW5zIHRoZSBzb3VyY2VzIGFuZCByZXR1cm5zIGFsbCB0aGUgc291cmNlIGZpbGVzIHJlcXVpcmVkIGZvciBhbmFseXppbmcgdGhlCisvLyBhY3RpdmUgZmlsZXMuCis6OmNjX2FuYWx5emVyOjpJZGVBbmFseXNpcyBHZXRCdWlsZElucHV0cyg6OmNjX2FuYWx5emVyOjpSZXBvU3RhdGUgc3RhdGUpOworCit9ICAvLyBuYW1lc3BhY2UgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXIKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYnVpbHRpbl9oZWFkZXJzLmNjIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2J1aWx0aW5faGVhZGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDQ0Y2U3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2J1aWx0aW5faGVhZGVycy5jYwpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJidWlsdGluX2hlYWRlcnMuaCIKKworI2luY2x1ZGUgPGNzdGRkZWY+CisKKyNpbmNsdWRlICJjbGFuZ19idWlsdGluX2hlYWRlcnNfcmVzb3VyY2VzLmluYyIKKworY29uc3Qgc3RydWN0IEZpbGVUb2MgKmJ1aWx0aW5faGVhZGVyc19jcmVhdGUoKSB7IHJldHVybiBrUGFja2VkRmlsZXM7IH0KK3NpemVfdCBidWlsdGluX2hlYWRlcnNfc2l6ZSgpIHsKKyAgcmV0dXJuIHNpemVvZihrUGFja2VkRmlsZXMpIC8gc2l6ZW9mKEZpbGVUb2MpIC0gMTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9idWlsdGluX2hlYWRlcnMuaCBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9idWlsdGluX2hlYWRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGE3MjJmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2J1aWx0aW5faGVhZGVycy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVE9PTFNfSURFX1FVRVJZX0NDX0FOQUxZWkVSX0JVSUxUSU5fSEVBREVSU19IXworI2RlZmluZSBfVE9PTFNfSURFX1FVRVJZX0NDX0FOQUxZWkVSX0JVSUxUSU5fSEVBREVSU19IXworCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworc3RydWN0IEZpbGVUb2MgeworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICpkYXRhOworfTsKKworY29uc3Qgc3RydWN0IEZpbGVUb2MgKmJ1aWx0aW5faGVhZGVyc19jcmVhdGUoKTsKK3NpemVfdCBidWlsdGluX2hlYWRlcnNfc2l6ZSgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9pbmNsdWRlX3NjYW5uZXIuY2MgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvaW5jbHVkZV9zY2FubmVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTZhM2UKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvaW5jbHVkZV9zY2FubmVyLmNjCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJpbmNsdWRlX3NjYW5uZXIuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJ1aWx0aW5faGVhZGVycy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0ZpbGVFbnRyeS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0ZpbGVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTW9kdWxlLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvQVNUVW5pdC5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvbXBpbGVySW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvUFBDYWxsYmFja3MuaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0FyZ3VtZW50c0FkanVzdGVycy5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZS5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvVG9vbGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WaXJ0dWFsRmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXIgeworbmFtZXNwYWNlIHsKK3N0ZDo6c3RyaW5nIENsZWFuUGF0aChsbHZtOjpTdHJpbmdSZWYgcGF0aCkgeworICAvLyBib3RoIC4vIGFuZCAuLi8gaGFzIGAuL2AgaW4gdGhlbS4KKyAgaWYgKCFwYXRoLmNvbnRhaW5zKCIuLyIpKSByZXR1cm4gcGF0aC5zdHIoKTsKKyAgbGx2bTo6U21hbGxTdHJpbmc8MjU2PiBjbGVhbl9wYXRoKHBhdGgpOworICBsbHZtOjpzeXM6OnBhdGg6OnJlbW92ZV9kb3RzKGNsZWFuX3BhdGgsIC8qcmVtb3ZlX2RvdF9kb3Q9Ki90cnVlKTsKKyAgcmV0dXJuIGNsZWFuX3BhdGguc3RyKCkuc3RyKCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggdG8gZmlsZV9uYW1lLCB0cmVhdGluZyBpdCBhcyByZWxhdGl2ZSB0byBjd2QgaWYgaXQKKy8vIGlzbid0IGFscmVhZHkgYWJzb2x1dGUuCitzdGQ6OnN0cmluZyBHZXRBYnNvbHV0ZVBhdGgobGx2bTo6U3RyaW5nUmVmIGN3ZCwgbGx2bTo6U3RyaW5nUmVmIGZpbGVfbmFtZSkgeworICBpZiAobGx2bTo6c3lzOjpwYXRoOjppc19hYnNvbHV0ZShmaWxlX25hbWUpKSByZXR1cm4gQ2xlYW5QYXRoKGZpbGVfbmFtZSk7CisgIGxsdm06OlNtYWxsU3RyaW5nPDI1Nj4gYWJzX3BhdGgoY3dkKTsKKyAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoYWJzX3BhdGgsIGZpbGVfbmFtZSk7CisgIGxsdm06OnN5czo6cGF0aDo6cmVtb3ZlX2RvdHMoYWJzX3BhdGgsIC8qcmVtb3ZlX2RvdF9kb3Q9Ki90cnVlKTsKKyAgcmV0dXJuIGFic19wYXRoLnN0cigpLnN0cigpOworfQorCitjbGFzcyBJbmNsdWRlUmVjb3JkaW5nUFAgOiBwdWJsaWMgY2xhbmc6OlBQQ2FsbGJhY2tzIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEluY2x1ZGVSZWNvcmRpbmdQUCgKKyAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZhYnNfcGF0aHMsIHN0ZDo6c3RyaW5nIGN3ZCwKKyAgICAgIGNvbnN0IGNsYW5nOjpTb3VyY2VNYW5hZ2VyICZzbSkKKyAgICAgIDogYWJzX3BhdGhzXyhhYnNfcGF0aHMpLCBjd2RfKHN0ZDo6bW92ZShjd2QpKSwgc21fKHNtKSB7fQorCisgIHZvaWQgTGV4ZWRGaWxlQ2hhbmdlZChjbGFuZzo6RmlsZUlEIEZJRCwgTGV4ZWRGaWxlQ2hhbmdlUmVhc29uIFJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nOjpTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBGaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nOjpGaWxlSUQgUHJldkZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nOjpTb3VyY2VMb2NhdGlvbiBMb2MpIG92ZXJyaWRlIHsKKyAgICBhdXRvIGZpbGVfZW50cnkgPSBzbV8uZ2V0RmlsZUVudHJ5UmVmRm9ySUQoRklEKTsKKyAgICBpZiAoIWZpbGVfZW50cnkpIHJldHVybjsKKyAgICBhdXRvIGFic19wYXRoID0gR2V0QWJzb2x1dGVQYXRoKGN3ZF8sIGZpbGVfZW50cnktPmdldE5hbWUoKSk7CisgICAgYXV0byBbaXQsIGluc2VydGVkXSA9IGFic19wYXRoc18udHJ5X2VtcGxhY2UoYWJzX3BhdGgpOworICAgIGlmIChpbnNlcnRlZCkgaXQtPnNlY29uZCA9IHNtXy5nZXRCdWZmZXJEYXRhKEZJRCk7CisgIH0KKworICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmYWJzX3BhdGhzXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgY3dkXzsKKyAgY29uc3QgY2xhbmc6OlNvdXJjZU1hbmFnZXIgJnNtXzsKK307CisKK2NsYXNzIEluY2x1ZGVTY2FubmluZ0FjdGlvbiBmaW5hbCA6IHB1YmxpYyBjbGFuZzo6UHJlcHJvY2Vzc09ubHlBY3Rpb24geworIHB1YmxpYzoKKyAgZXhwbGljaXQgSW5jbHVkZVNjYW5uaW5nQWN0aW9uKAorICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJmFic19wYXRocykKKyAgICAgIDogYWJzX3BhdGhzXyhhYnNfcGF0aHMpIHt9CisgIGJvb2wgQmVnaW5Tb3VyY2VGaWxlQWN0aW9uKGNsYW5nOjpDb21waWxlckluc3RhbmNlICZjaSkgb3ZlcnJpZGUgeworICAgIHN0ZDo6c3RyaW5nIGN3ZDsKKyAgICBhdXRvIGN3ZF9vcl9lcnIgPSBjaS5nZXRWaXJ0dWFsRmlsZVN5c3RlbSgpLmdldEN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KCk7CisgICAgaWYgKCFjd2Rfb3JfZXJyIHx8IGN3ZF9vcl9lcnIuZ2V0KCkuZW1wdHkoKSkgcmV0dXJuIGZhbHNlOworICAgIGN3ZCA9IGN3ZF9vcl9lcnIuZ2V0KCk7CisgICAgY2kuZ2V0UHJlcHJvY2Vzc29yKCkuYWRkUFBDYWxsYmFja3Moc3RkOjptYWtlX3VuaXF1ZTxJbmNsdWRlUmVjb3JkaW5nUFA+KAorICAgICAgICBhYnNfcGF0aHNfLCBzdGQ6Om1vdmUoY3dkKSwgY2kuZ2V0U291cmNlTWFuYWdlcigpKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZhYnNfcGF0aHNfOworfTsKKworbGx2bTo6SW50cnVzaXZlUmVmQ250UHRyPGxsdm06OnZmczo6RmlsZVN5c3RlbT4gT3ZlcmxheUJ1aWx0aW5IZWFkZXJzKAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmYXJndiwKKyAgICBsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8bGx2bTo6dmZzOjpGaWxlU3lzdGVtPiBiYXNlKSB7CisgIHN0YXRpYyBjb25zdGV4cHIgbGx2bTo6U3RyaW5nTGl0ZXJhbCBrUmVzb3VyY2VEaXIgPSAiL3Jlc291cmNlcyI7CisgIGxsdm06OkludHJ1c2l2ZVJlZkNudFB0cjxsbHZtOjp2ZnM6Ok92ZXJsYXlGaWxlU3lzdGVtPiBvdmVybGF5KAorICAgICAgbmV3IGxsdm06OnZmczo6T3ZlcmxheUZpbGVTeXN0ZW0oc3RkOjptb3ZlKGJhc2UpKSk7CisgIGxsdm06OkludHJ1c2l2ZVJlZkNudFB0cjxsbHZtOjp2ZnM6OkluTWVtb3J5RmlsZVN5c3RlbT4gYnVpbHRpbl9oZWFkZXJzKAorICAgICAgbmV3IGxsdm06OnZmczo6SW5NZW1vcnlGaWxlU3lzdGVtKTsKKworICBsbHZtOjpTbWFsbFN0cmluZzwyNTY+IGZpbGVfcGF0aDsKKyAgZm9yIChjb25zdCBhdXRvICZidWlsdGluX2hlYWRlciA6CisgICAgICAgbGx2bTo6QXJyYXlSZWYoYnVpbHRpbl9oZWFkZXJzX2NyZWF0ZSgpLCBidWlsdGluX2hlYWRlcnNfc2l6ZSgpKSkgeworICAgIGZpbGVfcGF0aC5jbGVhcigpOworICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKGZpbGVfcGF0aCwga1Jlc291cmNlRGlyLCAiaW5jbHVkZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9oZWFkZXIubmFtZSk7CisgICAgYnVpbHRpbl9oZWFkZXJzLT5hZGRGaWxlKAorICAgICAgICBmaWxlX3BhdGgsCisgICAgICAgIC8qTW9kaWZpY2F0aW9uVGltZT0qLzAsCisgICAgICAgIGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyKGJ1aWx0aW5faGVhZGVyLmRhdGEpKTsKKyAgfQorICBvdmVybGF5LT5wdXNoT3ZlcmxheShzdGQ6Om1vdmUoYnVpbHRpbl9oZWFkZXJzKSk7CisgIGFyZ3YuaW5zZXJ0KGxsdm06OmZpbmQoYXJndiwgIi0tIiksCisgICAgICAgICAgICAgIGxsdm06OlR3aW5lKCItcmVzb3VyY2UtZGlyPSIsIGtSZXNvdXJjZURpcikuc3RyKCkpOworICByZXR1cm4gb3ZlcmxheTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2xsdm06OkV4cGVjdGVkPHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Pj4gU2NhbkluY2x1ZGVzKAorICAgIGNvbnN0IGNsYW5nOjp0b29saW5nOjpDb21waWxlQ29tbWFuZCAmY21kLAorICAgIGxsdm06OkludHJ1c2l2ZVJlZkNudFB0cjxsbHZtOjp2ZnM6OkZpbGVTeXN0ZW0+IGZzKSB7CisgIGlmIChmcy0+c2V0Q3VycmVudFdvcmtpbmdEaXJlY3RvcnkoY21kLkRpcmVjdG9yeSkpIHsKKyAgICByZXR1cm4gbGx2bTo6Y3JlYXRlU3RyaW5nRXJyb3IoCisgICAgICAgIGxsdm06OmluY29udmVydGlibGVFcnJvckNvZGUoKSwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgd29ya2luZyBkaXJlY3RvcnkgdG86ICIgKyBjbWQuRGlyZWN0b3J5KTsKKyAgfQorCisgIGF1dG8gbWFpbl9maWxlID0gZnMtPmdldEJ1ZmZlckZvckZpbGUoY21kLkZpbGVuYW1lKTsKKyAgaWYgKCFtYWluX2ZpbGUpIHsKKyAgICByZXR1cm4gbGx2bTo6Y3JlYXRlU3RyaW5nRXJyb3IobGx2bTo6aW5jb252ZXJ0aWJsZUVycm9yQ29kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFpbiBmaWxlIGRvZXNuJ3QgZXhpc3Q6ICIgKyBjbWQuRmlsZW5hbWUpOworICB9CisgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFic19wYXRoczsKKyAgYWJzX3BhdGhzLnRyeV9lbXBsYWNlKEdldEFic29sdXRlUGF0aChjbWQuRGlyZWN0b3J5LCBjbWQuRmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9maWxlLmdldCgpLT5nZXRCdWZmZXIoKS5zdHIoKSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3YgPSBjbWQuQ29tbWFuZExpbmU7CisgIGZzID0gT3ZlcmxheUJ1aWx0aW5IZWFkZXJzKGFyZ3YsIHN0ZDo6bW92ZShmcykpOworCisgIGxsdm06OkludHJ1c2l2ZVJlZkNudFB0cjxjbGFuZzo6RmlsZU1hbmFnZXI+IGZpbGVzKAorICAgICAgbmV3IGNsYW5nOjpGaWxlTWFuYWdlcigvKkZpbGVTeXN0ZW1PcHRzPSove30sIHN0ZDo6bW92ZShmcykpKTsKKyAgY2xhbmc6OnRvb2xpbmc6OlRvb2xJbnZvY2F0aW9uIHRvb2woCisgICAgICBhcmd2LCBzdGQ6Om1ha2VfdW5pcXVlPEluY2x1ZGVTY2FubmluZ0FjdGlvbj4oYWJzX3BhdGhzKSwgZmlsZXMuZ2V0KCkpOworICBpZiAoIXRvb2wucnVuKCkpIHsKKyAgICByZXR1cm4gbGx2bTo6Y3JlYXRlU3RyaW5nRXJyb3IoCisgICAgICAgIGxsdm06OmluY29udmVydGlibGVFcnJvckNvZGUoKSwKKyAgICAgICAgIkZhaWxlZCB0byBzY2FuIGluY2x1ZGVzIGZvcjogIiArIGNtZC5GaWxlbmFtZSk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZShhYnNfcGF0aHMuc2l6ZSgpKTsKKyAgZm9yIChhdXRvICZlbnRyeSA6IGFic19wYXRocykgeworICAgIHJlc3VsdC5lbXBsYWNlX2JhY2soZW50cnkuZmlyc3QsIHN0ZDo6bW92ZShlbnRyeS5zZWNvbmQpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorfSAgLy8gbmFtZXNwYWNlIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvaW5jbHVkZV9zY2FubmVyLmggYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvaW5jbHVkZV9zY2FubmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxNGU3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9pbmNsdWRlX3NjYW5uZXIuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RPT0xTX0lERV9RVUVSWV9DQ19BTkFMWVpFUl9JTkNMVURFX1NDQU5ORVJfSF8KKyNkZWZpbmUgX1RPT0xTX0lERV9RVUVSWV9DQ19BTkFMWVpFUl9JTkNMVURFX1NDQU5ORVJfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WaXJ0dWFsRmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXIgeworCisvLyBSZXR1cm5zIGFic29sdXRlIHBhdGhzIGFuZCBjb250ZW50cyBmb3IgYWxsIHRoZSBpbmNsdWRlcyBuZWNlc3NhcnkgZm9yCisvLyBjb21waWxpbmcgc291cmNlIGZpbGUgaW4gY29tbWFuZC4KK2xsdm06OkV4cGVjdGVkPHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Pj4gU2NhbkluY2x1ZGVzKAorICAgIGNvbnN0IGNsYW5nOjp0b29saW5nOjpDb21waWxlQ29tbWFuZCAmY21kLAorICAgIGxsdm06OkludHJ1c2l2ZVJlZkNudFB0cjxsbHZtOjp2ZnM6OkZpbGVTeXN0ZW0+IGZzKTsKKworfSAgLy8gbmFtZXNwYWNlIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL21haW4uY2MgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZmYzhjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL21haW4uY2MKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERyaXZlciBmb3IgYysrIGV4dHJhY3Rvci4gT3BlcmF0ZXMgaW4gdHdvIG1vZGVzOgorLy8gLSBERVBTLCBzY2FucyBidWlsZCBncmFwaCBmb3IgYWN0aXZlIGZpbGVzIGFuZCByZXBvcnRzIHRhcmdldHMgdGhhdCBuZWVkIHRvCisvLyBiZSBidWlsZCBmb3IgYW5hbHl6aW5nIHRoYXQgZmlsZS4KKy8vIC0gSU5QVVRTLCBzY2FucyB0aGUgc291cmNlIGNvZGUgZm9yIGFjdGl2ZSBmaWxlcyBhbmQgcmV0dXJucyBhbGwgdGhlIHNvdXJjZXMKKy8vIHJlcXVpcmVkIGZvciBhbmFseXppbmcgdGhhdCBmaWxlLgorLy8KKy8vIFVzZXMgc3RkaW4vc3Rkb3V0IHRvIHRha2UgaW4gcmVxdWVzdHMgYW5kIHByb3ZpZGUgcmVzcG9uc2VzLgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJhbmFseXplci5oIgorI2luY2x1ZGUgImdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmgiCisjaW5jbHVkZSAiY2NfYW5hbHl6ZXIucGIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVGFyZ2V0U2VsZWN0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSB7CitlbnVtIGNsYXNzIE9wTW9kZSB7CisgIERFUFMgPSAwLAorICBJTlBVVFMgPSAxLAorfTsKK2xsdm06OmNsOjpvcHQ8T3BNb2RlPiBtb2RleworICAgICJtb2RlIiwKKyAgICBsbHZtOjpjbDo6dmFsdWVzKGNsRW51bVZhbE4oT3BNb2RlOjpERVBTLCAiZGVwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmUgb3V0IHRhcmdldHMgdGhhdCBuZWVkIHRvIGJlIGJ1aWxkIiksCisgICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKE9wTW9kZTo6SU5QVVRTLCAiaW5wdXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZSBvdXQgZ2VuZXJhdGVkIGZpbGVzIHVzZWQiKSksCisgICAgbGx2bTo6Y2w6OmRlc2MoIlByaW50IHRoZSBsaXN0IG9mIGhlYWRlcnMgdG8gaW5zZXJ0IGFuZCByZW1vdmUiKSwKK307CisKK2NjX2FuYWx5emVyOjpJZGVBbmFseXNpcyBSZXR1cm5FcnJvcihsbHZtOjpTdHJpbmdSZWYgbWVzc2FnZSkgeworICBjY19hbmFseXplcjo6SWRlQW5hbHlzaXMgcmVzdWx0OworICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoY2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CisgIHJlc3VsdC5tdXRhYmxlX3N0YXR1cygpLT5zZXRfbWVzc2FnZShtZXNzYWdlLnN0cigpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgbGx2bTo6SW5pdGlhbGl6ZUFsbFRhcmdldEluZm9zKCk7CisgIGxsdm06OmNsOjpQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhhcmdjLCBhcmd2KTsKKworICBjY19hbmFseXplcjo6UmVwb1N0YXRlIHN0YXRlOworICBpZiAoIXN0YXRlLlBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKFNURElOX0ZJTEVOTykpIHsKKyAgICBsbHZtOjplcnJzKCkgPDwgIkZhaWxlZCB0byBwYXJzZSBpbnB1dCFcbiI7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZT4gcmVzdWx0OworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIE9wTW9kZTo6REVQUzogeworICAgICAgcmVzdWx0ID0gc3RkOjptYWtlX3VuaXF1ZTxjY19hbmFseXplcjo6RGVwc1Jlc3BvbnNlPigKKyAgICAgICAgICB0b29sczo6aWRlX3F1ZXJ5OjpjY19hbmFseXplcjo6R2V0RGVwcyhzdGQ6Om1vdmUoc3RhdGUpKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPcE1vZGU6OklOUFVUUzogeworICAgICAgcmVzdWx0ID0gc3RkOjptYWtlX3VuaXF1ZTxjY19hbmFseXplcjo6SWRlQW5hbHlzaXM+KAorICAgICAgICAgIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyOjpHZXRCdWlsZElucHV0cyhzdGQ6Om1vdmUoc3RhdGUpKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm06OmVycnMoKSA8PCAiVW5rbm93biBvcGVyYXRpb24gbW9kZSFcbiI7CisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIXJlc3VsdC0+U2VyaWFsaXplVG9GaWxlRGVzY3JpcHRvcihTVERPVVRfRklMRU5PKSkgeworICAgIGxsdm06OmVycnMoKSA8PCAiRmFpbGVkIHRvIHNlcmlhbGl6ZSByZXN1bHQhXG4iOworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8vQW5kcm9pZC5icCBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDA3YjQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8vQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitjY19saWJyYXJ5X2hvc3Rfc3RhdGljIHsKKyAgICBuYW1lOiAiY2NfYW5hbHl6ZXJfcHJvdG8iLAorICAgIHNyY3M6IFsKKyAgICAgICAgImNjX2FuYWx5emVyLnByb3RvIiwKKyAgICBdLAorICAgIHByb3RvOiB7CisgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAorICAgICAgICB0eXBlOiAiZnVsbCIsCisgICAgICAgIGNhbm9uaWNhbF9wYXRoX2Zyb21fcm9vdDogZmFsc2UsCisgICAgfSwKKyAgICBjb21waWxlX211bHRpbGliOiAiNjQiLAorICAgIHNoYXJlZF9saWJzOiBbImxpYnByb3RvYnVmLWNwcC1mdWxsIl0sCit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8vY2NfYW5hbHl6ZXIucGIuZ28gYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8vY2NfYW5hbHl6ZXIucGIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViZTVjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9jY19hbmFseXplci5wYi5nbwpAQCAtMCwwICsxLDc4OSBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBDb2RlIGdlbmVyYXRlZCBieSBwcm90b2MtZ2VuLWdvLiBETyBOT1QgRURJVC4KKy8vIHZlcnNpb25zOgorLy8gCXByb3RvYy1nZW4tZ28gdjEuMzAuMAorLy8gCXByb3RvYyAgICAgICAgdjMuMjEuMTIKKy8vIHNvdXJjZTogY2NfYW5hbHl6ZXIucHJvdG8KKworcGFja2FnZSBjY19hbmFseXplcl9wcm90bworCitpbXBvcnQgKAorCXByb3RvcmVmbGVjdCAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJcHJvdG9pbXBsICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9ydW50aW1lL3Byb3RvaW1wbCIKKwlyZWZsZWN0ICJyZWZsZWN0IgorCXN5bmMgInN5bmMiCispCisKK2NvbnN0ICgKKwkvLyBWZXJpZnkgdGhhdCB0aGlzIGdlbmVyYXRlZCBjb2RlIGlzIHN1ZmZpY2llbnRseSB1cC10by1kYXRlLgorCV8gPSBwcm90b2ltcGwuRW5mb3JjZVZlcnNpb24oMjAgLSBwcm90b2ltcGwuTWluVmVyc2lvbikKKwkvLyBWZXJpZnkgdGhhdCBydW50aW1lL3Byb3RvaW1wbCBpcyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZS4KKwlfID0gcHJvdG9pbXBsLkVuZm9yY2VWZXJzaW9uKHByb3RvaW1wbC5NYXhWZXJzaW9uIC0gMjApCispCisKK3R5cGUgU3RhdHVzX0NvZGUgaW50MzIKKworY29uc3QgKAorCVN0YXR1c19PSyAgICAgIFN0YXR1c19Db2RlID0gMAorCVN0YXR1c19GQUlMVVJFIFN0YXR1c19Db2RlID0gMQorKQorCisvLyBFbnVtIHZhbHVlIG1hcHMgZm9yIFN0YXR1c19Db2RlLgordmFyICgKKwlTdGF0dXNfQ29kZV9uYW1lID0gbWFwW2ludDMyXXN0cmluZ3sKKwkJMDogIk9LIiwKKwkJMTogIkZBSUxVUkUiLAorCX0KKwlTdGF0dXNfQ29kZV92YWx1ZSA9IG1hcFtzdHJpbmddaW50MzJ7CisJCSJPSyI6ICAgICAgMCwKKwkJIkZBSUxVUkUiOiAxLAorCX0KKykKKworZnVuYyAoeCBTdGF0dXNfQ29kZSkgRW51bSgpICpTdGF0dXNfQ29kZSB7CisJcCA6PSBuZXcoU3RhdHVzX0NvZGUpCisJKnAgPSB4CisJcmV0dXJuIHAKK30KKworZnVuYyAoeCBTdGF0dXNfQ29kZSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguRW51bVN0cmluZ09mKHguRGVzY3JpcHRvcigpLCBwcm90b3JlZmxlY3QuRW51bU51bWJlcih4KSkKK30KKworZnVuYyAoU3RhdHVzX0NvZGUpIERlc2NyaXB0b3IoKSBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IgeworCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2VudW1UeXBlc1swXS5EZXNjcmlwdG9yKCkKK30KKworZnVuYyAoU3RhdHVzX0NvZGUpIFR5cGUoKSBwcm90b3JlZmxlY3QuRW51bVR5cGUgeworCXJldHVybiAmZmlsZV9jY19hbmFseXplcl9wcm90b19lbnVtVHlwZXNbMF0KK30KKworZnVuYyAoeCBTdGF0dXNfQ29kZSkgTnVtYmVyKCkgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIgeworCXJldHVybiBwcm90b3JlZmxlY3QuRW51bU51bWJlcih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgU3RhdHVzX0NvZGUuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoU3RhdHVzX0NvZGUpIEVudW1EZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHswLCAwfQorfQorCisvLyBJbmRpY2F0ZXMgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBmb3IgYW5hbHlzaXMuCit0eXBlIFN0YXR1cyBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCUNvZGUgU3RhdHVzX0NvZGUgYHByb3RvYnVmOiJ2YXJpbnQsMSxvcHQsbmFtZT1jb2RlLHByb3RvMyxlbnVtPWNjX2FuYWx5emVyLlN0YXR1c19Db2RlIiBqc29uOiJjb2RlLG9taXRlbXB0eSJgCisJLy8gRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzLCBtaWdodCBiZSBkaXNwbGF5ZWQgdG8gdXNlci4KKwlNZXNzYWdlICpzdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPW1lc3NhZ2UscHJvdG8zLG9uZW9mIiBqc29uOiJtZXNzYWdlLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKlN0YXR1cykgUmVzZXQoKSB7CisJKnggPSBTdGF0dXN7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMF0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpTdGF0dXMpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQorfQorCitmdW5jICgqU3RhdHVzKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpTdGF0dXMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1swXQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBTdGF0dXMuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpTdGF0dXMpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezB9Cit9CisKK2Z1bmMgKHggKlN0YXR1cykgR2V0Q29kZSgpIFN0YXR1c19Db2RlIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkNvZGUKKwl9CisJcmV0dXJuIFN0YXR1c19PSworfQorCitmdW5jICh4ICpTdGF0dXMpIEdldE1lc3NhZ2UoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsICYmIHguTWVzc2FnZSAhPSBuaWwgeworCQlyZXR1cm4gKnguTWVzc2FnZQorCX0KKwlyZXR1cm4gIiIKK30KKworLy8gUmVwcmVzZW50cyBhbiBBbmRyb2lkIGNoZWNrb3V0IG9uIHVzZXIncyB3b3Jrc3RhdGlvbi4KK3R5cGUgUmVwb1N0YXRlIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJLy8gQWJzb2x1dGUgcGF0aCBmb3IgdGhlIGNoZWNrb3V0IGluIHRoZSB3b3Jrc3RhdGlvbi4KKwkvLyBlLmcuIC9ob21lL3VzZXIvd29yay9hbmRyb2lkLworCVJlcG9EaXIgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1yZXBvX2Rpcixqc29uPXJlcG9EaXIscHJvdG8zIiBqc29uOiJyZXBvX2RpcixvbWl0ZW1wdHkiYAorCS8vIFJlbGF0aXZlIHRvIHJlcG9fZGlyLgorCUFjdGl2ZUZpbGVQYXRoIFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixyZXAsbmFtZT1hY3RpdmVfZmlsZV9wYXRoLGpzb249YWN0aXZlRmlsZVBhdGgscHJvdG8zIiBqc29uOiJhY3RpdmVfZmlsZV9wYXRoLG9taXRlbXB0eSJgCisJLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIG91dHB1dCBkaXJlY3RvcnkgaW4gd29ya3N0YXRpb24uCisJT3V0RGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDMsb3B0LG5hbWU9b3V0X2Rpcixqc29uPW91dERpcixwcm90bzMiIGpzb246Im91dF9kaXIsb21pdGVtcHR5ImAKKwkvLyBSZXBvc2l0b3J5IHJlbGF0aXZlIHBhdGggdG8gY29tcGlsZV9jb21tYW5kcy5qc29uIGluIHdvcmtzdGF0aW9uLgorCUNvbXBEYlBhdGggc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsNCxvcHQsbmFtZT1jb21wX2RiX3BhdGgsanNvbj1jb21wRGJQYXRoLHByb3RvMyIganNvbjoiY29tcF9kYl9wYXRoLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKlJlcG9TdGF0ZSkgUmVzZXQoKSB7CisJKnggPSBSZXBvU3RhdGV7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMV0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQorfQorCitmdW5jICgqUmVwb1N0YXRlKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpSZXBvU3RhdGUpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1sxXQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBSZXBvU3RhdGUuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpSZXBvU3RhdGUpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezF9Cit9CisKK2Z1bmMgKHggKlJlcG9TdGF0ZSkgR2V0UmVwb0RpcigpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5SZXBvRGlyCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIEdldEFjdGl2ZUZpbGVQYXRoKCkgW11zdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguQWN0aXZlRmlsZVBhdGgKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIEdldE91dERpcigpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5PdXREaXIKKwl9CisJcmV0dXJuICIiCit9CisKK2Z1bmMgKHggKlJlcG9TdGF0ZSkgR2V0Q29tcERiUGF0aCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db21wRGJQYXRoCisJfQorCXJldHVybiAiIgorfQorCisvLyBQcm92aWRlcyBhbGwgdGhlIHRhcmdldHMgdGhhdCBhcmUgcHJlLXJlcXVpc2l0aWVzIGZvciBydW5uaW5nIGxhbmd1YWdlCisvLyBzZXJ2aWNlcyBvbiBhY3RpdmVfZmlsZV9wYXRocy4KK3R5cGUgRGVwc1Jlc3BvbnNlIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJRGVwcyAgIFtdKkRlcHNSZXNwb25zZV9EZXBzIGBwcm90b2J1ZjoiYnl0ZXMsMSxyZXAsbmFtZT1kZXBzLHByb3RvMyIganNvbjoiZGVwcyxvbWl0ZW1wdHkiYAorCVN0YXR1cyAqU3RhdHVzICAgICAgICAgICAgICBgcHJvdG9idWY6ImJ5dGVzLDIsb3B0LG5hbWU9c3RhdHVzLHByb3RvMyxvbmVvZiIganNvbjoic3RhdHVzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkRlcHNSZXNwb25zZSkgUmVzZXQoKSB7CisJKnggPSBEZXBzUmVzcG9uc2V7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMl0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2UpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQorfQorCitmdW5jICgqRGVwc1Jlc3BvbnNlKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2UpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1syXQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBEZXBzUmVzcG9uc2UuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpEZXBzUmVzcG9uc2UpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezJ9Cit9CisKK2Z1bmMgKHggKkRlcHNSZXNwb25zZSkgR2V0RGVwcygpIFtdKkRlcHNSZXNwb25zZV9EZXBzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkRlcHMKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2UpIEdldFN0YXR1cygpICpTdGF0dXMgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU3RhdHVzCisJfQorCXJldHVybiBuaWwKK30KKworLy8gUmV0dXJucyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgcHJvdmlkaW5nIGxhbmd1YWdlIHNlcnZpY2VzIGZvciB0aGUKKy8vIGFjdGl2ZSBmaWxlcy4KK3R5cGUgR2VuZXJhdGVkRmlsZSBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCS8vIFBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCVBhdGggc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1wYXRoLHByb3RvMyIganNvbjoicGF0aCxvbWl0ZW1wdHkiYAorCS8vIFRoZSB0ZXh0IG9mIHRoZSBnZW5lcmF0ZWQgZmlsZSwgaWYgbm90IHByb3ZpZGVkIGNvbnRlbnRzIHdpbGwgYmUgcmVhZAorCS8vIGZyb20gdGhlIHBhdGggYWJvdmUgaW4gdXNlcidzIHdvcmtzdGF0aW9uLgorCUNvbnRlbnRzIFtdYnl0ZSBgcHJvdG9idWY6ImJ5dGVzLDIsb3B0LG5hbWU9Y29udGVudHMscHJvdG8zLG9uZW9mIiBqc29uOiJjb250ZW50cyxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBSZXNldCgpIHsKKwkqeCA9IEdlbmVyYXRlZEZpbGV7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbM10KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkdlbmVyYXRlZEZpbGUpIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkdlbmVyYXRlZEZpbGUpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1szXQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBHZW5lcmF0ZWRGaWxlLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqR2VuZXJhdGVkRmlsZSkgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7M30KK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgR2V0UGF0aCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5QYXRoCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBHZXRDb250ZW50cygpIFtdYnl0ZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db250ZW50cworCX0KKwlyZXR1cm4gbmlsCit9CisKK3R5cGUgU291cmNlRmlsZSBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCS8vIFBhdGggdG8gdGhlIHNvdXJjZSBmaWxlIHJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKwlQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9cGF0aCxwcm90bzMiIGpzb246InBhdGgsb21pdGVtcHR5ImAKKwkvLyBXb3JraW5nIGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uIEFsbCB0aGUgcmVsYXRpdmUKKwkvLyBwYXRocyBpbiBjb21waWxlcl9hcmd1bWVudHMgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoaXMgcGF0aC4KKwkvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisJV29ya2luZ0RpciBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXdvcmtpbmdfZGlyLGpzb249d29ya2luZ0Rpcixwcm90bzMiIGpzb246IndvcmtpbmdfZGlyLG9taXRlbXB0eSJgCisJLy8gQ29tcGlsZXIgYXJndW1lbnRzIHRvIGNvbXBpbGUgdGhlIHNvdXJjZSBmaWxlLiBJZiBtdWx0aXBsZSB2YXJpYW50cworCS8vIG9mIHRoZSBtb2R1bGUgYmVpbmcgY29tcGlsZWQgYXJlIHBvc3NpYmxlLCB0aGUgcXVlcnkgc2NyaXB0IHdpbGwgY2hvb3NlCisJLy8gb25lLgorCUNvbXBpbGVyQXJndW1lbnRzIFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMyxyZXAsbmFtZT1jb21waWxlcl9hcmd1bWVudHMsanNvbj1jb21waWxlckFyZ3VtZW50cyxwcm90bzMiIGpzb246ImNvbXBpbGVyX2FyZ3VtZW50cyxvbWl0ZW1wdHkiYAorCS8vIEFueSBnZW5lcmF0ZWQgZmlsZXMgdGhhdCBhcmUgdXNlZCBpbiBjb21waWxpbmcgdGhlIGZpbGUuCisJR2VuZXJhdGVkIFtdKkdlbmVyYXRlZEZpbGUgYHByb3RvYnVmOiJieXRlcyw0LHJlcCxuYW1lPWdlbmVyYXRlZCxwcm90bzMiIGpzb246ImdlbmVyYXRlZCxvbWl0ZW1wdHkiYAorCS8vIFBhdGhzIHRvIGFsbCBvZiB0aGUgc291cmNlcywgbGlrZSBidWlsZCBmaWxlcywgY29kZSBnZW5lcmF0b3JzLAorCS8vIHByb3RvIGZpbGVzIGV0Yy4gdGhhdCB3ZXJlIHVzZWQgZHVyaW5nIGFuYWx5c2lzLiBVc2VkIHRvIGZpZ3VyZQorCS8vIG91dCB3aGVuIGEgc2V0IG9mIGJ1aWxkIGFydGlmYWN0cyBhcmUgc3RhbGUgYW5kIHRoZSBxdWVyeSB0b29sCisJLy8gbXVzdCBiZSByZS1ydW4uCisJLy8gUmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCURlcHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcyw1LHJlcCxuYW1lPWRlcHMscHJvdG8zIiBqc29uOiJkZXBzLG9taXRlbXB0eSJgCisJLy8gUmVwcmVzZW50cyBhbmFseXNpcyBzdGF0dXMgZm9yIHRoaXMgcGFydGljdWxhciBmaWxlLiBlLmcuIG5vdCBwYXJ0CisJLy8gb2YgdGhlIGJ1aWxkIGdyYXBoLgorCVN0YXR1cyAqU3RhdHVzIGBwcm90b2J1ZjoiYnl0ZXMsNixvcHQsbmFtZT1zdGF0dXMscHJvdG8zLG9uZW9mIiBqc29uOiJzdGF0dXMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgUmVzZXQoKSB7CisJKnggPSBTb3VyY2VGaWxle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzRdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpTb3VyY2VGaWxlKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpTb3VyY2VGaWxlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNF0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgU291cmNlRmlsZS5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKlNvdXJjZUZpbGUpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezR9Cit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIEdldFBhdGgoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0V29ya2luZ0RpcigpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Xb3JraW5nRGlyCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRDb21waWxlckFyZ3VtZW50cygpIFtdc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkNvbXBpbGVyQXJndW1lbnRzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0R2VuZXJhdGVkKCkgW10qR2VuZXJhdGVkRmlsZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5HZW5lcmF0ZWQKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpTb3VyY2VGaWxlKSBHZXREZXBzKCkgW11zdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguRGVwcworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIEdldFN0YXR1cygpICpTdGF0dXMgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU3RhdHVzCisJfQorCXJldHVybiBuaWwKK30KKwordHlwZSBJZGVBbmFseXNpcyBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCVNvdXJjZXMgW10qU291cmNlRmlsZSBgcHJvdG9idWY6ImJ5dGVzLDIscmVwLG5hbWU9c291cmNlcyxwcm90bzMiIGpzb246InNvdXJjZXMsb21pdGVtcHR5ImAKKwkvLyBTdGF0dXMgcmVwcmVzZW50aW5nIG92ZXJhbGwgYW5hbHlzaXMuCisJLy8gU2hvdWxkIGZhaWwgb25seSB3aGVuIG5vIGFuYWx5c2lzIGNhbiBiZSBwZXJmb3JtZWQuCisJU3RhdHVzICpTdGF0dXMgYHByb3RvYnVmOiJieXRlcywzLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgUmVzZXQoKSB7CisJKnggPSBJZGVBbmFseXNpc3t9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s1XQorCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwl9Cit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKklkZUFuYWx5c2lzKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgeworCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzVdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIElkZUFuYWx5c2lzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqSWRlQW5hbHlzaXMpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezV9Cit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRTb3VyY2VzKCkgW10qU291cmNlRmlsZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Tb3VyY2VzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIEdldFN0YXR1cygpICpTdGF0dXMgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU3RhdHVzCisJfQorCXJldHVybiBuaWwKK30KKworLy8gQnVpbGQgZGVwZW5kZW5jaWVzIG9mIGEgc291cmNlIGZpbGUgZm9yIHByb3ZpZGluZyBsYW5ndWFnZSBzZXJ2aWNlcy4KK3R5cGUgRGVwc1Jlc3BvbnNlX0RlcHMgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBSZWxhdGl2ZSB0byByZXBvX2Rpci4KKwlTb3VyY2VGaWxlIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9c291cmNlX2ZpbGUsanNvbj1zb3VyY2VGaWxlLHByb3RvMyIganNvbjoic291cmNlX2ZpbGUsb21pdGVtcHR5ImAKKwkvLyBCdWlsZCB0YXJnZXQgdG8gZXhlY3V0ZSBmb3IgZ2VuZXJhdGluZyBkZXAuCisJQnVpbGRUYXJnZXQgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLHJlcCxuYW1lPWJ1aWxkX3RhcmdldCxqc29uPWJ1aWxkVGFyZ2V0LHByb3RvMyIganNvbjoiYnVpbGRfdGFyZ2V0LG9taXRlbXB0eSJgCisJU3RhdHVzICAgICAgKlN0YXR1cyAgYHByb3RvYnVmOiJieXRlcywzLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgUmVzZXQoKSB7CisJKnggPSBEZXBzUmVzcG9uc2VfRGVwc3t9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s2XQorCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwl9Cit9CisKK2Z1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkRlcHNSZXNwb25zZV9EZXBzKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgeworCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzZdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIERlcHNSZXNwb25zZV9EZXBzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqRGVwc1Jlc3BvbnNlX0RlcHMpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezIsIDB9Cit9CisKK2Z1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBHZXRTb3VyY2VGaWxlKCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlNvdXJjZUZpbGUKKwl9CisJcmV0dXJuICIiCit9CisKK2Z1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBHZXRCdWlsZFRhcmdldCgpIFtdc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkJ1aWxkVGFyZ2V0CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIEdldFN0YXR1cygpICpTdGF0dXMgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU3RhdHVzCisJfQorCXJldHVybiBuaWwKK30KKwordmFyIEZpbGVfY2NfYW5hbHl6ZXJfcHJvdG8gcHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yCisKK3ZhciBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2MgPSBbXWJ5dGV7CisJMHgwYSwgMHgxMSwgMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwgMHg3MiwgMHgyZSwgMHg3MCwgMHg3MiwKKwkweDZmLCAweDc0LCAweDZmLCAweDEyLCAweDBiLCAweDYzLCAweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLAorCTB4MjIsIDB4N2UsIDB4MGEsIDB4MDYsIDB4NTMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4MTIsIDB4MmMsIDB4MGEsIDB4MDQsIDB4NjMsIDB4NmYsCisJMHg2NCwgMHg2NSwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwZSwgMHgzMiwgMHgxOCwgMHgyZSwgMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwKKwkweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLCAweDJlLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDJlLCAweDQzLCAweDZmLAorCTB4NjQsIDB4NjUsIDB4NTIsIDB4MDQsIDB4NjMsIDB4NmYsIDB4NjQsIDB4NjUsIDB4MTIsIDB4MWQsIDB4MGEsIDB4MDcsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsCisJMHg2MSwgMHg2NywgMHg2NSwgMHgxOCwgMHgwMiwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg0OCwgMHgwMCwgMHg1MiwgMHgwNywgMHg2ZCwgMHg2NSwgMHg3MywKKwkweDczLCAweDYxLCAweDY3LCAweDY1LCAweDg4LCAweDAxLCAweDAxLCAweDIyLCAweDFiLCAweDBhLCAweDA0LCAweDQzLCAweDZmLCAweDY0LCAweDY1LCAweDEyLAorCTB4MDYsIDB4MGEsIDB4MDIsIDB4NGYsIDB4NGIsIDB4MTAsIDB4MDAsIDB4MTIsIDB4MGIsIDB4MGEsIDB4MDcsIDB4NDYsIDB4NDEsIDB4NDksIDB4NGMsIDB4NTUsCisJMHg1MiwgMHg0NSwgMHgxMCwgMHgwMSwgMHg0MiwgMHgwYSwgMHgwYSwgMHgwOCwgMHg1ZiwgMHg2ZCwgMHg2NSwgMHg3MywgMHg3MywgMHg2MSwgMHg2NywgMHg2NSwKKwkweDIyLCAweDhiLCAweDAxLCAweDBhLCAweDA5LCAweDUyLCAweDY1LCAweDcwLCAweDZmLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDEyLCAweDE5LAorCTB4MGEsIDB4MDgsIDB4NzIsIDB4NjUsIDB4NzAsIDB4NmYsIDB4NWYsIDB4NjQsIDB4NjksIDB4NzIsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksCisJMHg1MiwgMHgwNywgMHg3MiwgMHg2NSwgMHg3MCwgMHg2ZiwgMHg0NCwgMHg2OSwgMHg3MiwgMHgxMiwgMHgyOCwgMHgwYSwgMHgxMCwgMHg2MSwgMHg2MywgMHg3NCwKKwkweDY5LCAweDc2LCAweDY1LCAweDVmLCAweDY2LCAweDY5LCAweDZjLCAweDY1LCAweDVmLCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDAyLCAweDIwLAorCTB4MDMsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGUsIDB4NjEsIDB4NjMsIDB4NzQsIDB4NjksIDB4NzYsIDB4NjUsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NTAsCisJMHg2MSwgMHg3NCwgMHg2OCwgMHgxMiwgMHgxNywgMHgwYSwgMHgwNywgMHg2ZiwgMHg3NSwgMHg3NCwgMHg1ZiwgMHg2NCwgMHg2OSwgMHg3MiwgMHgxOCwgMHgwMywKKwkweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDA2LCAweDZmLCAweDc1LCAweDc0LCAweDQ0LCAweDY5LCAweDcyLCAweDEyLCAweDIwLCAweDBhLCAweDBjLAorCTB4NjMsIDB4NmYsIDB4NmQsIDB4NzAsIDB4NWYsIDB4NjQsIDB4NjIsIDB4NWYsIDB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MTgsIDB4MDQsIDB4MjAsIDB4MDEsCisJMHgyOCwgMHgwOSwgMHg1MiwgMHgwYSwgMHg2MywgMHg2ZiwgMHg2ZCwgMHg3MCwgMHg0NCwgMHg2MiwgMHg1MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgyMiwgMHg4OSwKKwkweDAyLCAweDBhLCAweDBjLCAweDQ0LCAweDY1LCAweDcwLCAweDczLCAweDUyLCAweDY1LCAweDczLCAweDcwLCAweDZmLCAweDZlLCAweDczLCAweDY1LCAweDEyLAorCTB4MzIsIDB4MGEsIDB4MDQsIDB4NjQsIDB4NjUsIDB4NzAsIDB4NzMsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MWUsIDB4MmUsCisJMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwgMHg3MiwgMHgyZSwgMHg0NCwgMHg2NSwgMHg3MCwgMHg3MywKKwkweDUyLCAweDY1LCAweDczLCAweDcwLCAweDZmLCAweDZlLCAweDczLCAweDY1LCAweDJlLCAweDQ0LCAweDY1LCAweDcwLCAweDczLCAweDUyLCAweDA0LCAweDY0LAorCTB4NjUsIDB4NzAsIDB4NzMsIDB4MTIsIDB4MzAsIDB4MGEsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4MTgsIDB4MDIsIDB4MjAsCisJMHgwMSwgMHgyOCwgMHgwYiwgMHgzMiwgMHgxMywgMHgyZSwgMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwKKwkweDcyLCAweDJlLCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDQ4LCAweDAwLCAweDUyLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LAorCTB4NzUsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsIDB4MWEsIDB4ODcsIDB4MDEsIDB4MGEsIDB4MDQsIDB4NDQsIDB4NjUsIDB4NzAsIDB4NzMsIDB4MTIsIDB4MWYsCisJMHgwYSwgMHgwYiwgMHg3MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg1ZiwgMHg2NiwgMHg2OSwgMHg2YywgMHg2NSwgMHgxOCwgMHgwMSwgMHgyMCwKKwkweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBhLCAweDczLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDEyLAorCTB4MjEsIDB4MGEsIDB4MGMsIDB4NjIsIDB4NzUsIDB4NjksIDB4NmMsIDB4NjQsIDB4NWYsIDB4NzQsIDB4NjEsIDB4NzIsIDB4NjcsIDB4NjUsIDB4NzQsIDB4MTgsCisJMHgwMiwgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgwYiwgMHg2MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg1NCwgMHg2MSwgMHg3MiwgMHg2NywKKwkweDY1LCAweDc0LCAweDEyLCAweDMwLCAweDBhLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDE4LCAweDAzLCAweDIwLCAweDAxLAorCTB4MjgsIDB4MGIsIDB4MzIsIDB4MTMsIDB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsCisJMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwKKwkweDczLCAweDg4LCAweDAxLCAweDAxLCAweDQyLCAweDA5LCAweDBhLCAweDA3LCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDQyLAorCTB4MDksIDB4MGEsIDB4MDcsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4MjIsIDB4NTEsIDB4MGEsIDB4MGQsIDB4NDcsIDB4NjUsCisJMHg2ZSwgMHg2NSwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2NCwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwgMHgxMiwgMHgxMiwgMHgwYSwgMHgwNCwgMHg3MCwKKwkweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDA0LCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDEyLAorCTB4MWYsIDB4MGEsIDB4MDgsIDB4NjMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4MTgsIDB4MDIsIDB4MjAsIDB4MDEsIDB4MjgsCisJMHgwYywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwOCwgMHg2MywgMHg2ZiwgMHg2ZSwgMHg3NCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHg4OCwgMHgwMSwgMHgwMSwKKwkweDQyLCAweDBiLCAweDBhLCAweDA5LCAweDVmLCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDczLCAweDIyLCAweGZiLCAweDAxLAorCTB4MGEsIDB4MGEsIDB4NTMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4MTIsIDB4MTIsIDB4MGEsIDB4MDQsCisJMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNCwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwKKwkweDEyLCAweDFmLCAweDBhLCAweDBiLCAweDc3LCAweDZmLCAweDcyLCAweDZiLCAweDY5LCAweDZlLCAweDY3LCAweDVmLCAweDY0LCAweDY5LCAweDcyLCAweDE4LAorCTB4MDIsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGEsIDB4NzcsIDB4NmYsIDB4NzIsIDB4NmIsIDB4NjksIDB4NmUsIDB4NjcsIDB4NDQsIDB4NjksCisJMHg3MiwgMHgxMiwgMHgyZCwgMHgwYSwgMHgxMiwgMHg2MywgMHg2ZiwgMHg2ZCwgMHg3MCwgMHg2OSwgMHg2YywgMHg2NSwgMHg3MiwgMHg1ZiwgMHg2MSwgMHg3MiwKKwkweDY3LCAweDc1LCAweDZkLCAweDY1LCAweDZlLCAweDc0LCAweDczLCAweDE4LCAweDAzLCAweDIwLCAweDAzLCAweDI4LCAweDA5LCAweDUyLCAweDExLCAweDYzLAorCTB4NmYsIDB4NmQsIDB4NzAsIDB4NjksIDB4NmMsIDB4NjUsIDB4NzIsIDB4NDEsIDB4NzIsIDB4NjcsIDB4NzUsIDB4NmQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsCisJMHgxMiwgMHgzOCwgMHgwYSwgMHgwOSwgMHg2NywgMHg2NSwgMHg2ZSwgMHg2NSwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2NCwgMHgxOCwgMHgwNCwgMHgyMCwKKwkweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDFhLCAweDJlLCAweDYzLCAweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LAorCTB4NzIsIDB4MmUsIDB4NDcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NTIsCisJMHgwOSwgMHg2NywgMHg2NSwgMHg2ZSwgMHg2NSwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2NCwgMHgxMiwgMHgxMiwgMHgwYSwgMHgwNCwgMHg2NCwgMHg2NSwKKwkweDcwLCAweDczLCAweDE4LCAweDA1LCAweDIwLCAweDAzLCAweDI4LCAweDA5LCAweDUyLCAweDA0LCAweDY0LCAweDY1LCAweDcwLCAweDczLCAweDEyLCAweDMwLAorCTB4MGEsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4MTgsIDB4MDYsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTMsCisJMHgyZSwgMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwgMHg3MiwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwKKwkweDc0LCAweDc1LCAweDczLCAweDQ4LCAweDAwLCAweDUyLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDg4LCAweDAxLCAweDAxLAorCTB4NDIsIDB4MDksIDB4MGEsIDB4MDcsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4MjIsIDB4ODMsIDB4MDEsIDB4MGEsIDB4MGIsCisJMHg0OSwgMHg2NCwgMHg2NSwgMHg0MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywgMHgxMiwgMHgzMSwgMHgwYSwgMHgwNywgMHg3MywKKwkweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDczLCAweDE4LCAweDAyLCAweDIwLCAweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDE3LCAweDJlLCAweDYzLAorCTB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NTMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsCisJMHg2NSwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwgMHg1MiwgMHgwNywgMHg3MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg3MywgMHgxMiwgMHgzMCwKKwkweDBhLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDE4LCAweDAzLCAweDIwLCAweDAxLCAweDI4LCAweDBiLCAweDMyLCAweDEzLAorCTB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsCisJMHg3NCwgMHg3NSwgMHg3MywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg4OCwgMHgwMSwgMHgwMSwKKwkweDQyLCAweDA5LCAweDBhLCAweDA3LCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDRhLCAweDA0LCAweDA4LCAweDAxLCAweDEwLAorCTB4MDIsIDB4NDIsIDB4MWQsIDB4NWEsIDB4MWIsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmYsIDB4NjMsCisJMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwgMHg3MiwgMHg1ZiwgMHg3MCwgMHg3MiwgMHg2ZiwgMHg3NCwgMHg2ZiwKKwkweDYyLCAweDA2LCAweDcwLCAweDcyLCAweDZmLCAweDc0LCAweDZmLCAweDMzLAorfQorCit2YXIgKAorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY09uY2Ugc3luYy5PbmNlCisJZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjRGF0YSA9IGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzYworKQorCitmdW5jIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0daSVAoKSBbXWJ5dGUgeworCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY09uY2UuRG8oZnVuYygpIHsKKwkJZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjRGF0YSA9IHByb3RvaW1wbC5YLkNvbXByZXNzR1pJUChmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NEYXRhKQorCX0pCisJcmV0dXJuIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0RhdGEKK30KKwordmFyIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZW51bVR5cGVzID0gbWFrZShbXXByb3RvaW1wbC5FbnVtSW5mbywgMSkKK3ZhciBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzID0gbWFrZShbXXByb3RvaW1wbC5NZXNzYWdlSW5mbywgNykKK3ZhciBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2dvVHlwZXMgPSBbXWludGVyZmFjZXt9eworCShTdGF0dXNfQ29kZSkoMCksICAgICAgICAgIC8vIDA6IGNjX2FuYWx5emVyLlN0YXR1cy5Db2RlCisJKCpTdGF0dXMpKG5pbCksICAgICAgICAgICAgLy8gMTogY2NfYW5hbHl6ZXIuU3RhdHVzCisJKCpSZXBvU3RhdGUpKG5pbCksICAgICAgICAgLy8gMjogY2NfYW5hbHl6ZXIuUmVwb1N0YXRlCisJKCpEZXBzUmVzcG9uc2UpKG5pbCksICAgICAgLy8gMzogY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlCisJKCpHZW5lcmF0ZWRGaWxlKShuaWwpLCAgICAgLy8gNDogY2NfYW5hbHl6ZXIuR2VuZXJhdGVkRmlsZQorCSgqU291cmNlRmlsZSkobmlsKSwgICAgICAgIC8vIDU6IGNjX2FuYWx5emVyLlNvdXJjZUZpbGUKKwkoKklkZUFuYWx5c2lzKShuaWwpLCAgICAgICAvLyA2OiBjY19hbmFseXplci5JZGVBbmFseXNpcworCSgqRGVwc1Jlc3BvbnNlX0RlcHMpKG5pbCksIC8vIDc6IGNjX2FuYWx5emVyLkRlcHNSZXNwb25zZS5EZXBzCit9Cit2YXIgZmlsZV9jY19hbmFseXplcl9wcm90b19kZXBJZHhzID0gW11pbnQzMnsKKwkwLCAvLyAwOiBjY19hbmFseXplci5TdGF0dXMuY29kZTp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU3RhdHVzLkNvZGUKKwk3LCAvLyAxOiBjY19hbmFseXplci5EZXBzUmVzcG9uc2UuZGVwczp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlLkRlcHMKKwkxLCAvLyAyOiBjY19hbmFseXplci5EZXBzUmVzcG9uc2Uuc3RhdHVzOnR5cGVfbmFtZSAtPiBjY19hbmFseXplci5TdGF0dXMKKwk0LCAvLyAzOiBjY19hbmFseXplci5Tb3VyY2VGaWxlLmdlbmVyYXRlZDp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuR2VuZXJhdGVkRmlsZQorCTEsIC8vIDQ6IGNjX2FuYWx5emVyLlNvdXJjZUZpbGUuc3RhdHVzOnR5cGVfbmFtZSAtPiBjY19hbmFseXplci5TdGF0dXMKKwk1LCAvLyA1OiBjY19hbmFseXplci5JZGVBbmFseXNpcy5zb3VyY2VzOnR5cGVfbmFtZSAtPiBjY19hbmFseXplci5Tb3VyY2VGaWxlCisJMSwgLy8gNjogY2NfYW5hbHl6ZXIuSWRlQW5hbHlzaXMuc3RhdHVzOnR5cGVfbmFtZSAtPiBjY19hbmFseXplci5TdGF0dXMKKwkxLCAvLyA3OiBjY19hbmFseXplci5EZXBzUmVzcG9uc2UuRGVwcy5zdGF0dXM6dHlwZV9uYW1lIC0+IGNjX2FuYWx5emVyLlN0YXR1cworCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgbWV0aG9kIG91dHB1dF90eXBlCisJOCwgLy8gWzg6OF0gaXMgdGhlIHN1Yi1saXN0IGZvciBtZXRob2QgaW5wdXRfdHlwZQorCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgZXh0ZW5zaW9uIHR5cGVfbmFtZQorCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgZXh0ZW5zaW9uIGV4dGVuZGVlCisJMCwgLy8gWzA6OF0gaXMgdGhlIHN1Yi1saXN0IGZvciBmaWVsZCB0eXBlX25hbWUKK30KKworZnVuYyBpbml0KCkgeyBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2luaXQoKSB9CitmdW5jIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9faW5pdCgpIHsKKwlpZiBGaWxlX2NjX2FuYWx5emVyX3Byb3RvICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlpZiAhcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzBdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKlN0YXR1cyk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1sxXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpSZXBvU3RhdGUpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMl0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqRGVwc1Jlc3BvbnNlKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzNdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKkdlbmVyYXRlZEZpbGUpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNF0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqU291cmNlRmlsZSk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s1XS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpJZGVBbmFseXNpcyk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s2XS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpEZXBzUmVzcG9uc2VfRGVwcyk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwl9CisJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1swXS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1syXS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1szXS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s0XS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s1XS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s2XS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJdHlwZSB4IHN0cnVjdHt9CisJb3V0IDo9IHByb3RvaW1wbC5UeXBlQnVpbGRlcnsKKwkJRmlsZTogcHJvdG9pbXBsLkRlc2NCdWlsZGVyeworCQkJR29QYWNrYWdlUGF0aDogcmVmbGVjdC5UeXBlT2YoeHt9KS5Qa2dQYXRoKCksCisJCQlSYXdEZXNjcmlwdG9yOiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2MsCisJCQlOdW1FbnVtczogICAgICAxLAorCQkJTnVtTWVzc2FnZXM6ICAgNywKKwkJCU51bUV4dGVuc2lvbnM6IDAsCisJCQlOdW1TZXJ2aWNlczogICAwLAorCQl9LAorCQlHb1R5cGVzOiAgICAgICAgICAgZmlsZV9jY19hbmFseXplcl9wcm90b19nb1R5cGVzLAorCQlEZXBlbmRlbmN5SW5kZXhlczogZmlsZV9jY19hbmFseXplcl9wcm90b19kZXBJZHhzLAorCQlFbnVtSW5mb3M6ICAgICAgICAgZmlsZV9jY19hbmFseXplcl9wcm90b19lbnVtVHlwZXMsCisJCU1lc3NhZ2VJbmZvczogICAgICBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzLAorCX0uQnVpbGQoKQorCUZpbGVfY2NfYW5hbHl6ZXJfcHJvdG8gPSBvdXQuRmlsZQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzYyA9IG5pbAorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZ29UeXBlcyA9IG5pbAorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZGVwSWR4cyA9IG5pbAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnByb3RvIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NGViNDkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8vY2NfYW5hbHl6ZXIucHJvdG8KQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgY2NfYW5hbHl6ZXI7CisKK29wdGlvbiBnb19wYWNrYWdlID0gImlkZV9xdWVyeS9jY19hbmFseXplcl9wcm90byI7CisKKy8vIEluZGljYXRlcyB0aGUgc3VjY2Vzcy9mYWlsdXJlIGZvciBhbmFseXNpcy4KK21lc3NhZ2UgU3RhdHVzIHsKKyAgZW51bSBDb2RlIHsKKyAgICBPSyA9IDA7CisgICAgRkFJTFVSRSA9IDE7CisgIH0KKyAgQ29kZSBjb2RlID0gMTsKKyAgLy8gRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzLCBtaWdodCBiZSBkaXNwbGF5ZWQgdG8gdXNlci4KKyAgb3B0aW9uYWwgc3RyaW5nIG1lc3NhZ2UgPSAyOworfQorCisvLyBSZXByZXNlbnRzIGFuIEFuZHJvaWQgY2hlY2tvdXQgb24gdXNlcidzIHdvcmtzdGF0aW9uLgorbWVzc2FnZSBSZXBvU3RhdGUgeworICAvLyBBYnNvbHV0ZSBwYXRoIGZvciB0aGUgY2hlY2tvdXQgaW4gdGhlIHdvcmtzdGF0aW9uLgorICAvLyBlLmcuIC9ob21lL3VzZXIvd29yay9hbmRyb2lkLworICBzdHJpbmcgcmVwb19kaXIgPSAxOworICAvLyBSZWxhdGl2ZSB0byByZXBvX2Rpci4KKyAgcmVwZWF0ZWQgc3RyaW5nIGFjdGl2ZV9maWxlX3BhdGggPSAyOworICAvLyBSZXBvc2l0b3J5IHJlbGF0aXZlIHBhdGggdG8gb3V0cHV0IGRpcmVjdG9yeSBpbiB3b3Jrc3RhdGlvbi4KKyAgc3RyaW5nIG91dF9kaXIgPSAzOworICAvLyBSZXBvc2l0b3J5IHJlbGF0aXZlIHBhdGggdG8gY29tcGlsZV9jb21tYW5kcy5qc29uIGluIHdvcmtzdGF0aW9uLgorICBzdHJpbmcgY29tcF9kYl9wYXRoID0gNDsKK30KKworLy8gUHJvdmlkZXMgYWxsIHRoZSB0YXJnZXRzIHRoYXQgYXJlIHByZS1yZXF1aXNpdGllcyBmb3IgcnVubmluZyBsYW5ndWFnZQorLy8gc2VydmljZXMgb24gYWN0aXZlX2ZpbGVfcGF0aHMuCittZXNzYWdlIERlcHNSZXNwb25zZSB7CisgIC8vIEJ1aWxkIGRlcGVuZGVuY2llcyBvZiBhIHNvdXJjZSBmaWxlIGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Ugc2VydmljZXMuCisgIG1lc3NhZ2UgRGVwcyB7CisgICAgLy8gUmVsYXRpdmUgdG8gcmVwb19kaXIuCisgICAgc3RyaW5nIHNvdXJjZV9maWxlID0gMTsKKyAgICAvLyBCdWlsZCB0YXJnZXQgdG8gZXhlY3V0ZSBmb3IgZ2VuZXJhdGluZyBkZXAuCisgICAgcmVwZWF0ZWQgc3RyaW5nIGJ1aWxkX3RhcmdldCA9IDI7CisgICAgb3B0aW9uYWwgU3RhdHVzIHN0YXR1cyA9IDM7CisgIH0KKyAgcmVwZWF0ZWQgRGVwcyBkZXBzID0gMTsKKyAgb3B0aW9uYWwgU3RhdHVzIHN0YXR1cyA9IDI7Cit9CisKKy8vIFJldHVybnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHByb3ZpZGluZyBsYW5ndWFnZSBzZXJ2aWNlcyBmb3IgdGhlCisvLyBhY3RpdmUgZmlsZXMuCittZXNzYWdlIEdlbmVyYXRlZEZpbGUgeworICAvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKyAgc3RyaW5nIHBhdGggPSAxOworCisgIC8vIFRoZSB0ZXh0IG9mIHRoZSBnZW5lcmF0ZWQgZmlsZSwgaWYgbm90IHByb3ZpZGVkIGNvbnRlbnRzIHdpbGwgYmUgcmVhZAorICAvLyBmcm9tIHRoZSBwYXRoIGFib3ZlIGluIHVzZXIncyB3b3Jrc3RhdGlvbi4KKyAgb3B0aW9uYWwgYnl0ZXMgY29udGVudHMgPSAyOworfQorCittZXNzYWdlIFNvdXJjZUZpbGUgeworICAvLyBQYXRoIHRvIHRoZSBzb3VyY2UgZmlsZSByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHN0cmluZyBwYXRoID0gMTsKKworICAvLyBXb3JraW5nIGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uIEFsbCB0aGUgcmVsYXRpdmUKKyAgLy8gcGF0aHMgaW4gY29tcGlsZXJfYXJndW1lbnRzIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGlzIHBhdGguCisgIC8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKyAgc3RyaW5nIHdvcmtpbmdfZGlyID0gMjsKKworICAvLyBDb21waWxlciBhcmd1bWVudHMgdG8gY29tcGlsZSB0aGUgc291cmNlIGZpbGUuIElmIG11bHRpcGxlIHZhcmlhbnRzCisgIC8vIG9mIHRoZSBtb2R1bGUgYmVpbmcgY29tcGlsZWQgYXJlIHBvc3NpYmxlLCB0aGUgcXVlcnkgc2NyaXB0IHdpbGwgY2hvb3NlCisgIC8vIG9uZS4KKyAgcmVwZWF0ZWQgc3RyaW5nIGNvbXBpbGVyX2FyZ3VtZW50cyA9IDM7CisKKyAgLy8gQW55IGdlbmVyYXRlZCBmaWxlcyB0aGF0IGFyZSB1c2VkIGluIGNvbXBpbGluZyB0aGUgZmlsZS4KKyAgcmVwZWF0ZWQgR2VuZXJhdGVkRmlsZSBnZW5lcmF0ZWQgPSA0OworCisgIC8vIFBhdGhzIHRvIGFsbCBvZiB0aGUgc291cmNlcywgbGlrZSBidWlsZCBmaWxlcywgY29kZSBnZW5lcmF0b3JzLAorICAvLyBwcm90byBmaWxlcyBldGMuIHRoYXQgd2VyZSB1c2VkIGR1cmluZyBhbmFseXNpcy4gVXNlZCB0byBmaWd1cmUKKyAgLy8gb3V0IHdoZW4gYSBzZXQgb2YgYnVpbGQgYXJ0aWZhY3RzIGFyZSBzdGFsZSBhbmQgdGhlIHF1ZXJ5IHRvb2wKKyAgLy8gbXVzdCBiZSByZS1ydW4uCisgIC8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKyAgcmVwZWF0ZWQgc3RyaW5nIGRlcHMgPSA1OworCisgIC8vIFJlcHJlc2VudHMgYW5hbHlzaXMgc3RhdHVzIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsZS4gZS5nLiBub3QgcGFydAorICAvLyBvZiB0aGUgYnVpbGQgZ3JhcGguCisgIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSA2OworfQorCittZXNzYWdlIElkZUFuYWx5c2lzIHsKKyAgcmVwZWF0ZWQgU291cmNlRmlsZSBzb3VyY2VzID0gMjsKKworICAvLyBTdGF0dXMgcmVwcmVzZW50aW5nIG92ZXJhbGwgYW5hbHlzaXMuCisgIC8vIFNob3VsZCBmYWlsIG9ubHkgd2hlbiBubyBhbmFseXNpcyBjYW4gYmUgcGVyZm9ybWVkLgorICBvcHRpb25hbCBTdGF0dXMgc3RhdHVzID0gMzsKKworICByZXNlcnZlZCAxOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL3JlZ2VuLnNoIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL3JlZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmNDRmODgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8vcmVnZW4uc2gKQEAgLTAsMCArMSwzIEBACisjIS9iaW4vYmFzaAorCithcHJvdG9jIC0tZ29fb3V0PXBhdGhzPXNvdXJjZV9yZWxhdGl2ZTouIGNjX2FuYWx5emVyLnByb3RvCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvZ28ubW9kIGIvdG9vbHMvaWRlX3F1ZXJ5L2dvLm1vZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWQ3MjdmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2dvLm1vZApAQCAtMCwwICsxLDcgQEAKK21vZHVsZSBpZGVfcXVlcnkKKworZ28gMS4yMQorCityZXF1aXJlICgKKyAgCWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmIHYwLjAuMAorKQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2dvLndvcmsgYi90b29scy9pZGVfcXVlcnkvZ28ud29yawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTFmMzUyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2dvLndvcmsKQEAgLTAsMCArMSw5IEBACitnbyAxLjIxCisKK3VzZSAoCisJLgorKQorCityZXBsYWNlICgKKwlnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1ZiB2MC4wLjAgPT4gLi4vLi4vLi4vLi4vZXh0ZXJuYWwvZ29sYW5nLXByb3RvYnVmCispClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2dvLndvcmsuc3VtIGIvdG9vbHMvaWRlX3F1ZXJ5L2dvLndvcmsuc3VtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDJiNDgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvZ28ud29yay5zdW0KQEAgLTAsMCArMSw1IEBACitnaXRodWIuY29tL2dvbGFuZy9wcm90b2J1ZiB2MS41LjAvZ28ubW9kIGgxOkZzT05WUkFTOVQ3c0krTElVbVdUZmNZa0hPNGFJV3d6aGNhU0FvSk9mSWs9CitnaXRodWIuY29tL2dvb2dsZS9nby1jbXAgdjAuNS41L2dvLm1vZCBoMTp2OGRUZExiTUcya0ljL3ZKdmwrZjY1VjIyZGJrWGJvd0U2amdUL2dOQnhFPQorZ29sYW5nLm9yZy94L3hlcnJvcnMgdjAuMC4wLTIwMTkxMjA0MTkwNTM2LTliZGZhYmU2ODU0My9nby5tb2QgaDE6SS81ejY5OHNuOUthOFRlSmM5TUtyb1VVZnFCQmF1V2pRcUxKMk9QZm1ZMD0KK2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmIHYxLjI2LjAtcmMuMSBoMTo3UW5JUXBHUkhFNVJuTEtuRVNmRG94bTJkVGFwVFp1YTVhMGtTMEErVlhRPQorZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjEuMjYuMC1yYy4xL2dvLm1vZCBoMTpqbGhoT1N2VGRLRWhiVUxUanZkNEFSSzlnckZCcDA5eVcrV2JZL1R5UWJ3PQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5nbyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjN2FiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuZ28KQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBCaW5hcnkgaWRlX3F1ZXJ5IGdlbmVyYXRlcyBhbmQgYW5hbHl6ZXMgYnVpbGQgYXJ0aWZhY3RzLgorLy8gVGhlIHByb2R1Y2VkIHJlc3VsdCBjYW4gYmUgY29uc3VtZWQgYnkgSURFcyB0byBwcm92aWRlIGxhbmd1YWdlIGZlYXR1cmVzLgorcGFja2FnZSBtYWluCisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJjb250YWluZXIvbGlzdCIKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvanNvbiIKKwkiZmxhZyIKKwkiZm10IgorCSJsb2ciCisJIm9zIgorCSJvcy9leGVjIgorCSJwYXRoIgorCSJzbGljZXMiCisJInN0cmluZ3MiCisKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcHJvdG8iCisJYXBiICJpZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8iCisJcGIgImlkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8iCispCisKKy8vIEVudiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4KK3R5cGUgRW52IHN0cnVjdCB7CisJTHVuY2hUYXJnZXQgICAgTHVuY2hUYXJnZXQKKwlSZXBvRGlyICAgICAgICBzdHJpbmcKKwlPdXREaXIgICAgICAgICBzdHJpbmcKKwlDbGFuZ1Rvb2xzUm9vdCBzdHJpbmcKK30KKworLy8gTHVuY2hUYXJnZXQgaXMgYSBwYXJzZWQgQW5kcm9pZCBsdW5jaCB0YXJnZXQuCisvLyBJbnB1dCBmb3JtYXQ6IDxwcm9kdWN0X25hbWU+LTxyZWxlYXNlX3R5cGU+LTxidWlsZF92YXJpYW50PgordHlwZSBMdW5jaFRhcmdldCBzdHJ1Y3QgeworCVByb2R1Y3Qgc3RyaW5nCisJUmVsZWFzZSBzdHJpbmcKKwlWYXJpYW50IHN0cmluZworfQorCit2YXIgXyBmbGFnLlZhbHVlID0gKCpMdW5jaFRhcmdldCkobmlsKQorCisvLyAvLyBHZXQgaW1wbGVtZW50cyBmbGFnLlZhbHVlLgorLy8gZnVuYyAobCAqTHVuY2hUYXJnZXQpIEdldCgpIGFueSB7CisvLyAJcmV0dXJuIGwKKy8vIH0KKworLy8gU2V0IGltcGxlbWVudHMgZmxhZy5WYWx1ZS4KK2Z1bmMgKGwgKkx1bmNoVGFyZ2V0KSBTZXQocyBzdHJpbmcpIGVycm9yIHsKKwlwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KHMsICItIikKKwlpZiBsZW4ocGFydHMpICE9IDMgeworCQlyZXR1cm4gZm10LkVycm9yZigiaW52YWxpZCBsdW5jaCB0YXJnZXQ6ICVxLCBtdXN0IGhhdmUgZm9ybSA8cHJvZHVjdF9uYW1lPi08cmVsZWFzZV90eXBlPi08YnVpbGRfdmFyaWFudD4iLCBzKQorCX0KKwkqbCA9IEx1bmNoVGFyZ2V0eworCQlQcm9kdWN0OiBwYXJ0c1swXSwKKwkJUmVsZWFzZTogcGFydHNbMV0sCisJCVZhcmlhbnQ6IHBhcnRzWzJdLAorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIFN0cmluZyBpbXBsZW1lbnRzIGZsYWcuVmFsdWUuCitmdW5jIChsICpMdW5jaFRhcmdldCkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gZm10LlNwcmludGYoIiVzLSVzLSVzIiwgbC5Qcm9kdWN0LCBsLlJlbGVhc2UsIGwuVmFyaWFudCkKK30KKworZnVuYyBtYWluKCkgeworCXZhciBlbnYgRW52CisJZW52Lk91dERpciA9IHN0cmluZ3MuVHJpbVN1ZmZpeChvcy5HZXRlbnYoIk9VVF9ESVIiKSwgIi8iKQorCWVudi5SZXBvRGlyID0gb3MuR2V0ZW52KCJBTkRST0lEX0JVSUxEX1RPUCIpCisJZW52LkNsYW5nVG9vbHNSb290ID0gb3MuR2V0ZW52KCJQUkVCVUlMVFNfQ0xBTkdfVE9PTFNfUk9PVCIpCisJZmxhZy5WYXIoJmVudi5MdW5jaFRhcmdldCwgImx1bmNoX3RhcmdldCIsICJUaGUgbHVuY2ggdGFyZ2V0IHRvIHF1ZXJ5IikKKwlmbGFnLlBhcnNlKCkKKwlmaWxlcyA6PSBmbGFnLkFyZ3MoKQorCWlmIGxlbihmaWxlcykgPT0gMCB7CisJCWZtdC5QcmludGxuKCJObyBmaWxlcyBwcm92aWRlZC4iKQorCQlvcy5FeGl0KDEpCisJCXJldHVybgorCX0KKworCXZhciBjY0ZpbGVzLCBqYXZhRmlsZXMgW11zdHJpbmcKKwlmb3IgXywgZiA6PSByYW5nZSBmaWxlcyB7CisJCXN3aXRjaCB7CisJCWNhc2Ugc3RyaW5ncy5IYXNTdWZmaXgoZiwgIi5qYXZhIikgfHwgc3RyaW5ncy5IYXNTdWZmaXgoZiwgIi5rdCIpOgorCQkJamF2YUZpbGVzID0gYXBwZW5kKGphdmFGaWxlcywgZikKKwkJY2FzZSBzdHJpbmdzLkhhc1N1ZmZpeChmLCAiLmNjIikgfHwgc3RyaW5ncy5IYXNTdWZmaXgoZiwgIi5jcHAiKSB8fCBzdHJpbmdzLkhhc1N1ZmZpeChmLCAiLmgiKToKKwkJCWNjRmlsZXMgPSBhcHBlbmQoY2NGaWxlcywgZikKKwkJZGVmYXVsdDoKKwkJCWxvZy5QcmludGYoIkZpbGUgJXEgaXMgc3VwcG9ydGVkIC0gd2lsbCBiZSBza2lwcGVkLiIsIGYpCisJCX0KKwl9CisKKwljdHggOj0gY29udGV4dC5CYWNrZ3JvdW5kKCkKKwkvLyBUT0RPKG1pY2hhZWxtZXJnKTogRmlndXJlIG91dCBpZiBtb2R1bGVfYnBfamF2YV9kZXBzLmpzb24gYW5kIGNvbXBpbGVfY29tbWFuZHMuanNvbiBpcyBvdXRkYXRlZC4KKwlydW5NYWtlKGN0eCwgZW52LCAibm90aGluZyIpCisKKwlqYXZhTW9kdWxlcywgZXJyIDo9IGxvYWRKYXZhTW9kdWxlcyhlbnYpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5QcmludGYoIkZhaWxlZCB0byBsb2FkIGphdmEgbW9kdWxlczogJXYiLCBlcnIpCisJfQorCisJdmFyIHRhcmdldHMgW11zdHJpbmcKKwlqYXZhVGFyZ2V0c0J5RmlsZSA6PSBmaW5kSmF2YU1vZHVsZXMoamF2YUZpbGVzLCBqYXZhTW9kdWxlcykKKwlmb3IgXywgdCA6PSByYW5nZSBqYXZhVGFyZ2V0c0J5RmlsZSB7CisJCXRhcmdldHMgPSBhcHBlbmQodGFyZ2V0cywgdCkKKwl9CisKKwljY1RhcmdldHMsIGVyciA6PSBnZXRDQ1RhcmdldHMoY3R4LCBlbnYsIGNjRmlsZXMpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGYoIkZhaWxlZCB0byBxdWVyeSBjYyB0YXJnZXRzOiAldiIsIGVycikKKwl9CisJdGFyZ2V0cyA9IGFwcGVuZCh0YXJnZXRzLCBjY1RhcmdldHMuLi4pCisJaWYgbGVuKHRhcmdldHMpID09IDAgeworCQlmbXQuUHJpbnRsbigiTm8gdGFyZ2V0cyBmb3VuZC4iKQorCQlvcy5FeGl0KDEpCisJCXJldHVybgorCX0KKworCWZtdC5GcHJpbnRmKG9zLlN0ZGVyciwgIlJ1bm5pbmcgbWFrZSBmb3IgbW9kdWxlczogJXZcbiIsIHN0cmluZ3MuSm9pbih0YXJnZXRzLCAiLCAiKSkKKwlpZiBlcnIgOj0gcnVuTWFrZShjdHgsIGVudiwgdGFyZ2V0cy4uLik7IGVyciAhPSBuaWwgeworCQlsb2cuUHJpbnRmKCJCdWlsZGluZyBtb2R1bGVzIGZhaWxlZDogJXYiLCBlcnIpCisJfQorCisJdmFyIGFuYWx5c2lzIHBiLklkZUFuYWx5c2lzCisJcmVzdWx0cywgdW5pdHMgOj0gZ2V0SmF2YUlucHV0cyhlbnYsIGphdmFUYXJnZXRzQnlGaWxlLCBqYXZhTW9kdWxlcykKKwlhbmFseXNpcy5SZXN1bHRzID0gcmVzdWx0cworCWFuYWx5c2lzLlVuaXRzID0gdW5pdHMKKwlpZiBlcnIgIT0gbmlsICYmIGFuYWx5c2lzLkVycm9yID09IG5pbCB7CisJCWFuYWx5c2lzLkVycm9yID0gJnBiLkFuYWx5c2lzRXJyb3J7CisJCQlFcnJvck1lc3NhZ2U6IGVyci5FcnJvcigpLAorCQl9CisJfQorCisJcmVzdWx0cywgdW5pdHMsIGVyciA9IGdldENDSW5wdXRzKGN0eCwgZW52LCBjY0ZpbGVzKQorCWFuYWx5c2lzLlJlc3VsdHMgPSBhcHBlbmQoYW5hbHlzaXMuUmVzdWx0cywgcmVzdWx0cy4uLikKKwlhbmFseXNpcy5Vbml0cyA9IGFwcGVuZChhbmFseXNpcy5Vbml0cywgdW5pdHMuLi4pCisJaWYgZXJyICE9IG5pbCAmJiBhbmFseXNpcy5FcnJvciA9PSBuaWwgeworCQlhbmFseXNpcy5FcnJvciA9ICZwYi5BbmFseXNpc0Vycm9yeworCQkJRXJyb3JNZXNzYWdlOiBlcnIuRXJyb3IoKSwKKwkJfQorCX0KKworCWFuYWx5c2lzLkJ1aWxkT3V0RGlyID0gZW52Lk91dERpcgorCWRhdGEsIGVyciA6PSBwcm90by5NYXJzaGFsKCZhbmFseXNpcykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsZigiRmFpbGVkIHRvIG1hcnNoYWwgcmVzdWx0IHByb3RvOiAldiIsIGVycikKKwl9CisKKwlfLCBlcnIgPSBvcy5TdGRvdXQuV3JpdGUoZGF0YSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsZigiRmFpbGVkIHRvIHdyaXRlIHJlc3VsdCBwcm90bzogJXYiLCBlcnIpCisJfQorCisJZm9yIF8sIHIgOj0gcmFuZ2UgYW5hbHlzaXMuUmVzdWx0cyB7CisJCWZtdC5GcHJpbnRmKG9zLlN0ZGVyciwgIiVzOiAlK3ZcbiIsIHIuR2V0U291cmNlRmlsZVBhdGgoKSwgci5HZXRTdGF0dXMoKSkKKwl9Cit9CisKK2Z1bmMgcmVwb1N0YXRlKGVudiBFbnYsIGZpbGVQYXRocyBbXXN0cmluZykgKmFwYi5SZXBvU3RhdGUgeworCWNvbnN0IGNvbXBEYlBhdGggPSAic29vbmcvZGV2ZWxvcG1lbnQvaWRlL2NvbXBkYi9jb21waWxlX2NvbW1hbmRzLmpzb24iCisJcmV0dXJuICZhcGIuUmVwb1N0YXRleworCQlSZXBvRGlyOiAgICAgICAgZW52LlJlcG9EaXIsCisJCUFjdGl2ZUZpbGVQYXRoOiBmaWxlUGF0aHMsCisJCU91dERpcjogICAgICAgICBlbnYuT3V0RGlyLAorCQlDb21wRGJQYXRoOiAgICAgcGF0aC5Kb2luKGVudi5PdXREaXIsIGNvbXBEYlBhdGgpLAorCX0KK30KKworZnVuYyBydW5DQ2FuYWx5emVyKGN0eCBjb250ZXh0LkNvbnRleHQsIGVudiBFbnYsIG1vZGUgc3RyaW5nLCBpbiBbXWJ5dGUpIChbXWJ5dGUsIGVycm9yKSB7CisJY2NBbmFseXplclBhdGggOj0gcGF0aC5Kb2luKGVudi5DbGFuZ1Rvb2xzUm9vdCwgImJpbi9pZGVfcXVlcnlfY2NfYW5hbHl6ZXIiKQorCW91dEJ1ZmZlciA6PSBuZXcoYnl0ZXMuQnVmZmVyKQorCisJaW5CdWZmZXIgOj0gbmV3KGJ5dGVzLkJ1ZmZlcikKKwlpbkJ1ZmZlci5Xcml0ZShpbikKKworCWNtZCA6PSBleGVjLkNvbW1hbmRDb250ZXh0KGN0eCwgY2NBbmFseXplclBhdGgsICItLW1vZGU9Iittb2RlKQorCWNtZC5EaXIgPSBlbnYuUmVwb0RpcgorCisJY21kLlN0ZGluID0gaW5CdWZmZXIKKwljbWQuU3Rkb3V0ID0gb3V0QnVmZmVyCisJY21kLlN0ZGVyciA9IG9zLlN0ZGVycgorCisJZXJyIDo9IGNtZC5SdW4oKQorCisJcmV0dXJuIG91dEJ1ZmZlci5CeXRlcygpLCBlcnIKK30KKworLy8gRXhlY3V0ZSBjY19hbmFseXplciBhbmQgZ2V0IGFsbCB0aGUgdGFyZ2V0cyB0aGF0IG5lZWRzIHRvIGJlIGJ1aWxkIGZvciBhbmFseXppbmcgZmlsZXMuCitmdW5jIGdldENDVGFyZ2V0cyhjdHggY29udGV4dC5Db250ZXh0LCBlbnYgRW52LCBmaWxlUGF0aHMgW11zdHJpbmcpIChbXXN0cmluZywgZXJyb3IpIHsKKwlzdGF0ZSwgZXJyIDo9IHByb3RvLk1hcnNoYWwocmVwb1N0YXRlKGVudiwgZmlsZVBhdGhzKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsbG4oIkZhaWxlZCB0byBzZXJpYWxpemUgc3RhdGU6IiwgZXJyKQorCX0KKworCXJlc3AgOj0gbmV3KGFwYi5EZXBzUmVzcG9uc2UpCisJcmVzdWx0LCBlcnIgOj0gcnVuQ0NhbmFseXplcihjdHgsIGVudiwgImRlcHMiLCBzdGF0ZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCisJaWYgZXJyIDo9IHByb3RvLlVubWFyc2hhbChyZXN1bHQsIHJlc3ApOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigibWFsZm9ybWVkIHJlc3BvbnNlIGZyb20gY2NfYW5hbHl6ZXI6ICV2IiwgZXJyKQorCX0KKworCXZhciB0YXJnZXRzIFtdc3RyaW5nCisJaWYgcmVzcC5TdGF0dXMgIT0gbmlsICYmIHJlc3AuU3RhdHVzLkNvZGUgIT0gYXBiLlN0YXR1c19PSyB7CisJCXJldHVybiB0YXJnZXRzLCBmbXQuRXJyb3JmKCJjY19hbmFseXplciBmYWlsZWQ6ICV2IiwgcmVzcC5TdGF0dXMuTWVzc2FnZSkKKwl9CisKKwlmb3IgXywgZGVwcyA6PSByYW5nZSByZXNwLkRlcHMgeworCQl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIGRlcHMuQnVpbGRUYXJnZXQuLi4pCisJfQorCXJldHVybiB0YXJnZXRzLCBuaWwKK30KKworZnVuYyBnZXRDQ0lucHV0cyhjdHggY29udGV4dC5Db250ZXh0LCBlbnYgRW52LCBmaWxlUGF0aHMgW11zdHJpbmcpIChbXSpwYi5BbmFseXNpc1Jlc3VsdCwgW10qcGIuQnVpbGRhYmxlVW5pdCwgZXJyb3IpIHsKKwlzdGF0ZSwgZXJyIDo9IHByb3RvLk1hcnNoYWwocmVwb1N0YXRlKGVudiwgZmlsZVBhdGhzKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsbG4oIkZhaWxlZCB0byBzZXJpYWxpemUgc3RhdGU6IiwgZXJyKQorCX0KKworCXJlc3AgOj0gbmV3KGFwYi5JZGVBbmFseXNpcykKKwlyZXN1bHQsIGVyciA6PSBydW5DQ2FuYWx5emVyKGN0eCwgZW52LCAiaW5wdXRzIiwgc3RhdGUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZm10LkVycm9yZigiY2NfYW5hbHl6ZXIgZmFpbGVkOiIsIGVycikKKwl9CisJaWYgZXJyIDo9IHByb3RvLlVubWFyc2hhbChyZXN1bHQsIHJlc3ApOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJtYWxmb3JtZWQgcmVzcG9uc2UgZnJvbSBjY19hbmFseXplcjogJXYiLCBlcnIpCisJfQorCWlmIHJlc3AuU3RhdHVzICE9IG5pbCAmJiByZXNwLlN0YXR1cy5Db2RlICE9IGFwYi5TdGF0dXNfT0sgeworCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoImNjX2FuYWx5emVyIGZhaWxlZDogJXYiLCByZXNwLlN0YXR1cy5NZXNzYWdlKQorCX0KKworCXZhciByZXN1bHRzIFtdKnBiLkFuYWx5c2lzUmVzdWx0CisJdmFyIHVuaXRzIFtdKnBiLkJ1aWxkYWJsZVVuaXQKKwlmb3IgXywgcyA6PSByYW5nZSByZXNwLlNvdXJjZXMgeworCQlzdGF0dXMgOj0gJnBiLkFuYWx5c2lzUmVzdWx0X1N0YXR1c3sKKwkJCUNvZGU6IHBiLkFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX09LLAorCQl9CisJCWlmIHMuR2V0U3RhdHVzKCkuR2V0Q29kZSgpICE9IGFwYi5TdGF0dXNfT0sgeworCQkJc3RhdHVzLkNvZGUgPSBwYi5BbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9CVUlMRF9GQUlMRUQKKwkJCXN0YXR1cy5TdGF0dXNNZXNzYWdlID0gcHJvdG8uU3RyaW5nKHMuR2V0U3RhdHVzKCkuR2V0TWVzc2FnZSgpKQorCQl9CisKKwkJcmVzdWx0IDo9ICZwYi5BbmFseXNpc1Jlc3VsdHsKKwkJCVNvdXJjZUZpbGVQYXRoOiBzLkdldFBhdGgoKSwKKwkJCVVuaXRJZDogICAgICAgICBzLkdldFBhdGgoKSwKKwkJCVN0YXR1czogICAgICAgICBzdGF0dXMsCisJCX0KKwkJcmVzdWx0cyA9IGFwcGVuZChyZXN1bHRzLCByZXN1bHQpCisKKwkJdmFyIGdlbmVyYXRlZCBbXSpwYi5HZW5lcmF0ZWRGaWxlCisJCWZvciBfLCBmIDo9IHJhbmdlIHMuR2VuZXJhdGVkIHsKKwkJCWdlbmVyYXRlZCA9IGFwcGVuZChnZW5lcmF0ZWQsICZwYi5HZW5lcmF0ZWRGaWxleworCQkJCVBhdGg6ICAgICBmLkdldFBhdGgoKSwKKwkJCQlDb250ZW50czogZi5HZXRDb250ZW50cygpLAorCQkJfSkKKwkJfQorCQlnZW5Vbml0IDo9ICZwYi5CdWlsZGFibGVVbml0eworCQkJSWQ6ICAgICAgICAgICAgICAiZ2VuZmlsZXNfZm9yXyIgKyBzLkdldFBhdGgoKSwKKwkJCVNvdXJjZUZpbGVQYXRoczogcy5HZXREZXBzKCksCisJCQlHZW5lcmF0ZWRGaWxlczogIGdlbmVyYXRlZCwKKwkJfQorCisJCXVuaXQgOj0gJnBiLkJ1aWxkYWJsZVVuaXR7CisJCQlJZDogICAgICAgICAgICAgICAgcy5HZXRQYXRoKCksCisJCQlMYW5ndWFnZTogICAgICAgICAgcGIuTGFuZ3VhZ2VfTEFOR1VBR0VfQ1BQLAorCQkJU291cmNlRmlsZVBhdGhzOiAgIFtdc3RyaW5ne3MuR2V0UGF0aCgpfSwKKwkJCUNvbXBpbGVyQXJndW1lbnRzOiBzLkdldENvbXBpbGVyQXJndW1lbnRzKCksCisJCQlEZXBlbmRlbmN5SWRzOiAgICAgW11zdHJpbmd7Z2VuVW5pdC5HZXRJZCgpfSwKKwkJfQorCQl1bml0cyA9IGFwcGVuZCh1bml0cywgdW5pdCwgZ2VuVW5pdCkKKwl9CisJcmV0dXJuIHJlc3VsdHMsIHVuaXRzLCBuaWwKK30KKworLy8gZmluZEphdmFNb2R1bGVzIHRyaWVzIHRvIGZpbmQgdGhlIG1vZHVsZXMgdGhhdCBjb3ZlciB0aGUgZ2l2ZW4gZmlsZSBwYXRocy4KKy8vIElmIGEgZmlsZSBpcyBjb3ZlcmVkIGJ5IG11bHRpcGxlIG1vZHVsZXMsIHRoZSBmaXJzdCBtb2R1bGUgaXMgcmV0dXJuZWQuCitmdW5jIGZpbmRKYXZhTW9kdWxlcyhwYXRocyBbXXN0cmluZywgbW9kdWxlcyBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlKSBtYXBbc3RyaW5nXXN0cmluZyB7CisJcmV0IDo9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJZm9yIG5hbWUsIG1vZHVsZSA6PSByYW5nZSBtb2R1bGVzIHsKKwkJaWYgc3RyaW5ncy5IYXNTdWZmaXgobmFtZSwgIi5pbXBsIikgeworCQkJY29udGludWUKKwkJfQorCisJCWZvciBpLCBwIDo9IHJhbmdlIHBhdGhzIHsKKwkJCWlmIHNsaWNlcy5Db250YWlucyhtb2R1bGUuU3JjcywgcCkgeworCQkJCXJldFtwXSA9IG5hbWUKKwkJCQlwYXRocyA9IGFwcGVuZChwYXRoc1s6aV0sIHBhdGhzW2krMTpdLi4uKQorCQkJCWJyZWFrCisJCQl9CisJCX0KKwkJaWYgbGVuKHBhdGhzKSA9PSAwIHsKKwkJCWJyZWFrCisJCX0KKwl9CisJcmV0dXJuIHJldAorfQorCitmdW5jIGdldEphdmFJbnB1dHMoZW52IEVudiwgbW9kdWxlc0J5UGF0aCBtYXBbc3RyaW5nXXN0cmluZywgbW9kdWxlcyBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlKSAoW10qcGIuQW5hbHlzaXNSZXN1bHQsIFtdKnBiLkJ1aWxkYWJsZVVuaXQpIHsKKwl2YXIgcmVzdWx0cyBbXSpwYi5BbmFseXNpc1Jlc3VsdAorCXVuaXRzQnlJZCA6PSBtYWtlKG1hcFtzdHJpbmddKnBiLkJ1aWxkYWJsZVVuaXQpCisJZm9yIHAsIG1vZHVsZU5hbWUgOj0gcmFuZ2UgbW9kdWxlc0J5UGF0aCB7CisJCXIgOj0gJnBiLkFuYWx5c2lzUmVzdWx0eworCQkJU291cmNlRmlsZVBhdGg6IHAsCisJCX0KKwkJcmVzdWx0cyA9IGFwcGVuZChyZXN1bHRzLCByKQorCisJCW0gOj0gbW9kdWxlc1ttb2R1bGVOYW1lXQorCQlpZiBtID09IG5pbCB7CisJCQlyLlN0YXR1cyA9ICZwYi5BbmFseXNpc1Jlc3VsdF9TdGF0dXN7CisJCQkJQ29kZTogICAgICAgICAgcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfTk9UX0ZPVU5ELAorCQkJCVN0YXR1c01lc3NhZ2U6IHByb3RvLlN0cmluZygiRmlsZSBub3QgZm91bmQgaW4gYW55IG1vZHVsZS4iKSwKKwkJCX0KKwkJCWNvbnRpbnVlCisJCX0KKworCQlyLlVuaXRJZCA9IG1vZHVsZU5hbWUKKwkJci5TdGF0dXMgPSAmcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVze0NvZGU6IHBiLkFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX09LfQorCQlpZiB1bml0c0J5SWRbci5Vbml0SWRdICE9IG5pbCB7CisJCQkvLyBGaWxlIGlzIGNvdmVyZWQgYnkgYW4gYWxyZWFkeSBjcmVhdGVkIHVuaXQuCisJCQljb250aW51ZQorCQl9CisKKwkJdSA6PSAmcGIuQnVpbGRhYmxlVW5pdHsKKwkJCUlkOiAgICAgICAgICAgICAgbW9kdWxlTmFtZSwKKwkJCUxhbmd1YWdlOiAgICAgICAgcGIuTGFuZ3VhZ2VfTEFOR1VBR0VfSkFWQSwKKwkJCVNvdXJjZUZpbGVQYXRoczogbS5TcmNzLAorCQl9CisJCXVuaXRzQnlJZFt1LklkXSA9IHUKKworCQlxIDo9IGxpc3QuTmV3KCkKKwkJZm9yIF8sIGQgOj0gcmFuZ2UgbS5EZXBzIHsKKwkJCXEuUHVzaEJhY2soZCkKKwkJfQorCQlmb3IgcS5MZW4oKSA+IDAgeworCQkJbmFtZSA6PSBxLlJlbW92ZShxLkZyb250KCkpLihzdHJpbmcpCisJCQltb2QgOj0gbW9kdWxlc1tuYW1lXQorCQkJaWYgbW9kID09IG5pbCB8fCB1bml0c0J5SWRbbmFtZV0gIT0gbmlsIHsKKwkJCQljb250aW51ZQorCQkJfQorCisJCQl2YXIgcGF0aHMgW11zdHJpbmcKKwkJCXBhdGhzID0gYXBwZW5kKHBhdGhzLCBtb2QuU3Jjcy4uLikKKwkJCXBhdGhzID0gYXBwZW5kKHBhdGhzLCBtb2QuU3JjSmFycy4uLikKKwkJCXBhdGhzID0gYXBwZW5kKHBhdGhzLCBtb2QuSmFycy4uLikKKwkJCXVuaXRzQnlJZFtuYW1lXSA9ICZwYi5CdWlsZGFibGVVbml0eworCQkJCUlkOiAgICAgICAgICAgICAgbmFtZSwKKwkJCQlTb3VyY2VGaWxlUGF0aHM6IG1vZC5TcmNzLAorCQkJCUdlbmVyYXRlZEZpbGVzOiAgZ2VuRmlsZXMoZW52LCBwYXRocyksCisJCQl9CisKKwkJCWZvciBfLCBkIDo9IHJhbmdlIG1vZC5EZXBzIHsKKwkJCQlxLlB1c2hCYWNrKGQpCisJCQl9CisJCX0KKwl9CisKKwl1bml0cyA6PSBtYWtlKFtdKnBiLkJ1aWxkYWJsZVVuaXQsIDAsIGxlbih1bml0c0J5SWQpKQorCWZvciBfLCB1IDo9IHJhbmdlIHVuaXRzQnlJZCB7CisJCXVuaXRzID0gYXBwZW5kKHVuaXRzLCB1KQorCX0KKwlyZXR1cm4gcmVzdWx0cywgdW5pdHMKK30KKworLy8gZ2VuRmlsZXMgcmV0dXJucyB0aGUgZ2VuZXJhdGVkIGZpbGVzIChwYXRocyB0aGF0IHN0YXJ0IHdpdGggb3V0RGlyLykgZm9yIHRoZQorLy8gZ2l2ZW4gcGF0aHMuIEdlbmVyYXRlZCBmaWxlcyB0aGF0IGRvIG5vdCBleGlzdCBhcmUgaWdub3JlZC4KK2Z1bmMgZ2VuRmlsZXMoZW52IEVudiwgcGF0aHMgW11zdHJpbmcpIFtdKnBiLkdlbmVyYXRlZEZpbGUgeworCXByZWZpeCA6PSBlbnYuT3V0RGlyICsgIi8iCisJdmFyIHJldCBbXSpwYi5HZW5lcmF0ZWRGaWxlCisJZm9yIF8sIHAgOj0gcmFuZ2UgcGF0aHMgeworCQlyZWxQYXRoLCBvayA6PSBzdHJpbmdzLkN1dFByZWZpeChwLCBwcmVmaXgpCisJCWlmICFvayB7CisJCQljb250aW51ZQorCQl9CisKKwkJY29udGVudHMsIGVyciA6PSBvcy5SZWFkRmlsZShwYXRoLkpvaW4oZW52LlJlcG9EaXIsIHApKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCWNvbnRpbnVlCisJCX0KKworCQlyZXQgPSBhcHBlbmQocmV0LCAmcGIuR2VuZXJhdGVkRmlsZXsKKwkJCVBhdGg6ICAgICByZWxQYXRoLAorCQkJQ29udGVudHM6IGNvbnRlbnRzLAorCQl9KQorCX0KKwlyZXR1cm4gcmV0Cit9CisKKy8vIHJ1bk1ha2UgcnVucyBTb29uZyBidWlsZCBmb3IgdGhlIGdpdmVuIG1vZHVsZXMuCitmdW5jIHJ1bk1ha2UoY3R4IGNvbnRleHQuQ29udGV4dCwgZW52IEVudiwgbW9kdWxlcyAuLi5zdHJpbmcpIGVycm9yIHsKKwlhcmdzIDo9IFtdc3RyaW5neworCQkiLS1tYWtlLW1vZGUiLAorCQkiQU5EUk9JRF9CVUlMRF9FTlZJUk9OTUVOVF9DT05GSUc9Z29vZ2xlci1jb2ciLAorCQkiU09PTkdfR0VOX0NPTVBEQj0xIiwKKwkJIlRBUkdFVF9QUk9EVUNUPSIgKyBlbnYuTHVuY2hUYXJnZXQuUHJvZHVjdCwKKwkJIlRBUkdFVF9SRUxFQVNFPSIgKyBlbnYuTHVuY2hUYXJnZXQuUmVsZWFzZSwKKwkJIlRBUkdFVF9CVUlMRF9WQVJJQU5UPSIgKyBlbnYuTHVuY2hUYXJnZXQuVmFyaWFudCwKKwkJIlRBUkdFVF9CVUlMRF9UWVBFPXJlbGVhc2UiLAorCQkiLWsiLAorCX0KKwlhcmdzID0gYXBwZW5kKGFyZ3MsIG1vZHVsZXMuLi4pCisJY21kIDo9IGV4ZWMuQ29tbWFuZENvbnRleHQoY3R4LCAiYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCIsIGFyZ3MuLi4pCisJY21kLkRpciA9IGVudi5SZXBvRGlyCisJY21kLlN0ZG91dCA9IG9zLlN0ZGVycgorCWNtZC5TdGRlcnIgPSBvcy5TdGRlcnIKKwlyZXR1cm4gY21kLlJ1bigpCit9CisKK3R5cGUgamF2YU1vZHVsZSBzdHJ1Y3QgeworCVBhdGggICAgW11zdHJpbmcgYGpzb246InBhdGgsb21pdGVtcHR5ImAKKwlEZXBzICAgIFtdc3RyaW5nIGBqc29uOiJkZXBlbmRlbmNpZXMsb21pdGVtcHR5ImAKKwlTcmNzICAgIFtdc3RyaW5nIGBqc29uOiJzcmNzLG9taXRlbXB0eSJgCisJSmFycyAgICBbXXN0cmluZyBganNvbjoiamFycyxvbWl0ZW1wdHkiYAorCVNyY0phcnMgW11zdHJpbmcgYGpzb246InNyY2phcnMsb21pdGVtcHR5ImAKK30KKworZnVuYyBsb2FkSmF2YU1vZHVsZXMoZW52IEVudikgKG1hcFtzdHJpbmddKmphdmFNb2R1bGUsIGVycm9yKSB7CisJamF2YURlcHNQYXRoIDo9IHBhdGguSm9pbihlbnYuUmVwb0RpciwgZW52Lk91dERpciwgInNvb25nL21vZHVsZV9icF9qYXZhX2RlcHMuanNvbiIpCisJZGF0YSwgZXJyIDo9IG9zLlJlYWRGaWxlKGphdmFEZXBzUGF0aCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCisJdmFyIHJldCBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlIC8vIG1vZHVsZSBuYW1lIC0+IG1vZHVsZQorCWlmIGVyciA9IGpzb24uVW5tYXJzaGFsKGRhdGEsICZyZXQpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCisJLy8gQWRkIHRvcCBsZXZlbCBqYXZhX3Nka19saWJyYXJ5IGZvciAuaW1wbCBtb2R1bGVzLgorCWZvciBuYW1lLCBtb2R1bGUgOj0gcmFuZ2UgcmV0IHsKKwkJaWYgc3RyaXBlZCA6PSBzdHJpbmdzLlRyaW1TdWZmaXgobmFtZSwgIi5pbXBsIik7IHN0cmlwZWQgIT0gbmFtZSB7CisJCQlyZXRbc3RyaXBlZF0gPSBtb2R1bGUKKwkJfQorCX0KKwlyZXR1cm4gcmV0LCBuaWwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuc2ggYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmOWIwYzQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoCkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9iYXNoIC1lCisKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NkICQoZGlybmFtZSAkQkFTSF9TT1VSQ0UpCitzb3VyY2UgJChwd2QpLy4uLy4uL3NoZWxsX3V0aWxzLnNoCityZXF1aXJlX3RvcAorCisjIEVuc3VyZSBjb2dzZXR1cCAob3V0LyB3aWxsIGJlIHN5bWxpbmsgb3V0c2lkZSB0aGUgcmVwbykKKy4gJHtUT1B9L2J1aWxkL21ha2UvY29nc2V0dXAuc2gKKworY2FzZSAkKHVuYW1lIC1zKSBpbgorICAgIExpbnV4KQorICAgICAgZXhwb3J0IFBSRUJVSUxUU19DTEFOR19UT09MU19ST09UPSIke1RPUH0vcHJlYnVpbHRzL2NsYW5nLXRvb2xzL2xpbnV4LXg4Ni8iCisgICAgICBQUkVCVUlMVFNfR09fUk9PVD0iJHtUT1B9L3ByZWJ1aWx0cy9nby9saW51eC14ODYvIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZWNobyAiT25seSBzdXBwb3J0ZWQgZm9yIGxpbnV4IGhvc3RzIiA+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKK2VzYWMKKworZXhwb3J0IEJVSUxEX0VOVl9TRVFVRU5DRV9OVU1CRVI9MTMKK2V4cG9ydCBBTkRST0lEX0JVSUxEX1RPUD0kVE9QCitleHBvcnQgT1VUX0RJUj0ke09VVF9ESVJ9CitleGVjICIke1BSRUJVSUxUU19HT19ST09UfS9iaW4vZ28iICJydW4iICJpZGVfcXVlcnkiICIkQCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vaWRlX3F1ZXJ5LnBiLmdvIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9pZGVfcXVlcnkucGIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5MDIyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vaWRlX3F1ZXJ5LnBiLmdvCkBAIC0wLDAgKzEsOTY0IEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIENvZGUgZ2VuZXJhdGVkIGJ5IHByb3RvYy1nZW4tZ28uIERPIE5PVCBFRElULgorLy8gdmVyc2lvbnM6CisvLyAJcHJvdG9jLWdlbi1nbyB2MS4zMC4wCisvLyAJcHJvdG9jICAgICAgICB2My4yMS4xMgorLy8gc291cmNlOiBpZGVfcXVlcnkucHJvdG8KKworcGFja2FnZSBpZGVfcXVlcnlfcHJvdG8KKworaW1wb3J0ICgKKwlwcm90b3JlZmxlY3QgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCXByb3RvaW1wbCAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcnVudGltZS9wcm90b2ltcGwiCisJcmVmbGVjdCAicmVmbGVjdCIKKwlzeW5jICJzeW5jIgorKQorCitjb25zdCAoCisJLy8gVmVyaWZ5IHRoYXQgdGhpcyBnZW5lcmF0ZWQgY29kZSBpcyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZS4KKwlfID0gcHJvdG9pbXBsLkVuZm9yY2VWZXJzaW9uKDIwIC0gcHJvdG9pbXBsLk1pblZlcnNpb24pCisJLy8gVmVyaWZ5IHRoYXQgcnVudGltZS9wcm90b2ltcGwgaXMgc3VmZmljaWVudGx5IHVwLXRvLWRhdGUuCisJXyA9IHByb3RvaW1wbC5FbmZvcmNlVmVyc2lvbihwcm90b2ltcGwuTWF4VmVyc2lvbiAtIDIwKQorKQorCit0eXBlIExhbmd1YWdlIGludDMyCisKK2NvbnN0ICgKKwlMYW5ndWFnZV9MQU5HVUFHRV9VTlNQRUNJRklFRCBMYW5ndWFnZSA9IDAKKwlMYW5ndWFnZV9MQU5HVUFHRV9KQVZBICAgICAgICBMYW5ndWFnZSA9IDEgLy8gYWxzbyBpbmNsdWRlcyBLb3RsaW4KKwlMYW5ndWFnZV9MQU5HVUFHRV9DUFAgICAgICAgICBMYW5ndWFnZSA9IDIKKykKKworLy8gRW51bSB2YWx1ZSBtYXBzIGZvciBMYW5ndWFnZS4KK3ZhciAoCisJTGFuZ3VhZ2VfbmFtZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJCTA6ICJMQU5HVUFHRV9VTlNQRUNJRklFRCIsCisJCTE6ICJMQU5HVUFHRV9KQVZBIiwKKwkJMjogIkxBTkdVQUdFX0NQUCIsCisJfQorCUxhbmd1YWdlX3ZhbHVlID0gbWFwW3N0cmluZ11pbnQzMnsKKwkJIkxBTkdVQUdFX1VOU1BFQ0lGSUVEIjogMCwKKwkJIkxBTkdVQUdFX0pBVkEiOiAgICAgICAgMSwKKwkJIkxBTkdVQUdFX0NQUCI6ICAgICAgICAgMiwKKwl9CispCisKK2Z1bmMgKHggTGFuZ3VhZ2UpIEVudW0oKSAqTGFuZ3VhZ2UgeworCXAgOj0gbmV3KExhbmd1YWdlKQorCSpwID0geAorCXJldHVybiBwCit9CisKK2Z1bmMgKHggTGFuZ3VhZ2UpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLkVudW1TdHJpbmdPZih4LkRlc2NyaXB0b3IoKSwgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIoeCkpCit9CisKK2Z1bmMgKExhbmd1YWdlKSBEZXNjcmlwdG9yKCkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yIHsKKwlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fZW51bVR5cGVzWzBdLkRlc2NyaXB0b3IoKQorfQorCitmdW5jIChMYW5ndWFnZSkgVHlwZSgpIHByb3RvcmVmbGVjdC5FbnVtVHlwZSB7CisJcmV0dXJuICZmaWxlX2lkZV9xdWVyeV9wcm90b19lbnVtVHlwZXNbMF0KK30KKworZnVuYyAoeCBMYW5ndWFnZSkgTnVtYmVyKCkgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIgeworCXJldHVybiBwcm90b3JlZmxlY3QuRW51bU51bWJlcih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTGFuZ3VhZ2UuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoTGFuZ3VhZ2UpIEVudW1EZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MH0KK30KKwordHlwZSBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSBpbnQzMgorCitjb25zdCAoCisJQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfVU5TUEVDSUZJRUQgIEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlID0gMAorCUFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX09LICAgICAgICAgICBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSA9IDEKKwlBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9OT1RfRk9VTkQgICAgQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUgPSAyIC8vIG5vIHRhcmdldCBvciBtb2R1bGUgZm91bmQgZm9yIHRoZSBzb3VyY2UgZmlsZS4KKwlBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9CVUlMRF9GQUlMRUQgQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUgPSAzCispCisKKy8vIEVudW0gdmFsdWUgbWFwcyBmb3IgQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUuCit2YXIgKAorCUFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlX25hbWUgPSBtYXBbaW50MzJdc3RyaW5neworCQkwOiAiQ09ERV9VTlNQRUNJRklFRCIsCisJCTE6ICJDT0RFX09LIiwKKwkJMjogIkNPREVfTk9UX0ZPVU5EIiwKKwkJMzogIkNPREVfQlVJTERfRkFJTEVEIiwKKwl9CisJQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGVfdmFsdWUgPSBtYXBbc3RyaW5nXWludDMyeworCQkiQ09ERV9VTlNQRUNJRklFRCI6ICAwLAorCQkiQ09ERV9PSyI6ICAgICAgICAgICAxLAorCQkiQ09ERV9OT1RfRk9VTkQiOiAgICAyLAorCQkiQ09ERV9CVUlMRF9GQUlMRUQiOiAzLAorCX0KKykKKworZnVuYyAoeCBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgRW51bSgpICpBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSB7CisJcCA6PSBuZXcoQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUpCisJKnAgPSB4CisJcmV0dXJuIHAKK30KKworZnVuYyAoeCBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguRW51bVN0cmluZ09mKHguRGVzY3JpcHRvcigpLCBwcm90b3JlZmxlY3QuRW51bU51bWJlcih4KSkKK30KKworZnVuYyAoQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUpIERlc2NyaXB0b3IoKSBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19lbnVtVHlwZXNbMV0uRGVzY3JpcHRvcigpCit9CisKK2Z1bmMgKEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlKSBUeXBlKCkgcHJvdG9yZWZsZWN0LkVudW1UeXBlIHsKKwlyZXR1cm4gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2VudW1UeXBlc1sxXQorfQorCitmdW5jICh4IEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlKSBOdW1iZXIoKSBwcm90b3JlZmxlY3QuRW51bU51bWJlciB7CisJcmV0dXJuIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZS5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jIChBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgRW51bURlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHszLCAwLCAwfQorfQorCit0eXBlIEdlbmVyYXRlZEZpbGUgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIGJ1aWxkX291dF9kaXIuCisJUGF0aCBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPXBhdGgscHJvdG8zIiBqc29uOiJwYXRoLG9taXRlbXB0eSJgCisJLy8gVGhlIHRleHQgb2YgdGhlIGdlbmVyYXRlZCBmaWxlLCBpZiBub3QgcHJvdmlkZWQgY29udGVudHMgd2lsbCBiZSByZWFkCisJLy8gZnJvbSB0aGUgcGF0aCBhYm92ZSBpbiB1c2VyJ3Mgd29ya3N0YXRpb24uCisJQ29udGVudHMgW11ieXRlIGBwcm90b2J1ZjoiYnl0ZXMsMixvcHQsbmFtZT1jb250ZW50cyxwcm90bzMsb25lb2YiIGpzb246ImNvbnRlbnRzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkdlbmVyYXRlZEZpbGUpIFJlc2V0KCkgeworCSp4ID0gR2VuZXJhdGVkRmlsZXt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMF0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkdlbmVyYXRlZEZpbGUpIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkdlbmVyYXRlZEZpbGUpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMF0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgR2VuZXJhdGVkRmlsZS5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkdlbmVyYXRlZEZpbGUpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHswfQorfQorCitmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBHZXRQYXRoKCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlBhdGgKKwl9CisJcmV0dXJuICIiCit9CisKK2Z1bmMgKHggKkdlbmVyYXRlZEZpbGUpIEdldENvbnRlbnRzKCkgW11ieXRlIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkNvbnRlbnRzCisJfQorCXJldHVybiBuaWwKK30KKwordHlwZSBJZGVBbmFseXNpcyBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCS8vIERpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGJ1aWxkIG91dHB1dHMgZ2VuZXJhdGVkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uCisJLy8gUmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCUJ1aWxkT3V0RGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9YnVpbGRfb3V0X2Rpcixqc29uPWJ1aWxkT3V0RGlyLHByb3RvMyIganNvbjoiYnVpbGRfb3V0X2RpcixvbWl0ZW1wdHkiYAorCS8vIFdvcmtpbmcgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4KKwkvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisJV29ya2luZ0RpciBzdHJpbmcgYHByb3RvYnVmOiJieXRlcyw0LG9wdCxuYW1lPXdvcmtpbmdfZGlyLGpzb249d29ya2luZ0Rpcixwcm90bzMiIGpzb246IndvcmtpbmdfZGlyLG9taXRlbXB0eSJgCisJLy8gT25seSBzZXQgaWYgdGhlIHdob2xlIHF1ZXJ5IGZhaWxlZC4KKwlFcnJvciAqQW5hbHlzaXNFcnJvciBgcHJvdG9idWY6ImJ5dGVzLDUsb3B0LG5hbWU9ZXJyb3IscHJvdG8zLG9uZW9mIiBqc29uOiJlcnJvcixvbWl0ZW1wdHkiYAorCS8vIExpc3Qgb2YgcmVzdWx0cywgb25lIHBlciBxdWVyaWVkIGZpbGUuCisJUmVzdWx0cyBbXSpBbmFseXNpc1Jlc3VsdCBgcHJvdG9idWY6ImJ5dGVzLDYscmVwLG5hbWU9cmVzdWx0cyxwcm90bzMiIGpzb246InJlc3VsdHMsb21pdGVtcHR5ImAKKwkvLyBMaXN0IG9mIGJ1aWxkYWJsZSB1bml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHJlZmVyZW5jZXMgYnkgdGhlIHJlc3VsdHMuCisJVW5pdHMgW10qQnVpbGRhYmxlVW5pdCBgcHJvdG9idWY6ImJ5dGVzLDcscmVwLG5hbWU9dW5pdHMscHJvdG8zIiBqc29uOiJ1bml0cyxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgUmVzZXQoKSB7CisJKnggPSBJZGVBbmFseXNpc3t9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMV0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpJZGVBbmFseXNpcykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMV0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgSWRlQW5hbHlzaXMuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpJZGVBbmFseXNpcykgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezF9Cit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRCdWlsZE91dERpcigpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5CdWlsZE91dERpcgorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIEdldFdvcmtpbmdEaXIoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguV29ya2luZ0RpcgorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIEdldEVycm9yKCkgKkFuYWx5c2lzRXJyb3IgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguRXJyb3IKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgR2V0UmVzdWx0cygpIFtdKkFuYWx5c2lzUmVzdWx0IHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlJlc3VsdHMKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgR2V0VW5pdHMoKSBbXSpCdWlsZGFibGVVbml0IHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlVuaXRzCisJfQorCXJldHVybiBuaWwKK30KKwordHlwZSBBbmFseXNpc0Vycm9yIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJLy8gSHVtYW4gcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKwlFcnJvck1lc3NhZ2Ugc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1lcnJvcl9tZXNzYWdlLGpzb249ZXJyb3JNZXNzYWdlLHByb3RvMyIganNvbjoiZXJyb3JfbWVzc2FnZSxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpBbmFseXNpc0Vycm9yKSBSZXNldCgpIHsKKwkqeCA9IEFuYWx5c2lzRXJyb3J7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzJdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqQW5hbHlzaXNFcnJvcikgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpBbmFseXNpc0Vycm9yKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpBbmFseXNpc0Vycm9yKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzJdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEFuYWx5c2lzRXJyb3IuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpBbmFseXNpc0Vycm9yKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7Mn0KK30KKworZnVuYyAoeCAqQW5hbHlzaXNFcnJvcikgR2V0RXJyb3JNZXNzYWdlKCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkVycm9yTWVzc2FnZQorCX0KKwlyZXR1cm4gIiIKK30KKwordHlwZSBBbmFseXNpc1Jlc3VsdCBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCS8vIFBhdGggdG8gdGhlIHNvdXJjZSBmaWxlIHRoYXQgd2FzIHF1ZXJpZWQsIHJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKwlTb3VyY2VGaWxlUGF0aCBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPXNvdXJjZV9maWxlX3BhdGgsanNvbj1zb3VyY2VGaWxlUGF0aCxwcm90bzMiIGpzb246InNvdXJjZV9maWxlX3BhdGgsb21pdGVtcHR5ImAKKwkvLyBSZXByZXNlbnRzIHN0YXR1cyBmb3IgdGhpcyByZXN1bHQuIGUuZy4gbm90IHBhcnQgb2YgdGhlIGJ1aWxkIGdyYXBoLgorCVN0YXR1cyAqQW5hbHlzaXNSZXN1bHRfU3RhdHVzIGBwcm90b2J1ZjoiYnl0ZXMsMixvcHQsbmFtZT1zdGF0dXMscHJvdG8zIiBqc29uOiJzdGF0dXMsb21pdGVtcHR5ImAKKwkvLyBJRCBvZiBidWlsZGFibGUgdW5pdCB0aGF0IGNvbnRhaW5zIHRoZSBzb3VyY2UgZmlsZS4KKwkvLyBUaGUgaWRlX3F1ZXJ5IHNjcmlwdCBjYW4gY2hvb3NlIHRoZSBtb3N0IHJlbGV2YW50IHVuaXQgZnJvbSBtdWx0aXBsZQorCS8vIG9wdGlvbnMuCisJVW5pdElkIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDMsb3B0LG5hbWU9dW5pdF9pZCxqc29uPXVuaXRJZCxwcm90bzMiIGpzb246InVuaXRfaWQsb21pdGVtcHR5ImAKKwkvLyBJbnZhbGlkYXRpb24gcnVsZSB0byBjaGVjayBpZiB0aGUgcmVzdWx0IGlzIHN0aWxsIHZhbGlkLgorCUludmFsaWRhdGlvbiAqSW52YWxpZGF0aW9uIGBwcm90b2J1ZjoiYnl0ZXMsNCxvcHQsbmFtZT1pbnZhbGlkYXRpb24scHJvdG8zIiBqc29uOiJpbnZhbGlkYXRpb24sb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHQpIFJlc2V0KCkgeworCSp4ID0gQW5hbHlzaXNSZXN1bHR7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzNdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHQpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQorfQorCitmdW5jICgqQW5hbHlzaXNSZXN1bHQpIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0KSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzNdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEFuYWx5c2lzUmVzdWx0LlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqQW5hbHlzaXNSZXN1bHQpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHszfQorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdCkgR2V0U291cmNlRmlsZVBhdGgoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU291cmNlRmlsZVBhdGgKKwl9CisJcmV0dXJuICIiCit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0KSBHZXRTdGF0dXMoKSAqQW5hbHlzaXNSZXN1bHRfU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0KSBHZXRVbml0SWQoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguVW5pdElkCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdCkgR2V0SW52YWxpZGF0aW9uKCkgKkludmFsaWRhdGlvbiB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5JbnZhbGlkYXRpb24KKwl9CisJcmV0dXJuIG5pbAorfQorCit0eXBlIEJ1aWxkYWJsZVVuaXQgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYnVpbGRhYmxlIHVuaXQuCisJLy8KKwkvLyBFeGFtcGxlczoKKwkvLyAgIC0gSmF2YTogbW9kdWxlIG9yIHRhcmdldCBuYW1lLCBlLmcuICJmcmFtZXdvcmstYmx1ZXRvb3RoIiBvcgorCS8vICAgICAiLy90aGlyZF9wYXJ0eS9oYW1jcmVzdDpoYW1jcmVzdF9qYXZhIgorCS8vICAgLSBDKys6IHNvdXJjZSBmaWxlLCBlLmcuICJwYXRoL3RvL2ZpbGUuY2MiCisJSWQgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1pZCxwcm90bzMiIGpzb246ImlkLG9taXRlbXB0eSJgCisJLy8gTGFuZ3VhZ2Ugb2YgdGhlIHVuaXQuCisJLy8gUmVxdWlyZWQgZm9yIGJ1aWxkYWJsZSB1bml0cyBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IHRoZSBBbmFseXNpc1Jlc3VsdCwKKwkvLyBlLmcuIHRoZSB1bml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcGlsYXRpb24gc3RhZ2UgZm9yIHRoZSBzb3VyY2UgZmlsZS4KKwlMYW5ndWFnZSBMYW5ndWFnZSBgcHJvdG9idWY6InZhcmludCwyLG9wdCxuYW1lPWxhbmd1YWdlLHByb3RvMyxlbnVtPWlkZV9xdWVyeS5MYW5ndWFnZSIganNvbjoibGFuZ3VhZ2Usb21pdGVtcHR5ImAKKwkvLyBTb3VyY2UgZmlsZXMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHVuaXQuCisJLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3JraW5nX2Rpci4KKwlTb3VyY2VGaWxlUGF0aHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcywzLHJlcCxuYW1lPXNvdXJjZV9maWxlX3BhdGhzLGpzb249c291cmNlRmlsZVBhdGhzLHByb3RvMyIganNvbjoic291cmNlX2ZpbGVfcGF0aHMsb21pdGVtcHR5ImAKKwkvLyBDb21waWxlciBhcmd1bWVudHMgdG8gY29tcGlsZSB0aGUgc291cmNlIGZpbGVzLgorCUNvbXBpbGVyQXJndW1lbnRzIFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsNCxyZXAsbmFtZT1jb21waWxlcl9hcmd1bWVudHMsanNvbj1jb21waWxlckFyZ3VtZW50cyxwcm90bzMiIGpzb246ImNvbXBpbGVyX2FyZ3VtZW50cyxvbWl0ZW1wdHkiYAorCS8vIExpc3Qgb2YgZ2VuZXJhdGVkIGZpbGVzIHByb2R1Y2VkIGJ5IHRoaXMgdW5pdC4KKwlHZW5lcmF0ZWRGaWxlcyBbXSpHZW5lcmF0ZWRGaWxlIGBwcm90b2J1ZjoiYnl0ZXMsNSxyZXAsbmFtZT1nZW5lcmF0ZWRfZmlsZXMsanNvbj1nZW5lcmF0ZWRGaWxlcyxwcm90bzMiIGpzb246ImdlbmVyYXRlZF9maWxlcyxvbWl0ZW1wdHkiYAorCS8vIExpc3Qgb2Ygb3RoZXIgQnVpbGRhYmxlVW5pdHMgdGhpcyB1bml0IGRlcGVuZCBvbi4KKwlEZXBlbmRlbmN5SWRzIFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsNixyZXAsbmFtZT1kZXBlbmRlbmN5X2lkcyxqc29uPWRlcGVuZGVuY3lJZHMscHJvdG8zIiBqc29uOiJkZXBlbmRlbmN5X2lkcyxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpCdWlsZGFibGVVbml0KSBSZXNldCgpIHsKKwkqeCA9IEJ1aWxkYWJsZVVuaXR7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzRdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpCdWlsZGFibGVVbml0KSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpCdWlsZGFibGVVbml0KSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzRdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEJ1aWxkYWJsZVVuaXQuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpCdWlsZGFibGVVbml0KSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7NH0KK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgR2V0SWQoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguSWQKKwl9CisJcmV0dXJuICIiCit9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIEdldExhbmd1YWdlKCkgTGFuZ3VhZ2UgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguTGFuZ3VhZ2UKKwl9CisJcmV0dXJuIExhbmd1YWdlX0xBTkdVQUdFX1VOU1BFQ0lGSUVECit9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIEdldFNvdXJjZUZpbGVQYXRocygpIFtdc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlNvdXJjZUZpbGVQYXRocworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIEdldENvbXBpbGVyQXJndW1lbnRzKCkgW11zdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguQ29tcGlsZXJBcmd1bWVudHMKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpCdWlsZGFibGVVbml0KSBHZXRHZW5lcmF0ZWRGaWxlcygpIFtdKkdlbmVyYXRlZEZpbGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguR2VuZXJhdGVkRmlsZXMKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpCdWlsZGFibGVVbml0KSBHZXREZXBlbmRlbmN5SWRzKCkgW11zdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguRGVwZW5kZW5jeUlkcworCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIEludmFsaWRhdGlvbiBydWxlIHRvIGNoZWNrIGlmIHRoZSByZXN1bHQgaXMgc3RpbGwgdmFsaWQuCisvLyBUaGlzIHNob3VsZCBjb250YWluIGZpbGVzL2RpcnMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHBhcnQgb2YgdGhlIGJ1aWxkIGdyYXBoCisvLyBidXQgc3RpbGwgYWZmZWN0IHRoZSByZXN1bHQuIEZvciBleGFtcGxlIEJVSUxEIGZpbGVzLCBkaXJlY3RvcnkgdG8gdGhlCisvLyB0b29sY2hhaW4gb3IgY29uZmlnIGZpbGVzIGV0Yy4KK3R5cGUgSW52YWxpZGF0aW9uIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJLy8gSWYgYW55IG9mIHRoZXNlIGZpbGVzIGNoYW5nZSB0aGUgcmVzdWx0IG1heSBiZWNvbWUgaW52YWxpZC4KKwkvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKwlGaWxlUGF0aHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLHJlcCxuYW1lPWZpbGVfcGF0aHMsanNvbj1maWxlUGF0aHMscHJvdG8zIiBqc29uOiJmaWxlX3BhdGhzLG9taXRlbXB0eSJgCisJLy8gSWYgYW55IG9mIHRoZXNlIHJ1bGVzIG1hdGNoIGEgY2hhbmdlZCBmaWxlIHRoZSByZXN1bHQgbWF5IGJlY29tZSBpbnZhbGlkLgorCVdpbGRjYXJkcyBbXSpJbnZhbGlkYXRpb25fV2lsZGNhcmQgYHByb3RvYnVmOiJieXRlcyw0LHJlcCxuYW1lPXdpbGRjYXJkcyxwcm90bzMiIGpzb246IndpbGRjYXJkcyxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpJbnZhbGlkYXRpb24pIFJlc2V0KCkgeworCSp4ID0gSW52YWxpZGF0aW9ue30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s1XQorCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwl9Cit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbikgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpJbnZhbGlkYXRpb24pIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbikgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgeworCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s1XQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBJbnZhbGlkYXRpb24uUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpJbnZhbGlkYXRpb24pIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs1fQorfQorCitmdW5jICh4ICpJbnZhbGlkYXRpb24pIEdldEZpbGVQYXRocygpIFtdc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkZpbGVQYXRocworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbikgR2V0V2lsZGNhcmRzKCkgW10qSW52YWxpZGF0aW9uX1dpbGRjYXJkIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LldpbGRjYXJkcworCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIEluZGljYXRlcyB0aGUgc3VjY2Vzcy9mYWlsdXJlIGZvciB0aGUgcXVlcnkuCit0eXBlIEFuYWx5c2lzUmVzdWx0X1N0YXR1cyBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCUNvZGUgQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUgYHByb3RvYnVmOiJ2YXJpbnQsMSxvcHQsbmFtZT1jb2RlLHByb3RvMyxlbnVtPWlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSIganNvbjoiY29kZSxvbWl0ZW1wdHkiYAorCS8vIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cywgbWlnaHQgYmUgZGlzcGxheWVkIHRvIHVzZXIuCisJU3RhdHVzTWVzc2FnZSAqc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixvcHQsbmFtZT1zdGF0dXNfbWVzc2FnZSxqc29uPXN0YXR1c01lc3NhZ2UscHJvdG8zLG9uZW9mIiBqc29uOiJzdGF0dXNfbWVzc2FnZSxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMpIFJlc2V0KCkgeworCSp4ID0gQW5hbHlzaXNSZXN1bHRfU3RhdHVze30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s2XQorCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwl9Cit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpBbmFseXNpc1Jlc3VsdF9TdGF0dXMpIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgeworCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s2XQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBBbmFseXNpc1Jlc3VsdF9TdGF0dXMuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpBbmFseXNpc1Jlc3VsdF9TdGF0dXMpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHszLCAwfQorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMpIEdldENvZGUoKSBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db2RlCisJfQorCXJldHVybiBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9VTlNQRUNJRklFRAorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMpIEdldFN0YXR1c01lc3NhZ2UoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsICYmIHguU3RhdHVzTWVzc2FnZSAhPSBuaWwgeworCQlyZXR1cm4gKnguU3RhdHVzTWVzc2FnZQorCX0KKwlyZXR1cm4gIiIKK30KKwordHlwZSBJbnZhbGlkYXRpb25fV2lsZGNhcmQgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBQcmVmaXggb2YgdGhlIGZpbGUgcGF0aCAoZS5nLiAicGF0aC90by8iKQorCVByZWZpeCAqc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1wcmVmaXgscHJvdG8zLG9uZW9mIiBqc29uOiJwcmVmaXgsb21pdGVtcHR5ImAKKwkvLyBTdWZmaXggb2YgdGhlIGZpbGUgcGF0aCAoZS5nLiAiQW5kcm9pZC5icCIpCisJU3VmZml4ICpzdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN1ZmZpeCxwcm90bzMsb25lb2YiIGpzb246InN1ZmZpeCxvbWl0ZW1wdHkiYAorCS8vIElmIGZhbHNlLCB0aGUgcGFydCBvZiB0aGUgcGF0aCBiZXR3ZWVuIHRoZSBnaXZlbiBgcHJlZml4YCBhbmQgYHN1ZmZpeGAKKwkvLyBzaG91bGQgbm90IGNvbnRhaW4gZGlyZWN0b3J5IHNlcGFyYXRvcnMgKCcvJykuCisJQ2FuQ3Jvc3NGb2xkZXIgKmJvb2wgYHByb3RvYnVmOiJ2YXJpbnQsMyxvcHQsbmFtZT1jYW5fY3Jvc3NfZm9sZGVyLGpzb249Y2FuQ3Jvc3NGb2xkZXIscHJvdG8zLG9uZW9mIiBqc29uOiJjYW5fY3Jvc3NfZm9sZGVyLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgUmVzZXQoKSB7CisJKnggPSBJbnZhbGlkYXRpb25fV2lsZGNhcmR7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzddCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzddCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEludmFsaWRhdGlvbl9XaWxkY2FyZC5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezUsIDB9Cit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgR2V0UHJlZml4KCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCAmJiB4LlByZWZpeCAhPSBuaWwgeworCQlyZXR1cm4gKnguUHJlZml4CisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpJbnZhbGlkYXRpb25fV2lsZGNhcmQpIEdldFN1ZmZpeCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgJiYgeC5TdWZmaXggIT0gbmlsIHsKKwkJcmV0dXJuICp4LlN1ZmZpeAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBHZXRDYW5Dcm9zc0ZvbGRlcigpIGJvb2wgeworCWlmIHggIT0gbmlsICYmIHguQ2FuQ3Jvc3NGb2xkZXIgIT0gbmlsIHsKKwkJcmV0dXJuICp4LkNhbkNyb3NzRm9sZGVyCisJfQorCXJldHVybiBmYWxzZQorfQorCit2YXIgRmlsZV9pZGVfcXVlcnlfcHJvdG8gcHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yCisKK3ZhciBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjID0gW11ieXRleworCTB4MGEsIDB4MGYsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NzAsIDB4NzIsIDB4NmYsIDB4NzQsCisJMHg2ZiwgMHgxMiwgMHgwOSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyMiwgMHg1MSwgMHgwYSwgMHgwZCwKKwkweDQ3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDEyLCAweDEyLCAweDBhLAorCTB4MDQsIDB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MDQsIDB4NzAsIDB4NjEsIDB4NzQsCisJMHg2OCwgMHgxMiwgMHgxZiwgMHgwYSwgMHgwOCwgMHg2MywgMHg2ZiwgMHg2ZSwgMHg3NCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgxOCwgMHgwMiwgMHgyMCwKKwkweDAxLCAweDI4LCAweDBjLCAweDQ4LCAweDAwLCAweDUyLCAweDA4LCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDczLCAweDg4LAorCTB4MDEsIDB4MDEsIDB4NDIsIDB4MGIsIDB4MGEsIDB4MDksIDB4NWYsIDB4NjMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4MjIsCisJMHg4MiwgMHgwMiwgMHgwYSwgMHgwYiwgMHg0OSwgMHg2NCwgMHg2NSwgMHg0MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywgMHgxMiwKKwkweDIyLCAweDBhLCAweDBkLCAweDYyLCAweDc1LCAweDY5LCAweDZjLCAweDY0LCAweDVmLCAweDZmLCAweDc1LCAweDc0LCAweDVmLCAweDY0LCAweDY5LCAweDcyLAorCTB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGIsIDB4NjIsIDB4NzUsIDB4NjksIDB4NmMsIDB4NjQsIDB4NGYsIDB4NzUsIDB4NzQsCisJMHg0NCwgMHg2OSwgMHg3MiwgMHgxMiwgMHgxZiwgMHgwYSwgMHgwYiwgMHg3NywgMHg2ZiwgMHg3MiwgMHg2YiwgMHg2OSwgMHg2ZSwgMHg2NywgMHg1ZiwgMHg2NCwKKwkweDY5LCAweDcyLCAweDE4LCAweDA0LCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBhLCAweDc3LCAweDZmLCAweDcyLCAweDZiLCAweDY5LCAweDZlLAorCTB4NjcsIDB4NDQsIDB4NjksIDB4NzIsIDB4MTIsIDB4MzMsIDB4MGEsIDB4MDUsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmYsIDB4NzIsIDB4MTgsIDB4MDUsIDB4MjAsCisJMHgwMSwgMHgyOCwgMHgwYiwgMHgzMiwgMHgxOCwgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwKKwkweDQxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLCAweDQ1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDQ4LCAweDAwLCAweDUyLAorCTB4MDUsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmYsIDB4NzIsIDB4ODgsIDB4MDEsIDB4MDEsIDB4MTIsIDB4MzMsIDB4MGEsIDB4MDcsIDB4NzIsIDB4NjUsIDB4NzMsCisJMHg3NSwgMHg2YywgMHg3NCwgMHg3MywgMHgxOCwgMHgwNiwgMHgyMCwgMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgxOSwgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwKKwkweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDQxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLCAweDUyLAorCTB4NjUsIDB4NzMsIDB4NzUsIDB4NmMsIDB4NzQsIDB4NTIsIDB4MDcsIDB4NzIsIDB4NjUsIDB4NzMsIDB4NzUsIDB4NmMsIDB4NzQsIDB4NzMsIDB4MTIsIDB4MmUsCisJMHgwYSwgMHgwNSwgMHg3NSwgMHg2ZSwgMHg2OSwgMHg3NCwgMHg3MywgMHgxOCwgMHgwNywgMHgyMCwgMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgxOCwgMHgyZSwKKwkweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDQyLCAweDc1LCAweDY5LCAweDZjLCAweDY0LCAweDYxLAorCTB4NjIsIDB4NmMsIDB4NjUsIDB4NTUsIDB4NmUsIDB4NjksIDB4NzQsIDB4NTIsIDB4MDUsIDB4NzUsIDB4NmUsIDB4NjksIDB4NzQsIDB4NzMsIDB4NDIsIDB4MDgsCisJMHgwYSwgMHgwNiwgMHg1ZiwgMHg2NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHg0YSwgMHgwNCwgMHgwOCwgMHgwMiwgMHgxMCwgMHgwMywgMHg0YSwgMHgwNCwKKwkweDA4LCAweDAzLCAweDEwLCAweDA0LCAweDIyLCAweDM0LCAweDBhLCAweDBkLCAweDQxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLAorCTB4NDUsIDB4NzIsIDB4NzIsIDB4NmYsIDB4NzIsIDB4MTIsIDB4MjMsIDB4MGEsIDB4MGQsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmYsIDB4NzIsIDB4NWYsIDB4NmQsCisJMHg2NSwgMHg3MywgMHg3MywgMHg2MSwgMHg2NywgMHg2NSwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwYywgMHg2NSwgMHg3MiwKKwkweDcyLCAweDZmLCAweDcyLCAweDRkLCAweDY1LCAweDczLCAweDczLCAweDYxLCAweDY3LCAweDY1LCAweDIyLCAweGE1LCAweDAzLCAweDBhLCAweDBlLCAweDQxLAorCTB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsIDB4NTIsIDB4NjUsIDB4NzMsIDB4NzUsIDB4NmMsIDB4NzQsIDB4MTIsIDB4MjgsIDB4MGEsCisJMHgxMCwgMHg3MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg1ZiwgMHg2NiwgMHg2OSwgMHg2YywgMHg2NSwgMHg1ZiwgMHg3MCwgMHg2MSwgMHg3NCwKKwkweDY4LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBlLCAweDczLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDQ2LAorCTB4NjksIDB4NmMsIDB4NjUsIDB4NTAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MTIsIDB4MzgsIDB4MGEsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsCisJMHg3MywgMHgxOCwgMHgwMiwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwYiwgMHgzMiwgMHgyMCwgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwKKwkweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDQxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLCAweDUyLCAweDY1LCAweDczLCAweDc1LAorCTB4NmMsIDB4NzQsIDB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NTIsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsCisJMHg3MywgMHgxMiwgMHgxNywgMHgwYSwgMHgwNywgMHg3NSwgMHg2ZSwgMHg2OSwgMHg3NCwgMHg1ZiwgMHg2OSwgMHg2NCwgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwKKwkweDI4LCAweDA5LCAweDUyLCAweDA2LCAweDc1LCAweDZlLCAweDY5LCAweDc0LCAweDQ5LCAweDY0LCAweDEyLCAweDNiLCAweDBhLCAweDBjLCAweDY5LCAweDZlLAorCTB4NzYsIDB4NjEsIDB4NmMsIDB4NjksIDB4NjQsIDB4NjEsIDB4NzQsIDB4NjksIDB4NmYsIDB4NmUsIDB4MTgsIDB4MDQsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGIsCisJMHgzMiwgMHgxNywgMHgyZSwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0OSwgMHg2ZSwgMHg3NiwKKwkweDYxLCAweDZjLCAweDY5LCAweDY0LCAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDUyLCAweDBjLCAweDY5LCAweDZlLCAweDc2LCAweDYxLCAweDZjLAorCTB4NjksIDB4NjQsIDB4NjEsIDB4NzQsIDB4NjksIDB4NmYsIDB4NmUsIDB4MWEsIDB4ZDgsIDB4MDEsIDB4MGEsIDB4MDYsIDB4NTMsIDB4NzQsIDB4NjEsIDB4NzQsCisJMHg3NSwgMHg3MywgMHgxMiwgMHgzOSwgMHgwYSwgMHgwNCwgMHg2MywgMHg2ZiwgMHg2NCwgMHg2NSwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwZSwKKwkweDMyLCAweDI1LCAweDJlLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDQxLCAweDZlLCAweDYxLAorCTB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsIDB4NTIsIDB4NjUsIDB4NzMsIDB4NzUsIDB4NmMsIDB4NzQsIDB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsIDB4NzQsCisJMHg3NSwgMHg3MywgMHgyZSwgMHg0MywgMHg2ZiwgMHg2NCwgMHg2NSwgMHg1MiwgMHgwNCwgMHg2MywgMHg2ZiwgMHg2NCwgMHg2NSwgMHgxMiwgMHgyYSwgMHgwYSwKKwkweDBlLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDVmLCAweDZkLCAweDY1LCAweDczLCAweDczLCAweDYxLCAweDY3LCAweDY1LCAweDE4LAorCTB4MDIsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NDgsIDB4MDAsIDB4NTIsIDB4MGQsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NGQsCisJMHg2NSwgMHg3MywgMHg3MywgMHg2MSwgMHg2NywgMHg2NSwgMHg4OCwgMHgwMSwgMHgwMSwgMHgyMiwgMHg1NCwgMHgwYSwgMHgwNCwgMHg0MywgMHg2ZiwgMHg2NCwKKwkweDY1LCAweDEyLCAweDE0LCAweDBhLCAweDEwLCAweDQzLCAweDRmLCAweDQ0LCAweDQ1LCAweDVmLCAweDU1LCAweDRlLCAweDUzLCAweDUwLCAweDQ1LCAweDQzLAorCTB4NDksIDB4NDYsIDB4NDksIDB4NDUsIDB4NDQsIDB4MTAsIDB4MDAsIDB4MTIsIDB4MGIsIDB4MGEsIDB4MDcsIDB4NDMsIDB4NGYsIDB4NDQsIDB4NDUsIDB4NWYsCisJMHg0ZiwgMHg0YiwgMHgxMCwgMHgwMSwgMHgxMiwgMHgxMiwgMHgwYSwgMHgwZSwgMHg0MywgMHg0ZiwgMHg0NCwgMHg0NSwgMHg1ZiwgMHg0ZSwgMHg0ZiwgMHg1NCwKKwkweDVmLCAweDQ2LCAweDRmLCAweDU1LCAweDRlLCAweDQ0LCAweDEwLCAweDAyLCAweDEyLCAweDE1LCAweDBhLCAweDExLCAweDQzLCAweDRmLCAweDQ0LCAweDQ1LAorCTB4NWYsIDB4NDIsIDB4NTUsIDB4NDksIDB4NGMsIDB4NDQsIDB4NWYsIDB4NDYsIDB4NDEsIDB4NDksIDB4NGMsIDB4NDUsIDB4NDQsIDB4MTAsIDB4MDMsIDB4NDIsCisJMHgxMSwgMHgwYSwgMHgwZiwgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg1ZiwgMHg2ZCwgMHg2NSwgMHg3MywgMHg3MywgMHg2MSwKKwkweDY3LCAweDY1LCAweDIyLCAweDk1LCAweDAyLCAweDBhLCAweDBkLCAweDQyLCAweDc1LCAweDY5LCAweDZjLCAweDY0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LAorCTB4NTUsIDB4NmUsIDB4NjksIDB4NzQsIDB4MTIsIDB4MGUsIDB4MGEsIDB4MDIsIDB4NjksIDB4NjQsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksCisJMHg1MiwgMHgwMiwgMHg2OSwgMHg2NCwgMHgxMiwgMHgyZiwgMHgwYSwgMHgwOCwgMHg2YywgMHg2MSwgMHg2ZSwgMHg2NywgMHg3NSwgMHg2MSwgMHg2NywgMHg2NSwKKwkweDE4LCAweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDBlLCAweDMyLCAweDEzLCAweDJlLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LAorCTB4NzIsIDB4NzksIDB4MmUsIDB4NGMsIDB4NjEsIDB4NmUsIDB4NjcsIDB4NzUsIDB4NjEsIDB4NjcsIDB4NjUsIDB4NTIsIDB4MDgsIDB4NmMsIDB4NjEsIDB4NmUsCisJMHg2NywgMHg3NSwgMHg2MSwgMHg2NywgMHg2NSwgMHgxMiwgMHgyYSwgMHgwYSwgMHgxMSwgMHg3MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg1ZiwKKwkweDY2LCAweDY5LCAweDZjLCAweDY1LCAweDVmLCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDczLCAweDE4LCAweDAzLCAweDIwLCAweDAzLCAweDI4LCAweDA5LAorCTB4NTIsIDB4MGYsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NTAsIDB4NjEsIDB4NzQsIDB4NjgsCisJMHg3MywgMHgxMiwgMHgyZCwgMHgwYSwgMHgxMiwgMHg2MywgMHg2ZiwgMHg2ZCwgMHg3MCwgMHg2OSwgMHg2YywgMHg2NSwgMHg3MiwgMHg1ZiwgMHg2MSwgMHg3MiwKKwkweDY3LCAweDc1LCAweDZkLCAweDY1LCAweDZlLCAweDc0LCAweDczLCAweDE4LCAweDA0LCAweDIwLCAweDAzLCAweDI4LCAweDA5LCAweDUyLCAweDExLCAweDYzLAorCTB4NmYsIDB4NmQsIDB4NzAsIDB4NjksIDB4NmMsIDB4NjUsIDB4NzIsIDB4NDEsIDB4NzIsIDB4NjcsIDB4NzUsIDB4NmQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsCisJMHgxMiwgMHg0MSwgMHgwYSwgMHgwZiwgMHg2NywgMHg2NSwgMHg2ZSwgMHg2NSwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2NCwgMHg1ZiwgMHg2NiwgMHg2OSwKKwkweDZjLCAweDY1LCAweDczLCAweDE4LCAweDA1LCAweDIwLCAweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDE4LCAweDJlLCAweDY5LCAweDY0LCAweDY1LCAweDVmLAorCTB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NDcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4NDYsCisJMHg2OSwgMHg2YywgMHg2NSwgMHg1MiwgMHgwZSwgMHg2NywgMHg2NSwgMHg2ZSwgMHg2NSwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2NCwgMHg0NiwgMHg2OSwKKwkweDZjLCAweDY1LCAweDczLCAweDEyLCAweDI1LCAweDBhLCAweDBlLCAweDY0LCAweDY1LCAweDcwLCAweDY1LCAweDZlLCAweDY0LCAweDY1LCAweDZlLCAweDYzLAorCTB4NzksIDB4NWYsIDB4NjksIDB4NjQsIDB4NzMsIDB4MTgsIDB4MDYsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGQsIDB4NjQsIDB4NjUsIDB4NzAsCisJMHg2NSwgMHg2ZSwgMHg2NCwgMHg2NSwgMHg2ZSwgMHg2MywgMHg3OSwgMHg0OSwgMHg2NCwgMHg3MywgMHgyMiwgMHg4ZSwgMHgwMiwgMHgwYSwgMHgwYywgMHg0OSwKKwkweDZlLCAweDc2LCAweDYxLCAweDZjLCAweDY5LCAweDY0LCAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDEyLCAweDFkLCAweDBhLCAweDBhLCAweDY2LAorCTB4NjksIDB4NmMsIDB4NjUsIDB4NWYsIDB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4NzMsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MDksIDB4NTIsCisJMHgwOSwgMHg2NiwgMHg2OSwgMHg2YywgMHg2NSwgMHg1MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHg3MywgMHgxMiwgMHgzZSwgMHgwYSwgMHgwOSwgMHg3NywgMHg2OSwKKwkweDZjLCAweDY0LCAweDYzLCAweDYxLCAweDcyLCAweDY0LCAweDczLCAweDE4LCAweDA0LCAweDIwLCAweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDIwLCAweDJlLAorCTB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NDksIDB4NmUsIDB4NzYsIDB4NjEsIDB4NmMsIDB4NjksCisJMHg2NCwgMHg2MSwgMHg3NCwgMHg2OSwgMHg2ZiwgMHg2ZSwgMHgyZSwgMHg1NywgMHg2OSwgMHg2YywgMHg2NCwgMHg2MywgMHg2MSwgMHg3MiwgMHg2NCwgMHg1MiwKKwkweDA5LCAweDc3LCAweDY5LCAweDZjLCAweDY0LCAweDYzLCAweDYxLCAweDcyLCAweDY0LCAweDczLCAweDFhLCAweDllLCAweDAxLCAweDBhLCAweDA4LCAweDU3LAorCTB4NjksIDB4NmMsIDB4NjQsIDB4NjMsIDB4NjEsIDB4NzIsIDB4NjQsIDB4MTIsIDB4MWIsIDB4MGEsIDB4MDYsIDB4NzAsIDB4NzIsIDB4NjUsIDB4NjYsIDB4NjksCisJMHg3OCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg0OCwgMHgwMCwgMHg1MiwgMHgwNiwgMHg3MCwgMHg3MiwgMHg2NSwgMHg2NiwgMHg2OSwKKwkweDc4LCAweDg4LCAweDAxLCAweDAxLCAweDEyLCAweDFiLCAweDBhLCAweDA2LCAweDczLCAweDc1LCAweDY2LCAweDY2LCAweDY5LCAweDc4LCAweDE4LCAweDAyLAorCTB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NDgsIDB4MDEsIDB4NTIsIDB4MDYsIDB4NzMsIDB4NzUsIDB4NjYsIDB4NjYsIDB4NjksIDB4NzgsIDB4ODgsIDB4MDEsCisJMHgwMSwgMHgxMiwgMHgyZCwgMHgwYSwgMHgxMCwgMHg2MywgMHg2MSwgMHg2ZSwgMHg1ZiwgMHg2MywgMHg3MiwgMHg2ZiwgMHg3MywgMHg3MywgMHg1ZiwgMHg2NiwKKwkweDZmLCAweDZjLCAweDY0LCAweDY1LCAweDcyLCAweDE4LCAweDAzLCAweDIwLCAweDAxLCAweDI4LCAweDA4LCAweDQ4LCAweDAyLCAweDUyLCAweDBlLCAweDYzLAorCTB4NjEsIDB4NmUsIDB4NDMsIDB4NzIsIDB4NmYsIDB4NzMsIDB4NzMsIDB4NDYsIDB4NmYsIDB4NmMsIDB4NjQsIDB4NjUsIDB4NzIsIDB4ODgsIDB4MDEsIDB4MDEsCisJMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MCwgMHg3MiwgMHg2NSwgMHg2NiwgMHg2OSwgMHg3OCwgMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwKKwkweDczLCAweDc1LCAweDY2LCAweDY2LCAweDY5LCAweDc4LCAweDQyLCAweDEzLCAweDBhLCAweDExLCAweDVmLCAweDYzLCAweDYxLCAweDZlLCAweDVmLCAweDYzLAorCTB4NzIsIDB4NmYsIDB4NzMsIDB4NzMsIDB4NWYsIDB4NjYsIDB4NmYsIDB4NmMsIDB4NjQsIDB4NjUsIDB4NzIsIDB4MmEsIDB4NDksIDB4MGEsIDB4MDgsIDB4NGMsCisJMHg2MSwgMHg2ZSwgMHg2NywgMHg3NSwgMHg2MSwgMHg2NywgMHg2NSwgMHgxMiwgMHgxOCwgMHgwYSwgMHgxNCwgMHg0YywgMHg0MSwgMHg0ZSwgMHg0NywgMHg1NSwKKwkweDQxLCAweDQ3LCAweDQ1LCAweDVmLCAweDU1LCAweDRlLCAweDUzLCAweDUwLCAweDQ1LCAweDQzLCAweDQ5LCAweDQ2LCAweDQ5LCAweDQ1LCAweDQ0LCAweDEwLAorCTB4MDAsIDB4MTIsIDB4MTEsIDB4MGEsIDB4MGQsIDB4NGMsIDB4NDEsIDB4NGUsIDB4NDcsIDB4NTUsIDB4NDEsIDB4NDcsIDB4NDUsIDB4NWYsIDB4NGEsIDB4NDEsCisJMHg1NiwgMHg0MSwgMHgxMCwgMHgwMSwgMHgxMiwgMHgxMCwgMHgwYSwgMHgwYywgMHg0YywgMHg0MSwgMHg0ZSwgMHg0NywgMHg1NSwgMHg0MSwgMHg0NywgMHg0NSwKKwkweDVmLCAweDQzLCAweDUwLCAweDUwLCAweDEwLCAweDAyLCAweDQyLCAweDFiLCAweDVhLCAweDE5LCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LAorCTB4NjUsIDB4NzIsIDB4NzksIDB4MmYsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4NWYsIDB4NzAsIDB4NzIsCisJMHg2ZiwgMHg3NCwgMHg2ZiwgMHg2MiwgMHgwNiwgMHg3MCwgMHg3MiwgMHg2ZiwgMHg3NCwgMHg2ZiwgMHgzMywKK30KKwordmFyICgKKwlmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjT25jZSBzeW5jLk9uY2UKKwlmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjRGF0YSA9IGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2MKKykKKworZnVuYyBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpIFtdYnl0ZSB7CisJZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY09uY2UuRG8oZnVuYygpIHsKKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0RhdGEgPSBwcm90b2ltcGwuWC5Db21wcmVzc0daSVAoZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0RhdGEpCisJfSkKKwlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0RhdGEKK30KKwordmFyIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2VudW1UeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuRW51bUluZm8sIDIpCit2YXIgZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXMgPSBtYWtlKFtdcHJvdG9pbXBsLk1lc3NhZ2VJbmZvLCA4KQordmFyIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2dvVHlwZXMgPSBbXWludGVyZmFjZXt9eworCShMYW5ndWFnZSkoMCksICAgICAgICAgICAgICAgICAgIC8vIDA6IGlkZV9xdWVyeS5MYW5ndWFnZQorCShBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkoMCksIC8vIDE6IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdC5TdGF0dXMuQ29kZQorCSgqR2VuZXJhdGVkRmlsZSkobmlsKSwgICAgICAgICAgIC8vIDI6IGlkZV9xdWVyeS5HZW5lcmF0ZWRGaWxlCisJKCpJZGVBbmFseXNpcykobmlsKSwgICAgICAgICAgICAgLy8gMzogaWRlX3F1ZXJ5LklkZUFuYWx5c2lzCisJKCpBbmFseXNpc0Vycm9yKShuaWwpLCAgICAgICAgICAgLy8gNDogaWRlX3F1ZXJ5LkFuYWx5c2lzRXJyb3IKKwkoKkFuYWx5c2lzUmVzdWx0KShuaWwpLCAgICAgICAgICAvLyA1OiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQKKwkoKkJ1aWxkYWJsZVVuaXQpKG5pbCksICAgICAgICAgICAvLyA2OiBpZGVfcXVlcnkuQnVpbGRhYmxlVW5pdAorCSgqSW52YWxpZGF0aW9uKShuaWwpLCAgICAgICAgICAgIC8vIDc6IGlkZV9xdWVyeS5JbnZhbGlkYXRpb24KKwkoKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykobmlsKSwgICAvLyA4OiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuU3RhdHVzCisJKCpJbnZhbGlkYXRpb25fV2lsZGNhcmQpKG5pbCksICAgLy8gOTogaWRlX3F1ZXJ5LkludmFsaWRhdGlvbi5XaWxkY2FyZAorfQordmFyIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2RlcElkeHMgPSBbXWludDMyeworCTQsIC8vIDA6IGlkZV9xdWVyeS5JZGVBbmFseXNpcy5lcnJvcjp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkFuYWx5c2lzRXJyb3IKKwk1LCAvLyAxOiBpZGVfcXVlcnkuSWRlQW5hbHlzaXMucmVzdWx0czp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0CisJNiwgLy8gMjogaWRlX3F1ZXJ5LklkZUFuYWx5c2lzLnVuaXRzOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuQnVpbGRhYmxlVW5pdAorCTgsIC8vIDM6IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdC5zdGF0dXM6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdC5TdGF0dXMKKwk3LCAvLyA0OiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuaW52YWxpZGF0aW9uOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuSW52YWxpZGF0aW9uCisJMCwgLy8gNTogaWRlX3F1ZXJ5LkJ1aWxkYWJsZVVuaXQubGFuZ3VhZ2U6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5MYW5ndWFnZQorCTIsIC8vIDY6IGlkZV9xdWVyeS5CdWlsZGFibGVVbml0LmdlbmVyYXRlZF9maWxlczp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkdlbmVyYXRlZEZpbGUKKwk5LCAvLyA3OiBpZGVfcXVlcnkuSW52YWxpZGF0aW9uLndpbGRjYXJkczp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkludmFsaWRhdGlvbi5XaWxkY2FyZAorCTEsIC8vIDg6IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdC5TdGF0dXMuY29kZTp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0LlN0YXR1cy5Db2RlCisJOSwgLy8gWzk6OV0gaXMgdGhlIHN1Yi1saXN0IGZvciBtZXRob2Qgb3V0cHV0X3R5cGUKKwk5LCAvLyBbOTo5XSBpcyB0aGUgc3ViLWxpc3QgZm9yIG1ldGhvZCBpbnB1dF90eXBlCisJOSwgLy8gWzk6OV0gaXMgdGhlIHN1Yi1saXN0IGZvciBleHRlbnNpb24gdHlwZV9uYW1lCisJOSwgLy8gWzk6OV0gaXMgdGhlIHN1Yi1saXN0IGZvciBleHRlbnNpb24gZXh0ZW5kZWUKKwkwLCAvLyBbMDo5XSBpcyB0aGUgc3ViLWxpc3QgZm9yIGZpZWxkIHR5cGVfbmFtZQorfQorCitmdW5jIGluaXQoKSB7IGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2luaXQoKSB9CitmdW5jIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2luaXQoKSB7CisJaWYgRmlsZV9pZGVfcXVlcnlfcHJvdG8gIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWlmICFwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzBdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKkdlbmVyYXRlZEZpbGUpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzFdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKklkZUFuYWx5c2lzKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1syXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpBbmFseXNpc0Vycm9yKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1szXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpBbmFseXNpc1Jlc3VsdCk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNF0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqQnVpbGRhYmxlVW5pdCk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNV0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqSW52YWxpZGF0aW9uKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s2XS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpBbmFseXNpc1Jlc3VsdF9TdGF0dXMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzddLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKkludmFsaWRhdGlvbl9XaWxkY2FyZCk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwl9CisJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMF0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzFdLk9uZW9mV3JhcHBlcnMgPSBbXWludGVyZmFjZXt9e30KKwlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s2XS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbN10uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCXR5cGUgeCBzdHJ1Y3R7fQorCW91dCA6PSBwcm90b2ltcGwuVHlwZUJ1aWxkZXJ7CisJCUZpbGU6IHByb3RvaW1wbC5EZXNjQnVpbGRlcnsKKwkJCUdvUGFja2FnZVBhdGg6IHJlZmxlY3QuVHlwZU9mKHh7fSkuUGtnUGF0aCgpLAorCQkJUmF3RGVzY3JpcHRvcjogZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzYywKKwkJCU51bUVudW1zOiAgICAgIDIsCisJCQlOdW1NZXNzYWdlczogICA4LAorCQkJTnVtRXh0ZW5zaW9uczogMCwKKwkJCU51bVNlcnZpY2VzOiAgIDAsCisJCX0sCisJCUdvVHlwZXM6ICAgICAgICAgICBmaWxlX2lkZV9xdWVyeV9wcm90b19nb1R5cGVzLAorCQlEZXBlbmRlbmN5SW5kZXhlczogZmlsZV9pZGVfcXVlcnlfcHJvdG9fZGVwSWR4cywKKwkJRW51bUluZm9zOiAgICAgICAgIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2VudW1UeXBlcywKKwkJTWVzc2FnZUluZm9zOiAgICAgIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzLAorCX0uQnVpbGQoKQorCUZpbGVfaWRlX3F1ZXJ5X3Byb3RvID0gb3V0LkZpbGUKKwlmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjID0gbmlsCisJZmlsZV9pZGVfcXVlcnlfcHJvdG9fZ29UeXBlcyA9IG5pbAorCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2RlcElkeHMgPSBuaWwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vaWRlX3F1ZXJ5LnByb3RvIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9pZGVfcXVlcnkucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmMzQ5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vaWRlX3F1ZXJ5LnByb3RvCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGlkZV9xdWVyeTsKKworb3B0aW9uIGdvX3BhY2thZ2UgPSAiaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90byI7CisKK21lc3NhZ2UgR2VuZXJhdGVkRmlsZSB7CisgIC8vIFBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gYnVpbGRfb3V0X2Rpci4KKyAgc3RyaW5nIHBhdGggPSAxOworCisgIC8vIFRoZSB0ZXh0IG9mIHRoZSBnZW5lcmF0ZWQgZmlsZSwgaWYgbm90IHByb3ZpZGVkIGNvbnRlbnRzIHdpbGwgYmUgcmVhZAorICAvLyBmcm9tIHRoZSBwYXRoIGFib3ZlIGluIHVzZXIncyB3b3Jrc3RhdGlvbi4KKyAgb3B0aW9uYWwgYnl0ZXMgY29udGVudHMgPSAyOworfQorCittZXNzYWdlIElkZUFuYWx5c2lzIHsKKyAgLy8gRGlyZWN0b3J5IHRoYXQgY29udGFpbnMgYnVpbGQgb3V0cHV0cyBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4KKyAgLy8gUmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorICBzdHJpbmcgYnVpbGRfb3V0X2RpciA9IDE7CisgIC8vIFdvcmtpbmcgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4KKyAgLy8gUmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorICBzdHJpbmcgd29ya2luZ19kaXIgPSA0OworICAvLyBPbmx5IHNldCBpZiB0aGUgd2hvbGUgcXVlcnkgZmFpbGVkLgorICBvcHRpb25hbCBBbmFseXNpc0Vycm9yIGVycm9yID0gNTsKKyAgLy8gTGlzdCBvZiByZXN1bHRzLCBvbmUgcGVyIHF1ZXJpZWQgZmlsZS4KKyAgcmVwZWF0ZWQgQW5hbHlzaXNSZXN1bHQgcmVzdWx0cyA9IDY7CisgIC8vIExpc3Qgb2YgYnVpbGRhYmxlIHVuaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgcmVmZXJlbmNlcyBieSB0aGUgcmVzdWx0cy4KKyAgcmVwZWF0ZWQgQnVpbGRhYmxlVW5pdCB1bml0cyA9IDc7CisKKyAgcmVzZXJ2ZWQgMiwgMzsKK30KKworbWVzc2FnZSBBbmFseXNpc0Vycm9yIHsKKyAgLy8gSHVtYW4gcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAgc3RyaW5nIGVycm9yX21lc3NhZ2UgPSAxOworfQorCittZXNzYWdlIEFuYWx5c2lzUmVzdWx0IHsKKyAgLy8gUGF0aCB0byB0aGUgc291cmNlIGZpbGUgdGhhdCB3YXMgcXVlcmllZCwgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorICBzdHJpbmcgc291cmNlX2ZpbGVfcGF0aCA9IDE7CisgIC8vIEluZGljYXRlcyB0aGUgc3VjY2Vzcy9mYWlsdXJlIGZvciB0aGUgcXVlcnkuCisgIG1lc3NhZ2UgU3RhdHVzIHsKKyAgICBlbnVtIENvZGUgeworICAgICAgQ09ERV9VTlNQRUNJRklFRCA9IDA7CisgICAgICBDT0RFX09LID0gMTsKKyAgICAgIENPREVfTk9UX0ZPVU5EID0gMjsgIC8vIG5vIHRhcmdldCBvciBtb2R1bGUgZm91bmQgZm9yIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgIENPREVfQlVJTERfRkFJTEVEID0gMzsKKyAgICB9CisgICAgQ29kZSBjb2RlID0gMTsKKyAgICAvLyBEZXRhaWxzIGFib3V0IHRoZSBzdGF0dXMsIG1pZ2h0IGJlIGRpc3BsYXllZCB0byB1c2VyLgorICAgIG9wdGlvbmFsIHN0cmluZyBzdGF0dXNfbWVzc2FnZSA9IDI7CisgIH0KKyAgLy8gUmVwcmVzZW50cyBzdGF0dXMgZm9yIHRoaXMgcmVzdWx0LiBlLmcuIG5vdCBwYXJ0IG9mIHRoZSBidWlsZCBncmFwaC4KKyAgU3RhdHVzIHN0YXR1cyA9IDI7CisgIC8vIElEIG9mIGJ1aWxkYWJsZSB1bml0IHRoYXQgY29udGFpbnMgdGhlIHNvdXJjZSBmaWxlLgorICAvLyBUaGUgaWRlX3F1ZXJ5IHNjcmlwdCBjYW4gY2hvb3NlIHRoZSBtb3N0IHJlbGV2YW50IHVuaXQgZnJvbSBtdWx0aXBsZQorICAvLyBvcHRpb25zLgorICBzdHJpbmcgdW5pdF9pZCA9IDM7CisgIC8vIEludmFsaWRhdGlvbiBydWxlIHRvIGNoZWNrIGlmIHRoZSByZXN1bHQgaXMgc3RpbGwgdmFsaWQuCisgIEludmFsaWRhdGlvbiBpbnZhbGlkYXRpb24gPSA0OworfQorCitlbnVtIExhbmd1YWdlIHsKKyAgTEFOR1VBR0VfVU5TUEVDSUZJRUQgPSAwOworICBMQU5HVUFHRV9KQVZBID0gMTsgIC8vIGFsc28gaW5jbHVkZXMgS290bGluCisgIExBTkdVQUdFX0NQUCA9IDI7Cit9CisKK21lc3NhZ2UgQnVpbGRhYmxlVW5pdCB7CisgIC8vIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBidWlsZGFibGUgdW5pdC4KKyAgLy8KKyAgLy8gRXhhbXBsZXM6CisgIC8vICAgLSBKYXZhOiBtb2R1bGUgb3IgdGFyZ2V0IG5hbWUsIGUuZy4gImZyYW1ld29yay1ibHVldG9vdGgiIG9yCisgIC8vICAgIi8vdGhpcmRfcGFydHkvaGFtY3Jlc3Q6aGFtY3Jlc3RfamF2YSIKKyAgLy8gICAtIEMrKzogc291cmNlIGZpbGUsIGUuZy4gInBhdGgvdG8vZmlsZS5jYyIKKyAgc3RyaW5nIGlkID0gMTsKKyAgLy8gTGFuZ3VhZ2Ugb2YgdGhlIHVuaXQuCisgIC8vIFJlcXVpcmVkIGZvciBidWlsZGFibGUgdW5pdHMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSB0aGUgQW5hbHlzaXNSZXN1bHQsCisgIC8vIGUuZy4gdGhlIHVuaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21waWxhdGlvbiBzdGFnZSBmb3IgdGhlIHNvdXJjZSBmaWxlLgorICBMYW5ndWFnZSBsYW5ndWFnZSA9IDI7CisgIC8vIFNvdXJjZSBmaWxlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgdW5pdC4KKyAgLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB3b3JraW5nX2Rpci4KKyAgcmVwZWF0ZWQgc3RyaW5nIHNvdXJjZV9maWxlX3BhdGhzID0gMzsKKyAgLy8gQ29tcGlsZXIgYXJndW1lbnRzIHRvIGNvbXBpbGUgdGhlIHNvdXJjZSBmaWxlcy4KKyAgcmVwZWF0ZWQgc3RyaW5nIGNvbXBpbGVyX2FyZ3VtZW50cyA9IDQ7CisgIC8vIExpc3Qgb2YgZ2VuZXJhdGVkIGZpbGVzIHByb2R1Y2VkIGJ5IHRoaXMgdW5pdC4KKyAgcmVwZWF0ZWQgR2VuZXJhdGVkRmlsZSBnZW5lcmF0ZWRfZmlsZXMgPSA1OworICAvLyBMaXN0IG9mIG90aGVyIEJ1aWxkYWJsZVVuaXRzIHRoaXMgdW5pdCBkZXBlbmQgb24uCisgIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5X2lkcyA9IDY7Cit9CisKKy8vIEludmFsaWRhdGlvbiBydWxlIHRvIGNoZWNrIGlmIHRoZSByZXN1bHQgaXMgc3RpbGwgdmFsaWQuCisvLyBUaGlzIHNob3VsZCBjb250YWluIGZpbGVzL2RpcnMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHBhcnQgb2YgdGhlIGJ1aWxkIGdyYXBoCisvLyBidXQgc3RpbGwgYWZmZWN0IHRoZSByZXN1bHQuIEZvciBleGFtcGxlIEJVSUxEIGZpbGVzLCBkaXJlY3RvcnkgdG8gdGhlCisvLyB0b29sY2hhaW4gb3IgY29uZmlnIGZpbGVzIGV0Yy4KK21lc3NhZ2UgSW52YWxpZGF0aW9uIHsKKyAgLy8gSWYgYW55IG9mIHRoZXNlIGZpbGVzIGNoYW5nZSB0aGUgcmVzdWx0IG1heSBiZWNvbWUgaW52YWxpZC4KKyAgLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHJlcGVhdGVkIHN0cmluZyBmaWxlX3BhdGhzID0gMTsKKworICBtZXNzYWdlIFdpbGRjYXJkIHsKKyAgICAvLyBQcmVmaXggb2YgdGhlIGZpbGUgcGF0aCAoZS5nLiAicGF0aC90by8iKQorICAgIG9wdGlvbmFsIHN0cmluZyBwcmVmaXggPSAxOworICAgIC8vIFN1ZmZpeCBvZiB0aGUgZmlsZSBwYXRoIChlLmcuICJBbmRyb2lkLmJwIikKKyAgICBvcHRpb25hbCBzdHJpbmcgc3VmZml4ID0gMjsKKyAgICAvLyBJZiBmYWxzZSwgdGhlIHBhcnQgb2YgdGhlIHBhdGggYmV0d2VlbiB0aGUgZ2l2ZW4gYHByZWZpeGAgYW5kIGBzdWZmaXhgCisgICAgLy8gc2hvdWxkIG5vdCBjb250YWluIGRpcmVjdG9yeSBzZXBhcmF0b3JzICgnLycpLgorICAgIG9wdGlvbmFsIGJvb2wgY2FuX2Nyb3NzX2ZvbGRlciA9IDM7CisgIH0KKyAgLy8gSWYgYW55IG9mIHRoZXNlIHJ1bGVzIG1hdGNoIGEgY2hhbmdlZCBmaWxlIHRoZSByZXN1bHQgbWF5IGJlY29tZSBpbnZhbGlkLgorICByZXBlYXRlZCBXaWxkY2FyZCB3aWxkY2FyZHMgPSA0OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vcmVnZW4uc2ggYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL3JlZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlYzRmMzcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL3JlZ2VuLnNoCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL2Jhc2gKKworYXByb3RvYyAtLWdvX291dD1wYXRocz1zb3VyY2VfcmVsYXRpdmU6LiBpZGVfcXVlcnkucHJvdG8KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvQW5kcm9pZC5icCBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTkwMjEwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImlkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImdlbmVyYWwuY2MiLAorICAgICAgICAiZm9vLnByb3RvIiwKKyAgICBdLAorICAgIGNmbGFnczogWyItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKKyAgICBwcm90bzogeworICAgICAgICB0eXBlOiAibGl0ZSIsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9mb28ucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4NTE0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBpZGVfcXVlcnkucHJvYmVyX3NjcmlwdHM7CisKK21lc3NhZ2UgUHJvdG9Nc2cgeworICAvLyBUZXN0IHByb3RvIGZpZWxkLgorICBpbnQ2NCBzb21lX2ZpZWxkID0gMTsKKyAgLy8gICAgICAgICAgICAgICAgICAgXiBzb21lX2ZpZWxkCit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwNjM5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYwpAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmb28ucGIuaCIKKwordXNpbmcgaWRlX3F1ZXJ5Ojpwcm9iZXJfc2NyaXB0czo6UHJvdG9Nc2c7CisKK3ZvaWQgRm9vKGludCB4LCBkb3VibGUgeSkge30KK2Zsb2F0IEZvbyhmbG9hdCB4LCBmbG9hdCB5KSB7IHJldHVybiAwLjBmOyB9CisKK3ZvaWQgVGVzdENvbXBsZXRpb24oKSB7CisgIC8vIFRlc3QgY29tcGxldGlvbiBvbiBwcm90b3MgYW5kIGZ1enp5IG1hdGNoaW5nIG9mIGNvbXBsZXRpb24gc3VnZ2VzdGlvbnMuCisKKyAgUHJvdG9Nc2cgZm9vOworCisgIC8vIF4KKworICAvLyBzdGVwCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyB0eXBlKCJmIikKKyAgLy8gY29tcGxldGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKGxhYmVsPSJmb28iKQorICAvLyBkZWxsaW5lKCkKKyAgLy8gdHlwZSgiZm9vLnNmIikKKyAgLy8gY29tcGxldGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKAorICAvLyAgbGFiZWw9InNvbWVfZmllbGQuKiIsCisgIC8vICBpbnNlcnRUZXh0PSJzb21lX2ZpZWxkLioiLAorICAvLyApCisgIC8vIGRlbGxpbmUoKQorCisgIHN0ZDo6dmVjdG9yPGludD4gdjsKKworICAvLyBeCisKKyAgLy8gc3RlcAorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gdHlwZSgidi5wdXNoIikKKyAgLy8gY29tcGxldGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKGxhYmVsPSJwdXNoX2JhY2suKiIpCisgIC8vIGRlbGxpbmUoKQorfQorCit2b2lkIFRlc3ROYXZpZ2F0aW9uKCkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IGludHM7CisgIC8vICAgICAgICAgICAgICAgfCAgIHwgaW50cworICAvLyAgICAgIF4KKworICAvLyBzdGVwCisgIC8vIDsgVGVzdCBuYXZpZ2F0aW9uIHRvIGRlZmluaXRpb24gb24gU1RMIHR5cGVzLgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gbmF2aWdhdGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IG5hdmlnYXRpb24uaXRlbXMuZmlsdGVyKHBhdGg9Ii4qL3ZlY3RvciIpCisKKyAgaW50cy5wdXNoX2JhY2soMCk7CisgIC8vIF4KKworICAvLyBzdGVwCisgIC8vIDsgVGVzdCBuYXZpZ2F0aW9uIHRvIGRlZmluaXRpb24gb24gbG9jYWwgc3ltYm9scy4KKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIG5hdmlnYXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBuYXZpZ2F0aW9uLml0ZW1zLmZpbHRlcihwYXRoPSIuKi9nZW5lcmFsLmNjIiwgcmFuZ2U9aW50cykKKworICBQcm90b01zZyBtc2c7CisgIG1zZy5zZXRfc29tZV9maWVsZCgwKTsKKyAgLy8gICAgICAgICAgXgorCisgIC8vIHN0ZXAKKyAgLy8gOyBUZXN0IG5hdmlnYXRpb24gdG8gZGVmaW5pdGlvbiBvbiBwcm90byBmaWVsZHMuIFdlIGRvIG5vdCBjaGVjayBmb3IgYQorICAvLyA7IHNwZWNpZmljIHRhcmdldCBhcyBpdCBjYW4gYmUgaW4gZ2VuZXJhdGVkIGNvZGUuCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyBuYXZpZ2F0aW9uLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgbmF2aWdhdGlvbi5pdGVtcworfQorCit2b2lkIFRlc3RQYXJhbWV0ZXJJbmZvKCkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgIHYucHVzaF9iYWNrKDApOworICAvLyAgICAgICAgICBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgdGhlIHNpZ25hdHVyZSBoZWxwIGZvciBTVEwgZnVuY3Rpb25zLiBXZSBkbyBub3QgY2hlY2sgZm9yIGEgc3BlY2lmaWMKKyAgLy8gOyB0ZXh0IGFzIGl0IGNhbiBiZSBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyBwYXJhbWluZm8udHJpZ2dlcigpCisgIC8vIGFzc2VydCBwYXJhbWluZm8uaXRlbXMKKworICBGb28oMCwgMC4wKTsKKyAgLy8gICAgICBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgdGhlIHNpZ25hdHVyZSBoZWxwIGZvciB0aGUgZnVuY3Rpb24gJ0ZvbycgaGF2aW5nIHR3byBvdmVybG9hZHMuCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyBwYXJhbWluZm8udHJpZ2dlcigpCisgIC8vIGFzc2VydCBwYXJhbWluZm8uaXRlbXMuZmlsdGVyKAorICAvLyAgYWN0aXZlPXRydWUsCisgIC8vICBsYWJlbD0iRm9vXFwoaW50IHgsIGRvdWJsZSB5XFwpIC0+IHZvaWQiLAorICAvLyAgc2VsZWN0aW9uPSJkb3VibGUgeSIsCisgIC8vICkKKyAgLy8gYXNzZXJ0IHBhcmFtaW5mby5pdGVtcy5maWx0ZXIoCisgIC8vICBhY3RpdmU9ZmFsc2UsCisgIC8vICBsYWJlbD0iRm9vXFwoZmxvYXQgeCwgZmxvYXQgeVxcKSAtPiBmbG9hdCIsCisgIC8vICkKK30KKworaW50IG1haW4oKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwX3N1aXRlLnRleHRwYiBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHBfc3VpdGUudGV4dHBiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzcyNjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwX3N1aXRlLnRleHRwYgpAQCAtMCwwICsxLDUgQEAKK3Rlc3RzOiB7CisgIG5hbWU6ICJnZW5lcmFsIgorICBzY3JpcHRzOiAiYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MiCisgIHNjcmlwdHM6ICJidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvIgorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvaWRlX3F1ZXJ5Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdjZTZkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQKQEAgLTAsMCArMSwyMzkgQEAKKworA291dBKWYQorOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjGjhwcmVidWlsdHMvY2xhbmcvaG9zdC9saW51eC14ODYvY2xhbmctcjUyMjgxNy9iaW4vY2xhbmcrKxoHLW10aHVtYhoDLU9zGhQtZm9taXQtZnJhbWUtcG9pbnRlchoGLW1sbHZtGhktZW5hYmxlLXNocmluay13cmFwPWZhbHNlGgMtTzIaBS1XYWxsGgctV2V4dHJhGgstV2luaXQtc2VsZhoPLVdwb2ludGVyLWFyaXRoGhgtV3VuZ3VhcmRlZC1hdmFpbGFiaWxpdHkaES1XZXJyb3I9ZGF0ZS10aW1lGhYtV2Vycm9yPWludC1jb252ZXJzaW9uGhMtV2Vycm9yPXByYWdtYS1wYWNrGiYtV2Vycm9yPXByYWdtYS1wYWNrLXN1c3BpY2lvdXMtaW5jbHVkZRoYLVdlcnJvcj1zaXplb2YtYXJyYXktZGl2GhctV2Vycm9yPXN0cmluZy1wbHVzLWludBonLVdlcnJvcj11bnJlYWNoYWJsZS1jb2RlLWxvb3AtaW5jcmVtZW50GiItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zGhMtV25vLWM5OS1kZXNpZ25hdG9yGhktV25vLWdudS1mb2xkaW5nLWNvbnN0YW50GiItV25vLWluY29uc2lzdGVudC1taXNzaW5nLW92ZXJyaWRlGhwtV25vLWVycm9yPXJlb3JkZXItaW5pdC1saXN0GhYtV25vLXJlb3JkZXItaW5pdC1saXN0GhEtV25vLXNpZ24tY29tcGFyZRoLLVduby11bnVzZWQaCS1EQU5EUk9JRBoILUROREVCVUcaBy1VREVCVUcaKC1EX19jb21waWxlcl9vZmZzZXRvZj1fX2J1aWx0aW5fb2Zmc2V0b2YaKi1EX19BTkRST0lEX1VOQVZBSUxBQkxFX1NZTUJPTFNfQVJFX1dFQUtfXxoJLWZhZGRyc2lnGhktZmRlYnVnLWRlZmF1bHQtdmVyc2lvbj01GhMtZmNvbG9yLWRpYWdub3N0aWNzGhEtZmZwLWNvbnRyYWN0PW9mZhoPLWZuby1leGNlcHRpb25zGhQtZm5vLXN0cmljdC1hbGlhc2luZxoSLWZtZXNzYWdlLWxlbmd0aD0wGiMtZm5vLXJlbGF4ZWQtdGVtcGxhdGUtdGVtcGxhdGUtYXJncxoXLWdzaW1wbGUtdGVtcGxhdGUtbmFtZXMaCC1nej16c3RkGhYtbm8tY2Fub25pY2FsLXByZWZpeGVzGhEtV25vLWVycm9yPWZvcm1hdBoiLWZkZWJ1Zy1wcmVmaXgtbWFwPS9wcm9jL3NlbGYvY3dkPRocLWZ0cml2aWFsLWF1dG8tdmFyLWluaXQ9emVybxoCLWcaEy1mZnVuY3Rpb24tc2VjdGlvbnMaDy1mZGF0YS1zZWN0aW9ucxoQLWZuby1zaG9ydC1lbnVtcxoPLWZ1bndpbmQtdGFibGVzGhgtZnN0YWNrLXByb3RlY3Rvci1zdHJvbmcaES1XYSwtLW5vZXhlY3N0YWNrGhMtRF9GT1JUSUZZX1NPVVJDRT0yGhMtV3N0cmljdC1hbGlhc2luZz0yGhMtV2Vycm9yPXJldHVybi10eXBlGhgtV2Vycm9yPW5vbi12aXJ0dWFsLWR0b3IaDy1XZXJyb3I9YWRkcmVzcxoWLVdlcnJvcj1zZXF1ZW5jZS1wb2ludBoXLVdlcnJvcj1mb3JtYXQtc2VjdXJpdHkaDC1ub3N0ZGxpYmluYxoaLWZkZWJ1Zy1pbmZvLWZvci1wcm9maWxpbmcaDC1tc29mdC1mbG9hdBoOLW1hcmNoPWFybXY3LWEaEi1tZmxvYXQtYWJpPXNvZnRmcBoKKy1tZnB1PW5lb24aLy1JYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwGrMBLUlvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90by9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAahQEtSW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9jYy9hbmRyb2lkX2FybV9hcm12Ny1hLW5lb24vZ2VuL3Byb3RvGhQtRF9fTElCQ19BUElfXz0xMDAwMBoULURfX0xJQk1fQVBJX189MTAwMDAaFS1EX19MSUJETF9BUElfXz0xMDAwMBoXLUlleHRlcm5hbC9wcm90b2J1Zi9zcmMaWS1JcHJlYnVpbHRzL2NsYW5nL2hvc3QvbGludXgteDg2L2NsYW5nLXI1MjI4MTcvYW5kcm9pZF9saWJjKysvcGxhdGZvcm0vYXJtL2luY2x1ZGUvYysrL3YxGj0tSXByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yNTIyODE3L2luY2x1ZGUvYysrL3YxGiAtSWJpb25pYy9saWJjL2FzeW5jX3NhZmUvaW5jbHVkZRofLUlzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZRonLUliaW9uaWMvbGliYy9zeXN0ZW1fcHJvcGVydGllcy9pbmNsdWRlGjwtSXN5c3RlbS9jb3JlL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvcGFyc2VyL2luY2x1ZGUaCC1pc3lzdGVtGhNiaW9uaWMvbGliYy9pbmNsdWRlGggtaXN5c3RlbRofYmlvbmljL2xpYmMva2VybmVsL3VhcGkvYXNtLWFybRoILWlzeXN0ZW0aF2Jpb25pYy9saWJjL2tlcm5lbC91YXBpGggtaXN5c3RlbRofYmlvbmljL2xpYmMva2VybmVsL2FuZHJvaWQvc2NzaRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC9hbmRyb2lkL3VhcGkaBy10YXJnZXQaHWFybXY3YS1saW51eC1hbmRyb2lkZWFiaTEwMDAwGhAtREFORFJPSURfU1RSSUNUGgUtZlBJRRoHLVdlcnJvchoVLVduby11bnVzZWQtcGFyYW1ldGVyGhktREdPT0dMRV9QUk9UT0JVRl9OT19SVFRJGhYtV2ltcGxpY2l0LWZhbGx0aHJvdWdoGiotRF9MSUJDUFBfRU5BQkxFX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTlMaFS1Xbm8tZ251LWluY2x1ZGUtbmV4dBobLWZ2aXNpYmlsaXR5LWlubGluZXMtaGlkZGVuGgYtbWxsdm0aGS1lbmFibGUtc2hyaW5rLXdyYXA9ZmFsc2UaDC1zdGQ9Z251KysyMBoJLWZuby1ydHRpGhUtSXN5c3RlbS9jb3JlL2luY2x1ZGUaHy1Jc3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGUaHC1Jc3lzdGVtL21lZGlhL2F1ZGlvL2luY2x1ZGUaHi1JaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZRolLUloYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3kvaW5jbHVkZRoWLUloYXJkd2FyZS9yaWwvaW5jbHVkZRobLUlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlGiItSWZyYW1ld29ya3MvbmF0aXZlL29wZW5nbC9pbmNsdWRlGhctSWZyYW1ld29ya3MvYXYvaW5jbHVkZRoWLVdlcnJvcj1ib29sLW9wZXJhdGlvbhogLVdlcnJvcj1mb3JtYXQtaW5zdWZmaWNpZW50LWFyZ3MaJS1XZXJyb3I9aW1wbGljaXQtaW50LWZsb2F0LWNvbnZlcnNpb24aGy1XZXJyb3I9aW50LWluLWJvb2wtY29udGV4dBobLVdlcnJvcj1pbnQtdG8tcG9pbnRlci1jYXN0GhstV2Vycm9yPXBvaW50ZXItdG8taW50LWNhc3QaFy1XZXJyb3I9eG9yLXVzZWQtYXMtcG93Gh4tV25vLXZvaWQtcG9pbnRlci10by1lbnVtLWNhc3QaHS1Xbm8tdm9pZC1wb2ludGVyLXRvLWludC1jYXN0GhgtV25vLXBvaW50ZXItdG8taW50LWNhc3QaFi1XZXJyb3I9Zm9ydGlmeS1zb3VyY2UaFC1Xbm8tdW51c2VkLXZhcmlhYmxlGh8tV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzGhMtV25vLXBhY2tlZC1ub24tcG9kGhwtV2Vycm9yPWFkZHJlc3Mtb2YtdGVtcG9yYXJ5GistV2Vycm9yPWluY29tcGF0aWJsZS1mdW5jdGlvbi1wb2ludGVyLXR5cGVzGhgtV2Vycm9yPW51bGwtZGVyZWZlcmVuY2UaEy1XZXJyb3I9cmV0dXJuLXR5cGUaIi1Xbm8tdGF1dG9sb2dpY2FsLWNvbnN0YW50LWNvbXBhcmUaJC1Xbm8tdGF1dG9sb2dpY2FsLXR5cGUtbGltaXQtY29tcGFyZRoiLVduby1pbXBsaWNpdC1pbnQtZmxvYXQtY29udmVyc2lvbhohLVduby10YXV0b2xvZ2ljYWwtb3ZlcmxhcC1jb21wYXJlGhQtV25vLWRlcHJlY2F0ZWQtY29weRoZLVduby1yYW5nZS1sb29wLWNvbnN0cnVjdBoiLVduby16ZXJvLWFzLW51bGwtcG9pbnRlci1jb25zdGFudBopLVduby1kZXByZWNhdGVkLWFub24tZW51bS1lbnVtLWNvbnZlcnNpb24aJC1Xbm8tZGVwcmVjYXRlZC1lbnVtLWVudW0tY29udmVyc2lvbhoVLVduby1wZXNzaW1pemluZy1tb3ZlGh4tV25vLW5vbi1jLXR5cGVkZWYtZm9yLWxpbmthZ2UaEy1Xbm8tYWxpZ24tbWlzbWF0Y2gaIi1Xbm8tZXJyb3I9dW51c2VkLWJ1dC1zZXQtdmFyaWFibGUaIy1Xbm8tZXJyb3I9dW51c2VkLWJ1dC1zZXQtcGFyYW1ldGVyGh4tV25vLWVycm9yPWRlcHJlY2F0ZWQtYnVpbHRpbnMaFS1Xbm8tZXJyb3I9ZGVwcmVjYXRlZBoyLVduby1lcnJvcj1zaW5nbGUtYml0LWJpdGZpZWxkLWNvbnN0YW50LWNvbnZlcnNpb24aJC1Xbm8tZXJyb3I9ZW51bS1jb25zdGV4cHItY29udmVyc2lvbhobLVduby1lcnJvcj1pbnZhbGlkLW9mZnNldG9mGiYtV25vLWRlcHJlY2F0ZWQtZHluYW1pYy1leGNlcHRpb24tc3BlYxo4YnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2Mi1T8KK7YBc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90by9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnBiLmgSmT4vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorLy8gc291cmNlOiBidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2J1aWxkXzJmbWFrZV8yZnRvb2xzXzJmaWRlXzVmcXVlcnlfMmZwcm9iZXJfNWZzY3JpcHRzXzJmY3BwXzJmZm9vXzJlcHJvdG8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2J1aWxkXzJmbWFrZV8yZnRvb2xzXzJmaWRlXzVmcXVlcnlfMmZwcm9iZXJfNWZzY3JpcHRzXzJmY3BwXzJmZm9vXzJlcHJvdG8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjaWYgUFJPVE9CVUZfVkVSU0lPTiA8IDMwMjEwMDAKKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlIHVwZGF0ZQorI2Vycm9yIHlvdXIgaGVhZGVycy4KKyNlbmRpZgorI2lmIDMwMjEwMTIgPCBQUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT04KKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZQorI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNkZWZpbmUgUFJPVE9CVUZfSU5URVJOQUxfRVhQT1JUX2J1aWxkXzJmbWFrZV8yZnRvb2xzXzJmaWRlXzVmcXVlcnlfMmZwcm9iZXJfNWZzY3JpcHRzXzJmY3BwXzJmZm9vXzJlcHJvdG8KK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgQW55TWV0YWRhdGE7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IHVzZSB0aGVzZSBtZW1iZXJzLgorc3RydWN0IFRhYmxlU3RydWN0X2J1aWxkXzJmbWFrZV8yZnRvb2xzXzJmaWRlXzVmcXVlcnlfMmZwcm9iZXJfNWZzY3JpcHRzXzJmY3BwXzJmZm9vXzJlcHJvdG8geworICBzdGF0aWMgY29uc3QgOjp1aW50MzJfdCBvZmZzZXRzW107Cit9OworbmFtZXNwYWNlIGlkZV9xdWVyeSB7CituYW1lc3BhY2UgcHJvYmVyX3NjcmlwdHMgeworY2xhc3MgUHJvdG9Nc2c7CitzdHJ1Y3QgUHJvdG9Nc2dEZWZhdWx0VHlwZUludGVybmFsOworZXh0ZXJuIFByb3RvTXNnRGVmYXVsdFR5cGVJbnRlcm5hbCBfUHJvdG9Nc2dfZGVmYXVsdF9pbnN0YW5jZV87Cit9ICAvLyBuYW1lc3BhY2UgcHJvYmVyX3NjcmlwdHMKK30gIC8vIG5hbWVzcGFjZSBpZGVfcXVlcnkKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCit0ZW1wbGF0ZTw+IDo6aWRlX3F1ZXJ5Ojpwcm9iZXJfc2NyaXB0czo6UHJvdG9Nc2cqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjppZGVfcXVlcnk6OnByb2Jlcl9zY3JpcHRzOjpQcm90b01zZz4oQXJlbmEqKTsKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorbmFtZXNwYWNlIGlkZV9xdWVyeSB7CituYW1lc3BhY2UgcHJvYmVyX3NjcmlwdHMgeworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFByb3RvTXNnIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZykgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIFByb3RvTXNnKCkgOiBQcm90b01zZyhudWxscHRyKSB7fQorICB+UHJvdG9Nc2coKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIFByb3RvTXNnKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgUHJvdG9Nc2coY29uc3QgUHJvdG9Nc2cmIGZyb20pOworICBQcm90b01zZyhQcm90b01zZyYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBQcm90b01zZygpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIFByb3RvTXNnJiBvcGVyYXRvcj0oY29uc3QgUHJvdG9Nc2cmIGZyb20pIHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgUHJvdG9Nc2cmIG9wZXJhdG9yPShQcm90b01zZyYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgY29uc3QgUHJvdG9Nc2cmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBQcm90b01zZyogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQcm90b01zZyo+KAorICAgICAgICAgICAgICAgJl9Qcm90b01zZ19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDA7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChQcm90b01zZyYgYSwgUHJvdG9Nc2cmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoUHJvdG9Nc2cqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKFByb3RvTXNnKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBQcm90b01zZyogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPFByb3RvTXNnPihhcmVuYSk7CisgIH0KKyAgUHJvdG9Nc2cqIE5ldygpIGNvbnN0IHsKKyAgICByZXR1cm4gTmV3KG51bGxwdHIpOworICB9CisgIHZvaWQgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSYgZnJvbSkgIGZpbmFsOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFByb3RvTXNnJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgUHJvdG9Nc2cmIGZyb20pOworICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgOjp1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICA6OnVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChQcm90b01zZyogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZyI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBQcm90b01zZyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrU29tZUZpZWxkRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyBpbnQ2NCBzb21lX2ZpZWxkID0gMTsKKyAgdm9pZCBjbGVhcl9zb21lX2ZpZWxkKCk7CisgIDo6aW50NjRfdCBzb21lX2ZpZWxkKCkgY29uc3Q7CisgIHZvaWQgc2V0X3NvbWVfZmllbGQoOjppbnQ2NF90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgOjppbnQ2NF90IF9pbnRlcm5hbF9zb21lX2ZpZWxkKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6aWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzLlByb3RvTXNnKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OmludDY0X3Qgc29tZV9maWVsZF87CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvOworfTsKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N0cmljdC1hbGlhc2luZyIKKyNlbmRpZiAgLy8gX19HTlVDX18KKy8vIFByb3RvTXNnCisKKy8vIGludDY0IHNvbWVfZmllbGQgPSAxOworaW5saW5lIHZvaWQgUHJvdG9Nc2c6OmNsZWFyX3NvbWVfZmllbGQoKSB7CisgIF9pbXBsXy5zb21lX2ZpZWxkXyA9IDo6aW50NjRfdHswfTsKK30KK2lubGluZSA6OmludDY0X3QgUHJvdG9Nc2c6Ol9pbnRlcm5hbF9zb21lX2ZpZWxkKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnNvbWVfZmllbGRfOworfQoraW5saW5lIDo6aW50NjRfdCBQcm90b01zZzo6c29tZV9maWVsZCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDppZGVfcXVlcnkucHJvYmVyX3NjcmlwdHMuUHJvdG9Nc2cuc29tZV9maWVsZCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9zb21lX2ZpZWxkKCk7Cit9CitpbmxpbmUgdm9pZCBQcm90b01zZzo6X2ludGVybmFsX3NldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSkgeworICAKKyAgX2ltcGxfLnNvbWVfZmllbGRfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBQcm90b01zZzo6c2V0X3NvbWVfZmllbGQoOjppbnQ2NF90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfc29tZV9maWVsZCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6aWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzLlByb3RvTXNnLnNvbWVfZmllbGQpCit9CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmICAvLyBfX0dOVUNfXworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCit9ICAvLyBuYW1lc3BhY2UgcHJvYmVyX3NjcmlwdHMKK30gIC8vIG5hbWVzcGFjZSBpZGVfcXVlcnkKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX0dPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2ggYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmVkZmU1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9yZWdlbi5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaCAtZQorCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGlkZV9xdWVyeS5vdXQgZmlsZS4KKyMKKyMgVGhlIGlkZV9xdWVyeS5vdXQgZmlsZSBpcyBhIHByZS1jb21wdXRlZCByZXN1bHQgb2YgcnVubmluZyBpZGVfcXVlcnkuc2gKKyMgb24gYSBzZXQgb2YgZmlsZXMuIFRoaXMgYWxsb3dzIHRoZSBwcm9iZXIgdG8gcnVuIGl0cyB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcKKyMgaWRlX3F1ZXJ5LnNoLiBUaGUgcHJvYmVyIGRvZXNuJ3QgY2hlY2stb3V0IHRoZSBmdWxsIHNvdXJjZSBjb2RlLCBzbyBpdAorIyBjYW4ndCBydW4gaWRlX3F1ZXJ5LnNoIGl0c2VsZi4KKworY2QgJChkaXJuYW1lICRCQVNIX1NPVVJDRSkKK3NvdXJjZSAkKHB3ZCkvLi4vLi4vLi4vc2hlbGxfdXRpbHMuc2gKK3JlcXVpcmVfdG9wCisKK2ZpbGVzX3RvX2J1aWxkPSgKKyAgYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MKKykKKworY2QgJHtUT1B9CitidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuc2ggLS1sdW5jaF90YXJnZXQ9YW9zcF9hcm0tdHJ1bmtfc3RhZ2luZy1lbmcgJHtmaWxlc190b19idWlsZFtAXX0gPiBidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0CmRpZmYgLS1naXQgYS90b29scy9saXN0X2ZpbGVzLnB5IGIvdG9vbHMvbGlzdF9maWxlcy5weQppbmRleCAzYWZhODFmLi40ZjY2NmFhIDEwMDY0NAotLS0gYS90b29scy9saXN0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL2xpc3RfZmlsZXMucHkKQEAgLTE4LDYgKzE4LDcgQEAKIGZyb20gZ2xvYiBpbXBvcnQgZ2xvYgogZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCiBmcm9tIG9zLnBhdGggaW1wb3J0IGpvaW4sIHJlbHBhdGgKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgogaW1wb3J0IGFyZ3BhcnNlCiAKIGNsYXNzIEZpbGVMaXN0ZXI6CkBAIC0yNyw3ICsyOCw4IEBACiAgICAgICAgIHNlbGYuZm9sZGVyX2RpciA9IGFyZ3MuZGlyCiAgICAgICAgIHNlbGYuZXh0ZW5zaW9ucyA9IFtlIGlmIGUuc3RhcnRzd2l0aCgiLiIpIGVsc2UgIi4iICsgZSBmb3IgZSBpbiBhcmdzLmV4dGVuc2lvbnNdCiAgICAgICAgIHNlbGYucm9vdCA9IGFyZ3Mucm9vdAotICAgICAgICBzZWxmLmZpbGVzX2xpc3QgPSBsaXN0KCkKKyAgICAgICAgc2VsZi5maWxlc19saXN0IDogTGlzdFtzdHJdID0gbGlzdCgpCisgICAgICAgIHNlbGYuY2xhc3NlcyA9IGFyZ3MuY2xhc3NlcwogCiAgICAgZGVmIGdldF9maWxlcyhzZWxmKSAtPiBOb25lOgogICAgICAgICAiIiJHZXQgYWxsIGZpbGVzIGRpcmVjdG9yeSBpbiB0aGUgaW5wdXQgZGlyZWN0b3J5IGluY2x1ZGluZyB0aGUgZmlsZXMgaW4gdGhlIHN1YmRpcmVjdG9yaWVzCkBAIC02MSw2ICs2MywyNiBAQAogICAgIGRlZiBsaXN0KHNlbGYpIC0+IE5vbmU6CiAgICAgICAgIHNlbGYuZ2V0X2ZpbGVzKCkKICAgICAgICAgc2VsZi5maWxlc19saXN0ID0gW2YgZm9yIGYgaW4gc2VsZi5maWxlc19saXN0IGlmIG5vdCBzZWxmLmV4dGVuc2lvbnMgb3IgUGF0aChmKS5zdWZmaXggaW4gc2VsZi5leHRlbnNpb25zXQorCisgICAgICAgICMgSWYgZmlsZXNfbGlzdCBpcyBhcyBiZWxvdzoKKyAgICAgICAgIyBBL0IvQy5qYXZhCisgICAgICAgICMgQS9CL0QuamF2YQorICAgICAgICAjIEEvQi9FLnR4dAorICAgICAgICAjIC0tY2xhc3NlcyBmbGFnIGNvbnZlcnRzIGZpbGVzX2xpc3QgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgICAgICMgQS9CL0MuY2xhc3MKKyAgICAgICAgIyBBL0IvQyQqLmNsYXNzCisgICAgICAgICMgQS9CL0QuY2xhc3MKKyAgICAgICAgIyBBL0IvRCQqLmNsYXNzCisgICAgICAgICMgQWRkaXRpb25hbCBgJCpgLXN1ZmZpeGVkIGxpbmUgaXMgYXBwZW5kZWQgYWZ0ZXIgZWFjaCBsaW5lCisgICAgICAgICMgdG8gdGFrZSBtdWx0aXBsZSB0b3AgbGV2ZWwgY2xhc3NlcyBpbiBhIHNpbmdsZSBqYXZhIGZpbGUgaW50byBhY2NvdW50LgorICAgICAgICAjIE5vdGUgdGhhdCBub24tamF2YSBmaWxlcyBpbiBmaWxlc19saXN0IGFyZSBmaWx0ZXJlZCBvdXQuCisgICAgICAgIGlmIHNlbGYuY2xhc3NlczoKKyAgICAgICAgICAgIHNlbGYuZmlsZXNfbGlzdCA9IGxpc3QoY2hhaW4uZnJvbV9pdGVyYWJsZShbCisgICAgICAgICAgICAgICAgKGNsYXNzX2ZpbGVzIDo9IHN0cihQYXRoKGZmKS53aXRoX3N1ZmZpeCgiLmNsYXNzIikpLAorICAgICAgICAgICAgICAgICBjbGFzc19maWxlcy5yZXBsYWNlKCIuY2xhc3MiLCAiJCouY2xhc3MiKSkKKyAgICAgICAgICAgICAgICAgZm9yIGZmIGluIHNlbGYuZmlsZXNfbGlzdCBpZiBmZi5lbmRzd2l0aCgiLmphdmEiKQorICAgICAgICAgICAgXSkpCisKICAgICAgICAgc2VsZi53cml0ZSgpCiAKICAgICBkZWYgd3JpdGUoc2VsZikgLT4gTm9uZToKQEAgLTk1LDYgKzExNywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ib3B0aW9uYWwgZGlyZWN0b3J5IHRvIHJlcGxhY2UgdGhlIHJvb3QgZGlyZWN0b3JpZXMgb2Ygb3V0cHV0LiIpCiAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1leHRlbnNpb25zJywgbmFyZ3M9JyonLCBkZWZhdWx0PWxpc3QoKSwgZGVzdD0nZXh0ZW5zaW9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJFeHRlbnNpb25zIHRvIGluY2x1ZGUgaW4gdGhlIG91dHB1dC4gSWYgbm90IHNldCwgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZCIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jbGFzc2VzJywgZGVzdD0nY2xhc3NlcycsIGFjdGlvbj1hcmdwYXJzZS5Cb29sZWFuT3B0aW9uYWxBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJPcHRpb25hbCBmbGFnLiBJZiBwYXNzZWQsIG91dHB1dHMgYSBsaXN0IG9mIHBhdHRlcm4gb2YgY2xhc3MgZmlsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgcHJvZHVjZWQgYnkgY29tcGlsaW5nIGphdmEgZmlsZXMgaW4gdGhlIGlucHV0IGRpci4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb24tamF2YSBmaWxlcyBpbiB0aGUgaW5wdXQgZGlyZWN0b3J5IHdpbGwgYmUgaWdub3JlZC4iKQogCiAgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKIApkaWZmIC0tZ2l0IGEvdG9vbHMvbHVuY2hhYmxlIGIvdG9vbHMvbHVuY2hhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZjZTJjMjcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sdW5jaGFibGUKQEAgLTAsMCArMSw3MiBAQAorIyEvYmluL2Jhc2gKKworIyBUT0RPOiBDdXJyZW50bHkgb25seSBjaGVja3MgdHJ1bmtfc3RhZ2luZy4gU2hvdWxkIGNoZWNrIHRydW5rX3N0YWdpbmcgZmlyc3QsCisjICAgICAgIHRoZW4gdXNlIHRoZSBwcm9kdWN0LXNwZWNmaWMgcmVsZWFzZXMuIE9ubHkgYXBwbGllcyB0byAtYyB0aG91Z2guCisKK2Z1bmN0aW9uIEhlbHAoKSB7CitjYXQgPDxARU9GQAorVXNhZ2U6IGx1bmNoYWJsZSBbb3B0aW9uc10KKworTGlzdHMgcHJvZHVjdHMgdGhhdCBoYXZlIG5vIGZ1bmN0aW9uaW5nIGx1bmNoIGNvbWJvLgorCitvcHRpb25zOgorLWMgICAgcHJpbnRzIGFsbCBmYWlsaW5nIGx1bmNoIGNvbWJvcyBmb3IgYWxsIHRhcmdldHM7CistdyAgICB3aHk/IFByaW50cyB0aGUgZXJyb3IgbWVzc2FnZSBhZnRlciBlYWNoIGZhaWxlZCBsdW5jaCBjb21iby4gT25seQorICAgICAgd29ya3Mgd2l0aCAtYworCitARU9GQAorfQorCitjb21wbGV0ZT0wCit3aHk9MAord2hpbGUgZ2V0b3B0cyAiY3doIiBvcHRpb247IGRvCisgIGNhc2UgJG9wdGlvbiBpbgorICAgIGMpCisgICAgICBjb21wbGV0ZT0xOzsKKyAgICB3KQorICAgICAgd2h5PTE7OworICAgIGgpCisgICAgICBIZWxwCisgICAgICBleGl0OzsKKyAgZXNhYworZG9uZQorCisjIEdldHRpbmcgYWxsIG5hbWVkIHByb2R1Y3RzIGNhbiBmYWlsIGlmIHdlIGhhdmVuJ3QgbHVuY2hlZCBhbnl0aGluZworc291cmNlICQocHdkKS9idWlsZC9lbnZzZXR1cC5zaCAmPiAvZGV2L251bGwKK2FsbF9uYW1lZF9wcm9kdWN0cz0oICQoZ2V0X2J1aWxkX3ZhciBhbGxfbmFtZWRfcHJvZHVjdHMgMj4gL2Rldi9udWxsKSApCitpZiBbWyAkPyAtbmUgMCBdXTsgdGhlbgorICBlY2hvICJnZXRfYnVpbGRfdmFyIGFsbF9uYW1lZF9wcm9kdWN0cyBmYWlsZWQuIEx1bmNoIHNvbWV0aGluZyBmaXJzdD8iID4mMgorICBleGl0IDEKK2ZpCit0b3RhbF9wcm9kdWN0cz0keyNhbGxfbmFtZWRfcHJvZHVjdHNbQF19CitjdXJyZW50X3Byb2R1Y3Q9MAorCitmb3IgcHJvZHVjdCBpbiAiJHthbGxfbmFtZWRfcHJvZHVjdHNbQF19IjsgZG8KKyAgKCggY3VycmVudF9wcm9kdWN0ICs9IDEgKSkKKyAgc2luZ2xlX3Bhc3M9MAorICBwcmludGYgIiBDaGVja2luZyAke2N1cnJlbnRfcHJvZHVjdH0vJHt0b3RhbF9wcm9kdWN0c30gXHIiID4mMgorICBmb3IgcmVsZWFzZSBpbiB0cnVua19zdGFnaW5nOyBkbworICAgIGZvciB2YXJpYW50IGluIGVuZyB1c2VyIHVzZXJkZWJ1ZzsgZG8KKyAgICAgIGx1bmNoY29tYm89IiR7cHJvZHVjdH0tJHtyZWxlYXNlfS0ke3ZhcmlhbnR9IgorICAgICAgbHVuY2hfZXJyb3I9IiQobHVuY2ggJGx1bmNoY29tYm8gMj4mMSA+IC9kZXYvbnVsbCkiCisgICAgICBpZiBbWyAkPyAtbmUgMCBdXTsgdGhlbgorICAgICAgICAjIEx1bmNoIGZhaWxlZAorICAgICAgICBpZiBbWyAkY29tcGxldGUgLWVxIDEgXV07IHRoZW4KKyAgICAgICAgICBlY2hvIC1lICIke3Byb2R1Y3R9IDogJHtsdW5jaGNvbWJvfSIKKyAgICAgICAgICBpZiBbWyAkd2h5IC1lcSAxIF1dOyB0aGVuCisgICAgICAgICAgICBlY2hvIC1lICIkKHNlZCAncy9eLyAgICAvZycgPDw8JGx1bmNoX2Vycm9yKSIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZWxpZiBbWyAkY29tcGxldGUgLW5lIDEgXV07IHRoZW4KKyAgICAgICAgc2luZ2xlX3Bhc3M9MQorICAgICAgICBicmVhayAjIHNraXAgdmFyaWFudAorICAgICAgZmkKKyAgICBkb25lCisgICAgaWYgW1sgJHNpbmdsZV9wYXNzIC1lcSAxIF1dOyB0aGVuCisgICAgICBicmVhayAjIHNraXAgcmVsZWFzZQorICAgIGZpCisgIGRvbmUKKyAgaWYgW1sgJGNvbXBsZXRlIC1lcSAwIF1dICYmIFtbICRzaW5nbGVfcGFzcyAtZXEgMCBdXTsgdGhlbgorICAgIGVjaG8gIiR7cHJvZHVjdH0iCisgIGZpCitkb25lCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS9BbmRyb2lkLmJwIGIvdG9vbHMvbWV0YWRhdGEvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2QxMDZkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWV0YWRhdGEvQW5kcm9pZC5icApAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2JsdWVwcmludF9nb19iaW5hcnkgeworICAgIG5hbWU6ICJtZXRhZGF0YSIsCisgICAgZGVwczogWworICAgICAgICAgICAgInNvb25nLXRlc3RpbmctdGVzdF9zcGVjX3Byb3RvIiwKKyAgICAgICAgICAgICJzb29uZy10ZXN0aW5nLWNvZGVfbWV0YWRhdGFfcHJvdG8iLAorICAgICAgICAgICAgInNvb25nLXRlc3RpbmctY29kZV9tZXRhZGF0YV9pbnRlcm5hbF9wcm90byIsCisgICAgICAgICAgICAiZ29sYW5nLXByb3RvYnVmLXByb3RvIiwKKyAgICAgICAgXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJnZW5lcmF0b3IuZ28iLAorICAgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS9PV05FUlMgYi90b29scy9tZXRhZGF0YS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiY2RmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ldGFkYXRhL09XTkVSUwpAQCAtMCwwICsxLDQgQEAKK2RhcmlvZnJlbmlAZ29vZ2xlLmNvbQoram9lb0Bnb29nbGUuY29tCityb25pc2hAZ29vZ2xlLmNvbQorY2FkaXR5YUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS9nZW5lcmF0b3IuZ28gYi90b29scy9tZXRhZGF0YS9nZW5lcmF0b3IuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2NjhiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ldGFkYXRhL2dlbmVyYXRvci5nbwpAQCAtMCwwICsxLDMyOCBAQAorcGFja2FnZSBtYWluCisKK2ltcG9ydCAoCisJImZsYWciCisJImZtdCIKKwkiaW8iCisJImxvZyIKKwkib3MiCisJInNvcnQiCisJInN0cmluZ3MiCisJInN5bmMiCisKKwkiYW5kcm9pZC9zb29uZy90ZXN0aW5nL2NvZGVfbWV0YWRhdGFfaW50ZXJuYWxfcHJvdG8iCisJImFuZHJvaWQvc29vbmcvdGVzdGluZy9jb2RlX21ldGFkYXRhX3Byb3RvIgorCSJhbmRyb2lkL3Nvb25nL3Rlc3RpbmcvdGVzdF9zcGVjX3Byb3RvIgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9wcm90byIKKykKKwordHlwZSBrZXlUb0xvY2tzTWFwIHN0cnVjdCB7CisJbG9ja3Mgc3luYy5NYXAKK30KKworZnVuYyAoa2wgKmtleVRvTG9ja3NNYXApIEdldExvY2tGb3JLZXkoa2V5IHN0cmluZykgKnN5bmMuTXV0ZXggeworCW11dGV4LCBfIDo9IGtsLmxvY2tzLkxvYWRPclN0b3JlKGtleSwgJnN5bmMuTXV0ZXh7fSkKKwlyZXR1cm4gbXV0ZXguKCpzeW5jLk11dGV4KQorfQorCisvLyBEZWZpbmUgYSBzdHJ1Y3QgdG8gaG9sZCB0aGUgY29tYmluYXRpb24gb2YgdGVhbSBJRCBhbmQgbXVsdGktb3duZXJzaGlwIGZsYWcgZm9yIHZhbGlkYXRpb24KK3R5cGUgc291cmNlRmlsZUF0dHJpYnV0ZXMgc3RydWN0IHsKKwlUZWFtSUQgICAgICAgICBzdHJpbmcKKwlNdWx0aU93bmVyc2hpcCBib29sCisJUGF0aCAgICAgICAgICAgc3RyaW5nCit9CisKK2Z1bmMgZ2V0U29ydGVkS2V5cyhzeW5jTWFwICpzeW5jLk1hcCkgW11zdHJpbmcgeworCXZhciBhbGxLZXlzIFtdc3RyaW5nCisJc3luY01hcC5SYW5nZSgKKwkJZnVuYyhrZXksIF8gaW50ZXJmYWNle30pIGJvb2wgeworCQkJYWxsS2V5cyA9IGFwcGVuZChhbGxLZXlzLCBrZXkuKHN0cmluZykpCisJCQlyZXR1cm4gdHJ1ZQorCQl9LAorCSkKKworCXNvcnQuU3RyaW5ncyhhbGxLZXlzKQorCXJldHVybiBhbGxLZXlzCit9CisKKy8vIHdyaXRlUHJvdG9Ub0ZpbGUgbWFyc2hhbHMgYSBwcm90b2J1ZiBtZXNzYWdlIGFuZCB3cml0ZXMgaXQgdG8gYSBmaWxlCitmdW5jIHdyaXRlUHJvdG9Ub0ZpbGUob3V0cHV0RmlsZSBzdHJpbmcsIG1lc3NhZ2UgcHJvdG8uTWVzc2FnZSkgeworCWRhdGEsIGVyciA6PSBwcm90by5NYXJzaGFsKG1lc3NhZ2UpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbChlcnIpCisJfQorCWZpbGUsIGVyciA6PSBvcy5DcmVhdGUob3V0cHV0RmlsZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsKGVycikKKwl9CisJZGVmZXIgZmlsZS5DbG9zZSgpCisKKwlfLCBlcnIgPSBmaWxlLldyaXRlKGRhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbChlcnIpCisJfQorfQorCitmdW5jIHJlYWRGaWxlVG9TdHJpbmcoZmlsZVBhdGggc3RyaW5nKSBzdHJpbmcgeworCWZpbGUsIGVyciA6PSBvcy5PcGVuKGZpbGVQYXRoKQorCWlmIGVyciAhPSBuaWwgeworCQlsb2cuRmF0YWwoZXJyKQorCX0KKwlkZWZlciBmaWxlLkNsb3NlKCkKKworCWRhdGEsIGVyciA6PSBpby5SZWFkQWxsKGZpbGUpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbChlcnIpCisJfQorCXJldHVybiBzdHJpbmcoZGF0YSkKK30KKworZnVuYyB3cml0ZUVtcHR5T3V0cHV0UHJvdG8ob3V0cHV0RmlsZSBzdHJpbmcsIG1ldGFkYXRhUnVsZSBzdHJpbmcpIHsKKwlmaWxlLCBlcnIgOj0gb3MuQ3JlYXRlKG91dHB1dEZpbGUpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbChlcnIpCisJfQorCXZhciBtZXNzYWdlIHByb3RvLk1lc3NhZ2UKKwlpZiBtZXRhZGF0YVJ1bGUgPT0gInRlc3Rfc3BlYyIgeworCQltZXNzYWdlID0gJnRlc3Rfc3BlY19wcm90by5UZXN0U3BlY3t9CisJfSBlbHNlIGlmIG1ldGFkYXRhUnVsZSA9PSAiY29kZV9tZXRhZGF0YSIgeworCQltZXNzYWdlID0gJmNvZGVfbWV0YWRhdGFfcHJvdG8uQ29kZU1ldGFkYXRhe30KKwl9CisJZGF0YSwgZXJyIDo9IHByb3RvLk1hcnNoYWwobWVzc2FnZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsKGVycikKKwl9CisJZGVmZXIgZmlsZS5DbG9zZSgpCisKKwlfLCBlcnIgPSBmaWxlLldyaXRlKFtdYnl0ZShkYXRhKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbG9nLkZhdGFsKGVycikKKwl9Cit9CisKK2Z1bmMgcHJvY2Vzc1Rlc3RTcGVjUHJvdG9idWYoCisJZmlsZVBhdGggc3RyaW5nLCBvd25lcnNoaXBNZXRhZGF0YU1hcCAqc3luYy5NYXAsIGtleUxvY2tzICprZXlUb0xvY2tzTWFwLAorCWVyckNoIGNoYW4gZXJyb3IsIHdnICpzeW5jLldhaXRHcm91cCwKKykgeworCWRlZmVyIHdnLkRvbmUoKQorCisJZmlsZUNvbnRlbnQgOj0gc3RyaW5ncy5UcmltUmlnaHQocmVhZEZpbGVUb1N0cmluZyhmaWxlUGF0aCksICJcbiIpCisJdGVzdERhdGEgOj0gdGVzdF9zcGVjX3Byb3RvLlRlc3RTcGVje30KKwllcnIgOj0gcHJvdG8uVW5tYXJzaGFsKFtdYnl0ZShmaWxlQ29udGVudCksICZ0ZXN0RGF0YSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJZXJyQ2ggPC0gZXJyCisJCXJldHVybgorCX0KKworCW93bmVyc2hpcE1ldGFkYXRhIDo9IHRlc3REYXRhLkdldE93bmVyc2hpcE1ldGFkYXRhTGlzdCgpCisJZm9yIF8sIG1ldGFkYXRhIDo9IHJhbmdlIG93bmVyc2hpcE1ldGFkYXRhIHsKKwkJa2V5IDo9IG1ldGFkYXRhLkdldFRhcmdldE5hbWUoKQorCQlsb2NrIDo9IGtleUxvY2tzLkdldExvY2tGb3JLZXkoa2V5KQorCQlsb2NrLkxvY2soKQorCisJCXZhbHVlLCBsb2FkZWQgOj0gb3duZXJzaGlwTWV0YWRhdGFNYXAuTG9hZE9yU3RvcmUoCisJCQlrZXksIFtdKnRlc3Rfc3BlY19wcm90by5UZXN0U3BlY19Pd25lcnNoaXBNZXRhZGF0YXttZXRhZGF0YX0sCisJCSkKKwkJaWYgbG9hZGVkIHsKKwkJCWV4aXN0aW5nTWV0YWRhdGEgOj0gdmFsdWUuKFtdKnRlc3Rfc3BlY19wcm90by5UZXN0U3BlY19Pd25lcnNoaXBNZXRhZGF0YSkKKwkJCWlzRHVwbGljYXRlIDo9IGZhbHNlCisJCQlmb3IgXywgZXhpc3RpbmcgOj0gcmFuZ2UgZXhpc3RpbmdNZXRhZGF0YSB7CisJCQkJaWYgbWV0YWRhdGEuR2V0VHJlbmR5VGVhbUlkKCkgIT0gZXhpc3RpbmcuR2V0VHJlbmR5VGVhbUlkKCkgeworCQkJCQllcnJDaCA8LSBmbXQuRXJyb3JmKAorCQkJCQkJIkNvbmZsaWN0aW5nIHRyZW5keSB0ZWFtIElEcyBmb3VuZCBmb3IgJXMgYXQ6XG4lcyB3aXRoIHRlYW1JZCIrCisJCQkJCQkJIjogJXMsXG4lcyB3aXRoIHRlYW1JZDogJXMiLAorCQkJCQkJa2V5LAorCQkJCQkJbWV0YWRhdGEuR2V0UGF0aCgpLCBtZXRhZGF0YS5HZXRUcmVuZHlUZWFtSWQoKSwgZXhpc3RpbmcuR2V0UGF0aCgpLAorCQkJCQkJZXhpc3RpbmcuR2V0VHJlbmR5VGVhbUlkKCksCisJCQkJCSkKKworCQkJCQlsb2NrLlVubG9jaygpCisJCQkJCXJldHVybgorCQkJCX0KKwkJCQlpZiBtZXRhZGF0YS5HZXRUcmVuZHlUZWFtSWQoKSA9PSBleGlzdGluZy5HZXRUcmVuZHlUZWFtSWQoKSAmJiBtZXRhZGF0YS5HZXRQYXRoKCkgPT0gZXhpc3RpbmcuR2V0UGF0aCgpIHsKKwkJCQkJaXNEdXBsaWNhdGUgPSB0cnVlCisJCQkJCWJyZWFrCisJCQkJfQorCQkJfQorCQkJaWYgIWlzRHVwbGljYXRlIHsKKwkJCQlleGlzdGluZ01ldGFkYXRhID0gYXBwZW5kKGV4aXN0aW5nTWV0YWRhdGEsIG1ldGFkYXRhKQorCQkJCW93bmVyc2hpcE1ldGFkYXRhTWFwLlN0b3JlKGtleSwgZXhpc3RpbmdNZXRhZGF0YSkKKwkJCX0KKwkJfQorCisJCWxvY2suVW5sb2NrKCkKKwl9Cit9CisKKy8vIHByb2Nlc3NDb2RlTWV0YWRhdGFQcm90b2J1ZiBwcm9jZXNzZXMgQ29kZU1ldGFkYXRhIHByb3RvYnVmIGZpbGVzCitmdW5jIHByb2Nlc3NDb2RlTWV0YWRhdGFQcm90b2J1ZigKKwlmaWxlUGF0aCBzdHJpbmcsIG93bmVyc2hpcE1ldGFkYXRhTWFwICpzeW5jLk1hcCwgc291cmNlRmlsZU1ldGFkYXRhTWFwICpzeW5jLk1hcCwga2V5TG9ja3MgKmtleVRvTG9ja3NNYXAsCisJZXJyQ2ggY2hhbiBlcnJvciwgd2cgKnN5bmMuV2FpdEdyb3VwLAorKSB7CisJZGVmZXIgd2cuRG9uZSgpCisKKwlmaWxlQ29udGVudCA6PSBzdHJpbmdzLlRyaW1SaWdodChyZWFkRmlsZVRvU3RyaW5nKGZpbGVQYXRoKSwgIlxuIikKKwlpbnRlcm5hbENvZGVEYXRhIDo9IGNvZGVfbWV0YWRhdGFfaW50ZXJuYWxfcHJvdG8uQ29kZU1ldGFkYXRhSW50ZXJuYWx7fQorCWVyciA6PSBwcm90by5Vbm1hcnNoYWwoW11ieXRlKGZpbGVDb250ZW50KSwgJmludGVybmFsQ29kZURhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCWVyckNoIDwtIGVycgorCQlyZXR1cm4KKwl9CisKKwkvLyBQcm9jZXNzIGVhY2ggVGFyZ2V0T3duZXJzaGlwIGVudHJ5CisJZm9yIF8sIGludGVybmFsTWV0YWRhdGEgOj0gcmFuZ2UgaW50ZXJuYWxDb2RlRGF0YS5HZXRUYXJnZXRPd25lcnNoaXBMaXN0KCkgeworCQlrZXkgOj0gaW50ZXJuYWxNZXRhZGF0YS5HZXRUYXJnZXROYW1lKCkKKwkJbG9jayA6PSBrZXlMb2Nrcy5HZXRMb2NrRm9yS2V5KGtleSkKKwkJbG9jay5Mb2NrKCkKKworCQlmb3IgXywgc3JjRmlsZSA6PSByYW5nZSBpbnRlcm5hbE1ldGFkYXRhLkdldFNvdXJjZUZpbGVzKCkgeworCQkJc3JjRmlsZUtleSA6PSBzcmNGaWxlCisJCQlzcmNGaWxlTG9jayA6PSBrZXlMb2Nrcy5HZXRMb2NrRm9yS2V5KHNyY0ZpbGVLZXkpCisJCQlzcmNGaWxlTG9jay5Mb2NrKCkKKwkJCWF0dHJpYnV0ZXMgOj0gc291cmNlRmlsZUF0dHJpYnV0ZXN7CisJCQkJVGVhbUlEOiAgICAgICAgIGludGVybmFsTWV0YWRhdGEuR2V0VHJlbmR5VGVhbUlkKCksCisJCQkJTXVsdGlPd25lcnNoaXA6IGludGVybmFsTWV0YWRhdGEuR2V0TXVsdGlPd25lcnNoaXAoKSwKKwkJCQlQYXRoOiAgICAgICAgICAgaW50ZXJuYWxNZXRhZGF0YS5HZXRQYXRoKCksCisJCQl9CisKKwkJCWV4aXN0aW5nQXR0cmlidXRlcywgZXhpc3RzIDo9IHNvdXJjZUZpbGVNZXRhZGF0YU1hcC5Mb2FkKHNyY0ZpbGVLZXkpCisJCQlpZiBleGlzdHMgeworCQkJCWV4aXN0aW5nIDo9IGV4aXN0aW5nQXR0cmlidXRlcy4oc291cmNlRmlsZUF0dHJpYnV0ZXMpCisJCQkJaWYgYXR0cmlidXRlcy5UZWFtSUQgIT0gZXhpc3RpbmcuVGVhbUlEICYmICghYXR0cmlidXRlcy5NdWx0aU93bmVyc2hpcCB8fCAhZXhpc3RpbmcuTXVsdGlPd25lcnNoaXApIHsKKwkJCQkJZXJyQ2ggPC0gZm10LkVycm9yZigKKwkJCQkJCSJDb25mbGljdCBmb3VuZCBmb3Igc291cmNlIGZpbGUgJXMgY292ZXJlZCBhdCAlcyB3aXRoIHRlYW0gSUQ6ICVzLiBFeGlzdGluZyB0ZWFtIElEOiAlcyBhbmQgcGF0aDogJXMuIisKKwkJCQkJCQkiIElmIG11bHRpLW93bmVyc2hpcCBpcyByZXF1aXJlZCwgbXVsdGlPd25lcnNoaXAgc2hvdWxkIGJlIHNldCB0byB0cnVlIGluIGFsbCB0ZXN0X3NwZWMgbW9kdWxlcyB1c2luZyB0aGlzIHRhcmdldC4gIisKKwkJCQkJCQkiTXVsdGlwbGUtb3duZXJzaGlwIGluIGdlbmVyYWwgaXMgZGlzY291cmFnZWQgdGhvdWdoIGFzIGl0IG1ha2UgaW5mcmFzdHJ1Y3R1cmUgYXJvdW5kIGFuZHJvaWQgcmVseWluZyBvbiB0aGlzIGluZm9ybWF0aW9uIHBpY2sgdXAgYSByYW5kb20gdmFsdWUgd2hlbiBpdCBuZWVkcyBvbmx5IG9uZS4iLAorCQkJCQkJc3JjRmlsZSwgaW50ZXJuYWxNZXRhZGF0YS5HZXRQYXRoKCksIGF0dHJpYnV0ZXMuVGVhbUlELCBleGlzdGluZy5UZWFtSUQsIGV4aXN0aW5nLlBhdGgsCisJCQkJCSkKKwkJCQkJc3JjRmlsZUxvY2suVW5sb2NrKCkKKwkJCQkJbG9jay5VbmxvY2soKQorCQkJCQlyZXR1cm4KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIFN0b3JlIHRoZSBtZXRhZGF0YSBpZiBubyBjb25mbGljdAorCQkJCXNvdXJjZUZpbGVNZXRhZGF0YU1hcC5TdG9yZShzcmNGaWxlS2V5LCBhdHRyaWJ1dGVzKQorCQkJfQorCQkJc3JjRmlsZUxvY2suVW5sb2NrKCkKKwkJfQorCisJCXZhbHVlLCBsb2FkZWQgOj0gb3duZXJzaGlwTWV0YWRhdGFNYXAuTG9hZE9yU3RvcmUoCisJCQlrZXksIFtdKmNvZGVfbWV0YWRhdGFfaW50ZXJuYWxfcHJvdG8uQ29kZU1ldGFkYXRhSW50ZXJuYWxfVGFyZ2V0T3duZXJzaGlwe2ludGVybmFsTWV0YWRhdGF9LAorCQkpCisJCWlmIGxvYWRlZCB7CisJCQlleGlzdGluZ01ldGFkYXRhIDo9IHZhbHVlLihbXSpjb2RlX21ldGFkYXRhX2ludGVybmFsX3Byb3RvLkNvZGVNZXRhZGF0YUludGVybmFsX1RhcmdldE93bmVyc2hpcCkKKwkJCWlzRHVwbGljYXRlIDo9IGZhbHNlCisJCQlmb3IgXywgZXhpc3RpbmcgOj0gcmFuZ2UgZXhpc3RpbmdNZXRhZGF0YSB7CisJCQkJaWYgaW50ZXJuYWxNZXRhZGF0YS5HZXRUcmVuZHlUZWFtSWQoKSA9PSBleGlzdGluZy5HZXRUcmVuZHlUZWFtSWQoKSAmJiBpbnRlcm5hbE1ldGFkYXRhLkdldFBhdGgoKSA9PSBleGlzdGluZy5HZXRQYXRoKCkgeworCQkJCQlpc0R1cGxpY2F0ZSA9IHRydWUKKwkJCQkJYnJlYWsKKwkJCQl9CisJCQl9CisJCQlpZiAhaXNEdXBsaWNhdGUgeworCQkJCWV4aXN0aW5nTWV0YWRhdGEgPSBhcHBlbmQoZXhpc3RpbmdNZXRhZGF0YSwgaW50ZXJuYWxNZXRhZGF0YSkKKwkJCQlvd25lcnNoaXBNZXRhZGF0YU1hcC5TdG9yZShrZXksIGV4aXN0aW5nTWV0YWRhdGEpCisJCQl9CisJCX0KKworCQlsb2NrLlVubG9jaygpCisJfQorfQorCitmdW5jIG1haW4oKSB7CisJaW5wdXRGaWxlIDo9IGZsYWcuU3RyaW5nKCJpbnB1dEZpbGUiLCAiIiwgIklucHV0IGZpbGUgcGF0aCIpCisJb3V0cHV0RmlsZSA6PSBmbGFnLlN0cmluZygib3V0cHV0RmlsZSIsICIiLCAiT3V0cHV0IGZpbGUgcGF0aCIpCisJcnVsZSA6PSBmbGFnLlN0cmluZygKKwkJInJ1bGUiLCAiIiwgIk1ldGFkYXRhIHJ1bGUgKEhpbnQ6IHRlc3Rfc3BlYyBvciBjb2RlX21ldGFkYXRhKSIsCisJKQorCWZsYWcuUGFyc2UoKQorCisJaWYgKmlucHV0RmlsZSA9PSAiIiB8fCAqb3V0cHV0RmlsZSA9PSAiIiB8fCAqcnVsZSA9PSAiIiB7CisJCWZtdC5QcmludGxuKCJVc2FnZTogbWV0YWRhdGEgLXJ1bGUgPHJ1bGU+IC1pbnB1dEZpbGUgPGlucHV0IGZpbGUgcGF0aD4gLW91dHB1dEZpbGUgPG91dHB1dCBmaWxlIHBhdGg+IikKKwkJb3MuRXhpdCgxKQorCX0KKworCWlucHV0RmlsZURhdGEgOj0gc3RyaW5ncy5UcmltUmlnaHQocmVhZEZpbGVUb1N0cmluZygqaW5wdXRGaWxlKSwgIlxuIikKKwlmaWxlUGF0aHMgOj0gc3RyaW5ncy5TcGxpdChpbnB1dEZpbGVEYXRhLCAiICIpCisJaWYgbGVuKGZpbGVQYXRocykgPT0gMSAmJiBmaWxlUGF0aHNbMF0gPT0gIiIgeworCQl3cml0ZUVtcHR5T3V0cHV0UHJvdG8oKm91dHB1dEZpbGUsICpydWxlKQorCQlyZXR1cm4KKwl9CisJb3duZXJzaGlwTWV0YWRhdGFNYXAgOj0gJnN5bmMuTWFwe30KKwlrZXlMb2NrcyA6PSAma2V5VG9Mb2Nrc01hcHt9CisJZXJyQ2ggOj0gbWFrZShjaGFuIGVycm9yLCBsZW4oZmlsZVBhdGhzKSkKKwl2YXIgd2cgc3luYy5XYWl0R3JvdXAKKworCXN3aXRjaCAqcnVsZSB7CisJY2FzZSAidGVzdF9zcGVjIjoKKwkJZm9yIF8sIGZpbGVQYXRoIDo9IHJhbmdlIGZpbGVQYXRocyB7CisJCQl3Zy5BZGQoMSkKKwkJCWdvIHByb2Nlc3NUZXN0U3BlY1Byb3RvYnVmKAorCQkJCWZpbGVQYXRoLCBvd25lcnNoaXBNZXRhZGF0YU1hcCwga2V5TG9ja3MsIGVyckNoLCAmd2csCisJCQkpCisJCX0KKworCQl3Zy5XYWl0KCkKKwkJY2xvc2UoZXJyQ2gpCisKKwkJZm9yIGVyciA6PSByYW5nZSBlcnJDaCB7CisJCQlsb2cuRmF0YWwoZXJyKQorCQl9CisKKwkJYWxsS2V5cyA6PSBnZXRTb3J0ZWRLZXlzKG93bmVyc2hpcE1ldGFkYXRhTWFwKQorCQl2YXIgYWxsTWV0YWRhdGEgW10qdGVzdF9zcGVjX3Byb3RvLlRlc3RTcGVjX093bmVyc2hpcE1ldGFkYXRhCisKKwkJZm9yIF8sIGtleSA6PSByYW5nZSBhbGxLZXlzIHsKKwkJCXZhbHVlLCBfIDo9IG93bmVyc2hpcE1ldGFkYXRhTWFwLkxvYWQoa2V5KQorCQkJbWV0YWRhdGFMaXN0IDo9IHZhbHVlLihbXSp0ZXN0X3NwZWNfcHJvdG8uVGVzdFNwZWNfT3duZXJzaGlwTWV0YWRhdGEpCisJCQlhbGxNZXRhZGF0YSA9IGFwcGVuZChhbGxNZXRhZGF0YSwgbWV0YWRhdGFMaXN0Li4uKQorCQl9CisKKwkJdGVzdFNwZWMgOj0gJnRlc3Rfc3BlY19wcm90by5UZXN0U3BlY3sKKwkJCU93bmVyc2hpcE1ldGFkYXRhTGlzdDogYWxsTWV0YWRhdGEsCisJCX0KKwkJd3JpdGVQcm90b1RvRmlsZSgqb3V0cHV0RmlsZSwgdGVzdFNwZWMpCisJCWJyZWFrCisJY2FzZSAiY29kZV9tZXRhZGF0YSI6CisJCXNvdXJjZUZpbGVNZXRhZGF0YU1hcCA6PSAmc3luYy5NYXB7fQorCQlmb3IgXywgZmlsZVBhdGggOj0gcmFuZ2UgZmlsZVBhdGhzIHsKKwkJCXdnLkFkZCgxKQorCQkJZ28gcHJvY2Vzc0NvZGVNZXRhZGF0YVByb3RvYnVmKAorCQkJCWZpbGVQYXRoLCBvd25lcnNoaXBNZXRhZGF0YU1hcCwgc291cmNlRmlsZU1ldGFkYXRhTWFwLCBrZXlMb2NrcywgZXJyQ2gsICZ3ZywKKwkJCSkKKwkJfQorCisJCXdnLldhaXQoKQorCQljbG9zZShlcnJDaCkKKworCQlmb3IgZXJyIDo9IHJhbmdlIGVyckNoIHsKKwkJCWxvZy5GYXRhbChlcnIpCisJCX0KKworCQlzb3J0ZWRLZXlzIDo9IGdldFNvcnRlZEtleXMob3duZXJzaGlwTWV0YWRhdGFNYXApCisJCWFsbE1ldGFkYXRhIDo9IG1ha2UoW10qY29kZV9tZXRhZGF0YV9wcm90by5Db2RlTWV0YWRhdGFfVGFyZ2V0T3duZXJzaGlwLCAwKQorCQlmb3IgXywga2V5IDo9IHJhbmdlIHNvcnRlZEtleXMgeworCQkJdmFsdWUsIF8gOj0gb3duZXJzaGlwTWV0YWRhdGFNYXAuTG9hZChrZXkpCisJCQltZXRhZGF0YSA6PSB2YWx1ZS4oW10qY29kZV9tZXRhZGF0YV9pbnRlcm5hbF9wcm90by5Db2RlTWV0YWRhdGFJbnRlcm5hbF9UYXJnZXRPd25lcnNoaXApCisJCQlmb3IgXywgbSA6PSByYW5nZSBtZXRhZGF0YSB7CisJCQkJdGFyZ2V0TmFtZSA6PSBtLkdldFRhcmdldE5hbWUoKQorCQkJCXBhdGggOj0gbS5HZXRQYXRoKCkKKwkJCQl0cmVuZHlUZWFtSWQgOj0gbS5HZXRUcmVuZHlUZWFtSWQoKQorCisJCQkJYWxsTWV0YWRhdGEgPSBhcHBlbmQoYWxsTWV0YWRhdGEsICZjb2RlX21ldGFkYXRhX3Byb3RvLkNvZGVNZXRhZGF0YV9UYXJnZXRPd25lcnNoaXB7CisJCQkJCVRhcmdldE5hbWU6ICAgJnRhcmdldE5hbWUsCisJCQkJCVBhdGg6ICAgICAgICAgJnBhdGgsCisJCQkJCVRyZW5keVRlYW1JZDogJnRyZW5keVRlYW1JZCwKKwkJCQkJU291cmNlRmlsZXM6ICBtLkdldFNvdXJjZUZpbGVzKCksCisJCQkJfSkKKwkJCX0KKwkJfQorCisJCWZpbmFsTWV0YWRhdGEgOj0gJmNvZGVfbWV0YWRhdGFfcHJvdG8uQ29kZU1ldGFkYXRheworCQkJVGFyZ2V0T3duZXJzaGlwTGlzdDogYWxsTWV0YWRhdGEsCisJCX0KKwkJd3JpdGVQcm90b1RvRmlsZSgqb3V0cHV0RmlsZSwgZmluYWxNZXRhZGF0YSkKKwkJYnJlYWsKKwlkZWZhdWx0OgorCQlsb2cuRmF0YWxmKCJObyBzcGVjaWZpYyBwcm9jZXNzaW5nIGltcGxlbWVudGVkIGZvciBydWxlICclcycuXG4iLCAqcnVsZSkKKwl9Cit9CmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS9nby5tb2QgYi90b29scy9tZXRhZGF0YS9nby5tb2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkMDRiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ldGFkYXRhL2dvLm1vZApAQCAtMCwwICsxLDcgQEAKK21vZHVsZSBhbmRyb2lkL3Nvb25nL3Rvb2xzL21ldGFkYXRhCisKK3JlcXVpcmUgZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjAuMC4wCisKK3JlcGxhY2UgZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjAuMC4wID0+IC4uLy4uLy4uL2V4dGVybmFsL2dvbGFuZy1wcm90b2J1ZgorCitnbyAxLjE4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvZ28ud29yayBiL3Rvb2xzL21ldGFkYXRhL2dvLndvcmsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjZGY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ldGFkYXRhL2dvLndvcmsKQEAgLTAsMCArMSwxMSBAQAorZ28gMS4xOAorCit1c2UgKAorCS4KKwkuLi8uLi8uLi8uLi9leHRlcm5hbC9nb2xhbmctcHJvdG9idWYKKwkuLi8uLi8uLi9zb29uZy90ZXN0aW5nL3Rlc3Rfc3BlY19wcm90bworCS4uLy4uLy4uL3Nvb25nL3Rlc3RpbmcvY29kZV9tZXRhZGF0YV9wcm90bworCS4uLy4uLy4uL3Nvb25nL3Rlc3RpbmcvY29kZV9tZXRhZGF0YV9wcm90b19pbnRlcm5hbAorKQorCityZXBsYWNlIGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmIHYwLjAuMCA9PiAuLi8uLi8uLi8uLi9leHRlcm5hbC9nb2xhbmctcHJvdG9idWYKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2VtcHR5SW5wdXRGaWxlLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2VtcHR5SW5wdXRGaWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEzNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZW1wdHlJbnB1dEZpbGUudHh0CkBAIC0wLDAgKzEgQEAKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZXhwZWN0ZWRDb2RlTWV0YWRhdGFPdXRwdXQudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZXhwZWN0ZWRDb2RlTWV0YWRhdGFPdXRwdXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NWNmNDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9leHBlY3RlZENvZGVNZXRhZGF0YU91dHB1dC50eHQKQEAgLTAsMCArMSw3IEBACisKKyAKKwNiYXISCitBbmRyb2lkLmJwGgUxMjM0NiIGYi5qYXZhCisgCisDZm9vEgorQW5kcm9pZC5icBoFMTIzNDUiBmEuamF2YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2V4cGVjdGVkT3V0cHV0RmlsZS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9leHBlY3RlZE91dHB1dEZpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDM4MmYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9leHBlY3RlZE91dHB1dEZpbGUudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCitBbmRyb2lkLmJwGgUxMjM0NQorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCitBbmRyb2lkLmJwGgUxMjM0NgorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCitBcXdlcnR5LmJwGgUxMjM0NgorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCitBcG9pdXl0LmJwGgUxMjM0NgorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCitBbmRyb2lkLmJwGgUxMjM0NQorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCitBc2RmZ2hqLmJwGgUxMjM0NQorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCitBenhjdmJuLmJwGgUxMjM0NQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUxLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWJlZWQwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTEudHh0CkBAIC0wLDAgKzEsMTMgQEAKKworLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCitBbmRyb2lkLmJwGgUxMjM0NQorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCitBbmRyb2lkLmJwGgUxMjM0NQorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCitBc2RmZ2hqLmJwGgUxMjM0NQorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCitBenhjdmJuLmJwGgUxMjM0NQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTIudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYTc1M2YKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlMi50eHQKQEAgLTAsMCArMSwyNSBAQAorCisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLW9uZRIKK0FuZHJvaWQuYnAaBTEyMzQ1CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKK0FuZHJvaWQuYnAaBTEyMzQ2CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLW9uZRIKK0FuZHJvaWQuYnAaBTEyMzQ1CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKK0Fxd2VydHkuYnAaBTEyMzQ2CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKK0Fwb2l1eXQuYnAaBTEyMzQ2CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKK0Fwb2l1eXQuYnAaBTEyMzQ2CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKK0Fwb2l1eXQuYnAaBTEyMzQ2CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKK0Fwb2l1eXQuYnAaBTEyMzQ2CmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlMy50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiZWVkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUzLnR4dApAQCAtMCwwICsxLDEzIEBACisKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtb25lEgorQW5kcm9pZC5icBoFMTIzNDUKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgorQW5kcm9pZC5icBoFMTIzNDUKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgorQXNkZmdoai5icBoFMTIzNDUKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgorQXp4Y3Zibi5icBoFMTIzNDUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU0LnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTc1OTAwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTQudHh0CkBAIC0wLDAgKzEsMjUgQEAKKworLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCitBbmRyb2lkLmJwGgUxMjM0NQorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCitBbmRyb2lkLmJwGgUxMjM0NgorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCitBbmRyb2lkLmJwGgUxMjM0NgorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCitBcXdlcnR5LmJwGgUxMjM0NgorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCitBcG9pdXl0LmJwGgUxMjM0NgorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCitBcG9pdXl0LmJwGgUxMjM0NgorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCitBcG9pdXl0LmJwGgUxMjM0NgorLgorGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCitBcG9pdXl0LmJwGgUxMjM0NgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTUudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZGUwNjQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlNS50eHQKQEAgLTAsMCArMSw0IEBACisKKyAKKwNmb28SCitBbmRyb2lkLmJwGgUxMjM0NSIGYS5qYXZhCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlNi50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3Y2RjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU2LnR4dApAQCAtMCwwICsxLDQgQEAKKworIAorA2JhchIKK0FuZHJvaWQuYnAaBTEyMzQ2IgZiLmphdmEKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU3LnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGRlMDY0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTcudHh0CkBAIC0wLDAgKzEsNCBAQAorCisgCisDZm9vEgorQW5kcm9pZC5icBoFMTIzNDUiBmEuamF2YQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTgudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzE2OTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9maWxlOC50eHQKQEAgLTAsMCArMSw0IEBACisKKyAKKwNmb28SCitBbmRyb2lkLmdwGgUxMjM0NiIGYS5qYXZhCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRDb2RlTWV0YWRhdGFPdXRwdXQudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkQ29kZU1ldGFkYXRhT3V0cHV0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTVjZjQwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkQ29kZU1ldGFkYXRhT3V0cHV0LnR4dApAQCAtMCwwICsxLDcgQEAKKworIAorA2JhchIKK0FuZHJvaWQuYnAaBTEyMzQ2IgZiLmphdmEKKyAKKwNmb28SCitBbmRyb2lkLmJwGgUxMjM0NSIGYS5qYXZhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkQ29kZU1ldGFkYXRhT3V0cHV0RmlsZS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRDb2RlTWV0YWRhdGFPdXRwdXRGaWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTVjZjQwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkQ29kZU1ldGFkYXRhT3V0cHV0RmlsZS50eHQKQEAgLTAsMCArMSw3IEBACisKKyAKKwNiYXISCitBbmRyb2lkLmJwGgUxMjM0NiIGYi5qYXZhCisgCisDZm9vEgorQW5kcm9pZC5icBoFMTIzNDUiBmEuamF2YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2dlbmVyYXRlZEVtcHR5T3V0cHV0RmlsZS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRFbXB0eU91dHB1dEZpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRFbXB0eU91dHB1dEZpbGUudHh0CmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRPdXRwdXRGaWxlLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2dlbmVyYXRlZE91dHB1dEZpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDM4MmYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRPdXRwdXRGaWxlLnR4dApAQCAtMCwwICsxLDIyIEBACisKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtb25lEgorQW5kcm9pZC5icBoFMTIzNDUKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgorQW5kcm9pZC5icBoFMTIzNDYKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgorQXF3ZXJ0eS5icBoFMTIzNDYKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgorQXBvaXV5dC5icBoFMTIzNDYKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgorQW5kcm9pZC5icBoFMTIzNDUKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgorQXNkZmdoai5icBoFMTIzNDUKKy4KKxlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgorQXp4Y3Zibi5icBoFMTIzNDUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dENvZGVNZXRhZGF0YS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dENvZGVNZXRhZGF0YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4MWI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0Q29kZU1ldGFkYXRhLnR4dApAQCAtMCwwICsxIEBACitmaWxlNS50eHQgZmlsZTYudHh0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvaW5wdXRDb2RlTWV0YWRhdGFOZWdhdGl2ZS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dENvZGVNZXRhZGF0YU5lZ2F0aXZlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjY2OGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvaW5wdXRDb2RlTWV0YWRhdGFOZWdhdGl2ZS50eHQKQEAgLTAsMCArMSBAQAorZmlsZTcudHh0IGZpbGU4LnR4dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0RmlsZXMudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvaW5wdXRGaWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0YmM5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0RmlsZXMudHh0CkBAIC0wLDAgKzEgQEAKK2ZpbGUxLnR4dCBmaWxlMi50eHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dEZpbGVzTmVnYXRpdmVDYXNlLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0RmlsZXNOZWdhdGl2ZUNhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzN2FhM2YKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dEZpbGVzTmVnYXRpdmVDYXNlLnR4dApAQCAtMCwwICsxIEBACitmaWxlMy50eHQgZmlsZTQudHh0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvbWV0YWRhdGFfdGVzdC5nbyBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL21ldGFkYXRhX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0YWRkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL21ldGFkYXRhX3Rlc3QuZ28KQEAgLTAsMCArMSwxMTkgQEAKK3BhY2thZ2UgbWFpbgorCitpbXBvcnQgKAorCSJmbXQiCisJImlvL2lvdXRpbCIKKwkib3MvZXhlYyIKKwkic3RyaW5ncyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0TWV0YWRhdGEodCAqdGVzdGluZy5UKSB7CisJY21kIDo9IGV4ZWMuQ29tbWFuZCgKKwkJIm1ldGFkYXRhIiwgIi1ydWxlIiwgInRlc3Rfc3BlYyIsICItaW5wdXRGaWxlIiwgIi4vaW5wdXRGaWxlcy50eHQiLCAiLW91dHB1dEZpbGUiLAorCQkiLi9nZW5lcmF0ZWRPdXRwdXRGaWxlLnR4dCIsCisJKQorCXN0ZGVyciwgZXJyIDo9IGNtZC5Db21iaW5lZE91dHB1dCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJFcnJvciBydW5uaW5nIG1ldGFkYXRhIGNvbW1hbmQ6ICVzLiBFcnJvcjogJXYiLCBzdGRlcnIsIGVycikKKwl9CisKKwkvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgZXhwZWN0ZWQgb3V0cHV0IGZpbGUKKwlleHBlY3RlZE91dHB1dCwgZXJyIDo9IGlvdXRpbC5SZWFkRmlsZSgiLi9leHBlY3RlZE91dHB1dEZpbGUudHh0IikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkVycm9yIHJlYWRpbmcgZXhwZWN0ZWQgb3V0cHV0IGZpbGU6ICVzIiwgZXJyKQorCX0KKworCS8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGZpbGUKKwlnZW5lcmF0ZWRPdXRwdXQsIGVyciA6PSBpb3V0aWwuUmVhZEZpbGUoIi4vZ2VuZXJhdGVkT3V0cHV0RmlsZS50eHQiKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRXJyb3IgcmVhZGluZyBnZW5lcmF0ZWQgb3V0cHV0IGZpbGU6ICVzIiwgZXJyKQorCX0KKworCWZtdC5QcmludGxuKCkKKworCS8vIENvbXBhcmUgdGhlIGNvbnRlbnRzCisJaWYgc3RyaW5nKGV4cGVjdGVkT3V0cHV0KSAhPSBzdHJpbmcoZ2VuZXJhdGVkT3V0cHV0KSB7CisJCXQuRXJyb3JmKCJHZW5lcmF0ZWQgZmlsZSBjb250ZW50cyBkbyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG91dHB1dCIpCisJfQorfQorCitmdW5jIFRlc3RNZXRhZGF0YU5lZ2F0aXZlQ2FzZSh0ICp0ZXN0aW5nLlQpIHsKKwljbWQgOj0gZXhlYy5Db21tYW5kKAorCQkibWV0YWRhdGEiLCAiLXJ1bGUiLCAidGVzdF9zcGVjIiwgIi1pbnB1dEZpbGUiLCAiLi9pbnB1dEZpbGVzTmVnYXRpdmVDYXNlLnR4dCIsICItb3V0cHV0RmlsZSIsCisJCSIuL2dlbmVyYXRlZE91dHB1dEZpbGVOZWdhdGl2ZUNhc2UudHh0IiwKKwkpCisJc3RkZXJyLCBlcnIgOj0gY21kLkNvbWJpbmVkT3V0cHV0KCkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbGYoCisJCQkiRXhwZWN0ZWQgYW4gZXJyb3IsIGJ1dCB0aGUgbWV0YWRhdGEgY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHkuIE91dHB1dDogJXMiLAorCQkJc3RkZXJyLAorCQkpCisJfQorCisJZXhwZWN0ZWRFcnJvciA6PSAiQ29uZmxpY3RpbmcgdHJlbmR5IHRlYW0gSURzIGZvdW5kIGZvciBqYXZhLXRlc3QtbW9kdWxlIiArCisJCSItbmFtZS1vbmUgYXQ6XG5BbmRyb2lkLmJwIHdpdGggdGVhbUlkOiAxMjM0NiwiICsKKwkJIlxuQW5kcm9pZC5icCB3aXRoIHRlYW1JZDogMTIzNDUiCisJaWYgIXN0cmluZ3MuQ29udGFpbnMoCisJCXN0cmluZ3MuVHJpbVNwYWNlKHN0cmluZyhzdGRlcnIpKSwgc3RyaW5ncy5UcmltU3BhY2UoZXhwZWN0ZWRFcnJvciksCisJKSB7CisJCXQuRXJyb3JmKAorCQkJIlVuZXhwZWN0ZWQgZXJyb3IgbWVzc2FnZS4gRXhwZWN0ZWQgdG8gY29udGFpbjogJXMsIEdvdDogJXMiLAorCQkJZXhwZWN0ZWRFcnJvciwgc3RkZXJyLAorCQkpCisJfQorfQorCitmdW5jIFRlc3RFbXB0eUlucHV0RmlsZSh0ICp0ZXN0aW5nLlQpIHsKKwljbWQgOj0gZXhlYy5Db21tYW5kKAorCQkibWV0YWRhdGEiLCAiLXJ1bGUiLCAidGVzdF9zcGVjIiwgIi1pbnB1dEZpbGUiLCAiLi9lbXB0eUlucHV0RmlsZS50eHQiLCAiLW91dHB1dEZpbGUiLAorCQkiLi9nZW5lcmF0ZWRFbXB0eU91dHB1dEZpbGUudHh0IiwKKwkpCisJc3RkZXJyLCBlcnIgOj0gY21kLkNvbWJpbmVkT3V0cHV0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkVycm9yIHJ1bm5pbmcgbWV0YWRhdGEgY29tbWFuZDogJXMuIEVycm9yOiAldiIsIHN0ZGVyciwgZXJyKQorCX0KKworCS8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGZpbGUKKwlnZW5lcmF0ZWRPdXRwdXQsIGVyciA6PSBpb3V0aWwuUmVhZEZpbGUoIi4vZ2VuZXJhdGVkRW1wdHlPdXRwdXRGaWxlLnR4dCIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJFcnJvciByZWFkaW5nIGdlbmVyYXRlZCBvdXRwdXQgZmlsZTogJXMiLCBlcnIpCisJfQorCisJZm10LlByaW50bG4oKQorCisJLy8gQ29tcGFyZSB0aGUgY29udGVudHMKKwlpZiBzdHJpbmcoZ2VuZXJhdGVkT3V0cHV0KSAhPSAiXG4iIHsKKwkJdC5FcnJvcmYoIkdlbmVyYXRlZCBmaWxlIGNvbnRlbnRzIGRvIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgb3V0cHV0IikKKwl9Cit9CisKK2Z1bmMgVGVzdENvZGVNZXRhZGF0YSh0ICp0ZXN0aW5nLlQpIHsKKwljbWQgOj0gZXhlYy5Db21tYW5kKAorCQkibWV0YWRhdGEiLCAiLXJ1bGUiLCAiY29kZV9tZXRhZGF0YSIsICItaW5wdXRGaWxlIiwgIi4vaW5wdXRDb2RlTWV0YWRhdGEudHh0IiwgIi1vdXRwdXRGaWxlIiwKKwkJIi4vZ2VuZXJhdGVkQ29kZU1ldGFkYXRhT3V0cHV0RmlsZS50eHQiLAorCSkKKwlzdGRlcnIsIGVyciA6PSBjbWQuQ29tYmluZWRPdXRwdXQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRXJyb3IgcnVubmluZyBtZXRhZGF0YSBjb21tYW5kOiAlcy4gRXJyb3I6ICV2Iiwgc3RkZXJyLCBlcnIpCisJfQorCisJLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGV4cGVjdGVkIG91dHB1dCBmaWxlCisJZXhwZWN0ZWRPdXRwdXQsIGVyciA6PSBpb3V0aWwuUmVhZEZpbGUoIi4vZXhwZWN0ZWRDb2RlTWV0YWRhdGFPdXRwdXQudHh0IikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkVycm9yIHJlYWRpbmcgZXhwZWN0ZWQgb3V0cHV0IGZpbGU6ICVzIiwgZXJyKQorCX0KKworCS8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGZpbGUKKwlnZW5lcmF0ZWRPdXRwdXQsIGVyciA6PSBpb3V0aWwuUmVhZEZpbGUoIi4vZ2VuZXJhdGVkQ29kZU1ldGFkYXRhT3V0cHV0RmlsZS50eHQiKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRXJyb3IgcmVhZGluZyBnZW5lcmF0ZWQgb3V0cHV0IGZpbGU6ICVzIiwgZXJyKQorCX0KKworCWZtdC5QcmludGxuKCkKKworCS8vIENvbXBhcmUgdGhlIGNvbnRlbnRzCisJaWYgc3RyaW5nKGV4cGVjdGVkT3V0cHV0KSAhPSBzdHJpbmcoZ2VuZXJhdGVkT3V0cHV0KSB7CisJCXQuRXJyb3JmKCJHZW5lcmF0ZWQgZmlsZSBjb250ZW50cyBkbyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG91dHB1dCIpCisJfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvb3V0cHV0RmlsZS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9vdXRwdXRGaWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQzODJmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvb3V0cHV0RmlsZS50eHQKQEAgLTAsMCArMSwyMiBAQAorCisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLW9uZRIKK0FuZHJvaWQuYnAaBTEyMzQ1CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKK0FuZHJvaWQuYnAaBTEyMzQ2CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKK0Fxd2VydHkuYnAaBTEyMzQ2CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKK0Fwb2l1eXQuYnAaBTEyMzQ2CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXR3bxIKK0FuZHJvaWQuYnAaBTEyMzQ1CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXR3bxIKK0FzZGZnaGouYnAaBTEyMzQ1CisuCisZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXR3bxIKK0F6eGN2Ym4uYnAaBTEyMzQ1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaG1hcmtzIGIvdG9vbHMvcGVyZi9iZW5jaG1hcmtzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5OThlY2QKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2JlbmNobWFya3MKQEAgLTAsMCArMSw4MTEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBzeXMKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgPSBUcnVlCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGRhdGFjbGFzc2VzCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgcmUKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdGltZQoraW1wb3J0IHV1aWQKK2Zyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAorCitpbXBvcnQgcHJldHR5CitpbXBvcnQgdXRpbHMKKworCitjbGFzcyBGYXRhbEVycm9yKEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKworY2xhc3MgT3B0aW9uc0Vycm9yKEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisKKworQGRhdGFjbGFzc2VzLmRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIEx1bmNoOgorICAgICJMdW5jaCBjb21iaW5hdGlvbiIKKworICAgIHRhcmdldF9wcm9kdWN0OiBzdHIKKyAgICAiVEFSR0VUX1BST0RVQ1QiCisKKyAgICB0YXJnZXRfcmVsZWFzZTogc3RyCisgICAgIlRBUkdFVF9SRUxFQVNFIgorCisgICAgdGFyZ2V0X2J1aWxkX3ZhcmlhbnQ6IHN0cgorICAgICJUQVJHRVRfQlVJTERfVkFSSUFOVCIKKworICAgIGRlZiBUb0RpY3Qoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAiVEFSR0VUX1BST0RVQ1QiOiBzZWxmLnRhcmdldF9wcm9kdWN0LAorICAgICAgICAgICAgIlRBUkdFVF9SRUxFQVNFIjogc2VsZi50YXJnZXRfcmVsZWFzZSwKKyAgICAgICAgICAgICJUQVJHRVRfQlVJTERfVkFSSUFOVCI6IHNlbGYudGFyZ2V0X2J1aWxkX3ZhcmlhbnQsCisgICAgICAgIH0KKworICAgIGRlZiBDb21iaW5lKHNlbGYpOgorICAgICAgICByZXR1cm4gZiJ7c2VsZi50YXJnZXRfcHJvZHVjdH0te3NlbGYudGFyZ2V0X3JlbGVhc2V9LXtzZWxmLnRhcmdldF9idWlsZF92YXJpYW50fSIKKworCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzKGZyb3plbj1UcnVlKQorY2xhc3MgQ2hhbmdlOgorICAgICJBIGNoYW5nZSB0aGF0IHdlIG1ha2UgdG8gdGhlIHRyZWUsIGFuZCBob3cgdG8gdW5kbyBpdCIKKyAgICBsYWJlbDogc3RyCisgICAgIlN0cmluZyB0byBwcmludCBpbiB0aGUgbG9nIHdoZW4gdGhlIGNoYW5nZSBpcyBtYWRlIgorCisgICAgY2hhbmdlOiBjYWxsYWJsZQorICAgICJGdW5jdGlvbiB0byBjaGFuZ2UgdGhlIHNvdXJjZSB0cmVlIgorCisgICAgdW5kbzogY2FsbGFibGUKKyAgICAiRnVuY3Rpb24gdG8gcmV2ZXJ0IHRoZSBzb3VyY2UgdHJlZSB0byBpdHMgcHJldmlvdXMgY29uZGl0aW9uIGluIHRoZSBtb3N0IG1pbmltYWwgd2F5IHBvc3NpYmxlLiIKKworX0RVTVBWQVJTX1ZBUlM9WworICAgICJDT01NT05fTFVOQ0hfQ0hPSUNFUyIsCisgICAgIkhPU1RfUFJFQlVJTFRfVEFHIiwKKyAgICAicHJpbnQiLAorICAgICJQUk9EVUNUX09VVCIsCisgICAgInJlcG9ydF9jb25maWciLAorICAgICJUQVJHRVRfQVJDSCIsCisgICAgIlRBUkdFVF9CVUlMRF9WQVJJQU5UIiwKKyAgICAiVEFSR0VUX0RFVklDRSIsCisgICAgIlRBUkdFVF9QUk9EVUNUIiwKK10KKworX0RVTVBWQVJTX0FCU19WQVJTID1bCisgICAgIkFORFJPSURfQ0xBTkdfUFJFQlVJTFRTIiwKKyAgICAiQU5EUk9JRF9KQVZBX0hPTUUiLAorICAgICJBTkRST0lEX0pBVkFfVE9PTENIQUlOIiwKKyAgICAiQU5EUk9JRF9QUkVCVUlMVFMiLAorICAgICJIT1NUX09VVCIsCisgICAgIkhPU1RfT1VUX0VYRUNVVEFCTEVTIiwKKyAgICAiSE9TVF9PVVRfVEVTVENBU0VTIiwKKyAgICAiT1VUX0RJUiIsCisgICAgInByaW50IiwKKyAgICAiUFJPRFVDVF9PVVQiLAorICAgICJTT09OR19IT1NUX09VVCIsCisgICAgIlNPT05HX0hPU1RfT1VUX0VYRUNVVEFCTEVTIiwKKyAgICAiVEFSR0VUX09VVF9URVNUQ0FTRVMiLAorXQorCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzKGZyb3plbj1UcnVlKQorY2xhc3MgQmVuY2htYXJrOgorICAgICJTb21ldGhpbmcgd2UgbWVhc3VyZSIKKworICAgIGlkOiBzdHIKKyAgICAiU2hvcnQgSUQgZm9yIHRoZSBiZW5jaG1hcmssIGZvciB0aGUgY29tbWFuZCBsaW5lIgorCisgICAgdGl0bGU6IHN0cgorICAgICJUaXRsZSBmb3IgcmVwb3J0cyIKKworICAgIGNoYW5nZTogQ2hhbmdlCisgICAgIlNvdXJjZSB0cmVlIG1vZGlmaWNhdGlvbiBmb3IgdGhlIGJlbmNobWFyayB0aGF0IHdpbGwgYmUgbWVhc3VyZWQiCisKKyAgICBkdW1wdmFyczogT3B0aW9uYWxbYm9vbF0gPSBGYWxzZQorICAgICJJZiBzcGVjaWZpZWQsIHNvb25nIHdpbGwgcnVuIGluIGR1bXB2YXJzIG1vZGUgcmF0aGVyIHRoYW4gYnVpbGQtbW9kZS4iCisKKyAgICBtb2R1bGVzOiBPcHRpb25hbFtsaXN0W3N0cl1dID0gTm9uZQorICAgICJCdWlsZCBtb2R1bGVzIHRvIGJ1aWxkIG9uIHNvb25nIGNvbW1hbmQgbGluZSIKKworICAgIHByZXJvbGw6IE9wdGlvbmFsW2ludF0gPSAwCisgICAgIk51bWJlciBvZiB0aW1lcyB0byBydW4gdGhlIGJ1aWxkIGNvbW1hbmQgdG8gc3RhYmlsaXplIgorCisgICAgcG9zdHJvbGw6IE9wdGlvbmFsW2ludF0gPSAzCisgICAgIk51bWJlciBvZiB0aW1lcyB0byBydW4gdGhlIGJ1aWxkIGNvbW1hbmQgYWZ0ZXIgcmV2ZXJ0aW5nIHRoZSBhY3Rpb24gdG8gc3RhYmlsaXplIgorCisgICAgZGVmIGJ1aWxkX2Rlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgIlNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBiZW5jaG1hcmsncyBTb29uZyBpbnZvY2F0aW9uLiIKKyAgICAgIGlmIHNlbGYuZHVtcHZhcnM6CisgICAgICAgIHJldHVybiAiZHVtcHZhcnMiCisgICAgICBlbGlmIHNlbGYubW9kdWxlczoKKyAgICAgICAgcmV0dXJuICIgIi5qb2luKHNlbGYubW9kdWxlcykKKyAgICAgIHJldHVybiAiIgorCisKKyAgICBkZWYgc29vbmdfY29tbWFuZChzZWxmLCByb290KToKKyAgICAgICJDb21tYW5kIGxpbmUgYXJncyB0byBzb29uZ191aSBmb3IgdGhpcyBiZW5jaG1hcmsuIgorICAgICAgaWYgc2VsZi5kdW1wdmFyczoKKyAgICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAiLS1kdW1wdmFycy1tb2RlIiwKKyAgICAgICAgICAgICAgZiItLXZhcnM9XCJ7JyAnLmpvaW4oX0RVTVBWQVJTX1ZBUlMpfVwiIiwKKyAgICAgICAgICAgICAgZiItLWFicy12YXJzPVwieycgJy5qb2luKF9EVU1QVkFSU19BQlNfVkFSUyl9XCIiLAorICAgICAgICAgICAgICAiLS12YXItcHJlZml4PXZhcl9jYWNoZV8iLAorICAgICAgICAgICAgICAiLS1hYnMtdmFyLXByZWZpeD1hYnNfdmFyX2NhY2hlXyIsCisgICAgICAgICAgXQorICAgICAgZWxpZiBzZWxmLm1vZHVsZXM6CisgICAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgIi0tYnVpbGQtbW9kZSIsCisgICAgICAgICAgICAgICItLWFsbC1tb2R1bGVzIiwKKyAgICAgICAgICAgICAgZiItLWRpcj17cm9vdH0iLAorICAgICAgICAgICAgICAiLS1za2lwLW1ldHJpY3MtdXBsb2FkIiwKKyAgICAgICAgICBdICsgc2VsZi5tb2R1bGVzCisgICAgICBlbHNlOgorICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQmVuY2htYXJrIG11c3Qgc3BlY2lmeSBkdW1wdmFycyBvciBtb2R1bGVzIikKKworCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzKGZyb3plbj1UcnVlKQorY2xhc3MgRmlsZVNuYXBzaG90OgorICAgICJTbmFwc2hvdCBvZiBhIGZpbGUncyBjb250ZW50cy4iCisKKyAgICBmaWxlbmFtZTogc3RyCisgICAgIlRoZSBmaWxlIHRoYXQgd2FzIHNuYXBzaG90dGVuZWQiCisKKyAgICBjb250ZW50czogc3RyCisgICAgIlRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSIKKworICAgIGRlZiB3cml0ZShzZWxmKToKKyAgICAgICAgIldyaXRlIHRoZSBjb250ZW50cyBiYWNrIHRvIHRoZSBmaWxlIgorICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlbmFtZSwgInciKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShzZWxmLmNvbnRlbnRzKQorCisKK2RlZiBTbmFwc2hvdChmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIGEgRmlsZVNuYXBzaG90IHdpdGggdGhlIGZpbGUncyBjdXJyZW50IGNvbnRlbnRzLiIiIgorICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZjoKKyAgICAgICAgY29udGVudHMgPSBmLnJlYWQoKQorICAgIHJldHVybiBGaWxlU25hcHNob3QoZmlsZW5hbWUsIGNvbnRlbnRzKQorCisKK2RlZiBDbGVhbigpOgorICAgICIiIlJlbW92ZSB0aGUgb3V0IGRpcmVjdG9yeS4iIiIKKyAgICBkZWYgcmVtb3ZlX291dCgpOgorICAgICAgICBvdXRfZGlyID0gdXRpbHMuZ2V0X291dF9kaXIoKQorICAgICAgICAjb25seSByZW1vdmUgYWN0dWFsIGNvbnRlbnRzLCBpbiBjYXNlIG91dCBpcyBhIHN5bWxpbmsgKGFzIGlzIHRoZSBjYXNlIGZvciBjb2cpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG91dF9kaXIpOgorICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKG91dF9kaXIpOgorICAgICAgICAgICAgICBwID0gb3MucGF0aC5qb2luKG91dF9kaXIsIGZpbGVuYW1lKQorICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwKSBvciBvcy5wYXRoLmlzbGluayhwKToKKyAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwKQorICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIocCk6CisgICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHApCisgICAgcmV0dXJuIENoYW5nZShsYWJlbD0iUmVtb3ZlIG91dCIsIGNoYW5nZT1yZW1vdmVfb3V0LCB1bmRvPWxhbWJkYTogTm9uZSkKKworCitkZWYgTm9DaGFuZ2UoKToKKyAgICAiIiJObyBjaGFuZ2UgdG8gdGhlIHNvdXJjZSB0cmVlLiIiIgorICAgIHJldHVybiBDaGFuZ2UobGFiZWw9Ik5vIGNoYW5nZSIsIGNoYW5nZT1sYW1iZGE6IE5vbmUsIHVuZG89bGFtYmRhOiBOb25lKQorCisKK2RlZiBDcmVhdGUoZmlsZW5hbWUpOgorICAgICJDcmVhdGUgYW4gYWN0aW9uIHRvIGNyZWF0ZSBgZmlsZW5hbWVgLiBUaGUgcGFyZW50IGRpcmVjdG9yeSBtdXN0IGV4aXN0LiIKKyAgICBkZWYgY3JlYXRlKCk6CisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInciKSBhcyBmOgorICAgICAgICAgICAgcGFzcworICAgIGRlZiBkZWxldGUoKToKKyAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQorICAgIHJldHVybiBDaGFuZ2UoCisgICAgICAgICAgICAgICAgbGFiZWw9ZiJDcmVhdGUge2ZpbGVuYW1lfSIsCisgICAgICAgICAgICAgICAgY2hhbmdlPWNyZWF0ZSwKKyAgICAgICAgICAgICAgICB1bmRvPWRlbGV0ZSwKKyAgICAgICAgICAgICkKKworCitkZWYgTW9kaWZ5KGZpbGVuYW1lLCBjb250ZW50cywgYmVmb3JlPU5vbmUpOgorICAgICIiIkNyZWF0ZSBhbiBhY3Rpb24gdG8gbW9kaWZ5IGBmaWxlbmFtZWAgYnkgYXBwZW5kaW5nIHRoZSByZXN1bHQgb2YgYGNvbnRlbnRzYAorICAgIGJlZm9yZSB0aGUgbGFzdCBpbnN0YW5jZXMgb2YgYGJlZm9yZWAgaW4gdGhlIGZpbGUuCisKKyAgICBSYWlzZXMgYW4gZXJyb3IgaWYgYGJlZm9yZWAgZG9lc24ndCBhcHBlYXIgaW4gdGhlIGZpbGUuCisgICAgIiIiCisgICAgb3JpZyA9IFNuYXBzaG90KGZpbGVuYW1lKQorICAgIGlmIGJlZm9yZToKKyAgICAgICAgaW5kZXggPSBvcmlnLmNvbnRlbnRzLnJmaW5kKGJlZm9yZSkKKyAgICAgICAgaWYgaW5kZXggPCAwOgorICAgICAgICAgICAgcmVwb3J0X2Vycm9yKGYie2ZpbGVuYW1lfTogVW5hYmxlIHRvIGZpbmQgc3RyaW5nICd7YmVmb3JlfScgZm9yIG1vZGlmeSBvcGVyYXRpb24uIikKKyAgICAgICAgICAgIHJhaXNlIEZhdGFsRXJyb3IoKQorICAgIGVsc2U6CisgICAgICAgIGluZGV4ID0gbGVuKG9yaWcuY29udGVudHMpCisgICAgbW9kaWZpZWQgPSBGaWxlU25hcHNob3QoZmlsZW5hbWUsIG9yaWcuY29udGVudHNbOmluZGV4XSArIGNvbnRlbnRzKCkgKyBvcmlnLmNvbnRlbnRzW2luZGV4Ol0pCisgICAgaWYgRmFsc2U6CisgICAgICAgIHByaW50KGYiTW9kaWZ5OiB7ZmlsZW5hbWV9IikKKyAgICAgICAgeCA9IG9yaWcuY29udGVudHMucmVwbGFjZSgiXG4iLCAiXG4gICBPUklHIikKKyAgICAgICAgcHJpbnQoZiIgICBPUklHIHt4fSIpCisgICAgICAgIHggPSBtb2RpZmllZC5jb250ZW50cy5yZXBsYWNlKCJcbiIsICJcbiAgIE1PRElGSUVEIikKKyAgICAgICAgcHJpbnQoZiIgICBNT0RJRklFRCB7eH0iKQorCisgICAgcmV0dXJuIENoYW5nZSgKKyAgICAgICAgICAgIGxhYmVsPSJNb2RpZnkgIiArIGZpbGVuYW1lLAorICAgICAgICAgICAgY2hhbmdlPWxhbWJkYTogbW9kaWZpZWQud3JpdGUoKSwKKyAgICAgICAgICAgIHVuZG89bGFtYmRhOiBvcmlnLndyaXRlKCkKKyAgICAgICAgKQorCitkZWYgQ2hhbmdlUHVibGljQXBpKCk6CisgICAgY2hhbmdlID0gQWRkSmF2YUZpZWxkKCJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSIsCisgICAgICAgICAgICAgICAgICJAYW5kcm9pZC5hbm5vdGF0aW9uLlN1cHByZXNzTGludChcIlVuZmxhZ2dlZEFwaVwiKSBwdWJsaWMiKQorICAgIG9yaWdfY3VycmVudF90ZXh0ID0gU25hcHNob3QoImZyYW1ld29ya3MvYmFzZS9jb3JlL2FwaS9jdXJyZW50LnR4dCIpCisKKyAgICBkZWYgdW5kbygpOgorICAgICAgICBjaGFuZ2UudW5kbygpCisgICAgICAgIG9yaWdfY3VycmVudF90ZXh0LndyaXRlKCkKKworICAgIHJldHVybiBDaGFuZ2UoCisgICAgICAgIGxhYmVsPWNoYW5nZS5sYWJlbCwKKyAgICAgICAgY2hhbmdlPWNoYW5nZS5jaGFuZ2UsCisgICAgICAgIHVuZG89bGFtYmRhOiB1bmRvKCkKKyAgICApCisKK2RlZiBBZGRKYXZhRmllbGQoZmlsZW5hbWUsIHByZWZpeCk6CisgICAgcmV0dXJuIE1vZGlmeShmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIGxhbWJkYTogZiJ7cHJlZml4fSBzdGF0aWMgZmluYWwgaW50IEJFTkNITUFSSyA9IHtyYW5kb20ucmFuZGludCgwLCAxMDAwMDAwKX07XG4iLAorICAgICAgICAgICAgICAgICAgYmVmb3JlPSJ9IikKKworCitkZWYgQ29tbWVudChwcmVmaXgsIHN1ZmZpeD0iIik6CisgICAgcmV0dXJuIGxhbWJkYTogcHJlZml4ICsgIiAiICsgc3RyKHV1aWQudXVpZDQoKSkgKyBzdWZmaXgKKworCitjbGFzcyBCZW5jaG1hcmtSZXBvcnQoKToKKyAgICAiSW5mb3JtYXRpb24gYWJvdXQgYSBydW4gb2YgdGhlIGJlbmNobWFyayIKKworICAgIGx1bmNoOiBMdW5jaAorICAgICJsdW5jaCBjb21ibyIKKworICAgIGJlbmNobWFyazogQmVuY2htYXJrCisgICAgIlRoZSBiZW5jaG1hcmsgb2JqZWN0LiIKKworICAgIGl0ZXJhdGlvbjogaW50CisgICAgIldoaWNoIGl0ZXJhdGlvbiBvZiB0aGUgYmVuY2htYXJrIgorCisgICAgbG9nX2Rpcjogc3RyCisgICAgIlBhdGggdGhlIHRoZSBsb2cgZGlyZWN0b3J5LCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgcmVwb3J0cyBkaXJlY3RvcnkiCisKKyAgICBwcmVyb2xsX2R1cmF0aW9uX25zOiBbaW50XQorICAgICJEdXJhdGlvbnMgb2YgdGhlIGluIG5hbm9zZWNvbmRzLiIKKworICAgIGR1cmF0aW9uX25zOiBpbnQKKyAgICAiRHVyYXRpb24gb2YgdGhlIG1lYXN1cmVkIHBvcnRpb24gb2YgdGhlIGJlbmNobWFyayBpbiBuYW5vc2Vjb25kcy4iCisKKyAgICBwb3N0cm9sbF9kdXJhdGlvbl9uczogW2ludF0KKyAgICAiRHVyYXRpb25zIG9mIHRoZSBwb3N0cm9sbHMgaW4gbmFub3NlY29uZHMuIgorCisgICAgY29tcGxldGU6IGJvb2wKKyAgICAiV2hldGhlciB0aGUgYmVuY2htYXJrIG1hZGUgaXQgYWxsIHRoZSB3YXkgdGhyb3VnaCB0aGUgcG9zdHJvbGxzLiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsdW5jaCwgYmVuY2htYXJrLCBpdGVyYXRpb24sIGxvZ19kaXIpOgorICAgICAgICBzZWxmLmx1bmNoID0gbHVuY2gKKyAgICAgICAgc2VsZi5iZW5jaG1hcmsgPSBiZW5jaG1hcmsKKyAgICAgICAgc2VsZi5pdGVyYXRpb24gPSBpdGVyYXRpb24KKyAgICAgICAgc2VsZi5sb2dfZGlyID0gbG9nX2RpcgorICAgICAgICBzZWxmLnByZXJvbGxfZHVyYXRpb25fbnMgPSBbXQorICAgICAgICBzZWxmLmR1cmF0aW9uX25zID0gLTEKKyAgICAgICAgc2VsZi5wb3N0cm9sbF9kdXJhdGlvbl9ucyA9IFtdCisgICAgICAgIHNlbGYuY29tcGxldGUgPSBGYWxzZQorCisgICAgZGVmIFRvRGljdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICJsdW5jaCI6IHNlbGYubHVuY2guVG9EaWN0KCksCisgICAgICAgICAgICAiaWQiOiBzZWxmLmJlbmNobWFyay5pZCwKKyAgICAgICAgICAgICJ0aXRsZSI6IHNlbGYuYmVuY2htYXJrLnRpdGxlLAorICAgICAgICAgICAgIm1vZHVsZXMiOiBzZWxmLmJlbmNobWFyay5tb2R1bGVzLAorICAgICAgICAgICAgImR1bXB2YXJzIjogc2VsZi5iZW5jaG1hcmsuZHVtcHZhcnMsCisgICAgICAgICAgICAiY2hhbmdlIjogc2VsZi5iZW5jaG1hcmsuY2hhbmdlLmxhYmVsLAorICAgICAgICAgICAgIml0ZXJhdGlvbiI6IHNlbGYuaXRlcmF0aW9uLAorICAgICAgICAgICAgImxvZ19kaXIiOiBzZWxmLmxvZ19kaXIsCisgICAgICAgICAgICAicHJlcm9sbF9kdXJhdGlvbl9ucyI6IHNlbGYucHJlcm9sbF9kdXJhdGlvbl9ucywKKyAgICAgICAgICAgICJkdXJhdGlvbl9ucyI6IHNlbGYuZHVyYXRpb25fbnMsCisgICAgICAgICAgICAicG9zdHJvbGxfZHVyYXRpb25fbnMiOiBzZWxmLnBvc3Ryb2xsX2R1cmF0aW9uX25zLAorICAgICAgICAgICAgImNvbXBsZXRlIjogc2VsZi5jb21wbGV0ZSwKKyAgICAgICAgfQorCitjbGFzcyBSdW5uZXIoKToKKyAgICAiIiJSdW5zIHRoZSBiZW5jaG1hcmtzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMpOgorICAgICAgICBzZWxmLl9vcHRpb25zID0gb3B0aW9ucworICAgICAgICBzZWxmLl9yZXBvcnRzID0gW10KKyAgICAgICAgc2VsZi5fY29tcGxldGUgPSBGYWxzZQorCisgICAgZGVmIFJ1bihzZWxmKToKKyAgICAgICAgIiIiUnVuIGFsbCBvZiB0aGUgdXNlci1zZWxlY3RlZCBiZW5jaG1hcmtzLiIiIgorICAgICAgICAjIENsZWFuIG91dCB0aGUgbG9nIGRpciBvciBjcmVhdGUgaXQgaWYgbmVjZXNzYXJ5CisgICAgICAgIHByZXBhcmVfbG9nX2RpcihzZWxmLl9vcHRpb25zLkxvZ0RpcigpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBsdW5jaCBpbiBzZWxmLl9vcHRpb25zLkx1bmNoZXMoKToKKyAgICAgICAgICAgICAgICBwcmludChsdW5jaCkKKyAgICAgICAgICAgICAgICBmb3IgYmVuY2htYXJrIGluIHNlbGYuX29wdGlvbnMuQmVuY2htYXJrcygpOgorICAgICAgICAgICAgICAgICAgICBmb3IgaXRlcmF0aW9uIGluIHJhbmdlKHNlbGYuX29wdGlvbnMuSXRlcmF0aW9ucygpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3J1bl9iZW5jaG1hcmsobHVuY2gsIGJlbmNobWFyaywgaXRlcmF0aW9uKQorICAgICAgICAgICAgc2VsZi5fY29tcGxldGUgPSBUcnVlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl93cml0ZV9zdW1tYXJ5KCkKKworCisgICAgZGVmIF9ydW5fYmVuY2htYXJrKHNlbGYsIGx1bmNoLCBiZW5jaG1hcmssIGl0ZXJhdGlvbik6CisgICAgICAgICIiIlJ1biBhIHNpbmdsZSBiZW5jaG1hcmsuIiIiCisgICAgICAgIGJlbmNobWFya19sb2dfc3ViZGlyID0gc2VsZi5fYmVuY2htYXJrX2xvZ19kaXIobHVuY2gsIGJlbmNobWFyaywgaXRlcmF0aW9uKQorICAgICAgICBiZW5jaG1hcmtfbG9nX2RpciA9IHNlbGYuX29wdGlvbnMuTG9nRGlyKCkuam9pbnBhdGgoYmVuY2htYXJrX2xvZ19zdWJkaXIpCisKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIlNUQVJUSU5HIEJFTkNITUFSSzoge2JlbmNobWFyay5pZH1cbiIpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiIgICAgICAgICAgICAgbHVuY2g6IHtsdW5jaC5Db21iaW5lKCl9XG4iKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiICAgICAgICAgaXRlcmF0aW9uOiB7aXRlcmF0aW9ufVxuIikKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIiBiZW5jaG1hcmtfbG9nX2Rpcjoge2JlbmNobWFya19sb2dfZGlyfVxuIikKKworICAgICAgICByZXBvcnQgPSBCZW5jaG1hcmtSZXBvcnQobHVuY2gsIGJlbmNobWFyaywgaXRlcmF0aW9uLCBiZW5jaG1hcmtfbG9nX3N1YmRpcikKKyAgICAgICAgc2VsZi5fcmVwb3J0cy5hcHBlbmQocmVwb3J0KQorCisgICAgICAgICMgUHJlcm9sbCBidWlsZHMKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYmVuY2htYXJrLnByZXJvbGwpOgorICAgICAgICAgICAgbnMgPSBzZWxmLl9ydW5fYnVpbGQobHVuY2gsIGJlbmNobWFya19sb2dfZGlyLmpvaW5wYXRoKGYicHJlX3tpfSIpLCBiZW5jaG1hcmspCisgICAgICAgICAgICByZXBvcnQucHJlcm9sbF9kdXJhdGlvbl9ucy5hcHBlbmQobnMpCisKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIlBFUkZPUk1JTkcgQ0hBTkdFOiB7YmVuY2htYXJrLmNoYW5nZS5sYWJlbH1cbiIpCisgICAgICAgIGlmIG5vdCBzZWxmLl9vcHRpb25zLkRyeVJ1bigpOgorICAgICAgICAgICAgYmVuY2htYXJrLmNoYW5nZS5jaGFuZ2UoKQorICAgICAgICB0cnk6CisKKyAgICAgICAgICAgICMgTWVhc3VyZWQgYnVpbGQKKyAgICAgICAgICAgIG5zID0gc2VsZi5fcnVuX2J1aWxkKGx1bmNoLCBiZW5jaG1hcmtfbG9nX2Rpci5qb2lucGF0aCgibWVhc3VyZWQiKSwgYmVuY2htYXJrKQorICAgICAgICAgICAgcmVwb3J0LmR1cmF0aW9uX25zID0gbnMKKworICAgICAgICAgICAgZGlzdF9vbmUgPSBzZWxmLl9vcHRpb25zLkRpc3RPbmUoKQorICAgICAgICAgICAgaWYgZGlzdF9vbmU6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBkaXN0aW5nIGp1c3Qgb25lIGJlbmNobWFyaywgc2F2ZSB0aGUgbG9ncyBhbmQgd2UgY2FuIHN0b3AgaGVyZS4KKyAgICAgICAgICAgICAgICBzZWxmLl9kaXN0KHV0aWxzLmdldF9kaXN0X2RpcigpLCBiZW5jaG1hcmsuZHVtcHZhcnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2Rpc3QoYmVuY2htYXJrX2xvZ19kaXIsIGJlbmNobWFyay5kdW1wdmFycywgc3RvcmVfbWV0cmljc19vbmx5PVRydWUpCisgICAgICAgICAgICAgICAgIyBQb3N0cm9sbCBidWlsZHMKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShiZW5jaG1hcmsucG9zdHJvbGwpOgorICAgICAgICAgICAgICAgICAgICBucyA9IHNlbGYuX3J1bl9idWlsZChsdW5jaCwgYmVuY2htYXJrX2xvZ19kaXIuam9pbnBhdGgoZiJwb3N0X3tpfSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmspCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5wb3N0cm9sbF9kdXJhdGlvbl9ucy5hcHBlbmQobnMpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgQWx3YXlzIHVuZG8sIGV2ZW4gaWYgd2UgY3Jhc2hlZCBvciB0aGUgYnVpbGQgZmFpbGVkIGFuZCB3ZSBzdG9wcGVkLgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIlVORE9JTkcgQ0hBTkdFOiB7YmVuY2htYXJrLmNoYW5nZS5sYWJlbH1cbiIpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fb3B0aW9ucy5EcnlSdW4oKToKKyAgICAgICAgICAgICAgICBiZW5jaG1hcmsuY2hhbmdlLnVuZG8oKQorCisgICAgICAgIHNlbGYuX3dyaXRlX3N1bW1hcnkoKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiRklOSVNIRUQgQkVOQ0hNQVJLOiB7YmVuY2htYXJrLmlkfVxuIikKKworICAgIGRlZiBfYmVuY2htYXJrX2xvZ19kaXIoc2VsZiwgbHVuY2gsIGJlbmNobWFyaywgaXRlcmF0aW9uKToKKyAgICAgICAgIiIiQ29uc3RydWN0IHRoZSBsb2cgZGlyZWN0b3J5IGZpciBhIGJlbmNobWFyayBydW4uIiIiCisgICAgICAgIHBhdGggPSBmIntsdW5jaC5Db21iaW5lKCl9L3tiZW5jaG1hcmsuaWR9IgorICAgICAgICAjIFplcm8gcGFkIHRvIHRoZSBjb3JyZWN0IGxlbmd0aCBmb3IgY29ycmVjdCBhbHBoYSBzb3J0aW5nCisgICAgICAgIHBhdGggKz0gKCIvJTAiICsgc3RyKGxlbihzdHIoc2VsZi5fb3B0aW9ucy5JdGVyYXRpb25zKCkpKSkgKyAiZCIpICUgaXRlcmF0aW9uCisgICAgICAgIHJldHVybiBwYXRoCisKKyAgICBkZWYgX3J1bl9idWlsZChzZWxmLCBsdW5jaCwgYnVpbGRfbG9nX2RpciwgYmVuY2htYXJrKToKKyAgICAgICAgIiIiQnVpbGRzIHRoZSBtb2R1bGVzLiAgU2F2ZXMgaW50ZXJlc3RpbmcgbG9nIGZpbGVzIHRvIGxvZ19kaXIuICBSYWlzZXMgRmF0YWxFcnJvcgorICAgICAgICBpZiB0aGUgYnVpbGQgZmFpbHMuCisgICAgICAgICIiIgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiU1RBUlRJTkcgQlVJTEQge2JlbmNobWFyay5idWlsZF9kZXNjcmlwdGlvbigpfVxuIikKKworICAgICAgICBiZWZvcmVfbnMgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCisgICAgICAgIGlmIG5vdCBzZWxmLl9vcHRpb25zLkRyeVJ1bigpOgorICAgICAgICAgICAgY21kID0gWworICAgICAgICAgICAgICAgICJidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIiwKKyAgICAgICAgICAgIF0gKyBiZW5jaG1hcmsuc29vbmdfY29tbWFuZChzZWxmLl9vcHRpb25zLnJvb3QpCisgICAgICAgICAgICBlbnYgPSBkaWN0KG9zLmVudmlyb24pCisgICAgICAgICAgICBlbnZbIlRBUkdFVF9QUk9EVUNUIl0gPSBsdW5jaC50YXJnZXRfcHJvZHVjdAorICAgICAgICAgICAgZW52WyJUQVJHRVRfUkVMRUFTRSJdID0gbHVuY2gudGFyZ2V0X3JlbGVhc2UKKyAgICAgICAgICAgIGVudlsiVEFSR0VUX0JVSUxEX1ZBUklBTlQiXSA9IGx1bmNoLnRhcmdldF9idWlsZF92YXJpYW50CisgICAgICAgICAgICByZXR1cm5jb2RlID0gc3VicHJvY2Vzcy5jYWxsKGNtZCwgZW52PWVudikKKyAgICAgICAgICAgIGlmIHJldHVybmNvZGUgIT0gMDoKKyAgICAgICAgICAgICAgICByZXBvcnRfZXJyb3IoZiJCdWlsZCBmYWlsZWQ6IHsnICcuam9pbihjbWQpfSIpCisgICAgICAgICAgICAgICAgcmFpc2UgRmF0YWxFcnJvcigpCisKKyAgICAgICAgYWZ0ZXJfbnMgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCisKKyAgICAgICAgIyBUT0RPOiBDb3B5IHNvbWUgbG9nIGZpbGVzLgorCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiJGSU5JU0hFRCBCVUlMRCB7YmVuY2htYXJrLmJ1aWxkX2Rlc2NyaXB0aW9uKCl9XG4iKQorCisgICAgICAgIHJldHVybiBhZnRlcl9ucyAtIGJlZm9yZV9ucworCisgICAgZGVmIF9kaXN0KHNlbGYsIGRpc3RfZGlyLCBkdW1wdmFycywgc3RvcmVfbWV0cmljc19vbmx5PUZhbHNlKToKKyAgICAgICAgb3V0X2RpciA9IHV0aWxzLmdldF9vdXRfZGlyKCkKKyAgICAgICAgZGVzdF9kaXIgPSBkaXN0X2Rpci5qb2lucGF0aCgibG9ncyIpCisgICAgICAgIG9zLm1ha2VkaXJzKGRlc3RfZGlyLCBleGlzdF9vaz1UcnVlKQorICAgICAgICBiYXNlbmFtZXMgPSBbCisgICAgICAgICAgICAic29vbmdfYnVpbGRfbWV0cmljcy5wYiIsCisgICAgICAgICAgICAic29vbmdfbWV0cmljcyIsCisgICAgICAgIF0KKyAgICAgICAgaWYgbm90IHN0b3JlX21ldHJpY3Nfb25seToKKyAgICAgICAgICAgIGJhc2VuYW1lcy5leHRlbmQoWworICAgICAgICAgICAgICAgICJidWlsZC50cmFjZS5neiIsCisgICAgICAgICAgICAgICAgInNvb25nLmxvZyIsCisgICAgICAgICAgICBdKQorICAgICAgICBpZiBkdW1wdmFyczoKKyAgICAgICAgICAgIGJhc2VuYW1lcyA9IFsnZHVtcHZhcnMtJytiIGZvciBiIGluIGJhc2VuYW1lc10KKyAgICAgICAgZm9yIGJhc2UgaW4gYmFzZW5hbWVzOgorICAgICAgICAgICAgc3JjID0gb3V0X2Rpci5qb2lucGF0aChiYXNlKQorICAgICAgICAgICAgaWYgc3JjLmV4aXN0cygpOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiJESVNUOiBjb3BpZWQge3NyY30gdG8ge2Rlc3RfZGlyfVxuIikKKyAgICAgICAgICAgICAgICBzaHV0aWwuY29weShzcmMsIGRlc3RfZGlyKQorCisgICAgZGVmIF93cml0ZV9zdW1tYXJ5KHNlbGYpOgorICAgICAgICAjIFdyaXRlIHRoZSByZXN1bHRzLCBldmVuIGlmIHRoZSBidWlsZCBmYWlsZWQgb3Igd2UgY3Jhc2hlZCwgaW5jbHVkaW5nCisgICAgICAgICMgd2hldGhlciB3ZSBmaW5pc2hlZCBhbGwgb2YgdGhlIGJlbmNobWFya3MuCisgICAgICAgIGRhdGEgPSB7CisgICAgICAgICAgICAic3RhcnRfdGltZSI6IHNlbGYuX29wdGlvbnMuVGltZXN0YW1wKCkuaXNvZm9ybWF0KCksCisgICAgICAgICAgICAiYnJhbmNoIjogc2VsZi5fb3B0aW9ucy5CcmFuY2goKSwKKyAgICAgICAgICAgICJ0YWciOiBzZWxmLl9vcHRpb25zLlRhZygpLAorICAgICAgICAgICAgImJlbmNobWFya3MiOiBbcmVwb3J0LlRvRGljdCgpIGZvciByZXBvcnQgaW4gc2VsZi5fcmVwb3J0c10sCisgICAgICAgICAgICAiY29tcGxldGUiOiBzZWxmLl9jb21wbGV0ZSwKKyAgICAgICAgfQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5fb3B0aW9ucy5Mb2dEaXIoKS5qb2lucGF0aCgic3VtbWFyeS5qc29uIiksICJ3IiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKKyAgICAgICAgICAgIGpzb24uZHVtcChkYXRhLCBmLCBpbmRlbnQ9Miwgc29ydF9rZXlzPVRydWUpCisKKworZGVmIGJlbmNobWFya190YWJsZShiZW5jaG1hcmtzKToKKyAgICByb3dzID0gWygiSUQiLCAiREVTQ1JJUFRJT04iLCAiUkVCVUlMRCIpLF0KKyAgICByb3dzICs9IFsoYmVuY2htYXJrLmlkLCBiZW5jaG1hcmsudGl0bGUsIGJlbmNobWFyay5idWlsZF9kZXNjcmlwdGlvbigpKSBmb3IgYmVuY2htYXJrIGluCisgICAgICAgICAgICAgYmVuY2htYXJrc10KKyAgICByZXR1cm4gcm93cworCisKK2RlZiBwcmVwYXJlX2xvZ19kaXIoZGlyZWN0b3J5KToKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhkaXJlY3RvcnkpOgorICAgICAgICAjIElmIGl0IGV4aXN0cyBhbmQgaXNuJ3QgYSBkaXJlY3RvcnksIGZhaWwuCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcmVjdG9yeSk6CisgICAgICAgICAgICByZXBvcnRfZXJyb3IoZiJMb2cgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIGJ1dCBpc24ndCBhIGRpcmVjdG9yeToge2RpcmVjdG9yeX0iKQorICAgICAgICAgICAgcmFpc2UgRmF0YWxFcnJvcigpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkuIERvIHRoaXMgcmF0aGVyIHRoYW4gZGVsZXRpbmcgaXQgdG8gaGFuZGxlCisgICAgICAgICMgc3ltbGlua3MgY2xlYW5seS4KKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5KToKKyAgICAgICAgICAgIGVudHJ5ID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGVudHJ5KToKKyAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGVudHJ5KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZW50cnkpCisgICAgZWxzZToKKyAgICAgICAgIyBDcmVhdGUgaXQKKyAgICAgICAgb3MubWFrZWRpcnMoZGlyZWN0b3J5KQorCisKK2NsYXNzIE9wdGlvbnMoKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2hhZF9lcnJvciA9IEZhbHNlCisKKyAgICAgICAgIyBXYWxsIHRpbWUgY2xvY2sgd2hlbiB3ZSBzdGFydGVkCisgICAgICAgIHNlbGYuX3RpbWVzdGFtcCA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdyhkYXRldGltZS50aW1lem9uZS51dGMpCisKKyAgICAgICAgIyBNb3ZlIHRvIHRoZSByb290IG9mIHRoZSB0cmVlIHJpZ2h0IGF3YXkuIEV2ZXJ5dGhpbmcgbXVzdCBoYXBwZW4gZnJvbSB0aGVyZS4KKyAgICAgICAgc2VsZi5yb290ID0gdXRpbHMuZ2V0X3Jvb3QoKQorICAgICAgICBpZiBub3Qgc2VsZi5yb290OgorICAgICAgICAgICAgcmVwb3J0X2Vycm9yKCJVbmFibGUgdG8gZmluZCByb290IG9mIHRyZWUgZnJvbSBjd2QuIikKKyAgICAgICAgICAgIHJhaXNlIEZhdGFsRXJyb3IoKQorICAgICAgICBvcy5jaGRpcihzZWxmLnJvb3QpCisKKyAgICAgICAgIyBJbml0aWFsaXplIHRoZSBCZW5jaG1hcmtzLiBOb3RlIHRoYXQgdGhpcyBwcmUtbG9hZHMgYWxsIG9mIHRoZSBmaWxlcywgZXRjLgorICAgICAgICAjIERvaW5nIGFsbCB0aGF0IGhlcmUgZm9yY2VzIHVzIHRvIGZhaWwgZmFzdCBpZiBvbmUgb2YgdGhlbSBjYW4ndCBsb2FkIGEgcmVxdWlyZWQKKyAgICAgICAgIyBmaWxlLCBhdCB0aGUgY29zdCBvZiBhIHNtYWxsIHN0YXJ0dXAgc3BlZWQuIERvbid0IG1ha2UgdGhpcyBkbyBzb21ldGhpbmcgc2xvdworICAgICAgICAjIGxpa2Ugc2NhbiB0aGUgd2hvbGUgdHJlZS4KKyAgICAgICAgc2VsZi5faW5pdF9iZW5jaG1hcmtzKCkKKworICAgICAgICAjIEFyZ3VtZW50IHBhcnNpbmcKKyAgICAgICAgZXBpbG9nID0gZiIiIgorYmVuY2htYXJrczoKK3twcmV0dHkuRm9ybWF0VGFibGUoYmVuY2htYXJrX3RhYmxlKHNlbGYuX2JlbmNobWFya3MpLCBwcmVmaXg9IiAgIil9CisiIiIKKworICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgICAgICAgICAgICBwcm9nPSJiZW5jaG1hcmtzIiwKKyAgICAgICAgICAgICAgICBhbGxvd19hYmJyZXY9RmFsc2UsICMgRG9uJ3QgbGV0IHBlb3BsZSB3cml0ZSB1bnN1cHBvcnRhYmxlIHNjcmlwdHMuCisgICAgICAgICAgICAgICAgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciwKKyAgICAgICAgICAgICAgICBlcGlsb2c9ZXBpbG9nLAorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW4gYnVpbGQgc3lzdGVtIHBlcmZvcm1hbmNlIGJlbmNobWFya3MuIikKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBwYXJzZXIKKworICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWxvZy1kaXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRpcmVjdG9yeSBmb3IgbG9ncy4gRGVmYXVsdCBpcyAkVE9QLy4uL2JlbmNobWFya3MvLiIpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZGF0ZWQtbG9ncyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQXBwZW5kIHRpbWVzdGFtcCB0byBsb2cgZGlyLiIpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi1uIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iZHJ5X3J1biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRHJ5IHJ1bi4gRG9uJ3QgcnVuIHRoZSBidWlsZCBjb21tYW5kcyBidXQgZG8gZXZlcnl0aGluZyBlbHNlLiIpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tdGFnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJWYXJpYW50IG9mIHRoZSBydW4sIGZvciB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBwZXJmIHJ1bnMuIikKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1sdW5jaCIsIG5hcmdzPSIqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJMdW5jaCBjb21ib3MgdG8gdGVzdCIpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0taXRlcmF0aW9ucyIsIHR5cGU9aW50LCBkZWZhdWx0PTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iTnVtYmVyIG9mIGl0ZXJhdGlvbnMgb2YgZWFjaCB0ZXN0IHRvIHJ1bi4iKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWJyYW5jaCIsIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNwZWNpZnkgYnJhbmNoLiBPdGhlcndpc2UgYSBndWVzcyB3aWxsIGJlIG1hZGUgYmFzZWQgb24gcmVwby4iKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWJlbmNobWFyayIsIG5hcmdzPSIqIiwgZGVmYXVsdD1bYi5pZCBmb3IgYiBpbiBzZWxmLl9iZW5jaG1hcmtzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSJCRU5DSE1BUktTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJCZW5jaG1hcmtzIHRvIHJ1bi4gIERlZmF1bHQgc3VpdGUgd2lsbCBiZSBydW4gaWYgb21pdHRlZC4iKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWRpc3Qtb25lIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJDb3B5IGxvZ3MgYW5kIG1ldHJpY3MgdG8gdGhlIGdpdmVuIGRpc3QgZGlyLiBSZXF1aXJlcyB0aGF0IG9ubHkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvbmUgYmVuY2htYXJrIGJlIHN1cHBsaWVkLiBQb3N0cm9sbCBzdGVwcyB3aWxsIGJlIHNraXBwZWQuIikKKworICAgICAgICBzZWxmLl9hcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgICAgIHNlbGYuX2JyYW5jaCA9IHNlbGYuX2JyYW5jaCgpCisgICAgICAgIHNlbGYuX2xvZ19kaXIgPSBzZWxmLl9sb2dfZGlyKCkKKyAgICAgICAgc2VsZi5fbHVuY2hlcyA9IHNlbGYuX2x1bmNoZXMoKQorCisgICAgICAgICMgVmFsaWRhdGUgdGhlIGJlbmNobWFyayBpZHMKKyAgICAgICAgYWxsX2lkcyA9IFtiZW5jaG1hcmsuaWQgZm9yIGJlbmNobWFyayBpbiBzZWxmLl9iZW5jaG1hcmtzXQorICAgICAgICBiYWRfaWRzID0gW2lkIGZvciBpZCBpbiBzZWxmLl9hcmdzLmJlbmNobWFyayBpZiBpZCBub3QgaW4gYWxsX2lkc10KKyAgICAgICAgaWYgYmFkX2lkczoKKyAgICAgICAgICAgIGZvciBpZCBpbiBiYWRfaWRzOgorICAgICAgICAgICAgICAgIHNlbGYuX2Vycm9yKGYiSW52YWxpZCBiZW5jaG1hcms6IHtpZH0iKQorCisgICAgICAgICMgLS1kaXN0LW9uZSByZXF1aXJlcyB0aGF0IG9ubHkgb25lIGJlbmNobWFyayBiZSBzdXBwbGllZAorICAgICAgICBpZiBzZWxmLl9hcmdzLmRpc3Rfb25lIGFuZCBsZW4oc2VsZi5CZW5jaG1hcmtzKCkpICE9IDE6CisgICAgICAgICAgICBzZWxmLl9lcnJvcigiLS1kaXN0LW9uZSByZXF1aXJlcyB0aGF0IGV4YWN0bHkgb25lIC0tYmVuY2htYXJrLiIpCisKKyAgICAgICAgaWYgc2VsZi5faGFkX2Vycm9yOgorICAgICAgICAgICAgcmFpc2UgRmF0YWxFcnJvcigpCisKKyAgICBkZWYgVGltZXN0YW1wKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdGltZXN0YW1wCisKKyAgICBkZWYgX2JyYW5jaChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBicmFuY2gsIGVpdGhlciBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgYnkgZ3Vlc3NpbmcgZnJvbSByZXBvLiIiIgorICAgICAgICBpZiBzZWxmLl9hcmdzLmJyYW5jaDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hcmdzLmJyYW5jaAorICAgICAgICB0cnk6CisgICAgICAgICAgICBicmFuY2ggPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChmImNkIHtzZWxmLnJvb3R9Ly5yZXBvL21hbmlmZXN0cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAmJiBnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiAtLXN5bWJvbGljLWZ1bGwtbmFtZSBAe3V9IiwKKyAgICAgICAgICAgICAgICAgICAgc2hlbGw9VHJ1ZSwgZW5jb2Rpbmc9InV0Zi04IikKKyAgICAgICAgICAgIHJldHVybiBicmFuY2guc3RyaXAoKS5zcGxpdCgiLyIpWy0xXQorICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZXg6CisgICAgICAgICAgICByZXBvcnRfZXJyb3IoIkNhbid0IGdldCBicmFuY2ggZnJvbSAucmVwbyBkaXIuIFNwZWNpZnkgLS1icmFuY2ggYXJndW1lbnQiKQorICAgICAgICAgICAgcmVwb3J0X2Vycm9yKHN0cihleCkpCisgICAgICAgICAgICByYWlzZSBGYXRhbEVycm9yKCkKKworICAgIGRlZiBCcmFuY2goc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9icmFuY2gKKworICAgIGRlZiBfbG9nX2RpcihzZWxmKToKKyAgICAgICAgIlRoZSBsb2cgZGlyZWN0b3J5IHRvIHVzZSwgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3B0aW9ucyIKKyAgICAgICAgaWYgc2VsZi5fYXJncy5sb2dfZGlyOgorICAgICAgICAgICAgZCA9IHBhdGhsaWIuUGF0aChzZWxmLl9hcmdzLmxvZ19kaXIpLnJlc29sdmUoKS5hYnNvbHV0ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkID0gc2VsZi5yb290LmpvaW5wYXRoKCIuLiIsIHV0aWxzLkRFRkFVTFRfUkVQT1JUX0RJUikKKyAgICAgICAgaWYgc2VsZi5fYXJncy5kYXRlZF9sb2dzOgorICAgICAgICAgICAgZCA9IGQuam9pbnBhdGgoc2VsZi5fdGltZXN0YW1wLnN0cmZ0aW1lKCclWS0lbS0lZCcpKQorICAgICAgICBkID0gZC5qb2lucGF0aChzZWxmLl9icmFuY2gpCisgICAgICAgIGlmIHNlbGYuX2FyZ3MudGFnOgorICAgICAgICAgICAgZCA9IGQuam9pbnBhdGgoc2VsZi5fYXJncy50YWcpCisgICAgICAgIHJldHVybiBkLnJlc29sdmUoKS5hYnNvbHV0ZSgpCisKKyAgICBkZWYgTG9nRGlyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbG9nX2RpcgorCisgICAgZGVmIEJlbmNobWFya3Moc2VsZik6CisgICAgICAgIHJldHVybiBbYiBmb3IgYiBpbiBzZWxmLl9iZW5jaG1hcmtzIGlmIGIuaWQgaW4gc2VsZi5fYXJncy5iZW5jaG1hcmtdCisKKyAgICBkZWYgVGFnKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXJncy50YWcKKworICAgIGRlZiBEcnlSdW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9hcmdzLmRyeV9ydW4KKworICAgIGRlZiBfbHVuY2hlcyhzZWxmKToKKyAgICAgICAgZGVmIHBhcnNlX2x1bmNoKGx1bmNoKToKKyAgICAgICAgICAgIHBhcnRzID0gbHVuY2guc3BsaXQoIi0iKQorICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSAhPSAzOgorICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbnNFcnJvcihmIkludmFsaWQgbHVuY2ggY29tYm86IHtsdW5jaH0iKQorICAgICAgICAgICAgcmV0dXJuIEx1bmNoKHBhcnRzWzBdLCBwYXJ0c1sxXSwgcGFydHNbMl0pCisgICAgICAgICMgSWYgdGhleSBnYXZlIGx1bmNoIHRhcmdldHMgb24gdGhlIGNvbW1hbmQgbGluZSB1c2UgdGhhdAorICAgICAgICBpZiBzZWxmLl9hcmdzLmx1bmNoOgorICAgICAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgICAgICMgU3BsaXQgaW50byBMdW5jaCBvYmplY3RzCisgICAgICAgICAgICBmb3IgbHVuY2ggaW4gc2VsZi5fYXJncy5sdW5jaDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocGFyc2VfbHVuY2gobHVuY2gpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPcHRpb25zRXJyb3IgYXMgZXg6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Vycm9yKGV4Lm1lc3NhZ2UpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgICMgVXNlIHdoYXRzIGluIHRoZSBlbnZpcm9ubWVudAorICAgICAgICBwcm9kdWN0ID0gb3MuZ2V0ZW52KCJUQVJHRVRfUFJPRFVDVCIpCisgICAgICAgIHJlbGVhc2UgPSBvcy5nZXRlbnYoIlRBUkdFVF9SRUxFQVNFIikKKyAgICAgICAgdmFyaWFudCA9IG9zLmdldGVudigiVEFSR0VUX0JVSUxEX1ZBUklBTlQiKQorICAgICAgICBpZiAobm90IHByb2R1Y3QpIG9yIChub3QgcmVsZWFzZSkgb3IgKG5vdCB2YXJpYW50KToKKyAgICAgICAgICAgICMgSWYgdGhleSBkaWRuJ3QgZ2l2ZSB1cyBhbnl0aGluZywgZmFpbCByYXRoZXIgdGhhbiBndWVzc2luZy4gVGhlcmUncyBubyBnb29kCisgICAgICAgICAgICAjIGRlZmF1bHQgZm9yIEFPU1AuCisgICAgICAgICAgICBzZWxmLl9lcnJvcigiTm8gbHVuY2ggY29tYm8gc3BlY2lmaWVkLiBFaXRoZXIgcGFzcyAtLWx1bmNoIGFyZ3VtZW50IG9yIHJ1biBsdW5jaC4iKQorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHJldHVybiBbTHVuY2gocHJvZHVjdCwgcmVsZWFzZSwgdmFyaWFudCksXQorCisgICAgZGVmIEx1bmNoZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9sdW5jaGVzCisKKyAgICBkZWYgSXRlcmF0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2FyZ3MuaXRlcmF0aW9ucworCisgICAgZGVmIERpc3RPbmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9hcmdzLmRpc3Rfb25lCisKKyAgICBkZWYgX2luaXRfYmVuY2htYXJrcyhzZWxmKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBiZW5jaG1hcmtzLiIiIgorICAgICAgICAjIEFzc3VtZXMgdGhhdCB3ZSd2ZSBhbHJlYWR5IGNoZGlyZWQgdG8gdGhlIHJvb3Qgb2YgdGhlIHRyZWUuCisgICAgICAgIHNlbGYuX2JlbmNobWFya3MgPSBbCisgICAgICAgICAgICBCZW5jaG1hcmsoCisgICAgICAgICAgICAgICAgICAgICAgaWQ9ImZ1bGxfbHVuY2giLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJMdW5jaCBmcm9tIGNsZWFuIG91dCIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPUNsZWFuKCksCisgICAgICAgICAgICAgICAgICAgICAgZHVtcHZhcnM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTAsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MCwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoCisgICAgICAgICAgICAgICAgICAgICAgaWQ9Im5vb3BfbHVuY2giLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJMdW5jaCB3aXRoIG5vIGNoYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPU5vQ2hhbmdlKCksCisgICAgICAgICAgICAgICAgICAgICAgZHVtcHZhcnM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MCwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9ImZ1bGwiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJGdWxsIGJ1aWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9Q2xlYW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzPVsiZHJvaWQiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTAsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MywKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJub2NoYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Ik5vIGNoYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPU5vQ2hhbmdlKCksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bImRyb2lkIl0sCisgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTMsCisgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEJlbmNobWFyayhpZD0idW5yZWZlcmVuY2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iQ3JlYXRlIHVucmVmZXJlbmNlZCBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9Q3JlYXRlKCJiaW9uaWMvdW5yZWZlcmVuY2VkLnR4dCIpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJkcm9pZCJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9Im1vZGlmeV9icCIsCisgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Ik1vZGlmeSBBbmRyb2lkLmJwIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9TW9kaWZ5KCJiaW9uaWMvbGliYy9BbmRyb2lkLmJwIiwgQ29tbWVudCgiLy8iKSksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bImRyb2lkIl0sCisgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0xLAorICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTMsCisgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEJlbmNobWFyayhpZD0ibW9kaWZ5X3N0ZGlvIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iTW9kaWZ5IHN0ZGlvLmNwcCIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPU1vZGlmeSgiYmlvbmljL2xpYmMvc3RkaW8vc3RkaW8uY3BwIiwgQ29tbWVudCgiLy8iKSksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bImxpYmMiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJtb2RpZnlfYWRiZCIsCisgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Ik1vZGlmeSBhZGJkIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9TW9kaWZ5KCJwYWNrYWdlcy9tb2R1bGVzL2FkYi9kYWVtb24vbWFpbi5jcHAiLCBDb21tZW50KCIvLyIpKSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzPVsiYWRiZCJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9InNlcnZpY2VzX3ByaXZhdGVfZmllbGQiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJBZGQgcHJpdmF0ZSBmaWVsZCB0byBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEiLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT1BZGRKYXZhRmllbGQoImZyYW1ld29ya3MvYmFzZS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSIpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJzZXJ2aWNlcyJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9InNlcnZpY2VzX3B1YmxpY19maWVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9IkFkZCBwdWJsaWMgZmllbGQgdG8gQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9QWRkSmF2YUZpZWxkKCJmcmFtZXdvcmtzL2Jhc2Uvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8qKiBAaGlkZSAqLyBwdWJsaWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzPVsic2VydmljZXMiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJzZXJ2aWNlc19hcGkiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJBZGQgQVBJIHRvIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YWEiLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT1BZGRKYXZhRmllbGQoImZyYW1ld29ya3MvYmFzZS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQGFuZHJvaWQuYW5ub3RhdGlvbi5TdXBwcmVzc0xpbnQoXCJVbmZsYWdnZWRBcGlcIikgcHVibGljIiksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bInNlcnZpY2VzIl0sCisgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0xLAorICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTIsCisgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEJlbmNobWFyayhpZD0iZnJhbWV3b3JrX3ByaXZhdGVfZmllbGQiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJBZGQgcHJpdmF0ZSBmaWVsZCB0byBTZXR0aW5ncy5qYXZhIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9QWRkSmF2YUZpZWxkKCJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSIpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJmcmFtZXdvcmstbWludXMtYXBleCJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9ImZyYW1ld29ya19wdWJsaWNfZmllbGQiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJBZGQgcHVibGljIGZpZWxkIHRvIFNldHRpbmdzLmphdmEiLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT1BZGRKYXZhRmllbGQoImZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvKiogQGhpZGUgKi8gcHVibGljIiksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bImZyYW1ld29yay1taW51cy1hcGV4Il0sCisgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0xLAorICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTIsCisgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEJlbmNobWFyayhpZD0iZnJhbWV3b3JrX2FwaSIsCisgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9IkFkZCBBUEkgdG8gU2V0dGluZ3MuamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPUNoYW5nZVB1YmxpY0FwaSgpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJhcGktc3R1YnMtZG9jcy1ub24tdXBkYXRhYmxlLXVwZGF0ZS1jdXJyZW50LWFwaSIsICJmcmFtZXdvcmstbWludXMtYXBleCJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9Im1vZGlmeV9mcmFtZXdvcmtfcmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJNb2RpZnkgZnJhbWV3b3JrIHJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9TW9kaWZ5KCJmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc3RyKHV1aWQudXVpZDQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmU9Ijwvc3RyaW5nPiIpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJmcmFtZXdvcmstbWludXMtYXBleCJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9ImFkZF9mcmFtZXdvcmtfcmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJBZGQgZnJhbWV3b3JrIHJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9TW9kaWZ5KCJmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogZiI8c3RyaW5nIG5hbWU9XCJCRU5DSE1BUktcIj57dXVpZC51dWlkNCgpfTwvc3RyaW5nPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmU9IjwvcmVzb3VyY2VzPiIpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJmcmFtZXdvcmstbWludXMtYXBleCJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9ImFkZF9zeXN0ZW11aV9maWVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9IkFkZCBTeXN0ZW1VSSBmaWVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPUFkZEphdmFGaWVsZCgiZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS93bXNoZWxsL1dNU2hlbGwuamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljIiksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bIlN5c3RlbVVJIl0sCisgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0xLAorICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTIsCisgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgXQorCisgICAgZGVmIF9lcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgcmVwb3J0X2Vycm9yKG1lc3NhZ2UpCisgICAgICAgIHNlbGYuX2hhZF9lcnJvciA9IFRydWUKKworCitkZWYgcmVwb3J0X2Vycm9yKG1lc3NhZ2UpOgorICAgIHN5cy5zdGRlcnIud3JpdGUoZiJlcnJvcjoge21lc3NhZ2V9XG4iKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICAgIHRyeToKKyAgICAgICAgb3B0aW9ucyA9IE9wdGlvbnMoKQorICAgICAgICBydW5uZXIgPSBSdW5uZXIob3B0aW9ucykKKyAgICAgICAgcnVubmVyLlJ1bigpCisgICAgZXhjZXB0IEZhdGFsRXJyb3I6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiJGQUlMRURcbiIpCisgICAgICAgIHN5cy5leGl0KDEpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9mb3JtYXRfYmVuY2htYXJrcyBiL3Rvb2xzL3BlcmYvZm9ybWF0X2JlbmNobWFya3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODA3ZTU0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvZm9ybWF0X2JlbmNobWFya3MKQEAgLTAsMCArMSwyMTkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBzeXMKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgPSBUcnVlCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGRhdGFjbGFzc2VzCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgc3RhdGlzdGljcworaW1wb3J0IHpvbmVpbmZvCitpbXBvcnQgY3N2CisKK2ltcG9ydCBwcmV0dHkKK2ltcG9ydCB1dGlscworCisjIFRPRE86CisjIC0gRmxhZyBpZiB0aGUgbGFzdCBwb3N0cm9sbCBidWlsZCB3YXMgbW9yZSB0aGFuIDE1IHNlY29uZHMgb3Igc29tZXRoaW5nLiBUaGF0J3MKKyMgICBhbiBpbmRpY2F0b3IgdGhhdCBzb21ldGhpbmcgaXMgYW1pc3MuCisjIC0gQWRkIGEgbW9kZSB0byBwcmludCBhbGwgb2YgdGhlIHZhbHVlcyBmb3IgbXVsdGktaXRlcmF0aW9uIHJ1bnMKKyMgLSBBZGQgYSBmbGFnIHRvIHJlb3JkZXIgdGhlIHRhZ3MKKyMgLSBBZGQgYSBmbGFnIHRvIHJlb3JkZXIgdGhlIGhlYWRlcnMgaW4gb3JkZXIgdG8gc2hvdyBncm91cGluZyBtb3JlIGNsZWFybHkuCisKKworZGVmIEZpbmRTdW1tYXJpZXMoYXJncyk6CisgICAgZGVmIGZpbmRfc3VtbWFyaWVzKGRpcmVjdG9yeSk6CisgICAgICAgIHJldHVybiBbc3RyKHAucmVzb2x2ZSgpKSBmb3IgcCBpbiBwYXRobGliLlBhdGgoZGlyZWN0b3J5KS5nbG9iKCIqKi9zdW1tYXJ5Lmpzb24iKV0KKyAgICBpZiBub3QgYXJnczoKKyAgICAgICAgIyBJZiB0aGV5IGRpZG4ndCBnaXZlIGFuIGFyZ3VtZW50LCB1c2UgdGhlIGRlZmF1bHQgZGlyCisgICAgICAgIHJvb3QgPSB1dGlscy5nZXRfcm9vdCgpCisgICAgICAgIGlmIG5vdCByb290OgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHJldHVybiBmaW5kX3N1bW1hcmllcyhyb290LmpvaW5wYXRoKCIuLiIsIHV0aWxzLkRFRkFVTFRfUkVQT1JUX0RJUikpCisgICAgcmVzdWx0cyA9IGxpc3QoKQorICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoYXJnKToKKyAgICAgICAgICAgICMgSWYgaXQncyBhIGZpbGUgYWRkIHRoYXQKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKGFyZykKKyAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGFyZyk6CisgICAgICAgICAgICAjIElmIGl0J3MgYSBkaXJlY3RvcnksIGZpbmQgYWxsIG9mIHRoZSBmaWxlcyB0aGVyZQorICAgICAgICAgICAgcmVzdWx0cyArPSBmaW5kX3N1bW1hcmllcyhhcmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiSW52YWxpZCBzdW1tYXJ5IGFyZ3VtZW50OiB7YXJnfVxuIikKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgcmV0dXJuIHNvcnRlZChsaXN0KHJlc3VsdHMpKQorCisKK2RlZiBMb2FkU3VtbWFyeShmaWxlbmFtZSk6CisgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmOgorICAgICAgICByZXR1cm4ganNvbi5sb2FkKGYpCisKKyMgQ29sdW1uczoKKyMgICBEYXRlCisjICAgQnJhbmNoCisjICAgVGFnCisjICAgLS0KKyMgICBMdW5jaAorIyBSb3dzOgorIyAgIEJlbmNobWFyaworCitkZWYgbHVuY2hfc3RyKGQpOgorICAgICJDb252ZXJ0IGEgbHVuY2ggZGljdCB0byBhIHN0cmluZyIKKyAgICByZXR1cm4gZiJ7ZFsnVEFSR0VUX1BST0RVQ1QnXX0te2RbJ1RBUkdFVF9SRUxFQVNFJ119LXtkWydUQVJHRVRfQlVJTERfVkFSSUFOVCddfSIKKworZGVmIGdyb3VwX2J5KGwsIGtleSk6CisgICAgIlJldHVybiBhIGxpc3Qgb2YgdHVwbGVzLCBncm91cGVkIGJ5IGtleSwgc29ydGVkIGJ5IGtleSIKKyAgICByZXN1bHQgPSB7fQorICAgIGZvciBpdGVtIGluIGw6CisgICAgICAgIHJlc3VsdC5zZXRkZWZhdWx0KGtleShpdGVtKSwgW10pLmFwcGVuZChpdGVtKQorICAgIHJldHVybiBbKGssIHYpIGZvciBrLCB2IGluIHJlc3VsdC5pdGVtcygpXQorCisKK2NsYXNzIFRhYmxlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb3dfdGl0bGUsIGZpeGVkX3RpdGxlcz1bXSk6CisgICAgICAgIHNlbGYuX2RhdGEgPSB7fQorICAgICAgICBzZWxmLl9yb3dzID0gW10KKyAgICAgICAgc2VsZi5fY29scyA9IFtdCisgICAgICAgIHNlbGYuX2ZpeGVkX2NvbHMgPSB7fQorICAgICAgICBzZWxmLl90aXRsZXMgPSBbcm93X3RpdGxlXSArIGZpeGVkX3RpdGxlcworCisgICAgZGVmIFNldChzZWxmLCBjb2x1bW5fa2V5LCByb3dfa2V5LCBkYXRhKToKKyAgICAgICAgc2VsZi5fZGF0YVsoY29sdW1uX2tleSwgcm93X2tleSldID0gZGF0YQorICAgICAgICBpZiBub3QgY29sdW1uX2tleSBpbiBzZWxmLl9jb2xzOgorICAgICAgICAgICAgc2VsZi5fY29scy5hcHBlbmQoY29sdW1uX2tleSkKKyAgICAgICAgaWYgbm90IHJvd19rZXkgaW4gc2VsZi5fcm93czoKKyAgICAgICAgICAgIHNlbGYuX3Jvd3MuYXBwZW5kKHJvd19rZXkpCisKKyAgICBkZWYgU2V0Rml4ZWRDb2woc2VsZiwgcm93X2tleSwgY29sdW1ucyk6CisgICAgICAgIHNlbGYuX2ZpeGVkX2NvbHNbcm93X2tleV0gPSBjb2x1bW5zCisKKyAgICBkZWYgV3JpdGUoc2VsZiwgb3V0LCBmbXQpOgorICAgICAgICB0YWJsZSA9IFtdCisgICAgICAgICMgRXhwYW5kIHRoZSBjb2x1bW4gaXRlbXMKKyAgICAgICAgZm9yIHJvdyBpbiB6aXAoKnNlbGYuX2NvbHMpOgorICAgICAgICAgICAgaWYgcm93LmNvdW50KHJvd1swXSkgPT0gbGVuKHJvdyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRhYmxlLmFwcGVuZChbIiJdICogbGVuKHNlbGYuX3RpdGxlcykgKyBbY29sIGZvciBjb2wgaW4gcm93XSkKKyAgICAgICAgaWYgdGFibGU6CisgICAgICAgICAgICAjIFVwZGF0ZSB0aGUgbGFzdCByb3cgb2YgdGhlIGhlYWRlciB3aXRoIHRpdGxlIGFuZCBhZGQgc2VwYXJhdG9yCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5fdGl0bGVzKSk6CisgICAgICAgICAgICAgICAgdGFibGVbbGVuKHRhYmxlKS0xXVtpXSA9IHNlbGYuX3RpdGxlc1tpXQorICAgICAgICAgICAgaWYgZm10ID09ICJ0YWJsZSI6CisgICAgICAgICAgICAgICAgdGFibGUuYXBwZW5kKHByZXR0eS5TRVBBUkFUT1IpCisgICAgICAgICMgUG9wdWxhdGUgdGhlIGRhdGEKKyAgICAgICAgZm9yIHJvdyBpbiBzZWxmLl9yb3dzOgorICAgICAgICAgICAgdGFibGUuYXBwZW5kKFtzdHIocm93KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICArIHNlbGYuX2ZpeGVkX2NvbHNbcm93XQorICAgICAgICAgICAgICAgICAgICAgICAgICsgW3N0cihzZWxmLl9kYXRhLmdldCgoY29sLCByb3cpLCAiIikpIGZvciBjb2wgaW4gc2VsZi5fY29sc10pCisgICAgICAgIGlmIGZtdCA9PSAiY3N2IjoKKyAgICAgICAgICAgIGNzdi53cml0ZXIoc3lzLnN0ZG91dCwgcXVvdGluZz1jc3YuUVVPVEVfTUlOSU1BTCkud3JpdGVyb3dzKHRhYmxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0LndyaXRlKHByZXR0eS5Gb3JtYXRUYWJsZSh0YWJsZSwgYWxpZ25tZW50cz0iTEwiKSkKKworCitkZWYgZm9ybWF0X2R1cmF0aW9uX3NlYyhucywgZm10X3NlYyk6CisgICAgIkZvcm1hdCBhIGR1cmF0aW9uIGluIG5zIHRvIHNlY29uZCBwcmVjaXNpb24iCisgICAgc2VjID0gcm91bmQobnMgLyAxMDAwMDAwMDAwKQorICAgIGlmIGZtdF9zZWM6CisgICAgICAgIHJldHVybiBmIntzZWN9IgorICAgIGVsc2U6CisgICAgICAgIGgsIHNlYyA9IGRpdm1vZChzZWMsIDYwKjYwKQorICAgICAgICBtLCBzZWMgPSBkaXZtb2Qoc2VjLCA2MCkKKyAgICAgICAgcmVzdWx0ID0gIiIKKyAgICAgICAgaWYgaCA+IDA6CisgICAgICAgICAgICByZXN1bHQgKz0gZiJ7aDoyZH1oICIKKyAgICAgICAgaWYgaCA+IDAgb3IgbSA+IDA6CisgICAgICAgICAgICByZXN1bHQgKz0gZiJ7bToyZH1tICIKKyAgICAgICAgcmV0dXJuIHJlc3VsdCArIGYie3NlYzoyZH1zIgorCisKK2RlZiBtYWluKGFyZ3YpOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAorICAgICAgICAgICAgcHJvZz0iZm9ybWF0X2JlbmNobWFya3MiLAorICAgICAgICAgICAgYWxsb3dfYWJicmV2PUZhbHNlLCAjIERvbid0IGxldCBwZW9wbGUgd3JpdGUgdW5zdXBwb3J0YWJsZSBzY3JpcHRzLgorICAgICAgICAgICAgZGVzY3JpcHRpb249IlByaW50IGFuYWx5c2lzIHRhYmxlcyBmb3IgYmVuY2htYXJrcyIpCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWNzdiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQcmludCBpbiBDU1YgaW5zdGVhZCBvZiB0YWJsZS4iKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1zZWMiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUHJpbnQgaW4gc2Vjb25kcyBpbnN0ZWFkIG9mIG1pbnV0ZXMgYW5kIHNlY29uZHMiKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS10YWdzIiwgbmFyZ3M9IioiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iVGhlIHRhZ3MgdG8gcHJpbnQsIGluIG9yZGVyLiIpCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJzdW1tYXJpZXMiLCBuYXJncz0iKiIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBIHN1bW1hcnkuanNvbiBmaWxlIG9yIGEgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGxvb2sgZm9yIHN1bW1hcmllcy4iKQorCisgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgICMgTG9hZCB0aGUgc3VtbWFyaWVzCisgICAgc3VtbWFyaWVzID0gWyhzLCBMb2FkU3VtbWFyeShzKSkgZm9yIHMgaW4gRmluZFN1bW1hcmllcyhhcmdzLnN1bW1hcmllcyldCisKKyAgICAjIENvbnZlcnQgdG8gTVRWIHRpbWUKKyAgICBmb3IgZmlsZW5hbWUsIHMgaW4gc3VtbWFyaWVzOgorICAgICAgICBkdCA9IGRhdGV0aW1lLmRhdGV0aW1lLmZyb21pc29mb3JtYXQoc1sic3RhcnRfdGltZSJdKQorICAgICAgICBkdCA9IGR0LmFzdGltZXpvbmUoem9uZWluZm8uWm9uZUluZm8oIkFtZXJpY2EvTG9zX0FuZ2VsZXMiKSkKKyAgICAgICAgc1siZGF0ZXRpbWUiXSA9IGR0CisgICAgICAgIHNbImRhdGUiXSA9IGRhdGV0aW1lLmRhdGUoZHQueWVhciwgZHQubW9udGgsIGR0LmRheSkKKworICAgICMgRmlsdGVyIG91dCB0YWdzIHdlIGRvbid0IHdhbnQKKyAgICBpZiBhcmdzLnRhZ3M6CisgICAgICAgIHN1bW1hcmllcyA9IFsoZiwgcykgZm9yIGYsIHMgaW4gc3VtbWFyaWVzIGlmIHMuZ2V0KCJ0YWciLCAiIikgaW4gYXJncy50YWdzXQorCisgICAgIyBJZiB0aGV5IHN1cHBsaWVkIHRhZ3MsIHNvcnQgaW4gdGhhdCBvcmRlciwgb3RoZXJ3aXNlIHNvcnQgYnkgdGFnCisgICAgaWYgYXJncy50YWdzOgorICAgICAgICB0YWdzb3J0ID0gbGFtYmRhIHRhZzogYXJncy50YWdzLmluZGV4KHRhZykKKyAgICBlbHNlOgorICAgICAgICB0YWdzb3J0ID0gbGFtYmRhIHRhZzogdGFnCisKKyAgICAjIFNvcnQgdGhlIHN1bW1hcmllcworICAgIHN1bW1hcmllcy5zb3J0KGtleT1sYW1iZGEgczogKHNbMV1bImRhdGUiXSwgc1sxXVsiYnJhbmNoIl0sIHRhZ3NvcnQoc1sxXVsidGFnIl0pKSkKKworICAgICMgZ3JvdXAgdGhlIGJlbmNobWFya3MgYnkgY29sdW1uIGFuZCBpdGVyYXRpb24KKyAgICBkZWYgYm1fa2V5KGIpOgorICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgbHVuY2hfc3RyKGJbImx1bmNoIl0pLAorICAgICAgICApCisgICAgZm9yIGZpbGVuYW1lLCBzdW1tYXJ5IGluIHN1bW1hcmllczoKKyAgICAgICAgc3VtbWFyeVsiY29sdW1ucyJdID0gWyhrZXksIGdyb3VwX2J5KGJtcywgbGFtYmRhIGI6IGJbImlkIl0pKSBmb3Iga2V5LCBibXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGdyb3VwX2J5KHN1bW1hcnlbImJlbmNobWFya3MiXSwgYm1fa2V5KV0KKworICAgICMgQnVpbGQgdGhlIHRhYmxlCisgICAgdGFibGUgPSBUYWJsZSgiQmVuY2htYXJrIiwgWyJSZWJ1aWxkIl0pCisgICAgZm9yIGZpbGVuYW1lLCBzdW1tYXJ5IGluIHN1bW1hcmllczoKKyAgICAgICAgZm9yIGtleSwgY29sdW1uIGluIHN1bW1hcnlbImNvbHVtbnMiXToKKyAgICAgICAgICAgIGZvciBpZCwgY2VsbCBpbiBjb2x1bW46CisgICAgICAgICAgICAgICAgZHVyYXRpb25fbnMgPSBzdGF0aXN0aWNzLm1lZGlhbihbYlsiZHVyYXRpb25fbnMiXSBmb3IgYiBpbiBjZWxsXSkKKyAgICAgICAgICAgICAgICBtb2R1bGVzID0gY2VsbFswXVsibW9kdWxlcyJdCisgICAgICAgICAgICAgICAgaWYgbm90IG1vZHVsZXM6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZXMgPSBbIi0tLSJdCisgICAgICAgICAgICAgICAgdGFibGUuU2V0Rml4ZWRDb2woY2VsbFswXVsidGl0bGUiXSwgWyIgIi5qb2luKG1vZHVsZXMpXSkKKyAgICAgICAgICAgICAgICB0YWJsZS5TZXQodHVwbGUoW3N1bW1hcnlbImRhdGUiXS5zdHJmdGltZSgiJVktJW0tJWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlbImJyYW5jaCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVsidGFnIl1dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGlzdChrZXkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFswXVsidGl0bGUiXSwgZm9ybWF0X2R1cmF0aW9uX3NlYyhkdXJhdGlvbl9ucywgYXJncy5zZWMpKQorCisgICAgdGFibGUuV3JpdGUoc3lzLnN0ZG91dCwgImNzdiIgaWYgYXJncy5jc3YgZWxzZSAidGFibGUiKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oc3lzLmFyZ3YpCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvcHJldHR5LnB5IGIvdG9vbHMvcGVyZi9wcmV0dHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmZGM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvcHJldHR5LnB5CkBAIC0wLDAgKzEsNTIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgRm9ybWF0dGluZyB1dGlsaXRpZXMKKworY2xhc3MgU2VudGluZWwoKToKKyAgICBwYXNzCisKK1NFUEFSQVRPUiA9IFNlbnRpbmVsKCkKKworZGVmIEZvcm1hdFRhYmxlKGRhdGEsIHByZWZpeD0iIiwgYWxpZ25tZW50cz1bXSk6CisgICAgIiIiUHJldHR5IHByaW50IGEgdGFibGUuCisKKyAgICBQcmVmaXhlcyBlYWNoIHJvdyB3aXRoIGBwcmVmaXhgLgorICAgICIiIgorICAgIGlmIG5vdCBkYXRhOgorICAgICAgICByZXR1cm4gIiIKKyAgICB3aWR0aHMgPSBbbWF4KFtsZW4oeCkgaWYgeCBlbHNlIDAgZm9yIHggaW4gY29sXSkgZm9yIGNvbAorICAgICAgICAgICAgICBpbiB6aXAoKltkIGZvciBkIGluIGRhdGEgaWYgbm90IGlzaW5zdGFuY2UoZCwgU2VudGluZWwpXSldCisgICAgcmVzdWx0ID0gIiIKKyAgICBjb2xzZXAgPSAiICAiCisgICAgZm9yIHJvdyBpbiBkYXRhOgorICAgICAgICByZXN1bHQgKz0gcHJlZml4CisgICAgICAgIGlmIHJvdyA9PSBTRVBBUkFUT1I6CisgICAgICAgICAgICBmb3IgdyBpbiB3aWR0aHM6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICItIiAqIHcKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gY29sc2VwCisgICAgICAgICAgICByZXN1bHQgKz0gIlxuIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHJvdykpOgorICAgICAgICAgICAgICAgIGNlbGwgPSByb3dbaV0gaWYgcm93W2ldIGVsc2UgIiIKKyAgICAgICAgICAgICAgICBpZiBpID49IGxlbihhbGlnbm1lbnRzKSBvciBhbGlnbm1lbnRzW2ldID09ICJSIjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgIiAqICh3aWR0aHNbaV0gLSBsZW4oY2VsbCkpCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNlbGwKKyAgICAgICAgICAgICAgICBpZiBpIDwgbGVuKGFsaWdubWVudHMpIGFuZCBhbGlnbm1lbnRzW2ldID09ICJMIjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgIiAqICh3aWR0aHNbaV0gLSBsZW4oY2VsbCkpCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNvbHNlcAorICAgICAgICAgICAgcmVzdWx0ICs9ICJcbiIKKyAgICByZXR1cm4gcmVzdWx0CisKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlscy5weSBiL3Rvb2xzL3BlcmYvdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2NmQ0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbHMucHkKQEAgLTAsMCArMSw0NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgorCitERUZBVUxUX1JFUE9SVF9ESVIgPSAiYmVuY2htYXJrcyIKKworZGVmIGdldF9yb290KCk6CisgICAgdG9wX2RpciA9IG9zLmVudmlyb24uZ2V0KCJBTkRST0lEX0JVSUxEX1RPUCIpCisgICAgZCA9IHBhdGhsaWIuUGF0aC5jd2QoKQorICAgICMgd2l0aCBjb2csIHNvbWVvbmUgbWF5IGhhdmUgYSBuZXcgd29ya3NwYWNlIGFuZCBuZXcgc291cmNlIHRyZWUgdG9wLCBidXQKKyAgICAjIG5vdCBydW4gbHVuY2ggeWV0LCByZXN1bHRpbmcgaW4gYSBtaXNsZWFkaW5nIEFORFJPSURfQlVJTERfVE9QIHZhbHVlCisgICAgaWYgdG9wX2RpciBhbmQgZC5pc19yZWxhdGl2ZV90byh0b3BfZGlyKToKKyAgICAgICAgcmV0dXJuIHBhdGhsaWIuUGF0aCh0b3BfZGlyKS5yZXNvbHZlKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBpZiBkLmpvaW5wYXRoKCJidWlsZCIsICJzb29uZyIsICJzb29uZ191aS5iYXNoIikuZXhpc3RzKCk6CisgICAgICAgICAgICByZXR1cm4gZC5yZXNvbHZlKCkuYWJzb2x1dGUoKQorICAgICAgICBkID0gZC5wYXJlbnQKKyAgICAgICAgaWYgZCA9PSBwYXRobGliLlBhdGgoIi8iKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKK2RlZiBnZXRfZGlzdF9kaXIoKToKKyAgICBkaXN0X2RpciA9IG9zLmdldGVudigiRElTVF9ESVIiKQorICAgIGlmIGRpc3RfZGlyOgorICAgICAgICByZXR1cm4gcGF0aGxpYi5QYXRoKGRpc3RfZGlyKS5yZXNvbHZlKCkKKyAgICByZXR1cm4gZ2V0X291dF9kaXIoKS5qb2lucGF0aCgiZGlzdCIpCisKK2RlZiBnZXRfb3V0X2RpcigpOgorICAgIG91dF9kaXIgPSBvcy5nZXRlbnYoIk9VVF9ESVIiKQorICAgIGlmIG5vdCBvdXRfZGlyOgorICAgICAgICBvdXRfZGlyID0gIm91dCIKKyAgICByZXR1cm4gcGF0aGxpYi5QYXRoKG91dF9kaXIpLnJlc29sdmUoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG9zdF9wcm9jZXNzX3Byb3BzLnB5IGIvdG9vbHMvcG9zdF9wcm9jZXNzX3Byb3BzLnB5CmluZGV4IDMxYTQ2MGQuLjZmNDI5ZmEgMTAwNzU1Ci0tLSBhL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weQorKysgYi90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkKQEAgLTE3LDYgKzE3LDggQEAKIGltcG9ydCBhcmdwYXJzZQogaW1wb3J0IHN5cwogCitmcm9tIHVmZmRfZ2NfdXRpbHMgaW1wb3J0IHNob3VsZF9lbmFibGVfdWZmZF9nYworCiAjIFVzYWdlOiBwb3N0X3Byb2Nlc3NfcHJvcHMucHkgZmlsZS5wcm9wIFtkaXNhbGxvd2VkX2tleSwgLi4uXQogIyBEaXNhbGxvd2VkIGtleXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcHJvcGVydHkgZmlsZSwgaWYgcHJlc2VudAogCkBAIC0yNyw3ICsyOSw3IEBACiAKICMgUHV0IHRoZSBtb2RpZmljYXRpb25zIHRoYXQgeW91IG5lZWQgdG8gbWFrZSBpbnRvIHRoZSAqL2J1aWxkLnByb3AgaW50byB0aGlzCiAjIGZ1bmN0aW9uLgotZGVmIG1hbmdsZV9idWlsZF9wcm9wKHByb3BfbGlzdCk6CitkZWYgbWFuZ2xlX2J1aWxkX3Byb3AocHJvcF9saXN0LCBrZXJuZWxfdmVyc2lvbl9maWxlX2Zvcl91ZmZkX2djKToKICAgIyBJZiByby5kZWJ1Z2dhYmxlIGlzIDEsIHRoZW4gZW5hYmxlIGFkYiBvbiBVU0IgYnkgZGVmYXVsdAogICAjICh0aGlzIGlzIGZvciB1c2VyZGVidWcgYnVpbGRzKQogICBpZiBwcm9wX2xpc3QuZ2V0X3ZhbHVlKCJyby5kZWJ1Z2dhYmxlIikgPT0gIjEiOgpAQCAtMzgsNTUgKzQwLDMyIEBACiAgICAgICBlbHNlOgogICAgICAgICB2YWwgPSB2YWwgKyAiLGFkYiIKICAgICAgIHByb3BfbGlzdC5wdXQoInBlcnNpc3Quc3lzLnVzYi5jb25maWciLCB2YWwpCisgIGlmIHByb3BfbGlzdC5nZXRfdmFsdWUoInJvLmRhbHZpay52bS5lbmFibGVfdWZmZF9nYyIpID09ICJkZWZhdWx0IjoKKyAgICBhc3NlcnQga2VybmVsX3ZlcnNpb25fZmlsZV9mb3JfdWZmZF9nYyAhPSAiIgorICAgIGVuYWJsZV91ZmZkX2djID0gc2hvdWxkX2VuYWJsZV91ZmZkX2djKGtlcm5lbF92ZXJzaW9uX2ZpbGVfZm9yX3VmZmRfZ2MpCisgICAgcHJvcF9saXN0LnB1dCgicm8uZGFsdmlrLnZtLmVuYWJsZV91ZmZkX2djIiwKKyAgICAgICAgICAgICAgICAgICJ0cnVlIiBpZiBlbmFibGVfdWZmZF9nYyBlbHNlICJmYWxzZSIpCiAKLWRlZiB2YWxpZGF0ZV9ncmZfcHJvcHMocHJvcF9saXN0LCBzZGtfdmVyc2lvbik6CitkZWYgdmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BfbGlzdCk6CiAgICIiIlZhbGlkYXRlIEdSRiBwcm9wZXJ0aWVzIGlmIGV4aXN0LgogCi0gIElmIHJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCBpcyBkZWZpbmVkLCBjaGVjayBpZiBpdHMgdmFsdWUgaXMgdmFsaWQgZm9yIHRoZQotICBzZGsgdmVyc2lvbi4gVGhpcyBpcyBvbmx5IGZvciB0aGUgcmVsZWFzZSB2ZXJzaW9uLgotICBBbHNvLCB2YWxpZGF0ZSB0aGUgdmFsdWUgb2Ygcm8uYm9hcmQuYXBpX2xldmVsIGlmIGRlZmluZWQuCisgIElmIHJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCBpcyBkZWZpbmVkLCBjaGVjayBpZiBpdHMgdmFsdWUgaXMgdmFsaWQuCiAKICAgUmV0dXJuczoKICAgICBUcnVlIGlmIHRoZSBHUkYgcHJvcGVydGllcyBhcmUgdmFsaWQuCiAgICIiIgogICBncmZfYXBpX2xldmVsID0gcHJvcF9saXN0LmdldF92YWx1ZSgicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIikKICAgYm9hcmRfYXBpX2xldmVsID0gcHJvcF9saXN0LmdldF92YWx1ZSgicm8uYm9hcmQuYXBpX2xldmVsIikKLSAgcGxhdGZvcm1fdmVyc2lvbl9jb2RlbmFtZSA9IHByb3BfbGlzdC5nZXRfdmFsdWUoInJvLmJ1aWxkLnZlcnNpb24uY29kZW5hbWUiKQogCi0gIGlmIG5vdCBncmZfYXBpX2xldmVsOgotICAgIGlmIGJvYXJkX2FwaV9sZXZlbDoKLSAgICAgIHN5cy5zdGRlcnIud3JpdGUoImVycm9yOiBub24tR1JGIGRldmljZSBtdXN0IG5vdCBkZWZpbmUgIgotICAgICAgICAgICAgICAgICAgICAgICAicm8uYm9hcmQuYXBpX2xldmVsXG4iKQotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgIyBub24tR1JGIGRldmljZSBza2lwcyB0aGUgR1JGIHZhbGlkYXRpb24gdGVzdAotICAgIHJldHVybiBUcnVlCi0KLSAgZ3JmX2FwaV9sZXZlbCA9IGludChncmZfYXBpX2xldmVsKQotICBpZiBib2FyZF9hcGlfbGV2ZWw6CisgIGlmIGdyZl9hcGlfbGV2ZWwgYW5kIGJvYXJkX2FwaV9sZXZlbDoKKyAgICBncmZfYXBpX2xldmVsID0gaW50KGdyZl9hcGlfbGV2ZWwpCiAgICAgYm9hcmRfYXBpX2xldmVsID0gaW50KGJvYXJkX2FwaV9sZXZlbCkKICAgICBpZiBib2FyZF9hcGlfbGV2ZWwgPCBncmZfYXBpX2xldmVsOgotICAgICAgc3lzLnN0ZGVyci53cml0ZSgiZXJyb3I6IHJvLmJvYXJkLmFwaV9sZXZlbCglZCkgbXVzdCBiZSBncmVhdGVyIHRoYW4gIgorICAgICAgc3lzLnN0ZGVyci53cml0ZSgiZXJyb3I6IHJvLmJvYXJkLmFwaV9sZXZlbCglZCkgbXVzdCBub3QgYmUgbGVzcyB0aGFuICIKICAgICAgICAgICAgICAgICAgICAgICAgInJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCglZClcbiIKICAgICAgICAgICAgICAgICAgICAgICAgJSAoYm9hcmRfYXBpX2xldmVsLCBncmZfYXBpX2xldmVsKSkKICAgICAgIHJldHVybiBGYWxzZQogCi0gICMgc2tpcCBzZGsgdmVyc2lvbiB2YWxpZGF0aW9uIGZvciBkZXYtc3RhZ2Ugbm9uLVJFTCBkZXZpY2VzCi0gIGlmIHBsYXRmb3JtX3ZlcnNpb25fY29kZW5hbWUgIT0gIlJFTCI6Ci0gICAgcmV0dXJuIFRydWUKLQotICBpZiBncmZfYXBpX2xldmVsID4gc2RrX3ZlcnNpb246Ci0gICAgc3lzLnN0ZGVyci53cml0ZSgiZXJyb3I6IHJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCglZCkgbXVzdCBiZSBsZXNzIHRoYW4gIgotICAgICAgICAgICAgICAgICAgICAgIm9yIGVxdWFsIHRvIHJvLmJ1aWxkLnZlcnNpb24uc2RrKCVkKVxuIgotICAgICAgICAgICAgICAgICAgICAgJSAoZ3JmX2FwaV9sZXZlbCwgc2RrX3ZlcnNpb24pKQotICAgIHJldHVybiBGYWxzZQotCi0gIGlmIGJvYXJkX2FwaV9sZXZlbDoKLSAgICBpZiBib2FyZF9hcGlfbGV2ZWwgPiBzZGtfdmVyc2lvbjoKLSAgICAgIHN5cy5zdGRlcnIud3JpdGUoImVycm9yOiByby5ib2FyZC5hcGlfbGV2ZWwoJWQpIG11c3QgYmUgbGVzcyB0aGFuIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgImVxdWFsIHRvIHJvLmJ1aWxkLnZlcnNpb24uc2RrKCVkKVxuIgotICAgICAgICAgICAgICAgICAgICAgICAlIChib2FyZF9hcGlfbGV2ZWwsIHNka192ZXJzaW9uKSkKLSAgICAgIHJldHVybiBGYWxzZQotCiAgIHJldHVybiBUcnVlCiAKIGRlZiB2YWxpZGF0ZShwcm9wX2xpc3QpOgpAQCAtMjYxLDYgKzI0MCw3IEBACiAgIHBhcnNlci5hZGRfYXJndW1lbnQoImZpbGVuYW1lIikKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiZGlzYWxsb3dlZF9rZXlzIiwgbWV0YXZhcj0iS0VZIiwgdHlwZT1zdHIsIG5hcmdzPSIqIikKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1zZGstdmVyc2lvbiIsIHR5cGU9aW50LCByZXF1aXJlZD1UcnVlKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWtlcm5lbC12ZXJzaW9uLWZpbGUtZm9yLXVmZmQtZ2MiLCByZXF1aXJlZD1UcnVlKQogICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogCiAgIGlmIG5vdCBhcmdzLmZpbGVuYW1lLmVuZHN3aXRoKCIvYnVpbGQucHJvcCIpOgpAQCAtMjY4LDEwICsyNDgsMTAgQEAKICAgICBzeXMuZXhpdCgxKQogCiAgIHByb3BzID0gUHJvcExpc3QoYXJncy5maWxlbmFtZSkKLSAgbWFuZ2xlX2J1aWxkX3Byb3AocHJvcHMpCisgIG1hbmdsZV9idWlsZF9wcm9wKHByb3BzLCBhcmdzLmtlcm5lbF92ZXJzaW9uX2ZpbGVfZm9yX3VmZmRfZ2MpCiAgIGlmIG5vdCBvdmVycmlkZV9vcHRpb25hbF9wcm9wcyhwcm9wcywgYXJncy5hbGxvd19kdXApOgogICAgIHN5cy5leGl0KDEpCi0gIGlmIG5vdCB2YWxpZGF0ZV9ncmZfcHJvcHMocHJvcHMsIGFyZ3Muc2RrX3ZlcnNpb24pOgorICBpZiBub3QgdmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BzKToKICAgICBzeXMuZXhpdCgxKQogICBpZiBub3QgdmFsaWRhdGUocHJvcHMpOgogICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS90b29scy9wcm90b3MvbWV0YWRhdGFfZmlsZS5wcm90byBiL3Rvb2xzL3Byb3Rvcy9tZXRhZGF0YV9maWxlLnByb3RvCmluZGV4IGFjMTEyOWEuLjVjODk2MTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Byb3Rvcy9tZXRhZGF0YV9maWxlLnByb3RvCisrKyBiL3Rvb2xzL3Byb3Rvcy9tZXRhZGF0YV9maWxlLnByb3RvCkBAIC05Miw2ICs5Miw4IEBACiAgICAgU0JPTVJlZiBzYm9tX3JlZiA9IDEwOwogICB9CiAKKyAgLy8gSWRlbnRpZmllcnMgZm9yIHRoZSBwYWNrYWdlLgorICByZXBlYXRlZCBJZGVudGlmaWVyIGlkZW50aWZpZXIgPSAxMTsKIH0KIAogLy8gVVJMIGFzc29jaWF0ZWQgd2l0aCBhIHRoaXJkLXBhcnR5IHBhY2thZ2UuCkBAIC0yNzgsNCArMjgwLDE0OCBAQAogICAvLyBodHRwczovL3NwZHguZ2l0aHViLmlvL3NwZHgtc3BlYy92Mi4zL3BhY2thZ2UtaW5mb3JtYXRpb24vIzcyLXBhY2thZ2Utc3BkeC1pZGVudGlmaWVyLWZpZWxkIG9yCiAgIC8vIGh0dHBzOi8vc3BkeC5naXRodWIuaW8vc3BkeC1zcGVjL3YyLjMvZmlsZS1pbmZvcm1hdGlvbi8jODItZmlsZS1zcGR4LWlkZW50aWZpZXItZmllbGQKICAgb3B0aW9uYWwgc3RyaW5nIGVsZW1lbnRfaWQgPSAzOworfQorCisvLyBJZGVudGlmaWVyIGZvciBhIHRoaXJkLXBhcnR5IHBhY2thZ2UuCisvLyBTZWUgZ28vdHAtbWV0YWRhdGEtaWQuCittZXNzYWdlIElkZW50aWZpZXIgeworICAvLyBUaGUgdHlwZSBvZiB0aGUgaWRlbnRpZmllci4gRWl0aGVyIGFuICJlY29zeXN0ZW0iIHZhbHVlIGZyb20KKyAgLy8gaHR0cHM6Ly9vc3NmLmdpdGh1Yi5pby9vc3Ytc2NoZW1hLyNhZmZlY3RlZHBhY2thZ2UtZmllbGQgc3VjaCBhcyAiR28iLAorICAvLyAibnBtIiBvciAiUHlQSSIuIFRoZSAidmFsdWUiIGFuZCAidmVyc2lvbiIgZmllbGRzIGZvbGxvdyB0aGUgc2FtZSBydWxlcyBhcworICAvLyBkZWZpbmVkIGluIHRoZSBPU1Ygc3BlYy4KKworICAvLyBPciBvbmUgb2Y6CisgIC8vICAtICJHaXQiOiBUaGUgInZhbHVlIiBmaWVsZCBpcyB0aGUgVVJMIG9mIHRoZSB1cHN0cmVhbSBnaXQgcmVwb3NpdG9yeSB0aGlzCisgIC8vICBwYWNrYWdlIGlzIHJldHJpZXZlZCBmcm9tLgorICAvLyAgRm9yIGV4YW1wbGU6CisgIC8vICAgLSBodHRwczovL2dpdGh1Yi5jb20vZ2l0L2dpdAorICAvLyAgIC0gZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0CisgIC8vCisgIC8vICBVc2Ugb2YgYSBnaXQgVVJMIHJlcXVpcmVzIHRoYXQgdGhlIHBhY2thZ2UgInZlcnNpb24iIHZhbHVlIG11c3Qgc3BlY2lmeSBhCisgIC8vICBzcGVjaWZpYyBnaXQgdGFnIG9yIHJldmlzaW9uLiBUaGlzIG11c3Qgbm90IGJlIGEgYnJhbmNoIG5hbWUuCisgIC8vCisgIC8vICAtICJTVk4iOiBUaGUgInZhbHVlIiBmaWVsZCBpcyB0aGUgVVJMIG9mIHRoZSB1cHN0cmVhbSBTVk4gcmVwb3NpdG9yeSB0aGlzCisgIC8vICBwYWNrYWdlIGlzIHJldHJpZXZlZCBmcm9tLgorICAvLyAgRm9yIGV4YW1wbGU6CisgIC8vICAgLSBodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdC9sbHZtLworICAvLworICAvLyAgVXNlIG9mIGFuIFNWTiBVUkwgcmVxdWlyZXMgdGhhdCB0aGUgcGFja2FnZSAidmVyc2lvbiIgdmFsdWUgbXVzdCBzcGVjaWZ5CisgIC8vICBhIHNwZWNpZmljIFNWTiB0YWcgb3IgcmV2aXNpb24uIFRoaXMgbXVzdCBub3QgYmUgYSBicmFuY2ggbmFtZS4KKyAgLy8KKyAgLy8gIC0gIkhnIjogVGhlICJ2YWx1ZSIgZmllbGQgaXMgdGhlIFVSTCBvZiB0aGUgdXBzdHJlYW0gbWVyY3VyaWFsIHJlcG9zaXRvcnkKKyAgLy8gIHRoaXMgcGFja2FnZSBpcyByZXRyaWV2ZWQgZnJvbS4KKyAgLy8gIEZvciBleGFtcGxlOgorICAvLyAgIC0gaHR0cHM6Ly9tZXJjdXJpYWwtc2NtLm9yZy9yZXBvL2V2b2x2ZQorICAvLworICAvLyAgVXNlIG9mIGEgbWVyY3VyaWFsIFVSTCByZXF1aXJlcyB0aGF0IHRoZSBwYWNrYWdlICJ2ZXJzaW9uIiB2YWx1ZSBtdXN0CisgIC8vICBzcGVjaWZ5IGEgc3BlY2lmaWMgdGFnIG9yIHJldmlzaW9uLiBUaGlzIG11c3Qgbm90IGJlIGEgYnJhbmNoIG5hbWUuCisgIC8vCisgIC8vICAtICJEYXJjcyI6IHRoZSAidmFsdWUiIGZpZWxkIGlzIHRoZSBVUkwgb2YgdGhlIHVwc3RyZWFtIGRhcmNzIHJlcG9zaXRvcnkKKyAgLy8gIHRoaXMgcGFja2FnZSBpcyByZXRyaWV2ZWQgZnJvbS4KKyAgLy8gIEZvciBleGFtcGxlOgorICAvLyAgIC0gaHR0cHM6Ly9odWIuZGFyY3MubmV0L2h1LmR3aW0vaHUuZHdpbS51dGlsCisgIC8vCisgIC8vICBVc2Ugb2YgYSBEYXJjcyBVUkwgcmVxdWlyZXMgdGhhdCB0aGUgcGFja2FnZSAidmVyc2lvbiIgdmFsdWUgbXVzdAorICAvLyAgc3BlY2lmeSBhIHNwZWNpZmljIHRhZyBvciByZXZpc2lvbi4gVGhpcyBtdXN0IG5vdCBiZSBhIGJyYW5jaCBuYW1lLgorICAvLworICAvLyAgLSAiUGlwZXIiOiBUaGUgInZhbHVlIiBmaWVsZCBpcyB0aGUgVVJMIG9mIHRoZSB1cHN0cmVhbSBwaXBlciBsb2NhdGlvbi4KKyAgLy8gIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgd2hlbiBhIHBhY2thZ2UgaXMgYmVpbmcgbWlncmF0ZWQgaW50byB0aGlyZF9wYXJ0eQorICAvLyAgZnJvbSBlbHNld2hlcmUgaW4gUGlwZXIsIG9yIHdoZW4gYSBwYWNrYWdlIGlzIGJlaW5nIG5ld2x5IGRldmVsb3BlZCBpbgorICAvLyAgdGhpcmRfcGFydHkuCisgIC8vCisgIC8vICAtICJWQ1MiOiBUaGlzIGlzIGEgZ2VuZXJpYyBmYWxsYmFjayBmb3IgYW4gdW5saXN0ZWQgVkNTIHN5c3RlbS4gVGhlCisgIC8vICJ2YWx1ZSIgZmllbGQgaXMgdGhlIFVSTCBvZiB0aGUgcmVwb3NpdG9yeSBmb3IgdGhpcyBWQ1MuCisgIC8vCisgIC8vICAtICJBcmNoaXZlIjogVGhlICJ2YWx1ZSIgZmllbGQgaXMgdGhlIFVSTCBvZiB0aGUgYXJjaGl2ZSBjb250YWluaW5nIHRoZQorICAvLyAgc291cmNlIGNvZGUgZm9yIHRoZSBwYWNrYWdlLCBmb3IgZXhhbXBsZSBhIHppcCBvciB0Z3ogZmlsZS4KKyAgLy8KKyAgLy8gIC0gIlByZWJ1aWx0QnlBbHBoYWJldCI6IFRoaXMgdHlwZSBzaG91bGQgYmUgdXNlZCBmb3IgYXJjaGl2ZXMgb2YgcHJpbWFyaWx5CisgIC8vICBHb29nbGUtb3duZWQgc291cmNlIGNvZGUgKG1heSBjb250YWluIG5vbi1Hb29nbGUtb3duZWQgZGVwZW5kZW5jaWVzKSwKKyAgLy8gIHdoaWNoIGhhcyBiZWVuIGJ1aWx0IHVzaW5nIHByb2R1Y3Rpb24gR29vZ2xlIGluZnJhc3RydWN0dXJlLCBhbmQgY29waWVkCisgIC8vICBpbnRvIEFuZHJvaWQuIFRoZSAidmFsdWUiIGZpZWxkIGlzIHRoZSBVUkwgb2YgdGhlIHByZWJ1aWx0IGFydGlmYWN0IG9yCisgIC8vICB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgYXJ0aWZhY3QgdG8gdGhlIHJvb3Qgb2YgYSBwYWNrYWdlLgorICAvLyAgRXhhbXBsZToKKyAgLy8gICAgaWRlbnRpZmllciB7CisgIC8vICAgICAgdHlwZTogIlByZWJ1aWx0QnlBbHBoYWJldCIsCisgIC8vICAgICAgdmVyc2lvbjogIjEiLAorICAvLyAgICAgIHZhbHVlOiAidjEvYXJtODRfaGRwaS5hcGsiLAorICAvLyAgICB9CisgIC8vICAgIGlkZW50aWZpZXIgeworICAvLyAgICAgIHR5cGU6ICJQcmVidWlsdEJ5QWxwaGFiZXQiLAorICAvLyAgICAgIHZlcnNpb246ICIyIiwKKyAgLy8gICAgICB2YWx1ZTogInYyL3g4Nl82NF94aGRwaS5hcGsiLAorICAvLyAgICB9CisgIC8vCisgIC8vICAtICJMb2NhbFNvdXJjZSI6IFRoZSAidmFsdWUiIGZpZWxkIGlzIHRoZSBVUkwgaWRlbnRpZnlpbmcgd2hlcmUgdGhlIGxvY2FsCisgIC8vICBjb3B5IG9mIHRoZSBwYWNrYWdlIHNvdXJjZSBjb2RlIGNhbiBiZSBmb3VuZC4KKyAgLy8gIEV4YW1wbGVzOgorICAvLyAgIC0gaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vZXh0ZXJuYWwvYXBhY2hlLWh0dHAvCisgIC8vCisgIC8vICBUeXBpY2FsbHksIHRoZSBtZXRhZGF0YSBmaWxlcyBkZXNjcmliaW5nIGEgcGFja2FnZSByZXNpZGUgaW4gdGhlIHNhbWUKKyAgLy8gIGRpcmVjdG9yeSBhcyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBwYWNrYWdlLiBJbiBhIGZldyByYXJlIGNhc2VzIHdoZXJlCisgIC8vICB0aGV5IGFyZSBzZXBhcmF0ZSwgdGhlIExvY2FsU291cmNlIFVSTCBpZGVudGlmaWVzIHdoZXJlIHRvIGZpbmQgdGhlCisgIC8vICBzb3VyY2UgY29kZS4gVGhpcyBvbmx5IGRlc2NyaWJlcyB3aGVyZSB0byBmaW5kIHRoZSBsb2NhbCBjb3B5IG9mIHRoZQorICAvLyAgc291cmNlOyB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGFuIGFkZGl0aW9uYWwgVVJMIGRlc2NyaWJpbmcgd2hlcmUgdGhlCisgIC8vICBwYWNrYWdlIHdhcyByZXRyaWV2ZWQgZnJvbS4KKyAgLy8KKyAgLy8gIC0gIk90aGVyIjogQW4gaWRlbnRpZmllciB0aGF0IGRvZXMgbm90IGZpdCBhbnkgb3RoZXIgdHlwZS4gVGhpcyBtYXkgYWxzbworICAvLyAgaW5kaWNhdGUgdGhhdCB0aGUgU291cmNlIGNvZGUgd2FzIHJlY2VpdmVkIHZpYSBlbWFpbCBvciBzb21lIG90aGVyCisgIC8vICBvdXQtb2YtYmFuZCB3YXkuIFRoaXMgaXMgbW9zdCBjb21tb25seSB1c2VkIHdpdGggY29tbWVyY2lhbCBzb2Z0d2FyZQorICAvLyAgcmVjZWl2ZWQgZGlyZWN0bHkgZnJvbSB0aGUgVmVuZG9yLiBJbiB0aGUgY2FzZSBvZiBlbWFpbCwgdGhlICJ2YWx1ZSIgZmllbGQKKyAgLy8gIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgaXQgd2FzIHJlY2VpdmVkLgorICBvcHRpb25hbCBzdHJpbmcgdHlwZSA9IDE7CisKKyAgLy8gQSBodW1hbiByZWFkYWJsZSBzdHJpbmcgdG8gaW5kaWNhdGUgd2h5IGEgdGhpcmQtcGFja2FnZSBwYWNrYWdlIGRvZXMgbm90CisgIC8vIGhhdmUgdGhpcyBpZGVudGlmaWVyIHR5cGUgc2V0LgorICAvLyBFeGFtcGxlOgorICAvLyAgIGlkZW50aWZpZXIgeworICAvLyAgICAgdHlwZTogIlB5UEkiCisgIC8vICAgICBvbWlzc2lvbl9yZWFzb246ICJPbmx5IG9uIEdpdC4gTm90IHB1Ymxpc2hlZCB0byBQeVBJLiIKKyAgLy8gICB9CisgIG9wdGlvbmFsIHN0cmluZyBvbWlzc2lvbl9yZWFzb24gPSAyOworCisgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgcGFja2FnZSBpZGVudGlmaWVyIGFzIGRlZmluZWQgYnkgdGhlICJ0eXBlIi4KKyAgLy8gRXhhbXBsZToKKyAgLy8gIGlkZW50aWZpZXIgeworICAvLyAgICB0eXBlOiAiUHlQSSIKKyAgLy8gICAgdmFsdWU6ICJkamFuZ28iCisgIC8vICAgIHZlcnNpb246ICIzLjIuOCIKKyAgLy8gIH0KKyAgb3B0aW9uYWwgc3RyaW5nIHZhbHVlID0gMzsKKworICAvLyBUaGUgdmVyc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlIGFzIGRlZmluZWQgYnkgdGhlICJ0eXBlIi4KKyAgLy8gRXhhbXBsZToKKyAgLy8gIGlkZW50aWZpZXIgeworICAvLyAgICB0eXBlOiAiUHlQSSIKKyAgLy8gICAgdmFsdWU6ICJkamFuZ28iCisgIC8vICAgIHZlcnNpb246ICIzLjIuOCIKKyAgLy8gIH0KKyAgb3B0aW9uYWwgc3RyaW5nIHZlcnNpb24gPSA0OworCisgIC8vIFRoZSBjbG9zZXN0IHZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2FnZSBhcyBkZWZpbmVkIGJ5IHRoZSAidHlwZSIuCisgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgc2V0IGJ5IGF1dG9tYXRlZCBpbmZyYXN0cnVjdHVyZSBieSBhcHBseWluZyBhdXRvbWF0ZWQKKyAgLy8gaGV1cmlzdGljcywgc3VjaCBhcyB0aGUgY2xvc2VzdCBnaXQgdGFnIG9yIHBhY2thZ2UgdmVyc2lvbiBmcm9tIGEgcGFja2FnZQorICAvLyBtYW5pZmVzdCBmaWxlIChlLmcuIHBvbS54bWwpLgorICAvLworICAvLyBGb3IgbW9zdCBpZGVudGlmaWVyIHR5cGVzLCBvbmx5IG9uZSBvZiBgdmVyc2lvbmAgb3IgYGNsb3Nlc3RfdmVyc2lvbmAKKyAgLy8gc2hvdWxkIGJlIHNldCAobm90IGJvdGgpLiBUaGUgZXhjZXB0aW9uIGlzIHNvdXJjZSByZXBvc2l0b3J5IHR5cGVzIHN1Y2ggYXMKKyAgLy8gIkdpdCIsIHdoZXJlIGB2ZXJzaW9uYCB3aWxsIHJlZmVyIHRvIGEgZ2l0IGNvbW1pdCwgYW5kIGBjbG9zZXN0X3ZlcnNpb25gCisgIC8vIHJlZmVycyB0byBhIGdpdCB0YWcuCisgIC8vIEV4YW1wbGU6CisgIC8vICBpZGVudGlmaWVyIHsKKyAgLy8gICAgdHlwZTogIkdpdCIsCisgIC8vICAgIHZhbHVlOiAiaHR0cHM6Ly9naXRodWIuY29tL215L3JlcG8iCisgIC8vICAgIHZlcnNpb246ICJlNWZhNDRmMmIzMWMxZmI1NTNiNjAyMWU3MzYwZDA3ZDVkOTFmZjVlIgorICAvLyAgICBjbG9zZXN0X3ZlcnNpb246ICJ2MS40IgorICAvLyAgfQorICBvcHRpb25hbCBzdHJpbmcgY2xvc2VzdF92ZXJzaW9uID0gNTsKKworICAvLyBXaGVuIGB0cnVlYCwgdGhpcyBJZGVudGlmaWVyIHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlIHNvdXJjZQorICAvLyBjb2RlIGZvciB0aGlzIHBhY2thZ2Ugd2FzIG9yaWdpbmFsbHkgb2J0YWluZWQuIFRoaXMgc2hvdWxkIG9ubHkgYmUgc2V0IGZvcgorICAvLyAqb25lKiBJZGVudGlmaWVyIGluIGEgdGhpcmRfcGFydHkgcGFja2FnZSdzIE1FVEFEQVRBLgorCisgIC8vIEZvciBleHRlcm5hbCBwYWNrYWdlcywgdGhpcyBpcyB0eXBpY2FsbHkgZm9yIHRoZSBJZGVudGlmaWVyIGFzc29jaWF0ZWQKKyAgLy8gd2l0aCB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBvciBwYWNrYWdlIG1hbmFnZXIgdGhhdCB3YXMgdXNlZCB0bworICAvLyBjaGVjayBvdXQgb3IgZG93bmxvYWQgdGhlIGNvZGUuCisgIG9wdGlvbmFsIGJvb2wgcHJpbWFyeV9zb3VyY2UgPSA2OwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JiY3J1bi9BbmRyb2lkLmJwIGIvdG9vbHMvcmJjcnVuL0FuZHJvaWQuYnAKaW5kZXggZmNjMzNlZi4uNGZhYjg1OCAxMDA2NDQKLS0tIGEvdG9vbHMvcmJjcnVuL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvcmJjcnVuL0FuZHJvaWQuYnAKQEAgLTM0LDYgKzM0LDcgQEAKICAgICBwa2dQYXRoOiAicmJjcnVuIiwKICAgICBkZXBzOiBbCiAgICAgICAgICJnby1zdGFybGFyay1zdGFybGFyayIsCisgICAgICAgICJnby1zdGFybGFyay1zdGFybGFya2pzb24iLAogICAgICAgICAiZ28tc3Rhcmxhcmstc3RhcmxhcmtzdHJ1Y3QiLAogICAgICAgICAiZ28tc3Rhcmxhcmstc3Rhcmxhcmt0ZXN0IiwKICAgICBdLApkaWZmIC0tZ2l0IGEvdG9vbHMvcmJjcnVuL2dvLm1vZCBiL3Rvb2xzL3JiY3J1bi9nby5tb2QKaW5kZXggNWFlMjk3Mi4uNmU5OWNlOSAxMDA2NDQKLS0tIGEvdG9vbHMvcmJjcnVuL2dvLm1vZAorKysgYi90b29scy9yYmNydW4vZ28ubW9kCkBAIC00LDQgKzQsNCBAQAogCiByZXBsYWNlIGdvLnN0YXJsYXJrLm5ldCA9PiAuLi8uLi8uLi8uLi9leHRlcm5hbC9zdGFybGFyay1nbwogCi1nbyAxLjE1CitnbyAxLjIxCmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vaG9zdC5nbyBiL3Rvb2xzL3JiY3J1bi9ob3N0LmdvCmluZGV4IDMyYWZhNDUuLjhjZDI4NDUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JiY3J1bi9ob3N0LmdvCisrKyBiL3Rvb2xzL3JiY3J1bi9ob3N0LmdvCkBAIC0yNywxMCArMjcsMTYgQEAKIAkiZ28uc3RhcmxhcmsubmV0L3N0YXJsYXJrc3RydWN0IgogKQogCi1jb25zdCBjYWxsZXJEaXJLZXkgPSAiY2FsbGVyRGlyIgordHlwZSBFeGVjdXRpb25Nb2RlIGludAorY29uc3QgKAorCUV4ZWN1dGlvbk1vZGVSYmMgRXhlY3V0aW9uTW9kZSA9IGlvdGEKKwlFeGVjdXRpb25Nb2RlU2NsIEV4ZWN1dGlvbk1vZGUgPSBpb3RhCispCiAKLXZhciBMb2FkUGF0aFJvb3QgPSAiLiIKLXZhciBzaGVsbFBhdGggc3RyaW5nCitjb25zdCBhbGxvd0V4dGVybmFsRW50cnlwb2ludEtleSA9ICJhbGxvd0V4dGVybmFsRW50cnlwb2ludCIKK2NvbnN0IGNhbGxpbmdGaWxlS2V5ID0gImNhbGxpbmdGaWxlIgorY29uc3QgZXhlY3V0aW9uTW9kZUtleSA9ICJleGVjdXRpb25Nb2RlIgorY29uc3Qgc2hlbGxLZXkgPSAic2hlbGwiCiAKIHR5cGUgbW9kZW50cnkgc3RydWN0IHsKIAlnbG9iYWxzIHN0YXJsYXJrLlN0cmluZ0RpY3QKQEAgLTM5LDM2ICs0NSw5NyBAQAogCiB2YXIgbW9kdWxlQ2FjaGUgPSBtYWtlKG1hcFtzdHJpbmddKm1vZGVudHJ5KQogCi12YXIgYnVpbHRpbnMgc3RhcmxhcmsuU3RyaW5nRGljdAordmFyIHJiY0J1aWx0aW5zIHN0YXJsYXJrLlN0cmluZ0RpY3QgPSBzdGFybGFyay5TdHJpbmdEaWN0eworCSJzdHJ1Y3QiOiAgIHN0YXJsYXJrLk5ld0J1aWx0aW4oInN0cnVjdCIsIHN0YXJsYXJrc3RydWN0Lk1ha2UpLAorCS8vIFRvIGNvbnZlcnQgZmluZC1jb3B5LXN1YmRpciBhbmQgcHJvZHVjdC1jb3B5LWZpbGVzLWJ5IHBhdHRlcm4KKwkicmJsZl9maW5kX2ZpbGVzIjogc3RhcmxhcmsuTmV3QnVpbHRpbigicmJsZl9maW5kX2ZpbGVzIiwgZmluZCksCisJLy8gVG8gY29udmVydCBtYWtlZmlsZSdzICQoc2hlbGwgY21kKQorCSJyYmxmX3NoZWxsIjogc3RhcmxhcmsuTmV3QnVpbHRpbigicmJsZl9zaGVsbCIsIHNoZWxsKSwKKwkvLyBPdXRwdXQgdG8gc3RkZXJyCisJInJibGZfbG9nIjogc3RhcmxhcmsuTmV3QnVpbHRpbigicmJsZl9sb2ciLCBsb2cpLAorCS8vIFRvIGNvbnZlcnQgbWFrZWZpbGUncyAkKHdpbGRjYXJkIGZvbyopCisJInJibGZfd2lsZGNhcmQiOiBzdGFybGFyay5OZXdCdWlsdGluKCJyYmxmX3dpbGRjYXJkIiwgd2lsZGNhcmQpLAorfQogCi1mdW5jIG1vZHVsZU5hbWUyQWJzUGF0aChtb2R1bGVOYW1lIHN0cmluZywgY2FsbGVyRGlyIHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKLQlwYXRoIDo9IG1vZHVsZU5hbWUKLQlpZiBpeCA6PSBzdHJpbmdzLkxhc3RJbmRleChwYXRoLCAiOiIpOyBpeCA+PSAwIHsKLQkJcGF0aCA9IHBhdGhbMDppeF0gKyBzdHJpbmcob3MuUGF0aFNlcGFyYXRvcikgKyBwYXRoW2l4KzE6XQotCX0KLQlpZiBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAiLy8iKSB7Ci0JCXJldHVybiBmaWxlcGF0aC5BYnMoZmlsZXBhdGguSm9pbihMb2FkUGF0aFJvb3QsIHBhdGhbMjpdKSkKLQl9IGVsc2UgaWYgc3RyaW5ncy5IYXNQcmVmaXgobW9kdWxlTmFtZSwgIjoiKSB7Ci0JCXJldHVybiBmaWxlcGF0aC5BYnMoZmlsZXBhdGguSm9pbihjYWxsZXJEaXIsIHBhdGhbMTpdKSkKK3ZhciBzY2xCdWlsdGlucyBzdGFybGFyay5TdHJpbmdEaWN0ID0gc3RhcmxhcmsuU3RyaW5nRGljdHsKKwkic3RydWN0IjogICBzdGFybGFyay5OZXdCdWlsdGluKCJzdHJ1Y3QiLCBzdGFybGFya3N0cnVjdC5NYWtlKSwKK30KKworZnVuYyBpc1N5bWxpbmsoZmlsZXBhdGggc3RyaW5nKSAoYm9vbCwgZXJyb3IpIHsKKwlpZiBpbmZvLCBlcnIgOj0gb3MuTHN0YXQoZmlsZXBhdGgpOyBlcnIgPT0gbmlsIHsKKwkJcmV0dXJuIGluZm8uTW9kZSgpICYgb3MuTW9kZVN5bWxpbmsgIT0gMCwgbmlsCiAJfSBlbHNlIHsKLQkJcmV0dXJuIGZpbGVwYXRoLkFicyhwYXRoKQorCQlyZXR1cm4gZmFsc2UsIGVycgogCX0KIH0KIAorLy8gVGFrZXMgYSBtb2R1bGUgbmFtZSAodGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBsb2FkKCkgZnVuY3Rpb24pIGFuZCByZXR1cm5zIHRoZSBwYXRoCisvLyBpdCdzIHRyeWluZyB0byBsb2FkLCBzdHJpcHBpbmcgb3V0IGxlYWRpbmcgLy8sIGFuZCBoYW5kbGluZyBsZWFkaW5nIDpzLgorZnVuYyBjbGVhbk1vZHVsZU5hbWUobW9kdWxlTmFtZSBzdHJpbmcsIGNhbGxlckRpciBzdHJpbmcsIGFsbG93RXh0ZXJuYWxQYXRocyBib29sKSAoc3RyaW5nLCBlcnJvcikgeworCWlmIHN0cmluZ3MuQ291bnQobW9kdWxlTmFtZSwgIjoiKSA+IDEgeworCQlyZXR1cm4gIiIsIGZtdC5FcnJvcmYoImF0IG1vc3QgMSBjb2xvbiBtdXN0IGJlIHByZXNlbnQgaW4gc3RhcmxhcmsgcGF0aDogJXMiLCBtb2R1bGVOYW1lKQorCX0KKworCS8vIFdlIGRvbid0IGhhdmUgZnVsbCBzdXBwb3J0IGZvciBleHRlcm5hbCByZXBvc2l0b3JpZXMsIGJ1dCBhdCBsZWFzdCBzdXBwb3J0IHNreWxpYidzIGRpY3RzLgorCWlmIG1vZHVsZU5hbWUgPT0gIkBiYXplbF9za3lsaWIvL2xpYjpkaWN0cy5iemwiIHsKKwkJcmV0dXJuICJleHRlcm5hbC9iYXplbC1za3lsaWIvbGliL2RpY3RzLmJ6bCIsIG5pbAorCX0KKworCWxvY2FsTG9hZCA6PSBmYWxzZQorCWlmIHN0cmluZ3MuSGFzUHJlZml4KG1vZHVsZU5hbWUsICJALy8iKSB7CisJCW1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lWzM6XQorCX0gZWxzZSBpZiBzdHJpbmdzLkhhc1ByZWZpeChtb2R1bGVOYW1lLCAiLy8iKSB7CisJCW1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lWzI6XQorCX0gZWxzZSBpZiBzdHJpbmdzLkhhc1ByZWZpeChtb2R1bGVOYW1lLCAiOiIpIHsKKwkJbW9kdWxlTmFtZSA9IG1vZHVsZU5hbWVbMTpdCisJCWxvY2FsTG9hZCA9IHRydWUKKwl9IGVsc2UgaWYgIWFsbG93RXh0ZXJuYWxQYXRocyB7CisJCXJldHVybiAiIiwgZm10LkVycm9yZigibG9hZCBwYXRoIG11c3Qgc3RhcnQgd2l0aCAvLyBvciA6IikKKwl9CisKKwlpZiBpeCA6PSBzdHJpbmdzLkxhc3RJbmRleChtb2R1bGVOYW1lLCAiOiIpOyBpeCA+PSAwIHsKKwkJbW9kdWxlTmFtZSA9IG1vZHVsZU5hbWVbOml4XSArIHN0cmluZyhvcy5QYXRoU2VwYXJhdG9yKSArIG1vZHVsZU5hbWVbaXgrMTpdCisJfQorCisJaWYgZmlsZXBhdGguQ2xlYW4obW9kdWxlTmFtZSkgIT0gbW9kdWxlTmFtZSB7CisJCXJldHVybiAiIiwgZm10LkVycm9yZigibG9hZCBwYXRoIG11c3QgYmUgY2xlYW4sIGZvdW5kOiAlcywgZXhwZWN0ZWQ6ICVzIiwgbW9kdWxlTmFtZSwgZmlsZXBhdGguQ2xlYW4obW9kdWxlTmFtZSkpCisJfQorCWlmICFhbGxvd0V4dGVybmFsUGF0aHMgeworCQlpZiBzdHJpbmdzLkhhc1ByZWZpeChtb2R1bGVOYW1lLCAiLi4vIikgeworCQkJcmV0dXJuICIiLCBmbXQuRXJyb3JmKCJsb2FkIHBhdGggbXVzdCBub3Qgc3RhcnQgd2l0aCAuLi86ICVzIiwgbW9kdWxlTmFtZSkKKwkJfQorCQlpZiBzdHJpbmdzLkhhc1ByZWZpeChtb2R1bGVOYW1lLCAiLyIpIHsKKwkJCXJldHVybiAiIiwgZm10LkVycm9yZigibG9hZCBwYXRoIHN0YXJ0cyB3aXRoIC8sIHVzZSAvLyBmb3IgYSBhYnNvbHV0ZSBwYXRoOiAlcyIsIG1vZHVsZU5hbWUpCisJCX0KKwl9CisKKwlpZiBsb2NhbExvYWQgeworCQlyZXR1cm4gZmlsZXBhdGguSm9pbihjYWxsZXJEaXIsIG1vZHVsZU5hbWUpLCBuaWwKKwl9CisKKwlyZXR1cm4gbW9kdWxlTmFtZSwgbmlsCit9CisKIC8vIGxvYWRlciBpbXBsZW1lbnRzIGxvYWQgc3RhdGVtZW50LiBUaGUgZm9ybWF0IG9mIHRoZSBsb2FkZWQgbW9kdWxlIFVSSSBpcwogLy8gIFsvL3BhdGhdOmJhc2VbfHN5bWJvbF0KIC8vIFRoZSBmaWxlIHBhdGggaXMgJFJPT1QvcGF0aC9iYXNlIGlmIHBhdGggaXMgcHJlc2VudCwgPGNhbGxlcl9kaXI+L2Jhc2Ugb3RoZXJ3aXNlLgogLy8gVGhlIHByZXNlbmNlIG9mIGB8c3ltYm9sYCBpbmRpY2F0ZXMgdGhhdCB0aGUgbG9hZGVyIHNob3VsZCByZXR1cm4gYSBzaW5nbGUgJ3N5bWJvbCcKIC8vIGJvdW5kIHRvIE5vbmUgaWYgZmlsZSBpcyBtaXNzaW5nLgogZnVuYyBsb2FkZXIodGhyZWFkICpzdGFybGFyay5UaHJlYWQsIG1vZHVsZSBzdHJpbmcpIChzdGFybGFyay5TdHJpbmdEaWN0LCBlcnJvcikgewotCXBpcGVQb3MgOj0gc3RyaW5ncy5MYXN0SW5kZXgobW9kdWxlLCAifCIpCi0JbXVzdExvYWQgOj0gcGlwZVBvcyA8IDAKKwltb2RlIDo9IHRocmVhZC5Mb2NhbChleGVjdXRpb25Nb2RlS2V5KS4oRXhlY3V0aW9uTW9kZSkKKwlhbGxvd0V4dGVybmFsRW50cnlwb2ludCA6PSB0aHJlYWQuTG9jYWwoYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnRLZXkpLihib29sKQogCXZhciBkZWZhdWx0U3ltYm9sIHN0cmluZwotCWlmICFtdXN0TG9hZCB7Ci0JCWRlZmF1bHRTeW1ib2wgPSBtb2R1bGVbcGlwZVBvcysxOl0KLQkJbW9kdWxlID0gbW9kdWxlWzpwaXBlUG9zXQorCW11c3RMb2FkIDo9IHRydWUKKwlpZiBtb2RlID09IEV4ZWN1dGlvbk1vZGVSYmMgeworCQlwaXBlUG9zIDo9IHN0cmluZ3MuTGFzdEluZGV4KG1vZHVsZSwgInwiKQorCQlpZiBwaXBlUG9zID49IDAgeworCQkJbXVzdExvYWQgPSBmYWxzZQorCQkJZGVmYXVsdFN5bWJvbCA9IG1vZHVsZVtwaXBlUG9zKzE6XQorCQkJbW9kdWxlID0gbW9kdWxlWzpwaXBlUG9zXQorCQl9CiAJfQotCW1vZHVsZVBhdGgsIGVyciA6PSBtb2R1bGVOYW1lMkFic1BhdGgobW9kdWxlLCB0aHJlYWQuTG9jYWwoY2FsbGVyRGlyS2V5KS4oc3RyaW5nKSkKKwljYWxsaW5nRmlsZSA6PSB0aHJlYWQuTG9jYWwoY2FsbGluZ0ZpbGVLZXkpLihzdHJpbmcpCisJbW9kdWxlUGF0aCwgZXJyIDo9IGNsZWFuTW9kdWxlTmFtZShtb2R1bGUsIGZpbGVwYXRoLkRpcihjYWxsaW5nRmlsZSksIGFsbG93RXh0ZXJuYWxFbnRyeXBvaW50KQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gbmlsLCBlcnIKIAl9CkBAIC05MCw2ICsxNTcsMjAgQEAKIAogCQkvLyBMb2FkIG9yIHJldHVybiBkZWZhdWx0CiAJCWlmIG11c3RMb2FkIHsKKwkJCWlmIHN0cmluZ3MuSGFzU3VmZml4KGNhbGxpbmdGaWxlLCAiLnNjbCIpICYmICFzdHJpbmdzLkhhc1N1ZmZpeChtb2R1bGVQYXRoLCAiLnNjbCIpIHsKKwkJCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCIuc2NsIGZpbGVzIGNhbiBvbmx5IGxvYWQgb3RoZXIgLnNjbCBmaWxlczogJXEgbG9hZHMgJXEiLCBjYWxsaW5nRmlsZSwgbW9kdWxlUGF0aCkKKwkJCX0KKwkJCS8vIFN3aXRjaCBpbnRvIHNjbCBtb2RlIGZyb20gaGVyZSBvbgorCQkJaWYgc3RyaW5ncy5IYXNTdWZmaXgobW9kdWxlUGF0aCwgIi5zY2wiKSB7CisJCQkJbW9kZSA9IEV4ZWN1dGlvbk1vZGVTY2wKKwkJCX0KKworCQkJaWYgc3ltLCBlcnIgOj0gaXNTeW1saW5rKG1vZHVsZVBhdGgpOyBzeW0gJiYgZXJyID09IG5pbCB7CisJCQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigic3ltbGlua3MgdG8gc3RhcmxhcmsgZmlsZXMgYXJlIG5vdCBhbGxvd2VkLiBJbnN0ZWFkLCBsb2FkIHRoZSB0YXJnZXQgZmlsZSBhbmQgcmUtZXhwb3J0IGl0cyBzeW1ib2xzOiAlcyIsIG1vZHVsZVBhdGgpCisJCQl9IGVsc2UgaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIG5pbCwgZXJyCisJCQl9CisKIAkJCWNoaWxkVGhyZWFkIDo9ICZzdGFybGFyay5UaHJlYWR7TmFtZTogImV4ZWMgIiArIG1vZHVsZSwgTG9hZDogdGhyZWFkLkxvYWR9CiAJCQkvLyBDaGVhdGluZyBmb3IgdGhlIHNha2Ugb2YgdGVzdGluZzoKIAkJCS8vIHByb3BhZ2F0ZSBzdGFybGFya3Rlc3QncyBSZXBvcnRlciBrZXksIG90aGVyd2lzZSB0ZXN0aW5nCkBAIC05OSw5ICsxODAsMjAgQEAKIAkJCQljaGlsZFRocmVhZC5TZXRMb2NhbCh0ZXN0UmVwb3J0ZXJLZXksIHYpCiAJCQl9CiAKLQkJCWNoaWxkVGhyZWFkLlNldExvY2FsKGNhbGxlckRpcktleSwgZmlsZXBhdGguRGlyKG1vZHVsZVBhdGgpKQotCQkJZ2xvYmFscywgZXJyIDo9IHN0YXJsYXJrLkV4ZWNGaWxlKGNoaWxkVGhyZWFkLCBtb2R1bGVQYXRoLCBuaWwsIGJ1aWx0aW5zKQotCQkJZSA9ICZtb2RlbnRyeXtnbG9iYWxzLCBlcnJ9CisJCQkvLyBPbmx5IHRoZSBlbnRyeXBvaW50IHN0YXJsYXJrIGZpbGUgYWxsb3dzIGV4dGVybmFsIGxvYWRzLgorCQkJY2hpbGRUaHJlYWQuU2V0TG9jYWwoYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnRLZXksIGZhbHNlKQorCQkJY2hpbGRUaHJlYWQuU2V0TG9jYWwoY2FsbGluZ0ZpbGVLZXksIG1vZHVsZVBhdGgpCisJCQljaGlsZFRocmVhZC5TZXRMb2NhbChleGVjdXRpb25Nb2RlS2V5LCBtb2RlKQorCQkJY2hpbGRUaHJlYWQuU2V0TG9jYWwoc2hlbGxLZXksIHRocmVhZC5Mb2NhbChzaGVsbEtleSkpCisJCQlpZiBtb2RlID09IEV4ZWN1dGlvbk1vZGVSYmMgeworCQkJCWdsb2JhbHMsIGVyciA6PSBzdGFybGFyay5FeGVjRmlsZShjaGlsZFRocmVhZCwgbW9kdWxlUGF0aCwgbmlsLCByYmNCdWlsdGlucykKKwkJCQllID0gJm1vZGVudHJ5e2dsb2JhbHMsIGVycn0KKwkJCX0gZWxzZSBpZiBtb2RlID09IEV4ZWN1dGlvbk1vZGVTY2wgeworCQkJCWdsb2JhbHMsIGVyciA6PSBzdGFybGFyay5FeGVjRmlsZShjaGlsZFRocmVhZCwgbW9kdWxlUGF0aCwgbmlsLCBzY2xCdWlsdGlucykKKwkJCQllID0gJm1vZGVudHJ5e2dsb2JhbHMsIGVycn0KKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigidW5rbm93biBleGVjdXRpb25Nb2RlICVkIiwgbW9kZSkKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCWUgPSAmbW9kZW50cnl7c3RhcmxhcmsuU3RyaW5nRGljdHtkZWZhdWx0U3ltYm9sOiBzdGFybGFyay5Ob25lfSwgbmlsfQogCQl9CkBAIC0xODksMTIgKzI4MSwxMyBAQAogLy8gaXRzIG91dHB1dCB0aGUgc2FtZSB3YXkgYXMgTWFrZSdzICQoc2hlbGwgKSBmdW5jdGlvbi4gVGhlIGVuZC1vZi1saW5lcwogLy8gKCJcbiIgb3IgIlxyXG4iKSBhcmUgcmVwbGFjZWQgd2l0aCAiICIgaW4gdGhlIHJlc3VsdCwgYW5kIHRoZSB0cmFpbGluZwogLy8gZW5kLW9mLWxpbmUgaXMgcmVtb3ZlZC4KLWZ1bmMgc2hlbGwoXyAqc3RhcmxhcmsuVGhyZWFkLCBiICpzdGFybGFyay5CdWlsdGluLCBhcmdzIHN0YXJsYXJrLlR1cGxlLAorZnVuYyBzaGVsbCh0aHJlYWQgKnN0YXJsYXJrLlRocmVhZCwgYiAqc3RhcmxhcmsuQnVpbHRpbiwgYXJncyBzdGFybGFyay5UdXBsZSwKIAlrd2FyZ3MgW11zdGFybGFyay5UdXBsZSkgKHN0YXJsYXJrLlZhbHVlLCBlcnJvcikgewogCXZhciBjb21tYW5kIHN0cmluZwogCWlmIGVyciA6PSBzdGFybGFyay5VbnBhY2tQb3NpdGlvbmFsQXJncyhiLk5hbWUoKSwgYXJncywga3dhcmdzLCAxLCAmY29tbWFuZCk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4gc3RhcmxhcmsuTm9uZSwgZXJyCiAJfQorCXNoZWxsUGF0aCA6PSB0aHJlYWQuTG9jYWwoc2hlbGxLZXkpLihzdHJpbmcpCiAJaWYgc2hlbGxQYXRoID09ICIiIHsKIAkJcmV0dXJuIHN0YXJsYXJrLk5vbmUsCiAJCQlmbXQuRXJyb3JmKCJjYW5ub3QgcnVuIHNoZWxsLCAvYmluL3NoIGlzIG1pc3NpbmcgKHJ1bm5pbmcgb24gV2luZG93cz8pIikKQEAgLTIyMywxNiArMzE2LDYgQEAKIAlyZXR1cm4gc3RhcmxhcmsuTmV3TGlzdChlbGVtcykKIH0KIAotLy8gcHJvcHNldEZyb21FbnYgY29uc3RydWN0cyBhIHByb3BzZXQgZnJvbSB0aGUgYXJyYXkgb2YgS0VZPXZhbHVlIHN0cmluZ3MKLWZ1bmMgc3RydWN0RnJvbUVudihlbnYgW11zdHJpbmcpICpzdGFybGFya3N0cnVjdC5TdHJ1Y3QgewotCXNkIDo9IG1ha2UobWFwW3N0cmluZ11zdGFybGFyay5WYWx1ZSwgbGVuKGVudikpCi0JZm9yIF8sIHggOj0gcmFuZ2UgZW52IHsKLQkJa3YgOj0gc3RyaW5ncy5TcGxpdE4oeCwgIj0iLCAyKQotCQlzZFtrdlswXV0gPSBzdGFybGFyay5TdHJpbmcoa3ZbMV0pCi0JfQotCXJldHVybiBzdGFybGFya3N0cnVjdC5Gcm9tU3RyaW5nRGljdChzdGFybGFya3N0cnVjdC5EZWZhdWx0LCBzZCkKLX0KLQogZnVuYyBsb2codGhyZWFkICpzdGFybGFyay5UaHJlYWQsIGZuICpzdGFybGFyay5CdWlsdGluLCBhcmdzIHN0YXJsYXJrLlR1cGxlLCBrd2FyZ3MgW11zdGFybGFyay5UdXBsZSkgKHN0YXJsYXJrLlZhbHVlLCBlcnJvcikgewogCXNlcCA6PSAiICIKIAlpZiBlcnIgOj0gc3RhcmxhcmsuVW5wYWNrQXJncygicHJpbnQiLCBuaWwsIGt3YXJncywgInNlcD8iLCAmc2VwKTsgZXJyICE9IG5pbCB7CkBAIC0yNTUsNTAgKzMzOCw3OSBAQAogCXJldHVybiBzdGFybGFyay5Ob25lLCBuaWwKIH0KIAotZnVuYyBzZXR1cChlbnYgW11zdHJpbmcpIHsKLQkvLyBDcmVhdGUgdGhlIHN5bWJvbHMgdGhhdCBhaWQgbWFrZWZpbGUgY29udmVyc2lvbi4gU2VlIFJFQURNRS5tZAotCWJ1aWx0aW5zID0gc3RhcmxhcmsuU3RyaW5nRGljdHsKLQkJInN0cnVjdCI6ICAgc3RhcmxhcmsuTmV3QnVpbHRpbigic3RydWN0Iiwgc3RhcmxhcmtzdHJ1Y3QuTWFrZSksCi0JCSJyYmxmX2NsaSI6IHN0cnVjdEZyb21FbnYoZW52KSwKLQkJInJibGZfZW52Ijogc3RydWN0RnJvbUVudihvcy5FbnZpcm9uKCkpLAotCQkvLyBUbyBjb252ZXJ0IGZpbmQtY29weS1zdWJkaXIgYW5kIHByb2R1Y3QtY29weS1maWxlcy1ieSBwYXR0ZXJuCi0JCSJyYmxmX2ZpbmRfZmlsZXMiOiBzdGFybGFyay5OZXdCdWlsdGluKCJyYmxmX2ZpbmRfZmlsZXMiLCBmaW5kKSwKLQkJLy8gVG8gY29udmVydCBtYWtlZmlsZSdzICQoc2hlbGwgY21kKQotCQkicmJsZl9zaGVsbCI6IHN0YXJsYXJrLk5ld0J1aWx0aW4oInJibGZfc2hlbGwiLCBzaGVsbCksCi0JCS8vIE91dHB1dCB0byBzdGRlcnIKLQkJInJibGZfbG9nIjogc3RhcmxhcmsuTmV3QnVpbHRpbigicmJsZl9sb2ciLCBsb2cpLAotCQkvLyBUbyBjb252ZXJ0IG1ha2VmaWxlJ3MgJCh3aWxkY2FyZCBmb28qKQotCQkicmJsZl93aWxkY2FyZCI6IHN0YXJsYXJrLk5ld0J1aWx0aW4oInJibGZfd2lsZGNhcmQiLCB3aWxkY2FyZCksCi0JfQotCi0JLy8gTk9URShhc211bmRhayk6IE9TLXNwZWNpZmljLiBCZWhhdmUgc2ltaWxhciB0byBMaW51eCBgc3lzdGVtYCBjYWxsLAotCS8vIHdoaWNoIGFsd2F5cyB1c2VzIC9iaW4vc2ggdG8gcnVuIHRoZSBjb21tYW5kCi0Jc2hlbGxQYXRoID0gIi9iaW4vc2giCi0JaWYgXywgZXJyIDo9IG9zLlN0YXQoc2hlbGxQYXRoKTsgZXJyICE9IG5pbCB7Ci0JCXNoZWxsUGF0aCA9ICIiCi0JfQotfQotCiAvLyBQYXJzZXMsIHJlc29sdmVzLCBhbmQgZXhlY3V0ZXMgYSBTdGFybGFyayBmaWxlLgogLy8gZmlsZW5hbWUgYW5kIHNyYyBwYXJhbWV0ZXJzIGFyZSBhcyBmb3Igc3RhcmxhcmsuRXhlY0ZpbGU6CiAvLyAqIGZpbGVuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGV4ZWN1dGUsCiAvLyAgIGFuZCB0aGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4gZXJyb3IgbWVzc2FnZXM7CiAvLyAqIHNyYyBpcyBhbiBvcHRpb25hbCBzb3VyY2Ugb2YgYnl0ZXMgdG8gdXNlIGluc3RlYWQgb2YgZmlsZW5hbWUKIC8vICAgKGl0IGNhbiBiZSBhIHN0cmluZywgb3IgYSBieXRlIGFycmF5LCBvciBhbiBpby5SZWFkZXIgaW5zdGFuY2UpCi0vLyAqIGNvbW1hbmRWYXJzIGlzIGFuIGFycmF5IG9mICJWQVI9dmFsdWUiIGl0ZW1zLiBUaGV5IGFyZSBhY2Nlc3NpYmxlIGZyb20KLS8vICAgdGhlIHN0YXJsYXJrIHNjcmlwdCBhcyBtZW1iZXJzIG9mIHRoZSBgcmJsZl9jbGlgIHByb3BzZXQuCi1mdW5jIFJ1bihmaWxlbmFtZSBzdHJpbmcsIHNyYyBpbnRlcmZhY2V7fSwgY29tbWFuZFZhcnMgW11zdHJpbmcpIGVycm9yIHsKLQlzZXR1cChjb21tYW5kVmFycykKKy8vIFJldHVybnMgdGhlIHRvcC1sZXZlbCBzdGFybGFyayB2YXJpYWJsZXMsIHRoZSBsaXN0IG9mIHN0YXJsYXJrIGZpbGVzIGxvYWRlZCwgYW5kIGFuIGVycm9yCitmdW5jIFJ1bihmaWxlbmFtZSBzdHJpbmcsIHNyYyBpbnRlcmZhY2V7fSwgbW9kZSBFeGVjdXRpb25Nb2RlLCBhbGxvd0V4dGVybmFsRW50cnlwb2ludCBib29sKSAoc3RhcmxhcmsuU3RyaW5nRGljdCwgW11zdHJpbmcsIGVycm9yKSB7CisJLy8gTk9URShhc211bmRhayk6IE9TLXNwZWNpZmljLiBCZWhhdmUgc2ltaWxhciB0byBMaW51eCBgc3lzdGVtYCBjYWxsLAorCS8vIHdoaWNoIGFsd2F5cyB1c2VzIC9iaW4vc2ggdG8gcnVuIHRoZSBjb21tYW5kCisJc2hlbGxQYXRoIDo9ICIvYmluL3NoIgorCWlmIF8sIGVyciA6PSBvcy5TdGF0KHNoZWxsUGF0aCk7IGVyciAhPSBuaWwgeworCQlzaGVsbFBhdGggPSAiIgorCX0KIAogCW1haW5UaHJlYWQgOj0gJnN0YXJsYXJrLlRocmVhZHsKIAkJTmFtZTogICJtYWluIiwKLQkJUHJpbnQ6IGZ1bmMoXyAqc3RhcmxhcmsuVGhyZWFkLCBtc2cgc3RyaW5nKSB7IGZtdC5QcmludGxuKG1zZykgfSwKKwkJUHJpbnQ6IGZ1bmMoXyAqc3RhcmxhcmsuVGhyZWFkLCBtc2cgc3RyaW5nKSB7CisJCQlpZiBtb2RlID09IEV4ZWN1dGlvbk1vZGVSYmMgeworCQkJCS8vIEluIHJiYyBtb2RlLCByYmxmX2xvZyBpcyB1c2VkIHRvIHByaW50IHRvIHN0ZGVycgorCQkJCWZtdC5QcmludGxuKG1zZykKKwkJCX0gZWxzZSBpZiBtb2RlID09IEV4ZWN1dGlvbk1vZGVTY2wgeworCQkJCWZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIG1zZykKKwkJCX0KKwkJfSwKIAkJTG9hZDogIGxvYWRlciwKIAl9Ci0JYWJzUGF0aCwgZXJyIDo9IGZpbGVwYXRoLkFicyhmaWxlbmFtZSkKLQlpZiBlcnIgPT0gbmlsIHsKLQkJbWFpblRocmVhZC5TZXRMb2NhbChjYWxsZXJEaXJLZXksIGZpbGVwYXRoLkRpcihhYnNQYXRoKSkKLQkJXywgZXJyID0gc3RhcmxhcmsuRXhlY0ZpbGUobWFpblRocmVhZCwgYWJzUGF0aCwgc3JjLCBidWlsdGlucykKKwlmaWxlbmFtZSwgZXJyIDo9IGZpbGVwYXRoLkFicyhmaWxlbmFtZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKIAl9Ci0JcmV0dXJuIGVycgorCWlmIHdkLCBlcnIgOj0gb3MuR2V0d2QoKTsgZXJyID09IG5pbCB7CisJCWZpbGVuYW1lLCBlcnIgPSBmaWxlcGF0aC5SZWwod2QsIGZpbGVuYW1lKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBuaWwsIG5pbCwgZXJyCisJCX0KKwkJaWYgIWFsbG93RXh0ZXJuYWxFbnRyeXBvaW50ICYmIHN0cmluZ3MuSGFzUHJlZml4KGZpbGVuYW1lLCAiLi4vIikgeworCQkJcmV0dXJuIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJwYXRoIGNvdWxkIG5vdCBiZSBtYWRlIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSByb290OiAlcyIsIGZpbGVuYW1lKQorCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwl9CisKKwlpZiBzeW0sIGVyciA6PSBpc1N5bWxpbmsoZmlsZW5hbWUpOyBzeW0gJiYgZXJyID09IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZm10LkVycm9yZigic3ltbGlua3MgdG8gc3RhcmxhcmsgZmlsZXMgYXJlIG5vdCBhbGxvd2VkLiBJbnN0ZWFkLCBsb2FkIHRoZSB0YXJnZXQgZmlsZSBhbmQgcmUtZXhwb3J0IGl0cyBzeW1ib2xzOiAlcyIsIGZpbGVuYW1lKQorCX0gZWxzZSBpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwl9CisKKwlpZiBtb2RlID09IEV4ZWN1dGlvbk1vZGVTY2wgJiYgIXN0cmluZ3MuSGFzU3VmZml4KGZpbGVuYW1lLCAiLnNjbCIpIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJmaWxlbmFtZSBtdXN0IGVuZCBpbiAuc2NsOiAlcyIsIGZpbGVuYW1lKQorCX0KKworCS8vIEFkZCB0b3AtbGV2ZWwgZmlsZSB0byBjYWNoZSBmb3IgY3ljbGUgZGV0ZWN0aW9uIHB1cnBvc2VzCisJbW9kdWxlQ2FjaGVbZmlsZW5hbWVdID0gbmlsCisKKwl2YXIgcmVzdWx0cyBzdGFybGFyay5TdHJpbmdEaWN0CisJbWFpblRocmVhZC5TZXRMb2NhbChhbGxvd0V4dGVybmFsRW50cnlwb2ludEtleSwgYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnQpCisJbWFpblRocmVhZC5TZXRMb2NhbChjYWxsaW5nRmlsZUtleSwgZmlsZW5hbWUpCisJbWFpblRocmVhZC5TZXRMb2NhbChleGVjdXRpb25Nb2RlS2V5LCBtb2RlKQorCW1haW5UaHJlYWQuU2V0TG9jYWwoc2hlbGxLZXksIHNoZWxsUGF0aCkKKwlpZiBtb2RlID09IEV4ZWN1dGlvbk1vZGVSYmMgeworCQlyZXN1bHRzLCBlcnIgPSBzdGFybGFyay5FeGVjRmlsZShtYWluVGhyZWFkLCBmaWxlbmFtZSwgc3JjLCByYmNCdWlsdGlucykKKwl9IGVsc2UgaWYgbW9kZSA9PSBFeGVjdXRpb25Nb2RlU2NsIHsKKwkJcmVzdWx0cywgZXJyID0gc3RhcmxhcmsuRXhlY0ZpbGUobWFpblRocmVhZCwgZmlsZW5hbWUsIHNyYywgc2NsQnVpbHRpbnMpCisJfSBlbHNlIHsKKwkJcmV0dXJuIHJlc3VsdHMsIG5pbCwgZm10LkVycm9yZigidW5rbm93biBleGVjdXRpb25Nb2RlICVkIiwgbW9kZSkKKwl9CisJbG9hZGVkU3RhcmxhcmtGaWxlcyA6PSBtYWtlKFtdc3RyaW5nLCAwLCBsZW4obW9kdWxlQ2FjaGUpKQorCWZvciBmaWxlIDo9IHJhbmdlIG1vZHVsZUNhY2hlIHsKKwkJbG9hZGVkU3RhcmxhcmtGaWxlcyA9IGFwcGVuZChsb2FkZWRTdGFybGFya0ZpbGVzLCBmaWxlKQorCX0KKwlzb3J0LlN0cmluZ3MobG9hZGVkU3RhcmxhcmtGaWxlcykKKworCXJldHVybiByZXN1bHRzLCBsb2FkZWRTdGFybGFya0ZpbGVzLCBlcnIKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JiY3J1bi9ob3N0X3Rlc3QuZ28gYi90b29scy9yYmNydW4vaG9zdF90ZXN0LmdvCmluZGV4IDk3ZjZjZTkuLjM4YjI5MjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JiY3J1bi9ob3N0X3Rlc3QuZ28KKysrIGIvdG9vbHMvcmJjcnVuL2hvc3RfdGVzdC5nbwpAQCAtMTksNiArMTksNyBAQAogCSJvcyIKIAkicGF0aC9maWxlcGF0aCIKIAkicnVudGltZSIKKwkic3RyaW5ncyIKIAkidGVzdGluZyIKIAogCSJnby5zdGFybGFyay5uZXQvcmVzb2x2ZSIKQEAgLTUzLDggKzU0LDcgQEAKIH0KIAogLy8gQ29tbW9uIHNldHVwIGZvciB0aGUgdGVzdHM6IGNyZWF0ZSB0aHJlYWQsIGNoYW5nZSB0byB0aGUgdGVzdCBkaXJlY3RvcnkKLWZ1bmMgdGVzdFNldHVwKHQgKnRlc3RpbmcuVCwgZW52IFtdc3RyaW5nKSAqc3RhcmxhcmsuVGhyZWFkIHsKLQlzZXR1cChlbnYpCitmdW5jIHRlc3RTZXR1cCh0ICp0ZXN0aW5nLlQpICpzdGFybGFyay5UaHJlYWQgewogCXRocmVhZCA6PSAmc3RhcmxhcmsuVGhyZWFkewogCQlMb2FkOiBmdW5jKHRocmVhZCAqc3RhcmxhcmsuVGhyZWFkLCBtb2R1bGUgc3RyaW5nKSAoc3RhcmxhcmsuU3RyaW5nRGljdCwgZXJyb3IpIHsKIAkJCWlmIG1vZHVsZSA9PSAiYXNzZXJ0LnN0YXIiIHsKQEAgLTcyLDE0ICs3MiwxNSBAQAogZnVuYyBkYXRhRGlyKCkgc3RyaW5nIHsKIAlfLCB0aGlzU3JjRmlsZSwgXywgXyA6PSBydW50aW1lLkNhbGxlcigwKQogCXJldHVybiBmaWxlcGF0aC5Kb2luKGZpbGVwYXRoLkRpcih0aGlzU3JjRmlsZSksICJ0ZXN0ZGF0YSIpCi0KIH0KIAogZnVuYyBleGVyY2lzZVN0YXJsYXJrVGVzdEZpbGUodCAqdGVzdGluZy5ULCBzdGFyRmlsZSBzdHJpbmcpIHsKIAkvLyBJbiBvcmRlciB0byB1c2UgImFzc2VydC5zdGFyIiBmcm9tIGdvL3N0YXJsYXJrLm5ldC9zdGFybGFya3Rlc3QgaW4gdGhlIHRlc3RzLCBwcm92aWRlOgogCS8vICAqIGxvYWQgZnVuY3Rpb24gdGhhdCBoYW5kbGVzICJhc3NlcnQuc3RhciIKIAkvLyAgKiBzdGFybGFya3Rlc3QuRGF0YUZpbGUgZnVuY3Rpb24gdGhhdCBmaW5kcyBpdHMgbG9jYXRpb24KLQlzZXR1cChuaWwpCisJaWYgZXJyIDo9IG9zLkNoZGlyKGRhdGFEaXIoKSk7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CiAJdGhyZWFkIDo9ICZzdGFybGFyay5UaHJlYWR7CiAJCUxvYWQ6IGZ1bmModGhyZWFkICpzdGFybGFyay5UaHJlYWQsIG1vZHVsZSBzdHJpbmcpIChzdGFybGFyay5TdHJpbmdEaWN0LCBlcnJvcikgewogCQkJaWYgbW9kdWxlID09ICJhc3NlcnQuc3RhciIgewpAQCAtOTAsMjEgKzkxLDkgQEAKIAlzdGFybGFya3Rlc3QuU2V0UmVwb3J0ZXIodGhyZWFkLCB0KQogCV8sIHRoaXNTcmNGaWxlLCBfLCBfIDo9IHJ1bnRpbWUuQ2FsbGVyKDApCiAJZmlsZW5hbWUgOj0gZmlsZXBhdGguSm9pbihmaWxlcGF0aC5EaXIodGhpc1NyY0ZpbGUpLCBzdGFyRmlsZSkKLQlpZiBfLCBlcnIgOj0gc3RhcmxhcmsuRXhlY0ZpbGUodGhyZWFkLCBmaWxlbmFtZSwgbmlsLCBidWlsdGlucyk7IGVyciAhPSBuaWwgewotCQlpZiBlcnIsIG9rIDo9IGVyci4oKnN0YXJsYXJrLkV2YWxFcnJvcik7IG9rIHsKLQkJCXQuRmF0YWwoZXJyLkJhY2t0cmFjZSgpKQotCQl9Ci0JCXQuRmF0YWwoZXJyKQotCX0KLX0KLQotZnVuYyBUZXN0Q2xpQW5kRW52KHQgKnRlc3RpbmcuVCkgewotCS8vIFRPRE8oYXNtdW5kYWspOiBjb252ZXJ0IHRoaXMgdG8gdXNlIGV4ZXJjaXNlU3RhcmxhcmtUZXN0RmlsZQotCWlmIGVyciA6PSBvcy5TZXRlbnYoIlRFU1RfRU5WSVJPTk1FTlRfRk9PIiwgInRlc3RfZW52aXJvbm1lbnRfZm9vIik7IGVyciAhPSBuaWwgewotCQl0LkZhdGFsKGVycikKLQl9Ci0JdGhyZWFkIDo9IHRlc3RTZXR1cCh0LCBbXXN0cmluZ3siQ0xJX0ZPTz1mb28ifSkKLQlpZiBfLCBlcnIgOj0gc3RhcmxhcmsuRXhlY0ZpbGUodGhyZWFkLCAiY2xpX2FuZF9lbnYuc3RhciIsIG5pbCwgYnVpbHRpbnMpOyBlcnIgIT0gbmlsIHsKKwl0aHJlYWQuU2V0TG9jYWwoZXhlY3V0aW9uTW9kZUtleSwgRXhlY3V0aW9uTW9kZVJiYykKKwl0aHJlYWQuU2V0TG9jYWwoc2hlbGxLZXksICIvYmluL3NoIikKKwlpZiBfLCBlcnIgOj0gc3RhcmxhcmsuRXhlY0ZpbGUodGhyZWFkLCBmaWxlbmFtZSwgbmlsLCByYmNCdWlsdGlucyk7IGVyciAhPSBuaWwgewogCQlpZiBlcnIsIG9rIDo9IGVyci4oKnN0YXJsYXJrLkV2YWxFcnJvcik7IG9rIHsKIAkJCXQuRmF0YWwoZXJyLkJhY2t0cmFjZSgpKQogCQl9CkBAIC0xMTQsMTEgKzEwMyw4IEBACiAKIGZ1bmMgVGVzdEZpbGVPcHModCAqdGVzdGluZy5UKSB7CiAJLy8gVE9ETyhhc211bmRhayk6IGNvbnZlcnQgdGhpcyB0byB1c2UgZXhlcmNpc2VTdGFybGFya1Rlc3RGaWxlCi0JaWYgZXJyIDo9IG9zLlNldGVudigiVEVTVF9EQVRBX0RJUiIsIGRhdGFEaXIoKSk7IGVyciAhPSBuaWwgewotCQl0LkZhdGFsKGVycikKLQl9Ci0JdGhyZWFkIDo9IHRlc3RTZXR1cCh0LCBuaWwpCi0JaWYgXywgZXJyIDo9IHN0YXJsYXJrLkV4ZWNGaWxlKHRocmVhZCwgImZpbGVfb3BzLnN0YXIiLCBuaWwsIGJ1aWx0aW5zKTsgZXJyICE9IG5pbCB7CisJdGhyZWFkIDo9IHRlc3RTZXR1cCh0KQorCWlmIF8sIGVyciA6PSBzdGFybGFyay5FeGVjRmlsZSh0aHJlYWQsICJmaWxlX29wcy5zdGFyIiwgbmlsLCByYmNCdWlsdGlucyk7IGVyciAhPSBuaWwgewogCQlpZiBlcnIsIG9rIDo9IGVyci4oKnN0YXJsYXJrLkV2YWxFcnJvcik7IG9rIHsKIAkJCXQuRmF0YWwoZXJyLkJhY2t0cmFjZSgpKQogCQl9CkBAIC0xMjgsNyArMTE0LDcgQEAKIAogZnVuYyBUZXN0TG9hZCh0ICp0ZXN0aW5nLlQpIHsKIAkvLyBUT0RPKGFzbXVuZGFrKTogY29udmVydCB0aGlzIHRvIHVzZSBleGVyY2lzZVN0YXJsYXJrVGVzdEZpbGUKLQl0aHJlYWQgOj0gdGVzdFNldHVwKHQsIG5pbCkKKwl0aHJlYWQgOj0gdGVzdFNldHVwKHQpCiAJdGhyZWFkLkxvYWQgPSBmdW5jKHRocmVhZCAqc3RhcmxhcmsuVGhyZWFkLCBtb2R1bGUgc3RyaW5nKSAoc3RhcmxhcmsuU3RyaW5nRGljdCwgZXJyb3IpIHsKIAkJaWYgbW9kdWxlID09ICJhc3NlcnQuc3RhciIgewogCQkJcmV0dXJuIHN0YXJsYXJrdGVzdC5Mb2FkQXNzZXJ0TW9kdWxlKCkKQEAgLTEzNyw5ICsxMjMsMTMgQEAKIAkJfQogCX0KIAlkaXIgOj0gZGF0YURpcigpCi0JdGhyZWFkLlNldExvY2FsKGNhbGxlckRpcktleSwgZGlyKQotCUxvYWRQYXRoUm9vdCA9IGZpbGVwYXRoLkRpcihkaXIpCi0JaWYgXywgZXJyIDo9IHN0YXJsYXJrLkV4ZWNGaWxlKHRocmVhZCwgImxvYWQuc3RhciIsIG5pbCwgYnVpbHRpbnMpOyBlcnIgIT0gbmlsIHsKKwlpZiBlcnIgOj0gb3MuQ2hkaXIoZmlsZXBhdGguRGlyKGRpcikpOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCXRocmVhZC5TZXRMb2NhbChhbGxvd0V4dGVybmFsRW50cnlwb2ludEtleSwgZmFsc2UpCisJdGhyZWFkLlNldExvY2FsKGNhbGxpbmdGaWxlS2V5LCAidGVzdGRhdGEvbG9hZC5zdGFyIikKKwl0aHJlYWQuU2V0TG9jYWwoZXhlY3V0aW9uTW9kZUtleSwgRXhlY3V0aW9uTW9kZVJiYykKKwlpZiBfLCBlcnIgOj0gc3RhcmxhcmsuRXhlY0ZpbGUodGhyZWFkLCAidGVzdGRhdGEvbG9hZC5zdGFyIiwgbmlsLCByYmNCdWlsdGlucyk7IGVyciAhPSBuaWwgewogCQlpZiBlcnIsIG9rIDo9IGVyci4oKnN0YXJsYXJrLkV2YWxFcnJvcik7IG9rIHsKIAkJCXQuRmF0YWwoZXJyLkJhY2t0cmFjZSgpKQogCQl9CkBAIC0xNDcsOSArMTM3LDcwIEBACiAJfQogfQogCi1mdW5jIFRlc3RTaGVsbCh0ICp0ZXN0aW5nLlQpIHsKLQlpZiBlcnIgOj0gb3MuU2V0ZW52KCJURVNUX0RBVEFfRElSIiwgZGF0YURpcigpKTsgZXJyICE9IG5pbCB7CitmdW5jIFRlc3RCemxMb2Fkc1NjbCh0ICp0ZXN0aW5nLlQpIHsKKwltb2R1bGVDYWNoZSA9IG1ha2UobWFwW3N0cmluZ10qbW9kZW50cnkpCisJZGlyIDo9IGRhdGFEaXIoKQorCWlmIGVyciA6PSBvcy5DaGRpcihmaWxlcGF0aC5EaXIoZGlyKSk7IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKGVycikKIAl9CisJdmFycywgXywgZXJyIDo9IFJ1bigidGVzdGRhdGEvYnpsX2xvYWRzX3NjbC5iemwiLCBuaWwsIEV4ZWN1dGlvbk1vZGVSYmMsIGZhbHNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJaWYgdmFsLCBvayA6PSB2YXJzWyJmb28iXTsgIW9rIHsKKwkJdC5GYXRhbGYoIkZhaWxlZCB0byBsb2FkIGZvbyB2YXJpYWJsZSIpCisJfSBlbHNlIGlmIHZhbC4oc3RhcmxhcmsuU3RyaW5nKSAhPSAiYmFyIiB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCBcImJhclwiLCBnb3QgJXEiLCB2YWwpCisJfQorfQorCitmdW5jIFRlc3ROb25FbnRyeXBvaW50QnpsTG9hZHNTY2wodCAqdGVzdGluZy5UKSB7CisJbW9kdWxlQ2FjaGUgPSBtYWtlKG1hcFtzdHJpbmddKm1vZGVudHJ5KQorCWRpciA6PSBkYXRhRGlyKCkKKwlpZiBlcnIgOj0gb3MuQ2hkaXIoZmlsZXBhdGguRGlyKGRpcikpOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCXZhcnMsIF8sIGVyciA6PSBSdW4oInRlc3RkYXRhL2J6bF9sb2Fkc19zY2xfMi5iemwiLCBuaWwsIEV4ZWN1dGlvbk1vZGVSYmMsIGZhbHNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJaWYgdmFsLCBvayA6PSB2YXJzWyJmb28iXTsgIW9rIHsKKwkJdC5GYXRhbGYoIkZhaWxlZCB0byBsb2FkIGZvbyB2YXJpYWJsZSIpCisJfSBlbHNlIGlmIHZhbC4oc3RhcmxhcmsuU3RyaW5nKSAhPSAiYmFyIiB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCBcImJhclwiLCBnb3QgJXEiLCB2YWwpCisJfQorfQorCitmdW5jIFRlc3RTY2xMb2Fkc0J6bCh0ICp0ZXN0aW5nLlQpIHsKKwltb2R1bGVDYWNoZSA9IG1ha2UobWFwW3N0cmluZ10qbW9kZW50cnkpCisJZGlyIDo9IGRhdGFEaXIoKQorCWlmIGVyciA6PSBvcy5DaGRpcihmaWxlcGF0aC5EaXIoZGlyKSk7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJXywgXywgZXJyIDo9IFJ1bigidGVzdGRhdGEvc2NsX2luY29ycmVjdGx5X2xvYWRzX2J6bC5zY2wiLCBuaWwsIEV4ZWN1dGlvbk1vZGVTY2wsIGZhbHNlKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBmYWlsdXJlIikKKwl9CisJaWYgIXN0cmluZ3MuQ29udGFpbnMoZXJyLkVycm9yKCksICIuc2NsIGZpbGVzIGNhbiBvbmx5IGxvYWQgb3RoZXIgLnNjbCBmaWxlcyIpIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGVkIGVycm9yIHRvIGNvbnRhaW4gXCIuc2NsIGZpbGVzIGNhbiBvbmx5IGxvYWQgb3RoZXIgLnNjbCBmaWxlc1wiOiAlcSIsIGVyci5FcnJvcigpKQorCX0KK30KKworZnVuYyBUZXN0Q2FudExvYWRTeW1saW5rKHQgKnRlc3RpbmcuVCkgeworCW1vZHVsZUNhY2hlID0gbWFrZShtYXBbc3RyaW5nXSptb2RlbnRyeSkKKwlkaXIgOj0gZGF0YURpcigpCisJaWYgZXJyIDo9IG9zLkNoZGlyKGZpbGVwYXRoLkRpcihkaXIpKTsgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlfLCBfLCBlcnIgOj0gUnVuKCJ0ZXN0ZGF0YS90ZXN0X3NjbF9zeW1saW5rLnNjbCIsIG5pbCwgRXhlY3V0aW9uTW9kZVNjbCwgZmFsc2UpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIGZhaWx1cmUiKQorCX0KKwlpZiAhc3RyaW5ncy5Db250YWlucyhlcnIuRXJyb3IoKSwgInN5bWxpbmtzIHRvIHN0YXJsYXJrIGZpbGVzIGFyZSBub3QgYWxsb3dlZCIpIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGVkIGVycm9yIHRvIGNvbnRhaW4gXCJzeW1saW5rcyB0byBzdGFybGFyayBmaWxlcyBhcmUgbm90IGFsbG93ZWRcIjogJXEiLCBlcnIuRXJyb3IoKSkKKwl9Cit9CisKK2Z1bmMgVGVzdFNoZWxsKHQgKnRlc3RpbmcuVCkgewogCWV4ZXJjaXNlU3RhcmxhcmtUZXN0RmlsZSh0LCAidGVzdGRhdGEvc2hlbGwuc3RhciIpCiB9CmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vcmJjcnVuL3JiY3J1bi5nbyBiL3Rvb2xzL3JiY3J1bi9yYmNydW4vcmJjcnVuLmdvCmluZGV4IDRkYjZhMGIuLjhjMzcyYzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JiY3J1bi9yYmNydW4vcmJjcnVuLmdvCisrKyBiL3Rvb2xzL3JiY3J1bi9yYmNydW4vcmJjcnVuLmdvCkBAIC0xNyw1MiArMTcsMTM4IEBACiBpbXBvcnQgKAogCSJmbGFnIgogCSJmbXQiCi0JImdvLnN0YXJsYXJrLm5ldC9zdGFybGFyayIKIAkib3MiCiAJInJiY3J1biIKKwkicmVnZXhwIgogCSJzdHJpbmdzIgorCisJImdvLnN0YXJsYXJrLm5ldC9zdGFybGFyayIKICkKIAogdmFyICgKLQlleGVjcHJvZyA9IGZsYWcuU3RyaW5nKCJjIiwgIiIsICJleGVjdXRlIHByb2dyYW0gYHByb2dgIikKKwlhbGxvd0V4dGVybmFsRW50cnlwb2ludCA9IGZsYWcuQm9vbCgiYWxsb3dfZXh0ZXJuYWxfZW50cnlwb2ludCIsIGZhbHNlLCAiYWxsb3cgdGhlIGVudHJ5cG9pbnQgc3RhcmxhcmsgZmlsZSB0byBiZSBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgdHJlZSIpCisJbW9kZUZsYWcgID0gZmxhZy5TdHJpbmcoIm1vZGUiLCAiIiwgInRoZSBnZW5lcmFsIGJlaGF2aW9yIG9mIHJiY3J1bi4gQ2FuIGJlIFwicmJjXCIgb3IgXCJtYWtlXCIuIFJlcXVpcmVkLiIpCiAJcm9vdGRpciAgPSBmbGFnLlN0cmluZygiZCIsICIuIiwgInRoZSB2YWx1ZSBvZiAvLyBmb3IgbG9hZCBwYXRocyIpCi0JZmlsZSAgICAgPSBmbGFnLlN0cmluZygiZiIsICIiLCAiZmlsZSB0byBleGVjdXRlIikKIAlwZXJmRmlsZSA9IGZsYWcuU3RyaW5nKCJwZXJmIiwgIiIsICJzYXZlIHBlcmZvcm1hbmNlIGRhdGEiKQorCWlkZW50aWZpZXJSZSA9IHJlZ2V4cC5NdXN0Q29tcGlsZSgiW2EtekEtWl9dW2EtekEtWjAtOV9dKiIpCiApCiAKLWZ1bmMgbWFpbigpIHsKLQlmbGFnLlBhcnNlKCkKLQlmaWxlbmFtZSA6PSAqZmlsZQotCXZhciBzcmMgaW50ZXJmYWNle30KLQl2YXIgZW52IFtdc3RyaW5nCitmdW5jIGdldEVudHJ5cG9pbnRTdGFybGFya0ZpbGUoKSBzdHJpbmcgeworCWZpbGVuYW1lIDo9ICIiCiAKLQlyYyA6PSAwCiAJZm9yIF8sIGFyZyA6PSByYW5nZSBmbGFnLkFyZ3MoKSB7Ci0JCWlmIHN0cmluZ3MuQ29udGFpbnMoYXJnLCAiPSIpIHsKLQkJCWVudiA9IGFwcGVuZChlbnYsIGFyZykKLQkJfSBlbHNlIGlmIGZpbGVuYW1lID09ICIiIHsKKwkJaWYgZmlsZW5hbWUgPT0gIiIgewogCQkJZmlsZW5hbWUgPSBhcmcKIAkJfSBlbHNlIHsKIAkJCXF1aXQoIm9ubHkgb25lIGZpbGUgY2FuIGJlIGV4ZWN1dGVkXG4iKQogCQl9CiAJfQotCWlmICpleGVjcHJvZyAhPSAiIiB7Ci0JCWlmIGZpbGVuYW1lICE9ICIiIHsKLQkJCXF1aXQoImVpdGhlciAtYyBvciBmaWxlIG5hbWUgc2hvdWxkIGJlIHByZXNlbnRcbiIpCi0JCX0KLQkJZmlsZW5hbWUgPSAiPGNtZGxpbmU+IgotCQlzcmMgPSAqZXhlY3Byb2cKLQl9CiAJaWYgZmlsZW5hbWUgPT0gIiIgewotCQlpZiBsZW4oZW52KSA+IDAgewotCQkJZm10LkZwcmludGxuKG9zLlN0ZGVyciwKLQkJCQkibm8gZmlsZSB0byBydW4gLS0gaWYgeW91ciBmaWxlJ3MgbmFtZSBjb250YWlucyAnPScsIHVzZSAtZiB0byBzcGVjaWZ5IGl0IikKLQkJfQogCQlmbGFnLlVzYWdlKCkKIAkJb3MuRXhpdCgxKQogCX0KLQlpZiBzdGF0LCBlcnIgOj0gb3MuU3RhdCgqcm9vdGRpcik7IG9zLklzTm90RXhpc3QoZXJyKSB8fCAhc3RhdC5Jc0RpcigpIHsKLQkJcXVpdCgiJXMgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCAqcm9vdGRpcikKKwlyZXR1cm4gZmlsZW5hbWUKK30KKworZnVuYyBnZXRNb2RlKCkgcmJjcnVuLkV4ZWN1dGlvbk1vZGUgeworCXN3aXRjaCAqbW9kZUZsYWcgeworCWNhc2UgInJiYyI6CisJCXJldHVybiByYmNydW4uRXhlY3V0aW9uTW9kZVJiYworCWNhc2UgIm1ha2UiOgorCQlyZXR1cm4gcmJjcnVuLkV4ZWN1dGlvbk1vZGVTY2wKKwljYXNlICIiOgorCQlxdWl0KCItbW9kZSBmbGFnIGlzIHJlcXVpcmVkLiIpCisJZGVmYXVsdDoKKwkJcXVpdCgiVW5rbm93biAtbW9kZSB2YWx1ZSAlcSwgZXhwZWN0ZWQgMSBvZiBcInJiY1wiLCBcIm1ha2VcIiIsICptb2RlRmxhZykKKwl9CisJcmV0dXJuIHJiY3J1bi5FeGVjdXRpb25Nb2RlU2NsCit9CisKK3ZhciBtYWtlU3RyaW5nUmVwbGFjZXIgPSBzdHJpbmdzLk5ld1JlcGxhY2VyKCIjIiwgIlxcIyIsICIkIiwgIiQkIikKKworZnVuYyBjbGVhblN0cmluZ0Zvck1ha2UocyBzdHJpbmcpIChzdHJpbmcsIGVycm9yKSB7CisJaWYgc3RyaW5ncy5Db250YWluc0FueShzLCAiXFxcbiIpIHsKKwkJLy8gXFwgaW4gbWFrZSBpcyBsaXRlcmFsbHkgXFwsIG5vdCBhIHNpbmdsZSBcLCBzbyB3ZSBjYW4ndCBhbGxvdyB0aGVtLgorCQkvLyBcPG5ld2xpbmU+IGluIG1ha2Ugd2lsbCBwcm9kdWNlIGEgc3BhY2UsIG5vdCBhIG5ld2xpbmUuCisJCXJldHVybiAiIiwgZm10LkVycm9yZigic3Rhcmxhcmsgc3RyaW5ncyBleHBvcnRlZCB0byBtYWtlIGNhbm5vdCBjb250YWluIGJhY2tzbGFzaGVzIG9yIG5ld2xpbmVzIikKKwl9CisJcmV0dXJuIG1ha2VTdHJpbmdSZXBsYWNlci5SZXBsYWNlKHMpLCBuaWwKK30KKworZnVuYyBnZXRWYWx1ZUluTWFrZUZvcm1hdCh2YWx1ZSBzdGFybGFyay5WYWx1ZSwgYWxsb3dMaXN0cyBib29sKSAoc3RyaW5nLCBlcnJvcikgeworCXN3aXRjaCB2IDo9IHZhbHVlLih0eXBlKSB7CisJY2FzZSBzdGFybGFyay5TdHJpbmc6CisJCWlmIGNsZWFuZWRWYWx1ZSwgZXJyIDo9IGNsZWFuU3RyaW5nRm9yTWFrZSh2LkdvU3RyaW5nKCkpOyBlcnIgPT0gbmlsIHsKKwkJCXJldHVybiBjbGVhbmVkVmFsdWUsIG5pbAorCQl9IGVsc2UgeworCQkJcmV0dXJuICIiLCBlcnIKKwkJfQorCWNhc2Ugc3RhcmxhcmsuSW50OgorCQlyZXR1cm4gdi5TdHJpbmcoKSwgbmlsCisJY2FzZSAqc3RhcmxhcmsuTGlzdDoKKwkJaWYgIWFsbG93TGlzdHMgeworCQkJcmV0dXJuICIiLCBmbXQuRXJyb3JmKCJuZXN0ZWQgbGlzdHMgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIGV4cG9ydGVkIGZyb20gc3RhcmxhcmsgdG8gbWFrZSwgZmxhdHRlbiB0aGUgbGlzdCBpbiBzdGFybGFyayBmaXJzdCIpCisJCX0KKwkJcmVzdWx0IDo9ICIiCisJCWZvciBpIDo9IDA7IGkgPCB2LkxlbigpOyBpKysgeworCQkJdmFsdWUsIGVyciA6PSBnZXRWYWx1ZUluTWFrZUZvcm1hdCh2LkluZGV4KGkpLCBmYWxzZSkKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiAiIiwgZXJyCisJCQl9CisJCQlpZiBpID4gMCB7CisJCQkJcmVzdWx0ICs9ICIgIgorCQkJfQorCQkJcmVzdWx0ICs9IHZhbHVlCisJCX0KKwkJcmV0dXJuIHJlc3VsdCwgbmlsCisJZGVmYXVsdDoKKwkJcmV0dXJuICIiLCBmbXQuRXJyb3JmKCJvbmx5IHN0YXJsYXJrIHN0cmluZ3MsIGludHMsIGFuZCBsaXN0cyBvZiBzdHJpbmdzL2ludHMgY2FuIGJlIGV4cG9ydGVkIHRvIG1ha2UuIFBsZWFzZSBjb252ZXJ0IGFsbCBvdGhlciB0eXBlcyBpbiBzdGFybGFyayBmaXJzdC4gRm91bmQgdHlwZTogJXMiLCB2YWx1ZS5UeXBlKCkpCisJfQorfQorCitmdW5jIHByaW50VmFyc0luTWFrZUZvcm1hdChnbG9iYWxzIHN0YXJsYXJrLlN0cmluZ0RpY3QpIGVycm9yIHsKKwkvLyBXZSBjb3VsZCBqdXN0IGRpcmVjdGx5IGV4cG9ydCB0b3AgbGV2ZWwgdmFyaWFibGVzIGJ5IG5hbWUgaW5zdGVhZCBvZiBnb2luZyB0aHJvdWdoCisJLy8gYSB2YXJpYWJsZXNfdG9fZXhwb3J0X3RvX21ha2UgZGljdGlvbmFyeSwgYnV0IHRoYXQgd291bGRuJ3QgYWxsb3cgZm9yIGV4cG9ydGluZyBhCisJLy8gcnVudGltZS1kZWZpbmVkIG51bWJlciBvZiB2YXJpYWJsZXMgdG8gbWFrZS4gVGhpcyBjYW4gYmUgaW1wb3J0YW50IGJlY2F1c2UgZGljdGlvbmFyaWVzCisJLy8gaW4gbWFrZSBhcmUgb2Z0ZW4gcmVwcmVzZW50ZWQgYnkgYSB1bmlxdWUgdmFyaWFibGUgZm9yIGV2ZXJ5IGtleSBpbiB0aGUgZGljdGlvbmFyeS4KKwl2YXJpYWJsZXNWYWx1ZSwgb2sgOj0gZ2xvYmFsc1sidmFyaWFibGVzX3RvX2V4cG9ydF90b19tYWtlIl0KKwlpZiAhb2sgeworCQlyZXR1cm4gZm10LkVycm9yZigiZXhwZWN0ZWQgdG9wLWxldmVsIHN0YXJsYXJrIGZpbGUgdG8gaGF2ZSBhIFwidmFyaWFibGVzX3RvX2V4cG9ydF90b19tYWtlXCIgdmFyaWFibGUiKQorCX0KKwl2YXJpYWJsZXMsIG9rIDo9IHZhcmlhYmxlc1ZhbHVlLigqc3RhcmxhcmsuRGljdCkKKwlpZiAhb2sgeworCQlyZXR1cm4gZm10LkVycm9yZigiZXhwZWN0ZWQgdmFyaWFibGVzX3RvX2V4cG9ydF90b19tYWtlIHRvIGJlIGEgZGljdCwgZ290ICVzIiwgdmFyaWFibGVzVmFsdWUuVHlwZSgpKQorCX0KKworCWZvciBfLCB2YXJUdXBsZSA6PSByYW5nZSB2YXJpYWJsZXMuSXRlbXMoKSB7CisJCXZhck5hbWVTdGFybGFyaywgb2sgOj0gdmFyVHVwbGUuSW5kZXgoMCkuKHN0YXJsYXJrLlN0cmluZykKKwkJaWYgIW9rIHsKKwkJCXJldHVybiBmbXQuRXJyb3JmKCJhbGwga2V5cyBpbiB2YXJpYWJsZXNfdG9fZXhwb3J0X3RvX21ha2UgbXVzdCBiZSBzdHJpbmdzLCBidXQgZ290ICVxIiwgdmFyVHVwbGUuSW5kZXgoMCkuVHlwZSgpKQorCQl9CisJCXZhck5hbWUgOj0gdmFyTmFtZVN0YXJsYXJrLkdvU3RyaW5nKCkKKwkJaWYgIWlkZW50aWZpZXJSZS5NYXRjaFN0cmluZyh2YXJOYW1lKSB7CisJCQlyZXR1cm4gZm10LkVycm9yZigiYWxsIHZhcmlhYmxlcyBhdCB0aGUgdG9wIGxldmVsIHN0YXJsYXJrIGZpbGUgbXVzdCBiZSB2YWxpZCBjIGlkZW50aWZpZXJzLCBidXQgZ290ICVxIiwgdmFyTmFtZSkKKwkJfQorCQlpZiB2YXJOYW1lID09ICJMT0FERURfU1RBUkxBUktfRklMRVMiIHsKKwkJCXJldHVybiBmbXQuRXJyb3JmKCJ0aGUgbmFtZSBMT0FERURfU1RBUkxBUktfRklMRVMgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgc3RhcmxhcmsgaW50ZXJwcmV0ZXIiKQorCQl9CisJCXZhbHVlTWFrZSwgZXJyIDo9IGdldFZhbHVlSW5NYWtlRm9ybWF0KHZhclR1cGxlLkluZGV4KDEpLCB0cnVlKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQkvLyBUaGUgOj0kPSBpcyBzcGVjaWFsIEthdGkgc3ludGF4IHRoYXQgbWVhbnMgInNldCBhbmQgbWFrZSByZWFkb25seSIKKwkJZm10LlByaW50ZigiJXMgOj0kPSAlc1xuIiwgdmFyTmFtZSwgdmFsdWVNYWtlKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgbWFpbigpIHsKKwlmbGFnLlBhcnNlKCkKKwlmaWxlbmFtZSA6PSBnZXRFbnRyeXBvaW50U3RhcmxhcmtGaWxlKCkKKwltb2RlIDo9IGdldE1vZGUoKQorCisJaWYgb3MuQ2hkaXIoKnJvb3RkaXIpICE9IG5pbCB7CisJCXF1aXQoImNvdWxkIG5vdCBjaGRpciB0byAlc1xuIiwgKnJvb3RkaXIpCiAJfQogCWlmICpwZXJmRmlsZSAhPSAiIiB7CiAJCXBwcm9mLCBlcnIgOj0gb3MuQ3JlYXRlKCpwZXJmRmlsZSkKQEAgLTc0LDggKzE2MCw4IEBACiAJCQlxdWl0KCIlc1xuIiwgZXJyKQogCQl9CiAJfQotCXJiY3J1bi5Mb2FkUGF0aFJvb3QgPSAqcm9vdGRpcgotCWVyciA6PSByYmNydW4uUnVuKGZpbGVuYW1lLCBzcmMsIGVudikKKwl2YXJpYWJsZXMsIGxvYWRlZFN0YXJsYXJrRmlsZXMsIGVyciA6PSByYmNydW4uUnVuKGZpbGVuYW1lLCBuaWwsIG1vZGUsICphbGxvd0V4dGVybmFsRW50cnlwb2ludCkKKwlyYyA6PSAwCiAJaWYgKnBlcmZGaWxlICE9ICIiIHsKIAkJaWYgZXJyMiA6PSBzdGFybGFyay5TdG9wUHJvZmlsZSgpOyBlcnIyICE9IG5pbCB7CiAJCQlmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBlcnIyKQpAQCAtODksNiArMTc1LDEyIEBACiAJCQlxdWl0KCIlc1xuIiwgZXJyKQogCQl9CiAJfQorCWlmIG1vZGUgPT0gcmJjcnVuLkV4ZWN1dGlvbk1vZGVTY2wgeworCQlpZiBlcnIgOj0gcHJpbnRWYXJzSW5NYWtlRm9ybWF0KHZhcmlhYmxlcyk7IGVyciAhPSBuaWwgeworCQkJcXVpdCgiJXNcbiIsIGVycikKKwkJfQorCQlmbXQuUHJpbnRmKCJMT0FERURfU1RBUkxBUktfRklMRVMgOj0gJXNcbiIsIHN0cmluZ3MuSm9pbihsb2FkZWRTdGFybGFya0ZpbGVzLCAiICIpKQorCX0KIAlvcy5FeGl0KHJjKQogfQogCmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vdGVzdGRhdGEvYnpsX2xvYWRzX3NjbC5iemwgYi90b29scy9yYmNydW4vdGVzdGRhdGEvYnpsX2xvYWRzX3NjbC5iemwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkZWNhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9iemxfbG9hZHNfc2NsLmJ6bApAQCAtMCwwICsxLDMgQEAKK2xvYWQoIjp0ZXN0X3NjbC5zY2wiLCBfZm9vID0gImZvbyIpCisKK2ZvbyA9IF9mb28KZGlmZiAtLWdpdCBhL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9iemxfbG9hZHNfc2NsXzIuYnpsIGIvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL2J6bF9sb2Fkc19zY2xfMi5iemwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2ODBlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9iemxfbG9hZHNfc2NsXzIuYnpsCkBAIC0wLDAgKzEsMyBAQAorbG9hZCgiOmJ6bF9sb2Fkc19zY2wuYnpsIiwgX2ZvbyA9ICJmb28iKQorCitmb28gPSBfZm9vCmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vdGVzdGRhdGEvY2xpX2FuZF9lbnYuc3RhciBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9jbGlfYW5kX2Vudi5zdGFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmY0NjRhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9jbGlfYW5kX2Vudi5zdGFyCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBUZXN0cyByYmxmX2VudiBhY2Nlc3MKLWxvYWQoImFzc2VydC5zdGFyIiwgImFzc2VydCIpCi0KLQotZGVmIHRlc3QoKToKLSAgICBhc3NlcnQuZXEocmJsZl9lbnYuVEVTVF9FTlZJUk9OTUVOVF9GT08sICJ0ZXN0X2Vudmlyb25tZW50X2ZvbyIpCi0gICAgYXNzZXJ0LmZhaWxzKGxhbWJkYTogcmJsZl9lbnYuRk9PX0JBUl9CQVosICIuKnN0cnVjdCBoYXMgbm8gLkZPT19CQVJfQkFaIGF0dHJpYnV0ZSQiKQotICAgIGFzc2VydC5lcShyYmxmX2NsaS5DTElfRk9PLCAiZm9vIikKLQotCi10ZXN0KCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9maWxlX29wcy5zdGFyIGIvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL2ZpbGVfb3BzLnN0YXIKaW5kZXggMmVlNzhmYy4uYjJiOTA3YyAxMDA2NDQKLS0tIGEvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL2ZpbGVfb3BzLnN0YXIKKysrIGIvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL2ZpbGVfb3BzLnN0YXIKQEAgLTEsMjIgKzEsMjEgQEAKICMgVGVzdHMgZmlsZSBvcHMgYnVpbHRpbnMKIGxvYWQoImFzc2VydC5zdGFyIiwgImFzc2VydCIpCiAKLQogZGVmIHRlc3QoKToKICAgICBteW5hbWUgPSAiZmlsZV9vcHMuc3RhciIKICAgICBmaWxlcyA9IHJibGZfd2lsZGNhcmQoIiouc3RhciIpCiAgICAgYXNzZXJ0LnRydWUobXluYW1lIGluIGZpbGVzLCAiZXhwZWN0ZWQgJXMgaW4gICVzIiAlIChteW5hbWUsIGZpbGVzKSkKLSAgICBmaWxlcyA9IHJibGZfd2lsZGNhcmQoIiouc3RhciIsIHJibGZfZW52LlRFU1RfREFUQV9ESVIpCisgICAgZmlsZXMgPSByYmxmX3dpbGRjYXJkKCIqLnN0YXIiKQogICAgIGFzc2VydC50cnVlKG15bmFtZSBpbiBmaWxlcywgImV4cGVjdGVkICVzIGluICVzIiAlIChteW5hbWUsIGZpbGVzKSkKICAgICBmaWxlcyA9IHJibGZfd2lsZGNhcmQoIioueHh4IikKICAgICBhc3NlcnQudHJ1ZShsZW4oZmlsZXMpID09IDAsICJleHBhbnNpb24gc2hvdWxkIGJlIGVtcHR5IGJ1dCBjb250YWlucyAlcyIgJSBmaWxlcykKICAgICBteWRpciA9ICJ0ZXN0ZGF0YSIKICAgICBteXJlbG5hbWUgPSAiJXMvJXMiICUgKG15ZGlyLCBteW5hbWUpCi0gICAgZmlsZXMgPSByYmxmX2ZpbmRfZmlsZXMocmJsZl9lbnYuVEVTVF9EQVRBX0RJUiArICIvLi4vIiwgIioiKQorICAgIGZpbGVzID0gcmJsZl9maW5kX2ZpbGVzKCIuLi8iLCAiKiIpCiAgICAgYXNzZXJ0LnRydWUobXlkaXIgaW4gZmlsZXMgYW5kIG15cmVsbmFtZSBpbiBmaWxlcywgImV4cGVjdGVkICVzIGFuZCAlcyBpbiAlcyIgJSAobXlkaXIsIG15cmVsbmFtZSwgZmlsZXMpKQotICAgIGZpbGVzID0gcmJsZl9maW5kX2ZpbGVzKHJibGZfZW52LlRFU1RfREFUQV9ESVIgKyAiLy4uLyIsICIqIiwgb25seV9maWxlcz0xKQorICAgIGZpbGVzID0gcmJsZl9maW5kX2ZpbGVzKCIuLi8iLCAiKiIsIG9ubHlfZmlsZXM9MSkKICAgICBhc3NlcnQudHJ1ZShteWRpciBub3QgaW4gZmlsZXMsICJkaWQgbm90IGV4cGVjdCAlcyBpbiAlcyIgJSAobXlkaXIsIGZpbGVzKSkKICAgICBhc3NlcnQudHJ1ZShteXJlbG5hbWUgaW4gZmlsZXMsICJleHBlY3RlZCAlcyAgaW4gJXMiICUgKG15cmVsbmFtZSwgZmlsZXMpKQotICAgIGZpbGVzID0gcmJsZl9maW5kX2ZpbGVzKHJibGZfZW52LlRFU1RfREFUQV9ESVIgKyAiLy4uLyIsICIqLnN0YXIiKQorICAgIGZpbGVzID0gcmJsZl9maW5kX2ZpbGVzKCIuLi8iLCAiKi5zdGFyIikKICAgICBhc3NlcnQudHJ1ZShteXJlbG5hbWUgaW4gZmlsZXMsICJleHBlY3RlZCAlcyBpbiAlcyIgJSAobXlyZWxuYW1lLCBmaWxlcykpCiB0ZXN0KCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9tb2R1bGUxLnN0YXIgYi90b29scy9yYmNydW4vdGVzdGRhdGEvbW9kdWxlMS5zdGFyCmluZGV4IGJlMDRmNzUuLjAyOTE5YTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9tb2R1bGUxLnN0YXIKKysrIGIvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL21vZHVsZTEuc3RhcgpAQCAtMiw2ICsyLDYgQEAKIGxvYWQoImFzc2VydC5zdGFyIiwgImFzc2VydCIpCiAKICMgTWFrZSBzdXJlIHRoYXQgYnVpbHRpbnMgYXJlIGRlZmluZWQgZm9yIHRoZSBsb2FkZWQgbW9kdWxlLCB0b28KLWFzc2VydC50cnVlKHJibGZfd2lsZGNhcmQoIm1vZHVsZTEuc3RhciIpKQotYXNzZXJ0LnRydWUobm90IHJibGZfd2lsZGNhcmQoIm5vX3N1Y2ggZmlsZSIpKQorYXNzZXJ0LnRydWUocmJsZl93aWxkY2FyZCgidGVzdGRhdGEvbW9kdWxlMS5zdGFyIikpCithc3NlcnQudHJ1ZShub3QgcmJsZl93aWxkY2FyZCgidGVzdGRhdGEvbm9fc3VjaCBmaWxlIikpCiB0ZXN0ID0gIm1vZHVsZTEiCmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vdGVzdGRhdGEvc2NsX2luY29ycmVjdGx5X2xvYWRzX2J6bC5zY2wgYi90b29scy9yYmNydW4vdGVzdGRhdGEvc2NsX2luY29ycmVjdGx5X2xvYWRzX2J6bC5zY2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2ODBlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9zY2xfaW5jb3JyZWN0bHlfbG9hZHNfYnpsLnNjbApAQCAtMCwwICsxLDMgQEAKK2xvYWQoIjpiemxfbG9hZHNfc2NsLmJ6bCIsIF9mb28gPSAiZm9vIikKKworZm9vID0gX2ZvbwpkaWZmIC0tZ2l0IGEvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL3NoZWxsLnN0YXIgYi90b29scy9yYmNydW4vdGVzdGRhdGEvc2hlbGwuc3RhcgppbmRleCBhZDEwNjk3Li5kZDE3Mzc1IDEwMDY0NAotLS0gYS90b29scy9yYmNydW4vdGVzdGRhdGEvc2hlbGwuc3RhcgorKysgYi90b29scy9yYmNydW4vdGVzdGRhdGEvc2hlbGwuc3RhcgpAQCAtMSw1ICsxLDUgQEAKICMgVGVzdHMgInF1ZXVlIiBkYXRhIHR5cGUKIGxvYWQoImFzc2VydC5zdGFyIiwgImFzc2VydCIpCiAKLWFzc2VydC5lcSgibG9hZC5zdGFyIHNoZWxsLnN0YXIiLCByYmxmX3NoZWxsKCJjZCAlcyAmJiBscyAtMSBzaGVsbC5zdGFyIGxvYWQuc3RhciAyPiYxIiAlIHJibGZfZW52LlRFU1RfREFUQV9ESVIpKQotYXNzZXJ0LmVxKCJzaGVsbC5zdGFyIiwgcmJsZl9zaGVsbCgiY2QgJXMgJiYgZWNobyBzaGVsbC5zdGEqIiAlIHJibGZfZW52LlRFU1RfREFUQV9ESVIpKQorYXNzZXJ0LmVxKCJsb2FkLnN0YXIgc2hlbGwuc3RhciIsIHJibGZfc2hlbGwoImxzIC0xIHNoZWxsLnN0YXIgbG9hZC5zdGFyIDI+JjEiKSkKK2Fzc2VydC5lcSgic2hlbGwuc3RhciIsIHJibGZfc2hlbGwoImVjaG8gc2hlbGwuc3RhKiIpKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL3Rlc3Rfc2NsLnNjbCBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS90ZXN0X3NjbC5zY2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2MGNjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS90ZXN0X3NjbC5zY2wKQEAgLTAsMCArMSwyIEBACisKK2ZvbyA9ICJiYXIiCmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vdGVzdGRhdGEvdGVzdF9zY2xfc3ltbGluay5zY2wgYi90b29scy9yYmNydW4vdGVzdGRhdGEvdGVzdF9zY2xfc3ltbGluay5zY2wKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uM2Y1YWVmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS90ZXN0X3NjbF9zeW1saW5rLnNjbApAQCAtMCwwICsxIEBACit0ZXN0X3NjbC5zY2wKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvQW5kcm9pZC5icCBiL3Rvb2xzL3JlbGVhc2V0b29scy9BbmRyb2lkLmJwCmluZGV4IGE3NmRjOGEuLjliMTM0ZjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9BbmRyb2lkLmJwCkBAIC05OSw5ICs5OSw4IEBACiAgICAgICAgICJyZWxlYXNldG9vbHNfY29tbW9uIiwKICAgICBdLAogICAgIHJlcXVpcmVkOiBbCisgICAgICAgICJhcGV4ZF9ob3N0IiwKICAgICAgICAgImNoZWNrdmludGYiLAotICAgICAgICAiZGVhcGV4ZXIiLAotICAgICAgICAiZHVtcF9hcGV4X2luZm8iLAogICAgIF0sCiB9CiAKQEAgLTE2NiwxMCArMTY1LDkgQEAKICAgICAgICAgIm90YV91dGlsc19saWIiLAogICAgIF0sCiAgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgImFwZXhkX2hvc3QiLAogICAgICAgICAiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIiwKICAgICAgICAgImNoZWNrdmludGYiLAotICAgICAgICAiZ2VuZXJhdGVfZ2tpX2NlcnRpZmljYXRlIiwKLSAgICAgICAgIm1pbmlnemlwIiwKICAgICAgICAgImx6NCIsCiAgICAgICAgICJ0b3lib3giLAogICAgICAgICAidW5wYWNrX2Jvb3RpbWciLApAQCAtMjM2LDYgKzIzNCw5IEBACiAgICAgICAgICJyYW5nZWxpYi5weSIsCiAgICAgICAgICJzcGFyc2VfaW1nLnB5IiwKICAgICBdLAorICAgIGRhdGE6IFsKKyAgICAgICAgIjp6aXAyemlwIiwKKyAgICBdLAogICAgIC8vIE9ubHkgdGhlIHRvb2xzIHRoYXQgYXJlIHJlZmVyZW5jZWQgZGlyZWN0bHkgYXJlIGxpc3RlZCBhcyByZXF1aXJlZCBtb2R1bGVzLiBGb3IgZXhhbXBsZSwKICAgICAvLyBgYXZidG9vbGAgaXMgbm90IGhlcmUsIGFzIHRoZSBzY3JpcHQgYWx3YXlzIHVzZXMgdGhlIG9uZSBmcm9tIGluZm9fZGljdFsnYXZiX2F2YnRvb2wnXS4KICAgICByZXF1aXJlZDogWwpAQCAtMjQzLDkgKzI0NCw2IEBACiAgICAgICAgICJib290X3NpZ25lciIsCiAgICAgICAgICJicm90bGkiLAogICAgICAgICAiYnNkaWZmIiwKLSAgICAgICAgImdlbmVyYXRlX2draV9jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICJpbWdkaWZmIiwKLSAgICAgICAgIm1pbmlnemlwIiwKICAgICAgICAgImx6NCIsCiAgICAgICAgICJta2Jvb3RmcyIsCiAgICAgICAgICJzaWduYXBrIiwKQEAgLTMwOSw5ICszMDcsNiBAQAogICAgICAgICAiYnJvdGxpIiwKICAgICAgICAgImJzZGlmZiIsCiAgICAgICAgICJkZWFwZXhlciIsCi0gICAgICAgICJnZW5lcmF0ZV9na2lfY2VydGlmaWNhdGUiLAotICAgICAgICAiaW1nZGlmZiIsCi0gICAgICAgICJtaW5pZ3ppcCIsCiAgICAgICAgICJsejQiLAogICAgICAgICAibWtib290ZnMiLAogICAgICAgICAic2lnbmFwayIsCkBAIC0zMzMsNiArMzI4LDcgQEAKICAgICBzcmNzOiBbCiAgICAgICAgICJvdGFfdXRpbHMucHkiLAogICAgICAgICAicGF5bG9hZF9zaWduZXIucHkiLAorICAgICAgICAib3RhX3NpZ25pbmdfdXRpbHMucHkiLAogICAgIF0sCiAgICAgbGliczogWwogICAgICAgICAicmVsZWFzZXRvb2xzX2NvbW1vbiIsCkBAIC00OTcsNiArNDkzLDI1IEBACiB9CiAKIHB5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogIm90YV9mcm9tX3Jhd19pbWciLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm90YV9mcm9tX3Jhd19pbWcucHkiLAorICAgIF0sCisgICAgbWFpbjogIm90YV9mcm9tX3Jhd19pbWcucHkiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJyZWxlYXNldG9vbHNfYmluYXJ5X2RlZmF1bHRzIiwKKyAgICBdLAorICAgIHJlcXVpcmVkOiBbCisgICAgICAgICJkZWx0YV9nZW5lcmF0b3IiLAorICAgIF0sCisgICAgbGliczogWworICAgICAgICAib3RhX21ldGFkYXRhX3Byb3RvIiwKKyAgICAgICAgInJlbGVhc2V0b29sc19jb21tb24iLAorICAgICAgICAib3RhX3V0aWxzX2xpYiIsCisgICAgXSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKICAgICBuYW1lOiAib3RhX3BhY2thZ2VfcGFyc2VyIiwKICAgICBkZWZhdWx0czogWyJyZWxlYXNldG9vbHNfYmluYXJ5X2RlZmF1bHRzIl0sCiAgICAgc3JjczogWwpAQCAtNTMxLDYgKzU0Niw4IEBACiAgICAgZGVmYXVsdHM6IFsicmVsZWFzZXRvb2xzX2JpbmFyeV9kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsKICAgICAgICAgInNpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkiLAorICAgICAgICAicGF5bG9hZF9zaWduZXIucHkiLAorICAgICAgICAib3RhX3NpZ25pbmdfdXRpbHMucHkiLAogICAgIF0sCiAgICAgbGliczogWwogICAgICAgICAicmVsZWFzZXRvb2xzX2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzIiwKQEAgLTYxNSw3ICs2MzIsNiBAQAogICAgIGRhdGE6IFsKICAgICAgICAgInRlc3RkYXRhLyoqLyoiLAogICAgICAgICAiOmNvbS5hbmRyb2lkLmFwZXguY29tcHJlc3NlZC52MSIsCi0gICAgICAgICI6Y29tLmFuZHJvaWQuYXBleC5jb21wcmVzc2VkLnYxX29yaWdpbmFsIiwKICAgICAgICAgIjpjb20uYW5kcm9pZC5hcGV4LnZlbmRvci5mb28ud2l0aF92aW50ZiIKICAgICBdLAogICAgIHRhcmdldDogewpAQCAtNjI1LDYgKzY0MSw3IEBACiAgICAgICAgIH0sCiAgICAgfSwKICAgICByZXF1aXJlZDogWworICAgICAgICAiYXBleGRfaG9zdCIsCiAgICAgICAgICJkZWFwZXhlciIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weQppbmRleCBhYzMyNzFiLi5iMzlhODJjIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvYWRkX2ltZ190b190YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLnB5CkBAIC00Miw2ICs0MiwxMCBAQAogICAtLWlzX3NpZ25pbmcKICAgICAgIFNraXAgYnVpbGRpbmcgJiBhZGRpbmcgdGhlIGltYWdlcyBmb3IgInVzZXJkYXRhIiBhbmQgImNhY2hlIiBpZiB3ZQogICAgICAgYXJlIHNpZ25pbmcgdGhlIHRhcmdldCBmaWxlcy4KKworICAtLWF2Yi1yZXNvbHZlLXJvbGxiYWNrLWluZGV4LWxvY2F0aW9uLWNvbmZsaWN0CisgICAgICBJZiBwcm92aWRlZCwgcmVzb2x2ZSB0aGUgY29uZmxpY3QgQVZCIHJvbGxiYWNrIGluZGV4IGxvY2F0aW9uIHdoZW4KKyAgICAgIG5lY2Vzc2FyeS4KICIiIgogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCkBAIC02NSw5ICs2OSwxMCBAQAogaW1wb3J0IG90YV9tZXRhZGF0YV9wYjIKIGltcG9ydCByYW5nZWxpYgogaW1wb3J0IHNwYXJzZV9pbWcKLQorZnJvbSBjb25jdXJyZW50LmZ1dHVyZXMgaW1wb3J0IFRocmVhZFBvb2xFeGVjdXRvcgogZnJvbSBhcGV4X3V0aWxzIGltcG9ydCBHZXRBcGV4SW5mb0Zyb21UYXJnZXRGaWxlcwogZnJvbSBjb21tb24gaW1wb3J0IFppcERlbGV0ZSwgUEFSVElUSU9OU19XSVRIX0NBUkVfTUFQLCBFeHRlcm5hbEVycm9yLCBSdW5BbmRDaGVja091dHB1dCwgSXNTcGFyc2VJbWFnZSwgTWFrZVRlbXBGaWxlLCBaaXBXcml0ZQorZnJvbSBidWlsZF9pbWFnZSBpbXBvcnQgRklYRURfRklMRV9USU1FU1RBTVAKIAogaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgogICBwcmludCgiUHl0aG9uIDIuNyBvciBuZXdlciBpcyByZXF1aXJlZC4iLCBmaWxlPXN5cy5zdGRlcnIpCkBAIC04MCwxMiArODUsNyBAQAogT1BUSU9OUy5yZWJ1aWxkX3JlY292ZXJ5ID0gRmFsc2UKIE9QVElPTlMucmVwbGFjZV91cGRhdGVkX2ZpbGVzX2xpc3QgPSBbXQogT1BUSU9OUy5pc19zaWduaW5nID0gRmFsc2UKLQotIyBVc2UgYSBmaXhlZCB0aW1lc3RhbXAgKDAxLzAxLzIwMDkgMDA6MDA6MDAgVVRDKSBmb3IgZmlsZXMgd2hlbiBwYWNrYWdpbmcKLSMgaW1hZ2VzLiAoYi8yNDM3Nzk5MywgYi84MDYwMDkzMSkKLUZJWEVEX0ZJTEVfVElNRVNUQU1QID0gaW50KCgKLSAgICBkYXRldGltZS5kYXRldGltZSgyMDA5LCAxLCAxLCAwLCAwLCAwLCAwLCBOb25lKSAtCi0gICAgZGF0ZXRpbWUuZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCgwKSkudG90YWxfc2Vjb25kcygpKQorT1BUSU9OUy5hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdCA9IEZhbHNlCiAKIAogZGVmIFBhcnNlQXZiRm9vdGVyKGltZ19wYXRoKSAtPiBhdmJ0b29sLkF2YkZvb3RlcjoKQEAgLTUyMiwxMiArNTIyLDE0IEBACiAgIHJldHVybiBpbWcubmFtZQogCiAKLWRlZiBBZGRDdXN0b21JbWFnZXMob3V0cHV0X3ppcCwgcGFydGl0aW9uX25hbWUpOgotICAiIiJBZGRzIGFuZCBzaWducyBjdXN0b20gaW1hZ2VzIGluIElNQUdFUy8uCitkZWYgQWRkQ3VzdG9tSW1hZ2VzKG91dHB1dF96aXAsIHBhcnRpdGlvbl9uYW1lLCBpbWFnZV9saXN0KToKKyAgIiIiQWRkcyBhbmQgc2lnbnMgYXZiIGN1c3RvbSBpbWFnZXMgYXMgbmVlZGVkIGluIElNQUdFUy8uCiAKICAgQXJnczoKICAgICBvdXRwdXRfemlwOiBUaGUgb3V0cHV0IHppcCBmaWxlIChuZWVkcyB0byBiZSBhbHJlYWR5IG9wZW4pLCBvciBOb25lIHRvCiAgICAgICAgIHdyaXRlIGltYWdlcyB0byBPUFRJT05TLmlucHV0X3RtcC8uCisgICAgcGFydGl0aW9uX25hbWU6IFRoZSBjdXN0b20gaW1hZ2UgcGFydGl0aW9uIG5hbWUuCisgICAgaW1hZ2VfbGlzdDogVGhlIGltYWdlIGxpc3Qgb2YgdGhlIGN1c3RvbSBpbWFnZSBwYXJ0aXRpb24uCiAKICAgVXNlcyB0aGUgaW1hZ2UgdW5kZXIgSU1BR0VTLyBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gT3RoZXJ3aXNlIGxvb2tzIGZvciB0aGUKICAgaW1hZ2UgdW5kZXIgUFJFQlVJTFRfSU1BR0VTLywgc2lnbnMgaXQgYXMgbmVlZGVkLCBhbmQgcmV0dXJucyB0aGUgaW1hZ2UgbmFtZS4KQEAgLTUzNiwxOSArNTM4LDIwIEBACiAgICAgQXNzZXJ0aW9uRXJyb3I6IElmIGltYWdlIGNhbid0IGJlIGZvdW5kLgogICAiIiIKIAorICBidWlsZGVyID0gTm9uZQogICBrZXlfcGF0aCA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3t9X2tleV9wYXRoIi5mb3JtYXQocGFydGl0aW9uX25hbWUpKQotICBhbGdvcml0aG0gPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl97fV9hbGdvcml0aG0iLmZvcm1hdChwYXJ0aXRpb25fbmFtZSkpCi0gIGV4dHJhX2FyZ3MgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoCi0gICAgICAiYXZiX3t9X2FkZF9oYXNodHJlZV9mb290ZXJfYXJncyIuZm9ybWF0KHBhcnRpdGlvbl9uYW1lKSkKLSAgcGFydGl0aW9uX3NpemUgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoCi0gICAgICAiYXZiX3t9X3BhcnRpdGlvbl9zaXplIi5mb3JtYXQocGFydGl0aW9uX25hbWUpKQorICBpZiBrZXlfcGF0aCBpcyBub3QgTm9uZToKKyAgICBhbGdvcml0aG0gPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl97fV9hbGdvcml0aG0iLmZvcm1hdChwYXJ0aXRpb25fbmFtZSkpCisgICAgZXh0cmFfYXJncyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgKKyAgICAgICAgImF2Yl97fV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3MiLmZvcm1hdChwYXJ0aXRpb25fbmFtZSkpCisgICAgcGFydGl0aW9uX3NpemUgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoCisgICAgICAgICJhdmJfe31fcGFydGl0aW9uX3NpemUiLmZvcm1hdChwYXJ0aXRpb25fbmFtZSkpCiAKLSAgYnVpbGRlciA9IHZlcml0eV91dGlscy5DcmVhdGVDdXN0b21JbWFnZUJ1aWxkZXIoCi0gICAgICBPUFRJT05TLmluZm9fZGljdCwgcGFydGl0aW9uX25hbWUsIHBhcnRpdGlvbl9zaXplLAotICAgICAga2V5X3BhdGgsIGFsZ29yaXRobSwgZXh0cmFfYXJncykKKyAgICBidWlsZGVyID0gdmVyaXR5X3V0aWxzLkNyZWF0ZUN1c3RvbUltYWdlQnVpbGRlcigKKyAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QsIHBhcnRpdGlvbl9uYW1lLCBwYXJ0aXRpb25fc2l6ZSwKKyAgICAgICAga2V5X3BhdGgsIGFsZ29yaXRobSwgZXh0cmFfYXJncykKIAotICBmb3IgaW1nX25hbWUgaW4gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KAotICAgICAgICAgICJhdmJfe31faW1hZ2VfbGlzdCIuZm9ybWF0KHBhcnRpdGlvbl9uYW1lKSkuc3BsaXQoKToKKyAgZm9yIGltZ19uYW1lIGluIGltYWdlX2xpc3Q6CiAgICAgY3VzdG9tX2ltYWdlID0gT3V0cHV0RmlsZSgKICAgICAgICAgb3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCBpbWdfbmFtZSkKICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjdXN0b21faW1hZ2UubmFtZSk6CkBAIC01OTQsMTUgKzU5Nyw2IEBACiAgIGlmIGJsb2NrX2xpc3Q6CiAgICAgaW1hZ2VfcHJvcHNbImJsb2NrX2xpc3QiXSA9IGJsb2NrX2xpc3QubmFtZQogCi0gICMgVXNlIHJlcGVhdGFibGUgZXh0NCBGUyBVVUlEIGFuZCBoYXNoX3NlZWQgVVVJRCAoYmFzZWQgb24gcGFydGl0aW9uIG5hbWUgYW5kCi0gICMgYnVpbGQgZmluZ2VycHJpbnQpLiBBbHNvIHVzZSB0aGUgbGVnYWN5IGJ1aWxkIGlkLCBiZWNhdXNlIHRoZSB2Ym1ldGEgZGlnZXN0Ci0gICMgaXNuJ3QgYXZhaWxhYmxlIGF0IHRoaXMgcG9pbnQuCi0gIGJ1aWxkX2luZm8gPSBjb21tb24uQnVpbGRJbmZvKGluZm9fZGljdCwgdXNlX2xlZ2FjeV9pZD1UcnVlKQotICB1dWlkX3NlZWQgPSB3aGF0ICsgIi0iICsgYnVpbGRfaW5mby5HZXRQYXJ0aXRpb25GaW5nZXJwcmludCh3aGF0KQotICBpbWFnZV9wcm9wc1sidXVpZCJdID0gc3RyKHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfVVJMLCB1dWlkX3NlZWQpKQotICBoYXNoX3NlZWQgPSAiaGFzaF9zZWVkLSIgKyB1dWlkX3NlZWQKLSAgaW1hZ2VfcHJvcHNbImhhc2hfc2VlZCJdID0gc3RyKHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfVVJMLCBoYXNoX3NlZWQpKQotCiAgIGJ1aWxkX2ltYWdlLkJ1aWxkSW1hZ2UoCiAgICAgICBvcy5wYXRoLmpvaW4oaW5wdXRfZGlyLCB3aGF0LnVwcGVyKCkpLCBpbWFnZV9wcm9wcywgb3V0cHV0X2ZpbGUubmFtZSkKIApAQCAtNjkzLDM5ICs2ODcsMTIgQEAKICAgICBsb2dnZXIuaW5mbygiJXMuaW1nIGFscmVhZHkgZXhpc3RzOyBub3QgcmVidWlsZGluZy4uLiIsIG5hbWUpCiAgICAgcmV0dXJuIGltZy5uYW1lCiAKLSAgY29tbW9uLkJ1aWxkVkJNZXRhKGltZy5uYW1lLCBwYXJ0aXRpb25zLCBuYW1lLCBuZWVkZWRfcGFydGl0aW9ucykKKyAgY29tbW9uLkJ1aWxkVkJNZXRhKGltZy5uYW1lLCBwYXJ0aXRpb25zLCBuYW1lLCBuZWVkZWRfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMuYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QpCiAgIGltZy5Xcml0ZSgpCiAgIHJldHVybiBpbWcubmFtZQogCiAKLWRlZiBBZGRQYXJ0aXRpb25UYWJsZShvdXRwdXRfemlwKToKLSAgIiIiQ3JlYXRlIGEgcGFydGl0aW9uIHRhYmxlIGltYWdlIGFuZCBzdG9yZSBpdCBpbiBvdXRwdXRfemlwLiIiIgotCi0gIGltZyA9IE91dHB1dEZpbGUoCi0gICAgICBvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJwYXJ0aXRpb24tdGFibGUuaW1nIikKLSAgYnB0ID0gT3V0cHV0RmlsZSgKLSAgICAgIG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCAiTUVUQSIsICJwYXJ0aXRpb24tdGFibGUuYnB0IikKLQotICAjIHVzZSBCUFRUT09MIGZyb20gZW52aXJvbiwgb3IgImJwdHRvb2wiIGlmIGVtcHR5IG9yIG5vdCBzZXQuCi0gIGJwdHRvb2wgPSBvcy5nZXRlbnYoIkJQVFRPT0wiKSBvciAiYnB0dG9vbCIKLSAgY21kID0gW2JwdHRvb2wsICJtYWtlX3RhYmxlIiwgIi0tb3V0cHV0X2pzb24iLCBicHQubmFtZSwKLSAgICAgICAgICItLW91dHB1dF9ncHQiLCBpbWcubmFtZV0KLSAgaW5wdXRfZmlsZXNfc3RyID0gT1BUSU9OUy5pbmZvX2RpY3RbImJvYXJkX2JwdF9pbnB1dF9maWxlcyJdCi0gIGlucHV0X2ZpbGVzID0gaW5wdXRfZmlsZXNfc3RyLnNwbGl0KCkKLSAgZm9yIGkgaW4gaW5wdXRfZmlsZXM6Ci0gICAgY21kLmV4dGVuZChbIi0taW5wdXQiLCBpXSkKLSAgZGlza19zaXplID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJib2FyZF9icHRfZGlza19zaXplIikKLSAgaWYgZGlza19zaXplOgotICAgIGNtZC5leHRlbmQoWyItLWRpc2tfc2l6ZSIsIGRpc2tfc2l6ZV0pCi0gIGFyZ3MgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImJvYXJkX2JwdF9tYWtlX3RhYmxlX2FyZ3MiKQotICBpZiBhcmdzOgotICAgIGNtZC5leHRlbmQoc2hsZXguc3BsaXQoYXJncykpCi0gIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChjbWQpCi0KLSAgaW1nLldyaXRlKCkKLSAgYnB0LldyaXRlKCkKLQotCiBkZWYgQWRkQ2FjaGUob3V0cHV0X3ppcCk6CiAgICIiIkNyZWF0ZSBhbiBlbXB0eSBjYWNoZSBpbWFnZSBhbmQgc3RvcmUgaXQgaW4gb3V0cHV0X3ppcC4iIiIKIApAQCAtODY4LDggKzgzNSw3IEBACiAKIAogZGVmIEFkZEFwZXhJbmZvKG91dHB1dF96aXApOgotICBhcGV4X2luZm9zID0gR2V0QXBleEluZm9Gcm9tVGFyZ2V0RmlsZXMoT1BUSU9OUy5pbnB1dF90bXAsICdzeXN0ZW0nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZF9vbmx5PUZhbHNlKQorICBhcGV4X2luZm9zID0gR2V0QXBleEluZm9Gcm9tVGFyZ2V0RmlsZXMoT1BUSU9OUy5pbnB1dF90bXApCiAgIGFwZXhfbWV0YWRhdGFfcHJvdG8gPSBvdGFfbWV0YWRhdGFfcGIyLkFwZXhNZXRhZGF0YSgpCiAgIGFwZXhfbWV0YWRhdGFfcHJvdG8uYXBleF9pbmZvLmV4dGVuZChhcGV4X2luZm9zKQogICBhcGV4X2luZm9fYnl0ZXMgPSBhcGV4X21ldGFkYXRhX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKQEAgLTEwODMsOCArMTA0OSwxNSBAQAogICAgICAgKCJzeXN0ZW1fZGxrbSIsIGhhc19zeXN0ZW1fZGxrbSwgQWRkU3lzdGVtRGxrbSwgW10pLAogICAgICAgKCJzeXN0ZW1fb3RoZXIiLCBoYXNfc3lzdGVtX290aGVyLCBBZGRTeXN0ZW1PdGhlciwgW10pLAogICApCi0gIGZvciBjYWxsIGluIGFkZF9wYXJ0aXRpb25fY2FsbHM6Ci0gICAgYWRkX3BhcnRpdGlvbigqY2FsbCkKKyAgIyBJZiBvdXRwdXRfemlwIGV4aXN0cywgZWFjaCBhZGRfcGFydGl0aW9uX2NhbGxzIHdyaXRlcyBieXRlcyB0byB0aGUgc2FtZSBvdXRwdXRfemlwLAorICAjIHdoaWNoIGlzIG5vdCB0aHJlYWQtc2FmZS4gU28sIHJ1biB0aGVtIGluIHNlcmlhbCBpZiBvdXRwdXRfemlwIGV4aXN0cy4KKyAgaWYgb3V0cHV0X3ppcDoKKyAgICBmb3IgY2FsbCBpbiBhZGRfcGFydGl0aW9uX2NhbGxzOgorICAgICAgYWRkX3BhcnRpdGlvbigqY2FsbCkKKyAgZWxzZToKKyAgICB3aXRoIFRocmVhZFBvb2xFeGVjdXRvcihtYXhfd29ya2Vycz1sZW4oYWRkX3BhcnRpdGlvbl9jYWxscykpIGFzIGV4ZWN1dG9yOgorICAgICAgZm9yIGZ1dHVyZSBpbiBbZXhlY3V0b3Iuc3VibWl0KGFkZF9wYXJ0aXRpb24sICpjYWxsKSBmb3IgY2FsbCBpbiBhZGRfcGFydGl0aW9uX2NhbGxzXToKKyAgICAgICAgZnV0dXJlLnJlc3VsdCgpCiAKICAgQWRkQXBleEluZm8ob3V0cHV0X3ppcCkKIApAQCAtMTA5NCwxMCArMTA2Nyw2IEBACiAgICAgYmFubmVyKCJjYWNoZSIpCiAgICAgQWRkQ2FjaGUob3V0cHV0X3ppcCkKIAotICBpZiBPUFRJT05TLmluZm9fZGljdC5nZXQoImJvYXJkX2JwdF9lbmFibGUiKSA9PSAidHJ1ZSI6Ci0gICAgYmFubmVyKCJwYXJ0aXRpb24tdGFibGUiKQotICAgIEFkZFBhcnRpdGlvblRhYmxlKG91dHB1dF96aXApCi0KICAgYWRkX3BhcnRpdGlvbigiZHRibyIsCiAgICAgICAgICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJoYXNfZHRibyIpID09ICJ0cnVlIiwgQWRkRHRibywgW10pCiAgIGFkZF9wYXJ0aXRpb24oInB2bWZ3IiwKQEAgLTExMDUsMTggKzEwNzQsMjkgQEAKIAogICAjIEN1c3RvbSBpbWFnZXMuCiAgIGN1c3RvbV9wYXJ0aXRpb25zID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KAotICAgICAgImF2Yl9jdXN0b21faW1hZ2VzX3BhcnRpdGlvbl9saXN0IiwgIiIpLnN0cmlwKCkuc3BsaXQoKQorICAgICAgImN1c3RvbV9pbWFnZXNfcGFydGl0aW9uX2xpc3QiLCAiIikuc3RyaXAoKS5zcGxpdCgpCiAgIGZvciBwYXJ0aXRpb25fbmFtZSBpbiBjdXN0b21fcGFydGl0aW9uczoKICAgICBwYXJ0aXRpb25fbmFtZSA9IHBhcnRpdGlvbl9uYW1lLnN0cmlwKCkKICAgICBiYW5uZXIoImN1c3RvbSBpbWFnZXMgZm9yICIgKyBwYXJ0aXRpb25fbmFtZSkKLSAgICBwYXJ0aXRpb25zW3BhcnRpdGlvbl9uYW1lXSA9IEFkZEN1c3RvbUltYWdlcyhvdXRwdXRfemlwLCBwYXJ0aXRpb25fbmFtZSkKKyAgICBpbWFnZV9saXN0ID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KAorICAgICAgICAgICJ7fV9pbWFnZV9saXN0Ii5mb3JtYXQocGFydGl0aW9uX25hbWUpKS5zcGxpdCgpCisgICAgcGFydGl0aW9uc1twYXJ0aXRpb25fbmFtZV0gPSBBZGRDdXN0b21JbWFnZXMob3V0cHV0X3ppcCwgcGFydGl0aW9uX25hbWUsIGltYWdlX2xpc3QpCisKKyAgYXZiX2N1c3RvbV9wYXJ0aXRpb25zID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KAorICAgICAgImF2Yl9jdXN0b21faW1hZ2VzX3BhcnRpdGlvbl9saXN0IiwgIiIpLnN0cmlwKCkuc3BsaXQoKQorICBmb3IgcGFydGl0aW9uX25hbWUgaW4gYXZiX2N1c3RvbV9wYXJ0aXRpb25zOgorICAgIHBhcnRpdGlvbl9uYW1lID0gcGFydGl0aW9uX25hbWUuc3RyaXAoKQorICAgIGJhbm5lcigiYXZiIGN1c3RvbSBpbWFnZXMgZm9yICIgKyBwYXJ0aXRpb25fbmFtZSkKKyAgICBpbWFnZV9saXN0ID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KAorICAgICAgICAgICJhdmJfe31faW1hZ2VfbGlzdCIuZm9ybWF0KHBhcnRpdGlvbl9uYW1lKSkuc3BsaXQoKQorICAgIHBhcnRpdGlvbnNbcGFydGl0aW9uX25hbWVdID0gQWRkQ3VzdG9tSW1hZ2VzKG91dHB1dF96aXAsIHBhcnRpdGlvbl9uYW1lLCBpbWFnZV9saXN0KQogCiAgIGlmIE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX2VuYWJsZSIpID09ICJ0cnVlIjoKICAgICAjIHZibWV0YV9wYXJ0aXRpb25zIGluY2x1ZGVzIHRoZSBwYXJ0aXRpb25zIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8KICAgICAjIHRvcC1sZXZlbCB2Ym1ldGEuaW1nLCB3aGljaCBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIGFueQogICAgICMgY2hhaW5lZCBWQk1ldGEgaW1hZ2UgcGx1cyB0aGUgY2hhaW5lZCBWQk1ldGEgaW1hZ2VzIHRoZW1zZWx2ZXMuCi0gICAgIyBDdXJyZW50bHkgY3VzdG9tX3BhcnRpdGlvbnMgYXJlIGFsbCBjaGFpbmVkIHRvIFZCTWV0YSBpbWFnZS4KLSAgICB2Ym1ldGFfcGFydGl0aW9ucyA9IGNvbW1vbi5BVkJfUEFSVElUSU9OU1s6XSArIHR1cGxlKGN1c3RvbV9wYXJ0aXRpb25zKQorICAgICMgQ3VycmVudGx5IGF2Yl9jdXN0b21fcGFydGl0aW9ucyBhcmUgYWxsIGNoYWluZWQgdG8gVkJNZXRhIGltYWdlLgorICAgIHZibWV0YV9wYXJ0aXRpb25zID0gY29tbW9uLkFWQl9QQVJUSVRJT05TWzpdICsgdHVwbGUoYXZiX2N1c3RvbV9wYXJ0aXRpb25zKQogCiAgICAgdmJtZXRhX3N5c3RlbSA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3ZibWV0YV9zeXN0ZW0iLCAiIikuc3RyaXAoKQogICAgIGlmIHZibWV0YV9zeXN0ZW06CkBAIC0xMTM3LDE0ICsxMTE3LDE4IEBACiAgICAgICAgICAgaXRlbSBmb3IgaXRlbSBpbiB2Ym1ldGFfcGFydGl0aW9ucwogICAgICAgICAgIGlmIGl0ZW0gbm90IGluIHZibWV0YV92ZW5kb3Iuc3BsaXQoKV0KICAgICAgIHZibWV0YV9wYXJ0aXRpb25zLmFwcGVuZCgidmJtZXRhX3ZlbmRvciIpCi0gICAgY3VzdG9tX2F2Yl9wYXJ0aXRpb25zID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfY3VzdG9tX3ZibWV0YV9pbWFnZXNfcGFydGl0aW9uX2xpc3QiLCAiIikuc3RyaXAoKS5zcGxpdCgpCisgICAgY3VzdG9tX2F2Yl9wYXJ0aXRpb25zID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KAorICAgICAgICAiYXZiX2N1c3RvbV92Ym1ldGFfaW1hZ2VzX3BhcnRpdGlvbl9saXN0IiwgIiIpLnN0cmlwKCkuc3BsaXQoKQogICAgIGlmIGN1c3RvbV9hdmJfcGFydGl0aW9uczoKICAgICAgIGZvciBhdmJfcGFydCBpbiBjdXN0b21fYXZiX3BhcnRpdGlvbnM6CiAgICAgICAgIHBhcnRpdGlvbl9uYW1lID0gInZibWV0YV8iICsgYXZiX3BhcnQKLSAgICAgICAgaW5jbHVkZWRfcGFydGl0aW9ucyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3ZibWV0YV97fSIuZm9ybWF0KGF2Yl9wYXJ0KSwgIiIpLnN0cmlwKCkuc3BsaXQoKQotICAgICAgICBhc3NlcnQgaW5jbHVkZWRfcGFydGl0aW9ucywgIkN1c3RvbSB2Ym1ldGEgcGFydGl0aW9uIHswfSBtaXNzaW5nIGF2Yl92Ym1ldGFfezB9IHByb3AiLmZvcm1hdChhdmJfcGFydCkKKyAgICAgICAgaW5jbHVkZWRfcGFydGl0aW9ucyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgKKyAgICAgICAgICAgICJhdmJfdmJtZXRhX3t9Ii5mb3JtYXQoYXZiX3BhcnQpLCAiIikuc3RyaXAoKS5zcGxpdCgpCisgICAgICAgIGFzc2VydCBpbmNsdWRlZF9wYXJ0aXRpb25zLCAiQ3VzdG9tIHZibWV0YSBwYXJ0aXRpb24gezB9IG1pc3NpbmcgYXZiX3ZibWV0YV97MH0gcHJvcCIuZm9ybWF0KAorICAgICAgICAgICAgYXZiX3BhcnQpCiAgICAgICAgIGJhbm5lcihwYXJ0aXRpb25fbmFtZSkKLSAgICAgICAgbG9nZ2VyLmluZm8oIlZCTWV0YSBwYXJ0aXRpb24ge30gbmVlZHMge30iLmZvcm1hdChwYXJ0aXRpb25fbmFtZSwgaW5jbHVkZWRfcGFydGl0aW9ucykpCisgICAgICAgIGxvZ2dlci5pbmZvKCJWQk1ldGEgcGFydGl0aW9uIHt9IG5lZWRzIHt9Ii5mb3JtYXQoCisgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZSwgaW5jbHVkZWRfcGFydGl0aW9ucykpCiAgICAgICAgIHBhcnRpdGlvbnNbcGFydGl0aW9uX25hbWVdID0gQWRkVkJNZXRhKAogICAgICAgICAgICAgb3V0cHV0X3ppcCwgcGFydGl0aW9ucywgcGFydGl0aW9uX25hbWUsIGluY2x1ZGVkX3BhcnRpdGlvbnMpCiAgICAgICAgIHZibWV0YV9wYXJ0aXRpb25zID0gWwpAQCAtMTE1Miw3ICsxMTM2LDYgQEAKICAgICAgICAgICAgIGlmIGl0ZW0gbm90IGluIGluY2x1ZGVkX3BhcnRpdGlvbnNdCiAgICAgICAgIHZibWV0YV9wYXJ0aXRpb25zLmFwcGVuZChwYXJ0aXRpb25fbmFtZSkKIAotCiAgICAgaWYgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfYnVpbGRpbmdfdmJtZXRhX2ltYWdlIikgPT0gInRydWUiOgogICAgICAgYmFubmVyKCJ2Ym1ldGEiKQogICAgICAgQWRkVkJNZXRhKG91dHB1dF96aXAsIHBhcnRpdGlvbnMsICJ2Ym1ldGEiLCB2Ym1ldGFfcGFydGl0aW9ucykKQEAgLTEyNDYsNiArMTIyOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICIgcGxlYXNlIHN3aXRjaCB0byBBVkIiKQogICAgIGVsaWYgbyA9PSAiLS1pc19zaWduaW5nIjoKICAgICAgIE9QVElPTlMuaXNfc2lnbmluZyA9IFRydWUKKyAgICBlbGlmIG8gPT0gIi0tYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QiOgorICAgICAgT1BUSU9OUy5hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdCA9IFRydWUKICAgICBlbHNlOgogICAgICAgcmV0dXJuIEZhbHNlCiAgICAgcmV0dXJuIFRydWUKQEAgLTEyNTUsNyArMTI0MCw4IEBACiAgICAgICBleHRyYV9sb25nX29wdHM9WyJhZGRfbWlzc2luZyIsICJyZWJ1aWxkX3JlY292ZXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2VfdmVyaXR5X3B1YmxpY19rZXk9IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2VfdmVyaXR5X3ByaXZhdGVfa2V5PSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJpc19zaWduaW5nIl0sCisgICAgICAgICAgICAgICAgICAgICAgICJpc19zaWduaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImF2Yl9yZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0Il0sCiAgICAgICBleHRyYV9vcHRpb25faGFuZGxlcj1vcHRpb25faGFuZGxlcikKIAogICBpZiBsZW4oYXJncykgIT0gMToKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9hcGV4X3V0aWxzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2FwZXhfdXRpbHMucHkKaW5kZXggNTljNzEyZS4uM2FiZWYzYiAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2FwZXhfdXRpbHMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2FwZXhfdXRpbHMucHkKQEAgLTY1LDEyICs2NSwxMCBAQAogICAgICAgICBPUFRJT05TLnNlYXJjaF9wYXRoLCAiYmluIiwgImRlYnVnZnNfc3RhdGljIikKICAgICBzZWxmLmZzY2tlcm9mc19wYXRoID0gb3MucGF0aC5qb2luKAogICAgICAgICBPUFRJT05TLnNlYXJjaF9wYXRoLCAiYmluIiwgImZzY2suZXJvZnMiKQotICAgIHNlbGYuYmxraWRfcGF0aCA9IG9zLnBhdGguam9pbigKLSAgICAgICAgT1BUSU9OUy5zZWFyY2hfcGF0aCwgImJpbiIsICJibGtpZF9zdGF0aWMiKQogICAgIHNlbGYuYXZidG9vbCA9IGF2YnRvb2wgaWYgYXZidG9vbCBlbHNlICJhdmJ0b29sIgogICAgIHNlbGYuc2lnbl90b29sID0gc2lnbl90b29sCiAKLSAgZGVmIFByb2Nlc3NBcGV4RmlsZShzZWxmLCBhcGtfa2V5cywgcGF5bG9hZF9rZXksIHNpZ25pbmdfYXJncz1Ob25lLCBpc19zZXBvbGljeT1GYWxzZSk6CisgIGRlZiBQcm9jZXNzQXBleEZpbGUoc2VsZiwgYXBrX2tleXMsIHBheWxvYWRfa2V5LCBzaWduaW5nX2FyZ3M9Tm9uZSk6CiAgICAgIiIiU2NhbnMgYW5kIHNpZ25zIHRoZSBwYXlsb2FkIGZpbGVzIGFuZCByZXBhY2sgdGhlIGFwZXgKIAogICAgIEFyZ3M6CkBAIC04OCwxMyArODYsOSBAQAogICAgICAgICAgICAgICAgICdsaXN0Jywgc2VsZi5hcGV4X3BhdGhdCiAgICAgZW50cmllc19uYW1lcyA9IGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChsaXN0X2NtZCkuc3BsaXQoKQogICAgIGFwa19lbnRyaWVzID0gW25hbWUgZm9yIG5hbWUgaW4gZW50cmllc19uYW1lcyBpZiBuYW1lLmVuZHN3aXRoKCcuYXBrJyldCi0gICAgc2Vwb2xpY3lfZW50cmllcyA9IFtdCi0gICAgaWYgaXNfc2Vwb2xpY3k6Ci0gICAgICBzZXBvbGljeV9lbnRyaWVzID0gW25hbWUgZm9yIG5hbWUgaW4gZW50cmllc19uYW1lcyBpZgotICAgICAgICAgIG5hbWUuc3RhcnRzd2l0aCgnLi9ldGMvU0VQb2xpY3knKSBhbmQgbmFtZS5lbmRzd2l0aCgnLnppcCcpXQogCiAgICAgIyBObyBuZWVkIHRvIHNpZ24gYW5kIHJlcGFjaywgcmV0dXJuIHRoZSBvcmlnaW5hbCBhcGV4IHBhdGguCi0gICAgaWYgbm90IGFwa19lbnRyaWVzIGFuZCBub3Qgc2Vwb2xpY3lfZW50cmllcyBhbmQgc2VsZi5zaWduX3Rvb2wgaXMgTm9uZToKKyAgICBpZiBub3QgYXBrX2VudHJpZXMgYW5kIHNlbGYuc2lnbl90b29sIGlzIE5vbmU6CiAgICAgICBsb2dnZXIuaW5mbygnTm8gYXBrIGZpbGUgdG8gc2lnbiBpbiAlcycsIHNlbGYuYXBleF9wYXRoKQogICAgICAgcmV0dXJuIHNlbGYuYXBleF9wYXRoCiAKQEAgLTExMCwxNCArMTA0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICcgJXMnLCBlbnRyeSkKIAogICAgIHBheWxvYWRfZGlyLCBoYXNfc2lnbmVkX2NvbnRlbnQgPSBzZWxmLkV4dHJhY3RBcGV4UGF5bG9hZEFuZFNpZ25Db250ZW50cygKLSAgICAgICAgYXBrX2VudHJpZXMsIHNlcG9saWN5X2VudHJpZXMsIGFwa19rZXlzLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKQorICAgICAgICBhcGtfZW50cmllcywgYXBrX2tleXMsIHBheWxvYWRfa2V5LCBzaWduaW5nX2FyZ3MpCiAgICAgaWYgbm90IGhhc19zaWduZWRfY29udGVudDoKLSAgICAgIGxvZ2dlci5pbmZvKCdObyBjb250ZW50cyBoYXZlIGJlZW4gc2lnbmVkIGluICVzJywgc2VsZi5hcGV4X3BhdGgpCisgICAgICBsb2dnZXIuaW5mbygnTm8gY29udGVudHMgaGFzIGJlZW4gc2lnbmVkIGluICVzJywgc2VsZi5hcGV4X3BhdGgpCiAgICAgICByZXR1cm4gc2VsZi5hcGV4X3BhdGgKIAogICAgIHJldHVybiBzZWxmLlJlcGFja0FwZXhQYXlsb2FkKHBheWxvYWRfZGlyLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKQogCi0gIGRlZiBFeHRyYWN0QXBleFBheWxvYWRBbmRTaWduQ29udGVudHMoc2VsZiwgYXBrX2VudHJpZXMsIHNlcG9saWN5X2VudHJpZXMsIGFwa19rZXlzLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKToKKyAgZGVmIEV4dHJhY3RBcGV4UGF5bG9hZEFuZFNpZ25Db250ZW50cyhzZWxmLCBhcGtfZW50cmllcywgYXBrX2tleXMsIHBheWxvYWRfa2V5LCBzaWduaW5nX2FyZ3MpOgogICAgICIiIkV4dHJhY3RzIHRoZSBwYXlsb2FkIGltYWdlIGFuZCBzaWducyB0aGUgY29udGFpbmluZyBhcGsgZmlsZXMuIiIiCiAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuZGVidWdmc19wYXRoKToKICAgICAgIHJhaXNlIEFwZXhTaWduaW5nRXJyb3IoCkBAIC0xMjksMjIgKzEyMywxNyBAQAogICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGxvY2F0aW9uIG9mIGZzY2suZXJvZnM6ICIgKwogICAgICAgICAgICJQYXRoIHt9IGRvZXMgbm90IGV4aXN0LiAiLmZvcm1hdChzZWxmLmZzY2tlcm9mc19wYXRoKSArCiAgICAgICAgICAgIk1ha2Ugc3VyZSBiaW4vZnNjay5lcm9mcyBjYW4gYmUgZm91bmQgaW4gLXAgPHBhdGg+IikKLSAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5ibGtpZF9wYXRoKToKLSAgICAgIHJhaXNlIEFwZXhTaWduaW5nRXJyb3IoCi0gICAgICAgICAgIkNvdWxkbid0IGZpbmQgbG9jYXRpb24gb2YgYmxraWQ6ICIgKwotICAgICAgICAgICJQYXRoIHt9IGRvZXMgbm90IGV4aXN0LiAiLmZvcm1hdChzZWxmLmJsa2lkX3BhdGgpICsKLSAgICAgICAgICAiTWFrZSBzdXJlIGJpbi9ibGtpZCBjYW4gYmUgZm91bmQgaW4gLXAgPHBhdGg+IikKICAgICBwYXlsb2FkX2RpciA9IGNvbW1vbi5NYWtlVGVtcERpcigpCiAgICAgZXh0cmFjdF9jbWQgPSBbJ2RlYXBleGVyJywgJy0tZGVidWdmc19wYXRoJywgc2VsZi5kZWJ1Z2ZzX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgJy0tZnNja2Vyb2ZzX3BhdGgnLCBzZWxmLmZzY2tlcm9mc19wYXRoLAotICAgICAgICAgICAgICAgICAgICctLWJsa2lkX3BhdGgnLCBzZWxmLmJsa2lkX3BhdGgsICdleHRyYWN0JywKKyAgICAgICAgICAgICAgICAgICAnZXh0cmFjdCcsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hcGV4X3BhdGgsIHBheWxvYWRfZGlyXQogICAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChleHRyYWN0X2NtZCkKLSAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMoc2VsZi5hcGV4X3BhdGgpCiAKICAgICBoYXNfc2lnbmVkX2NvbnRlbnQgPSBGYWxzZQogICAgIGZvciBlbnRyeSBpbiBhcGtfZW50cmllczoKICAgICAgIGFwa19wYXRoID0gb3MucGF0aC5qb2luKHBheWxvYWRfZGlyLCBlbnRyeSkKKyAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhzZWxmLmFwZXhfcGF0aCkKIAogICAgICAga2V5X25hbWUgPSBhcGtfa2V5cy5nZXQob3MucGF0aC5iYXNlbmFtZShlbnRyeSkpCiAgICAgICBpZiBrZXlfbmFtZSBpbiBjb21tb24uU1BFQ0lBTF9DRVJUX1NUUklOR1M6CkBAIC0xNjEsMzcgKzE1MCw2IEBACiAgICAgICAgICAgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcD1zZWxmLmNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXApCiAgICAgICBoYXNfc2lnbmVkX2NvbnRlbnQgPSBUcnVlCiAKLSAgICBmb3IgZW50cnkgaW4gc2Vwb2xpY3lfZW50cmllczoKLSAgICAgIHNlcG9saWN5X3BhdGggPSBvcy5wYXRoLmpvaW4ocGF5bG9hZF9kaXIsIGVudHJ5KQotCi0gICAgICBpZiBub3QgJ2V0YycgaW4gZW50cnk6Ci0gICAgICAgIGxvZ2dlci53YXJuaW5nKCdTZXBvbGljeSBwYXRoIGRvZXMgbm90IGNvbnRhaW4gdGhlIGludGVuZGVkIGRpcmVjdG9yeSBuYW1lIGV0YzonCi0gICAgICAgICAgICAgICAgICAgICAgICcgJXMnLCBlbnRyeSkKLQotICAgICAga2V5X25hbWUgPSBhcGtfa2V5cy5nZXQob3MucGF0aC5iYXNlbmFtZShlbnRyeSkpCi0gICAgICBpZiBrZXlfbmFtZSBpcyBOb25lOgotICAgICAgICBsb2dnZXIud2FybmluZygnRmFpbGVkIHRvIGZpbmQgc2lnbmluZyBrZXlzIGZvciB7fSBpbicKLSAgICAgICAgICAgICAgICAgICAgICAgJyBhcGV4IHt9LCBwYXlsb2FkIGtleSB3aWxsIGJlIHVzZWQgaW5zdGVhZC4nCi0gICAgICAgICAgICAgICAgICAgICAgICcgVXNlICItZSA8bmFtZT49IiB0byBzcGVjaWZ5IGEga2V5JwotICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGVudHJ5LCBzZWxmLmFwZXhfcGF0aCkpCi0gICAgICAgIGtleV9uYW1lID0gcGF5bG9hZF9rZXkKLQotICAgICAgaWYga2V5X25hbWUgaW4gY29tbW9uLlNQRUNJQUxfQ0VSVF9TVFJJTkdTOgotICAgICAgICBsb2dnZXIuaW5mbygnTm90IHNpZ25pbmc6ICVzIGR1ZSB0byBzcGVjaWFsIGNlcnQgc3RyaW5nJywgc2Vwb2xpY3lfcGF0aCkKLSAgICAgICAgY29udGludWUKLQotICAgICAgaWYgT1BUSU9OUy5zaWduX3NlcG9saWN5X3BhdGggaXMgbm90IE5vbmU6Ci0gICAgICAgIHNpZ19wYXRoID0gb3MucGF0aC5qb2luKHBheWxvYWRfZGlyLCBzZXBvbGljeV9wYXRoICsgJy5zaWcnKQotICAgICAgICBmc3Zfc2lnX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF5bG9hZF9kaXIsIHNlcG9saWN5X3BhdGggKyAnLmZzdl9zaWcnKQotICAgICAgICBvbGRfc2lnID0gY29tbW9uLk1ha2VUZW1wRmlsZSgpCi0gICAgICAgIG9sZF9mc3Zfc2lnID0gY29tbW9uLk1ha2VUZW1wRmlsZSgpCi0gICAgICAgIG9zLnJlbmFtZShzaWdfcGF0aCwgb2xkX3NpZykKLSAgICAgICAgb3MucmVuYW1lKGZzdl9zaWdfcGF0aCwgb2xkX2Zzdl9zaWcpCi0KLSAgICAgIGxvZ2dlci5pbmZvKCdTaWduaW5nIHNlcG9saWN5IGZpbGUgJXMgaW4gYXBleCAlcycsIHNlcG9saWN5X3BhdGgsIHNlbGYuYXBleF9wYXRoKQotICAgICAgaWYgY29tbW9uLlNpZ25TZVBvbGljeShzZXBvbGljeV9wYXRoLCBrZXlfbmFtZSwgc2VsZi5rZXlfcGFzc3dvcmRzLmdldChrZXlfbmFtZSkpOgotICAgICAgICBoYXNfc2lnbmVkX2NvbnRlbnQgPSBUcnVlCi0KICAgICBpZiBzZWxmLnNpZ25fdG9vbDoKICAgICAgIGxvZ2dlci5pbmZvKCdTaWduaW5nIHBheWxvYWQgY29udGVudHMgaW4gYXBleCAlcyB3aXRoICVzJywgc2VsZi5hcGV4X3BhdGgsIHNlbGYuc2lnbl90b29sKQogICAgICAgIyBQYXNzIGF2YnRvb2wgdG8gdGhlIGN1c3RvbSBzaWduaW5nIHRvb2wKQEAgLTM3NSw4ICszMzMsNyBAQAogCiBkZWYgU2lnblVuY29tcHJlc3NlZEFwZXgoYXZidG9vbCwgYXBleF9maWxlLCBwYXlsb2FkX2tleSwgY29udGFpbmVyX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfcHcsIGFwa19rZXlzLCBjb2RlbmFtZV90b19hcGlfbGV2ZWxfbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5vX2hhc2h0cmVlLCBzaWduaW5nX2FyZ3M9Tm9uZSwgc2lnbl90b29sPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXNfc2Vwb2xpY3k9RmFsc2UpOgorICAgICAgICAgICAgICAgICAgICAgICAgIG5vX2hhc2h0cmVlLCBzaWduaW5nX2FyZ3M9Tm9uZSwgc2lnbl90b29sPU5vbmUpOgogICAiIiJTaWducyB0aGUgY3VycmVudCB1bmNvbXByZXNzZWQgQVBFWCB3aXRoIHRoZSBnaXZlbiBwYXlsb2FkL2NvbnRhaW5lciBrZXlzLgogCiAgIEFyZ3M6CkBAIC0zODksNyArMzQ2LDYgQEAKICAgICBub19oYXNodHJlZTogRG9uJ3QgaW5jbHVkZSBoYXNodHJlZSBpbiB0aGUgc2lnbmVkIEFQRVguCiAgICAgc2lnbmluZ19hcmdzOiBBZGRpdGlvbmFsIGFyZ3MgdG8gYmUgcGFzc2VkIHRvIHRoZSBwYXlsb2FkIHNpZ25lci4KICAgICBzaWduX3Rvb2w6IEEgdG9vbCB0byBzaWduIHRoZSBjb250ZW50cyBvZiB0aGUgQVBFWC4KLSAgICBpc19zZXBvbGljeTogSW5kaWNhdGVzIGlmIHRoZSBhcGV4IGlzIGEgc2Vwb2xpY3kuYXBleAogCiAgIFJldHVybnM6CiAgICAgVGhlIHBhdGggdG8gdGhlIHNpZ25lZCBBUEVYIGZpbGUuCkBAIC0zOTksOCArMzU1LDcgQEAKICAgYXBrX3NpZ25lciA9IEFwZXhBcGtTaWduZXIoYXBleF9maWxlLCBjb250YWluZXJfcHcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YnRvb2wsIHNpZ25fdG9vbCkKLSAgYXBleF9maWxlID0gYXBrX3NpZ25lci5Qcm9jZXNzQXBleEZpbGUoCi0gICAgICBhcGtfa2V5cywgcGF5bG9hZF9rZXksIHNpZ25pbmdfYXJncywgaXNfc2Vwb2xpY3kpCisgIGFwZXhfZmlsZSA9IGFwa19zaWduZXIuUHJvY2Vzc0FwZXhGaWxlKGFwa19rZXlzLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKQogCiAgICMgMmEuIEV4dHJhY3QgYW5kIHNpZ24gdGhlIEFQRVhfUEFZTE9BRF9JTUFHRSBlbnRyeSB3aXRoIHRoZSBnaXZlbgogICAjIHBheWxvYWRfa2V5LgpAQCAtNDU0LDggKzQwOSw3IEBACiAKIGRlZiBTaWduQ29tcHJlc3NlZEFwZXgoYXZidG9vbCwgYXBleF9maWxlLCBwYXlsb2FkX2tleSwgY29udGFpbmVyX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3B3LCBhcGtfa2V5cywgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgbm9faGFzaHRyZWUsIHNpZ25pbmdfYXJncz1Ob25lLCBzaWduX3Rvb2w9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaXNfc2Vwb2xpY3k9RmFsc2UpOgorICAgICAgICAgICAgICAgICAgICAgICBub19oYXNodHJlZSwgc2lnbmluZ19hcmdzPU5vbmUsIHNpZ25fdG9vbD1Ob25lKToKICAgIiIiU2lnbnMgdGhlIGN1cnJlbnQgY29tcHJlc3NlZCBBUEVYIHdpdGggdGhlIGdpdmVuIHBheWxvYWQvY29udGFpbmVyIGtleXMuCiAKICAgQXJnczoKQEAgLTQ2Nyw3ICs0MjEsNiBAQAogICAgIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXA6IEEgZGljdCB0aGF0IG1hcHMgZnJvbSBjb2RlbmFtZSB0byBBUEkgbGV2ZWwuCiAgICAgbm9faGFzaHRyZWU6IERvbid0IGluY2x1ZGUgaGFzaHRyZWUgaW4gdGhlIHNpZ25lZCBBUEVYLgogICAgIHNpZ25pbmdfYXJnczogQWRkaXRpb25hbCBhcmdzIHRvIGJlIHBhc3NlZCB0byB0aGUgcGF5bG9hZCBzaWduZXIuCi0gICAgaXNfc2Vwb2xpY3k6IEluZGljYXRlcyBpZiB0aGUgYXBleCBpcyBhIHNlcG9saWN5LmFwZXgKIAogICBSZXR1cm5zOgogICAgIFRoZSBwYXRoIHRvIHRoZSBzaWduZWQgQVBFWCBmaWxlLgpAQCAtNDk0LDggKzQ0Nyw3IEBACiAgICAgICBjb2RlbmFtZV90b19hcGlfbGV2ZWxfbWFwLAogICAgICAgbm9faGFzaHRyZWUsCiAgICAgICBzaWduaW5nX2FyZ3MsCi0gICAgICBzaWduX3Rvb2wsCi0gICAgICBpc19zZXBvbGljeSkKKyAgICAgIHNpZ25fdG9vbCkKIAogICAjIDMuIENvbXByZXNzIHNpZ25lZCBvcmlnaW5hbCBhcGV4LgogICBjb21wcmVzc2VkX2FwZXhfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSdhcGV4LWNvbnRhaW5lci0nLApAQCAtNTIyLDggKzQ3NCw4IEBACiAKIAogZGVmIFNpZ25BcGV4KGF2YnRvb2wsIGFwZXhfZGF0YSwgcGF5bG9hZF9rZXksIGNvbnRhaW5lcl9rZXksIGNvbnRhaW5lcl9wdywKLSAgICAgICAgICAgICBhcGtfa2V5cywgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCwgbm9faGFzaHRyZWUsCi0gICAgICAgICAgICAgc2lnbmluZ19hcmdzPU5vbmUsIHNpZ25fdG9vbD1Ob25lLCBpc19zZXBvbGljeT1GYWxzZSk6CisgICAgICAgICAgICAgYXBrX2tleXMsIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXAsCisgICAgICAgICAgICAgbm9faGFzaHRyZWUsIHNpZ25pbmdfYXJncz1Ob25lLCBzaWduX3Rvb2w9Tm9uZSk6CiAgICIiIlNpZ25zIHRoZSBjdXJyZW50IEFQRVggd2l0aCB0aGUgZ2l2ZW4gcGF5bG9hZC9jb250YWluZXIga2V5cy4KIAogICBBcmdzOgpAQCAtNTM1LDcgKzQ4Nyw2IEBACiAgICAgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcDogQSBkaWN0IHRoYXQgbWFwcyBmcm9tIGNvZGVuYW1lIHRvIEFQSSBsZXZlbC4KICAgICBub19oYXNodHJlZTogRG9uJ3QgaW5jbHVkZSBoYXNodHJlZSBpbiB0aGUgc2lnbmVkIEFQRVguCiAgICAgc2lnbmluZ19hcmdzOiBBZGRpdGlvbmFsIGFyZ3MgdG8gYmUgcGFzc2VkIHRvIHRoZSBwYXlsb2FkIHNpZ25lci4KLSAgICBpc19zZXBvbGljeTogSW5kaWNhdGVzIGlmIHRoZSBhcGV4IGlzIGEgc2Vwb2xpY3kuYXBleAogCiAgIFJldHVybnM6CiAgICAgVGhlIHBhdGggdG8gdGhlIHNpZ25lZCBBUEVYIGZpbGUuCkBAIC01NjEsOCArNTEyLDcgQEAKICAgICAgICAgICBub19oYXNodHJlZT1ub19oYXNodHJlZSwKICAgICAgICAgICBhcGtfa2V5cz1hcGtfa2V5cywKICAgICAgICAgICBzaWduaW5nX2FyZ3M9c2lnbmluZ19hcmdzLAotICAgICAgICAgIHNpZ25fdG9vbD1zaWduX3Rvb2wsCi0gICAgICAgICAgaXNfc2Vwb2xpY3k9aXNfc2Vwb2xpY3kpCisgICAgICAgICAgc2lnbl90b29sPXNpZ25fdG9vbCkKICAgICBlbGlmIGFwZXhfdHlwZSA9PSAnQ09NUFJFU1NFRCc6CiAgICAgICByZXR1cm4gU2lnbkNvbXByZXNzZWRBcGV4KAogICAgICAgICAgIGF2YnRvb2wsCkBAIC01NzQsOCArNTI0LDcgQEAKICAgICAgICAgICBub19oYXNodHJlZT1ub19oYXNodHJlZSwKICAgICAgICAgICBhcGtfa2V5cz1hcGtfa2V5cywKICAgICAgICAgICBzaWduaW5nX2FyZ3M9c2lnbmluZ19hcmdzLAotICAgICAgICAgIHNpZ25fdG9vbD1zaWduX3Rvb2wsCi0gICAgICAgICAgaXNfc2Vwb2xpY3k9aXNfc2Vwb2xpY3kpCisgICAgICAgICAgc2lnbl90b29sPXNpZ25fdG9vbCkKICAgICBlbHNlOgogICAgICAgIyBUT0RPKGIvMTcyOTEyMjMyKTogc3VwcG9ydCBzaWduaW5nIGNvbXByZXNzZWQgYXBleAogICAgICAgcmFpc2UgQXBleEluZm9FcnJvcignVW5zdXBwb3J0ZWQgYXBleCB0eXBlIHt9Jy5mb3JtYXQoYXBleF90eXBlKSkKQEAgLTU4NSwyMiArNTM0LDI4IEBACiAgICAgICAgICdGYWlsZWQgdG8gZ2V0IHR5cGUgZm9yIHt9Olxue30nLmZvcm1hdChhcGV4X2ZpbGUsIGUpKQogCiAKLWRlZiBHZXRBcGV4SW5mb0Zyb21UYXJnZXRGaWxlcyhpbnB1dF9maWxlLCBwYXJ0aXRpb24sIGNvbXByZXNzZWRfb25seT1UcnVlKToKK2RlZiBHZXRBcGV4SW5mb0Zyb21UYXJnZXRGaWxlcyhpbnB1dF9maWxlKToKICAgIiIiCi0gIEdldCBpbmZvcm1hdGlvbiBhYm91dCBzeXN0ZW0gQVBFWCBzdG9yZWQgaW4gdGhlIGlucHV0X2ZpbGUgemlwCisgIEdldCBpbmZvcm1hdGlvbiBhYm91dCBBUEVYZXMgc3RvcmVkIGluIHRoZSBpbnB1dF9maWxlIHppcAogCiAgIEFyZ3M6CiAgICAgaW5wdXRfZmlsZTogVGhlIGZpbGVuYW1lIG9mIHRoZSB0YXJnZXQgYnVpbGQgdGFyZ2V0LWZpbGVzIHppcCBvciBkaXJlY3RvcnkuCiAKICAgUmV0dXJuOgogICAgIEEgbGlzdCBvZiBvdGFfbWV0YWRhdGFfcGIyLkFwZXhJbmZvKCkgcG9wdWxhdGVkIHVzaW5nIHRoZSBBUEVYIHN0b3JlZCBpbgotICAgIC9zeXN0ZW0gcGFydGl0aW9uIG9mIHRoZSBpbnB1dF9maWxlCisgICAgZWFjaCBwYXJ0aXRpb24gb2YgdGhlIGlucHV0X2ZpbGUKICAgIiIiCiAKICAgIyBFeHRyYWN0IHRoZSBhcGV4IGZpbGVzIHNvIHRoYXQgd2UgY2FuIHJ1biBjaGVja3Mgb24gdGhlbQogICBpZiBub3QgaXNpbnN0YW5jZShpbnB1dF9maWxlLCBzdHIpOgogICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigibXVzdCBwYXNzIGZpbGVwYXRoIHRvIHRhcmdldC1maWxlcyB6aXAgb3IgZGlyZWN0b3J5IikKKyAgYXBleF9pbmZvcyA9IFtdCisgIGZvciBwYXJ0aXRpb24gaW4gWydzeXN0ZW0nLCAnc3lzdGVtX2V4dCcsICdwcm9kdWN0JywgJ3ZlbmRvciddOgorICAgIGFwZXhfaW5mb3MuZXh0ZW5kKEdldEFwZXhJbmZvRm9yUGFydGl0aW9uKGlucHV0X2ZpbGUsIHBhcnRpdGlvbikpCisgIHJldHVybiBhcGV4X2luZm9zCiAKKworZGVmIEdldEFwZXhJbmZvRm9yUGFydGl0aW9uKGlucHV0X2ZpbGUsIHBhcnRpdGlvbik6CiAgIGFwZXhfc3ViZGlyID0gb3MucGF0aC5qb2luKHBhcnRpdGlvbi51cHBlcigpLCAnYXBleCcpCiAgIGlmIG9zLnBhdGguaXNkaXIoaW5wdXRfZmlsZSk6CiAgICAgdG1wX2RpciA9IGlucHV0X2ZpbGUKQEAgLTY1OCw3ICs2MTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICctLW91dHB1dCcsIGRlY29tcHJlc3NlZF9maWxlX3BhdGhdKQogICAgICAgYXBleF9pbmZvLmRlY29tcHJlc3NlZF9zaXplID0gb3MucGF0aC5nZXRzaXplKGRlY29tcHJlc3NlZF9maWxlX3BhdGgpCiAKLSAgICBpZiBub3QgY29tcHJlc3NlZF9vbmx5IG9yIGFwZXhfaW5mby5pc19jb21wcmVzc2VkOgotICAgICAgYXBleF9pbmZvcy5hcHBlbmQoYXBleF9pbmZvKQorICAgIGFwZXhfaW5mb3MuYXBwZW5kKGFwZXhfaW5mbykKIAogICByZXR1cm4gYXBleF9pbmZvcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5CmluZGV4IDkwNjQxMzYuLjQ2NGFkOWIgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkKQEAgLTEsNCArMSw0IEBACi0jIS91c3IvYmluL2VudiBweXRob24KKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKICMKICMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKQEAgLTIyLDI1ICsyMiwzNiBAQAogICAgICAgICAgICAgdGFyZ2V0X291dHB1dF9kaXJlY3RvcnkKICIiIgogCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgZGF0ZXRpbWUKIAoraW1wb3J0IGFyZ3BhcnNlCiBpbXBvcnQgZ2xvYgogaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcwogaW1wb3J0IG9zLnBhdGgKIGltcG9ydCByZQoraW1wb3J0IHNobGV4CiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3lzCitpbXBvcnQgdXVpZAoraW1wb3J0IHRlbXBmaWxlCiAKIGltcG9ydCBjb21tb24KIGltcG9ydCB2ZXJpdHlfdXRpbHMKIAorCiBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAogT1BUSU9OUyA9IGNvbW1vbi5PUFRJT05TCiBCTE9DS19TSVpFID0gY29tbW9uLkJMT0NLX1NJWkUKIEJZVEVTX0lOX01CID0gMTAyNCAqIDEwMjQKIAorIyBVc2UgYSBmaXhlZCB0aW1lc3RhbXAgKDAxLzAxLzIwMDkgMDA6MDA6MDAgVVRDKSBmb3IgZmlsZXMgd2hlbiBwYWNrYWdpbmcKKyMgaW1hZ2VzLiAoYi8yNDM3Nzk5MywgYi84MDYwMDkzMSkKK0ZJWEVEX0ZJTEVfVElNRVNUQU1QID0gaW50KCgKKyAgICBkYXRldGltZS5kYXRldGltZSgyMDA5LCAxLCAxLCAwLCAwLCAwLCAwLCBOb25lKSAtCisgICAgZGF0ZXRpbWUuZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCgwKSkudG90YWxfc2Vjb25kcygpKQorCiAKIGNsYXNzIEJ1aWxkSW1hZ2VFcnJvcihFeGNlcHRpb24pOgogICAiIiJBbiBFeGNlcHRpb24gcmFpc2VkIGR1cmluZyBpbWFnZSBidWlsZGluZy4iIiIKQEAgLTI0OSw3ICsyNjAsNyBAQAogICBpZiBmc190eXBlLnN0YXJ0c3dpdGgoImV4dDQiKSBhbmQgcGFydGl0aW9uX2hlYWRyb29tID4gcmVzZXJ2ZWRfc2l6ZToKICAgICByZXNlcnZlZF9zaXplID0gcGFydGl0aW9uX2hlYWRyb29tCiAKLSAgcmV0dXJuIHNpemUgKyByZXNlcnZlZF9zaXplCisgIHJldHVybiBpbnQoc2l6ZSAqIDEuMSkgKyByZXNlcnZlZF9zaXplCiAKIAogZGVmIEJ1aWxkSW1hZ2VNa2ZzKGluX2RpciwgcHJvcF9kaWN0LCBvdXRfZmlsZSwgdGFyZ2V0X291dCwgZnNfY29uZmlnKToKQEAgLTI4Myw3ICsyOTQsNyBAQAogICAgIGJ1aWxkX2NvbW1hbmQgPSBbcHJvcF9kaWN0WyJleHRfbWt1c2VyaW1nIl1dCiAgICAgaWYgImV4dGZzX3NwYXJzZV9mbGFnIiBpbiBwcm9wX2RpY3QgYW5kIG5vdCBkaXNhYmxlX3NwYXJzZToKICAgICAgIGJ1aWxkX2NvbW1hbmQuYXBwZW5kKHByb3BfZGljdFsiZXh0ZnNfc3BhcnNlX2ZsYWciXSkKLSAgICAgIHJ1bl9lMmZzY2sgPSBSdW5FMmZzY2sKKyAgICAgIHJ1bl9mc2NrID0gUnVuRTJmc2NrCiAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoW2luX2Rpciwgb3V0X2ZpbGUsIGZzX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BfZGljdFsibW91bnRfcG9pbnQiXV0pCiAgICAgYnVpbGRfY29tbWFuZC5hcHBlbmQocHJvcF9kaWN0WyJpbWFnZV9zaXplIl0pCkBAIC0zNDIsNiArMzUzLDggQEAKICAgICBpZiBjb21wcmVzc19oaW50czoKICAgICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLS1jb21wcmVzcy1oaW50cyIsIGNvbXByZXNzX2hpbnRzXSkKIAorICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLWIiLCBwcm9wX2RpY3QuZ2V0KCJlcm9mc19ibG9ja3NpemUiLCAiNDA5NiIpXSkKKwogICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLS1tb3VudC1wb2ludCIsIHByb3BfZGljdFsibW91bnRfcG9pbnQiXV0pCiAgICAgaWYgdGFyZ2V0X291dDoKICAgICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLS1wcm9kdWN0LW91dCIsIHRhcmdldF9vdXRdKQpAQCAtNDI0LDYgKzQzNyw4IEBACiAgICAgICAgIHNsZGNfZmxhZ3MgPSBzbGRjX2ZsYWdzX3N0ci5zcGxpdCgpCiAgICAgICAgIGJ1aWxkX2NvbW1hbmQuYXBwZW5kKHN0cihsZW4oc2xkY19mbGFncykpKQogICAgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChzbGRjX2ZsYWdzKQorICAgIGYyZnNfYmxvY2tzaXplID0gcHJvcF9kaWN0LmdldCgiZjJmc19ibG9ja3NpemUiLCAiNDA5NiIpCisgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItYiIsIGYyZnNfYmxvY2tzaXplXSkKICAgZWxzZToKICAgICByYWlzZSBCdWlsZEltYWdlRXJyb3IoCiAgICAgICAgICJFcnJvcjogdW5rbm93biBmaWxlc3lzdGVtIHR5cGU6IHt9Ii5mb3JtYXQoZnNfdHlwZSkpCkBAIC00ODcsNiArNTAyLDIwIEBACiAgICAgcmFpc2UKIAogCitkZWYgU2V0VVVJRElmTm90RXhpc3QoaW1hZ2VfcHJvcHMpOgorCisgICMgVXNlIHJlcGVhdGFibGUgZXh0NCBGUyBVVUlEIGFuZCBoYXNoX3NlZWQgVVVJRCAoYmFzZWQgb24gcGFydGl0aW9uIG5hbWUgYW5kCisgICMgYnVpbGQgZmluZ2VycHJpbnQpLiBBbHNvIHVzZSB0aGUgbGVnYWN5IGJ1aWxkIGlkLCBiZWNhdXNlIHRoZSB2Ym1ldGEgZGlnZXN0CisgICMgaXNuJ3QgYXZhaWxhYmxlIGF0IHRoaXMgcG9pbnQuCisgIHdoYXQgPSBpbWFnZV9wcm9wc1sibW91bnRfcG9pbnQiXQorICBmaW5nZXJwcmludCA9IGltYWdlX3Byb3BzLmdldCgiZmluZ2VycHJpbnQiLCAiIikKKyAgdXVpZF9zZWVkID0gd2hhdCArICItIiArIGZpbmdlcnByaW50CisgIGxvZ2dlci5pbmZvKCJVc2luZyBmaW5nZXJwcmludCAlcyBmb3IgcGFydGl0aW9uICVzIiwgZmluZ2VycHJpbnQsIHdoYXQpCisgIGltYWdlX3Byb3BzWyJ1dWlkIl0gPSBzdHIodXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9VUkwsIHV1aWRfc2VlZCkpCisgIGhhc2hfc2VlZCA9ICJoYXNoX3NlZWQtIiArIHV1aWRfc2VlZAorICBpbWFnZV9wcm9wc1siaGFzaF9zZWVkIl0gPSBzdHIodXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9VUkwsIGhhc2hfc2VlZCkpCisKKwogZGVmIEJ1aWxkSW1hZ2UoaW5fZGlyLCBwcm9wX2RpY3QsIG91dF9maWxlLCB0YXJnZXRfb3V0PU5vbmUpOgogICAiIiJCdWlsZHMgYW4gaW1hZ2UgZm9yIHRoZSBmaWxlcyB1bmRlciBpbl9kaXIgYW5kIHdyaXRlcyBpdCB0byBvdXRfZmlsZS4KIApAQCAtNTA0LDYgKzUzMyw3IEBACiAgICAgQnVpbGRJbWFnZUVycm9yOiBPbiBidWlsZCBpbWFnZSBmYWlsdXJlcy4KICAgIiIiCiAgIGluX2RpciwgZnNfY29uZmlnID0gU2V0VXBJbkRpckFuZEZzQ29uZmlnKGluX2RpciwgcHJvcF9kaWN0KQorICBTZXRVVUlESWZOb3RFeGlzdChwcm9wX2RpY3QpCiAKICAgYnVpbGRfY29tbWFuZCA9IFtdCiAgIGZzX3R5cGUgPSBwcm9wX2RpY3QuZ2V0KCJmc190eXBlIiwgIiIpCkBAIC02MDYsNyArNjM2LDcgQEAKICAgICAgIHNpemUgPSB2ZXJpdHlfaW1hZ2VfYnVpbGRlci5DYWxjdWxhdGVEeW5hbWljUGFydGl0aW9uU2l6ZShzaXplKQogICAgIHByb3BfZGljdFsicGFydGl0aW9uX3NpemUiXSA9IHN0cihzaXplKQogICAgIGxvZ2dlci5pbmZvKAotICAgICAgICAiQWxsb2NhdGluZyAlZCBNQiBmb3IgJXMuIiwgc2l6ZSAvLyBCWVRFU19JTl9NQiwgb3V0X2ZpbGUpCisgICAgICAgICJBbGxvY2F0aW5nICVkIE1CIGZvciAlcyIsIHNpemUgLy8gQllURVNfSU5fTUIsIG91dF9maWxlKQogCiAgIHByb3BfZGljdFsiaW1hZ2Vfc2l6ZSJdID0gcHJvcF9kaWN0WyJwYXJ0aXRpb25fc2l6ZSJdCiAKQEAgLTYzNSw2ICs2NjUsMTkgQEAKICAgICB2ZXJpdHlfaW1hZ2VfYnVpbGRlci5CdWlsZChvdXRfZmlsZSkKIAogCitkZWYgVHJ5UGFyc2VGaW5nZXJwcmludChnbG9iX2RpY3Q6IGRpY3QpOgorICBmb3IgKGtleSwgdmFsKSBpbiBnbG9iX2RpY3QuaXRlbXMoKToKKyAgICBpZiBub3Qga2V5LmVuZHN3aXRoKCJfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzIikgYW5kIG5vdCBrZXkuZW5kc3dpdGgoIl9hZGRfaGFzaF9mb290ZXJfYXJncyIpOgorICAgICAgY29udGludWUKKyAgICBmb3IgYXJnIGluIHNobGV4LnNwbGl0KHZhbCk6CisgICAgICBtID0gcmUubWF0Y2gociJeY29tXC5hbmRyb2lkXC5idWlsZFwuXHcrXC5maW5nZXJwcmludDoiLCBhcmcpCisgICAgICBpZiBtIGlzIE5vbmU6CisgICAgICAgIGNvbnRpbnVlCisgICAgICBmaW5nZXJwcmludCA9IGFyZ1tsZW4obS5ncm91cCgpKTpdCisgICAgICBnbG9iX2RpY3RbImZpbmdlcnByaW50Il0gPSBmaW5nZXJwcmludAorICAgICAgcmV0dXJuCisKKwogZGVmIEltYWdlUHJvcEZyb21HbG9iYWxEaWN0KGdsb2JfZGljdCwgbW91bnRfcG9pbnQpOgogICAiIiJCdWlsZCBhbiBpbWFnZSBwcm9wZXJ0eSBkaWN0aW9uYXJ5IGZyb20gdGhlIGdsb2JhbCBkaWN0aW9uYXJ5LgogCkBAIC02NDMsNyArNjg2LDExIEBACiAgICAgbW91bnRfcG9pbnQ6IHN1Y2ggYXMgInN5c3RlbSIsICJkYXRhIiBldGMuCiAgICIiIgogICBkID0ge30KKyAgVHJ5UGFyc2VGaW5nZXJwcmludChnbG9iX2RpY3QpCiAKKyAgIyBTZXQgZml4ZWQgdGltZXN0YW1wIGZvciBidWlsZGluZyB0aGUgT1RBIHBhY2thZ2UuCisgIGlmICJ1c2VfZml4ZWRfdGltZXN0YW1wIiBpbiBnbG9iX2RpY3Q6CisgICAgZFsidGltZXN0YW1wIl0gPSBGSVhFRF9GSUxFX1RJTUVTVEFNUAogICBpZiAiYnVpbGQucHJvcCIgaW4gZ2xvYl9kaWN0OgogICAgIHRpbWVzdGFtcCA9IGdsb2JfZGljdFsiYnVpbGQucHJvcCJdLkdldFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIikKICAgICBpZiB0aW1lc3RhbXA6CkBAIC02NjgsNiArNzE1LDcgQEAKICAgICAgICJlcm9mc19kZWZhdWx0X2NvbXByZXNzb3IiLAogICAgICAgImVyb2ZzX2RlZmF1bHRfY29tcHJlc3NfaGludHMiLAogICAgICAgImVyb2ZzX3BjbHVzdGVyX3NpemUiLAorICAgICAgImVyb2ZzX2Jsb2Nrc2l6ZSIsCiAgICAgICAiZXJvZnNfc2hhcmVfZHVwX2Jsb2NrcyIsCiAgICAgICAiZXJvZnNfc3BhcnNlX2ZsYWciLAogICAgICAgImVyb2ZzX3VzZV9sZWdhY3lfY29tcHJlc3Npb24iLApAQCAtNjc1LDExICs3MjMsMTMgQEAKICAgICAgICJzeXN0ZW1fZjJmc19jb21wcmVzcyIsCiAgICAgICAic3lzdGVtX2YyZnNfc2xkY19mbGFncyIsCiAgICAgICAiZjJmc19zcGFyc2VfZmxhZyIsCisgICAgICAiZjJmc19ibG9ja3NpemUiLAogICAgICAgInNraXBfZnNjayIsCiAgICAgICAiZXh0X21rdXNlcmltZyIsCiAgICAgICAiYXZiX2VuYWJsZSIsCiAgICAgICAiYXZiX2F2YnRvb2wiLAogICAgICAgInVzZV9keW5hbWljX3BhcnRpdGlvbl9zaXplIiwKKyAgICAgICJmaW5nZXJwcmludCIsCiAgICkKICAgZm9yIHAgaW4gY29tbW9uX3Byb3BzOgogICAgIGNvcHlfcHJvcChwLCBwKQpAQCAtNzE4LDEwICs3NjgsMTIgQEAKICAgICAgIChUcnVlLCAie31fZXJvZnNfY29tcHJlc3NvciIsICJlcm9mc19jb21wcmVzc29yIiksCiAgICAgICAoVHJ1ZSwgInt9X2Vyb2ZzX2NvbXByZXNzX2hpbnRzIiwgImVyb2ZzX2NvbXByZXNzX2hpbnRzIiksCiAgICAgICAoVHJ1ZSwgInt9X2Vyb2ZzX3BjbHVzdGVyX3NpemUiLCAiZXJvZnNfcGNsdXN0ZXJfc2l6ZSIpLAorICAgICAgKFRydWUsICJ7fV9lcm9mc19ibG9ja3NpemUiLCAiZXJvZnNfYmxvY2tzaXplIiksCiAgICAgICAoVHJ1ZSwgInt9X2Vyb2ZzX3NoYXJlX2R1cF9ibG9ja3MiLCAiZXJvZnNfc2hhcmVfZHVwX2Jsb2NrcyIpLAogICAgICAgKFRydWUsICJ7fV9leHRmc19pbm9kZV9jb3VudCIsICJleHRmc19pbm9kZV9jb3VudCIpLAogICAgICAgKFRydWUsICJ7fV9mMmZzX2NvbXByZXNzIiwgImYyZnNfY29tcHJlc3MiKSwKICAgICAgIChUcnVlLCAie31fZjJmc19zbGRjX2ZsYWdzIiwgImYyZnNfc2xkY19mbGFncyIpLAorICAgICAgKFRydWUsICJ7fV9mMmZzX2Jsb2Nrc2l6ZSIsICJmMmZzX2Jsb2NrX3NpemUiKSwKICAgICAgIChUcnVlLCAie31fcmVzZXJ2ZWRfc2l6ZSIsICJwYXJ0aXRpb25fcmVzZXJ2ZWRfc2l6ZSIpLAogICAgICAgKFRydWUsICJ7fV9zcXVhc2hmc19ibG9ja19zaXplIiwgInNxdWFzaGZzX2Jsb2NrX3NpemUiKSwKICAgICAgIChUcnVlLCAie31fc3F1YXNoZnNfY29tcHJlc3NvciIsICJzcXVhc2hmc19jb21wcmVzc29yIiksCkBAIC03NjksNyArODIxLDYgQEAKICAgZFsibW91bnRfcG9pbnQiXSA9IG1vdW50X3BvaW50CiAgIGlmIG1vdW50X3BvaW50ID09ICJzeXN0ZW0iOgogICAgIGNvcHlfcHJvcCgic3lzdGVtX2hlYWRyb29tIiwgInBhcnRpdGlvbl9oZWFkcm9vbSIpCi0gICAgY29weV9wcm9wKCJzeXN0ZW1fcm9vdF9pbWFnZSIsICJzeXN0ZW1fcm9vdF9pbWFnZSIpCiAgICAgY29weV9wcm9wKCJyb290X2RpciIsICJyb290X2RpciIpCiAgICAgY29weV9wcm9wKCJyb290X2ZzX2NvbmZpZyIsICJyb290X2ZzX2NvbmZpZyIpCiAgIGVsaWYgbW91bnRfcG9pbnQgPT0gImRhdGEiOgpAQCAtODcwLDM0ICs5MjEsNzkgQEAKICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiB2Ym1ldGFfdmVuZG9yLnNwbGl0KCldCiAgICAgICB2Ym1ldGFfcGFydGl0aW9ucy5hcHBlbmQoInZibWV0YV92ZW5kb3IiKQogCi0KICAgcGFydGl0aW9ucyA9IHtwYXJ0OiBvcy5wYXRoLmpvaW4oaW5fZGlyLCBwYXJ0ICsgIi5pbWciKQogICAgICAgICAgICAgICAgIGZvciBwYXJ0IGluIHZibWV0YV9wYXJ0aXRpb25zfQotICBwYXJ0aXRpb25zID0ge3BhcnQ6cGF0aCBmb3IgKHBhcnQsIHBhdGgpIGluIHBhcnRpdGlvbnMuaXRlbXMoKSBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKX0KKyAgcGFydGl0aW9ucyA9IHtwYXJ0OiBwYXRoIGZvciAocGFydCwgcGF0aCkgaW4gcGFydGl0aW9ucy5pdGVtcygpIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpfQogICBjb21tb24uQnVpbGRWQk1ldGEob3V0cHV0X3BhdGgsIHBhcnRpdGlvbnMsIG5hbWUsIHZibWV0YV9wYXJ0aXRpb25zKQogCiAKLWRlZiBtYWluKGFyZ3YpOgotICBhcmdzID0gY29tbW9uLlBhcnNlT3B0aW9ucyhhcmd2LCBfX2RvY19fKQorZGVmIEJ1aWxkSW1hZ2VPclZCTWV0YShpbnB1dF9kaXJlY3RvcnksIHRhcmdldF9vdXQsIGdsb2JfZGljdCwgaW1hZ2VfcHJvcGVydGllcywgb3V0X2ZpbGUpOgorICB0cnk6CisgICAgaWYgInZibWV0YSIgaW4gb3MucGF0aC5iYXNlbmFtZShvdXRfZmlsZSk6CisgICAgICBPUFRJT05TLmluZm9fZGljdCA9IGdsb2JfZGljdAorICAgICAgQnVpbGRWQk1ldGEoaW5wdXRfZGlyZWN0b3J5LCBnbG9iX2RpY3QsIG91dF9maWxlKQorICAgIGVsc2U6CisgICAgICBCdWlsZEltYWdlKGlucHV0X2RpcmVjdG9yeSwgaW1hZ2VfcHJvcGVydGllcywgb3V0X2ZpbGUsIHRhcmdldF9vdXQpCisgIGV4Y2VwdDoKKyAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBidWlsZCAlcyBmcm9tICVzIiwgb3V0X2ZpbGUsIGlucHV0X2RpcmVjdG9yeSkKKyAgICByYWlzZQogCi0gIGlmIGxlbihhcmdzKSAhPSA0OgotICAgIHByaW50KF9fZG9jX18pCi0gICAgc3lzLmV4aXQoMSkKKworZGVmIENvcHlJbnB1dERpcmVjdG9yeShzcmMsIGRzdCwgZmlsdGVyX2ZpbGUpOgorICB3aXRoIG9wZW4oZmlsdGVyX2ZpbGUsICdyJykgYXMgZjoKKyAgICBmb3IgbGluZSBpbiBmOgorICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgIHJldHVybgorICAgICAgaWYgbGluZSAhPSBvcy5wYXRoLm5vcm1wYXRoKGxpbmUpOgorICAgICAgICBzeXMuZXhpdChmIntsaW5lfTogbm90IG5vcm1hbGl6ZWQiKQorICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCIuLi8iKSBvciBsaW5lLnN0YXJ0c3dpdGgoJy8nKToKKyAgICAgICAgc3lzLmV4aXQoZiJ7bGluZX06IGVzY2FwZXMgc3RhZ2luZyBkaXJlY3RvcnkgYnkgc3RhcnRpbmcgd2l0aCAuLi8gb3IgLyIpCisgICAgICBmdWxsX3NyYyA9IG9zLnBhdGguam9pbihzcmMsIGxpbmUpCisgICAgICBmdWxsX2RzdCA9IG9zLnBhdGguam9pbihkc3QsIGxpbmUpCisgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxfc3JjKToKKyAgICAgICAgb3MubWFrZWRpcnMoZnVsbF9kc3QsIGV4aXN0X29rPVRydWUpCisgICAgICBlbHNlOgorICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUoZnVsbF9kc3QpLCBleGlzdF9vaz1UcnVlKQorICAgICAgICBvcy5saW5rKGZ1bGxfc3JjLCBmdWxsX2RzdCwgZm9sbG93X3N5bWxpbmtzPUZhbHNlKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICBkZXNjcmlwdGlvbj0iQnVpbGRzIG91dHB1dF9pbWFnZSBmcm9tIHRoZSBnaXZlbiBpbnB1dF9kaXJlY3RvcnkgYW5kIHByb3BlcnRpZXNfZmlsZSwgYW5kICIKKyAgICAid3JpdGVzIHRoZSBpbWFnZSB0byB0YXJnZXRfb3V0cHV0X2RpcmVjdG9yeS4iKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSIsCisgICAgaGVscD0idGhlIHBhdGggdG8gYSBmaWxlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCBmaWxlcyBpbiB0aGUgaW5wdXRfZGlyZWN0b3J5LiBJZiB0aGlzICIKKyAgICAib3B0aW9uIGlzIHByb3ZpZGVkLCBhbGwgZmlsZXMgdW5kZXIgdGhlIGlucHV0X2RpcmVjdG9yeSB0aGF0IGFyZSBub3QgbGlzdGVkIGluIHRoaXMgZmlsZSB3aWxsICIKKyAgICAiYmUgZGVsZXRlZCBiZWZvcmUgYnVpbGRpbmcgdGhlIGltYWdlLiBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQgYnVpbGRpbmcgYSBtb2R1bGUgIgorICAgICJ3aWxsIGluc3RhbGwgaW4gYnkgZGVmYXVsdCwgc28gdGhlcmUgY291bGQgYmUgZmlsZXMgaW4gdGhlIGlucHV0X2RpcmVjdG9yeSB0aGF0IGFyZSBub3QgIgorICAgICJhY3R1YWxseSBzdXBwb3NlZCB0byBiZSBwYXJ0IG9mIHRoZSBwYXJ0aXRpb24uIFRoZSBwYXRocyBpbiB0aGlzIGZpbGUgbXVzdCBiZSByZWxhdGl2ZSB0byAiCisgICAgImlucHV0X2RpcmVjdG9yeS4iKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJpbnB1dF9kaXJlY3RvcnkiLAorICAgIGhlbHA9InRoZSBzdGFnaW5nIGRpcmVjdG9yeSB0byBiZSBjb252ZXJ0ZWQgdG8gYW4gaW1hZ2UgZmlsZSIpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoInByb3BlcnRpZXNfZmlsZSIsCisgICAgaGVscD0iYSBmaWxlIGNvbnRhaW5pbmcgdGhlICdnbG9iYWwgZGljdGlvbmFyeScgb2YgcHJvcGVydGllcyB0aGF0IGFmZmVjdCBob3cgdGhlIGltYWdlIGlzICIKKyAgICAiYnVpbHQiKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJvdXRfZmlsZSIsCisgICAgaGVscD0idGhlIG91dHB1dCBmaWxlIHRvIHdyaXRlIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgidGFyZ2V0X291dCIsCisgICAgaGVscD0idGhlIHBhdGggdG8gJChUQVJHRVRfT1VUKS4gQ2VydGFpbiB0b29scyB3aWxsIHVzZSB0aGlzIHRvIGxvb2sgdGhyb3VnaCBtdWx0aXBsZSBzdGFnaW5nICIKKyAgICAiZGlyZWN0b3JpZXMgZm9yIGZzIGNvbmZpZyBmaWxlcy4iKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItdiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRW5hYmxlIHZlcmJvc2UgbG9nZ2luZyIsIGRlc3Q9InZlcmJvc2UiKQorICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICBpZiBhcmdzLnZlcmJvc2U6CisgICAgT1BUSU9OUy52ZXJib3NlID0gVHJ1ZQogCiAgIGNvbW1vbi5Jbml0TG9nZ2luZygpCiAKLSAgaW5fZGlyID0gYXJnc1swXQotICBnbG9iX2RpY3RfZmlsZSA9IGFyZ3NbMV0KLSAgb3V0X2ZpbGUgPSBhcmdzWzJdCi0gIHRhcmdldF9vdXQgPSBhcmdzWzNdCi0KLSAgZ2xvYl9kaWN0ID0gTG9hZEdsb2JhbERpY3QoZ2xvYl9kaWN0X2ZpbGUpCisgIGdsb2JfZGljdCA9IExvYWRHbG9iYWxEaWN0KGFyZ3MucHJvcGVydGllc19maWxlKQogICBpZiAibW91bnRfcG9pbnQiIGluIGdsb2JfZGljdDoKICAgICAjIFRoZSBjYWxsZXIga25vd3MgdGhlIG1vdW50IHBvaW50IGFuZCBwcm92aWRlcyBhIGRpY3Rpb25hcnkgbmVlZGVkIGJ5CiAgICAgIyBCdWlsZEltYWdlKCkuCiAgICAgaW1hZ2VfcHJvcGVydGllcyA9IGdsb2JfZGljdAogICBlbHNlOgotICAgIGltYWdlX2ZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZShvdXRfZmlsZSkKKyAgICBpbWFnZV9maWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoYXJncy5vdXRfZmlsZSkKICAgICBtb3VudF9wb2ludCA9ICIiCiAgICAgaWYgaW1hZ2VfZmlsZW5hbWUgPT0gInN5c3RlbS5pbWciOgogICAgICAgbW91bnRfcG9pbnQgPSAic3lzdGVtIgpAQCAtOTMyLDE1ICsxMDI4LDEyIEBACiAgICAgaWYgInZibWV0YSIgIT0gbW91bnRfcG9pbnQ6CiAgICAgICBpbWFnZV9wcm9wZXJ0aWVzID0gSW1hZ2VQcm9wRnJvbUdsb2JhbERpY3QoZ2xvYl9kaWN0LCBtb3VudF9wb2ludCkKIAotICB0cnk6Ci0gICAgaWYgInZibWV0YSIgaW4gb3MucGF0aC5iYXNlbmFtZShvdXRfZmlsZSk6Ci0gICAgICBPUFRJT05TLmluZm9fZGljdCA9IGdsb2JfZGljdAotICAgICAgQnVpbGRWQk1ldGEoaW5fZGlyLCBnbG9iX2RpY3QsIG91dF9maWxlKQotICAgIGVsc2U6Ci0gICAgICBCdWlsZEltYWdlKGluX2RpciwgaW1hZ2VfcHJvcGVydGllcywgb3V0X2ZpbGUsIHRhcmdldF9vdXQpCi0gIGV4Y2VwdDoKLSAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBidWlsZCAlcyBmcm9tICVzIiwgb3V0X2ZpbGUsIGluX2RpcikKLSAgICByYWlzZQorICBpZiBhcmdzLmlucHV0X2RpcmVjdG9yeV9maWx0ZXJfZmlsZSBhbmQgbm90IG9zLmVudmlyb24uZ2V0KCJCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMiKToKKyAgICB3aXRoIHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeShkaXI9b3MucGF0aC5kaXJuYW1lKGFyZ3MuaW5wdXRfZGlyZWN0b3J5KSkgYXMgbmV3X2lucHV0X2RpcmVjdG9yeToKKyAgICAgIENvcHlJbnB1dERpcmVjdG9yeShhcmdzLmlucHV0X2RpcmVjdG9yeSwgbmV3X2lucHV0X2RpcmVjdG9yeSwgYXJncy5pbnB1dF9kaXJlY3RvcnlfZmlsdGVyX2ZpbGUpCisgICAgICBCdWlsZEltYWdlT3JWQk1ldGEobmV3X2lucHV0X2RpcmVjdG9yeSwgYXJncy50YXJnZXRfb3V0LCBnbG9iX2RpY3QsIGltYWdlX3Byb3BlcnRpZXMsIGFyZ3Mub3V0X2ZpbGUpCisgIGVsc2U6CisgICAgQnVpbGRJbWFnZU9yVkJNZXRhKGFyZ3MuaW5wdXRfZGlyZWN0b3J5LCBhcmdzLnRhcmdldF9vdXQsIGdsb2JfZGljdCwgaW1hZ2VfcHJvcGVydGllcywgYXJncy5vdXRfZmlsZSkKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc19zaWduYXR1cmVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc19zaWduYXR1cmVzLnB5CmluZGV4IGQ5MzU2MDcuLmNkYWZiNGIgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja190YXJnZXRfZmlsZXNfc2lnbmF0dXJlcy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfdGFyZ2V0X2ZpbGVzX3NpZ25hdHVyZXMucHkKQEAgLTU4LDIyICs1OCw2IEBACiAKIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCi0jIFdvcmsgYXJvdW5kIGEgYnVnIGluIFB5dGhvbidzIHppcGZpbGUgbW9kdWxlIHRoYXQgcHJldmVudHMgb3BlbmluZyBvZiB6aXBmaWxlcwotIyBpZiBhbnkgZW50cnkgaGFzIGFuIGV4dHJhIGZpZWxkIG9mIGJldHdlZW4gMSBhbmQgMyBieXRlcyAod2hpY2ggaXMgY29tbW9uIHdpdGgKLSMgemlwYWxpZ25lZCBBUEtzKS4gVGhpcyBvdmVycmlkZXMgdGhlIFppcEluZm8uX2RlY29kZUV4dHJhKCkgbWV0aG9kICh3aGljaAotIyBjb250YWlucyB0aGUgYnVnKSB3aXRoIGFuIGVtcHR5IHZlcnNpb24gKHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gZGVjb2RlIHRoZQotIyBleHRyYSBmaWVsZCBhbnl3YXkpLgotIyBJc3N1ZSAjMTQzMTU6IGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTQzMTUsIGZpeGVkIGluIFB5dGhvbiAyLjcuOCBhbmQKLSMgUHl0aG9uIDMuNS4wIGFscGhhIDEuCi0KLQotY2xhc3MgTXlaaXBJbmZvKHppcGZpbGUuWmlwSW5mbyk6Ci0gIGRlZiBfZGVjb2RlRXh0cmEoc2VsZik6Ci0gICAgcGFzcwotCi0KLXppcGZpbGUuWmlwSW5mbyA9IE15WmlwSW5mbwotCiAKIE9QVElPTlMgPSBjb21tb24uT1BUSU9OUwogCkBAIC0yNDEsNyArMjI1LDggQEAKICAgICAjIFNpZ25lciAobWluU2RrVmVyc2lvbj0yNCwgbWF4U2RrVmVyc2lvbj0zMikgY2VydGlmaWNhdGUgU0hBLTEgZGlnZXN0OiAxOWRhOTQ4OTZjZTQwNzhjMzhjYTY5NTcwMWYxZGVjNzQxZWM2ZDY3CiAgICAgIyAuLi4KICAgICBjZXJ0c19pbmZvID0ge30KLSAgICBjZXJ0aWZpY2F0ZV9yZWdleCA9IHJlLmNvbXBpbGUociIoU2lnbmVyICg/OiNbMC05XSt8XCguKlwpKSkgKGNlcnRpZmljYXRlIC4qKTooLiopIikKKyAgICBjZXJ0aWZpY2F0ZV9yZWdleCA9IHJlLmNvbXBpbGUoCisgICAgICAgIHIiKFNpZ25lciAoPzojWzAtOV0rfFwoLipcKSkpIChjZXJ0aWZpY2F0ZSAuKik6KC4qKSIpCiAgICAgZm9yIGxpbmUgaW4gb3V0cHV0LnNwbGl0bGluZXMoKToKICAgICAgIG0gPSBjZXJ0aWZpY2F0ZV9yZWdleC5tYXRjaChsaW5lKQogICAgICAgaWYgbm90IG06CkBAIC0zMTIsNyArMjk3LDcgQEAKICAgICAjIFRoaXMgaXMgdGhlIGxpc3Qgb2Ygd2lsZGNhcmRzIG9mIGZpbGVzIHdlIGV4dHJhY3QgZnJvbSB8ZmlsZW5hbWV8LgogICAgIGFwa19leHRlbnNpb25zID0gWycqLmFwaycsICcqLmFwZXgnXQogCi0gICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZmlsZW5hbWUpIGFzIGlucHV0X3ppcDoKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSwgInIiKSBhcyBpbnB1dF96aXA6CiAgICAgICBzZWxmLmNlcnRtYXAsIGNvbXByZXNzZWRfZXh0ZW5zaW9uID0gY29tbW9uLlJlYWRBcGtDZXJ0cyhpbnB1dF96aXApCiAgICAgaWYgY29tcHJlc3NlZF9leHRlbnNpb246CiAgICAgICBhcGtfZXh0ZW5zaW9ucy5hcHBlbmQoJyouYXBrJyArIGNvbXByZXNzZWRfZXh0ZW5zaW9uKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc192aW50Zi5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja190YXJnZXRfZmlsZXNfdmludGYucHkKaW5kZXggNWI3MWM3Mi4uYjhkY2Q4NCAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc192aW50Zi5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmLnB5CkBAIC0xMjksOCArMTI5LDkgQEAKIAogICBkaXJtYXAgPSBHZXREaXJtYXAoaW5wdXRfdG1wKQogCi0gICMgU2ltdWxhdGUgYXBleGQgZnJvbSB0YXJnZXQtZmlsZXMuCi0gIGRpcm1hcFsnL2FwZXgnXSA9IFByZXBhcmVBcGV4RGlyZWN0b3J5KGlucHV0X3RtcCkKKyAgIyBTaW11bGF0ZSBhcGV4ZCB3aXRoIHRhcmdldC1maWxlcy4KKyAgIyBhZGQgYSBtYXBwaW5nKCcvYXBleCcgPT4gJHtpbnB1dF90bXB9L0FQRVgpIHRvIGRpcm1hcAorICBQcmVwYXJlQXBleERpcmVjdG9yeShpbnB1dF90bXAsIGRpcm1hcCkKIAogICBhcmdzX2Zvcl9za3VzID0gR2V0QXJnc0ZvclNrdXMoaW5mb19kaWN0KQogICBzaGlwcGluZ19hcGlfbGV2ZWxfYXJncyA9IEdldEFyZ3NGb3JTaGlwcGluZ0FwaUxldmVsKGluZm9fZGljdCkKQEAgLTIwNCw3ICsyMDUsOCBAQAogCiAgIHJldHVybiBwYXR0ZXJucwogCi1kZWYgUHJlcGFyZUFwZXhEaXJlY3RvcnkoaW5wKToKKworZGVmIFByZXBhcmVBcGV4RGlyZWN0b3J5KGlucCwgZGlybWFwKToKICAgIiIiIFByZXBhcmUgL2FwZXggZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nIGNoZWNrdmludGYKIAogICBBcGV4IGJpbmFyaWVzIGRvIG5vdCBzdXBwb3J0IGRpcm1hcHMsIGluIG9yZGVyIHRvIHVzZSB0aGVzZSBiaW5hcmllcyB3ZQpAQCAtMjEyLDk2ICsyMTQsMjYgQEAKICAgZXhwZWN0ZWQgZGV2aWNlIGxvY2F0aW9ucy4KIAogICBUaGlzIHNpbXVsYXRlcyBob3cgYXBleGQgYWN0aXZhdGVzIEFQRVhlcy4KLSAgMS4gY3JlYXRlIHtpbnB9L0FQRVggd2hpY2ggaXMgdHJlYXRlZCBhcyBhICIvIiBvbiBkZXZpY2UuCi0gIDIuIGNvcHkgYXBleGVzIGZyb20gdGFyZ2V0LWZpbGVzIHRvIHtyb290fS97cGFydGl0aW9ufS9hcGV4LgotICAzLiBtb3VudCBhcGV4ZXMgdW5kZXIge3Jvb3R9L3twYXJ0aXRpb259L2FwZXggYXQge3Jvb3R9L2FwZXguCi0gIDQuIGdlbmVyYXRlIGluZm8gZmlsZXMgd2l0aCBkdW1wX2FwZXhfaW5mby4KLQotICBXZSdsbCBnZXQgdGhlIGZvbGxvd2luZyBsYXlvdXQKLSAgICAgICB7aW5wfS9BUEVYL2FwZXggICAgICAgICAgICAgIyBBY3RpdmF0ZWQgQVBFWGVzICsgc29tZSBpbmZvIGZpbGVzCi0gICAgICAge2lucH0vQVBFWC9zeXN0ZW0vYXBleCAgICAgICMgU3lzdGVtIEFQRVhlcwotICAgICAgIHtpbnB9L0FQRVgvdmVuZG9yL2FwZXggICAgICAjIFZlbmRvciBBUEVYZXMKLSAgICAgICAuLi4KLQotICBBcmdzOgotICAgIGlucDogcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIGV4dHJhY3RlZCB0YXJnZXQgZmlsZXMgYXJjaGl2ZS4KLQotICBSZXR1cm5zOgotICAgIGRpcmVjdG9yeSByZXByZXNlbnRpbmcgL2FwZXggb24gZGV2aWNlCisgIDEuIGNyZWF0ZSB7aW5wfS9BUEVYIHdoaWNoIGlzIHRyZWF0ZWQgYXMgYSAiL2FwZXgiIG9uIGRldmljZS4KKyAgMi4gaW52b2tlIGFwZXhkX2hvc3Qgd2l0aCBBUEVYZXMuCiAgICIiIgogCi0gIGRlYXBleGVyID0gJ2RlYXBleGVyJwotICBkZWJ1Z2ZzX3BhdGggPSAnZGVidWdmcycKLSAgYmxraWRfcGF0aCA9ICdibGtpZCcKLSAgZnNja2Vyb2ZzX3BhdGggPSAnZnNjay5lcm9mcycKLSAgaWYgT1BUSU9OUy5zZWFyY2hfcGF0aDoKLSAgICBkZWJ1Z2ZzX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5zZWFyY2hfcGF0aCwgJ2JpbicsICdkZWJ1Z2ZzX3N0YXRpYycpCi0gICAgZGVhcGV4ZXJfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLnNlYXJjaF9wYXRoLCAnYmluJywgJ2RlYXBleGVyJykKLSAgICBibGtpZF9wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuc2VhcmNoX3BhdGgsICdiaW4nLCAnYmxraWRfc3RhdGljJykKLSAgICBmc2NrZXJvZnNfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLnNlYXJjaF9wYXRoLCAnYmluJywgJ2ZzY2suZXJvZnMnKQotICAgIGlmIG9zLnBhdGguaXNmaWxlKGRlYXBleGVyX3BhdGgpOgotICAgICAgZGVhcGV4ZXIgPSBkZWFwZXhlcl9wYXRoCi0KLSAgZGVmIEV4dHJhY3RBcGV4ZXMocGF0aCwgb3V0cCk6Ci0gICAgIyBFeHRyYWN0IGFsbCBBUEVYZXMgZm91bmQgaW4gaW5wdXQgcGF0aC4KLSAgICBsb2dnZXIuaW5mbygnRXh0cmFjdGluZyBBUEVYcyBpbiAlcycsIHBhdGgpCi0gICAgZm9yIGYgaW4gb3MubGlzdGRpcihwYXRoKToKLSAgICAgIGxvZ2dlci5pbmZvKCcgIGFkZGluZyBBUEVYICVzJywgb3MucGF0aC5iYXNlbmFtZShmKSkKLSAgICAgIGFwZXggPSBvcy5wYXRoLmpvaW4ocGF0aCwgZikKLSAgICAgIGlmIG9zLnBhdGguaXNkaXIoYXBleCkgYW5kIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihhcGV4LCAnYXBleF9tYW5pZmVzdC5wYicpKToKLSAgICAgICAgaW5mbyA9IFBhcnNlQXBleE1hbmlmZXN0KG9zLnBhdGguam9pbihhcGV4LCAnYXBleF9tYW5pZmVzdC5wYicpKQotICAgICAgICAjIEZsYXR0ZW5lZCBBUEVYZXMgbWF5IGhhdmUgc3ltbGlua3MgZm9yIGxpYnMgKGxpbmtlZCB0byAvc3lzdGVtL2xpYikKLSAgICAgICAgIyBXZSBuZWVkIHRvIGJsaW5kbHkgY29weSB0aGVtIGFsbC4KLSAgICAgICAgc2h1dGlsLmNvcHl0cmVlKGFwZXgsIG9zLnBhdGguam9pbihvdXRwLCBpbmZvLm5hbWUpLCBzeW1saW5rcz1UcnVlKQotICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShhcGV4KSBhbmQgYXBleC5lbmRzd2l0aCgoJy5hcGV4JywgJy5jYXBleCcpKToKLSAgICAgICAgY21kID0gW2RlYXBleGVyLAotICAgICAgICAgICAgICAgJy0tZGVidWdmc19wYXRoJywgZGVidWdmc19wYXRoLAotICAgICAgICAgICAgICAgJ2luZm8nLAotICAgICAgICAgICAgICAgYXBleF0KLSAgICAgICAgaW5mbyA9IGpzb24ubG9hZHMoY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkpCi0KLSAgICAgICAgY21kID0gW2RlYXBleGVyLAotICAgICAgICAgICAgICAgJy0tZGVidWdmc19wYXRoJywgZGVidWdmc19wYXRoLAotICAgICAgICAgICAgICAgJy0tZnNja2Vyb2ZzX3BhdGgnLCBmc2NrZXJvZnNfcGF0aCwKLSAgICAgICAgICAgICAgICctLWJsa2lkX3BhdGgnLCBibGtpZF9wYXRoLAotICAgICAgICAgICAgICAgJ2V4dHJhY3QnLAotICAgICAgICAgICAgICAgYXBleCwKLSAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihvdXRwLCBpbmZvWyduYW1lJ10pXQotICAgICAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQotICAgICAgZWxzZToKLSAgICAgICAgbG9nZ2VyLmluZm8oJyAgLi4gc2tpcHBpbmcgJXMgKGlzIGl0IEFQRVg/KScsIHBhdGgpCi0KLSAgcm9vdF9kaXJfbmFtZSA9ICdBUEVYJwotICByb290X2RpciA9IG9zLnBhdGguam9pbihpbnAsIHJvb3RfZGlyX25hbWUpCi0gIGV4dHJhY3RlZF9yb290ID0gb3MucGF0aC5qb2luKHJvb3RfZGlyLCAnYXBleCcpCisgIGFwZXhfZGlyID0gY29tbW9uLk1ha2VUZW1wRGlyKCdBUEVYJykKKyAgIyBjaGVja3ZpbnRmIG5lZWRzIC9hcGV4IGRpcm1hcAorICBkaXJtYXBbJy9hcGV4J10gPSBhcGV4X2RpcgogCiAgICMgQWx3YXlzIGNyZWF0ZSAvYXBleCBkaXJlY3RvcnkgZm9yIGRpcm1hcAotICBvcy5tYWtlZGlycyhleHRyYWN0ZWRfcm9vdCkKKyAgb3MubWFrZWRpcnMoYXBleF9kaXIsIGV4aXN0X29rPVRydWUpCiAKLSAgY3JlYXRlX2luZm9fZmlsZSA9IEZhbHNlCisgICMgSW52b2tlIGFwZXhkX2hvc3QgdG8gYWN0aXZhdGUgQVBFWGVzIGZvciBjaGVja3ZpbnRmCisgIGFwZXhfaG9zdCA9IG9zLnBhdGguam9pbihPUFRJT05TLnNlYXJjaF9wYXRoLCAnYmluJywgJ2FwZXhkX2hvc3QnKQorICBjbWQgPSBbYXBleF9ob3N0LCAnLS10b29sX3BhdGgnLCBPUFRJT05TLnNlYXJjaF9wYXRoXQorICBjbWQgKz0gWyctLWFwZXhfcGF0aCcsIGRpcm1hcFsnL2FwZXgnXV0KKyAgZm9yIHAgaW4gWydzeXN0ZW0nLCAnc3lzdGVtX2V4dCcsICdwcm9kdWN0JywgJ3ZlbmRvciddOgorICAgIGlmICcvJyArIHAgaW4gZGlybWFwOgorICAgICAgY21kICs9IFsnLS0nICsgcCArICdfcGF0aCcsIGRpcm1hcFsnLycgKyBwXV0KKyAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKIAotICAjIExvb3AgdGhyb3VnaCBzZWFyY2ggcGF0aCBsb29raW5nIGZvciBhbmQgcHJvY2Vzc2luZyBhcGV4LyBkaXJlY3Rvcmllcy4KLSAgZm9yIGRldmljZV9wYXRoLCB0YXJnZXRfZmlsZXNfcmVsX3BhdGhzIGluIERJUl9TRUFSQ0hfUEFUSFMuaXRlbXMoKToKLSAgICAjIGNoZWNrdmludGYgb25seSBuZWVkcyB2ZW5kb3IgYXBleGVzLiBza2lwIG90aGVyIHBhcnRpdGlvbnMgZm9yIGVmZmljaWVuY3kKLSAgICBpZiBkZXZpY2VfcGF0aCBub3QgaW4gWycvdmVuZG9yJywgJy9vZG0nXToKLSAgICAgIGNvbnRpbnVlCi0gICAgIyBGaXJzdCwgY29weSBWRU5ET1IvYXBleC9mb28uYXBleCB0byBBUEVYL3ZlbmRvci9hcGV4L2Zvby5hcGV4Ci0gICAgIyBUaGVuLCBleHRyYWN0IHRoZSBjb250ZW50cyB0byBBUEVYL2FwZXgvZm9vLwotICAgIGZvciB0YXJnZXRfZmlsZXNfcmVsX3BhdGggaW4gdGFyZ2V0X2ZpbGVzX3JlbF9wYXRoczoKLSAgICAgIGlucF9wYXJ0aXRpb24gPSBvcy5wYXRoLmpvaW4oaW5wLCB0YXJnZXRfZmlsZXNfcmVsX3BhdGgsImFwZXgiKQotICAgICAgaWYgb3MucGF0aC5leGlzdHMoaW5wX3BhcnRpdGlvbik6Ci0gICAgICAgIGFwZXhfZGlyID0gcm9vdF9kaXIgKyBvcy5wYXRoLmpvaW4oZGV2aWNlX3BhdGggKyAiL2FwZXgiKTsKLSAgICAgICAgb3MubWFrZWRpcnMocm9vdF9kaXIgKyBkZXZpY2VfcGF0aCkKLSAgICAgICAgc2h1dGlsLmNvcHl0cmVlKGlucF9wYXJ0aXRpb24sIGFwZXhfZGlyLCBzeW1saW5rcz1UcnVlKQotICAgICAgICBFeHRyYWN0QXBleGVzKGFwZXhfZGlyLCBleHRyYWN0ZWRfcm9vdCkKLSAgICAgICAgY3JlYXRlX2luZm9fZmlsZSA9IFRydWUKLQotICBpZiBjcmVhdGVfaW5mb19maWxlOgotICAgICMjIyBEdW1wIGFwZXggaW5mbyBmaWxlcwotICAgIGR1bXBfY21kID0gWydkdW1wX2FwZXhfaW5mbycsICctLXJvb3RfZGlyJywgcm9vdF9kaXJdCi0gICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGR1bXBfY21kKQotCi0gIHJldHVybiBleHRyYWN0ZWRfcm9vdAogCiBkZWYgQ2hlY2tWaW50ZkZyb21UYXJnZXRGaWxlcyhpbnAsIGluZm9fZGljdD1Ob25lKToKICAgIiIiCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NvbW1vbi5weQppbmRleCBiNTBjYWFhLi40ODM0ODM0IDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9jb21tb24ucHkKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBkYXRldGltZQogaW1wb3J0IGVycm5vCiBpbXBvcnQgZm5tYXRjaAotZnJvbSBnZW5lcmljcGF0aCBpbXBvcnQgaXNkaXIKIGltcG9ydCBnZXRvcHQKIGltcG9ydCBnZXRwYXNzCiBpbXBvcnQgZ3ppcApAQCAtMzQsMjEgKzMzLDI5IEBACiBpbXBvcnQgc2hsZXgKIGltcG9ydCBzaHV0aWwKIGltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3RhdAogaW1wb3J0IHN5cwogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdGhyZWFkaW5nCiBpbXBvcnQgdGltZQogaW1wb3J0IHppcGZpbGUKKworZnJvbSB0eXBpbmcgaW1wb3J0IEl0ZXJhYmxlLCBDYWxsYWJsZQorZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCiBmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEsIHNoYTI1NgogCiBpbXBvcnQgaW1hZ2VzCi1pbXBvcnQgcmFuZ2VsaWIKIGltcG9ydCBzcGFyc2VfaW1nCiBmcm9tIGJsb2NraW1nZGlmZiBpbXBvcnQgQmxvY2tJbWFnZURpZmYKIAogbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKIAorQGRhdGFjbGFzcworY2xhc3MgT3B0aW9uSGFuZGxlcjoKKyAgZXh0cmFfbG9uZ19vcHRzOiBJdGVyYWJsZVtzdHJdCisgIGhhbmRsZXI6IENhbGxhYmxlCisKIGNsYXNzIE9wdGlvbnMob2JqZWN0KToKIAogICBkZWYgX19pbml0X18oc2VsZik6CkBAIC03Myw5ICs4MCw3IEBACiAgICAgICBpZiAiQU5EUk9JRF9IT1NUX09VVCIgaW4gb3MuZW52aXJvbjoKICAgICAgICAgc2VsZi5zZWFyY2hfcGF0aCA9IG9zLmVudmlyb25bIkFORFJPSURfSE9TVF9PVVQiXQogICAgIHNlbGYuc2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoID0gImxpYjY0IiAgICMgUmVsYXRpdmUgdG8gc2VhcmNoX3BhdGgKLSAgICBzZWxmLnNpZ25fc2Vwb2xpY3lfcGF0aCA9IE5vbmUKICAgICBzZWxmLmV4dHJhX3NpZ25hcGtfYXJncyA9IFtdCi0gICAgc2VsZi5leHRyYV9zaWduX3NlcG9saWN5X2FyZ3MgPSBbXQogICAgIHNlbGYuYWFwdDJfcGF0aCA9ICJhYXB0MiIKICAgICBzZWxmLmphdmFfcGF0aCA9ICJqYXZhIiAgIyBVc2UgdGhlIG9uZSBvbiB0aGUgcGF0aCBieSBkZWZhdWx0LgogICAgIHNlbGYuamF2YV9hcmdzID0gWyItWG14NDA5Nm0iXSAgIyBUaGUgZGVmYXVsdCBKVk0gYXJncy4KQEAgLTk1LDggKzEwMCw2IEBACiAgICAgc2VsZi5jYWNoZV9zaXplID0gTm9uZQogICAgIHNlbGYuc3Rhc2hfdGhyZXNob2xkID0gMC44CiAgICAgc2VsZi5sb2dmaWxlID0gTm9uZQotICAgIHNlbGYuaG9zdF90b29scyA9IHt9Ci0gICAgc2VsZi5zZXBvbGljeV9uYW1lID0gJ3NlcG9saWN5LmFwZXgnCiAKIAogT1BUSU9OUyA9IE9wdGlvbnMoKQpAQCAtMTEyLDEzICsxMTUsMTggQEAKICMgZGVzY3JpcHRvciBpbnRvIHZibWV0YS5pbWcuIFdoZW4gYWRkaW5nIGEgbmV3IGVudHJ5IGhlcmUsIHRoZQogIyBBVkJfRk9PVEVSX0FSR1NfQllfUEFSVElUSU9OIGluIHNpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MgbmVlZCB0byBiZSB1cGRhdGVkCiAjIGFjY29yZGluZ2x5LgotQVZCX1BBUlRJVElPTlMgPSAoJ2Jvb3QnLCAnaW5pdF9ib290JywgJ2R0Ym8nLCAnb2RtJywgJ3Byb2R1Y3QnLCAncHZtZncnLCAncmVjb3ZlcnknLAotICAgICAgICAgICAgICAgICAgJ3N5c3RlbScsICdzeXN0ZW1fZXh0JywgJ3ZlbmRvcicsICd2ZW5kb3JfYm9vdCcsICd2ZW5kb3Jfa2VybmVsX2Jvb3QnLAotICAgICAgICAgICAgICAgICAgJ3ZlbmRvcl9kbGttJywgJ29kbV9kbGttJywgJ3N5c3RlbV9kbGttJykKK0FWQl9QQVJUSVRJT05TID0gKCdib290JywgJ2luaXRfYm9vdCcsICdkdGJvJywgJ29kbScsICdwcm9kdWN0JywgJ3B2bWZ3JywKKyAgICAgICAgICAgICAgICAgICdyZWNvdmVyeScsICdzeXN0ZW0nLCAnc3lzdGVtX2V4dCcsICd2ZW5kb3InLCAndmVuZG9yX2Jvb3QnLAorICAgICAgICAgICAgICAgICAgJ3ZlbmRvcl9rZXJuZWxfYm9vdCcsICd2ZW5kb3JfZGxrbScsICdvZG1fZGxrbScsCisgICAgICAgICAgICAgICAgICAnc3lzdGVtX2Rsa20nKQogCiAjIENoYWluZWQgVkJNZXRhIHBhcnRpdGlvbnMuCiBBVkJfVkJNRVRBX1BBUlRJVElPTlMgPSAoJ3ZibWV0YV9zeXN0ZW0nLCAndmJtZXRhX3ZlbmRvcicpCiAKKyMgYXZidG9vbCBhcmd1bWVudHMgbmFtZQorQVZCX0FSR19OQU1FX0lOQ0xVREVfREVTQ19GUk9NX0lNRyA9ICctLWluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZScKK0FWQl9BUkdfTkFNRV9DSEFJTl9QQVJUSVRJT04gPSAnLS1jaGFpbl9wYXJ0aXRpb24nCisKICMgUGFydGl0aW9ucyB0aGF0IHNob3VsZCBoYXZlIHRoZWlyIGNhcmVfbWFwIGFkZGVkIHRvIE1FVEEvY2FyZV9tYXAucGIKIFBBUlRJVElPTlNfV0lUSF9DQVJFX01BUCA9IFsKICAgICAnc3lzdGVtJywKQEAgLTEzOSw2ICsxNDcsMTkgQEAKIFJBTURJU0tfQlVJTERfUFJPUF9SRUxfUEFUSFMgPSBbJ3N5c3RlbS9ldGMvcmFtZGlzay9idWlsZC5wcm9wJ10KIAogCitAZGF0YWNsYXNzCitjbGFzcyBBdmJDaGFpbmVkUGFydGl0aW9uQXJnOgorICAiIiJUaGUgcmVxdWlyZWQgYXJndW1lbnRzIGZvciBhdmJ0b29sIC0tY2hhaW5fcGFydGl0aW9uLiIiIgorICBwYXJ0aXRpb246IHN0cgorICByb2xsYmFja19pbmRleF9sb2NhdGlvbjogaW50CisgIHB1YmtleV9wYXRoOiBzdHIKKworICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICIiIkNvbnZlcnQgdG8gc3RyaW5nIGNvbW1hbmQgYXJndW1lbnRzLiIiIgorICAgIHJldHVybiAne306e306e30nLmZvcm1hdCgKKyAgICAgICAgc2VsZi5wYXJ0aXRpb24sIHNlbGYucm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sIHNlbGYucHVia2V5X3BhdGgpCisKKwogY2xhc3MgRXJyb3JDb2RlKG9iamVjdCk6CiAgICIiIkRlZmluZSBlcnJvcl9jb2RlcyBmb3IgZmFpbHVyZXMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBhY3R1YWwKICAgdXBkYXRlIHBhY2thZ2UgaW5zdGFsbGF0aW9uLgpAQCAtMTk0LDcgKzIxNSw3IEBACiAgICAgICAgICAgJyc6IHsKICAgICAgICAgICAgICAgJ2hhbmRsZXJzJzogWydkZWZhdWx0J10sCiAgICAgICAgICAgICAgICdwcm9wYWdhdGUnOiBUcnVlLAotICAgICAgICAgICAgICAnbGV2ZWwnOiAnSU5GTycsCisgICAgICAgICAgICAgICdsZXZlbCc6ICdOT1RTRVQnLAogICAgICAgICAgIH0KICAgICAgIH0KICAgfQpAQCAtMjI0LDIzICsyNDUsMTUgQEAKICAgbG9nZ2luZy5jb25maWcuZGljdENvbmZpZyhjb25maWcpCiAKIAotZGVmIFNldEhvc3RUb29sTG9jYXRpb24odG9vbF9uYW1lLCBsb2NhdGlvbik6Ci0gIE9QVElPTlMuaG9zdF90b29sc1t0b29sX25hbWVdID0gbG9jYXRpb24KLQotCiBkZWYgRmluZEhvc3RUb29sUGF0aCh0b29sX25hbWUpOgogICAiIiJGaW5kcyB0aGUgcGF0aCB0byB0aGUgaG9zdCB0b29sLgogCiAgIEFyZ3M6CiAgICAgdG9vbF9uYW1lOiBuYW1lIG9mIHRoZSB0b29sIHRvIGZpbmQKICAgUmV0dXJuczoKLSAgICBwYXRoIHRvIHRoZSB0b29sIGlmIGZvdW5kIHVuZGVyIGVpdGhlciBvbmUgb2YgdGhlIGhvc3RfdG9vbHMgbWFwIG9yIHVuZGVyCi0gICAgdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgYmluYXJ5IGlzIGxvY2F0ZWQgYXQuIElmIG5vdCBmb3VuZCwgdG9vbF9uYW1lCi0gICAgaXMgcmV0dXJuZWQuCisgICAgcGF0aCB0byB0aGUgdG9vbCBpZiBmb3VuZCB1bmRlciB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhpcyBiaW5hcnkgaXMgbG9jYXRlZCBhdC4gSWYgbm90IGZvdW5kLAorICAgIHRvb2xfbmFtZSBpcyByZXR1cm5lZC4KICAgIiIiCi0gIGlmIHRvb2xfbmFtZSBpbiBPUFRJT05TLmhvc3RfdG9vbHM6Ci0gICAgcmV0dXJuIE9QVElPTlMuaG9zdF90b29sc1t0b29sX25hbWVdCi0KICAgbXlfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoc3lzLmFyZ3ZbMF0pKQogICB0b29sX3BhdGggPSBvcy5wYXRoLmpvaW4obXlfZGlyLCB0b29sX25hbWUpCiAgIGlmIG9zLnBhdGguZXhpc3RzKHRvb2xfcGF0aCk6CkBAIC00NTAsMTAgKzQ2Myw3IEBACiAKICAgQHByb3BlcnR5CiAgIGRlZiBpc192YWJjKHNlbGYpOgotICAgIHZlbmRvcl9wcm9wID0gc2VsZi5pbmZvX2RpY3QuZ2V0KCJ2ZW5kb3IuYnVpbGQucHJvcCIpCi0gICAgdmFiY19lbmFibGVkID0gdmVuZG9yX3Byb3AgYW5kIFwKLSAgICAgICAgdmVuZG9yX3Byb3AuR2V0UHJvcCgicm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi5lbmFibGVkIikgPT0gInRydWUiCi0gICAgcmV0dXJuIHZhYmNfZW5hYmxlZAorICAgIHJldHVybiBzZWxmLmluZm9fZGljdC5nZXQoInZpcnR1YWxfYWJfY29tcHJlc3Npb24iKSA9PSAidHJ1ZSIKIAogICBAcHJvcGVydHkKICAgZGVmIGlzX2FuZHJvaWRfcihzZWxmKToKQEAgLTQ2MSwyMiArNDcxLDM0IEBACiAgICAgcmV0dXJuIHN5c3RlbV9wcm9wIGFuZCBzeXN0ZW1fcHJvcC5HZXRQcm9wKCJyby5idWlsZC52ZXJzaW9uLnJlbGVhc2UiKSA9PSAiMTEiCiAKICAgQHByb3BlcnR5CisgIGRlZiBpc19yZWxlYXNlX2tleShzZWxmKToKKyAgICBzeXN0ZW1fcHJvcCA9IHNlbGYuaW5mb19kaWN0LmdldCgiYnVpbGQucHJvcCIpCisgICAgcmV0dXJuIHN5c3RlbV9wcm9wIGFuZCBzeXN0ZW1fcHJvcC5HZXRQcm9wKCJyby5idWlsZC50YWdzIikgPT0gInJlbGVhc2Uta2V5IgorCisgIEBwcm9wZXJ0eQorICBkZWYgdmFiY19jb21wcmVzc2lvbl9wYXJhbShzZWxmKToKKyAgICByZXR1cm4gc2VsZi5nZXQoInZpcnR1YWxfYWJfY29tcHJlc3Npb25fbWV0aG9kIiwgIiIpCisKKyAgQHByb3BlcnR5CisgIGRlZiB2YWJjX2Nvd192ZXJzaW9uKHNlbGYpOgorICAgIHJldHVybiBzZWxmLmdldCgidmlydHVhbF9hYl9jb3dfdmVyc2lvbiIsICIiKQorCisgIEBwcm9wZXJ0eQogICBkZWYgdmVuZG9yX2FwaV9sZXZlbChzZWxmKToKICAgICB2ZW5kb3JfcHJvcCA9IHNlbGYuaW5mb19kaWN0LmdldCgidmVuZG9yLmJ1aWxkLnByb3AiKQogICAgIGlmIG5vdCB2ZW5kb3JfcHJvcDoKICAgICAgIHJldHVybiAtMQogCiAgICAgcHJvcHMgPSBbCi0gICAgICAgICJyby5ib2FyZC5hcGlfbGV2ZWwiLAogICAgICAgICAicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIiwKICAgICAgICAgInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIiwKICAgICBdCiAgICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICB2YWx1ZSA9IHZlbmRvcl9wcm9wLkdldFByb3AocHJvcCkKICAgICAgIHRyeToKLSAgICAgICAgICByZXR1cm4gaW50KHZhbHVlKQorICAgICAgICByZXR1cm4gaW50KHZhbHVlKQogICAgICAgZXhjZXB0OgotICAgICAgICAgIHBhc3MKKyAgICAgICAgcGFzcwogICAgIHJldHVybiAtMQogCiAgIEBwcm9wZXJ0eQpAQCAtNzU3LDYgKzc3OSwzMyBAQAogICByZXR1cm4gUmVhZEJ5dGVzRnJvbUlucHV0RmlsZShpbnB1dF9maWxlLCBmbikuZGVjb2RlKCkKIAogCitkZWYgV3JpdGVCeXRlc1RvSW5wdXRGaWxlKGlucHV0X2ZpbGUsIGZuLCBkYXRhKToKKyAgIiIiV3JpdGUgYnl0ZXMgfGRhdGF8IGNvbnRlbnRzIHRvIGZuIG9mIGlucHV0IHppcGZpbGUgb3IgZGlyZWN0b3J5LiIiIgorICBpZiBpc2luc3RhbmNlKGlucHV0X2ZpbGUsIHppcGZpbGUuWmlwRmlsZSk6CisgICAgd2l0aCBpbnB1dF9maWxlLm9wZW4oZm4sICJ3IikgYXMgZW50cnlfZnA6CisgICAgICByZXR1cm4gZW50cnlfZnAud3JpdGUoZGF0YSkKKyAgZWxpZiB6aXBmaWxlLmlzX3ppcGZpbGUoaW5wdXRfZmlsZSk6CisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgInIiLCBhbGxvd1ppcDY0PVRydWUpIGFzIHpmcDoKKyAgICAgIHdpdGggemZwLm9wZW4oZm4sICJ3IikgYXMgZW50cnlfZnA6CisgICAgICAgIHJldHVybiBlbnRyeV9mcC53cml0ZShkYXRhKQorICBlbHNlOgorICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGlucHV0X2ZpbGUpOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAiSW52YWxpZCBpbnB1dF9maWxlLCBhY2NlcHRlZCBpbnB1dHMgYXJlIFppcEZpbGUgb2JqZWN0LCBwYXRoIHRvIC56aXAgZmlsZSBvbiBkaXNrLCBvciBwYXRoIHRvIGV4dHJhY3RlZCBkaXJlY3RvcnkuIEFjdHVhbDogIiArIGlucHV0X2ZpbGUpCisgICAgcGF0aCA9IG9zLnBhdGguam9pbihpbnB1dF9maWxlLCAqZm4uc3BsaXQoIi8iKSkKKyAgICB0cnk6CisgICAgICB3aXRoIG9wZW4ocGF0aCwgIndiIikgYXMgZjoKKyAgICAgICAgcmV0dXJuIGYud3JpdGUoZGF0YSkKKyAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgIHJhaXNlIEtleUVycm9yKGZuKQorCisKK2RlZiBXcml0ZVRvSW5wdXRGaWxlKGlucHV0X2ZpbGUsIGZuLCBzdHI6IHN0cik6CisgICIiIldyaXRlIHN0ciBjb250ZW50IHRvIGZuIG9mIGlucHV0IGZpbGUgb3IgZGlyZWN0b3J5IiIiCisgIHJldHVybiBXcml0ZUJ5dGVzVG9JbnB1dEZpbGUoaW5wdXRfZmlsZSwgZm4sIHN0ci5lbmNvZGUoKSkKKworCiBkZWYgRXh0cmFjdEZyb21JbnB1dEZpbGUoaW5wdXRfZmlsZSwgZm4pOgogICAiIiJFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgZm4gZnJvbSBpbnB1dCB6aXBmaWxlIG9yIGRpcmVjdG9yeSBpbnRvIGEgZmlsZS4iIiIKICAgaWYgaXNpbnN0YW5jZShpbnB1dF9maWxlLCB6aXBmaWxlLlppcEZpbGUpOgpAQCAtOTA0LDIwICs5NTMsMTQgQEAKICAgICAgICAgaW5wdXRfZmlsZSwgcGFydGl0aW9uLCByYW1kaXNrX2Zvcm1hdD1yYW1kaXNrX2Zvcm1hdCkKICAgZFsiYnVpbGQucHJvcCJdID0gZFsic3lzdGVtLmJ1aWxkLnByb3AiXQogCi0gICMgU2V0IHVwIHRoZSBzYWx0IChiYXNlZCBvbiBmaW5nZXJwcmludCkgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiBhZGRpbmcgQVZCCi0gICMgaGFzaCAvIGhhc2h0cmVlIGZvb3RlcnMuCiAgIGlmIGQuZ2V0KCJhdmJfZW5hYmxlIikgPT0gInRydWUiOgogICAgIGJ1aWxkX2luZm8gPSBCdWlsZEluZm8oZCwgdXNlX2xlZ2FjeV9pZD1UcnVlKQotICAgIGZvciBwYXJ0aXRpb24gaW4gUEFSVElUSU9OU19XSVRIX0JVSUxEX1BST1A6Ci0gICAgICBmaW5nZXJwcmludCA9IGJ1aWxkX2luZm8uR2V0UGFydGl0aW9uRmluZ2VycHJpbnQocGFydGl0aW9uKQotICAgICAgaWYgZmluZ2VycHJpbnQ6Ci0gICAgICAgIGRbImF2Yl97fV9zYWx0Ii5mb3JtYXQocGFydGl0aW9uKV0gPSBzaGEyNTYoCi0gICAgICAgICAgICBmaW5nZXJwcmludC5lbmNvZGUoKSkuaGV4ZGlnZXN0KCkKLQogICAgICMgU2V0IHVwIHRoZSBzYWx0IGZvciBwYXJ0aXRpb25zIHdpdGhvdXQgYnVpbGQucHJvcAogICAgIGlmIGJ1aWxkX2luZm8uZmluZ2VycHJpbnQ6Ci0gICAgICBkWyJhdmJfc2FsdCJdID0gc2hhMjU2KGJ1aWxkX2luZm8uZmluZ2VycHJpbnQuZW5jb2RlKCkpLmhleGRpZ2VzdCgpCi0KKyAgICAgIGlmICJmaW5nZXJwcmludCIgbm90IGluIGQ6CisgICAgICAgIGRbImZpbmdlcnByaW50Il0gPSBidWlsZF9pbmZvLmZpbmdlcnByaW50CisgICAgICBpZiAiYXZiX3NhbHQiIG5vdCBpbiBkOgorICAgICAgICBkWyJhdmJfc2FsdCJdID0gc2hhMjU2KGJ1aWxkX2luZm8uZmluZ2VycHJpbnQuZW5jb2RlKCkpLmhleGRpZ2VzdCgpCiAgICAgIyBTZXQgdGhlIHZibWV0YSBkaWdlc3QgaWYgZXhpc3RzCiAgICAgdHJ5OgogICAgICAgZFsidmJtZXRhX2RpZ2VzdCJdID0gcmVhZF9oZWxwZXIoIk1FVEEvdmJtZXRhX2RpZ2VzdC50eHQiKS5yc3RyaXAoKQpAQCAtOTczLDcgKzEwMTYsNyBAQAogICAgICAgICBlYWNoIG9mIHRoZSB2YXJpYWJsZXMuCiAgICAgcmFtZGlza19mb3JtYXQ6IElmIG5hbWUgaXMgImJvb3QiLCB0aGUgZm9ybWF0IG9mIHJhbWRpc2sgaW5zaWRlIHRoZQogICAgICAgICBib290IGltYWdlLiBPdGhlcndpc2UsIGl0cyB2YWx1ZSBpcyBpZ25vcmVkLgotICAgICAgICBVc2UgbHo0IHRvIGRlY29tcHJlc3MgYnkgZGVmYXVsdC4gSWYgaXRzIHZhbHVlIGlzIGd6aXAsIHVzZSBtaW5pZ3ppcC4KKyAgICAgICAgVXNlIGx6NCB0byBkZWNvbXByZXNzIGJ5IGRlZmF1bHQuIElmIGl0cyB2YWx1ZSBpcyBnemlwLCB1c2UgZ3ppcC4KICAgIiIiCiAKICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0X2ZpbGUsIG5hbWUsIHBsYWNlaG9sZGVyX3ZhbHVlcz1Ob25lKToKQEAgLTExMjMsOCArMTE2Niw3IEBACiAgICAgcmV0dXJuIHNlbGYuYnVpbGRfcHJvcHMuZ2V0KHByb3ApCiAKIAotZGVmIExvYWRSZWNvdmVyeUZTVGFiKHJlYWRfaGVscGVyLCBmc3RhYl92ZXJzaW9uLCByZWNvdmVyeV9mc3RhYl9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9yb290X2ltYWdlPUZhbHNlKToKK2RlZiBMb2FkUmVjb3ZlcnlGU1RhYihyZWFkX2hlbHBlciwgZnN0YWJfdmVyc2lvbiwgcmVjb3ZlcnlfZnN0YWJfcGF0aCk6CiAgIGNsYXNzIFBhcnRpdGlvbihvYmplY3QpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb3VudF9wb2ludCwgZnNfdHlwZSwgZGV2aWNlLCBsZW5ndGgsIGNvbnRleHQsIHNsb3RzZWxlY3QpOgogICAgICAgc2VsZi5tb3VudF9wb2ludCA9IG1vdW50X3BvaW50CkBAIC0xMTgzLDEyICsxMjI1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9cGllY2VzWzBdLCBsZW5ndGg9bGVuZ3RoLCBjb250ZXh0PWNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHNlbGVjdD1zbG90c2VsZWN0KQogCi0gICMgLyBpcyB1c2VkIGZvciB0aGUgc3lzdGVtIG1vdW50IHBvaW50IHdoZW4gdGhlIHJvb3QgZGlyZWN0b3J5IGlzIGluY2x1ZGVkIGluCi0gICMgc3lzdGVtLiBPdGhlciBhcmVhcyBhc3N1bWUgc3lzdGVtIGlzIGFsd2F5cyBhdCAiL3N5c3RlbSIgc28gcG9pbnQgL3N5c3RlbQotICAjIGF0IC8uCi0gIGlmIHN5c3RlbV9yb290X2ltYWdlOgotICAgIGFzc2VydCAnL3N5c3RlbScgbm90IGluIGQgYW5kICcvJyBpbiBkCi0gICAgZFsiL3N5c3RlbSJdID0gZFsiLyJdCiAgIHJldHVybiBkCiAKIApAQCAtMTIwNCwzMiArMTI0MCwxOSBAQAogICAjIC4uL1JBTURJU0svc3lzdGVtL2V0Yy9yZWNvdmVyeS5mc3RhYi4gVGhpcyBmdW5jdGlvbiBoYXMgdG8gaGFuZGxlIGJvdGgKICAgIyBjYXNlcywgc2luY2UgaXQgbWF5IGxvYWQgdGhlIGluZm9fZGljdCBmcm9tIGFuIG9sZCBidWlsZCAoZS5nLiB3aGVuCiAgICMgZ2VuZXJhdGluZyBpbmNyZW1lbnRhbCBPVEFzIGZyb20gdGhhdCBidWlsZCkuCi0gIHN5c3RlbV9yb290X2ltYWdlID0gaW5mb19kaWN0LmdldCgnc3lzdGVtX3Jvb3RfaW1hZ2UnKSA9PSAndHJ1ZScKICAgaWYgaW5mb19kaWN0LmdldCgnbm9fcmVjb3ZlcnknKSAhPSAndHJ1ZSc6CiAgICAgcmVjb3ZlcnlfZnN0YWJfcGF0aCA9ICdSRUNPVkVSWS9SQU1ESVNLL3N5c3RlbS9ldGMvcmVjb3ZlcnkuZnN0YWInCi0gICAgaWYgaXNpbnN0YW5jZShpbnB1dF9maWxlLCB6aXBmaWxlLlppcEZpbGUpOgotICAgICAgaWYgcmVjb3ZlcnlfZnN0YWJfcGF0aCBub3QgaW4gaW5wdXRfZmlsZS5uYW1lbGlzdCgpOgotICAgICAgICByZWNvdmVyeV9mc3RhYl9wYXRoID0gJ1JFQ09WRVJZL1JBTURJU0svZXRjL3JlY292ZXJ5LmZzdGFiJwotICAgIGVsc2U6Ci0gICAgICBwYXRoID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICpyZWNvdmVyeV9mc3RhYl9wYXRoLnNwbGl0KCcvJykpCi0gICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0gICAgICAgIHJlY292ZXJ5X2ZzdGFiX3BhdGggPSAnUkVDT1ZFUlkvUkFNRElTSy9ldGMvcmVjb3ZlcnkuZnN0YWInCisgICAgaWYgbm90IERvZXNJbnB1dEZpbGVDb250YWluKGlucHV0X2ZpbGUsIHJlY292ZXJ5X2ZzdGFiX3BhdGgpOgorICAgICAgcmVjb3ZlcnlfZnN0YWJfcGF0aCA9ICdSRUNPVkVSWS9SQU1ESVNLL2V0Yy9yZWNvdmVyeS5mc3RhYicKICAgICByZXR1cm4gTG9hZFJlY292ZXJ5RlNUYWIoCi0gICAgICAgIHJlYWRfaGVscGVyLCBpbmZvX2RpY3RbJ2ZzdGFiX3ZlcnNpb24nXSwgcmVjb3ZlcnlfZnN0YWJfcGF0aCwKLSAgICAgICAgc3lzdGVtX3Jvb3RfaW1hZ2UpCisgICAgICAgIHJlYWRfaGVscGVyLCBpbmZvX2RpY3RbJ2ZzdGFiX3ZlcnNpb24nXSwgcmVjb3ZlcnlfZnN0YWJfcGF0aCkKIAogICBpZiBpbmZvX2RpY3QuZ2V0KCdyZWNvdmVyeV9hc19ib290JykgPT0gJ3RydWUnOgogICAgIHJlY292ZXJ5X2ZzdGFiX3BhdGggPSAnQk9PVC9SQU1ESVNLL3N5c3RlbS9ldGMvcmVjb3ZlcnkuZnN0YWInCi0gICAgaWYgaXNpbnN0YW5jZShpbnB1dF9maWxlLCB6aXBmaWxlLlppcEZpbGUpOgotICAgICAgaWYgcmVjb3ZlcnlfZnN0YWJfcGF0aCBub3QgaW4gaW5wdXRfZmlsZS5uYW1lbGlzdCgpOgotICAgICAgICByZWNvdmVyeV9mc3RhYl9wYXRoID0gJ0JPT1QvUkFNRElTSy9ldGMvcmVjb3ZlcnkuZnN0YWInCi0gICAgZWxzZToKLSAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oaW5wdXRfZmlsZSwgKnJlY292ZXJ5X2ZzdGFiX3BhdGguc3BsaXQoJy8nKSkKLSAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICAgICAgcmVjb3ZlcnlfZnN0YWJfcGF0aCA9ICdCT09UL1JBTURJU0svZXRjL3JlY292ZXJ5LmZzdGFiJworICAgIGlmIG5vdCBEb2VzSW5wdXRGaWxlQ29udGFpbihpbnB1dF9maWxlLCByZWNvdmVyeV9mc3RhYl9wYXRoKToKKyAgICAgIHJlY292ZXJ5X2ZzdGFiX3BhdGggPSAnQk9PVC9SQU1ESVNLL2V0Yy9yZWNvdmVyeS5mc3RhYicKICAgICByZXR1cm4gTG9hZFJlY292ZXJ5RlNUYWIoCi0gICAgICAgIHJlYWRfaGVscGVyLCBpbmZvX2RpY3RbJ2ZzdGFiX3ZlcnNpb24nXSwgcmVjb3ZlcnlfZnN0YWJfcGF0aCwKLSAgICAgICAgc3lzdGVtX3Jvb3RfaW1hZ2UpCisgICAgICAgIHJlYWRfaGVscGVyLCBpbmZvX2RpY3RbJ2ZzdGFiX3ZlcnNpb24nXSwgcmVjb3ZlcnlfZnN0YWJfcGF0aCkKIAogICByZXR1cm4gTm9uZQogCkBAIC0xMjk2LDcgKzEzMTksMTEgQEAKICAgICBrZXkgPSAic3VwZXJfJXNfcGFydGl0aW9uX2xpc3QiICUgcGFydGl0aW9uX2dyb3VwCiAgICAgbWVyZ2VkX2RpY3Rba2V5XSA9IHVuaXFfY29uY2F0KAogICAgICAgICBmcmFtZXdvcmtfZGljdC5nZXQoa2V5LCAiIiksIHZlbmRvcl9kaWN0LmdldChrZXksICIiKSkKLQorICAjIGluIHRoZSBjYXNlIHRoYXQgdmVuZG9yIGlzIG9uIHMgYnVpbGQsIGJ1dCBpcyB0YWtpbmcgYSB2MyAtPiB2MyB2YWJjIG90YSwgd2Ugd2FudCB0byBmYWxsYmFjayB0byB2MgorICBpZiAidmFiY19jb3dfdmVyc2lvbiIgbm90IGluIHZlbmRvcl9kaWN0IG9yICJ2YWJjX2Nvd192ZXJzaW9uIiBub3QgaW4gZnJhbWV3b3JrX2RpY3Q6CisgICAgbWVyZ2VkX2RpY3RbInZhYmNfY293X3ZlcnNpb24iXSA9ICcyJworICBlbHNlOgorICAgIG1lcmdlZF9kaWN0WyJ2YWJjX2Nvd192ZXJzaW9uIl0gPSBtaW4odmVuZG9yX2RpY3RbInZhYmNfY293X3ZlcnNpb24iXSwgZnJhbWV3b3JrX2RpY3RbInZhYmNfY293X3ZlcnNpb24iXSkKICAgIyBWYXJpb3VzIG90aGVyIGZsYWdzIHNob3VsZCBiZSBjb3BpZWQgZnJvbSB0aGUgdmVuZG9yIGRpY3QsIGlmIGRlZmluZWQuCiAgIGZvciBrZXkgaW4gKCJ2aXJ0dWFsX2FiIiwgInZpcnR1YWxfYWJfcmV0cm9maXQiLCAibHBtYWtlIiwKICAgICAgICAgICAgICAgInN1cGVyX21ldGFkYXRhX2RldmljZSIsICJzdXBlcl9wYXJ0aXRpb25fZXJyb3JfbGltaXQiLApAQCAtMTM5MywxNCArMTQyMCwxNiBAQAogICByZXR1cm4gUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQogCiAKLWRlZiBBcHBlbmRBVkJTaWduaW5nQXJncyhjbWQsIHBhcnRpdGlvbik6CitkZWYgQXBwZW5kQVZCU2lnbmluZ0FyZ3MoY21kLCBwYXJ0aXRpb24sIGF2Yl9zYWx0PU5vbmUpOgogICAiIiJBcHBlbmQgc2lnbmluZyBhcmd1bWVudHMgZm9yIGF2YnRvb2wuIiIiCiAgICMgZS5nLiwgIi0ta2V5IHBhdGgvdG8vc2lnbmluZ19rZXkgLS1hbGdvcml0aG0gU0hBMjU2X1JTQTQwOTYiCi0gIGtleV9wYXRoID0gUmVzb2x2ZUFWQlNpZ25pbmdQYXRoQXJncyhPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl8iICsgcGFydGl0aW9uICsgIl9rZXlfcGF0aCIpKQorICBrZXlfcGF0aCA9IFJlc29sdmVBVkJTaWduaW5nUGF0aEFyZ3MoCisgICAgICBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl8iICsgcGFydGl0aW9uICsgIl9rZXlfcGF0aCIpKQogICBhbGdvcml0aG0gPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl8iICsgcGFydGl0aW9uICsgIl9hbGdvcml0aG0iKQogICBpZiBrZXlfcGF0aCBhbmQgYWxnb3JpdGhtOgogICAgIGNtZC5leHRlbmQoWyItLWtleSIsIGtleV9wYXRoLCAiLS1hbGdvcml0aG0iLCBhbGdvcml0aG1dKQotICBhdmJfc2FsdCA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3NhbHQiKQorICBpZiBhdmJfc2FsdCBpcyBOb25lOgorICAgIGF2Yl9zYWx0ID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfc2FsdCIpCiAgICMgbWFrZV92Ym1ldGFfaW1hZ2UgZG9lc24ndCBsaWtlICItLXNhbHQiIChhbmQgaXQncyBub3QgbmVlZGVkKS4KICAgaWYgYXZiX3NhbHQgYW5kIG5vdCBwYXJ0aXRpb24uc3RhcnRzd2l0aCgidmJtZXRhIik6CiAgICAgY21kLmV4dGVuZChbIi0tc2FsdCIsIGF2Yl9zYWx0XSkKQEAgLTE0MTEsMTEgKzE0NDAsMTIgQEAKICAgZGVmIFJlc29sdmVCaW5hcnlQYXRoKHBhdGgpOgogICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgcmV0dXJuIHBhdGgKLSAgICBuZXdfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLnNlYXJjaF9wYXRoLCBwYXRoKQotICAgIGlmIG9zLnBhdGguZXhpc3RzKG5ld19wYXRoKToKLSAgICAgIHJldHVybiBuZXdfcGF0aAorICAgIGlmIE9QVElPTlMuc2VhcmNoX3BhdGg6CisgICAgICBuZXdfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLnNlYXJjaF9wYXRoLCBwYXRoKQorICAgICAgaWYgb3MucGF0aC5leGlzdHMobmV3X3BhdGgpOgorICAgICAgICByZXR1cm4gbmV3X3BhdGgKICAgICByYWlzZSBFeHRlcm5hbEVycm9yKAotICAgICAgIkZhaWxlZCB0byBmaW5kIHt9Ii5mb3JtYXQobmV3X3BhdGgpKQorICAgICAgICAiRmFpbGVkIHRvIGZpbmQge30iLmZvcm1hdChwYXRoKSkKIAogICBpZiBub3Qgc3BsaXRfYXJnczoKICAgICByZXR1cm4gc3BsaXRfYXJncwpAQCAtMTQzMyw3ICsxNDYzLDcgQEAKIAogCiBkZWYgR2V0QXZiUGFydGl0aW9uQXJnKHBhcnRpdGlvbiwgaW1hZ2UsIGluZm9fZGljdD1Ob25lKToKLSAgIiIiUmV0dXJucyB0aGUgVkJNZXRhIGFyZ3VtZW50cyBmb3IgcGFydGl0aW9uLgorICAiIiJSZXR1cm5zIHRoZSBWQk1ldGEgYXJndW1lbnRzIGZvciBvbmUgcGFydGl0aW9uLgogCiAgIEl0IHNldHMgdXAgdGhlIFZCTWV0YSBhcmd1bWVudCBieSBpbmNsdWRpbmcgdGhlIHBhcnRpdGlvbiBkZXNjcmlwdG9yIGZyb20gdGhlCiAgIGdpdmVuICdpbWFnZScsIG9yIGJ5IGNvbmZpZ3VyaW5nIHRoZSBwYXJ0aXRpb24gYXMgYSBjaGFpbmVkIHBhcnRpdGlvbi4KQEAgLTE0NDUsNyArMTQ3NSw3IEBACiAgICAgICAgIE9QVElPTlMuaW5mb19kaWN0IGlmIE5vbmUgaGFzIGJlZW4gZ2l2ZW4uCiAKICAgUmV0dXJuczoKLSAgICBBIGxpc3Qgb2YgVkJNZXRhIGFyZ3VtZW50cy4KKyAgICBBIGxpc3Qgb2YgVkJNZXRhIGFyZ3VtZW50cyBmb3Igb25lIHBhcnRpdGlvbi4KICAgIiIiCiAgIGlmIGluZm9fZGljdCBpcyBOb25lOgogICAgIGluZm9fZGljdCA9IE9QVElPTlMuaW5mb19kaWN0CkBAIC0xNDUzLDcgKzE0ODMsNyBAQAogICAjIENoZWNrIGlmIGNoYWluIHBhcnRpdGlvbiBpcyB1c2VkLgogICBrZXlfcGF0aCA9IGluZm9fZGljdC5nZXQoImF2Yl8iICsgcGFydGl0aW9uICsgIl9rZXlfcGF0aCIpCiAgIGlmIG5vdCBrZXlfcGF0aDoKLSAgICByZXR1cm4gWyItLWluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZSIsIGltYWdlXQorICAgIHJldHVybiBbQVZCX0FSR19OQU1FX0lOQ0xVREVfREVTQ19GUk9NX0lNRywgaW1hZ2VdCiAKICAgIyBGb3IgYSBub24tQS9CIGRldmljZSwgd2UgZG9uJ3QgY2hhaW4gL3JlY292ZXJ5IG5vciBpbmNsdWRlIGl0cyBkZXNjcmlwdG9yCiAgICMgaW50byB2Ym1ldGEuaW1nLiBUaGUgcmVjb3ZlcnkgaW1hZ2Ugd2lsbCBiZSBjb25maWd1cmVkIG9uIGFuIGluZGVwZW5kZW50CkBAIC0xNDY1LDcgKzE0OTUsNjIgQEAKIAogICAjIE90aGVyd2lzZSBjaGFpbiB0aGUgcGFydGl0aW9uIGludG8gdmJtZXRhLgogICBjaGFpbmVkX3BhcnRpdGlvbl9hcmcgPSBHZXRBdmJDaGFpbmVkUGFydGl0aW9uQXJnKHBhcnRpdGlvbiwgaW5mb19kaWN0KQotICByZXR1cm4gWyItLWNoYWluX3BhcnRpdGlvbiIsIGNoYWluZWRfcGFydGl0aW9uX2FyZ10KKyAgcmV0dXJuIFtBVkJfQVJHX05BTUVfQ0hBSU5fUEFSVElUSU9OLCBjaGFpbmVkX3BhcnRpdGlvbl9hcmddCisKKworZGVmIEdldEF2YlBhcnRpdGlvbnNBcmcocGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3Q9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2RpY3Q9Tm9uZSk6CisgICIiIlJldHVybnMgdGhlIFZCTWV0YSBhcmd1bWVudHMgZm9yIGFsbCBBVkIgcGFydGl0aW9ucy4KKworICBJdCBzZXRzIHVwIHRoZSBWQk1ldGEgYXJndW1lbnQgYnkgY2FsbGluZyBHZXRBdmJQYXJ0aXRpb25Bcmcgb2YgYWxsCisgIHBhcnRpdGlvbnMuCisKKyAgQXJnczoKKyAgICBwYXJ0aXRpb25zOiBBIGRpY3Qgb2YgYWxsIEFWQiBwYXJ0aXRpb25zLgorICAgIHJlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3Q6IElmIHRydWUsIHJlc29sdmUgY29uZmxpY3RpbmcgYXZiCisgICAgICAgIHJvbGxiYWNrIGluZGV4IGxvY2F0aW9ucyBieSBhc3NpZ25pbmcgdGhlIHNtYWxsZXN0IHVudXNlZCB2YWx1ZS4KKyAgICBpbmZvX2RpY3Q6IEEgZGljdCByZXR1cm5lZCBieSBjb21tb24uTG9hZEluZm9EaWN0KCkuCisKKyAgUmV0dXJuczoKKyAgICBBIGxpc3Qgb2YgVkJNZXRhIGFyZ3VtZW50cyBmb3IgYWxsIHBhcnRpdGlvbnMuCisgICIiIgorICAjIEFuIEFWQiBwYXJ0aXRpb24gd2lsbCBiZSBsaW5rZWQgaW50byBhIHZibWV0YSBwYXJ0aXRpb24gYnkgZWl0aGVyCisgICMgQVZCX0FSR19OQU1FX0lOQ0xVREVfREVTQ19GUk9NX0lNRyBvciBBVkJfQVJHX05BTUVfQ0hBSU5fUEFSVElUSU9OLCB0aGVyZQorICAjIHNob3VsZCBiZSBubyBvdGhlciBjYXNlcy4KKyAgdmFsaWRfYXJncyA9IHsKKyAgICAgIEFWQl9BUkdfTkFNRV9JTkNMVURFX0RFU0NfRlJPTV9JTUc6IFtdLAorICAgICAgQVZCX0FSR19OQU1FX0NIQUlOX1BBUlRJVElPTjogW10KKyAgfQorCisgIGZvciBwYXJ0aXRpb24sIHBhdGggaW4gc29ydGVkKHBhcnRpdGlvbnMuaXRlbXMoKSk6CisgICAgYXZiX3BhcnRpdGlvbl9hcmcgPSBHZXRBdmJQYXJ0aXRpb25BcmcocGFydGl0aW9uLCBwYXRoLCBpbmZvX2RpY3QpCisgICAgaWYgbm90IGF2Yl9wYXJ0aXRpb25fYXJnOgorICAgICAgY29udGludWUKKyAgICBhcmdfbmFtZSwgYXJnX3ZhbHVlID0gYXZiX3BhcnRpdGlvbl9hcmcKKyAgICBhc3NlcnQgYXJnX25hbWUgaW4gdmFsaWRfYXJncworICAgIHZhbGlkX2FyZ3NbYXJnX25hbWVdLmFwcGVuZChhcmdfdmFsdWUpCisKKyAgIyBDb3B5IHRoZSBhcmd1bWVudHMgZm9yIG5vbi1jaGFpbmVkIEFWQiBwYXJ0aXRpb25zIGRpcmVjdGx5IHdpdGhvdXQKKyAgIyBpbnRlcnZlbnRpb24uCisgIGF2Yl9hcmdzID0gW10KKyAgZm9yIGltYWdlIGluIHZhbGlkX2FyZ3NbQVZCX0FSR19OQU1FX0lOQ0xVREVfREVTQ19GUk9NX0lNR106CisgICAgYXZiX2FyZ3MuZXh0ZW5kKFtBVkJfQVJHX05BTUVfSU5DTFVERV9ERVNDX0ZST01fSU1HLCBpbWFnZV0pCisKKyAgIyBIYW5kbGUgY2hhaW5lZCBBVkIgcGFydGl0aW9ucy4gVGhlIHJvbGxiYWNrIGluZGV4IGxvY2F0aW9uIG1pZ2h0IGJlCisgICMgYWRqdXN0ZWQgaWYgdHdvIHBhcnRpdGlvbnMgdXNlIHRoZSBzYW1lIHZhbHVlLiBUaGlzIG1heSBoYXBwZW4gd2hlbiBtaXhpbmcKKyAgIyBhIHNoYXJlZCBzeXN0ZW0gaW1hZ2Ugd2l0aCBvdGhlciB2ZW5kb3IgaW1hZ2VzLgorICB1c2VkX2luZGV4X2xvYyA9IHNldCgpCisgIGZvciBjaGFpbmVkX3BhcnRpdGlvbl9hcmcgaW4gdmFsaWRfYXJnc1tBVkJfQVJHX05BTUVfQ0hBSU5fUEFSVElUSU9OXToKKyAgICBpZiByZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0OgorICAgICAgd2hpbGUgY2hhaW5lZF9wYXJ0aXRpb25fYXJnLnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uIGluIHVzZWRfaW5kZXhfbG9jOgorICAgICAgICBjaGFpbmVkX3BhcnRpdGlvbl9hcmcucm9sbGJhY2tfaW5kZXhfbG9jYXRpb24gKz0gMQorCisgICAgdXNlZF9pbmRleF9sb2MuYWRkKGNoYWluZWRfcGFydGl0aW9uX2FyZy5yb2xsYmFja19pbmRleF9sb2NhdGlvbikKKyAgICBhdmJfYXJncy5leHRlbmQoW0FWQl9BUkdfTkFNRV9DSEFJTl9QQVJUSVRJT04sCisgICAgICAgICAgICAgICAgICAgICBjaGFpbmVkX3BhcnRpdGlvbl9hcmcudG9fc3RyaW5nKCldKQorCisgIHJldHVybiBhdmJfYXJncwogCiAKIGRlZiBHZXRBdmJDaGFpbmVkUGFydGl0aW9uQXJnKHBhcnRpdGlvbiwgaW5mb19kaWN0LCBrZXk9Tm9uZSk6CkBAIC0xNDc5LDggKzE1NjQsOCBAQAogICAgICAgICB0aGUga2V5IGxpc3RlZCBpbiBpbmZvX2RpY3QuCiAKICAgUmV0dXJuczoKLSAgICBBIHN0cmluZyBvZiBmb3JtICJwYXJ0aXRpb246cm9sbGJhY2tfaW5kZXhfbG9jYXRpb246a2V5IiB0aGF0IGNhbiBiZSB1c2VkIHRvCi0gICAgYnVpbGQgb3IgdmVyaWZ5IHZibWV0YSBpbWFnZS4KKyAgICBBbiBBdmJDaGFpbmVkUGFydGl0aW9uQXJnIG9iamVjdCB3aXRoIHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uIGFuZAorICAgIHB1YmtleV9wYXRoIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgb3IgdmVyaWZ5IHZibWV0YSBpbWFnZS4KICAgIiIiCiAgIGlmIGtleSBpcyBOb25lOgogICAgIGtleSA9IGluZm9fZGljdFsiYXZiXyIgKyBwYXJ0aXRpb24gKyAiX2tleV9wYXRoIl0KQEAgLTE0ODgsNTQgKzE1NzMsMTQgQEAKICAgcHVia2V5X3BhdGggPSBFeHRyYWN0QXZiUHVibGljS2V5KGluZm9fZGljdFsiYXZiX2F2YnRvb2wiXSwga2V5KQogICByb2xsYmFja19pbmRleF9sb2NhdGlvbiA9IGluZm9fZGljdFsKICAgICAgICJhdmJfIiArIHBhcnRpdGlvbiArICJfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24iXQotICByZXR1cm4gInt9Ont9Ont9Ii5mb3JtYXQocGFydGl0aW9uLCByb2xsYmFja19pbmRleF9sb2NhdGlvbiwgcHVia2V5X3BhdGgpCisgIHJldHVybiBBdmJDaGFpbmVkUGFydGl0aW9uQXJnKAorICAgICAgcGFydGl0aW9uPXBhcnRpdGlvbiwKKyAgICAgIHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uPWludChyb2xsYmFja19pbmRleF9sb2NhdGlvbiksCisgICAgICBwdWJrZXlfcGF0aD1wdWJrZXlfcGF0aCkKIAogCi1kZWYgX0hhc0draUNlcnRpZmljYXRpb25BcmdzKCk6Ci0gIHJldHVybiAoImdraV9zaWduaW5nX2tleV9wYXRoIiBpbiBPUFRJT05TLmluZm9fZGljdCBhbmQKLSAgICAgICAgICAiZ2tpX3NpZ25pbmdfYWxnb3JpdGhtIiBpbiBPUFRJT05TLmluZm9fZGljdCkKLQotCi1kZWYgX0dlbmVyYXRlR2tpQ2VydGlmaWNhdGUoaW1hZ2UsIGltYWdlX25hbWUpOgotICBrZXlfcGF0aCA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiZ2tpX3NpZ25pbmdfa2V5X3BhdGgiKQotICBhbGdvcml0aG0gPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImdraV9zaWduaW5nX2FsZ29yaXRobSIpCi0KLSAga2V5X3BhdGggPSBSZXNvbHZlQVZCU2lnbmluZ1BhdGhBcmdzKGtleV9wYXRoKQotCi0gICMgQ2hlY2tzIGtleV9wYXRoIGV4aXN0cywgYmVmb3JlIHByb2Nlc3NpbmcgLS1na2lfc2lnbmluZ18qIGFyZ3MuCi0gIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhrZXlfcGF0aCk6Ci0gICAgcmFpc2UgRXh0ZXJuYWxFcnJvcigKLSAgICAgICAgJ2draV9zaWduaW5nX2tleV9wYXRoOiAie30iIG5vdCBmb3VuZCcuZm9ybWF0KGtleV9wYXRoKSkKLQotICBvdXRwdXRfY2VydGlmaWNhdGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQotICBjbWQgPSBbCi0gICAgICAiZ2VuZXJhdGVfZ2tpX2NlcnRpZmljYXRlIiwKLSAgICAgICItLW5hbWUiLCBpbWFnZV9uYW1lLAotICAgICAgIi0tYWxnb3JpdGhtIiwgYWxnb3JpdGhtLAotICAgICAgIi0ta2V5Iiwga2V5X3BhdGgsCi0gICAgICAiLS1vdXRwdXQiLCBvdXRwdXRfY2VydGlmaWNhdGUubmFtZSwKLSAgICAgIGltYWdlLAotICBdCi0KLSAgc2lnbmF0dXJlX2FyZ3MgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImdraV9zaWduaW5nX3NpZ25hdHVyZV9hcmdzIiwgIiIpCi0gIHNpZ25hdHVyZV9hcmdzID0gc2lnbmF0dXJlX2FyZ3Muc3RyaXAoKQotICBpZiBzaWduYXR1cmVfYXJnczoKLSAgICBjbWQuZXh0ZW5kKFsiLS1hZGRpdGlvbmFsX2F2Yl9hcmdzIiwgc2lnbmF0dXJlX2FyZ3NdKQotCi0gIGFyZ3MgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl9ib290X2FkZF9oYXNoX2Zvb3Rlcl9hcmdzIiwgIiIpCi0gIGFyZ3MgPSBhcmdzLnN0cmlwKCkKLSAgaWYgYXJnczoKLSAgICBjbWQuZXh0ZW5kKFsiLS1hZGRpdGlvbmFsX2F2Yl9hcmdzIiwgYXJnc10pCi0KLSAgUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQotCi0gIG91dHB1dF9jZXJ0aWZpY2F0ZS5zZWVrKG9zLlNFRUtfU0VULCAwKQotICBkYXRhID0gb3V0cHV0X2NlcnRpZmljYXRlLnJlYWQoKQotICBvdXRwdXRfY2VydGlmaWNhdGUuY2xvc2UoKQotICByZXR1cm4gZGF0YQotCi0KLWRlZiBCdWlsZFZCTWV0YShpbWFnZV9wYXRoLCBwYXJ0aXRpb25zLCBuYW1lLCBuZWVkZWRfcGFydGl0aW9ucyk6CitkZWYgQnVpbGRWQk1ldGEoaW1hZ2VfcGF0aCwgcGFydGl0aW9ucywgbmFtZSwgbmVlZGVkX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdD1GYWxzZSk6CiAgICIiIkNyZWF0ZXMgYSBWQk1ldGEgaW1hZ2UuCiAKICAgSXQgZ2VuZXJhdGVzIHRoZSByZXF1ZXN0ZWQgVkJNZXRhIGltYWdlLiBUaGUgcmVxdWVzdGVkIGltYWdlIGNvdWxkIGJlIGZvcgpAQCAtMTU1MCw2ICsxNTk1LDggQEAKICAgICBuYW1lOiBOYW1lIG9mIHRoZSBWQk1ldGEgcGFydGl0aW9uLCBlLmcuICd2Ym1ldGEnLCAndmJtZXRhX3N5c3RlbScuCiAgICAgbmVlZGVkX3BhcnRpdGlvbnM6IFBhcnRpdGlvbnMgd2hvc2UgZGVzY3JpcHRvcnMgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlCiAgICAgICAgIGdlbmVyYXRlZCBWQk1ldGEgaW1hZ2UuCisgICAgcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdDogSWYgdHJ1ZSwgcmVzb2x2ZSBjb25mbGljdGluZyBhdmIKKyAgICAgICAgcm9sbGJhY2sgaW5kZXggbG9jYXRpb25zIGJ5IGFzc2lnbmluZyB0aGUgc21hbGxlc3QgdW51c2VkIHZhbHVlLgogCiAgIFJhaXNlczoKICAgICBBc3NlcnRpb25FcnJvcjogT24gaW52YWxpZCBpbnB1dCBhcmdzLgpAQCAtMTU2Myw3ICsxNjEwLDggQEAKICAgY3VzdG9tX2F2Yl9wYXJ0aXRpb25zID0gWyJ2Ym1ldGFfIiArIHBhcnQgZm9yIHBhcnQgaW4gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KAogICAgICAgImF2Yl9jdXN0b21fdmJtZXRhX2ltYWdlc19wYXJ0aXRpb25fbGlzdCIsICIiKS5zdHJpcCgpLnNwbGl0KCldCiAKLSAgZm9yIHBhcnRpdGlvbiwgcGF0aCBpbiBwYXJ0aXRpb25zLml0ZW1zKCk6CisgIGF2Yl9wYXJ0aXRpb25zID0ge30KKyAgZm9yIHBhcnRpdGlvbiwgcGF0aCBpbiBzb3J0ZWQocGFydGl0aW9ucy5pdGVtcygpKToKICAgICBpZiBwYXJ0aXRpb24gbm90IGluIG5lZWRlZF9wYXJ0aXRpb25zOgogICAgICAgY29udGludWUKICAgICBhc3NlcnQgKHBhcnRpdGlvbiBpbiBBVkJfUEFSVElUSU9OUyBvcgpAQCAtMTU3Myw3ICsxNjIxLDkgQEAKICAgICAgICAgJ1Vua25vd24gcGFydGl0aW9uOiB7fScuZm9ybWF0KHBhcnRpdGlvbikKICAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMocGF0aCksIFwKICAgICAgICAgJ0ZhaWxlZCB0byBmaW5kIHt9IGZvciB7fScuZm9ybWF0KHBhdGgsIHBhcnRpdGlvbikKLSAgICBjbWQuZXh0ZW5kKEdldEF2YlBhcnRpdGlvbkFyZyhwYXJ0aXRpb24sIHBhdGgpKQorICAgIGF2Yl9wYXJ0aXRpb25zW3BhcnRpdGlvbl0gPSBwYXRoCisgIGNtZC5leHRlbmQoR2V0QXZiUGFydGl0aW9uc0FyZyhhdmJfcGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QpKQogCiAgIGFyZ3MgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl97fV9hcmdzIi5mb3JtYXQobmFtZSkpCiAgIGlmIGFyZ3MgYW5kIGFyZ3Muc3RyaXAoKToKQEAgLTE1ODQsNyArMTYzNCw3IEBACiAgICAgICAjIHNhbWUgbG9jYXRpb24gd2hlbiBydW5uaW5nIHRoaXMgc2NyaXB0ICh3ZSBoYXZlIHRoZSBpbnB1dCB0YXJnZXRfZmlsZXMKICAgICAgICMgemlwIG9ubHkpLiBGb3Igc3VjaCBjYXNlcywgd2UgYWRkaXRpb25hbGx5IHNjYW4gb3RoZXIgbG9jYXRpb25zIChlLmcuCiAgICAgICAjIElNQUdFUy8sIFJBRElPLywgZXRjKSBiZWZvcmUgYmFpbGluZyBvdXQuCi0gICAgICBpZiBhcmcgPT0gJy0taW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlJzoKKyAgICAgIGlmIGFyZyA9PSBBVkJfQVJHX05BTUVfSU5DTFVERV9ERVNDX0ZST01fSU1HOgogICAgICAgICBjaGFpbmVkX2ltYWdlID0gc3BsaXRfYXJnc1tpbmRleCArIDFdCiAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNoYWluZWRfaW1hZ2UpOgogICAgICAgICAgIGNvbnRpbnVlCkBAIC0xNjI0LDkgKzE2NzQsOSBAQAogICAgIHAyID0gUnVuKFsibHo0IiwgIi1sIiwgIi0xMiIsICItLWZhdm9yLWRlY1NwZWVkIl0sIHN0ZGluPXAxLnN0ZG91dCwKICAgICAgICAgICAgICBzdGRvdXQ9cmFtZGlza19pbWcuZmlsZS5maWxlbm8oKSkKICAgZWxpZiByYW1kaXNrX2Zvcm1hdCA9PSBSYW1kaXNrRm9ybWF0LkdaOgotICAgIHAyID0gUnVuKFsibWluaWd6aXAiXSwgc3RkaW49cDEuc3Rkb3V0LCBzdGRvdXQ9cmFtZGlza19pbWcuZmlsZS5maWxlbm8oKSkKKyAgICBwMiA9IFJ1bihbImd6aXAiXSwgc3RkaW49cDEuc3Rkb3V0LCBzdGRvdXQ9cmFtZGlza19pbWcuZmlsZS5maWxlbm8oKSkKICAgZWxzZToKLSAgICByYWlzZSBWYWx1ZUVycm9yKCJPbmx5IHN1cHBvcnQgbHo0IG9yIG1pbmlnemlwIHJhbWRpc2sgZm9ybWF0LiIpCisgICAgcmFpc2UgVmFsdWVFcnJvcigiT25seSBzdXBwb3J0IGx6NCBvciBnemlwIHJhbWRpc2sgZm9ybWF0LiIpCiAKICAgcDIud2FpdCgpCiAgIHAxLndhaXQoKQpAQCAtMTczNCwxMiArMTc4NCw3IEBACiAgIGlmIGhhc19yYW1kaXNrOgogICAgIGNtZC5leHRlbmQoWyItLXJhbWRpc2siLCByYW1kaXNrX2ltZy5uYW1lXSkKIAotICBpbWdfdW5zaWduZWQgPSBOb25lCi0gIGlmIGluZm9fZGljdC5nZXQoInZib290Iik6Ci0gICAgaW1nX3Vuc2lnbmVkID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKLSAgICBjbWQuZXh0ZW5kKFsiLS1vdXRwdXQiLCBpbWdfdW5zaWduZWQubmFtZV0pCi0gIGVsc2U6Ci0gICAgY21kLmV4dGVuZChbIi0tb3V0cHV0IiwgaW1nLm5hbWVdKQorICBjbWQuZXh0ZW5kKFsiLS1vdXRwdXQiLCBpbWcubmFtZV0pCiAKICAgaWYgcGFydGl0aW9uX25hbWUgPT0gInJlY292ZXJ5IjoKICAgICBpZiBpbmZvX2RpY3QuZ2V0KCJpbmNsdWRlX3JlY292ZXJ5X2R0Ym8iKSA9PSAidHJ1ZSI6CkBAIC0xNzUxLDUxICsxNzk2LDYgQEAKIAogICBSdW5BbmRDaGVja091dHB1dChjbWQpCiAKLSAgaWYgX0hhc0draUNlcnRpZmljYXRpb25BcmdzKCk6Ci0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGltZy5uYW1lKToKLSAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBmaW5kIEdLSSBib290LmltZyIpCi0gICAgaWYga2VybmVsX3BhdGggaXMgTm9uZSBvciBub3Qgb3MucGF0aC5leGlzdHMoa2VybmVsX3BhdGgpOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IGZpbmQgR0tJIGtlcm5lbC5pbWciKQotCi0gICAgIyBDZXJ0aWZ5IEdLSSBpbWFnZXMuCi0gICAgYm9vdF9zaWduYXR1cmVfYnl0ZXMgPSBiJycKLSAgICBib290X3NpZ25hdHVyZV9ieXRlcyArPSBfR2VuZXJhdGVHa2lDZXJ0aWZpY2F0ZShpbWcubmFtZSwgImJvb3QiKQotICAgIGJvb3Rfc2lnbmF0dXJlX2J5dGVzICs9IF9HZW5lcmF0ZUdraUNlcnRpZmljYXRlKAotICAgICAgICBrZXJuZWxfcGF0aCwgImdlbmVyaWNfa2VybmVsIikKLQotICAgIEJPT1RfU0lHTkFUVVJFX1NJWkUgPSAxNiAqIDEwMjQKLSAgICBpZiBsZW4oYm9vdF9zaWduYXR1cmVfYnl0ZXMpID4gQk9PVF9TSUdOQVRVUkVfU0laRToKLSAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCi0gICAgICAgICAgZiJHS0kgYm9vdF9zaWduYXR1cmUgc2l6ZSBtdXN0IGJlIDw9IHtCT09UX1NJR05BVFVSRV9TSVpFfSIpCi0gICAgYm9vdF9zaWduYXR1cmVfYnl0ZXMgKz0gKAotICAgICAgICBiJ1wwJyAqIChCT09UX1NJR05BVFVSRV9TSVpFIC0gbGVuKGJvb3Rfc2lnbmF0dXJlX2J5dGVzKSkpCi0gICAgYXNzZXJ0IGxlbihib290X3NpZ25hdHVyZV9ieXRlcykgPT0gQk9PVF9TSUdOQVRVUkVfU0laRQotCi0gICAgd2l0aCBvcGVuKGltZy5uYW1lLCAnYWInKSBhcyBmOgotICAgICAgZi53cml0ZShib290X3NpZ25hdHVyZV9ieXRlcykKLQotICAjIFNpZ24gdGhlIGltYWdlIGlmIHZib290IGlzIG5vbi1lbXB0eS4KLSAgaWYgaW5mb19kaWN0LmdldCgidmJvb3QiKToKLSAgICBwYXRoID0gIi8iICsgcGFydGl0aW9uX25hbWUKLSAgICBpbWdfa2V5YmxvY2sgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQotICAgICMgV2UgaGF2ZSBzd2l0Y2hlZCBmcm9tIHRoZSBwcmVidWlsdCBmdXRpbGl0eSBiaW5hcnkgdG8gdXNpbmcgdGhlIHRvb2wKLSAgICAjIChmdXRpbGl0eS1ob3N0KSBidWlsdCBmcm9tIHRoZSBzb3VyY2UuIE92ZXJyaWRlIHRoZSBzZXR0aW5nIGluIHRoZSBvbGQKLSAgICAjIFRGLnppcC4KLSAgICBmdXRpbGl0eSA9IGluZm9fZGljdFsiZnV0aWxpdHkiXQotICAgIGlmIGZ1dGlsaXR5LnN0YXJ0c3dpdGgoInByZWJ1aWx0cy8iKToKLSAgICAgIGZ1dGlsaXR5ID0gImZ1dGlsaXR5LWhvc3QiCi0gICAgY21kID0gW2luZm9fZGljdFsidmJvb3Rfc2lnbmVyX2NtZCJdLCBmdXRpbGl0eSwKLSAgICAgICAgICAgaW1nX3Vuc2lnbmVkLm5hbWUsIGluZm9fZGljdFsidmJvb3Rfa2V5Il0gKyAiLnZicHViayIsCi0gICAgICAgICAgIGluZm9fZGljdFsidmJvb3Rfa2V5Il0gKyAiLnZicHJpdmsiLAotICAgICAgICAgICBpbmZvX2RpY3RbInZib290X3N1YmtleSJdICsgIi52YnByaXZrIiwKLSAgICAgICAgICAgaW1nX2tleWJsb2NrLm5hbWUsCi0gICAgICAgICAgIGltZy5uYW1lXQotICAgIFJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKLQotICAgICMgQ2xlYW4gdXAgdGhlIHRlbXAgZmlsZXMuCi0gICAgaW1nX3Vuc2lnbmVkLmNsb3NlKCkKLSAgICBpbWdfa2V5YmxvY2suY2xvc2UoKQotCiAgICMgQVZCOiBpZiBlbmFibGVkLCBjYWxjdWxhdGUgYW5kIGFkZCBoYXNoIHRvIGJvb3QuaW1nIG9yIHJlY292ZXJ5LmltZy4KICAgaWYgaW5mb19kaWN0LmdldCgiYXZiX2VuYWJsZSIpID09ICJ0cnVlIjoKICAgICBhdmJ0b29sID0gaW5mb19kaWN0WyJhdmJfYXZidG9vbCJdCkBAIC0xODA2LDcgKzE4MDYsMTEgQEAKICAgICBjbWQgPSBbYXZidG9vbCwgImFkZF9oYXNoX2Zvb3RlciIsICItLWltYWdlIiwgaW1nLm5hbWUsCiAgICAgICAgICAgICItLXBhcnRpdGlvbl9zaXplIiwgc3RyKHBhcnRfc2l6ZSksICItLXBhcnRpdGlvbl9uYW1lIiwKICAgICAgICAgICAgcGFydGl0aW9uX25hbWVdCi0gICAgQXBwZW5kQVZCU2lnbmluZ0FyZ3MoY21kLCBwYXJ0aXRpb25fbmFtZSkKKyAgICBzYWx0ID0gTm9uZQorICAgIGlmIGtlcm5lbF9wYXRoIGlzIG5vdCBOb25lOgorICAgICAgd2l0aCBvcGVuKGtlcm5lbF9wYXRoLCAicmIiKSBhcyBmcDoKKyAgICAgICAgc2FsdCA9IHNoYTI1NihmcC5yZWFkKCkpLmhleGRpZ2VzdCgpCisgICAgQXBwZW5kQVZCU2lnbmluZ0FyZ3MoY21kLCBwYXJ0aXRpb25fbmFtZSwgc2FsdCkKICAgICBhcmdzID0gaW5mb19kaWN0LmdldCgiYXZiXyIgKyBwYXJ0aXRpb25fbmFtZSArICJfYWRkX2hhc2hfZm9vdGVyX2FyZ3MiKQogICAgIGlmIGFyZ3MgYW5kIGFyZ3Muc3RyaXAoKToKICAgICAgIHNwbGl0X2FyZ3MgPSBSZXNvbHZlQVZCU2lnbmluZ1BhdGhBcmdzKHNobGV4LnNwbGl0KGFyZ3MpKQpAQCAtMTg0OCw3ICsxODUyLDE4IEBACiAgICAgY21kID0gW2F2YnRvb2wsICJhZGRfaGFzaF9mb290ZXIiLCAiLS1pbWFnZSIsIGltYWdlX3BhdGgsCiAgICAgICAgICAgICItLXBhcnRpdGlvbl9zaXplIiwgc3RyKHBhcnRfc2l6ZSksICItLXBhcnRpdGlvbl9uYW1lIiwKICAgICAgICAgICAgcGFydGl0aW9uX25hbWVdCi0gICAgQXBwZW5kQVZCU2lnbmluZ0FyZ3MoY21kLCBwYXJ0aXRpb25fbmFtZSkKKyAgICAjIFVzZSBzaGEyNTYgb2YgdGhlIGtlcm5lbCBhcyBzYWx0IGZvciByZXByb2R1Y2libGUgYnVpbGRzCisgICAgd2l0aCB0ZW1wZmlsZS5UZW1wb3JhcnlEaXJlY3RvcnkoKSBhcyB0bXBkaXI6CisgICAgICBSdW5BbmRDaGVja091dHB1dChbInVucGFja19ib290aW1nIiwgIi0tYm9vdF9pbWciLCBpbWFnZV9wYXRoLCAiLS1vdXQiLCB0bXBkaXJdKQorICAgICAgZm9yIGZpbGVuYW1lIGluIFsia2VybmVsIiwgInJhbWRpc2siLCAidmVuZG9yX3JhbWRpc2swMCJdOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgZmlsZW5hbWUpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpIGFuZCBvcy5wYXRoLmdldHNpemUocGF0aCk6CisgICAgICAgICAgcHJpbnQoIlVzaW5nIHt9IGFzIHNhbHQgZm9yIGF2YiBmb290ZXIgb2Yge30iLmZvcm1hdCgKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIHBhcnRpdGlvbl9uYW1lKSkKKyAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgInJiIikgYXMgZnA6CisgICAgICAgICAgICBzYWx0ID0gc2hhMjU2KGZwLnJlYWQoKSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgICAgIGJyZWFrCisgICAgQXBwZW5kQVZCU2lnbmluZ0FyZ3MoY21kLCBwYXJ0aXRpb25fbmFtZSwgc2FsdCkKICAgICBhcmdzID0gaW5mb19kaWN0LmdldCgiYXZiXyIgKyBwYXJ0aXRpb25fbmFtZSArICJfYWRkX2hhc2hfZm9vdGVyX2FyZ3MiKQogICAgIGlmIGFyZ3MgYW5kIGFyZ3Muc3RyaXAoKToKICAgICAgIHNwbGl0X2FyZ3MgPSBSZXNvbHZlQVZCU2lnbmluZ1BhdGhBcmdzKHNobGV4LnNwbGl0KGFyZ3MpKQpAQCAtMTg3NSwxMSArMTg5MCw2IEBACiAgIGlmIGluZm9fZGljdC5nZXQoImdraV9ib290X2ltYWdlX3dpdGhvdXRfcmFtZGlzayIpID09ICJ0cnVlIjoKICAgICByZXR1cm4gRmFsc2UgICMgQSBHS0kgYm9vdC5pbWcgaGFzIG5vIHJhbWRpc2sgc2luY2UgQW5kcm9pZC0xMy4KIAotICBpZiBpbmZvX2RpY3QuZ2V0KCJzeXN0ZW1fcm9vdF9pbWFnZSIpID09ICJ0cnVlIjoKLSAgICAjIFRoZSByYW1kaXNrIGNvbnRlbnQgaXMgbWVyZ2VkIGludG8gdGhlIHN5c3RlbS5pbWcsIHNvIHRoZXJlIGlzIE5PCi0gICAgIyByYW1kaXNrIGluIHRoZSBib290LmltZyBvciBib290LTxrZXJuZWwgdmVyc2lvbj4uaW1nLgotICAgIHJldHVybiBGYWxzZQotCiAgIGlmIGluZm9fZGljdC5nZXQoImluaXRfYm9vdCIpID09ICJ0cnVlIjoKICAgICAjIFRoZSByYW1kaXNrIGlzIG1vdmVkIHRvIHRoZSBpbml0X2Jvb3QuaW1nLCBzbyB0aGVyZSBpcyBOTwogICAgICMgcmFtZGlzayBpbiB0aGUgYm9vdC5pbWcgb3IgYm9vdC08a2VybmVsIHZlcnNpb24+LmltZy4KQEAgLTE5MzQsNyArMTk0NCw3IEBACiAgIHJldHVybiBOb25lCiAKIAotZGVmIF9CdWlsZFZlbmRvckJvb3RJbWFnZShzb3VyY2VkaXIsIHBhcnRpdGlvbl9uYW1lLCBpbmZvX2RpY3Q9Tm9uZSk6CitkZWYgX0J1aWxkVmVuZG9yQm9vdEltYWdlKHNvdXJjZWRpciwgZnNfY29uZmlnX2ZpbGUsIHBhcnRpdGlvbl9uYW1lLCBpbmZvX2RpY3Q9Tm9uZSk6CiAgICIiIkJ1aWxkIGEgdmVuZG9yIGJvb3QgaW1hZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZWRpci4KIAogICBUYWtlIGEgcmFtZGlzaywgZHRiLCBhbmQgdmVuZG9yX2NtZGxpbmUgZnJvbSB0aGUgaW5wdXQgKGluICdzb3VyY2VkaXInKSwgYW5kCkBAIC0xOTUwLDcgKzE5NjAsNyBAQAogICBpbWcgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQogCiAgIHJhbWRpc2tfZm9ybWF0ID0gR2V0UmFtZGlza0Zvcm1hdChpbmZvX2RpY3QpCi0gIHJhbWRpc2tfaW1nID0gX01ha2VSYW1kaXNrKHNvdXJjZWRpciwgcmFtZGlza19mb3JtYXQ9cmFtZGlza19mb3JtYXQpCisgIHJhbWRpc2tfaW1nID0gX01ha2VSYW1kaXNrKHNvdXJjZWRpciwgZnNfY29uZmlnX2ZpbGU9ZnNfY29uZmlnX2ZpbGUsIHJhbWRpc2tfZm9ybWF0PXJhbWRpc2tfZm9ybWF0KQogCiAgICMgdXNlIE1LQk9PVElNRyBmcm9tIGVudmlyb24sIG9yICJta2Jvb3RpbWciIGlmIGVtcHR5IG9yIG5vdCBzZXQKICAgbWtib290aW1nID0gb3MuZ2V0ZW52KCdNS0JPT1RJTUcnKSBvciAibWtib290aW1nIgpAQCAtMjA2NCw4ICsyMDc0LDkgQEAKICAgaWYgaW5mb19kaWN0IGlzIE5vbmU6CiAgICAgaW5mb19kaWN0ID0gT1BUSU9OUy5pbmZvX2RpY3QKIAorICBmc19jb25maWcgPSAiTUVUQS8iICsgdHJlZV9zdWJkaXIubG93ZXIoKSArICJfZmlsZXN5c3RlbV9jb25maWcudHh0IgogICBkYXRhID0gX0J1aWxkVmVuZG9yQm9vdEltYWdlKAotICAgICAgb3MucGF0aC5qb2luKHVucGFja19kaXIsIHRyZWVfc3ViZGlyKSwgInZlbmRvcl9ib290IiwgaW5mb19kaWN0KQorICAgICAgb3MucGF0aC5qb2luKHVucGFja19kaXIsIHRyZWVfc3ViZGlyKSwgb3MucGF0aC5qb2luKHVucGFja19kaXIsIGZzX2NvbmZpZyksICJ2ZW5kb3JfYm9vdCIsIGluZm9fZGljdCkKICAgaWYgZGF0YToKICAgICByZXR1cm4gRmlsZShuYW1lLCBkYXRhKQogICByZXR1cm4gTm9uZQpAQCAtMjA4OSw3ICsyMTAwLDcgQEAKICAgICBpbmZvX2RpY3QgPSBPUFRJT05TLmluZm9fZGljdAogCiAgIGRhdGEgPSBfQnVpbGRWZW5kb3JCb290SW1hZ2UoCi0gICAgICBvcy5wYXRoLmpvaW4odW5wYWNrX2RpciwgdHJlZV9zdWJkaXIpLCAidmVuZG9yX2tlcm5lbF9ib290IiwgaW5mb19kaWN0KQorICAgICAgb3MucGF0aC5qb2luKHVucGFja19kaXIsIHRyZWVfc3ViZGlyKSwgTm9uZSwgInZlbmRvcl9rZXJuZWxfYm9vdCIsIGluZm9fZGljdCkKICAgaWYgZGF0YToKICAgICByZXR1cm4gRmlsZShuYW1lLCBkYXRhKQogICByZXR1cm4gTm9uZQpAQCAtMjEwMiw2ICsyMTEzLDM5IEBACiAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKGluX2ZpbGUsIG91dF9maWxlKQogCiAKK2RlZiBVbnppcFNpbmdsZUZpbGUoaW5wdXRfemlwOiB6aXBmaWxlLlppcEZpbGUsIGluZm86IHppcGZpbGUuWmlwSW5mbywgZGlybmFtZTogc3RyKToKKyAgIyBBY2NvcmRpbmcgdG8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDM0NjQxL2hvdy1kby1pLXNldC1wZXJtaXNzaW9ucy1hdHRyaWJ1dGVzLW9uLWEtZmlsZS1pbi1hLXppcC1maWxlLXVzaW5nLXB5dGhvbnMtemlwLzYyOTc4MzgjNjI5NzgzOAorICAjIGhpZ2hlciBiaXRzIG9mIHxleHRlcm5hbF9hdHRyfCBhcmUgdW5peCBmaWxlIHBlcm1pc3Npb24gYW5kIHR5cGVzCisgIHVuaXhfZmlsZXR5cGUgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKKyAgZmlsZV9wZXJtID0gdW5peF9maWxldHlwZSAmIDBvNzc3CisKKyAgZGVmIENoZWNrTWFzayhhLCBtYXNrKToKKyAgICByZXR1cm4gKGEgJiBtYXNrKSA9PSBtYXNrCisKKyAgZGVmIElzU3ltbGluayhhKToKKyAgICByZXR1cm4gQ2hlY2tNYXNrKGEsIHN0YXQuU19JRkxOSykKKworICBkZWYgSXNEaXIoYSk6CisgICAgcmV0dXJuIENoZWNrTWFzayhhLCBzdGF0LlNfSUZESVIpCisgICMgcHl0aG9uMy4xMSB6aXBmaWxlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgaGFuZGxlIHN5bWxpbmsgY29ycmVjdGx5CisgIGlmIG5vdCBJc1N5bWxpbmsodW5peF9maWxldHlwZSk6CisgICAgdGFyZ2V0ID0gaW5wdXRfemlwLmV4dHJhY3QoaW5mbywgZGlybmFtZSkKKyAgICAjIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGZpbGUgaXMgYXQgbGVhc3QgcmVhZC93cml0YWJsZSBieSBvd25lciBhbmQgcmVhZGFibGUgYnkgYWxsIHVzZXJzCisgICAgaWYgSXNEaXIodW5peF9maWxldHlwZSk6CisgICAgICBvcy5jaG1vZCh0YXJnZXQsIGZpbGVfcGVybSB8IDBvNzU1KQorICAgIGVsc2U6CisgICAgICBvcy5jaG1vZCh0YXJnZXQsIGZpbGVfcGVybSB8IDBvNjQ0KQorICAgIHJldHVybiB0YXJnZXQKKyAgaWYgZGlybmFtZSBpcyBOb25lOgorICAgIGRpcm5hbWUgPSBvcy5nZXRjd2QoKQorICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgaW5mby5maWxlbmFtZSkKKyAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKHRhcmdldCksIGV4aXN0X29rPVRydWUpCisgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldCk6CisgICAgb3MudW5saW5rKHRhcmdldCkKKyAgb3Muc3ltbGluayhpbnB1dF96aXAucmVhZChpbmZvKS5kZWNvZGUoKSwgdGFyZ2V0KQorICByZXR1cm4gdGFyZ2V0CisKKwogZGVmIFVuemlwVG9EaXIoZmlsZW5hbWUsIGRpcm5hbWUsIHBhdHRlcm5zPU5vbmUpOgogICAiIiJVbnppcHMgdGhlIGFyY2hpdmUgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KIApAQCAtMjExMiwyMCArMjE1Niw0NiBAQAogICAgICAgICBhcmNodmllLiBOb24tbWF0Y2hpbmcgcGF0dGVybnMgd2lsbCBiZSBmaWx0ZXJlZCBvdXQuIElmIHRoZXJlJ3Mgbm8gbWF0Y2gKICAgICAgICAgYWZ0ZXIgdGhlIGZpbHRlcmluZywgbm8gZmlsZSB3aWxsIGJlIHVuemlwcGVkLgogICAiIiIKLSAgY21kID0gWyJ1bnppcCIsICItbyIsICItcSIsIGZpbGVuYW1lLCAiLWQiLCBkaXJuYW1lXQotICBpZiBwYXR0ZXJucyBpcyBub3QgTm9uZToKKyAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZmlsZW5hbWUsIGFsbG93WmlwNjQ9VHJ1ZSwgbW9kZT0iciIpIGFzIGlucHV0X3ppcDoKICAgICAjIEZpbHRlciBvdXQgbm9uLW1hdGNoaW5nIHBhdHRlcm5zLiB1bnppcCB3aWxsIGNvbXBsYWluIG90aGVyd2lzZS4KLSAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSwgYWxsb3daaXA2ND1UcnVlKSBhcyBpbnB1dF96aXA6Ci0gICAgICBuYW1lcyA9IGlucHV0X3ppcC5uYW1lbGlzdCgpCi0gICAgZmlsdGVyZWQgPSBbCi0gICAgICAgIHBhdHRlcm4gZm9yIHBhdHRlcm4gaW4gcGF0dGVybnMgaWYgZm5tYXRjaC5maWx0ZXIobmFtZXMsIHBhdHRlcm4pXQorICAgIGVudHJpZXMgPSBpbnB1dF96aXAuaW5mb2xpc3QoKQorICAgICMgYi8yODMwMzM0OTEKKyAgICAjIFBlciBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9aSVBfKGZpbGVfZm9ybWF0KSNDZW50cmFsX2RpcmVjdG9yeV9maWxlX2hlYWRlcgorICAgICMgSW4gemlwNjQgbW9kZSwgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkJ3MgaGVhZGVyX29mZnNldCBmaWVsZCBtaWdodCBiZQorICAgICMgc2V0IHRvIDB4RkZGRkZGRkYgaWYgaGVhZGVyIG9mZnNldCBpcyA+IDJeMzIuIEluIHRoaXMgY2FzZSwgdGhlIGV4dHJhCisgICAgIyBmaWVsZHMgd2lsbCBjb250YWluIGFuIDggYnl0ZSBsaXR0bGUgZW5kaWFuIGludGVnZXIgYXQgb2Zmc2V0IDIwCisgICAgIyB0byBpbmRpY2F0ZSB0aGUgYWN0dWFsIGxvY2FsIGhlYWRlciBvZmZzZXQuCisgICAgIyBBcyBvZiBweXRob24zLjExLCBweXRob24gZG9lcyBub3QgaGFuZGxlIHppcDY0IGNlbnRyYWwgZGlyZWN0b3JpZXMKKyAgICAjIGNvcnJlY3RseSwgc28gd2Ugd2lsbCBtYW51YWxseSBkbyB0aGUgcGFyc2luZyBoZXJlLgogCi0gICAgIyBUaGVyZSBpc24ndCBhbnkgbWF0Y2hpbmcgZmlsZXMuIERvbid0IHVuemlwIGFueXRoaW5nLgotICAgIGlmIG5vdCBmaWx0ZXJlZDoKLSAgICAgIHJldHVybgotICAgIGNtZC5leHRlbmQoZmlsdGVyZWQpCisgICAgIyBaSVA2NCBjZW50cmFsIGRpcmVjdG9yeSBleHRyYSBmaWVsZCBoYXMgdHdvIHJlcXVpcmVkIGZpZWxkczoKKyAgICAjIDIgYnl0ZXMgaGVhZGVyIElEIGFuZCAyIGJ5dGVzIHNpemUgZmllbGQuIFRoZXMgdHdvIHJlcXVpcmUgZmllbGRzIGhhdmUKKyAgICAjIGEgdG90YWwgc2l6ZSBvZiA0IGJ5dGVzLiBUaGVuIGl0IGhhcyB0aHJlZSBvdGhlciA4IGJ5dGVzIGZpZWxkLCBmb2xsb3dlZAorICAgICMgYnkgYSA0IGJ5dGUgZGlzayBudW1iZXIgZmllbGQuIFRoZSBsYXN0IGRpc2sgbnVtYmVyIGZpZWxkIGlzIG5vdCByZXF1aXJlZAorICAgICMgdG8gYmUgcHJlc2VudCwgYnV0IGlmIGl0IGlzIHByZXNlbnQsIHRoZSB0b3RhbCBzaXplIG9mIGV4dHJhIGZpZWxkIHdpbGwgYmUKKyAgICAjIGRpdmlzaWJsZSBieSA4KGJlY2F1c2UgMisyKzQrOCpuIGlzIGFsd2F5cyBnb2luZyB0byBiZSBtdWx0aXBsZSBvZiA4KQorICAgICMgTW9zdCBleHRyYSBmaWVsZHMgYXJlIG9wdGlvbmFsLCBidXQgd2hlbiB0aGV5IGFwcGVhciwgdGhlaXIgbXVzdCBhcHBlYXIKKyAgICAjIGluIHRoZSBvcmRlciBkZWZpbmVkIGJ5IHppcDY0IHNwZWMuIFNpbmNlIGZpbGUgaGVhZGVyIG9mZnNldCBpcyB0aGUgMm5kCisgICAgIyB0byBsYXN0IGZpZWxkIGluIHppcDY0IHNwZWMsIGl0IHdpbGwgb25seSBiZSBhdCBsYXN0IDggYnl0ZXMgb3IgbGFzdCAxMi00CisgICAgIyBieXRlcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgZGlzayBudW1iZXIgaXMgcHJlc2VudC4KKyAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgIGlmIGVudHJ5LmhlYWRlcl9vZmZzZXQgPT0gMHhGRkZGRkZGRjoKKyAgICAgICAgaWYgbGVuKGVudHJ5LmV4dHJhKSAlIDggPT0gMDoKKyAgICAgICAgICBlbnRyeS5oZWFkZXJfb2Zmc2V0ID0gaW50LmZyb21fYnl0ZXMoZW50cnkuZXh0cmFbLTEyOi00XSwgImxpdHRsZSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgZW50cnkuaGVhZGVyX29mZnNldCA9IGludC5mcm9tX2J5dGVzKGVudHJ5LmV4dHJhWy04Ol0sICJsaXR0bGUiKQorICAgIGlmIHBhdHRlcm5zIGlzIG5vdCBOb25lOgorICAgICAgZmlsdGVyZWQgPSBbaW5mbyBmb3IgaW5mbyBpbiBlbnRyaWVzIGlmIGFueSgKKyAgICAgICAgICBbZm5tYXRjaC5mbm1hdGNoKGluZm8uZmlsZW5hbWUsIHApIGZvciBwIGluIHBhdHRlcm5zXSldCiAKLSAgUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQorICAgICAgIyBUaGVyZSBpc24ndCBhbnkgbWF0Y2hpbmcgZmlsZXMuIERvbid0IHVuemlwIGFueXRoaW5nLgorICAgICAgaWYgbm90IGZpbHRlcmVkOgorICAgICAgICByZXR1cm4KKyAgICAgIGZvciBpbmZvIGluIGZpbHRlcmVkOgorICAgICAgICBVbnppcFNpbmdsZUZpbGUoaW5wdXRfemlwLCBpbmZvLCBkaXJuYW1lKQorICAgIGVsc2U6CisgICAgICBmb3IgaW5mbyBpbiBlbnRyaWVzOgorICAgICAgICBVbnppcFNpbmdsZUZpbGUoaW5wdXRfemlwLCBpbmZvLCBkaXJuYW1lKQogCiAKIGRlZiBVbnppcFRlbXAoZmlsZW5hbWUsIHBhdHRlcm5zPU5vbmUpOgpAQCAtMjM2NSwxMSArMjQzNSwxMiBAQAogICAgICAgICAgICAgYXBrX25hbWUsIHByb2MucmV0dXJuY29kZSwgc3Rkb3V0ZGF0YSwgc3RkZXJyZGF0YSkpCiAKICAgZm9yIGxpbmUgaW4gc3Rkb3V0ZGF0YS5zcGxpdCgiXG4iKToKLSAgICAjIExvb2tpbmcgZm9yIGxpbmVzIHN1Y2ggYXMgc2RrVmVyc2lvbjonMjMnIG9yIHNka1ZlcnNpb246J00nLgotICAgIG0gPSByZS5tYXRjaChyJ3Nka1ZlcnNpb246XCcoW15cJ10qKVwnJywgbGluZSkKKyAgICAjIER1ZSB0byBhZy8yNDE2MTcwOCwgbG9va2luZyBmb3IgbGluZXMgc3VjaCBhcyBtaW5TZGtWZXJzaW9uOicyMycsbWluU2RrVmVyc2lvbjonTScKKyAgICAjIG9yIHNka1ZlcnNpb246JzIzJywgc2RrVmVyc2lvbjonTScuCisgICAgbSA9IHJlLm1hdGNoKHInKD86bWluU2RrVmVyc2lvbnxzZGtWZXJzaW9uKTpcJyhbXlwnXSopXCcnLCBsaW5lKQogICAgIGlmIG06CiAgICAgICByZXR1cm4gbS5ncm91cCgxKQotICByYWlzZSBFeHRlcm5hbEVycm9yKCJObyBtaW5TZGtWZXJzaW9uIHJldHVybmVkIGJ5IGFhcHQyIikKKyAgcmFpc2UgRXh0ZXJuYWxFcnJvcigiTm8gbWluU2RrVmVyc2lvbiByZXR1cm5lZCBieSBhYXB0MiBmb3IgYXBrOiB7fSIuZm9ybWF0KGFwa19uYW1lKSkKIAogCiBkZWYgR2V0TWluU2RrVmVyc2lvbkludChhcGtfbmFtZSwgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCk6CkBAIC0yNDY3LDM4ICsyNTM4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLnJldHVybmNvZGUsIHN0ZG91dGRhdGEpKQogCiAKLWRlZiBTaWduU2VQb2xpY3koc2Vwb2xpY3ksIGtleSwgcGFzc3dvcmQpOgotICAiIiJTaWduIHRoZSBzZXBvbGljeSB6aXAsIHByb2R1Y2luZyBhbiBmc3Zlcml0eSAuZnN2X3NpZyBhbmQKLSAgYW4gUlNBIC5zaWcgc2lnbmF0dXJlIGZpbGVzLgotICAiIiIKLQotICBpZiBPUFRJT05TLnNpZ25fc2Vwb2xpY3lfcGF0aCBpcyBOb25lOgotICAgIGxvZ2dlci5pbmZvKCJObyBzaWduX3NlcG9saWN5X3BhdGggc3BlY2lmaWVkLCAlcyB3YXMgbm90IHNpZ25lZCIsIHNlcG9saWN5KQotICAgIHJldHVybiBGYWxzZQotCi0gIGphdmFfbGlicmFyeV9wYXRoID0gb3MucGF0aC5qb2luKAotICAgICAgT1BUSU9OUy5zZWFyY2hfcGF0aCwgT1BUSU9OUy5zaWduYXBrX3NoYXJlZF9saWJyYXJ5X3BhdGgpCi0KLSAgY21kID0gKFtPUFRJT05TLmphdmFfcGF0aF0gKyBPUFRJT05TLmphdmFfYXJncyArCi0gICAgICAgICBbIi1EamF2YS5saWJyYXJ5LnBhdGg9IiArIGphdmFfbGlicmFyeV9wYXRoLAotICAgICAgICAgICItamFyIiwgb3MucGF0aC5qb2luKE9QVElPTlMuc2VhcmNoX3BhdGgsIE9QVElPTlMuc2lnbl9zZXBvbGljeV9wYXRoKV0gKwotICAgICAgICAgT1BUSU9OUy5leHRyYV9zaWduX3NlcG9saWN5X2FyZ3MpCi0KLSAgY21kLmV4dGVuZChba2V5ICsgT1BUSU9OUy5wdWJsaWNfa2V5X3N1ZmZpeCwKLSAgICAgICAgICAgICAga2V5ICsgT1BUSU9OUy5wcml2YXRlX2tleV9zdWZmaXgsCi0gICAgICAgICAgICAgIHNlcG9saWN5LCBvcy5wYXRoLmRpcm5hbWUoc2Vwb2xpY3kpXSkKLQotICBwcm9jID0gUnVuKGNtZCwgc3RkaW49c3VicHJvY2Vzcy5QSVBFKQotICBpZiBwYXNzd29yZCBpcyBub3QgTm9uZToKLSAgICBwYXNzd29yZCArPSAiXG4iCi0gIHN0ZG91dGRhdGEsIF8gPSBwcm9jLmNvbW11bmljYXRlKHBhc3N3b3JkKQotICBpZiBwcm9jLnJldHVybmNvZGUgIT0gMDoKLSAgICByYWlzZSBFeHRlcm5hbEVycm9yKAotICAgICAgICAiRmFpbGVkIHRvIHJ1biBzaWduIHNlcG9saWN5OiByZXR1cm4gY29kZSB7fTpcbnt9Ii5mb3JtYXQoCi0gICAgICAgICAgICBwcm9jLnJldHVybmNvZGUsIHN0ZG91dGRhdGEpKQotICByZXR1cm4gVHJ1ZQotCi0KIGRlZiBDaGVja1NpemUoZGF0YSwgdGFyZ2V0LCBpbmZvX2RpY3QpOgogICAiIiJDaGVja3MgdGhlIGRhdGEgc3RyaW5nIHBhc3NlZCBhZ2FpbnN0IHRoZSBtYXggc2l6ZSBsaW1pdC4KIApAQCAtMjUyNiw3ICsyNTY1LDkgQEAKICAgICBkZXZpY2UgPSBwLmRldmljZQogICAgIGlmICIvIiBpbiBkZXZpY2U6CiAgICAgICBkZXZpY2UgPSBkZXZpY2VbZGV2aWNlLnJmaW5kKCIvIikrMTpdCi0gICAgbGltaXQgPSBpbmZvX2RpY3QuZ2V0KGRldmljZSArICJfc2l6ZSIpCisgICAgbGltaXQgPSBpbmZvX2RpY3QuZ2V0KGRldmljZSArICJfc2l6ZSIsIDApCisgICAgaWYgaXNpbnN0YW5jZShsaW1pdCwgc3RyKToKKyAgICAgIGxpbWl0ID0gaW50KGxpbWl0LCAwKQogICBpZiBub3QgZnNfdHlwZSBvciBub3QgbGltaXQ6CiAgICAgcmV0dXJuCiAKQEAgLTI2NjMsMTkgKzI3MDQsMjUgQEAKIGRlZiBQYXJzZU9wdGlvbnMoYXJndiwKICAgICAgICAgICAgICAgICAgZG9jc3RyaW5nLAogICAgICAgICAgICAgICAgICBleHRyYV9vcHRzPSIiLCBleHRyYV9sb25nX29wdHM9KCksCi0gICAgICAgICAgICAgICAgIGV4dHJhX29wdGlvbl9oYW5kbGVyPU5vbmUpOgorICAgICAgICAgICAgICAgICBleHRyYV9vcHRpb25faGFuZGxlcjogSXRlcmFibGVbT3B0aW9uSGFuZGxlcl0gPSBOb25lKToKICAgIiIiUGFyc2UgdGhlIG9wdGlvbnMgaW4gYXJndiBhbmQgcmV0dXJuIGFueSBhcmd1bWVudHMgdGhhdCBhcmVuJ3QKICAgZmxhZ3MuICBkb2NzdHJpbmcgaXMgdGhlIGNhbGxpbmcgbW9kdWxlJ3MgZG9jc3RyaW5nLCB0byBiZSBkaXNwbGF5ZWQKICAgZm9yIGVycm9ycyBhbmQgLWguICBleHRyYV9vcHRzIGFuZCBleHRyYV9sb25nX29wdHMgYXJlIGZvciBmbGFncwogICBkZWZpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIGFyZSBwcm9jZXNzZWQgYnkgcGFzc2luZyB0aGVtIHRvCiAgIGV4dHJhX29wdGlvbl9oYW5kbGVyLiIiIgorICBleHRyYV9sb25nX29wdHMgPSBsaXN0KGV4dHJhX2xvbmdfb3B0cykKKyAgaWYgbm90IGlzaW5zdGFuY2UoZXh0cmFfb3B0aW9uX2hhbmRsZXIsIEl0ZXJhYmxlKToKKyAgICBleHRyYV9vcHRpb25faGFuZGxlciA9IFtleHRyYV9vcHRpb25faGFuZGxlcl0KKworICBmb3IgaGFuZGxlciBpbiBleHRyYV9vcHRpb25faGFuZGxlcjoKKyAgICBpZiBpc2luc3RhbmNlKGhhbmRsZXIsIE9wdGlvbkhhbmRsZXIpOgorICAgICAgZXh0cmFfbG9uZ19vcHRzLmV4dGVuZChoYW5kbGVyLmV4dHJhX2xvbmdfb3B0cykKIAogICB0cnk6CiAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoCiAgICAgICAgIGFyZ3YsICJodnA6czp4OiIgKyBleHRyYV9vcHRzLAogICAgICAgICBbImhlbHAiLCAidmVyYm9zZSIsICJwYXRoPSIsICJzaWduYXBrX3BhdGg9IiwKLSAgICAgICAgICJzaWduYXBrX3NoYXJlZF9saWJyYXJ5X3BhdGg9IiwgImV4dHJhX3NpZ25hcGtfYXJncz0iLAotICAgICAgICAgInNpZ25fc2Vwb2xpY3lfcGF0aD0iLCAiZXh0cmFfc2lnbl9zZXBvbGljeV9hcmdzPSIsICJhYXB0Ml9wYXRoPSIsCisgICAgICAgICAic2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoPSIsICJleHRyYV9zaWduYXBrX2FyZ3M9IiwgImFhcHQyX3BhdGg9IiwKICAgICAgICAgICJqYXZhX3BhdGg9IiwgImphdmFfYXJncz0iLCAiYW5kcm9pZF9qYXJfcGF0aD0iLCAicHVibGljX2tleV9zdWZmaXg9IiwKICAgICAgICAgICJwcml2YXRlX2tleV9zdWZmaXg9IiwgImJvb3Rfc2lnbmVyX3BhdGg9IiwgImJvb3Rfc2lnbmVyX2FyZ3M9IiwKICAgICAgICAgICJ2ZXJpdHlfc2lnbmVyX3BhdGg9IiwgInZlcml0eV9zaWduZXJfYXJncz0iLCAiZGV2aWNlX3NwZWNpZmljPSIsCkBAIC0yNjk5LDEwICsyNzQ2LDYgQEAKICAgICAgIE9QVElPTlMuc2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoID0gYQogICAgIGVsaWYgbyBpbiAoIi0tZXh0cmFfc2lnbmFwa19hcmdzIiwpOgogICAgICAgT1BUSU9OUy5leHRyYV9zaWduYXBrX2FyZ3MgPSBzaGxleC5zcGxpdChhKQotICAgIGVsaWYgbyBpbiAoIi0tc2lnbl9zZXBvbGljeV9wYXRoIiwpOgotICAgICAgT1BUSU9OUy5zaWduX3NlcG9saWN5X3BhdGggPSBhCi0gICAgZWxpZiBvIGluICgiLS1leHRyYV9zaWduX3NlcG9saWN5X2FyZ3MiLCk6Ci0gICAgICBPUFRJT05TLmV4dHJhX3NpZ25fc2Vwb2xpY3lfYXJncyA9IHNobGV4LnNwbGl0KGEpCiAgICAgZWxpZiBvIGluICgiLS1hYXB0Ml9wYXRoIiwpOgogICAgICAgT1BUSU9OUy5hYXB0Ml9wYXRoID0gYQogICAgIGVsaWYgbyBpbiAoIi0tamF2YV9wYXRoIiwpOgpAQCAtMjczNSw4ICsyNzc4LDIwIEBACiAgICAgZWxpZiBvIGluICgiLS1sb2dmaWxlIiwpOgogICAgICAgT1BUSU9OUy5sb2dmaWxlID0gYQogICAgIGVsc2U6Ci0gICAgICBpZiBleHRyYV9vcHRpb25faGFuZGxlciBpcyBOb25lIG9yIG5vdCBleHRyYV9vcHRpb25faGFuZGxlcihvLCBhKToKLSAgICAgICAgYXNzZXJ0IEZhbHNlLCAidW5rbm93biBvcHRpb24gXCIlc1wiIiAlIChvLCkKKyAgICAgIGlmIGV4dHJhX29wdGlvbl9oYW5kbGVyIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gb3B0aW9uIFwiJXNcIiIgJSAobywpKQorICAgICAgc3VjY2VzcyA9IEZhbHNlCisgICAgICBmb3IgaGFuZGxlciBpbiBleHRyYV9vcHRpb25faGFuZGxlcjoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShoYW5kbGVyLCBPcHRpb25IYW5kbGVyKToKKyAgICAgICAgICBpZiBoYW5kbGVyLmhhbmRsZXIobywgYSk6CisgICAgICAgICAgICBzdWNjZXNzID0gVHJ1ZQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxpZiBoYW5kbGVyKG8sIGEpOgorICAgICAgICAgIHN1Y2Nlc3MgPSBUcnVlCisgICAgICAgICAgYnJlYWsKKyAgICAgIGlmIG5vdCBzdWNjZXNzOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIG9wdGlvbiBcIiVzXCIiICUgKG8sKSkKKwogCiAgIGlmIE9QVElPTlMuc2VhcmNoX3BhdGg6CiAgICAgb3MuZW52aXJvblsiUEFUSCJdID0gKG9zLnBhdGguam9pbihPUFRJT05TLnNlYXJjaF9wYXRoLCAiYmluIikgKwpAQCAtMjc2Nyw2ICsyODIyLDggQEAKIAogZGVmIENsZWFudXAoKToKICAgZm9yIGkgaW4gT1BUSU9OUy50ZW1wZmlsZXM6CisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGkpOgorICAgICAgY29udGludWUKICAgICBpZiBvcy5wYXRoLmlzZGlyKGkpOgogICAgICAgc2h1dGlsLnJtdHJlZShpLCBpZ25vcmVfZXJyb3JzPVRydWUpCiAgICAgZWxzZToKQEAgLTI5NzAsNiArMzAyNywzNCBAQAogICB6aXBfZmlsZS53cml0ZXN0cih6aW5mbywgZGF0YSkKICAgemlwZmlsZS5aSVA2NF9MSU1JVCA9IHNhdmVkX3ppcDY0X2xpbWl0CiAKK2RlZiBaaXBFeGNsdWRlKGlucHV0X3ppcCwgb3V0cHV0X3ppcCwgZW50cmllcywgZm9yY2U9RmFsc2UpOgorICAiIiJEZWxldGVzIGVudHJpZXMgZnJvbSBhIFpJUCBmaWxlLgorCisgIEFyZ3M6CisgICAgemlwX2ZpbGVuYW1lOiBUaGUgbmFtZSBvZiB0aGUgWklQIGZpbGUuCisgICAgZW50cmllczogVGhlIG5hbWUgb2YgdGhlIGVudHJ5LCBvciB0aGUgbGlzdCBvZiBuYW1lcyB0byBiZSBkZWxldGVkLgorICAiIiIKKyAgaWYgaXNpbnN0YW5jZShlbnRyaWVzLCBzdHIpOgorICAgIGVudHJpZXMgPSBbZW50cmllc10KKyAgIyBJZiBsaXN0IGlzIGVtcHR5LCBub3RoaW5nIHRvIGRvCisgIGlmIG5vdCBlbnRyaWVzOgorICAgIHNodXRpbC5jb3B5KGlucHV0X3ppcCwgb3V0cHV0X3ppcCkKKyAgICByZXR1cm4KKworICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF96aXAsICdyJykgYXMgemluOgorICAgIGlmIG5vdCBmb3JjZSBhbmQgbGVuKHNldCh6aW4ubmFtZWxpc3QoKSkuaW50ZXJzZWN0aW9uKGVudHJpZXMpKSA9PSAwOgorICAgICAgcmFpc2UgRXh0ZXJuYWxFcnJvcigKKyAgICAgICAgICAiRmFpbGVkIHRvIGRlbGV0ZSB6aXAgZW50cmllcywgbmFtZSBub3QgbWF0Y2hlZDogJXMiICUgZW50cmllcykKKworICAgIGZkLCBuZXdfemlwZmlsZSA9IHRlbXBmaWxlLm1rc3RlbXAoZGlyPW9zLnBhdGguZGlybmFtZShpbnB1dF96aXApKQorICAgIG9zLmNsb3NlKGZkKQorICAgIGNtZCA9IFsiemlwMnppcCIsICItaSIsIGlucHV0X3ppcCwgIi1vIiwgbmV3X3ppcGZpbGVdCisgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICBjbWQuYXBwZW5kKCIteCIpCisgICAgICBjbWQuYXBwZW5kKGVudHJ5KQorICAgIFJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKKyAgb3MucmVwbGFjZShuZXdfemlwZmlsZSwgb3V0cHV0X3ppcCkKKwogCiBkZWYgWmlwRGVsZXRlKHppcF9maWxlbmFtZSwgZW50cmllcywgZm9yY2U9RmFsc2UpOgogICAiIiJEZWxldGVzIGVudHJpZXMgZnJvbSBhIFpJUCBmaWxlLgpAQCAtMjk4NCwyMCArMzA2OSw3IEBACiAgIGlmIG5vdCBlbnRyaWVzOgogICAgIHJldHVybgogCi0gIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgJ3InKSBhcyB6aW46Ci0gICAgaWYgbm90IGZvcmNlIGFuZCBsZW4oc2V0KHppbi5uYW1lbGlzdCgpKS5pbnRlcnNlY3Rpb24oZW50cmllcykpID09IDA6Ci0gICAgICByYWlzZSBFeHRlcm5hbEVycm9yKAotICAgICAgICAgICJGYWlsZWQgdG8gZGVsZXRlIHppcCBlbnRyaWVzLCBuYW1lIG5vdCBtYXRjaGVkOiAlcyIgJSBlbnRyaWVzKQotCi0gICAgZmQsIG5ld196aXBmaWxlID0gdGVtcGZpbGUubWtzdGVtcChkaXI9b3MucGF0aC5kaXJuYW1lKHppcF9maWxlbmFtZSkpCi0gICAgb3MuY2xvc2UoZmQpCi0gICAgY21kID0gWyJ6aXAyemlwIiwgIi1pIiwgemlwX2ZpbGVuYW1lLCAiLW8iLCBuZXdfemlwZmlsZV0KLSAgICBmb3IgZW50cnkgaW4gZW50cmllczoKLSAgICAgIGNtZC5hcHBlbmQoIi14IikKLSAgICAgIGNtZC5hcHBlbmQoZW50cnkpCi0gICAgUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQotCi0gIG9zLnJlcGxhY2UobmV3X3ppcGZpbGUsIHppcF9maWxlbmFtZSkKKyAgWmlwRXhjbHVkZSh6aXBfZmlsZW5hbWUsIHppcF9maWxlbmFtZSwgZW50cmllcywgZm9yY2UpCiAKIAogZGVmIFppcENsb3NlKHppcF9maWxlKToKQEAgLTM3MDMsMTQgKzM3NzUsMTEgQEAKICAgICBvdXRwdXRfc2luayhyZWNvdmVyeV9pbWdfcGF0aCwgcmVjb3ZlcnlfaW1nLmRhdGEpCiAKICAgZWxzZToKLSAgICBzeXN0ZW1fcm9vdF9pbWFnZSA9IGluZm9fZGljdC5nZXQoInN5c3RlbV9yb290X2ltYWdlIikgPT0gInRydWUiCiAgICAgaW5jbHVkZV9yZWNvdmVyeV9kdGJvID0gaW5mb19kaWN0LmdldCgiaW5jbHVkZV9yZWNvdmVyeV9kdGJvIikgPT0gInRydWUiCiAgICAgaW5jbHVkZV9yZWNvdmVyeV9hY3BpbyA9IGluZm9fZGljdC5nZXQoImluY2x1ZGVfcmVjb3ZlcnlfYWNwaW8iKSA9PSAidHJ1ZSIKICAgICBwYXRoID0gb3MucGF0aC5qb2luKGlucHV0X2RpciwgcmVjb3ZlcnlfcmVzb3VyY2VfZGF0X3BhdGgpCi0gICAgIyBXaXRoIHN5c3RlbS1yb290LWltYWdlLCBib290IGFuZCByZWNvdmVyeSBpbWFnZXMgd2lsbCBoYXZlIG1pc21hdGNoaW5nCi0gICAgIyBlbnRyaWVzIChvbmx5IHJlY292ZXJ5IGhhcyB0aGUgcmFtZGlzayBlbnRyeSkgKEJ1ZzogNzI3MzE1MDYpLiBVc2UgYnNkaWZmCi0gICAgIyB0byBoYW5kbGUgc3VjaCBhIGNhc2UuCi0gICAgaWYgc3lzdGVtX3Jvb3RfaW1hZ2Ugb3IgaW5jbHVkZV9yZWNvdmVyeV9kdGJvIG9yIGluY2x1ZGVfcmVjb3ZlcnlfYWNwaW86CisgICAgIyBVc2UgYnNkaWZmIHRvIGhhbmRsZSBtaXNtYXRjaGluZyBlbnRyaWVzIChCdWc6IDcyNzMxNTA2KQorICAgIGlmIGluY2x1ZGVfcmVjb3ZlcnlfZHRibyBvciBpbmNsdWRlX3JlY292ZXJ5X2FjcGlvOgogICAgICAgZGlmZl9wcm9ncmFtID0gWyJic2RpZmYiXQogICAgICAgYm9udXNfYXJncyA9ICIiCiAgICAgICBhc3NlcnQgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpCkBAIC00MDEzLDcgKzQwODIsNyBAQAogICBHZXQgYnVpbGQucHJvcCBmcm9tIHJhbWRpc2sgd2l0aGluIHRoZSBib290IGltYWdlCiAKICAgQXJnczoKLSAgICBib290X2ltZzogdGhlIGJvb3QgaW1hZ2UgZmlsZS4gUmFtZGlzayBtdXN0IGJlIGNvbXByZXNzZWQgd2l0aCBsejQgb3IgbWluaWd6aXAgZm9ybWF0LgorICAgIGJvb3RfaW1nOiB0aGUgYm9vdCBpbWFnZSBmaWxlLiBSYW1kaXNrIG11c3QgYmUgY29tcHJlc3NlZCB3aXRoIGx6NCBvciBnemlwIGZvcm1hdC4KIAogICBSZXR1cm46CiAgICAgQW4gZXh0cmFjdGVkIGZpbGUgdGhhdCBzdG9yZXMgcHJvcGVydGllcyBpbiB0aGUgYm9vdCBpbWFnZS4KQEAgLTQwMzIsMTEgKzQxMDEsMTEgQEAKICAgICBlbGlmIHJhbWRpc2tfZm9ybWF0ID09IFJhbWRpc2tGb3JtYXQuR1o6CiAgICAgICB3aXRoIG9wZW4ocmFtZGlzaywgJ3JiJykgYXMgaW5wdXRfc3RyZWFtOgogICAgICAgICB3aXRoIG9wZW4odW5jb21wcmVzc2VkX3JhbWRpc2ssICd3YicpIGFzIG91dHB1dF9zdHJlYW06Ci0gICAgICAgICAgcDIgPSBSdW4oWydtaW5pZ3ppcCcsICctZCddLCBzdGRpbj1pbnB1dF9zdHJlYW0uZmlsZW5vKCksCisgICAgICAgICAgcDIgPSBSdW4oWydnemlwJywgJy1kJ10sIHN0ZGluPWlucHV0X3N0cmVhbS5maWxlbm8oKSwKICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9b3V0cHV0X3N0cmVhbS5maWxlbm8oKSkKICAgICAgICAgICBwMi53YWl0KCkKICAgICBlbHNlOgotICAgICAgbG9nZ2VyLmVycm9yKCdPbmx5IHN1cHBvcnQgbHo0IG9yIG1pbmlnemlwIHJhbWRpc2sgZm9ybWF0LicpCisgICAgICBsb2dnZXIuZXJyb3IoJ09ubHkgc3VwcG9ydCBsejQgb3IgZ3ppcCByYW1kaXNrIGZvcm1hdC4nKQogICAgICAgcmV0dXJuIE5vbmUKIAogICAgIGFic191bmNvbXByZXNzZWRfcmFtZGlzayA9IG9zLnBhdGguYWJzcGF0aCh1bmNvbXByZXNzZWRfcmFtZGlzaykKQEAgLTQxMDIsNiArNDE3MSwxNyBAQAogICAgIHJldHVybiBmcC5yZWFkKDQpID09IGInXHgzQVx4RkZceDI2XHhFRCcKIAogCitkZWYgVW5zcGFyc2VJbWFnZShmaWxlcGF0aCwgdGFyZ2V0X3BhdGg9Tm9uZSk6CisgIGlmIG5vdCBJc1NwYXJzZUltYWdlKGZpbGVwYXRoKToKKyAgICByZXR1cm4KKyAgaWYgdGFyZ2V0X3BhdGggaXMgTm9uZToKKyAgICB0bXBfaW1nID0gTWFrZVRlbXBGaWxlKHN1ZmZpeD0iLmltZyIpCisgICAgUnVuQW5kQ2hlY2tPdXRwdXQoWyJzaW1nMmltZyIsIGZpbGVwYXRoLCB0bXBfaW1nXSkKKyAgICBvcy5yZW5hbWUodG1wX2ltZywgZmlsZXBhdGgpCisgIGVsc2U6CisgICAgUnVuQW5kQ2hlY2tPdXRwdXQoWyJzaW1nMmltZyIsIGZpbGVwYXRoLCB0YXJnZXRfcGF0aF0pCisKKwogZGVmIFBhcnNlVXBkYXRlRW5naW5lQ29uZmlnKHBhdGg6IHN0cik6CiAgICIiIlBhcnNlIHRoZSB1cGRhdGVfZW5naW5lIGNvbmZpZyBzdG9yZWQgaW4gZmlsZSBgcGF0aGAKICAgQXJncwpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NyZWF0ZV9icmlja19vdGEucHkgYi90b29scy9yZWxlYXNldG9vbHMvY3JlYXRlX2JyaWNrX290YS5weQppbmRleCA0NGYwYTk1Li5iZjUwZjcxIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvY3JlYXRlX2JyaWNrX290YS5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvY3JlYXRlX2JyaWNrX290YS5weQpAQCAtNDUsMTMgKzQ1LDE3IEBACiAgIHBhcnRpdGlvbnNfdG9fd2lwZSA9IFBBUlRJVElPTlNfVE9fV0lQRQogICBpZiBleHRyYV93aXBlX3BhcnRpdGlvbnMgaXMgbm90IE5vbmU6CiAgICAgcGFydGl0aW9uc190b193aXBlID0gUEFSVElUSU9OU19UT19XSVBFICsgZXh0cmFfd2lwZV9wYXJ0aXRpb25zLnNwbGl0KCIsIikKKyAgb3RhX21ldGFkYXRhID0gWyJvdGEtdHlwZT1CUklDSyIsICJwb3N0LXRpbWVzdGFtcD05OTk5OTk5OTk5IiwKKyAgICAgICAgICAgICAgICAgICJwcmUtZGV2aWNlPSIgKyBwcm9kdWN0X25hbWVdCisgIGlmIHNlcmlhbG5vIGlzIG5vdCBOb25lOgorICAgICAgb3RhX21ldGFkYXRhLmFwcGVuZCgic2VyaWFsbm89IiArIHNlcmlhbG5vKQogICAjIHJlY292ZXJ5IHJlcXVpZXJzIHByb2R1Y3QgbmFtZSB0byBiZSBhIHwgc2VwYXJhdGVkIGxpc3QKICAgcHJvZHVjdF9uYW1lID0gcHJvZHVjdF9uYW1lLnJlcGxhY2UoIiwiLCAifCIpCiAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9wYXRoLCAidyIpIGFzIHpmcDoKICAgICB6ZnAud3JpdGVzdHIoInJlY292ZXJ5LndpcGUiLCAiXG4iLmpvaW4ocGFydGl0aW9uc190b193aXBlKSkKICAgICB6ZnAud3JpdGVzdHIoInBheWxvYWQuYmluIiwgIiIpCiAgICAgemZwLndyaXRlc3RyKCJNRVRBLUlORi9jb20vYW5kcm9pZC9tZXRhZGF0YSIsICJcbiIuam9pbigKLSAgICAgICAgWyJvdGEtdHlwZT1CUklDSyIsICJwb3N0LXRpbWVzdGFtcD05OTk5OTk5OTk5IiwgInByZS1kZXZpY2U9IiArIHByb2R1Y3RfbmFtZSwgInNlcmlhbG5vPSIgKyBzZXJpYWxub10pKQorICAgICAgICBvdGFfbWV0YWRhdGEpKQogCiAKIGRlZiBtYWluKGFyZ3YpOgpAQCAtNTksOSArNjMsOSBAQAogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdvdGFmaWxlJywgbWV0YXZhcj0nUEFZTE9BRCcsIHR5cGU9c3RyLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBvdXRwdXQgT1RBIHBhY2thZ2UgZmlsZS4nKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByb2R1Y3QnLCB0eXBlPXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgcHJvZHVjdCBuYW1lIG9mIHRoZSBkZXZpY2UsIGZvciBleGFtcGxlLCBicmFtYmxlLCByZWRmaW4uIFRoaXMgY2FuIGJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QuJywgcmVxdWlyZWQ9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgcHJvZHVjdCBuYW1lIG9mIHRoZSBkZXZpY2UsIGZvciBleGFtcGxlLCBicmFtYmxlLCByZWRmaW4uJywgcmVxdWlyZWQ9VHJ1ZSkKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zZXJpYWxubycsIHR5cGU9c3RyLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBzZXJpYWwgbnVtYmVyIG9mIGRldmljZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBpbnN0YWxsIHRoaXMgT1RBIHBhY2thZ2UuIFRoaXMgY2FuIGJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QuJykKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgc2VyaWFsIG51bWJlciBvZiBkZXZpY2VzIHRoYXQgYXJlIGFsbG93ZWQgdG8gaW5zdGFsbCB0aGlzIE9UQSBwYWNrYWdlLiBUaGlzIGNhbiBiZSBhIHwgc2VwYXJhdGVkIGxpc3QuJykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1leHRyYV93aXBlX3BhcnRpdGlvbnMnLCB0eXBlPXN0ciwKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdBZGRpdGlvbmFsIHBhcnRpdGlvbnMgb24gZGV2aWNlIHdoaWNoIHNob3VsZCBiZSB3aXBlZC4nKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvaW1nX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2ltZ19mcm9tX3RhcmdldF9maWxlcy5weQppbmRleCBmOGJkZDgxLi5iN2E1YWQ4IDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvaW1nX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9pbWdfZnJvbV90YXJnZXRfZmlsZXMucHkKQEAgLTY0LDYgKzY0LDggQEAKIE9QVElPTlMucmV0cm9maXRfZGFwID0gTm9uZQogT1BUSU9OUy5idWlsZF9zdXBlciA9IE5vbmUKIE9QVElPTlMuc3BhcnNlX3VzZXJpbWFnZXMgPSBOb25lCitPUFRJT05TLnVzZV9mYXN0Ym9vdF9pbmZvID0gVHJ1ZQorT1BUSU9OUy5idWlsZF9zdXBlcl9pbWFnZSA9IE5vbmUKIAogCiBkZWYgTG9hZE9wdGlvbnMoaW5wdXRfZmlsZSk6CkBAIC0xMDQsNiArMTA2LDEzIEBACiAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChjbWQpCiAKIAorZGVmIExvY2F0ZVBhcnRpdGlvbkVudHJ5KHBhcnRpdGlvbl9uYW1lLCBuYW1lbGlzdCk6CisgIGZvciBzdWJkaXIgaW4gWyJJTUFHRVMiLCAiUFJFQlVJTFRfSU1BR0VTIiwgIlJBRElPIl06CisgICAgZW50cnlfbmFtZSA9IG9zLnBhdGguam9pbihzdWJkaXIsIHBhcnRpdGlvbl9uYW1lICsgIi5pbWciKQorICAgIGlmIGVudHJ5X25hbWUgaW4gbmFtZWxpc3Q6CisgICAgICByZXR1cm4gZW50cnlfbmFtZQorCisKIGRlZiBFbnRyaWVzRm9yVXNlckltYWdlcyhpbnB1dF9maWxlKToKICAgIiIiUmV0dXJucyB0aGUgdXNlciBpbWFnZXMgZW50cmllcyB0byBiZSBjb3BpZWQuCiAKQEAgLTExOSwxMiArMTI4LDIzIEBACiAgIGVudHJpZXMgPSBbCiAgICAgICAnT1RBL2FuZHJvaWQtaW5mby50eHQ6YW5kcm9pZC1pbmZvLnR4dCcsCiAgIF0KKyAgaWYgT1BUSU9OUy51c2VfZmFzdGJvb3RfaW5mbzoKKyAgICBlbnRyaWVzLmFwcGVuZCgnTUVUQS9mYXN0Ym9vdC1pbmZvLnR4dDpmYXN0Ym9vdC1pbmZvLnR4dCcpCisgIGFiX3BhcnRpdGlvbnMgPSBbXQogICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlKSBhcyBpbnB1dF96aXA6CiAgICAgbmFtZWxpc3QgPSBpbnB1dF96aXAubmFtZWxpc3QoKQorICAgIGlmICJNRVRBL2FiX3BhcnRpdGlvbnMudHh0IiBpbiBuYW1lbGlzdDoKKyAgICAgIGFiX3BhcnRpdGlvbnMgPSBpbnB1dF96aXAucmVhZCgKKyAgICAgICAgICAiTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCIpLmRlY29kZSgpLnN0cmlwKCkuc3BsaXQoKQorICBpZiAnUFJFQlVJTFRfSU1BR0VTL2tlcm5lbF8xNmsnIGluIG5hbWVsaXN0OgorICAgIGVudHJpZXMuYXBwZW5kKCdQUkVCVUlMVF9JTUFHRVMva2VybmVsXzE2azprZXJuZWxfMTZrJykKKyAgaWYgJ1BSRUJVSUxUX0lNQUdFUy9yYW1kaXNrXzE2ay5pbWcnIGluIG5hbWVsaXN0OgorICAgIGVudHJpZXMuYXBwZW5kKCdQUkVCVUlMVF9JTUFHRVMvcmFtZGlza18xNmsuaW1nOnJhbWRpc2tfMTZrLmltZycpCiAKKyAgdmlzaXRlZF9wYXJ0aXRpb25zID0gc2V0KE9QVElPTlMuZHluYW1pY19wYXJ0aXRpb25fbGlzdCkKICAgZm9yIGltYWdlX3BhdGggaW4gW25hbWUgZm9yIG5hbWUgaW4gbmFtZWxpc3QgaWYgbmFtZS5zdGFydHN3aXRoKCdJTUFHRVMvJyldOgogICAgIGltYWdlID0gb3MucGF0aC5iYXNlbmFtZShpbWFnZV9wYXRoKQotICAgIGlmIE9QVElPTlMuYm9vdGFibGVfb25seSBhbmQgaW1hZ2Ugbm90IGluKCdib290LmltZycsICdyZWNvdmVyeS5pbWcnLCAnYm9vdGxvYWRlcicsICdpbml0X2Jvb3QuaW1nJyk6CisgICAgaWYgT1BUSU9OUy5ib290YWJsZV9vbmx5IGFuZCBpbWFnZSBub3QgaW4gKCdib290LmltZycsICdyZWNvdmVyeS5pbWcnLCAnYm9vdGxvYWRlcicsICdpbml0X2Jvb3QuaW1nJyk6CiAgICAgICBjb250aW51ZQogICAgIGlmIG5vdCBpbWFnZS5lbmRzd2l0aCgnLmltZycpIGFuZCBpbWFnZSAhPSAnYm9vdGxvYWRlcic6CiAgICAgICBjb250aW51ZQpAQCAtMTM2LDcgKzE1NiwxNCBAQAogICAgICAgICBjb250aW51ZQogICAgICAgaWYgaW1hZ2UgaW4gZHluYW1pY19pbWFnZXM6CiAgICAgICAgIGNvbnRpbnVlCisgICAgcGFydGl0aW9uX25hbWUgPSBpbWFnZS5yc3RyaXAoIi5pbWciKQorICAgIHZpc2l0ZWRfcGFydGl0aW9ucy5hZGQocGFydGl0aW9uX25hbWUpCiAgICAgZW50cmllcy5hcHBlbmQoJ3t9Ont9Jy5mb3JtYXQoaW1hZ2VfcGF0aCwgaW1hZ2UpKQorICBmb3IgcGFydCBpbiBbcGFydCBmb3IgcGFydCBpbiBhYl9wYXJ0aXRpb25zIGlmIHBhcnQgbm90IGluIHZpc2l0ZWRfcGFydGl0aW9uc106CisgICAgZW50cnkgPSBMb2NhdGVQYXJ0aXRpb25FbnRyeShwYXJ0LCBuYW1lbGlzdCkKKyAgICBpbWFnZSA9IG9zLnBhdGguYmFzZW5hbWUoZW50cnkpCisgICAgaWYgZW50cnkgaXMgbm90IE5vbmU6CisgICAgICBlbnRyaWVzLmFwcGVuZCgne306e30nLmZvcm1hdChlbnRyeSwgaW1hZ2UpKQogICByZXR1cm4gZW50cmllcwogCiAKQEAgLTE2OCwxMiArMTk1LDE4IEBACiAgIGlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoaW5wdXRfZmlsZSkKIAogICBzdXBlcl9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZSgnc3VwZXJfJywgJy5pbWcnKQotICBCdWlsZFN1cGVySW1hZ2UoaW5wdXRfdG1wLCBzdXBlcl9maWxlKQorCisgICMgQWxsb3cgb3ZlcnJpZGluZyB0aGUgQlVJTERfU1VQRVJfSU1BR0UgYmluYXJ5CisgIGlmIE9QVElPTlMuYnVpbGRfc3VwZXJfaW1hZ2U6CisgICAgY29tbWFuZCA9IFtPUFRJT05TLmJ1aWxkX3N1cGVyX2ltYWdlLCBpbnB1dF90bXAsIHN1cGVyX2ZpbGVdCisgICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNvbW1hbmQpCisgIGVsc2U6CisgICAgQnVpbGRTdXBlckltYWdlKGlucHV0X3RtcCwgc3VwZXJfZmlsZSkKIAogICBsb2dnZXIuaW5mbygnV3JpdGluZyBzdXBlci5pbWcgdG8gYXJjaGl2ZS4uLicpCiAgIHdpdGggemlwZmlsZS5aaXBGaWxlKAotICAgICAgb3V0cHV0X2ZpbGUsICdhJywgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQsCi0gICAgICBhbGxvd1ppcDY0PVRydWUpIGFzIG91dHB1dF96aXA6CisgICAgICAgICAgb3V0cHV0X2ZpbGUsICdhJywgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQsCisgICAgICAgICAgYWxsb3daaXA2ND1UcnVlKSBhcyBvdXRwdXRfemlwOgogICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBzdXBlcl9maWxlLCAnc3VwZXIuaW1nJykKIAogCkBAIC0yMjUsNiArMjU4LDggQEAKICAgICAgIE9QVElPTlMuYm9vdGFibGVfb25seSA9IFRydWUKICAgICBlbGlmIG8gPT0gJy0tYWRkaXRpb25hbCc6CiAgICAgICBPUFRJT05TLmFkZGl0aW9uYWxfZW50cmllcy5hcHBlbmQoYSkKKyAgICBlbGlmIG8gPT0gJy0tYnVpbGRfc3VwZXJfaW1hZ2UnOgorICAgICAgT1BUSU9OUy5idWlsZF9zdXBlcl9pbWFnZSA9IGEKICAgICBlbHNlOgogICAgICAgcmV0dXJuIEZhbHNlCiAgICAgcmV0dXJuIFRydWUKQEAgLTIzNCw2ICsyNjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9sb25nX29wdHM9WwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGl0aW9uYWw9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib290YWJsZV96aXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkX3N1cGVyX2ltYWdlPScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX29wdGlvbl9oYW5kbGVyPW9wdGlvbl9oYW5kbGVyKQogICBpZiBsZW4oYXJncykgIT0gMjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9BbmRyb2lkLmJwIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL0FuZHJvaWQuYnAKaW5kZXggMjE5YWNmOC4uOTZlYzczZSAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL0FuZHJvaWQuYnAKQEAgLTUwLDYgKzUwLDcgQEAKICAgICAgICAgInJlbGVhc2V0b29sc19vdGFfZnJvbV90YXJnZXRfZmlsZXMiLAogICAgIF0sCiAgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgImFwZXhkX2hvc3QiLAogICAgICAgICAiY2hlY2t2aW50ZiIsCiAgICAgICAgICJob3N0X2luaXRfdmVyaWZpZXIiLAogICAgICAgICAic2VjaWxjIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV9idWlsZHMucHkgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfYnVpbGRzLnB5CmluZGV4IDNhYzRlYzQuLjAzMjI3OGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV9idWlsZHMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX2J1aWxkcy5weQpAQCAtNDcsNiArNDcsMTAgQEAKICAgICAgIFRoZSBvcHRpb25hbCBwYXRoIHRvIGEgbmV3bGluZS1zZXBhcmF0ZWQgY29uZmlnIGZpbGUgY29udGFpbmluZyBrZXlzIHRvCiAgICAgICBvYnRhaW4gZnJvbSB0aGUgZnJhbWV3b3JrIGluc3RhbmNlIG9mIG1pc2NfaW5mby50eHQsIHVzZWQgZm9yIGNyZWF0aW5nCiAgICAgICB2Ym1ldGEuaW1nLiBUaGUgcmVtYWluaW5nIGtleXMgY29tZSBmcm9tIHRoZSB2ZW5kb3IgaW5zdGFuY2UuCisKKyAgLS1hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdAorICAgICAgSWYgcHJvdmlkZWQsIHJlc29sdmUgdGhlIGNvbmZsaWN0IEFWQiByb2xsYmFjayBpbmRleCBsb2NhdGlvbiB3aGVuCisgICAgICBuZWNlc3NhcnkuCiAiIiIKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KIApAQCAtNjUsNiArNjksNyBAQAogT1BUSU9OUy5wcm9kdWN0X291dF92ZW5kb3IgPSBOb25lCiBPUFRJT05TLmJ1aWxkX3ZibWV0YSA9IEZhbHNlCiBPUFRJT05TLmZyYW1ld29ya19taXNjX2luZm9fa2V5cyA9IE5vbmUKK09QVElPTlMuYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QgPSBGYWxzZQogCiAKIGRlZiBDcmVhdGVJbWFnZVN5bWxpbmtzKCk6CkBAIC0xNDAsNyArMTQ1LDggQEAKICAgb3V0cHV0X3ZibWV0YV9wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMucHJvZHVjdF9vdXRfdmVuZG9yLCAidmJtZXRhLmltZyIpCiAgIE9QVElPTlMuaW5mb19kaWN0ID0gbWVyZ2VkX2RpY3QKICAgY29tbW9uLkJ1aWxkVkJNZXRhKG91dHB1dF92Ym1ldGFfcGF0aCwgcGFydGl0aW9ucywgInZibWV0YSIsCi0gICAgICAgICAgICAgICAgICAgICB2Ym1ldGFfcGFydGl0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgIHZibWV0YV9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdCkKIAogCiBkZWYgTWVyZ2VCdWlsZHMoKToKQEAgLTE2NCw2ICsxNzAsOCBAQAogICAgICAgT1BUSU9OUy5idWlsZF92Ym1ldGEgPSBUcnVlCiAgICAgZWxpZiBvID09ICItLWZyYW1ld29ya19taXNjX2luZm9fa2V5cyI6CiAgICAgICBPUFRJT05TLmZyYW1ld29ya19taXNjX2luZm9fa2V5cyA9IGEKKyAgICBlbGlmIG8gPT0gIi0tYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QiOgorICAgICAgT1BUSU9OUy5hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdCA9IFRydWUKICAgICBlbHNlOgogICAgICAgcmV0dXJuIEZhbHNlCiAgICAgcmV0dXJuIFRydWUKQEAgLTE3Nyw2ICsxODUsNyBAQAogICAgICAgICAgICJwcm9kdWN0X291dF92ZW5kb3I9IiwKICAgICAgICAgICAiYnVpbGRfdmJtZXRhIiwKICAgICAgICAgICAiZnJhbWV3b3JrX21pc2NfaW5mb19rZXlzPSIsCisgICAgICAgICAgImF2Yl9yZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0IgogICAgICAgXSwKICAgICAgIGV4dHJhX29wdGlvbl9oYW5kbGVyPW9wdGlvbl9oYW5kbGVyKQogCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfY29tcGF0aWJpbGl0eV9jaGVja3MucHkgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfY29tcGF0aWJpbGl0eV9jaGVja3MucHkKaW5kZXggMjA3YWJlMi4uOGM5OTkzZiAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX2NvbXBhdGliaWxpdHlfY2hlY2tzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV9jb21wYXRpYmlsaXR5X2NoZWNrcy5weQpAQCAtMTkwLDggKzE5MCw4IEBACiAgIGFwZXhfcGFja2FnZXMgPSBzZXQoKQogICBmb3IgcGFydGl0aW9uIGluIHBhcnRpdGlvbl9tYXAua2V5cygpOgogICAgIHRyeToKLSAgICAgIGFwZXhfaW5mbyA9IGFwZXhfdXRpbHMuR2V0QXBleEluZm9Gcm9tVGFyZ2V0RmlsZXMoCi0gICAgICAgICAgdGFyZ2V0X2ZpbGVzX2RpciwgcGFydGl0aW9uLCBjb21wcmVzc2VkX29ubHk9RmFsc2UpCisgICAgICBhcGV4X2luZm8gPSBhcGV4X3V0aWxzLkdldEFwZXhJbmZvRm9yUGFydGl0aW9uKAorICAgICAgICAgIHRhcmdldF9maWxlc19kaXIsIHBhcnRpdGlvbikKICAgICBleGNlcHQgUnVudGltZUVycm9yIGFzIGVycjoKICAgICAgIGVycm9ycy5hcHBlbmQoc3RyKGVycikpCiAgICAgICBhcGV4X2luZm8gPSBbXQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX2RleG9wdC5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV9kZXhvcHQucHkKaW5kZXggMTYxODJiNS4uMWMwYzc0MyAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX2RleG9wdC5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfZGV4b3B0LnB5CkBAIC03Miw3ICs3Miw2IEBACiAgICMgICAgICAgICA8Y29udGVudHMgb2YgdmVuZG9yIGRleHByZW9wdF9jb25maWcuemlwPgogICAjICAgICBzeXN0ZW0gLT4gb3V0cHV0L1NZU1RFTQogICAjICAgICB2ZW5kb3IgLT4gb3V0cHV0L1ZFTkRPUgotICAjICAgICBhcGV4IC0+IG91dHB1dC9TWVNURU0vYXBleCAob25seSBmb3IgZmxhdHRlbmVkIEFQRVggYnVpbGRzKQogICAjICAgICBhcGV4LyAoZXh0cmFjdGVkIHVwZGF0YWJsZSBBUEVYKQogICAjICAgICAgICAgPGFwZXggMT4vCiAgICMgICAgICAgICAgICAgLi4uCkBAIC0xMTQsNzAgKzExMywyMCBAQAogICAgICAgb3MucGF0aC5qb2luKG91dHB1dF90YXJnZXRfZmlsZXNfZGlyLCAnVkVORE9SJyksCiAgICAgICBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICd2ZW5kb3InKSkKIAotICAjIFRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBmbGF0dGVkZWQgQVBFWGVzIGlzOgotICAjCi0gICMgU1lTVEVNCi0gICMgICAgIGFwZXgKLSAgIyAgICAgICAgIDxBUEVYIG5hbWUsIGUuZy4sIGNvbS5hbmRyb2lkLndpZmk+Ci0gICMgICAgICAgICAgICAgYXBleF9tYW5pZmVzdC5wYgotICAjICAgICAgICAgICAgIGFwZXhfcHVia2V5Ci0gICMgICAgICAgICAgICAgZXRjLwotICAjICAgICAgICAgICAgIGphdmFsaWIvCi0gICMgICAgICAgICAgICAgbGliLwotICAjICAgICAgICAgICAgIGxpYjY0LwotICAjICAgICAgICAgICAgIHByaXYtYXBwLwotICAjCi0gICMgVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIHVwZGF0YWJsZSBBUEVYZXMgaXM6Ci0gICMKLSAgIyBTWVNURU0KLSAgIyAgICAgYXBleAotICAjICAgICAgICAgY29tLmFuZHJvaWQuYWRiZC5hcGV4Ci0gICMgICAgICAgICBjb20uYW5kcm9pZC5hcHBzZWFyY2guYXBleAotICAjICAgICAgICAgY29tLmFuZHJvaWQuYXJ0LmFwZXgKLSAgIyAgICAgICAgIC4uLgotICBhcGV4X3Jvb3QgPSBvcy5wYXRoLmpvaW4ob3V0cHV0X3RhcmdldF9maWxlc19kaXIsICdTWVNURU0nLCAnYXBleCcpCisgICMgRXh0cmFjdCBBUEVYLgorICBsb2dnaW5nLmluZm8oJ2V4dHJhY3RpbmcgQVBFWCcpCisgIGFwZXhfZXh0cmFjdF9yb290X2RpciA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgJ2FwZXgnKQorICBvcy5tYWtlZGlycyhhcGV4X2V4dHJhY3Rfcm9vdF9kaXIpCiAKLSAgIyBDaGVjayBmb3IgZmxhdHRlbmRlZCB2ZXJzdXMgdXBkYXRhYmxlIEFQRVguCi0gIGlmIE9QVElPTlMuZnJhbWV3b3JrX21pc2NfaW5mby5nZXQoJ3RhcmdldF9mbGF0dGVuX2FwZXgnKSA9PSAnZmFsc2UnOgotICAgICMgRXh0cmFjdCBBUEVYLgotICAgIGxvZ2dpbmcuaW5mbygnZXh0cmFjdGluZyBBUEVYJykKLQotICAgIGFwZXhfZXh0cmFjdF9yb290X2RpciA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgJ2FwZXgnKQotICAgIG9zLm1ha2VkaXJzKGFwZXhfZXh0cmFjdF9yb290X2RpcikKLQotICAgIGZvciBhcGV4IGluIChnbG9iLmdsb2Iob3MucGF0aC5qb2luKGFwZXhfcm9vdCwgJyouYXBleCcpKSArCi0gICAgICAgICAgICAgICAgIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oYXBleF9yb290LCAnKi5jYXBleCcpKSk6Ci0gICAgICBsb2dnaW5nLmluZm8oJyAgYXBleDogJXMnLCBhcGV4KQotICAgICAgIyBkZWFwZXhlciBpcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIG1lcmdlX3RhcmdldF9maWxlcyBiaW5hcnkgZXh0cmFjdGVkCi0gICAgICAjIGZyb20gb3RhdG9vbHMuemlwLgotICAgICAgYXBleF9qc29uX2luZm8gPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbJ2RlYXBleGVyJywgJ2luZm8nLCBhcGV4XSkKLSAgICAgIGxvZ2dpbmcuaW5mbygnICAgIGluZm86ICVzJywgYXBleF9qc29uX2luZm8pCi0gICAgICBhcGV4X2luZm8gPSBqc29uLmxvYWRzKGFwZXhfanNvbl9pbmZvKQotICAgICAgYXBleF9uYW1lID0gYXBleF9pbmZvWyduYW1lJ10KLSAgICAgIGxvZ2dpbmcuaW5mbygnICAgIG5hbWU6ICVzJywgYXBleF9uYW1lKQotCi0gICAgICBhcGV4X2V4dHJhY3RfZGlyID0gb3MucGF0aC5qb2luKGFwZXhfZXh0cmFjdF9yb290X2RpciwgYXBleF9uYW1lKQotICAgICAgb3MubWFrZWRpcnMoYXBleF9leHRyYWN0X2RpcikKLQotICAgICAgIyBkZWFwZXhlciB1c2VzIGRlYnVnZnNfc3RhdGljLCB3aGljaCBpcyBwYXJ0IG9mIG90YXRvb2xzLnppcC4KLSAgICAgIGNvbW1hbmQgPSBbCi0gICAgICAgICAgJ2RlYXBleGVyJywKLSAgICAgICAgICAnLS1kZWJ1Z2ZzX3BhdGgnLAotICAgICAgICAgICdkZWJ1Z2ZzX3N0YXRpYycsCi0gICAgICAgICAgJy0tYmxraWRfcGF0aCcsCi0gICAgICAgICAgJ2Jsa2lkJywKLSAgICAgICAgICAnLS1mc2NrZXJvZnNfcGF0aCcsCi0gICAgICAgICAgJ2ZzY2suZXJvZnMnLAotICAgICAgICAgICdleHRyYWN0JywKLSAgICAgICAgICBhcGV4LAotICAgICAgICAgIGFwZXhfZXh0cmFjdF9kaXIsCi0gICAgICBdCi0gICAgICBsb2dnaW5nLmluZm8oJyAgICBydW5uaW5nICVzJywgY29tbWFuZCkKLSAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChjb21tYW5kKQotICBlbHNlOgotICAgICMgRmxhdHRlbmVkIEFQRVhlcyBkb24ndCBuZWVkIHRvIGJlIGV4dHJhY3RlZCBzaW5jZSB0aGV5IGhhdmUgdGhlIG5lY2Vzc2FyeQotICAgICMgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLSAgICBvcy5zeW1saW5rKG9zLnBhdGguam9pbihhcGV4X3Jvb3QpLCBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICdhcGV4JykpCisgIGNvbW1hbmQgPSBbCisgICAgICAnYXBleGRfaG9zdCcsCisgICAgICAnLS1zeXN0ZW1fcGF0aCcsCisgICAgICBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICdzeXN0ZW0nKSwKKyAgICAgICctLWFwZXhfcGF0aCcsCisgICAgICBhcGV4X2V4dHJhY3Rfcm9vdF9kaXIsCisgIF0KKyAgbG9nZ2luZy5pbmZvKCcgICAgcnVubmluZyAlcycsIGNvbW1hbmQpCisgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChjb21tYW5kKQogCiAgICMgTW9kaWZ5IHN5c3RlbSBjb25maWcgdG8gcG9pbnQgdG8gdGhlIHRvb2xzIHRoYXQgaGF2ZSBiZWVuIGV4dHJhY3RlZC4KICAgIyBBYnNvbHV0ZSBvciAuLiBwYXRocyBhcmUgbm90IGFsbG93ZWQgIGJ5IHRoZSBkZXhwcmVvcHRfZ2VuIHRvb2wgaW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV9tZXRhLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX21ldGEucHkKaW5kZXggYjYxZjAzOS4uNzY1ODJjMCAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX21ldGEucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX21ldGEucHkKQEAgLTUzLDI4ICs1MywzNCBAQAogTU9EVUxFX0tFWV9QQVRURVJOID0gcmUuY29tcGlsZShyJ25hbWU9IiguKylcLihhcGV4fGFwaykiJykKIAogCitkZWYgTWVyZ2VVcGRhdGVFbmdpbmVDb25maWcoZnJhbWV3b3JrX21ldGFfZGlyLCB2ZW5kb3JfbWV0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkX21ldGFfZGlyKToKKyAgIiIiTWVyZ2VzIE1FVEEvdXBkYXRlX2VuZ2luZV9jb25maWcudHh0LgogCisgIFRoZSBvdXRwdXQgaXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eS4KKyAgIiIiCisgIF9DT05GSUdfTkFNRSA9ICd1cGRhdGVfZW5naW5lX2NvbmZpZy50eHQnCisgIGZyYW1ld29ya19jb25maWdfcGF0aCA9IG9zLnBhdGguam9pbihmcmFtZXdvcmtfbWV0YV9kaXIsIF9DT05GSUdfTkFNRSkKKyAgdmVuZG9yX2NvbmZpZ19wYXRoID0gb3MucGF0aC5qb2luKHZlbmRvcl9tZXRhX2RpciwgX0NPTkZJR19OQU1FKQorICBtZXJnZWRfY29uZmlnX3BhdGggPSBvcy5wYXRoLmpvaW4obWVyZ2VkX21ldGFfZGlyLCBfQ09ORklHX05BTUUpCiAKLWRlZiBNZXJnZVVwZGF0ZUVuZ2luZUNvbmZpZyhpbnB1dF9tZXRhZGlyMSwgaW5wdXRfbWV0YWRpcjIsIG1lcmdlZF9tZXRhX2Rpcik6Ci0gIFVQREFURV9FTkdJTkVfQ09ORklHX05BTUUgPSAidXBkYXRlX2VuZ2luZV9jb25maWcudHh0IgotICBjb25maWcxX3BhdGggPSBvcy5wYXRoLmpvaW4oCi0gICAgICBpbnB1dF9tZXRhZGlyMSwgVVBEQVRFX0VOR0lORV9DT05GSUdfTkFNRSkKLSAgY29uZmlnMl9wYXRoID0gb3MucGF0aC5qb2luKAotICAgICAgaW5wdXRfbWV0YWRpcjIsIFVQREFURV9FTkdJTkVfQ09ORklHX05BTUUpCi0gIGNvbmZpZzEgPSBQYXJzZVVwZGF0ZUVuZ2luZUNvbmZpZyhjb25maWcxX3BhdGgpCi0gIGNvbmZpZzIgPSBQYXJzZVVwZGF0ZUVuZ2luZUNvbmZpZyhjb25maWcyX3BhdGgpCi0gICMgQ29weSBvbGRlciBjb25maWcgdG8gbWVyZ2VkIHRhcmdldCBmaWxlcyBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5Ci0gICMgdXBkYXRlX2VuZ2luZSBpbiBzeXN0ZW0gcGFydGl0aW9uIGlzIGZyb20gc3lzdGVtIHNpZGUsIGJ1dAotICAjIHVwZGF0ZV9lbmdpbmVfc2lkZWxvYWQgaW4gcmVjb3ZlcnkgaXMgZnJvbSB2ZW5kb3Igc2lkZS4KLSAgaWYgY29uZmlnMSA8IGNvbmZpZzI6Ci0gICAgc2h1dGlsLmNvcHkoY29uZmlnMV9wYXRoLCBvcy5wYXRoLmpvaW4oCi0gICAgICAgIG1lcmdlZF9tZXRhX2RpciwgVVBEQVRFX0VOR0lORV9DT05GSUdfTkFNRSkpCisgIGlmIG9zLnBhdGguZXhpc3RzKGZyYW1ld29ya19jb25maWdfcGF0aCk6CisgICAgZnJhbWV3b3JrX2NvbmZpZyA9IFBhcnNlVXBkYXRlRW5naW5lQ29uZmlnKGZyYW1ld29ya19jb25maWdfcGF0aCkKKyAgICB2ZW5kb3JfY29uZmlnID0gUGFyc2VVcGRhdGVFbmdpbmVDb25maWcodmVuZG9yX2NvbmZpZ19wYXRoKQorICAgICMgQ29weSBvbGRlciBjb25maWcgdG8gbWVyZ2VkIHRhcmdldCBmaWxlcyBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5CisgICAgIyB1cGRhdGVfZW5naW5lIGluIHN5c3RlbSBwYXJ0aXRpb24gaXMgZnJvbSBzeXN0ZW0gc2lkZSwgYnV0CisgICAgIyB1cGRhdGVfZW5naW5lX3NpZGVsb2FkIGluIHJlY292ZXJ5IGlzIGZyb20gdmVuZG9yIHNpZGUuCisgICAgaWYgZnJhbWV3b3JrX2NvbmZpZyA8IHZlbmRvcl9jb25maWc6CisgICAgICBzaHV0aWwuY29weShmcmFtZXdvcmtfY29uZmlnX3BhdGgsIG1lcmdlZF9jb25maWdfcGF0aCkKKyAgICBlbHNlOgorICAgICAgc2h1dGlsLmNvcHkodmVuZG9yX2NvbmZpZ19wYXRoLCBtZXJnZWRfY29uZmlnX3BhdGgpCiAgIGVsc2U6Ci0gICAgc2h1dGlsLmNvcHkoY29uZmlnMl9wYXRoLCBvcy5wYXRoLmpvaW4oCi0gICAgICAgIG1lcmdlZF9tZXRhX2RpciwgVVBEQVRFX0VOR0lORV9DT05GSUdfTkFNRSkpCisgICAgaWYgbm90IE9QVElPTlMuYWxsb3dfcGFydGlhbF9hYjoKKyAgICAgIHJhaXNlIEZpbGVOb3RGb3VuZEVycm9yKGZyYW1ld29ya19jb25maWdfcGF0aCkKKyAgICBzaHV0aWwuY29weSh2ZW5kb3JfY29uZmlnX3BhdGgsIG1lcmdlZF9jb25maWdfcGF0aCkKIAogCi1kZWYgTWVyZ2VNZXRhRmlsZXModGVtcF9kaXIsIG1lcmdlZF9kaXIpOgorZGVmIE1lcmdlTWV0YUZpbGVzKHRlbXBfZGlyLCBtZXJnZWRfZGlyLCBmcmFtZXdvcmtfcGFydGl0aW9ucyk6CiAgICIiIk1lcmdlcyB2YXJpb3VzIGZpbGVzIGluIE1FVEEvKi4iIiIKIAogICBmcmFtZXdvcmtfbWV0YV9kaXIgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICdmcmFtZXdvcmtfbWV0YScsICdNRVRBJykKQEAgLTExNCw3ICsxMjAsOCBAQAogICAgIE1lcmdlQWJQYXJ0aXRpb25zKAogICAgICAgICBmcmFtZXdvcmtfbWV0YV9kaXI9ZnJhbWV3b3JrX21ldGFfZGlyLAogICAgICAgICB2ZW5kb3JfbWV0YV9kaXI9dmVuZG9yX21ldGFfZGlyLAotICAgICAgICBtZXJnZWRfbWV0YV9kaXI9bWVyZ2VkX21ldGFfZGlyKQorICAgICAgICBtZXJnZWRfbWV0YV9kaXI9bWVyZ2VkX21ldGFfZGlyLAorICAgICAgICBmcmFtZXdvcmtfcGFydGl0aW9ucz1mcmFtZXdvcmtfcGFydGl0aW9ucykKICAgICBVcGRhdGVDYXJlTWFwSW1hZ2VTaXplUHJvcHMoaW1hZ2VzX2Rpcj1vcy5wYXRoLmpvaW4obWVyZ2VkX2RpciwgJ0lNQUdFUycpKQogCiAgIGZvciBmaWxlX25hbWUgaW4gKCdhcGtjZXJ0cy50eHQnLCAnYXBleGtleXMudHh0Jyk6CkBAIC0xMjQsMTAgKzEzMSw5IEBACiAgICAgICAgIG1lcmdlZF9tZXRhX2Rpcj1tZXJnZWRfbWV0YV9kaXIsCiAgICAgICAgIGZpbGVfbmFtZT1maWxlX25hbWUpCiAKLSAgTWVyZ2VVcGRhdGVFbmdpbmVDb25maWcoCi0gICAgICBmcmFtZXdvcmtfbWV0YV9kaXIsCi0gICAgICB2ZW5kb3JfbWV0YV9kaXIsIG1lcmdlZF9tZXRhX2RpciwKLSAgKQorICBpZiBPUFRJT05TLm1lcmdlZF9taXNjX2luZm8uZ2V0KCdhYl91cGRhdGUnKSA9PSAndHJ1ZSc6CisgICAgTWVyZ2VVcGRhdGVFbmdpbmVDb25maWcoCisgICAgICAgIGZyYW1ld29ya19tZXRhX2RpciwgdmVuZG9yX21ldGFfZGlyLCBtZXJnZWRfbWV0YV9kaXIpCiAKICAgIyBXcml0ZSB0aGUgbm93LWZpbmFsaXplZCBPUFRJT05TLm1lcmdlZF9taXNjX2luZm8uCiAgIG1lcmdlX3V0aWxzLldyaXRlU29ydGVkRGF0YSgKQEAgLTEzNSwxMyArMTQxLDMwIEBACiAgICAgICBwYXRoPW9zLnBhdGguam9pbihtZXJnZWRfbWV0YV9kaXIsICdtaXNjX2luZm8udHh0JykpCiAKIAotZGVmIE1lcmdlQWJQYXJ0aXRpb25zKGZyYW1ld29ya19tZXRhX2RpciwgdmVuZG9yX21ldGFfZGlyLCBtZXJnZWRfbWV0YV9kaXIpOgorZGVmIE1lcmdlQWJQYXJ0aXRpb25zKGZyYW1ld29ya19tZXRhX2RpciwgdmVuZG9yX21ldGFfZGlyLCBtZXJnZWRfbWV0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrX3BhcnRpdGlvbnMpOgogICAiIiJNZXJnZXMgTUVUQS9hYl9wYXJ0aXRpb25zLnR4dC4KIAogICBUaGUgb3V0cHV0IGNvbnRhaW5zIHRoZSB1bmlvbiBvZiB0aGUgcGFydGl0aW9uIG5hbWVzLgogICAiIiIKLSAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihmcmFtZXdvcmtfbWV0YV9kaXIsICdhYl9wYXJ0aXRpb25zLnR4dCcpKSBhcyBmOgotICAgIGZyYW1ld29ya19hYl9wYXJ0aXRpb25zID0gZi5yZWFkKCkuc3BsaXRsaW5lcygpCisgIGZyYW1ld29ya19hYl9wYXJ0aXRpb25zID0gW10KKyAgZnJhbWV3b3JrX2FiX2NvbmZpZyA9IG9zLnBhdGguam9pbihmcmFtZXdvcmtfbWV0YV9kaXIsICdhYl9wYXJ0aXRpb25zLnR4dCcpCisgIGlmIG9zLnBhdGguZXhpc3RzKGZyYW1ld29ya19hYl9jb25maWcpOgorICAgIHdpdGggb3BlbihmcmFtZXdvcmtfYWJfY29uZmlnKSBhcyBmOgorICAgICAgIyBGaWx0ZXIgb3V0IHNvbWUgcGFydGl0aW9ucyBoZXJlIHRvIHN1cHBvcnQgdGhlIGNhc2UgdGhhdCB0aGUKKyAgICAgICMgYWJfcGFydGl0aW9ucy50eHQgb2YgZnJhbWV3b3JrLXRhcmdldC1maWxlcyBoYXMgbm9uLWZyYW1ld29yaworICAgICAgIyBwYXJ0aXRpb25zLiBUaGlzIGNhc2UgaGFwcGVucyB3aGVuIHdlIHVzZSBhIGNvbXBsZXRlIG1lcmdlZCB0YXJnZXQKKyAgICAgICMgZmlsZXMgcGFja2FnZSBhcyB0aGUgZnJhbWV3b3JrLXRhcmdldC1maWxlcy4KKyAgICAgIGZyYW1ld29ya19hYl9wYXJ0aXRpb25zLmV4dGVuZChbCisgICAgICAgICAgcGFydGl0aW9uCisgICAgICAgICAgZm9yIHBhcnRpdGlvbiBpbiBmLnJlYWQoKS5zcGxpdGxpbmVzKCkKKyAgICAgICAgICBpZiBwYXJ0aXRpb24gaW4gZnJhbWV3b3JrX3BhcnRpdGlvbnMKKyAgICAgIF0pCisgIGVsc2U6CisgICAgaWYgbm90IE9QVElPTlMuYWxsb3dfcGFydGlhbF9hYjoKKyAgICAgIHJhaXNlIEZpbGVOb3RGb3VuZEVycm9yKGZyYW1ld29ya19hYl9jb25maWcpCisgICAgbG9nZ2VyLmluZm8oJ1VzZSBwYXJ0aWFsIEFCIGJlY2F1c2UgZnJhbWV3b3JrIGFiX3BhcnRpdGlvbnMudHh0IGRvZXMgbm90ICcKKyAgICAgICAgICAgICAgICAnZXhpc3QuJykKIAogICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHZlbmRvcl9tZXRhX2RpciwgJ2FiX3BhcnRpdGlvbnMudHh0JykpIGFzIGY6CiAgICAgdmVuZG9yX2FiX3BhcnRpdGlvbnMgPSBmLnJlYWQoKS5zcGxpdGxpbmVzKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV90YXJnZXRfZmlsZXMucHkgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfdGFyZ2V0X2ZpbGVzLnB5CmluZGV4IGJhMmIxNGYuLmZkYmE5MjcgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV90YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX3RhcmdldF9maWxlcy5weQpAQCAtNDYsNiArNDYsMTAgQEAKICAgICAgIFRoZSBvcHRpb25hbCBwYXRoIHRvIGEgbmV3bGluZS1zZXBhcmF0ZWQgY29uZmlnIGZpbGUgb2YgaXRlbXMgdGhhdAogICAgICAgYXJlIGV4dHJhY3RlZCBhcy1pcyBmcm9tIHRoZSB2ZW5kb3IgdGFyZ2V0IGZpbGVzIHBhY2thZ2UuCiAKKyAgLS1ib290LWltYWdlLWRpci1wYXRoCisgICAgICBUaGUgaW5wdXQgYm9vdCBpbWFnZSBkaXJlY3RvcnkgcGF0aC4gVGhpcyBwYXRoIGNvbnRhaW5zIElNQUdFUy9ib290LmltZworICAgICAgZmlsZS4KKwogICAtLW91dHB1dC10YXJnZXQtZmlsZXMgb3V0cHV0LXRhcmdldC1maWxlcy1wYWNrYWdlCiAgICAgICBJZiBwcm92aWRlZCwgdGhlIG91dHB1dCBtZXJnZWQgdGFyZ2V0IGZpbGVzIHBhY2thZ2UuIEFsc28gYSB6aXAgYXJjaGl2ZS4KIApAQCAtOTAsNiArOTQsMTQgQEAKICAgLS1rZWVwLXRtcAogICAgICAgS2VlcCB0ZW1wb2FyeSBmaWxlcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgogCisgIC0tYXZiLXJlc29sdmUtcm9sbGJhY2staW5kZXgtbG9jYXRpb24tY29uZmxpY3QKKyAgICAgIElmIHByb3ZpZGVkLCByZXNvbHZlIHRoZSBjb25mbGljdCBBVkIgcm9sbGJhY2sgaW5kZXggbG9jYXRpb24gd2hlbgorICAgICAgbmVjZXNzYXJ5LgorCisgIC0tYWxsb3ctcGFydGlhbC1hYgorICAgICAgSWYgcHJvdmlkZWQsIGFsbG93IG1lcmdpbmcgbm9uLUFCIGZyYW1ld29yayB0YXJnZXQgZmlsZXMgd2l0aCBBQiB2ZW5kb3IKKyAgICAgIHRhcmdldCBmaWxlcywgd2hpY2ggbWVhbnMgdGhhdCBvbmx5IHRoZSB2ZW5kb3IgaGFzIEFCIHBhcnRpdGlvbnMuCisKICAgVGhlIGZvbGxvd2luZyBvbmx5IGFwcGx5IHdoZW4gdXNpbmcgdGhlIFZTREsgdG8gcGVyZm9ybSBkZXhvcHQgb24gdmVuZG9yIGFwcHM6CiAKICAgLS1mcmFtZXdvcmstZGV4cHJlb3B0LWNvbmZpZwpAQCAtMTMyLDYgKzE0NCw3IEBACiBPUFRJT05TLmZyYW1ld29ya19taXNjX2luZm9fa2V5cyA9IFtdCiBPUFRJT05TLnZlbmRvcl90YXJnZXRfZmlsZXMgPSBOb25lCiBPUFRJT05TLnZlbmRvcl9pdGVtX2xpc3QgPSBbXQorT1BUSU9OUy5ib290X2ltYWdlX2Rpcl9wYXRoID0gTm9uZQogT1BUSU9OUy5vdXRwdXRfdGFyZ2V0X2ZpbGVzID0gTm9uZQogT1BUSU9OUy5vdXRwdXRfZGlyID0gTm9uZQogT1BUSU9OUy5vdXRwdXRfaXRlbV9saXN0ID0gW10KQEAgLTE0NCw2ICsxNTcsOCBAQAogT1BUSU9OUy52ZW5kb3Jfb3RhdG9vbHMgPSBOb25lCiBPUFRJT05TLnJlYnVpbGRfc2Vwb2xpY3kgPSBGYWxzZQogT1BUSU9OUy5rZWVwX3RtcCA9IEZhbHNlCitPUFRJT05TLmF2Yl9yZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0ID0gRmFsc2UKK09QVElPTlMuYWxsb3dfcGFydGlhbF9hYiA9IEZhbHNlCiBPUFRJT05TLmZyYW1ld29ya19kZXhwcmVvcHRfY29uZmlnID0gTm9uZQogT1BUSU9OUy5mcmFtZXdvcmtfZGV4cHJlb3B0X3Rvb2xzID0gTm9uZQogT1BUSU9OUy52ZW5kb3JfZGV4cHJlb3B0X2NvbmZpZyA9IE5vbmUKQEAgLTE2NSwxNyArMTgwLDI0IEBACiAgICAgcGFzcwogCiAKLWRlZiBpbmNsdWRlX21ldGFfaW5fbGlzdChpdGVtX2xpc3QpOgotICAiIiJJbmNsdWRlIGFsbCBgTUVUQS8qYCBmaWxlcyBpbiB0aGUgaXRlbSBsaXN0LgorZGVmIGluY2x1ZGVfZXh0cmFfaW5fbGlzdChpdGVtX2xpc3QpOgorICAiIiIKKyAgMS4gSW5jbHVkZSBhbGwgYE1FVEEvKmAgZmlsZXMgaW4gdGhlIGl0ZW0gbGlzdC4KIAogICBUbyBlbnN1cmUgdGhhdCBgQWRkSW1hZ2VzVG9UYXJnZXRGaWxlc2AgY2FuIHN0aWxsIGJlIHVzZWQgd2l0aCB2ZW5kb3IgaXRlbQogICBsaXN0IHRoYXQgZG8gbm90IHNwZWNpZnkgYWxsIG9mIHRoZSByZXF1aXJlZCBNRVRBLyBmaWxlcywgdGhvc2UgZmlsZXMgc2hvdWxkCiAgIGJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQuIFRoaXMgcHJlc2VydmVzIHRoZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9mCiAgIGByZWJ1aWxkX2ltYWdlX3dpdGhfc2Vwb2xpY3lgLgorCisgIDIuIEluY2x1ZGUgYFNZU1RFTS9idWlsZC5wcm9wYCBmaWxlIGluIHRoZSBpdGVtIGxpc3QuCisKKyAgVG8gZW5zdXJlIHRoYXQgYEFkZEltYWdlc1RvVGFyZ2V0RmlsZXNgIGZvciBHUkYgdmVuZG9yIGltYWdlcywgY2FuIHN0aWxsCisgIGFjY2VzcyBTWVNURU0vYnVpbGQucHJvcCB0byBwYXNzIEdldFBhcnRpdGlvbkZpbmdlcnByaW50IGNoZWNrIGluIEJ1aWxkSW5mbworICBjb25zdHJ1Y3Rvci4KICAgIiIiCiAgIGlmIG5vdCBpdGVtX2xpc3Q6CiAgICAgcmV0dXJuIE5vbmUKLSAgcmV0dXJuIGxpc3QoaXRlbV9saXN0KSArIFsnTUVUQS8qJ10KKyAgcmV0dXJuIGxpc3QoaXRlbV9saXN0KSArIFsnTUVUQS8qJ10gKyBbJ1NZU1RFTS9idWlsZC5wcm9wJ10KIAogCiBkZWYgY3JlYXRlX21lcmdlZF9wYWNrYWdlKHRlbXBfZGlyKToKQEAgLTE5OCwxMSArMjIwLDE5IEBACiAgICAgICBvdXRwdXRfZGlyPW91dHB1dF90YXJnZXRfZmlsZXNfdGVtcF9kaXIsCiAgICAgICBpdGVtX2xpc3Q9T1BUSU9OUy52ZW5kb3JfaXRlbV9saXN0KQogCisgIGlmIE9QVElPTlMuYm9vdF9pbWFnZV9kaXJfcGF0aDoKKyAgICBtZXJnZV91dGlscy5Db2xsZWN0VGFyZ2V0RmlsZXMoCisgICAgICAgIGlucHV0X3ppcGZpbGVfb3JfZGlyPU9QVElPTlMuYm9vdF9pbWFnZV9kaXJfcGF0aCwKKyAgICAgICAgb3V0cHV0X2Rpcj1vdXRwdXRfdGFyZ2V0X2ZpbGVzX3RlbXBfZGlyLAorICAgICAgICBpdGVtX2xpc3Q9WydJTUFHRVMvYm9vdC5pbWcnXSkKKwogICAjIFBlcmZvcm0gc3BlY2lhbCBjYXNlIHByb2Nlc3Npbmcgb24gTUVUQS8qIGl0ZW1zLgogICAjIEFmdGVyIHRoaXMgZnVuY3Rpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgYWxsIHRoZSBmaWxlcyB3ZSBuZWVkIHRvIGNyZWF0ZQogICAjIHRoZSBvdXRwdXQgdGFyZ2V0IGZpbGVzIHBhY2thZ2UgYXJlIGluIHBsYWNlLgogICBtZXJnZV9tZXRhLk1lcmdlTWV0YUZpbGVzKAotICAgICAgdGVtcF9kaXI9dGVtcF9kaXIsIG1lcmdlZF9kaXI9b3V0cHV0X3RhcmdldF9maWxlc190ZW1wX2RpcikKKyAgICAgIHRlbXBfZGlyPXRlbXBfZGlyLAorICAgICAgbWVyZ2VkX2Rpcj1vdXRwdXRfdGFyZ2V0X2ZpbGVzX3RlbXBfZGlyLAorICAgICAgZnJhbWV3b3JrX3BhcnRpdGlvbnM9T1BUSU9OUy5mcmFtZXdvcmtfcGFydGl0aW9uX3NldCkKIAogICBtZXJnZV9kZXhvcHQuTWVyZ2VEZXhvcHQoCiAgICAgICB0ZW1wX2Rpcj10ZW1wX2Rpciwgb3V0cHV0X3RhcmdldF9maWxlc19kaXI9b3V0cHV0X3RhcmdldF9maWxlc190ZW1wX2RpcikKQEAgLTIyMSw2ICsyNTEsOCBAQAogICBdCiAgIGlmIE9QVElPTlMucmVidWlsZF9yZWNvdmVyeToKICAgICBhZGRfaW1nX2FyZ3MuYXBwZW5kKCctLXJlYnVpbGRfcmVjb3ZlcnknKQorICBpZiBPUFRJT05TLmF2Yl9yZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0OgorICAgIGFkZF9pbWdfYXJncy5hcHBlbmQoJy0tYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QnKQogICBhZGRfaW1nX2FyZ3MuYXBwZW5kKHRhcmdldF9maWxlc19kaXIpCiAKICAgYWRkX2ltZ190b190YXJnZXRfZmlsZXMubWFpbihhZGRfaW1nX2FyZ3MpCkBAIC0yODksNyArMzIxLDcgQEAKICAgbWVyZ2VfdXRpbHMuQ29sbGVjdFRhcmdldEZpbGVzKAogICAgICAgaW5wdXRfemlwZmlsZV9vcl9kaXI9T1BUSU9OUy52ZW5kb3JfdGFyZ2V0X2ZpbGVzLAogICAgICAgb3V0cHV0X2Rpcj12ZW5kb3JfdGFyZ2V0X2ZpbGVzX2RpciwKLSAgICAgIGl0ZW1fbGlzdD1pbmNsdWRlX21ldGFfaW5fbGlzdChPUFRJT05TLnZlbmRvcl9pdGVtX2xpc3QpKQorICAgICAgaXRlbV9saXN0PWluY2x1ZGVfZXh0cmFfaW5fbGlzdChPUFRJT05TLnZlbmRvcl9pdGVtX2xpc3QpKQogCiAgICMgQ29weSB0aGUgcGFydGl0aW9uIGNvbnRlbnRzIGZyb20gdGhlIG1lcmdlZCB0YXJnZXQtZmlsZXMgYXJjaGl2ZSB0byB0aGUKICAgIyB2ZW5kb3IgdGFyZ2V0LWZpbGVzIGFyY2hpdmUuCkBAIC01MjMsNiArNTU1LDggQEAKICAgICAgIE9QVElPTlMudmVuZG9yX2l0ZW1fbGlzdCA9IGEKICAgICBlbGlmIG8gPT0gJy0tdmVuZG9yLWl0ZW0tbGlzdCc6CiAgICAgICBPUFRJT05TLnZlbmRvcl9pdGVtX2xpc3QgPSBhCisgICAgZWxpZiBvID09ICctLWJvb3QtaW1hZ2UtZGlyLXBhdGgnOgorICAgICAgT1BUSU9OUy5ib290X2ltYWdlX2Rpcl9wYXRoID0gYQogICAgIGVsaWYgbyA9PSAnLS1vdXRwdXQtdGFyZ2V0LWZpbGVzJzoKICAgICAgIE9QVElPTlMub3V0cHV0X3RhcmdldF9maWxlcyA9IGEKICAgICBlbGlmIG8gPT0gJy0tb3V0cHV0LWRpcic6CkBAIC01NDUsNiArNTc5LDEwIEBACiAgICAgICBPUFRJT05TLnJlYnVpbGRfc2Vwb2xpY3kgPSBUcnVlCiAgICAgZWxpZiBvID09ICctLWtlZXAtdG1wJzoKICAgICAgIE9QVElPTlMua2VlcF90bXAgPSBUcnVlCisgICAgZWxpZiBvID09ICctLWF2Yi1yZXNvbHZlLXJvbGxiYWNrLWluZGV4LWxvY2F0aW9uLWNvbmZsaWN0JzoKKyAgICAgIE9QVElPTlMuYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QgPSBUcnVlCisgICAgZWxpZiBvID09ICctLWFsbG93LXBhcnRpYWwtYWInOgorICAgICAgT1BUSU9OUy5hbGxvd19wYXJ0aWFsX2FiID0gVHJ1ZQogICAgIGVsaWYgbyA9PSAnLS1mcmFtZXdvcmstZGV4cHJlb3B0LWNvbmZpZyc6CiAgICAgICBPUFRJT05TLmZyYW1ld29ya19kZXhwcmVvcHRfY29uZmlnID0gYQogICAgIGVsaWYgbyA9PSAnLS1mcmFtZXdvcmstZGV4cHJlb3B0LXRvb2xzJzoKQEAgLTU2OSw2ICs2MDcsNyBAQAogICAgICAgICAgICd2ZW5kb3ItdGFyZ2V0LWZpbGVzPScsCiAgICAgICAgICAgJ290aGVyLWl0ZW0tbGlzdD0nLAogICAgICAgICAgICd2ZW5kb3ItaXRlbS1saXN0PScsCisgICAgICAgICAgJ2Jvb3QtaW1hZ2UtZGlyLXBhdGg9JywKICAgICAgICAgICAnb3V0cHV0LXRhcmdldC1maWxlcz0nLAogICAgICAgICAgICdvdXRwdXQtZGlyPScsCiAgICAgICAgICAgJ291dHB1dC1pdGVtLWxpc3Q9JywKQEAgLTU4NCw2ICs2MjMsOCBAQAogICAgICAgICAgICd2ZW5kb3Itb3RhdG9vbHM9JywKICAgICAgICAgICAncmVidWlsZC1zZXBvbGljeScsCiAgICAgICAgICAgJ2tlZXAtdG1wJywKKyAgICAgICAgICAnYXZiLXJlc29sdmUtcm9sbGJhY2staW5kZXgtbG9jYXRpb24tY29uZmxpY3QnLAorICAgICAgICAgICdhbGxvdy1wYXJ0aWFsLWFiJywKICAgICAgIF0sCiAgICAgICBleHRyYV9vcHRpb25faGFuZGxlcj1vcHRpb25faGFuZGxlcikKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX3V0aWxzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX3V0aWxzLnB5CmluZGV4IGI1NjgzYTguLmQ0NDZmYzAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV91dGlscy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfdXRpbHMucHkKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiAjIFBhcnRpdGlvbnMgdGhhdCBhcmUgZ3JhYmJlZCBmcm9tIHRoZSBmcmFtZXdvcmsgcGFydGlhbCBidWlsZCBieSBkZWZhdWx0LgogX0ZSQU1FV09SS19QQVJUSVRJT05TID0gewotICAgICdzeXN0ZW0nLCAncHJvZHVjdCcsICdzeXN0ZW1fZXh0JywgJ3N5c3RlbV9vdGhlcicsICdyb290JywgJ3N5c3RlbV9kbGttJywKKyAgICAnc3lzdGVtJywgJ3Byb2R1Y3QnLCAnc3lzdGVtX2V4dCcsICdzeXN0ZW1fb3RoZXInLCAncm9vdCcsCiAgICAgJ3ZibWV0YV9zeXN0ZW0nLCAncHZtZncnCiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZV9vdGEucHkgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2Vfb3RhLnB5CmluZGV4IDQ0MTMxMmMuLmZiNTk1N2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZV9vdGEucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlX290YS5weQpAQCAtMTQsNyArMTQsNiBAQAogCiBpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBsb2dnaW5nCi1pbXBvcnQgc2hsZXgKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCBzeXMKIGltcG9ydCB1cGRhdGVfcGF5bG9hZApAQCAtMzEsNiArMzAsNyBAQAogCiBmcm9tIHBheWxvYWRfc2lnbmVyIGltcG9ydCBQYXlsb2FkU2lnbmVyCiBmcm9tIG90YV91dGlscyBpbXBvcnQgUGF5bG9hZEdlbmVyYXRvciwgTUVUQURBVEFfUFJPVE9fTkFNRSwgRmluYWxpemVNZXRhZGF0YQorZnJvbSBvdGFfc2lnbmluZ191dGlscyBpbXBvcnQgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UKIAogbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKQEAgLTEyNiw3ICsxMjYsNyBAQAogICAgIEV4dGVuZFBhcnRpdGlvblVwZGF0ZXMob3V0cHV0X21hbmlmZXN0LnBhcnRpdGlvbnMsIG1hbmlmZXN0LnBhcnRpdGlvbnMpCiAgICAgdHJ5OgogICAgICAgTWVyZ2VEeW5hbWljUGFydGl0aW9uTWV0YWRhdGEoCi0gICAgICAgIG91dHB1dF9tYW5pZmVzdC5keW5hbWljX3BhcnRpdGlvbl9tZXRhZGF0YSwgbWFuaWZlc3QuZHluYW1pY19wYXJ0aXRpb25fbWV0YWRhdGEpCisgICAgICAgICAgb3V0cHV0X21hbmlmZXN0LmR5bmFtaWNfcGFydGl0aW9uX21ldGFkYXRhLCBtYW5pZmVzdC5keW5hbWljX3BhcnRpdGlvbl9tZXRhZGF0YSkKICAgICBleGNlcHQgRHVwbGljYXRlUGFydGl0aW9uRXJyb3I6CiAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgIk9UQSAlcyBoYXMgZHVwbGljYXRlIHBhcnRpdGlvbiB3aXRoIHNvbWUgb2YgdGhlIHByZXZpb3VzIE9UQXMiLCBwYXlsb2FkLm5hbWUpCkBAIC0xOTAsNiArMTkwLDcgQEAKICAgICAgICAgICAgICAgZiJPVEEge3BhcnRpdGlvbl90b19vdGFbcGFydF0ubmFtZX0gYW5kIHtwYXlsb2FkLm5hbWV9IGhhdmUgZHVwbGljYXRpbmcgcGFydGl0aW9uIHtwYXJ0fSIpCiAgICAgICAgIHBhcnRpdGlvbl90b19vdGFbcGFydF0gPSBwYXlsb2FkCiAKKwogZGVmIEFwZXhJbmZvKGZpbGVfcGF0aHMpOgogICBpZiBsZW4oZmlsZV9wYXRocykgPiAxOgogICAgIGxvZ2dlci5pbmZvKCJNb3JlIHRoYW4gb25lIHRhcmdldCBmaWxlIHNwZWNpZmllZCwgd2lsbCBpZ25vcmUgIgpAQCAtMjAxLDMzICsyMDIsMTkgQEAKICAgICAgIHJldHVybiBhcGV4X2luZm9fYnl0ZXMKICAgcmV0dXJuIE5vbmUKIAotZGVmIFBhcnNlU2lnbmVyQXJncyhhcmdzKToKLSAgaWYgYXJncyBpcyBOb25lOgotICAgIHJldHVybiBOb25lCi0gIHJldHVybiBzaGxleC5zcGxpdChhcmdzKQogCiBkZWYgbWFpbihhcmd2KToKICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J01lcmdlIG11bHRpcGxlIHBhcnRpYWwgT1RBcycpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3BhY2thZ2VzJywgdHlwZT1zdHIsIG5hcmdzPScrJywKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRocyB0byBPVEEgcGFja2FnZXMgdG8gbWVyZ2UnKQotICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBhY2thZ2Vfa2V5JywgdHlwZT1zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aHMgdG8gcHJpdmF0ZSBrZXkgZm9yIHNpZ25pbmcgcGF5bG9hZCcpCi0gIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc2VhcmNoX3BhdGgnLCB0eXBlPXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTZWFyY2ggcGF0aCBmb3IgZnJhbWV3b3JrL3NpZ25hcGsuamFyJykKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXlsb2FkX3NpZ25lcicsIHR5cGU9c3RyLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gY3VzdG9tIHBheWxvYWQgc2lnbmVyJykKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXlsb2FkX3NpZ25lcl9hcmdzJywgdHlwZT1QYXJzZVNpZ25lckFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0nQXJndW1lbnRzIGZvciBwYXlsb2FkIHNpZ25lciBpZiBuZWNlc3NhcnknKQotICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUnLCB0eXBlPXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdNYXhpbXVtIHNpZ25hdHVyZSBzaXplIChpbiBieXRlcykgdGhhdCB3b3VsZCBiZSAnCi0gICAgICAgICAgICAgICAgICAgICAgJ2dlbmVyYXRlZCBieSB0aGUgZ2l2ZW4gcGF5bG9hZCBzaWduZXInKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsIHR5cGU9c3RyLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGhzIHRvIG91dHB1dCBtZXJnZWQgb3RhJywgcmVxdWlyZWQ9VHJ1ZSkKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1tZXRhZGF0YV9vdGEnLCB0eXBlPXN0ciwKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdPdXRwdXQgemlwIHdpbGwgdXNlIGJ1aWxkIG1ldGFkYXRhIGZyb20gdGhpcyBPVEEgcGFja2FnZSwgaWYgdW5zcGVjaWZpZWQsIHVzZSB0aGUgbGFzdCBPVEEgcGFja2FnZSBpbiBtZXJnZSBsaXN0JykKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wcml2YXRlX2tleV9zdWZmaXgnLCB0eXBlPXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTdWZmaXggdG8gYmUgYXBwZW5kZWQgdG8gcGFja2FnZV9rZXkgcGF0aCcsIGRlZmF1bHQ9Ii5wazgiKQotICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhlbHA9IkVuYWJsZSB2ZXJib3NlIGxvZ2dpbmciLCBkZXN0PSJ2ZXJib3NlIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXYnLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkVuYWJsZSB2ZXJib3NlIGxvZ2dpbmciLCBkZXN0PSJ2ZXJib3NlIikKKyAgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UocGFyc2VyKQorCiAgIHBhcnNlci5lcGlsb2cgPSAoJ1RoaXMgdG9vbCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlc2lnbiBhIHJlZ3VsYXIgT1RBLiBGb3IgYSBzaW5nbGUgcmVndWxhciBPVEEsICcKICAgICAgICAgICAgICAgICAgICAnYXBleF9pbmZvLnBiIHdpbGwgYmUgd3JpdHRlbiB0byBvdXRwdXQuIFdoZW4gbWVyZ2luZyBtdWx0aXBsZSBPVEFzLCAnCiAgICAgICAgICAgICAgICAgICAgJ2FwZXhfaW5mby5wYiB3aWxsIG5vdCBiZSB3cml0dGVuLicpCkBAIC0yNTYsOCArMjQzLDYgQEAKICAgIyBHZXQgc2lnbmluZyBrZXlzCiAgIGtleV9wYXNzd29yZHMgPSBjb21tb24uR2V0S2V5UGFzc3dvcmRzKFthcmdzLnBhY2thZ2Vfa2V5XSkKIAotICBnZW5lcmF0b3IgPSBQYXlsb2FkR2VuZXJhdG9yKCkKLQogICBhcGV4X2luZm9fYnl0ZXMgPSBBcGV4SW5mbyhmaWxlX3BhdGhzKQogCiAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgdW5zaWduZWRfcGF5bG9hZDoKQEAgLTMwMSw4ICsyODYsNiBAQAogICByZXR1cm4gMAogCiAKLQotCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICBsb2dnaW5nLmJhc2ljQ29uZmlnKCkKICAgc3lzLmV4aXQobWFpbihzeXMuYXJndikpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvbm9uX2FiX290YS5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9ub25fYWJfb3RhLnB5CmluZGV4IGM0ZmQ4MDkuLjY2Nzg5MWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9ub25fYWJfb3RhLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9ub25fYWJfb3RhLnB5CkBAIC0yMyw2ICsyMyw3IEBACiBmcm9tIGNoZWNrX3RhcmdldF9maWxlc192aW50ZiBpbXBvcnQgQ2hlY2tWaW50ZklmVHJlYmxlRW5hYmxlZCwgSGFzUGFydGl0aW9uCiBmcm9tIGNvbW1vbiBpbXBvcnQgT1BUSU9OUwogZnJvbSBvdGFfdXRpbHMgaW1wb3J0IFVOWklQX1BBVFRFUk4sIEZpbmFsaXplTWV0YWRhdGEsIEdldFBhY2thZ2VNZXRhZGF0YSwgUHJvcGVydHlGaWxlcworaW1wb3J0IHN1YnByb2Nlc3MKIAogbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKQEAgLTI3Nyw3ICsyNzgsOCBAQAogICBuZWVkZWRfcHJvcGVydHlfZmlsZXMgPSAoCiAgICAgICBOb25BYk90YVByb3BlcnR5RmlsZXMoKSwKICAgKQotICBGaW5hbGl6ZU1ldGFkYXRhKG1ldGFkYXRhLCBzdGFnaW5nX2ZpbGUsIG91dHB1dF9maWxlLCBuZWVkZWRfcHJvcGVydHlfZmlsZXMsIHBhY2thZ2Vfa2V5PU9QVElPTlMucGFja2FnZV9rZXkpCisgIEZpbmFsaXplTWV0YWRhdGEobWV0YWRhdGEsIHN0YWdpbmdfZmlsZSwgb3V0cHV0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgbmVlZGVkX3Byb3BlcnR5X2ZpbGVzLCBwYWNrYWdlX2tleT1PUFRJT05TLnBhY2thZ2Vfa2V5KQogCiAKIGRlZiBXcml0ZUJsb2NrSW5jcmVtZW50YWxPVEFQYWNrYWdlKHRhcmdldF96aXAsIHNvdXJjZV96aXAsIG91dHB1dF9maWxlKToKQEAgLTUzMiw3ICs1MzQsOCBAQAogICBuZWVkZWRfcHJvcGVydHlfZmlsZXMgPSAoCiAgICAgICBOb25BYk90YVByb3BlcnR5RmlsZXMoKSwKICAgKQotICBGaW5hbGl6ZU1ldGFkYXRhKG1ldGFkYXRhLCBzdGFnaW5nX2ZpbGUsIG91dHB1dF9maWxlLCBuZWVkZWRfcHJvcGVydHlfZmlsZXMsIHBhY2thZ2Vfa2V5PU9QVElPTlMucGFja2FnZV9rZXkpCisgIEZpbmFsaXplTWV0YWRhdGEobWV0YWRhdGEsIHN0YWdpbmdfZmlsZSwgb3V0cHV0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgbmVlZGVkX3Byb3BlcnR5X2ZpbGVzLCBwYWNrYWdlX2tleT1PUFRJT05TLnBhY2thZ2Vfa2V5KQogCiAKIGRlZiBHZW5lcmF0ZU5vbkFiT3RhUGFja2FnZSh0YXJnZXRfZmlsZSwgb3V0cHV0X2ZpbGUsIHNvdXJjZV9maWxlPU5vbmUpOgpAQCAtNTU1LDggKzU1OCwxOCBAQAogICBpZiBPUFRJT05TLmV4dHJhY3RlZF9pbnB1dCBpcyBub3QgTm9uZToKICAgICBPUFRJT05TLmlucHV0X3RtcCA9IE9QVElPTlMuZXh0cmFjdGVkX2lucHV0CiAgIGVsc2U6Ci0gICAgbG9nZ2VyLmluZm8oInVuemlwcGluZyB0YXJnZXQgdGFyZ2V0LWZpbGVzLi4uIikKLSAgICBPUFRJT05TLmlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAodGFyZ2V0X2ZpbGUsIFVOWklQX1BBVFRFUk4pCisgICAgaWYgbm90IG9zLnBhdGguaXNkaXIodGFyZ2V0X2ZpbGUpOgorICAgICAgbG9nZ2VyLmluZm8oInVuemlwcGluZyB0YXJnZXQgdGFyZ2V0LWZpbGVzLi4uIikKKyAgICAgIE9QVElPTlMuaW5wdXRfdG1wID0gY29tbW9uLlVuemlwVGVtcCh0YXJnZXRfZmlsZSwgVU5aSVBfUEFUVEVSTikKKyAgICBlbHNlOgorICAgICAgT1BUSU9OUy5pbnB1dF90bXAgPSB0YXJnZXRfZmlsZQorICAgICAgdG1wZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PSIuemlwIikKKyAgICAgIG9zLnVubGluayh0bXBmaWxlKQorICAgICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KAorICAgICAgICAgIFsiemlwIiwgdG1wZmlsZSwgIi1yIiwgIi4iLCAiLTAiXSwgY3dkPXRhcmdldF9maWxlKQorICAgICAgYXNzZXJ0IHppcGZpbGUuaXNfemlwZmlsZSh0bXBmaWxlKQorICAgICAgdGFyZ2V0X2ZpbGUgPSB0bXBmaWxlCisKICAgT1BUSU9OUy50YXJnZXRfdG1wID0gT1BUSU9OUy5pbnB1dF90bXAKIAogICAjIElmIHRoZSBjYWxsZXIgZXhwbGljaXRseSBzcGVjaWZpZWQgdGhlIGRldmljZS1zcGVjaWZpYyBleHRlbnNpb25zIHBhdGggdmlhCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fcmF3X2ltZy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV9yYXdfaW1nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjQ0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fcmF3X2ltZy5weQpAQCAtMCwwICsxLDEyOCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiIKK0dpdmVuIGEgc2VyaWVzIG9mIC5pbWcgZmlsZXMsIHByb2R1Y2VzIGFuIE9UQSBwYWNrYWdlIHRoYXQgaW5zdGFsbHMgdGhvZXNlIGltYWdlcworIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHppcGZpbGUKKworaW1wb3J0IGNvbW1vbgorZnJvbSBwYXlsb2FkX3NpZ25lciBpbXBvcnQgUGF5bG9hZFNpZ25lcgorZnJvbSBvdGFfdXRpbHMgaW1wb3J0IFBheWxvYWRHZW5lcmF0b3IKK2Zyb20gb3RhX3NpZ25pbmdfdXRpbHMgaW1wb3J0IEFkZFNpZ25pbmdBcmd1bWVudFBhcnNlCisKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKKworZGVmIFJlc29sdmVCaW5hcnlQYXRoKGZpbGVuYW1lLCBzZWFyY2hfcGF0aCk6CisgIGlmIG5vdCBzZWFyY2hfcGF0aDoKKyAgICByZXR1cm4gZmlsZW5hbWUKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlYXJjaF9wYXRoKToKKyAgICByZXR1cm4gZmlsZW5hbWUKKyAgcGF0aCA9IG9zLnBhdGguam9pbihzZWFyY2hfcGF0aCwgImJpbiIsIGZpbGVuYW1lKQorICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICByZXR1cm4gcGF0aAorICBwYXRoID0gb3MucGF0aC5qb2luKHNlYXJjaF9wYXRoLCBmaWxlbmFtZSkKKyAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgcmV0dXJuIHBhdGgKKyAgcmV0dXJuIHBhdGgKKworCitkZWYgbWFpbihhcmd2KToKKyAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCisgICAgICBwcm9nPWFyZ3ZbMF0sIGRlc2NyaXB0aW9uPSJHaXZlbiBhIHNlcmllcyBvZiAuaW1nIGZpbGVzLCBwcm9kdWNlcyBhIGZ1bGwgT1RBIHBhY2thZ2UgdGhhdCBpbnN0YWxscyB0aG9lc2UgaW1hZ2VzIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgiaW1hZ2VzIiwgbmFyZ3M9IisiLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJMaXN0IG9mIGltYWdlcyB0byBnZW5lcmF0ZSBPVEEiKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXBhcnRpdGlvbl9uYW1lcyIsIG5hcmdzPSc/JywgdHlwZT1zdHIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGFydGl0aW9uIG5hbWVzIHRvIGluc3RhbGwgdGhlIGltYWdlcywgZGVmYXVsdCB0byBiYXNlbmFtZSBvZiB0aGUgaW1hZ2Uobm8gZmlsZSBuYW1lIGV4dGVuc2lvbikiKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGhzIHRvIG91dHB1dCBtZXJnZWQgb3RhJywgcmVxdWlyZWQ9VHJ1ZSkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1tYXhfdGltZXN0YW1wJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nTWF4aW11bSBidWlsZCB0aW1lc3RhbXAgYWxsb3dlZCB0byBpbnN0YWxsIHRoaXMgT1RBJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLXYiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkVuYWJsZSB2ZXJib3NlIGxvZ2dpbmciLCBkZXN0PSJ2ZXJib3NlIikKKyAgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UocGFyc2VyKQorCisgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2WzE6XSkKKyAgaWYgYXJncy52ZXJib3NlOgorICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgIGxvZ2dlci5pbmZvKGFyZ3MpCisgIG9sZF9pbWdzID0gWyIiXSAqIGxlbihhcmdzLmltYWdlcykKKyAgZm9yIChpLCBpbWcpIGluIGVudW1lcmF0ZShhcmdzLmltYWdlcyk6CisgICAgaWYgIjoiIGluIGltZzoKKyAgICAgIG9sZF9pbWdzW2ldLCBhcmdzLmltYWdlc1tpXSA9IGltZy5zcGxpdCgiOiIsIG1heHNwbGl0PTEpCisKKyAgaWYgbm90IGFyZ3MucGFydGl0aW9uX25hbWVzOgorICAgIGFyZ3MucGFydGl0aW9uX25hbWVzID0gW29zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShwYXRoKSlbCisgICAgICAgIDBdIGZvciBwYXRoIGluIGFyZ3MuaW1hZ2VzXQorICBlbHNlOgorICAgIGFyZ3MucGFydGl0aW9uX25hbWVzID0gYXJncy5wYXJ0aXRpb25fbmFtZXMuc3BsaXQoIiwiKQorICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFzIHVuc2lnbmVkX3BheWxvYWQsIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFzIGR5bmFtaWNfcGFydGl0aW9uX2luZm9fZmlsZToKKyAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvX2ZpbGUud3JpdGVsaW5lcygKKyAgICAgICAgW2IidmlydHVhbF9hYj10cnVlXG4iLCBiInN1cGVyX3BhcnRpdGlvbl9ncm91cHM9XG4iXSkKKyAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvX2ZpbGUuZmx1c2goKQorICAgIGNtZCA9IFtSZXNvbHZlQmluYXJ5UGF0aCgiZGVsdGFfZ2VuZXJhdG9yIiwgYXJncy5zZWFyY2hfcGF0aCldCisgICAgY21kLmFwcGVuZCgiLS1wYXJ0aXRpb25fbmFtZXM9IiArICI6Ii5qb2luKGFyZ3MucGFydGl0aW9uX25hbWVzKSkKKyAgICBjbWQuYXBwZW5kKCItLWR5bmFtaWNfcGFydGl0aW9uX2luZm9fZmlsZT0iICsKKyAgICAgICAgICAgICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm9fZmlsZS5uYW1lKQorICAgIGNtZC5hcHBlbmQoIi0tb2xkX3BhcnRpdGlvbnM9IiArICI6Ii5qb2luKG9sZF9pbWdzKSkKKyAgICBjbWQuYXBwZW5kKCItLW5ld19wYXJ0aXRpb25zPSIgKyAiOiIuam9pbihhcmdzLmltYWdlcykpCisgICAgY21kLmFwcGVuZCgiLS1vdXRfZmlsZT0iICsgdW5zaWduZWRfcGF5bG9hZC5uYW1lKQorICAgIGNtZC5hcHBlbmQoIi0taXNfcGFydGlhbF91cGRhdGUiKQorICAgIGlmIGFyZ3MubWF4X3RpbWVzdGFtcDoKKyAgICAgIGNtZC5hcHBlbmQoIi0tbWF4X3RpbWVzdGFtcD0iICsgc3RyKGFyZ3MubWF4X3RpbWVzdGFtcCkpCisgICAgICBjbWQuYXBwZW5kKCItLXBhcnRpdGlvbl90aW1lc3RhbXBzPWJvb3Q6IiArIHN0cihhcmdzLm1heF90aW1lc3RhbXApKQorICAgIGxvZ2dlci5pbmZvKCJSdW5uaW5nICVzIiwgY21kKQorCisgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKGNtZCkKKyAgICBnZW5lcmF0b3IgPSBQYXlsb2FkR2VuZXJhdG9yKCkKKyAgICBnZW5lcmF0b3IucGF5bG9hZF9maWxlID0gdW5zaWduZWRfcGF5bG9hZC5uYW1lCisgICAgbG9nZ2VyLmluZm8oIlBheWxvYWQgc2l6ZTogJWQiLCBvcy5wYXRoLmdldHNpemUoZ2VuZXJhdG9yLnBheWxvYWRfZmlsZSkpCisKKyAgICAjIEdldCBzaWduaW5nIGtleXMKKyAgICBrZXlfcGFzc3dvcmRzID0gY29tbW9uLkdldEtleVBhc3N3b3JkcyhbYXJncy5wYWNrYWdlX2tleV0pCisKKyAgICBpZiBhcmdzLnBhY2thZ2Vfa2V5OgorICAgICAgbG9nZ2VyLmluZm8oIlNpZ25pbmcgcGF5bG9hZC4uLiIpCisgICAgICAjIFRPRE86IHJlbW92ZSBPUFRJT05TIHdoZW4gbm8gbG9uZ2VyIHVzZWQgYXMgZmFsbGJhY2sgaW4gcGF5bG9hZF9zaWduZXIKKyAgICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MgPSBOb25lCisgICAgICBjb21tb24uT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplID0gTm9uZQorICAgICAgc2lnbmVyID0gUGF5bG9hZFNpZ25lcihhcmdzLnBhY2thZ2Vfa2V5LCBhcmdzLnByaXZhdGVfa2V5X3N1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3Bhc3N3b3Jkc1thcmdzLnBhY2thZ2Vfa2V5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF9zaWduZXI9YXJncy5wYXlsb2FkX3NpZ25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF9zaWduZXJfYXJncz1hcmdzLnBheWxvYWRfc2lnbmVyX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemU9YXJncy5wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplKQorICAgICAgZ2VuZXJhdG9yLnBheWxvYWRfZmlsZSA9IHVuc2lnbmVkX3BheWxvYWQubmFtZQorICAgICAgZ2VuZXJhdG9yLlNpZ24oc2lnbmVyKQorCisgICAgbG9nZ2VyLmluZm8oIlBheWxvYWQgc2l6ZTogJWQiLCBvcy5wYXRoLmdldHNpemUoZ2VuZXJhdG9yLnBheWxvYWRfZmlsZSkpCisKKyAgICBsb2dnZXIuaW5mbygiV3JpdGluZyB0byAlcyIsIGFyZ3Mub3V0cHV0KQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGFyZ3Mub3V0cHV0LCAidyIpIGFzIHpmcDoKKyAgICAgIGdlbmVyYXRvci5Xcml0ZVRvWmlwKHpmcCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBsb2dnaW5nLmJhc2ljQ29uZmlnKCkKKyAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkgYi90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CmluZGV4IGU0MDI1NmMuLjk4NWNkNTYgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3RhcmdldF9maWxlcy5weQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiBBL0IgT1RBIHNwZWNpZmljIG9wdGlvbnMKIAogICAtLWRpc2FibGVfZmVjX2NvbXB1dGF0aW9uCi0gICAgICBEaXNhYmxlIHRoZSBvbiBkZXZpY2UgRkVDIGRhdGEgY29tcHV0YXRpb24gZm9yIGluY3JlbWVudGFsIHVwZGF0ZXMuCisgICAgICBEaXNhYmxlIHRoZSBvbiBkZXZpY2UgRkVDIGRhdGEgY29tcHV0YXRpb24gZm9yIGluY3JlbWVudGFsIHVwZGF0ZXMuIE9UQSB3aWxsIGJlIGxhcmdlciBidXQgaW5zdGFsbGF0aW9uIHdpbGwgYmUgZmFzdGVyLgogCiAgIC0taW5jbHVkZV9zZWNvbmRhcnkKICAgICAgIEFkZGl0aW9uYWxseSBpbmNsdWRlIHRoZSBwYXlsb2FkIGZvciBzZWNvbmRhcnkgc2xvdCBpbWFnZXMgKGRlZmF1bHQ6CkBAIC0xOTUsNiArMTk1LDggQEAKICAgICAgIHJvLnByb2R1Y3QuKiBwcm9wZXJ0aWVzIGFyZSBvdmVycmlkZGVuIGJ5IHRoZSAnaW1wb3J0JyBzdGF0ZW1lbnQuCiAgICAgICBUaGUgZmlsZSBleHBlY3RzIG9uZSBwcm9wZXJ0eSBwZXIgbGluZSwgYW5kIGVhY2ggbGluZSBoYXMgdGhlIGZvbGxvd2luZwogICAgICAgZm9ybWF0OiAncHJvcF9uYW1lPXZhbHVlMSx2YWx1ZTInLiBlLmcuICdyby5ib290LnByb2R1Y3Quc2t1PXN0ZCxwcm8nCisgICAgICBUaGUgcGF0aCBzcGVjaWZpZWQgY2FuIGVpdGhlciBiZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgb3IgdGhlIHBhdGggdG8gYSBmaWxlIGluc2lkZSBvZiBpbnB1dF90YXJnZXRfZmlsZXMuCiAKICAgLS1za2lwX3Bvc3RpbnN0YWxsCiAgICAgICBTa2lwIHRoZSBwb3N0aW5zdGFsbCBob29rcyB3aGVuIGdlbmVyYXRpbmcgYW4gQS9CIE9UQSBwYWNrYWdlIChkZWZhdWx0OgpAQCAtMjI0LDcgKzIyNiw3IEBACiAgICAgICB3YWl0IHRpbWUgaW4gcmVjb3ZlcnkuCiAKICAgLS1lbmFibGVfdmFiY194b3IKLSAgICAgIEVuYWJsZSB0aGUgVkFCQyB4b3IgZmVhdHVyZS4gV2lsbCByZWR1Y2Ugc3BhY2UgcmVxdWlyZW1lbnRzIGZvciBPVEEKKyAgICAgIEVuYWJsZSB0aGUgVkFCQyB4b3IgZmVhdHVyZS4gV2lsbCByZWR1Y2Ugc3BhY2UgcmVxdWlyZW1lbnRzIGZvciBPVEEsIGJ1dCBPVEEgaW5zdGFsbGF0aW9uIHdpbGwgYmUgc2xvd2VyLgogCiAgIC0tZm9yY2VfbWlub3JfdmVyc2lvbgogICAgICAgT3ZlcnJpZGUgdGhlIHVwZGF0ZV9lbmdpbmUgbWlub3IgdmVyc2lvbiBmb3IgZGVsdGEgZ2VuZXJhdGlvbi4KQEAgLTIzMyw3ICsyMzUsMTAgQEAKICAgICAgIEEgY29sb24gJzonIHNlcGFyYXRlZCBsaXN0IG9mIGNvbXByZXNzb3JzLiBBbGxvd2VkIHZhbHVlcyBhcmUgYnoyIGFuZCBicm90bGkuCiAKICAgLS1lbmFibGVfenVjY2hpbmkKLSAgICAgIFdoZXRoZXIgdG8gZW5hYmxlIHRvIHp1Y2NoaW5pIGZlYXR1cmUuIFdpbGwgZ2VuZXJhdGUgc21hbGxlciBPVEEgYnV0IHVzZXMgbW9yZSBtZW1vcnkuCisgICAgICBXaGV0aGVyIHRvIGVuYWJsZSB0byB6dWNjaGluaSBmZWF0dXJlLiBXaWxsIGdlbmVyYXRlIHNtYWxsZXIgT1RBIGJ1dCB1c2VzIG1vcmUgbWVtb3J5LCBPVEEgZ2VuZXJhdGlvbiB3aWxsIHRha2UgbG9uZ2VyLgorCisgIC0tZW5hYmxlX3B1ZmZkaWZmCisgICAgICBXaGV0aGVyIHRvIGVuYWJsZSB0byBwdWZmZGlmZiBmZWF0dXJlLiBXaWxsIGdlbmVyYXRlIHNtYWxsZXIgT1RBIGJ1dCB1c2VzIG1vcmUgbWVtb3J5LCBPVEEgZ2VuZXJhdGlvbiB3aWxsIHRha2UgbG9uZ2VyLgogCiAgIC0tZW5hYmxlX2x6NGRpZmYKICAgICAgIFdoZXRoZXIgdG8gZW5hYmxlIGx6NGRpZmYgZmVhdHVyZS4gV2lsbCBnZW5lcmF0ZSBzbWFsbGVyIE9UQSBmb3IgRVJPRlMgYnV0CkBAIC0yNDQsMTMgKzI0OSwyMSBAQAogICAgICAgb2xkZXIgU1BMLgogCiAgIC0tdmFiY19jb21wcmVzc2lvbl9wYXJhbQotICAgICAgQ29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIGJlIHVzZWQgZm9yIFZBQkMuIEF2YWlsYWJsZSBvcHRpb25zOiBneiwgYnJvdGxpLCBub25lCisgICAgICBDb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gYmUgdXNlZCBmb3IgVkFCQy4gQXZhaWxhYmxlIG9wdGlvbnM6IGd6LCBsejQsIHpzdGQsIGJyb3RsaSwgbm9uZS4gCisgICAgICBDb21wcmVzc2lvbiBsZXZlbCBjYW4gYmUgc3BlY2lmaWVkIGJ5IGFwcGVuZGluZyAiLCRMRVZFTCIgdG8gb3B0aW9uLiAKKyAgICAgIGUuZy4gLS12YWJjX2NvbXByZXNzaW9uX3BhcmFtPWd6LDkgc3BlY2lmaWVzIGxldmVsIDkgY29tcHJlc3Npb24gd2l0aCBneiBhbGdvcml0aG0KIAogICAtLXNlY3VyaXR5X3BhdGNoX2xldmVsCiAgICAgICBPdmVycmlkZSB0aGUgc2VjdXJpdHkgcGF0Y2ggbGV2ZWwgaW4gdGFyZ2V0IGZpbGVzCiAKICAgLS1tYXhfdGhyZWFkcwogICAgICAgU3BlY2lmeSBtYXggbnVtYmVyIG9mIHRocmVhZHMgYWxsb3dlZCB3aGVuIGdlbmVyYXRpbmcgQS9CIE9UQQorCisgIC0tdmFiY19jb3dfdmVyc2lvbgorICAgICAgU3BlY2lmeSB0aGUgVkFCQyBjb3cgdmVyc2lvbiB0byBiZSB1c2VkCisKKyAgLS1jb21wcmVzc2lvbl9mYWN0b3IKKyAgICAgIFNwZWNpZnkgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSB0byBiZSBjb21wcmVzc2VkIGF0IG9uY2UgZHVyaW5nIE9UQS4gc3VwcG9ydGVkIG9wdGlvbnM6IDRrLCA4aywgMTZrLCAzMmssIDY0aywgMTI4aywgMjU2awogIiIiCiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KQEAgLTI2MCw3ICsyNzMsNiBAQAogaW1wb3J0IG9zCiBpbXBvcnQgb3MucGF0aAogaW1wb3J0IHJlCi1pbXBvcnQgc2hsZXgKIGltcG9ydCBzaHV0aWwKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCkBAIC0yNjksMTEgKzI4MSwxMSBAQAogaW1wb3J0IGNhcmVfbWFwX3BiMgogaW1wb3J0IGNvbW1vbgogaW1wb3J0IG90YV91dGlscwotZnJvbSBvdGFfdXRpbHMgaW1wb3J0IChVTlpJUF9QQVRURVJOLCBGaW5hbGl6ZU1ldGFkYXRhLCBHZXRQYWNrYWdlTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRHZW5lcmF0b3IsIFNFQ1VSSVRZX1BBVENIX0xFVkVMX1BST1BfTkFNRSwgQ29weVRhcmdldEZpbGVzRGlyKQoraW1wb3J0IHBheWxvYWRfc2lnbmVyCitmcm9tIG90YV91dGlscyBpbXBvcnQgKFZBQkNfQ09NUFJFU1NJT05fUEFSQU1fU1VQUE9SVCwgRmluYWxpemVNZXRhZGF0YSwgR2V0UGFja2FnZU1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkR2VuZXJhdG9yLCBTRUNVUklUWV9QQVRDSF9MRVZFTF9QUk9QX05BTUUsIEV4dHJhY3RUYXJnZXRGaWxlcywgQ29weVRhcmdldEZpbGVzRGlyKQogZnJvbSBjb21tb24gaW1wb3J0IERvZXNJbnB1dEZpbGVDb250YWluLCBJc1NwYXJzZUltYWdlCiBpbXBvcnQgdGFyZ2V0X2ZpbGVzX2RpZmYKLWZyb20gY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmIGltcG9ydCBDaGVja1ZpbnRmSWZUcmVibGVFbmFibGVkCiBmcm9tIG5vbl9hYl9vdGEgaW1wb3J0IEdlbmVyYXRlTm9uQWJPdGFQYWNrYWdlCiBmcm9tIHBheWxvYWRfc2lnbmVyIGltcG9ydCBQYXlsb2FkU2lnbmVyCiAKQEAgLTMwNCw5ICszMTYsNiBAQAogT1BUSU9OUy5jYWNoZV9zaXplID0gTm9uZQogT1BUSU9OUy5zdGFzaF90aHJlc2hvbGQgPSAwLjgKIE9QVElPTlMubG9nX2RpZmYgPSBOb25lCi1PUFRJT05TLnBheWxvYWRfc2lnbmVyID0gTm9uZQotT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzID0gW10KLU9QVElPTlMucGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZSA9IE5vbmUKIE9QVElPTlMuZXh0cmFjdGVkX2lucHV0ID0gTm9uZQogT1BUSU9OUy5za2lwX3Bvc3RpbnN0YWxsID0gRmFsc2UKIE9QVElPTlMuc2tpcF9jb21wYXRpYmlsaXR5X2NoZWNrID0gRmFsc2UKQEAgLTMyMCwxNSArMzI5LDE5IEBACiBPUFRJT05TLmVuYWJsZV92YWJjX3hvciA9IFRydWUKIE9QVElPTlMuZm9yY2VfbWlub3JfdmVyc2lvbiA9IE5vbmUKIE9QVElPTlMuY29tcHJlc3Nvcl90eXBlcyA9IE5vbmUKLU9QVElPTlMuZW5hYmxlX3p1Y2NoaW5pID0gVHJ1ZQorT1BUSU9OUy5lbmFibGVfenVjY2hpbmkgPSBGYWxzZQorT1BUSU9OUy5lbmFibGVfcHVmZmRpZmYgPSBOb25lCiBPUFRJT05TLmVuYWJsZV9sejRkaWZmID0gRmFsc2UKIE9QVElPTlMudmFiY19jb21wcmVzc2lvbl9wYXJhbSA9IE5vbmUKIE9QVElPTlMuc2VjdXJpdHlfcGF0Y2hfbGV2ZWwgPSBOb25lCiBPUFRJT05TLm1heF90aHJlYWRzID0gTm9uZQorT1BUSU9OUy52YWJjX2Nvd192ZXJzaW9uID0gTm9uZQorT1BUSU9OUy5jb21wcmVzc2lvbl9mYWN0b3IgPSBOb25lCiAKIAogUE9TVElOU1RBTExfQ09ORklHID0gJ01FVEEvcG9zdGluc3RhbGxfY29uZmlnLnR4dCcKIERZTkFNSUNfUEFSVElUSU9OX0lORk8gPSAnTUVUQS9keW5hbWljX3BhcnRpdGlvbnNfaW5mby50eHQnCitNSVNDX0lORk8gPSAnTUVUQS9taXNjX2luZm8udHh0JwogQUJfUEFSVElUSU9OUyA9ICdNRVRBL2FiX3BhcnRpdGlvbnMudHh0JwogCiAjIEZpbGVzIHRvIGJlIHVuemlwcGVkIGZvciB0YXJnZXQgZGlmZmluZyBwdXJwb3NlLgpAQCAtMzU1LDYgKzM2OCwyNSBAQAogICAgIG9lbV9kaWN0cy5hcHBlbmQoY29tbW9uLkxvYWREaWN0aW9uYXJ5RnJvbUZpbGUob2VtX2ZpbGUpKQogICByZXR1cm4gb2VtX2RpY3RzCiAKK2RlZiBNb2RpZnlLZXl2YWx1ZUxpc3QoY29udGVudDogc3RyLCBrZXk6IHN0ciwgdmFsdWU6IHN0cik6CisgICIiIiBVcGRhdGUgdXBkYXRlIHRoZSBrZXkgdmFsdWUgbGlzdCB3aXRoIHNwZWNpZmllZCBrZXkgYW5kIHZhbHVlCisgIEFyZ3M6CisgICAgY29udGVudDogVGhlIHN0cmluZyBjb250ZW50IG9mIGR5bmFtaWNfcGFydGl0aW9uc19pbmZvLnR4dC4gRWFjaCBsaW5lCisgICAgICBzaG91bGQgYmUgYSBrZXkgdmFsdXIgcGFpciwgd2hlcmUgc3RyaW5nIGJlZm9yZSB0aGUgZmlyc3QgJz0nIGFyZSBrZXlzLAorICAgICAgcmVtYWluaW5nIHBhcnRzIGFyZSB2YWx1ZXMuCisgICAga2V5OiB0aGUga2V5IG9mIHRoZSBrZXkgdmFsdWUgcGFpciB0byBtb2RpZnkKKyAgICB2YWx1ZTogdGhlIG5ldyB2YWx1ZSB0byByZXBsYWNlIHdpdGgKKworICBSZXR1cm5zOgorICAgIFVwZGF0ZWQgY29udGVudCBvZiB0aGUga2V5IHZhbHVlIGxpc3QKKyAgIiIiCisgIG91dHB1dF9saXN0ID0gW10KKyAgZm9yIGxpbmUgaW4gY29udGVudC5zcGxpdGxpbmVzKCk6CisgICAgaWYgbGluZS5zdGFydHN3aXRoKGtleSsiPSIpOgorICAgICAgY29udGludWUKKyAgICBvdXRwdXRfbGlzdC5hcHBlbmQobGluZSkKKyAgb3V0cHV0X2xpc3QuYXBwZW5kKCJ7fT17fSIuZm9ybWF0KGtleSwgdmFsdWUpKQorICByZXR1cm4gIlxuIi5qb2luKG91dHB1dF9saXN0KQogCiBkZWYgTW9kaWZ5VkFCQ0NvbXByZXNzaW9uUGFyYW0oY29udGVudCwgYWxnbyk6CiAgICIiIiBVcGRhdGUgdXBkYXRlIFZBQkMgQ29tcHJlc3Npb24gUGFyYW0gaW4gZHluYW1pY19wYXJ0aXRpb25zX2luZm8udHh0CkBAIC0zNjUsMTMgKzM5Nyw3IEBACiAgIFJldHVybnM6CiAgICAgVXBkYXRlZCBjb250ZW50IG9mIGR5bmFtaWNfcGFydGl0aW9uc19pbmZvLnR4dCAsIHdpdGggY3VzdG9tIGNvbXByZXNzaW9uIGFsZ28KICAgIiIiCi0gIG91dHB1dF9saXN0ID0gW10KLSAgZm9yIGxpbmUgaW4gY29udGVudC5zcGxpdGxpbmVzKCk6Ci0gICAgaWYgbGluZS5zdGFydHN3aXRoKCJ2aXJ0dWFsX2FiX2NvbXByZXNzaW9uX21ldGhvZD0iKToKLSAgICAgIGNvbnRpbnVlCi0gICAgb3V0cHV0X2xpc3QuYXBwZW5kKGxpbmUpCi0gIG91dHB1dF9saXN0LmFwcGVuZCgidmlydHVhbF9hYl9jb21wcmVzc2lvbl9tZXRob2Q9IithbGdvKQotICByZXR1cm4gIlxuIi5qb2luKG91dHB1dF9saXN0KQorICByZXR1cm4gTW9kaWZ5S2V5dmFsdWVMaXN0KGNvbnRlbnQsICJ2aXJ0dWFsX2FiX2NvbXByZXNzaW9uX21ldGhvZCIsIGFsZ28pCiAKIAogZGVmIFVwZGF0ZXNJbmZvRm9yU3BlY2lhbFVwZGF0ZXMoY29udGVudCwgcGFydGl0aW9uc19maWx0ZXIsCkBAIC00NTcsNDggKzQ4Myw1MSBAQAogICB0YXJnZXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJ0YXJnZXRmaWxlcy0iLCBzdWZmaXg9Ii56aXAiKQogICB0YXJnZXRfemlwID0gemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlLCAndycsIGFsbG93WmlwNjQ9VHJ1ZSkKIAotICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCAncicsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgaW5wdXRfemlwOgotICAgIGluZm9saXN0ID0gaW5wdXRfemlwLmluZm9saXN0KCkKKyAgZmlsZXNsaXN0ID0gW10KKyAgZm9yIChyb290LCBkaXJzLCBmaWxlcykgaW4gb3Mud2FsayhpbnB1dF9maWxlKToKKyAgICByb290ID0gcm9vdC5sc3RyaXAoaW5wdXRfZmlsZSkubHN0cmlwKCIvIikKKyAgICBmaWxlc2xpc3QuZXh0ZW5kKFtvcy5wYXRoLmpvaW4ocm9vdCwgZCkgZm9yIGQgaW4gZGlyc10pCisgICAgZmlsZXNsaXN0LmV4dGVuZChbb3MucGF0aC5qb2luKHJvb3QsIGQpIGZvciBkIGluIGZpbGVzXSkKIAotICBpbnB1dF90bXAgPSBjb21tb24uVW56aXBUZW1wKGlucHV0X2ZpbGUsIFVOWklQX1BBVFRFUk4pCi0gIGZvciBpbmZvIGluIGluZm9saXN0OgotICAgIHVuemlwcGVkX2ZpbGUgPSBvcy5wYXRoLmpvaW4oaW5wdXRfdG1wLCAqaW5mby5maWxlbmFtZS5zcGxpdCgnLycpKQotICAgIGlmIGluZm8uZmlsZW5hbWUgPT0gJ0lNQUdFUy9zeXN0ZW1fb3RoZXIuaW1nJzoKKyAgaW5wdXRfdG1wID0gaW5wdXRfZmlsZQorICBmb3IgZmlsZW5hbWUgaW4gZmlsZXNsaXN0OgorICAgIHVuemlwcGVkX2ZpbGUgPSBvcy5wYXRoLmpvaW4oaW5wdXRfdG1wLCAqZmlsZW5hbWUuc3BsaXQoJy8nKSkKKyAgICBpZiBmaWxlbmFtZSA9PSAnSU1BR0VTL3N5c3RlbV9vdGhlci5pbWcnOgogICAgICAgY29tbW9uLlppcFdyaXRlKHRhcmdldF96aXAsIHVuemlwcGVkX2ZpbGUsIGFyY25hbWU9J0lNQUdFUy9zeXN0ZW0uaW1nJykKIAogICAgICMgUHJpbWFyeSBpbWFnZXMgYW5kIGZyaWVuZHMgbmVlZCB0byBiZSBza2lwcGVkIGV4cGxpY2l0bHkuCi0gICAgZWxpZiBpbmZvLmZpbGVuYW1lIGluICgnSU1BR0VTL3N5c3RlbS5pbWcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lNQUdFUy9zeXN0ZW0ubWFwJyk6CisgICAgZWxpZiBmaWxlbmFtZSBpbiAoJ0lNQUdFUy9zeXN0ZW0uaW1nJywKKyAgICAgICAgICAgICAgICAgICAgICAnSU1BR0VTL3N5c3RlbS5tYXAnKToKICAgICAgIHBhc3MKIAogICAgICMgQ29weSBpbWFnZXMgdGhhdCBhcmUgbm90IGluIFNFQ09OREFSWV9QQVlMT0FEX1NLSVBQRURfSU1BR0VTLgotICAgIGVsaWYgaW5mby5maWxlbmFtZS5zdGFydHN3aXRoKCgnSU1BR0VTLycsICdSQURJTy8nKSk6Ci0gICAgICBpbWFnZV9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShpbmZvLmZpbGVuYW1lKQorICAgIGVsaWYgZmlsZW5hbWUuc3RhcnRzd2l0aCgoJ0lNQUdFUy8nLCAnUkFESU8vJykpOgorICAgICAgaW1hZ2VfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCiAgICAgICBpZiBpbWFnZV9uYW1lIG5vdCBpbiBbJ3t9LmltZycuZm9ybWF0KHBhcnRpdGlvbikgZm9yIHBhcnRpdGlvbiBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ09OREFSWV9QQVlMT0FEX1NLSVBQRURfSU1BR0VTXToKLSAgICAgICAgY29tbW9uLlppcFdyaXRlKHRhcmdldF96aXAsIHVuemlwcGVkX2ZpbGUsIGFyY25hbWU9aW5mby5maWxlbmFtZSkKKyAgICAgICAgY29tbW9uLlppcFdyaXRlKHRhcmdldF96aXAsIHVuemlwcGVkX2ZpbGUsIGFyY25hbWU9ZmlsZW5hbWUpCiAKICAgICAjIFNraXAgY29weWluZyB0aGUgcG9zdGluc3RhbGwgY29uZmlnIGlmIHJlcXVlc3RlZC4KLSAgICBlbGlmIHNraXBfcG9zdGluc3RhbGwgYW5kIGluZm8uZmlsZW5hbWUgPT0gUE9TVElOU1RBTExfQ09ORklHOgorICAgIGVsaWYgc2tpcF9wb3N0aW5zdGFsbCBhbmQgZmlsZW5hbWUgPT0gUE9TVElOU1RBTExfQ09ORklHOgogICAgICAgcGFzcwogCi0gICAgZWxpZiBpbmZvLmZpbGVuYW1lLnN0YXJ0c3dpdGgoJ01FVEEvJyk6CisgICAgZWxpZiBmaWxlbmFtZS5zdGFydHN3aXRoKCdNRVRBLycpOgogICAgICAgIyBSZW1vdmUgdGhlIHVubmVjZXNzYXJ5IHBhcnRpdGlvbnMgZm9yIHNlY29uZGFyeSBpbWFnZXMgZnJvbSB0aGUKICAgICAgICMgYWJfcGFydGl0aW9ucyBmaWxlLgotICAgICAgaWYgaW5mby5maWxlbmFtZSA9PSBBQl9QQVJUSVRJT05TOgorICAgICAgaWYgZmlsZW5hbWUgPT0gQUJfUEFSVElUSU9OUzoKICAgICAgICAgd2l0aCBvcGVuKHVuemlwcGVkX2ZpbGUpIGFzIGY6CiAgICAgICAgICAgcGFydGl0aW9uX2xpc3QgPSBmLnJlYWQoKS5zcGxpdGxpbmVzKCkKICAgICAgICAgcGFydGl0aW9uX2xpc3QgPSBbcGFydGl0aW9uIGZvciBwYXJ0aXRpb24gaW4gcGFydGl0aW9uX2xpc3QgaWYgcGFydGl0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBwYXJ0aXRpb24gbm90IGluIFNFQ09OREFSWV9QQVlMT0FEX1NLSVBQRURfSU1BR0VTXQotICAgICAgICBjb21tb24uWmlwV3JpdGVTdHIodGFyZ2V0X3ppcCwgaW5mby5maWxlbmFtZSwKKyAgICAgICAgY29tbW9uLlppcFdyaXRlU3RyKHRhcmdldF96aXAsIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJy5qb2luKHBhcnRpdGlvbl9saXN0KSkKICAgICAgICMgUmVtb3ZlIHRoZSB1bm5lY2Vzc2FyeSBwYXJ0aXRpb25zIGZyb20gdGhlIGR5bmFtaWMgcGFydGl0aW9ucyBsaXN0LgotICAgICAgZWxpZiAoaW5mby5maWxlbmFtZSA9PSAnTUVUQS9taXNjX2luZm8udHh0JyBvcgotICAgICAgICAgICAgaW5mby5maWxlbmFtZSA9PSBEWU5BTUlDX1BBUlRJVElPTl9JTkZPKToKKyAgICAgIGVsaWYgKGZpbGVuYW1lID09ICdNRVRBL21pc2NfaW5mby50eHQnIG9yCisgICAgICAgICAgICBmaWxlbmFtZSA9PSBEWU5BTUlDX1BBUlRJVElPTl9JTkZPKToKICAgICAgICAgbW9kaWZpZWRfaW5mbyA9IEdldEluZm9Gb3JTZWNvbmRhcnlJbWFnZXModW56aXBwZWRfZmlsZSkKLSAgICAgICAgY29tbW9uLlppcFdyaXRlU3RyKHRhcmdldF96aXAsIGluZm8uZmlsZW5hbWUsIG1vZGlmaWVkX2luZm8pCisgICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cih0YXJnZXRfemlwLCBmaWxlbmFtZSwgbW9kaWZpZWRfaW5mbykKICAgICAgIGVsc2U6Ci0gICAgICAgIGNvbW1vbi5aaXBXcml0ZSh0YXJnZXRfemlwLCB1bnppcHBlZF9maWxlLCBhcmNuYW1lPWluZm8uZmlsZW5hbWUpCisgICAgICAgIGNvbW1vbi5aaXBXcml0ZSh0YXJnZXRfemlwLCB1bnppcHBlZF9maWxlLCBhcmNuYW1lPWZpbGVuYW1lKQogCiAgIGNvbW1vbi5aaXBDbG9zZSh0YXJnZXRfemlwKQogCkBAIC01MTksMjEgKzU0OCw0NSBAQAogICBSZXR1cm5zOgogICAgIFRoZSBmaWxlbmFtZSBvZiB0YXJnZXQtZmlsZXMuemlwIHRoYXQgZG9lc24ndCBjb250YWluIHBvc3RpbnN0YWxsIGNvbmZpZy4KICAgIiIiCi0gICMgV2Ugc2hvdWxkIG9ubHkgbWFrZSBhIGNvcHkgaWYgcG9zdGluc3RhbGxfY29uZmlnIGVudHJ5IGV4aXN0cy4KLSAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgJ3InLCBhbGxvd1ppcDY0PVRydWUpIGFzIGlucHV0X3ppcDoKLSAgICBpZiBQT1NUSU5TVEFMTF9DT05GSUcgbm90IGluIGlucHV0X3ppcC5uYW1lbGlzdCgpOgotICAgICAgcmV0dXJuIGlucHV0X2ZpbGUKLQotICB0YXJnZXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJ0YXJnZXRmaWxlcy0iLCBzdWZmaXg9Ii56aXAiKQotICBzaHV0aWwuY29weWZpbGUoaW5wdXRfZmlsZSwgdGFyZ2V0X2ZpbGUpCi0gIGNvbW1vbi5aaXBEZWxldGUodGFyZ2V0X2ZpbGUsIFBPU1RJTlNUQUxMX0NPTkZJRykKLSAgcmV0dXJuIHRhcmdldF9maWxlCisgIGNvbmZpZ19wYXRoID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsIFBPU1RJTlNUQUxMX0NPTkZJRykKKyAgaWYgb3MucGF0aC5leGlzdHMoY29uZmlnX3BhdGgpOgorICAgIG9zLnVubGluayhjb25maWdfcGF0aCkKKyAgcmV0dXJuIGlucHV0X2ZpbGUKIAogCiBkZWYgUGFyc2VJbmZvRGljdCh0YXJnZXRfZmlsZV9wYXRoKToKLSAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVfcGF0aCwgJ3InLCBhbGxvd1ppcDY0PVRydWUpIGFzIHpmcDoKLSAgICByZXR1cm4gY29tbW9uLkxvYWRJbmZvRGljdCh6ZnApCisgIHJldHVybiBjb21tb24uTG9hZEluZm9EaWN0KHRhcmdldF9maWxlX3BhdGgpCiAKK2RlZiBNb2RpZnlUYXJnZXRGaWxlc0R5bmFtaWNQYXJ0aXRpb25JbmZvKGlucHV0X2ZpbGUsIGtleSwgdmFsdWUpOgorICAiIiJSZXR1cm5zIGEgdGFyZ2V0LWZpbGVzLnppcCB3aXRoIGEgY3VzdG9tIFZBQkMgY29tcHJlc3Npb24gcGFyYW0uCisgIEFyZ3M6CisgICAgaW5wdXRfZmlsZTogVGhlIGlucHV0IHRhcmdldC1maWxlcy56aXAgcGF0aAorICAgIHZhYmNfY29tcHJlc3Npb25fcGFyYW06IEN1c3RvbSBWaXJ0dWFsIEFCIENvbXByZXNzaW9uIGFsZ29yaXRobQorCisgIFJldHVybnM6CisgICAgVGhlIHBhdGggdG8gbW9kaWZpZWQgdGFyZ2V0LWZpbGVzLnppcAorICAiIiIKKyAgaWYgb3MucGF0aC5pc2RpcihpbnB1dF9maWxlKToKKyAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvX3BhdGggPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIGlucHV0X2ZpbGUsICpEWU5BTUlDX1BBUlRJVElPTl9JTkZPLnNwbGl0KCIvIikpCisgICAgd2l0aCBvcGVuKGR5bmFtaWNfcGFydGl0aW9uX2luZm9fcGF0aCwgInIiKSBhcyBmcDoKKyAgICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm8gPSBmcC5yZWFkKCkKKyAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvID0gTW9kaWZ5S2V5dmFsdWVMaXN0KAorICAgICAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvLCBrZXksIHZhbHVlKQorICAgIHdpdGggb3BlbihkeW5hbWljX3BhcnRpdGlvbl9pbmZvX3BhdGgsICJ3IikgYXMgZnA6CisgICAgICBmcC53cml0ZShkeW5hbWljX3BhcnRpdGlvbl9pbmZvKQorICAgIHJldHVybiBpbnB1dF9maWxlCisKKyAgdGFyZ2V0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0idGFyZ2V0ZmlsZXMtIiwgc3VmZml4PSIuemlwIikKKyAgc2h1dGlsLmNvcHlmaWxlKGlucHV0X2ZpbGUsIHRhcmdldF9maWxlKQorICBjb21tb24uWmlwRGVsZXRlKHRhcmdldF9maWxlLCBEWU5BTUlDX1BBUlRJVElPTl9JTkZPKQorICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCAncicsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgemZwOgorICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm8gPSB6ZnAucmVhZChEWU5BTUlDX1BBUlRJVElPTl9JTkZPKS5kZWNvZGUoKQorICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm8gPSBNb2RpZnlLZXl2YWx1ZUxpc3QoCisgICAgICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm8sIGtleSwgdmFsdWUpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGUsICJhIiwgYWxsb3daaXA2ND1UcnVlKSBhcyBvdXRwdXRfemlwOgorICAgICAgb3V0cHV0X3ppcC53cml0ZXN0cihEWU5BTUlDX1BBUlRJVElPTl9JTkZPLCBkeW5hbWljX3BhcnRpdGlvbl9pbmZvKQorICByZXR1cm4gdGFyZ2V0X2ZpbGUKIAogZGVmIEdldFRhcmdldEZpbGVzWmlwRm9yQ3VzdG9tVkFCQ0NvbXByZXNzaW9uKGlucHV0X2ZpbGUsIHZhYmNfY29tcHJlc3Npb25fcGFyYW0pOgogICAiIiJSZXR1cm5zIGEgdGFyZ2V0LWZpbGVzLnppcCB3aXRoIGEgY3VzdG9tIFZBQkMgY29tcHJlc3Npb24gcGFyYW0uCkBAIC01NDQsMTYgKzU5Nyw3IEBACiAgIFJldHVybnM6CiAgICAgVGhlIHBhdGggdG8gbW9kaWZpZWQgdGFyZ2V0LWZpbGVzLnppcAogICAiIiIKLSAgdGFyZ2V0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0idGFyZ2V0ZmlsZXMtIiwgc3VmZml4PSIuemlwIikKLSAgc2h1dGlsLmNvcHlmaWxlKGlucHV0X2ZpbGUsIHRhcmdldF9maWxlKQotICBjb21tb24uWmlwRGVsZXRlKHRhcmdldF9maWxlLCBEWU5BTUlDX1BBUlRJVElPTl9JTkZPKQotICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCAncicsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgemZwOgotICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm8gPSB6ZnAucmVhZChEWU5BTUlDX1BBUlRJVElPTl9JTkZPKS5kZWNvZGUoKQotICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm8gPSBNb2RpZnlWQUJDQ29tcHJlc3Npb25QYXJhbSgKLSAgICAgICAgZHluYW1pY19wYXJ0aXRpb25faW5mbywgdmFiY19jb21wcmVzc2lvbl9wYXJhbSkKLSAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZSwgImEiLCBhbGxvd1ppcDY0PVRydWUpIGFzIG91dHB1dF96aXA6Ci0gICAgICBvdXRwdXRfemlwLndyaXRlc3RyKERZTkFNSUNfUEFSVElUSU9OX0lORk8sIGR5bmFtaWNfcGFydGl0aW9uX2luZm8pCi0gIHJldHVybiB0YXJnZXRfZmlsZQorICByZXR1cm4gTW9kaWZ5VGFyZ2V0RmlsZXNEeW5hbWljUGFydGl0aW9uSW5mbyhpbnB1dF9maWxlLCAidmlydHVhbF9hYl9jb21wcmVzc2lvbl9tZXRob2QiLCB2YWJjX2NvbXByZXNzaW9uX3BhcmFtKQogCiAKIGRlZiBHZXRUYXJnZXRGaWxlc1ppcEZvclBhcnRpYWxVcGRhdGVzKGlucHV0X2ZpbGUsIGFiX3BhcnRpdGlvbnMpOgpAQCAtNTYxLDcgKzYwNSw3IEBACiAKICAgVGhpcyBmdW5jdGlvbiBtb2RpZmllcyBhYl9wYXJ0aXRpb25zIGxpc3Qgd2l0aCB0aGUgZGVzaXJlZCBwYXJ0aXRpb25zIGJlZm9yZQogICBjYWxsaW5nIHRoZSBicmlsbG9fdXBkYXRlX3BheWxvYWQgc2NyaXB0LiBJdCBhbHNvIGNsZWFucyB1cCB0aGUgcmVmZXJlbmNlIHRvCi0gIHRoZSBleGNsdWRlZCBwYXJ0aXRpb25zIGluIHRoZSBpbmZvIGZpbGUsIGUuZyBtaXNjX2luZm8udHh0LgorICB0aGUgZXhjbHVkZWQgcGFydGl0aW9ucyBpbiB0aGUgaW5mbyBmaWxlLCBlLmcuIG1pc2NfaW5mby50eHQuCiAKICAgQXJnczoKICAgICBpbnB1dF9maWxlOiBUaGUgaW5wdXQgdGFyZ2V0LWZpbGVzLnppcCBmaWxlbmFtZS4KQEAgLTU3MSwyMyArNjE1LDcgQEAKICAgICBUaGUgZmlsZW5hbWUgb2YgdGFyZ2V0LWZpbGVzLnppcCB1c2VkIGZvciBwYXJ0aWFsIG90YSB1cGRhdGUuCiAgICIiIgogCi0gIGRlZiBBZGRJbWFnZUZvclBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSk6Ci0gICAgIiIiQWRkIHRoZSBhcmNoaXZlIG5hbWUgZm9yIGEgZ2l2ZW4gcGFydGl0aW9uIHRvIHRoZSBjb3B5IGxpc3QuIiIiCi0gICAgZm9yIHByZWZpeCBpbiBbJ0lNQUdFUycsICdSQURJTyddOgotICAgICAgaW1hZ2VfcGF0aCA9ICd7fS97fS5pbWcnLmZvcm1hdChwcmVmaXgsIHBhcnRpdGlvbl9uYW1lKQotICAgICAgaWYgaW1hZ2VfcGF0aCBpbiBuYW1lbGlzdDoKLSAgICAgICAgY29weV9lbnRyaWVzLmFwcGVuZChpbWFnZV9wYXRoKQotICAgICAgICBtYXBfcGF0aCA9ICd7fS97fS5tYXAnLmZvcm1hdChwcmVmaXgsIHBhcnRpdGlvbl9uYW1lKQotICAgICAgICBpZiBtYXBfcGF0aCBpbiBuYW1lbGlzdDoKLSAgICAgICAgICBjb3B5X2VudHJpZXMuYXBwZW5kKG1hcF9wYXRoKQotICAgICAgICByZXR1cm4KLQotICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBmaW5kIHt9IGluIGlucHV0IHppcGZpbGUiLmZvcm1hdChwYXJ0aXRpb25fbmFtZSkpCi0KLSAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgYWxsb3daaXA2ND1UcnVlKSBhcyBpbnB1dF96aXA6Ci0gICAgb3JpZ2luYWxfYWJfcGFydGl0aW9ucyA9IGlucHV0X3ppcC5yZWFkKAotICAgICAgICBBQl9QQVJUSVRJT05TKS5kZWNvZGUoKS5zcGxpdGxpbmVzKCkKLSAgICBuYW1lbGlzdCA9IGlucHV0X3ppcC5uYW1lbGlzdCgpCisgIG9yaWdpbmFsX2FiX3BhcnRpdGlvbnMgPSBjb21tb24uUmVhZEZyb21JbnB1dEZpbGUoaW5wdXRfZmlsZSwgQUJfUEFSVElUSU9OUykKIAogICB1bnJlY29nbml6ZWRfcGFydGl0aW9ucyA9IFtwYXJ0aXRpb24gZm9yIHBhcnRpdGlvbiBpbiBhYl9wYXJ0aXRpb25zIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiBub3QgaW4gb3JpZ2luYWxfYWJfcGFydGl0aW9uc10KQEAgLTU5Niw1MCArNjI0LDY4IEBACiAgICAgICAgICAgICAgICAgICAgICB1bnJlY29nbml6ZWRfcGFydGl0aW9ucykKIAogICBsb2dnZXIuaW5mbygiR2VuZXJhdGluZyBwYXJ0aWFsIHVwZGF0ZXMgZm9yICVzIiwgYWJfcGFydGl0aW9ucykKKyAgZm9yIHN1YmRpciBpbiBbIklNQUdFUyIsICJSQURJTyIsICJQUkVCVUlMVF9JTUFHRVMiXToKKyAgICBpbWFnZV9kaXIgPSBvcy5wYXRoLmpvaW4oc3ViZGlyKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpbWFnZV9kaXIpOgorICAgICAgY29udGludWUKKyAgICBmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihpbWFnZV9kaXIpOgorICAgICAgZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oaW1hZ2VfZGlyLCBmaWxlbmFtZSkKKyAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIuaW1nIik6CisgICAgICAgIHBhcnRpdGlvbl9uYW1lID0gZmlsZW5hbWUucmVtb3Zlc3VmZml4KCIuaW1nIikKKyAgICAgICAgaWYgcGFydGl0aW9uX25hbWUgbm90IGluIGFiX3BhcnRpdGlvbnM6CisgICAgICAgICAgb3MudW5saW5rKGZpbGVwYXRoKQogCi0gIGNvcHlfZW50cmllcyA9IFsnTUVUQS91cGRhdGVfZW5naW5lX2NvbmZpZy50eHQnXQotICBmb3IgcGFydGl0aW9uX25hbWUgaW4gYWJfcGFydGl0aW9uczoKLSAgICBBZGRJbWFnZUZvclBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSkKKyAgY29tbW9uLldyaXRlVG9JbnB1dEZpbGUoaW5wdXRfZmlsZSwgJ01FVEEvYWJfcGFydGl0aW9ucy50eHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nLmpvaW4oYWJfcGFydGl0aW9ucykpCisgIENBUkVfTUFQX0VOVFJZID0gIk1FVEEvY2FyZV9tYXAucGIiCisgIGlmIERvZXNJbnB1dEZpbGVDb250YWluKGlucHV0X2ZpbGUsIENBUkVfTUFQX0VOVFJZKToKKyAgICBjYXJlbWFwID0gY2FyZV9tYXBfcGIyLkNhcmVNYXAoKQorICAgIGNhcmVtYXAuUGFyc2VGcm9tU3RyaW5nKAorICAgICAgICBjb21tb24uUmVhZEJ5dGVzRnJvbUlucHV0RmlsZShpbnB1dF9maWxlLCBDQVJFX01BUF9FTlRSWSkpCisgICAgZmlsdGVyZWQgPSBbCisgICAgICAgIHBhcnQgZm9yIHBhcnQgaW4gY2FyZW1hcC5wYXJ0aXRpb25zIGlmIHBhcnQubmFtZSBpbiBhYl9wYXJ0aXRpb25zXQorICAgIGRlbCBjYXJlbWFwLnBhcnRpdGlvbnNbOl0KKyAgICBjYXJlbWFwLnBhcnRpdGlvbnMuZXh0ZW5kKGZpbHRlcmVkKQorICAgIGNvbW1vbi5Xcml0ZUJ5dGVzVG9JbnB1dEZpbGUoaW5wdXRfZmlsZSwgQ0FSRV9NQVBfRU5UUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJlbWFwLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCiAKLSAgIyBVc2UgemlwMnppcCB0byBhdm9pZCBleHRyYWN0aW5nIHRoZSB6aXBmaWxlLgotICBwYXJ0aWFsX3RhcmdldF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQotICBjbWQgPSBbJ3ppcDJ6aXAnLCAnLWknLCBpbnB1dF9maWxlLCAnLW8nLCBwYXJ0aWFsX3RhcmdldF9maWxlXQotICBjbWQuZXh0ZW5kKFsne306e30nLmZvcm1hdChuYW1lLCBuYW1lKSBmb3IgbmFtZSBpbiBjb3B5X2VudHJpZXNdKQotICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQorICBmb3IgaW5mb19maWxlIGluIFsnTUVUQS9taXNjX2luZm8udHh0JywgRFlOQU1JQ19QQVJUSVRJT05fSU5GT106CisgICAgaWYgbm90IERvZXNJbnB1dEZpbGVDb250YWluKGlucHV0X2ZpbGUsIGluZm9fZmlsZSk6CisgICAgICBsb2dnZXIud2FybmluZygnQ2Fubm90IGZpbmQgJXMgaW4gaW5wdXQgemlwZmlsZScsIGluZm9fZmlsZSkKKyAgICAgIGNvbnRpbnVlCiAKLSAgcGFydGlhbF90YXJnZXRfemlwID0gemlwZmlsZS5aaXBGaWxlKHBhcnRpYWxfdGFyZ2V0X2ZpbGUsICdhJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9VHJ1ZSkKLSAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgYWxsb3daaXA2ND1UcnVlKSBhcyBpbnB1dF96aXA6Ci0gICAgY29tbW9uLlppcFdyaXRlU3RyKHBhcnRpYWxfdGFyZ2V0X3ppcCwgJ01FVEEvYWJfcGFydGl0aW9ucy50eHQnLAotICAgICAgICAgICAgICAgICAgICAgICAnXG4nLmpvaW4oYWJfcGFydGl0aW9ucykpCi0gICAgQ0FSRV9NQVBfRU5UUlkgPSAiTUVUQS9jYXJlX21hcC5wYiIKLSAgICBpZiBDQVJFX01BUF9FTlRSWSBpbiBpbnB1dF96aXAubmFtZWxpc3QoKToKLSAgICAgIGNhcmVtYXAgPSBjYXJlX21hcF9wYjIuQ2FyZU1hcCgpCi0gICAgICBjYXJlbWFwLlBhcnNlRnJvbVN0cmluZyhpbnB1dF96aXAucmVhZChDQVJFX01BUF9FTlRSWSkpCi0gICAgICBmaWx0ZXJlZCA9IFsKLSAgICAgICAgICBwYXJ0IGZvciBwYXJ0IGluIGNhcmVtYXAucGFydGl0aW9ucyBpZiBwYXJ0Lm5hbWUgaW4gYWJfcGFydGl0aW9uc10KLSAgICAgIGRlbCBjYXJlbWFwLnBhcnRpdGlvbnNbOl0KLSAgICAgIGNhcmVtYXAucGFydGl0aW9ucy5leHRlbmQoZmlsdGVyZWQpCi0gICAgICBjb21tb24uWmlwV3JpdGVTdHIocGFydGlhbF90YXJnZXRfemlwLCBDQVJFX01BUF9FTlRSWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXJlbWFwLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgY29udGVudCA9IGNvbW1vbi5SZWFkRnJvbUlucHV0RmlsZShpbnB1dF9maWxlLCBpbmZvX2ZpbGUpCisgICAgbW9kaWZpZWRfaW5mbyA9IFVwZGF0ZXNJbmZvRm9yU3BlY2lhbFVwZGF0ZXMoCisgICAgICAgIGNvbnRlbnQsIGxhbWJkYSBwOiBwIGluIGFiX3BhcnRpdGlvbnMpCisgICAgaWYgT1BUSU9OUy52YWJjX2NvbXByZXNzaW9uX3BhcmFtIGFuZCBpbmZvX2ZpbGUgPT0gRFlOQU1JQ19QQVJUSVRJT05fSU5GTzoKKyAgICAgIG1vZGlmaWVkX2luZm8gPSBNb2RpZnlWQUJDQ29tcHJlc3Npb25QYXJhbSgKKyAgICAgICAgICBtb2RpZmllZF9pbmZvLCBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0pCisgICAgY29tbW9uLldyaXRlVG9JbnB1dEZpbGUoaW5wdXRfZmlsZSwgaW5mb19maWxlLCBtb2RpZmllZF9pbmZvKQogCi0gICAgZm9yIGluZm9fZmlsZSBpbiBbJ01FVEEvbWlzY19pbmZvLnR4dCcsIERZTkFNSUNfUEFSVElUSU9OX0lORk9dOgotICAgICAgaWYgaW5mb19maWxlIG5vdCBpbiBpbnB1dF96aXAubmFtZWxpc3QoKToKLSAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0Nhbm5vdCBmaW5kICVzIGluIGlucHV0IHppcGZpbGUnLCBpbmZvX2ZpbGUpCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICBjb250ZW50ID0gaW5wdXRfemlwLnJlYWQoaW5mb19maWxlKS5kZWNvZGUoKQotICAgICAgbW9kaWZpZWRfaW5mbyA9IFVwZGF0ZXNJbmZvRm9yU3BlY2lhbFVwZGF0ZXMoCi0gICAgICAgICAgY29udGVudCwgbGFtYmRhIHA6IHAgaW4gYWJfcGFydGl0aW9ucykKLSAgICAgIGlmIE9QVElPTlMudmFiY19jb21wcmVzc2lvbl9wYXJhbSBhbmQgaW5mb19maWxlID09IERZTkFNSUNfUEFSVElUSU9OX0lORk86Ci0gICAgICAgIG1vZGlmaWVkX2luZm8gPSBNb2RpZnlWQUJDQ29tcHJlc3Npb25QYXJhbSgKLSAgICAgICAgICAgIG1vZGlmaWVkX2luZm8sIE9QVElPTlMudmFiY19jb21wcmVzc2lvbl9wYXJhbSkKLSAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihwYXJ0aWFsX3RhcmdldF96aXAsIGluZm9fZmlsZSwgbW9kaWZpZWRfaW5mbykKKyAgZGVmIElzSW5QYXJ0aWFsTGlzdChwb3N0aW5zdGFsbF9saW5lOiBzdHIpOgorICAgIGlkeCA9IHBvc3RpbnN0YWxsX2xpbmUuZmluZCgiPSIpCisgICAgaWYgaWR4IDwgMDoKKyAgICAgIHJldHVybiBGYWxzZQorICAgIGtleSA9IHBvc3RpbnN0YWxsX2xpbmVbOmlkeF0KKyAgICBsb2dnZXIuaW5mbygiJXMgJXMiLCBrZXksIGFiX3BhcnRpdGlvbnMpCisgICAgZm9yIHBhcnQgaW4gYWJfcGFydGl0aW9uczoKKyAgICAgIGlmIGtleS5lbmRzd2l0aCgiXyIgKyBwYXJ0KToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKIAotICAgICMgVE9ETyh4dW5jaGFuZykgaGFuZGxlIE1FVEEvcG9zdGluc3RhbGxfY29uZmlnLnR4dCcKKyAgaWYgY29tbW9uLkRvZXNJbnB1dEZpbGVDb250YWluKGlucHV0X2ZpbGUsIFBPU1RJTlNUQUxMX0NPTkZJRyk6CisgICAgcG9zdGluc3RhbGxfY29uZmlnID0gY29tbW9uLlJlYWRGcm9tSW5wdXRGaWxlKAorICAgICAgICBpbnB1dF9maWxlLCBQT1NUSU5TVEFMTF9DT05GSUcpCisgICAgcG9zdGluc3RhbGxfY29uZmlnID0gWworICAgICAgICBsaW5lIGZvciBsaW5lIGluIHBvc3RpbnN0YWxsX2NvbmZpZy5zcGxpdGxpbmVzKCkgaWYgSXNJblBhcnRpYWxMaXN0KGxpbmUpXQorICAgIGlmIHBvc3RpbnN0YWxsX2NvbmZpZzoKKyAgICAgIHBvc3RpbnN0YWxsX2NvbmZpZyA9ICJcbiIuam9pbihwb3N0aW5zdGFsbF9jb25maWcpCisgICAgICBjb21tb24uV3JpdGVUb0lucHV0RmlsZSgKKyAgICAgICAgICBpbnB1dF9maWxlLCBQT1NUSU5TVEFMTF9DT05GSUcsIHBvc3RpbnN0YWxsX2NvbmZpZykKKyAgICBlbHNlOgorICAgICAgb3MudW5saW5rKG9zLnBhdGguam9pbihpbnB1dF9maWxlLCBQT1NUSU5TVEFMTF9DT05GSUcpKQogCi0gIGNvbW1vbi5aaXBDbG9zZShwYXJ0aWFsX3RhcmdldF96aXApCi0KLSAgcmV0dXJuIHBhcnRpYWxfdGFyZ2V0X2ZpbGUKKyAgcmV0dXJuIGlucHV0X2ZpbGUKIAogCiBkZWYgR2V0VGFyZ2V0RmlsZXNaaXBGb3JSZXRyb2ZpdER5bmFtaWNQYXJ0aXRpb25zKGlucHV0X2ZpbGUsCkBAIC02NjQsMjEgKzcxMCwxMiBAQAogICByZXBsYWNlID0geydPVEEvc3VwZXJfe30uaW1nJy5mb3JtYXQoZGV2KTogJ0lNQUdFUy97fS5pbWcnLmZvcm1hdChkZXYpCiAgICAgICAgICAgICAgZm9yIGRldiBpbiBzdXBlcl9ibG9ja19kZXZpY2VzfQogCi0gIHRhcmdldF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InRhcmdldGZpbGVzLSIsIHN1ZmZpeD0iLnppcCIpCi0gIHNodXRpbC5jb3B5ZmlsZShpbnB1dF9maWxlLCB0YXJnZXRfZmlsZSkKLQotICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCBhbGxvd1ppcDY0PVRydWUpIGFzIGlucHV0X3ppcDoKLSAgICBuYW1lbGlzdCA9IGlucHV0X3ppcC5uYW1lbGlzdCgpCi0KLSAgaW5wdXRfdG1wID0gY29tbW9uLlVuemlwVGVtcChpbnB1dF9maWxlLCBSRVRST0ZJVF9EQVBfVU5aSVBfUEFUVEVSTikKLQogICAjIFJlbW92ZSBwYXJ0aXRpb25zIGZyb20gTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCB0aGF0IGlzIGluCiAgICMgZHluYW1pY19wYXJ0aXRpb25fbGlzdCBidXQgbm90IGluIHN1cGVyX2Jsb2NrX2RldmljZXMgc28gdGhhdAogICAjIGJyaWxsb191cGRhdGVfcGF5bG9hZCB3b24ndCBnZW5lcmF0ZSB1cGRhdGUgZm9yIHRob3NlIGxvZ2ljYWwgcGFydGl0aW9ucy4KLSAgYWJfcGFydGl0aW9uc19maWxlID0gb3MucGF0aC5qb2luKGlucHV0X3RtcCwgKkFCX1BBUlRJVElPTlMuc3BsaXQoJy8nKSkKLSAgd2l0aCBvcGVuKGFiX3BhcnRpdGlvbnNfZmlsZSkgYXMgZjoKLSAgICBhYl9wYXJ0aXRpb25zX2xpbmVzID0gZi5yZWFkbGluZXMoKQotICAgIGFiX3BhcnRpdGlvbnMgPSBbbGluZS5zdHJpcCgpIGZvciBsaW5lIGluIGFiX3BhcnRpdGlvbnNfbGluZXNdCisgIGFiX3BhcnRpdGlvbnNfbGluZXMgPSBjb21tb24uUmVhZEZyb21JbnB1dEZpbGUoCisgICAgICBpbnB1dF9maWxlLCBBQl9QQVJUSVRJT05TKS5zcGxpdCgiXG4iKQorICBhYl9wYXJ0aXRpb25zID0gW2xpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBhYl9wYXJ0aXRpb25zX2xpbmVzXQogICAjIEFzc2VydCB0aGF0IGFsbCBzdXBlcl9ibG9ja19kZXZpY2VzIGFyZSBpbiBhYl9wYXJ0aXRpb25zCiAgIHN1cGVyX2RldmljZV9ub3RfdXBkYXRlZCA9IFtwYXJ0aXRpb24gZm9yIHBhcnRpdGlvbiBpbiBzdXBlcl9ibG9ja19kZXZpY2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwYXJ0aXRpb24gbm90IGluIGFiX3BhcnRpdGlvbnNdCkBAIC02ODYsMTUgKzcyMyw2IEBACiAgICAgICAie30gaXMgaW4gc3VwZXJfYmxvY2tfZGV2aWNlcyBidXQgbm90IGluIHt9Ii5mb3JtYXQoCiAgICAgICAgICAgc3VwZXJfZGV2aWNlX25vdF91cGRhdGVkLCBBQl9QQVJUSVRJT05TKQogICAjIGFiX3BhcnRpdGlvbnMgLT0gKGR5bmFtaWNfcGFydGl0aW9uX2xpc3QgLSBzdXBlcl9ibG9ja19kZXZpY2VzKQotICBuZXdfYWJfcGFydGl0aW9ucyA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoCi0gICAgICBwcmVmaXg9ImFiX3BhcnRpdGlvbnMiLCBzdWZmaXg9Ii50eHQiKQotICB3aXRoIG9wZW4obmV3X2FiX3BhcnRpdGlvbnMsICd3JykgYXMgZjoKLSAgICBmb3IgcGFydGl0aW9uIGluIGFiX3BhcnRpdGlvbnM6Ci0gICAgICBpZiAocGFydGl0aW9uIGluIGR5bmFtaWNfcGFydGl0aW9uX2xpc3QgYW5kCi0gICAgICAgICAgICAgIHBhcnRpdGlvbiBub3QgaW4gc3VwZXJfYmxvY2tfZGV2aWNlcyk6Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJEcm9wcGluZyAlcyBmcm9tIGFiX3BhcnRpdGlvbnMudHh0IiwgcGFydGl0aW9uKQotICAgICAgICBjb250aW51ZQotICAgICAgZi53cml0ZShwYXJ0aXRpb24gKyAiXG4iKQogICB0b19kZWxldGUgPSBbQUJfUEFSVElUSU9OU10KIAogICAjIEFsd2F5cyBza2lwIHBvc3RpbnN0YWxsIGZvciBhIHJldHJvZml0IHVwZGF0ZS4KQEAgLTcwNyw2NyArNzM1LDU3IEBACiAgICMgUmVtb3ZlIHRoZSBleGlzdGluZyBwYXJ0aXRpb24gaW1hZ2VzIGFzIHdlbGwgYXMgdGhlIG1hcCBmaWxlcy4KICAgdG9fZGVsZXRlICs9IGxpc3QocmVwbGFjZS52YWx1ZXMoKSkKICAgdG9fZGVsZXRlICs9IFsnSU1BR0VTL3t9Lm1hcCcuZm9ybWF0KGRldikgZm9yIGRldiBpbiBzdXBlcl9ibG9ja19kZXZpY2VzXQotCi0gIGNvbW1vbi5aaXBEZWxldGUodGFyZ2V0X2ZpbGUsIHRvX2RlbGV0ZSkKLQotICB0YXJnZXRfemlwID0gemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlLCAnYScsIGFsbG93WmlwNjQ9VHJ1ZSkKKyAgZm9yIGl0ZW0gaW4gdG9fZGVsZXRlOgorICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oaW5wdXRfZmlsZSwgaXRlbSkpCiAKICAgIyBXcml0ZSBzdXBlcl97Zm9vfS5pbWcgYXMge2Zvb30uaW1nLgogICBmb3Igc3JjLCBkc3QgaW4gcmVwbGFjZS5pdGVtcygpOgotICAgIGFzc2VydCBzcmMgaW4gbmFtZWxpc3QsIFwKKyAgICBhc3NlcnQgRG9lc0lucHV0RmlsZUNvbnRhaW4oaW5wdXRfZmlsZSwgc3JjKSwgXAogICAgICAgICAnTWlzc2luZyB7fSBpbiB7fTsge30gY2Fubm90IGJlIHdyaXR0ZW4nLmZvcm1hdChzcmMsIGlucHV0X2ZpbGUsIGRzdCkKLSAgICB1bnppcHBlZF9maWxlID0gb3MucGF0aC5qb2luKGlucHV0X3RtcCwgKnNyYy5zcGxpdCgnLycpKQotICAgIGNvbW1vbi5aaXBXcml0ZSh0YXJnZXRfemlwLCB1bnppcHBlZF9maWxlLCBhcmNuYW1lPWRzdCkKKyAgICBzb3VyY2VfcGF0aCA9IG9zLnBhdGguam9pbihpbnB1dF9maWxlLCAqc3JjLnNwbGl0KCIvIikpCisgICAgdGFyZ2V0X3BhdGggPSBvcy5wYXRoLmpvaW4oaW5wdXRfZmlsZSwgKmRzdC5zcGxpdCgiLyIpKQorICAgIG9zLnJlbmFtZShzb3VyY2VfcGF0aCwgdGFyZ2V0X3BhdGgpCiAKICAgIyBXcml0ZSBuZXcgYWJfcGFydGl0aW9ucy50eHQgZmlsZQotICBjb21tb24uWmlwV3JpdGUodGFyZ2V0X3ppcCwgbmV3X2FiX3BhcnRpdGlvbnMsIGFyY25hbWU9QUJfUEFSVElUSU9OUykKKyAgbmV3X2FiX3BhcnRpdGlvbnMgPSBvcy5wYXRoLmpvaW4oaW5wdXRfZmlsZSwgQUJfUEFSVElUSU9OUykKKyAgd2l0aCBvcGVuKG5ld19hYl9wYXJ0aXRpb25zLCAndycpIGFzIGY6CisgICAgZm9yIHBhcnRpdGlvbiBpbiBhYl9wYXJ0aXRpb25zOgorICAgICAgaWYgKHBhcnRpdGlvbiBpbiBkeW5hbWljX3BhcnRpdGlvbl9saXN0IGFuZAorICAgICAgICAgICAgICBwYXJ0aXRpb24gbm90IGluIHN1cGVyX2Jsb2NrX2RldmljZXMpOgorICAgICAgICBsb2dnZXIuaW5mbygiRHJvcHBpbmcgJXMgZnJvbSBhYl9wYXJ0aXRpb25zLnR4dCIsIHBhcnRpdGlvbikKKyAgICAgICAgY29udGludWUKKyAgICAgIGYud3JpdGUocGFydGl0aW9uICsgIlxuIikKIAotICBjb21tb24uWmlwQ2xvc2UodGFyZ2V0X3ppcCkKLQotICByZXR1cm4gdGFyZ2V0X2ZpbGUKKyAgcmV0dXJuIGlucHV0X2ZpbGUKIAogCi1kZWYgR2V0VGFyZ2V0RmlsZXNaaXBGb3JDdXN0b21JbWFnZXNVcGRhdGVzKGlucHV0X2ZpbGUsIGN1c3RvbV9pbWFnZXMpOgorZGVmIEdldFRhcmdldEZpbGVzWmlwRm9yQ3VzdG9tSW1hZ2VzVXBkYXRlcyhpbnB1dF9maWxlLCBjdXN0b21faW1hZ2VzOiBkaWN0KToKICAgIiIiUmV0dXJucyBhIHRhcmdldC1maWxlcy56aXAgZm9yIGN1c3RvbSBwYXJ0aXRpb25zIHVwZGF0ZS4KIAogICBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIGFiX3BhcnRpdGlvbnMgbGlzdCB3aXRoIHRoZSBkZXNpcmVkIGN1c3RvbSBwYXJ0aXRpb25zCiAgIGFuZCBwdXRzIHRoZSBjdXN0b20gaW1hZ2VzIGludG8gdGhlIHRhcmdldCB0YXJnZXQtZmlsZXMuemlwLgogCiAgIEFyZ3M6Ci0gICAgaW5wdXRfZmlsZTogVGhlIGlucHV0IHRhcmdldC1maWxlcy56aXAgZmlsZW5hbWUuCisgICAgaW5wdXRfZmlsZTogVGhlIGlucHV0IHRhcmdldC1maWxlcyBleHRyYWN0ZWQgZGlyZWN0b3J5CiAgICAgY3VzdG9tX2ltYWdlczogQSBtYXAgb2YgY3VzdG9tIHBhcnRpdGlvbnMgYW5kIGN1c3RvbSBpbWFnZXMuCiAKICAgUmV0dXJuczoKLSAgICBUaGUgZmlsZW5hbWUgb2YgYSB0YXJnZXQtZmlsZXMuemlwIHdoaWNoIGhhcyByZW5hbWVkIHRoZSBjdXN0b20gaW1hZ2VzIGluCi0gICAgdGhlIElNQUdFUy8gdG8gdGhlaXIgcGFydGl0aW9uIG5hbWVzLgorICAgIFRoZSBleHRyYWN0ZWQgZGlyIG9mIGEgdGFyZ2V0LWZpbGVzLnppcCB3aGljaCBoYXMgcmVuYW1lZCB0aGUgY3VzdG9tIGltYWdlcworICAgIGluIHRoZSBJTUFHRVMvIHRvIHRoZWlyIHBhcnRpdGlvbiBuYW1lcy4KICAgIiIiCisgIGZvciBjdXN0b21faW1hZ2UgaW4gY3VzdG9tX2ltYWdlcy52YWx1ZXMoKToKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICJJTUFHRVMiLCBjdXN0b21faW1hZ2UpKToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlNwZWNpZmllZCBjdXN0b20gaW1hZ2Uge30gbm90IGZvdW5kIGluIHRhcmdldCBmaWxlcyB7fSwgYXZhaWxhYmxlIGltYWdlcyBhcmUge30iLAorICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21faW1hZ2UsIGlucHV0X2ZpbGUsIG9zLmxpc3RkaXIob3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICJJTUFHRVMiKSkpCiAKLSAgIyBGaXJzdCBwYXNzOiB1c2UgemlwMnppcCB0byBjb3B5IHRoZSB0YXJnZXQgZmlsZXMgY29udGVudHMsIGV4Y2x1ZGluZwotICAjIHRoZSAiY3VzdG9tIiBpbWFnZXMgdGhhdCB3aWxsIGJlIHJlcGxhY2VkLgotICB0YXJnZXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJ0YXJnZXRmaWxlcy0iLCBzdWZmaXg9Ii56aXAiKQotICBjbWQgPSBbJ3ppcDJ6aXAnLCAnLWknLCBpbnB1dF9maWxlLCAnLW8nLCB0YXJnZXRfZmlsZV0KLQotICBpbWFnZXMgPSB7fQogICBmb3IgY3VzdG9tX3BhcnRpdGlvbiwgY3VzdG9tX2ltYWdlIGluIGN1c3RvbV9pbWFnZXMuaXRlbXMoKToKICAgICBkZWZhdWx0X2N1c3RvbV9pbWFnZSA9ICd7fS5pbWcnLmZvcm1hdChjdXN0b21fcGFydGl0aW9uKQogICAgIGlmIGRlZmF1bHRfY3VzdG9tX2ltYWdlICE9IGN1c3RvbV9pbWFnZToKLSAgICAgIHNyYyA9ICdJTUFHRVMvJyArIGN1c3RvbV9pbWFnZQotICAgICAgZHN0ID0gJ0lNQUdFUy8nICsgZGVmYXVsdF9jdXN0b21faW1hZ2UKLSAgICAgIGNtZC5leHRlbmQoWycteCcsIGRzdF0pCi0gICAgICBpbWFnZXNbZHN0XSA9IHNyYworICAgICAgc3JjID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICdJTUFHRVMnLCBjdXN0b21faW1hZ2UpCisgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oaW5wdXRfZmlsZSwgJ0lNQUdFUycsIGRlZmF1bHRfY3VzdG9tX2ltYWdlKQorICAgICAgb3MucmVuYW1lKHNyYywgZHN0KQogCi0gIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChjbWQpCi0KLSAgIyBTZWNvbmQgcGFzczogd3JpdGUge2N1c3RvbV9pbWFnZX0uaW1nIGFzIHtjdXN0b21fcGFydGl0aW9ufS5pbWcuCi0gIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgaW5wdXRfemlwOgotICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlLCAnYScsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgb3V0cHV0X3ppcDoKLSAgICAgIGZvciBkc3QsIHNyYyBpbiBpbWFnZXMuaXRlbXMoKToKLSAgICAgICAgZGF0YSA9IGlucHV0X3ppcC5yZWFkKHNyYykKLSAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZSBjdXN0b20gcGFydGl0aW9uICclcyciLCBkc3QpCi0gICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfemlwLCBkc3QsIGRhdGEpCi0gICAgICBvdXRwdXRfemlwLmNsb3NlKCkKLQotICByZXR1cm4gdGFyZ2V0X2ZpbGUKKyAgcmV0dXJuIGlucHV0X2ZpbGUKIAogCiBkZWYgR2VuZXJhdGVQYXJ0aXRpb25UaW1lc3RhbXBGbGFncyhwYXJ0aXRpb25fc3RhdGUpOgpAQCAtODMzLDE0ICs4NTEsMzYgQEAKICAgcmV0dXJuIHBhdHRlcm4uc2VhcmNoKG91dHB1dCkgaXMgbm90IE5vbmUKIAogCitkZWYgRXh0cmFjdE9yQ29weVRhcmdldEZpbGVzKHRhcmdldF9maWxlKToKKyAgaWYgb3MucGF0aC5pc2Rpcih0YXJnZXRfZmlsZSk6CisgICAgcmV0dXJuIENvcHlUYXJnZXRGaWxlc0Rpcih0YXJnZXRfZmlsZSkKKyAgZWxzZToKKyAgICByZXR1cm4gRXh0cmFjdFRhcmdldEZpbGVzKHRhcmdldF9maWxlKQorCisKK2RlZiBWYWxpZGF0ZUNvbXByZXNzaW9uUGFyYW0odGFyZ2V0X2luZm8pOgorICB2YWJjX2NvbXByZXNzaW9uX3BhcmFtID0gT1BUSU9OUy52YWJjX2NvbXByZXNzaW9uX3BhcmFtCisgIGlmIHZhYmNfY29tcHJlc3Npb25fcGFyYW06CisgICAgbWluaW11bV9hcGlfbGV2ZWxfcmVxdWlyZWQgPSBWQUJDX0NPTVBSRVNTSU9OX1BBUkFNX1NVUFBPUlRbdmFiY19jb21wcmVzc2lvbl9wYXJhbS5zcGxpdCgiLCIpWzBdXQorICAgIGlmIHRhcmdldF9pbmZvLnZlbmRvcl9hcGlfbGV2ZWwgPCBtaW5pbXVtX2FwaV9sZXZlbF9yZXF1aXJlZDoKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlNwZWNpZmllZCBWQUJDIGNvbXByZXNzaW9uIHBhcmFtIHt9IGlzIG9ubHkgc3VwcG9ydGVkIGZvciBBUEkgbGV2ZWwgPj0ge30sIGRldmljZSBpcyBvbiBBUEkgbGV2ZWwge30iLmZvcm1hdCgKKyAgICAgICAgICB2YWJjX2NvbXByZXNzaW9uX3BhcmFtLCBtaW5pbXVtX2FwaV9sZXZlbF9yZXF1aXJlZCwgdGFyZ2V0X2luZm8udmVuZG9yX2FwaV9sZXZlbCkpCisKKwogZGVmIEdlbmVyYXRlQWJPdGFQYWNrYWdlKHRhcmdldF9maWxlLCBvdXRwdXRfZmlsZSwgc291cmNlX2ZpbGU9Tm9uZSk6CiAgICIiIkdlbmVyYXRlcyBhbiBBbmRyb2lkIE9UQSBwYWNrYWdlIHRoYXQgaGFzIEEvQiB1cGRhdGUgcGF5bG9hZC4iIiIKICAgIyBJZiBpbnB1dCB0YXJnZXRfZmlsZXMgYXJlIGRpcmVjdG9yaWVzLCBjcmVhdGUgYSBjb3B5IHNvIHRoYXQgd2UgY2FuIG1vZGlmeQogICAjIHRoZW0gZGlyZWN0bHkKLSAgaWYgb3MucGF0aC5pc2Rpcih0YXJnZXRfZmlsZSk6Ci0gICAgdGFyZ2V0X2ZpbGUgPSBDb3B5VGFyZ2V0RmlsZXNEaXIodGFyZ2V0X2ZpbGUpCi0gIGlmIHNvdXJjZV9maWxlIGlzIG5vdCBOb25lIGFuZCBvcy5wYXRoLmlzZGlyKHNvdXJjZV9maWxlKToKLSAgICBzb3VyY2VfZmlsZSA9IENvcHlUYXJnZXRGaWxlc0Rpcihzb3VyY2VfZmlsZSkKKyAgdGFyZ2V0X2luZm8gPSBjb21tb24uQnVpbGRJbmZvKE9QVElPTlMuaW5mb19kaWN0LCBPUFRJT05TLm9lbV9kaWN0cykKKyAgaWYgT1BUSU9OUy5kaXNhYmxlX3ZhYmMgYW5kIHRhcmdldF9pbmZvLmlzX3JlbGVhc2Vfa2V5OgorICAgIHJhaXNlIFZhbHVlRXJyb3IoIkRpc2FibGluZyBWQUJDIG9uIHJlbGVhc2Uta2V5IGJ1aWxkcyBpcyBub3Qgc3VwcG9ydGVkLiIpCisKKyAgVmFsaWRhdGVDb21wcmVzc2lvblBhcmFtKHRhcmdldF9pbmZvKQorICB2YWJjX2NvbXByZXNzaW9uX3BhcmFtID0gdGFyZ2V0X2luZm8udmFiY19jb21wcmVzc2lvbl9wYXJhbQorCisgIHRhcmdldF9maWxlID0gRXh0cmFjdE9yQ29weVRhcmdldEZpbGVzKHRhcmdldF9maWxlKQorICBpZiBzb3VyY2VfZmlsZSBpcyBub3QgTm9uZToKKyAgICBzb3VyY2VfZmlsZSA9IEV4dHJhY3RPckNvcHlUYXJnZXRGaWxlcyhzb3VyY2VfZmlsZSkKICAgIyBTdGFnZSB0aGUgb3V0cHV0IHppcCBwYWNrYWdlIGZvciBwYWNrYWdlIHNpZ25pbmcuCiAgIGlmIG5vdCBPUFRJT05TLm5vX3NpZ25pbmc6CiAgICAgc3RhZ2luZ19maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQpAQCAtODUxLDcgKzg5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3daaXA2ND1UcnVlKQogCiAgIGlmIHNvdXJjZV9maWxlIGlzIG5vdCBOb25lOgotICAgIHNvdXJjZV9maWxlID0gb3RhX3V0aWxzLkV4dHJhY3RUYXJnZXRGaWxlcyhzb3VyY2VfZmlsZSkKKyAgICBzb3VyY2VfZmlsZSA9IEV4dHJhY3RUYXJnZXRGaWxlcyhzb3VyY2VfZmlsZSkKICAgICBhc3NlcnQgImFiX3BhcnRpdGlvbnMiIGluIE9QVElPTlMuc291cmNlX2luZm9fZGljdCwgXAogICAgICAgICAiTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCBpcyByZXF1aXJlZCBmb3IgYWJfdXBkYXRlLiIKICAgICBhc3NlcnQgImFiX3BhcnRpdGlvbnMiIGluIE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCwgXApAQCAtODY1LDYgKzkwNSwyMiBAQAogICAgIGlmIG5vdCBzb3VyY2VfaW5mby5pc192YWJjIG9yIG5vdCB0YXJnZXRfaW5mby5pc192YWJjOgogICAgICAgbG9nZ2VyLmluZm8oIkVpdGhlciBzb3VyY2Ugb3IgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgVkFCQywgZGlzYWJsaW5nLiIpCiAgICAgICBPUFRJT05TLmRpc2FibGVfdmFiYyA9IFRydWUKKyAgICBpZiBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0gaXMgTm9uZSBhbmQgXAorICAgICAgICAgICAgc291cmNlX2luZm8udmFiY19jb21wcmVzc2lvbl9wYXJhbSAhPSB0YXJnZXRfaW5mby52YWJjX2NvbXByZXNzaW9uX3BhcmFtOgorICAgICAgbG9nZ2VyLmluZm8oIlNvdXJjZSBidWlsZCBhbmQgdGFyZ2V0IGJ1aWxkIHVzZSBkaWZmZXJlbnQgY29tcHJlc3Npb24gbWV0aG9kcyB7fSB2cyB7fSwgZGVmYXVsdCB0byBzb3VyY2UgYnVpbGRzIHBhcmFtZXRlciB7fSIuZm9ybWF0KAorICAgICAgICAgIHNvdXJjZV9pbmZvLnZhYmNfY29tcHJlc3Npb25fcGFyYW0sIHRhcmdldF9pbmZvLnZhYmNfY29tcHJlc3Npb25fcGFyYW0sIHNvdXJjZV9pbmZvLnZhYmNfY29tcHJlc3Npb25fcGFyYW0pKQorICAgICAgdmFiY19jb21wcmVzc2lvbl9wYXJhbSA9IHNvdXJjZV9pbmZvLnZhYmNfY29tcHJlc3Npb25fcGFyYW0KKyAgICAjIFZpcnR1YWwgQUIgQ293IHZlcnNpb24gMyBpcyBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgVSB3aXRoIGltcHJvdmVkIG1lbW9yeQorICAgICMgYW5kIGluc3RhbGwgdGltZSBwZXJmb3JtYW5jZS4gQWxsIE9UQSdzIHdpdGgKKyAgICAjIGJvdGggdGhlIHNvdXJjZSBidWlsZCBhbmQgdGFyZ2V0IGJ1aWxkIHdpdGggVklSVFVBTF9BQl9DT1dfVkVSU0lPTiA9IDMKKyAgICAjIGNhbiBzdXBwb3J0IHRoZSBuZXcgZm9ybWF0LiBPdGhlcndpc2UsIGZhbGxiYWNrIG9uIG9sZGVyIHZlcnNpb25zCisgICAgaWYgbm90IE9QVElPTlMudmFiY19jb3dfdmVyc2lvbjoKKyAgICAgIGlmIG5vdCBzb3VyY2VfaW5mby52YWJjX2Nvd192ZXJzaW9uIG9yIG5vdCB0YXJnZXRfaW5mby52YWJjX2Nvd192ZXJzaW9uOgorICAgICAgICBsb2dnZXIuaW5mbygiU291cmNlIG9yIFRhcmdldCBkb2Vzbid0IGhhdmUgVkFCQ19DT1dfVkVSU0lPTiBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gdmVyc2lvbiAyIikKKyAgICAgICAgT1BUSU9OUy52YWJjX2Nvd192ZXJzaW9uID0gMgorICAgICAgZWxpZiBzb3VyY2VfaW5mby52YWJjX2Nvd192ZXJzaW9uICE9IHRhcmdldF9pbmZvLnZhYmNfY293X3ZlcnNpb246CisgICAgICAgIGxvZ2dlci5pbmZvKCJTb3VyY2UgYW5kIFRhcmdldCBoYXZlIGRpZmZlcmVudCBjb3cgVkFCQ19DT1dfVkVSU0lPTiBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gbWluaW11bSB2ZXJzaW9uIikKKyAgICAgICAgT1BUSU9OUy52YWJjX2Nvd192ZXJzaW9uID0gbWluKHNvdXJjZV9pbmZvLnZhYmNfY293X3ZlcnNpb24sIHRhcmdldF9pbmZvLnZhYmNfY293X3ZlcnNpb24pCiAKICAgICAjIFZpcnR1YWwgQUIgQ29tcHJlc3Npb24gd2FzIGludHJvZHVjZWQgaW4gQW5kcm9kIFMuCiAgICAgIyBMYXRlciwgd2UgYmFja3BvcnRlZCBWQUJDIHRvIEFuZHJvaWQgUi4gQnV0IHZlcml0eSBzdXBwb3J0IHdhcyBub3QKQEAgLTg3Nyw4ICs5MzMsMzcgQEAKICAgZWxzZToKICAgICBhc3NlcnQgImFiX3BhcnRpdGlvbnMiIGluIE9QVElPTlMuaW5mb19kaWN0LCBcCiAgICAgICAgICJNRVRBL2FiX3BhcnRpdGlvbnMudHh0IGlzIHJlcXVpcmVkIGZvciBhYl91cGRhdGUuIgotICAgIHRhcmdldF9pbmZvID0gY29tbW9uLkJ1aWxkSW5mbyhPUFRJT05TLmluZm9fZGljdCwgT1BUSU9OUy5vZW1fZGljdHMpCiAgICAgc291cmNlX2luZm8gPSBOb25lCisgICAgaWYgbm90IE9QVElPTlMudmFiY19jb3dfdmVyc2lvbjoKKyAgICAgIGlmIG5vdCB0YXJnZXRfaW5mby52YWJjX2Nvd192ZXJzaW9uOgorICAgICAgICAgIE9QVElPTlMudmFiY19jb3dfdmVyc2lvbiA9IDIKKyAgICAgIGVsaWYgdGFyZ2V0X2luZm8udmFiY19jb3dfdmVyc2lvbiA+PSAiMyIgYW5kIHRhcmdldF9pbmZvLnZlbmRvcl9hcGlfbGV2ZWwgPCAzNToKKyAgICAgICAgbG9nZ2VyLndhcm5pbmcoCisgICAgICAgICAgICAgICJUaGlzIGZ1bGwgT1RBIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIFZBQkMgY293IHZlcnNpb24iCisgICAgICAgICAgICAgICIgMyB3aGljaCBpcyBzdXBwb3J0ZWQgc2luY2UiCisgICAgICAgICAgICAgICIgQW5kcm9pZCBBUEkgbGV2ZWwgMzUsIGJ1dCBkZXZpY2UgaXMgIgorICAgICAgICAgICAgICAibGF1bmNoZWQgd2l0aCB7fSAuIElmIHRoaXMgZnVsbCBPVEEgaXMiCisgICAgICAgICAgICAgICIgc2VydmVkIHRvIGEgZGV2aWNlIHJ1bm5pbmcgb2xkIGJ1aWxkLCBPVEEgbWlnaHQgZmFpbCBkdWUgdG8gIgorICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgdmFiYyBjb3cgdmVyc2lvbi4gRm9yIHNhZmV0eSwgdmVyc2lvbiAyIGlzIHVzZWQgYmVjYXVzZSAiCisgICAgICAgICAgICAgICJpdCdzIHN1cHBvcnRlZCBzaW5jZSBkYXkgMS4iLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgIHRhcmdldF9pbmZvLnZlbmRvcl9hcGlfbGV2ZWwpKQorICAgICAgICBPUFRJT05TLnZhYmNfY293X3ZlcnNpb24gPSAyCisgICAgaWYgT1BUSU9OUy52YWJjX2NvbXByZXNzaW9uX3BhcmFtIGlzIE5vbmUgYW5kIHZhYmNfY29tcHJlc3Npb25fcGFyYW06CisgICAgICBtaW5pbXVtX2FwaV9sZXZlbF9yZXF1aXJlZCA9IFZBQkNfQ09NUFJFU1NJT05fUEFSQU1fU1VQUE9SVFsKKyAgICAgICAgICB2YWJjX2NvbXByZXNzaW9uX3BhcmFtXQorICAgICAgaWYgdGFyZ2V0X2luZm8udmVuZG9yX2FwaV9sZXZlbCA8IG1pbmltdW1fYXBpX2xldmVsX3JlcXVpcmVkOgorICAgICAgICBsb2dnZXIud2FybmluZygKKyAgICAgICAgICAgICJUaGlzIGZ1bGwgT1RBIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIFZBQkMgY29tcHJlc3Npb24gYWxnb3JpdGhtIgorICAgICAgICAgICAgIiB7fSwgd2hpY2ggaXMgc3VwcG9ydGVkIHNpbmNlIgorICAgICAgICAgICAgIiBBbmRyb2lkIEFQSSBsZXZlbCB7fSwgYnV0IGRldmljZSBpcyAiCisgICAgICAgICAgICAibGF1bmNoZWQgd2l0aCB7fSAuIElmIHRoaXMgZnVsbCBPVEEgaXMiCisgICAgICAgICAgICAiIHNlcnZlZCB0byBhIGRldmljZSBydW5uaW5nIG9sZCBidWlsZCwgT1RBIG1pZ2h0IGZhaWwgZHVlIHRvICIKKyAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiBwYXJhbWV0ZXIuIEZvciBzYWZldHksIGd6IGlzIHVzZWQgYmVjYXVzZSAiCisgICAgICAgICAgICAiaXQncyBzdXBwb3J0ZWQgc2luY2UgZGF5IDEuIi5mb3JtYXQoCisgICAgICAgICAgICAgICAgdmFiY19jb21wcmVzc2lvbl9wYXJhbSwKKyAgICAgICAgICAgICAgICBtaW5pbXVtX2FwaV9sZXZlbF9yZXF1aXJlZCwKKyAgICAgICAgICAgICAgICB0YXJnZXRfaW5mby52ZW5kb3JfYXBpX2xldmVsKSkKKyAgICAgICAgdmFiY19jb21wcmVzc2lvbl9wYXJhbSA9ICJneiIKIAogICBpZiBPUFRJT05TLnBhcnRpYWwgPT0gW106CiAgICAgbG9nZ2VyLmluZm8oCkBAIC05MzQsNiArMTAxOSw5IEBACiAgICAgICBsb2dnZXIuZXJyb3IoIlZBQkMgWE9SIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB2ZW5kb3IsIGRpc2FibGluZyIpCiAgICAgICBPUFRJT05TLmVuYWJsZV92YWJjX3hvciA9IEZhbHNlCiAKKyAgaWYgT1BUSU9OUy52YWJjX2NvbXByZXNzaW9uX3BhcmFtOgorICAgIHZhYmNfY29tcHJlc3Npb25fcGFyYW0gPSBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0KKwogICBhZGRpdGlvbmFsX2FyZ3MgPSBbXQogCiAgICMgUHJlcGFyZSBjdXN0b20gaW1hZ2VzLgpAQCAtOTQ4LDI3ICsxMDM2LDQwIEBACiAgIGVsaWYgT1BUSU9OUy5wYXJ0aWFsOgogICAgIHRhcmdldF9maWxlID0gR2V0VGFyZ2V0RmlsZXNaaXBGb3JQYXJ0aWFsVXBkYXRlcyh0YXJnZXRfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5wYXJ0aWFsKQotICBlbGlmIE9QVElPTlMudmFiY19jb21wcmVzc2lvbl9wYXJhbToKKyAgaWYgdmFiY19jb21wcmVzc2lvbl9wYXJhbSAhPSB0YXJnZXRfaW5mby52YWJjX2NvbXByZXNzaW9uX3BhcmFtOgogICAgIHRhcmdldF9maWxlID0gR2V0VGFyZ2V0RmlsZXNaaXBGb3JDdXN0b21WQUJDQ29tcHJlc3Npb24oCi0gICAgICAgIHRhcmdldF9maWxlLCBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0pCi0gIGVsaWYgT1BUSU9OUy5za2lwX3Bvc3RpbnN0YWxsOgorICAgICAgICB0YXJnZXRfZmlsZSwgdmFiY19jb21wcmVzc2lvbl9wYXJhbSkKKyAgaWYgT1BUSU9OUy52YWJjX2Nvd192ZXJzaW9uOgorICAgIHRhcmdldF9maWxlID0gTW9kaWZ5VGFyZ2V0RmlsZXNEeW5hbWljUGFydGl0aW9uSW5mbyh0YXJnZXRfZmlsZSwgInZpcnR1YWxfYWJfY293X3ZlcnNpb24iLCBPUFRJT05TLnZhYmNfY293X3ZlcnNpb24pCisgIGlmIE9QVElPTlMuY29tcHJlc3Npb25fZmFjdG9yOgorICAgIHRhcmdldF9maWxlID0gTW9kaWZ5VGFyZ2V0RmlsZXNEeW5hbWljUGFydGl0aW9uSW5mbyh0YXJnZXRfZmlsZSwgInZpcnR1YWxfYWJfY29tcHJlc3Npb25fZmFjdG9yIiwgT1BUSU9OUy5jb21wcmVzc2lvbl9mYWN0b3IpCisgIGlmIE9QVElPTlMuc2tpcF9wb3N0aW5zdGFsbDoKICAgICB0YXJnZXRfZmlsZSA9IEdldFRhcmdldEZpbGVzWmlwV2l0aG91dFBvc3RpbnN0YWxsQ29uZmlnKHRhcmdldF9maWxlKQogICAjIFRhcmdldF9maWxlIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQsIHJlcGFyc2UgYWJfcGFydGl0aW9ucwogICB0YXJnZXRfaW5mby5pbmZvX2RpY3RbJ2FiX3BhcnRpdGlvbnMnXSA9IGNvbW1vbi5SZWFkRnJvbUlucHV0RmlsZSh0YXJnZXRfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJfUEFSVElUSU9OUykuc3RyaXAoKS5zcGxpdCgiXG4iKQogCisgIGZyb20gY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmIGltcG9ydCBDaGVja1ZpbnRmSWZUcmVibGVFbmFibGVkCiAgIENoZWNrVmludGZJZlRyZWJsZUVuYWJsZWQodGFyZ2V0X2ZpbGUsIHRhcmdldF9pbmZvKQogCisgICMgQWxsb3cgYm9vdF92YXJpYWJsZV9maWxlIHRvIGFsc28gZXhpc3QgaW4gdGFyZ2V0LWZpbGVzCisgIGlmIE9QVElPTlMuYm9vdF92YXJpYWJsZV9maWxlOgorICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShPUFRJT05TLmJvb3RfdmFyaWFibGVfZmlsZSk6CisgICAgICBPUFRJT05TLmJvb3RfdmFyaWFibGVfZmlsZSA9IG9zLnBhdGguam9pbih0YXJnZXRfZmlsZSwgT1BUSU9OUy5ib290X3ZhcmlhYmxlX2ZpbGUpCiAgICMgTWV0YWRhdGEgdG8gY29tcGx5IHdpdGggQW5kcm9pZCBPVEEgcGFja2FnZSBmb3JtYXQuCiAgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKICAgIyBHZW5lcmF0ZSBwYXlsb2FkLgogICBwYXlsb2FkID0gUGF5bG9hZEdlbmVyYXRvcigKLSAgICAgIHdpcGVfdXNlcl9kYXRhPU9QVElPTlMud2lwZV91c2VyX2RhdGEsIG1pbm9yX3ZlcnNpb249T1BUSU9OUy5mb3JjZV9taW5vcl92ZXJzaW9uLCBpc19wYXJ0aWFsX3VwZGF0ZT1PUFRJT05TLnBhcnRpYWwpCisgICAgICB3aXBlX3VzZXJfZGF0YT1PUFRJT05TLndpcGVfdXNlcl9kYXRhLCBtaW5vcl92ZXJzaW9uPU9QVElPTlMuZm9yY2VfbWlub3JfdmVyc2lvbiwgaXNfcGFydGlhbF91cGRhdGU9T1BUSU9OUy5wYXJ0aWFsLCBzcGxfZG93bmdyYWRlPU9QVElPTlMuc3BsX2Rvd25ncmFkZSkKIAogICBwYXJ0aXRpb25fdGltZXN0YW1wc19mbGFncyA9IFtdCiAgICMgRW5mb3JjZSBhIG1heCB0aW1lc3RhbXAgdGhpcyBwYXlsb2FkIGNhbiBiZSBhcHBsaWVkIG9uIHRvcCBvZi4KICAgaWYgT1BUSU9OUy5kb3duZ3JhZGU6Ci0gICAgbWF4X3RpbWVzdGFtcCA9IHNvdXJjZV9pbmZvLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiKQorICAgICMgV2hlbiBnZW5lcmF0aW5nIG90YSBiZXR3ZWVuIG1lcmdlZCB0YXJnZXQtZmlsZXMsIHBhcnRpdGlvbiBidWlsZCBkYXRlIGNhbgorICAgICMgZGVjcmVhc2UgaW4gdGFyZ2V0LCBhdCB0aGUgc2FtZSB0aW1lIGFzIHJvLmJ1aWxkLmRhdGUudXRjIGluY3JlYXNlcywKKyAgICAjIHNvIGFsd2F5cyBwaWNrIGxhcmdlc3QgdmFsdWUuCisgICAgbWF4X3RpbWVzdGFtcCA9IG1heChzb3VyY2VfaW5mby5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIiksCisgICAgICAgIHN0cihtZXRhZGF0YS5wb3N0Y29uZGl0aW9uLnRpbWVzdGFtcCkpCiAgICAgcGFydGl0aW9uX3RpbWVzdGFtcHNfZmxhZ3MgPSBHZW5lcmF0ZVBhcnRpdGlvblRpbWVzdGFtcEZsYWdzRG93bmdyYWRlKAogICAgICAgICBtZXRhZGF0YS5wcmVjb25kaXRpb24ucGFydGl0aW9uX3N0YXRlLAogICAgICAgICBtZXRhZGF0YS5wb3N0Y29uZGl0aW9uLnBhcnRpdGlvbl9zdGF0ZQpAQCAtOTk1LDYgKzEwOTYsOSBAQAogCiAgIGFkZGl0aW9uYWxfYXJncyArPSBbIi0tZW5hYmxlX3p1Y2NoaW5pPSIgKwogICAgICAgICAgICAgICAgICAgICAgIHN0cihPUFRJT05TLmVuYWJsZV96dWNjaGluaSkubG93ZXIoKV0KKyAgaWYgT1BUSU9OUy5lbmFibGVfcHVmZmRpZmYgaXMgbm90IE5vbmU6CisgICAgYWRkaXRpb25hbF9hcmdzICs9IFsiLS1lbmFibGVfcHVmZmRpZmY9IiArCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIoT1BUSU9OUy5lbmFibGVfcHVmZmRpZmYpLmxvd2VyKCldCiAKICAgaWYgbm90IG90YV91dGlscy5Jc0x6NGRpZmZDb21wYXRpYmxlKHNvdXJjZV9maWxlLCB0YXJnZXRfZmlsZSk6CiAgICAgbG9nZ2VyLndhcm5pbmcoCkBAIC0xMDY3LDYgKzExNzEsOCBAQAogICAgICAgIyBaSVBfU1RPUkVELgogICAgICAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF96aXAsIGNhcmVfbWFwX25hbWUsIGNhcmVfbWFwX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgICAjIGJyZWFrIGhlcmUgdG8gYXZvaWQgZ29pbmcgaW50byBlbHNlIHdoZW4gY2FyZSBtYXAgaGFzIGJlZW4gaGFuZGxlZAorICAgICAgYnJlYWsKICAgICBlbHNlOgogICAgICAgbG9nZ2VyLndhcm5pbmcoIkNhbm5vdCBmaW5kIGNhcmUgbWFwIGZpbGUgaW4gdGFyZ2V0X2ZpbGUgcGFja2FnZSIpCiAKQEAgLTEwODgsOSArMTE5NCw3IEBACiBkZWYgbWFpbihhcmd2KToKIAogICBkZWYgb3B0aW9uX2hhbmRsZXIobywgYSk6Ci0gICAgaWYgbyBpbiAoIi1rIiwgIi0tcGFja2FnZV9rZXkiKToKLSAgICAgIE9QVElPTlMucGFja2FnZV9rZXkgPSBhCi0gICAgZWxpZiBvIGluICgiLWkiLCAiLS1pbmNyZW1lbnRhbF9mcm9tIik6CisgICAgaWYgbyBpbiAoIi1pIiwgIi0taW5jcmVtZW50YWxfZnJvbSIpOgogICAgICAgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSBhCiAgICAgZWxpZiBvID09ICItLWZ1bGxfcmFkaW8iOgogICAgICAgT1BUSU9OUy5mdWxsX3JhZGlvID0gVHJ1ZQpAQCAtMTEzNSwxNyArMTIzOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgImEgZmxvYXQiICUgKGEsIG8pKQogICAgIGVsaWYgbyA9PSAiLS1sb2dfZGlmZiI6CiAgICAgICBPUFRJT05TLmxvZ19kaWZmID0gYQotICAgIGVsaWYgbyA9PSAiLS1wYXlsb2FkX3NpZ25lciI6Ci0gICAgICBPUFRJT05TLnBheWxvYWRfc2lnbmVyID0gYQotICAgIGVsaWYgbyA9PSAiLS1wYXlsb2FkX3NpZ25lcl9hcmdzIjoKLSAgICAgIE9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyA9IHNobGV4LnNwbGl0KGEpCi0gICAgZWxpZiBvID09ICItLXBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUiOgotICAgICAgT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplID0gYQotICAgIGVsaWYgbyA9PSAiLS1wYXlsb2FkX3NpZ25lcl9rZXlfc2l6ZSI6Ci0gICAgICAjIFRPRE8oWHVuY2hhbmcpIHJlbW92ZSB0aGlzIG9wdGlvbiBhZnRlciBjbGVhbmluZyB1cCB0aGUgY2FsbGVycy4KLSAgICAgIGxvZ2dlci53YXJuaW5nKCJUaGUgb3B0aW9uICctLXBheWxvYWRfc2lnbmVyX2tleV9zaXplJyBpcyBkZXByZWNhdGVkLiIKLSAgICAgICAgICAgICAgICAgICAgICIgVXNlICctLXBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUnIGluc3RlYWQuIikKLSAgICAgIE9QVElPTlMucGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZSA9IGEKICAgICBlbGlmIG8gPT0gIi0tZXh0cmFjdGVkX2lucHV0X3RhcmdldF9maWxlcyI6CiAgICAgICBPUFRJT05TLmV4dHJhY3RlZF9pbnB1dCA9IGEKICAgICBlbGlmIG8gPT0gIi0tc2tpcF9wb3N0aW5zdGFsbCI6CkBAIC0xMTkyLDExICsxMjg1LDIwIEBACiAgICAgZWxpZiBvID09ICItLWVuYWJsZV96dWNjaGluaSI6CiAgICAgICBhc3NlcnQgYS5sb3dlcigpIGluIFsidHJ1ZSIsICJmYWxzZSJdCiAgICAgICBPUFRJT05TLmVuYWJsZV96dWNjaGluaSA9IGEubG93ZXIoKSAhPSAiZmFsc2UiCisgICAgZWxpZiBvID09ICItLWVuYWJsZV9wdWZmZGlmZiI6CisgICAgICBhc3NlcnQgYS5sb3dlcigpIGluIFsidHJ1ZSIsICJmYWxzZSJdCisgICAgICBPUFRJT05TLmVuYWJsZV9wdWZmZGlmZiA9IGEubG93ZXIoKSAhPSAiZmFsc2UiCiAgICAgZWxpZiBvID09ICItLWVuYWJsZV9sejRkaWZmIjoKICAgICAgIGFzc2VydCBhLmxvd2VyKCkgaW4gWyJ0cnVlIiwgImZhbHNlIl0KICAgICAgIE9QVElPTlMuZW5hYmxlX2x6NGRpZmYgPSBhLmxvd2VyKCkgIT0gImZhbHNlIgogICAgIGVsaWYgbyA9PSAiLS12YWJjX2NvbXByZXNzaW9uX3BhcmFtIjoKKyAgICAgIHdvcmRzID0gYS5zcGxpdCgiLCIpCisgICAgICBhc3NlcnQgbGVuKHdvcmRzKSA+PSAxIGFuZCBsZW4od29yZHMpIDw9IDIKICAgICAgIE9QVElPTlMudmFiY19jb21wcmVzc2lvbl9wYXJhbSA9IGEubG93ZXIoKQorICAgICAgaWYgbGVuKHdvcmRzKSA9PSAyOgorICAgICAgICBpZiBub3Qgd29yZHNbMV0ubHN0cmlwKCItIikuaXNkaWdpdCgpOgorICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBwYXJzZSB2YWx1ZSAlciBmb3Igb3B0aW9uICRDT01QUkVTU0lPTl9MRVZFTCAtIG9ubHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXJzIGFyZSBhbGxvd2VkLiIgJSB3b3Jkc1sxXSkKICAgICBlbGlmIG8gPT0gIi0tc2VjdXJpdHlfcGF0Y2hfbGV2ZWwiOgogICAgICAgT1BUSU9OUy5zZWN1cml0eV9wYXRjaF9sZXZlbCA9IGEKICAgICBlbGlmIG8gaW4gKCItLW1heF90aHJlYWRzIik6CkBAIC0xMjA1LDYgKzEzMDcsMTkgQEAKICAgICAgIGVsc2U6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBwYXJzZSB2YWx1ZSAlciBmb3Igb3B0aW9uICVyIC0gb25seSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXJzIGFyZSBhbGxvd2VkLiIgJSAoYSwgbykpCisgICAgZWxpZiBvIGluICgiLS1jb21wcmVzc2lvbl9mYWN0b3IiKToKKyAgICAgICAgdmFsdWVzID0gWyI0ayIsICI4ayIsICIxNmsiLCAiMzJrIiwgIjY0ayIsICIxMjhrIiwgIjI1NmsiXQorICAgICAgICBpZiBhWzotMV0uaXNkaWdpdCgpIGFuZCBhIGluIHZhbHVlcyBhbmQgYS5lbmRzd2l0aCgiayIpOgorICAgICAgICAgICAgT1BUSU9OUy5jb21wcmVzc2lvbl9mYWN0b3IgPSBzdHIoaW50KGFbOi0xXSkgKiAxMDI0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUGxlYXNlIHNwZWNpZnkgdmFsdWUgZnJvbSBmb2xsb3dpbmcgb3B0aW9uczogNGssIDhrLCAxNmssIDMyaywgNjRrLCAxMjhrIiwgIjI1NmsiKQorCisgICAgZWxpZiBvID09ICItLXZhYmNfY293X3ZlcnNpb24iOgorICAgICAgaWYgYS5pc2RpZ2l0KCk6CisgICAgICAgIE9QVElPTlMudmFiY19jb3dfdmVyc2lvbiA9IGEKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBwYXJzZSB2YWx1ZSAlciBmb3Igb3B0aW9uICVyIC0gb25seSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXJzIGFyZSBhbGxvd2VkLiIgJSAoYSwgbykpCiAgICAgZWxzZToKICAgICAgIHJldHVybiBGYWxzZQogICAgIHJldHVybiBUcnVlCkBAIC0xMjEyLDcgKzEzMjcsNiBAQAogICBhcmdzID0gY29tbW9uLlBhcnNlT3B0aW9ucyhhcmd2LCBfX2RvY19fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9vcHRzPSJiOms6aTpkOmU6dDoybzoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9sb25nX29wdHM9WwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2Vfa2V5PSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jcmVtZW50YWxfZnJvbT0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bGxfcmFkaW8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bGxfYm9vdGxvYWRlciIsCkBAIC0xMjMxLDEwICsxMzQ1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXNoX3RocmVzaG9sZD0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ19kaWZmPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF5bG9hZF9zaWduZXI9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXlsb2FkX3NpZ25lcl9hcmdzPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZT0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBheWxvYWRfc2lnbmVyX2tleV9zaXplPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFjdGVkX2lucHV0X3RhcmdldF9maWxlcz0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNraXBfcG9zdGluc3RhbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHJvZml0X2R5bmFtaWNfcGFydGl0aW9ucyIsCkBAIC0xMjUzLDExICsxMzYzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2VfbWlub3JfdmVyc2lvbj0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXByZXNzb3JfdHlwZXM9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVfenVjY2hpbmk9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVfcHVmZmRpZmY9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVfbHo0ZGlmZj0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhYmNfY29tcHJlc3Npb25fcGFyYW09IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWN1cml0eV9wYXRjaF9sZXZlbD0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heF90aHJlYWRzPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGV4dHJhX29wdGlvbl9oYW5kbGVyPW9wdGlvbl9oYW5kbGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhYmNfY293X3ZlcnNpb249IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2lvbl9mYWN0b3I9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgZXh0cmFfb3B0aW9uX2hhbmRsZXI9W29wdGlvbl9oYW5kbGVyLCBwYXlsb2FkX3NpZ25lci5zaWduZXJfb3B0aW9uc10pCiAgIGNvbW1vbi5Jbml0TG9nZ2luZygpCiAKICAgaWYgbGVuKGFyZ3MpICE9IDI6CmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvb3RhX3NpZ25pbmdfdXRpbHMucHkgYi90b29scy9yZWxlYXNldG9vbHMvb3RhX3NpZ25pbmdfdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjOGM5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfc2lnbmluZ191dGlscy5weQpAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBzaGxleAorCisKK2RlZiBQYXJzZVNpZ25lckFyZ3MoYXJncyk6CisgIGlmIGFyZ3MgaXMgTm9uZToKKyAgICByZXR1cm4gTm9uZQorICByZXR1cm4gc2hsZXguc3BsaXQoYXJncykKKworCitkZWYgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UocGFyc2VyOiBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6CisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcGFja2FnZV9rZXknLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRocyB0byBwcml2YXRlIGtleSBmb3Igc2lnbmluZyBwYXlsb2FkJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zZWFyY2hfcGF0aCcsICctLXBhdGgnLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTZWFyY2ggcGF0aCBmb3IgZnJhbWV3b3JrL3NpZ25hcGsuamFyJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXlsb2FkX3NpZ25lcicsIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gY3VzdG9tIHBheWxvYWQgc2lnbmVyJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXlsb2FkX3NpZ25lcl9hcmdzJywgdHlwZT1QYXJzZVNpZ25lckFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nQXJndW1lbnRzIGZvciBwYXlsb2FkIHNpZ25lciBpZiBuZWNlc3NhcnknKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUnLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdNYXhpbXVtIHNpZ25hdHVyZSBzaXplIChpbiBieXRlcykgdGhhdCB3b3VsZCBiZSAnCisgICAgICAgICAgICAgICAgICAgICAgJ2dlbmVyYXRlZCBieSB0aGUgZ2l2ZW4gcGF5bG9hZCBzaWduZXInKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByaXZhdGVfa2V5X3N1ZmZpeCcsIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1N1ZmZpeCB0byBiZSBhcHBlbmRlZCB0byBwYWNrYWdlX2tleSBwYXRoJywgZGVmYXVsdD0iLnBrOCIpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvb3RhX3V0aWxzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV91dGlscy5weQppbmRleCAzMjkxZDU2Li44MWI1M2RjIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvb3RhX3V0aWxzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfdXRpbHMucHkKQEAgLTI3LDcgKzI3LDggQEAKICAgICAgICAgICAgICAgICAgICAgWmlwV3JpdGVTdHIsIEJ1aWxkSW5mbywgTG9hZERpY3Rpb25hcnlGcm9tRmlsZSwKICAgICAgICAgICAgICAgICAgICAgU2lnbkZpbGUsIFBBUlRJVElPTlNfV0lUSF9CVUlMRF9QUk9QLCBQYXJ0aXRpb25CdWlsZFByb3BzLAogICAgICAgICAgICAgICAgICAgICBHZXRSYW1kaXNrRm9ybWF0LCBQYXJzZVVwZGF0ZUVuZ2luZUNvbmZpZykKLWZyb20gcGF5bG9hZF9zaWduZXIgaW1wb3J0IFBheWxvYWRTaWduZXIKK2ltcG9ydCBwYXlsb2FkX3NpZ25lcgorZnJvbSBwYXlsb2FkX3NpZ25lciBpbXBvcnQgUGF5bG9hZFNpZ25lciwgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UsIEdlbmVyYXRlUGF5bG9hZFByb3BlcnRpZXMKIAogCiBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKQEAgLTM3LDcgKzM4LDYgQEAKIE9QVElPTlMud2lwZV91c2VyX2RhdGEgPSBGYWxzZQogT1BUSU9OUy5kb3duZ3JhZGUgPSBGYWxzZQogT1BUSU9OUy5rZXlfcGFzc3dvcmRzID0ge30KLU9QVElPTlMucGFja2FnZV9rZXkgPSBOb25lCiBPUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSA9IE5vbmUKIE9QVElPTlMucmV0cm9maXRfZHluYW1pY19wYXJ0aXRpb25zID0gRmFsc2UKIE9QVElPTlMub3V0cHV0X21ldGFkYXRhX3BhdGggPSBOb25lCkBAIC00OCw2ICs0OCwyMCBAQAogVU5aSVBfUEFUVEVSTiA9IFsnSU1BR0VTLyonLCAnTUVUQS8qJywgJ09UQS8qJywKICAgICAgICAgICAgICAgICAgJ1JBRElPLyonLCAnKi9idWlsZC5wcm9wJywgJyovZGVmYXVsdC5wcm9wJywgJyovYnVpbGQuZGVmYXVsdCcsICIqL2V0Yy92aW50Zi8qIl0KIFNFQ1VSSVRZX1BBVENIX0xFVkVMX1BST1BfTkFNRSA9ICJyby5idWlsZC52ZXJzaW9uLnNlY3VyaXR5X3BhdGNoIgorVEFSR0VUX0ZJTEVTX0lNQUdFU19TVUJESVIgPSBbIklNQUdFUyIsICJQUkVCVUlMVF9JTUFHRVMiLCAiUkFESU8iXQorCisKKyMgS2V5IGlzIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0sIHZhbHVlIGlzIG1pbmltdW0gQVBJIGxldmVsIHJlcXVpcmVkIHRvCisjIHVzZSB0aGlzIGNvbXByZXNzaW9uIGFsZ29yaXRobSBmb3IgVkFCQyBPVEEgb24gZGV2aWNlLgorVkFCQ19DT01QUkVTU0lPTl9QQVJBTV9TVVBQT1JUID0geworICAgICJneiI6IDMxLAorICAgICJicm90bGkiOiAzMSwKKyAgICAibm9uZSI6IDMxLAorICAgICMgbHo0IHN1cHBvcnQgaXMgYWRkZWQgaW4gQW5kcm9pZCBVCisgICAgImx6NCI6IDM0LAorICAgICMgenN0ZCBzdXBwb3J0IGlzIGFkZGVkIGluIEFuZHJvaWQgVgorICAgICJ6c3RkIjogMzUsCit9CiAKIAogZGVmIEZpbmFsaXplTWV0YWRhdGEobWV0YWRhdGEsIGlucHV0X2ZpbGUsIG91dHB1dF9maWxlLCBuZWVkZWRfcHJvcGVydHlfZmlsZXM9Tm9uZSwgcGFja2FnZV9rZXk9Tm9uZSwgcHc9Tm9uZSk6CkBAIC0zNTAsMjYgKzM2NCw2NiBAQAogICAjIE9ubHkgaW5jcmVtZW50YWwgT1RBcyBhcmUgYWxsb3dlZCB0byByZWFjaCBoZXJlLgogICBhc3NlcnQgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgaXMgbm90IE5vbmUKIAorICAjIHVzZWQgZm9yIGxvZ2dpbmcgdXBvbiBlcnJvcnMKKyAgbG9nX2Rvd25ncmFkZXMgPSBbXQorICBsb2dfdXBncmFkZXMgPSBbXQorCiAgIHBvc3RfdGltZXN0YW1wID0gdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wKCJyby5idWlsZC5kYXRlLnV0YyIpCiAgIHByZV90aW1lc3RhbXAgPSBzb3VyY2VfaW5mby5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIikKLSAgaXNfZG93bmdyYWRlID0gaW50KHBvc3RfdGltZXN0YW1wKSA8IGludChwcmVfdGltZXN0YW1wKQorICBpZiBpbnQocG9zdF90aW1lc3RhbXApIDwgaW50KHByZV90aW1lc3RhbXApOgorICAgIGxvZ2dlci5pbmZvKGYicm8uYnVpbGQuZGF0ZS51dGMgcHJlIHRpbWVzdGFtcDoge3ByZV90aW1lc3RhbXB9LCAiCisgICAgICAgICAgICAgICAgZiJwb3N0IHRpbWVzdGFtcDoge3Bvc3RfdGltZXN0YW1wfS4gRG93bmdyYWRlIGRldGVjdGVkLiIpCisgICAgbG9nX2Rvd25ncmFkZXMuYXBwZW5kKGYicm8uYnVpbGQuZGF0ZS51dGMgcHJlOiB7cHJlX3RpbWVzdGFtcH0gcG9zdDoge3Bvc3RfdGltZXN0YW1wfSIpCisgIGVsc2U6CisgICAgbG9nZ2VyLmluZm8oZiJyby5idWlsZC5kYXRlLnV0YyBwcmUgdGltZXN0YW1wOiB7cHJlX3RpbWVzdGFtcH0sICIKKyAgICAgICAgICAgICAgICBmInBvc3QgdGltZXN0YW1wOiB7cG9zdF90aW1lc3RhbXB9LiIpCisgICAgbG9nX3VwZ3JhZGVzLmFwcGVuZChmInJvLmJ1aWxkLmRhdGUudXRjIHByZToge3ByZV90aW1lc3RhbXB9IHBvc3Q6IHtwb3N0X3RpbWVzdGFtcH0iKQorCisgICMgV2hlbiBtZXJnaW5nIHN5c3RlbSBhbmQgdmVuZG9yIHRhcmdldCBmaWxlcywgaXQgaXMgbm90IGVub3VnaAorICAjIHRvIGNoZWNrIHJvLmJ1aWxkLmRhdGUudXRjLCB0aGUgdGltZXN0YW1wIGZvciBlYWNoIHBhcnRpdGlvbiBtdXN0CisgICMgYmUgY2hlY2tlZC4KKyAgaWYgc291cmNlX2luZm8uaXNfYWI6CisgICAgYWJfcGFydGl0aW9ucyA9IHNldChzb3VyY2VfaW5mby5nZXQoImFiX3BhcnRpdGlvbnMiKSkKKyAgICBmb3IgcGFydGl0aW9uIGluIHNvcnRlZChzZXQoUEFSVElUSU9OU19XSVRIX0JVSUxEX1BST1ApICYgYWJfcGFydGl0aW9ucyk6CisKKyAgICAgIHBhcnRpdGlvbl9wcm9wID0gc291cmNlX2luZm8uZ2V0KCd7fS5idWlsZC5wcm9wJy5mb3JtYXQocGFydGl0aW9uKSkKKyAgICAgICMgU2tpcCBpZiB0aGUgcGFydGl0aW9uIGlzIG1pc3NpbmcsIG9yIGl0IGRvZXNuJ3QgaGF2ZSBhIGJ1aWxkLnByb3AKKyAgICAgIGlmIG5vdCBwYXJ0aXRpb25fcHJvcCBvciBub3QgcGFydGl0aW9uX3Byb3AuYnVpbGRfcHJvcHM6CisgICAgICAgIGNvbnRpbnVlCisgICAgICBwYXJ0aXRpb25fcHJvcCA9IHRhcmdldF9pbmZvLmdldCgne30uYnVpbGQucHJvcCcuZm9ybWF0KHBhcnRpdGlvbikpCisgICAgICAjIFNraXAgaWYgdGhlIHBhcnRpdGlvbiBpcyBtaXNzaW5nLCBvciBpdCBkb2Vzbid0IGhhdmUgYSBidWlsZC5wcm9wCisgICAgICBpZiBub3QgcGFydGl0aW9uX3Byb3Agb3Igbm90IHBhcnRpdGlvbl9wcm9wLmJ1aWxkX3Byb3BzOgorICAgICAgICBjb250aW51ZQorCisgICAgICBwb3N0X3RpbWVzdGFtcCA9IHRhcmdldF9pbmZvLkdldFBhcnRpdGlvbkJ1aWxkUHJvcCgKKyAgICAgICAgJ3JvLmJ1aWxkLmRhdGUudXRjJywgcGFydGl0aW9uKQorICAgICAgcHJlX3RpbWVzdGFtcCA9IHNvdXJjZV9pbmZvLkdldFBhcnRpdGlvbkJ1aWxkUHJvcCgKKyAgICAgICAgJ3JvLmJ1aWxkLmRhdGUudXRjJywgcGFydGl0aW9uKQorICAgICAgaWYgaW50KHBvc3RfdGltZXN0YW1wKSA8IGludChwcmVfdGltZXN0YW1wKToKKyAgICAgICAgbG9nZ2VyLmluZm8oZiJQYXJ0aXRpb24ge3BhcnRpdGlvbn0gcHJlIHRpbWVzdGFtcDoge3ByZV90aW1lc3RhbXB9LCAiCisgICAgICAgICAgICAgICAgICAgIGYicG9zdCB0aW1lOiB7cG9zdF90aW1lc3RhbXB9LiBEb3duZ3JhZGUgZGV0ZWN0ZWQuIikKKyAgICAgICAgbG9nX2Rvd25ncmFkZXMuYXBwZW5kKGYie3BhcnRpdGlvbn0gcHJlOiB7cHJlX3RpbWVzdGFtcH0gcG9zdDoge3Bvc3RfdGltZXN0YW1wfSIpCisgICAgICBlbHNlOgorICAgICAgICBsb2dnZXIuaW5mbyhmIlBhcnRpdGlvbiB7cGFydGl0aW9ufSBwcmUgdGltZXN0YW1wOiB7cHJlX3RpbWVzdGFtcH0sICIKKyAgICAgICAgICAgICAgICAgICAgZiJwb3N0IHRpbWVzdGFtcDoge3Bvc3RfdGltZXN0YW1wfS4iKQorICAgICAgICBsb2dfdXBncmFkZXMuYXBwZW5kKGYie3BhcnRpdGlvbn0gcHJlOiB7cHJlX3RpbWVzdGFtcH0gcG9zdDoge3Bvc3RfdGltZXN0YW1wfSIpCiAKICAgaWYgT1BUSU9OUy5zcGxfZG93bmdyYWRlOgogICAgIG1ldGFkYXRhX3Byb3RvLnNwbF9kb3duZ3JhZGUgPSBUcnVlCiAKICAgaWYgT1BUSU9OUy5kb3duZ3JhZGU6Ci0gICAgaWYgbm90IGlzX2Rvd25ncmFkZToKKyAgICBpZiBsZW4obG9nX2Rvd25ncmFkZXMpID09IDA6CiAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgIi0tZG93bmdyYWRlIG9yIC0tb3ZlcnJpZGVfdGltZXN0YW1wIHNwZWNpZmllZCBidXQgbm8gZG93bmdyYWRlICIKLSAgICAgICAgICAiZGV0ZWN0ZWQ6IHByZTogJXMsIHBvc3Q6ICVzIiAlIChwcmVfdGltZXN0YW1wLCBwb3N0X3RpbWVzdGFtcCkpCisgICAgICAgICAgImRldGVjdGVkLiBDdXJyZW50IHZhbHVlcyBmb3Igcm8uYnVpbGQuZGF0ZS51dGM6ICIgKyAnLCAnLmpvaW4obG9nX3VwZ3JhZGVzKSkKICAgICBtZXRhZGF0YV9wcm90by5kb3duZ3JhZGUgPSBUcnVlCiAgIGVsc2U6Ci0gICAgaWYgaXNfZG93bmdyYWRlOgorICAgIGlmIGxlbihsb2dfZG93bmdyYWRlcykgIT0gMDoKICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKLSAgICAgICAgICAiRG93bmdyYWRlIGRldGVjdGVkIGJhc2VkIG9uIHRpbWVzdGFtcCBjaGVjazogcHJlOiAlcywgcG9zdDogJXMuICIKKyAgICAgICAgICAiRG93bmdyYWRlIGRldGVjdGVkIGJhc2VkIG9uIHRpbWVzdGFtcCBjaGVjayBpbiByby5idWlsZC5kYXRlLnV0Yy4gIgogICAgICAgICAgICJOZWVkIHRvIHNwZWNpZnkgLS1vdmVycmlkZV90aW1lc3RhbXAgT1IgLS1kb3duZ3JhZGUgdG8gYWxsb3cgIgotICAgICAgICAgICJidWlsZGluZyB0aGUgaW5jcmVtZW50YWwuIiAlIChwcmVfdGltZXN0YW1wLCBwb3N0X3RpbWVzdGFtcCkpCi0KKyAgICAgICAgICAiYnVpbGRpbmcgdGhlIGluY3JlbWVudGFsLiBEb3duZ3JhZGVzIGRldGVjdGVkIGZvcjogIgorICAgICAgICAgICsgJywgJy5qb2luKGxvZ19kb3duZ3JhZGVzKSkKIAogZGVmIENvbXB1dGVSdW50aW1lQnVpbGRJbmZvcyhkZWZhdWx0X2J1aWxkX2luZm8sIGJvb3RfdmFyaWFibGVfdmFsdWVzKToKICAgIiIiUmV0dXJucyBhIHNldCBvZiBidWlsZCBpbmZvIG9iamVjdHMgdGhhdCBtYXkgZXhpc3QgZHVyaW5nIHJ1bnRpbWUuIiIiCkBAIC03MjYsMTcgKzc4MCwyNSBAQAogICAgIGxvZ2dlci5pbmZvKCJ0YXJnZXQgZmlsZXMgJXMgaXMgYWxyZWFkeSBleHRyYWN0ZWQiLCBwYXRoKQogICAgIHJldHVybiBwYXRoCiAgIGV4dHJhY3RlZF9kaXIgPSBjb21tb24uTWFrZVRlbXBEaXIoInRhcmdldF9maWxlcyIpCisgIGxvZ2dlci5pbmZvKGYiRXh0cmFjdGluZyB0YXJnZXQgZmlsZXMge3BhdGh9IHRvIHtleHRyYWN0ZWRfZGlyfSIpCiAgIGNvbW1vbi5VbnppcFRvRGlyKHBhdGgsIGV4dHJhY3RlZF9kaXIsIFVOWklQX1BBVFRFUk4gKyBbIiJdKQorICBmb3Igc3ViZGlyIGluIFRBUkdFVF9GSUxFU19JTUFHRVNfU1VCRElSOgorICAgIGltYWdlX2RpciA9IG9zLnBhdGguam9pbihleHRyYWN0ZWRfZGlyLCBzdWJkaXIpCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGltYWdlX2Rpcik6CisgICAgICBjb250aW51ZQorICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGltYWdlX2Rpcik6CisgICAgICBpZiBub3QgZmlsZW5hbWUuZW5kc3dpdGgoIi5pbWciKToKKyAgICAgICAgY29udGludWUKKyAgICAgIGNvbW1vbi5VbnNwYXJzZUltYWdlKG9zLnBhdGguam9pbihpbWFnZV9kaXIsIGZpbGVuYW1lKSkKKwogICByZXR1cm4gZXh0cmFjdGVkX2RpcgogCiAKIGRlZiBMb2NhdGVQYXJ0aXRpb25QYXRoKHRhcmdldF9maWxlc19kaXI6IHN0ciwgcGFydGl0aW9uOiBzdHIsIGFsbG93X2VtcHR5KToKLSAgcGF0aCA9IG9zLnBhdGguam9pbih0YXJnZXRfZmlsZXNfZGlyLCAiUkFESU8iLCBwYXJ0aXRpb24gKyAiLmltZyIpCi0gIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgotICAgIHJldHVybiBwYXRoCi0gIHBhdGggPSBvcy5wYXRoLmpvaW4odGFyZ2V0X2ZpbGVzX2RpciwgIklNQUdFUyIsIHBhcnRpdGlvbiArICIuaW1nIikKLSAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0gICAgcmV0dXJuIHBhdGgKKyAgZm9yIHN1YmRpciBpbiBUQVJHRVRfRklMRVNfSU1BR0VTX1NVQkRJUjoKKyAgICBwYXRoID0gb3MucGF0aC5qb2luKHRhcmdldF9maWxlc19kaXIsIHN1YmRpciwgcGFydGl0aW9uICsgIi5pbWciKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgcmV0dXJuIHBhdGgKICAgaWYgYWxsb3dfZW1wdHk6CiAgICAgcmV0dXJuICIiCiAgIHJhaXNlIGNvbW1vbi5FeHRlcm5hbEVycm9yKApAQCAtNzQ5LDkgKzgxMSwxMCBAQAogCiAKIGRlZiBMb2NhdGVQYXJ0aXRpb25NYXAodGFyZ2V0X2ZpbGVzX2Rpcjogc3RyLCBwYXJ0aXRpb246IHN0cik6Ci0gIHBhdGggPSBvcy5wYXRoLmpvaW4odGFyZ2V0X2ZpbGVzX2RpciwgIlJBRElPIiwgcGFydGl0aW9uICsgIi5tYXAiKQotICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICByZXR1cm4gcGF0aAorICBmb3Igc3ViZGlyIGluIFRBUkdFVF9GSUxFU19JTUFHRVNfU1VCRElSOgorICAgIHBhdGggPSBvcy5wYXRoLmpvaW4odGFyZ2V0X2ZpbGVzX2Rpciwgc3ViZGlyLCBwYXJ0aXRpb24gKyAiLm1hcCIpCisgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICByZXR1cm4gcGF0aAogICByZXR1cm4gIiIKIAogCkBAIC03NjMsMTIgKzgyNiwxMiBAQAogY2xhc3MgUGF5bG9hZEdlbmVyYXRvcihvYmplY3QpOgogICAiIiJNYW5hZ2VzIHRoZSBjcmVhdGlvbiBhbmQgdGhlIHNpZ25pbmcgb2YgYW4gQS9CIE9UQSBQYXlsb2FkLiIiIgogCi0gIFBBWUxPQURfQklOID0gJ3BheWxvYWQuYmluJwotICBQQVlMT0FEX1BST1BFUlRJRVNfVFhUID0gJ3BheWxvYWRfcHJvcGVydGllcy50eHQnCisgIFBBWUxPQURfQklOID0gcGF5bG9hZF9zaWduZXIuUEFZTE9BRF9CSU4KKyAgUEFZTE9BRF9QUk9QRVJUSUVTX1RYVCA9IHBheWxvYWRfc2lnbmVyLlBBWUxPQURfUFJPUEVSVElFU19UWFQKICAgU0VDT05EQVJZX1BBWUxPQURfQklOID0gJ3NlY29uZGFyeS9wYXlsb2FkLmJpbicKICAgU0VDT05EQVJZX1BBWUxPQURfUFJPUEVSVElFU19UWFQgPSAnc2Vjb25kYXJ5L3BheWxvYWRfcHJvcGVydGllcy50eHQnCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHNlY29uZGFyeT1GYWxzZSwgd2lwZV91c2VyX2RhdGE9RmFsc2UsIG1pbm9yX3ZlcnNpb249Tm9uZSwgaXNfcGFydGlhbF91cGRhdGU9RmFsc2UpOgorICBkZWYgX19pbml0X18oc2VsZiwgc2Vjb25kYXJ5PUZhbHNlLCB3aXBlX3VzZXJfZGF0YT1GYWxzZSwgbWlub3JfdmVyc2lvbj1Ob25lLCBpc19wYXJ0aWFsX3VwZGF0ZT1GYWxzZSwgc3BsX2Rvd25ncmFkZT1GYWxzZSk6CiAgICAgIiIiSW5pdGlhbGl6ZXMgYSBQYXlsb2FkIGluc3RhbmNlLgogCiAgICAgQXJnczoKQEAgLTc4MCw2ICs4NDMsNyBAQAogICAgIHNlbGYud2lwZV91c2VyX2RhdGEgPSB3aXBlX3VzZXJfZGF0YQogICAgIHNlbGYubWlub3JfdmVyc2lvbiA9IG1pbm9yX3ZlcnNpb24KICAgICBzZWxmLmlzX3BhcnRpYWxfdXBkYXRlID0gaXNfcGFydGlhbF91cGRhdGUKKyAgICBzZWxmLnNwbF9kb3duZ3JhZGUgPSBzcGxfZG93bmdyYWRlCiAKICAgZGVmIF9SdW4oc2VsZiwgY21kKTogICMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtdXNlCiAgICAgIyBEb24ndCBwaXBlIChidWZmZXIpIHRoZSBvdXRwdXQgaWYgdmVyYm9zZSBpcyBzZXQuIExldApAQCAtODA3LDggKzg3MSw4IEBACiAgICAgdGFyZ2V0X2RpciA9IEV4dHJhY3RUYXJnZXRGaWxlcyh0YXJnZXRfZmlsZSkKICAgICBjbWQgPSBbImRlbHRhX2dlbmVyYXRvciIsCiAgICAgICAgICAgICItLW91dF9maWxlIiwgcGF5bG9hZF9maWxlXQotICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4odGFyZ2V0X2RpciwgIk1FVEEiLCAiYWJfcGFydGl0aW9ucy50eHQiKSkgYXMgZnA6Ci0gICAgICBhYl9wYXJ0aXRpb25zID0gZnAucmVhZCgpLnN0cmlwKCkuc3BsaXQoIlxuIikKKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHRhcmdldF9kaXIsICJNRVRBIiwgImFiX3BhcnRpdGlvbnMudHh0IiksICJyIikgYXMgZnA6CisgICAgICBhYl9wYXJ0aXRpb25zID0gZnAucmVhZCgpLnN0cmlwKCkuc3BsaXRsaW5lcygpCiAgICAgY21kLmV4dGVuZChbIi0tcGFydGl0aW9uX25hbWVzIiwgIjoiLmpvaW4oYWJfcGFydGl0aW9ucyldKQogICAgIGNtZC5leHRlbmQoCiAgICAgICAgIFsiLS1uZXdfcGFydGl0aW9ucyIsIEdldFBhcnRpdGlvbkltYWdlcyh0YXJnZXRfZGlyLCBhYl9wYXJ0aXRpb25zLCBGYWxzZSldKQpAQCAtODM2LDYgKzkwMCwxMSBAQAogICAgIGlmIG9zLnBhdGguZXhpc3RzKGR5bmFtaWNfcGFydGl0aW9uX2luZm8pOgogICAgICAgY21kLmV4dGVuZChbIi0tZHluYW1pY19wYXJ0aXRpb25faW5mb19maWxlIiwgZHluYW1pY19wYXJ0aXRpb25faW5mb10pCiAKKyAgICBhcGV4X2luZm8gPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIHRhcmdldF9kaXIsICJNRVRBIiwgImFwZXhfaW5mby5wYiIpCisgICAgaWYgb3MucGF0aC5leGlzdHMoYXBleF9pbmZvKToKKyAgICAgIGNtZC5leHRlbmQoWyItLWFwZXhfaW5mb19maWxlIiwgYXBleF9pbmZvXSkKKwogICAgIG1ham9yX3ZlcnNpb24sIG1pbm9yX3ZlcnNpb24gPSBQYXJzZVVwZGF0ZUVuZ2luZUNvbmZpZygKICAgICAgICAgb3MucGF0aC5qb2luKHRhcmdldF9kaXIsICJNRVRBIiwgInVwZGF0ZV9lbmdpbmVfY29uZmlnLnR4dCIpKQogICAgIGlmIHNvdXJjZV9maWxlOgpAQCAtODY1LDMwICs5MzQsNyBAQAogICAgICIiIgogICAgIGFzc2VydCBpc2luc3RhbmNlKHBheWxvYWRfc2lnbmVyLCBQYXlsb2FkU2lnbmVyKQogCi0gICAgIyAxLiBHZW5lcmF0ZSBoYXNoZXMgb2YgdGhlIHBheWxvYWQgYW5kIG1ldGFkYXRhIGZpbGVzLgotICAgIHBheWxvYWRfc2lnX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnLSIsIHN1ZmZpeD0iLmJpbiIpCi0gICAgbWV0YWRhdGFfc2lnX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnLSIsIHN1ZmZpeD0iLmJpbiIpCi0gICAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAiaGFzaCIsCi0gICAgICAgICAgICItLXVuc2lnbmVkX3BheWxvYWQiLCBzZWxmLnBheWxvYWRfZmlsZSwKLSAgICAgICAgICAgIi0tc2lnbmF0dXJlX3NpemUiLCBzdHIocGF5bG9hZF9zaWduZXIubWF4aW11bV9zaWduYXR1cmVfc2l6ZSksCi0gICAgICAgICAgICItLW1ldGFkYXRhX2hhc2hfZmlsZSIsIG1ldGFkYXRhX3NpZ19maWxlLAotICAgICAgICAgICAiLS1wYXlsb2FkX2hhc2hfZmlsZSIsIHBheWxvYWRfc2lnX2ZpbGVdCi0gICAgc2VsZi5fUnVuKGNtZCkKLQotICAgICMgMi4gU2lnbiB0aGUgaGFzaGVzLgotICAgIHNpZ25lZF9wYXlsb2FkX3NpZ19maWxlID0gcGF5bG9hZF9zaWduZXIuU2lnbkhhc2hGaWxlKHBheWxvYWRfc2lnX2ZpbGUpCi0gICAgc2lnbmVkX21ldGFkYXRhX3NpZ19maWxlID0gcGF5bG9hZF9zaWduZXIuU2lnbkhhc2hGaWxlKG1ldGFkYXRhX3NpZ19maWxlKQotCi0gICAgIyAzLiBJbnNlcnQgdGhlIHNpZ25hdHVyZXMgYmFjayBpbnRvIHRoZSBwYXlsb2FkIGZpbGUuCi0gICAgc2lnbmVkX3BheWxvYWRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWduZWQtcGF5bG9hZC0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLmJpbiIpCi0gICAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAic2lnbiIsCi0gICAgICAgICAgICItLXVuc2lnbmVkX3BheWxvYWQiLCBzZWxmLnBheWxvYWRfZmlsZSwKLSAgICAgICAgICAgIi0tcGF5bG9hZCIsIHNpZ25lZF9wYXlsb2FkX2ZpbGUsCi0gICAgICAgICAgICItLXNpZ25hdHVyZV9zaXplIiwgc3RyKHBheWxvYWRfc2lnbmVyLm1heGltdW1fc2lnbmF0dXJlX3NpemUpLAotICAgICAgICAgICAiLS1tZXRhZGF0YV9zaWduYXR1cmVfZmlsZSIsIHNpZ25lZF9tZXRhZGF0YV9zaWdfZmlsZSwKLSAgICAgICAgICAgIi0tcGF5bG9hZF9zaWduYXR1cmVfZmlsZSIsIHNpZ25lZF9wYXlsb2FkX3NpZ19maWxlXQotICAgIHNlbGYuX1J1bihjbWQpCisgICAgc2lnbmVkX3BheWxvYWRfZmlsZSA9IHBheWxvYWRfc2lnbmVyLlNpZ25QYXlsb2FkKHNlbGYucGF5bG9hZF9maWxlKQogCiAgICAgc2VsZi5wYXlsb2FkX2ZpbGUgPSBzaWduZWRfcGF5bG9hZF9maWxlCiAKQEAgLTkwMCwyMCArOTQ2LDE3IEBACiAgICAgIiIiCiAgICAgYXNzZXJ0IHNlbGYucGF5bG9hZF9maWxlIGlzIG5vdCBOb25lCiAgICAgIyA0LiBEdW1wIHRoZSBzaWduZWQgcGF5bG9hZCBwcm9wZXJ0aWVzLgotICAgIHByb3BlcnRpZXNfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJwYXlsb2FkLXByb3BlcnRpZXMtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLnR4dCIpCi0gICAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAicHJvcGVydGllcyIsCi0gICAgICAgICAgICItLXBheWxvYWQiLCBzZWxmLnBheWxvYWRfZmlsZSwKLSAgICAgICAgICAgIi0tcHJvcGVydGllc19maWxlIiwgcHJvcGVydGllc19maWxlXQotICAgIHNlbGYuX1J1bihjbWQpCisgICAgcHJvcGVydGllc19maWxlID0gR2VuZXJhdGVQYXlsb2FkUHJvcGVydGllcyhzZWxmLnBheWxvYWRfZmlsZSkKIAotICAgIGlmIHNlbGYuc2Vjb25kYXJ5OgotICAgICAgd2l0aCBvcGVuKHByb3BlcnRpZXNfZmlsZSwgImEiKSBhcyBmOgotICAgICAgICBmLndyaXRlKCJTV0lUQ0hfU0xPVF9PTl9SRUJPT1Q9MFxuIikKIAotICAgIGlmIHNlbGYud2lwZV91c2VyX2RhdGE6Ci0gICAgICB3aXRoIG9wZW4ocHJvcGVydGllc19maWxlLCAiYSIpIGFzIGY6CisgICAgd2l0aCBvcGVuKHByb3BlcnRpZXNfZmlsZSwgImEiKSBhcyBmOgorICAgICAgaWYgc2VsZi53aXBlX3VzZXJfZGF0YToKICAgICAgICAgZi53cml0ZSgiUE9XRVJXQVNIPTFcbiIpCisgICAgICBpZiBzZWxmLnNlY29uZGFyeToKKyAgICAgICAgZi53cml0ZSgiU1dJVENIX1NMT1RfT05fUkVCT09UPTBcbiIpCisgICAgICBpZiBzZWxmLnNwbF9kb3duZ3JhZGU6CisgICAgICAgIGYud3JpdGUoIlNQTF9ET1dOR1JBREU9MVxuIikKKwogCiAgICAgc2VsZi5wYXlsb2FkX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzX2ZpbGUKIApAQCAtMTA0NywxOSArMTA5MCwzMSBAQAogCiBkZWYgQ29weVRhcmdldEZpbGVzRGlyKGlucHV0X2Rpcik6CiAgIG91dHB1dF9kaXIgPSBjb21tb24uTWFrZVRlbXBEaXIoInRhcmdldF9maWxlcyIpCi0gIHNodXRpbC5jb3B5dHJlZShvcy5wYXRoLmpvaW4oaW5wdXRfZGlyLCAiSU1BR0VTIiksIG9zLnBhdGguam9pbigKLSAgICAgIG91dHB1dF9kaXIsICJJTUFHRVMiKSwgZGlyc19leGlzdF9vaz1UcnVlKQorCisgIGRlZiBTeW1saW5rSWZOb3RTcGFyc2Uoc3JjLCBkc3QpOgorICAgIGlmIGNvbW1vbi5Jc1NwYXJzZUltYWdlKHNyYyk6CisgICAgICByZXR1cm4gY29tbW9uLlVuc3BhcnNlSW1hZ2Uoc3JjLCBkc3QpCisgICAgZWxzZToKKyAgICAgIHJldHVybiBvcy5zeW1saW5rKG9zLnBhdGgucmVhbHBhdGgoc3JjKSwgZHN0KQorCisgIGZvciBzdWJkaXIgaW4gVEFSR0VUX0ZJTEVTX0lNQUdFU19TVUJESVI6CisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnB1dF9kaXIsIHN1YmRpcikpOgorICAgICAgY29udGludWUKKyAgICBzaHV0aWwuY29weXRyZWUob3MucGF0aC5qb2luKGlucHV0X2Rpciwgc3ViZGlyKSwgb3MucGF0aC5qb2luKAorICAgICAgICBvdXRwdXRfZGlyLCBzdWJkaXIpLCBkaXJzX2V4aXN0X29rPVRydWUsIGNvcHlfZnVuY3Rpb249U3ltbGlua0lmTm90U3BhcnNlKQogICBzaHV0aWwuY29weXRyZWUob3MucGF0aC5qb2luKGlucHV0X2RpciwgIk1FVEEiKSwgb3MucGF0aC5qb2luKAogICAgICAgb3V0cHV0X2RpciwgIk1FVEEiKSwgZGlyc19leGlzdF9vaz1UcnVlKQorCiAgIGZvciAoZGlycGF0aCwgXywgZmlsZW5hbWVzKSBpbiBvcy53YWxrKGlucHV0X2Rpcik6CiAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZmlsZW5hbWUpCiAgICAgICByZWxhdGl2ZV9wYXRoID0gcGF0aC5yZW1vdmVwcmVmaXgoaW5wdXRfZGlyKS5yZW1vdmVwcmVmaXgoIi8iKQogICAgICAgaWYgbm90IEZubWF0Y2gocmVsYXRpdmVfcGF0aCwgVU5aSVBfUEFUVEVSTik6CiAgICAgICAgIGNvbnRpbnVlCi0gICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgiLnByb3AiKSBvciBmaWxlbmFtZSA9PSAicHJvcC5kZWZhdWx0IiBvciAiL2V0Yy92aW50Zi8iIGluIHJlbGF0aXZlX3BhdGg6Ci0gICAgICAgIHRhcmdldF9wYXRoID0gb3MucGF0aC5qb2luKAotICAgICAgICAgICAgb3V0cHV0X2RpciwgcmVsYXRpdmVfcGF0aCkKLSAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKHRhcmdldF9wYXRoKSwgZXhpc3Rfb2s9VHJ1ZSkKLSAgICAgICAgc2h1dGlsLmNvcHkocGF0aCwgdGFyZ2V0X3BhdGgpCisgICAgICB0YXJnZXRfcGF0aCA9IG9zLnBhdGguam9pbigKKyAgICAgICAgICBvdXRwdXRfZGlyLCByZWxhdGl2ZV9wYXRoKQorICAgICAgaWYgb3MucGF0aC5leGlzdHModGFyZ2V0X3BhdGgpOgorICAgICAgICBjb250aW51ZQorICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKHRhcmdldF9wYXRoKSwgZXhpc3Rfb2s9VHJ1ZSkKKyAgICAgIHNodXRpbC5jb3B5KHBhdGgsIHRhcmdldF9wYXRoKQogICByZXR1cm4gb3V0cHV0X2RpcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3BheWxvYWRfc2lnbmVyLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3BheWxvYWRfc2lnbmVyLnB5CmluZGV4IDk5MzNhZWYuLmU4NWQ2NGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9wYXlsb2FkX3NpZ25lci5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvcGF5bG9hZF9zaWduZXIucHkKQEAgLTE2LDEwICsxNiw1OCBAQAogCiBpbXBvcnQgY29tbW9uCiBpbXBvcnQgbG9nZ2luZwotZnJvbSBjb21tb24gaW1wb3J0IE9QVElPTlMKK2ltcG9ydCBzaGxleAoraW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB6aXBmaWxlCitpbXBvcnQgc2h1dGlsCitmcm9tIGNvbW1vbiBpbXBvcnQgT1BUSU9OUywgT3B0aW9uSGFuZGxlcgorZnJvbSBvdGFfc2lnbmluZ191dGlscyBpbXBvcnQgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UKIAogbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKK09QVElPTlMucGF5bG9hZF9zaWduZXIgPSBOb25lCitPUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MgPSBbXQorT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplID0gTm9uZQorT1BUSU9OUy5wYWNrYWdlX2tleSA9IE5vbmUKKworUEFZTE9BRF9CSU4gPSAncGF5bG9hZC5iaW4nCitQQVlMT0FEX1BST1BFUlRJRVNfVFhUID0gJ3BheWxvYWRfcHJvcGVydGllcy50eHQnCisKK2NsYXNzIFNpZ25lck9wdGlvbnMoT3B0aW9uSGFuZGxlcik6CisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgUGFyc2VPcHRpb25zKG8sIGEpOgorICAgIGlmIG8gaW4gKCItayIsICItLXBhY2thZ2Vfa2V5Iik6CisgICAgICBPUFRJT05TLnBhY2thZ2Vfa2V5ID0gYQorICAgIGVsaWYgbyA9PSAiLS1wYXlsb2FkX3NpZ25lciI6CisgICAgICBPUFRJT05TLnBheWxvYWRfc2lnbmVyID0gYQorICAgIGVsaWYgbyA9PSAiLS1wYXlsb2FkX3NpZ25lcl9hcmdzIjoKKyAgICAgIE9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyA9IHNobGV4LnNwbGl0KGEpCisgICAgZWxpZiBvID09ICItLXBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUiOgorICAgICAgT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplID0gYQorICAgIGVsaWYgbyA9PSAiLS1wYXlsb2FkX3NpZ25lcl9rZXlfc2l6ZSI6CisgICAgICAjIFRPRE8oeHVuY2hhbmcpIHJlbW92ZSB0aGlzIG9wdGlvbiBhZnRlciBjbGVhbmluZyB1cCB0aGUgY2FsbGVycy4KKyAgICAgIGxvZ2dlci53YXJuaW5nKCJUaGUgb3B0aW9uICctLXBheWxvYWRfc2lnbmVyX2tleV9zaXplJyBpcyBkZXByZWNhdGVkLiIKKyAgICAgICAgICAgICAgICAgICAgICAiIFVzZSAnLS1wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplJyBpbnN0ZWFkLiIpCisgICAgICBPUFRJT05TLnBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUgPSBhCisgICAgZWxzZToKKyAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHN1cGVyKCkuX19pbml0X18oCisgICAgICBbInBheWxvYWRfc2lnbmVyPSIsCisgICAgICAgInBhY2thZ2Vfa2V5PSIsCisgICAgICAgInBheWxvYWRfc2lnbmVyX2FyZ3M9IiwKKyAgICAgICAicGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZT0iLAorICAgICAgICJwYXlsb2FkX3NpZ25lcl9rZXlfc2l6ZT0iXSwKKyAgICAgICBTaWduZXJPcHRpb25zLlBhcnNlT3B0aW9ucworICAgICkKKworCitzaWduZXJfb3B0aW9ucyA9IFNpZ25lck9wdGlvbnMoKQorCiAKIGNsYXNzIFBheWxvYWRTaWduZXIob2JqZWN0KToKICAgIiIiQSBjbGFzcyB0aGF0IHdyYXBzIHRoZSBwYXlsb2FkIHNpZ25pbmcgd29ya3MuCkBAIC05NSwxMSArMTQzLDExIEBACiAgICAgIyAxLiBHZW5lcmF0ZSBoYXNoZXMgb2YgdGhlIHBheWxvYWQgYW5kIG1ldGFkYXRhIGZpbGVzLgogICAgIHBheWxvYWRfc2lnX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnLSIsIHN1ZmZpeD0iLmJpbiIpCiAgICAgbWV0YWRhdGFfc2lnX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnLSIsIHN1ZmZpeD0iLmJpbiIpCi0gICAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAiaGFzaCIsCi0gICAgICAgICAgICItLXVuc2lnbmVkX3BheWxvYWQiLCB1bnNpZ25lZF9wYXlsb2FkLAotICAgICAgICAgICAiLS1zaWduYXR1cmVfc2l6ZSIsIHN0cihzZWxmLm1heGltdW1fc2lnbmF0dXJlX3NpemUpLAotICAgICAgICAgICAiLS1tZXRhZGF0YV9oYXNoX2ZpbGUiLCBtZXRhZGF0YV9zaWdfZmlsZSwKLSAgICAgICAgICAgIi0tcGF5bG9hZF9oYXNoX2ZpbGUiLCBwYXlsb2FkX3NpZ19maWxlXQorICAgIGNtZCA9IFsiZGVsdGFfZ2VuZXJhdG9yIiwKKyAgICAgICAgICAgIi0taW5fZmlsZT0iICsgdW5zaWduZWRfcGF5bG9hZCwKKyAgICAgICAgICAgIi0tc2lnbmF0dXJlX3NpemU9IiArIHN0cihzZWxmLm1heGltdW1fc2lnbmF0dXJlX3NpemUpLAorICAgICAgICAgICAiLS1vdXRfbWV0YWRhdGFfaGFzaF9maWxlPSIgKyBtZXRhZGF0YV9zaWdfZmlsZSwKKyAgICAgICAgICAgIi0tb3V0X2hhc2hfZmlsZT0iICsgcGF5bG9hZF9zaWdfZmlsZV0KICAgICBzZWxmLl9SdW4oY21kKQogCiAgICAgIyAyLiBTaWduIHRoZSBoYXNoZXMuCkBAIC0xMDksMTkgKzE1Nyw2NyBAQAogICAgICMgMy4gSW5zZXJ0IHRoZSBzaWduYXR1cmVzIGJhY2sgaW50byB0aGUgcGF5bG9hZCBmaWxlLgogICAgIHNpZ25lZF9wYXlsb2FkX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnbmVkLXBheWxvYWQtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9Ii5iaW4iKQotICAgIGNtZCA9IFsiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIiwgInNpZ24iLAotICAgICAgICAgICAiLS11bnNpZ25lZF9wYXlsb2FkIiwgdW5zaWduZWRfcGF5bG9hZCwKLSAgICAgICAgICAgIi0tcGF5bG9hZCIsIHNpZ25lZF9wYXlsb2FkX2ZpbGUsCi0gICAgICAgICAgICItLXNpZ25hdHVyZV9zaXplIiwgc3RyKHNlbGYubWF4aW11bV9zaWduYXR1cmVfc2l6ZSksCi0gICAgICAgICAgICItLW1ldGFkYXRhX3NpZ25hdHVyZV9maWxlIiwgc2lnbmVkX21ldGFkYXRhX3NpZ19maWxlLAotICAgICAgICAgICAiLS1wYXlsb2FkX3NpZ25hdHVyZV9maWxlIiwgc2lnbmVkX3BheWxvYWRfc2lnX2ZpbGVdCisgICAgY21kID0gWyJkZWx0YV9nZW5lcmF0b3IiLAorICAgICAgICAgICAiLS1pbl9maWxlPSIgKyB1bnNpZ25lZF9wYXlsb2FkLAorICAgICAgICAgICAiLS1vdXRfZmlsZT0iICsgc2lnbmVkX3BheWxvYWRfZmlsZSwKKyAgICAgICAgICAgIi0tc2lnbmF0dXJlX3NpemU9IiArIHN0cihzZWxmLm1heGltdW1fc2lnbmF0dXJlX3NpemUpLAorICAgICAgICAgICAiLS1tZXRhZGF0YV9zaWduYXR1cmVfZmlsZT0iICsgc2lnbmVkX21ldGFkYXRhX3NpZ19maWxlLAorICAgICAgICAgICAiLS1wYXlsb2FkX3NpZ25hdHVyZV9maWxlPSIgKyBzaWduZWRfcGF5bG9hZF9zaWdfZmlsZV0KICAgICBzZWxmLl9SdW4oY21kKQogICAgIHJldHVybiBzaWduZWRfcGF5bG9hZF9maWxlCiAKLQogICBkZWYgU2lnbkhhc2hGaWxlKHNlbGYsIGluX2ZpbGUpOgogICAgICIiIlNpZ25zIHRoZSBnaXZlbiBpbnB1dCBmaWxlLiBSZXR1cm5zIHRoZSBvdXRwdXQgZmlsZW5hbWUuIiIiCiAgICAgb3V0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnbmVkLSIsIHN1ZmZpeD0iLmJpbiIpCiAgICAgY21kID0gW3NlbGYuc2lnbmVyXSArIHNlbGYuc2lnbmVyX2FyZ3MgKyBbJy1pbicsIGluX2ZpbGUsICctb3V0Jywgb3V0X2ZpbGVdCiAgICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKICAgICByZXR1cm4gb3V0X2ZpbGUKKworZGVmIEdlbmVyYXRlUGF5bG9hZFByb3BlcnRpZXMocGF5bG9hZF9maWxlKToKKyAgICBwcm9wZXJ0aWVzX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0icGF5bG9hZC1wcm9wZXJ0aWVzLSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9Ii50eHQiKQorICAgIGNtZCA9IFsiZGVsdGFfZ2VuZXJhdG9yIiwKKyAgICAgICAgICAgIi0taW5fZmlsZT0iICsgcGF5bG9hZF9maWxlLAorICAgICAgICAgICAiLS1wcm9wZXJ0aWVzX2ZpbGU9IiArIHByb3BlcnRpZXNfZmlsZV0KKyAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQorICAgIHJldHVybiBwcm9wZXJ0aWVzX2ZpbGUKKworZGVmIFNpZ25PdGFQYWNrYWdlKGlucHV0X3BhdGgsIG91dHB1dF9wYXRoKToKKyAgcGF5bG9hZF9zaWduZXIgPSBQYXlsb2FkU2lnbmVyKAorICAgICAgT1BUSU9OUy5wYWNrYWdlX2tleSwgT1BUSU9OUy5wcml2YXRlX2tleV9zdWZmaXgsCisgICAgICBOb25lLCBPUFRJT05TLnBheWxvYWRfc2lnbmVyLCBPUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MpCisgIGNvbW1vbi5aaXBFeGNsdWRlKGlucHV0X3BhdGgsIG91dHB1dF9wYXRoLCBbUEFZTE9BRF9CSU4sIFBBWUxPQURfUFJPUEVSVElFU19UWFRdKQorICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFzIHVuc2lnbmVkX3BheWxvYWQsIHppcGZpbGUuWmlwRmlsZShpbnB1dF9wYXRoLCAiciIsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgemZwOgorICAgIHdpdGggemZwLm9wZW4oInBheWxvYWQuYmluIikgYXMgcGF5bG9hZF9mcDoKKyAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihwYXlsb2FkX2ZwLCB1bnNpZ25lZF9wYXlsb2FkKQorICAgIHNpZ25lZF9wYXlsb2FkID0gcGF5bG9hZF9zaWduZXIuU2lnblBheWxvYWQodW5zaWduZWRfcGF5bG9hZC5uYW1lKQorICAgIHByb3BlcnRpZXNfZmlsZSA9IEdlbmVyYXRlUGF5bG9hZFByb3BlcnRpZXMoc2lnbmVkX3BheWxvYWQpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X3BhdGgsICJhIiwgY29tcHJlc3Npb249emlwZmlsZS5aSVBfU1RPUkVELCBhbGxvd1ppcDY0PVRydWUpIGFzIG91dHB1dF96ZnA6CisgICAgICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3pmcCwgc2lnbmVkX3BheWxvYWQsIFBBWUxPQURfQklOKQorICAgICAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96ZnAsIHByb3BlcnRpZXNfZmlsZSwgUEFZTE9BRF9QUk9QRVJUSUVTX1RYVCkKKworCitkZWYgbWFpbihhcmd2KToKKyAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCisgICAgICBwcm9nPWFyZ3ZbMF0sIGRlc2NyaXB0aW9uPSJHaXZlbiBhIHNlcmllcyBvZiAuaW1nIGZpbGVzLCBwcm9kdWNlcyBhIGZ1bGwgT1RBIHBhY2thZ2UgdGhhdCBpbnN0YWxscyB0aG9lc2UgaW1hZ2VzIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgiaW5wdXRfb3RhIiwgdHlwZT1zdHIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iSW5wdXQgT1RBIGZvciBzaWduaW5nIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnb3V0cHV0X290YScsIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J091dHB1dCBPVEEgZm9yIHRoZSBzaWduZWQgcGFja2FnZScpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoIi12IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJFbmFibGUgdmVyYm9zZSBsb2dnaW5nIiwgZGVzdD0idmVyYm9zZSIpCisgIEFkZFNpZ25pbmdBcmd1bWVudFBhcnNlKHBhcnNlcikKKyAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3ZbMTpdKQorICBpbnB1dF9vdGEgPSBhcmdzLmlucHV0X290YQorICBvdXRwdXRfb3RhID0gYXJncy5vdXRwdXRfb3RhCisgIGlmIGFyZ3MudmVyYm9zZToKKyAgICBPUFRJT05TLnZlcmJvc2UgPSBUcnVlCisgIGNvbW1vbi5Jbml0TG9nZ2luZygpCisgIGlmIGFyZ3MucGFja2FnZV9rZXk6CisgICAgT1BUSU9OUy5wYWNrYWdlX2tleSA9IGFyZ3MucGFja2FnZV9rZXkKKyAgbG9nZ2VyLmluZm8oIlJlLXNpZ25pbmcgT1RBIHBhY2thZ2Uge30iLmZvcm1hdChpbnB1dF9vdGEpKQorICBTaWduT3RhUGFja2FnZShpbnB1dF9vdGEsIG91dHB1dF9vdGEpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIGltcG9ydCBzeXMKKyAgbWFpbihzeXMuYXJndikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvc2lnbl9hcGV4LnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fYXBleC5weQppbmRleCBkNzM5OTgyLi5hMGE5NGY2IDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvc2lnbl9hcGV4LnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX2FwZXgucHkKQEAgLTU2LDcgKzU2LDYgQEAKIGltcG9ydCBjb21tb24KIAogbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCi1PUFRJT05TID0gY29tbW9uLk9QVElPTlMKIAogCiBkZWYgU2lnbkFwZXhGaWxlKGF2YnRvb2wsIGFwZXhfZmlsZSwgcGF5bG9hZF9rZXksIGNvbnRhaW5lcl9rZXksIG5vX2hhc2h0cmVlLApAQCAtNzUsOCArNzQsNyBAQAogICAgICAgbm9faGFzaHRyZWU9bm9faGFzaHRyZWUsCiAgICAgICBhcGtfa2V5cz1hcGtfa2V5cywKICAgICAgIHNpZ25pbmdfYXJncz1zaWduaW5nX2FyZ3MsCi0gICAgICBzaWduX3Rvb2w9c2lnbl90b29sLAotICAgICAgaXNfc2Vwb2xpY3k9YXBleF9maWxlLmVuZHN3aXRoKE9QVElPTlMuc2Vwb2xpY3lfbmFtZSkpCisgICAgICBzaWduX3Rvb2w9c2lnbl90b29sKQogCiAKIGRlZiBtYWluKGFyZ3YpOgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkgYi90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQppbmRleCA4MjkxNDQ4Li5iOGY4NDhmIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQpAQCAtODMsOSArODMsOCBAQAogCiAgIC0tcmVwbGFjZV92ZXJpdHlfcHVibGljX2tleSA8a2V5PgogICAgICAgUmVwbGFjZSB0aGUgY2VydGlmaWNhdGUgKHB1YmxpYyBrZXkpIHVzZWQgZm9yIHZlcml0eSB2ZXJpZmljYXRpb24uIFRoZQotICAgICAga2V5IGZpbGUgcmVwbGFjZXMgdGhlIG9uZSBhdCBCT09UL1JBTURJU0svdmVyaXR5X2tleSAob3IgUk9PVC92ZXJpdHlfa2V5Ci0gICAgICBmb3IgZGV2aWNlcyB1c2luZyBzeXN0ZW1fcm9vdF9pbWFnZSkuIEl0IGV4cGVjdHMgdGhlIGtleSBmaWxlbmFtZSBXSVRICi0gICAgICB0aGUgZXh0ZW5zaW9uIChlLmcuIHZlcml0eV9rZXkucHViKS4KKyAgICAgIGtleSBmaWxlIHJlcGxhY2VzIHRoZSBvbmUgYXQgQk9PVC9SQU1ESVNLL3Zlcml0eV9rZXkuIEl0IGV4cGVjdHMgdGhlIGtleQorICAgICAgZmlsZW5hbWUgV0lUSCB0aGUgZXh0ZW5zaW9uIChlLmcuIHZlcml0eV9rZXkucHViKS4KIAogICAtLXJlcGxhY2VfdmVyaXR5X2tleWlkIDxwYXRoX3RvX1g1MDlfUEVNX2NlcnRfZmlsZT4KICAgICAgIFJlcGxhY2UgdGhlIHZlcml0eWtleWlkIGluIEJPT1QvY21kbGluZSBvZiBpbnB1dF90YXJnZXRfZmlsZV96aXAKQEAgLTEyNSwxNCArMTI0LDggQEAKIAogICAtLWdraV9zaWduaW5nX2FsZ29yaXRobSA8YWxnb3JpdGhtPgogICAtLWdraV9zaWduaW5nX2tleSA8a2V5PgotICAgICAgVXNlIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtIChlLmcuIFNIQTI1Nl9SU0E0MDk2KSBhbmQgdGhlIGtleSB0byBnZW5lcmF0ZQotICAgICAgJ2Jvb3Qgc2lnbmF0dXJlJyBpbiBhIHY0IGJvb3QuaW1nLiBPdGhlcndpc2UgaXQgdXNlcyB0aGUgZXhpc3RpbmcgdmFsdWVzCi0gICAgICBpbiBpbmZvIGRpY3QuCi0KICAgLS1na2lfc2lnbmluZ19leHRyYV9hcmdzIDxhcmdzPgotICAgICAgU3BlY2lmeSBhbnkgYWRkaXRpb25hbCBhcmdzIHRoYXQgYXJlIG5lZWRlZCB0byBnZW5lcmF0ZSAnYm9vdCBzaWduYXR1cmUnCi0gICAgICAoZS5nLiAtLXByb3AgZm9vOmJhcikuIFRoZSBhcmdzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nIG9uZXMKLSAgICAgIGluIGluZm8gZGljdC4KKyAgICAgIERFUFJFQ0FURUQgRG9lcyBub3RoaW5nLgogCiAgIC0tYW5kcm9pZF9qYXJfcGF0aCA8cGF0aD4KICAgICAgIFBhdGggdG8gdGhlIGFuZHJvaWQuamFyIHRvIHJlcGFjayB0aGUgYXBleCBmaWxlLgpAQCAtMTQ3LDYgKzE0MCwzNCBAQAogCiAgIC0tb3ZlcnJpZGVfYXBleF9rZXlzIDxwYXRoPgogICAgICAgUmVwbGFjZSBhbGwgQVBFWCBrZXlzIHdpdGggdGhpcyBwcml2YXRlIGtleQorCisgIC1rICAoLS1wYWNrYWdlX2tleSkgPGtleT4KKyAgICAgIEtleSB0byB1c2UgdG8gc2lnbiB0aGUgcGFja2FnZSAoZGVmYXVsdCBpcyB0aGUgdmFsdWUgb2YKKyAgICAgIGRlZmF1bHRfc3lzdGVtX2Rldl9jZXJ0aWZpY2F0ZSBmcm9tIHRoZSBpbnB1dCB0YXJnZXQtZmlsZXMncworICAgICAgTUVUQS9taXNjX2luZm8udHh0LCBvciAiYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5IiBpZgorICAgICAgdGhhdCB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkKS4KKworICAgICAgRm9yIGluY3JlbWVudGFsIE9UQXMsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGJhc2VkIG9uIHRoZSBzb3VyY2UKKyAgICAgIHRhcmdldC1maWxlLCBub3QgdGhlIHRhcmdldCBidWlsZC4KKworICAtLXBheWxvYWRfc2lnbmVyIDxzaWduZXI+CisgICAgICBTcGVjaWZ5IHRoZSBzaWduZXIgd2hlbiBzaWduaW5nIHRoZSBwYXlsb2FkIGFuZCBtZXRhZGF0YSBmb3IgQS9CIE9UQXMuCisgICAgICBCeSBkZWZhdWx0IChpLmUuIHdpdGhvdXQgdGhpcyBmbGFnKSwgaXQgY2FsbHMgJ29wZW5zc2wgcGtleXV0bCcgdG8gc2lnbgorICAgICAgd2l0aCB0aGUgcGFja2FnZSBwcml2YXRlIGtleS4gSWYgdGhlIHByaXZhdGUga2V5IGNhbm5vdCBiZSBhY2Nlc3NlZAorICAgICAgZGlyZWN0bHksIGEgcGF5bG9hZCBzaWduZXIgdGhhdCBrbm93cyBob3cgdG8gZG8gdGhhdCBzaG91bGQgYmUgc3BlY2lmaWVkLgorICAgICAgVGhlIHNpZ25lciB3aWxsIGJlIHN1cHBsaWVkIHdpdGggIi1pbmtleSA8cGF0aF90b19rZXk+IiwKKyAgICAgICItaW4gPGlucHV0X2ZpbGU+IiBhbmQgIi1vdXQgPG91dHB1dF9maWxlPiIgcGFyYW1ldGVycy4KKworICAtLXBheWxvYWRfc2lnbmVyX2FyZ3MgPGFyZ3M+CisgICAgICBTcGVjaWZ5IHRoZSBhcmd1bWVudHMgbmVlZGVkIGZvciBwYXlsb2FkIHNpZ25lci4KKworICAtLXBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUgPHNpZ25hdHVyZV9zaXplPgorICAgICAgVGhlIG1heGltdW0gc2lnbmF0dXJlIHNpemUgKGluIGJ5dGVzKSB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZCBieSB0aGUgZ2l2ZW4KKyAgICAgIHBheWxvYWQgc2lnbmVyLiBPbmx5IG1lYW5pbmdmdWwgd2hlbiBjdXN0b20gcGF5bG9hZCBzaWduZXIgaXMgc3BlY2lmaWVkCisgICAgICB2aWEgJy0tcGF5bG9hZF9zaWduZXInLgorICAgICAgSWYgdGhlIHNpZ25lciB1c2VzIGEgUlNBIGtleSwgdGhpcyBzaG91bGQgYmUgdGhlIG51bWJlciBvZiBieXRlcyB0bworICAgICAgcmVwcmVzZW50IHRoZSBtb2R1bHVzLiBJZiBpdCB1c2VzIGFuIEVDIGtleSwgdGhpcyBpcyB0aGUgc2l6ZSBvZiBhCisgICAgICBERVItZW5jb2RlZCBFQ0RTQSBzaWduYXR1cmUuCiAiIiIKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgpAQCAtMTYyLDcgKzE4Myw2IEBACiBpbXBvcnQgcmUKIGltcG9ydCBzaHV0aWwKIGltcG9ydCBzdGF0Ci1pbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cwogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgemlwZmlsZQpAQCAtMTcxLDYgKzE5MSw4IEBACiBpbXBvcnQgYWRkX2ltZ190b190YXJnZXRfZmlsZXMKIGltcG9ydCBhcGV4X3V0aWxzCiBpbXBvcnQgY29tbW9uCitpbXBvcnQgcGF5bG9hZF9zaWduZXIKK2Zyb20gcGF5bG9hZF9zaWduZXIgaW1wb3J0IFNpZ25PdGFQYWNrYWdlLCBQQVlMT0FEX0JJTgogCiAKIGlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMjA3MDAwMDoKQEAgLTE5Myw5ICsyMTUsNiBAQAogT1BUSU9OUy5hdmJfa2V5cyA9IHt9CiBPUFRJT05TLmF2Yl9hbGdvcml0aG1zID0ge30KIE9QVElPTlMuYXZiX2V4dHJhX2FyZ3MgPSB7fQotT1BUSU9OUy5na2lfc2lnbmluZ19rZXkgPSBOb25lCi1PUFRJT05TLmdraV9zaWduaW5nX2FsZ29yaXRobSA9IE5vbmUKLU9QVElPTlMuZ2tpX3NpZ25pbmdfZXh0cmFfYXJncyA9IE5vbmUKIE9QVElPTlMuYW5kcm9pZF9qYXJfcGF0aCA9IE5vbmUKIE9QVElPTlMudmVuZG9yX3BhcnRpdGlvbnMgPSBzZXQoKQogT1BUSU9OUy52ZW5kb3Jfb3RhdG9vbHMgPSBOb25lCkBAIC0yNDEsNiArMjYwLDI0IEBACiAgIHJldHVybiBmaWxlbmFtZS5lbmRzd2l0aCgiLmFwZXgiKSBvciBmaWxlbmFtZS5lbmRzd2l0aCgiLmNhcGV4IikKIAogCitkZWYgSXNPdGFQYWNrYWdlKGZwKToKKyAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZnApIGFzIHpmcDoKKyAgICBpZiBub3QgUEFZTE9BRF9CSU4gaW4gemZwLm5hbWVsaXN0KCk6CisgICAgICByZXR1cm4gRmFsc2UKKyAgICB3aXRoIHpmcC5vcGVuKFBBWUxPQURfQklOLCAiciIpIGFzIHBheWxvYWQ6CisgICAgICBtYWdpYyA9IHBheWxvYWQucmVhZCg0KQorICAgICAgcmV0dXJuIG1hZ2ljID09IGIiQ3JBVSIKKworCitkZWYgSXNFbnRyeU90YVBhY2thZ2UoaW5wdXRfemlwLCBmaWxlbmFtZSk6CisgIHdpdGggaW5wdXRfemlwLm9wZW4oZmlsZW5hbWUsICJyIikgYXMgZnA6CisgICAgZXh0ZXJuYWxfYXR0ciA9IGlucHV0X3ppcC5nZXRpbmZvKGZpbGVuYW1lKS5leHRlcm5hbF9hdHRyCisgICAgaWYgc3RhdC5TX0lTTE5LKGV4dGVybmFsX2F0dHIgPj4gMTYpOgorICAgICAgcmV0dXJuIElzRW50cnlPdGFQYWNrYWdlKGlucHV0X3ppcCwKKyAgICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKSwgZnAucmVhZCgpLmRlY29kZSgpKSkKKyAgICByZXR1cm4gSXNPdGFQYWNrYWdlKGZwKQorCisKIGRlZiBHZXRBcGV4RmlsZW5hbWUoZmlsZW5hbWUpOgogICBuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKICAgIyBSZXBsYWNlIHRoZSBzdWZmaXggZm9yIGNvbXByZXNzZWQgYXBleApAQCAtNTE1LDYgKzU1Miw3IEBACiAgIHJldHVybiBkYXRhCiAKIAorCiBkZWYgSXNCdWlsZFByb3BGaWxlKGZpbGVuYW1lKToKICAgcmV0dXJuIGZpbGVuYW1lIGluICgKICAgICAgICJTWVNURU0vZXRjL3Byb3AuZGVmYXVsdCIsCkBAIC01NDEsNyArNTc5LDcgQEAKICAgICAgICAgZmlsZW5hbWUuZW5kc3dpdGgoIi9wcm9wLmRlZmF1bHQiKQogCiAKLWRlZiBQcm9jZXNzVGFyZ2V0RmlsZXMoaW5wdXRfdGZfemlwLCBvdXRwdXRfdGZfemlwLCBtaXNjX2luZm8sCitkZWYgUHJvY2Vzc1RhcmdldEZpbGVzKGlucHV0X3RmX3ppcDogemlwZmlsZS5aaXBGaWxlLCBvdXRwdXRfdGZfemlwLCBtaXNjX2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgIGFwa19rZXlzLCBhcGV4X2tleXMsIGtleV9wYXNzd29yZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtX2FwaV9sZXZlbCwgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZF9leHRlbnNpb24pOgpAQCAtNTUyLDExICs1OTAsOSBAQAogICAgICAgICBbbGVuKG9zLnBhdGguYmFzZW5hbWUoaS5maWxlbmFtZSkpIGZvciBpIGluIGlucHV0X3RmX3ppcC5pbmZvbGlzdCgpCiAgICAgICAgICBpZiBHZXRBcGtGaWxlSW5mbyhpLmZpbGVuYW1lLCBjb21wcmVzc2VkX2V4dGVuc2lvbiwgW10pWzBdXSkKICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgIyBTZXRzIHRoaXMgdG8gemVybyBmb3IgdGFyZ2V0cyB3aXRob3V0IEFQSyBmaWxlcywgZS5nLiwgZ2tpX2FybTY0LgorICAgICMgU2V0cyB0aGlzIHRvIHplcm8gZm9yIHRhcmdldHMgd2l0aG91dCBBUEsgZmlsZXMuCiAgICAgbWF4c2l6ZSA9IDAKIAotICBzeXN0ZW1fcm9vdF9pbWFnZSA9IG1pc2NfaW5mby5nZXQoInN5c3RlbV9yb290X2ltYWdlIikgPT0gInRydWUiCi0KICAgZm9yIGluZm8gaW4gaW5wdXRfdGZfemlwLmluZm9saXN0KCk6CiAgICAgZmlsZW5hbWUgPSBpbmZvLmZpbGVuYW1lCiAgICAgaWYgZmlsZW5hbWUuc3RhcnRzd2l0aCgiSU1BR0VTLyIpOgpAQCAtNjMxLDYgKzY2NywxNSBAQAogICAgICAgICAgICAgIiAgICAgICAgKHNraXBwZWQgZHVlIHRvIHNwZWNpYWwgY2VydCBzdHJpbmcpIiAlIChuYW1lLCkpCiAgICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfdGZfemlwLCBvdXRfaW5mbywgZGF0YSkKIAorICAgIGVsaWYgZmlsZW5hbWUuZW5kc3dpdGgoIi56aXAiKSBhbmQgSXNFbnRyeU90YVBhY2thZ2UoaW5wdXRfdGZfemlwLCBmaWxlbmFtZSk6CisgICAgICBsb2dnZXIuaW5mbygiUmUtc2lnbmluZyBPVEEgcGFja2FnZSB7fSIuZm9ybWF0KGZpbGVuYW1lKSkKKyAgICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgaW5wdXRfb3RhLCB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKSBhcyBvdXRwdXRfb3RhOgorICAgICAgICB3aXRoIGlucHV0X3RmX3ppcC5vcGVuKGZpbGVuYW1lLCAiciIpIGFzIGluX2ZwOgorICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihpbl9mcCwgaW5wdXRfb3RhKQorICAgICAgICAgIGlucHV0X290YS5mbHVzaCgpCisgICAgICAgIFNpZ25PdGFQYWNrYWdlKGlucHV0X290YS5uYW1lLCBvdXRwdXRfb3RhLm5hbWUpCisgICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfdGZfemlwLCBvdXRwdXRfb3RhLm5hbWUsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCiAgICAgIyBTeXN0ZW0gcHJvcGVydGllcy4KICAgICBlbGlmIElzQnVpbGRQcm9wRmlsZShmaWxlbmFtZSk6CiAgICAgICBwcmludCgiUmV3cml0aW5nICVzOiIgJSAoZmlsZW5hbWUsKSkKQEAgLTc1NCw2ICs3OTksMTYgQEAKICAgICAgICAgIyBDb3B5IGl0IHZlcmJhdGltIGlmIHdlIGFsbG93IHRoZSBmaWxlIHRvIGV4aXN0LgogICAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3RmX3ppcCwgb3V0X2luZm8sIGRhdGEpCiAKKyAgICAjIFNpZ24gbWljcm9kcm9pZF92ZW5kb3IuaW1nLgorICAgIGVsaWYgZmlsZW5hbWUgPT0gIlZFTkRPUi9ldGMvYXZmL21pY3JvZHJvaWQvbWljcm9kcm9pZF92ZW5kb3IuaW1nIjoKKyAgICAgIHZlbmRvcl9rZXkgPSBPUFRJT05TLmF2Yl9rZXlzLmdldCgidmVuZG9yIikKKyAgICAgIHZlbmRvcl9hbGdvcml0aG0gPSBPUFRJT05TLmF2Yl9hbGdvcml0aG1zLmdldCgidmVuZG9yIikKKyAgICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgaW1hZ2U6CisgICAgICAgIGltYWdlLndyaXRlKGRhdGEpCisgICAgICAgIGltYWdlLmZsdXNoKCkKKyAgICAgICAgUmVwbGFjZUtleUluQXZiSGFzaHRyZWVGb290ZXIoaW1hZ2UsIHZlbmRvcl9rZXksIHZlbmRvcl9hbGdvcml0aG0sCisgICAgICAgICAgICBtaXNjX2luZm8pCisgICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfdGZfemlwLCBpbWFnZS5uYW1lLCBmaWxlbmFtZSkKICAgICAjIEEgbm9uLUFQSyBmaWxlOyBjb3B5IGl0IHZlcmJhdGltLgogICAgIGVsc2U6CiAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3RmX3ppcCwgb3V0X2luZm8sIGRhdGEpCkBAIC03NjgsMTIgKzgyMywxMTEgQEAKICAgaWYgbWlzY19pbmZvLmdldCgnYXZiX2VuYWJsZScpID09ICd0cnVlJzoKICAgICBSZXdyaXRlQXZiUHJvcHMobWlzY19pbmZvKQogCi0gICMgUmVwbGFjZSB0aGUgR0tJIHNpZ25pbmcga2V5IGZvciBib290LmltZywgaWYgYW55LgotICBSZXBsYWNlR2tpU2lnbmluZ0tleShtaXNjX2luZm8pCi0KICAgIyBXcml0ZSBiYWNrIG1pc2NfaW5mbyB3aXRoIHRoZSBsYXRlc3QgdmFsdWVzLgogICBSZXBsYWNlTWlzY0luZm9UeHQoaW5wdXRfdGZfemlwLCBvdXRwdXRfdGZfemlwLCBtaXNjX2luZm8pCiAKKyMgUGFyc2Ugc3RyaW5nIG91dHB1dCBvZiBgYXZidG9vbCBpbmZvX2ltYWdlYC4KK2RlZiBQYXJzZUF2YkluZm8oaW5mb19yYXcpOgorICAjIGxpbmVfbWF0Y2hlciBpcyBmb3IgcGFyc2luZyBlYWNoIG91dHB1dCBsaW5lIG9mIGBhdmJ0b29sIGluZm9faW1hZ2VgLgorICAjIGV4YW1wbGUgc3RyaW5nIGlucHV0OiAiICAgICAgSGFzaCBBbGdvcml0aG06ICAgICAgICBzaGExIgorICAjIGV4YW1wbGUgbWF0Y2hlZCBpbnB1dDogKCIgICAgICAiLCAiSGFzaCBBbGdvcml0aG0iLCAic2hhMSIpCisgIGxpbmVfbWF0Y2hlciA9IHJlLmNvbXBpbGUocideKFxzKikoW146XSspOlxzKiguKikkJykKKyAgIyBwcm9wX21hdGNoZXIgaXMgZm9yIHBhcnNpbmcgdmFsdWUgcGFydCBvZiAnUHJvcCcgaW4gYGF2YnRvb2wgaW5mb19pbWFnZWAuCisgICMgZXhhbXBsZSBzdHJpbmcgaW5wdXQ6ICJleGFtcGxlX3Byb3Bfa2V5IC0+ICdleGFtcGxlX3Byb3BfdmFsdWUnIgorICAjIGV4YW1wbGUgbWF0Y2hlZCBvdXRwdXQ6ICgiZXhhbXBsZV9wcm9wX2tleSIsICJleGFtcGxlX3Byb3BfdmFsdWUiKQorICBwcm9wX21hdGNoZXIgPSByZS5jb21waWxlKHIiKC4rKVxzLT5ccycoLispJyIpCisgIGluZm8gPSB7fQorICBpbmRlbnRfc3RhY2sgPSBbWy0xLCBpbmZvXV0KKyAgZm9yIGxpbmVfaW5mb19yYXcgaW4gaW5mb19yYXcuc3BsaXQoJ1xuJyk6CisgICAgIyBQYXJzZSB0aGUgbGluZQorICAgIGxpbmVfaW5mb19wYXJzZWQgPSBsaW5lX21hdGNoZXIubWF0Y2gobGluZV9pbmZvX3JhdykKKyAgICBpZiBub3QgbGluZV9pbmZvX3BhcnNlZDoKKyAgICAgIGNvbnRpbnVlCisgICAgaW5kZW50ID0gbGVuKGxpbmVfaW5mb19wYXJzZWQuZ3JvdXAoMSkpCisgICAga2V5ID0gbGluZV9pbmZvX3BhcnNlZC5ncm91cCgyKS5zdHJpcCgpCisgICAgdmFsdWUgPSBsaW5lX2luZm9fcGFyc2VkLmdyb3VwKDMpLnN0cmlwKCkKKworICAgICMgUG9wIGluZGVudGF0aW9uIHN0YWNrCisgICAgd2hpbGUgaW5kZW50IDw9IGluZGVudF9zdGFja1stMV1bMF06CisgICAgICBkZWwgaW5kZW50X3N0YWNrWy0xXQorCisgICAgIyBJbnNlcnQgaW5mb3JtYXRpb24gaW50byAnaW5mbycuCisgICAgY3VyX2luZm8gPSBpbmRlbnRfc3RhY2tbLTFdWzFdCisgICAgaWYgdmFsdWUgPT0gIiI6CisgICAgICBpZiBrZXkgPT0gIkRlc2NyaXB0b3JzIjoKKyAgICAgICAgZW1wdHlfbGlzdCA9IFtdCisgICAgICAgIGN1cl9pbmZvW2tleV0gPSBlbXB0eV9saXN0CisgICAgICAgIGluZGVudF9zdGFjay5hcHBlbmQoW2luZGVudCwgZW1wdHlfbGlzdF0pCisgICAgICBlbHNlOgorICAgICAgICBlbXB0eV9kaWN0ID0ge30KKyAgICAgICAgY3VyX2luZm8uYXBwZW5kKHtrZXk6ZW1wdHlfZGljdH0pCisgICAgICAgIGluZGVudF9zdGFjay5hcHBlbmQoW2luZGVudCwgZW1wdHlfZGljdF0pCisgICAgZWxpZiBrZXkgPT0gIlByb3AiOgorICAgICAgcHJvcF9wYXJzZWQgPSBwcm9wX21hdGNoZXIubWF0Y2godmFsdWUpCisgICAgICBpZiBub3QgcHJvcF9wYXJzZWQ6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHByb3Agd2hpbGUgZ2V0dGluZyBhdmIgaW5mb3JtYXRpb24uIikKKyAgICAgIGN1cl9pbmZvLmFwcGVuZCh7a2V5Ontwcm9wX3BhcnNlZC5ncm91cCgxKTpwcm9wX3BhcnNlZC5ncm91cCgyKX19KQorICAgIGVsc2U6CisgICAgICBjdXJfaW5mb1trZXldID0gdmFsdWUKKyAgcmV0dXJuIGluZm8KKworZGVmIFJlcGxhY2VLZXlJbkF2Ykhhc2h0cmVlRm9vdGVyKGltYWdlLCBuZXdfa2V5LCBuZXdfYWxnb3JpdGhtLCBtaXNjX2luZm8pOgorICAjIEdldCBhdmIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGltYWdlIGJ5IHBhcnNpbmcgYXZidG9vbCBpbmZvX2ltYWdlLgorICBkZWYgR2V0QXZiSW5mbyhhdmJ0b29sLCBpbWFnZV9uYW1lKToKKyAgICAjIEdldCBpbmZvcm1hdGlvbiB3aXRoIHJhdyBzdHJpbmcgYnkgYGF2YnRvb2wgaW5mb19pbWFnZWAuCisgICAgaW5mb19yYXcgPSBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoWworICAgICAgYXZidG9vbCwgJ2luZm9faW1hZ2UnLAorICAgICAgJy0taW1hZ2UnLCBpbWFnZV9uYW1lCisgICAgXSkKKyAgICByZXR1cm4gUGFyc2VBdmJJbmZvKGluZm9fcmF3KQorCisgICMgR2V0IGhhc2h0cmVlIGRlc2NyaXB0b3IgZnJvbSBpbmZvCisgIGRlZiBHZXRBdmJIYXNodHJlZURlc2NyaXB0b3IoYXZiX2luZm8pOgorICAgIGhhc2h0cmVlX2Rlc2NyaXB0b3JzID0gdHVwbGUoZmlsdGVyKGxhbWJkYSB4OiAiSGFzaHRyZWUgZGVzY3JpcHRvciIgaW4geCwKKyAgICAgICAgaW5mby5nZXQoJ0Rlc2NyaXB0b3JzJykpKQorICAgIGlmIGxlbihoYXNodHJlZV9kZXNjcmlwdG9ycykgIT0gMToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZSBudW1iZXIgb2YgaGFzaHRyZWUgZGVzY3JpcHRvciBpcyBub3QgMS4iKQorICAgIHJldHVybiBoYXNodHJlZV9kZXNjcmlwdG9yc1swXVsiSGFzaHRyZWUgZGVzY3JpcHRvciJdCisKKyAgIyBHZXQgYXZiIGluZm8KKyAgYXZidG9vbCA9IG1pc2NfaW5mb1snYXZiX2F2YnRvb2wnXQorICBpbmZvID0gR2V0QXZiSW5mbyhhdmJ0b29sLCBpbWFnZS5uYW1lKQorICBoYXNodHJlZV9kZXNjcmlwdG9yID0gR2V0QXZiSGFzaHRyZWVEZXNjcmlwdG9yKGluZm8pCisKKyAgIyBHZW5lcmF0ZSBjb21tYW5kCisgIGNtZCA9IFthdmJ0b29sLCAnYWRkX2hhc2h0cmVlX2Zvb3RlcicsCisgICAgJy0ta2V5JywgbmV3X2tleSwKKyAgICAnLS1hbGdvcml0aG0nLCBuZXdfYWxnb3JpdGhtLAorICAgICctLXBhcnRpdGlvbl9uYW1lJywgaGFzaHRyZWVfZGVzY3JpcHRvci5nZXQoIlBhcnRpdGlvbiBOYW1lIiksCisgICAgJy0tcGFydGl0aW9uX3NpemUnLCBpbmZvLmdldCgiSW1hZ2Ugc2l6ZSIpLnJlbW92ZXN1ZmZpeCgiIGJ5dGVzIiksCisgICAgJy0taGFzaF9hbGdvcml0aG0nLCBoYXNodHJlZV9kZXNjcmlwdG9yLmdldCgiSGFzaCBBbGdvcml0aG0iKSwKKyAgICAnLS1zYWx0JywgaGFzaHRyZWVfZGVzY3JpcHRvci5nZXQoIlNhbHQiKSwKKyAgICAnLS1kb19ub3RfZ2VuZXJhdGVfZmVjJywKKyAgICAnLS1pbWFnZScsIGltYWdlLm5hbWUKKyAgXQorCisgICMgQXBwZW5kIHByb3BlcnRpZXMgaW50byBjb21tYW5kCisgIHByb3BzID0gbWFwKGxhbWJkYSB4OiB4LmdldCgiUHJvcCIpLCBmaWx0ZXIobGFtYmRhIHg6ICJQcm9wIiBpbiB4LAorICAgICAgaW5mby5nZXQoJ0Rlc2NyaXB0b3JzJykpKQorICBmb3IgcHJvcF93cmFwcGVkIGluIHByb3BzOgorICAgIHByb3AgPSB0dXBsZShwcm9wX3dyYXBwZWQuaXRlbXMoKSkKKyAgICBpZiBsZW4ocHJvcCkgIT0gMToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZSBudW1iZXIgb2YgcHJvcGVydHkgaXMgbm90IDEuIikKKyAgICBjbWQuYXBwZW5kKCctLXByb3AnKQorICAgIGNtZC5hcHBlbmQocHJvcFswXVswXSArICc6JyArIHByb3BbMF1bMV0pCisKKyAgIyBSZXBsYWNlIEhhc2h0cmVlIEZvb3RlciB3aXRoIG5ldyBrZXkKKyAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKKworICAjIENoZWNrIHJvb3QgZGlnZXN0IGlzIG5vdCBjaGFuZ2VkCisgIG5ld19pbmZvID0gR2V0QXZiSW5mbyhhdmJ0b29sLCBpbWFnZS5uYW1lKQorICBuZXdfaGFzaHRyZWVfZGVzY3JpcHRvciA9IEdldEF2Ykhhc2h0cmVlRGVzY3JpcHRvcihpbmZvKQorICByb290X2RpZ2VzdCA9IGhhc2h0cmVlX2Rlc2NyaXB0b3IuZ2V0KCJSb290IERpZ2VzdCIpCisgIG5ld19yb290X2RpZ2VzdCA9IG5ld19oYXNodHJlZV9kZXNjcmlwdG9yLmdldCgiUm9vdCBEaWdlc3QiKQorICBhc3NlcnQgcm9vdF9kaWdlc3QgPT0gbmV3X3Jvb3RfZGlnZXN0LCBcCisgICAgICAoIlJvb3QgZGlnZXN0IGluIGhhc2h0cmVlIGRlc2NyaXB0b3Igc2hvdWxkbid0IGJlIGNoYW5nZWQuIE9sZDoge30sIE5ldzogIgorICAgICAgICJ7fSIpLmZvcm1hdChyb290X2RpZ2VzdCwgbmV3X3Jvb3RfZGlnZXN0KQogCiBkZWYgUmVwbGFjZUNlcnRzKGRhdGEpOgogICAiIiJSZXBsYWNlcyBhbGwgdGhlIG9jY3VyZW5jZXMgb2YgWC41MDkgY2VydHMgd2l0aCB0aGUgbmV3IG9uZXMuCkBAIC0xMDUyLDI3ICsxMjA2LDYgQEAKICAgICAgIG1pc2NfaW5mb1thcmdzX2tleV0gPSByZXN1bHQKIAogCi1kZWYgUmVwbGFjZUdraVNpZ25pbmdLZXkobWlzY19pbmZvKToKLSAgIiIiUmVwbGFjZXMgdGhlIEdLSSBzaWduaW5nIGtleS4iIiIKLQotICBrZXkgPSBPUFRJT05TLmdraV9zaWduaW5nX2tleQotICBpZiBub3Qga2V5OgotICAgIHJldHVybgotCi0gIGFsZ29yaXRobSA9IE9QVElPTlMuZ2tpX3NpZ25pbmdfYWxnb3JpdGhtCi0gIGlmIG5vdCBhbGdvcml0aG06Ci0gICAgcmFpc2UgVmFsdWVFcnJvcigiTWlzc2luZyAtLWdraV9zaWduaW5nX2FsZ29yaXRobSIpCi0KLSAgcHJpbnQoJ1JlcGxhY2luZyBHS0kgc2lnbmluZyBrZXkgd2l0aCAiJXMiICglcyknICUgKGtleSwgYWxnb3JpdGhtKSkKLSAgbWlzY19pbmZvWyJna2lfc2lnbmluZ19hbGdvcml0aG0iXSA9IGFsZ29yaXRobQotICBtaXNjX2luZm9bImdraV9zaWduaW5nX2tleV9wYXRoIl0gPSBrZXkKLQotICBleHRyYV9hcmdzID0gT1BUSU9OUy5na2lfc2lnbmluZ19leHRyYV9hcmdzCi0gIGlmIGV4dHJhX2FyZ3M6Ci0gICAgcHJpbnQoJ1NldHRpbmcgR0tJIHNpZ25pbmcgYXJnczogIiVzIicgJSAoZXh0cmFfYXJncykpCi0gICAgbWlzY19pbmZvWyJna2lfc2lnbmluZ19zaWduYXR1cmVfYXJncyJdID0gZXh0cmFfYXJncwotCi0KIGRlZiBCdWlsZEtleU1hcChtaXNjX2luZm8sIGtleV9tYXBwaW5nX29wdGlvbnMpOgogICBmb3IgcywgZCBpbiBrZXlfbWFwcGluZ19vcHRpb25zOgogICAgIGlmIHMgaXMgTm9uZTogICAjIC1kIG9wdGlvbgpAQCAtMTA4Nyw2ICsxMjIwLDcgQEAKICAgICAgICAgICBkZXZrZXlkaXIgKyAiL3NoYXJlZCI6ICAgZCArICIvc2hhcmVkIiwKICAgICAgICAgICBkZXZrZXlkaXIgKyAiL3BsYXRmb3JtIjogZCArICIvcGxhdGZvcm0iLAogICAgICAgICAgIGRldmtleWRpciArICIvbmV0d29ya3N0YWNrIjogZCArICIvbmV0d29ya3N0YWNrIiwKKyAgICAgICAgICBkZXZrZXlkaXIgKyAiL3Nka19zYW5kYm94IjogZCArICIvc2RrX3NhbmRib3giLAogICAgICAgfSkKICAgICBlbHNlOgogICAgICAgT1BUSU9OUy5rZXlfbWFwW3NdID0gZApAQCAtMTIzNCwxMSArMTM2OCwxMSBAQAogICAgIHZlbmRvcl9taXNjX2luZm9bIm5vX3JlY292ZXJ5Il0gPSAidHJ1ZSIgICMgcmVjb3ZlcnkKICAgICB2ZW5kb3JfbWlzY19pbmZvWyJhdmJfZW5hYmxlIl0gPSAiZmFsc2UiICAjIHZibWV0YQogCi0gIHZlbmRvcl9taXNjX2luZm9bImJvYXJkX2JwdF9lbmFibGUiXSA9ICJmYWxzZSIgICMgcGFydGl0aW9uLXRhYmxlCiAgIHZlbmRvcl9taXNjX2luZm9bImhhc19kdGJvIl0gPSAiZmFsc2UiICAjIGR0Ym8KICAgdmVuZG9yX21pc2NfaW5mb1siaGFzX3B2bWZ3Il0gPSAiZmFsc2UiICAjIHB2bWZ3Ci0gIHZlbmRvcl9taXNjX2luZm9bImF2Yl9jdXN0b21faW1hZ2VzX3BhcnRpdGlvbl9saXN0Il0gPSAiIiAgIyBjdXN0b20gaW1hZ2VzCisgIHZlbmRvcl9taXNjX2luZm9bImF2Yl9jdXN0b21faW1hZ2VzX3BhcnRpdGlvbl9saXN0Il0gPSAiIiAgIyBhdmIgY3VzdG9tIGltYWdlcwogICB2ZW5kb3JfbWlzY19pbmZvWyJhdmJfYnVpbGRpbmdfdmJtZXRhX2ltYWdlIl0gPSAiZmFsc2UiICMgc2tpcCBidWlsZGluZyB2Ym1ldGEKKyAgdmVuZG9yX21pc2NfaW5mb1siY3VzdG9tX2ltYWdlc19wYXJ0aXRpb25fbGlzdCJdID0gIiIgICMgY3VzdG9tIGltYWdlcwogICB2ZW5kb3JfbWlzY19pbmZvWyJ1c2VfZHluYW1pY19wYXJ0aXRpb25zIl0gPSAiZmFsc2UiICAjIHN1cGVyX2VtcHR5CiAgIHZlbmRvcl9taXNjX2luZm9bImJ1aWxkX3N1cGVyX3BhcnRpdGlvbiJdID0gImZhbHNlIiAgIyBzdXBlciBzcGxpdAogICB2ZW5kb3JfbWlzY19pbmZvWyJhdmJfdmJtZXRhX3N5c3RlbSJdID0gIiIgICMgc2tpcCBidWlsZGluZyB2Ym1ldGFfc3lzdGVtCkBAIC0xNDI2LDEyICsxNTYwLDYgQEAKICAgICAgICMgJ29lbT0tLXNpZ25pbmdfaGVscGVyX3dpdGhfZmlsZXM9L3RtcC9hdmJzaWduZXIuc2gnLgogICAgICAgcGFydGl0aW9uLCBleHRyYV9hcmdzID0gYS5zcGxpdCgiPSIsIDEpCiAgICAgICBPUFRJT05TLmF2Yl9leHRyYV9hcmdzW3BhcnRpdGlvbl0gPSBleHRyYV9hcmdzCi0gICAgZWxpZiBvID09ICItLWdraV9zaWduaW5nX2tleSI6Ci0gICAgICBPUFRJT05TLmdraV9zaWduaW5nX2tleSA9IGEKLSAgICBlbGlmIG8gPT0gIi0tZ2tpX3NpZ25pbmdfYWxnb3JpdGhtIjoKLSAgICAgIE9QVElPTlMuZ2tpX3NpZ25pbmdfYWxnb3JpdGhtID0gYQotICAgIGVsaWYgbyA9PSAiLS1na2lfc2lnbmluZ19leHRyYV9hcmdzIjoKLSAgICAgIE9QVElPTlMuZ2tpX3NpZ25pbmdfZXh0cmFfYXJncyA9IGEKICAgICBlbGlmIG8gPT0gIi0tdmVuZG9yX290YXRvb2xzIjoKICAgICAgIE9QVElPTlMudmVuZG9yX290YXRvb2xzID0gYQogICAgIGVsaWYgbyA9PSAiLS12ZW5kb3JfcGFydGl0aW9ucyI6CkBAIC0xNDQyLDYgKzE1NzAsOCBAQAogICAgICAgT1BUSU9OUy5vdmVycmlkZV9hcGtfa2V5cyA9IGEKICAgICBlbGlmIG8gPT0gIi0tb3ZlcnJpZGVfYXBleF9rZXlzIjoKICAgICAgIE9QVElPTlMub3ZlcnJpZGVfYXBleF9rZXlzID0gYQorICAgIGVsaWYgbyBpbiAoIi0tZ2tpX3NpZ25pbmdfa2V5IiwgICItLWdraV9zaWduaW5nX2FsZ29yaXRobSIsICAiLS1na2lfc2lnbmluZ19leHRyYV9hcmdzIik6CisgICAgICBwcmludChmIntvfSBpcyBkZXByZWNhdGVkIGFuZCBkb2VzIG5vdGhpbmciKQogICAgIGVsc2U6CiAgICAgICByZXR1cm4gRmFsc2UKICAgICByZXR1cm4gVHJ1ZQpAQCAtMTUwNCw3ICsxNjM0LDcgQEAKICAgICAgICAgICAib3ZlcnJpZGVfYXBrX2tleXM9IiwKICAgICAgICAgICAib3ZlcnJpZGVfYXBleF9rZXlzPSIsCiAgICAgICBdLAotICAgICAgZXh0cmFfb3B0aW9uX2hhbmRsZXI9b3B0aW9uX2hhbmRsZXIpCisgICAgICBleHRyYV9vcHRpb25faGFuZGxlcj1bb3B0aW9uX2hhbmRsZXIsIHBheWxvYWRfc2lnbmVyLnNpZ25lcl9vcHRpb25zXSkKIAogICBpZiBsZW4oYXJncykgIT0gMjoKICAgICBjb21tb24uVXNhZ2UoX19kb2NfXykKQEAgLTE1MTgsNiArMTY0OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9VHJ1ZSkKIAogICBtaXNjX2luZm8gPSBjb21tb24uTG9hZEluZm9EaWN0KGlucHV0X3ppcCkKKyAgaWYgT1BUSU9OUy5wYWNrYWdlX2tleSBpcyBOb25lOgorICAgICAgT1BUSU9OUy5wYWNrYWdlX2tleSA9IG1pc2NfaW5mby5nZXQoCisgICAgICAgICAgImRlZmF1bHRfc3lzdGVtX2Rldl9jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgImJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvdGVzdGtleSIpCiAKICAgQnVpbGRLZXlNYXAobWlzY19pbmZvLCBrZXlfbWFwcGluZ19vcHRpb25zKQogCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9idWlsZF9pbWFnZS5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2J1aWxkX2ltYWdlLnB5CmluZGV4IGNmYWU3YTUuLmQ0ZjdjY2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2J1aWxkX2ltYWdlLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2J1aWxkX2ltYWdlLnB5CkBAIC05OSwxMSArOTksMTAgQEAKICAgICB9CiAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVpbGRJbWFnZUVycm9yLCBDaGVja0hlYWRyb29tLCBleHQ0ZnNfb3V0cHV0LCBwcm9wX2RpY3QpCiAKLSAgZGVmIHRlc3RfU2V0VXBJbkRpckFuZEZzQ29uZmlnX1N5c3RlbVJvb3RJbWFnZVRydWVfTm9uU3lzdGVtKHNlbGYpOgorICBkZWYgdGVzdF9TZXRVcEluRGlyQW5kRnNDb25maWdfTm9uU3lzdGVtKHNlbGYpOgogICAgIHByb3BfZGljdCA9IHsKICAgICAgICAgJ2ZzX2NvbmZpZyc6ICdmcy1jb25maWcnLAogICAgICAgICAnbW91bnRfcG9pbnQnOiAndmVuZG9yJywKLSAgICAgICAgJ3N5c3RlbV9yb290X2ltYWdlJzogJ3RydWUnLAogICAgIH0KICAgICBpbl9kaXIsIGZzX2NvbmZpZyA9IFNldFVwSW5EaXJBbmRGc0NvbmZpZygnL3BhdGgvdG8vaW5fZGlyJywgcHJvcF9kaWN0KQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy9wYXRoL3RvL2luX2RpcicsIGluX2RpcikKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2NvbW1vbi5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2NvbW1vbi5weQppbmRleCAyZGZkOGM3Li44OTkzM2EwIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9jb21tb24ucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfY29tbW9uLnB5CkBAIC0xNSwxNCArMTUsMTMgQEAKICMKIAogaW1wb3J0IGNvcHkKLWltcG9ydCBqc29uCiBpbXBvcnQgb3MKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgdGVtcGZpbGUKLWltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB6aXBmaWxlCiBmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEKK2Zyb20gdHlwaW5nIGltcG9ydCBCaW5hcnlJTwogCiBpbXBvcnQgY29tbW9uCiBpbXBvcnQgdGVzdF91dGlscwpAQCAtMzYsMTQgKzM1LDI0IEBACiBHaUIgPSAxMDI0ICogTWlCCiAKIAotZGVmIGdldF8yZ2Jfc3RyaW5nKCk6CitkZWYgZ2V0XzJnYl9maWxlKCk6CiAgIHNpemUgPSBpbnQoMiAqIEdpQiArIDEpCiAgIGJsb2NrX3NpemUgPSA0ICogS2lCCiAgIHN0ZXBfc2l6ZSA9IDQgKiBNaUIKLSAgIyBHZW5lcmF0ZSBhIGxvbmcgc3RyaW5nIHdpdGggaG9sZXMsIGUuZy4gJ3h5elx4MDBhYmNceDAwLi4uJy4KKyAgdG1wZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisgIHRtcGZpbGUudHJ1bmNhdGUoc2l6ZSkKICAgZm9yIF8gaW4gcmFuZ2UoMCwgc2l6ZSwgc3RlcF9zaXplKToKLSAgICB5aWVsZCBvcy51cmFuZG9tKGJsb2NrX3NpemUpCi0gICAgeWllbGQgYidcMCcgKiAoc3RlcF9zaXplIC0gYmxvY2tfc2l6ZSkKKyAgICB0bXBmaWxlLndyaXRlKG9zLnVyYW5kb20oYmxvY2tfc2l6ZSkpCisgICAgdG1wZmlsZS5zZWVrKHN0ZXBfc2l6ZSAtIGJsb2NrX3NpemUsIG9zLlNFRUtfQ1VSKQorICByZXR1cm4gdG1wZmlsZQorCisKK2RlZiBoYXNoX2ZpbGUoZmlsZW5hbWUpOgorICBzaGExX2hhc2ggPSBzaGExKCkKKyAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiKSBhcyBmcDoKKyAgICBmb3IgZGF0YSBpbiBpdGVyKGxhbWJkYTogZnAucmVhZCg0Kk1pQiksIGInJyk6CisgICAgICBzaGExX2hhc2gudXBkYXRlKGRhdGEpCisgIHJldHVybiBzaGExX2hhc2gKIAogCiBjbGFzcyBCdWlsZEluZm9UZXN0KHRlc3RfdXRpbHMuUmVsZWFzZVRvb2xzVGVzdENhc2UpOgpAQCAtMjIyLDE3ICsyMzEsMTcgQEAKICAgICBpbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9JTkZPX0ZJTkdFUlBSSU5UX0RJQ1QpCiAgICAgYnVpbGRfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8oaW5mb19kaWN0KQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAncHJvZHVjdC1icmFuZC9wcm9kdWN0LW5hbWUvcHJvZHVjdC1kZXZpY2U6dmVyc2lvbi1yZWxlYXNlL2J1aWxkLWlkLycKLSAgICAgICd2ZXJzaW9uLWluY3JlbWVudGFsOmJ1aWxkLXR5cGUvYnVpbGQtdGFncycsIGJ1aWxkX2luZm8uZmluZ2VycHJpbnQpCisgICAgICAgICdwcm9kdWN0LWJyYW5kL3Byb2R1Y3QtbmFtZS9wcm9kdWN0LWRldmljZTp2ZXJzaW9uLXJlbGVhc2UvYnVpbGQtaWQvJworICAgICAgICAndmVyc2lvbi1pbmNyZW1lbnRhbDpidWlsZC10eXBlL2J1aWxkLXRhZ3MnLCBidWlsZF9pbmZvLmZpbmdlcnByaW50KQogCiAgICAgYnVpbGRfcHJvcHMgPSBpbmZvX2RpY3RbJ2J1aWxkLnByb3AnXS5idWlsZF9wcm9wcwogICAgIGRlbCBidWlsZF9wcm9wc1sncm8uYnVpbGQuaWQnXQogICAgIGJ1aWxkX3Byb3BzWydyby5idWlsZC5sZWdhY3kuaWQnXSA9ICdsZWdhY3ktYnVpbGQtaWQnCiAgICAgYnVpbGRfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8oaW5mb19kaWN0LCB1c2VfbGVnYWN5X2lkPVRydWUpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICdwcm9kdWN0LWJyYW5kL3Byb2R1Y3QtbmFtZS9wcm9kdWN0LWRldmljZTp2ZXJzaW9uLXJlbGVhc2UvJwotICAgICAgJ2xlZ2FjeS1idWlsZC1pZC92ZXJzaW9uLWluY3JlbWVudGFsOmJ1aWxkLXR5cGUvYnVpbGQtdGFncycsCi0gICAgICBidWlsZF9pbmZvLmZpbmdlcnByaW50KQorICAgICAgICAncHJvZHVjdC1icmFuZC9wcm9kdWN0LW5hbWUvcHJvZHVjdC1kZXZpY2U6dmVyc2lvbi1yZWxlYXNlLycKKyAgICAgICAgJ2xlZ2FjeS1idWlsZC1pZC92ZXJzaW9uLWluY3JlbWVudGFsOmJ1aWxkLXR5cGUvYnVpbGQtdGFncycsCisgICAgICAgIGJ1aWxkX2luZm8uZmluZ2VycHJpbnQpCiAKICAgICBzZWxmLmFzc2VydFJhaXNlcyhjb21tb24uRXh0ZXJuYWxFcnJvciwgY29tbW9uLkJ1aWxkSW5mbywgaW5mb19kaWN0LCBOb25lLAogICAgICAgICAgICAgICAgICAgICAgIEZhbHNlKQpAQCAtMjQxLDkgKzI1MCw5IEBACiAgICAgaW5mb19kaWN0Wyd2Ym1ldGFfZGlnZXN0J10gPSAnYWJjZGUxMjM0NScKICAgICBidWlsZF9pbmZvID0gY29tbW9uLkJ1aWxkSW5mbyhpbmZvX2RpY3QsIHVzZV9sZWdhY3lfaWQ9RmFsc2UpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICdwcm9kdWN0LWJyYW5kL3Byb2R1Y3QtbmFtZS9wcm9kdWN0LWRldmljZTp2ZXJzaW9uLXJlbGVhc2UvJwotICAgICAgJ2xlZ2FjeS1idWlsZC1pZC5hYmNkZTEyMy92ZXJzaW9uLWluY3JlbWVudGFsOmJ1aWxkLXR5cGUvYnVpbGQtdGFncycsCi0gICAgICBidWlsZF9pbmZvLmZpbmdlcnByaW50KQorICAgICAgICAncHJvZHVjdC1icmFuZC9wcm9kdWN0LW5hbWUvcHJvZHVjdC1kZXZpY2U6dmVyc2lvbi1yZWxlYXNlLycKKyAgICAgICAgJ2xlZ2FjeS1idWlsZC1pZC5hYmNkZTEyMy92ZXJzaW9uLWluY3JlbWVudGFsOmJ1aWxkLXR5cGUvYnVpbGQtdGFncycsCisgICAgICAgIGJ1aWxkX2luZm8uZmluZ2VycHJpbnQpCiAKICAgZGVmIHRlc3RfX19nZXRpdGVtX18oc2VsZik6CiAgICAgdGFyZ2V0X2luZm8gPSBjb21tb24uQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1QsIE5vbmUpCkBAIC0zNzYsNyArMzg1LDcgQEAKICAgICBpbmZvX2RpY3RbJ2J1aWxkLnByb3AnXS5idWlsZF9wcm9wc1sKICAgICAgICAgJ3JvLnByb2R1Y3QucHJvcGVydHlfc291cmNlX29yZGVyJ10gPSAnYmFkLXNvdXJjZScKICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKGNvbW1vbi5FeHRlcm5hbEVycm9yLAotICAgICAgICAnSW52YWxpZCByby5wcm9kdWN0LnByb3BlcnR5X3NvdXJjZV9vcmRlcicpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWQgcm8ucHJvZHVjdC5wcm9wZXJ0eV9zb3VyY2Vfb3JkZXInKToKICAgICAgIGluZm8gPSBjb21tb24uQnVpbGRJbmZvKGluZm9fZGljdCwgTm9uZSkKICAgICAgIGluZm8uR2V0QnVpbGRQcm9wKCdyby5wcm9kdWN0LmRldmljZScpCiAKQEAgLTQyOSw2ICs0MzgsMTMgQEAKICAgICBzZWxmLmFzc2VydElzTm9uZSh6aXBfZmlsZS50ZXN0emlwKCkpCiAKICAgZGVmIF90ZXN0X1ppcFdyaXRlKHNlbGYsIGNvbnRlbnRzLCBleHRyYV96aXB3cml0ZV9hcmdzPU5vbmUpOgorICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgdGVzdF9maWxlOgorICAgICAgdGVzdF9maWxlX25hbWUgPSB0ZXN0X2ZpbGUubmFtZQorICAgICAgZm9yIGRhdGEgaW4gY29udGVudHM6CisgICAgICAgIHRlc3RfZmlsZS53cml0ZShieXRlcyhkYXRhKSkKKyAgICAgIHJldHVybiBzZWxmLl90ZXN0X1ppcFdyaXRlRmlsZSh0ZXN0X2ZpbGVfbmFtZSwgZXh0cmFfemlwd3JpdGVfYXJncykKKworICBkZWYgX3Rlc3RfWmlwV3JpdGVGaWxlKHNlbGYsIHRlc3RfZmlsZV9uYW1lLCBleHRyYV96aXB3cml0ZV9hcmdzPU5vbmUpOgogICAgIGV4dHJhX3ppcHdyaXRlX2FyZ3MgPSBkaWN0KGV4dHJhX3ppcHdyaXRlX2FyZ3Mgb3Ige30pCiAKICAgICB0ZXN0X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoZGVsZXRlPUZhbHNlKQpAQCAtNDQxLDE3ICs0NTcsMTIgQEAKICAgICBhcmNuYW1lID0gZXh0cmFfemlwd3JpdGVfYXJncy5nZXQoImFyY25hbWUiLCB0ZXN0X2ZpbGVfbmFtZSkKICAgICBpZiBhcmNuYW1lWzBdID09ICIvIjoKICAgICAgIGFyY25hbWUgPSBhcmNuYW1lWzE6XQorICAgIHNoYTFfaGFzaCA9IGhhc2hfZmlsZSh0ZXN0X2ZpbGVfbmFtZSkKIAogICAgIHppcF9maWxlLmNsb3NlKCkKICAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZV9uYW1lLCAidyIsIGFsbG93WmlwNjQ9VHJ1ZSkKIAogICAgIHRyeToKLSAgICAgIHNoYTFfaGFzaCA9IHNoYTEoKQotICAgICAgZm9yIGRhdGEgaW4gY29udGVudHM6Ci0gICAgICAgIHNoYTFfaGFzaC51cGRhdGUoYnl0ZXMoZGF0YSkpCi0gICAgICAgIHRlc3RfZmlsZS53cml0ZShieXRlcyhkYXRhKSkKLSAgICAgIHRlc3RfZmlsZS5jbG9zZSgpCi0KICAgICAgIGV4cGVjdGVkX21vZGUgPSBleHRyYV96aXB3cml0ZV9hcmdzLmdldCgicGVybXMiLCAwbzY0NCkKICAgICAgIGV4cGVjdGVkX2NvbXByZXNzX3R5cGUgPSBleHRyYV96aXB3cml0ZV9hcmdzLmdldCgiY29tcHJlc3NfdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5aSVBfU1RPUkVEKQpAQCAtNDY3LDcgKzQ3OCw2IEBACiAgICAgICAgICAgICAgICAgICAgdGVzdF9maWxlX25hbWUsIGV4cGVjdGVkX3N0YXQsIGV4cGVjdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZSkKICAgICBmaW5hbGx5OgotICAgICAgb3MucmVtb3ZlKHRlc3RfZmlsZV9uYW1lKQogICAgICAgb3MucmVtb3ZlKHppcF9maWxlX25hbWUpCiAKICAgZGVmIF90ZXN0X1ppcFdyaXRlU3RyKHNlbGYsIHppbmZvX29yX2FyY25hbWUsIGNvbnRlbnRzLCBleHRyYV9hcmdzPU5vbmUpOgpAQCAtNTAyLDE0ICs1MTIsMTMgQEAKICAgICBmaW5hbGx5OgogICAgICAgb3MucmVtb3ZlKHppcF9maWxlX25hbWUpCiAKLSAgZGVmIF90ZXN0X1ppcFdyaXRlU3RyX2xhcmdlX2ZpbGUoc2VsZiwgbGFyZ2UsIHNtYWxsLCBleHRyYV9hcmdzPU5vbmUpOgorICBkZWYgX3Rlc3RfWmlwV3JpdGVTdHJfbGFyZ2VfZmlsZShzZWxmLCBsYXJnZV9maWxlOiBCaW5hcnlJTywgc21hbGwsIGV4dHJhX2FyZ3M9Tm9uZSk6CiAgICAgZXh0cmFfYXJncyA9IGRpY3QoZXh0cmFfYXJncyBvciB7fSkKIAogICAgIHppcF9maWxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRlbGV0ZT1GYWxzZSkKICAgICB6aXBfZmlsZV9uYW1lID0gemlwX2ZpbGUubmFtZQogCi0gICAgdGVzdF9maWxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRlbGV0ZT1GYWxzZSkKLSAgICB0ZXN0X2ZpbGVfbmFtZSA9IHRlc3RfZmlsZS5uYW1lCisgICAgdGVzdF9maWxlX25hbWUgPSBsYXJnZV9maWxlLm5hbWUKIAogICAgIGFyY25hbWVfbGFyZ2UgPSB0ZXN0X2ZpbGVfbmFtZQogICAgIGFyY25hbWVfc21hbGwgPSAiYmFyIgpAQCAtNTIyLDExICs1MzEsNyBAQAogICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlX25hbWUsICJ3IiwgYWxsb3daaXA2ND1UcnVlKQogCiAgICAgdHJ5OgotICAgICAgc2hhMV9oYXNoID0gc2hhMSgpCi0gICAgICBmb3IgZGF0YSBpbiBsYXJnZToKLSAgICAgICAgc2hhMV9oYXNoLnVwZGF0ZShkYXRhKQotICAgICAgICB0ZXN0X2ZpbGUud3JpdGUoZGF0YSkKLSAgICAgIHRlc3RfZmlsZS5jbG9zZSgpCisgICAgICBzaGExX2hhc2ggPSBoYXNoX2ZpbGUodGVzdF9maWxlX25hbWUpCiAKICAgICAgICMgQXJiaXRyYXJ5IHRpbWVzdGFtcCwganVzdCB0byBtYWtlIHN1cmUgY29tbW9uLlppcFdyaXRlKCkgcmVzdG9yZXMKICAgICAgICMgdGhlIHRpbWVzdGFtcCBhZnRlciB3cml0aW5nLgpAQCAtNTUxLDcgKzU1Niw2IEBACiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZT1leHBlY3RlZF9jb21wcmVzc190eXBlKQogICAgIGZpbmFsbHk6CiAgICAgICBvcy5yZW1vdmUoemlwX2ZpbGVfbmFtZSkKLSAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZpbGVfbmFtZSkKIAogICBkZWYgX3Rlc3RfcmVzZXRfWklQNjRfTElNSVQoc2VsZiwgZnVuYywgKmFyZ3MpOgogICAgIGRlZmF1bHRfbGltaXQgPSAoMSA8PCAzMSkgLSAxCkBAIC01NzcsMTAgKzU4MSwxMCBAQAogICAgIH0pCiAKICAgZGVmIHRlc3RfWmlwV3JpdGVfbGFyZ2VfZmlsZShzZWxmKToKLSAgICBmaWxlX2NvbnRlbnRzID0gZ2V0XzJnYl9zdHJpbmcoKQotICAgIHNlbGYuX3Rlc3RfWmlwV3JpdGUoZmlsZV9jb250ZW50cywgewotICAgICAgICAiY29tcHJlc3NfdHlwZSI6IHppcGZpbGUuWklQX0RFRkxBVEVELAotICAgIH0pCisgICAgd2l0aCBnZXRfMmdiX2ZpbGUoKSBhcyB0bXBmaWxlOgorICAgICAgc2VsZi5fdGVzdF9aaXBXcml0ZUZpbGUodG1wZmlsZS5uYW1lLCB7CisgICAgICAgICAgImNvbXByZXNzX3R5cGUiOiB6aXBmaWxlLlpJUF9ERUZMQVRFRCwKKyAgICAgIH0pCiAKICAgZGVmIHRlc3RfWmlwV3JpdGVfcmVzZXRzX1pJUDY0X0xJTUlUKHNlbGYpOgogICAgIHNlbGYuX3Rlc3RfcmVzZXRfWklQNjRfTElNSVQoc2VsZi5fdGVzdF9aaXBXcml0ZSwgIiIpCkBAIC02MjcsMTEgKzYzMSwxMSBAQAogICAgICMgemlwZmlsZS53cml0ZXN0cigpIGRvZXNuJ3Qgd29yayB3aGVuIHRoZSBzdHIgc2l6ZSBpcyBvdmVyIDJHaUIgZXZlbiB3aXRoCiAgICAgIyB0aGUgd29ya2Fyb3VuZC4gV2Ugd2lsbCBvbmx5IHRlc3QgdGhlIGNhc2Ugb2Ygd3JpdGluZyBhIHN0cmluZyBpbnRvIGEKICAgICAjIGxhcmdlIGFyY2hpdmUuCi0gICAgbG9uZ19zdHJpbmcgPSBnZXRfMmdiX3N0cmluZygpCiAgICAgc2hvcnRfc3RyaW5nID0gb3MudXJhbmRvbSgxMDI0KQotICAgIHNlbGYuX3Rlc3RfWmlwV3JpdGVTdHJfbGFyZ2VfZmlsZShsb25nX3N0cmluZywgc2hvcnRfc3RyaW5nLCB7Ci0gICAgICAgICJjb21wcmVzc190eXBlIjogemlwZmlsZS5aSVBfREVGTEFURUQsCi0gICAgfSkKKyAgICB3aXRoIGdldF8yZ2JfZmlsZSgpIGFzIGxhcmdlX2ZpbGU6CisgICAgICBzZWxmLl90ZXN0X1ppcFdyaXRlU3RyX2xhcmdlX2ZpbGUobGFyZ2VfZmlsZSwgc2hvcnRfc3RyaW5nLCB7CisgICAgICAgICAgImNvbXByZXNzX3R5cGUiOiB6aXBmaWxlLlpJUF9ERUZMQVRFRCwKKyAgICAgIH0pCiAKICAgZGVmIHRlc3RfWmlwV3JpdGVTdHJfcmVzZXRzX1pJUDY0X0xJTUlUKHNlbGYpOgogICAgIHNlbGYuX3Rlc3RfcmVzZXRfWklQNjRfTElNSVQoc2VsZi5fdGVzdF9aaXBXcml0ZVN0ciwgJ2ZvbycsIGInJykKQEAgLTgyMSw5ICs4MjUsOSBAQAogICApCiAKICAgQVBLQ0VSVFNfQ0VSVE1BUDEgPSB7Ci0gICAgICAnUmVjb3ZlcnlMb2NhbGl6ZXIuYXBrJyA6ICdjZXJ0cy9kZXZrZXknLAotICAgICAgJ1NldHRpbmdzLmFwaycgOiAnYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9wbGF0Zm9ybScsCi0gICAgICAnVFYuYXBrJyA6ICdQUkVTSUdORUQnLAorICAgICAgJ1JlY292ZXJ5TG9jYWxpemVyLmFwayc6ICdjZXJ0cy9kZXZrZXknLAorICAgICAgJ1NldHRpbmdzLmFwayc6ICdidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3BsYXRmb3JtJywKKyAgICAgICdUVi5hcGsnOiAnUFJFU0lHTkVEJywKICAgfQogCiAgIEFQS0NFUlRTX1RYVDIgPSAoCkBAIC04MzgsMTAgKzg0MiwxMCBAQAogICApCiAKICAgQVBLQ0VSVFNfQ0VSVE1BUDIgPSB7Ci0gICAgICAnQ29tcHJlc3NlZDEuYXBrJyA6ICdjZXJ0cy9jb21wcmVzc2VkMScsCi0gICAgICAnQ29tcHJlc3NlZDJhLmFwaycgOiAnY2VydHMvY29tcHJlc3NlZDInLAotICAgICAgJ0NvbXByZXNzZWQyYi5hcGsnIDogJ2NlcnRzL2NvbXByZXNzZWQyJywKLSAgICAgICdDb21wcmVzc2VkMy5hcGsnIDogJ2NlcnRzL2NvbXByZXNzZWQzJywKKyAgICAgICdDb21wcmVzc2VkMS5hcGsnOiAnY2VydHMvY29tcHJlc3NlZDEnLAorICAgICAgJ0NvbXByZXNzZWQyYS5hcGsnOiAnY2VydHMvY29tcHJlc3NlZDInLAorICAgICAgJ0NvbXByZXNzZWQyYi5hcGsnOiAnY2VydHMvY29tcHJlc3NlZDInLAorICAgICAgJ0NvbXByZXNzZWQzLmFwayc6ICdjZXJ0cy9jb21wcmVzc2VkMycsCiAgIH0KIAogICBBUEtDRVJUU19UWFQzID0gKApAQCAtODUwLDcgKzg1NCw3IEBACiAgICkKIAogICBBUEtDRVJUU19DRVJUTUFQMyA9IHsKLSAgICAgICdDb21wcmVzc2VkNC5hcGsnIDogJ2NlcnRzL2NvbXByZXNzZWQ0JywKKyAgICAgICdDb21wcmVzc2VkNC5hcGsnOiAnY2VydHMvY29tcHJlc3NlZDQnLAogICB9CiAKICAgIyBUZXN0IHBhcnNpbmcgd2l0aCBubyBvcHRpb25hbCBmaWVsZHMsIGJvdGggb3B0aW9uYWwgZmllbGRzLCBhbmQgb25seSB0aGUKQEAgLTg2Nyw5ICs4NzEsOSBAQAogICApCiAKICAgQVBLQ0VSVFNfQ0VSVE1BUDQgPSB7Ci0gICAgICAnUmVjb3ZlcnlMb2NhbGl6ZXIuYXBrJyA6ICdjZXJ0cy9kZXZrZXknLAotICAgICAgJ1NldHRpbmdzLmFwaycgOiAnYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9wbGF0Zm9ybScsCi0gICAgICAnVFYuYXBrJyA6ICdQUkVTSUdORUQnLAorICAgICAgJ1JlY292ZXJ5TG9jYWxpemVyLmFwayc6ICdjZXJ0cy9kZXZrZXknLAorICAgICAgJ1NldHRpbmdzLmFwayc6ICdidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3BsYXRmb3JtJywKKyAgICAgICdUVi5hcGsnOiAnUFJFU0lHTkVEJywKICAgfQogCiAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTk3Myw3ICs5NzcsNyBAQAogICAgIGV4dHJhY3RlZF9mcm9tX3ByaXZrZXkgPSBjb21tb24uRXh0cmFjdEF2YlB1YmxpY0tleSgnYXZidG9vbCcsIHByaXZrZXkpCiAgICAgZXh0cmFjdGVkX2Zyb21fcHVia2V5ID0gY29tbW9uLkV4dHJhY3RBdmJQdWJsaWNLZXkoJ2F2YnRvb2wnLCBwdWJrZXkpCiAgICAgd2l0aCBvcGVuKGV4dHJhY3RlZF9mcm9tX3ByaXZrZXksICdyYicpIGFzIHByaXZrZXlfZnAsIFwKLSAgICAgICAgb3BlbihleHRyYWN0ZWRfZnJvbV9wdWJrZXksICdyYicpIGFzIHB1YmtleV9mcDoKKyAgICAgICAgICAgIG9wZW4oZXh0cmFjdGVkX2Zyb21fcHVia2V5LCAncmInKSBhcyBwdWJrZXlfZnA6CiAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByaXZrZXlfZnAucmVhZCgpLCBwdWJrZXlfZnAucmVhZCgpKQogCiAgIGRlZiB0ZXN0X1BhcnNlQ2VydGlmaWNhdGUoc2VsZik6CkBAIC0xMjM3LDcgKzEyNDEsOCBAQAogICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICcxLTUgOS0xMCcsCiAgICAgICAgIHNwYXJzZV9pbWFnZS5maWxlX21hcFsnLy9zeXN0ZW0vZmlsZTEnXS5leHRyYVsndGV4dF9zdHInXSkKLSAgICBzZWxmLmFzc2VydFRydWUoc3BhcnNlX2ltYWdlLmZpbGVfbWFwWycvL3N5c3RlbS9maWxlMiddLmV4dHJhWydpbmNvbXBsZXRlJ10pCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBzcGFyc2VfaW1hZ2UuZmlsZV9tYXBbJy8vc3lzdGVtL2ZpbGUyJ10uZXh0cmFbJ2luY29tcGxldGUnXSkKICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgIHNwYXJzZV9pbWFnZS5maWxlX21hcFsnL3N5c3RlbS9hcHAvZmlsZTMnXS5leHRyYVsnaW5jb21wbGV0ZSddKQogCkBAIC0xMjk0LDExICsxMjk5LDExIEBACiAgICAgICAgICdhdmJfc3lzdGVtX2tleV9wYXRoJzogcHVia2V5LAogICAgICAgICAnYXZiX3N5c3RlbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbic6IDIsCiAgICAgfQotICAgIGFyZ3MgPSBjb21tb24uR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZygnc3lzdGVtJywgaW5mb19kaWN0KS5zcGxpdCgnOicpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4oYXJncykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnc3lzdGVtJywgYXJnc1swXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcyJywgYXJnc1sxXSkKLSAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoYXJnc1syXSkpCisgICAgY2hhaW5lZF9wYXJ0aXRpb25fYXJncyA9IGNvbW1vbi5HZXRBdmJDaGFpbmVkUGFydGl0aW9uQXJnKAorICAgICAgICAnc3lzdGVtJywgaW5mb19kaWN0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3N5c3RlbScsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3MucGFydGl0aW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5yb2xsYmFja19pbmRleF9sb2NhdGlvbikKKyAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5wdWJrZXlfcGF0aCkpCiAKICAgQHRlc3RfdXRpbHMuU2tpcElmRXh0ZXJuYWxUb29sc1VuYXZhaWxhYmxlKCkKICAgZGVmIHRlc3RfR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZ193aXRoUHJpdmF0ZUtleShzZWxmKToKQEAgLTEzMDgsMTEgKzEzMTMsMTEgQEAKICAgICAgICAgJ2F2Yl9wcm9kdWN0X2tleV9wYXRoJzoga2V5LAogICAgICAgICAnYXZiX3Byb2R1Y3Rfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24nOiAyLAogICAgIH0KLSAgICBhcmdzID0gY29tbW9uLkdldEF2YkNoYWluZWRQYXJ0aXRpb25BcmcoJ3Byb2R1Y3QnLCBpbmZvX2RpY3QpLnNwbGl0KCc6JykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihhcmdzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdwcm9kdWN0JywgYXJnc1swXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcyJywgYXJnc1sxXSkKLSAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoYXJnc1syXSkpCisgICAgY2hhaW5lZF9wYXJ0aXRpb25fYXJncyA9IGNvbW1vbi5HZXRBdmJDaGFpbmVkUGFydGl0aW9uQXJnKAorICAgICAgICAncHJvZHVjdCcsIGluZm9fZGljdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdwcm9kdWN0JywgY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5wYXJ0aXRpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzLnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhjaGFpbmVkX3BhcnRpdGlvbl9hcmdzLnB1YmtleV9wYXRoKSkKIAogICBAdGVzdF91dGlscy5Ta2lwSWZFeHRlcm5hbFRvb2xzVW5hdmFpbGFibGUoKQogICBkZWYgdGVzdF9HZXRBdmJDaGFpbmVkUGFydGl0aW9uQXJnX3dpdGhTcGVjaWZpZWRLZXkoc2VsZik6CkBAIC0xMzIyLDEyICsxMzI3LDExIEBACiAgICAgICAgICdhdmJfc3lzdGVtX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uJzogMiwKICAgICB9CiAgICAgcHVia2V5ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleS5wdWJrZXkucGVtJykKLSAgICBhcmdzID0gY29tbW9uLkdldEF2YkNoYWluZWRQYXJ0aXRpb25BcmcoCi0gICAgICAgICdzeXN0ZW0nLCBpbmZvX2RpY3QsIHB1YmtleSkuc3BsaXQoJzonKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKGFyZ3MpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3N5c3RlbScsIGFyZ3NbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMicsIGFyZ3NbMV0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGFyZ3NbMl0pKQorICAgIGNoYWluZWRfcGFydGl0aW9uX2FyZ3MgPSBjb21tb24uR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZygKKyAgICAgICAgJ3N5c3RlbScsIGluZm9fZGljdCwgcHVia2V5KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3N5c3RlbScsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3MucGFydGl0aW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5yb2xsYmFja19pbmRleF9sb2NhdGlvbikKKyAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5wdWJrZXlfcGF0aCkpCiAKICAgQHRlc3RfdXRpbHMuU2tpcElmRXh0ZXJuYWxUb29sc1VuYXZhaWxhYmxlKCkKICAgZGVmIHRlc3RfR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZ19pbnZhbGlkS2V5KHNlbGYpOgpAQCAtMTM0NCw4ICsxMzQ4LDcgQEAKICAgSU5GT19ESUNUX0RFRkFVTFQgPSB7CiAgICAgICAncmVjb3ZlcnlfYXBpX3ZlcnNpb24nOiAzLAogICAgICAgJ2ZzdGFiX3ZlcnNpb24nOiAyLAotICAgICAgJ3N5c3RlbV9yb290X2ltYWdlJzogJ3RydWUnLAotICAgICAgJ25vX3JlY292ZXJ5JyA6ICd0cnVlJywKKyAgICAgICdub19yZWNvdmVyeSc6ICd0cnVlJywKICAgICAgICdyZWNvdmVyeV9hc19ib290JzogJ3RydWUnLAogICB9CiAKQEAgLTEzNzMsMTQgKzEzNzYsOCBAQAogICAgICAgaW5mb192YWx1ZXMgPSAnJy5qb2luKAogICAgICAgICAgIFsne309e31cbicuZm9ybWF0KGssIHYpIGZvciBrLCB2IGluIHNvcnRlZChpbmZvX2RpY3QuaXRlbXMoKSldKQogICAgICAgY29tbW9uLlppcFdyaXRlU3RyKHRhcmdldF9maWxlc196aXAsICdNRVRBL21pc2NfaW5mby50eHQnLCBpbmZvX3ZhbHVlcykKLQotICAgICAgRlNUQUJfVEVNUExBVEUgPSAiL2Rldi9ibG9jay9zeXN0ZW0ge30gZXh0NCBybyxiYXJyaWVyPTEgZGVmYXVsdHMiCi0gICAgICBpZiBpbmZvX2RpY3QuZ2V0KCdzeXN0ZW1fcm9vdF9pbWFnZScpID09ICd0cnVlJzoKLSAgICAgICAgZnN0YWJfdmFsdWVzID0gRlNUQUJfVEVNUExBVEUuZm9ybWF0KCcvJykKLSAgICAgIGVsc2U6Ci0gICAgICAgIGZzdGFiX3ZhbHVlcyA9IEZTVEFCX1RFTVBMQVRFLmZvcm1hdCgnL3N5c3RlbScpCi0gICAgICBjb21tb24uWmlwV3JpdGVTdHIodGFyZ2V0X2ZpbGVzX3ppcCwgZnN0YWJfcGF0aCwgZnN0YWJfdmFsdWVzKQotCisgICAgICBjb21tb24uWmlwV3JpdGVTdHIodGFyZ2V0X2ZpbGVzX3ppcCwgZnN0YWJfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiL2Rldi9ibG9jay9zeXN0ZW0gL3N5c3RlbSBleHQ0IHJvLGJhcnJpZXI9MSBkZWZhdWx0cyIpCiAgICAgICBjb21tb24uWmlwV3JpdGVTdHIoCiAgICAgICAgICAgdGFyZ2V0X2ZpbGVzX3ppcCwgJ01FVEEvZmlsZV9jb250ZXh0cycsICdmaWxlLWNvbnRleHRzJykKICAgICByZXR1cm4gdGFyZ2V0X2ZpbGVzCkBAIC0xMzkzLDcgKzEzOTAsNiBAQAogICAgICAgbG9hZGVkX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KHRhcmdldF9maWxlc196aXApCiAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxvYWRlZF9kaWN0WydyZWNvdmVyeV9hcGlfdmVyc2lvbiddKQogICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsb2FkZWRfZGljdFsnZnN0YWJfdmVyc2lvbiddKQotICAgICAgc2VsZi5hc3NlcnRJbignLycsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogICAgICAgc2VsZi5hc3NlcnRJbignL3N5c3RlbScsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogCiAgIGRlZiB0ZXN0X0xvYWRJbmZvRGljdF9sZWdhY3lSZWNvdmVyeUZzdGFiUGF0aChzZWxmKToKQEAgLTE0MDQsNyArMTQwMCw2IEBACiAgICAgICBsb2FkZWRfZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QodGFyZ2V0X2ZpbGVzX3ppcCkKICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbG9hZGVkX2RpY3RbJ3JlY292ZXJ5X2FwaV92ZXJzaW9uJ10pCiAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxvYWRlZF9kaWN0Wydmc3RhYl92ZXJzaW9uJ10pCi0gICAgICBzZWxmLmFzc2VydEluKCcvJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCiAgICAgICBzZWxmLmFzc2VydEluKCcvc3lzdGVtJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCiAKICAgQHRlc3RfdXRpbHMuU2tpcElmRXh0ZXJuYWxUb29sc1VuYXZhaWxhYmxlKCkKQEAgLTE0MTYsNyArMTQxMSw2IEBACiAgICAgbG9hZGVkX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KHVuemlwcGVkKQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbG9hZGVkX2RpY3RbJ3JlY292ZXJ5X2FwaV92ZXJzaW9uJ10pCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsb2FkZWRfZGljdFsnZnN0YWJfdmVyc2lvbiddKQotICAgIHNlbGYuYXNzZXJ0SW4oJy8nLCBsb2FkZWRfZGljdFsnZnN0YWInXSkKICAgICBzZWxmLmFzc2VydEluKCcvc3lzdGVtJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCiAKICAgQHRlc3RfdXRpbHMuU2tpcElmRXh0ZXJuYWxUb29sc1VuYXZhaWxhYmxlKCkKQEAgLTE0MjgsMTUgKzE0MjIsMTEgQEAKICAgICBsb2FkZWRfZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QodW56aXBwZWQpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsb2FkZWRfZGljdFsncmVjb3ZlcnlfYXBpX3ZlcnNpb24nXSkKICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxvYWRlZF9kaWN0Wydmc3RhYl92ZXJzaW9uJ10pCi0gICAgc2VsZi5hc3NlcnRJbignLycsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogICAgIHNlbGYuYXNzZXJ0SW4oJy9zeXN0ZW0nLCBsb2FkZWRfZGljdFsnZnN0YWInXSkKIAotICBkZWYgdGVzdF9Mb2FkSW5mb0RpY3Rfc3lzdGVtUm9vdEltYWdlRmFsc2Uoc2VsZik6Ci0gICAgIyBEZXZpY2VzIG5vdCB1c2luZyBzeXN0ZW0tYXMtcm9vdCBub3IgcmVjb3ZlcnktYXMtYm9vdC4gTm9uLUEvQiBkZXZpY2VzCi0gICAgIyBsYXVuY2hlZCBwcmlvciB0byBQIHdpbGwgbGlrZWx5IGhhdmUgdGhpcyBjb25maWcuCisgIGRlZiB0ZXN0X0xvYWRJbmZvRGljdF9yZWNvdmVyeUFzQm9vdEZhbHNlKHNlbGYpOgogICAgIGluZm9fZGljdCA9IGNvcHkuY29weShzZWxmLklORk9fRElDVF9ERUZBVUxUKQogICAgIGRlbCBpbmZvX2RpY3RbJ25vX3JlY292ZXJ5J10KLSAgICBkZWwgaW5mb19kaWN0WydzeXN0ZW1fcm9vdF9pbWFnZSddCiAgICAgZGVsIGluZm9fZGljdFsncmVjb3ZlcnlfYXNfYm9vdCddCiAgICAgdGFyZ2V0X2ZpbGVzID0gc2VsZi5fdGVzdF9Mb2FkSW5mb0RpY3RfY3JlYXRlVGFyZ2V0RmlsZXMoCiAgICAgICAgIGluZm9fZGljdCwKQEAgLTE0NDgsMjIgKzE0MzgsNiBAQAogICAgICAgc2VsZi5hc3NlcnROb3RJbignLycsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogICAgICAgc2VsZi5hc3NlcnRJbignL3N5c3RlbScsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogCi0gIGRlZiB0ZXN0X0xvYWRJbmZvRGljdF9yZWNvdmVyeUFzQm9vdEZhbHNlKHNlbGYpOgotICAgICMgRGV2aWNlcyB1c2luZyBzeXN0ZW0tYXMtcm9vdCwgYnV0IHdpdGggc3RhbmRhbG9uZSByZWNvdmVyeSBpbWFnZS4gTm9uLUEvQgotICAgICMgZGV2aWNlcyBsYXVuY2hlZCBzaW5jZSBQIHdpbGwgbGlrZWx5IGhhdmUgdGhpcyBjb25maWcuCi0gICAgaW5mb19kaWN0ID0gY29weS5jb3B5KHNlbGYuSU5GT19ESUNUX0RFRkFVTFQpCi0gICAgZGVsIGluZm9fZGljdFsnbm9fcmVjb3ZlcnknXQotICAgIGRlbCBpbmZvX2RpY3RbJ3JlY292ZXJ5X2FzX2Jvb3QnXQotICAgIHRhcmdldF9maWxlcyA9IHNlbGYuX3Rlc3RfTG9hZEluZm9EaWN0X2NyZWF0ZVRhcmdldEZpbGVzKAotICAgICAgICBpbmZvX2RpY3QsCi0gICAgICAgICdSRUNPVkVSWS9SQU1ESVNLL3N5c3RlbS9ldGMvcmVjb3ZlcnkuZnN0YWInKQotICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3InLCBhbGxvd1ppcDY0PVRydWUpIGFzIHRhcmdldF9maWxlc196aXA6Ci0gICAgICBsb2FkZWRfZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QodGFyZ2V0X2ZpbGVzX3ppcCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbG9hZGVkX2RpY3RbJ3JlY292ZXJ5X2FwaV92ZXJzaW9uJ10pCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxvYWRlZF9kaWN0Wydmc3RhYl92ZXJzaW9uJ10pCi0gICAgICBzZWxmLmFzc2VydEluKCcvJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCi0gICAgICBzZWxmLmFzc2VydEluKCcvc3lzdGVtJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCi0KICAgZGVmIHRlc3RfTG9hZEluZm9EaWN0X25vUmVjb3ZlcnlUcnVlKHNlbGYpOgogICAgICMgRGV2aWNlIGRvZXNuJ3QgaGF2ZSBhIHJlY292ZXJ5IHBhcnRpdGlvbiBhdCBhbGwuCiAgICAgaW5mb19kaWN0ID0gY29weS5jb3B5KHNlbGYuSU5GT19ESUNUX0RFRkFVTFQpCkBAIC0xNDk1LDcgKzE0NjksNiBAQAogICAgIGxvYWRlZF9kaWN0ID0gY29tbW9uLkxvYWRJbmZvRGljdCh1bnppcHBlZCwgVHJ1ZSkKICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxvYWRlZF9kaWN0WydyZWNvdmVyeV9hcGlfdmVyc2lvbiddKQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbG9hZGVkX2RpY3RbJ2ZzdGFiX3ZlcnNpb24nXSkKLSAgICBzZWxmLmFzc2VydEluKCcvJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCiAgICAgc2VsZi5hc3NlcnRJbignL3N5c3RlbScsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgIG9zLnBhdGguam9pbih1bnppcHBlZCwgJ1JPT1QnKSwgbG9hZGVkX2RpY3RbJ3Jvb3RfZGlyJ10pCkBAIC0xNTQyLDYgKzE1MTUsNyBAQAogICAgICAgICAnc3VwZXJfZ3JvdXBfYV9ncm91cF9zaXplJzogJzEwMDAnLAogICAgICAgICAnc3VwZXJfZ3JvdXBfYl9wYXJ0aXRpb25fbGlzdCc6ICdwcm9kdWN0JywKICAgICAgICAgJ3N1cGVyX2dyb3VwX2JfZ3JvdXBfc2l6ZSc6ICcyMDAwJywKKyAgICAgICAgJ3ZhYmNfY293X3ZlcnNpb24nOiAnMicsCiAgICAgfQogICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVyZ2VkX2RpY3QsIGV4cGVjdGVkX21lcmdlZF9kaWN0KQogCkBAIC0xNTUyLDYgKzE1MjYsNyBAQAogICAgICAgICAnZHluYW1pY19wYXJ0aXRpb25fbGlzdCc6ICdzeXN0ZW0nLAogICAgICAgICAnc3VwZXJfZ3JvdXBfYV9wYXJ0aXRpb25fbGlzdCc6ICdzeXN0ZW0nLAogICAgICAgICAnc3VwZXJfZ3JvdXBfYV9ncm91cF9zaXplJzogJzUwMDAnLAorICAgICAgICAndmFiY19jb3dfdmVyc2lvbic6ICczJywKICAgICB9CiAgICAgdmVuZG9yX2RpY3QgPSB7CiAgICAgICAgICd1c2VfZHluYW1pY19wYXJ0aXRpb25zJzogJ3RydWUnLApAQCAtMTU3Myw2ICsxNTQ4LDcgQEAKICAgICAgICAgJ3N1cGVyX2dyb3VwX2FfZ3JvdXBfc2l6ZSc6ICcxMDAwJywKICAgICAgICAgJ3N1cGVyX2dyb3VwX2JfcGFydGl0aW9uX2xpc3QnOiAncHJvZHVjdCcsCiAgICAgICAgICdzdXBlcl9ncm91cF9iX2dyb3VwX3NpemUnOiAnMjAwMCcsCisgICAgICAgICd2YWJjX2Nvd192ZXJzaW9uJzogJzInLAogICAgIH0KICAgICBzZWxmLmFzc2VydEVxdWFsKG1lcmdlZF9kaWN0LCBleHBlY3RlZF9tZXJnZWRfZGljdCkKIApAQCAtMTU4MCw3ICsxNTU2LDggQEAKICAgICBpbmZvX2RpY3QgPSB7fQogICAgIGNtZCA9IGNvbW1vbi5HZXRBdmJQYXJ0aXRpb25BcmcoJ3N5c3RlbScsICcvcGF0aC90by9zeXN0ZW0uaW1nJywgaW5mb19kaWN0KQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIFsnLS1pbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UnLCAnL3BhdGgvdG8vc3lzdGVtLmltZyddLCBjbWQpCisgICAgICAgIFtjb21tb24uQVZCX0FSR19OQU1FX0lOQ0xVREVfREVTQ19GUk9NX0lNRywgJy9wYXRoL3RvL3N5c3RlbS5pbWcnXSwKKyAgICAgICAgY21kKQogCiAgIEB0ZXN0X3V0aWxzLlNraXBJZkV4dGVybmFsVG9vbHNVbmF2YWlsYWJsZSgpCiAgIGRlZiB0ZXN0X0FwcGVuZFZCTWV0YUFyZ3NGb3JQYXJ0aXRpb25fdmVuZG9yQXNDaGFpbmVkUGFydGl0aW9uKHNlbGYpOgpAQCAtMTU5MywxMiArMTU3MCwxMSBAQAogICAgIH0KICAgICBjbWQgPSBjb21tb24uR2V0QXZiUGFydGl0aW9uQXJnKCd2ZW5kb3InLCAnL3BhdGgvdG8vdmVuZG9yLmltZycsIGluZm9fZGljdCkKICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihjbWQpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy0tY2hhaW5fcGFydGl0aW9uJywgY21kWzBdKQotICAgIGNoYWluZWRfcGFydGl0aW9uX2FyZ3MgPSBjbWRbMV0uc3BsaXQoJzonKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKGNoYWluZWRfcGFydGl0aW9uX2FyZ3MpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZlbmRvcicsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnNScsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMV0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMl0pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbW9uLkFWQl9BUkdfTkFNRV9DSEFJTl9QQVJUSVRJT04sIGNtZFswXSkKKyAgICBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzID0gY21kWzFdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndmVuZG9yJywgY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5wYXJ0aXRpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzLnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhjaGFpbmVkX3BhcnRpdGlvbl9hcmdzLnB1YmtleV9wYXRoKSkKIAogICBAdGVzdF91dGlscy5Ta2lwSWZFeHRlcm5hbFRvb2xzVW5hdmFpbGFibGUoKQogICBkZWYgdGVzdF9BcHBlbmRWQk1ldGFBcmdzRm9yUGFydGl0aW9uX3JlY292ZXJ5QXNDaGFpbmVkUGFydGl0aW9uX25vbkFiKHNlbGYpOgpAQCAtMTYyNiw0NSArMTYwMiwxMiBAQAogICAgIGNtZCA9IGNvbW1vbi5HZXRBdmJQYXJ0aXRpb25BcmcoCiAgICAgICAgICdyZWNvdmVyeScsICcvcGF0aC90by9yZWNvdmVyeS5pbWcnLCBpbmZvX2RpY3QpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4oY21kKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCctLWNoYWluX3BhcnRpdGlvbicsIGNtZFswXSkKLSAgICBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzID0gY21kWzFdLnNwbGl0KCc6JykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihjaGFpbmVkX3BhcnRpdGlvbl9hcmdzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdyZWNvdmVyeScsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMycsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMV0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMl0pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbW9uLkFWQl9BUkdfTkFNRV9DSEFJTl9QQVJUSVRJT04sIGNtZFswXSkKKyAgICBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzID0gY21kWzFdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgncmVjb3ZlcnknLCBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzLnBhcnRpdGlvbikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3Mucm9sbGJhY2tfaW5kZXhfbG9jYXRpb24pCisgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGNoYWluZWRfcGFydGl0aW9uX2FyZ3MucHVia2V5X3BhdGgpKQogCi0gIGRlZiB0ZXN0X0dlbmVyYXRlR2tpQ2VydGlmaWNhdGVfS2V5UGF0aE5vdEZvdW5kKHNlbGYpOgotICAgIHB1YmtleSA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ25vX3Rlc3RrZXlfZ2tpLnBlbScpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhwdWJrZXkpKQotCi0gICAgY29tbW9uLk9QVElPTlMuaW5mb19kaWN0ID0gewotICAgICAgICAnZ2tpX3NpZ25pbmdfa2V5X3BhdGgnOiBwdWJrZXksCi0gICAgICAgICdna2lfc2lnbmluZ19hbGdvcml0aG0nOiAnU0hBMjU2X1JTQTQwOTYnLAotICAgICAgICAnZ2tpX3NpZ25pbmdfc2lnbmF0dXJlX2FyZ3MnOiAnLS1wcm9wIGZvbzpiYXInLAotICAgIH0KLSAgICB0ZXN0X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNvbW1vbi5FeHRlcm5hbEVycm9yLCBjb21tb24uX0dlbmVyYXRlR2tpQ2VydGlmaWNhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgdGVzdF9maWxlLm5hbWUsICdnZW5lcmljX2tlcm5lbCcpCi0KLSAgZGVmIHRlc3RfR2VuZXJhdGVHa2lDZXJ0aWZpY2F0ZV9TZWFyY2hLZXlQYXRoTm90Rm91bmQoc2VsZik6Ci0gICAgcHVia2V5ID0gJ25vX3Rlc3RrZXlfZ2tpLnBlbScKLSAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHB1YmtleSkpCi0KLSAgICAjIFRlc3RzIGl0IHNob3VsZCByYWlzZSBFeHRlcm5hbEVycm9yIGlmIG5vIGtleSBmb3VuZCB1bmRlcgotICAgICMgT1BUSU9OUy5zZWFyY2hfcGF0aC4KLSAgICBzZWFyY2hfcGF0aF9kaXIgPSBjb21tb24uTWFrZVRlbXBEaXIoKQotICAgIHNlYXJjaF9wdWJrZXkgPSBvcy5wYXRoLmpvaW4oc2VhcmNoX3BhdGhfZGlyLCBwdWJrZXkpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhzZWFyY2hfcHVia2V5KSkKLQotICAgIGNvbW1vbi5PUFRJT05TLnNlYXJjaF9wYXRoID0gc2VhcmNoX3BhdGhfZGlyCi0gICAgY29tbW9uLk9QVElPTlMuaW5mb19kaWN0ID0gewotICAgICAgICAnZ2tpX3NpZ25pbmdfa2V5X3BhdGgnOiBwdWJrZXksCi0gICAgICAgICdna2lfc2lnbmluZ19hbGdvcml0aG0nOiAnU0hBMjU2X1JTQTQwOTYnLAotICAgICAgICAnZ2tpX3NpZ25pbmdfc2lnbmF0dXJlX2FyZ3MnOiAnLS1wcm9wIGZvbzpiYXInLAotICAgIH0KLSAgICB0ZXN0X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNvbW1vbi5FeHRlcm5hbEVycm9yLCBjb21tb24uX0dlbmVyYXRlR2tpQ2VydGlmaWNhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgdGVzdF9maWxlLm5hbWUsICdnZW5lcmljX2tlcm5lbCcpCiAKIGNsYXNzIEluc3RhbGxSZWNvdmVyeVNjcmlwdEZvcm1hdFRlc3QodGVzdF91dGlscy5SZWxlYXNlVG9vbHNUZXN0Q2FzZSk6CiAgICIiIkNoZWNrcyB0aGUgZm9ybWF0IG9mIGluc3RhbGwtcmVjb3Zlcnkuc2guCkBAIC0xNjc1LDcgKzE2MTgsNyBAQAogICBkZWYgc2V0VXAoc2VsZik6CiAgICAgc2VsZi5fdGVtcGRpciA9IGNvbW1vbi5NYWtlVGVtcERpcigpCiAgICAgIyBDcmVhdGUgYSBmYWtlIGRpY3QgdGhhdCBjb250YWlucyB0aGUgZnN0YWIgaW5mbyBmb3IgYm9vdCZyZWNvdmVyeS4KLSAgICBzZWxmLl9pbmZvID0geyJmc3RhYiIgOiB7fX0KKyAgICBzZWxmLl9pbmZvID0geyJmc3RhYiI6IHt9fQogICAgIGZha2VfZnN0YWIgPSBbCiAgICAgICAgICIvZGV2L3NvYy4wL2J5LW5hbWUvYm9vdCAvYm9vdCBlbW1jIGRlZmF1bHRzIGRlZmF1bHRzIiwKICAgICAgICAgIi9kZXYvc29jLjAvYnktbmFtZS9yZWNvdmVyeSAvcmVjb3ZlcnkgZW1tYyBkZWZhdWx0cyBkZWZhdWx0cyJdCkBAIC0yMDIyLDExICsxOTY1LDExIEBACiAgICAgICAgICAgaW5wdXRfemlwLCAnb2RtJywgcGxhY2Vob2xkZXJfdmFsdWVzKQogCiAgICAgc2VsZi5hc3NlcnRFcXVhbCh7Ci0gICAgICAncm8ub2RtLmJ1aWxkLmRhdGUudXRjJzogJzE1Nzg0MzAwNDUnLAotICAgICAgJ3JvLm9kbS5idWlsZC5maW5nZXJwcmludCc6Ci0gICAgICAnZ29vZ2xlL2NvcmFsL2NvcmFsOjEwL1JQMUEuMjAwMzI1LjAwMS82MzM3Njc2OnVzZXIvZGV2LWtleXMnLAotICAgICAgJ3JvLnByb2R1Y3Qub2RtLmRldmljZSc6ICdjb3JhbCcsCi0gICAgICAncm8ucHJvZHVjdC5vZG0ubmFtZSc6ICdwcm9kdWN0MScsCisgICAgICAgICdyby5vZG0uYnVpbGQuZGF0ZS51dGMnOiAnMTU3ODQzMDA0NScsCisgICAgICAgICdyby5vZG0uYnVpbGQuZmluZ2VycHJpbnQnOgorICAgICAgICAnZ29vZ2xlL2NvcmFsL2NvcmFsOjEwL1JQMUEuMjAwMzI1LjAwMS82MzM3Njc2OnVzZXIvZGV2LWtleXMnLAorICAgICAgICAncm8ucHJvZHVjdC5vZG0uZGV2aWNlJzogJ2NvcmFsJywKKyAgICAgICAgJ3JvLnByb2R1Y3Qub2RtLm5hbWUnOiAncHJvZHVjdDEnLAogICAgIH0sIHBhcnRpdGlvbl9wcm9wcy5idWlsZF9wcm9wcykKIAogICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUsICdyJywgYWxsb3daaXA2ND1UcnVlKSBhcyBpbnB1dF96aXA6CkBAIC0yMjA5LDggKzIxNTIsOCBAQAogCiAgICAgY29waWVkX3Byb3BzID0gY29weS5kZWVwY29weShwYXJ0aXRpb25fcHJvcHMpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCh7Ci0gICAgICAncm8ub2RtLmJ1aWxkLmRhdGUudXRjJzogJzE1Nzg0MzAwNDUnLAotICAgICAgJ3JvLm9kbS5idWlsZC5maW5nZXJwcmludCc6Ci0gICAgICAnZ29vZ2xlL2NvcmFsL2NvcmFsOjEwL1JQMUEuMjAwMzI1LjAwMS82MzM3Njc2OnVzZXIvZGV2LWtleXMnLAotICAgICAgJ3JvLnByb2R1Y3Qub2RtLmRldmljZSc6ICdjb3JhbCcsCisgICAgICAgICdyby5vZG0uYnVpbGQuZGF0ZS51dGMnOiAnMTU3ODQzMDA0NScsCisgICAgICAgICdyby5vZG0uYnVpbGQuZmluZ2VycHJpbnQnOgorICAgICAgICAnZ29vZ2xlL2NvcmFsL2NvcmFsOjEwL1JQMUEuMjAwMzI1LjAwMS82MzM3Njc2OnVzZXIvZGV2LWtleXMnLAorICAgICAgICAncm8ucHJvZHVjdC5vZG0uZGV2aWNlJzogJ2NvcmFsJywKICAgICB9LCBjb3BpZWRfcHJvcHMuYnVpbGRfcHJvcHMpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkKaW5kZXggYWQwZjdhOC4uYjZmY2IxOCAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X290YV9mcm9tX3RhcmdldF9maWxlcy5weQpAQCAtMTYzLDYgKzE2MywyMCBAQAogICAgICAgJ29lbV9maW5nZXJwcmludF9wcm9wZXJ0aWVzJzogJ3JvLnByb2R1Y3QuZGV2aWNlIHJvLnByb2R1Y3QuYnJhbmQnLAogICB9CiAKKyAgVEVTVF9UQVJHRVRfVkVORE9SX0lORk9fRElDVCA9IGNvbW1vbi5QYXJ0aXRpb25CdWlsZFByb3BzLkZyb21EaWN0aW9uYXJ5KAorICAgICd2ZW5kb3InLCB7CisgICAgICAncm8udmVuZG9yLmJ1aWxkLmRhdGUudXRjJyA6ICc4NzY1NDMyMScsCisgICAgICAncm8ucHJvZHVjdC52ZW5kb3IuZGV2aWNlJzondmVuZG9yLWRldmljZScsCisgICAgICAncm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50JzogJ2J1aWxkLWZpbmdlcnByaW50LXZlbmRvcid9CisgICkKKworICBURVNUX1NPVVJDRV9WRU5ET1JfSU5GT19ESUNUID0gY29tbW9uLlBhcnRpdGlvbkJ1aWxkUHJvcHMuRnJvbURpY3Rpb25hcnkoCisgICAgJ3ZlbmRvcicsIHsKKyAgICAgICdyby52ZW5kb3IuYnVpbGQuZGF0ZS51dGMnIDogJzEyMzQ1Njc4JywKKyAgICAgICdyby5wcm9kdWN0LnZlbmRvci5kZXZpY2UnOid2ZW5kb3ItZGV2aWNlJywKKyAgICAgICdyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQnOiAnYnVpbGQtZmluZ2VycHJpbnQtdmVuZG9yJ30KKyAgKQorCiAgIGRlZiBzZXRVcChzZWxmKToKICAgICBzZWxmLnRlc3RkYXRhX2RpciA9IHRlc3RfdXRpbHMuZ2V0X3Rlc3RkYXRhX2RpcigpCiAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNlbGYudGVzdGRhdGFfZGlyKSkKQEAgLTI4NSw3ICsyOTksNyBAQAogICBAdGVzdF91dGlscy5Ta2lwSWZFeHRlcm5hbFRvb2xzVW5hdmFpbGFibGUoKQogICBkZWYgdGVzdF9HZXRBcGV4SW5mb0Zyb21UYXJnZXRGaWxlcyhzZWxmKToKICAgICB0YXJnZXRfZmlsZXMgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKGNvbXByZXNzZWRBcGV4PVRydWUpCi0gICAgYXBleF9pbmZvcyA9IEdldEFwZXhJbmZvRnJvbVRhcmdldEZpbGVzKHRhcmdldF9maWxlcywgJ3N5c3RlbScpCisgICAgYXBleF9pbmZvcyA9IEdldEFwZXhJbmZvRnJvbVRhcmdldEZpbGVzKHRhcmdldF9maWxlcykKICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhcGV4X2luZm9zKSwgMSkKICAgICBzZWxmLmFzc2VydEVxdWFsKGFwZXhfaW5mb3NbMF0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYXBleC5jb21wcmVzc2VkIikKICAgICBzZWxmLmFzc2VydEVxdWFsKGFwZXhfaW5mb3NbMF0udmVyc2lvbiwgMSkKQEAgLTM1MSw2ICszNjUsMTMgQEAKICAgICAgICAgIHNvdXJjZV9pbmZvWydidWlsZC5wcm9wJ10uYnVpbGRfcHJvcHNbJ3JvLmJ1aWxkLmRhdGUudXRjJ10sCiAgICAgICAgICB0YXJnZXRfaW5mb1snYnVpbGQucHJvcCddLmJ1aWxkX3Byb3BzWydyby5idWlsZC5kYXRlLnV0YyddKQogCisgIEBzdGF0aWNtZXRob2QKKyAgZGVmIF90ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV9zd2FwVmVuZG9yQnVpbGRUaW1lc3RhbXBzKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbyk6CisgICAgKHRhcmdldF9pbmZvWyd2ZW5kb3IuYnVpbGQucHJvcCddLmJ1aWxkX3Byb3BzWydyby52ZW5kb3IuYnVpbGQuZGF0ZS51dGMnXSwKKyAgICAgc291cmNlX2luZm9bJ3ZlbmRvci5idWlsZC5wcm9wJ10uYnVpbGRfcHJvcHNbJ3JvLnZlbmRvci5idWlsZC5kYXRlLnV0YyddKSA9ICgKKyAgICAgICAgIHNvdXJjZV9pbmZvWyd2ZW5kb3IuYnVpbGQucHJvcCddLmJ1aWxkX3Byb3BzWydyby52ZW5kb3IuYnVpbGQuZGF0ZS51dGMnXSwKKyAgICAgICAgIHRhcmdldF9pbmZvWyd2ZW5kb3IuYnVpbGQucHJvcCddLmJ1aWxkX3Byb3BzWydyby52ZW5kb3IuYnVpbGQuZGF0ZS51dGMnXSkKKwogICBkZWYgdGVzdF9HZXRQYWNrYWdlTWV0YWRhdGFfdW5pbnRlbnRpb25hbERvd25ncmFkZURldGVjdGVkKHNlbGYpOgogICAgIHRhcmdldF9pbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9UQVJHRVRfSU5GT19ESUNUKQogICAgIHNvdXJjZV9pbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9TT1VSQ0VfSU5GT19ESUNUKQpAQCAtMzYzLDYgKzM4NCwyNCBAQAogICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2VsZi5HZXRMZWdhY3lPdGFNZXRhZGF0YSwgdGFyZ2V0X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2luZm8pCiAKKyAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3VuaW50ZW50aW9uYWxWZW5kb3JEb3duZ3JhZGVEZXRlY3RlZChzZWxmKToKKyAgICB0YXJnZXRfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCkKKyAgICB0YXJnZXRfaW5mb19kaWN0WydhYl91cGRhdGUnXSA9ICd0cnVlJworICAgIHRhcmdldF9pbmZvX2RpY3RbJ2FiX3BhcnRpdGlvbnMnXSA9IFsndmVuZG9yJ10KKyAgICB0YXJnZXRfaW5mb19kaWN0WyJ2ZW5kb3IuYnVpbGQucHJvcCJdID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX1ZFTkRPUl9JTkZPX0RJQ1QpCisgICAgc291cmNlX2luZm9fZGljdCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1NPVVJDRV9JTkZPX0RJQ1QpCisgICAgc291cmNlX2luZm9fZGljdFsnYWJfdXBkYXRlJ10gPSAndHJ1ZScKKyAgICBzb3VyY2VfaW5mb19kaWN0WydhYl9wYXJ0aXRpb25zJ10gPSBbJ3ZlbmRvciddCisgICAgc291cmNlX2luZm9fZGljdFsidmVuZG9yLmJ1aWxkLnByb3AiXSA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1NPVVJDRV9WRU5ET1JfSU5GT19ESUNUKQorICAgIHNlbGYuX3Rlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3N3YXBWZW5kb3JCdWlsZFRpbWVzdGFtcHMoCisgICAgICAgIHRhcmdldF9pbmZvX2RpY3QsIHNvdXJjZV9pbmZvX2RpY3QpCisKKyAgICB0YXJnZXRfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8odGFyZ2V0X2luZm9fZGljdCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8oc291cmNlX2luZm9fZGljdCwgTm9uZSkKKyAgICBjb21tb24uT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSAnJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2VsZi5HZXRMZWdhY3lPdGFNZXRhZGF0YSwgdGFyZ2V0X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2luZm8pCisKICAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX2Rvd25ncmFkZShzZWxmKToKICAgICB0YXJnZXRfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCkKICAgICBzb3VyY2VfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfU09VUkNFX0lORk9fRElDVCkKQEAgLTM5Nyw2ICs0MzYsNTUgQEAKICAgICAgICAgfSwKICAgICAgICAgbWV0YWRhdGEpCiAKKyAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3ZlbmRvckRvd25ncmFkZShzZWxmKToKKyAgICB0YXJnZXRfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCkKKyAgICB0YXJnZXRfaW5mb19kaWN0WydhYl91cGRhdGUnXSA9ICd0cnVlJworICAgIHRhcmdldF9pbmZvX2RpY3RbJ2FiX3BhcnRpdGlvbnMnXSA9IFsndmVuZG9yJ10KKyAgICB0YXJnZXRfaW5mb19kaWN0WyJ2ZW5kb3IuYnVpbGQucHJvcCJdID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX1ZFTkRPUl9JTkZPX0RJQ1QpCisgICAgc291cmNlX2luZm9fZGljdCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1NPVVJDRV9JTkZPX0RJQ1QpCisgICAgc291cmNlX2luZm9fZGljdFsnYWJfdXBkYXRlJ10gPSAndHJ1ZScKKyAgICBzb3VyY2VfaW5mb19kaWN0WydhYl9wYXJ0aXRpb25zJ10gPSBbJ3ZlbmRvciddCisgICAgc291cmNlX2luZm9fZGljdFsidmVuZG9yLmJ1aWxkLnByb3AiXSA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1NPVVJDRV9WRU5ET1JfSU5GT19ESUNUKQorICAgIHNlbGYuX3Rlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3N3YXBWZW5kb3JCdWlsZFRpbWVzdGFtcHMoCisgICAgICAgIHRhcmdldF9pbmZvX2RpY3QsIHNvdXJjZV9pbmZvX2RpY3QpCisKKyAgICB0YXJnZXRfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8odGFyZ2V0X2luZm9fZGljdCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8oc291cmNlX2luZm9fZGljdCwgTm9uZSkKKyAgICBjb21tb24uT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSAnJworICAgIGNvbW1vbi5PUFRJT05TLmRvd25ncmFkZSA9IFRydWUKKyAgICBjb21tb24uT1BUSU9OUy53aXBlX3VzZXJfZGF0YSA9IFRydWUKKyAgICBjb21tb24uT1BUSU9OUy5zcGxfZG93bmdyYWRlID0gVHJ1ZQorICAgIG1ldGFkYXRhID0gc2VsZi5HZXRMZWdhY3lPdGFNZXRhZGF0YSh0YXJnZXRfaW5mbywgc291cmNlX2luZm8pCisgICAgIyBSZXNldCBzcGxfZG93bmdyYWRlIHNvIG90aGVyIHRlc3RzIGFyZSB1bmFmZmVjdGVkCisgICAgY29tbW9uLk9QVElPTlMuc3BsX2Rvd25ncmFkZSA9IEZhbHNlCisKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgJ290YS1kb3duZ3JhZGUnOiAneWVzJywKKyAgICAgICAgICAgICdvdGEtdHlwZSc6ICdBQicsCisgICAgICAgICAgICAnb3RhLXJlcXVpcmVkLWNhY2hlJzogJzAnLAorICAgICAgICAgICAgJ290YS13aXBlJzogJ3llcycsCisgICAgICAgICAgICAncG9zdC1idWlsZCc6ICdidWlsZC1maW5nZXJwcmludC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3QtYnVpbGQtaW5jcmVtZW50YWwnOiAnYnVpbGQtdmVyc2lvbi1pbmNyZW1lbnRhbC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3Qtc2RrLWxldmVsJzogJzI3JywKKyAgICAgICAgICAgICdwb3N0LXNlY3VyaXR5LXBhdGNoLWxldmVsJzogJzIwMTctMTItMDEnLAorICAgICAgICAgICAgJ3Bvc3QtdGltZXN0YW1wJzogJzE1MDAwMDAwMDAnLAorICAgICAgICAgICAgJ3ByZS1kZXZpY2UnOiAncHJvZHVjdC1kZXZpY2UnLAorICAgICAgICAgICAgJ3ByZS1idWlsZCc6ICdidWlsZC1maW5nZXJwcmludC1zb3VyY2UnLAorICAgICAgICAgICAgJ3ByZS1idWlsZC1pbmNyZW1lbnRhbCc6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXNvdXJjZScsCisgICAgICAgICAgICAnc3BsLWRvd25ncmFkZSc6ICd5ZXMnLAorICAgICAgICB9LAorICAgICAgICBtZXRhZGF0YSkKKworICAgIHBvc3RfYnVpbGQgPSBHZXRQYWNrYWdlTWV0YWRhdGEodGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKS5wb3N0Y29uZGl0aW9uCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndmVuZG9yJywgcG9zdF9idWlsZC5wYXJ0aXRpb25fc3RhdGVbMF0ucGFydGl0aW9uX25hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnMTIzNDU2NzgnLCBwb3N0X2J1aWxkLnBhcnRpdGlvbl9zdGF0ZVswXS52ZXJzaW9uKQorCisgICAgcHJlX2J1aWxkID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykucHJlY29uZGl0aW9uCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndmVuZG9yJywgcHJlX2J1aWxkLnBhcnRpdGlvbl9zdGF0ZVswXS5wYXJ0aXRpb25fbmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCc4NzY1NDMyMScsIHByZV9idWlsZC5wYXJ0aXRpb25fc3RhdGVbMF0udmVyc2lvbikKKworCiAgIEB0ZXN0X3V0aWxzLlNraXBJZkV4dGVybmFsVG9vbHNVbmF2YWlsYWJsZSgpCiAgIGRlZiB0ZXN0X0dldFRhcmdldEZpbGVzWmlwRm9yU2Vjb25kYXJ5SW1hZ2VzKHNlbGYpOgogICAgIGlucHV0X2ZpbGUgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKHNlY29uZGFyeT1UcnVlKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfc2lnbl9hcGV4LnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfc2lnbl9hcGV4LnB5CmluZGV4IDc3MjNkZTcuLjg0NzBmMjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3NpZ25fYXBleC5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF9zaWduX2FwZXgucHkKQEAgLTU5LDIxICs1OSw2IEBACiAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNpZ25lZF90ZXN0X2FwZXgpKQogCiAgIEB0ZXN0X3V0aWxzLlNraXBJZkV4dGVybmFsVG9vbHNVbmF2YWlsYWJsZSgpCi0gIGRlZiB0ZXN0X1NpZ25TZXBvbGljeUFwZXgoc2VsZik6Ci0gICAgdGVzdF9hcGV4ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAnc2Vwb2xpY3kuYXBleCcpCi0gICAgcGF5bG9hZF9rZXkgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5X1JTQTQwOTYua2V5JykKLSAgICBjb250YWluZXJfa2V5ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleScpCi0gICAgYXBrX2tleXMgPSB7J1NFUG9saWN5LTMzLnppcCc6IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXknKX0KLSAgICBzaWduZWRfdGVzdF9hcGV4ID0gc2lnbl9hcGV4LlNpZ25BcGV4RmlsZSgKLSAgICAgICAgJ2F2YnRvb2wnLAotICAgICAgICB0ZXN0X2FwZXgsCi0gICAgICAgIHBheWxvYWRfa2V5LAotICAgICAgICBjb250YWluZXJfa2V5LAotICAgICAgICBGYWxzZSwKLSAgICAgICAgTm9uZSkKLSAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2lnbmVkX3Rlc3RfYXBleCkpCi0KLSAgQHRlc3RfdXRpbHMuU2tpcElmRXh0ZXJuYWxUb29sc1VuYXZhaWxhYmxlKCkKICAgZGVmIHRlc3RfU2lnbkNvbXByZXNzZWRBcGV4RmlsZShzZWxmKToKICAgICBhcGV4ID0gb3MucGF0aC5qb2luKHRlc3RfdXRpbHMuZ2V0X2N1cnJlbnRfZGlyKCksICdjb20uYW5kcm9pZC5hcGV4LmNvbXByZXNzZWQudjEuY2FwZXgnKQogICAgIHBheWxvYWRfa2V5ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleV9SU0E0MDk2LmtleScpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQppbmRleCAwY2Q3ZGFjLi43YWMxY2ZmIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkKQEAgLTIyLDggKzIyLDggQEAKIGltcG9ydCBjb21tb24KIGltcG9ydCB0ZXN0X3V0aWxzCiBmcm9tIHNpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MgaW1wb3J0ICgKLSAgICBDaGVja0Fwa0FuZEFwZXhLZXlzQXZhaWxhYmxlLCBFZGl0VGFncywgR2V0QXBrRmlsZUluZm8sIFJlYWRBcGV4S2V5c0luZm8sCi0gICAgUmVwbGFjZUNlcnRzLCBSZXBsYWNlR2tpU2lnbmluZ0tleSwgUmV3cml0ZUF2YlByb3BzLCBSZXdyaXRlUHJvcHMsCisgICAgQ2hlY2tBcGtBbmRBcGV4S2V5c0F2YWlsYWJsZSwgRWRpdFRhZ3MsIEdldEFwa0ZpbGVJbmZvLCBQYXJzZUF2YkluZm8sCisgICAgUmVhZEFwZXhLZXlzSW5mbywgUmVwbGFjZUNlcnRzLCBSZXdyaXRlQXZiUHJvcHMsIFJld3JpdGVQcm9wcywKICAgICBXcml0ZU90YWNlcnRzKQogCiAKQEAgLTUzNyw1MSArNTM3LDg1IEBACiAgICAgICAgICAgICAnYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5JywgTm9uZSksCiAgICAgICAgIH0sIGtleXNfaW5mbykKIAotICBkZWYgdGVzdF9SZXBsYWNlR2tpU2lnbmluZ0tleShzZWxmKToKLSAgICBjb21tb24uT1BUSU9OUy5na2lfc2lnbmluZ19rZXkgPSAncmVsZWFzZV9na2lfa2V5JwotICAgIGNvbW1vbi5PUFRJT05TLmdraV9zaWduaW5nX2FsZ29yaXRobSA9ICdyZWxlYXNlX2draV9hbGdvcml0aG0nCi0gICAgY29tbW9uLk9QVElPTlMuZ2tpX3NpZ25pbmdfZXh0cmFfYXJncyA9ICdyZWxlYXNlX2draV9zaWduYXR1cmVfZXh0cmFfYXJncycKKyAgZGVmIHRlc3RfUGFyc2VBdmJJbmZvKHNlbGYpOgorICAgIGF2Yl9pbmZvX3N0cmluZyA9ICIiIgorICAgIEZvb3RlciB2ZXJzaW9uOiAgICAgICAgICAgMS4wCisgICAgSW1hZ2Ugc2l6ZTogICAgICAgICAgICAgICA5OTk5OTk5IGJ5dGVzCisgICAgT3JpZ2luYWwgaW1hZ2Ugc2l6ZTogICAgICA4ODg4ODg4IGJ5dGVzCisgICAgVkJNZXRhIG9mZnNldDogICAgICAgICAgICA3Nzc3Nzc3CisgICAgVkJNZXRhIHNpemU6ICAgICAgICAgICAgICAxMTExIGJ5dGVzCisgICAgLS0KKyAgICBNaW5pbXVtIGxpYmF2YiB2ZXJzaW9uOiAgIDEuMAorICAgIEhlYWRlciBCbG9jazogICAgICAgICAgICAgMjIyIGJ5dGVzCisgICAgQXV0aGVudGljYXRpb24gQmxvY2s6ICAgICAzMzMgYnl0ZXMKKyAgICBBdXhpbGlhcnkgQmxvY2s6ICAgICAgICAgIDg4OCBieXRlcworICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICAgYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYgorICAgIEFsZ29yaXRobTogICAgICAgICAgICAgICAgU0hBMjU2X1JTQTIwNDgKKyAgICBSb2xsYmFjayBJbmRleDogICAgICAgICAgIDAKKyAgICBGbGFnczogICAgICAgICAgICAgICAgICAgIDAKKyAgICBSb2xsYmFjayBJbmRleCBMb2NhdGlvbjogIDAKKyAgICBSZWxlYXNlIFN0cmluZzogICAgICAgICAgICdhdmJ0b29sIDEuMy4wJworICAgIERlc2NyaXB0b3JzOgorICAgICAgICBIYXNodHJlZSBkZXNjcmlwdG9yOgorICAgICAgICAgIFZlcnNpb24gb2YgZG0tdmVyaXR5OiAgMQorICAgICAgICAgIEltYWdlIFNpemU6ICAgICAgICAgICAgODg4ODg4OCBieXRlcworICAgICAgICAgIFRyZWUgT2Zmc2V0OiAgICAgICAgICAgODg4ODg4OAorICAgICAgICAgIFRyZWUgU2l6ZTogICAgICAgICAgICAgNDQ0NDQgYnl0ZXMKKyAgICAgICAgICBEYXRhIEJsb2NrIFNpemU6ICAgICAgIDQ0NDQgYnl0ZXMKKyAgICAgICAgICBIYXNoIEJsb2NrIFNpemU6ICAgICAgIDQ0NDQgYnl0ZXMKKyAgICAgICAgICBGRUMgbnVtIHJvb3RzOiAgICAgICAgIDAKKyAgICAgICAgICBGRUMgb2Zmc2V0OiAgICAgICAgICAgIDAKKyAgICAgICAgICBGRUMgc2l6ZTogICAgICAgICAgICAgIDAgYnl0ZXMKKyAgICAgICAgICBIYXNoIEFsZ29yaXRobTogICAgICAgIHNoYTEKKyAgICAgICAgICBQYXJ0aXRpb24gTmFtZTogICAgICAgIHBhcnRpdGlvbi1uYW1lCisgICAgICAgICAgU2FsdDogICAgICAgICAgICAgICAgICBjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkCisgICAgICAgICAgUm9vdCBEaWdlc3Q6ICAgICAgICAgICBlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWYKKyAgICAgICAgICBGbGFnczogICAgICAgICAgICAgICAgIDAKKyAgICAgICAgUHJvcDogcHJvcC5rZXkgLT4gJ3Byb3AudmFsdWUnCisgICAgIiIiCiAKLSAgICBtaXNjX2luZm8gPSB7Ci0gICAgICAgICdna2lfc2lnbmluZ19rZXlfcGF0aCc6ICdkZWZhdWx0X2draV9rZXknLAotICAgICAgICAnZ2tpX3NpZ25pbmdfYWxnb3JpdGhtJzogJ2RlZmF1bHRfZ2tpX2FsZ29yaXRobScsCi0gICAgICAgICdna2lfc2lnbmluZ19zaWduYXR1cmVfYXJncyc6ICdkZWZhdWx0X2draV9zaWduYXR1cmVfYXJncycsCi0gICAgfQotICAgIGV4cGVjdGVkX2RpY3QgPSB7Ci0gICAgICAgICdna2lfc2lnbmluZ19rZXlfcGF0aCc6ICdyZWxlYXNlX2draV9rZXknLAotICAgICAgICAnZ2tpX3NpZ25pbmdfYWxnb3JpdGhtJzogJ3JlbGVhc2VfZ2tpX2FsZ29yaXRobScsCi0gICAgICAgICdna2lfc2lnbmluZ19zaWduYXR1cmVfYXJncyc6ICdyZWxlYXNlX2draV9zaWduYXR1cmVfZXh0cmFfYXJncycsCi0gICAgfQotICAgIFJlcGxhY2VHa2lTaWduaW5nS2V5KG1pc2NfaW5mbykKLSAgICBzZWxmLmFzc2VydERpY3RFcXVhbChleHBlY3RlZF9kaWN0LCBtaXNjX2luZm8pCi0KLSAgZGVmIHRlc3RfUmVwbGFjZUdraVNpZ25pbmdLZXlfTWlzc2luZ1NpZ25pbmdBbGdvcml0aG0oc2VsZik6Ci0gICAgY29tbW9uLk9QVElPTlMuZ2tpX3NpZ25pbmdfa2V5ID0gJ3JlbGVhc2VfZ2tpX2tleScKLSAgICBjb21tb24uT1BUSU9OUy5na2lfc2lnbmluZ19hbGdvcml0aG0gPSBOb25lCi0gICAgY29tbW9uLk9QVElPTlMuZ2tpX3NpZ25pbmdfZXh0cmFfYXJncyA9ICdyZWxlYXNlX2draV9zaWduYXR1cmVfZXh0cmFfYXJncycKLQotICAgIG1pc2NfaW5mbyA9IHsKLSAgICAgICAgJ2draV9zaWduaW5nX2tleV9wYXRoJzogJ2RlZmF1bHRfZ2tpX2tleScsCi0gICAgICAgICdna2lfc2lnbmluZ19hbGdvcml0aG0nOiAnZGVmYXVsdF9na2lfYWxnb3JpdGhtJywKLSAgICAgICAgJ2draV9zaWduaW5nX3NpZ25hdHVyZV9hcmdzJzogJ2RlZmF1bHRfZ2tpX3NpZ25hdHVyZV9hcmdzJywKLSAgICB9Ci0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgUmVwbGFjZUdraVNpZ25pbmdLZXksIG1pc2NfaW5mbykKLQotICBkZWYgdGVzdF9SZXBsYWNlR2tpU2lnbmluZ0tleV9NaXNzaW5nU2lnbmluZ0tleU5vcChzZWxmKToKLSAgICBjb21tb24uT1BUSU9OUy5na2lfc2lnbmluZ19rZXkgPSBOb25lCi0gICAgY29tbW9uLk9QVElPTlMuZ2tpX3NpZ25pbmdfYWxnb3JpdGhtID0gJ3JlbGVhc2VfZ2tpX2FsZ29yaXRobScKLSAgICBjb21tb24uT1BUSU9OUy5na2lfc2lnbmluZ19leHRyYV9hcmdzID0gJ3JlbGVhc2VfZ2tpX3NpZ25hdHVyZV9leHRyYV9hcmdzJwotCi0gICAgIyBObyBjaGFuZ2UgdG8gbWlzY19pbmZvIGlmIGNvbW1vbi5PUFRJT05TLmdraV9zaWduaW5nX2tleSBpcyBtaXNzaW5nLgotICAgIG1pc2NfaW5mbyA9IHsKLSAgICAgICAgJ2draV9zaWduaW5nX2tleV9wYXRoJzogJ2RlZmF1bHRfZ2tpX2tleScsCi0gICAgICAgICdna2lfc2lnbmluZ19hbGdvcml0aG0nOiAnZGVmYXVsdF9na2lfYWxnb3JpdGhtJywKLSAgICAgICAgJ2draV9zaWduaW5nX3NpZ25hdHVyZV9hcmdzJzogJ2RlZmF1bHRfZ2tpX3NpZ25hdHVyZV9hcmdzJywKLSAgICB9Ci0gICAgZXhwZWN0ZWRfZGljdCA9IHsKLSAgICAgICAgJ2draV9zaWduaW5nX2tleV9wYXRoJzogJ2RlZmF1bHRfZ2tpX2tleScsCi0gICAgICAgICdna2lfc2lnbmluZ19hbGdvcml0aG0nOiAnZGVmYXVsdF9na2lfYWxnb3JpdGhtJywKLSAgICAgICAgJ2draV9zaWduaW5nX3NpZ25hdHVyZV9hcmdzJzogJ2RlZmF1bHRfZ2tpX3NpZ25hdHVyZV9hcmdzJywKLSAgICB9Ci0gICAgUmVwbGFjZUdraVNpZ25pbmdLZXkobWlzY19pbmZvKQotICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKGV4cGVjdGVkX2RpY3QsIG1pc2NfaW5mbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB7CisgICAgICAgICAgICAnRm9vdGVyIHZlcnNpb24nOiAnMS4wJywKKyAgICAgICAgICAgICdJbWFnZSBzaXplJzogJzk5OTk5OTkgYnl0ZXMnLAorICAgICAgICAgICAgJ09yaWdpbmFsIGltYWdlIHNpemUnOiAnODg4ODg4OCBieXRlcycsCisgICAgICAgICAgICAnVkJNZXRhIG9mZnNldCc6ICc3Nzc3Nzc3JywKKyAgICAgICAgICAgICdWQk1ldGEgc2l6ZSc6ICcxMTExIGJ5dGVzJywKKyAgICAgICAgICAgICdNaW5pbXVtIGxpYmF2YiB2ZXJzaW9uJzogJzEuMCcsCisgICAgICAgICAgICAnSGVhZGVyIEJsb2NrJzogJzIyMiBieXRlcycsCisgICAgICAgICAgICAnQXV0aGVudGljYXRpb24gQmxvY2snOiAnMzMzIGJ5dGVzJywKKyAgICAgICAgICAgICdBdXhpbGlhcnkgQmxvY2snOiAnODg4IGJ5dGVzJywKKyAgICAgICAgICAgICdQdWJsaWMga2V5IChzaGExKSc6ICdhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiJywKKyAgICAgICAgICAgICdBbGdvcml0aG0nOiAnU0hBMjU2X1JTQTIwNDgnLAorICAgICAgICAgICAgJ1JvbGxiYWNrIEluZGV4JzogJzAnLAorICAgICAgICAgICAgJ0ZsYWdzJzogJzAnLAorICAgICAgICAgICAgJ1JvbGxiYWNrIEluZGV4IExvY2F0aW9uJzogJzAnLAorICAgICAgICAgICAgJ1JlbGVhc2UgU3RyaW5nJzogIidhdmJ0b29sIDEuMy4wJyIsCisgICAgICAgICAgICAnRGVzY3JpcHRvcnMnOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAnSGFzaHRyZWUgZGVzY3JpcHRvcic6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICdWZXJzaW9uIG9mIGRtLXZlcml0eSc6ICcxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdJbWFnZSBTaXplJzogJzg4ODg4ODggYnl0ZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RyZWUgT2Zmc2V0JzogJzg4ODg4ODgnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RyZWUgU2l6ZSc6ICc0NDQ0NCBieXRlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAnRGF0YSBCbG9jayBTaXplJzogJzQ0NDQgYnl0ZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0hhc2ggQmxvY2sgU2l6ZSc6ICc0NDQ0IGJ5dGVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdGRUMgbnVtIHJvb3RzJzogJzAnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0ZFQyBvZmZzZXQnOiAnMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnRkVDIHNpemUnOiAnMCBieXRlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAnSGFzaCBBbGdvcml0aG0nOiAnc2hhMScsCisgICAgICAgICAgICAgICAgICAgICAgICAnUGFydGl0aW9uIE5hbWUnOiAncGFydGl0aW9uLW5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1NhbHQnOiAnY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnUm9vdCBEaWdlc3QnOiAnZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdGbGFncyc6ICcwJywKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAnUHJvcCc6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wLmtleSc6ICdwcm9wLnZhbHVlJywKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBQYXJzZUF2YkluZm8oYXZiX2luZm9fc3RyaW5nKSwKKyAgICApClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5CmluZGV4IDQ4YjU2M2QuLjRkNGI5ZTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3ZhbGlkYXRlX3RhcmdldF9maWxlcy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF92YWxpZGF0ZV90YXJnZXRfZmlsZXMucHkKQEAgLTE1Niw3ICsxNTYsNiBAQAogICAgICAgICB2ZXJpdHlfa2V5X21pbmNyeXB0KQogCiAgICAgaW5mb19kaWN0ID0gewotICAgICAgICAnc3lzdGVtX3Jvb3RfaW1hZ2UnIDogJ3RydWUnLAogICAgICAgICAndmVyaXR5JyA6ICd0cnVlJywKICAgICB9CiAgICAgb3B0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9zZXBvbGljeS5hcGV4IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3NlcG9saWN5LmFwZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNjQ2Y2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3NlcG9saWN5LmFwZXgKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3ZhbGlkYXRlX3RhcmdldF9maWxlcy5weQppbmRleCBiZWI5ZTc1Li44OGZkODkyIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy92YWxpZGF0ZV90YXJnZXRfZmlsZXMucHkKQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgIHJldHVybgogCiAgICMgVmVyaWZ5IElNQUdFUy9zeXN0ZW0uaW1nIGlmIGFwcGxpY2FibGUuCi0gICMgU29tZSB0YXJnZXRzLCBlLmcuLCBna2lfYXJtNjQsIGdraV94ODZfNjQsIGV0Yy4sIGFyZSBzeXN0ZW0uaW1nLWxlc3MuCisgICMgU29tZSB0YXJnZXRzIGFyZSBzeXN0ZW0uaW1nLWxlc3MuCiAgIGlmICdJTUFHRVMvc3lzdGVtLmltZycgaW4gaW5wdXRfemlwLm5hbWVsaXN0KCk6CiAgICAgQ2hlY2tBbGxGaWxlcygnc3lzdGVtJykKIApAQCAtMzYxLDE4ICszNjEsMTUgQEAKICAgICAgICAgICAiTWlzbWF0Y2hpbmcgbWluY3J5cHQgdmVyaXR5IGtleSBmaWxlcyIKICAgICAgIGxvZ2dpbmcuaW5mbygnVmVyaWZpZWQgdGhlIGNvbnRlbnQgb2YgL3Zlcml0eV9rZXknKQogCi0gICAgIyBGb3IgZGV2aWNlcyB3aXRoIGEgc2VwYXJhdGUgcmFtZGlzayAoaS5lLiBub24tc3lzdGVtLWFzLXJvb3QpLCB0aGVyZSBtdXN0Ci0gICAgIyBiZSBhIGNvcHkgaW4gcmFtZGlzay4KLSAgICBpZiBpbmZvX2RpY3QuZ2V0KCJzeXN0ZW1fcm9vdF9pbWFnZSIpICE9ICJ0cnVlIjoKLSAgICAgIHZlcml0eV9rZXlfcmFtZGlzayA9IG9zLnBhdGguam9pbigKLSAgICAgICAgICBpbnB1dF90bXAsICdCT09UJywgJ1JBTURJU0snLCAndmVyaXR5X2tleScpCi0gICAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMoCi0gICAgICAgICAgdmVyaXR5X2tleV9yYW1kaXNrKSwgJ01pc3NpbmcgdmVyaXR5X2tleSBpbiByYW1kaXNrJworICAgIHZlcml0eV9rZXlfcmFtZGlzayA9IG9zLnBhdGguam9pbigKKyAgICAgICAgaW5wdXRfdG1wLCAnQk9PVCcsICdSQU1ESVNLJywgJ3Zlcml0eV9rZXknKQorICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cygKKyAgICAgICAgdmVyaXR5X2tleV9yYW1kaXNrKSwgJ01pc3NpbmcgdmVyaXR5X2tleSBpbiByYW1kaXNrJwogCi0gICAgICBhc3NlcnQgZmlsZWNtcC5jbXAoCi0gICAgICAgICAgdmVyaXR5X2tleV9taW5jcnlwdCwgdmVyaXR5X2tleV9yYW1kaXNrLCBzaGFsbG93PUZhbHNlKSwgXAotICAgICAgICAgICdNaXNtYXRjaGluZyB2ZXJpdHlfa2V5IGZpbGVzIGluIHJvb3QgYW5kIHJhbWRpc2snCi0gICAgICBsb2dnaW5nLmluZm8oJ1ZlcmlmaWVkIHRoZSBjb250ZW50IG9mIC92ZXJpdHlfa2V5IGluIHJhbWRpc2snKQorICAgIGFzc2VydCBmaWxlY21wLmNtcCgKKyAgICAgICAgdmVyaXR5X2tleV9taW5jcnlwdCwgdmVyaXR5X2tleV9yYW1kaXNrLCBzaGFsbG93PUZhbHNlKSwgXAorICAgICAgICAnTWlzbWF0Y2hpbmcgdmVyaXR5X2tleSBmaWxlcyBpbiByb290IGFuZCByYW1kaXNrJworICAgIGxvZ2dpbmcuaW5mbygnVmVyaWZpZWQgdGhlIGNvbnRlbnQgb2YgL3Zlcml0eV9rZXkgaW4gcmFtZGlzaycpCiAKICAgICAjIFRoZW4gdmVyaWZ5IHRoZSB2ZXJpdHkgc2lnbmVkIHN5c3RlbS92ZW5kb3IvcHJvZHVjdCBpbWFnZXMsIGFnYWluc3QgdGhlCiAgICAgIyB2ZXJpdHkgcHVia2V5IGluIG1pbmNyeXB0IGZvcm1hdC4KQEAgLTQzMCw3ICs0MjcsOCBAQAogICAgICAgICBrZXlfZmlsZSA9IG9wdGlvbnMuZ2V0KGtleV9uYW1lLCBpbmZvX2RpY3Rba2V5X25hbWVdKQogICAgICAgICBjaGFpbmVkX3BhcnRpdGlvbl9hcmcgPSBjb21tb24uR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZygKICAgICAgICAgICAgIHBhcnRpdGlvbiwgaW5mb19kaWN0LCBrZXlfZmlsZSkKLSAgICAgICAgY21kLmV4dGVuZChbJy0tZXhwZWN0ZWRfY2hhaW5fcGFydGl0aW9uJywgY2hhaW5lZF9wYXJ0aXRpb25fYXJnXSkKKyAgICAgICAgY21kLmV4dGVuZChbJy0tZXhwZWN0ZWRfY2hhaW5fcGFydGl0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgY2hhaW5lZF9wYXJ0aXRpb25fYXJnLnRvX3N0cmluZygpXSkKIAogICAgICMgSGFuZGxlIHRoZSBib290IGltYWdlIHdpdGggYSBub24tZGVmYXVsdCBuYW1lLCBlLmcuIGJvb3QtNS40LmltZwogICAgIGJvb3RfaW1hZ2VzID0gaW5mb19kaWN0LmdldCgiYm9vdF9pbWFnZXMiKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Zlcml0eV91dGlscy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy92ZXJpdHlfdXRpbHMucHkKaW5kZXggZGRkYjdmNC4uN2NhZWVkNCAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Zlcml0eV91dGlscy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvdmVyaXR5X3V0aWxzLnB5CkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgY29tbW9uCiBpbXBvcnQgc3BhcnNlX2ltZwogZnJvbSByYW5nZWxpYiBpbXBvcnQgUmFuZ2VTZXQKK2Zyb20gaGFzaGxpYiBpbXBvcnQgc2hhMjU2CiAKIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCkBAIC00Miw2ICs0Myw3IEBACiBNQVhfVkJNRVRBX1NJWkUgPSA2NCAqIDEwMjQKIE1BWF9GT09URVJfU0laRSA9IDQwOTYKIAorCiBjbGFzcyBCdWlsZFZlcml0eUltYWdlRXJyb3IoRXhjZXB0aW9uKToKICAgIiIiQW4gRXhjZXB0aW9uIHJhaXNlZCBkdXJpbmcgdmVyaXR5IGltYWdlIGJ1aWxkaW5nLiIiIgogCkBAIC02NCw2ICs2NiwxMSBAQAogICAjIHBhcnRpdGlvbl9zaXplIGNvdWxkIGJlIE5vbmUgYXQgdGhpcyBwb2ludCwgaWYgdXNpbmcgZHluYW1pYyBwYXJ0aXRpb25zLgogICBpZiBwYXJ0aXRpb25fc2l6ZToKICAgICBwYXJ0aXRpb25fc2l6ZSA9IGludChwYXJ0aXRpb25fc2l6ZSkKKyAgIyBTZXQgdXAgdGhlIHNhbHQgKGJhc2VkIG9uIGZpbmdlcnByaW50KSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIGFkZGluZyBBVkIKKyAgIyBoYXNoIC8gaGFzaHRyZWUgZm9vdGVycy4KKyAgc2FsdCA9IHByb3BfZGljdC5nZXQoImF2Yl9zYWx0IikKKyAgaWYgc2FsdCBpcyBOb25lOgorICAgIHNhbHQgPSBzaGEyNTYocHJvcF9kaWN0LmdldCgiZmluZ2VycHJpbnQiLCAiIikuZW5jb2RlKCkpLmhleGRpZ2VzdCgpCiAKICAgIyBWZXJpZmllZCBCb290IDIuMAogICBpZiAocHJvcF9kaWN0LmdldCgiYXZiX2hhc2hfZW5hYmxlIikgPT0gInRydWUiIG9yCkBAIC04MSw3ICs4OCw3IEBACiAgICAgICAgICAgcHJvcF9kaWN0WyJhdmJfYXZidG9vbCJdLAogICAgICAgICAgIGtleV9wYXRoLAogICAgICAgICAgIGFsZ29yaXRobSwKLSAgICAgICAgICBwcm9wX2RpY3QuZ2V0KCJhdmJfc2FsdCIpLAorICAgICAgICAgIHNhbHQsCiAgICAgICAgICAgcHJvcF9kaWN0WyJhdmJfYWRkX2hhc2hfZm9vdGVyX2FyZ3MiXSkKIAogICAgICMgSW1hZ2UgdXNlcyBoYXNodHJlZSBmb290ZXIuCkBAIC05Miw3ICs5OSw3IEBACiAgICAgICAgIHByb3BfZGljdFsiYXZiX2F2YnRvb2wiXSwKICAgICAgICAga2V5X3BhdGgsCiAgICAgICAgIGFsZ29yaXRobSwKLSAgICAgICAgcHJvcF9kaWN0LmdldCgiYXZiX3NhbHQiKSwKKyAgICAgICAgc2FsdCwKICAgICAgICAgcHJvcF9kaWN0WyJhdmJfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzIl0pCiAKICAgcmV0dXJuIE5vbmUKQEAgLTI3OSw3ICsyODYsNyBAQAogCiAKIGRlZiBDcmVhdGVDdXN0b21JbWFnZUJ1aWxkZXIoaW5mb19kaWN0LCBwYXJ0aXRpb25fbmFtZSwgcGFydGl0aW9uX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3BhdGgsIGFsZ29yaXRobSwgc2lnbmluZ19hcmdzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3BhdGgsIGFsZ29yaXRobSwgc2lnbmluZ19hcmdzKToKICAgYnVpbGRlciA9IE5vbmUKICAgaWYgaW5mb19kaWN0LmdldCgiYXZiX2VuYWJsZSIpID09ICJ0cnVlIjoKICAgICBidWlsZGVyID0gVmVyaWZpZWRCb290VmVyc2lvbjJWZXJpdHlJbWFnZUJ1aWxkZXIoCmRpZmYgLS1naXQgYS90b29scy9zYm9tL0FuZHJvaWQuYnAgYi90b29scy9zYm9tL0FuZHJvaWQuYnAKaW5kZXggNDgzN2RkZS4uMmIyYjU3MyAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL3Nib20vQW5kcm9pZC5icApAQCAtNTMsNSArNTMsNDIgQEAKICAgICBsaWJzOiBbCiAgICAgICAgICJzYm9tX2xpYiIsCiAgICAgXSwKKyAgICB2ZXJzaW9uOiB7CisgICAgICAgIHB5MzogeworICAgICAgICAgICAgZW1iZWRkZWRfbGF1bmNoZXI6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKICAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCiB9CisKK3B5dGhvbl90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJzYm9tX2RhdGFfdGVzdCIsCisgICAgbWFpbjogInNib21fZGF0YV90ZXN0LnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzYm9tX2RhdGFfdGVzdC5weSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJzYm9tX2xpYiIsCisgICAgXSwKKyAgICB2ZXJzaW9uOiB7CisgICAgICAgIHB5MzogeworICAgICAgICAgICAgZW1iZWRkZWRfbGF1bmNoZXI6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImdlbmVyYXRlLXNib20tZnJhbWV3b3JrX3JlcyIsCisgICAgc3JjczogWworICAgICAgICAiZ2VuZXJhdGUtc2JvbS1mcmFtZXdvcmtfcmVzLnB5IiwKKyAgICBdLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGxpYnM6IFsKKyAgICAgICAgInNib21fbGliIiwKKyAgICBdLAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vZ2VuZXJhdGUtc2JvbS1mcmFtZXdvcmtfcmVzLnB5IGIvdG9vbHMvc2JvbS9nZW5lcmF0ZS1zYm9tLWZyYW1ld29ya19yZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkMjMyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Nib20vZ2VuZXJhdGUtc2JvbS1mcmFtZXdvcmtfcmVzLnB5CkBAIC0wLDAgKzEsMTAwIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBoYXNobGliCitpbXBvcnQganNvbgoraW1wb3J0IHNib21fZGF0YQoraW1wb3J0IHNib21fd3JpdGVycworCisnJycKK1RoaXMgc2NyaXB0IGdlbmVyYXRlcyBTQk9NIG9mIGZyYW1ld29ya19yZXMuamFyIG9mIGxheW91dGxpYiBzaGlwcGVkIHdpdGggQW5kcm9pZCBTdHVkaW8uCisKK1RoZSBnZW5lcmF0ZWQgU0JPTSBjb250YWlucyBzb21lIHBsYWNlaG9sZGVycyB3aGljaCBzaG91bGQgYmUgc3Vic3RpdHV0ZWQgYnkgcmVsZWFzZV9sYXlvdXRsaWIuc2guCitUaGUgcGxhY2Vob2xkZXJzIGluY2x1ZGU6IGRvY3VtZW50IG5hbWUsIGRvY3VtZW50IG5hbWVzcGFjZSwgb3JnYW5pemF0aW9uLCBjcmVhdGVkIHRpbWVzdGFtcCBhbmQgCit0aGUgU0hBMSBjaGVja3N1bSBvZiBmcmFtZXdvcmtfcmVzLmphci4KKycnJworCitkZWYgZ2V0X2FyZ3MoKToKKyAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1ByaW50IG1vcmUgaW5mb3JtYXRpb24uJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXRfZmlsZScsIHJlcXVpcmVkPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIGdlbmVyYXRlZCBTQk9NIGZpbGUgaW4gU1BEWCBmb3JtYXQuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1sYXlvdXRsaWJfc2JvbScsIHJlcXVpcmVkPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIGZpbGUgcGF0aCBvZiB0aGUgU0JPTSBvZiBsYXlvdXRsaWIuJykKKworICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2RlZiBtYWluKCk6CisgIGdsb2JhbCBhcmdzCisgIGFyZ3MgPSBnZXRfYXJncygpCisKKyAgZG9jID0gc2JvbV9kYXRhLkRvY3VtZW50KG5hbWU9JzxuYW1lPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9JzxuYW1lc3BhY2U+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JzPVsnT3JnYW5pemF0aW9uOiA8b3JnYW5pemF0aW9uPiddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZD0nPGNyZWF0ZWQ+JykKKworICBmaWxlbmFtZSA9ICdkYXRhL2ZyYW1ld29ya19yZXMuamFyJworICBmaWxlX2lkID0gZidTUERYUmVmLXtzYm9tX2RhdGEuZW5jb2RlX2Zvcl9zcGR4aWQoZmlsZW5hbWUpfScKKyAgZmlsZSA9IHNib21fZGF0YS5GaWxlKGlkPWZpbGVfaWQsIG5hbWU9ZmlsZW5hbWUsIGNoZWNrc3VtPSdTSEExOiA8Y2hlY2tzdW0+JykKKworICBwYWNrYWdlX25hbWUgPSAnZnJhbWV3b3JrX3JlcycKKyAgcGFja2FnZV9pZCA9IGYnU1BEWFJlZi1QUkVCVUlMVC17c2JvbV9kYXRhLmVuY29kZV9mb3Jfc3BkeGlkKHBhY2thZ2VfbmFtZSl9JworICBwYWNrYWdlID0gc2JvbV9kYXRhLlBhY2thZ2UoaWQ9cGFja2FnZV9pZCwgbmFtZT1wYWNrYWdlX25hbWUsIHZlcnNpb249JzxwYWNrYWdlX3ZlcnNpb24+JywKKyAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPSdPcmdhbml6YXRpb246IDxvcmdhbml6YXRpb24+JywKKyAgICAgICAgICAgICAgICAgICAgZmlsZXNfYW5hbHl6ZWQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU9JzxwYWNrYWdlX3ZlcmlmaWNhdGlvbl9jb2RlPicpCisgIHBhY2thZ2UuZmlsZV9pZHMuYXBwZW5kKGZpbGVfaWQpCisKKyAgZG9jLnBhY2thZ2VzLmFwcGVuZChwYWNrYWdlKQorICBkb2MuZmlsZXMuYXBwZW5kKGZpbGUpCisgIGRvYy5kZXNjcmliZXMgPSBwYWNrYWdlX2lkCisKKyAgd2l0aCBvcGVuKGFyZ3MubGF5b3V0bGliX3Nib20sICdyJywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKKyAgICBsYXlvdXRsaWJfc2JvbSA9IGpzb24ubG9hZChmKQorCisgIHdpdGggb3BlbihhcmdzLmxheW91dGxpYl9zYm9tLCAncmInKSBhcyBmOgorICAgIHNoYTEgPSBoYXNobGliLmZpbGVfZGlnZXN0KGYsICdzaGExJykKKworICBsYXlvdXRsaWJfc2JvbV9uYW1lc3BhY2UgPSBsYXlvdXRsaWJfc2JvbVtzYm9tX3dyaXRlcnMuUHJvcE5hbWVzLkRPQ1VNRU5UX05BTUVTUEFDRV0KKyAgZXh0ZXJuYWxfZG9jX3JlZiA9ICdEb2N1bWVudFJlZi1sYXlvdXRsaWInCisgIGRvYy5leHRlcm5hbF9yZWZzID0gWworICAgIHNib21fZGF0YS5Eb2N1bWVudEV4dGVybmFsUmVmZXJlbmNlKGV4dGVybmFsX2RvY19yZWYsIGxheW91dGxpYl9zYm9tX25hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmJ1NIQTE6IHtzaGExLmhleGRpZ2VzdCgpfScpXQorCisgIHJlc291cmNlX2ZpbGVfc3BkeGlkcyA9IFtdCisgIGZvciBmaWxlIGluIGxheW91dGxpYl9zYm9tW3Nib21fd3JpdGVycy5Qcm9wTmFtZXMuRklMRVNdOgorICAgIGlmIGZpbGVbc2JvbV93cml0ZXJzLlByb3BOYW1lcy5GSUxFX05BTUVdLnN0YXJ0c3dpdGgoJ2RhdGEvcmVzLycpOgorICAgICAgcmVzb3VyY2VfZmlsZV9zcGR4aWRzLmFwcGVuZChmaWxlW3Nib21fd3JpdGVycy5Qcm9wTmFtZXMuU1BEWElEXSkKKworICBkb2MucmVsYXRpb25zaGlwcyA9IFsKKyAgICBzYm9tX2RhdGEuUmVsYXRpb25zaGlwKHBhY2thZ2VfaWQsIHNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkNPTlRBSU5TLCBmaWxlX2lkKQorICBdCisgIGZvciBzcGR4aWQgaW4gcmVzb3VyY2VfZmlsZV9zcGR4aWRzOgorICAgIGRvYy5yZWxhdGlvbnNoaXBzLmFwcGVuZCgKKyAgICAgIHNib21fZGF0YS5SZWxhdGlvbnNoaXAoZmlsZV9pZCwgc2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuR0VORVJBVEVEX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYne2V4dGVybmFsX2RvY19yZWZ9OntzcGR4aWR9JykpCisKKyAgIyB3cml0ZSBzYm9tIGZpbGUKKyAgd2l0aCBvcGVuKGFyZ3Mub3V0cHV0X2ZpbGUsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKKyAgICBzYm9tX3dyaXRlcnMuSlNPTldyaXRlci53cml0ZShkb2MsIGYpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbigpCmRpZmYgLS1naXQgYS90b29scy9zYm9tL2dlbmVyYXRlLXNib20ucHkgYi90b29scy9zYm9tL2dlbmVyYXRlLXNib20ucHkKaW5kZXggMjQxNWY3ZS4uNzJmODk2YiAxMDA3NTUKLS0tIGEvdG9vbHMvc2JvbS9nZW5lcmF0ZS1zYm9tLnB5CisrKyBiL3Rvb2xzL3Nib20vZ2VuZXJhdGUtc2JvbS5weQpAQCAtODIsNiArODIsNDYgQEAKICAgJ3ZuZGtfcHJlYnVpbHRfc2hhcmVkJywKIF0KIAorVEhJUkRfUEFSVFlfSURFTlRJRklFUl9UWVBFUyA9IFsKKyAgICAjIFR5cGVzIGRlZmluZWQgaW4gbWV0YWRhdGFfZmlsZS5wcm90bworICAgICdHaXQnLAorICAgICdTVk4nLAorICAgICdIZycsCisgICAgJ0RhcmNzJywKKyAgICAnVkNTJywKKyAgICAnQXJjaGl2ZScsCisgICAgJ1ByZWJ1aWx0QnlBbHBoYWJldCcsCisgICAgJ0xvY2FsU291cmNlJywKKyAgICAnT3RoZXInLAorICAgICMgT1NWIGVjb3N5c3RlbXMgZGVmaW5lZCBhdCBodHRwczovL29zc2YuZ2l0aHViLmlvL29zdi1zY2hlbWEvI2FmZmVjdGVkcGFja2FnZS1maWVsZC4KKyAgICAnR28nLAorICAgICducG0nLAorICAgICdPU1MtRnV6eicsCisgICAgJ1B5UEknLAorICAgICdSdWJ5R2VtcycsCisgICAgJ2NyYXRlcy5pbycsCisgICAgJ0hhY2thZ2UnLAorICAgICdHSEMnLAorICAgICdQYWNrYWdpc3QnLAorICAgICdNYXZlbicsCisgICAgJ051R2V0JywKKyAgICAnTGludXgnLAorICAgICdEZWJpYW4nLAorICAgICdBbHBpbmUnLAorICAgICdIZXgnLAorICAgICdBbmRyb2lkJywKKyAgICAnR2l0SHViIEFjdGlvbnMnLAorICAgICdQdWInLAorICAgICdDb25hbkNlbnRlcicsCisgICAgJ1JvY2t5IExpbnV4JywKKyAgICAnQWxtYUxpbnV4JywKKyAgICAnQml0bmFtaScsCisgICAgJ1Bob3RvbiBPUycsCisgICAgJ0NSQU4nLAorICAgICdCaW9jb25kdWN0b3InLAorICAgICdTd2lmdFVSTCcKK10KKwogCiBkZWYgZ2V0X2FyZ3MoKToKICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQpAQCAtOTAsNiArMTMwLDcgQEAKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1tZXRhZGF0YScsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBTQk9NIG1ldGFkYXRhIGZpbGUgcGF0aC4nKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWJ1aWxkX3ZlcnNpb24nLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgYnVpbGQgdmVyc2lvbi4nKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByb2R1Y3RfbWZyJywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIHByb2R1Y3QgbWFudWZhY3R1cmVyLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbW9kdWxlX25hbWUnLCBoZWxwPSdUaGUgbW9kdWxlIG5hbWUuIElmIHNwZWNpZmllZCwgdGhlIGdlbmVyYXRlZCBTQk9NIGlzIGZvciB0aGUgbW9kdWxlLicpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tanNvbicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9J0dlbmVyYXRlZCBTQk9NIGZpbGUgaW4gU1BEWCBKU09OIGZvcm1hdCcpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdW5idW5kbGVkX2FwaycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9J0dlbmVyYXRlIFNCT00gZm9yIHVuYnVuZGxlZCBBUEtzJykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS11bmJ1bmRsZWRfYXBleCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9J0dlbmVyYXRlIFNCT00gZm9yIHVuYnVuZGxlZCBBUEVYcycpCkBAIC0xMDMsMjYgKzE0NCwxMiBAQAogICAgICAgcHJpbnQoaSkKIAogCi1kZWYgZW5jb2RlX2Zvcl9zcGR4aWQocyk6Ci0gICIiIlNpbXBsZSBlbmNvZGUgZm9yIHN0cmluZyB2YWx1ZXMgdXNlZCBpbiBTUERYSUQgd2hpY2ggdXNlcyB0aGUgY2hhcnNldCBvZiBBLVphLVowLTkuLSIiIgotICByZXN1bHQgPSAnJwotICBmb3IgYyBpbiBzOgotICAgIGlmIGMuaXNhbG51bSgpIG9yIGMgaW4gJy4tJzoKLSAgICAgIHJlc3VsdCArPSBjCi0gICAgZWxpZiBjIGluICdfQC8nOgotICAgICAgcmVzdWx0ICs9ICctJwotICAgIGVsc2U6Ci0gICAgICByZXN1bHQgKz0gJzB4JyArIGMuZW5jb2RlKCd1dGYtOCcpLmhleCgpCi0KLSAgcmV0dXJuIHJlc3VsdC5sc3RyaXAoJy0nKQotCi0KIGRlZiBuZXdfcGFja2FnZV9pZChwYWNrYWdlX25hbWUsIHR5cGUpOgotICByZXR1cm4gZidTUERYUmVmLXt0eXBlfS17ZW5jb2RlX2Zvcl9zcGR4aWQocGFja2FnZV9uYW1lKX0nCisgIHJldHVybiBmJ1NQRFhSZWYte3R5cGV9LXtzYm9tX2RhdGEuZW5jb2RlX2Zvcl9zcGR4aWQocGFja2FnZV9uYW1lKX0nCiAKIAogZGVmIG5ld19maWxlX2lkKGZpbGVfcGF0aCk6Ci0gIHJldHVybiBmJ1NQRFhSZWYte2VuY29kZV9mb3Jfc3BkeGlkKGZpbGVfcGF0aCl9JworICByZXR1cm4gZidTUERYUmVmLXtzYm9tX2RhdGEuZW5jb2RlX2Zvcl9zcGR4aWQoZmlsZV9wYXRoKX0nCiAKIAogZGVmIGNoZWNrc3VtKGZpbGVfcGF0aCk6CkBAIC0zMjAsNyArMzQ3LDcgQEAKICAgICAgIHNib21fY2hlY2tzdW0gPSBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS5zYm9tX3JlZi5jaGVja3N1bQogICAgICAgdXBzdHJlYW1fZWxlbWVudF9pZCA9IG1ldGFkYXRhX3Byb3RvLnRoaXJkX3BhcnR5LnNib21fcmVmLmVsZW1lbnRfaWQKICAgICAgIGlmIHNib21fdXJsIGFuZCBzYm9tX2NoZWNrc3VtIGFuZCB1cHN0cmVhbV9lbGVtZW50X2lkOgotICAgICAgICBkb2NfcmVmX2lkID0gZidEb2N1bWVudFJlZi17UEtHX1VQU1RSRUFNfS17ZW5jb2RlX2Zvcl9zcGR4aWQobmFtZSl9JworICAgICAgICBkb2NfcmVmX2lkID0gZidEb2N1bWVudFJlZi17UEtHX1VQU1RSRUFNfS17c2JvbV9kYXRhLmVuY29kZV9mb3Jfc3BkeGlkKG5hbWUpfScKICAgICAgICAgZXh0ZXJuYWxfZG9jX3JlZiA9IHNib21fZGF0YS5Eb2N1bWVudEV4dGVybmFsUmVmZXJlbmNlKGlkPWRvY19yZWZfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmk9c2JvbV91cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bT1zYm9tX2NoZWNrc3VtKQpAQCAtMzMyLDE0ICszNTksNiBAQAogICByZXR1cm4gZXh0ZXJuYWxfZG9jX3JlZiwgcGFja2FnZXMsIHJlbGF0aW9uc2hpcHMKIAogCi1kZWYgZ2VuZXJhdGVfcGFja2FnZV92ZXJpZmljYXRpb25fY29kZShmaWxlcyk6Ci0gIGNoZWNrc3VtcyA9IFtmaWxlLmNoZWNrc3VtIGZvciBmaWxlIGluIGZpbGVzXQotICBjaGVja3N1bXMuc29ydCgpCi0gIGggPSBoYXNobGliLnNoYTEoKQotICBoLnVwZGF0ZSgnJy5qb2luKGNoZWNrc3VtcykuZW5jb2RlKGVuY29kaW5nPSd1dGYtOCcpKQotICByZXR1cm4gaC5oZXhkaWdlc3QoKQotCi0KIGRlZiBzYXZlX3JlcG9ydChyZXBvcnRfZmlsZV9wYXRoLCByZXBvcnQpOgogICB3aXRoIG9wZW4ocmVwb3J0X2ZpbGVfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyByZXBvcnRfZmlsZToKICAgICBmb3IgdHlwZSwgaXNzdWVzIGluIHJlcG9ydC5pdGVtcygpOgpAQCAtMzY4LDYgKzM4NywyMCBAQAogICByZXR1cm4gVHJ1ZQogCiAKKyMgVmFsaWRhdGUgaWRlbnRpZmllcnMgaW4gYSBwYWNrYWdlJ3MgTUVUQURBVEEuCisjIDEpIE9ubHkga25vd24gaWRlbnRpZmllciB0eXBlIGlzIGFsbG93ZWQKKyMgMikgT25seSBvbmUgaWRlbnRpZmllcidzIHByaW1hcnlfc291cmNlIGNhbiBiZSB0cnVlCitkZWYgdmFsaWRhdGVfcGFja2FnZV9tZXRhZGF0YShtZXRhZGF0YV9maWxlX3BhdGgsIHBhY2thZ2VfbWV0YWRhdGEpOgorICBwcmltYXJ5X3NvdXJjZV9mb3VuZCA9IEZhbHNlCisgIGZvciBpZGVudGlmaWVyIGluIHBhY2thZ2VfbWV0YWRhdGEudGhpcmRfcGFydHkuaWRlbnRpZmllcjoKKyAgICBpZiBpZGVudGlmaWVyLnR5cGUgbm90IGluIFRISVJEX1BBUlRZX0lERU5USUZJRVJfVFlQRVM6CisgICAgICBzeXMuZXhpdChmJ1Vua25vd24gdmFsdWUgb2YgdGhpcmRfcGFydHkuaWRlbnRpZmllci50eXBlIGluIHttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBOiB7aWRlbnRpZmllci50eXBlfS4nKQorICAgIGlmIHByaW1hcnlfc291cmNlX2ZvdW5kIGFuZCBpZGVudGlmaWVyLnByaW1hcnlfc291cmNlOgorICAgICAgc3lzLmV4aXQoCisgICAgICAgIGYnRmllbGQgInByaW1hcnlfc291cmNlIiBpcyBzZXQgdG8gdHJ1ZSBpbiBtdWx0aXBsZSB0aGlyZF9wYXJ0eS5pZGVudGlmaWVyIGluIHttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBLicpCisgICAgcHJpbWFyeV9zb3VyY2VfZm91bmQgPSBpZGVudGlmaWVyLnByaW1hcnlfc291cmNlCisKKwogZGVmIHJlcG9ydF9tZXRhZGF0YV9maWxlKG1ldGFkYXRhX2ZpbGVfcGF0aCwgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIHJlcG9ydCk6CiAgIGlmIG1ldGFkYXRhX2ZpbGVfcGF0aDoKICAgICByZXBvcnRbSU5GT19NRVRBREFUQV9GT1VORF9GT1JfUEFDS0FHRV0uYXBwZW5kKApAQCAtMzgwLDYgKzQxMyw4IEBACiAgICAgd2l0aCBvcGVuKG1ldGFkYXRhX2ZpbGVfcGF0aCArICcvTUVUQURBVEEnLCAncnQnKSBhcyBmOgogICAgICAgdGV4dF9mb3JtYXQuUGFyc2UoZi5yZWFkKCksIHBhY2thZ2VfbWV0YWRhdGEpCiAKKyAgICB2YWxpZGF0ZV9wYWNrYWdlX21ldGFkYXRhKG1ldGFkYXRhX2ZpbGVfcGF0aCwgcGFja2FnZV9tZXRhZGF0YSkKKwogICAgIGlmIG5vdCBtZXRhZGF0YV9maWxlX3BhdGggaW4gbWV0YWRhdGFfZmlsZV9wcm90b3M6CiAgICAgICBtZXRhZGF0YV9maWxlX3Byb3Rvc1ttZXRhZGF0YV9maWxlX3BhdGhdID0gcGFja2FnZV9tZXRhZGF0YQogICAgICAgaWYgbm90IHBhY2thZ2VfbWV0YWRhdGEubmFtZToKQEAgLTQ0OSwxNiArNDg0LDI1IEBACiAgIGdsb2JhbCBtZXRhZGF0YV9maWxlX3Byb3RvcwogICBtZXRhZGF0YV9maWxlX3Byb3RvcyA9IHt9CiAKLSAgcHJvZHVjdF9wYWNrYWdlID0gc2JvbV9kYXRhLlBhY2thZ2UoaWQ9c2JvbV9kYXRhLlNQRFhJRF9QUk9EVUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPXNib21fZGF0YS5QQUNLQUdFX05BTUVfUFJPRFVDVCwKKyAgcHJvZHVjdF9wYWNrYWdlX2lkID0gc2JvbV9kYXRhLlNQRFhJRF9QUk9EVUNUCisgIHByb2R1Y3RfcGFja2FnZV9uYW1lID0gc2JvbV9kYXRhLlBBQ0tBR0VfTkFNRV9QUk9EVUNUCisgIGlmIGFyZ3MubW9kdWxlX25hbWU6CisgICAgIyBCdWlsZCBTQk9NIG9mIGEgbW9kdWxlIHNvIHVzZSB0aGUgbW9kdWxlIG5hbWUgaW5zdGVhZC4KKyAgICBwcm9kdWN0X3BhY2thZ2VfaWQgPSBmJ1NQRFhSZWYte3Nib21fZGF0YS5lbmNvZGVfZm9yX3NwZHhpZChhcmdzLm1vZHVsZV9uYW1lKX0nCisgICAgcHJvZHVjdF9wYWNrYWdlX25hbWUgPSBhcmdzLm1vZHVsZV9uYW1lCisgIHByb2R1Y3RfcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXByb2R1Y3RfcGFja2FnZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1wcm9kdWN0X3BhY2thZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249YXJncy5idWlsZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0nT3JnYW5pemF0aW9uOiAnICsgYXJncy5wcm9kdWN0X21mciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNfYW5hbHl6ZWQ9VHJ1ZSkKLQotICBkb2MgPSBzYm9tX2RhdGEuRG9jdW1lbnQobmFtZT1hcmdzLmJ1aWxkX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9ZidodHRwczovL3d3dy5nb29nbGUuY29tL3Nib20vc3BkeC9hbmRyb2lkL3thcmdzLmJ1aWxkX3ZlcnNpb259JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JzPVsnT3JnYW5pemF0aW9uOiAnICsgYXJncy5wcm9kdWN0X21mcl0pCisgIGRvY19uYW1lID0gYXJncy5idWlsZF92ZXJzaW9uCisgIGlmIGFyZ3MubW9kdWxlX25hbWU6CisgICAgZG9jX25hbWUgPSBmJ3thcmdzLmJ1aWxkX3ZlcnNpb259L3thcmdzLm1vZHVsZV9uYW1lfScKKyAgZG9jID0gc2JvbV9kYXRhLkRvY3VtZW50KG5hbWU9ZG9jX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9ZidodHRwczovL3d3dy5nb29nbGUuY29tL3Nib20vc3BkeC9hbmRyb2lkL3tkb2NfbmFtZX0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvcnM9WydPcmdhbml6YXRpb246ICcgKyBhcmdzLnByb2R1Y3RfbWZyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlcz1wcm9kdWN0X3BhY2thZ2VfaWQpCiAgIGlmIG5vdCBhcmdzLnVuYnVuZGxlZF9hcGV4OgogICAgIGRvYy5wYWNrYWdlcy5hcHBlbmQocHJvZHVjdF9wYWNrYWdlKQogCkBAIC00ODcsMjAgKzUzMSwzMiBAQAogICAgICAgcHJvZHVjdF9jb3B5X2ZpbGVzID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3Byb2R1Y3RfY29weV9maWxlcyddCiAgICAgICBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ10KICAgICAgIGJ1aWxkX291dHB1dF9wYXRoID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2J1aWxkX291dHB1dF9wYXRoJ10KKyAgICAgIGlzX3N0YXRpY19saWIgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnaXNfc3RhdGljX2xpYiddCiAKICAgICAgIGlmIG5vdCBpbnN0YWxsZWRfZmlsZV9oYXNfbWV0YWRhdGEoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIHJlcG9ydCk6CiAgICAgICAgIGNvbnRpbnVlCi0gICAgICBpZiBub3QgKG9zLnBhdGguaXNsaW5rKGJ1aWxkX291dHB1dF9wYXRoKSBvciBvcy5wYXRoLmlzZmlsZShidWlsZF9vdXRwdXRfcGF0aCkpOgorICAgICAgaWYgbm90IGlzX3N0YXRpY19saWIgYW5kIG5vdCAob3MucGF0aC5pc2xpbmsoYnVpbGRfb3V0cHV0X3BhdGgpIG9yIG9zLnBhdGguaXNmaWxlKGJ1aWxkX291dHB1dF9wYXRoKSk6CisgICAgICAgICMgSWdub3JlIG5vbi1leGlzdGluZyBzdGF0aWMgbGlicmFyeSBmaWxlcyBmb3Igbm93IHNpbmNlIHRoZXkgYXJlIG5vdCBzaGlwcGVkIG9uIGRldmljZXMuCiAgICAgICAgIHJlcG9ydFtJU1NVRV9JTlNUQUxMRURfRklMRV9OT1RfRVhJU1RdLmFwcGVuZChpbnN0YWxsZWRfZmlsZSkKICAgICAgICAgY29udGludWUKIAogICAgICAgZmlsZV9pZCA9IG5ld19maWxlX2lkKGluc3RhbGxlZF9maWxlKQotICAgICAgZG9jLmZpbGVzLmFwcGVuZCgKLSAgICAgICAgc2JvbV9kYXRhLkZpbGUoaWQ9ZmlsZV9pZCwgbmFtZT1pbnN0YWxsZWRfZmlsZSwgY2hlY2tzdW09Y2hlY2tzdW0oYnVpbGRfb3V0cHV0X3BhdGgpKSkKLSAgICAgIGlmIG5vdCBhcmdzLnVuYnVuZGxlZF9hcGV4OgotICAgICAgICBwcm9kdWN0X3BhY2thZ2UuZmlsZV9pZHMuYXBwZW5kKGZpbGVfaWQpCi0gICAgICBlbGlmIGxlbihkb2MuZmlsZXMpID4gMToKLSAgICAgICAgICBkb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGRvYy5maWxlc1swXS5pZCwgc2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuQ09OVEFJTlMsIGZpbGVfaWQpKQorICAgICAgIyBUT0RPKGIvMjg1NDUzNjY0KTogU29vbmcgc2hvdWxkIHJlcG9ydCB0aGUgaW5mb3JtYXRpb24gb2Ygc3RhdGljYWxseSBsaW5rZWQgbGlicmFyaWVzIHRvIE1ha2UuCisgICAgICAjIFRoaXMgaGFwcGVucyB3aGVuIGEgZGlmZmVyZW50IHNhbml0aXplZCB2ZXJzaW9uIG9mIHN0YXRpYyBsaWJyYXJpZXMgaXMgdXNlZCBpbiBsaW5raW5nLgorICAgICAgIyBBcyBhIHdvcmthcm91bmQsIHVzZSB0aGUgZm9sbG93aW5nIFNIQTEgY2hlY2tzdW0gZm9yIHN0YXRpYyBsaWJyYXJpZXMgY3JlYXRlZCBieSBTb29uZywgaWYgLmEgZmlsZXMgY291bGQgbm90IGJlCisgICAgICAjIGxvY2F0ZWQgY29ycmVjdGx5IGJlY2F1c2UgU29vbmcgZG9lc24ndCByZXBvcnQgdGhlIGluZm9ybWF0aW9uIHRvIE1ha2UuCisgICAgICBzaGExID0gJ1NIQTE6IGRhMzlhM2VlNWU2YjRiMGQzMjU1YmZlZjk1NjAxODkwYWZkODA3MDknICAjIFNIQTEgb2YgZW1wdHkgc3RyaW5nCisgICAgICBpZiBvcy5wYXRoLmlzbGluayhidWlsZF9vdXRwdXRfcGF0aCkgb3Igb3MucGF0aC5pc2ZpbGUoYnVpbGRfb3V0cHV0X3BhdGgpOgorICAgICAgICBzaGExID0gY2hlY2tzdW0oYnVpbGRfb3V0cHV0X3BhdGgpCisgICAgICBkb2MuZmlsZXMuYXBwZW5kKHNib21fZGF0YS5GaWxlKGlkPWZpbGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9aW5zdGFsbGVkX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtPXNoYTEpKQorCisgICAgICBpZiBub3QgaXNfc3RhdGljX2xpYjoKKyAgICAgICAgaWYgbm90IGFyZ3MudW5idW5kbGVkX2FwZXg6CisgICAgICAgICAgcHJvZHVjdF9wYWNrYWdlLmZpbGVfaWRzLmFwcGVuZChmaWxlX2lkKQorICAgICAgICBlbGlmIGxlbihkb2MuZmlsZXMpID4gMToKKyAgICAgICAgICAgIGRvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoZG9jLmZpbGVzWzBdLmlkLCBzYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5DT05UQUlOUywgZmlsZV9pZCkpCiAKICAgICAgIGlmIGlzX3NvdXJjZV9wYWNrYWdlKGluc3RhbGxlZF9maWxlX21ldGFkYXRhKSBvciBpc19wcmVidWlsdF9wYWNrYWdlKGluc3RhbGxlZF9maWxlX21ldGFkYXRhKToKICAgICAgICAgbWV0YWRhdGFfZmlsZV9wYXRoID0gZ2V0X21ldGFkYXRhX2ZpbGVfcGF0aChpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSkKQEAgLTU0NCwxMyArNjAwLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1zYm9tX2RhdGEuU1BEWElEX1BMQVRGT1JNKSkKIAotICBpZiBub3QgYXJncy51bmJ1bmRsZWRfYXBleDoKLSAgICBwcm9kdWN0X3BhY2thZ2UudmVyaWZpY2F0aW9uX2NvZGUgPSBnZW5lcmF0ZV9wYWNrYWdlX3ZlcmlmaWNhdGlvbl9jb2RlKGRvYy5maWxlcykKKyAgICAgICMgUHJvY2VzcyBzdGF0aWMgbGlicmFyaWVzIGFuZCB3aG9sZSBzdGF0aWMgbGlicmFyaWVzIHRoZSBpbnN0YWxsZWQgZmlsZSBsaW5rcyB0bworICAgICAgc3RhdGljX2xpYnMgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnc3RhdGljX2xpYnJhcmllcyddCisgICAgICB3aG9sZV9zdGF0aWNfbGlicyA9IGluc3RhbGxlZF9maWxlX21ldGFkYXRhWyd3aG9sZV9zdGF0aWNfbGlicmFyaWVzJ10KKyAgICAgIGFsbF9zdGF0aWNfbGlicyA9IChzdGF0aWNfbGlicyArICcgJyArIHdob2xlX3N0YXRpY19saWJzKS5zdHJpcCgpCisgICAgICBpZiBhbGxfc3RhdGljX2xpYnM6CisgICAgICAgIGZvciBsaWIgaW4gYWxsX3N0YXRpY19saWJzLnNwbGl0KCcgJyk6CisgICAgICAgICAgZG9jLmFkZF9yZWxhdGlvbnNoaXAoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9ZmlsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5TVEFUSUNfTElOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1uZXdfZmlsZV9pZChsaWIgKyAnLmEnKSkpCiAKICAgaWYgYXJncy51bmJ1bmRsZWRfYXBleDoKICAgICBkb2MuZGVzY3JpYmVzID0gZG9jLmZpbGVzWzBdLmlkCiAKICAgIyBTYXZlIFNCT00gcmVjb3JkcyB0byBvdXRwdXQgZmlsZQorICBkb2MuZ2VuZXJhdGVfcGFja2FnZXNfdmVyaWZpY2F0aW9uX2NvZGUoKQogICBkb2MuY3JlYXRlZCA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdyh0ej1kYXRldGltZS50aW1lem9uZS51dGMpLnN0cmZ0aW1lKCclWS0lbS0lZFQlSDolTTolU1onKQogICBwcmVmaXggPSBhcmdzLm91dHB1dF9maWxlCiAgIGlmIHByZWZpeC5lbmRzd2l0aCgnLnNwZHgnKToKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vc2JvbV9kYXRhLnB5IGIvdG9vbHMvc2JvbS9zYm9tX2RhdGEucHkKaW5kZXggMTRjNGViMi4uZmM1YzcwNCAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS9zYm9tX2RhdGEucHkKKysrIGIvdG9vbHMvc2JvbS9zYm9tX2RhdGEucHkKQEAgLTI1LDEwICsyNSwxMiBAQAogCiBmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MsIGZpZWxkCiBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAoraW1wb3J0IGhhc2hsaWIKIAogU1BEWElEX0RPQyA9ICdTUERYUmVmLURPQ1VNRU5UJwogU1BEWElEX1BST0RVQ1QgPSAnU1BEWFJlZi1QUk9EVUNUJwogU1BEWElEX1BMQVRGT1JNID0gJ1NQRFhSZWYtUExBVEZPUk0nCitTUERYSURfTElDRU5TRV9BUEFDSEUgPSAnTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAnCiAKIFBBQ0tBR0VfTkFNRV9QUk9EVUNUID0gJ1BST0RVQ1QnCiBQQUNLQUdFX05BTUVfUExBVEZPUk0gPSAnUExBVEZPUk0nCkBAIC00OSw3ICs1MSw3IEBACiAgIGNwZTIzVHlwZSA9ICdjcGUyM1R5cGUnCiAKIAotQGRhdGFjbGFzcworQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKIGNsYXNzIFBhY2thZ2VFeHRlcm5hbFJlZjoKICAgY2F0ZWdvcnk6IFBhY2thZ2VFeHRlcm5hbFJlZkNhdGVnb3J5CiAgIHR5cGU6IFBhY2thZ2VFeHRlcm5hbFJlZlR5cGUKQEAgLTY3LDYgKzY5LDcgQEAKICAgdmVyaWZpY2F0aW9uX2NvZGU6IHN0ciA9IE5vbmUKICAgZmlsZV9pZHM6IExpc3Rbc3RyXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICBleHRlcm5hbF9yZWZzOiBMaXN0W1BhY2thZ2VFeHRlcm5hbFJlZl0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKKyAgZGVjbGFyZWRfbGljZW5zZV9pZHM6IExpc3Rbc3RyXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogCiAKIEBkYXRhY2xhc3MKQEAgLTc0LDYgKzc3LDcgQEAKICAgaWQ6IHN0cgogICBuYW1lOiBzdHIKICAgY2hlY2tzdW06IHN0cgorICBjb25jbHVkZWRfbGljZW5zZV9pZHM6IExpc3Rbc3RyXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogCiAKIGNsYXNzIFJlbGF0aW9uc2hpcFR5cGU6CkBAIC04MSwyMiArODUsMzAgQEAKICAgVkFSSUFOVF9PRiA9ICdWQVJJQU5UX09GJwogICBHRU5FUkFURURfRlJPTSA9ICdHRU5FUkFURURfRlJPTScKICAgQ09OVEFJTlMgPSAnQ09OVEFJTlMnCisgIFNUQVRJQ19MSU5LID0gJ1NUQVRJQ19MSU5LJwogCiAKLUBkYXRhY2xhc3MKK0BkYXRhY2xhc3MoZnJvemVuPVRydWUpCiBjbGFzcyBSZWxhdGlvbnNoaXA6CiAgIGlkMTogc3RyCiAgIHJlbGF0aW9uc2hpcDogUmVsYXRpb25zaGlwVHlwZQogICBpZDI6IHN0cgogCiAKLUBkYXRhY2xhc3MKK0BkYXRhY2xhc3MoZnJvemVuPVRydWUpCiBjbGFzcyBEb2N1bWVudEV4dGVybmFsUmVmZXJlbmNlOgogICBpZDogc3RyCiAgIHVyaTogc3RyCiAgIGNoZWNrc3VtOiBzdHIKIAogCitAZGF0YWNsYXNzKGZyb3plbj1UcnVlKQorY2xhc3MgTGljZW5zZToKKyAgaWQ6IHN0cgorICB0ZXh0OiBzdHIKKyAgbmFtZTogc3RyCisKKwogQGRhdGFjbGFzcwogY2xhc3MgRG9jdW1lbnQ6CiAgIG5hbWU6IHN0cgpAQCAtMTA5LDE2ICsxMjEsNTMgQEAKICAgcGFja2FnZXM6IExpc3RbUGFja2FnZV0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgZmlsZXM6IExpc3RbRmlsZV0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgcmVsYXRpb25zaGlwczogTGlzdFtSZWxhdGlvbnNoaXBdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCisgIGxpY2Vuc2VzOiBMaXN0W0xpY2Vuc2VdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAKICAgZGVmIGFkZF9leHRlcm5hbF9yZWYoc2VsZiwgZXh0ZXJuYWxfcmVmKToKICAgICBpZiBub3QgYW55KGV4dGVybmFsX3JlZi51cmkgPT0gcmVmLnVyaSBmb3IgcmVmIGluIHNlbGYuZXh0ZXJuYWxfcmVmcyk6CiAgICAgICBzZWxmLmV4dGVybmFsX3JlZnMuYXBwZW5kKGV4dGVybmFsX3JlZikKIAogICBkZWYgYWRkX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSk6Ci0gICAgaWYgbm90IGFueShwYWNrYWdlLmlkID09IHAuaWQgZm9yIHAgaW4gc2VsZi5wYWNrYWdlcyk6CisgICAgcCA9IG5leHQoKHAgZm9yIHAgaW4gc2VsZi5wYWNrYWdlcyBpZiBwYWNrYWdlLmlkID09IHAuaWQpLCBOb25lKQorICAgIGlmIG5vdCBwOgogICAgICAgc2VsZi5wYWNrYWdlcy5hcHBlbmQocGFja2FnZSkKKyAgICBlbHNlOgorICAgICAgZm9yIGxpY2Vuc2VfaWQgaW4gcGFja2FnZS5kZWNsYXJlZF9saWNlbnNlX2lkczoKKyAgICAgICAgaWYgbGljZW5zZV9pZCBub3QgaW4gcC5kZWNsYXJlZF9saWNlbnNlX2lkczoKKyAgICAgICAgICBwLmRlY2xhcmVkX2xpY2Vuc2VfaWRzLmFwcGVuZChsaWNlbnNlX2lkKQogCiAgIGRlZiBhZGRfcmVsYXRpb25zaGlwKHNlbGYsIHJlbCk6CiAgICAgaWYgbm90IGFueShyZWwuaWQxID09IHIuaWQxIGFuZCByZWwuaWQyID09IHIuaWQyIGFuZCByZWwucmVsYXRpb25zaGlwID09IHIucmVsYXRpb25zaGlwCiAgICAgICAgICAgICAgICBmb3IgciBpbiBzZWxmLnJlbGF0aW9uc2hpcHMpOgogICAgICAgc2VsZi5yZWxhdGlvbnNoaXBzLmFwcGVuZChyZWwpCisKKyAgZGVmIGFkZF9saWNlbnNlKHNlbGYsIGxpY2Vuc2UpOgorICAgIGlmIG5vdCBhbnkobGljZW5zZS5pZCA9PSBsLmlkIGZvciBsIGluIHNlbGYubGljZW5zZXMpOgorICAgICAgc2VsZi5saWNlbnNlcy5hcHBlbmQobGljZW5zZSkKKworICBkZWYgZ2VuZXJhdGVfcGFja2FnZXNfdmVyaWZpY2F0aW9uX2NvZGUoc2VsZik6CisgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlczoKKyAgICAgIGlmIG5vdCBwYWNrYWdlLmZpbGVfaWRzOgorICAgICAgICBjb250aW51ZQorCisgICAgICBjaGVja3N1bXMgPSBbXQorICAgICAgZm9yIGZpbGUgaW4gc2VsZi5maWxlczoKKyAgICAgICAgaWYgZmlsZS5pZCBpbiBwYWNrYWdlLmZpbGVfaWRzOgorICAgICAgICAgIGNoZWNrc3Vtcy5hcHBlbmQoZmlsZS5jaGVja3N1bS5zcGxpdCgnOiAnKVsxXSkKKyAgICAgIGNoZWNrc3Vtcy5zb3J0KCkKKyAgICAgIGggPSBoYXNobGliLnNoYTEoKQorICAgICAgaC51cGRhdGUoJycuam9pbihjaGVja3N1bXMpLmVuY29kZShlbmNvZGluZz0ndXRmLTgnKSkKKyAgICAgIHBhY2thZ2UudmVyaWZpY2F0aW9uX2NvZGUgPSBoLmhleGRpZ2VzdCgpCisKK2RlZiBlbmNvZGVfZm9yX3NwZHhpZChzKToKKyAgIiIiU2ltcGxlIGVuY29kZSBmb3Igc3RyaW5nIHZhbHVlcyB1c2VkIGluIFNQRFhJRCB3aGljaCB1c2VzIHRoZSBjaGFyc2V0IG9mIEEtWmEtWjAtOS4tIiIiCisgIHJlc3VsdCA9ICcnCisgIGZvciBjIGluIHM6CisgICAgaWYgYy5pc2FsbnVtKCkgb3IgYyBpbiAnLi0nOgorICAgICAgcmVzdWx0ICs9IGMKKyAgICBlbGlmIGMgaW4gJ19ALyc6CisgICAgICByZXN1bHQgKz0gJy0nCisgICAgZWxzZToKKyAgICAgIHJlc3VsdCArPSAnMHgnICsgYy5lbmNvZGUoJ3V0Zi04JykuaGV4KCkKKworICByZXR1cm4gcmVzdWx0LmxzdHJpcCgnLScpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9zYm9tX2RhdGFfdGVzdC5weSBiL3Rvb2xzL3Nib20vc2JvbV9kYXRhX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5ODdjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Nib20vc2JvbV9kYXRhX3Rlc3QucHkKQEAgLTAsMCArMSwxODQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBoYXNobGliCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzYm9tX2RhdGEKKworQlVJTERfRklOR0VSX1BSSU5UID0gJ2J1aWxkX2Zpbmdlcl9wcmludCcKK1NVUFBMSUVSX0dPT0dMRSA9ICdPcmdhbml6YXRpb246IEdvb2dsZScKK1NVUFBMSUVSX1VQU1RSRUFNID0gJ09yZ2FuaXphdGlvbjogdXBzdHJlYW0nCisKK1NQRFhJRF9QUkVCVUlMVF9QQUNLQUdFMSA9ICdTUERYUmVmLVBSRUJVSUxULXBhY2thZ2UxJworU1BEWElEX1BSRUJVSUxUX1BBQ0tBR0UyID0gJ1NQRFhSZWYtUFJFQlVJTFQtcGFja2FnZTInCitTUERYSURfU09VUkNFX1BBQ0tBR0UxID0gJ1NQRFhSZWYtU09VUkNFLXBhY2thZ2UxJworU1BEWElEX1VQU1RSRUFNX1BBQ0tBR0UxID0gJ1NQRFhSZWYtVVBTVFJFQU0tcGFja2FnZTEnCisKK1NQRFhJRF9GSUxFMSA9ICdTUERYUmVmLWZpbGUxJworU1BEWElEX0ZJTEUyID0gJ1NQRFhSZWYtZmlsZTInCitTUERYSURfRklMRTMgPSAnU1BEWFJlZi1maWxlMycKK1NQRFhJRF9GSUxFNCA9ICdTUERYUmVmLWZpbGU0JworCitTUERYSURfTElDRU5TRTEgPSAiU1BEWFJlZi1MaWNlbnNlLTEiCitTUERYSURfTElDRU5TRTIgPSAiU1BEWFJlZi1MaWNlbnNlLTIiCisKKworY2xhc3MgU0JPTURhdGFUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgIyBTQk9NIG9mIGEgcHJvZHVjdAorICAgIHNlbGYuc2JvbV9kb2MgPSBzYm9tX2RhdGEuRG9jdW1lbnQobmFtZT0ndGVzdCBkb2MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSdodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2JvbS9zcGR4L2FuZHJvaWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvcnM9W1NVUFBMSUVSX0dPT0dMRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkPScyMDIzLTAzLTMxVDIyOjE3OjU4WicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliZXM9c2JvbV9kYXRhLlNQRFhJRF9QUk9EVUNUKQorICAgIHNlbGYuc2JvbV9kb2MuYWRkX2V4dGVybmFsX3JlZigKKyAgICAgICAgc2JvbV9kYXRhLkRvY3VtZW50RXh0ZXJuYWxSZWZlcmVuY2UoaWQ9J0RvY3VtZW50UmVmLWV4dGVybmFsX2RvY19yZWYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmk9J2V4dGVybmFsX2RvY191cmknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bT0nU0hBMTogMTIzNDU2Nzg5MCcpKQorICAgIHNlbGYuc2JvbV9kb2MuYWRkX3BhY2thZ2UoCisgICAgICAgIHNib21fZGF0YS5QYWNrYWdlKGlkPXNib21fZGF0YS5TUERYSURfUFJPRFVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1zYm9tX2RhdGEuUEFDS0FHRV9OQU1FX1BST0RVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9HT09HTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249QlVJTERfRklOR0VSX1BSSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc19hbmFseXplZD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZT0nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9pZHM9W1NQRFhJRF9GSUxFMSwgU1BEWElEX0ZJTEUyLCBTUERYSURfRklMRTMsIFNQRFhJRF9GSUxFNF0pKQorCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfcGFja2FnZSgKKyAgICAgICAgc2JvbV9kYXRhLlBhY2thZ2UoaWQ9c2JvbV9kYXRhLlNQRFhJRF9QTEFURk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1zYm9tX2RhdGEuUEFDS0FHRV9OQU1FX1BMQVRGT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIHNlbGYuc2JvbV9kb2MuYWRkX3BhY2thZ2UoCisgICAgICAgIHNib21fZGF0YS5QYWNrYWdlKGlkPVNQRFhJRF9QUkVCVUlMVF9QQUNLQUdFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nUHJlYnVpbHQgcGFja2FnZTEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIHNlbGYuc2JvbV9kb2MuYWRkX3BhY2thZ2UoCisgICAgICAgIHNib21fZGF0YS5QYWNrYWdlKGlkPVNQRFhJRF9TT1VSQ0VfUEFDS0FHRTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J1NvdXJjZSBwYWNrYWdlMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9HT09HTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249QlVJTERfRklOR0VSX1BSSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9yZWZzPVtzYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9c2JvbV9kYXRhLlBhY2thZ2VFeHRlcm5hbFJlZkNhdGVnb3J5LlNFQ1VSSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1zYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmVHlwZS5jcGUyMlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yPSdjcGU6L2E6anNvbmNwcF9wcm9qZWN0Ompzb25jcHA6MS45LjQnKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIHNlbGYuc2JvbV9kb2MuYWRkX3BhY2thZ2UoCisgICAgICAgIHNib21fZGF0YS5QYWNrYWdlKGlkPVNQRFhJRF9VUFNUUkVBTV9QQUNLQUdFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nVXBzdHJlYW0gcGFja2FnZTEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9VUFNUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0nMS4xJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICAgIHNlbGYuc2JvbV9kb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1TUERYSURfU09VUkNFX1BBQ0tBR0UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5WQVJJQU5UX09GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1TUERYSURfVVBTVFJFQU1fUEFDS0FHRTEpKQorCisgICAgc2VsZi5zYm9tX2RvYy5maWxlcy5hcHBlbmQoCisgICAgICAgIHNib21fZGF0YS5GaWxlKGlkPVNQRFhJRF9GSUxFMSwgbmFtZT0nL2Jpbi9maWxlMScsCisgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtPSdTSEExOiAzNTZhMTkyYjc5MTNiMDRjNTQ1NzRkMThjMjhkNDZlNjM5NTQyOGFiJykpICAjIHNoYTEgaGFzaCBvZiAxCisgICAgc2VsZi5zYm9tX2RvYy5maWxlcy5hcHBlbmQoCisgICAgICAgIHNib21fZGF0YS5GaWxlKGlkPVNQRFhJRF9GSUxFMiwgbmFtZT0nL2Jpbi9maWxlMicsCisgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtPSdTSEExOiBkYTRiOTIzN2JhY2NjZGYxOWMwNzYwY2FiN2FlYzRhODM1OTAxMGIwJykpICAjIHNoYTEgaGFzaCBvZiAyCisgICAgc2VsZi5zYm9tX2RvYy5maWxlcy5hcHBlbmQoCisgICAgICAgIHNib21fZGF0YS5GaWxlKGlkPVNQRFhJRF9GSUxFMywgbmFtZT0nL2Jpbi9maWxlMycsCisgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtPSdTSEExOiA3N2RlNjhkYWVjZDgyM2JhYmJiNThlZGIxYzhlMTRkNzEwNmU4M2JiJykpICAjIHNoYTEgaGFzaCBvZiAzCisgICAgc2VsZi5zYm9tX2RvYy5maWxlcy5hcHBlbmQoCisgICAgICAgIHNib21fZGF0YS5GaWxlKGlkPVNQRFhJRF9GSUxFNCwgbmFtZT0nZmlsZTQuYScsCisgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtPSdTSEExOiAxYjY0NTM4OTI0NzNhNDY3ZDA3MzcyZDQ1ZWIwNWFiYzIwMzE2NDdhJykpICAjIHNoYTEgb2YgNAorCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPVNQRFhJRF9GSUxFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuR0VORVJBVEVEX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPXNib21fZGF0YS5TUERYSURfUExBVEZPUk0pKQorICAgIHNlbGYuc2JvbV9kb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1TUERYSURfRklMRTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1TUERYSURfUFJFQlVJTFRfUEFDS0FHRTEpKQorICAgIHNlbGYuc2JvbV9kb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1TUERYSURfRklMRTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1TUERYSURfU09VUkNFX1BBQ0tBR0UxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICBzZWxmLnNib21fZG9jLmFkZF9yZWxhdGlvbnNoaXAoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9U1BEWElEX0ZJTEUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5TVEFUSUNfTElOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9U1BEWElEX0ZJTEU0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKworICBkZWYgdGVzdF9wYWNrYWdlX3ZlcmlmaWNhdGlvbl9jb2RlKHNlbGYpOgorICAgIGNoZWNrc3VtcyA9IFtdCisgICAgZm9yIGZpbGUgaW4gc2VsZi5zYm9tX2RvYy5maWxlczoKKyAgICAgIGNoZWNrc3Vtcy5hcHBlbmQoZmlsZS5jaGVja3N1bS5zcGxpdCgnOiAnKVsxXSkKKyAgICAgIGNoZWNrc3Vtcy5zb3J0KCkKKyAgICBoID0gaGFzaGxpYi5zaGExKCkKKyAgICBoLnVwZGF0ZSgnJy5qb2luKGNoZWNrc3VtcykuZW5jb2RlKGVuY29kaW5nPSd1dGYtOCcpKQorICAgIGV4cGVjdGVkX3BhY2thZ2VfdmVyaWZpY2F0aW9uX2NvZGUgPSBoLmhleGRpZ2VzdCgpCisKKyAgICBzZWxmLnNib21fZG9jLmdlbmVyYXRlX3BhY2thZ2VzX3ZlcmlmaWNhdGlvbl9jb2RlKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3BhY2thZ2VfdmVyaWZpY2F0aW9uX2NvZGUsIHNlbGYuc2JvbV9kb2MucGFja2FnZXNbMF0udmVyaWZpY2F0aW9uX2NvZGUpCisKKyAgZGVmIHRlc3RfYWRkX3BhY2thZ2VfKHNlbGYpOgorICAgIHNlbGYuc2JvbV9kb2MuYWRkX3BhY2thZ2Uoc2JvbV9kYXRhLlBhY2thZ2UoaWQ9U1BEWElEX1BSRUJVSUxUX1BBQ0tBR0UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nUHJlYnVpbHQgcGFja2FnZTInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9HT09HTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgcCA9IG5leHQoKHAgZm9yIHAgaW4gc2VsZi5zYm9tX2RvYy5wYWNrYWdlcyBpZiBwLmlkID09IFNQRFhJRF9QUkVCVUlMVF9QQUNLQUdFMiksIE5vbmUpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwLCBOb25lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5kZWNsYXJlZF9saWNlbnNlX2lkcywgW10pCisKKyAgICAjIEFkZCBzYW1lIHBhY2thZ2Ugd2l0aCBsaWNlbnNlIDEKKyAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKHNib21fZGF0YS5QYWNrYWdlKGlkPVNQRFhJRF9QUkVCVUlMVF9QQUNLQUdFMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J1ByZWJ1aWx0IHBhY2thZ2UyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1CVUlMRF9GSU5HRVJfUFJJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZF9saWNlbnNlX2lkcz1bU1BEWElEX0xJQ0VOU0UxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHAuZGVjbGFyZWRfbGljZW5zZV9pZHMsIFtTUERYSURfTElDRU5TRTFdKQorCisgICAgIyBBZGQgc2FtZSBwYWNrYWdlIHdpdGggbGljZW5zZSAyCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfcGFja2FnZShzYm9tX2RhdGEuUGFja2FnZShpZD1TUERYSURfUFJFQlVJTFRfUEFDS0FHRTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdQcmVidWlsdCBwYWNrYWdlMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPVNVUFBMSUVSX0dPT0dMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249QlVJTERfRklOR0VSX1BSSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRfbGljZW5zZV9pZHM9W1NQRFhJRF9MSUNFTlNFMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwLmRlY2xhcmVkX2xpY2Vuc2VfaWRzLCBbU1BEWElEX0xJQ0VOU0UxLCBTUERYSURfTElDRU5TRTJdKQorCisgICAgIyBBZGQgc2FtZSBwYWNrYWdlIHdpdGggbGljZW5zZSAyIGFnYWluCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfcGFja2FnZShzYm9tX2RhdGEuUGFja2FnZShpZD1TUERYSURfUFJFQlVJTFRfUEFDS0FHRTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdQcmVidWlsdCBwYWNrYWdlMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPVNVUFBMSUVSX0dPT0dMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249QlVJTERfRklOR0VSX1BSSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRfbGljZW5zZV9pZHM9W1NQRFhJRF9MSUNFTlNFMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwLmRlY2xhcmVkX2xpY2Vuc2VfaWRzLCBbU1BEWElEX0xJQ0VOU0UxLCBTUERYSURfTElDRU5TRTJdKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS90b29scy9zYm9tL3Nib21fd3JpdGVycy5weSBiL3Rvb2xzL3Nib20vc2JvbV93cml0ZXJzLnB5CmluZGV4IDg1ZGVlOWQuLjI2YjNjNTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Nib20vc2JvbV93cml0ZXJzLnB5CisrKyBiL3Rvb2xzL3Nib20vc2JvbV93cml0ZXJzLnB5CkBAIC02NCw2ICs2NCwxMSBAQAogICAjIFJlbGF0aW9uc2hpcAogICBSRUxBVElPTlNISVAgPSAnUmVsYXRpb25zaGlwJwogCisgICMgTGljZW5zZQorICBMSUNFTlNFX0lEID0gJ0xpY2Vuc2VJRCcKKyAgTElDRU5TRV9OQU1FID0gJ0xpY2Vuc2VOYW1lJworICBMSUNFTlNFX0VYVFJBQ1RFRF9URVhUID0gJ0V4dHJhY3RlZFRleHQnCisKIAogY2xhc3MgVGFnVmFsdWVXcml0ZXI6CiAgIEBzdGF0aWNtZXRob2QKQEAgLTg1LDcgKzkwLDcgQEAKICAgICByZXR1cm4gaGVhZGVycwogCiAgIEBzdGF0aWNtZXRob2QKLSAgZGVmIG1hcnNoYWxfcGFja2FnZShwYWNrYWdlKToKKyAgZGVmIG1hcnNoYWxfcGFja2FnZShzYm9tX2RvYywgcGFja2FnZSwgZnJhZ21lbnQpOgogICAgIGRvd25sb2FkX2xvY2F0aW9uID0gc2JvbV9kYXRhLlZBTFVFX05PQVNTRVJUSU9OCiAgICAgaWYgcGFja2FnZS5kb3dubG9hZF9sb2NhdGlvbjoKICAgICAgIGRvd25sb2FkX2xvY2F0aW9uID0gcGFja2FnZS5kb3dubG9hZF9sb2NhdGlvbgpAQCAtOTksNiArMTA0LDEyIEBACiAgICAgICB0YWd2YWx1ZXMuYXBwZW5kKGYne1RhZ3MuUEFDS0FHRV9WRVJTSU9OfToge3BhY2thZ2UudmVyc2lvbn0nKQogICAgIGlmIHBhY2thZ2Uuc3VwcGxpZXI6CiAgICAgICB0YWd2YWx1ZXMuYXBwZW5kKGYne1RhZ3MuUEFDS0FHRV9TVVBQTElFUn06IHtwYWNrYWdlLnN1cHBsaWVyfScpCisKKyAgICBsaWNlbnNlID0gc2JvbV9kYXRhLlZBTFVFX05PQVNTRVJUSU9OCisgICAgaWYgcGFja2FnZS5kZWNsYXJlZF9saWNlbnNlX2lkczoKKyAgICAgIGxpY2Vuc2UgPSAnIE9SICcuam9pbihwYWNrYWdlLmRlY2xhcmVkX2xpY2Vuc2VfaWRzKQorICAgIHRhZ3ZhbHVlcy5hcHBlbmQoZid7VGFncy5QQUNLQUdFX0xJQ0VOU0VfREVDTEFSRUR9OiB7bGljZW5zZX0nKQorCiAgICAgaWYgcGFja2FnZS52ZXJpZmljYXRpb25fY29kZToKICAgICAgIHRhZ3ZhbHVlcy5hcHBlbmQoZid7VGFncy5QQUNLQUdFX1ZFUklGSUNBVElPTl9DT0RFfToge3BhY2thZ2UudmVyaWZpY2F0aW9uX2NvZGV9JykKICAgICBpZiBwYWNrYWdlLmV4dGVybmFsX3JlZnM6CkBAIC0xMDcsNTAgKzExOCwzMiBAQAogICAgICAgICAgIGYne1RhZ3MuUEFDS0FHRV9FWFRFUk5BTF9SRUZ9OiB7ZXh0ZXJuYWxfcmVmLmNhdGVnb3J5fSB7ZXh0ZXJuYWxfcmVmLnR5cGV9IHtleHRlcm5hbF9yZWYubG9jYXRvcn0nKQogCiAgICAgdGFndmFsdWVzLmFwcGVuZCgnJykKKworICAgIGlmIHBhY2thZ2UuaWQgPT0gc2JvbV9kb2MuZGVzY3JpYmVzIGFuZCBub3QgZnJhZ21lbnQ6CisgICAgICB0YWd2YWx1ZXMuYXBwZW5kKAorICAgICAgICAgIGYne1RhZ3MuUkVMQVRJT05TSElQfToge3Nib21fZG9jLmlkfSB7c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuREVTQ1JJQkVTfSB7c2JvbV9kb2MuZGVzY3JpYmVzfScpCisgICAgICB0YWd2YWx1ZXMuYXBwZW5kKCcnKQorCisgICAgZm9yIGZpbGUgaW4gc2JvbV9kb2MuZmlsZXM6CisgICAgICBpZiBmaWxlLmlkIGluIHBhY2thZ2UuZmlsZV9pZHM6CisgICAgICAgIHRhZ3ZhbHVlcyArPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX2ZpbGUoZmlsZSkKKwogICAgIHJldHVybiB0YWd2YWx1ZXMKIAogICBAc3RhdGljbWV0aG9kCi0gIGRlZiBtYXJzaGFsX2Rlc2NyaWJlZF9lbGVtZW50KHNib21fZG9jLCBmcmFnbWVudCk6Ci0gICAgaWYgbm90IHNib21fZG9jLmRlc2NyaWJlczoKLSAgICAgIHJldHVybiBOb25lCi0KLSAgICBwcm9kdWN0X3BhY2thZ2UgPSBbcCBmb3IgcCBpbiBzYm9tX2RvYy5wYWNrYWdlcyBpZiBwLmlkID09IHNib21fZG9jLmRlc2NyaWJlc10KLSAgICBpZiBwcm9kdWN0X3BhY2thZ2U6Ci0gICAgICB0YWd2YWx1ZXMgPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX3BhY2thZ2UocHJvZHVjdF9wYWNrYWdlWzBdKQotICAgICAgaWYgbm90IGZyYWdtZW50OgotICAgICAgICB0YWd2YWx1ZXMuYXBwZW5kKAotICAgICAgICAgICAgZid7VGFncy5SRUxBVElPTlNISVB9OiB7c2JvbV9kb2MuaWR9IHtzYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5ERVNDUklCRVN9IHtzYm9tX2RvYy5kZXNjcmliZXN9JykKLQotICAgICAgdGFndmFsdWVzLmFwcGVuZCgnJykKLSAgICAgIHJldHVybiB0YWd2YWx1ZXMKLQotICAgIGZpbGUgPSBbZiBmb3IgZiBpbiBzYm9tX2RvYy5maWxlcyBpZiBmLmlkID09IHNib21fZG9jLmRlc2NyaWJlc10KLSAgICBpZiBmaWxlOgotICAgICAgdGFndmFsdWVzID0gVGFnVmFsdWVXcml0ZXIubWFyc2hhbF9maWxlKGZpbGVbMF0pCi0gICAgICBpZiBub3QgZnJhZ21lbnQ6Ci0gICAgICAgIHRhZ3ZhbHVlcy5hcHBlbmQoCi0gICAgICAgICAgICBmJ3tUYWdzLlJFTEFUSU9OU0hJUH06IHtzYm9tX2RvYy5pZH0ge3Nib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkRFU0NSSUJFU30ge3Nib21fZG9jLmRlc2NyaWJlc30nKQotCi0gICAgICByZXR1cm4gdGFndmFsdWVzCi0KLSAgICByZXR1cm4gTm9uZQotCi0gIEBzdGF0aWNtZXRob2QKLSAgZGVmIG1hcnNoYWxfcGFja2FnZXMoc2JvbV9kb2MpOgorICBkZWYgbWFyc2hhbF9wYWNrYWdlcyhzYm9tX2RvYywgZnJhZ21lbnQpOgogICAgIHRhZ3ZhbHVlcyA9IFtdCiAgICAgbWFyc2hhbGVkX3JlbGF0aW9uc2hpcHMgPSBbXQogICAgIGkgPSAwCiAgICAgcGFja2FnZXMgPSBzYm9tX2RvYy5wYWNrYWdlcwogICAgIHdoaWxlIGkgPCBsZW4ocGFja2FnZXMpOgotICAgICAgaWYgcGFja2FnZXNbaV0uaWQgPT0gc2JvbV9kb2MuZGVzY3JpYmVzOgotICAgICAgICBpICs9IDEKLSAgICAgICAgY29udGludWUKLQotICAgICAgaWYgaSArIDEgPCBsZW4ocGFja2FnZXMpIFwKLSAgICAgICAgICBhbmQgcGFja2FnZXNbaV0uaWQuc3RhcnRzd2l0aCgnU1BEWFJlZi1TT1VSQ0UtJykgXAotICAgICAgICAgIGFuZCBwYWNrYWdlc1tpICsgMV0uaWQuc3RhcnRzd2l0aCgnU1BEWFJlZi1VUFNUUkVBTS0nKToKLSAgICAgICAgdGFndmFsdWVzICs9IFRhZ1ZhbHVlV3JpdGVyLm1hcnNoYWxfcGFja2FnZShwYWNrYWdlc1tpXSkKLSAgICAgICAgdGFndmFsdWVzICs9IFRhZ1ZhbHVlV3JpdGVyLm1hcnNoYWxfcGFja2FnZShwYWNrYWdlc1tpICsgMV0pCisgICAgICBpZiAoaSArIDEgPCBsZW4ocGFja2FnZXMpCisgICAgICAgICAgYW5kIHBhY2thZ2VzW2ldLmlkLnN0YXJ0c3dpdGgoJ1NQRFhSZWYtU09VUkNFLScpCisgICAgICAgICAgYW5kIHBhY2thZ2VzW2kgKyAxXS5pZC5zdGFydHN3aXRoKCdTUERYUmVmLVVQU1RSRUFNLScpKToKKyAgICAgICAgIyBPdXRwdXQgU09VUkNFLCBVUFNUUkVBTSBwYWNrYWdlcyBhbmQgdGhlaXIgVkFSSUFOVF9PRiByZWxhdGlvbnNoaXAgdG9nZXRoZXIsIHNvIHRoZXkgYXJlIGNsb3NlIHRvIGVhY2ggb3RoZXIKKyAgICAgICAgIyBpbiBTQk9NcyBpbiB0YWd2YWx1ZSBmb3JtYXQuCisgICAgICAgIHRhZ3ZhbHVlcyArPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX3BhY2thZ2Uoc2JvbV9kb2MsIHBhY2thZ2VzW2ldLCBmcmFnbWVudCkKKyAgICAgICAgdGFndmFsdWVzICs9IFRhZ1ZhbHVlV3JpdGVyLm1hcnNoYWxfcGFja2FnZShzYm9tX2RvYywgcGFja2FnZXNbaSArIDFdLCBmcmFnbWVudCkKICAgICAgICAgcmVsID0gbmV4dCgociBmb3IgciBpbiBzYm9tX2RvYy5yZWxhdGlvbnNoaXBzIGlmCiAgICAgICAgICAgICAgICAgICAgIHIuaWQxID09IHBhY2thZ2VzW2ldLmlkIGFuZAogICAgICAgICAgICAgICAgICAgICByLmlkMiA9PSBwYWNrYWdlc1tpICsgMV0uaWQgYW5kCkBAIC0xNjIsNyArMTU1LDcgQEAKIAogICAgICAgICBpICs9IDIKICAgICAgIGVsc2U6Ci0gICAgICAgIHRhZ3ZhbHVlcyArPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX3BhY2thZ2UocGFja2FnZXNbaV0pCisgICAgICAgIHRhZ3ZhbHVlcyArPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX3BhY2thZ2Uoc2JvbV9kb2MsIHBhY2thZ2VzW2ldLCBmcmFnbWVudCkKICAgICAgICAgaSArPSAxCiAKICAgICByZXR1cm4gdGFndmFsdWVzLCBtYXJzaGFsZWRfcmVsYXRpb25zaGlwcwpAQCAtMTczLDE4ICsxNjYsMzAgQEAKICAgICAgIGYne1RhZ3MuRklMRV9OQU1FfToge2ZpbGUubmFtZX0nLAogICAgICAgZid7VGFncy5TUERYSUR9OiB7ZmlsZS5pZH0nLAogICAgICAgZid7VGFncy5GSUxFX0NIRUNLU1VNfToge2ZpbGUuY2hlY2tzdW19JywKLSAgICAgICcnLAogICAgIF0KKyAgICBsaWNlbnNlID0gc2JvbV9kYXRhLlZBTFVFX05PQVNTRVJUSU9OCisgICAgaWYgZmlsZS5jb25jbHVkZWRfbGljZW5zZV9pZHM6CisgICAgICBsaWNlbnNlID0gJyBPUiAnLmpvaW4oZmlsZS5jb25jbHVkZWRfbGljZW5zZV9pZHMpCisgICAgdGFndmFsdWVzLmFwcGVuZChmJ3tUYWdzLkZJTEVfTElDRU5TRV9DT05DTFVERUR9OiB7bGljZW5zZX0nKQorICAgIHRhZ3ZhbHVlcy5hcHBlbmQoJycpCiAKICAgICByZXR1cm4gdGFndmFsdWVzCiAKICAgQHN0YXRpY21ldGhvZAotICBkZWYgbWFyc2hhbF9maWxlcyhzYm9tX2RvYyk6CisgIGRlZiBtYXJzaGFsX2ZpbGVzKHNib21fZG9jLCBmcmFnbWVudCk6CiAgICAgdGFndmFsdWVzID0gW10KKyAgICBmaWxlc19pbl9wYWNrYWdlcyA9IFtdCisgICAgZm9yIHBhY2thZ2UgaW4gc2JvbV9kb2MucGFja2FnZXM6CisgICAgICBmaWxlc19pbl9wYWNrYWdlcyArPSBwYWNrYWdlLmZpbGVfaWRzCiAgICAgZm9yIGZpbGUgaW4gc2JvbV9kb2MuZmlsZXM6Ci0gICAgICBpZiBmaWxlLmlkID09IHNib21fZG9jLmRlc2NyaWJlczoKKyAgICAgIGlmIGZpbGUuaWQgaW4gZmlsZXNfaW5fcGFja2FnZXM6CiAgICAgICAgIGNvbnRpbnVlCiAgICAgICB0YWd2YWx1ZXMgKz0gVGFnVmFsdWVXcml0ZXIubWFyc2hhbF9maWxlKGZpbGUpCisgICAgICBpZiBmaWxlLmlkID09IHNib21fZG9jLmRlc2NyaWJlcyBhbmQgbm90IGZyYWdtZW50OgorICAgICAgICAjIEZyYWdtZW50IGlzIG5vdCBhIGZ1bGwgU0JPTSBkb2N1bWVudCBzbyB0aGUgcmVsYXRpb25zaGlwIERFU0NSSUJFUyBpcyBub3QgYXBwbGljYWJsZS4KKyAgICAgICAgdGFndmFsdWVzLmFwcGVuZCgKKyAgICAgICAgICAgIGYne1RhZ3MuUkVMQVRJT05TSElQfToge3Nib21fZG9jLmlkfSB7c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuREVTQ1JJQkVTfSB7c2JvbV9kb2MuZGVzY3JpYmVzfScpCisgICAgICAgIHRhZ3ZhbHVlcy5hcHBlbmQoJycpCiAgICAgcmV0dXJuIHRhZ3ZhbHVlcwogCiAgIEBzdGF0aWNtZXRob2QKQEAgLTIwNCwxNyArMjA5LDMxIEBACiAgICAgcmV0dXJuIHRhZ3ZhbHVlcwogCiAgIEBzdGF0aWNtZXRob2QKKyAgZGVmIG1hcnNoYWxfbGljZW5zZShsaWNlbnNlKToKKyAgICB0YWd2YWx1ZXMgPSBbXQorICAgIHRhZ3ZhbHVlcy5hcHBlbmQoZid7VGFncy5MSUNFTlNFX0lEfToge2xpY2Vuc2UuaWR9JykKKyAgICB0YWd2YWx1ZXMuYXBwZW5kKGYne1RhZ3MuTElDRU5TRV9OQU1FfToge2xpY2Vuc2UubmFtZX0nKQorICAgIHRhZ3ZhbHVlcy5hcHBlbmQoZid7VGFncy5MSUNFTlNFX0VYVFJBQ1RFRF9URVhUfTogPHRleHQ+e2xpY2Vuc2UudGV4dH08L3RleHQ+JykKKyAgICByZXR1cm4gdGFndmFsdWVzCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgbWFyc2hhbF9saWNlbnNlcyhzYm9tX2RvYyk6CisgICAgdGFndmFsdWVzID0gW10KKyAgICBmb3IgbGljZW5zZSBpbiBzYm9tX2RvYy5saWNlbnNlczoKKyAgICAgIHRhZ3ZhbHVlcyArPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX2xpY2Vuc2UobGljZW5zZSkKKyAgICAgIHRhZ3ZhbHVlcy5hcHBlbmQoJycpCisgICAgcmV0dXJuIHRhZ3ZhbHVlcworCisgIEBzdGF0aWNtZXRob2QKICAgZGVmIHdyaXRlKHNib21fZG9jLCBmaWxlLCBmcmFnbWVudD1GYWxzZSk6CiAgICAgY29udGVudCA9IFtdCiAgICAgaWYgbm90IGZyYWdtZW50OgogICAgICAgY29udGVudCArPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX2RvY19oZWFkZXJzKHNib21fZG9jKQotICAgIGRlc2NyaWJlZF9lbGVtZW50ID0gVGFnVmFsdWVXcml0ZXIubWFyc2hhbF9kZXNjcmliZWRfZWxlbWVudChzYm9tX2RvYywgZnJhZ21lbnQpCi0gICAgaWYgZGVzY3JpYmVkX2VsZW1lbnQ6Ci0gICAgICBjb250ZW50ICs9IGRlc2NyaWJlZF9lbGVtZW50Ci0gICAgY29udGVudCArPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX2ZpbGVzKHNib21fZG9jKQotICAgIHRhZ3ZhbHVlcywgbWFyc2hhbGVkX3JlbGF0aW9uc2hpcHMgPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX3BhY2thZ2VzKHNib21fZG9jKQorICAgIGNvbnRlbnQgKz0gVGFnVmFsdWVXcml0ZXIubWFyc2hhbF9maWxlcyhzYm9tX2RvYywgZnJhZ21lbnQpCisgICAgdGFndmFsdWVzLCBtYXJzaGFsZWRfcmVsYXRpb25zaGlwcyA9IFRhZ1ZhbHVlV3JpdGVyLm1hcnNoYWxfcGFja2FnZXMoc2JvbV9kb2MsIGZyYWdtZW50KQogICAgIGNvbnRlbnQgKz0gdGFndmFsdWVzCiAgICAgY29udGVudCArPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX3JlbGF0aW9uc2hpcHMoc2JvbV9kb2MsIG1hcnNoYWxlZF9yZWxhdGlvbnNoaXBzKQorICAgIGNvbnRlbnQgKz0gVGFnVmFsdWVXcml0ZXIubWFyc2hhbF9saWNlbnNlcyhzYm9tX2RvYykKICAgICBmaWxlLndyaXRlKCdcbicuam9pbihjb250ZW50KSkKIAogCkBAIC0yNDksMTEgKzI2OCwxMyBAQAogICBQQUNLQUdFX0VYVEVSTkFMX1JFRl9UWVBFID0gJ3JlZmVyZW5jZVR5cGUnCiAgIFBBQ0tBR0VfRVhURVJOQUxfUkVGX0xPQ0FUT1IgPSAncmVmZXJlbmNlTG9jYXRvcicKICAgUEFDS0FHRV9IQVNfRklMRVMgPSAnaGFzRmlsZXMnCisgIFBBQ0tBR0VfTElDRU5TRV9ERUNMQVJFRCA9ICdsaWNlbnNlRGVjbGFyZWQnCiAKICAgIyBGaWxlCiAgIEZJTEVTID0gJ2ZpbGVzJwogICBGSUxFX05BTUUgPSAnZmlsZU5hbWUnCiAgIEZJTEVfQ0hFQ0tTVU1TID0gJ2NoZWNrc3VtcycKKyAgRklMRV9MSUNFTlNFX0NPTkNMVURFRCA9ICdsaWNlbnNlQ29uY2x1ZGVkJwogCiAgICMgUmVsYXRpb25zaGlwCiAgIFJFTEFUSU9OU0hJUFMgPSAncmVsYXRpb25zaGlwcycKQEAgLTI2MSw2ICsyODIsMTIgQEAKICAgUkVMX1JFTEFURURfRUxFTUVOVF9JRCA9ICdyZWxhdGVkU3BkeEVsZW1lbnQnCiAgIFJFTF9UWVBFID0gJ3JlbGF0aW9uc2hpcFR5cGUnCiAKKyAgIyBMaWNlbnNlCisgIExJQ0VOU0VTID0gJ2hhc0V4dHJhY3RlZExpY2Vuc2luZ0luZm9zJworICBMSUNFTlNFX0lEID0gJ2xpY2Vuc2VJZCcKKyAgTElDRU5TRV9OQU1FID0gJ25hbWUnCisgIExJQ0VOU0VfRVhUUkFDVEVEX1RFWFQgPSAnZXh0cmFjdGVkVGV4dCcKKwogCiBjbGFzcyBKU09OV3JpdGVyOgogICBAc3RhdGljbWV0aG9kCkBAIC0zMDcsNiArMzM0LDkgQEAKICAgICAgICAgcGFja2FnZVtQcm9wTmFtZXMuUEFDS0FHRV9WRVJTSU9OXSA9IHAudmVyc2lvbgogICAgICAgaWYgcC5zdXBwbGllcjoKICAgICAgICAgcGFja2FnZVtQcm9wTmFtZXMuUEFDS0FHRV9TVVBQTElFUl0gPSBwLnN1cHBsaWVyCisgICAgICBwYWNrYWdlW1Byb3BOYW1lcy5QQUNLQUdFX0xJQ0VOU0VfREVDTEFSRURdID0gc2JvbV9kYXRhLlZBTFVFX05PQVNTRVJUSU9OCisgICAgICBpZiBwLmRlY2xhcmVkX2xpY2Vuc2VfaWRzOgorICAgICAgICBwYWNrYWdlW1Byb3BOYW1lcy5QQUNLQUdFX0xJQ0VOU0VfREVDTEFSRURdID0gJyBPUiAnLmpvaW4ocC5kZWNsYXJlZF9saWNlbnNlX2lkcykKICAgICAgIGlmIHAudmVyaWZpY2F0aW9uX2NvZGU6CiAgICAgICAgIHBhY2thZ2VbUHJvcE5hbWVzLlBBQ0tBR0VfVkVSSUZJQ0FUSU9OX0NPREVdID0gewogICAgICAgICAgIFByb3BOYW1lcy5QQUNLQUdFX1ZFUklGSUNBVElPTl9DT0RFX1ZBTFVFOiBwLnZlcmlmaWNhdGlvbl9jb2RlCkBAIC0zNDIsNiArMzcyLDkgQEAKICAgICAgICAgUHJvcE5hbWVzLkFMR09SSVRITTogY2hlY2tzdW1bMF0sCiAgICAgICAgIFByb3BOYW1lcy5DSEVDS1NVTV9WQUxVRTogY2hlY2tzdW1bMV0sCiAgICAgICB9XQorICAgICAgZmlsZVtQcm9wTmFtZXMuRklMRV9MSUNFTlNFX0NPTkNMVURFRF0gPSBzYm9tX2RhdGEuVkFMVUVfTk9BU1NFUlRJT04KKyAgICAgIGlmIGYuY29uY2x1ZGVkX2xpY2Vuc2VfaWRzOgorICAgICAgICBmaWxlW1Byb3BOYW1lcy5GSUxFX0xJQ0VOU0VfQ09OQ0xVREVEXSA9ICcgT1IgJy5qb2luKGYuY29uY2x1ZGVkX2xpY2Vuc2VfaWRzKQogICAgICAgZmlsZXMuYXBwZW5kKGZpbGUpCiAgICAgcmV0dXJuIHtQcm9wTmFtZXMuRklMRVM6IGZpbGVzfQogCkBAIC0zNjAsMTAgKzM5MywyMiBAQAogICAgIHJldHVybiB7UHJvcE5hbWVzLlJFTEFUSU9OU0hJUFM6IHJlbGF0aW9uc2hpcHN9CiAKICAgQHN0YXRpY21ldGhvZAorICBkZWYgbWFyc2hhbF9saWNlbnNlcyhzYm9tX2RvYyk6CisgICAgbGljZW5zZXMgPSBbXQorICAgIGZvciBsIGluIHNib21fZG9jLmxpY2Vuc2VzOgorICAgICAgbGljZW5zZXMuYXBwZW5kKHsKKyAgICAgICAgICBQcm9wTmFtZXMuTElDRU5TRV9JRDogbC5pZCwKKyAgICAgICAgICBQcm9wTmFtZXMuTElDRU5TRV9OQU1FOiBsLm5hbWUsCisgICAgICAgICAgUHJvcE5hbWVzLkxJQ0VOU0VfRVhUUkFDVEVEX1RFWFQ6IGYnPHRleHQ+e2wudGV4dH08L3RleHQ+JworICAgICAgfSkKKyAgICByZXR1cm4ge1Byb3BOYW1lcy5MSUNFTlNFUzogbGljZW5zZXN9CisKKyAgQHN0YXRpY21ldGhvZAogICBkZWYgd3JpdGUoc2JvbV9kb2MsIGZpbGUpOgogICAgIGRvYyA9IHt9CiAgICAgZG9jLnVwZGF0ZShKU09OV3JpdGVyLm1hcnNoYWxfZG9jX2hlYWRlcnMoc2JvbV9kb2MpKQogICAgIGRvYy51cGRhdGUoSlNPTldyaXRlci5tYXJzaGFsX3BhY2thZ2VzKHNib21fZG9jKSkKICAgICBkb2MudXBkYXRlKEpTT05Xcml0ZXIubWFyc2hhbF9maWxlcyhzYm9tX2RvYykpCiAgICAgZG9jLnVwZGF0ZShKU09OV3JpdGVyLm1hcnNoYWxfcmVsYXRpb25zaGlwcyhzYm9tX2RvYykpCisgICAgZG9jLnVwZGF0ZShKU09OV3JpdGVyLm1hcnNoYWxfbGljZW5zZXMoc2JvbV9kb2MpKQogICAgIGZpbGUud3JpdGUoanNvbi5kdW1wcyhkb2MsIGluZGVudD00KSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vc2JvbV93cml0ZXJzX3Rlc3QucHkgYi90b29scy9zYm9tL3Nib21fd3JpdGVyc190ZXN0LnB5CmluZGV4IDM2MWRhZTYuLmY5ZjUyMzAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Nib20vc2JvbV93cml0ZXJzX3Rlc3QucHkKKysrIGIvdG9vbHMvc2JvbS9zYm9tX3dyaXRlcnNfdGVzdC5weQpAQCAtMzEsNyArMzEsMTYgQEAKIFNQRFhJRF9GSUxFMSA9ICdTUERYUmVmLWZpbGUxJwogU1BEWElEX0ZJTEUyID0gJ1NQRFhSZWYtZmlsZTInCiBTUERYSURfRklMRTMgPSAnU1BEWFJlZi1maWxlMycKK1NQRFhJRF9GSUxFNCA9ICdTUERYUmVmLWZpbGU0JwogCitTUERYSURfTElDRU5TRV8xID0gJ0xpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTEnCitTUERYSURfTElDRU5TRV8yID0gJ0xpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTInCitTUERYSURfTElDRU5TRV8zID0gJ0xpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMnCisKK0xJQ0VOU0VfQVBBQ0hFX1RFWFQgPSAiTElDRU5TRV9BUEFDSEUiCitMSUNFTlNFMV9URVhUID0gJ0xJQ0VOU0UgMScKK0xJQ0VOU0UyX1RFWFQgPSAnTElDRU5TRSAyJworTElDRU5TRTNfVEVYVCA9ICdMSUNFTlNFIDMnCiAKIGNsYXNzIFNCT01Xcml0ZXJzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTYyLDYgKzcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAogICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1CVUlMRF9GSU5HRVJfUFJJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZF9saWNlbnNlX2lkcz1bc2JvbV9kYXRhLlNQRFhJRF9MSUNFTlNFX0FQQUNIRV0KICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAKICAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKApAQCAtNzAsNiArODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9HT09HTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkX2xpY2Vuc2VfaWRzPVtTUERYSURfTElDRU5TRV8xXSwKICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAKICAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKApAQCAtNzgsNiArODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9HT09HTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkX2xpY2Vuc2VfaWRzPVtTUERYSURfTElDRU5TRV8yLCBTUERYSURfTElDRU5TRV8zXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX3JlZnM9W3Nib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PXNib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWZDYXRlZ29yeS5TRUNVUklUWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1zYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmVHlwZS5jcGUyMlR5cGUsCkBAIC04OSw2ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nVXBzdHJlYW0gcGFja2FnZTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfVVBTVFJFQU0sCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPScxLjEnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRfbGljZW5zZV9pZHM9W1NQRFhJRF9MSUNFTlNFXzIsIFNQRFhJRF9MSUNFTlNFXzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgKSkKIAogICAgIHNlbGYuc2JvbV9kb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1TUERYSURfU09VUkNFX1BBQ0tBR0UxLApAQCAtOTYsMTEgKzEwOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1TUERYSURfVVBTVFJFQU1fUEFDS0FHRTEpKQogCiAgICAgc2VsZi5zYm9tX2RvYy5maWxlcy5hcHBlbmQoCi0gICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTEsIG5hbWU9Jy9iaW4vZmlsZTEnLCBjaGVja3N1bT0nU0hBMTogMTExMTEnKSkKKyAgICAgIHNib21fZGF0YS5GaWxlKGlkPVNQRFhJRF9GSUxFMSwgbmFtZT0nL2Jpbi9maWxlMScsIGNoZWNrc3VtPSdTSEExOiAxMTExMScsIGNvbmNsdWRlZF9saWNlbnNlX2lkcz1bc2JvbV9kYXRhLlNQRFhJRF9MSUNFTlNFX0FQQUNIRV0pKQogICAgIHNlbGYuc2JvbV9kb2MuZmlsZXMuYXBwZW5kKAotICAgICAgc2JvbV9kYXRhLkZpbGUoaWQ9U1BEWElEX0ZJTEUyLCBuYW1lPScvYmluL2ZpbGUyJywgY2hlY2tzdW09J1NIQTE6IDIyMjIyJykpCisgICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTIsIG5hbWU9Jy9iaW4vZmlsZTInLCBjaGVja3N1bT0nU0hBMTogMjIyMjInLCBjb25jbHVkZWRfbGljZW5zZV9pZHM9W1NQRFhJRF9MSUNFTlNFXzFdKSkKICAgICBzZWxmLnNib21fZG9jLmZpbGVzLmFwcGVuZCgKLSAgICAgIHNib21fZGF0YS5GaWxlKGlkPVNQRFhJRF9GSUxFMywgbmFtZT0nL2Jpbi9maWxlMycsIGNoZWNrc3VtPSdTSEExOiAzMzMzMycpKQorICAgICAgc2JvbV9kYXRhLkZpbGUoaWQ9U1BEWElEX0ZJTEUzLCBuYW1lPScvYmluL2ZpbGUzJywgY2hlY2tzdW09J1NIQTE6IDMzMzMzJywgY29uY2x1ZGVkX2xpY2Vuc2VfaWRzPVtTUERYSURfTElDRU5TRV8yLCBTUERYSURfTElDRU5TRV8zXSkpCisgICAgc2VsZi5zYm9tX2RvYy5maWxlcy5hcHBlbmQoCisgICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTQsIG5hbWU9J2ZpbGU0LmEnLCBjaGVja3N1bT0nU0hBMTogNDQ0NDQnKSkKIAogICAgIHNlbGYuc2JvbV9kb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1TUERYSURfRklMRTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLApAQCAtMTEyLDYgKzEyNywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5HRU5FUkFURURfRlJPTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9U1BEWElEX1NPVVJDRV9QQUNLQUdFMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPVNQRFhJRF9GSUxFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuU1RBVElDX0xJTkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPVNQRFhJRF9GSUxFNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICBzZWxmLnNib21fZG9jLmFkZF9saWNlbnNlKHNib21fZGF0YS5MaWNlbnNlKHNib21fZGF0YS5TUERYSURfTElDRU5TRV9BUEFDSEUsIExJQ0VOU0VfQVBBQ0hFX1RFWFQsICJMaWNlbnNlLUFwYWNoZSIpKQorICAgIHNlbGYuc2JvbV9kb2MuYWRkX2xpY2Vuc2Uoc2JvbV9kYXRhLkxpY2Vuc2UoU1BEWElEX0xJQ0VOU0VfMSwgTElDRU5TRTFfVEVYVCwgIkxpY2Vuc2UtMSIpKQorICAgIHNlbGYuc2JvbV9kb2MuYWRkX2xpY2Vuc2Uoc2JvbV9kYXRhLkxpY2Vuc2UoU1BEWElEX0xJQ0VOU0VfMiwgTElDRU5TRTJfVEVYVCwgIkxpY2Vuc2UtMiIpKQorICAgIHNlbGYuc2JvbV9kb2MuYWRkX2xpY2Vuc2Uoc2JvbV9kYXRhLkxpY2Vuc2UoU1BEWElEX0xJQ0VOU0VfMywgTElDRU5TRTNfVEVYVCwgIkxpY2Vuc2UtMyIpKQogCiAgICAgIyBTQk9NIGZyYWdtZW50IG9mIGEgQVBLCiAgICAgc2VsZi51bmJ1bmRsZWRfc2JvbV9kb2MgPSBzYm9tX2RhdGEuRG9jdW1lbnQobmFtZT0ndGVzdCBkb2MnLApAQCAtMTM5LDYgKzE2MywxNCBAQAogICAgICAgc2VsZi5tYXhEaWZmID0gTm9uZQogICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9vdXRwdXQsIG91dHB1dC5nZXR2YWx1ZSgpKQogCisgIGRlZiB0ZXN0X3RhZ3ZhbHVlX3dyaXRlcl9kb2NfZGVzY3JpYmVzX2ZpbGUoc2VsZik6CisgICAgd2l0aCBpby5TdHJpbmdJTygpIGFzIG91dHB1dDoKKyAgICAgIHNlbGYuc2JvbV9kb2MuZGVzY3JpYmVzID0gU1BEWElEX0ZJTEU0CisgICAgICBzYm9tX3dyaXRlcnMuVGFnVmFsdWVXcml0ZXIud3JpdGUoc2VsZi5zYm9tX2RvYywgb3V0cHV0KQorICAgICAgZXhwZWN0ZWRfb3V0cHV0ID0gcGF0aGxpYi5QYXRoKCd0ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tX2RvY19kZXNjcmliZXNfZmlsZS5zcGR4JykucmVhZF90ZXh0KCkKKyAgICAgIHNlbGYubWF4RGlmZiA9IE5vbmUKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfb3V0cHV0LCBvdXRwdXQuZ2V0dmFsdWUoKSkKKwogICBkZWYgdGVzdF90YWd2YWx1ZV93cml0ZXJfdW5idW5kbGVkKHNlbGYpOgogICAgIHdpdGggaW8uU3RyaW5nSU8oKSBhcyBvdXRwdXQ6CiAgICAgICBzYm9tX3dyaXRlcnMuVGFnVmFsdWVXcml0ZXIud3JpdGUoc2VsZi51bmJ1bmRsZWRfc2JvbV9kb2MsIG91dHB1dCwgZnJhZ21lbnQ9VHJ1ZSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfanNvbl9zYm9tLnNwZHguanNvbiBiL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfanNvbl9zYm9tLnNwZHguanNvbgppbmRleCAzMjcxNWE1Li5hODc3ODEwIDEwMDY0NAotLS0gYS90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX2pzb25fc2JvbS5zcGR4Lmpzb24KKysrIGIvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF9qc29uX3Nib20uc3BkeC5qc29uCkBAIC0zMSw2ICszMSw3IEBACiAgICAgICAgICAgICAiZmlsZXNBbmFseXplZCI6IHRydWUsCiAgICAgICAgICAgICAidmVyc2lvbkluZm8iOiAiYnVpbGRfZmluZ2VyX3ByaW50IiwKICAgICAgICAgICAgICJzdXBwbGllciI6ICJPcmdhbml6YXRpb246IEdvb2dsZSIsCisgICAgICAgICAgICAibGljZW5zZURlY2xhcmVkIjogIk5PQVNTRVJUSU9OIiwKICAgICAgICAgICAgICJwYWNrYWdlVmVyaWZpY2F0aW9uQ29kZSI6IHsKICAgICAgICAgICAgICAgICAicGFja2FnZVZlcmlmaWNhdGlvbkNvZGVWYWx1ZSI6ICIxMjM0NTYiCiAgICAgICAgICAgICB9LApAQCAtNDYsNyArNDcsOCBAQAogICAgICAgICAgICAgImRvd25sb2FkTG9jYXRpb24iOiAiTk9ORSIsCiAgICAgICAgICAgICAiZmlsZXNBbmFseXplZCI6IGZhbHNlLAogICAgICAgICAgICAgInZlcnNpb25JbmZvIjogImJ1aWxkX2Zpbmdlcl9wcmludCIsCi0gICAgICAgICAgICAic3VwcGxpZXIiOiAiT3JnYW5pemF0aW9uOiBHb29nbGUiCisgICAgICAgICAgICAic3VwcGxpZXIiOiAiT3JnYW5pemF0aW9uOiBHb29nbGUiLAorICAgICAgICAgICAgImxpY2Vuc2VEZWNsYXJlZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMCIKICAgICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgIm5hbWUiOiAiUHJlYnVpbHQgcGFja2FnZTEiLApAQCAtNTQsNyArNTYsOCBAQAogICAgICAgICAgICAgImRvd25sb2FkTG9jYXRpb24iOiAiTk9ORSIsCiAgICAgICAgICAgICAiZmlsZXNBbmFseXplZCI6IGZhbHNlLAogICAgICAgICAgICAgInZlcnNpb25JbmZvIjogImJ1aWxkX2Zpbmdlcl9wcmludCIsCi0gICAgICAgICAgICAic3VwcGxpZXIiOiAiT3JnYW5pemF0aW9uOiBHb29nbGUiCisgICAgICAgICAgICAic3VwcGxpZXIiOiAiT3JnYW5pemF0aW9uOiBHb29nbGUiLAorICAgICAgICAgICAgImxpY2Vuc2VEZWNsYXJlZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0xIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAibmFtZSI6ICJTb3VyY2UgcGFja2FnZTEiLApAQCAtNjMsNiArNjYsNyBAQAogICAgICAgICAgICAgImZpbGVzQW5hbHl6ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICJ2ZXJzaW9uSW5mbyI6ICJidWlsZF9maW5nZXJfcHJpbnQiLAogICAgICAgICAgICAgInN1cHBsaWVyIjogIk9yZ2FuaXphdGlvbjogR29vZ2xlIiwKKyAgICAgICAgICAgICJsaWNlbnNlRGVjbGFyZWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMiBPUiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zIiwKICAgICAgICAgICAgICJleHRlcm5hbFJlZnMiOiBbCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlQ2F0ZWdvcnkiOiAiU0VDVVJJVFkiLApAQCAtNzcsNyArODEsOCBAQAogICAgICAgICAgICAgImRvd25sb2FkTG9jYXRpb24iOiAiTk9BU1NFUlRJT04iLAogICAgICAgICAgICAgImZpbGVzQW5hbHl6ZWQiOiBmYWxzZSwKICAgICAgICAgICAgICJ2ZXJzaW9uSW5mbyI6ICIxLjEiLAotICAgICAgICAgICAgInN1cHBsaWVyIjogIk9yZ2FuaXphdGlvbjogdXBzdHJlYW0iCisgICAgICAgICAgICAic3VwcGxpZXIiOiAiT3JnYW5pemF0aW9uOiB1cHN0cmVhbSIsCisgICAgICAgICAgICAibGljZW5zZURlY2xhcmVkIjogIkxpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIgT1IgTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMyIKICAgICAgICAgfQogICAgIF0sCiAgICAgImZpbGVzIjogWwpAQCAtODksNyArOTQsOCBAQAogICAgICAgICAgICAgICAgICAgICAiYWxnb3JpdGhtIjogIlNIQTEiLAogICAgICAgICAgICAgICAgICAgICAiY2hlY2tzdW1WYWx1ZSI6ICIxMTExMSIKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImxpY2Vuc2VDb25jbHVkZWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAiCiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAgICJmaWxlTmFtZSI6ICIvYmluL2ZpbGUyIiwKQEAgLTk5LDcgKzEwNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICJhbGdvcml0aG0iOiAiU0hBMSIsCiAgICAgICAgICAgICAgICAgICAgICJjaGVja3N1bVZhbHVlIjogIjIyMjIyIgogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibGljZW5zZUNvbmNsdWRlZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0xIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAiZmlsZU5hbWUiOiAiL2Jpbi9maWxlMyIsCkBAIC0xMDksNyArMTE2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICJhbGdvcml0aG0iOiAiU0hBMSIsCiAgICAgICAgICAgICAgICAgICAgICJjaGVja3N1bVZhbHVlIjogIjMzMzMzIgogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibGljZW5zZUNvbmNsdWRlZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIE9SIExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJmaWxlTmFtZSI6ICJmaWxlNC5hIiwKKyAgICAgICAgICAgICJTUERYSUQiOiAiU1BEWFJlZi1maWxlNCIsCisgICAgICAgICAgICAiY2hlY2tzdW1zIjogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImFsZ29yaXRobSI6ICJTSEExIiwKKyAgICAgICAgICAgICAgICAgICAgImNoZWNrc3VtVmFsdWUiOiAiNDQ0NDQiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJsaWNlbnNlQ29uY2x1ZGVkIjogIk5PQVNTRVJUSU9OIgogICAgICAgICB9CiAgICAgXSwKICAgICAicmVsYXRpb25zaGlwcyI6IFsKQEAgLTEyOSw5ICsxNDgsMzYgQEAKICAgICAgICAgICAgICJyZWxhdGlvbnNoaXBUeXBlIjogIkdFTkVSQVRFRF9GUk9NIgogICAgICAgICB9LAogICAgICAgICB7CisgICAgICAgICAgICAic3BkeEVsZW1lbnRJZCI6ICJTUERYUmVmLWZpbGUxIiwKKyAgICAgICAgICAgICJyZWxhdGVkU3BkeEVsZW1lbnQiOiAiU1BEWFJlZi1maWxlNCIsCisgICAgICAgICAgICAicmVsYXRpb25zaGlwVHlwZSI6ICJTVEFUSUNfTElOSyIKKyAgICAgICAgfSwKKyAgICAgICAgewogICAgICAgICAgICAgInNwZHhFbGVtZW50SWQiOiAiU1BEWFJlZi1TT1VSQ0UtcGFja2FnZTEiLAogICAgICAgICAgICAgInJlbGF0ZWRTcGR4RWxlbWVudCI6ICJTUERYUmVmLVVQU1RSRUFNLXBhY2thZ2UxIiwKICAgICAgICAgICAgICJyZWxhdGlvbnNoaXBUeXBlIjogIlZBUklBTlRfT0YiCiAgICAgICAgIH0KKyAgICBdLAorICAgICJoYXNFeHRyYWN0ZWRMaWNlbnNpbmdJbmZvcyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgImxpY2Vuc2VJZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMCIsCisgICAgICAgICAgICAibmFtZSI6ICJMaWNlbnNlLUFwYWNoZSIsCisgICAgICAgICAgICAiZXh0cmFjdGVkVGV4dCI6ICI8dGV4dD5MSUNFTlNFX0FQQUNIRTwvdGV4dD4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJsaWNlbnNlSWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMSIsCisgICAgICAgICAgICAibmFtZSI6ICJMaWNlbnNlLTEiLAorICAgICAgICAgICAgImV4dHJhY3RlZFRleHQiOiAiPHRleHQ+TElDRU5TRSAxPC90ZXh0PiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImxpY2Vuc2VJZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIiwKKyAgICAgICAgICAgICJuYW1lIjogIkxpY2Vuc2UtMiIsCisgICAgICAgICAgICAiZXh0cmFjdGVkVGV4dCI6ICI8dGV4dD5MSUNFTlNFIDI8L3RleHQ+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibGljZW5zZUlkIjogIkxpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMiLAorICAgICAgICAgICAgIm5hbWUiOiAiTGljZW5zZS0zIiwKKyAgICAgICAgICAgICJleHRyYWN0ZWRUZXh0IjogIjx0ZXh0PkxJQ0VOU0UgMzwvdGV4dD4iCisgICAgICAgIH0KICAgICBdCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tLnNwZHggYi90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib20uc3BkeAppbmRleCBlZTM5ZTgyLi4xYzU0NDEwIDEwMDY0NAotLS0gYS90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib20uc3BkeAorKysgYi90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib20uc3BkeApAQCAtNywxMiArNywxOCBAQAogQ3JlYXRlZDogMjAyMy0wMy0zMVQyMjoxNzo1OFoKIEV4dGVybmFsRG9jdW1lbnRSZWY6IERvY3VtZW50UmVmLWV4dGVybmFsX2RvY19yZWYgZXh0ZXJuYWxfZG9jX3VyaSBTSEExOiAxMjM0NTY3ODkwCiAKK0ZpbGVOYW1lOiBmaWxlNC5hCitTUERYSUQ6IFNQRFhSZWYtZmlsZTQKK0ZpbGVDaGVja3N1bTogU0hBMTogNDQ0NDQKK0xpY2Vuc2VDb25jbHVkZWQ6IE5PQVNTRVJUSU9OCisKIFBhY2thZ2VOYW1lOiBQUk9EVUNUCiBTUERYSUQ6IFNQRFhSZWYtUFJPRFVDVAogUGFja2FnZURvd25sb2FkTG9jYXRpb246IE5PTkUKIEZpbGVzQW5hbHl6ZWQ6IHRydWUKIFBhY2thZ2VWZXJzaW9uOiBidWlsZF9maW5nZXJfcHJpbnQKIFBhY2thZ2VTdXBwbGllcjogT3JnYW5pemF0aW9uOiBHb29nbGUKK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IE5PQVNTRVJUSU9OCiBQYWNrYWdlVmVyaWZpY2F0aW9uQ29kZTogMTIzNDU2CiAKIFJlbGF0aW9uc2hpcDogU1BEWFJlZi1ET0NVTUVOVCBERVNDUklCRVMgU1BEWFJlZi1QUk9EVUNUCkBAIC0yMCwxNCArMjYsMTcgQEAKIEZpbGVOYW1lOiAvYmluL2ZpbGUxCiBTUERYSUQ6IFNQRFhSZWYtZmlsZTEKIEZpbGVDaGVja3N1bTogU0hBMTogMTExMTEKK0xpY2Vuc2VDb25jbHVkZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1BcGFjaGUtMi4wCiAKIEZpbGVOYW1lOiAvYmluL2ZpbGUyCiBTUERYSUQ6IFNQRFhSZWYtZmlsZTIKIEZpbGVDaGVja3N1bTogU0hBMTogMjIyMjIKK0xpY2Vuc2VDb25jbHVkZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTEKIAogRmlsZU5hbWU6IC9iaW4vZmlsZTMKIFNQRFhJRDogU1BEWFJlZi1maWxlMwogRmlsZUNoZWNrc3VtOiBTSEExOiAzMzMzMworTGljZW5zZUNvbmNsdWRlZDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMiBPUiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zCiAKIFBhY2thZ2VOYW1lOiBQTEFURk9STQogU1BEWElEOiBTUERYUmVmLVBMQVRGT1JNCkBAIC0zNSw2ICs0NCw3IEBACiBGaWxlc0FuYWx5emVkOiBmYWxzZQogUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAogUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAKIAogUGFja2FnZU5hbWU6IFByZWJ1aWx0IHBhY2thZ2UxCiBTUERYSUQ6IFNQRFhSZWYtUFJFQlVJTFQtcGFja2FnZTEKQEAgLTQyLDYgKzUyLDcgQEAKIEZpbGVzQW5hbHl6ZWQ6IGZhbHNlCiBQYWNrYWdlVmVyc2lvbjogYnVpbGRfZmluZ2VyX3ByaW50CiBQYWNrYWdlU3VwcGxpZXI6IE9yZ2FuaXphdGlvbjogR29vZ2xlCitQYWNrYWdlTGljZW5zZURlY2xhcmVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0xCiAKIFBhY2thZ2VOYW1lOiBTb3VyY2UgcGFja2FnZTEKIFNQRFhJRDogU1BEWFJlZi1TT1VSQ0UtcGFja2FnZTEKQEAgLTQ5LDYgKzYwLDcgQEAKIEZpbGVzQW5hbHl6ZWQ6IGZhbHNlCiBQYWNrYWdlVmVyc2lvbjogYnVpbGRfZmluZ2VyX3ByaW50CiBQYWNrYWdlU3VwcGxpZXI6IE9yZ2FuaXphdGlvbjogR29vZ2xlCitQYWNrYWdlTGljZW5zZURlY2xhcmVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIE9SIExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMKIEV4dGVybmFsUmVmOiBTRUNVUklUWSBjcGUyMlR5cGUgY3BlOi9hOmpzb25jcHBfcHJvamVjdDpqc29uY3BwOjEuOS40CiAKIFBhY2thZ2VOYW1lOiBVcHN0cmVhbSBwYWNrYWdlMQpAQCAtNTcsOSArNjksMjcgQEAKIEZpbGVzQW5hbHl6ZWQ6IGZhbHNlCiBQYWNrYWdlVmVyc2lvbjogMS4xCiBQYWNrYWdlU3VwcGxpZXI6IE9yZ2FuaXphdGlvbjogdXBzdHJlYW0KK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIgT1IgTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMwogCiBSZWxhdGlvbnNoaXA6IFNQRFhSZWYtU09VUkNFLXBhY2thZ2UxIFZBUklBTlRfT0YgU1BEWFJlZi1VUFNUUkVBTS1wYWNrYWdlMQogCiBSZWxhdGlvbnNoaXA6IFNQRFhSZWYtZmlsZTEgR0VORVJBVEVEX0ZST00gU1BEWFJlZi1QTEFURk9STQogUmVsYXRpb25zaGlwOiBTUERYUmVmLWZpbGUyIEdFTkVSQVRFRF9GUk9NIFNQRFhSZWYtUFJFQlVJTFQtcGFja2FnZTEKIFJlbGF0aW9uc2hpcDogU1BEWFJlZi1maWxlMyBHRU5FUkFURURfRlJPTSBTUERYUmVmLVNPVVJDRS1wYWNrYWdlMQorUmVsYXRpb25zaGlwOiBTUERYUmVmLWZpbGUxIFNUQVRJQ19MSU5LIFNQRFhSZWYtZmlsZTQKKworTGljZW5zZUlEOiBMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMAorTGljZW5zZU5hbWU6IExpY2Vuc2UtQXBhY2hlCitFeHRyYWN0ZWRUZXh0OiA8dGV4dD5MSUNFTlNFX0FQQUNIRTwvdGV4dD4KKworTGljZW5zZUlEOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0xCitMaWNlbnNlTmFtZTogTGljZW5zZS0xCitFeHRyYWN0ZWRUZXh0OiA8dGV4dD5MSUNFTlNFIDE8L3RleHQ+CisKK0xpY2Vuc2VJRDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMgorTGljZW5zZU5hbWU6IExpY2Vuc2UtMgorRXh0cmFjdGVkVGV4dDogPHRleHQ+TElDRU5TRSAyPC90ZXh0PgorCitMaWNlbnNlSUQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMKK0xpY2Vuc2VOYW1lOiBMaWNlbnNlLTMKK0V4dHJhY3RlZFRleHQ6IDx0ZXh0PkxJQ0VOU0UgMzwvdGV4dD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfdGFndmFsdWVfc2JvbV9kb2NfZGVzY3JpYmVzX2ZpbGUuc3BkeCBiL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfdGFndmFsdWVfc2JvbV9kb2NfZGVzY3JpYmVzX2ZpbGUuc3BkeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFmYzhiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tX2RvY19kZXNjcmliZXNfZmlsZS5zcGR4CkBAIC0wLDAgKzEsOTUgQEAKK1NQRFhWZXJzaW9uOiBTUERYLTIuMworRGF0YUxpY2Vuc2U6IENDMC0xLjAKK1NQRFhJRDogU1BEWFJlZi1ET0NVTUVOVAorRG9jdW1lbnROYW1lOiB0ZXN0IGRvYworRG9jdW1lbnROYW1lc3BhY2U6IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zYm9tL3NwZHgvYW5kcm9pZAorQ3JlYXRvcjogT3JnYW5pemF0aW9uOiBHb29nbGUKK0NyZWF0ZWQ6IDIwMjMtMDMtMzFUMjI6MTc6NThaCitFeHRlcm5hbERvY3VtZW50UmVmOiBEb2N1bWVudFJlZi1leHRlcm5hbF9kb2NfcmVmIGV4dGVybmFsX2RvY191cmkgU0hBMTogMTIzNDU2Nzg5MAorCitGaWxlTmFtZTogZmlsZTQuYQorU1BEWElEOiBTUERYUmVmLWZpbGU0CitGaWxlQ2hlY2tzdW06IFNIQTE6IDQ0NDQ0CitMaWNlbnNlQ29uY2x1ZGVkOiBOT0FTU0VSVElPTgorCitSZWxhdGlvbnNoaXA6IFNQRFhSZWYtRE9DVU1FTlQgREVTQ1JJQkVTIFNQRFhSZWYtZmlsZTQKKworUGFja2FnZU5hbWU6IFBST0RVQ1QKK1NQRFhJRDogU1BEWFJlZi1QUk9EVUNUCitQYWNrYWdlRG93bmxvYWRMb2NhdGlvbjogTk9ORQorRmlsZXNBbmFseXplZDogdHJ1ZQorUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAorUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTk9BU1NFUlRJT04KK1BhY2thZ2VWZXJpZmljYXRpb25Db2RlOiAxMjM0NTYKKworRmlsZU5hbWU6IC9iaW4vZmlsZTEKK1NQRFhJRDogU1BEWFJlZi1maWxlMQorRmlsZUNoZWNrc3VtOiBTSEExOiAxMTExMQorTGljZW5zZUNvbmNsdWRlZDogTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAKKworRmlsZU5hbWU6IC9iaW4vZmlsZTIKK1NQRFhJRDogU1BEWFJlZi1maWxlMgorRmlsZUNoZWNrc3VtOiBTSEExOiAyMjIyMgorTGljZW5zZUNvbmNsdWRlZDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMQorCitGaWxlTmFtZTogL2Jpbi9maWxlMworU1BEWElEOiBTUERYUmVmLWZpbGUzCitGaWxlQ2hlY2tzdW06IFNIQTE6IDMzMzMzCitMaWNlbnNlQ29uY2x1ZGVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIE9SIExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMKKworUGFja2FnZU5hbWU6IFBMQVRGT1JNCitTUERYSUQ6IFNQRFhSZWYtUExBVEZPUk0KK1BhY2thZ2VEb3dubG9hZExvY2F0aW9uOiBOT05FCitGaWxlc0FuYWx5emVkOiBmYWxzZQorUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAorUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAKKworUGFja2FnZU5hbWU6IFByZWJ1aWx0IHBhY2thZ2UxCitTUERYSUQ6IFNQRFhSZWYtUFJFQlVJTFQtcGFja2FnZTEKK1BhY2thZ2VEb3dubG9hZExvY2F0aW9uOiBOT05FCitGaWxlc0FuYWx5emVkOiBmYWxzZQorUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAorUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMQorCitQYWNrYWdlTmFtZTogU291cmNlIHBhY2thZ2UxCitTUERYSUQ6IFNQRFhSZWYtU09VUkNFLXBhY2thZ2UxCitQYWNrYWdlRG93bmxvYWRMb2NhdGlvbjogTk9ORQorRmlsZXNBbmFseXplZDogZmFsc2UKK1BhY2thZ2VWZXJzaW9uOiBidWlsZF9maW5nZXJfcHJpbnQKK1BhY2thZ2VTdXBwbGllcjogT3JnYW5pemF0aW9uOiBHb29nbGUKK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIgT1IgTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMworRXh0ZXJuYWxSZWY6IFNFQ1VSSVRZIGNwZTIyVHlwZSBjcGU6L2E6anNvbmNwcF9wcm9qZWN0Ompzb25jcHA6MS45LjQKKworUGFja2FnZU5hbWU6IFVwc3RyZWFtIHBhY2thZ2UxCitTUERYSUQ6IFNQRFhSZWYtVVBTVFJFQU0tcGFja2FnZTEKK1BhY2thZ2VEb3dubG9hZExvY2F0aW9uOiBOT0FTU0VSVElPTgorRmlsZXNBbmFseXplZDogZmFsc2UKK1BhY2thZ2VWZXJzaW9uOiAxLjEKK1BhY2thZ2VTdXBwbGllcjogT3JnYW5pemF0aW9uOiB1cHN0cmVhbQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMiBPUiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zCisKK1JlbGF0aW9uc2hpcDogU1BEWFJlZi1TT1VSQ0UtcGFja2FnZTEgVkFSSUFOVF9PRiBTUERYUmVmLVVQU1RSRUFNLXBhY2thZ2UxCisKK1JlbGF0aW9uc2hpcDogU1BEWFJlZi1maWxlMSBHRU5FUkFURURfRlJPTSBTUERYUmVmLVBMQVRGT1JNCitSZWxhdGlvbnNoaXA6IFNQRFhSZWYtZmlsZTIgR0VORVJBVEVEX0ZST00gU1BEWFJlZi1QUkVCVUlMVC1wYWNrYWdlMQorUmVsYXRpb25zaGlwOiBTUERYUmVmLWZpbGUzIEdFTkVSQVRFRF9GUk9NIFNQRFhSZWYtU09VUkNFLXBhY2thZ2UxCitSZWxhdGlvbnNoaXA6IFNQRFhSZWYtZmlsZTEgU1RBVElDX0xJTksgU1BEWFJlZi1maWxlNAorCitMaWNlbnNlSUQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1BcGFjaGUtMi4wCitMaWNlbnNlTmFtZTogTGljZW5zZS1BcGFjaGUKK0V4dHJhY3RlZFRleHQ6IDx0ZXh0PkxJQ0VOU0VfQVBBQ0hFPC90ZXh0PgorCitMaWNlbnNlSUQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTEKK0xpY2Vuc2VOYW1lOiBMaWNlbnNlLTEKK0V4dHJhY3RlZFRleHQ6IDx0ZXh0PkxJQ0VOU0UgMTwvdGV4dD4KKworTGljZW5zZUlEOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yCitMaWNlbnNlTmFtZTogTGljZW5zZS0yCitFeHRyYWN0ZWRUZXh0OiA8dGV4dD5MSUNFTlNFIDI8L3RleHQ+CisKK0xpY2Vuc2VJRDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMworTGljZW5zZU5hbWU6IExpY2Vuc2UtMworRXh0cmFjdGVkVGV4dDogPHRleHQ+TElDRU5TRSAzPC90ZXh0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tX3VuYnVuZGxlZC5zcGR4IGIvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tX3VuYnVuZGxlZC5zcGR4CmluZGV4IGEwMGMyOTEuLjRiMTRhNGIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfdGFndmFsdWVfc2JvbV91bmJ1bmRsZWQuc3BkeAorKysgYi90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib21fdW5idW5kbGVkLnNwZHgKQEAgLTEsNiArMSw3IEBACiBGaWxlTmFtZTogL2Jpbi9maWxlMS5hcGsKIFNQRFhJRDogU1BEWFJlZi1maWxlMQogRmlsZUNoZWNrc3VtOiBTSEExOiAxMTExMQorTGljZW5zZUNvbmNsdWRlZDogTk9BU1NFUlRJT04KIAogUGFja2FnZU5hbWU6IFVuYnVuZGxlZCBhcGsgcGFja2FnZQogU1BEWElEOiBTUERYUmVmLVNPVVJDRS1wYWNrYWdlMQpAQCAtOCw1ICs5LDYgQEAKIEZpbGVzQW5hbHl6ZWQ6IGZhbHNlCiBQYWNrYWdlVmVyc2lvbjogYnVpbGRfZmluZ2VyX3ByaW50CiBQYWNrYWdlU3VwcGxpZXI6IE9yZ2FuaXphdGlvbjogR29vZ2xlCitQYWNrYWdlTGljZW5zZURlY2xhcmVkOiBOT0FTU0VSVElPTgogCiBSZWxhdGlvbnNoaXA6IFNQRFhSZWYtZmlsZTEgR0VORVJBVEVEX0ZST00gU1BEWFJlZi1TT1VSQ0UtcGFja2FnZTEKZGlmZiAtLWdpdCBhL3Rvb2xzL3NpZ25hcGsvc3JjL2NvbS9hbmRyb2lkL3NpZ25hcGsvU2lnbkFway5qYXZhIGIvdG9vbHMvc2lnbmFway9zcmMvY29tL2FuZHJvaWQvc2lnbmFway9TaWduQXBrLmphdmEKaW5kZXggMjVjNTNkMy4uNmIyMzQxYiAxMDA2NDQKLS0tIGEvdG9vbHMvc2lnbmFway9zcmMvY29tL2FuZHJvaWQvc2lnbmFway9TaWduQXBrLmphdmEKKysrIGIvdG9vbHMvc2lnbmFway9zcmMvY29tL2FuZHJvaWQvc2lnbmFway9TaWduQXBrLmphdmEKQEAgLTY4Nyw3ICs2ODcsNyBAQAogICAgICAgICBpZiAoZW50cnlOYW1lLmVuZHNXaXRoKCIuc28iKSkgewogICAgICAgICAgICAgLy8gQWxpZ24gLnNvIGNvbnRlbnRzIHRvIG1lbW9yeSBwYWdlIGJvdW5kYXJ5IHRvIGVuYWJsZSBtZW1vcnktbWFwcGVkCiAgICAgICAgICAgICAvLyBleGVjdXRpb24uCi0gICAgICAgICAgICByZXR1cm4gNDA5NjsKKyAgICAgICAgICAgIHJldHVybiAxNjM4NDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0QWxpZ25tZW50OwogICAgICAgICB9CkBAIC05ODYsMTUgKzk4NiwxNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFppcFNlY3Rpb25zIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBiZWZvcmVDZW50cmFsRGlyOworICAgICAgICBEYXRhU291cmNlIGJlZm9yZUNlbnRyYWxEaXI7CisKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHN0aWxsIHZhbGlkIGFmdGVyIGNsb3NpbmcgdGhlIGJhY2tpbmcgRGF0YVNvdXJjZS4KKyAgICAgICAgbG9uZyBiZWZvcmVDZW50cmFsRGlyU2l6ZTsKICAgICAgICAgQnl0ZUJ1ZmZlciBjZW50cmFsRGlyOwogICAgICAgICBCeXRlQnVmZmVyIGVvY2Q7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgWmlwU2VjdGlvbnMgZmluZE1haW5aaXBTZWN0aW9ucyhCeXRlQnVmZmVyIGFwaykKKyAgICBwcml2YXRlIHN0YXRpYyBaaXBTZWN0aW9ucyBmaW5kTWFpblppcFNlY3Rpb25zKERhdGFTb3VyY2UgYXBrKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBaaXBGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBhcGsuc2xpY2UoKTsKLSAgICAgICAgQXBrVXRpbHMuWmlwU2VjdGlvbnMgc2VjdGlvbnMgPSBBcGtVdGlscy5maW5kWmlwU2VjdGlvbnMoRGF0YVNvdXJjZXMuYXNEYXRhU291cmNlKGFwaykpOworICAgICAgICBBcGtVdGlscy5aaXBTZWN0aW9ucyBzZWN0aW9ucyA9IEFwa1V0aWxzLmZpbmRaaXBTZWN0aW9ucyhhcGspOwogICAgICAgICBsb25nIGNlbnRyYWxEaXJTdGFydE9mZnNldCA9IHNlY3Rpb25zLmdldFppcENlbnRyYWxEaXJlY3RvcnlPZmZzZXQoKTsKICAgICAgICAgbG9uZyBjZW50cmFsRGlyU2l6ZUJ5dGVzID0gc2VjdGlvbnMuZ2V0WmlwQ2VudHJhbERpcmVjdG9yeVNpemVCeXRlcygpOwogICAgICAgICBsb25nIGNlbnRyYWxEaXJFbmRPZmZzZXQgPSBjZW50cmFsRGlyU3RhcnRPZmZzZXQgKyBjZW50cmFsRGlyU2l6ZUJ5dGVzOwpAQCAtMTAwNSwyNSArMTAwNywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi4gQ0QgZW5kOiAiICsgY2VudHJhbERpckVuZE9mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgRW9DRCBzdGFydDogIiArIGVvY2RTdGFydE9mZnNldCk7CiAgICAgICAgIH0KLSAgICAgICAgYXBrLnBvc2l0aW9uKDApOwotICAgICAgICBhcGsubGltaXQoKGludCkgY2VudHJhbERpclN0YXJ0T2Zmc2V0KTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBiZWZvcmVDZW50cmFsRGlyID0gYXBrLnNsaWNlKCk7Ci0KLSAgICAgICAgYXBrLnBvc2l0aW9uKChpbnQpIGNlbnRyYWxEaXJTdGFydE9mZnNldCk7Ci0gICAgICAgIGFway5saW1pdCgoaW50KSBjZW50cmFsRGlyRW5kT2Zmc2V0KTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBjZW50cmFsRGlyID0gYXBrLnNsaWNlKCk7Ci0KLSAgICAgICAgYXBrLnBvc2l0aW9uKChpbnQpIGVvY2RTdGFydE9mZnNldCk7Ci0gICAgICAgIGFway5saW1pdChhcGsuY2FwYWNpdHkoKSk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgZW9jZCA9IGFway5zbGljZSgpOwotCi0gICAgICAgIGFway5wb3NpdGlvbigwKTsKLSAgICAgICAgYXBrLmxpbWl0KGFway5jYXBhY2l0eSgpKTsKIAogICAgICAgICBaaXBTZWN0aW9ucyByZXN1bHQgPSBuZXcgWmlwU2VjdGlvbnMoKTsKLSAgICAgICAgcmVzdWx0LmJlZm9yZUNlbnRyYWxEaXIgPSBiZWZvcmVDZW50cmFsRGlyOwotICAgICAgICByZXN1bHQuY2VudHJhbERpciA9IGNlbnRyYWxEaXI7Ci0gICAgICAgIHJlc3VsdC5lb2NkID0gZW9jZDsKKworICAgICAgICByZXN1bHQuYmVmb3JlQ2VudHJhbERpciA9IGFway5zbGljZSgwLCBjZW50cmFsRGlyU3RhcnRPZmZzZXQpOworICAgICAgICByZXN1bHQuYmVmb3JlQ2VudHJhbERpclNpemUgPSByZXN1bHQuYmVmb3JlQ2VudHJhbERpci5zaXplKCk7CisKKyAgICAgICAgbG9uZyBjZW50cmFsRGlyU2l6ZSA9IGNlbnRyYWxEaXJFbmRPZmZzZXQgLSBjZW50cmFsRGlyU3RhcnRPZmZzZXQ7CisgICAgICAgIGlmIChjZW50cmFsRGlyU2l6ZSA+PSBJbnRlZ2VyLk1BWF9WQUxVRSkgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgcmVzdWx0LmNlbnRyYWxEaXIgPSBhcGsuZ2V0Qnl0ZUJ1ZmZlcihjZW50cmFsRGlyU3RhcnRPZmZzZXQsIChpbnQpY2VudHJhbERpclNpemUpOworCisgICAgICAgIGxvbmcgZW9jZFNpemUgPSBhcGsuc2l6ZSgpIC0gZW9jZFN0YXJ0T2Zmc2V0OworICAgICAgICBpZiAoZW9jZFNpemUgPj0gSW50ZWdlci5NQVhfVkFMVUUpIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIHJlc3VsdC5lb2NkID0gYXBrLmdldEJ5dGVCdWZmZXIoZW9jZFN0YXJ0T2Zmc2V0LCAoaW50KWVvY2RTaXplKTsKKwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTI3OCwxMSArMTI3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25hdHVyZXMpCiAgICAgICAgICAgICAgICAgICAgIGFwa1NpZ25lci5pbnB1dEFwa1NpZ25pbmdCbG9jayhudWxsKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgb3V0cHV0IEFQSyBpbiBtZW1vcnksIGJ5IGNvcHlpbmcgaW5wdXQgQVBLJ3MgWklQIGVudHJpZXMgYWNyb3NzCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIHNpZ25pbmcgdGhlIG91dHB1dCBBUEsuCi0gICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB2MVNpZ25lZEFwa0J1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgICAgICAgICAgQ291bnRpbmdPdXRwdXRTdHJlYW0gb3V0cHV0SmFyQ291bnRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvdW50aW5nT3V0cHV0U3RyZWFtKHYxU2lnbmVkQXBrQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ291bnRpbmdPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgIEphck91dHB1dFN0cmVhbSBvdXRwdXRKYXIgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG91dHB1dEphckNvdW50ZXIpOwogICAgICAgICAgICAgICAgICAgICAvLyBVc2UgbWF4aW11bSBjb21wcmVzc2lvbiBmb3IgY29tcHJlc3NlZCBlbnRyaWVzIGJlY2F1c2UgdGhlIEFQSyBsaXZlcyBmb3JldmVyCiAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBzeXN0ZW0gcGFydGl0aW9uLgpAQCAtMTI5NSwyNCArMTI4OSwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYWRkVjFTaWduYXR1cmUoYXBrU2lnbmVyLCBhZGRWMVNpZ25hdHVyZVJlcXVlc3QsIG91dHB1dEphciwgdGltZXN0YW1wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFYxU2lnbmF0dXJlUmVxdWVzdC5kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0SmFyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdjFTaWduZWRBcGsgPSBCeXRlQnVmZmVyLndyYXAodjFTaWduZWRBcGtCdWYudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHYxU2lnbmVkQXBrQnVmLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSBvdXRwdXRDaHVua3MgPSBuZXcgQnl0ZUJ1ZmZlcltdIHt2MVNpZ25lZEFwa307CiAKLSAgICAgICAgICAgICAgICAgICAgWmlwU2VjdGlvbnMgemlwU2VjdGlvbnMgPSBmaW5kTWFpblppcFNlY3Rpb25zKHYxU2lnbmVkQXBrKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2Ugb3V0cHV0IGFuZCBzd2l0Y2ggdG8gaW5wdXQgbW9kZQorICAgICAgICAgICAgICAgICAgICBvdXRwdXRKYXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0SmFyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0SmFyQ291bnRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHYxU2lnbmVkQXBrID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUob3V0cHV0RmlsZW5hbWUsICJyIik7CisKKyAgICAgICAgICAgICAgICAgICAgWmlwU2VjdGlvbnMgemlwU2VjdGlvbnMgPSBmaW5kTWFpblppcFNlY3Rpb25zKERhdGFTb3VyY2VzLmFzRGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MVNpZ25lZEFwaykpOwogCiAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZW9jZCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoemlwU2VjdGlvbnMuZW9jZC5yZW1haW5pbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIGVvY2QucHV0KHppcFNlY3Rpb25zLmVvY2QpOwogICAgICAgICAgICAgICAgICAgICBlb2NkLmZsaXAoKTsKICAgICAgICAgICAgICAgICAgICAgZW9jZC5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CisKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIG91dHB1dENodW5rcyA9IG5ldyBCeXRlQnVmZmVyW10ge307CisKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsb29wIGlzIHN1cHBvc2VkIHRvIGJlIGl0ZXJhdGVkIHR3aWNlIGF0IG1vc3QuCiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZWNvbmQgcGFzcyBpcyB0byBhbGlnbiB0aGUgZmlsZSBzaXplIGFmdGVyIGFtZW5kaW5nIEVPQ0QgY29tbWVudHMKICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBhc3N1bXB0aW9uIHRoYXQgcmUtZ2VuZXJhdGVkIHNpZ25pbmcgYmxvY2sgd291bGQgYmUgdGhlIHNhbWUgc2l6ZS4KICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFwa1NpZ25lckVuZ2luZS5PdXRwdXRBcGtTaWduaW5nQmxvY2tSZXF1ZXN0MiBhZGRWMlNpZ25hdHVyZVJlcXVlc3QgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGtTaWduZXIub3V0cHV0WmlwU2VjdGlvbnMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VzLmFzRGF0YVNvdXJjZSh6aXBTZWN0aW9ucy5iZWZvcmVDZW50cmFsRGlyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBTZWN0aW9ucy5iZWZvcmVDZW50cmFsRGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VzLmFzRGF0YVNvdXJjZSh6aXBTZWN0aW9ucy5jZW50cmFsRGlyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlcy5hc0RhdGFTb3VyY2UoZW9jZCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZFYyU2lnbmF0dXJlUmVxdWVzdCA9PSBudWxsKSBicmVhazsKQEAgLTEzMzAsMTEgKzEzMzEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW9jZC5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CiAgICAgICAgICAgICAgICAgICAgICAgICBBcGtVdGlscy5zZXRaaXBFb2NkQ2VudHJhbERpcmVjdG9yeU9mZnNldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFb2NkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBTZWN0aW9ucy5iZWZvcmVDZW50cmFsRGlyLnJlbWFpbmluZygpICsgcGFkZGluZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcFNlY3Rpb25zLmJlZm9yZUNlbnRyYWxEaXIuc2l6ZSgpICsgcGFkZGluZyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwa1NpZ25pbmdCbG9jay5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q2h1bmtzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWZmZXJbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwU2VjdGlvbnMuYmVmb3JlQ2VudHJhbERpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLmFsbG9jYXRlKHBhZGRpbmcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIud3JhcChhcGtTaWduaW5nQmxvY2spLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcFNlY3Rpb25zLmNlbnRyYWxEaXIsCkBAIC0xMzQ4LDcgKzEzNDgsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGZpbGUgc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgZW9jZCA9IG1vZGlmaWVkRW9jZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGZpbGVTaXplID0gemlwU2VjdGlvbnMuYmVmb3JlQ2VudHJhbERpclNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgYnVmIDogb3V0cHV0Q2h1bmtzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUgKz0gYnVmLnJlbWFpbmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTM1Nyw3ICsxMzU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhZCBFT0NEIGNvbW1lbnQgdG8gYWxpZ24gdGhlIGZpbGUgc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21tZW50TGVuID0gYWxpZ25tZW50IC0gZmlsZVNpemUgJSBhbGlnbm1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tbWVudExlbiA9IGFsaWdubWVudCAtIChpbnQpKGZpbGVTaXplICUgYWxpZ25tZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW9jZCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoZW9jZC5yZW1haW5pbmcoKSArIGNvbW1lbnRMZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFb2NkLnB1dChlb2NkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW9jZC5yZXdpbmQoKTsKQEAgLTEzNjgsNiArMTM2OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZW9jZCA9IG1vZGlmaWVkRW9jZDsKICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIGlucHV0IGFuZCBzd2l0Y2ggYmFjayB0byBvdXRwdXQgbW9kZQorICAgICAgICAgICAgICAgICAgICB2MVNpZ25lZEFway5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB2MVNpZ25lZEFwayA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlbmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUuZ2V0Q2hhbm5lbCgpLnRydW5jYXRlKHppcFNlY3Rpb25zLmJlZm9yZUNlbnRyYWxEaXJTaXplKTsKKwogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFzc3VtZXMgb3V0cHV0Q2h1bmtzIGFyZSBhcnJheS1iYWNrZWQuIFRvIGF2b2lkIHRoaXMgYXNzdW1wdGlvbiwgdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgY291bGQgYmUgcmV3cml0dGVuIHRvIHVzZSBGaWxlQ2hhbm5lbC4KICAgICAgICAgICAgICAgICAgICAgZm9yIChCeXRlQnVmZmVyIG91dHB1dENodW5rIDogb3V0cHV0Q2h1bmtzKSB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0X3Bvc3RfcHJvY2Vzc19wcm9wcy5weSBiL3Rvb2xzL3Rlc3RfcG9zdF9wcm9jZXNzX3Byb3BzLnB5CmluZGV4IDQzOWZjOWYuLjJhZGRlZmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3RfcG9zdF9wcm9jZXNzX3Byb3BzLnB5CisrKyBiL3Rvb2xzL3Rlc3RfcG9zdF9wcm9jZXNzX3Byb3BzLnB5CkBAIC0yNTUsMjkgKzI1NSwxNyBAQAogICAgIHN0ZGVycl9yZWRpcmVjdCA9IGlvLlN0cmluZ0lPKCkKICAgICB3aXRoIGNvbnRleHRsaWIucmVkaXJlY3Rfc3RkZXJyKHN0ZGVycl9yZWRpcmVjdCk6CiAgICAgICBwcm9wcyA9IFByb3BMaXN0KCJoZWxsbyIpCi0gICAgICBwcm9wcy5wdXQoInJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCIsIjI1IikKKyAgICAgIHByb3BzLnB1dCgicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIiwiMjAyNTA0IikKICAgICAgIHByb3BzLnB1dCgicm8uYnVpbGQudmVyc2lvbi5jb2RlbmFtZSIsICJSRUwiKQogCi0gICAgICAjIHJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2RrIHZlcnNpb24KLSAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BzLCAyMCkpCi0gICAgICBzZWxmLmFzc2VydFRydWUodmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BzLCAyNikpCi0gICAgICBzZWxmLmFzc2VydFRydWUodmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BzLCAzNSkpCi0KICAgICAgICMgbWFudWFsbHkgc2V0IHJvLmJvYXJkLmFwaV9sZXZlbCB0byBhbiBpbnZhbGlkIHZhbHVlCi0gICAgICBwcm9wcy5wdXQoInJvLmJvYXJkLmFwaV9sZXZlbCIsIjIwIikKLSAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BzLCAyNikpCisgICAgICBwcm9wcy5wdXQoInJvLmJvYXJkLmFwaV9sZXZlbCIsIjIwMjQwNCIpCisgICAgICBzZWxmLmFzc2VydEZhbHNlKHZhbGlkYXRlX2dyZl9wcm9wcyhwcm9wcykpCiAKICAgICAgIHByb3BzLmdldF9hbGxfcHJvcHMoKVstMV0ubWFrZV9hc19jb21tZW50KCkKICAgICAgICMgbWFudWFsbHkgc2V0IHJvLmJvYXJkLmFwaV9sZXZlbCB0byBhIHZhbGlkIHZhbHVlCi0gICAgICBwcm9wcy5wdXQoInJvLmJvYXJkLmFwaV9sZXZlbCIsIjI2IikKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWxpZGF0ZV9ncmZfcHJvcHMocHJvcHMsIDI2KSkKLSAgICAgICMgcm8uYm9hcmQuYXBpX2xldmVsIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZGsgdmVyc2lvbgotICAgICAgc2VsZi5hc3NlcnRGYWxzZSh2YWxpZGF0ZV9ncmZfcHJvcHMocHJvcHMsIDI1KSkKLQotICAgICAgIyBhbGxvdyBzZXR0aW5nIGZ1dHVyZSBhcGlfbGV2ZWwgYmVmb3JlIHJlbGVhc2UKLSAgICAgIHByb3BzLmdldF9hbGxfcHJvcHMoKVstMl0ubWFrZV9hc19jb21tZW50KCkKLSAgICAgIHByb3BzLnB1dCgicm8uYnVpbGQudmVyc2lvbi5jb2RlbmFtZSIsICJOb25SZWwiKQotICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkYXRlX2dyZl9wcm9wcyhwcm9wcywgMjQpKQorICAgICAgcHJvcHMucHV0KCJyby5ib2FyZC5hcGlfbGV2ZWwiLCIyMDI1MDQiKQorICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkYXRlX2dyZl9wcm9wcyhwcm9wcykpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL0FuZHJvaWQuYnAgYi90b29scy90b29sX2V2ZW50X2xvZ2dlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWQyYWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90b29sX2V2ZW50X2xvZ2dlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFNldCBvZiBlcnJvciBwcm9uZSBydWxlcyB0byBlbnN1cmUgY29kZSBxdWFsaXR5CisvLyBQYWNrYWdlTG9jYXRpb24gY2hlY2sgcmVxdWlyZXMgdGhlIGFuZHJvaWRDb21wYXRpYmxlPWZhbHNlIG90aGVyd2lzZSBpdCBkb2VzIG5vdCBkbyBhbnl0aGluZy4KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorICAgIGRlZmF1bHRfdGVhbTogInRyZW5keV90ZWFtX2FkdGUiLAorfQorCitweXRob25fbGlicmFyeV9ob3N0IHsKKyAgICBuYW1lOiAidG9vbF9ldmVudF9wcm90byIsCisgICAgc3JjczogWworICAgICAgICAicHJvdG8vdG9vbF9ldmVudC5wcm90byIsCisgICAgXSwKKyAgICBwcm90bzogeworICAgICAgICBjYW5vbmljYWxfcGF0aF9mcm9tX3Jvb3Q6IGZhbHNlLAorICAgIH0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogInRvb2xfZXZlbnRfbG9nZ2VyIiwKKyAgICBwa2dfcGF0aDogInRvb2xfZXZlbnRfbG9nZ2VyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0b29sX2V2ZW50X2xvZ2dlci5weSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJhc3VpdGVfY2NfY2xpZW50IiwKKyAgICAgICAgInRvb2xfZXZlbnRfcHJvdG8iLAorICAgIF0sCisgICAgbWFpbjogInRvb2xfZXZlbnRfbG9nZ2VyLnB5IiwKK30KKworcHl0aG9uX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogInRvb2xfZXZlbnRfbG9nZ2VyX3Rlc3QiLAorICAgIG1haW46ICJ0b29sX2V2ZW50X2xvZ2dlcl90ZXN0LnB5IiwKKyAgICBwa2dfcGF0aDogInRvb2xfZXZlbnRfbG9nZ2VyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0b29sX2V2ZW50X2xvZ2dlci5weSIsCisgICAgICAgICJ0b29sX2V2ZW50X2xvZ2dlcl90ZXN0LnB5IiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKKyAgICBsaWJzOiBbCisgICAgICAgICJhc3VpdGVfY2NfY2xpZW50IiwKKyAgICAgICAgInRvb2xfZXZlbnRfcHJvdG8iLAorICAgIF0sCisgICAgdmVyc2lvbjogeworICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAorICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvT1dORVJTIGIvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OTJjOWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90b29sX2V2ZW50X2xvZ2dlci9PV05FUlMKQEAgLTAsMCArMSw0IEBACitpbmNsdWRlIHBsYXRmb3JtL3Rvb2xzL2FzdWl0ZTovT1dORVJTCisKK3podW95YW9AZ29vZ2xlLmNvbQoraHphbGVrQGdvb2dsZS5jb20KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy90b29sX2V2ZW50X2xvZ2dlci9wcm90by90b29sX2V2ZW50LnByb3RvIGIvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvcHJvdG8vdG9vbF9ldmVudC5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjcxZWFjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvcHJvdG8vdG9vbF9ldmVudC5wcm90bwpAQCAtMCwwICsxLDM3IEBACitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSB0b29scy5hc3VpdGUudG9vbF9ldmVudF9sb2dnZXI7CisKK21lc3NhZ2UgVG9vbEV2ZW50IHsKKyAgLy8gT2NjdXJzIGltbWVkaWF0ZWx5IHVwb24gZXhlY3V0aW9uIG9mIHRoZSB0b29sLgorICBtZXNzYWdlIEludm9jYXRpb25TdGFydGVkIHsKKyAgICBzdHJpbmcgY29tbWFuZF9hcmdzID0gMTsKKyAgICBzdHJpbmcgY3dkID0gMjsKKyAgICBzdHJpbmcgb3MgPSAzOworICB9CisKKyAgLy8gT2NjdXJzIHdoZW4gdG9vbCBleGl0cyBmb3IgYW55IHJlYXNvbi4KKyAgbWVzc2FnZSBJbnZvY2F0aW9uU3RvcHBlZCB7CisgICAgaW50MzIgZXhpdF9jb2RlID0gMjsKKyAgICBzdHJpbmcgZXhpdF9sb2cgPSAzOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEZJRUxEUyBGT1IgVG9vbEV2ZW50CisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBSYW5kb20gc3RyaW5nIGdlbmVyYXRlZCB0byBpZGVudGlmeSB0aGUgaW52b2NhdGlvbi4KKyAgc3RyaW5nIGludm9jYXRpb25faWQgPSAxOworICAvLyBJbnRlcm5hbCB1c2VyIG5hbWUuCisgIHN0cmluZyB1c2VyX25hbWUgPSAyOworICAvLyBUaGUgcm9vdCBvZiBBbmRyb2lkIHNvdXJjZS4KKyAgc3RyaW5nIHNvdXJjZV9yb290ID0gMzsKKyAgLy8gTmFtZSBvZiB0aGUgdG9vbCB1c2VkLgorICBzdHJpbmcgdG9vbF90YWcgPSA2OworICAvLyBOYW1lIG9mIHRoZSBob3N0IHdvcmtzdGF0aW9uLgorICBzdHJpbmcgaG9zdF9uYW1lID0gNzsKKworICBvbmVvZiBldmVudCB7CisgICAgSW52b2NhdGlvblN0YXJ0ZWQgaW52b2NhdGlvbl9zdGFydGVkID0gNDsKKyAgICBJbnZvY2F0aW9uU3RvcHBlZCBpbnZvY2F0aW9uX3N0b3BwZWQgPSA1OworICB9Cit9CmRpZmYgLS1naXQgYS90b29scy90b29sX2V2ZW50X2xvZ2dlci90b29sX2V2ZW50X2xvZ2dlci5weSBiL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL3Rvb2xfZXZlbnRfbG9nZ2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDlkOTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90b29sX2V2ZW50X2xvZ2dlci90b29sX2V2ZW50X2xvZ2dlci5weQpAQCAtMCwwICsxLDIzMyBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgZ2V0cGFzcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1dWlkCisKK2Zyb20gYXRlc3QubWV0cmljcyBpbXBvcnQgY2xlYXJjdXRfY2xpZW50Citmcm9tIGF0ZXN0LnByb3RvIGltcG9ydCBjbGllbnRhbmFseXRpY3NfcGIyCitmcm9tIHByb3RvIGltcG9ydCB0b29sX2V2ZW50X3BiMgorCitMT0dfU09VUkNFID0gMjM5NQorCisKK2NsYXNzIFRvb2xFdmVudExvZ2dlcjoKKyAgIiIiTG9ncyB0b29sIGV2ZW50cyB0byBTYXdtaWxsIHRocm91Z2ggQ2xlYXJjdXQuIiIiCisKKyAgZGVmIF9faW5pdF9fKAorICAgICAgc2VsZiwKKyAgICAgIHRvb2xfdGFnOiBzdHIsCisgICAgICBpbnZvY2F0aW9uX2lkOiBzdHIsCisgICAgICB1c2VyX25hbWU6IHN0ciwKKyAgICAgIGhvc3RfbmFtZTogc3RyLAorICAgICAgc291cmNlX3Jvb3Q6IHN0ciwKKyAgICAgIHBsYXRmb3JtX3ZlcnNpb246IHN0ciwKKyAgICAgIHB5dGhvbl92ZXJzaW9uOiBzdHIsCisgICAgICBjbGllbnQ6IGNsZWFyY3V0X2NsaWVudC5DbGVhcmN1dCwKKyAgKToKKyAgICBzZWxmLnRvb2xfdGFnID0gdG9vbF90YWcKKyAgICBzZWxmLmludm9jYXRpb25faWQgPSBpbnZvY2F0aW9uX2lkCisgICAgc2VsZi51c2VyX25hbWUgPSB1c2VyX25hbWUKKyAgICBzZWxmLmhvc3RfbmFtZSA9IGhvc3RfbmFtZQorICAgIHNlbGYuc291cmNlX3Jvb3QgPSBzb3VyY2Vfcm9vdAorICAgIHNlbGYucGxhdGZvcm1fdmVyc2lvbiA9IHBsYXRmb3JtX3ZlcnNpb24KKyAgICBzZWxmLnB5dGhvbl92ZXJzaW9uID0gcHl0aG9uX3ZlcnNpb24KKyAgICBzZWxmLl9jbGVhcmN1dF9jbGllbnQgPSBjbGllbnQKKworICBAY2xhc3NtZXRob2QKKyAgZGVmIGNyZWF0ZShjbHMsIHRvb2xfdGFnOiBzdHIpOgorICAgIHJldHVybiBUb29sRXZlbnRMb2dnZXIoCisgICAgICAgIHRvb2xfdGFnPXRvb2xfdGFnLAorICAgICAgICBpbnZvY2F0aW9uX2lkPXN0cih1dWlkLnV1aWQ0KCkpLAorICAgICAgICB1c2VyX25hbWU9Z2V0cGFzcy5nZXR1c2VyKCksCisgICAgICAgIGhvc3RfbmFtZT1wbGF0Zm9ybS5ub2RlKCksCisgICAgICAgIHNvdXJjZV9yb290PW9zLmVudmlyb24uZ2V0KCdBTkRST0lEX0JVSUxEX1RPUCcsICcnKSwKKyAgICAgICAgcGxhdGZvcm1fdmVyc2lvbj1wbGF0Zm9ybS5wbGF0Zm9ybSgpLAorICAgICAgICBweXRob25fdmVyc2lvbj1wbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLAorICAgICAgICBjbGllbnQ9Y2xlYXJjdXRfY2xpZW50LkNsZWFyY3V0KExPR19TT1VSQ0UpLAorICAgICkKKworICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgIHJldHVybiBzZWxmCisKKyAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgorICAgIHNlbGYuZmx1c2goKQorCisgIGRlZiBsb2dfaW52b2NhdGlvbl9zdGFydGVkKHNlbGYsIGV2ZW50X3RpbWU6IGRhdGV0aW1lLCBjb21tYW5kX2FyZ3M6IHN0cik6CisgICAgIiIiQ3JlYXRlcyBhbiBldmVudCBsb2cgd2l0aCBpbnZvY2F0aW9uIHN0YXJ0ZWQgaW5mby4iIiIKKyAgICBldmVudCA9IHNlbGYuX2NyZWF0ZV90b29sX2V2ZW50KCkKKyAgICBldmVudC5pbnZvY2F0aW9uX3N0YXJ0ZWQuQ29weUZyb20oCisgICAgICAgIHRvb2xfZXZlbnRfcGIyLlRvb2xFdmVudC5JbnZvY2F0aW9uU3RhcnRlZCgKKyAgICAgICAgICAgIGNvbW1hbmRfYXJncz1jb21tYW5kX2FyZ3MsCisgICAgICAgICAgICBvcz1mJ3tzZWxmLnBsYXRmb3JtX3ZlcnNpb259OntzZWxmLnB5dGhvbl92ZXJzaW9ufScsCisgICAgICAgICkKKyAgICApCisKKyAgICBsb2dnaW5nLmRlYnVnKCdMb2cgaW52b2NhdGlvbl9zdGFydGVkOiAlcycsIGV2ZW50KQorICAgIHNlbGYuX2xvZ19jbGVhcmN1dF9ldmVudChldmVudCwgZXZlbnRfdGltZSkKKworICBkZWYgbG9nX2ludm9jYXRpb25fc3RvcHBlZCgKKyAgICAgIHNlbGYsCisgICAgICBldmVudF90aW1lOiBkYXRldGltZSwKKyAgICAgIGV4aXRfY29kZTogaW50LAorICAgICAgZXhpdF9sb2c6IHN0ciwKKyAgKToKKyAgICAiIiJDcmVhdGVzIGFuIGV2ZW50IGxvZyB3aXRoIGludm9jYXRpb24gc3RvcHBlZCBpbmZvLiIiIgorICAgIGV2ZW50ID0gc2VsZi5fY3JlYXRlX3Rvb2xfZXZlbnQoKQorICAgIGV2ZW50Lmludm9jYXRpb25fc3RvcHBlZC5Db3B5RnJvbSgKKyAgICAgICAgdG9vbF9ldmVudF9wYjIuVG9vbEV2ZW50Lkludm9jYXRpb25TdG9wcGVkKAorICAgICAgICAgICAgZXhpdF9jb2RlPWV4aXRfY29kZSwKKyAgICAgICAgICAgIGV4aXRfbG9nPWV4aXRfbG9nLAorICAgICAgICApCisgICAgKQorCisgICAgbG9nZ2luZy5kZWJ1ZygnTG9nIGludm9jYXRpb25fc3RvcHBlZDogJXMnLCBldmVudCkKKyAgICBzZWxmLl9sb2dfY2xlYXJjdXRfZXZlbnQoZXZlbnQsIGV2ZW50X3RpbWUpCisKKyAgZGVmIGZsdXNoKHNlbGYpOgorICAgICIiIlNlbmRzIGFsbCBiYXRjaGVkIGV2ZW50cyB0byBDbGVhcmN1dC4iIiIKKyAgICBsb2dnaW5nLmRlYnVnKCdTZW5kaW5nIGV2ZW50cyB0byBDbGVhcmN1dC4nKQorICAgIHNlbGYuX2NsZWFyY3V0X2NsaWVudC5mbHVzaF9ldmVudHMoKQorCisgIGRlZiBfY3JlYXRlX3Rvb2xfZXZlbnQoc2VsZik6CisgICAgcmV0dXJuIHRvb2xfZXZlbnRfcGIyLlRvb2xFdmVudCgKKyAgICAgICAgdG9vbF90YWc9c2VsZi50b29sX3RhZywKKyAgICAgICAgaW52b2NhdGlvbl9pZD1zZWxmLmludm9jYXRpb25faWQsCisgICAgICAgIHVzZXJfbmFtZT1zZWxmLnVzZXJfbmFtZSwKKyAgICAgICAgaG9zdF9uYW1lPXNlbGYuaG9zdF9uYW1lLAorICAgICAgICBzb3VyY2Vfcm9vdD1zZWxmLnNvdXJjZV9yb290LAorICAgICkKKworICBkZWYgX2xvZ19jbGVhcmN1dF9ldmVudCgKKyAgICAgIHNlbGYsIHRvb2xfZXZlbnQ6IHRvb2xfZXZlbnRfcGIyLlRvb2xFdmVudCwgZXZlbnRfdGltZTogZGF0ZXRpbWUKKyAgKToKKyAgICBsb2dfZXZlbnQgPSBjbGllbnRhbmFseXRpY3NfcGIyLkxvZ0V2ZW50KAorICAgICAgICBldmVudF90aW1lX21zPWludChldmVudF90aW1lLnRpbWVzdGFtcCgpICogMTAwMCksCisgICAgICAgIHNvdXJjZV9leHRlbnNpb249dG9vbF9ldmVudC5TZXJpYWxpemVUb1N0cmluZygpLAorICAgICkKKyAgICBzZWxmLl9jbGVhcmN1dF9jbGllbnQubG9nKGxvZ19ldmVudCkKKworCitjbGFzcyBBcmd1bWVudFBhcnNlcldpdGhMb2dnaW5nKGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKToKKworICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CisgICAgbG9nZ2luZy5lcnJvcignRmFpbGVkIHRvIHBhcnNlIGFyZ3Mgd2l0aCBlcnJvcjogJXMnLCBtZXNzYWdlKQorICAgIHN1cGVyKCkuZXJyb3IobWVzc2FnZSkKKworCitkZWYgY3JlYXRlX2FyZ19wYXJzZXIoKToKKyAgIiIiQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBUb29sRXZlbnRMb2dnZXIgYXJnIHBhcnNlci4iIiIKKworICBwYXJzZXIgPSBBcmd1bWVudFBhcnNlcldpdGhMb2dnaW5nKAorICAgICAgZGVzY3JpcHRpb249J0J1aWxkIGFuZCB1cGxvYWQgbG9ncyBmb3IgQW5kcm9pZCBkZXYgdG9vbHMnLAorICAgICAgYWRkX2hlbHA9VHJ1ZSwKKyAgICAgIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIsCisgICkKKworICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tdG9vbF90YWcnLAorICAgICAgdHlwZT1zdHIsCisgICAgICByZXF1aXJlZD1UcnVlLAorICAgICAgaGVscD0nTmFtZSBvZiB0aGUgdG9vbC4nLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLXN0YXJ0X3RpbWVzdGFtcCcsCisgICAgICB0eXBlPWxhbWJkYSB0czogZGF0ZXRpbWUuZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChmbG9hdCh0cykpLAorICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgIGhlbHA9KAorICAgICAgICAgICdUaW1lc3RhbXAgd2hlbiB0aGUgdG9vbCBzdGFydHMuIFRoZSB0aW1lc3RhbXAgc2hvdWxkIGhhdmUgdGhlIGZvcm1hdCcKKyAgICAgICAgICAnJXMuJU4gd2hpY2ggcmVwcmVzZW50cyB0aGUgc2Vjb25kcyBlbGFwc2VzIHNpbmNlIGVwb2NoLicKKyAgICAgICksCisgICkKKworICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tZW5kX3RpbWVzdGFtcCcsCisgICAgICB0eXBlPWxhbWJkYSB0czogZGF0ZXRpbWUuZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChmbG9hdCh0cykpLAorICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgIGhlbHA9KAorICAgICAgICAgICdUaW1lc3RhbXAgd2hlbiB0aGUgdG9vbCBleGl0cy4gVGhlIHRpbWVzdGFtcCBzaG91bGQgaGF2ZSB0aGUgZm9ybWF0JworICAgICAgICAgICclcy4lTiB3aGljaCByZXByZXNlbnRzIHRoZSBzZWNvbmRzIGVsYXBzZXMgc2luY2UgZXBvY2guJworICAgICAgKSwKKyAgKQorCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLS10b29sX2FyZ3MnLAorICAgICAgdHlwZT1zdHIsCisgICAgICBoZWxwPSdQYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgdG9vbC4nLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLWV4aXRfY29kZScsCisgICAgICB0eXBlPWludCwKKyAgICAgIHJlcXVpcmVkPVRydWUsCisgICAgICBoZWxwPSdUb29sIGV4aXQgY29kZS4nLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLWV4aXRfbG9nJywKKyAgICAgIHR5cGU9c3RyLAorICAgICAgaGVscD0nTG9ncyB3aGVuIHRvb2wgZXhpdHMuJywKKyAgKQorCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLS1kcnlfcnVuJywKKyAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICBoZWxwPSdEcnkgcnVuIHRoZSB0b29sIGV2ZW50IGxvZ2dlciBpZiBzZXQuJywKKyAgKQorCisgIHJldHVybiBwYXJzZXIKKworCitkZWYgY29uZmlndXJlX2xvZ2dpbmcoKToKKyAgcm9vdF9sb2dnaW5nX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PSd0b29sX2V2ZW50X2xvZ2dlcl8nKQorCisgIGxvZ19mbXQgPSAnJShhc2N0aW1lKXMgJShmaWxlbmFtZSlzOiUobGluZW5vKXM6JShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMnCisgIGRhdGVfZm10ID0gJyVZLSVtLSVkICVIOiVNOiVTJworICBfLCBsb2dfcGF0aCA9IHRlbXBmaWxlLm1rc3RlbXAoZGlyPXJvb3RfbG9nZ2luZ19kaXIsIHN1ZmZpeD0nLmxvZycpCisKKyAgbG9nZ2luZy5iYXNpY0NvbmZpZygKKyAgICAgIGZpbGVuYW1lPWxvZ19wYXRoLCBsZXZlbD1sb2dnaW5nLkRFQlVHLCBmb3JtYXQ9bG9nX2ZtdCwgZGF0ZWZtdD1kYXRlX2ZtdAorICApCisKKworZGVmIG1haW4oYXJndjogbGlzdFtzdHJdKToKKyAgYXJncyA9IGNyZWF0ZV9hcmdfcGFyc2VyKCkucGFyc2VfYXJncyhhcmd2WzE6XSkKKworICBpZiBhcmdzLmRyeV9ydW46CisgICAgbG9nZ2luZy5kZWJ1ZygnVGhpcyBpcyBhIGRyeSBydW4uJykKKyAgICByZXR1cm4KKworICB0cnk6CisgICAgd2l0aCBUb29sRXZlbnRMb2dnZXIuY3JlYXRlKGFyZ3MudG9vbF90YWcpIGFzIGxvZ2dlcjoKKyAgICAgIGxvZ2dlci5sb2dfaW52b2NhdGlvbl9zdGFydGVkKGFyZ3Muc3RhcnRfdGltZXN0YW1wLCBhcmdzLnRvb2xfYXJncykKKyAgICAgIGxvZ2dlci5sb2dfaW52b2NhdGlvbl9zdG9wcGVkKAorICAgICAgICAgIGFyZ3MuZW5kX3RpbWVzdGFtcCwgYXJncy5leGl0X2NvZGUsIGFyZ3MuZXhpdF9sb2cKKyAgICAgICkKKyAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgIGxvZ2dpbmcuZXJyb3IoJ0xvZyBmYWlsZWQgd2l0aCB1bmV4cGVjdGVkIGVycm9yOiAlcycsIGUpCisgICAgcmFpc2UKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBjb25maWd1cmVfbG9nZ2luZygpCisgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS90b29scy90b29sX2V2ZW50X2xvZ2dlci90b29sX2V2ZW50X2xvZ2dlcl90ZXN0LnB5IGIvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvdG9vbF9ldmVudF9sb2dnZXJfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODg4MTJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvdG9vbF9ldmVudF9sb2dnZXJfdGVzdC5weQpAQCAtMCwwICsxLDIxMiBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJVbml0dGVzdHMgZm9yIFRvb2xFdmVudExvZ2dlci4iIiIKKworaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCisKK2Zyb20gYXRlc3QubWV0cmljcyBpbXBvcnQgY2xlYXJjdXRfY2xpZW50Citmcm9tIHByb3RvIGltcG9ydCB0b29sX2V2ZW50X3BiMgorZnJvbSB0b29sX2V2ZW50X2xvZ2dlciBpbXBvcnQgdG9vbF9ldmVudF9sb2dnZXIKKworVEVTVF9JTlZPQ0FUSU9OX0lEID0gJ3Rlc3RfaW52b2NhdGlvbl9pZCcKK1RFU1RfVVNFUl9OQU1FID0gJ3Rlc3RfdXNlcicKK1RFU1RfSE9TVF9OQU1FID0gJ3Rlc3RfaG9zdF9uYW1lJworVEVTVF9UT09MX1RBRyA9ICd0ZXN0X3Rvb2wnCitURVNUX1NPVVJDRV9ST09UID0gJ3Rlc3Rfc291cmNlX3Jvb3QnCitURVNUX1BMQVRGT1JNX1ZFUlNJT04gPSAndGVzdF9wbGF0Zm9ybV92ZXJzaW9uJworVEVTVF9QWVRIT05fVkVSU0lPTiA9ICd0ZXN0X3B5dGhvbl92ZXJzaW9uJworVEVTVF9FVkVOVF9USU1FU1RBTVAgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQorCisKK2NsYXNzIFRvb2xFdmVudExvZ2dlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzdXBlcigpLnNldFVwKCkKKyAgICBzZWxmLmNsZWFyY3V0X2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgc2VsZi5sb2dnZXIgPSB0b29sX2V2ZW50X2xvZ2dlci5Ub29sRXZlbnRMb2dnZXIoCisgICAgICAgIFRFU1RfVE9PTF9UQUcsCisgICAgICAgIFRFU1RfSU5WT0NBVElPTl9JRCwKKyAgICAgICAgVEVTVF9VU0VSX05BTUUsCisgICAgICAgIFRFU1RfSE9TVF9OQU1FLAorICAgICAgICBURVNUX1NPVVJDRV9ST09ULAorICAgICAgICBURVNUX1BMQVRGT1JNX1ZFUlNJT04sCisgICAgICAgIFRFU1RfUFlUSE9OX1ZFUlNJT04sCisgICAgICAgIGNsaWVudD1zZWxmLmNsZWFyY3V0X2NsaWVudCwKKyAgICApCisKKyAgZGVmIHRlc3RfbG9nX2V2ZW50X3RpbWVzdGFtcChzZWxmKToKKyAgICB3aXRoIHNlbGYubG9nZ2VyOgorICAgICAgc2VsZi5sb2dnZXIubG9nX2ludm9jYXRpb25fc3RhcnRlZCgKKyAgICAgICAgICBkYXRldGltZS5kYXRldGltZS5mcm9tdGltZXN0YW1wKDEwMC4xMDEpLCAndGVzdF9jb21tYW5kJworICAgICAgKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgc2VsZi5jbGVhcmN1dF9jbGllbnQuZ2V0X2xhc3Rfc2VudF9ldmVudCgpLmV2ZW50X3RpbWVfbXMsIDEwMDEwMQorICAgICkKKworICBkZWYgdGVzdF9sb2dfZXZlbnRfYmFzaWNfaW5mb3JtYXRpb24oc2VsZik6CisgICAgd2l0aCBzZWxmLmxvZ2dlcjoKKyAgICAgIHNlbGYubG9nZ2VyLmxvZ19pbnZvY2F0aW9uX3N0YXJ0ZWQoVEVTVF9FVkVOVF9USU1FU1RBTVAsICd0ZXN0X2NvbW1hbmQnKQorCisgICAgc2VudF9ldmVudCA9IHNlbGYuY2xlYXJjdXRfY2xpZW50LmdldF9sYXN0X3NlbnRfZXZlbnQoKQorICAgIGxvZ19ldmVudCA9IHRvb2xfZXZlbnRfcGIyLlRvb2xFdmVudC5Gcm9tU3RyaW5nKHNlbnRfZXZlbnQuc291cmNlX2V4dGVuc2lvbikKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ19ldmVudC5pbnZvY2F0aW9uX2lkLCBURVNUX0lOVk9DQVRJT05fSUQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsb2dfZXZlbnQudXNlcl9uYW1lLCBURVNUX1VTRVJfTkFNRSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ19ldmVudC5ob3N0X25hbWUsIFRFU1RfSE9TVF9OQU1FKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nX2V2ZW50LnRvb2xfdGFnLCBURVNUX1RPT0xfVEFHKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nX2V2ZW50LnNvdXJjZV9yb290LCBURVNUX1NPVVJDRV9ST09UKQorCisgIGRlZiB0ZXN0X2xvZ19pbnZvY2F0aW9uX3N0YXJ0ZWQoc2VsZik6CisgICAgZXhwZWN0ZWRfaW52b2NhdGlvbl9zdGFydGVkID0gdG9vbF9ldmVudF9wYjIuVG9vbEV2ZW50Lkludm9jYXRpb25TdGFydGVkKAorICAgICAgICBjb21tYW5kX2FyZ3M9J3Rlc3RfY29tbWFuZCcsCisgICAgICAgIG9zPVRFU1RfUExBVEZPUk1fVkVSU0lPTiArICc6JyArIFRFU1RfUFlUSE9OX1ZFUlNJT04sCisgICAgKQorCisgICAgd2l0aCBzZWxmLmxvZ2dlcjoKKyAgICAgIHNlbGYubG9nZ2VyLmxvZ19pbnZvY2F0aW9uX3N0YXJ0ZWQoVEVTVF9FVkVOVF9USU1FU1RBTVAsICd0ZXN0X2NvbW1hbmQnKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsZWFyY3V0X2NsaWVudC5nZXRfbnVtYmVyX29mX3NlbnRfZXZlbnRzKCksIDEpCisgICAgc2VudF9ldmVudCA9IHNlbGYuY2xlYXJjdXRfY2xpZW50LmdldF9sYXN0X3NlbnRfZXZlbnQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGV4cGVjdGVkX2ludm9jYXRpb25fc3RhcnRlZCwKKyAgICAgICAgdG9vbF9ldmVudF9wYjIuVG9vbEV2ZW50LkZyb21TdHJpbmcoCisgICAgICAgICAgICBzZW50X2V2ZW50LnNvdXJjZV9leHRlbnNpb24KKyAgICAgICAgKS5pbnZvY2F0aW9uX3N0YXJ0ZWQsCisgICAgKQorCisgIGRlZiB0ZXN0X2xvZ19pbnZvY2F0aW9uX3N0b3BwZWQoc2VsZik6CisgICAgZXhwZWN0ZWRfaW52b2NhdGlvbl9zdG9wcGVkID0gdG9vbF9ldmVudF9wYjIuVG9vbEV2ZW50Lkludm9jYXRpb25TdG9wcGVkKAorICAgICAgICBleGl0X2NvZGU9MCwKKyAgICAgICAgZXhpdF9sb2c9J2V4aXRfbG9nJywKKyAgICApCisKKyAgICB3aXRoIHNlbGYubG9nZ2VyOgorICAgICAgc2VsZi5sb2dnZXIubG9nX2ludm9jYXRpb25fc3RvcHBlZChURVNUX0VWRU5UX1RJTUVTVEFNUCwgMCwgJ2V4aXRfbG9nJykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGVhcmN1dF9jbGllbnQuZ2V0X251bWJlcl9vZl9zZW50X2V2ZW50cygpLCAxKQorICAgIHNlbnRfZXZlbnQgPSBzZWxmLmNsZWFyY3V0X2NsaWVudC5nZXRfbGFzdF9zZW50X2V2ZW50KCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBleHBlY3RlZF9pbnZvY2F0aW9uX3N0b3BwZWQsCisgICAgICAgIHRvb2xfZXZlbnRfcGIyLlRvb2xFdmVudC5Gcm9tU3RyaW5nKAorICAgICAgICAgICAgc2VudF9ldmVudC5zb3VyY2VfZXh0ZW5zaW9uCisgICAgICAgICkuaW52b2NhdGlvbl9zdG9wcGVkLAorICAgICkKKworICBkZWYgdGVzdF9sb2dfbXVsdGlwbGVfZXZlbnRzKHNlbGYpOgorICAgIHdpdGggc2VsZi5sb2dnZXI6CisgICAgICBzZWxmLmxvZ2dlci5sb2dfaW52b2NhdGlvbl9zdGFydGVkKFRFU1RfRVZFTlRfVElNRVNUQU1QLCAndGVzdF9jb21tYW5kJykKKyAgICAgIHNlbGYubG9nZ2VyLmxvZ19pbnZvY2F0aW9uX3N0b3BwZWQoVEVTVF9FVkVOVF9USU1FU1RBTVAsIDAsICdleGl0X2xvZycpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xlYXJjdXRfY2xpZW50LmdldF9udW1iZXJfb2Zfc2VudF9ldmVudHMoKSwgMikKKworCitjbGFzcyBNYWluVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgUkVRVUlSRURfQVJHUyA9IFsKKyAgICAgICcnLAorICAgICAgJy0tdG9vbF90YWcnLAorICAgICAgJ3Rlc3RfdG9vbCcsCisgICAgICAnLS1zdGFydF90aW1lc3RhbXAnLAorICAgICAgJzEnLAorICAgICAgJy0tZW5kX3RpbWVzdGFtcCcsCisgICAgICAnMicsCisgICAgICAnLS1leGl0X2NvZGUnLAorICAgICAgJzAnLAorICBdCisKKyAgZGVmIHRlc3RfbG9nX2FuZF9leGl0X3dpdGhfbWlzc2luZ19yZXF1aXJlZF9hcmdzKHNlbGYpOgorICAgIHdpdGggc2VsZi5hc3NlcnRMb2dzKCkgYXMgbG9nczoKKyAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCkgYXMgZXg6CisgICAgICAgIHRvb2xfZXZlbnRfbG9nZ2VyLm1haW4oWycnLCAnLS10b29sX3RhZycsICd0ZXN0X3Rvb2wnXSkKKworICAgIHdpdGggc2VsZi5zdWJUZXN0KCdWZXJpZnkgZXhjZXB0aW9uIGNvZGUnKToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXguZXhjZXB0aW9uLmNvZGUsIDIpCisKKyAgICB3aXRoIHNlbGYuc3ViVGVzdCgnVmVyaWZ5IGxvZyBtZXNzYWdlcycpOgorICAgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgICAndGhlIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIHJlcXVpcmVkJywKKyAgICAgICAgICAnXG4nLmpvaW4obG9ncy5vdXRwdXQpLAorICAgICAgKQorCisgIGRlZiB0ZXN0X2xvZ19hbmRfZXhpdF93aXRoX2ludmFsaWRfYXJncyhzZWxmKToKKyAgICB3aXRoIHNlbGYuYXNzZXJ0TG9ncygpIGFzIGxvZ3M6CisgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpIGFzIGV4OgorICAgICAgICB0b29sX2V2ZW50X2xvZ2dlci5tYWluKFsnJywgJy0tc3RhcnRfdGltZXN0YW1wJywgJ3Rlc3QnXSkKKworICAgIHdpdGggc2VsZi5zdWJUZXN0KCdWZXJpZnkgZXhjZXB0aW9uIGNvZGUnKToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXguZXhjZXB0aW9uLmNvZGUsIDIpCisKKyAgICB3aXRoIHNlbGYuc3ViVGVzdCgnVmVyaWZ5IGxvZyBtZXNzYWdlcycpOgorICAgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgICAnLS1zdGFydF90aW1lc3RhbXA6IGludmFsaWQnLAorICAgICAgICAgICdcbicuam9pbihsb2dzLm91dHB1dCksCisgICAgICApCisKKyAgZGVmIHRlc3RfbG9nX2FuZF9leGl0X3dpdGhfZHJ5X3J1bihzZWxmKToKKyAgICB3aXRoIHNlbGYuYXNzZXJ0TG9ncyhsZXZlbD1sb2dnaW5nLkRFQlVHKSBhcyBsb2dzOgorICAgICAgdG9vbF9ldmVudF9sb2dnZXIubWFpbihzZWxmLlJFUVVJUkVEX0FSR1MgKyBbJy0tZHJ5X3J1biddKQorCisgICAgd2l0aCBzZWxmLnN1YlRlc3QoJ1ZlcmlmeSBsb2cgbWVzc2FnZXMnKToKKyAgICAgIHNlbGYuYXNzZXJ0SW4oJ2RyeSBydW4nLCAnXG4nLmpvaW4obG9ncy5vdXRwdXQpKQorCisgIEBtb2NrLnBhdGNoLm9iamVjdChjbGVhcmN1dF9jbGllbnQsICdDbGVhcmN1dCcpCisgIGRlZiB0ZXN0X2xvZ19hbmRfZXhpdF93aXRoX3VuZXhwZWN0ZWRfZXhjZXB0aW9uKHNlbGYsIG1vY2tfY2MpOgorICAgIG1vY2tfY2MucmV0dXJuX3ZhbHVlID0gRmFrZUNsZWFyY3V0Q2xpZW50KHJhaXNlX2xvZ19leGNlcHRpb249VHJ1ZSkKKworICAgIHdpdGggc2VsZi5hc3NlcnRMb2dzKCkgYXMgbG9nczoKKyAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uKSBhcyBleDoKKyAgICAgICAgdG9vbF9ldmVudF9sb2dnZXIubWFpbihzZWxmLlJFUVVJUkVEX0FSR1MpCisKKyAgICB3aXRoIHNlbGYuc3ViVGVzdCgnVmVyaWZ5IGxvZyBtZXNzYWdlcycpOgorICAgICAgc2VsZi5hc3NlcnRJbigndW5leHBlY3RlZCBlcnJvcicsICdcbicuam9pbihsb2dzLm91dHB1dCkpCisKKyAgQG1vY2sucGF0Y2gub2JqZWN0KGNsZWFyY3V0X2NsaWVudCwgJ0NsZWFyY3V0JykKKyAgZGVmIHRlc3Rfc3VjY2VzcyhzZWxmLCBtb2NrX2NjKToKKyAgICBtb2NrX2NsZWFyX2N1dF9jbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoKQorICAgIG1vY2tfY2MucmV0dXJuX3ZhbHVlID0gbW9ja19jbGVhcl9jdXRfY2xpZW50CisKKyAgICB0b29sX2V2ZW50X2xvZ2dlci5tYWluKHNlbGYuUkVRVUlSRURfQVJHUykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19jbGVhcl9jdXRfY2xpZW50LmdldF9udW1iZXJfb2Zfc2VudF9ldmVudHMoKSwgMikKKworCitjbGFzcyBGYWtlQ2xlYXJjdXRDbGllbnQ6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHJhaXNlX2xvZ19leGNlcHRpb249RmFsc2UpOgorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzID0gW10KKyAgICBzZWxmLnNlbnRfbG9nX2V2ZW50cyA9IFtdCisgICAgc2VsZi5yYWlzZV9sb2dfZXhjZXB0aW9uID0gcmFpc2VfbG9nX2V4Y2VwdGlvbgorCisgIGRlZiBsb2coc2VsZiwgbG9nX2V2ZW50KToKKyAgICBpZiBzZWxmLnJhaXNlX2xvZ19leGNlcHRpb246CisgICAgICByYWlzZSBFeGNlcHRpb24oJ3Vua25vd24gZXhjZXB0aW9uJykKKyAgICBzZWxmLnBlbmRpbmdfbG9nX2V2ZW50cy5hcHBlbmQobG9nX2V2ZW50KQorCisgIGRlZiBmbHVzaF9ldmVudHMoc2VsZik6CisgICAgc2VsZi5zZW50X2xvZ19ldmVudHMuZXh0ZW5kKHNlbGYucGVuZGluZ19sb2dfZXZlbnRzKQorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzLmNsZWFyKCkKKworICBkZWYgZ2V0X251bWJlcl9vZl9zZW50X2V2ZW50cyhzZWxmKToKKyAgICByZXR1cm4gbGVuKHNlbGYuc2VudF9sb2dfZXZlbnRzKQorCisgIGRlZiBnZXRfbGFzdF9zZW50X2V2ZW50KHNlbGYpOgorICAgIHJldHVybiBzZWxmLnNlbnRfbG9nX2V2ZW50c1stMV0KKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3doaWNoZ2l0IGIvdG9vbHMvd2hpY2hnaXQKaW5kZXggYjBiZjJlNC4uNTVjOGM2ZiAxMDA3NTUKLS0tIGEvdG9vbHMvd2hpY2hnaXQKKysrIGIvdG9vbHMvd2hpY2hnaXQKQEAgLTEsNiArMSw3IEBACiAjIS91c3IvYmluL2VudiBweXRob24zCiAKIGltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGl0ZXJ0b29scwogaW1wb3J0IG9zCiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cwpAQCAtMTAsMTUgKzExLDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjaz1UcnVlLCBjYXB0dXJlX291dHB1dD1UcnVlLCB0ZXh0PVRydWUpLnN0ZG91dC5zdHJpcCgpCiAKIAorZGVmIGdldF9hbGxfbW9kdWxlcygpOgorICBwcm9kdWN0X291dCA9IHN1YnByb2Nlc3MucnVuKFsiYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCIsICItLWR1bXB2YXItbW9kZSIsICItLWFicyIsICJQUk9EVUNUX09VVCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjaz1UcnVlLCBjYXB0dXJlX291dHB1dD1UcnVlLCB0ZXh0PVRydWUpLnN0ZG91dC5zdHJpcCgpCisgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKFsiY2F0IiwgcHJvZHVjdF9vdXQgKyAiL2FsbF9tb2R1bGVzLnR4dCJdLCBjaGVjaz1UcnVlLCBjYXB0dXJlX291dHB1dD1UcnVlLCB0ZXh0PVRydWUpCisgIHJldHVybiByZXN1bHQuc3Rkb3V0LnN0cmlwKCkuc3BsaXQoIlxuIikKKworCitkZWYgYmF0Y2hlZChpdGVyYWJsZSwgbik6CisgICMgaW50cm9kdWNlZCBpbiBpdGVydG9vbHMgMy4xMiwgY291bGQgZGVsZXRlIG9uY2UgdGhhdCdzIHVuaXZlcnNhbGx5IGF2YWlsYWJsZQorICBpZiBuIDwgMToKKyAgICByYWlzZSBWYWx1ZUVycm9yKCduIG11c3QgYmUgYXQgbGVhc3Qgb25lJykKKyAgaXQgPSBpdGVyKGl0ZXJhYmxlKQorICB3aGlsZSBiYXRjaCA6PSB0dXBsZShpdGVydG9vbHMuaXNsaWNlKGl0LCBuKSk6CisgICAgeWllbGQgYmF0Y2gKKworCiBkZWYgZ2V0X3NvdXJjZXMobW9kdWxlcyk6Ci0gIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKFsiLi9wcmVidWlsdHMvYnVpbGQtdG9vbHMvbGludXgteDg2L2Jpbi9uaW5qYSIsICItZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0L2NvbWJpbmVkLSIgKyBvcy5lbnZpcm9uWyJUQVJHRVRfUFJPRFVDVCJdICsgIi5uaW5qYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiLXQiLCAiaW5wdXRzIiwgIi1kIiwgXSArIG1vZHVsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgY2hlY2s9RmFsc2UsIHRleHQ9VHJ1ZSkKLSAgaWYgcmVzdWx0LnJldHVybmNvZGUgIT0gMDoKLSAgICBzeXMuc3RkZXJyLndyaXRlKHJlc3VsdC5zdGRvdXQpCi0gICAgc3lzLmV4aXQoMSkKLSAgcmV0dXJuIHNldChbZiBmb3IgZiBpbiByZXN1bHQuc3Rkb3V0LnNwbGl0KCJcbiIpIGlmIG5vdCBmLnN0YXJ0c3dpdGgoIm91dC8iKV0pCisgIHNvdXJjZXMgPSBzZXQoKQorICBmb3IgbW9kdWxlX2dyb3VwIGluIGJhdGNoZWQobW9kdWxlcywgNDBfMDAwKToKKyAgICByZXN1bHQgPSBzdWJwcm9jZXNzLnJ1bihbIi4vcHJlYnVpbHRzL2J1aWxkLXRvb2xzL2xpbnV4LXg4Ni9iaW4vbmluamEiLCAiLWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQvY29tYmluZWQtIiArIG9zLmVudmlyb25bIlRBUkdFVF9QUk9EVUNUIl0gKyAiLm5pbmphIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLXQiLCAiaW5wdXRzIiwgIi1kIiwgXSArIGxpc3QobW9kdWxlX2dyb3VwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIGNoZWNrPUZhbHNlLCB0ZXh0PVRydWUpCisgICAgaWYgcmVzdWx0LnJldHVybmNvZGUgIT0gMDoKKyAgICAgIHN5cy5zdGRlcnIud3JpdGUocmVzdWx0LnN0ZG91dCkKKyAgICAgIHN5cy5leGl0KDEpCisgICAgc291cmNlcy51cGRhdGUoc2V0KFtmIGZvciBmIGluIHJlc3VsdC5zdGRvdXQuc3BsaXQoIlxuIikgaWYgbm90IGYuc3RhcnRzd2l0aCgib3V0LyIpXSkpCisgIHJldHVybiBzb3VyY2VzCiAKIAogZGVmIG1fbm90aGluZygpOgpAQCAtNTAsNTcgKzcwLDc2IEBACiAgICAgICAgIHJlZmVyZW5jZWRfZGlycy5hZGQoZCkKICAgICAgICAgcHJldl9kaXIgPSBkCiAgICAgICAgIGJyZWFrCi0gIHJldHVybiBbZFswOi0xXSBmb3IgZCBpbiByZWZlcmVuY2VkX2RpcnNdCisgIHJldHVybiByZWZlcmVuY2VkX2RpcnMKIAogCiBkZWYgbWFpbihhcmd2KToKICAgIyBBcmd1bWVudCBwYXJzaW5nCiAgIGFwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249Ikxpc3QgdGhlIHJlcXVpcmVkIGdpdCBwcm9qZWN0cyBmb3IgdGhlIGdpdmVuIG1vZHVsZXMiKQogICBhcC5hZGRfYXJndW1lbnQoIi0tcHJvZHVjdHMiLCBuYXJncz0iKiIsCi0gICAgICAgICAgICAgICAgICBoZWxwPSJUaGUgVEFSR0VUX1BST0RVQ1QgdG8gY2hlY2suIElmIG5vdCBwcm92aWRlZCBqdXN0IHVzZXMgd2hhdGV2ZXIgaGFzIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFscmVhZHkgYmVlbiBidWlsdCIpCisgICAgICAgICAgICAgICAgICBoZWxwPSJPbmUgb3IgbW9yZSBUQVJHRVRfUFJPRFVDVCB0byBjaGVjaywgb3IgXCIqXCIgZm9yIGFsbC4gSWYgbm90IHByb3ZpZGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAianVzdCB1c2VzIHdoYXRldmVyIGhhcyBhbHJlYWR5IGJlZW4gYnVpbHQiKQogICBhcC5hZGRfYXJndW1lbnQoIi0tdmFyaWFudHMiLCBuYXJncz0iKiIsCiAgICAgICAgICAgICAgICAgICBoZWxwPSJUaGUgVEFSR0VUX0JVSUxEX1ZBUklBTlRTIHRvIGNoZWNrLiBJZiBub3QgcHJvdmlkZWQganVzdCB1c2VzIHdoYXRldmVyIGhhcyIKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbHJlYWR5IGJlZW4gYnVpbHQsIG9yIGVuZyBpZiAtLXByb2R1Y3RzIGlzIHN1cHBsaWVkIikKICAgYXAuYWRkX2FyZ3VtZW50KCItLW1vZHVsZXMiLCBuYXJncz0iKiIsCi0gICAgICAgICAgICAgICAgICBoZWxwPSJUaGUgYnVpbGQgbW9kdWxlcyB0byBjaGVjaywgb3IgZHJvaWQgaXQgbm90IHN1cHBsaWVkIikKKyAgICAgICAgICAgICAgICAgIGhlbHA9IlRoZSBidWlsZCBtb2R1bGVzIHRvIGNoZWNrLCBvciBcIipcIiBmb3IgYWxsLCBvciBkcm9pZCBpZiBub3Qgc3VwcGxpZWQiKQogICBhcC5hZGRfYXJndW1lbnQoIi0td2h5IiwgbmFyZ3M9IioiLAogICAgICAgICAgICAgICAgICAgaGVscD0iQWxzbyBwcmludCB0aGUgaW5wdXQgZmlsZXMgdXNlZCBpbiB0aGVzZSBwcm9qZWN0cywgb3IgXCIqXCIgZm9yIGFsbCIpCisgIGFwLmFkZF9hcmd1bWVudCgiLS11bnVzZWQiLCBoZWxwPSJMaXN0IHRoZSB1bnVzZWQgZ2l0IHByb2plY3RzIGZvciB0aGUgZ2l2ZW4gbW9kdWxlcyByYXRoZXIgdGhhbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInRoZSB1c2VkIG9uZXMuIElnbm9yZXMgLS13aHkiLCBhY3Rpb249InN0b3JlX3RydWUiKQogICBhcmdzID0gYXAucGFyc2VfYXJncyhhcmd2WzE6XSkKIAogICBtb2R1bGVzID0gYXJncy5tb2R1bGVzIGlmIGFyZ3MubW9kdWxlcyBlbHNlIFsiZHJvaWQiXQogCisgIG1hdGNoIGFyZ3MucHJvZHVjdHM6CisgICAgY2FzZSBbIioiXToKKyAgICAgIHByb2R1Y3RzID0gZ2V0X2J1aWxkX3ZhcigiYWxsX25hbWVkX3Byb2R1Y3RzIikuc3BsaXQoIiAiKQorICAgIGNhc2UgXzoKKyAgICAgIHByb2R1Y3RzID0gYXJncy5wcm9kdWN0cworCiAgICMgR2V0IHRoZSBsaXN0IG9mIHNvdXJjZXMgZm9yIGFsbCBvZiB0aGUgcmVxdWVzdGVkIGJ1aWxkIGNvbWJvcwotICBpZiBub3QgYXJncy5wcm9kdWN0cyBhbmQgbm90IGFyZ3MudmFyaWFudHM6CisgIGlmIG5vdCBwcm9kdWN0cyBhbmQgbm90IGFyZ3MudmFyaWFudHM6CisgICAgbV9ub3RoaW5nKCkKKyAgICBpZiBhcmdzLm1vZHVsZXMgPT0gWyIqIl06CisgICAgICBtb2R1bGVzID0gZ2V0X2FsbF9tb2R1bGVzKCkKICAgICBzb3VyY2VzID0gZ2V0X3NvdXJjZXMobW9kdWxlcykKICAgZWxzZToKLSAgICBpZiBub3QgYXJncy5wcm9kdWN0czoKKyAgICBpZiBub3QgcHJvZHVjdHM6CiAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJFcnJvcjogLS1wcm9kdWN0cyBtdXN0IGJlIHN1cHBsaWVkIGlmIC0tdmFyaWFudHMgaXMgc3VwcGxpZWQiKQogICAgICAgc3lzLmV4aXQoMSkKICAgICBzb3VyY2VzID0gc2V0KCkKICAgICBidWlsZF9udW0gPSAxCi0gICAgZm9yIHByb2R1Y3QgaW4gYXJncy5wcm9kdWN0czoKKyAgICBmb3IgcHJvZHVjdCBpbiBwcm9kdWN0czoKICAgICAgIG9zLmVudmlyb25bIlRBUkdFVF9QUk9EVUNUIl0gPSBwcm9kdWN0CiAgICAgICB2YXJpYW50cyA9IGFyZ3MudmFyaWFudHMgaWYgYXJncy52YXJpYW50cyBlbHNlIFsidXNlciIsICJ1c2VyZGVidWciLCAiZW5nIl0KICAgICAgIGZvciB2YXJpYW50IGluIHZhcmlhbnRzOgotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiQW5hbHl6aW5nIGJ1aWxkIHtidWlsZF9udW19IG9mIHtsZW4oYXJncy5wcm9kdWN0cykqbGVuKHZhcmlhbnRzKX1cciIpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiJBbmFseXppbmcgYnVpbGQge2J1aWxkX251bX0gb2Yge2xlbihwcm9kdWN0cykqbGVuKHZhcmlhbnRzKX1cciIpCiAgICAgICAgIG9zLmVudmlyb25bIlRBUkdFVF9CVUlMRF9WQVJJQU5UIl0gPSB2YXJpYW50CiAgICAgICAgIG1fbm90aGluZygpCisgICAgICAgIGlmIGFyZ3MubW9kdWxlcyA9PSBbIioiXToKKyAgICAgICAgICBtb2R1bGVzID0gZ2V0X2FsbF9tb2R1bGVzKCkKICAgICAgICAgc291cmNlcy51cGRhdGUoZ2V0X3NvdXJjZXMobW9kdWxlcykpCiAgICAgICAgIGJ1aWxkX251bSArPSAxCiAgICAgc3lzLnN0ZGVyci53cml0ZSgiXG5cbiIpCiAKICAgc291cmNlcyA9IHNvcnRlZChzb3VyY2VzKQogCi0gICMgUHJpbnQgdGhlIGxpc3Qgb2YgZ2l0IGRpcmVjdG9yaWVzIHRoYXQgaGFzIG9uZSBvciBtb3JlIG9mIHRoZSBzb3VyY2VzIGluIGl0Ci0gIGZvciBwcm9qZWN0IGluIHNvcnRlZChnZXRfcmVmZXJlbmNlZF9wcm9qZWN0cyhnZXRfZ2l0X2RpcnMoKSwgc291cmNlcykpOgotICAgIHByaW50KHByb2plY3QpCi0gICAgaWYgYXJncy53aHk6Ci0gICAgICBpZiAiKiIgaW4gYXJncy53aHkgb3IgcHJvamVjdCBpbiBhcmdzLndoeToKLSAgICAgICAgcHJlZml4ID0gcHJvamVjdCArICIvIgotICAgICAgICBmb3IgZiBpbiBzb3VyY2VzOgotICAgICAgICAgIGlmIGYuc3RhcnRzd2l0aChwcmVmaXgpOgotICAgICAgICAgICAgcHJpbnQoIiAgIiArIGYpCisgIGlmIGFyZ3MudW51c2VkOgorICAgICMgUHJpbnQgdGhlIGxpc3Qgb2YgZ2l0IGRpcmVjdG9yaWVzIHRoYXQgZG9uJ3QgY29udGFpbiBzb3VyY2VzCisgICAgdXNlZF9naXRfZGlycyA9IHNldChnZXRfZ2l0X2RpcnMoKSkKKyAgICBmb3IgcHJvamVjdCBpbiBzb3J0ZWQodXNlZF9naXRfZGlycy5kaWZmZXJlbmNlKHNldChnZXRfcmVmZXJlbmNlZF9wcm9qZWN0cyh1c2VkX2dpdF9kaXJzLCBzb3VyY2VzKSkpKToKKyAgICAgIHByaW50KHByb2plY3RbMDotMV0pCisgIGVsc2U6CisgICAgIyBQcmludCB0aGUgbGlzdCBvZiBnaXQgZGlyZWN0b3JpZXMgdGhhdCBoYXMgb25lIG9yIG1vcmUgb2YgdGhlIHNvdXJjZXMgaW4gaXQKKyAgICBmb3IgcHJvamVjdCBpbiBzb3J0ZWQoZ2V0X3JlZmVyZW5jZWRfcHJvamVjdHMoZ2V0X2dpdF9kaXJzKCksIHNvdXJjZXMpKToKKyAgICAgIHByaW50KHByb2plY3RbMDotMV0pCisgICAgICBpZiBhcmdzLndoeToKKyAgICAgICAgaWYgIioiIGluIGFyZ3Mud2h5IG9yIHByb2plY3RbMDotMV0gaW4gYXJncy53aHk6CisgICAgICAgICAgcHJlZml4ID0gcHJvamVjdAorICAgICAgICAgIGZvciBmIGluIHNvdXJjZXM6CisgICAgICAgICAgICBpZiBmLnN0YXJ0c3dpdGgocHJlZml4KToKKyAgICAgICAgICAgICAgcHJpbnQoIiAgIiArIGYpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3ppcGFsaWduL0FuZHJvaWQuYnAgYi90b29scy96aXBhbGlnbi9BbmRyb2lkLmJwCmluZGV4IDBlMWQ1OGUuLjhiZTdlMjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3ppcGFsaWduL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvemlwYWxpZ24vQW5kcm9pZC5icApAQCAtNzAsNiArNzAsNyBAQAogICAgICAgICAibGliZ21vY2siLAogICAgIF0sCiAgICAgZGF0YTogWworICAgICAgICAgInRlc3RzL2RhdGEvYXBrV2l0aFVuY29tcHJlc3NlZFNoYXJlZExpYnMuemlwIiwKICAgICAgICAgICJ0ZXN0cy9kYXRhL2FyY2hpdmVXaXRoT25lRGlyZWN0b3J5RW50cnkuemlwIiwKICAgICAgICAgICJ0ZXN0cy9kYXRhL2RpZmZPcmRlcnMuemlwIiwKICAgICAgICAgICJ0ZXN0cy9kYXRhL2hvbGVzLnppcCIsCmRpZmYgLS1naXQgYS90b29scy96aXBhbGlnbi9aaXBBbGlnbi5jcHAgYi90b29scy96aXBhbGlnbi9aaXBBbGlnbi5jcHAKaW5kZXggMjM4NDBlMy4uM2Q2NWJjMCAxMDA2NDQKLS0tIGEvdG9vbHMvemlwYWxpZ24vWmlwQWxpZ24uY3BwCisrKyBiL3Rvb2xzL3ppcGFsaWduL1ppcEFsaWduLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgIlppcEZpbGUuaCIKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKQEAgLTM2LDE3ICszNywxNCBAQAogfQogCiBzdGF0aWMgaW50IGdldEFsaWdubWVudChib29sIHBhZ2VBbGlnblNoYXJlZExpYnMsIGludCBkZWZhdWx0QWxpZ25tZW50LAotICAgIFppcEVudHJ5KiBwRW50cnkpIHsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQga1BhZ2VBbGlnbm1lbnQgPSA0MDk2OwotCisgICAgWmlwRW50cnkqIHBFbnRyeSwgaW50IHBhZ2VTaXplKSB7CiAgICAgaWYgKCFwYWdlQWxpZ25TaGFyZWRMaWJzKSB7CiAgICAgICAgIHJldHVybiBkZWZhdWx0QWxpZ25tZW50OwogICAgIH0KIAogICAgIGNvbnN0IGNoYXIqIGV4dCA9IHN0cnJjaHIocEVudHJ5LT5nZXRGaWxlTmFtZSgpLCAnLicpOwogICAgIGlmIChleHQgJiYgc3RyY21wKGV4dCwgIi5zbyIpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGtQYWdlQWxpZ25tZW50OworICAgICAgICByZXR1cm4gcGFnZVNpemU7CiAgICAgfQogCiAgICAgcmV0dXJuIGRlZmF1bHRBbGlnbm1lbnQ7CkBAIC01Niw3ICs1NCw3IEBACiAgKiBDb3B5IGFsbCBlbnRyaWVzIGZyb20gInBaaW4iIHRvICJwWm91dCIsIGFsaWduaW5nIGFzIG5lZWRlZC4KICAqLwogc3RhdGljIGludCBjb3B5QW5kQWxpZ24oWmlwRmlsZSogcFppbiwgWmlwRmlsZSogcFpvdXQsIGludCBhbGlnbm1lbnQsIGJvb2wgem9wZmxpLAotICAgIGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicykKKyAgICBib29sIHBhZ2VBbGlnblNoYXJlZExpYnMsIGludCBwYWdlU2l6ZSkKIHsKICAgICBpbnQgbnVtRW50cmllcyA9IHBaaW4tPmdldE51bUVudHJpZXMoKTsKICAgICBaaXBFbnRyeSogcEVudHJ5OwpAQCAtODQsNyArODIsOCBAQAogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBab3V0LT5hZGQocFppbiwgcEVudHJ5LCBwYWRkaW5nLCAmcE5ld0VudHJ5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBhbGlnblRvID0gZ2V0QWxpZ25tZW50KHBhZ2VBbGlnblNoYXJlZExpYnMsIGFsaWdubWVudCwgcEVudHJ5KTsKKyAgICAgICAgICAgIGNvbnN0IGludCBhbGlnblRvID0gZ2V0QWxpZ25tZW50KHBhZ2VBbGlnblNoYXJlZExpYnMsIGFsaWdubWVudCwgcEVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVNpemUpOwogCiAgICAgICAgICAgICAvL3ByaW50ZigiLS0tICVzOiBvcmlnIGF0ICVsZCgrJWQpIGxlbj0lbGQsIGFkZGluZyBwYWQ9JWRcbiIsCiAgICAgICAgICAgICAvLyAgICBwRW50cnktPmdldEZpbGVOYW1lKCksIChsb25nKSBwRW50cnktPmdldEZpbGVPZmZzZXQoKSwKQEAgLTEwNyw3ICsxMDYsNyBAQAogICogb3V0cHV0IGZpbGUgZXhpc3RzIGFuZCAiZm9yY2UiIHdhc24ndCBzcGVjaWZpZWQuCiAgKi8KIGludCBwcm9jZXNzKGNvbnN0IGNoYXIqIGluRmlsZU5hbWUsIGNvbnN0IGNoYXIqIG91dEZpbGVOYW1lLAotICAgIGludCBhbGlnbm1lbnQsIGJvb2wgZm9yY2UsIGJvb2wgem9wZmxpLCBib29sIHBhZ2VBbGlnblNoYXJlZExpYnMpCisgICAgaW50IGFsaWdubWVudCwgYm9vbCBmb3JjZSwgYm9vbCB6b3BmbGksIGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicywgaW50IHBhZ2VTaXplKQogewogICAgIFppcEZpbGUgemluLCB6b3V0OwogCkBAIC0xMjcsNyArMTI2LDcgQEAKICAgICB9CiAKICAgICBpZiAoemluLm9wZW4oaW5GaWxlTmFtZSwgWmlwRmlsZTo6a09wZW5SZWFkT25seSkgIT0gT0spIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiAnJXMnIGFzIHppcCBhcmNoaXZlXG4iLCBpbkZpbGVOYW1lKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiAnJXMnIGFzIHppcCBhcmNoaXZlOiAlc1xuIiwgaW5GaWxlTmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIGlmICh6b3V0Lm9wZW4ob3V0RmlsZU5hbWUsCkBAIC0xMzgsNyArMTM3LDggQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCi0gICAgaW50IHJlc3VsdCA9IGNvcHlBbmRBbGlnbigmemluLCAmem91dCwgYWxpZ25tZW50LCB6b3BmbGksIHBhZ2VBbGlnblNoYXJlZExpYnMpOworICAgIGludCByZXN1bHQgPSBjb3B5QW5kQWxpZ24oJnppbiwgJnpvdXQsIGFsaWdubWVudCwgem9wZmxpLCBwYWdlQWxpZ25TaGFyZWRMaWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVNpemUpOwogICAgIGlmIChyZXN1bHQgIT0gMCkgewogICAgICAgICBwcmludGYoInppcGFsaWduOiBmYWlsZWQgcmV3cml0aW5nICclcycgdG8gJyVzJ1xuIiwKICAgICAgICAgICAgIGluRmlsZU5hbWUsIG91dEZpbGVOYW1lKTsKQEAgLTE1MCw3ICsxNTAsNyBAQAogICogVmVyaWZ5IHRoZSBhbGlnbm1lbnQgb2YgYSB6aXAgYXJjaGl2ZS4KICAqLwogaW50IHZlcmlmeShjb25zdCBjaGFyKiBmaWxlTmFtZSwgaW50IGFsaWdubWVudCwgYm9vbCB2ZXJib3NlLAotICAgIGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicykKKyAgICBib29sIHBhZ2VBbGlnblNoYXJlZExpYnMsIGludCBwYWdlU2l6ZSkKIHsKICAgICBaaXBGaWxlIHppcEZpbGU7CiAgICAgYm9vbCBmb3VuZEJhZCA9IGZhbHNlOwpAQCAtMTgxLDcgKzE4MSw4IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0ID0gcEVudHJ5LT5nZXRGaWxlT2Zmc2V0KCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgYWxpZ25UbyA9IGdldEFsaWdubWVudChwYWdlQWxpZ25TaGFyZWRMaWJzLCBhbGlnbm1lbnQsIHBFbnRyeSk7CisgICAgICAgICAgICBjb25zdCBpbnQgYWxpZ25UbyA9IGdldEFsaWdubWVudChwYWdlQWxpZ25TaGFyZWRMaWJzLCBhbGlnbm1lbnQsIHBFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplKTsKICAgICAgICAgICAgIGlmICgob2Zmc2V0ICUgYWxpZ25UbykgIT0gMCkgewogICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJThqZCAlcyAoQkFEIC0gJWpkKVxuIiwKQEAgLTE5OSw3ICsyMDAsNyBAQAogICAgIH0KIAogICAgIGlmICh2ZXJib3NlKQotICAgICAgICBwcmludGYoIlZlcmlmaWNhdGlvbiAlc1xuIiwgZm91bmRCYWQgPyAiRkFJTEVEIiA6ICJzdWNjZXNmdWwiKTsKKyAgICAgICAgcHJpbnRmKCJWZXJpZmljYXRpb24gJXNcbiIsIGZvdW5kQmFkID8gIkZBSUxFRCIgOiAic3VjY2Vzc2Z1bCIpOwogCiAgICAgcmV0dXJuIGZvdW5kQmFkID8gMSA6IDA7CiB9CmRpZmYgLS1naXQgYS90b29scy96aXBhbGlnbi9aaXBBbGlnbk1haW4uY3BwIGIvdG9vbHMvemlwYWxpZ24vWmlwQWxpZ25NYWluLmNwcAppbmRleCA1M2ZjOGQ0Li4yZjI0NDAzIDEwMDY0NAotLS0gYS90b29scy96aXBhbGlnbi9aaXBBbGlnbk1haW4uY3BwCisrKyBiL3Rvb2xzL3ppcGFsaWduL1ppcEFsaWduTWFpbi5jcHAKQEAgLTM0LDE1ICszNCwxOCBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiWmlwIGFsaWdubWVudCB1dGlsaXR5XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0XG5cbiIpOwogICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAiVXNhZ2U6IHppcGFsaWduIFstZl0gWy1wXSBbLXZdIFstel0gPGFsaWduPiBpbmZpbGUuemlwIG91dGZpbGUuemlwXG4iCi0gICAgICAgICIgICAgICAgemlwYWxpZ24gLWMgWy1wXSBbLXZdIDxhbGlnbj4gaW5maWxlLnppcFxuXG4iICk7CisgICAgICAgICJVc2FnZTogemlwYWxpZ24gWy1mXSBbLXBdIFstUCA8cGFnZXNpemVfa2I+XSBbLXZdIFstel0gPGFsaWduPiBpbmZpbGUuemlwIG91dGZpbGUuemlwXG4iCisgICAgICAgICIgICAgICAgemlwYWxpZ24gLWMgWy1wXSBbLVAgPHBhZ2VzaXplX2tiPl0gWy12XSA8YWxpZ24+IGluZmlsZS56aXBcblxuIiApOwogICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAiICA8YWxpZ24+OiBhbGlnbm1lbnQgaW4gYnl0ZXMsIGUuZy4gJzQnIHByb3ZpZGVzIDMyLWJpdCBhbGlnbm1lbnRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAtYzogY2hlY2sgYWxpZ25tZW50IG9ubHkgKGRvZXMgbm90IG1vZGlmeSBmaWxlKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgIC1mOiBvdmVyd3JpdGUgZXhpc3Rpbmcgb3V0ZmlsZS56aXBcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAtcDogcGFnZS1hbGlnbiB1bmNvbXByZXNzZWQgLnNvIGZpbGVzXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgLXA6IDRrYiBwYWdlLWFsaWduIHVuY29tcHJlc3NlZCAuc28gZmlsZXNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAtdjogdmVyYm9zZSBvdXRwdXRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAtejogcmVjb21wcmVzcyB1c2luZyBab3BmbGlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAtUCA8cGFnZXNpemVfa2I+OiBBbGlnbiB1bmNvbXByZXNzZWQgLnNvIGZpbGVzIHRvIHRoZSBzcGVjaWZpZWRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICBwYWdlIHNpemUuIFZhbGlkIHZhbHVlcyBmb3IgPHBhZ2VzaXplX2tiPiBhcmUgNCwgMTZcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICBhbmQgNjQuICctUCcgY2Fubm90IGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCAnLXAnLlxuIik7CiB9CiAKIApAQCAtNTcsMTIgKzYwLDE2IEBACiAgICAgYm9vbCB2ZXJib3NlID0gZmFsc2U7CiAgICAgYm9vbCB6b3BmbGkgPSBmYWxzZTsKICAgICBib29sIHBhZ2VBbGlnblNoYXJlZExpYnMgPSBmYWxzZTsKKyAgICBpbnQgcGFnZVNpemUgPSA0MDk2OworICAgIGJvb2wgbGVnYWN5UGFnZUFsaWdubWVudEZsYWcgPSBmYWxzZTsgICAvLyAtcAorICAgIGJvb2wgcGFnZUFsaWdubWVudEZsYWcgPSBmYWxzZTsgICAgICAgICAvLyAtUCA8cGFnZXNpemVfa2I+CiAgICAgaW50IHJlc3VsdCA9IDE7CiAgICAgaW50IGFsaWdubWVudDsKICAgICBjaGFyKiBlbmRwOwogCiAgICAgaW50IG9wdDsKLSAgICB3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZmNwdnoiKSkgIT0gLTEpIHsKKworICAgIHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJmY3B2elA6IikpICE9IC0xKSB7CiAgICAgICAgIHN3aXRjaCAob3B0KSB7CiAgICAgICAgIGNhc2UgJ2MnOgogICAgICAgICAgICAgY2hlY2sgPSB0cnVlOwpAQCAtNzcsNyArODQsMjkgQEAKICAgICAgICAgICAgIHpvcGZsaSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICBsZWdhY3lQYWdlQWxpZ25tZW50RmxhZyA9IHRydWU7CiAgICAgICAgICAgICBwYWdlQWxpZ25TaGFyZWRMaWJzID0gdHJ1ZTsKKyAgICAgICAgICAgIHBhZ2VTaXplID0gNDA5NjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgIHBhZ2VBbGlnbm1lbnRGbGFnID0gdHJ1ZTsKKyAgICAgICAgICAgIHBhZ2VBbGlnblNoYXJlZExpYnMgPSB0cnVlOworCisgICAgICAgICAgICBpZiAoIW9wdGFyZykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IC1QIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgICAgICAgICB3YW50VXNhZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFnZVNpemUgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICBpZiAocGFnZVNpemUgIT0gNCAmJiBwYWdlU2l6ZSAhPSAxNiAmJiBwYWdlU2l6ZSAhPSA2NCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IEludmFsaWQgYXJndW1lbnQgZm9yIC1QOiAlc1xuIiwgb3B0YXJnKTsKKyAgICAgICAgICAgICAgICB3YW50VXNhZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFnZVNpemUgKj0gMTAyNDsgIC8vIENvbnZlcnQgZnJvbSBrQiB0byBieXRlcy4KKwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmtub3duIGZsYWcgLSVjXG4iLCBvcHQpOwpAQCAtODYsNiArMTE1LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAobGVnYWN5UGFnZUFsaWdubWVudEZsYWcgJiYgcGFnZUFsaWdubWVudEZsYWcpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IEludmFsaWQgb3B0aW9uczogJy1QIDxwYWdlc2l6ZV9rYj4nIGFuZCAnLXAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgdXNlZCBpbiBjb21iaW5hdGlvbi5cbiIpOworICAgICAgICAgICAgd2FudFVzYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKICAgICBpZiAoISgoY2hlY2sgJiYgKGFyZ2MgLSBvcHRpbmQpID09IDIpIHx8ICghY2hlY2sgJiYgKGFyZ2MgLSBvcHRpbmQpID09IDMpKSkgewogICAgICAgICB3YW50VXNhZ2UgPSB0cnVlOwogICAgICAgICBnb3RvIGJhaWw7CkBAIC0xMDAsMTQgKzEzNiwxNSBAQAogCiAgICAgaWYgKGNoZWNrKSB7CiAgICAgICAgIC8qIGNoZWNrIGV4aXN0aW5nIGFyY2hpdmUgZm9yIGNvcnJlY3QgYWxpZ25tZW50ICovCi0gICAgICAgIHJlc3VsdCA9IHZlcmlmeShhcmd2W29wdGluZCArIDFdLCBhbGlnbm1lbnQsIHZlcmJvc2UsIHBhZ2VBbGlnblNoYXJlZExpYnMpOworICAgICAgICByZXN1bHQgPSB2ZXJpZnkoYXJndltvcHRpbmQgKyAxXSwgYWxpZ25tZW50LCB2ZXJib3NlLCBwYWdlQWxpZ25TaGFyZWRMaWJzLCBwYWdlU2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogY3JlYXRlIHRoZSBuZXcgYXJjaGl2ZSAqLwotICAgICAgICByZXN1bHQgPSBwcm9jZXNzKGFyZ3Zbb3B0aW5kICsgMV0sIGFyZ3Zbb3B0aW5kICsgMl0sIGFsaWdubWVudCwgZm9yY2UsIHpvcGZsaSwgcGFnZUFsaWduU2hhcmVkTGlicyk7CisgICAgICAgIHJlc3VsdCA9IHByb2Nlc3MoYXJndltvcHRpbmQgKyAxXSwgYXJndltvcHRpbmQgKyAyXSwgYWxpZ25tZW50LCBmb3JjZSwgem9wZmxpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VBbGlnblNoYXJlZExpYnMsIHBhZ2VTaXplKTsKIAogICAgICAgICAvKiB0cnVzdCwgYnV0IHZlcmlmeSAqLwogICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHZlcmlmeShhcmd2W29wdGluZCArIDJdLCBhbGlnbm1lbnQsIHZlcmJvc2UsIHBhZ2VBbGlnblNoYXJlZExpYnMpOworICAgICAgICAgICAgcmVzdWx0ID0gdmVyaWZ5KGFyZ3Zbb3B0aW5kICsgMl0sIGFsaWdubWVudCwgdmVyYm9zZSwgcGFnZUFsaWduU2hhcmVkTGlicywgcGFnZVNpemUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90b29scy96aXBhbGlnbi9aaXBFbnRyeS5jcHAgYi90b29scy96aXBhbGlnbi9aaXBFbnRyeS5jcHAKaW5kZXggNjg5OTk5ZS4uMDM1NWU1NiAxMDA2NDQKLS0tIGEvdG9vbHMvemlwYWxpZ24vWmlwRW50cnkuY3BwCisrKyBiL3Rvb2xzL3ppcGFsaWduL1ppcEVudHJ5LmNwcApAQCAtMTgsNiArMTgsOCBAQAogLy8gQWNjZXNzIHRvIGVudHJpZXMgaW4gYSBaaXAgYXJjaGl2ZS4KIC8vCiAKKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUyAgLy8gRm9yIG1pbmd3IGxvY2FsdGltZV9yKCkuCisKICNkZWZpbmUgTE9HX1RBRyAiemlwIgogCiAjaW5jbHVkZSAiWmlwRW50cnkuaCIKQEAgLTM1NCwzMSArMzU2LDI5IEBACiAgKi8KIHZvaWQgWmlwRW50cnk6OnNldE1vZFdoZW4odGltZV90IHdoZW4pCiB7Ci0jaWYgIWRlZmluZWQoX1dJTjMyKQotICAgIHN0cnVjdCB0bSB0bVJlc3VsdDsKLSNlbmRpZgotICAgIHRpbWVfdCBldmVuOwotICAgIHVpbnQxNl90IHpkYXRlLCB6dGltZTsKLQotICAgIHN0cnVjdCB0bSogcHRtOwotCiAgICAgLyogcm91bmQgdXAgdG8gYW4gZXZlbiBudW1iZXIgb2Ygc2Vjb25kcyAqLwotICAgIGV2ZW4gPSAod2hlbiAmIDEpID8gKHdoZW4gKyAxKSA6IHdoZW47CisgICAgdGltZV90IGV2ZW4gPSAod2hlbiAmIDEpID8gKHdoZW4gKyAxKSA6IHdoZW47CiAKICAgICAvKiBleHBhbmQgKi8KLSNpZiAhZGVmaW5lZChfV0lOMzIpCi0gICAgcHRtID0gbG9jYWx0aW1lX3IoJmV2ZW4sICZ0bVJlc3VsdCk7Ci0jZWxzZQotICAgIHB0bSA9IGxvY2FsdGltZSgmZXZlbik7Ci0jZW5kaWYKKyAgICBzdHJ1Y3QgdG0gdG1SZXN1bHQ7CisgICAgc3RydWN0IHRtKiBwdG0gPSBsb2NhbHRpbWVfcigmZXZlbiwgJnRtUmVzdWx0KTsKIAotICAgIGludCB5ZWFyOwotICAgIHllYXIgPSBwdG0tPnRtX3llYXI7Ci0gICAgaWYgKHllYXIgPCA4MCkKLSAgICAgICAgeWVhciA9IDgwOworICAgIC8vIFRoZSBlYXJsaWVzdCB2YWxpZCB0aW1lIGZvciBaSVAgZmlsZSBlbnRyaWVzIGlzIDE5ODAtMDEtMDEuIFNlZToKKyAgICAvLyBodHRwczovL3VzZXJzLmNzLmptdS5lZHUvYnVjaGhvZnAvZm9yZW5zaWNzL2Zvcm1hdHMvcGt6aXAuaHRtbC4KKyAgICAvLyBTZXQgYW55IHRpbWUgYmVmb3JlIDE5ODAgdG8gMTk4MC0wMS0wMS4KKyAgICBpZiAocHRtLT50bV95ZWFyIDwgODApIHsKKyAgICAgICAgcHRtLT50bV95ZWFyID0gODA7CisgICAgICAgIHB0bS0+dG1fbW9uID0gMDsKKyAgICAgICAgcHRtLT50bV9tZGF5ID0gMTsKKyAgICAgICAgcHRtLT50bV9ob3VyID0gMDsKKyAgICAgICAgcHRtLT50bV9taW4gPSAwOworICAgICAgICBwdG0tPnRtX3NlYyA9IDA7CisgICAgfQogCi0gICAgemRhdGUgPSAoeWVhciAtIDgwKSA8PCA5IHwgKHB0bS0+dG1fbW9uKzEpIDw8IDUgfCBwdG0tPnRtX21kYXk7Ci0gICAgenRpbWUgPSBwdG0tPnRtX2hvdXIgPDwgMTEgfCBwdG0tPnRtX21pbiA8PCA1IHwgcHRtLT50bV9zZWMgPj4gMTsKKyAgICB1aW50MTZfdCB6ZGF0ZSA9IHN0YXRpY19jYXN0PHVpbnQxNl90PigKKyAgICAgICAgKHB0bS0+dG1feWVhciAtIDgwKSA8PCA5IHwgKHB0bS0+dG1fbW9uICsgMSkgPDwgNSB8IHB0bS0+dG1fbWRheSk7CisgICAgdWludDE2X3QgenRpbWUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oCisgICAgICAgIHB0bS0+dG1faG91ciA8PCAxMSB8IHB0bS0+dG1fbWluIDw8IDUgfCBwdG0tPnRtX3NlYyA+PiAxKTsKIAogICAgIG1DREUubUxhc3RNb2RGaWxlVGltZSA9IG1MRkgubUxhc3RNb2RGaWxlVGltZSA9IHp0aW1lOwogICAgIG1DREUubUxhc3RNb2RGaWxlRGF0ZSA9IG1MRkgubUxhc3RNb2RGaWxlRGF0ZSA9IHpkYXRlOwpkaWZmIC0tZ2l0IGEvdG9vbHMvemlwYWxpZ24vaW5jbHVkZS9aaXBBbGlnbi5oIGIvdG9vbHMvemlwYWxpZ24vaW5jbHVkZS9aaXBBbGlnbi5oCmluZGV4IGFiMzYwODYuLjg1ZGRhMTQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3ppcGFsaWduL2luY2x1ZGUvWmlwQWxpZ24uaAorKysgYi90b29scy96aXBhbGlnbi9pbmNsdWRlL1ppcEFsaWduLmgKQEAgLTI1LDI0ICsyNSwyOCBAQAogICogLSBmb3JjZSAgOiBPdmVyd3JpdGUgb3V0cHV0IGlmIGl0IGV4aXN0cywgZmFpbCBvdGhlcndpc2UuCiAgKiAtIHpvcGZsaSA6IFJlY29tcHJlc3MgY29tcHJlc3NlZCBlbnRyaWVzIHdpdGggbW9yZSBlZmZpY2llbnQgYWxnb3JpdGhtLgogICogICAgICAgICAgICBDb3B5IGNvbXByZXNzZWQgZW50cmllcyBhcy1pcywgYW5kIHVuYWxpZ25lZCwgb3RoZXJ3aXNlLgotICogLSBwYWdlQWxpZ25TaGFyZWRMaWJzOiBBbGlnbiAuc28gZmlsZXMgdG8gNDA5NiBhbmQgb3RoZXIgZmlsZXMgdG8KKyAqIC0gcGFnZUFsaWduU2hhcmVkTGliczogQWxpZ24gLnNvIGZpbGVzIHRvIEBwYWdlU2l6ZSBhbmQgb3RoZXIgZmlsZXMgdG8KICAqICAgYWxpZ25Ubywgb3IgYWxsIGZpbGVzIHRvIGFsaWduVG8gaWYgZmFsc2UuLgorICogLSBwYWdlU2l6ZTogU3BlY2lmaWVzIHRoZSBwYWdlIHNpemUgb2YgdGhlIHRhcmdldCBkZXZpY2UuIFRoaXMgaXMgdXNlZAorICogICAgICAgICAgICAgdG8gY29ycmVjdGx5IHBhZ2UtYWxpZ24gc2hhcmVkIGxpYnJhcmllcy4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogaW50IHByb2Nlc3MoY29uc3QgY2hhciogaW5wdXQsIGNvbnN0IGNoYXIqIG91dHB1dCwgaW50IGFsaWduVG8sIGJvb2wgZm9yY2UsCi0gICAgYm9vbCB6b3BmbGksIGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicyk7CisgICAgYm9vbCB6b3BmbGksIGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicywgaW50IHBhZ2VTaXplKTsKIAogLyoKICAqIFZlcmlmeSB0aGUgYWxpZ25tZW50IG9mIGEgemlwIGFyY2hpdmUuCiAgKiAtIGFsaWduVG86IEFsaWdubWVudCAoaW4gYnl0ZXMpIGZvciB1bmNvbXByZXNzZWQgZW50cmllcy4KLSAqIC0gcGFnZUFsaWduU2hhcmVkTGliczogQWxpZ24gLnNvIGZpbGVzIHRvIDQwOTYgYW5kIG90aGVyIGZpbGVzIHRvCisgKiAtIHBhZ2VBbGlnblNoYXJlZExpYnM6IEFsaWduIC5zbyBmaWxlcyB0byBAcGFnZVNpemUgYW5kIG90aGVyIGZpbGVzIHRvCiAgKiAgIGFsaWduVG8sIG9yIGFsbCBmaWxlcyB0byBhbGlnblRvIGlmIGZhbHNlLi4KKyAqIC0gcGFnZVNpemU6IFNwZWNpZmllcyB0aGUgcGFnZSBzaXplIG9mIHRoZSB0YXJnZXQgZGV2aWNlLiBUaGlzIGlzIHVzZWQKKyAqICAgICAgICAgICAgIHRvIGNvcnJlY3RseSBwYWdlLWFsaWduIHNoYXJlZCBsaWJyYXJpZXMuCiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludCB2ZXJpZnkoY29uc3QgY2hhciogZmlsZU5hbWUsIGludCBhbGlnblRvLCBib29sIHZlcmJvc2UsCi0gICAgYm9vbCBwYWdlQWxpZ25TaGFyZWRMaWJzKTsKKyAgICBib29sIHBhZ2VBbGlnblNoYXJlZExpYnMsIGludCBwYWdlU2l6ZSk7CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvdG9vbHMvemlwYWxpZ24vdGVzdHMvZGF0YS9hcGtXaXRoVW5jb21wcmVzc2VkU2hhcmVkTGlicy56aXAgYi90b29scy96aXBhbGlnbi90ZXN0cy9kYXRhL2Fwa1dpdGhVbmNvbXByZXNzZWRTaGFyZWRMaWJzLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBlM2I1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvemlwYWxpZ24vdGVzdHMvZGF0YS9hcGtXaXRoVW5jb21wcmVzc2VkU2hhcmVkTGlicy56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvemlwYWxpZ24vdGVzdHMvc3JjL2FsaWduX3Rlc3QuY3BwIGIvdG9vbHMvemlwYWxpZ24vdGVzdHMvc3JjL2FsaWduX3Rlc3QuY3BwCmluZGV4IGE4NDMzZmEuLjA3YWQ3Y2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3ppcGFsaWduL3Rlc3RzL3NyYy9hbGlnbl90ZXN0LmNwcAorKysgYi90b29scy96aXBhbGlnbi90ZXN0cy9zcmMvYWxpZ25fdGVzdC5jcHAKQEAgLTQ4LDExICs0OCwxMiBAQAogVEVTVChBbGlnbiwgVW5hbGlnbmVkKSB7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNyYyA9IEdldFRlc3RQYXRoKCJ1bmFsaWduZWQuemlwIik7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRzdCA9IEdldFRlbXBQYXRoKCJ1bmFsaWduZWRfb3V0LnppcCIpOworICBpbnQgcGFnZVNpemUgPSA0MDk2OwogCi0gIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCBkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIDQwOTYpOworICBpbnQgcHJvY2Vzc2VkID0gcHJvY2VzcyhzcmMuY19zdHIoKSwgZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCBmYWxzZSwgcGFnZVNpemUpOwogICBBU1NFUlRfRVEoMCwgcHJvY2Vzc2VkKTsKIAotICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlKTsKKyAgaW50IHZlcmlmaWVkID0gdmVyaWZ5KGRzdC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgcGFnZVNpemUpOwogICBBU1NFUlRfRVEoMCwgdmVyaWZpZWQpOwogfQogCkBAIC02MCwxOCArNjEsMTkgQEAKICAgY29uc3Qgc3RkOjpzdHJpbmcgc3JjID0gR2V0VGVzdFBhdGgoInVuYWxpZ25lZC56aXAiKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgdG1wID0gR2V0VGVtcFBhdGgoImRhX2FsaWduZWQuemlwIik7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRzdCA9IEdldFRlbXBQYXRoKCJkYV9kX2FsaWduZXIuemlwIik7CisgIGludCBwYWdlU2l6ZSA9IDQwOTY7CiAKLSAgaW50IHByb2Nlc3NlZCA9IHByb2Nlc3Moc3JjLmNfc3RyKCksIHRtcC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgNDA5Nik7CisgIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCB0bXAuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCBwcm9jZXNzZWQpOwogCi0gIGludCB2ZXJpZmllZCA9IHZlcmlmeSh0bXAuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UpOworICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkodG1wLmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCB2ZXJpZmllZCk7CiAKICAgLy8gQWxpZ24gdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcnVuLiBFc3NlbnRpYWxseSBkb3VibGUgYWxpZ25pbmcuCi0gIHByb2Nlc3NlZCA9IHByb2Nlc3ModG1wLmNfc3RyKCksIGRzdC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgNDA5Nik7CisgIHByb2Nlc3NlZCA9IHByb2Nlc3ModG1wLmNfc3RyKCksIGRzdC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgZmFsc2UsIHBhZ2VTaXplKTsKICAgQVNTRVJUX0VRKDAsIHByb2Nlc3NlZCk7CiAKLSAgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlKTsKKyAgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCB2ZXJpZmllZCk7CiAKICAgLy8gTm90aGluZyBzaG91bGQgaGF2ZSBjaGFuZ2VkIGJldHdlZW4gdG1wIGFuZCBkc3QuCkBAIC05MCwxMSArOTIsMTIgQEAKIFRFU1QoQWxpZ24sIEhvbGVzKSB7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNyYyA9IEdldFRlc3RQYXRoKCJob2xlcy56aXAiKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgZHN0ID0gR2V0VGVtcFBhdGgoImhvbGVzX291dC56aXAiKTsKKyAgaW50IHBhZ2VTaXplID0gNDA5NjsKIAotICBpbnQgcHJvY2Vzc2VkID0gcHJvY2VzcyhzcmMuY19zdHIoKSwgZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCA0MDk2KTsKKyAgaW50IHByb2Nlc3NlZCA9IHByb2Nlc3Moc3JjLmNfc3RyKCksIGRzdC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgdHJ1ZSwgcGFnZVNpemUpOwogICBBU1NFUlRfRVEoMCwgcHJvY2Vzc2VkKTsKIAotICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIGZhbHNlLCB0cnVlKTsKKyAgaW50IHZlcmlmaWVkID0gdmVyaWZ5KGRzdC5jX3N0cigpLCA0LCBmYWxzZSwgdHJ1ZSwgcGFnZVNpemUpOwogICBBU1NFUlRfRVEoMCwgdmVyaWZpZWQpOwogfQogCkBAIC0xMDIsMjggKzEwNSw4NSBAQAogVEVTVChBbGlnbiwgRGlmZmVyZW50ZU9yZGVycykgewogICBjb25zdCBzdGQ6OnN0cmluZyBzcmMgPSBHZXRUZXN0UGF0aCgiZGlmZk9yZGVycy56aXAiKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgZHN0ID0gR2V0VGVtcFBhdGgoImRpZmZPcmRlcnNfb3V0LnppcCIpOworICBpbnQgcGFnZVNpemUgPSA0MDk2OwogCi0gIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCBkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIDQwOTYpOworICBpbnQgcHJvY2Vzc2VkID0gcHJvY2VzcyhzcmMuY19zdHIoKSwgZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCB0cnVlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCBwcm9jZXNzZWQpOwogCi0gIGludCB2ZXJpZmllZCA9IHZlcmlmeShkc3QuY19zdHIoKSwgNCwgZmFsc2UsIHRydWUpOworICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIGZhbHNlLCB0cnVlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCB2ZXJpZmllZCk7CiB9CiAKIFRFU1QoQWxpZ24sIERpcmVjdG9yeUVudHJ5RG9Ob3RSZXF1aXJlQWxpZ25tZW50KSB7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNyYyA9IEdldFRlc3RQYXRoKCJhcmNoaXZlV2l0aE9uZURpcmVjdG9yeUVudHJ5LnppcCIpOwotICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoc3JjLmNfc3RyKCksIDQsIGZhbHNlLCB0cnVlKTsKKyAgaW50IHBhZ2VTaXplID0gNDA5NjsKKyAgaW50IHZlcmlmaWVkID0gdmVyaWZ5KHNyYy5jX3N0cigpLCA0LCBmYWxzZSwgdHJ1ZSwgcGFnZVNpemUpOwogICBBU1NFUlRfRVEoMCwgdmVyaWZpZWQpOwogfQogCiBURVNUKEFsaWduLCBEaXJlY3RvcnlFbnRyeSkgewogICBjb25zdCBzdGQ6OnN0cmluZyBzcmMgPSBHZXRUZXN0UGF0aCgiYXJjaGl2ZVdpdGhPbmVEaXJlY3RvcnlFbnRyeS56aXAiKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgZHN0ID0gR2V0VGVtcFBhdGgoImFyY2hpdmVXaXRoT25lRGlyZWN0b3J5RW50cnlfb3V0LnppcCIpOworICBpbnQgcGFnZVNpemUgPSA0MDk2OwogCi0gIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCBkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIDQwOTYpOworICBpbnQgcHJvY2Vzc2VkID0gcHJvY2VzcyhzcmMuY19zdHIoKSwgZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCB0cnVlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCBwcm9jZXNzZWQpOwogICBBU1NFUlRfRVEodHJ1ZSwgc2FtZUNvbnRlbnQoc3JjLCBkc3QpKTsKIAotICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIGZhbHNlLCB0cnVlKTsKKyAgaW50IHZlcmlmaWVkID0gdmVyaWZ5KGRzdC5jX3N0cigpLCA0LCBmYWxzZSwgdHJ1ZSwgcGFnZVNpemUpOworICBBU1NFUlRfRVEoMCwgdmVyaWZpZWQpOworfQorCitjbGFzcyBVbmNvbXByZXNzZWRTaGFyZWRMaWJzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgU2V0VXBUZXN0U3VpdGUoKSB7CisgICAgICBzcmMgPSBHZXRUZXN0UGF0aCgiYXBrV2l0aFVuY29tcHJlc3NlZFNoYXJlZExpYnMuemlwIik7CisgICAgICBkc3QgPSBHZXRUZW1wUGF0aCgiYXBrV2l0aFVuY29tcHJlc3NlZFNoYXJlZExpYnNfb3V0LnppcCIpOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBzcmM7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGRzdDsKK307CisKK3N0ZDo6c3RyaW5nIFVuY29tcHJlc3NlZFNoYXJlZExpYnNUZXN0OjpzcmM7CitzdGQ6OnN0cmluZyBVbmNvbXByZXNzZWRTaGFyZWRMaWJzVGVzdDo6ZHN0OworCitURVNUX0YoVW5jb21wcmVzc2VkU2hhcmVkTGlic1Rlc3QsIFVuYWxpZ25lZCkgeworICBpbnQgcGFnZVNpemUgPSA0MDk2OworCisgIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCBkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBwYWdlU2l6ZSk7CisgIEFTU0VSVF9FUSgwLCBwcm9jZXNzZWQpOworCisgIGludCB2ZXJpZmllZCA9IHZlcmlmeShkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgdHJ1ZSwgcGFnZVNpemUpOworICBBU1NFUlRfTkUoMCwgdmVyaWZpZWQpOyAvLyAuc28ncyBub3QgcGFnZS1hbGlnbmVkCit9CisKK1RFU1RfRihVbmNvbXByZXNzZWRTaGFyZWRMaWJzVGVzdCwgQWxpZ25lZFBhZ2VTaXplNGtCKSB7CisgIGludCBwYWdlU2l6ZSA9IDQwOTY7CisKKyAgaW50IHByb2Nlc3NlZCA9IHByb2Nlc3Moc3JjLmNfc3RyKCksIGRzdC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgdHJ1ZSwgcGFnZVNpemUpOworICBBU1NFUlRfRVEoMCwgcHJvY2Vzc2VkKTsKKworICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIHRydWUsIHRydWUsIHBhZ2VTaXplKTsKKyAgQVNTRVJUX0VRKDAsIHZlcmlmaWVkKTsKK30KKworVEVTVF9GKFVuY29tcHJlc3NlZFNoYXJlZExpYnNUZXN0LCBBbGlnbmVkUGFnZVNpemUxNmtCKSB7CisgIGludCBwYWdlU2l6ZSA9IDE2Mzg0OworCisgIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCBkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIHRydWUsIHBhZ2VTaXplKTsKKyAgQVNTRVJUX0VRKDAsIHByb2Nlc3NlZCk7CisKKyAgaW50IHZlcmlmaWVkID0gdmVyaWZ5KGRzdC5jX3N0cigpLCA0LCB0cnVlLCB0cnVlLCBwYWdlU2l6ZSk7CisgIEFTU0VSVF9FUSgwLCB2ZXJpZmllZCk7Cit9CisKK1RFU1RfRihVbmNvbXByZXNzZWRTaGFyZWRMaWJzVGVzdCwgQWxpZ25lZFBhZ2VTaXplNjRrQikgeworICBpbnQgcGFnZVNpemUgPSA2NTUzNjsKKworICBpbnQgcHJvY2Vzc2VkID0gcHJvY2VzcyhzcmMuY19zdHIoKSwgZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCB0cnVlLCBwYWdlU2l6ZSk7CisgIEFTU0VSVF9FUSgwLCBwcm9jZXNzZWQpOworCisgIGludCB2ZXJpZmllZCA9IHZlcmlmeShkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgdHJ1ZSwgcGFnZVNpemUpOwogICBBU1NFUlRfRVEoMCwgdmVyaWZpZWQpOwogfQo=