ZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvQW5kcm9pZC5icCBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTkwMjEwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImlkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImdlbmVyYWwuY2MiLAorICAgICAgICAiZm9vLnByb3RvIiwKKyAgICBdLAorICAgIGNmbGFnczogWyItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKKyAgICBwcm90bzogeworICAgICAgICB0eXBlOiAibGl0ZSIsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9mb28ucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4NTE0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBpZGVfcXVlcnkucHJvYmVyX3NjcmlwdHM7CisKK21lc3NhZ2UgUHJvdG9Nc2cgeworICAvLyBUZXN0IHByb3RvIGZpZWxkLgorICBpbnQ2NCBzb21lX2ZpZWxkID0gMTsKKyAgLy8gICAgICAgICAgICAgICAgICAgXiBzb21lX2ZpZWxkCit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwNjM5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYwpAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmb28ucGIuaCIKKwordXNpbmcgaWRlX3F1ZXJ5Ojpwcm9iZXJfc2NyaXB0czo6UHJvdG9Nc2c7CisKK3ZvaWQgRm9vKGludCB4LCBkb3VibGUgeSkge30KK2Zsb2F0IEZvbyhmbG9hdCB4LCBmbG9hdCB5KSB7IHJldHVybiAwLjBmOyB9CisKK3ZvaWQgVGVzdENvbXBsZXRpb24oKSB7CisgIC8vIFRlc3QgY29tcGxldGlvbiBvbiBwcm90b3MgYW5kIGZ1enp5IG1hdGNoaW5nIG9mIGNvbXBsZXRpb24gc3VnZ2VzdGlvbnMuCisKKyAgUHJvdG9Nc2cgZm9vOworCisgIC8vIF4KKworICAvLyBzdGVwCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyB0eXBlKCJmIikKKyAgLy8gY29tcGxldGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKGxhYmVsPSJmb28iKQorICAvLyBkZWxsaW5lKCkKKyAgLy8gdHlwZSgiZm9vLnNmIikKKyAgLy8gY29tcGxldGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKAorICAvLyAgbGFiZWw9InNvbWVfZmllbGQuKiIsCisgIC8vICBpbnNlcnRUZXh0PSJzb21lX2ZpZWxkLioiLAorICAvLyApCisgIC8vIGRlbGxpbmUoKQorCisgIHN0ZDo6dmVjdG9yPGludD4gdjsKKworICAvLyBeCisKKyAgLy8gc3RlcAorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gdHlwZSgidi5wdXNoIikKKyAgLy8gY29tcGxldGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKGxhYmVsPSJwdXNoX2JhY2suKiIpCisgIC8vIGRlbGxpbmUoKQorfQorCit2b2lkIFRlc3ROYXZpZ2F0aW9uKCkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IGludHM7CisgIC8vICAgICAgICAgICAgICAgfCAgIHwgaW50cworICAvLyAgICAgIF4KKworICAvLyBzdGVwCisgIC8vIDsgVGVzdCBuYXZpZ2F0aW9uIHRvIGRlZmluaXRpb24gb24gU1RMIHR5cGVzLgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gbmF2aWdhdGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IG5hdmlnYXRpb24uaXRlbXMuZmlsdGVyKHBhdGg9Ii4qL3ZlY3RvciIpCisKKyAgaW50cy5wdXNoX2JhY2soMCk7CisgIC8vIF4KKworICAvLyBzdGVwCisgIC8vIDsgVGVzdCBuYXZpZ2F0aW9uIHRvIGRlZmluaXRpb24gb24gbG9jYWwgc3ltYm9scy4KKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIG5hdmlnYXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBuYXZpZ2F0aW9uLml0ZW1zLmZpbHRlcihwYXRoPSIuKi9nZW5lcmFsLmNjIiwgcmFuZ2U9aW50cykKKworICBQcm90b01zZyBtc2c7CisgIG1zZy5zZXRfc29tZV9maWVsZCgwKTsKKyAgLy8gICAgICAgICAgXgorCisgIC8vIHN0ZXAKKyAgLy8gOyBUZXN0IG5hdmlnYXRpb24gdG8gZGVmaW5pdGlvbiBvbiBwcm90byBmaWVsZHMuIFdlIGRvIG5vdCBjaGVjayBmb3IgYQorICAvLyA7IHNwZWNpZmljIHRhcmdldCBhcyBpdCBjYW4gYmUgaW4gZ2VuZXJhdGVkIGNvZGUuCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyBuYXZpZ2F0aW9uLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgbmF2aWdhdGlvbi5pdGVtcworfQorCit2b2lkIFRlc3RQYXJhbWV0ZXJJbmZvKCkgeworICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgIHYucHVzaF9iYWNrKDApOworICAvLyAgICAgICAgICBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgdGhlIHNpZ25hdHVyZSBoZWxwIGZvciBTVEwgZnVuY3Rpb25zLiBXZSBkbyBub3QgY2hlY2sgZm9yIGEgc3BlY2lmaWMKKyAgLy8gOyB0ZXh0IGFzIGl0IGNhbiBiZSBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyBwYXJhbWluZm8udHJpZ2dlcigpCisgIC8vIGFzc2VydCBwYXJhbWluZm8uaXRlbXMKKworICBGb28oMCwgMC4wKTsKKyAgLy8gICAgICBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgdGhlIHNpZ25hdHVyZSBoZWxwIGZvciB0aGUgZnVuY3Rpb24gJ0ZvbycgaGF2aW5nIHR3byBvdmVybG9hZHMuCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyBwYXJhbWluZm8udHJpZ2dlcigpCisgIC8vIGFzc2VydCBwYXJhbWluZm8uaXRlbXMuZmlsdGVyKAorICAvLyAgYWN0aXZlPXRydWUsCisgIC8vICBsYWJlbD0iRm9vXFwoaW50IHgsIGRvdWJsZSB5XFwpIC0+IHZvaWQiLAorICAvLyAgc2VsZWN0aW9uPSJkb3VibGUgeSIsCisgIC8vICkKKyAgLy8gYXNzZXJ0IHBhcmFtaW5mby5pdGVtcy5maWx0ZXIoCisgIC8vICBhY3RpdmU9ZmFsc2UsCisgIC8vICBsYWJlbD0iRm9vXFwoZmxvYXQgeCwgZmxvYXQgeVxcKSAtPiBmbG9hdCIsCisgIC8vICkKK30KKworaW50IG1haW4oKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwX3N1aXRlLnRleHRwYiBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHBfc3VpdGUudGV4dHBiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzcyNjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwX3N1aXRlLnRleHRwYgpAQCAtMCwwICsxLDUgQEAKK3Rlc3RzOiB7CisgIG5hbWU6ICJnZW5lcmFsIgorICBzY3JpcHRzOiAiYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MiCisgIHNjcmlwdHM6ICJidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvIgorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvaWRlX3F1ZXJ5Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdjZTZkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQKQEAgLTAsMCArMSwyMzkgQEAKKworA291dBKWYQorOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjGjhwcmVidWlsdHMvY2xhbmcvaG9zdC9saW51eC14ODYvY2xhbmctcjUyMjgxNy9iaW4vY2xhbmcrKxoHLW10aHVtYhoDLU9zGhQtZm9taXQtZnJhbWUtcG9pbnRlchoGLW1sbHZtGhktZW5hYmxlLXNocmluay13cmFwPWZhbHNlGgMtTzIaBS1XYWxsGgctV2V4dHJhGgstV2luaXQtc2VsZhoPLVdwb2ludGVyLWFyaXRoGhgtV3VuZ3VhcmRlZC1hdmFpbGFiaWxpdHkaES1XZXJyb3I9ZGF0ZS10aW1lGhYtV2Vycm9yPWludC1jb252ZXJzaW9uGhMtV2Vycm9yPXByYWdtYS1wYWNrGiYtV2Vycm9yPXByYWdtYS1wYWNrLXN1c3BpY2lvdXMtaW5jbHVkZRoYLVdlcnJvcj1zaXplb2YtYXJyYXktZGl2GhctV2Vycm9yPXN0cmluZy1wbHVzLWludBonLVdlcnJvcj11bnJlYWNoYWJsZS1jb2RlLWxvb3AtaW5jcmVtZW50GiItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zGhMtV25vLWM5OS1kZXNpZ25hdG9yGhktV25vLWdudS1mb2xkaW5nLWNvbnN0YW50GiItV25vLWluY29uc2lzdGVudC1taXNzaW5nLW92ZXJyaWRlGhwtV25vLWVycm9yPXJlb3JkZXItaW5pdC1saXN0GhYtV25vLXJlb3JkZXItaW5pdC1saXN0GhEtV25vLXNpZ24tY29tcGFyZRoLLVduby11bnVzZWQaCS1EQU5EUk9JRBoILUROREVCVUcaBy1VREVCVUcaKC1EX19jb21waWxlcl9vZmZzZXRvZj1fX2J1aWx0aW5fb2Zmc2V0b2YaKi1EX19BTkRST0lEX1VOQVZBSUxBQkxFX1NZTUJPTFNfQVJFX1dFQUtfXxoJLWZhZGRyc2lnGhktZmRlYnVnLWRlZmF1bHQtdmVyc2lvbj01GhMtZmNvbG9yLWRpYWdub3N0aWNzGhEtZmZwLWNvbnRyYWN0PW9mZhoPLWZuby1leGNlcHRpb25zGhQtZm5vLXN0cmljdC1hbGlhc2luZxoSLWZtZXNzYWdlLWxlbmd0aD0wGiMtZm5vLXJlbGF4ZWQtdGVtcGxhdGUtdGVtcGxhdGUtYXJncxoXLWdzaW1wbGUtdGVtcGxhdGUtbmFtZXMaCC1nej16c3RkGhYtbm8tY2Fub25pY2FsLXByZWZpeGVzGhEtV25vLWVycm9yPWZvcm1hdBoiLWZkZWJ1Zy1wcmVmaXgtbWFwPS9wcm9jL3NlbGYvY3dkPRocLWZ0cml2aWFsLWF1dG8tdmFyLWluaXQ9emVybxoCLWcaEy1mZnVuY3Rpb24tc2VjdGlvbnMaDy1mZGF0YS1zZWN0aW9ucxoQLWZuby1zaG9ydC1lbnVtcxoPLWZ1bndpbmQtdGFibGVzGhgtZnN0YWNrLXByb3RlY3Rvci1zdHJvbmcaES1XYSwtLW5vZXhlY3N0YWNrGhMtRF9GT1JUSUZZX1NPVVJDRT0yGhMtV3N0cmljdC1hbGlhc2luZz0yGhMtV2Vycm9yPXJldHVybi10eXBlGhgtV2Vycm9yPW5vbi12aXJ0dWFsLWR0b3IaDy1XZXJyb3I9YWRkcmVzcxoWLVdlcnJvcj1zZXF1ZW5jZS1wb2ludBoXLVdlcnJvcj1mb3JtYXQtc2VjdXJpdHkaDC1ub3N0ZGxpYmluYxoaLWZkZWJ1Zy1pbmZvLWZvci1wcm9maWxpbmcaDC1tc29mdC1mbG9hdBoOLW1hcmNoPWFybXY3LWEaEi1tZmxvYXQtYWJpPXNvZnRmcBoKKy1tZnB1PW5lb24aLy1JYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwGrMBLUlvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90by9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAahQEtSW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9jYy9hbmRyb2lkX2FybV9hcm12Ny1hLW5lb24vZ2VuL3Byb3RvGhQtRF9fTElCQ19BUElfXz0xMDAwMBoULURfX0xJQk1fQVBJX189MTAwMDAaFS1EX19MSUJETF9BUElfXz0xMDAwMBoXLUlleHRlcm5hbC9wcm90b2J1Zi9zcmMaWS1JcHJlYnVpbHRzL2NsYW5nL2hvc3QvbGludXgteDg2L2NsYW5nLXI1MjI4MTcvYW5kcm9pZF9saWJjKysvcGxhdGZvcm0vYXJtL2luY2x1ZGUvYysrL3YxGj0tSXByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yNTIyODE3L2luY2x1ZGUvYysrL3YxGiAtSWJpb25pYy9saWJjL2FzeW5jX3NhZmUvaW5jbHVkZRofLUlzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZRonLUliaW9uaWMvbGliYy9zeXN0ZW1fcHJvcGVydGllcy9pbmNsdWRlGjwtSXN5c3RlbS9jb3JlL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvcGFyc2VyL2luY2x1ZGUaCC1pc3lzdGVtGhNiaW9uaWMvbGliYy9pbmNsdWRlGggtaXN5c3RlbRofYmlvbmljL2xpYmMva2VybmVsL3VhcGkvYXNtLWFybRoILWlzeXN0ZW0aF2Jpb25pYy9saWJjL2tlcm5lbC91YXBpGggtaXN5c3RlbRofYmlvbmljL2xpYmMva2VybmVsL2FuZHJvaWQvc2NzaRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC9hbmRyb2lkL3VhcGkaBy10YXJnZXQaHWFybXY3YS1saW51eC1hbmRyb2lkZWFiaTEwMDAwGhAtREFORFJPSURfU1RSSUNUGgUtZlBJRRoHLVdlcnJvchoVLVduby11bnVzZWQtcGFyYW1ldGVyGhktREdPT0dMRV9QUk9UT0JVRl9OT19SVFRJGhYtV2ltcGxpY2l0LWZhbGx0aHJvdWdoGiotRF9MSUJDUFBfRU5BQkxFX1RIUkVBRF9TQUZFVFlfQU5OT1RBVElPTlMaFS1Xbm8tZ251LWluY2x1ZGUtbmV4dBobLWZ2aXNpYmlsaXR5LWlubGluZXMtaGlkZGVuGgYtbWxsdm0aGS1lbmFibGUtc2hyaW5rLXdyYXA9ZmFsc2UaDC1zdGQ9Z251KysyMBoJLWZuby1ydHRpGhUtSXN5c3RlbS9jb3JlL2luY2x1ZGUaHy1Jc3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGUaHC1Jc3lzdGVtL21lZGlhL2F1ZGlvL2luY2x1ZGUaHi1JaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZRolLUloYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3kvaW5jbHVkZRoWLUloYXJkd2FyZS9yaWwvaW5jbHVkZRobLUlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlGiItSWZyYW1ld29ya3MvbmF0aXZlL29wZW5nbC9pbmNsdWRlGhctSWZyYW1ld29ya3MvYXYvaW5jbHVkZRoWLVdlcnJvcj1ib29sLW9wZXJhdGlvbhogLVdlcnJvcj1mb3JtYXQtaW5zdWZmaWNpZW50LWFyZ3MaJS1XZXJyb3I9aW1wbGljaXQtaW50LWZsb2F0LWNvbnZlcnNpb24aGy1XZXJyb3I9aW50LWluLWJvb2wtY29udGV4dBobLVdlcnJvcj1pbnQtdG8tcG9pbnRlci1jYXN0GhstV2Vycm9yPXBvaW50ZXItdG8taW50LWNhc3QaFy1XZXJyb3I9eG9yLXVzZWQtYXMtcG93Gh4tV25vLXZvaWQtcG9pbnRlci10by1lbnVtLWNhc3QaHS1Xbm8tdm9pZC1wb2ludGVyLXRvLWludC1jYXN0GhgtV25vLXBvaW50ZXItdG8taW50LWNhc3QaFi1XZXJyb3I9Zm9ydGlmeS1zb3VyY2UaFC1Xbm8tdW51c2VkLXZhcmlhYmxlGh8tV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzGhMtV25vLXBhY2tlZC1ub24tcG9kGhwtV2Vycm9yPWFkZHJlc3Mtb2YtdGVtcG9yYXJ5GistV2Vycm9yPWluY29tcGF0aWJsZS1mdW5jdGlvbi1wb2ludGVyLXR5cGVzGhgtV2Vycm9yPW51bGwtZGVyZWZlcmVuY2UaEy1XZXJyb3I9cmV0dXJuLXR5cGUaIi1Xbm8tdGF1dG9sb2dpY2FsLWNvbnN0YW50LWNvbXBhcmUaJC1Xbm8tdGF1dG9sb2dpY2FsLXR5cGUtbGltaXQtY29tcGFyZRoiLVduby1pbXBsaWNpdC1pbnQtZmxvYXQtY29udmVyc2lvbhohLVduby10YXV0b2xvZ2ljYWwtb3ZlcmxhcC1jb21wYXJlGhQtV25vLWRlcHJlY2F0ZWQtY29weRoZLVduby1yYW5nZS1sb29wLWNvbnN0cnVjdBoiLVduby16ZXJvLWFzLW51bGwtcG9pbnRlci1jb25zdGFudBopLVduby1kZXByZWNhdGVkLWFub24tZW51bS1lbnVtLWNvbnZlcnNpb24aJC1Xbm8tZGVwcmVjYXRlZC1lbnVtLWVudW0tY29udmVyc2lvbhoVLVduby1wZXNzaW1pemluZy1tb3ZlGh4tV25vLW5vbi1jLXR5cGVkZWYtZm9yLWxpbmthZ2UaEy1Xbm8tYWxpZ24tbWlzbWF0Y2gaIi1Xbm8tZXJyb3I9dW51c2VkLWJ1dC1zZXQtdmFyaWFibGUaIy1Xbm8tZXJyb3I9dW51c2VkLWJ1dC1zZXQtcGFyYW1ldGVyGh4tV25vLWVycm9yPWRlcHJlY2F0ZWQtYnVpbHRpbnMaFS1Xbm8tZXJyb3I9ZGVwcmVjYXRlZBoyLVduby1lcnJvcj1zaW5nbGUtYml0LWJpdGZpZWxkLWNvbnN0YW50LWNvbnZlcnNpb24aJC1Xbm8tZXJyb3I9ZW51bS1jb25zdGV4cHItY29udmVyc2lvbhobLVduby1lcnJvcj1pbnZhbGlkLW9mZnNldG9mGiYtV25vLWRlcHJlY2F0ZWQtZHluYW1pYy1leGNlcHRpb24tc3BlYxo4YnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2Mi1T8KK7YBc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90by9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnBiLmgSmT4vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorLy8gc291cmNlOiBidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZm9vLnByb3RvCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2J1aWxkXzJmbWFrZV8yZnRvb2xzXzJmaWRlXzVmcXVlcnlfMmZwcm9iZXJfNWZzY3JpcHRzXzJmY3BwXzJmZm9vXzJlcHJvdG8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX2J1aWxkXzJmbWFrZV8yZnRvb2xzXzJmaWRlXzVmcXVlcnlfMmZwcm9iZXJfNWZzY3JpcHRzXzJmY3BwXzJmZm9vXzJlcHJvdG8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjaWYgUFJPVE9CVUZfVkVSU0lPTiA8IDMwMjEwMDAKKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gUGxlYXNlIHVwZGF0ZQorI2Vycm9yIHlvdXIgaGVhZGVycy4KKyNlbmRpZgorI2lmIDMwMjEwMTIgPCBQUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT04KKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZQorI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfdW5kZWYuaW5jPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YV9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3BvcnRfZGVmLmluYz4KKyNkZWZpbmUgUFJPVE9CVUZfSU5URVJOQUxfRVhQT1JUX2J1aWxkXzJmbWFrZV8yZnRvb2xzXzJmaWRlXzVmcXVlcnlfMmZwcm9iZXJfNWZzY3JpcHRzXzJmY3BwXzJmZm9vXzJlcHJvdG8KK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCituYW1lc3BhY2UgaW50ZXJuYWwgeworY2xhc3MgQW55TWV0YWRhdGE7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorCisvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IHVzZSB0aGVzZSBtZW1iZXJzLgorc3RydWN0IFRhYmxlU3RydWN0X2J1aWxkXzJmbWFrZV8yZnRvb2xzXzJmaWRlXzVmcXVlcnlfMmZwcm9iZXJfNWZzY3JpcHRzXzJmY3BwXzJmZm9vXzJlcHJvdG8geworICBzdGF0aWMgY29uc3QgOjp1aW50MzJfdCBvZmZzZXRzW107Cit9OworbmFtZXNwYWNlIGlkZV9xdWVyeSB7CituYW1lc3BhY2UgcHJvYmVyX3NjcmlwdHMgeworY2xhc3MgUHJvdG9Nc2c7CitzdHJ1Y3QgUHJvdG9Nc2dEZWZhdWx0VHlwZUludGVybmFsOworZXh0ZXJuIFByb3RvTXNnRGVmYXVsdFR5cGVJbnRlcm5hbCBfUHJvdG9Nc2dfZGVmYXVsdF9pbnN0YW5jZV87Cit9ICAvLyBuYW1lc3BhY2UgcHJvYmVyX3NjcmlwdHMKK30gIC8vIG5hbWVzcGFjZSBpZGVfcXVlcnkKK1BST1RPQlVGX05BTUVTUEFDRV9PUEVOCit0ZW1wbGF0ZTw+IDo6aWRlX3F1ZXJ5Ojpwcm9iZXJfc2NyaXB0czo6UHJvdG9Nc2cqIEFyZW5hOjpDcmVhdGVNYXliZU1lc3NhZ2U8OjppZGVfcXVlcnk6OnByb2Jlcl9zY3JpcHRzOjpQcm90b01zZz4oQXJlbmEqKTsKK1BST1RPQlVGX05BTUVTUEFDRV9DTE9TRQorbmFtZXNwYWNlIGlkZV9xdWVyeSB7CituYW1lc3BhY2UgcHJvYmVyX3NjcmlwdHMgeworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFByb3RvTXNnIGZpbmFsIDoKKyAgICBwdWJsaWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6Ok1lc3NhZ2VMaXRlIC8qIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19kZWZpbml0aW9uOmlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZykgKi8geworIHB1YmxpYzoKKyAgaW5saW5lIFByb3RvTXNnKCkgOiBQcm90b01zZyhudWxscHRyKSB7fQorICB+UHJvdG9Nc2coKSBvdmVycmlkZTsKKyAgZXhwbGljaXQgUFJPVE9CVUZfQ09OU1RFWFBSIFByb3RvTXNnKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6Q29uc3RhbnRJbml0aWFsaXplZCk7CisKKyAgUHJvdG9Nc2coY29uc3QgUHJvdG9Nc2cmIGZyb20pOworICBQcm90b01zZyhQcm90b01zZyYmIGZyb20pIG5vZXhjZXB0CisgICAgOiBQcm90b01zZygpIHsKKyAgICAqdGhpcyA9IDo6c3RkOjptb3ZlKGZyb20pOworICB9CisKKyAgaW5saW5lIFByb3RvTXNnJiBvcGVyYXRvcj0oY29uc3QgUHJvdG9Nc2cmIGZyb20pIHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbmxpbmUgUHJvdG9Nc2cmIG9wZXJhdG9yPShQcm90b01zZyYmIGZyb20pIG5vZXhjZXB0IHsKKyAgICBpZiAodGhpcyA9PSAmZnJvbSkgcmV0dXJuICp0aGlzOworICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IGZyb20uR2V0T3duaW5nQXJlbmEoKQorICAjaWZkZWYgUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgICAgICYmIEdldE93bmluZ0FyZW5hKCkgIT0gbnVsbHB0cgorICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX01PVkUKKyAgICApIHsKKyAgICAgIEludGVybmFsU3dhcCgmZnJvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvcHlGcm9tKGZyb20pOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgY29uc3QgUHJvdG9Nc2cmIGRlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuICppbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBQcm90b01zZyogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQcm90b01zZyo+KAorICAgICAgICAgICAgICAgJl9Qcm90b01zZ19kZWZhdWx0X2luc3RhbmNlXyk7CisgIH0KKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0luZGV4SW5GaWxlTWVzc2FnZXMgPQorICAgIDA7CisKKyAgZnJpZW5kIHZvaWQgc3dhcChQcm90b01zZyYgYSwgUHJvdG9Nc2cmIGIpIHsKKyAgICBhLlN3YXAoJmIpOworICB9CisgIGlubGluZSB2b2lkIFN3YXAoUHJvdG9Nc2cqIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAgI2Vsc2UgIC8vIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgIGlmIChHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKSB7CisgICNlbmRpZiAgLy8gIVBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fU1dBUAorICAgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpHZW5lcmljU3dhcCh0aGlzLCBvdGhlcik7CisgICAgfQorICB9CisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKFByb3RvTXNnKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICAgR09PR0xFX0RDSEVDSyhHZXRPd25pbmdBcmVuYSgpID09IG90aGVyLT5HZXRPd25pbmdBcmVuYSgpKTsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBQcm90b01zZyogTmV3KDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEpIGNvbnN0IGZpbmFsIHsKKyAgICByZXR1cm4gQ3JlYXRlTWF5YmVNZXNzYWdlPFByb3RvTXNnPihhcmVuYSk7CisgIH0KKyAgUHJvdG9Nc2cqIE5ldygpIGNvbnN0IHsKKyAgICByZXR1cm4gTmV3KG51bGxwdHIpOworICB9CisgIHZvaWQgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSYgZnJvbSkgIGZpbmFsOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFByb3RvTXNnJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgUHJvdG9Nc2cmIGZyb20pOworICBQUk9UT0JVRl9BVFRSSUJVVEVfUkVJTklUSUFMSVpFUyB2b2lkIENsZWFyKCkgZmluYWw7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IGZpbmFsOworCisgIHNpemVfdCBCeXRlU2l6ZUxvbmcoKSBjb25zdCBmaW5hbDsKKyAgY29uc3QgY2hhciogX0ludGVybmFsUGFyc2UoY29uc3QgY2hhciogcHRyLCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OlBhcnNlQ29udGV4dCogY3R4KSBmaW5hbDsKKyAgOjp1aW50OF90KiBfSW50ZXJuYWxTZXJpYWxpemUoCisgICAgICA6OnVpbnQ4X3QqIHRhcmdldCwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmlvOjpFcHNDb3B5T3V0cHV0U3RyZWFtKiBzdHJlYW0pIGNvbnN0IGZpbmFsOworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIF9pbXBsXy5fY2FjaGVkX3NpemVfLkdldCgpOyB9CisKKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYSogYXJlbmEsIGJvb2wgaXNfbWVzc2FnZV9vd25lZCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChQcm90b01zZyogb3RoZXIpOworCisgIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkFueU1ldGFkYXRhOworICBzdGF0aWMgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OlN0cmluZ1BpZWNlIEZ1bGxNZXNzYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gImlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZyI7CisgIH0KKyAgcHJvdGVjdGVkOgorICBleHBsaWNpdCBQcm90b01zZyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21lc3NhZ2Vfb3duZWQgPSBmYWxzZSk7CisgIHB1YmxpYzoKKworICBzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0IGZpbmFsOworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBlbnVtIDogaW50IHsKKyAgICBrU29tZUZpZWxkRmllbGROdW1iZXIgPSAxLAorICB9OworICAvLyBpbnQ2NCBzb21lX2ZpZWxkID0gMTsKKyAgdm9pZCBjbGVhcl9zb21lX2ZpZWxkKCk7CisgIDo6aW50NjRfdCBzb21lX2ZpZWxkKCkgY29uc3Q7CisgIHZvaWQgc2V0X3NvbWVfZmllbGQoOjppbnQ2NF90IHZhbHVlKTsKKyAgcHJpdmF0ZToKKyAgOjppbnQ2NF90IF9pbnRlcm5hbF9zb21lX2ZpZWxkKCkgY29uc3Q7CisgIHZvaWQgX2ludGVybmFsX3NldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSk7CisgIHB1YmxpYzoKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6aWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzLlByb3RvTXNnKQorIHByaXZhdGU6CisgIGNsYXNzIF9JbnRlcm5hbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpBcmVuYTo6SW50ZXJuYWxIZWxwZXI7CisgIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87CisgIHR5cGVkZWYgdm9pZCBEZXN0cnVjdG9yU2tpcHBhYmxlXzsKKyAgc3RydWN0IEltcGxfIHsKKyAgICA6OmludDY0X3Qgc29tZV9maWVsZF87CisgICAgbXV0YWJsZSA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNhY2hlZFNpemUgX2NhY2hlZF9zaXplXzsKKyAgfTsKKyAgdW5pb24geyBJbXBsXyBfaW1wbF87IH07CisgIGZyaWVuZCBzdHJ1Y3QgOjpUYWJsZVN0cnVjdF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvOworfTsKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N0cmljdC1hbGlhc2luZyIKKyNlbmRpZiAgLy8gX19HTlVDX18KKy8vIFByb3RvTXNnCisKKy8vIGludDY0IHNvbWVfZmllbGQgPSAxOworaW5saW5lIHZvaWQgUHJvdG9Nc2c6OmNsZWFyX3NvbWVfZmllbGQoKSB7CisgIF9pbXBsXy5zb21lX2ZpZWxkXyA9IDo6aW50NjRfdHswfTsKK30KK2lubGluZSA6OmludDY0X3QgUHJvdG9Nc2c6Ol9pbnRlcm5hbF9zb21lX2ZpZWxkKCkgY29uc3QgeworICByZXR1cm4gX2ltcGxfLnNvbWVfZmllbGRfOworfQoraW5saW5lIDo6aW50NjRfdCBQcm90b01zZzo6c29tZV9maWVsZCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDppZGVfcXVlcnkucHJvYmVyX3NjcmlwdHMuUHJvdG9Nc2cuc29tZV9maWVsZCkKKyAgcmV0dXJuIF9pbnRlcm5hbF9zb21lX2ZpZWxkKCk7Cit9CitpbmxpbmUgdm9pZCBQcm90b01zZzo6X2ludGVybmFsX3NldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSkgeworICAKKyAgX2ltcGxfLnNvbWVfZmllbGRfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBQcm90b01zZzo6c2V0X3NvbWVfZmllbGQoOjppbnQ2NF90IHZhbHVlKSB7CisgIF9pbnRlcm5hbF9zZXRfc29tZV9maWVsZCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6aWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzLlByb3RvTXNnLnNvbWVfZmllbGQpCit9CisKKyNpZmRlZiBfX0dOVUNfXworICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmICAvLyBfX0dOVUNfXworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCit9ICAvLyBuYW1lc3BhY2UgcHJvYmVyX3NjcmlwdHMKK30gIC8vIG5hbWVzcGFjZSBpZGVfcXVlcnkKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lOQ0xVREVEX0dPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2ggYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmVkZmU1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9yZWdlbi5zaApAQCAtMCwwICsxLDMzIEBACisjIS9iaW4vYmFzaCAtZQorCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGlkZV9xdWVyeS5vdXQgZmlsZS4KKyMKKyMgVGhlIGlkZV9xdWVyeS5vdXQgZmlsZSBpcyBhIHByZS1jb21wdXRlZCByZXN1bHQgb2YgcnVubmluZyBpZGVfcXVlcnkuc2gKKyMgb24gYSBzZXQgb2YgZmlsZXMuIFRoaXMgYWxsb3dzIHRoZSBwcm9iZXIgdG8gcnVuIGl0cyB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcKKyMgaWRlX3F1ZXJ5LnNoLiBUaGUgcHJvYmVyIGRvZXNuJ3QgY2hlY2stb3V0IHRoZSBmdWxsIHNvdXJjZSBjb2RlLCBzbyBpdAorIyBjYW4ndCBydW4gaWRlX3F1ZXJ5LnNoIGl0c2VsZi4KKworY2QgJChkaXJuYW1lICRCQVNIX1NPVVJDRSkKK3NvdXJjZSAkKHB3ZCkvLi4vLi4vLi4vc2hlbGxfdXRpbHMuc2gKK3JlcXVpcmVfdG9wCisKK2ZpbGVzX3RvX2J1aWxkPSgKKyAgYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MKKykKKworY2QgJHtUT1B9CitidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuc2ggLS1sdW5jaF90YXJnZXQ9YW9zcF9hcm0tdHJ1bmtfc3RhZ2luZy1lbmcgJHtmaWxlc190b19idWlsZFtAXX0gPiBidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0Cg==