ZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0ZjhkZjNlLi4wYmRkMjZlIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMSw2ICszMSw5IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLnBlcm1pc3Npb24uR09PR0xFX0FVVEguQUxMX1NFUlZJQ0VTIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5wZXJtaXNzaW9uLkdPT0dMRV9BVVRILllvdVR1YmVVc2VyIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5wZXJtaXNzaW9uLkFDQ0VTU19HT09HTEVfUEFTU1dPUkQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5HRVRfQUNDT1VOVFMiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5VU0VfQ1JFREVOVElBTFMiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfQUNDT1VOVFMiIC8+CiAKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iRGV2IFRvb2xzIgogICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbGF1bmNoZXJfZGV2dG9vbHMiPgpAQCAtNzMsNiArNzYsMTQgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJBY2NvdW50c1Rlc3RlciIgYW5kcm9pZDpsYWJlbD0iQWNjb3VudHNUZXN0ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuVEVTVCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJEYXRhTGlzdCI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkRldGFpbHMiPgpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRfbGlzdF9jb250ZXh0X21lbnUueG1sIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRfbGlzdF9jb250ZXh0X21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTdjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYWNjb3VudF9saXN0X2NvbnRleHRfbWVudS54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtZW51IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9yZW1vdmVfYWNjb3VudCIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfcmVtb3ZlX2FjY291bnQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9nZXRfYXV0aF90b2tlbiIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZ2V0X2F1dGhfdG9rZW4iIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9pbnZhbGlkYXRlX2F1dGhfdG9rZW4iCisgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX2ludmFsaWRhdGVfYXV0aF90b2tlbiIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX3VwZGF0ZV9jcmVkZW50aWFscyIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfdXBkYXRlX2NyZWRlbnRpYWxzIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfY29uZmlybV9jcmVkZW50aWFscyIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfY29uZmlybV9jcmVkZW50aWFscyIgLz4KKworPC9tZW51PgpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRzX3Rlc3Rlci54bWwgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYWNjb3VudHNfdGVzdGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTViMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRzX3Rlc3Rlci54bWwKQEAgLTAsMCArMSw4NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hY2NvdW50X3R5cGVzX3NwaW5uZXJfbGFiZWwiCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX3NlbGVjdF9hY2NvdW50X3R5cGUiLz4KKworICAgICAgICAgIDxTcGlubmVyIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2FjY291bnRfdHlwZXNfc3Bpbm5lciIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2F1dGhlbnRpY2F0b3JzX2xpc3QiCisgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiLz4KKworICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9nZXRfYWNjb3VudHNfYnlfdHlwZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZ2V0X2FjY291bnRzX2J5X3R5cGUiLz4KKworICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfZ2V0X2FsbF9hY2NvdW50cyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZ2V0X2FsbF9hY2NvdW50cyIvPgorCisgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2FkZF9hY2NvdW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9hZGRfYWNjb3VudCIvPgorCisgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2VkaXRfcHJvcGVydGllcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZWRpdF9wcm9wZXJ0aWVzIi8+CisgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2FjY291bnRzX2xpc3QiCisgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2F1dGhlbnRpY2F0b3JzX2xpc3RfaXRlbS54bWwgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYXV0aGVudGljYXRvcnNfbGlzdF9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDlhODE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2F1dGhlbnRpY2F0b3JzX2xpc3RfaXRlbS54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRXNtZXJ0ZWMgQUcuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjFkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjlkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjlkaXAiPgorCisgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hdXRoZW50aWNhdG9yX2ljb24iCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI5ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfYXV0aGVudGljYXRvcl9sYWJlbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX2hvcml6b250YWx8Y2VudGVyX3ZlcnRpY2FsIiAvPgorPC9MaW5lYXJMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9nZXRfYXV0aF90b2tlbl92aWV3LnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9nZXRfYXV0aF90b2tlbl92aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzcxNTIzCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2dldF9hdXRoX3Rva2VuX3ZpZXcueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2dldF9hdXRoX3Rva2VuX2RpYWxvZ19tZXNzYWdlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX2VudGVyX2F1dGhfdG9rZW5fdHlwZSIgLz4KKworICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hdXRoX3Rva2VuX3R5cGUiCisgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iMjUwZGlwIgorICAgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbEhvcml6b250YWxseT0idHJ1ZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpjYXBpdGFsaXplPSJub25lIgorICAgICAgICAgICAgICBhbmRyb2lkOmF1dG9UZXh0PSJmYWxzZSIvPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA0Yzg0NTQ4Li5kM2Y2YWEzIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xMzMsNCArMTMzLDIxIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtX2xpc3RfaGVhZGVyX3RleHQiPkFwcHMgdXNpbmcgcGVybWlzc2lvbiAgPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzb3VyY2VfdWlkX3RleHQiPlNvdXJjZSB1aWQgOiAgPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzaGFyZWRfcGtnc190ZXh0Ij5QYWNrYWdlcyBhY2Nlc3NpbmcgdmlhIHNoYXJlZCB1aWQgOiAgPC9zdHJpbmc+CisKKyAgICA8IS0tIEFjY291bnRzVGVzdGVyIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2FwcF9uYW1lIj5BY2NvdW50cyBUZXN0ZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9nZXRfYWNjb3VudHNfYnlfdHlwZSI+R2V0IEFjY291bnRzIEJ5IFR5cGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9nZXRfYWxsX2FjY291bnRzIj5HZXQgQWxsIEFjY291bnRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfYWRkX2FjY291bnQiPkFkZCBBY2NvdW50PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfc2VsZWN0X2FjY291bnRfdHlwZSI+U2VsZWN0IEFjY291bnQgVHlwZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX3Byb2Nlc3NfbmFtZV9oZWFkZXIiPlByb2Nlc3MgTmFtZTo8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9yZW1vdmVfYWNjb3VudCI+cmVtb3ZlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfZ2V0X2F1dGhfdG9rZW4iPmF1dGhlbnRpY2F0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2ludmFsaWRhdGVfYXV0aF90b2tlbiI+aW52YWxpZGF0ZSB0b2tlbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2FjY291bnRfY29udGV4dF9tZW51X3RpdGxlIj5hY2NvdW50IG9wZXJhdGlvbnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9kb19nZXRfYXV0aF90b2tlbiI+T2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9lbnRlcl9hdXRoX3Rva2VuX3R5cGUiPkVudGVyIHRoZSBhdXRodG9rZW4gdHlwZTo8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl91cGRhdGVfY3JlZGVudGlhbHMiPlVwZGF0ZSBDcmVkZW50aWFsczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2NvbmZpcm1fY3JlZGVudGlhbHMiPkNvbmZpcm0gQ3JlZGVudGlhbHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9lZGl0X3Byb3BlcnRpZXMiPkVkaXQgUHJvcGVydGllczwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9BY2NvdW50c1Rlc3Rlci5qYXZhIGIvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvQWNjb3VudHNUZXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI2YzRjCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvQWNjb3VudHNUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZGV2ZWxvcG1lbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50Lio7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuKjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudmlldy4qOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lio7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBBY2NvdW50c1Rlc3RlciBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgT25BY2NvdW50c1VwZGF0ZWRMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY2NvdW50c1Rlc3RlciI7CisgICAgcHJpdmF0ZSBTcGlubmVyIG1BY2NvdW50VHlwZXNTcGlubmVyOworICAgIHByaXZhdGUgTGlzdFZpZXcgbUFjY291bnRzTGlzdFZpZXc7CisgICAgcHJpdmF0ZSBMaXN0VmlldyBtQXV0aGVudGljYXRvcnNMaXN0VmlldzsKKyAgICBwcml2YXRlIEFjY291bnRNYW5hZ2VyIG1BY2NvdW50TWFuYWdlcjsKKyAgICBwcml2YXRlIFN0cmluZyBtTG9uZ1ByZXNzZWRBY2NvdW50ID0gbnVsbDsKKyAgICBwcml2YXRlIEZ1dHVyZTFDYWxsYmFjazxBY2NvdW50W10+IG1HZXRBY2NvdW50c0NhbGxiYWNrOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01fR09PR0xFX0dBSUEgPSAiY29tLmdvb2dsZS5HQUlBIjsKKyAgICBwcml2YXRlIEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbltdIG1BdXRoZW50aWNhdG9yRGVzY3M7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0FVVEhfVE9LRU5fRElBTE9HX0lEID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0NSRURFTlRJQUxTX0RJQUxPR19JRCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURBVEVfQVVUSF9UT0tFTl9ESUFMT0dfSUQgPSAzOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtQWNjb3VudE1hbmFnZXIgPSBBY2NvdW50TWFuYWdlci5nZXQodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFjY291bnRzX3Rlc3Rlcik7CisgICAgICAgIEJ1dHRvbkNsaWNrTGlzdGVuZXIgYnV0dG9uQ2xpY2tMaXN0ZW5lciA9IG5ldyBCdXR0b25DbGlja0xpc3RlbmVyKCk7CisgICAgICAgIG1HZXRBY2NvdW50c0NhbGxiYWNrID0gbmV3IEZ1dHVyZTFDYWxsYmFjazxBY2NvdW50W10+KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKEZ1dHVyZTE8QWNjb3VudFtdPiBmdXR1cmUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtR2V0QWNjb3VudHNDYWxsYmFjazogc3RhcnRpbmciKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBBY2NvdW50W10gYWNjb3VudHMgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIG9uQWNjb3VudHNVcGRhdGVkKGFjY291bnRzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0IHdhcyBjYW5jZWxlZAorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtR2V0QWNjb3VudHNDYWxsYmFjazogcmVxdWVzdCB3YXMgY2FuY2VsZWQiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbUFjY291bnRUeXBlc1NwaW5uZXIgPSAoU3Bpbm5lcikgZmluZFZpZXdCeUlkKFIuaWQuYWNjb3VudHNfdGVzdGVyX2FjY291bnRfdHlwZXNfc3Bpbm5lcik7CisgICAgICAgIG1BY2NvdW50c0xpc3RWaWV3ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5hY2NvdW50c190ZXN0ZXJfYWNjb3VudHNfbGlzdCk7CisgICAgICAgIG1BdXRoZW50aWNhdG9yc0xpc3RWaWV3ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5hY2NvdW50c190ZXN0ZXJfYXV0aGVudGljYXRvcnNfbGlzdCk7CisgICAgICAgIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUobUFjY291bnRzTGlzdFZpZXcpOworICAgICAgICBhc3luY0dldEF1dGhlbnRpY2F0b3JUeXBlcygpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5hY2NvdW50c190ZXN0ZXJfZ2V0X2FsbF9hY2NvdW50cykuc2V0T25DbGlja0xpc3RlbmVyKGJ1dHRvbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5hY2NvdW50c190ZXN0ZXJfZ2V0X2FjY291bnRzX2J5X3R5cGUpLnNldE9uQ2xpY2tMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBidXR0b25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuYWNjb3VudHNfdGVzdGVyX2FkZF9hY2NvdW50KS5zZXRPbkNsaWNrTGlzdGVuZXIoYnV0dG9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmFjY291bnRzX3Rlc3Rlcl9lZGl0X3Byb3BlcnRpZXMpLnNldE9uQ2xpY2tMaXN0ZW5lcihidXR0b25DbGlja0xpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBdXRoZW50aWNhdG9yc0FycmF5QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxBdXRoZW50aWNhdG9yRGVzY3JpcHRpb24+IHsKKyAgICAgICAgcHJvdGVjdGVkIExheW91dEluZmxhdGVyIG1JbmZsYXRlcjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1SZXNvdXJjZSA9IFIubGF5b3V0LmF1dGhlbnRpY2F0b3JzX2xpc3RfaXRlbTsKKworICAgICAgICBwdWJsaWMgQXV0aGVudGljYXRvcnNBcnJheUFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBBdXRoZW50aWNhdG9yRGVzY3JpcHRpb25bXSBpdGVtcykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbVJlc291cmNlLCBpdGVtcyk7CisgICAgICAgICAgICBtSW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBWaWV3SG9sZGVyIHsKKyAgICAgICAgICAgIFRleHRWaWV3IGxhYmVsOworICAgICAgICAgICAgSW1hZ2VWaWV3IGljb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIC8vIEEgVmlld0hvbGRlciBrZWVwcyByZWZlcmVuY2VzIHRvIGNoaWxkcmVuIHZpZXdzIHRvIGF2b2lkIHVubmVjY2Vzc2FyeSBjYWxscworICAgICAgICAgICAgLy8gdG8gZmluZFZpZXdCeUlkKCkgb24gZWFjaCByb3cuCisgICAgICAgICAgICBWaWV3SG9sZGVyIGhvbGRlcjsKKworICAgICAgICAgICAgLy8gV2hlbiBjb252ZXJ0VmlldyBpcyBub3QgbnVsbCwgd2UgY2FuIHJldXNlIGl0IGRpcmVjdGx5LCB0aGVyZSBpcyBubyBuZWVkCisgICAgICAgICAgICAvLyB0byByZWluZmxhdGUgaXQuIFdlIG9ubHkgaW5mbGF0ZSBhIG5ldyBWaWV3IHdoZW4gdGhlIGNvbnZlcnRWaWV3IHN1cHBsaWVkCisgICAgICAgICAgICAvLyBieSBMaXN0VmlldyBpcyBudWxsLgorICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0VmlldyA9IG1JbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmF1dGhlbnRpY2F0b3JzX2xpc3RfaXRlbSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGVzIGEgVmlld0hvbGRlciBhbmQgc3RvcmUgcmVmZXJlbmNlcyB0byB0aGUgdHdvIGNoaWxkcmVuIHZpZXdzCisgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0byBiaW5kIGRhdGEgdG8uCisgICAgICAgICAgICAgICAgaG9sZGVyID0gbmV3IFZpZXdIb2xkZXIoKTsKKyAgICAgICAgICAgICAgICBob2xkZXIubGFiZWwgPSAoVGV4dFZpZXcpIGNvbnZlcnRWaWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuaWQuYWNjb3VudHNfdGVzdGVyX2F1dGhlbnRpY2F0b3JfbGFiZWwpOworICAgICAgICAgICAgICAgIGhvbGRlci5pY29uID0gKEltYWdlVmlldykgY29udmVydFZpZXcuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgUi5pZC5hY2NvdW50c190ZXN0ZXJfYXV0aGVudGljYXRvcl9pY29uKTsKKworICAgICAgICAgICAgICAgIGNvbnZlcnRWaWV3LnNldFRhZyhob2xkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIFZpZXdIb2xkZXIgYmFjayB0byBnZXQgZmFzdCBhY2Nlc3MgdG8gdGhlIFRleHRWaWV3CisgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBJbWFnZVZpZXcuCisgICAgICAgICAgICAgICAgaG9sZGVyID0gKFZpZXdIb2xkZXIpIGNvbnZlcnRWaWV3LmdldFRhZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBBdXRoZW50aWNhdG9yRGVzY3JpcHRpb24gZGVzYyA9IGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gZGVzYy5wYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBhdXRoQ29udGV4dCA9IGdldENvbnRleHQoKS5jcmVhdGVQYWNrYWdlQ29udGV4dChwYWNrYWdlTmFtZSwgMCk7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGV4dCBmaWVsZAorICAgICAgICAgICAgICAgIGhvbGRlci5sYWJlbC5zZXRUZXh0KGF1dGhDb250ZXh0LmdldFN0cmluZyhkZXNjLmxhYmVsSWQpKTsKKworICAgICAgICAgICAgICAgIC8vIFNldCByZXNvdXJjZSBpY29uCisgICAgICAgICAgICAgICAgaG9sZGVyLmljb24uc2V0SW1hZ2VEcmF3YWJsZShhdXRoQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShkZXNjLmljb25JZCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJlcnJvciBnZXR0aW5nIHRoZSBQYWNrYWdlIENvbnRleHQgZm9yICIgKyBwYWNrYWdlTmFtZSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VmlldzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3luY0dldEF1dGhlbnRpY2F0b3JUeXBlcygpIHsKKyAgICAgICAgbUFjY291bnRNYW5hZ2VyLmdldEF1dGhlbnRpY2F0b3JUeXBlcyhuZXcgR2V0QXV0aGVudGljYXRvcnNDYWxsYmFjaygpLCBudWxsIC8qIGhhbmRsZXIgKi8pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWNjb3VudHNVcGRhdGVkKEFjY291bnRbXSBhY2NvdW50cykgeworICAgICAgICBMb2cuZChUQUcsICJvbkFjY291bnRzVXBkYXRlZDogXG4gICIgKyBUZXh0VXRpbHMuam9pbigiXG4gICIsIGFjY291bnRzKSk7CisgICAgICAgIFN0cmluZ1tdIGFjY291bnROYW1lcyA9IG5ldyBTdHJpbmdbYWNjb3VudHMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NvdW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWNjb3VudE5hbWVzW2ldID0gYWNjb3VudHNbaV0ubU5hbWU7CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlBZGFwdGVyPFN0cmluZz4gYWRhcHRlciA9CisgICAgICAgICAgICAgICAgbmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KEFjY291bnRzVGVzdGVyLnRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIGFjY291bnROYW1lcyk7CisgICAgICAgIG1BY2NvdW50c0xpc3RWaWV3LnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICBmaW5hbCBIYW5kbGVyIG1haW5IYW5kbGVyID0gbmV3IEhhbmRsZXIoZ2V0TWFpbkxvb3BlcigpKTsKKyAgICAgICAgbUFjY291bnRNYW5hZ2VyLmFkZE9uQWNjb3VudHNVcGRhdGVkTGlzdGVuZXIodGhpcywgbWFpbkhhbmRsZXIsCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiB1cGRhdGVJbW1lZGlhdGVseSAqLyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgbUFjY291bnRNYW5hZ2VyLnJlbW92ZU9uQWNjb3VudHNVcGRhdGVkTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgY2xhc3MgQnV0dG9uQ2xpY2tMaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIGlmIChSLmlkLmFjY291bnRzX3Rlc3Rlcl9nZXRfYWxsX2FjY291bnRzID09IHYuZ2V0SWQoKSkgeworICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5nZXRBY2NvdW50cyhtR2V0QWNjb3VudHNDYWxsYmFjaywgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUi5pZC5hY2NvdW50c190ZXN0ZXJfZ2V0X2FjY291bnRzX2J5X3R5cGUgPT0gdi5nZXRJZCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBnZXRTZWxlY3RlZEF1dGhlbnRpY2F0b3IoKS50eXBlOworICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5nZXRBY2NvdW50c0J5VHlwZShtR2V0QWNjb3VudHNDYWxsYmFjaywgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogaGFuZGxlciAqLyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFIuaWQuYWNjb3VudHNfdGVzdGVyX2FkZF9hY2NvdW50ID09IHYuZ2V0SWQoKSkgeworICAgICAgICAgICAgICAgIEZ1dHVyZTJDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBGdXR1cmUyQ2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5rZXlTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhY2NvdW50IGFkZGVkOiAiICsgYnVuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGRBY2NvdW50IHdhcyBjYW5jZWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZEFjY291bnQgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGRBY2NvdW50IGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuYWRkQWNjb3VudChnZXRTZWxlY3RlZEF1dGhlbnRpY2F0b3IoKS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBhdXRoVG9rZW5UeXBlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiByZXF1aXJlZEZlYXR1cmVzICovLCBudWxsIC8qIG9wdGlvbnMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50c1Rlc3Rlci50aGlzLCBjYWxsYmFjaywgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUi5pZC5hY2NvdW50c190ZXN0ZXJfZWRpdF9wcm9wZXJ0aWVzID09IHYuZ2V0SWQoKSkgeworICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5lZGl0UHJvcGVydGllcyhnZXRTZWxlY3RlZEF1dGhlbnRpY2F0b3IoKS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgQWNjb3VudHNUZXN0ZXIudGhpcywgbmV3IEVkaXRQcm9wZXJ0aWVzQ2FsbGJhY2soKSwgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdW5rbm93biBidXR0b24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgRWRpdFByb3BlcnRpZXNDYWxsYmFjayBpbXBsZW1lbnRzIEZ1dHVyZTJDYWxsYmFjayB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oRnV0dXJlMiBmdXR1cmUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICBidW5kbGUua2V5U2V0KCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVkaXRQcm9wZXJ0aWVzIHN1Y2NlZWRlZDogIiArIGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJlZGl0UHJvcGVydGllcyB3YXMgY2FuY2VsZWQiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVkaXRQcm9wZXJ0aWVzIGZhaWxlZDogIiwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXV0aGVudGljYXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVkaXRQcm9wZXJ0aWVzIGZhaWxlZDogIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBBdXRoZW50aWNhdG9yRGVzY3JpcHRpb24gZ2V0U2VsZWN0ZWRBdXRoZW50aWNhdG9yKCkgeworICAgICAgICByZXR1cm4gbUF1dGhlbnRpY2F0b3JEZXNjc1ttQWNjb3VudFR5cGVzU3Bpbm5lci5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpXTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwKKyAgICAgICAgICAgIENvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBtZW51LnNldEhlYWRlclRpdGxlKFIuc3RyaW5nLmFjY291bnRzX3Rlc3Rlcl9hY2NvdW50X2NvbnRleHRfbWVudV90aXRsZSk7CisKKyAgICAgICAgQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbyBpbmZvID0gKEFkYXB0ZXJWaWV3LkFkYXB0ZXJDb250ZXh0TWVudUluZm8pbWVudUluZm87CisKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuYWNjb3VudF9saXN0X2NvbnRleHRfbWVudSwgbWVudSk7CisgICAgICAgIG1Mb25nUHJlc3NlZEFjY291bnQgPSAoKFRleHRWaWV3KWluZm8udGFyZ2V0VmlldykuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Db250ZXh0SXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0uZ2V0SXRlbUlkKCkgPT0gUi5pZC5hY2NvdW50c190ZXN0ZXJfcmVtb3ZlX2FjY291bnQpIHsKKyAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5yZW1vdmVBY2NvdW50KG51bGwgLyogY2FsbGJhY2sgKi8sIG5ldyBBY2NvdW50KG1Mb25nUHJlc3NlZEFjY291bnQsCisgICAgICAgICAgICAgICAgICAgIENPTV9HT09HTEVfR0FJQSksIG51bGwgLyogaGFuZGxlciAqLyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5nZXRJdGVtSWQoKSA9PSBSLmlkLmFjY291bnRzX3Rlc3Rlcl9nZXRfYXV0aF90b2tlbikgeworICAgICAgICAgICAgc2hvd0RpYWxvZyhHRVRfQVVUSF9UT0tFTl9ESUFMT0dfSUQpOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZ2V0SXRlbUlkKCkgPT0gUi5pZC5hY2NvdW50c190ZXN0ZXJfaW52YWxpZGF0ZV9hdXRoX3Rva2VuKSB7CisgICAgICAgICAgICBzaG93RGlhbG9nKElOVkFMSURBVEVfQVVUSF9UT0tFTl9ESUFMT0dfSUQpOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZ2V0SXRlbUlkKCkgPT0gUi5pZC5hY2NvdW50c190ZXN0ZXJfdXBkYXRlX2NyZWRlbnRpYWxzKSB7CisgICAgICAgICAgICBzaG93RGlhbG9nKFVQREFURV9DUkVERU5USUFMU19ESUFMT0dfSUQpOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZ2V0SXRlbUlkKCkgPT0gUi5pZC5hY2NvdW50c190ZXN0ZXJfY29uZmlybV9jcmVkZW50aWFscykgeworICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmNvbmZpcm1DcmVkZW50aWFscyhuZXcgQWNjb3VudChtTG9uZ1ByZXNzZWRBY2NvdW50LCBDT01fR09PR0xFX0dBSUEpLAorICAgICAgICAgICAgICAgICAgICBBY2NvdW50c1Rlc3Rlci50aGlzLCBuZXcgQ29uZmlybUNyZWRlbnRpYWxzQ2FsbGJhY2soKSwgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKGZpbmFsIGludCBpZCkgeworICAgICAgICBpZiAoaWQgPT0gR0VUX0FVVEhfVE9LRU5fRElBTE9HX0lEIHx8IGlkID09IElOVkFMSURBVEVfQVVUSF9UT0tFTl9ESUFMT0dfSUQKKyAgICAgICAgICAgICAgICB8fCBpZCA9PSBVUERBVEVfQ1JFREVOVElBTFNfRElBTE9HX0lEKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBMYXlvdXRJbmZsYXRlci5mcm9tKHRoaXMpLmluZmxhdGUoUi5sYXlvdXQuZ2V0X2F1dGhfdG9rZW5fdmlldywgbnVsbCk7CisgICAgICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcuYWNjb3VudHNfdGVzdGVyX2RvX2dldF9hdXRoX3Rva2VuLAorICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgdmFsdWUgPSAoRWRpdFRleHQpIHZpZXcuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5pZC5hY2NvdW50c190ZXN0ZXJfYXV0aF90b2tlbl90eXBlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdXRoVG9rZW5UeXBlID0gdmFsdWUuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnV0dXJlMkNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEZ1dHVyZTJDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKEZ1dHVyZTIgZnV0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmtleVNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImRpYWxvZyAiICsgaWQgKyAiIHN1Y2Nlc3M6ICIgKyBidW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImRpYWxvZyAiICsgaWQgKyAiIGNhbmNlbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGlhbG9nICIgKyBpZCArICIgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJkaWFsb2cgIiArIGlkICsgIiBmYWlsZWQ6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50ID0gbmV3IEFjY291bnQobUxvbmdQcmVzc2VkQWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTV9HT09HTEVfR0FJQSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkID09IEdFVF9BVVRIX1RPS0VOX0RJQUxPR19JRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuZ2V0QXV0aFRva2VuKGFjY291bnQsIGF1dGhUb2tlblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBsb2dpbk9wdGlvbnMgKi8sIEFjY291bnRzVGVzdGVyLnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIG51bGwgLyogaGFuZGxlciAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBJTlZBTElEQVRFX0FVVEhfVE9LRU5fRElBTE9HX0lEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5nZXRBdXRoVG9rZW4oYWNjb3VudCwgYXV0aFRva2VuVHlwZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdldEFuZEludmFsaWRhdGVBdXRoVG9rZW5DYWxsYmFjaygpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIudXBkYXRlQ3JlZGVudGlhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW5UeXBlLCBudWxsIC8qIGxvZ2luT3B0aW9ucyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50c1Rlc3Rlci50aGlzLCBjYWxsYmFjaywgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Vmlldyh2aWV3KTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5vbkNyZWF0ZURpYWxvZyhpZCk7CisgICAgfQorCisgICAgRnV0dXJlMkNhbGxiYWNrIG5ld0FjY291bnRzQ2FsbGJhY2soU3RyaW5nIHR5cGUsIFN0cmluZ1tdIGZlYXR1cmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgR2V0QWNjb3VudHNDYWxsYmFjayh0eXBlLCBmZWF0dXJlcyk7CisgICAgfQorCisgICAgY2xhc3MgR2V0QWNjb3VudHNDYWxsYmFjayBpbXBsZW1lbnRzIEZ1dHVyZTJDYWxsYmFjayB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIG1GZWF0dXJlczsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1BY2NvdW50VHlwZTsKKworICAgICAgICBwdWJsaWMgR2V0QWNjb3VudHNDYWxsYmFjayhTdHJpbmcgdHlwZSwgU3RyaW5nW10gZmVhdHVyZXMpIHsKKyAgICAgICAgICAgIG1GZWF0dXJlcyA9IGZlYXR1cmVzOworICAgICAgICAgICAgbUFjY291bnRUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiR2V0QWNjb3VudHNDYWxsYmFjazogdHlwZSAiICsgbUFjY291bnRUeXBlCisgICAgICAgICAgICAgICAgICAgICsgIiwgZmVhdHVyZXMgIgorICAgICAgICAgICAgICAgICAgICArIChtRmVhdHVyZXMgPT0gbnVsbCA/ICJub25lIiA6IFRleHRVdGlscy5qb2luKCIsIiwgbUZlYXR1cmVzKSkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgcmVzdWx0ID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIFBhcmNlbGFibGVbXSBhY2NvdW50cyA9IHJlc3VsdC5nZXRQYXJjZWxhYmxlQXJyYXkoQ29uc3RhbnRzLkFDQ09VTlRTX0tFWSk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZm91bmQgIiArIGFjY291bnRzLmxlbmd0aCArICIgYWNjb3VudHMiKTsKKyAgICAgICAgICAgICAgICBmb3IgKFBhcmNlbGFibGUgYWNjb3VudCA6IGFjY291bnRzKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIiAgIiArIGFjY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsdXJlIiwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbHVyZSIsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoQXV0aGVudGljYXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbHVyZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgRnV0dXJlMkNhbGxiYWNrIG5ld0F1dGhUb2tlbnNDYWxsYmFjayhTdHJpbmcgdHlwZSwgU3RyaW5nIGF1dGhUb2tlblR5cGUsIFN0cmluZ1tdIGZlYXR1cmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgR2V0QXV0aFRva2VuQ2FsbGJhY2sodHlwZSwgYXV0aFRva2VuVHlwZSwgZmVhdHVyZXMpOworICAgIH0KKworICAgIGNsYXNzIEdldEF1dGhUb2tlbkNhbGxiYWNrIGltcGxlbWVudHMgRnV0dXJlMkNhbGxiYWNrIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gbUZlYXR1cmVzOworICAgICAgICBmaW5hbCBTdHJpbmcgbUFjY291bnRUeXBlOworICAgICAgICBmaW5hbCBTdHJpbmcgbUF1dGhUb2tlblR5cGU7CisKKyAgICAgICAgcHVibGljIEdldEF1dGhUb2tlbkNhbGxiYWNrKFN0cmluZyB0eXBlLCBTdHJpbmcgYXV0aFRva2VuVHlwZSwgU3RyaW5nW10gZmVhdHVyZXMpIHsKKyAgICAgICAgICAgIG1GZWF0dXJlcyA9IGZlYXR1cmVzOworICAgICAgICAgICAgbUFjY291bnRUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIG1BdXRoVG9rZW5UeXBlID0gYXV0aFRva2VuVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiR2V0QXV0aFRva2VuQ2FsbGJhY2s6IHR5cGUgIiArIG1BY2NvdW50VHlwZQorICAgICAgICAgICAgICAgICAgICArICIsIGZlYXR1cmVzICIKKyAgICAgICAgICAgICAgICAgICAgKyAobUZlYXR1cmVzID09IG51bGwgPyAibm9uZSIgOiBUZXh0VXRpbHMuam9pbigiLCIsIG1GZWF0dXJlcykpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQnVuZGxlIHJlc3VsdCA9IGZ1dHVyZS5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQua2V5U2V0KCk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiICByZXN1bHQ6ICIgKyByZXN1bHQpOworICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWx1cmUiLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsdXJlIiwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsdXJlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEdldEFuZEludmFsaWRhdGVBdXRoVG9rZW5DYWxsYmFjayBpbXBsZW1lbnRzIEZ1dHVyZTJDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBhdXRoVG9rZW4gPSBidW5kbGUuZ2V0U3RyaW5nKENvbnN0YW50cy5BVVRIVE9LRU5fS0VZKTsKKyAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuaW52YWxpZGF0ZUF1dGhUb2tlbihuZXcgRnV0dXJlMUNhbGxiYWNrPFZvaWQ+KCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oRnV0dXJlMTxWb2lkPiBmdXR1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0IHdhcyBjYW5jZWxlZAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgQ09NX0dPT0dMRV9HQUlBLCBhdXRoVG9rZW4sIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImludmFsaWRhdGU6IGludGVycnVwdGVkIHdoaWxlIGdldHRpbmcgYXV0aFRva2VuIik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW52YWxpZGF0ZTogZXJyb3IgZ2V0dGluZyBhdXRoVG9rZW4iLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEF1dGhlbnRpY2F0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImludmFsaWRhdGU6IGVycm9yIGdldHRpbmcgYXV0aFRva2VuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maXJtQ3JlZGVudGlhbHNDYWxsYmFjayBpbXBsZW1lbnRzIEZ1dHVyZTJDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIGJ1bmRsZS5rZXlTZXQoKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjb25maXJtQ3JlZGVudGlhbHMgc3VjY2VzczogIiArIGJ1bmRsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY29uZmlybUNyZWRlbnRpYWxzIGNhbmNlbGVkIik7CisgICAgICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjb25maXJtQ3JlZGVudGlhbHMgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY29uZmlybUNyZWRlbnRpYWxzIGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBHZXRBdXRoZW50aWNhdG9yc0NhbGxiYWNrIGltcGxlbWVudHMgRnV0dXJlMUNhbGxiYWNrPEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbltdPiB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUxPEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbltdPiBmdXR1cmUpIHsKKyAgICAgICAgICAgIGlmIChpc0ZpbmlzaGluZygpKSByZXR1cm47CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1BdXRoZW50aWNhdG9yRGVzY3MgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW21BdXRoZW50aWNhdG9yRGVzY3MubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1BdXRoZW50aWNhdG9yRGVzY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBhdXRoQ29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhDb250ZXh0ID0gY3JlYXRlUGFja2FnZUNvbnRleHQobUF1dGhlbnRpY2F0b3JEZXNjc1tpXS5wYWNrYWdlTmFtZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuYW1lc1tpXSA9IGF1dGhDb250ZXh0LmdldFN0cmluZyhtQXV0aGVudGljYXRvckRlc2NzW2ldLmxhYmVsSWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFycmF5QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KEFjY291bnRzVGVzdGVyLnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0sIG5hbWVzKTsKKyAgICAgICAgICAgICAgICBtQWNjb3VudFR5cGVzU3Bpbm5lci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCisgICAgICAgICAgICAgICAgbUF1dGhlbnRpY2F0b3JzTGlzdFZpZXcuc2V0QWRhcHRlcihuZXcgQXV0aGVudGljYXRvcnNBcnJheUFkYXB0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50c1Rlc3Rlci50aGlzLCBtQXV0aGVudGljYXRvckRlc2NzKSk7CisgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3Qgd2FzIGNhbmNlbGVkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9Qb2ludGVyTG9jYXRpb24uamF2YSBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L1BvaW50ZXJMb2NhdGlvbi5qYXZhCmluZGV4IDY2OGU5YmEuLjM5NjljOWQgMTAwNjQ0Ci0tLSBhL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L1BvaW50ZXJMb2NhdGlvbi5qYXZhCisrKyBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L1BvaW50ZXJMb2NhdGlvbi5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNDcsMTYgKzQ2LDkgQEAKICAgICAgICAgZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhscCk7CiAgICAgfQogICAgIAotICAgIHB1YmxpYyBjbGFzcyBNeVZpZXcgZXh0ZW5kcyBWaWV3IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtVGV4dFBhaW50OwotICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1UZXh0QmFja2dyb3VuZFBhaW50OwotICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1UZXh0TGV2ZWxQYWludDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVRhcmdldFBhaW50OwotICAgICAgICBwcml2YXRlIGZpbmFsIEZvbnRNZXRyaWNzSW50IG1UZXh0TWV0cmljcyA9IG5ldyBGb250TWV0cmljc0ludCgpOworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUG9pbnRlclN0YXRlIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8RmxvYXQ+IG1YcyA9IG5ldyBBcnJheUxpc3Q8RmxvYXQ+KCk7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEZsb2F0PiBtWXMgPSBuZXcgQXJyYXlMaXN0PEZsb2F0PigpOwotICAgICAgICBwcml2YXRlIGludCBtSGVhZGVyQm90dG9tOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUN1ckRvd247CiAgICAgICAgIHByaXZhdGUgaW50IG1DdXJYOwogICAgICAgICBwcml2YXRlIGludCBtQ3VyWTsKQEAgLTY0LDEyICs1NiwyOSBAQAogICAgICAgICBwcml2YXRlIGZsb2F0IG1DdXJTaXplOwogICAgICAgICBwcml2YXRlIGludCBtQ3VyV2lkdGg7CiAgICAgICAgIHByaXZhdGUgVmVsb2NpdHlUcmFja2VyIG1WZWxvY2l0eTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGNsYXNzIE15VmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1UZXh0UGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVRleHRCYWNrZ3JvdW5kUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVRleHRMZXZlbFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtVGFyZ2V0UGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVBhdGhQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGb250TWV0cmljc0ludCBtVGV4dE1ldHJpY3MgPSBuZXcgRm9udE1ldHJpY3NJbnQoKTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUhlYWRlckJvdHRvbTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DdXJEb3duOworICAgICAgICBwcml2YXRlIGludCBtQ3VyTnVtUG9pbnRlcnM7CisgICAgICAgIHByaXZhdGUgaW50IG1NYXhOdW1Qb2ludGVyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UG9pbnRlclN0YXRlPiBtUG9pbnRlcnMKKyAgICAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFBvaW50ZXJTdGF0ZT4oKTsKICAgICAgICAgCiAgICAgICAgIHB1YmxpYyBNeVZpZXcoQ29udGV4dCBjKSB7CiAgICAgICAgICAgICBzdXBlcihjKTsKICAgICAgICAgICAgIG1UZXh0UGFpbnQgPSBuZXcgUGFpbnQoKTsKICAgICAgICAgICAgIG1UZXh0UGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOwotICAgICAgICAgICAgbVRleHRQYWludC5zZXRUZXh0U2l6ZSgxMCk7CisgICAgICAgICAgICBtVGV4dFBhaW50LnNldFRleHRTaXplKDEwCisgICAgICAgICAgICAgICAgICAgICogZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5KTsKICAgICAgICAgICAgIG1UZXh0UGFpbnQuc2V0QVJHQigyNTUsIDAsIDAsIDApOwogICAgICAgICAgICAgbVRleHRCYWNrZ3JvdW5kUGFpbnQgPSBuZXcgUGFpbnQoKTsKICAgICAgICAgICAgIG1UZXh0QmFja2dyb3VuZFBhaW50LnNldEFudGlBbGlhcyhmYWxzZSk7CkBAIC04NSw4ICs5NCwxNSBAQAogICAgICAgICAgICAgbVRhcmdldFBhaW50ID0gbmV3IFBhaW50KCk7CiAgICAgICAgICAgICBtVGFyZ2V0UGFpbnQuc2V0QW50aUFsaWFzKGZhbHNlKTsKICAgICAgICAgICAgIG1UYXJnZXRQYWludC5zZXRBUkdCKDE5MiwgMCwgMCwgMjU1KTsKKyAgICAgICAgICAgIG1QYXRoUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1QYXRoUGFpbnQuc2V0QW50aUFsaWFzKGZhbHNlKTsKKyAgICAgICAgICAgIG1QYXRoUGFpbnQuc2V0QVJHQigyNTUsIDY0LCAxMjgsIDI1NSk7CiAgICAgICAgICAgICBtUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKICAgICAgICAgICAgIG1QYWludC5zZXRTdHJva2VXaWR0aCgxKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUG9pbnRlclN0YXRlIHBzID0gbmV3IFBvaW50ZXJTdGF0ZSgpOworICAgICAgICAgICAgcHMubVZlbG9jaXR5ID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICAgICAgbVBvaW50ZXJzLmFkZChwcyk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTEwMyw1OCArMTE5LDEwMiBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICAgICAgaW50IHcgPSBnZXRXaWR0aCgpLzU7Ci0gICAgICAgICAgICBpbnQgYmFzZSA9IC1tVGV4dE1ldHJpY3MuYXNjZW50KzE7Ci0gICAgICAgICAgICBpbnQgYm90dG9tID0gbUhlYWRlckJvdHRvbTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLCAwLCB3LTEsIGJvdHRvbSwgbVRleHRCYWNrZ3JvdW5kUGFpbnQpOwotICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJYOiAiICsgbUN1clgsIDEsIGJhc2UsIG1UZXh0UGFpbnQpOwotICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHcsIDAsICh3ICogMikgLSAxLCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiWTogIiArIG1DdXJZLCAxICsgdywgYmFzZSwgbVRleHRQYWludCk7Ci0gICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QodyAqIDIsIDAsICh3ICogMykgLSAxLCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh3ICogMiwgMCwgKHcgKiAyKSArIChtQ3VyUHJlc3N1cmUgKiB3KSAtIDEsIGJvdHRvbSwgbVRleHRMZXZlbFBhaW50KTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiUHJlczogIiArIG1DdXJQcmVzc3VyZSwgMSArIHcgKiAyLCBiYXNlLCBtVGV4dFBhaW50KTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh3ICogMywgMCwgKHcgKiA0KSAtIDEsIGJvdHRvbSwgbVRleHRCYWNrZ3JvdW5kUGFpbnQpOwotICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHcgKiAzLCAwLCAodyAqIDMpICsgKG1DdXJTaXplICogdykgLSAxLCBib3R0b20sIG1UZXh0TGV2ZWxQYWludCk7Ci0gICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIlNpemU6ICIgKyBtQ3VyU2l6ZSwgMSArIHcgKiAzLCBiYXNlLCBtVGV4dFBhaW50KTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh3ICogNCwgMCwgZ2V0V2lkdGgoKSwgYm90dG9tLCBtVGV4dEJhY2tncm91bmRQYWludCk7Ci0gICAgICAgICAgICBpbnQgdmVsb2NpdHkgPSBtVmVsb2NpdHkgPT0gbnVsbCA/IDAgOiAoaW50KSAobVZlbG9jaXR5LmdldFlWZWxvY2l0eSgpICogMTAwMCk7Ci0gICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoInlWZWw6ICIgKyB2ZWxvY2l0eSwgMSArIHcgKiA0LCBiYXNlLCBtVGV4dFBhaW50KTsKKyAgICAgICAgICAgIGZpbmFsIGludCB3ID0gZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBpdGVtVyA9IHcvNzsKKyAgICAgICAgICAgIGZpbmFsIGludCBiYXNlID0gLW1UZXh0TWV0cmljcy5hc2NlbnQrMTsKKyAgICAgICAgICAgIGZpbmFsIGludCBib3R0b20gPSBtSGVhZGVyQm90dG9tOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1Ycy5zaXplKCk7Ci0gICAgICAgICAgICBmbG9hdCBsYXN0WD0wLCBsYXN0WT0wOwotICAgICAgICAgICAgbVBhaW50LnNldEFSR0IoMjU1LCAwLCAyNTUsIDI1NSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgeCA9IG1Ycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgeSA9IG1Zcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShsYXN0WCwgbGFzdFksIHgsIHksIG1UYXJnZXRQYWludCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UG9pbnQobGFzdFgsIGxhc3RZLCBtUGFpbnQpOworICAgICAgICAgICAgZmluYWwgaW50IE5QID0gbVBvaW50ZXJzLnNpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKE5QID4gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFBvaW50ZXJTdGF0ZSBwcyA9IG1Qb2ludGVycy5nZXQoMCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAsIDAsIGl0ZW1XLTEsIGJvdHRvbSxtVGV4dEJhY2tncm91bmRQYWludCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJQOiAiICsgbUN1ck51bVBvaW50ZXJzICsgIiAvICIgKyBtTWF4TnVtUG9pbnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAxLCBiYXNlLCBtVGV4dFBhaW50KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoaXRlbVcsIDAsIChpdGVtVyAqIDIpIC0gMSwgYm90dG9tLCBtVGV4dEJhY2tncm91bmRQYWludCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJYOiAiICsgcHMubUN1clgsIDEgKyBpdGVtVywgYmFzZSwgbVRleHRQYWludCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGl0ZW1XICogMiwgMCwgKGl0ZW1XICogMykgLSAxLCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIlk6ICIgKyBwcy5tQ3VyWSwgMSArIGl0ZW1XICogMiwgYmFzZSwgbVRleHRQYWludCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGl0ZW1XICogMywgMCwgKGl0ZW1XICogNCkgLSAxLCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKKyAgICAgICAgICAgICAgICBpbnQgdmVsb2NpdHkgPSBwcy5tVmVsb2NpdHkgPT0gbnVsbCA/IDAgOiAoaW50KSAocHMubVZlbG9jaXR5LmdldFhWZWxvY2l0eSgpICogMTAwMCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJYdjogIiArIHZlbG9jaXR5LCAxICsgaXRlbVcgKiAzLCBiYXNlLCBtVGV4dFBhaW50KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoaXRlbVcgKiA0LCAwLCAoaXRlbVcgKiA1KSAtIDEsIGJvdHRvbSwgbVRleHRCYWNrZ3JvdW5kUGFpbnQpOworICAgICAgICAgICAgICAgIHZlbG9jaXR5ID0gcHMubVZlbG9jaXR5ID09IG51bGwgPyAwIDogKGludCkgKHBzLm1WZWxvY2l0eS5nZXRZVmVsb2NpdHkoKSAqIDEwMDApOworICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiWXY6ICIgKyB2ZWxvY2l0eSwgMSArIGl0ZW1XICogNCwgYmFzZSwgbVRleHRQYWludCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGl0ZW1XICogNSwgMCwgKGl0ZW1XICogNikgLSAxLCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoaXRlbVcgKiA1LCAwLCAoaXRlbVcgKiA1KSArIChwcy5tQ3VyUHJlc3N1cmUgKiBpdGVtVykgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tLCBtVGV4dExldmVsUGFpbnQpOworICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiUHJzOiAiICsgU3RyaW5nLmZvcm1hdCgiJS4yZiIsIHBzLm1DdXJQcmVzc3VyZSksIDEgKyBpdGVtVyAqIDUsCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLCBtVGV4dFBhaW50KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoaXRlbVcgKiA2LCAwLCB3LCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoaXRlbVcgKiA2LCAwLCAoaXRlbVcgKiA2KSArIChwcy5tQ3VyU2l6ZSAqIGl0ZW1XKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20sIG1UZXh0TGV2ZWxQYWludCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJTaXplOiAiICsgU3RyaW5nLmZvcm1hdCgiJS4yZiIsIHBzLm1DdXJTaXplKSwgMSArIGl0ZW1XICogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIG1UZXh0UGFpbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGludCBwPTA7IHA8TlA7IHArKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFBvaW50ZXJTdGF0ZSBwcyA9IG1Qb2ludGVycy5nZXQocCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBwcy5tWHMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZsb2F0IGxhc3RYPTAsIGxhc3RZPTA7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXZlTGFzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZHJhd24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtUGFpbnQuc2V0QVJHQigyNTUsIDEyOCwgMjU1LCAyNTUpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCA9IHBzLm1Ycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkgPSBwcy5tWXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoRmxvYXQuaXNOYU4oeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVMYXN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZUxhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShsYXN0WCwgbGFzdFksIHgsIHksIG1QYXRoUGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQb2ludChsYXN0WCwgbGFzdFksIG1QYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkcmF3biA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGFzdFggPSB4OworICAgICAgICAgICAgICAgICAgICBsYXN0WSA9IHk7CisgICAgICAgICAgICAgICAgICAgIGhhdmVMYXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGFzdFggPSB4OwotICAgICAgICAgICAgICAgIGxhc3RZID0geTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVmVsb2NpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QYWludC5zZXRBUkdCKDI1NSwgMjU1LCAwLCAwKTsKLSAgICAgICAgICAgICAgICBmbG9hdCB4VmVsID0gbVZlbG9jaXR5LmdldFhWZWxvY2l0eSgpICogKDEwMDAvNjApOwotICAgICAgICAgICAgICAgIGZsb2F0IHlWZWwgPSBtVmVsb2NpdHkuZ2V0WVZlbG9jaXR5KCkgKiAoMTAwMC82MCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKGxhc3RYLCBsYXN0WSwgbGFzdFgreFZlbCwgbGFzdFkreVZlbCwgbVBhaW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQb2ludChsYXN0WCwgbGFzdFksIG1QYWludCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtQ3VyRG93bikgewotICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLCAoaW50KW1DdXJZLCBnZXRXaWR0aCgpLCAoaW50KW1DdXJZLCBtVGFyZ2V0UGFpbnQpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgoaW50KW1DdXJYLCAwLCAoaW50KW1DdXJYLCBnZXRIZWlnaHQoKSwgbVRhcmdldFBhaW50KTsKLSAgICAgICAgICAgICAgICBpbnQgcHJlc3N1cmVMZXZlbCA9IChpbnQpKG1DdXJQcmVzc3VyZSoyNTUpOwotICAgICAgICAgICAgICAgIG1QYWludC5zZXRBUkdCKDI1NSwgcHJlc3N1cmVMZXZlbCwgMTI4LCAyNTUtcHJlc3N1cmVMZXZlbCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQb2ludChtQ3VyWCwgbUN1clksIG1QYWludCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdDaXJjbGUobUN1clgsIG1DdXJZLCBtQ3VyV2lkdGgsIG1QYWludCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGRyYXduKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcy5tVmVsb2NpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVBhaW50LnNldEFSR0IoMjU1LCAyNTUsIDY0LCAxMjgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeFZlbCA9IHBzLm1WZWxvY2l0eS5nZXRYVmVsb2NpdHkoKSAqICgxMDAwLzYwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHlWZWwgPSBwcy5tVmVsb2NpdHkuZ2V0WVZlbG9jaXR5KCkgKiAoMTAwMC82MCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUobGFzdFgsIGxhc3RZLCBsYXN0WCt4VmVsLCBsYXN0WSt5VmVsLCBtUGFpbnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQb2ludChsYXN0WCwgbGFzdFksIG1QYWludCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG1DdXJEb3duICYmIHBzLm1DdXJEb3duKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLCAoaW50KXBzLm1DdXJZLCBnZXRXaWR0aCgpLCAoaW50KXBzLm1DdXJZLCBtVGFyZ2V0UGFpbnQpOworICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoKGludClwcy5tQ3VyWCwgMCwgKGludClwcy5tQ3VyWCwgZ2V0SGVpZ2h0KCksIG1UYXJnZXRQYWludCk7CisgICAgICAgICAgICAgICAgICAgIGludCBwcmVzc3VyZUxldmVsID0gKGludCkocHMubUN1clByZXNzdXJlKjI1NSk7CisgICAgICAgICAgICAgICAgICAgIG1QYWludC5zZXRBUkdCKDI1NSwgcHJlc3N1cmVMZXZlbCwgMTI4LCAyNTUtcHJlc3N1cmVMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UG9pbnQocHMubUN1clgsIHBzLm1DdXJZLCBtUGFpbnQpOworICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0NpcmNsZShwcy5tQ3VyWCwgcHMubUN1clksIHBzLm1DdXJXaWR0aCwgbVBhaW50KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CiAgICAgICAgICAgICBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vTG9nLmkoIlBvaW50ZXIiLCAiTW90aW9uOiBhY3Rpb249MHgiICsgSW50ZWdlci50b0hleFN0cmluZyhhY3Rpb24pCisgICAgICAgICAgICAvLyAgICAgICAgKyAiIHBvaW50ZXJzPSIgKyBldmVudC5nZXRQb2ludGVyQ291bnQoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBOUCA9IG1Qb2ludGVycy5zaXplKCk7CisgICAgICAgICAgICAKICAgICAgICAgICAgIC8vbVJlY3Quc2V0KDAsIDAsIGdldFdpZHRoKCksIG1IZWFkZXJCb3R0b20rMSk7CiAgICAgICAgICAgICAvL2ludmFsaWRhdGUobVJlY3QpOwogICAgICAgICAgICAgLy9pZiAobUN1ckRvd24pIHsKQEAgLTE2NCwyNiArMjI0LDY4IEBACiAgICAgICAgICAgICAvLyAgICBtUmVjdC5zZXRFbXB0eSgpOwogICAgICAgICAgICAgLy99CiAgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7Ci0gICAgICAgICAgICAgICAgbVhzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbVlzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbVZlbG9jaXR5ID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IHA9MDsgcDxOUDsgcCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBvaW50ZXJTdGF0ZSBwcyA9IG1Qb2ludGVycy5nZXQocCk7CisgICAgICAgICAgICAgICAgICAgIHBzLm1Ycy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBwcy5tWXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcHMubVZlbG9jaXR5ID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICAgICAgICAgICAgICBwcy5tQ3VyRG93biA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUG9pbnRlcnMuZ2V0KDApLm1DdXJEb3duID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1WZWxvY2l0eS5hZGRNb3ZlbWVudChldmVudCk7Ci0gICAgICAgICAgICBtVmVsb2NpdHkuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBOID0gZXZlbnQuZ2V0SGlzdG9yeVNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtWHMuYWRkKGV2ZW50LmdldEhpc3RvcmljYWxYKGkpKTsKLSAgICAgICAgICAgICAgICBtWXMuYWRkKGV2ZW50LmdldEhpc3RvcmljYWxZKGkpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKChhY3Rpb24mTW90aW9uRXZlbnQuQUNUSU9OX01BU0spID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSAoYWN0aW9uJk1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0lEX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICA+PiBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9JRF9TSElGVDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoTlAgPD0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgUG9pbnRlclN0YXRlIHBzID0gbmV3IFBvaW50ZXJTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBwcy5tVmVsb2NpdHkgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7CisgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVycy5hZGQocHMpOworICAgICAgICAgICAgICAgICAgICBOUCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBQb2ludGVyU3RhdGUgcHMgPSBtUG9pbnRlcnMuZ2V0KGlkKTsKKyAgICAgICAgICAgICAgICBwcy5tVmVsb2NpdHkgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7CisgICAgICAgICAgICAgICAgcHMubUN1ckRvd24gPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVhzLmFkZChldmVudC5nZXRYKCkpOwotICAgICAgICAgICAgbVlzLmFkZChldmVudC5nZXRZKCkpOwotICAgICAgICAgICAgbUN1ckRvd24gPSBhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04KLSAgICAgICAgICAgICAgICAgICAgfHwgYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOwotICAgICAgICAgICAgbUN1clggPSAoaW50KWV2ZW50LmdldFgoKTsKLSAgICAgICAgICAgIG1DdXJZID0gKGludClldmVudC5nZXRZKCk7Ci0gICAgICAgICAgICBtQ3VyUHJlc3N1cmUgPSBldmVudC5nZXRQcmVzc3VyZSgpOwotICAgICAgICAgICAgbUN1clNpemUgPSBldmVudC5nZXRTaXplKCk7Ci0gICAgICAgICAgICBtQ3VyV2lkdGggPSAoaW50KShtQ3VyU2l6ZSooZ2V0V2lkdGgoKS8zKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIGludCBOSSA9IGV2ZW50LmdldFBvaW50ZXJDb3VudCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQ3VyRG93biA9IGFjdGlvbiAhPSBNb3Rpb25FdmVudC5BQ1RJT05fVVAKKyAgICAgICAgICAgICAgICAgICAgJiYgYWN0aW9uICE9IE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw7CisgICAgICAgICAgICBtQ3VyTnVtUG9pbnRlcnMgPSBtQ3VyRG93biA/IE5JIDogMDsKKyAgICAgICAgICAgIGlmIChtTWF4TnVtUG9pbnRlcnMgPCBtQ3VyTnVtUG9pbnRlcnMpIHsKKyAgICAgICAgICAgICAgICBtTWF4TnVtUG9pbnRlcnMgPSBtQ3VyTnVtUG9pbnRlcnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOSTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUG9pbnRlclN0YXRlIHBzID0gbVBvaW50ZXJzLmdldChldmVudC5nZXRQb2ludGVySWQoaSkpOworICAgICAgICAgICAgICAgIHBzLm1WZWxvY2l0eS5hZGRNb3ZlbWVudChldmVudCk7CisgICAgICAgICAgICAgICAgcHMubVZlbG9jaXR5LmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBldmVudC5nZXRIaXN0b3J5U2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxOOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHMubVhzLmFkZChldmVudC5nZXRIaXN0b3JpY2FsWChpLCBqKSk7CisgICAgICAgICAgICAgICAgICAgIHBzLm1Zcy5hZGQoZXZlbnQuZ2V0SGlzdG9yaWNhbFkoaSwgaikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcy5tWHMuYWRkKGV2ZW50LmdldFgoaSkpOworICAgICAgICAgICAgICAgIHBzLm1Zcy5hZGQoZXZlbnQuZ2V0WShpKSk7CisgICAgICAgICAgICAgICAgcHMubUN1clggPSAoaW50KWV2ZW50LmdldFgoaSk7CisgICAgICAgICAgICAgICAgcHMubUN1clkgPSAoaW50KWV2ZW50LmdldFkoaSk7CisgICAgICAgICAgICAgICAgLy9Mb2cuaSgiUG9pbnRlciIsICJQb2ludGVyICMiICsgcCArICI6ICgiICsgcHMubUN1clgKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKyAiLCIgKyBwcy5tQ3VyWSArICIpIik7CisgICAgICAgICAgICAgICAgcHMubUN1clByZXNzdXJlID0gZXZlbnQuZ2V0UHJlc3N1cmUoaSk7CisgICAgICAgICAgICAgICAgcHMubUN1clNpemUgPSBldmVudC5nZXRTaXplKGkpOworICAgICAgICAgICAgICAgIHBzLm1DdXJXaWR0aCA9IChpbnQpKHBzLm1DdXJTaXplKihnZXRXaWR0aCgpLzMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKChhY3Rpb24mTW90aW9uRXZlbnQuQUNUSU9OX01BU0spID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGlkID0gKGFjdGlvbiZNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9JRF9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgPj4gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSURfU0hJRlQ7CisgICAgICAgICAgICAgICAgZmluYWwgUG9pbnRlclN0YXRlIHBzID0gbVBvaW50ZXJzLmdldChpZCk7CisgICAgICAgICAgICAgICAgcHMubVhzLmFkZChGbG9hdC5OYU4pOworICAgICAgICAgICAgICAgIHBzLm1Zcy5hZGQoRmxvYXQuTmFOKTsKKyAgICAgICAgICAgICAgICBwcy5tQ3VyRG93biA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCiAgICAgICAgICAgICAvL2lmIChtQ3VyRG93bikgewogICAgICAgICAgICAgLy8gICAgbVJlY3QudW5pb24obUN1clgtbUN1cldpZHRoLTMsIG1DdXJZLW1DdXJXaWR0aC0zLAogICAgICAgICAgICAgLy8gICAgICAgICAgICBtQ3VyWCttQ3VyV2lkdGgrMywgbUN1clkrbUN1cldpZHRoKzMpOwpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCmluZGV4IDFmYzEyMWMuLmI5ZDM0ZjkgMTAwNjQ0Ci0tLSBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKQEAgLTE1LDcgKzE1LDcgQEAKIC0tPgogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiIG1zZ2lkPSIxNjE0MTAwMDE5MTMxMTY2MDYiPiJaw6Fsb2hhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4iQWtjZSBuZW7DrSBwb2Rwb3JvdsOhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiJUYXRvIGFrY2UgbmVuw60gbW9tZW50w6FsbsSbIHBvZHBvcm92w6FuYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IlrDoWxvaGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IkFrY2UgbmVuw60gcG9kcG9yb3bDoW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiJUYXRvIGFrY2UgbmVuw60gbW9tZW50w6FsbsSbIHBvZHBvcm92w6FuYS4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAppbmRleCA0NTg0ZTYxLi5iM2RmYTYzIDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iUmVzZXJ2ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+Iklra2UgdW5kZXJzdMO4dHRldCBoYW5kbGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IkhhbmRsaW5nZW4gZXIgaWtrZSB1bmRlcnN0w7h0dGV0IGkgw7hqZWJsaWtrZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiJSZXNlcnZlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiJJa2tlIHVuZGVyc3TDuHR0ZXQgaGFuZGxpbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IkhhbmRsaW5nZW4gZXIgaWtrZSB1bmRlcnN0w7h0dGV0IGkgw7hqZWJsaWtrZXQuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKaW5kZXggOTBiYmIxNi4uOGQ1OWRkZiAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IkZhbGxiYWNrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4iTmljaHQgdW50ZXJzdMO8dHp0ZSBBa3Rpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiJEaWVzZSBBa3Rpb24gd2lyZCB6dXJ6ZWl0IG5pY2h0IHVudGVyc3TDvHR6dC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IkZhbGxiYWNrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiJOaWNodCB1bnRlcnN0w7x0enRlIEFrdGlvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4iRGllc2UgQWt0aW9uIHdpcmQgenVyemVpdCBuaWNodCB1bnRlcnN0w7x0enQuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKaW5kZXggYjk4NWFmNy4uZmVjYWY0YSAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+Is6Vzr3Osc67zrvOsc66z4TOuc66zq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiLOlc69zq3Pgc6zzrXOuc6xIM+Azr/PhSDOtM61zr0gz4XPgM6/z4PPhM63z4HOr862zrXPhM6xzrkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiLOkc+Fz4TOriDOtyDOtc69zq3Pgc6zzrXOuc6xIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc+EzrHOuSDOsc+Fz4TOrs69IM+Ezrcgz4PPhM65zrPOvM6uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4izpXOvc6xzrvOu86xzrrPhM65zrrOriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4izpXOvc6tz4HOs861zrnOsSDPgM6/z4UgzrTOtc69IM+Fz4DOv8+Dz4TOt8+Bzq/Ots61z4TOsc65Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiLOkc+Fz4TOriDOtyDOtc69zq3Pgc6zzrXOuc6xIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc+EzrHOuSDOsc+Fz4TOrs69IM+Ezrcgz4PPhM65zrPOvM6uLiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKaW5kZXggZDE1YTI4Ny4uMGNlNTc1MSAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iRmFsbGJhY2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiJBY2Npw7NuIG5vIGFkbWl0aWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4iRXNhIGFjY2nDs24gbm8gc2UgYWRtaXRlIGFjdHVhbG1lbnRlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4iRmFsbGJhY2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IkFjY2nDs24gbm8gYWRtaXRpZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IkVzYSBhY2Npw7NuIG5vIHNlIGFkbWl0ZSBhY3R1YWxtZW50ZS4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAppbmRleCBkMTVhMjg3Li4wY2U1NzUxIDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iRmFsbGJhY2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiJBY2Npw7NuIG5vIGFkbWl0aWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4iRXNhIGFjY2nDs24gbm8gc2UgYWRtaXRlIGFjdHVhbG1lbnRlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4iRmFsbGJhY2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IkFjY2nDs24gbm8gYWRtaXRpZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IkVzYSBhY2Npw7NuIG5vIHNlIGFkbWl0ZSBhY3R1YWxtZW50ZS4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAppbmRleCBkZjFlMjk5Li4wMjRhZTQyIDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iQXBwbGljYXRpb24gZGUgc2Vjb3VycyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+IkFjdGlvbiBub24gcHJpc2UgZW4gY2hhcmdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4iQ2V0dGUgYWN0aW9uIG5cJ2VzdCBhY3R1ZWxsZW1lbnQgcGFzIHByaXNlIGVuIGNoYXJnZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IkFwcGxpY2F0aW9uIGRlIHNlY291cnMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IkFjdGlvbiBub24gcHJpc2UgZW4gY2hhcmdlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiJDZXR0ZSBhY3Rpb24gblwnZXN0IGFjdHVlbGxlbWVudCBwYXMgcHJpc2UgZW4gY2hhcmdlLiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCmluZGV4IDJkMDhjMWIuLmQyMTZlNTkgMTAwNjQ0Ci0tLSBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKQEAgLTE1LDcgKzE1LDcgQEAKIC0tPgogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiIG1zZ2lkPSIxNjE0MTAwMDE5MTMxMTY2MDYiPiJGYWxsYmFjayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+IkF6aW9uZSBub24gc3VwcG9ydGF0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IkxcJ2F6aW9uZSBub24gw6ggYWwgbW9tZW50byBzdXBwb3J0YXRhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4iRmFsbGJhY2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IkF6aW9uZSBub24gc3VwcG9ydGF0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4iTFwnYXppb25lIG5vbiDDqCBhbCBtb21lbnRvIHN1cHBvcnRhdGEuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKaW5kZXggZjIyMDkwOS4uNzlhZWI0MiAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IkZhbGxiYWNrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4i44K144Od44O844OI44GV44KM44Gm44GE44Gq44GE5pON5L2cIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4i54++5Zyo44K144Od44O844OI44GV44KM44Gm44GE44Gq44GE5pON5L2c44Gn44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiJGYWxsYmFjayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4i44K144Od44O844OI44GV44KM44Gm44GE44Gq44GE5pON5L2cIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiLnj77lnKjjgrXjg53jg7zjg4jjgZXjgozjgabjgYTjgarjgYTmk43kvZzjgafjgZnjgIIiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAppbmRleCAyYzI5NzNmLi5lYzFjMzMwIDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4i7Y+067CxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4i7KeA7JuQ65CY7KeAIOyViuuKlCDsnpHsl4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiLsnbQg7J6R7JeF7J2AIO2YhOyerCDsp4Dsm5DrkJjsp4Ag7JWK7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4i7Y+067CxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiLsp4Dsm5DrkJjsp4Ag7JWK64qUIOyekeyXhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4i7J20IOyekeyXheydgCDtmITsnqwg7KeA7JuQ65CY7KeAIOyViuyKteuLiOuLpC4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAppbmRleCAwMjgxNGU2Li42ZmVkNjYwIDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iRmFsbGJhY2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiJVc3TDuHR0ZXQgaGFuZGxpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiJEZW5uZSBoYW5kbGluZ2VuIGVyIGlra2Ugc3TDuHR0ZXQgbsOlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4iRmFsbGJhY2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IlVzdMO4dHRldCBoYW5kbGluZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4iRGVubmUgaGFuZGxpbmdlbiBlciBpa2tlIHN0w7h0dGV0IG7DpS4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAppbmRleCA4OTg5ZWZkLi5mMzQ3OTY0IDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iUmVzZXJ2ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+Ik5pZXQtb25kZXJzdGV1bmRlIGFjdGllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4iRGllIGFjdGllIHdvcmR0IG1vbWVudGVlbCBuaWV0IG9uZGVyc3RldW5kLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4iUmVzZXJ2ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4iTmlldC1vbmRlcnN0ZXVuZGUgYWN0aWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IkRpZSBhY3RpZSB3b3JkdCBtb21lbnRlZWwgbmlldCBvbmRlcnN0ZXVuZC4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAppbmRleCA1NzQwNDk4Li43M2ExNzZhIDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iV3ljb2ZhbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4iTmllb2JzxYJ1Z2l3YW5hIGN6eW5ub8WbxIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiJUYSBjenlubm/Fm8SHIG5pZSBqZXN0IGFrdHVhbG5pZSBvYnPFgnVnaXdhbmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiJXeWNvZmFuaWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+Ik5pZW9ic8WCdWdpd2FuYSBjenlubm/Fm8SHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiJUYSBjenlubm/Fm8SHIG5pZSBqZXN0IGFrdHVhbG5pZSBvYnPFgnVnaXdhbmEuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAppbmRleCBiMjI2ZWE1Li4zYzdlYzlkIDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKQEAgLTE1LDcgKzE1LDcgQEAKIC0tPgogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiIG1zZ2lkPSIxNjE0MTAwMDE5MTMxMTY2MDYiPiJGYWxsYmFjayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+IkFjw6fDo28gbsOjbyBzdXBvcnRhZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiJFc3RhIGFjw6fDo28gYWluZGEgbsOjbyDDqSBzdXBvcnRhZGEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiJGYWxsYmFjayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4iQWPDp8OjbyBuw6NvIHN1cG9ydGFkYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4iRXN0YcK3YWPDp8Ojb8K3YWluZGHCt27Do2/Ct8OpwrdzdXBvcnRhZGEuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKaW5kZXggMzk1MDA0Yy4uMDhhM2ZhYSAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IkZhbGxiYWNrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4iQcOnw6NvIG7Do28gc3Vwb3J0YWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4iRXNzYSBhw6fDo28gbsOjbyDDqSBzdXBvcnRhZGEgbm8gbW9tZW50by4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IkZhbGxiYWNrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiJBw6fDo28gbsOjbyBzdXBvcnRhZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IkVzc2EgYcOnw6NvIG7Do28gw6kgc3Vwb3J0YWRhIG5vIG1vbWVudG8uIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKaW5kZXggMDg0YzNmMy4uMjRjMzQ4MCAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+ItCf0LXRgNC10YXQvtC0INCyINC+0LHRhdC+0LTQvdC+0Lkg0YDQtdC20LjQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+ItCd0LXQv9C+0LTQtNC10YDQttC40LLQsNC10LzQvtC1INC00LXQudGB0YLQstC40LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiLQkiDQvdCw0YHRgtC+0Y/RidC10LUg0LLRgNC10LzRjyDRjdGC0L4g0LTQtdC50YHRgtCy0LjQtSDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiLQn9C10YDQtdGF0L7QtCDQsiDQvtCx0YXQvtC00L3QvtC5INGA0LXQttC40LwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+ItCd0LXQv9C+0LTQtNC10YDQttC40LLQsNC10LzQvtC1INC00LXQudGB0YLQstC40LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+ItCSINC90LDRgdGC0L7Rj9GJ0LXQtSDQstGA0LXQvNGPINGN0YLQviDQtNC10LnRgdGC0LLQuNC1INC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGC0YHRjy4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAppbmRleCAyMjRkOTQ2Li45ZGFlMTBkIDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iUmVzZXJ2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4iw4V0Z8OkcmRlbiBzdMO2ZHMgaW50ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IkRlbiBow6RyIMOldGfDpHJkZW4gc3TDtmRzIGludGUgZsO2ciBuw6RydmFyYW5kZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IlJlc2VydiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4iw4V0Z8OkcmRlbiBzdMO2ZHMgaW50ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4iRGVuIGjDpHIgw6V0Z8OkcmRlbiBzdMO2ZHMgaW50ZSBmw7ZyIG7DpHJ2YXJhbmRlLiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCmluZGV4IDljN2VkMTUuLjI3Yjg2MGEgMTAwNjQ0Ci0tLSBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKQEAgLTE1LDcgKzE1LDcgQEAKIC0tPgogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiIG1zZ2lkPSIxNjE0MTAwMDE5MTMxMTY2MDYiPiJGYWxsYmFjayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+IkRlc3Rla2xlbm1leWVuIGnFn2xlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IkJ1IGnFn2xlbSDFn3UgYW4gZGVzdGVrbGVubWl5b3IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiJGYWxsYmFjayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4iRGVzdGVrbGVubWV5ZW4gacWfbGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiJCdSBpxZ9sZW0gxZ91IGFuIGRlc3Rla2xlbm1peW9yLiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKaW5kZXggNWIxZmJmOC4uZTZjZmRlMSAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4i5ZCO5aSHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4i5LiN5pSv5oyB5q2k5pON5L2cIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4i55uu5YmN5LiN5pSv5oyB6K+l5pON5L2c44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiLlkI7lpIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IuS4jeaUr+aMgeatpOaTjeS9nCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4i55uu5YmN5LiN5pSv5oyB6K+l5pON5L2c44CCIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAppbmRleCAwNGQ3ZjRmLi41MmFmZGJlIDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKQEAgLTE1LDcgKzE1LDcgQEAKIC0tPgogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiIG1zZ2lkPSIxNjE0MTAwMDE5MTMxMTY2MDYiPiLlgpnnlKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiLkuI3mlK/mj7TnmoTmk43kvZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiLnm67liY3kuI3mlK/mj7TmraTmk43kvZzjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IuWCmeeUqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4i5LiN5pSv5o+055qE5pON5L2cIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiLnm67liY3kuI3mlK/mj7TmraTmk43kvZzjgIIiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9BbmRyb2lkLm1rIGIvYXBwcy9UZXJtL0FuZHJvaWQubWsKaW5kZXggODQzYWVjNS4uOWZmNmMwZCAxMDA2NDQKLS0tIGEvYXBwcy9UZXJtL0FuZHJvaWQubWsKKysrIGIvYXBwcy9UZXJtL0FuZHJvaWQubWsKQEAgLTEsMyArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBUaGlzIG1ha2VmaWxlIHNob3dzIGhvdyB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IGFuZCBhbiBhY3Rpdml0eSB0aGF0CisjIGJ1bmRsZXMgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBjYWxscyBpdCB1c2luZyBKTkkuCisKK1RPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBCdWlsZCBhY3Rpdml0eQorCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC03LDQgKzMwLDExIEBACiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXJtCiAKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnRlcm0KKwogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQWxzbyBidWlsZCBhbGwgb2YgdGhlIHN1Yi10YXJnZXRzIHVuZGVyIHRoaXMgb25lOiB0aGUgc2hhcmVkIGxpYnJhcnkuCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL2puaS9BbmRyb2lkLm1rIGIvYXBwcy9UZXJtL2puaS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZTRhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL1Rlcm0vam5pL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBUaGlzIG1ha2VmaWxlIHN1cHBsaWVzIHRoZSBydWxlcyBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IG9mIEpOSSBjb2RlIGZvcgorIyB1c2UgYnkgb3VyIGV4YW1wbGUgb2YgaG93IHRvIGJ1bmRsZSBhIHNoYXJlZCBsaWJyYXJ5IHdpdGggYW4gQVBLLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBlbmcKKworIyBUaGlzIGlzIHRoZSB0YXJnZXQgYmVpbmcgYnVpbHQuCitMT0NBTF9NT0RVTEU6PSBsaWJ0ZXJtCisKKworIyBBbGwgb2YgdGhlIHNvdXJjZSBmaWxlcyB0aGF0IHdlIHdpbGwgY29tcGlsZS4KK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgdGVybUV4ZWMuY3BwCisKKyMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnV0aWxzCisKKyMgTm8gc3RhdGljIGxpYnJhcmllcy4KK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KKworIyBBbHNvIG5lZWQgdGhlIEpOSSBoZWFkZXJzLgorTE9DQUxfQ19JTkNMVURFUyArPSBcCisJJChKTklfSF9JTkNMVURFKQorCisjIE5vIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MuCitMT0NBTF9DRkxBR1MgKz0KKworIyBEb24ndCBwcmVsaW5rIHRoaXMgbGlicmFyeS4gIEZvciBtb3JlIGVmZmljaWVudCBjb2RlLCB5b3UgbWF5IHdhbnQKKyMgdG8gYWRkIHRoaXMgbGlicmFyeSB0byB0aGUgcHJlbGluayBtYXAgYW5kIHNldCB0aGlzIHRvIHRydWUuIEhvd2V2ZXIsCisjIGl0J3MgZGlmZmljdWx0IHRvIGRvIHRoaXMgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcGxpZWQgYXMKKyMgcGFydCBvZiBhIHN5c3RlbSBpbWFnZS4KKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL2puaS90ZXJtRXhlYy5jcHAgYi9hcHBzL1Rlcm0vam5pL3Rlcm1FeGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDY2NmNjCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9UZXJtL2puaS90ZXJtRXhlYy5jcHAKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFeGVjIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisjaW5jbHVkZSAidXRpbHMvbWlzYy5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorCitzdGF0aWMgamNsYXNzIGNsYXNzX2ZpbGVEZXNjcmlwdG9yOworc3RhdGljIGpmaWVsZElEIGZpZWxkX2ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3I7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9maWxlRGVzY3JpcHRvcl9pbml0OworCisKK2NsYXNzIFN0cmluZzggeworcHVibGljOgorICAgIFN0cmluZzgoKSB7CisgICAgICAgIG1TdHJpbmcgPSAwOworICAgIH0KKyAgICAKKyAgICB+U3RyaW5nOCgpIHsKKyAgICAgICAgaWYgKG1TdHJpbmcpIHsKKyAgICAgICAgICAgIGZyZWUobVN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldChjb25zdCBjaGFyMTZfdCogbywgc2l6ZV90IG51bUNoYXJzKSB7CisgICAgICAgIG1TdHJpbmcgPSAoY2hhciopIG1hbGxvYyhudW1DaGFycyArIDEpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNoYXJzOyBpKyspIHsKKyAgICAgICAgICAgIG1TdHJpbmdbaV0gPSAoY2hhcikgb1tpXTsKKyAgICAgICAgfQorICAgICAgICBtU3RyaW5nW251bUNoYXJzXSA9ICdcMCc7CisgICAgfQorICAgIAorICAgIGNvbnN0IGNoYXIqIHN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1TdHJpbmc7CisgICAgfQorcHJpdmF0ZToKKyAgICBjaGFyKiBtU3RyaW5nOworfTsKKworc3RhdGljIGludCBjcmVhdGVfc3VicHJvY2Vzcyhjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZzAsIGNvbnN0IGNoYXIgKmFyZzEsCisgICAgaW50KiBwUHJvY2Vzc0lkKQoreworICAgIGNoYXIgKmRldm5hbWU7CisgICAgaW50IHB0bTsKKyAgICBwaWRfdCBwaWQ7CisKKyAgICBwdG0gPSBvcGVuKCIvZGV2L3B0bXgiLCBPX1JEV1IpOyAvLyB8IE9fTk9DVFRZKTsKKyAgICBpZihwdG0gPCAwKXsKKyAgICAgICAgTE9HRSgiWyBjYW5ub3Qgb3BlbiAvZGV2L3B0bXggLSAlcyBdXG4iLHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmNudGwocHRtLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKworICAgIGlmKGdyYW50cHQocHRtKSB8fCB1bmxvY2twdChwdG0pIHx8CisgICAgICAgKChkZXZuYW1lID0gKGNoYXIqKSBwdHNuYW1lKHB0bSkpID09IDApKXsKKyAgICAgICAgTE9HRSgiWyB0cm91YmxlIHdpdGggL2Rldi9wdG14IC0gJXMgXVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBwaWQgPSBmb3JrKCk7CisgICAgaWYocGlkIDwgMCkgeworICAgICAgICBMT0dFKCItIGZvcmsgZmFpbGVkOiAlcyAtXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYocGlkID09IDApeworICAgICAgICBjbG9zZShwdG0pOworCisgICAgICAgIGludCBwdHM7CisKKyAgICAgICAgc2V0c2lkKCk7CisgICAgICAgIAorICAgICAgICBwdHMgPSBvcGVuKGRldm5hbWUsIE9fUkRXUik7CisgICAgICAgIGlmKHB0cyA8IDApIGV4aXQoLTEpOworCisgICAgICAgIGR1cDIocHRzLCAwKTsKKyAgICAgICAgZHVwMihwdHMsIDEpOworICAgICAgICBkdXAyKHB0cywgMik7CisKKyAgICAgICAgZXhlY2woY21kLCBjbWQsIGFyZzAsIGFyZzEsIE5VTEwpOworICAgICAgICBleGl0KC0xKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqcFByb2Nlc3NJZCA9IChpbnQpIHBpZDsKKyAgICAgICAgcmV0dXJuIHB0bTsKKyAgICB9Cit9CisKKworc3RhdGljIGpvYmplY3QgYW5kcm9pZF9vc19FeGVjX2NyZWF0ZVN1YlByb2Nlc3MoSk5JRW52ICplbnYsIGpvYmplY3QgY2xhenosCisgICAganN0cmluZyBjbWQsIGpzdHJpbmcgYXJnMCwganN0cmluZyBhcmcxLCBqaW50QXJyYXkgcHJvY2Vzc0lkQXJyYXkpCit7CisgICAgY29uc3QgamNoYXIqIHN0ciA9IGNtZCA/IGVudi0+R2V0U3RyaW5nQ3JpdGljYWwoY21kLCAwKSA6IDA7CisgICAgU3RyaW5nOCBjbWRfODsKKyAgICBpZiAoc3RyKSB7CisgICAgICAgIGNtZF84LnNldChzdHIsIGVudi0+R2V0U3RyaW5nTGVuZ3RoKGNtZCkpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDcml0aWNhbChjbWQsIHN0cik7CisgICAgfQorCisgICAgc3RyID0gYXJnMCA/IGVudi0+R2V0U3RyaW5nQ3JpdGljYWwoYXJnMCwgMCkgOiAwOworICAgIGNvbnN0IGNoYXIqIGFyZzBTdHIgPSAwOworICAgIFN0cmluZzggYXJnMF84OworICAgIGlmIChzdHIpIHsKKyAgICAgICAgYXJnMF84LnNldChzdHIsIGVudi0+R2V0U3RyaW5nTGVuZ3RoKGFyZzApKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ3JpdGljYWwoYXJnMCwgc3RyKTsKKyAgICAgICAgYXJnMFN0ciA9IGFyZzBfOC5zdHJpbmcoKTsKKyAgICB9CisKKyAgICBzdHIgPSBhcmcxID8gZW52LT5HZXRTdHJpbmdDcml0aWNhbChhcmcxLCAwKSA6IDA7CisgICAgY29uc3QgY2hhciogYXJnMVN0ciA9IDA7CisgICAgU3RyaW5nOCBhcmcxXzg7CisgICAgaWYgKHN0cikgeworICAgICAgICBhcmcxXzguc2V0KHN0ciwgZW52LT5HZXRTdHJpbmdMZW5ndGgoYXJnMSkpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDcml0aWNhbChhcmcxLCBzdHIpOworICAgICAgICBhcmcxU3RyID0gYXJnMV84LnN0cmluZygpOworICAgIH0KKworICAgIGludCBwcm9jSWQ7CisgICAgaW50IHB0bSA9IGNyZWF0ZV9zdWJwcm9jZXNzKGNtZF84LnN0cmluZygpLCBhcmcwU3RyLCBhcmcxU3RyLCAmcHJvY0lkKTsKKyAgICAKKyAgICBpZiAocHJvY2Vzc0lkQXJyYXkpIHsKKyAgICAgICAgaW50IHByb2NJZExlbiA9IGVudi0+R2V0QXJyYXlMZW5ndGgocHJvY2Vzc0lkQXJyYXkpOworICAgICAgICBpZiAocHJvY0lkTGVuID4gMCkgeworICAgICAgICAgICAgamJvb2xlYW4gaXNDb3B5OworICAgIAorICAgICAgICAgICAgaW50KiBwUHJvY0lkID0gKGludCopIGVudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChwcm9jZXNzSWRBcnJheSwgJmlzQ29weSk7CisgICAgICAgICAgICBpZiAocFByb2NJZCkgeworICAgICAgICAgICAgICAgICpwUHJvY0lkID0gcHJvY0lkOworICAgICAgICAgICAgICAgIGVudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwocHJvY2Vzc0lkQXJyYXksIHBQcm9jSWQsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIGpvYmplY3QgcmVzdWx0ID0gZW52LT5OZXdPYmplY3QoY2xhc3NfZmlsZURlc2NyaXB0b3IsIG1ldGhvZF9maWxlRGVzY3JpcHRvcl9pbml0KTsKKyAgICAKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBjcmVhdGUgYSBGaWxlRGVzY3JpcHRvci4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQocmVzdWx0LCBmaWVsZF9maWxlRGVzY3JpcHRvcl9kZXNjcmlwdG9yLCBwdG0pOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfb3NfRXhlY19zZXRQdHlXaW5kb3dTaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsYXp6LAorICAgIGpvYmplY3QgZmlsZURlc2NyaXB0b3IsIGppbnQgcm93LCBqaW50IGNvbCwgamludCB4cGl4ZWwsIGppbnQgeXBpeGVsKQoreworICAgIGludCBmZDsKKyAgICBzdHJ1Y3Qgd2luc2l6ZSBzejsKKworICAgIGZkID0gZW52LT5HZXRJbnRGaWVsZChmaWxlRGVzY3JpcHRvciwgZmllbGRfZmlsZURlc2NyaXB0b3JfZGVzY3JpcHRvcik7CisKKyAgICBpZiAoZW52LT5FeGNlcHRpb25PY2N1cnJlZCgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBzei53c19yb3cgPSByb3c7CisgICAgc3oud3NfY29sID0gY29sOworICAgIHN6LndzX3hwaXhlbCA9IHhwaXhlbDsKKyAgICBzei53c195cGl4ZWwgPSB5cGl4ZWw7CisgICAgCisgICAgaW9jdGwoZmQsIFRJT0NTV0lOU1osICZzeik7Cit9CisKK3N0YXRpYyBpbnQgYW5kcm9pZF9vc19FeGVjX3dhaXRGb3IoSk5JRW52ICplbnYsIGpvYmplY3QgY2xhenosCisgICAgamludCBwcm9jSWQpIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHdhaXRwaWQocHJvY0lkLCAmc3RhdHVzLCAwKTsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKKyAgICAgICAgcmVzdWx0ID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9vc19FeGVjX2Nsb3NlKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsYXp6LCBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yKQoreworICAgIGludCBmZDsKKyAgICBzdHJ1Y3Qgd2luc2l6ZSBzejsKKworICAgIGZkID0gZW52LT5HZXRJbnRGaWVsZChmaWxlRGVzY3JpcHRvciwgZmllbGRfZmlsZURlc2NyaXB0b3JfZGVzY3JpcHRvcik7CisKKyAgICBpZiAoZW52LT5FeGNlcHRpb25PY2N1cnJlZCgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBjbG9zZShmZCk7Cit9CisKKworc3RhdGljIGludCByZWdpc3Rlcl9GaWxlRGVzY3JpcHRvcihKTklFbnYgKmVudikKK3sKKyAgICBjbGFzc19maWxlRGVzY3JpcHRvciA9IGVudi0+RmluZENsYXNzKCJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CisKKyAgICBpZiAoY2xhc3NfZmlsZURlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGphdmEvaW8vRmlsZURlc2NyaXB0b3IiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZpZWxkX2ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3IgPSBlbnYtPkdldEZpZWxkSUQoY2xhc3NfZmlsZURlc2NyaXB0b3IsICJkZXNjcmlwdG9yIiwgIkkiKTsKKworICAgIGlmIChmaWVsZF9maWxlRGVzY3JpcHRvcl9kZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBGaWxlRGVzY3JpcHRvci5kZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZXRob2RfZmlsZURlc2NyaXB0b3JfaW5pdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhc3NfZmlsZURlc2NyaXB0b3IsICI8aW5pdD4iLCAiKClWIik7CisgICAgaWYgKG1ldGhvZF9maWxlRGVzY3JpcHRvcl9pbml0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBGaWxlRGVzY3JpcHRvci5pbml0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgfQorICAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqY2xhc3NQYXRoTmFtZSA9ICJjb20vYW5kcm9pZC90ZXJtL0V4ZWMiOworCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIG1ldGhvZF90YWJsZVtdID0geworICAgIHsgImNyZWF0ZVN1YnByb2Nlc3MiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO1tJKUxqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOyIsCisgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19FeGVjX2NyZWF0ZVN1YlByb2Nlc3MgfSwKKyAgICB7ICJzZXRQdHlXaW5kb3dTaXplIiwgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtJSUlJKVYiLAorICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRXhlY19zZXRQdHlXaW5kb3dTaXplfSwKKyAgICB7ICJ3YWl0Rm9yIiwgIihJKUkiLAorICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRXhlY193YWl0Rm9yfSwKKyAgICB7ICJjbG9zZSIsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiLAorICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRXhlY19jbG9zZX0KK307CisKKy8qCisgKiBSZWdpc3RlciBzZXZlcmFsIG5hdGl2ZSBtZXRob2RzIGZvciBvbmUgY2xhc3MuCisgKi8KK3N0YXRpYyBpbnQgcmVnaXN0ZXJOYXRpdmVNZXRob2RzKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBjbGFzc05hbWUsCisgICAgSk5JTmF0aXZlTWV0aG9kKiBnTWV0aG9kcywgaW50IG51bU1ldGhvZHMpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcyhjbGFzc05hbWUpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5hdGl2ZSByZWdpc3RyYXRpb24gdW5hYmxlIHRvIGZpbmQgY2xhc3MgJyVzJyIsIGNsYXNzTmFtZSk7CisgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgfQorICAgIGlmIChlbnYtPlJlZ2lzdGVyTmF0aXZlcyhjbGF6eiwgZ01ldGhvZHMsIG51bU1ldGhvZHMpIDwgMCkgeworICAgICAgICBMT0dFKCJSZWdpc3Rlck5hdGl2ZXMgZmFpbGVkIGZvciAnJXMnIiwgY2xhc3NOYW1lKTsKKyAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gSk5JX1RSVUU7Cit9CisKKy8qCisgKiBSZWdpc3RlciBuYXRpdmUgbWV0aG9kcyBmb3IgYWxsIGNsYXNzZXMgd2Uga25vdyBhYm91dC4KKyAqCisgKiByZXR1cm5zIEpOSV9UUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgcmVnaXN0ZXJOYXRpdmVzKEpOSUVudiogZW52KQoreworICBpZiAoIXJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsIGNsYXNzUGF0aE5hbWUsIG1ldGhvZF90YWJsZSwgCisgICAgICAgICAgICAgICAgIHNpemVvZihtZXRob2RfdGFibGUpIC8gc2l6ZW9mKG1ldGhvZF90YWJsZVswXSkpKSB7CisgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgfQorCisgIHJldHVybiBKTklfVFJVRTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgVk0gd2hlbiB0aGUgc2hhcmVkIGxpYnJhcnkgaXMgZmlyc3QgbG9hZGVkLgorICovCisgCit0eXBlZGVmIHVuaW9uIHsKKyAgICBKTklFbnYqIGVudjsKKyAgICB2b2lkKiB2ZW52OworfSBVbmlvbkpOSUVudlRvVm9pZDsKKworamludCBKTklfT25Mb2FkKEphdmFWTSogdm0sIHZvaWQqIHJlc2VydmVkKSB7CisgICAgVW5pb25KTklFbnZUb1ZvaWQgdWVudjsKKyAgICB1ZW52LnZlbnYgPSBOVUxMOworICAgIGppbnQgcmVzdWx0ID0gLTE7CisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworICAgIAorICAgIExPR0koIkpOSV9PbkxvYWQiKTsKKworICAgIGlmICh2bS0+R2V0RW52KCZ1ZW52LnZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgIT0gSk5JX09LKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBHZXRFbnYgZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgZW52ID0gdWVudi5lbnY7CisgICAgCisgICAgaWYgKChyZXN1bHQgPSByZWdpc3Rlcl9GaWxlRGVzY3JpcHRvcihlbnYpKSA8IDApIHsKKyAgICAgICAgTE9HRSgiRVJST1I6IHJlZ2lzdGVyRmlsZURlc2NyaXB0b3IgZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAocmVnaXN0ZXJOYXRpdmVzKGVudikgIT0gSk5JX1RSVUUpIHsKKyAgICAgICAgTE9HRSgiRVJST1I6IHJlZ2lzdGVyTmF0aXZlcyBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKyAgICAKKyAgICByZXN1bHQgPSBKTklfVkVSU0lPTl8xXzQ7CisgICAgCitiYWlsOgorICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9hcHBzL1Rlcm0vc3JjL2NvbS9hbmRyb2lkL3Rlcm0vRXhlYy5qYXZhIGIvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL0V4ZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTNhY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL0V4ZWMuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXJtOworCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBhIHN1YnByb2Nlc3MuCisgKiA8cD4KKyAqIE5vdGU6IFRoZSBuYXRpdmUgbWV0aG9kcyBhY2Nlc3MgYSBwYWNrYWdlLXByaXZhdGUKKyAqIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgZmllbGQgdG8gZ2V0IGFuZCBzZXQgdGhlIHJhdyBMaW51eAorICogZmlsZSBkZXNjcmlwdG9yLiBUaGlzIG1pZ2h0IGJyZWFrIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICogamF2YS5pby5GaWxlRGVzY3JpcHRvciBpcyBjaGFuZ2VkLgorICovCisKK3B1YmxpYyBjbGFzcyBFeGVjCit7CisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJ0ZXJtIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc3VicHJvY2Vzcy4gRGlmZmVycyBmcm9tIGphdmEubGFuZy5Qcm9jZXNzQnVpbGRlciBpbgorICAgICAqIHRoYXQgYSBwdHkgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzdWJwcm9jZXNzLgorICAgICAqIDxwPgorICAgICAqIENhbGxlcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIEV4ZWMuY2xvc2UoKSBvbiB0aGUgcmV0dXJuZWQKKyAgICAgKiBmaWxlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0gYXJnMCBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNvbW1hbmQsIG1heSBiZSBudWxsCisgICAgICogQHBhcmFtIGFyZzEgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgY29tbWFuZCwgbWF5IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gcHJvY2Vzc0lkIEEgb25lLWVsZW1lbnQgYXJyYXkgdG8gd2hpY2ggdGhlIHByb2Nlc3MgSUQgb2YgdGhlCisgICAgICogc3RhcnRlZCBwcm9jZXNzIHdpbGwgYmUgd3JpdHRlbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHN0YXJ0ZWQgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIEZpbGVEZXNjcmlwdG9yIGNyZWF0ZVN1YnByb2Nlc3MoCisgICAgICAgIFN0cmluZyBjbWQsIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgaW50W10gcHJvY2Vzc0lkKTsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3aWRvdyBzaXplIGZvciBhIGdpdmVuIHB0eS4gQWxsb3dzIHByb2dyYW1zCisgICAgICogY29ubmVjdGVkIHRvIHRoZSBwdHkgbGVhcm4gaG93IGxhcmdlIHRoZWlyIHNjcmVlbiBpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHNldFB0eVdpbmRvd1NpemUoRmlsZURlc2NyaXB0b3IgZmQsCisgICAgICAgaW50IHJvdywgaW50IGNvbCwgaW50IHhwaXhlbCwgaW50IHlwaXhlbCk7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiByZWNlaXZlciB0byBmaW5pc2ggZXhlY3V0aW5nLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZXhpdCB2YWx1ZSBvZiB0aGUgUHJvY2VzcyBiZWluZyB3YWl0ZWQgb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCB3YWl0Rm9yKGludCBwcm9jZXNzSWQpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBjbG9zZShGaWxlRGVzY3JpcHRvciBmZCk7Cit9CisKZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9zcmMvY29tL2FuZHJvaWQvdGVybS9UZXJtLmphdmEgYi9hcHBzL1Rlcm0vc3JjL2NvbS9hbmRyb2lkL3Rlcm0vVGVybS5qYXZhCmluZGV4IDM0Y2Q3ZTEuLjYwNDFiYWYgMTAwNjQ0Ci0tLSBhL2FwcHMvVGVybS9zcmMvY29tL2FuZHJvaWQvdGVybS9UZXJtLmphdmEKKysrIGIvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL1Rlcm0uamF2YQpAQCAtMTYsNiArMTYsMTIgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC50ZXJtOwogCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC0zNSw3ICs0MSw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5FeGVjOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwpAQCAtNTQsMTIgKzU5LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRXh0cmFjdGVkVGV4dFJlcXVlc3Q7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIAotaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQogLyoqCiAgKiBBIHRlcm1pbmFsIGVtdWxhdG9yIGFjdGl2aXR5LgogICovCkBAIC05NiwxMCArOTUsNyBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIHBzZXVkby10ZWxldHlwZSAocHR5KSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB3ZSB1c2UgdG8gY29tbXVuaWNhdGUgd2l0aAotICAgICAqIGFub3RoZXIgcHJvY2VzcywgdHlwaWNhbGx5IGEgc2hlbGwuIEN1cnJlbnRseSB3ZSBqdXN0IHVzZSB0aGlzIHRvIGdldCB0aGUKLSAgICAgKiBtVGVybUluIC8gbVRlcm1PdXQgZmlsZSBkZXNjcmlwdG9ycywgYnV0IHdoZW4gd2UgaW1wbGVtZW50IHJlc2l6aW5nIG9mCi0gICAgICogdGhlIHRlcm1pbmFsIHdlIHdpbGwgbmVlZCBpdCB0byBpc3N1ZSB0aGUgaW9jdGwgdG8gaW5mb3JtIHRoZSBvdGhlcgotICAgICAqIHByb2Nlc3MgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSB0ZXJtaW5hbCBzaXplLgorICAgICAqIGFub3RoZXIgcHJvY2VzcywgdHlwaWNhbGx5IGEgc2hlbGwuCiAgICAgICovCiAgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvciBtVGVybUZkOwogCkBAIC0xODgsNiArMTg0LDE1IEBACiAgICAgICAgIHVwZGF0ZVByZWZzKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgaWYgKG1UZXJtRmQgIT0gbnVsbCkgeworICAgICAgICAgICAgRXhlYy5jbG9zZShtVGVybUZkKTsKKyAgICAgICAgICAgIG1UZXJtRmQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewogICAgICAgICBpbnRbXSBwcm9jZXNzSWQgPSBuZXcgaW50WzFdOwogCmRpZmYgLS1naXQgYS9idWlsZC9BbmRyb2lkLm1rIGIvYnVpbGQvQW5kcm9pZC5tawppbmRleCBjYmE5NmM2Li5kODA0Y2U3IDEwMDY0NAotLS0gYS9idWlsZC9BbmRyb2lkLm1rCisrKyBiL2J1aWxkL0FuZHJvaWQubWsKQEAgLTQsNyArNCw3IEBACiAjIGFueXdoZXJlIGVsc2UsIGFuZCB0aGUgcnVsZXMgZG9uJ3Qgc3VwcG9ydC4gIEFkaXRpb25hbGx5LCB0aGUgZGVwZW5lbmNpZXMgb24KICMgdGhlc2UgZmlsZXMgZG9uJ3QgcmVhbGx5IG1hdHRlciwgYmVjYXVzZSB0aGV5IGFyZSBhbGwgZ2VuZXJhdGVkIGFzIHBhcnQgb2YKICMgYnVpbGRpbmcgdGhlIGRvY3MuICBTbyBmb3IgdGhlIGRlcGVuZGVuY3ksIHdlIGp1c3QgdXNlIHRoZQotIyBvZmZsaW5lLXNkay10aW1lc3RhbXAgZmlsZSwgd2hpY2ggaXMgdGhlICRAIG9mIHRoZSBkcm9pZGRvYyBydWxlLgorIyBhcGktc3R1YnMtdGltZXN0YW1wIGZpbGUsIHdoaWNoIGlzIHRoZSAkQCBvZiB0aGUgZHJvaWRkb2MgcnVsZS4KICMgV2UgYWxzbyBuZWVkIHRvIGRlcGVuZCBvbiBmcmFtZXdvcmstcmVzLmFwaywgaW4gb3JkZXIgdG8gcHVsbCB0aGUKICMgcmVzb3VyY2UgZmlsZXMgb3V0IG9mIHRoZXJlIGZvciBhYXB0LgogIwpAQCAtMjIsNyArMjIsNyBAQAogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIgOj0gJChjbGFzc2VzX2RpcikKICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0ZSQU1FV09SS19SRVNfUEFDS0FHRSA6PSAkKGZyYW1ld29ya19yZXNfcGFja2FnZSkKIAotJChmdWxsX3RhcmdldCk6ICQoT1VUX0RPQ1MpL29mZmxpbmUtc2RrLXRpbWVzdGFtcCAkKGZyYW1ld29ya19yZXNfcGFja2FnZSkKKyQoZnVsbF90YXJnZXQpOiAkKE9VVF9ET0NTKS9hcGktc3R1YnMtdGltZXN0YW1wICQoZnJhbWV3b3JrX3Jlc19wYWNrYWdlKQogCUBlY2hvIENvbXBpbGluZyBTREsgU3R1YnM6ICRACiAJJChoaWRlKSBybSAtcmYgJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKQogCSQoaGlkZSkgbWtkaXIgLXAgJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKQpkaWZmIC0tZ2l0IGEvYnVpbGQvdG9vbHMvbWFrZV93aW5kb3dzX3Nkay5zaCBiL2J1aWxkL3Rvb2xzL21ha2Vfd2luZG93c19zZGsuc2gKaW5kZXggMmE2NDMzYS4uNTA1YTEwMSAxMDA3NTUKLS0tIGEvYnVpbGQvdG9vbHMvbWFrZV93aW5kb3dzX3Nkay5zaAorKysgYi9idWlsZC90b29scy9tYWtlX3dpbmRvd3Nfc2RrLnNoCkBAIC0xLDExICsxLDE3IEBACiAjIS9iaW4vYmFzaAogIyBRdWljayBzZW1pLWF1dG8gZmlsZSB0byBidWlsZCBXaW5kb3dzIFNESyB0b29scy4KICMKLSMgTGltaXRhdGlvbnM6CisjIExpbWl0YXRpb25zIGFuZCByZXF1aXJlbWVudHM6CiAjIC0gRXhwZWN0cyB0aGUgZW11bGF0b3IgaGFzIGJlZW4gYnVpbHQgZmlyc3QsIHdpbGwgcGljayBpdCB1cCBmcm9tIHByZWJ1aWx0LgogIyAtIFJ1biBpbiBDeWd3aW4KLSMgLSBOZWVkcyBDeWd3aW4gcGFja2FnZSB6aXAKICMgLSBFeHBlY3RzIHRvIGhhdmUgb25lIG9mIHRoZSBleGlzdGluZyBTREsgKERhcndpbiBvciBMaW51eCkgdG8gYnVpbGQgdGhlIFdpbmRvd3Mgb25lCisjIC0gTmVlZHMgQ3lnd2luIHBhY2thZ2VzOiBhdXRvY29uZiwgYmlzb24sIGN1cmwsIGZsZXgsIGdjYywgZysrLCBnaXQsCisjICAgZ251cGcsIG1ha2UsIG1pbmd3LXpsaWIsIHB5dGhvbiwgemlwLCB1bnppcAorIyAtIE11c3QgTk9UIGhhdmUgY3lnd2luIHBhY2thZ2UgcmVhZGxpbmUgKGl0cyBHUEwgbGljZW5zZSBtaWdodCB0YWludCB0aGUgU0RLIGlmCisjICAgaXQgZ2V0cyBjb21waWxlZCBpbikKKyMgLSBEb2VzIG5vdCBuZWVkIGEgSmF2YSBEZXZlbG9wbWVudCBLaXQgb3IgYW55IG90aGVyIHRvb2xzIG91dHNpZGUgb2YgY3lnd2luLgorIyAtIElmIHlvdSB0aGluayB5b3UgbWF5IGhhdmUgV2luZG93cyB2ZXJzaW9ucyBvZiB0b29scyAoZS5nLiBtYWtlKSBpbnN0YWxsZWQsIGl0IG1heQorIyAgIHJlZHVjZSBjb25mdXNpb24gbGV2ZWxzIHRvICdleHBvcnQgUEFUSD0vdXNyL2JpbicKIAogc2V0IC1lICAjIEZhaWwgdGhpcyBzY3JpcHQgYXMgc29vbiBhcyBhIGNvbW1hbmQgZmFpbHMgLS0gZmFpbCBlYXJseSwgZmFpbCBmYXN0CiAKQEAgLTYwLDYgKzY2LDEwIEBACiAgICAgICAgICMgU0RLIG51bWJlciBpZiB5b3Ugd2FudCwgYnV0IG5vdCBhZnRlciwgZS5nIHRoZXNlIGFyZSB2YWxpZDoKICAgICAgICAgIyAgICBhbmRyb2lkX3Nka180MjQyX3BsYXRmb3JtLnppcCBvciBibGFoXzQyXy56aXAKICAgICAgICAgIworICAgICAgICAjIE5vdGUgdGhhdCB0aGUgcm9vdCBkaXJlY3RvcnkgbmFtZSBpbiB0aGUgemlwIG11c3QgbWF0Y2ggdGhlIHppcAorICAgICAgICAjIG5hbWUsIHRvbywgc28gdGhlcmUncyBubyBwb2ludCBqdXN0IGNoYW5naW5nIHRoZSB6aXAgbmFtZSB0byBtYXRjaAorICAgICAgICAjIHRoZSBhYm92ZSBmb3JtYXQuCisgICAgICAgICMKICAgICAgICAgIyBTREtfTlVNQkVSIHdpbGwgYmUgZW1wdHkgaWYgbm90aGluZyBtYXRjaGVkLgogICAgICAgICBmaWxlbmFtZT1gYmFzZW5hbWUgIiRTREtfWklQImAKICAgICAgICAgU0RLX05VTUJFUj1gZWNobyAkZmlsZW5hbWUgfCBzZWQgLW4gJ3MvXi4qX1woW15fLi9dXCtcKV9bXl8uXSpcLi4qJC9cMS9wJ2AKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL2tleW1hcHMvQVZSQ1Aua2wgYi9lbXVsYXRvci9rZXltYXBzL0FWUkNQLmtsCmluZGV4IGQwZWJhMTAuLmFlYjNjOGEgMTAwNjQ0Ci0tLSBhL2VtdWxhdG9yL2tleW1hcHMvQVZSQ1Aua2wKKysrIGIvZW11bGF0b3Iva2V5bWFwcy9BVlJDUC5rbApAQCAtMSw2ICsxLDcgQEAKLWtleSAxNjQgICBNRURJQV9QTEFZX1BBVVNFICAgIFdBS0UKLWtleSAxMjggICBNRURJQV9TVE9QICAgICAgICAgIFdBS0UKK2tleSAyMDAgICBNRURJQV9QTEFZX1BBVVNFICAgIFdBS0UKK2tleSAyMDEgICBNRURJQV9QTEFZX1BBVVNFICAgIFdBS0UKK2tleSAxNjYgICBNRURJQV9TVE9QICAgICAgICAgIFdBS0UKIGtleSAxNjMgICBNRURJQV9ORVhUICAgICAgICAgIFdBS0UKIGtleSAxNjUgICBNRURJQV9QUkVWSU9VUyAgICAgIFdBS0UKIGtleSAxNjggICBNRURJQV9SRVdJTkQgICAgICAgIFdBS0UKLWtleSAxNTkgICBNRURJQV9GQVNUX0ZPUldBUkQgIFdBS0UKK2tleSAyMDggICBNRURJQV9GQVNUX0ZPUldBUkQgIFdBS0UKZGlmZiAtLWdpdCBhL2VtdWxhdG9yL3F0b29scy9kbXRyYWNlLmNwcCBiL2VtdWxhdG9yL3F0b29scy9kbXRyYWNlLmNwcAppbmRleCA2ZDkyNTBhLi5jNDg2YzVmIDEwMDY0NAotLS0gYS9lbXVsYXRvci9xdG9vbHMvZG10cmFjZS5jcHAKKysrIGIvZW11bGF0b3IvcXRvb2xzL2RtdHJhY2UuY3BwCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAiZG10cmFjZS5oIgogCiBzdGF0aWMgY29uc3Qgc2hvcnQga1ZlcnNpb24gPSAyOwpAQCAtMTYzLDcgKzE2NCw3IEBACiAgICAgLy8gICBzaWcgPSAiKClJIgogCiAgICAgLy8gRmluZCB0aGUgZmlyc3QgcGFyZW50aGVzaXMsIHRoZSBzdGFydCBvZiB0aGUgc2lnbmF0dXJlLgotICAgIGNoYXIgKnBhcmVuID0gc3RyY2hyKG5hbWUsICcoJyk7CisgICAgY2hhciAqcGFyZW4gPSAoY2hhciopc3RyY2hyKG5hbWUsICcoJyk7CiAKICAgICAvLyBJZiBub3QgZm91bmQsIHRoZW4gYWRkIHRoZSBvcmlnaW5hbCBuYW1lLgogICAgIGlmIChwYXJlbiA9PSBOVUxMKSB7CkBAIC0xODAsNyArMTgxLDcgQEAKICAgICAqcGFyZW4gPSAwOwogCiAgICAgLy8gU2VhcmNoIGZvciB0aGUgbGFzdCBwZXJpb2QsIHRoZSBzdGFydCBvZiB0aGUgbWV0aG9kIG5hbWUKLSAgICBjaGFyICpkb3QgPSBzdHJyY2hyKG5hbWUsICcuJyk7CisgICAgY2hhciAqZG90ID0gKGNoYXIqKXN0cnJjaHIobmFtZSwgJy4nKTsKIAogICAgIC8vIElmIG5vdCBmb3VuZCwgdGhlbiBhZGQgdGhlIG9yaWdpbmFsIG5hbWUuCiAgICAgaWYgKGRvdCA9PSBOVUxMIHx8IGRvdCA9PSBuYW1lKSB7CmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvdHJhY2VfcmVhZGVyLmNwcCBiL2VtdWxhdG9yL3F0b29scy90cmFjZV9yZWFkZXIuY3BwCmluZGV4IGQyYWY2NGYuLjQ3YjVkOTMgMTAwNjQ0Ci0tLSBhL2VtdWxhdG9yL3F0b29scy90cmFjZV9yZWFkZXIuY3BwCisrKyBiL2VtdWxhdG9yL3F0b29scy90cmFjZV9yZWFkZXIuY3BwCkBAIC0xMDA5LDEwICsxMDA5LDEwIEBACiAvLyBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIGFmdGVyIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCiBzdGF0aWMgY2hhciAqRXh0cmFjdERleFBhdGhGcm9tTW1hcChjb25zdCBjaGFyICptbWFwX3BhdGgpCiB7Ci0gICAgY2hhciAqZW5kID0gcmluZGV4KG1tYXBfcGF0aCwgJ0AnKTsKKyAgICBjb25zdCBjaGFyICplbmQgPSByaW5kZXgobW1hcF9wYXRoLCAnQCcpOwogICAgIGlmIChlbmQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2hhciAqc3RhcnQgPSByaW5kZXgobW1hcF9wYXRoLCAnLycpOworICAgIGNvbnN0IGNoYXIgKnN0YXJ0ID0gcmluZGV4KG1tYXBfcGF0aCwgJy8nKTsKICAgICBpZiAoc3RhcnQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OwpkaWZmIC0tZ2l0IGEvaWRlL2VjbGlwc2UvLmNsYXNzcGF0aCBiL2lkZS9lY2xpcHNlLy5jbGFzc3BhdGgKaW5kZXggNzFlOGQyOS4uOTY3OTdlNyAxMDA2NDQKLS0tIGEvaWRlL2VjbGlwc2UvLmNsYXNzcGF0aAorKysgYi9pZGUvZWNsaXBzZS8uY2xhc3NwYXRoCkBAIC0yOCw4ICsyOCw2IEBACiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL0ltUHJvdmlkZXIvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL01lZGlhUHJvdmlkZXIvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL1RlbGVwaG9ueVByb3ZpZGVyL3NyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InZlbmRvci9nb29nbGUvYXBwcy9TdHJlZXQvc3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idmVuZG9yL2dvb2dsZS9hcHBzL1lvdVR1YmUvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2F3dCIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9jbWRzL2FtL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9jbWRzL2lucHV0L3NyYyIvPgpAQCAtMzksNiArMzcsNyBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9jb3JlL2NvbmZpZy9zZGsiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvZ3JhcGhpY3MvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9pbS9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2tleXN0b3JlL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvbG9jYXRpb24vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL29wZW5nbC9qYXZhIi8+CkBAIC00OSw2ICs0OCw3IEBACiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3RlbGVwaG9ueS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3Rlc3QtcnVubmVyIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3R0cy9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3Zwbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3dpZmkvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvcG9saWNpZXMvYmFzZS9waG9uZSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjIi8+CkBAIC05NCw3ICs5NCw3IEBACiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGFsdmlrL2xpYmNvcmUveC1uZXQvc3JjL21haW4vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRhbHZpay9saWJjb3JlL3htbC9zcmMvbWFpbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvQXBpRGVtb3NfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvQnJvd3Nlcl9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9FbWFpbF9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9JTV9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9NdXNpY19pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9QaG9uZV9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KQEAgLTEwNCw3ICsxMDQsNyBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvbG9jYXRpb24vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvbWVkaWEvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvdGVsZXBob255L2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL3R0cy9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy92cG4vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvd2lmaS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vUiIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4dGVybmFsL3RhZ3NvdXAvc3JjIi8+CkBAIC0xMTQsNiArMTE0LDYgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJleHRlcm5hbC9nb29nbGVjbGllbnQvZ29vZ2xlY2xpZW50LWxpYi5qYXIiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZ29vZ2xlLWZyYW1ld29ya19pbnRlcm1lZGlhdGVzL2phdmFsaWIuamFyIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2dvb2dsZWxvZ2luLWNsaWVudF9pbnRlcm1lZGlhdGVzL2phdmFsaWIuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0icGFja2FnZXMvYXBwcy9DYWxjdWxhdG9yL2FyaXR5LTEuMy4xLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9InBhY2thZ2VzL2FwcHMvQ2FsY3VsYXRvci9hcml0eS0xLjMuMy5qYXIiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvYW5kcm9pZF9zdHVic19jdXJyZW50X2ludGVybWVkaWF0ZXMvY2xhc3NlcyIvPgogPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZmIzNGFmYS4uM2RmM2FmMiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNzIsNiArNzIsMTUgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLldhbGxwYXBlckFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aXZpdHlfd2FsbHBhcGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5XYWxscGFwZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuVHJhbnNsdWNlbnRBY3Rpdml0eSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGl2aXR5X3RyYW5zbHVjZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudCI+CkBAIC0xNTYyLDYgKzE1NzEsMTMgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuZ3JhcGhpY3MuQ29sb3JGaWx0ZXJzIiBhbmRyb2lkOmxhYmVsPSJHcmFwaGljcy9Db2xvckZpbHRlcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5ncmFwaGljcy5DcmVhdGVCaXRtYXAiIGFuZHJvaWQ6bGFiZWw9IkdyYXBoaWNzL0NyZWF0ZUJpdG1hcCI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfb2ZmLnBuZyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19vZmYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZDM4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfb24ucG5nIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTFhYzFkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2lyY2xlX25vcm1hbC5wbmcgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2lyY2xlX25vcm1hbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1YWYxYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9jaXJjbGVfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fZGVmYXVsdF9ub3JtYWwuOS5wbmcgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fZGVmYXVsdF9ub3JtYWwuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkNWNjZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9kZWZhdWx0X25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggMjliYmNlYy4uMTYyMjhkMyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMzgsNiArMzgsOCBAQAogICAgICAgICAgICAgY3VzdG9tIFRoZW1lLkRpYWxvZyB0aGVtZSB0byBtYWtlIGFuIGFjdGl2aXR5IHRoYXQgbG9va3MgbGlrZSBhCiAgICAgICAgICAgICBjdXN0b21pemVkIGRpYWxvZywgaGVyZSB3aXRoIGFuIHVnbHkgZnJhbWUuPC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X3dhbGxwYXBlciI+QXBwL0FjdGl2aXR5L1dhbGxwYXBlcjwvc3RyaW5nPgorICAgIAogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfdHJhbnNsdWNlbnQiPkFwcC9BY3Rpdml0eS9UcmFuc2x1Y2VudDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idHJhbnNsdWNlbnRfYmFja2dyb3VuZCI+RXhhbXBsZSBvZiBob3cgeW91IGNhbiBtYWtlIGFuCiAgICAgICAgICAgICBhY3Rpdml0eSBoYXZlIGEgdHJhbnNsdWNlbnQgYmFja2dyb3VuZCwgY29tcG9zaXRpbmcgb3ZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAppbmRleCA0MGU5MzRlLi4xNTZiNzhlIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMzcsOSArMzcsMTYgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dCYWNrZ3JvdW5kIj5AZHJhd2FibGUvZmlsbGVkX2JveDwvaXRlbT4KICAgICA8L3N0eWxlPgogCisgICAgPCEtLSBBIHRoZW1lIHRoYXQgaGFzIGEgd2FsbHBhcGVyIGJhY2tncm91bmQuICBIZXJlIHdlIGV4cGxpY2l0bHkgc3BlY2lmeQorICAgICAgICAgdGhhdCB0aGlzIHRoZW1lIGlzIHRvIGluaGVyaXQgZnJvbSB0aGUgc3lzdGVtJ3Mgd2FsbHBhcGVyIHRoZW1lLAorICAgICAgICAgd2hpY2ggc2V0cyB1cCB2YXJpb3VzIGF0dHJpYnV0ZXMgY29ycmVjdGx5LiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuV2FsbHBhcGVyIiBwYXJlbnQ9ImFuZHJvaWQ6c3R5bGUvVGhlbWUuV2FsbHBhcGVyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb2xvckZvcmVncm91bmQiPiNmZmY8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogICAgIDwhLS0gQSB0aGVtZSB0aGF0IGhhcyBhIHRyYW5zbHVjZW50IGJhY2tncm91bmQuICBIZXJlIHdlIGV4cGxpY2l0bHkgc3BlY2lmeQogICAgICAgICAgdGhhdCB0aGlzIHRoZW1lIGlzIHRvIGluaGVyaXQgZnJvbSB0aGUgc3lzdGVtJ3MgdHJhbnNsdWNlbnQgdGhlbWUsCi0gICAgICAgICB3aGljaCBzZXRzIHVwIHZhcmlvdXMgYXR0cmlidXRlcyBjb3JyZWN0bHkuLiAtLT4KKyAgICAgICAgIHdoaWNoIHNldHMgdXAgdmFyaW91cyBhdHRyaWJ1dGVzIGNvcnJlY3RseS4gLS0+CiAgICAgPHN0eWxlIG5hbWU9IlRoZW1lLlRyYW5zbHVjZW50IiBwYXJlbnQ9ImFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0JhY2tncm91bmQiPkBkcmF3YWJsZS90cmFuc2x1Y2VudF9iYWNrZ3JvdW5kPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1dhbGxwYXBlckFjdGl2aXR5LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1dhbGxwYXBlckFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhMWE4YQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvV2FsbHBhcGVyQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworLyoqCisgKiA8aDM+V2FsbHBhcGVyIEFjdGl2aXR5PC9oMz4KKyAqIAorICogPHA+VGhpcyBkZW1vbnN0cmF0ZXMgdGhlIGhvdyB0byB3cml0ZSBhbiBhY3Rpdml0eSB0aGF0IGhhcyB0aGUgc3lzdGVtCisgKiB3YWxscGFwZXIgYmVoaW5kIGl0LjwvcD4KKyAqLworcHVibGljIGNsYXNzIFdhbGxwYXBlckFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIC8qKgorICAgICAqIEluaXRpYWxpemF0aW9uIG9mIHRoZSBBY3Rpdml0eSBhZnRlciBpdCBpcyBmaXJzdCBjcmVhdGVkLiAgTXVzdCBhdCBsZWFzdAorICAgICAqIGNhbGwge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I3NldENvbnRlbnRWaWV3IHNldENvbnRlbnRWaWV3KCl9IHRvCisgICAgICogZGVzY3JpYmUgd2hhdCBpcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNjcmVlbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIC8vIEJlIHN1cmUgdG8gY2FsbCB0aGUgc3VwZXIgY2xhc3MuCisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIAorICAgICAgICBnZXRXaW5kb3coKS5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NIT1dfV0FMTFBBUEVSKTsKKyAgICAgICAgCisgICAgICAgIC8vIFNlZSBhc3NldHMvcmVzL2FueS9sYXlvdXQvdHJhbnNsdWNlbnRfYmFja2dyb3VuZC54bWwgZm9yIHRoaXMKKyAgICAgICAgLy8gdmlldyBsYXlvdXQgZGVmaW5pdGlvbiwgd2hpY2ggaXMgYmVpbmcgc2V0IGhlcmUgYXMKKyAgICAgICAgLy8gdGhlIGNvbnRlbnQgb2Ygb3VyIHNjcmVlbi4KKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQudHJhbnNsdWNlbnRfYmFja2dyb3VuZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2dyYXBoaWNzL0NvbG9yRmlsdGVycy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2dyYXBoaWNzL0NvbG9yRmlsdGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDE4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvZ3JhcGhpY3MvQ29sb3JGaWx0ZXJzLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5ncmFwaGljczsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy4qOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuKjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lio7CisKK3B1YmxpYyBjbGFzcyBDb2xvckZpbHRlcnMgZXh0ZW5kcyBHcmFwaGljc0FjdGl2aXR5IHsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTYW1wbGVWaWV3KHRoaXMpKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhbXBsZVZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgICAgIHByaXZhdGUgRHJhd2FibGUgbURyYXdhYmxlOworICAgICAgICBwcml2YXRlIERyYXdhYmxlW10gbURyYXdhYmxlczsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50MjsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtUGFpbnRUZXh0T2Zmc2V0OworICAgICAgICBwcml2YXRlIGludFtdIG1Db2xvcnM7CisgICAgICAgIHByaXZhdGUgUG9ydGVyRHVmZi5Nb2RlW10gbU1vZGVzOworICAgICAgICBwcml2YXRlIGludCBtTW9kZUluZGV4OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9UaGVSaWdodChEcmF3YWJsZSBjdXJyLCBEcmF3YWJsZSBwcmV2KSB7CisgICAgICAgICAgICBSZWN0IHIgPSBwcmV2LmdldEJvdW5kcygpOworICAgICAgICAgICAgaW50IHggPSByLnJpZ2h0ICsgMTI7CisgICAgICAgICAgICBpbnQgY2VudGVyID0gKHIudG9wICsgci5ib3R0b20pID4+IDE7CisgICAgICAgICAgICBpbnQgaCA9IGN1cnIuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisgICAgICAgICAgICBpbnQgeSA9IGNlbnRlciAtIChoID4+IDEpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjdXJyLnNldEJvdW5kcyh4LCB5LCB4ICsgY3Vyci5nZXRJbnRyaW5zaWNXaWR0aCgpLCB5ICsgaCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2FtcGxlVmlldyhBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICAgICAgc3VwZXIoYWN0aXZpdHkpOworICAgICAgICAgICAgbUFjdGl2aXR5ID0gYWN0aXZpdHk7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBhY3Rpdml0eTsKKyAgICAgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbURyYXdhYmxlID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmJ0bl9kZWZhdWx0X25vcm1hbCk7CisgICAgICAgICAgICBtRHJhd2FibGUuc2V0Qm91bmRzKDAsIDAsIDE1MCwgNDgpOworICAgICAgICAgICAgbURyYXdhYmxlLnNldERpdGhlcih0cnVlKTsKKworICAgICAgICAgICAgaW50W10gcmVzSURzID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmJ0bl9jaXJjbGVfbm9ybWFsLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuYnRuX2NoZWNrX29mZiwKKyAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmJ0bl9jaGVja19vbgorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1EcmF3YWJsZXMgPSBuZXcgRHJhd2FibGVbcmVzSURzLmxlbmd0aF07CisgICAgICAgICAgICBEcmF3YWJsZSBwcmV2ID0gbURyYXdhYmxlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNJRHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtRHJhd2FibGVzW2ldID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShyZXNJRHNbaV0pOworICAgICAgICAgICAgICAgIG1EcmF3YWJsZXNbaV0uc2V0RGl0aGVyKHRydWUpOworICAgICAgICAgICAgICAgIGFkZFRvVGhlUmlnaHQobURyYXdhYmxlc1tpXSwgcHJldik7CisgICAgICAgICAgICAgICAgcHJldiA9IG1EcmF3YWJsZXNbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRUZXh0U2l6ZSgxNik7CisgICAgICAgICAgICBtUGFpbnQuc2V0VGV4dEFsaWduKFBhaW50LkFsaWduLkNFTlRFUik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYWludDIgPSBuZXcgUGFpbnQobVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludDIuc2V0QWxwaGEoNjQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBQYWludC5Gb250TWV0cmljcyBmbSA9IG1QYWludC5nZXRGb250TWV0cmljcygpOworICAgICAgICAgICAgbVBhaW50VGV4dE9mZnNldCA9IChmbS5kZXNjZW50ICsgZm0uYXNjZW50KSAqIDAuNWY7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1Db2xvcnMgPSBuZXcgaW50W10geworICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgMHhDQzAwMDBGRiwKKyAgICAgICAgICAgICAgICAweDg4MDAwMEZGLAorICAgICAgICAgICAgICAgIDB4NDQwMDAwRkYsCisgICAgICAgICAgICAgICAgMHhGRkNDQ0NGRiwKKyAgICAgICAgICAgICAgICAweEZGODg4OEZGLAorICAgICAgICAgICAgICAgIDB4RkY0NDQ0RkYsCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBtTW9kZXMgPSBuZXcgUG9ydGVyRHVmZi5Nb2RlW10geworICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfQVRPUCwKKyAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuTVVMVElQTFksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgbU1vZGVJbmRleCA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBzd2FwUGFpbnRDb2xvcnMoKSB7CisgICAgICAgICAgICBpZiAobVBhaW50LmdldENvbG9yKCkgPT0gMHhGRjAwMDAwMCkgeworICAgICAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweEZGRkZGRkZGKTsKKyAgICAgICAgICAgICAgICBtUGFpbnQyLnNldENvbG9yKDB4RkYwMDAwMDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhGRjAwMDAwMCk7CisgICAgICAgICAgICAgICAgbVBhaW50Mi5zZXRDb2xvcigweEZGRkZGRkZGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QYWludDIuc2V0QWxwaGEoNjQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGUoKSB7CisgICAgICAgICAgICBtQWN0aXZpdHkuc2V0VGl0bGUobU1vZGVzW21Nb2RlSW5kZXhdLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIHZvaWQgZHJhd1NhbXBsZShDYW52YXMgY2FudmFzLCBDb2xvckZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgICAgIFJlY3QgciA9IG1EcmF3YWJsZS5nZXRCb3VuZHMoKTsKKyAgICAgICAgICAgIGZsb2F0IHggPSAoci5sZWZ0ICsgci5yaWdodCkgKiAwLjVmOworICAgICAgICAgICAgZmxvYXQgeSA9IChyLnRvcCArIHIuYm90dG9tKSAqIDAuNWYgLSBtUGFpbnRUZXh0T2Zmc2V0OworCisgICAgICAgICAgICBtRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKKyAgICAgICAgICAgIG1EcmF3YWJsZS5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkxhYmVsIiwgeCsxLCB5KzEsIG1QYWludDIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJMYWJlbCIsIHgsIHksIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoRHJhd2FibGUgZHIgOiBtRHJhd2FibGVzKSB7CisgICAgICAgICAgICAgICAgZHIuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKKyAgICAgICAgICAgICAgICBkci5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLmRyYXdDb2xvcigweEZGQ0NDQ0NDKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg4LCAxMik7CisgICAgICAgICAgICBmb3IgKGludCBjb2xvciA6IG1Db2xvcnMpIHsKKyAgICAgICAgICAgICAgICBDb2xvckZpbHRlciBmaWx0ZXI7CisgICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2Rlc1ttTW9kZUluZGV4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRyYXdTYW1wbGUoY2FudmFzLCBmaWx0ZXIpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgNTUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgZmxvYXQgeCA9IGV2ZW50LmdldFgoKTsKKyAgICAgICAgICAgIGZsb2F0IHkgPSBldmVudC5nZXRZKCk7CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEFjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBtb2RlIGV2ZXJ5IG90aGVyIHRpbWUgd2UgY2hhbmdlIHBhaW50IGNvbG9ycworICAgICAgICAgICAgICAgICAgICBpZiAobVBhaW50LmdldENvbG9yKCkgPT0gMHhGRkZGRkZGRikgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1vZGVJbmRleCA9IChtTW9kZUluZGV4ICsgMSkgJSBtTW9kZXMubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2FwUGFpbnRDb2xvcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vQW5kcm9pZC5tayBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDQ3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACisjIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQnVpbGQgYXBwbGljYXRpb24KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBTYW1wbGVCcm93c2VyUGx1Z2luCisKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnNhbXBsZXBsdWdpbgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBBbHNvIGJ1aWxkIGFsbCBvZiB0aGUgc3ViLXRhcmdldHMgdW5kZXIgdGhpcyBvbmU6IHRoZSBzaGFyZWQgbGlicmFyeS4KK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2YjVkYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuc2FtcGxlcGx1Z2luIgorICAgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53ZWJraXQucGVybWlzc2lvbi5QTFVHSU4iLz4KKworICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjMiIC8+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDppY29uPSJAZHJhd2FibGUvc2FtcGxlX2Jyb3dzZXJfcGx1Z2luIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvc2FtcGxlX2Jyb3dzZXJfcGx1Z2luIj4KKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJTYW1wbGVQbHVnaW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQud2Via2l0LlBMVUdJTiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL05PVElDRSBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL0FuZHJvaWQubWsgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxYzg4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU5IEBACisjIworIyMKKyMjIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIworIyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMjIGFyZSBtZXQ6CisjIyAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyMgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIworIyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyMjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorIyMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisjIyBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyMjIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyMjIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIyMKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwltYWluLmNwcCBcCisJUGx1Z2luT2JqZWN0LmNwcCBcCisJYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAgXAorCWF1ZGlvL0F1ZGlvUGx1Z2luLmNwcCBcCisJYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmNwcCBcCisJZm9ybS9Gb3JtUGx1Z2luLmNwcCBcCisJcGFpbnQvUGFpbnRQbHVnaW4uY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisJJChMT0NBTF9QQVRIKSBcCisJJChMT0NBTF9QQVRIKS9hbmltYXRpb24gXAorCSQoTE9DQUxfUEFUSCkvYXVkaW8gXAorCSQoTE9DQUxfUEFUSCkvYmFja2dyb3VuZCBcCisJJChMT0NBTF9QQVRIKS9mb3JtIFwKKwkkKExPQ0FMX1BBVEgpL3BhaW50IFwKKwlleHRlcm5hbC93ZWJraXQvV2ViQ29yZS9icmlkZ2UgXAorCWV4dGVybmFsL3dlYmtpdC9XZWJDb3JlL3BsdWdpbnMgXAorCWV4dGVybmFsL3dlYmtpdC9XZWJDb3JlL3BsYXRmb3JtL2FuZHJvaWQvSmF2YVZNIFwKKwlleHRlcm5hbC93ZWJraXQvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucworCitMT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9TUkNfRklMRVMpCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAKK0xPQ0FMX1BSRUxJTktfTU9EVUxFOj1mYWxzZQorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IFNIQVJFRF9MSUJSQVJJRVMKKworTE9DQUxfTU9EVUxFOj0gbGlic2FtcGxlcGx1Z2luCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjVlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgSU1QT1JUQU5UOiAgVGhpcyBBcHBsZSBzb2Z0d2FyZSBpcyBzdXBwbGllZCB0byB5b3UgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIGluCisgY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsIGluc3RhbGxhdGlvbiwKKyBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZSBjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlCisgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IKKyByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4KKworIEluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHN1YmplY3QgdG8gdGhlc2UKKyB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMgY29weXJpZ2h0cyBpbgorIHRoaXMgb3JpZ2luYWwgQXBwbGUgc29mdHdhcmUgKHRoZSAiQXBwbGUgU29mdHdhcmUiKSwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSBhbmQKKyByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkKKyBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSBpbiBpdHMgZW50aXJldHkgYW5kIHdpdGhvdXQKKyBtb2RpZmljYXRpb25zLCB5b3UgbXVzdCByZXRhaW4gdGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsCisgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEFwcGxlIFNvZnR3YXJlLiAgTmVpdGhlciB0aGUgbmFtZSwgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcworIG9yIGxvZ29zIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyB0aGUgQXBwbGUgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBBcHBsZS4gRXhjZXB0IGFzIGV4cHJlc3NseQorIHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IEFwcGxlCisgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyCisgZGVyaXZhdGl2ZSB3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgQXBwbGUgU29mdHdhcmUgbWF5IGJlIGluY29ycG9yYXRlZC4KKworIFRoZSBBcHBsZSBTb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBBcHBsZSBvbiBhbiAiQVMgSVMiIGJhc2lzLiAgQVBQTEUgTUFLRVMgTk8gV0FSUkFOVElFUywKKyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBOT04tSU5GUklOR0VNRU5ULAorIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgQVBQTEUgU09GVFdBUkUgT1IgSVRTCisgVVNFIEFORCBPUEVSQVRJT04gQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBZT1VSIFBST0RVQ1RTLgorCisgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTAorIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgICAgICAgICAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSwKKyBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiBBTkQvT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBBUFBMRSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5ECisgV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUgorIE9USEVSV0lTRSwgRVZFTiBJRiBBUFBMRSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorCitzdGF0aWMgdm9pZCBwbHVnaW5JbnZhbGlkYXRlKE5QT2JqZWN0ICpvYmopOworc3RhdGljIGJvb2wgcGx1Z2luSGFzUHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpOworc3RhdGljIGJvb2wgcGx1Z2luSGFzTWV0aG9kKE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lKTsKK3N0YXRpYyBib29sIHBsdWdpbkdldFByb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBOUFZhcmlhbnQgKnZhcmlhbnQpOworc3RhdGljIGJvb2wgcGx1Z2luU2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqdmFyaWFudCk7CitzdGF0aWMgYm9vbCBwbHVnaW5JbnZva2UoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KTsKK3N0YXRpYyBib29sIHBsdWdpbkludm9rZURlZmF1bHQoTlBPYmplY3QgKm9iaiwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpOworc3RhdGljIE5QT2JqZWN0ICpwbHVnaW5BbGxvY2F0ZShOUFAgbnBwLCBOUENsYXNzICp0aGVDbGFzcyk7CitzdGF0aWMgdm9pZCBwbHVnaW5EZWFsbG9jYXRlKE5QT2JqZWN0ICpvYmopOworc3RhdGljIGJvb2wgcGx1Z2luUmVtb3ZlUHJvcGVydHkoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgbmFtZSk7CitzdGF0aWMgYm9vbCBwbHVnaW5FbnVtZXJhdGUoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgKip2YWx1ZSwgdWludDMyX3QgKmNvdW50KTsKKworCisKK3N0YXRpYyBOUENsYXNzIHBsdWdpbkNsYXNzID0geworICAgIE5QX0NMQVNTX1NUUlVDVF9WRVJTSU9OLAorICAgIHBsdWdpbkFsbG9jYXRlLAorICAgIHBsdWdpbkRlYWxsb2NhdGUsCisgICAgcGx1Z2luSW52YWxpZGF0ZSwKKyAgICBwbHVnaW5IYXNNZXRob2QsCisgICAgcGx1Z2luSW52b2tlLAorICAgIHBsdWdpbkludm9rZURlZmF1bHQsCisgICAgcGx1Z2luSGFzUHJvcGVydHksCisgICAgcGx1Z2luR2V0UHJvcGVydHksCisgICAgcGx1Z2luU2V0UHJvcGVydHksCisgICAgcGx1Z2luUmVtb3ZlUHJvcGVydHksCisgICAgcGx1Z2luRW51bWVyYXRlCit9OworCitOUENsYXNzICpnZXRQbHVnaW5DbGFzcyh2b2lkKQoreworICAgIHJldHVybiAmcGx1Z2luQ2xhc3M7Cit9CisKK3N0YXRpYyBib29sIGlkZW50aWZpZXJzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworI2RlZmluZSBJRF9URVNURklMRV9QUk9QRVJUWSAgICAgICAgICAgIDAKKyNkZWZpbmUgTlVNX1BST1BFUlRZX0lERU5USUZJRVJTICAgICAgICAxCisKK3N0YXRpYyBOUElkZW50aWZpZXIgcGx1Z2luUHJvcGVydHlJZGVudGlmaWVyc1tOVU1fUFJPUEVSVFlfSURFTlRJRklFUlNdOworc3RhdGljIGNvbnN0IE5QVVRGOCAqcGx1Z2luUHJvcGVydHlJZGVudGlmaWVyTmFtZXNbTlVNX1BST1BFUlRZX0lERU5USUZJRVJTXSA9IHsKKyAgICAidGVzdGZpbGUiCit9OworCisjZGVmaW5lIElEX0dFVFRFU1RGSUxFX01FVEhPRCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE5VTV9NRVRIT0RfSURFTlRJRklFUlMgICAgICAgICAgICAgICAgICAxCisKK3N0YXRpYyBOUElkZW50aWZpZXIgcGx1Z2luTWV0aG9kSWRlbnRpZmllcnNbTlVNX01FVEhPRF9JREVOVElGSUVSU107CitzdGF0aWMgY29uc3QgTlBVVEY4ICpwbHVnaW5NZXRob2RJZGVudGlmaWVyTmFtZXNbTlVNX01FVEhPRF9JREVOVElGSUVSU10gPSB7CisgICAgImdldFRlc3RGaWxlIgorfTsKKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUlkZW50aWZpZXJzKHZvaWQpCit7CisgICAgYnJvd3Nlci0+Z2V0c3RyaW5naWRlbnRpZmllcnMocGx1Z2luUHJvcGVydHlJZGVudGlmaWVyTmFtZXMsIE5VTV9QUk9QRVJUWV9JREVOVElGSUVSUywgcGx1Z2luUHJvcGVydHlJZGVudGlmaWVycyk7CisgICAgYnJvd3Nlci0+Z2V0c3RyaW5naWRlbnRpZmllcnMocGx1Z2luTWV0aG9kSWRlbnRpZmllck5hbWVzLCBOVU1fTUVUSE9EX0lERU5USUZJRVJTLCBwbHVnaW5NZXRob2RJZGVudGlmaWVycyk7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpbkhhc1Byb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUFJPUEVSVFlfSURFTlRJRklFUlM7IGkrKykKKyAgICAgICAgaWYgKG5hbWUgPT0gcGx1Z2luUHJvcGVydHlJZGVudGlmaWVyc1tpXSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcGx1Z2luSGFzTWV0aG9kKE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTUVUSE9EX0lERU5USUZJRVJTOyBpKyspCisgICAgICAgIGlmIChuYW1lID09IHBsdWdpbk1ldGhvZElkZW50aWZpZXJzW2ldKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBwbHVnaW5HZXRQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgTlBWYXJpYW50ICp2YXJpYW50KQoreworICAgIFBsdWdpbk9iamVjdCAqcGx1Z2luID0gKFBsdWdpbk9iamVjdCAqKW9iajsKKyAgICBpZiAobmFtZSA9PSBwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJzW0lEX1RFU1RGSUxFX1BST1BFUlRZXSkgeworICAgICAgICBCT09MRUFOX1RPX05QVkFSSUFOVCh0cnVlLCAqdmFyaWFudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpblNldFByb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBjb25zdCBOUFZhcmlhbnQgKnZhcmlhbnQpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBwbHVnaW5JbnZva2UoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KQoreworICAgIFBsdWdpbk9iamVjdCAqcGx1Z2luID0gKFBsdWdpbk9iamVjdCAqKW9iajsKKyAgICBpZiAobmFtZSA9PSBwbHVnaW5NZXRob2RJZGVudGlmaWVyc1tJRF9HRVRURVNURklMRV9NRVRIT0RdKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpbkludm9rZURlZmF1bHQoTlBPYmplY3QgKm9iaiwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBwbHVnaW5JbnZhbGlkYXRlKE5QT2JqZWN0ICpvYmopCit7CisgICAgLy8gUmVsZWFzZSBhbnkgcmVtYWluaW5nIHJlZmVyZW5jZXMgdG8gSmF2YVNjcmlwdCBvYmplY3RzLgorfQorCitzdGF0aWMgTlBPYmplY3QgKnBsdWdpbkFsbG9jYXRlKE5QUCBucHAsIE5QQ2xhc3MgKnRoZUNsYXNzKQoreworICAgIFBsdWdpbk9iamVjdCAqbmV3SW5zdGFuY2UgPSAoUGx1Z2luT2JqZWN0KikgbWFsbG9jKHNpemVvZihQbHVnaW5PYmplY3QpKTsKKyAgICBuZXdJbnN0YW5jZS0+aGVhZGVyLl9jbGFzcyA9IHRoZUNsYXNzOworICAgIG5ld0luc3RhbmNlLT5oZWFkZXIucmVmZXJlbmNlQ291bnQgPSAxOworCisgICAgaWYgKCFpZGVudGlmaWVyc0luaXRpYWxpemVkKSB7CisgICAgICAgIGlkZW50aWZpZXJzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICBpbml0aWFsaXplSWRlbnRpZmllcnMoKTsKKyAgICB9CisKKyAgICBuZXdJbnN0YW5jZS0+bnBwID0gbnBwOworCisgICAgcmV0dXJuICZuZXdJbnN0YW5jZS0+aGVhZGVyOworfQorCitzdGF0aWMgdm9pZCBwbHVnaW5EZWFsbG9jYXRlKE5QT2JqZWN0ICpvYmopCit7CisgICAgZnJlZShvYmopOworfQorCitzdGF0aWMgYm9vbCBwbHVnaW5SZW1vdmVQcm9wZXJ0eShOUE9iamVjdCAqbnBvYmosIE5QSWRlbnRpZmllciBuYW1lKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcGx1Z2luRW51bWVyYXRlKE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyICoqdmFsdWUsIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmY2ZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaApAQCAtMCwwICsxLDc0IEBACisvKgorIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBpbgorIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLCBpbnN0YWxsYXRpb24sCisgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgQXBwbGUgc29mdHdhcmUgY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZQorIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yCisgcmVkaXN0cmlidXRlIHRoaXMgQXBwbGUgc29mdHdhcmUuCisKKyBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0IHRvIHRoZXNlCisgdGVybXMsIEFwcGxlIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCB1bmRlciBBcHBsZdVzIGNvcHlyaWdodHMgaW4KKyB0aGlzIG9yaWdpbmFsIEFwcGxlIHNvZnR3YXJlICh0aGUgIkFwcGxlIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kCisgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5CisgZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUgaW4gaXRzIGVudGlyZXR5IGFuZCB3aXRob3V0CisgbW9kaWZpY2F0aW9ucywgeW91IG11c3QgcmV0YWluIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbAorIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBBcHBsZSBTb2Z0d2FyZS4gIE5laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MKKyBvciBsb2dvcyBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgdGhlIEFwcGxlIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gQXBwbGUuIEV4Y2VwdCBhcyBleHByZXNzbHkKKyBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBBcHBsZQorIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0IG1heSBiZSBpbmZyaW5nZWQgYnkgeW91cgorIGRlcml2YXRpdmUgd29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIEFwcGxlIFNvZnR3YXJlIG1heSBiZSBpbmNvcnBvcmF0ZWQuCisKKyBUaGUgQXBwbGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PIFdBUlJBTlRJRVMsCisgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwKKyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEFQUExFIFNPRlRXQVJFIE9SIElUUworIFVTRSBBTkQgT1BFUkFUSU9OIEFMT05FIE9SIElOIENPTUJJTkFUSU9OIFdJVEggWU9VUiBQUk9EVUNUUy4KKworIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwKKyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICAgICAgICAgIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UsCisgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORAorIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULCBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IKKyBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBQbHVnaW5PYmplY3RfX0RFRklORUQKKyNkZWZpbmUgUGx1Z2luT2JqZWN0X19ERUZJTkVECisKKyNpbmNsdWRlICJtYWluLmgiCisKK2NsYXNzIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgU3ViUGx1Z2luKE5QUCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQorICAgIHZpcnR1YWwgflN1YlBsdWdpbigpIHt9CisgICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSA9IDA7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCkgPSAwOworCisgICAgTlBQIGluc3QoKSBjb25zdCB7IHJldHVybiBtX2luc3Q7IH0KKworcHJpdmF0ZToKKyAgICBOUFAgbV9pbnN0OworfTsKKworZW51bSBQbHVnaW5UeXBlcyB7CisgICAga0FuaW1hdGlvbl9QbHVnaW5UeXBlICA9IDEsCisgICAga0F1ZGlvX1BsdWdpblR5cGUgICAgICA9IDIsCisgICAga0JhY2tncm91bmRfUGx1Z2luVHlwZSA9IDMsCisgICAga0Zvcm1fUGx1Z2luVHlwZSAgICAgICA9IDQsCisgICAga1RleHRfUGx1Z2luVHlwZSAgICAgICA9IDUsCisgICAga1BhaW50X1BsdWdpblR5cGUgICAgICA9IDYsCit9OwordHlwZWRlZiB1aW50MzJfdCBQbHVnaW5UeXBlOworCit0eXBlZGVmIHN0cnVjdCBQbHVnaW5PYmplY3QgeworICAgIE5QT2JqZWN0IGhlYWRlcjsKKyAgICBOUFAgbnBwOworICAgIE5QV2luZG93KiB3aW5kb3c7CisKKyAgICBQbHVnaW5UeXBlIHBsdWdpblR5cGU7CisgICAgU3ViUGx1Z2luKiBhY3RpdmVQbHVnaW47CisKK30gUGx1Z2luT2JqZWN0OworCitOUENsYXNzICpnZXRQbHVnaW5DbGFzcyh2b2lkKTsKKworI2VuZGlmIC8vIFBsdWdpbk9iamVjdF9fREVGSU5FRApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ZTI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiQW5pbWF0aW9uUGx1Z2luLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgIGJyb3dzZXI7CitleHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgZ0xvZ0k7CitleHRlcm4gQU5QQ2FudmFzSW50ZXJmYWNlVjAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgZ1BhaW50STsKK2V4dGVybiBBTlBQYXRoSW50ZXJmYWNlVjAgICAgICBnUGF0aEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgZ1R5cGVmYWNlSTsKK2V4dGVybiBBTlBXaW5kb3dJbnRlcmZhY2VWMCAgICBnV2luZG93STsKKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlKSB7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworfQorCitzdGF0aWMgdWludDE2IHJuZDE2KGZsb2F0IHgsIGludCBpbnNldCkgeworICAgIGludCBpeCA9IChpbnQpcm91bmRmKHgpICsgaW5zZXQ7CisgICAgaWYgKGl4IDwgMCkgeworICAgICAgICBpeCA9IDA7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTY+KGl4KTsKK30KKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlLCBjb25zdCBBTlBSZWN0RiYgciwgYm9vbCBkb0FBKSB7CisgICAgY29uc3QgaW50IGluc2V0ID0gZG9BQSA/IC0xIDogMDsKKworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gcmVpbnRlcnByZXRfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOworICAgIE5QUmVjdCBpbnZhbDsKKyAgICBpbnZhbC5sZWZ0ID0gcm5kMTYoci5sZWZ0LCBpbnNldCk7CisgICAgaW52YWwudG9wID0gcm5kMTYoci50b3AsIGluc2V0KTsKKyAgICBpbnZhbC5yaWdodCA9IHJuZDE2KHIucmlnaHQsIC1pbnNldCk7CisgICAgaW52YWwuYm90dG9tID0gcm5kMTYoci5ib3R0b20sIC1pbnNldCk7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsICZpbnZhbCk7Cit9CisKK3VpbnQzMl90IGdldE1TZWNzKCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICAgIHJldHVybiAodWludDMyX3QpICh0di50dl9zZWMgKiAxMDAwICsgdHYudHZfdXNlYyAvIDEwMDAgKTsgLy8gbWljcm9zZWNvbmRzIHRvIG1pbGxpc2Vjb25kcworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JhbGxBbmltYXRpb246OkJhbGxBbmltYXRpb24oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKyAgICBtX3ggPSBtX3kgPSAwOworICAgIG1fZHggPSA3ICogU0NBTEU7CisgICAgbV9keSA9IDUgKiBTQ0FMRTsKKworICAgIG1lbXNldCgmbV9vdmFsLCAwLCBzaXplb2YobV9vdmFsKSk7CisKKyAgICBtX3BhaW50ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludCwgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnQsIDB4RkZGRjAwMDApOworICAgIGdQYWludEkuc2V0VGV4dFNpemUobV9wYWludCwgMjQpOworCisgICAgQU5QVHlwZWZhY2UqIHRmID0gZ1R5cGVmYWNlSS5jcmVhdGVGcm9tTmFtZSgic2VyaWYiLCBrSXRhbGljX0FOUFR5cGVmYWNlU3R5bGUpOworICAgIGdQYWludEkuc2V0VHlwZWZhY2UobV9wYWludCwgdGYpOworICAgIGdUeXBlZmFjZUkudW5yZWYodGYpOworCisgICAgLy9yZWdpc3RlciBmb3Iga2V5IGFuZCB0b3VjaCBldmVudHMKKyAgICBBTlBFdmVudEZsYWdzIGZsYWdzID0ga0tleV9BTlBFdmVudEZsYWcgfCBrVG91Y2hfQU5QRXZlbnRGbGFnOworICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdCwga0FjY2VwdEV2ZW50c19BTlBTZXRWYWx1ZSwgJmZsYWdzKTsKKyAgICBpZiAoZXJyICE9IE5QRVJSX05PX0VSUk9SKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRXJyb3JfQU5QTG9nVHlwZSwgIkVycm9yIHNlbGVjdGluZyBpbnB1dCBldmVudHMuIik7CisgICAgfQorfQorCitCYWxsQW5pbWF0aW9uOjp+QmFsbEFuaW1hdGlvbigpIHsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnQpOworfQorCitzdGF0aWMgdm9pZCBib3VuY2UoZmxvYXQqIHgsIGZsb2F0KiBkeCwgY29uc3QgZmxvYXQgbWF4KSB7CisgICAgKnggKz0gKmR4OworICAgIGlmICgqeCA8IDApIHsKKyAgICAgICAgKnggPSAwOworICAgICAgICBpZiAoKmR4IDwgMCkgeworICAgICAgICAgICAgKmR4ID0gLSpkeDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKnggPiBtYXgpIHsKKyAgICAgICAgKnggPSBtYXg7CisgICAgICAgIGlmICgqZHggPiAwKSB7CisgICAgICAgICAgICAqZHggPSAtKmR4OworICAgICAgICB9CisgICAgfQorfQorCitib29sIEJhbGxBbmltYXRpb246OnN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCBtb2RlbCkgeworICAgIHJldHVybiAobW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpOworfQorCit2b2lkIEJhbGxBbmltYXRpb246OmRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKSB7CisgICAgQU5QQ2FudmFzKiBjYW52YXMgPSBnQ2FudmFzSS5uZXdDYW52YXMoJmJpdG1hcCk7CisKKyAgICBBTlBSZWN0RiBjbGlwUjsKKyAgICBjbGlwUi5sZWZ0ID0gY2xpcC5sZWZ0OworICAgIGNsaXBSLnRvcCA9IGNsaXAudG9wOworICAgIGNsaXBSLnJpZ2h0ID0gY2xpcC5yaWdodDsKKyAgICBjbGlwUi5ib3R0b20gPSBjbGlwLmJvdHRvbTsKKyAgICBnQ2FudmFzSS5jbGlwUmVjdChjYW52YXMsICZjbGlwUik7CisKKyAgICBkcmF3KGNhbnZhcyk7CisgICAgZ0NhbnZhc0kuZGVsZXRlQ2FudmFzKGNhbnZhcyk7Cit9CisKK3ZvaWQgQmFsbEFuaW1hdGlvbjo6ZHJhdyhBTlBDYW52YXMqIGNhbnZhcykgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisgICAgY29uc3QgZmxvYXQgT1cgPSAyMDsKKyAgICBjb25zdCBmbG9hdCBPSCA9IDIwOworICAgIGNvbnN0IGludCBXID0gb2JqLT53aW5kb3ctPndpZHRoOworICAgIGNvbnN0IGludCBIID0gb2JqLT53aW5kb3ctPmhlaWdodDsKKworICAgIGludmFsKGluc3RhbmNlLCBtX292YWwsIHRydWUpOyAgLy8gaW52YWwgdGhlIG9sZAorICAgIG1fb3ZhbC5sZWZ0ID0gbV94OworICAgIG1fb3ZhbC50b3AgPSBtX3k7CisgICAgbV9vdmFsLnJpZ2h0ID0gbV94ICsgT1c7CisgICAgbV9vdmFsLmJvdHRvbSA9IG1feSArIE9IOworICAgIGludmFsKGluc3RhbmNlLCBtX292YWwsIHRydWUpOyAgLy8gaW52YWwgdGhlIG5ldworCisgICAgZ0NhbnZhc0kuZHJhd0NvbG9yKGNhbnZhcywgMHhGRkZGRkZGRik7CisKKyAgICAvLyB0ZXN0IG91dCB0aGUgUGF0aCBBUEkKKyAgICB7CisgICAgICAgIEFOUFBhdGgqIHBhdGggPSBnUGF0aEkubmV3UGF0aCgpOworCisgICAgICAgIGZsb2F0IGN4ID0gVyAqIDAuNWY7CisgICAgICAgIGZsb2F0IGN5ID0gSCAqIDAuNWY7CisgICAgICAgIGdQYXRoSS5tb3ZlVG8ocGF0aCwgMCwgMCk7CisgICAgICAgIGdQYXRoSS5xdWFkVG8ocGF0aCwgY3gsIGN5LCBXLCAwKTsKKyAgICAgICAgZ1BhdGhJLnF1YWRUbyhwYXRoLCBjeCwgY3ksIFcsIEgpOworICAgICAgICBnUGF0aEkucXVhZFRvKHBhdGgsIGN4LCBjeSwgMCwgSCk7CisgICAgICAgIGdQYXRoSS5xdWFkVG8ocGF0aCwgY3gsIGN5LCAwLCAwKTsKKworICAgICAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnQsIDB4RkYwMDAwRkYpOworICAgICAgICBnQ2FudmFzSS5kcmF3UGF0aChjYW52YXMsIHBhdGgsIG1fcGFpbnQpOworCisgICAgICAgIEFOUFJlY3RGIGJvdW5kczsKKyAgICAgICAgbWVtc2V0KCZib3VuZHMsIDAsIHNpemVvZihib3VuZHMpKTsKKyAgICAgICAgZ1BhdGhJLmdldEJvdW5kcyhwYXRoLCAmYm91bmRzKTsKKyNpZiAwCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICJkcmF3cGF0aDogY2VudGVyICVnICVnIGJvdW5kcyBbJWcgJWcgJWcgJWddXG4iLAorICAgICAgICAgICAgICAgICAgY3gsIGN5LAorICAgICAgICAgICAgICAgICAgYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSk7CisjZW5kaWYKKyAgICAgICAgZ1BhdGhJLmRlbGV0ZVBhdGgocGF0aCk7CisgICAgfQorCisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50LCAweEZGRkYwMDAwKTsKKyAgICBnQ2FudmFzSS5kcmF3T3ZhbChjYW52YXMsICZtX292YWwsIG1fcGFpbnQpOworCisgICAgYm91bmNlKCZtX3gsICZtX2R4LCBvYmotPndpbmRvdy0+d2lkdGggLSBPVyk7CisgICAgYm91bmNlKCZtX3ksICZtX2R5LCBvYmotPndpbmRvdy0+aGVpZ2h0IC0gT0gpOworCisgICAgaWYgKG1VbmljaGFyKSB7CisgICAgICAgIEFOUEZvbnRNZXRyaWNzIGZtOworICAgICAgICBnUGFpbnRJLmdldEZvbnRNZXRyaWNzKG1fcGFpbnQsICZmbSk7CisKKyAgICAgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50LCAweEZGMDAwMEZGKTsKKyAgICAgICAgY2hhciBjID0gc3RhdGljX2Nhc3Q8Y2hhcj4obVVuaWNoYXIpOworICAgICAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsICZjLCAxLCAxMCwgLWZtLmZUb3AsIG1fcGFpbnQpOworICAgIH0KK30KKwordm9pZCBCYWxsQW5pbWF0aW9uOjpzaG93RW50aXJlUGx1Z2luT25TY3JlZW4oKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKyAgICBOUFdpbmRvdyAqd2luZG93ID0gb2JqLT53aW5kb3c7CisKKyAgICBBTlBSZWN0SSB2aXNpYmxlUmVjdHNbMV07CisKKyAgICB2aXNpYmxlUmVjdHNbMF0ubGVmdCA9IDA7CisgICAgdmlzaWJsZVJlY3RzWzBdLnRvcCA9IDA7CisgICAgdmlzaWJsZVJlY3RzWzBdLnJpZ2h0ID0gd2luZG93LT53aWR0aDsKKyAgICB2aXNpYmxlUmVjdHNbMF0uYm90dG9tID0gd2luZG93LT5oZWlnaHQ7CisKKyAgICBnV2luZG93SS5zZXRWaXNpYmxlUmVjdHMoaW5zdGFuY2UsIHZpc2libGVSZWN0cywgMSk7CisgICAgZ1dpbmRvd0kuY2xlYXJWaXNpYmxlUmVjdHMoaW5zdGFuY2UpOworfQorCitpbnQxNiBCYWxsQW5pbWF0aW9uOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmRyYXcubW9kZWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOgorICAgICAgICAgICAgICAgICAgICBkcmF3UGx1Z2luKGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLCBldnQtPmRhdGEuZHJhdy5jbGlwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gdW5rbm93biBkcmF3aW5nIG1vZGVsCisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrS2V5X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGlmIChldnQtPmRhdGEua2V5LmFjdGlvbiA9PSBrRG93bl9BTlBLZXlBY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBtVW5pY2hhciA9IGV2dC0+ZGF0YS5rZXkudW5pY2hhcjsKKyAgICAgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiYmFsbCBkb3dua2V5IGV2ZW50Iik7CisgICAgICAgICAgICAgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2Uga1RvdWNoX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgICBpZiAoa0Rvd25fQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbikgeworICAgICAgICAgICAgICAgICBzaG93RW50aXJlUGx1Z2luT25TY3JlZW4oKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0NTNjMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisKKyNpZm5kZWYgcGx1Z2luR3JhcGhpY3NfX0RFRklORUQKKyNkZWZpbmUgcGx1Z2luR3JhcGhpY3NfX0RFRklORUQKKworY2xhc3MgQmFsbEFuaW1hdGlvbiA6IHB1YmxpYyBTdWJQbHVnaW4geworcHVibGljOgorICAgIEJhbGxBbmltYXRpb24oTlBQIGluc3QpOworICAgIHZpcnR1YWwgfkJhbGxBbmltYXRpb24oKTsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsKTsKKyAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworcHJpdmF0ZToKKyAgICB2b2lkIGRyYXcoQU5QQ2FudmFzKik7CisgICAgdm9pZCBkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCk7CisgICAgdm9pZCBzaG93RW50aXJlUGx1Z2luT25TY3JlZW4oKTsKKworICAgIGZsb2F0IG1feDsKKyAgICBmbG9hdCBtX3k7CisgICAgZmxvYXQgbV9keDsKKyAgICBmbG9hdCBtX2R5OworCisgICAgaW50MzJfdCBtVW5pY2hhcjsKKworICAgIEFOUFJlY3RGICAgIG1fb3ZhbDsKKyAgICBBTlBQYWludCogICBtX3BhaW50OworCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IFNDQUxFID0gMC4xOworfTsKKwordWludDMyX3QgZ2V0TVNlY3MoKTsKKworI2VuZGlmIC8vIHBsdWdpbkdyYXBoaWNzX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDM0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmNwcApAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJBdWRpb1BsdWdpbi5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgIGdQYWludEk7CitleHRlcm4gQU5QQXVkaW9UcmFja0ludGVyZmFjZVYwIGdTb3VuZEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgIGdUeXBlZmFjZUk7CisKKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlKSB7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworfQorCitzdGF0aWMgdWludDE2IHJuZDE2KGZsb2F0IHgsIGludCBpbnNldCkgeworICAgIGludCBpeCA9IChpbnQpcm91bmRmKHgpICsgaW5zZXQ7CisgICAgaWYgKGl4IDwgMCkgeworICAgICAgICBpeCA9IDA7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTY+KGl4KTsKK30KKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlLCBjb25zdCBBTlBSZWN0RiYgciwgYm9vbCBkb0FBKSB7CisgICAgY29uc3QgaW50IGluc2V0ID0gZG9BQSA/IC0xIDogMDsKKworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gcmVpbnRlcnByZXRfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOworICAgIE5QUmVjdCBpbnZhbDsKKyAgICBpbnZhbC5sZWZ0ID0gcm5kMTYoci5sZWZ0LCBpbnNldCk7CisgICAgaW52YWwudG9wID0gcm5kMTYoci50b3AsIGluc2V0KTsKKyAgICBpbnZhbC5yaWdodCA9IHJuZDE2KHIucmlnaHQsIC1pbnNldCk7CisgICAgaW52YWwuYm90dG9tID0gcm5kMTYoci5ib3R0b20sIC1pbnNldCk7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsICZpbnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvQ2FsbGJhY2soQU5QQXVkaW9FdmVudCBldnQsIHZvaWQqIHVzZXIsIEFOUEF1ZGlvQnVmZmVyKiBidWZmZXIpIHsKKyAgICBzd2l0Y2ggKGV2dCkgeworICAgICAgICBjYXNlIGtNb3JlRGF0YV9BTlBBdWRpb0V2ZW50OiB7CisgICAgICAgICAgICBTb3VuZFBsYXkqIHBsYXkgPSByZWludGVycHJldF9jYXN0PFNvdW5kUGxheSo+KHVzZXIpOworICAgICAgICAgICAgc2l6ZV90IGFtb3VudCA9IGZyZWFkKGJ1ZmZlci0+YnVmZmVyRGF0YSwgMSwgYnVmZmVyLT5zaXplLCBwbGF5LT5maWxlKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IGFtb3VudDsKKyAgICAgICAgICAgIGlmIChhbW91bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGdTb3VuZEkuc3RvcChwbGF5LT50cmFjayk7CisgICAgICAgICAgICAgICAgZmNsb3NlKHBsYXktPmZpbGUpOworICAgICAgICAgICAgICAgIHBsYXktPmZpbGUgPSBOVUxMOworICAgICAgICAgICAgICAgIC8vIFRPRE8gbmVlZCB0byBub3RpZnkgb3VyIG1haW4gdGhyZWFkIHRvIGRlbGV0ZSB0aGUgdHJhY2sgbm93CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwbGF5LT5maWxlU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIHdlIG5lZWQgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBwcm9ncmVzcyB2YWx1ZQorICAgICAgICAgICAgICAgIHBsYXktPnByb2dyZXNzID0gMTsKKyAgICAgICAgICAgICAgICBpbnZhbChwbGF5LT5pbnN0YW5jZSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBdWRpb1BsdWdpbjo6QXVkaW9QbHVnaW4oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIGNvbnN0IGNoYXIgcGF0aFtdID0gIi9zZGNhcmQvc2FtcGxlLnJhdyI7CisKKyAgICAvLyBvcGVuIGEgZmlsZSBzdHJlYW0KKyAgICBGSUxFKiBmID0gZm9wZW4ocGF0aCwgInIiKTsKKyAgICBnTG9nSS5sb2coaW5zdCwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0gcGF0aCAlcyBGSUxFICVwIiwgcGF0aCwgZik7CisKKyAgICAvLyBzZXR1cCBvdXIgcHJpdmF0ZSBhdWRpbyBzdHJ1Y3QncyBkZWZhdWx0IHZhbHVlcworICAgIG1fc291bmRQbGF5ID0gbmV3IFNvdW5kUGxheTsKKyAgICBtX3NvdW5kUGxheS0+aW5zdGFuY2UgPSBpbnN0OworICAgIG1fc291bmRQbGF5LT5wcm9ncmVzcyA9IDA7CisgICAgbV9zb3VuZFBsYXktPmZpbGVTaXplID0gMDsKKyAgICBtX3NvdW5kUGxheS0+ZmlsZSA9IGY7CisgICAgbV9zb3VuZFBsYXktPnRyYWNrID0gTlVMTDsKKworICAgIC8vIGNyZWF0ZSB0aGUgYXVkaW8gdHJhY2sKKyAgICBpZiAoZikgeworICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2sgPSBnU291bmRJLm5ld1RyYWNrKDQ0MTAwLCBrUENNMTZCaXRfQU5QU2FtcGxlRm9ybWF0LCAyLCBhdWRpb0NhbGxiYWNrLCBtX3NvdW5kUGxheSk7CisgICAgICAgIGlmICghbV9zb3VuZFBsYXktPnRyYWNrKSB7CisgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICBtX3NvdW5kUGxheS0+ZmlsZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBnZXQgdGhlIGF1ZGlvIGZpbGUncyBzaXplCisgICAgaW50IGZpbGVEZXNjcmlwdG9yID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisgICAgc3RydWN0IHN0YXQgZmlsZVN0YXR1czsKKworICAgIGlmKGZpbGVEZXNjcmlwdG9yIDw9IDApIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiZm9wZW4gZXJyb3IiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZnN0YXQoZmlsZURlc2NyaXB0b3IsICZmaWxlU3RhdHVzKSAhPSAwKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRGVidWdfQU5QTG9nVHlwZSwgIkZpbGUgU2l6ZTogJWQiLCBmaWxlU3RhdHVzLnN0X3NpemUpOworICAgICAgICBtX3NvdW5kUGxheS0+ZmlsZVNpemUgPSBmaWxlU3RhdHVzLnN0X3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiZnN0YXQgZXJyb3IiKTsKKyAgICB9CisKKyAgICAvLyBjb25maWd1cmUgdGhlIFVJIGVsZW1lbnRzCisgICAgbV9hY3RpdmVUb3VjaCA9IGZhbHNlOworCisgICAgbWVtc2V0KCZtX3RyYWNrUmVjdCwgMCwgc2l6ZW9mKG1fdHJhY2tSZWN0KSk7CisgICAgbWVtc2V0KCZtX3BsYXlSZWN0LCAgMCwgc2l6ZW9mKG1fcGxheVJlY3QpKTsKKyAgICBtZW1zZXQoJm1fcGF1c2VSZWN0LCAwLCBzaXplb2YobV9wYXVzZVJlY3QpKTsKKyAgICBtZW1zZXQoJm1fc3RvcFJlY3QsICAwLCBzaXplb2YobV9zdG9wUmVjdCkpOworCisgICAgbV9wYWludFRyYWNrID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludFRyYWNrLCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRUcmFjaykgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50VHJhY2ssIDB4RkZDMEMwQzApOworCisgICAgbV9wYWludFJlY3QgPSBnUGFpbnRJLm5ld1BhaW50KCk7CisgICAgZ1BhaW50SS5zZXRGbGFncyhtX3BhaW50UmVjdCwgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50UmVjdCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50UmVjdCwgMHhGRkE4QThBOCk7CisKKyAgICBtX3BhaW50VGV4dCA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRUZXh0LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRUZXh0KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRUZXh0LCAweEZGMkY0RjRGKTsKKyAgICBnUGFpbnRJLnNldFRleHRTaXplKG1fcGFpbnRUZXh0LCAxOCk7CisKKyAgICBtX3BhaW50VHJhY2tQcm9ncmVzcyA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRUcmFja1Byb2dyZXNzLCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRUcmFja1Byb2dyZXNzKSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRUcmFja1Byb2dyZXNzLCAweEZGNTQ1NDU0KTsKKworICAgIG1fcGFpbnRBY3RpdmVSZWN0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludEFjdGl2ZVJlY3QsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludEFjdGl2ZVJlY3QpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludEFjdGl2ZVJlY3QsIDB4RkY1NDU0NTQpOworCisgICAgQU5QVHlwZWZhY2UqIHRmID0gZ1R5cGVmYWNlSS5jcmVhdGVGcm9tTmFtZSgic2VyaWYiLCBrSXRhbGljX0FOUFR5cGVmYWNlU3R5bGUpOworICAgIGdQYWludEkuc2V0VHlwZWZhY2UobV9wYWludFRleHQsIHRmKTsKKyAgICBnVHlwZWZhY2VJLnVucmVmKHRmKTsKKworICAgIC8vcmVnaXN0ZXIgZm9yIHRvdWNoIGV2ZW50cworICAgIEFOUEV2ZW50RmxhZ3MgZmxhZ3MgPSBrVG91Y2hfQU5QRXZlbnRGbGFnOworICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdCwga0FjY2VwdEV2ZW50c19BTlBTZXRWYWx1ZSwgJmZsYWdzKTsKKyAgICBpZiAoZXJyICE9IE5QRVJSX05PX0VSUk9SKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRXJyb3JfQU5QTG9nVHlwZSwgIkVycm9yIHNlbGVjdGluZyBpbnB1dCBldmVudHMuIik7CisgICAgfQorfQorCitBdWRpb1BsdWdpbjo6fkF1ZGlvUGx1Z2luKCkgeworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludFRyYWNrKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRSZWN0KTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRUZXh0KTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRUcmFja1Byb2dyZXNzKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRBY3RpdmVSZWN0KTsKKyAgICBpZihtX3NvdW5kUGxheS0+dHJhY2spCisgICAgICAgIGdTb3VuZEkuZGVsZXRlVHJhY2sobV9zb3VuZFBsYXktPnRyYWNrKTsKKyAgICBkZWxldGUgbV9zb3VuZFBsYXk7Cit9CisKK2Jvb2wgQXVkaW9QbHVnaW46OnN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCBtb2RlbCkgeworICAgIHJldHVybiAobW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpOworfQorCit2b2lkIEF1ZGlvUGx1Z2luOjpkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCkgeworICAgIEFOUENhbnZhcyogY2FudmFzID0gZ0NhbnZhc0kubmV3Q2FudmFzKCZiaXRtYXApOworCisgICAgQU5QUmVjdEYgY2xpcFI7CisgICAgY2xpcFIubGVmdCA9IGNsaXAubGVmdDsKKyAgICBjbGlwUi50b3AgPSBjbGlwLnRvcDsKKyAgICBjbGlwUi5yaWdodCA9IGNsaXAucmlnaHQ7CisgICAgY2xpcFIuYm90dG9tID0gY2xpcC5ib3R0b207CisgICAgZ0NhbnZhc0kuY2xpcFJlY3QoY2FudmFzLCAmY2xpcFIpOworCisgICAgZHJhdyhjYW52YXMpOworICAgIGdDYW52YXNJLmRlbGV0ZUNhbnZhcyhjYW52YXMpOworfQorCit2b2lkIEF1ZGlvUGx1Z2luOjpkcmF3KEFOUENhbnZhcyogY2FudmFzKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJEcmF3aW5nIik7CisKKyAgICBjb25zdCBmbG9hdCB0cmFja0hlaWdodCA9IDMwOworICAgIGNvbnN0IGZsb2F0IGJ1dHRvbldpZHRoID0gNjA7CisgICAgY29uc3QgZmxvYXQgYnV0dG9uSGVpZ2h0ID0gMzA7CisgICAgY29uc3QgaW50IFcgPSBvYmotPndpbmRvdy0+d2lkdGg7CisgICAgY29uc3QgaW50IEggPSBvYmotPndpbmRvdy0+aGVpZ2h0OworCisgICAgLy8gY29sb3IgdGhlIHBsdWdpbiBjYW52YXMKKyAgICBnQ2FudmFzSS5kcmF3Q29sb3IoY2FudmFzLCAweEZGQ0RDRENEKTsKKworICAgIC8vIGdldCBmb250IG1ldHJpY3MKKyAgICBBTlBGb250TWV0cmljcyBmb250TWV0cmljczsKKyAgICBnUGFpbnRJLmdldEZvbnRNZXRyaWNzKG1fcGFpbnRUZXh0LCAmZm9udE1ldHJpY3MpOworCisgICAgLy8gZHJhdyB0aGUgdHJhY2sgYm94ICgxIHB4IGZyb20gdGhlIGVkZ2UpCisgICAgbV90cmFja1JlY3QubGVmdCA9IDE7CisgICAgbV90cmFja1JlY3QudG9wID0gMTsKKyAgICBtX3RyYWNrUmVjdC5yaWdodCA9IFcgLSAyOworICAgIG1fdHJhY2tSZWN0LmJvdHRvbSA9IDEgKyB0cmFja0hlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3RyYWNrUmVjdCwgbV9wYWludFRyYWNrKTsKKworICAgIC8vIGRyYXcgdGhlIHByb2dyZXNzIGJhcgorICAgIGlmIChtX3NvdW5kUGxheS0+cHJvZ3Jlc3MgPiAwKSB7CisgICAgICAgIC8vIFRPRE8gbmVlZCB0byBkcmF3IHByb2dyZXNzIGJhciB0byBjb3ZlciB0aGUgcHJvcGVyIHBlcmNlbnRhZ2Ugb2YgdGhlIHRyYWNrIGJhcgorICAgICAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3RyYWNrUmVjdCwgbV9wYWludFRyYWNrUHJvZ3Jlc3MpOworICAgIH0KKworICAgIC8vIGRyYXcgdGhlIHBsYXkgYm94ICh1bmRlciB0cmFjayBib3gpCisgICAgbV9wbGF5UmVjdC5sZWZ0ID0gbV90cmFja1JlY3QubGVmdCArIDU7CisgICAgbV9wbGF5UmVjdC50b3AgPSBtX3RyYWNrUmVjdC5ib3R0b20gKyAxMDsKKyAgICBtX3BsYXlSZWN0LnJpZ2h0ID0gbV9wbGF5UmVjdC5sZWZ0ICsgYnV0dG9uV2lkdGg7CisgICAgbV9wbGF5UmVjdC5ib3R0b20gPSBtX3BsYXlSZWN0LnRvcCArIGJ1dHRvbkhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3BsYXlSZWN0LCBnZXRQYWludCgmbV9wbGF5UmVjdCkpOworICAgIC8vIGRyYXcgdGhlIHBsYXkgYm94ICh1bmRlciB0cmFjayBib3gpCisgICAgY29uc3QgY2hhciBwbGF5VGV4dFtdID0gIlBsYXkiOworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgcGxheVRleHQsIHNpemVvZihwbGF5VGV4dCktMSwgbV9wbGF5UmVjdC5sZWZ0ICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICBtX3BsYXlSZWN0LnRvcCAtIGZvbnRNZXRyaWNzLmZUb3AsIG1fcGFpbnRUZXh0KTsKKworICAgIC8vIGRyYXcgdGhlIHBhdXNlIGJveCAodW5kZXIgdHJhY2sgYm94KQorICAgIG1fcGF1c2VSZWN0LmxlZnQgPSBtX3BsYXlSZWN0LnJpZ2h0ICsgMjA7CisgICAgbV9wYXVzZVJlY3QudG9wID0gbV90cmFja1JlY3QuYm90dG9tICsgMTA7CisgICAgbV9wYXVzZVJlY3QucmlnaHQgPSBtX3BhdXNlUmVjdC5sZWZ0ICsgYnV0dG9uV2lkdGg7CisgICAgbV9wYXVzZVJlY3QuYm90dG9tID0gbV9wYXVzZVJlY3QudG9wICsgYnV0dG9uSGVpZ2h0OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fcGF1c2VSZWN0LCBnZXRQYWludCgmbV9wYXVzZVJlY3QpKTsKKyAgICAvLyBkcmF3IHRoZSB0ZXh0IGluIHRoZSBwYXVzZSBib3gKKyAgICBjb25zdCBjaGFyIHBhdXNlVGV4dFtdID0gIlBhdXNlIjsKKyAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsIHBhdXNlVGV4dCwgc2l6ZW9mKHBhdXNlVGV4dCktMSwgbV9wYXVzZVJlY3QubGVmdCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgbV9wYXVzZVJlY3QudG9wIC0gZm9udE1ldHJpY3MuZlRvcCwgbV9wYWludFRleHQpOworCisgICAgLy8gZHJhdyB0aGUgc3RvcCBib3ggKHVuZGVyIHRyYWNrIGJveCkKKyAgICBtX3N0b3BSZWN0LmxlZnQgPSBtX3BhdXNlUmVjdC5yaWdodCArIDIwOworICAgIG1fc3RvcFJlY3QudG9wID0gbV90cmFja1JlY3QuYm90dG9tICsgMTA7CisgICAgbV9zdG9wUmVjdC5yaWdodCA9IG1fc3RvcFJlY3QubGVmdCArIGJ1dHRvbldpZHRoOworICAgIG1fc3RvcFJlY3QuYm90dG9tID0gbV9zdG9wUmVjdC50b3AgKyBidXR0b25IZWlnaHQ7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV9zdG9wUmVjdCwgZ2V0UGFpbnQoJm1fc3RvcFJlY3QpKTsKKyAgICAvLyBkcmF3IHRoZSB0ZXh0IGluIHRoZSBwYXVzZSBib3gKKyAgICBjb25zdCBjaGFyIHN0b3BUZXh0W10gPSAiU3RvcCI7CisgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCBzdG9wVGV4dCwgc2l6ZW9mKHN0b3BUZXh0KS0xLCBtX3N0b3BSZWN0LmxlZnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgIG1fc3RvcFJlY3QudG9wIC0gZm9udE1ldHJpY3MuZlRvcCwgbV9wYWludFRleHQpOworfQorCitBTlBQYWludCogQXVkaW9QbHVnaW46OmdldFBhaW50KEFOUFJlY3RGKiBpbnB1dCkgeworICAgIHJldHVybiAoaW5wdXQgPT0gbV9hY3RpdmVSZWN0KSA/IG1fcGFpbnRBY3RpdmVSZWN0IDogbV9wYWludFJlY3Q7Cit9CisKK2ludDE2IEF1ZGlvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmRyYXcubW9kZWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOgorICAgICAgICAgICAgICAgICAgICBkcmF3UGx1Z2luKGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLCBldnQtPmRhdGEuZHJhdy5jbGlwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gdW5rbm93biBkcmF3aW5nIG1vZGVsCisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrVG91Y2hfQU5QRXZlbnRUeXBlOiB7CisgICAgICAgICAgICBpbnQgeCA9IGV2dC0+ZGF0YS50b3VjaC54OworICAgICAgICAgICAgaW50IHkgPSBldnQtPmRhdGEudG91Y2gueTsKKyAgICAgICAgICAgIGlmIChrRG93bl9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uKSB7CisKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVRvdWNoUmVjdCA9IHZhbGlkVG91Y2goeCx5KTsKKyAgICAgICAgICAgICAgICBpZihtX2FjdGl2ZVRvdWNoUmVjdCkgeworICAgICAgICAgICAgICAgICAgICBtX2FjdGl2ZVRvdWNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGtVcF9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uICYmIG1fYWN0aXZlVG91Y2gpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVUb3VjaCh4LCB5KTsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVRvdWNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtDYW5jZWxfQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbikgeworICAgICAgICAgICAgICAgIG1fYWN0aXZlVG91Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKK30KKwordm9pZCBBdWRpb1BsdWdpbjo6aW52YWxBY3RpdmVSZWN0KCkgeworCit9CisKK0FOUFJlY3RGKiBBdWRpb1BsdWdpbjo6dmFsaWRUb3VjaChpbnQgeCwgaW50IHkpIHsKKworICAgIGlmIChtX3BsYXlSZWN0LmxlZnQgJiYgeCA8IG1fcGxheVJlY3QucmlnaHQgJiYgeSA+IG1fcGxheVJlY3QudG9wICYmIHkgPCBtX3BsYXlSZWN0LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX3BsYXlSZWN0OworICAgIGVsc2UgaWYgKG1fcGF1c2VSZWN0LmxlZnQgJiYgeCA8IG1fcGF1c2VSZWN0LnJpZ2h0ICYmIHkgPiBtX3BhdXNlUmVjdC50b3AgJiYgeSA8IG1fcGF1c2VSZWN0LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX3BhdXNlUmVjdDsKKyAgICBlbHNlIGlmICh4ID4gbV9zdG9wUmVjdC5sZWZ0ICYmIHggPCBtX3N0b3BSZWN0LnJpZ2h0ICYmIHkgPiBtX3N0b3BSZWN0LnRvcCAmJiB5IDwgbV9zdG9wUmVjdC5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9zdG9wUmVjdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIEF1ZGlvUGx1Z2luOjpoYW5kbGVUb3VjaChpbnQgeCwgaW50IHkpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICAvLyBpZiB0aGUgdHJhY2sgaXMgbnVsbCB0aGVuIHJldHVybgorICAgIGlmIChOVUxMID09IG1fc291bmRQbGF5LT50cmFjaykgeworICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLSAlcCB1bmFibGUgdG8gY3JlYXRlIHRyYWNrIiwKKyAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudFJlY3QgbWF0Y2hlcyB0aGUgYWN0aXZlUmVjdAorICAgIEFOUFJlY3RGKiBjdXJyZW50UmVjdCA9IHZhbGlkVG91Y2goeCx5KTsKKyAgICBpZiAobV9hY3RpdmVUb3VjaFJlY3QgIT0gY3VycmVudFJlY3QpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChjdXJyZW50UmVjdCA9PSAmbV9wbGF5UmVjdCkgeworCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIHN0YXJ0aW5nIHRyYWNrICglZCkiLAorICAgICAgICAgICAgICAgICAgbV9zb3VuZFBsYXktPnRyYWNrLCBnU291bmRJLmlzU3RvcHBlZChtX3NvdW5kUGxheS0+dHJhY2spKTsKKworICAgICAgICBpZiAoZ1NvdW5kSS5pc1N0b3BwZWQobV9zb3VuZFBsYXktPnRyYWNrKSkgeworICAgICAgICAgICAgZ1NvdW5kSS5zdGFydChtX3NvdW5kUGxheS0+dHJhY2spOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJlbnRSZWN0ID09ICZtX3BhdXNlUmVjdCkgeworCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIHBhdXNpbmcgdHJhY2sgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2ssIGdTb3VuZEkuaXNTdG9wcGVkKG1fc291bmRQbGF5LT50cmFjaykpOworCisgICAgICAgIGlmICghZ1NvdW5kSS5pc1N0b3BwZWQobV9zb3VuZFBsYXktPnRyYWNrKSkgeworICAgICAgICAgICAgZ1NvdW5kSS5wYXVzZShtX3NvdW5kUGxheS0+dHJhY2spOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJlbnRSZWN0ID09ICZtX3N0b3BSZWN0KSB7CisKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgc3RvcHBpbmcgdHJhY2sgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2ssIGdTb3VuZEkuaXNTdG9wcGVkKG1fc291bmRQbGF5LT50cmFjaykpOworCisgICAgICAgIGlmICghZ1NvdW5kSS5pc1N0b3BwZWQobV9zb3VuZFBsYXktPnRyYWNrKSkgeworICAgICAgICAgICAgZ1NvdW5kSS5zdG9wKG1fc291bmRQbGF5LT50cmFjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fc291bmRQbGF5LT5maWxlKSB7CisgICAgICAgICAgICBmc2VlayhtX3NvdW5kUGxheS0+ZmlsZSwgMCwgU0VFS19TRVQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gc2V0IHRoZSBjdXJyZW50UmVjdCB0byBiZSB0aGUgYWN0aXZlUmVjdAorICAgIG1fYWN0aXZlUmVjdCA9IGN1cnJlbnRSZWN0OworICAgIGludmFsKGluc3RhbmNlKTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjlkMzNhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hdWRpby9BdWRpb1BsdWdpbi5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBhdWRpb1BsdWdpbl9fREVGSU5FRAorI2RlZmluZSBhdWRpb1BsdWdpbl9fREVGSU5FRAorCitzdHJ1Y3QgU291bmRQbGF5IHsKKyAgICBOUFAgICAgICAgICAgICAgaW5zdGFuY2U7CisgICAgQU5QQXVkaW9UcmFjayogIHRyYWNrOworICAgIEZJTEUqICAgICAgICAgICBmaWxlOworICAgIGludCAgICAgICAgICAgICBmaWxlU2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgcHJvZ3Jlc3M7IC8vIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwCit9OworCitjbGFzcyBBdWRpb1BsdWdpbiA6IHB1YmxpYyBTdWJQbHVnaW4geworcHVibGljOgorICAgIEF1ZGlvUGx1Z2luKE5QUCBpbnN0KTsKKyAgICB2aXJ0dWFsIH5BdWRpb1BsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7Citwcml2YXRlOgorICAgIHZvaWQgZHJhdyhBTlBDYW52YXMqKTsKKyAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKKworICAgIHZvaWQgaGFuZGxlVG91Y2goaW50IHgsIGludCB5KTsKKyAgICB2b2lkIGludmFsQWN0aXZlUmVjdCgpOworICAgIEFOUFBhaW50KiBnZXRQYWludChBTlBSZWN0RiopOworICAgIEFOUFJlY3RGKiB2YWxpZFRvdWNoKGludCB4LCBpbnQgeSk7CisKKyAgICBBTlBSZWN0RiAgICBtX3RyYWNrUmVjdDsKKyAgICBBTlBSZWN0RiAgICBtX3BsYXlSZWN0OworICAgIEFOUFJlY3RGICAgIG1fcGF1c2VSZWN0OworICAgIEFOUFJlY3RGICAgIG1fc3RvcFJlY3Q7CisKKyAgICBBTlBQYWludCogICBtX3BhaW50VHJhY2s7CisgICAgQU5QUGFpbnQqICAgbV9wYWludFJlY3Q7CisgICAgQU5QUGFpbnQqICAgbV9wYWludFRleHQ7CisKKyAgICBBTlBQYWludCogICBtX3BhaW50VHJhY2tQcm9ncmVzczsKKyAgICBBTlBQYWludCogICBtX3BhaW50QWN0aXZlUmVjdDsKKworICAgIFNvdW5kUGxheSogIG1fc291bmRQbGF5OworCisgICAgYm9vbCAgICAgICAgbV9hY3RpdmVUb3VjaDsKKyAgICBBTlBSZWN0RiogICBtX2FjdGl2ZVRvdWNoUmVjdDsKKyAgICBBTlBSZWN0RiogICBtX2FjdGl2ZVJlY3Q7Cit9OworCisjZW5kaWYgLy8gYXVkaW9QbHVnaW5fX0RFRklORUQKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTkyY2JiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uY3BwCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIkJhY2tncm91bmRQbHVnaW4uaCIKKyNpbmNsdWRlICJhbmRyb2lkX25wYXBpLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgIGJyb3dzZXI7CitleHRlcm4gQU5QQml0bWFwSW50ZXJmYWNlVjAgICAgZ0JpdG1hcEk7CitleHRlcm4gQU5QQ2FudmFzSW50ZXJmYWNlVjAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgZ0xvZ0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgZ1BhaW50STsKK2V4dGVybiBBTlBTdXJmYWNlSW50ZXJmYWNlVjAgICBnU3VyZmFjZUk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgZ1R5cGVmYWNlSTsKKworZXh0ZXJuIHVpbnQzMl90IGdldE1TZWNzKCk7CisKKyNkZWZpbmUgQVJSQVlfQ09VTlQoYXJyYXkpICAgICAgKHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXlbMF0pKQorCisvLyNkZWZpbmUgTE9HX0VSUk9SKGluc3QsIHN0cmluZywgcGFyYW1zLi4uKSBnTG9nSS5sb2coaW5zdCwga0Vycm9yX0FOUExvZ1R5cGUsIChsb2dfcHJlZml4ICsgc3RyaW5nKSwgaW5zdCwgcGFyYW1zKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JhY2tncm91bmRQbHVnaW46OkJhY2tncm91bmRQbHVnaW4oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIC8vIGluaXRpYWxpemUgdGhlIGRyYXdpbmcgc3VyZmFjZQorICAgIG1fc3VyZmFjZVJlYWR5ID0gZmFsc2U7CisgICAgbV9zdXJmYWNlID0gZ1N1cmZhY2VJLm5ld1Jhc3RlclN1cmZhY2UoaW5zdCwga1JHQl81NjVfQU5QQml0bWFwRm9ybWF0LCBmYWxzZSk7CisgICAgaWYoIW1fc3VyZmFjZSkKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLSVwIFVuYWJsZSB0byBjcmVhdGUgUkdCQSBzdXJmYWNlIiwgaW5zdCk7CisKKyAgICAvL2luaXRpYWxpemUgYml0bWFwIHRyYW5zcGFyZW5jeSB2YXJpYWJsZXMKKyAgICBtRmluaXNoZWRTdGFnZU9uZSAgID0gZmFsc2U7CisgICAgbUZpbmlzaGVkU3RhZ2VUd28gICA9IGZhbHNlOworICAgIG1GaW5pc2hlZFN0YWdlVGhyZWUgPSBmYWxzZTsKKworICAgIC8vIHRlc3QgYmFzaWMgcGx1Z2luIGZ1bmN0aW9uYWxpdHkKKyAgICB0ZXN0X2xvZ2dpbmcoKTsgLy8gYW5kcm9pZCBsb2dnaW5nCisgICAgdGVzdF90aW1lcnMoKTsgIC8vIHBsdWdpbiB0aW1lcnMKKyAgICB0ZXN0X2JpdG1hcHMoKTsgLy8gYW5kcm9pZCBiaXRtYXBzCisgICAgdGVzdF9kb21BY2Nlc3MoKTsKKyAgICB0ZXN0X2phdmFzY3JpcHQoKTsKK30KKworQmFja2dyb3VuZFBsdWdpbjo6fkJhY2tncm91bmRQbHVnaW4oKSB7CisgICAgZ1N1cmZhY2VJLmRlbGV0ZVN1cmZhY2UobV9zdXJmYWNlKTsKK30KKworYm9vbCBCYWNrZ3JvdW5kUGx1Z2luOjpzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwgbW9kZWwpIHsKKyAgICByZXR1cm4gKG1vZGVsID09IGtTdXJmYWNlX0FOUERyYXdpbmdNb2RlbCk7Cit9CisKK3ZvaWQgQmFja2dyb3VuZFBsdWdpbjo6ZHJhd1BsdWdpbihpbnQgc3VyZmFjZVdpZHRoLCBpbnQgc3VyZmFjZUhlaWdodCkgeworCisgICAgLy8gZ2V0IHRoZSBwbHVnaW4ncyBkaW1lbnNpb25zIGFjY29yZGluZyB0byB0aGUgRE9NCisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdCgpLT5wZGF0YTsKKyAgICBjb25zdCBpbnQgVyA9IG9iai0+d2luZG93LT53aWR0aDsKKyAgICBjb25zdCBpbnQgSCA9IG9iai0+d2luZG93LT5oZWlnaHQ7CisKKyAgICAvLyBjb21wdXRlIHRoZSBjdXJyZW50IHpvb20gbGV2ZWwKKyAgICBjb25zdCBmbG9hdCB6b29tRmFjdG9yVyA9IHN0YXRpY19jYXN0PGZsb2F0PihzdXJmYWNlV2lkdGgpIC8gVzsKKyAgICBjb25zdCBmbG9hdCB6b29tRmFjdG9ySCA9IHN0YXRpY19jYXN0PGZsb2F0PihzdXJmYWNlSGVpZ2h0KSAvIEg7CisKKyAgICAvLyBjaGVjayB0byBtYWtlIHN1cmUgdGhlIHpvb20gbGV2ZWwgaXMgdW5pZm9ybQorICAgIGlmICh6b29tRmFjdG9yVyArIC4wMSA8IHpvb21GYWN0b3JIICYmIHpvb21GYWN0b3JXIC0gLjAxID4gem9vbUZhY3RvckgpCisgICAgICAgIGdMb2dJLmxvZyhpbnN0KCksIGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB6b29tIGlzIG91dCBvZiBzeW5jICglZiwlZikiLAorICAgICAgICAgICAgICAgICAgaW5zdCgpLCB6b29tRmFjdG9yVywgem9vbUZhY3RvckgpOworCisgICAgLy8gc2NhbGUgdGhlIHZhcmlhYmxlcyBiYXNlZCBvbiB0aGUgem9vbSBsZXZlbAorICAgIGNvbnN0IGludCBmb250U2l6ZSA9IChpbnQpKHpvb21GYWN0b3JXICogMTYpOworICAgIGNvbnN0IGludCBsZWZ0TWFyZ2luID0gKGludCkoem9vbUZhY3RvclcgKiAxMCk7CisKKyAgICAvLyBsb2NrIHRoZSBzdXJmYWNlCisgICAgQU5QQml0bWFwIGJpdG1hcDsKKyAgICBpZiAoIW1fc3VyZmFjZVJlYWR5IHx8ICFnU3VyZmFjZUkubG9jayhtX3N1cmZhY2UsICZiaXRtYXAsIE5VTEwpKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0KCksIGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB1bmFibGUgdG8gbG9jayB0aGUgcGx1Z2luIiwgaW5zdCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBhIGNhbnZhcworICAgIEFOUENhbnZhcyogY2FudmFzID0gZ0NhbnZhc0kubmV3Q2FudmFzKCZiaXRtYXApOworICAgIGdDYW52YXNJLmRyYXdDb2xvcihjYW52YXMsIDB4RkZGRkZGRkYpOworCisgICAgQU5QUGFpbnQqIHBhaW50ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MocGFpbnQsIGdQYWludEkuZ2V0RmxhZ3MocGFpbnQpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IocGFpbnQsIDB4RkZGRjAwMDApOworICAgIGdQYWludEkuc2V0VGV4dFNpemUocGFpbnQsIGZvbnRTaXplKTsKKworICAgIEFOUFR5cGVmYWNlKiB0ZiA9IGdUeXBlZmFjZUkuY3JlYXRlRnJvbU5hbWUoInNlcmlmIiwga0l0YWxpY19BTlBUeXBlZmFjZVN0eWxlKTsKKyAgICBnUGFpbnRJLnNldFR5cGVmYWNlKHBhaW50LCB0Zik7CisgICAgZ1R5cGVmYWNlSS51bnJlZih0Zik7CisKKyAgICBBTlBGb250TWV0cmljcyBmbTsKKyAgICBnUGFpbnRJLmdldEZvbnRNZXRyaWNzKHBhaW50LCAmZm0pOworCisgICAgZ1BhaW50SS5zZXRDb2xvcihwYWludCwgMHhGRjAwMDBGRik7CisgICAgY29uc3QgY2hhciBjW10gPSAiVGhpcyBpcyBhIGJhY2tncm91bmQgcGx1Z2luLiI7CisgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCBjLCBzaXplb2YoYyktMSwgbGVmdE1hcmdpbiwgLWZtLmZUb3AsIHBhaW50KTsKKworICAgIC8vIGNsZWFuIHVwIHZhcmlhYmxlcyBhbmQgdW5sb2NrIHRoZSBzdXJmYWNlCisgICAgZ1BhaW50SS5kZWxldGVQYWludChwYWludCk7CisgICAgZ0NhbnZhc0kuZGVsZXRlQ2FudmFzKGNhbnZhcyk7CisgICAgZ1N1cmZhY2VJLnVubG9jayhtX3N1cmZhY2UpOworfQorCitpbnQxNiBCYWNrZ3JvdW5kUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0KCksIGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB0aGUgcGx1Z2luIGRpZCBub3QgcmVxdWVzdCBkcmF3IGV2ZW50cyIsIGluc3QoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrU3VyZmFjZV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLnN1cmZhY2UuYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGtDcmVhdGVkX0FOUFN1cmZhY2VBY3Rpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdXJmYWNlUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBrRGVzdHJveWVkX0FOUFN1cmZhY2VBY3Rpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdXJmYWNlUmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Uga0NoYW5nZWRfQU5QU3VyZmFjZUFjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3UGx1Z2luKGV2dC0+ZGF0YS5zdXJmYWNlLmRhdGEuY2hhbmdlZC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5zdXJmYWNlLmRhdGEuY2hhbmdlZC5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtMaWZlY3ljbGVfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgaWYgKGV2dC0+ZGF0YS5saWZlY3ljbGUuYWN0aW9uID09IGtPbkxvYWRfQU5QTGlmZWN5Y2xlQWN0aW9uKSB7CisgICAgICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3QoKSwga0RlYnVnX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIHRoZSBwbHVnaW4gcmVjZWl2ZWQgYW4gb25Mb2FkIGV2ZW50IiwgaW5zdCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUb3VjaF9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdCgpLCBrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgdGhlIHBsdWdpbiBkaWQgbm90IHJlcXVlc3QgdG91Y2ggZXZlbnRzIiwgaW5zdCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtLZXlfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3QoKSwga0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIHRoZSBwbHVnaW4gZGlkIG5vdCByZXF1ZXN0IGtleSBldmVudHMiLCBpbnN0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTE9HR0lORyBURVNUUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3ZvaWQgQmFja2dyb3VuZFBsdWdpbjo6dGVzdF9sb2dnaW5nKCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIC8vTE9HX0VSUk9SKGluc3RhbmNlLCAiIC0tLS0tLSAlcCBUZXN0aW5nIExvZyBFcnJvciIsIGluc3RhbmNlKTsKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBUZXN0aW5nIExvZyBFcnJvciIsIGluc3RhbmNlKTsKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtXYXJuaW5nX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIFRlc3RpbmcgTG9nIFdhcm5pbmciLCBpbnN0YW5jZSk7CisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVGVzdGluZyBMb2cgRGVidWciLCBpbnN0YW5jZSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRJTUVSIFRFU1RTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgVElNRVJfSU5URVJWQUwgICAgIDUwCitzdGF0aWMgdm9pZCB0aW1lcl9vbmVzaG90KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpOworc3RhdGljIHZvaWQgdGltZXJfcmVwZWF0KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpOworc3RhdGljIHZvaWQgdGltZXJfbmV2ZXJmaXJlcyhOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2xhdGVuY3koTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCk7CisKK3ZvaWQgQmFja2dyb3VuZFBsdWdpbjo6dGVzdF90aW1lcnMoKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgLy9TZXR1cCB0aGUgdGVzdGluZyBjb3VudGVycworICAgIG1UaW1lclJlcGVhdENvdW50ID0gNTsKKyAgICBtVGltZXJMYXRlbmN5Q291bnQgPSA1OworCisgICAgLy8gdGVzdCBmb3IgYm9ndXMgdGltZXJJRAorICAgIGJyb3dzZXItPnVuc2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgOTk5OTk5KTsKKyAgICAvLyB0ZXN0IG9uZS1zaG90CisgICAgYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgMTAwLCBmYWxzZSwgdGltZXJfb25lc2hvdCk7CisgICAgLy8gdGVzdCByZXBlYXQKKyAgICBicm93c2VyLT5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCA1MCwgdHJ1ZSwgdGltZXJfcmVwZWF0KTsKKyAgICAvLyB0ZXN0IHRpbWVyIGxhdGVuY3kKKyAgICBicm93c2VyLT5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBUSU1FUl9JTlRFUlZBTCwgdHJ1ZSwgdGltZXJfbGF0ZW5jeSk7CisgICAgbVN0YXJ0VGltZSA9IG1QcmV2VGltZSA9IGdldE1TZWNzKCk7CisgICAgLy8gdGVzdCB1bnNjaGVkdWxlIGltbWVkaWF0ZWx5CisgICAgdWludDMyIGlkID0gYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgMTAwLCBmYWxzZSwgdGltZXJfbmV2ZXJmaXJlcyk7CisgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBpZCk7CisgICAgLy8gdGVzdCBkb3VibGUgdW5zY2hlZHVsZSAoc2hvdWxkIGJlIG5vLW9wKQorICAgIGJyb3dzZXItPnVuc2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgaWQpOworCit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX29uZXNob3QoTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCkgeworICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tLS0tLSBvbmVzaG90IHRpbWVyXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfcmVwZWF0KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpIHsKKyAgICBCYWNrZ3JvdW5kUGx1Z2luICpvYmogPSAoKEJhY2tncm91bmRQbHVnaW4qKSAoKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YSktPmFjdGl2ZVBsdWdpbik7CisKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLS0tLS0gcmVwZWF0IHRpbWVyICVkXG4iLAorICAgICAgICAgICAgICBvYmotPm1UaW1lclJlcGVhdENvdW50KTsKKyAgICBpZiAoLS1vYmotPm1UaW1lclJlcGVhdENvdW50ID09IDApIHsKKyAgICAgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCB0aW1lcklEKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX25ldmVyZmlyZXMoTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCkgeworICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICItLS0tLS0tLSB0aW1lcl9uZXZlcmZpcmVzISEhXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfbGF0ZW5jeShOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKSB7CisgICAgQmFja2dyb3VuZFBsdWdpbiAqb2JqID0gKChCYWNrZ3JvdW5kUGx1Z2luKikgKChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGEpLT5hY3RpdmVQbHVnaW4pOworCisgICAgb2JqLT5tVGltZXJMYXRlbmN5Q3VycmVudENvdW50ICs9IDE7CisKKyAgICB1aW50MzJfdCBub3cgPSBnZXRNU2VjcygpOworICAgIHVpbnQzMl90IGludGVydmFsID0gbm93IC0gb2JqLT5tUHJldlRpbWU7CisgICAgdWludDMyX3QgZHVyID0gbm93IC0gb2JqLT5tU3RhcnRUaW1lOworICAgIHVpbnQzMl90IGV4cGVjdGVkRHVyID0gb2JqLT5tVGltZXJMYXRlbmN5Q3VycmVudENvdW50ICogVElNRVJfSU5URVJWQUw7CisgICAgaW50MzJfdCBkcmlmdCA9IGR1ciAtIGV4cGVjdGVkRHVyOworICAgIGludDMyX3QgYXZnRHJpZnQgPSBkcmlmdCAvIG9iai0+bVRpbWVyTGF0ZW5jeUN1cnJlbnRDb3VudDsKKworICAgIG9iai0+bVByZXZUaW1lID0gbm93OworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwKKyAgICAgICAgICAgICAgIi0tLS0tLS0tIGxhdGVuY3kgdGVzdDogWyUzZF0gaW50ZXJ2YWwgJWQgZXhwZWN0ZWQgJWQsIHRvdGFsICVkIGV4cGVjdGVkICVkLCBkcmlmdCAlZCBhdmcgJWRcbiIsCisgICAgICAgICAgICAgIG9iai0+bVRpbWVyTGF0ZW5jeUN1cnJlbnRDb3VudCwgaW50ZXJ2YWwsIFRJTUVSX0lOVEVSVkFMLCBkdXIsCisgICAgICAgICAgICAgIGV4cGVjdGVkRHVyLCBkcmlmdCwgYXZnRHJpZnQpOworCisgICAgaWYgKC0tb2JqLT5tVGltZXJMYXRlbmN5Q291bnQgPT0gMCkgeworICAgICAgICBicm93c2VyLT51bnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIHRpbWVySUQpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQklUTUFQIFRFU1RTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIHRlc3RfZm9ybWF0cyhOUFAgaW5zdGFuY2UpOworCit2b2lkIEJhY2tncm91bmRQbHVnaW46OnRlc3RfYml0bWFwcygpIHsKKyAgICB0ZXN0X2Zvcm1hdHModGhpcy0+aW5zdCgpKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9mb3JtYXRzKE5QUCBpbnN0YW5jZSkgeworCisgICAgLy8gVE9ETyBwdWxsIG5hbWVzIGZyb20gZW51bSBpbiBucGFwaSBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgdGhlbQorICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBBTlBCaXRtYXBGb3JtYXQgZkZvcm1hdDsKKyAgICAgICAgY29uc3QgY2hhciogICAgIGZOYW1lOworICAgIH0gZ1JlY3NbXSA9IHsKKyAgICAgICAgeyBrVW5rbm93bl9BTlBCaXRtYXBGb3JtYXQsICAgInVua25vd24iIH0sCisgICAgICAgIHsga1JHQkFfODg4OF9BTlBCaXRtYXBGb3JtYXQsICI4ODg4IiB9LAorICAgICAgICB7IGtSR0JfNTY1X0FOUEJpdG1hcEZvcm1hdCwgICAiNTY1IiB9LAorICAgIH07CisKKyAgICBBTlBQaXhlbFBhY2tpbmcgcGFja2luZzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX0NPVU5UKGdSZWNzKTsgaSsrKSB7CisgICAgICAgIGlmIChnQml0bWFwSS5nZXRQaXhlbFBhY2tpbmcoZ1JlY3NbaV0uZkZvcm1hdCwgJnBhY2tpbmcpKSB7CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICJwaXhlbCBmb3JtYXQgWyVkXSAlcyBoYXMgcGFja2luZyBBUkdCIFslZCAlZF0gWyVkICVkXSBbJWQgJWRdIFslZCAlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ1JlY3NbaV0uZkZvcm1hdCwgZ1JlY3NbaV0uZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5BU2hpZnQsIHBhY2tpbmcuQUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5SU2hpZnQsIHBhY2tpbmcuUkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5HU2hpZnQsIHBhY2tpbmcuR0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5CU2hpZnQsIHBhY2tpbmcuQkJpdHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAicGl4ZWwgZm9ybWF0IFslZF0gJXMgaGFzIG5vIHBhY2tpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ1JlY3NbaV0uZkZvcm1hdCwgZ1JlY3NbaV0uZk5hbWUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEJhY2tncm91bmRQbHVnaW46OnRlc3RfYml0bWFwX3RyYW5zcGFyZW5jeShjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgLy8gY2hlY2sgZGVmYXVsdCAmIHNldCB0cmFuc3BhcmVudAorICAgIGlmICghbUZpbmlzaGVkU3RhZ2VPbmUpIHsKKworICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiQkVHSU46IHRlc3RpbmcgYml0bWFwIHRyYW5zcGFyZW5jeSIpOworCisgICAgICAgIC8vY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIG5vdCB0cmFuc3BhcmVudAorICAgICAgICBpZiAoZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAuZm9ybWF0ID09IGtSR0JBXzg4ODhfQU5QQml0bWFwRm9ybWF0KSB7CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiYml0bWFwIGRlZmF1bHQgZm9ybWF0IGlzIHRyYW5zcGFyZW50Iik7CisgICAgICAgIH0KKworICAgICAgICAvL21ha2UgaXQgdHJhbnNwYXJlbnQgKGFueSBub24tbnVsbCB2YWx1ZSB3aWxsIHNldCBpdCB0byB0cnVlKQorICAgICAgICBib29sIHZhbHVlID0gdHJ1ZTsKKyAgICAgICAgTlBFcnJvciBlcnIgPSBicm93c2VyLT5zZXR2YWx1ZShpbnN0YW5jZSwgTlBQVnBsdWdpblRyYW5zcGFyZW50Qm9vbCwgJnZhbHVlKTsKKyAgICAgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIkVycm9yIHNldHRpbmcgdHJhbnNwYXJlbmN5LiIpOworICAgICAgICB9CisKKyAgICAgICAgbUZpbmlzaGVkU3RhZ2VPbmUgPSB0cnVlOworICAgICAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7CisgICAgfQorICAgIC8vIGNoZWNrIHRyYW5zcGFyZW50ICYgc2V0IG9wYXF1ZQorICAgIGVsc2UgaWYgKCFtRmluaXNoZWRTdGFnZVR3bykgeworCisgICAgICAgIC8vY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIHRyYW5zcGFyZW50CisgICAgICAgIGlmIChldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcC5mb3JtYXQgIT0ga1JHQkFfODg4OF9BTlBCaXRtYXBGb3JtYXQpIHsKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJiaXRtYXAgZGlkIG5vdCBjaGFuZ2UgdG8gdHJhbnNwYXJlbnQgZm9ybWF0Iik7CisgICAgICAgIH0KKworICAgICAgICAvL21ha2UgaXQgb3BhcXVlCisgICAgICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdGFuY2UsIE5QUFZwbHVnaW5UcmFuc3BhcmVudEJvb2wsIE5VTEwpOworICAgICAgICBpZiAoZXJyICE9IE5QRVJSX05PX0VSUk9SKSB7CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiRXJyb3Igc2V0dGluZyB0cmFuc3BhcmVuY3kuIik7CisgICAgICAgIH0KKworICAgICAgICBtRmluaXNoZWRTdGFnZVR3byA9IHRydWU7CisgICAgfQorICAgIC8vIGNoZWNrIG9wYXF1ZQorICAgIGVsc2UgaWYgKCFtRmluaXNoZWRTdGFnZVRocmVlKSB7CisKKyAgICAgICAgLy9jaGVjayB0byBtYWtlIHN1cmUgaXQgaXMgbm90IHRyYW5zcGFyZW50CisgICAgICAgIGlmIChldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcC5mb3JtYXQgPT0ga1JHQkFfODg4OF9BTlBCaXRtYXBGb3JtYXQpIHsKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJiaXRtYXAgZGVmYXVsdCBmb3JtYXQgaXMgdHJhbnNwYXJlbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICJFTkQ6IHRlc3RpbmcgYml0bWFwIHRyYW5zcGFyZW5jeSIpOworCisgICAgICAgIG1GaW5pc2hlZFN0YWdlVGhyZWUgPSB0cnVlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRE9NIFRFU1RTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgQmFja2dyb3VuZFBsdWdpbjo6dGVzdF9kb21BY2Nlc3MoKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVGVzdGluZyBET00gQWNjZXNzIiwgaW5zdGFuY2UpOworCisgICAgLy8gR2V0IHRoZSBwbHVnaW4ncyBET00gb2JqZWN0CisgICAgTlBPYmplY3QqIHdpbmRvd09iamVjdCA9IE5VTEw7CisgICAgYnJvd3Nlci0+Z2V0dmFsdWUoaW5zdGFuY2UsIE5QTlZXaW5kb3dOUE9iamVjdCwgJndpbmRvd09iamVjdCk7CisKKyAgICBpZiAoIXdpbmRvd09iamVjdCkKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVW5hYmxlIHRvIHJldHJpZXZlIERPTSBXaW5kb3ciLCBpbnN0YW5jZSk7CisKKyAgICAvLyBSZXRyaWV2ZSBhIHByb3BlcnR5IGZyb20gdGhlIHBsdWdpbidzIERPTSBvYmplY3QKKyAgICBOUElkZW50aWZpZXIgdG9wSWRlbnRpZmllciA9IGJyb3dzZXItPmdldHN0cmluZ2lkZW50aWZpZXIoInRvcCIpOworICAgIE5QVmFyaWFudCB0b3BPYmplY3RWYXJpYW50OworICAgIGJyb3dzZXItPmdldHByb3BlcnR5KGluc3RhbmNlLCB3aW5kb3dPYmplY3QsIHRvcElkZW50aWZpZXIsICZ0b3BPYmplY3RWYXJpYW50KTsKKworICAgIGlmICh0b3BPYmplY3RWYXJpYW50LnR5cGUgIT0gTlBWYXJpYW50VHlwZV9PYmplY3QpCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIEludmFsaWQgVmFyaWFudCB0eXBlIGZvciBET00gUHJvcGVydHk6ICVkLCVkIiwgaW5zdGFuY2UsIHRvcE9iamVjdFZhcmlhbnQudHlwZSwgTlBWYXJpYW50VHlwZV9PYmplY3QpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEpBVkFTQ1JJUFQgVEVTVFMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCit2b2lkIEJhY2tncm91bmRQbHVnaW46OnRlc3RfamF2YXNjcmlwdCgpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBUZXN0aW5nIEphdmFTY3JpcHQgQWNjZXNzIiwgaW5zdGFuY2UpOworCisgICAgLy8gR2V0IHRoZSBwbHVnaW4ncyBET00gb2JqZWN0CisgICAgTlBPYmplY3QqIHdpbmRvd09iamVjdCA9IE5VTEw7CisgICAgYnJvd3Nlci0+Z2V0dmFsdWUoaW5zdGFuY2UsIE5QTlZXaW5kb3dOUE9iamVjdCwgJndpbmRvd09iamVjdCk7CisKKyAgICBpZiAoIXdpbmRvd09iamVjdCkKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVW5hYmxlIHRvIHJldHJpZXZlIERPTSBXaW5kb3ciLCBpbnN0YW5jZSk7CisKKyAgICAvLyBjcmVhdGUgYSBzdHJpbmcgKEpTIGNvZGUpIHRoYXQgaXMgc3RvcmVkIGluIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGJyb3dzZXIKKyAgICBjb25zdCBjaGFyKiBqc1N0cmluZyA9ICIxMjAwICsgMzQiOworICAgIHZvaWQqIHN0cmluZ01lbSA9IGJyb3dzZXItPm1lbWFsbG9jKHN0cmxlbihqc1N0cmluZykpOworICAgIG1lbWNweShzdHJpbmdNZW0sIGpzU3RyaW5nLCBzdHJsZW4oanNTdHJpbmcpKTsKKworICAgIC8vIGV4ZWN1dGUgdGhlIGphdmFzY3JpcHQgaW4gdGhlIHBsdWdpbidzIERPTSBvYmplY3QKKyAgICBOUFN0cmluZyBzY3JpcHQgPSB7IChjaGFyKilzdHJpbmdNZW0sIHN0cmxlbihqc1N0cmluZykgfTsKKyAgICBOUFZhcmlhbnQgc2NyaXB0VmFyaWFudDsKKyAgICBpZiAoIWJyb3dzZXItPmV2YWx1YXRlKGluc3RhbmNlLCB3aW5kb3dPYmplY3QsICZzY3JpcHQsICZzY3JpcHRWYXJpYW50KSkKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVW5hYmxlIHRvIGV2YWwgdGhlIEpTLiIsIGluc3RhbmNlKTsKKworICAgIGlmIChzY3JpcHRWYXJpYW50LnR5cGUgPT0gTlBWYXJpYW50VHlwZV9JbnQzMikgeworICAgICAgICBpZiAoc2NyaXB0VmFyaWFudC52YWx1ZS5pbnRWYWx1ZSAhPSAxMjM0KQorICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgSW52YWxpZCBWYWx1ZSBmb3IgSlMgUmV0dXJuOiAlZCwxMjM0IiwgaW5zdGFuY2UsIHNjcmlwdFZhcmlhbnQudmFsdWUuaW50VmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIEludmFsaWQgVmFyaWFudCB0eXBlIGZvciBKUyBSZXR1cm46ICVkLCVkIiwgaW5zdGFuY2UsIHNjcmlwdFZhcmlhbnQudHlwZSwgTlBWYXJpYW50VHlwZV9JbnQzMik7CisgICAgfQorCisgICAgLy8gZnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCB3aXRoaW4gdGhlIGJyb3dzZXIKKyAgICBicm93c2VyLT5tZW1mcmVlKHN0cmluZ01lbSk7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2JhY2tncm91bmQvQmFja2dyb3VuZFBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDQyOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uaApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorCisjaWZuZGVmIGJhY2tncm91bmRQbHVnaW5fX0RFRklORUQKKyNkZWZpbmUgYmFja2dyb3VuZFBsdWdpbl9fREVGSU5FRAorCitjbGFzcyBCYWNrZ3JvdW5kUGx1Z2luIDogcHVibGljIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgQmFja2dyb3VuZFBsdWdpbihOUFAgaW5zdCk7CisgICAgdmlydHVhbCB+QmFja2dyb3VuZFBsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisKKyAgICAvLyBUaW1lciBUZXN0aW5nIFZhcmlhYmxlcworICAgIHVpbnQzMl90IG1TdGFydFRpbWU7CisgICAgdWludDMyX3QgbVByZXZUaW1lOworICAgIGludCAgICAgIG1UaW1lclJlcGVhdENvdW50OworICAgIGludCAgICAgIG1UaW1lckxhdGVuY3lDb3VudDsKKyAgICBpbnQgICAgICBtVGltZXJMYXRlbmN5Q3VycmVudENvdW50OworCisgICAgLy8gQml0bWFwIFRyYW5zcGFyZW5jeSBWYXJpYWJsZXMKKyAgICBib29sIG1GaW5pc2hlZFN0YWdlT25lOyAgIC8vIGNoZWNrIGRlZmF1bHQgJiBzZXQgdHJhbnNwYXJlbnQKKyAgICBib29sIG1GaW5pc2hlZFN0YWdlVHdvOyAgIC8vIGNoZWNrIHRyYW5zcGFyZW50ICYgc2V0IG9wYXF1ZQorICAgIGJvb2wgbUZpbmlzaGVkU3RhZ2VUaHJlZTsgLy8gY2hlY2sgb3BhcXVlCisKK3ByaXZhdGU6CisgICAgdm9pZCBkcmF3UGx1Z2luKGludCBzdXJmYWNlV2lkdGgsIGludCBzdXJmYWNlSGVpZ2h0KTsKKworICAgIGJvb2wgICAgICAgIG1fc3VyZmFjZVJlYWR5OworICAgIEFOUFN1cmZhY2UqIG1fc3VyZmFjZTsKKworICAgIHZvaWQgdGVzdF9sb2dnaW5nKCk7CisgICAgdm9pZCB0ZXN0X3RpbWVycygpOworICAgIHZvaWQgdGVzdF9iaXRtYXBzKCk7CisgICAgdm9pZCB0ZXN0X2JpdG1hcF90cmFuc3BhcmVuY3koY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdm9pZCB0ZXN0X2RvbUFjY2VzcygpOworICAgIHZvaWQgdGVzdF9qYXZhc2NyaXB0KCk7CisKK307CisKKyNlbmRpZiAvLyBiYWNrZ3JvdW5kUGx1Z2luX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5jcHAgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyZDQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmNwcApAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJGb3JtUGx1Z2luLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgIGdQYWludEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgIGdUeXBlZmFjZUk7CitleHRlcm4gQU5QV2luZG93SW50ZXJmYWNlVjAgICAgIGdXaW5kb3dJOworCisKK3N0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSkgeworICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCBOVUxMKTsKK30KKworc3RhdGljIHVpbnQxNiBybmQxNihmbG9hdCB4LCBpbnQgaW5zZXQpIHsKKyAgICBpbnQgaXggPSAoaW50KXJvdW5kZih4KSArIGluc2V0OworICAgIGlmIChpeCA8IDApIHsKKyAgICAgICAgaXggPSAwOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2PihpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSwgY29uc3QgQU5QUmVjdEYmIHIsIGJvb2wgZG9BQSkgeworICAgIGNvbnN0IGludCBpbnNldCA9IGRvQUEgPyAtMSA6IDA7CisKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICBOUFJlY3QgaW52YWw7CisgICAgaW52YWwubGVmdCA9IHJuZDE2KHIubGVmdCwgaW5zZXQpOworICAgIGludmFsLnRvcCA9IHJuZDE2KHIudG9wLCBpbnNldCk7CisgICAgaW52YWwucmlnaHQgPSBybmQxNihyLnJpZ2h0LCAtaW5zZXQpOworICAgIGludmFsLmJvdHRvbSA9IHJuZDE2KHIuYm90dG9tLCAtaW5zZXQpOworICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCAmaW52YWwpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0Zvcm1QbHVnaW46OkZvcm1QbHVnaW4oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIG1faGFzRm9jdXMgPSBmYWxzZTsKKyAgICBtX2FjdGl2ZUlucHV0ID0gTlVMTDsKKworICAgIG1lbXNldCgmbV91c2VybmFtZUlucHV0LCAwLCBzaXplb2YobV91c2VybmFtZUlucHV0KSk7CisgICAgbWVtc2V0KCZtX3Bhc3N3b3JkSW5wdXQsIDAsIHNpemVvZihtX3Bhc3N3b3JkSW5wdXQpKTsKKworICAgIG1fdXNlcm5hbWVJbnB1dC50ZXh0WzBdID0gJ1wwJzsKKyAgICBtX3VzZXJuYW1lSW5wdXQuY2hhclB0ciA9IDA7CisKKyAgICBtX3Bhc3N3b3JkSW5wdXQudGV4dFswXSA9ICdcMCc7CisgICAgbV9wYXNzd29yZElucHV0LmNoYXJQdHIgPSAwOworCisgICAgbV9wYWludElucHV0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludElucHV0LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRJbnB1dCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50SW5wdXQsIDB4RkZGRkZGRkYpOworCisgICAgbV9wYWludEFjdGl2ZSA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRBY3RpdmUsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludEFjdGl2ZSkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50QWN0aXZlLCAweEZGRkZGRjAwKTsKKworICAgIG1fcGFpbnRUZXh0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludFRleHQsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludFRleHQpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludFRleHQsIDB4RkYwMDAwMDApOworICAgIGdQYWludEkuc2V0VGV4dFNpemUobV9wYWludFRleHQsIDE4KTsKKworICAgIEFOUFR5cGVmYWNlKiB0ZiA9IGdUeXBlZmFjZUkuY3JlYXRlRnJvbU5hbWUoInNlcmlmIiwga0l0YWxpY19BTlBUeXBlZmFjZVN0eWxlKTsKKyAgICBnUGFpbnRJLnNldFR5cGVmYWNlKG1fcGFpbnRUZXh0LCB0Zik7CisgICAgZ1R5cGVmYWNlSS51bnJlZih0Zik7CisKKyAgICAvL3JlZ2lzdGVyIGZvciBrZXkgYW5kIHZpc2libGVSZWN0IGV2ZW50cworICAgIEFOUEV2ZW50RmxhZ3MgZmxhZ3MgPSBrS2V5X0FOUEV2ZW50RmxhZzsKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3QsIGtBY2NlcHRFdmVudHNfQU5QU2V0VmFsdWUsICZmbGFncyk7CisgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICBnTG9nSS5sb2coaW5zdCwga0Vycm9yX0FOUExvZ1R5cGUsICJFcnJvciBzZWxlY3RpbmcgaW5wdXQgZXZlbnRzLiIpOworICAgIH0KK30KKworRm9ybVBsdWdpbjo6fkZvcm1QbHVnaW4oKSB7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50SW5wdXQpOworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludEFjdGl2ZSk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50VGV4dCk7Cit9CisKK2Jvb2wgRm9ybVBsdWdpbjo6c3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsIG1vZGVsKSB7CisgICAgcmV0dXJuIChtb2RlbCA9PSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbCk7Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6ZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApIHsKKyAgICBBTlBDYW52YXMqIGNhbnZhcyA9IGdDYW52YXNJLm5ld0NhbnZhcygmYml0bWFwKTsKKworICAgIEFOUFJlY3RGIGNsaXBSOworICAgIGNsaXBSLmxlZnQgPSBjbGlwLmxlZnQ7CisgICAgY2xpcFIudG9wID0gY2xpcC50b3A7CisgICAgY2xpcFIucmlnaHQgPSBjbGlwLnJpZ2h0OworICAgIGNsaXBSLmJvdHRvbSA9IGNsaXAuYm90dG9tOworICAgIGdDYW52YXNJLmNsaXBSZWN0KGNhbnZhcywgJmNsaXBSKTsKKworICAgIGRyYXcoY2FudmFzKTsKKyAgICBnQ2FudmFzSS5kZWxldGVDYW52YXMoY2FudmFzKTsKK30KKwordm9pZCBGb3JtUGx1Z2luOjpkcmF3KEFOUENhbnZhcyogY2FudmFzKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgIGNvbnN0IGZsb2F0IGlucHV0V2lkdGggPSA2MDsKKyAgICBjb25zdCBmbG9hdCBpbnB1dEhlaWdodCA9IDMwOworICAgIGNvbnN0IGludCBXID0gb2JqLT53aW5kb3ctPndpZHRoOworICAgIGNvbnN0IGludCBIID0gb2JqLT53aW5kb3ctPmhlaWdodDsKKworICAgIC8vIGNvbG9yIHRoZSBwbHVnaW4gY2FudmFzCisgICAgZ0NhbnZhc0kuZHJhd0NvbG9yKGNhbnZhcywgKG1faGFzRm9jdXMpID8gMHhGRkNEQ0RDRCA6IDB4RkY1NDU0NTQpOworCisgICAgLy8gZHJhdyB0aGUgdXNlcm5hbWUgYm94ICg1IHB4IGZyb20gdGhlIHRvcCBlZGdlKQorICAgIG1fdXNlcm5hbWVJbnB1dC5yZWN0LmxlZnQgPSA1OworICAgIG1fdXNlcm5hbWVJbnB1dC5yZWN0LnRvcCA9IDU7CisgICAgbV91c2VybmFtZUlucHV0LnJlY3QucmlnaHQgPSBXIC0gNTsKKyAgICBtX3VzZXJuYW1lSW5wdXQucmVjdC5ib3R0b20gPSBtX3VzZXJuYW1lSW5wdXQucmVjdC50b3AgKyBpbnB1dEhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3VzZXJuYW1lSW5wdXQucmVjdCwgZ2V0UGFpbnQoJm1fdXNlcm5hbWVJbnB1dCkpOworICAgIGRyYXdUZXh0KGNhbnZhcywgbV91c2VybmFtZUlucHV0KTsKKworICAgIC8vIGRyYXcgdGhlIHBhc3N3b3JkIGJveCAoNSBweCBmcm9tIHRoZSBib3R0b20gZWRnZSkKKyAgICBtX3Bhc3N3b3JkSW5wdXQucmVjdC5sZWZ0ID0gNTsKKyAgICBtX3Bhc3N3b3JkSW5wdXQucmVjdC50b3AgPSBIIC0gKGlucHV0SGVpZ2h0ICsgNSk7CisgICAgbV9wYXNzd29yZElucHV0LnJlY3QucmlnaHQgPSBXIC0gNTsKKyAgICBtX3Bhc3N3b3JkSW5wdXQucmVjdC5ib3R0b20gPSBtX3Bhc3N3b3JkSW5wdXQucmVjdC50b3AgKyBpbnB1dEhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3Bhc3N3b3JkSW5wdXQucmVjdCwgZ2V0UGFpbnQoJm1fcGFzc3dvcmRJbnB1dCkpOworICAgIGRyYXdQYXNzd29yZChjYW52YXMsIG1fcGFzc3dvcmRJbnB1dCk7CisKKyAgICAvL2ludmFsaWRhdGUgdGhlIGNhbnZhcworICAgIC8vaW52YWwoaW5zdGFuY2UpOworfQorCitBTlBQYWludCogRm9ybVBsdWdpbjo6Z2V0UGFpbnQoVGV4dElucHV0KiBpbnB1dCkgeworICAgIHJldHVybiAoaW5wdXQgPT0gbV9hY3RpdmVJbnB1dCkgPyBtX3BhaW50QWN0aXZlIDogbV9wYWludElucHV0OworfQorCit2b2lkIEZvcm1QbHVnaW46OmRyYXdUZXh0KEFOUENhbnZhcyogY2FudmFzLCBUZXh0SW5wdXQgdGV4dElucHV0KSB7CisKKyAgICAvLyBnZXQgZm9udCBtZXRyaWNzCisgICAgQU5QRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7CisgICAgZ1BhaW50SS5nZXRGb250TWV0cmljcyhtX3BhaW50VGV4dCwgJmZvbnRNZXRyaWNzKTsKKworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgdGV4dElucHV0LnRleHQsIHRleHRJbnB1dC5jaGFyUHRyLAorICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnB1dC5yZWN0LmxlZnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnB1dC5yZWN0LmJvdHRvbSAtIGZvbnRNZXRyaWNzLmZCb3R0b20sIG1fcGFpbnRUZXh0KTsKK30KKwordm9pZCBGb3JtUGx1Z2luOjpkcmF3UGFzc3dvcmQoQU5QQ2FudmFzKiBjYW52YXMsIFRleHRJbnB1dCBwYXNzd29yZElucHV0KSB7CisKKyAgICAvLyBnZXQgZm9udCBtZXRyaWNzCisgICAgQU5QRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7CisgICAgZ1BhaW50SS5nZXRGb250TWV0cmljcyhtX3BhaW50VGV4dCwgJmZvbnRNZXRyaWNzKTsKKworICAgIC8vIGNvbXB1dCB0aGUgY2lyY2xlIGRpbWVuc2lvbnMgYW5kIGluaXRpYWwgbG9jYXRpb24KKyAgICBmbG9hdCBpbml0aWFsWCA9IHBhc3N3b3JkSW5wdXQucmVjdC5sZWZ0ICsgNTsKKyAgICBmbG9hdCBvdmFsQm90dG9tID0gcGFzc3dvcmRJbnB1dC5yZWN0LmJvdHRvbSAtIDI7CisgICAgZmxvYXQgb3ZhbFRvcCA9IG92YWxCb3R0b20gLSAoZm9udE1ldHJpY3MuZkJvdHRvbSAtIGZvbnRNZXRyaWNzLmZUb3ApOworICAgIGZsb2F0IG92YWxXaWR0aCA9IG92YWxCb3R0b20gLSBvdmFsVG9wOworICAgIGZsb2F0IG92YWxTcGFjaW5nID0gMzsKKworICAgIC8vIGRyYXcgY2lyY2xlcyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgdGV4dAorICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCBwYXNzd29yZElucHV0LmNoYXJQdHI7IHgrKykgeworICAgICAgICBBTlBSZWN0RiBvdmFsOworICAgICAgICBvdmFsLmxlZnQgPSBpbml0aWFsWCArICgob3ZhbFdpZHRoICsgb3ZhbFNwYWNpbmcpICogKGZsb2F0KSB4KTsKKyAgICAgICAgb3ZhbC5yaWdodCA9IG92YWwubGVmdCArIG92YWxXaWR0aDsKKyAgICAgICAgb3ZhbC50b3AgPSBvdmFsVG9wOworICAgICAgICBvdmFsLmJvdHRvbSA9IG92YWxCb3R0b207CisgICAgICAgIGdDYW52YXNJLmRyYXdPdmFsKGNhbnZhcywgJm92YWwsIG1fcGFpbnRUZXh0KTsKKyAgICB9Cit9CisKK2ludDE2IEZvcm1QbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgc3dpdGNoIChldnQtPmRhdGEuZHJhdy5tb2RlbCkgeworICAgICAgICAgICAgICAgIGNhc2Uga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWw6CisgICAgICAgICAgICAgICAgICAgIGRyYXdQbHVnaW4oZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAsIGV2dC0+ZGF0YS5kcmF3LmNsaXApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsgICAvLyB1bmtub3duIGRyYXdpbmcgbW9kZWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga0xpZmVjeWNsZV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmxpZmVjeWNsZS5hY3Rpb24gPT0ga0xvc2VGb2N1c19BTlBMaWZlY3ljbGVBY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSVwIExvb3NpbmcgRm9jdXMiLCBpbnN0YW5jZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobV9hY3RpdmVJbnB1dCkgeworICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBrZXlib2FyZAorICAgICAgICAgICAgICAgICAgICBnV2luZG93SS5zaG93S2V5Ym9hcmQoaW5zdGFuY2UsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAvL3Jlc2V0IHRoZSBhY3RpdmVJbnB1dAorICAgICAgICAgICAgICAgICAgICBtX2FjdGl2ZUlucHV0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtX2hhc0ZvY3VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW52YWwoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LT5kYXRhLmxpZmVjeWNsZS5hY3Rpb24gPT0ga0dhaW5Gb2N1c19BTlBMaWZlY3ljbGVBY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSVwIEdhaW5pbmcgRm9jdXMiLCBpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgbV9oYXNGb2N1cyA9IHRydWU7CisgICAgICAgICAgICAgICAgaW52YWwoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrTW91c2VfQU5QRXZlbnRUeXBlOiB7CisKKyAgICAgICAgICAgIGludCB4ID0gZXZ0LT5kYXRhLm1vdXNlLng7CisgICAgICAgICAgICBpbnQgeSA9IGV2dC0+ZGF0YS5tb3VzZS55OworICAgICAgICAgICAgaWYgKGtEb3duX0FOUE1vdXNlQWN0aW9uID09IGV2dC0+ZGF0YS5tb3VzZS5hY3Rpb24pIHsKKworICAgICAgICAgICAgICAgIFRleHRJbnB1dCogY3VycmVudElucHV0ID0gdmFsaWRUYXAoeCx5KTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5wdXQpCisgICAgICAgICAgICAgICAgICAgIGdXaW5kb3dJLnNob3dLZXlib2FyZChpbnN0YW5jZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9hY3RpdmVJbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgZ1dpbmRvd0kuc2hvd0tleWJvYXJkKGluc3RhbmNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudElucHV0ICE9IG1fYWN0aXZlSW5wdXQpCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaEFjdGl2ZUlucHV0KGN1cnJlbnRJbnB1dCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrS2V5X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGlmIChldnQtPmRhdGEua2V5LmFjdGlvbiA9PSBrRG93bl9BTlBLZXlBY3Rpb24pIHsKKworICAgICAgICAgICAgICAgIC8vaGFuZGxlIG5hdmlnYXRpb24ga2V5cworICAgICAgICAgICAgICAgIGlmIChldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUgPj0ga0RwYWRVcF9BTlBLZXlDb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUgPD0ga0RwYWRDZW50ZXJfQU5QS2V5Q29kZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlTmF2aWdhdGlvbihldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fYWN0aXZlSW5wdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dElucHV0KG1fYWN0aXZlSW5wdXQsIGV2dC0+ZGF0YS5rZXkubmF0aXZlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkudW5pY2hhcik7CisgICAgICAgICAgICAgICAgICAgIGludmFsKGluc3RhbmNlLCBtX2FjdGl2ZUlucHV0LT5yZWN0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6c3dpdGNoQWN0aXZlSW5wdXQoVGV4dElucHV0KiBuZXdJbnB1dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIGlmIChtX2FjdGl2ZUlucHV0KSB7CisgICAgICAgIGludmFsKGluc3RhbmNlLCBtX2FjdGl2ZUlucHV0LT5yZWN0LCB0cnVlKTsgLy8gaW52YWwgdGhlIG9sZAorICAgICAgICBnV2luZG93SS5jbGVhclZpc2libGVSZWN0cyhpbnN0YW5jZSk7CisgICAgfQorCisgICAgbV9hY3RpdmVJbnB1dCA9IG5ld0lucHV0OyAvLyBzZXQgdGhlIG5ldyBhY3RpdmUgaW5wdXQKKworICAgIGlmIChtX2FjdGl2ZUlucHV0KSB7CisgICAgICAgIGludmFsKGluc3RhbmNlLCBtX2FjdGl2ZUlucHV0LT5yZWN0LCB0cnVlKTsgLy8gaW52YWwgdGhlIG5ldworICAgICAgICBzY3JvbGxJbnRvVmlldyhtX2FjdGl2ZUlucHV0KTsKKyAgICB9Cit9CisKK2Jvb2wgRm9ybVBsdWdpbjo6aGFuZGxlTmF2aWdhdGlvbihBTlBLZXlDb2RlIGtleUNvZGUpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSVwIFJlY3ZkIE5hdiBLZXkgJWQiLCBpbnN0YW5jZSwga2V5Q29kZSk7CisKKyAgICBpZiAoIW1fYWN0aXZlSW5wdXQpIHsKKyAgICAgICAgZ1dpbmRvd0kuc2hvd0tleWJvYXJkKGluc3RhbmNlLCB0cnVlKTsKKyAgICAgICAgc3dpdGNoQWN0aXZlSW5wdXQoJm1fdXNlcm5hbWVJbnB1dCk7CisgICAgfQorICAgIGVsc2UgaWYgKG1fYWN0aXZlSW5wdXQgPT0gJm1fdXNlcm5hbWVJbnB1dCkgeworICAgICAgICBpZiAoa2V5Q29kZSA9PSBrRHBhZERvd25fQU5QS2V5Q29kZSkgeworICAgICAgICAgICAgc3dpdGNoQWN0aXZlSW5wdXQoJm1fcGFzc3dvcmRJbnB1dCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoa2V5Q29kZSA9PSBrRHBhZENlbnRlcl9BTlBLZXlDb2RlKQorICAgICAgICAgICAgZ1dpbmRvd0kuc2hvd0tleWJvYXJkKGluc3RhbmNlLCBmYWxzZSk7CisgICAgICAgIGVsc2UgaWYgKGtleUNvZGUgPT0ga0RwYWRVcF9BTlBLZXlDb2RlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmIChtX2FjdGl2ZUlucHV0ID09ICZtX3Bhc3N3b3JkSW5wdXQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0ga0RwYWRVcF9BTlBLZXlDb2RlKSB7CisgICAgICAgICAgICBzd2l0Y2hBY3RpdmVJbnB1dCgmbV91c2VybmFtZUlucHV0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChrZXlDb2RlID09IGtEcGFkQ2VudGVyX0FOUEtleUNvZGUpCisgICAgICAgICAgICBnV2luZG93SS5zaG93S2V5Ym9hcmQoaW5zdGFuY2UsIGZhbHNlKTsKKyAgICAgICAgZWxzZSBpZiAoa2V5Q29kZSA9PSBrRHBhZERvd25fQU5QS2V5Q29kZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGb3JtUGx1Z2luOjpoYW5kbGVUZXh0SW5wdXQoVGV4dElucHV0KiBpbnB1dCwgQU5QS2V5Q29kZSBrZXlDb2RlLCBpbnQzMl90IHVuaWNoYXIpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICAvL21ha2Ugc3VyZSB0aGUgaW5wdXQgZmllbGQgaXMgaW4gdmlldworICAgIHNjcm9sbEludG9WaWV3KGlucHV0KTsKKworICAgIC8vaGFuZGxlIHRoZSBkZWxldGUgb3BlcmF0aW9uCisgICAgaWYgKGtleUNvZGUgPT0ga0RlbF9BTlBLZXlDb2RlKSB7CisgICAgICAgIGlmIChpbnB1dC0+Y2hhclB0ciA+IDApIHsKKyAgICAgICAgICAgIGlucHV0LT5jaGFyUHRyLS07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vY2hlY2sgdG8gc2VlIHRoYXQgdGhlIGlucHV0IGlzIG5vdCBmdWxsCisgICAgaWYgKGlucHV0LT5jaGFyUHRyID49IChzaXplb2YoaW5wdXQtPnRleHQpIC0gMSkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vYWRkIHRoZSBjaGFyYWN0ZXIKKyAgICBpbnB1dC0+dGV4dFtpbnB1dC0+Y2hhclB0cl0gPSBzdGF0aWNfY2FzdDxjaGFyPih1bmljaGFyKTsKKyAgICBpbnB1dC0+Y2hhclB0cisrOworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0lcCBUZXh0OiAgJWMiLCBpbnN0YW5jZSwgdW5pY2hhcik7Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6c2Nyb2xsSW50b1ZpZXcoVGV4dElucHV0KiBpbnB1dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisgICAgTlBXaW5kb3cgKndpbmRvdyA9IG9iai0+d2luZG93OworCisgICAgLy8gZmluZCB0aGUgdGV4dElucHV0J3MgZ2xvYmFsIHJlY3QgY29vcmRpbmF0ZXMKKyAgICBBTlBSZWN0SSB2aXNpYmxlUmVjdHNbMV07CisgICAgdmlzaWJsZVJlY3RzWzBdLmxlZnQgPSBpbnB1dC0+cmVjdC5sZWZ0OworICAgIHZpc2libGVSZWN0c1swXS50b3AgPSBpbnB1dC0+cmVjdC50b3A7CisgICAgdmlzaWJsZVJlY3RzWzBdLnJpZ2h0ID0gaW5wdXQtPnJlY3QucmlnaHQ7CisgICAgdmlzaWJsZVJlY3RzWzBdLmJvdHRvbSA9IGlucHV0LT5yZWN0LmJvdHRvbTsKKworICAgIGdXaW5kb3dJLnNldFZpc2libGVSZWN0cyhpbnN0YW5jZSwgdmlzaWJsZVJlY3RzLCAxKTsKK30KKworVGV4dElucHV0KiBGb3JtUGx1Z2luOjp2YWxpZFRhcChpbnQgeCwgaW50IHkpIHsKKworICAgIGlmICh4ID4gbV91c2VybmFtZUlucHV0LnJlY3QubGVmdCAmJiB4IDwgbV91c2VybmFtZUlucHV0LnJlY3QucmlnaHQgJiYKKyAgICAgICAgeSA+IG1fdXNlcm5hbWVJbnB1dC5yZWN0LnRvcCAmJiB5IDwgbV91c2VybmFtZUlucHV0LnJlY3QuYm90dG9tKQorICAgICAgICByZXR1cm4gJm1fdXNlcm5hbWVJbnB1dDsKKyAgICBlbHNlIGlmICh4ID5tX3Bhc3N3b3JkSW5wdXQucmVjdC5sZWZ0ICYmIHggPCBtX3Bhc3N3b3JkSW5wdXQucmVjdC5yaWdodCAmJgorICAgICAgICAgICAgIHkgPiBtX3Bhc3N3b3JkSW5wdXQucmVjdC50b3AgJiYgeSA8IG1fcGFzc3dvcmRJbnB1dC5yZWN0LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX3Bhc3N3b3JkSW5wdXQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MWZmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisKKyNpZm5kZWYgZm9ybVBsdWdpbl9fREVGSU5FRAorI2RlZmluZSBmb3JtUGx1Z2luX19ERUZJTkVECisKK3N0cnVjdCBUZXh0SW5wdXQgeworICAgIEFOUFJlY3RGICAgIHJlY3Q7CisgICAgY2hhciAgICAgICAgdGV4dFszMF07CisgICAgdWludDMyX3QgICAgY2hhclB0cjsKK307CisKK2NsYXNzIEZvcm1QbHVnaW4gOiBwdWJsaWMgU3ViUGx1Z2luIHsKK3B1YmxpYzoKKyAgICBGb3JtUGx1Z2luKE5QUCBpbnN0KTsKKyAgICB2aXJ0dWFsIH5Gb3JtUGx1Z2luKCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCk7CisgICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKK3ByaXZhdGU6CisgICAgdm9pZCBkcmF3KEFOUENhbnZhcyopOworICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOworCisgICAgYm9vbCAgICAgICAgbV9oYXNGb2N1czsKKworICAgIFRleHRJbnB1dCogIG1fYWN0aXZlSW5wdXQ7CisgICAgVGV4dElucHV0ICAgbV91c2VybmFtZUlucHV0OworICAgIFRleHRJbnB1dCAgIG1fcGFzc3dvcmRJbnB1dDsKKworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRJbnB1dDsKKyAgICBBTlBQYWludCogICBtX3BhaW50QWN0aXZlOworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRUZXh0OworCisgICAgQU5QUmVjdEkgICAgbV92aXNpYmxlUmVjdDsKKworICAgIHZvaWQgZHJhd1RleHQoQU5QQ2FudmFzKiwgVGV4dElucHV0KTsKKyAgICB2b2lkIGRyYXdQYXNzd29yZChBTlBDYW52YXMqLCBUZXh0SW5wdXQpOworCisgICAgYm9vbCBoYW5kbGVOYXZpZ2F0aW9uKEFOUEtleUNvZGUga2V5Q29kZSk7CisgICAgdm9pZCBoYW5kbGVUZXh0SW5wdXQoVGV4dElucHV0KiBpbnB1dCwgQU5QS2V5Q29kZSBrZXlDb2RlLCBpbnQzMl90IHVuaWNoYXIpOworICAgIHZvaWQgc2Nyb2xsSW50b1ZpZXcoVGV4dElucHV0KiBpbnB1dCk7CisgICAgdm9pZCBzd2l0Y2hBY3RpdmVJbnB1dChUZXh0SW5wdXQqIGlucHV0KTsKKworICAgIEFOUFBhaW50KiBnZXRQYWludChUZXh0SW5wdXQqKTsKKyAgICBUZXh0SW5wdXQqIHZhbGlkVGFwKGludCB4LCBpbnQgeSk7CisKK307CisKKyNlbmRpZiAvLyBmb3JtUGx1Z2luX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL21haW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFlYTk1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmNwcApAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJQbHVnaW5PYmplY3QuaCIKKyNpbmNsdWRlICJBbmltYXRpb25QbHVnaW4uaCIKKyNpbmNsdWRlICJBdWRpb1BsdWdpbi5oIgorI2luY2x1ZGUgIkJhY2tncm91bmRQbHVnaW4uaCIKKyNpbmNsdWRlICJGb3JtUGx1Z2luLmgiCisjaW5jbHVkZSAiUGFpbnRQbHVnaW4uaCIKKyNpbmNsdWRlICJhbmRyb2lkX25wYXBpLmgiCisKK05QTmV0c2NhcGVGdW5jcyogYnJvd3NlcjsKKyNkZWZpbmUgRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisKK05QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCisgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpOworTlBFcnJvciBOUFBfRGVzdHJveShOUFAgaW5zdGFuY2UsIE5QU2F2ZWREYXRhKiogc2F2ZSk7CitOUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KTsKK05QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKTsKK05QRXJyb3IgTlBQX0Rlc3Ryb3lTdHJlYW0oTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBOUFJlYXNvbiByZWFzb24pOworaW50MzIgICBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pOworaW50MzIgICBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMiBvZmZzZXQsIGludDMyIGxlbiwKKyAgICAgICAgdm9pZCogYnVmZmVyKTsKK3ZvaWQgICAgTlBQX1N0cmVhbUFzRmlsZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGZuYW1lKTsKK3ZvaWQgICAgTlBQX1ByaW50KE5QUCBpbnN0YW5jZSwgTlBQcmludCogcGxhdGZvcm1QcmludCk7CitpbnQxNiAgIE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KTsKK3ZvaWQgICAgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIFVSTCwgTlBSZWFzb24gcmVhc29uLAorICAgICAgICB2b2lkKiBub3RpZnlEYXRhKTsKK05QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKTsKK05QRXJyb3IgTlBQX1NldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBOVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKTsKKworZXh0ZXJuICJDIiB7CitFWFBPUlQgTlBFcnJvciBOUF9Jbml0aWFsaXplKE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlckZ1bmNzLCBOUFBsdWdpbkZ1bmNzKiBwbHVnaW5GdW5jcywgdm9pZCAqamF2YV9lbnYsIHZvaWQgKmFwcGxpY2F0aW9uX2NvbnRleHQpOworRVhQT1JUIE5QRXJyb3IgTlBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOworRVhQT1JUIGNvbnN0IGNoYXIqIE5QX0dldE1JTUVEZXNjcmlwdGlvbih2b2lkKTsKK0VYUE9SVCB2b2lkIE5QX1NodXRkb3duKHZvaWQpOworfTsKKworQU5QQXVkaW9UcmFja0ludGVyZmFjZVYwICAgIGdTb3VuZEk7CitBTlBCaXRtYXBJbnRlcmZhY2VWMCAgICAgICAgZ0JpdG1hcEk7CitBTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgICAgZ0NhbnZhc0k7CitBTlBMb2dJbnRlcmZhY2VWMCAgICAgICAgICAgZ0xvZ0k7CitBTlBQYWludEludGVyZmFjZVYwICAgICAgICAgZ1BhaW50STsKK0FOUFBhdGhJbnRlcmZhY2VWMCAgICAgICAgICBnUGF0aEk7CitBTlBTdXJmYWNlSW50ZXJmYWNlVjAgICAgICAgZ1N1cmZhY2VJOworQU5QU3lzdGVtSW50ZXJmYWNlVjAgICAgICAgIGdTeXN0ZW1JOworQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgICAgIGdUeXBlZmFjZUk7CitBTlBXaW5kb3dJbnRlcmZhY2VWMCAgICAgICAgZ1dpbmRvd0k7CisKKyNkZWZpbmUgQVJSQVlfQ09VTlQoYXJyYXkpICAgICAgKHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXlbMF0pKQorI2RlZmluZSBERUJVR19QTFVHSU5fRVZFTlRTICAgICAwCisKK05QRXJyb3IgTlBfSW5pdGlhbGl6ZShOUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXJGdW5jcywgTlBQbHVnaW5GdW5jcyogcGx1Z2luRnVuY3MsIHZvaWQgKmphdmFfZW52LCB2b2lkICphcHBsaWNhdGlvbl9jb250ZXh0KQoreworICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZnVuY3Rpb24gdGFibGUgZXF1YWwgb3IgbGFyZ2VyIHRoYW4gd2UgYXJlIGJ1aWx0IGFnYWluc3QuCisgICAgaWYgKGJyb3dzZXJGdW5jcy0+c2l6ZSA8IHNpemVvZihOUE5ldHNjYXBlRnVuY3MpKSB7CisgICAgICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZ1bmN0aW9uIHRhYmxlIChzdHJ1Y3R1cmUpCisgICAgYnJvd3NlciA9IChOUE5ldHNjYXBlRnVuY3MqKSBtYWxsb2Moc2l6ZW9mKE5QTmV0c2NhcGVGdW5jcykpOworICAgIG1lbWNweShicm93c2VyLCBicm93c2VyRnVuY3MsIHNpemVvZihOUE5ldHNjYXBlRnVuY3MpKTsKKworICAgIC8vIEJ1aWxkIHRoZSBwbHVnaW4gZnVuY3Rpb24gdGFibGUKKyAgICBwbHVnaW5GdW5jcy0+dmVyc2lvbiA9IDExOworICAgIHBsdWdpbkZ1bmNzLT5zaXplID0gc2l6ZW9mKHBsdWdpbkZ1bmNzKTsKKyAgICBwbHVnaW5GdW5jcy0+bmV3cCA9IE5QUF9OZXc7CisgICAgcGx1Z2luRnVuY3MtPmRlc3Ryb3kgPSBOUFBfRGVzdHJveTsKKyAgICBwbHVnaW5GdW5jcy0+c2V0d2luZG93ID0gTlBQX1NldFdpbmRvdzsKKyAgICBwbHVnaW5GdW5jcy0+bmV3c3RyZWFtID0gTlBQX05ld1N0cmVhbTsKKyAgICBwbHVnaW5GdW5jcy0+ZGVzdHJveXN0cmVhbSA9IE5QUF9EZXN0cm95U3RyZWFtOworICAgIHBsdWdpbkZ1bmNzLT5hc2ZpbGUgPSBOUFBfU3RyZWFtQXNGaWxlOworICAgIHBsdWdpbkZ1bmNzLT53cml0ZXJlYWR5ID0gTlBQX1dyaXRlUmVhZHk7CisgICAgcGx1Z2luRnVuY3MtPndyaXRlID0gKE5QUF9Xcml0ZVByb2NQdHIpTlBQX1dyaXRlOworICAgIHBsdWdpbkZ1bmNzLT5wcmludCA9IE5QUF9QcmludDsKKyAgICBwbHVnaW5GdW5jcy0+ZXZlbnQgPSBOUFBfSGFuZGxlRXZlbnQ7CisgICAgcGx1Z2luRnVuY3MtPnVybG5vdGlmeSA9IE5QUF9VUkxOb3RpZnk7CisgICAgcGx1Z2luRnVuY3MtPmdldHZhbHVlID0gTlBQX0dldFZhbHVlOworICAgIHBsdWdpbkZ1bmNzLT5zZXR2YWx1ZSA9IE5QUF9TZXRWYWx1ZTsKKworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBOUE5WYXJpYWJsZSAgICAgdjsKKyAgICAgICAgdWludDMyX3QgICAgICAgIHNpemU7CisgICAgICAgIEFOUEludGVyZmFjZSogICBpOworICAgIH0gZ1BhaXJzW10gPSB7CisgICAgICAgIHsga0F1ZGlvVHJhY2tJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICBzaXplb2YoZ1NvdW5kSSksICAgICZnU291bmRJIH0sCisgICAgICAgIHsga0JpdG1hcEludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICBzaXplb2YoZ0JpdG1hcEkpLCAgICZnQml0bWFwSSB9LAorICAgICAgICB7IGtDYW52YXNJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgICAgc2l6ZW9mKGdDYW52YXNJKSwgICAmZ0NhbnZhc0kgfSwKKyAgICAgICAgeyBrTG9nSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgICAgIHNpemVvZihnTG9nSSksICAgICAgJmdMb2dJIH0sCisgICAgICAgIHsga1BhaW50SW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgICBzaXplb2YoZ1BhaW50SSksICAgICZnUGFpbnRJIH0sCisgICAgICAgIHsga1BhdGhJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgICAgICBzaXplb2YoZ1BhdGhJKSwgICAgICZnUGF0aEkgfSwKKyAgICAgICAgeyBrU3VyZmFjZUludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgIHNpemVvZihnU3VyZmFjZUkpLCAgJmdTdXJmYWNlSSB9LAorICAgICAgICB7IGtTeXN0ZW1JbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgICAgc2l6ZW9mKGdTeXN0ZW1JKSwgICAmZ1N5c3RlbUkgfSwKKyAgICAgICAgeyBrVHlwZWZhY2VJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgIHNpemVvZihnVHlwZWZhY2VJKSwgJmdUeXBlZmFjZUkgfSwKKyAgICAgICAgeyBrV2luZG93SW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgIHNpemVvZihnV2luZG93SSksICAgJmdXaW5kb3dJIH0sCisgICAgfTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX0NPVU5UKGdQYWlycyk7IGkrKykgeworICAgICAgICBnUGFpcnNbaV0uaS0+aW5TaXplID0gZ1BhaXJzW2ldLnNpemU7CisgICAgICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+Z2V0dmFsdWUoTlVMTCwgZ1BhaXJzW2ldLnYsIGdQYWlyc1tpXS5pKTsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKK30KKwordm9pZCBOUF9TaHV0ZG93bih2b2lkKQoreworCit9CisKK2NvbnN0IGNoYXIgKk5QX0dldE1JTUVEZXNjcmlwdGlvbih2b2lkKQoreworICAgIHJldHVybiAiYXBwbGljYXRpb24veC10ZXN0YnJvd3NlcnBsdWdpbjp0c3Q6VGVzdCBwbHVnaW4gbWltZXR5cGUgaXMgYXBwbGljYXRpb24veC10ZXN0YnJvd3NlcnBsdWdpbiI7Cit9CisKK05QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCisgICAgICAgICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCkKK3sKKworICAgIC8qIEJFR0lOOiBTVEFOREFSRCBQTFVHSU4gRlJBTUVXT1JLICovCisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSBOVUxMOworCisgICAgLy8gU2NyaXB0aW5nIGZ1bmN0aW9ucyBhcHBlYXJlZCBpbiBOUEFQSSB2ZXJzaW9uIDE0CisgICAgaWYgKGJyb3dzZXItPnZlcnNpb24gPj0gMTQpIHsKKyAgICBpbnN0YW5jZS0+cGRhdGEgPSBicm93c2VyLT5jcmVhdGVvYmplY3QgKGluc3RhbmNlLCBnZXRQbHVnaW5DbGFzcygpKTsKKyAgICBvYmogPSBzdGF0aWNfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOworICAgIGJ6ZXJvKG9iaiwgc2l6ZW9mKCpvYmopKTsKKyAgICB9CisgICAgLyogRU5EOiBTVEFOREFSRCBQTFVHSU4gRlJBTUVXT1JLICovCisKKyAgICAvLyBzZWxlY3QgdGhlIGRyYXdpbmcgbW9kZWwgYmFzZWQgb24gdXNlciBpbnB1dAorICAgIEFOUERyYXdpbmdNb2RlbCBtb2RlbCA9IGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJnbltpXSwgIkRyYXdpbmdNb2RlbCIpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiQml0bWFwIikpIHsKKyAgICAgICAgICAgICAgICBtb2RlbCA9IGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiU3VyZmFjZSIpKSB7CisgICAgICAgICAgICAgICBtb2RlbCA9IGtTdXJmYWNlX0FOUERyYXdpbmdNb2RlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tLS0gJXAgRHJhd2luZ01vZGVsIGlzICVkIiwgaW5zdGFuY2UsIG1vZGVsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbm90aWZ5IHRoZSBwbHVnaW4gQVBJIG9mIHRoZSBkcmF3aW5nIG1vZGVsIHdlIHdpc2ggdG8gdXNlLiBUaGlzIG11c3QgYmUKKyAgICAvLyBkb25lIHByaW9yIHRvIGNyZWF0aW5nIGNlcnRhaW4gc3ViUGx1Z2luIG9iamVjdHMgKGUuZy4gc3VyZmFjZVZpZXdzKQorICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdGFuY2UsIGtSZXF1ZXN0RHJhd2luZ01vZGVsX0FOUFNldFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KG1vZGVsKSk7CisgICAgaWYgKGVycikgeworICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAicmVxdWVzdCBtb2RlbCAlZCBlcnIgJWQiLCBtb2RlbCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBwYXRoID0gZ1N5c3RlbUkuZ2V0QXBwbGljYXRpb25EYXRhRGlyZWN0b3J5KCk7CisgICAgaWYgKHBhdGgpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIkFwcGxpY2F0aW9uIGRhdGEgZGlyIGlzICVzIiwgcGF0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIkNhbid0IGZpbmQgQXBwbGljYXRpb24gZGF0YSBkaXIiKTsKKyAgICB9CisKKyAgICAvLyBzZWxlY3QgdGhlIHBsdWdpblR5cGUKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcChhcmduW2ldLCAiUGx1Z2luVHlwZSIpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiQW5pbWF0aW9uIikpIHsKKyAgICAgICAgICAgICAgICBvYmotPnBsdWdpblR5cGUgPSBrQW5pbWF0aW9uX1BsdWdpblR5cGU7CisgICAgICAgICAgICAgICAgb2JqLT5hY3RpdmVQbHVnaW4gPSBuZXcgQmFsbEFuaW1hdGlvbihpbnN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJBdWRpbyIpKSB7CisgICAgICAgICAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga0F1ZGlvX1BsdWdpblR5cGU7CisgICAgICAgICAgICAgICAgb2JqLT5hY3RpdmVQbHVnaW4gPSBuZXcgQXVkaW9QbHVnaW4oaW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiQmFja2dyb3VuZCIpKSB7CisgICAgICAgICAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga0JhY2tncm91bmRfUGx1Z2luVHlwZTsKKyAgICAgICAgICAgICAgICBvYmotPmFjdGl2ZVBsdWdpbiA9IG5ldyBCYWNrZ3JvdW5kUGx1Z2luKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIkZvcm0iKSkgeworICAgICAgICAgICAgICAgIG9iai0+cGx1Z2luVHlwZSA9IGtGb3JtX1BsdWdpblR5cGU7CisgICAgICAgICAgICAgICAgb2JqLT5hY3RpdmVQbHVnaW4gPSBuZXcgRm9ybVBsdWdpbihpbnN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJQYWludCIpKSB7CisgICAgICAgICAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga1BhaW50X1BsdWdpblR5cGU7CisgICAgICAgICAgICAgICAgb2JqLT5hY3RpdmVQbHVnaW4gPSBuZXcgUGFpbnRQbHVnaW4oaW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0tLSAlcCBQbHVnaW5UeXBlIGlzICVkIiwgaW5zdGFuY2UsIG9iai0+cGx1Z2luVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGlmIG5vIHBsdWdpblR5cGUgaXMgc3BlY2lmaWVkIHRoZW4gZGVmYXVsdCB0byBBbmltYXRpb24KKyAgICBpZiAoIW9iai0+cGx1Z2luVHlwZSkgeworICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLS0tICVwIE5vIFBsdWdpblR5cGUgYXR0cmlidXRlIHdhcyBmb3VuZCIsIGluc3RhbmNlKTsKKyAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga0FuaW1hdGlvbl9QbHVnaW5UeXBlOworICAgICAgICBvYmotPmFjdGl2ZVBsdWdpbiA9IG5ldyBCYWxsQW5pbWF0aW9uKGluc3RhbmNlKTsKKyAgICB9CisKKyAgICAvLyBjaGVjayB0byBlbnN1cmUgdGhlIHBsdWdpblR5cGUgc3VwcG9ydHMgdGhlIG1vZGVsCisgICAgaWYgKCFvYmotPmFjdGl2ZVBsdWdpbi0+c3VwcG9ydHNEcmF3aW5nTW9kZWwobW9kZWwpKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICItLS0tLS0gJXAgVW5zdXBwb3J0ZWQgRHJhd2luZ01vZGVsICglZCkiLCBpbnN0YW5jZSwgbW9kZWwpOworICAgICAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK05QRXJyb3IgTlBQX0Rlc3Ryb3koTlBQIGluc3RhbmNlLCBOUFNhdmVkRGF0YSoqIHNhdmUpCit7CisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOworICAgIGRlbGV0ZSBvYmotPmFjdGl2ZVBsdWdpbjsKKworICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKK30KKworTlBFcnJvciBOUFBfU2V0V2luZG93KE5QUCBpbnN0YW5jZSwgTlBXaW5kb3cqIHdpbmRvdykKK3sKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisKKyAgICAvLyBEbyBub3RoaW5nIGlmIGJyb3dzZXIgZGlkbid0IHN1cHBvcnQgTlBOX0NyZWF0ZU9iamVjdCB3aGljaCB3b3VsZCBoYXZlIGNyZWF0ZWQgdGhlIFBsdWdpbk9iamVjdC4KKyAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgb2JqLT53aW5kb3cgPSB3aW5kb3c7CisgICAgfQorCisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworCisgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworfQorCitOUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2KiBzdHlwZSkKK3sKKyAgICAqc3R5cGUgPSBOUF9BU0ZJTEVPTkxZOworICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKK30KKworTlBFcnJvciBOUFBfRGVzdHJveVN0cmVhbShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIE5QUmVhc29uIHJlYXNvbikKK3sKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK2ludDMyIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSkKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50MzIgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sIHZvaWQqIGJ1ZmZlcikKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpCit7Cit9CisKK3ZvaWQgTlBQX1ByaW50KE5QUCBpbnN0YW5jZSwgTlBQcmludCogcGxhdGZvcm1QcmludCkKK3sKK30KKworaW50MTYgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpCit7CisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSByZWludGVycHJldF9jYXN0PFBsdWdpbk9iamVjdCo+KGluc3RhbmNlLT5wZGF0YSk7CisgICAgY29uc3QgQU5QRXZlbnQqIGV2dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQU5QRXZlbnQqPihldmVudCk7CisKKyNpZiBERUJVR19QTFVHSU5fRVZFTlRTCisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKworICAgICAgICAgICAgaWYgKGV2dC0+ZGF0YS5kcmF3Lm1vZGVsID09IGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsKSB7CisKKyAgICAgICAgICAgICAgICBzdGF0aWMgQU5QQml0bWFwRm9ybWF0IGN1cnJlbnRGb3JtYXQgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAuZm9ybWF0ICE9IGN1cnJlbnRGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEZvcm1hdCA9IGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgRHJhdyAoYml0bWFwKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2xpcD0lZCwlZCwlZCwlZCBmb3JtYXQ9JWQiLCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5kcmF3LmNsaXAubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5kcmF3LmNsaXAudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmRyYXcuY2xpcC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5kcmF3LmNsaXAuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAuZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtLZXlfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgS2V5IGFjdGlvbj0lZCIKKyAgICAgICAgICAgICAgICAgICAgICAiIGNvZGU9JWQgdmNvZGU9JWQgdW5pY2hhcj0lZCByZXBlYXQ9JWQgbW9kcz0leCIsIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkuYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkubmF0aXZlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEua2V5LnZpcnR1YWxDb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkudW5pY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEua2V5LnJlcGVhdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkubW9kaWZpZXJzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga0xpZmVjeWNsZV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBMaWZlY3ljbGUgYWN0aW9uPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGV2dC0+ZGF0YS5saWZlY3ljbGUuYWN0aW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBrVG91Y2hfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgVG91Y2ggYWN0aW9uPSVkIFslZCAlZF0iLAorICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBldnQtPmRhdGEudG91Y2guYWN0aW9uLCBldnQtPmRhdGEudG91Y2gueCwKKyAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEudG91Y2gueSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgIGNhc2Uga01vdXNlX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIE1vdXNlIGFjdGlvbj0lZCBbJWQgJWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgZXZ0LT5kYXRhLm1vdXNlLmFjdGlvbiwgZXZ0LT5kYXRhLm1vdXNlLngsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLm1vdXNlLnkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIGtWaXNpYmxlUmVjdF9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBWaXNpYmxlUmVjdCBbJWQgJWQgJWQgJWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgZXZ0LT5kYXRhLnZpc2libGVSZWN0LnJlY3QubGVmdCwgZXZ0LT5kYXRhLnZpc2libGVSZWN0LnJlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS52aXNpYmxlUmVjdC5yZWN0LnJpZ2h0LCBldnQtPmRhdGEudmlzaWJsZVJlY3QucmVjdC5ib3R0b20pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICItLS0tICVwIFVua25vd24gRXZlbnQgWyVkXSIsCisgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGV2dC0+ZXZlbnRUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisgICAgaWYoIW9iai0+YWN0aXZlUGx1Z2luKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJ0aGUgYWN0aXZlIHBsdWdpbiBpcyBudWxsLiIpOworICAgICAgICByZXR1cm4gMDsgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBvYmotPmFjdGl2ZVBsdWdpbi0+aGFuZGxlRXZlbnQoZXZ0KTsKKyAgICB9Cit9CisKK3ZvaWQgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHVybCwgTlBSZWFzb24gcmVhc29uLCB2b2lkKiBub3RpZnlEYXRhKQoreworCit9CisKK0VYUE9SVCBOUEVycm9yIE5QX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKSB7CisKKyAgICBpZiAodmFyaWFibGUgPT0gTlBQVnBsdWdpbk5hbWVTdHJpbmcpIHsKKyAgICAgICAgY29uc3QgY2hhciAqKnN0ciA9IChjb25zdCBjaGFyICoqKXZhbHVlOworICAgICAgICAqc3RyID0gIlRlc3QgUGx1Z2luIjsKKyAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworICAgIH0KKworICAgIGlmICh2YXJpYWJsZSA9PSBOUFBWcGx1Z2luRGVzY3JpcHRpb25TdHJpbmcpIHsKKyAgICAgICAgY29uc3QgY2hhciAqKnN0ciA9IChjb25zdCBjaGFyICoqKXZhbHVlOworICAgICAgICAqc3RyID0gIkRlc2NyaXB0aW9uIG9mIFRlc3QgUGx1Z2luIjsKKyAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOworfQorCitOUEVycm9yIE5QUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSkKK3sKKyAgICBpZiAodmFyaWFibGUgPT0gTlBQVnBsdWdpblNjcmlwdGFibGVOUE9iamVjdCkgeworICAgICAgICB2b2lkICoqdiA9ICh2b2lkICoqKXZhbHVlOworICAgICAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisKKyAgICAgICAgaWYgKG9iaikKKyAgICAgICAgICAgIGJyb3dzZXItPnJldGFpbm9iamVjdCgoTlBPYmplY3QqKW9iaik7CisKKyAgICAgICAgKnYgPSBvYmo7CisgICAgICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKK30KKworTlBFcnJvciBOUFBfU2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpCit7CisgICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Cit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbWFpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzMjkxMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbWFpbi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bnBhcGkuaD4KKyNpbmNsdWRlIDxucGZ1bmN0aW9ucy5oPgorI2luY2x1ZGUgPG5wcnVudGltZS5oPgorI2luY2x1ZGUgImFuZHJvaWRfbnBhcGkuaCIKKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlcjsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvcGFpbnQvUGFpbnRQbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0ODcwZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvcGFpbnQvUGFpbnRQbHVnaW4uY3BwCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBhaW50UGx1Z2luLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgIGdQYWludEk7CitleHRlcm4gQU5QUGF0aEludGVyZmFjZVYwICAgICAgIGdQYXRoSTsKK2V4dGVybiBBTlBTdXJmYWNlSW50ZXJmYWNlVjAgICAgZ1N1cmZhY2VJOworZXh0ZXJuIEFOUFR5cGVmYWNlSW50ZXJmYWNlVjAgICBnVHlwZWZhY2VJOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhaW50UGx1Z2luOjpQYWludFBsdWdpbihOUFAgaW5zdCkgOiBTdWJQbHVnaW4oaW5zdCkgeworCisgICAgbV9pc1RvdWNoQWN0aXZlID0gZmFsc2U7CisgICAgbV9pc1RvdWNoQ3VycmVudElucHV0ID0gdHJ1ZTsKKyAgICBtX2FjdGl2ZVBhaW50Q29sb3IgPSBzX3JlZENvbG9yOworCisgICAgbWVtc2V0KCZtX2RyYXdpbmdTdXJmYWNlLCAwLCBzaXplb2YobV9kcmF3aW5nU3VyZmFjZSkpOworICAgIG1lbXNldCgmbV9pbnB1dFRvZ2dsZSwgIDAsIHNpemVvZihtX2lucHV0VG9nZ2xlKSk7CisgICAgbWVtc2V0KCZtX2NvbG9yVG9nZ2xlLCAwLCBzaXplb2YobV9jb2xvclRvZ2dsZSkpOworICAgIG1lbXNldCgmbV9jbGVhclN1cmZhY2UsICAwLCBzaXplb2YobV9jbGVhclN1cmZhY2UpKTsKKworICAgIC8vIGluaXRpYWxpemUgdGhlIGRyYXdpbmcgc3VyZmFjZQorICAgIG1fc3VyZmFjZVJlYWR5ID0gZmFsc2U7CisgICAgbV9zdXJmYWNlID0gZ1N1cmZhY2VJLm5ld1Jhc3RlclN1cmZhY2UoaW5zdCwga1JHQkFfODg4OF9BTlBCaXRtYXBGb3JtYXQsIHRydWUpOworICAgIGlmKCFtX3N1cmZhY2UpCisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRXJyb3JfQU5QTG9nVHlwZSwgIi0tLS0lcCBVbmFibGUgdG8gY3JlYXRlIFJHQkEgc3VyZmFjZSIsIGluc3QpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcGF0aAorICAgIG1fdG91Y2hQYXRoID0gZ1BhdGhJLm5ld1BhdGgoKTsKKyAgICBpZighbV90b3VjaFBhdGgpCisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRXJyb3JfQU5QTG9nVHlwZSwgIi0tLS0lcCBVbmFibGUgdG8gY3JlYXRlIHRoZSB0b3VjaCBwYXRoIiwgaW5zdCk7CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSBwYWludCBjb2xvcnMKKyAgICBtX3BhaW50U3VyZmFjZSA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRTdXJmYWNlLCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRTdXJmYWNlKSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRTdXJmYWNlLCAweEZGQzBDMEMwKTsKKyAgICBnUGFpbnRJLnNldFRleHRTaXplKG1fcGFpbnRTdXJmYWNlLCAxOCk7CisKKyAgICBtX3BhaW50QnV0dG9uID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludEJ1dHRvbiwgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50QnV0dG9uKSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRCdXR0b24sIDB4RkZBOEE4QTgpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgdHlwZWZhY2UgKHNldCB0aGUgY29sb3JzKQorICAgIEFOUFR5cGVmYWNlKiB0ZiA9IGdUeXBlZmFjZUkuY3JlYXRlRnJvbU5hbWUoInNlcmlmIiwga0l0YWxpY19BTlBUeXBlZmFjZVN0eWxlKTsKKyAgICBnUGFpbnRJLnNldFR5cGVmYWNlKG1fcGFpbnRTdXJmYWNlLCB0Zik7CisgICAgZ1R5cGVmYWNlSS51bnJlZih0Zik7CisKKyAgICAvL3JlZ2lzdGVyIGZvciB0b3VjaCBldmVudHMKKyAgICBBTlBFdmVudEZsYWdzIGZsYWdzID0ga1RvdWNoX0FOUEV2ZW50RmxhZzsKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3QsIGtBY2NlcHRFdmVudHNfQU5QU2V0VmFsdWUsICZmbGFncyk7CisgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICBnTG9nSS5sb2coaW5zdCwga0Vycm9yX0FOUExvZ1R5cGUsICJFcnJvciBzZWxlY3RpbmcgaW5wdXQgZXZlbnRzLiIpOworICAgIH0KK30KKworUGFpbnRQbHVnaW46On5QYWludFBsdWdpbigpIHsKKyAgICBnU3VyZmFjZUkuZGVsZXRlU3VyZmFjZShtX3N1cmZhY2UpOworICAgIGdQYXRoSS5kZWxldGVQYXRoKG1fdG91Y2hQYXRoKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRTdXJmYWNlKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRCdXR0b24pOworfQorCitib29sIFBhaW50UGx1Z2luOjpzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwgbW9kZWwpIHsKKyAgICByZXR1cm4gKG1vZGVsID09IGtTdXJmYWNlX0FOUERyYXdpbmdNb2RlbCk7Cit9CisKK0FOUENhbnZhcyogUGFpbnRQbHVnaW46OmdldENhbnZhcyhBTlBSZWN0SSogZGlydHlSZWN0KSB7CisKKyAgICBBTlBCaXRtYXAgYml0bWFwOworICAgIGlmICghbV9zdXJmYWNlUmVhZHkgfHwgIWdTdXJmYWNlSS5sb2NrKG1fc3VyZmFjZSwgJmJpdG1hcCwgZGlydHlSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBBTlBDYW52YXMqIGNhbnZhcyA9IGdDYW52YXNJLm5ld0NhbnZhcygmYml0bWFwKTsKKworICAgIC8vIGNsaXAgdGhlIGNhbnZhcyB0byB0aGUgZGlydHkgcmVjdCBiL2MgdGhlIHN1cmZhY2UgaXMgb25seSByZXF1aXJlZCB0bworICAgIC8vIGNvcHkgYSBtaW5pbXVtIG9mIHRoZSBkaXJ0eSByZWN0IGFuZCBtYXkgY29weSBtb3JlLiBUaGUgY2xpcHBlZCBjYW52YXMKKyAgICAvLyBob3dldmVyIHdpbGwgbmV2ZXIgd3JpdGUgdG8gcGl4ZWxzIG91dHNpZGUgb2YgdGhlIGNsaXBwZWQgYXJlYS4KKyAgICBpZiAoZGlydHlSZWN0KSB7CisgICAgICAgIEFOUFJlY3RGIGNsaXBSOworICAgICAgICBjbGlwUi5sZWZ0ID0gZGlydHlSZWN0LT5sZWZ0OworICAgICAgICBjbGlwUi50b3AgPSBkaXJ0eVJlY3QtPnRvcDsKKyAgICAgICAgY2xpcFIucmlnaHQgPSBkaXJ0eVJlY3QtPnJpZ2h0OworICAgICAgICBjbGlwUi5ib3R0b20gPSBkaXJ0eVJlY3QtPmJvdHRvbTsKKyAgICAgICAgZ0NhbnZhc0kuY2xpcFJlY3QoY2FudmFzLCAmY2xpcFIpOworICAgIH0KKworICAgIHJldHVybiBjYW52YXM7Cit9CisKK0FOUENhbnZhcyogUGFpbnRQbHVnaW46OmdldENhbnZhcyhBTlBSZWN0RiogZGlydHlSZWN0KSB7CisKKyAgICBBTlBSZWN0SSBuZXdSZWN0OworICAgIG5ld1JlY3QubGVmdCA9IChpbnQpIGRpcnR5UmVjdC0+bGVmdDsKKyAgICBuZXdSZWN0LnRvcCA9IChpbnQpIGRpcnR5UmVjdC0+dG9wOworICAgIG5ld1JlY3QucmlnaHQgPSAoaW50KSBkaXJ0eVJlY3QtPnJpZ2h0OworICAgIG5ld1JlY3QuYm90dG9tID0gKGludCkgZGlydHlSZWN0LT5ib3R0b207CisKKyAgICByZXR1cm4gZ2V0Q2FudmFzKCZuZXdSZWN0KTsKK30KKwordm9pZCBQYWludFBsdWdpbjo6cmVsZWFzZUNhbnZhcyhBTlBDYW52YXMqIGNhbnZhcykgeworICAgIGdTdXJmYWNlSS51bmxvY2sobV9zdXJmYWNlKTsKKyAgICBnQ2FudmFzSS5kZWxldGVDYW52YXMoY2FudmFzKTsKK30KKwordm9pZCBQYWludFBsdWdpbjo6ZHJhd0NsZWFuUGx1Z2luKEFOUENhbnZhcyogY2FudmFzKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgIC8vIGlmIG5vIGNhbnZhcyBnZXQgYSBsb2NrZWQgY2FudmFzCisgICAgaWYgKCFjYW52YXMpCisgICAgICAgIGNhbnZhcyA9IGdldENhbnZhcygpOworCisgICAgaWYgKCFjYW52YXMpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IGZsb2F0IGJ1dHRvbldpZHRoID0gNjA7CisgICAgY29uc3QgZmxvYXQgYnV0dG9uSGVpZ2h0ID0gMzA7CisgICAgY29uc3QgaW50IFcgPSBvYmotPndpbmRvdy0+d2lkdGg7CisgICAgY29uc3QgaW50IEggPSBvYmotPndpbmRvdy0+aGVpZ2h0OworCisgICAgLy8gY29sb3IgdGhlIHBsdWdpbiBjYW52YXMKKyAgICBnQ2FudmFzSS5kcmF3Q29sb3IoY2FudmFzLCAweEZGQ0RDRENEKTsKKworICAgIC8vIGdldCBmb250IG1ldHJpY3MKKyAgICBBTlBGb250TWV0cmljcyBmb250TWV0cmljczsKKyAgICBnUGFpbnRJLmdldEZvbnRNZXRyaWNzKG1fcGFpbnRTdXJmYWNlLCAmZm9udE1ldHJpY3MpOworCisgICAgLy8gZHJhdyB0aGUgaW5wdXQgdG9nZ2xlIGJ1dHRvbgorICAgIG1faW5wdXRUb2dnbGUubGVmdCA9IDU7CisgICAgbV9pbnB1dFRvZ2dsZS50b3AgPSBIIC0gYnV0dG9uSGVpZ2h0IC0gNTsKKyAgICBtX2lucHV0VG9nZ2xlLnJpZ2h0ID0gbV9pbnB1dFRvZ2dsZS5sZWZ0ICsgYnV0dG9uV2lkdGg7CisgICAgbV9pbnB1dFRvZ2dsZS5ib3R0b20gPSBtX2lucHV0VG9nZ2xlLnRvcCArIGJ1dHRvbkhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX2lucHV0VG9nZ2xlLCBtX3BhaW50QnV0dG9uKTsKKyAgICBjb25zdCBjaGFyKiBpbnB1dFRleHQgPSBtX2lzVG91Y2hDdXJyZW50SW5wdXQgPyAiVG91Y2giIDogIk1vdXNlIjsKKyAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsIGlucHV0VGV4dCwgc3RybGVuKGlucHV0VGV4dCksIG1faW5wdXRUb2dnbGUubGVmdCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgbV9pbnB1dFRvZ2dsZS50b3AgLSBmb250TWV0cmljcy5mVG9wLCBtX3BhaW50U3VyZmFjZSk7CisKKyAgICAvLyBkcmF3IHRoZSBjb2xvciBzZWxlY3RvciBidXR0b24KKyAgICBtX2NvbG9yVG9nZ2xlLmxlZnQgPSAoVy8yKSAtIChidXR0b25XaWR0aC8yKTsKKyAgICBtX2NvbG9yVG9nZ2xlLnRvcCA9IEggLSBidXR0b25IZWlnaHQgLSA1OworICAgIG1fY29sb3JUb2dnbGUucmlnaHQgPSBtX2NvbG9yVG9nZ2xlLmxlZnQgKyBidXR0b25XaWR0aDsKKyAgICBtX2NvbG9yVG9nZ2xlLmJvdHRvbSA9IG1fY29sb3JUb2dnbGUudG9wICsgYnV0dG9uSGVpZ2h0OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fY29sb3JUb2dnbGUsIG1fcGFpbnRCdXR0b24pOworICAgIGNvbnN0IGNoYXIqIGNvbG9yVGV4dCA9IGdldENvbG9yVGV4dCgpOworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgY29sb3JUZXh0LCBzdHJsZW4oY29sb3JUZXh0KSwgbV9jb2xvclRvZ2dsZS5sZWZ0ICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICBtX2NvbG9yVG9nZ2xlLnRvcCAtIGZvbnRNZXRyaWNzLmZUb3AsIG1fcGFpbnRTdXJmYWNlKTsKKworICAgIC8vIGRyYXcgdGhlIGNsZWFyIGNhbnZhcyBidXR0b24KKyAgICBtX2NsZWFyU3VyZmFjZS5sZWZ0ID0gVyAtIGJ1dHRvbldpZHRoIC0gNTsKKyAgICBtX2NsZWFyU3VyZmFjZS50b3AgPSBIIC0gYnV0dG9uSGVpZ2h0IC0gNTsKKyAgICBtX2NsZWFyU3VyZmFjZS5yaWdodCA9IG1fY2xlYXJTdXJmYWNlLmxlZnQgKyBidXR0b25XaWR0aDsKKyAgICBtX2NsZWFyU3VyZmFjZS5ib3R0b20gPSBtX2NsZWFyU3VyZmFjZS50b3AgKyBidXR0b25IZWlnaHQ7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV9jbGVhclN1cmZhY2UsIG1fcGFpbnRCdXR0b24pOworICAgIGNvbnN0IGNoYXIqIGNsZWFyVGV4dCA9ICJDbGVhciI7CisgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCBjbGVhclRleHQsIHN0cmxlbihjbGVhclRleHQpLCBtX2NsZWFyU3VyZmFjZS5sZWZ0ICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICBtX2NsZWFyU3VyZmFjZS50b3AgLSBmb250TWV0cmljcy5mVG9wLCBtX3BhaW50U3VyZmFjZSk7CisKKyAgICAvLyBkcmF3IHRoZSBkcmF3aW5nIHN1cmZhY2UgYm94ICg1IHB4IGZyb20gdGhlIGVkZ2UpCisgICAgbV9kcmF3aW5nU3VyZmFjZS5sZWZ0ID0gNTsKKyAgICBtX2RyYXdpbmdTdXJmYWNlLnRvcCA9IDU7CisgICAgbV9kcmF3aW5nU3VyZmFjZS5yaWdodCA9IFcgLSA1OworICAgIG1fZHJhd2luZ1N1cmZhY2UuYm90dG9tID0gbV9jb2xvclRvZ2dsZS50b3AgLSA1OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fZHJhd2luZ1N1cmZhY2UsIG1fcGFpbnRTdXJmYWNlKTsKKworICAgIC8vIHJlbGVhc2UgdGhlIGNhbnZhcworICAgIHJlbGVhc2VDYW52YXMoY2FudmFzKTsKK30KKworY29uc3QgY2hhciogUGFpbnRQbHVnaW46OmdldENvbG9yVGV4dCgpIHsKKworICAgIGlmIChtX2FjdGl2ZVBhaW50Q29sb3IgPT0gc19ibHVlQ29sb3IpCisgICAgICAgIHJldHVybiAiQmx1ZSI7CisgICAgZWxzZSBpZiAobV9hY3RpdmVQYWludENvbG9yID09IHNfZ3JlZW5Db2xvcikKKyAgICAgICAgcmV0dXJuICJHcmVlbiI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gIlJlZCI7Cit9CisKK2ludDE2IFBhaW50UGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtTdXJmYWNlX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLnN1cmZhY2UuYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrQ3JlYXRlZF9BTlBTdXJmYWNlQWN0aW9uOgorICAgICAgICAgICAgICAgICAgICBtX3N1cmZhY2VSZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGRyYXdDbGVhblBsdWdpbigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBjYXNlIGtEZXN0cm95ZWRfQU5QU3VyZmFjZUFjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbV9zdXJmYWNlUmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgY2FzZSBrQ2hhbmdlZF9BTlBTdXJmYWNlQWN0aW9uOgorICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHBsdWdpbidzIGRpbWVuc2lvbnMgYWNjb3JkaW5nIHRvIHRoZSBET00KKyAgICAgICAgICAgICAgICAgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdCgpLT5wZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHBXID0gb2JqLT53aW5kb3ctPndpZHRoOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcEggPSBvYmotPndpbmRvdy0+aGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHBsdWdpbidzIHN1cmZhY2UgZGltZW5zaW9ucworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc1cgPSBldnQtPmRhdGEuc3VyZmFjZS5kYXRhLmNoYW5nZWQud2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzSCA9IGV2dC0+ZGF0YS5zdXJmYWNlLmRhdGEuY2hhbmdlZC5oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwVyAhPSBzVyB8fCBwSCAhPSBzSCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0KCksIGtFcnJvcl9BTlBMb2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0tJXAgSW52YWxpZCBTdXJmYWNlIERpbWVuc2lvbnMgKCVkLCVkKTooJWQsJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0KCksIHBXLCBwSCwgc1csIHNIKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtUb3VjaF9BTlBFdmVudFR5cGU6IHsKKyAgICAgICAgICAgIGZsb2F0IHggPSAoZmxvYXQpIGV2dC0+ZGF0YS50b3VjaC54OworICAgICAgICAgICAgZmxvYXQgeSA9IChmbG9hdCkgZXZ0LT5kYXRhLnRvdWNoLnk7CisgICAgICAgICAgICBpZiAoa0Rvd25fQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbiAmJiBtX2lzVG91Y2hDdXJyZW50SW5wdXQpIHsKKworICAgICAgICAgICAgICAgIEFOUFJlY3RGKiByZWN0ID0gdmFsaWRUb3VjaChldnQtPmRhdGEudG91Y2gueCwgZXZ0LT5kYXRhLnRvdWNoLnkpOworICAgICAgICAgICAgICAgIGlmKHJlY3QgPT0gJm1fZHJhd2luZ1N1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9pc1RvdWNoQWN0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZ1BhdGhJLm1vdmVUbyhtX3RvdWNoUGF0aCwgeCwgeSk7CisgICAgICAgICAgICAgICAgICAgIHBhaW50VG91Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGtNb3ZlX0FOUFRvdWNoQWN0aW9uID09IGV2dC0+ZGF0YS50b3VjaC5hY3Rpb24gJiYgbV9pc1RvdWNoQWN0aXZlKSB7CisgICAgICAgICAgICAgICAgZ1BhdGhJLmxpbmVUbyhtX3RvdWNoUGF0aCwgeCwgeSk7CisgICAgICAgICAgICAgICAgcGFpbnRUb3VjaCgpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChrVXBfQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbiAmJiBtX2lzVG91Y2hBY3RpdmUpIHsKKyAgICAgICAgICAgICAgICBnUGF0aEkubGluZVRvKG1fdG91Y2hQYXRoLCB4LCB5KTsKKyAgICAgICAgICAgICAgICBwYWludFRvdWNoKCk7CisgICAgICAgICAgICAgICAgbV9pc1RvdWNoQWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZ1BhdGhJLnJlc2V0KG1fdG91Y2hQYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa0NhbmNlbF9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgbV9pc1RvdWNoQWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZ1BhdGhJLnJlc2V0KG1fdG91Y2hQYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrTW91c2VfQU5QRXZlbnRUeXBlOiB7CisKKyAgICAgICAgICAgIGlmIChtX2lzVG91Y2hBY3RpdmUpCisgICAgICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3QoKSwga0Vycm9yX0FOUExvZ1R5cGUsICItLS0tJXAgUmVjZWl2ZWQgdW5pbnRlbmRlZCBtb3VzZSBldmVudCIsIGluc3QoKSk7CisKKyAgICAgICAgICAgIGlmIChrRG93bl9BTlBNb3VzZUFjdGlvbiA9PSBldnQtPmRhdGEubW91c2UuYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgQU5QUmVjdEYqIHJlY3QgPSB2YWxpZFRvdWNoKGV2dC0+ZGF0YS5tb3VzZS54LCBldnQtPmRhdGEubW91c2UueSk7CisgICAgICAgICAgICAgICAgaWYgKHJlY3QgPT0gJm1fZHJhd2luZ1N1cmZhY2UpCisgICAgICAgICAgICAgICAgICAgIHBhaW50TW91c2UoZXZ0LT5kYXRhLm1vdXNlLngsIGV2dC0+ZGF0YS5tb3VzZS55KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWN0ID09ICZtX2lucHV0VG9nZ2xlKQorICAgICAgICAgICAgICAgICAgICB0b2dnbGVJbnB1dE1ldGhvZCgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QgPT0gJm1fY29sb3JUb2dnbGUpCisgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVBhaW50Q29sb3IoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWN0ID09ICZtX2NsZWFyU3VyZmFjZSkKKyAgICAgICAgICAgICAgICAgICAgZHJhd0NsZWFuUGx1Z2luKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CisKK0FOUFJlY3RGKiBQYWludFBsdWdpbjo6dmFsaWRUb3VjaChpbnQgeCwgaW50IHkpIHsKKworICAgIC8vY29udmVydCB0byBmbG9hdAorICAgIGZsb2F0IGZ4ID0gKGludCkgeDsKKyAgICBmbG9hdCBmeSA9IChpbnQpIHk7CisKKyAgICBpZiAoZnggPiBtX2RyYXdpbmdTdXJmYWNlLmxlZnQgJiYgZnggPCBtX2RyYXdpbmdTdXJmYWNlLnJpZ2h0ICYmIGZ5ID4gbV9kcmF3aW5nU3VyZmFjZS50b3AgJiYgZnkgPCBtX2RyYXdpbmdTdXJmYWNlLmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX2RyYXdpbmdTdXJmYWNlOworICAgIGVsc2UgaWYgKGZ4ID4gbV9pbnB1dFRvZ2dsZS5sZWZ0ICYmIGZ4IDwgbV9pbnB1dFRvZ2dsZS5yaWdodCAmJiBmeSA+IG1faW5wdXRUb2dnbGUudG9wICYmIGZ5IDwgbV9pbnB1dFRvZ2dsZS5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9pbnB1dFRvZ2dsZTsKKyAgICBlbHNlIGlmIChmeCA+IG1fY29sb3JUb2dnbGUubGVmdCAmJiBmeCA8IG1fY29sb3JUb2dnbGUucmlnaHQgJiYgZnkgPiBtX2NvbG9yVG9nZ2xlLnRvcCAmJiBmeSA8IG1fY29sb3JUb2dnbGUuYm90dG9tKQorICAgICAgICByZXR1cm4gJm1fY29sb3JUb2dnbGU7CisgICAgZWxzZSBpZiAoZnggPiBtX2NsZWFyU3VyZmFjZS5sZWZ0ICYmIGZ4IDwgbV9jbGVhclN1cmZhY2UucmlnaHQgJiYgZnkgPiBtX2NsZWFyU3VyZmFjZS50b3AgJiYgZnkgPCBtX2NsZWFyU3VyZmFjZS5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9jbGVhclN1cmZhY2U7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBQYWludFBsdWdpbjo6dG9nZ2xlSW5wdXRNZXRob2QoKSB7CisgICAgbV9pc1RvdWNoQ3VycmVudElucHV0ID0gIW1faXNUb3VjaEN1cnJlbnRJbnB1dDsKKworICAgIC8vIGxvY2sgb25seSB0aGUgaW5wdXQgdG9nZ2xlIGFuZCByZWRyYXcgdGhlIGNhbnZhcworICAgIEFOUENhbnZhcyogbG9ja2VkQ2FudmFzID0gZ2V0Q2FudmFzKCZtX2lucHV0VG9nZ2xlKTsKKyAgICBkcmF3Q2xlYW5QbHVnaW4obG9ja2VkQ2FudmFzKTsKK30KKwordm9pZCBQYWludFBsdWdpbjo6dG9nZ2xlUGFpbnRDb2xvcigpIHsKKyAgICBpZiAobV9hY3RpdmVQYWludENvbG9yID09IHNfYmx1ZUNvbG9yKQorICAgICAgICBtX2FjdGl2ZVBhaW50Q29sb3IgPSBzX3JlZENvbG9yOworICAgIGVsc2UgaWYgKG1fYWN0aXZlUGFpbnRDb2xvciA9PSBzX2dyZWVuQ29sb3IpCisgICAgICAgIG1fYWN0aXZlUGFpbnRDb2xvciA9IHNfYmx1ZUNvbG9yOworICAgIGVsc2UKKyAgICAgICAgbV9hY3RpdmVQYWludENvbG9yID0gc19ncmVlbkNvbG9yOworCisgICAgLy8gbG9jayBvbmx5IHRoZSBjb2xvciB0b2dnbGUgYW5kIHJlZHJhdyB0aGUgY2FudmFzCisgICAgQU5QQ2FudmFzKiBsb2NrZWRDYW52YXMgPSBnZXRDYW52YXMoJm1fY29sb3JUb2dnbGUpOworICAgIGRyYXdDbGVhblBsdWdpbihsb2NrZWRDYW52YXMpOworfQorCit2b2lkIFBhaW50UGx1Z2luOjpwYWludE1vdXNlKGludCB4LCBpbnQgeSkgeworICAgIC8vVE9ETyBkbyBub3QgcGFpbnQgb3V0c2lkZSB0aGUgZHJhd2luZyBzdXJmYWNlCisKKyAgICAvL2NyZWF0ZSB0aGUgcGFpbnQgY29sb3IKKyAgICBBTlBQYWludCogZmlsbFBhaW50ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MoZmlsbFBhaW50LCBnUGFpbnRJLmdldEZsYWdzKGZpbGxQYWludCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRTdHlsZShmaWxsUGFpbnQsIGtGaWxsX0FOUFBhaW50U3R5bGUpOworICAgIGdQYWludEkuc2V0Q29sb3IoZmlsbFBhaW50LCBtX2FjdGl2ZVBhaW50Q29sb3IpOworCisgICAgLy8gaGFuZGxlIHRoZSBzaW1wbGUgIm1vdXNlIiBwYWludCAoZHJhdyBhIHBvaW50KQorICAgIEFOUFJlY3RGIHBvaW50OworICAgIHBvaW50LmxlZnQgPSAgIChmbG9hdCkgeC0zOworICAgIHBvaW50LnRvcCA9ICAgIChmbG9hdCkgeS0zOworICAgIHBvaW50LnJpZ2h0ID0gIChmbG9hdCkgeCszOworICAgIHBvaW50LmJvdHRvbSA9IChmbG9hdCkgeSszOworCisgICAgLy8gZ2V0IGEgY2FudmFzIHRoYXQgaXMgb25seSBsb2NrZWQgYXJvdW5kIHRoZSBwb2ludCBhbmQgZHJhdyBpdAorICAgIEFOUENhbnZhcyogY2FudmFzID0gZ2V0Q2FudmFzKCZwb2ludCk7CisgICAgZ0NhbnZhc0kuZHJhd092YWwoY2FudmFzLCAmcG9pbnQsIGZpbGxQYWludCk7CisKKyAgICAvLyBjbGVhbiB1cAorICAgIHJlbGVhc2VDYW52YXMoY2FudmFzKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KGZpbGxQYWludCk7Cit9CisKK3ZvaWQgUGFpbnRQbHVnaW46OnBhaW50VG91Y2goKSB7CisgICAgLy9UT0RPIGRvIG5vdCBwYWludCBvdXRzaWRlIHRoZSBkcmF3aW5nIHN1cmZhY2UKKworICAgIC8vY3JlYXRlIHRoZSBwYWludCBjb2xvcgorICAgIEFOUFBhaW50KiBzdHJva2VQYWludCA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKHN0cm9rZVBhaW50LCBnUGFpbnRJLmdldEZsYWdzKHN0cm9rZVBhaW50KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKHN0cm9rZVBhaW50LCBtX2FjdGl2ZVBhaW50Q29sb3IpOworICAgIGdQYWludEkuc2V0U3R5bGUoc3Ryb2tlUGFpbnQsIGtTdHJva2VfQU5QUGFpbnRTdHlsZSk7CisgICAgZ1BhaW50SS5zZXRTdHJva2VXaWR0aChzdHJva2VQYWludCwgNi4wKTsKKyAgICBnUGFpbnRJLnNldFN0cm9rZUNhcChzdHJva2VQYWludCwga1JvdW5kX0FOUFBhaW50Q2FwKTsKKyAgICBnUGFpbnRJLnNldFN0cm9rZUpvaW4oc3Ryb2tlUGFpbnQsIGtSb3VuZF9BTlBQYWludEpvaW4pOworCisgICAgLy8gaGFuZGxlIHRoZSBjb21wbGV4ICJ0b3VjaCIgcGFpbnQgKGRyYXcgYSBsaW5lKQorICAgIEFOUFJlY3RGIGJvdW5kczsKKyAgICBnUGF0aEkuZ2V0Qm91bmRzKG1fdG91Y2hQYXRoLCAmYm91bmRzKTsKKworICAgIC8vIGdldCBhIGNhbnZhcyB0aGF0IGlzIG9ubHkgbG9ja2VkIGFyb3VuZCB0aGUgcG9pbnQgYW5kIGRyYXcgdGhlIHBhdGgKKyAgICBBTlBDYW52YXMqIGNhbnZhcyA9IGdldENhbnZhcygmYm91bmRzKTsKKyAgICBnQ2FudmFzSS5kcmF3UGF0aChjYW52YXMsIG1fdG91Y2hQYXRoLCBzdHJva2VQYWludCk7CisKKyAgICAvLyBjbGVhbiB1cAorICAgIHJlbGVhc2VDYW52YXMoY2FudmFzKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KHN0cm9rZVBhaW50KTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvcGFpbnQvUGFpbnRQbHVnaW4uaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvcGFpbnQvUGFpbnRQbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTZmMjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBwYWludFBsdWdpbl9fREVGSU5FRAorI2RlZmluZSBwYWludFBsdWdpbl9fREVGSU5FRAorCitjbGFzcyBQYWludFBsdWdpbiA6IHB1YmxpYyBTdWJQbHVnaW4geworcHVibGljOgorICAgIFBhaW50UGx1Z2luKE5QUCBpbnN0KTsKKyAgICB2aXJ0dWFsIH5QYWludFBsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7Citwcml2YXRlOgorICAgIHZvaWQgICAgICAgIGRyYXdDbGVhblBsdWdpbihBTlBDYW52YXMqIGNhbnZhcyA9IE5VTEwpOworICAgIEFOUENhbnZhcyogIGdldENhbnZhcyhBTlBSZWN0SSogZGlydHlSZWN0ID0gTlVMTCk7CisgICAgQU5QQ2FudmFzKiAgZ2V0Q2FudmFzKEFOUFJlY3RGKiBkaXJ0eVJlY3QpOworICAgIGNvbnN0IGNoYXIqIGdldENvbG9yVGV4dCgpOworICAgIHZvaWQgICAgICAgIHBhaW50TW91c2UoaW50IHgsIGludCB5KTsKKyAgICB2b2lkICAgICAgICBwYWludFRvdWNoKCk7CisgICAgdm9pZCAgICAgICAgcmVsZWFzZUNhbnZhcyhBTlBDYW52YXMqKTsKKyAgICB2b2lkICAgICAgICB0b2dnbGVJbnB1dE1ldGhvZCgpOworICAgIHZvaWQgICAgICAgIHRvZ2dsZVBhaW50Q29sb3IoKTsKKyAgICBBTlBSZWN0RiogICB2YWxpZFRvdWNoKGludCB4LCBpbnQgeSk7CisKKyAgICBib29sICAgICAgICBtX2lzVG91Y2hBY3RpdmU7CisgICAgYm9vbCAgICAgICAgbV9pc1RvdWNoQ3VycmVudElucHV0OworICAgIGJvb2wgICAgICAgIG1fc3VyZmFjZVJlYWR5OworCisgICAgQU5QU3VyZmFjZSogbV9zdXJmYWNlOworICAgIEFOUFBhdGgqICAgIG1fdG91Y2hQYXRoOworCisgICAgQU5QUmVjdEYgICAgbV9kcmF3aW5nU3VyZmFjZTsKKyAgICBBTlBSZWN0RiAgICBtX2lucHV0VG9nZ2xlOworICAgIEFOUFJlY3RGICAgIG1fY29sb3JUb2dnbGU7CisgICAgQU5QUmVjdEYgICAgbV9jbGVhclN1cmZhY2U7CisKKyAgICBBTlBQYWludCogICBtX3BhaW50U3VyZmFjZTsKKyAgICBBTlBQYWludCogICBtX3BhaW50QnV0dG9uOworCisgICAgQU5QQ29sb3IgICAgbV9hY3RpdmVQYWludENvbG9yOworICAgIHN0YXRpYyBjb25zdCBBTlBDb2xvciBzX3JlZENvbG9yICAgPSAweEZGRkYwMDAwOworICAgIHN0YXRpYyBjb25zdCBBTlBDb2xvciBzX2dyZWVuQ29sb3IgPSAweEZGMDBGRjAwOworICAgIHN0YXRpYyBjb25zdCBBTlBDb2xvciBzX2JsdWVDb2xvciAgPSAweEZGMDAwMEZGOworfTsKKworI2VuZGlmIC8vIHBhaW50UGx1Z2luX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL2RyYXdhYmxlL3NhbXBsZV9icm93c2VyX3BsdWdpbi5wbmcgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL2RyYXdhYmxlL3NhbXBsZV9icm93c2VyX3BsdWdpbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDdjNzlkMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9yZXMvZHJhd2FibGUvc2FtcGxlX2Jyb3dzZXJfcGx1Z2luLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOGRkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxyZXNvdXJjZXM+CisgICA8c3RyaW5nIG5hbWU9InNhbXBsZV9icm93c2VyX3BsdWdpbiI+U2FtcGxlIEJyb3dzZXIgUGx1Z2luPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL1NhbXBsZVBsdWdpbi5qYXZhIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVwbHVnaW4vU2FtcGxlUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4Y2U5NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL1NhbXBsZVBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlcGx1Z2luOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKKworcHVibGljIGNsYXNzIFNhbXBsZVBsdWdpbiBleHRlbmRzIFNlcnZpY2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L0FuZHJvaWQubWsgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjJjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTIgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHNhbXBsZXMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGaXhlZEdyaWRMYXlvdXQKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2QzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5maXhlZGdyaWRsYXlvdXQiCisgICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgorICAgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5GaXhlZEdyaWRMYXlvdXRUZXN0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+IApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvcmVzL2RyYXdhYmxlL2J1Z2Ryb2lkLnBuZyBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy9kcmF3YWJsZS9idWdkcm9pZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1NDg0YQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy9kcmF3YWJsZS9idWdkcm9pZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvcmVzL2xheW91dC9tYWluLnhtbCBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy9sYXlvdXQvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlMmQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy9sYXlvdXQvbWFpbi54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxjb20uZXhhbXBsZS5hbmRyb2lkLmZpeGVkZ3JpZGxheW91dC5GaXhlZEdyaWRMYXlvdXQKKyAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmV4YW1wbGUuYW5kcm9pZC5maXhlZGdyaWRsYXlvdXQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZ3JpZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgICAgICBhcHA6Y2VsbFdpZHRoPSI4MGRwIgorICAgICAgICBhcHA6Y2VsbEhlaWdodD0iMTAwZHAiCisgICAgICAgID4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2J1Z2Ryb2lkIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYnVnZHJvaWQiCisgICAgICAgIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9idWdkcm9pZCIKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2J1Z2Ryb2lkIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYnVnZHJvaWQiCisgICAgICAgIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9idWdkcm9pZCIKKyAgICAgICAgLz4KKzwvY29tLmV4YW1wbGUuYW5kcm9pZC5maXhlZGdyaWRsYXlvdXQuRml4ZWRHcmlkTGF5b3V0PgorCmRpZmYgLS1naXQgYS9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy92YWx1ZXMvYXR0cnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODdkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMCwwICsxLDcgQEAKKzxyZXNvdXJjZXM+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkZpeGVkR3JpZExheW91dCI+CisgICAgICAgIDxhdHRyIG5hbWU9ImNlbGxXaWR0aCIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImNlbGxIZWlnaHQiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NjNjNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5GaXhlZEdyaWRMYXlvdXRUZXN0PC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2ZpeGVkZ3JpZGxheW91dC9GaXhlZEdyaWRMYXlvdXQuamF2YSBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2ZpeGVkZ3JpZGxheW91dC9GaXhlZEdyaWRMYXlvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTMxNTdmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvZml4ZWRncmlkbGF5b3V0L0ZpeGVkR3JpZExheW91dC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmZpeGVkZ3JpZGxheW91dDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3RGVidWc7CisKKy8qKgorICogQSBsYXlvdXQgdGhhdCBhcnJhbmdlcyBpdHMgY2hpbGRyZW4gaW4gYSBncmlkLiAgVGhlIHNpemUgb2YgdGhlCisgKiBjZWxscyBpcyBzZXQgYnkgdGhlIHtAbGluayAjc2V0Q2VsbFNpemV9IG1ldGhvZCBhbmQgdGhlCisgKiBhbmRyb2lkOmNlbGxfd2lkdGggYW5kIGFuZHJvaWQ6Y2VsbF9oZWlnaHQgYXR0cmlidXRlcyBpbiBYTUwuCisgKiBUaGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaXMgZGV0ZXJtaW5lZCBhdCBydW50aW1lLiAgRWFjaAorICogY2VsbCBjb250YWlucyBleGFjdGx5IG9uZSB2aWV3LCBhbmQgdGhleSBmbG93IGluIHRoZSBuYXR1cmFsCisgKiBjaGlsZCBvcmRlciAodGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZCwgb3IgdGhlIGluZGV4CisgKiBpbiB7QGxpbmsgI2FkZFZpZXdBdH0uICBWaWV3cyBjYW4gbm90IHNwYW4gbXVsdGlwbGUgY2VsbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBGaXhlZEdyaWRMYXlvdXQgZXh0ZW5kcyBWaWV3R3JvdXAgeworICAgIGludCBtQ2VsbFdpZHRoOworICAgIGludCBtQ2VsbEhlaWdodDsKKworICAgIHB1YmxpYyBGaXhlZEdyaWRMYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBGaXhlZEdyaWRMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIC8vIFJlYWQgdGhlIHJlc291cmNlIGF0dHJpYnV0ZXMuCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICBhdHRycywgUi5zdHlsZWFibGUuRml4ZWRHcmlkTGF5b3V0KTsKKyAgICAgICAgbUNlbGxXaWR0aCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkZpeGVkR3JpZExheW91dF9jZWxsV2lkdGgsIC0xKTsKKyAgICAgICAgbUNlbGxIZWlnaHQgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5GaXhlZEdyaWRMYXlvdXRfY2VsbEhlaWdodCwgLTEpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDZWxsV2lkdGgoaW50IHB4KSB7CisgICAgICAgIG1DZWxsV2lkdGggPSBweDsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENlbGxIZWlnaHQoaW50IHB4KSB7CisgICAgICAgIG1DZWxsSGVpZ2h0ID0gcHg7CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgY2VsbFdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhtQ2VsbFdpZHRoLAorICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkFUX01PU1QpOworICAgICAgICBpbnQgY2VsbEhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMobUNlbGxIZWlnaHQsCisgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisKKyAgICAgICAgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpbmRleD0wOyBpbmRleDxjb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaW5kZXgpOworICAgICAgICAgICAgY2hpbGQubWVhc3VyZShjZWxsV2lkdGhTcGVjLCBjZWxsSGVpZ2h0U3BlYyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVXNlIHRoZSBzaXplIG91ciBwYXJlbnRzIGdhdmUgdXMKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24ocmVzb2x2ZVNpemUobUNlbGxXaWR0aCpjb3VudCwgd2lkdGhNZWFzdXJlU3BlYyksCisgICAgICAgICAgICAgICAgcmVzb2x2ZVNpemUobUNlbGxIZWlnaHQqY291bnQsIGhlaWdodE1lYXN1cmVTcGVjKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgY2VsbFdpZHRoID0gbUNlbGxXaWR0aDsKKyAgICAgICAgaW50IGNlbGxIZWlnaHQgPSBtQ2VsbEhlaWdodDsKKyAgICAgICAgaW50IGNvbHVtbnMgPSAociAtIGwpIC8gY2VsbFdpZHRoOworICAgICAgICBpZiAoY29sdW1ucyA8IDApIHsKKyAgICAgICAgICAgIGNvbHVtbnMgPSAxOworICAgICAgICB9CisgICAgICAgIGludCB4ID0gMDsKKyAgICAgICAgaW50IHkgPSAwOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaW5kZXg9MDsgaW5kZXg8Y291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGluZGV4KTsKKworICAgICAgICAgICAgaW50IHcgPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgaCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisKKyAgICAgICAgICAgIGludCBsZWZ0ID0geCArICgoY2VsbFdpZHRoLXcpLzIpOworICAgICAgICAgICAgaW50IHRvcCA9IHkgKyAoKGNlbGxIZWlnaHQtaCkvMik7CisKKyAgICAgICAgICAgIGNoaWxkLmxheW91dChsZWZ0LCB0b3AsIGxlZnQrdywgdG9wK2gpOworICAgICAgICAgICAgaWYgKGkgPj0gKGNvbHVtbnMtMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIG5leHQgcm93CisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgeSArPSBjZWxsSGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgeCArPSBjZWxsV2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2ZpeGVkZ3JpZGxheW91dC9GaXhlZEdyaWRMYXlvdXRUZXN0LmphdmEgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9maXhlZGdyaWRsYXlvdXQvRml4ZWRHcmlkTGF5b3V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzlkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9maXhlZGdyaWRsYXlvdXQvRml4ZWRHcmlkTGF5b3V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5maXhlZGdyaWRsYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworcHVibGljIGNsYXNzIEZpeGVkR3JpZExheW91dFRlc3QgZXh0ZW5kcyBBY3Rpdml0eQoreworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKQorICAgIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7CisKKyAgICAgICAgRml4ZWRHcmlkTGF5b3V0IGdyaWQgPSAoRml4ZWRHcmlkTGF5b3V0KWZpbmRWaWV3QnlJZChSLmlkLmdyaWQpOworICAgICAgICBncmlkLnNldENlbGxXaWR0aCg4MCk7CisgICAgICAgIGdyaWQuc2V0Q2VsbEhlaWdodCg4MCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ib21lL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hvbWUvSG9tZS5qYXZhIGIvc2FtcGxlcy9Ib21lL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hvbWUvSG9tZS5qYXZhCmluZGV4IGMyM2Y3YjguLjdjYWU4N2UgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvSG9tZS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ob21lL0hvbWUuamF2YQorKysgYi9zYW1wbGVzL0hvbWUvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaG9tZS9Ib21lLmphdmEKQEAgLTExMCw2ICsxMTAsOSBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1CbG9ja0FuaW1hdGlvbjsKIAorICAgIHByaXZhdGUgYm9vbGVhbiBtSG9tZURvd247CisgICAgcHJpdmF0ZSBib29sZWFuIG1CYWNrRG93bjsKKyAgICAKICAgICBwcml2YXRlIFZpZXcgbVNob3dBcHBsaWNhdGlvbnM7CiAgICAgcHJpdmF0ZSBDaGVja0JveCBtU2hvd0FwcGxpY2F0aW9uc0NoZWNrOwogCkBAIC0zOTYsMTkgKzM5OSw0NCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKGJvb2xlYW4gaGFzRm9jdXMpIHsKKyAgICAgICAgc3VwZXIub25XaW5kb3dGb2N1c0NoYW5nZWQoaGFzRm9jdXMpOworICAgICAgICBpZiAoIWhhc0ZvY3VzKSB7CisgICAgICAgICAgICBtQmFja0Rvd24gPSBtSG9tZURvd24gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEtleUNvZGUoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9CQUNLOgorICAgICAgICAgICAgICAgICAgICBtQmFja0Rvd24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfSE9NRToKKyAgICAgICAgICAgICAgICAgICAgbUhvbWVEb3duID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEtleUNvZGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9CQUNLOgorICAgICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gQkFDSyBiZWhhdmlvci4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQmFja0Rvd24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfSE9NRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC5pc0NhbmNlbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIEhPTUUgYmVoYXZpb3IuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUhvbWVEb3duID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hLZXlFdmVudChldmVudCk7CiAgICAgfQotCisgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvQW5kcm9pZC5tayBiL3NpbXVsYXRvci9hcHAvQW5kcm9pZC5tawppbmRleCBjNmUxZDE0Li4zY2U3Y2Q1IDEwMDY0NAotLS0gYS9zaW11bGF0b3IvYXBwL0FuZHJvaWQubWsKKysrIGIvc2ltdWxhdG9yL2FwcC9BbmRyb2lkLm1rCkBAIC0yNCwxMiArMjQsMTUgQEAKIAlQaG9uZUNvbGxlY3Rpb24uY3BwIFwKIAlQaG9uZURhdGEuY3BwIFwKIAlQaG9uZVdpbmRvdy5jcHAgXAorCVBpcGUuY3BwIFwKIAlQcmVmZXJlbmNlcy5jcHAgXAogCVByZWZzRGlhbG9nLmNwcCBcCiAJUHJvcGVydHlTZXJ2ZXIuY3BwIFwKIAlTZW1hcGhvcmUuY3BwIFwKIAlTaG1lbS5jcHAgXAotCVVzZXJFdmVudC5jcHAKKwlVc2VyRXZlbnQuY3BwIFwKKwlleGVjdXRhYmxlcGF0aF9saW51eC5jcHAgXAorCXBvcnRlZC5jcHAKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAJbGlidGlueXhtbApkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9Mb2FkYWJsZUltYWdlLmNwcCBiL3NpbXVsYXRvci9hcHAvTG9hZGFibGVJbWFnZS5jcHAKaW5kZXggZTViZDBmMy4uNTEzMTY1YiAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9Mb2FkYWJsZUltYWdlLmNwcAorKysgYi9zaW11bGF0b3IvYXBwL0xvYWRhYmxlSW1hZ2UuY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAiQXNzZXRTdHJlYW0uaCIKICNpbmNsdWRlICJNeUFwcC5oIgogCi0jaW5jbHVkZSA8dXRpbHMuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIApkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9Mb2NhbEJpQ2hhbm5lbC5oIGIvc2ltdWxhdG9yL2FwcC9Mb2NhbEJpQ2hhbm5lbC5oCmluZGV4IGNlMDRiYzAuLmE0ZjRkNjIgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci9hcHAvTG9jYWxCaUNoYW5uZWwuaAorKysgYi9zaW11bGF0b3IvYXBwL0xvY2FsQmlDaGFubmVsLmgKQEAgLTEwLDcgKzEwLDcgQEAKICNlcnJvciBETyBOT1QgVVNFIFRISVMgRklMRSBJTiBUSEUgREVWSUNFIEJVSUxECiAjZW5kaWYKIAotI2luY2x1ZGUgPHV0aWxzL1BpcGUuaD4KKyNpbmNsdWRlICJQaXBlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9NZXNzYWdlU3RyZWFtLmggYi9zaW11bGF0b3IvYXBwL01lc3NhZ2VTdHJlYW0uaAppbmRleCBkZTljMzk4Li44MmE5YjRjIDEwMDY0NAotLS0gYS9zaW11bGF0b3IvYXBwL01lc3NhZ2VTdHJlYW0uaAorKysgYi9zaW11bGF0b3IvYXBwL01lc3NhZ2VTdHJlYW0uaApAQCAtMTcsNyArMTcsNyBAQAogI2Vycm9yIERPIE5PVCBVU0UgVEhJUyBGSUxFIElOIFRIRSBERVZJQ0UgQlVJTEQKICNlbmRpZgogCi0jaW5jbHVkZSA8dXRpbHMvUGlwZS5oPgorI2luY2x1ZGUgIlBpcGUuaCIKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxjdXRpbHMvdWlvLmg+CiAKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvTXlBcHAuY3BwIGIvc2ltdWxhdG9yL2FwcC9NeUFwcC5jcHAKaW5kZXggMzEzZTQ0ZC4uZmQ2MTBiMSAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9NeUFwcC5jcHAKKysrIGIvc2ltdWxhdG9yL2FwcC9NeUFwcC5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2luY2x1ZGUgIk1haW5GcmFtZS5oIgogI2luY2x1ZGUgIk15QXBwLmgiCi0jaW5jbHVkZSA8dXRpbHMvZXhlY3V0YWJsZXBhdGguaD4KKyNpbmNsdWRlICJleGVjdXRhYmxlcGF0aC5oIgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvUGhvbmVDb2xsZWN0aW9uLmNwcCBiL3NpbXVsYXRvci9hcHAvUGhvbmVDb2xsZWN0aW9uLmNwcAppbmRleCA1Y2RkZmE4Li5lMTg4MmNjIDEwMDY0NAotLS0gYS9zaW11bGF0b3IvYXBwL1Bob25lQ29sbGVjdGlvbi5jcHAKKysrIGIvc2ltdWxhdG9yL2FwcC9QaG9uZUNvbGxlY3Rpb24uY3BwCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSAiUGhvbmVEYXRhLmgiCiAjaW5jbHVkZSAiTXlBcHAuaCIKIAotI2luY2x1ZGUgPHV0aWxzLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9QaG9uZURhdGEuY3BwIGIvc2ltdWxhdG9yL2FwcC9QaG9uZURhdGEuY3BwCmluZGV4IDQ4NjE0ZmQuLmYxNWRmMmIgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci9hcHAvUGhvbmVEYXRhLmNwcAorKysgYi9zaW11bGF0b3IvYXBwL1Bob25lRGF0YS5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlICJQaG9uZUNvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJNeUFwcC5oIgogCi0jaW5jbHVkZSA8dXRpbHMuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgogI2luY2x1ZGUgPHV0aWxzL0Fzc2V0TWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIApkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9QaG9uZURhdGEuaCBiL3NpbXVsYXRvci9hcHAvUGhvbmVEYXRhLmgKaW5kZXggYzdmNDczMi4uMmQ3MDAzYSAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9QaG9uZURhdGEuaAorKysgYi9zaW11bGF0b3IvYXBwL1Bob25lRGF0YS5oCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSAiUGhvbmVCdXR0b24uaCIKICNpbmNsdWRlICJMb2FkYWJsZUltYWdlLmgiCiAjaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLSNpbmNsdWRlIDx1dGlscy5oPgorI2luY2x1ZGUgInV0aWxzLmgiCiAKIAogLyoKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvUGlwZS5jcHAgYi9zaW11bGF0b3IvYXBwL1BpcGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Y2U3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW11bGF0b3IvYXBwL1BpcGUuY3BwCkBAIC0wLDAgKzEsNDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8KKy8vIFVuaWRpcmVjdGlvbmFsIHBpcGUuCisvLworCisjaW5jbHVkZSAiUGlwZS5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8ZmNudGwuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjb25zdCB1bnNpZ25lZCBsb25nIGtJbnZhbGlkSGFuZGxlID0gKHVuc2lnbmVkIGxvbmcpIC0xOworCisKKy8qCisgKiBDb25zdHJ1Y3Rvci4gIERvIGxpdHRsZS4KKyAqLworUGlwZTo6UGlwZSh2b2lkKQorICAgIDogbVJlYWROb25CbG9ja2luZyhmYWxzZSksIG1SZWFkSGFuZGxlKGtJbnZhbGlkSGFuZGxlKSwKKyAgICAgIG1Xcml0ZUhhbmRsZShrSW52YWxpZEhhbmRsZSkKK3sKK30KKworLyoKKyAqIERlc3RydWN0b3IuICBVc2UgdGhlIHN5c3RlbS1hcHByb3ByaWF0ZSBjbG9zZSBjYWxsLgorICovCitQaXBlOjp+UGlwZSh2b2lkKQoreworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgaWYgKG1SZWFkSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKSB7CisgICAgICAgIGlmICghQ2xvc2VIYW5kbGUoKEhBTkRMRSltUmVhZEhhbmRsZSkpCisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJwaXBlIiwgImZhaWxlZCBjbG9zaW5nIHJlYWQgaGFuZGxlICglbGQpXG4iLAorICAgICAgICAgICAgICAgIG1SZWFkSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKG1Xcml0ZUhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSkgeworICAgICAgICBGbHVzaEZpbGVCdWZmZXJzKChIQU5ETEUpbVdyaXRlSGFuZGxlKTsKKyAgICAgICAgaWYgKCFDbG9zZUhhbmRsZSgoSEFORExFKW1Xcml0ZUhhbmRsZSkpCisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJwaXBlIiwgImZhaWxlZCBjbG9zaW5nIHdyaXRlIGhhbmRsZSAoJWxkKVxuIiwKKyAgICAgICAgICAgICAgICBtV3JpdGVIYW5kbGUpOworICAgIH0KKyNlbHNlCisgICAgaWYgKG1SZWFkSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKSB7CisgICAgICAgIGlmIChjbG9zZSgoaW50KSBtUmVhZEhhbmRsZSkgIT0gMCkKKyAgICAgICAgICAgIExPRyhMT0dfV0FSTiwgInBpcGUiLCAiZmFpbGVkIGNsb3NpbmcgcmVhZCBmZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgIChpbnQpIG1SZWFkSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKG1Xcml0ZUhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSkgeworICAgICAgICBpZiAoY2xvc2UoKGludCkgbVdyaXRlSGFuZGxlKSAhPSAwKQorICAgICAgICAgICAgTE9HKExPR19XQVJOLCAicGlwZSIsICJmYWlsZWQgY2xvc2luZyB3cml0ZSBmZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgIChpbnQpIG1Xcml0ZUhhbmRsZSk7CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBDcmVhdGUgdGhlIHBpcGUuCisgKgorICogVXNlIHRoZSBQT1NJWCBzdHVmZiBmb3IgZXZlcnl0aGluZyBidXQgV2luZG93cy4KKyAqLworYm9vbCBQaXBlOjpjcmVhdGUodm9pZCkKK3sKKyAgICBhc3NlcnQobVJlYWRIYW5kbGUgPT0ga0ludmFsaWRIYW5kbGUpOworICAgIGFzc2VydChtV3JpdGVIYW5kbGUgPT0ga0ludmFsaWRIYW5kbGUpOworCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICAvKiB3ZSB1c2UgdGhpcyBhY3Jvc3MgcHJvY2Vzc2VzLCBzbyB0aGV5IG5lZWQgdG8gYmUgaW5oZXJpdGFibGUgKi8KKyAgICBIQU5ETEUgaGFuZGxlc1syXTsKKyAgICBTRUNVUklUWV9BVFRSSUJVVEVTIHNhQXR0cjsKKworICAgIHNhQXR0ci5uTGVuZ3RoID0gc2l6ZW9mKFNFQ1VSSVRZX0FUVFJJQlVURVMpOworICAgIHNhQXR0ci5iSW5oZXJpdEhhbmRsZSA9IFRSVUU7CisgICAgc2FBdHRyLmxwU2VjdXJpdHlEZXNjcmlwdG9yID0gTlVMTDsKKworICAgIGlmICghQ3JlYXRlUGlwZSgmaGFuZGxlc1swXSwgJmhhbmRsZXNbMV0sICZzYUF0dHIsIDApKSB7CisgICAgICAgIExPRyhMT0dfRVJST1IsICJwaXBlIiwgInVuYWJsZSB0byBjcmVhdGUgcGlwZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbVJlYWRIYW5kbGUgPSAodW5zaWduZWQgbG9uZykgaGFuZGxlc1swXTsKKyAgICBtV3JpdGVIYW5kbGUgPSAodW5zaWduZWQgbG9uZykgaGFuZGxlc1sxXTsKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgICAgaW50IGZkc1syXTsKKworICAgIGlmIChwaXBlKGZkcykgIT0gMCkgeworICAgICAgICBMT0coTE9HX0VSUk9SLCAicGlwZSIsICJ1bmFibGUgdG8gY3JlYXRlIHBpcGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1SZWFkSGFuZGxlID0gZmRzWzBdOworICAgIG1Xcml0ZUhhbmRsZSA9IGZkc1sxXTsKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfQorCisvKgorICogQ3JlYXRlIGEgImhhbGYgcGlwZSIuICBQbGVhc2UsIG5vIFNlZ3dheSByaWRpbmcuCisgKi8KK2Jvb2wgUGlwZTo6Y3JlYXRlUmVhZGVyKHVuc2lnbmVkIGxvbmcgaGFuZGxlKQoreworICAgIG1SZWFkSGFuZGxlID0gaGFuZGxlOworICAgIGFzc2VydChtV3JpdGVIYW5kbGUgPT0ga0ludmFsaWRIYW5kbGUpOworICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogQ3JlYXRlIGEgImhhbGYgcGlwZSIgZm9yIHdyaXRpbmcuCisgKi8KK2Jvb2wgUGlwZTo6Y3JlYXRlV3JpdGVyKHVuc2lnbmVkIGxvbmcgaGFuZGxlKQoreworICAgIG1Xcml0ZUhhbmRsZSA9IGhhbmRsZTsKKyAgICBhc3NlcnQobVJlYWRIYW5kbGUgPT0ga0ludmFsaWRIYW5kbGUpOworICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUmV0dXJuICJ0cnVlIiBpZiBjcmVhdGUoKSBoYXMgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1bGx5LgorICovCitib29sIFBpcGU6OmlzQ3JlYXRlZCh2b2lkKQoreworICAgIC8vIG9uZSBvciB0aGUgb3RoZXIgc2hvdWxkIGJlIG9wZW4KKyAgICByZXR1cm4gKG1SZWFkSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlIHx8IG1Xcml0ZUhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSk7Cit9CisKKworLyoKKyAqIFJlYWQgZGF0YSBmcm9tIHRoZSBwaXBlLgorICoKKyAqIEZvciBMaW51eCBhbmQgRGFyd2luLCBqdXN0IGNhbGwgcmVhZCgpLiAgRm9yIFdpbmRvd3MsIGltcGxlbWVudAorICogbm9uLWJsb2NraW5nIHJlYWRzIGJ5IGNhbGxpbmcgUGVla05hbWVkUGlwZSBmaXJzdC4KKyAqLworaW50IFBpcGU6OnJlYWQodm9pZCogYnVmLCBpbnQgY291bnQpCit7CisgICAgYXNzZXJ0KG1SZWFkSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKTsKKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgRFdPUkQgdG90YWxCeXRlc0F2YWlsID0gY291bnQ7CisgICAgRFdPUkQgYnl0ZXNSZWFkOworCisgICAgaWYgKG1SZWFkTm9uQmxvY2tpbmcpIHsKKyAgICAgICAgLy8gdXNlIFBlZWtOYW1lZFBpcGUgdG8gYWRqdXN0IHJlYWQgY291bnQgZXhwZWN0YXRpb25zCisgICAgICAgIGlmICghUGVla05hbWVkUGlwZSgoSEFORExFKSBtUmVhZEhhbmRsZSwgTlVMTCwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAmdG90YWxCeXRlc0F2YWlsLCBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgTE9HKExPR19FUlJPUiwgInBpcGUiLCAiUGVla05hbWVkUGlwZSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRvdGFsQnl0ZXNBdmFpbCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFSZWFkRmlsZSgoSEFORExFKSBtUmVhZEhhbmRsZSwgYnVmLCB0b3RhbEJ5dGVzQXZhaWwsICZieXRlc1JlYWQsCisgICAgICAgICAgICBOVUxMKSkKKyAgICB7CisgICAgICAgIERXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0hBTkRMRV9FT0YgfHwgZXJyID09IEVSUk9SX0JST0tFTl9QSVBFKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIExPRyhMT0dfRVJST1IsICJwaXBlIiwgIlJlYWRGaWxlIGZhaWxlZCAoZXJyPSVsZClcbiIsIGVycik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gKGludCkgYnl0ZXNSZWFkOworI2Vsc2UKKyAgICBpbnQgY2M7CisgICAgY2MgPSA6OnJlYWQobVJlYWRIYW5kbGUsIGJ1ZiwgY291bnQpOworICAgIGlmIChjYyA8IDAgJiYgZXJybm8gPT0gRUFHQUlOKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY2M7CisjZW5kaWYKK30KKworLyoKKyAqIFdyaXRlIGRhdGEgdG8gdGhlIHBpcGUuCisgKgorICogUE9TSVggc3lzdGVtcyBhcmUgdHJpdmlhbCwgV2luZG93cyB1c2VzIGEgZGlmZmVyZW50IGNhbGwgYW5kIGRvZXNuJ3QKKyAqIGhhbmRsZSBub24tYmxvY2tpbmcgd3JpdGVzLgorICoKKyAqIElmIHdlIGFkZCBub24tYmxvY2tpbmcgc3VwcG9ydCBoZXJlLCB3ZSBwcm9iYWJseSB3YW50IHRvIG1ha2UgaXQgYW4KKyAqIGFsbC1vci1ub3RoaW5nIHdyaXRlLgorICoKKyAqIERPIE5PVCB1c2UgTE9HKCkgaGVyZSwgd2UgY291bGQgYmUgd3JpdGluZyBhIGxvZyBtZXNzYWdlLgorICovCitpbnQgUGlwZTo6d3JpdGUoY29uc3Qgdm9pZCogYnVmLCBpbnQgY291bnQpCit7CisgICAgYXNzZXJ0KG1Xcml0ZUhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSk7CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIERXT1JEIGJ5dGVzV3JpdHRlbjsKKworICAgIGlmIChtV3JpdGVOb25CbG9ja2luZykgeworICAgICAgICAvLyBCVUc6IGNhbid0IHVzZSBQZWVrTmFtZWRQaXBlKCkgdG8gZ2V0IHRoZSBhbW91bnQgb2Ygc3BhY2UKKyAgICAgICAgLy8gbGVmdC4gIExvb2tzIGxpa2Ugd2UgbmVlZCB0byB1c2UgIm92ZXJsYXBwZWQgSS9PIiBmdW5jdGlvbnMuCisgICAgICAgIC8vIEkganVzdCBkb24ndCBjYXJlIHRoYXQgbXVjaC4KKyAgICB9CisKKyAgICBpZiAoIVdyaXRlRmlsZSgoSEFORExFKSBtV3JpdGVIYW5kbGUsIGJ1ZiwgY291bnQsICZieXRlc1dyaXR0ZW4sIE5VTEwpKSB7CisgICAgICAgIC8vIGNhbid0IExPRywgdXNlIHN0ZGVycgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldyaXRlRmlsZSBmYWlsZWQgKGVycj0lbGQpXG4iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gKGludCkgYnl0ZXNXcml0dGVuOworI2Vsc2UKKyAgICBpbnQgY2M7CisgICAgY2MgPSA6OndyaXRlKG1Xcml0ZUhhbmRsZSwgYnVmLCBjb3VudCk7CisgICAgaWYgKGNjIDwgMCAmJiBlcnJubyA9PSBFQUdBSU4pCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBjYzsKKyNlbmRpZgorfQorCisvKgorICogRmlndXJlIG91dCBpZiB0aGVyZSBpcyBkYXRhIGF2YWlsYWJsZSBvbiB0aGUgcmVhZCBmZC4KKyAqCisgKiBXZSByZXR1cm4gInRydWUiIG9uIGVycm9yIGJlY2F1c2Ugd2Ugd2FudCB0aGUgY2FsbGVyIHRvIHRyeSB0byByZWFkCisgKiBmcm9tIHRoZSBwaXBlLiAgVGhleSdsbCBub3RpY2UgdGhlIHJlYWQgZmFpbHVyZSBhbmQgZG8gc29tZXRoaW5nCisgKiBhcHByb3ByaWF0ZS4KKyAqLworYm9vbCBQaXBlOjpyZWFkUmVhZHkodm9pZCkKK3sKKyAgICBhc3NlcnQobVJlYWRIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpOworCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICBEV09SRCB0b3RhbEJ5dGVzQXZhaWw7CisKKyAgICBpZiAoIVBlZWtOYW1lZFBpcGUoKEhBTkRMRSkgbVJlYWRIYW5kbGUsIE5VTEwsIDAsIE5VTEwsCisgICAgICAgICAgICAmdG90YWxCeXRlc0F2YWlsLCBOVUxMKSkKKyAgICB7CisgICAgICAgIExPRyhMT0dfRVJST1IsICJwaXBlIiwgIlBlZWtOYW1lZFBpcGUgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuICh0b3RhbEJ5dGVzQXZhaWwgIT0gMCk7CisjZWxzZQorICAgIGVycm5vID0gMDsKKyAgICBmZF9zZXQgcmVhZGZkczsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0diA9IHsgMCwgMCB9OworICAgIGludCBjYzsKKworICAgIEZEX1pFUk8oJnJlYWRmZHMpOworICAgIEZEX1NFVChtUmVhZEhhbmRsZSwgJnJlYWRmZHMpOworCisgICAgY2MgPSBzZWxlY3QobVJlYWRIYW5kbGUrMSwgJnJlYWRmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgaWYgKGNjIDwgMCkgeworICAgICAgICBMT0coTE9HX0VSUk9SLCAicGlwZSIsICJzZWxlY3QoKSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGNjID09IDApIHsKKyAgICAgICAgLyogdGltZWQgb3V0LCBub3RoaW5nIGF2YWlsYWJsZSAqLworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChjYyA9PSAxKSB7CisgICAgICAgIC8qIG91ciBmZCBpcyByZWFkeSAqLworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coTE9HX0VSUk9SLCAicGlwZSIsICJIVUg/IHNlbGVjdCgpIHJldHVybmVkID4gMVxuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogRW5hYmxlIG9yIGRpc2FibGUgbm9uLWJsb2NraW5nIG1vZGUgZm9yIHRoZSByZWFkIGRlc2NyaXB0b3IuCisgKgorICogTk9URTogdGhlIGNhbGxzIHN1Y2NlZWQgdW5kZXIgTWFjIE9TIFgsIGJ1dCB0aGUgcGlwZSBkb2Vzbid0IGFwcGVhciB0bworICogYWN0dWFsbHkgYmUgaW4gbm9uLWJsb2NraW5nIG1vZGUuICBJZiB0aGlzIG1hdHRlcnMgLS0gaS5lLiB5b3UncmUgbm90CisgKiB1c2luZyBhIHNlbGVjdCgpIGNhbGwgLS0gcHV0IGEgY2FsbCB0byByZWFkUmVhZHkoKSBpbiBmcm9udCBvZiB0aGUKKyAqIDo6cmVhZCgpIGNhbGwsIHdpdGggYSBQSVBFX05PTkJMT0NLX0JST0tFTiAjaWZkZWYgaW4gdGhlIE1ha2VmaWxlIGZvcgorICogRGFyd2luLgorICovCitib29sIFBpcGU6OnNldFJlYWROb25CbG9ja2luZyhib29sIHZhbCkKK3sKKyAgICBhc3NlcnQobVJlYWRIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpOworCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICAvLyBub3RoaW5nIHRvIGRvCisjZWxzZQorICAgIGludCBmbGFnczsKKworICAgIGlmIChmY250bChtUmVhZEhhbmRsZSwgRl9HRVRGTCwgJmZsYWdzKSA9PSAtMSkgeworICAgICAgICBMT0coTE9HX0VSUk9SLCAicGlwZSIsICJjb3VsZG4ndCBnZXQgZmxhZ3MgZm9yIHBpcGUgcmVhZCBmZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZhbCkKKyAgICAgICAgZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICBlbHNlCisgICAgICAgIGZsYWdzICY9IH4oT19OT05CTE9DSyk7CisgICAgaWYgKGZjbnRsKG1SZWFkSGFuZGxlLCBGX1NFVEZMLCAmZmxhZ3MpID09IC0xKSB7CisgICAgICAgIExPRyhMT0dfRVJST1IsICJwaXBlIiwgImNvdWxkbid0IHNldCBmbGFncyBmb3IgcGlwZSByZWFkIGZkXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorCisgICAgbVJlYWROb25CbG9ja2luZyA9IHZhbDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIEVuYWJsZSBvciBkaXNhYmxlIG5vbi1ibG9ja2luZyBtb2RlIGZvciB0aGUgd3JpdGUgZGVzY3JpcHRvci4KKyAqCisgKiBBcyB3aXRoIHNldFJlYWROb25CbG9ja2luZygpLCB0aGlzIGRvZXMgbm90IHdvcmsgb24gdGhlIE1hYy4KKyAqLworYm9vbCBQaXBlOjpzZXRXcml0ZU5vbkJsb2NraW5nKGJvb2wgdmFsKQoreworICAgIGFzc2VydChtV3JpdGVIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpOworCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICAvLyBub3RoaW5nIHRvIGRvCisjZWxzZQorICAgIGludCBmbGFnczsKKworICAgIGlmIChmY250bChtV3JpdGVIYW5kbGUsIEZfR0VURkwsICZmbGFncykgPT0gLTEpIHsKKyAgICAgICAgTE9HKExPR19XQVJOLCAicGlwZSIsCisgICAgICAgICAgICAiV2FybmluZzogY291bGRuJ3QgZ2V0IGZsYWdzIGZvciBwaXBlIHdyaXRlIGZkIChlcnJubz0lZClcbiIsCisgICAgICAgICAgICBlcnJubyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZhbCkKKyAgICAgICAgZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICBlbHNlCisgICAgICAgIGZsYWdzICY9IH4oT19OT05CTE9DSyk7CisgICAgaWYgKGZjbnRsKG1Xcml0ZUhhbmRsZSwgRl9TRVRGTCwgJmZsYWdzKSA9PSAtMSkgeworICAgICAgICBMT0coTE9HX1dBUk4sICJwaXBlIiwKKyAgICAgICAgICAgICJXYXJuaW5nOiBjb3VsZG4ndCBzZXQgZmxhZ3MgZm9yIHBpcGUgd3JpdGUgZmQgKGVycm5vPSVkKVxuIiwKKyAgICAgICAgICAgIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorCisgICAgbVdyaXRlTm9uQmxvY2tpbmcgPSB2YWw7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBTcGVjaWZ5IHdoZXRoZXIgYSBmaWxlIGRlc2NyaXB0b3IgY2FuIGJlIGluaGVyaXRlZCBieSBhIGNoaWxkIHByb2Nlc3MuCisgKiBVbmRlciBMaW51eCB0aGlzIG1lYW5zIHNldHRpbmcgdGhlIGNsb3NlLW9uLWV4ZWMgZmxhZywgdW5kZXIgV2luZG93cworICogdGhpcyBpcyBTZXRIYW5kbGVJbmZvcm1hdGlvbihIQU5ETEVfRkxBR19JTkhFUklUKS4KKyAqLworYm9vbCBQaXBlOjpkaXNhbGxvd1JlYWRJbmhlcml0KHZvaWQpCit7CisgICAgaWYgKG1SZWFkSGFuZGxlID09IGtJbnZhbGlkSGFuZGxlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIGlmIChTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKSBtUmVhZEhhbmRsZSwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICBpZiAoZmNudGwoKGludCkgbVJlYWRIYW5kbGUsIEZfU0VURkQsIEZEX0NMT0VYRUMpICE9IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorYm9vbCBQaXBlOjpkaXNhbGxvd1dyaXRlSW5oZXJpdCh2b2lkKQoreworICAgIGlmIChtV3JpdGVIYW5kbGUgPT0ga0ludmFsaWRIYW5kbGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgaWYgKFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpIG1Xcml0ZUhhbmRsZSwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICBpZiAoZmNudGwoKGludCkgbVdyaXRlSGFuZGxlLCBGX1NFVEZELCBGRF9DTE9FWEVDKSAhPSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIENsb3NlIHJlYWQgZGVzY3JpcHRvci4KKyAqLworYm9vbCBQaXBlOjpjbG9zZVJlYWQodm9pZCkKK3sKKyAgICBpZiAobVJlYWRIYW5kbGUgPT0ga0ludmFsaWRIYW5kbGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgaWYgKG1SZWFkSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKSB7CisgICAgICAgIGlmICghQ2xvc2VIYW5kbGUoKEhBTkRMRSltUmVhZEhhbmRsZSkpIHsKKyAgICAgICAgICAgIExPRyhMT0dfV0FSTiwgInBpcGUiLCAiZmFpbGVkIGNsb3NpbmcgcmVhZCBoYW5kbGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBpZiAobVJlYWRIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpIHsKKyAgICAgICAgaWYgKGNsb3NlKChpbnQpIG1SZWFkSGFuZGxlKSAhPSAwKSB7CisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJwaXBlIiwgImZhaWxlZCBjbG9zaW5nIHJlYWQgZmRcbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgbVJlYWRIYW5kbGUgPSBrSW52YWxpZEhhbmRsZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIENsb3NlIHdyaXRlIGRlc2NyaXB0b3IuCisgKi8KK2Jvb2wgUGlwZTo6Y2xvc2VXcml0ZSh2b2lkKQoreworICAgIGlmIChtV3JpdGVIYW5kbGUgPT0ga0ludmFsaWRIYW5kbGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgaWYgKG1Xcml0ZUhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSkgeworICAgICAgICBpZiAoIUNsb3NlSGFuZGxlKChIQU5ETEUpbVdyaXRlSGFuZGxlKSkgeworICAgICAgICAgICAgTE9HKExPR19XQVJOLCAicGlwZSIsICJmYWlsZWQgY2xvc2luZyB3cml0ZSBoYW5kbGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBpZiAobVdyaXRlSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKSB7CisgICAgICAgIGlmIChjbG9zZSgoaW50KSBtV3JpdGVIYW5kbGUpICE9IDApIHsKKyAgICAgICAgICAgIExPRyhMT0dfV0FSTiwgInBpcGUiLCAiZmFpbGVkIGNsb3Npbmcgd3JpdGUgZmRcbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgbVdyaXRlSGFuZGxlID0ga0ludmFsaWRIYW5kbGU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBHZXQgdGhlIHJlYWQgaGFuZGxlLgorICovCit1bnNpZ25lZCBsb25nIFBpcGU6OmdldFJlYWRIYW5kbGUodm9pZCkKK3sKKyAgICBhc3NlcnQobVJlYWRIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpOworCisgICAgcmV0dXJuIG1SZWFkSGFuZGxlOworfQorCisvKgorICogR2V0IHRoZSB3cml0ZSBoYW5kbGUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgUGlwZTo6Z2V0V3JpdGVIYW5kbGUodm9pZCkKK3sKKyAgICBhc3NlcnQobVdyaXRlSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKTsKKworICAgIHJldHVybiBtV3JpdGVIYW5kbGU7Cit9CisKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvUGlwZS5oIGIvc2ltdWxhdG9yL2FwcC9QaXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNDE2OAotLS0gL2Rldi9udWxsCisrKyBiL3NpbXVsYXRvci9hcHAvUGlwZS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8KKy8vIEZJRk8gSS9PLgorLy8KKyNpZm5kZWYgX0xJQlNfVVRJTFNfUElQRV9ICisjZGVmaW5lIF9MSUJTX1VUSUxTX1BJUEVfSAorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisjZXJyb3IgRE8gTk9UIFVTRSBUSElTIEZJTEUgSU4gVEhFIERFVklDRSBCVUlMRAorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyAqIFNpbXBsZSBhbm9ueW1vdXMgdW5pZGlyZWN0aW9uYWwgcGlwZS4KKyAqCisgKiBUaGUgcHJpbWFyeSBnb2FsIGlzIHRvIGNyZWF0ZSBhbiBpbXBsZW1lbnRhdGlvbiB3aXRoIG1pbmltYWwgb3ZlcmhlYWQKKyAqIHVuZGVyIExpbnV4LiAgTWFraW5nIFdpbmRvd3MsIE1hYyBPUyBYLCBhbmQgTGludXggYWxsIHdvcmsgdGhlIHNhbWUgd2F5CisgKiBpcyBhIHNlY29uZGFyeSBnb2FsLiAgUGFydCBvZiB0aGlzIGdvYWwgaXMgdG8gaGF2ZSBzb21ldGhpbmcgdGhhdCBjYW4KKyAqIGJlIGZlZCB0byBhIHNlbGVjdCgpIGNhbGwsIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiBzbGVlcCBpbiB0aGUKKyAqIGtlcm5lbCB1bnRpbCBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaGFwcGVucy4KKyAqLworY2xhc3MgUGlwZSB7CitwdWJsaWM6CisgICAgUGlwZSh2b2lkKTsKKyAgICB2aXJ0dWFsIH5QaXBlKHZvaWQpOworCisgICAgLyogQ3JlYXRlIHRoZSBwaXBlICovCisgICAgYm9vbCBjcmVhdGUodm9pZCk7CisKKyAgICAvKiBDcmVhdGUgYSByZWFkLW9ubHkgcGlwZSwgdXNpbmcgdGhlIHN1cHBsaWVkIGhhbmRsZSBhcyByZWFkIGhhbmRsZSAqLworICAgIGJvb2wgY3JlYXRlUmVhZGVyKHVuc2lnbmVkIGxvbmcgaGFuZGxlKTsKKyAgICAvKiBDcmVhdGUgYSB3cml0ZS1vbmx5IHBpcGUsIHVzaW5nIHRoZSBzdXBwbGllZCBoYW5kbGUgYXMgd3JpdGUgaGFuZGxlICovCisgICAgYm9vbCBjcmVhdGVXcml0ZXIodW5zaWduZWQgbG9uZyBoYW5kbGUpOworCisgICAgLyogSXMgdGhpcyBvYmplY3QgcmVhZHkgdG8gZ28/ICovCisgICAgYm9vbCBpc0NyZWF0ZWQodm9pZCk7CisKKyAgICAvKgorICAgICAqIFJlYWQgImNvdW50IiBieXRlcyBmcm9tIHRoZSBwaXBlLiAgUmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgcmVhZCwKKyAgICAgKiBvciAwIGlmIG5vIGRhdGEgYXZhaWxhYmxlIGFuZCB3ZSdyZSBub24tYmxvY2tpbmcuCisgICAgICogUmV0dXJucyAtMSBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBpbnQgcmVhZCh2b2lkKiBidWYsIGludCBjb3VudCk7CisKKyAgICAvKgorICAgICAqIFdyaXRlICJjb3VudCIgYnl0ZXMgaW50byB0aGUgcGlwZS4gIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sCisgICAgICogb3IgMCBpZiB0aGVyZSdzIG5vIHJvb20gZm9yIG1vcmUgZGF0YSBhbmQgd2UncmUgbm9uLWJsb2NraW5nLgorICAgICAqIFJldHVybnMgLTEgb24gZXJyb3IuCisgICAgICovCisgICAgaW50IHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZiwgaW50IGNvdW50KTsKKworICAgIC8qIFJldHVybnMgInRydWUiIGlmIGRhdGEgaXMgYXZhaWxhYmxlIHRvIHJlYWQgKi8KKyAgICBib29sIHJlYWRSZWFkeSh2b2lkKTsKKworICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIG5vbi1ibG9ja2luZyBJL08gZm9yIHJlYWRzICovCisgICAgYm9vbCBzZXRSZWFkTm9uQmxvY2tpbmcoYm9vbCB2YWwpOworICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIG5vbi1ibG9ja2luZyBJL08gZm9yIHdyaXRlcy4gIE9ubHkgd29ya3Mgb24gTGludXguICovCisgICAgYm9vbCBzZXRXcml0ZU5vbkJsb2NraW5nKGJvb2wgdmFsKTsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBoYW5kbGUuICBPbmx5IHVzZWZ1bCBpbiBzb21lIHBsYXRmb3JtLXNwZWNpZmljIHNpdHVhdGlvbnMuCisgICAgICovCisgICAgdW5zaWduZWQgbG9uZyBnZXRSZWFkSGFuZGxlKHZvaWQpOworICAgIHVuc2lnbmVkIGxvbmcgZ2V0V3JpdGVIYW5kbGUodm9pZCk7CisKKyAgICAvKgorICAgICAqIE1vZGlmeSBpbmhlcml0YW5jZSwgaS5lLiB3aGV0aGVyIG9yIG5vdCBhIGNoaWxkIHByb2Nlc3Mgd2lsbCBnZXQKKyAgICAgKiBjb3BpZXMgb2YgdGhlIGRlc2NyaXB0b3JzLiAgU3lzdGVtcyB3aXRoIGZvcmsrZXhlYyBhbGxvdyB1cyB0byBjbG9zZQorICAgICAqIHRoZSBkZXNjcmlwdG9ycyBiZWZvcmUgbGF1bmNoaW5nIHRoZSBjaGlsZCBwcm9jZXNzLCBidXQgV2luMzIKKyAgICAgKiBkb2Vzbid0IGFsbG93IGl0LgorICAgICAqLworICAgIGJvb2wgZGlzYWxsb3dSZWFkSW5oZXJpdCh2b2lkKTsKKyAgICBib29sIGRpc2FsbG93V3JpdGVJbmhlcml0KHZvaWQpOworCisgICAgLyoKKyAgICAgKiBDbG9zZSBvbmUgc2lkZSBvciB0aGUgb3RoZXIuICBVc2VmdWwgaW4gdGhlIHBhcmVudCBhZnRlciBsYXVuY2hpbmcKKyAgICAgKiBhIGNoaWxkIHByb2Nlc3MuCisgICAgICovCisgICAgYm9vbCBjbG9zZVJlYWQodm9pZCk7CisgICAgYm9vbCBjbG9zZVdyaXRlKHZvaWQpOworCitwcml2YXRlOgorICAgIGJvb2wgICAgbVJlYWROb25CbG9ja2luZzsKKyAgICBib29sICAgIG1Xcml0ZU5vbkJsb2NraW5nOworCisgICAgdW5zaWduZWQgbG9uZyBtUmVhZEhhbmRsZTsKKyAgICB1bnNpZ25lZCBsb25nIG1Xcml0ZUhhbmRsZTsKK307CisKK307IC8vIGFuZHJvaWQKKworI2VuZGlmIC8vIF9MSUJTX1VUSUxTX1BJUEVfSApkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9Vc2VyRXZlbnRNZXNzYWdlLmggYi9zaW11bGF0b3IvYXBwL1VzZXJFdmVudE1lc3NhZ2UuaAppbmRleCA0YTY2Y2MyLi45Yjk0ZWE3IDEwMDY0NAotLS0gYS9zaW11bGF0b3IvYXBwL1VzZXJFdmVudE1lc3NhZ2UuaAorKysgYi9zaW11bGF0b3IvYXBwL1VzZXJFdmVudE1lc3NhZ2UuaApAQCAtNiw3ICs2LDcgQEAKICNpZm5kZWYgX1NJTV9VU0VSX0VWRU5UX01FU1NBR0VfSAogI2RlZmluZSBfU0lNX1VTRVJfRVZFTlRfTUVTU0FHRV9ICiAKLSNpbmNsdWRlIDx1dGlscy5oPgorI2luY2x1ZGUgInV0aWxzLmgiCiAjaW5jbHVkZSAiTG9nTWVzc2FnZS5oIgogCiAvKgpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9leGVjdXRhYmxlcGF0aC5oIGIvc2ltdWxhdG9yL2FwcC9leGVjdXRhYmxlcGF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OTk4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW11bGF0b3IvYXBwL2V4ZWN1dGFibGVwYXRoLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1NJTV9FWEVDVVRBQkxFUEFUSF9ICisjZGVmaW5lIF9TSU1fRVhFQ1VUQUJMRVBBVEhfSAorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8vIHJldHVybnMgdGhlIHBhdGggdG8gdGhpcyBleGVjdXRhYmxlCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgordm9pZCBleGVjdXRhYmxlcGF0aChjaGFyIHNbUEFUSF9NQVhdKTsKKworI2VuZGlmIC8vIF9TSU1fRVhFQ1VUQUJMRVBBVEhfSApkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9leGVjdXRhYmxlcGF0aF9kYXJ3aW4uY3BwIGIvc2ltdWxhdG9yL2FwcC9leGVjdXRhYmxlcGF0aF9kYXJ3aW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYzFjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW11bGF0b3IvYXBwL2V4ZWN1dGFibGVwYXRoX2Rhcndpbi5jcHAKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJleGVjdXRhYmxlcGF0aC5oIgorI2ltcG9ydCA8Q2FyYm9uL0NhcmJvbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCit2b2lkIGV4ZWN1dGFibGVwYXRoKGNoYXIgc1tQQVRIX01BWF0pCit7CisgICAgUHJvY2Vzc1NlcmlhbE51bWJlciBwc247CisgICAgR2V0Q3VycmVudFByb2Nlc3MoJnBzbik7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIGRpY3Q7CisgICAgZGljdCA9IFByb2Nlc3NJbmZvcm1hdGlvbkNvcHlEaWN0aW9uYXJ5KCZwc24sIDB4ZmZmZmZmZmYpOworICAgIENGU3RyaW5nUmVmIHZhbHVlID0gKENGU3RyaW5nUmVmKUNGRGljdGlvbmFyeUdldFZhbHVlKGRpY3QsCisgICAgICAgICAgICAgICAgQ0ZTVFIoIkNGQnVuZGxlRXhlY3V0YWJsZSIpKTsKKyAgICBDRlN0cmluZ0dldENTdHJpbmcodmFsdWUsIHMsIFBBVEhfTUFYKzEsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7Cit9CisKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvZXhlY3V0YWJsZXBhdGhfbGludXguY3BwIGIvc2ltdWxhdG9yL2FwcC9leGVjdXRhYmxlcGF0aF9saW51eC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhM2EyYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbXVsYXRvci9hcHAvZXhlY3V0YWJsZXBhdGhfbGludXguY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZXhlY3V0YWJsZXBhdGguaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCit2b2lkIGV4ZWN1dGFibGVwYXRoKGNoYXIgZXhlW1BBVEhfTUFYXSkKK3sKKyAgICBjaGFyIHByb2NbMTAwXTsKKyAgICBzcHJpbnRmKHByb2MsICIvcHJvYy8lZC9leGUiLCBnZXRwaWQoKSk7CisgICAgCisgICAgaW50IGVyciA9IHJlYWRsaW5rKHByb2MsIGV4ZSwgUEFUSF9NQVgpOworfQorCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL3BvcnRlZC5jcHAgYi9zaW11bGF0b3IvYXBwL3BvcnRlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyYjMwMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbXVsYXRvci9hcHAvcG9ydGVkLmNwcApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vCisvLyBQb3J0cyBvZiBzdGFuZGFyZCBmdW5jdGlvbnMgdGhhdCBkb24ndCBleGlzdCBvbiBhIHNwZWNpZmljIHBsYXRmb3JtLgorLy8KKy8vIE5vdGUgdGhlc2UgYXJlIE5PVCBpbiB0aGUgImFuZHJvaWQiIG5hbWVzcGFjZS4KKy8vCisjaW5jbHVkZSAicG9ydGVkLmgiCisKKyNpZiBkZWZpbmVkKE5FRURfR0VUVElNRU9GREFZKSB8fCBkZWZpbmVkKE5FRURfVVNMRUVQKQorIyBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChORUVEX0dFVFRJTUVPRkRBWSkKKy8qCisgKiBSZXBsYWNlbWVudCBnZXR0aW1lb2ZkYXkoKSBmb3IgV2luZG93cyBlbnZpcm9ubWVudHMgKHByaW1hcmlseSBNaW5HVykuCisgKgorICogSWdub3JlcyAidHoiLgorICovCitpbnQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiBwdHYsIHN0cnVjdCB0aW1lem9uZSogdHopCit7CisgICAgbG9uZyBsb25nIG5zVGltZTsgICAvLyB0aW1lIGluIDEwMG5zIHVuaXRzIHNpbmNlIEphbiAxIDE2MDEKKyAgICBGSUxFVElNRSBmdDsKKworICAgIGlmICh0eiAhPSBOVUxMKSB7CisgICAgICAgIC8vIG9oIHdlbGwKKyAgICB9CisKKyAgICA6OkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCZmdCk7CisgICAgbnNUaW1lID0gKGxvbmcgbG9uZykgZnQuZHdIaWdoRGF0ZVRpbWUgPDwgMzIgfAorICAgICAgICAgICAgIChsb25nIGxvbmcpIGZ0LmR3TG93RGF0ZVRpbWU7CisgICAgLy8gY29udmVydCB0byB0aW1lIGluIHVzZWMgc2luY2UgSmFuIDEgMTk3MAorICAgIHB0di0+dHZfdXNlYyA9IChsb25nKSAoKG5zVGltZSAvIDEwTEwpICUgMTAwMDAwMExMKTsKKyAgICBwdHYtPnR2X3NlYyA9IChsb25nKSAoKG5zVGltZSAtIDExNjQ0NDczNjAwMDAwMDAwMExMKSAvIDEwMDAwMDAwTEwpOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoTkVFRF9VU0xFRVApCisvLworLy8gUmVwbGFjZW1lbnQgdXNsZWVwIGZvciBXaW5kb3dzIGVudmlyb25tZW50cyAocHJpbWFyaWx5IE1pbkdXKS4KKy8vCit2b2lkIHVzbGVlcCh1bnNpZ25lZCBsb25nIHVzZWMpCit7CisgICAgLy8gV2luMzIgQVBJIGZ1bmN0aW9uIFNsZWVwKCkgdGFrZXMgbWlsbGlzZWNvbmRzCisgICAgOjpTbGVlcCgodXNlYyArIDUwMCkgLyAxMDAwKTsKK30KKyNlbmRpZgorCisjaWYgMCAvL2RlZmluZWQoTkVFRF9QSVBFKQorLy8KKy8vIFJlcGxhY2VtZW50IHBpcGUoKSBjb21tYW5kIGZvciBNaW5HVworLy8KKy8vIFRoZSBfT19OT0lOSEVSSVQgZmxhZyBzZXRzIGJJbmhlcml0SGFuZGxlIHRvIEZBTFNFIGluIHRoZQorLy8gU2VjdXJpdHlBdHRyaWJ1dGVzIGFyZ3VtZW50IHRvIENyZWF0ZVBpcGUoKS4gIFRoaXMgbWVhbnMgdGhlIGhhbmRsZXMKKy8vIGFyZW4ndCBpbmhlcml0ZWQgd2hlbiBhIG5ldyBwcm9jZXNzIGlzIGNyZWF0ZWQuICBUaGUgZXhhbXBsZXMgSSd2ZSBzZWVuCisvLyB1c2UgaXQsIHBvc3NpYmx5IGJlY2F1c2UgdGhlcmUncyBhIGxvdCBvZiBqdW5rIGdvaW5nIG9uIGJlaGluZCB0aGUKKy8vIHNjZW5lcy4gIChJJ20gYXNzdW1pbmcgInByb2Nlc3MiIGFuZCAidGhyZWFkIiBhcmUgZGlmZmVyZW50IGhlcmUsIHNvCisvLyB3ZSBzaG91bGQgYmUgb2theSBzcGlubmluZyB1cCBhIHRocmVhZC4pICBUaGUgcmVjb21tZW5kZWQgcHJhY3RpY2UgaXMKKy8vIHRvIGR1cCgpIHRoZSBkZXNjcmlwdG9yIHlvdSB3YW50IHRoZSBjaGlsZCB0byBoYXZlLgorLy8KKy8vIEl0IGFwcGVhcnMgdGhhdCB1bm5hbWVkIHBpcGVzIGNhbid0IGRvIG5vbi1ibG9ja2luZyAoIm92ZXJsYXBwZWQiKSBJL08uCisvLyBZb3UgY2FuJ3QgdXNlIHNlbGVjdCgpIGVpdGhlciwgc2luY2UgdGhhdCBvbmx5IHdvcmtzIG9uIHNvY2tldHMuICBUaGUKKy8vIFdpbmRvd3MgQVBJIGNhbGxzIHRoYXQgYXJlIHVzZWZ1bCBoZXJlIGFsbCBvcGVyYXRlIG9uIGEgSEFORExFLCBub3QKKy8vIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yLCBhbmQgSSBkb24ndCB0aGluayB5b3UgY2FuIGdldCB0aGVyZSBmcm9tCisvLyBoZXJlLiAgVGhlICJuYW1lZCBwaXBlIiBzdHVmZiBpcyBpbnNhbmUuCisvLworaW50IHBpcGUoaW50IGZpbGVkZXNbMl0pCit7CisgICAgcmV0dXJuIF9waXBlKGZpbGVkZXMsIDAsIF9PX0JJTkFSWSB8IF9PX05PSU5IRVJJVCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoTkVFRF9TRVRFTlYpCisvKgorICogTWluR1cgbGFja3MgdGhlc2UuICBGb3Igbm93LCBqdXN0IHN0dWIgdGhlbSBvdXQgc28gdGhlIGNvZGUgY29tcGlsZXMuCisgKi8KK2ludCBzZXRlbnYoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIGludCBvdmVyd3JpdGUpCit7CisgICAgcmV0dXJuIDA7Cit9Cit2b2lkIHVuc2V0ZW52KGNvbnN0IGNoYXIqIG5hbWUpCit7Cit9CitjaGFyKiBnZXRlbnYoY29uc3QgY2hhciogbmFtZSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9wb3J0ZWQuaCBiL3NpbXVsYXRvci9hcHAvcG9ydGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzYmUwMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbXVsYXRvci9hcHAvcG9ydGVkLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vCisvLyBTdGFuZGFyZCBmdW5jdGlvbnMgcG9ydGVkIHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgTm90ZSB0aGVzZSBhcmUgTk9UCisvLyBpbiB0aGUgImFuZHJvaWQiIG5hbWVzcGFjZS4KKy8vCisjaWZuZGVmIF9MSUJTX1VUSUxTX1BPUlRFRF9ICisjZGVmaW5lIF9MSUJTX1VUSUxTX1BPUlRFRF9ICisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPiAgICAgICAvLyBmb3IgdGltZXZhbAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIGxpYnJhcnkgcmVwbGFjZW1lbnQgZnVuY3Rpb25zICovCisjaWYgZGVmaW5lZChORUVEX0dFVFRJTUVPRkRBWSkKK2ludCBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHR2LCBzdHJ1Y3QgdGltZXpvbmUqIHR6KTsKKyNlbmRpZgorI2lmIGRlZmluZWQoTkVFRF9VU0xFRVApCit2b2lkIHVzbGVlcCh1bnNpZ25lZCBsb25nIHVzZWMpOworI2VuZGlmCisjaWYgZGVmaW5lZChORUVEX1BJUEUpCitpbnQgcGlwZShpbnQgZmlsZWRlc1syXSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE5FRURfU0VURU5WKQoraW50IHNldGVudihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgaW50IG92ZXJ3cml0ZSk7Cit2b2lkIHVuc2V0ZW52KGNvbnN0IGNoYXIqIG5hbWUpOworY2hhciogZ2V0ZW52KGNvbnN0IGNoYXIqIG5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfTElCU19VVElMU19QT1JURURfSApkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC91dGlscy5oIGIvc2ltdWxhdG9yL2FwcC91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDg0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW11bGF0b3IvYXBwL3V0aWxzLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vCisvLyBIYW5keSB1dGlsaXR5IGZ1bmN0aW9ucyBhbmQgcG9ydGFiaWxpdHkgY29kZS4gIFRoaXMgZmlsZSBpbmNsdWRlcyBhbGwKKy8vIG9mIHRoZSBnZW5lcmFsbHktdXNlZnVsIGhlYWRlcnMgaW4gdGhlICJ1dGlscyIgZGlyZWN0b3J5LgorLy8KKyNpZm5kZWYgX1NJTV9VVElMU19ICisjZGVmaW5lIF9TSU1fVVRJTFNfSAorCisjaW5jbHVkZSAicG9ydGVkLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmdBcnJheS5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2VuZGlmIC8vIF9TSU1fVVRJTFNfSApkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL3dyYXBzaW0vQW5kcm9pZC5tayBiL3NpbXVsYXRvci93cmFwc2ltL0FuZHJvaWQubWsKaW5kZXggMGI3ODkwZC4uZjlhMjQxNCAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL3dyYXBzaW0vQW5kcm9pZC5taworKysgYi9zaW11bGF0b3Ivd3JhcHNpbS9BbmRyb2lkLm1rCkBAIC0zLDcgKzMsNiBAQAogIwogIyBCdWlsZCBpbnN0cnVjdGlvbnMgZm9yIHNpbXVsYXRvciBMRF9QUkVMT0FEIHdyYXBwZXIuCiAjCi1pZm5lcSAoJChUQVJHRVRfQVJDSCksYXJtKQogaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQogCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKQEAgLTIzLDcgKzIyLDggQEAKIAlJbnRlcmNlcHQuYyBcCiAJTG9nLmMgXAogCVNpbU1nci5jIFwKLQlTeXNQb3dlci5jCisJU3lzUG93ZXIuYyBcCisJVXRpbC5jCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gcHJlYnVpbHQvY29tbW9uL2VzZAogCkBAIC01NSw1ICs1NSwzIEBACiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAogZW5kaWYgIyBpZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi1lbmRpZgotIyBpZm5lcSAoJChUQVJHRVRfQVJDSCksYXJtKQpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL3dyYXBzaW0vQ29tbW9uLmggYi9zaW11bGF0b3Ivd3JhcHNpbS9Db21tb24uaAppbmRleCBhOWMzYmI4Li40NjMyNjJmIDEwMDY0NAotLS0gYS9zaW11bGF0b3Ivd3JhcHNpbS9Db21tb24uaAorKysgYi9zaW11bGF0b3Ivd3JhcHNpbS9Db21tb24uaApAQCAtMTQsNSArMTQsNiBAQAogI2luY2x1ZGUgIkxvZy5oIgogI2luY2x1ZGUgIlNpbU1nci5oIgogI2luY2x1ZGUgIkdsb2JhbHMuaCIKKyNpbmNsdWRlICJVdGlsLmgiCiAKICNlbmRpZiAvKl9XUkFQU0lNX0NPTU1PTl9IKi8KZGlmZiAtLWdpdCBhL3NpbXVsYXRvci93cmFwc2ltL0RldkZiLmMgYi9zaW11bGF0b3Ivd3JhcHNpbS9EZXZGYi5jCmluZGV4IGM1NDQwM2UuLmJmZGJiMjIgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci93cmFwc2ltL0RldkZiLmMKKysrIGIvc2ltdWxhdG9yL3dyYXBzaW0vRGV2RmIuYwpAQCAtMTQsNiArMTQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgogCiB0eXBlZGVmIHN0cnVjdCBGYlN0YXRlIHsKKworICAgIC8qIHJlZmNvdW50IGZvciBkdXAoKSAqLworICAgIGludCByZWZDb3VudDsKKwogICAgIC8qIGluZGV4IGludG8gZ1dyYXBTaW0uZGlzcGxheVtdICovCiAgICAgaW50ICAgICBkaXNwbGF5SWR4OwogCkBAIC03Nyw3ICs4MSwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBmcmVlU3RhdGUoRmJTdGF0ZSogZmJTdGF0ZSkKIHsKLSAgICBmcmVlKGZiU3RhdGUpOworICAgIGludCBvbGRjb3VudDsKKworICAgIG9sZGNvdW50ID0gd3NBdG9taWNBZGQoJmZiU3RhdGUtPnJlZkNvdW50LCAtMSk7CisKKyAgICBpZiAob2xkY291bnQgPT0gMCkgeworICAgICAgICBmcmVlKGZiU3RhdGUpOworICAgIH0KIH0KIAogLyoKQEAgLTI0Miw2ICsyNTIsMjggQEAKIH0KIAogLyoKKyAqIGR1cCgpIGFuIGV4aXN0aW5nIGZha2UgZGVzY3JpcHRvcgorICovCitzdGF0aWMgRmFrZURldiogZHVwRmIoRmFrZURldiogZGV2LCBpbnQgZmQpCit7CisgICAgRmFrZURldiogbmV3RGV2ID0gd3NDcmVhdGVGYWtlRGV2KGRldi0+ZGVidWdOYW1lKTsKKyAgICBpZiAobmV3RGV2ICE9IE5VTEwpIHsKKyAgICAgICAgbmV3RGV2LT5tbWFwID0gbW1hcEZiOworICAgICAgICBuZXdEZXYtPmlvY3RsID0gaW9jdGxGYjsKKyAgICAgICAgbmV3RGV2LT5jbG9zZSA9IGNsb3NlRmI7CisgICAgICAgIG5ld0Rldi0+ZHVwID0gZHVwRmI7CisKKyAgICAgICAgLyogdXNlIHN0YXRlIGZyb20gZXhpc3RpbmcgRmFrZURldiAqLworICAgICAgICBGYlN0YXRlKiBmYlN0YXRlID0gZGV2LT5zdGF0ZTsKKyAgICAgICAgd3NBdG9taWNBZGQoJmZiU3RhdGUtPnJlZkNvdW50LCAxKTsKKworICAgICAgICBuZXdEZXYtPnN0YXRlID0gZmJTdGF0ZTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3RGV2OworfQorCisvKgogICogT3BlbiB0aGUgY29uc29sZSBUVFkgZGV2aWNlLCB3aGljaCByZXNwb25kcyB0byBhIGNvbGxlY3Rpb24gb2YgaW9jdGwoKXMuCiAgKi8KIEZha2VEZXYqIHdzT3BlbkRldkZiKGNvbnN0IGNoYXIqIHBhdGhOYW1lLCBpbnQgZmxhZ3MpCkBAIC0yNTEsNiArMjgzLDcgQEAKICAgICAgICAgbmV3RGV2LT5tbWFwID0gbW1hcEZiOwogICAgICAgICBuZXdEZXYtPmlvY3RsID0gaW9jdGxGYjsKICAgICAgICAgbmV3RGV2LT5jbG9zZSA9IGNsb3NlRmI7CisgICAgICAgIG5ld0Rldi0+ZHVwID0gZHVwRmI7CiAKICAgICAgICAgRmJTdGF0ZSogZmJTdGF0ZSA9IGNhbGxvYygxLCBzaXplb2YoRmJTdGF0ZSkpOwogCmRpZmYgLS1naXQgYS9zaW11bGF0b3Ivd3JhcHNpbS9GYWtlRGV2LmMgYi9zaW11bGF0b3Ivd3JhcHNpbS9GYWtlRGV2LmMKaW5kZXggN2QyNDk0ZS4uZjAzZGQyOSAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL3dyYXBzaW0vRmFrZURldi5jCisrKyBiL3NpbXVsYXRvci93cmFwc2ltL0Zha2VEZXYuYwpAQCAtOTksNiArOTksMTEgQEAKIHsKICAgICByZXR1cm4gMDsKIH0KK3N0YXRpYyBGYWtlRGV2KiBub0R1cChGYWtlRGV2KiBkZXYsIC4uLikKK3sKKyAgICBub3RJbXBsZW1lbnRlZChkZXYsICJkdXAiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KIHN0YXRpYyBpbnQgbm9SZWFkKEZha2VEZXYqIGRldiwgLi4uKQogewogICAgIHJldHVybiBub3RJbXBsZW1lbnRlZChkZXYsICJyZWFkIik7CkBAIC0xNDYsNiArMTUxLDcgQEAKICAgICBuZXdEZXYtPnN0YXRlID0gTlVMTDsKIAogICAgIG5ld0Rldi0+Y2xvc2UgPSAoRmFrZV9jbG9zZSkgbm9DbG9zZTsKKyAgICBuZXdEZXYtPmR1cCA9IChGYWtlX2R1cCkgbm9EdXA7CiAgICAgbmV3RGV2LT5yZWFkID0gKEZha2VfcmVhZCkgbm9SZWFkOwogICAgIG5ld0Rldi0+cmVhZHYgPSAoRmFrZV9yZWFkdikgbm9SZWFkdjsKICAgICBuZXdEZXYtPndyaXRlID0gKEZha2Vfd3JpdGUpIG5vV3JpdGU7CmRpZmYgLS1naXQgYS9zaW11bGF0b3Ivd3JhcHNpbS9GYWtlRGV2LmggYi9zaW11bGF0b3Ivd3JhcHNpbS9GYWtlRGV2LmgKaW5kZXggNDc4MWNmYy4uNjVmNDdhZSAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL3dyYXBzaW0vRmFrZURldi5oCisrKyBiL3NpbXVsYXRvci93cmFwc2ltL0Zha2VEZXYuaApAQCAtMTIsMTMgKzEyLDE0IEBACiAKIHR5cGVkZWYgc3RydWN0IEZha2VEZXYgRmFrZURldjsKIAotdHlwZWRlZiBpbnQgICAgICgqRmFrZV9jbG9zZSkoRmFrZURldiogZGV2LCBpbnQpOwotdHlwZWRlZiBzc2l6ZV90ICgqRmFrZV9yZWFkKShGYWtlRGV2KiBkZXYsIGludCwgdm9pZCosIHNpemVfdCk7Ci10eXBlZGVmIHNzaXplX3QgKCpGYWtlX3JlYWR2KShGYWtlRGV2KiBkZXYsIGludCwgY29uc3Qgc3RydWN0IGlvdmVjKiwgaW50KTsKLXR5cGVkZWYgc3NpemVfdCAoKkZha2Vfd3JpdGUpKEZha2VEZXYqIGRldiwgaW50LCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKLXR5cGVkZWYgc3NpemVfdCAoKkZha2Vfd3JpdGV2KShGYWtlRGV2KiBkZXYsIGludCwgY29uc3Qgc3RydWN0IGlvdmVjKiwgaW50KTsKLXR5cGVkZWYgdm9pZCogICAoKkZha2VfbW1hcCkoRmFrZURldiogZGV2LCB2b2lkKiwgc2l6ZV90LCBpbnQsIGludCwgaW50LCBfX29mZl90KTsKLXR5cGVkZWYgaW50ICAgICAoKkZha2VfaW9jdGwpKEZha2VEZXYqIGRldiwgaW50LCBpbnQsIHZvaWQqKTsKK3R5cGVkZWYgaW50ICAgICAgKCpGYWtlX2Nsb3NlKShGYWtlRGV2KiBkZXYsIGludCk7Cit0eXBlZGVmIEZha2VEZXYqICgqRmFrZV9kdXApKEZha2VEZXYqIGRldiwgaW50KTsKK3R5cGVkZWYgc3NpemVfdCAgKCpGYWtlX3JlYWQpKEZha2VEZXYqIGRldiwgaW50LCB2b2lkKiwgc2l6ZV90KTsKK3R5cGVkZWYgc3NpemVfdCAgKCpGYWtlX3JlYWR2KShGYWtlRGV2KiBkZXYsIGludCwgY29uc3Qgc3RydWN0IGlvdmVjKiwgaW50KTsKK3R5cGVkZWYgc3NpemVfdCAgKCpGYWtlX3dyaXRlKShGYWtlRGV2KiBkZXYsIGludCwgY29uc3Qgdm9pZCosIHNpemVfdCk7Cit0eXBlZGVmIHNzaXplX3QgICgqRmFrZV93cml0ZXYpKEZha2VEZXYqIGRldiwgaW50LCBjb25zdCBzdHJ1Y3QgaW92ZWMqLCBpbnQpOwordHlwZWRlZiB2b2lkKiAgICAoKkZha2VfbW1hcCkoRmFrZURldiogZGV2LCB2b2lkKiwgc2l6ZV90LCBpbnQsIGludCwgaW50LCBfX29mZl90KTsKK3R5cGVkZWYgaW50ICAgICAgKCpGYWtlX2lvY3RsKShGYWtlRGV2KiBkZXYsIGludCwgaW50LCB2b2lkKik7CiAKIC8qCiAgKiBBbiBvcGVuIGZha2UgZGV2aWNlIGVudHJ5LgpAQCAtNDIsNiArNDMsNyBAQAogICAgICAqIEFsbCBvdGhlciBmaWxlIGRlc2NyaXB0b3Igb3BlcmF0aW9ucyBzaG91bGQgZmFpbCwgdXN1YWxseSB3aXRoIEVCQURGLgogICAgICAqLwogICAgIEZha2VfY2xvc2UgIGNsb3NlOworICAgIEZha2VfZHVwICBkdXA7CiAgICAgRmFrZV9yZWFkICAgcmVhZDsKICAgICBGYWtlX3JlYWR2ICByZWFkdjsKICAgICBGYWtlX3dyaXRlICB3cml0ZTsKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci93cmFwc2ltL0dsb2JhbHMuaCBiL3NpbXVsYXRvci93cmFwc2ltL0dsb2JhbHMuaAppbmRleCA3NWM5OGQ4Li5hOGQ4MzRjIDEwMDY0NAotLS0gYS9zaW11bGF0b3Ivd3JhcHNpbS9HbG9iYWxzLmgKKysrIGIvc2ltdWxhdG9yL3dyYXBzaW0vR2xvYmFscy5oCkBAIC0yOSw2ICsyOSw3IEBACiB0eXBlZGVmIGludCAgICAgKCpGdW5jX29wZW42NCkoY29uc3QgY2hhciosIGludCwgbW9kZV90KTsKIAogdHlwZWRlZiBpbnQgICAgICgqRnVuY19jbG9zZSkoaW50KTsKK3R5cGVkZWYgaW50ICAgICAoKkZ1bmNfZHVwKShpbnQpOwogdHlwZWRlZiBzc2l6ZV90ICgqRnVuY19yZWFkKShpbnQsIHZvaWQqLCBzaXplX3QpOwogdHlwZWRlZiBzc2l6ZV90ICgqRnVuY19yZWFkdikoaW50LCBjb25zdCBzdHJ1Y3QgaW92ZWMqLCBpbnQpOwogdHlwZWRlZiBzc2l6ZV90ICgqRnVuY193cml0ZSkoaW50LCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKQEAgLTk1LDYgKzk2LDcgQEAKIEVYVEVSTl9GVU5DIEZ1bmNfb3BlbjY0IF93c19vcGVuNjQ7CiAKIEVYVEVSTl9GVU5DIEZ1bmNfY2xvc2UgX3dzX2Nsb3NlOworRVhURVJOX0ZVTkMgRnVuY19kdXAgX3dzX2R1cDsKIEVYVEVSTl9GVU5DIEZ1bmNfcmVhZCBfd3NfcmVhZDsKIEVYVEVSTl9GVU5DIEZ1bmNfcmVhZHYgX3dzX3JlYWR2OwogRVhURVJOX0ZVTkMgRnVuY193cml0ZSBfd3Nfd3JpdGU7CkBAIC0yMDEsNiArMjAzLDkgQEAKICAgICBwdGhyZWFkX211dGV4X3QgZmFrZUZkTG9jazsKICAgICBCaXRWZWN0b3IqICBmYWtlRmRNYXA7CiAgICAgRmFrZURldiogICAgZmFrZUZkTGlzdFtrTWF4RmFrZUZkQ291bnRdOworCisgICAgLyogdXNlZCBmb3Igd3NBdG9taWNBZGQgKi8KKyAgICBwdGhyZWFkX211dGV4X3QgYXRvbWljTG9jazsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgV3JhcFNpbUdsb2JhbHMgZ1dyYXBTaW07CmRpZmYgLS1naXQgYS9zaW11bGF0b3Ivd3JhcHNpbS9Jbml0LmMgYi9zaW11bGF0b3Ivd3JhcHNpbS9Jbml0LmMKaW5kZXggZWVkNjUwYi4uM2RmMGVmZSAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL3dyYXBzaW0vSW5pdC5jCisrKyBiL3NpbXVsYXRvci93cmFwc2ltL0luaXQuYwpAQCAtNDAsNiArNDAsNyBAQAogICAgIF93c19vcGVuNjQgPSBkbHN5bShSVExEX05FWFQsICJvcGVuNjQiKTsKIAogICAgIF93c19jbG9zZSA9IGRsc3ltKFJUTERfTkVYVCwgImNsb3NlIik7CisgICAgX3dzX2R1cCA9IGRsc3ltKFJUTERfTkVYVCwgImR1cCIpOwogICAgIF93c19yZWFkID0gZGxzeW0oUlRMRF9ORVhULCAicmVhZCIpOwogICAgIF93c19yZWFkdiA9IGRsc3ltKFJUTERfTkVYVCwgInJlYWR2Iik7CiAgICAgX3dzX3dyaXRlID0gZGxzeW0oUlRMRF9ORVhULCAid3JpdGUiKTsKQEAgLTEwOCw2ICsxMDksOCBAQAogICAgIGdXcmFwU2ltLmZha2VGZE1hcCA9IHdzQWxsb2NCaXRWZWN0b3Ioa01heEZha2VGZENvdW50LCAwKTsKICAgICBtZW1zZXQoZ1dyYXBTaW0uZmFrZUZkTGlzdCwgMCwgc2l6ZW9mKGdXcmFwU2ltLmZha2VGZExpc3QpKTsKIAorICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmZ1dyYXBTaW0uYXRvbWljTG9jaywgTlVMTCk7CisKICAgICBnV3JhcFNpbS5udW1EaXNwbGF5cyA9IDA7CiAKICAgICBnV3JhcFNpbS5rZXlJbnB1dERldmljZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9zaW11bGF0b3Ivd3JhcHNpbS9JbnRlcmNlcHQuYyBiL3NpbXVsYXRvci93cmFwc2ltL0ludGVyY2VwdC5jCmluZGV4IDQ5ZDc3ZWUuLjNkNGVkYjIgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci93cmFwc2ltL0ludGVyY2VwdC5jCisrKyBiL3NpbXVsYXRvci93cmFwc2ltL0ludGVyY2VwdC5jCkBAIC0xNjAsNyArMTYwLDcgQEAKICAgICBfcnR5cGUgX2ZuYW1lKCBfX1ZBX0FSR1NfXyApCiAjZGVmaW5lIFBBU1NfVEhST1VHSF9CT0RZKF9mbmFtZSwgX3BhdGhhcmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ0FMTFRSQUNFVigiJXNcbiIsIF9fRlVOQ1RJT05fXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENBTExUUkFDRVYoIiVzKCVzKVxuIiwgX19GVU5DVElPTl9fLCBfcGF0aGFyZyk7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjaGFyIHBhdGhCdWZbUEFUSF9NQVhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgcmV0dXJuIF93c18jI19mbmFtZShyZXdyaXRlUGF0aCgjX2ZuYW1lLCBwYXRoQnVmLCBfcGF0aGFyZyksICAgICAgICBcCiAgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNjMxLDYgKzYzMSwzMCBAQAogfQogCiAKK2ludCBkdXAoaW50IGZkKQoreworICAgIENBTExUUkFDRVYoIiVzKCVkKVxuIiwgX19GVU5DVElPTl9fLCBmZCk7CisKKyAgICBGYWtlRGV2KiBkZXYgPSB3c0Zha2VEZXZGcm9tRmQoZmQpOworICAgIGlmIChkZXYgIT0gTlVMTCkgeworICAgICAgICBGYWtlRGV2KiBuZXdEZXYgPSBkZXYtPmR1cChkZXYsIGZkKTsKKyAgICAgICAgaWYgKG5ld0RldiAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTm93IHRoYXQgdGhlIGRldmljZSBlbnRyeSBpcyByZWFkeSwgYWRkIGl0IHRvIHRoZSBsaXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB3c0xvZygiIyMgZHVwJ2VkIGZha2UgZGV2ICVkOiAnJXMnICVwXG4iLAorICAgICAgICAgICAgICAgIG5ld0Rldi0+ZmQsIG5ld0Rldi0+ZGVidWdOYW1lLCBuZXdEZXYtPnN0YXRlKTsKKyAgICAgICAgICAgIGdXcmFwU2ltLmZha2VGZExpc3RbbmV3RGV2LT5mZCAtIGtGYWtlRmRCYXNlXSA9IG5ld0RldjsKKyAgICAgICAgICAgIHJldHVybiBuZXdEZXYtPmZkOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBDQUxMVFJBQ0UoImR1cCglZClcbiIsIGZkKTsKKyAgICAgICAgcmV0dXJuIF93c19kdXAoZmQpOworICAgIH0KK30KKworCiAvKgogICogQ2xvc2UgYSBmaWxlIGRlc2NyaXB0b3IuCiAgKi8KQEAgLTc5OSw2ICs4MjMsMTYgQEAKICAgICByZXR1cm4gMDsKIH0KIAorLyoKKyAqIFByZXRlbmQgdG8gYmUgcnVubmluZyBhcyByb290LCBzbyB0aGUgQW5kcm9pZCBmcmFtZXdvcmsKKyAqIGRvZXNuJ3QgY29tcGxhaW4gYWJvdXQgcGVybWlzc2lvbiBwcm9ibGVtcyBhbGwgb3ZlciB0aGUKKyAqIHBsYWNlLgorICovCit1aWRfdCBnZXR1aWQodm9pZCkKK3sKKyAgICByZXR1cm4gMDsKK30KKwogI2lmIDAKIC8qCiAgKiBDcmVhdGUgYSBwaXBlLiAgKE9ubHkgbmVlZGVkIGZvciBkZWJ1Z2dpbmcgYW4gZmQgbGVhay4pCmRpZmYgLS1naXQgYS9zaW11bGF0b3Ivd3JhcHNpbS9VdGlsLmMgYi9zaW11bGF0b3Ivd3JhcHNpbS9VdGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkOTAzYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbXVsYXRvci93cmFwc2ltL1V0aWwuYwpAQCAtMCwwICsxLDEzIEBACisKKyNpbmNsdWRlICJDb21tb24uaCIKKworaW50IHdzQXRvbWljQWRkKGludCAqdmFyLCBpbnQgdmFsKQoreworICAgIGludCBjYzsKKyAgICBpbnQgcmV0OworICAgIGNjID0gcHRocmVhZF9tdXRleF9sb2NrKCZnV3JhcFNpbS5hdG9taWNMb2NrKTsKKyAgICByZXQgPSAqdmFyOworICAgICp2YXIgPSAqdmFyICsgdmFsOworICAgIGNjID0gcHRocmVhZF9tdXRleF91bmxvY2soJmdXcmFwU2ltLmF0b21pY0xvY2spOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zaW11bGF0b3Ivd3JhcHNpbS9VdGlsLmggYi9zaW11bGF0b3Ivd3JhcHNpbS9VdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3MDgwMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbXVsYXRvci93cmFwc2ltL1V0aWwuaApAQCAtMCwwICsxLDQgQEAKKworCisKK2ludCB3c0F0b21pY0FkZChpbnQgKnZhciwgaW50IHZhbCk7CmRpZmYgLS1naXQgYS90ZXN0cnVubmVyL3J1bl9jb21tYW5kLnB5IGIvdGVzdHJ1bm5lci9ydW5fY29tbWFuZC5weQppbmRleCA3ZDFmNTQ3Li43OWM3ZWE1IDEwMDc1NQotLS0gYS90ZXN0cnVubmVyL3J1bl9jb21tYW5kLnB5CisrKyBiL3Rlc3RydW5uZXIvcnVuX2NvbW1hbmQucHkKQEAgLTE0NCw3ICsxNDQsNyBAQAogICBlbHNlOgogICAgICMgTmVlZCB0aGUgZnVsbCBwYXRoIHRvIHZhbGdyaW5kIHRvIGF2b2lkIG90aGVyIHZlcnNpb25zIG9uIHRoZSBzeXN0ZW0uCiAgICAgc3VicHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oWyIvdXNyL2Jpbi92YWxncmluZCIsICItLXRvb2w9bWVtY2hlY2siLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1sZWFrLWNoZWNrPXllcyIsICItcSIsIGZ1bGxfcGF0aF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWxlYWstY2hlY2s9eWVzIiwgIi1xIiwgYmluYXJ5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCiAgICAgIyBDYW5ub3QgcmVseSBvbiB0aGUgcmV0Y29kZSBvZiB2YWxncmluZC4gSW5zdGVhZCBsb29rIGZvciBhbiBlbXB0eSBvdXRwdXQuCiAgICAgdmFsZ3JpbmRfb3V0ID0gc3VicHJvYy5jb21tdW5pY2F0ZSgpWzBdLnN0cmlwKCkKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbCBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbAppbmRleCA5ZDAzNTU4Li5jMzk4MWI0IDEwMDY0NAotLS0gYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy54bWwKKysrIGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMueG1sCkBAIC00NCw2ICs0NCwxMiBAQAogICAgIGNvdmVyYWdlX3RhcmdldD0iZnJhbWV3b3JrIgogICAgIGNvbnRpbnVvdXM9InRydWUiIC8+CiAKKzx0ZXN0IG5hbWU9ImFjY291bnQiCisgICAgYnVpbGRfcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3Rlc3RzL0FuZHJvaWRUZXN0cyIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC51bml0X3Rlc3RzIgorICAgIGNsYXNzPSJjb20uYW5kcm9pZC51bml0X3Rlc3RzLmFjY291bnRzLkFjY291bnRNYW5hZ2VyU2VydmljZVRlc3QiCisgICAgY292ZXJhZ2VfdGFyZ2V0PSJmcmFtZXdvcmsiIC8+CisKIDx0ZXN0IG5hbWU9InNtb2tlIgogICAgIGJ1aWxkX3BhdGg9ImZyYW1ld29ya3MvYmFzZS90ZXN0cy9TbW9rZVRlc3QiCiAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuc21va2V0ZXN0LnRlc3RzIgpAQCAtMTAzLDYgKzEwOSwxMiBAQAogIC0tPgogCiAKKzx0ZXN0IG5hbWU9ImNvbnRlbnRwcm92aWRlcm9wZXJhdGlvbiIKKyAgICBidWlsZF9wYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdGVzdHMvRnJhbWV3b3JrVGVzdCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5mcmFtZXdvcmt0ZXN0LnRlc3RzIgorICAgIGNsYXNzPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uVGVzdCIKKyAgICBjb3ZlcmFnZV90YXJnZXQ9ImZyYW1ld29yayIgLz4KKwogPHRlc3QgbmFtZT0idGFibGVtZXJnZXIiCiAgICAgYnVpbGRfcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3Rlc3RzL0ZyYW1ld29ya1Rlc3QiCiAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3JrdGVzdC50ZXN0cyIKQEAgLTQyNyw3ICs0MzksNiBAQAogPHRlc3QgbmFtZT0ibW1zIgogICAgIGJ1aWxkX3BhdGg9InBhY2thZ2VzL2FwcHMvTW1zIgogICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1tcy50ZXN0cyIKLSAgICBydW5uZXI9ImNvbS5hbmRyb2lkLm1tcy51aS5NTVNJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgogICAgIGNvdmVyYWdlX3RhcmdldD0iTW1zIiAvPgogCiA8dGVzdCBuYW1lPSJtbXNsYXVuY2giCkBAIC00NTMsNiArNDY0LDEwIEBACiAgICAgZGVzY3JpcHRpb249IkJpb25pYyBsaWJzdGRjKysuIgogICAgIGV4dHJhX2J1aWxkX2FyZ3M9IkJJT05JQ19URVNUUz0xIiAvPgogCis8dGVzdC1uYXRpdmUgbmFtZT0ibGlic2tpYSIKKyAgICBidWlsZF9wYXRoPSJleHRlcm5hbC9za2lhL3Rlc3RzIgorICAgIGRlc2NyaXB0aW9uPSJTa2lhIHRlc3RzLiIgLz4KKwogPCEtLSAgQW5kcm9pZCBTVEwgdGVzdHMgLS0+CiA8dGVzdC1uYXRpdmUgbmFtZT0iYXN0bCIKICAgICBidWlsZF9wYXRoPSJleHRlcm5hbC9hc3RsL3Rlc3RzIgpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZVByb2ZpbGluZy5qYXZhIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZVByb2ZpbGluZy5qYXZhCmluZGV4IGU4ZTgxMDMuLjA3ODk2NTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVQcm9maWxpbmcuamF2YQorKysgYi90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlUHJvZmlsaW5nLmphdmEKQEAgLTczLDExICs3MywxNCBAQAogICAgIC8qKgogICAgICAqIFNlbmQgYSBNUFJTIChNZXRob2QgUFJvZmlsaW5nIFN0YXJ0KSByZXF1ZXN0IHRvIHRoZSBjbGllbnQuCiAgICAgICoKKyAgICAgKiBUaGUgYXJndW1lbnRzIHRvIHRoaXMgbWV0aG9kIHdpbGwgZXZlbnR1YWxseSBiZSBwYXNzZWQgdG8KKyAgICAgKiBhbmRyb2lkLm9zLkRlYnVnLnN0YXJ0TWV0aG9kVHJhY2luZygpIG9uIHRoZSBkZXZpY2UuCisgICAgICoKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gd2hpY2ggcHJvZmlsaW5nIGRhdGEKICAgICAgKiAgICAgICAgICB3aWxsIGJlIHdyaXR0ZW4gKG9uIHRoZSBkZXZpY2UpOyBpdCB3aWxsIGhhdmUgIi50cmFjZSIKICAgICAgKiAgICAgICAgICBhcHBlbmRlZCBpZiBuZWNlc3NhcnkKICAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZSBpcyB0aGUgZGVzaXJlZCBidWZmZXIgc2l6ZSBpbiBieXRlcyAoOE1CIGlzIGdvb2QpCi0gICAgICogQHBhcmFtIGZsYWdzIHNob3VsZCBiZSB6ZXJvCisgICAgICogQHBhcmFtIGZsYWdzIHNlZSBzdGFydE1ldGhvZFRyYWNpbmcoKSBkb2NzOyB1c2UgMCBmb3IgZGVmYXVsdCBiZWhhdmlvcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kTVBSUyhDbGllbnQgY2xpZW50LCBTdHJpbmcgZmlsZU5hbWUsIGludCBidWZmZXJTaXplLAogICAgICAgICBpbnQgZmxhZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Ly5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5MmYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5hZHQvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLmphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmNvbW1vbi8uZ2l0aWdub3JlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmNvbW1vbi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTJmMGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuY29tbW9uLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5qYXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2ljb25zLy5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MzJlODgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMzEgQEAKK2FkZC5wbmcKK2JhY2t3YXJkLnBuZworY2xlYXIucG5nCitkLnBuZworZGVidWctYXR0YWNoLnBuZworZGVidWctZXJyb3IucG5nCitkZWJ1Zy13YWl0LnBuZworZGVsZXRlLnBuZworZGV2aWNlLnBuZworZG93bi5wbmcKK2UucG5nCitlZGl0LnBuZworZW1wdHkucG5nCitlbXVsYXRvci5wbmcKK2ZvcndhcmQucG5nCitnYy5wbmcKK2hhbHQucG5nCitoZWFwLnBuZworaS5wbmcKK2ltcG9ydEJ1Zy5wbmcKK2xvYWQucG5nCitwYXVzZS5wbmcKK3BsYXkucG5nCitwdWxsLnBuZworcHVzaC5wbmcKK3NhdmUucG5nCit0aHJlYWQucG5nCit1cC5wbmcKK3YucG5nCit3LnBuZword2FybmluZy5wbmcKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2xpYnMvLmdpdGlnbm9yZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2xpYnMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkyZjBlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvbGlicy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyouamFyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvLmdpdGlnbm9yZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL3NyYy9jb20vYW5kcm9pZC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDk5ODEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKK2RkbWxpYgorZGRtdWlsaWIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5lZGl0b3JzLy5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTJmMGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyouamFyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvLmdpdGlnbm9yZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS50ZXN0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTJmMGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLmphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluZHVudXNlZC9maW5kdW51c2VkcmVzb3VyY2VzIGIvdG9vbHMvZmluZHVudXNlZC9maW5kdW51c2VkcmVzb3VyY2VzCmluZGV4IDc0ODEzOWEuLjU0YjE1OTYgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmR1bnVzZWQvZmluZHVudXNlZHJlc291cmNlcworKysgYi90b29scy9maW5kdW51c2VkL2ZpbmR1bnVzZWRyZXNvdXJjZXMKQEAgLTI2LDExICsyNiwxNSBAQAogZm9yIGFwcCBpbiAkYXBwcwogZG8KICAgICBlY2hvICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAgICBpZiBbICIkYXBwIiA9PSAiLiIgXQorICAgIHRoZW4KKyAgICAgICAgYXBwPSQocHdkKQorICAgIGZpCiAgICAgaWYgWyAtZCAkYXBwL3JlcyBdCiAgICAgdGhlbgogICAgICAgICBhcHBuYW1lPSQoYmFzZW5hbWUgJGFwcCkKICAgICAgICAgcmVzb3VyY2VzPQotICAgICAgICBmb3IgcmVzIGluICQoZWNobyAkYXBwL3Jlcy8qKQorICAgICAgICBmb3IgcmVzIGluICQoZWNobyAkYXBwL3Jlcy8qICQoZmluZCAkQU5EUk9JRF9CVUlMRF9UT1AvdmVuZG9yIC10eXBlIGQgLXdob2xlbmFtZSAkQU5EUk9JRF9CVUlMRF9UT1AvdmVuZG9yLyovJGFwcG5hbWUvcmVzIHwgZ3JlcCBvdmVybGF5KSkKICAgICAgICAgZG8KICAgICAgICAgICAgIHJlc291cmNlcz0iJHJlc291cmNlcyAkKGVjaG8gJHJlcyB8IGdyZXAgLXYgJ1wtbWNjXHxbYS16XSotW2Etel1bYS16XSRcfFthLXpdKi1bYS16XVthLXpdLS4qJykiCiAgICAgICAgIGRvbmUKQEAgLTQ1LDE5ICs0OSwyNSBAQAogICAgICAgICBmaQogCiAgICAgICAgICMgZmluZCB0aGUgUi5qYXZhIGZpbGUgdGhhdCBjb250YWlucyBhbGwgdGhlIGdlbmVyYXRlZCByZXNvdXJjZSBpZGVudGlmaWVycwotICAgICAgICByRG90SmF2YT0kKGZpbmQgb3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvJHthcHBuYW1lfV9pbnRlcm1lZGlhdGVzLyAtbmFtZSBSLmphdmEpCisgICAgICAgIHJEb3RKYXZhPSQoZmluZCAkQU5EUk9JRF9CVUlMRF9UT1Avb3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvJHthcHBuYW1lfV9pbnRlcm1lZGlhdGVzLyAtbmFtZSBSLmphdmEpCiAKICAgICAgICAgIyBTaW1wbGlzdGljYWxseSBwcm9jZXNzIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIGdldCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjb25zdGFudHMsCiAgICAgICAgICMgYW5kIHRyeSB0byBmaW5kIGEgcmVmZXJlbmNlIHRvIGVhY2ggY29uc3RhbnQuCisKKyAgICAgICAgIyBGaXJzdCB0YWtlIGFsbCB0aGUgaW5wdXQgZmlsZXMgYW5kIGNvbmNhdGVuYXRlIHRoZW0sIHJlbW92aW5nIG5ld2xpbmVzLiBUaGlzIGFsbG93cyB1cyB0bworICAgICAgICAjIGZpbmQgZXhwcmVzc2lvbnMgdGhhdCBhcmUgYnJva2VuIHVwIG92ZXIgbXVsdGlwbGUgbGluZXMsIGkuZS4gUi5kcmF3YWJsZS5cbnNvbWVjb25zdGFudAorICAgICAgICBmaW5kICRyZXNvdXJjZXMgJHNvdXJjZXMgJGFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIC10eXBlIGYgLXByaW50IHx4YXJncyBjYXQgfCB0ciAtZCAnXG4gJyA+IC90bXAvZXZlcnl0aGluZyQkCisKKyAgICAgICAgIyBOb3cgbG9vayBmb3IgZWFjaCBvZiB0aGUgY29uc3RhbnRzIGluIHRoZSBjb250YXRlbmF0ZWQgZmlsZS4KICAgICAgICAgZm9yIGkgaW4gJChjYXQgJHJEb3RKYXZhIHwgZ3JlcCAiXHcqPTB4XGQqIiB8IHNlZCAncy8gKnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IC8vJyB8IHNlZCAncy89MHguKi8vJykKICAgICAgICAgZG8KICAgICAgICAgICAgICMgU2luY2UgcGVyaW9kcyBpbiB0aGUgbmFtZXMgZ2V0IHRyYW5zbGF0ZWQgdG8gdW5kZXJzY29yZXMgaW4gUi5qYXZhLCBhbmQgeW91IGNhbiBhY3R1YWxseQogICAgICAgICAgICAgIyByZWZlciB0byBzdWNoIGNvbnN0YW50cyBmcm9tIGphdmEgYnkgdXNpbmcgYW4gdW5kZXJzY29yZSBpbnN0ZWFkIG9mIGEgcGVyaW9kLCB3ZSBhbHNvCiAgICAgICAgICAgICAjIHJlcGxhY2UgYWxsIHVuZGVyc2NvcmVzIHdpdGggYSBwYXR0ZXJuIHRoYXQgd2lsbCBtYXRjaCBwZXJpb2RzIGFuZCB1bmRlcnNjb3Jlcy4KICAgICAgICAgICAgIHA9JChlY2hvICRpIHwgc2VkICdzL18vW1xcLl9dL2cnKQotICAgICAgICAgICAgZWNobyAkaSAkKGdyZXAgLVJ3IFJcXC4uKlxcLiRpXFxcfEBzdHlsZS8kcFxcXHxAZHJhd2FibGUvJHBcXFx8QGFuaW0vJHBcXFx8QGNvbG9yLyRwXFxcfEB4bWwvJHBcXFx8QGxheW91dC8kcFxcXHxAbWVudS8kcFxcXHxAK2lkLyRwXFxcfEBhcnJheS8kcFxcXHxAc3RyaW5nLyRwXFxcfEBkaW1lbi8kcCAkcmVzb3VyY2VzICRzb3VyY2VzICRhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCB8IHdjIC1sKQorICAgICAgICAgICAgZWNobyAkaSAkKGdyZXAgLWN3IFJcXC4uKlxcLiRpXFxcfEBzdHlsZS8kcFxcXHxAZHJhd2FibGUvJHBcXFx8QGFuaW0vJHBcXFx8QGNvbG9yLyRwXFxcfEB4bWwvJHBcXFx8QGxheW91dC8kcFxcXHxAbWVudS8kcFxcXHxAK2lkLyRwXFxcfEBhcnJheS8kcFxcXHxAc3RyaW5nLyRwXFxcfEBkaW1lbi8kcFxcXHxcW2EtelxdXCo6JHBcXFx8ZW51bW5hbWU9XCIkcFxcXHxcPGl0ZW1cPiRwXDwgPCAvdG1wL2V2ZXJ5dGhpbmckJCkKICAgICAgICAgZG9uZSB8IGdyZXAgIiAwJCIgfCB7Ci0gICAgICAgICAgICAjIHRoaXMgYmxvY2sgZ2V0cyBhcyBpdHMgaW5wdXQgYSBsaXN0IG9mIGNvbnN0YW50cyB3aGljaCBubyByZWZlcmVuY2VzIHdlcmUgZm91bmQsIG9uZSBwZXIgbGluZQorICAgICAgICAgICAgIyB0aGlzIGJsb2NrIGdldHMgYXMgaXRzIGlucHV0IGEgbGlzdCBvZiBjb25zdGFudHMgZm9yIHdoaWNoIG5vIHJlZmVyZW5jZXMgd2VyZSBmb3VuZCwgb25lIHBlciBsaW5lCiAgICAgICAgICAgICBpZiBbICIkc2hvd2FsbCIgPT0gInllcyIgXQogICAgICAgICAgICAgdGhlbgogICAgICAgICAgICAgICAgIGVjaG8gJGFwcApAQCAtNzAsNSArODAsNiBAQAogICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICBmaQogICAgICAgICB9CisgICAgICAgIHJtIC90bXAvZXZlcnl0aGluZyQkCiAgICAgZmkKIGRvbmUKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmR1bnVzZWQvcmVtb3ZldW51c2VkcmVzb3VyY2VzIGIvdG9vbHMvZmluZHVudXNlZC9yZW1vdmV1bnVzZWRyZXNvdXJjZXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGMzODQ5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmR1bnVzZWQvcmVtb3ZldW51c2VkcmVzb3VyY2VzCkBAIC0wLDAgKzEsODQgQEAKKyMhL2Jpbi9iYXNoCisKK2lmICEgd2hpY2ggeG1sc3RhcmxldCA+IC9kZXYvbnVsbAordGhlbgorICAgIGVjaG8gIllvdSBuZWVkIHRvIGhhdmUgdGhlICd4bWxzdGFybGV0JyBjb21tYW5kIGluIHlvdXIgcGF0aCIKKyAgICBleGl0CitmaQorCithcHBzPSQxCitDV0Q9JChwd2QpLworaWYgWyAiJGFwcHMiID0gIiIgXQordGhlbgorICAgIGVjaG8gIlBsZWFzZSBzcGVjaWZ5IHRoZSBwYXRoIHRvIGFuIGFwcGxpY2F0aW9uLCBvciAnLS1hbGwnIHRvIHByb2Nlc3MgYWxsIGFwcGxpY2F0aW9ucyIKKyAgICBleGl0CitlbGlmIFsgIiRhcHBzIiA9ICItLWFsbCIgXQordGhlbgorICAgIGFwcHM9JEFORFJPSURfQlVJTERfVE9QL3BhY2thZ2VzL2FwcHMvKgorZmkKKworQkFTRT0kKHB3ZCkvJChkaXJuYW1lICQwKQorCitmb3IgYXBwIGluICRhcHBzCitkbworICAgIHB1c2hkICRhcHAKKyAgICAkQkFTRS9maW5kdW51c2VkcmVzb3VyY2VzIC1wIC4gfCB7CisgICAgICAgIHJlYWQgTElORSBOVU0KKyAgICAgICAgd2hpbGUgWyAiJExJTkUiICE9ICIiIF0KKyAgICAgICAgZG8KKyAgICAgICAgICAgIGlmIFsgIlokTElORSIgPSAiWi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiBdCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgIyBza2lwCisgICAgICAgICAgICAgICAgdHJ1ZQorICAgICAgICAgICAgZWxpZiBbICIkTElORSIgPSAiJGFwcCIgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICMgc2tpcAorICAgICAgICAgICAgICAgIHRydWUKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAjIHRyeSB0byBmaW5kIHRoZSBtaXNzaW5nIHJlc291cmNlCisgICAgICAgICAgICAgICAgZmluZCByZXMgfCBncmVwIC13ICRMSU5FICB8IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZCBSRVNMSU5FCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIFsgIiRSRVNMSU5FIiAhPSAiIiBdCisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICRSRVNMSU5FIF0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvIFJFTU9WSU5HIEZJTEU6ICRSRVNMSU5FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l0IHJtICRSRVNMSU5FID4gL2Rldi9udWxsCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBXQVJOSU5HIHVuZXhwZWN0ZWQgcmVzdWx0IGZvciAkTElORQorICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgUkVTTElORQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdyZXAgLVJ3bCAkTElORSByZXMgfCB7CisgICAgICAgICAgICAgICAgICAgIHJlYWQgUkVTTElORQorICAgICAgICAgICAgICAgICAgICB3aGlsZSBbICIkUkVTTElORSIgIT0gIiIgXQorICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICAgICAgSVNTVFJJTkc9JChlY2hvICIkUkVTTElORSIgfCBncmVwIC13ICJzdHJpbmdzXC54bWwiKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyAtbiAiJElTU1RSSU5HIiBdCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBSRU1PVklORyBTVFJJTkcgJExJTkUgZnJvbSAkUkVTTElORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbHN0YXJsZXQgZWQgLVAgLVMgLWQgIi9yZXNvdXJjZXMvc3RyaW5nW0BuYW1lPSckTElORSddIiAkUkVTTElORSA+IHRmJCQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiB0ZiQkICRSRVNMSU5FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l0IGFkZCAkUkVTTElORQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gUkVNT1ZJTkcgJExJTkUgZnJvbSAkUkVTTElORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbHN0YXJsZXQgZWQgLVAgLVMgLWQgIi9yZXNvdXJjZXMvKltAbmFtZT0nJExJTkUnXSIgJFJFU0xJTkUgPiB0ZiQkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYgdGYkJCAkUkVTTElORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdCBhZGQgJFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkIFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICByZWFkIExJTkUgTlVNCisgICAgICAgIGRvbmUKKyAgICB9CisgICAgcG9wZAorZG9uZQorZWNobworZWNobyAiRG9uZS4iCitlY2hvICJQbGVhc2UgcmVidWlsZCB0aGUgdXBkYXRlZCBhcHBsaWNhdGlvbnMgdG8gbWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZyBzdGlsbCBidWlsZHMuIgorZWNobyAiQWZ0ZXIgcmVidWlsZGluZywgcmVydW4gJ2ZpbmR1bnVzZWRyZXNvdXJjZXMnIG9yICdyZW1vdmV1bnVzZWRyZXNvdXJjZXMnIHRvIHNlZSBpZiBhbnkgbW9yZSByZXNvdXJjZXMgYXJlIG5vdyB1bnVzZWQuIgorZWNobyAiV2hlbiB5b3UncmUgZG9uZSwgeW91IGNhbiAnZ2l0IGNvbW1pdCcgdGhlIGNoYW5nZS4iCitlY2hvCg==