ZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnhtbCBiL2FwaS9jdXJyZW50LnhtbAppbmRleCBkYmI2OGY4Li45NDg2Y2E2IDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC54bWwKKysrIGIvYXBpL2N1cnJlbnQueG1sCkBAIC00ODkzLDYgKzQ4OTMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImltbWVyc2l2ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNDU3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImluQW5pbWF0aW9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjA5MiwxNyArNjEwMyw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkNjQiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxNjg0MzQ1NyIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkNyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEzOTU1LDcgKzEzOTU1LDcgQEAKICB2YWx1ZT0iMTczMDE2MzYiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KQEAgLTEzOTY2LDcgKzEzOTY2LDcgQEAKICB2YWx1ZT0iMTczMDE2MzciCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KQEAgLTEzOTc3LDcgKzEzOTc3LDcgQEAKICB2YWx1ZT0iMTczMDE2MzgiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KQEAgLTE0MDIxLDcgKzE0MDIxLDcgQEAKICB2YWx1ZT0iMTczMDE2NzEiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KQEAgLTE0MDMyLDcgKzE0MDMyLDcgQEAKICB2YWx1ZT0iMTczMDE2NzIiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KQEAgLTE1MzQxLDYgKzE1MzQxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJsaXN0X2NvbnRlbnQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNzM2NzA3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJwcmVmZXJlbmNlX2NhdGVnb3J5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTk0NTcsNiArMTk0NjgsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmaW5pc2hDb250ZXh0TW9kZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xOTUyMyw2ICsxOTU0Nyw4NCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnNlcnRUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdUYWIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlVGFiIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlVGFiQXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2VsZWN0VGFiIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2VsZWN0VGFiQXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QmFja2dyb3VuZERyYXdhYmxlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE5NjQ0LDYgKzE5NzQ2LDMwIEBACiA8cGFyYW1ldGVyIG5hbWU9InN1YnRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhYk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhYk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xOTkxNSw2ICsyMDA0MSwxMjggQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJBY3Rpb25CYXIuVGFiIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWN0aW9uQmFyLlRhYiIKKyB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldEZyYWdtZW50IgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJY29uIgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBvc2l0aW9uIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZWxlY3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJY29uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRleHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJJTlZBTElEX1BPU0lUSU9OIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkFjdGl2aXR5IgogIGV4dGVuZHM9ImFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMjcyLDYgKzIwNTIwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlck1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldExvY2FsQ2xhc3NOYW1lIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDUyMyw2ICsyMDc4MiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQXR0YWNoRnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25BdHRhY2hlZFRvV2luZG93IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNTc0MCw2ICsyNjAxMiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkZXJNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRSZXRhaW5JbnN0YW5jZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjU4MDYsNiArMjYwODksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNSZXN1bWVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzVmlzaWJsZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjU4MTcsNiArMjYxMTEsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BY3Rpdml0eUNyZWF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uQWN0aXZpdHlSZXN1bHQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI2MDc2LDE5ICsyNjM4Myw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Im9uUmVhZHkiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uUmVzdW1lIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yODE4Miw3ICsyODQ3NiwxOCBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzaG93biIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdFNob3duTm9BbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzaG93biIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCkBAIC0yODE5OSw2ICsyODUwNCwxMTMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlck1hbmFnZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImluaXRMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlc3RhcnRMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrcyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZEZpbmlzaGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkxvYWRlck1hbmFnaW5nRnJhZ21lbnQiCiAgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODQ5NCw3ICsyODkwNiw5IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuSW5wdXRRdWV1ZS5DYWxsYmFjayI+CiA8L2ltcGxlbWVudHM+Ci08aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlci5DYWxsYmFjayI+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlci5DYWxsYmFjazIiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lciI+CiA8L2ltcGxlbWVudHM+CiA8Y29uc3RydWN0b3IgbmFtZT0iTmF0aXZlQWN0aXZpdHkiCiAgdHlwZT0iYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkiCkBAIC0yODUwNCw2ICsyODkxOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uR2xvYmFsTGF5b3V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbklucHV0UXVldWVDcmVhdGVkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yODU3NSw2ICsyOTAwMCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJob2xkZXIiIHR5cGU9ImFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN1cmZhY2VSZWRyYXdOZWVkZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJob2xkZXIiIHR5cGU9ImFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8ZmllbGQgbmFtZT0iTUVUQV9EQVRBX0xJQl9OQU1FIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTU2NTI5LDcgKzU2OTY3LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTU2NTk3LDcgKzU3MDM1LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTU2ODgzLDcgKzU3MzIxLDcgQEAKICB2b2xhdGlsZT0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L2ZpZWxkPgpAQCAtNTcwMTksNyArNTc0NTcsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTcwMzIsNyArNTc0NzAsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTcwNDUsNyArNTc0ODMsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTcwNzEsNyArNTc1MDksNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNjIxNDgsNyArNjI1ODYsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtOTA2OTQsNiArOTExMzIsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icXVhbGl0eSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldCIKKyByZXR1cm49ImFuZHJvaWQubWVkaWEuQ2FtY29yZGVyUHJvZmlsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYW1lcmFJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWFsaXR5IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxmaWVsZCBuYW1lPSJRVUFMSVRZX0hJR0giCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05MDg2Niw2ICs5MTMxOSwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJxdWFsaXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SnBlZ0VuY29kaW5nUXVhbGl0eVBhcmFtZXRlciIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYW1lcmFJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWFsaXR5IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxmaWVsZCBuYW1lPSJRVUFMSVRZX0hJR0giCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDY3MDYsNiArMTQ3MTc0LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImhvbGRlciIgdHlwZT0iYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdXJmYWNlUmVkcmF3TmVlZGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaG9sZGVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvblRvdWNoRXZlbnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1ODEzMyw2ICsxNTg2MTQsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYWNrYWdlT2JiUGF0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhY2thZ2VOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik1vY2tSZXNvdXJjZXMiCiAgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMiCkBAIC0xNjU4ODcsNiArMTY2MzgzLDI5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3Vyc29yQ29udHJvbGxlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvckNvbnRyb2xsZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkN1cnNvckNvbnRyb2xsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJtQ3Vyc29yQ29udHJvbGxlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5DdXJzb3JDb250cm9sbGVyIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkJhc2VLZXlMaXN0ZW5lciIKICBleHRlbmRzPSJhbmRyb2lkLnRleHQubWV0aG9kLk1ldGFLZXlLZXlMaXN0ZW5lciIKQEAgLTE3Mzc2Miw2ICsxNzQyODEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlQXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFZhbHVlQXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE3NzkxOCw2ICsxNzg0NTAsMTcxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVlDT0RFX0JVVFRPTl9BIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS0VZQ09ERV9CVVRUT05fQiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ijk3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX0MiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI5OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVlDT0RFX0JVVFRPTl9MMSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVlDT0RFX0JVVFRPTl9MMiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVlDT0RFX0JVVFRPTl9NT0RFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTEwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX1IxIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX1IyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTA1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX1NFTEVDVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwOSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVlDT0RFX0JVVFRPTl9TVEFSVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVlDT0RFX0JVVFRPTl9USFVNQkwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS0VZQ09ERV9CVVRUT05fVEhVTUJSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTA3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX1giCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI5OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVlDT0RFX0JVVFRPTl9ZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX1oiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iS0VZQ09ERV9DIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTgyNTcxLDYgKzE4MzI2OCwyOSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyLkNhbGxiYWNrIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0ic3VyZmFjZVJlZHJhd05lZWRlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaG9sZGVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iU3VyZmFjZVZpZXciCiAgZXh0ZW5kcz0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkxMjEwLDcgKzE5MTkzMCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIuQ2FsbGJhY2siPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InRvZ2dsZVBhbmVsIgpAQCAtMjAzNzI4LDYgKzIwNDQ0OCwzNiBAQAogPHBhcmFtZXRlciBuYW1lPSJvdXRTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2F2ZVdlYkFyY2hpdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmaWxlbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzYXZlV2ViQXJjaGl2ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJhc2VuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdXRvbmFtZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQud2Via2l0LlZhbHVlQ2FsbGJhY2smbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Q2VydGlmaWNhdGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNTMwMiw2ICsyMDYwNTIsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYm91bmRQb3NpdGlvbiIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNtb290aFNjcm9sbFRvUG9zaXRpb25Gcm9tVG9wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idmVyaWZ5RHJhd2FibGUiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMzQxNyw2ICsyMTQxODIsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDb250ZW50V2lkdGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3aWR0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEhlaWdodCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIyMzc4LDYgKzIyMzE1NiwxMDggQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iVGV4dFZpZXcuQ3Vyc29yQ29udHJvbGxlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZHJhdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FudmFzIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRPZmZzZXRYIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRPZmZzZXRZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uVG91Y2hFdmVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZVBvc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkZBREVfT1VUX0RVUkFUSU9OIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDAwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IlRleHRWaWV3Lk9uRWRpdG9yQWN0aW9uTGlzdGVuZXIiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJ0cnVlIgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA3NTk0OGE1Li4xMDY2OGE0IDEwMDY0NAotLS0gYS9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtMTAzMSw2ICsxMDMxLDcgQEAKICAgICAgICAgICAgIG1IYXJkd2FyZS0+Z2V0UmF3SGVhcCgpKTsKIAogICAgICAgICBtU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlcnMpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAgICAgfQogCiAgICAgbUxvY2sudW5sb2NrKCk7CmRpZmYgLS1naXQgYS9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhIGIvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YQppbmRleCAzMDE4ODNmLi5mYjYwZmRmIDEwMDY0NAotLS0gYS9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhCisrKyBiL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEKQEAgLTk4LDYgKzk4LDggQEAKICAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QoKTsKICAgICAgICAgfSBlbHNlIGlmIChvcC5lcXVhbHMoInByb2ZpbGUiKSkgewogICAgICAgICAgICAgcnVuUHJvZmlsZSgpOworICAgICAgICB9IGVsc2UgaWYgKG9wLmVxdWFscygiZHVtcGhlYXAiKSkgeworICAgICAgICAgICAgcnVuRHVtcEhlYXAoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY29tbWFuZDogIiArIG9wKTsKICAgICAgICAgfQpAQCAtNDI0LDYgKzQyNiwyOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkR1bXBIZWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gbWFuYWdlZCA9ICEiLW4iLmVxdWFscyhuZXh0T3B0aW9uKCkpOworICAgICAgICBTdHJpbmcgcHJvY2VzcyA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICBTdHJpbmcgaGVhcEZpbGUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmZCA9IFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGhlYXBGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9DUkVBVEUgfAorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1RSVU5DQVRFIHwKKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX1dSSVRFKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6IFVuYWJsZSB0byBvcGVuIGZpbGU6ICIgKyBoZWFwRmlsZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1BbS5kdW1wSGVhcChwcm9jZXNzLCBtYW5hZ2VkLCBoZWFwRmlsZSwgZmQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQW5kcm9pZEV4Y2VwdGlvbigiSEVBUCBEVU1QIEZBSUxFRCBvbiBwcm9jZXNzICIgKyBwcm9jZXNzKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgSW50ZW50UmVjZWl2ZXIgZXh0ZW5kcyBJSW50ZW50UmVjZWl2ZXIuU3R1YiB7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQgPSBmYWxzZTsKIApAQCAtNTkzLDYgKzYxNyw4IEBACiAgICAgICAgICAgICAgICAgIlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICBzdGFydCBwcm9maWxpbmc6IGFtIHByb2ZpbGUgPFBST0NFU1M+IHN0YXJ0IDxGSUxFPlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICBzdG9wIHByb2ZpbGluZzogYW0gcHJvZmlsZSA8UFJPQ0VTUz4gc3RvcFxuIiArCisgICAgICAgICAgICAgICAgIiAgICBkdW1wIGhlYXA6IGFtIGR1bXBoZWFwIFtmbGFnc10gPFBST0NFU1M+IDxGSUxFPlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgLW46IGR1bXAgbmF0aXZlIGhlYXAgaW5zdGVhZCBvZiBtYW5hZ2VkIGhlYXBcbiIgKwogICAgICAgICAgICAgICAgICJcbiIgKwogICAgICAgICAgICAgICAgICIgICAgPElOVEVOVD4gc3BlY2lmaWNhdGlvbnMgaW5jbHVkZSB0aGVzZSBmbGFnczpcbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIFstYSA8QUNUSU9OPl0gWy1kIDxEQVRBX1VSST5dIFstdCA8TUlNRV9UWVBFPl1cbiIgKwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDMzNjk2ZjQuLjlhOTcyODQgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTcsNyArNyw3IEBACiAJU2luZVNvdXJjZS5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlidXRpbHMgbGliYmluZGVyCisJbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKaW5kZXggODc3YjkwOC4uYjdhM2Y5OSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKQEAgLTM4LDYgKzM4LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CisKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdGF0aWMgbG9uZyBnTnVtUmVwZXRpdGlvbnM7CkBAIC00NSw2ICs0OCw4IEBACiBzdGF0aWMgbG9uZyBnUmVwcm9kdWNlQnVnOyAgLy8gaWYgbm90IC0xLgogc3RhdGljIGJvb2wgZ1ByZWZlclNvZnR3YXJlQ29kZWM7CiBzdGF0aWMgYm9vbCBnUGxheWJhY2tBdWRpbzsKK3N0YXRpYyBib29sIGdXcml0ZU1QNDsKK3N0YXRpYyBTdHJpbmc4IGdXcml0ZU1QNEZpbGVuYW1lOwogCiBzdGF0aWMgaW50NjRfdCBnZXROb3dVcygpIHsKICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKQEAgLTI1OCw2ICsyNjMsMjEgQEAKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIHdyaXRlU291cmNlVG9NUDQoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBzcDxNUEVHNFdyaXRlcj4gd3JpdGVyID0KKyAgICAgICAgbmV3IE1QRUc0V3JpdGVyKGdXcml0ZU1QNEZpbGVuYW1lLnN0cmluZygpKTsKKworICAgIENIRUNLX0VRKHdyaXRlci0+YWRkU291cmNlKHNvdXJjZSksIE9LKTsKKworICAgIHNwPE1ldGFEYXRhPiBwYXJhbXMgPSBuZXcgTWV0YURhdGE7CisgICAgQ0hFQ0tfRVEod3JpdGVyLT5zdGFydCgpLCBPSyk7CisKKyAgICB3aGlsZSAoIXdyaXRlci0+cmVhY2hlZEVPUygpKSB7CisgICAgICAgIHVzbGVlcCgxMDAwMDApOworICAgIH0KKyAgICB3cml0ZXItPnN0b3AoKTsKK30KKwogc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqbWUpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlc1xuIiwgbWUpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1oKGVscClcbiIpOwpAQCAtMjcwLDYgKzI5MCw3IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXQoaHVtYm5haWwpIGV4dHJhY3QgdmlkZW8gdGh1bWJuYWlsIG9yIGFsYnVtIGFydFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXMob2Z0d2FyZSkgcHJlZmVyIHNvZnR3YXJlIGNvZGVjXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtbyBwbGF5YmFjayBhdWRpb1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXcocml0ZSkgZmlsZW5hbWUgKHdyaXRlIHRvIC5tcDQgZmlsZSlcbiIpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKQEAgLTI4NCw5ICszMDUsMTAgQEAKICAgICBnUmVwcm9kdWNlQnVnID0gLTE7CiAgICAgZ1ByZWZlclNvZnR3YXJlQ29kZWMgPSBmYWxzZTsKICAgICBnUGxheWJhY2tBdWRpbyA9IGZhbHNlOworICAgIGdXcml0ZU1QNCA9IGZhbHNlOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFuOmxtOmI6cHRzbyIpKSA+PSAwKSB7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhbjpsbTpiOnB0c293OiIpKSA+PSAwKSB7CiAgICAgICAgIHN3aXRjaCAocmVzKSB7CiAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgIHsKQEAgLTMyMiw2ICszNDQsMTMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ1dyaXRlTVA0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBnV3JpdGVNUDRGaWxlbmFtZS5zZXRUbyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlICdwJzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBkdW1wUHJvZmlsZXMgPSB0cnVlOwpAQCAtNTU0LDcgKzU4MywxMSBAQAogICAgICAgICAgICAgbWVkaWFTb3VyY2UgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOwogICAgICAgICB9CiAKLSAgICAgICAgcGxheVNvdXJjZSgmY2xpZW50LCBtZWRpYVNvdXJjZSk7CisgICAgICAgIGlmIChnV3JpdGVNUDQpIHsKKyAgICAgICAgICAgIHdyaXRlU291cmNlVG9NUDQobWVkaWFTb3VyY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGxheVNvdXJjZSgmY2xpZW50LCBtZWRpYVNvdXJjZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBjbGllbnQuZGlzY29ubmVjdCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhCmluZGV4IDY3MTMzZTAuLmQwYjNhYzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEKQEAgLTIwNiw5ICsyMDYsMTEgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlLgogICAgICAqIAorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoKQogICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlKQogICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlLCBDaGFyU2VxdWVuY2UpCiAgICAgICogQHNlZSAjc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlcikKKyAgICAgKiBAc2VlICNzZXRUYWJOYXZpZ2F0aW9uTW9kZSgpCiAgICAgICogQHNlZSAjc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldykKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE5hdmlnYXRpb25Nb2RlKCk7CkBAIC0yMTcsMTAgKzIxOSw5OCBAQAogICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IG9mIGRpc3BsYXkgb3B0aW9ucy4gCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXREaXNwbGF5T3B0aW9ucygpOwotICAgIAorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBjb250ZXh0IG1vZGUgY29udHJvbGxlZCBieSA8Y29kZT5jYWxsYmFjazwvY29kZT4uCisgICAgICogVGhlIHtAbGluayBDb250ZXh0TW9kZUNhbGxiYWNrfSB3aWxsIHJlY2VpdmUgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgdGhlIGR1cmF0aW9uCisgICAgICogb2YgdGhlIGNvbnRleHQgbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBoYW5kbGVyIHRoYXQgd2lsbCBtYW5hZ2UgdGhpcyBjb250ZXh0IG1vZGUuCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRDb250ZXh0TW9kZShDb250ZXh0TW9kZUNhbGxiYWNrIGNhbGxiYWNrKTsKKworICAgIC8qKgorICAgICAqIEZpbmlzaCB0aGUgY3VycmVudCBjb250ZXh0IG1vZGUuCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZmluaXNoQ29udGV4dE1vZGUoKTsKLSAgICAKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAc2VlICNhZGRUYWIoVGFiKQorICAgICAqIEBzZWUgI2luc2VydFRhYihUYWIsIGludCkKKyAgICAgKiBAc2VlICNyZW1vdmVUYWIoVGFiKQorICAgICAqIEBzZWUgI3JlbW92ZVRhYkF0KGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUYWJOYXZpZ2F0aW9uTW9kZSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gdGFiYmVkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgSWQgb2YgdGhlIGNvbnRhaW5lciB2aWV3IHdoZXJlIHRhYiBjb250ZW50IGZyYWdtZW50cyBzaG91bGQgYXBwZWFyLgorICAgICAqCisgICAgICogQHNlZSAjYWRkVGFiKFRhYikKKyAgICAgKiBAc2VlICNpbnNlcnRUYWIoVGFiLCBpbnQpCisgICAgICogQHNlZSAjcmVtb3ZlVGFiKFRhYikKKyAgICAgKiBAc2VlICNyZW1vdmVUYWJBdChpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFiTmF2aWdhdGlvbk1vZGUoaW50IGNvbnRhaW5lclZpZXdJZCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyB7QGxpbmsgVGFifS4KKyAgICAgKiBUaGlzIHRhYiB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgYWN0aW9uIGJhciB1bnRpbCBpdCBpcyBhZGRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBuZXcgVGFiCisgICAgICoKKyAgICAgKiBAc2VlICNhZGRUYWIoVGFiKQorICAgICAqIEBzZWUgI2luc2VydFRhYihUYWIsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVGFiIG5ld1RhYigpOworCisgICAgLyoqCisgICAgICogQWRkIGEgdGFiIGZvciB1c2UgaW4gdGFiYmVkIG5hdmlnYXRpb24gbW9kZS4gVGhlIHRhYiB3aWxsIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRhYiB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRUYWIoVGFiIHRhYik7CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnQgYSB0YWIgZm9yIHVzZSBpbiB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlLiBUaGUgdGFiIHdpbGwgYmUgaW5zZXJ0ZWQgYXQKKyAgICAgKiA8Y29kZT5wb3NpdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRoZSB0YWIgdG8gYWRkCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIHRhYgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluc2VydFRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgdGFiIGZyb20gdGhlIGFjdGlvbiBiYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRoZSB0YWIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlVGFiKFRhYiB0YWIpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgdGFiIGZyb20gdGhlIGFjdGlvbiBiYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIHRhYiB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVUYWJBdChpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBzcGVjaWZpZWQgdGFiLiBJZiBpdCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIGFjdGlvbiBiYXIgaXQgd2lsbCBiZSBhZGRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGFiIHRvIHNlbGVjdAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbGVjdFRhYihUYWIgdGFiKTsKKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgdGFiIGF0IDxjb2RlPnBvc2l0aW9uPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFBvc2l0aW9uIG9mIHRoZSB0YWIgdG8gc2VsZWN0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VsZWN0VGFiQXQoaW50IHBvc2l0aW9uKTsKKwogICAgIC8qKgogICAgICAqIFJlcHJlc2VudHMgYSBjb250ZXh0dWFsIG1vZGUgb2YgdGhlIEFjdGlvbiBCYXIuIENvbnRleHQgbW9kZXMgY2FuIGJlIHVzZWQgZm9yCiAgICAgICogbW9kYWwgaW50ZXJhY3Rpb25zIHdpdGggYWN0aXZpdHkgY29udGVudCBhbmQgcmVwbGFjZSB0aGUgbm9ybWFsIEFjdGlvbiBCYXIgdW50aWwgZmluaXNoZWQuCkBAIC0zNTAsNCArNDQwLDc0IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQoaW50IGl0ZW1Qb3NpdGlvbiwgbG9uZyBpdGVtSWQpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdGFiIGluIHRoZSBhY3Rpb24gYmFyLgorICAgICAqCisgICAgICogPHA+VGFicyBtYW5hZ2UgdGhlIGhpZGluZyBhbmQgc2hvd2luZyBvZiB7QGxpbmsgRnJhZ21lbnR9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRhYiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBpbnZhbGlkIHBvc2l0aW9uIGZvciBhIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZ2V0UG9zaXRpb24oKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QT1NJVElPTiA9IC0xOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhpcyB0YWIgaW4gdGhlIGFjdGlvbiBiYXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQ3VycmVudCBwb3NpdGlvbiwgb3Ige0BsaW5rICNJTlZBTElEX1BPU0lUSU9OfSBpZiB0aGlzIHRhYiBpcyBub3QgY3VycmVudGx5IGluCisgICAgICAgICAqICAgICAgICAgdGhlIGFjdGlvbiBiYXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBvc2l0aW9uKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHRhYidzIGljb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBEcmF3YWJsZSBnZXRJY29uKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgdGV4dCBvZiB0aGlzIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgdGFiJ3MgdGV4dAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRUZXh0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgaWNvbiBkaXNwbGF5ZWQgb24gdGhpcyB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpY29uIFRoZSBkcmF3YWJsZSB0byB1c2UgYXMgYW4gaWNvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB0ZXh0IGRpc3BsYXllZCBvbiB0aGlzIHRhYi4gVGV4dCBtYXkgYmUgdHJ1bmNhdGVkIGlmIHRoZXJlIGlzIG5vdAorICAgICAgICAgKiByb29tIHRvIGRpc3BsYXkgdGhlIGVudGlyZSBzdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGRpc3BsYXkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRleHQoQ2hhclNlcXVlbmNlIHRleHQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBmcmFnbWVudCB0aGF0IHdpbGwgYmUgc2hvd24gd2hlbiB0aGlzIHRhYiBpcyBzZWxlY3RlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBGcmFnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBGcmFnbWVudCBnZXRGcmFnbWVudCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGZyYWdtZW50IHRoYXQgd2lsbCBiZSBzaG93biB3aGVuIHRoaXMgdGFiIGlzIHNlbGVjdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZnJhZ21lbnQgRnJhZ21lbnQgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyB0YWIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2VsZWN0IHRoaXMgdGFiLiBPbmx5IHZhbGlkIGlmIHRoZSB0YWIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGFjdGlvbiBiYXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWxlY3QoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCmluZGV4IDg4MjViOGMuLjIwMjcyZGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCkBAIC02MzUsNiArNjM1LDcgQEAKICAgICAvKnBhY2thZ2UqLyBBY3Rpdml0eVRocmVhZCBtTWFpblRocmVhZDsKICAgICBBY3Rpdml0eSBtUGFyZW50OwogICAgIGJvb2xlYW4gbUNhbGxlZDsKKyAgICBib29sZWFuIG1TdGFydGVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzdW1lZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BwZWQ7CiAgICAgYm9vbGVhbiBtRmluaXNoZWQ7CkBAIC02NDksNiArNjUwLDcgQEAKICAgICAgICAgT2JqZWN0IGFjdGl2aXR5OwogICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZHJlbjsKICAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHM7CisgICAgICAgIFNwYXJzZUFycmF5PExvYWRlck1hbmFnZXI+IGxvYWRlcnM7CiAgICAgfQogICAgIC8qIHBhY2thZ2UgKi8gTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXM7CiAgICAgCkBAIC02NjYsNiArNjY4LDkgQEAKIAogICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlciBtRnJhZ21lbnRzID0gbmV3IEZyYWdtZW50TWFuYWdlcigpOwogICAgIAorICAgIFNwYXJzZUFycmF5PExvYWRlck1hbmFnZXI+IG1BbGxMb2FkZXJNYW5hZ2VyczsKKyAgICBMb2FkZXJNYW5hZ2VyIG1Mb2FkZXJNYW5hZ2VyOworICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1hbmFnZWRDdXJzb3IgewogICAgICAgICBNYW5hZ2VkQ3Vyc29yKEN1cnNvciBjdXJzb3IpIHsKICAgICAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CkBAIC03NjMsNiArNzY4LDI5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2FkZXJNYW5hZ2VyIGZvciB0aGlzIGZyYWdtZW50LCBjcmVhdGluZyBpdCBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIExvYWRlck1hbmFnZXIgZ2V0TG9hZGVyTWFuYWdlcigpIHsKKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9hZGVyTWFuYWdlcjsKKyAgICAgICAgfQorICAgICAgICBtTG9hZGVyTWFuYWdlciA9IGdldExvYWRlck1hbmFnZXIoLTEsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoaW50IGluZGV4LCBib29sZWFuIHN0YXJ0ZWQpIHsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMgPSBuZXcgU3BhcnNlQXJyYXk8TG9hZGVyTWFuYWdlcj4oKTsKKyAgICAgICAgfQorICAgICAgICBMb2FkZXJNYW5hZ2VyIGxtID0gbUFsbExvYWRlck1hbmFnZXJzLmdldChpbmRleCk7CisgICAgICAgIGlmIChsbSA9PSBudWxsKSB7CisgICAgICAgICAgICBsbSA9IG5ldyBMb2FkZXJNYW5hZ2VyKHN0YXJ0ZWQpOworICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnB1dChpbmRleCwgbG0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsbTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogQ2FsbHMge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3cjZ2V0Q3VycmVudEZvY3VzfSBvbiB0aGUKICAgICAgKiBXaW5kb3cgb2YgdGhpcyBBY3Rpdml0eSB0byByZXR1cm4gdGhlIGN1cnJlbnRseSBmb2N1c2VkIHZpZXcuCiAgICAgICogCkBAIC04MTYsNiArODQ0LDkgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIG1WaXNpYmxlRnJvbUNsaWVudCA9ICFtV2luZG93LmdldFdpbmRvd1N0eWxlKCkuZ2V0Qm9vbGVhbigKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93Tm9EaXNwbGF5LCBmYWxzZSk7CisgICAgICAgIGlmIChtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzID0gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmxvYWRlcnM7CisgICAgICAgIH0KICAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBQYXJjZWxhYmxlIHAgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0UGFyY2VsYWJsZShGUkFHTUVOVFNfVEFHKTsKICAgICAgICAgICAgIG1GcmFnbWVudHMucmVzdG9yZUFsbFN0YXRlKHAsIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsCkBAIC05NTgsNiArOTg5LDEwIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydCgpIHsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RhcnQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ5NSw3ICsxNTMwLDIwIEBACiAgICAgICAgIE9iamVjdCBhY3Rpdml0eSA9IG9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCk7CiAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkcmVuID0gb25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKICAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHMgPSBtRnJhZ21lbnRzLnJldGFpbk5vbkNvbmZpZygpOwotICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCAmJiBjaGlsZHJlbiA9PSBudWxsICYmIGZyYWdtZW50cyA9PSBudWxsKSB7CisgICAgICAgIGJvb2xlYW4gcmV0YWluTG9hZGVycyA9IGZhbHNlOworICAgICAgICBpZiAobUFsbExvYWRlck1hbmFnZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHBydW5lIG91dCBhbnkgbG9hZGVyIG1hbmFnZXJzIHRoYXQgd2VyZSBhbHJlYWR5IHN0b3BwZWQsIHNvCisgICAgICAgICAgICAvLyBoYXZlIG5vdGhpbmcgdXNlZnVsIHRvIHJldGFpbi4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFsbExvYWRlck1hbmFnZXJzLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyIGxtID0gbUFsbExvYWRlck1hbmFnZXJzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxtLm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0YWluTG9hZGVycyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCAmJiBjaGlsZHJlbiA9PSBudWxsICYmIGZyYWdtZW50cyA9PSBudWxsICYmICFyZXRhaW5Mb2FkZXJzKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICAKQEAgLTE1MDMsNiArMTU1MSw3IEBACiAgICAgICAgIG5jaS5hY3Rpdml0eSA9IGFjdGl2aXR5OwogICAgICAgICBuY2kuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICAgICAgICAgbmNpLmZyYWdtZW50cyA9IGZyYWdtZW50czsKKyAgICAgICAgbmNpLmxvYWRlcnMgPSBtQWxsTG9hZGVyTWFuYWdlcnM7CiAgICAgICAgIHJldHVybiBuY2k7CiAgICAgfQogICAgIApAQCAtMTUxOSw2ICsxNTY4LDE0IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgRnJhZ21lbnQgaXMgYmVpbmcgYXR0YWNoZWQgdG8gdGhpcyBhY3Rpdml0eSwgaW1tZWRpYXRlbHkKKyAgICAgKiBhZnRlciB0aGUgY2FsbCB0byBpdHMge0BsaW5rIEZyYWdtZW50I29uQXR0YWNoIEZyYWdtZW50Lm9uQXR0YWNoKCl9CisgICAgICogbWV0aG9kIGFuZCBiZWZvcmUge0BsaW5rIEZyYWdtZW50I29uQ3JlYXRlIEZyYWdtZW50Lm9uQ3JlYXRlKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogV3JhcHBlciBhcm91bmQKICAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI3F1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpfQogICAgICAqIHRoYXQgZ2l2ZXMgdGhlIHJlc3VsdGluZyB7QGxpbmsgQ3Vyc29yfSB0byBjYWxsCkBAIC0xNjc2LDExICsxNzMzLDExIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRBY3Rpb25CYXIoKSB7CiAgICAgICAgIFdpbmRvdyB3aW5kb3cgPSBnZXRXaW5kb3coKTsKLSAgICAgICAgaWYgKCF3aW5kb3cuaGFzRmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKSkgeworICAgICAgICBpZiAoIXdpbmRvdy5oYXNGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpIHx8IG1BY3Rpb25CYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBtQWN0aW9uQmFyID0gbmV3IEFjdGlvbkJhckltcGwoZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkpOworICAgICAgICBtQWN0aW9uQmFyID0gbmV3IEFjdGlvbkJhckltcGwodGhpcyk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMjA2MCwxMyArMjExNyw2IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25Db250ZW50Q2hhbmdlZCgpIHsKLSAgICAgICAgLy8gRmlyc3QgdGltZSBjb250ZW50IGlzIGF2YWlsYWJsZSwgbGV0IHRoZSBmcmFnbWVudCBtYW5hZ2VyCi0gICAgICAgIC8vIGF0dGFjaCBhbGwgb2YgdGhlIGZyYWdtZW50cyB0byBpdC4gIERvbid0IGRvIHRoaXMgaWYgdGhlCi0gICAgICAgIC8vIGFjdGl2aXR5IGlzIG5vIGxvbmdlciBhdHRhY2hlZCAoYmVjYXVzZSBpdCBpcyBiZWluZyBkZXN0cm95ZWQpLgotICAgICAgICBpZiAobUZyYWdtZW50cy5tQ3VyU3RhdGUgPCBGcmFnbWVudC5DT05URU5UCi0gICAgICAgICAgICAgICAgJiYgbUZyYWdtZW50cy5tQWN0aXZpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgbUZyYWdtZW50cy5tb3ZlVG9TdGF0ZShGcmFnbWVudC5DT05URU5ULCBmYWxzZSk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTQwMjQsNiArNDA3NCw3IEBACiAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1DcmVhdGUoQnVuZGxlIGljaWNsZSkgewogICAgICAgICBvbkNyZWF0ZShpY2ljbGUpOworICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoQWN0aXZpdHlDcmVhdGVkKCk7CiAgICAgfQogICAgIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVN0YXJ0KCkgewpAQCAtNDAzNiw2ICs0MDg3LDExIEBACiAgICAgICAgICAgICAgICAgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0YXJ0KCkiKTsKICAgICAgICAgfQogICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoU3RhcnQoKTsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPW1BbGxMb2FkZXJNYW5hZ2Vycy5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnZhbHVlQXQoaSkuZmluaXNoUmV0YWluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUmVzdGFydCgpIHsKQEAgLTQxMDcsNiArNDE2MywxNyBAQAogICAgIH0KICAgICAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1TdG9wKCkgeworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICghbUNoYW5naW5nQ29uZmlndXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdG9wKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9SZXRhaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIGlmICghbVN0b3BwZWQpIHsKICAgICAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtV2luZG93LmNsb3NlQWxsUGFuZWxzKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKaW5kZXggMWZlODVlNi4uNDNhMDhiNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQpAQCAtMTI5NCw2ICsxMjk0LDE5IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRFVNUF9IRUFQX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIFN0cmluZyBwcm9jZXNzID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBib29sZWFuIG1hbmFnZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkgOiBudWxsOworICAgICAgICAgICAgYm9vbGVhbiByZXMgPSBkdW1wSGVhcChwcm9jZXNzLCBtYW5hZ2VkLCBwYXRoLCBmZCk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludChyZXMgPyAxIDogMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC0yODc0LDYgKzI4ODcsMjggQEAKICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CiAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgYm9vbGVhbiBkdW1wSGVhcChTdHJpbmcgcHJvY2VzcywgYm9vbGVhbiBtYW5hZ2VkLAorICAgICAgICAgICAgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocHJvY2Vzcyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQobWFuYWdlZCA/IDEgOiAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwYXRoKTsKKyAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBmZC53cml0ZVRvUGFyY2VsKGRhdGEsIFBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgwKTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KERVTVBfSEVBUF9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gcmVzID0gcmVwbHkucmVhZEludCgpICE9IDA7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgcHJpdmF0ZSBJQmluZGVyIG1SZW1vdGU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCmluZGV4IGQ3ODhiZTguLmFhMjA3ZTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCkBAIC0zNTYsNiArMzU2LDExIEBACiAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIER1bXBIZWFwRGF0YSB7CisgICAgICAgIFN0cmluZyBwYXRoOworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZDsKKyAgICB9CisKICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEFwcGxpY2F0aW9uVGhyZWFkIGV4dGVuZHMgQXBwbGljYXRpb25UaHJlYWROYXRpdmUgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBUF9DT0xVTU4gPSAiJTE3cyAlOHMgJThzICU4cyAlOHMiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX0NPVU5UX0NPTFVNTiA9ICIlMTdzICU4ZCI7CkBAIC02MjMsNiArNjI4LDEzIEBACiAgICAgICAgICAgICBxdWV1ZU9yU2VuZE1lc3NhZ2UoSC5QUk9GSUxFUl9DT05UUk9MLCBwY2QsIHN0YXJ0ID8gMSA6IDApOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZHVtcEhlYXAoYm9vbGVhbiBtYW5hZ2VkLCBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHsKKyAgICAgICAgICAgIER1bXBIZWFwRGF0YSBkaGQgPSBuZXcgRHVtcEhlYXBEYXRhKCk7CisgICAgICAgICAgICBkaGQucGF0aCA9IHBhdGg7CisgICAgICAgICAgICBkaGQuZmQgPSBmZDsKKyAgICAgICAgICAgIHF1ZXVlT3JTZW5kTWVzc2FnZShILkRVTVBfSEVBUCwgZGhkLCBtYW5hZ2VkID8gMSA6IDApOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgc2V0U2NoZWR1bGluZ0dyb3VwKGludCBncm91cCkgewogICAgICAgICAgICAgLy8gTm90ZTogZG8gdGhpcyBpbW1lZGlhdGVseSwgc2luY2UgZ29pbmcgaW50byB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgLy8gc2hvdWxkIGhhcHBlbiByZWdhcmRsZXNzIG9mIHdoYXQgcGVuZGluZyB3b3JrIHdlIGhhdmUgdG8gZG8KQEAgLTg3NCw2ICs4ODYsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfSklUICAgICAgICAgICAgICA9IDEzMjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1QgPSAxMzM7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX0NSQVNIICAgICAgICAgID0gMTM0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVU1QX0hFQVAgICAgICAgICAgICAgICA9IDEzNTsKICAgICAgICAgU3RyaW5nIGNvZGVUb1N0cmluZyhpbnQgY29kZSkgewogICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgewogICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgewpAQCAtOTEyLDYgKzkyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRU5BQkxFX0pJVDogcmV0dXJuICJFTkFCTEVfSklUIjsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNQQVRDSF9QQUNLQUdFX0JST0FEQ0FTVDogcmV0dXJuICJESVNQQVRDSF9QQUNLQUdFX0JST0FEQ0FTVCI7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0NIRURVTEVfQ1JBU0g6IHJldHVybiAiU0NIRURVTEVfQ1JBU0giOworICAgICAgICAgICAgICAgICAgICBjYXNlIERVTVBfSEVBUDogcmV0dXJuICJEVU1QX0hFQVAiOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAiKHVua25vd24pIjsKQEAgLTEwMzcsNiArMTA1MSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0NIRURVTEVfQ1JBU0g6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVTZXJ2aWNlRXhjZXB0aW9uKChTdHJpbmcpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUR1bXBIZWFwKG1zZy5hcmcxICE9IDAsIChEdW1wSGVhcERhdGEpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMwMTUsNiArMzAzMiwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBoYW5kbGVEdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIER1bXBIZWFwRGF0YSBkaGQpIHsKKyAgICAgICAgaWYgKG1hbmFnZWQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRGVidWcuZHVtcEhwcm9mRGF0YShkaGQucGF0aCwgZGhkLmZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJNYW5hZ2VkIGhlYXAgZHVtcCBmYWlsZWQgb24gcGF0aCAiICsgZGhkLnBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtLSBjYW4gdGhlIHByb2Nlc3MgYWNjZXNzIHRoaXMgcGF0aD8iKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGhkLmZkLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbHVyZSBjbG9zaW5nIHByb2ZpbGUgZmQiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEZWJ1Zy5kdW1wTmF0aXZlSGVhcChkaGQuZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBmaW5hbCB2b2lkIGhhbmRsZURpc3BhdGNoUGFja2FnZUJyb2FkY2FzdChpbnQgY21kLCBTdHJpbmdbXSBwYWNrYWdlcykgewogICAgICAgICBib29sZWFuIGhhc1BrZ0luZm8gPSBmYWxzZTsKICAgICAgICAgaWYgKHBhY2thZ2VzICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKaW5kZXggMWMyMDA2Mi4uZGMyMTQ1ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKQEAgLTQwMyw2ICs0MDMsMTcgQEAKICAgICAgICAgICAgIHNjaGVkdWxlQ3Jhc2gobXNnKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEVU1QX0hFQVBfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQXBwbGljYXRpb25UaHJlYWQuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBib29sZWFuIG1hbmFnZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkgOiBudWxsOworICAgICAgICAgICAgZHVtcEhlYXAobWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC04MjksNSArODQwLDIyIEBACiAgICAgICAgIGRhdGEucmVjeWNsZSgpOwogICAgICAgICAKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBcHBsaWNhdGlvblRocmVhZC5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZUludChtYW5hZ2VkID8gMSA6IDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHBhdGgpOworICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKKyAgICAgICAgICAgIGZkLndyaXRlVG9QYXJjZWwoZGF0YSwgUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoRFVNUF9IRUFQX1RSQU5TQUNUSU9OLCBkYXRhLCBudWxsLAorICAgICAgICAgICAgICAgIElCaW5kZXIuRkxBR19PTkVXQVkpOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKaW5kZXggNGZmOGUxYS4uNmU5NTg2YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKQEAgLTUzLDcgKzUzLDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VQYXJzZXIuUGFja2FnZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwpAQCAtNjgsNiArNjcsNyBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuRG93bmxvYWRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LlRocm90dGxlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JVGhyb3R0bGVNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKQEAgLTg2LDExICs4Niw5IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TdGF0RnM7CiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlscy5GaWxlU3RhdHVzOwogaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uOwpAQCAtMjAwLDYgKzE5OCw3IEBACiAgICAgcHJpdmF0ZSBEcm9wQm94TWFuYWdlciBtRHJvcEJveE1hbmFnZXIgPSBudWxsOwogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlciA9IG51bGw7CiAgICAgcHJpdmF0ZSBVaU1vZGVNYW5hZ2VyIG1VaU1vZGVNYW5hZ2VyID0gbnVsbDsKKyAgICBwcml2YXRlIERvd25sb2FkTWFuYWdlciBtRG93bmxvYWRNYW5hZ2VyID0gbnVsbDsKIAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1TeW5jID0gbmV3IE9iamVjdCgpOwogCkBAIC0yMDksNyArMjA4LDcgQEAKICAgICBwcml2YXRlIEZpbGUgbUNhY2hlRGlyOwogICAgIHByaXZhdGUgRmlsZSBtRXh0ZXJuYWxGaWxlc0RpcjsKICAgICBwcml2YXRlIEZpbGUgbUV4dGVybmFsQ2FjaGVEaXI7Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0ZJTEVfTElTVCA9IHt9OwpAQCAtMjYxLDE4ICsyNjAsMTggQEAKICAgICBwdWJsaWMgTG9vcGVyIGdldE1haW5Mb29wZXIoKSB7CiAgICAgICAgIHJldHVybiBtTWFpblRocmVhZC5nZXRMb29wZXIoKTsKICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ29udGV4dCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSB7CiAgICAgICAgIHJldHVybiAobVBhY2thZ2VJbmZvICE9IG51bGwpID8KICAgICAgICAgICAgICAgICBtUGFja2FnZUluZm8uZ2V0QXBwbGljYXRpb24oKSA6IG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uKCk7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VGhlbWUoaW50IHJlc2lkKSB7CiAgICAgICAgIG1UaGVtZVJlc291cmNlID0gcmVzaWQ7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFJlc291cmNlcy5UaGVtZSBnZXRUaGVtZSgpIHsKICAgICAgICAgaWYgKG1UaGVtZSA9PSBudWxsKSB7CkBAIC0zMjIsNyArMzIxLDcgQEAKICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBzeXN0ZW0gY29udGV4dCIpOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIEZpbGUgbWFrZUJhY2t1cEZpbGUoRmlsZSBwcmVmc0ZpbGUpIHsKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHByZWZzRmlsZS5nZXRQYXRoKCkgKyAiLmJhayIpOwogICAgIH0KQEAgLTM0Miw3ICszNDEsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBzcDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyID0gbnVsbDsKICAgICAgICAgRmlsZSBiYWNrdXAgPSBtYWtlQmFja3VwRmlsZShmKTsKICAgICAgICAgaWYgKGJhY2t1cC5leGlzdHMoKSkgewpAQCAtMzU0LDcgKzM1Myw3IEBACiAgICAgICAgIGlmIChmLmV4aXN0cygpICYmICFmLmNhblJlYWQoKSkgewogICAgICAgICAgICAgTG9nLncoVEFHLCAiQXR0ZW1wdCB0byByZWFkIHByZWZlcmVuY2VzIGZpbGUgIiArIGYgKyAiIHdpdGhvdXQgcGVybWlzc2lvbiIpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIE1hcCBtYXAgPSBudWxsOwogICAgICAgICBpZiAoZi5leGlzdHMoKSAmJiBmLmNhblJlYWQoKSkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTQzOCw3ICs0MzcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFtRmlsZXNEaXIuZXhpc3RzKCkpIHsKICAgICAgICAgICAgICAgICBpZighbUZpbGVzRGlyLm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBjcmVhdGUgZmlsZXMgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBjcmVhdGUgZmlsZXMgZGlyZWN0b3J5ICIgKyBtRmlsZXNEaXIuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zZXRQZXJtaXNzaW9ucygKQEAgLTQ0OSw3ICs0NDgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1GaWxlc0RpcjsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlIGdldEV4dGVybmFsRmlsZXNEaXIoU3RyaW5nIHR5cGUpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewpAQCAtNDgxLDcgKzQ4MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZGlyOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgZ2V0Q2FjaGVEaXIoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKQEAgLTUwMSw3ICs1MDAsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtQ2FjaGVEaXI7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgZ2V0RXh0ZXJuYWxDYWNoZURpcigpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewpAQCAtNTIzLDcgKzUyMiw3IEBACiAgICAgICAgICAgICByZXR1cm4gbUV4dGVybmFsQ2FjaGVEaXI7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmlsZSBnZXRGaWxlU3RyZWFtUGF0aChTdHJpbmcgbmFtZSkgewogICAgICAgICByZXR1cm4gbWFrZUZpbGVuYW1lKGdldEZpbGVzRGlyKCksIG5hbWUpOwpAQCAtNTczLDcgKzU3Miw3IEBACiAgICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QgOiBFTVBUWV9GSUxFX0xJU1Q7CiAgICAgfQogCi0gICAgCisKICAgICBwcml2YXRlIEZpbGUgZ2V0RGF0YWJhc2VzRGlyKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobURhdGFiYXNlc0RpciA9PSBudWxsKSB7CkBAIC01ODUsNyArNTg0LDcgQEAKICAgICAgICAgICAgIHJldHVybiBtRGF0YWJhc2VzRGlyOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERyYXdhYmxlIGdldFdhbGxwYXBlcigpIHsKICAgICAgICAgcmV0dXJuIGdldFdhbGxwYXBlck1hbmFnZXIoKS5nZXREcmF3YWJsZSgpOwpAQCAtNjU0LDcgKzY1Myw3IEBACiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZW5kQnJvYWRjYXN0KEludGVudCBpbnRlbnQpIHsKICAgICAgICAgU3RyaW5nIHJlc29sdmVkVHlwZSA9IGludGVudC5yZXNvbHZlVHlwZUlmTmVlZGVkKGdldENvbnRlbnRSZXNvbHZlcigpKTsKQEAgLTk4NCw2ICs5ODMsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKTsKICAgICAgICAgfSBlbHNlIGlmIChVSV9NT0RFX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0VWlNb2RlTWFuYWdlcigpOworICAgICAgICB9IGVsc2UgaWYgKERPV05MT0FEX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RG93bmxvYWRNYW5hZ2VyKCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTEyMDIsNiArMTIwMywxNSBAQAogICAgICAgICByZXR1cm4gbVVpTW9kZU1hbmFnZXI7CiAgICAgfQogCisgICAgcHJpdmF0ZSBEb3dubG9hZE1hbmFnZXIgZ2V0RG93bmxvYWRNYW5hZ2VyKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CisgICAgICAgICAgICBpZiAobURvd25sb2FkTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURvd25sb2FkTWFuYWdlciA9IG5ldyBEb3dubG9hZE1hbmFnZXIoZ2V0Q29udGVudFJlc29sdmVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtRG93bmxvYWRNYW5hZ2VyOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgY2hlY2tQZXJtaXNzaW9uKFN0cmluZyBwZXJtaXNzaW9uLCBpbnQgcGlkLCBpbnQgdWlkKSB7CiAgICAgICAgIGlmIChwZXJtaXNzaW9uID09IG51bGwpIHsKQEAgLTE1NTYsMTUgKzE1NjYsMTUgQEAKICAgICBmaW5hbCB2b2lkIHNldEFjdGl2aXR5VG9rZW4oSUJpbmRlciB0b2tlbikgewogICAgICAgICBtQWN0aXZpdHlUb2tlbiA9IHRva2VuOwogICAgIH0KLSAgICAKKwogICAgIGZpbmFsIHZvaWQgc2V0T3V0ZXJDb250ZXh0KENvbnRleHQgY29udGV4dCkgewogICAgICAgICBtT3V0ZXJDb250ZXh0ID0gY29udGV4dDsKICAgICB9Ci0gICAgCisKICAgICBmaW5hbCBDb250ZXh0IGdldE91dGVyQ29udGV4dCgpIHsKICAgICAgICAgcmV0dXJuIG1PdXRlckNvbnRleHQ7CiAgICAgfQotICAgIAorCiAgICAgZmluYWwgSUJpbmRlciBnZXRBY3Rpdml0eVRva2VuKCkgewogICAgICAgICByZXR1cm4gbUFjdGl2aXR5VG9rZW47CiAgICAgfQpAQCAtMTY0MSw3ICsxNjUxLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG1NYWluVGhyZWFkLnJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eVRocmVhZCBtTWFpblRocmVhZDsKICAgICB9CiAKQEAgLTE2NzQsNyArMTY4NCw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlBhY2thZ2UgbWFuYWdlciBoYXMgZGllZCIsIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gY2Fub25pY2FsVG9DdXJyZW50UGFja2FnZU5hbWVzKFN0cmluZ1tdIG5hbWVzKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTY4Myw3ICsxNjkzLDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGFja2FnZSBtYW5hZ2VyIGhhcyBkaWVkIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJbnRlbnQgZ2V0TGF1bmNoSW50ZW50Rm9yUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgICAgIC8vIEZpcnN0IHNlZSBpZiB0aGUgcGFja2FnZSBoYXMgYW4gSU5GTyBhY3Rpdml0eTsgdGhlIGV4aXN0ZW5jZSBvZgpAQCAtMTg1Nyw3ICsxODY3LDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGFja2FnZSBtYW5hZ2VyIGhhcyBkaWVkIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N5c3RlbUZlYXR1cmUoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xODY2LDcgKzE4NzYsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQYWNrYWdlIG1hbmFnZXIgaGFzIGRpZWQiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBjaGVja1Blcm1pc3Npb24oU3RyaW5nIHBlcm1OYW1lLCBTdHJpbmcgcGtnTmFtZSkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTE5MzgsOSArMTk0OCw5IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlBhY2thZ2UgbWFuYWdlciBoYXMgZGllZCIsIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFVpZEZvclNoYXJlZFVzZXIoU3RyaW5nIHNoYXJlZFVzZXJOYW1lKSAKKyAgICAgICAgcHVibGljIGludCBnZXRVaWRGb3JTaGFyZWRVc2VyKFN0cmluZyBzaGFyZWRVc2VyTmFtZSkKICAgICAgICAgICAgICAgICB0aHJvd3MgTmFtZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaW50IHVpZCA9IG1QTS5nZXRVaWRGb3JTaGFyZWRVc2VyKHNoYXJlZFVzZXJOYW1lKTsKQEAgLTIzNDQsNyArMjM1NCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlTmFtZSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7CiAgICAgICAgICAgICBmaW5hbCBpbnQgaWNvbklkOwpAQCAtMjUxNiw3ICsyNTI2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBcHBsaWNhdGlvblVzZXJEYXRhKFN0cmluZyBwYWNrYWdlTmFtZSwgCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyQXBwbGljYXRpb25Vc2VyRGF0YShTdHJpbmcgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgSVBhY2thZ2VEYXRhT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbVBNLmNsZWFyQXBwbGljYXRpb25Vc2VyRGF0YShwYWNrYWdlTmFtZSwgb2JzZXJ2ZXIpOwpAQCAtMjUyNSw3ICsyNTM1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlQXBwbGljYXRpb25DYWNoZUZpbGVzKFN0cmluZyBwYWNrYWdlTmFtZSwgCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUFwcGxpY2F0aW9uQ2FjaGVGaWxlcyhTdHJpbmcgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgSVBhY2thZ2VEYXRhT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbVBNLmRlbGV0ZUFwcGxpY2F0aW9uQ2FjaGVGaWxlcyhwYWNrYWdlTmFtZSwgb2JzZXJ2ZXIpOwpAQCAtMjU1MCw5ICsyNTYwLDkgQEAKICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBnZXRQYWNrYWdlU2l6ZUluZm8oU3RyaW5nIHBhY2thZ2VOYW1lLCAKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0UGFja2FnZVNpemVJbmZvKFN0cmluZyBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBJUGFja2FnZVN0YXRzT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbVBNLmdldFBhY2thZ2VTaXplSW5mbyhwYWNrYWdlTmFtZSwgb2JzZXJ2ZXIpOwpAQCAtMjU5Nyw3ICsyNjA3LDcgQEAKICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCByZXBsYWNlUHJlZmVycmVkQWN0aXZpdHkoSW50ZW50RmlsdGVyIGZpbHRlciwKICAgICAgICAgICAgICAgICBpbnQgbWF0Y2gsIENvbXBvbmVudE5hbWVbXSBzZXQsIENvbXBvbmVudE5hbWUgYWN0aXZpdHkpIHsKQEAgLTI2MTYsNyArMjYyNiw3IEBACiAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiEKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBnZXRQcmVmZXJyZWRBY3Rpdml0aWVzKExpc3Q8SW50ZW50RmlsdGVyPiBvdXRGaWx0ZXJzLAogICAgICAgICAgICAgICAgIExpc3Q8Q29tcG9uZW50TmFtZT4gb3V0QWN0aXZpdGllcywgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CkBAIC0yNjI3LDcgKzI2MzcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudEVuYWJsZWRTZXR0aW5nKENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUsIGludCBmbGFncykgewpAQCAtMjY1Nyw3ICsyNjY3LDcgQEAKICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGdldEFwcGxpY2F0aW9uRW5hYmxlZFNldHRpbmcoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMjY2OCw2ICsyNjc4LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gUGFja2FnZU1hbmFnZXIuQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfREVGQVVMVDsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlT2JiUGF0aChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1QTS5zZXRQYWNrYWdlT2JiUGF0aChwYWNrYWdlTmFtZSwgcGF0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRleHRJbXBsIG1Db250ZXh0OwogICAgICAgICBwcml2YXRlIGZpbmFsIElQYWNrYWdlTWFuYWdlciBtUE07CiAKQEAgLTI3MTQsNyArMjczMyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG1UaW1lc3RhbXAgIT0gbUZpbGVTdGF0dXMubXRpbWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcmVwbGFjZShNYXAgbmV3Q29udGVudHMpIHsKICAgICAgICAgICAgIGlmIChuZXdDb250ZW50cyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CkBAIC0yNzIyLDcgKzI3NDEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKE9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewogICAgICAgICAgICAgICAgIG1MaXN0ZW5lcnMucHV0KGxpc3RlbmVyLCBtQ29udGVudCk7CkBAIC0yOTAxLDcgKzI5MjAsNyBAQAogICAgICAgICBwdWJsaWMgRWRpdG9yIGVkaXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEVkaXRvckltcGwoKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwcml2YXRlIEZpbGVPdXRwdXRTdHJlYW0gY3JlYXRlRmlsZU91dHB1dFN0cmVhbShGaWxlIGZpbGUpIHsKICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gc3RyID0gbnVsbDsKICAgICAgICAgICAgIHRyeSB7CkBAIC0yOTM4LDcgKzI5NTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBtRmlsZS5kZWxldGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byB3cml0ZSB0aGUgZmlsZSwgZGVsZXRlIHRoZSBiYWNrdXAgYW5kIHJldHVybiB0cnVlIGFzIGF0b21pY2FsbHkgYXMKICAgICAgICAgICAgIC8vIHBvc3NpYmxlLiAgSWYgYW55IGV4Y2VwdGlvbiBvY2N1cnMsIGRlbGV0ZSB0aGUgbmV3IGZpbGU7IG5leHQgdGltZSB3ZSB3aWxsIHJlc3RvcmUKICAgICAgICAgICAgIC8vIGZyb20gdGhlIGJhY2t1cC4KQEAgLTI5NTMsNyArMjk3Miw3IEBACiAgICAgICAgICAgICAgICAgaWYgKEZpbGVVdGlscy5nZXRGaWxlU3RhdHVzKG1GaWxlLmdldFBhdGgoKSwgbUZpbGVTdGF0dXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAgPSBtRmlsZVN0YXR1cy5tdGltZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHdhcyBzdWNjZXNzZnVsLCBkZWxldGUgdGhlIGJhY2t1cCBmaWxlIGlmIHRoZXJlIGlzIG9uZS4KICAgICAgICAgICAgICAgICBtQmFja3VwRmlsZS5kZWxldGUoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKaW5kZXggMjMxZDZhYi4uNTFjY2U1ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKQEAgLTEzNCwxNCArMTM0LDE0IEBACiAgKiB0aGF0IGNhbiBiZSBwbGFjZWQgaW4gYW4ge0BsaW5rIEFjdGl2aXR5fS4KICAqLwogcHVibGljIGNsYXNzIEZyYWdtZW50IGltcGxlbWVudHMgQ29tcG9uZW50Q2FsbGJhY2tzLCBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4gc0NsYXNzTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8+PiBzQ2xhc3NNYXAgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/Pj4oKTsKICAgICAKLSAgICBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxJWklORyA9IDA7ICAvLyBOb3QgeWV0IGNyZWF0ZWQuCi0gICAgc3RhdGljIGZpbmFsIGludCBDUkVBVEVEID0gMTsgICAgICAgLy8gQ3JlYXRlZC4KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTlRFTlQgPSAyOyAgICAgICAvLyBWaWV3IGhpZXJhcmNoeSBjb250ZW50IGF2YWlsYWJsZS4KLSAgICBzdGF0aWMgZmluYWwgaW50IFNUQVJURUQgPSAzOyAgICAgICAvLyBDcmVhdGVkIGFuZCBzdGFydGVkLCBub3QgcmVzdW1lZC4KLSAgICBzdGF0aWMgZmluYWwgaW50IFJFU1VNRUQgPSA0OyAgICAgICAvLyBDcmVhdGVkIHN0YXJ0ZWQgYW5kIHJlc3VtZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpJTkcgPSAwOyAgICAgLy8gTm90IHlldCBjcmVhdGVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFRCA9IDE7ICAgICAgICAgIC8vIENyZWF0ZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9DUkVBVEVEID0gMjsgLy8gVGhlIGFjdGl2aXR5IGhhcyBmaW5pc2hlZCBpdHMgY3JlYXRpb24uCisgICAgc3RhdGljIGZpbmFsIGludCBTVEFSVEVEID0gMzsgICAgICAgICAgLy8gQ3JlYXRlZCBhbmQgc3RhcnRlZCwgbm90IHJlc3VtZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBSRVNVTUVEID0gNDsgICAgICAgICAgLy8gQ3JlYXRlZCBzdGFydGVkIGFuZCByZXN1bWVkLgogICAgIAogICAgIGludCBtU3RhdGUgPSBJTklUSUFMSVpJTkc7CiAgICAgCkBAIC0xNTgsNiArMTU4LDkgQEAKICAgICAvLyBUcnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgbGlzdCBvZiBhZGRlZCBmcmFnbWVudHMuCiAgICAgYm9vbGVhbiBtQWRkZWQ7CiAgICAgCisgICAgLy8gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgaW4gdGhlIHJlc3VtZWQgc3RhdGUuCisgICAgYm9vbGVhbiBtUmVzdW1lZDsKKyAgICAKICAgICAvLyBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGZyYWdtZW50IHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBhIGxheW91dCBmaWxlLgogICAgIGJvb2xlYW4gbUZyb21MYXlvdXQ7CiAgICAgCkBAIC0yMTAsNiArMjEzLDE3IEBACiAgICAgLy8gVGhlIFZpZXcgZ2VuZXJhdGVkIGZvciB0aGlzIGZyYWdtZW50LgogICAgIFZpZXcgbVZpZXc7CiAgICAgCisgICAgTG9hZGVyTWFuYWdlciBtTG9hZGVyTWFuYWdlcjsKKyAgICBib29sZWFuIG1TdGFydGVkOworICAgIAorICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuICA8c3Ryb25nPkV2ZXJ5PC9zdHJpbmc+IGZyYWdtZW50IG11c3QgaGF2ZSBhbgorICAgICAqIGVtcHR5IGNvbnN0cnVjdG9yLCBzbyBpdCBjYW4gYmUgaW5zdGFudGlhdGVkIHdoZW4gcmVzdG9yaW5nIGl0cworICAgICAqIGFjdGl2aXR5J3Mgc3RhdGUuICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHN1YmNsYXNzZXMgZG8gbm90CisgICAgICogaGF2ZSBvdGhlciBjb25zdHJ1Y3RvcnMgd2l0aCBwYXJhbWV0ZXJzLCBzaW5jZSB0aGVzZSBjb25zdHJ1Y3RvcnMKKyAgICAgKiB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgcmUtaW5zdGFudGlhdGVkOyBpbnN0ZWFkLAorICAgICAqIHJldHJpZXZlIHN1Y2ggcGFyYW1ldGVycyBmcm9tIHRoZSBhY3Rpdml0eSBpbiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0uCisgICAgICovCiAgICAgcHVibGljIEZyYWdtZW50KCkgewogICAgIH0KIApAQCAtMjE3LDcgKzIzMSw3IEBACiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAogICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAogICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gc0NsYXNzTWFwLmdldChmbmFtZSk7CisgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gc0NsYXNzTWFwLmdldChmbmFtZSk7CiAKICAgICAgICAgaWYgKGNsYXp6ID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIENsYXNzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUsIHNlZSBpZiBpdCdzIHJlYWwsIGFuZCB0cnkgdG8gYWRkIGl0CkBAIC0zMTAsNiArMzI0LDE0IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgcmVzdW1lZCBzdGF0ZS4gIFRoaXMgaXMgdHJ1ZQorICAgICAqIGZvciB0aGUgZHVyYXRpb24gb2Yge0BsaW5rICNvblJlc3VtZSgpfSBhbmQge0BsaW5rICNvblBhdXNlKCl9IGFzIHdlbGwuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNSZXN1bWVkKCkgeworICAgICAgICByZXR1cm4gbVJlc3VtZWQ7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgbWVhbnMKICAgICAgKiBpdDogKDEpIGhhcyBiZWVuIGFkZGVkLCAoMikgaGFzIGl0cyB2aWV3IGF0dGFjaGVkIHRvIHRoZSB3aW5kb3csIGFuZCAKICAgICAgKiAoMykgaXMgbm90IGhpZGRlbi4KQEAgLTM1MCw3ICszNzIsNyBAQAogICAgICAqIHdpbGwgYmUsIGJlY2F1c2UgdGhlIGZyYWdtZW50IGlzIGJlaW5nIGRldGFjaGVkIGZyb20gaXRzIGN1cnJlbnQgYWN0aXZpdHkpLgogICAgICAqIDxsaT4ge0BsaW5rICNvbkNyZWF0ZShCdW5kbGUpfSB3aWxsIG5vdCBiZSBjYWxsZWQgc2luY2UgdGhlIGZyYWdtZW50CiAgICAgICogaXMgbm90IGJlaW5nIHJlLWNyZWF0ZWQuCi0gICAgICogPGxpPiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0gYW5kIHtAbGluayAjb25SZWFkeShCdW5kbGUpfSA8Yj53aWxsPC9iPgorICAgICAqIDxsaT4ge0BsaW5rICNvbkF0dGFjaChBY3Rpdml0eSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9IDxiPndpbGw8L2I+CiAgICAgICogc3RpbGwgYmUgY2FsbGVkLgogICAgICAqIDwvdWw+CiAgICAgICovCkBAIC0zNzksNiArNDAxLDE3IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyTWFuYWdlciBmb3IgdGhpcyBmcmFnbWVudCwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkKTsKKyAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBDYWxsIHtAbGluayBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCl9IG9uIHRoZSBmcmFnbWVudCdzCiAgICAgICogY29udGFpbmluZyBBY3Rpdml0eS4KICAgICAgKi8KQEAgLTQ0Niw3ICs0NzksMTUgQEAKICAgICAKICAgICAvKioKICAgICAgKiBDYWxsZWQgdG8gZG8gaW5pdGlhbCBjcmVhdGlvbiBvZiBhIGZyYWdtZW50LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKLSAgICAgKiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0gYW5kIGJlZm9yZSB7QGxpbmsgI29uUmVhZHkoQnVuZGxlKX0uCisgICAgICoge0BsaW5rICNvbkF0dGFjaChBY3Rpdml0eSl9IGFuZCBiZWZvcmUKKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciwgVmlld0dyb3VwLCBCdW5kbGUpfS4KKyAgICAgKiAKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIHdoaWxlIHRoZSBmcmFnbWVudCdzIGFjdGl2aXR5IGlzCisgICAgICogc3RpbGwgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZC4gIEFzIHN1Y2gsIHlvdSBjYW4gbm90IHJlbHkKKyAgICAgKiBvbiB0aGluZ3MgbGlrZSB0aGUgYWN0aXZpdHkncyBjb250ZW50IHZpZXcgaGllcmFyY2h5IGJlaW5nIGluaXRpYWxpemVkCisgICAgICogYXQgdGhpcyBwb2ludC4gIElmIHlvdSB3YW50IHRvIGRvIHdvcmsgb25jZSB0aGUgYWN0aXZpdHkgaXRzZWxmIGlzCisgICAgICogY3JlYXRlZCwgc2VlIHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlKX0uCisgICAgICogCiAgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBJZiB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY3JlYXRlZCBmcm9tCiAgICAgICogYSBwcmV2aW91cyBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc3RhdGUuCiAgICAgICovCkBAIC00NTgsNyArNDk5LDcgQEAKICAgICAgKiBDYWxsZWQgdG8gaGF2ZSB0aGUgZnJhZ21lbnQgaW5zdGFudGlhdGUgaXRzIHVzZXIgaW50ZXJmYWNlIHZpZXcuCiAgICAgICogVGhpcyBpcyBvcHRpb25hbCwgYW5kIG5vbi1ncmFwaGljYWwgZnJhZ21lbnRzIGNhbiByZXR1cm4gbnVsbCAod2hpY2gKICAgICAgKiBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbikuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGJldHdlZW4KLSAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IGFuZCB7QGxpbmsgI29uUmVhZHkoQnVuZGxlKX0uCisgICAgICoge0BsaW5rICNvbkNyZWF0ZShCdW5kbGUpfSBhbmQge0BsaW5rICNvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUpfS4KICAgICAgKiAKICAgICAgKiA8cD5JZiB5b3UgcmV0dXJuIGEgVmlldyBmcm9tIGhlcmUsIHlvdSB3aWxsIGxhdGVyIGJlIGNhbGxlZCBpbgogICAgICAqIHtAbGluayAjb25EZXN0cm95Vmlld30gd2hlbiB0aGUgdmlldyBpcyBiZWluZyByZWxlYXNlZC4KQEAgLTQ4MywxNiArNTI0LDE5IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyByZWFkeSBmb3IgdGhlIGZyYWdtZW50IHRvIHJ1bi4gIFRoaXMgaXMKLSAgICAgKiBtb3N0IHVzZWZ1bCBmb3IgZnJhZ21lbnRzIHRoYXQgdXNlIHtAbGluayAjc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbil9Ci0gICAgICogaW5zdGFuY2UsIGFzIHRoaXMgdGVsbHMgdGhlIGZyYWdtZW50IHdoZW4gaXQgaXMgZnVsbHkgYXNzb2NpYXRlZCB3aXRoCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50J3MgYWN0aXZpdHkgaGFzIGJlZW4gY3JlYXRlZCBhbmQgdGhpcworICAgICAqIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkgaW5zdGFudGlhdGVkLiAgSXQgY2FuIGJlIHVzZWQgdG8gZG8gZmluYWwKKyAgICAgKiBpbml0aWFsaXphdGlvbiBvbmNlIHRoZXNlIHBpZWNlcyBhcmUgaW4gcGxhY2UsIHN1Y2ggYXMgcmV0cmlldmluZworICAgICAqIHZpZXdzIG9yIHJlc3RvcmluZyBzdGF0ZS4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBmcmFnbWVudHMgdGhhdCB1c2UKKyAgICAgKiB7QGxpbmsgI3NldFJldGFpbkluc3RhbmNlKGJvb2xlYW4pfSB0byByZXRhaW4gdGhlaXIgaW5zdGFuY2UsCisgICAgICogYXMgdGhpcyBjYWxsYmFjayB0ZWxscyB0aGUgZnJhZ21lbnQgd2hlbiBpdCBpcyBmdWxseSBhc3NvY2lhdGVkIHdpdGgKICAgICAgKiB0aGUgbmV3IGFjdGl2aXR5IGluc3RhbmNlLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNvbkNyZWF0ZVZpZXd9CiAgICAgICogYW5kIGJlZm9yZSB7QGxpbmsgI29uU3RhcnQoKX0uCiAgICAgICogCiAgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBJZiB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY3JlYXRlZCBmcm9tCiAgICAgICogYSBwcmV2aW91cyBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc3RhdGUuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgb25SZWFkeShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKICAgICB9CiAgICAgCkBAIC01MDMsNiArNTQ3LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RhcnQoKTsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvKioKQEAgLTU2MSw2ICs2MDksOSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb0Rlc3Ryb3koKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtNzAyLDQgKzc1MywxOCBAQAogICAgIHB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgCisgICAgdm9pZCBwZXJmb3JtU3RvcCgpIHsKKyAgICAgICAgb25TdG9wKCk7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpdml0eSA9PSBudWxsIHx8ICFtQWN0aXZpdHkubUNoYW5naW5nQ29uZmlndXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdG9wKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9SZXRhaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKaW5kZXggYjhlZWIwOTQuLjUwMzA3ZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKQEAgLTE2Miw2ICsxNjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25BdHRhY2goKSIpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5vbkF0dGFjaEZyYWdtZW50KGYpOwogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1SZXRhaW5pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOwpAQCAtMjE2LDE1ICsyMTcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmLm9uUmVhZHkoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25BY3Rpdml0eUNyZWF0ZWQoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUmVhZHkoKSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZi5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQ09OVEVOVDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuQ09OVEVOVCkgeworICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gU1RBUlRFRDogIiArIGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBmLm9uU3RhcnQoKTsKQEAgLTIzNyw2ICsyMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5TVEFSVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBSRVNVTUVEOiAiICsgZik7CiAgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVJlc3VtZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgZi5vblJlc3VtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCkBAIC0yNTUsMTkgKzI1NywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblBhdXNlKCkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVJlc3VtZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuU1RBUlRFRDoKICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlIDwgRnJhZ21lbnQuU1RBUlRFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBTVEFSVEVEOiAiICsgZik7CiAgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYub25TdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmLnBlcmZvcm1TdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0b3AoKSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5DT05URU5UOgotICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5DT05URU5UKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIENPTlRFTlQ6ICIgKyBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKQEAgLTMxMyw2ICszMTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkRldGFjaCgpIik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1BY3Rpdml0eS5tQWxsTG9hZGVyTWFuYWdlcnMucmVtb3ZlKGYubUluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGYubUFjdGl2aXR5ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNzgzLDYgKzc4NywxMCBAQAogICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5DUkVBVEVELCBmYWxzZSk7CiAgICAgfQogICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQWN0aXZpdHlDcmVhdGVkKCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU3RhcnQoKSB7CiAgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlNUQVJURUQsIGZhbHNlKTsKICAgICB9CkBAIC03OTYsNyArODA0LDcgQEAKICAgICB9CiAgICAgCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hTdG9wKCkgewotICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5DT05URU5ULCBmYWxzZSk7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LkFDVElWSVRZX0NSRUFURUQsIGZhbHNlKTsKICAgICB9CiAgICAgCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEZXN0cm95KCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggMjBjOWE4MC4uOGVhNTlhNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0zMTYsNyArMzE2LDExIEBACiAgICAgCiAgICAgcHVibGljIHZvaWQgY3Jhc2hBcHBsaWNhdGlvbihpbnQgdWlkLCBpbnQgaW5pdGlhbFBpZCwgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0gICAgCisKKyAgICAvLyBDYXVzZSB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgdG8gZHVtcCB0aGUgc3BlY2lmaWVkIGhlYXAuCisgICAgcHVibGljIGJvb2xlYW4gZHVtcEhlYXAoU3RyaW5nIHByb2Nlc3MsIGJvb2xlYW4gbWFuYWdlZCwgU3RyaW5nIHBhdGgsCisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCiAgICAgLyoKICAgICAgKiBQcml2YXRlIG5vbi1CaW5kZXIgaW50ZXJmYWNlcwogICAgICAqLwpAQCAtNTMzLDQgKzUzNyw1IEBACiAgICAgaW50IFNFVF9JTU1FUlNJVkVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTExOwogICAgIGludCBJU19UT1BfQUNUSVZJVFlfSU1NRVJTSVZFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzExMjsKICAgICBpbnQgQ1JBU0hfQVBQTElDQVRJT05fVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTEzOworICAgIGludCBEVU1QX0hFQVBfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE0OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhCmluZGV4IGM4ZWYxN2YuLjAzOWJjYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKQEAgLTk3LDYgKzk3LDggQEAKICAgICB2b2lkIHNjaGVkdWxlQWN0aXZpdHlDb25maWd1cmF0aW9uQ2hhbmdlZChJQmluZGVyIHRva2VuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHZvaWQgcHJvZmlsZXJDb250cm9sKGJvb2xlYW4gc3RhcnQsIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgdm9pZCBkdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBzZXRTY2hlZHVsaW5nR3JvdXAoaW50IGdyb3VwKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHZvaWQgZ2V0TWVtb3J5SW5mbyhEZWJ1Zy5NZW1vcnlJbmZvIG91dEluZm8pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFX1JFTU9WRUQgPSAwOwpAQCAtMTQwLDQgKzE0Miw1IEBACiAgICAgaW50IFNDSEVEVUxFX1NVSUNJREVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMzI7CiAgICAgaW50IERJU1BBVENIX1BBQ0tBR0VfQlJPQURDQVNUX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzMzOwogICAgIGludCBTQ0hFRFVMRV9DUkFTSF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszNDsKKyAgICBpbnQgRFVNUF9IRUFQX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzM1OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eS5qYXZhCmluZGV4IDRiZjU1MTguLmQ0OTk2OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0QWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEFjdGl2aXR5LmphdmEKQEAgLTMwOSw3ICszMDksNyBAQAogICAgICAgICBpZiAobUxpc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfY29udGVudCk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfY29udGVudF9zaW1wbGUpOwogCiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEKaW5kZXggYTZiZTMyOS4uNzNlZjg2OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RGcmFnbWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0RnJhZ21lbnQuamF2YQpAQCAtMTYwLDcgKzE2MCw2IEBACiAgICAgVGV4dFZpZXcgbVN0YW5kYXJkRW1wdHlWaWV3OwogICAgIFZpZXcgbVByb2dyZXNzQ29udGFpbmVyOwogICAgIFZpZXcgbUxpc3RDb250YWluZXI7Ci0gICAgYm9vbGVhbiBtU2V0RW1wdHlWaWV3OwogICAgIGJvb2xlYW4gbUxpc3RTaG93bjsKIAogICAgIHB1YmxpYyBMaXN0RnJhZ21lbnQoKSB7CkBAIC0xNzMsMTEgKzE3MiwxNyBAQAogICAgICAqIGlzIHtAbGluayBhbmRyb2lkLlIuaWQjbGlzdCBhbmRyb2lkLlIuaWQubGlzdH0gYW5kIGNhbiBvcHRpb25hbGx5CiAgICAgICogaGF2ZSBhIHNpYmxpbmcgdmlldyBpZCB7QGxpbmsgYW5kcm9pZC5SLmlkI2VtcHR5IGFuZHJvaWQuUi5pZC5lbXB0eX0KICAgICAgKiB0aGF0IGlzIHRvIGJlIHNob3duIHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuCisgICAgICogCisgICAgICogPHA+SWYgeW91IGFyZSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHdpdGggeW91ciBvd24gY3VzdG9tIGNvbnRlbnQsCisgICAgICogY29uc2lkZXIgaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsYXlvdXQge0BsaW5rIGFuZHJvaWQuUi5sYXlvdXQjbGlzdF9jb250ZW50fQorICAgICAqIGluIHlvdXIgbGF5b3V0IGZpbGUsIHNvIHRoYXQgeW91IGNvbnRpbnVlIHRvIHJldGFpbiBhbGwgb2YgdGhlIHN0YW5kYXJkCisgICAgICogYmVoYXZpb3Igb2YgTGlzdEZyYWdtZW50LiAgSW4gcGFydGljdWxhciwgdGhpcyBpcyBjdXJyZW50bHkgdGhlIG9ubHkKKyAgICAgKiB3YXkgdG8gaGF2ZSB0aGUgYnVpbHQtaW4gaW5kZXRlcm1pbmFudCBwcm9ncmVzcyBzdGF0ZSBiZSBzaG93bi4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCiAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfY29udGVudF9yaWNoLAorICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X2NvbnRlbnQsCiAgICAgICAgICAgICAgICAgY29udGFpbmVyLCBmYWxzZSk7CiAgICAgfQogCkBAIC0xODUsOCArMTkwLDggQEAKICAgICAgKiBBdHRhY2ggdG8gbGlzdCB2aWV3IG9uY2UgRnJhZ21lbnQgaXMgcmVhZHkgdG8gcnVuLgogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVhZHkoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vblJlYWR5KHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOwogICAgICAgICBlbnN1cmVMaXN0KCk7CiAgICAgfQogCkBAIC0yMTgsOSArMjIzLDE1IEBACiAgICAgICogUHJvdmlkZSB0aGUgY3Vyc29yIGZvciB0aGUgbGlzdCB2aWV3LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExpc3RBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgYm9vbGVhbiBoYWRBZGFwdGVyID0gbUFkYXB0ZXIgIT0gbnVsbDsKICAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOwogICAgICAgICBpZiAobUxpc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgbUxpc3Quc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgICAgIGlmICghbUxpc3RTaG93biAmJiAhaGFkQWRhcHRlcikgeworICAgICAgICAgICAgICAgIC8vIFRoZSBsaXN0IHdhcyBoaWRkZW4sIGFuZCBwcmV2aW91c2x5IGRpZG4ndCBoYXZlIGFuCisgICAgICAgICAgICAgICAgLy8gYWRhcHRlci4gIEl0IGlzIG5vdyB0aW1lIHRvIHNob3cgaXQuCisgICAgICAgICAgICAgICAgc2V0TGlzdFNob3duKHRydWUsIGdldFZpZXcoKS5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yNjksMTAgKzI4MCwzMyBAQAogICAgICAgICBpZiAobVN0YW5kYXJkRW1wdHlWaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGJlIHVzZWQgd2l0aCBhIGN1c3RvbSBjb250ZW50IHZpZXciKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1TZXRFbXB0eVZpZXcpIHsKLSAgICAgICAgICAgIG1TZXRFbXB0eVZpZXcgPSB0cnVlOwotICAgICAgICAgICAgbUxpc3Quc2V0RW1wdHlWaWV3KG1TdGFuZGFyZEVtcHR5Vmlldyk7Ci0gICAgICAgIH0KKyAgICAgICAgbUxpc3Quc2V0RW1wdHlWaWV3KG1TdGFuZGFyZEVtcHR5Vmlldyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciB0aGUgbGlzdCBpcyBiZWluZyBkaXNwbGF5ZWQuICBZb3UgY2FuIG1ha2UgaXQgbm90CisgICAgICogZGlzcGxheWVkIGlmIHlvdSBhcmUgd2FpdGluZyBmb3IgdGhlIGluaXRpYWwgZGF0YSB0byBzaG93IGluIGl0LiAgRHVyaW5nCisgICAgICogdGhpcyB0aW1lIGFuIGluZGV0ZXJtaW5hbnQgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdpbGwgYmUgc2hvd24gaW5zdGVhZC4KKyAgICAgKiAKKyAgICAgKiA8cD5BcHBsaWNhdGlvbnMgZG8gbm90IG5vcm1hbGx5IG5lZWQgdG8gdXNlIHRoaXMgdGhlbXNlbHZlcy4gIFRoZSBkZWZhdWx0CisgICAgICogYmVoYXZpb3Igb2YgTGlzdEZyYWdtZW50IGlzIHRvIHN0YXJ0IHdpdGggdGhlIGxpc3Qgbm90IGJlaW5nIHNob3duLCBvbmx5CisgICAgICogc2hvd2luZyBpdCBvbmNlIGFuIGFkYXB0ZXIgaXMgZ2l2ZW4gd2l0aCB7QGxpbmsgI3NldExpc3RBZGFwdGVyKExpc3RBZGFwdGVyKX0uCisgICAgICogSWYgdGhlIGxpc3QgYXQgdGhhdCBwb2ludCBoYWQgbm90IGJlZW4gc2hvd24sIHdoZW4gaXQgZG9lcyBnZXQgc2hvd24KKyAgICAgKiBpdCB3aWxsIGJlIGRvIHdpdGhvdXQgdGhlIHVzZXIgZXZlciBzZWVpbmcgdGhlIGhpZGRlbiBzdGF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2hvd24gSWYgdHJ1ZSwgdGhlIGxpc3QgdmlldyBpcyBzaG93bjsgaWYgZmFsc2UsIHRoZSBwcm9ncmVzcworICAgICAqIGluZGljYXRvci4gIFRoZSBpbml0aWFsIHZhbHVlIGlzIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdFNob3duKGJvb2xlYW4gc2hvd24pIHsKKyAgICAgICAgc2V0TGlzdFNob3duKHNob3duLCB0cnVlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI3NldExpc3RTaG93bihib29sZWFuKX0sIGJ1dCBubyBhbmltYXRpb24gaXMgdXNlZCB3aGVuCisgICAgICogdHJhbnNpdGlvbmluZyBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2hvd25Ob0FuaW1hdGlvbihib29sZWFuIHNob3duKSB7CisgICAgICAgIHNldExpc3RTaG93bihzaG93biwgZmFsc2UpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI4NSw3ICszMTksNyBAQAogICAgICAqIEBwYXJhbSBhbmltYXRlIElmIHRydWUsIGFuIGFuaW1hdGlvbiB3aWxsIGJlIHVzZWQgdG8gdHJhbnNpdGlvbiB0byB0aGUKICAgICAgKiBuZXcgc3RhdGUuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdFNob3duKGJvb2xlYW4gc2hvd24sIGJvb2xlYW4gYW5pbWF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZXRMaXN0U2hvd24oYm9vbGVhbiBzaG93biwgYm9vbGVhbiBhbmltYXRlKSB7CiAgICAgICAgIGVuc3VyZUxpc3QoKTsKICAgICAgICAgaWYgKG1Qcm9ncmVzc0NvbnRhaW5lciA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBiZSB1c2VkIHdpdGggYSBjdXN0b20gY29udGVudCB2aWV3Iik7CkBAIC0zNjAsNiArMzk0LDEyIEBACiAgICAgICAgIG1MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CiAgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgc3RhcnRpbmcgd2l0aG91dCBhbiBhZGFwdGVyLCBzbyBhc3N1bWUgd2Ugd29uJ3QKKyAgICAgICAgICAgIC8vIGhhdmUgb3VyIGRhdGEgcmlnaHQgYXdheSBhbmQgc3RhcnQgd2l0aCB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9yLgorICAgICAgICAgICAgaWYgKG1Qcm9ncmVzc0NvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0TGlzdFNob3duKGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbUhhbmRsZXIucG9zdChtUmVxdWVzdEZvY3VzKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjAwODk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Mb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CisKKy8qKgorICogT2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhbiB7QGxpbmsgQWN0aXZpdHl9IG9yIHtAbGluayBGcmFnbWVudH0gZm9yIG1hbmFnaW5nCisgKiBvbmUgb3IgbW9yZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkxvYWRlcn0gaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqLworcHVibGljIGNsYXNzIExvYWRlck1hbmFnZXIgeworICAgIGZpbmFsIFNwYXJzZUFycmF5PExvYWRlckluZm8+IG1Mb2FkZXJzID0gbmV3IFNwYXJzZUFycmF5PExvYWRlckluZm8+KCk7CisgICAgZmluYWwgU3BhcnNlQXJyYXk8TG9hZGVySW5mbz4gbUluYWN0aXZlTG9hZGVycyA9IG5ldyBTcGFyc2VBcnJheTxMb2FkZXJJbmZvPigpOworICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgYm9vbGVhbiBtUmV0YWluaW5nOworICAgIGJvb2xlYW4gbVJldGFpbmluZ1N0YXJ0ZWQ7CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBhIGNsaWVudCB0byBpbnRlcmFjdCB3aXRoIHRoZSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTG9hZGVyQ2FsbGJhY2tzPEQ+IHsKKyAgICAgICAgcHVibGljIExvYWRlcjxEPiBvbkNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkRmluaXNoZWQoTG9hZGVyPEQ+IGxvYWRlciwgRCBkYXRhKTsKKyAgICB9CisgICAgCisgICAgZmluYWwgY2xhc3MgTG9hZGVySW5mbyBpbXBsZW1lbnRzIExvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyPE9iamVjdD4geworICAgICAgICBmaW5hbCBpbnQgbUlkOworICAgICAgICBmaW5hbCBCdW5kbGUgbUFyZ3M7CisgICAgICAgIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4gbUNhbGxiYWNrczsKKyAgICAgICAgTG9hZGVyPE9iamVjdD4gbUxvYWRlcjsKKyAgICAgICAgT2JqZWN0IG1EYXRhOworICAgICAgICBib29sZWFuIG1TdGFydGVkOworICAgICAgICBib29sZWFuIG1SZXRhaW5pbmc7CisgICAgICAgIGJvb2xlYW4gbVJldGFpbmluZ1N0YXJ0ZWQ7CisgICAgICAgIGJvb2xlYW4gbURlc3Ryb3llZDsKKyAgICAgICAgYm9vbGVhbiBtTGlzdGVuZXJSZWdpc3RlcmVkOworICAgICAgICAKKyAgICAgICAgcHVibGljIExvYWRlckluZm8oaW50IGlkLCBCdW5kbGUgYXJncywgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICAgICAgbUFyZ3MgPSBhcmdzOworICAgICAgICAgICAgbUNhbGxiYWNrcyA9IGNhbGxiYWNrczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIGlmIChtUmV0YWluaW5nICYmIG1SZXRhaW5pbmdTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgLy8gT3VyIG93bmVyIGlzIHN0YXJ0ZWQsIGJ1dCB3ZSB3ZXJlIGJlaW5nIHJldGFpbmVkIGZyb20gYQorICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIGluc3RhbmNlIGluIHRoZSBzdGFydGVkIHN0YXRlLi4uICBzbyB0aGVyZSBpcyByZWFsbHkKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUsIHNpbmNlIHRoZSBsb2FkZXJzIGFyZSBzdGlsbCBzdGFydGVkLgorICAgICAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTG9hZGVyID09IG51bGwgJiYgbUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICBtTG9hZGVyID0gbUNhbGxiYWNrcy5vbkNyZWF0ZUxvYWRlcihtSWQsIG1BcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIobUlkLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXJSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtTG9hZGVyLnN0YXJ0TG9hZGluZygpOworICAgICAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCByZXRhaW4oKSB7CisgICAgICAgICAgICBtUmV0YWluaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1SZXRhaW5pbmdTdGFydGVkID0gbVN0YXJ0ZWQ7CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgbUNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgZmluaXNoUmV0YWluKCkgeworICAgICAgICAgICAgaWYgKG1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICBtUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkICE9IG1SZXRhaW5pbmdTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIHdhcyByZXRhaW5lZCBpbiBhIHN0YXJ0ZWQgc3RhdGUsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiByZXRhaW5pbmcgZXZlcnl0aGluZyBvdXIgb3duZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGxvbmdlciBzdGFydGVkLi4uICBzbyBtYWtlIGl0IHN0b3AuCisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkICYmIG1EYXRhICE9IG51bGwgJiYgbUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIHdhcyByZXRhaW5lZCwgYW5kIG5vdyBhdCB0aGUgcG9pbnQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoaW5nIHRoZSByZXRhaW4gd2UgZmluZCB3ZSByZW1haW4gc3RhcnRlZCwgaGF2ZQorICAgICAgICAgICAgICAgICAgICAvLyBvdXIgZGF0YSwgYW5kIHRoZSBvd25lciBoYXMgYSBuZXcgY2FsbGJhY2suLi4gIHNvCisgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGRlbGl2ZXIgdGhlIGRhdGEgbm93LgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uTG9hZEZpbmlzaGVkKG1Mb2FkZXIsIG1EYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobUxvYWRlciAhPSBudWxsICYmIG1MaXN0ZW5lclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBMZXQgdGhlIGxvYWRlciBrbm93IHdlJ3JlIGRvbmUgd2l0aCBpdAorICAgICAgICAgICAgICAgIG1MaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtTG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uTG9hZENvbXBsZXRlKExvYWRlcjxPYmplY3Q+IGxvYWRlciwgT2JqZWN0IGRhdGEpIHsKKyAgICAgICAgICAgIGlmIChtRGVzdHJveWVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBOb3RpZnkgb2YgdGhlIG5ldyBkYXRhIHNvIHRoZSBhcHAgY2FuIHN3aXRjaCBvdXQgdGhlIG9sZCBkYXRhIGJlZm9yZQorICAgICAgICAgICAgLy8gd2UgdHJ5IHRvIGRlc3Ryb3kgaXQuCisgICAgICAgICAgICBtRGF0YSA9IGRhdGE7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5vbkxvYWRGaW5pc2hlZChsb2FkZXIsIGRhdGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMb29rIGZvciBhbiBpbmFjdGl2ZSBsb2FkZXIgYW5kIGRlc3Ryb3kgaXQgaWYgZm91bmQKKyAgICAgICAgICAgIExvYWRlckluZm8gaW5mbyA9IG1JbmFjdGl2ZUxvYWRlcnMuZ2V0KG1JZCk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9hZGVyPE9iamVjdD4gb2xkTG9hZGVyID0gaW5mby5tTG9hZGVyOworICAgICAgICAgICAgICAgIGlmIChvbGRMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvbGRMb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKGluZm8pOworICAgICAgICAgICAgICAgICAgICBvbGRMb2FkZXIuZGVzdHJveSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnJlbW92ZShtSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIExvYWRlck1hbmFnZXIoYm9vbGVhbiBzdGFydGVkKSB7CisgICAgICAgIG1TdGFydGVkID0gc3RhcnRlZDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBMb2FkZXJJbmZvIGNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiBjYWxsYmFjaykgeworICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBuZXcgTG9hZGVySW5mbyhpZCwgYXJncywgIChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrKTsKKyAgICAgICAgbUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgTG9hZGVyPE9iamVjdD4gbG9hZGVyID0gY2FsbGJhY2sub25DcmVhdGVMb2FkZXIoaWQsIGFyZ3MpOworICAgICAgICBpbmZvLm1Mb2FkZXIgPSAoTG9hZGVyPE9iamVjdD4pbG9hZGVyOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIC8vIFRoZSBhY3Rpdml0eSB3aWxsIHN0YXJ0IGFsbCBleGlzdGluZyBsb2FkZXJzIGluIGl0J3Mgb25TdGFydCgpLCBzbyBvbmx5IHN0YXJ0IHRoZW0KKyAgICAgICAgICAgIC8vIGhlcmUgaWYgd2UncmUgcGFzdCB0aGF0IHBvaW50IG9mIHRoZSBhY3Rpdml0aXkncyBsaWZlIGN5Y2xlCisgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcihpZCwgaW5mbyk7CisgICAgICAgICAgICBsb2FkZXIuc3RhcnRMb2FkaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEVuc3VyZXMgYSBsb2FkZXIgaXMgaW5pdGlhbGl6ZWQgYW4gYWN0aXZlLiAgSWYgdGhlIGxvYWRlciBkb2Vzbid0CisgICAgICogYWxyZWFkeSBleGlzdCwgb25lIGlzIGNyZWF0ZWQgYW5kIHN0YXJ0ZWQuICBPdGhlcndpc2UgdGhlIGxhc3QgY3JlYXRlZAorICAgICAqIGxvYWRlciBpcyByZS11c2VkLgorICAgICAqIAorICAgICAqIDxwPkluIGVpdGhlciBjYXNlLCB0aGUgZ2l2ZW4gY2FsbGJhY2sgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2FkZXIsIGFuZAorICAgICAqIHdpbGwgYmUgY2FsbGVkIGFzIHRoZSBsb2FkZXIgc3RhdGUgY2hhbmdlcy4gIElmIGF0IHRoZSBwb2ludCBvZiBjYWxsCisgICAgICogdGhlIGNhbGxlciBpcyBpbiBpdHMgc3RhcnRlZCBzdGF0ZSwgYW5kIHRoZSByZXF1ZXN0ZWQgbG9hZGVyCisgICAgICogYWxyZWFkeSBleGlzdHMgYW5kIGhhcyBnZW5lcmF0ZWQgaXRzIGRhdGEsIHRoZW4KKyAgICAgKiBjYWxsYmFjay4ge0BsaW5rIExvYWRlckNhbGxiYWNrcyNvbkxvYWRGaW5pc2hlZH0gd2lsbAorICAgICAqIGJlIGNhbGxlZCBpbW1lZGlhdGVseSAoaW5zaWRlIG9mIHRoaXMgZnVuY3Rpb24pLCBzbyB5b3UgbXVzdCBiZSBwcmVwYXJlZAorICAgICAqIGZvciB0aGlzIHRvIGhhcHBlbi4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiBpbml0TG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MsIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPEQ+IGNhbGxiYWNrKSB7CisgICAgICAgIExvYWRlckluZm8gaW5mbyA9IG1Mb2FkZXJzLmdldChpZCk7CisgICAgICAgIAorICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBMb2FkZXIgZG9lc24ndCBhbHJlYWR5IGV4aXN0OyBjcmVhdGUuCisgICAgICAgICAgICBpbmZvID0gY3JlYXRlTG9hZGVyKGlkLCBhcmdzLCAgKExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4pY2FsbGJhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5mby5tQ2FsbGJhY2tzID0gKExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4pY2FsbGJhY2s7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChpbmZvLm1EYXRhICE9IG51bGwgJiYgbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBsb2FkZXIgaGFzIGFscmVhZHkgZ2VuZXJhdGVkIGl0cyBkYXRhLCByZXBvcnQgaXQgbm93LgorICAgICAgICAgICAgaW5mby5tQ2FsbGJhY2tzLm9uTG9hZEZpbmlzaGVkKGluZm8ubUxvYWRlciwgaW5mby5tRGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAoTG9hZGVyPEQ+KWluZm8ubUxvYWRlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGxvYWRlciBpbiB0aGlzIG1hbmFnZXIsIHJlZ2lzdGVycyB0aGUgY2FsbGJhY2tzIHRvIGl0LAorICAgICAqIGFuZCBzdGFydHMgaXQgbG9hZGluZy4gIElmIGEgbG9hZGVyIHdpdGggdGhlIHNhbWUgaWQgaGFzIHByZXZpb3VzbHkgYmVlbgorICAgICAqIHN0YXJ0ZWQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRlc3Ryb3llZCB3aGVuIHRoZSBuZXcgbG9hZGVyIGNvbXBsZXRlcworICAgICAqIGl0cyB3b3JrLiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBkZWxpdmVyZWQgYmVmb3JlIHRoZSBvbGQgbG9hZGVyCisgICAgICogaXMgZGVzdHJveWVkLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IHJlc3RhcnRMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spIHsKKyAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1JbmFjdGl2ZUxvYWRlcnMuZ2V0KGlkKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGluYWN0aXZlIGxvYWRlciBmb3IgdGhpcyBJRCB0aGF0IHdlIGFyZQorICAgICAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yISAgTm93IHdlIGhhdmUgdGhyZWUgYWN0aXZlIGxvYWRlcnMuLi4gbGV0J3MganVzdAorICAgICAgICAgICAgICAgIC8vIGRyb3AgdGhlIG9uZSBpbiB0aGUgbWlkZGxlLCBzaW5jZSB3ZSBhcmUgc3RpbGwgd2FpdGluZyBmb3IKKyAgICAgICAgICAgICAgICAvLyBpdHMgcmVzdWx0IGJ1dCB0aGF0IHJlc3VsdCBpcyBhbHJlYWR5IG91dCBvZiBkYXRlLgorICAgICAgICAgICAgICAgIGluZm8uZGVzdHJveSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvZiB0aGlzIGxvYWRlciBzbyB3ZSBjYW4gZGVzdHJveQorICAgICAgICAgICAgICAgIC8vIGl0IHdoZW4gdGhlIG5ldyBvbmUgY29tcGxldGVzLgorICAgICAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW5mbyA9IGNyZWF0ZUxvYWRlcihpZCwgYXJncywgIChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIChMb2FkZXI8RD4paW5mby5tTG9hZGVyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTdG9wcyBhbmQgcmVtb3ZlcyB0aGUgbG9hZGVyIHdpdGggdGhlIGdpdmVuIElELgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BMb2FkZXIoaW50IGlkKSB7CisgICAgICAgIGludCBpZHggPSBtTG9hZGVycy5pbmRleE9mS2V5KGlkKTsKKyAgICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBtTG9hZGVycy52YWx1ZUF0KGlkeCk7CisgICAgICAgICAgICBtTG9hZGVycy5yZW1vdmVBdChpZHgpOworICAgICAgICAgICAgTG9hZGVyPE9iamVjdD4gbG9hZGVyID0gaW5mby5tTG9hZGVyOworICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcihpbmZvKTsKKyAgICAgICAgICAgICAgICBsb2FkZXIuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgb3IgbnVsbCBpZiBubyBtYXRjaGluZyBMb2FkZXIKKyAgICAgKiBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiBnZXRMb2FkZXIoaW50IGlkKSB7CisgICAgICAgIExvYWRlckluZm8gbG9hZGVySW5mbyA9IG1Mb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChsb2FkZXJJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoTG9hZGVyPEQ+KW1Mb2FkZXJzLmdldChpZCkubUxvYWRlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgCisgICAgdm9pZCBkb1N0YXJ0KCkgeworICAgICAgICAvLyBDYWxsIG91dCB0byBzdWIgY2xhc3NlcyBzbyB0aGV5IGNhbiBzdGFydCB0aGVpciBsb2FkZXJzCisgICAgICAgIC8vIExldCB0aGUgZXhpc3RpbmcgbG9hZGVycyBrbm93IHRoYXQgd2Ugd2FudCB0byBiZSBub3RpZmllZCB3aGVuIGEgbG9hZCBpcyBjb21wbGV0ZQorICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtTG9hZGVycy52YWx1ZUF0KGkpLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICB2b2lkIGRvU3RvcCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgdm9pZCBkb1JldGFpbigpIHsKKyAgICAgICAgbVJldGFpbmluZyA9IHRydWU7CisgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSBtTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkucmV0YWluKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBmaW5pc2hSZXRhaW4oKSB7CisgICAgICAgIG1SZXRhaW5pbmcgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5maW5pc2hSZXRhaW4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGRvRGVzdHJveSgpIHsKKyAgICAgICAgaWYgKCFtUmV0YWluaW5nKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSBtSW5hY3RpdmVMb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy52YWx1ZUF0KGkpLmRlc3Ryb3koKTsKKyAgICAgICAgfQorICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLmNsZWFyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05hdGl2ZUFjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTmF0aXZlQWN0aXZpdHkuamF2YQppbmRleCBkNDMzNjhiLi5jY2M5YWUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTmF0aXZlQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTmF0aXZlQWN0aXZpdHkuamF2YQpAQCAtMiwxNyArMiwyNiBAQAogCiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5QYXRoQ2xhc3NMb2FkZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZVF1ZXVlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0Q2hhbm5lbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRRdWV1ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCkBAIC0yMCwxOCArMjksMzAgQEAKICAqIENvbnZlbmllbmNlIGZvciBpbXBsZW1lbnRpbmcgYW4gYWN0aXZpdHkgdGhhdCB3aWxsIGJlIGltcGxlbWVudGVkCiAgKiBwdXJlbHkgaW4gbmF0aXZlIGNvZGUuICBUaGF0IGlzLCBhIGdhbWUgKG9yIGdhbWUtbGlrZSB0aGluZykuCiAgKi8KLXB1YmxpYyBjbGFzcyBOYXRpdmVBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjaywKLSAgICAgICAgSW5wdXRRdWV1ZS5DYWxsYmFjayB7CitwdWJsaWMgY2xhc3MgTmF0aXZlQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syLAorICAgICAgICBJbnB1dFF1ZXVlLkNhbGxiYWNrLCBPbkdsb2JhbExheW91dExpc3RlbmVyIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0RBVEFfTElCX05BTUUgPSAiYW5kcm9pZC5hcHAubGliX25hbWUiOwogICAgIAorICAgIHByaXZhdGUgTmF0aXZlQ29udGVudFZpZXcgbU5hdGl2ZUNvbnRlbnRWaWV3OworICAgIHByaXZhdGUgSW5wdXRNZXRob2RNYW5hZ2VyIG1JTU07CisKICAgICBwcml2YXRlIGludCBtTmF0aXZlSGFuZGxlOwogICAgIAogICAgIHByaXZhdGUgSW5wdXRRdWV1ZSBtQ3VySW5wdXRRdWV1ZTsKICAgICBwcml2YXRlIFN1cmZhY2VIb2xkZXIgbUN1clN1cmZhY2VIb2xkZXI7CiAgICAgCisgICAgZmluYWwgaW50W10gbUxvY2F0aW9uID0gbmV3IGludFsyXTsKKyAgICBpbnQgbUxhc3RDb250ZW50WDsKKyAgICBpbnQgbUxhc3RDb250ZW50WTsKKyAgICBpbnQgbUxhc3RDb250ZW50V2lkdGg7CisgICAgaW50IG1MYXN0Q29udGVudEhlaWdodDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzcGF0Y2hpbmdVbmhhbmRsZWRLZXk7CisKICAgICBwcml2YXRlIGJvb2xlYW4gbURlc3Ryb3llZDsKICAgICAKLSAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbG9hZE5hdGl2ZUNvZGUoU3RyaW5nIHBhdGgsIE1lc3NhZ2VRdWV1ZSBxdWV1ZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IGxvYWROYXRpdmVDb2RlKFN0cmluZyBwYXRoLCBNZXNzYWdlUXVldWUgcXVldWUsCisgICAgICAgICAgICBTdHJpbmcgaW50ZXJuYWxEYXRhUGF0aCwgU3RyaW5nIGV4dGVybmFsRGF0YVBhdGgsIGludCBzZGtWZXJzaW9uKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHVubG9hZE5hdGl2ZUNvZGUoaW50IGhhbmRsZSk7CiAgICAgCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBvblN0YXJ0TmF0aXZlKGludCBoYW5kbGUpOwpAQCAtNDEsMjAgKzYyLDQ3IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBvblN0b3BOYXRpdmUoaW50IGhhbmRsZSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBvbkxvd01lbW9yeU5hdGl2ZShpbnQgaGFuZGxlKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkTmF0aXZlKGludCBoYW5kbGUsIGJvb2xlYW4gZm9jdXNlZCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBvblN1cmZhY2VDcmVhdGVkTmF0aXZlKGludCBoYW5kbGUsIFN1cmZhY2VIb2xkZXIgaG9sZGVyKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG9uU3VyZmFjZUNoYW5nZWROYXRpdmUoaW50IGhhbmRsZSwgU3VyZmFjZUhvbGRlciBob2xkZXIsCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBvblN1cmZhY2VDcmVhdGVkTmF0aXZlKGludCBoYW5kbGUsIFN1cmZhY2Ugc3VyZmFjZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBvblN1cmZhY2VDaGFuZ2VkTmF0aXZlKGludCBoYW5kbGUsIFN1cmZhY2Ugc3VyZmFjZSwKICAgICAgICAgICAgIGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBvblN1cmZhY2VEZXN0cm95ZWROYXRpdmUoaW50IGhhbmRsZSwgU3VyZmFjZUhvbGRlciBob2xkZXIpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgb25TdXJmYWNlUmVkcmF3TmVlZGVkTmF0aXZlKGludCBoYW5kbGUsIFN1cmZhY2Ugc3VyZmFjZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBvblN1cmZhY2VEZXN0cm95ZWROYXRpdmUoaW50IGhhbmRsZSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBvbklucHV0Q2hhbm5lbENyZWF0ZWROYXRpdmUoaW50IGhhbmRsZSwgSW5wdXRDaGFubmVsIGNoYW5uZWwpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgb25JbnB1dENoYW5uZWxEZXN0cm95ZWROYXRpdmUoaW50IGhhbmRsZSwgSW5wdXRDaGFubmVsIGNoYW5uZWwpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgb25Db250ZW50UmVjdENoYW5nZWROYXRpdmUoaW50IGhhbmRsZSwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGlzcGF0Y2hLZXlFdmVudE5hdGl2ZShpbnQgaGFuZGxlLCBLZXlFdmVudCBldmVudCk7CisKKyAgICBzdGF0aWMgY2xhc3MgTmF0aXZlQ29udGVudFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgTmF0aXZlQWN0aXZpdHkgbUFjdGl2aXR5OworCisgICAgICAgIHB1YmxpYyBOYXRpdmVDb250ZW50VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE5hdGl2ZUNvbnRlbnRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIH0KKyAgICB9CiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBTdHJpbmcgbGlibmFtZSA9ICJtYWluIjsKICAgICAgICAgQWN0aXZpdHlJbmZvIGFpOwogICAgICAgICAKKyAgICAgICAgbUlNTSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKKwogICAgICAgICBnZXRXaW5kb3coKS50YWtlU3VyZmFjZSh0aGlzKTsKICAgICAgICAgZ2V0V2luZG93KCkudGFrZUlucHV0UXVldWUodGhpcyk7CisgICAgICAgIGdldFdpbmRvdygpLnNldEZvcm1hdChQaXhlbEZvcm1hdC5SR0JfNTY1KTsKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0U29mdElucHV0TW9kZSgKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX1NUQVRFX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9SRVNJWkUpOworCisgICAgICAgIG1OYXRpdmVDb250ZW50VmlldyA9IG5ldyBOYXRpdmVDb250ZW50Vmlldyh0aGlzKTsKKyAgICAgICAgbU5hdGl2ZUNvbnRlbnRWaWV3Lm1BY3Rpdml0eSA9IHRoaXM7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1OYXRpdmVDb250ZW50Vmlldyk7CisgICAgICAgIG1OYXRpdmVDb250ZW50Vmlldy5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgbU5hdGl2ZUNvbnRlbnRWaWV3LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKHRoaXMpOwogICAgICAgICAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGFpID0gZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRBY3Rpdml0eUluZm8oCkBAIC04Nyw3ICsxMzUsMTEgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIG5hdGl2ZSBsaWJyYXJ5OiAiICsgbGlibmFtZSk7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIG1OYXRpdmVIYW5kbGUgPSBsb2FkTmF0aXZlQ29kZShwYXRoLCBMb29wZXIubXlRdWV1ZSgpKTsKKyAgICAgICAgbU5hdGl2ZUhhbmRsZSA9IGxvYWROYXRpdmVDb2RlKHBhdGgsIExvb3Blci5teVF1ZXVlKCksCisgICAgICAgICAgICAgICAgIGdldEZpbGVzRGlyKCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlQXBwRmlsZXNEaXJlY3RvcnkoYWkucGFja2FnZU5hbWUpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgIEJ1aWxkLlZFUlNJT04uU0RLX0lOVCk7CisgICAgICAgIAogICAgICAgICBpZiAobU5hdGl2ZUhhbmRsZSA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBuYXRpdmUgbGlicmFyeTogIiArIHBhdGgpOwogICAgICAgICB9CkBAIC05OCw3ICsxNTAsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CiAgICAgICAgIGlmIChtQ3VyU3VyZmFjZUhvbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvblN1cmZhY2VEZXN0cm95ZWROYXRpdmUobU5hdGl2ZUhhbmRsZSwgbUN1clN1cmZhY2VIb2xkZXIpOworICAgICAgICAgICAgb25TdXJmYWNlRGVzdHJveWVkTmF0aXZlKG1OYXRpdmVIYW5kbGUpOwogICAgICAgICAgICAgbUN1clN1cmZhY2VIb2xkZXIgPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChtQ3VySW5wdXRRdWV1ZSAhPSBudWxsKSB7CkBAIC0xNTUsMjQgKzIwNyw0MyBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKG1EaXNwYXRjaGluZ1VuaGFuZGxlZEtleSkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gS2V5IGV2ZW50cyBmcm9tIHRoZSBJTUUgZG8gbm90IGdvIHRocm91Z2ggdGhlIGlucHV0IGNoYW5uZWw7CisgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGludGVyY2VwdCB0aGVtIGhlcmUgdG8gaGFuZCB0byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgICBkaXNwYXRjaEtleUV2ZW50TmF0aXZlKG1OYXRpdmVIYW5kbGUsIGV2ZW50KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKICAgICAgICAgaWYgKCFtRGVzdHJveWVkKSB7CiAgICAgICAgICAgICBtQ3VyU3VyZmFjZUhvbGRlciA9IGhvbGRlcjsKLSAgICAgICAgICAgIG9uU3VyZmFjZUNyZWF0ZWROYXRpdmUobU5hdGl2ZUhhbmRsZSwgaG9sZGVyKTsKKyAgICAgICAgICAgIG9uU3VyZmFjZUNyZWF0ZWROYXRpdmUobU5hdGl2ZUhhbmRsZSwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBpZiAoIW1EZXN0cm95ZWQpIHsKICAgICAgICAgICAgIG1DdXJTdXJmYWNlSG9sZGVyID0gaG9sZGVyOwotICAgICAgICAgICAgb25TdXJmYWNlQ2hhbmdlZE5hdGl2ZShtTmF0aXZlSGFuZGxlLCBob2xkZXIsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBvblN1cmZhY2VDaGFuZ2VkTmF0aXZlKG1OYXRpdmVIYW5kbGUsIGhvbGRlci5nZXRTdXJmYWNlKCksIGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgcHVibGljIHZvaWQgc3VyZmFjZVJlZHJhd05lZWRlZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICBpZiAoIW1EZXN0cm95ZWQpIHsKKyAgICAgICAgICAgIG1DdXJTdXJmYWNlSG9sZGVyID0gaG9sZGVyOworICAgICAgICAgICAgb25TdXJmYWNlUmVkcmF3TmVlZGVkTmF0aXZlKG1OYXRpdmVIYW5kbGUsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgewogICAgICAgICBtQ3VyU3VyZmFjZUhvbGRlciA9IG51bGw7CiAgICAgICAgIGlmICghbURlc3Ryb3llZCkgewotICAgICAgICAgICAgb25TdXJmYWNlRGVzdHJveWVkTmF0aXZlKG1OYXRpdmVIYW5kbGUsIGhvbGRlcik7CisgICAgICAgICAgICBvblN1cmZhY2VEZXN0cm95ZWROYXRpdmUobU5hdGl2ZUhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCkBAIC0xOTAsMTAgKzI2MSw0OCBAQAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIHZvaWQgZGlzcGF0Y2hVbmhhbmRsZWRLZXlFdmVudChLZXlFdmVudCBldmVudCkgewotICAgICAgICBWaWV3IGRlY29yID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0gICAgICAgIGlmIChkZWNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZWNvci5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KTsKKyAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKKyAgICAgICAgbU5hdGl2ZUNvbnRlbnRWaWV3LmdldExvY2F0aW9uSW5XaW5kb3cobUxvY2F0aW9uKTsKKyAgICAgICAgaW50IHcgPSBtTmF0aXZlQ29udGVudFZpZXcuZ2V0V2lkdGgoKTsKKyAgICAgICAgaW50IGggPSBtTmF0aXZlQ29udGVudFZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGlmIChtTG9jYXRpb25bMF0gIT0gbUxhc3RDb250ZW50WCB8fCBtTG9jYXRpb25bMV0gIT0gbUxhc3RDb250ZW50WQorICAgICAgICAgICAgICAgIHx8IHcgIT0gbUxhc3RDb250ZW50V2lkdGggfHwgaCAhPSBtTGFzdENvbnRlbnRIZWlnaHQpIHsKKyAgICAgICAgICAgIG1MYXN0Q29udGVudFggPSBtTG9jYXRpb25bMF07CisgICAgICAgICAgICBtTGFzdENvbnRlbnRZID0gbUxvY2F0aW9uWzFdOworICAgICAgICAgICAgbUxhc3RDb250ZW50V2lkdGggPSB3OworICAgICAgICAgICAgbUxhc3RDb250ZW50SGVpZ2h0ID0gaDsKKyAgICAgICAgICAgIGlmICghbURlc3Ryb3llZCkgeworICAgICAgICAgICAgICAgIG9uQ29udGVudFJlY3RDaGFuZ2VkTmF0aXZlKG1OYXRpdmVIYW5kbGUsIG1MYXN0Q29udGVudFgsCisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdENvbnRlbnRZLCBtTGFzdENvbnRlbnRXaWR0aCwgbUxhc3RDb250ZW50SGVpZ2h0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKworICAgIHZvaWQgZGlzcGF0Y2hVbmhhbmRsZWRLZXlFdmVudChLZXlFdmVudCBldmVudCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURpc3BhdGNoaW5nVW5oYW5kbGVkS2V5ID0gdHJ1ZTsKKyAgICAgICAgICAgIFZpZXcgZGVjb3IgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKKyAgICAgICAgICAgIGlmIChkZWNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVjb3IuZGlzcGF0Y2hLZXlFdmVudChldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGlzcGF0Y2hpbmdVbmhhbmRsZWRLZXkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHNldFdpbmRvd0ZsYWdzKGludCBmbGFncywgaW50IG1hc2spIHsKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0RmxhZ3MoZmxhZ3MsIG1hc2spOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldFdpbmRvd0Zvcm1hdChpbnQgZm9ybWF0KSB7CisgICAgICAgIGdldFdpbmRvdygpLnNldEZvcm1hdChmb3JtYXQpOworICAgIH0KKworICAgIHZvaWQgc2hvd0ltZShpbnQgbW9kZSkgeworICAgICAgICBtSU1NLnNob3dTb2Z0SW5wdXQobU5hdGl2ZUNvbnRlbnRWaWV3LCBtb2RlKTsKKyAgICB9CisKKyAgICB2b2lkIGhpZGVJbWUoaW50IG1vZGUpIHsKKyAgICAgICAgbUlNTS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhtTmF0aXZlQ29udGVudFZpZXcuZ2V0V2luZG93VG9rZW4oKSwgbW9kZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRNYW5hZ2VyLmphdmEKaW5kZXggZDRjZTZhMS4uM2YxMmJmOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKIApAQCAtMTQ5LDcgKzE0OCw3IEBACiAgICAgICogICAgIGluc3RhbmNlcyBhcyBwb3NzaWJsZS48L3RkPgogICAgICAqICA8L3RyPgogICAgICAqIDwvdGFibGU+Ci0gICAgICogCisgICAgICoKICAgICAgKiBAc2VlIEFwcFdpZGdldFByb3ZpZGVyI29uVXBkYXRlIEFwcFdpZGdldFByb3ZpZGVyLm9uVXBkYXRlKENvbnRleHQgY29udGV4dCwgQXBwV2lkZ2V0TWFuYWdlciBhcHBXaWRnZXRNYW5hZ2VyLCBpbnRbXSBhcHBXaWRnZXRJZHMpCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FQUFdJREdFVF9VUERBVEUgPSAiYW5kcm9pZC5hcHB3aWRnZXQuYWN0aW9uLkFQUFdJREdFVF9VUERBVEUiOwpAQCAtMTYzLDcgKzE2Miw3IEBACiAKICAgICAvKioKICAgICAgKiBTZW50IHdoZW4gYW4gaW5zdGFuY2Ugb2YgYW4gQXBwV2lkZ2V0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbGFzdCBob3N0LgotICAgICAqIAorICAgICAqCiAgICAgICogQHNlZSBBcHBXaWRnZXRQcm92aWRlciNvbkVuYWJsZWQgQXBwV2lkZ2V0UHJvdmlkZXIub25FbmFibGVkKENvbnRleHQgY29udGV4dCkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQVBQV0lER0VUX0RJU0FCTEVEID0gImFuZHJvaWQuYXBwd2lkZ2V0LmFjdGlvbi5BUFBXSURHRVRfRElTQUJMRUQiOwpAQCAtMTcyLDcgKzE3MSw3IEBACiAgICAgICogU2VudCB3aGVuIGFuIGluc3RhbmNlIG9mIGFuIEFwcFdpZGdldCBpcyBhZGRlZCB0byBhIGhvc3QgZm9yIHRoZSBmaXJzdCB0aW1lLgogICAgICAqIFRoaXMgYnJvYWRjYXN0IGlzIHNlbnQgYXQgYm9vdCB0aW1lIGlmIHRoZXJlIGlzIGEgQXBwV2lkZ2V0SG9zdCBpbnN0YWxsZWQgd2l0aAogICAgICAqIGFuIGluc3RhbmNlIGZvciB0aGlzIHByb3ZpZGVyLgotICAgICAqIAorICAgICAqCiAgICAgICogQHNlZSBBcHBXaWRnZXRQcm92aWRlciNvbkVuYWJsZWQgQXBwV2lkZ2V0UHJvdmlkZXIub25FbmFibGVkKENvbnRleHQgY29udGV4dCkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQVBQV0lER0VUX0VOQUJMRUQgPSAiYW5kcm9pZC5hcHB3aWRnZXQuYWN0aW9uLkFQUFdJREdFVF9FTkFCTEVEIjsKQEAgLTE4MywyMCArMTgyLDIxIEBACiAgICAgICogQHNlZSBBcHBXaWRnZXRQcm92aWRlckluZm8KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0RBVEFfQVBQV0lER0VUX1BST1ZJREVSID0gImFuZHJvaWQuYXBwd2lkZ2V0LnByb3ZpZGVyIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEZpZWxkIGZvciB0aGUgbWFuaWZlc3QgbWV0YS1kYXRhIHRhZyB1c2VkIHRvIGluZGljYXRlIGFueSBwcmV2aW91cyBuYW1lIGZvciB0aGUKICAgICAgKiBhcHAgd2lkZ2V0IHJlY2VpdmVyLgogICAgICAqCiAgICAgICogQHNlZSBBcHBXaWRnZXRQcm92aWRlckluZm8KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9EQVRBX0FQUFdJREdFVF9PTERfTkFNRSA9ICJhbmRyb2lkLmFwcHdpZGdldC5vbGROYW1lIjsKIAotICAgIHN0YXRpYyBXZWFrSGFzaE1hcDxDb250ZXh0LCBXZWFrUmVmZXJlbmNlPEFwcFdpZGdldE1hbmFnZXI+PiBzTWFuYWdlckNhY2hlID0gbmV3IFdlYWtIYXNoTWFwKCk7CisgICAgc3RhdGljIFdlYWtIYXNoTWFwPENvbnRleHQsIFdlYWtSZWZlcmVuY2U8QXBwV2lkZ2V0TWFuYWdlcj4+IHNNYW5hZ2VyQ2FjaGUgPQorICAgICAgICBuZXcgV2Vha0hhc2hNYXA8Q29udGV4dCwgV2Vha1JlZmVyZW5jZTxBcHBXaWRnZXRNYW5hZ2VyPj4oKTsKICAgICBzdGF0aWMgSUFwcFdpZGdldFNlcnZpY2Ugc1NlcnZpY2U7Ci0gICAgCisKICAgICBDb250ZXh0IG1Db250ZXh0OwogCiAgICAgcHJpdmF0ZSBEaXNwbGF5TWV0cmljcyBtRGlzcGxheU1ldHJpY3M7CkBAIC0yMTksNyArMjE5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcHBXaWRnZXRNYW5hZ2VyKGNvbnRleHQpOwotICAgICAgICAgICAgICAgIHNNYW5hZ2VyQ2FjaGUucHV0KGNvbnRleHQsIG5ldyBXZWFrUmVmZXJlbmNlKHJlc3VsdCkpOworICAgICAgICAgICAgICAgIHNNYW5hZ2VyQ2FjaGUucHV0KGNvbnRleHQsIG5ldyBXZWFrUmVmZXJlbmNlPEFwcFdpZGdldE1hbmFnZXI+KHJlc3VsdCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQpAQCAtMjkyLDcgKzI5MiwxNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PEFwcFdpZGdldFByb3ZpZGVySW5mbz4gZ2V0SW5zdGFsbGVkUHJvdmlkZXJzKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNTZXJ2aWNlLmdldEluc3RhbGxlZFByb3ZpZGVycygpOworICAgICAgICAgICAgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IHByb3ZpZGVycyA9IHNTZXJ2aWNlLmdldEluc3RhbGxlZFByb3ZpZGVycygpOworICAgICAgICAgICAgZm9yIChBcHBXaWRnZXRQcm92aWRlckluZm8gaW5mbyA6IHByb3ZpZGVycykgeworICAgICAgICAgICAgICAgIC8vIENvbnZlcnRpbmcgY29tcGxleCB0byBkcC4KKyAgICAgICAgICAgICAgICBpbmZvLm1pbldpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUuY29tcGxleFRvRGltZW5zaW9uUGl4ZWxTaXplKGluZm8ubWluV2lkdGgsIG1EaXNwbGF5TWV0cmljcyk7CisgICAgICAgICAgICAgICAgaW5mby5taW5IZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZS5jb21wbGV4VG9EaW1lbnNpb25QaXhlbFNpemUoaW5mby5taW5IZWlnaHQsIG1EaXNwbGF5TWV0cmljcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInN5c3RlbSBzZXJ2ZXIgZGVhZD8iLCBlKTsKQEAgLTMxMCw3ICszMTgsNyBAQAogICAgICAgICAgICAgQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8gPSBzU2VydmljZS5nZXRBcHBXaWRnZXRJbmZvKGFwcFdpZGdldElkKTsKICAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIGNvbXBsZXggdG8gZHAuCi0gICAgICAgICAgICAgICAgaW5mby5taW5XaWR0aCA9IAorICAgICAgICAgICAgICAgIGluZm8ubWluV2lkdGggPQogICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZS5jb21wbGV4VG9EaW1lbnNpb25QaXhlbFNpemUoaW5mby5taW5XaWR0aCwgbURpc3BsYXlNZXRyaWNzKTsKICAgICAgICAgICAgICAgICBpbmZvLm1pbkhlaWdodCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlZFZhbHVlLmNvbXBsZXhUb0RpbWVuc2lvblBpeGVsU2l6ZShpbmZvLm1pbkhlaWdodCwgbURpc3BsYXlNZXRyaWNzKTsKQEAgLTM0NCw3ICszNTIsNyBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgbGlzdCBvZiBhcHBXaWRnZXRJZHMgdGhhdCBoYXZlIGJlZW4gYm91bmQgdG8gdGhlIGdpdmVuIEFwcFdpZGdldAogICAgICAqIHByb3ZpZGVyLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyfSB0aGF0IGlzIHRoZQogICAgICAqICAgICAgICAgICAgQXBwV2lkZ2V0IHByb3ZpZGVyIHRvIGZpbmQgYXBwV2lkZ2V0SWRzIGZvci4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKaW5kZXggODZkZGVlNC4uYjQ5ZDgwMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKQEAgLTE1NjEsNiArMTU2MSwxNSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX01PREVfU0VSVklDRSA9ICJ1aW1vZGUiOwogCiAgICAgLyoqCisgICAgICogVXNlIHdpdGgge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfSB0byByZXRyaWV2ZSBhCisgICAgICoge0BsaW5rIGFuZHJvaWQubmV0LkRvd25sb2FkTWFuYWdlcn0gZm9yIHJlcXVlc3RpbmcgSFRUUCBkb3dubG9hZHMuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRTeXN0ZW1TZXJ2aWNlCisgICAgICogQGhpZGUgKFRPRE8pIGZvciBub3cKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOTE9BRF9TRVJWSUNFID0gImRvd25sb2FkIjsKKworICAgIC8qKgogICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBwZXJtaXNzaW9uIGlzIGFsbG93ZWQgZm9yIGEgcGFydGljdWxhcgogICAgICAqIHByb2Nlc3MgYW5kIHVzZXIgSUQgcnVubmluZyBpbiB0aGUgc3lzdGVtLgogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXIuYWlkbAppbmRleCA5OTM5NDc4Li4xNjBhNDgxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyLmFpZGwKQEAgLTMxOSw0ICszMTksNiBAQAogCiAgICAgYm9vbGVhbiBzZXRJbnN0YWxsTG9jYXRpb24oaW50IGxvYyk7CiAgICAgaW50IGdldEluc3RhbGxMb2NhdGlvbigpOworCisgICAgdm9pZCBzZXRQYWNrYWdlT2JiUGF0aChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBwYXRoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YQppbmRleCAxYTViNDE5Li4xNWE0NDZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlci5qYXZhCkBAIC0yMTkzLDQgKzIxOTMsMTcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb3ZlUGFja2FnZSgKICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgSVBhY2thZ2VNb3ZlT2JzZXJ2ZXIgb2JzZXJ2ZXIsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBPcGFxdWUgQmluYXJ5IEJsb2IgKE9CQikgZmlsZSBsb2NhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBOT1RFOiBUaGUgZXhpc3RlbmNlIG9yIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgbm90IGN1cnJlbnRseSBjaGVja2VkLCBidXQKKyAgICAgKiBpdCBtYXkgYmUgaW4gdGhlIGZ1dHVyZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZSB3aXRoIHdoaWNoIHRvIGFzc29jaWF0ZSB0aGUgLm9iYgorICAgICAqICAgICAgICAgICAgZmlsZQorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb24gdGhlIGZpbGVzeXN0ZW0gdG8gdGhlIC5vYmIgZmlsZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UGFja2FnZU9iYlBhdGgoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcGF0aCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9QbHVyYWxSdWxlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjZTNjMS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9QbHVyYWxSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuY29udGVudC5yZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKgotICogWXVjay1vLiAgVGhpcyBpcyBub3QgdGhlIHJpZ2h0IHdheSB0byBpbXBsZW1lbnQgdGhpcy4gIFdoZW4gdGhlIElDVSBQbHVyYWxSdWxlcwotICogb2JqZWN0IGhhcyBiZWVuIGludGVncmF0ZWQgdG8gYW5kcm9pZCwgd2Ugc2hvdWxkIHN3aXRjaCB0byB0aGF0LiAgRm9yIG5vdywgeXVjay1vLgotICovCi0KLWFic3RyYWN0IGNsYXNzIFBsdXJhbFJ1bGVzIHsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfT1RIRVIgPSAweDAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9aRVJPICA9IDB4MDAwMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX09ORSAgID0gMHgwMDAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfVFdPICAgPSAweDAwMDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9GRVcgICA9IDB4MDAwODsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX01BTlkgID0gMHgwMDEwOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBJRF9PVEhFUiA9IDB4MDEwMDAwMDQ7Ci0KLSAgICBhYnN0cmFjdCBpbnQgcXVhbnRpdHlGb3JOdW1iZXIoaW50IG4pOwotCi0gICAgZmluYWwgaW50IGF0dHJGb3JOdW1iZXIoaW50IG4pIHsKLSAgICAgICAgcmV0dXJuIFBsdXJhbFJ1bGVzLmF0dHJGb3JRdWFudGl0eShxdWFudGl0eUZvck51bWJlcihuKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGludCBhdHRyRm9yUXVhbnRpdHkoaW50IHF1YW50aXR5KSB7Ci0gICAgICAgIC8vIHNlZSBpbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaAotICAgICAgICBzd2l0Y2ggKHF1YW50aXR5KSB7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1pFUk86IHJldHVybiAweDAxMDAwMDA1OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9PTkU6ICByZXR1cm4gMHgwMTAwMDAwNjsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfVFdPOiAgcmV0dXJuIDB4MDEwMDAwMDc7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX0ZFVzogIHJldHVybiAweDAxMDAwMDA4OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9NQU5ZOiByZXR1cm4gMHgwMTAwMDAwOTsKLSAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIElEX09USEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBzdHJpbmdGb3JRdWFudGl0eShpbnQgcXVhbnRpdHkpIHsKLSAgICAgICAgc3dpdGNoIChxdWFudGl0eSkgewotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9aRVJPOgotICAgICAgICAgICAgICAgIHJldHVybiAiemVybyI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX09ORToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9uZSI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1RXTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInR3byI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX0ZFVzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImZldyI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX01BTlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJtYW55IjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvdGhlciI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgUGx1cmFsUnVsZXMgcnVsZUZvckxvY2FsZShMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIFN0cmluZyBsYW5nID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIGlmICgiY3MiLmVxdWFscyhsYW5nKSkgewotICAgICAgICAgICAgaWYgKGNzID09IG51bGwpIGNzID0gbmV3IGNzKCk7Ci0gICAgICAgICAgICByZXR1cm4gY3M7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZW4gPT0gbnVsbCkgZW4gPSBuZXcgZW4oKTsKLSAgICAgICAgICAgIHJldHVybiBlbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFBsdXJhbFJ1bGVzIGNzOwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGNzIGV4dGVuZHMgUGx1cmFsUnVsZXMgewotICAgICAgICBpbnQgcXVhbnRpdHlGb3JOdW1iZXIoaW50IG4pIHsKLSAgICAgICAgICAgIGlmIChuID09IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT05FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobiA+PSAyICYmIG4gPD0gNCkgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9GRVc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQbHVyYWxSdWxlcyBlbjsKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBlbiBleHRlbmRzIFBsdXJhbFJ1bGVzIHsKLSAgICAgICAgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9PVEhFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQppbmRleCAwNjA4Y2MwLi41YWM1NWM0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5yZXM7CiAKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CiAKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwpAQCAtNDEsNiArNDAsOCBAQAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCitpbXBvcnQgbGliY29yZS5pY3UuTmF0aXZlUGx1cmFsUnVsZXM7CisKIC8qKgogICogQ2xhc3MgZm9yIGFjY2Vzc2luZyBhbiBhcHBsaWNhdGlvbidzIHJlc291cmNlcy4gIFRoaXMgc2l0cyBvbiB0b3Agb2YgdGhlCiAgKiBhc3NldCBtYW5hZ2VyIG9mIHRoZSBhcHBsaWNhdGlvbiAoYWNjZXNzaWJsZSB0aHJvdWdoIGdldEFzc2V0cygpKSBhbmQKQEAgLTUyLDYgKzUzLDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0NPTkZJRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0VfRk9SX1BSRUxPQUQgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9PVEhFUiA9IDB4MDEwMDAwMDQ7CisKICAgICAvLyBVc2UgdGhlIGN1cnJlbnQgU0RLIHZlcnNpb24gY29kZS4gIElmIHdlIGFyZSBhIGRldmVsb3BtZW50IGJ1aWxkLAogICAgIC8vIGFsc28gYWxsb3cgdGhlIHByZXZpb3VzIFNESyB2ZXJzaW9uICsgMS4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc1Nka1ZlcnNpb24gPSBCdWlsZC5WRVJTSU9OLlNES19JTlQKQEAgLTg2LDcgKzg5LDcgQEAKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBBc3NldE1hbmFnZXIgbUFzc2V0czsKICAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gbUNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOwogICAgIC8qcGFja2FnZSovIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1NZXRyaWNzID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgUGx1cmFsUnVsZXMgbVBsdXJhbFJ1bGU7CisgICAgcHJpdmF0ZSBOYXRpdmVQbHVyYWxSdWxlcyBtUGx1cmFsUnVsZTsKICAgICAKICAgICBwcml2YXRlIENvbXBhdGliaWxpdHlJbmZvIG1Db21wYXRpYmlsaXR5SW5mbzsKICAgICBwcml2YXRlIERpc3BsYXkgbURlZmF1bHREaXNwbGF5OwpAQCAtMjAzLDkgKzIwNiwxNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgSUQgZm9yIGEgcGFydGljdWxhcgorICAgICAqIG51bWVyaWNhbCBxdWFudGl0eS4KKyAgICAgKgorICAgICAqIDxwPlNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuaHRtbCNQbHVyYWxzIj5TdHJpbmcKKyAgICAgKiBSZXNvdXJjZXM8L2E+IGZvciBtb3JlIG9uIHF1YW50aXR5IHN0cmluZ3MuCisgICAgICoKICAgICAgKiBAcGFyYW0gaWQgVGhlIGRlc2lyZWQgcmVzb3VyY2UgaWRlbnRpZmllciwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBhYXB0CiAgICAgICogICAgICAgICAgIHRvb2wuIFRoaXMgaW50ZWdlciBlbmNvZGVzIHRoZSBwYWNrYWdlLCB0eXBlLCBhbmQgcmVzb3VyY2UKICAgICAgKiAgICAgICAgICAgZW50cnkuIFRoZSB2YWx1ZSAwIGlzIGFuIGludmFsaWQgaWRlbnRpZmllci4KKyAgICAgKiBAcGFyYW0gcXVhbnRpdHkgVGhlIG51bWJlciB1c2VkIHRvIGdldCB0aGUgY29ycmVjdCBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlJ3MKKyAgICAgKiAgICAgICAgICAgcGx1cmFsIHJ1bGVzLgogICAgICAqCiAgICAgICogQHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiBUaHJvd3MgTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIElEIGRvZXMgbm90IGV4aXN0LgogICAgICAqCkBAIC0yMTMsMjkgKzIyNCw1MiBAQAogICAgICAqICAgICAgICAgcG9zc2libHkgc3R5bGVkIHRleHQgaW5mb3JtYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRRdWFudGl0eVRleHQoaW50IGlkLCBpbnQgcXVhbnRpdHkpIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBsdXJhbFJ1bGVzIHJ1bGUgPSBnZXRQbHVyYWxSdWxlKCk7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwgcnVsZS5hdHRyRm9yTnVtYmVyKHF1YW50aXR5KSk7CisgICAgICAgIE5hdGl2ZVBsdXJhbFJ1bGVzIHJ1bGUgPSBnZXRQbHVyYWxSdWxlKCk7CisgICAgICAgIENoYXJTZXF1ZW5jZSByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwKKyAgICAgICAgICAgICAgICBhdHRyRm9yUXVhbnRpdHlDb2RlKHJ1bGUucXVhbnRpdHlGb3JJbnQocXVhbnRpdHkpKSk7CiAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwgUGx1cmFsUnVsZXMuSURfT1RIRVIpOworICAgICAgICByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwgSURfT1RIRVIpOwogICAgICAgICBpZiAocmVzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCJQbHVyYWwgcmVzb3VyY2UgSUQgIzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoaWQpCiAgICAgICAgICAgICAgICAgKyAiIHF1YW50aXR5PSIgKyBxdWFudGl0eQotICAgICAgICAgICAgICAgICsgIiBpdGVtPSIgKyBQbHVyYWxSdWxlcy5zdHJpbmdGb3JRdWFudGl0eShydWxlLnF1YW50aXR5Rm9yTnVtYmVyKHF1YW50aXR5KSkpOworICAgICAgICAgICAgICAgICsgIiBpdGVtPSIgKyBzdHJpbmdGb3JRdWFudGl0eUNvZGUocnVsZS5xdWFudGl0eUZvckludChxdWFudGl0eSkpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFBsdXJhbFJ1bGVzIGdldFBsdXJhbFJ1bGUoKSB7CisgICAgcHJpdmF0ZSBOYXRpdmVQbHVyYWxSdWxlcyBnZXRQbHVyYWxSdWxlKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobVBsdXJhbFJ1bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QbHVyYWxSdWxlID0gUGx1cmFsUnVsZXMucnVsZUZvckxvY2FsZShtQ29uZmlndXJhdGlvbi5sb2NhbGUpOworICAgICAgICAgICAgICAgIG1QbHVyYWxSdWxlID0gTmF0aXZlUGx1cmFsUnVsZXMuZm9yTG9jYWxlKG1Db25maWd1cmF0aW9uLmxvY2FsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbVBsdXJhbFJ1bGU7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYXR0ckZvclF1YW50aXR5Q29kZShpbnQgcXVhbnRpdHlDb2RlKSB7CisgICAgICAgIHN3aXRjaCAocXVhbnRpdHlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlpFUk86IHJldHVybiAweDAxMDAwMDA1OworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5PTkU6ICByZXR1cm4gMHgwMTAwMDAwNjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuVFdPOiAgcmV0dXJuIDB4MDEwMDAwMDc7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLkZFVzogIHJldHVybiAweDAxMDAwMDA4OworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5NQU5ZOiByZXR1cm4gMHgwMTAwMDAwOTsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEX09USEVSOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0cmluZ0ZvclF1YW50aXR5Q29kZShpbnQgcXVhbnRpdHlDb2RlKSB7CisgICAgICAgIHN3aXRjaCAocXVhbnRpdHlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlpFUk86IHJldHVybiAiemVybyI7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLk9ORTogIHJldHVybiAib25lIjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuVFdPOiAgcmV0dXJuICJ0d28iOworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5GRVc6ICByZXR1cm4gImZldyI7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLk1BTlk6IHJldHVybiAibWFueSI7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3RoZXIiOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciByZXNvdXJjZSBJRC4gIEl0CiAgICAgICogd2lsbCBiZSBzdHJpcHBlZCBvZiBhbnkgc3R5bGVkIHRleHQgaW5mb3JtYXRpb24uCkBAIC0yOTAsNiArMzI0LDkgQEAKICAgICAgKiBzdHJpcHBlZCBvZiBhbnkgc3R5bGVkIHRleHQgaW5mb3JtYXRpb24uCiAgICAgICoge0Btb3JlfQogICAgICAqCisgICAgICogPHA+U2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5odG1sI1BsdXJhbHMiPlN0cmluZworICAgICAqIFJlc291cmNlczwvYT4gZm9yIG1vcmUgb24gcXVhbnRpdHkgc3RyaW5ncy4KKyAgICAgKgogICAgICAqIEBwYXJhbSBpZCBUaGUgZGVzaXJlZCByZXNvdXJjZSBpZGVudGlmaWVyLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIGFhcHQKICAgICAgKiAgICAgICAgICAgdG9vbC4gVGhpcyBpbnRlZ2VyIGVuY29kZXMgdGhlIHBhY2thZ2UsIHR5cGUsIGFuZCByZXNvdXJjZQogICAgICAqICAgICAgICAgICBlbnRyeS4gVGhlIHZhbHVlIDAgaXMgYW4gaW52YWxpZCBpZGVudGlmaWVyLgpAQCAtMzEyLDYgKzM0OSw5IEBACiAgICAgICogUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciByZXNvdXJjZSBJRCBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICogbnVtZXJpY2FsIHF1YW50aXR5LgogICAgICAqCisgICAgICogPHA+U2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5odG1sI1BsdXJhbHMiPlN0cmluZworICAgICAqIFJlc291cmNlczwvYT4gZm9yIG1vcmUgb24gcXVhbnRpdHkgc3RyaW5ncy4KKyAgICAgKgogICAgICAqIEBwYXJhbSBpZCBUaGUgZGVzaXJlZCByZXNvdXJjZSBpZGVudGlmaWVyLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIGFhcHQKICAgICAgKiAgICAgICAgICAgdG9vbC4gVGhpcyBpbnRlZ2VyIGVuY29kZXMgdGhlIHBhY2thZ2UsIHR5cGUsIGFuZCByZXNvdXJjZQogICAgICAqICAgICAgICAgICBlbnRyeS4gVGhlIHZhbHVlIDAgaXMgYW4gaW52YWxpZCBpZGVudGlmaWVyLgpAQCAtMTMzNCw3ICsxMzc0LDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobVBsdXJhbFJ1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QbHVyYWxSdWxlID0gUGx1cmFsUnVsZXMucnVsZUZvckxvY2FsZShjb25maWcubG9jYWxlKTsKKyAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IE5hdGl2ZVBsdXJhbFJ1bGVzLmZvckxvY2FsZShjb25maWcubG9jYWxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCmluZGV4IDgwZWIxOGIuLjliMTQ5OTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQpAQCAtMzMwLDkgKzMzMCw5IEBACiAgICAgICAgIHJldHVybiBtRGF0YVNldE9ic2VydmFibGU7CiAgICAgICAgIAogICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKERhdGFTZXRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtRGF0YVNldE9ic2VydmFibGUucmVnaXN0ZXJPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgIAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CkBAIC0zODcsMzYgKzM4NywxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBoYXMgYmVlbiB1cGRhdGVkIGFuZCBpcwotICAgICAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI2dldFVwZGF0ZWRGaWVsZH0gdG8gYWxsb3cgc3ViY2xhc3NlcyB0bwotICAgICAqIHN1cHBvcnQgcmVhZGluZyB1bmNvbW1pdHRlZCB1cGRhdGVzLiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFuZAotICAgICAqIHtAbGluayAjZ2V0VXBkYXRlZEZpZWxkfSBzaG91bGQgYmUgY2FsbGVkIHRvZ2V0aGVyIGluc2lkZSBvZiBhCi0gICAgICogYmxvY2sgc3luY2hyb25pemVkIG9uIG1VcGRhdGVkUm93cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgY29sdW1uIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjawotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaGFzIGJlZW4gdXBkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQGRlcHJlY2F0ZWQgQWx3YXlzIHJldHVybnMgZmFsc2Ugc2luY2UgQ3Vyc29ycyBkbyBub3Qgc3VwcG9ydCB1cGRhdGluZyByb3dzCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpZWxkVXBkYXRlZChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgaWYgKG1Sb3dJZENvbHVtbkluZGV4ICE9IC0xICYmIG1VcGRhdGVkUm93cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHVwZGF0ZXMgPSBtVXBkYXRlZFJvd3MuZ2V0KG1DdXJyZW50Um93SUQpOwotICAgICAgICAgICAgaWYgKHVwZGF0ZXMgIT0gbnVsbCAmJiB1cGRhdGVzLmNvbnRhaW5zS2V5KGdldENvbHVtbk5hbWVzKClbY29sdW1uSW5kZXhdKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHVuY29tbWl0dGVkIHVwZGF0ZWQgdmFsdWUgZm9yIHRoZSBmaWVsZAotICAgICAqIGF0IGNvbHVtbkluZGV4LiAgTk9URTogVGhpcyBmdW5jdGlvbiBhbmQge0BsaW5rICNpc0ZpZWxkVXBkYXRlZH0gc2hvdWxkCi0gICAgICogYmUgY2FsbGVkIHRvZ2V0aGVyIGluc2lkZSBvZiBhIGJsb2NrIHN5bmNocm9uaXplZCBvbiBtVXBkYXRlZFJvd3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIGNvbHVtbiBpbmRleCBvZiB0aGUgZmllbGQgdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIHZhbHVlCisgICAgICogQGRlcHJlY2F0ZWQgQWx3YXlzIHJldHVybnMgbnVsbCBzaW5jZSBDdXJzb3JzIGRvIG5vdCBzdXBwb3J0IHVwZGF0aW5nIHJvd3MKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VXBkYXRlZEZpZWxkKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHVwZGF0ZXMgPSBtVXBkYXRlZFJvd3MuZ2V0KG1DdXJyZW50Um93SUQpOwotICAgICAgICByZXR1cm4gdXBkYXRlcy5nZXQoZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF0pOworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTQ2NiwxMSArNDQ5LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIEhhc2hNYXAgY29udGFpbnMgYSBtYXBwaW5nIGZyb20gTG9uZyByb3dJRHMgdG8gYW5vdGhlciBNYXAKLSAgICAgKiB0aGF0IG1hcHMgZnJvbSBTdHJpbmcgY29sdW1uIG5hbWVzIHRvIG5ldyB2YWx1ZXMuIEEgTlVMTCB2YWx1ZSBtZWFucyB0bwotICAgICAqIHJlbW92ZSBhbiBleGlzdGluZyB2YWx1ZSwgYW5kIGFsbCBudW1lcmljIHZhbHVlcyBhcmUgaW4gdGhlaXIgY2xhc3MKLSAgICAgKiBmb3JtcywgaS5lLiBJbnRlZ2VyLCBMb25nLCBGbG9hdCwgZXRjLgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgaXMgbmV2ZXIgdXBkYXRlZCBieSB0aGlzIGNsYXNzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBIYXNoTWFwPExvbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IG1VcGRhdGVkUm93czsKIAogICAgIC8qKgpAQCAtNDgwLDYgKzQ2MSwxMSBAQAogICAgIHByb3RlY3RlZCBpbnQgbVJvd0lkQ29sdW1uSW5kZXg7CiAKICAgICBwcm90ZWN0ZWQgaW50IG1Qb3M7CisgICAgLyoqCisgICAgICogSWYge0BsaW5rICNtUm93SWRDb2x1bW5JbmRleH0gaXMgbm90IC0xIHRoaXMgY29udGFpbnMgY29udGFpbnMgdGhlIHZhbHVlIG9mCisgICAgICogdGhlIGNvbHVtbiBhdCB7QGxpbmsgI21Sb3dJZENvbHVtbkluZGV4fSBmb3IgdGhlIGN1cnJlbnQgcm93IHRoaXMgY3Vyc29yIGlzCisgICAgICogcG9pbnRpbmcgYXQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExvbmcgbUN1cnJlbnRSb3dJRDsKICAgICBwcm90ZWN0ZWQgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNsb3NlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhCmluZGV4IGU0N2Q5Y2UuLjhhZGRhYTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0V2luZG93ZWRDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEKQEAgLTE5LDE3NSArMTksMTA1IEBACiAvKioKICAqIEEgYmFzZSBjbGFzcyBmb3IgQ3Vyc29ycyB0aGF0IHN0b3JlIHRoZWlyIGRhdGEgaW4ge0BsaW5rIEN1cnNvcldpbmRvd31zLgogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciBleHRlbmRzIEFic3RyYWN0Q3Vyc29yCi17CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciBleHRlbmRzIEFic3RyYWN0Q3Vyc29yIHsKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJsb2IoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJsb2IoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChieXRlW10pZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEJsb2IobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW5JbmRleCkKLSAgICB7CisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldFN0cmluZyhtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29weVN0cmluZ1RvQnVmZmVyKGludCBjb2x1bW5JbmRleCwgQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikKLSAgICB7CisgICAgcHVibGljIHZvaWQgY29weVN0cmluZ1RvQnVmZmVyKGludCBjb2x1bW5JbmRleCwgQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuY29weVN0cmluZ1RvQnVmZmVyKGNvbHVtbkluZGV4LCBidWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICBtV2luZG93LmNvcHlTdHJpbmdUb0J1ZmZlcihtUG9zLCBjb2x1bW5JbmRleCwgYnVmZmVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcilnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zaG9ydFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRTaG9ydChtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRJbnQoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRJbnQobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRMb25nKG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcilnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5mbG9hdFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRGbG9hdChtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXREb3VibGUobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KSA9PSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0VHlwZShtUG9zLCBjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNCbG9iKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0VHlwZX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzTG9uZyhpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgcmV0dXJuIGdldFR5cGUoY29sdW1uSW5kZXgpID09IEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0VHlwZX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzRmxvYXQoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBEYXRhYmFzZVV0aWxzLmdldFR5cGVPZk9iamVjdChnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldFR5cGUobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUG9zaXRpb24oKQotICAgIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1Bvc2l0aW9uKCkgewogICAgICAgICBzdXBlci5jaGVja1Bvc2l0aW9uKCk7CiAgICAgICAgIAogICAgICAgICBpZiAobVdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVEYXRhRXhjZXB0aW9uKCJBY2Nlc3MgY2xvc2VkIGN1cnNvciIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFN0YWxlRGF0YUV4Y2VwdGlvbigiQXR0ZW1wdGluZyB0byBhY2Nlc3MgYSBjbG9zZWQgY3Vyc29yIik7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbC5qYXZhCmluZGV4IDNmNzAxOGYuLjUwYjI5MTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YQpAQCAtNDgsNiArNDgsOSBAQAogICAgIC8qKiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHdoaWNoIHRoaXMgY29ubmVjdGlvbiBwb29sIGlzIGF0dGFjaGVkICovCiAgICAgcHJpdmF0ZSBmaW5hbCBTUUxpdGVEYXRhYmFzZSBtUGFyZW50RGJPYmo7CiAKKyAgICAvKiogUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdXNlZCB0byBwaWNrIGEgZnJlZSBjb25uZWN0aW9uIG91dCBvZiB0aGUgcG9vbCAqLworICAgIHByaXZhdGUgUmFuZG9tIHJhbmQ7IC8vIGxhemlseSBpbml0aWFsaXplZAorCiAgICAgLyogcGFja2FnZSAqLyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKFNRTGl0ZURhdGFiYXNlIGRiKSB7CiAgICAgICAgIHRoaXMubVBhcmVudERiT2JqID0gZGI7CiAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKQEAgLTc1LDUwICs3OCw2NyBAQAogICAgICAqIEByZXR1cm4gdGhlIERhdGFiYXNlIGNvbm5lY3Rpb24gdGhhdCB0aGUgY2FsbGVyIGNhbiB1c2UKICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGdldChTdHJpbmcgc3FsKSB7Ci0gICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKLSAgICAgICAgICAgIGRvQXNzZXJ0cygpOwotICAgICAgICB9Ci0KICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBudWxsOwogICAgICAgICBQb29sT2JqIHBvb2xPYmogPSBudWxsOwogICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICBpbnQgcG9vbFNpemUgPSBtUG9vbC5zaXplKCk7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHNxbCAhPSBudWxsOworICAgICAgICAgICAgICAgIGRvQXNzZXJ0cygpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGdldEZyZWVQb29sU2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobU1heFBvb2xTaXplID09IG1Qb29sLnNpemUoKSkgeworICAgICAgICAgICAgICAgIC8vIG5vIGZyZWUgKCA9IGF2YWlsYWJsZSkgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICBpZiAobU1heFBvb2xTaXplID09IHBvb2xTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1heGVkIG91dC4gY2FuJ3Qgb3BlbiBhbnkgbW9yZSBjb25uZWN0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSBjYWxsZXIgd2FpdCBvbiBvbmUgb2YgdGhlIHBvb2xlZCBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgICAgICAvLyBwcmVmZXJhYmx5IGEgY29ubmVjdGlvbiBjYWNoaW5nIHRoZSBwcmUtY29tcGlsZWQgc3RhdGVtZW50IG9mIHRoZSBnaXZlbiBTUUwKICAgICAgICAgICAgICAgICAgICAgaWYgKG1NYXhQb29sU2l6ZSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KDApOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDAgYW5kIChtTWF4UG9vbFNpemUtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYW5kb20oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpLm5leHRJbnQobU1heFBvb2xTaXplLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1heFBvb2xTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLm1EYi5pc1NxbEluU3RhdGVtZW50Q2FjaGUoc3FsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9vbE9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIG5vIGRhdGFiYXNlIGNvbm5lY3Rpb25zIHdpdGggdGhlIGdpdmVuIFNRTCBwcmUtY29tcGlsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sgdG8gcmV0dXJuIGFueSBvZiB0aGUgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kID0gbmV3IFJhbmRvbShTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQocmFuZC5uZXh0SW50KG1NYXhQb29sU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGRiID0gcG9vbE9iai5tRGI7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gYW5kIGFkZCBpdCB0byB0aGUgcG9vbCwgc2luY2Ugd2UgaGF2ZW4ndCByZWFjaGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIG1heCBwb29sIHNpemUgYWxsb3dlZAotICAgICAgICAgICAgICAgICAgICBpbnQgcG9vbFNpemUgPSBnZXRQb29sU2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICBkYiA9IG1QYXJlbnREYk9iai5jcmVhdGVQb29sQ29ubmVjdGlvbigoc2hvcnQpKHBvb2xTaXplICsgMSkpOwogICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbmV3IFBvb2xPYmooZGIpOwogICAgICAgICAgICAgICAgICAgICBtUG9vbC5hZGQocG9vbFNpemUsIHBvb2xPYmopOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIGZyZWUgY29ubmVjdGlvbnMgYXZhaWxhYmxlLiBwaWNrIG9uZQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUG9vbC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBvb2xPYmouaXNGcmVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGZyZWUgLSBidXQgZG9lcyBpdHMgZGF0YWJhc2Ugb2JqZWN0IGFscmVhZHkgaGF2ZSB0aGUgZ2l2ZW4gc3FsIGluIGl0cwotICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZW1lbnQtY2FjaGU/Ci0gICAgICAgICAgICAgICAgICAgIGRiID0gcG9vbE9iai5tRGI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcWwgPT0gbnVsbCB8fCBkYi5pc1NxbEluU3RhdGVtZW50Q2FjaGUoc3FsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYSBmcmVlIGNvbm5lY3Rpb24gd2UgY2FuIHVzZQorICAgICAgICAgICAgICAgIC8vIHByZWZlcmFibHkgYSBjb25uZWN0aW9uIGNhY2hpbmcgdGhlIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgb2YgdGhlIGdpdmVuIFNRTAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9vbFNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpICYmIG1Qb29sLmdldChpKS5tRGIuaXNTcWxJblN0YXRlbWVudENhY2hlKHNxbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBoYXZlbid0IGZvdW5kIGEgZGF0YWJhc2Ugb2JqZWN0IHdoaWNoIGhhcyB0aGUgZ2l2ZW4gc3FsIGluIGl0cwotICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZW1lbnQtY2FjaGUKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvb2xPYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGZyZWUgZGF0YWJhc2UgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBTUUwgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAvLyBwcmUtY29tcGlsZWQuIHJldHVybiBhIGZyZWUgY29ubmVjdGlvbiAodGhpcyBtZWFucywgdGhlIHNhbWUgU1FMIGNvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgIC8vIHByZS1jb21waWxlZCBvbiBtb3JlIHRoYW4gb25lIGRhdGFiYXNlIGNvbm5lY3Rpb24uIHBvdGVudGlhbCB3YXN0ZWQgbWVtb3J5LikKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb29sU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYiA9IHBvb2xPYmoubURiOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBhc3NlcnQgcG9vbE9iaiAhPSBudWxsOwpAQCAtMTgxLDEzICsyMDEsMTAgQEAKICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgfQogCi0gICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0UG9vbFNpemUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9vbC5zaXplKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRGcmVlUG9vbFNpemUoKSB7CisgICAgLyoqCisgICAgICogcGFja2FnZSBsZXZlbCBhY2Nlc3MgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4gb3RoZXJ3aXNlLCBwcml2YXRlIHNob3VsZCBiZSBzdWZmaWNpZW50LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldEZyZWVQb29sU2l6ZSgpIHsKICAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CkBAIC0xOTcsMTIgKzIxNCwyOSBAQAogICAgICAgICByZXR1cm4gY291bnQrKzsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBBcnJheUxpc3Q8UG9vbE9iaj4gZ2V0UG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb29sOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiZGI6ICIgKyBtUGFyZW50RGJPYmouZ2V0UGF0aCgpICsKLSAgICAgICAgICAgICAgICAiLCB0aHJlYWRpZCA9ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKwotICAgICAgICAgICAgICAgICIsIHRvdGFsc2l6ZSA9ICIgKyBtUG9vbC5zaXplKCkgKyAiLCAjZnJlZSA9ICIgKyBnZXRGcmVlUG9vbFNpemUoKSArCi0gICAgICAgICAgICAgICAgIiwgbWF4cG9vbHNpemUgPSAiICsgbU1heFBvb2xTaXplOworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWZmLmFwcGVuZCgiZGI6ICIpOworICAgICAgICBidWZmLmFwcGVuZChtUGFyZW50RGJPYmouZ2V0UGF0aCgpKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoIiwgdG90YWxzaXplID0gIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKG1Qb29sLnNpemUoKSk7CisgICAgICAgIGJ1ZmYuYXBwZW5kKCIsICNmcmVlID0gIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKGdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoIiwgbWF4cG9vbHNpemUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQobU1heFBvb2xTaXplKTsKKyAgICAgICAgZm9yIChQb29sT2JqIHAgOiBtUG9vbCkgeworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChwLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRvQXNzZXJ0cygpIHsKQEAgLTIyNCwxMCArMjU4LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiogb25seSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAqLworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc0RhdGFiYXNlT2JqRnJlZShTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICByZXR1cm4gbVBvb2wuZ2V0KGRiLm1Db25uZWN0aW9uTnVtIC0gMSkuaXNGcmVlKCk7CisgICAgfQorCisgICAgLyoqIG9ubHkgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi8KKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gbVBvb2wuc2l6ZSgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIHJlcHJlc2VudHMgb2JqZWN0cyBpbiB0aGUgY29ubmVjdGlvbiBwb29sLgorICAgICAqIHBhY2thZ2UtbGV2ZWwgYWNjZXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9vbE9iaiB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgUG9vbE9iaiB7CiAKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTUUxpdGVEYXRhYmFzZSBtRGI7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRnJlZUJ1c3lGbGFnID0gRlJFRTsKQEAgLTI4OSw2ICszMzQsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtSG9sZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBtTnVtSG9sZGVyczsKKyAgICAgICAgfQorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKaW5kZXggZWVjMDNiMi4uNDQxMzcwYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFwcEdsb2JhbHM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CkBAIC0zNDQsMjUgKzM0MywxNCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTU9SWV9EQl9QQVRIID0gIjptZW1vcnk6IjsKIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbG9zYWJsZQotICAgICAqLwotICAgIHZvaWQgYWRkU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVByb2dyYW1zLnB1dChjbG9zYWJsZSwgbnVsbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgIHN5bmNocm9uaXplZCB2b2lkIGFkZFNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7CisgICAgICAgIC8vIG1Qcm9ncmFtcyBpcyBwZXIgaW5zdGFuY2Ugb2YgU1FMaXRlRGF0YWJhc2UgYW5kIGl0IGRvZXNuJ3QgYWN0dWFsbHkgdG91Y2ggdGhlIGRhdGFiYXNlCisgICAgICAgIC8vIGl0c2VsZi4gc28sIHRoZXJlIGlzIG5vIG5lZWQgdG8gbG9jaygpLgorICAgICAgICBtUHJvZ3JhbXMucHV0KGNsb3NhYmxlLCBudWxsKTsKICAgICB9CiAKLSAgICB2b2lkIHJlbW92ZVNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Qcm9ncmFtcy5yZW1vdmUoY2xvc2FibGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTUUxpdGVDbG9zYWJsZShTUUxpdGVDbG9zYWJsZSBjbG9zYWJsZSkgeworICAgICAgICBtUHJvZ3JhbXMucmVtb3ZlKGNsb3NhYmxlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTYyNSw3ICs2MTMsMTAgQEAKIAogICAgICAgICAgICAgLy8gVGhpcyB0aHJlYWQgZGlkbid0IGFscmVhZHkgaGF2ZSB0aGUgbG9jaywgc28gYmVnaW4gYSBkYXRhYmFzZQogICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gbm93LgotICAgICAgICAgICAgaWYgKGV4Y2x1c2l2ZSkgeworICAgICAgICAgICAgLy8gU1RPUFNISVAgLSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyAxIGxpbmUKKyAgICAgICAgICAgIC8vIGlmIChleGNsdXNpdmUpIHsKKyAgICAgICAgICAgIC8vIFNUT1BTSElQIC0gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgMSBsaW5lCisgICAgICAgICAgICBpZiAoZXhjbHVzaXZlICYmIG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gRVhDTFVTSVZFOyIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBleGVjU1FMKCJCRUdJTiBJTU1FRElBVEU7Iik7CkBAIC05NTgsNyArOTQ5LDEwIEBACiAgICAgICAgICAgICBzQmxvY2tTaXplID0gbmV3IFN0YXRGcygiL2RhdGEiKS5nZXRCbG9ja1NpemUoKTsKICAgICAgICAgfQogICAgICAgICBzcWxpdGVEYXRhYmFzZS5zZXRQYWdlU2l6ZShzQmxvY2tTaXplKTsKLSAgICAgICAgc3FsaXRlRGF0YWJhc2Uuc2V0Sm91cm5hbE1vZGUocGF0aCwgIlRSVU5DQVRFIik7CisgICAgICAgIC8vU1RPUFNISVAgLSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lCisgICAgICAgIC8vc3FsaXRlRGF0YWJhc2Uuc2V0Sm91cm5hbE1vZGUocGF0aCwgIlRSVU5DQVRFIik7CisgICAgICAgIC8vIFNUT1BTSElQIHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmVzCisgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CiAKICAgICAgICAgLy8gYWRkIHRoaXMgZGF0YWJhc2UgdG8gdGhlIGxpc3Qgb2YgZGF0YWJhc2VzIG9wZW5lZCBpbiB0aGlzIHByb2Nlc3MKICAgICAgICAgQWN0aXZlRGF0YWJhc2VzLmFkZEFjdGl2ZURhdGFiYXNlKHNxbGl0ZURhdGFiYXNlKTsKQEAgLTEwNDUsNiArMTAzOSw5IEBACiAgICAgICAgIGlmICghaXNPcGVuKCkpIHsKICAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBjbG9zZWQKICAgICAgICAgfQorICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1NUQVRFTUVOVFMpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNsb3NpbmcgZGI6ICIgKyBtUGF0aCArICIgKGNvbm5lY3Rpb24gIyAiICsgbUNvbm5lY3Rpb25OdW0pOworICAgICAgICB9CiAgICAgICAgIGxvY2soKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGNsb3NlQ2xvc2FibGUoKTsKQEAgLTEyNTksNiArMTI1Niw4IEBACiAgICAgICogc3RhdGVtZW50IGFuZCBmaWxsIGluIHRob3NlIHZhbHVlcyB3aXRoIHtAbGluayBTUUxpdGVQcm9ncmFtI2JpbmRTdHJpbmd9CiAgICAgICogYW5kIHtAbGluayBTUUxpdGVQcm9ncmFtI2JpbmRMb25nfSBlYWNoIHRpbWUgeW91IHdhbnQgdG8gcnVuIHRoZQogICAgICAqIHN0YXRlbWVudC4gU3RhdGVtZW50cyBtYXkgbm90IHJldHVybiByZXN1bHQgc2V0cyBsYXJnZXIgdGhhbiAxeDEuCisgICAgICo8cD4KKyAgICAgKiBObyB0d28gdGhyZWFkcyBzaG91bGQgYmUgdXNpbmcgdGhlIHNhbWUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0gYXQgdGhlIHNhbWUgdGltZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBzcWwgVGhlIHJhdyBTUUwgc3RhdGVtZW50LCBtYXkgY29udGFpbiA/IGZvciB1bmtub3duIHZhbHVlcyB0byBiZQogICAgICAqICAgICAgICAgICAgYm91bmQgbGF0ZXIuCkBAIC0xMjY3LDE5ICsxMjY2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU1FMaXRlU3RhdGVtZW50IGNvbXBpbGVTdGF0ZW1lbnQoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXhTcWwgPSBzcWwudHJpbSgpLnN1YnN0cmluZygwLCA2KTsKLSAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSB0aGlzOwotICAgICAgICAvLyBnZXQgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgdG8gdXNlLCBpZiB0aGlzIGlzIGEgcXVlcnkKLSAgICAgICAgaWYgKHByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJTRUxFQ1QiKSkgewotICAgICAgICAgICAgZGIgPSBnZXREYkNvbm5lY3Rpb24oc3FsKTsKLSAgICAgICAgfQotICAgICAgICBkYi5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNRTGl0ZVN0YXRlbWVudChkYiwgc3FsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VEYkNvbm5lY3Rpb24oZGIpOwotICAgICAgICAgICAgZGIudW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4NTYsNiArMTg0MywxMiBAQAogICAgICAqIEluc3RlYWQsIHlvdSdyZSBlbmNvdXJhZ2VkIHRvIHVzZSB7QGxpbmsgI2luc2VydChTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcyl9LAogICAgICAqIHtAbGluayAjdXBkYXRlKFN0cmluZywgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSl9LCBldCBhbCwgd2hlbiBwb3NzaWJsZS4KICAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiB1c2luZyB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LCBqb3VybmFsX21vZGUgaXMKKyAgICAgKiBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4gU28sIGRvIG5vdCBzZXQgam91cm5hbF9tb2RlCisgICAgICogdXNpbmcgIlBSQUdNQSBqb3VybmFsX21vZGUnPHZhbHVlPiIgc3RhdGVtZW50IGlmIHlvdXIgYXBwIGlzIHVzaW5nCisgICAgICoge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfQorICAgICAqIDwvcD4KICAgICAgKgogICAgICAqIEBwYXJhbSBzcWwgdGhlIFNRTCBzdGF0ZW1lbnQgdG8gYmUgZXhlY3V0ZWQuIE11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgYXJlCiAgICAgICogbm90IHN1cHBvcnRlZC4KQEAgLTE5MjMsNiArMTkxNiwxMiBAQAogICAgICAqICAgPGxpPlBSQUdNQSB0aGF0IHJldHVybnMgbm8gZGF0YTwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiB1c2luZyB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LCBqb3VybmFsX21vZGUgaXMKKyAgICAgKiBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4gU28sIGRvIG5vdCBzZXQgam91cm5hbF9tb2RlCisgICAgICogdXNpbmcgIlBSQUdNQSBqb3VybmFsX21vZGUnPHZhbHVlPiIgc3RhdGVtZW50IGlmIHlvdXIgYXBwIGlzIHVzaW5nCisgICAgICoge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfQorICAgICAqIDwvcD4KICAgICAgKgogICAgICAqIEBwYXJhbSBzcWwgdGhlIFNRTCBzdGF0ZW1lbnQgdG8gYmUgZXhlY3V0ZWQuIE11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgYXJlCiAgICAgICogbm90IHN1cHBvcnRlZC4KQEAgLTIxMjMsNyArMjEyMiw4IEBACiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgdmVyaWZ5RGJJc09wZW4oKSB7CiAgICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBnZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgZ2V0UGF0aCgpICsgIiAoY29ubiMgIiArCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uTnVtICsgIikgYWxyZWFkeSBjbG9zZWQiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjM1MSw3ICsyMzUxLDEwIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgIC8qKgorICAgICAqIHBhY2thZ2UgdmlzaWJpbGl0eSBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CiAgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0yMzkxLDcgKzIzOTQsNyBAQAogICAgICAgICByZXR1cm4gdGhpcy5tQ29ubmVjdGlvbk51bSA+IDA7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBnZXREYkNvbm5lY3Rpb24oU3RyaW5nIHNxbCkgeworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgZ2V0RGJDb25uZWN0aW9uKFN0cmluZyBzcWwpIHsKICAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKIAogICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBoYW5kbGUgaWYKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhCmluZGV4IGEzNTEzZTYuLjAxN2I2NWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YQpAQCAtMTcsNiArMTcsOSBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKICAqIEEgYmFzZSBjbGFzcyBmb3IgY29tcGlsZWQgU1FMaXRlIHByb2dyYW1zLgpAQCAtMjgsNiArMzEsMTEgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU1FMaXRlUHJvZ3JhbSI7CiAKKyAgICAvKiogdGhlIHR5cGUgb2Ygc3FsIHN0YXRlbWVudCBiZWluZyBwcm9jZXNzZWQgYnkgdGhpcyBvYmplY3QgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUX1NUTVQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfU1RNVCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9USEVSX1NUTVQgPSAzOworCiAgICAgLyoqIFRoZSBkYXRhYmFzZSB0aGlzIHByb2dyYW0gaXMgY29tcGlsZWQgYWdhaW5zdC4KICAgICAgKiBAZGVwcmVjYXRlZCBkbyBub3QgdXNlIHRoaXMKICAgICAgKi8KQEAgLTU4LDM4ICs2Niw2NyBAQAogICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIGludCBuU3RhdGVtZW50ID0gMDsKIAorICAgIC8qKgorICAgICAqIEluIHRoZSBjYXNlIG9mIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9LCB0aGlzIG1lbWJlciBzdG9yZXMgdGhlIGJpbmRhcmdzIHBhc3NlZAorICAgICAqIHRvIHRoZSBmb2xsb3dpbmcgbWV0aG9kcywgaW5zdGVhZCBvZiBhY3R1YWxseSBkb2luZyB0aGUgYmluZGluZy4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kQmxvYihpbnQsIGJ5dGVbXSl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2JpbmREb3VibGUoaW50LCBkb3VibGUpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kTG9uZyhpbnQsIGxvbmcpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kTnVsbChpbnQpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kU3RyaW5nKGludCwgU3RyaW5nKX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBQYWlyIG9mCisgICAgICogPG9sPgorICAgICAqICAgPGxpPmJpbmQgYXJnIHBvc2l0aW9uIG51bWJlcjwvbGk+CisgICAgICogICA8bGk+dGhlIHZhbHVlIHRvIGJlIGJvdW5kIHRvIHRoZSBiaW5kYXJnPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIGxhemlseSBpbml0aWFsaXplZCBpbiB0aGUgYWJvdmUgYmluZCBtZXRob2RzCisgICAgICogYW5kIGl0IGlzIGNsZWFyZWQgaW4ge0BsaW5rICNjbGVhckJpbmRpbmdzKCl9IG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBwcm90ZWN0ZWQgKGluIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50KSBieSB7QGxpbmsgU1FMaXRlUHJvZ3JhbX0udGhpcworICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PFBhaXI8SW50ZWdlciwgT2JqZWN0Pj4gYmluZEFyZ3MgPSBudWxsOworCiAgICAgLyogcGFja2FnZSAqLyBTUUxpdGVQcm9ncmFtKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7Ci0gICAgICAgIG1EYXRhYmFzZSA9IGRiOworICAgICAgICB0aGlzKGRiLCBzcWwsIHRydWUpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlUHJvZ3JhbShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCwgYm9vbGVhbiBjb21waWxlRmxhZykgewogICAgICAgICBtU3FsID0gc3FsLnRyaW0oKTsKICAgICAgICAgZGIuYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICBkYi5hZGRTUUxpdGVDbG9zYWJsZSh0aGlzKTsKLSAgICAgICAgdGhpcy5uSGFuZGxlID0gZGIubU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgbURhdGFiYXNlID0gZGI7CisgICAgICAgIG5IYW5kbGUgPSBkYi5tTmF0aXZlSGFuZGxlOworICAgICAgICBpZiAoY29tcGlsZUZsYWcpIHsKKyAgICAgICAgICAgIGNvbXBpbGVTcWwoKTsKKyAgICAgICAgfQorICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjb21waWxlU3FsKCkgewogICAgICAgICAvLyBvbmx5IGNhY2hlIENSVUQgc3RhdGVtZW50cwotICAgICAgICBTdHJpbmcgcHJlZml4U3FsID0gbVNxbC5zdWJzdHJpbmcoMCwgNik7Ci0gICAgICAgIGlmICghcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIklOU0VSVCIpICYmICFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiVVBEQVRFIikgJiYKLSAgICAgICAgICAgICAgICAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlJFUExBQyIpICYmCi0gICAgICAgICAgICAgICAgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJERUxFVEUiKSAmJiAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlNFTEVDVCIpKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwoZGIsIHNxbCk7CisgICAgICAgIGlmIChnZXRTcWxTdGF0ZW1lbnRUeXBlKG1TcWwpID09IE9USEVSX1NUTVQpIHsKKyAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChtRGF0YWJhc2UsIG1TcWwpOwogICAgICAgICAgICAgblN0YXRlbWVudCA9IG1Db21waWxlZFNxbC5uU3RhdGVtZW50OwogICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgbm90IGluIHRoZSBjYWNoZSwgbm8gbmVlZCB0byBhY3F1aXJlKCkgaXQuCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBpdCBpcyBub3QgcHJhZ21hCi0gICAgICAgIG1Db21waWxlZFNxbCA9IGRiLmdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKHNxbCk7CisgICAgICAgIG1Db21waWxlZFNxbCA9IG1EYXRhYmFzZS5nZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChtU3FsKTsKICAgICAgICAgaWYgKG1Db21waWxlZFNxbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgY29tcGlsZWQtc3FsIG9iagotICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOworICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKG1EYXRhYmFzZSwgbVNxbCk7CiAKICAgICAgICAgICAgIC8vIGFkZCBpdCB0byB0aGUgY2FjaGUgb2YgY29tcGlsZWQtc3FscwogICAgICAgICAgICAgLy8gYnV0IGJlZm9yZSBhZGRpbmcgaXQgYW5kIHRodXMgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgYW55b25lIGVsc2UgdG8gdXNlIGl0LAogICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGl0IGlzIGFjcXVpcmVkIGJ5IG1lLgogICAgICAgICAgICAgbUNvbXBpbGVkU3FsLmFjcXVpcmUoKTsKLSAgICAgICAgICAgIGRiLmFkZFRvQ29tcGlsZWRRdWVyaWVzKHNxbCwgbUNvbXBpbGVkU3FsKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5hZGRUb0NvbXBpbGVkUXVlcmllcyhtU3FsLCBtQ29tcGlsZWRTcWwpOwogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7CiAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiQ3JlYXRlZCBEYk9iaiAoaWQjIiArIG1Db21waWxlZFNxbC5uU3RhdGVtZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIpIGZvciBzcWw6ICIgKyBzcWwpOworICAgICAgICAgICAgICAgICAgICAgICAgIikgZm9yIHNxbDogIiArIG1TcWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gaXQgaXMgYWxyZWFkeSBpbiBjb21waWxlZC1zcWwgY2FjaGUuCkBAIC0xMDAsMTIgKzEzNywxMiBAQAogICAgICAgICAgICAgICAgIC8vIHdlIGNhbid0IGhhdmUgdHdvIGRpZmZlcmVudCBTUUxpdGVQcm9nYW0gb2JqZWN0cyBjYW4ndCBzaGFyZSB0aGUgc2FtZQogICAgICAgICAgICAgICAgIC8vIENvbXBpbGVkU3FsIG9iamVjdC4gY3JlYXRlIGEgbmV3IG9uZS4KICAgICAgICAgICAgICAgICAvLyBmaW5hbGl6ZSBpdCB3aGVuIEkgYW0gZG9uZSB3aXRoIGl0IGluICJ0aGlzIiBvYmplY3QuCi0gICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOworICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChtRGF0YWJhc2UsIG1TcWwpOwogICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewogICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICIqKiBwb3NzaWJsZSBidWcgKiogQ3JlYXRlZCBORVcgRGJPYmogKGlkIyIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbC5uU3RhdGVtZW50ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBiZWNhdXNlIHRoZSBwcmV2aW91c2x5IGNyZWF0ZWQgRGJPYmogKGlkIyIgKyBsYXN0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB3YXMgbm90IHJlbGVhc2VkIGZvciBzcWw6IiArIHNxbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgd2FzIG5vdCByZWxlYXNlZCBmb3Igc3FsOiIgKyBtU3FsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgbm90IGluIHRoZSBjYWNoZSwgbm8gbmVlZCB0byBhY3F1aXJlKCkgaXQuCiAgICAgICAgICAgICB9CkBAIC0xMTMsMTEgKzE1MCwyNyBAQAogICAgICAgICBuU3RhdGVtZW50ID0gbUNvbXBpbGVkU3FsLm5TdGF0ZW1lbnQ7CiAgICAgfQogCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcgc3FsKSB7CisgICAgICAgIGlmIChtU3FsLmxlbmd0aCgpIDwgNikgeworICAgICAgICAgICAgcmV0dXJuIE9USEVSX1NUTVQ7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHByZWZpeFNxbCA9IG1TcWwuc3Vic3RyaW5nKDAsIDYpOworICAgICAgICBpZiAocHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlNFTEVDVCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU0VMRUNUX1NUTVQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIklOU0VSVCIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlVQREFURSIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlJFUExBQyIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIkRFTEVURSIpKSB7CisgICAgICAgICAgICByZXR1cm4gVVBEQVRFX1NUTVQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9USEVSX1NUTVQ7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKSB7CiAgICAgICAgIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpOwotICAgICAgICBtRGF0YWJhc2UucmVsZWFzZVJlZmVyZW5jZSgpOwogICAgICAgICBtRGF0YWJhc2UucmVtb3ZlU1FMaXRlQ2xvc2FibGUodGhpcyk7CisgICAgICAgIG1EYXRhYmFzZS5yZWxlYXNlUmVmZXJlbmNlKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMjYsNyArMTc5LDcgQEAKICAgICAgICAgbURhdGFiYXNlLnJlbGVhc2VSZWZlcmVuY2UoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZUNvbXBpbGVkU3FsSWZOb3RJbkNhY2hlKCkgeworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZUNvbXBpbGVkU3FsSWZOb3RJbkNhY2hlKCkgewogICAgICAgICBpZiAobUNvbXBpbGVkU3FsID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTM1LDIyICsxODgsMzQgQEAKICAgICAgICAgICAgICAgICAvLyBpdCBpcyBOT1QgaW4gY29tcGlsZWQtc3FsIGNhY2hlLiBpLmUuLCByZXNwb25zaWJpbGl0eSBvZgogICAgICAgICAgICAgICAgIC8vIHJlbGVhc2luZyB0aGlzIHN0YXRlbWVudCBpcyBvbiBtZS4KICAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwucmVsZWFzZVNxbFN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgblN0YXRlbWVudCA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGl0IGlzIGluIGNvbXBpbGVkLXNxbCBjYWNoZS4gcmVzZXQgaXRzIENvbXBpbGVkU3FsI21JblVzZSBmbGFnCiAgICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsLnJlbGVhc2UoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSAKKyAgICAgICAgfQorICAgICAgICBtQ29tcGlsZWRTcWwgPSBudWxsOworICAgICAgICBuU3RhdGVtZW50ID0gMDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcHJvZ3JhbS4KICAgICAgKgogICAgICAqIEByZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwcm9ncmFtCisgICAgICogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzIG1ldGhvZC4gaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgYWNyb3NzIGV4ZWN1dGlvbnMgb2YKKyAgICAgKiB0aGUgU1FMIHN0YXRlbWVudCBjb250YWluZWQgaW4gdGhpcyBvYmplY3QuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgZmluYWwgaW50IGdldFVuaXF1ZUlkKCkgewotICAgICAgICByZXR1cm4gKG1Db21waWxlZFNxbCAhPSBudWxsKSA/IG1Db21waWxlZFNxbC5uU3RhdGVtZW50IDogMDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1c2VkIG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRTcWxTdGF0ZW1lbnRJZCgpIHsKKyAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgIHJldHVybiAobUNvbXBpbGVkU3FsID09IG51bGwpID8gMCA6IG5TdGF0ZW1lbnQ7CisgICAgICB9CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0U3FsU3RyaW5nKCkgewpAQCAtMTc3LDExICsyNDIsMTkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiaW5kTnVsbChpbnQgaW5kZXgpIHsKICAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX251bGwoaW5kZXgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMublN0YXRlbWVudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBTUUwgc3RhdGVtZW50IGlzIG5vdCBjb21waWxlZCwgZG9uJ3QgZG8gdGhlIGJpbmRpbmcgeWV0LgorICAgICAgICAgICAgICAgICAgICAvLyBjYW4gYmUgZG9uZSBiZWZvcmUgZXhlY3V0aW5nIHRoZSBTUUwgc3RhdGVtZW50CisgICAgICAgICAgICAgICAgICAgIGFkZFRvQmluZEFyZ3MoaW5kZXgsIG51bGwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX251bGwoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTQsMTEgKzI2NywxNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmRMb25nKGludCBpbmRleCwgbG9uZyB2YWx1ZSkgewogICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMublN0YXRlbWVudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFRvQmluZEFyZ3MoaW5kZXgsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxMSwxMSArMjkwLDE3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewogICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfZG91YmxlKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5uU3RhdGVtZW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkVG9CaW5kQXJncyhpbmRleCwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2RvdWJsZShpbmRleCwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yMzEsMTEgKzMxNiwxNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGJpbmQgdmFsdWUgYXQgaW5kZXggIiArIGluZGV4ICsgIiBpcyBudWxsIik7CiAgICAgICAgIH0KICAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX3N0cmluZyhpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMublN0YXRlbWVudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFRvQmluZEFyZ3MoaW5kZXgsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9zdHJpbmcoaW5kZXgsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjUxLDExICszNDIsMTcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBiaW5kIHZhbHVlIGF0IGluZGV4ICIgKyBpbmRleCArICIgaXMgbnVsbCIpOwogICAgICAgICB9CiAgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOwotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9ibG9iKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5uU3RhdGVtZW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkVG9CaW5kQXJncyhpbmRleCwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2Jsb2IoaW5kZXgsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjYzLDEyICszNjAsMTggQEAKICAgICAgKiBDbGVhcnMgYWxsIGV4aXN0aW5nIGJpbmRpbmdzLiBVbnNldCBiaW5kaW5ncyBhcmUgdHJlYXRlZCBhcyBOVUxMLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyQmluZGluZ3MoKSB7Ci0gICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOwotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfY2xlYXJfYmluZGluZ3MoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBiaW5kQXJncyA9IG51bGw7CisgICAgICAgICAgICBpZiAodGhpcy5uU3RhdGVtZW50ID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2NsZWFyX2JpbmRpbmdzKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjc2LDEwICszNzksNDEgQEAKICAgICAgKiBSZWxlYXNlIHRoaXMgcHJvZ3JhbSdzIHJlc291cmNlcywgbWFraW5nIGl0IGludmFsaWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgYmluZEFyZ3MgPSBudWxsOworICAgICAgICAgICAgaWYgKG5IYW5kbGUgPT0gMCB8fCAhbURhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUb0JpbmRBcmdzKGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChiaW5kQXJncyA9PSBudWxsKSB7CisgICAgICAgICAgICBiaW5kQXJncyA9IG5ldyBBcnJheUxpc3Q8UGFpcjxJbnRlZ2VyLCBPYmplY3Q+PigpOworICAgICAgICB9CisgICAgICAgIGJpbmRBcmdzLmFkZChuZXcgUGFpcjxJbnRlZ2VyLCBPYmplY3Q+KGluZGV4LCB2YWx1ZSkpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgY29tcGlsZUFuZGJpbmRBbGxBcmdzKCkgeworICAgICAgICBhc3NlcnQgblN0YXRlbWVudCA9PSAwOworICAgICAgICBjb21waWxlU3FsKCk7CisgICAgICAgIGlmIChiaW5kQXJncyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICBmb3IgKFBhaXI8SW50ZWdlciwgT2JqZWN0PiBwIDogYmluZEFyZ3MpIHsKKyAgICAgICAgICAgIGlmIChwLnNlY29uZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbnVsbChwLmZpcnN0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocC5zZWNvbmQgaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhwLmZpcnN0LCAoTG9uZylwLnNlY29uZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHAuc2Vjb25kIGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfZG91YmxlKHAuZmlyc3QsIChEb3VibGUpcC5zZWNvbmQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwLnNlY29uZCBpbnN0YW5jZW9mIGJ5dGVbXSkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2Jsb2IocC5maXJzdCwgKGJ5dGVbXSlwLnNlY29uZCk7CisgICAgICAgICAgICB9ICBlbHNlIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9zdHJpbmcocC5maXJzdCwgKFN0cmluZylwLnNlY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMwMyw2ICs0MzcsNiBAQAogICAgIHByb3RlY3RlZCBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfYmluZF9kb3VibGUoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpOwogICAgIHByb3RlY3RlZCBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfYmluZF9zdHJpbmcoaW50IGluZGV4LCBTdHJpbmcgdmFsdWUpOwogICAgIHByb3RlY3RlZCBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfYmluZF9ibG9iKGludCBpbmRleCwgYnl0ZVtdIHZhbHVlKTsKLSAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9jbGVhcl9iaW5kaW5ncygpOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2NsZWFyX2JpbmRpbmdzKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YQppbmRleCBlMWFkMzA2Yy4uYjkwMjgwMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YQpAQCAtMjksOCArMjksMTQgQEAKICAqIFNRTGl0ZVN0YXRlbWVudCBpcyBub3QgaW50ZXJuYWxseSBzeW5jaHJvbml6ZWQgc28gY29kZSB1c2luZyBhIFNRTGl0ZVN0YXRlbWVudCBmcm9tIG11bHRpcGxlCiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVN0YXRlbWVudC4KICAqLworQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKIHB1YmxpYyBjbGFzcyBTUUxpdGVTdGF0ZW1lbnQgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtCiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFEID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSSVRFID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1PcmlnRGI7CisKICAgICAvKioKICAgICAgKiBEb24ndCB1c2UgU1FMaXRlU3RhdGVtZW50IGNvbnN0cnVjdG9yIGRpcmVjdGx5LCBwbGVhc2UgdXNlCiAgICAgICoge0BsaW5rIFNRTGl0ZURhdGFiYXNlI2NvbXBpbGVTdGF0ZW1lbnQoU3RyaW5nKX0KQEAgLTM4LDcgKzQ0LDcgQEAKICAgICAgKiBAcGFyYW0gc3FsCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyBTUUxpdGVTdGF0ZW1lbnQoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKLSAgICAgICAgc3VwZXIoZGIsIHNxbCk7CisgICAgICAgIHN1cGVyKGRiLCBzcWwsIGZhbHNlIC8qIGRvbid0IGNvbXBpbGUgc3FsIHN0YXRlbWVudCAqLyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00OSwxOSArNTUsMTQgQEAKICAgICAgKiAgICAgICAgIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotCi0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFdSSVRFKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2V4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC03NSwyMCArNzYsMTUgQEAKICAgICAgKiAgICAgICAgIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZXhlY3V0ZUluc2VydCgpIHsKLSAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotCi0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gKG1EYXRhYmFzZS5sYXN0Q2hhbmdlQ291bnQoKSA+IDApID8gbURhdGFiYXNlLmxhc3RJbnNlcnRSb3coKSA6IC0xOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhXUklURSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChtRGF0YWJhc2UubGFzdENoYW5nZUNvdW50KCkgPiAwKSA/IG1EYXRhYmFzZS5sYXN0SW5zZXJ0Um93KCkgOiAtMTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDEsMjAgKzk3LDE1IEBACiAgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEb25lRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSByZXR1cm5zIHplcm8gcm93cwogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHNpbXBsZVF1ZXJ5Rm9yTG9uZygpIHsKLSAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOwotICAgICAgICAgICAgbG9uZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfbG9uZygpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFJFQUQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9sb25nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyNywyMyArMTE4LDcwIEBACiAgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEb25lRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSByZXR1cm5zIHplcm8gcm93cwogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgc2ltcGxlUXVlcnlGb3JTdHJpbmcoKSB7Ci0gICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOwotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKLSAgICAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfc3RyaW5nKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKLSAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soUkVBRCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIGV2ZXJ5IG1ldGhvZCBpbiB0aGlzIGNsYXNzIGJlZm9yZSBleGVjdXRpbmcgYSBTUUwgc3RhdGVtZW50LAorICAgICAqIHRoaXMgbWV0aG9kIGRvZXMgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+bWFrZSBzdXJlIHRoZSBkYXRhYmFzZSBpcyBvcGVuPC9saT4KKyAgICAgKiAgIDxsaT5nZXQgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbCxpZiBwb3NzaWJsZTwvbGk+CisgICAgICogICA8bGk+bm90aWZpZXMge0BsaW5rIEJsb2NrR3VhcmR9IG9mIHJlYWQvd3JpdGU8L2xpPgorICAgICAqICAgPGxpPmdldCBsb2NrIG9uIHRoZSBkYXRhYmFzZTwvbGk+CisgICAgICogICA8bGk+YWNxdWlyZSByZWZlcmVuY2Ugb24gdGhpcyBvYmplY3Q8L2xpPgorICAgICAqICAgPGxpPmFuZCB0aGVuIHJldHVybiB0aGUgY3VycmVudCB0aW1lIF9iZWZvcmVfIHRoZSBkYXRhYmFzZSBsb2NrIHdhcyBhY3F1aXJlZDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBkdXBsY2F0ZSBjb2RlIGZyb20gdGhlIG90aGVyIHB1YmxpYworICAgICAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgYWNxdWlyZUFuZExvY2soYm9vbGVhbiByd0ZsYWcpIHsKKyAgICAgICAgLy8gdXNlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZXMgZm9yIFNFTEVDVCBTUUwgc3RhdGVtZW50cworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSAoZ2V0U3FsU3RhdGVtZW50VHlwZShtU3FsKSAhPSBTRUxFQ1RfU1RNVCkgPyBtRGF0YWJhc2UKKyAgICAgICAgICAgICAgICA6IG1EYXRhYmFzZS5nZXREYkNvbm5lY3Rpb24obVNxbCk7CisgICAgICAgIC8vIHVzZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBvYnRhaW5lZCBhYm92ZQorICAgICAgICBtT3JpZ0RiID0gbURhdGFiYXNlOworICAgICAgICBtRGF0YWJhc2UgPSBkYjsKKyAgICAgICAgbkhhbmRsZSA9IG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlOworICAgICAgICBpZiAocndGbGFnID09IFdSSVRFKSB7CisgICAgICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKKyAgICAgICAgfQorICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CisgICAgICAgIGNvbXBpbGVBbmRiaW5kQWxsQXJncygpOworICAgICAgICByZXR1cm4gc3RhcnRUaW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoaXMgbWV0aG9kIHJlbGVhc2VzIGxvY2tzIGFuZCByZWZlcmVuY2VzIGFjcXVpcmVkIGluIHtAbGluayAjYWNxdWlyZUFuZExvY2soYm9vbGVhbil9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQW5kVW5sb2NrKCkgeworICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgY2xlYXJCaW5kaW5ncygpOworICAgICAgICAvLyByZWxlYXNlIHRoZSBjb21waWxlZCBzcWwgc3RhdGVtZW50IHNvIHRoYXQgdGhlIGNhbGxlcidzIFNRTGl0ZVN0YXRlbWVudCBubyBsb25nZXIKKyAgICAgICAgLy8gaGFzIGEgaGFyZCByZWZlcmVuY2UgdG8gYSBkYXRhYmFzZSBvYmplY3QgdGhhdCBtYXkgZ2V0IGRlYWxsb2NhdGVkIGF0IGFueSBwb2ludC4KKyAgICAgICAgcmVsZWFzZUNvbXBpbGVkU3FsSWZOb3RJbkNhY2hlKCk7CisgICAgICAgIC8vIHJlc3RvcmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZQorICAgICAgICBtRGF0YWJhc2UgPSBtT3JpZ0RiOworICAgICAgICBuSGFuZGxlID0gbURhdGFiYXNlLm1OYXRpdmVIYW5kbGU7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZXhlY3V0ZSgpOwogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGxvbmcgbmF0aXZlXzF4MV9sb25nKCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgU3RyaW5nIG5hdGl2ZV8xeDFfc3RyaW5nKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhCmluZGV4IDBhMjg5OWYuLjExMDA4ODYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhCkBAIC01MzUsNiArNTM1LDcgQEAKICAgICAgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBuZWVkIGEgcGFydGljdWxhciBjYWxsYmFjaywgYSBudWxsIGNhbiBiZSBwYXNzZWQKICAgICAgKiBpbnN0ZWFkIG9mIGEgY2FsbGJhY2sgbWV0aG9kLgogICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgb25seSB2YWxpZCBhZnRlciB7QGxpbmsgI3N0YXJ0UHJldmlldygpfSBoYXMgYmVlbiBjYWxsZWQuCiAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBzdG9wIHRoZSBwcmV2aWV3LiBBcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBjYWxsIHtAbGluawogICAgICAqICNzdG9wUHJldmlldygpfSBiZWZvcmUgdGhpcy4gQWZ0ZXIganBlZyBjYWxsYmFjayBpcyByZWNlaXZlZCwKICAgICAgKiBhcHBsaWNhdGlvbnMgY2FuIGNhbGwge0BsaW5rICNzdGFydFByZXZpZXcoKX0gdG8gcmVzdGFydCB0aGUgcHJldmlldy4KQEAgLTU2Miw2ICs1NjMsNyBAQAogICAgICAqIGFwcGxpY2F0aW9uIGRvZXMgbm90IG5lZWQgYSBwYXJ0aWN1bGFyIGNhbGxiYWNrLCBhIG51bGwgY2FuIGJlIHBhc3NlZAogICAgICAqIGluc3RlYWQgb2YgYSBjYWxsYmFjayBtZXRob2QuCiAgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHZhbGlkIGFmdGVyIHtAbGluayAjc3RhcnRQcmV2aWV3KCl9IGhhcyBiZWVuIGNhbGxlZC4KICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHN0b3AgdGhlIHByZXZpZXcuIEFwcGxpY2F0aW9ucyBzaG91bGQgbm90IGNhbGwge0BsaW5rCiAgICAgICogI3N0b3BQcmV2aWV3KCl9IGJlZm9yZSB0aGlzLiBBZnRlciBqcGVnIGNhbGxiYWNrIGlzIHJlY2VpdmVkLAogICAgICAqIGFwcGxpY2F0aW9ucyBjYW4gY2FsbCB7QGxpbmsgI3N0YXJ0UHJldmlldygpfSB0byByZXN0YXJ0IHRoZSBwcmV2aWV3LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3IuamF2YQppbmRleCBlMmY1YWRhLi4zNDkwYWMwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3IuamF2YQpAQCAtMjAsMjQgKzIwLDMyIEBACiAvKioKICAqIENsYXNzIHJlcHJlc2VudGluZyBhIHNlbnNvci4gVXNlIHtAbGluayBTZW5zb3JNYW5hZ2VyI2dldFNlbnNvckxpc3R9IHRvIGdldAogICogdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIFNlbnNvcnMuCisgKgorICogQHNlZSBTZW5zb3JNYW5hZ2VyCisgKiBAc2VlIFNlbnNvckV2ZW50TGlzdGVuZXIKKyAqIEBzZWUgU2Vuc29yRXZlbnQKKyAqCiAgKi8KIHB1YmxpYyBjbGFzcyBTZW5zb3IgewogCiAgICAgLyoqCiAgICAgICogQSBjb25zdGFudCBkZXNjcmliaW5nIGFuIGFjY2VsZXJvbWV0ZXIgc2Vuc29yIHR5cGUuIFNlZQotICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50IFNlbnNvckV2ZW50fSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50I3ZhbHVlcyBTZW5zb3JFdmVudC52YWx1ZXN9IGZvciBtb3JlCisgICAgICogZGV0YWlscy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FDQ0VMRVJPTUVURVIgPSAxOwogCiAgICAgLyoqCiAgICAgICogQSBjb25zdGFudCBkZXNjcmliaW5nIGEgbWFnbmV0aWMgZmllbGQgc2Vuc29yIHR5cGUuIFNlZQotICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50IFNlbnNvckV2ZW50fSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50I3ZhbHVlcyBTZW5zb3JFdmVudC52YWx1ZXN9IGZvciBtb3JlCisgICAgICogZGV0YWlscy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX01BR05FVElDX0ZJRUxEID0gMjsKIAogICAgIC8qKgogICAgICAqIEEgY29uc3RhbnQgZGVzY3JpYmluZyBhbiBvcmllbnRhdGlvbiBzZW5zb3IgdHlwZS4gU2VlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnQgU2Vuc29yRXZlbnR9IGZvciBtb3JlIGRldGFpbHMuCisgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnQjdmFsdWVzIFNlbnNvckV2ZW50LnZhbHVlc30gZm9yIG1vcmUKKyAgICAgKiBkZXRhaWxzLgogICAgICAqCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXIjZ2V0T3JpZW50YXRpb24KICAgICAgKiAgICAgICAgICAgICBTZW5zb3JNYW5hZ2VyLmdldE9yaWVudGF0aW9uKCl9IGluc3RlYWQuCkBAIC01MCw3ICs1OCw4IEBACiAKICAgICAvKioKICAgICAgKiBBIGNvbnN0YW50IGRlc2NyaWJpbmcgYW4gbGlnaHQgc2Vuc29yIHR5cGUuIFNlZQotICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50IFNlbnNvckV2ZW50fSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50I3ZhbHVlcyBTZW5zb3JFdmVudC52YWx1ZXN9IGZvciBtb3JlCisgICAgICogZGV0YWlscy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0xJR0hUID0gNTsKIApAQCAtNjIsNyArNzEsOCBAQAogCiAgICAgLyoqCiAgICAgICogQSBjb25zdGFudCBkZXNjcmliaW5nIGFuIHByb3hpbWl0eSBzZW5zb3IgdHlwZS4gU2VlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnQgU2Vuc29yRXZlbnR9IGZvciBtb3JlIGRldGFpbHMuCisgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnQjdmFsdWVzIFNlbnNvckV2ZW50LnZhbHVlc30gZm9yIG1vcmUKKyAgICAgKiBkZXRhaWxzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUFJPWElNSVRZID0gODsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yRXZlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvckV2ZW50LmphdmEKaW5kZXggZGZlZmU3ZS4uYWFmMzg5OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yRXZlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5qYXZhCkBAIC0yOCwxNyArMjgsMjAgQEAKICAqIDwvcD4KICAqCiAgKiA8cD4KLSAqIFRoZSBjb29yZGluYXRlIHNwYWNlIGlzIGRlZmluZWQgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiBvZiB0aGUgcGhvbmUgaW4gaXRzCisgKiBUaGUgY29vcmRpbmF0ZS1zeXN0ZW0gaXMgZGVmaW5lZCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIG9mIHRoZSBwaG9uZSBpbiBpdHMKICAqIGRlZmF1bHQgb3JpZW50YXRpb24uIFRoZSBheGVzIGFyZSBub3Qgc3dhcHBlZCB3aGVuIHRoZSBkZXZpY2UncyBzY3JlZW4KICAqIG9yaWVudGF0aW9uIGNoYW5nZXMuCiAgKiA8L3A+CiAgKgogICogPHA+Ci0gKiBUaGUgT3BlbkdMIEVTIGNvb3JkaW5hdGUgc3lzdGVtIGlzIHVzZWQuIFRoZSBvcmlnaW4gaXMgaW4gdGhlIGxvd2VyLWxlZnQKLSAqIGNvcm5lciB3aXRoIHJlc3BlY3QgdG8gdGhlIHNjcmVlbiwgd2l0aCB0aGUgWCBheGlzIGhvcml6b250YWwgYW5kIHBvaW50aW5nCi0gKiByaWdodCwgdGhlIFkgYXhpcyB2ZXJ0aWNhbCBhbmQgcG9pbnRpbmcgdXAgYW5kIHRoZSBaIGF4aXMgcG9pbnRpbmcgb3V0c2lkZQotICogdGhlIGZyb250IGZhY2Ugb2YgdGhlIHNjcmVlbi4gSW4gdGhpcyBzeXN0ZW0sIGNvb3JkaW5hdGVzIGJlaGluZCB0aGUgc2NyZWVuCi0gKiBoYXZlIG5lZ2F0aXZlIFogdmFsdWVzLgorICogVGhlIFggYXhpcyBpcyBob3Jpem9udGFsIGFuZCBwb2ludHMgdG8gdGhlIHJpZ2h0LCB0aGUgWSBheGlzIGlzIHZlcnRpY2FsIGFuZAorICogcG9pbnRzIHVwIGFuZCB0aGUgWiBheGlzIHBvaW50cyB0b3dhcmRzIHRoZSBvdXRzaWRlIG9mIHRoZSBmcm9udCBmYWNlIG9mIHRoZQorICogc2NyZWVuLiBJbiB0aGlzIHN5c3RlbSwgY29vcmRpbmF0ZXMgYmVoaW5kIHRoZSBzY3JlZW4gaGF2ZSBuZWdhdGl2ZSBaIHZhbHVlcy4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIDxjZW50ZXI+PGltZyBzcmM9Ii4uLy4uLy4uL2ltYWdlcy9heGlzX2RldmljZS5wbmciCisgKiBhbHQ9IlNlbnNvcnMgY29vcmRpbmF0ZS1zeXN0ZW0gZGlhZ3JhbS4iIGJvcmRlcj0iMCIgLz48L2NlbnRlcj4KICAqIDwvcD4KICAqCiAgKiA8cD4KQEAgLTQ2LDYzICs0OSwxMzkgQEAKICAqIEFuZHJvaWQgMkQgQVBJcyB3aGVyZSB0aGUgb3JpZ2luIGlzIGluIHRoZSB0b3AtbGVmdCBjb3JuZXIuCiAgKiA8L3A+CiAgKgotICogPHByZT4KLSAqICAgeDwwICAgICAgICAgeD4wCi0gKiAgICAgICAgICAgICAgICBeCi0gKiAgICAgICAgICAgICAgICB8Ci0gKiAgICArLS0tLS0tLS0tLS0rLS0+ICB5PjAKLSAqICAgIHwgICAgICAgICAgIHwKLSAqICAgIHwgICAgICAgICAgIHwKLSAqICAgIHwgICAgICAgICAgIHwKLSAqICAgIHwgICAgICAgICAgIHwgICAvIHo8MAotICogICAgfCAgICAgICAgICAgfCAgLwotICogICAgfCAgICAgICAgICAgfCAvCi0gKiAgICBPLS0tLS0tLS0tLS0rLwotICogICAgfFtdICBbIF0gIFtdLwotICogICAgKy0tLS0tLS0tLS0vKyAgICAgeTwwCi0gKiAgICAgICAgICAgICAgLwotICogICAgICAgICAgICAgLwotICogICAgICAgICAgIHwvIHo+MCAodG93YXJkIHRoZSBza3kpCisgKiBAc2VlIFNlbnNvck1hbmFnZXIKKyAqIEBzZWUgU2Vuc29yRXZlbnQKKyAqIEBzZWUgU2Vuc29yCiAgKgotICogICAgTzogT3JpZ2luICh4PTAseT0wLHo9MCkKLSAqIDwvcHJlPgogICovCiAKIHB1YmxpYyBjbGFzcyBTZW5zb3JFdmVudCB7CiAgICAgLyoqCiAgICAgICogPHA+Ci0gICAgICogVGhlIGxlbmd0aCBhbmQgY29udGVudHMgb2YgdGhlIHZhbHVlcyBhcnJheSB2YXJ5IGRlcGVuZGluZyBvbiB3aGljaAotICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciBzZW5zb3J9IHR5cGUgaXMgYmVpbmcgbW9uaXRvcmVkIChzZWUgYWxzbwotICAgICAqIHtAbGluayBTZW5zb3JFdmVudH0gZm9yIGEgZGVmaW5pdGlvbiBvZiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gdXNlZCk6CisgICAgICogVGhlIGxlbmd0aCBhbmQgY29udGVudHMgb2YgdGhlIHtAbGluayAjdmFsdWVzIHZhbHVlc30gYXJyYXkgZGVwZW5kcyBvbgorICAgICAqIHdoaWNoIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciBzZW5zb3J9IHR5cGUgaXMgYmVpbmcgbW9uaXRvcmVkIChzZWUKKyAgICAgKiBhbHNvIHtAbGluayBTZW5zb3JFdmVudH0gZm9yIGEgZGVmaW5pdGlvbiBvZiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gdXNlZCkuCiAgICAgICogPC9wPgogICAgICAqCi0gICAgICogPGgzPntAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciNUWVBFX09SSUVOVEFUSU9OCi0gICAgICogU2Vuc29yLlRZUEVfT1JJRU5UQVRJT059OjwvaDM+IEFsbCB2YWx1ZXMgYXJlIGFuZ2xlcyBpbiBkZWdyZWVzLgotICAgICAqCisgICAgICogPGg0PntAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciNUWVBFX0FDQ0VMRVJPTUVURVIKKyAgICAgKiBTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSfTo8L2g0PiBBbGwgdmFsdWVzIGFyZSBpbiBTSSB1bml0cyAobS9zXjIpCisgICAgICogCiAgICAgICogPHVsPgogICAgICAqIDxwPgotICAgICAqIHZhbHVlc1swXTogQXppbXV0aCwgYW5nbGUgYmV0d2VlbiB0aGUgbWFnbmV0aWMgbm9ydGggZGlyZWN0aW9uIGFuZCB0aGUgWQotICAgICAqIGF4aXMsIGFyb3VuZCB0aGUgWiBheGlzICgwIHRvIDM1OSkuIDA9Tm9ydGgsIDkwPUVhc3QsIDE4MD1Tb3V0aCwgMjcwPVdlc3QKLSAgICAgKgorICAgICAqIHZhbHVlc1swXTogQWNjZWxlcmF0aW9uIG1pbnVzIEd4IG9uIHRoZSB4LWF4aXMKKyAgICAgKiA8L3A+CiAgICAgICogPHA+Ci0gICAgICogdmFsdWVzWzFdOiBQaXRjaCwgcm90YXRpb24gYXJvdW5kIFggYXhpcyAoLTE4MCB0byAxODApLCB3aXRoIHBvc2l0aXZlCi0gICAgICogdmFsdWVzIHdoZW4gdGhlIHotYXhpcyBtb3ZlcyA8Yj50b3dhcmQ8L2I+IHRoZSB5LWF4aXMuCi0gICAgICoKKyAgICAgKiB2YWx1ZXNbMV06IEFjY2VsZXJhdGlvbiBtaW51cyBHeSBvbiB0aGUgeS1heGlzCisgICAgICogPC9wPgogICAgICAqIDxwPgotICAgICAqIHZhbHVlc1syXTogUm9sbCwgcm90YXRpb24gYXJvdW5kIFkgYXhpcyAoLTkwIHRvIDkwKSwgd2l0aCBwb3NpdGl2ZSB2YWx1ZXMKLSAgICAgKiB3aGVuIHRoZSB4LWF4aXMgbW92ZXMgPGI+dG93YXJkPC9iPiB0aGUgei1heGlzLgorICAgICAqIHZhbHVlc1syXTogQWNjZWxlcmF0aW9uIG1pbnVzIEd6IG9uIHRoZSB6LWF4aXMKKyAgICAgKiA8L3A+CiAgICAgICogPC91bD4KLSAgICAgKgorICAgICAqIAogICAgICAqIDxwPgotICAgICAqIDxiPkltcG9ydGFudCBub3RlOjwvYj4gRm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGUgcm9sbCBhbmdsZSBpcyBwb3NpdGl2ZQotICAgICAqIGluIHRoZSBjbG9ja3dpc2UgZGlyZWN0aW9uIChtYXRoZW1hdGljYWxseSBzcGVha2luZywgaXQgc2hvdWxkIGJlCi0gICAgICogcG9zaXRpdmUgaW4gdGhlIGNvdW50ZXItY2xvY2t3aXNlIGRpcmVjdGlvbikuCi0gICAgICoKKyAgICAgKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgbWVhc3VyZXMgdGhlIGFjY2VsZXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBkZXZpY2UKKyAgICAgKiAoPGI+QWQ8L2I+KS4gQ29uY2VwdHVhbGx5LCBpdCBkb2VzIHNvIGJ5IG1lYXN1cmluZyBmb3JjZXMgYXBwbGllZCB0byB0aGUKKyAgICAgKiBzZW5zb3IgaXRzZWxmICg8Yj5GczwvYj4pIHVzaW5nIHRoZSByZWxhdGlvbjoKKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogPGI+PGNlbnRlcj5BZCA9IC0gJiM4NzIxO0ZzIC8gbWFzczwvY2VudGVyPjwvYj4KKyAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBJbiBwYXJ0aWN1bGFyLCB0aGUgZm9yY2Ugb2YgZ3Jhdml0eSBpcyBhbHdheXMgaW5mbHVlbmNpbmcgdGhlIG1lYXN1cmVkCisgICAgICogYWNjZWxlcmF0aW9uOgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiA8Yj48Y2VudGVyPkFkID0gLWcgLSAmIzg3MjE7RiAvIG1hc3M8L2NlbnRlcj48L2I+CisgICAgICogCisgICAgICogPHA+CisgICAgICogRm9yIHRoaXMgcmVhc29uLCB3aGVuIHRoZSBkZXZpY2UgaXMgc2l0dGluZyBvbiBhIHRhYmxlIChhbmQgb2J2aW91c2x5IG5vdAorICAgICAqIGFjY2VsZXJhdGluZyksIHRoZSBhY2NlbGVyb21ldGVyIHJlYWRzIGEgbWFnbml0dWRlIG9mIDxiPmc8L2I+ID0gOS44MQorICAgICAqIG0vc14yCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIDxwPgorICAgICAqIFNpbWlsYXJseSwgd2hlbiB0aGUgZGV2aWNlIGlzIGluIGZyZWUtZmFsbCBhbmQgdGhlcmVmb3JlIGRhbmdlcm91c2x5CisgICAgICogYWNjZWxlcmF0aW5nIHRvd2FyZHMgdG8gZ3JvdW5kIGF0IDkuODEgbS9zXjIsIGl0cyBhY2NlbGVyb21ldGVyIHJlYWRzIGEKKyAgICAgKiBtYWduaXR1ZGUgb2YgMCBtL3NeMi4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogPHA+CisgICAgICogSXQgc2hvdWxkIGJlIGFwcGFyZW50IHRoYXQgaW4gb3JkZXIgdG8gbWVhc3VyZSB0aGUgcmVhbCBhY2NlbGVyYXRpb24gb2YKKyAgICAgKiB0aGUgZGV2aWNlLCB0aGUgY29udHJpYnV0aW9uIG9mIHRoZSBmb3JjZSBvZiBncmF2aXR5IG11c3QgYmUgZWxpbWluYXRlZC4KKyAgICAgKiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSBhcHBseWluZyBhIDxpPmhpZ2gtcGFzczwvaT4gZmlsdGVyLiBDb252ZXJzZWx5LCBhCisgICAgICogPGk+bG93LXBhc3M8L2k+IGZpbHRlciBjYW4gYmUgdXNlZCB0byBpc29sYXRlIHRoZSBmb3JjZSBvZiBncmF2aXR5LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiA8dT5FeGFtcGxlczwvdT46CisgICAgICogPHVsPgorICAgICAqIDxsaT5XaGVuIHRoZSBkZXZpY2UgbGllcyBmbGF0IG9uIGEgdGFibGUgYW5kIGlzIHB1c2hlZCBvbiBpdHMgbGVmdCBzaWRlCisgICAgICogdG93YXJkIHRoZSByaWdodCwgdGhlIHggYWNjZWxlcmF0aW9uIHZhbHVlIGlzIHBvc2l0aXZlLjwvbGk+CisgICAgICogCisgICAgICogPGxpPldoZW4gdGhlIGRldmljZSBsaWVzIGZsYXQgb24gYSB0YWJsZSwgdGhlIGFjY2VsZXJhdGlvbiB2YWx1ZSBpcworICAgICAqICs5LjgxLCB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBhY2NlbGVyYXRpb24gb2YgdGhlIGRldmljZSAoMCBtL3NeMikgbWludXMKKyAgICAgKiB0aGUgZm9yY2Ugb2YgZ3Jhdml0eSAoLTkuODEgbS9zXjIpLjwvbGk+CisgICAgICogCisgICAgICogPGxpPldoZW4gdGhlIGRldmljZSBsaWVzIGZsYXQgb24gYSB0YWJsZSBhbmQgaXMgcHVzaGVkIHRvd2FyZCB0aGUgc2t5CisgICAgICogd2l0aCBhbiBhY2NlbGVyYXRpb24gb2YgQSBtL3NeMiwgdGhlIGFjY2VsZXJhdGlvbiB2YWx1ZSBpcyBlcXVhbCB0bworICAgICAqIEErOS44MSB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBhY2NlbGVyYXRpb24gb2YgdGhlIGRldmljZSAoK0EgbS9zXjIpCisgICAgICogbWludXMgdGhlIGZvcmNlIG9mIGdyYXZpdHkgKC05LjgxIG0vc14yKS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogCisgICAgICogCisgICAgICogPGg0PntAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciNUWVBFX01BR05FVElDX0ZJRUxECisgICAgICogU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTER9OjwvaDQ+CisgICAgICogQWxsIHZhbHVlcyBhcmUgaW4gbWljcm8tVGVzbGEgKHVUKSBhbmQgbWVhc3VyZSB0aGUgYW1iaWVudCBtYWduZXRpYyBmaWVsZAorICAgICAqIGluIHRoZSBYLCBZIGFuZCBaIGF4aXMuCisgICAgICogCisgICAgICogPGg0PntAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciNUWVBFX0xJR0hUIFNlbnNvci5UWVBFX0xJR0hUfTo8L2g0PgorICAgICAqIAorICAgICAqIDx1bD4KKyAgICAgKiA8cD4KKyAgICAgKiB2YWx1ZXNbMF06IEFtYmllbnQgbGlnaHQgbGV2ZWwgaW4gU0kgbHV4IHVuaXRzCisgICAgICogPC91bD4KKyAgICAgKiAKKyAgICAgKiA8aDQ+e0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yI1RZUEVfUFJPWElNSVRZIFNlbnNvci5UWVBFX1BST1hJTUlUWX06CisgICAgICogPC9oND4KKyAgICAgKiAKKyAgICAgKiA8dWw+CisgICAgICogPHA+CisgICAgICogdmFsdWVzWzBdOiBQcm94aW1pdHkgc2Vuc29yIGRpc3RhbmNlIG1lYXN1cmVkIGluIGNlbnRpbWV0ZXJzCisgICAgICogPC91bD4KKyAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5Ob3RlOjwvYj4gU29tZSBwcm94aW1pdHkgc2Vuc29ycyBvbmx5IHN1cHBvcnQgYSBiaW5hcnkgPGk+bmVhcjwvaT4gb3IKKyAgICAgKiA8aT5mYXI8L2k+IG1lYXN1cmVtZW50LiBJbiB0aGlzIGNhc2UsIHRoZSBzZW5zb3Igc2hvdWxkIHJlcG9ydCBpdHMKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IjZ2V0TWF4aW11bVJhbmdlKCkgbWF4aW11bSByYW5nZX0gdmFsdWUgaW4KKyAgICAgKiB0aGUgPGk+ZmFyPC9pPiBzdGF0ZSBhbmQgYSBsZXNzZXIgdmFsdWUgaW4gdGhlIDxpPm5lYXI8L2k+IHN0YXRlLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiA8aDQ+e0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yI1RZUEVfT1JJRU5UQVRJT04KKyAgICAgKiBTZW5zb3IuVFlQRV9PUklFTlRBVElPTn06PC9oND4gQWxsIHZhbHVlcyBhcmUgYW5nbGVzIGluIGRlZ3JlZXMuCisgICAgICogCisgICAgICogPHVsPgorICAgICAqIDxwPgorICAgICAqIHZhbHVlc1swXTogQXppbXV0aCwgYW5nbGUgYmV0d2VlbiB0aGUgbWFnbmV0aWMgbm9ydGggZGlyZWN0aW9uIGFuZCB0aGUKKyAgICAgKiB5LWF4aXMsIGFyb3VuZCB0aGUgei1heGlzICgwIHRvIDM1OSkuIDA9Tm9ydGgsIDkwPUVhc3QsIDE4MD1Tb3V0aCwKKyAgICAgKiAyNzA9V2VzdAorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiB2YWx1ZXNbMV06IFBpdGNoLCByb3RhdGlvbiBhcm91bmQgeC1heGlzICgtMTgwIHRvIDE4MCksIHdpdGggcG9zaXRpdmUKKyAgICAgKiB2YWx1ZXMgd2hlbiB0aGUgei1heGlzIG1vdmVzIDxiPnRvd2FyZDwvYj4gdGhlIHktYXhpcy4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogPHA+CisgICAgICogdmFsdWVzWzJdOiBSb2xsLCByb3RhdGlvbiBhcm91bmQgeS1heGlzICgtOTAgdG8gOTApLCB3aXRoIHBvc2l0aXZlIHZhbHVlcworICAgICAqIHdoZW4gdGhlIHgtYXhpcyBtb3ZlcyA8Yj50b3dhcmQ8L2I+IHRoZSB6LWF4aXMuCisgICAgICogPC9wPgorICAgICAqIDwvdWw+CisgICAgICogCiAgICAgICogPHA+CiAgICAgICogPGI+Tm90ZTo8L2I+IFRoaXMgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSA8Yj55YXcsIHBpdGNoIGFuZCByb2xsPC9iPgogICAgICAqIHVzZWQgaW4gYXZpYXRpb24gd2hlcmUgdGhlIFggYXhpcyBpcyBhbG9uZyB0aGUgbG9uZyBzaWRlIG9mIHRoZSBwbGFuZQogICAgICAqICh0YWlsIHRvIG5vc2UpLgotICAgICAqCisgICAgICogPC9wPgorICAgICAqIAogICAgICAqIDxwPgogICAgICAqIDxiPk5vdGU6PC9iPiBUaGlzIHNlbnNvciB0eXBlIGV4aXN0cyBmb3IgbGVnYWN5IHJlYXNvbnMsIHBsZWFzZSB1c2UKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyI2dldFJvdGF0aW9uTWF0cml4CkBAIC0xMTEsNjIgKzE5MCwxNiBAQAogICAgICAqIHJlbWFwQ29vcmRpbmF0ZVN5c3RlbSgpfSBhbmQKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyI2dldE9yaWVudGF0aW9uIGdldE9yaWVudGF0aW9uKCl9IHRvCiAgICAgICogY29tcHV0ZSB0aGVzZSB2YWx1ZXMgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIDxoMz57QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IjVFlQRV9BQ0NFTEVST01FVEVSCi0gICAgICogU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUn06PC9oMz4KLSAgICAgKiBBbGwgdmFsdWVzIGFyZSBpbiBTSSB1bml0cyAobS9zXjIpIGFuZCBtZWFzdXJlIHRoZSBhY2NlbGVyYXRpb24gYXBwbGllZAotICAgICAqIHRvIHRoZSBwaG9uZSBtaW51cyB0aGUgZm9yY2Ugb2YgZ3Jhdml0eS4KLSAgICAgKgotICAgICAqIDx1bD4KKyAgICAgKiA8L3A+CisgICAgICogCiAgICAgICogPHA+Ci0gICAgICogdmFsdWVzWzBdOiBBY2NlbGVyYXRpb24gbWludXMgR3ggb24gdGhlIHgtYXhpcwotICAgICAqIDxwPgotICAgICAqIHZhbHVlc1sxXTogQWNjZWxlcmF0aW9uIG1pbnVzIEd5IG9uIHRoZSB5LWF4aXMKLSAgICAgKiA8cD4KLSAgICAgKiB2YWx1ZXNbMl06IEFjY2VsZXJhdGlvbiBtaW51cyBHeiBvbiB0aGUgei1heGlzCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIDx1PkV4YW1wbGVzPC91PjoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPldoZW4gdGhlIGRldmljZSBsaWVzIGZsYXQgb24gYSB0YWJsZSBhbmQgaXMgcHVzaGVkIG9uIGl0cyBsZWZ0IHNpZGUKLSAgICAgKiB0b3dhcmQgdGhlIHJpZ2h0LCB0aGUgeCBhY2NlbGVyYXRpb24gdmFsdWUgaXMgcG9zaXRpdmUuPC9saT4KLSAgICAgKgotICAgICAqIDxsaT5XaGVuIHRoZSBkZXZpY2UgbGllcyBmbGF0IG9uIGEgdGFibGUsIHRoZSBhY2NlbGVyYXRpb24gdmFsdWUgaXMKLSAgICAgKiArOS44MSwgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgYWNjZWxlcmF0aW9uIG9mIHRoZSBkZXZpY2UgKDAgbS9zXjIpIG1pbnVzCi0gICAgICogdGhlIGZvcmNlIG9mIGdyYXZpdHkgKC05LjgxIG0vc14yKS48L2xpPgotICAgICAqCi0gICAgICogPGxpPldoZW4gdGhlIGRldmljZSBsaWVzIGZsYXQgb24gYSB0YWJsZSBhbmQgaXMgcHVzaGVkIHRvd2FyZCB0aGUgc2t5Ci0gICAgICogd2l0aCBhbiBhY2NlbGVyYXRpb24gb2YgQSBtL3NeMiwgdGhlIGFjY2VsZXJhdGlvbiB2YWx1ZSBpcyBlcXVhbCB0bwotICAgICAqIEErOS44MSB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBhY2NlbGVyYXRpb24gb2YgdGhlIGRldmljZSAoK0EgbS9zXjIpCi0gICAgICogbWludXMgdGhlIGZvcmNlIG9mIGdyYXZpdHkgKC05LjgxIG0vc14yKS48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKgotICAgICAqIDxoMz57QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IjVFlQRV9NQUdORVRJQ19GSUVMRAotICAgICAqIFNlbnNvci5UWVBFX01BR05FVElDX0ZJRUxEfTo8L2gzPgotICAgICAqIEFsbCB2YWx1ZXMgYXJlIGluIG1pY3JvLVRlc2xhICh1VCkgYW5kIG1lYXN1cmUgdGhlIGFtYmllbnQgbWFnbmV0aWMgZmllbGQKLSAgICAgKiBpbiB0aGUgWCwgWSBhbmQgWiBheGlzLgotICAgICAqCi0gICAgICogPGgzPntAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciNUWVBFX0xJR0hUIFNlbnNvci5UWVBFX0xJR0hUfTo8L2gzPgotICAgICAqCi0gICAgICogPHVsPgotICAgICAqIDxwPgotICAgICAqIHZhbHVlc1swXTogQW1iaWVudCBsaWdodCBsZXZlbCBpbiBTSSBsdXggdW5pdHMKLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPntAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciNUWVBFX1BST1hJTUlUWSBTZW5zb3IuVFlQRV9QUk9YSU1JVFl9OgotICAgICAqIDwvaDM+Ci0gICAgICoKLSAgICAgKiA8dWw+Ci0gICAgICogPHA+Ci0gICAgICogdmFsdWVzWzBdOiBQcm94aW1pdHkgc2Vuc29yIGRpc3RhbmNlIG1lYXN1cmVkIGluIGNlbnRpbWV0ZXJzCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBzb21lIHByb3hpbWl0eSBzZW5zb3JzIG9ubHkgc3VwcG9ydCBhIGJpbmFyeSAiY2xvc2UiIG9yICJmYXIiCi0gICAgICogbWVhc3VyZW1lbnQuIEluIHRoaXMgY2FzZSwgdGhlIHNlbnNvciBzaG91bGQgcmVwb3J0IGl0cyBtYXhSYW5nZSB2YWx1ZSBpbgotICAgICAqIHRoZSAiZmFyIiBzdGF0ZSBhbmQgYSB2YWx1ZSBsZXNzIHRoYW4gbWF4UmFuZ2UgaW4gdGhlICJuZWFyIiBzdGF0ZS4KKyAgICAgKiA8Yj5JbXBvcnRhbnQgbm90ZTo8L2I+IEZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhlIHJvbGwgYW5nbGUgaXMgcG9zaXRpdmUKKyAgICAgKiBpbiB0aGUgY2xvY2t3aXNlIGRpcmVjdGlvbiAobWF0aGVtYXRpY2FsbHkgc3BlYWtpbmcsIGl0IHNob3VsZCBiZQorICAgICAqIHBvc2l0aXZlIGluIHRoZSBjb3VudGVyLWNsb2Nrd2lzZSBkaXJlY3Rpb24pLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFNlbnNvckV2ZW50CisgICAgICogQHNlZSBHZW9tYWduZXRpY0ZpZWxkCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0W10gdmFsdWVzOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JNYW5hZ2VyLmphdmEKaW5kZXggZjYwZTJkNy4uNDkyZjhjYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvck1hbmFnZXIuamF2YQpAQCAtNDYsNiArNDYsMzAgQEAKICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlKGphdmEubGFuZy5TdHJpbmcpCiAgKiBDb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoKX0gd2l0aCB0aGUgYXJndW1lbnQKICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNTRU5TT1JfU0VSVklDRX0uCisgKgorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogcHVibGljIGNsYXNzIFNlbnNvckFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHksIGltcGxlbWVudHMgU2Vuc29yRXZlbnRMaXN0ZW5lciB7CisgKiAgICAgcHJpdmF0ZSBmaW5hbCBTZW5zb3JNYW5hZ2VyIG1TZW5zb3JNYW5hZ2VyOworICogICAgIHByaXZhdGUgZmluYWwgU2Vuc29yIG1BY2NlbGVyb21ldGVyOworICoKKyAqICAgICBwdWJsaWMgU2Vuc29yQWN0aXZpdHkoKSB7CisgKiAgICAgICAgIG1TZW5zb3JNYW5hZ2VyID0gKFNlbnNvck1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShTRU5TT1JfU0VSVklDRSk7CisgKiAgICAgICAgIG1BY2NlbGVyb21ldGVyID0gbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSKTsKKyAqICAgICAgICAgbVNlbnNvck1hbmFnZXIucmVnaXN0ZXJMaXN0ZW5lcih0aGlzLCBtQWNjZWxlcm9tZXRlciwgU2Vuc29yTWFuYWdlci5TRU5TT1JfREVMQVlfTk9STUFMKTsKKyAqICAgICB9CisgKgorICogICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgeworICogICAgIH0KKyAqCisgKiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb25TZW5zb3JDaGFuZ2VkKFNlbnNvckV2ZW50IGV2ZW50KSB7CisgKiAgICAgfQorICogfQorICogPC9wcmU+CisgKgorICogQHNlZSBTZW5zb3JFdmVudExpc3RlbmVyCisgKiBAc2VlIFNlbnNvckV2ZW50CisgKiBAc2VlIFNlbnNvcgorICoKICAqLwogcHVibGljIGNsYXNzIFNlbnNvck1hbmFnZXIKIHsKQEAgLTU3LDcgKzgxLDcgQEAKICAgICAvKioKICAgICAgKiBBIGNvbnN0YW50IGRlc2NyaWJpbmcgYW4gb3JpZW50YXRpb24gc2Vuc29yLiBTZWUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JMaXN0ZW5lciBTZW5zb3JMaXN0ZW5lcn0gZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IgU2Vuc29yfSBpbnN0ZWFkLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC02Niw3ICs5MCw3IEBACiAgICAgLyoqCiAgICAgICogQSBjb25zdGFudCBkZXNjcmliaW5nIGFuIGFjY2VsZXJvbWV0ZXIuIFNlZQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckxpc3RlbmVyIFNlbnNvckxpc3RlbmVyfSBmb3IgbW9yZSBkZXRhaWxzLgotICAgICAqIAorICAgICAqCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciBTZW5zb3J9IGluc3RlYWQuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTc1LDcgKzk5LDcgQEAKICAgICAvKioKICAgICAgKiBBIGNvbnN0YW50IGRlc2NyaWJpbmcgYSB0ZW1wZXJhdHVyZSBzZW5zb3IgU2VlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTGlzdGVuZXIgU2Vuc29yTGlzdGVuZXJ9IGZvciBtb3JlIGRldGFpbHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yIFNlbnNvcn0gaW5zdGVhZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtODQsNyArMTA4LDcgQEAKICAgICAvKioKICAgICAgKiBBIGNvbnN0YW50IGRlc2NyaWJpbmcgYSBtYWduZXRpYyBzZW5zb3IgU2VlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTGlzdGVuZXIgU2Vuc29yTGlzdGVuZXJ9IGZvciBtb3JlIGRldGFpbHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yIFNlbnNvcn0gaW5zdGVhZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtOTMsNyArMTE3LDcgQEAKICAgICAvKioKICAgICAgKiBBIGNvbnN0YW50IGRlc2NyaWJpbmcgYW4gYW1iaWVudCBsaWdodCBzZW5zb3IgU2VlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTGlzdGVuZXIgU2Vuc29yTGlzdGVuZXJ9IGZvciBtb3JlIGRldGFpbHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yIFNlbnNvcn0gaW5zdGVhZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMTAyLDcgKzEyNiw3IEBACiAgICAgLyoqCiAgICAgICogQSBjb25zdGFudCBkZXNjcmliaW5nIGEgcHJveGltaXR5IHNlbnNvciBTZWUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JMaXN0ZW5lciBTZW5zb3JMaXN0ZW5lcn0gZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IgU2Vuc29yfSBpbnN0ZWFkLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xMTEsNyArMTM1LDcgQEAKICAgICAvKioKICAgICAgKiBBIGNvbnN0YW50IGRlc2NyaWJpbmcgYSBUcmljb3JkZXIgU2VlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTGlzdGVuZXIgU2Vuc29yTGlzdGVuZXJ9IGZvciBtb3JlIGRldGFpbHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yIFNlbnNvcn0gaW5zdGVhZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMTIwLDcgKzE0NCw3IEBACiAgICAgLyoqCiAgICAgICogQSBjb25zdGFudCBkZXNjcmliaW5nIGFuIG9yaWVudGF0aW9uIHNlbnNvci4gU2VlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTGlzdGVuZXIgU2Vuc29yTGlzdGVuZXJ9IGZvciBtb3JlIGRldGFpbHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yIFNlbnNvcn0gaW5zdGVhZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMTI4LDcgKzE1Miw3IEBACiAKICAgICAvKioKICAgICAgKiBBIGNvbnN0YW50IHRoYXQgaW5jbHVkZXMgYWxsIHNlbnNvcnMKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IgU2Vuc29yfSBpbnN0ZWFkLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xMzYsNyArMTYwLDcgQEAKIAogICAgIC8qKgogICAgICAqIFNtYWxsZXN0IHNlbnNvciBJRAotICAgICAqIAorICAgICAqCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciBTZW5zb3J9IGluc3RlYWQuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTE0NCw3ICsxNjgsNyBAQAogCiAgICAgLyoqCiAgICAgICogTGFyZ2VzdCBzZW5zb3IgSUQKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IgU2Vuc29yfSBpbnN0ZWFkLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xNTQsNyArMTc4LDcgQEAKICAgICAvKioKICAgICAgKiBJbmRleCBvZiB0aGUgWCB2YWx1ZSBpbiB0aGUgYXJyYXkgcmV0dXJuZWQgYnkKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JMaXN0ZW5lciNvblNlbnNvckNoYW5nZWR9Ci0gICAgICogCisgICAgICoKICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yIFNlbnNvcn0gaW5zdGVhZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMTYzLDcgKzE4Nyw3IEBACiAgICAgLyoqCiAgICAgICogSW5kZXggb2YgdGhlIFkgdmFsdWUgaW4gdGhlIGFycmF5IHJldHVybmVkIGJ5CiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTGlzdGVuZXIjb25TZW5zb3JDaGFuZ2VkfQotICAgICAqIAorICAgICAqCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciBTZW5zb3J9IGluc3RlYWQuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTE3Miw3ICsxOTYsNyBAQAogICAgIC8qKgogICAgICAqIEluZGV4IG9mIHRoZSBaIHZhbHVlIGluIHRoZSBhcnJheSByZXR1cm5lZCBieQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckxpc3RlbmVyI29uU2Vuc29yQ2hhbmdlZH0KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IgU2Vuc29yfSBpbnN0ZWFkLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xODEsNyArMjA1LDcgQEAKICAgICAvKioKICAgICAgKiBPZmZzZXQgdG8gdGhlIHVudHJhbnNmb3JtZWQgdmFsdWVzIGluIHRoZSBhcnJheSByZXR1cm5lZCBieQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckxpc3RlbmVyI29uU2Vuc29yQ2hhbmdlZH0KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IgU2Vuc29yfSBpbnN0ZWFkLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xOTAsNyArMjE0LDcgQEAKICAgICAvKioKICAgICAgKiBJbmRleCBvZiB0aGUgdW50cmFuc2Zvcm1lZCBYIHZhbHVlIGluIHRoZSBhcnJheSByZXR1cm5lZCBieQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckxpc3RlbmVyI29uU2Vuc29yQ2hhbmdlZH0KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IgU2Vuc29yfSBpbnN0ZWFkLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xOTksNyArMjIzLDcgQEAKICAgICAvKioKICAgICAgKiBJbmRleCBvZiB0aGUgdW50cmFuc2Zvcm1lZCBZIHZhbHVlIGluIHRoZSBhcnJheSByZXR1cm5lZCBieQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckxpc3RlbmVyI29uU2Vuc29yQ2hhbmdlZH0KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IgU2Vuc29yfSBpbnN0ZWFkLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0yMDgsNyArMjMyLDcgQEAKICAgICAvKioKICAgICAgKiBJbmRleCBvZiB0aGUgdW50cmFuc2Zvcm1lZCBaIHZhbHVlIGluIHRoZSBhcnJheSByZXR1cm5lZCBieQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckxpc3RlbmVyI29uU2Vuc29yQ2hhbmdlZH0KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IgU2Vuc29yfSBpbnN0ZWFkLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0yNTAsNyArMjc0LDcgQEAKICAgICAvKiogTWluaW11bSBtYWduZXRpYyBmaWVsZCBvbiBFYXJ0aCdzIHN1cmZhY2UgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IE1BR05FVElDX0ZJRUxEX0VBUlRIX01JTiA9IDMwLjBmOwogCi0gICAgCisKICAgICAvKiogTWF4aW11bSBsdW1pbmFuY2Ugb2Ygc3VubGlnaHQgaW4gbHV4ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBMSUdIVF9TVU5MSUdIVF9NQVggPSAxMjAwMDAuMGY7CiAgICAgLyoqIGx1bWluYW5jZSBvZiBzdW5saWdodCBpbiBsdXggKi8KQEAgLTI2OCw3ICsyOTIsNyBAQAogICAgIC8qKiBsdW1pbmFuY2UgYXQgbmlnaHQgd2l0aCBubyBtb29uIGluIGx1eCovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBMSUdIVF9OT19NT09OICAgICAgPSAwLjAwMWY7CiAKLSAgICAKKwogICAgIC8qKiBnZXQgc2Vuc29yIGRhdGEgYXMgZmFzdCBhcyBwb3NzaWJsZSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTlNPUl9ERUxBWV9GQVNURVNUID0gMDsKICAgICAvKiogcmF0ZSBzdWl0YWJsZSBmb3IgZ2FtZXMgKi8KQEAgLTY3MywxMSArNjk3LDE0IEBACiAgICAgICogTWFrZSBtdWx0aXBsZSBjYWxscyB0byBnZXQgc2Vuc29ycyBvZiBkaWZmZXJlbnQgdHlwZXMgb3IgdXNlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yI1RZUEVfQUxMIFNlbnNvci5UWVBFX0FMTH0gdG8gZ2V0IGFsbCB0aGUKICAgICAgKiBzZW5zb3JzLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHR5cGUKICAgICAgKiAgICAgICAgb2Ygc2Vuc29ycyByZXF1ZXN0ZWQKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHNlbnNvcnMgbWF0Y2hpbmcgdGhlIGFza2VkIHR5cGUuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXREZWZhdWx0U2Vuc29yKGludCkKKyAgICAgKiBAc2VlIFNlbnNvcgogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFNlbnNvcj4gZ2V0U2Vuc29yTGlzdChpbnQgdHlwZSkgewogICAgICAgICAvLyBjYWNoZSB0aGUgcmV0dXJuZWQgbGlzdHMgdGhlIGZpcnN0IHRpbWUKQEAgLTcwNywxMSArNzM0LDE0IEBACiAgICAgICogcmV0dXJuZWQgc2Vuc29yIGNvdWxkIGJlIGEgY29tcG9zaXRlIHNlbnNvciwgYW5kIGl0cyBkYXRhIGNvdWxkIGJlCiAgICAgICogYXZlcmFnZWQgb3IgZmlsdGVyZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgcmF3IHNlbnNvcnMgdXNlCiAgICAgICoge0BsaW5rIFNlbnNvck1hbmFnZXIjZ2V0U2Vuc29yTGlzdChpbnQpIGdldFNlbnNvckxpc3R9LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHR5cGUKICAgICAgKiAgICAgICAgb2Ygc2Vuc29ycyByZXF1ZXN0ZWQKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc2Vuc29ycyBtYXRjaGluZyB0aGUgYXNrZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFNlbnNvckxpc3QoaW50KQorICAgICAqIEBzZWUgU2Vuc29yCiAgICAgICovCiAgICAgcHVibGljIFNlbnNvciBnZXREZWZhdWx0U2Vuc29yKGludCB0eXBlKSB7CiAgICAgICAgIC8vIFRPRE86IG5lZWQgdG8gYmUgc21hcnRlciwgZm9yIG5vdywganVzdCByZXR1cm4gdGhlIDFzdCBzZW5zb3IKQEAgLTcyMSwxNyArNzUxLDE3IEBACiAKICAgICAvKioKICAgICAgKiBSZWdpc3RlcnMgYSBsaXN0ZW5lciBmb3IgZ2l2ZW4gc2Vuc29ycy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZQogICAgICAqICAgICAgICAgICAgIHtAbGluayBTZW5zb3JNYW5hZ2VyI3JlZ2lzdGVyTGlzdGVuZXIoU2Vuc29yRXZlbnRMaXN0ZW5lciwgU2Vuc29yLCBpbnQpfQogICAgICAqICAgICAgICAgICAgIGluc3RlYWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIKICAgICAgKiAgICAgICAgc2Vuc29yIGxpc3RlbmVyIG9iamVjdAotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHNlbnNvcnMKICAgICAgKiAgICAgICAgYSBiaXQgbWFza3Mgb2YgdGhlIHNlbnNvcnMgdG8gcmVnaXN0ZXIgdG8KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlbnNvciBpcyBzdXBwb3J0ZWQgYW5kIHN1Y2Nlc3NmdWxseQogICAgICAqICAgICAgICAgZW5hYmxlZAogICAgICAqLwpAQCAtNzQyLDI0ICs3NzIsMjQgQEAKIAogICAgIC8qKgogICAgICAqIFJlZ2lzdGVycyBhIFNlbnNvckxpc3RlbmVyIGZvciBnaXZlbiBzZW5zb3JzLgotICAgICAqIAorICAgICAqCiAgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlCiAgICAgICogICAgICAgICAgICAge0BsaW5rIFNlbnNvck1hbmFnZXIjcmVnaXN0ZXJMaXN0ZW5lcihTZW5zb3JFdmVudExpc3RlbmVyLCBTZW5zb3IsIGludCl9CiAgICAgICogICAgICAgICAgICAgaW5zdGVhZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBsaXN0ZW5lcgogICAgICAqICAgICAgICBzZW5zb3IgbGlzdGVuZXIgb2JqZWN0Ci0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gc2Vuc29ycwogICAgICAqICAgICAgICBhIGJpdCBtYXNrcyBvZiB0aGUgc2Vuc29ycyB0byByZWdpc3RlciB0bwotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHJhdGUKICAgICAgKiAgICAgICAgcmF0ZSBvZiBldmVudHMuIFRoaXMgaXMgb25seSBhIGhpbnQgdG8gdGhlIHN5c3RlbS4gZXZlbnRzIG1heSBiZQogICAgICAqICAgICAgICByZWNlaXZlZCBmYXN0ZXIgb3Igc2xvd2VyIHRoYW4gdGhlIHNwZWNpZmllZCByYXRlLiBVc3VhbGx5IGV2ZW50cwogICAgICAqICAgICAgICBhcmUgcmVjZWl2ZWQgZmFzdGVyLiBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YKICAgICAgKiAgICAgICAge0BsaW5rICNTRU5TT1JfREVMQVlfTk9STUFMfSwge0BsaW5rICNTRU5TT1JfREVMQVlfVUl9LAogICAgICAqICAgICAgICB7QGxpbmsgI1NFTlNPUl9ERUxBWV9HQU1FfSwgb3Ige0BsaW5rICNTRU5TT1JfREVMQVlfRkFTVEVTVH0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZW5zb3IgaXMgc3VwcG9ydGVkIGFuZCBzdWNjZXNzZnVsbHkKICAgICAgKiAgICAgICAgIGVuYWJsZWQKICAgICAgKi8KQEAgLTgxOSwxNCArODQ5LDE0IEBACiAKICAgICAvKioKICAgICAgKiBVbnJlZ2lzdGVycyBhIGxpc3RlbmVyIGZvciB0aGUgc2Vuc29ycyB3aXRoIHdoaWNoIGl0IGlzIHJlZ2lzdGVyZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UKICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgU2Vuc29yTWFuYWdlciN1bnJlZ2lzdGVyTGlzdGVuZXIoU2Vuc29yRXZlbnRMaXN0ZW5lciwgU2Vuc29yKX0KICAgICAgKiAgICAgICAgICAgICBpbnN0ZWFkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyCiAgICAgICogICAgICAgIGEgU2Vuc29yTGlzdGVuZXIgb2JqZWN0Ci0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gc2Vuc29ycwogICAgICAqICAgICAgICBhIGJpdCBtYXNrcyBvZiB0aGUgc2Vuc29ycyB0byB1bnJlZ2lzdGVyIGZyb20KICAgICAgKi8KQEAgLTg5MSwxMSArOTIxLDExIEBACiAKICAgICAvKioKICAgICAgKiBVbnJlZ2lzdGVycyBhIGxpc3RlbmVyIGZvciBhbGwgc2Vuc29ycy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZQogICAgICAqICAgICAgICAgICAgIHtAbGluayBTZW5zb3JNYW5hZ2VyI3VucmVnaXN0ZXJMaXN0ZW5lcihTZW5zb3JFdmVudExpc3RlbmVyKX0KICAgICAgKiAgICAgICAgICAgICBpbnN0ZWFkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyCiAgICAgICogICAgICAgIGEgU2Vuc29yTGlzdGVuZXIgb2JqZWN0CiAgICAgICovCkBAIC05MDYsMTIgKzkzNiwxNiBAQAogCiAgICAgLyoqCiAgICAgICogVW5yZWdpc3RlcnMgYSBsaXN0ZW5lciBmb3IgdGhlIHNlbnNvcnMgd2l0aCB3aGljaCBpdCBpcyByZWdpc3RlcmVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyCiAgICAgICogICAgICAgIGEgU2Vuc29yRXZlbnRMaXN0ZW5lciBvYmplY3QKKyAgICAgKgogICAgICAqIEBwYXJhbSBzZW5zb3IKICAgICAgKiAgICAgICAgdGhlIHNlbnNvciB0byB1bnJlZ2lzdGVyIGZyb20KLSAgICAgKiAKKyAgICAgKgorICAgICAqIEBzZWUgI3VucmVnaXN0ZXJMaXN0ZW5lcihTZW5zb3JFdmVudExpc3RlbmVyKQorICAgICAqIEBzZWUgI3JlZ2lzdGVyTGlzdGVuZXIoU2Vuc29yRXZlbnRMaXN0ZW5lciwgU2Vuc29yLCBpbnQpCisgICAgICoKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoU2Vuc29yRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciwgU2Vuc29yIHNlbnNvcikgewogICAgICAgICB1bnJlZ2lzdGVyTGlzdGVuZXIoKE9iamVjdClsaXN0ZW5lciwgc2Vuc29yKTsKQEAgLTkxOSwxMCArOTUzLDEzIEBACiAKICAgICAvKioKICAgICAgKiBVbnJlZ2lzdGVycyBhIGxpc3RlbmVyIGZvciBhbGwgc2Vuc29ycy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBsaXN0ZW5lcgogICAgICAqICAgICAgICBhIFNlbnNvckxpc3RlbmVyIG9iamVjdAotICAgICAqIAorICAgICAqCisgICAgICogQHNlZSAjdW5yZWdpc3Rlckxpc3RlbmVyKFNlbnNvckV2ZW50TGlzdGVuZXIsIFNlbnNvcikKKyAgICAgKiBAc2VlICNyZWdpc3Rlckxpc3RlbmVyKFNlbnNvckV2ZW50TGlzdGVuZXIsIFNlbnNvciwgaW50KQorICAgICAqCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKFNlbnNvckV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgdW5yZWdpc3Rlckxpc3RlbmVyKChPYmplY3QpbGlzdGVuZXIpOwpAQCAtOTMxLDE0ICs5NjgsMTQgQEAKICAgICAvKioKICAgICAgKiBSZWdpc3RlcnMgYSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudExpc3RlbmVyCiAgICAgICogU2Vuc29yRXZlbnRMaXN0ZW5lcn0gZm9yIHRoZSBnaXZlbiBzZW5zb3IuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIKICAgICAgKiAgICAgICAgQSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudExpc3RlbmVyIFNlbnNvckV2ZW50TGlzdGVuZXJ9CiAgICAgICogICAgICAgIG9iamVjdC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBzZW5zb3IKICAgICAgKiAgICAgICAgVGhlIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciBTZW5zb3J9IHRvIHJlZ2lzdGVyIHRvLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHJhdGUKICAgICAgKiAgICAgICAgVGhlIHJhdGUge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnQgc2Vuc29yIGV2ZW50c30gYXJlCiAgICAgICogICAgICAgIGRlbGl2ZXJlZCBhdC4gVGhpcyBpcyBvbmx5IGEgaGludCB0byB0aGUgc3lzdGVtLiBFdmVudHMgbWF5IGJlCkBAIC05NDYsMTAgKzk4MywxNCBAQAogICAgICAqICAgICAgICBhcmUgcmVjZWl2ZWQgZmFzdGVyLiBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YKICAgICAgKiAgICAgICAge0BsaW5rICNTRU5TT1JfREVMQVlfTk9STUFMfSwge0BsaW5rICNTRU5TT1JfREVMQVlfVUl9LAogICAgICAqICAgICAgICB7QGxpbmsgI1NFTlNPUl9ERUxBWV9HQU1FfSwgb3Ige0BsaW5rICNTRU5TT1JfREVMQVlfRkFTVEVTVH0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZW5zb3IgaXMgc3VwcG9ydGVkIGFuZCBzdWNjZXNzZnVsbHkKICAgICAgKiAgICAgICAgIGVuYWJsZWQuCi0gICAgICogCisgICAgICoKKyAgICAgKiBAc2VlICNyZWdpc3Rlckxpc3RlbmVyKFNlbnNvckV2ZW50TGlzdGVuZXIsIFNlbnNvciwgaW50LCBIYW5kbGVyKQorICAgICAqIEBzZWUgI3VucmVnaXN0ZXJMaXN0ZW5lcihTZW5zb3JFdmVudExpc3RlbmVyKQorICAgICAqIEBzZWUgI3VucmVnaXN0ZXJMaXN0ZW5lcihTZW5zb3JFdmVudExpc3RlbmVyLCBTZW5zb3IpCisgICAgICoKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3Rlckxpc3RlbmVyKFNlbnNvckV2ZW50TGlzdGVuZXIgbGlzdGVuZXIsIFNlbnNvciBzZW5zb3IsIGludCByYXRlKSB7CiAgICAgICAgIHJldHVybiByZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyLCBzZW5zb3IsIHJhdGUsIG51bGwpOwpAQCAtOTU4LDE0ICs5OTksMTQgQEAKICAgICAvKioKICAgICAgKiBSZWdpc3RlcnMgYSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudExpc3RlbmVyCiAgICAgICogU2Vuc29yRXZlbnRMaXN0ZW5lcn0gZm9yIHRoZSBnaXZlbiBzZW5zb3IuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIKICAgICAgKiAgICAgICAgQSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudExpc3RlbmVyIFNlbnNvckV2ZW50TGlzdGVuZXJ9CiAgICAgICogICAgICAgIG9iamVjdC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBzZW5zb3IKICAgICAgKiAgICAgICAgVGhlIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvciBTZW5zb3J9IHRvIHJlZ2lzdGVyIHRvLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHJhdGUKICAgICAgKiAgICAgICAgVGhlIHJhdGUge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnQgc2Vuc29yIGV2ZW50c30gYXJlCiAgICAgICogICAgICAgIGRlbGl2ZXJlZCBhdC4gVGhpcyBpcyBvbmx5IGEgaGludCB0byB0aGUgc3lzdGVtLiBFdmVudHMgbWF5IGJlCkBAIC05NzMsMTQgKzEwMTQsMTggQEAKICAgICAgKiAgICAgICAgYXJlIHJlY2VpdmVkIGZhc3Rlci4gVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mCiAgICAgICogICAgICAgIHtAbGluayAjU0VOU09SX0RFTEFZX05PUk1BTH0sIHtAbGluayAjU0VOU09SX0RFTEFZX1VJfSwKICAgICAgKiAgICAgICAge0BsaW5rICNTRU5TT1JfREVMQVlfR0FNRX0sIG9yIHtAbGluayAjU0VOU09SX0RFTEFZX0ZBU1RFU1R9LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGhhbmRsZXIKICAgICAgKiAgICAgICAgVGhlIHtAbGluayBhbmRyb2lkLm9zLkhhbmRsZXIgSGFuZGxlcn0gdGhlCiAgICAgICogICAgICAgIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50IHNlbnNvciBldmVudHN9IHdpbGwgYmUKICAgICAgKiAgICAgICAgZGVsaXZlcmVkIHRvLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzZW5zb3IgaXMgc3VwcG9ydGVkIGFuZCBzdWNjZXNzZnVsbHkgZW5hYmxlZC4KLSAgICAgKiAKKyAgICAgKgorICAgICAqIEBzZWUgI3JlZ2lzdGVyTGlzdGVuZXIoU2Vuc29yRXZlbnRMaXN0ZW5lciwgU2Vuc29yLCBpbnQpCisgICAgICogQHNlZSAjdW5yZWdpc3Rlckxpc3RlbmVyKFNlbnNvckV2ZW50TGlzdGVuZXIpCisgICAgICogQHNlZSAjdW5yZWdpc3Rlckxpc3RlbmVyKFNlbnNvckV2ZW50TGlzdGVuZXIsIFNlbnNvcikKKyAgICAgKgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyTGlzdGVuZXIoU2Vuc29yRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciwgU2Vuc29yIHNlbnNvciwgaW50IHJhdGUsCiAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIpIHsKQEAgLTExMDcsNyArMTE1Miw3IEBACiAgICAgICogd29ybGQncyBjb29yZGluYXRlIHN5c3RlbSB3aGljaCBpcyBkZWZpbmVkIGFzIGEgZGlyZWN0IG9ydGhvbm9ybWFsIGJhc2lzLAogICAgICAqIHdoZXJlOgogICAgICAqIDwvcD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDx1bD4KICAgICAgKiA8bGk+WCBpcyBkZWZpbmVkIGFzIHRoZSB2ZWN0b3IgcHJvZHVjdCA8Yj5ZLlo8L2I+IChJdCBpcyB0YW5nZW50aWFsIHRvCiAgICAgICogdGhlIGdyb3VuZCBhdCB0aGUgZGV2aWNlJ3MgY3VycmVudCBsb2NhdGlvbiBhbmQgcm91Z2hseSBwb2ludHMgRWFzdCkuPC9saT4KQEAgLTExMTUsNiArMTE2MCwxMiBAQAogICAgICAqIHBvaW50cyB0b3dhcmRzIHRoZSBtYWduZXRpYyBOb3J0aCBQb2xlLjwvbGk+CiAgICAgICogPGxpPlogcG9pbnRzIHRvd2FyZHMgdGhlIHNreSBhbmQgaXMgcGVycGVuZGljdWxhciB0byB0aGUgZ3JvdW5kLjwvbGk+CiAgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIDxjZW50ZXI+PGltZyBzcmM9Ii4uLy4uLy4uL2ltYWdlcy9heGlzX2dsb2JlLnBuZyIKKyAgICAgKiBhbHQ9IlNlbnNvcnMgY29vcmRpbmF0ZS1zeXN0ZW0gZGlhZ3JhbS4iIGJvcmRlcj0iMCIgLz48L2NlbnRlcj4KKyAgICAgKiA8L3A+CisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiA8aHI+CiAgICAgICogPHA+CkBAIC0xMTI5LDI3ICsxMTgwLDI3IEBACiAgICAgICogd29ybGQncyBjb29yZGluYXRlIHN5c3RlbSwgdGhhdCBpcywgd2hlbiB0aGUgZGV2aWNlJ3MgWCBheGlzIHBvaW50cwogICAgICAqIHRvd2FyZCBFYXN0LCB0aGUgWSBheGlzIHBvaW50cyB0byB0aGUgTm9ydGggUG9sZSBhbmQgdGhlIGRldmljZSBpcyBmYWNpbmcKICAgICAgKiB0aGUgc2t5LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogPGI+STwvYj4gaXMgYSByb3RhdGlvbiBtYXRyaXggdHJhbnNmb3JtaW5nIHRoZSBnZW9tYWduZXRpYyB2ZWN0b3IgaW50bwogICAgICAqIHRoZSBzYW1lIGNvb3JkaW5hdGUgc3BhY2UgYXMgZ3Jhdml0eSAodGhlIHdvcmxkJ3MgY29vcmRpbmF0ZSBzcGFjZSkuCiAgICAgICogPGI+STwvYj4gaXMgYSBzaW1wbGUgcm90YXRpb24gYXJvdW5kIHRoZSBYIGF4aXMuIFRoZSBpbmNsaW5hdGlvbiBhbmdsZSBpbgogICAgICAqIHJhZGlhbnMgY2FuIGJlIGNvbXB1dGVkIHdpdGgge0BsaW5rICNnZXRJbmNsaW5hdGlvbn0uCiAgICAgICogPGhyPgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogRWFjaCBtYXRyaXggaXMgcmV0dXJuZWQgZWl0aGVyIGFzIGEgM3gzIG9yIDR4NCByb3ctbWFqb3IgbWF0cml4IGRlcGVuZGluZwogICAgICAqIG9uIHRoZSBsZW5ndGggb2YgdGhlIHBhc3NlZCBhcnJheToKICAgICAgKiA8cD4KICAgICAgKiA8dT5JZiB0aGUgYXJyYXkgbGVuZ3RoIGlzIDE2OjwvdT4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwcmU+CiAgICAgICogICAvICBNWyAwXSAgIE1bIDFdICAgTVsgMl0gICBNWyAzXSAgXAogICAgICAqICAgfCAgTVsgNF0gICBNWyA1XSAgIE1bIDZdICAgTVsgN10gIHwKICAgICAgKiAgIHwgIE1bIDhdICAgTVsgOV0gICBNWzEwXSAgIE1bMTFdICB8CiAgICAgICogICBcICBNWzEyXSAgIE1bMTNdICAgTVsxNF0gICBNWzE1XSAgLwogICAgICAqPC9wcmU+Ci0gICAgICogCisgICAgICoKICAgICAgKiBUaGlzIG1hdHJpeCBpcyByZWFkeSB0byBiZSB1c2VkIGJ5IE9wZW5HTCBFUydzCiAgICAgICoge0BsaW5rIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTAjZ2xMb2FkTWF0cml4ZihmbG9hdFtdLCBpbnQpCiAgICAgICogZ2xMb2FkTWF0cml4ZihmbG9hdFtdLCBpbnQpfS4KQEAgLTExNjEsNDQgKzEyMTIsNDQgQEAKICAgICAgKiB0aGVyZWZvcmUgYmUgdXNlZCB3aXRoIE9wZW5HTCBFUyBkaXJlY3RseS4KICAgICAgKiA8cD4KICAgICAgKiBBbHNvIG5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgbWF0cmljZXMgYWx3YXlzIGhhdmUgdGhpcyBmb3JtOgotICAgICAqIAorICAgICAqCiAgICAgICogPHByZT4KICAgICAgKiAgIC8gIE1bIDBdICAgTVsgMV0gICBNWyAyXSAgIDAgIFwKICAgICAgKiAgIHwgIE1bIDRdICAgTVsgNV0gICBNWyA2XSAgIDAgIHwKICAgICAgKiAgIHwgIE1bIDhdICAgTVsgOV0gICBNWzEwXSAgIDAgIHwKICAgICAgKiAgIFwgICAgICAwICAgICAgIDAgICAgICAgMCAgIDEgIC8KICAgICAgKjwvcHJlPgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogPHU+SWYgdGhlIGFycmF5IGxlbmd0aCBpcyA5OjwvdT4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwcmU+CiAgICAgICogICAvICBNWyAwXSAgIE1bIDFdICAgTVsgMl0gIFwKICAgICAgKiAgIHwgIE1bIDNdICAgTVsgNF0gICBNWyA1XSAgfAogICAgICAqICAgXCAgTVsgNl0gICBNWyA3XSAgIE1bIDhdICAvCiAgICAgICo8L3ByZT4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxocj4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgaW52ZXJzZSBvZiBlYWNoIG1hdHJpeCBjYW4gYmUgY29tcHV0ZWQgZWFzaWx5IGJ5IHRha2luZyBpdHMKICAgICAgKiB0cmFuc3Bvc2UuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBUaGUgbWF0cmljZXMgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBhcmUgbWVhbmluZ2Z1bCBvbmx5IHdoZW4gdGhlCiAgICAgICogZGV2aWNlIGlzIG5vdCBmcmVlLWZhbGxpbmcgYW5kIGl0IGlzIG5vdCBjbG9zZSB0byB0aGUgbWFnbmV0aWMgbm9ydGguIElmCiAgICAgICogdGhlIGRldmljZSBpcyBhY2NlbGVyYXRpbmcsIG9yIHBsYWNlZCBpbnRvIGEgc3Ryb25nIG1hZ25ldGljIGZpZWxkLCB0aGUKICAgICAgKiByZXR1cm5lZCBtYXRyaWNlcyBtYXkgYmUgaW5hY2N1cmF0ZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBSCiAgICAgICogICAgICAgIGlzIGFuIGFycmF5IG9mIDkgZmxvYXRzIGhvbGRpbmcgdGhlIHJvdGF0aW9uIG1hdHJpeCA8Yj5SPC9iPiB3aGVuCiAgICAgICogICAgICAgIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4gUiBjYW4gYmUgbnVsbC4KICAgICAgKiAgICAgICAgPHA+Ci0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gSQogICAgICAqICAgICAgICBpcyBhbiBhcnJheSBvZiA5IGZsb2F0cyBob2xkaW5nIHRoZSByb3RhdGlvbiBtYXRyaXggPGI+STwvYj4gd2hlbgogICAgICAqICAgICAgICB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIEkgY2FuIGJlIG51bGwuCiAgICAgICogICAgICAgIDxwPgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGdyYXZpdHkKICAgICAgKiAgICAgICAgaXMgYW4gYXJyYXkgb2YgMyBmbG9hdHMgY29udGFpbmluZyB0aGUgZ3Jhdml0eSB2ZWN0b3IgZXhwcmVzc2VkIGluCiAgICAgICogICAgICAgIHRoZSBkZXZpY2UncyBjb29yZGluYXRlLiBZb3UgY2FuIHNpbXBseSB1c2UgdGhlCkBAIC0xMjA4LDcgKzEyNTksNyBAQAogICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IjVFlQRV9BQ0NFTEVST01FVEVSCiAgICAgICogICAgICAgIFRZUEVfQUNDRUxFUk9NRVRFUn0uCiAgICAgICogICAgICAgIDxwPgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGdlb21hZ25ldGljCiAgICAgICogICAgICAgIGlzIGFuIGFycmF5IG9mIDMgZmxvYXRzIGNvbnRhaW5pbmcgdGhlIGdlb21hZ25ldGljIHZlY3RvcgogICAgICAqICAgICAgICBleHByZXNzZWQgaW4gdGhlIGRldmljZSdzIGNvb3JkaW5hdGUuIFlvdSBjYW4gc2ltcGx5IHVzZSB0aGUKQEAgLTEyMTcsMTAgKzEyNjgsMTQgQEAKICAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yIFNlbnNvcn0gb2YgdHlwZQogICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3IjVFlQRV9NQUdORVRJQ19GSUVMRAogICAgICAqICAgICAgICBUWVBFX01BR05FVElDX0ZJRUxEfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gb24gc3VjY2VzcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG9uIGZhaWx1cmUgKGZvcgogICAgICAqICAgICAgICAgaW5zdGFuY2UsIGlmIHRoZSBkZXZpY2UgaXMgaW4gZnJlZSBmYWxsKS4gT24gZmFpbHVyZSB0aGUgb3V0cHV0CiAgICAgICogICAgICAgICBtYXRyaWNlcyBhcmUgbm90IG1vZGlmaWVkLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0SW5jbGluYXRpb24oZmxvYXRbXSkKKyAgICAgKiBAc2VlICNnZXRPcmllbnRhdGlvbihmbG9hdFtdLCBmbG9hdFtdKQorICAgICAqIEBzZWUgI3JlbWFwQ29vcmRpbmF0ZVN5c3RlbShmbG9hdFtdLCBpbnQsIGludCwgZmxvYXRbXSkKICAgICAgKi8KIAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRSb3RhdGlvbk1hdHJpeChmbG9hdFtdIFIsIGZsb2F0W10gSSwKQEAgLTEyODksMTYgKzEzNDQsMjIgQEAKICAgICAvKioKICAgICAgKiBDb21wdXRlcyB0aGUgZ2VvbWFnbmV0aWMgaW5jbGluYXRpb24gYW5nbGUgaW4gcmFkaWFucyBmcm9tIHRoZQogICAgICAqIGluY2xpbmF0aW9uIG1hdHJpeCA8Yj5JPC9iPiByZXR1cm5lZCBieSB7QGxpbmsgI2dldFJvdGF0aW9uTWF0cml4fS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBJCiAgICAgICogICAgICAgIGluY2xpbmF0aW9uIG1hdHJpeCBzZWUge0BsaW5rICNnZXRSb3RhdGlvbk1hdHJpeH0uCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBnZW9tYWduZXRpYyBpbmNsaW5hdGlvbiBhbmdsZSBpbiByYWRpYW5zLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb25NYXRyaXgoZmxvYXRbXSwgZmxvYXRbXSwgZmxvYXRbXSwgZmxvYXRbXSkKKyAgICAgKiBAc2VlICNnZXRPcmllbnRhdGlvbihmbG9hdFtdLCBmbG9hdFtdKQorICAgICAqIEBzZWUgR2VvbWFnbmV0aWNGaWVsZAorICAgICAqCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmbG9hdCBnZXRJbmNsaW5hdGlvbihmbG9hdFtdIEkpIHsKICAgICAgICAgaWYgKEkubGVuZ3RoID09IDkpIHsKICAgICAgICAgICAgIHJldHVybiAoZmxvYXQpTWF0aC5hdGFuMihJWzVdLCBJWzRdKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAoZmxvYXQpTWF0aC5hdGFuMihJWzZdLCBJWzVdKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiAoZmxvYXQpTWF0aC5hdGFuMihJWzZdLCBJWzVdKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTMwOSw3ICsxMzcwLDcgQEAKICAgICAgKiBjb21wdXRlIHRoZSB0aHJlZSBvcmllbnRhdGlvbiBhbmdsZXMgb2YgdGhlIGRldmljZSAoc2VlCiAgICAgICoge0BsaW5rICNnZXRPcmllbnRhdGlvbn0pIGluIGEgZGlmZmVyZW50IGNvb3JkaW5hdGUgc3lzdGVtLgogICAgICAqIDwvcD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFdoZW4gdGhlIHJvdGF0aW9uIG1hdHJpeCBpcyB1c2VkIGZvciBkcmF3aW5nIChmb3IgaW5zdGFuY2Ugd2l0aCBPcGVuR0wKICAgICAgKiBFUyksIGl0IHVzdWFsbHkgPGI+ZG9lc24ndCBuZWVkPC9iPiB0byBiZSB0cmFuc2Zvcm1lZCBieSB0aGlzIGZ1bmN0aW9uLApAQCAtMTMxOSw2MCArMTM4MCw2MiBAQAogICAgICAqIGlzIGdlbmVyYWxseSBmcmVlIHRvIHJvdGF0ZSB0aGVpciBzY3JlZW4sIHlvdSBvZnRlbiBzaG91bGQgY29uc2lkZXIgdGhlCiAgICAgICogcm90YXRpb24gaW4gZGVjaWRpbmcgdGhlIHBhcmFtZXRlcnMgdG8gdXNlIGhlcmUuCiAgICAgICogPC9wPgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogPHU+RXhhbXBsZXM6PC91PgogICAgICAqIDxwPgotICAgICAqIAorICAgICAqCiAgICAgICogPHVsPgogICAgICAqIDxsaT5Vc2luZyB0aGUgY2FtZXJhIChZIGF4aXMgYWxvbmcgdGhlIGNhbWVyYSdzIGF4aXMpIGZvciBhbiBhdWdtZW50ZWQKICAgICAgKiByZWFsaXR5IGFwcGxpY2F0aW9uIHdoZXJlIHRoZSByb3RhdGlvbiBhbmdsZXMgYXJlIG5lZWRlZDo8L2xpPgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogPHVsPgogICAgICAqIDxjb2RlPnJlbWFwQ29vcmRpbmF0ZVN5c3RlbShpblIsIEFYSVNfWCwgQVhJU19aLCBvdXRSKTs8L2NvZGU+CiAgICAgICogPC91bD4KICAgICAgKiA8L3A+Ci0gICAgICogCisgICAgICoKICAgICAgKiA8bGk+VXNpbmcgdGhlIGRldmljZSBhcyBhIG1lY2hhbmljYWwgY29tcGFzcyB3aGVuIHJvdGF0aW9uIGlzCiAgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5TdXJmYWNlI1JPVEFUSU9OXzkwIFN1cmZhY2UuUk9UQVRJT05fOTB9OjwvbGk+Ci0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiA8dWw+CiAgICAgICogPGNvZGU+cmVtYXBDb29yZGluYXRlU3lzdGVtKGluUiwgQVhJU19ZLCBBWElTX01JTlVTX1gsIG91dFIpOzwvY29kZT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvcD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEJld2FyZSBvZiB0aGUgYWJvdmUgZXhhbXBsZS4gVGhpcyBjYWxsIGlzIG5lZWRlZCBvbmx5IHRvIGFjY291bnQgZm9yIGEKICAgICAgKiByb3RhdGlvbiBmcm9tIGl0cyBuYXR1cmFsIG9yaWVudGF0aW9uIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHJvdGF0aW9uCiAgICAgICogYW5nbGVzIChzZWUge0BsaW5rICNnZXRPcmllbnRhdGlvbn0pLiBJZiB0aGUgcm90YXRpb24gbWF0cml4IGlzIGFsc28gdXNlZAogICAgICAqIGZvciByZW5kZXJpbmcsIGl0IG1heSBub3QgbmVlZCB0byBiZSB0cmFuc2Zvcm1lZCwgZm9yIGluc3RhbmNlIGlmIHlvdXIKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkgQWN0aXZpdHl9IGlzIHJ1bm5pbmcgaW4gbGFuZHNjYXBlIG1vZGUuCiAgICAgICogPC91bD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFNpbmNlIHRoZSByZXN1bHRpbmcgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgb3J0aG9ub3JtYWwsIG9ubHkgdHdvIGF4ZXMgbmVlZAogICAgICAqIHRvIGJlIHNwZWNpZmllZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBpblIKICAgICAgKiAgICAgICAgdGhlIHJvdGF0aW9uIG1hdHJpeCB0byBiZSB0cmFuc2Zvcm1lZC4gVXN1YWxseSBpdCBpcyB0aGUgbWF0cml4CiAgICAgICogICAgICAgIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0Um90YXRpb25NYXRyaXh9LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIFgKICAgICAgKiAgICAgICAgZGVmaW5lcyBvbiB3aGljaCB3b3JsZCBheGlzIGFuZCBkaXJlY3Rpb24gdGhlIFggYXhpcyBvZiB0aGUgZGV2aWNlCiAgICAgICogICAgICAgIGlzIG1hcHBlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBZCiAgICAgICogICAgICAgIGRlZmluZXMgb24gd2hpY2ggd29ybGQgYXhpcyBhbmQgZGlyZWN0aW9uIHRoZSBZIGF4aXMgb2YgdGhlIGRldmljZQogICAgICAqICAgICAgICBpcyBtYXBwZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gb3V0UgogICAgICAqICAgICAgICB0aGUgdHJhbnNmb3JtZWQgcm90YXRpb24gbWF0cml4LiBpblIgYW5kIG91dFIgY2FuIGJlIHRoZSBzYW1lCiAgICAgICogICAgICAgIGFycmF5LCBidXQgaXQgaXMgbm90IHJlY29tbWVuZGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IG9uIHN1Y2Nlc3MuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgaW5wdXQKICAgICAgKiAgICAgICAgIHBhcmFtZXRlcnMgYXJlIGluY29ycmVjdCwgZm9yIGluc3RhbmNlIGlmIFggYW5kIFkgZGVmaW5lIHRoZSBzYW1lCiAgICAgICogICAgICAgICBheGlzLiBPciBpZiBpblIgYW5kIG91dFIgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGguCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbk1hdHJpeChmbG9hdFtdLCBmbG9hdFtdLCBmbG9hdFtdLCBmbG9hdFtdKQogICAgICAqLwogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlbWFwQ29vcmRpbmF0ZVN5c3RlbShmbG9hdFtdIGluUiwgaW50IFgsIGludCBZLApAQCAtMTQ2NCwxNCArMTUyNywyMyBAQAogICAgICAqIDxsaT52YWx1ZXNbMl06IDxpPnJvbGw8L2k+LCByb3RhdGlvbiBhcm91bmQgdGhlIFkgYXhpcy48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPHA+CisgICAgICogPGNlbnRlcj48aW1nIHNyYz0iLi4vLi4vLi4vaW1hZ2VzL2F4aXNfZGV2aWNlLnBuZyIKKyAgICAgKiBhbHQ9IlNlbnNvcnMgY29vcmRpbmF0ZS1zeXN0ZW0gZGlhZ3JhbS4iIGJvcmRlcj0iMCIgLz48L2NlbnRlcj4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CiAgICAgICogQWxsIHRocmVlIGFuZ2xlcyBhYm92ZSBhcmUgaW4gPGI+cmFkaWFuczwvYj4gYW5kIDxiPnBvc2l0aXZlPC9iPiBpbiB0aGUKICAgICAgKiA8Yj5jb3VudGVyLWNsb2Nrd2lzZTwvYj4gZGlyZWN0aW9uLgogICAgICAqIAogICAgICAqIEBwYXJhbSBSCiAgICAgICogICAgICAgIHJvdGF0aW9uIG1hdHJpeCBzZWUge0BsaW5rICNnZXRSb3RhdGlvbk1hdHJpeH0uCisgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlcwogICAgICAqICAgICAgICBhbiBhcnJheSBvZiAzIGZsb2F0cyB0byBob2xkIHRoZSByZXN1bHQuCisgICAgICogCiAgICAgICogQHJldHVybiBUaGUgYXJyYXkgdmFsdWVzIHBhc3NlZCBhcyBhcmd1bWVudC4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbk1hdHJpeChmbG9hdFtdLCBmbG9hdFtdLCBmbG9hdFtdLCBmbG9hdFtdKQorICAgICAqIEBzZWUgR2VvbWFnbmV0aWNGaWVsZAogICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmbG9hdFtdIGdldE9yaWVudGF0aW9uKGZsb2F0W10gUiwgZmxvYXQgdmFsdWVzW10pIHsKICAgICAgICAgLyoKQEAgLTE0ODAsMTIgKzE1NTIsMTIgQEAKICAgICAgICAgICogICB8ICBSWyA0XSAgIFJbIDVdICAgUlsgNl0gICAwICB8CiAgICAgICAgICAqICAgfCAgUlsgOF0gICBSWyA5XSAgIFJbMTBdICAgMCAgfAogICAgICAgICAgKiAgIFwgICAgICAwICAgICAgIDAgICAgICAgMCAgIDEgIC8KLSAgICAgICAgICogICAKKyAgICAgICAgICoKICAgICAgICAgICogM3gzIChsZW5ndGg9OSkgY2FzZToKICAgICAgICAgICogICAvICBSWyAwXSAgIFJbIDFdICAgUlsgMl0gIFwKICAgICAgICAgICogICB8ICBSWyAzXSAgIFJbIDRdICAgUlsgNV0gIHwKICAgICAgICAgICogICBcICBSWyA2XSAgIFJbIDddICAgUlsgOF0gIC8KLSAgICAgICAgICogCisgICAgICAgICAqCiAgICAgICAgICAqLwogICAgICAgICBpZiAoUi5sZW5ndGggPT0gOSkgewogICAgICAgICAgICAgdmFsdWVzWzBdID0gKGZsb2F0KU1hdGguYXRhbjIoUlsxXSwgUls0XSk7CkBAIC0xNjQ3LDcgKzE3MTksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgY2xhc3MgTG1zRmlsdGVyIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFTlNPUlNfUkFURV9NUyA9IDIwOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlQgPSAxMjsKQEAgLTE3MTUsNyArMTc4Nyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsYXNzSW5pdCgpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBzZW5zb3JzX21vZHVsZV9pbml0KCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhMjE0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDcxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRG93bmxvYWRzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFRoZSBkb3dubG9hZCBtYW5hZ2VyIGlzIGEgc3lzdGVtIHNlcnZpY2UgdGhhdCBoYW5kbGVzIGxvbmctcnVubmluZyBIVFRQIGRvd25sb2Fkcy4gQ2xpZW50cyBtYXkKKyAqIHJlcXVlc3QgdGhhdCBhIFVSSSBiZSBkb3dubG9hZGVkIHRvIGEgcGFydGljdWxhciBkZXN0aW5hdGlvbiBmaWxlLiBUaGUgZG93bmxvYWQgbWFuYWdlciB3aWxsCisgKiBjb25kdWN0IHRoZSBkb3dubG9hZCBpbiB0aGUgYmFja2dyb3VuZCwgdGFraW5nIGNhcmUgb2YgSFRUUCBpbnRlcmFjdGlvbnMgYW5kIHJldHJ5aW5nIGRvd25sb2FkcworICogYWZ0ZXIgZmFpbHVyZXMgb3IgYWNyb3NzIGNvbm5lY3Rpdml0eSBjaGFuZ2VzIGFuZCBzeXN0ZW0gcmVib290cy4KKyAqCisgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBzaG91bGQgYmUgb2J0YWluZWQgdGhyb3VnaAorICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UoU3RyaW5nKX0gYnkgcGFzc2luZworICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I0RPV05MT0FEX1NFUlZJQ0V9LgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBEb3dubG9hZE1hbmFnZXIgeworICAgIC8qKgorICAgICAqIEFuIGlkZW50aWZpZXIgZm9yIGEgcGFydGljdWxhciBkb3dubG9hZCwgdW5pcXVlIGFjcm9zcyB0aGUgc3lzdGVtLiAgQ2xpZW50cyB1c2UgdGhpcyBJRCB0bworICAgICAqIG1ha2Ugc3Vic2VxdWVudCBjYWxscyByZWxhdGVkIHRvIHRoZSBkb3dubG9hZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fSUQgPSAiaWQiOworCisgICAgLyoqCisgICAgICogVGhlIGNsaWVudC1zdXBwbGllZCB0aXRsZSBmb3IgdGhpcyBkb3dubG9hZC4gIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gc3lzdGVtIG5vdGlmaWNhdGlvbnMsCisgICAgICogaWYgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fVElUTEUgPSAidGl0bGUiOworCisgICAgLyoqCisgICAgICogVGhlIGNsaWVudC1zdXBwbGllZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGRvd25sb2FkLiAgVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBpbiBzeXN0ZW0KKyAgICAgKiBub3RpZmljYXRpb25zLCBpZiBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTFVNTl9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CisKKyAgICAvKioKKyAgICAgKiBVUkkgdG8gYmUgZG93bmxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fVVJJID0gInVyaSI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5ldCBNZWRpYSBUeXBlIG9mIHRoZSBkb3dubG9hZGVkIGZpbGUuICBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIGJhc2VkIG9uIHRoZSBzZXJ2ZXIncworICAgICAqIHJlc3BvbnNlIG9uY2UgdGhlIGRvd25sb2FkIGhhcyBzdGFydGVkLgorICAgICAqCisgICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxNTkwLnR4dCI+UkZDIDE1OTAsIGRlZmluaW5nIE1lZGlhIFR5cGVzPC9hPgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTFVNTl9NRURJQV9UWVBFID0gIm1lZGlhX3R5cGUiOworCisgICAgLyoqCisgICAgICogVG90YWwgc2l6ZSBvZiB0aGUgZG93bmxvYWQgaW4gYnl0ZXMuICBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIG9uY2UgdGhlIGRvd25sb2FkIHN0YXJ0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fVE9UQUxfU0laRV9CWVRFUyA9ICJ0b3RhbF9zaXplIjsKKworICAgIC8qKgorICAgICAqIFVyaSB3aGVyZSBkb3dubG9hZGVkIGZpbGUgd2lsbCBiZSBzdG9yZWQuICBJZiBhIGRlc3RpbmF0aW9uIGlzIHN1cHBsaWVkIGJ5IGNsaWVudCwgdGhhdCBVUkkKKyAgICAgKiB3aWxsIGJlIHVzZWQgaGVyZS4gIE90aGVyd2lzZSwgdGhlIHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggYSBnZW5lcmF0ZWQgVVJJIG9uY2UgdGhlCisgICAgICogZG93bmxvYWQgaGFzIHN0YXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MVU1OX0xPQ0FMX1VSSSA9ICJsb2NhbF91cmkiOworCisgICAgLyoqCisgICAgICogQ3VycmVudCBzdGF0dXMgb2YgdGhlIGRvd25sb2FkLCBhcyBvbmUgb2YgdGhlIFNUQVRVU18qIGNvbnN0YW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fU1RBVFVTID0gInN0YXR1cyI7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZXJyb3IgdGhhdCBvY2N1cnJlZCwgd2hlbiB7QGxpbmsgI0NPTFVNTl9TVEFUVVN9IGlzCisgICAgICoge0BsaW5rICNTVEFUVVNfRkFJTEVEfS4gIElmIGFuIEhUVFAgZXJyb3Igb2NjdXJyZWQsIHRoaXMgd2lsbCBob2xkIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzCisgICAgICogZGVmaW5lZCBpbiBSRkMgMjYxNi4gIE90aGVyd2lzZSwgaXQgd2lsbCBob2xkIG9uZSBvZiB0aGUgRVJST1JfKiBjb25zdGFudHMuCisgICAgICoKKyAgICAgKiBJZiB7QGxpbmsgI0NPTFVNTl9TVEFUVVN9IGlzIG5vdCB7QGxpbmsgI1NUQVRVU19GQUlMRUR9LCB0aGlzIGNvbHVtbidzIHZhbHVlIGlzIHVuZGVmaW5lZC4KKyAgICAgKgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWM2Lmh0bWwjc2VjNi4xLjEiPlJGQyAyNjE2CisgICAgICogc3RhdHVzIGNvZGVzPC9hPgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTFVNTl9FUlJPUl9DT0RFID0gImVycm9yX2NvZGUiOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGJ5dGVzIGRvd25sb2FkIHNvIGZhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fQllURVNfRE9XTkxPQURFRF9TT19GQVIgPSAiYnl0ZXNfc29fZmFyIjsKKworICAgIC8qKgorICAgICAqIFRpbWVzdGFtcCB3aGVuIHRoZSBkb3dubG9hZCB3YXMgcmVxdWVzdGVkLCBpbiB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzCisgICAgICogU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCl9ICh3YWxsIGNsb2NrIHRpbWUgaW4gVVRDKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fUkVRVUVTVEVEX1RJTUVTVEFNUCA9ICJyZXF1ZXN0ZWRfdGltZXN0YW1wIjsKKworCisgICAgLyoqCisgICAgICogVmFsdWUgb2Yge0BsaW5rICNDT0xVTU5fU1RBVFVTfSB3aGVuIHRoZSBkb3dubG9hZCBpcyB3YWl0aW5nIHRvIHN0YXJ0LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRVU19QRU5ESU5HID0gMSA8PCAwOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2Yge0BsaW5rICNDT0xVTU5fU1RBVFVTfSB3aGVuIHRoZSBkb3dubG9hZCBpcyBjdXJyZW50bHkgcnVubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFUVVNfUlVOTklORyA9IDEgPDwgMTsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHtAbGluayAjQ09MVU1OX1NUQVRVU30gd2hlbiB0aGUgZG93bmxvYWQgaXMgd2FpdGluZyB0byByZXRyeSBvciByZXN1bWUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVFVTX1BBVVNFRCA9IDEgPDwgMjsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHtAbGluayAjQ09MVU1OX1NUQVRVU30gd2hlbiB0aGUgZG93bmxvYWQgaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVFVTX1NVQ0NFU1NGVUwgPSAxIDw8IDM7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB7QGxpbmsgI0NPTFVNTl9TVEFUVVN9IHdoZW4gdGhlIGRvd25sb2FkIGhhcyBmYWlsZWQgKGFuZCB3aWxsIG5vdCBiZSByZXRyaWVkKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFUVVNfRkFJTEVEID0gMSA8PCA0OworCisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiBDT0xVTU5fRVJST1JfQ09ERSB3aGVuIHRoZSBkb3dubG9hZCBoYXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IgdGhhdCBkb2Vzbid0IGZpdAorICAgICAqIHVuZGVyIGFueSBvdGhlciBlcnJvciBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX1VOS05PV04gPSAxMDAwOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2Yge0BsaW5rICNDT0xVTU5fRVJST1JfQ09ERX0gd2hlbiBhIHN0b3JhZ2UgaXNzdWUgYXJpc2VzIHdoaWNoIGRvZXNuJ3QgZml0IHVuZGVyIGFueQorICAgICAqIG90aGVyIGVycm9yIGNvZGUuIFVzZSB0aGUgbW9yZSBzcGVjaWZpYyB7QGxpbmsgI0VSUk9SX0lOU1VGRklDSUVOVF9TUEFDRX0gYW5kCisgICAgICoge0BsaW5rICNFUlJPUl9ERVZJQ0VfTk9UX0ZPVU5EfSB3aGVuIGFwcHJvcHJpYXRlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX0ZJTEVfRVJST1IgPSAxMDAxOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2Yge0BsaW5rICNDT0xVTU5fRVJST1JfQ09ERX0gd2hlbiBhbiBIVFRQIGNvZGUgd2FzIHJlY2VpdmVkIHRoYXQgZG93bmxvYWQgbWFuYWdlcgorICAgICAqIGNhbid0IGhhbmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUl9VTkhBTkRMRURfSFRUUF9DT0RFID0gMTAwMjsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHtAbGluayAjQ09MVU1OX0VSUk9SX0NPREV9IHdoZW4gYW4gZXJyb3IgcmVjZWl2aW5nIG9yIHByb2Nlc3NpbmcgZGF0YSBvY2N1cnJlZCBhdAorICAgICAqIHRoZSBIVFRQIGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX0hUVFBfREFUQV9FUlJPUiA9IDEwMDQ7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB7QGxpbmsgI0NPTFVNTl9FUlJPUl9DT0RFfSB3aGVuIHRoZXJlIHdlcmUgdG9vIG1hbnkgcmVkaXJlY3RzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX1RPT19NQU5ZX1JFRElSRUNUUyA9IDEwMDU7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB7QGxpbmsgI0NPTFVNTl9FUlJPUl9DT0RFfSB3aGVuIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgc3RvcmFnZSBzcGFjZS4gVHlwaWNhbGx5LAorICAgICAqIHRoaXMgaXMgYmVjYXVzZSB0aGUgU0QgY2FyZCBpcyBmdWxsLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX0lOU1VGRklDSUVOVF9TUEFDRSA9IDEwMDY7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB7QGxpbmsgI0NPTFVNTl9FUlJPUl9DT0RFfSB3aGVuIG5vIGV4dGVybmFsIHN0b3JhZ2UgZGV2aWNlIHdhcyBmb3VuZC4gVHlwaWNhbGx5LAorICAgICAqIHRoaXMgaXMgYmVjYXVzZSB0aGUgU0QgY2FyZCBpcyBub3QgbW91bnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUl9ERVZJQ0VfTk9UX0ZPVU5EID0gMTAwNzsKKworCisgICAgLy8gdGhpcyBhcnJheSBtdXN0IGNvbnRhaW4gYWxsIHB1YmxpYyBjb2x1bW5zCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIENPTFVNTl9JRCwKKyAgICAgICAgQ09MVU1OX1RJVExFLAorICAgICAgICBDT0xVTU5fREVTQ1JJUFRJT04sCisgICAgICAgIENPTFVNTl9VUkksCisgICAgICAgIENPTFVNTl9NRURJQV9UWVBFLAorICAgICAgICBDT0xVTU5fVE9UQUxfU0laRV9CWVRFUywKKyAgICAgICAgQ09MVU1OX0xPQ0FMX1VSSSwKKyAgICAgICAgQ09MVU1OX1NUQVRVUywKKyAgICAgICAgQ09MVU1OX0VSUk9SX0NPREUsCisgICAgICAgIENPTFVNTl9CWVRFU19ET1dOTE9BREVEX1NPX0ZBUiwKKyAgICAgICAgQ09MVU1OX1JFUVVFU1RFRF9USU1FU1RBTVAKKyAgICB9OworCisgICAgLy8gY29sdW1ucyB0byByZXF1ZXN0IGZyb20gRG93bmxvYWRQcm92aWRlcgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOREVSTFlJTkdfQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIERvd25sb2Fkcy5JbXBsLl9JRCwKKyAgICAgICAgRG93bmxvYWRzLkNPTFVNTl9USVRMRSwKKyAgICAgICAgRG93bmxvYWRzLkNPTFVNTl9ERVNDUklQVElPTiwKKyAgICAgICAgRG93bmxvYWRzLkNPTFVNTl9VUkksCisgICAgICAgIERvd25sb2Fkcy5DT0xVTU5fTUlNRV9UWVBFLAorICAgICAgICBEb3dubG9hZHMuQ09MVU1OX1RPVEFMX0JZVEVTLAorICAgICAgICBEb3dubG9hZHMuX0RBVEEsCisgICAgICAgIERvd25sb2Fkcy5DT0xVTU5fU1RBVFVTLAorICAgICAgICBEb3dubG9hZHMuQ09MVU1OX0NVUlJFTlRfQllURVMKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gTE9OR19DT0xVTU5TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigKKyAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoQ09MVU1OX0lELCBDT0xVTU5fVE9UQUxfU0laRV9CWVRFUywgQ09MVU1OX1NUQVRVUywgQ09MVU1OX0VSUk9SX0NPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTl9CWVRFU19ET1dOTE9BREVEX1NPX0ZBUiwgQ09MVU1OX1JFUVVFU1RFRF9USU1FU1RBTVApKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcmVxdWVzdCBhIG5ldyBkb3dubG9hZC4gIFRoZSBVUkkgaXMgdGhlCisgICAgICogb25seSByZXF1aXJlZCBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1ZXN0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpdCBmbGFnIGZvciBzZXRTaG93Tm90aWZpY2F0aW9uIGluZGljYXRlZCBhIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgY3JlYXRlZCB3aGlsZSB0aGUKKyAgICAgICAgICogZG93bmxvYWQgaXMgcnVubmluZy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RJRklDQVRJT05fV0hFTl9SVU5OSU5HID0gMTsKKworICAgICAgICBVcmkgbVVyaTsKKyAgICAgICAgVXJpIG1EZXN0aW5hdGlvblVyaTsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtUmVxdWVzdEhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgU3RyaW5nIG1UaXRsZTsKKyAgICAgICAgU3RyaW5nIG1EZXNjcmlwdGlvbjsKKyAgICAgICAgaW50IG1Ob3RpZmljYXRpb25GbGFnczsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBtTWVkaWFUeXBlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gdXJpIHRoZSBIVFRQIFVSSSB0byBkb3dubG9hZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0KFVyaSB1cmkpIHsKKyAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWUgPT0gbnVsbCB8fCAhc2NoZW1lLmVxdWFscygiaHR0cCIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuIG9ubHkgZG93bmxvYWQgSFRUUCBVUklzOiAiICsgdXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBsb2NhbCBkZXN0aW5hdGlvbiBmb3IgdGhlIGRvd25sb2FkZWQgZGF0YS4gTXVzdCBiZSBhIGZpbGUgVVJJIHRvIGEgcGF0aCBvbgorICAgICAgICAgKiBleHRlcm5hbCBzdG9yYWdlLCBhbmQgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gbXVzdCBoYXZlIHRoZSBXUklURV9FWFRFUk5BTF9TVE9SQUdFCisgICAgICAgICAqIHBlcm1pc3Npb24uCisgICAgICAgICAqCisgICAgICAgICAqICBCeSBkZWZhdWx0LCBkb3dubG9hZHMgYXJlIHNhdmVkIHRvIGEgZ2VuZXJhdGVkIGZpbGUgaW4gdGhlIGRvd25sb2FkIGNhY2hlIGFuZCBtYXkgYmUKKyAgICAgICAgICogZGVsZXRlZCBieSB0aGUgZG93bmxvYWQgbWFuYWdlciBhdCBhbnkgdGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGlzIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlcXVlc3Qgc2V0RGVzdGluYXRpb25VcmkoVXJpIHVyaSkgeworICAgICAgICAgICAgbURlc3RpbmF0aW9uVXJpID0gdXJpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGFuIEhUVFAgaGVhZGVyIHRvIGJlIGluY2x1ZGVkIHdpdGggdGhlIGRvd25sb2FkIHJlcXVlc3QuCisgICAgICAgICAqIEBwYXJhbSBoZWFkZXIgSFRUUCBoZWFkZXIgbmFtZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgaGVhZGVyIHZhbHVlCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0IHNldFJlcXVlc3RIZWFkZXIoU3RyaW5nIGhlYWRlciwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBtUmVxdWVzdEhlYWRlcnMucHV0KGhlYWRlciwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB0aXRsZSBvZiB0aGlzIGRvd25sb2FkLCB0byBiZSBkaXNwbGF5ZWQgaW4gbm90aWZpY2F0aW9ucyAoaWYgZW5hYmxlZCkKKyAgICAgICAgICogQHJldHVybiB0aGlzIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlcXVlc3Qgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgZG93bmxvYWQsIHRvIGJlIGRpc3BsYXllZCBpbiBub3RpZmljYXRpb25zIChpZiBlbmFibGVkKQorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUmVxdWVzdCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBJbnRlcm5ldCBNZWRpYSBUeXBlIG9mIHRoaXMgZG93bmxvYWQuICBUaGlzIHdpbGwgb3ZlcnJpZGUgdGhlIG1lZGlhIHR5cGUgZGVjbGFyZWQKKyAgICAgICAgICogaW4gdGhlIHNlcnZlcidzIHJlc3BvbnNlLgorICAgICAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE1OTAudHh0Ij5SRkMgMTU5MCwgZGVmaW5pbmcgTWVkaWEgVHlwZXM8L2E+CisgICAgICAgICAqIEByZXR1cm4gdGhpcyBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0IHNldE1lZGlhVHlwZShTdHJpbmcgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBtTWVkaWFUeXBlID0gbWVkaWFUeXBlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udHJvbCBzeXN0ZW0gbm90aWZpY2F0aW9ucyBwb3N0ZWQgYnkgdGhlIGRvd25sb2FkIG1hbmFnZXIgZm9yIHRoaXMgZG93bmxvYWQuICBJZgorICAgICAgICAgKiBlbmFibGVkLCB0aGUgZG93bmxvYWQgbWFuYWdlciBwb3N0cyBub3RpZmljYXRpb25zIGFib3V0IGRvd25sb2FkcyB0aHJvdWdoIHRoZSBzeXN0ZW0KKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXJ9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmxhZ3MgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBOT1RJRklDQVRJT05fKiBiaXQgZmxhZ3MKKyAgICAgICAgICogQHJldHVybiB0aGlzIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlcXVlc3Qgc2V0U2hvd05vdGlmaWNhdGlvbihpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GbGFncyA9IGZsYWdzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVxdWVzdCBzZXRBbGxvd2VkTmV0d29ya1R5cGVzKGludCBmbGFncykgeworICAgICAgICAgICAgLy8gVE9ETyBhbGxvd2VkIG5ldHdvcmtzIHN1cHBvcnQKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlcXVlc3Qgc2V0QWxsb3dlZE92ZXJSb2FtaW5nKGJvb2xlYW4gYWxsb3dlZCkgeworICAgICAgICAgICAgLy8gVE9ETyByb2FtaW5nIHN1cHBvcnQKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gQ29udGVudFZhbHVlcyB0byBiZSBwYXNzZWQgdG8gRG93bmxvYWRQcm92aWRlci5pbnNlcnQoKQorICAgICAgICAgKi8KKyAgICAgICAgQ29udGVudFZhbHVlcyB0b0NvbnRlbnRWYWx1ZXMoKSB7CisgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICBhc3NlcnQgbVVyaSAhPSBudWxsOworICAgICAgICAgICAgdmFsdWVzLnB1dChEb3dubG9hZHMuQ09MVU1OX1VSSSwgbVVyaS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgaWYgKG1EZXN0aW5hdGlvblVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBkZXN0aW5hdGlvbiBzdXBwb3J0CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoRG93bmxvYWRzLkNPTFVNTl9ERVNUSU5BVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25sb2Fkcy5ERVNUSU5BVElPTl9DQUNIRV9QQVJUSVRJT05fUFVSR0VBQkxFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtUmVxdWVzdEhlYWRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyByZXF1ZXN0IGhlYWRlcnMgc3VwcG9ydAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdXRJZk5vbk51bGwodmFsdWVzLCBEb3dubG9hZHMuQ09MVU1OX1RJVExFLCBtVGl0bGUpOworICAgICAgICAgICAgcHV0SWZOb25OdWxsKHZhbHVlcywgRG93bmxvYWRzLkNPTFVNTl9ERVNDUklQVElPTiwgbURlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHB1dElmTm9uTnVsbCh2YWx1ZXMsIERvd25sb2Fkcy5DT0xVTU5fTUlNRV9UWVBFLCBtTWVkaWFUeXBlKTsKKworICAgICAgICAgICAgaW50IHZpc2liaWxpdHkgPSBEb3dubG9hZHMuVklTSUJJTElUWV9ISURERU47CisgICAgICAgICAgICBpZiAoKG1Ob3RpZmljYXRpb25GbGFncyAmIE5PVElGSUNBVElPTl9XSEVOX1JVTk5JTkcpICE9IDApIHsKKyAgICAgICAgICAgICAgICB2aXNpYmlsaXR5ID0gRG93bmxvYWRzLlZJU0lCSUxJVFlfVklTSUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlcy5wdXQoRG93bmxvYWRzLkNPTFVNTl9WSVNJQklMSVRZLCB2aXNpYmlsaXR5KTsKKworICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwdXRJZk5vbk51bGwoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIG1heSBiZSB1c2VkIHRvIGZpbHRlciBkb3dubG9hZCBtYW5hZ2VyIHF1ZXJpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBRdWVyeSB7CisgICAgICAgIHByaXZhdGUgTG9uZyBtSWQ7CisgICAgICAgIHByaXZhdGUgSW50ZWdlciBtU3RhdHVzRmxhZ3MgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmNsdWRlIG9ubHkgdGhlIGRvd25sb2FkIHdpdGggdGhlIGdpdmVuIElELgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUXVlcnkgc2V0RmlsdGVyQnlJZChsb25nIGlkKSB7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluY2x1ZGUgb25seSBkb3dubG9hZHMgd2l0aCBzdGF0dXMgbWF0Y2hpbmcgYW55IHRoZSBnaXZlbiBzdGF0dXMgZmxhZ3MuCisgICAgICAgICAqIEBwYXJhbSBmbGFncyBhbnkgY29tYmluYXRpb24gb2YgdGhlIFNUQVRVU18qIGJpdCBmbGFncworICAgICAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUXVlcnkgc2V0RmlsdGVyQnlTdGF0dXMoaW50IGZsYWdzKSB7CisgICAgICAgICAgICBtU3RhdHVzRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJ1biB0aGlzIHF1ZXJ5IHVzaW5nIHRoZSBnaXZlbiBDb250ZW50UmVzb2x2ZXIuCisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIHRoZSBwcm9qZWN0aW9uIHRvIHBhc3MgdG8gQ29udGVudFJlc29sdmVyLnF1ZXJ5KCkKKyAgICAgICAgICogQHJldHVybiB0aGUgQ3Vyc29yIHJldHVybmVkIGJ5IENvbnRlbnRSZXNvbHZlci5xdWVyeSgpCisgICAgICAgICAqLworICAgICAgICBDdXJzb3IgcnVuUXVlcnkoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmdbXSBwcm9qZWN0aW9uKSB7CisgICAgICAgICAgICBVcmkgdXJpID0gRG93bmxvYWRzLkNPTlRFTlRfVVJJOworICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChtSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKHVyaSwgbUlkLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVN0YXR1c0ZsYWdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcGFydHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBpZiAoKG1TdGF0dXNGbGFncyAmIFNUQVRVU19QRU5ESU5HKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFkZChzdGF0dXNDbGF1c2UoIj0iLCBEb3dubG9hZHMuU1RBVFVTX1BFTkRJTkcpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChtU3RhdHVzRmxhZ3MgJiBTVEFUVVNfUlVOTklORykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGQoc3RhdHVzQ2xhdXNlKCI9IiwgRG93bmxvYWRzLlNUQVRVU19SVU5OSU5HKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgobVN0YXR1c0ZsYWdzICYgU1RBVFVTX1BBVVNFRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGQoc3RhdHVzQ2xhdXNlKCI9IiwgRG93bmxvYWRzLlNUQVRVU19QRU5ESU5HX1BBVVNFRCkpOworICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGQoc3RhdHVzQ2xhdXNlKCI9IiwgRG93bmxvYWRzLlNUQVRVU19SVU5OSU5HX1BBVVNFRCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG1TdGF0dXNGbGFncyAmIFNUQVRVU19TVUNDRVNTRlVMKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFkZChzdGF0dXNDbGF1c2UoIj0iLCBEb3dubG9hZHMuU1RBVFVTX1NVQ0NFU1MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChtU3RhdHVzRmxhZ3MgJiBTVEFUVVNfRkFJTEVEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFkZCgiKCIgKyBzdGF0dXNDbGF1c2UoIj49IiwgNDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEFORCAiICsgc3RhdHVzQ2xhdXNlKCI8IiwgNjAwKSArICIpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IGpvaW5TdHJpbmdzKCIgT1IgIiwgcGFydHMpOworICAgICAgICAgICAgICAgIExvZy53KCJEb3dubG9hZE1hbmFnZXJQdWJsaWMiLCBzZWxlY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogb3JkZXJpbmcKKyAgICAgICAgICAgIHJldHVybiByZXNvbHZlci5xdWVyeSh1cmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBqb2luU3RyaW5ncyhTdHJpbmcgam9pbmVyLCBJdGVyYWJsZTxTdHJpbmc+IHBhcnRzKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBwYXJ0IDogcGFydHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGpvaW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcnQpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzQ2xhdXNlKFN0cmluZyBvcGVyYXRvciwgaW50IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gRG93bmxvYWRzLkNPTFVNTl9TVEFUVVMgKyBvcGVyYXRvciArICInIiArIHZhbHVlICsgIiciOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRG93bmxvYWRNYW5hZ2VyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnF1ZXVlIGEgbmV3IGRvd25sb2FkLiAgVGhlIGRvd25sb2FkIHdpbGwgc3RhcnQgYXV0b21hdGljYWxseSBvbmNlIHRoZSBkb3dubG9hZCBtYW5hZ2VyIGlzCisgICAgICogcmVhZHkgdG8gZXhlY3V0ZSBpdCBhbmQgY29ubmVjdGl2aXR5IGlzIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IHRoZSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgdGhpcyBkb3dubG9hZAorICAgICAqIEByZXR1cm4gYW4gSUQgZm9yIHRoZSBkb3dubG9hZCwgdW5pcXVlIGFjcm9zcyB0aGUgc3lzdGVtLiAgVGhpcyBJRCBpcyB1c2VkIHRvIG1ha2UgZnV0dXJlCisgICAgICogY2FsbHMgcmVsYXRlZCB0byB0aGlzIGRvd25sb2FkLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGVucXVldWUoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gcmVxdWVzdC50b0NvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgVXJpIGRvd25sb2FkVXJpID0gbVJlc29sdmVyLmluc2VydChEb3dubG9hZHMuQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgIGxvbmcgaWQgPSBMb25nLnBhcnNlTG9uZyhkb3dubG9hZFVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKSk7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYSBkb3dubG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGRvd25sb2FkIG1hbmFnZXIuICBUaGUgZG93bmxvYWQgd2lsbCBiZSBzdG9wcGVkIGlmCisgICAgICogaXQgd2FzIHJ1bm5pbmcsIGFuZCBpdCB3aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIGRvd25sb2FkIG1hbmFnZXIuICBJZiBhIGZpbGUKKyAgICAgKiB3YXMgYWxyZWFkeSBkb3dubG9hZGVkLCBpdCB3aWxsIG5vdCBiZSBkZWxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIHRoZSBJRCBvZiB0aGUgZG93bmxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUobG9uZyBpZCkgeworICAgICAgICBpbnQgbnVtRGVsZXRlZCA9IG1SZXNvbHZlci5kZWxldGUoZ2V0RG93bmxvYWRVcmkoaWQpLCBudWxsLCBudWxsKTsKKyAgICAgICAgaWYgKG51bURlbGV0ZWQgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRG93bmxvYWQgIiArIGlkICsgIiBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIGRvd25sb2FkIG1hbmFnZXIgYWJvdXQgZG93bmxvYWRzIHRoYXQgaGF2ZSBiZWVuIHJlcXVlc3RlZC4KKyAgICAgKiBAcGFyYW0gcXVlcnkgcGFyYW1ldGVycyBzcGVjaWZ5aW5nIGZpbHRlcnMgZm9yIHRoaXMgcXVlcnkKKyAgICAgKiBAcmV0dXJuIGEgQ3Vyc29yIG92ZXIgdGhlIHJlc3VsdCBzZXQgb2YgZG93bmxvYWRzLCB3aXRoIGNvbHVtbnMgY29uc2lzdGluZyBvZiBhbGwgdGhlCisgICAgICogQ09MVU1OXyogY29uc3RhbnRzLgorICAgICAqLworICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgQ3Vyc29yIHVuZGVybHlpbmdDdXJzb3IgPSBxdWVyeS5ydW5RdWVyeShtUmVzb2x2ZXIsIFVOREVSTFlJTkdfQ09MVU1OUyk7CisgICAgICAgIHJldHVybiBuZXcgQ3Vyc29yVHJhbnNsYXRvcih1bmRlcmx5aW5nQ3Vyc29yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGEgZG93bmxvYWRlZCBmaWxlIGZvciByZWFkaW5nLiAgVGhlIGRvd25sb2FkIG11c3QgaGF2ZSBjb21wbGV0ZWQuCisgICAgICogQHBhcmFtIGlkIHRoZSBJRCBvZiB0aGUgZG93bmxvYWQKKyAgICAgKiBAcmV0dXJuIGEgcmVhZC1vbmx5IHtAbGluayBQYXJjZWxGaWxlRGVzY3JpcHRvcn0KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgZGVzdGluYXRpb24gZmlsZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0CisgICAgICovCisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5Eb3dubG9hZGVkRmlsZShsb25nIGlkKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1SZXNvbHZlci5vcGVuRmlsZURlc2NyaXB0b3IoZ2V0RG93bmxvYWRVcmkoaWQpLCAiciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgRG93bmxvYWRQcm92aWRlciBVUkkgZm9yIHRoZSBkb3dubG9hZCB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFVyaSBnZXREb3dubG9hZFVyaShsb25nIGlkKSB7CisgICAgICAgIFVyaSBkb3dubG9hZFVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKERvd25sb2Fkcy5DT05URU5UX1VSSSwgTG9uZy50b1N0cmluZyhpZCkpOworICAgICAgICByZXR1cm4gZG93bmxvYWRVcmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyB3cmFwcyBhIGN1cnNvciByZXR1cm5lZCBieSBEb3dubG9hZFByb3ZpZGVyIC0tIHRoZSAidW5kZXJseWluZyBjdXJzb3IiIC0tIGFuZAorICAgICAqIHByZXNlbnRzIGEgZGlmZmVyZW50IHNldCBvZiBjb2x1bW5zLCB0aG9zZSBkZWZpbmVkIGluIHRoZSBEb3dubG9hZE1hbmFnZXIuQ09MVU1OXyogY29uc3RhbnRzLgorICAgICAqIFNvbWUgY29sdW1ucyBjb3JyZXNwb25kIGRpcmVjdGx5IHRvIHVuZGVybHlpbmcgdmFsdWVzIHdoaWxlIG90aGVycyBhcmUgY29tcHV0ZWQgZnJvbQorICAgICAqIHVuZGVybHlpbmcgZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXJzb3JUcmFuc2xhdG9yIGV4dGVuZHMgQ3Vyc29yV3JhcHBlciB7CisgICAgICAgIHB1YmxpYyBDdXJzb3JUcmFuc2xhdG9yKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoQ09MVU1OUykuaW5kZXhPZihjb2x1bW5OYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4T3JUaHJvdyhTdHJpbmcgY29sdW1uTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBnZXRDb2x1bW5JbmRleChjb2x1bW5OYW1lKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpbnQgbnVtQ29sdW1ucyA9IENPTFVNTlMubGVuZ3RoOworICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgMCB8fCBjb2x1bW5JbmRleCA+PSBudW1Db2x1bW5zKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjb2x1bW4gaW5kZXggIiArIGNvbHVtbkluZGV4ICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBudW1Db2x1bW5zICsgIiBjb2x1bW5zIGV4aXN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ09MVU1OU1tjb2x1bW5JbmRleF07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgeworICAgICAgICAgICAgU3RyaW5nW10gcmV0dXJuQ29sdW1ucyA9IG5ldyBTdHJpbmdbQ09MVU1OUy5sZW5ndGhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShDT0xVTU5TLCAwLCByZXR1cm5Db2x1bW5zLCAwLCBDT0xVTU5TLmxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29sdW1uczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIENPTFVNTlMubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGdldExvbmcoY29sdW1uSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzTG9uZ0NvbHVtbihTdHJpbmcgY29sdW1uKSB7CisgICAgICAgICAgICByZXR1cm4gTE9OR19DT0xVTU5TLmNvbnRhaW5zKGNvbHVtbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIChmbG9hdCkgZ2V0RG91YmxlKGNvbHVtbkluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBnZXRMb25nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRMb25nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUxvbmcoZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpIGdldExvbmcoY29sdW1uSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0cmluZyhnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyB0cmFuc2xhdGVTdHJpbmcoU3RyaW5nIGNvbHVtbikgeworICAgICAgICAgICAgaWYgKGlzTG9uZ0NvbHVtbihjb2x1bW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcodHJhbnNsYXRlTG9uZyhjb2x1bW4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9USVRMRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VW5kZXJseWluZ1N0cmluZyhEb3dubG9hZHMuQ09MVU1OX1RJVExFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9ERVNDUklQVElPTikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VW5kZXJseWluZ1N0cmluZyhEb3dubG9hZHMuQ09MVU1OX0RFU0NSSVBUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9VUkkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFVuZGVybHlpbmdTdHJpbmcoRG93bmxvYWRzLkNPTFVNTl9VUkkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbHVtbi5lcXVhbHMoQ09MVU1OX01FRElBX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFVuZGVybHlpbmdTdHJpbmcoRG93bmxvYWRzLkNPTFVNTl9NSU1FX1RZUEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0IGNvbHVtbi5lcXVhbHMoQ09MVU1OX0xPQ0FMX1VSSSk7CisgICAgICAgICAgICByZXR1cm4gVXJpLmZyb21QYXJ0cygiZmlsZSIsIGdldFVuZGVybHlpbmdTdHJpbmcoRG93bmxvYWRzLl9EQVRBKSwgbnVsbCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgbG9uZyB0cmFuc2xhdGVMb25nKFN0cmluZyBjb2x1bW4pIHsKKyAgICAgICAgICAgIGlmICghaXNMb25nQ29sdW1uKGNvbHVtbikpIHsKKyAgICAgICAgICAgICAgICAvLyBtaW1pYyBiZWhhdmlvciBvZiB1bmRlcmx5aW5nIGN1cnNvciAtLSBtb3N0IGxpa2VseSwgdGhyb3cgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgcmV0dXJuIExvbmcudmFsdWVPZih0cmFuc2xhdGVTdHJpbmcoY29sdW1uKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9JRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VW5kZXJseWluZ0xvbmcoRG93bmxvYWRzLkltcGwuX0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9UT1RBTF9TSVpFX0JZVEVTKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRVbmRlcmx5aW5nTG9uZyhEb3dubG9hZHMuQ09MVU1OX1RPVEFMX0JZVEVTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9TVEFUVVMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cygoaW50KSBnZXRVbmRlcmx5aW5nTG9uZyhEb3dubG9hZHMuQ09MVU1OX1NUQVRVUykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbHVtbi5lcXVhbHMoQ09MVU1OX0VSUk9SX0NPREUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgoaW50KSBnZXRVbmRlcmx5aW5nTG9uZyhEb3dubG9hZHMuQ09MVU1OX1NUQVRVUykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbHVtbi5lcXVhbHMoQ09MVU1OX0JZVEVTX0RPV05MT0FERURfU09fRkFSKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRVbmRlcmx5aW5nTG9uZyhEb3dubG9hZHMuQ09MVU1OX0NVUlJFTlRfQllURVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0IGNvbHVtbi5lcXVhbHMoQ09MVU1OX1JFUVVFU1RFRF9USU1FU1RBTVApOworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IC8vIFRPRE8KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgbG9uZyB0cmFuc2xhdGVFcnJvckNvZGUoaW50IHN0YXR1cykgeworICAgICAgICAgICAgaWYgKHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpICE9IFNUQVRVU19GQUlMRUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLy8gYXJiaXRyYXJ5IHZhbHVlIHdoZW4gc3RhdHVzIGlzIG5vdCBhbiBlcnJvcgorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCg0MDAgPD0gc3RhdHVzICYmIHN0YXR1cyA8IDQ5MCkgfHwgKDUwMCA8PSBzdGF0dXMgJiYgc3RhdHVzIDwgNjAwKSkgeworICAgICAgICAgICAgICAgIC8vIEhUVFAgc3RhdHVzIGNvZGUKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLlNUQVRVU19GSUxFX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRklMRV9FUlJPUjsKKworICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLlNUQVRVU19VTkhBTkRMRURfSFRUUF9DT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLlNUQVRVU19VTkhBTkRMRURfUkVESVJFQ1Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTkhBTkRMRURfSFRUUF9DT0RFOworCisgICAgICAgICAgICAgICAgY2FzZSBEb3dubG9hZHMuU1RBVFVTX0hUVFBfREFUQV9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0hUVFBfREFUQV9FUlJPUjsKKworICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLlNUQVRVU19UT09fTUFOWV9SRURJUkVDVFM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9UT09fTUFOWV9SRURJUkVDVFM7CisKKyAgICAgICAgICAgICAgICBjYXNlIERvd25sb2Fkcy5TVEFUVVNfSU5TVUZGSUNJRU5UX1NQQUNFX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU5TVUZGSUNJRU5UX1NQQUNFOworCisgICAgICAgICAgICAgICAgY2FzZSBEb3dubG9hZHMuU1RBVFVTX0RFVklDRV9OT1RfRk9VTkRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9ERVZJQ0VfTk9UX0ZPVU5EOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOS05PV047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGxvbmcgZ2V0VW5kZXJseWluZ0xvbmcoU3RyaW5nIGNvbHVtbikgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldExvbmcoc3VwZXIuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRVbmRlcmx5aW5nU3RyaW5nKFN0cmluZyBjb2x1bW4pIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRTdHJpbmcoc3VwZXIuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGxvbmcgdHJhbnNsYXRlU3RhdHVzKGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBEb3dubG9hZHMuU1RBVFVTX1BFTkRJTkc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfUEVORElORzsKKworICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLlNUQVRVU19SVU5OSU5HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX1JVTk5JTkc7CisKKyAgICAgICAgICAgICAgICBjYXNlIERvd25sb2Fkcy5TVEFUVVNfUEVORElOR19QQVVTRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBEb3dubG9hZHMuU1RBVFVTX1JVTk5JTkdfUEFVU0VEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX1BBVVNFRDsKKworICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLlNUQVRVU19TVUNDRVNTOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1NGVUw7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgRG93bmxvYWRzLmlzU3RhdHVzRXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YQppbmRleCAyZTE0NjY3Li5kMjNiMTYxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEKQEAgLTczMCw3ICs3MzAsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIER1bXAgImhwcm9mIiBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgd2lsbCBjYXVzZSBhIEdDLgorICAgICAqIER1bXAgImhwcm9mIiBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFRoaXMgbWF5IGNhdXNlIGEgR0MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsZU5hbWUgRnVsbCBwYXRobmFtZSBvZiBvdXRwdXQgZmlsZSAoZS5nLiAiL3NkY2FyZC9kdW1wLmhwcm9mIikuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgVk0gd2FzIGJ1aWx0IHdpdGhvdXQKQEAgLTc0MiwxMSArNzQyLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29sbGVjdCAiaHByb2YiIGFuZCBzZW5kIGl0IHRvIERETVMuICBUaGlzIHdpbGwgY2F1c2UgYSBHQy4KKyAgICAgKiBMaWtlIGR1bXBIcHJvZkRhdGEoU3RyaW5nKSwgYnV0IHRha2VzIGFuIGFscmVhZHktb3BlbmVkCisgICAgICogRmlsZURlc2NyaXB0b3IgdG8gd2hpY2ggdGhlIHRyYWNlIGlzIHdyaXR0ZW4uICBUaGUgZmlsZSBuYW1lIGlzIGFsc28KKyAgICAgKiBzdXBwbGllZCBzaW1wbHkgZm9yIGxvZ2dpbmcuICBNYWtlcyBhIGR1cCBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogUHJpbWFyaWx5IGZvciB1c2UgYnkgdGhlICJhbSIgc2hlbGwgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBIcHJvZkRhdGEoU3RyaW5nIGZpbGVOYW1lLCBGaWxlRGVzY3JpcHRvciBmZCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFZNRGVidWcuZHVtcEhwcm9mRGF0YShmaWxlTmFtZSwgZmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3QgImhwcm9mIiBhbmQgc2VuZCBpdCB0byBERE1TLiAgVGhpcyBtYXkgY2F1c2UgYSBHQy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIFZNIHdhcyBidWlsdCB3aXRob3V0CiAgICAgICogICAgICAgICBIUFJPRiBzdXBwb3J0LgotICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcEhwcm9mRGF0YURkbXMoKSB7CkBAIC03NTQsNiArNzY3LDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogV3JpdGVzIG5hdGl2ZSBoZWFwIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZHVtcE5hdGl2ZUhlYXAoRmlsZURlc2NyaXB0b3IgZmQpOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlbnQgdHJhbnNhY3Rpb25zIGZyb20gdGhpcyBwcm9jZXNzLgogICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBzZW50IHRyYW5zYWN0aW9ucyBvciAtMSBpZiBpdCBjb3VsZCBub3QgcmVhZCB0LgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUHJvY2Vzcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUHJvY2Vzcy5qYXZhCmluZGV4IDU2NDBhMDYuLmY2OTVkYmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL1Byb2Nlc3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9Qcm9jZXNzLmphdmEKQEAgLTYyNiw2ICs2MjYsMTUgQEAKICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uOwogCiAgICAgLyoqCisgICAgICogQ2FsbCB3aXRoICdmYWxzZScgdG8gY2F1c2UgZnV0dXJlIGNhbGxzIHRvIHtAbGluayAjc2V0VGhyZWFkUHJpb3JpdHkoaW50KX0gdG8KKyAgICAgKiB0aHJvdyBhbiBleGNlcHRpb24gaWYgcGFzc2VkIGEgYmFja2dyb3VuZC1sZXZlbCB0aHJlYWQgcHJpb3JpdHkuICBUaGlzIGlzIG9ubHkKKyAgICAgKiBlZmZlY3RpdmUgaWYgdGhlIEpOSSBsYXllciBpcyBidWlsdCB3aXRoIEdVQVJEX1RIUkVBRF9QUklPUklUWSBkZWZpbmVkIHRvIDEuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgc2V0Q2FuU2VsZkJhY2tncm91bmQoYm9vbGVhbiBiYWNrZ3JvdW5kT2spOworCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgc2NoZWR1bGluZyBncm91cCBmb3IgYSB0aHJlYWQuCiAgICAgICogQGhpZGUKICAgICAgKiBAcGFyYW0gdGlkIFRoZSBpbmRlbnRpZmllciBvZiB0aGUgdGhyZWFkL3Byb2Nlc3MgdG8gY2hhbmdlLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKaW5kZXggNzRhY2I5OC4uYTIzYTVhNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCkBAIC03OCw5ICs3OCwyNiBAQAogCiAKICAgICAvKioKKyAgICAgKiBHZW5lcmljIGNvbHVtbnMgZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBUaGUgc3BlY2lmaWMgZnVuY3Rpb25zIG9mCisgICAgICogdGhlc2UgY29sdW1ucyBhcmUgcHJpdmF0ZSB0byB0aGUgc3luYyBhZGFwdGVyLiBPdGhlciBjbGllbnRzIG9mIHRoZSBBUEkKKyAgICAgKiBzaG91bGQgbm90IGF0dGVtcHQgdG8gZWl0aGVyIHJlYWQgb3Igd3JpdGUgdGhpcyBjb2x1bW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIGludGVyZmFjZSBCYXNlU3luY0NvbHVtbnMgeworCisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMxID0gInN5bmMxIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzIgPSAic3luYzIiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMyA9ICJzeW5jMyI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM0ID0gInN5bmM0IjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDb2x1bW5zIGZvciBTeW5jIGluZm9ybWF0aW9uIHVzZWQgYnkgQ2FsZW5kYXJzIGFuZCBFdmVudHMgdGFibGVzLgogICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgU3luY0NvbHVtbnMgeworICAgIHB1YmxpYyBpbnRlcmZhY2UgU3luY0NvbHVtbnMgZXh0ZW5kcyBCYXNlU3luY0NvbHVtbnMgewogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgpAQCAtMjY5LDExICsyODYsOSBAQAogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19ESVJUWSk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX01BUkspOwogCi0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNFTEZfVVJMKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkVESVRfVVJMKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkVWRU5UU19VUkwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMyKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzMpOwogCiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLk5BTUUpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCkBAIC04NDgsOCArODYzLDcgQEAKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfRElSVFkpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX1ZFUlNJT04pOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEV2ZW50c0NvbHVtbnMuREVMRVRFRCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKLSAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5FVkVOVFNfVVJMKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzEpOwogCiAgICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkoY3YpOwogICAgICAgICAgICAgICAgIEN1cnNvciBzdWJDdXJzb3I7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEKaW5kZXggOWEzYzYxOC4uMjkzZDMxYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YQpAQCAtMjM3LDggKzIzNyw2NyBAQAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFID0gIm1pbWVfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNVFAgb2JqZWN0IGhhbmRsZSBvZiBhIG5ld2x5IHRyYW5zZmVyZWQgZmlsZS4KKyAgICAgICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBNZWRpYVNjYW5uZXIKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1UUF9PQkpFQ1RfSEFORExFID0gIm10cF9vYmplY3RfaGFuZGxlIjsKICAgICAgfQogCisKKworICAgIC8qKgorICAgICAqIE1lZGlhIHByb3ZpZGVyIGludGVyZmFjZSB1c2VkIGJ5IE1UUCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTXRwT2JqZWN0cyB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShTdHJpbmcgdm9sdW1lTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9TTEFTSCArIHZvbHVtZU5hbWUgKworICAgICAgICAgICAgICAgICAgICAiL29iamVjdCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgZ2V0Q29udGVudFVyaShTdHJpbmcgdm9sdW1lTmFtZSwKKyAgICAgICAgICAgICAgICBsb25nIG9iamVjdElkKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZQorICAgICAgICAgICAgICAgICAgICArICIvb2JqZWN0LyIgKyBvYmplY3RJZCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmllbGRzIGZvciBtYXN0ZXIgdGFibGUgZm9yIGFsbCBtZWRpYSBmaWxlcy4KKyAgICAgICAgICogVGFibGUgYWxzbyBjb250YWlucyBNZWRpYUNvbHVtbnMuX0lELCBEQVRBLCBTSVpFIGFuZCBEQVRFX01PRElGSUVELgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludGVyZmFjZSBPYmplY3RDb2x1bW5zIGV4dGVuZHMgTWVkaWFDb2x1bW5zIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIE1UUCBmb3JtYXQgY29kZSBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBJZGVudGlmaWVyIGZvciB0aGUgbWVkaWEgdGFibGUgY29udGFpbmluZyB0aGUgb2JqZWN0LgorICAgICAgICAgICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IE1lZGlhUHJvdmlkZXIKKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RBQkxFID0gIm1lZGlhX3RhYmxlIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIG9iamVjdCBpbiBpdHMgbWVkaWEgdGFibGUuCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9JRCA9ICJtZWRpYV9pZCI7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBJbWFnZXMuVGh1bWJuYWlscyBhbmQgVmlkZW8uVGh1bWJuYWlscywgaXQncyBub3QgaW50ZW5kZWQKICAgICAgKiB0byBiZSBhY2Nlc3NlZCBlbHNld2hlcmUuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9XYWxscGFwZXJTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9XYWxscGFwZXJTZXJ2aWNlLmphdmEKaW5kZXggMjQ5YWQ2Mi4uZTI2YTA5MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvV2FsbHBhcGVyU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL1dhbGxwYXBlclNlcnZpY2UuamF2YQpAQCAtMjE2LDIwICsyMTYsNyBAQAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVUb3VjaChNb3Rpb25FdmVudCBldmVudCwgUnVubmFibGUgZmluaXNoZWRDYWxsYmFjaykgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ01vdmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19UT1VDSF9FVkVOVCwgbVBlbmRpbmdNb3ZlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdNb3ZlLnJlY3ljbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdNb3ZlID0gZXZlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nTW92ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1DYWxsZXIub2J0YWluTWVzc2FnZU8oTVNHX1RPVUNIX0VWRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGVyLnNlbmRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hQb2ludGVyKGV2ZW50KTsKICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZENhbGxiYWNrLnJ1bigpOwogICAgICAgICAgICAgICAgIH0KQEAgLTIzOCwyNiArMjI1LDYgQEAKICAgICAgICAgCiAgICAgICAgIGZpbmFsIEJhc2VJV2luZG93IG1XaW5kb3cgPSBuZXcgQmFzZUlXaW5kb3coKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uRGlzcGF0Y2hQb2ludGVyKE1vdGlvbkV2ZW50IGV2ZW50LCBsb25nIGV2ZW50VGltZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjYWxsV2hlbkRvbmUpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nTW92ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVE9VQ0hfRVZFTlQsIG1QZW5kaW5nTW92ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdNb3ZlLnJlY3ljbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nTW92ZSA9IGV2ZW50OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdNb3ZlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1DYWxsZXIub2J0YWluTWVzc2FnZU8oTVNHX1RPVUNIX0VWRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxlci5zZW5kTWVzc2FnZShtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgcmVzaXplZChpbnQgdywgaW50IGgsIFJlY3QgY292ZXJlZEluc2V0cywKICAgICAgICAgICAgICAgICAgICAgUmVjdCB2aXNpYmxlSW5zZXRzLCBib29sZWFuIHJlcG9ydERyYXcsIENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CiAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtQ2FsbGVyLm9idGFpbk1lc3NhZ2VJKE1TR19XSU5ET1dfUkVTSVpFRCwKQEAgLTM2OSw3ICszMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICA/IChtV2luZG93RmxhZ3MmfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIQUJMRSkKICAgICAgICAgICAgICAgICAgICAgOiAobVdpbmRvd0ZsYWdzfFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIQUJMRSk7CiAgICAgICAgICAgICBpZiAobUNyZWF0ZWQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTdXJmYWNlKGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgdXBkYXRlU3VyZmFjZShmYWxzZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKQEAgLTQ1NCw2ICs0MjEsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZW5pZW5jZSBmb3Ige0BsaW5rIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syI3N1cmZhY2VSZWRyYXdOZWVkZWQKKyAgICAgICAgICogU3VyZmFjZUhvbGRlci5DYWxsYmFjay5zdXJmYWNlUmVkcmF3TmVlZGVkKCl9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlUmVkcmF3TmVlZGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogQ29udmVuaWVuY2UgZm9yIHtAbGluayBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrI3N1cmZhY2VDcmVhdGVkCiAgICAgICAgICAqIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2suc3VyZmFjZUNyZWF0ZWQoKX0uCiAgICAgICAgICAqLwpAQCAtNDY2LDggKzQ0MCwyNCBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFBvaW50ZXIoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nTW92ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19UT1VDSF9FVkVOVCwgbVBlbmRpbmdNb3ZlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nTW92ZS5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdNb3ZlID0gZXZlbnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdNb3ZlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtQ2FsbGVyLm9idGFpbk1lc3NhZ2VPKE1TR19UT1VDSF9FVkVOVCwgZXZlbnQpOworICAgICAgICAgICAgICAgIG1DYWxsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgIHZvaWQgdXBkYXRlU3VyZmFjZShib29sZWFuIGZvcmNlUmVsYXlvdXQsIGJvb2xlYW4gZm9yY2VSZXBvcnQpIHsKKyAgICAgICAgdm9pZCB1cGRhdGVTdXJmYWNlKGJvb2xlYW4gZm9yY2VSZWxheW91dCwgYm9vbGVhbiBmb3JjZVJlcG9ydCwgYm9vbGVhbiByZWRyYXdOZWVkZWQpIHsKICAgICAgICAgICAgIGlmIChtRGVzdHJveWVkKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgdXBkYXRlU3VyZmFjZTogZGVzdHJveWVkIik7CiAgICAgICAgICAgICB9CkBAIC00ODQsNyArNDc0LDcgQEAKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdHlwZUNoYW5nZWQgPSBtVHlwZSAhPSBtU3VyZmFjZUhvbGRlci5nZXRSZXF1ZXN0ZWRUeXBlKCk7CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZsYWdzQ2hhbmdlZCA9IG1DdXJXaW5kb3dGbGFncyAhPSBtV2luZG93RmxhZ3M7CiAgICAgICAgICAgICBpZiAoZm9yY2VSZWxheW91dCB8fCBjcmVhdGluZyB8fCBzdXJmYWNlQ3JlYXRpbmcgfHwgZm9ybWF0Q2hhbmdlZCB8fCBzaXplQ2hhbmdlZAotICAgICAgICAgICAgICAgICAgICB8fCB0eXBlQ2hhbmdlZCB8fCBmbGFnc0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgdHlwZUNoYW5nZWQgfHwgZmxhZ3NDaGFuZ2VkIHx8IHJlZHJhd05lZWRlZCkgewogCiAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJDaGFuZ2VzOiBjcmVhdGluZz0iICsgY3JlYXRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3JtYXQ9IiArIGZvcm1hdENoYW5nZWQgKyAiIHNpemU9IiArIHNpemVDaGFuZ2VkKTsKQEAgLTUyMywxMCArNTEzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Q2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3JlYXRlZCA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyUG9saWN5LkVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFF1ZXVlLnJlZ2lzdGVySW5wdXRDaGFubmVsKG1JbnB1dENoYW5uZWwsIG1JbnB1dEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wZXIubXlRdWV1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0UXVldWUucmVnaXN0ZXJJbnB1dENoYW5uZWwobUlucHV0Q2hhbm5lbCwgbUlucHV0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyLm15UXVldWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyLm1TdXJmYWNlTG9jay5sb2NrKCk7CkBAIC01NzQsNiArNTYyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZHJhd05lZWRlZCB8PSBjcmVhdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocmVsYXlvdXRSZXN1bHQmV2luZG93TWFuYWdlckltcGwuUkVMQVlPVVRfRklSU1RfVElNRSkgIT0gMDsKKwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlUmVwb3J0IHx8IGNyZWF0aW5nIHx8IHN1cmZhY2VDcmVhdGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmb3JtYXRDaGFuZ2VkIHx8IHNpemVDaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CkBAIC01OTcsMTAgKzU4OSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVkcmF3TmVlZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdXJmYWNlUmVkcmF3TmVlZGVkKG1TdXJmYWNlSG9sZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIGNhbGxiYWNrc1tdID0gbVN1cmZhY2VIb2xkZXIuZ2V0Q2FsbGJhY2tzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3VyZmFjZUhvbGRlci5DYWxsYmFjayBjIDogY2FsbGJhY2tzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiljKS5zdXJmYWNlUmVkcmF3TmVlZGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSXNDcmVhdGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VDcmVhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGluZyB8fCAocmVsYXlvdXRSZXN1bHQmV2luZG93TWFuYWdlckltcGwuUkVMQVlPVVRfRklSU1RfVElNRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZHJhd05lZWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmZpbmlzaERyYXdpbmcobVdpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYzNyw3ICs2NDMsNyBAQAogICAgICAgICAgICAgb25DcmVhdGUobVN1cmZhY2VIb2xkZXIpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBtSW5pdGlhbGl6aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICB1cGRhdGVTdXJmYWNlKGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICB1cGRhdGVTdXJmYWNlKGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICB2b2lkIGRvRGVzaXJlZFNpemVDaGFuZ2VkKGludCBkZXNpcmVkV2lkdGgsIGludCBkZXNpcmVkSGVpZ2h0KSB7CkBAIC02NjYsNyArNjcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGJlY29taW5nIHZpc2libGUsIGluIHByZXZpZXcgbW9kZSB0aGUgc3VyZmFjZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgc28gbm93IHdlIG5lZWQgdG8gbWFrZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VyZSBpdCBpcyByZS1jcmVhdGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3VyZmFjZShmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3VyZmFjZShmYWxzZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBvblZpc2liaWxpdHlDaGFuZ2VkKHZpc2libGUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTc3MCwxMCArNzc2LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJSZW1vdmluZyB3aW5kb3cgYW5kIGRlc3Ryb3lpbmcgc3VyZmFjZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlKCkgKyAiIG9mOiAiICsgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclBvbGljeS5FTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlucHV0Q2hhbm5lbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRRdWV1ZS51bnJlZ2lzdGVySW5wdXRDaGFubmVsKG1JbnB1dENoYW5uZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobUlucHV0Q2hhbm5lbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFF1ZXVlLnVucmVnaXN0ZXJJbnB1dENoYW5uZWwobUlucHV0Q2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLnJlbW92ZShtV2luZG93KTsKQEAgLTc4MiwxMyArNzg2LDExIEBACiAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIubVN1cmZhY2UucmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1DcmVhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJQb2xpY3kuRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgICAgICAgICAvLyBEaXNwb3NlIHRoZSBpbnB1dCBjaGFubmVsIGFmdGVyIHJlbW92aW5nIHRoZSB3aW5kb3cgc28gdGhlIFdpbmRvdyBNYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgaW50ZXJwcmV0IHRoZSBpbnB1dCBjaGFubmVsIGJlaW5nIGNsb3NlZCBhcyBhbiBhYm5vcm1hbCB0ZXJtaW5hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1JbnB1dENoYW5uZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Q2hhbm5lbC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERpc3Bvc2UgdGhlIGlucHV0IGNoYW5uZWwgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHdpbmRvdyBzbyB0aGUgV2luZG93IE1hbmFnZXIKKyAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IGludGVycHJldCB0aGUgaW5wdXQgY2hhbm5lbCBiZWluZyBjbG9zZWQgYXMgYW4gYWJub3JtYWwgdGVybWluYXRpb24uCisgICAgICAgICAgICAgICAgaWYgKG1JbnB1dENoYW5uZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0Q2hhbm5lbCA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04NDEsNyArODQzLDcgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFBvaW50ZXIoTW90aW9uRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIGlmIChtRW5naW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRW5naW5lLm1XaW5kb3cub25EaXNwYXRjaFBvaW50ZXIoZXZlbnQsIGV2ZW50LmdldEV2ZW50VGltZSgpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbUVuZ2luZS5kaXNwYXRjaFBvaW50ZXIoZXZlbnQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApAQCAtODc1LDcgKzg3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1NVUkZBQ0U6Ci0gICAgICAgICAgICAgICAgICAgIG1FbmdpbmUudXBkYXRlU3VyZmFjZSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1FbmdpbmUudXBkYXRlU3VyZmFjZSh0cnVlLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIE1TR19WSVNJQklMSVRZX0NIQU5HRUQ6CiAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiVmlzaWJpbGl0eSBjaGFuZ2UgaW4gIiArIG1FbmdpbmUKQEAgLTg5MSwxNCArODkzLDggQEAKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTVNHX1dJTkRPV19SRVNJWkVEOiB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVwb3J0RHJhdyA9IG1lc3NhZ2UuYXJnMSAhPSAwOwotICAgICAgICAgICAgICAgICAgICBtRW5naW5lLnVwZGF0ZVN1cmZhY2UodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtRW5naW5lLnVwZGF0ZVN1cmZhY2UodHJ1ZSwgZmFsc2UsIHJlcG9ydERyYXcpOwogICAgICAgICAgICAgICAgICAgICBtRW5naW5lLmRvT2Zmc2V0c0NoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9ydERyYXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS5tU2Vzc2lvbi5maW5pc2hEcmF3aW5nKG1FbmdpbmUubVdpbmRvdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIE1TR19UT1VDSF9FVkVOVDogewogICAgICAgICAgICAgICAgICAgICBNb3Rpb25FdmVudCBldiA9IChNb3Rpb25FdmVudCltZXNzYWdlLm9iajsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU2VsZWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NlbGVjdGlvbi5qYXZhCmluZGV4IGJiOThiY2UuLjEzY2I1ZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU2VsZWN0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TZWxlY3Rpb24uamF2YQpAQCAtNDE3LDggKzQxNyw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTVEFSVCBpbXBsZW1lbnRzIE5vQ29weVNwYW4geyB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEVORCBpbXBsZW1lbnRzIE5vQ29weVNwYW4geyB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNUQVJUIGltcGxlbWVudHMgTm9Db3B5U3BhbiB7IH0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBFTkQgaW1wbGVtZW50cyBOb0NvcHlTcGFuIHsgfQogICAgIAogICAgIC8qCiAgICAgICogUHVibGljIGNvbnN0YW50cwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQppbmRleCA1NmYxMzAyLi5mYzAxZWYyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQpAQCAtMzEzLDEyICszMTMsMTUgQEAKIAogICAgICAgICBtb3ZlR2FwVG8oZW5kKTsKIAotICAgICAgICBpZiAodGJlbmQgLSB0YnN0YXJ0ID49IG1HYXBMZW5ndGggKyAoZW5kIC0gc3RhcnQpKQotICAgICAgICAgICAgcmVzaXplRm9yKG1UZXh0Lmxlbmd0aCAtIG1HYXBMZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgIHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCkpOworICAgICAgICAvLyBDYW4gYmUgbmVnYXRpdmUKKyAgICAgICAgZmluYWwgaW50IG5iTmV3Q2hhcnMgPSAodGJlbmQgLSB0YnN0YXJ0KSAtIChlbmQgLSBzdGFydCk7CiAKLSAgICAgICAgbUdhcFN0YXJ0ICs9IHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCk7Ci0gICAgICAgIG1HYXBMZW5ndGggLT0gdGJlbmQgLSB0YnN0YXJ0IC0gKGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgaWYgKG5iTmV3Q2hhcnMgPj0gbUdhcExlbmd0aCkgeworICAgICAgICAgICAgcmVzaXplRm9yKG1UZXh0Lmxlbmd0aCArIG5iTmV3Q2hhcnMgLSBtR2FwTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1HYXBTdGFydCArPSBuYk5ld0NoYXJzOworICAgICAgICBtR2FwTGVuZ3RoIC09IG5iTmV3Q2hhcnM7CiAKICAgICAgICAgaWYgKG1HYXBMZW5ndGggPCAxKQogICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigibUdhcExlbmd0aCA8IDEiKS5wcmludFN0YWNrVHJhY2UoKTsKQEAgLTcwOCw2ICs3MTEsNyBAQAogICAgICAqIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhlIGJ1ZmZlci4gIFRoZSBraW5kIG1heSBiZSBPYmplY3QuY2xhc3MgdG8gZ2V0CiAgICAgICogYSBsaXN0IG9mIGFsbCB0aGUgc3BhbnMgcmVnYXJkbGVzcyBvZiB0eXBlLgogICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyA8VD4gVFtdIGdldFNwYW5zKGludCBxdWVyeVN0YXJ0LCBpbnQgcXVlcnlFbmQsIENsYXNzPFQ+IGtpbmQpIHsKICAgICAgICAgaW50IHNwYW5Db3VudCA9IG1TcGFuQ291bnQ7CiAgICAgICAgIE9iamVjdFtdIHNwYW5zID0gbVNwYW5zOwpAQCAtNzE4LDggKzcyMiw4IEBACiAgICAgICAgIGludCBnYXBsZW4gPSBtR2FwTGVuZ3RoOwogCiAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIE9iamVjdFtdIHJldCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCByZXQxID0gbnVsbDsKKyAgICAgICAgVFtdIHJldCA9IG51bGw7CisgICAgICAgIFQgcmV0MSA9IG51bGw7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFuQ291bnQ7IGkrKykgewogICAgICAgICAgICAgaW50IHNwYW5TdGFydCA9IHN0YXJ0c1tpXTsKQEAgLTc1MSwxMSArNzU1LDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0MSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgIHJldDEgPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBzcGFuQ291bnQgLSBpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgICAgICAgICAgICAgIHJldCA9IChUW10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIHNwYW5Db3VudCAtIGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgcmV0WzBdID0gcmV0MTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTc3MiwxMCArNzc4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJldCwgaiwgcmV0LCBqICsgMSwgY291bnQgLSBqKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0W2pdID0gc3BhbnNbaV07CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgICAgICByZXRbal0gPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0W2NvdW50KytdID0gc3BhbnNbaV07CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgICAgICByZXRbY291bnQrK10gPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03ODQsMTcgKzc5MiwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuZW1wdHlBcnJheShraW5kKTsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gMSkgewotICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKKyAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgICAgICByZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKICAgICAgICAgICAgIHJldFswXSA9IHJldDE7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgcmV0OworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gcmV0Lmxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIHJldDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBPYmplY3RbXSBucmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBjb3VudCk7CisgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgIFRbXSBucmV0ID0gKFRbXSkgQXJyYXkubmV3SW5zdGFuY2Uoa2luZCwgY291bnQpOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJldCwgMCwgbnJldCwgMCwgY291bnQpOwotICAgICAgICByZXR1cm4gKFRbXSkgbnJldDsKKyAgICAgICAgcmV0dXJuIG5yZXQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NjMsNiArODczLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIGNoYXJzIGluIHRoaXMgYnVmZmVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGludCBsZW4gPSBsZW5ndGgoKTsKICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2xlbl07CkBAIC05NTMsNiArOTY0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorLyoKICAgICBwcml2YXRlIGJvb2xlYW4gaXNwcmludChjaGFyIGMpIHsgLy8gWFhYCiAgICAgICAgIGlmIChjID49ICcgJyAmJiBjIDw9ICd+JykKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtOTYwLDcgKzk3Miw2IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0vKgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzdGFydEZsYWcoaW50IGZsYWcpIHsKICAgICAgICAgcmV0dXJuIChmbGFnID4+IDQpICYgMHgwRjsKICAgICB9CkBAIC0xMTY5LDcgKzExODAsNyBAQAogICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOwogICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRTdGFydCA+PSBtR2FwU3RhcnQpIHsKICAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwgY29udGV4dExlbiwKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCArIG1HYXBMZW5ndGgsIGN1cnNvck9wdCk7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZzZXQgKyBtR2FwTGVuZ3RoLCBjdXJzb3JPcHQpIC0gbUdhcExlbmd0aDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZXh0VXRpbHMub2J0YWluKGNvbnRleHRMZW4pOwogICAgICAgICAgICAgZ2V0Q2hhcnMoY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCmluZGV4IDMzYzk1NTQuLjBlMzUyMmUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEKQEAgLTIxLDggKzIxLDggQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKIGltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LlRhYlN0b3BzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKQEAgLTU4Myw3ICs1ODMsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG5leHQgdmFsaWQgb2Zmc2V0IHdpdGhpbiB0aGlzIGRpcmVjdGlvbmFsIHJ1biwgc2tpcHBpbmcKICAgICAgKiBjb25qdW5jdHMgYW5kIHplcm8td2lkdGggY2hhcmFjdGVycy4gIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdG8gd2FsawotICAgICAqIG9mZiB0aGUgZW5kIG9mIHRoZSBsaW5lLCBzaW5jZSB0aGUgdGhlIHJldHVybmVkIHZhbHVlcyBtaWdodCBub3QgYmUgdmFsaWQKKyAgICAgKiBvZmYgdGhlIGVuZCBvZiB0aGUgbGluZSwgc2luY2UgdGhlIHJldHVybmVkIHZhbHVlcyBtaWdodCBub3QgYmUgdmFsaWQKICAgICAgKiBvbiBuZWlnaGJvcmluZyBsaW5lcy4gIElmIHRoZSByZXR1cm5lZCBvZmZzZXQgaXMgbGVzcyB0aGFuIHplcm8gb3IKICAgICAgKiBncmVhdGVyIHRoYW4gdGhlIGxpbmUgbGVuZ3RoLCB0aGUgb2Zmc2V0IHNob3VsZCBiZSByZWNvbXB1dGVkIG9uIHRoZQogICAgICAqIHByZWNlZGluZyBvciBmb2xsb3dpbmcgbGluZSwgcmVzcGVjdGl2ZWx5LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9mb3JtYXQvVGltZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9mb3JtYXQvVGltZS5qYXZhCmluZGV4IDhlYWUxMTEuLmMwNWE4ZmUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvZm9ybWF0L1RpbWUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L2Zvcm1hdC9UaW1lLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWV9NX0RfVF9IX01fU18wMDAgPSAiJVktJW0tJWRUJUg6JU06JVMuMDAwIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWV9NX0RfVF9IX01fU18wMDBfWiA9ICIlWS0lbS0lZFQlSDolTTolUy4wMDBaIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWV9NX0QgPSAiJVktJW0tJWQiOwotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVpPTkVfVVRDID0gIlVUQyI7CiAKICAgICAvKioKQEAgLTE3MCwxMSArMTcwLDExIEBACiAgICAgcHVibGljIFRpbWUoKSB7CiAgICAgICAgIHRoaXMoVGltZVpvbmUuZ2V0RGVmYXVsdCgpLmdldElEKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEEgY29weSBjb25zdHJ1Y3Rvci4gIENvbnN0cnVjdCBhIFRpbWUgb2JqZWN0IGJ5IGNvcHlpbmcgdGhlIGdpdmVuCiAgICAgICogVGltZSBvYmplY3QuICBObyBub3JtYWxpemF0aW9uIG9jY3Vycy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBvdGhlcgogICAgICAqLwogICAgIHB1YmxpYyBUaW1lKFRpbWUgb3RoZXIpIHsKQEAgLTE4NSwxNyArMTg1LDE3IEBACiAgICAgICogRW5zdXJlcyB0aGUgdmFsdWVzIGluIGVhY2ggZmllbGQgYXJlIGluIHJhbmdlLiBGb3IgZXhhbXBsZSBpZiB0aGUKICAgICAgKiBjdXJyZW50IHZhbHVlIG9mIHRoaXMgY2FsZW5kYXIgaXMgTWFyY2ggMzIsIG5vcm1hbGl6ZSgpIHdpbGwgY29udmVydCBpdAogICAgICAqIHRvIEFwcmlsIDEuIEl0IGFsc28gZmlsbHMgaW4gd2Vla0RheSwgeWVhckRheSwgaXNEc3QgYW5kIGdtdG9mZi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIElmICJpZ25vcmVEc3QiIGlzIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgc2V0cyB0aGUgImlzRHN0IiBmaWVsZCB0byAtMQogICAgICAqICh0aGUgInVua25vd24iIHZhbHVlKSBiZWZvcmUgbm9ybWFsaXppbmcuICBJdCB0aGVuIGNvbXB1dGVzIHRoZQogICAgICAqIGNvcnJlY3QgdmFsdWUgZm9yICJpc0RzdCIuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBTZWUge0BsaW5rICN0b01pbGxpcyhib29sZWFuKX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd2hlbiB0bwogICAgICAqIHVzZSA8dHQ+dHJ1ZTwvdHQ+IG9yIDx0dD5mYWxzZTwvdHQ+IGZvciAiaWdub3JlRHN0Ii4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBVVEMgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIFVUQyBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoCiAgICAgICovCiAgICAgbmF0aXZlIHB1YmxpYyBsb25nIG5vcm1hbGl6ZShib29sZWFuIGlnbm9yZURzdCk7CiAKQEAgLTM3OSwxMyArMzc5LDEzIEBACiAgICAgICogUGFyc2VzIGEgZGF0ZS10aW1lIHN0cmluZyBpbiBlaXRoZXIgdGhlIFJGQyAyNDQ1IGZvcm1hdCBvciBhbiBhYmJyZXZpYXRlZAogICAgICAqIGZvcm1hdCB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlICJ0aW1lIiBmaWVsZC4gIEZvciBleGFtcGxlLCBhbGwgb2YgdGhlCiAgICAgICogZm9sbG93aW5nIHN0cmluZ3MgYXJlIHZhbGlkOgotICAgICAqIAorICAgICAqCiAgICAgICogPHVsPgogICAgICAqICAgPGxpPiIyMDA4MTAxM1QxNjAwMDBaIjwvbGk+CiAgICAgICogICA8bGk+IjIwMDgxMDEzVDE2MDAwMCI8L2xpPgogICAgICAqICAgPGxpPiIyMDA4MTAxMyI8L2xpPgogICAgICAqIDwvdWw+Ci0gICAgICogCisgICAgICoKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB0aW1lIGlzIGluIFVUQyAoZW5kcyB3aXRoIFopLiAgSWYgdGhlIHN0cmluZwogICAgICAqIGVuZHMgd2l0aCAiWiIgdGhlbiB0aGUgdGltZXpvbmUgaXMgc2V0IHRvIFVUQy4gIElmIHRoZSBkYXRlLXRpbWUgc3RyaW5nCiAgICAgICogaW5jbHVkZWQgb25seSBhIGRhdGUgYW5kIG5vIHRpbWUgZmllbGQsIHRoZW4gdGhlIDxjb2RlPmFsbERheTwvY29kZT4KQEAgLTM5NiwxMCArMzk2LDEwIEBACiAgICAgICogPGNvZGU+eWVhckRheTwvY29kZT4sIGFuZCA8Y29kZT5nbXRvZmY8L2NvZGU+IGFyZSBhbHdheXMgc2V0IHRvIHplcm8sCiAgICAgICogYW5kIHRoZSBmaWVsZCA8Y29kZT5pc0RzdDwvY29kZT4gaXMgc2V0IHRvIC0xICh1bmtub3duKS4gIFRvIHNldCB0aG9zZQogICAgICAqIGZpZWxkcywgY2FsbCB7QGxpbmsgI25vcm1hbGl6ZShib29sZWFuKX0gYWZ0ZXIgcGFyc2luZy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIFRvIHBhcnNlIGEgZGF0ZS10aW1lIHN0cmluZyBhbmQgY29udmVydCBpdCB0byBVVEMgbWlsbGlzZWNvbmRzLCBkbwogICAgICAqIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gICAgICogCisgICAgICoKICAgICAgKiA8cHJlPgogICAgICAqICAgVGltZSB0aW1lID0gbmV3IFRpbWUoKTsKICAgICAgKiAgIFN0cmluZyBkYXRlID0gIjIwMDgxMDEzVDE2MDAwMFoiOwpAQCAtNDI4LDI1ICs0MjgsMjUgQEAKICAgICAgKiBQYXJzZSBhIHRpbWUgaW4gUkZDIDMzMzkgZm9ybWF0LiAgVGhpcyBtZXRob2QgYWxzbyBwYXJzZXMgc2ltcGxlIGRhdGVzCiAgICAgICogKHRoYXQgaXMsIHN0cmluZ3MgdGhhdCBjb250YWluIG5vIHRpbWUgb3IgdGltZSBvZmZzZXQpLiAgRm9yIGV4YW1wbGUsCiAgICAgICogYWxsIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcmUgdmFsaWQ6Ci0gICAgICogCisgICAgICoKICAgICAgKiA8dWw+CiAgICAgICogICA8bGk+IjIwMDgtMTAtMTNUMTY6MDA6MDAuMDAwWiI8L2xpPgogICAgICAqICAgPGxpPiIyMDA4LTEwLTEzVDE2OjAwOjAwLjAwMCswNzowMCI8L2xpPgogICAgICAqICAgPGxpPiIyMDA4LTEwLTEzVDE2OjAwOjAwLjAwMC0wNzowMCI8L2xpPgogICAgICAqICAgPGxpPiIyMDA4LTEwLTEzIjwvbGk+CiAgICAgICogPC91bD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYSB0aW1lIGFuZCB0aW1lIG9mZnNldCwgdGhlbiB0aGUgdGltZSBvZmZzZXQgd2lsbAogICAgICAqIGJlIHVzZWQgdG8gY29udmVydCB0aGUgdGltZSB2YWx1ZSB0byBVVEMuCiAgICAgICogPC9wPgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogSWYgdGhlIGdpdmVuIHN0cmluZyBjb250YWlucyBqdXN0IGEgZGF0ZSAod2l0aCBubyB0aW1lIGZpZWxkKSwgdGhlbgogICAgICAqIHRoZSB7QGxpbmsgI2FsbERheX0gZmllbGQgaXMgc2V0IHRvIHRydWUgYW5kIHRoZSB7QGxpbmsgI2hvdXJ9LAogICAgICAqIHtAbGluayAjbWludXRlfSwgYW5kICB7QGxpbmsgI3NlY29uZH0gZmllbGRzIGFyZSBzZXQgdG8gemVyby4KICAgICAgKiA8L3A+Ci0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdGluZyB0aW1lIHZhbHVlIGlzIGluIFVUQyB0aW1lLgogICAgICAqIDwvcD4KQEAgLTQ2Miw3ICs0NjIsNyBAQAogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9Ci0gICAgIAorCiAgICAgIG5hdGl2ZSBwcml2YXRlIGJvb2xlYW4gbmF0aXZlUGFyc2UzMzM5KFN0cmluZyBzKTsKIAogICAgIC8qKgpAQCAtNDg0LDEzICs0ODQsMTMgQEAKICAgICAgKiA8ZW0+bm90PC9lbT4gY2hhbmdlIGFueSBvZiB0aGUgZmllbGRzIGluIHRoaXMgVGltZSBvYmplY3QuICBJZiB5b3Ugd2FudAogICAgICAqIHRvIG5vcm1hbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgVGltZSBvYmplY3QgYW5kIGFsc28gZ2V0IHRoZSBtaWxsaXNlY29uZHMKICAgICAgKiB0aGVuIHVzZSB7QGxpbmsgI25vcm1hbGl6ZShib29sZWFuKX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJZiAiaWdub3JlRHN0IiBpcyBmYWxzZSwgdGhlbiB0aGlzIG1ldGhvZCB1c2VzIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGhlCiAgICAgICogImlzRHN0IiBmaWVsZCBhbmQgd2lsbCBhZGp1c3QgdGhlIHJldHVybmVkIHRpbWUgaWYgdGhlICJpc0RzdCIgZmllbGQgaXMKICAgICAgKiB3cm9uZyBmb3IgdGhlIGdpdmVuIHRpbWUuICBTZWUgdGhlIHNhbXBsZSBjb2RlIGJlbG93IGZvciBhbiBleGFtcGxlIG9mCiAgICAgICogdGhpcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIElmICJpZ25vcmVEc3QiIGlzIHRydWUsIHRoZW4gdGhpcyBtZXRob2QgaWdub3JlcyB0aGUgY3VycmVudCBzZXR0aW5nIG9mCiAgICAgICogdGhlICJpc0RzdCIgZmllbGQgaW4gdGhpcyBUaW1lIG9iamVjdCBhbmQgd2lsbCBpbnN0ZWFkIGZpZ3VyZSBvdXQgdGhlCkBAIC00OTksMjcgKzQ5OSwyNyBAQAogICAgICAqIGNvcnJlY3QgdmFsdWUgb2YgdGhlICJpc0RzdCIgZmllbGQgaXMgd2hlbiB0aGUgdGltZSBpcyBpbmhlcmVudGx5CiAgICAgICogYW1iaWd1b3VzIGJlY2F1c2UgaXQgZmFsbHMgaW4gdGhlIGhvdXIgdGhhdCBpcyByZXBlYXRlZCB3aGVuIHN3aXRjaGluZwogICAgICAqIGZyb20gRGF5bGlnaHQtU2F2aW5nIFRpbWUgdG8gU3RhbmRhcmQgVGltZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIEhlcmUgaXMgYW4gZXhhbXBsZSB3aGVyZSA8dHQ+dG9NaWxsaXModHJ1ZSk8L3R0PiBhZGp1c3RzIHRoZSB0aW1lLAogICAgICAqIGFzc3VtaW5nIHRoYXQgRFNUIGNoYW5nZXMgYXQgMmFtIG9uIFN1bmRheSwgTm92IDQsIDIwMDcuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cHJlPgogICAgICAqIFRpbWUgdGltZSA9IG5ldyBUaW1lKCk7Ci0gICAgICogdGltZS5zZXQoMjAwNywgMTAsIDQpOyAgLy8gc2V0IHRoZSBkYXRlIHRvIE5vdiA0LCAyMDA3LCAxMmFtCisgICAgICogdGltZS5zZXQoNCwgMTAsIDIwMDcpOyAgLy8gc2V0IHRoZSBkYXRlIHRvIE5vdiA0LCAyMDA3LCAxMmFtCiAgICAgICogdGltZS5ub3JtYWxpemUoKTsgICAgICAgLy8gdGhpcyBzZXRzIGlzRHN0ID0gMQogICAgICAqIHRpbWUubW9udGhEYXkgKz0gMTsgICAgIC8vIGNoYW5nZXMgdGhlIGRhdGUgdG8gTm92IDUsIDIwMDcsIDEyYW0KICAgICAgKiBtaWxsaXMgPSB0aW1lLnRvTWlsbGlzKGZhbHNlKTsgICAvLyBtaWxsaXMgaXMgTm92IDQsIDIwMDcsIDExcG0KICAgICAgKiBtaWxsaXMgPSB0aW1lLnRvTWlsbGlzKHRydWUpOyAgICAvLyBtaWxsaXMgaXMgTm92IDUsIDIwMDcsIDEyYW0KICAgICAgKiA8L3ByZT4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgdXNlIDx0dD50b01pbGxpcyh0cnVlKTwvdHQ+CiAgICAgICogYWZ0ZXIgYWRkaW5nIG9yIHN1YnRyYWN0aW5nIGRheXMgb3IgZXhwbGljaXRseSBzZXR0aW5nIHRoZSAibW9udGhEYXkiCiAgICAgICogZmllbGQuICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91IGFyZSBhZGRpbmcKICAgICAgKiBvciBzdWJ0cmFjdGluZyBob3VycyBvciBtaW51dGVzLCB0aGVuIHlvdSBzaG91bGQgdXNlCiAgICAgICogPHR0PnRvTWlsbGlzKGZhbHNlKTwvdHQ+LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogWW91IHNob3VsZCBhbHNvIHVzZSA8dHQ+dG9NaWxsaXMoZmFsc2UpPC90dD4gaWYgeW91IHdhbnQKICAgICAgKiB0byByZWFkIGJhY2sgdGhlIHNhbWUgbWlsbGlzZWNvbmRzIHRoYXQgeW91IHNldCB3aXRoIHtAbGluayAjc2V0KGxvbmcpfQpAQCAtNTMxLDE0ICs1MzEsMTQgQEAKICAgICAgKiBTZXRzIHRoZSBmaWVsZHMgaW4gdGhpcyBUaW1lIG9iamVjdCBnaXZlbiB0aGUgVVRDIG1pbGxpc2Vjb25kcy4gIEFmdGVyCiAgICAgICogdGhpcyBtZXRob2QgcmV0dXJucywgYWxsIHRoZSBmaWVsZHMgYXJlIG5vcm1hbGl6ZWQuCiAgICAgICogVGhpcyBhbHNvIHNldHMgdGhlICJpc0RzdCIgZmllbGQgdG8gdGhlIGNvcnJlY3QgdmFsdWUuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gbWlsbGlzIHRoZSB0aW1lIGluIFVUQyBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgogICAgICAqLwogICAgIG5hdGl2ZSBwdWJsaWMgdm9pZCBzZXQobG9uZyBtaWxsaXMpOwogCiAgICAgLyoqCiAgICAgICogRm9ybWF0IGFjY29yZGluZyB0byBSRkMgMjQ0NSBEQVRFVElNRSB0eXBlLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogVGhlIHNhbWUgYXMgZm9ybWF0KCIlWSVtJWRUJUglTSVTIikuCiAgICAgICovCkBAIC01ODQsNyArNTg0LDcgQEAKICAgICAgKiBTZXRzIHRoZSBkYXRlIGZyb20gdGhlIGdpdmVuIGZpZWxkcy4gIEFsc28gc2V0cyBhbGxEYXkgdG8gdHJ1ZS4KICAgICAgKiBTZXRzIHdlZWtEYXksIHllYXJEYXkgYW5kIGdtdG9mZiB0byAwLCBhbmQgaXNEc3QgdG8gLTEuCiAgICAgICogQ2FsbCB7QGxpbmsgI25vcm1hbGl6ZShib29sZWFuKX0gaWYgeW91IG5lZWQgdGhvc2UuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gbW9udGhEYXkgdGhlIGRheSBvZiB0aGUgbW9udGggKGluIHRoZSByYW5nZSBbMSwzMV0pCiAgICAgICogQHBhcmFtIG1vbnRoIHRoZSB6ZXJvLWJhc2VkIG1vbnRoIG51bWJlciAoaW4gdGhlIHJhbmdlIFswLDExXSkKICAgICAgKiBAcGFyYW0geWVhciB0aGUgeWVhcgpAQCAtNjA2LDcgKzYwNiw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0aW1lIHJlcHJlc2VudGVkIGJ5IHRoaXMgVGltZSBvYmplY3Qgb2NjdXJzIGJlZm9yZQogICAgICAqIHRoZSBnaXZlbiB0aW1lLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHRoYXQgYSBnaXZlbiBUaW1lIG9iamVjdCB0byBjb21wYXJlIGFnYWluc3QKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0aW1lIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gdGltZQogICAgICAqLwpAQCAtNjE4LDcgKzYxOCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0aW1lIHJlcHJlc2VudGVkIGJ5IHRoaXMgVGltZSBvYmplY3Qgb2NjdXJzIGFmdGVyCiAgICAgICogdGhlIGdpdmVuIHRpbWUuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gdGhhdCBhIGdpdmVuIFRpbWUgb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHRpbWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiB0aW1lCiAgICAgICovCkBAIC02MzIsMTIgKzYzMiwxMiBAQAogICAgICAqIGNsb3Nlc3QgVGh1cnNkYXkgeWVhckRheS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzVGh1cnNkYXlPZmZzZXQgPSB7IC0zLCAzLCAyLCAxLCAwLCAtMSwgLTIgfTsKLSAgICAgICAgCisKICAgICAvKioKICAgICAgKiBDb21wdXRlcyB0aGUgd2VlayBudW1iZXIgYWNjb3JkaW5nIHRvIElTTyA4NjAxLiAgVGhlIGN1cnJlbnQgVGltZQogICAgICAqIG9iamVjdCBtdXN0IGFscmVhZHkgYmUgbm9ybWFsaXplZCBiZWNhdXNlIHRoaXMgbWV0aG9kIHVzZXMgdGhlCiAgICAgICogeWVhckRheSBhbmQgd2Vla0RheSBmaWVsZHMuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJbiBJUzAgODYwMSwgd2Vla3Mgc3RhcnQgb24gTW9uZGF5LgogICAgICAqIFRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyICh3ZWVrIDEpIGlzIGRlZmluZWQgYnkgSVNPIDg2MDEgYXMgdGhlCkBAIC02NDUsMTIgKzY0NSwxMiBAQAogICAgICAqIE9yIGVxdWl2YWxlbnRseSwgdGhlIHdlZWsgY29udGFpbmluZyBKYW51YXJ5IDQuICBPciBlcXVpdmFsZW50bHksCiAgICAgICogdGhlIHdlZWsgd2l0aCB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5IGluIGl0LgogICAgICAqIDwvcD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFRoZSB3ZWVrIG51bWJlciBjYW4gYmUgY2FsY3VsYXRlZCBieSBjb3VudGluZyBUaHVyc2RheXMuICBXZWVrIE4KICAgICAgKiBjb250YWlucyB0aGUgTnRoIFRodXJzZGF5IG9mIHRoZSB5ZWFyLgogICAgICAqIDwvcD4KLSAgICAgKiAgIAorICAgICAqCiAgICAgICogQHJldHVybiB0aGUgSVNPIHdlZWsgbnVtYmVyLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0V2Vla051bWJlcigpIHsKQEAgLTY2MSw3ICs2NjEsNyBAQAogICAgICAgICBpZiAoY2xvc2VzdFRodXJzZGF5ID49IDAgJiYgY2xvc2VzdFRodXJzZGF5IDw9IDM2NCkgewogICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3RUaHVyc2RheSAvIDcgKyAxOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFRoZSB3ZWVrIGNyb3NzZXMgYSB5ZWFyIGJvdW5kYXJ5LgogICAgICAgICBUaW1lIHRlbXAgPSBuZXcgVGltZSh0aGlzKTsKICAgICAgICAgdGVtcC5tb250aERheSArPSBzVGh1cnNkYXlPZmZzZXRbd2Vla0RheV07CkBAIC02NzAsNyArNjcwLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdHJpbmcgaW4gdGhlIFJGQyAzMzM5IGZvcm1hdC4gCisgICAgICogUmV0dXJuIGEgc3RyaW5nIGluIHRoZSBSRkMgMzMzOSBmb3JtYXQuCiAgICAgICogPHA+CiAgICAgICogSWYgYWxsRGF5IGlzIHRydWUsIGV4cHJlc3NlcyB0aGUgdGltZSBhcyBZLU0tRDwvcD4KICAgICAgKiA8cD4KQEAgLTY5MSwxMyArNjkxLDEzIEBACiAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKGludClNYXRoLmFicyhnbXRvZmYpOwogICAgICAgICAgICAgaW50IG1pbnV0ZXMgPSAob2Zmc2V0ICUgMzYwMCkgLyA2MDsKICAgICAgICAgICAgIGludCBob3VycyA9IG9mZnNldCAvIDM2MDA7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzJXMlMDJkOiUwMmQiLCBiYXNlLCBzaWduLCBob3VycywgbWludXRlcyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRheSBvZiB0aGUgZ2l2ZW4gdGltZSBpcyB0aGUgZXBvY2ggb24gdGhlIEp1bGlhbiBDYWxlbmRhciAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRheSBvZiB0aGUgZ2l2ZW4gdGltZSBpcyB0aGUgZXBvY2ggb24gdGhlIEp1bGlhbiBDYWxlbmRhcgogICAgICAqIChKYW51YXJ5IDEsIDE5NzAgb24gdGhlIEdyZWdvcmlhbiBjYWxlbmRhcikuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdGltZSB0aGUgdGltZSB0byB0ZXN0CkBAIC03MDcsNyArNzA3LDcgQEAKICAgICAgICAgbG9uZyBtaWxsaXMgPSB0aW1lLnRvTWlsbGlzKHRydWUpOwogICAgICAgICByZXR1cm4gZ2V0SnVsaWFuRGF5KG1pbGxpcywgMCkgPT0gRVBPQ0hfSlVMSUFOX0RBWTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb21wdXRlcyB0aGUgSnVsaWFuIGRheSBudW1iZXIsIGdpdmVuIHRoZSBVVEMgbWlsbGlzZWNvbmRzCiAgICAgICogYW5kIHRoZSBvZmZzZXQgKGluIHNlY29uZHMpIGZyb20gVVRDLiAgVGhlIEp1bGlhbiBkYXkgZm9yIGEgZ2l2ZW4KQEAgLTcxNiwxMCArNzE2LDEwIEBACiAgICAgICogd2hhdCB0aW1lem9uZSBpcyBiZWluZyB1c2VkLiAgVGhlIEp1bGlhbiBkYXkgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCiAgICAgICogaWYgdHdvIGV2ZW50cyBvY2N1ciBvbiB0aGUgc2FtZSBkYXkgYW5kIGZvciBkZXRlcm1pbmluZyB0aGUgcmVsYXRpdmUKICAgICAgKiB0aW1lIG9mIGFuIGV2ZW50IGZyb20gdGhlIHByZXNlbnQgKCJ5ZXN0ZXJkYXkiLCAiMyBkYXlzIGFnbyIsIGV0Yy4pLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+CiAgICAgICogVXNlIHtAbGluayAjdG9NaWxsaXMoYm9vbGVhbil9IHRvIGdldCB0aGUgbWlsbGlzZWNvbmRzLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIG1pbGxpcyB0aGUgdGltZSBpbiBVVEMgbWlsbGlzZWNvbmRzCiAgICAgICogQHBhcmFtIGdtdG9mZiB0aGUgb2Zmc2V0IGZyb20gVVRDIGluIHNlY29uZHMKICAgICAgKiBAcmV0dXJuIHRoZSBKdWxpYW4gZGF5CkBAIC03MjksNyArNzI5LDcgQEAKICAgICAgICAgbG9uZyBqdWxpYW5EYXkgPSAobWlsbGlzICsgb2Zmc2V0TWlsbGlzKSAvIERhdGVVdGlscy5EQVlfSU5fTUlMTElTOwogICAgICAgICByZXR1cm4gKGludCkganVsaWFuRGF5ICsgRVBPQ0hfSlVMSUFOX0RBWTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiA8cD5TZXRzIHRoZSB0aW1lIGZyb20gdGhlIGdpdmVuIEp1bGlhbiBkYXkgbnVtYmVyLCB3aGljaCBtdXN0IGJlIGJhc2VkIG9uCiAgICAgICogdGhlIHNhbWUgdGltZXpvbmUgdGhhdCBpcyBzZXQgaW4gdGhpcyBUaW1lIG9iamVjdC4gIFRoZSAiZ210b2ZmIiBmaWVsZApAQCAtNzM4LDcgKzczOCw3IEBACiAgICAgICogQWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucyBhbGwgdGhlIGZpZWxkcyB3aWxsIGJlIG5vcm1hbGl6ZWQgYW5kIHRoZSB0aW1lCiAgICAgICogd2lsbCBiZSBzZXQgdG8gMTJhbSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnaXZlbiBKdWxpYW4gZGF5LgogICAgICAqIDwvcD4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIFRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIGlmIDEyYW0gZG9lcyBub3QgZXhpc3QgZm9yIHRoYXQgZGF5IGJlY2F1c2UKICAgICAgKiBvZiBkYXlsaWdodCBzYXZpbmcgdGltZS4gIEZvciBleGFtcGxlLCBDYWlybywgRXF5cHQgbW92ZXMgdGltZSBhaGVhZCBvbmUKQEAgLTc0Niw3ICs3NDYsNyBAQAogICAgICAqIGFsc28gY2hhbmdlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGF0IDEyYW0uICBJbiB0aG9zZSBjYXNlcywgdGhlIHRpbWUKICAgICAgKiB3aWxsIGJlIHNldCB0byAxYW0uCiAgICAgICogPC9wPgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGp1bGlhbkRheSB0aGUgSnVsaWFuIGRheSBpbiB0aGUgdGltZXpvbmUgZm9yIHRoaXMgVGltZSBvYmplY3QKICAgICAgKiBAcmV0dXJuIHRoZSBVVEMgbWlsbGlzZWNvbmRzIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBKdWxpYW4gZGF5CiAgICAgICovCkBAIC03NTYsMTMgKzc1NiwxMyBAQAogICAgICAgICAvLyB0aGUgZGF5LgogICAgICAgICBsb25nIG1pbGxpcyA9IChqdWxpYW5EYXkgLSBFUE9DSF9KVUxJQU5fREFZKSAqIERhdGVVdGlscy5EQVlfSU5fTUlMTElTOwogICAgICAgICBzZXQobWlsbGlzKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gRmlndXJlIG91dCBob3cgY2xvc2Ugd2UgYXJlIHRvIHRoZSByZXF1ZXN0ZWQgSnVsaWFuIGRheS4KICAgICAgICAgLy8gV2UgY2FuJ3QgYmUgb2ZmIGJ5IG1vcmUgdGhhbiBhIGRheS4KICAgICAgICAgaW50IGFwcHJveGltYXRlRGF5ID0gZ2V0SnVsaWFuRGF5KG1pbGxpcywgZ210b2ZmKTsKICAgICAgICAgaW50IGRpZmYgPSBqdWxpYW5EYXkgLSBhcHByb3hpbWF0ZURheTsKICAgICAgICAgbW9udGhEYXkgKz0gZGlmZjsKLSAgICAgICAgCisKICAgICAgICAgLy8gU2V0IHRoZSB0aW1lIHRvIDEyYW0gYW5kIHJlLW5vcm1hbGl6ZS4KICAgICAgICAgaG91ciA9IDA7CiAgICAgICAgIG1pbnV0ZSA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9BcnJvd0tleU1vdmVtZW50TWV0aG9kLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9BcnJvd0tleU1vdmVtZW50TWV0aG9kLmphdmEKaW5kZXggOWFmNDJjYy4uNzlhMGMzNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvQXJyb3dLZXlNb3ZlbWVudE1ldGhvZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL0Fycm93S2V5TW92ZW1lbnRNZXRob2QuamF2YQpAQCAtMTYsMzAgKzE2LDM4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0Lm1ldGhvZDsKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLnRleHQuKjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkN1cnNvckNvbnRyb2xsZXI7CiAKIC8vIFhYWCB0aGlzIGRvZXNuJ3QgZXh0ZW5kIE1ldGFLZXlLZXlMaXN0ZW5lciBiZWNhdXNlIHRoZSBzaWduYXR1cmVzCiAvLyBkb24ndCBtYXRjaC4gIE5lZWQgdG8gZmlndXJlIHRoYXQgb3V0LiAgTWVhbndoaWxlIHRoZSBtZXRhIGtleXMKIC8vIHdvbid0IHdvcmsgaW4gZmllbGRzIHRoYXQgZG9uJ3QgdGFrZSBpbnB1dC4KIAotcHVibGljIGNsYXNzCi1BcnJvd0tleU1vdmVtZW50TWV0aG9kCi1pbXBsZW1lbnRzIE1vdmVtZW50TWV0aG9kCi17CitwdWJsaWMgY2xhc3MgQXJyb3dLZXlNb3ZlbWVudE1ldGhvZCBpbXBsZW1lbnRzIE1vdmVtZW50TWV0aG9kIHsKKyAgICAvKioKKyAgICAgKiBBbiBvcHRpb25hbCBjb250cm9sbGVyIGZvciB0aGUgY3Vyc29yLgorICAgICAqIFVzZSB7QGxpbmsgI3NldEN1cnNvckNvbnRyb2xsZXIoQ3Vyc29yQ29udHJvbGxlcil9IHRvIHNldCB0aGlzIGZpZWxkLgorICAgICAqLworICAgIHByb3RlY3RlZCBDdXJzb3JDb250cm9sbGVyIG1DdXJzb3JDb250cm9sbGVyOworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2FwKFNwYW5uYWJsZSBidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuICgoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsIEtleUV2ZW50Lk1FVEFfU0hJRlRfT04pID09IDEpIHx8CisgICAgICAgICAgICAgICAgKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLCBNZXRhS2V5S2V5TGlzdGVuZXIuTUVUQV9TRUxFQ1RJTkcpICE9IDApKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBbHQoU3Bhbm5hYmxlIGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsIEtleUV2ZW50Lk1FVEFfQUxUX09OKSA9PSAxOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiB1cChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgYm9vbGVhbiBjYXAgPSAoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX1NISUZUX09OKSA9PSAxKSB8fAotICAgICAgICAgICAgICAgICAgICAgIChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lci5NRVRBX1NFTEVDVElORykgIT0gMCk7Ci0gICAgICAgIGJvb2xlYW4gYWx0ID0gTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX0FMVF9PTikgPT0gMTsKKyAgICAgICAgYm9vbGVhbiBjYXAgPSBpc0NhcChidWZmZXIpOworICAgICAgICBib29sZWFuIGFsdCA9IGlzQWx0KGJ1ZmZlcik7CiAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7CiAKICAgICAgICAgaWYgKGNhcCkgewpAQCAtNjAsMTIgKzY4LDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gZG93bihUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgYm9vbGVhbiBjYXAgPSAoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX1NISUZUX09OKSA9PSAxKSB8fAotICAgICAgICAgICAgICAgICAgICAgIChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lci5NRVRBX1NFTEVDVElORykgIT0gMCk7Ci0gICAgICAgIGJvb2xlYW4gYWx0ID0gTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX0FMVF9PTikgPT0gMTsKKyAgICAgICAgYm9vbGVhbiBjYXAgPSBpc0NhcChidWZmZXIpOworICAgICAgICBib29sZWFuIGFsdCA9IGlzQWx0KGJ1ZmZlcik7CiAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7CiAKICAgICAgICAgaWYgKGNhcCkgewpAQCAtODYsMTIgKzkwLDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gbGVmdChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgYm9vbGVhbiBjYXAgPSAoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX1NISUZUX09OKSA9PSAxKSB8fAotICAgICAgICAgICAgICAgICAgICAgIChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lci5NRVRBX1NFTEVDVElORykgIT0gMCk7Ci0gICAgICAgIGJvb2xlYW4gYWx0ID0gTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX0FMVF9PTikgPT0gMTsKKyAgICAgICAgYm9vbGVhbiBjYXAgPSBpc0NhcChidWZmZXIpOworICAgICAgICBib29sZWFuIGFsdCA9IGlzQWx0KGJ1ZmZlcik7CiAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7CiAKICAgICAgICAgaWYgKGNhcCkgewpAQCAtMTEwLDEyICsxMTAsOCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiByaWdodChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgYm9vbGVhbiBjYXAgPSAoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX1NISUZUX09OKSA9PSAxKSB8fAotICAgICAgICAgICAgICAgICAgICAgIChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lci5NRVRBX1NFTEVDVElORykgIT0gMCk7Ci0gICAgICAgIGJvb2xlYW4gYWx0ID0gTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX0FMVF9PTikgPT0gMTsKKyAgICAgICAgYm9vbGVhbiBjYXAgPSBpc0NhcChidWZmZXIpOworICAgICAgICBib29sZWFuIGFsdCA9IGlzQWx0KGJ1ZmZlcik7CiAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7CiAKICAgICAgICAgaWYgKGNhcCkgewpAQCAtMTMzLDM1ICsxMjksNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0KGludCB4LCBpbnQgeSwgVGV4dFZpZXcgd2lkZ2V0KXsKLSAgICAgIC8vIENvbnZlcnRzIHRoZSBhYnNvbHV0ZSBYLFkgY29vcmRpbmF0ZXMgdG8gdGhlIGNoYXJhY3RlciBvZmZzZXQgZm9yIHRoZQotICAgICAgLy8gY2hhcmFjdGVyIHdob3NlIHBvc2l0aW9uIGlzIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZAotICAgICAgLy8gaG9yaXpvbnRhbCBwb3NpdGlvbi4KLSAgICAgIHggLT0gd2lkZ2V0LmdldFRvdGFsUGFkZGluZ0xlZnQoKTsKLSAgICAgIHkgLT0gd2lkZ2V0LmdldFRvdGFsUGFkZGluZ1RvcCgpOwotCi0gICAgICAvLyBDbGFtcCB0aGUgcG9zaXRpb24gdG8gaW5zaWRlIG9mIHRoZSB2aWV3LgotICAgICAgaWYgKHggPCAwKSB7Ci0gICAgICAgICAgeCA9IDA7Ci0gICAgICB9IGVsc2UgaWYgKHggPj0gKHdpZGdldC5nZXRXaWR0aCgpLXdpZGdldC5nZXRUb3RhbFBhZGRpbmdSaWdodCgpKSkgewotICAgICAgICAgIHggPSB3aWRnZXQuZ2V0V2lkdGgoKS13aWRnZXQuZ2V0VG90YWxQYWRkaW5nUmlnaHQoKSAtIDE7Ci0gICAgICB9Ci0gICAgICBpZiAoeSA8IDApIHsKLSAgICAgICAgICB5ID0gMDsKLSAgICAgIH0gZWxzZSBpZiAoeSA+PSAod2lkZ2V0LmdldEhlaWdodCgpLXdpZGdldC5nZXRUb3RhbFBhZGRpbmdCb3R0b20oKSkpIHsKLSAgICAgICAgICB5ID0gd2lkZ2V0LmdldEhlaWdodCgpLXdpZGdldC5nZXRUb3RhbFBhZGRpbmdCb3R0b20oKSAtIDE7Ci0gICAgICB9Ci0KLSAgICAgIHggKz0gd2lkZ2V0LmdldFNjcm9sbFgoKTsKLSAgICAgIHkgKz0gd2lkZ2V0LmdldFNjcm9sbFkoKTsKLQotICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgIGludCBsaW5lID0gbGF5b3V0LmdldExpbmVGb3JWZXJ0aWNhbCh5KTsKLQotICAgICAgaW50IG9mZnNldCA9IGxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIHgpOwotICAgICAgcmV0dXJuIG9mZnNldDsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLCBpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGV4ZWN1dGVEb3duKHdpZGdldCwgYnVmZmVyLCBrZXlDb2RlKSkgewogICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLmFkanVzdE1ldGFBZnRlcktleXByZXNzKGJ1ZmZlcik7CkBAIC0xOTMsMTAgKzE2MCw5IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICBpZiAoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsIE1ldGFLZXlLZXlMaXN0ZW5lci5NRVRBX1NFTEVDVElORykgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICh3aWRnZXQuc2hvd0NvbnRleHRNZW51KCkpIHsKKyAgICAgICAgICAgIGlmICgoTWV0YUtleUtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShidWZmZXIsIE1ldGFLZXlLZXlMaXN0ZW5lci5NRVRBX1NFTEVDVElORykgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAod2lkZ2V0LnNob3dDb250ZXh0TWVudSgpKSkgewogICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjE0LDggKzE4MCw3IEBACiAKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleU90aGVyKFRleHRWaWV3IHZpZXcsIFNwYW5uYWJsZSB0ZXh0LCBLZXlFdmVudCBldmVudCkgewogICAgICAgICBpbnQgY29kZSA9IGV2ZW50LmdldEtleUNvZGUoKTsKLSAgICAgICAgaWYgKGNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOCi0gICAgICAgICAgICAgICAgJiYgZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX01VTFRJUExFKSB7CisgICAgICAgIGlmIChjb2RlICE9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTiAmJiBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fTVVMVElQTEUpIHsKICAgICAgICAgICAgIGludCByZXBlYXQgPSBldmVudC5nZXRSZXBlYXRDb3VudCgpOwogICAgICAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CiAgICAgICAgICAgICB3aGlsZSAoKC0tcmVwZWF0KSA+IDApIHsKQEAgLTIyNiwxMyArMTkxLDIyIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50KFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIHRleHQsCi0gICAgICAgICAgICBNb3Rpb25FdmVudCBldmVudCkgeworICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgdGV4dCwgTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKG1DdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJzb3JDb250cm9sbGVyLmhpZGUoKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLCBNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAobUN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG9uVG91Y2hFdmVudEN1cnNvcih3aWRnZXQsIGJ1ZmZlciwgZXZlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG9uVG91Y2hFdmVudFN0YW5kYXJkKHdpZGdldCwgYnVmZmVyLCBldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gb25Ub3VjaEV2ZW50U3RhbmRhcmQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLCBNb3Rpb25FdmVudCBldmVudCkgewogICAgICAgICBpbnQgaW5pdGlhbFNjcm9sbFggPSAtMSwgaW5pdGlhbFNjcm9sbFkgPSAtMTsKICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewogICAgICAgICAgICAgaW5pdGlhbFNjcm9sbFggPSBUb3VjaC5nZXRJbml0aWFsU2Nyb2xsWCh3aWRnZXQsIGJ1ZmZlcik7CkBAIC0yNDMsNTMgKzIxNywyMCBAQAogCiAgICAgICAgIGlmICh3aWRnZXQuaXNGb2N1c2VkKCkgJiYgIXdpZGdldC5kaWRUb3VjaEZvY3VzU2VsZWN0KCkpIHsKICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewotICAgICAgICAgICAgICBib29sZWFuIGNhcCA9IChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50Lk1FVEFfU0hJRlRfT04pID09IDEpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLk1FVEFfU0VMRUNUSU5HKSAhPSAwKTsKLSAgICAgICAgICAgICAgaW50IHggPSAoaW50KSBldmVudC5nZXRYKCk7Ci0gICAgICAgICAgICAgIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOwotICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZ2V0T2Zmc2V0KHgsIHksIHdpZGdldCk7Ci0KKyAgICAgICAgICAgICAgYm9vbGVhbiBjYXAgPSBpc0NhcChidWZmZXIpOwogICAgICAgICAgICAgICBpZiAoY2FwKSB7Ci0gICAgICAgICAgICAgICAgICBidWZmZXIuc2V0U3BhbihMQVNUX1RBUF9ET1dOLCBvZmZzZXQsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX1BPSU5UX1BPSU5UKTsKKyAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSB3aWRnZXQuZ2V0T2Zmc2V0KChpbnQpIGV2ZW50LmdldFgoKSwgKGludCkgZXZlbnQuZ2V0WSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgYnVmZmVyLnNldFNwYW4oTEFTVF9UQVBfRE9XTiwgb2Zmc2V0LCBvZmZzZXQsIFNwYW5uYWJsZS5TUEFOX1BPSU5UX1BPSU5UKTsKIAogICAgICAgICAgICAgICAgICAgLy8gRGlzYWxsb3cgaW50ZXJjZXB0aW5nIG9mIHRoZSB0b3VjaCBldmVudHMsIHNvIHRoYXQKICAgICAgICAgICAgICAgICAgIC8vIHVzZXJzIGNhbiBzY3JvbGwgYW5kIHNlbGVjdCBhdCB0aGUgc2FtZSB0aW1lLgogICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCB0aGlzLCB1c2VycyB3b3VsZCBnZXQgYm9vdGVkIG91dCBvZiBzZWxlY3QKICAgICAgICAgICAgICAgICAgIC8vIG1vZGUgb25jZSB0aGUgdmlldyBkZXRlY3RlZCBpdCBuZWVkZWQgdG8gc2Nyb2xsLgogICAgICAgICAgICAgICAgICAgd2lkZ2V0LmdldFBhcmVudCgpLnJlcXVlc3REaXNhbGxvd0ludGVyY2VwdFRvdWNoRXZlbnQodHJ1ZSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBPbmVQb2ludEZpdmVUYXBTdGF0ZVtdIHRhcCA9IGJ1ZmZlci5nZXRTcGFucygwLCBidWZmZXIubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgT25lUG9pbnRGaXZlVGFwU3RhdGUuY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgICBpZiAodGFwLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RXZlbnRUaW1lKCkgLSB0YXBbMF0ubVdoZW4gPD0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0RG91YmxlVGFwVGltZW91dCgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWVXb3JkKGJ1ZmZlciwgb2Zmc2V0LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGJ1ZmZlcikpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwWzBdLmFjdGl2ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lci5zdGFydFNlbGVjdGluZyh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldC5nZXRQYXJlbnQoKS5yZXF1ZXN0RGlzYWxsb3dJbnRlcmNlcHRUb3VjaEV2ZW50KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuc2V0U3BhbihMQVNUX1RBUF9ET1dOLCBvZmZzZXQsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX1BPSU5UX1BPSU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICB0YXBbMF0ubVdoZW4gPSBldmVudC5nZXRFdmVudFRpbWUoKTsKLSAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgT25lUG9pbnRGaXZlVGFwU3RhdGUgbmV3dGFwID0gbmV3IE9uZVBvaW50Rml2ZVRhcFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgbmV3dGFwLm1XaGVuID0gZXZlbnQuZ2V0RXZlbnRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgbmV3dGFwLmFjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXRTcGFuKG5ld3RhcCwgMCwgYnVmZmVyLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9JTkNMVVNJVkVfSU5DTFVTSVZFKTsKLSAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FwID0gKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX1NISUZUX09OKSA9PSAxKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1ldGFLZXlLZXlMaXN0ZW5lci5nZXRNZXRhU3RhdGUoYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhS2V5S2V5TGlzdGVuZXIuTUVUQV9TRUxFQ1RJTkcpICE9IDApOworICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FwID0gaXNDYXAoYnVmZmVyKTsKIAogICAgICAgICAgICAgICAgIGlmIChjYXAgJiYgaGFuZGxlZCkgewogICAgICAgICAgICAgICAgICAgICAvLyBCZWZvcmUgc2VsZWN0aW5nLCBtYWtlIHN1cmUgd2UndmUgbW92ZWQgb3V0IG9mIHRoZSAic2xvcCIuCkBAIC0yOTcsNDUgKzIzOCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBPVVQgb2YgdGhlIHNsb3AKIAogICAgICAgICAgICAgICAgICAgICAvLyBUdXJuIGxvbmcgcHJlc3Mgb2ZmIHdoaWxlIHdlJ3JlIHNlbGVjdGluZy4gVXNlciBuZWVkcyB0bwotICAgICAgICAgICAgICAgICAgICAvLyByZS10YXAgb24gdGhlIHNlbGVjdGlvbiB0byBlbmFibGUgbG9uZ3ByZXNzCisgICAgICAgICAgICAgICAgICAgIC8vIHJlLXRhcCBvbiB0aGUgc2VsZWN0aW9uIHRvIGVuYWJsZSBsb25nIHByZXNzCiAgICAgICAgICAgICAgICAgICAgIHdpZGdldC5jYW5jZWxMb25nUHJlc3MoKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIGFzIHdlJ3JlIG1vdmluZyB0aGUgc2VsZWN0aW9uIGFyZWEuCiAKICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHRvdWNoIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgIGludCB4ID0gKGludCkgZXZlbnQuZ2V0WCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgeSA9IChpbnQpIGV2ZW50LmdldFkoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGdldE9mZnNldCh4LCB5LCB3aWRnZXQpOworICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gd2lkZ2V0LmdldE9mZnNldCgoaW50KSBldmVudC5nZXRYKCksIChpbnQpIGV2ZW50LmdldFkoKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgT25lUG9pbnRGaXZlVGFwU3RhdGVbXSB0YXAgPSBidWZmZXIuZ2V0U3BhbnMoMCwgYnVmZmVyLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uZVBvaW50Rml2ZVRhcFN0YXRlLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodGFwLmxlbmd0aCA+IDAgJiYgdGFwWzBdLmFjdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGRvd24gdG91Y2ggcG9zaXRpb24gKHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXIgc3RhcnRlZCB0aGUgc2VsZWN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3REb3duT2Zmc2V0ID0gYnVmZmVyLmdldFNwYW5TdGFydChMQVNUX1RBUF9ET1dOKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgc2VsZWN0aW9uIGJvdW5kYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbmVuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gbGFzdERvd25PZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHBhbmQgZnJvbSB3b3JkIHN0YXJ0IG9mIHRoZSBvcmlnaW5hbCB0YXAgdG8gbmV3IHdvcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQsIHNpbmNlIHdlIGFyZSBzZWxlY3RpbmcgImZvcndhcmRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5zdGFydCA9IGZpbmRXb3JkU3RhcnQoYnVmZmVyLCBsYXN0RG93bk9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbmVuZCA9IGZpbmRXb3JkRW5kKGJ1ZmZlciwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhwYW5kIHRvIGZyb20gbmV3IHdvcmQgc3RhcnQgdG8gd29yZCBlbmQgb2YgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFwIHNpbmNlIHdlIGFyZSBzZWxlY3RpbmcgImJhY2t3YXJkcyIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNwYW5lbmQgd2lsbCBhbHdheXMgbmVlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRvdWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgcG9zaXRpb24sIHNvIHRoYXQgcmVmaW5pbmcgdGhlIHNlbGVjdGlvbiB3aXRoIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrYmFsbCB3aWxsIHdvcmsgYXMgZXhwZWN0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbnN0YXJ0ID0gZmluZFdvcmRFbmQoYnVmZmVyLCBsYXN0RG93bk9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbmVuZCA9IGZpbmRXb3JkU3RhcnQoYnVmZmVyLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihidWZmZXIsIHNwYW5zdGFydCwgc3BhbmVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uZXh0ZW5kU2VsZWN0aW9uKGJ1ZmZlciwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uZXh0ZW5kU2VsZWN0aW9uKGJ1ZmZlciwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKQEAgLTM0NCw3MCArMjU1LDE3IEBACiAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgc2Nyb2xsIG9mZnNldCB0byBhdm9pZCB0aGUgc2Nyb2xsIGp1bXBpbmcgbGF0ZXIKICAgICAgICAgICAgICAgICAvLyB0byBzaG93IGl0LgogICAgICAgICAgICAgICAgIGlmICgoaW5pdGlhbFNjcm9sbFkgPj0gMCAmJiBpbml0aWFsU2Nyb2xsWSAhPSB3aWRnZXQuZ2V0U2Nyb2xsWSgpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGluaXRpYWxTY3JvbGxYID49IDAgJiYgaW5pdGlhbFNjcm9sbFggIT0gd2lkZ2V0LmdldFNjcm9sbFgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgKGluaXRpYWxTY3JvbGxYID49IDAgJiYgaW5pdGlhbFNjcm9sbFggIT0gd2lkZ2V0LmdldFNjcm9sbFgoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0Lm1vdmVDdXJzb3JUb1Zpc2libGVPZmZzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaW50IHggPSAoaW50KSBldmVudC5nZXRYKCk7Ci0gICAgICAgICAgICAgICAgaW50IHkgPSAoaW50KSBldmVudC5nZXRZKCk7Ci0gICAgICAgICAgICAgICAgaW50IG9mZiA9IGdldE9mZnNldCh4LCB5LCB3aWRnZXQpOwotCi0gICAgICAgICAgICAgICAgLy8gWFhYIHNob3VsZCBkbyB0aGUgc2FtZSBhZGp1c3QgZm9yIHggYXMgd2UgZG8gZm9yIHRoZSBsaW5lLgotCi0gICAgICAgICAgICAgICAgT25lUG9pbnRGaXZlVGFwU3RhdGVbXSBvbmVwb2ludGZpdmV0YXAgPSBidWZmZXIuZ2V0U3BhbnMoMCwgYnVmZmVyLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICBPbmVQb2ludEZpdmVUYXBTdGF0ZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG9uZXBvaW50Zml2ZXRhcC5sZW5ndGggPiAwICYmIG9uZXBvaW50Zml2ZXRhcFswXS5hY3RpdmUgJiYKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KGJ1ZmZlcikgPT0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3ZlIHNldCBzZWxlY3QgbW9kZSwgYmVjYXVzZSB0aGVyZSB3YXMgYSBvbmVwb2ludGZpdmV0YXAsCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGVyZSB3YXMgbm8gZW5zdWluZyBzd2lwZSBnZXN0dXJlLCB1bmRvIHRoZSBzZWxlY3QgbW9kZQotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgbGFzdCBvbmVwb2ludGZpdmV0YXAuCi0gICAgICAgICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lci5zdG9wU2VsZWN0aW5nKHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgb25lcG9pbnRmaXZldGFwLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucmVtb3ZlU3BhbihvbmVwb2ludGZpdmV0YXBbaV0pOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHdpZGdldC5nZXRPZmZzZXQoKGludCkgZXZlbnQuZ2V0WCgpLCAoaW50KSBldmVudC5nZXRZKCkpOworICAgICAgICAgICAgICAgIGlmIChpc0NhcChidWZmZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5yZW1vdmVTcGFuKExBU1RfVEFQX0RPV04pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sZWFuIGNhcCA9IChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuTUVUQV9TSElGVF9PTikgPT0gMSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLk1FVEFfU0VMRUNUSU5HKSAhPSAwKTsKLQotICAgICAgICAgICAgICAgIERvdWJsZVRhcFN0YXRlW10gdGFwID0gYnVmZmVyLmdldFNwYW5zKDAsIGJ1ZmZlci5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGVUYXBTdGF0ZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkb3VibGV0YXAgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGlmICh0YXAubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RXZlbnRUaW1lKCkgLSB0YXBbMF0ubVdoZW4gPD0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldERvdWJsZVRhcFRpbWVvdXQoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc2FtZVdvcmQoYnVmZmVyLCBvZmYsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoYnVmZmVyKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxldGFwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRhcFswXS5tV2hlbiA9IGV2ZW50LmdldEV2ZW50VGltZSgpOworICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uZXh0ZW5kU2VsZWN0aW9uKGJ1ZmZlciwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBEb3VibGVUYXBTdGF0ZSBuZXd0YXAgPSBuZXcgRG91YmxlVGFwU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3dGFwLm1XaGVuID0gZXZlbnQuZ2V0RXZlbnRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXRTcGFuKG5ld3RhcCwgMCwgYnVmZmVyLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9JTkNMVVNJVkVfSU5DTFVTSVZFKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5yZW1vdmVTcGFuKExBU1RfVEFQX0RPV04pOwotICAgICAgICAgICAgICAgICAgICBpZiAob25lcG9pbnRmaXZldGFwLmxlbmd0aCA+IDAgJiYgb25lcG9pbnRmaXZldGFwWzBdLmFjdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ugc2VsZWN0aW5nIHNvbWV0aGluZyB3aXRoIHRoZSBvbmVwb2ludGZpdmV0YXAtYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2lwZSBnZXN0dXJlLCBzdG9wIGl0IG9uIGZpbmdlciB1cC4KLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFLZXlLZXlMaXN0ZW5lci5zdG9wU2VsZWN0aW5nKHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5leHRlbmRTZWxlY3Rpb24oYnVmZmVyLCBvZmYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb3VibGV0YXApIHsKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZFdvcmRTdGFydChidWZmZXIsIG9mZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZFdvcmRFbmQoYnVmZmVyLCBvZmYpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGJ1ZmZlciwgb2ZmKTsKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihidWZmZXIsIG9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLmFkanVzdE1ldGFBZnRlcktleXByZXNzKGJ1ZmZlcik7CkBAIC00MjAsNzMgKzI3OCwzNiBAQAogICAgICAgICByZXR1cm4gaGFuZGxlZDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb3VibGVUYXBTdGF0ZSBpbXBsZW1lbnRzIE5vQ29weVNwYW4gewotICAgICAgICBsb25nIG1XaGVuOwotICAgIH0KKyAgICBwcml2YXRlIGJvb2xlYW4gb25Ub3VjaEV2ZW50Q3Vyc29yKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlciwgTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKHdpZGdldC5pc0ZvY3VzZWQoKSAmJiAhd2lkZ2V0LmRpZFRvdWNoRm9jdXNTZWxlY3QoKSkgeworICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRBY3Rpb25NYXNrZWQoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6CisgICAgICAgICAgICAgICAgICAgIHdpZGdldC5jYW5jZWxMb25nUHJlc3MoKTsKIAotICAgIC8qIFdlIGNoZWNrIGZvciBhIG9uZXBvaW50Zml2ZSB0YXAuIFRoaXMgaXMgc2ltaWxhciB0bwotICAgICogIGRvdWJsZXRhcCBnZXN0dXJlICh3aGVyZSBhIGZpbmdlciBnb2VzIGRvd24sIHVwLCBkb3duLCB1cCwgaW4gYSBzaG9ydAotICAgICogIHRpbWUgcGVyaW9kKSwgZXhjZXB0IGluIHRoZSBvbmVwb2ludGZpdmUgdGFwLCBhIHVzZXJzIGZpbmdlciBvbmx5IG5lZWRzCi0gICAgKiAgdG8gZ28gZG93biwgdXAsIGRvd24gaW4gYSBzaG9ydCB0aW1lIHBlcmlvZC4gV2UgZGV0ZWN0IHRoaXMgdHlwZSBvZiB0YXAKLSAgICAqICB0byBpbXBsZW1lbnQgdGhlIG9uZXBvaW50Zml2ZXRhcC1hbmQtc3dpcGUgc2VsZWN0aW9uIGdlc3R1cmUuCi0gICAgKiAgVGhpcyBnZXN0dXJlIGFsbG93cyB1c2VycyB0byBzZWxlY3QgYSBzZWdtZW50IG9mIHRleHQgd2l0aG91dCBnb2luZwotICAgICogIHRocm91Z2ggdGhlICJzZWxlY3QgdGV4dCIgb3B0aW9uIGluIHRoZSBjb250ZXh0IG1lbnUuCi0gICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPbmVQb2ludEZpdmVUYXBTdGF0ZSBpbXBsZW1lbnRzIE5vQ29weVNwYW4gewotICAgICAgICBsb25nIG1XaGVuOwotICAgICAgICBib29sZWFuIGFjdGl2ZTsKLSAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIE9mZnNldCB0aGUgY3VycmVudCB0b3VjaCBwb3NpdGlvbiAoZnJvbSBjb250cm9sbGVyIHRvIGN1cnNvcikKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeCA9IGV2ZW50LmdldFgoKSArIG1DdXJzb3JDb250cm9sbGVyLmdldE9mZnNldFgoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeSA9IGV2ZW50LmdldFkoKSArIG1DdXJzb3JDb250cm9sbGVyLmdldE9mZnNldFkoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHdpZGdldC5nZXRPZmZzZXQoKGludCkgeCwgKGludCkgeSk7CisgICAgICAgICAgICAgICAgICAgIG1DdXJzb3JDb250cm9sbGVyLnVwZGF0ZVBvc2l0aW9uKG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzYW1lV29yZChDaGFyU2VxdWVuY2UgdGV4dCwgaW50IG9uZSwgaW50IHR3bykgewotICAgICAgICBpbnQgc3RhcnQgPSBmaW5kV29yZFN0YXJ0KHRleHQsIG9uZSk7Ci0gICAgICAgIGludCBlbmQgPSBmaW5kV29yZEVuZCh0ZXh0LCBvbmUpOwotCi0gICAgICAgIGlmIChlbmQgPT0gc3RhcnQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGFydCA9PSBmaW5kV29yZFN0YXJ0KHRleHQsIHR3bykgJiYKLSAgICAgICAgICAgICAgIGVuZCA9PSBmaW5kV29yZEVuZCh0ZXh0LCB0d28pOwotICAgIH0KLQotICAgIC8vIFRPRE86IFVuaWZ5IHdpdGggVGV4dFZpZXcuZ2V0V29yZEZvckRpY3Rpb25hcnkoKQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kV29yZFN0YXJ0KENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQpIHsKLSAgICAgICAgZm9yICg7IHN0YXJ0ID4gMDsgc3RhcnQtLSkgewotICAgICAgICAgICAgY2hhciBjID0gdGV4dC5jaGFyQXQoc3RhcnQgLSAxKTsKLSAgICAgICAgICAgIGludCB0eXBlID0gQ2hhcmFjdGVyLmdldFR5cGUoYyk7Ci0KLSAgICAgICAgICAgIGlmIChjICE9ICdcJycgJiYKLSAgICAgICAgICAgICAgICB0eXBlICE9IENoYXJhY3Rlci5VUFBFUkNBU0VfTEVUVEVSICYmCi0gICAgICAgICAgICAgICAgdHlwZSAhPSBDaGFyYWN0ZXIuTE9XRVJDQVNFX0xFVFRFUiAmJgotICAgICAgICAgICAgICAgIHR5cGUgIT0gQ2hhcmFjdGVyLlRJVExFQ0FTRV9MRVRURVIgJiYKLSAgICAgICAgICAgICAgICB0eXBlICE9IENoYXJhY3Rlci5NT0RJRklFUl9MRVRURVIgJiYKLSAgICAgICAgICAgICAgICB0eXBlICE9IENoYXJhY3Rlci5ERUNJTUFMX0RJR0lUX05VTUJFUikgewotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKKyAgICAgICAgICAgICAgICAgICAgbUN1cnNvckNvbnRyb2xsZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGFydDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIFRPRE86IFVuaWZ5IHdpdGggVGV4dFZpZXcuZ2V0V29yZEZvckRpY3Rpb25hcnkoKQotICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kV29yZEVuZChDaGFyU2VxdWVuY2UgdGV4dCwgaW50IGVuZCkgewotICAgICAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKLQotICAgICAgICBmb3IgKDsgZW5kIDwgbGVuOyBlbmQrKykgewotICAgICAgICAgICAgY2hhciBjID0gdGV4dC5jaGFyQXQoZW5kKTsKLSAgICAgICAgICAgIGludCB0eXBlID0gQ2hhcmFjdGVyLmdldFR5cGUoYyk7Ci0KLSAgICAgICAgICAgIGlmIChjICE9ICdcJycgJiYKLSAgICAgICAgICAgICAgICB0eXBlICE9IENoYXJhY3Rlci5VUFBFUkNBU0VfTEVUVEVSICYmCi0gICAgICAgICAgICAgICAgdHlwZSAhPSBDaGFyYWN0ZXIuTE9XRVJDQVNFX0xFVFRFUiAmJgotICAgICAgICAgICAgICAgIHR5cGUgIT0gQ2hhcmFjdGVyLlRJVExFQ0FTRV9MRVRURVIgJiYKLSAgICAgICAgICAgICAgICB0eXBlICE9IENoYXJhY3Rlci5NT0RJRklFUl9MRVRURVIgJiYKLSAgICAgICAgICAgICAgICB0eXBlICE9IENoYXJhY3Rlci5ERUNJTUFMX0RJR0lUX05VTUJFUikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVuZDsKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBjdXJzb3IgY29udHJvbGxlci4KKyAgICAgKgorICAgICAqIFdoZW4gc2V0LCB0aGlzIG9iamVjdCBjYW4gYmUgdXNlZCB0byBoYW5kbGUgZXZlbnRzLCB0aGF0IGNhbiBiZSB0cmFuc2xhdGVkIGluIGN1cnNvciB1cGRhdGVzLgorICAgICAqIEBwYXJhbSBjdXJzb3JDb250cm9sbGVyIEEgY3Vyc29yIGNvbnRyb2xsZXIgaW1wbGVtZW50YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDdXJzb3JDb250cm9sbGVyKEN1cnNvckNvbnRyb2xsZXIgY3Vyc29yQ29udHJvbGxlcikgeworICAgICAgICBtQ3Vyc29yQ29udHJvbGxlciA9IGN1cnNvckNvbnRyb2xsZXI7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gY2FuU2VsZWN0QXJiaXRyYXJpbHkoKSB7CkBAIC01MjUsOCArMzQ2LDkgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIE1vdmVtZW50TWV0aG9kIGdldEluc3RhbmNlKCkgewotICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpCisgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewogICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IEFycm93S2V5TW92ZW1lbnRNZXRob2QoKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEKaW5kZXggYzMwZGIyMC4uM2I5OGZjMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhCkBAIC0xNyw5ICsxNyw5IEBACiBwYWNrYWdlIGFuZHJvaWQudGV4dC5tZXRob2Q7CiAKIGltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuQWxpZ25tZW50OwogaW1wb3J0IGFuZHJvaWQudGV4dC5Ob0NvcHlTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50KSB7CiAgICAgICAgIERyYWdTdGF0ZVtdIGRzOwogCi0gICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgc3dpdGNoIChldmVudC5nZXRBY3Rpb25NYXNrZWQoKSkgewogICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgogICAgICAgICAgICAgZHMgPSBidWZmZXIuZ2V0U3BhbnMoMCwgYnVmZmVyLmxlbmd0aCgpLCBEcmFnU3RhdGUuY2xhc3MpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5LmphdmEKaW5kZXggMWM4YjMzMC4uN2ZjNDNiOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXkuamF2YQpAQCAtOTAsNiArOTAsMTYgQEAKICAgICAgICAgZGVsZXRlKGtleSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0KGludCBpbmRleCkgeworICAgICAgICBpZiAobVZhbHVlc1tpbmRleF0gIT0gREVMRVRFRCkgeworICAgICAgICAgICAgbVZhbHVlc1tpbmRleF0gPSBERUxFVEVEOworICAgICAgICAgICAgbUdhcmJhZ2UgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIAogICAgIHByaXZhdGUgdm9pZCBnYygpIHsKICAgICAgICAgLy8gTG9nLmUoIlNwYXJzZUFycmF5IiwgImdjIHN0YXJ0IHdpdGggIiArIG1TaXplKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BYnNTYXZlZFN0YXRlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Fic1NhdmVkU3RhdGUuamF2YQppbmRleCA4NDBkN2MxLi42YWQzM2RkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Fic1NhdmVkU3RhdGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Fic1NhdmVkU3RhdGUuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBBYnNTYXZlZFN0YXRlKFBhcmNlbCBzb3VyY2UpIHsKICAgICAgICAgLy8gRklYTUUgbmVlZCBjbGFzcyBsb2FkZXIKLSAgICAgICAgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gKFBhcmNlbGFibGUpIHNvdXJjZS5yZWFkUGFyY2VsYWJsZShudWxsKTsKKyAgICAgICAgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gc291cmNlLnJlYWRQYXJjZWxhYmxlKG51bGwpOwogICAgICAgICAgCiAgICAgICAgIG1TdXBlclN0YXRlID0gc3VwZXJTdGF0ZSAhPSBudWxsID8gc3VwZXJTdGF0ZSA6IEVNUFRZX1NUQVRFOwogICAgIH0KQEAgLTc1LDcgKzc1LDcgQEAKICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPEFic1NhdmVkU3RhdGU+KCkgewogICAgICAgICAKICAgICAgICAgcHVibGljIEFic1NhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKLSAgICAgICAgICAgIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IChQYXJjZWxhYmxlKSBpbi5yZWFkUGFyY2VsYWJsZShudWxsKTsKKyAgICAgICAgICAgIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IGluLnJlYWRQYXJjZWxhYmxlKG51bGwpOwogICAgICAgICAgICAgaWYgKHN1cGVyU3RhdGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInN1cGVyU3RhdGUgbXVzdCBiZSBudWxsIik7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YQppbmRleCA1YTJlOTlkLi4wYWQzYzBiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEKQEAgLTQ1LDYgKzQ1LDEwIEBACiAgICAgCiAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1Qb2ludCA9IG5ldyBmbG9hdFsyXTsKICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbUxpbmUgPSBuZXcgZmxvYXRbNF07CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1DbGlwQm91bmRzID0gbmV3IFJlY3QoKTsKKworICAgIHByaXZhdGUgRHJhd0ZpbHRlciBtRmlsdGVyOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ29uc3RydWN0b3JzCkBAIC0xNjQsNiArMTY4LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3QgcmVjdCwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CiAKQEAgLTE3NCw2ICsxNzksNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdEYgcmVjdCwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CiAKQEAgLTMzNiwxMiArMzQyLDE0IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXREcmF3RmlsdGVyKERyYXdGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAvLyBEb24ndCBjcmFzaCwgYnV0IGlnbm9yZSB0aGUgZHJhdyBmaWx0ZXIKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IFBhaW50RHJhd0ZpbHRlcgorICAgICAgICBtRmlsdGVyID0gZmlsdGVyOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEcmF3RmlsdGVyIGdldERyYXdGaWx0ZXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gbUZpbHRlcjsKICAgICB9CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTM2MCw1MSArMzY4LDU5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BhdGNoKEJpdG1hcCBiaXRtYXAsIGJ5dGVbXSBjaHVua3MsIFJlY3RGIGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3UGF0Y2gobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgY2h1bmtzLCBkc3QubGVmdCwgZHN0LnRvcCwKKyAgICAgICAgICAgICAgICBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UGF0Y2goaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBieXRlW10gY2h1bmtzLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIFBhaW50IHBhaW50KSB7CiAgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OwotICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBsZWZ0LCB0b3AsIG5hdGl2ZVBhaW50LAotICAgICAgICAgICAgICAgIGJpdG1hcC5nZXREZW5zaXR5KCksIG1EZW5zaXR5LCBtU2NyZWVuRGVuc2l0eSk7CisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYml0bWFwLm1OYXRpdmVCaXRtYXAsIGxlZnQsIHRvcCwgbmF0aXZlUGFpbnQpOwogICAgIH0KIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdCaXRtYXAoaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGludCBwYWludCk7CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIE1hdHJpeCBtYXRyaXgsIFBhaW50IHBhaW50KSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHdpZHRoID0gYml0bWFwLmdldFdpZHRoKCk7Ci0gICAgICAgIGZpbmFsIGZsb2F0IGhlaWdodCA9IGJpdG1hcC5nZXRIZWlnaHQoKTsKICAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7Ci0gICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYml0bWFwLm1OYXRpdmVCaXRtYXAsIDAuMGYsIDAuMGYsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgMC4wZiwgMC4wZiwgd2lkdGgsIGhlaWdodCwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSwgbmF0aXZlUGFpbnQsCi0gICAgICAgICAgICAgICAgYml0bWFwLmdldERlbnNpdHkoKSwgbURlbnNpdHksIG1TY3JlZW5EZW5zaXR5KTsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSwgbmF0aXZlUGFpbnQpOwogICAgIH0KIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdCaXRtYXAoaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBpbnQgbWF0cml4LCBpbnQgcGFpbnQpOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBSZWN0IHNyYywgUmVjdCBkc3QsIFBhaW50IHBhaW50KSB7CiAgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OwogICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBzcmMubGVmdCwgc3JjLnRvcCwgc3JjLnJpZ2h0LCBzcmMuYm90dG9tLAotICAgICAgICAgICAgICAgIGRzdC5sZWZ0LCBkc3QudG9wLCBkc3QucmlnaHQsIGRzdC5ib3R0b20sIDAsIG5hdGl2ZVBhaW50LAotICAgICAgICAgICAgICAgIGJpdG1hcC5nZXREZW5zaXR5KCksIG1EZW5zaXR5LCBtU2NyZWVuRGVuc2l0eSk7CisgICAgICAgICAgICAgICAgZHN0LmxlZnQsIGRzdC50b3AsIGRzdC5yaWdodCwgZHN0LmJvdHRvbSwgbmF0aXZlUGFpbnQKKyAgICAgICAgKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIFJlY3Qgc3JjLCBSZWN0RiBkc3QsIFBhaW50IHBhaW50KSB7CiAgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OwogICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBzcmMubGVmdCwgc3JjLnRvcCwgc3JjLnJpZ2h0LCBzcmMuYm90dG9tLAotICAgICAgICAgICAgICAgIGRzdC5sZWZ0LCBkc3QudG9wLCBkc3QucmlnaHQsIGRzdC5ib3R0b20sIDAsIG5hdGl2ZVBhaW50LAotICAgICAgICAgICAgICAgIGJpdG1hcC5nZXREZW5zaXR5KCksIG1EZW5zaXR5LCBtU2NyZWVuRGVuc2l0eSk7CisgICAgICAgICAgICAgICAgZHN0LmxlZnQsIGRzdC50b3AsIGRzdC5yaWdodCwgZHN0LmJvdHRvbSwgbmF0aXZlUGFpbnQKKyAgICAgICAgKTsKICAgICB9CiAKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3Qml0bWFwKGludCByZW5kZXJlciwgaW50IGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBpbnQgcGFpbnQsCi0gICAgICAgICAgICBpbnQgYml0bWFwRGVuc2l0eSwgaW50IGNhbnZhc0RlbnNpdHksIGludCBzY3JlZW5EZW5zaXR5KTsKLQogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdCaXRtYXAoaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLAogICAgICAgICAgICAgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAotICAgICAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgbWF0cml4LCBpbnQgcGFpbnQsCi0gICAgICAgICAgICBpbnQgYml0bWFwRGVuc2l0eSwgaW50IGNhbnZhc0RlbnNpdHksIGludCBzY3JlZW5EZW5zaXR5KTsKKyAgICAgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IHBhaW50KTsKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoaW50W10gY29sb3JzLCBpbnQgb2Zmc2V0LCBpbnQgc3RyaWRlLCBmbG9hdCB4LCBmbG9hdCB5LAogICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIGhhc0FscGhhLCBQYWludCBwYWludCkgewotCi0gICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgICAgICBmaW5hbCBCaXRtYXAuQ29uZmlnIGNvbmZpZyA9IGhhc0FscGhhID8gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODggOiBCaXRtYXAuQ29uZmlnLlJHQl81NjU7CisgICAgICAgIGZpbmFsIEJpdG1hcCBiID0gQml0bWFwLmNyZWF0ZUJpdG1hcChjb2xvcnMsIG9mZnNldCwgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCBjb25maWcpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiLm1OYXRpdmVCaXRtYXAsIHgsIHksIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgYi5yZWN5Y2xlKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00MTYsNyArNDMyLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwTWVzaChCaXRtYXAgYml0bWFwLCBpbnQgbWVzaFdpZHRoLCBpbnQgbWVzaEhlaWdodCwgZmxvYXRbXSB2ZXJ0cywKICAgICAgICAgICAgIGludCB2ZXJ0T2Zmc2V0LCBpbnRbXSBjb2xvcnMsIGludCBjb2xvck9mZnNldCwgUGFpbnQgcGFpbnQpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNDYyLDcgKzQ3OCw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkcmF3UGFpbnQoUGFpbnQgcGFpbnQpIHsKLSAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgICAgIGZpbmFsIFJlY3QgciA9IG1DbGlwQm91bmRzOworICAgICAgICBuR2V0Q2xpcEJvdW5kcyhtUmVuZGVyZXIsIHIpOworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNTg3LDYgKzYwNSw2IEBACiAgICAgcHVibGljIHZvaWQgZHJhd1ZlcnRpY2VzKFZlcnRleE1vZGUgbW9kZSwgaW50IHZlcnRleENvdW50LCBmbG9hdFtdIHZlcnRzLCBpbnQgdmVydE9mZnNldCwKICAgICAgICAgICAgIGZsb2F0W10gdGV4cywgaW50IHRleE9mZnNldCwgaW50W10gY29sb3JzLCBpbnQgY29sb3JPZmZzZXQsIHNob3J0W10gaW5kaWNlcywKICAgICAgICAgICAgIGludCBpbmRleE9mZnNldCwgaW50IGluZGV4Q291bnQsIFBhaW50IHBhaW50KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhcmR3YXJlUmVuZGVyZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCmluZGV4IGExZWUzZDMuLjA5MGE3NDMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCkBAIC0xNywxMCArMTcsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29tcGF0aWJpbGl0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKQEAgLTc0LDE0ICs3Miw4IEBACiAgICAgICogCiAgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdG8gZHJhdy4KICAgICAgKiBAcGFyYW0gYXR0YWNoSW5mbyBBdHRhY2hJbmZvIHRpZWQgdG8gdGhlIHNwZWNpZmllZCB2aWV3LgotICAgICAqIEBwYXJhbSB0cmFuc2xhdG9yIFRyYW5zbGF0b3IgdXNlZCB0byBkcmF3IGFwcGxpY2F0aW9ucyBpbiBjb21wYXRpYmlsaXR5IG1vZGUuCi0gICAgICogQHBhcmFtIHlvZmYgVGhlIHZlcnRpY2FsIG9mZnNldCBmb3IgdGhlIGRyYXdpbmcuCi0gICAgICogQHBhcmFtIGRlbnNpdHkgVGhlIGRlbnNpdHkgb2YgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogQHBhcmFtIHNjYWxpbmdSZXF1aXJlZCBXaGV0aGVyIGRyYXdpbmcgc2hvdWxkIGJlIHNjYWxlZC4KICAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywKLSAgICAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvLlRyYW5zbGF0b3IgdHJhbnNsYXRvciwgaW50IHlvZmYsIGludCBkZW5zaXR5LAotICAgICAgICAgICAgYm9vbGVhbiBzY2FsaW5nUmVxdWlyZWQpOworICAgIGFic3RyYWN0IHZvaWQgZHJhdyhWaWV3IHZpZXcsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvLCBpbnQgeU9mZnNldCk7CiAKICAgICAvKioKICAgICAgKiBJbml0aWFsaXplcyB0aGUgaGFyZHdhcmUgcmVuZGVyZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3VyZmFjZSBhbmQgc2V0dXAgdGhlCkBAIC0zNzEsOSArMzYzLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywgQ29tcGF0aWJpbGl0eUluZm8uVHJhbnNsYXRvciB0cmFuc2xhdG9yLAotICAgICAgICAgICAgICAgIGludCB5b2ZmLCBpbnQgZGVuc2l0eSwgYm9vbGVhbiBzY2FsaW5nUmVxdWlyZWQpIHsKLQorICAgICAgICB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywgaW50IHlPZmZzZXQpIHsKICAgICAgICAgICAgIGlmIChjYW5EcmF3KCkpIHsKICAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1EcmF3aW5nVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSB0cnVlOwpAQCAtMzgzLDE0ICszNzMsOSBAQAogCiAgICAgICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG1DYW52YXM7CiAgICAgICAgICAgICAgICAgaW50IHNhdmVDb3VudCA9IGNhbnZhcy5zYXZlKENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15T2Zmc2V0KTsKKwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgLXlvZmYpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdG9yLnRyYW5zbGF0ZUNhbnZhcyhjYW52YXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXREZW5zaXR5KGRlbnNpdHkpOwotICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2V0U2NyZWVuRGVuc2l0eShzY2FsaW5nUmVxdWlyZWQgPyBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSA6IDApOwotICAgIAogICAgICAgICAgICAgICAgICAgICB2aWV3LmRyYXcoY2FudmFzKTsKICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKQEAgLTQxMywzMyArMzk4LDMwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgICAgICAgICBpbnRbXSBudW1fY29uZmlnID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgICAgICBpZiAoIWVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgbUNvbmZpZ1NwZWMsIG51bGwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1fY29uZmlnKSkgeworICAgICAgICAgICAgICAgIGludFtdIGluZGV4ID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBpZiAoIWVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgbUNvbmZpZ1NwZWMsIG51bGwsIDAsIGluZGV4KSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlZ2xDaG9vc2VDb25maWcgZmFpbGVkIik7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBudW1fY29uZmlnWzBdOwotCisgICAgICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBpbmRleFswXTsKICAgICAgICAgICAgICAgICBpZiAobnVtQ29uZmlncyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGNvbmZpZ3MgbWF0Y2ggY29uZmlnU3BlYyIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWdzIG1hdGNoIGNvbmZpZ1NwZWMiKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKLSAgICAgICAgICAgICAgICBpZiAoIWVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgbUNvbmZpZ1NwZWMsIGNvbmZpZ3MsIG51bUNvbmZpZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1fY29uZmlnKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlZ2xDaG9vc2VDb25maWcjMiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoIWVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgbUNvbmZpZ1NwZWMsIGNvbmZpZ3MsIG51bUNvbmZpZ3MsIGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlZ2xDaG9vc2VDb25maWcgZmFpbGVkIik7CiAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZyA9IGNob29zZUNvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOwogICAgICAgICAgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWcgY2hvc2VuIik7CiAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYWJzdHJhY3QgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncyk7CisgICAgICAgICAgICBhYnN0cmFjdCBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWdbXSBjb25maWdzKTsKIAogICAgICAgICAgICAgcHJpdmF0ZSBpbnRbXSBmaWx0ZXJDb25maWdTcGVjKGludFtdIGNvbmZpZ1NwZWMpIHsKICAgICAgICAgICAgICAgICBpZiAobUdsVmVyc2lvbiAhPSAyKSB7CkBAIC00NTAsMTAgKzQzMiwxMCBAQAogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGludCBsZW4gPSBjb25maWdTcGVjLmxlbmd0aDsKICAgICAgICAgICAgICAgICBpbnRbXSBuZXdDb25maWdTcGVjID0gbmV3IGludFtsZW4gKyAyXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbmZpZ1NwZWMsIDAsIG5ld0NvbmZpZ1NwZWMsIDAsIGxlbi0xKTsKLSAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbi0xXSA9IEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEU7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb25maWdTcGVjLCAwLCBuZXdDb25maWdTcGVjLCAwLCBsZW4gLSAxKTsKKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbiAtIDFdID0gRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRTsKICAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbl0gPSA0OyAvKiBFR0xfT1BFTkdMX0VTMl9CSVQgKi8KLSAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbisxXSA9IEVHTDEwLkVHTF9OT05FOworICAgICAgICAgICAgICAgIG5ld0NvbmZpZ1NwZWNbbGVuICsgMV0gPSBFR0wxMC5FR0xfTk9ORTsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q29uZmlnU3BlYzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDk2LDEzICs0NzgsMTIgQEAKICAgICAgICAgICAgICAgICBmb3IgKEVHTENvbmZpZyBjb25maWcgOiBjb25maWdzKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBkID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIDApOwogICAgICAgICAgICAgICAgICAgICBpbnQgcyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIDApOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGQgPj0gbURlcHRoU2l6ZSkgJiYgKHMgPj0gbVN0ZW5jaWxTaXplKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZCA+PSBtRGVwdGhTaXplICYmIHMgPj0gbVN0ZW5jaWxTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgciA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9SRURfU0laRSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0JMVUVfU0laRSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgociA9PSBtUmVkU2l6ZSkgJiYgKGcgPT0gbUdyZWVuU2l6ZSkgJiYgKGIgPT0gbUJsdWVTaXplKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSA9PSBtQWxwaGFTaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gbVJlZFNpemUgJiYgZyA9PSBtR3JlZW5TaXplICYmIGIgPT0gbUJsdWVTaXplICYmIGEgPj0gbUFscGhhU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTUxMCwxNiArNDkxLDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHByaXZhdGUgaW50IGZpbmRDb25maWdBdHRyaWIoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsIGludCBhdHRyaWJ1dGUsIGludCBkZWZhdWx0VmFsdWUpIHsKLQorICAgICAgICAgICAgcHJpdmF0ZSBpbnQgZmluZENvbmZpZ0F0dHJpYihFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSwgaW50IGRlZmF1bHRWYWx1ZSkgewogICAgICAgICAgICAgICAgIGlmIChlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCBtVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVmFsdWVbMF07CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lXaW5kb3cuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvdy5haWRsCmluZGV4IDNiMDk4MDguLjkyMTAxOGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvdy5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvdy5haWRsCkBAIC00Niw5ICs0Niw2IEBACiAKICAgICB2b2lkIHJlc2l6ZWQoaW50IHcsIGludCBoLCBpbiBSZWN0IGNvdmVyZWRJbnNldHMsIGluIFJlY3QgdmlzaWJsZUluc2V0cywKICAgICAgICAgICAgIGJvb2xlYW4gcmVwb3J0RHJhdywgaW4gQ29uZmlndXJhdGlvbiBuZXdDb25maWcpOwotICAgIHZvaWQgZGlzcGF0Y2hLZXkoaW4gS2V5RXZlbnQgZXZlbnQpOwotICAgIHZvaWQgZGlzcGF0Y2hQb2ludGVyKGluIE1vdGlvbkV2ZW50IGV2ZW50LCBsb25nIGV2ZW50VGltZSwgYm9vbGVhbiBjYWxsV2hlbkRvbmUpOwotICAgIHZvaWQgZGlzcGF0Y2hUcmFja2JhbGwoaW4gTW90aW9uRXZlbnQgZXZlbnQsIGxvbmcgZXZlbnRUaW1lLCBib29sZWFuIGNhbGxXaGVuRG9uZSk7CiAgICAgdm9pZCBkaXNwYXRjaEFwcFZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlKTsKICAgICB2b2lkIGRpc3BhdGNoR2V0TmV3U3VyZmFjZSgpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lXaW5kb3dTZXNzaW9uLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lXaW5kb3dTZXNzaW9uLmFpZGwKaW5kZXggNDY0N2ZiNC4uN2YxMGI3NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93U2Vzc2lvbi5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvd1Nlc3Npb24uYWlkbApAQCAtMTA5LDEwICsxMDksNiBAQAogICAgIHZvaWQgZ2V0RGlzcGxheUZyYW1lKElXaW5kb3cgd2luZG93LCBvdXQgUmVjdCBvdXREaXNwbGF5RnJhbWUpOwogICAgIAogICAgIHZvaWQgZmluaXNoRHJhd2luZyhJV2luZG93IHdpbmRvdyk7Ci0KLSAgICB2b2lkIGZpbmlzaEtleShJV2luZG93IHdpbmRvdyk7Ci0gICAgTW90aW9uRXZlbnQgZ2V0UGVuZGluZ1BvaW50ZXJNb3ZlKElXaW5kb3cgd2luZG93KTsKLSAgICBNb3Rpb25FdmVudCBnZXRQZW5kaW5nVHJhY2tiYWxsTW92ZShJV2luZG93IHdpbmRvdyk7CiAgICAgCiAgICAgdm9pZCBzZXRJblRvdWNoTW9kZShib29sZWFuIHNob3dGb2N1cyk7CiAgICAgYm9vbGVhbiBnZXRJblRvdWNoTW9kZSgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9LZXlFdmVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9LZXlFdmVudC5qYXZhCmluZGV4IDBiZmI2ZDYuLjljMDUwMDggMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0tleUV2ZW50LmphdmEKQEAgLTEyNCwxMSArMTI0LDI3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9QQUdFX0RPV04gICAgICAgPSA5MzsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1BJQ1RTWU1CT0xTICAgICA9IDk0OyAgIC8vIHN3aXRjaCBzeW1ib2wtc2V0cyAoRW1vamksS2FvLW1vamkpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9TV0lUQ0hfQ0hBUlNFVCAgPSA5NTsgICAvLyBzd2l0Y2ggY2hhci1zZXRzIChLYW5qaSxLYXRha2FuYSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0JVVFRPTl9BICAgICAgICA9IDk2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX0IgICAgICAgID0gOTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fQyAgICAgICAgPSA5ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0JVVFRPTl9YICAgICAgICA9IDk5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX1kgICAgICAgID0gMTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX1ogICAgICAgID0gMTAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX0wxICAgICAgID0gMTAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX1IxICAgICAgID0gMTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX0wyICAgICAgID0gMTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX1IyICAgICAgID0gMTA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX1RIVU1CTCAgID0gMTA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX1RIVU1CUiAgID0gMTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX1NUQVJUICAgID0gMTA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX1NFTEVDVCAgID0gMTA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX01PREUgICAgID0gMTEwOwogCiAgICAgLy8gTk9URTogSWYgeW91IGFkZCBhIG5ldyBrZXljb2RlIGhlcmUgeW91IG11c3QgYWxzbyBhZGQgaXQgdG86CiAgICAgLy8gIGlzU3lzdGVtKCkKICAgICAvLyAgbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9rZXljb2Rlcy5oCiAgICAgLy8gIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL3VpL0tleWNvZGVMYWJlbHMuaAorICAgIC8vICBleHRlcm5hbC93ZWJraXQvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9BTlBLZXlDb2Rlcy5oCiAgICAgLy8gIHRvb2xzL3B1cHBldF9tYXN0ZXIvUHVwcGV0TWFzdGVyL25hdl9rZXlzLnB5CiAgICAgLy8gIGZyYW1ld29ya3MvYmFzZS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAogICAgIC8vICBjb21tYW5kcy9tb25rZXkvTW9ua2V5LmphdmEKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQuamF2YQppbmRleCBhZThjMjFkLi4zNWUyMjlhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Nb3Rpb25FdmVudC5qYXZhCkBAIC03MjIsNyArNzIyLDcgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gcG9pbnRlcklkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwb2ludGVyIHRvIGJlIGZvdW5kLgogICAgICAqIEByZXR1cm4gUmV0dXJucyBlaXRoZXIgdGhlIGluZGV4IG9mIHRoZSBwb2ludGVyIChmb3IgdXNlIHdpdGgKLSAgICAgKiB7QGxpbmsgI2dldFgoaW50KSBldCBhbC4pLCBvciAtMSBpZiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSBmb3IKKyAgICAgKiB7QGxpbmsgI2dldFgoaW50KX0gZXQgYWwuKSwgb3IgLTEgaWYgdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUgZm9yCiAgICAgICogdGhhdCBwb2ludGVyIGlkZW50aWZpZXIuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBmaW5kUG9pbnRlckluZGV4KGludCBwb2ludGVySWQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvUmF3SW5wdXRFdmVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9SYXdJbnB1dEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYmZlYTguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9SYXdJbnB1dEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC52aWV3OwotCi0vKioKLSAqIEBoaWRlCi0gKiBUaGlzIHJlYWxseSBiZWxvbmdzIGluIHNlcnZpY2VzLmphcjsgV2luZG93TWFuYWdlclBvbGljeSBzaG91bGQgZ28gdGhlcmUgdG9vLgotICovCi1wdWJsaWMgY2xhc3MgUmF3SW5wdXRFdmVudCB7Ci0gICAgLy8gRXZlbnQgY2xhc3MgYXMgZGVmaW5lZCBieSBFdmVudEh1Yi4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU19LRVlCT0FSRCA9IDB4MDAwMDAwMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfQUxQSEFLRVkgPSAweDAwMDAwMDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX1RPVUNIU0NSRUVOID0gMHgwMDAwMDAwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU19UUkFDS0JBTEwgPSAweDAwMDAwMDA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX1RPVUNIU0NSRUVOX01UID0gMHgwMDAwMDAxMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU19EUEFEID0gMHgwMDAwMDAyMDsKLSAgICAKLSAgICAvLyBNb3JlIHNwZWNpYWwgY2xhc3NlcyBmb3IgUXVldWVkRXZlbnQgYmVsb3cuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfQ09ORklHVVJBVElPTl9DSEFOR0VEID0gMHgxMDAwMDAwMDsKLSAgICAKLSAgICAvLyBFdmVudCB0eXBlcy4KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWX1NZTiA9IDB4MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfS0VZID0gMHgwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVl9SRUwgPSAweDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWX0FCUyA9IDB4MDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfTVNDID0gMHgwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVl9TVyA9IDB4MDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfTEVEID0gMHgxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVl9TTkQgPSAweDEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWX1JFUCA9IDB4MTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfRkYgPSAweDE1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWX1BXUiA9IDB4MTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfRkZfU1RBVFVTID0gMHgxNzsKLQotICAgIC8vIFBsYXRmb3JtLXNwZWNpZmljIGV2ZW50IHR5cGVzLgotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWX0RFVklDRV9BRERFRCA9IDB4MTAwMDAwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZfREVWSUNFX1JFTU9WRUQgPSAweDIwMDAwMDAwOwotICAgIAotICAgIC8vIFNwZWNpYWwga2V5IChFVl9LRVkpIHNjYW4gY29kZXMgZm9yIHBvaW50ZXIgYnV0dG9ucy4KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9GSVJTVCA9IDB4MTAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX01JU0MgPSAweDEwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fMCA9IDB4MTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl8xID0gMHgxMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROXzIgPSAweDEwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fMyA9IDB4MTAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl80ID0gMHgxMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROXzUgPSAweDEwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fNiA9IDB4MTA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl83ID0gMHgxMDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROXzggPSAweDEwODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fOSA9IDB4MTA5OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX01PVVNFID0gMHgxMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX0xFRlQgPSAweDExMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fUklHSFQgPSAweDExMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fTUlERExFID0gMHgxMTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1NJREUgPSAweDExMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fRVhUUkEgPSAweDExNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fRk9SV0FSRCA9IDB4MTE1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CQUNLID0gMHgxMTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RBU0sgPSAweDExNzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9KT1lTVElDSyA9IDB4MTIwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UUklHR0VSID0gMHgxMjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RIVU1CID0gMHgxMjE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RIVU1CMiA9IDB4MTIyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UT1AgPSAweDEyMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVE9QMiA9IDB4MTI0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9QSU5LSUUgPSAweDEyNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fQkFTRSA9IDB4MTI2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CQVNFMiA9IDB4MTI3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CQVNFMyA9IDB4MTI4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CQVNFNCA9IDB4MTI5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CQVNFNSA9IDB4MTJhOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9CQVNFNiA9IDB4MTJiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9ERUFEID0gMHgxMmY7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fR0FNRVBBRCA9IDB4MTMwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9BID0gMHgxMzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX0IgPSAweDEzMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fQyA9IDB4MTMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9YID0gMHgxMzM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1kgPSAweDEzNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fWiA9IDB4MTM1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UTCA9IDB4MTM2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UUiA9IDB4MTM3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UTDIgPSAweDEzODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVFIyID0gMHgxMzk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1NFTEVDVCA9IDB4MTNhOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9TVEFSVCA9IDB4MTNiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9NT0RFID0gMHgxM2M7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RIVU1CTCA9IDB4MTNkOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9USFVNQlIgPSAweDEzZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9ESUdJID0gMHgxNDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RPT0xfUEVOID0gMHgxNDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RPT0xfUlVCQkVSID0gMHgxNDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RPT0xfQlJVU0ggPSAweDE0MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVE9PTF9QRU5DSUwgPSAweDE0MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fVE9PTF9BSVJCUlVTSCA9IDB4MTQ0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UT09MX0ZJTkdFUiA9IDB4MTQ1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UT09MX01PVVNFID0gMHgxNDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1RPT0xfTEVOUyA9IDB4MTQ3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UT1VDSCA9IDB4MTRhOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9TVFlMVVMgPSAweDE0YjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fU1RZTFVTMiA9IDB4MTRjOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UT09MX0RPVUJMRVRBUCA9IDB4MTRkOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9UT09MX1RSSVBMRVRBUCA9IDB4MTRlOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX1dIRUVMID0gMHgxNTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlROX0dFQVJfRE9XTiA9IDB4MTUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUTl9HRUFSX1VQID0gMHgxNTE7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVE5fTEFTVCA9IDB4MTVmOwotCi0gICAgLy8gUmVsYXRpdmUgYXhlcyAoRVZfUkVMKSBzY2FuIGNvZGVzLgotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMX1ggPSAweDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTF9ZID0gMHgwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxfWiA9IDB4MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMX1JYID0gMHgwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxfUlkgPSAweDA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTF9SWiA9IDB4MDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMX0hXSEVFTCA9IDB4MDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMX0RJQUwgPSAweDA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTF9XSEVFTCA9IDB4MDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMX01JU0MgPSAweDA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTF9NQVggPSAweDBmOwotCi0gICAgLy8gQWJzb2x1dGUgYXhlcyAoRVZfQUJTKSBzY2FuIGNvZGVzLgotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX1ggPSAweDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19ZID0gMHgwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfWiA9IDB4MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX1JYID0gMHgwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfUlkgPSAweDA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19SWiA9IDB4MDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX1RIUk9UVExFID0gMHgwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfUlVEREVSID0gMHgwNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfV0hFRUwgPSAweDA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19HQVMgPSAweDA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19CUkFLRSA9IDB4MGE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX0hBVDBYID0gMHgxMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfSEFUMFkgPSAweDExOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19IQVQxWCA9IDB4MTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX0hBVDFZID0gMHgxMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfSEFUMlggPSAweDE0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19IQVQyWSA9IDB4MTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX0hBVDNYID0gMHgxNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfSEFUM1kgPSAweDE3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19QUkVTU1VSRSA9IDB4MTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX0RJU1RBTkNFID0gMHgxOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfVElMVF9YID0gMHgxYTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfVElMVF9ZID0gMHgxYjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfVE9PTF9XSURUSCA9IDB4MWM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX1ZPTFVNRSA9IDB4MjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX01JU0MgPSAweDI4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19NVF9UT1VDSF9NQUpPUiA9IDB4MzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX01UX1RPVUNIX01JTk9SID0gMHgzMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfTVRfV0lEVEhfTUFKT1IgPSAweDMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19NVF9XSURUSF9NSU5PUiA9IDB4MzM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX01UX09SSUVOVEFUSU9OID0gMHgzNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfTVRfUE9TSVRJT05fWCA9IDB4MzU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTX01UX1BPU0lUSU9OX1kgPSAweDM2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19NVF9UT09MX1RZUEUgPSAweDM3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19NVF9CTE9CX0lEID0gMHgzODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNfTUFYID0gMHgzZjsKLQotICAgIC8vIFN3aXRjaCBldmVudHMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTV19MSUQgPSAweDAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOX1JFUE9SVCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOX0NPTkZJRyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOX01UX1JFUE9SVCA9IDI7Ci0gICAgCi0gICAgcHVibGljIGludCBkZXZpY2VJZDsKLSAgICBwdWJsaWMgaW50IHR5cGU7Ci0gICAgcHVibGljIGludCBzY2FuY29kZTsKLSAgICBwdWJsaWMgaW50IGtleWNvZGU7Ci0gICAgcHVibGljIGludCBmbGFnczsKLSAgICBwdWJsaWMgaW50IHZhbHVlOwotICAgIHB1YmxpYyBsb25nIHdoZW47Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1N1cmZhY2VIb2xkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU3VyZmFjZUhvbGRlci5qYXZhCmluZGV4IDM0ZTQ2MzguLjBkMzhmN2IgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU3VyZmFjZUhvbGRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU3VyZmFjZUhvbGRlci5qYXZhCkBAIC0xMTksNiArMTE5LDIzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQWRkaXRpb25hbCBjYWxsYmFja3MgdGhhdCBjYW4gYmUgcmVjZWl2ZWQgZm9yIHtAbGluayBDYWxsYmFja30uCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBDYWxsYmFjazIgZXh0ZW5kcyBDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gcmVkcmF3IHRoZSBjb250ZW50IG9mIGl0cworICAgICAgICAgKiBzdXJmYWNlLCBhZnRlciBpdCBpcyByZXNpemVkIG9yIGZvciBzb21lIG90aGVyIHJlYXNvbi4gIEJ5IG5vdAorICAgICAgICAgKiByZXR1cm5pbmcgaGVyZSB1bnRpbCB0aGUgcmVkcmF3IGlzIGNvbXBsZXRlLCB5b3UgY2FuIGVuc3VyZSB0aGF0CisgICAgICAgICAqIHRoZSB1c2VyIHdpbGwgbm90IHNlZSB5b3VyIHN1cmZhY2UgaW4gYSBiYWQgc3RhdGUgKGF0IGl0cyBuZXcKKyAgICAgICAgICogc2l6ZSBiZWZvcmUgaXQgaGFzIGJlZW4gY29ycmVjdGx5IGRyYXduIHRoYXQgd2F5KS4gIFRoaXMgd2lsbAorICAgICAgICAgKiB0eXBpY2FsbHkgYmUgcHJlY2VlZGVkIGJ5IGEgY2FsbCB0byB7QGxpbmsgI3N1cmZhY2VDaGFuZ2VkfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGhvbGRlciBUaGUgU3VyZmFjZUhvbGRlciB3aG9zZSBzdXJmYWNlIGhhcyBjaGFuZ2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc3VyZmFjZVJlZHJhd05lZWRlZChTdXJmYWNlSG9sZGVyIGhvbGRlcik7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQWRkIGEgQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciB0aGlzIGhvbGRlci4gIFRoZXJlIGNhbiBzZXZlcmFsIENhbGxiYWNrCiAgICAgICogaW50ZXJmYWNlcyBhc3NvY2lhdGVkIHRvIGEgaG9sZGVyLgogICAgICAqIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TdXJmYWNlVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TdXJmYWNlVmlldy5qYXZhCmluZGV4IGQxYTBmNzUuLmM0NjliY2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU3VyZmFjZVZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1N1cmZhY2VWaWV3LmphdmEKQEAgLTEyMyw3ICsxMjMsNyBAQAogICAgICAgICAgICAgICAgICAgICBoYW5kbGVHZXROZXdTdXJmYWNlKCk7CiAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9XSU5ET1dfTVNHOiB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgIGZpbmFsIFZpZXdUcmVlT2JzZXJ2ZXIuT25TY3JvbGxDaGFuZ2VkTGlzdGVuZXIgbVNjcm9sbENoYW5nZWRMaXN0ZW5lcgogICAgICAgICAgICAgPSBuZXcgVmlld1RyZWVPYnNlcnZlci5PblNjcm9sbENoYW5nZWRMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGxDaGFuZ2VkKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OwogICAgICAgICAgICAgCkBAIC0yMTAsNyArMjEwLDcgQEAKICAgICAgICAgc3VwZXIub25XaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmlsaXR5KTsKICAgICAgICAgbVdpbmRvd1Zpc2liaWxpdHkgPSB2aXNpYmlsaXR5ID09IFZJU0lCTEU7CiAgICAgICAgIG1SZXF1ZXN0ZWRWaXNpYmxlID0gbVdpbmRvd1Zpc2liaWxpdHkgJiYgbVZpZXdWaXNpYmlsaXR5OwotICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UpOworICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UsIGZhbHNlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIxOCw3ICsyMTgsNyBAQAogICAgICAgICBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwogICAgICAgICBtVmlld1Zpc2liaWxpdHkgPSB2aXNpYmlsaXR5ID09IFZJU0lCTEU7CiAgICAgICAgIG1SZXF1ZXN0ZWRWaXNpYmxlID0gbVdpbmRvd1Zpc2liaWxpdHkgJiYgbVZpZXdWaXNpYmlsaXR5OwotICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UpOworICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIzMiw3ICsyMzIsNyBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHNob3dTdXJmYWNlKCkgewogICAgICAgICBpZiAobVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdXBkYXRlV2luZG93KHRydWUpOworICAgICAgICAgICAgdXBkYXRlV2luZG93KHRydWUsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjY1LDcgKzI2NSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CiAgICAgICAgIGdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVPblNjcm9sbENoYW5nZWRMaXN0ZW5lcihtU2Nyb2xsQ2hhbmdlZExpc3RlbmVyKTsKICAgICAgICAgbVJlcXVlc3RlZFZpc2libGUgPSBmYWxzZTsKLSAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlKTsKKyAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlLCBmYWxzZSk7CiAgICAgICAgIG1IYXZlRnJhbWUgPSBmYWxzZTsKICAgICAgICAgaWYgKG1XaW5kb3cgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTI5MCw3ICsyOTAsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb2xkdywgaW50IG9sZGgpIHsKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvbGR3LCBvbGRoKTsKLSAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlKTsKKyAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlLCBmYWxzZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zNDMsNyArMzQzLDcgQEAKICAgICAgICAgfQogICAgICAgICAvLyByZXBvc2l0aW9uIG91cnNlbHZlcyB3aGVyZSB0aGUgc3VyZmFjZSBpcyAKICAgICAgICAgbUhhdmVGcmFtZSA9IHRydWU7Ci0gICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSk7CisgICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSwgZmFsc2UpOwogICAgICAgICBzdXBlci5kaXNwYXRjaERyYXcoY2FudmFzKTsKICAgICB9CiAKQEAgLTM5Nyw3ICszOTcsNyBAQAogICAgICAgICBtV2luZG93VHlwZSA9IHR5cGU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpbmRvdyhib29sZWFuIGZvcmNlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpbmRvdyhib29sZWFuIGZvcmNlLCBib29sZWFuIHJlZHJhd05lZWRlZCkgewogICAgICAgICBpZiAoIW1IYXZlRnJhbWUpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNDI1LDcgKzQyNSw3IEBACiAgICAgICAgIGZpbmFsIGJvb2xlYW4gdHlwZUNoYW5nZWQgPSBtVHlwZSAhPSBtUmVxdWVzdGVkVHlwZTsKICAgICAgICAgaWYgKGZvcmNlIHx8IGNyZWF0aW5nIHx8IGZvcm1hdENoYW5nZWQgfHwgc2l6ZUNoYW5nZWQgfHwgdmlzaWJsZUNoYW5nZWQKICAgICAgICAgICAgIHx8IHR5cGVDaGFuZ2VkIHx8IG1MZWZ0ICE9IG1Mb2NhdGlvblswXSB8fCBtVG9wICE9IG1Mb2NhdGlvblsxXQotICAgICAgICAgICAgfHwgbVVwZGF0ZVdpbmRvd05lZWRlZCB8fCBtUmVwb3J0RHJhd05lZWRlZCkgeworICAgICAgICAgICAgfHwgbVVwZGF0ZVdpbmRvd05lZWRlZCB8fCBtUmVwb3J0RHJhd05lZWRlZCB8fCByZWRyYXdOZWVkZWQpIHsKIAogICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgTG9nLmkoVEFHLCAiQ2hhbmdlczogY3JlYXRpbmc9IiArIGNyZWF0aW5nCiAgICAgICAgICAgICAgICAgICAgICsgIiBmb3JtYXQ9IiArIGZvcm1hdENoYW5nZWQgKyAiIHNpemU9IiArIHNpemVDaGFuZ2VkCkBAIC01MjQsNiArNTI0LDggQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWRyYXdOZWVkZWQgfD0gY3JlYXRpbmcgfCByZXBvcnREcmF3TmVlZGVkOworCiAgICAgICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRGVzdHJveVJlcG9ydE5lZWRlZCA9IHRydWU7CiAKQEAgLTU0MSw4ICs1NDMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGluZyB8fCBmb3JtYXRDaGFuZ2VkIHx8IHNpemVDaGFuZ2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHZpc2libGVDaGFuZ2VkIHx8IHJlYWxTaXplQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZHJhd05lZWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3VyZmFjZUhvbGRlci5DYWxsYmFjayBjIDogY2FsbGJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuc3VyZmFjZUNoYW5nZWQobVN1cmZhY2VIb2xkZXIsIG1Gb3JtYXQsIG15V2lkdGgsIG15SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiljKS5zdXJmYWNlUmVkcmF3TmVlZGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZUhvbGRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC01NTAsNyArNTU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgIG1Jc0NyZWF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGluZyB8fCByZXBvcnREcmF3TmVlZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWRyYXdOZWVkZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmZpbmlzaERyYXdpbmcobVdpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC01ODAsNyArNTg3LDcgQEAKIAogICAgIHZvaWQgaGFuZGxlR2V0TmV3U3VyZmFjZSgpIHsKICAgICAgICAgbU5ld1N1cmZhY2VOZWVkZWQgPSB0cnVlOwotICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UpOworICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTYyNSw0MSArNjMyLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoS2V5KEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBTdXJmYWNlVmlldyBzdXJmYWNlVmlldyA9IG1TdXJmYWNlVmlldy5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzdXJmYWNlVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9Mb2cudygiU3VyZmFjZVZpZXciLCAiVW5leHBlY3RlZCBrZXkgZXZlbnQgaW4gc3VyZmFjZTogIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZVZpZXcubVNlc3Npb24gIT0gbnVsbCAmJiBzdXJmYWNlVmlldy5tU3VyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlVmlldy5tU2Vzc2lvbi5maW5pc2hLZXkoc3VyZmFjZVZpZXcubVdpbmRvdyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQb2ludGVyKE1vdGlvbkV2ZW50IGV2ZW50LCBsb25nIGV2ZW50VGltZSwKLSAgICAgICAgICAgICAgICBib29sZWFuIGNhbGxXaGVuRG9uZSkgewotICAgICAgICAgICAgTG9nLncoIlN1cmZhY2VWaWV3IiwgIlVuZXhwZWN0ZWQgcG9pbnRlciBldmVudCBpbiBzdXJmYWNlOiAiICsgZXZlbnQpOwotICAgICAgICAgICAgLy9pZiAobVNlc3Npb24gIT0gbnVsbCAmJiBtU3VyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyAgICB0cnkgewotICAgICAgICAgICAgLy8gICAgICAgIC8vbVNlc3Npb24uZmluaXNoS2V5KG1XaW5kb3cpOwotICAgICAgICAgICAgLy8gICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoVHJhY2tiYWxsKE1vdGlvbkV2ZW50IGV2ZW50LCBsb25nIGV2ZW50VGltZSwKLSAgICAgICAgICAgICAgICBib29sZWFuIGNhbGxXaGVuRG9uZSkgewotICAgICAgICAgICAgTG9nLncoIlN1cmZhY2VWaWV3IiwgIlVuZXhwZWN0ZWQgdHJhY2tiYWxsIGV2ZW50IGluIHN1cmZhY2U6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICAvL2lmIChtU2Vzc2lvbiAhPSBudWxsICYmIG1TdXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyAgICAgICAgLy9tU2Vzc2lvbi5maW5pc2hLZXkobVdpbmRvdyk7Ci0gICAgICAgICAgICAvLyAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vICAgIH0KLSAgICAgICAgICAgIC8vfQotICAgICAgICB9Ci0KICAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hBcHBWaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSkgewogICAgICAgICAgICAgLy8gVGhlIHBvaW50IG9mIFN1cmZhY2VWaWV3IGlzIHRvIGxldCB0aGUgYXBwIGNvbnRyb2wgdGhlIHN1cmZhY2UuCiAgICAgICAgIH0KQEAgLTY4Niw3ICs2NTgsNiBAQAogICAgIHByaXZhdGUgU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlciA9IG5ldyBTdXJmYWNlSG9sZGVyKCkgewogICAgICAgICAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiU3VyZmFjZUhvbGRlciI7Ci0gICAgICAgIHByaXZhdGUgaW50IG1TYXZlQ291bnQ7CiAgICAgICAgIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NyZWF0aW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIG1Jc0NyZWF0aW5nOwpAQCAtNzMyLDcgKzcwMyw3IEBACiAKICAgICAgICAgICAgIG1SZXF1ZXN0ZWRGb3JtYXQgPSBmb3JtYXQ7CiAgICAgICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC03NDksNyArNzIwLDcgQEAKICAgICAgICAgICAgIGNhc2UgU1VSRkFDRV9UWVBFX1BVU0hfQlVGRkVSUzoKICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkVHlwZSA9IHR5cGU7CiAgICAgICAgICAgICAgICAgaWYgKG1XaW5kb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IDM0NjFjYmYuLjA1ZDM4MGUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC02ODQ4LDE2ICs2ODQ4LDE2IEBACiAKICAgICAgICAgaWYgKHZlcnRpY2FsRWRnZXMpIHsKICAgICAgICAgICAgIHRvcEZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldFRvcEZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3VG9wID0gdG9wRmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3VG9wID0gdG9wRmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgICAgIGJvdHRvbUZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldEJvdHRvbUZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3Qm90dG9tID0gYm90dG9tRmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3Qm90dG9tID0gYm90dG9tRmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChob3Jpem9udGFsRWRnZXMpIHsKICAgICAgICAgICAgIGxlZnRGYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRMZWZ0RmFkaW5nRWRnZVN0cmVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGRyYXdMZWZ0ID0gbGVmdEZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd0xlZnQgPSBsZWZ0RmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgICAgIHJpZ2h0RmFkZVN0cmVuZ3RoID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgZ2V0UmlnaHRGYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd1JpZ2h0ID0gcmlnaHRGYWRlU3RyZW5ndGggPj0gMC4wZjsKKyAgICAgICAgICAgIGRyYXdSaWdodCA9IHJpZ2h0RmFkZVN0cmVuZ3RoID4gMC4wZjsKICAgICAgICAgfQogCiAgICAgICAgIHNhdmVDb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQppbmRleCBlNjNlY2VmLi5hODllN2Y2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCkBAIC0xMzAsNyArMTMwLDcgQEAKICAgICBpbnQgbVZpZXdWaXNpYmlsaXR5OwogICAgIGJvb2xlYW4gbUFwcFZpc2libGUgPSB0cnVlOwogCi0gICAgU3VyZmFjZUhvbGRlci5DYWxsYmFjayBtU3VyZmFjZUhvbGRlckNhbGxiYWNrOworICAgIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syIG1TdXJmYWNlSG9sZGVyQ2FsbGJhY2s7CiAgICAgQmFzZVN1cmZhY2VIb2xkZXIgbVN1cmZhY2VIb2xkZXI7CiAgICAgYm9vbGVhbiBtSXNDcmVhdGluZzsKICAgICBib29sZWFuIG1EcmF3aW5nQWxsb3dlZDsKQEAgLTMzNiw2ICszMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUm9vdFZpZXdTdXJmYWNlVGFrZXIpdmlldykud2lsbFlvdVRha2VUaGVTdXJmYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZUhvbGRlckNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyID0gbmV3IFRha2VuU3VyZmFjZUhvbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIuc2V0Rm9ybWF0KFBpeGVsRm9ybWF0LlVOS05PV04pOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtVmlldy5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CkBAIC00NDAsMTggKzQ0MSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhZGQgd2luZG93IC0tIHVua25vd24gZXJyb3IgY29kZSAiICsgcmVzKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclBvbGljeS5FTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgUm9vdFZpZXdTdXJmYWNlVGFrZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dFF1ZXVlQ2FsbGJhY2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUm9vdFZpZXdTdXJmYWNlVGFrZXIpdmlldykud2lsbFlvdVRha2VUaGVJbnB1dFF1ZXVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1JbnB1dFF1ZXVlQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0UXVldWUgPSBuZXcgSW5wdXRRdWV1ZShtSW5wdXRDaGFubmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dFF1ZXVlQ2FsbGJhY2sub25JbnB1dFF1ZXVlQ3JlYXRlZChtSW5wdXRRdWV1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFF1ZXVlLnJlZ2lzdGVySW5wdXRDaGFubmVsKG1JbnB1dENoYW5uZWwsIG1JbnB1dEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3Blci5teVF1ZXVlKCkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBSb290Vmlld1N1cmZhY2VUYWtlcikgeworICAgICAgICAgICAgICAgICAgICBtSW5wdXRRdWV1ZUNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoUm9vdFZpZXdTdXJmYWNlVGFrZXIpdmlldykud2lsbFlvdVRha2VUaGVJbnB1dFF1ZXVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtSW5wdXRRdWV1ZUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0UXVldWUgPSBuZXcgSW5wdXRRdWV1ZShtSW5wdXRDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0UXVldWVDYWxsYmFjay5vbklucHV0UXVldWVDcmVhdGVkKG1JbnB1dFF1ZXVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFF1ZXVlLnJlZ2lzdGVySW5wdXRDaGFubmVsKG1JbnB1dENoYW5uZWwsIG1JbnB1dEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyLm15UXVldWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIHZpZXcuYXNzaWduUGFyZW50KHRoaXMpOwpAQCAtNjUyLDcgKzY1MSw3IEBACiAgICAgICAgICAgICAvLyBvYmplY3QgaXMgbm90IGluaXRpYWxpemVkIHRvIGl0cyBiYWNraW5nIHN0b3JlLCBidXQgc29vbiBpdAogICAgICAgICAgICAgLy8gd2lsbCBiZSAoYXNzdW1pbmcgdGhlIHdpbmRvdyBpcyB2aXNpYmxlKS4KICAgICAgICAgICAgIGF0dGFjaEluZm8ubVN1cmZhY2UgPSBtU3VyZmFjZTsKLSAgICAgICAgICAgIGF0dGFjaEluZm8ubVRyYW5zbHVjZW50V2luZG93ID0gbHAuZm9ybWF0ICE9IFBpeGVsRm9ybWF0Lk9QQVFVRTsKKyAgICAgICAgICAgIGF0dGFjaEluZm8ubVRyYW5zbHVjZW50V2luZG93ID0gUGl4ZWxGb3JtYXQuZm9ybWF0SGFzQWxwaGEobHAuZm9ybWF0KTsKICAgICAgICAgICAgIGF0dGFjaEluZm8ubUhhc1dpbmRvd0ZvY3VzID0gZmFsc2U7CiAgICAgICAgICAgICBhdHRhY2hJbmZvLm1XaW5kb3dWaXNpYmlsaXR5ID0gdmlld1Zpc2liaWxpdHk7CiAgICAgICAgICAgICBhdHRhY2hJbmZvLm1SZWNvbXB1dGVHbG9iYWxBdHRyaWJ1dGVzID0gZmFsc2U7CkBAIC04MTgsOCArODE3LDYgQEAKICAgICAgICAgICAgIGlmIChtU3VyZmFjZUhvbGRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIubVN1cmZhY2VMb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICBtRHJhd2luZ0FsbG93ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxwLmZvcm1hdCA9IG1TdXJmYWNlSG9sZGVyLmdldFJlcXVlc3RlZEZvcm1hdCgpOwotICAgICAgICAgICAgICAgIGxwLnR5cGUgPSBtU3VyZmFjZUhvbGRlci5nZXRSZXF1ZXN0ZWRUeXBlKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2xlYW4gaHdJbnRpYWxpemVkID0gZmFsc2U7CkBAIC0xMTU1LDYgKzExNTIsMTggQEAKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoIlZpZXdSb290IiwgIkZJTklTSEVEIERSQVdJTkc6ICIgKyBtV2luZG93QXR0cmlidXRlcy5nZXRUaXRsZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVJlcG9ydE5leHREcmF3ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlSG9sZGVyICE9IG51bGwgJiYgbVN1cmZhY2UuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyQ2FsbGJhY2suc3VyZmFjZVJlZHJhd05lZWRlZChtU3VyZmFjZUhvbGRlcik7CisgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgY2FsbGJhY2tzW10gPSBtU3VyZmFjZUhvbGRlci5nZXRDYWxsYmFja3MoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgYyA6IGNhbGxiYWNrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgU3VyZmFjZUhvbGRlci5DYWxsYmFjazIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiljKS5zdXJmYWNlUmVkcmF3TmVlZGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgc1dpbmRvd1Nlc3Npb24uZmluaXNoRHJhd2luZyhtV2luZG93KTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewpAQCAtMTI2NCw3ICsxMjczLDcgQEAKICAgICAgICAgCiAgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsICYmIG1Id1JlbmRlcmVyLmlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICBpZiAoIWRpcnR5LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRyYXcobVZpZXcsIG1BdHRhY2hJbmZvLCBtVHJhbnNsYXRvciwgeW9mZiwgbURlbnNpdHksIHNjYWxpbmdSZXF1aXJlZCk7CisgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIuZHJhdyhtVmlldywgbUF0dGFjaEluZm8sIHlvZmYpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoc2Nyb2xsaW5nKSB7CkBAIC0xNTk2LDE2ICsxNjA1LDEyIEBACiAgICAgICAgIH0KICAgICAgICAgbVN1cmZhY2UucmVsZWFzZSgpOwogCi0gICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyUG9saWN5LkVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgIGlmIChtSW5wdXRDaGFubmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobUlucHV0UXVldWVDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dFF1ZXVlQ2FsbGJhY2sub25JbnB1dFF1ZXVlRGVzdHJveWVkKG1JbnB1dFF1ZXVlKTsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0UXVldWVDYWxsYmFjayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRRdWV1ZS51bnJlZ2lzdGVySW5wdXRDaGFubmVsKG1JbnB1dENoYW5uZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsID0gbnVsbDsKKyAgICAgICAgaWYgKG1JbnB1dENoYW5uZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1JbnB1dFF1ZXVlQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JbnB1dFF1ZXVlQ2FsbGJhY2sub25JbnB1dFF1ZXVlRGVzdHJveWVkKG1JbnB1dFF1ZXVlKTsKKyAgICAgICAgICAgICAgICBtSW5wdXRRdWV1ZUNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSW5wdXRRdWV1ZS51bnJlZ2lzdGVySW5wdXRDaGFubmVsKG1JbnB1dENoYW5uZWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApAQCAtMTYxNCwxMyArMTYxOSwxMSBAQAogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBpZiAoV2luZG93TWFuYWdlclBvbGljeS5FTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAvLyBEaXNwb3NlIHRoZSBpbnB1dCBjaGFubmVsIGFmdGVyIHJlbW92aW5nIHRoZSB3aW5kb3cgc28gdGhlIFdpbmRvdyBNYW5hZ2VyCi0gICAgICAgICAgICAvLyBkb2Vzbid0IGludGVycHJldCB0aGUgaW5wdXQgY2hhbm5lbCBiZWluZyBjbG9zZWQgYXMgYW4gYWJub3JtYWwgdGVybWluYXRpb24uCi0gICAgICAgICAgICBpZiAobUlucHV0Q2hhbm5lbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0Q2hhbm5lbC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0Q2hhbm5lbCA9IG51bGw7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIERpc3Bvc2UgdGhlIGlucHV0IGNoYW5uZWwgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHdpbmRvdyBzbyB0aGUgV2luZG93IE1hbmFnZXIKKyAgICAgICAgLy8gZG9lc24ndCBpbnRlcnByZXQgdGhlIGlucHV0IGNoYW5uZWwgYmVpbmcgY2xvc2VkIGFzIGFuIGFibm9ybWFsIHRlcm1pbmF0aW9uLgorICAgICAgICBpZiAobUlucHV0Q2hhbm5lbCAhPSBudWxsKSB7CisgICAgICAgICAgICBtSW5wdXRDaGFubmVsLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dENoYW5uZWwgPSBudWxsOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzIwLDEwOSArMTcyMywyMiBAQAogICAgICAgICAgICAgZGVsaXZlcktleUV2ZW50KChLZXlFdmVudCltc2cub2JqLCB0cnVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIERJU1BBVENIX1BPSU5URVI6IHsKLSAgICAgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gKE1vdGlvbkV2ZW50KW1zZy5vYmo7Ci0gICAgICAgICAgICBib29sZWFuIGNhbGxXaGVuRG9uZSA9IG1zZy5hcmcxICE9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyB0aW1lQmVmb3JlR2V0dGluZ0V2ZW50czsKLSAgICAgICAgICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVCZWZvcmVHZXR0aW5nRXZlbnRzID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXZlbnQgPSBnZXRQZW5kaW5nUG9pbnRlck1vdGlvbkV2ZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZICYmIGV2ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCI5IENsaWVudCBnb3QgZXZlbnRzICAgICAgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ubmFub1RpbWUoKSAtIGV2ZW50LmdldEV2ZW50VGltZU5hbm8oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGx0LnNhbXBsZSgiOCBDbGllbnQgZ2V0dGluZyBldmVudHMgICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUJlZm9yZUdldHRpbmdFdmVudHMgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYWxsV2hlbkRvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChldmVudCAhPSBudWxsICYmIG1UcmFuc2xhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVHJhbnNsYXRvci50cmFuc2xhdGVFdmVudEluU2NyZWVuVG9BcHBXaW5kb3coZXZlbnQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSAoTW90aW9uRXZlbnQpIG1zZy5vYmo7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFuZGxlZDsKLSAgICAgICAgICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCAmJiBtQWRkZWQgJiYgZXZlbnQgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIGVudGVyIHRvdWNoIG1vZGUgb24gdGhlIGRvd24KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Rvd24gPSBldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRG93bikgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlVG91Y2hNb2RlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKENvbmZpZy5MT0dWKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlTW90aW9uTG9nKCJjYXB0dXJlRGlzcGF0Y2hQb2ludGVyIiwgZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VyU2Nyb2xsWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5vZmZzZXRMb2NhdGlvbigwLCBtQ3VyU2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCJBIERpc3BhdGNoaW5nIFRvdWNoRXZlbnRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBtVmlldy5kaXNwYXRjaFRvdWNoRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsdC5zYW1wbGUoIkIgRGlzcGF0Y2hlZCBUb3VjaEV2ZW50cyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ubmFub1RpbWUoKSAtIGV2ZW50LmdldEV2ZW50VGltZU5hbm8oKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVkICYmIGlzRG93bikgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVkZ2VTbG9wID0gbVZpZXdDb25maWd1cmF0aW9uLmdldFNjYWxlZEVkZ2VTbG9wKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBlZGdlRmxhZ3MgPSBldmVudC5nZXRFZGdlRmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24gPSBWaWV3LkZPQ1VTX1VQOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSAoaW50KWV2ZW50LmdldFgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ID0gKGludClldmVudC5nZXRZKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnRbXSBkZWx0YXMgPSBuZXcgaW50WzJdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGVkZ2VGbGFncyAmIE1vdGlvbkV2ZW50LkVER0VfVE9QKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gVmlldy5GT0NVU19ET1dOOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZWRnZUZsYWdzICYgTW90aW9uRXZlbnQuRURHRV9MRUZUKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhc1swXSA9IGVkZ2VTbG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IGVkZ2VTbG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVkZ2VGbGFncyAmIE1vdGlvbkV2ZW50LkVER0VfUklHSFQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFzWzBdID0gLWVkZ2VTbG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC09IGVkZ2VTbG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVkZ2VGbGFncyAmIE1vdGlvbkV2ZW50LkVER0VfQk9UVE9NKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gVmlldy5GT0NVU19VUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGVkZ2VGbGFncyAmIE1vdGlvbkV2ZW50LkVER0VfTEVGVCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YXNbMF0gPSBlZGdlU2xvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBlZGdlU2xvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChlZGdlRmxhZ3MgJiBNb3Rpb25FdmVudC5FREdFX1JJR0hUKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhc1swXSA9IC1lZGdlU2xvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPSBlZGdlU2xvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChlZGdlRmxhZ3MgJiBNb3Rpb25FdmVudC5FREdFX0xFRlQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBWaWV3LkZPQ1VTX1JJR0hUOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZWRnZUZsYWdzICYgTW90aW9uRXZlbnQuRURHRV9SSUdIVCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IFZpZXcuRk9DVVNfTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkZ2VGbGFncyAhPSAwICYmIG1WaWV3IGluc3RhbmNlb2YgVmlld0dyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBuZWFyZXN0ID0gRm9jdXNGaW5kZXIuZ2V0SW5zdGFuY2UoKS5maW5kTmVhcmVzdFRvdWNoYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVmlld0dyb3VwKSBtVmlldyksIHgsIHksIGRpcmVjdGlvbiwgZGVsdGFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVhcmVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9mZnNldExvY2F0aW9uKGRlbHRhc1swXSwgZGVsdGFzWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0RWRnZUZsYWdzKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaFRvdWNoRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWxpdmVyUG9pbnRlckV2ZW50KGV2ZW50KTsKICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxXaGVuRG9uZSkgewotICAgICAgICAgICAgICAgICAgICBmaW5pc2hNb3Rpb25FdmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWN5Y2xlTW90aW9uRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIGV2ZW50LnJlY3ljbGUoKTsKICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HViB8fCBXQVRDSF9QT0lOVEVSKSBMb2cuaShUQUcsICJEb25lIGRpc3BhdGNoaW5nISIpOwotICAgICAgICAgICAgICAgIC8vIExldCB0aGUgZXhjZXB0aW9uIGZhbGwgdGhyb3VnaCAtLSB0aGUgbG9vcGVyIHdpbGwgY2F0Y2gKLSAgICAgICAgICAgICAgICAvLyBpdCBhbmQgdGFrZSBjYXJlIG9mIHRoZSBiYWQgYXBwIGZvciB1cy4KICAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBESVNQQVRDSF9UUkFDS0JBTEw6Ci0gICAgICAgICAgICBkZWxpdmVyVHJhY2tiYWxsRXZlbnQoKE1vdGlvbkV2ZW50KW1zZy5vYmosIG1zZy5hcmcxICE9IDApOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElTUEFUQ0hfVFJBQ0tCQUxMOiB7CisgICAgICAgICAgICBNb3Rpb25FdmVudCBldmVudCA9IChNb3Rpb25FdmVudCkgbXNnLm9iajsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGVsaXZlclRyYWNrYmFsbEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZXZlbnQucmVjeWNsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERJU1BBVENIX0FQUF9WSVNJQklMSVRZOgogICAgICAgICAgICAgaGFuZGxlQXBwVmlzaWJpbGl0eShtc2cuYXJnMSAhPSAwKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTk0NSw2MSArMTg2MSwxMiBAQAogICAgIH0KICAgICAKICAgICBwcml2YXRlIHZvaWQgZmluaXNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJQb2xpY3kuRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgaWYgKG1GaW5pc2hlZENhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRmluaXNoZWRDYWxsYmFjay5ydW4oKTsKLSAgICAgICAgICAgICAgICBtRmluaXNoZWRDYWxsYmFjayA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNXaW5kb3dTZXNzaW9uLmZpbmlzaEtleShtV2luZG93KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtRmluaXNoZWRDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtRmluaXNoZWRDYWxsYmFjay5ydW4oKTsKKyAgICAgICAgICAgIG1GaW5pc2hlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICAgfQogICAgIH0KICAgICAKLSAgICBwcml2YXRlIHZvaWQgZmluaXNoTW90aW9uRXZlbnQoKSB7Ci0gICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyUG9saWN5LkVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNob3VsZCBub3QgYmUgcmVhY2hhYmxlIHdpdGggbmF0aXZlIGlucHV0IGRpc3BhdGNoLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc1dpbmRvd1Nlc3Npb24uZmluaXNoS2V5KG1XaW5kb3cpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlY3ljbGVNb3Rpb25FdmVudChNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgZXZlbnQucmVjeWNsZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTW90aW9uRXZlbnQgZ2V0UGVuZGluZ1BvaW50ZXJNb3Rpb25FdmVudCgpIHsKLSAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJQb2xpY3kuRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2hvdWxkIG5vdCBiZSByZWFjaGFibGUgd2l0aCBuYXRpdmUgaW5wdXQgZGlzcGF0Y2guIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc1dpbmRvd1Nlc3Npb24uZ2V0UGVuZGluZ1BvaW50ZXJNb3ZlKG1XaW5kb3cpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1vdGlvbkV2ZW50IGdldFBlbmRpbmdUcmFja2JhbGxNb3Rpb25FdmVudCgpIHsKLSAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJQb2xpY3kuRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2hvdWxkIG5vdCBiZSByZWFjaGFibGUgd2l0aCBuYXRpdmUgaW5wdXQgZGlzcGF0Y2guIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc1dpbmRvd1Nlc3Npb24uZ2V0UGVuZGluZ1RyYWNrYmFsbE1vdmUobVdpbmRvdyk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKICAgICAvKioKICAgICAgKiBTb21ldGhpbmcgaW4gdGhlIGN1cnJlbnQgd2luZG93IHRlbGxzIHVzIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSB0b3VjaCBtb2RlLiAgRm9yCiAgICAgICogZXhhbXBsZSwgd2UgYXJlIG5vdCBpbiB0b3VjaCBtb2RlLCBhbmQgdGhlIHVzZXIgdG91Y2hlcyB0aGUgc2NyZWVuLgpAQCAtMjEyMSw0MiArMTk4OCw5NSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0KLSAgICBwcml2YXRlIHZvaWQgZGVsaXZlclRyYWNrYmFsbEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50LCBib29sZWFuIGNhbGxXaGVuRG9uZSkgewotICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgZXZlbnQgPSBnZXRQZW5kaW5nVHJhY2tiYWxsTW90aW9uRXZlbnQoKTsKLSAgICAgICAgICAgIGNhbGxXaGVuRG9uZSA9IGZhbHNlOworICAgIHByaXZhdGUgdm9pZCBkZWxpdmVyUG9pbnRlckV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChtVHJhbnNsYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNsYXRvci50cmFuc2xhdGVFdmVudEluU2NyZWVuVG9BcHBXaW5kb3coZXZlbnQpOwogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29sZWFuIGhhbmRsZWQ7CisgICAgICAgIGlmIChtVmlldyAhPSBudWxsICYmIG1BZGRlZCkgewogCisgICAgICAgICAgICAvLyBlbnRlciB0b3VjaCBtb2RlIG9uIHRoZSBkb3duCisgICAgICAgICAgICBib29sZWFuIGlzRG93biA9IGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOworICAgICAgICAgICAgaWYgKGlzRG93bikgeworICAgICAgICAgICAgICAgIGVuc3VyZVRvdWNoTW9kZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKENvbmZpZy5MT0dWKSB7CisgICAgICAgICAgICAgICAgY2FwdHVyZU1vdGlvbkxvZygiY2FwdHVyZURpc3BhdGNoUG9pbnRlciIsIGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ3VyU2Nyb2xsWSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZXZlbnQub2Zmc2V0TG9jYXRpb24oMCwgbUN1clNjcm9sbFkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgeworICAgICAgICAgICAgICAgIGx0LnNhbXBsZSgiQSBEaXNwYXRjaGluZyBUb3VjaEV2ZW50cyIsIFN5c3RlbS5uYW5vVGltZSgpIC0gZXZlbnQuZ2V0RXZlbnRUaW1lTmFubygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQgPSBtVmlldy5kaXNwYXRjaFRvdWNoRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgeworICAgICAgICAgICAgICAgIGx0LnNhbXBsZSgiQiBEaXNwYXRjaGVkIFRvdWNoRXZlbnRzICIsIFN5c3RlbS5uYW5vVGltZSgpIC0gZXZlbnQuZ2V0RXZlbnRUaW1lTmFubygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaGFuZGxlZCAmJiBpc0Rvd24pIHsKKyAgICAgICAgICAgICAgICBpbnQgZWRnZVNsb3AgPSBtVmlld0NvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkRWRnZVNsb3AoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIGludCBlZGdlRmxhZ3MgPSBldmVudC5nZXRFZGdlRmxhZ3MoKTsKKyAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uID0gVmlldy5GT0NVU19VUDsKKyAgICAgICAgICAgICAgICBpbnQgeCA9IChpbnQpZXZlbnQuZ2V0WCgpOworICAgICAgICAgICAgICAgIGludCB5ID0gKGludClldmVudC5nZXRZKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50W10gZGVsdGFzID0gbmV3IGludFsyXTsKKworICAgICAgICAgICAgICAgIGlmICgoZWRnZUZsYWdzICYgTW90aW9uRXZlbnQuRURHRV9UT1ApICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gVmlldy5GT0NVU19ET1dOOworICAgICAgICAgICAgICAgICAgICBpZiAoKGVkZ2VGbGFncyAmIE1vdGlvbkV2ZW50LkVER0VfTEVGVCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFzWzBdID0gZWRnZVNsb3A7CisgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IGVkZ2VTbG9wOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChlZGdlRmxhZ3MgJiBNb3Rpb25FdmVudC5FREdFX1JJR0hUKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YXNbMF0gPSAtZWRnZVNsb3A7CisgICAgICAgICAgICAgICAgICAgICAgICB4IC09IGVkZ2VTbG9wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZWRnZUZsYWdzICYgTW90aW9uRXZlbnQuRURHRV9CT1RUT00pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gVmlldy5GT0NVU19VUDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlZGdlRmxhZ3MgJiBNb3Rpb25FdmVudC5FREdFX0xFRlQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhc1swXSA9IGVkZ2VTbG9wOworICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBlZGdlU2xvcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZWRnZUZsYWdzICYgTW90aW9uRXZlbnQuRURHRV9SSUdIVCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFzWzBdID0gLWVkZ2VTbG9wOworICAgICAgICAgICAgICAgICAgICAgICAgeCAtPSBlZGdlU2xvcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVkZ2VGbGFncyAmIE1vdGlvbkV2ZW50LkVER0VfTEVGVCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBWaWV3LkZPQ1VTX1JJR0hUOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVkZ2VGbGFncyAmIE1vdGlvbkV2ZW50LkVER0VfUklHSFQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gVmlldy5GT0NVU19MRUZUOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlZGdlRmxhZ3MgIT0gMCAmJiBtVmlldyBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgICAgICBWaWV3IG5lYXJlc3QgPSBGb2N1c0ZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmROZWFyZXN0VG91Y2hhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVmlld0dyb3VwKSBtVmlldyksIHgsIHksIGRpcmVjdGlvbiwgZGVsdGFzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5lYXJlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQub2Zmc2V0TG9jYXRpb24oZGVsdGFzWzBdLCBkZWx0YXNbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0RWRnZUZsYWdzKDApOworICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxpdmVyVHJhY2tiYWxsRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKERFQlVHX1RSQUNLQkFMTCkgTG9nLnYoVEFHLCAiTW90aW9uIGV2ZW50OiIgKyBldmVudCk7CiAKICAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtVmlldyAhPSBudWxsICYmIG1BZGRlZCkgewotICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBtVmlldy5kaXNwYXRjaFRyYWNrYmFsbEV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgY291bGQgZG8gc29tZXRoaW5nIGhlcmUsIGxpa2UgY2hhbmdpbmcgdGhlIGZvY3VzCi0gICAgICAgICAgICAgICAgICAgIC8vIG9yIHNvbWV0aGluZz8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChtVmlldyAhPSBudWxsICYmIG1BZGRlZCkgeworICAgICAgICAgICAgaGFuZGxlZCA9IG1WaWV3LmRpc3BhdGNoVHJhY2tiYWxsRXZlbnQoZXZlbnQpOwogICAgICAgICAgICAgaWYgKGhhbmRsZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FsbFdoZW5Eb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmlzaE1vdGlvbkV2ZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlY3ljbGVNb3Rpb25FdmVudChldmVudCk7CiAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2ggdGhpcywgd2UgZGVsaXZlcmVkIGEgdHJhY2tiYWxsIGV2ZW50IHRvIG1WaWV3IGFuZAogICAgICAgICAgICAgICAgIC8vIG1WaWV3IGNvbnN1bWVkIGl0LiBCZWNhdXNlIHdlIHdpbGwgbm90IHRyYW5zbGF0ZSB0aGUgdHJhY2tiYWxsCiAgICAgICAgICAgICAgICAgLy8gZXZlbnQgaW50byBhIGtleSBldmVudCwgdG91Y2ggbW9kZSB3aWxsIG5vdCBleGl0LCBzbyB3ZSBleGl0CiAgICAgICAgICAgICAgICAgLy8gdG91Y2ggbW9kZSBoZXJlLgogICAgICAgICAgICAgICAgIGVuc3VyZVRvdWNoTW9kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gUmV0dXJuSW5zaWRlRmluYWxseUJsb2NrCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTGV0IHRoZSBleGNlcHRpb24gZmFsbCB0aHJvdWdoIC0tIHRoZSBsb29wZXIgd2lsbCBjYXRjaAotICAgICAgICAgICAgLy8gaXQgYW5kIHRha2UgY2FyZSBvZiB0aGUgYmFkIGFwcCBmb3IgdXMuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBjb3VsZCBkbyBzb21ldGhpbmcgaGVyZSwgbGlrZSBjaGFuZ2luZyB0aGUgZm9jdXMKKyAgICAgICAgICAgIC8vIG9yIHNvbWV0aGluZz8KICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIFRyYWNrYmFsbEF4aXMgeCA9IG1UcmFja2JhbGxBeGlzWDsKQEAgLTIxNzEsOTUgKzIwOTEsODYgQEAKICAgICAgICAgICAgIG1MYXN0VHJhY2tiYWxsVGltZSA9IGN1clRpbWU7CiAgICAgICAgIH0KIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgZmluYWwgaW50IG1ldGFzdGF0ZSA9IGV2ZW50LmdldE1ldGFTdGF0ZSgpOwotICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgotICAgICAgICAgICAgICAgICAgICB4LnJlc2V0KDIpOwotICAgICAgICAgICAgICAgICAgICB5LnJlc2V0KDIpOwotICAgICAgICAgICAgICAgICAgICBkZWxpdmVyS2V5RXZlbnQobmV3IEtleUV2ZW50KGN1clRpbWUsIGN1clRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuQUNUSU9OX0RPV04sIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbWV0YXN0YXRlKSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKLSAgICAgICAgICAgICAgICAgICAgeC5yZXNldCgyKTsKLSAgICAgICAgICAgICAgICAgICAgeS5yZXNldCgyKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlcktleUV2ZW50KG5ldyBLZXlFdmVudChjdXJUaW1lLCBjdXJUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkFDVElPTl9VUCwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtZXRhc3RhdGUpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgIGZpbmFsIGludCBtZXRhc3RhdGUgPSBldmVudC5nZXRNZXRhU3RhdGUoKTsKKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CisgICAgICAgICAgICAgICAgeC5yZXNldCgyKTsKKyAgICAgICAgICAgICAgICB5LnJlc2V0KDIpOworICAgICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudChuZXcgS2V5RXZlbnQoY3VyVGltZSwgY3VyVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgbWV0YXN0YXRlKSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CisgICAgICAgICAgICAgICAgeC5yZXNldCgyKTsKKyAgICAgICAgICAgICAgICB5LnJlc2V0KDIpOworICAgICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudChuZXcgS2V5RXZlbnQoY3VyVGltZSwgY3VyVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkFDVElPTl9VUCwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1ldGFzdGF0ZSksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoREVCVUdfVFJBQ0tCQUxMKSBMb2cudihUQUcsICJUQiBYPSIgKyB4LnBvc2l0aW9uICsgIiBzdGVwPSIKLSAgICAgICAgICAgICAgICAgICAgKyB4LnN0ZXAgKyAiIGRpcj0iICsgeC5kaXIgKyAiIGFjYz0iICsgeC5hY2NlbGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIG1vdmU9IiArIGV2ZW50LmdldFgoKQotICAgICAgICAgICAgICAgICAgICArICIgLyBZPSIgKyB5LnBvc2l0aW9uICsgIiBzdGVwPSIKLSAgICAgICAgICAgICAgICAgICAgKyB5LnN0ZXAgKyAiIGRpcj0iICsgeS5kaXIgKyAiIGFjYz0iICsgeS5hY2NlbGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIG1vdmU9IiArIGV2ZW50LmdldFkoKSk7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB4T2ZmID0geC5jb2xsZWN0KGV2ZW50LmdldFgoKSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksICJYIik7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB5T2ZmID0geS5jb2xsZWN0KGV2ZW50LmdldFkoKSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksICJZIik7CisgICAgICAgIGlmIChERUJVR19UUkFDS0JBTEwpIExvZy52KFRBRywgIlRCIFg9IiArIHgucG9zaXRpb24gKyAiIHN0ZXA9IgorICAgICAgICAgICAgICAgICsgeC5zdGVwICsgIiBkaXI9IiArIHguZGlyICsgIiBhY2M9IiArIHguYWNjZWxlcmF0aW9uCisgICAgICAgICAgICAgICAgKyAiIG1vdmU9IiArIGV2ZW50LmdldFgoKQorICAgICAgICAgICAgICAgICsgIiAvIFk9IiArIHkucG9zaXRpb24gKyAiIHN0ZXA9IgorICAgICAgICAgICAgICAgICsgeS5zdGVwICsgIiBkaXI9IiArIHkuZGlyICsgIiBhY2M9IiArIHkuYWNjZWxlcmF0aW9uCisgICAgICAgICAgICAgICAgKyAiIG1vdmU9IiArIGV2ZW50LmdldFkoKSk7CisgICAgICAgIGZpbmFsIGZsb2F0IHhPZmYgPSB4LmNvbGxlY3QoZXZlbnQuZ2V0WCgpLCBldmVudC5nZXRFdmVudFRpbWUoKSwgIlgiKTsKKyAgICAgICAgZmluYWwgZmxvYXQgeU9mZiA9IHkuY29sbGVjdChldmVudC5nZXRZKCksIGV2ZW50LmdldEV2ZW50VGltZSgpLCAiWSIpOwogCi0gICAgICAgICAgICAvLyBHZW5lcmF0ZSBEUEFEIGV2ZW50cyBiYXNlZCBvbiB0aGUgdHJhY2tiYWxsIG1vdmVtZW50LgotICAgICAgICAgICAgLy8gV2UgcGljayB0aGUgYXhpcyB0aGF0IGhhcyBtb3ZlZCB0aGUgbW9zdCBhcyB0aGUgZGlyZWN0aW9uIG9mCi0gICAgICAgICAgICAvLyB0aGUgRFBBRC4gIFdoZW4gd2UgZ2VuZXJhdGUgRFBBRCBldmVudHMgZm9yIG9uZSBheGlzLCB0aGVuIHRoZQotICAgICAgICAgICAgLy8gb3RoZXIgYXhpcyBpcyByZXNldCAtLSB3ZSBkb24ndCB3YW50IHRvIHBlcmZvcm0gRFBBRCBqdW1wcyBkdWUKLSAgICAgICAgICAgIC8vIHRvIHNsaWdodCBtb3ZlbWVudHMgaW4gdGhlIHRyYWNrYmFsbCB3aGVuIG1ha2luZyBtYWpvciBtb3ZlbWVudHMKLSAgICAgICAgICAgIC8vIGFsb25nIHRoZSBvdGhlciBheGlzLgotICAgICAgICAgICAgaW50IGtleWNvZGUgPSAwOwotICAgICAgICAgICAgaW50IG1vdmVtZW50ID0gMDsKLSAgICAgICAgICAgIGZsb2F0IGFjY2VsID0gMTsKLSAgICAgICAgICAgIGlmICh4T2ZmID4geU9mZikgewotICAgICAgICAgICAgICAgIG1vdmVtZW50ID0geC5nZW5lcmF0ZSgoMi9ldmVudC5nZXRYUHJlY2lzaW9uKCkpKTsKLSAgICAgICAgICAgICAgICBpZiAobW92ZW1lbnQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBrZXljb2RlID0gbW92ZW1lbnQgPiAwID8gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgYWNjZWwgPSB4LmFjY2VsZXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgeS5yZXNldCgyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHlPZmYgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbW92ZW1lbnQgPSB5LmdlbmVyYXRlKCgyL2V2ZW50LmdldFlQcmVjaXNpb24oKSkpOwotICAgICAgICAgICAgICAgIGlmIChtb3ZlbWVudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleWNvZGUgPSBtb3ZlbWVudCA+IDAgPyBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOwotICAgICAgICAgICAgICAgICAgICBhY2NlbCA9IHkuYWNjZWxlcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB4LnJlc2V0KDIpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8gR2VuZXJhdGUgRFBBRCBldmVudHMgYmFzZWQgb24gdGhlIHRyYWNrYmFsbCBtb3ZlbWVudC4KKyAgICAgICAgLy8gV2UgcGljayB0aGUgYXhpcyB0aGF0IGhhcyBtb3ZlZCB0aGUgbW9zdCBhcyB0aGUgZGlyZWN0aW9uIG9mCisgICAgICAgIC8vIHRoZSBEUEFELiAgV2hlbiB3ZSBnZW5lcmF0ZSBEUEFEIGV2ZW50cyBmb3Igb25lIGF4aXMsIHRoZW4gdGhlCisgICAgICAgIC8vIG90aGVyIGF4aXMgaXMgcmVzZXQgLS0gd2UgZG9uJ3Qgd2FudCB0byBwZXJmb3JtIERQQUQganVtcHMgZHVlCisgICAgICAgIC8vIHRvIHNsaWdodCBtb3ZlbWVudHMgaW4gdGhlIHRyYWNrYmFsbCB3aGVuIG1ha2luZyBtYWpvciBtb3ZlbWVudHMKKyAgICAgICAgLy8gYWxvbmcgdGhlIG90aGVyIGF4aXMuCisgICAgICAgIGludCBrZXljb2RlID0gMDsKKyAgICAgICAgaW50IG1vdmVtZW50ID0gMDsKKyAgICAgICAgZmxvYXQgYWNjZWwgPSAxOworICAgICAgICBpZiAoeE9mZiA+IHlPZmYpIHsKKyAgICAgICAgICAgIG1vdmVtZW50ID0geC5nZW5lcmF0ZSgoMi9ldmVudC5nZXRYUHJlY2lzaW9uKCkpKTsKKyAgICAgICAgICAgIGlmIChtb3ZlbWVudCAhPSAwKSB7CisgICAgICAgICAgICAgICAga2V5Y29kZSA9IG1vdmVtZW50ID4gMCA/IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVAorICAgICAgICAgICAgICAgICAgICAgICAgOiBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVDsKKyAgICAgICAgICAgICAgICBhY2NlbCA9IHguYWNjZWxlcmF0aW9uOworICAgICAgICAgICAgICAgIHkucmVzZXQoMik7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoeU9mZiA+IDApIHsKKyAgICAgICAgICAgIG1vdmVtZW50ID0geS5nZW5lcmF0ZSgoMi9ldmVudC5nZXRZUHJlY2lzaW9uKCkpKTsKKyAgICAgICAgICAgIGlmIChtb3ZlbWVudCAhPSAwKSB7CisgICAgICAgICAgICAgICAga2V5Y29kZSA9IG1vdmVtZW50ID4gMCA/IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOCisgICAgICAgICAgICAgICAgICAgICAgICA6IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUDsKKyAgICAgICAgICAgICAgICBhY2NlbCA9IHkuYWNjZWxlcmF0aW9uOworICAgICAgICAgICAgICAgIHgucmVzZXQoMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGtleWNvZGUgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChtb3ZlbWVudCA8IDApIG1vdmVtZW50ID0gLW1vdmVtZW50OwotICAgICAgICAgICAgICAgIGludCBhY2NlbE1vdmVtZW50ID0gKGludCkobW92ZW1lbnQgKiBhY2NlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX1RSQUNLQkFMTCkgTG9nLnYoVEFHLCAiTW92ZTogbW92ZW1lbnQ9IiArIG1vdmVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICArICIgYWNjZWxNb3ZlbWVudD0iICsgYWNjZWxNb3ZlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFjY2VsPSIgKyBhY2NlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2VsTW92ZW1lbnQgPiBtb3ZlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfVFJBQ0tCQUxMKSBMb2cudigiZm9vIiwgIkRlbGl2ZXJpbmcgZmFrZSBEUEFEOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrZXljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgbW92ZW1lbnQtLTsKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlcktleUV2ZW50KG5ldyBLZXlFdmVudChjdXJUaW1lLCBjdXJUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkFDVElPTl9NVUxUSVBMRSwga2V5Y29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbE1vdmVtZW50LW1vdmVtZW50LCBtZXRhc3RhdGUpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlIChtb3ZlbWVudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX1RSQUNLQkFMTCkgTG9nLnYoImZvbyIsICJEZWxpdmVyaW5nIGZha2UgRFBBRDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga2V5Y29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1vdmVtZW50LS07Ci0gICAgICAgICAgICAgICAgICAgIGN1clRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlcktleUV2ZW50KG5ldyBLZXlFdmVudChjdXJUaW1lLCBjdXJUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkFDVElPTl9ET1dOLCBrZXljb2RlLCAwLCBldmVudC5nZXRNZXRhU3RhdGUoKSksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlcktleUV2ZW50KG5ldyBLZXlFdmVudChjdXJUaW1lLCBjdXJUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkFDVElPTl9VUCwga2V5Y29kZSwgMCwgbWV0YXN0YXRlKSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrYmFsbFRpbWUgPSBjdXJUaW1lOworICAgICAgICBpZiAoa2V5Y29kZSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobW92ZW1lbnQgPCAwKSBtb3ZlbWVudCA9IC1tb3ZlbWVudDsKKyAgICAgICAgICAgIGludCBhY2NlbE1vdmVtZW50ID0gKGludCkobW92ZW1lbnQgKiBhY2NlbCk7CisgICAgICAgICAgICBpZiAoREVCVUdfVFJBQ0tCQUxMKSBMb2cudihUQUcsICJNb3ZlOiBtb3ZlbWVudD0iICsgbW92ZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFjY2VsTW92ZW1lbnQ9IiArIGFjY2VsTW92ZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFjY2VsPSIgKyBhY2NlbCk7CisgICAgICAgICAgICBpZiAoYWNjZWxNb3ZlbWVudCA+IG1vdmVtZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX1RSQUNLQkFMTCkgTG9nLnYoImZvbyIsICJEZWxpdmVyaW5nIGZha2UgRFBBRDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBrZXljb2RlKTsKKyAgICAgICAgICAgICAgICBtb3ZlbWVudC0tOworICAgICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudChuZXcgS2V5RXZlbnQoY3VyVGltZSwgY3VyVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkFDVElPTl9NVUxUSVBMRSwga2V5Y29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsTW92ZW1lbnQtbW92ZW1lbnQsIG1ldGFzdGF0ZSksIGZhbHNlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjYWxsV2hlbkRvbmUpIHsKLSAgICAgICAgICAgICAgICBmaW5pc2hNb3Rpb25FdmVudCgpOwotICAgICAgICAgICAgICAgIHJlY3ljbGVNb3Rpb25FdmVudChldmVudCk7CisgICAgICAgICAgICB3aGlsZSAobW92ZW1lbnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX1RSQUNLQkFMTCkgTG9nLnYoImZvbyIsICJEZWxpdmVyaW5nIGZha2UgRFBBRDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBrZXljb2RlKTsKKyAgICAgICAgICAgICAgICBtb3ZlbWVudC0tOworICAgICAgICAgICAgICAgIGN1clRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBkZWxpdmVyS2V5RXZlbnQobmV3IEtleUV2ZW50KGN1clRpbWUsIGN1clRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5BQ1RJT05fRE9XTiwga2V5Y29kZSwgMCwgZXZlbnQuZ2V0TWV0YVN0YXRlKCkpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgZGVsaXZlcktleUV2ZW50KG5ldyBLZXlFdmVudChjdXJUaW1lLCBjdXJUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuQUNUSU9OX1VQLCBrZXljb2RlLCAwLCBtZXRhc3RhdGUpLCBmYWxzZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBMZXQgdGhlIGV4Y2VwdGlvbiBmYWxsIHRocm91Z2ggLS0gdGhlIGxvb3BlciB3aWxsIGNhdGNoCi0gICAgICAgICAgICAvLyBpdCBhbmQgdGFrZSBjYXJlIG9mIHRoZSBiYWQgYXBwIGZvciB1cy4KKyAgICAgICAgICAgIG1MYXN0VHJhY2tiYWxsVGltZSA9IGN1clRpbWU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI3MDQsNDUgKzI2MTUsMjAgQEAKICAgICBwcml2YXRlIGZpbmFsIElucHV0SGFuZGxlciBtSW5wdXRIYW5kbGVyID0gbmV3IElucHV0SGFuZGxlcigpIHsKICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlS2V5KEtleUV2ZW50IGV2ZW50LCBSdW5uYWJsZSBmaW5pc2hlZENhbGxiYWNrKSB7CiAgICAgICAgICAgICBtRmluaXNoZWRDYWxsYmFjayA9IGZpbmlzaGVkQ2FsbGJhY2s7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTikgewotICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIENvbnN0YW50Q29uZGl0aW9ucwotICAgICAgICAgICAgICAgIGlmIChmYWxzZSAmJiBldmVudC5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuS0VZQ09ERV9DQU1FUkEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cuZCgia2V5ZGlzcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy5kKCJrZXlkaXNwIiwgIkZvY3VzZWQgdmlldyBIaWVyYXJjaHkgaXM6Iik7Ci0gICAgICAgICAgICAgICAgICAgIGRlYnVnKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cuZCgia2V5ZGlzcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKERJU1BBVENIX0tFWSk7Ci0gICAgICAgICAgICBtc2cub2JqID0gZXZlbnQ7Ci0KLSAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudigKLSAgICAgICAgICAgICAgICAiVmlld1Jvb3QiLCAic2VuZGluZyBrZXkgIiArIGV2ZW50ICsgIiB0byAiICsgbVZpZXcpOwotCi0gICAgICAgICAgICBzZW5kTWVzc2FnZUF0VGltZShtc2csIGV2ZW50LmdldEV2ZW50VGltZSgpKTsKKyAgICAgICAgICAgIGRpc3BhdGNoS2V5KGV2ZW50KTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVRvdWNoKE1vdGlvbkV2ZW50IGV2ZW50LCBSdW5uYWJsZSBmaW5pc2hlZENhbGxiYWNrKSB7CiAgICAgICAgICAgICBmaW5pc2hlZENhbGxiYWNrLnJ1bigpOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoRElTUEFUQ0hfUE9JTlRFUik7Ci0gICAgICAgICAgICBtc2cub2JqID0gZXZlbnQ7Ci0gICAgICAgICAgICBtc2cuYXJnMSA9IDA7Ci0gICAgICAgICAgICBzZW5kTWVzc2FnZUF0VGltZShtc2csIGV2ZW50LmdldEV2ZW50VGltZSgpKTsKKyAgICAgICAgICAgIGRpc3BhdGNoUG9pbnRlcihldmVudCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVUcmFja2JhbGwoTW90aW9uRXZlbnQgZXZlbnQsIFJ1bm5hYmxlIGZpbmlzaGVkQ2FsbGJhY2spIHsKICAgICAgICAgICAgIGZpbmlzaGVkQ2FsbGJhY2sucnVuKCk7CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShESVNQQVRDSF9UUkFDS0JBTEwpOwotICAgICAgICAgICAgbXNnLm9iaiA9IGV2ZW50OwotICAgICAgICAgICAgbXNnLmFyZzEgPSAwOwotICAgICAgICAgICAgc2VuZE1lc3NhZ2VBdFRpbWUobXNnLCBldmVudC5nZXRFdmVudFRpbWUoKSk7CisgICAgICAgICAgICBkaXNwYXRjaFRyYWNrYmFsbChldmVudCk7CiAgICAgICAgIH0KICAgICB9OwogCkBAIC0yNzY4LDIyICsyNjU0LDE4IEBACiAgICAgICAgIHNlbmRNZXNzYWdlQXRUaW1lKG1zZywgZXZlbnQuZ2V0RXZlbnRUaW1lKCkpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoUG9pbnRlcihNb3Rpb25FdmVudCBldmVudCwgbG9uZyBldmVudFRpbWUsCi0gICAgICAgICAgICBib29sZWFuIGNhbGxXaGVuRG9uZSkgeworICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoUG9pbnRlcihNb3Rpb25FdmVudCBldmVudCkgewogICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoRElTUEFUQ0hfUE9JTlRFUik7CiAgICAgICAgIG1zZy5vYmogPSBldmVudDsKLSAgICAgICAgbXNnLmFyZzEgPSBjYWxsV2hlbkRvbmUgPyAxIDogMDsKLSAgICAgICAgc2VuZE1lc3NhZ2VBdFRpbWUobXNnLCBldmVudFRpbWUpOworICAgICAgICBzZW5kTWVzc2FnZUF0VGltZShtc2csIGV2ZW50LmdldEV2ZW50VGltZSgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFRyYWNrYmFsbChNb3Rpb25FdmVudCBldmVudCwgbG9uZyBldmVudFRpbWUsCi0gICAgICAgICAgICBib29sZWFuIGNhbGxXaGVuRG9uZSkgeworICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoVHJhY2tiYWxsKE1vdGlvbkV2ZW50IGV2ZW50KSB7CiAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShESVNQQVRDSF9UUkFDS0JBTEwpOwogICAgICAgICBtc2cub2JqID0gZXZlbnQ7Ci0gICAgICAgIG1zZy5hcmcxID0gY2FsbFdoZW5Eb25lID8gMSA6IDA7Ci0gICAgICAgIHNlbmRNZXNzYWdlQXRUaW1lKG1zZywgZXZlbnRUaW1lKTsKKyAgICAgICAgc2VuZE1lc3NhZ2VBdFRpbWUobXNnLCBldmVudC5nZXRFdmVudFRpbWUoKSk7CiAgICAgfQotCisgICAgCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hBcHBWaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSkgewogICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoRElTUEFUQ0hfQVBQX1ZJU0lCSUxJVFkpOwogICAgICAgICBtc2cuYXJnMSA9IHZpc2libGUgPyAxIDogMDsKQEAgLTI5MTQsNTYgKzI3OTYsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGNsYXNzIEV2ZW50Q29tcGxldGlvbiBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBmaW5hbCBJV2luZG93IG1XaW5kb3c7Ci0gICAgICAgIGZpbmFsIEtleUV2ZW50IG1LZXlFdmVudDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBtSXNQb2ludGVyOwotICAgICAgICBmaW5hbCBNb3Rpb25FdmVudCBtTW90aW9uRXZlbnQ7Ci0KLSAgICAgICAgRXZlbnRDb21wbGV0aW9uKExvb3BlciBsb29wZXIsIElXaW5kb3cgd2luZG93LCBLZXlFdmVudCBrZXksCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BvaW50ZXIsIE1vdGlvbkV2ZW50IG1vdGlvbikgewotICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKLSAgICAgICAgICAgIG1XaW5kb3cgPSB3aW5kb3c7Ci0gICAgICAgICAgICBtS2V5RXZlbnQgPSBrZXk7Ci0gICAgICAgICAgICBtSXNQb2ludGVyID0gaXNQb2ludGVyOwotICAgICAgICAgICAgbU1vdGlvbkV2ZW50ID0gbW90aW9uOwotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZSgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBpZiAobUtleUV2ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5pc2hLZXlFdmVudChtS2V5RXZlbnQpOwotICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc1BvaW50ZXIpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRpZEZpbmlzaDsKLSAgICAgICAgICAgICAgICBNb3Rpb25FdmVudCBldmVudCA9IG1Nb3Rpb25FdmVudDsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBldmVudCA9IGdldFBlbmRpbmdQb2ludGVyTW90aW9uRXZlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZGlkRmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkaWRGaW5pc2ggPSBldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fT1VUU0lERTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFkaWRGaW5pc2gpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoTW90aW9uRXZlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gbU1vdGlvbkV2ZW50OwotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gZ2V0UGVuZGluZ1RyYWNrYmFsbE1vdGlvbkV2ZW50KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoTW90aW9uRXZlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBzdGF0aWMgY2xhc3MgVyBleHRlbmRzIElXaW5kb3cuU3R1YiB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxWaWV3Um9vdD4gbVZpZXdSb290OwotICAgICAgICBwcml2YXRlIGZpbmFsIExvb3BlciBtTWFpbkxvb3BlcjsKIAogICAgICAgICBwdWJsaWMgVyhWaWV3Um9vdCB2aWV3Um9vdCwgQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgICAgICBtVmlld1Jvb3QgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3Um9vdD4odmlld1Jvb3QpOwotICAgICAgICAgICAgbU1haW5Mb29wZXIgPSBjb250ZXh0LmdldE1haW5Mb29wZXIoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2l6ZWQoaW50IHcsIGludCBoLCBSZWN0IGNvdmVyZWRJbnNldHMsCkBAIC0yOTc1LDQwICsyODEyLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoS2V5KEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3Um9vdCB2aWV3Um9vdCA9IG1WaWV3Um9vdC5nZXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hLZXkoZXZlbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cudygiVmlld1Jvb3QuVyIsICJLZXkgZXZlbnQgIiArIGV2ZW50ICsgIiBidXQgbm8gVmlld1Jvb3QgYXZhaWxhYmxlISIpOwotICAgICAgICAgICAgICAgIHZpZXdSb290Lm5ldyBFdmVudENvbXBsZXRpb24obU1haW5Mb29wZXIsIHRoaXMsIGV2ZW50LCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFBvaW50ZXIoTW90aW9uRXZlbnQgZXZlbnQsIGxvbmcgZXZlbnRUaW1lLAotICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FsbFdoZW5Eb25lKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3Um9vdCB2aWV3Um9vdCA9IG1WaWV3Um9vdC5nZXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZXZlbnRUaW1lIGlzIGluIG1pbGxpc2Vjb25kcwotICAgICAgICAgICAgICAgICAgICBWaWV3Um9vdC5sdC5zYW1wbGUoIiogVmlld1Jvb3QgYjQgZGlzcGF0Y2hQdHIiLCBTeXN0ZW0ubmFub1RpbWUoKSAtIGV2ZW50VGltZSAqIDEwMDAwMDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2aWV3Um9vdC5kaXNwYXRjaFBvaW50ZXIoZXZlbnQsIGV2ZW50VGltZSwgY2FsbFdoZW5Eb25lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3QubmV3IEV2ZW50Q29tcGxldGlvbihtTWFpbkxvb3BlciwgdGhpcywgbnVsbCwgdHJ1ZSwgZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hUcmFja2JhbGwoTW90aW9uRXZlbnQgZXZlbnQsIGxvbmcgZXZlbnRUaW1lLAotICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FsbFdoZW5Eb25lKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3Um9vdCB2aWV3Um9vdCA9IG1WaWV3Um9vdC5nZXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hUcmFja2JhbGwoZXZlbnQsIGV2ZW50VGltZSwgY2FsbFdoZW5Eb25lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3QubmV3IEV2ZW50Q29tcGxldGlvbihtTWFpbkxvb3BlciwgdGhpcywgbnVsbCwgZmFsc2UsIGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQXBwVmlzaWJpbGl0eShib29sZWFuIHZpc2libGUpIHsKICAgICAgICAgICAgIGZpbmFsIFZpZXdSb290IHZpZXdSb290ID0gbVZpZXdSb290LmdldCgpOwogICAgICAgICAgICAgaWYgKHZpZXdSb290ICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCmluZGV4IDliMzFiOWMuLmJlNjgxY2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQpAQCAtNDg1LDcgKzQ4NSw3IEBACiAgICAgICogdG8gb3BlcmF0ZSAoc3VjaCBhcyBmb3IgcmVjZWl2aW5nIGlucHV0IGV2ZW50cykuICBUaGUgZ2l2ZW4gU3VyZmFjZUhvbGRlcgogICAgICAqIGNhbGxiYWNrIHdpbGwgYmUgdXNlZCB0byB0ZWxsIHlvdSBhYm91dCBzdGF0ZSBjaGFuZ2VzIHRvIHRoZSBzdXJmYWNlLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRha2VTdXJmYWNlKFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRha2VTdXJmYWNlKFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syIGNhbGxiYWNrKTsKICAgICAKICAgICAvKioKICAgICAgKiBUYWtlIG93bmVyc2hpcCBvZiB0aGlzIHdpbmRvdydzIElucHV0UXVldWUuICBUaGUgd2luZG93IHdpbGwgbm8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlclBvbGljeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyUG9saWN5LmphdmEKaW5kZXggYmUxZjZkMi4uMzM3NTdmMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyUG9saWN5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyUG9saWN5LmphdmEKQEAgLTc4LDEyICs3OCw2IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRkxBR19CUklHSFRfSEVSRSA9IDB4MjAwMDAwMDA7CiAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gV0FUQ0hfUE9JTlRFUiA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIFRlbXBvcmFyeSBmbGFnIGFkZGVkIGR1cmluZyB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG5hdGl2ZSBpbnB1dCBkaXNwYXRjaGVyLgotICAgICAqIFRoaXMgd2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlIG9sZCBpbnB1dCBkaXNwYXRjaCBjb2RlIGlzIGRlbGV0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0ggPSB0cnVlOwogCiAgICAgLy8gZmxhZ3MgZm9yIGludGVyY2VwdEtleVRxCiAgICAgLyoqCkBAIC01NTUsMjMgKzU0OSwyNiBAQAogICAgIHB1YmxpYyBBbmltYXRpb24gY3JlYXRlRm9yY2VIaWRlRW50ZXJBbmltYXRpb24oKTsKICAgICAKICAgICAvKioKLSAgICAgKiBDYWxsZWQgZnJvbSB0aGUga2V5IHF1ZXVlIHRocmVhZCBiZWZvcmUgYSBrZXkgaXMgZGlzcGF0Y2hlZCB0byB0aGUKLSAgICAgKiBpbnB1dCB0aHJlYWQuCisgICAgICogQ2FsbGVkIGZyb20gdGhlIGlucHV0IHJlYWRlciB0aHJlYWQgYmVmb3JlIGEga2V5IGlzIGVucXVldWVkLgogICAgICAqCiAgICAgICogPHA+VGhlcmUgYXJlIHNvbWUgYWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlIGJlY2F1c2UgdGhleQogICAgICAqIGFmZmVjdCB0aGUgcG93ZXIgc3RhdGUgb2YgdGhlIGRldmljZSwgZm9yIGV4YW1wbGUsIHRoZSBwb3dlciBrZXlzLgogICAgICAqIEdlbmVyYWxseSwgaXQncyBiZXN0IHRvIGtlZXAgYXMgbGl0dGxlIGFzIHBvc3NpYmxlIGluIHRoZSBxdWV1ZSB0aHJlYWQKICAgICAgKiBiZWNhdXNlIGl0J3MgdGhlIG1vc3QgZnJhZ2lsZS4KKyAgICAgKiBAcGFyYW0gd2hlbk5hbm9zIFRoZSBldmVudCB0aW1lIGluIHVwdGltZSBuYW5vc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0ga2V5Q29kZSBUaGUga2V5IGNvZGUuCisgICAgICogQHBhcmFtIGRvd24gVHJ1ZSBpZiB0aGUga2V5IGlzIGRvd24uCisgICAgICogQHBhcmFtIHBvbGljeUZsYWdzIFRoZSBwb2xpY3kgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCisgICAgICogQHBhcmFtIGlzU2NyZWVuT24gVHJ1ZSBpZiB0aGUgc2NyZWVuIGlzIGFscmVhZHkgb24KICAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCB0aGUgcmF3IGlucHV0IGV2ZW50IGFzIHJlYWQgZnJvbSB0aGUgZHJpdmVyCi0gICAgICogQHBhcmFtIHNjcmVlbklzT24gdHJ1ZSBpZiB0aGUgc2NyZWVuIGlzIGFscmVhZHkgb24KICAgICAgKiBAcmV0dXJuIFRoZSBiaXR3aXNlIG9yIG9mIHRoZSB7QGxpbmsgI0FDVElPTl9QQVNTX1RPX1VTRVJ9LAogICAgICAqICAgICAgICAgIHtAbGluayAjQUNUSU9OX1BPS0VfVVNFUl9BQ1RJVklUWX0gYW5kIHtAbGluayAjQUNUSU9OX0dPX1RPX1NMRUVQfSBmbGFncy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGludGVyY2VwdEtleVRxKFJhd0lucHV0RXZlbnQgZXZlbnQsIGJvb2xlYW4gc2NyZWVuSXNPbik7CisgICAgcHVibGljIGludCBpbnRlcmNlcHRLZXlCZWZvcmVRdWV1ZWluZyhsb25nIHdoZW5OYW5vcywgaW50IGtleUNvZGUsIGJvb2xlYW4gZG93biwgaW50IHBvbGljeUZsYWdzLAorICAgICAgICAgICAgYm9vbGVhbiBpc1NjcmVlbk9uKTsKICAgICAKICAgICAvKioKLSAgICAgKiBDYWxsZWQgZnJvbSB0aGUgaW5wdXQgdGhyZWFkIGJlZm9yZSBhIGtleSBpcyBkaXNwYXRjaGVkIHRvIGEgd2luZG93LgorICAgICAqIENhbGxlZCBmcm9tIHRoZSBpbnB1dCBkaXNwYXRjaGVyIHRocmVhZCBiZWZvcmUgYSBrZXkgaXMgZGlzcGF0Y2hlZCB0byBhIHdpbmRvdy4KICAgICAgKgogICAgICAqIDxwPkFsbG93cyB5b3UgdG8gZGVmaW5lCiAgICAgICogYmVoYXZpb3IgZm9yIGtleXMgdGhhdCBjYW4gbm90IGJlIG92ZXJyaWRkZW4gYnkgYXBwbGljYXRpb25zIG9yIHJlZGlyZWN0CkBAIC01ODMsMTYgKzU4MCwxNyBAQAogICAgICAqIAogICAgICAqIEBwYXJhbSB3aW4gVGhlIHdpbmRvdyB0aGF0IGN1cnJlbnRseSBoYXMgZm9jdXMuICBUaGlzIGlzIHdoZXJlIHRoZSBrZXkKICAgICAgKiAgICAgICAgICAgIGV2ZW50IHdpbGwgbm9ybWFsbHkgZ28uCi0gICAgICogQHBhcmFtIGNvZGUgS2V5IGNvZGUuCi0gICAgICogQHBhcmFtIG1ldGFLZXlzIGJpdCBtYXNrIG9mIG1ldGEga2V5cyB0aGF0IGFyZSBoZWxkLgotICAgICAqIEBwYXJhbSBkb3duIElzIHRoaXMgYSBrZXkgcHJlc3MgKHRydWUpIG9yIHJlbGVhc2UgKGZhbHNlKT8KKyAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBrZXkgZXZlbnQgYWN0aW9uLgorICAgICAqIEBwYXJhbSBmbGFncyBUaGUga2V5IGV2ZW50IGZsYWdzLgorICAgICAqIEBwYXJhbSBrZXlDb2RlIFRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gbWV0YVN0YXRlIGJpdCBtYXNrIG9mIG1ldGEga2V5cyB0aGF0IGFyZSBoZWxkLgogICAgICAqIEBwYXJhbSByZXBlYXRDb3VudCBOdW1iZXIgb2YgdGltZXMgYSBrZXkgZG93biBoYXMgcmVwZWF0ZWQuCi0gICAgICogQHBhcmFtIGZsYWdzIGV2ZW50J3MgZmxhZ3MuCisgICAgICogQHBhcmFtIHBvbGljeUZsYWdzIFRoZSBwb2xpY3kgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHBvbGljeSBjb25zdW1lZCB0aGUgZXZlbnQgYW5kIGl0IHNob3VsZAogICAgICAqIG5vdCBiZSBmdXJ0aGVyIGRpc3BhdGNoZWQuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaW50ZXJjZXB0S2V5VGkoV2luZG93U3RhdGUgd2luLCBpbnQgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0YUtleXMsIGJvb2xlYW4gZG93biwgaW50IHJlcGVhdENvdW50LCBpbnQgZmxhZ3MpOworICAgIHB1YmxpYyBib29sZWFuIGludGVyY2VwdEtleUJlZm9yZURpc3BhdGNoaW5nKFdpbmRvd1N0YXRlIHdpbiwgaW50IGFjdGlvbiwgaW50IGZsYWdzLAorICAgICAgICAgICAgaW50IGtleUNvZGUsIGludCBtZXRhU3RhdGUsIGludCByZXBlYXRDb3VudCwgaW50IHBvbGljeUZsYWdzKTsKIAogICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIGxheW91dCBvZiB0aGUgd2luZG93cyBpcyBhYm91dCB0byBzdGFydC4KQEAgLTcwMSw4NSArNjk5LDE1IEBACiAgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHNjcmVlbiBpcyBjdXJyZW50bHkgb24uCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTY3JlZW5PbigpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogUGVyZm9ybSBhbnkgaW5pdGlhbCBwcm9jZXNzaW5nIG9mIGEgbG93LWxldmVsIGlucHV0IGV2ZW50IGJlZm9yZSB0aGUKLSAgICAgKiB3aW5kb3cgbWFuYWdlciBoYW5kbGVzIHNwZWNpYWwga2V5cyBhbmQgZ2VuZXJhdGVzIGEgaGlnaC1sZXZlbCBldmVudAotICAgICAqIHRoYXQgaXMgZGlzcGF0Y2hlZCB0byB0aGUgYXBwbGljYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IFRoZSBpbnB1dCBldmVudCB0aGF0IGhhcyBvY2N1cnJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFJldHVybiB0cnVlIGlmIHlvdSBoYXZlIGNvbnN1bWVkIHRoZSBldmVudCBhbmQgZG8gbm90IHdhbnQKLSAgICAgKiBmdXJ0aGVyIHByb2Nlc3NpbmcgdG8gb2NjdXI7IHJldHVybiBmYWxzZSBmb3Igbm9ybWFsIHByb2Nlc3NpbmcuCisgICAgICogVGVsbCB0aGUgcG9saWN5IHRoYXQgdGhlIGxpZCBzd2l0Y2ggaGFzIGNoYW5nZWQgc3RhdGUuCisgICAgICogQHBhcmFtIHdoZW5OYW5vcyBUaGUgdGltZSB3aGVuIHRoZSBjaGFuZ2Ugb2NjdXJyZWQgaW4gdXB0aW1lIG5hbm9zZWNvbmRzLgorICAgICAqIEBwYXJhbSBsaWRPcGVuIFRydWUgaWYgdGhlIGxpZCBpcyBub3cgb3Blbi4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwcmVwcm9jZXNzSW5wdXRFdmVudFRxKFJhd0lucHV0RXZlbnQgZXZlbnQpOwotICAgIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUxpZFN3aXRjaENoYW5nZWQobG9uZyB3aGVuTmFub3MsIGJvb2xlYW4gbGlkT3Blbik7CiAgICAgCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBrZXkgY29kZSBpcyB1c2VkIHRvIGNhdXNlIGFuIGFwcCBzd2l0Y2gKLSAgICAgKiB0byBvY2N1ciAobW9zdCBvZnRlbiB0aGUgSE9NRSBrZXksIGFsc28gb2Z0ZW4gRU5EQ0FMTCkuICBJZiB5b3UgcmV0dXJuCi0gICAgICogdHJ1ZSwgdGhlbiB0aGUgc3lzdGVtIHdpbGwgZ28gaW50byBhIHNwZWNpYWwga2V5IHByb2Nlc3Npbmcgc3RhdGUKLSAgICAgKiB3aGVyZSBpdCBkcm9wcyBhbnkgcGVuZGluZyBldmVudHMgdGhhdCBpdCBjYW5zIGFuZCBhZGp1c3RzIHRpbWVvdXRzIHRvCi0gICAgICogdHJ5IHRvIGdldCB0byB0aGlzIGtleSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLgotICAgICAqIAotICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBsb3ctbGV2ZWwgaW5wdXQgcXVldWUKLSAgICAgKiB0aHJlYWQsIHdpdGggZWl0aGVyL29yIHRoZSB3aW5kb3cgb3IgaW5wdXQgbG9jayBoZWxkOyBiZSB2ZXJ5IGNhcmVmdWwKLSAgICAgKiBhYm91dCB3aGF0IHlvdSBkbyBoZXJlLiAgWW91IGFic29sdXRlbHkgc2hvdWxkIG5ldmVyIGFjcXVpcmUgYSBsb2NrCi0gICAgICogdGhhdCB5b3Ugd291bGQgZXZlciBob2xkIGVsc2V3aGVyZSB3aGlsZSBjYWxsaW5nIG91dCBpbnRvIHRoZSB3aW5kb3cKLSAgICAgKiBtYW5hZ2VyIG9yIHZpZXcgaGllcmFyY2h5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXljb2RlIFRoZSBrZXkgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgcGVyZm9ybWluZyBhbgotICAgICAqIGFwcCBzd2l0Y2ggYmVmb3JlIGRlbGl2ZXJpbmcgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBhcHAgc3dpdGNoIGtleSBhbmQgc3BlY2lhbCBwcm9jZXNzaW5nCi0gICAgICogc2hvdWxkIGhhcHBlbjsgcmV0dXJuIGZhbHNlIGZvciBub3JtYWwgcHJvY2Vzc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcFN3aXRjaEtleVRxVGlMd0xpKGludCBrZXljb2RlKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIGtleSBjb2RlIGlzIHVzZWQgZm9yIG1vdmVtZW50IHdpdGhpbiBhIFVJLAotICAgICAqIGFuZCBkb2VzIG5vdCBnZW5lcmFsbHkgY2F1c2UgYWN0aW9ucyB0byBiZSBwZXJmb3JtZWQgKG5vcm1hbGx5IHRoZSBEUEFECi0gICAgICogbW92ZW1lbnQga2V5cywgTk9UIHRoZSBEUEFEIGNlbnRlciBwcmVzcyBrZXkpLiAgVGhpcyBpcyBjYWxsZWQKLSAgICAgKiB3aGVuIHtAbGluayAjaXNBcHBTd2l0Y2hLZXlUaUxpfSByZXR1cm5zIHRydWUgdG8gcmVtb3ZlIGFueSBwZW5kaW5nIGV2ZW50cwotICAgICAqIGluIHRoZSBrZXkgcXVldWUgdGhhdCBhcmUgbm90IG5lZWRlZCB0byBzd2l0Y2ggYXBwbGljYXRpb25zLgotICAgICAqIAotICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBsb3ctbGV2ZWwgaW5wdXQgcXVldWUKLSAgICAgKiB0aHJlYWQ7IGJlIHZlcnkgY2FyZWZ1bCBhYm91dCB3aGF0IHlvdSBkbyBoZXJlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXljb2RlIFRoZSBrZXkgdGhhdCBpcyB3YWl0aW5nIHRvIGJlIGRlbGl2ZXJlZCB0byB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBwdXJlbHkgbmF2aWdhdGlvbiBrZXkgYW5kIGNhbiBiZQotICAgICAqIGRyb3BwZWQgd2l0aG91dCBuZWdhdGl2ZSBjb25zZXF1ZW5jZXM7IHJldHVybiBmYWxzZSB0byBrZWVwIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTW92ZW1lbnRLZXlUaShpbnQga2V5Y29kZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdvcmxkLCBzaG91bGQgdGhpcyByZWxhdGl2ZSBtb3ZlbWVudAotICAgICAqIHdha2UgdXAgdGhlIGRldmljZT8KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgdGhlIG1vdmVtZW50IGNhbWUgZnJvbS4KLSAgICAgKiBAcGFyYW0gY2xhc3NlcyBUaGUgaW5wdXQgY2xhc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGlucHV0IGV2ZW50IHRoYXQgb2NjdXJyZWQuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzV2FrZVJlbE1vdmVtZW50VHEoaW50IGRldmljZSwgaW50IGNsYXNzZXMsCi0gICAgICAgICAgICBSYXdJbnB1dEV2ZW50IGV2ZW50KTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHaXZlbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgd29ybGQsIHNob3VsZCB0aGlzIGFic29sdXRlIG1vdmVtZW50Ci0gICAgICogd2FrZSB1cCB0aGUgZGV2aWNlPwotICAgICAqIAotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIGRldmljZSB0aGUgbW92ZW1lbnQgY2FtZSBmcm9tLgotICAgICAqIEBwYXJhbSBjbGFzc2VzIFRoZSBpbnB1dCBjbGFzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgaW5wdXQgZXZlbnQgdGhhdCBvY2N1cnJlZC4KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNXYWtlQWJzTW92ZW1lbnRUcShpbnQgZGV2aWNlLCBpbnQgY2xhc3NlcywKLSAgICAgICAgICAgIFJhd0lucHV0RXZlbnQgZXZlbnQpOwotICAgIAotICAgIC8qKgogICAgICAqIFRlbGwgdGhlIHBvbGljeSBpZiBhbnlvbmUgaXMgcmVxdWVzdGluZyB0aGF0IGtleWd1YXJkIG5vdCBjb21lIG9uLgogICAgICAqCiAgICAgICogQHBhcmFtIGVuYWJsZWQgV2hldGhlciBrZXlndWFyZCBjYW4gYmUgb24gb3Igbm90LiAgZG9lcyBub3QgYWN0dWFsbHkKQEAgLTg1MiwxOCArNzgwLDYgQEAKICAgICBwdWJsaWMgdm9pZCBlbmFibGVTY3JlZW5BZnRlckJvb3QoKTsKICAgICAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVzZXIncyBjaGVlayBoYXMgYmVlbiBwcmVzc2VkIGFnYWluc3QgdGhlIHBob25lLiBUaGlzIGlzIAotICAgICAqIGRldGVybWluZWQgYnkgY29tcGFyaW5nIHRoZSBldmVudCdzIHNpemUgYXR0cmlidXRlIHdpdGggYSB0aHJlc2hvbGQgdmFsdWUuCi0gICAgICogRm9yIGV4YW1wbGUgZm9yIGEgbW90aW9uIGV2ZW50IGxpa2UgZG93biBvciB1cCBvciBtb3ZlLCBpZiB0aGUgc2l6ZSBleGNlZWRzCi0gICAgICogdGhlIHRocmVzaG9sZCwgaXQgaXMgY29uc2lkZXJlZCBhcyBjaGVlayBwcmVzcy4KLSAgICAgKiBAcGFyYW0gZXYgdGhlIG1vdGlvbiBldmVudCBnZW5lcmF0ZWQgd2hlbiB0aGUgY2hlZWsgaXMgcHJlc3NlZCAKLSAgICAgKiBhZ2FpbnN0IHRoZSBwaG9uZQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSB1c2VyJ3MgY2hlZWsgaGFzIGJlZW4gcHJlc3NlZCBhZ2FpbnN0IHRoZSBwaG9uZQotICAgICAqIHNjcmVlbiByZXN1bHRpbmcgaW4gYW4gaW52YWxpZCBtb3Rpb24gZXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWVrUHJlc3NlZEFnYWluc3RTY3JlZW4oTW90aW9uRXZlbnQgZXYpOwotICAgIAotICAgIC8qKgogICAgICAqIENhbGxlZCBldmVyeSB0aW1lIHRoZSB3aW5kb3cgbWFuYWdlciBpcyBkaXNwYXRjaGluZyBhIHBvaW50ZXIgZXZlbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hlZFBvaW50ZXJFdmVudEx3KE1vdGlvbkV2ZW50IGV2LCBpbnQgdGFyZ2V0WCwgaW50IHRhcmdldFkpOwpAQCAtODc2LDEzICs3OTIsNiBAQAogICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1IYXB0aWNGZWVkYmFja0x3KFdpbmRvd1N0YXRlIHdpbiwgaW50IGVmZmVjdElkLCBib29sZWFuIGFsd2F5cyk7CiAgICAgCiAgICAgLyoqCi0gICAgICogQSBzcGVjaWFsIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGZyb20gdGhlIHZlcnkgbG93LWxldmVsIGlucHV0IHF1ZXVlCi0gICAgICogdG8gcHJvdmlkZSBmZWVkYmFjayB0byB0aGUgdXNlci4gIEN1cnJlbnRseSBvbmx5IGNhbGxlZCBmb3IgdmlydHVhbAotICAgICAqIGtleXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQga2V5RmVlZGJhY2tGcm9tSW5wdXQoS2V5RXZlbnQgZXZlbnQpOwotICAgIAotICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIHdlIGhhdmUgc3RvcHBlZCBrZWVwaW5nIHRoZSBzY3JlZW4gb24gYmVjYXVzZSBhIHdpbmRvdwogICAgICAqIHJlcXVlc3RpbmcgdGhpcyBpcyBubyBsb25nZXIgdmlzaWJsZS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQppbmRleCA3YjFhYWIyLi5iMDIxZGVkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCkBAIC0zMDEsNiArMzAxLDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmcmFtZSBhcyBhIHdlYiBhcmNoaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VuYW1lIFRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqIEBwYXJhbSBhdXRvbmFtZSBJZiBmYWxzZSwgdGFrZXMgZmlsZW5hbWUgdG8gYmUgYSBmaWxlLiBJZiB0cnVlLCBmaWxlbmFtZQorICAgICAqICAgICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGJlIGEgZGlyZWN0b3J5IGluIHdoaWNoIGEgZmlsZW5hbWUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBjaG9zZW4gYWNjb3JkaW5nIHRvIHRoZSB1cmwgb2YgdGhlIGN1cnJlbnQgcGFnZS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFN0cmluZyBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgYmFzZW5hbWUsIGJvb2xlYW4gYXV0b25hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZVNhdmVXZWJBcmNoaXZlKGJhc2VuYW1lLCBhdXRvbmFtZSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogR28gYmFjayBvciBmb3J3YXJkIHRoZSBudW1iZXIgb2Ygc3RlcHMgZ2l2ZW4uCiAgICAgICogQHBhcmFtIHN0ZXBzIEEgbmVnYXRpdmUgb3IgcG9zaXRpdmUgbnVtYmVyIGluZGljYXRpbmcgdGhlIGRpcmVjdGlvbgogICAgICAqICAgICAgICAgICAgICBhbmQgbnVtYmVyIG9mIHN0ZXBzIHRvIG1vdmUuCkBAIC0xMDQwLDUgKzEwNTIsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIEhhc2hNYXAgZ2V0Rm9ybVRleHREYXRhKCk7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlU2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lKTsKKwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT3JpZW50YXRpb25DaGFuZ2VkKGludCBvcmllbnRhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQppbmRleCAxNWZmZmZkLi4xYjU2NTFiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKQEAgLTEyMjIsOSArMTIyMiw3IEBACiAgICAgICAgIC8vIGZvciBudWxsLgogICAgICAgICBXZWJIaXN0b3J5SXRlbSBpID0gbUJhY2tGb3J3YXJkTGlzdC5nZXRDdXJyZW50SXRlbSgpOwogICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHJlY29tcG9zZWQgfHwgaS5nZXRUb3VjaEljb25VcmwoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaS5zZXRUb3VjaEljb25VcmwodXJsKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkuc2V0VG91Y2hJY29uVXJsKHVybCwgcHJlY29tcG9zZWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIERvIGFuIHVuc3luY2hyb25pemVkIHF1aWNrIGNoZWNrIHRvIGF2b2lkIHBvc3RpbmcgaWYgbm8gY2FsbGJhY2sgaGFzCiAgICAgICAgIC8vIGJlZW4gc2V0LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhCmluZGV4IDE4M2IzYzAuLjkxZGUxZDggMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEKQEAgLTQ1LDE0ICs0NSwxMyBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBmcm9tIHdoaWNoIHdlIG9idGFpbiB0aGUgc3lzdGVtIHNlcnZpY2UuCiAgICAgICogQHBhcmFtIG5hdGl2ZU9iamVjdCBUaGUgbmF0aXZlIG9iamVjdCB0byB3aGljaCB0aGlzIG9iamVjdCB3aWxsIHJlcG9ydCBwb3NpdGlvbiB1cGRhdGVzIGFuZAogICAgICAqICAgICBlcnJvcnMuCiAgICAgICovCi0gICAgcHVibGljIEdlb2xvY2F0aW9uU2VydmljZShsb25nIG5hdGl2ZU9iamVjdCkgeworICAgIHB1YmxpYyBHZW9sb2NhdGlvblNlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBsb25nIG5hdGl2ZU9iamVjdCkgewogICAgICAgICBtTmF0aXZlT2JqZWN0ID0gbmF0aXZlT2JqZWN0OwogICAgICAgICAvLyBSZWdpc3RlciBuZXdMb2NhdGlvbkF2YWlsYWJsZSB3aXRoIHBsYXRmb3JtIHNlcnZpY2UuCi0gICAgICAgIEFjdGl2aXR5VGhyZWFkIHRocmVhZCA9IEFjdGl2aXR5VGhyZWFkLnN5c3RlbU1haW4oKTsKLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gdGhyZWFkLmdldEFwcGxpY2F0aW9uKCk7CiAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIgPSAoTG9jYXRpb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MT0NBVElPTl9TRVJWSUNFKTsKICAgICAgICAgaWYgKG1Mb2NhdGlvbk1hbmFnZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGdldCBsb2NhdGlvbiBtYW5hZ2VyLiIpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L01pbWVUeXBlTWFwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQppbmRleCBjMWFjMTgwLi42ZTljNzBhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQpAQCAtMzYzLDYgKzM2Myw3IEBACiAgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlIiwgInNyYyIpOwogICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13aW5neiIsICJ3eiIpOwogICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13ZWJhcmNoaXZlIiwgIndlYmFyY2hpdmUiKTsKKyAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtd2ViYXJjaGl2ZS14bWwiLCAid2ViYXJjaGl2ZXhtbCIpOwogICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQiLCAiY3J0Iik7CiAgICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXg1MDktdXNlci1jZXJ0IiwgImNydCIpOwogICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC14Y2YiLCAieGNmIik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJIaXN0b3J5SXRlbS5qYXZhCmluZGV4IDQyOGE1OWMuLjdjMGU0NzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJIaXN0b3J5SXRlbS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJIaXN0b3J5SXRlbS5qYXZhCkBAIC0xOCw2ICsxOCw5IEBACiAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIAoraW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKIC8qKgogICogQSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgYWNjZXNzaW5nIGZpZWxkcyBpbiBhbiBlbnRyeSBpbiB0aGUgYmFjay9mb3J3YXJkIGxpc3QKICAqIG9mIGEgV2ViVmlldy4gRWFjaCBXZWJIaXN0b3J5SXRlbSBpcyBhIHNuYXBzaG90IG9mIHRoZSByZXF1ZXN0ZWQgaGlzdG9yeQpAQCAtMzksOCArNDIsMTIgQEAKICAgICBwcml2YXRlIEJpdG1hcCBtRmF2aWNvbjsKICAgICAvLyBUaGUgcHJlLWZsYXR0ZW5lZCBkYXRhIHVzZWQgZm9yIHNhdmluZyB0aGUgc3RhdGUuCiAgICAgcHJpdmF0ZSBieXRlW10gbUZsYXR0ZW5lZERhdGE7Ci0gICAgLy8gVGhlIGFwcGxlLXRvdWNoLWljb24gdXJsIGZvciB1c2Ugd2hlbiBhZGRpbmcgdGhlIHNpdGUgdG8gdGhlIGhvbWUgc2NyZWVuCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRvdWNoSWNvblVybDsKKyAgICAvLyBUaGUgYXBwbGUtdG91Y2gtaWNvbiB1cmwgZm9yIHVzZSB3aGVuIGFkZGluZyB0aGUgc2l0ZSB0byB0aGUgaG9tZSBzY3JlZW4sCisgICAgLy8gYXMgb2J0YWluZWQgZnJvbSBhIDxsaW5rPiBlbGVtZW50IGluIHRoZSBwYWdlLgorICAgIHByaXZhdGUgU3RyaW5nIG1Ub3VjaEljb25VcmxGcm9tTGluazsKKyAgICAvLyBJZiBubyA8bGluaz4gaXMgc3BlY2lmaWVkLCB0aGlzIGhvbGRzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZQorICAgIC8vIGFwcGxlLXRvdWNoLWljb24uCisgICAgcHJpdmF0ZSBTdHJpbmcgbVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQ7CiAgICAgLy8gQ3VzdG9tIGNsaWVudCBkYXRhIHRoYXQgaXMgbm90IGZsYXR0ZW5lZCBvciByZWFkIGJ5IG5hdGl2ZSBjb2RlLgogICAgIHByaXZhdGUgT2JqZWN0IG1DdXN0b21EYXRhOwogCkBAIC0xMzIsMTAgKzEzOSwyOCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSB0b3VjaCBpY29uIHVybC4KKyAgICAgKiBJZiBubyB0b3VjaCBpY29uIDxsaW5rPiB0YWcgd2FzIHNwZWNpZmllZCwgcmV0dXJucworICAgICAqIDxob3N0Pi9hcHBsZS10b3VjaC1pY29uLnBuZy4gVGhlIERvd25sb2FkVG91Y2hJY29uIGNsYXNzIHRoYXQKKyAgICAgKiBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGUgdG91Y2ggaWNvbiB3aWxsIGhhbmRsZSB0aGUgY2FzZSB3aGVyZQorICAgICAqIHRoYXQgZmlsZSBkb2VzIG5vdCBleGlzdC4gQW4gaWNvbiBzZXQgYnkgYSA8bGluaz4gdGFnIGlzIGFsd2F5cworICAgICAqIHVzZWQgaW4gcHJlZmVyZW5jZSB0byBhbiBpY29uIHNhdmVkIG9uIHRoZSBzZXJ2ZXIuCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFRvdWNoSWNvblVybCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ub3VjaEljb25Vcmw7CisgICAgICAgIGlmIChtVG91Y2hJY29uVXJsRnJvbUxpbmsgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ub3VjaEljb25VcmxGcm9tTGluazsKKyAgICAgICAgfSBlbHNlIGlmIChtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQ7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwobU9yaWdpbmFsVXJsKTsKKyAgICAgICAgICAgIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0ID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgIi9hcHBsZS10b3VjaC1pY29uLnBuZyIpLnRvU3RyaW5nKCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzEsMTEgKzE5NiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgdG91Y2ggaWNvbiB1cmwuCisgICAgICogU2V0IHRoZSB0b3VjaCBpY29uIHVybC4gV2lsbCBub3Qgb3ZlcndyaXRlIGFuIGljb24gdGhhdCBoYXMgYmVlbgorICAgICAqIHNldCBhbHJlYWR5IGZyb20gYSA8bGluaz4gdGFnLCB1bmxlc3MgdGhlIG5ldyBpY29uIGlzIHByZWNvbXBvc2VkLgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgLypwYWNrYWdlKi8gdm9pZCBzZXRUb3VjaEljb25VcmwoU3RyaW5nIHVybCkgewotICAgICAgICBtVG91Y2hJY29uVXJsID0gdXJsOworICAgIC8qcGFja2FnZSovIHZvaWQgc2V0VG91Y2hJY29uVXJsKFN0cmluZyB1cmwsIGJvb2xlYW4gcHJlY29tcG9zZWQpIHsKKyAgICAgICAgaWYgKHByZWNvbXBvc2VkIHx8IG1Ub3VjaEljb25VcmxGcm9tTGluayA9PSBudWxsKSB7CisgICAgICAgICAgICBtVG91Y2hJY29uVXJsRnJvbUxpbmsgPSB1cmw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCmluZGV4IDIxZTdiNjMuLjBjOGZjNzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQpAQCAtMjIsMTQgKzIyLDE1IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvcm5lclBhdGhFZmZlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludEZsYWdzRHJhd0ZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CkBAIC00NTQsMTAgKzQ1NSw2IEBACiAgICAgLy8gdHJ1ZSBpZiBvblBhdXNlIGhhcyBiZWVuIGNhbGxlZCAoYW5kIG5vdCBvblJlc3VtZSkKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzUGF1c2VkOwogCi0gICAgLy8gdHJ1ZSBpZiwgZHVyaW5nIGEgdHJhbnNpdGlvbiB0byBhIG5ldyBwYWdlLCB3ZSdyZSBkZWxheWluZwotICAgIC8vIGRlbGV0aW5nIGEgcm9vdCBsYXllciB1bnRpbCB0aGVyZSdzIHNvbWV0aGluZyB0byBkcmF3IG9mIHRoZSBuZXcgcGFnZS4KLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGF5ZWREZWxldGVSb290TGF5ZXI7Ci0KICAgICAvKioKICAgICAgKiBDdXN0b21pemFibGUgY29uc3RhbnQKICAgICAgKi8KQEAgLTU4NCw4ICs1ODEsOCBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19GVUxMU0NSRUVOICAgICAgICAgICAgICAgICAgICA9IDEyMDsKICAgICBzdGF0aWMgZmluYWwgaW50IEhJREVfRlVMTFNDUkVFTiAgICAgICAgICAgICAgICAgICAgPSAxMjE7CiAgICAgc3RhdGljIGZpbmFsIGludCBET01fRk9DVVNfQ0hBTkdFRCAgICAgICAgICAgICAgICAgID0gMTIyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgSU1NRURJQVRFX1JFUEFJTlRfTVNHX0lEICAgICAgICAgICA9IDEyMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9ST09UX0xBWUVSX01TR19JRCAgICAgICAgICAgICAgPSAxMjQ7CisgICAgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0JBU0VfQ09OVEVOVCAgICAgICAgICAgICAgID0gMTIzOworICAgIC8vIDEyNDsKICAgICBzdGF0aWMgZmluYWwgaW50IFJFVFVSTl9MQUJFTCAgICAgICAgICAgICAgICAgICAgICAgPSAxMjU7CiAgICAgc3RhdGljIGZpbmFsIGludCBGSU5EX0FHQUlOICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI2OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSX0ZJVF9SRUNUICAgICAgICAgICAgICAgICAgICA9IDEyNzsKQEAgLTU5Myw2ICs1OTAsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1NDUk9MTEJBUl9NT0RFUyAgICAgICAgICAgICAgICA9IDEyOTsKICAgICBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRCAgICAgICAgICAgPSAxMzA7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTICAgICAgICAgID0gMTMxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9XRUJBUkNISVZFX0ZJTklTSEVEICAgICAgICAgICA9IDEzMjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9QQUNLQUdFX01TR19JRCA9IFNDUk9MTF9UT19NU0dfSUQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfUEFDS0FHRV9NU0dfSUQgPSBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOwpAQCAtNjMzLDE1ICs2MzEsMTYgQEAKICAgICAgICAgIlNIT1dfRlVMTFNDUkVFTiIsIC8vICAgICAgICAgICAgICAgID0gMTIwOwogICAgICAgICAiSElERV9GVUxMU0NSRUVOIiwgLy8gICAgICAgICAgICAgICAgPSAxMjE7CiAgICAgICAgICJET01fRk9DVVNfQ0hBTkdFRCIsIC8vICAgICAgICAgICAgICA9IDEyMjsKLSAgICAgICAgIklNTUVESUFURV9SRVBBSU5UX01TR19JRCIsIC8vICAgICAgID0gMTIzOwotICAgICAgICAiU0VUX1JPT1RfTEFZRVJfTVNHX0lEIiwgLy8gICAgICAgICAgPSAxMjQ7CisgICAgICAgICJSRVBMQUNFX0JBU0VfQ09OVEVOVCIsIC8vICAgICAgICAgICA9IDEyMzsKKyAgICAgICAgIjEyNCIsIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI0OwogICAgICAgICAiUkVUVVJOX0xBQkVMIiwgLy8gICAgICAgICAgICAgICAgICAgPSAxMjU7CiAgICAgICAgICJGSU5EX0FHQUlOIiwgLy8gICAgICAgICAgICAgICAgICAgICA9IDEyNjsKICAgICAgICAgIkNFTlRFUl9GSVRfUkVDVCIsIC8vICAgICAgICAgICAgICAgID0gMTI3OwogICAgICAgICAiUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQiLCAvLyA9IDEyODsKICAgICAgICAgIlNFVF9TQ1JPTExCQVJfTU9ERVMiLCAvLyAgICAgICAgICAgID0gMTI5OwogICAgICAgICAiU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEIiwgLy8gICAgICAgPSAxMzA7Ci0gICAgICAgICJTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTIiAvLyAgICAgICA9IDEzMTsKKyAgICAgICAgIlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMiLCAvLyAgICAgID0gMTMxOworICAgICAgICAiU0FWRV9XRUJBUkNISVZFX0ZJTklTSEVEIiAvLyAgICAgICAgPSAxMzI7CiAgICAgfTsKIAogICAgIC8vIElmIHRoZSBzaXRlIGRvZXNuJ3QgdXNlIHRoZSB2aWV3cG9ydCBtZXRhIHRhZyB0byBzcGVjaWZ5IHRoZSB2aWV3cG9ydCwKQEAgLTE1MjMsNiArMTUyMiw0NSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHZpZXcgYXMgYSB3ZWIgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgZmlsZW5hbWUgd2hlcmUgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgc2F2ZVdlYkFyY2hpdmUoZmlsZW5hbWUsIGZhbHNlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UgeworICAgICAgICBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UgKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSwgVmFsdWVDYWxsYmFjazxTdHJpbmc+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQmFzZW5hbWUgPSBiYXNlbmFtZTsKKyAgICAgICAgICAgIG1BdXRvbmFtZSA9IGF1dG9uYW1lOworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICAvKiBwYWNrYWdlICovIGZpbmFsIFN0cmluZyBtQmFzZW5hbWU7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgYm9vbGVhbiBtQXV0b25hbWU7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgVmFsdWVDYWxsYmFjazxTdHJpbmc+IG1DYWxsYmFjazsKKyAgICAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgbVJlc3VsdEZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgdmlldyBhcyBhIHdlYiBhcmNoaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VuYW1lIFRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqIEBwYXJhbSBhdXRvbmFtZSBJZiBmYWxzZSwgdGFrZXMgYmFzZW5hbWUgdG8gYmUgYSBmaWxlLiBJZiB0cnVlLCBiYXNlbmFtZQorICAgICAqICAgICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGJlIGEgZGlyZWN0b3J5IGluIHdoaWNoIGEgZmlsZW5hbWUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBjaG9zZW4gYWNjb3JkaW5nIHRvIHRoZSB1cmwgb2YgdGhlIGN1cnJlbnQgcGFnZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHRoZSB3ZWIgYXJjaGl2ZSBoYXMgYmVlbiBzYXZlZC4gVGhlCisgICAgICogICAgICAgICAgICAgICAgIHBhcmFtZXRlciBmb3Igb25SZWNlaXZlVmFsdWUgd2lsbCBlaXRoZXIgYmUgdGhlIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICAgICAgIHVuZGVyIHdoaWNoIHRoZSBmaWxlIHdhcyBzYXZlZCwgb3IgbnVsbCBpZiBzYXZpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgIGZpbGUgZmFpbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSwgVmFsdWVDYWxsYmFjazxTdHJpbmc+IGNhbGxiYWNrKSB7CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TQVZFX1dFQkFSQ0hJVkUsCisgICAgICAgICAgICBuZXcgU2F2ZVdlYkFyY2hpdmVNZXNzYWdlKGJhc2VuYW1lLCBhdXRvbmFtZSwgY2FsbGJhY2spKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTdG9wIHRoZSBjdXJyZW50IGxvYWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoKSB7CkBAIC0xNjkxLDYgKzE3MjksNyBAQAogICAgIHB1YmxpYyB2b2lkIGNsZWFyVmlldygpIHsKICAgICAgICAgbUNvbnRlbnRXaWR0aCA9IDA7CiAgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gMDsKKyAgICAgICAgbmF0aXZlU2V0QmFzZUxheWVyKDApOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQ0xFQVJfQ09OVEVOVCk7CiAgICAgfQogCkBAIC0xNzA0LDggKzE3NDMsOSBAQAogICAgICAqICAgICAgICAgYm91bmRzIG9mIHRoZSB2aWV3LgogICAgICAqLwogICAgIHB1YmxpYyBQaWN0dXJlIGNhcHR1cmVQaWN0dXJlKCkgewotICAgICAgICBpZiAobnVsbCA9PSBtV2ViVmlld0NvcmUpIHJldHVybiBudWxsOyAvLyBjaGVjayBmb3Igb3V0IG9mIG1lbW9yeSB0YWIKLSAgICAgICAgcmV0dXJuIG1XZWJWaWV3Q29yZS5jb3B5Q29udGVudFBpY3R1cmUoKTsKKyAgICAgICAgUGljdHVyZSByZXN1bHQgPSBuZXcgUGljdHVyZSgpOworICAgICAgICBuYXRpdmVDb3B5QmFzZUNvbnRlbnRUb1BpY3R1cmUocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKQEAgLTIzMTQsNyArMjM1NCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSB0b3VjaCBpY29uIHVybCBmb3IgdGhlIGFwcGxlLXRvdWNoLWljb24gPGxpbms+IGVsZW1lbnQuCisgICAgICogR2V0IHRoZSB0b3VjaCBpY29uIHVybCBmb3IgdGhlIGFwcGxlLXRvdWNoLWljb24gPGxpbms+IGVsZW1lbnQsIG9yCisgICAgICogYSBVUkwgb24gdGhpcyBzaXRlJ3Mgc2VydmVyIHBvaW50aW5nIHRvIHRoZSBzdGFuZGFyZCBsb2NhdGlvbiBvZiBhCisgICAgICogdG91Y2ggaWNvbi4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG91Y2hJY29uVXJsKCkgewpAQCAtMzIzMCwxNiArMzI3Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZHJhd0V4dHJhcyhDYW52YXMgY2FudmFzLCBpbnQgZXh0cmFzLCBib29sZWFuIGFuaW1hdGlvbnNSdW5uaW5nKSB7Ci0gICAgICAgIC8vIElmIG1OYXRpdmVDbGFzcyBpcyAwLCB3ZSBzaG91bGQgbm90IHJlYWNoIGhlcmUsIHNvIHdlIGRvIG5vdAotICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIGl0IGFnYWluLgotICAgICAgICBpZiAoYW5pbWF0aW9uc1J1bm5pbmcpIHsKLSAgICAgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG1XZWJWaWV3Q29yZS5tWm9vbUZpbHRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgbmF0aXZlRHJhd0V4dHJhcyhjYW52YXMsIGV4dHJhcyk7Ci0gICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBvblpvb21BbmltYXRpb25TdGFydCgpIHsKICAgICAgICAgLy8gSWYgaXQgaXMgaW4gcGFzc3dvcmQgbW9kZSwgdHVybiBpdCBvZmYgc28gaXQgZG9lcyBub3QgZHJhdyBtaXNwbGFjZWQuCiAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKQEAgLTMyNjYsNiArMzI5OCwxOCBAQAogICAgICAgICBvblpvb21BbmltYXRpb25FbmQoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9CSVRTID0gUGFpbnQuRklMVEVSX0JJVE1BUF9GTEFHIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRElUSEVSX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5TVUJQSVhFTF9URVhUX0ZMQUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9CSVRTID0gUGFpbnQuRklMVEVSX0JJVE1BUF9GTEFHIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5ESVRIRVJfRkxBRzsKKworICAgIHByaXZhdGUgZmluYWwgRHJhd0ZpbHRlciBtWm9vbUZpbHRlciA9CisgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoWk9PTV9CSVRTLCBQYWludC5MSU5FQVJfVEVYVF9GTEFHKTsKKyAgICAvLyBJZiB3ZSBuZWVkIHRvIHRyYWRlIGJldHRlciBxdWFsaXR5IGZvciBzcGVlZCwgc2V0IG1TY3JvbGxGaWx0ZXIgdG8gbnVsbAorICAgIHByaXZhdGUgZmluYWwgRHJhd0ZpbHRlciBtU2Nyb2xsRmlsdGVyID0KKyAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihTQ1JPTExfQklUUywgMCk7CisKICAgICBwcml2YXRlIHZvaWQgZHJhd0NvcmVBbmRDdXJzb3JSaW5nKENhbnZhcyBjYW52YXMsIGludCBjb2xvciwKICAgICAgICAgYm9vbGVhbiBkcmF3Q3Vyc29yUmluZykgewogICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7CkBAIC0zMjczLDYgKzMzMTcsNyBAQAogICAgICAgICAgICAgY2FudmFzLmRyYXdQaWN0dXJlKG1IaXN0b3J5UGljdHVyZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm47CiAKICAgICAgICAgYm9vbGVhbiBhbmltYXRlWm9vbSA9IG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpOwogICAgICAgICBib29sZWFuIGFuaW1hdGVTY3JvbGwgPSAoKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpCkBAIC0zMzA3LDEwICszMzUyLDcgQEAKICAgICAgICAgICAgIC8vIHdlIGFzayBmb3IgYSByZXBhaW50LgogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICB9Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5kcmF3Q29udGVudFBpY3R1cmUoY2FudmFzLCBjb2xvciwKLSAgICAgICAgICAgICAgICAobVpvb21NYW5hZ2VyLmlzWm9vbUFuaW1hdGluZygpIHx8IFVJQW5pbWF0aW9uc1J1bm5pbmcpLAotICAgICAgICAgICAgICAgIGFuaW1hdGVTY3JvbGwpOwotICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybjsKKwogICAgICAgICAvLyBkZWNpZGUgd2hpY2ggYWRvcm5tZW50cyB0byBkcmF3CiAgICAgICAgIGludCBleHRyYXMgPSBEUkFXX0VYVFJBU19OT05FOwogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewpAQCAtMzMzMCw3ICszMzcyLDE4IEBACiAgICAgICAgIH0gZWxzZSBpZiAoZHJhd0N1cnNvclJpbmcpIHsKICAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX0NVUlNPUl9SSU5HOwogICAgICAgICB9Ci0gICAgICAgIGRyYXdFeHRyYXMoY2FudmFzLCBleHRyYXMsIFVJQW5pbWF0aW9uc1J1bm5pbmcpOworICAgICAgICBEcmF3RmlsdGVyIGRmID0gbnVsbDsKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1pvb21BbmltYXRpbmcoKSB8fCBVSUFuaW1hdGlvbnNSdW5uaW5nKSB7CisgICAgICAgICAgICBkZiA9IG1ab29tRmlsdGVyOworICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGVTY3JvbGwpIHsKKyAgICAgICAgICAgIGRmID0gbVNjcm9sbEZpbHRlcjsKKyAgICAgICAgfQorICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihkZik7CisgICAgICAgIGludCBjb250ZW50ID0gbmF0aXZlRHJhdyhjYW52YXMsIGNvbG9yLCBleHRyYXMsIHRydWUpOworICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihudWxsKTsKKyAgICAgICAgaWYgKGNvbnRlbnQgIT0gMCkgeworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNQTElUX1BJQ1RVUkVfU0VULCBjb250ZW50LCAwKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChleHRyYXMgPT0gRFJBV19FWFRSQVNfQ1VSU09SX1JJTkcpIHsKICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX1NIT1JUUFJFU1NfU1RBUlRfTU9ERSkgewpAQCAtMzM2Niw3ICszNDE5LDcgQEAKICAgICAvLyBTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gVUkgdGhyZWFkCiAgICAgdm9pZCBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpIHsKICAgICAgICAgaWYgKG51bGwgPT0gbVdlYlZpZXdDb3JlKSByZXR1cm47IC8vIENhbGxiYWNrUHJveHkgbWF5IHRyaWdnZXIgdGhpcwotICAgICAgICBpZiAobURyYXdIaXN0b3J5ICYmIG1XZWJWaWV3Q29yZS5waWN0dXJlUmVhZHkoKSkgeworICAgICAgICBpZiAobURyYXdIaXN0b3J5ICYmIChnZXRQcm9ncmVzcygpID09IDEwMCB8fCBuYXRpdmVIYXNDb250ZW50KCkpKSB7CiAgICAgICAgICAgICBtRHJhd0hpc3RvcnkgPSBmYWxzZTsKICAgICAgICAgICAgIG1IaXN0b3J5UGljdHVyZSA9IG51bGw7CiAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CkBAIC01NDU3LDEwICs1NTEwLDYgQEAKICAgICAgICAgbUxhc3RWZWxvY2l0eSA9IHZlbG9jaXR5OwogCiAgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIC12eCwgLXZ5LCAwLCBtYXhYLCAwLCBtYXhZKTsKLSAgICAgICAgLy8gVE9ETzogZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB2ZWxvY2l0eSwgaWYgdGhlIHJhbmdlIGlzCi0gICAgICAgIC8vIHNtYWxsLCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RvcCBiZWZvcmUgZHVyYXRpb24gaXMgdXAuIFdlIG1heQotICAgICAgICAvLyB3YW50IHRvIGNhbGN1bGF0ZSBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIGlzIGdvaW5nIHRvIHJ1biB0byBwcmVjaXNlbHkKLSAgICAgICAgLy8gcmVzdW1lIHRoZSB3ZWJjb3JlIHVwZGF0ZS4KICAgICAgICAgZmluYWwgaW50IHRpbWUgPSBtU2Nyb2xsZXIuZ2V0RHVyYXRpb24oKTsKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZLCB0aW1lKTsKICAgICAgICAgYXdha2VuU2Nyb2xsQmFycyh0aW1lKTsKQEAgLTYwMzgsMjAgKzYwODcsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZSh2aWV3U3RhdGUsIGdldFZpZXdXaWR0aCgpLCB2aWV3U3RhdGUubVNjcm9sbFgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBSRVBMQUNFX0JBU0VfQ09OVEVOVDogeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZXBsYWNlQmFzZUNvbnRlbnQobXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBORVdfUElDVFVSRV9NU0dfSUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UndmUgcHJldmlvdXNseSBkZWxheWVkIGRlbGV0aW5nIGEgcm9vdAotICAgICAgICAgICAgICAgICAgICAvLyBsYXllciwgZG8gaXQgbm93LgotICAgICAgICAgICAgICAgICAgICBpZiAobURlbGF5ZWREZWxldGVSb290TGF5ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWxheWVkRGVsZXRlUm9vdExheWVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRSb290TGF5ZXIoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGZvciBuZXcgY29udGVudAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3ID0gKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOwotCisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldEJhc2VMYXllcihkcmF3Lm1CYXNlTGF5ZXIpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXcubVZpZXdQb2ludDsKICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IGRyYXcubVZpZXdTdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0ID0gdmlld1N0YXRlICE9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgbGFzdCBzZW50IGRhdGEgaGVyZSBzaW5jZSBkZWFsaW5nIHdpdGggbmV3IHBhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFdpZHRoU2VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIub25GaXJzdExheW91dChkcmF3KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFNjcm9sbFRvKHZpZXdTdGF0ZS5tU2Nyb2xsWCwgdmlld1N0YXRlLm1TY3JvbGxZKTsKQEAgLTYxNjYsMjMgKzYyMTUsNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIElNTUVESUFURV9SRVBBSU5UX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9ST09UX0xBWUVSX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBtc2cuYXJnMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVsbCBpbmRpY2F0ZXMgZGVsZXRpbmcgdGhlIG9sZCBsYXllciwgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhY3R1YWxseSBkbyBzbyB1bnRpbCB3ZSd2ZSBnb3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgcGFnZSB0byBkaXNwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFJvb3RMYXllcihtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9GT1JNX0RBVEE6CiAgICAgICAgICAgICAgICAgICAgIEF1dG9Db21wbGV0ZUFkYXB0ZXIgYWRhcHRlciA9IChBdXRvQ29tcGxldGVBZGFwdGVyKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBpZiAobVdlYlRleHRWaWV3LmlzU2FtZVRleHRGaWVsZChtc2cuYXJnMSkpIHsKQEAgLTY0NDQsNiArNjQ3NiwxMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgY2FzZSBTQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIFNhdmVXZWJBcmNoaXZlTWVzc2FnZSBzYXZlTWVzc2FnZSA9IChTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVNZXNzYWdlLm1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTWVzc2FnZS5tQ2FsbGJhY2sub25SZWNlaXZlVmFsdWUoc2F2ZU1lc3NhZ2UubVJlc3VsdEZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTY5NDQsNyArNjk4Myw3IEBACiAgICAgICogQGhpZGUgb25seSBuZWVkcyB0byBiZSBhY2Nlc3NpYmxlIHRvIEJyb3dzZXIgYW5kIHRlc3RpbmcKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3UGFnZShDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5kcmF3Q29udGVudFBpY3R1cmUoY2FudmFzLCAwLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcywgMCwgMCwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjk4OCw3ICs3MDI3LDE1IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlQ3Vyc29yV2FudHNLZXlFdmVudHMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZWJ1Z0R1bXAoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZXN0cm95KCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRHJhd0V4dHJhcyhDYW52YXMgY2FudmFzLCBpbnQgZXh0cmEpOworCisgICAgLyoqCisgICAgICogRHJhdyB0aGUgcGljdHVyZSBzZXQgd2l0aCBhIGJhY2tncm91bmQgY29sb3IgYW5kIGV4dHJhLiBJZgorICAgICAqICJzcGxpdElmTmVlZGVkIiBpcyB0cnVlIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCAwLCB0aGUgcmV0dXJuIHZhbHVlCisgICAgICogTVVTVCBiZSBwYXNzZWQgdG8gV2ViVmlld0NvcmUgd2l0aCBTUExJVF9QSUNUVVJFX1NFVCBtZXNzYWdlIHNvIHRoYXQgdGhlCisgICAgICogbmF0aXZlIGFsbG9jYXRpb24gY2FuIGJlIGZyZWVkLgorICAgICAqLworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVEcmF3KENhbnZhcyBjYW52YXMsIGludCBjb2xvciwgaW50IGV4dHJhLAorICAgICAgICAgICAgYm9vbGVhbiBzcGxpdElmTmVlZGVkKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEdW1wRGlzcGxheVRyZWUoU3RyaW5nIHVybE9yTnVsbCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlRXZhbHVhdGVMYXllcnNBbmltYXRpb25zKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRXh0ZW5kU2VsZWN0aW9uKGludCB4LCBpbnQgeSk7CkBAIC03MDUzLDcgKzcxMDAsMTAgQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRGaW5kSXNVcChib29sZWFuIGlzVXApOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEZvbGxvd2VkTGluayhib29sZWFuIGZvbGxvd2VkKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRIZWlnaHRDYW5NZWFzdXJlKGJvb2xlYW4gbWVhc3VyZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0Um9vdExheWVyKGludCBsYXllcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0QmFzZUxheWVyKGludCBsYXllcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlUmVwbGFjZUJhc2VDb250ZW50KGludCBjb250ZW50KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVDb3B5QmFzZUNvbnRlbnRUb1BpY3R1cmUoUGljdHVyZSBwaWN0KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVIYXNDb250ZW50KCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0U2VsZWN0aW9uUG9pbnRlcihib29sZWFuIHNldCwKICAgICAgICAgICAgIGZsb2F0IHNjYWxlLCBpbnQgeCwgaW50IHkpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVN0YXJ0U2VsZWN0aW9uKGludCB4LCBpbnQgeSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCmluZGV4IDU0Njk5ZDYuLjIxYWY1NzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCkBAIC0xOSwxMSArMTksNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludEZsYWdzRHJhd0ZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CkBAIC0zMyw3ICsyOCw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkltYWdlcy5NZWRpYTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwpAQCAtNDQzLDM1ICs0MzcsMTggQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsZWFyQ29udGVudCgpOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZmxhdCBwaWN0dXJlIGZyb20gdGhlIHNldCBvZiBwaWN0dXJlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlDb250ZW50VG9QaWN0dXJlKFBpY3R1cmUgcGljdHVyZSk7Ci0KLSAgICAvKioKLSAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvci4gUmV0dXJucyB0cnVlCi0gICAgICogaWYgc29tZSBpbmRpdmlkdWFsIHBpY3R1cmUgdG9vayB0b28gbG9uZyB0byBkcmF3IGFuZCBjYW4gYmUKLSAgICAgKiBzcGxpdCBpbnRvIHBhcnRzLiBDYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlRHJhd0NvbnRlbnQoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yKTsKLQotICAgIC8qKgotICAgICAqIGNoZWNrIHRvIHNlZSBpZiBwaWN0dXJlIGlzIGJsYW5rIGFuZCBpbiBwcm9ncmVzcwotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlUGljdHVyZVJlYWR5KCk7Ci0KLSAgICAvKioKICAgICAgKiBSZWRyYXcgYSBwb3J0aW9uIG9mIHRoZSBwaWN0dXJlIHNldC4gVGhlIFBvaW50IHdoIHJldHVybnMgdGhlCiAgICAgICogd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgb3ZlcmFsbCBwaWN0dXJlLgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlUmVjb3JkQ29udGVudChSZWdpb24gaW52YWxSZWdpb24sIFBvaW50IHdoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlUmVjb3JkQ29udGVudChSZWdpb24gaW52YWxSZWdpb24sIFBvaW50IHdoKTsKIAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlRm9jdXNCb3VuZHNDaGFuZ2VkKCk7CiAKICAgICAvKioKLSAgICAgKiBTcGxpdHMgc2xvdyBwYXJ0cyBvZiB0aGUgcGljdHVyZSBzZXQuIENhbGxlZCBmcm9tIHRoZSB3ZWJraXQKLSAgICAgKiB0aHJlYWQgYWZ0ZXIgbmF0aXZlRHJhd0NvbnRlbnQgcmV0dXJucyB0cnVlLgorICAgICAqIFNwbGl0cyBzbG93IHBhcnRzIG9mIHRoZSBwaWN0dXJlIHNldC4gQ2FsbGVkIGZyb20gdGhlIHdlYmtpdCB0aHJlYWQgYWZ0ZXIKKyAgICAgKiBXZWJWaWV3Lm5hdGl2ZURyYXcoKSByZXR1cm5zIGNvbnRlbnQgdG8gYmUgc3BsaXQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTcGxpdENvbnRlbnQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNwbGl0Q29udGVudChpbnQgY29udGVudCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUtleShpbnQga2V5Q29kZSwgaW50IHVuaWNoYXIsCiAgICAgICAgICAgICBpbnQgcmVwZWF0Q291bnQsIGJvb2xlYW4gaXNTaGlmdCwgYm9vbGVhbiBpc0FsdCwgYm9vbGVhbiBpc1N5bSwKQEAgLTc5Nyw2ICs3NzQsNyBAQAogICAgICAgICAgICAgIk9OX1JFU1VNRSIsICAgIC8vID0gMTQ0CiAgICAgICAgICAgICAiRlJFRV9NRU1PUlkiLCAgLy8gPSAxNDUKICAgICAgICAgICAgICJWQUxJRF9OT0RFX0JPVU5EUyIsIC8vID0gMTQ2CisgICAgICAgICAgICAiU0FWRV9XRUJBUkNISVZFIiwgLy8gPSAxNDcKICAgICAgICAgfTsKIAogICAgIGNsYXNzIEV2ZW50SHViIHsKQEAgLTg2Myw2ICs4NDEsOSBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEZSRUVfTUVNT1JZID0gMTQ1OwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFZBTElEX05PREVfQk9VTkRTID0gMTQ2OwogCisgICAgICAgIC8vIExvYWQgYW5kIHNhdmUgd2ViIGFyY2hpdmVzCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9XRUJBUkNISVZFID0gMTQ3OworCiAgICAgICAgIC8vIE5ldHdvcmstYmFzZWQgbWVzc2FnaW5nCiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfU1NMX1BSRUZfVEFCTEUgPSAxNTA7CiAKQEAgLTEzMjMsNiArMTMwNCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldEpzRmxhZ3MoKFN0cmluZyltc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTQVZFX1dFQkFSQ0hJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TYXZlV2ViQXJjaGl2ZU1lc3NhZ2Ugc2F2ZU1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlldy5TYXZlV2ViQXJjaGl2ZU1lc3NhZ2UpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTWVzc2FnZS5tUmVzdWx0RmlsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVXZWJBcmNoaXZlKHNhdmVNZXNzYWdlLm1CYXNlbmFtZSwgc2F2ZU1lc3NhZ2UubUF1dG9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQsIHNhdmVNZXNzYWdlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHRU9MT0NBVElPTl9QRVJNSVNTSU9OU19QUk9WSURFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhIGRhdGEgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhKSBtc2cub2JqOwpAQCAtMTMzNiw3ICsxMzI2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTUExJVF9QSUNUVVJFX1NFVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTcGxpdENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTcGxpdENvbnRlbnQobXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5SRVBMQUNFX0JBU0VfQ09OVEVOVCwgbXNnLmFyZzEsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xNjIyLDYgKzE2MTQsMTMgQEAKICAgICAgICAgbUJyb3dzZXJGcmFtZS5sb2FkVXJsKHVybCwgZXh0cmFIZWFkZXJzKTsKICAgICB9CiAKKyAgICBwcml2YXRlIFN0cmluZyBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgZmlsZW5hbWUsIGJvb2xlYW4gYXV0b25hbWUpIHsKKyAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgeworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiIENPUkUgc2F2ZVdlYkFyY2hpdmUgIiArIGZpbGVuYW1lICsgIiAiICsgYXV0b25hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQnJvd3NlckZyYW1lLnNhdmVXZWJBcmNoaXZlKGZpbGVuYW1lLCBhdXRvbmFtZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGtleShLZXlFdmVudCBldnQsIGJvb2xlYW4gaXNEb3duKSB7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkNPUkUga2V5IGF0ICIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIsICIKQEAgLTE3MzYsNiArMTczNSwxNCBAQAogICAgICAgICByZXR1cm4gdXNlZFF1b3RhOwogICAgIH0KIAorICAgIC8vIGNhbGxlZCBmcm9tIFVJIHRocmVhZAorICAgIHZvaWQgc3BsaXRDb250ZW50KGludCBjb250ZW50KSB7CisgICAgICAgIGlmICghbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkKSB7CisgICAgICAgICAgICBtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQgPSB0cnVlOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQsIGNvbnRlbnQsIDApOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gVXNlZCB0byBhdm9pZCBwb3N0aW5nIG1vcmUgdGhhbiBvbmUgZHJhdyBtZXNzYWdlLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhd0lzU2NoZWR1bGVkOwogCkBAIC0xNzYyLDkgKzE3NjksMTEgQEAKIAogICAgIHN0YXRpYyBjbGFzcyBEcmF3RGF0YSB7CiAgICAgICAgIERyYXdEYXRhKCkgeworICAgICAgICAgICAgbUJhc2VMYXllciA9IDA7CiAgICAgICAgICAgICBtSW52YWxSZWdpb24gPSBuZXcgUmVnaW9uKCk7CiAgICAgICAgICAgICBtV2lkdGhIZWlnaHQgPSBuZXcgUG9pbnQoKTsKICAgICAgICAgfQorICAgICAgICBpbnQgbUJhc2VMYXllcjsKICAgICAgICAgUmVnaW9uIG1JbnZhbFJlZ2lvbjsKICAgICAgICAgUG9pbnQgbVZpZXdQb2ludDsKICAgICAgICAgUG9pbnQgbVdpZHRoSGVpZ2h0OwpAQCAtMTc3OCw4ICsxNzg3LDggQEAKICAgICAgICAgbURyYXdJc1NjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgICBEcmF3RGF0YSBkcmF3ID0gbmV3IERyYXdEYXRhKCk7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIExvZy52KExPR1RBRywgIndlYmtpdERyYXcgc3RhcnQiKTsKLSAgICAgICAgaWYgKG5hdGl2ZVJlY29yZENvbnRlbnQoZHJhdy5tSW52YWxSZWdpb24sIGRyYXcubVdpZHRoSGVpZ2h0KQotICAgICAgICAgICAgICAgID09IGZhbHNlKSB7CisgICAgICAgIGRyYXcubUJhc2VMYXllciA9IG5hdGl2ZVJlY29yZENvbnRlbnQoZHJhdy5tSW52YWxSZWdpb24sIGRyYXcubVdpZHRoSGVpZ2h0KTsKKyAgICAgICAgaWYgKGRyYXcubUJhc2VMYXllciA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSBMb2cudihMT0dUQUcsICJ3ZWJraXREcmF3IGFib3J0Iik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTE4MTIsNTEgKzE4MjEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gVGhlc2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQsIG5vdCBvdXIgdGhyZWFkCi0KLSAgICBzdGF0aWMgZmluYWwgaW50IFpPT01fQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuU1VCUElYRUxfVEVYVF9GTEFHOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHOwotCi0gICAgZmluYWwgRHJhd0ZpbHRlciBtWm9vbUZpbHRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihaT09NX0JJVFMsIFBhaW50LkxJTkVBUl9URVhUX0ZMQUcpOwotICAgIC8vIElmIHdlIG5lZWQgdG8gdHJhZGUgYmV0dGVyIHF1YWxpdHkgZm9yIHNwZWVkLCBzZXQgbVNjcm9sbEZpbHRlciB0byBudWxsCi0gICAgZmluYWwgRHJhd0ZpbHRlciBtU2Nyb2xsRmlsdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoU0NST0xMX0JJVFMsIDApOwotCi0gICAgLyogcGFja2FnZSAqLyB2b2lkIGRyYXdDb250ZW50UGljdHVyZShDYW52YXMgY2FudmFzLCBpbnQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGluZ1pvb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGluZ1Njcm9sbCkgewotICAgICAgICBEcmF3RmlsdGVyIGRmID0gbnVsbDsKLSAgICAgICAgaWYgKGFuaW1hdGluZ1pvb20pIHsKLSAgICAgICAgICAgIGRmID0gbVpvb21GaWx0ZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW5nU2Nyb2xsKSB7Ci0gICAgICAgICAgICBkZiA9IG1TY3JvbGxGaWx0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIoZGYpOwotICAgICAgICBib29sZWFuIHRvb2tUb29Mb25nID0gbmF0aXZlRHJhd0NvbnRlbnQoY2FudmFzLCBjb2xvcik7Ci0gICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOwotICAgICAgICBpZiAodG9va1Rvb0xvbmcgJiYgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQgPSB0cnVlOwotICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwaWN0dXJlUmVhZHkoKSB7Ci0gICAgICAgIHJldHVybiAwICE9IG1OYXRpdmVDbGFzcyA/IG5hdGl2ZVBpY3R1cmVSZWFkeSgpIDogZmFsc2U7Ci0gICAgfQotCi0gICAgLypwYWNrYWdlKi8gc3luY2hyb25pemVkIFBpY3R1cmUgY29weUNvbnRlbnRQaWN0dXJlKCkgewotICAgICAgICBQaWN0dXJlIHJlc3VsdCA9IG5ldyBQaWN0dXJlKCk7Ci0gICAgICAgIGlmICgwICE9IG1OYXRpdmVDbGFzcykgewotICAgICAgICAgICAgbmF0aXZlQ29weUNvbnRlbnRUb1BpY3R1cmUocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHN0YXRpYyB2b2lkIHJlZHVjZVByaW9yaXR5KCkgewogICAgICAgICAvLyByZW1vdmUgdGhlIHBlbmRpbmcgUkVEVUNFX1BSSU9SSVRZIGFuZCBSRVNVTUVfUFJJT1JJVFkgbWVzc2FnZXMKICAgICAgICAgc1dlYkNvcmVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFdlYkNvcmVUaHJlYWQuUkVEVUNFX1BSSU9SSVRZKTsKQEAgLTIwMzgsMjQgKzIwMDIsNiBAQAogICAgICAgICBtUmVwYWludFNjaGVkdWxlZCA9IGZhbHNlOwogICAgIH0KIAotICAgIC8vIGNhbGxlZCBieSBKTkkKLSAgICBwcml2YXRlIHZvaWQgc2VuZEltbWVkaWF0ZVJlcGFpbnQoKSB7Ci0gICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmICFtUmVwYWludFNjaGVkdWxlZCkgewotICAgICAgICAgICAgbVJlcGFpbnRTY2hlZHVsZWQgPSB0cnVlOwotICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5JTU1FRElBVEVfUkVQQUlOVF9NU0dfSUQpLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCBzZXRSb290TGF5ZXIoaW50IGxheWVyKSB7Ci0gICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFVF9ST09UX0xBWUVSX01TR19JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qIHBhY2thZ2UgKi8gV2ViVmlldyBnZXRXZWJWaWV3KCkgewogICAgICAgICByZXR1cm4gbVdlYlZpZXc7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQppbmRleCAwMGZhZGI1Li43ZjdmNDZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQpAQCAtNzY4LDggKzc2OCw4IEBACiAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gem9vbU92ZXJ2aWV3U2NhbGU7CiAgICAgICAgIH0KICAgICAgICAgLy8gZml0IHRoZSBjb250ZW50IHdpZHRoIHRvIHRoZSBjdXJyZW50IHZpZXcuIElnbm9yZSB0aGUgcm91bmRpbmcgZXJyb3IgY2FzZS4KLSAgICAgICAgaWYgKCFtV2ViVmlldy5kcmF3SGlzdG9yeSgpICYmIChtSW5ab29tT3ZlcnZpZXcgfHwgbUluaXRpYWxab29tT3ZlcnZpZXcpCi0gICAgICAgICAgICAgICAgJiYgTWF0aC5hYnMoKHZpZXdXaWR0aCAqIG1JbnZBY3R1YWxTY2FsZSkgLSBtWm9vbU92ZXJ2aWV3V2lkdGgpID4gMSkgeworICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkgJiYgKG1Jbml0aWFsWm9vbU92ZXJ2aWV3IHx8IChtSW5ab29tT3ZlcnZpZXcKKyAgICAgICAgICAgICAgICAmJiBNYXRoLmFicygodmlld1dpZHRoICogbUludkFjdHVhbFNjYWxlKSAtIG1ab29tT3ZlcnZpZXdXaWR0aCkgPiAxKSkpIHsKICAgICAgICAgICAgIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CiAgICAgICAgICAgICBzZXRab29tU2NhbGUoem9vbU92ZXJ2aWV3U2NhbGUsICF3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2VicnVudGltZS9XZWJSdW50aW1lQWN0aXZpdHkuamF2YQppbmRleCBiZGExYTdhLi5lYzhjNjBjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYnJ1bnRpbWUvV2ViUnVudGltZUFjdGl2aXR5LmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLndlYnJ1bnRpbWU7CiAKLWltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CkBAIC01NCw2ICs1MywyMiBAQAogICAgIHByaXZhdGUgVVJMIG1CYXNlVXJsOwogICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1TcGxhc2hTY3JlZW47CiAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlbnNpdGl2ZUZlYXR1cmVzIHsKKyAgICAgICAgLy8gQWxsIG9mIHRoZSBzZW5zaXRpdmUgZmVhdHVyZXMKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1HZW9sb2NhdGlvbjsKKyAgICAgICAgLy8gT24gQW5kcm9pZCwgdGhlIEJyb3dzZXIgZG9lc24ndCBwcm9tcHQgZm9yIGRhdGFiYXNlIGFjY2Vzcywgc28gd2UgZG9uJ3QgcmVxdWlyZSBhbgorICAgICAgICAvLyBleHBsaWNpdCBwZXJtaXNzaW9uIGhlcmUgaW4gdGhlIFdlYlJ1bnRpbWVBY3Rpdml0eSwgYW5kIHRoZXJlJ3Mgbm8gQW5kcm9pZCBzeXN0ZW0KKyAgICAgICAgLy8gcGVybWlzc2lvbiByZXF1aXJlZCBmb3IgaXQgZWl0aGVyLgorICAgICAgICAvL3ByaXZhdGUgYm9vbGVhbiBtRGF0YWJhc2U7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0R2VvbG9jYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUdlb2xvY2F0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEdlb2xvY2F0aW9uKGJvb2xlYW4gZ2VvbG9jYXRpb24pIHsKKyAgICAgICAgICAgIG1HZW9sb2NhdGlvbiA9IGdlb2xvY2F0aW9uOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkLiAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpCkBAIC05Myw2ICsxMDgsMTAgQEAKICAgICAgICAgICAgIExvZy5kKExPR1RBRywgIkludmFsaWQgVVJMIik7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBBbGwgZmFsc2UgYnkgZGVmYXVsdCwgYW5kIHJlYWRpbmcgbm9uLWV4aXN0ZW50IGJ1bmRsZSBwcm9wZXJ0aWVzIGdpdmVzIGZhbHNlIHRvby4KKyAgICAgICAgZmluYWwgU2Vuc2l0aXZlRmVhdHVyZXMgc2Vuc2l0aXZlRmVhdHVyZXMgPSBuZXcgU2Vuc2l0aXZlRmVhdHVyZXMoKTsKKyAgICAgICAgc2Vuc2l0aXZlRmVhdHVyZXMuc2V0R2VvbG9jYXRpb24obWV0YURhdGEuZ2V0Qm9vbGVhbigiYW5kcm9pZC53ZWJydW50aW1lLlNlbnNpdGl2ZUZlYXR1cmVzR2VvbG9jYXRpb24iKSk7CisKICAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOwogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC53ZWJfcnVudGltZSk7CiAgICAgICAgIG1XZWJWaWV3ID0gKFdlYlZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLndlYnZpZXcpOwpAQCAtMTA1LDkgKzEyNCw4IEBACiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRPdmVycmlkZVVybExvYWRpbmcoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgVVJMIG5ld09yaWdpbiA9IG5ldyBVUkwodXJsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld09yaWdpbi5nZXRIb3N0KCkuZXF1YWxzKG1CYXNlVXJsLmdldEhvc3QoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZVNhbWVPcmlnaW4obUJhc2VVcmwsIG5ld09yaWdpbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHNpbXBsZSBzYW1lIG9yaWdpbiB0ZXN0IHBhc3NlcywgbG9hZCBpbiB0aGUgd2Vidmlldy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgZG8gYSBtb3JlIHJvYnVzdCBTT1AgY2hlY2suCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CkBAIC0xMjMsMjMgKzE0MSwyNyBAQAogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgewotICAgICAgICAgICAgICAgIGlmIChtU3BsYXNoU2NyZWVuLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNwbGFzaFNjcmVlbiAhPSBudWxsICYmIG1TcGxhc2hTY3JlZW4uZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewogICAgICAgICAgICAgICAgICAgICBtU3BsYXNoU2NyZWVuLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICAgICAgbVNwbGFzaFNjcmVlbiA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIAotICAgICAgICAvLyBVc2UgYSBjdXN0b20gV2ViQ2hyb21lQ2xpZW50IHdpdGggZ2VvbG9jYXRpb24gcGVybWlzc2lvbnMgaGFuZGxpbmcgdG8gYWx3YXlzCi0gICAgICAgIC8vIGFsbG93IG9yIGRlbnksIGJhc2VkIG9uIHRoZSBhcHAncyBwZXJtaXNzaW9ucy4KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29tcG9uZW50TmFtZS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICBmaW5hbCBib29sZWFuIGFsbG93ZWQgPSBwYWNrYWdlTWFuYWdlci5jaGVja1Blcm1pc3Npb24oCi0gICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5BQ0NFU1NfRklORV9MT0NBVElPTiwgcGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgPT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEOworICAgICAgICAvLyBVc2UgYSBjdXN0b20gV2ViQ2hyb21lQ2xpZW50IHdpdGggZ2VvbG9jYXRpb24gcGVybWlzc2lvbnMgaGFuZGxpbmcuCiAgICAgICAgIG1XZWJWaWV3LnNldFdlYkNocm9tZUNsaWVudChuZXcgV2ViQ2hyb21lQ2xpZW50KCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgb25HZW9sb2NhdGlvblBlcm1pc3Npb25zU2hvd1Byb21wdCgKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW4sIEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBhbGxvd2VkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGlzIG9yaWdpbiBpZiBpdCBoYXMgR2VvbG9jYXRpb24gcGVybWlzc2lvbnMsIG90aGVyd2lzZSBkZW55LgorICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChzZW5zaXRpdmVGZWF0dXJlcy5nZXRHZW9sb2NhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVUkwgb3JpZ2luVXJsID0gbmV3IFVSTChvcmlnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA9IGFyZVNhbWVPcmlnaW4obUJhc2VVcmwsIG9yaWdpblVybCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBhbGxvd2VkLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCkBAIC0xNzMsNCArMTk1LDEwIEBACiAgICAgICAgIG1lbnUuYWRkKDAsIDEsIDAsICJNZW51IGl0ZW0gMiIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFyZVNhbWVPcmlnaW4oVVJMIGEsIFVSTCBiKSB7CisgICAgICAgIGludCBhUG9ydCA9IGEuZ2V0UG9ydCgpID09IC0xID8gYS5nZXREZWZhdWx0UG9ydCgpIDogYS5nZXRQb3J0KCk7CisgICAgICAgIGludCBiUG9ydCA9IGIuZ2V0UG9ydCgpID09IC0xID8gYi5nZXREZWZhdWx0UG9ydCgpIDogYi5nZXRQb3J0KCk7CisgICAgICAgIHJldHVybiBhLmdldFByb3RvY29sKCkuZXF1YWxzKGIuZ2V0UHJvdG9jb2woKSkgJiYgYVBvcnQgPT0gYlBvcnQgJiYgYS5nZXRIb3N0KCkuZXF1YWxzKGIuZ2V0SG9zdCgpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCmluZGV4IDEwOTI3YTcuLmUwNTFmYmQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCkBAIC0yNTQxLDYgKzI1NDEsNyBAQAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9VUF9QT1MgPSAyOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9ET1dOX0JPVU5EID0gMzsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfVVBfQk9VTkQgPSA0OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9PRkZTRVQgPSA1OwogICAgICAgICAKICAgICAgICAgcHJpdmF0ZSBpbnQgbU1vZGU7CiAgICAgICAgIHByaXZhdGUgaW50IG1UYXJnZXRQb3M7CkBAIC0yNTQ4LDYgKzI1NDksOCBAQAogICAgICAgICBwcml2YXRlIGludCBtTGFzdFNlZW5Qb3M7CiAgICAgICAgIHByaXZhdGUgaW50IG1TY3JvbGxEdXJhdGlvbjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUV4dHJhU2Nyb2xsOworCisgICAgICAgIHByaXZhdGUgaW50IG1PZmZzZXRGcm9tVG9wOwogICAgICAgICAKICAgICAgICAgUG9zaXRpb25TY3JvbGxlcigpIHsKICAgICAgICAgICAgIG1FeHRyYVNjcm9sbCA9IFZpZXdDb25maWd1cmF0aW9uLmdldChtQ29udGV4dCkuZ2V0U2NhbGVkRmFkaW5nRWRnZUxlbmd0aCgpOwpAQCAtMjYzOSwxMiArMjY0Miw0NiBAQAogICAgICAgICAgICAgCiAgICAgICAgICAgICBwb3N0KHRoaXMpOwogICAgICAgICB9Ci0gICAgICAgIAorCisgICAgICAgIHZvaWQgc3RhcnRXaXRoT2Zmc2V0KGludCBwb3NpdGlvbiwgaW50IG9mZnNldCkgeworICAgICAgICAgICAgbVRhcmdldFBvcyA9IHBvc2l0aW9uOworICAgICAgICAgICAgbU9mZnNldEZyb21Ub3AgPSBvZmZzZXQ7CisgICAgICAgICAgICBtQm91bmRQb3MgPSBJTlZBTElEX1BPU0lUSU9OOworICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIG1Nb2RlID0gTU9WRV9PRkZTRVQ7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvcyA9IG1GaXJzdFBvc2l0aW9uOworICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGFzdFBvcyA9IGZpcnN0UG9zICsgY2hpbGRDb3VudCAtIDE7CisKKyAgICAgICAgICAgIGludCB2aWV3VHJhdmVsQ291bnQgPSAwOworICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgZmlyc3RQb3MpIHsKKyAgICAgICAgICAgICAgICB2aWV3VHJhdmVsQ291bnQgPSBmaXJzdFBvcyAtIHBvc2l0aW9uOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IGxhc3RQb3MpIHsKKyAgICAgICAgICAgICAgICB2aWV3VHJhdmVsQ291bnQgPSBwb3NpdGlvbiAtIGxhc3RQb3M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE9uLXNjcmVlbiwganVzdCBzY3JvbGwuCisgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhcmdldFRvcCA9IGdldENoaWxkQXQocG9zaXRpb24gLSBmaXJzdFBvcykuZ2V0VG9wKCk7CisgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkodGFyZ2V0VG9wIC0gb2Zmc2V0LCBTQ1JPTExfRFVSQVRJT04pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRXN0aW1hdGUgaG93IG1hbnkgc2NyZWVucyB3ZSBzaG91bGQgdHJhdmVsCisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY3JlZW5UcmF2ZWxDb3VudCA9IHZpZXdUcmF2ZWxDb3VudCAvIGNoaWxkQ291bnQ7CisgICAgICAgICAgICBtU2Nyb2xsRHVyYXRpb24gPSAoaW50KSAoU0NST0xMX0RVUkFUSU9OIC8gc2NyZWVuVHJhdmVsQ291bnQpOworICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICB2b2lkIHN0b3AoKSB7CiAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3ModGhpcyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfTU9ERV9GTElORyAmJiBtTGFzdFNlZW5Qb3MgIT0gSU5WQUxJRF9QT1NJVElPTikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RIZWlnaHQgPSBnZXRIZWlnaHQoKTsKICAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvcyA9IG1GaXJzdFBvc2l0aW9uOwogICAgICAgICAgICAgCkBAIC0yNzY5LDYgKzI4MDYsMjcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBNT1ZFX09GRlNFVDogeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworCisgICAgICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gZmlyc3RQb3M7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvc2l0aW9uID0gbVRhcmdldFBvczsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGFzdFBvcyA9IGZpcnN0UG9zICsgY2hpbGRDb3VudCAtIDE7CisKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBmaXJzdFBvcykgeworICAgICAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxCeSgtZ2V0SGVpZ2h0KCksIG1TY3JvbGxEdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IGxhc3RQb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkoZ2V0SGVpZ2h0KCksIG1TY3JvbGxEdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT24tc2NyZWVuLCBqdXN0IHNjcm9sbC4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhcmdldFRvcCA9IGdldENoaWxkQXQocG9zaXRpb24gLSBmaXJzdFBvcykuZ2V0VG9wKCk7CisgICAgICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KHRhcmdldFRvcCAtIG1PZmZzZXRGcm9tVG9wLCBtU2Nyb2xsRHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTI3ODgsNiArMjg0NiwyNCBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsIHNjcm9sbAorICAgICAqIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZCA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBpeGVscyBmcm9tCisgICAgICogdGhlIHRvcCBlZGdlIG9mIHRoZSB2aWV3LiBJZiB0aGlzIGlzIGltcG9zc2libGUsIChlLmcuIHRoZSBvZmZzZXQgd291bGQgc2Nyb2xsCisgICAgICogdGhlIGZpcnN0IG9yIGxhc3QgaXRlbSBiZXlvbmQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGxpc3QpIGl0IHdpbGwgZ2V0IGFzIGNsb3NlCisgICAgICogYXMgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gdG8gc2Nyb2xsIHRvCisgICAgICogQHBhcmFtIG9mZnNldCBEZXNpcmVkIGRpc3RhbmNlIGluIHBpeGVscyBvZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gZnJvbSB0aGUgdG9wCisgICAgICogICAgICAgICAgICAgICBvZiB0aGUgdmlldyB3aGVuIHNjcm9sbGluZyBpcyBmaW5pc2hlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb25Gcm9tVG9wKGludCBwb3NpdGlvbiwgaW50IG9mZnNldCkgeworICAgICAgICBpZiAobVBvc2l0aW9uU2Nyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVBvc2l0aW9uU2Nyb2xsZXIgPSBuZXcgUG9zaXRpb25TY3JvbGxlcigpOworICAgICAgICB9CisgICAgICAgIG1Qb3NpdGlvblNjcm9sbGVyLnN0YXJ0V2l0aE9mZnNldChwb3NpdGlvbiwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCiAgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZCwgYnV0IGl0IHdpbGwKICAgICAgKiBzdG9wIGVhcmx5IGlmIHNjcm9sbGluZyBmdXJ0aGVyIHdvdWxkIHNjcm9sbCBib3VuZFBvc2l0aW9uIG91dCBvZgpAQCAtMzE3NSw2ICszMjUxLDcgQEAKIAogICAgICAgICBtUmVzdXJyZWN0VG9Qb3NpdGlvbiA9IElOVkFMSURfUE9TSVRJT047CiAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtRmxpbmdSdW5uYWJsZSk7CisgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUG9zaXRpb25TY3JvbGxlcik7CiAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7CiAgICAgICAgIGNsZWFyU2Nyb2xsaW5nQ2FjaGUoKTsKICAgICAgICAgbVNwZWNpZmljVG9wID0gc2VsZWN0ZWRUb3A7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yVHJlZUFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JUcmVlQWRhcHRlci5qYXZhCmluZGV4IDdiOWI3YmQuLjNmYWRmNGMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JUcmVlQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JUcmVlQWRhcHRlci5qYXZhCkBAIC0xMzQsMTQgKzEzNCwxNiBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGdyb3VwIEN1cnNvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBDdXJzb3IgdG8gc2V0IGZvciB0aGUgZ3JvdXAuCisgICAgICogQHBhcmFtIGN1cnNvciBUaGUgQ3Vyc29yIHRvIHNldCBmb3IgdGhlIGdyb3VwLiBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBjdXJzb3IgCisgICAgICogaXQgd2lsbCBiZSBjbG9zZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0R3JvdXBDdXJzb3IoQ3Vyc29yIGN1cnNvcikgewogICAgICAgICBtR3JvdXBDdXJzb3JIZWxwZXIuY2hhbmdlQ3Vyc29yKGN1cnNvciwgZmFsc2UpOwogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaGlsZHJlbiBDdXJzb3IgZm9yIGEgcGFydGljdWxhciBncm91cC4KKyAgICAgKiBTZXRzIHRoZSBjaGlsZHJlbiBDdXJzb3IgZm9yIGEgcGFydGljdWxhciBncm91cC4gSWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgY3Vyc29yCisgICAgICogaXQgd2lsbCBiZSBjbG9zZWQuCiAgICAgICogPHA+CiAgICAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBhc3luY2hyb25vdXNseSBxdWVyeWluZyB0byBwcmV2ZW50IGJsb2NraW5nIHRoZSBVSS4KICAgICAgKiAKQEAgLTQ3Niw3ICs0NzgsNyBAQAogICAgICAgICAgICAgCiAgICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNvbnRlbnRPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7Ci0gICAgICAgICAgICBtQ3Vyc29yLmRlYWN0aXZhdGUoKTsKKyAgICAgICAgICAgIG1DdXJzb3IuY2xvc2UoKTsKICAgICAgICAgICAgIG1DdXJzb3IgPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhCmluZGV4IGU5ZGUzODUuLjVjMzRjMmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFBvcHVwV2luZG93LmphdmEKQEAgLTc4LDcgKzc4LDcgQEAKICAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbUl0ZW1DbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtSXRlbVNlbGVjdGVkTGlzdGVuZXI7CiAKLSAgICBwcml2YXRlIGZpbmFsICBSZXNpemVQb3B1cFJ1bm5hYmxlIG1SZXNpemVQb3B1cFJ1bm5hYmxlID0gbmV3IFJlc2l6ZVBvcHVwUnVubmFibGUoKTsKKyAgICBwcml2YXRlIGZpbmFsIFJlc2l6ZVBvcHVwUnVubmFibGUgbVJlc2l6ZVBvcHVwUnVubmFibGUgPSBuZXcgUmVzaXplUG9wdXBSdW5uYWJsZSgpOwogICAgIHByaXZhdGUgZmluYWwgUG9wdXBUb3VjaEludGVyY2VwdG9yIG1Ub3VjaEludGVyY2VwdG9yID0gbmV3IFBvcHVwVG91Y2hJbnRlcmNlcHRvcigpOwogICAgIHByaXZhdGUgZmluYWwgUG9wdXBTY3JvbGxMaXN0ZW5lciBtU2Nyb2xsTGlzdGVuZXIgPSBuZXcgUG9wdXBTY3JvbGxMaXN0ZW5lcigpOwogICAgIHByaXZhdGUgZmluYWwgTGlzdFNlbGVjdG9ySGlkZXIgbUhpZGVTZWxlY3RvciA9IG5ldyBMaXN0U2VsZWN0b3JIaWRlcigpOwpAQCAtNDMyLDYgKzQzMiwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cgYnkgdGhlIHNpemUgb2YgaXRzIGNvbnRlbnQuIFRoZSBmaW5hbCB3aWR0aCBtYXkgYmUKKyAgICAgKiBsYXJnZXIgdG8gYWNjb21tb2RhdGUgc3R5bGVkIHdpbmRvdyBkcmVzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aWR0aCBEZXNpcmVkIHdpZHRoIG9mIGNvbnRlbnQgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRXaWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgRHJhd2FibGUgcG9wdXBCYWNrZ3JvdW5kID0gbVBvcHVwLmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgaWYgKHBvcHVwQmFja2dyb3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9IHBvcHVwQmFja2dyb3VuZC5nZXRJbnRyaW5zaWNXaWR0aCgpICsgd2lkdGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAcmV0dXJuIFRoZSBoZWlnaHQgb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCmluZGV4IDkxZjQ5NDYuLjg2OTEzYWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCkBAIC0yOTY4LDcgKzI5NjgsNyBAQAogICAgICAgICAgICAgLy8gZmlsbCBhIHJlY3Qgd2hlcmUgdGhlIGRpdmlkZXJzIHdvdWxkIGJlIGZvciBub24tc2VsZWN0YWJsZSBpdGVtcwogICAgICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgb3BhcXVlIGFuZCB0aGUgYmFja2dyb3VuZCBpcyBhbHNvIG9wYXF1ZSwgd2UgZG9uJ3QKICAgICAgICAgICAgIC8vIG5lZWQgdG8gZHJhdyBhbnl0aGluZyBzaW5jZSB0aGUgYmFja2dyb3VuZCB3aWxsIGRvIGl0IGZvciB1cwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmaWxsRm9yTWlzc2luZ0RpdmlkZXJzID0gZHJhd0RpdmlkZXJzICYmIGlzT3BhcXVlKCkgJiYgIXN1cGVyLmlzT3BhcXVlKCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMgPSBpc09wYXF1ZSgpICYmICFzdXBlci5pc09wYXF1ZSgpOwogCiAgICAgICAgICAgICBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycyAmJiBtRGl2aWRlclBhaW50ID09IG51bGwgJiYgbUlzQ2FjaGVDb2xvck9wYXF1ZSkgewogICAgICAgICAgICAgICAgIG1EaXZpZGVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKQEAgLTI5NzgsNyArMjk3OCw3IEBACiAKICAgICAgICAgICAgIGZpbmFsIGludCBsaXN0Qm90dG9tID0gbUJvdHRvbSAtIG1Ub3AgLSBtTGlzdFBhZGRpbmcuYm90dG9tICsgbVNjcm9sbFk7CiAgICAgICAgICAgICBpZiAoIW1TdGFja0Zyb21Cb3R0b20pIHsKLSAgICAgICAgICAgICAgICBpbnQgYm90dG9tID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgYm90dG9tOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CkBAIC0yOTg3LDE4ICsyOTg3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IGNoaWxkLmdldEJvdHRvbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgZHJhdyBkaXZpZGVycyBuZXh0IHRvIGl0ZW1zIHRoYXQgYXJlIG5vdCBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJhd0RpdmlkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhcmVBbGxJdGVtc1NlbGVjdGFibGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkgKyAxKSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGJvdW5kcywgcGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSArIDEpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChib3VuZHMsIHBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTMwMTQsNyArMzAxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IGNoaWxkLmdldFRvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgZHJhdyBkaXZpZGVycyBuZXh0IHRvIGl0ZW1zIHRoYXQgYXJlIG5vdCBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJhd0RpdmlkZXJzICYmIHRvcCA+IGxpc3RUb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3AgPiBsaXN0VG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhcmVBbGxJdGVtc1NlbGVjdGFibGUgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkgKyAxKSkpKSkgewpAQCAtMzAzNCw3ICszMDMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwICYmIHNjcm9sbFkgPiAwICYmIGRyYXdEaXZpZGVycykgeworICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgc2Nyb2xsWSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGxpc3RCb3R0b207CiAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIC0xKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JUcmVlQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvclRyZWVBZGFwdGVyLmphdmEKaW5kZXggYTFjNjVmMC4uYTAzMzU0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvclRyZWVBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvclRyZWVBZGFwdGVyLmphdmEKQEAgLTM4LDYgKzM4LDEwIEBACiAgKiBiaW5kaW5nIGNhbiBiZSBmb3VuZCwgYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaXMgdGhyb3duLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2ltcGxlQ3Vyc29yVHJlZUFkYXB0ZXIgZXh0ZW5kcyBSZXNvdXJjZUN1cnNvclRyZWVBZGFwdGVyIHsKKyAgICAKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbnMgdGhhdCBjb250YWluIHRoZSBkYXRhIHRvIGRpc3BsYXkgZm9yIGEgZ3JvdXAuICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtR3JvdXBGcm9tTmFtZXM7CisgICAgCiAgICAgLyoqIFRoZSBpbmRpY2VzIG9mIGNvbHVtbnMgdGhhdCBjb250YWluIGRhdGEgdG8gZGlzcGxheSBmb3IgYSBncm91cC4gKi8KICAgICBwcml2YXRlIGludFtdIG1Hcm91cEZyb207CiAgICAgLyoqCkBAIC00Niw2ICs1MCw5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnRbXSBtR3JvdXBUbzsKIAorICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1ucyB0aGF0IGNvbnRhaW4gdGhlIGRhdGEgdG8gZGlzcGxheSBmb3IgYSBjaGlsZC4gKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIG1DaGlsZEZyb21OYW1lczsKKyAgICAKICAgICAvKiogVGhlIGluZGljZXMgb2YgY29sdW1ucyB0aGF0IGNvbnRhaW4gZGF0YSB0byBkaXNwbGF5IGZvciBhIGNoaWxkLiAqLwogICAgIHByaXZhdGUgaW50W10gbUNoaWxkRnJvbTsKICAgICAvKioKQEAgLTE3MSwzOCArMTc4LDEyIEBACiAKICAgICBwcml2YXRlIHZvaWQgaW5pdChTdHJpbmdbXSBncm91cEZyb21OYW1lcywgaW50W10gZ3JvdXBUbywgU3RyaW5nW10gY2hpbGRGcm9tTmFtZXMsCiAgICAgICAgICAgICBpbnRbXSBjaGlsZFRvKSB7CisgICAgICAgIAorICAgICAgICBtR3JvdXBGcm9tTmFtZXMgPSBncm91cEZyb21OYW1lczsKICAgICAgICAgbUdyb3VwVG8gPSBncm91cFRvOwogICAgICAgICAKKyAgICAgICAgbUNoaWxkRnJvbU5hbWVzID0gY2hpbGRGcm9tTmFtZXM7CiAgICAgICAgIG1DaGlsZFRvID0gY2hpbGRUbzsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgZ3JvdXAgY3Vyc29yIGNvbHVtbiBpbmRpY2VzLCB0aGUgY2hpbGQgY3Vyc29yIGNvbHVtbiBpbmRpY2VzIHdpbGwgY29tZQotICAgICAgICAvLyB3aGVuIG5lZWRlZAotICAgICAgICBpbml0R3JvdXBGcm9tQ29sdW1ucyhncm91cEZyb21OYW1lcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgYSB0ZW1wb3JhcnkgY2hpbGQgY3Vyc29yIHRvIGluaXQgdGhlIGNvbHVtbiBpbmRpY2VzCi0gICAgICAgIGlmIChnZXRHcm91cENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICBNeUN1cnNvckhlbHBlciB0bXBDdXJzb3JIZWxwZXIgPSBnZXRDaGlsZHJlbkN1cnNvckhlbHBlcigwLCB0cnVlKTsKLSAgICAgICAgICAgIGlmICh0bXBDdXJzb3JIZWxwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluaXRDaGlsZHJlbkZyb21Db2x1bW5zKGNoaWxkRnJvbU5hbWVzLCB0bXBDdXJzb3JIZWxwZXIuZ2V0Q3Vyc29yKCkpOwotICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVDaGlsZHJlbkN1cnNvckhlbHBlcigwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaW5pdEZyb21Db2x1bW5zKEN1cnNvciBjdXJzb3IsIFN0cmluZ1tdIGZyb21Db2x1bW5OYW1lcywgaW50W10gZnJvbUNvbHVtbnMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IGZyb21Db2x1bW5OYW1lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgZnJvbUNvbHVtbnNbaV0gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KGZyb21Db2x1bW5OYW1lc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRHcm91cEZyb21Db2x1bW5zKFN0cmluZ1tdIGdyb3VwRnJvbU5hbWVzKSB7Ci0gICAgICAgIG1Hcm91cEZyb20gPSBuZXcgaW50W2dyb3VwRnJvbU5hbWVzLmxlbmd0aF07Ci0gICAgICAgIGluaXRGcm9tQ29sdW1ucyhtR3JvdXBDdXJzb3JIZWxwZXIuZ2V0Q3Vyc29yKCksIGdyb3VwRnJvbU5hbWVzLCBtR3JvdXBGcm9tKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENoaWxkcmVuRnJvbUNvbHVtbnMoU3RyaW5nW10gY2hpbGRGcm9tTmFtZXMsIEN1cnNvciBjaGlsZEN1cnNvcikgewotICAgICAgICBtQ2hpbGRGcm9tID0gbmV3IGludFtjaGlsZEZyb21OYW1lcy5sZW5ndGhdOwotICAgICAgICBpbml0RnJvbUNvbHVtbnMoY2hpbGRDdXJzb3IsIGNoaWxkRnJvbU5hbWVzLCBtQ2hpbGRGcm9tKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yNTcsMTMgKzIzOCwyOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorICAgIHByaXZhdGUgdm9pZCBpbml0RnJvbUNvbHVtbnMoQ3Vyc29yIGN1cnNvciwgU3RyaW5nW10gZnJvbUNvbHVtbk5hbWVzLCBpbnRbXSBmcm9tQ29sdW1ucykgeworICAgICAgICBmb3IgKGludCBpID0gZnJvbUNvbHVtbk5hbWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmcm9tQ29sdW1uc1tpXSA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coZnJvbUNvbHVtbk5hbWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBiaW5kQ2hpbGRWaWV3KFZpZXcgdmlldywgQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgY3Vyc29yLCBib29sZWFuIGlzTGFzdENoaWxkKSB7CisgICAgICAgIGlmIChtQ2hpbGRGcm9tID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGlsZEZyb20gPSBuZXcgaW50W21DaGlsZEZyb21OYW1lcy5sZW5ndGhdOworICAgICAgICAgICAgaW5pdEZyb21Db2x1bW5zKGN1cnNvciwgbUNoaWxkRnJvbU5hbWVzLCBtQ2hpbGRGcm9tKTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgYmluZFZpZXcodmlldywgY29udGV4dCwgY3Vyc29yLCBtQ2hpbGRGcm9tLCBtQ2hpbGRUbyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYmluZEdyb3VwVmlldyhWaWV3IHZpZXcsIENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvciwgYm9vbGVhbiBpc0V4cGFuZGVkKSB7CisgICAgICAgIGlmIChtR3JvdXBGcm9tID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Hcm91cEZyb20gPSBuZXcgaW50W21Hcm91cEZyb21OYW1lcy5sZW5ndGhdOworICAgICAgICAgICAgaW5pdEZyb21Db2x1bW5zKGN1cnNvciwgbUdyb3VwRnJvbU5hbWVzLCBtR3JvdXBGcm9tKTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgYmluZFZpZXcodmlldywgY29udGV4dCwgY3Vyc29yLCBtR3JvdXBGcm9tLCBtR3JvdXBUbyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCmluZGV4IDE3OTY3ZDkuLjBjZTgxNjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkFycm93S2V5TW92ZW1lbnRNZXRob2Q7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EYXRlS2V5TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EYXRlVGltZUtleUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuRGlhbGVyS2V5TGlzdGVuZXI7CkBAIC04OSwxMCArOTAsMTEgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Um9vdDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKQEAgLTE4NSw3ICsxODcsNyBAQAogICovCiBAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIFRleHRWaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIFZpZXdUcmVlT2JzZXJ2ZXIuT25QcmVEcmF3TGlzdGVuZXIgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlRleHRWaWV3IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGV4dFZpZXciOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0VYVFJBQ1QgPSBmYWxzZTsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgUFJJT1JJVFkgPSAxMDA7CkBAIC02OTYsOSArNjk4LDkgQEAKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dEV4dHJhcyhhLmdldFJlc291cmNlSWQoYXR0ciwgMCkpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudygiVGV4dFZpZXciLCAiRmFpbHVyZSByZWFkaW5nIGlucHV0IGV4dHJhcyIsIGUpOworICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRmFpbHVyZSByZWFkaW5nIGlucHV0IGV4dHJhcyIsIGUpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoIlRleHRWaWV3IiwgIkZhaWx1cmUgcmVhZGluZyBpbnB1dCBleHRyYXMiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkZhaWx1cmUgcmVhZGluZyBpbnB1dCBleHRyYXMiLCBlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC05MjQsNiArOTI2LDggQEAKICAgICAgICAgc2V0Rm9jdXNhYmxlKGZvY3VzYWJsZSk7CiAgICAgICAgIHNldENsaWNrYWJsZShjbGlja2FibGUpOwogICAgICAgICBzZXRMb25nQ2xpY2thYmxlKGxvbmdDbGlja2FibGUpOworCisgICAgICAgIHByZXBhcmVDdXJzb3JDb250cm9sbGVyKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldFR5cGVmYWNlQnlJbmRleChpbnQgdHlwZWZhY2VJbmRleCwgaW50IHN0eWxlSW5kZXgpIHsKQEAgLTExMjksNiArMTEzMyw3IEBACiAgICAgICAgICAgICBzZXRUZXh0KG1UZXh0KTsKIAogICAgICAgICBmaXhGb2N1c2FibGVBbmRDbGlja2FibGVTZXR0aW5ncygpOworICAgICAgICBwcmVwYXJlQ3Vyc29yQ29udHJvbGxlcigpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBmaXhGb2N1c2FibGVBbmRDbGlja2FibGVTZXR0aW5ncygpIHsKQEAgLTIzNzEsOCArMjM3Niw4IEBACiAgICAgICAgIGludCBlbmQgPSAwOwogCiAgICAgICAgIGlmIChtVGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChtVGV4dCk7Ci0gICAgICAgICAgICBlbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG1UZXh0KTsKKyAgICAgICAgICAgIHN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIGVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwogICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDAgfHwgZW5kID49IDApIHsKICAgICAgICAgICAgICAgICAvLyBPciBzYXZlIHN0YXRlIGlmIHRoZXJlIGlzIGEgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICAgc2F2ZSA9IHRydWU7CkBAIC0yNDQ0LDcgKzI0NDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZWQgPSAiKHJlc3RvcmVkKSAiOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoIlRleHRWaWV3IiwgIlNhdmVkIGN1cnNvciBwb3NpdGlvbiAiICsgc3Muc2VsU3RhcnQgKworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2F2ZWQgY3Vyc29yIHBvc2l0aW9uICIgKyBzcy5zZWxTdGFydCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiArIHNzLnNlbEVuZCArICIgb3V0IG9mIHJhbmdlIGZvciAiICsgcmVzdG9yZWQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCAiICsgbVRleHQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNjk2LDYgKzI3MDEsOSBAQAogICAgICAgICBpZiAobmVlZEVkaXRhYmxlRm9yTm90aWZpY2F0aW9uKSB7CiAgICAgICAgICAgICBzZW5kQWZ0ZXJUZXh0Q2hhbmdlZCgoRWRpdGFibGUpIHRleHQpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gRGVwZW5kcyBvbiBjYW5TZWxlY3RUZXh0LCB3aGljaCBkZXBlbmRzIG9uIHRleHQKKyAgICAgICAgcHJlcGFyZUN1cnNvckNvbnRyb2xsZXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTMwMDksNyArMzAxNyw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpbnB1dCA9IFRleHRLZXlMaXN0ZW5lci5nZXRJbnN0YW5jZSgpOwogICAgICAgICB9Ci0gICAgICAgIG1JbnB1dFR5cGUgPSB0eXBlOworICAgICAgICBzZXRSYXdJbnB1dFR5cGUodHlwZSk7CiAgICAgICAgIGlmIChkaXJlY3QpIG1JbnB1dCA9IGlucHV0OwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHNldEtleUxpc3RlbmVyT25seShpbnB1dCk7CkBAIC0zNjEzLDcgKzM2MjEsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkYXRlQ3Vyc29yKCkgewotICAgICAgICBpbnQgd2hlcmUgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG1UZXh0KTsKKyAgICAgICAgaW50IHdoZXJlID0gZ2V0U2VsZWN0aW9uRW5kKCk7CiAKICAgICAgICAgaW52YWxpZGF0ZUN1cnNvcih3aGVyZSwgd2hlcmUsIHdoZXJlKTsKICAgICB9CkBAIC0zNjg5LDcgKzM2OTcsMTggQEAKICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CiAKICAgICAgICAgaWYgKG1Nb3ZlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgY3VycyA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobVRleHQpOworICAgICAgICAgICAgLyogVGhpcyBjb2RlIGFsc28gcHJvdmlkZXMgYXV0by1zY3JvbGxpbmcgd2hlbiBhIGN1cnNvciBpcyBtb3ZlZCB1c2luZyBhCisgICAgICAgICAgICAgKiBDdXJzb3JDb250cm9sbGVyIChpbnNlcnRpb24gcG9pbnQgb3Igc2VsZWN0aW9uIGxpbWl0cykuCisgICAgICAgICAgICAgKiBGb3Igc2VsZWN0aW9uLCBlbnN1cmUgc3RhcnQgb3IgZW5kIGlzIHZpc2libGUgZGVwZW5kaW5nIG9uIGNvbnRyb2xsZXIncyBzdGF0ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IGN1cnMgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgc2VsZWN0aW9uQ29udHJvbGxlciA9CisgICAgICAgICAgICAgICAgICAgIChTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXI7CisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkNvbnRyb2xsZXIuaXNTZWxlY3Rpb25TdGFydERyYWdnZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJzID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBUT0RPOiBUaGlzIHNob3VsZCByZWFsbHkgb25seSBrZWVwIHRoZSBlbmQgaW4gdmlldyBpZgpAQCAtMzk4Miw4ICs0MDAxLDggQEAKICAgICAgICAgLy8gIFhYWCBUaGlzIGlzIG5vdCBzdHJpY3RseSB0cnVlIC0tIGEgcHJvZ3JhbSBjb3VsZCBzZXQgdGhlCiAgICAgICAgIC8vICBzZWxlY3Rpb24gbWFudWFsbHkgaWYgaXQgcmVhbGx5IHdhbnRlZCB0by4KICAgICAgICAgaWYgKG1Nb3ZlbWVudCAhPSBudWxsICYmIChpc0ZvY3VzZWQoKSB8fCBpc1ByZXNzZWQoKSkpIHsKLSAgICAgICAgICAgIHNlbFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KG1UZXh0KTsKLSAgICAgICAgICAgIHNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobVRleHQpOworICAgICAgICAgICAgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgc2VsRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CiAKICAgICAgICAgICAgIGlmIChtQ3Vyc29yVmlzaWJsZSAmJiBzZWxTdGFydCA+PSAwICYmIGlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1IaWdobGlnaHRQYXRoID09IG51bGwpCkBAIC00MDg5LDYgKzQxMDgsMTMgQEAKICAgICAgICAgKi8KIAogICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgIGlmIChtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIuZHJhdyhjYW52YXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuZHJhdyhjYW52YXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00NTAzLDggKzQ1MjksOCBAQAogICAgICAgICAgICAgb3V0QXR0cnMuaGludFRleHQgPSBtSGludDsKICAgICAgICAgICAgIGlmIChtVGV4dCBpbnN0YW5jZW9mIEVkaXRhYmxlKSB7CiAgICAgICAgICAgICAgICAgSW5wdXRDb25uZWN0aW9uIGljID0gbmV3IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uKHRoaXMpOwotICAgICAgICAgICAgICAgIG91dEF0dHJzLmluaXRpYWxTZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChtVGV4dCk7Ci0gICAgICAgICAgICAgICAgb3V0QXR0cnMuaW5pdGlhbFNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobVRleHQpOworICAgICAgICAgICAgICAgIG91dEF0dHJzLmluaXRpYWxTZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgb3V0QXR0cnMuaW5pdGlhbFNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwogICAgICAgICAgICAgICAgIG91dEF0dHJzLmluaXRpYWxDYXBzTW9kZSA9IGljLmdldEN1cnNvckNhcHNNb2RlKG1JbnB1dFR5cGUpOwogICAgICAgICAgICAgICAgIHJldHVybiBpYzsKICAgICAgICAgICAgIH0KQEAgLTQ1ODksOCArNDYxNSw4IEBACiAgICAgICAgICAgICAgICAgb3V0VGV4dC5mbGFncyB8PSBFeHRyYWN0ZWRUZXh0LkZMQUdfU0lOR0xFX0xJTkU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvdXRUZXh0LnN0YXJ0T2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIG91dFRleHQuc2VsZWN0aW9uU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoY29udGVudCk7Ci0gICAgICAgICAgICBvdXRUZXh0LnNlbGVjdGlvbkVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoY29udGVudCk7CisgICAgICAgICAgICBvdXRUZXh0LnNlbGVjdGlvblN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIG91dFRleHQuc2VsZWN0aW9uRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC00NjA3LDcgKzQ2MzMsNyBAQAogICAgICAgICAgICAgICAgIGlmIChyZXEgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihUQUcsICJSZXRyaWV2aW5nIGV4dHJhY3RlZCBzdGFydD0iCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoTE9HX1RBRywgIlJldHJpZXZpbmcgZXh0cmFjdGVkIHN0YXJ0PSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbXMubUNoYW5nZWRTdGFydCArICIgZW5kPSIgKyBpbXMubUNoYW5nZWRFbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRlbHRhPSIgKyBpbXMubUNoYW5nZWREZWx0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1zLm1DaGFuZ2VkU3RhcnQgPCAwICYmICFjb250ZW50Q2hhbmdlZCkgewpAQCAtNDYxNSw3ICs0NjQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYWN0VGV4dEludGVybmFsKHJlcSwgaW1zLm1DaGFuZ2VkU3RhcnQsIGltcy5tQ2hhbmdlZEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1zLm1DaGFuZ2VkRGVsdGEsIGltcy5tVG1wRXh0cmFjdGVkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihUQUcsICJSZXBvcnRpbmcgZXh0cmFjdGVkIHN0YXJ0PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoTE9HX1RBRywgIlJlcG9ydGluZyBleHRyYWN0ZWQgc3RhcnQ9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbXMubVRtcEV4dHJhY3RlZC5wYXJ0aWFsU3RhcnRPZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBlbmQ9IiArIGltcy5tVG1wRXh0cmFjdGVkLnBhcnRpYWxFbmRPZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIGltcy5tVG1wRXh0cmFjdGVkLnRleHQpOwpAQCAtNDc2OSw3ICs0Nzk1LDcgQEAKICAgICAKICAgICB2b2lkIHVwZGF0ZUFmdGVyRWRpdCgpIHsKICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICBpbnQgY3VycyA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChtVGV4dCk7CisgICAgICAgIGludCBjdXJzID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKIAogICAgICAgICBpZiAoY3VycyA+PSAwIHx8IChtR3Jhdml0eSAmIEdyYXZpdHkuVkVSVElDQUxfR1JBVklUWV9NQVNLKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmF2aXR5LkJPVFRPTSkgewpAQCAtNDc4NCw3ICs0ODEwLDcgQEAKICAgICAgICAgICAgICAgICBtYWtlQmxpbmsoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBjaGVja0ZvclJlc2l6ZSgpOwogICAgIH0KICAgICAKQEAgLTQ5MTMsNyArNDkzOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGFsaWdubWVudCwgbVNwYWNpbmdNdWx0LCBtU3BhY2luZ0FkZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yaW5nLCBtSW5jbHVkZVBhZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoImFhYSIsICJCb3Jpbmc6ICIgKyBtVHJhbnNmb3JtZWQpOwogCiAgICAgICAgICAgICAgICAgICAgIG1TYXZlZExheW91dCA9IChCb3JpbmdMYXlvdXQpIG1MYXlvdXQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRFbGxpcHNpemUgJiYgYm9yaW5nLndpZHRoIDw9IHcpIHsKQEAgLTU1MDgsNyArNTUzMyw3IEBACiAgICAgICAgIC8vIEZJWE1FOiBJcyBpdCBva2F5IHRvIHRydW5jYXRlIHRoaXMsIG9yIHNob3VsZCB3ZSByb3VuZD8KICAgICAgICAgZmluYWwgaW50IHggPSAoaW50KW1MYXlvdXQuZ2V0UHJpbWFyeUhvcml6b250YWwob2Zmc2V0KTsKICAgICAgICAgZmluYWwgaW50IHRvcCA9IG1MYXlvdXQuZ2V0TGluZVRvcChsaW5lKTsKLSAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IG1MYXlvdXQuZ2V0TGluZVRvcChsaW5lKzEpOworICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gbUxheW91dC5nZXRMaW5lVG9wKGxpbmUgKyAxKTsKIAogICAgICAgICBpbnQgbGVmdCA9IChpbnQpIEZsb2F0TWF0aC5mbG9vcihtTGF5b3V0LmdldExpbmVMZWZ0KGxpbmUpKTsKICAgICAgICAgaW50IHJpZ2h0ID0gKGludCkgRmxvYXRNYXRoLmNlaWwobUxheW91dC5nZXRMaW5lUmlnaHQobGluZSkpOwpAQCAtNTY0NSw4ICs1NjcwLDggQEAKICAgICAgICAgICAgIC8vIHZpZXdwb3J0IGNvb3JkaW5hdGVzLCBidXQgcmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKCkKICAgICAgICAgICAgIC8vIGlzIGluIHRlcm1zIG9mIGNvbnRlbnQgY29vcmRpbmF0ZXMuCiAKLSAgICAgICAgICAgIFJlY3QgciA9IG5ldyBSZWN0KCk7Ci0gICAgICAgICAgICBnZXRJbnRlcmVzdGluZ1JlY3QociwgeCwgdG9wLCBib3R0b20sIGxpbmUpOworICAgICAgICAgICAgUmVjdCByID0gbmV3IFJlY3QoeCwgdG9wLCB4ICsgMSwgYm90dG9tKTsKKyAgICAgICAgICAgIGdldEludGVyZXN0aW5nUmVjdChyLCBsaW5lKTsKICAgICAgICAgICAgIHIub2Zmc2V0KG1TY3JvbGxYLCBtU2Nyb2xsWSk7CiAKICAgICAgICAgICAgIGlmIChyZXF1ZXN0UmVjdGFuZ2xlT25TY3JlZW4ocikpIHsKQEAgLTU2NjksOCArNTY5NCw4IEBACiAgICAgICAgIGlmICghKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIGludCBzdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChtVGV4dCk7Ci0gICAgICAgIGludCBlbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG1UZXh0KTsKKyAgICAgICAgaW50IHN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgaW50IGVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwogICAgICAgICBpZiAoc3RhcnQgIT0gZW5kKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTU2ODAsNyArNTcwNSw3IEBACiAgICAgICAgIGludCBsaW5lID0gbUxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KHN0YXJ0KTsKIAogICAgICAgICBmaW5hbCBpbnQgdG9wID0gbUxheW91dC5nZXRMaW5lVG9wKGxpbmUpOwotICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gbUxheW91dC5nZXRMaW5lVG9wKGxpbmUrMSk7CisgICAgICAgIGZpbmFsIGludCBib3R0b20gPSBtTGF5b3V0LmdldExpbmVUb3AobGluZSArIDEpOwogICAgICAgICBmaW5hbCBpbnQgdnNwYWNlID0gbUJvdHRvbSAtIG1Ub3AgLSBnZXRFeHRlbmRlZFBhZGRpbmdUb3AoKSAtIGdldEV4dGVuZGVkUGFkZGluZ0JvdHRvbSgpOwogICAgICAgICBpbnQgdnNsYWNrID0gKGJvdHRvbSAtIHRvcCkgLyAyOwogICAgICAgICBpZiAodnNsYWNrID4gdnNwYWNlIC8gNCkKQEAgLTU3MzAsMjIgKzU3NTUsMjggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBnZXRJbnRlcmVzdGluZ1JlY3QoUmVjdCByLCBpbnQgaCwgaW50IHRvcCwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgICAgcHJpdmF0ZSB2b2lkIGdldEludGVyZXN0aW5nUmVjdChSZWN0IHIsIGludCBsaW5lKSB7CisgICAgICAgIGNvbnZlcnRGcm9tVmlld3BvcnRUb0NvbnRlbnRDb29yZGluYXRlcyhyKTsKKworICAgICAgICAvLyBSZWN0YW5nbGUgY2FuIGNhbiBiZSBleHBhbmRlZCBvbiBmaXJzdCBhbmQgbGFzdCBsaW5lIHRvIHRha2UKKyAgICAgICAgLy8gcGFkZGluZyBpbnRvIGFjY291bnQuCisgICAgICAgIC8vIFRPRE8gVGFrZSBsZWZ0L3JpZ2h0IHBhZGRpbmcgaW50byBhY2NvdW50IHRvbz8KKyAgICAgICAgaWYgKGxpbmUgPT0gMCkgci50b3AgLT0gZ2V0RXh0ZW5kZWRQYWRkaW5nVG9wKCk7CisgICAgICAgIGlmIChsaW5lID09IG1MYXlvdXQuZ2V0TGluZUNvdW50KCkgLSAxKSByLmJvdHRvbSArPSBnZXRFeHRlbmRlZFBhZGRpbmdCb3R0b20oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29udmVydEZyb21WaWV3cG9ydFRvQ29udGVudENvb3JkaW5hdGVzKFJlY3QgcikgewogICAgICAgICBpbnQgcGFkZGluZ1RvcCA9IGdldEV4dGVuZGVkUGFkZGluZ1RvcCgpOwogICAgICAgICBpZiAoKG1HcmF2aXR5ICYgR3Jhdml0eS5WRVJUSUNBTF9HUkFWSVRZX01BU0spICE9IEdyYXZpdHkuVE9QKSB7CiAgICAgICAgICAgICBwYWRkaW5nVG9wICs9IGdldFZlcnRpY2FsT2Zmc2V0KGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICB0b3AgKz0gcGFkZGluZ1RvcDsKLSAgICAgICAgYm90dG9tICs9IHBhZGRpbmdUb3A7Ci0gICAgICAgIGggKz0gZ2V0Q29tcG91bmRQYWRkaW5nTGVmdCgpOworICAgICAgICByLnRvcCArPSBwYWRkaW5nVG9wOworICAgICAgICByLmJvdHRvbSArPSBwYWRkaW5nVG9wOwogCi0gICAgICAgIGlmIChsaW5lID09IDApCi0gICAgICAgICAgICB0b3AgLT0gZ2V0RXh0ZW5kZWRQYWRkaW5nVG9wKCk7Ci0gICAgICAgIGlmIChsaW5lID09IG1MYXlvdXQuZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgYm90dG9tICs9IGdldEV4dGVuZGVkUGFkZGluZ0JvdHRvbSgpOworICAgICAgICBpbnQgcGFkZGluZ0xlZnQgPSBnZXRDb21wb3VuZFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIHIubGVmdCArPSBwYWRkaW5nTGVmdDsKKyAgICAgICAgci5yaWdodCArPSBwYWRkaW5nTGVmdDsKIAotICAgICAgICByLnNldChoLCB0b3AsIGgrMSwgYm90dG9tKTsKICAgICAgICAgci5vZmZzZXQoLW1TY3JvbGxYLCAtbVNjcm9sbFkpOwogICAgIH0KIApAQCAtNTkxMyw2ICs1OTQ0LDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChtQmxpbmsgIT0gbnVsbCkgewogICAgICAgICAgICAgbUJsaW5rLnJlbW92ZUNhbGxiYWNrcyhtQmxpbmspOwogICAgICAgICB9CisgICAgICAgIHByZXBhcmVDdXJzb3JDb250cm9sbGVyKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbk1hcnF1ZWUoKSB7CkBAIC02MzI3LDcgKzYzNTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0VYVFJBQ1QpIExvZy52KFRBRywgIlNwYW4gY2hhbmdlIG91dHNpZGUgb2YgYmF0Y2g6ICIKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0VYVFJBQ1QpIExvZy52KExPR19UQUcsICJTcGFuIGNoYW5nZSBvdXRzaWRlIG9mIGJhdGNoOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvbGRTdGFydCArICItIiArIG9sZEVuZCArICIsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV3U3RhcnQgKyAiLSIgKyBuZXdFbmQgKyB3aGF0KTsKICAgICAgICAgICAgICAgICAgICAgaW1zLm1Db250ZW50Q2hhbmdlZCA9IHRydWU7CkBAIC02MzQzLDcgKzYzNzUsNyBAQAogCiAgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBidWZmZXIsIGludCBzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlZm9yZSwgaW50IGFmdGVyKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoVEFHLCAiYmVmb3JlVGV4dENoYW5nZWQgc3RhcnQ9IiArIHN0YXJ0CisgICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoTE9HX1RBRywgImJlZm9yZVRleHRDaGFuZ2VkIHN0YXJ0PSIgKyBzdGFydAogICAgICAgICAgICAgICAgICAgICArICIgYmVmb3JlPSIgKyBiZWZvcmUgKyAiIGFmdGVyPSIgKyBhZnRlciArICI6ICIgKyBidWZmZXIpOwogCiAgICAgICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpLmlzRW5hYmxlZCgpCkBAIC02MzU2LDcgKzYzODgsNyBAQAogCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIGJ1ZmZlciwgaW50IHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZWZvcmUsIGludCBhZnRlcikgewotICAgICAgICAgICAgaWYgKERFQlVHX0VYVFJBQ1QpIExvZy52KFRBRywgIm9uVGV4dENoYW5nZWQgc3RhcnQ9IiArIHN0YXJ0CisgICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoTE9HX1RBRywgIm9uVGV4dENoYW5nZWQgc3RhcnQ9IiArIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICsgIiBiZWZvcmU9IiArIGJlZm9yZSArICIgYWZ0ZXI9IiArIGFmdGVyICsgIjogIiArIGJ1ZmZlcik7CiAgICAgICAgICAgICBUZXh0Vmlldy50aGlzLmhhbmRsZVRleHRDaGFuZ2VkKGJ1ZmZlciwgc3RhcnQsIGJlZm9yZSwgYWZ0ZXIpOwogCkBAIC02MzY2LDEwICs2Mzk4LDE1IEBACiAgICAgICAgICAgICAgICAgc2VuZEFjY2Vzc2liaWxpdHlFdmVudFR5cGVWaWV3VGV4dENoYW5nZWQobUJlZm9yZVRleHQsIHN0YXJ0LCBiZWZvcmUsIGFmdGVyKTsKICAgICAgICAgICAgICAgICBtQmVmb3JlVGV4dCA9IG51bGw7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE8uIFRoZSBjdXJzb3IgY29udHJvbGxlciBzaG91bGQgaGlkZSBhcyBzb29uIGFzIHRleHQgaXMgdHlwZWQuCisgICAgICAgICAgICAvLyBCdXQgdGhpcyBtZXRob2QgaXMgYWxzbyB1c2VkIGZvciBjb3NtZXRpYyBjaGFuZ2VzICh1bmRlcmxpbmUgY3VycmVudCB3b3JkIHdoZW4KKyAgICAgICAgICAgIC8vIHNwZWxsIGNvcnJlY3Rpb25zIGFyZSBkaXNwbGF5ZWQuIFRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgdG8gbWFrZSB0aGUgZGlmZmVyZW5jZQorICAgICAgICAgICAgLy8gYmV0d2VlbiB0aGVzZSBjb3NtZXRpYyBjaGFuZ2VzIGFuZCBhY3R1YWwgdGV4dCBtb2RpZmljYXRpb25zLgogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihUQUcsICJhZnRlclRleHRDaGFuZ2VkOiAiICsgYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihMT0dfVEFHLCAiYWZ0ZXJUZXh0Q2hhbmdlZDogIiArIGJ1ZmZlcik7CiAgICAgICAgICAgICBUZXh0Vmlldy50aGlzLnNlbmRBZnRlclRleHRDaGFuZ2VkKGJ1ZmZlcik7CiAKICAgICAgICAgICAgIGlmIChNZXRhS2V5S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGJ1ZmZlciwKQEAgLTYzODAsMTkgKzY0MTcsMTkgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBvblNwYW5DaGFuZ2VkKFNwYW5uYWJsZSBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHdoYXQsIGludCBzLCBpbnQgZSwgaW50IHN0LCBpbnQgZW4pIHsKLSAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihUQUcsICJvblNwYW5DaGFuZ2VkIHM9IiArIHMgKyAiIGU9IiArIGUKKyAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihMT0dfVEFHLCAib25TcGFuQ2hhbmdlZCBzPSIgKyBzICsgIiBlPSIgKyBlCiAgICAgICAgICAgICAgICAgICAgICsgIiBzdD0iICsgc3QgKyAiIGVuPSIgKyBlbiArICIgd2hhdD0iICsgd2hhdCArICI6ICIgKyBidWYpOwogICAgICAgICAgICAgVGV4dFZpZXcudGhpcy5zcGFuQ2hhbmdlKGJ1Ziwgd2hhdCwgcywgc3QsIGUsIGVuKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3BhbkFkZGVkKFNwYW5uYWJsZSBidWYsIE9iamVjdCB3aGF0LCBpbnQgcywgaW50IGUpIHsKLSAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihUQUcsICJvblNwYW5BZGRlZCBzPSIgKyBzICsgIiBlPSIgKyBlCisgICAgICAgICAgICBpZiAoREVCVUdfRVhUUkFDVCkgTG9nLnYoTE9HX1RBRywgIm9uU3BhbkFkZGVkIHM9IiArIHMgKyAiIGU9IiArIGUKICAgICAgICAgICAgICAgICAgICAgKyAiIHdoYXQ9IiArIHdoYXQgKyAiOiAiICsgYnVmKTsKICAgICAgICAgICAgIFRleHRWaWV3LnRoaXMuc3BhbkNoYW5nZShidWYsIHdoYXQsIC0xLCBzLCAtMSwgZSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBvblNwYW5SZW1vdmVkKFNwYW5uYWJsZSBidWYsIE9iamVjdCB3aGF0LCBpbnQgcywgaW50IGUpIHsKLSAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihUQUcsICJvblNwYW5SZW1vdmVkIHM9IiArIHMgKyAiIGU9IiArIGUKKyAgICAgICAgICAgIGlmIChERUJVR19FWFRSQUNUKSBMb2cudihMT0dfVEFHLCAib25TcGFuUmVtb3ZlZCBzPSIgKyBzICsgIiBlPSIgKyBlCiAgICAgICAgICAgICAgICAgICAgICsgIiB3aGF0PSIgKyB3aGF0ICsgIjogIiArIGJ1Zik7CiAgICAgICAgICAgICBUZXh0Vmlldy50aGlzLnNwYW5DaGFuZ2UoYnVmLCB3aGF0LCBzLCAtMSwgZSwgLTEpOwogICAgICAgICB9CkBAIC02NTAyLDYgKzY1MzksMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIERvbid0IGxlYXZlIHVzIGluIHRoZSBtaWRkbGUgb2YgYSBiYXRjaCBlZGl0LgogICAgICAgICAgICAgb25FbmRCYXRjaEVkaXQoKTsKKworICAgICAgICAgICAgaWYgKG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIuaGlkZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuaGlkZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgc3RhcnRTdG9wTWFycXVlZShmb2N1c2VkKTsKQEAgLTY1ODksNiArNjYzMyw4IEBACiAgICAgICAgICAgICBpZiAocmVzdWx0Q29kZSA9PSBJbnB1dE1ldGhvZE1hbmFnZXIuUkVTVUxUX1NIT1dOKSB7CiAgICAgICAgICAgICAgICAgc3RhcnQgPSBtUHJldlN0YXJ0OwogICAgICAgICAgICAgICAgIGVuZCA9IG1QcmV2RW5kOworICAgICAgICAgICAgfSBlbHNlIGlmIChtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyLnNob3coKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IG1UZXh0Lmxlbmd0aCgpOwpAQCAtNjYyOSwyMCArNjY3NSwyNyBAQAogICAgICAgICAgICAgCiAgICAgICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IG9sZFNlbFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KG1UZXh0KTsKLSAgICAgICAgICAgIGludCBvbGRTZWxFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG1UZXh0KTsKLSAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IG9sZFNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIGludCBvbGRTZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKworICAgICAgICAgICAgaWYgKG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLm9uVG91Y2hFdmVudChldmVudCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtTW92ZW1lbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gbU1vdmVtZW50Lm9uVG91Y2hFdmVudCh0aGlzLCAoU3Bhbm5hYmxlKSBtVGV4dCwgZXZlbnQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVRleHQgaW5zdGFuY2VvZiBFZGl0YWJsZSAmJiBvbkNoZWNrSXNUZXh0RWRpdG9yKCkpIHsKKyAgICAgICAgICAgIGlmIChpc1RleHRFZGl0YWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgaXNGb2N1c2VkKCkgJiYgIW1TY3JvbGxlZCkgewogICAgICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3U2VsU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQobVRleHQpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3U2VsRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChtVGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZXdTZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZXdTZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKIAogICAgICAgICAgICAgICAgICAgICBDb21taXRTZWxlY3Rpb25SZWNlaXZlciBjc3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICBpZiAobmV3U2VsU3RhcnQgIT0gb2xkU2VsU3RhcnQgfHwgbmV3U2VsRW5kICE9IG9sZFNlbEVuZCkgewpAQCAtNjY1MCw3ICs2NzAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2VsU3RhcnQsIG5ld1NlbEVuZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gaW1tLnNob3dTb2Z0SW5wdXQodGhpcywgMCwgY3NyKSAmJiAoY3NyICE9IG51bGwpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IGltbS5zaG93U29mdElucHV0KHRoaXMsIDAsIGNzcikgJiYgKGNzciAhPSBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTY2NjIsNiArNjcxNSw0NyBAQAogICAgICAgICByZXR1cm4gc3VwZXJSZXN1bHQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVDdXJzb3JDb250cm9sbGVyKCkgeworICAgICAgICBib29sZWFuIGF0TGVhc3RPbmVDb250cm9sbGVyID0gZmFsc2U7CisKKyAgICAgICAgLy8gVE9ETyBBZGQgYW4gZXh0cmEgYW5kcm9pZDpjdXJzb3JDb250cm9sbGVyIGZsYWcgdG8gZGlzYWJsZSB0aGUgY29udHJvbGxlcj8KKyAgICAgICAgaWYgKG1DdXJzb3JWaXNpYmxlKSB7CisgICAgICAgICAgICBhdExlYXN0T25lQ29udHJvbGxlciA9IHRydWU7CisgICAgICAgICAgICBpZiAobUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciA9IG5ldyBJbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSkgeworICAgICAgICAgICAgYXRMZWFzdE9uZUNvbnRyb2xsZXIgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPSBuZXcgU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdExlYXN0T25lQ29udHJvbGxlcikgeworICAgICAgICAgICAgaWYgKHNDdXJzb3JDb250cm9sbGVyVGVtcFJlY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNDdXJzb3JDb250cm9sbGVyVGVtcFJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgbUN1cnNvckNvbnRyb2xsZXJWZXJ0aWNhbE9mZnNldCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbE9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5jdXJzb3JfY29udHJvbGxlcl92ZXJ0aWNhbF9vZmZzZXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc0N1cnNvckNvbnRyb2xsZXJUZW1wUmVjdCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRydWUgaWZmIHRoaXMgVGV4dFZpZXcgY29udGFpbnMgYSB0ZXh0IHRoYXQgY2FuIGJlIGVkaXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNUZXh0RWRpdGFibGUoKSB7CisgICAgICAgIHJldHVybiBtVGV4dCBpbnN0YW5jZW9mIEVkaXRhYmxlICYmIG9uQ2hlY2tJc1RleHRFZGl0b3IoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUsIG9ubHkgd2hpbGUgcHJvY2Vzc2luZyBhIHRvdWNoIGdlc3R1cmUsIGlmIHRoZSBpbml0aWFsCiAgICAgICogdG91Y2ggZG93biBldmVudCBjYXVzZWQgZm9jdXMgdG8gbW92ZSB0byB0aGUgdGV4dCB2aWV3IGFuZCBhcyBhIHJlc3VsdApAQCAtNjcxMiw4ICs2ODA2LDggQEAKICAgICAgICAgICAgIFRleHRWaWV3IHR2ID0gbVZpZXcuZ2V0KCk7CiAKICAgICAgICAgICAgIGlmICh0diAhPSBudWxsICYmIHR2LmlzRm9jdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KHR2Lm1UZXh0KTsKLSAgICAgICAgICAgICAgICBpbnQgZW4gPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKHR2Lm1UZXh0KTsKKyAgICAgICAgICAgICAgICBpbnQgc3QgPSB0di5nZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgICAgIGludCBlbiA9IHR2LmdldFNlbGVjdGlvbkVuZCgpOwogCiAgICAgICAgICAgICAgICAgaWYgKHN0ID09IGVuICYmIHN0ID49IDAgJiYgZW4gPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAodHYubUxheW91dCAhPSBudWxsKSB7CkBAIC02NzkwLDggKzY4ODQsMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaWYgKG1MYXlvdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBtTGF5b3V0LmdldFdpZHRoKCk7CisgICAgICAgIGlmIChtTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2luZ2xlTGluZSAmJiAobUdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSA9PSBHcmF2aXR5LkxFRlQgPworICAgICAgICAgICAgICAgICAgICAoaW50KSBtTGF5b3V0LmdldExpbmVXaWR0aCgwKSA6IG1MYXlvdXQuZ2V0V2lkdGgoKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5jb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7CiAgICAgfQpAQCAtNjkwMyw2ICs2OTk5LDkgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2VsZWN0VGV4dCgpIHsKKyAgICAgICAgLy8gcHJlcGFyZUN1cnNvckNvbnRyb2xsZXIoKSByZWxpZXMgb24gdGhpcyBtZXRob2QuCisgICAgICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjb25kaXRpb24sIG1ha2Ugc3VyZSBwcmVwYXJlQ3Vyc29yQ29udHJvbGxlciBpcyBjYWxsZWQgYW55d2hlcmUKKyAgICAgICAgLy8gdGhlIHZhbHVlIG9mIHRoaXMgY29uZGl0aW9uIG1pZ2h0IGJlIGNoYW5nZWQuCiAgICAgICAgIGlmIChtVGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZSAmJiBtVGV4dC5sZW5ndGgoKSAhPSAwICYmCiAgICAgICAgICAgICBtTW92ZW1lbnQgIT0gbnVsbCAmJiBtTW92ZW1lbnQuY2FuU2VsZWN0QXJiaXRyYXJpbHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC02OTUxLDEwICs3MDUwLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHdvcmQgdG8gYWRkIHRvIHRoZSBkaWN0aW9uYXJ5IGZyb20gdGhlIGNvbnRleHQgbWVudSwKLSAgICAgKiBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGN1cnNvciBvciBubyB3b3JkIGF0IHRoZSBjdXJzb3IuCisgICAgICogUmV0dXJucyB0aGUgb2Zmc2V0cyBkZWxpbWl0aW5nIHRoZSAnd29yZCcgbG9jYXRlZCBhdCBwb3NpdGlvbiBvZmZzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IEFuIG9mZnNldCBpbiB0aGUgdGV4dC4KKyAgICAgKiBAcmV0dXJuIFRoZSBvZmZzZXRzIGZvciB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgd29yZCBsb2NhdGVkIGF0IDxjb2RlPm9mZnNldDwvY29kZT4uCisgICAgICogVGhlIHR3byBpbnRzIG9mZnNldHMgYXJlIHBhY2tlZCBpbiBhIGxvbmcsIHdpdGggdGhlIHN0YXJ0aW5nIG9mZnNldCBzaGlmdGVkIGJ5IDMyIGJpdHMuCisgICAgICogUmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIG5vIHZhbGlkIHdvcmQgd2FzIGZvdW5kLgogICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFdvcmRGb3JEaWN0aW9uYXJ5KCkgeworICAgIHByaXZhdGUgbG9uZyBnZXRXb3JkTGltaXRzQXQoaW50IG9mZnNldCkgewogICAgICAgICAvKgogICAgICAgICAgKiBRdWljayByZXR1cm4gaWYgdGhlIGlucHV0IHR5cGUgaXMgb25lIHdoZXJlIGFkZGluZyB3b3JkcwogICAgICAgICAgKiB0byB0aGUgZGljdGlvbmFyeSBkb2Vzbid0IG1ha2UgYW55IHNlbnNlLgpAQCAtNjk2Myw3ICs3MDY2LDcgQEAKICAgICAgICAgaWYgKGtsYXNzID09IElucHV0VHlwZS5UWVBFX0NMQVNTX05VTUJFUiB8fAogICAgICAgICAgICAga2xhc3MgPT0gSW5wdXRUeXBlLlRZUEVfQ0xBU1NfUEhPTkUgfHwKICAgICAgICAgICAgIGtsYXNzID09IElucHV0VHlwZS5UWVBFX0NMQVNTX0RBVEVUSU1FKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCiAgICAgICAgIGludCB2YXJpYXRpb24gPSBtSW5wdXRUeXBlICYgSW5wdXRUeXBlLlRZUEVfTUFTS19WQVJJQVRJT047CkBAIC02OTcyLDEzICs3MDc1LDEzIEBACiAgICAgICAgICAgICB2YXJpYXRpb24gPT0gSW5wdXRUeXBlLlRZUEVfVEVYVF9WQVJJQVRJT05fVklTSUJMRV9QQVNTV09SRCB8fAogICAgICAgICAgICAgdmFyaWF0aW9uID09IElucHV0VHlwZS5UWVBFX1RFWFRfVkFSSUFUSU9OX0VNQUlMX0FERFJFU1MgfHwKICAgICAgICAgICAgIHZhcmlhdGlvbiA9PSBJbnB1dFR5cGUuVFlQRV9URVhUX1ZBUklBVElPTl9GSUxURVIpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IGVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworICAgICAgICBpbnQgZW5kID0gb2Zmc2V0OwogCiAgICAgICAgIGlmIChlbmQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCiAgICAgICAgIGludCBzdGFydCA9IGVuZDsKQEAgLTcwMTIsNiArNzExNSwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gNDgpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCiAgICAgICAgIGJvb2xlYW4gaGFzTGV0dGVyID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKG1UcmFuc2Zvcm1lZC5jaGFyQXQoaSkpKSB7CkBAIC03MDE5LDE5ICs3MTMwLDI4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKwogICAgICAgICBpZiAoIWhhc0xldHRlcikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQorICAgICAgICAvLyBUd28gaW50cyBwYWNrZWQgaW4gYSBsb25nCisgICAgICAgIHJldHVybiAoKChsb25nKSBzdGFydCkgPDwgMzIpIHwgZW5kOworICAgIH0KIAotICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiA0OCkgeworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB3b3JkIHRvIGFkZCB0byB0aGUgZGljdGlvbmFyeSBmcm9tIHRoZSBjb250ZXh0IG1lbnUsCisgICAgICogb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBjdXJzb3Igb3Igbm8gd29yZCBhdCB0aGUgY3Vyc29yLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFdvcmRGb3JEaWN0aW9uYXJ5KCkgeworICAgICAgICBsb25nIHdvcmRMaW1pdHMgPSBnZXRXb3JkTGltaXRzQXQoZ2V0U2VsZWN0aW9uRW5kKCkpOworICAgICAgICBpZiAod29yZExpbWl0cyA8IDApIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIGludCBzdGFydCA9IChpbnQpICh3b3JkTGltaXRzID4+PiAzMik7CisgICAgICAgICAgICAgaW50IGVuZCA9IChpbnQpICh3b3JkTGltaXRzICYgMHgwMDAwMDAwMEZGRkZGRkZGTCk7CisgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLnN1YnN0cmluZyhtVHJhbnNmb3JtZWQsIHN0YXJ0LCBlbmQpOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFRleHRVdGlscy5zdWJzdHJpbmcobVRyYW5zZm9ybWVkLCBzdGFydCwgZW5kKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTczMzEsNiArNzQ1MSwxNSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUxvbmdDbGljaygpIHsKKyAgICAgICAgLy8gVE9ETyBUaGlzIGJlaGF2aW9yIHNob3VsZCBiZSBtb3ZlZCB0byBWaWV3CisgICAgICAgIC8vIFRPRE8gaGFuZGxlIGxlZ2FjeSBjb2RlIHRoYXQgYWRkZWQgaXRlbXMgdG8gY29udGV4dCBtZW51CisgICAgICAgIGlmIChjYW5TZWxlY3RUZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChzdGFydFNlbGVjdGlvbk1vZGUoKSkgeworICAgICAgICAgICAgICAgIG1FYXRUb3VjaFJlbGVhc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaWYgKHN1cGVyLnBlcmZvcm1Mb25nQ2xpY2soKSkgewogICAgICAgICAgICAgbUVhdFRvdWNoUmVsZWFzZSA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTczMzksNiArNzQ2OCw0OTMgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydFNlbGVjdGlvbk1vZGUoKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAoKFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcikgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcikuCisgICAgICAgICAgICBnZXRUb3VjaE9mZnNldCgpOworCisgICAgICAgICAgICBpbnQgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZDsKKworICAgICAgICAgICAgaWYgKGhhc1NlbGVjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA+IHNlbGVjdGlvbkVuZCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdG1wID0gc2VsZWN0aW9uU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uRW5kOworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQgPSB0bXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgob2Zmc2V0ID49IHNlbGVjdGlvblN0YXJ0KSAmJiAob2Zmc2V0IDw9IHNlbGVjdGlvbkVuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9uZyBwcmVzcyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBpbml0aWF0ZSBhIGRyYWcuIFJldHVybiBmYWxzZSwgdG8gcmVseSBvbiBjb250ZXh0IG1lbnUgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9uZyB3b3JkTGltaXRzID0gZ2V0V29yZExpbWl0c0F0KG9mZnNldCk7CisgICAgICAgICAgICBpZiAod29yZExpbWl0cyA+PSAwKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSAoaW50KSAod29yZExpbWl0cyA+Pj4gMzIpOworICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IChpbnQpICh3b3JkTGltaXRzICYgMHgwMDAwMDAwMEZGRkZGRkZGTCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gTWF0aC5tYXgob2Zmc2V0IC0gNSwgMCk7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gTWF0aC5taW4ob2Zmc2V0ICsgNSwgbVRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKKworICAgICAgICAgICAgLy8gSGFzIHRvIGJlIGRvbmUgQUZURVIgc2VsZWN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgdG8gY29ycmVjdGx5IHBvc2l0aW9uIGNvbnRyb2xsZXJzLgorICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5zaG93KCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgb2Zmc2V0IGNoYXJhY3RlciBjbG9zZXN0IHRvIHRoZSBzcGVjaWZpZWQgYWJzb2x1dGUgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0geCBUaGUgaG9yaXpvbnRhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiBhIHBvaW50IG9uIHNjcmVlbgorICAgICAqIEBwYXJhbSB5IFRoZSB2ZXJ0aWNhbCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiBhIHBvaW50IG9uIHNjcmVlbgorICAgICAqIEByZXR1cm4gdGhlICBjaGFyYWN0ZXIgb2Zmc2V0IGZvciB0aGUgY2hhcmFjdGVyIHdob3NlIHBvc2l0aW9uIGlzIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZAorICAgICAqICBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqICBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KGludCB4LCBpbnQgeSkgeworICAgICAgICB4IC09IGdldFRvdGFsUGFkZGluZ0xlZnQoKTsKKyAgICAgICAgeSAtPSBnZXRUb3RhbFBhZGRpbmdUb3AoKTsKKworICAgICAgICAvLyBDbGFtcCB0aGUgcG9zaXRpb24gdG8gaW5zaWRlIG9mIHRoZSB2aWV3LgorICAgICAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgICAgIHggPSAwOworICAgICAgICB9IGVsc2UgaWYgKHggPj0gKGdldFdpZHRoKCkgLSBnZXRUb3RhbFBhZGRpbmdSaWdodCgpKSkgeworICAgICAgICAgICAgeCA9IGdldFdpZHRoKCktZ2V0VG90YWxQYWRkaW5nUmlnaHQoKSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHkgPCAwKSB7CisgICAgICAgICAgICB5ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh5ID49IChnZXRIZWlnaHQoKSAtIGdldFRvdGFsUGFkZGluZ0JvdHRvbSgpKSkgeworICAgICAgICAgICAgeSA9IGdldEhlaWdodCgpLWdldFRvdGFsUGFkZGluZ0JvdHRvbSgpIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHggKz0gZ2V0U2Nyb2xsWCgpOworICAgICAgICB5ICs9IGdldFNjcm9sbFkoKTsKKworICAgICAgICBMYXlvdXQgbGF5b3V0ID0gZ2V0TGF5b3V0KCk7CisgICAgICAgIGZpbmFsIGludCBsaW5lID0gbGF5b3V0LmdldExpbmVGb3JWZXJ0aWNhbCh5KTsKKyAgICAgICAgZmluYWwgaW50IG9mZnNldCA9IGxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIHgpOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgfQorCisgICAgLyoqCisgICAgICogQSBDdXJzb3JDb250cm9sbGVyIGluc3RhbmNlIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgYSBjdXJzb3IgaW4gdGhlIHRleHQuCisgICAgICoKKyAgICAgKiBJdCBjYW4gYmUgcGFzc2VkIHRvIGFuIHtAbGluayBBcnJvd0tleU1vdmVtZW50TWV0aG9kfSB3aGljaCBjYW4gaW50ZXJjZXB0cyBldmVudHMKKyAgICAgKiBhbmQgc2VuZCB0aGVtIHRvIHRoaXMgb2JqZWN0IGluc3RlYWQgb2YgdGhlIGN1cnNvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEN1cnNvckNvbnRyb2xsZXIgeworICAgICAgICAvKiBDdXJzb3IgZmFkZS1vdXQgYW5pbWF0aW9uIGR1cmF0aW9uLCBpbiBtaWxsaXNlY29uZHMuICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgRkFERV9PVVRfRFVSQVRJT04gPSA0MDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ha2VzIHRoZSBjdXJzb3IgY29udHJvbGxlciB2aXNpYmxlIG9uIHNjcmVlbi4gV2lsbCBiZSBkcmF3biBieSB7QGxpbmsgI2RyYXcoQ2FudmFzKX0uCisgICAgICAgICAqIFNlZSBhbHNvIHtAbGluayAjaGlkZSgpfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGlkZSB0aGUgY3Vyc29yIGNvbnRyb2xsZXIgZnJvbSBzY3JlZW4uCisgICAgICAgICAqIFNlZSBhbHNvIHtAbGluayAjc2hvdygpfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGhpZGUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXBkYXRlIHRoZSBjb250cm9sbGVyJ3MgcG9zaXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQb3NpdGlvbihpbnQgb2Zmc2V0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRyb2xsZXIgYW5kIHRoZSBjdXJzb3IncyBwb3NpdGlvbnMgY2FuIGJlIGxpbmsgYnkgYSBmaXhlZCBvZmZzZXQsCisgICAgICAgICAqIGNvbXB1dGVkIHdoZW4gdGhlIGNvbnRyb2xsZXIgaXMgdG91Y2hlZCwgYW5kIHRoZW4gbWFpbnRhaW5lZCBhcyBpdCBtb3ZlcworICAgICAgICAgKiBAcmV0dXJuIEhvcml6b250YWwgb2Zmc2V0IGJldHdlZW4gdGhlIGNvbnRyb2xsZXIgYW5kIHRoZSBjdXJzb3IuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0T2Zmc2V0WCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFZlcnRpY2FsIG9mZnNldCBiZXR3ZWVuIHRoZSBjb250cm9sbGVyIGFuZCB0aGUgY3Vyc29yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZsb2F0IGdldE9mZnNldFkoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHtAbGluayAjb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50KX0gYW5kIGdpdmVzIHRoZSBjb250cm9sbGVyCisgICAgICAgICAqIGEgY2hhbmNlIHRvIGJlY29tZSBhY3RpdmUgYW5kL29yIHZpc2libGUuCisgICAgICAgICAqIEBwYXJhbSBldmVudCBUaGUgdG91Y2ggZXZlbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERyYXdzIGEgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250cm9sbGVyIG9uIHRoZSBjYW52YXMuCisgICAgICAgICAqCisgICAgICAgICAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIHtAbGluayAjZHJhdyhDYW52YXMpfSwgaW4gdGhlIGNvbnRlbnQgY29vcmRpbmF0ZXMgc3lzdGVtLgorICAgICAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSBDYW52YXMgdXNlZCBieSB0aGlzIFRleHRWaWV3LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKTsKKyAgICB9CisKKyAgICBjbGFzcyBJbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIgaW1wbGVtZW50cyBDdXJzb3JDb250cm9sbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEFZX0JFRk9SRV9GQURFX09VVCA9IDIxMDA7CisKKyAgICAgICAgLy8gV2hldGhlciBvciBub3QgdGhlIGN1cnNvciBjb250cm9sIGlzIGN1cnJlbnRseSB2aXNpYmxlCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWaXNpYmxlID0gZmFsc2U7CisgICAgICAgIC8vIFN0YXJ0aW5nIHRpbWUgb2YgdGhlIGZhZGUgdGltZXIKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1GYWRlT3V0VGltZXJTdGFydDsKKyAgICAgICAgLy8gVGhlIGN1cnNvciBjb250cm9sbGVyIGltYWdlCisgICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbURyYXdhYmxlOworICAgICAgICAvLyBVc2VkIHRvIGRldGVjdCBhIHRhcCAodnMgZHJhZykgb24gdGhlIGNvbnRyb2xsZXIKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1PbkRvd25UaW1lclN0YXJ0OworICAgICAgICAvLyBPZmZzZXQgYmV0d2VlbiBmaW5nZXIgaG90IHBvaW50IG9uIGN1cnNvciBjb250cm9sbGVyIGFuZCBhY3R1YWwgY3Vyc29yCisgICAgICAgIHByaXZhdGUgZmxvYXQgbU9mZnNldFgsIG1PZmZzZXRZOworCisgICAgICAgIEluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlcigpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIG1EcmF3YWJsZSA9IHJlcy5nZXREcmF3YWJsZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmN1cnNvcl9jb250cm9sbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICB1cGRhdGVEcmF3YWJsZVBvc2l0aW9uKCk7CisgICAgICAgICAgICAvLyBIYXMgdG8gYmUgZG9uZSBhZnRlciB1cGRhdGVQb3NpdGlvbiwgc28gdGhhdCBwcmV2aW91cyBwb3NpdGlvbiBpbnZhbGlkYXRlCisgICAgICAgICAgICAvLyBpbiBvbmx5IGRvbmUgaWYgbmVjZXNzYXJ5LgorICAgICAgICAgICAgbUlzVmlzaWJsZSA9IHRydWU7CisgICAgICAgICAgICBpZiAobVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5oaWRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICAgICAgaWYgKG1Jc1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICBsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAvLyBTdGFydCBmYWRpbmcgb3V0LCBvbmx5IGlmIG5vdCBhbHJlYWR5IGluIHByb2dyZXNzCisgICAgICAgICAgICAgICAgaWYgKHRpbWUgLSBtRmFkZU91dFRpbWVyU3RhcnQgPCBERUxBWV9CRUZPUkVfRkFERV9PVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZhZGVPdXRUaW1lclN0YXJ0ID0gdGltZSAtIERFTEFZX0JFRk9SRV9GQURFX09VVDsKKyAgICAgICAgICAgICAgICAgICAgcG9zdEludmFsaWRhdGUobURyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGlmIChtSXNWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgaW50IHRpbWUgPSAoaW50KSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBtRmFkZU91dFRpbWVyU3RhcnQpOworICAgICAgICAgICAgICAgIGlmICh0aW1lIDw9IERFTEFZX0JFRk9SRV9GQURFX09VVCkgeworICAgICAgICAgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZURlbGF5ZWQoREVMQVlfQkVGT1JFX0ZBREVfT1VUIC0gdGltZSwgbURyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aW1lIC09IERFTEFZX0JFRk9SRV9GQURFX09VVDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWUgPD0gRkFERV9PVVRfRFVSQVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBhbHBoYSA9IDI1NSAqIChGQURFX09VVF9EVVJBVElPTiAtIHRpbWUpIC8gRkFERV9PVVRfRFVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhd2FibGUuc2V0QWxwaGEoYWxwaGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEludmFsaWRhdGVEZWxheWVkKDMwLCBtRHJhd2FibGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlLnNldEFscGhhKDApOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EcmF3YWJsZS5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQb3NpdGlvbihpbnQgb2Zmc2V0KSB7CisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBvZmZzZXQpOworICAgICAgICAgICAgdXBkYXRlRHJhd2FibGVQb3NpdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURyYXdhYmxlUG9zaXRpb24oKSB7CisgICAgICAgICAgICBpZiAobUlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGN1cnNvciBjb250cm9sbGVyIGJlZm9yZSBib3VuZHMgYXJlIHVwZGF0ZWQKKyAgICAgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZShtRHJhd2FibGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKworICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCBzYWZldHkgY2hlY2suCisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVwZGF0ZSBjdXJzb3IgY29udHJvbGxlciBwb3NpdGlvbiBjYWxsZWQgd2l0aCBubyBjdXJzb3IiKTsKKyAgICAgICAgICAgICAgICBtSXNWaXNpYmxlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwb3NpdGlvbkRyYXdhYmxlVW5kZXJDdXJzb3Iob2Zmc2V0LCBtRHJhd2FibGUpOworCisgICAgICAgICAgICBtRmFkZU91dFRpbWVyU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIG1EcmF3YWJsZS5zZXRBbHBoYSgyNTUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBpZiAoaXNGb2N1c2VkKCkgJiYgaXNUZXh0RWRpdGFibGUoKSAmJiBtSXNWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRBY3Rpb25NYXNrZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOIDogeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeCA9IGV2ZW50LmdldFgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHkgPSBldmVudC5nZXRZKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5nZXJJc09uRHJhd2FibGUoeCwgeSwgbURyYXdhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTW92ZW1lbnQgaW5zdGFuY2VvZiBBcnJvd0tleU1vdmVtZW50TWV0aG9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQXJyb3dLZXlNb3ZlbWVudE1ldGhvZCltTW92ZW1lbnQpLnNldEN1cnNvckNvbnRyb2xsZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHBvc3NpYmxlIHNjcm9sbFZpZXcgcGFyZW50IGZyb20gc2Nyb2xsaW5nLCBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgYXV0by1zY3JvbGxpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQucmVxdWVzdERpc2FsbG93SW50ZXJjZXB0VG91Y2hFdmVudCh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IGJvdW5kcyA9IG1EcmF3YWJsZS5nZXRCb3VuZHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9mZnNldFggPSAoYm91bmRzLmxlZnQgKyBib3VuZHMucmlnaHQpIC8gMi4wZiAtIHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PZmZzZXRZID0gYm91bmRzLnRvcCAtIG1DdXJzb3JDb250cm9sbGVyVmVydGljYWxPZmZzZXQgLSB5OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PbkRvd25UaW1lclN0YXJ0ID0gZXZlbnQuZ2V0RXZlbnRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUCA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lID0gKGludCkgKGV2ZW50LmdldEV2ZW50VGltZSgpIC0gbU9uRG93blRpbWVyU3RhcnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZSA8PSBWaWV3Q29uZmlndXJhdGlvbi5nZXRUYXBUaW1lb3V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHRhcCBvbiB0aGUgY29udHJvbGxlciBpcyBub3QgZ3JhYmJlZCwgbW92ZSB0aGUgY3Vyc29yIGluc3RlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZ2V0T2Zmc2V0KChpbnQpIGV2ZW50LmdldFgoKSwgKGludCkgZXZlbnQuZ2V0WSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW9kaWZpZWQgYnkgY2FuY2VsTG9uZ1ByZXNzIGFuZCBwcmV2ZW50cyB0aGUgY3Vyc29yIGZyb20gY2hhbmdpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGdldE9mZnNldFgoKSB7CisgICAgICAgICAgICByZXR1cm4gbU9mZnNldFg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0T2Zmc2V0WSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtT2Zmc2V0WTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBpbXBsZW1lbnRzIEN1cnNvckNvbnRyb2xsZXIgeworICAgICAgICAvLyBXaGV0aGVyIG9yIG5vdCB0aGUgc2VsZWN0aW9uIGNvbnRyb2xzIGFyZSBjdXJyZW50bHkgdmlzaWJsZQorICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAvLyBXaGV0aGVyIHRoYXQgc3RhcnQgb3IgdGhlIGVuZCBvZiBzZWxlY3Rpb24gY29udHJvbGxlciBpcyBkcmFnZ2VkCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRJc0RyYWdnZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gU3RhcnRpbmcgdGltZSBvZiB0aGUgZmFkZSB0aW1lcgorICAgICAgICBwcml2YXRlIGxvbmcgbUZhZGVPdXRUaW1lclN0YXJ0OworICAgICAgICAvLyBUaGUgY3Vyc29yIGNvbnRyb2xsZXIgaW1hZ2VzCisgICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVN0YXJ0RHJhd2FibGUsIG1FbmREcmF3YWJsZTsKKyAgICAgICAgLy8gT2Zmc2V0IGJldHdlZW4gZmluZ2VyIGhvdCBwb2ludCBvbiBhY3RpdmUgY3Vyc29yIGNvbnRyb2xsZXIgYW5kIGFjdHVhbCBjdXJzb3IKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtT2Zmc2V0WCwgbU9mZnNldFk7CisgICAgICAgIC8vIFRoZSBvZmZzZXQgb2YgdGhhdCBsYXN0IHRvdWNoIGRvd24gZXZlbnQuIFJlbWVtYmVyZWQgdG8gc3RhcnQgc2VsZWN0aW9uIHRoZXJlLgorICAgICAgICBwcml2YXRlIGludCBtVG91Y2hPZmZzZXQ7CisKKyAgICAgICAgU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKCkgeworICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgbVN0YXJ0RHJhd2FibGUgPSByZXMuZ2V0RHJhd2FibGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zZWxlY3Rpb25fc3RhcnRfaGFuZGxlKTsKKyAgICAgICAgICAgIG1FbmREcmF3YWJsZSA9IHJlcy5nZXREcmF3YWJsZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnNlbGVjdGlvbl9lbmRfaGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICB1cGRhdGVEcmF3YWJsZXNQb3NpdGlvbnMoKTsKKyAgICAgICAgICAgIC8vIEhhcyB0byBiZSBkb25lIGFmdGVyIHVwZGF0ZVBvc2l0aW9uLCBzbyB0aGF0IHByZXZpb3VzIHBvc2l0aW9uIGludmFsaWRhdGUKKyAgICAgICAgICAgIC8vIGluIG9ubHkgZG9uZSBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgICBtSXNWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1GYWRlT3V0VGltZXJTdGFydCA9IC0xOworICAgICAgICAgICAgaWYgKG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIuaGlkZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgICAgIGlmIChtSXNWaXNpYmxlICYmIChtRmFkZU91dFRpbWVyU3RhcnQgPCAwKSkgeworICAgICAgICAgICAgICAgIG1GYWRlT3V0VGltZXJTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlKG1TdGFydERyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZShtRW5kRHJhd2FibGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBpZiAobUlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIGlmIChtRmFkZU91dFRpbWVyU3RhcnQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdGltZSA9IChpbnQpIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG1GYWRlT3V0VGltZXJTdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lIDw9IEZBREVfT1VUX0RVUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWxwaGEgPSAyNTUgKiAoRkFERV9PVVRfRFVSQVRJT04gLSB0aW1lKSAvIEZBREVfT1VUX0RVUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0RHJhd2FibGUuc2V0QWxwaGEoYWxwaGEpOworICAgICAgICAgICAgICAgICAgICAgICAgbUVuZERyYXdhYmxlLnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlRGVsYXllZCgzMCwgbVN0YXJ0RHJhd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEludmFsaWRhdGVEZWxheWVkKDMwLCBtRW5kRHJhd2FibGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0RHJhd2FibGUuc2V0QWxwaGEoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRW5kRHJhd2FibGUuc2V0QWxwaGEoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSXNWaXNpYmxlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVN0YXJ0RHJhd2FibGUuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIG1FbmREcmF3YWJsZS5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQb3NpdGlvbihpbnQgb2Zmc2V0KSB7CisgICAgICAgICAgICBpbnQgc2VsZWN0aW9uU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgaW50IHNlbGVjdGlvbkVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworCisgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc3RhcnQgYW5kIGVuZCBhcmUgc3dhcHBlZCwgbWFraW5nIHN1cmUgc3RhcnQgPD0gZW5kCisgICAgICAgICAgICBpZiAobVN0YXJ0SXNEcmFnZ2VkKSB7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8PSBzZWxlY3Rpb25FbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25FbmQ7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0SXNEcmFnZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHNlbGVjdGlvblN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydElzRHJhZ2dlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKKyAgICAgICAgICAgIHVwZGF0ZURyYXdhYmxlc1Bvc2l0aW9ucygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURyYXdhYmxlc1Bvc2l0aW9ucygpIHsKKyAgICAgICAgICAgIGlmIChtSXNWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgY3Vyc29yIGNvbnRyb2xsZXIgYmVmb3JlIGJvdW5kcyBhcmUgdXBkYXRlZAorICAgICAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlKG1TdGFydERyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZShtRW5kRHJhd2FibGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgc2VsZWN0aW9uU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgZmluYWwgaW50IHNlbGVjdGlvbkVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworCisgICAgICAgICAgICBpZiAoKHNlbGVjdGlvblN0YXJ0IDwgMCkgfHwgKHNlbGVjdGlvbkVuZCA8IDApKSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiwgc2FmZXR5IGNoZWNrLgorICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJVcGRhdGUgc2VsZWN0aW9uIGNvbnRyb2xsZXIgcG9zaXRpb24gY2FsbGVkIHdpdGggbm8gY3Vyc29yIik7CisgICAgICAgICAgICAgICAgbUlzVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9zaXRpb25EcmF3YWJsZVVuZGVyQ3Vyc29yKHNlbGVjdGlvblN0YXJ0LCBtU3RhcnREcmF3YWJsZSk7CisgICAgICAgICAgICBwb3NpdGlvbkRyYXdhYmxlVW5kZXJDdXJzb3Ioc2VsZWN0aW9uRW5kLCBtRW5kRHJhd2FibGUpOworCisgICAgICAgICAgICBtU3RhcnREcmF3YWJsZS5zZXRBbHBoYSgyNTUpOworICAgICAgICAgICAgbUVuZERyYXdhYmxlLnNldEFscGhhKDI1NSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChpc0ZvY3VzZWQoKSAmJiBpc1RleHRFZGl0YWJsZSgpICYmCisgICAgICAgICAgICAgICAgICAgIChldmVudC5nZXRBY3Rpb25NYXNrZWQoKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2ZW50LmdldFgoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIGV2ZW50LmdldFkoKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIGZpbmdlciBkb3duIHBvc2l0aW9uLCB0byBiZSBhYmxlIHRvIHN0YXJ0IHNlbGVjdGlvbiBvbiB0aGF0IHBvaW50CisgICAgICAgICAgICAgICAgbVRvdWNoT2Zmc2V0ID0gZ2V0T2Zmc2V0KHgsIHkpOworCisgICAgICAgICAgICAgICAgaWYgKG1Jc1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb3ZlbWVudCBpbnN0YW5jZW9mIEFycm93S2V5TW92ZW1lbnRNZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPblN0YXJ0ID0gZmluZ2VySXNPbkRyYXdhYmxlKHgsIHksIG1TdGFydERyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPbkVuZCA9IGZpbmdlcklzT25EcmF3YWJsZSh4LCB5LCBtRW5kRHJhd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT25TdGFydCB8fCBpc09uRW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHBvc3NpYmxlIHNjcm9sbFZpZXcgcGFyZW50IGZyb20gc2Nyb2xsaW5nLCBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgYXV0by1zY3JvbGxpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQucmVxdWVzdERpc2FsbG93SW50ZXJjZXB0VG91Y2hFdmVudCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBoYW5kbGUgd2lsbCBiZSBkcmFnZ2VkIGluIGNhc2UgQk9USCBjb250cm9sbGVyIGFyZSB1bmRlciBmaW5nZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRJc0RyYWdnZWQgPSBpc09uU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCBib3VuZHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVN0YXJ0SXNEcmFnZ2VkID8gbVN0YXJ0RHJhd2FibGUgOiBtRW5kRHJhd2FibGUpLmdldEJvdW5kcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PZmZzZXRYID0gKGJvdW5kcy5sZWZ0ICsgYm91bmRzLnJpZ2h0KSAvIDIuMGYgLSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PZmZzZXRZID0gYm91bmRzLnRvcCAtIG1DdXJzb3JDb250cm9sbGVyVmVydGljYWxPZmZzZXQgLSB5OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBcnJvd0tleU1vdmVtZW50TWV0aG9kKW1Nb3ZlbWVudCkuc2V0Q3Vyc29yQ29udHJvbGxlcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VG91Y2hPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRvdWNoT2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGdldE9mZnNldFgoKSB7CisgICAgICAgICAgICByZXR1cm4gbU9mZnNldFg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0T2Zmc2V0WSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtT2Zmc2V0WTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoaXMgY29udHJvbGxlciBpcyBjdXJyZW50bHkgdXNlZCB0byBtb3ZlIHRoZSBzZWxlY3Rpb24gc3RhcnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGlvblN0YXJ0RHJhZ2dlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNWaXNpYmxlICYmIG1TdGFydElzRHJhZ2dlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEhlbHBlciBtZXRob2RzIHVzZWQgYnkgQ3Vyc29yQ29udHJvbGxlciBpbXBsZW1lbnRhdGlvbnMKKworICAgIHByaXZhdGUgdm9pZCBwb3NpdGlvbkRyYXdhYmxlVW5kZXJDdXJzb3IoZmluYWwgaW50IG9mZnNldCwgRHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgZmluYWwgaW50IGRyYXdhYmxlV2lkdGggPSBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpOworICAgICAgICBmaW5hbCBpbnQgZHJhd2FibGVIZWlnaHQgPSBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGxpbmUgPSBtTGF5b3V0LmdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKKworICAgICAgICBmaW5hbCBSZWN0IGJvdW5kcyA9IHNDdXJzb3JDb250cm9sbGVyVGVtcFJlY3Q7CisgICAgICAgIGJvdW5kcy5sZWZ0ID0gKGludCkgKG1MYXlvdXQuZ2V0UHJpbWFyeUhvcml6b250YWwob2Zmc2V0KSAtIDAuNSAtIGRyYXdhYmxlV2lkdGggLyAyLjApOworICAgICAgICBib3VuZHMudG9wID0gbUxheW91dC5nZXRMaW5lVG9wKGxpbmUgKyAxKTsKKworICAgICAgICAvLyBNb3ZlIGN1cnNvciBjb250cm9sbGVyIGEgbGl0dGxlIGJpdCB1cCB3aGVuIGVkaXRpbmcgdGhlIGxhc3QgbGluZSBvZiB0ZXh0CisgICAgICAgIC8vIChvciBhIHNpbmdsZSBsaW5lKSBzbyB0aGF0IGl0IGlzIHZpc2libGUgYW5kIGVhc2llciB0byBncmFiLgorICAgICAgICBpZiAobGluZSA9PSBtTGF5b3V0LmdldExpbmVDb3VudCgpIC0gMSkgeworICAgICAgICAgICAgYm91bmRzLnRvcCAtPSBNYXRoLm1heCgwLCBkcmF3YWJsZUhlaWdodCAvIDIgLSBnZXRFeHRlbmRlZFBhZGRpbmdCb3R0b20oKSk7CisgICAgICAgIH0KKworICAgICAgICBib3VuZHMucmlnaHQgPSBib3VuZHMubGVmdCArIGRyYXdhYmxlV2lkdGg7CisgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3VuZHMudG9wICsgZHJhd2FibGVIZWlnaHQ7CisKKyAgICAgICAgY29udmVydEZyb21WaWV3cG9ydFRvQ29udGVudENvb3JkaW5hdGVzKGJvdW5kcyk7CisgICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOworICAgICAgICBwb3N0SW52YWxpZGF0ZShib3VuZHMubGVmdCwgYm91bmRzLnRvcCwgYm91bmRzLnJpZ2h0LCBib3VuZHMuYm90dG9tKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZmluZ2VySXNPbkRyYXdhYmxlKGZsb2F0IHgsIGZsb2F0IHksIERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIC8vIFNpbXVsYXRlIGEgJ2ZhdCBmaW5nZXInIHRvIGVhc2UgZ3JhYmJpbmcgb2YgdGhlIGNvbnRyb2xsZXIuCisgICAgICAgIC8vIEV4cGFuZHMgYWNjb3JkaW5nIHRvIGNvbnRyb2xsZXIgaW1hZ2Ugc2l6ZSBpbnN0ZWFkIG9mIHVzaW5nIGRlbnNpdHkuCisgICAgICAgIC8vIEFzc3VtZXMgY29udHJvbGxlciBpbWFnZXIgaGFzIGEgc2Vuc2libGUgc2l6ZSwgcHJvcG9ydGlvbm5hbCB0byBkZW5zaXR5LgorICAgICAgICBmaW5hbCBpbnQgZHJhd2FibGVXaWR0aCA9IGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCBkcmF3YWJsZUhlaWdodCA9IGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpOworICAgICAgICBmaW5hbCBSZWN0IGZpbmdlclJlY3QgPSBzQ3Vyc29yQ29udHJvbGxlclRlbXBSZWN0OworICAgICAgICBmaW5nZXJSZWN0LnNldCgoaW50KSAoeCAtIGRyYXdhYmxlV2lkdGggLyAyLjApLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoeSAtIGRyYXdhYmxlSGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKHggKyBkcmF3YWJsZVdpZHRoIC8gMi4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludCkgeSk7CisgICAgICAgIHJldHVybiBSZWN0LmludGVyc2VjdHMoZHJhd2FibGUuZ2V0Qm91bmRzKCksIGZpbmdlclJlY3QpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3N0SW52YWxpZGF0ZShEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICBmaW5hbCBSZWN0IGJvdW5kcyA9IGRyYXdhYmxlLmdldEJvdW5kcygpOworICAgICAgICBwb3N0SW52YWxpZGF0ZShib3VuZHMubGVmdCwgYm91bmRzLnRvcCwgYm91bmRzLnJpZ2h0LCBib3VuZHMuYm90dG9tKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9zdEludmFsaWRhdGVEZWxheWVkKGxvbmcgZGVsYXksIERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gZHJhd2FibGUuZ2V0Qm91bmRzKCk7CisgICAgICAgIHBvc3RJbnZhbGlkYXRlRGVsYXllZChkZWxheSwgYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSk7CisgICAgfQorCiAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgICAgICAgICAgICBtVGV4dDsKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSAgICAgICAgICAgIG1UcmFuc2Zvcm1lZDsKQEAgLTczNjAsMTMgKzc5NzYsMjEgQEAKICAgICBwcml2YXRlIGZpbmFsIFRleHRQYWludCAgICAgICAgIG1UZXh0UGFpbnQ7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICBtVXNlclNldFRleHRTY2FsZVg7CiAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCAgICAgICAgICAgICBtSGlnaGxpZ2h0UGFpbnQ7Ci0gICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0Q29sb3IgPSAweEZGQkJEREZGOworICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodENvbG9yID0gMHhEMDc3QTE0QjsKICAgICBwcml2YXRlIExheW91dCAgICAgICAgICAgICAgICAgIG1MYXlvdXQ7CiAKICAgICBwcml2YXRlIGxvbmcgICAgICAgICAgICAgICAgICAgIG1TaG93Q3Vyc29yOwogICAgIHByaXZhdGUgQmxpbmsgICAgICAgICAgICAgICAgICAgbUJsaW5rOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgbUN1cnNvclZpc2libGUgPSB0cnVlOwogCisgICAgLy8gQ3Vyc29yIENvbnRyb2xsZXJzLiBOdWxsIHdoZW4gZGlzYWJsZWQuCisgICAgcHJpdmF0ZSBDdXJzb3JDb250cm9sbGVyICAgICAgICBtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyOworICAgIHByaXZhdGUgQ3Vyc29yQ29udHJvbGxlciAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcjsKKyAgICAvLyBTdG9yZWQgb25jZSBhbmQgZm9yIGFsbC4KKyAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgIG1DdXJzb3JDb250cm9sbGVyVmVydGljYWxPZmZzZXQ7CisgICAgLy8gQ3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZGlmZmVyZW50IEN1cnNvckNvbnRyb2xsZXIgaGVscGVyIG1ldGhvZHMuCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVjdCAgICAgICAgICAgICBzQ3Vyc29yQ29udHJvbGxlclRlbXBSZWN0OworCiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICBtU2VsZWN0QWxsT25Gb2N1cyA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICBtR3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5MRUZUOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BY3Rpb25CYXJJbXBsLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YQppbmRleCA2YWM2OGFhLi42Y2Y0NTVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YQpAQCAtMjIsNiArMjIsOSBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJWaWV3OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CkBAIC0zMSw2ICszNCw4IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlld0FuaW1hdG9yOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKwogLyoqCiAgKiBBY3Rpb25CYXJJbXBsIGlzIHRoZSBBY3Rpb25CYXIgaW1wbGVtZW50YXRpb24gdXNlZAogICogYnkgZGV2aWNlcyBvZiBhbGwgc2NyZWVuIHNpemVzLiBJZiBpdCBkZXRlY3RzIGEgY29tcGF0aWJsZSBkZWNvciwKQEAgLTQyLDEwICs0NywyMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfVklFVyA9IDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfVklFVyA9IDE7CiAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9TV0lUQ0hfU0hPV19ISURFID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX1NXSVRDSF9BRERfUkVNT1ZFID0gMTsKKworICAgIHByaXZhdGUgQWN0aXZpdHkgbUFjdGl2aXR5OworCiAgICAgcHJpdmF0ZSBWaWV3QW5pbWF0b3IgbUFuaW1hdG9yVmlldzsKICAgICBwcml2YXRlIEFjdGlvbkJhclZpZXcgbUFjdGlvblZpZXc7CiAgICAgcHJpdmF0ZSBBY3Rpb25CYXJDb250ZXh0VmlldyBtVXBwZXJDb250ZXh0VmlldzsKICAgICBwcml2YXRlIExpbmVhckxheW91dCBtTG93ZXJDb250ZXh0VmlldzsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0PFRhYkltcGw+IG1UYWJzID0gbmV3IEFycmF5TGlzdDxUYWJJbXBsPigpOworCisgICAgcHJpdmF0ZSBpbnQgbVRhYkNvbnRhaW5lclZpZXdJZCA9IGFuZHJvaWQuUi5pZC5jb250ZW50OworICAgIHByaXZhdGUgVGFiSW1wbCBtU2VsZWN0ZWRUYWI7CisgICAgcHJpdmF0ZSBpbnQgbVRhYlN3aXRjaE1vZGUgPSBUQUJfU1dJVENIX0FERF9SRU1PVkU7CiAgICAgCiAgICAgcHJpdmF0ZSBDb250ZXh0TW9kZSBtQ29udGV4dE1vZGU7CiAgICAgCkBAIC02NCw3ICs4MCw5IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHVibGljIEFjdGlvbkJhckltcGwoVmlldyBkZWNvcikgeworICAgIHB1YmxpYyBBY3Rpb25CYXJJbXBsKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIGZpbmFsIFZpZXcgZGVjb3IgPSBhY3Rpdml0eS5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gYWN0aXZpdHk7CiAgICAgICAgIG1BY3Rpb25WaWV3ID0gKEFjdGlvbkJhclZpZXcpIGRlY29yLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXIpOwogICAgICAgICBtVXBwZXJDb250ZXh0VmlldyA9IChBY3Rpb25CYXJDb250ZXh0VmlldykgZGVjb3IuZmluZFZpZXdCeUlkKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX2NvbnRleHRfYmFyKTsKQEAgLTgzLDMyICsxMDEsNTQgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZShWaWV3IHZpZXcpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKICAgICAgICAgbUFjdGlvblZpZXcuc2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcodmlldyk7CiAgICAgICAgIG1BY3Rpb25WaWV3LnNldENhbGxiYWNrKG51bGwpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGNsZWFudXBUYWJzKCk7CiAgICAgICAgIG1BY3Rpb25WaWV3LnNldENhbGxiYWNrKGNhbGxiYWNrKTsKICAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1QpOwogICAgICAgICBtQWN0aW9uVmlldy5zZXREcm9wZG93bkFkYXB0ZXIoYWRhcHRlcik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKICAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEKTsKICAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKICAgICAgICAgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSh0aXRsZSwgbnVsbCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UgdGl0bGUsIENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBjbGVhbnVwVGFicygpOwogICAgICAgICBtQWN0aW9uVmlldy5zZXROYXZpZ2F0aW9uTW9kZShOQVZJR0FUSU9OX01PREVfU1RBTkRBUkQpOwogICAgICAgICBtQWN0aW9uVmlldy5zZXRUaXRsZSh0aXRsZSk7CiAgICAgICAgIG1BY3Rpb25WaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKICAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBUYWJzKCkgeworICAgICAgICBpZiAobVNlbGVjdGVkVGFiICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlbGVjdFRhYihudWxsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1UYWJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKG1UYWJTd2l0Y2hNb2RlID09IFRBQl9TV0lUQ0hfU0hPV19ISURFKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRnJhZ21lbnRUcmFuc2FjdGlvbiB0cmFucyA9IG1BY3Rpdml0eS5vcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YWJDb3VudCA9IG1UYWJzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMucmVtb3ZlKG1UYWJzLmdldChpKS5nZXRGcmFnbWVudCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnMuY29tbWl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVGFicy5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CiAgICAgICAgIG1BY3Rpb25WaWV3LnNldFRpdGxlKHRpdGxlKTsKICAgICB9CkBAIC0xNzQsNiArMjE0LDExMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZmluYWwgVGFiSW1wbCB0YWJpID0gKFRhYkltcGwpIHRhYjsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0ZpcnN0VGFiID0gbVRhYnMuaXNFbXB0eSgpOworICAgICAgICBmaW5hbCBGcmFnbWVudFRyYW5zYWN0aW9uIHRyYW5zID0gbUFjdGl2aXR5Lm9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGZpbmFsIEZyYWdtZW50IGZyYWcgPSB0YWJpLmdldEZyYWdtZW50KCk7CisKKyAgICAgICAgdGFiaS5zZXRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgIG1UYWJzLmFkZChwb3NpdGlvbiwgdGFiaSk7CisKKyAgICAgICAgaWYgKG1UYWJTd2l0Y2hNb2RlID09IFRBQl9TV0lUQ0hfU0hPV19ISURFKSB7CisgICAgICAgICAgICBpZiAoIWZyYWcuaXNBZGRlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJhbnMuYWRkKG1UYWJDb250YWluZXJWaWV3SWQsIGZyYWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzRmlyc3RUYWIpIHsKKyAgICAgICAgICAgIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX1NIT1dfSElERSkgeworICAgICAgICAgICAgICAgIHRyYW5zLnNob3coZnJhZyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1UYWJTd2l0Y2hNb2RlID09IFRBQl9TV0lUQ0hfQUREX1JFTU9WRSkgeworICAgICAgICAgICAgICAgIHRyYW5zLmFkZChtVGFiQ29udGFpbmVyVmlld0lkLCBmcmFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZWxlY3RlZFRhYiA9IHRhYmk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9TSE9XX0hJREUpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5oaWRlKGZyYWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyYW5zLmNvbW1pdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFRhYihUYWIgdGFiKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LmFkZFRhYih0YWIpOworICAgICAgICBjb25maWd1cmVUYWIodGFiLCBtVGFicy5zaXplKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluc2VydFRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbUFjdGlvblZpZXcuaW5zZXJ0VGFiKHRhYiwgcG9zaXRpb24pOworICAgICAgICBjb25maWd1cmVUYWIodGFiLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhYiBuZXdUYWIoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGFiSW1wbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhYihUYWIgdGFiKSB7CisgICAgICAgIHJlbW92ZVRhYkF0KHRhYi5nZXRQb3NpdGlvbigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUYWJBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbUFjdGlvblZpZXcucmVtb3ZlVGFiQXQocG9zaXRpb24pOworICAgICAgICBtVGFicy5yZW1vdmUocG9zaXRpb24pOworCisgICAgICAgIGZpbmFsIGludCBuZXdUYWJDb3VudCA9IG1UYWJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHBvc2l0aW9uOyBpIDwgbmV3VGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbVRhYnMuZ2V0KGkpLnNldFBvc2l0aW9uKGkpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZWN0VGFiKG1UYWJzLmlzRW1wdHkoKSA/IG51bGwgOiBtVGFicy5nZXQoTWF0aC5tYXgoMCwgcG9zaXRpb24gLSAxKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRhYk5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICBtQWN0aW9uVmlldy5zZXROYXZpZ2F0aW9uTW9kZShOQVZJR0FUSU9OX01PREVfVEFCUyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VGFiTmF2aWdhdGlvbk1vZGUoaW50IGNvbnRhaW5lclZpZXdJZCkgeworICAgICAgICBtVGFiQ29udGFpbmVyVmlld0lkID0gY29udGFpbmVyVmlld0lkOworICAgICAgICBzZXRUYWJOYXZpZ2F0aW9uTW9kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlbGVjdFRhYihUYWIgdGFiKSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgPT0gdGFiKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtQWN0aW9uVmlldy5zZXRUYWJTZWxlY3RlZCh0YWIgIT0gbnVsbCA/IHRhYi5nZXRQb3NpdGlvbigpIDogVGFiLklOVkFMSURfUE9TSVRJT04pOworICAgICAgICBmaW5hbCBGcmFnbWVudFRyYW5zYWN0aW9uIHRyYW5zID0gbUFjdGl2aXR5Lm9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1UYWJTd2l0Y2hNb2RlID09IFRBQl9TV0lUQ0hfU0hPV19ISURFKSB7CisgICAgICAgICAgICAgICAgdHJhbnMuaGlkZShtU2VsZWN0ZWRUYWIuZ2V0RnJhZ21lbnQoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1UYWJTd2l0Y2hNb2RlID09IFRBQl9TV0lUQ0hfQUREX1JFTU9WRSkgeworICAgICAgICAgICAgICAgIHRyYW5zLnJlbW92ZShtU2VsZWN0ZWRUYWIuZ2V0RnJhZ21lbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhYiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9TSE9XX0hJREUpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5zaG93KHRhYi5nZXRGcmFnbWVudCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9BRERfUkVNT1ZFKSB7CisgICAgICAgICAgICAgICAgdHJhbnMuYWRkKG1UYWJDb250YWluZXJWaWV3SWQsIHRhYi5nZXRGcmFnbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtU2VsZWN0ZWRUYWIgPSAoVGFiSW1wbCkgdGFiOworICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RUYWJBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2VsZWN0VGFiKG1UYWJzLmdldChwb3NpdGlvbikpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEBoaWRlIAogICAgICAqLwpAQCAtMjMzLDYgKzM4MCw2MCBAQAogICAgICAgICAgICAgaWYgKCFhY3Rpb25JdGVtLmludm9rZSgpKSB7CiAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ29udGV4dEl0ZW1DbGlja2VkKHRoaXMsIGl0ZW0pOwogICAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBUYWJJbXBsIGV4dGVuZHMgQWN0aW9uQmFyLlRhYiB7CisgICAgICAgIHByaXZhdGUgRnJhZ21lbnQgbUZyYWdtZW50OworICAgICAgICBwcml2YXRlIERyYXdhYmxlIG1JY29uOworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVBvc2l0aW9uOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRnJhZ21lbnQgZ2V0RnJhZ21lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZyYWdtZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRJY29uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1JY29uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbVBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBtUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgICAgIG1GcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEljb24oRHJhd2FibGUgaWNvbikgeworICAgICAgICAgICAgbUljb24gPSBpY29uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3QoKSB7CisgICAgICAgICAgICBzZWxlY3RUYWIodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FsZXJ0Q29udHJvbGxlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BbGVydENvbnRyb2xsZXIuamF2YQppbmRleCAxMDdiMTQ1Li40YTA2MTdjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FsZXJ0Q29udHJvbGxlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWxlcnRDb250cm9sbGVyLmphdmEKQEAgLTQzNSw2ICs0MzUsNyBAQAogICAgICAgICAgICAgICAgIFZpZXcgdGl0bGVUZW1wbGF0ZSA9IG1XaW5kb3cuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfdGVtcGxhdGUpOwogICAgICAgICAgICAgICAgIHRpdGxlVGVtcGxhdGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgdG9wUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICAgICAgICAgIGhhc1RpdGxlID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0Jhc2VJV2luZG93LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhCmluZGV4IGIxM2Q2NTYuLjRkYTc0ZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0Jhc2VJV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvQmFzZUlXaW5kb3cuamF2YQpAQCAtNDMsNTkgKzQzLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoS2V5KEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbi5maW5pc2hLZXkodGhpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25EaXNwYXRjaFBvaW50ZXIoTW90aW9uRXZlbnQgZXZlbnQsIGxvbmcgZXZlbnRUaW1lLAotICAgICAgICAgICAgYm9vbGVhbiBjYWxsV2hlbkRvbmUpIHsKLSAgICAgICAgZXZlbnQucmVjeWNsZSgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoUG9pbnRlcihNb3Rpb25FdmVudCBldmVudCwgbG9uZyBldmVudFRpbWUsCi0gICAgICAgICAgICBib29sZWFuIGNhbGxXaGVuRG9uZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGV2ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBldmVudCA9IG1TZXNzaW9uLmdldFBlbmRpbmdQb2ludGVyTW92ZSh0aGlzKTsKLSAgICAgICAgICAgICAgICBvbkRpc3BhdGNoUG9pbnRlcihldmVudCwgZXZlbnRUaW1lLCBmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbGxXaGVuRG9uZSkgewotICAgICAgICAgICAgICAgIGlmICghb25EaXNwYXRjaFBvaW50ZXIoZXZlbnQsIGV2ZW50VGltZSwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uZmluaXNoS2V5KHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb25EaXNwYXRjaFBvaW50ZXIoZXZlbnQsIGV2ZW50VGltZSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uRGlzcGF0Y2hUcmFja2JhbGwoTW90aW9uRXZlbnQgZXZlbnQsIGxvbmcgZXZlbnRUaW1lLAotICAgICAgICAgICAgYm9vbGVhbiBjYWxsV2hlbkRvbmUpIHsKLSAgICAgICAgZXZlbnQucmVjeWNsZSgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoVHJhY2tiYWxsKE1vdGlvbkV2ZW50IGV2ZW50LCBsb25nIGV2ZW50VGltZSwKLSAgICAgICAgICAgIGJvb2xlYW4gY2FsbFdoZW5Eb25lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGV2ZW50ID0gbVNlc3Npb24uZ2V0UGVuZGluZ1RyYWNrYmFsbE1vdmUodGhpcyk7Ci0gICAgICAgICAgICAgICAgb25EaXNwYXRjaFRyYWNrYmFsbChldmVudCwgZXZlbnRUaW1lLCBmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbGxXaGVuRG9uZSkgewotICAgICAgICAgICAgICAgIGlmICghb25EaXNwYXRjaFRyYWNrYmFsbChldmVudCwgZXZlbnRUaW1lLCB0cnVlKSkgewotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5maW5pc2hLZXkodGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvbkRpc3BhdGNoVHJhY2tiYWxsKGV2ZW50LCBldmVudFRpbWUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaEFwcFZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlKSB7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9Sb290Vmlld1N1cmZhY2VUYWtlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvUm9vdFZpZXdTdXJmYWNlVGFrZXIuamF2YQppbmRleCA3ZmY4ZDRjLi45YzFiNTU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9Sb290Vmlld1N1cmZhY2VUYWtlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L1Jvb3RWaWV3U3VyZmFjZVRha2VyLmphdmEKQEAgLTUsNyArNSw3IEBACiAKIC8qKiBoYWhhaGFoICovCiBwdWJsaWMgaW50ZXJmYWNlIFJvb3RWaWV3U3VyZmFjZVRha2VyIHsKLSAgICBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIHdpbGxZb3VUYWtlVGhlU3VyZmFjZSgpOworICAgIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syIHdpbGxZb3VUYWtlVGhlU3VyZmFjZSgpOwogICAgIHZvaWQgc2V0U3VyZmFjZVR5cGUoaW50IHR5cGUpOwogICAgIHZvaWQgc2V0U3VyZmFjZUZvcm1hdChpbnQgZm9ybWF0KTsKICAgICB2b2lkIHNldFN1cmZhY2VLZWVwU2NyZWVuT24oYm9vbGVhbiBrZWVwT24pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCmluZGV4IGE5NjIyMTIuLjk0YTlmNjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gIk1lbnVCdWlsZGVyIjsKICAgICAKICAgICAvKiogVGhlIG51bWJlciBvZiBkaWZmZXJlbnQgbWVudSB0eXBlcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9UWVBFUyA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1RZUEVTID0gNTsKICAgICAvKiogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIGljb24gbWVudSB2aWV3ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JQ09OID0gMDsKICAgICAvKiogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIGV4cGFuZGVkIG1lbnUgdmlldyAqLwpAQCAtNjYsMjAgKzY2LDI0IEBACiAgICAgICogaGF2ZSBhbiBJdGVtVmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RJQUxPRyA9IDI7Ci0gICAgCiAgICAgLyoqCiAgICAgICogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBidXR0b24gaW4gdGhlIGFwcGxpY2F0aW9uJ3MgYWN0aW9uIGJhci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FDVElPTl9CVVRUT04gPSAzOworICAgIC8qKgorICAgICAqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIGEgbWVudSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BPUFVQID0gNDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXU19UQUcgPSAiYW5kcm9pZDp2aWV3cyI7Ci0gICAgCisKICAgICAvLyBPcmRlciBtdXN0IGJlIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBUWVBFXyoKICAgICBzdGF0aWMgZmluYWwgaW50IFRIRU1FX1JFU19GT1JfVFlQRVtdID0gbmV3IGludFtdIHsKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9JY29uTWVudSwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9FeHBhbmRlZE1lbnUsCiAgICAgICAgIDAsCiAgICAgICAgIDAsCisgICAgICAgIDAsCiAgICAgfTsKICAgICAKICAgICAvLyBPcmRlciBtdXN0IGJlIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBUWVBFXyoKQEAgLTg4LDYgKzkyLDcgQEAKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuZXhwYW5kZWRfbWVudV9sYXlvdXQsCiAgICAgICAgIDAsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmFjdGlvbl9tZW51X2xheW91dCwKKyAgICAgICAgMCwKICAgICB9OwogCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCkBAIC05Niw2ICsxMDEsNyBAQAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X21lbnVfaXRlbV9sYXlvdXQsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfbWVudV9pdGVtX2xheW91dCwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfbWVudV9pdGVtX2xheW91dCwKICAgICB9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gIHNDYXRlZ29yeVRvT3JkZXIgPSBuZXcgaW50W10gewpAQCAtMTI1MSw3ICsxMjU3LDE5IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuICgoTWVudUl0ZW1JbXBsKSBnZXRJdGVtKHBvc2l0aW9uKSkuZ2V0SXRlbVZpZXcobU1lbnVUeXBlLCBwYXJlbnQpOworICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBNZW51Vmlldy5JdGVtVmlldyBpdGVtVmlldyA9IChNZW51Vmlldy5JdGVtVmlldykgY29udmVydFZpZXc7CisgICAgICAgICAgICAgICAgaXRlbVZpZXcuZ2V0SXRlbURhdGEoKS5zZXRJdGVtVmlldyhtTWVudVR5cGUsIG51bGwpOworCisgICAgICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSAoTWVudUl0ZW1JbXBsKSBnZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBpdGVtVmlldy5pbml0aWFsaXplKGl0ZW0sIG1NZW51VHlwZSk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJdGVtVmlldyhtTWVudVR5cGUsIGl0ZW1WaWV3KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydFZpZXc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJdGVtVmlldyhtTWVudVR5cGUsIG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmdldEl0ZW1WaWV3KG1NZW51VHlwZSwgcGFyZW50KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKaW5kZXggNWZlNzViZS4uZmVjYmQ3NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCkBAIC01ODMsNiArNTgzLDEwIEBACiAgICAgICAgIHJldHVybiAoVmlldykgbUl0ZW1WaWV3c1ttZW51VHlwZV0uZ2V0KCk7CiAgICAgfQogCisgICAgdm9pZCBzZXRJdGVtVmlldyhpbnQgbWVudVR5cGUsIEl0ZW1WaWV3IHZpZXcpIHsKKyAgICAgICAgbUl0ZW1WaWV3c1ttZW51VHlwZV0gPSBuZXcgV2Vha1JlZmVyZW5jZTxJdGVtVmlldz4odmlldyk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuZCBpbml0aWFsaXplcyBhIG1lbnUgaXRlbSB2aWV3IHRoYXQgaW1wbGVtZW50cyB7QGxpbmsgTWVudVZpZXcuSXRlbVZpZXd9LgogICAgICAqIEBwYXJhbSBtZW51VHlwZSBUaGUgdHlwZSBvZiBtZW51IHRvIGdldCBhIFZpZXcgZm9yIChtdXN0IGJlIG9uZSBvZgpAQCAtNjMxLDcgKzYzNSwxMCBAQAogICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgZ2l2ZW4gbWVudSB0eXBlIHNob3VsZCBzaG93IGljb25zIGZvciBtZW51IGl0ZW1zLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHNob3VsZFNob3dJY29uKGludCBtZW51VHlwZSkgewotICAgICAgICByZXR1cm4gbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9JQ09OIHx8IG1NZW51LmdldE9wdGlvbmFsSWNvbnNWaXNpYmxlKCk7CisgICAgICAgIHJldHVybiBtZW51VHlwZSA9PSBNZW51QnVpbGRlci5UWVBFX0lDT04gfHwKKyAgICAgICAgICAgICAgICBtZW51VHlwZSA9PSBNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04gfHwKKyAgICAgICAgICAgICAgICBtZW51VHlwZSA9PSBNZW51QnVpbGRlci5UWVBFX1BPUFVQIHx8CisgICAgICAgICAgICAgICAgbU1lbnUuZ2V0T3B0aW9uYWxJY29uc1Zpc2libGUoKTsKICAgICB9CiAgICAgCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY3Rpb25CdXR0b24oKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UG9wdXBIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTFlY2RhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UG9wdXBIZWxwZXIuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIuTWVudUFkYXB0ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBNZW51UG9wdXBIZWxwZXIgaW1wbGVtZW50cyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lbnVQb3B1cEhlbHBlciI7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBMaXN0UG9wdXBXaW5kb3cgbVBvcHVwOworICAgIHByaXZhdGUgU3ViTWVudUJ1aWxkZXIgbVN1Yk1lbnU7CisgICAgcHJpdmF0ZSBpbnQgbVBvcHVwTWF4V2lkdGg7CisKKyAgICBwdWJsaWMgTWVudVBvcHVwSGVscGVyKENvbnRleHQgY29udGV4dCwgU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1TdWJNZW51ID0gc3ViTWVudTsKKworICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICBtUG9wdXBNYXhXaWR0aCA9IG1ldHJpY3Mud2lkdGhQaXhlbHMgLyAyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIC8vIFRPRE8gVXNlIGEgc3R5bGUgZnJvbSB0aGUgdGhlbWUgaGVyZQorICAgICAgICBtUG9wdXAgPSBuZXcgTGlzdFBvcHVwV2luZG93KG1Db250ZXh0LCBudWxsLCAwLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuV2lkZ2V0X1NwaW5uZXIpOworICAgICAgICBtUG9wdXAuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICBmaW5hbCBNZW51QWRhcHRlciBhZGFwdGVyID0gbVN1Yk1lbnUuZ2V0TWVudUFkYXB0ZXIoTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCk7CisgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtUG9wdXAuc2V0TW9kYWwodHJ1ZSk7CisKKyAgICAgICAgZmluYWwgTWVudUl0ZW1JbXBsIGl0ZW1JbXBsID0gKE1lbnVJdGVtSW1wbCkgbVN1Yk1lbnUuZ2V0SXRlbSgpOworICAgICAgICBmaW5hbCBWaWV3IGFuY2hvclZpZXcgPSBpdGVtSW1wbC5nZXRJdGVtVmlldyhNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sIG51bGwpOworICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyhhbmNob3JWaWV3KTsKKworICAgICAgICBtUG9wdXAuc2V0Q29udGVudFdpZHRoKE1hdGgubWluKG1lYXN1cmVDb250ZW50V2lkdGgoYWRhcHRlciksIG1Qb3B1cE1heFdpZHRoKSk7CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgbVBvcHVwID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIG1TdWJNZW51LnBlcmZvcm1JdGVtQWN0aW9uKG1TdWJNZW51LmdldEl0ZW0ocG9zaXRpb24pLCAwKTsKKyAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtZWFzdXJlQ29udGVudFdpZHRoKE1lbnVBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgLy8gTWVudXMgZG9uJ3QgdGVuZCB0byBiZSBsb25nLCBzbyB0aGlzIGlzIG1vcmUgc2FuZSB0aGFuIGl0IGxvb2tzLgorICAgICAgICBpbnQgd2lkdGggPSAwOworICAgICAgICBWaWV3IGl0ZW1WaWV3ID0gbnVsbDsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoTWVhc3VyZVNwZWMgPQorICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodE1lYXN1cmVTcGVjID0KKyAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGFkYXB0ZXIuZ2V0Q291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpdGVtVmlldyA9IGFkYXB0ZXIuZ2V0VmlldyhpLCBpdGVtVmlldywgbnVsbCk7CisgICAgICAgICAgICBpdGVtVmlldy5tZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGl0ZW1WaWV3LmdldE1lYXN1cmVkV2lkdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YQppbmRleCA4NDhlOTJlLi4wZjg5NWYwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhCkBAIC0yOCw2ICsyOCw4IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwpAQCAtMTcxLDYgKzE3MywxMyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkgeworICAgICAgICAvLyBVc2VkIGJ5IGN1c3RvbSB2aWV3cyBpZiB0aGV5IGRvbid0IHN1cHBseSBsYXlvdXQgcGFyYW1zLiBFdmVyeXRoaW5nIGVsc2UKKyAgICAgICAgLy8gYWRkZWQgdG8gYW4gQWN0aW9uQmFyQ29udGV4dFZpZXcgc2hvdWxkIGhhdmUgdGhlbSBhbHJlYWR5LgorICAgICAgICByZXR1cm4gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewogICAgICAgICBmaW5hbCBpbnQgd2lkdGhNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKICAgICAgICAgaWYgKHdpZHRoTW9kZSAhPSBNZWFzdXJlU3BlYy5FWEFDVExZKSB7CkBAIC0yMTIsOCArMjIxLDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUN1c3RvbVZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1c3RvbVZpZXcubWVhc3VyZShNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAotICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKSk7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBtQ3VzdG9tVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21XaWR0aE1vZGUgPSBscC53aWR0aCAhPSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UID8KKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSA6IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tV2lkdGggPSBscC53aWR0aCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4obHAud2lkdGgsIGF2YWlsYWJsZVdpZHRoKSA6IGF2YWlsYWJsZVdpZHRoOworICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbUhlaWdodE1vZGUgPSBscC5oZWlnaHQgIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbUhlaWdodCA9IGxwLmhlaWdodCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4obHAuaGVpZ2h0LCBoZWlnaHQpIDogaGVpZ2h0OworICAgICAgICAgICAgbUN1c3RvbVZpZXcubWVhc3VyZShNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tV2lkdGgsIGN1c3RvbVdpZHRoTW9kZSksCisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjdXN0b21IZWlnaHQsIGN1c3RvbUhlaWdodE1vZGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKGNvbnRlbnRXaWR0aCwgbUNvbnRlbnRIZWlnaHQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YQppbmRleCBkY2ZkY2VkLi40ODcwN2I5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YQpAQCAtMzEsOCArMzEsMTAgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtODUsNiArODcsNyBAQAogICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKICAgICBwcml2YXRlIFRleHRWaWV3IG1TdWJ0aXRsZVZpZXc7CiAgICAgcHJpdmF0ZSBTcGlubmVyIG1TcGlubmVyOworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UYWJMYXlvdXQ7CiAgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21OYXZWaWV3OwogICAgIAogICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd01lbnU7CkBAIC0xMjgsNyArMTMxLDggQEAKIAogICAgICAgICBBcHBsaWNhdGlvbkluZm8gaW5mbyA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCk7CiAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBtTmF2aWdhdGlvbk1vZGUgPSBhLmdldEludChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfbmF2aWdhdGlvbk1vZGUsIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQpOworICAgICAgICBtTmF2aWdhdGlvbk1vZGUgPSBhLmdldEludChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfbmF2aWdhdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CiAgICAgICAgIG1UaXRsZSA9IGEuZ2V0VGV4dChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGUpOwogICAgICAgICBtU3VidGl0bGUgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3N1YnRpdGxlKTsKICAgICAgICAgbURpc3BsYXlPcHRpb25zID0gYS5nZXRJbnQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2Rpc3BsYXlPcHRpb25zLCBESVNQTEFZX0RFRkFVTFQpOwpAQCAtMTc2LDExICsxODAsMTEgQEAKICAgICAgICAgICAgIH07CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0TWVudShNZW51IG1lbnUpIHsKICAgICAgICAgTWVudUJ1aWxkZXIgYnVpbGRlciA9IChNZW51QnVpbGRlcikgbWVudTsKICAgICAgICAgbU9wdGlvbnNNZW51ID0gYnVpbGRlcjsKQEAgLTE5NiwxOCArMjAwLDE4IEBACiAgICAgICAgIGFkZFZpZXcobWVudVZpZXcpOwogICAgICAgICBtTWVudVZpZXcgPSBtZW51VmlldzsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21OYXZpZ2F0aW9uVmlldyhWaWV3IHZpZXcpIHsKICAgICAgICAgbUN1c3RvbU5hdlZpZXcgPSB2aWV3OwogICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICBzZXROYXZpZ2F0aW9uTW9kZShBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgewogICAgICAgICByZXR1cm4gbVRpdGxlOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgewogICAgICAgICBtVGl0bGUgPSB0aXRsZTsKICAgICAgICAgaWYgKG1UaXRsZVZpZXcgIT0gbnVsbCkgewpAQCAtMjE3LDE4ICsyMjEsMTggQEAKICAgICAgICAgICAgIG1Mb2dvTmF2SXRlbS5zZXRUaXRsZSh0aXRsZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgewogICAgICAgICByZXR1cm4gbVN1YnRpdGxlOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgewogICAgICAgICBtU3VidGl0bGUgPSBzdWJ0aXRsZTsKICAgICAgICAgaWYgKG1TdWJ0aXRsZVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KHN1YnRpdGxlKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zKSB7CiAgICAgICAgIGZpbmFsIGludCBmbGFnc0NoYW5nZWQgPSBvcHRpb25zIF4gbURpc3BsYXlPcHRpb25zOwogICAgICAgICBtRGlzcGxheU9wdGlvbnMgPSBvcHRpb25zOwpAQCAtMjcxLDYgKzI3NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICAgICAgaWYgKG1UYWJMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1UYWJMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBtVGFiTGF5b3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgewpAQCAtMjgxLDE1ICsyOTAsMTUgQEAKICAgICAgICAgICAgICAgICBtU3Bpbm5lciA9IG5ldyBTcGlubmVyKG1Db250ZXh0LCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmRyb3BEb3duU3Bpbm5lclN0eWxlKTsKICAgICAgICAgICAgICAgICBtU3Bpbm5lci5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG1OYXZJdGVtU2VsZWN0ZWRMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgbVNwaW5uZXIuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKICAgICAgICAgICAgICAgICBhZGRWaWV3KG1TcGlubmVyKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006Ci0gICAgICAgICAgICAgICAgbUN1c3RvbU5hdlZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKICAgICAgICAgICAgICAgICBhZGRWaWV3KG1DdXN0b21OYXZWaWV3KTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgICAgIG1UYWJMYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtVGFiTGF5b3V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IG1vZGU7CiAgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CkBAIC0zMTEsNyArMzIwLDQzIEBACiAgICAgcHVibGljIGludCBnZXREaXNwbGF5T3B0aW9ucygpIHsKICAgICAgICAgcmV0dXJuIG1EaXNwbGF5T3B0aW9uczsKICAgICB9Ci0gICAgCisKKyAgICBwcml2YXRlIFRhYlZpZXcgY3JlYXRlVGFiVmlldyhBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICBmaW5hbCBUYWJWaWV3IHRhYlZpZXcgPSBuZXcgVGFiVmlldyhnZXRDb250ZXh0KCksIHRhYik7CisgICAgICAgIHRhYlZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICB0YWJWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVGFiQ2xpY2tMaXN0ZW5lcigpKTsKKyAgICAgICAgcmV0dXJuIHRhYlZpZXc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVGFiKEFjdGlvbkJhci5UYWIgdGFiKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNGaXJzdCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpID09IDA7CisgICAgICAgIGZpbmFsIFRhYlZpZXcgdGFiVmlldyA9IGNyZWF0ZVRhYlZpZXcodGFiKTsKKyAgICAgICAgbVRhYkxheW91dC5hZGRWaWV3KHRhYlZpZXcpOworICAgICAgICBpZiAoaXNGaXJzdCkgeworICAgICAgICAgICAgdGFiVmlldy5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydFRhYihBY3Rpb25CYXIuVGFiIHRhYiwgaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNGaXJzdCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpID09IDA7CisgICAgICAgIGZpbmFsIFRhYlZpZXcgdGFiVmlldyA9IGNyZWF0ZVRhYlZpZXcodGFiKTsKKyAgICAgICAgbVRhYkxheW91dC5hZGRWaWV3KHRhYlZpZXcsIHBvc2l0aW9uKTsKKyAgICAgICAgaWYgKGlzRmlyc3QpIHsKKyAgICAgICAgICAgIHRhYlZpZXcuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUYWJBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbVRhYkxheW91dC5yZW1vdmVWaWV3QXQocG9zaXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkgeworICAgICAgICAvLyBVc2VkIGJ5IGN1c3RvbSBuYXYgdmlld3MgaWYgdGhleSBkb24ndCBzdXBwbHkgbGF5b3V0IHBhcmFtcy4gRXZlcnl0aGluZyBlbHNlCisgICAgICAgIC8vIGFkZGVkIHRvIGFuIEFjdGlvbkJhclZpZXcgc2hvdWxkIGhhdmUgdGhlbSBhbHJlYWR5LgorICAgICAgICByZXR1cm4gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkZpbmlzaEluZmxhdGUoKSB7CiAgICAgICAgIHN1cGVyLm9uRmluaXNoSW5mbGF0ZSgpOwpAQCAtMzUzLDcgKzM5OCw3IEBACiAgICAgICAgICAgICAKICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUYWIgbmF2aWdhdGlvbiBpc24ndCBzdXBwb3J0ZWQgeWV0ISIpOworICAgICAgICAgICAgICAgICAgICAiSW5mbGF0aW5nIHRhYiBuYXZpZ2F0aW9uIGlzbid0IHN1cHBvcnRlZCB5ZXQhIik7CiAgICAgICAgICAgICAKICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKICAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CkBAIC0zNzgsNiArNDIzLDE0IEBACiAgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJTZWxlY3RlZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGNoaWxkLnNldFNlbGVjdGVkKGkgPT0gcG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKICAgICAgICAgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7CkBAIC00MTksMTQgKzQ3MiwzMCBAQAogICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKICAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVNwaW5uZXIubWVhc3VyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkFUX01PU1QpLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CiAgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG1DdXN0b21OYXZWaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21OYXZXaWR0aE1vZGUgPSBscC53aWR0aCAhPSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UID8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21OYXZXaWR0aCA9IGxwLndpZHRoID49IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4obHAud2lkdGgsIGF2YWlsYWJsZVdpZHRoKSA6IGF2YWlsYWJsZVdpZHRoOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21OYXZIZWlnaHRNb2RlID0gbHAuaGVpZ2h0ICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSA6IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdkhlaWdodCA9IGxwLmhlaWdodCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLmhlaWdodCwgaGVpZ2h0KSA6IGhlaWdodDsKICAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2Vmlldy5tZWFzdXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjdXN0b21OYXZXaWR0aCwgY3VzdG9tTmF2V2lkdGhNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjdXN0b21OYXZIZWlnaHQsIGN1c3RvbU5hdkhlaWdodE1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIGlmIChtVGFiTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGFiTGF5b3V0Lm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkFUX01PU1QpLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC00NzQsNiArNTQzLDEwIEBACiAgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1DdXN0b21OYXZWaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgaWYgKG1UYWJMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtVGFiTGF5b3V0LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgeCA9IHIgLSBsIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CkBAIC01MDMsNCArNTc2LDU5IEBACiAKICAgICAgICAgcmV0dXJuIGNoaWxkV2lkdGg7CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGFiVmlldyBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgICAgIHByaXZhdGUgQWN0aW9uQmFyLlRhYiBtVGFiOworCisgICAgICAgIHB1YmxpYyBUYWJWaWV3KENvbnRleHQgY29udGV4dCwgQWN0aW9uQmFyLlRhYiB0YWIpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAgICAgbVRhYiA9IHRhYjsKKworICAgICAgICAgICAgLy8gVE9ETyBTdHlsZSB0YWJzIGJhc2VkIG9uIHRoZSB0aGVtZQorCisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBpY29uID0gdGFiLmdldEljb24oKTsKKyAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSB0ZXh0ID0gdGFiLmdldFRleHQoKTsKKworICAgICAgICAgICAgaWYgKGljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEltYWdlVmlldyBpY29uVmlldyA9IG5ldyBJbWFnZVZpZXcoY29udGV4dCk7CisgICAgICAgICAgICAgICAgaWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShpY29uKTsKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUw7CisgICAgICAgICAgICAgICAgaWNvblZpZXcuc2V0TGF5b3V0UGFyYW1zKGxwKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KGljb25WaWV3KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gbmV3IFRleHRWaWV3KGNvbnRleHQpOworICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQodGV4dCk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0U2luZ2xlTGluZSgpOworICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldEVsbGlwc2l6ZShUcnVuY2F0ZUF0LkVORCk7CisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMOworICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldExheW91dFBhcmFtcyhscCk7CisgICAgICAgICAgICAgICAgYWRkVmlldyh0ZXh0Vmlldyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldExheW91dFBhcmFtcyhuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBY3Rpb25CYXIuVGFiIGdldFRhYigpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFiOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBUYWJDbGlja0xpc3RlbmVyIGltcGxlbWVudHMgT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIFRhYlZpZXcgdGFiVmlldyA9IChUYWJWaWV3KSB2aWV3OworICAgICAgICAgICAgdGFiVmlldy5nZXRUYWIoKS5zZWxlY3QoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB0YWJDb3VudCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5zZXRTZWxlY3RlZChjaGlsZCA9PSB2aWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRWRpdFN0eWxlZFRleHQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRWRpdFN0eWxlZFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxOTdjMC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0VkaXRTdHlsZWRUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5SZWN0U2hhcGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuSHRtbDsKLWltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5BcnJvd0tleU1vdmVtZW50TWV0aG9kOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BYnNvbHV0ZVNpemVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuRm9yZWdyb3VuZENvbG9yU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuSW1hZ2VTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUXVvdGVTcGFuOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLS8qKgotICogRWRpdFN0eWxlZFRleHQgZXh0ZW5kcyBFZGl0VGV4dCBmb3IgbWFuYWdpbmcgdGhlIGZsb3cgYW5kIHN0YXR1cyB0byBlZGl0Ci0gKiB0aGUgc3R5bGVkIHRleHQuIFRoaXMgbWFuYWdlcyB0aGUgc3RhdGVzIGFuZCBmbG93cyBvZiBlZGl0aW5nLCBzdXBwb3J0cwotICogaW5zZXJ0aW5nIGltYWdlLCBpbXBvcnQvZXhwb3J0IEhUTUwuCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0U3R5bGVkVGV4dCBleHRlbmRzIEVkaXRUZXh0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkVkaXRTdHlsZWRUZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1vZGVzIG9mIGVkaXRpbmcgYWN0aW9ucy4KLSAgICAgKi8KLSAgICAvKiogVGhlIG1vZGUgdGhhdCBubyBlZGl0aW5nIGFjdGlvbiBpcyBkb25lLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfTk9USElORyA9IDA7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNvcHkuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9DT1BZID0gMTsKLSAgICAvKiogVGhlIG1vZGUgb2YgcGFzdGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9QQVNURSA9IDI7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIHNpemUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TSVpFID0gMzsKLSAgICAvKiogVGhlIG1vZGUgb2YgY2hhbmdpbmcgY29sb3IuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9DT0xPUiA9IDQ7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIHNlbGVjdGlvbi4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1NFTEVDVCA9IDU7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIGFsaWdubWVudC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0FMSUdOID0gNjsKLSAgICAvKiogVGhlIG1vZGUgb2YgY2hhbmdpbmcgY3V0LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ1VUID0gNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBzdGF0ZSBvZiBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgLyoqIFRoZSBzdGF0ZSB0aGF0IHNlbGVjdGlvbiBpc24ndCBzdGFydGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFTEVDVF9PRkYgPSAwOwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXMgc3RhcnRlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUxFQ1RfT04gPSAxOwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXMgZG9uZSwgYnV0IG5vdCBmaXhlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUxFQ1RFRCA9IDI7Ci0gICAgLyoqIFRoZSBzdGF0ZSB0aGF0IHNlbGVjdGlvbiBpcyBkb25lIGFuZCBub3QgZml4ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNUX0ZJWCA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaGVscCBtZXNzYWdlIHN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9NU0dfTlVMTCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9NU0dfQ09QWV9CVUZfQkxBTksgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX1NFTEVDVF9TVEFSVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9NU0dfU0VMRUNUX0VORCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9NU0dfUFVTSF9DT01QRVRFID0gNDsKLQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBoZWxwIG1lc3NhZ2Ugc3RyaW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1IgPSAweDAwRkZGRkZGOwotCi0gICAgLyoqCi0gICAgICogRWRpdFN0eWxlZFRleHRJbnRlcmZhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBub3RpZnlpbmcgbWVzc2FnZXMgdG8KLSAgICAgKiBjYWxsaW5nIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgRWRpdFN0eWxlZFRleHROb3RpZmllciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUhpbnRNc2coaW50IG1zZ0lkKTsKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2VkKGludCBtb2RlLCBpbnQgc3RhdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgRWRpdFN0eWxlZFRleHROb3RpZmllciBtRVNUSW50ZXJmYWNlOwotCi0gICAgLyoqCi0gICAgICogRWRpdFN0eWxlZFRleHRFZGl0b3JNYW5hZ2VyIG1hbmFnZXMgdGhlIGZsb3cgYW5kIHN0YXR1cyBvZiBlYWNoCi0gICAgICogZnVuY3Rpb24gZm9yIGVkaXRpbmcgc3R5bGVkIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFZGl0b3JNYW5hZ2VyIG1NYW5hZ2VyOwotICAgIHByaXZhdGUgU3R5bGVkVGV4dENvbnZlcnRlciBtQ29udmVydGVyOwotICAgIHByaXZhdGUgU3R5bGVkVGV4dERpYWxvZyBtRGlhbG9nOwotICAgIHByaXZhdGUgRHJhd2FibGUgbURlZmF1bHRCYWNrZ3JvdW5kOwotICAgIHByaXZhdGUgaW50IG1CYWNrZ3JvdW5kQ29sb3I7Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0U3R5bGVkVGV4dCBleHRlbmRzIEVkaXRUZXh0IGZvciBtYW5hZ2luZyBmbG93IG9mIGVhY2ggZWRpdGluZwotICAgICAqIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWRpdFN0eWxlZFRleHQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVkaXRTdHlsZWRUZXh0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFZGl0U3R5bGVkVGV4dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgTm90aWZpZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm90aWZpZXIoRWRpdFN0eWxlZFRleHROb3RpZmllciBlc3RJbnRlcmZhY2UpIHsKLSAgICAgICAgbUVTVEludGVyZmFjZSA9IGVzdEludGVyZmFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQnVpbGRlciBmb3IgQWxlcnREaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1aWxkZXIKLSAgICAgKiAgICAgICAgICAgIEJ1aWxkZXIgZm9yIG9wZW5pbmcgQWxlcnQgRGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkZXIoQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgIG1EaWFsb2cuc2V0QnVpbGRlcihidWlsZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgUGFyYW1ldGVycyBmb3IgQ29sb3JBbGVydERpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3J0aXRsZQotICAgICAqICAgICAgICAgICAgVGl0bGUgZm9yIEFsZXJ0IERpYWxvZy4KLSAgICAgKiBAcGFyYW0gY29sb3JuYW1lcwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBuYW1lIG9mIHNlbGVjdGluZyBjb2xvci4KLSAgICAgKiBAcGFyYW0gY29sb3JpbnRzCi0gICAgICogICAgICAgICAgICBMaXN0IG9mIGludCBvZiBjb2xvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvckFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBjb2xvcnRpdGxlLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gY29sb3JuYW1lcywgQ2hhclNlcXVlbmNlW10gY29sb3JpbnRzKSB7Ci0gICAgICAgIG1EaWFsb2cuc2V0Q29sb3JBbGVydFBhcmFtcyhjb2xvcnRpdGxlLCBjb2xvcm5hbWVzLCBjb2xvcmludHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBQYXJhbWV0ZXJzIGZvciBTaXplQWxlcnREaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNpemV0aXRsZQotICAgICAqICAgICAgICAgICAgVGl0bGUgZm9yIEFsZXJ0IERpYWxvZy4KLSAgICAgKiBAcGFyYW0gc2l6ZW5hbWVzCi0gICAgICogICAgICAgICAgICBMaXN0IG9mIG5hbWUgb2Ygc2VsZWN0aW5nIHNpemUuCi0gICAgICogQHBhcmFtIHNpemVkaXNwbGF5aW50cwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBpbnQgb2Ygc2l6ZSBkaXNwbGF5ZWQgaW4gVGV4dFZpZXcuCi0gICAgICogQHBhcmFtIHNpemVzZW5kaW50cwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBpbnQgb2Ygc2l6ZSBleHBvcnRlZCB0byBIVE1MLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNpemVBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2Ugc2l6ZXRpdGxlLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gc2l6ZW5hbWVzLCBDaGFyU2VxdWVuY2VbXSBzaXplZGlzcGxheWludHMsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBzaXplc2VuZGludHMpIHsKLSAgICAgICAgbURpYWxvZy5zZXRTaXplQWxlcnRQYXJhbXMoc2l6ZXRpdGxlLCBzaXplbmFtZXMsIHNpemVkaXNwbGF5aW50cywKLSAgICAgICAgICAgICAgICBzaXplc2VuZGludHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsaWduQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIGFsaWdudGl0bGUsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBhbGlnbm5hbWVzKSB7Ci0gICAgICAgIG1EaWFsb2cuc2V0QWxpZ25BbGVydFBhcmFtcyhhbGlnbnRpdGxlLCBhbGlnbm5hbWVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKG1NYW5hZ2VyLmlzU29mdEtleUJsb2NrZWQoKSAmJgotICAgICAgICAgICAgICAgIGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgY2FuY2VsTG9uZ1ByZXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBzdXBlclJlc3VsdCA9IHN1cGVyLm9uVG91Y2hFdmVudChldmVudCk7Ci0gICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uVG91Y2hFdmVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlclJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBlZGl0aW5nLiBUaGlzIGZ1bmN0aW9uIGhhdmUgdG8gYmUgY2FsbGVkIGJlZm9yZSBvdGhlciBlZGl0aW5nCi0gICAgICogYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0RWRpdCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydEVkaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmQgZWRpdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkVuZEVkaXQoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uRW5kRWRpdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJDb3B5IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydENvcHkoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRDb3B5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIkN1dCIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDdXQoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRDdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiUGFzdGUiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0UGFzdGUoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRQYXN0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGNoYW5naW5nICJTaXplIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFNpemUoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRTaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2hhbmdpbmcgIkNvbG9yIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydENvbG9yKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0Q29sb3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiQmFja2dyb3VuZENvbG9yIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydEJhY2tncm91bmRDb2xvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGNoYW5naW5nICJBbGlnbm1lbnQiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QWxpZ24oKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRBbGlnbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJTZWxlY3QiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0U2VsZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIlNlbGVjdEFsbCIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTZWxlY3RBbGwoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRTZWxlY3RBbGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXggU2VsZWN0ZWQgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkZpeFNlbGVjdGVkSXRlbSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25GaXhTZWxlY3RlZEl0ZW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRJbWFnZSB0byBUZXh0VmlldyBieSB1c2luZyBVUkkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogICAgICAgICAgICBVUkkgb2YgdGhlIGlhbWdlIGluc2VydGVkIHRvIFRleHRWaWV3LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SW1hZ2UoVXJpIHVyaSkgewotICAgICAgICBtTWFuYWdlci5vbkluc2VydEltYWdlKHVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0SW1hZ2UgdG8gVGV4dFZpZXcgYnkgdXNpbmcgcmVzb3VyY2UgSUQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzSWQKLSAgICAgKiAgICAgICAgICAgIFJlc291cmNlIElEIG9mIHRoZSBpYW1nZSBpbnNlcnRlZCB0byBUZXh0Vmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKGludCByZXNJZCkgewotICAgICAgICBtTWFuYWdlci5vbkluc2VydEltYWdlKHJlc0lkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkluc2VydEhvcml6b250YWxMaW5lKCkgewotICAgICAgICBtTWFuYWdlci5vbkluc2VydEhvcml6b250YWxMaW5lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DbGVhclN0eWxlcygpIHsKLSAgICAgICAgbU1hbmFnZXIub25DbGVhclN0eWxlcygpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTZXQgU2l6ZSBvZiB0aGUgSXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZQotICAgICAqICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIEl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbVNpemUoaW50IHNpemUpIHsKLSAgICAgICAgbU1hbmFnZXIuc2V0SXRlbVNpemUoc2l6ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IENvbG9yIG9mIHRoZSBJdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcgotICAgICAqICAgICAgICAgICAgVGhlIGNvbG9yIG9mIHRoZSBJdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1Db2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgbU1hbmFnZXIuc2V0SXRlbUNvbG9yKGNvbG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQWxpZ25tZW50IG9mIHRoZSBJdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcgotICAgICAqICAgICAgICAgICAgVGhlIGNvbG9yIG9mIHRoZSBJdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFsaWdubWVudChMYXlvdXQuQWxpZ25tZW50IGFsaWduKSB7Ci0gICAgICAgIG1NYW5hZ2VyLnNldEFsaWdubWVudChhbGlnbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEJhY2tncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IKLSAgICAgKiAgICAgICAgICAgIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHZpZXcuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGludCBjb2xvcikgewotICAgICAgICBzdXBlci5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotICAgICAgICBtQmFja2dyb3VuZENvbG9yID0gY29sb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGh0bWwgdG8gRWRpdFN0eWxlZFRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGh0bWwKLSAgICAgKiAgICAgICAgICAgIFRoZSBodG1sIHRvIGJlIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIdG1sKFN0cmluZyBodG1sKSB7Ci0gICAgICAgIG1Db252ZXJ0ZXIuU2V0SHRtbChodG1sKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciBlZGl0aW5nIGlzIHN0YXJ0ZWQgb3Igbm90LgotICAgICAqIAotICAgICAqIEByZXR1cm4gV2hldGhlciBlZGl0aW5nIGlzIHN0YXJ0ZWQgb3Igbm90LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRWRpdHRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5pc0VkaXR0aW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciBzdHlsZWQgdGV4dCBvciBub3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBXaGV0aGVyIHN0eWxlZCB0ZXh0IG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0eWxlZFRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5pc1N0eWxlZFRleHQoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciBTb2Z0S2V5IGlzIEJsb2NrZWQgb3Igbm90LgotICAgICAqIAotICAgICAqIEByZXR1cm4gd2hldGhlciBTb2Z0S2V5IGlzIEJsb2NrZWQgb3Igbm90LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU29mdEtleUJsb2NrZWQoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5pc1NvZnRLZXlCbG9ja2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtb2RlIG9mIHRoZSBhY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgbW9kZSBvZiB0aGUgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RWRpdE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5nZXRFZGl0TW9kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtTWFuYWdlci5nZXRTZWxlY3RTdGF0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgZ2V0SW5wdXRFeHRyYXMoYm9vbGVhbiBjcmVhdGUpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLWdldElucHV0RXh0cmFzIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IHN1cGVyLmdldElucHV0RXh0cmFzKGNyZWF0ZSk7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKCJhbGxvd0Vtb2ppIiwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIdG1sKCkgewotICAgICAgICByZXR1cm4gbUNvbnZlcnRlci5nZXRIdG1sKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmlzCi0gICAgICogICAgICAgICAgICBUaGUgYXJyYXkgb2YgdXNlZCB1cmlzLgotICAgICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIdG1sKEFycmF5TGlzdDxVcmk+IHVyaXMpIHsKLSAgICAgICAgbUNvbnZlcnRlci5nZXRVcmlBcnJheSh1cmlzLCBnZXRUZXh0KCkpOwotICAgICAgICByZXR1cm4gbUNvbnZlcnRlci5nZXRIdG1sKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEJhY2tncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0gICAgICAgIHJldHVybiBtQmFja2dyb3VuZENvbG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBGb3JlZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Rm9yZUdyb3VuZENvbG9yKGludCBwb3MpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLWdldEZvcmVHcm91bmRDb2xvcjogIiArIHBvcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvcyA8IDAgfHwgcG9zID4gZ2V0VGV4dCgpLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tZ2V0Rm9yZUdyb3VuZENvbG9yOiBJbGxpZ2FsIHBvc2l0aW9uLiIpOwotICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZvcmVncm91bmRDb2xvclNwYW5bXSBzcGFucyA9Ci0gICAgICAgICAgICAgICAgZ2V0VGV4dCgpLmdldFNwYW5zKHBvcywgcG9zLCBGb3JlZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNwYW5zWzBdLmdldEZvcmVncm91bmRDb2xvcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBtZW1iZXJzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGluaXQiKTsKLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgbURlZmF1bHRCYWNrZ3JvdW5kID0gZ2V0QmFja2dyb3VuZCgpOwotICAgICAgICBtQmFja2dyb3VuZENvbG9yID0gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SOwotICAgICAgICBtTWFuYWdlciA9IG5ldyBFZGl0b3JNYW5hZ2VyKHRoaXMpOwotICAgICAgICBtQ29udmVydGVyID0gbmV3IFN0eWxlZFRleHRDb252ZXJ0ZXIodGhpcyk7Ci0gICAgICAgIG1EaWFsb2cgPSBuZXcgU3R5bGVkVGV4dERpYWxvZyh0aGlzKTsKLSAgICAgICAgc2V0TW92ZW1lbnRNZXRob2QobmV3IFN0eWxlZFRleHRBcnJvd0tleU1ldGhvZChtTWFuYWdlcikpOwotICAgICAgICBtTWFuYWdlci5ibG9ja1NvZnRLZXkoKTsKLSAgICAgICAgbU1hbmFnZXIudW5ibG9ja1NvZnRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IEZvcmVncm91bmQgQ29sb3IgU2VsZWN0aW5nIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnQoKSB7Ci0gICAgICAgIG1EaWFsb2cub25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IEJhY2tncm91bmQgQ29sb3IgU2VsZWN0aW5nIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25TaG93QmFja2dyb3VuZENvbG9yQWxlcnQoKSB7Ci0gICAgICAgIG1EaWFsb2cub25TaG93QmFja2dyb3VuZENvbG9yQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IFNpemUgU2VsZWN0aW5nIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25TaG93U2l6ZUFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd1NpemVBbGVydERpYWxvZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgQWxpZ25tZW50IFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0FsaWduQWxlcnQoKSB7Ci0gICAgICAgIG1EaWFsb2cub25TaG93QWxpZ25BbGVydERpYWxvZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBoaW50IG1lc3NhZ2VzIHdoYXQgYWN0aW9uIGlzIGV4cGVjdGVkIHRvIGNhbGxpbmcgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1zZ0lkCi0gICAgICogICAgICAgICAgICBJZCBvZiB0aGUgaGludCBtZXNzYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRIaW50TWVzc2FnZShpbnQgbXNnSWQpIHsKLSAgICAgICAgaWYgKG1FU1RJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVTVEludGVyZmFjZS5ub3RpZnlIaW50TXNnKG1zZ0lkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSB0aGUgZXZlbnQgdGhhdCB0aGUgbW9kZSBhbmQgc3RhdGUgYXJlIGNoYW5nZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1vZGUKLSAgICAgKiAgICAgICAgICAgIE1vZGUgb2YgdGhlIGVkaXRpbmcgYWN0aW9uLgotICAgICAqIEBwYXJhbSBzdGF0ZQotICAgICAqICAgICAgICAgICAgTW9kZSBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBub3RpZnlTdGF0ZUNoYW5nZWQoaW50IG1vZGUsIGludCBzdGF0ZSkgewotICAgICAgICBpZiAobUVTVEludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRVNUSW50ZXJmYWNlLm5vdGlmeVN0YXRlQ2hhbmdlZChtb2RlLCBzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0b3JNYW5hZ2VyIG1hbmFnZXMgdGhlIGZsb3cgYW5kIHN0YXR1cyBvZiBlZGl0aW5nIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBFZGl0b3JNYW5hZ2VyIHsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FZGl0RmxhZyA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVNvZnRLZXlCbG9ja0ZsYWcgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU1vZGUgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtU3RhdGUgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtQ3VyU3RhcnQgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtQ3VyRW5kID0gMDsKLSAgICAgICAgcHJpdmF0ZSBFZGl0U3R5bGVkVGV4dCBtRVNUOwotCi0gICAgICAgIEVkaXRvck1hbmFnZXIoRWRpdFN0eWxlZFRleHQgZXN0KSB7Ci0gICAgICAgICAgICBtRVNUID0gZXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEVkaXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0RWRpdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbnN0YXJ0ZWRpdDoiKTsKLSAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkVuZEVkaXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkVuZEVkaXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUNhbmNlbCgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q29weSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRDb3B5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDb3B5KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDdXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0Q3V0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDdXQoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFBhc3RlKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydFBhc3RlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVQYXN0ZSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2l6ZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRTaXplIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVTaXplKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRBbGlnbigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRBbGlnblJpZ2h0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVBbGlnbigpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q29sb3IoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29sb3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUNvbG9yKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29sb3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Qub25TaG93QmFja2dyb3VuZENvbG9yQWxlcnQoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFNlbGVjdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tTZWxlY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9TRUxFQ1Q7Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9PRkYpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5zZXRTZWxlY3QoKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25DdXJzb3JNb3ZlZCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tWaWV3Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9PTiB8fCBtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLSAgICAgICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTZWxlY3RBbGwoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrU2VsZWN0QWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVTZWxlY3RBbGwoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25GaXhTZWxlY3RlZEl0ZW0oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29tcGxldGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUNvbXBsZXRlKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SW1hZ2UoVXJpIHVyaSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25JbnNlcnRJbWFnZSBieSBVUkk6ICIgKyB1cmkuZ2V0UGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIiArIHVyaS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc2VydEltYWdlU3BhbihuZXcgSW1hZ2VTcGFuKG1FU1QuZ2V0Q29udGV4dCgpLCB1cmkpKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25JbnNlcnRJbWFnZShpbnQgcmVzSUQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uSW5zZXJ0SW1hZ2UgYnkgcmVzSUQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc2VydEltYWdlU3BhbihuZXcgSW1hZ2VTcGFuKG1FU1QuZ2V0Q29udGV4dCgpLCByZXNJRCkpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkluc2VydEhvcml6b250YWxMaW5lKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25JbnNlcnRIb3Jpem9udGFsTGluZToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc2VydEltYWdlU3BhbihuZXcgSG9yaXpvbnRhbExpbmVTcGFuKDB4RkYwMDAwMDAsIG1FU1QpKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25DbGVhclN0eWxlcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xlYXJTdHlsZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVkaXRhYmxlIHR4dCA9IG1FU1QuZ2V0VGV4dCgpOwotICAgICAgICAgICAgaW50IGxlbiA9IHR4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgIE9iamVjdFtdIHN0eWxlcyA9IHR4dC5nZXRTcGFucygwLCBsZW4sIE9iamVjdC5jbGFzcyk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBzdHlsZSA6IHN0eWxlcykgewotICAgICAgICAgICAgICAgIGlmIChzdHlsZSBpbnN0YW5jZW9mIFBhcmFncmFwaFN0eWxlIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSBpbnN0YW5jZW9mIFF1b3RlU3BhbiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJTdHlsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGUgaW5zdGFuY2VvZiBJbWFnZVNwYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHR4dC5nZXRTcGFuU3RhcnQoc3R5bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZCA9IHR4dC5nZXRTcGFuRW5kKHN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4dC5yZXBsYWNlKHN0YXJ0LCBlbmQsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0eHQucmVtb3ZlU3BhbihzdHlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobUVTVC5tRGVmYXVsdEJhY2tncm91bmQpOwotICAgICAgICAgICAgbUVTVC5tQmFja2dyb3VuZENvbG9yID0gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SXRlbVNpemUoaW50IHNpemUpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tTaXplSXRlbSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCB8fCBtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgIGNoYW5nZVNpemVTZWxlY3RlZFRleHQoc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVzZXRFZGl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJdGVtQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29sb3JJdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlQ29sb3JTZWxlY3RlZFRleHQoY29sb3IpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QWxpZ25tZW50KExheW91dC5BbGlnbm1lbnQgYWxpZ24pIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tDb2xvckl0ZW0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQgfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VBbGlnbihhbGlnbik7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVzZXRFZGl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VkaXR0aW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FZGl0RmxhZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHRoZSBzdHlsZSBvZiB0aGUgc3BhbiBpcyBhZGRlZCwgYWRkIGNoZWNrIGNhc2UgZm9yIHRoYXQgc3R5bGUgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdHlsZWRUZXh0KCkgewotICAgICAgICAgICAgRWRpdGFibGUgdHh0ID0gbUVTVC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpbnQgbGVuID0gdHh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKHR4dC5nZXRTcGFucygwLCBsZW4gLTEsIFBhcmFncmFwaFN0eWxlLmNsYXNzKS5sZW5ndGggPiAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIHR4dC5nZXRTcGFucygwLCBsZW4gLTEsIFF1b3RlU3Bhbi5jbGFzcykubGVuZ3RoID4gMCB8fAotICAgICAgICAgICAgICAgICAgICB0eHQuZ2V0U3BhbnMoMCwgbGVuIC0xLCBDaGFyYWN0ZXJTdHlsZS5jbGFzcykubGVuZ3RoID4gMCB8fAotICAgICAgICAgICAgICAgICAgICBtRVNULm1CYWNrZ3JvdW5kQ29sb3IgIT0gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NvZnRLZXlCbG9ja2VkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Tb2Z0S2V5QmxvY2tGbGFnOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRFZGl0TW9kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTW9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0U3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZWxlY3Rpb25TdGFydCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3VyU3RhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFNlbGVjdGlvbkVuZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3VyRW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRvTmV4dEhhbmRsZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGRvTmV4dEhhbmRsZTogIiArIG1Nb2RlICsgIiwiICsgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9DT1BZOgotICAgICAgICAgICAgICAgIGhhbmRsZUNvcHkoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9DVVQ6Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ3V0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfUEFTVEU6Ci0gICAgICAgICAgICAgICAgaGFuZGxlUGFzdGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9TSVpFOgotICAgICAgICAgICAgICAgIGhhbmRsZVNpemUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9DT0xPUjoKLSAgICAgICAgICAgICAgICBoYW5kbGVDb2xvcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX0FMSUdOOgotICAgICAgICAgICAgICAgIGhhbmRsZUFsaWduKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbmNlbCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNhbmNlbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX05PVEhJTkc7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfT0ZGOwotICAgICAgICAgICAgbUVkaXRGbGFnID0gZmFsc2U7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNhbmNlbDoiICsgbUVTVC5nZXRJbnB1dFR5cGUoKSk7Ci0gICAgICAgICAgICB1bmJsb2NrU29mdEtleSgpOwotICAgICAgICAgICAgdW5zZXRTZWxlY3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDb21wbGV0ZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNvbXBsZXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfRklYOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZG9OZXh0SGFuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlVGV4dFZpZXdGdW5jKGludCBtb2RlLCBpbnQgaWQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVRleHRWaWV3OiAiICsgbU1vZGUgKyAiLCIgKyBtU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwiICsgaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9OT1RISU5HIHx8IG1Nb2RlID09IE1PREVfU0VMRUNUKSB7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX0ZJWDsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFZpZXdGdW5jKG1vZGUsIGlkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlICE9IG1vZGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgICAgICBtTW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVGV4dFZpZXdGdW5jKG1vZGUsIGlkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICBtRVNULm9uVGV4dENvbnRleHRNZW51SXRlbShpZCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVzZXRFZGl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29weSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNvcHk6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVUZXh0Vmlld0Z1bmMoTU9ERV9DT1BZLCBhbmRyb2lkLlIuaWQuY29weSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ3V0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlQ29weTogIiArIG1Nb2RlICsgIiwiICsgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhNT0RFX0NVVCwgYW5kcm9pZC5SLmlkLmN1dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlUGFzdGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVQYXN0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULm9uVGV4dENvbnRleHRNZW51SXRlbShhbmRyb2lkLlIuaWQucGFzdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNldFNwYW4oaW50IG1vZGUpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVNldFNwYW46IiArIG1FZGl0RmxhZyArICIsIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3RhdGUgKyAnLCcgKyBtTW9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gaGFuZGxlU2V0U3BhbjogRWRpdGluZyBpcyBub3Qgc3RhcnRlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9OT1RISU5HIHx8IG1Nb2RlID09IE1PREVfU0VMRUNUKSB7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX0ZJWDsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2V0U3Bhbihtb2RlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlICE9IG1vZGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgICAgICBtTW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2V0U3Bhbihtb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0SGludE1lc3NhZ2UoSElOVF9NU0dfTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1PREVfQ09MT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRVNULm9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RFX1NJWkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRVNULm9uU2hvd1NpemVBbGVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9BTElHTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FU1Qub25TaG93QWxpZ25BbGVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGhhbmRsZVNldFNwYW46IGludmFsaWQgbW9kZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiBkbyBub3RoaW5nLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTaXplKCkgewotICAgICAgICAgICAgaGFuZGxlU2V0U3BhbihNT0RFX1NJWkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbG9yKCkgewotICAgICAgICAgICAgaGFuZGxlU2V0U3BhbihNT0RFX0NPTE9SKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBbGlnbigpIHsKLSAgICAgICAgICAgIGhhbmRsZVNldFNwYW4oTU9ERV9BTElHTik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2VsZWN0OiIgKyBtRWRpdEZsYWcgKyAiLCIgKyBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9PRkYpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUZXh0U2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VsZWN0aW9uIGlzIG9mZiwgYnV0IHNlbGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFNlbGVjdFN0YXJ0UG9zKCk7Ci0gICAgICAgICAgICAgICAgYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5zZXRIaW50TWVzc2FnZShISU5UX01TR19TRUxFQ1RfRU5EKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9PTikgewotICAgICAgICAgICAgICAgIGlmIChpc1RleHRTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTZWxlY3Rpb24gbm93IHN0YXJ0LCBidXQgc2VsZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRFbmRQb3MoKTsKLSAgICAgICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX1BVU0hfQ09NUEVURSk7Ci0gICAgICAgICAgICAgICAgZG9OZXh0SGFuZGxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgIGlmICghaXNUZXh0U2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VsZWN0aW9uIGlzIGRvbmUsIGJ1dCBub3Qgc2VsZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRFbmRQb3MoKTsKLSAgICAgICAgICAgICAgICBkb05leHRIYW5kbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGwoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVTZWxlY3RBbGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlc2V0RWRpdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiUmVzZXQgRWRpdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBibG9ja1NvZnRLZXkoKTsKLSAgICAgICAgICAgIGhhbmRsZUNhbmNlbCgpOwotICAgICAgICAgICAgbUVkaXRGbGFnID0gdHJ1ZTsKLSAgICAgICAgICAgIG1FU1Quc2V0SGludE1lc3NhZ2UoSElOVF9NU0dfU0VMRUNUX1NUQVJUKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNlbGVjdDoiICsgbUN1clN0YXJ0ICsgIiwiICsgbUN1ckVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUN1clN0YXJ0ID49IDAgJiYgbUN1clN0YXJ0IDw9IG1FU1QuZ2V0VGV4dCgpLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgICAgICYmIG1DdXJFbmQgPj0gMCAmJiBtQ3VyRW5kIDw9IG1FU1QuZ2V0VGV4dCgpLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJTdGFydCA8IG1DdXJFbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRTZWxlY3Rpb24obUN1clN0YXJ0LCBtQ3VyRW5kKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRVNULnNldFNlbGVjdGlvbihtQ3VyRW5kLCBtQ3VyU3RhcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RFRDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJTZWxlY3QgaXMgb24sIGJ1dCBjdXJzb3IgcG9zaXRpb25zIGFyZSBpbGxpZ2FsLjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUVTVC5nZXRUZXh0KCkubGVuZ3RoKCkgKyAiLCIgKyBtQ3VyU3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyBtQ3VyRW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1bnNldFNlbGVjdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9mZlNlbGVjdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGN1cnJwb3MgPSBtRVNULmdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICBtRVNULnNldFNlbGVjdGlvbihjdXJycG9zLCBjdXJycG9zKTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9PRkY7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0U3RhcnRQb3MoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRTZWxlY3RTdGFydFBvcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1clN0YXJ0ID0gbUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX09OOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkRW5kUG9zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0U2VsZWN0RW5kUG9zOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKSA9PSBtQ3VyU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEVuZFBvcyhtRVNULmdldFNlbGVjdGlvbkVuZCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRFbmRQb3MobUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkRW5kUG9zKGludCBwb3MpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFNlbGVjdGVkRW5kUG9zOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1ckVuZCA9IHBvczsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzVGV4dFNlbGVjdGVkKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaXNUZXh0U2VsZWN0ZWQ6IiArIG1DdXJTdGFydCArICIsIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ3VyRW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAobUN1clN0YXJ0ICE9IG1DdXJFbmQpCi0gICAgICAgICAgICAgICAgICAgICYmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U3R5bGVkVGV4dFNwYW4oT2JqZWN0IHNwYW4sIGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0U3R5bGVkVGV4dFNwYW46IiArIG1Nb2RlICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHN0YXJ0ICsgIiwiICsgZW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGFydCA8IGVuZCkgewotICAgICAgICAgICAgICAgIG1FU1QuZ2V0VGV4dCgpLnNldFNwYW4oc3Bhbiwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5zZXRTcGFuKHNwYW4sIGVuZCwgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VTaXplU2VsZWN0ZWRUZXh0KGludCBzaXplKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGFuZ2VTaXplOiIgKyBzaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0eWxlZFRleHRTcGFuKG5ldyBBYnNvbHV0ZVNpemVTcGFuKHNpemUpLAotICAgICAgICAgICAgICAgIG1DdXJTdGFydCwgbUN1ckVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hhbmdlQ29sb3JTZWxlY3RlZFRleHQoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGFuZ2VDb2xvcjoiICsgY29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3R5bGVkVGV4dFNwYW4obmV3IEZvcmVncm91bmRDb2xvclNwYW4oY29sb3IpLAotICAgICAgICAgICAgICAgIG1DdXJTdGFydCwgbUN1ckVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hhbmdlQWxpZ24oTGF5b3V0LkFsaWdubWVudCBhbGlnbikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hhbmdlQWxpZ246IiArIGFsaWduKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0eWxlZFRleHRTcGFuKG5ldyBBbGlnbm1lbnRTcGFuLlN0YW5kYXJkKGFsaWduKSwKLSAgICAgICAgICAgICAgICAgICAgZmluZExpbmVTdGFydChtRVNULmdldFRleHQoKSwgbUN1clN0YXJ0KSwKLSAgICAgICAgICAgICAgICAgICAgZmluZExpbmVFbmQobUVTVC5nZXRUZXh0KCksIG1DdXJFbmQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRMaW5lU3RhcnQoRWRpdGFibGUgdGV4dCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGZpbmRMaW5lU3RhcnQ6IGN1cnI6IiArIGN1cnJlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgbGVuZ3RoOiIgKyB0ZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBwb3MgPSBjdXJyZW50OwotICAgICAgICAgICAgZm9yICg7IHBvcyA+IDA7IHBvcy0tKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KHBvcyAtIDEpID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBvczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnNlcnRJbWFnZVNwYW4oSW1hZ2VTcGFuIHNwYW4pIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGluc2VydEltYWdlU3BhbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNwYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaW5zZXJ0aW1hZ2VzcGFuOiIgKyBzcGFuLmdldERyYXdhYmxlKCkuZ2V0SW50cmluc2ljSGVpZ2h0KCkgKyAiLCIgKyBzcGFuLmdldERyYXdhYmxlKCkuZ2V0SW50cmluc2ljV2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbnNlcnRpbWFnZXNwYW46IiArIHNwYW4uZ2V0RHJhd2FibGUoKS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgICAgICBpbnQgY3VycG9zID0gbUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpOwotICAgICAgICAgICAgICAgIG1FU1QuZ2V0VGV4dCgpLmluc2VydChjdXJwb3MsICJcdUZGRkMiKTsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5zZXRTcGFuKHNwYW4sIGN1cnBvcywgY3VycG9zICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGluc2VydEltYWdlU3BhbjogbnVsbCBzcGFuIHdhcyBpbnNlcnRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZExpbmVFbmQoRWRpdGFibGUgdGV4dCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGZpbmRMaW5lRW5kOiBjdXJyOiIgKyBjdXJyZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIGxlbmd0aDoiICsgdGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcG9zID0gY3VycmVudDsKLSAgICAgICAgICAgIGZvciAoOyBwb3MgPCB0ZXh0Lmxlbmd0aCgpOyBwb3MrKykgewotICAgICAgICAgICAgICAgIGlmIChwb3MgPiAwICYmIHRleHQuY2hhckF0KHBvcyAtIDEpID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBvczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBibG9ja1NvZnRLZXkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBibG9ja1NvZnRLZXk6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikgbUVTVC5nZXRDb250ZXh0KCkuCi0gICAgICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuSU5QVVRfTUVUSE9EX1NFUlZJQ0UpOwotICAgICAgICAgICAgaW1tLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KG1FU1QuZ2V0V2luZG93VG9rZW4oKSwgMCk7Ci0gICAgICAgICAgICBtRVNULnNldE9uQ2xpY2tMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbnRyYWNrYmFsbGNsaWNrOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRml4U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1Tb2Z0S2V5QmxvY2tGbGFnID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1bmJsb2NrU29mdEtleSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHVuYmxvY2tTb2Z0S2V5OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5zZXRPbkNsaWNrTGlzdGVuZXIobnVsbCk7Ci0gICAgICAgICAgICBtU29mdEtleUJsb2NrRmxhZyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTdHlsZWRUZXh0Q29udmVydGVyIHsKLSAgICAgICAgcHJpdmF0ZSBFZGl0U3R5bGVkVGV4dCBtRVNUOwotCi0gICAgICAgIHB1YmxpYyBTdHlsZWRUZXh0Q29udmVydGVyKEVkaXRTdHlsZWRUZXh0IGVzdCkgewotICAgICAgICAgICAgbUVTVCA9IGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbCgpIHsKLSAgICAgICAgICAgIFN0cmluZyBodG1sQm9keSA9IEh0bWwudG9IdG1sKG1FU1QuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGdldENvbnZlcnRlZEJvZHk6IiArIGh0bWxCb2R5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBodG1sQm9keTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGdldFVyaUFycmF5KEFycmF5TGlzdDxVcmk+IHVyaXMsIEVkaXRhYmxlIHRleHQpIHsKLSAgICAgICAgICAgIHVyaXMuY2xlYXIoKTsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGdldFVyaUFycmF5OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgICAgICBuZXh0ID0gdGV4dC5uZXh0U3BhblRyYW5zaXRpb24oaSwgbGVuLCBJbWFnZVNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIEltYWdlU3BhbltdIGltYWdlcyA9IHRleHQuZ2V0U3BhbnMoaSwgbmV4dCwgSW1hZ2VTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGltYWdlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGdldFVyaUFycmF5OiBmb3VuZEFycmF5IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW1hZ2VTcGFuKSBpbWFnZXNbal0pLmdldFNvdXJjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cmlzLmFkZChVcmkucGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJbWFnZVNwYW4pIGltYWdlc1tqXSkuZ2V0U291cmNlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBTZXRIdG1sIChTdHJpbmcgaHRtbCkgewotICAgICAgICAgICAgZmluYWwgU3Bhbm5lZCBzcGFubmVkID0gSHRtbC5mcm9tSHRtbChodG1sLCBuZXcgSHRtbC5JbWFnZUdldHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgRHJhd2FibGUgZ2V0RHJhd2FibGUoU3RyaW5nIHNyYykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldGh0bWw6IHNyYz0iK3NyYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmMuc3RhcnRzV2l0aCgiY29udGVudDovLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHNyYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbUVTVC5nZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbklucHV0U3RyZWFtKHVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKSwgYml0bWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZS5zZXRCb3VuZHMoMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gc2V0IGh0bWw6IEZhaWxlZCB0byBsb2FkZWQgY29udGVudCAiICsgdXJpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiICB1bmtub3duIHNyYz0iK3NyYyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIG51bGwpOwotICAgICAgICAgICAgbUVTVC5zZXRUZXh0KHNwYW5uZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTdHlsZWRUZXh0RGlhbG9nIHsKLSAgICAgICAgQnVpbGRlciBtQnVpbGRlcjsKLSAgICAgICAgQ2hhclNlcXVlbmNlIG1Db2xvclRpdGxlOwotICAgICAgICBDaGFyU2VxdWVuY2UgbVNpemVUaXRsZTsKLSAgICAgICAgQ2hhclNlcXVlbmNlIG1BbGlnblRpdGxlOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtQ29sb3JOYW1lczsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbUNvbG9ySW50czsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbVNpemVOYW1lczsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbVNpemVEaXNwbGF5SW50czsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbVNpemVTZW5kSW50czsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbUFsaWduTmFtZXM7Ci0gICAgICAgIEVkaXRTdHlsZWRUZXh0IG1FU1Q7Ci0KLSAgICAgICAgcHVibGljIFN0eWxlZFRleHREaWFsb2coRWRpdFN0eWxlZFRleHQgZXN0KSB7Ci0gICAgICAgICAgICBtRVNUID0gZXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QnVpbGRlcihCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyID0gYnVpbGRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIGNvbG9ydGl0bGUsCi0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gY29sb3JuYW1lcywgQ2hhclNlcXVlbmNlW10gY29sb3JpbnRzKSB7Ci0gICAgICAgICAgICBtQ29sb3JUaXRsZSA9IGNvbG9ydGl0bGU7Ci0gICAgICAgICAgICBtQ29sb3JOYW1lcyA9IGNvbG9ybmFtZXM7Ci0gICAgICAgICAgICBtQ29sb3JJbnRzID0gY29sb3JpbnRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2l6ZUFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBzaXpldGl0bGUsCi0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gc2l6ZW5hbWVzLCBDaGFyU2VxdWVuY2VbXSBzaXplZGlzcGxheWludHMsCi0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gc2l6ZXNlbmRpbnRzKSB7Ci0gICAgICAgICAgICBtU2l6ZVRpdGxlID0gc2l6ZXRpdGxlOwotICAgICAgICAgICAgbVNpemVOYW1lcyA9IHNpemVuYW1lczsKLSAgICAgICAgICAgIG1TaXplRGlzcGxheUludHMgPSBzaXplZGlzcGxheWludHM7Ci0gICAgICAgICAgICBtU2l6ZVNlbmRJbnRzID0gc2l6ZXNlbmRpbnRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QWxpZ25BbGVydFBhcmFtcyhDaGFyU2VxdWVuY2UgYWxpZ250aXRsZSwKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBhbGlnbm5hbWVzKSB7Ci0gICAgICAgICAgICBtQWxpZ25UaXRsZSA9IGFsaWdudGl0bGU7Ci0gICAgICAgICAgICBtQWxpZ25OYW1lcyA9IGFsaWdubmFtZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDb2xvckFsZXJ0UGFyYW1zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hlY2tQYXJhbXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBidWlsZGVyIGlzIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQ29sb3JUaXRsZSA9PSBudWxsIHx8IG1Db2xvck5hbWVzID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgbUNvbG9ySW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBjb2xvciBhbGVydCBwYXJhbXMgYXJlIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQ29sb3JOYW1lcy5sZW5ndGggIT0gbUNvbG9ySW50cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHRoZSBsZW5ndGggb2YgY29sb3IgYWxlcnQgcGFyYW1zIGFyZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJkaWZmZXJlbnQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tTaXplQWxlcnRQYXJhbXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGVja1BhcmFtcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGJ1aWxkZXIgaXMgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TaXplVGl0bGUgPT0gbnVsbCB8fCBtU2l6ZU5hbWVzID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgbVNpemVEaXNwbGF5SW50cyA9PSBudWxsIHx8IG1TaXplU2VuZEludHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gc2l6ZSBhbGVydCBwYXJhbXMgYXJlIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU2l6ZU5hbWVzLmxlbmd0aCAhPSBtU2l6ZURpc3BsYXlJbnRzLmxlbmd0aAotICAgICAgICAgICAgICAgICAgICAmJiBtU2l6ZVNlbmRJbnRzLmxlbmd0aCAhPSBtU2l6ZURpc3BsYXlJbnRzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gdGhlIGxlbmd0aCBvZiBzaXplIGFsZXJ0IHBhcmFtcyBhcmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlmZmVyZW50LiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQWxpZ25BbGVydFBhcmFtcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoZWNrQWxpZ25BbGVydFBhcmFtcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGJ1aWxkZXIgaXMgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1BbGlnblRpdGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGFsaWduIGFsZXJ0IHBhcmFtcyBhcmUgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBvblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydERpYWxvZygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrQ29sb3JBbGVydFBhcmFtcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0VGl0bGUobUNvbG9yVGl0bGUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0SWNvbigwKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLgotICAgICAgICAgICAgc2V0SXRlbXMobUNvbG9yTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJFRVRWTSIsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2xvciA9IEludGVnZXIucGFyc2VJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbUNvbG9ySW50c1t3aGljaF0sIDE2KSAtIDB4MDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0SXRlbUNvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBvblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydERpYWxvZygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrQ29sb3JBbGVydFBhcmFtcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0VGl0bGUobUNvbG9yVGl0bGUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0SWNvbigwKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLgotICAgICAgICAgICAgc2V0SXRlbXMobUNvbG9yTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJFRVRWTSIsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2xvciA9IEludGVnZXIucGFyc2VJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbUNvbG9ySW50c1t3aGljaF0sIDE2KSAtIDB4MDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBvblNob3dTaXplQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dTaXplQWxlcnREaWFsb2ciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2hlY2tTaXplQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1TaXplVGl0bGUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0SWNvbigwKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLgotICAgICAgICAgICAgc2V0SXRlbXMobVNpemVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1CdWlsZGVyLm9uY2xpY2s6IiArIHdoaWNoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgIC5wYXJzZUludCgoU3RyaW5nKSBtU2l6ZURpc3BsYXlJbnRzW3doaWNoXSk7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0SXRlbVNpemUoc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93QWxpZ25BbGVydERpYWxvZygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU2hvd0FsaWduQWxlcnREaWFsb2ciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2hlY2tBbGlnbkFsZXJ0UGFyYW1zKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRUaXRsZShtQWxpZ25UaXRsZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRJY29uKDApOwotICAgICAgICAgICAgbUJ1aWxkZXIuCi0gICAgICAgICAgICBzZXRJdGVtcyhtQWxpZ25OYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm1CdWlsZGVyLm9uY2xpY2s6IiArIHdoaWNoKTsKLSAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkFsaWdubWVudCBhbGlnbiA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fTk9STUFMOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9OT1JNQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX0NFTlRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fT1BQT1NJVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0QWxpZ25tZW50KGFsaWduKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNob3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3R5bGVkVGV4dEFycm93S2V5TWV0aG9kIGV4dGVuZHMgQXJyb3dLZXlNb3ZlbWVudE1ldGhvZCB7Ci0gICAgICAgIEVkaXRvck1hbmFnZXIgbU1hbmFnZXI7Ci0gICAgICAgIFN0eWxlZFRleHRBcnJvd0tleU1ldGhvZChFZGl0b3JNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICBtTWFuYWdlciA9IG1hbmFnZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICBpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmICghbU1hbmFnZXIuaXNTb2Z0S2V5QmxvY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bih3aWRnZXQsIGJ1ZmZlciwga2V5Q29kZSwgZXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV4ZWN1dGVEb3duKHdpZGdldCwgYnVmZmVyLCBrZXlDb2RlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0RW5kUG9zKFRleHRWaWV3IHdpZGdldCkgewotICAgICAgICAgICAgaW50IGVuZDsKLSAgICAgICAgICAgIGlmICh3aWRnZXQuZ2V0U2VsZWN0aW9uU3RhcnQoKSA9PSBtTWFuYWdlci5nZXRTZWxlY3Rpb25TdGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgZW5kID0gd2lkZ2V0LmdldFNlbGVjdGlvbkVuZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmQgPSB3aWRnZXQuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gdXAoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSB1cDoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gZ2V0RW5kUG9zKHdpZGdldCk7Ci0gICAgICAgICAgICBpbnQgbGluZSA9IGxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KGVuZCk7Ci0gICAgICAgICAgICBpZiAobGluZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgdG87Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0KLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lIC0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaCA9IGxheW91dC5nZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgLSAxLCBoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRMaW5lU3RhcnQobGluZSAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRvd24oVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBkb3duOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCBlbmQgPSBnZXRFbmRQb3Mod2lkZ2V0KTsKLSAgICAgICAgICAgIGludCBsaW5lID0gbGF5b3V0LmdldExpbmVGb3JPZmZzZXQoZW5kKTsKLSAgICAgICAgICAgIGlmIChsaW5lIDwgbGF5b3V0LmdldExpbmVDb3VudCgpIC0gMSkgewotICAgICAgICAgICAgICAgIGludCB0bzsKLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKSA9PQotICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUgKyAxKSkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoID0gbGF5b3V0LmdldFByaW1hcnlIb3Jpem9udGFsKGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIHRvID0gbGF5b3V0LmdldE9mZnNldEZvckhvcml6b250YWwobGluZSArIDEsIGgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvID0gbGF5b3V0LmdldExpbmVTdGFydChsaW5lICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNldFNlbGVjdGVkRW5kUG9zKHRvKTsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbGVmdChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGxlZnQ6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgICAgICAgaW50IHRvID0gbGF5b3V0LmdldE9mZnNldFRvTGVmdE9mKGdldEVuZFBvcyh3aWRnZXQpKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyLnNldFNlbGVjdGVkRW5kUG9zKHRvKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJpZ2h0KFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmlnaHQ6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgICAgICAgaW50IHRvID0gbGF5b3V0LmdldE9mZnNldFRvUmlnaHRPZihnZXRFbmRQb3Mod2lkZ2V0KSk7Ci0gICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBleGVjdXRlRG93bihUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIsCi0gICAgICAgICAgICAgICAgaW50IGtleUNvZGUpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGV4ZWN1dGVEb3duOiAiICsga2V5Q29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUDoKLSAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IHVwKHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCB8PSBkb3duKHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0xFRlQ6Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCB8PSBsZWZ0KHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gcmlnaHQod2lkZ2V0LCBidWZmZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKLSAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIub25GaXhTZWxlY3RlZEl0ZW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgSG9yaXpvbnRhbExpbmVTcGFuIGV4dGVuZHMgSW1hZ2VTcGFuIHsKLSAgICAgICAgcHVibGljIEhvcml6b250YWxMaW5lU3BhbihpbnQgY29sb3IsIFZpZXcgdmlldykgewotICAgICAgICAgICAgc3VwZXIobmV3IEhvcml6b250YWxMaW5lRHJhd2FibGUoY29sb3IsIHZpZXcpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgY2xhc3MgSG9yaXpvbnRhbExpbmVEcmF3YWJsZSBleHRlbmRzIFNoYXBlRHJhd2FibGUgewotICAgICAgICBwcml2YXRlIFZpZXcgbVZpZXc7Ci0gICAgICAgIHB1YmxpYyBIb3Jpem9udGFsTGluZURyYXdhYmxlKGludCBjb2xvciwgVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICBzdXBlcihuZXcgUmVjdFNoYXBlKCkpOwotICAgICAgICAgICAgbVZpZXcgPSB2aWV3OwotICAgICAgICAgICAgcmVuZXdDb2xvcihjb2xvcik7Ci0gICAgICAgICAgICByZW5ld0JvdW5kcyh2aWV3KTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBkcmF3OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVuZXdDb2xvcigpOwotICAgICAgICAgICAgcmVuZXdCb3VuZHMobVZpZXcpOwotICAgICAgICAgICAgc3VwZXIuZHJhdyhjYW52YXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbmV3Qm91bmRzKFZpZXcgdmlldykgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IG1WaWV3LmdldEJhY2tncm91bmQoKS5nZXRCb3VuZHMoKS53aWR0aCgpOwotICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBtVmlldy5nZXRCYWNrZ3JvdW5kKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSByZW5ld0JvdW5kczoiICsgd2lkdGggKyAiLCIgKyBoZWlnaHQpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdCb3VuZHM6IiArIG1WaWV3LmdldENsYXNzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHdpZHRoID0gbVZpZXcuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGlmICh3aWR0aCA+IDIwKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggLT0gMjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRCb3VuZHMoMCwgMCwgd2lkdGgsIDIpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCByZW5ld0NvbG9yKGludCBjb2xvcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdDb2xvcjoiICsgY29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0UGFpbnQoKS5zZXRDb2xvcihjb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbmV3Q29sb3IoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSByZW5ld0NvbG9yOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1WaWV3IGluc3RhbmNlb2YgVmlldykgewotICAgICAgICAgICAgICAgIEltYWdlU3BhbiBwYXJlbnQgPSBnZXRQYXJlbnRTcGFuKCk7Ci0gICAgICAgICAgICAgICAgRWRpdGFibGUgdGV4dCA9ICgoRWRpdFN0eWxlZFRleHQpbVZpZXcpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSB0ZXh0LmdldFNwYW5TdGFydChwYXJlbnQpOwotICAgICAgICAgICAgICAgIEZvcmVncm91bmRDb2xvclNwYW5bXSBzcGFucyA9IHRleHQuZ2V0U3BhbnMoc3RhcnQsIHN0YXJ0LCBGb3JlZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZW5ld0NvbG9yKHNwYW5zW3NwYW5zLmxlbmd0aCAtIDFdLmdldEZvcmVncm91bmRDb2xvcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBJbWFnZVNwYW4gZ2V0UGFyZW50U3BhbigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGdldFBhcmVudFNwYW46Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVZpZXcgaW5zdGFuY2VvZiBFZGl0U3R5bGVkVGV4dCkgewotICAgICAgICAgICAgICAgIEVkaXRhYmxlIHRleHQgPSAoKEVkaXRTdHlsZWRUZXh0KW1WaWV3KS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgSW1hZ2VTcGFuW10gaW1hZ2VzID0gdGV4dC5nZXRTcGFucygwLCB0ZXh0Lmxlbmd0aCgpLCBJbWFnZVNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmIChpbWFnZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKEltYWdlU3BhbiBpbWFnZTogaW1hZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UuZ2V0RHJhd2FibGUoKSA9PSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLXJlbmV3Qm91bmRzOiBDb3VsZG4ndCBmaW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvam5pL0FjdGl2aXR5TWFuYWdlci5jcHAgYi9jb3JlL2puaS9BY3Rpdml0eU1hbmFnZXIuY3BwCmluZGV4IDg5NTBkZmIuLjBiZDE0ZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0FjdGl2aXR5TWFuYWdlci5jcHAKKysrIGIvY29yZS9qbmkvQWN0aXZpdHlNYW5hZ2VyLmNwcApAQCAtMzksNyArMzksNyBAQAogICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYodXJpKTsKICAgICAgICAgc3RhdHVzX3QgcmV0ID0gYW0tPnRyYW5zYWN0KE9QRU5fQ09OVEVOVF9VUklfVFJBTlNBQ1RJT04sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICAgICAgICAgIGlmICghZXhjZXB0aW9uQ29kZSkgewogICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MgaXMgaW5kaWNhdGVkIGhlcmUgYnkgYSBub256ZXJvIGludCBmb2xsb3dlZCBieSB0aGUgZmQ7CiAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBieSBhIHplcm8gaW50IHdpdGggbm8gZGF0YSBmb2xsb3dpbmcuCmRpZmYgLS1naXQgYS9jb3JlL2puaS9BbmRyb2lkLm1rIGIvY29yZS9qbmkvQW5kcm9pZC5tawppbmRleCA3MjJkYWNiLi5kMTljYWU0IDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkLm1rCisrKyBiL2NvcmUvam5pL0FuZHJvaWQubWsKQEAgLTEwNSw2ICsxMDUsNyBAQAogCWFuZHJvaWQvZ3JhcGhpY3MvUmFzdGVyaXplci5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwIFwKKwlhbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvWXV2VG9KcGVnRW5jb2Rlci5jcHAgXApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCmluZGV4IGIwNDQyNzEuLjU1OGY1ZmYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKQEAgLTMwLDEwICszMCwxMSBAQAogI2luY2x1ZGUgIlNrQm91bmRhcnlQYXRjaC5oIgogI2luY2x1ZGUgIlNrTWVzaFV0aWxzLmgiCiAKKyNpbmNsdWRlICJUZXh0TGF5b3V0LmgiCisKICNpbmNsdWRlICJ1bmljb2RlL3ViaWRpLmgiCiAjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKIAotLy8gdGVtcG9yYXJ5IGZvciBkZWJ1Z2dpbmcKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2RlZmluZSBUSU1FX0RSQVd4CkBAIC01OCwyNCArNTksNiBAQAogY2xhc3MgU2tDYW52YXNHbHVlIHsKIHB1YmxpYzoKIAotICAgIGVudW0gewotICAgICAga0RpcmVjdGlvbl9MVFIgPSAwLAotICAgICAga0RpcmVjdGlvbl9SVEwgPSAxCi0gICAgfTsKLQotICAgIGVudW0gewotICAgICAga0RpcmVjdGlvbl9NYXNrID0gMHgxCi0gICAgfTsKLQotICAgIGVudW0gewotICAgICAga0JpZGlfTFRSID0gMCwKLSAgICAgIGtCaWRpX1JUTCA9IDEsCi0gICAgICBrQmlkaV9EZWZhdWx0X0xUUiA9IDIsCi0gICAgICBrQmlkaV9EZWZhdWx0X1JUTCA9IDMsCi0gICAgICBrQmlkaV9Gb3JjZV9MVFIgPSA0LAotICAgICAga0JpZGlfRm9yY2VfUlRMID0gNQotICAgIH07Ci0KICAgICBzdGF0aWMgdm9pZCBmaW5hbGl6ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrQ2FudmFzKiBjYW52YXMpIHsKICAgICAgICAgY2FudmFzLT51bnJlZigpOwogICAgIH0KQEAgLTc2OCwxNTggKzc1MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLCBpbmRleENvdW50LCAqcGFpbnQpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBjb250ZXh0IHRoZSB0ZXh0IGNvbnRleHQKLSAgICAgKiBAc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlbmRlcgotICAgICAqIEBjb3VudCB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IHRvIHJlbmRlciwgc3RhcnQgKyBjb3VudCAgbXVzdCBiZSA8PSBsZW4KLSAgICAgKiBAY29udGV4dENvdW50IHRoZSBsZW5ndGggb2YgdGhlIGNvbnRleHQKLSAgICAgKiBAc2hhcGVkIHdoZXJlIHRvIHB1dCB0aGUgc2hhcGVkIHRleHQsIG11c3QgaGF2ZSBjYXBhY2l0eSBmb3IgY291bnQgdWNoYXJzCi0gICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzaGFwZWQgdGV4dCwgb3IgLTEgaWYgZXJyb3IKLSAgICAgKi8KLSAgICBzdGF0aWMgaW50IHNoYXBlUnRsVGV4dF9fKGNvbnN0IGpjaGFyKiBjb250ZXh0LCBqc2l6ZSBzdGFydCwganNpemUgY291bnQsIGpzaXplIGNvbnRleHRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyKiBzaGFwZWQsIFVFcnJvckNvZGUgJnN0YXR1cykgewotICAgICAgICBqY2hhciBidWZmZXJbY29udGV4dENvdW50XTsKLQotICAgICAgICAvLyBXZSdkIHJhdGhlciB1c2UgaGFyZmJ1enogaGVyZS4gIFVzZSBjaGFyYWN0ZXIgYmFzZWQgc2hhcGluZyBmb3Igbm93LgotCi0gICAgICAgIC8vIFVzZSBmaXhlZCBsZW5ndGggc2luY2Ugd2UgbmVlZCB0byBrZWVwIHN0YXJ0IGFuZCBjb3VudCB2YWxpZAotICAgICAgICB1X3NoYXBlQXJhYmljKGNvbnRleHQsIGNvbnRleHRDb3VudCwgYnVmZmVyLCBjb250ZXh0Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwgVV9TSEFQRV9MRVRURVJTX1NIQVBFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7Ci0KLSAgICAgICAgaWYgKCFVX1NVQ0NFU1Moc3RhdHVzKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0cmltIG91dCAweGZmZmYgZm9sbG93aW5nIGxpZ2F0dXJlcywgaWYgYW55Ci0gICAgICAgIGludCBlbmQgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBzdGFydCArIGNvdW50OyBpIDwgZTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09IDB4ZmZmZikgewotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlcltlbmQrK10gPSBidWZmZXJbaV07Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgPSBlbmQ7Ci0gICAgICAgIC8vIExPRyhMT0dfSU5GTywgIkNTUlRMIiwgInN0YXJ0ICVkIGNvdW50ICVkIGNjb3VudCAlZFxuIiwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQpOwotICAgICAgICB1YmlkaV93cml0ZVJldmVyc2UoYnVmZmVyLCBjb3VudCwgc2hhcGVkLCBjb3VudCwgVUJJRElfRE9fTUlSUk9SSU5HIHwgVUJJRElfT1VUUFVUX1JFVkVSU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVUJJRElfS0VFUF9CQVNFX0NPTUJJTklORywgJnN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fKEpOSUVudiogZW52LCBTa0NhbnZhcyogY2FudmFzLCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7Ci0gICAgICAgIFNrU2NhbGFyIHhfID0gU2tGbG9hdFRvU2NhbGFyKHgpOwotICAgICAgICBTa1NjYWxhciB5XyA9IFNrRmxvYXRUb1NjYWxhcih5KTsKLQotICAgICAgICBTa1BhaW50OjpBbGlnbiBob3JpeiA9IHBhaW50LT5nZXRUZXh0QWxpZ24oKTsKLQotICAgICAgICBib29sIG5lZWRCaWRpID0gKGZsYWdzID09IGtCaWRpX1JUTCkgfHwgKGZsYWdzID09IGtCaWRpX0RlZmF1bHRfUlRMKTsKLSAgICAgICAgaWYgKCFuZWVkQmlkaSAmJiBmbGFncyA8IGtCaWRpX0ZvcmNlX0xUUikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgICAgICAgICAgICAgIGlmICh0ZXh0W2ldID49IDB4MDU5MCkgewotICAgICAgICAgICAgICAgICAgICBuZWVkQmlkaSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBkaXIgPSAoZmxhZ3MgPT0ga0JpZGlfRm9yY2VfUlRMKSA/IGtEaXJlY3Rpb25fUlRMIDoga0RpcmVjdGlvbl9MVFI7IC8vIHdpbGwgYmUgcmVzZXQgaWYgd2UgcnVuIGJpZGkKLSAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7Ci0gICAgICAgIGpjaGFyICpzaGFwZWQgPSBOVUxMOwotICAgICAgICBpbnQzMl90IHNsZW4gPSAwOwotICAgICAgICBpZiAobmVlZEJpZGkgfHwgKGZsYWdzID09IGtCaWRpX0ZvcmNlX1JUTCkpIHsKLSAgICAgICAgICAgIHNoYXBlZCA9IChqY2hhciAqKW1hbGxvYyhsZW4gKiBzaXplb2YoamNoYXIpKTsKLSAgICAgICAgICAgIGlmICghc2hhcGVkKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gVV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRCaWRpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgUlRMX09QVFMgPSBVQklESV9ET19NSVJST1JJTkcgfCBVQklESV9LRUVQX0JBU0VfQ09NQklOSU5HIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQklESV9SRU1PVkVfQklESV9DT05UUk9MUyB8IFVCSURJX09VVFBVVF9SRVZFUlNFOwotICAgICAgICAgICAgICAgICAgICBqaW50IGxpbmVEaXIgPSAwOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZsYWdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Uga0JpZGlfTFRSOiBsaW5lRGlyID0gMDsgYnJlYWs7IC8vIG5vIElDVSBjb25zdGFudCwgY2Fub25pY2FsIExUUiBsZXZlbAotICAgICAgICAgICAgICAgICAgICBjYXNlIGtCaWRpX1JUTDogbGluZURpciA9IDE7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBSVEwgbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBrQmlkaV9EZWZhdWx0X0xUUjogbGluZURpciA9IFVCSURJX0RFRkFVTFRfTFRSOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBrQmlkaV9EZWZhdWx0X1JUTDogbGluZURpciA9IFVCSURJX0RFRkFVTFRfUlRMOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFVCaURpKiBiaWRpID0gdWJpZGlfb3BlbigpOwotICAgICAgICAgICAgICAgICAgICB1YmlkaV9zZXRQYXJhKGJpZGksIHRleHQsIGxlbiwgbGluZURpciwgTlVMTCwgJnN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlyID0gdWJpZGlfZ2V0UGFyYUxldmVsKGJpZGkpICYgMHgxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmMgPSB1YmlkaV9jb3VudFJ1bnMoYmlkaSwgJnN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVCaURpRGlyZWN0aW9uIGRpcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhciAqYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJjOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyID0gdWJpZGlfZ2V0VmlzdWFsUnVuKGJpZGksIGksICZzdGFydCwgJmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZha2Ugc2hhcGluZywgZXhjZXB0IGl0IGRvZXNuJ3Qgc2hhcGUsIGp1c3QgbWlycm9ycyBhbmQgcmV2ZXJzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGhhcmZidXp6IHdoZW4gYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gVUJJRElfUlRMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVuICs9IHViaWRpX3dyaXRlUmV2ZXJzZSh0ZXh0ICsgc3RhcnQsIGxlbmd0aCwgc2hhcGVkICsgc2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgUlRMX09QVFMsICZzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZFtzbGVuICsgaV0gPSB0ZXh0W3N0YXJ0ICsgaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVuICs9IGxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHViaWRpX2Nsb3NlKGJpZGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIGxlbiA9IHNoYXBlUnRsVGV4dF9fKHRleHQsIDAsIGxlbiwgbGVuLCBzaGFwZWQsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFVX1NVQ0NFU1Moc3RhdHVzKSkgewotICAgICAgICAgICAgY2hhciBidWZmZXJbMzVdOwotICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICJEcmF3VGV4dCBiaWRpIGVycm9yICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgIGRvVGhyb3dJQUUoZW52LCBidWZmZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9vbCB0cmltTGVmdCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB0cmltUmlnaHQgPSBmYWxzZTsKLQotICAgICAgICAgICAgc3dpdGNoIChob3JpeikgewotICAgICAgICAgICAgY2FzZSBTa1BhaW50OjprTGVmdF9BbGlnbjogdHJpbUxlZnQgPSBkaXIgJiBrRGlyZWN0aW9uX01hc2s7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTa1BhaW50OjprQ2VudGVyX0FsaWduOiB0cmltTGVmdCA9IHRyaW1SaWdodCA9IHRydWU7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTa1BhaW50OjprUmlnaHRfQWxpZ246IHRyaW1SaWdodCA9ICEoZGlyICYga0RpcmVjdGlvbl9NYXNrKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3QgamNoYXIqIHdvcmtUZXh0ID0gc2hhcGVkID8gc2hhcGVkIDogdGV4dDsKLSAgICAgICAgICAgIGNvbnN0IGpjaGFyKiB3b3JrTGltaXQgPSB3b3JrVGV4dCArIGxlbjsKLQotICAgICAgICAgICAgaWYgKHRyaW1MZWZ0KSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHdvcmtUZXh0IDwgd29ya0xpbWl0ICYmICp3b3JrVGV4dCA9PSAnICcpIHsKLSAgICAgICAgICAgICAgICAgICAgKyt3b3JrVGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHJpbVJpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHdvcmtMaW1pdCA+IHdvcmtUZXh0ICYmICood29ya0xpbWl0IC0gMSkgPT0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgICAgIC0td29ya0xpbWl0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludDMyX3Qgd29ya0J5dGVzID0gKHdvcmtMaW1pdCAtIHdvcmtUZXh0KSA8PCAxOwotCi0gICAgICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHdvcmtUZXh0LCB3b3JrQnl0ZXMsIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzaGFwZWQpIHsKLSAgICAgICAgICAgIGZyZWUoc2hhcGVkKTsKLSAgICAgICAgfQotICAgIH0KIAogICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19fQ0lJRkZJUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgZHJhd1RleHRfXyhlbnYsIGNhbnZhcywgdGV4dEFycmF5ICsgaW5kZXgsIGNvdW50LCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dChwYWludCwgdGV4dEFycmF5ICsgaW5kZXgsIGNvdW50LCBmbGFncywgeCwgeSwgY2FudmFzKTsKICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCBKTklfQUJPUlQpOwogICAgIH0KIApAQCAtOTI4LDU0ICs3NjUsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgZHJhd1RleHRfXyhlbnYsIGNhbnZhcywgdGV4dEFycmF5ICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dChwYWludCwgdGV4dEFycmF5ICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBmbGFncywgeCwgeSwgY2FudmFzKTsKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKICAgICB9CiAKLSAgICAvLyBEcmF3cyBhIHVuaWRpcmVjdGlvbmFsIHJ1biBvZiB0ZXh0LgotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuX18oSk5JRW52KiBlbnYsIFNrQ2FudmFzKiBjYW52YXMsIGNvbnN0IGpjaGFyKiBjaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7Ci0KLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotCi0gICAgICAgIHVpbnQ4X3QgcnRsID0gZmxhZ3MgJiAweDE7Ci0gICAgICAgIGlmIChydGwpIHsKLSAgICAgICAgICAgIGpjaGFyIGNvbnRleHRbY29udGV4dENvdW50XTsKLSAgICAgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwotICAgICAgICAgICAgY291bnQgPSBzaGFwZVJ0bFRleHRfXyhjaGFycywgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGNvbnRleHQsIHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKLSAgICAgICAgICAgICAgICBjYW52YXMtPmRyYXdUZXh0KGNvbnRleHQsIGNvdW50IDw8IDEsIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZG9UaHJvd0lBRShlbnYsICJzaGFwaW5nIGVycm9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYW52YXMtPmRyYXdUZXh0KGNoYXJzICsgc3RhcnQsIGNvdW50IDw8IDEsIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludCgKICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LAogICAgICAgICBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCi0gICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBkaXJGbGFncywgU2tQYWludCogcGFpbnQpIHsKIAogICAgICAgICBqY2hhciogY2hhcnMgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOwotICAgICAgICBkcmF3VGV4dFJ1bl9fKGVudiwgY2FudmFzLCBjaGFycyArIGNvbnRleHRJbmRleCwgaW5kZXggLSBjb250ZXh0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRSdW4ocGFpbnQsIGNoYXJzICsgY29udGV4dEluZGV4LCBpbmRleCAtIGNvbnRleHRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgZGlyRmxhZ3MsIHgsIHksIGNhbnZhcyk7CiAgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIGNoYXJzLCBKTklfQUJPUlQpOwogICAgIH0KIAogICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuX19TdHJpbmdJSUlJRkZJUGFpbnQoCiAgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBqaW50IHN0YXJ0LAogICAgICAgICBqaW50IGVuZCwgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwKLSAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBqaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGppbnQgZGlyRmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CiAKICAgICAgICAgamludCBjb3VudCA9IGVuZCAtIHN0YXJ0OwogICAgICAgICBqaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CiAgICAgICAgIGNvbnN0IGpjaGFyKiBjaGFycyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIGRyYXdUZXh0UnVuX18oZW52LCBjYW52YXMsIGNoYXJzICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgY29udGV4dENvdW50LCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dFJ1bihwYWludCwgY2hhcnMgKyBjb250ZXh0U3RhcnQsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgY29udGV4dENvdW50LCBkaXJGbGFncywgeCwgeSwgY2FudmFzKTsKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgY2hhcnMpOwogICAgIH0KIApAQCAtMTAwNCw3ICs4MTgsOCBAQAogCiAgICAgc3RhdGljIHZvaWQgZHJhd1Bvc1RleHRfX1N0cmluZ19GUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IHBvcywgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tQYWludCogcGFpbnQpIHsKICAgICAgICAgY29uc3Qgdm9pZCogdGV4dF8gPSB0ZXh0ID8gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKSA6IE5VTEw7CiAgICAgICAgIGludCBieXRlTGVuZ3RoID0gdGV4dCA/IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpIDogMDsKICAgICAgICAgZmxvYXQqIHBvc0FycmF5ID0gcG9zID8gZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMocG9zLCBOVUxMKSA6IE5VTEw7CkBAIC0xMDI2LDIyICs4NDEsMjIgQEAKICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aF9fX0NJSVBhdGhGRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICBTa1BhdGgqIHBhdGgsIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBTa1BhdGgqIHBhdGgsIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwgamludCBiaWRpRmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CiAKICAgICAgICAgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7Ci0gICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVih0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQgPDwgMSwgKnBhdGgsCi0gICAgICAgICAgICAgICAgICAgIFNrRmxvYXRUb1NjYWxhcihoT2Zmc2V0KSwgU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpLCAqcGFpbnQpOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dE9uUGF0aChwYWludCwgdGV4dEFycmF5LCBjb3VudCwgYmlkaUZsYWdzLCBoT2Zmc2V0LCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBjYW52YXMpOwogICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIDApOwogICAgIH0KIAogICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0T25QYXRoX19TdHJpbmdQYXRoRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsIFNrUGF0aCogcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsIFNrUGF0aCogcGF0aCwKKyAgICAgICAgICAgIGpmbG9hdCBoT2Zmc2V0LCBqZmxvYXQgdk9mZnNldCwgamludCBiaWRpRmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CiAgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0XyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIGludCBieXRlTGVuZ3RoID0gZW52LT5HZXRTdHJpbmdMZW5ndGgodGV4dCkgPDwgMTsKLSAgICAgICAgY2FudmFzLT5kcmF3VGV4dE9uUGF0aEhWKHRleHRfLCBieXRlTGVuZ3RoLCAqcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgU2tGbG9hdFRvU2NhbGFyKGhPZmZzZXQpLCBTa0Zsb2F0VG9TY2FsYXIodk9mZnNldCksICpwYWludCk7CisgICAgICAgIGludCBjb3VudCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpOworICAgICAgICBUZXh0TGF5b3V0OjpkcmF3VGV4dE9uUGF0aChwYWludCwgdGV4dF8sIGNvdW50LCBiaWRpRmxhZ3MsIGhPZmZzZXQsIHZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGNhbnZhcyk7CiAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRfKTsKICAgICB9CiAKQEAgLTExNTUsOSArOTcwLDkgQEAKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdQb3NUZXh0X19fQ0lJX0ZQYWludH0sCiAgICAgeyJuYXRpdmVfZHJhd1Bvc1RleHQiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO1tGSSlWIiwKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdQb3NUZXh0X19TdHJpbmdfRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJW0NJSUlGRkkpViIsCisgICAgeyJuYXRpdmVfZHJhd1RleHRPblBhdGgiLCIoSVtDSUlJRkZJSSlWIiwKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0T25QYXRoX19fQ0lJUGF0aEZGUGFpbnR9LAotICAgIHsibmF0aXZlX2RyYXdUZXh0T25QYXRoIiwiKElMamF2YS9sYW5nL1N0cmluZztJRkZJKVYiLAorICAgIHsibmF0aXZlX2RyYXdUZXh0T25QYXRoIiwiKElMamF2YS9sYW5nL1N0cmluZztJRkZJSSlWIiwKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0T25QYXRoX19TdHJpbmdQYXRoRkZQYWludH0sCiAgICAgeyJuYXRpdmVfZHJhd1BpY3R1cmUiLCAiKElJKVYiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1BpY3R1cmV9LAogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuY3BwCmluZGV4IGNhOWM5ZGUuLmU0ZDQ4NTAgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiU2tUeXBlZmFjZS5oIgogI2luY2x1ZGUgIlNrWGZlcm1vZGUuaCIKICNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKIAogLy8gdGVtcG9yYXJ5IGZvciBkZWJ1Z2dpbmcKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTQwMyw1NiArNDA0LDE0IEBACiAgICAgICAgIHJldHVybiBjb3VudDsKICAgICB9CiAKLSAgICBzdGF0aWMgamZsb2F0IGRvVGV4dFJ1bkFkdmFuY2VzKEpOSUVudiAqZW52LCBTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKnRleHQsIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqaW50IGZsYWdzLAorICAgIHN0YXRpYyBqZmxvYXQgZG9UZXh0UnVuQWR2YW5jZXMoSk5JRW52ICplbnYsIFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqaW50IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgewogICAgICAgICBqZmxvYXQgYWR2YW5jZXNBcnJheVtjb3VudF07Ci0gICAgICAgIGpjaGFyIGJ1ZmZlcltjb250ZXh0Q291bnRdOworICAgICAgICBqZmxvYXQgdG90YWxBZHZhbmNlOwogCi0gICAgICAgIFNrU2NhbGFyKiBzY2FsYXJBcnJheSA9IChTa1NjYWxhciAqKWFkdmFuY2VzQXJyYXk7Ci0gICAgICAgIGpmbG9hdCB0b3RhbEFkdmFuY2UgPSAwOwotCi0gICAgICAgIC8vIHRoaXMgaXMgd2hlcmUgd2UnZCBjYWxsIGhhcmZidXp6Ci0gICAgICAgIC8vIGZvciBub3cgd2UganVzdCB1c2UgdXNoYXBlLmMKLQotICAgICAgICBpbnQgd2lkdGhzOwotICAgICAgICBpZiAoZmxhZ3MgJiAweDEpIHsgLy8gcnRsLCBjYWxsIGFyYWJpYyBzaGFwaW5nIGluIGNhc2UKLSAgICAgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwotICAgICAgICAgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCi0gICAgICAgICAgICB1X3NoYXBlQXJhYmljKHRleHQsIGNvbnRleHRDb3VudCwgYnVmZmVyLCBjb250ZXh0Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwgVV9TSEFQRV9MRVRURVJTX1NIQVBFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7Ci0gICAgICAgICAgICAvLyB3ZSBzaG91bGRuJ3QgZmFpbCB1bmxlc3MgdGhlcmUncyBhbiBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbiwKLSAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UncmUgaG9zZWQgYW55d2F5Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgY291bnQ7IGkgPCBlOyArK2kpIHsKLSAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAweGZmZmYpIHsKLSAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSAweDIwMGI7IC8vIHplcm8td2lkdGgtc3BhY2UgZm9yIHNraWEKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHMoYnVmZmVyICsgc3RhcnQsIGNvdW50IDw8IDEsIHNjYWxhckFycmF5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKHRleHQgKyBzdGFydCwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdpZHRocyA8IGNvdW50KSB7Ci0gICAgICAgICAgICAvLyBTa2lhIG9wZXJhdGVzIG9uIGNvZGUgcG9pbnRzLCBub3QgY29kZSB1bml0cywgc28gc3Vycm9nYXRlIHBhaXJzIHJldHVybiBvbmx5Ci0gICAgICAgICAgICAvLyBvbmUgdmFsdWUuIEV4cGFuZCB0aGUgcmVzdWx0IHNvIHdlIGhhdmUgb25lIHZhbHVlIHBlciBVVEYtMTYgY29kZSB1bml0LgotCi0gICAgICAgICAgICAvLyBOb3RlLCBza2lhJ3MgZ2V0VGV4dFdpZHRoIGdldHMgY29uZnVzZWQgaWYgaXQgZW5jb3VudGVycyBhIHN1cnJvZ2F0ZSBwYWlyLAotICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgcmVtYWluaW5nIHdpZHRocyB6ZXJvLiAgTm90IG5pY2UuCi0gICAgICAgICAgICBjb25zdCBqY2hhciAqY2hhcnMgPSB0ZXh0ICsgc3RhcnQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgcCA9IDA7IGkgPCB3aWR0aHM7ICsraSkgewotICAgICAgICAgICAgICAgIHRvdGFsQWR2YW5jZSArPSBhZHZhbmNlc0FycmF5W3ArK10gPSBTa1NjYWxhclRvRmxvYXQoc2NhbGFyQXJyYXlbaV0pOwotICAgICAgICAgICAgICAgIGlmIChwIDwgY291bnQgJiYgY2hhcnNbcF0gPj0gMHhkYzAwICYmIGNoYXJzW3BdIDwgMHhlMDAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc1twLTFdID49IDB4ZDgwMCAmJiBjaGFyc1twLTFdIDwgMHhkYzAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkdmFuY2VzQXJyYXlbcCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdG90YWxBZHZhbmNlICs9IGFkdmFuY2VzQXJyYXlbaV0gPSBTa1NjYWxhclRvRmxvYXQoc2NhbGFyQXJyYXlbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIFRleHRMYXlvdXQ6OmdldFRleHRSdW5BZHZhbmNlcyhwYWludCwgdGV4dCwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXNBcnJheSwgdG90YWxBZHZhbmNlKTsKIAogICAgICAgICBpZiAoYWR2YW5jZXMgIT0gTlVMTCkgewogICAgICAgICAgICAgZW52LT5TZXRGbG9hdEFycmF5UmVnaW9uKGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4LCBjb3VudCwgYWR2YW5jZXNBcnJheSk7CkBAIC01ODAsMTkgKzUzOSwyNSBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19fQ0lJRkZQYXRoKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKLSAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7Ci0gICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQgPDwgMSwgU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksIHBhdGgpOwotICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjb25zdF9jYXN0PGpjaGFyKj4odGV4dEFycmF5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk5JX0FCT1JUKTsKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aChKTklFbnYqIGVudiwgU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCAqcGF0aCkgeworICAgICAgICBUZXh0TGF5b3V0OjpnZXRUZXh0UGF0aChwYWludCwgdGV4dCwgY291bnQsIGJpZGlGbGFncywgeCwgeSwgcGF0aCk7CiAgICAgfQotIAotICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19TdHJpbmdJSUZGUGF0aChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCogcGF0aCkgeworCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGhfX19DKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamludCBiaWRpRmxhZ3MsCisgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCogcGF0aCkgeworICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgZ2V0VGV4dFBhdGgoZW52LCBwYWludCwgdGV4dEFycmF5ICsgaW5kZXgsIGNvdW50LCBiaWRpRmxhZ3MsIHgsIHksIHBhdGgpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjb25zdF9jYXN0PGpjaGFyKj4odGV4dEFycmF5KSwgSk5JX0FCT1JUKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fU3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamludCBiaWRpRmxhZ3MsCisgICAgICAgICAgICBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKICAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh0ZXh0QXJyYXkgKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLCBTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwgcGF0aCk7CisgICAgICAgIGdldFRleHRQYXRoKGVudiwgcGFpbnQsIHRleHRBcnJheSArIHN0YXJ0LCBlbmQgLSBzdGFydCwgYmlkaUZsYWdzLCB4LCB5LCBwYXRoKTsKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBzZXRTaGFkb3dMYXllcihKTklFbnYqIGVudiwgam9iamVjdCBqcGFpbnQsIGpmbG9hdCByYWRpdXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IGR4LCBqZmxvYXQgZHksIGludCBjb2xvcikgewogICAgICAgICBOUEVfQ0hFQ0tfUkVUVVJOX1ZPSUQoZW52LCBqcGFpbnQpOwpAQCAtNzY3LDggKzczMiw4IEBACiAgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvciIsICIoSVtDSUlJSUkpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5DdXJzb3JfX19DfSwKICAgICB7Im5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlJSUkpSSIsCiAgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5DdXJzb3JfX1N0cmluZ30sCi0gICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSVtDSUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19fQ0lJRkZQYXRofSwKLSAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19TdHJpbmdJSUZGUGF0aH0sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSUlbQ0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fX0N9LAorICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19TdHJpbmd9LAogICAgIHsibmF0aXZlR2V0U3RyaW5nQm91bmRzIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlMYW5kcm9pZC9ncmFwaGljcy9SZWN0OylWIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRTdHJpbmdCb3VuZHMgfSwKICAgICB7Im5hdGl2ZUdldENoYXJBcnJheUJvdW5kcyIsICIoSVtDSUlMYW5kcm9pZC9ncmFwaGljcy9SZWN0OylWIiwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNTM2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCisjaW5jbHVkZSAiU2tUZW1wbGF0ZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3ViaWRpLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyBSZXR1cm5zIHRydWUgaWYgd2UgbWlnaHQgbmVlZCBsYXlvdXQuICBJZiBiaWRpRmxhZ3MgZm9yY2UgTFRSLCBhc3N1bWUgbm8gbGF5b3V0LCBpZgorLy8gYmlkaUZsYWdzIGluZGljYXRlIHRoZXJlIHByb2JhYmx5IGlzIFJUTCwgYXNzdW1lIHdlIGRvLCBvdGhlcndpc2Ugc2NhbiB0aGUgdGV4dAorLy8gbG9va2luZyBmb3IgYSBjaGFyYWN0ZXIgPj0gdGhlIGZpcnN0IFJUTCBjaGFyYWN0ZXIgaW4gdW5pY29kZSBhbmQgYXNzdW1lIHdlIGRvIGlmCisvLyB3ZSBmaW5kIG9uZS4KK2Jvb2wgVGV4dExheW91dDo6bmVlZHNMYXlvdXQoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGJpZGlGbGFncykgeworICAgIGlmIChiaWRpRmxhZ3MgPT0ga0JpZGlfRm9yY2VfTFRSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKChiaWRpRmxhZ3MgPT0ga0JpZGlfUlRMKSB8fCAoYmlkaUZsYWdzID09IGtCaWRpX0RlZmF1bHRfUlRMKSB8fAorICAgICAgICAgICAgYmlkaUZsYWdzID09IGtCaWRpX0ZvcmNlX1JUTCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBpZiAodGV4dFtpXSA+PSAweDA1OTApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGFyYWN0ZXItYmFzZWQgQXJhYmljIHNoYXBpbmcuCisgKgorICogV2UnbGwgdXNlIGhhcmZidXp6IGFuZCBnbHlwaC1iYXNlZCBzaGFwaW5nIGluc3RlYWQgb25jZSB3ZSdyZSBzZXQgdXAgZm9yIGl0LgorICoKKyAqIEBjb250ZXh0IHRoZSB0ZXh0IGNvbnRleHQKKyAqIEBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVuZGVyCisgKiBAY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCB0byByZW5kZXIsIHN0YXJ0ICsgY291bnQgIG11c3QgYmUgPD0gY29udGV4dENvdW50CisgKiBAY29udGV4dENvdW50IHRoZSBsZW5ndGggb2YgdGhlIGNvbnRleHQKKyAqIEBzaGFwZWQgd2hlcmUgdG8gcHV0IHRoZSBzaGFwZWQgdGV4dCwgbXVzdCBoYXZlIGNhcGFjaXR5IGZvciBjb3VudCB1Y2hhcnMKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc2hhcGVkIHRleHQsIG9yIC0xIGlmIGVycm9yCisgKi8KK2ludCBUZXh0TGF5b3V0OjpzaGFwZVJ0bFRleHQoY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSBjb3VudCwganNpemUgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIqIHNoYXBlZCwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgICAgamNoYXIgYnVmZmVyW2NvbnRleHRDb3VudF07CisKKyAgICAvLyBVc2UgZml4ZWQgbGVuZ3RoIHNpbmNlIHdlIG5lZWQgdG8ga2VlcCBzdGFydCBhbmQgY291bnQgdmFsaWQKKyAgICB1X3NoYXBlQXJhYmljKGNvbnRleHQsIGNvbnRleHRDb3VudCwgYnVmZmVyLCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8IFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisKKyAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgLy8gdHJpbSBvdXQgMHhmZmZmIGZvbGxvd2luZyBsaWdhdHVyZXMsIGlmIGFueQorICAgICAgICBpbnQgZW5kID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gc3RhcnQgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSAhPSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbZW5kKytdID0gYnVmZmVyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvdW50ID0gZW5kOworICAgICAgICAvLyBMT0coTE9HX0lORk8sICJDU1JUTCIsICJzdGFydCAlZCBjb3VudCAlZCBjY291bnQgJWRcbiIsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50KTsKKyAgICAgICAgdWJpZGlfd3JpdGVSZXZlcnNlKGJ1ZmZlciwgY291bnQsIHNoYXBlZCwgY291bnQsIFVCSURJX0RPX01JUlJPUklORyB8IFVCSURJX09VVFBVVF9SRVZFUlNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVCSURJX0tFRVBfQkFTRV9DT01CSU5JTkcsICZzdGF0dXMpOworICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworLyoqCisgKiBCYXNpYyBjaGFyYWN0ZXItYmFzZWQgbGF5b3V0IHN1cHBvcnRpbmcgcnRsIGFuZCBhcmFiaWMgc2hhcGluZy4KKyAqIFJ1bnMgYmlkaSBvbiB0aGUgdGV4dCBhbmQgZ2VuZXJhdGVzIGEgcmVvcmRlcmVkLCBzaGFwZWQgbGluZSBpbiBidWZmZXIsIHJldHVybmluZworICogdGhlIGxlbmd0aC4KKyAqIEB0ZXh0IHRoZSB0ZXh0CisgKiBAbGVuIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgaW4gdWNoYXJzCisgKiBAZGlyIHJlY2VpdmVzIHRoZSByZXNvbHZlZCBwYXJhZ3JhcGggZGlyZWN0aW9uCisgKiBAYnVmZmVyIHRoZSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcmVvcmRlcmVkLCBzaGFwZWQgbGluZS4gIE11c3QgaGF2ZSBjYXBhY2l0eSBvZgorICogYXQgbGVhc3QgbGVuIGpjaGFycy4KKyAqIEBmbGFncyBsaW5lIGJpZGkgZmxhZ3MKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVvcmRlcmVkLCBzaGFwZWQgbGluZSwgb3IgLTEgaWYgZXJyb3IKKyAqLworamludCBUZXh0TGF5b3V0OjpsYXlvdXRMaW5lKGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGxlbiwgamludCBmbGFncywgaW50ICZkaXIsIGpjaGFyKiBidWZmZXIsCisgICAgICAgIFVFcnJvckNvZGUgJnN0YXR1cykgeworICAgIHN0YXRpYyBjb25zdCBpbnQgUlRMX09QVFMgPSBVQklESV9ET19NSVJST1JJTkcgfCBVQklESV9LRUVQX0JBU0VfQ09NQklOSU5HIHwKKyAgICAgICAgICAgIFVCSURJX1JFTU9WRV9CSURJX0NPTlRST0xTIHwgVUJJRElfT1VUUFVUX1JFVkVSU0U7CisKKyAgICBVQmlEaUxldmVsIGJpZGlSZXEgPSAwOworICAgIHN3aXRjaCAoZmxhZ3MpIHsKKyAgICBjYXNlIGtCaWRpX0xUUjogYmlkaVJlcSA9IDA7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBMVFIgbGV2ZWwKKyAgICBjYXNlIGtCaWRpX1JUTDogYmlkaVJlcSA9IDE7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBSVEwgbGV2ZWwKKyAgICBjYXNlIGtCaWRpX0RlZmF1bHRfTFRSOiBiaWRpUmVxID0gVUJJRElfREVGQVVMVF9MVFI7IGJyZWFrOworICAgIGNhc2Uga0JpZGlfRGVmYXVsdF9SVEw6IGJpZGlSZXEgPSBVQklESV9ERUZBVUxUX1JUTDsgYnJlYWs7CisgICAgY2FzZSBrQmlkaV9Gb3JjZV9MVFI6IG1lbWNweShidWZmZXIsIHRleHQsIGxlbiAqIHNpemVvZihqY2hhcikpOyByZXR1cm4gbGVuOworICAgIGNhc2Uga0JpZGlfRm9yY2VfUlRMOiByZXR1cm4gc2hhcGVSdGxUZXh0KHRleHQsIDAsIGxlbiwgbGVuLCBidWZmZXIsIHN0YXR1cyk7CisgICAgfQorCisgICAgaW50MzJfdCByZXN1bHQgPSAtMTsKKworICAgIFVCaURpKiBiaWRpID0gdWJpZGlfb3BlbigpOworICAgIGlmIChiaWRpKSB7CisgICAgICAgIHViaWRpX3NldFBhcmEoYmlkaSwgdGV4dCwgbGVuLCBiaWRpUmVxLCBOVUxMLCAmc3RhdHVzKTsKKyAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICBkaXIgPSB1YmlkaV9nZXRQYXJhTGV2ZWwoYmlkaSkgJiAweDE7IC8vIDAgaWYgbHRyLCAxIGlmIHJ0bAorCisgICAgICAgICAgICBpbnQgcmMgPSB1YmlkaV9jb3VudFJ1bnMoYmlkaSwgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAvLyBMT0coTE9HX0lORk8sICJMQVlPVVQiLCAicGFyYSBiaWRpUmVxPSVkIGRpcj0lZCByYz0lZFxuIiwgYmlkaVJlcSwgZGlyLCByYyk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNsZW4gPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0OworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgVUJpRGlEaXJlY3Rpb24gcnVuRGlyID0gdWJpZGlfZ2V0VmlzdWFsUnVuKGJpZGksIGksICZzdGFydCwgJmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bkRpciA9PSBVQklESV9SVEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZW4gKz0gc2hhcGVSdGxUZXh0KHRleHQgKyBzdGFydCwgMCwgbGVuZ3RoLCBsZW5ndGgsIGJ1ZmZlciArIHNsZW4sIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyICsgc2xlbiwgdGV4dCArIHN0YXJ0LCBsZW5ndGggKiBzaXplb2YoamNoYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZW4gKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1YmlkaV9jbG9zZShiaWRpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBEcmF3cyBvciBnZXRzIHRoZSBwYXRoIG9mIGEgcGFyYWdyYXBoIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgcnVubmluZyBiaWRpIGFuZCBzaGFwaW5nLgorLy8gVGhpcyB3aWxsIGRyYXcgaWYgY2FudmFzIGlzIG5vdCBudWxsLCBvdGhlcndpc2UgcGF0aCBtdXN0IGJlIG5vbi1udWxsIGFuZCBpdCB3aWxsIGNyZWF0ZQorLy8gYSBwYXRoIHJlcHJlc2VudGluZyB0aGUgdGV4dCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBkcmF3bi4KK3ZvaWQgVGV4dExheW91dDo6aGFuZGxlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LFNrQ2FudmFzICpjYW52YXMsIFNrUGF0aCAqcGF0aCkgeworCisgICAgY29uc3QgamNoYXIgKndvcmtUZXh0ID0gdGV4dDsKKyAgICBqY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgZGlyID0ga0RpcmVjdGlvbl9MVFI7CisgICAgaWYgKG5lZWRzTGF5b3V0KHRleHQsIGxlbiwgYmlkaUZsYWdzKSkgeworICAgICAgICBidWZmZXIgPShqY2hhciAqKSBtYWxsb2MobGVuICogc2l6ZW9mKGpjaGFyKSk7CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIGxlbiA9IGxheW91dExpbmUodGV4dCwgbGVuLCBiaWRpRmxhZ3MsIGRpciwgYnVmZmVyLCBzdGF0dXMpOyAvLyBtaWdodCBjaGFuZ2UgbGVuLCBkaXIKKyAgICAgICAgaWYgKCFVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgTE9HKExPR19XQVJOLCAiTEFZT1VUIiwgImRyYXdUZXh0IGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgICAgICAgcmV0dXJuOyAvLyBjYW4ndCByZW5kZXIKKyAgICAgICAgfQorCisgICAgICAgIHdvcmtUZXh0ID0gYnVmZmVyOyAvLyB1c2UgdGhlIHNoYXBlZCB0ZXh0CisgICAgfQorCisgICAgYm9vbCB0cmltTGVmdCA9IGZhbHNlOworICAgIGJvb2wgdHJpbVJpZ2h0ID0gZmFsc2U7CisKKyAgICBTa1BhaW50OjpBbGlnbiBob3JpeiA9IHBhaW50LT5nZXRUZXh0QWxpZ24oKTsKKyAgICBzd2l0Y2ggKGhvcml6KSB7CisgICAgY2FzZSBTa1BhaW50OjprTGVmdF9BbGlnbjogdHJpbUxlZnQgPSBkaXIgJiBrRGlyZWN0aW9uX01hc2s7IGJyZWFrOworICAgIGNhc2UgU2tQYWludDo6a0NlbnRlcl9BbGlnbjogdHJpbUxlZnQgPSB0cmltUmlnaHQgPSB0cnVlOyBicmVhazsKKyAgICBjYXNlIFNrUGFpbnQ6OmtSaWdodF9BbGlnbjogdHJpbVJpZ2h0ID0gIShkaXIgJiBrRGlyZWN0aW9uX01hc2spOworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgICBjb25zdCBqY2hhciogd29ya0xpbWl0ID0gd29ya1RleHQgKyBsZW47CisKKyAgICBpZiAodHJpbUxlZnQpIHsKKyAgICAgICAgd2hpbGUgKHdvcmtUZXh0IDwgd29ya0xpbWl0ICYmICp3b3JrVGV4dCA9PSAnICcpIHsKKyAgICAgICAgICAgICsrd29ya1RleHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRyaW1SaWdodCkgeworICAgICAgICB3aGlsZSAod29ya0xpbWl0ID4gd29ya1RleHQgJiYgKih3b3JrTGltaXQgLSAxKSA9PSAnICcpIHsKKyAgICAgICAgICAgIC0td29ya0xpbWl0OworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCB3b3JrQnl0ZXMgPSAod29ya0xpbWl0IC0gd29ya1RleHQpIDw8IDE7CisgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7CisgICAgU2tTY2FsYXIgeV8gPSBTa0Zsb2F0VG9TY2FsYXIoeSk7CisgICAgaWYgKGNhbnZhcykgeworICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHdvcmtUZXh0LCB3b3JrQnl0ZXMsIHhfLCB5XywgKnBhaW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYWludC0+Z2V0VGV4dFBhdGgod29ya1RleHQsIHdvcmtCeXRlcywgeF8sIHlfLCBwYXRoKTsKKyAgICB9CisKKyAgICBmcmVlKGJ1ZmZlcik7Cit9CisKK3ZvaWQgVGV4dExheW91dDo6ZHJhd1RleHRSdW4oU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzdGFydCwgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKSB7CisKKyAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7CisgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOworCisgICAgIHVpbnQ4X3QgcnRsID0gZGlyRmxhZ3MgJiAweDE7CisgICAgIGlmIChydGwpIHsKKyAgICAgICAgIFNrQXV0b1NUTWFsbG9jPDgwLCBqY2hhcj4gYnVmZmVyKGNvbnRleHRDb3VudCk7CisgICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgIGNvdW50ID0gc2hhcGVSdGxUZXh0KGNoYXJzLCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgYnVmZmVyLmdldCgpLCBzdGF0dXMpOworICAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChidWZmZXIuZ2V0KCksIGNvdW50IDw8IDEsIHhfLCB5XywgKnBhaW50KTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgTE9HKExPR19XQVJOLCAiTEFZT1VUIiwgImRyYXdUZXh0UnVuIGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgfQorICAgICB9IGVsc2UgeworICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChjaGFycyArIHN0YXJ0LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7CisgICAgIH0KKyB9CisKK3ZvaWQgVGV4dExheW91dDo6Z2V0VGV4dFJ1bkFkdmFuY2VzKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqY2hhcnMsIGppbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBkaXJGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCAqcmVzdWx0QWR2YW5jZXMsIGpmbG9hdCAmcmVzdWx0VG90YWxBZHZhbmNlKSB7CisgICAgamNoYXIgYnVmZmVyW2NvbnRleHRDb3VudF07CisKKyAgICBTa1NjYWxhciogc2NhbGFyQXJyYXkgPSAoU2tTY2FsYXIgKilyZXN1bHRBZHZhbmNlczsKKyAgICByZXN1bHRUb3RhbEFkdmFuY2UgPSAwOworCisgICAgLy8gdGhpcyBpcyB3aGVyZSB3ZSdkIGNhbGwgaGFyZmJ1enoKKyAgICAvLyBmb3Igbm93IHdlIGp1c3QgdXNlIHVzaGFwZS5jCisKKyAgICBpbnQgd2lkdGhzOworICAgIGNvbnN0IGpjaGFyKiB0ZXh0OworICAgIGlmIChkaXJGbGFncyAmIDB4MSkgeyAvLyBydGwsIGNhbGwgYXJhYmljIHNoYXBpbmcgaW4gY2FzZQorICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgICAgIHVfc2hhcGVBcmFiaWMoY2hhcnMsIGNvbnRleHRDb3VudCwgYnVmZmVyLCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8IFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisgICAgICAgIC8vIHdlIHNob3VsZG4ndCBmYWlsIHVubGVzcyB0aGVyZSdzIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uLAorICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlJ3JlIGhvc2VkIGFueXdheQorICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgY291bnQ7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICBpZiAoYnVmZmVyW2ldID09IDB4ZmZmZikgeworICAgICAgICAgICAgYnVmZmVyW2ldID0gMHgyMDBiOyAvLyB6ZXJvLXdpZHRoLXNwYWNlIGZvciBza2lhCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRleHQgPSBidWZmZXIgKyBzdGFydDsKKyAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRleHQgPSBjaGFycyArIHN0YXJ0OworICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyh0ZXh0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgfQorCisgICAgaWYgKHdpZHRocyA8IGNvdW50KSB7CisgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkKKyAgICAgICAgLy8gb25lIHZhbHVlLiBFeHBhbmQgdGhlIHJlc3VsdCBzbyB3ZSBoYXZlIG9uZSB2YWx1ZSBwZXIgVVRGLTE2IGNvZGUgdW5pdC4KKworICAgICAgICAvLyBOb3RlLCBza2lhJ3MgZ2V0VGV4dFdpZHRoIGdldHMgY29uZnVzZWQgaWYgaXQgZW5jb3VudGVycyBhIHN1cnJvZ2F0ZSBwYWlyLAorICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIHAgPSAwOyBpIDwgd2lkdGhzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdFRvdGFsQWR2YW5jZSArPSByZXN1bHRBZHZhbmNlc1twKytdID0gU2tTY2FsYXJUb0Zsb2F0KHNjYWxhckFycmF5W2ldKTsKKyAgICAgICAgICAgIGlmIChwIDwgY291bnQgJiYgdGV4dFtwXSA+PSAweGRjMDAgJiYgdGV4dFtwXSA8IDB4ZTAwMCAmJgorICAgICAgICAgICAgICAgICAgICB0ZXh0W3AtMV0gPj0gMHhkODAwICYmIHRleHRbcC0xXSA8IDB4ZGMwMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdEFkdmFuY2VzW3ArK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRUb3RhbEFkdmFuY2UgKz0gcmVzdWx0QWR2YW5jZXNbaV0gPSBTa1NjYWxhclRvRmxvYXQoc2NhbGFyQXJyYXlbaV0pOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vIERyYXdzIGEgcGFyYWdyYXBoIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgcnVubmluZyBiaWRpIGFuZCBzaGFwaW5nCit2b2lkIFRleHRMYXlvdXQ6OmRyYXdUZXh0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgIGhhbmRsZVRleHQocGFpbnQsIHRleHQsIGxlbiwgYmlkaUZsYWdzLCB4LCB5LCBjYW52YXMsIE5VTEwpOworfQorCit2b2lkIFRleHRMYXlvdXQ6OmdldFRleHRQYXRoKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpIHsKKyAgICBoYW5kbGVUZXh0KHBhaW50LCB0ZXh0LCBsZW4sIGJpZGlGbGFncywgeCwgeSwgTlVMTCwgcGF0aCk7Cit9CisKKwordm9pZCBUZXh0TGF5b3V0OjpkcmF3VGV4dE9uUGF0aChTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BhdGgqIHBhdGgsIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgIFNrU2NhbGFyIGhfID0gU2tGbG9hdFRvU2NhbGFyKGhPZmZzZXQpOworICAgIFNrU2NhbGFyIHZfID0gU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpOworCisgICAgaWYgKCFuZWVkc0xheW91dCh0ZXh0LCBjb3VudCwgYmlkaUZsYWdzKSkgeworICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYodGV4dCwgY291bnQgPDwgMSwgKnBhdGgsIGhfLCB2XywgKnBhaW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNrQXV0b1NUTWFsbG9jPDgwLCBqY2hhcj4gYnVmZmVyKGNvdW50KTsKKyAgICBpbnQgZGlyID0ga0RpcmVjdGlvbl9MVFI7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgY291bnQgPSBsYXlvdXRMaW5lKHRleHQsIGNvdW50LCBiaWRpRmxhZ3MsIGRpciwgYnVmZmVyLmdldCgpLCBzdGF0dXMpOworICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYoYnVmZmVyLmdldCgpLCBjb3VudCA8PCAxLCAqcGF0aCwgaF8sIHZfLCAqcGFpbnQpOworICAgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmggYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ5Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJqbmkuaCIKKworI2luY2x1ZGUgIlNrQ2FudmFzLmgiCisjaW5jbHVkZSAiU2tQYWludC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGV4dExheW91dCB7CitwdWJsaWM6CisKKyAgICBlbnVtIHsKKyAgICAgICAga0RpcmVjdGlvbl9MVFIgPSAwLAorICAgICAgICBrRGlyZWN0aW9uX1JUTCA9IDEsCisKKyAgICAgICAga0RpcmVjdGlvbl9NYXNrID0gMHgxCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrQmlkaV9MVFIgPSAwLAorICAgICAgICBrQmlkaV9SVEwgPSAxLAorICAgICAgICBrQmlkaV9EZWZhdWx0X0xUUiA9IDIsCisgICAgICAgIGtCaWRpX0RlZmF1bHRfUlRMID0gMywKKyAgICAgICAga0JpZGlfRm9yY2VfTFRSID0gNCwKKyAgICAgICAga0JpZGlfRm9yY2VfUlRMID0gNSwKKworICAgICAgICBrQmlkaV9NYXNrID0gMHg3CisgICAgfTsKKworICAgIC8qCisgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bihTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKTsKKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRSdW5BZHZhbmNlcyhTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKmNoYXJzLCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBkaXJGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0ICpyZXN1bHRBZHZhbmNlcywgamZsb2F0ICZyZXN1bHRUb3RhbEFkdmFuY2UpOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tDYW52YXMqIGNhbnZhcyk7CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKnRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRPblBhdGgoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGF0aCogcGF0aCwgU2tDYW52YXMqIGNhbnZhcyk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgbmVlZHNMYXlvdXQoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGJpZGlGbGFncyk7CisgICAgc3RhdGljIGludCBzaGFwZVJ0bFRleHQoY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSBjb3VudCwganNpemUgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyKiBzaGFwZWQsIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgICAgc3RhdGljIGppbnQgbGF5b3V0TGluZShjb25zdCBqY2hhciogdGV4dCwgamludCBsZW4sIGppbnQgZmxhZ3MsIGludCAmZGlyLCBqY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgICBzdGF0aWMgdm9pZCBoYW5kbGVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LFNrQ2FudmFzICpjYW52YXMsIFNrUGF0aCAqcGF0aCk7Cit9OworCit9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5jcHAKaW5kZXggZGQ1OWQ2My4uYWNiZjg1NCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9hcHBfTmF0aXZlQWN0aXZpdHkuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5LmNwcApAQCAtMTksOSArMTksMTMgQEAKIAogI2luY2x1ZGUgPHBvbGwuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV9hY3Rpdml0eS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CiAjaW5jbHVkZSA8dWkvSW5wdXRUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx1dGlscy9Qb2xsTG9vcC5oPgogCkBAIC0zMCw2ICszNCw5IEBACiAjaW5jbHVkZSAiYW5kcm9pZF92aWV3X0lucHV0Q2hhbm5lbC5oIgogI2luY2x1ZGUgImFuZHJvaWRfdmlld19LZXlFdmVudC5oIgogCisvLyNkZWZpbmUgTE9HX1RSQUNFKC4uLikKKyNkZWZpbmUgTE9HX1RSQUNFKC4uLikgTE9HKExPR19ERUJVRywgTE9HX1RBRywgX19WQV9BUkdTX18pCisKIG5hbWVzcGFjZSBhbmRyb2lkCiB7CiAKQEAgLTM3LDU4ICs0NCwyNTUgQEAKICAgICBqY2xhc3MgY2xheno7CiAKICAgICBqbWV0aG9kSUQgZGlzcGF0Y2hVbmhhbmRsZWRLZXlFdmVudDsKKyAgICBqbWV0aG9kSUQgc2V0V2luZG93RmxhZ3M7CisgICAgam1ldGhvZElEIHNldFdpbmRvd0Zvcm1hdDsKKyAgICBqbWV0aG9kSUQgc2hvd0ltZTsKKyAgICBqbWV0aG9kSUQgaGlkZUltZTsKIH0gZ05hdGl2ZUFjdGl2aXR5Q2xhc3NJbmZvOwogCi1zdHJ1Y3QgTXlJbnB1dFF1ZXVlIDogQUlucHV0UXVldWUgewotICAgIGV4cGxpY2l0IE15SW5wdXRRdWV1ZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJbnB1dENoYW5uZWw+JiBjaGFubmVsLCBpbnQgd29ya1dyaXRlKQotICAgICAgICA6IEFJbnB1dFF1ZXVlKGNoYW5uZWwpLCBtV29ya1dyaXRlKHdvcmtXcml0ZSkgewotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgZG9EZWZhdWx0S2V5KGFuZHJvaWQ6OktleUV2ZW50KiBrZXlFdmVudCkgewotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgIExPR0koIkRlZmF1bHQga2V5OiBwZW5kaW5nPSVkIHdyaXRlPSVkXG4iLCBtUGVuZGluZ0tleXMuc2l6ZSgpLCBtV29ya1dyaXRlKTsKLSAgICAgICAgaWYgKG1QZW5kaW5nS2V5cy5zaXplKCkgPD0gMCAmJiBtV29ya1dyaXRlID49IDApIHsKLSAgICAgICAgICAgIGludDhfdCBjbWQgPSAxOwotICAgICAgICAgICAgd3JpdGUobVdvcmtXcml0ZSwgJmNtZCwgc2l6ZW9mKGNtZCkpOwotICAgICAgICB9Ci0gICAgICAgIG1QZW5kaW5nS2V5cy5hZGQoa2V5RXZlbnQpOwotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICB9Ci0gICAgCi0gICAgS2V5RXZlbnQqIGdldE5leHRFdmVudCgpIHsKLSAgICAgICAgS2V5RXZlbnQqIGV2ZW50ID0gTlVMTDsKLSAgICAgICAgCi0gICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgaWYgKG1QZW5kaW5nS2V5cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBldmVudCA9IG1QZW5kaW5nS2V5c1swXTsKLSAgICAgICAgICAgIG1QZW5kaW5nS2V5cy5yZW1vdmVBdCgwKTsKLSAgICAgICAgfQotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBldmVudDsKLSAgICB9Ci0gICAgCi0gICAgaW50IG1Xb3JrV3JpdGU7Ci0gICAgCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgVmVjdG9yPEtleUV2ZW50Kj4gbVBlbmRpbmdLZXlzOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBBY3Rpdml0eVdvcmsgeworICAgIGludDMyX3QgY21kOworICAgIGludDMyX3QgYXJnMTsKKyAgICBpbnQzMl90IGFyZzI7CiB9OwogCi1zdHJ1Y3QgTmF0aXZlQ29kZSB7CitlbnVtIHsKKyAgICBDTURfREVGX0tFWSA9IDEsCisgICAgQ01EX1NFVF9XSU5ET1dfRk9STUFULAorICAgIENNRF9TRVRfV0lORE9XX0ZMQUdTLAorICAgIENNRF9TSE9XX1NPRlRfSU5QVVQsCisgICAgQ01EX0hJREVfU09GVF9JTlBVVCwKK307CisKK3N0YXRpYyB2b2lkIHdyaXRlX3dvcmsoaW50IGZkLCBpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxPTAsIGludDMyX3QgYXJnMj0wKSB7CisgICAgQWN0aXZpdHlXb3JrIHdvcms7CisgICAgd29yay5jbWQgPSBjbWQ7CisgICAgd29yay5hcmcxID0gYXJnMTsKKyAgICB3b3JrLmFyZzIgPSBhcmcyOworICAgIAorICAgIExPR19UUkFDRSgid3JpdGVfd29yazogY21kPSVkIiwgY21kKTsKKworcmVzdGFydDoKKyAgICBpbnQgcmVzID0gd3JpdGUoZmQsICZ3b3JrLCBzaXplb2Yod29yaykpOworICAgIGlmIChyZXMgPCAwICYmIGVycm5vID09IEVJTlRSKSB7CisgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICB9CisgICAgCisgICAgaWYgKHJlcyA9PSBzaXplb2Yod29yaykpIHJldHVybjsKKyAgICAKKyAgICBpZiAocmVzIDwgMCkgTE9HVygiRmFpbGVkIHdyaXRpbmcgdG8gd29yayBmZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIGVsc2UgTE9HVygiVHJ1bmNhdGVkIHdyaXRpbmcgdG8gd29yayBmZDogJWQiLCByZXMpOworfQorCitzdGF0aWMgYm9vbCByZWFkX3dvcmsoaW50IGZkLCBBY3Rpdml0eVdvcmsqIG91dFdvcmspIHsKKyAgICBpbnQgcmVzID0gcmVhZChmZCwgb3V0V29yaywgc2l6ZW9mKEFjdGl2aXR5V29yaykpOworICAgIC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgRUlOVFIsIHBvbGwgbG9vcCB3aWxsIGp1c3QgY29tZSBiYWNrIGFnYWluLgorICAgIGlmIChyZXMgPT0gc2l6ZW9mKEFjdGl2aXR5V29yaykpIHJldHVybiB0cnVlOworICAgIAorICAgIGlmIChyZXMgPCAwKSBMT0dXKCJGYWlsZWQgcmVhZGluZyB3b3JrIGZkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgZWxzZSBMT0dXKCJUcnVuY2F0ZWQgcmVhZGluZyB3b3JrIGZkOiAlZCIsIHJlcyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworQUlucHV0UXVldWU6OkFJbnB1dFF1ZXVlKGNvbnN0IHNwPElucHV0Q2hhbm5lbD4mIGNoYW5uZWwsIGludCB3b3JrV3JpdGUpIDoKKyAgICAgICAgbVdvcmtXcml0ZSh3b3JrV3JpdGUpLCBtQ29uc3VtZXIoY2hhbm5lbCkgeworICAgIGludCBtc2dwaXBlWzJdOworICAgIGlmIChwaXBlKG1zZ3BpcGUpKSB7CisgICAgICAgIExPR1coImNvdWxkIG5vdCBjcmVhdGUgcGlwZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBtRGlzcGF0Y2hLZXlSZWFkID0gbURpc3BhdGNoS2V5V3JpdGUgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRGlzcGF0Y2hLZXlSZWFkID0gbXNncGlwZVswXTsKKyAgICAgICAgbURpc3BhdGNoS2V5V3JpdGUgPSBtc2dwaXBlWzFdOworICAgICAgICBpbnQgcmVzdWx0ID0gZmNudGwobURpc3BhdGNoS2V5UmVhZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisgICAgICAgIFNMT0dXX0lGKHJlc3VsdCAhPSAwLCAiQ291bGQgbm90IG1ha2UgQUlucHV0UXVldWUgcmVhZCBwaXBlICIKKyAgICAgICAgICAgICAgICAibm9uLWJsb2NraW5nOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJlc3VsdCA9IGZjbnRsKG1EaXNwYXRjaEtleVdyaXRlLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICAgICAgU0xPR1dfSUYocmVzdWx0ICE9IDAsICJDb3VsZCBub3QgbWFrZSBBSW5wdXRRdWV1ZSB3cml0ZSBwaXBlICIKKyAgICAgICAgICAgICAgICAibm9uLWJsb2NraW5nOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorfQorCitBSW5wdXRRdWV1ZTo6fkFJbnB1dFF1ZXVlKCkgeworICAgIGNsb3NlKG1EaXNwYXRjaEtleVJlYWQpOworICAgIGNsb3NlKG1EaXNwYXRjaEtleVdyaXRlKTsKK30KKwordm9pZCBBSW5wdXRRdWV1ZTo6YXR0YWNoTG9vcGVyKEFMb29wZXIqIGxvb3BlciwgQUxvb3Blcl9jYWxsYmFja0Z1bmMqIGNhbGxiYWNrLCB2b2lkKiBkYXRhKSB7CisgICAgbVBvbGxMb29wID0gc3RhdGljX2Nhc3Q8YW5kcm9pZDo6UG9sbExvb3AqPihsb29wZXIpOworICAgIG1Qb2xsTG9vcC0+c2V0TG9vcGVyQ2FsbGJhY2sobUNvbnN1bWVyLmdldENoYW5uZWwoKS0+Z2V0UmVjZWl2ZVBpcGVGZCgpLAorICAgICAgICAgICAgUE9MTElOLCBjYWxsYmFjaywgZGF0YSk7CisgICAgbVBvbGxMb29wLT5zZXRMb29wZXJDYWxsYmFjayhtRGlzcGF0Y2hLZXlSZWFkLAorICAgICAgICAgICAgUE9MTElOLCBjYWxsYmFjaywgZGF0YSk7Cit9CisKK3ZvaWQgQUlucHV0UXVldWU6OmRldGFjaExvb3BlcigpIHsKKyAgICBtUG9sbExvb3AtPnJlbW92ZUNhbGxiYWNrKG1Db25zdW1lci5nZXRDaGFubmVsKCktPmdldFJlY2VpdmVQaXBlRmQoKSk7CisgICAgbVBvbGxMb29wLT5yZW1vdmVDYWxsYmFjayhtRGlzcGF0Y2hLZXlSZWFkKTsKK30KKworaW50MzJfdCBBSW5wdXRRdWV1ZTo6aGFzRXZlbnRzKCkgeworICAgIHN0cnVjdCBwb2xsZmQgcGZkWzJdOworCisgICAgcGZkWzBdLmZkID0gbUNvbnN1bWVyLmdldENoYW5uZWwoKS0+Z2V0UmVjZWl2ZVBpcGVGZCgpOworICAgIHBmZFswXS5ldmVudHMgPSBQT0xMSU47CisgICAgcGZkWzBdLnJldmVudHMgPSAwOworICAgIHBmZFsxXS5mZCA9IG1EaXNwYXRjaEtleVJlYWQ7CisgICAgcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKyAgICBwZmRbMF0ucmV2ZW50cyA9IDA7CisgICAgCisgICAgaW50IG5mZCA9IHBvbGwocGZkLCAyLCAwKTsKKyAgICBpZiAobmZkIDw9IDApIHJldHVybiAwOworICAgIHJldHVybiAocGZkWzBdLnJldmVudHMgPT0gUE9MTElOIHx8IHBmZFsxXS5yZXZlbnRzID09IFBPTExJTikgPyAxIDogLTE7Cit9CisKK2ludDMyX3QgQUlucHV0UXVldWU6OmdldEV2ZW50KEFJbnB1dEV2ZW50Kiogb3V0RXZlbnQpIHsKKyAgICAqb3V0RXZlbnQgPSBOVUxMOworCisgICAgY2hhciBieXRlcmVhZDsKKyAgICBzc2l6ZV90IG5SZWFkID0gcmVhZChtRGlzcGF0Y2hLZXlSZWFkLCAmYnl0ZXJlYWQsIDEpOworICAgIGlmIChuUmVhZCA9PSAxKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKG1EaXNwYXRjaGluZ0tleXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgS2V5RXZlbnQqIGtldmVudCA9IG1EaXNwYXRjaGluZ0tleXNbMF07CisgICAgICAgICAgICAqb3V0RXZlbnQgPSBrZXZlbnQ7CisgICAgICAgICAgICBtRGlzcGF0Y2hpbmdLZXlzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgbURlbGl2ZXJpbmdLZXlzLmFkZChrZXZlbnQpOworICAgICAgICB9CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICBpZiAoKm91dEV2ZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGludDMyX3QgcmVzID0gbUNvbnN1bWVyLnJlY2VpdmVEaXNwYXRjaFNpZ25hbCgpOworICAgIGlmIChyZXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgTE9HRSgiY2hhbm5lbCAnJXMnIH4gRmFpbGVkIHRvIHJlY2VpdmUgZGlzcGF0Y2ggc2lnbmFsLiAgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICBtQ29uc3VtZXIuZ2V0Q2hhbm5lbCgpLT5nZXROYW1lKCkuc3RyaW5nKCksIHJlcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBJbnB1dEV2ZW50KiBteUV2ZW50ID0gTlVMTDsKKyAgICByZXMgPSBtQ29uc3VtZXIuY29uc3VtZSgmbUlucHV0RXZlbnRGYWN0b3J5LCAmbXlFdmVudCk7CisgICAgaWYgKHJlcyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICBMT0dXKCJjaGFubmVsICclcycgfiBGYWlsZWQgdG8gY29uc3VtZSBpbnB1dCBldmVudC4gIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgbUNvbnN1bWVyLmdldENoYW5uZWwoKS0+Z2V0TmFtZSgpLnN0cmluZygpLCByZXMpOworICAgICAgICBtQ29uc3VtZXIuc2VuZEZpbmlzaGVkU2lnbmFsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAqb3V0RXZlbnQgPSBteUV2ZW50OworICAgIHJldHVybiAwOworfQorCit2b2lkIEFJbnB1dFF1ZXVlOjpmaW5pc2hFdmVudChBSW5wdXRFdmVudCogZXZlbnQsIGJvb2wgaGFuZGxlZCkgeworICAgIGJvb2wgbmVlZEZpbmlzaGVkID0gdHJ1ZTsKKworICAgIGlmICghaGFuZGxlZCAmJiAoKElucHV0RXZlbnQqKWV2ZW50KS0+Z2V0VHlwZSgpID09IElOUFVUX0VWRU5UX1RZUEVfS0VZCisgICAgICAgICAgICAmJiAoKEtleUV2ZW50KilldmVudCktPmhhc0RlZmF1bHRBY3Rpb24oKSkgeworICAgICAgICAvLyBUaGUgYXBwIGRpZG4ndCBoYW5kbGUgdGhpcywgYnV0IGl0IG1heSBoYXZlIGEgZGVmYXVsdCBhY3Rpb24KKyAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGl0LiAgV2UgbmVlZCB0byBoYW5kIHRoaXMgYmFjayB0byBKYXZhIHRvIGJlCisgICAgICAgIC8vIGV4ZWN1dGVkLgorICAgICAgICBkb0RlZmF1bHRLZXkoKEtleUV2ZW50KilldmVudCk7CisgICAgICAgIG5lZWRGaW5pc2hlZCA9IGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHNpemVfdCBOID0gbURlbGl2ZXJpbmdLZXlzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgIGlmIChtRGVsaXZlcmluZ0tleXNbaV0gPT0gZXZlbnQpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBldmVudDsKKyAgICAgICAgICAgIG1EZWxpdmVyaW5nS2V5cy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIG5lZWRGaW5pc2hlZCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKG5lZWRGaW5pc2hlZCkgeworICAgICAgICBpbnQzMl90IHJlcyA9IG1Db25zdW1lci5zZW5kRmluaXNoZWRTaWduYWwoKTsKKyAgICAgICAgaWYgKHJlcyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgTE9HVygiRmFpbGVkIHRvIHNlbmQgZmluaXNoZWQgc2lnbmFsIG9uIGNoYW5uZWwgJyVzJy4gIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgICAgIG1Db25zdW1lci5nZXRDaGFubmVsKCktPmdldE5hbWUoKS5zdHJpbmcoKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBSW5wdXRRdWV1ZTo6ZGlzcGF0Y2hFdmVudChhbmRyb2lkOjpLZXlFdmVudCogZXZlbnQpIHsKKyAgICBtTG9jay5sb2NrKCk7CisgICAgTE9HX1RSQUNFKCJkaXNwYXRjaEV2ZW50OiBkaXNwYXRjaGluZz0lZCB3cml0ZT0lZFxuIiwgbURpc3BhdGNoaW5nS2V5cy5zaXplKCksCisgICAgICAgICAgICBtRGlzcGF0Y2hLZXlXcml0ZSk7CisgICAgbURpc3BhdGNoaW5nS2V5cy5hZGQoZXZlbnQpOworICAgIG1Mb2NrLnVubG9jaygpOworICAgIAorcmVzdGFydDoKKyAgICBjaGFyIGR1bW15ID0gMDsKKyAgICBpbnQgcmVzID0gd3JpdGUobURpc3BhdGNoS2V5V3JpdGUsICZkdW1teSwgc2l6ZW9mKGR1bW15KSk7CisgICAgaWYgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKworICAgIGlmIChyZXMgPT0gc2l6ZW9mKGR1bW15KSkgcmV0dXJuOworCisgICAgaWYgKHJlcyA8IDApIExPR1coIkZhaWxlZCB3cml0aW5nIHRvIGRpc3BhdGNoIGZkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgZWxzZSBMT0dXKCJUcnVuY2F0ZWQgd3JpdGluZyB0byBkaXNwYXRjaCBmZDogJWQiLCByZXMpOworfQorCitLZXlFdmVudCogQUlucHV0UXVldWU6OmNvbnN1bWVVbmhhbmRsZWRFdmVudCgpIHsKKyAgICBLZXlFdmVudCogZXZlbnQgPSBOVUxMOworCisgICAgbUxvY2subG9jaygpOworICAgIGlmIChtUGVuZGluZ0tleXMuc2l6ZSgpID4gMCkgeworICAgICAgICBldmVudCA9IG1QZW5kaW5nS2V5c1swXTsKKyAgICAgICAgbVBlbmRpbmdLZXlzLnJlbW92ZUF0KDApOworICAgIH0KKyAgICBtTG9jay51bmxvY2soKTsKKworICAgIExPR19UUkFDRSgiY29uc3VtZVVuaGFuZGxlZEV2ZW50OiBLZXlFdmVudD0lcCIsIGV2ZW50KTsKKworICAgIHJldHVybiBldmVudDsKK30KKwordm9pZCBBSW5wdXRRdWV1ZTo6ZG9EZWZhdWx0S2V5KEtleUV2ZW50KiBrZXlFdmVudCkgeworICAgIG1Mb2NrLmxvY2soKTsKKyAgICBMT0dfVFJBQ0UoIkRlZmF1bHQga2V5OiBwZW5kaW5nPSVkIHdyaXRlPSVkXG4iLCBtUGVuZGluZ0tleXMuc2l6ZSgpLCBtV29ya1dyaXRlKTsKKyAgICBpZiAobVBlbmRpbmdLZXlzLnNpemUoKSA8PSAwICYmIG1Xb3JrV3JpdGUgPj0gMCkgeworICAgICAgICB3cml0ZV93b3JrKG1Xb3JrV3JpdGUsIENNRF9ERUZfS0VZKTsKKyAgICB9CisgICAgbVBlbmRpbmdLZXlzLmFkZChrZXlFdmVudCk7CisgICAgbUxvY2sudW5sb2NrKCk7Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgKiBOYXRpdmUgc3RhdGUgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIE5hdGl2ZUFjdGl2aXR5IGNsYXNzLgorICovCitzdHJ1Y3QgTmF0aXZlQ29kZSA6IHB1YmxpYyBBTmF0aXZlQWN0aXZpdHkgewogICAgIE5hdGl2ZUNvZGUodm9pZCogX2RsaGFuZGxlLCBBTmF0aXZlQWN0aXZpdHlfY3JlYXRlRnVuYyogX2NyZWF0ZUZ1bmMpIHsKLSAgICAgICAgbWVtc2V0KCZhY3Rpdml0eSwgc2l6ZW9mKGFjdGl2aXR5KSwgMCk7Ci0gICAgICAgIG1lbXNldCgmY2FsbGJhY2tzLCBzaXplb2YoY2FsbGJhY2tzKSwgMCk7CisgICAgICAgIG1lbXNldCgoQU5hdGl2ZUFjdGl2aXR5Kil0aGlzLCAwLCBzaXplb2YoQU5hdGl2ZUFjdGl2aXR5KSk7CisgICAgICAgIG1lbXNldCgmY2FsbGJhY2tzLCAwLCBzaXplb2YoY2FsbGJhY2tzKSk7CiAgICAgICAgIGRsaGFuZGxlID0gX2RsaGFuZGxlOwogICAgICAgICBjcmVhdGVBY3Rpdml0eUZ1bmMgPSBfY3JlYXRlRnVuYzsKLSAgICAgICAgc3VyZmFjZSA9IE5VTEw7CisgICAgICAgIG5hdGl2ZVdpbmRvdyA9IE5VTEw7CiAgICAgICAgIGlucHV0Q2hhbm5lbCA9IE5VTEw7CiAgICAgICAgIG5hdGl2ZUlucHV0UXVldWUgPSBOVUxMOwogICAgICAgICBtYWluV29ya1JlYWQgPSBtYWluV29ya1dyaXRlID0gLTE7CiAgICAgfQogICAgIAogICAgIH5OYXRpdmVDb2RlKCkgewotICAgICAgICBpZiAoYWN0aXZpdHkuZW52ICE9IE5VTEwgJiYgYWN0aXZpdHkuY2xhenogIT0gTlVMTCkgewotICAgICAgICAgICAgYWN0aXZpdHkuZW52LT5EZWxldGVHbG9iYWxSZWYoYWN0aXZpdHkuY2xhenopOworICAgICAgICBpZiAoY2FsbGJhY2tzLm9uRGVzdHJveSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjYWxsYmFja3Mub25EZXN0cm95KHRoaXMpOworICAgICAgICB9CisgICAgICAgIGlmIChlbnYgIT0gTlVMTCAmJiBjbGF6eiAhPSBOVUxMKSB7CisgICAgICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihjbGF6eik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBvbGxMb29wICE9IE5VTEwgJiYgbWFpbldvcmtSZWFkID49IDApIHsKICAgICAgICAgICAgIHBvbGxMb29wLT5yZW1vdmVDYWxsYmFjayhtYWluV29ya1JlYWQpOwpAQCAtOTgsNDAgKzMwMiwzNyBAQAogICAgICAgICB9CiAgICAgICAgIHNldFN1cmZhY2UoTlVMTCk7CiAgICAgICAgIHNldElucHV0Q2hhbm5lbChOVUxMKTsKLSAgICAgICAgaWYgKGNhbGxiYWNrcy5vbkRlc3Ryb3kgIT0gTlVMTCkgewotICAgICAgICAgICAgY2FsbGJhY2tzLm9uRGVzdHJveSgmYWN0aXZpdHkpOwotICAgICAgICB9CiAgICAgICAgIGlmIChtYWluV29ya1JlYWQgPj0gMCkgY2xvc2UobWFpbldvcmtSZWFkKTsKICAgICAgICAgaWYgKG1haW5Xb3JrV3JpdGUgPj0gMCkgY2xvc2UobWFpbldvcmtXcml0ZSk7CiAgICAgICAgIGlmIChkbGhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkbGNsb3NlKGRsaGFuZGxlKTsKKyAgICAgICAgICAgIC8vIGZvciBub3cgZG9uJ3QgdW5sb2FkLi4uICB3ZSBwcm9iYWJseSBzaG91bGQgY2xlYW4gdGhpcworICAgICAgICAgICAgLy8gdXAgYW5kIG9ubHkga2VlcCBvbmUgb3BlbiBkbGhhbmRsZSBwZXIgcHJvYywgc2luY2UgdGhlcmUKKyAgICAgICAgICAgIC8vIGlzIHJlYWxseSBubyBiZW5lZml0IHRvIHVubG9hZGluZyB0aGUgY29kZS4KKyAgICAgICAgICAgIC8vZGxjbG9zZShkbGhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgdm9pZCBzZXRTdXJmYWNlKGpvYmplY3QgX3N1cmZhY2UpIHsKLSAgICAgICAgaWYgKHN1cmZhY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgYWN0aXZpdHkuZW52LT5EZWxldGVHbG9iYWxSZWYoc3VyZmFjZSk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKF9zdXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHN1cmZhY2UgPSBhY3Rpdml0eS5lbnYtPk5ld0dsb2JhbFJlZihfc3VyZmFjZSk7CisgICAgICAgICAgICBuYXRpdmVXaW5kb3cgPSBhbmRyb2lkX1N1cmZhY2VfZ2V0TmF0aXZlV2luZG93KGVudiwgX3N1cmZhY2UpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VyZmFjZSA9IE5VTEw7CisgICAgICAgICAgICBuYXRpdmVXaW5kb3cgPSBOVUxMOwogICAgICAgICB9CiAgICAgfQogICAgIAogICAgIHN0YXR1c190IHNldElucHV0Q2hhbm5lbChqb2JqZWN0IF9jaGFubmVsKSB7CiAgICAgICAgIGlmIChpbnB1dENoYW5uZWwgIT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlIG5hdGl2ZUlucHV0UXVldWU7Ci0gICAgICAgICAgICBhY3Rpdml0eS5lbnYtPkRlbGV0ZUdsb2JhbFJlZihpbnB1dENoYW5uZWwpOworICAgICAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYoaW5wdXRDaGFubmVsKTsKICAgICAgICAgfQogICAgICAgICBpbnB1dENoYW5uZWwgPSBOVUxMOwogICAgICAgICBuYXRpdmVJbnB1dFF1ZXVlID0gTlVMTDsKICAgICAgICAgaWYgKF9jaGFubmVsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlucHV0Q2hhbm5lbCA9IGFjdGl2aXR5LmVudi0+TmV3R2xvYmFsUmVmKF9jaGFubmVsKTsKKyAgICAgICAgICAgIGlucHV0Q2hhbm5lbCA9IGVudi0+TmV3R2xvYmFsUmVmKF9jaGFubmVsKTsKICAgICAgICAgICAgIHNwPElucHV0Q2hhbm5lbD4gaWMgPQotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3ZpZXdfSW5wdXRDaGFubmVsX2dldElucHV0Q2hhbm5lbChhY3Rpdml0eS5lbnYsIF9jaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF92aWV3X0lucHV0Q2hhbm5lbF9nZXRJbnB1dENoYW5uZWwoZW52LCBfY2hhbm5lbCk7CiAgICAgICAgICAgICBpZiAoaWMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG5hdGl2ZUlucHV0UXVldWUgPSBuZXcgTXlJbnB1dFF1ZXVlKGljLCBtYWluV29ya1dyaXRlKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVJbnB1dFF1ZXVlID0gbmV3IEFJbnB1dFF1ZXVlKGljLCBtYWluV29ya1dyaXRlKTsKICAgICAgICAgICAgICAgICBpZiAobmF0aXZlSW5wdXRRdWV1ZS0+Z2V0Q29uc3VtZXIoKS5pbml0aWFsaXplKCkgIT0gYW5kcm9pZDo6T0spIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5hdGl2ZUlucHV0UXVldWU7CiAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUlucHV0UXVldWUgPSBOVUxMOwpAQCAtMTQ0LDE1ICszNDUsMjAgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KICAgICAKLSAgICBBTmF0aXZlQWN0aXZpdHkgYWN0aXZpdHk7CiAgICAgQU5hdGl2ZUFjdGl2aXR5Q2FsbGJhY2tzIGNhbGxiYWNrczsKICAgICAKICAgICB2b2lkKiBkbGhhbmRsZTsKICAgICBBTmF0aXZlQWN0aXZpdHlfY3JlYXRlRnVuYyogY3JlYXRlQWN0aXZpdHlGdW5jOwogICAgIAotICAgIGpvYmplY3Qgc3VyZmFjZTsKKyAgICBTdHJpbmc4IGludGVybmFsRGF0YVBhdGg7CisgICAgU3RyaW5nOCBleHRlcm5hbERhdGFQYXRoOworICAgIAorICAgIHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdzsKKyAgICBpbnQzMl90IGxhc3RXaW5kb3dXaWR0aDsKKyAgICBpbnQzMl90IGxhc3RXaW5kb3dIZWlnaHQ7CisKICAgICBqb2JqZWN0IGlucHV0Q2hhbm5lbDsKLSAgICBzdHJ1Y3QgTXlJbnB1dFF1ZXVlKiBuYXRpdmVJbnB1dFF1ZXVlOworICAgIHN0cnVjdCBBSW5wdXRRdWV1ZSogbmF0aXZlSW5wdXRRdWV1ZTsKICAgICAKICAgICAvLyBUaGVzZSBhcmUgdXNlZCB0byB3YWtlIHVwIHRoZSBtYWluIHRocmVhZCB0byBwcm9jZXNzIHdvcmsuCiAgICAgaW50IG1haW5Xb3JrUmVhZDsKQEAgLTE2MCwyOSArMzY2LDk1IEBACiAgICAgc3A8UG9sbExvb3A+IHBvbGxMb29wOwogfTsKIAordm9pZCBhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X3NldFdpbmRvd0Zvcm1hdCgKKyAgICAgICAgQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgaW50MzJfdCBmb3JtYXQpIHsKKyAgICBOYXRpdmVDb2RlKiBjb2RlID0gc3RhdGljX2Nhc3Q8TmF0aXZlQ29kZSo+KGFjdGl2aXR5KTsKKyAgICB3cml0ZV93b3JrKGNvZGUtPm1haW5Xb3JrV3JpdGUsIENNRF9TRVRfV0lORE9XX0ZPUk1BVCwgZm9ybWF0KTsKK30KKwordm9pZCBhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X3NldFdpbmRvd0ZsYWdzKAorICAgICAgICBBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBpbnQzMl90IHZhbHVlcywgaW50MzJfdCBtYXNrKSB7CisgICAgTmF0aXZlQ29kZSogY29kZSA9IHN0YXRpY19jYXN0PE5hdGl2ZUNvZGUqPihhY3Rpdml0eSk7CisgICAgd3JpdGVfd29yayhjb2RlLT5tYWluV29ya1dyaXRlLCBDTURfU0VUX1dJTkRPV19GTEFHUywgdmFsdWVzLCBtYXNrKTsKK30KKwordm9pZCBhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X3Nob3dTb2Z0SW5wdXQoCisgICAgICAgIEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGludDMyX3QgZmxhZ3MpIHsKKyAgICBOYXRpdmVDb2RlKiBjb2RlID0gc3RhdGljX2Nhc3Q8TmF0aXZlQ29kZSo+KGFjdGl2aXR5KTsKKyAgICB3cml0ZV93b3JrKGNvZGUtPm1haW5Xb3JrV3JpdGUsIENNRF9TSE9XX1NPRlRfSU5QVVQsIGZsYWdzKTsKK30KKwordm9pZCBhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X2hpZGVTb2Z0SW5wdXQoCisgICAgICAgIEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGludDMyX3QgZmxhZ3MpIHsKKyAgICBOYXRpdmVDb2RlKiBjb2RlID0gc3RhdGljX2Nhc3Q8TmF0aXZlQ29kZSo+KGFjdGl2aXR5KTsKKyAgICB3cml0ZV93b3JrKGNvZGUtPm1haW5Xb3JrV3JpdGUsIENNRF9ISURFX1NPRlRfSU5QVVQsIGZsYWdzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgKiBDYWxsYmFjayBmb3IgaGFuZGxpbmcgbmF0aXZlIGV2ZW50cyBvbiB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4KKyAqLwogc3RhdGljIGJvb2wgbWFpbldvcmtDYWxsYmFjayhpbnQgZmQsIGludCBldmVudHMsIHZvaWQqIGRhdGEpIHsKICAgICBOYXRpdmVDb2RlKiBjb2RlID0gKE5hdGl2ZUNvZGUqKWRhdGE7Ci0gICAgaWYgKChldmVudHMgJiBQT0xMSU4pICE9IDApIHsKLSAgICAgICAgS2V5RXZlbnQqIGtleUV2ZW50OwotICAgICAgICB3aGlsZSAoKGtleUV2ZW50PWNvZGUtPm5hdGl2ZUlucHV0UXVldWUtPmdldE5leHRFdmVudCgpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBqb2JqZWN0IGlucHV0RXZlbnRPYmogPSBhbmRyb2lkX3ZpZXdfS2V5RXZlbnRfZnJvbU5hdGl2ZSgKLSAgICAgICAgICAgICAgICAgICAgY29kZS0+YWN0aXZpdHkuZW52LCBrZXlFdmVudCk7Ci0gICAgICAgICAgICBjb2RlLT5hY3Rpdml0eS5lbnYtPkNhbGxWb2lkTWV0aG9kKGNvZGUtPmFjdGl2aXR5LmNsYXp6LAotICAgICAgICAgICAgICAgICAgICBnTmF0aXZlQWN0aXZpdHlDbGFzc0luZm8uZGlzcGF0Y2hVbmhhbmRsZWRLZXlFdmVudCwgaW5wdXRFdmVudE9iaik7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcyA9IGNvZGUtPm5hdGl2ZUlucHV0UXVldWUtPmdldENvbnN1bWVyKCkuc2VuZEZpbmlzaGVkU2lnbmFsKCk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgTE9HVygiRmFpbGVkIHRvIHNlbmQgZmluaXNoZWQgc2lnbmFsIG9uIGNoYW5uZWwgJyVzJy4gIHN0YXR1cz0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlLT5uYXRpdmVJbnB1dFF1ZXVlLT5nZXRDb25zdW1lcigpLmdldENoYW5uZWwoKS0+Z2V0TmFtZSgpLnN0cmluZygpLCByZXMpOworICAgIGlmICgoZXZlbnRzICYgUE9MTElOKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBBY3Rpdml0eVdvcmsgd29yazsKKyAgICBpZiAoIXJlYWRfd29yayhjb2RlLT5tYWluV29ya1JlYWQsICZ3b3JrKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBMT0dfVFJBQ0UoIm1haW5Xb3JrQ2FsbGJhY2s6IGNtZD0lZCIsIHdvcmsuY21kKTsKKworICAgIHN3aXRjaCAod29yay5jbWQpIHsKKyAgICAgICAgY2FzZSBDTURfREVGX0tFWTogeworICAgICAgICAgICAgS2V5RXZlbnQqIGtleUV2ZW50OworICAgICAgICAgICAgd2hpbGUgKChrZXlFdmVudD1jb2RlLT5uYXRpdmVJbnB1dFF1ZXVlLT5jb25zdW1lVW5oYW5kbGVkRXZlbnQoKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGpvYmplY3QgaW5wdXRFdmVudE9iaiA9IGFuZHJvaWRfdmlld19LZXlFdmVudF9mcm9tTmF0aXZlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZS0+ZW52LCBrZXlFdmVudCk7CisgICAgICAgICAgICAgICAgY29kZS0+ZW52LT5DYWxsVm9pZE1ldGhvZChjb2RlLT5jbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdOYXRpdmVBY3Rpdml0eUNsYXNzSW5mby5kaXNwYXRjaFVuaGFuZGxlZEtleUV2ZW50LCBpbnB1dEV2ZW50T2JqKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlcyA9IGNvZGUtPm5hdGl2ZUlucHV0UXVldWUtPmdldENvbnN1bWVyKCkuc2VuZEZpbmlzaGVkU2lnbmFsKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBMT0dXKCJGYWlsZWQgdG8gc2VuZCBmaW5pc2hlZCBzaWduYWwgb24gY2hhbm5lbCAnJXMnLiAgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLT5uYXRpdmVJbnB1dFF1ZXVlLT5nZXRDb25zdW1lcigpLmdldENoYW5uZWwoKS0+Z2V0TmFtZSgpLnN0cmluZygpLCByZXMpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENNRF9TRVRfV0lORE9XX0ZPUk1BVDogeworICAgICAgICAgICAgY29kZS0+ZW52LT5DYWxsVm9pZE1ldGhvZChjb2RlLT5jbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgZ05hdGl2ZUFjdGl2aXR5Q2xhc3NJbmZvLnNldFdpbmRvd0Zvcm1hdCwgd29yay5hcmcxKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDTURfU0VUX1dJTkRPV19GTEFHUzogeworICAgICAgICAgICAgY29kZS0+ZW52LT5DYWxsVm9pZE1ldGhvZChjb2RlLT5jbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgZ05hdGl2ZUFjdGl2aXR5Q2xhc3NJbmZvLnNldFdpbmRvd0ZsYWdzLCB3b3JrLmFyZzEsIHdvcmsuYXJnMik7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ01EX1NIT1dfU09GVF9JTlBVVDogeworICAgICAgICAgICAgY29kZS0+ZW52LT5DYWxsVm9pZE1ldGhvZChjb2RlLT5jbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgZ05hdGl2ZUFjdGl2aXR5Q2xhc3NJbmZvLnNob3dJbWUsIHdvcmsuYXJnMSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ01EX0hJREVfU09GVF9JTlBVVDogeworICAgICAgICAgICAgY29kZS0+ZW52LT5DYWxsVm9pZE1ldGhvZChjb2RlLT5jbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgZ05hdGl2ZUFjdGl2aXR5Q2xhc3NJbmZvLmhpZGVJbWUsIHdvcmsuYXJnMSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dXKCJVbmtub3duIHdvcmsgY29tbWFuZDogJWQiLCB3b3JrLmNtZCk7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAgICAgCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBzdGF0aWMgamludAotbG9hZE5hdGl2ZUNvZGVfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqc3RyaW5nIHBhdGgsIGpvYmplY3QgbWVzc2FnZVF1ZXVlKQorbG9hZE5hdGl2ZUNvZGVfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqc3RyaW5nIHBhdGgsIGpvYmplY3QgbWVzc2FnZVF1ZXVlLAorICAgICAgICBqc3RyaW5nIGludGVybmFsRGF0YURpciwganN0cmluZyBleHRlcm5hbERhdGFEaXIsIGludCBzZGtWZXJzaW9uKQogeworICAgIExPR19UUkFDRSgibG9hZE5hdGl2ZUNvZGVfbmF0aXZlIik7CisKICAgICBjb25zdCBjaGFyKiBwYXRoU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKICAgICBOYXRpdmVDb2RlKiBjb2RlID0gTlVMTDsKICAgICAKQEAgLTIxNCwxNyArNDg2LDM2IEBACiAgICAgICAgIH0KICAgICAgICAgY29kZS0+bWFpbldvcmtSZWFkID0gbXNncGlwZVswXTsKICAgICAgICAgY29kZS0+bWFpbldvcmtXcml0ZSA9IG1zZ3BpcGVbMV07CisgICAgICAgIGludCByZXN1bHQgPSBmY250bChjb2RlLT5tYWluV29ya1JlYWQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOworICAgICAgICBTTE9HV19JRihyZXN1bHQgIT0gMCwgIkNvdWxkIG5vdCBtYWtlIG1haW4gd29yayByZWFkIHBpcGUgIgorICAgICAgICAgICAgICAgICJub24tYmxvY2tpbmc6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmVzdWx0ID0gZmNudGwoY29kZS0+bWFpbldvcmtXcml0ZSwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisgICAgICAgIFNMT0dXX0lGKHJlc3VsdCAhPSAwLCAiQ291bGQgbm90IG1ha2UgbWFpbiB3b3JrIHdyaXRlIHBpcGUgIgorICAgICAgICAgICAgICAgICJub24tYmxvY2tpbmc6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgY29kZS0+cG9sbExvb3AtPnNldENhbGxiYWNrKGNvZGUtPm1haW5Xb3JrUmVhZCwgUE9MTElOLCBtYWluV29ya0NhbGxiYWNrLCBjb2RlKTsKICAgICAgICAgCi0gICAgICAgIGNvZGUtPmFjdGl2aXR5LmNhbGxiYWNrcyA9ICZjb2RlLT5jYWxsYmFja3M7Ci0gICAgICAgIGlmIChlbnYtPkdldEphdmFWTSgmY29kZS0+YWN0aXZpdHkudm0pIDwgMCkgeworICAgICAgICBjb2RlLT5BTmF0aXZlQWN0aXZpdHk6OmNhbGxiYWNrcyA9ICZjb2RlLT5jYWxsYmFja3M7CisgICAgICAgIGlmIChlbnYtPkdldEphdmFWTSgmY29kZS0+dm0pIDwgMCkgewogICAgICAgICAgICAgTE9HVygiTmF0aXZlQWN0aXZpdHkgR2V0SmF2YVZNIGZhaWxlZCIpOwogICAgICAgICAgICAgZGVsZXRlIGNvZGU7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBjb2RlLT5hY3Rpdml0eS5lbnYgPSBlbnY7Ci0gICAgICAgIGNvZGUtPmFjdGl2aXR5LmNsYXp6ID0gZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOwotICAgICAgICBjb2RlLT5jcmVhdGVBY3Rpdml0eUZ1bmMoJmNvZGUtPmFjdGl2aXR5LCBOVUxMLCAwKTsKKyAgICAgICAgY29kZS0+ZW52ID0gZW52OworICAgICAgICBjb2RlLT5jbGF6eiA9IGVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGNoYXIqIGRpclN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoaW50ZXJuYWxEYXRhRGlyLCBOVUxMKTsKKyAgICAgICAgY29kZS0+aW50ZXJuYWxEYXRhUGF0aCA9IGRpclN0cjsKKyAgICAgICAgY29kZS0+aW50ZXJuYWxEYXRhUGF0aCA9IGNvZGUtPmludGVybmFsRGF0YVBhdGguc3RyaW5nKCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGRpclN0cik7CisgICAgCisgICAgICAgIGRpclN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZXh0ZXJuYWxEYXRhRGlyLCBOVUxMKTsKKyAgICAgICAgY29kZS0+ZXh0ZXJuYWxEYXRhUGF0aCA9IGRpclN0cjsKKyAgICAgICAgY29kZS0+ZXh0ZXJuYWxEYXRhUGF0aCA9IGNvZGUtPmV4dGVybmFsRGF0YVBhdGguc3RyaW5nKCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGRpclN0cik7CisgICAgCisgICAgICAgIGNvZGUtPnNka1ZlcnNpb24gPSBzZGtWZXJzaW9uOworICAgICAgICAKKyAgICAgICAgY29kZS0+Y3JlYXRlQWN0aXZpdHlGdW5jKGNvZGUsIE5VTEwsIDApOwogICAgIH0KICAgICAKICAgICByZXR1cm4gKGppbnQpY29kZTsKQEAgLTIzMyw2ICs1MjQsNyBAQAogc3RhdGljIHZvaWQKIHVubG9hZE5hdGl2ZUNvZGVfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IGhhbmRsZSkKIHsKKyAgICBMT0dfVFJBQ0UoInVubG9hZE5hdGl2ZUNvZGVfbmF0aXZlIik7CiAgICAgaWYgKGhhbmRsZSAhPSAwKSB7CiAgICAgICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSAoTmF0aXZlQ29kZSopaGFuZGxlOwogICAgICAgICBkZWxldGUgY29kZTsKQEAgLTI0MiwxMCArNTM0LDExIEBACiBzdGF0aWMgdm9pZAogb25TdGFydF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlKQogeworICAgIExPR19UUkFDRSgib25TdGFydF9uYXRpdmUiKTsKICAgICBpZiAoaGFuZGxlICE9IDApIHsKICAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CiAgICAgICAgIGlmIChjb2RlLT5jYWxsYmFja3Mub25TdGFydCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25TdGFydCgmY29kZS0+YWN0aXZpdHkpOworICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uU3RhcnQoY29kZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yNTMsMTAgKzU0NiwxMSBAQAogc3RhdGljIHZvaWQKIG9uUmVzdW1lX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBoYW5kbGUpCiB7CisgICAgTE9HX1RSQUNFKCJvblJlc3VtZV9uYXRpdmUiKTsKICAgICBpZiAoaGFuZGxlICE9IDApIHsKICAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CiAgICAgICAgIGlmIChjb2RlLT5jYWxsYmFja3Mub25SZXN1bWUgIT0gTlVMTCkgewotICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uUmVzdW1lKCZjb2RlLT5hY3Rpdml0eSk7CisgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25SZXN1bWUoY29kZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yNjQsMTEgKzU1OCwxMiBAQAogc3RhdGljIHZvaWQKIG9uU2F2ZUluc3RhbmNlU3RhdGVfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IGhhbmRsZSkKIHsKKyAgICBMT0dfVFJBQ0UoIm9uU2F2ZUluc3RhbmNlU3RhdGVfbmF0aXZlIik7CiAgICAgaWYgKGhhbmRsZSAhPSAwKSB7CiAgICAgICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSAoTmF0aXZlQ29kZSopaGFuZGxlOwogICAgICAgICBpZiAoY29kZS0+Y2FsbGJhY2tzLm9uU2F2ZUluc3RhbmNlU3RhdGUgIT0gTlVMTCkgewogICAgICAgICAgICAgc2l6ZV90IGxlbiA9IDA7Ci0gICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25TYXZlSW5zdGFuY2VTdGF0ZSgmY29kZS0+YWN0aXZpdHksICZsZW4pOworICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uU2F2ZUluc3RhbmNlU3RhdGUoY29kZSwgJmxlbik7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yNzYsMTAgKzU3MSwxMSBAQAogc3RhdGljIHZvaWQKIG9uUGF1c2VfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IGhhbmRsZSkKIHsKKyAgICBMT0dfVFJBQ0UoIm9uUGF1c2VfbmF0aXZlIik7CiAgICAgaWYgKGhhbmRsZSAhPSAwKSB7CiAgICAgICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSAoTmF0aXZlQ29kZSopaGFuZGxlOwogICAgICAgICBpZiAoY29kZS0+Y2FsbGJhY2tzLm9uUGF1c2UgIT0gTlVMTCkgewotICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uUGF1c2UoJmNvZGUtPmFjdGl2aXR5KTsKKyAgICAgICAgICAgIGNvZGUtPmNhbGxiYWNrcy5vblBhdXNlKGNvZGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjg3LDEwICs1ODMsMTEgQEAKIHN0YXRpYyB2b2lkCiBvblN0b3BfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IGhhbmRsZSkKIHsKKyAgICBMT0dfVFJBQ0UoIm9uU3RvcF9uYXRpdmUiKTsKICAgICBpZiAoaGFuZGxlICE9IDApIHsKICAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CiAgICAgICAgIGlmIChjb2RlLT5jYWxsYmFja3Mub25TdG9wICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNvZGUtPmNhbGxiYWNrcy5vblN0b3AoJmNvZGUtPmFjdGl2aXR5KTsKKyAgICAgICAgICAgIGNvZGUtPmNhbGxiYWNrcy5vblN0b3AoY29kZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yOTgsMTAgKzU5NSwxMSBAQAogc3RhdGljIHZvaWQKIG9uTG93TWVtb3J5X25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBoYW5kbGUpCiB7CisgICAgTE9HX1RSQUNFKCJvbkxvd01lbW9yeV9uYXRpdmUiKTsKICAgICBpZiAoaGFuZGxlICE9IDApIHsKICAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CiAgICAgICAgIGlmIChjb2RlLT5jYWxsYmFja3Mub25Mb3dNZW1vcnkgIT0gTlVMTCkgewotICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uTG93TWVtb3J5KCZjb2RlLT5hY3Rpdml0eSk7CisgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25Mb3dNZW1vcnkoY29kZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0zMDksMTAgKzYwNywxMSBAQAogc3RhdGljIHZvaWQKIG9uV2luZG93Rm9jdXNDaGFuZ2VkX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBoYW5kbGUsIGpib29sZWFuIGZvY3VzZWQpCiB7CisgICAgTE9HX1RSQUNFKCJvbldpbmRvd0ZvY3VzQ2hhbmdlZF9uYXRpdmUiKTsKICAgICBpZiAoaGFuZGxlICE9IDApIHsKICAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CiAgICAgICAgIGlmIChjb2RlLT5jYWxsYmFja3Mub25XaW5kb3dGb2N1c0NoYW5nZWQgIT0gTlVMTCkgewotICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uV2luZG93Rm9jdXNDaGFuZ2VkKCZjb2RlLT5hY3Rpdml0eSwgZm9jdXNlZCA/IDEgOiAwKTsKKyAgICAgICAgICAgIGNvZGUtPmNhbGxiYWNrcy5vbldpbmRvd0ZvY3VzQ2hhbmdlZChjb2RlLCBmb2N1c2VkID8gMSA6IDApOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzIwLDI1ICs2MTksNzIgQEAKIHN0YXRpYyB2b2lkCiBvblN1cmZhY2VDcmVhdGVkX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBoYW5kbGUsIGpvYmplY3Qgc3VyZmFjZSkKIHsKKyAgICBMT0dfVFJBQ0UoIm9uU3VyZmFjZUNyZWF0ZWRfbmF0aXZlIik7CiAgICAgaWYgKGhhbmRsZSAhPSAwKSB7CiAgICAgICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSAoTmF0aXZlQ29kZSopaGFuZGxlOwogICAgICAgICBjb2RlLT5zZXRTdXJmYWNlKHN1cmZhY2UpOwotICAgICAgICBpZiAoY29kZS0+Y2FsbGJhY2tzLm9uU3VyZmFjZUNyZWF0ZWQgIT0gTlVMTCkgewotICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uU3VyZmFjZUNyZWF0ZWQoJmNvZGUtPmFjdGl2aXR5LAotICAgICAgICAgICAgICAgICAgICAoQVN1cmZhY2VIb2xkZXIqKWNvZGUtPnN1cmZhY2UpOworICAgICAgICBpZiAoY29kZS0+bmF0aXZlV2luZG93ICE9IE5VTEwgJiYgY29kZS0+Y2FsbGJhY2tzLm9uTmF0aXZlV2luZG93Q3JlYXRlZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25OYXRpdmVXaW5kb3dDcmVhdGVkKGNvZGUsCisgICAgICAgICAgICAgICAgICAgIGNvZGUtPm5hdGl2ZVdpbmRvdy5nZXQoKSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKK3N0YXRpYyBpbnQzMl90IGdldFdpbmRvd1Byb3AoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBpbnQgd2hhdCkgeworICAgIGludCB2YWx1ZTsKKyAgICBpbnQgcmVzID0gd2luZG93LT5xdWVyeSh3aW5kb3csIHdoYXQsICZ2YWx1ZSk7CisgICAgcmV0dXJuIHJlcyA8IDAgPyByZXMgOiB2YWx1ZTsKK30KKwogc3RhdGljIHZvaWQKIG9uU3VyZmFjZUNoYW5nZWRfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IGhhbmRsZSwgam9iamVjdCBzdXJmYWNlLAogICAgICAgICBqaW50IGZvcm1hdCwgamludCB3aWR0aCwgamludCBoZWlnaHQpCiB7CisgICAgTE9HX1RSQUNFKCJvblN1cmZhY2VDaGFuZ2VkX25hdGl2ZSIpOwogICAgIGlmIChoYW5kbGUgIT0gMCkgewogICAgICAgICBOYXRpdmVDb2RlKiBjb2RlID0gKE5hdGl2ZUNvZGUqKWhhbmRsZTsKLSAgICAgICAgaWYgKGNvZGUtPnN1cmZhY2UgIT0gTlVMTCAmJiBjb2RlLT5jYWxsYmFja3Mub25TdXJmYWNlQ2hhbmdlZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25TdXJmYWNlQ2hhbmdlZCgmY29kZS0+YWN0aXZpdHksCi0gICAgICAgICAgICAgICAgICAgIChBU3VyZmFjZUhvbGRlciopY29kZS0+c3VyZmFjZSwgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gb2xkTmF0aXZlV2luZG93ID0gY29kZS0+bmF0aXZlV2luZG93OworICAgICAgICBjb2RlLT5zZXRTdXJmYWNlKHN1cmZhY2UpOworICAgICAgICBpZiAob2xkTmF0aXZlV2luZG93ICE9IGNvZGUtPm5hdGl2ZVdpbmRvdykgeworICAgICAgICAgICAgaWYgKG9sZE5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIGNvZGUtPmNhbGxiYWNrcy5vbk5hdGl2ZVdpbmRvd0Rlc3Ryb3llZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uTmF0aXZlV2luZG93RGVzdHJveWVkKGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBvbGROYXRpdmVXaW5kb3cuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvZGUtPm5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvZGUtPmNhbGxiYWNrcy5vbk5hdGl2ZVdpbmRvd0NyZWF0ZWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25OYXRpdmVXaW5kb3dDcmVhdGVkKGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZS0+bmF0aXZlV2luZG93LmdldCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29kZS0+bGFzdFdpbmRvd1dpZHRoID0gZ2V0V2luZG93UHJvcChjb2RlLT5uYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1dJRFRIKTsKKyAgICAgICAgICAgICAgICBjb2RlLT5sYXN0V2luZG93SGVpZ2h0ID0gZ2V0V2luZG93UHJvcChjb2RlLT5uYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0hFSUdIVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBNYXliZSBpdCByZXNpemVkPworICAgICAgICAgICAgaW50MzJfdCBuZXdXaWR0aCA9IGdldFdpbmRvd1Byb3AoY29kZS0+bmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1dJRFRIKTsKKyAgICAgICAgICAgIGludDMyX3QgbmV3SGVpZ2h0ID0gZ2V0V2luZG93UHJvcChjb2RlLT5uYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfSEVJR0hUKTsKKyAgICAgICAgICAgIGlmIChuZXdXaWR0aCAhPSBjb2RlLT5sYXN0V2luZG93V2lkdGgKKyAgICAgICAgICAgICAgICAgICAgfHwgbmV3SGVpZ2h0ICE9IGNvZGUtPmxhc3RXaW5kb3dIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29kZS0+Y2FsbGJhY2tzLm9uTmF0aXZlV2luZG93UmVzaXplZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUtPmNhbGxiYWNrcy5vbk5hdGl2ZVdpbmRvd1Jlc2l6ZWQoY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLT5uYXRpdmVXaW5kb3cuZ2V0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK29uU3VyZmFjZVJlZHJhd05lZWRlZF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlKQoreworICAgIExPR19UUkFDRSgib25TdXJmYWNlUmVkcmF3TmVlZGVkX25hdGl2ZSIpOworICAgIGlmIChoYW5kbGUgIT0gMCkgeworICAgICAgICBOYXRpdmVDb2RlKiBjb2RlID0gKE5hdGl2ZUNvZGUqKWhhbmRsZTsKKyAgICAgICAgaWYgKGNvZGUtPm5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIGNvZGUtPmNhbGxiYWNrcy5vbk5hdGl2ZVdpbmRvd1JlZHJhd05lZWRlZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25OYXRpdmVXaW5kb3dSZWRyYXdOZWVkZWQoY29kZSwgY29kZS0+bmF0aXZlV2luZG93LmdldCgpKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTM0NiwxMSArNjkyLDEyIEBACiBzdGF0aWMgdm9pZAogb25TdXJmYWNlRGVzdHJveWVkX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBoYW5kbGUsIGpvYmplY3Qgc3VyZmFjZSkKIHsKKyAgICBMT0dfVFJBQ0UoIm9uU3VyZmFjZURlc3Ryb3llZF9uYXRpdmUiKTsKICAgICBpZiAoaGFuZGxlICE9IDApIHsKICAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7Ci0gICAgICAgIGlmIChjb2RlLT5zdXJmYWNlICE9IE5VTEwgJiYgY29kZS0+Y2FsbGJhY2tzLm9uU3VyZmFjZURlc3Ryb3llZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25TdXJmYWNlRGVzdHJveWVkKCZjb2RlLT5hY3Rpdml0eSwKLSAgICAgICAgICAgICAgICAgICAgKEFTdXJmYWNlSG9sZGVyKiljb2RlLT5zdXJmYWNlKTsKKyAgICAgICAgaWYgKGNvZGUtPm5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIGNvZGUtPmNhbGxiYWNrcy5vbk5hdGl2ZVdpbmRvd0Rlc3Ryb3llZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25OYXRpdmVXaW5kb3dEZXN0cm95ZWQoY29kZSwKKyAgICAgICAgICAgICAgICAgICAgY29kZS0+bmF0aXZlV2luZG93LmdldCgpKTsKICAgICAgICAgfQogICAgICAgICBjb2RlLT5zZXRTdXJmYWNlKE5VTEwpOwogICAgIH0KQEAgLTM1OSw2ICs3MDYsNyBAQAogc3RhdGljIHZvaWQKIG9uSW5wdXRDaGFubmVsQ3JlYXRlZF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlLCBqb2JqZWN0IGNoYW5uZWwpCiB7CisgICAgTE9HX1RSQUNFKCJvbklucHV0Q2hhbm5lbENyZWF0ZWRfbmF0aXZlIik7CiAgICAgaWYgKGhhbmRsZSAhPSAwKSB7CiAgICAgICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSAoTmF0aXZlQ29kZSopaGFuZGxlOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlLT5zZXRJbnB1dENoYW5uZWwoY2hhbm5lbCk7CkBAIC0zNjgsNyArNzE2LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAoY29kZS0+Y2FsbGJhY2tzLm9uSW5wdXRRdWV1ZUNyZWF0ZWQgIT0gTlVMTCkgewotICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uSW5wdXRRdWV1ZUNyZWF0ZWQoJmNvZGUtPmFjdGl2aXR5LAorICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uSW5wdXRRdWV1ZUNyZWF0ZWQoY29kZSwKICAgICAgICAgICAgICAgICAgICAgY29kZS0+bmF0aXZlSW5wdXRRdWV1ZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNzcsMTkgKzcyNSw1MyBAQAogc3RhdGljIHZvaWQKIG9uSW5wdXRDaGFubmVsRGVzdHJveWVkX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBoYW5kbGUsIGpvYmplY3QgY2hhbm5lbCkKIHsKKyAgICBMT0dfVFJBQ0UoIm9uSW5wdXRDaGFubmVsRGVzdHJveWVkX25hdGl2ZSIpOwogICAgIGlmIChoYW5kbGUgIT0gMCkgewogICAgICAgICBOYXRpdmVDb2RlKiBjb2RlID0gKE5hdGl2ZUNvZGUqKWhhbmRsZTsKICAgICAgICAgaWYgKGNvZGUtPm5hdGl2ZUlucHV0UXVldWUgIT0gTlVMTAogICAgICAgICAgICAgICAgICYmIGNvZGUtPmNhbGxiYWNrcy5vbklucHV0UXVldWVEZXN0cm95ZWQgIT0gTlVMTCkgewotICAgICAgICAgICAgY29kZS0+Y2FsbGJhY2tzLm9uSW5wdXRRdWV1ZURlc3Ryb3llZCgmY29kZS0+YWN0aXZpdHksCisgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25JbnB1dFF1ZXVlRGVzdHJveWVkKGNvZGUsCiAgICAgICAgICAgICAgICAgICAgIGNvZGUtPm5hdGl2ZUlucHV0UXVldWUpOwogICAgICAgICB9CiAgICAgICAgIGNvZGUtPnNldElucHV0Q2hhbm5lbChOVUxMKTsKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkCitvbkNvbnRlbnRSZWN0Q2hhbmdlZF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlLAorICAgICAgICBqaW50IHgsIGppbnQgeSwgamludCB3LCBqaW50IGgpCit7CisgICAgTE9HX1RSQUNFKCJvbkNvbnRlbnRSZWN0Q2hhbmdlZF9uYXRpdmUiKTsKKyAgICBpZiAoaGFuZGxlICE9IDApIHsKKyAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CisgICAgICAgIGlmIChjb2RlLT5jYWxsYmFja3Mub25Db250ZW50UmVjdENoYW5nZWQgIT0gTlVMTCkgeworICAgICAgICAgICAgQVJlY3QgcmVjdDsKKyAgICAgICAgICAgIHJlY3QubGVmdCA9IHg7CisgICAgICAgICAgICByZWN0LnRvcCA9IHk7CisgICAgICAgICAgICByZWN0LnJpZ2h0ID0geCt3OworICAgICAgICAgICAgcmVjdC5ib3R0b20gPSB5K2g7CisgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25Db250ZW50UmVjdENoYW5nZWQoY29kZSwgJnJlY3QpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGlzcGF0Y2hLZXlFdmVudF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlLCBqb2JqZWN0IGV2ZW50T2JqKQoreworICAgIExPR19UUkFDRSgiZGlzcGF0Y2hLZXlFdmVudF9uYXRpdmUiKTsKKyAgICBpZiAoaGFuZGxlICE9IDApIHsKKyAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CisgICAgICAgIGlmIChjb2RlLT5uYXRpdmVJbnB1dFF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEtleUV2ZW50KiBldmVudCA9IG5ldyBLZXlFdmVudCgpOworICAgICAgICAgICAgYW5kcm9pZF92aWV3X0tleUV2ZW50X3RvTmF0aXZlKGVudiwgZXZlbnRPYmosIElOUFVUX0VWRU5UX05BVFVSRV9LRVksIGV2ZW50KTsKKyAgICAgICAgICAgIGNvZGUtPm5hdGl2ZUlucHV0UXVldWUtPmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgfQorfQorCiBzdGF0aWMgY29uc3QgSk5JTmF0aXZlTWV0aG9kIGdfbWV0aG9kc1tdID0gewotICAgIHsgImxvYWROYXRpdmVDb2RlIiwgIihMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9vcy9NZXNzYWdlUXVldWU7KUkiLCAodm9pZCopbG9hZE5hdGl2ZUNvZGVfbmF0aXZlIH0sCisgICAgeyAibG9hZE5hdGl2ZUNvZGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL29zL01lc3NhZ2VRdWV1ZTtMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztJKUkiLAorICAgICAgICAgICAgKHZvaWQqKWxvYWROYXRpdmVDb2RlX25hdGl2ZSB9LAogICAgIHsgInVubG9hZE5hdGl2ZUNvZGUiLCAiKEkpViIsICh2b2lkKil1bmxvYWROYXRpdmVDb2RlX25hdGl2ZSB9LAogICAgIHsgIm9uU3RhcnROYXRpdmUiLCAiKEkpViIsICh2b2lkKilvblN0YXJ0X25hdGl2ZSB9LAogICAgIHsgIm9uUmVzdW1lTmF0aXZlIiwgIihJKVYiLCAodm9pZCopb25SZXN1bWVfbmF0aXZlIH0sCkBAIC0zOTgsMTEgKzc4MCwxNCBAQAogICAgIHsgIm9uU3RvcE5hdGl2ZSIsICIoSSlWIiwgKHZvaWQqKW9uU3RvcF9uYXRpdmUgfSwKICAgICB7ICJvbkxvd01lbW9yeU5hdGl2ZSIsICIoSSlWIiwgKHZvaWQqKW9uTG93TWVtb3J5X25hdGl2ZSB9LAogICAgIHsgIm9uV2luZG93Rm9jdXNDaGFuZ2VkTmF0aXZlIiwgIihJWilWIiwgKHZvaWQqKW9uV2luZG93Rm9jdXNDaGFuZ2VkX25hdGl2ZSB9LAotICAgIHsgIm9uU3VyZmFjZUNyZWF0ZWROYXRpdmUiLCAiKElMYW5kcm9pZC92aWV3L1N1cmZhY2VIb2xkZXI7KVYiLCAodm9pZCopb25TdXJmYWNlQ3JlYXRlZF9uYXRpdmUgfSwKLSAgICB7ICJvblN1cmZhY2VDaGFuZ2VkTmF0aXZlIiwgIihJTGFuZHJvaWQvdmlldy9TdXJmYWNlSG9sZGVyO0lJSSlWIiwgKHZvaWQqKW9uU3VyZmFjZUNoYW5nZWRfbmF0aXZlIH0sCi0gICAgeyAib25TdXJmYWNlRGVzdHJveWVkTmF0aXZlIiwgIihJTGFuZHJvaWQvdmlldy9TdXJmYWNlSG9sZGVyOylWIiwgKHZvaWQqKW9uU3VyZmFjZURlc3Ryb3llZF9uYXRpdmUgfSwKKyAgICB7ICJvblN1cmZhY2VDcmVhdGVkTmF0aXZlIiwgIihJTGFuZHJvaWQvdmlldy9TdXJmYWNlOylWIiwgKHZvaWQqKW9uU3VyZmFjZUNyZWF0ZWRfbmF0aXZlIH0sCisgICAgeyAib25TdXJmYWNlQ2hhbmdlZE5hdGl2ZSIsICIoSUxhbmRyb2lkL3ZpZXcvU3VyZmFjZTtJSUkpViIsICh2b2lkKilvblN1cmZhY2VDaGFuZ2VkX25hdGl2ZSB9LAorICAgIHsgIm9uU3VyZmFjZVJlZHJhd05lZWRlZE5hdGl2ZSIsICIoSUxhbmRyb2lkL3ZpZXcvU3VyZmFjZTspViIsICh2b2lkKilvblN1cmZhY2VSZWRyYXdOZWVkZWRfbmF0aXZlIH0sCisgICAgeyAib25TdXJmYWNlRGVzdHJveWVkTmF0aXZlIiwgIihJKVYiLCAodm9pZCopb25TdXJmYWNlRGVzdHJveWVkX25hdGl2ZSB9LAogICAgIHsgIm9uSW5wdXRDaGFubmVsQ3JlYXRlZE5hdGl2ZSIsICIoSUxhbmRyb2lkL3ZpZXcvSW5wdXRDaGFubmVsOylWIiwgKHZvaWQqKW9uSW5wdXRDaGFubmVsQ3JlYXRlZF9uYXRpdmUgfSwKICAgICB7ICJvbklucHV0Q2hhbm5lbERlc3Ryb3llZE5hdGl2ZSIsICIoSUxhbmRyb2lkL3ZpZXcvSW5wdXRDaGFubmVsOylWIiwgKHZvaWQqKW9uSW5wdXRDaGFubmVsRGVzdHJveWVkX25hdGl2ZSB9LAorICAgIHsgIm9uQ29udGVudFJlY3RDaGFuZ2VkTmF0aXZlIiwgIihJSUlJSSlWIiwgKHZvaWQqKW9uQ29udGVudFJlY3RDaGFuZ2VkX25hdGl2ZSB9LAorICAgIHsgImRpc3BhdGNoS2V5RXZlbnROYXRpdmUiLCAiKElMYW5kcm9pZC92aWV3L0tleUV2ZW50OylWIiwgKHZvaWQqKWRpc3BhdGNoS2V5RXZlbnRfbmF0aXZlIH0sCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga05hdGl2ZUFjdGl2aXR5UGF0aE5hbWUgPSAiYW5kcm9pZC9hcHAvTmF0aXZlQWN0aXZpdHkiOwpAQCAtNDIxLDExICs4MDYsMjQgQEAKICAgICAvL0xPR0QoInJlZ2lzdGVyX2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5Iik7CiAKICAgICBGSU5EX0NMQVNTKGdOYXRpdmVBY3Rpdml0eUNsYXNzSW5mby5jbGF6eiwga05hdGl2ZUFjdGl2aXR5UGF0aE5hbWUpOwotICAgICAgICAKKyAgICAKICAgICBHRVRfTUVUSE9EX0lEKGdOYXRpdmVBY3Rpdml0eUNsYXNzSW5mby5kaXNwYXRjaFVuaGFuZGxlZEtleUV2ZW50LAogICAgICAgICAgICAgZ05hdGl2ZUFjdGl2aXR5Q2xhc3NJbmZvLmNsYXp6LAogICAgICAgICAgICAgImRpc3BhdGNoVW5oYW5kbGVkS2V5RXZlbnQiLCAiKExhbmRyb2lkL3ZpZXcvS2V5RXZlbnQ7KVYiKTsKLSAgICAgICAgICAgIAorCisgICAgR0VUX01FVEhPRF9JRChnTmF0aXZlQWN0aXZpdHlDbGFzc0luZm8uc2V0V2luZG93RmxhZ3MsCisgICAgICAgICAgICBnTmF0aXZlQWN0aXZpdHlDbGFzc0luZm8uY2xhenosCisgICAgICAgICAgICAic2V0V2luZG93RmxhZ3MiLCAiKElJKVYiKTsKKyAgICBHRVRfTUVUSE9EX0lEKGdOYXRpdmVBY3Rpdml0eUNsYXNzSW5mby5zZXRXaW5kb3dGb3JtYXQsCisgICAgICAgICAgICBnTmF0aXZlQWN0aXZpdHlDbGFzc0luZm8uY2xhenosCisgICAgICAgICAgICAic2V0V2luZG93Rm9ybWF0IiwgIihJKVYiKTsKKyAgICBHRVRfTUVUSE9EX0lEKGdOYXRpdmVBY3Rpdml0eUNsYXNzSW5mby5zaG93SW1lLAorICAgICAgICAgICAgZ05hdGl2ZUFjdGl2aXR5Q2xhc3NJbmZvLmNsYXp6LAorICAgICAgICAgICAgInNob3dJbWUiLCAiKEkpViIpOworICAgIEdFVF9NRVRIT0RfSUQoZ05hdGl2ZUFjdGl2aXR5Q2xhc3NJbmZvLmhpZGVJbWUsCisgICAgICAgICAgICBnTmF0aXZlQWN0aXZpdHlDbGFzc0luZm8uY2xhenosCisgICAgICAgICAgICAiaGlkZUltZSIsICIoSSlWIik7CisKICAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcygKICAgICAgICAgZW52LCBrTmF0aXZlQWN0aXZpdHlQYXRoTmFtZSwKICAgICAgICAgZ19tZXRob2RzLCBORUxFTShnX21ldGhvZHMpKTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRGVidWcuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKaW5kZXggM2VlNDA0YS4uNGE4NzdkMiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKQEAgLTE0LDYgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5vcy5EZWJ1ZyIKICNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAidXRpbHMvbWlzYy5oIgpAQCAtMjQsNiArMjUsOCBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpZmRlZiBIQVZFX01BTExPQ19ICiAjaW5jbHVkZSA8bWFsbG9jLmg+CkBAIC0yNzQsNiArMjc3LDE3NiBAQAogamludCBhbmRyb2lkX29zX0RlYnVnX2dldFByb3h5T2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogamludCBhbmRyb2lkX29zX0RlYnVnX2dldERlYXRoT2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogCisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKy8qIHB1bGxlZCBvdXQgb2YgYmlvbmljICovCitleHRlcm4gIkMiIHZvaWQgZ2V0X21hbGxvY19sZWFrX2luZm8odWludDhfdCoqIGluZm8sIHNpemVfdCogb3ZlcmFsbFNpemUsCisgICAgc2l6ZV90KiBpbmZvU2l6ZSwgc2l6ZV90KiB0b3RhbE1lbW9yeSwgc2l6ZV90KiBiYWNrdHJhY2VTaXplKTsKK2V4dGVybiAiQyIgdm9pZCBmcmVlX21hbGxvY19sZWFrX2luZm8odWludDhfdCogaW5mbyk7CisjZGVmaW5lIFNJWkVfRkxBR19aWUdPVEVfQ0hJTEQgICgxPDwzMSkKKyNkZWZpbmUgQkFDS1RSQUNFX1NJWkUgICAgICAgICAgMzIKKworLyoKKyAqIFRoaXMgaXMgYSBxc29ydCgpIGNhbGxiYWNrLgorICoKKyAqIFNlZSBkdW1wTmF0aXZlSGVhcCgpIGZvciBjb21tZW50cyBhYm91dCB0aGUgZGF0YSBmb3JtYXQgYW5kIHNvcnQgb3JkZXIuCisgKi8KK3N0YXRpYyBpbnQgY29tcGFyZUhlYXBSZWNvcmRzKGNvbnN0IHZvaWQqIHZyZWMxLCBjb25zdCB2b2lkKiB2cmVjMikKK3sKKyAgICBjb25zdCBzaXplX3QqIHJlYzEgPSAoY29uc3Qgc2l6ZV90KikgdnJlYzE7CisgICAgY29uc3Qgc2l6ZV90KiByZWMyID0gKGNvbnN0IHNpemVfdCopIHZyZWMyOworICAgIHNpemVfdCBzaXplMSA9ICpyZWMxOworICAgIHNpemVfdCBzaXplMiA9ICpyZWMyOworCisgICAgaWYgKHNpemUxIDwgc2l6ZTIpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChzaXplMSA+IHNpemUyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCogYnQxID0gKGludHB0cl90KikocmVjMSArIDIpOworICAgIGludHB0cl90KiBidDIgPSAoaW50cHRyX3QqKShyZWMyICsgMik7CisgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgQkFDS1RSQUNFX1NJWkU7IGlkeCsrKSB7CisgICAgICAgIGludHB0cl90IGFkZHIxID0gYnQxW2lkeF07CisgICAgICAgIGludHB0cl90IGFkZHIyID0gYnQyW2lkeF07CisgICAgICAgIGlmIChhZGRyMSA9PSBhZGRyMikgeworICAgICAgICAgICAgaWYgKGFkZHIxID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRkcjEgPCBhZGRyMikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGFkZHIxID4gYWRkcjIpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZ2V0X21hbGxvY19sZWFrX2luZm8oKSBjYWxsIHJldHVybnMgYW4gYXJyYXkgb2Ygc3RydWN0cyB0aGF0CisgKiBsb29rIGxpa2UgdGhpczoKKyAqCisgKiAgIHNpemVfdCBzaXplCisgKiAgIHNpemVfdCBhbGxvY2F0aW9ucworICogICBpbnRwdHJfdCBiYWNrdHJhY2VbMzJdCisgKgorICogInNpemUiIGlzIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uLCAiYmFja3RyYWNlIiBpcyBhIGZpeGVkLXNpemUKKyAqIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgImFsbG9jYXRpb25zIiBpcyB0aGUgbnVtYmVyIG9mCisgKiBhbGxvY2F0aW9ucyB3aXRoIHRoZSBleGFjdCBzYW1lIHNpemUgYW5kIGJhY2t0cmFjZS4KKyAqCisgKiBUaGUgZW50cmllcyBhcmUgc29ydGVkIGJ5IGRlc2NlbmRpbmcgdG90YWwgc2l6ZSAoaS5lLiBzaXplKmFsbG9jYXRpb25zKQorICogdGhlbiBhbGxvY2F0aW9uIGNvdW50LiAgRm9yIGJlc3QgcmVzdWx0cyB3aXRoICJkaWZmIiB3ZSdkIGxpa2UgdG8gc29ydAorICogcHJpbWFyaWx5IGJ5IGluZGl2aWR1YWwgc2l6ZSB0aGVuIHN0YWNrIHRyYWNlLiAgU2luY2UgdGhlIGVudHJpZXMgYXJlCisgKiBmaXhlZC1zaXplLCBhbmQgd2UncmUgYWxsb3dlZCAoYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pIHRvIG1hbmdsZQorICogdGhlbSwgd2UgY2FuIGRvIHRoaXMgaW4gcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIGR1bXBOYXRpdmVIZWFwKEZJTEUqIGZwKQoreworICAgIHVpbnQ4X3QqIGluZm8gPSBOVUxMOworICAgIHNpemVfdCBvdmVyYWxsU2l6ZSwgaW5mb1NpemUsIHRvdGFsTWVtb3J5LCBiYWNrdHJhY2VTaXplOworCisgICAgZ2V0X21hbGxvY19sZWFrX2luZm8oJmluZm8sICZvdmVyYWxsU2l6ZSwgJmluZm9TaXplLCAmdG90YWxNZW1vcnksCisgICAgICAgICZiYWNrdHJhY2VTaXplKTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoZnAsICJOYXRpdmUgaGVhcCBkdW1wIG5vdCBhdmFpbGFibGUuIFRvIGVuYWJsZSwgcnVuIHRoZXNlIgorICAgICAgICAgICAgICAgICAgICAiIGNvbW1hbmRzIChyZXF1aXJlcyByb290KTpcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc2V0cHJvcCBsaWJjLmRlYnVnLm1hbGxvYyAxXG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIiQgYWRiIHNoZWxsIHN0b3BcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc3RhcnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFzc2VydChpbmZvU2l6ZSAhPSAwKTsKKyAgICBhc3NlcnQob3ZlcmFsbFNpemUgJSBpbmZvU2l6ZSA9PSAwKTsKKworICAgIGZwcmludGYoZnAsICJBbmRyb2lkIE5hdGl2ZSBIZWFwIER1bXAgdjEuMFxuXG4iKTsKKworICAgIHNpemVfdCByZWNvcmRDb3VudCA9IG92ZXJhbGxTaXplIC8gaW5mb1NpemU7CisgICAgZnByaW50ZihmcCwgIlRvdGFsIG1lbW9yeTogJXp1XG4iLCB0b3RhbE1lbW9yeSk7CisgICAgZnByaW50ZihmcCwgIkFsbG9jYXRpb24gcmVjb3JkczogJXpkXG4iLCByZWNvcmRDb3VudCk7CisgICAgaWYgKGJhY2t0cmFjZVNpemUgIT0gQkFDS1RSQUNFX1NJWkUpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIldBUk5JTkc6IG1pc21hdGNoZWQgYmFja3RyYWNlIHNpemVzICglZCB2cy4gJWQpXG4iLAorICAgICAgICAgICAgYmFja3RyYWNlU2l6ZSwgQkFDS1RSQUNFX1NJWkUpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiXG4iKTsKKworICAgIC8qIHJlLXNvcnQgdGhlIGVudHJpZXMgKi8KKyAgICBxc29ydChpbmZvLCByZWNvcmRDb3VudCwgaW5mb1NpemUsIGNvbXBhcmVIZWFwUmVjb3Jkcyk7CisKKyAgICAvKiBkdW1wIHRoZSBlbnRyaWVzIHRvIHRoZSBmaWxlICovCisgICAgY29uc3QgdWludDhfdCogcHRyID0gaW5mbzsKKyAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCByZWNvcmRDb3VudDsgaWR4KyspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAqKHNpemVfdCopIHB0cjsKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRpb25zID0gKihzaXplX3QqKSAocHRyICsgc2l6ZW9mKHNpemVfdCkpOworICAgICAgICBpbnRwdHJfdCogYmFja3RyYWNlID0gKGludHB0cl90KikgKHB0ciArIHNpemVvZihzaXplX3QpICogMik7CisKKyAgICAgICAgZnByaW50ZihmcCwgInogJWQgIHN6ICU4enUgIG51bSAlNHp1ICBidCIsCisgICAgICAgICAgICAgICAgKHNpemUgJiBTSVpFX0ZMQUdfWllHT1RFX0NISUxEKSAhPSAwLAorICAgICAgICAgICAgICAgIHNpemUgJiB+U0laRV9GTEFHX1pZR09URV9DSElMRCwKKyAgICAgICAgICAgICAgICBhbGxvY2F0aW9ucyk7CisgICAgICAgIGZvciAoc2l6ZV90IGJ0ID0gMDsgYnQgPCBiYWNrdHJhY2VTaXplOyBidCsrKSB7CisgICAgICAgICAgICBpZiAoYmFja3RyYWNlW2J0XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgJTA4eCIsIGJhY2t0cmFjZVtidF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZwcmludGYoZnAsICJcbiIpOworCisgICAgICAgIHB0ciArPSBpbmZvU2l6ZTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGZwLCAiRU5EXG4iKTsKKyAgICBmcmVlX21hbGxvY19sZWFrX2luZm8oaW5mbyk7Cit9CisjZW5kaWYgLypIQVZFX0FORFJPSURfT1MqLworCisvKgorICogRHVtcCB0aGUgbmF0aXZlIGhlYXAsIHdyaXRpbmcgaHVtYW4tcmVhZGFibGUgb3V0cHV0IHRvIHRoZSBzcGVjaWZpZWQKKyAqIGZpbGUgZGVzY3JpcHRvci4KKyAqLworc3RhdGljIHZvaWQgYW5kcm9pZF9vc19EZWJ1Z19kdW1wTmF0aXZlSGVhcChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKKyAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yKQoreworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgb3JpZ0ZkID0gam5pR2V0RkRGcm9tRmlsZURlc2NyaXB0b3IoZW52LCBmaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKG9yaWdGZCA8IDApIHsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBkdXAoKSB0aGUgZGVzY3JpcHRvciBzbyB3ZSBkb24ndCBjbG9zZSB0aGUgb3JpZ2luYWwgd2l0aCBmY2xvc2UoKSAqLworICAgIGludCBmZCA9IGR1cChvcmlnRmQpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HVygiZHVwKCVkKSBmYWlsZWQ6ICVzXG4iLCBvcmlnRmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJkdXAoKSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEZJTEUqIGZwID0gZmRvcGVuKGZkLCAidyIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImZkb3BlbiglZCkgZmFpbGVkOiAlc1xuIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgImZkb3BlbigpIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiTmF0aXZlIGhlYXAgZHVtcCBzdGFydGluZy4uLlxuIik7CisgICAgZHVtcE5hdGl2ZUhlYXAoZnApOworICAgIExPR0QoIk5hdGl2ZSBoZWFwIGR1bXAgY29tcGxldGUuXG4iKTsKKyNlbHNlCisgICAgZnByaW50ZihmcCwgIk5hdGl2ZSBoZWFwIGR1bXAgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtXG4iKTsKKyNlbmRpZgorCisgICAgZmNsb3NlKGZwKTsKK30KKworCiAvKgogICogSk5JIHJlZ2lzdHJhdGlvbi4KICAqLwpAQCAtMjg5LDYgKzQ2Miw4IEBACiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRGVidWdfZ2V0RGlydHlQYWdlcyB9LAogICAgIHsgImdldE1lbW9yeUluZm8iLCAgICAgICAgICAiKElMYW5kcm9pZC9vcy9EZWJ1ZyRNZW1vcnlJbmZvOylWIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19EZWJ1Z19nZXREaXJ0eVBhZ2VzUGlkIH0sCisgICAgeyAiZHVtcE5hdGl2ZUhlYXAiLCAgICAgICAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2R1bXBOYXRpdmVIZWFwIH0sCiAgICAgeyAiZ2V0QmluZGVyU2VudFRyYW5zYWN0aW9ucyIsICIoKUkiLAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2dldEJpbmRlclNlbnRUcmFuc2FjdGlvbnMgfSwKICAgICB7ICJnZXRCaW5kZXJSZWNlaXZlZFRyYW5zYWN0aW9ucyIsICIoKUkiLApAQCAtMzIwLDQgKzQ5NSw0IEBACiAgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL29zL0RlYnVnIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CiB9CiAKLX07Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19NZXNzYWdlUXVldWUuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19NZXNzYWdlUXVldWUuY3BwCmluZGV4IDAzMGQ2YzcuLjg0N2I1YTUgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfb3NfTWVzc2FnZVF1ZXVlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX01lc3NhZ2VRdWV1ZS5jcHAKQEAgLTUxLDE0ICs1MSwxOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBOYXRpdmVNZXNzYWdlUXVldWU6Ok5hdGl2ZU1lc3NhZ2VRdWV1ZSgpIHsKLSAgICBtUG9sbExvb3AgPSBuZXcgUG9sbExvb3AoKTsKKyAgICBtUG9sbExvb3AgPSBQb2xsTG9vcDo6Z2V0Rm9yVGhyZWFkKCk7CisgICAgaWYgKG1Qb2xsTG9vcCA9PSBOVUxMKSB7CisgICAgICAgIG1Qb2xsTG9vcCA9IG5ldyBQb2xsTG9vcChmYWxzZSk7CisgICAgICAgIFBvbGxMb29wOjpzZXRGb3JUaHJlYWQobVBvbGxMb29wKTsKKyAgICB9CiB9CiAKIE5hdGl2ZU1lc3NhZ2VRdWV1ZTo6fk5hdGl2ZU1lc3NhZ2VRdWV1ZSgpIHsKIH0KIAogYm9vbCBOYXRpdmVNZXNzYWdlUXVldWU6OnBvbGxPbmNlKGludCB0aW1lb3V0TWlsbGlzKSB7Ci0gICAgcmV0dXJuIG1Qb2xsTG9vcC0+cG9sbE9uY2UodGltZW91dE1pbGxpcyk7CisgICAgcmV0dXJuIG1Qb2xsTG9vcC0+cG9sbE9uY2UodGltZW91dE1pbGxpcykgIT0gUG9sbExvb3A6OlBPTExfVElNRU9VVDsKIH0KIAogdm9pZCBOYXRpdmVNZXNzYWdlUXVldWU6Ondha2UoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3V0aWxfUHJvY2Vzcy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3V0aWxfUHJvY2Vzcy5jcHAKaW5kZXggNjhiZTc0MS4uN2M5OTI3MSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF91dGlsX1Byb2Nlc3MuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdXRpbF9Qcm9jZXNzLmNwcApAQCAtNTIsOSArNTIsMTUgQEAKICNlbmRpZgogCiAjZGVmaW5lIFBPTElDWV9ERUJVRyAwCisjZGVmaW5lIEdVQVJEX1RIUkVBRF9QUklPUklUWSAwCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCisjaWYgR1VBUkRfVEhSRUFEX1BSSU9SSVRZCitNdXRleCBnS2V5Q3JlYXRlTXV0ZXg7CitzdGF0aWMgcHRocmVhZF9rZXlfdCBnQmdLZXkgPSAtMTsKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBzaWduYWxFeGNlcHRpb25Gb3JQcmlvcml0eUVycm9yKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwgaW50IGVycikKIHsKICAgICBzd2l0Y2ggKGVycikgewpAQCAtMjY0LDkgKzI3MCw0MSBAQAogICAgIGNsb3NlZGlyKGQpOwogfQogCitzdGF0aWMgdm9pZCBhbmRyb2lkX29zX1Byb2Nlc3Nfc2V0Q2FuU2VsZkJhY2tncm91bmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGpib29sZWFuIGJnT2spIHsKKyAgICAvLyBFc3RhYmxpc2hlcyB0aGUgY2FsbGluZyB0aHJlYWQgYXMgaWxsZWdhbCB0byBwdXQgaW50byB0aGUgYmFja2dyb3VuZC4KKyAgICAvLyBUeXBpY2FsbHkgdXNlZCBvbmx5IGZvciB0aGUgc3lzdGVtIHByb2Nlc3MncyBtYWluIGxvb3Blci4KKyNpZiBHVUFSRF9USFJFQURfUFJJT1JJVFkKKyAgICBMT0dWKCJQcm9jZXNzLnNldENhblNlbGZCYWNrZ3JvdW5kKCVkKSA6IHRpZD0lZCIsIGJnT2ssIGFuZHJvaWRHZXRUaWQoKSk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0tleUNyZWF0ZU11dGV4KTsKKyAgICAgICAgaWYgKGdCZ0tleSA9PSAtMSkgeworICAgICAgICAgICAgcHRocmVhZF9rZXlfY3JlYXRlKCZnQmdLZXksIE5VTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW52ZXJ0ZWQ6ICBub3Qtb2theSwgd2Ugc2V0IGEgc2VudGluZWwgdmFsdWUKKyAgICBwdGhyZWFkX3NldHNwZWNpZmljKGdCZ0tleSwgKHZvaWQqKShiZ09rID8gMCA6IDB4YmFhZCkpOworI2VuZGlmCit9CisKIHZvaWQgYW5kcm9pZF9vc19Qcm9jZXNzX3NldFRocmVhZFByaW9yaXR5KEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgcGlkLCBqaW50IHByaSkKIHsKKyNpZiBHVUFSRF9USFJFQURfUFJJT1JJVFkKKyAgICAvLyBpZiB3ZSdyZSBwdXR0aW5nIHRoZSBjdXJyZW50IHRocmVhZCBpbnRvIHRoZSBiYWNrZ3JvdW5kLCBjaGVjayB0aGUgVExTCisgICAgLy8gdG8gbWFrZSBzdXJlIHRoaXMgdGhyZWFkIGlzbid0IGd1YXJkZWQuICBJZiBpdCBpcywgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgIGlmIChwcmkgPj0gQU5EUk9JRF9QUklPUklUWV9CQUNLR1JPVU5EKSB7CisgICAgICAgIGlmIChwaWQgPT0gYW5kcm9pZEdldFRpZCgpKSB7CisgICAgICAgICAgICB2b2lkKiBiZ09rID0gcHRocmVhZF9nZXRzcGVjaWZpYyhnQmdLZXkpOworICAgICAgICAgICAgaWYgKGJnT2sgPT0gKCh2b2lkKikweGJhYWQpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiVGhyZWFkIG1hcmtlZCBmZy1vbmx5IHB1dCBzZWxmIGluIGJhY2tncm91bmQhIik7CisgICAgICAgICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uIiwgIk1heSBub3QgcHV0IHRoaXMgdGhyZWFkIGludG8gYmFja2dyb3VuZCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCiAgICAgaW50IHJjID0gYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHBpZCwgcHJpKTsKICAgICBpZiAocmMgIT0gMCkgewogICAgICAgICBpZiAocmMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKQEAgLTg1Miw2ICs4OTAsNyBAQAogICAgIHsiZ2V0VWlkRm9yTmFtZSIsICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAodm9pZCopYW5kcm9pZF9vc19Qcm9jZXNzX2dldFVpZEZvck5hbWV9LAogICAgIHsiZ2V0R2lkRm9yTmFtZSIsICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAodm9pZCopYW5kcm9pZF9vc19Qcm9jZXNzX2dldEdpZEZvck5hbWV9LAogICAgIHsic2V0VGhyZWFkUHJpb3JpdHkiLCAgICIoSUkpViIsICh2b2lkKilhbmRyb2lkX29zX1Byb2Nlc3Nfc2V0VGhyZWFkUHJpb3JpdHl9LAorICAgIHsic2V0Q2FuU2VsZkJhY2tncm91bmQiLCAiKFopViIsICh2b2lkKilhbmRyb2lkX29zX1Byb2Nlc3Nfc2V0Q2FuU2VsZkJhY2tncm91bmR9LAogICAgIHsic2V0VGhyZWFkUHJpb3JpdHkiLCAgICIoSSlWIiwgKHZvaWQqKWFuZHJvaWRfb3NfUHJvY2Vzc19zZXRDYWxsaW5nVGhyZWFkUHJpb3JpdHl9LAogICAgIHsiZ2V0VGhyZWFkUHJpb3JpdHkiLCAgICIoSSlJIiwgKHZvaWQqKWFuZHJvaWRfb3NfUHJvY2Vzc19nZXRUaHJlYWRQcmlvcml0eX0sCiAgICAgeyJzZXRUaHJlYWRHcm91cCIsICAgICAgIihJSSlWIiwgKHZvaWQqKWFuZHJvaWRfb3NfUHJvY2Vzc19zZXRUaHJlYWRHcm91cH0sCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwCmluZGV4IGJkM2IxOGQuLjFiYmFjNzEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CiAKICNpbmNsdWRlIDxTa0JpdG1hcC5oPgogI2luY2x1ZGUgPFNrQ2FudmFzLmg+CkBAIC0xNzcsMjggKzE3OCwzNSBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXAoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAotICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKLSAgICAgICAgU2tQYWludCogcGFpbnQsIGppbnQgYml0bWFwRGVuc2l0eSwgamludCBjYW52YXNEZW5zaXR5LGppbnQgc2NyZWVuRGVuc2l0eSkgewotICAgIGlmIChjYW52YXNEZW5zaXR5ID09IGJpdG1hcERlbnNpdHkgfHwgY2FudmFzRGVuc2l0eSA9PSAwIHx8IGJpdG1hcERlbnNpdHkgPT0gMCkgewotICAgICAgICByZW5kZXJlci0+ZHJhd0JpdG1hcChiaXRtYXAsIGxlZnQsIHRvcCwgcGFpbnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlcmVyLT5zYXZlKDApOwotICAgICAgICBjb25zdCBmbG9hdCBzY2FsZSA9IGNhbnZhc0RlbnNpdHkgLyBmbG9hdChiaXRtYXBEZW5zaXR5KTsKLSAgICAgICAgcmVuZGVyZXItPnRyYW5zbGF0ZShsZWZ0LCB0b3ApOwotICAgICAgICByZW5kZXJlci0+c2NhbGUoc2NhbGUsIHNjYWxlKTsKLSAgICAgICAgcmVuZGVyZXItPmRyYXdCaXRtYXAoYml0bWFwLCBsZWZ0LCB0b3AsIHBhaW50KTsKLSAgICAgICAgcmVuZGVyZXItPnJlc3RvcmUoKTsKLSAgICB9CisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3Qml0bWFwKGJpdG1hcCwgbGVmdCwgdG9wLCBwYWludCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcFJlY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAogICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrQml0bWFwKiBiaXRtYXAsCiAgICAgICAgIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwKLSAgICAgICAgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLCBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLAotICAgICAgICBTa01hdHJpeCogbWF0cml4LCBTa1BhaW50KiBwYWludCwKLSAgICAgICAgamludCBiaXRtYXBEZW5zdGl5LCBqaW50IGNhbnZhc0RlbnNpdHksIGppbnQgc2NyZWVuRGVuc2l0eSkgewotICAgIC8vIFRPRE86IEltcGxlbWVudCEKLSAgICBMT0dFKCJOb3QgaW1wbGVtZW50ZWQ6IGRyYXdCaXRtYXAoSUlGRkZGRkZGRklJSUlJKVYiKTsKKyAgICAgICAgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLCBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3Qml0bWFwKGJpdG1hcCwgc3JjTGVmdCwgc3JjVG9wLCBzcmNSaWdodCwgc3JjQm90dG9tLAorICAgICAgICAgICAgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwgU2tNYXRyaXgqIG1hdHJpeCwgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd0JpdG1hcChiaXRtYXAsIG1hdHJpeCwgcGFpbnQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdQYXRjaChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwgamJ5dGVBcnJheSBjaHVua3MsCisgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgU2tQYWludCogcGFpbnQpIHsKKworICAgIGpieXRlKiBzdG9yYWdlID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhjaHVua3MsIE5VTEwpOworICAgIFJlc19wbmdfOXBhdGNoKiBwYXRjaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVzX3BuZ185cGF0Y2gqPihzdG9yYWdlKTsKKyAgICBSZXNfcG5nXzlwYXRjaDo6ZGVzZXJpYWxpemUocGF0Y2gpOworCisgICAgcmVuZGVyZXItPmRyYXdQYXRjaChiaXRtYXAsIHBhdGNoLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKworICAgIC8vIFRPRE86IG1ha2Ugc3VyZSB0aGF0IDAgaXMgY29ycmVjdCBmb3IgdGhlIGZsYWdzCisgICAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoY2h1bmtzLCBzdG9yYWdlLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Q29sb3IoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLApAQCAtMjE5LDM1ICsyMjcsMzcgQEAKIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMiOwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7Ci0gICAgeyAgICJuQ3JlYXRlUmVuZGVyZXIiLCAgICAiKClJIiwgICAgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZVJlbmRlcmVyIH0sCi0gICAgeyAgICJuRGVzdHJveVJlbmRlcmVyIiwgICAiKEkpViIsICAgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2Rlc3Ryb3lSZW5kZXJlciB9LAotICAgIHsgICAiblNldFZpZXdwb3J0IiwgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRWaWV3cG9ydCB9LAotICAgIHsgICAiblByZXBhcmUiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19wcmVwYXJlIH0sCisgICAgeyAgICJuQ3JlYXRlUmVuZGVyZXIiLCAgICAiKClJIiwgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZVJlbmRlcmVyIH0sCisgICAgeyAgICJuRGVzdHJveVJlbmRlcmVyIiwgICAiKEkpViIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2Rlc3Ryb3lSZW5kZXJlciB9LAorICAgIHsgICAiblNldFZpZXdwb3J0IiwgICAgICAgIihJSUkpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRWaWV3cG9ydCB9LAorICAgIHsgICAiblByZXBhcmUiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19wcmVwYXJlIH0sCiAKLSAgICB7ICAgIm5TYXZlIiwgICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZSB9LAotICAgIHsgICAiblJlc3RvcmUiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZXN0b3JlIH0sCi0gICAgeyAgICJuUmVzdG9yZVRvQ291bnQiLCAgICAiKElJKVYiLCAgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc3RvcmVUb0NvdW50IH0sCi0gICAgeyAgICJuR2V0U2F2ZUNvdW50IiwgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldFNhdmVDb3VudCB9LAorICAgIHsgICAiblNhdmUiLCAgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlIH0sCisgICAgeyAgICJuUmVzdG9yZSIsICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc3RvcmUgfSwKKyAgICB7ICAgIm5SZXN0b3JlVG9Db3VudCIsICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZVRvQ291bnQgfSwKKyAgICB7ICAgIm5HZXRTYXZlQ291bnQiLCAgICAgICIoSSlJIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0U2F2ZUNvdW50IH0sCiAKLSAgICB7ICAgIm5TYXZlTGF5ZXIiLCAgICAgICAgICIoSUZGRkZJSSlJIiwgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZUxheWVyIH0sCi0gICAgeyAgICJuU2F2ZUxheWVyQWxwaGEiLCAgICAiKElGRkZGSUkpSSIsICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllckFscGhhIH0sCisgICAgeyAgICJuU2F2ZUxheWVyIiwgICAgICAgICAiKElGRkZGSUkpSSIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllciB9LAorICAgIHsgICAiblNhdmVMYXllckFscGhhIiwgICAgIihJRkZGRklJKUkiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXJBbHBoYSB9LAogCi0gICAgeyAgICJuUXVpY2tSZWplY3QiLCAgICAgICAiKElGRkZGSSlaIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3F1aWNrUmVqZWN0IH0sCi0gICAgeyAgICJuQ2xpcFJlY3QiLCAgICAgICAgICAiKElGRkZGKVoiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0RiB9LAotICAgIHsgICAibkNsaXBSZWN0IiwgICAgICAgICAgIihJSUlJSSlaIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdCB9LAorICAgIHsgICAiblF1aWNrUmVqZWN0IiwgICAgICAgIihJRkZGRkkpWiIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19xdWlja1JlamVjdCB9LAorICAgIHsgICAibkNsaXBSZWN0IiwgICAgICAgICAgIihJRkZGRilaIiwgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdEYgfSwKKyAgICB7ICAgIm5DbGlwUmVjdCIsICAgICAgICAgICIoSUlJSUkpWiIsICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY2xpcFJlY3QgfSwKIAotICAgIHsgICAiblRyYW5zbGF0ZSIsICAgICAgICAgIihJRkYpViIsICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc190cmFuc2xhdGUgfSwKLSAgICB7ICAgIm5Sb3RhdGUiLCAgICAgICAgICAgICIoSUYpViIsICAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcm90YXRlIH0sCi0gICAgeyAgICJuU2NhbGUiLCAgICAgICAgICAgICAiKElGRilWIiwgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NjYWxlIH0sCisgICAgeyAgICJuVHJhbnNsYXRlIiwgICAgICAgICAiKElGRilWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3RyYW5zbGF0ZSB9LAorICAgIHsgICAiblJvdGF0ZSIsICAgICAgICAgICAgIihJRilWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yb3RhdGUgfSwKKyAgICB7ICAgIm5TY2FsZSIsICAgICAgICAgICAgICIoSUZGKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2NhbGUgfSwKIAotICAgIHsgICAiblNldE1hdHJpeCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRNYXRyaXggfSwKLSAgICB7ICAgIm5HZXRNYXRyaXgiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0TWF0cml4IH0sCi0gICAgeyAgICJuQ29uY2F0TWF0cml4IiwgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NvbmNhdE1hdHJpeCB9LAorICAgIHsgICAiblNldE1hdHJpeCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRNYXRyaXggfSwKKyAgICB7ICAgIm5HZXRNYXRyaXgiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0TWF0cml4IH0sCisgICAgeyAgICJuQ29uY2F0TWF0cml4IiwgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NvbmNhdE1hdHJpeCB9LAogCi0gICAgeyAgICJuRHJhd0JpdG1hcCIsICAgICAgICAiKElJRkZJSUlJKVYiLCAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXAgfSwKLSAgICB7ICAgIm5EcmF3Qml0bWFwIiwgICAgICAgICIoSUlGRkZGRkZGRklJSUlJKVYiLCAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcFJlY3QgfSwKLSAgICB7ICAgIm5EcmF3Q29sb3IiLCAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0NvbG9yIH0sCi0gICAgeyAgICJuRHJhd1JlY3QiLCAgICAgICAgICAiKElGRkZGSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdSZWN0IH0sCisgICAgeyAgICJuRHJhd0JpdG1hcCIsICAgICAgICAiKElJRkZJKVYiLCAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXAgfSwKKyAgICB7ICAgIm5EcmF3Qml0bWFwIiwgICAgICAgICIoSUlGRkZGRkZGRkkpViIsICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcFJlY3QgfSwKKyAgICB7ICAgIm5EcmF3Qml0bWFwIiwgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcE1hdHJpeCB9LAorICAgIHsgICAibkRyYXdQYXRjaCIsICAgICAgICAgIihJSVtCRkZGRkkpViIsICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UGF0Y2ggfSwKKyAgICB7ICAgIm5EcmF3Q29sb3IiLCAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0NvbG9yIH0sCisgICAgeyAgICJuRHJhd1JlY3QiLCAgICAgICAgICAiKElGRkZGSSlWIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdSZWN0IH0sCiAKICAgICB7ICAgIm5HZXRDbGlwQm91bmRzIiwgICAgICIoSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3Q7KVoiLAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldENsaXBCb3VuZHMgfSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19TdXJmYWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19TdXJmYWNlLmNwcAppbmRleCBjZWY1YzEwLi43MzA1MDMyIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X1N1cmZhY2UuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAKICNpbmNsdWRlICJqbmkuaCIKICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF92aWV3X1N1cmZhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKIApAQCAtMTc5LDcgKzE4MCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotRUdMTmF0aXZlV2luZG93VHlwZSBhbmRyb2lkX1N1cmZhY2VfZ2V0RUdMTmF0aXZlV2luZG93KAorc3A8QU5hdGl2ZVdpbmRvdz4gYW5kcm9pZF9TdXJmYWNlX2dldE5hdGl2ZVdpbmRvdygKICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopIHsKICAgICByZXR1cm4gZ2V0U3VyZmFjZShlbnYsIGNsYXp6KS5nZXQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9FR0xJbXBsLmNwcCBiL2NvcmUvam5pL2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9FR0xJbXBsLmNwcAppbmRleCBkNWNkZTQ4Li45NDFlZDYzIDEwMDY0NAotLS0gYS9jb3JlL2puaS9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfRUdMSW1wbC5jcHAKKysrIGIvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAqLwogCiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfdmlld19TdXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCiAjaW5jbHVkZSA8RUdML2VnbC5oPgpAQCAtMjcsOSArMjgsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWV4dGVybiBFR0xOYXRpdmVXaW5kb3dUeXBlIGFuZHJvaWRfU3VyZmFjZV9nZXRFR0xOYXRpdmVXaW5kb3coCi0gICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KTsKLQogc3RhdGljIGpjbGFzcyBnRGlzcGxheV9jbGFzczsKIHN0YXRpYyBqY2xhc3MgZ0NvbnRleHRfY2xhc3M7CiBzdGF0aWMgamNsYXNzIGdTdXJmYWNlX2NsYXNzOwpAQCAtMzI1LDcgKzMyMyw3IEBACiAgICAgfQogICAgIEVHTERpc3BsYXkgZHB5ID0gZ2V0RGlzcGxheShfZW52LCBkaXNwbGF5KTsKICAgICBFR0xDb250ZXh0IGNuZiA9IGdldENvbmZpZyhfZW52LCBjb25maWcpOwotICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gMDsKKyAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3c7CiAgICAgaWYgKG5hdGl2ZV93aW5kb3cgPT0gTlVMTCkgewogbm90X3ZhbGlkX3N1cmZhY2U6CiAgICAgICAgIGRvVGhyb3coX2VudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLApAQCAtMzMzLDEyICszMzEsMTIgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgd2luZG93ID0gYW5kcm9pZF9TdXJmYWNlX2dldEVHTE5hdGl2ZVdpbmRvdyhfZW52LCBuYXRpdmVfd2luZG93KTsKKyAgICB3aW5kb3cgPSBhbmRyb2lkX1N1cmZhY2VfZ2V0TmF0aXZlV2luZG93KF9lbnYsIG5hdGl2ZV93aW5kb3cpOwogICAgIGlmICh3aW5kb3cgPT0gTlVMTCkKICAgICAgICAgZ290byBub3RfdmFsaWRfc3VyZmFjZTsKIAogICAgIGppbnQqIGJhc2UgPSBiZWdpbk5hdGl2ZUF0dHJpYkxpc3QoX2VudiwgYXR0cmliX2xpc3QpOwotICAgIEVHTFN1cmZhY2Ugc3VyID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNuZiwgd2luZG93LCBiYXNlKTsKKyAgICBFR0xTdXJmYWNlIHN1ciA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjbmYsIHdpbmRvdy5nZXQoKSwgYmFzZSk7CiAgICAgZW5kTmF0aXZlQXR0cmlidXRlTGlzdChfZW52LCBhdHRyaWJfbGlzdCwgYmFzZSk7CiAgICAgcmV0dXJuIChqaW50KXN1cjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2N1cnNvcl9jb250cm9sbGVyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2N1cnNvcl9jb250cm9sbGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBhZGVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY3Vyc29yX2NvbnRyb2xsZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NlbGVjdGlvbl9lbmRfaGFuZGxlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NlbGVjdGlvbl9lbmRfaGFuZGxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjRhYjU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2VsZWN0aW9uX2VuZF9oYW5kbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NlbGVjdGlvbl9zdGFydF9oYW5kbGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2VsZWN0aW9uX3N0YXJ0X2hhbmRsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2ZjI0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NlbGVjdGlvbl9zdGFydF9oYW5kbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfYmx1ZXRvb3RoLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfYmx1ZXRvb3RoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxMzIzNy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19waG9uZV9jYWxsX2JsdWV0b290aC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19waG9uZV9jYWxsX3JpbmdpbmcucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcGhvbmVfY2FsbF9yaW5naW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwNzEzYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19waG9uZV9jYWxsX3JpbmdpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdnBfcGhvbmVfY2FsbF9ibHVldG9vdGgucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdnBfcGhvbmVfY2FsbF9ibHVldG9vdGgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEzMjM3Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGxfYmx1ZXRvb3RoLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2N1cnNvcl9jb250cm9sbGVyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2N1cnNvcl9jb250cm9sbGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYThhNDU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY3Vyc29yX2NvbnRyb2xsZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3NlbGVjdGlvbl9lbmRfaGFuZGxlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3NlbGVjdGlvbl9lbmRfaGFuZGxlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTA3NWViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc2VsZWN0aW9uX2VuZF9oYW5kbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3NlbGVjdGlvbl9zdGFydF9oYW5kbGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc2VsZWN0aW9uX3N0YXJ0X2hhbmRsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwMjJmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3NlbGVjdGlvbl9zdGFydF9oYW5kbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfYmx1ZXRvb3RoLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfYmx1ZXRvb3RoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FiZmQxOS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0X3N5c19waG9uZV9jYWxsX2JsdWV0b290aC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0X3N5c19waG9uZV9jYWxsX3JpbmdpbmcucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdF9zeXNfcGhvbmVfY2FsbF9yaW5naW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0ZDA2Mi4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0X3N5c19waG9uZV9jYWxsX3JpbmdpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdF9zeXNfdnBfcGhvbmVfY2FsbF9ibHVldG9vdGgucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdF9zeXNfdnBfcGhvbmVfY2FsbF9ibHVldG9vdGgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWJmZDE5Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGxfYmx1ZXRvb3RoLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvZGVmYXVsdF93YWxscGFwZXIuanBnIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMmYwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvZGVmYXVsdF93YWxscGFwZXIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAppbmRleCA2ZjlmMWUwLi4xNDE0MDMyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCkBAIC0xLDggKzEsNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDwhLS0KLS8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLyogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCiAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCiAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIApAQCAtMTcsOCArMTUsNDIgQEAKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIC0tPgotPExpc3RWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKLSAgICAvPgorPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIAorICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9wcm9ncmVzc0NvbnRhaW5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIj4KKyAgICAgICAgCisgICAgICAgIDxQcm9ncmVzc0JhciBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9wcm9ncmVzc0JhclN0eWxlTGFyZ2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2FkaW5nIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+CisgICAgICAgICAgICAKKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgCisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbGlzdENvbnRhaW5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgICAgICAgICAgCisgICAgICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIiAvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL2ludGVybmFsRW1wdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiIC8+CisgICAgPC9GcmFtZUxheW91dD4KKyAgICAgICAgCis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfcmljaC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9yaWNoLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxNDAzMi4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9yaWNoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0vKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotLS0+Ci08RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+Ci0gICAgCi0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzQ29udGFpbmVyIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiPgotICAgICAgICAKLSAgICAgICAgPFByb2dyZXNzQmFyIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVMYXJnZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvYWRpbmciCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgIAotICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICAKLSAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9saXN0Q29udGFpbmVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+Ci0gICAgICAgICAgICAKLSAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiIC8+Ci0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvaW50ZXJuYWxFbXB0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIgLz4KLSAgICA8L0ZyYW1lTGF5b3V0PgotICAgICAgICAKLTwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9zaW1wbGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjlmMWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCisgICAgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZmRmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2FueS9kaW1lbnMueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXM+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaGVpZ2h0Ij41MGRpcDwvZGltZW4+CisgICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN0YXR1cyBiYXIgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaWNvbl9zaXplIj41MGRpcDwvZGltZW4+CisgICAgPCEtLSBNYXJnaW4gYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBpZ25vcmUgdG91Y2ggZXZlbnRzIGZvciBpbiB0aGUgd2luZG93c2hhZGUuIC0tPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKaW5kZXggYjNmMjgwYi4uNjcwNzJiNiAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKQEAgLTk0Miw2ICs5NDIsMjEgQEAKICAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9QQUdFX0RPV04iIHZhbHVlPSI5MyIgLz4KICAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9QSUNUU1lNQk9MUyIgdmFsdWU9Ijk0IiAvPgogICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX1NXSVRDSF9DSEFSU0VUIiB2YWx1ZT0iOTUiIC8+CisgICAgICAgIDxlbnVtIG5hbWU9IktFWUNPREVfQlVUVE9OX0EiIHZhbHVlPSI5NiIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fQiIgdmFsdWU9Ijk3IiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9DIiB2YWx1ZT0iOTgiIC8+CisgICAgICAgIDxlbnVtIG5hbWU9IktFWUNPREVfQlVUVE9OX1giIHZhbHVlPSI5OSIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fWSIgdmFsdWU9IjEwMCIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fWiIgdmFsdWU9IjEwMSIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fTDEiIHZhbHVlPSIxMDIiIC8+CisgICAgICAgIDxlbnVtIG5hbWU9IktFWUNPREVfQlVUVE9OX1IxIiB2YWx1ZT0iMTAzIiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9MMiIgdmFsdWU9IjEwNCIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fUjIiIHZhbHVlPSIxMDUiIC8+CisgICAgICAgIDxlbnVtIG5hbWU9IktFWUNPREVfQlVUVE9OX1RIVU1CTCIgdmFsdWU9IjEwNiIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fVEhVTUJSIiB2YWx1ZT0iMTA3IiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9TVEFSVCIgdmFsdWU9IjEwOCIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fU0VMRUNUIiB2YWx1ZT0iMTA5IiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9NT0RFIiB2YWx1ZT0iMTEwIiAvPgogICAgIDwvYXR0cj4KIAogICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKaW5kZXggNjFlN2I4OC4uNGQ2N2JkZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApAQCAtNDUsNCArNDUsNiBAQAogICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0Ij41NmRpcDwvZGltZW4+CiAgICAgPCEtLSBEZWZhdWx0IGNvcnJlY3Rpb24gZm9yIHRoZSBzcGFjZSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIC0tPgogICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9zcGFjZWJhcl92ZXJ0aWNhbF9jb3JyZWN0aW9uIj40ZGlwPC9kaW1lbj4KKyAgICA8IS0tIERpc3RhbmNlIGJldHdlZW4gdGhlIHRleHQgYmFzZSBsaW5lIGFuZCB2aXJ0dWFsIGZpbmdlciBwb3NpdGlvbiB1c2VkIHRvIHBvc2l0aW9uIGN1cnNvciAtLT4KKyAgICA8ZGltZW4gbmFtZT0iY3Vyc29yX2NvbnRyb2xsZXJfdmVydGljYWxfb2Zmc2V0Ij4xMmRwPC9kaW1lbj4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCmluZGV4IGI5ZTVlODQuLmQwYmU1NTQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKQEAgLTg2OSw4ICs4NjksMTEgQEAKICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic3RhdF9zeXNfZG93bmxvYWQiIGlkPSIweDAxMDgwMDgxIiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzdGF0X3N5c19kb3dubG9hZF9kb25lIiBpZD0iMHgwMTA4MDA4MiIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic3RhdF9zeXNfaGVhZHNldCIgaWQ9IjB4MDEwODAwODMiIC8+CisgIDwhLS0gQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYSBwcml2YXRlIGFzc2V0IGluIHRoZSBwaG9uZSBhcHAuIC0tPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzdGF0X3N5c19waG9uZV9jYWxsIiBpZD0iMHgwMTA4MDA4NCIgLz4KKyAgPCEtLSBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBhIHByaXZhdGUgYXNzZXQgaW4gdGhlIHBob25lIGFwcC4gLS0+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InN0YXRfc3lzX3Bob25lX2NhbGxfZm9yd2FyZCIgaWQ9IjB4MDEwODAwODUiIC8+CisgIDwhLS0gQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgYSBwcml2YXRlIGFzc2V0IGluIHRoZSBwaG9uZSBhcHAuIC0tPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzdGF0X3N5c19waG9uZV9jYWxsX29uX2hvbGQiIGlkPSIweDAxMDgwMDg2IiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzdGF0X3N5c19zcGVha2VycGhvbmUiIGlkPSIweDAxMDgwMDg3IiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzdGF0X3N5c191cGxvYWQiIGlkPSIweDAxMDgwMDg4IiAvPgpAQCAtMTEzMiw3ICsxMTM1LDkgQEAKICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2UiIGlkPSIweDAxMDMwMDVjIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZSIgaWQ9IjB4MDEwMzAwNWQiIC8+CiAKKyAgPCEtLSBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBhIHByaXZhdGUgYXNzZXQgaW4gdGhlIHBob25lIGFwcC4gLS0+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InN0YXRfc3lzX3ZwX3Bob25lX2NhbGwiIGlkPSIweDAxMDgwMGE3IiAvPgorICA8IS0tIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBhc3NldCBpbiB0aGUgcGhvbmUgYXBwLiAtLT4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic3RhdF9zeXNfdnBfcGhvbmVfY2FsbF9vbl9ob2xkIiBpZD0iMHgwMTA4MDBhOCIgLz4KIAogICA8cHVibGljIHR5cGU9ImFuaW0iIG5hbWU9ImFudGljaXBhdGVfaW50ZXJwb2xhdG9yIiBpZD0iMHgwMTBhMDAwNyIgLz4KQEAgLTEyNDYsNiArMTI1MSw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibG9nbyIgaWQ9IjB4MDEwMTAyYmUiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ieGxhcmdlU2NyZWVucyIgaWQ9IjB4MDEwMTAyYmYiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaGVhdnlXZWlnaHQiIGlkPSIweDAxMDEwMmMwIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImltbWVyc2l2ZSIgaWQ9IjB4MDEwMTAyYzEiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhdHRyIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwMTAzMDAiIC8+CiAKICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImlkIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwMjAwNDAiIC8+CkBAIC0xMzA5LDQgKzEzMTUsMTEgQEAKICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LlNwaW5uZXIuRHJvcERvd24iIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24iIC8+CiAKKyAgPCEtLSBTdGFuZGFyZCBjb250ZW50IHZpZXcgZm9yIGEge0BsaW5rIGFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudH0uCisgICAgICAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYSBzdWJjbGFzcyBvZiBMaXN0RnJhZ21lbnQgd2l0aCB5b3VyCisgICAgICAgb3duIGN1c3RvbWl6ZWQgY29udGVudCwgeW91IGNhbiBpbmNsdWRlIHRoaXMgbGF5b3V0IGluIHRoYXQKKyAgICAgICBjb250ZW50IHRvIHN0aWxsIHJldGFpbiBhbGwgb2YgdGhlIHN0YW5kYXJkIGZ1bmN0aW9uYWxpdHkgb2YKKyAgICAgICB0aGUgYmFzZSBjbGFzcy4gLS0+CisgIDxwdWJsaWMgdHlwZT0ibGF5b3V0IiBuYW1lPSJsaXN0X2NvbnRlbnQiIC8+CisgIAogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCBmYjgyYjkzLi43YTgwODg0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTE2MDUsNyArMTYwNSw3IEBACiAKICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgc3RyaW5nIC0tPgogICAgIDxzdHJpbmcgbmFtZT0id2ViX3VzZXJfYWdlbnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPk1vemlsbGEvNS4wIChMaW51eDsgVTsgPHhsaWZmOmcgaWQ9IngiPkFuZHJvaWQgJXM8L3hsaWZmOmc+KQotICAgICAgICBBcHBsZVdlYktpdC81MzQuMSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIDx4bGlmZjpnIGlkPSJtb2JpbGUiPiVzPC94bGlmZjpnPlNhZmFyaS81MzQuMTwvc3RyaW5nPgorICAgICAgICBBcHBsZVdlYktpdC81MzQuMyAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIDx4bGlmZjpnIGlkPSJtb2JpbGUiPiVzPC94bGlmZjpnPlNhZmFyaS81MzQuMzwvc3RyaW5nPgogCiAgICAgPCEtLSBUaXRsZSBmb3IgYSBKYXZhU2NyaXB0IGRpYWxvZy4gIlRoZSBwYWdlIGF0IDx1cmwgb2YgY3VycmVudCBwYWdlPiBzYXlzOiIgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfdGl0bGUiPlRoZSBwYWdlIGF0IFwnPHhsaWZmOmcgaWQ9InRpdGxlIj4lczwveGxpZmY6Zz5cJyBzYXlzOjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmluZGV4IDQ0OWI1NmMuLjNjMDlhODkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTYyNiw3ICs2MjYsNyBAQAogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+I0ZGRkY5MjAwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+I0QwNzdBMTRCPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPiM1QzVDRkY8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE2c3A8L2l0ZW0+CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEKaW5kZXggYzg2YmRmYS4uZTMzNDIxYSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VHZW5lcmFsVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKQEAgLTk1MywyMSArOTUyLDYgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYkNsb3NlUmVsZWFzaW5nQWxsQ2FjaGVkU3FsKCkgewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCB0ZXh0MSBURVhULCB0ZXh0MiBURVhULCAiICsKLSAgICAgICAgICAgICAgICAibnVtMSBJTlRFR0VSLCBudW0yIElOVEVHRVIsIGltYWdlIEJMT0IpOyIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3RhdGVtZW50ID0gIkRFTEVURSBGUk9NIHRlc3QgV0hFUkUgX2lkPT87IjsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudERvTm90Q2xvc2UgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKSA+IDApOwotICAgICAgICBpbnQgblN0YXRlbWVudCA9IHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnREb05vdENsb3NlLmdldFVuaXF1ZUlkKCkgPT0gblN0YXRlbWVudCk7Ci0gICAgICAgIC8qIGRvIG5vdCBjbG9zZSBzdGF0ZW1lbnREb05vdENsb3NlIG9iamVjdC4gCi0gICAgICAgICAqIFRoYXQgc2hvdWxkIGxlYXZlIGl0IGluIFNRTGl0ZURhdGFiYXNlLm1Qcm9ncmFtcy4KLSAgICAgICAgICogbURhdGFiYXNlLmNsb3NlKCkgaW4gdGVhckRvd24oKSBzaG91bGQgcmVsZWFzZSBpdC4KLSAgICAgICAgICovCi0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VtaWNvbG9uc0luU3RhdGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHByYWdtYV90ZXN0ICgiICsKICAgICAgICAgICAgICAgICAiaSBJTlRFR0VSIERFRkFVTFQgMTIzNCwgIiArCkBAIC0xMTAzLDI5ICsxMDg3LDYgQEAKICAgICB9CiAKICAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExydUNhY2hpbmdPZlNxbGl0ZUNvbXBpbGVkU3FsT2JqcygpIHsKLSAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCwgaiBpbnQpOyIpOwotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSwxKTsiKTsKLSAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUKLSAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7Ci0gICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7Ci0KLSAgICAgICAgLy8gZG8gTisxIHF1ZXJpZXMgLSBhbmQgd2hlbiB0aGUgMHRoIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSBMUlUgY2FjaGUgZHVlIHRvIHRoZQotICAgICAgICAvLyBpbnNlcnRpb24gb2YgKE4rMSl0aCBlbnRyeSwgbWFrZSBzdXJlIDB0aCBlbnRyeSBpcyBjbG9zZWQKLSAgICAgICAgQXJyYXlMaXN0PFNRTGl0ZVN0YXRlbWVudD4gc3RtdE9ianMgPSBuZXcgQXJyYXlMaXN0PFNRTGl0ZVN0YXRlbWVudD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOKzE7IGkrKykgewotICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IGMgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudCgic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIGkgPSAiICsgaSk7Ci0gICAgICAgICAgICBjLmNsb3NlKCk7Ci0gICAgICAgICAgICBzdG10T2Jqcy5hZGQoaSwgYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdE9ianMuZ2V0KDApLmdldFVuaXF1ZUlkKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE4rMTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHN0bXRPYmpzLmdldChpKS5nZXRVbmlxdWVJZCgpID4gMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldE1heENhaGVzaXplKCkgewogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKGkgaW50LCBqIGludCk7Iik7CiAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygxLDEpOyIpOwpAQCAtMTIzMiwxNzIgKzExOTMsNCBAQAogICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCIpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogdGVzdCB0byBtYWtlIHN1cmUgdGhlIHN0YXRlbWVudCBmaW5hbGl6YXRpb25zIGFyZSBub3QgZG9uZSByaWdodCBhd2F5IGJ1dAotICAgICAqIHBpZ2d5YmFja2VkIG9udG8gdGhlIG5leHQgc3FsIHN0YXRlbWVudCBleGVjdXRpb24gb24gdGhlIHNhbWUgZGF0YWJhc2UuCi0gICAgICovCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZSgpIHsKLSAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCk7Iik7Ci0gICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZVwKLSAgICAgICAgaW50IE4gPSAyNjsKLSAgICAgICAgbURhdGFiYXNlLnNldE1heFNxbENhY2hlU2l6ZShOKTsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQ7Ci0gICAgICAgIGludCBzdG10MElkID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpICsrKSB7Ci0gICAgICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIik7Iik7Ci0gICAgICAgICAgICBzdG10LmV4ZWN1dGVJbnNlcnQoKTsKLSAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5Ci0gICAgICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RtdDBJZCA9IHN0bXQuZ2V0VW5pcXVlSWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0bXQuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSBpID0gMTsiKTsKLSAgICAgICAgc3RtdDEuY2xvc2UoKTsKLQotICAgICAgICAvLyB0aGUgYWJvdmUgY2xvc2UoKSBzaG91bGQgaGF2ZSBxdWV1ZWRVcCB0aGUgc3RhdGVtZW50IGZvciBmaW5hbGl6YXRpb24KLSAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXQwSWQpKTsKLQotICAgICAgICAvLyBleGVjdXRlIHNvbWV0aGluZyB0byBzZWUgaWYgdGhpcyBzdGF0ZW1lbnQgZ2V0cyBmaW5hbGl6ZWQKLSAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImRlbGV0ZSBmcm9tIHRlc3Qgd2hlcmUgaSA9IDEwOyIpOwotICAgICAgICBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RhdGVtZW50SWRzLnNpemUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2FtZSBhcyBhYm92ZSAtIGV4Y2VwdCB0aGF0IHRoZSBzdGF0ZW1lbnQgdG8gYmUgZmluYWxpemVkIGlzIGZyb20gVGhyZWFkICMgMS4KLSAgICAgKiBhbmQgaXQgaXMgZXZlbnR1YWxseSBmaW5hbGl6ZWQgaW4gVGhyZWFkICMgMiB3aGVuIGl0IGV4ZWN1dGVzIGEgc3FsIHN0YXRlbWVudC4KLSAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICovCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZURpZmZUaHJlYWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKGkgaW50KTsiKTsKLSAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlIGluIGEgdGhyZWFkCi0gICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGludCBOID0gMjY7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldE1heFNxbENhY2hlU2l6ZShOKTsKLSAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KCJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIpOyIpOwotICAgICAgICAgICAgICAgICAgICBzdG10LmV4ZWN1dGVJbnNlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiAwdGggZW50cnkKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RtdDBJZChzdG10LmdldFVuaXF1ZUlkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0bXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHQxLnN0YXJ0KCk7Ci0gICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoCi0gICAgICAgIHQxLmpvaW4oKTsKLQotICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCi0gICAgICAgIC8vIGp1c3QgZm9yIHRoZSBoZWNrIG9mIGl0LCBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAotICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdDEgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgKiBmcm9tIHRlc3Qgd2hlcmUgaSA9IDE7Iik7Ci0gICAgICAgICAgICAgICAgc3RtdDEuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgdDIuam9pbigpOwotCi0gICAgICAgIC8vIGNsb3NlKCkgaW4gdGhlIGFib3ZlIHRocmVhZCBzaG91bGQgaGF2ZSBxdWV1ZWRVcCB0aGUgc3RhdGVtZW50IGZvciBmaW5hbGl6YXRpb24KLSAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoZ2V0U3RtdDBJZCgpID4gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXQwSWQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0YXRlbWVudElkcy5zaXplKCkpOwotCi0gICAgICAgIC8vIGV4ZWN1dGUgc29tZXRoaW5nIHRvIHNlZSBpZiB0aGlzIHN0YXRlbWVudCBnZXRzIGZpbmFsaXplZAotICAgICAgICAvLyBhZ2FpbiBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAotICAgICAgICBUaHJlYWQgdDMgPSBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiZGVsZXRlIGZyb20gdGVzdCB3aGVyZSBpID0gMTA7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHQzLnN0YXJ0KCk7Ci0gICAgICAgIHQzLmpvaW4oKTsKLQotICAgICAgICAvLyBpcyB0aGUgc3RhdGVtZW50IGZpbmFsaXplZD8KLSAgICAgICAgc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0YXRlbWVudElkcy5zaXplKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IHN0bXQwSWQgPSAwOwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0U3RtdDBJZChpbnQgc3RtdDBJZCkgewotICAgICAgICB0aGlzLnN0bXQwSWQgPSBzdG10MElkOwotICAgIH0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnQgZ2V0U3RtdDBJZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc3RtdDBJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzYW1lIGFzIGFib3ZlIC0gZXhjZXB0IHRoYXQgdGhlIHF1ZXVlIG9mIHN0YXRlbWVudHMgdG8gYmUgZmluYWxpemVkIGFyZSBmaW5hbGl6ZWQKLSAgICAgKiBieSBkYXRhYmFzZSBjbG9zZSgpIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudENsb3NlQnlEYkNsb3NlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCk7Iik7Ci0gICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZSBpbiBhIHRocmVhZAotICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgTiA9IDI2OwotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7Ci0gICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0bXQgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgc3RtdC5leGVjdXRlSW5zZXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0bXQwSWQoc3RtdC5nZXRVbmlxdWVJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdG10LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaAotICAgICAgICB0MS5qb2luKCk7Ci0KLSAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHRvIHRoZSBjYWNoZSAtIGFuZCB0aGUgYWJvdmUgJ3N0bXQwSWQnIHNob3VsZCBmYWxsIG91dCBvZiBjYWNoZQotICAgICAgICAvLyBqdXN0IGZvciB0aGUgaGVjayBvZiBpdCwgZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLSAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIGkgPSAxOyIpOwotICAgICAgICAgICAgICAgIHN0bXQxLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHQyLnN0YXJ0KCk7Ci0gICAgICAgIHQyLmpvaW4oKTsKLQotICAgICAgICAvLyBjbG9zZSgpIGluIHRoZSBhYm92ZSB0aHJlYWQgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0YXRlbWVudCBmb3IgZmluYWxpemF0aW9uCi0gICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOwotICAgICAgICBhc3NlcnRUcnVlKGdldFN0bXQwSWQoKSA+IDApOwotICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKLQotICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2UuIGV2ZXJ5dGhpbmcgZnJvbSBtQ2xvc2VkU3RhdGVtZW50SWRzIGluIG1EYXRhYmFzZQotICAgICAgICAvLyBzaG91bGQgYmUgZmluYWxpemVkIGFuZCBjbGVhcmVkIGZyb20gdGhlIGxpc3QKLSAgICAgICAgLy8gYWdhaW4gZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLSAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHQzLnN0YXJ0KCk7Ci0gICAgICAgIHQzLmpvaW4oKTsKLQotICAgICAgICAvLyBjaGVjayBtQ2xvc2VkU3RhdGVtZW50SWRzIGluIG1EYXRhYmFzZS4gaXQgc2hvdWxkIGJlIGVtcHR5Ci0gICAgICAgIHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvQWJzdHJhY3RKREJDRHJpdmVyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0Fic3RyYWN0SkRCQ0RyaXZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljN2JjYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvQWJzdHJhY3RKREJDRHJpdmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuRHJpdmVyTWFuYWdlcjsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKLQotLyoqCi0gKiBUZXN0cyBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBtZXRob2RzIG9mIHNxbCBsaWtlIGNyZWF0aW5nIGEgY29ubmVjdGlvbiwKLSAqIGluc2VydGluZywgc2VsZWN0aW5nLCB1cGRhdGluZy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SkRCQ0RyaXZlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKREJDRHJpdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbm5lY3Rpb24gZmlyc3RDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgQ29ubmVjdGlvbiBzZWNvbmRDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgRmlsZSBkYkZpbGUgPSBnZXREYkZpbGUoKTsKLSAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25VUkwgPSBnZXRDb25uZWN0aW9uVVJMKCk7Ci0gICAgICAgIFN0YXRlbWVudCBmaXJzdFN0bXQgPSBudWxsOwotICAgICAgICBTdGF0ZW1lbnQgc2Vjb25kU3RtdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKGdldEpEQkNEcml2ZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICBmaXJzdENvbm5lY3Rpb24gPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24oY29ubmVjdGlvblVSTCk7Ci0gICAgICAgICAgICBzZWNvbmRDb25uZWN0aW9uID0gRHJpdmVyTWFuYWdlci5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25VUkwpOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBvbmVzID0geyJoZWxsbyEiLCAiZ29vZGJ5ZSJ9OwotICAgICAgICAgICAgc2hvcnRbXSB0d29zID0gezEwLCAyMH07Ci0gICAgICAgICAgICBTdHJpbmdbXSBvbmVzVXBkYXRlZCA9IG5ldyBTdHJpbmdbb25lcy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgb25lc1VwZGF0ZWRbaV0gPSBvbmVzW2ldICsgdHdvc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpcnN0U3RtdCA9IGZpcnN0Q29ubmVjdGlvbi5jcmVhdGVTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgIGZpcnN0U3RtdC5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGJsMShvbmUgdmFyY2hhcigxMCksIHR3byBzbWFsbGludCkiKTsKLSAgICAgICAgICAgIHNlY29uZFN0bXQgPSBzZWNvbmRDb25uZWN0aW9uLmNyZWF0ZVN0YXRlbWVudCgpOwotCi0gICAgICAgICAgICBhdXRvQ29tbWl0SW5zZXJ0U2VsZWN0VGVzdChmaXJzdFN0bXQsIG9uZXMsIHR3b3MpOwotICAgICAgICAgICAgdXBkYXRlU2VsZWN0Q29tbWl0U2VsZWN0VGVzdChmaXJzdFN0bXQsIHNlY29uZFN0bXQsIG9uZXMsIG9uZXNVcGRhdGVkLCB0d29zKTsKLSAgICAgICAgICAgIHVwZGF0ZVNlbGVjdFJvbGxiYWNrU2VsZWN0VGVzdChmaXJzdFN0bXQsIHNlY29uZFN0bXQsIG9uZXNVcGRhdGVkLCBvbmVzLCB0d29zKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlQ29ubmVjdGlvbnMoZmlyc3RDb25uZWN0aW9uLCBzZWNvbmRDb25uZWN0aW9uLCBkYkZpbGUsIGZpcnN0U3RtdCwgc2Vjb25kU3RtdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEpEQkNEcml2ZXJDbGFzc05hbWUoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbm5lY3Rpb25VUkwoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXREYkZpbGUoKTsKLQotICAgIHByaXZhdGUgdm9pZCBjbG9zZUNvbm5lY3Rpb25zKENvbm5lY3Rpb24gZmlyc3RDb25uZWN0aW9uLCBDb25uZWN0aW9uIHNlY29uZENvbm5lY3Rpb24sCi0gICAgICAgICAgICBGaWxlIGRiRmlsZSwgU3RhdGVtZW50IGZpcnN0U3RtdCwgU3RhdGVtZW50IHNlY29uZFN0bXQpIHsKLSAgICAgICAgU3RyaW5nIGZhaWxUZXh0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChmaXJzdFN0bXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpcnN0U3RtdC5leGVjdXRlKCJkcm9wIHRhYmxlIHRibDEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWxUZXh0ID0gZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChmaXJzdFN0bXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpcnN0U3RtdC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbFRleHQgPSBlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGZpcnN0Q29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmlyc3RDb25uZWN0aW9uLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsVGV4dCA9IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2Vjb25kU3RtdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2Vjb25kU3RtdC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbFRleHQgPSBlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNlY29uZENvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlY29uZENvbm5lY3Rpb24uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWxUZXh0ID0gZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGJGaWxlLmRlbGV0ZSgpOwotICAgICAgICBhc3NlcnROdWxsKGZhaWxUZXh0LCBmYWlsVGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgdmFsdWVzIGZyb20gJ29uZXMnIHdpdGggdGhlIHZhbHVlcyBmcm9tICd0d29zJyBpbnRvICd0YmwxJwotICAgICAqIEBwYXJhbSBzdG10IHRoZSBzdGF0ZW1lbnQgdG8gdXNlIGZvciB0aGUgaW5zZXJ0cy4KLSAgICAgKiBAcGFyYW0gb25lcyB0aGUgc3RyaW5nIHZhbHVlcyB0byBpbnNlcnQgaW50byB0YmwxLgotICAgICAqIEBwYXJhbSB0d29zIHRoZSBjb3JyZXNwb25kaW5nIG51bWVyaWNhbCB2YWx1ZXMgdG8gaW5zZXJ0IGludG8gdGJsMS4KLSAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgcHJvYmxlbSBkdXJpbmcgaW5zZXJ0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdXRvQ29tbWl0SW5zZXJ0U2VsZWN0VGVzdChTdGF0ZW1lbnQgc3RtdCwgU3RyaW5nW10gb25lcywKLSAgICAgICAgICAgIHNob3J0W10gdHdvcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb25lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc3RtdC5leGVjdXRlKCJpbnNlcnQgaW50byB0YmwxIHZhbHVlcygnIiArIG9uZXNbaV0gKyAiJywiICsgdHdvc1tpXQotICAgICAgICAgICAgICAgICAgICArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0QWxsRnJvbVRibDEoc3RtdCwgb25lcywgdHdvcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0cyB0aGF0IGFsbCB2YWx1ZXMgdGhhdCB3aGVyZSBhZGRlZCB0byB0YmwxIGFyZSBhY3R1YWxseSBpbiB0YmwxLgotICAgICAqIEBwYXJhbSBzdG10IHRoZSBzdGF0ZW1lbnQgdG8gdXNlIGZvciB0aGUgc2VsZWN0LgotICAgICAqIEBwYXJhbSBvbmVzIHRoZSBzdHJpbmcgdmFsdWVzIHRoYXQgd2hlcmUgYWRkZWQuCi0gICAgICogQHBhcmFtIHR3b3MgdGhlIG51bWVyaWNhbCB2YWx1ZXMgdGhhdCB3aGVyZSBhZGRlZC4KLSAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgcHJvYmxlbSBkdXJpbmcgc2VsZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBbGxGcm9tVGJsMShTdGF0ZW1lbnQgc3RtdCwgU3RyaW5nW10gb25lcywgc2hvcnRbXSB0d29zKQotICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlc3VsdFNldCBycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCJzZWxlY3QgKiBmcm9tIHRibDEiKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKDsgcnMubmV4dCgpOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaSA8IG9uZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhvbmVzW2ldLCBycy5nZXRTdHJpbmcoIm9uZSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh0d29zW2ldLCBycy5nZXRTaG9ydCgidHdvIikpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhpLCBvbmVzLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIHJlc3VsdHMgb2YgYW4gdXBkYXRlIGZvbGxvd2VkIGJ6IGEgc2VsZWN0IG9uIGEgZGlmZnJlbnQgc3RhdGVtZW50LgotICAgICAqIEFmdGVyIHRoYXQgdGhlIGZpcnN0IHN0YXRlbWVudCBjb21taXRzIGl0cyB1cGRhdGUuIGFuZCBub3cgdGhlIHNlY29uZCAKLSAgICAgKiBzdGF0ZW1lbnQgc2hvdWxkIGFsc28gYmUgYWJsZSB0byBzZWUgdGhlIGNoYW5nZWQgdmFsdWVzIGluIGEgc2VsZWN0LgotICAgICAqIEBwYXJhbSBmaXJzdFN0bXQgdGhlIHN0YXRlbWVudCB0byB1c2UgZm9yIHRoZSB1cGRhdGUgYW5kIGNvbW1pdC4KLSAgICAgKiBAcGFyYW0gc2Vjb25kU3RtdCB0aGUgc3RhdGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGNvbW1pdCB3b3JrcwotICAgICAqIEBwYXJhbSBvbmVzIHRoZSBvcmlnaW5hbCBzdHJpbmcgdmFsdWVzLgotICAgICAqIEBwYXJhbSBvbmVzVXBkYXRlZCB0aGUgdXBkYXRlZCBzdHJpbmcgdmFsdWVzLgotICAgICAqIEBwYXJhbSB0d29zIHRoZSBudW1lcmljYWwgdmFsdWVzLgotICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBwcm9ibGVtIGR1cmluZyBhbnkgb2YgdGhlIGV4ZWN1dGVkIGNvbW1hbmRzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3RDb21taXRTZWxlY3RUZXN0KFN0YXRlbWVudCBmaXJzdFN0bXQsCi0gICAgICAgICAgICBTdGF0ZW1lbnQgc2Vjb25kU3RtdCwgU3RyaW5nW10gb25lcywgU3RyaW5nW10gb25lc1VwZGF0ZWQsCi0gICAgICAgICAgICBzaG9ydFtdIHR3b3MpIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICBmaXJzdFN0bXQuZ2V0Q29ubmVjdGlvbigpLnNldEF1dG9Db21taXQoZmFsc2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXBkYXRlT25lcyhmaXJzdFN0bXQsIG9uZXNVcGRhdGVkLCB0d29zKTsKLSAgICAgICAgICAgIGFzc2VydEFsbEZyb21UYmwxKHNlY29uZFN0bXQsIG9uZXMsIHR3b3MpOwotICAgICAgICAgICAgZmlyc3RTdG10LmdldENvbm5lY3Rpb24oKS5jb21taXQoKTsKLSAgICAgICAgICAgIGFzc2VydEFsbEZyb21UYmwxKHNlY29uZFN0bXQsIG9uZXNVcGRhdGVkLCB0d29zKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGZpcnN0U3RtdC5nZXRDb25uZWN0aW9uKCkuc2V0QXV0b0NvbW1pdCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGlmIGFuIHVwZGF0ZSBmb2xsb3dlZCBieSBhIHNlbGVjdCB3b3Jrcy4gQWZ0ZXIgdGhhdCBhIHJvbGxiYWNrIHdpbGwgCi0gICAgICogYmUgbWFkZSBhbmQgYWdhaW4gYSBzZWxlY3Qgc2hvdWxkIHNob3cgdGhhdCB0aGUgcm9sbGJhY2sgd29ya2VkLiAKLSAgICAgKiBAcGFyYW0gZmlyc3RTdG10IHRoZSBzdGF0ZW1lbnQgdG8gdXNlIGZvciB0aGUgdXBkYXRlIGFuZCB0aGUgcm9sbGJhY2sKLSAgICAgKiBAcGFyYW0gc2Vjb25kU3RtdCB0aGUgc3RhdGVtZW50IHRvIHVzZSBmb3IgY2hlY2tpbmcgaWYgdGhlIHJvbGxiYWNrIHdvcmtlZCBhcyBpbnRlbmRlZC4KLSAgICAgKiBAcGFyYW0gb25lcyB0aGUgb3JpZ2luYWwgc3RyaW5nIHZhbHVlcy4KLSAgICAgKiBAcGFyYW0gb25lc1VwZGF0ZWQgdGhlIHVwZGF0ZWQgc3RyaW5nIHZhbHVlcy4KLSAgICAgKiBAcGFyYW0gdHdvcyB0aGUgbm9tZXJpY2FsIHZhbHVlcy4KLSAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgcHJvYmxlbSBkdXJpbmcgYW55IGNvbW1hbmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdFJvbGxiYWNrU2VsZWN0VGVzdChTdGF0ZW1lbnQgZmlyc3RTdG10LAotICAgICAgICAgICAgU3RhdGVtZW50IHNlY29uZFN0bXQsIFN0cmluZ1tdIG9uZXMsIFN0cmluZ1tdIG9uZXNVcGRhdGVkLAotICAgICAgICAgICAgc2hvcnRbXSB0d29zKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgZmlyc3RTdG10LmdldENvbm5lY3Rpb24oKS5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHVwZGF0ZU9uZXMoZmlyc3RTdG10LCBvbmVzVXBkYXRlZCwgdHdvcyk7Ci0gICAgICAgICAgICBhc3NlcnRBbGxGcm9tVGJsMShzZWNvbmRTdG10LCBvbmVzLCB0d29zKTsKLSAgICAgICAgICAgIGZpcnN0U3RtdC5nZXRDb25uZWN0aW9uKCkucm9sbGJhY2soKTsKLSAgICAgICAgICAgIGFzc2VydEFsbEZyb21UYmwxKHNlY29uZFN0bXQsIG9uZXMsIHR3b3MpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZmlyc3RTdG10LmdldENvbm5lY3Rpb24oKS5zZXRBdXRvQ29tbWl0KHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdXBkYXRlcyB0aGUgc3JpbmcgdmFsdWVzLiB0aGUgb3JpZ2luYWwgdmFsdWVzIGFyZSBzdG9yZWQgaW4gJ29uZXMnCi0gICAgICogYW5kIHRoZSB1cGRhdGVkIHZhbHVlcyBpbiAnb25lc191cGRhdGVkJwotICAgICAqIEBwYXJhbSBzdG10IHRoZSBzdGF0ZW1lbnQgdG8gdXNlIGZvciB0aGUgdXBkYXRlLgotICAgICAqIEBwYXJhbSBvbmVzVXBkYXRlZCB0aGUgbmV3IHN0cmluZyB2YWx1ZXMuCi0gICAgICogQHBhcmFtIHR3b3MgdGhlIG51bWVyaWNhbCB2YWx1ZXMuCi0gICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHByb2JsZW0gZHVyaW5nIHVwZGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlT25lcyhTdGF0ZW1lbnQgc3RtdCwgU3RyaW5nW10gb25lc1VwZGF0ZWQsIHNob3J0W10gdHdvcykKLSAgICAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9uZXNVcGRhdGVkLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzdG10LmV4ZWN1dGUoIlVQREFURSB0YmwxIFNFVCBvbmUgPSAnIiArIG9uZXNVcGRhdGVkW2ldCi0gICAgICAgICAgICAgICAgICAgICsgIicgV0hFUkUgdHdvID0gIiArIHR3b3NbaV0pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjVlMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0LmphdmEKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworcHVibGljIGNsYXNzIERhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OTiA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1FMID0gInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSBpID0gPyBBTkQgaiA9IDEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRFU1RfU1FMUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIFRFU1RfU1FMLCBURVNUX1NRTCArIDEsIFRFU1RfU1FMICsgMiwgVEVTVF9TUUwgKyAzLCBURVNUX1NRTCArIDQKKyAgICB9OworCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIG1UZXN0UG9vbDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHRlc3QgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIG1UZXN0UG9vbCA9IG5ldyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKG1EYXRhYmFzZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobVRlc3RQb29sKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtVGVzdFBvb2wuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRSZWxlYXNlKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICAvLyBjb25uZWN0aW9ucyBzaG91bGQgYmUgbGF6aWx5IGNyZWF0ZWQuCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgLy8gTUFYIHBvb2wgc2l6ZSBzaG91bGQgYmUgc2V0IHRvIE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBnZXQgYSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgYmUgb25lIC0gc2luY2Ugb25seSBvbmUgc2hvdWxkIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGFib3ZlIGdldCgpCisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgLy8gbm8gZnJlZSBjb25uZWN0aW9ucyBzaG91bGQgYmUgYXZhaWxhYmxlCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKyAgICAgICAgLy8gcmVsZWFzZSB0aGUgY29ubmVjdGlvbgorICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworICAgICAgICAvLyByZWxlYXNlIHRoZSBzYW1lIG9iamVjdCBhZ2FpbiBhbmQgZXhwZWN0IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIpOworICAgICAgICAgICAgZmFpbCgiaWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQuCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgYWxsIGNvbm5lY3Rpb25zIGZyb20gdGhlIHBvb2wgYW5kIGFzayBmb3Igb25lIG1vcmUuCisgICAgICogc2hvdWxkIGdldCBvbmUgb2YgdGhlIGNvbm5lY3Rpb25zIGFscmVhZHkgZ290IHNvIGZhci4gCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxDb25uQW5kT25lTW9yZSgpIHsKKyAgICAgICAgbVRlc3RQb29sLnNldE1heFBvb2xTaXplKE1BWF9DT05OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4gZGJPYmpzID0gbmV3IEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJPYmpzLmNvbnRhaW5zKGRiKSk7CisgICAgICAgICAgICBkYk9ianMuYWRkKGRiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHBvb2wgaXMgbWF4ZWQgb3V0IGFuZCBubyBmcmVlIGNvbm5lY3Rpb25zLiBhc2sgZm9yIG9uZSBtb3JlIGNvbm5lY3Rpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydFRydWUoZGJPYmpzLmNvbnRhaW5zKGRiMSkpOworICAgICAgICAvLyBwb29sIHNpemUgc2hvdWxkIHJlbWFpbiBhdCBNQVhfQ09OTgorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHJlbGVhc2UgZGIxIGJ1dCBzaW5jZSBpdCBpcyBhbGxvY2F0ZWQgMiB0aW1lcywgaXQgc2hvdWxkIHN0aWxsIHJlbWFpbiAnYnVzeScKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHJlbGVhc2UgYWxsIGNvbm5lY3Rpb25zCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGJPYmpzLmdldChpKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWxsIG9iamVjdHMgaW4gdGhlIHBvb2wgc2hvdWxkIGJlIGZyZWVkIG5vdworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBzYW1lIGFzIGFib3ZlIGV4Y2VwdCB0aGF0IGVhY2ggY29ubmVjdGlvbiBoYXMgZGlmZmVyZW50IFNRTCBzdGF0ZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGl0LiAKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbm5SZXRyaWV2YWxGb3JQcmV2aW91c2x5U2VlblNxbCgpIHsKKyAgICAgICAgbVRlc3RQb29sLnNldE1heFBvb2xTaXplKE1BWF9DT05OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFNRTGl0ZURhdGFiYXNlPiBkYk9ianMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNRTGl0ZURhdGFiYXNlPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTFNbaV0pOworICAgICAgICAgICAgZXhlY3V0ZVNxbE9uRGF0YWJhc2VDb25uKGRiLCBURVNUX1NRTFNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJPYmpzLnZhbHVlcygpLmNvbnRhaW5zKGRiKSk7CisgICAgICAgICAgICBkYk9ianMucHV0KFRFU1RfU1FMU1tpXSwgZGIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcG9vbCBpcyBtYXhlZCBvdXQgYW5kIG5vIGZyZWUgY29ubmVjdGlvbnMuIGFzayBmb3Igb25lIG1vcmUgY29ubmVjdGlvbgorICAgICAgICAvLyB1c2UgYSBwcmV2aW91c2x5IHNlZW4gU1FMIHN0YXRlbWVudAorICAgICAgICBTdHJpbmcgdGVzdFNxbCA9IFRFU1RfU1FMU1tNQVhfQ09OTiAtIDFdOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KHRlc3RTcWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydFRydWUoZGJPYmpzLnZhbHVlcygpLmNvbnRhaW5zKGRiMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIxLCBkYk9ianMuZ2V0KHRlc3RTcWwpKTsKKyAgICAgICAgLy8gZG8gdGhlIHNhbWUgYWdhaW4KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIyID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGRiMSBpcyBvbmUgb2YgdGhlIGV4aXN0aW5nIG9uZXMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRiMiwgZGJPYmpzLmdldCh0ZXN0U3FsKSk7CisKKyAgICAgICAgLy8gcG9vbCBzaXplIHNob3VsZCByZW1haW4gYXQgTUFYX0NPTk4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIC8vIHJlbGVhc2UgZGIxIGJ1dCBzaW5jZSB0aGUgc2FtZSBjb25uZWN0aW9uIGlzIGFsbG9jYXRlZCAzIHRpbWVzLAorICAgICAgICAvLyBpdCBzaG91bGQgc3RpbGwgcmVtYWluICdidXN5JworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGJPYmpzLmdldCh0ZXN0U3FsKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgLy8gcmVsZWFzZSBkYjIgYnV0IHNpbmNlIHRoZSBzYW1lIGNvbm5lY3Rpb24gaXMgYWxsb2NhdGVkIDIgdGltZXMsCisgICAgICAgIC8vIGl0IHNob3VsZCBzdGlsbCByZW1haW4gJ2J1c3knCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMik7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYk9ianMuZ2V0KHRlc3RTcWwpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICAvLyByZWxlYXNlIGFsbCBjb25uZWN0aW9ucworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiT2Jqcy5nZXQoVEVTVF9TUUxTW2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWxsIG9iamVjdHMgaW4gdGhlIHBvb2wgc2hvdWxkIGJlIGZyZWVkIG5vdworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlU3FsT25EYXRhYmFzZUNvbm4oU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKKyAgICAgICAgLy8gZXhlY3V0ZSB0aGUgZ2l2ZW4gU1FMIG9uIHRoZSBnaXZlbiBkYXRhYmFzZSBjb25uZWN0aW9uIHNvIHRoYXQgdGhlIHByZXBhcmVkCisgICAgICAgIC8vIHN0YXRlbWVudCBmb3IgU1FMIGlzIGNhY2hlZCBieSB0aGUgZ2l2ZW4gZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICAvLyB0aGlzIHdpbGwgaGVscCBEYXRhYmFzZUNvbmVuY3Rpb25Qb29sIGZpZ3VyZSBvdXQgaWYgYSBnaXZlbiBTUUwgc3RhdGVtZW50CisgICAgICAgIC8vIGlzIGFscmVhZHkgY2FjaGVkIGJ5IGEgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgICAgZGIuZXhlY1NRTChzcWwsIG5ldyBTdHJpbmdbXXsxKyIifSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGEgY29ubmVjdGlvbiBmb3IgYSBTUUwgc3RhdGVtZW50ICdibGFoJy4gKGNvbm5lY3Rpb25fcykKKyAgICAgKiBtYWtlIHN1cmUgdGhlIHBvb2wgaGFzIGF0IGxlYXN0IG9uZSBmcmVlIGNvbm5lY3Rpb24gZXZlbiBhZnRlciB0aGlzIGdldCgpLgorICAgICAqIGFuZCBnZXQgYSBjb25uZWN0aW9uIGZvciB0aGUgc2FtZSBTUUwgYWdhaW4uCisgICAgICogICAgdGhpcyBjb25uZWN0aW9uIHNob3VsZCBiZSBkaWZmZXJlbnQgZnJvbSBjb25uZWN0aW9uX3MuCisgICAgICogICAgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIFNRTCBwcmUtY29tcGlsZWQsIHNpbmNlIGlzIGl0IG5vdCBmcmVlCisgICAgICogICAgQU5EIHNpbmNlIHRoZSBwb29sIGhhcyBmcmVlIGNvbm5lY3Rpb25zIGF2YWlsYWJsZSwgc2hvdWxkIGdldCBhIG5ldyBjb25uZWN0aW9uLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubkZvclRoZVNhbWVTcWwoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgZXhlY3V0ZVNxbE9uRGF0YWJhc2VDb25uKGRiLCBURVNUX1NRTCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGRiMS5lcXVhbHMoZGIpKTsKKworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgc2FtZSBjb25uZWN0aW9uIE4gdGltZXMgYW5kIHJlbGVhc2UgaXQgTiB0aW1lcy4KKyAgICAgKiB0aGlzIHRlc3RzIERhdGFiYXNlQ29ubmVjdGlvblBvb2wuUG9vbE9iai5tTnVtSG9sZGVycworICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2FtZUNvbm5OdGltZXNBbmRSZWxlYXNlSXROdGltZXMoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4gZGJPYmpzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLnB1dChURVNUX1NRTFNbaV0sIGRiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGV2ZXJ5IGNvbm5lY3Rpb24gaW4gdGhlIHBvb2wgc2hvdWxkIGhhdmUgbnVtSG9sZGVycyA9IDEKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSArKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRQb29sKCkuZ2V0KGkpLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcG9vbCBpcyBtYXhlZCBvdXQgYW5kIG5vIGZyZWUgY29ubmVjdGlvbnMuIGFzayBmb3Igb25lIG1vcmUgY29ubmVjdGlvbgorICAgICAgICAvLyB1c2UgYSBwcmV2aW91c2x5IHNlZW4gU1FMIHN0YXRlbWVudAorICAgICAgICBTdHJpbmcgdGVzdFNxbCA9IFRFU1RfU1FMU1tNQVhfQ09OTiAtIDFdOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KHRlc3RTcWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydFRydWUoZGJPYmpzLnZhbHVlcygpLmNvbnRhaW5zKGRiMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIxLCBkYk9ianMuZ2V0KHRlc3RTcWwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sLlBvb2xPYmogcG9vbE9iaiA9IG1UZXN0UG9vbC5nZXRQb29sKCkuZ2V0KGRiMS5tQ29ubmVjdGlvbk51bSAtIDEpOworICAgICAgICBpbnQgbnVtSG9sZGVycyA9IHBvb2xPYmouZ2V0TnVtSG9sZGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbnVtSG9sZGVycyk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gZ2V0IHRoZSBzYW1lIGNvbm5lY3Rpb24gTiB0aW1lcyBtb3JlCisgICAgICAgIGludCBOID0gMTAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIyID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYjEsIGRiMik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIyKSk7CisgICAgICAgICAgICAvLyBudW1Ib2xkZXJzIGZvciB0aGlzIG9iamVjdCBzaG91bGQgYmUgbm93IHVwIGJ5IDEKKyAgICAgICAgICAgIGludCBwcmV2ID0gbnVtSG9sZGVyczsKKyAgICAgICAgICAgIG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmV2ICsgMSwgbnVtSG9sZGVycyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBpdCBOIHRpbWVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICAgICAgaW50IHByZXYgPSBudW1Ib2xkZXJzOworICAgICAgICAgICAgbnVtSG9sZGVycyA9IHBvb2xPYmouZ2V0TnVtSG9sZGVycygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByZXYgLSAxLCBudW1Ib2xkZXJzKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aGUgY29ubmVjdGlvbiBzaG91bGQgc3RpbGwgaGF2ZSAyIG1vcmUgaG9sZGVycworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwb29sT2JqLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSAyIG1vcmUgdGltZXMKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBvb2xPYmouZ2V0TnVtSG9sZGVycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmVzc1Rlc3QoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U1FMaXRlRGF0YWJhc2UsIEludGVnZXI+IGRiTWFwID0gbmV3IEhhc2hNYXA8U1FMaXRlRGF0YWJhc2UsIEludGVnZXI+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk1hcC5jb250YWluc0tleShkYikpOworICAgICAgICAgICAgZGJNYXAucHV0KGRiLCAxKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGFzayBmb3IgbG90IG1vcmUgY29ubmVjdGlvbnMgYnV0IHNpbmNlIHRoZSBwb29sIGlzIG1heGVkIG91dCwgd2Ugc2hvdWxkIHN0YXJ0IHJlY2VpdmluZworICAgICAgICAvLyBjb25uZWN0aW9ucyB0aGF0IHdlIGFscmVhZHkgZ290IHNvIGZhcgorICAgICAgICBmb3IgKGludCBpID0gTUFYX0NPTk47IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCArIGkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkYk1hcC5jb250YWluc0tleShkYikpOworICAgICAgICAgICAgaW50IGsgPSBkYk1hcC5nZXQoZGIpOworICAgICAgICAgICAgZGJNYXAucHV0KGRiLCArK2spOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcHJpbnQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGVzIHJlY2VpdmVkLCBzaG91bGQgYmUgdW5pZm9ybS4KKyAgICAgICAgZm9yIChTUUxpdGVEYXRhYmFzZSBkIDogZGJNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNvbm5lY3Rpb24gIyAiICsgZC5tQ29ubmVjdGlvbk51bSArICIsIG51bUhvbGRlcnM6ICIgKyBkYk1hcC5nZXQoZCkpOworICAgICAgICB9CisgICAgICAgIC8vIHByaW50IHRoZSBwb29sIGluZm8KKyAgICAgICAgTG9nLmkoVEFHLCBtVGVzdFBvb2wudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHJlbGVhc2UgYWxsCisgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgZCA6IGRiTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBpbnQgbnVtID0gZGJNYXAuZ2V0KGQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhCmluZGV4IGIwOThiNWMuLjkxZWYwYjcgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZVRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEKQEAgLTE4LDEyICsxOCwxNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU3VwcHJlc3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiBwdWJsaWMgY2xhc3MgU1FMaXRlRGF0YWJhc2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlR2VuZXJhbFRlc3QiOwpAQCAtNjIsNiArNjcsNyBAQAogCiAgICAgQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOwogICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOwogICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKICAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBwb29sID0gbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbDsKQEAgLTEyNSw2ICsxMzEsNyBAQAogICAgICAqIDwvdWw+CiAgICAgICovCiAgICAgQExhcmdlVGVzdAorICAgIEBTdXBwcmVzcyAvLyBydW4gdGhpcyB0ZXN0IG9ubHkgaWYgeW91IG5lZWQgdG8gY29sbGVjdCB0aGUgbnVtYmVycyBmcm9tIHRoaXMgdGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW5jeUVmZmVjdHNPZkNvbm5Qb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJ1biB0aGUgdGVzdCB3aXRoIHNxbGl0ZSBXQUwgZW5hYmxlCiAgICAgICAgIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdCh0cnVlKTsKQEAgLTE5Miw3ICsxOTksNyBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIGluWGFjdCA9IGZhbHNlOwogICAgIHByaXZhdGUgaW50IG51bVhhY3RzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1IgPSAxNTsgLy8gbnVtIHNlYyB0aGlzIHRlc3Qgc2hvdWRsIHJ1bgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1IgPSAxNTsgLy8gbnVtIHNlYyB0aGlzIHRlc3Qgc2hvdWxkIHJ1bgogICAgIHByaXZhdGUgaW50W11bXSBjb3VudHMgPSBuZXcgaW50WzJdWzJdOwogCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpblhhY3QoKSB7CkBAIC0yNzEsNCArMjc4LDI0NCBAQAogICAgICAgICAgICAgc2V0Q291bnRzKHJlYWRlck51bSwgbnVtUmVhZHMpOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtIHsKKyAgICAgICAgcHJpdmF0ZSBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyhTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgeworICAgICAgICAgICAgc3VwZXIoZGIsIHNxbCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgY3JlYXRlKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7CisgICAgICAgICAgICBkYi5sb2NrKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcoZGIsIHNxbCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGRiLnVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMcnVDYWNoaW5nT2ZTcWxpdGVDb21waWxlZFNxbE9ianMoKSB7CisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCwgaiBpbnQpOyIpOworICAgICAgICAvLyBzZXQgY2FjaGUgc2l6ZQorICAgICAgICBpbnQgTiA9IFNRTGl0ZURhdGFiYXNlLk1BWF9TUUxfQ0FDSEVfU0laRTsKKyAgICAgICAgbURhdGFiYXNlLnNldE1heFNxbENhY2hlU2l6ZShOKTsKKworICAgICAgICAvLyBkbyBOKzEgcXVlcmllcyAtIGFuZCB3aGVuIHRoZSAwdGggZW50cnkgaXMgcmVtb3ZlZCBmcm9tIExSVSBjYWNoZSBkdWUgdG8gdGhlCisgICAgICAgIC8vIGluc2VydGlvbiBvZiAoTisxKXRoIGVudHJ5LCBtYWtlIHN1cmUgMHRoIGVudHJ5IGlzIGNsb3NlZAorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RtdE9ianMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHNxbFN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgaW50IHN0bXQwID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOKzE7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHMgPSAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiLD8pOyI7CisgICAgICAgICAgICBzcWxTdHJpbmdzLmFkZChzKTsKKyAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLCBzKTsKKyAgICAgICAgICAgIGludCBuID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgc3RtdE9ianMuYWRkKGksIG4pOworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIHN0YXRlbWVudElkIG9mIHRoaXMgb2JqLiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBpdCBpcyB0aHJvd24gb3V0IG9mCisgICAgICAgICAgICAgICAgLy8gdGhlIGNhY2hlIGF0IHRoZSBlbmQgb2YgdGhpcyB0ZXN0LgorICAgICAgICAgICAgICAgIHN0bXQwID0gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpcyAwJ3RoIGVudHJ5IG91dCBvZiB0aGUgY2FjaGU/IGl0IHNob3VsZCBiZSBpbiB0aGUgbGlzdCBvZiBzdGF0ZW1lbnRJZHMKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgcHJlLWNvbXBpbGVkIHNxbCBzdGF0ZW1lbnRzIHRvIGJlIGZpbmFsaXplZC4KKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpLmNvbnRhaW5zKHN0bXQwKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTisxOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBTcWwgPSBtRGF0YWJhc2UuZ2V0Q29tcGlsZWRTdGF0ZW1lbnRGb3JTcWwoc3FsU3RyaW5ncy5nZXQoaSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21wU3FsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3RtdE9ianMuY29udGFpbnMoY29tcFNxbC5uU3RhdGVtZW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYkNsb3NlUmVsZWFzaW5nQWxsQ2FjaGVkU3FsKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCB0ZXh0MSBURVhULCB0ZXh0MiBURVhULCAiICsKKyAgICAgICAgICAgICAgICAibnVtMSBJTlRFR0VSLCBudW0yIElOVEVHRVIsIGltYWdlIEJMT0IpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RhdGVtZW50ID0gIkRFTEVURSBGUk9NIHRlc3QgV0hFUkUgX2lkPT87IjsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudERvTm90Q2xvc2UgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgICAgICBzdGF0ZW1lbnREb05vdENsb3NlLmJpbmRMb25nKDEsIDEpOworICAgICAgICAvKiBkbyBub3QgY2xvc2Ugc3RhdGVtZW50RG9Ob3RDbG9zZSBvYmplY3QuCisgICAgICAgICAqIFRoYXQgc2hvdWxkIGxlYXZlIGl0IGluIFNRTGl0ZURhdGFiYXNlLm1Qcm9ncmFtcy4KKyAgICAgICAgICogbURhdGFiYXNlLmNsb3NlKCkgaW4gdGVhckRvd24oKSBzaG91bGQgcmVsZWFzZSBpdC4KKyAgICAgICAgICovCisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0byBtYWtlIHN1cmUgdGhlIHN0YXRlbWVudCBmaW5hbGl6YXRpb25zIGFyZSBub3QgZG9uZSByaWdodCBhd2F5IGJ1dAorICAgICAqIHBpZ2d5LWJhY2tlZCBvbnRvIHRoZSBuZXh0IHNxbCBzdGF0ZW1lbnQgZXhlY3V0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2UoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlXAorICAgICAgICBpbnQgTiA9IFNRTGl0ZURhdGFiYXNlLk1BWF9TUUxfQ0FDSEVfU0laRTsKKyAgICAgICAgbURhdGFiYXNlLnNldE1heFNxbENhY2hlU2l6ZShOKTsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQ7CisgICAgICAgIGludCBzdG10MElkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpICsrKSB7CisgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiLCA/KTsiKTsKKyAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5CisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RtdDBJZCA9IGMuZ2V0U3FsU3RhdGVtZW50SWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgc3RtdDEgPQorICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMTAwLCA/KTsiKTsKKyAgICAgICAgc3RtdDEuY2xvc2UoKTsKKworICAgICAgICAvLyB0aGUgYWJvdmUgY2xvc2UoKSBzaG91bGQgaGF2ZSBxdWV1ZWRVcCB0aGUgc3RhdGVtZW50IGZvciBmaW5hbGl6YXRpb24KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXQwSWQpKTsKKworICAgICAgICAvLyBleGVjdXRlIHNvbWV0aGluZyB0byBzZWUgaWYgdGhpcyBzdGF0ZW1lbnQgZ2V0cyBmaW5hbGl6ZWQKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImRlbGV0ZSBmcm9tIHRlc3Qgd2hlcmUgaSA9IDEwOyIpOworICAgICAgICBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSAtIGV4Y2VwdCB0aGF0IHRoZSBzdGF0ZW1lbnQgdG8gYmUgZmluYWxpemVkIGlzIGZyb20gVGhyZWFkICMgMS4KKyAgICAgKiBhbmQgaXQgaXMgZXZlbnR1YWxseSBmaW5hbGl6ZWQgaW4gVGhyZWFkICMgMiB3aGVuIGl0IGV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZURpZmZUaHJlYWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZSBpbiBhIHRocmVhZAorICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpbnQgTiA9IFNRTGl0ZURhdGFiYXNlLk1BWF9TUUxfQ0FDSEVfU0laRTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsID8pOyIpOworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG10MElkID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoCisgICAgICAgIHQxLmpvaW4oKTsKKworICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCisgICAgICAgIC8vIGp1c3QgZm9yIHRoZSBoZWNrIG9mIGl0LCBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBzdG10MSA9CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMTAwLCA/KTsiKTsKKyAgICAgICAgICAgICAgICBzdG10MS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICB0Mi5qb2luKCk7CisKKyAgICAgICAgLy8gY2xvc2UoKSBpbiB0aGUgYWJvdmUgdGhyZWFkIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdGF0ZW1lbnQgZm9yIGZpbmFsaXphdGlvbgorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRTdG10MElkKCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoc3RtdDBJZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSBzb21ldGhpbmcgdG8gc2VlIGlmIHRoaXMgc3RhdGVtZW50IGdldHMgZmluYWxpemVkCisgICAgICAgIC8vIGFnYWluIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MyA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJkZWxldGUgZnJvbSB0ZXN0IHdoZXJlIGkgPSAxMDsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDMuc3RhcnQoKTsKKyAgICAgICAgdDMuam9pbigpOworCisgICAgICAgIC8vIGlzIHRoZSBzdGF0ZW1lbnQgZmluYWxpemVkPworICAgICAgICBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgc3RtdDBJZCA9IDA7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdG10MElkKGludCBzdG10MElkKSB7CisgICAgICAgIHRoaXMuc3RtdDBJZCA9IHN0bXQwSWQ7CisgICAgfQorICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXRTdG10MElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdG10MElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNhbWUgYXMgYWJvdmUgLSBleGNlcHQgdGhhdCB0aGUgcXVldWUgb2Ygc3RhdGVtZW50cyB0byBiZSBmaW5hbGl6ZWQgYXJlIGZpbmFsaXplZAorICAgICAqIGJ5IGRhdGFiYXNlIGNsb3NlKCkgb3BlcmF0aW9uLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2VCeURiQ2xvc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZSBpbiBhIHRocmVhZAorICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpbnQgTiA9IFNRTGl0ZURhdGFiYXNlLk1BWF9TUUxfQ0FDSEVfU0laRTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiwgPyk7Iik7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0bXQwSWQgPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2gKKyAgICAgICAgdDEuam9pbigpOworCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgLy8ganVzdCBmb3IgdGhlIGhlY2sgb2YgaXQsIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIHN0bXQxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygxMDAsID8pOyIpOworICAgICAgICAgICAgICAgIHN0bXQxLmJpbmRMb25nKDEsIDEpOworICAgICAgICAgICAgICAgIHN0bXQxLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgIHQyLmpvaW4oKTsKKworICAgICAgICAvLyBjbG9zZSgpIGluIHRoZSBhYm92ZSB0aHJlYWQgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0YXRlbWVudCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKGdldFN0bXQwSWQoKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2UuIGV2ZXJ5dGhpbmcgZnJvbSBtQ2xvc2VkU3RhdGVtZW50SWRzIGluIG1EYXRhYmFzZQorICAgICAgICAvLyBzaG91bGQgYmUgZmluYWxpemVkIGFuZCBjbGVhcmVkIGZyb20gdGhlIGxpc3QKKyAgICAgICAgLy8gYWdhaW4gZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQzLnN0YXJ0KCk7CisgICAgICAgIHQzLmpvaW4oKTsKKworICAgICAgICAvLyBjaGVjayBtQ2xvc2VkU3RhdGVtZW50SWRzIGluIG1EYXRhYmFzZS4gaXQgc2hvdWxkIGJlIGVtcHR5CisgICAgICAgIHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdjY2NlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuRmxha3lUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTUUxpdGVHZW5lcmFsVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKLSAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKLSAgICBCb29sZWFuIGV4Y2VwdGlvblJlY3ZkID0gZmFsc2U7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBleGNlcHRpb25SZWN2ZCA9IGZhbHNlOwotICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7Ci0gICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKLSAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7Ci0gICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VPZlNhbWVTcWxTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOwotCi0gICAgICAgIC8vIHRocmVhZCAxIGNyZWF0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKLQotICAgICAgICAvLyBzdGFydCAyIHRocmVhZHMgdG8gZG8gcmVwZWF0ZWRseSBleGVjdXRlICJzdG10IgotICAgICAgICAvLyBzaW5jZSB0aGVzZSAyIHRocmVhZHMgYXJlIGV4ZWN1dGluZyB0aGUgc2FtZSBzcWwsIHRoZXkgZWFjaCBzaG91bGQgZ2V0Ci0gICAgICAgIC8vIHRoZWlyIG93biBjb3B5IGFuZAotICAgICAgICAvLyB0aGVyZSBTSE9VTEQgTk9UIGJlIGFuIGVycm9yIGZyb20gc3FsaXRlOiAicHJlcGFyZWQgc3RhdGVtZW50IGlzIGJ1c3kiCi0gICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE4gPSAxMDAwOwotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBtYW55IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzMSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0bXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuYmluZExvbmcoMSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiU1FMaXRlRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgicmFuZG9tIHVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBGbGFreVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lUHJlcGFyZWRTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOwotCi0gICAgICAgIC8vIHRocmVhZCAxIGNyZWF0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKLSAgICAgICAgZmluYWwgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7Ci0KLSAgICAgICAgLy8gc3RhcnQgMiB0aHJlYWRzIHRvIGRvIHJlcGVhdGVkbHkgZXhlY3V0ZSAic3RtdCIKLSAgICAgICAgLy8gc2luY2UgdGhlc2UgMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgcHJlcGFyZWQgc3RhdGVtZW50LAotICAgICAgICAvLyBzaG91bGQgc2VlIGFuIGVycm9yIGZyb20gc3FsaXRlOiAicHJlcGFyZWQgc3RhdGVtZW50IGlzIGJ1c3kiCi0gICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE4gPSAxMDAwOwotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBtYW55IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0IGl0Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoImxpYnJhcnkgcm91dGluZSBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uUmVjdmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgicmFuZG9tIHVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvblJlY3ZkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlSkRCQ0RyaXZlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVKREJDRHJpdmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTY3N2E1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVKREJDRHJpdmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuRHJpdmVyTWFuYWdlcjsKLWltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotCi0vKioKLSAqIE1pbmltYWwgdGVzdCBmb3IgSkRCQyBkcml2ZXIKLSAqLwotcHVibGljIGNsYXNzIFNRTGl0ZUpEQkNEcml2ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RKREJDRHJpdmVyVGVzdCB7Ci0KLSAgICBwcml2YXRlIEZpbGUgZGJGaWxlOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgZGJGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgic3FsaXRlVGVzdERCIiwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKGRiRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkYkZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbm5lY3Rpb25VUkwoKSB7Ci0gICAgICAgIHJldHVybiAiamRiYzpzcWxpdGU6LyIgKyBkYkZpbGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0RGJGaWxlKCkgewotICAgICAgICByZXR1cm4gZGJGaWxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SkRCQ0RyaXZlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJTUUxpdGUuSkRCQ0RyaXZlciI7Ci0gICAgfQotICAgIAotICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgKE5vc2VyKSAjMjU1OiBQcmVwYXJlZFN0YXRlbWVudC5leGVjdXRlVXBkYXRlIHJlc3VsdHMKLSAgICAvLyBpbiBWTSBjcmFzaGluZyB3aXRoIFNJR0FCUlQuCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2Nvbm5lY3Rpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHByc3QgPSBudWxsOwotICAgICAgICBTdGF0ZW1lbnQgc3QgPSBudWxsOwotICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiU1FMaXRlLkpEQkNEcml2ZXIiKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgaWYgKGRiRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGRiRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbm4gPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24oImpkYmM6c3FsaXRlOi8iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGRiRmlsZS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25uKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIHRhYmxlCi0gICAgICAgICAgICBzdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgc3FsID0gIkNSRUFURSBUQUJMRSB6b28gKFpJRCBJTlRFR0VSIE5PVCBOVUxMLCBmYW1pbHkgVkFSQ0hBUiAoMjApIE5PVCBOVUxMLCBuYW1lIFZBUkNIQVIgKDIwKSBOT1QgTlVMTCwgUFJJTUFSWSBLRVkoWklEKSApIjsKLSAgICAgICAgICAgIHN0LmV4ZWN1dGVVcGRhdGUoc3FsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHVwZGF0ZSA9ICJ1cGRhdGUgem9vIHNldCBmYW1pbHkgPSA/IHdoZXJlIG5hbWUgPSA/OyI7Ci0gICAgICAgICAgICBwcnN0ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KHVwZGF0ZSk7Ci0gICAgICAgICAgICBwcnN0LnNldFN0cmluZygxLCAiY2F0Iik7Ci0gICAgICAgICAgICBwcnN0LnNldFN0cmluZygyLCAiWWFzaGEiKTsKLSAgICAgICAgICAgIC8vIHN0ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgIC8vIHN0LmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gem9vIHdoZXJlIGZhbWlseSA9ICdjYXQnIik7Ci0gICAgICAgICAgICAvLyBSZXN1bHRTZXQgcnMgPSBzdC5nZXRSZXN1bHRTZXQoKTsKLSAgICAgICAgICAgIC8vIGFzc2VydEVxdWFscygwLCBnZXRDb3VudChycykpOwotICAgICAgICAgICAgcHJzdC5leGVjdXRlVXBkYXRlKCk7Ci0gICAgICAgICAgICAvLyBzdC5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHpvbyB3aGVyZSBmYW1pbHkgPSAnY2F0JyIpOwotICAgICAgICAgICAgLy8gUmVzdWx0U2V0IHJzMSA9IHN0LmdldFJlc3VsdFNldCgpOwotICAgICAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKDEsIGdldENvdW50KHJzMSkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwcnN0ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KCIiKTsKLSAgICAgICAgICAgICAgICBwcnN0LmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJTUUxFeGNlcHRpb24gaXMgbm90IHRocm93biIpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbm4ucHJlcGFyZVN0YXRlbWVudChudWxsKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJOUEUgaXMgbm90IHRocm93biIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzdCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgc3QuZXhlY3V0ZSgiZHJvcCB0YWJsZSBpZiBleGlzdHMgem9vIik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZhaWwoIkNvdWxkbid0IGRyb3AgdGFibGU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChwcnN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJzdC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTc1NDVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVTdGF0ZW1lbnRUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IDIgdGhyZWFkcyB0byByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIGFib3ZlIFNRTCBzdGF0ZW1lbnQuCisgICAgICogRXZlbiB0aG91Z2ggMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgU1FMLCB0aGV5IGVhY2ggc2hvdWxkIGdldCB0aGVpciBvd24gY29weSBvZgorICAgICAqIHByZXBhcmVkIFNRTCBzdGF0ZW1lbnQgaWQgYW5kIHRoZXJlIFNIT1VMRCBOT1QgYmUgYW4gZXJyb3IgZnJvbSBzcWxpdGUgb3IgYW5kcm9pZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdGVzdCB0aHJlYWRzIHN0YXJ0ZWQgYnkgdGhpcyB0ZXN0IGFyZSBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOworICAgICAgICBjbGFzcyBSdW5TdG10VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gaXQgZW5vdWdoIHRpbWVzIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gY29ybmVyIGNhc2VzIGdvaW5nIHVudGVzdGVkCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7CisgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOworICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHMxLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICB3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgeworICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgICB9CisgICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc2ltcGxlIHRlc3Q6IHN0YXJ0IDIgdGhyZWFkcyB0byByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIHNhbWUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0uCisgICAgICogVGhlIDIgdGhyZWFkcyB0YWtlIHR1cm5zIHRvIHVzZSB0aGUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH07IGkuZS4sIGl0IGlzIE5PVCBpbiB1c2UKKyAgICAgKiBieSBib3RoIHRoZSB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdGVzdCB0aHJlYWRzIHN0YXJ0ZWQgYnkgdGhpcyB0ZXN0IGFyZSBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsaXRlU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOworICAgICAgICBmaW5hbCBTUUxpdGVTdGF0ZW1lbnQgczEgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdG10KTsKKyAgICAgICAgY2xhc3MgUnVuU3RtdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIGRvIGl0IGVub3VnaCB0aW1lcyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGNvcm5lciBjYXNlcyBnb2luZyB1bnRlc3RlZAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqIFN5bmNocm9uaXplIG9uIHRoaXMgd2hlbiBhY2Nlc3NpbmcgdGhlIFNxbGl0ZVN0YXRlbWV0IGluIHRoZSBhYm92ZSAqLworICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBtTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKHRydWUpOworICAgIHByaXZhdGUgdm9pZCBsb2NrKCkgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBmb2xsb3dpbmc6IGEge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0gb2JqZWN0IHNob3VsZCBub3QgcmVmZXIgdG8gYQorICAgICAqIHByZS1jb21waWxlZCBTUUwgc3RhdGVtZW50IGlkIGV4Y2VwdCBpbiBkdXJpbmcgdGhlIHBlcmlvZCBvZiBiaW5kaW5nIHRoZSBhcmd1bWVudHMKKyAgICAgKiBhbmQgZXhlY3V0aW5nIHRoZSBTUUwgc3RhdGVtZW50LgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHQgKGkgaW50LCBqIHRleHQpOyIpOworICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoZmFsc2UpOworICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQodHJ1ZSk7CisKKyAgICAgICAgLy8gYSBzbWFsbCBzdHJlc3MgdGVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHNpZGUgZWZmZWN0cyBvZgorICAgICAgICAvLyB0aGUgYWNxdWlyZSAmIHJlbGVhc2Ugb2YgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBpZCBieSBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoZmFsc2UpOworICAgICAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKGJvb2xlYW4gd2FsKSB7CisgICAgICAgIGlmICh3YWwpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9CisgICAgICAgIC8vIHRlc3Qgd2l0aCBJTlNFUlQgc3RhdGVtZW50IC0gZG9lc24ndCB1c2UgY29ubmVjdGlvbiBwb29sLCBpZiBXQUwgaXMgc2V0CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoImluc2VydCBpbnRvIHQgdmFsdWVzKD8sPyk7Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICAvLyBzcWwgc3RhdGVtZW50IHNob3VsZCBub3QgYmUgY29tcGlsZWQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgaW50IGNvbFZhbHVlID0gbmV3IFJhbmRvbSgpLm5leHRJbnQoKTsKKyAgICAgICAgc3RtdC5iaW5kTG9uZygxLCBjb2xWYWx1ZSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzcWwgc3RhdGVtZW50IGlzIHN0aWxsIG5vdCBjb21waWxlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gc2hvdWxkIHN0aWxsIGJlIHVzaW5nIHRoZSBtRGF0YWJhc2UgY29ubmVjdGlvbiAtIHZlcmlmeQorICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5iaW5kU3RyaW5nKDIsICJibGFoIiArIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5leGVjdXRlSW5zZXJ0KCk7CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgc2hvdWxkIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgLy8gcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgc2hvdWxkIHN0aWxsIHJlbWFpbiByZWxlYXNlZCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gYnV0IHRoZSBkYXRhYmFzZSBoYW5kbGUgc2hvdWxkIHN0aWxsIGJlIHRoZSBzYW1lCisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKworICAgICAgICAvLyB0ZXN0IHdpdGggYSBTRUxFQ1Qgc3RhdGVtZW50IC0gdXNlcyBjb25uZWN0aW9uIHBvb2wgaWYgV0FMIGlzIHNldAorICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoInNlbGVjdCBpIGZyb20gdCB3aGVyZSBqPT87Iik7CisgICAgICAgIC8vIHNxbCBzdGF0ZW1lbnQgc2hvdWxkIG5vdCBiZSBjb21waWxlZCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5iaW5kU3RyaW5nKDEsICJibGFoIiArIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHN0YXRlbWVudAorICAgICAgICBMb25nIGwgPSBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29sVmFsdWUsIGwuaW50VmFsdWUoKSk7CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgc2hvdWxkIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgLy8gcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgc2hvdWxkIHN0aWxsIHJlbWFpbiByZWxlYXNlZCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gYnV0IHRoZSBkYXRhYmFzZSBoYW5kbGUgc2hvdWxkIHN0aWxsIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgc3RhdGVtZW50CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9jb21tdW5pdHkvaW5kZXguamQgYi9kb2NzL2h0bWwvY29tbXVuaXR5L2luZGV4LmpkCmluZGV4IDNlNjlkZTQuLjIzMjAzYzEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9jb21tdW5pdHkvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL2NvbW11bml0eS9pbmRleC5qZApAQCAtNCwxMCArNCwxMCBAQAogCiAJPGRpdiBpZD0ibWFpbkJvZHlGbHVpZCI+CiA8aDE+Q29tbXVuaXR5PC9oMT4KLTxwPldlbGNvbWUgdG8gdGhlIEFuZHJvaWQgZGV2ZWxvcGVycyBjb21tdW5pdHkhIFdlJ3JlIGdsYWQgeW91J3JlIGhlcmUgYW5kIGludml0ZSB5b3UgdG8gcGFydGljaXBhdGUgaW4gdGhlc2UgZGlzY3Vzc2lvbnMuIEJlZm9yZSBwb3N0aW5nLCBwbGVhc2UgcmVhZCB0aGUgPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9kaXNjdXNzL2FuZHJvaWQtZGlzY3Vzc2lvbi1ncm91cHMtY2hhcnRlciI+R3JvdXBzIENoYXJ0ZXI8L2E+IHRoYXQgY292ZXJzIHRoZSBjb21tdW5pdHkgZ3VpZGVsaW5lcy48L3A+Cis8cD5XZWxjb21lIHRvIHRoZSBBbmRyb2lkIGRldmVsb3BlcnMgY29tbXVuaXR5ISBXZSdyZSBnbGFkIHlvdSdyZSBoZXJlIGFuZCBpbnZpdGUgeW91IHRvIHBhcnRpY2lwYXRlIGluIHRoZXNlIGRpc2N1c3Npb25zLiBCZWZvcmUgcG9zdGluZywgcGxlYXNlIHJlYWQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vY29tbXVuaXR5L2dyb3Vwcy1jaGFydGVyLmh0bWwiPkdyb3VwcyBDaGFydGVyPC9hPiB0aGF0IGNvdmVycyB0aGUgY29tbXVuaXR5IGd1aWRlbGluZXMuPC9wPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3UgYXJlIHNlZWtpbmcgZGlzY3Vzc2lvbiBhYm91dCBBbmRyb2lkIHNvdXJjZSBjb2RlIChub3QgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQpLAotdGhlbiBwbGVhc2UgcmVmZXIgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGlzY3VzcyI+T3BlbiBTb3VyY2UgUHJvamVjdCBNYWlsaW5nIGxpc3RzPC9hPi48L3A+Cit0aGVuIHBsZWFzZSByZWZlciB0byB0aGUgPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21tdW5pdHkiPk9wZW4gU291cmNlIFByb2plY3QgTWFpbGluZyBsaXN0czwvYT4uPC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTouNWVtIj48c3Ryb25nPkNvbnRlbnRzPC9zdHJvbmc+PC9wPgogPG9sIGNsYXNzPSJ0b2MiPgpAQCAtMzEsNyArMzEsNyBAQAogQXMgeW91IHdyaXRlIHlvdXIgcG9zdCwgcGxlYXNlIGRvIHRoZSBmb2xsb3dpbmc6CiA8b2w+CiA8bGk+PGI+UmVhZAotdGhlIDxhIGhyZWY9Imh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL2EvYW5kcm9pZC5jb20vb3BlbnNvdXJjZS9kaXNjdXNzL2FuZHJvaWQtZGlzY3Vzc2lvbi1ncm91cHMtY2hhcnRlciI+bWFpbGluZyBsaXN0IGNoYXJ0ZXI8L2E+PC9iPiB0aGF0IGNvdmVycyB0aGUgY29tbXVuaXR5IGd1aWRlbGluZXMuIAordGhlIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vY29tbXVuaXR5L2dyb3Vwcy1jaGFydGVyLmh0bWwiPm1haWxpbmcgbGlzdCBjaGFydGVyPC9hPjwvYj4gdGhhdCBjb3ZlcnMgdGhlIGNvbW11bml0eSBndWlkZWxpbmVzLiAKIDwvbGk+CiA8bGk+PGI+U2VsZWN0IHRoZSBtb3N0IGFwcHJvcHJpYXRlIG1haWxpbmcgbGlzdCBmb3IgeW91ciBxdWVzdGlvbjwvYj4uIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudCBsaXN0cyBmb3IgCiBkZXZlbG9wZXJzLCBkZXNjcmliZWQgYmVsb3cuPC9saT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL2VjbGlwc2UtYWR0LmpkIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvZWNsaXBzZS1hZHQuamQKaW5kZXggY2YyYTQ1Ny4uNjYzNzlhMyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvZWNsaXBzZS1hZHQuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvZWNsaXBzZS1hZHQuamQKQEAgLTUyNyw3ICs1MjcsNyBAQAogPHA+QSBsaWJyYXJ5IHByb2plY3QncyBtYW5pZmVzdCBmaWxlIG11c3QgZGVjbGFyZSBhbGwgb2YgdGhlIHNoYXJlZCBjb21wb25lbnRzCiB0aGF0IGl0IGluY2x1ZGVzLCBqdXN0IGFzIHdvdWxkIGEgc3RhbmRhcmQgQW5kcm9pZCBhcHBsaWNhdGlvbi4gRm9yIG1vcmUKIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFuaWZlc3QvbWFuaWZlc3QtaW50cm8uaHRtbCI+QW5kcm9pZE1hbmlmZXN0LnhtbDwvYT4uPC9wPgoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1pbnRyby5odG1sIj5BbmRyb2lkTWFuaWZlc3QueG1sPC9hPi48L3A+CiAKIDxwPkZvciBleGFtcGxlLCB0aGUgPGEKIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9UaWNUYWNUb2VMaWIvQW5kcm9pZE1hbmlmZXN0Lmh0bWwiPlRpY1RhY1RvZUxpYjwvYT4KQEAgLTYxMyw3ICs2MTMsOCBAQAogICAuLi4KICZsdDsvbWFuaWZlc3QmZ3Q7PC9wcmU+CiAKLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYW5pZmVzdCBmaWxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYW5pZmVzdC9tYW5pZmVzdC1pbnRyby5odG1sIj5BbmRyb2lkTWFuaWZlc3QueG1sPC9hPi48L3A+Cis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWFuaWZlc3QgZmlsZSwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1pbnRyby5odG1sIj5BbmRyb2lkTWFuaWZlc3QueG1sPC9hPi48L3A+CiAKIAogPGgzIGlkPSJjb25zaWRlcmF0aW9ucyI+RGV2ZWxvcG1lbnQgY29uc2lkZXJhdGlvbnM8L2gzPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3Bpbmcvb3RoZXItaWRlLmpkIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3Bpbmcvb3RoZXItaWRlLmpkCmluZGV4IGU4YTZmYjYuLjFkNjdhYTkgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL290aGVyLWlkZS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy9vdGhlci1pZGUuamQKQEAgLTY4Nyw3ICs2ODcsNyBAQAogPHA+QSBsaWJyYXJ5IHByb2plY3QncyBtYW5pZmVzdCBmaWxlIG11c3QgZGVjbGFyZSBhbGwgb2YgdGhlIHNoYXJlZCBjb21wb25lbnRzCiB0aGF0IGl0IGluY2x1ZGVzLCBqdXN0IGFzIHdvdWxkIGEgc3RhbmRhcmQgQW5kcm9pZCBhcHBsaWNhdGlvbi4gRm9yIG1vcmUKIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFuaWZlc3QvbWFuaWZlc3QtaW50cm8uaHRtbCI+QW5kcm9pZE1hbmlmZXN0LnhtbDwvYT4uPC9wPgoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1pbnRyby5odG1sIj5BbmRyb2lkTWFuaWZlc3QueG1sPC9hPi48L3A+CiAKIDxwPkZvciBleGFtcGxlLCB0aGUgPGEKIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9UaWNUYWNUb2VMaWIvQW5kcm9pZE1hbmlmZXN0Lmh0bWwiPlRpY1RhY1RvZUxpYjwvYT4KQEAgLTc5OSw3ICs3OTksOCBAQAogICAuLi4KICZsdDsvbWFuaWZlc3QmZ3Q7PC9wcmU+CiAKLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYW5pZmVzdCBmaWxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYW5pZmVzdC9tYW5pZmVzdC1pbnRyby5odG1sIj5BbmRyb2lkTWFuaWZlc3QueG1sPC9hPi48L3A+Cis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWFuaWZlc3QgZmlsZSwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1pbnRyby5odG1sIj5BbmRyb2lkTWFuaWZlc3QueG1sPC9hPi48L3A+CiAKIDxoMyBpZD0iZGVwQXBwQnVpbGQiPkJ1aWxkaW5nIGEgZGVwZW5kZW50IGFwcGxpY2F0aW9uPC9oMz4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3NhbXBsZXMvaW5kZXguamQgYi9kb2NzL2h0bWwvZ3VpZGUvc2FtcGxlcy9pbmRleC5qZAppbmRleCAyZjNhYzVlLi5iZDllYTUyIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvc2FtcGxlcy9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvc2FtcGxlcy9pbmRleC5qZApAQCAtMyw5OSArMywxMyBAQAogQGpkOmJvZHkKIAogCi08cD5Tb21ldGltZXMsIHRoZSBiZXN0IHdheSB0byBsZWFybiBob3cgdGhpbmdzIGFyZSBkb25lIGlzIHRvIGxvb2sgYXQgc29tZSBjb2RlLgotSGVyZSwgeW91IGNhbiBicm93c2UgdGhlIHNvdXJjZSBvZiBzb21lIHNhbXBsZSBBbmRyb2lkIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBpbmNsdWRlZAotaW4gdGhlIEFuZHJvaWQgU0RLLjwvcD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgd2luZG93LmxvY2F0aW9uID0gdG9Sb290ICsgInJlc291cmNlcy9zYW1wbGVzL2luZGV4Lmh0bWwiOworPC9zY3JpcHQ+CiAKLTxwPkVhY2ggdmVyc2lvbiBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBhdmFpbGFibGUgZm9yIHRoZSBTREsgaW5jbHVkZXMgYSBmdWxsIHNldCBvZiBzYW1wbGUKLWFwcGxpY2F0aW9ucyAod2hpY2ggbWF5IHZhcnkgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHBsYXRmb3JtKS4KLVlvdSBjYW4gZmluZCB0aGUgc2FtcGxlcyBpbiB5b3VyIFNESyBhdDo8L3A+Cis8cD48c3Ryb25nPlRoaXMgZG9jdW1lbnQgaGFzIG1vdmVkLiBQbGVhc2UgZ28gdG8gPGEKK2hyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVzb3VyY2VzL3NhbXBsZXMvaW5kZXguaHRtbCI+TGlzdCBvZiBTYW1wbGUKK0FwcHM8L2E+Ljwvc3Ryb25nPjwvcD4KIAotPHAgc3R5bGU9Im1hcmdpbi1sZWZ0OjJlbSI+Ci08Y29kZT48ZW0+Jmx0O3NkayZndDs8L2VtPi9wbGF0Zm9ybXMvYW5kcm9pZC08ZW0+Jmx0O3ZlcnNpb24mZ3Q7PC9lbT4vc2FtcGxlcy88L2NvZGU+Ci08L3A+Ci0KLTxwPllvdSBjYW4gZWFzaWx5IGNyZWF0ZSBuZXcgQW5kcm9pZCBwcm9qZWN0cyB3aXRoIHRoZXNlIHNhbXBsZXMsIG1vZGlmeSB0aGVtCi1pZiB5b3UnZCBsaWtlLCB0aGVuIHJ1biB0aGVtIG9uIGFuIGVtdWxhdG9yIG9yIGRldmljZS4gRm9yIGV4YW1wbGUsIHRvIGNyZWF0ZQotYSBwcm9qZWN0IGZvciB0aGUgQVBJIERlbW9zIGFwcCBmcm9tIEVjbGlwc2UsCi1zdGFydCBhIG5ldyBBbmRyb2lkIFByb2plY3QsIHNlbGVjdCAiQ3JlYXRlIHByb2plY3QgZnJvbSBleGlzdGluZyBzb3VyY2UiLCB0aGVuIHNlbGVjdAote0Bjb2RlIEFwaURlbW9zfSBpbiB0aGUge0Bjb2RlIHNhbXBsZXMvfSBkaXJlY3RvcnkuIFRvIGNyZWF0ZSB0aGUgQVBJIERlbW9zIHByb2plY3QKLXVzaW5nIHRoZSB7QGNvZGUgYW5kcm9pZH0gdG9vbCwgZXhlY3V0ZTo8L3A+Ci08cHJlPgotYW5kcm9pZCB1cGRhdGUgcHJvamVjdCAtcyAtbiBBUEkgRGVtb3MgLXQgPGVtPiZsdDt0YXJnZXRfSUQ+PC9lbT4gLXAgPGVtPiZsdDtwYXRoLXRvLXBsYXRmb3JtPjwvZW0+L3NhbXBsZXMvQXBpRGVtb3MvCi08L3ByZT4KLQotPHA+VGhlIHBhZ2VzIGJlbG93IHByb3ZpZGUgYW4gb3ZlcnZpZXcgb2YgZWFjaCBzYW1wbGUgYXBwbGljYXRpb24gKGF2YWlsYWJsZSB3aXRoIG1vc3QKLXBsYXRmb3JtcykgYW5kIGFsbG93IHlvdSB0byB2aWV3IHRoZSBzb3VyY2UgZmlsZXMgaW4geW91ciBicm93c2VyLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNwZWNpYWwiPgotICA8cD5Tb21lIG9mIHRoZSBzYW1wbGVzIGluIHRoaXMgbGlzdGluZyBhcmUgbm90IHlldCBhdmFpbGFibGUgaW4gdGhlCi0gIFNESy4gV2hpbGUgd2Ugd29yayB0byB1cGRhdGUgdGhlIFNESywgeW91IGNhbgotICA8YSBocmVmPSJ7QGRvY1Jvb3R9c2hhcmVhYmxlcy9sYXRlc3Rfc2FtcGxlcy56aXAiPmRvd25sb2FkIHRoZSBsYXRlc3Qgc2FtcGxlczwvYT4gYXMgYSBaSVAKLSAgYXJjaGl2ZS48L3A+Ci08L2Rpdj4KLQotPGRsPgotCi0gPGR0PjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9BcGlEZW1vcy9pbmRleC5odG1sIj5BUEkgRGVtb3M8L2E+PC9kdD4KLSAgPGRkPkEgdmFyaWV0eSBvZiBzbWFsbCBhcHBsaWNhdGlvbnMgdGhhdCBkZW1vbnN0cmF0ZSBhbiBleHRlbnNpdmUgY29sbGVjdGlvbiBvZgotICBmcmFtZXdvcmsgdG9waWNzLjwvZGQ+Ci0KLSA8ZHQ+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL0JhY2t1cFJlc3RvcmUvaW5kZXguaHRtbCI+QmFja3VwIGFuZCBSZXN0b3JlPC9hPjwvZHQ+Ci0gIDxkZD5BbiBzaW1wbGUgZXhhbXBsZSB0aGF0IGlsbHVzdHJhdGVzIGEgZmV3IGRpZmZlcmVudCB3YXlzIGZvciBhbiBhcHBsaWNhdGlvbiB0bwotICBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgdGhlIEFuZHJvaWQgZGF0YSBiYWNrdXAgYW5kIHJlc3RvcmUgbWVjaGFuaXNtLjwvZGQ+Ci0KLSA8ZHQ+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL0JsdWV0b290aENoYXQvaW5kZXguaHRtbCI+Qmx1ZXRvb3RoIENoYXQ8L2E+PC9kdD4KLSAgPGRkPkFuIGFwcGxpY2F0aW9uIGZvciB0d28td2F5IHRleHQgbWVzc2FnaW5nIG92ZXIgQmx1ZXRvb3RoLjwvZGQ+Ci0KLSA8ZHQ+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL0NvbnRhY3RNYW5hZ2VyL2luZGV4Lmh0bWwiPkNvbnRhY3QgTWFuYWdlcjwvYT48L2R0PgotICA8ZGQ+QW4gYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIHF1ZXJ5IHRoZSBzeXN0ZW0gY29udGFjdHMgcHJvdmlkZXIgCi0gIHVzaW5nIHRoZSA8Y29kZT5Db250YWN0c0NvbnRyYWN0PC9jb2RlPiBBUEksIGFzCi0gIHdlbGwgYXMgaW5zZXJ0IGNvbnRhY3RzIGludG8gYSBzcGVjaWZpYyBhY2NvdW50LjwvZGQ+Ci0gIAotIDxkdD48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvSG9tZS9pbmRleC5odG1sIj5Ib21lPC9hPjwvZHQ+Ci0gIDxkZD5BIGhvbWUgc2NyZWVuIHJlcGxhY2VtZW50IGFwcGxpY2F0aW9uLjwvZGQ+Ci0gIAotIDxkdD48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvSmV0Qm95L2luZGV4Lmh0bWwiPkpldEJveTwvYT48L2R0PgotICA8ZGQ+SmV0Qm95IGlzIGEgZ2FtZSB0aGF0IGRlbW9uc3RyYXRlcyB0aGUgU09OaVZPWCBKRVQgaW50ZXJhY3RpdmUgbXVzaWMgdGVjaG5vbG9neSwKLSAgd2l0aCB7QGxpbmsgYW5kcm9pZC5tZWRpYS5KZXRQbGF5ZXJ9LjwvZGQ+Ci0gICAgCi0gPGR0PjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9MdW5hckxhbmRlci9pbmRleC5odG1sIj5MdW5hciBMYW5kZXI8L2E+PC9kdD4KLSAgPGRkPkEgY2xhc3NpYyBMdW5hciBMYW5kZXIgZ2FtZS48L2RkPgotCi0gPGR0PjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9NdWx0aVJlc29sdXRpb24vaW5kZXguaHRtbCI+TXVsdGlwbGUgUmVzb2x1dGlvbnM8L2E+PC9kdD4KLSAgPGRkPkEgc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgc2hvd3MgaG93IHRvIHVzZSByZXNvdXJjZSBkaXJlY3RvcnkgcXVhbGlmaWVycyB0bwotICBwcm92aWRlIGRpZmZlcmVudCByZXNvdXJjZXMgZm9yIGRpZmZlcmVudCBzY3JlZW4gY29uZmlndXJhdGlvbnMuPC9kZD4KLSAgCi0gPGR0PjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9Ob3RlUGFkL2luZGV4Lmh0bWwiPk5vdGUgUGFkPC9hPjwvZHQ+Ci0gIDxkZD5BbiBhcHBsaWNhdGlvbiBmb3Igc2F2aW5nIG5vdGVzLiBTaW1pbGFyIChidXQgbm90IGlkZW50aWNhbCkgdG8gdGhlIAotICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvaW5kZXguaHRtbCI+Tm90ZXBhZCB0dXRvcmlhbDwvYT4uPC9kZD4KLSAgCi0gPGR0PjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9pbmRleC5odG1sIj5TZWFyY2hhYmxlIERpY3Rpb25hcnk8L2E+PC9kdD4KLSAgPGRkPkEgc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIEFuZHJvaWQncyBzZWFyY2ggZnJhbWV3b3JrLCAKLSAgaW5jbHVkaW5nIGhvdyB0byBwcm92aWRlIHNlYXJjaCBzdWdnZXN0aW9ucyBmb3IgUXVpY2sgU2VhcmNoIEJveC48L2RkPgotICAKLSA8ZHQ+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL1NuYWtlL2luZGV4Lmh0bWwiPlNuYWtlPC9hPjwvZHQ+Ci0gIDxkZD5BbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xhc3NpYyBnYW1lICJTbmFrZS4iPC9kZD4KLSAgCi0gPGR0PjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9Tb2Z0S2V5Ym9hcmQvaW5kZXguaHRtbCI+U29mdCBLZXlib2FyZDwvYT48L2R0PgotICA8ZGQ+QW4gZXhhbXBsZSBvZiB3cml0aW5nIGFuIGlucHV0IG1ldGhvZCBmb3IgYSBzb2Z0d2FyZSBrZXlib2FyZC48L2RkPgotCi0gPGR0PjxhIGhyZWY9IiJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeS9pbmRleC5odG1sIj5XaWt0aW9uYXJ5PC9hPjwvZHQ+Ci0gIDxkZD5BbiBleGFtcGxlIG9mIGNyZWF0aW5nIGludGVyYWN0aXZlIHdpZGdldHMgZm9yIGRpc3BsYXkgb24gdGhlIEFuZHJvaWQKLSAgaG9tZSBzY3JlZW4uPC9kZD4KLQotIDxkdD48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZS9pbmRleC5odG1sIj5XaWt0aW9uYXJ5IChTaW1wbGlmaWVkKTwvYT48L2R0PgotICA8ZGQ+QSBzaW1wbGUgQW5kcm9pZCBob21lIHNjcmVlbiB3aWRnZXRzIGV4YW1wbGUuPC9kZD4KLSAgICAKLTwvZGw+Ci0KLQotPGRpdiBjbGFzcz0ic3BlY2lhbCI+Ci08cD5Gb3IgbW9yZSBzYW1wbGUgYXBwbGljYXRpb25zLCBjaGVjayBvdXQKLTxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hcHBzLWZvci1hbmRyb2lkLyI+YXBwcy1mb3ItYW5kcm9pZDwvYT4sIGEKLWNvbGxlY3Rpb24gb2Ygb3BlbiBzb3VyY2UgYXBwbGljYXRpb25zIHRoYXQgZGVtb25zdHJhdGUgdmFyaW91cyBBbmRyb2lkIEFQSXMuCi08L3A+Ci08L2Rpdj4KIAogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2RhdGEvYmFja3VwLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9kYXRhL2JhY2t1cC5qZAppbmRleCBhZWVmY2E4Li42YzAyMDMxIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2RhdGEvYmFja3VwLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZGF0YS9iYWNrdXAuamQKQEAgLTI0MCw3ICsyNDAsNyBAQAogPGgyIGlkPSJCYWNrdXBBZ2VudCI+RXh0ZW5kaW5nIEJhY2t1cEFnZW50PC9oMj4KIAogPHA+TW9zdCBhcHBsaWNhdGlvbnMgc2hvdWxkbid0IG5lZWQgdG8gZXh0ZW5kIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cEFnZW50fSBjbGFzcwotZGlyZWN0bHksIGJ1dCBzaG91bGQgaW5zdGVhZCA8YSBocmVmPSJCYWNrdXBBZ2VudEhlbHBlciI+ZXh0ZW5kIEJhY2t1cEFnZW50SGVscGVyPC9hPiB0byB0YWtlCitkaXJlY3RseSwgYnV0IHNob3VsZCBpbnN0ZWFkIDxhIGhyZWY9IiNCYWNrdXBBZ2VudEhlbHBlciI+ZXh0ZW5kIEJhY2t1cEFnZW50SGVscGVyPC9hPiB0byB0YWtlCiBhZHZhbnRhZ2Ugb2YgdGhlIGJ1aWx0LWluIGhlbHBlciBjbGFzc2VzIHRoYXQgYXV0b21hdGljYWxseSBiYWNrdXAgYW5kIHJlc3RvcmUgeW91ciBmaWxlcy4gSG93ZXZlciwKIHlvdSBtaWdodCB3YW50IHRvIGV4dGVuZCB7QGxpbmsgYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cEFnZW50fSBkaXJlY3RseSBpZiB5b3UgbmVlZCB0bzo8L3A+CiA8dWw+CkBAIC0yNjIsNyArMjYyLDcgQEAKIDxwPklmIHlvdSBkb24ndCBuZWVkIHRvIHBlcmZvcm0gYW55IG9mIHRoZSB0YXNrcyBhYm92ZSBhbmQgd2FudCB0byBiYWNrIHVwIGNvbXBsZXRlIGZpbGVzIGZyb20KIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXN9IG9yIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2RhdGEvZGF0YS1zdG9yYWdlLmh0bWwjZmlsZXNJbnRlcm5hbCI+aW50ZXJuYWwgc3RvcmFnZTwvYT4sIHlvdQotc2hvdWxkIHNraXAgdG8gPGEgaHJlZj0iQmFja3VwQWdlbnRIZWxwZXIiPkV4dGVuZGluZyBCYWNrdXBBZ2VudEhlbHBlcjwvYT4uPC9wPgorc2hvdWxkIHNraXAgdG8gPGEgaHJlZj0iI0JhY2t1cEFnZW50SGVscGVyIj5FeHRlbmRpbmcgQmFja3VwQWdlbnRIZWxwZXI8L2E+LjwvcD4KIAogCiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3Byb3ZpZGluZy1yZXNvdXJjZXMuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9wcm92aWRpbmctcmVzb3VyY2VzLmpkCmluZGV4IGNhYzg1ZTguLjdlMmY4YTAgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3Byb3ZpZGluZy1yZXNvdXJjZXMuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvcHJvdmlkaW5nLXJlc291cmNlcy5qZApAQCAtNzYxLDcgKzc2MSw3IEBACiBjYW5ub3QgdXNlIHRoZSByZXNvdXJjZXMgbmFtZWQgd2l0aCB0aGUgbmV3IHF1YWxpZmllci4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sI21pbiI+e0Bjb2RlCiBtaW5TZGtWZXJzaW9ufTwvYT4gaXMgc2V0IHRvIDQsIGFuZCB5b3UgcXVhbGlmeSBhbGwgb2YgeW91ciBkcmF3YWJsZSByZXNvdXJjZXMgdXNpbmcgPGEKLWhyZWY9Ik5pZ2h0UXVhbGlmaWVyIj5uaWdodCBtb2RlPC9hPiAoe0Bjb2RlIG5pZ2h0fSBvciB7QGNvZGUgbm90bmlnaHR9LCB3aGljaCB3ZXJlIGFkZGVkIGluIEFQSQoraHJlZj0iI05pZ2h0UXVhbGlmaWVyIj5uaWdodCBtb2RlPC9hPiAoe0Bjb2RlIG5pZ2h0fSBvciB7QGNvZGUgbm90bmlnaHR9LCB3aGljaCB3ZXJlIGFkZGVkIGluIEFQSQogTGV2ZWwgOCksIHRoZW4gYW4gQVBJIExldmVsIDQgZGV2aWNlIGNhbm5vdCBhY2Nlc3MgeW91ciBkcmF3YWJsZSByZXNvdXJjZXMgYW5kIHdpbGwgY3Jhc2guIEluIHRoaXMKIGNhc2UsIHlvdSBwcm9iYWJseSB3YW50IHtAY29kZSBub3RuaWdodH0gdG8gYmUgeW91ciBkZWZhdWx0IHJlc291cmNlcywgc28geW91IHNob3VsZCBleGNsdWRlIHRoYXQKIHF1YWxpZmllciBzbyB5b3VyIGRyYXdhYmxlIHJlc291cmNlcyBhcmUgaW4gZWl0aGVyIHtAY29kZSBkcmF3YWJsZS99IG9yIHtAY29kZSBkcmF3YWJsZS1uaWdodC99LjwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5qZAppbmRleCA4MWM1ZDU1Li4yZGIzOGYxIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmpkCkBAIC0xMiw4ICsxMiw4IEBACiAgICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IHByb3ZpZGVzIGEgc2luZ2xlIHN0cmluZy48L2RkPgogICA8ZHQ+PGEgaHJlZj0iI1N0cmluZ0FycmF5Ij5TdHJpbmcgQXJyYXk8L2E+PC9kdD4KICAgICA8ZGQ+WE1MIHJlc291cmNlIHRoYXQgcHJvdmlkZXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy48L2RkPgotICA8ZHQ+PGEgaHJlZj0iI1BsdXJhbHMiPlBsdXJhbHM8L2E+PC9kdD4KLSAgICA8ZGQ+WE1MIHJlc291cmNlIHRoYXQgY2FycmllcyBkaWZmZXJlbnQgc3RyaW5ncyBmb3IgZGlmZmVyZW50IHBsdXJhbGl6YXRpb25zCisgIDxkdD48YSBocmVmPSIjUGx1cmFscyI+UXVhbnRpdHkgU3RyaW5ncyAoUGx1cmFscyk8L2E+PC9kdD4KKyAgICA8ZGQ+WE1MIHJlc291cmNlIHRoYXQgY2FycmllcyBkaWZmZXJlbnQgc3RyaW5ncyBmb3IgZGlmZmVyZW50IHF1YW50aXRpZXMKICAgICBvZiB0aGUgc2FtZSB3b3JkIG9yIHBocmFzZS48L2RkPgogPC9kbD4KIApAQCAtMjE4LDEzICsyMTgsMzAgQEAKIAogCiAKLTxoMiBpZD0iUGx1cmFscyI+UGx1cmFsczwvaDI+Cis8aDIgaWQ9IlBsdXJhbHMiPlF1YW50aXR5IFN0cmluZ3MgKFBsdXJhbHMpPC9oMj4KIAotPHA+QSBwYWlyIG9mIHN0cmluZ3MgdGhhdCBlYWNoIHByb3ZpZGUgYSBkaWZmZXJlbnQgcGx1cmFsIGZvcm0gb2YgdGhlIHNhbWUgd29yZCBvciBwaHJhc2UsCi13aGljaCB5b3UgY2FuIGNvbGxlY3RpdmVseSByZWZlcmVuY2UgZnJvbSB0aGUgYXBwbGljYXRpb24uIFdoZW4geW91IHJlcXVlc3QgdGhlIHBsdXJhbHMKLXJlc291cmNlIHVzaW5nIGEgbWV0aG9kIHN1Y2ggYXMge0BsaW5rIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzI2dldFF1YW50aXR5U3RyaW5nKGludCxpbnQpCi1nZXRRdWFudGl0eVN0cmluZygpfSwgeW91IG11c3QgcGFzcyBhICJjb3VudCIsIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIHRoZSBwbHVyYWwgZm9ybSB5b3UKLXJlcXVpcmUgYW5kIHJldHVybiB0aGF0IHN0cmluZyB0byB5b3UuPC9wPgorPHA+RGlmZmVyZW50IGxhbmd1YWdlcyBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgZ3JhbW1hdGljYWwgYWdyZWVtZW50IHdpdGggcXVhbnRpdHkuIEluIEVuZ2xpc2gsCitmb3IgZXhhbXBsZSwgdGhlIHF1YW50aXR5IDEgaXMgYSBzcGVjaWFsIGNhc2UuIFdlIHdyaXRlICIxIGJvb2siLCBidXQgZm9yIGFueSBvdGhlciBxdWFudGl0eSB3ZSdkCit3cml0ZSAiPGk+bjwvaT4gYm9va3MiLiBUaGlzIGRpc3RpbmN0aW9uIGJldHdlZW4gc2luZ3VsYXIgYW5kIHBsdXJhbCBpcyB2ZXJ5IGNvbW1vbiwgYnV0IG90aGVyCitsYW5ndWFnZXMgbWFrZSBmaW5lciBkaXN0aW5jdGlvbnMuIFRoZSBmdWxsIHNldCBzdXBwb3J0ZWQgYnkgQW5kcm9pZCBpcyA8Y29kZT56ZXJvPC9jb2RlPiwKKzxjb2RlPm9uZTwvY29kZT4sIDxjb2RlPnR3bzwvY29kZT4sIDxjb2RlPmZldzwvY29kZT4sIDxjb2RlPm1hbnk8L2NvZGU+LCBhbmQgPGNvZGU+b3RoZXI8L2NvZGU+LgorCis8cD5UaGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIGNhc2UgdG8gdXNlIGZvciBhIGdpdmVuIGxhbmd1YWdlIGFuZCBxdWFudGl0eSBjYW4gYmUgdmVyeSBjb21wbGV4LAorc28gQW5kcm9pZCBwcm92aWRlcyB5b3Ugd2l0aCBtZXRob2RzIHN1Y2ggYXMKK3tAbGluayBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyNnZXRRdWFudGl0eVN0cmluZyhpbnQsaW50KSBnZXRRdWFudGl0eVN0cmluZygpfSB0byBzZWxlY3QKK3RoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBmb3IgeW91LgorCis8cD5Ob3RlIHRoYXQgdGhlIHNlbGVjdGlvbiBpcyBtYWRlIGJhc2VkIG9uIGdyYW1tYXRpY2FsIG5lY2Vzc2l0eS4gQSBzdHJpbmcgZm9yIDxjb2RlPnplcm88L2NvZGU+CitpbiBFbmdsaXNoIHdpbGwgYmUgaWdub3JlZCBldmVuIGlmIHRoZSBxdWFudGl0eSBpcyAwLCBiZWNhdXNlIDAgaXNuJ3QgZ3JhbW1hdGljYWxseSBkaWZmZXJlbnQKK2Zyb20gMiwgb3IgYW55IG90aGVyIG51bWJlciBleGNlcHQgMSAoInplcm8gYm9va3MiLCAib25lIGJvb2siLCAidHdvIGJvb2tzIiwgZXQgY2V0ZXJhKS4KK0Rvbid0IGJlIG1pc2xlZCBlaXRoZXIgYnkgdGhlIGZhY3QgdGhhdCwgc2F5LCA8Y29kZT50d288L2NvZGU+IHNvdW5kcyBsaWtlIGl0IGNvdWxkIG9ubHkgYXBwbHkgdG8KK3RoZSBxdWFudGl0eSAyOiBhIGxhbmd1YWdlIG1heSByZXF1aXJlIHRoYXQgMiwgMTIsIDEwMiAoZXQgY2V0ZXJhKSBhcmUgYWxsIHRyZWF0ZWQgbGlrZSBvbmUKK2Fub3RoZXIgYnV0IGRpZmZlcmVudGx5IHRvIG90aGVyIHF1YW50aXRpZXMuIFJlbHkgb24geW91ciB0cmFuc2xhdG9yIHRvIGtub3cgd2hhdCBkaXN0aW5jdGlvbnMKK3RoZWlyIGxhbmd1YWdlIGFjdHVhbGx5IGluc2lzdHMgdXBvbi4KKworPHA+SXQncyBvZnRlbiBwb3NzaWJsZSB0byBhdm9pZCBxdWFudGl0eSBzdHJpbmdzIGJ5IHVzaW5nIHF1YW50aXR5LW5ldXRyYWwgZm9ybXVsYXRpb25zIHN1Y2ggYXMKKyJCb29rczogMSIuIFRoaXMgd2lsbCBtYWtlIHlvdXIgbGlmZSBhbmQgeW91ciB0cmFuc2xhdG9ycycgbGl2ZXMgZWFzaWVyLCBpZiBpdCdzIGEgc3R5bGUgdGhhdCdzCitpbiBrZWVwaW5nIHdpdGggeW91ciBhcHBsaWNhdGlvbi4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gQSBwbHVyYWxzIGNvbGxlY3Rpb24gaXMgYSBzaW1wbGUgcmVzb3VyY2UgdGhhdCBpcwogcmVmZXJlbmNlZCB1c2luZyB0aGUgdmFsdWUgcHJvdmlkZWQgaW4gdGhlIHtAY29kZSBuYW1lfSBhdHRyaWJ1dGUgKG5vdCB0aGUgbmFtZSBvZiB0aGUgWE1MCkBAIC0yNTEsNyArMjY4LDcgQEAKICAgICAmbHQ7PGEgaHJlZj0iI3BsdXJhbHMtZWxlbWVudCI+cGx1cmFsczwvYT4KICAgICAgICAgbmFtZT0iPGVtPnBsdXJhbF9uYW1lPC9lbT4iPgogICAgICAgICAmbHQ7PGEgaHJlZj0iI3BsdXJhbHMtaXRlbS1lbGVtZW50Ij5pdGVtPC9hPgotICAgICAgICAgICAgcXVhbnRpdHk9WyJvbmUiIHwgIm90aGVyIl0KKyAgICAgICAgICAgIHF1YW50aXR5PVsiemVybyIgfCAib25lIiB8ICJ0d28iIHwgImZldyIgfCAibWFueSIgfCAib3RoZXIiXQogICAgICAgICAgICAgJmd0OzxlbT50ZXh0X3N0cmluZzwvZW0+Jmx0Oy9pdGVtPgogICAgICZsdDsvcGx1cmFscz4KICZsdDsvcmVzb3VyY2VzPgpAQCAtMjg1LDE2ICszMDIsMjcgQEAKICAgICAgIDxwIGNsYXNzPSJjYXBzIj5hdHRyaWJ1dGVzOjwvcD4KICAgICAgIDxkbCBjbGFzcz0iYXRuLWxpc3QiPgogICAgICAgICA8ZHQ+PGNvZGU+cXVhbnRpdHk8L2NvZGU+PC9kdD4KLSAgICAgICAgPGRkPjxlbT5LZXl3b3JkPC9lbT4uIEEgdmFsdWUgaW5kaWNhdGluZyB0aGUgY2FzZSBpbiB3aGljaCB0aGlzIHN0cmluZyBzaG91bGQgYmUgdXNlZC4gVmFsaWQKLXZhbHVlczoKKyAgICAgICAgPGRkPjxlbT5LZXl3b3JkPC9lbT4uIEEgdmFsdWUgaW5kaWNhdGluZyB3aGVuIHRoaXMgc3RyaW5nIHNob3VsZCBiZSB1c2VkLiBWYWxpZAordmFsdWVzLCB3aXRoIG5vbi1leGhhdXN0aXZlIGV4YW1wbGVzIGluIHBhcmVudGhlc2VzOgogICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgIDx0cj48dGg+VmFsdWU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj4KICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPntAY29kZSBvbmV9PC90ZD48dGQ+V2hlbiB0aGVyZSBpcyBvbmUgKGEgc2luZ3VsYXIgc3RyaW5nKS48L3RkPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIHplcm99PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgdGhlIG51bWJlciAwIChhcyBpbiBBcmFiaWMpLjwvdGQ+CiAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG90aGVyfTwvdGQ+PHRkPldoZW4gdGhlIHF1YW50aXR5IGlzIGFueXRoaW5nIG90aGVyIHRoYW4gb25lIChhIHBsdXJhbAotc3RyaW5nLCBidXQgYWxzbyB1c2VkIHdoZW4gdGhlIGNvdW50IGlzIHplcm8pLjwvdGQ+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgb25lfTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mIG51bWJlcnMgbGlrZSBvbmUgKGFzIHdpdGggdGhlIG51bWJlciAxIGluIEVuZ2xpc2ggYW5kIG1vc3Qgb3RoZXIgbGFuZ3VhZ2VzOyBpbiBSdXNzaWFuLCBhbnkgbnVtYmVyIGVuZGluZyBpbiAxIGJ1dCBub3QgZW5kaW5nIGluIDExIGlzIGluIHRoaXMgY2xhc3MpLjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIHR3b308L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiBudW1iZXJzIGxpa2UgdHdvIChhcyBpbiBXZWxzaCkuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgZmV3fTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mICJzbWFsbCIgbnVtYmVycyAoYXMgd2l0aCAyLCAzLCBhbmQgNCBpbiBDemVjaDsgb3IgbnVtYmVycyBlbmRpbmcgMiwgMywgb3IgNCBidXQgbm90IDEyLCAxMywgb3IgMTQgaW4gUG9saXNoKS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSBtYW55fTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mICJsYXJnZSIgbnVtYmVycyAoYXMgd2l0aCBudW1iZXJzIGVuZGluZyAxMS05OSBpbiBNYWx0ZXNlKS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSBvdGhlcn08L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSBkb2VzIG5vdCByZXF1aXJlIHNwZWNpYWwgdHJlYXRtZW50IG9mIHRoZSBnaXZlbiBxdWFudGl0eS48L3RkPgogICAgICAgICAgICAgPC90cj4KICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICA8L2RkPgpAQCAtMzE1LDYgKzM0MywxNyBAQAogICAgICZsdDsvcGx1cmFscz4KICZsdDsvcmVzb3VyY2VzPgogPC9wcmU+CisgICAgPHA+WE1MIGZpbGUgc2F2ZWQgYXQge0Bjb2RlIHJlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWx9OjwvcD4KKzxwcmU+CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorJmx0O3Jlc291cmNlcz4KKyAgICAmbHQ7cGx1cmFscyBuYW1lPSJudW1iZXJPZlNvbmdzQXZhaWxhYmxlIj4KKyAgICAgICAgJmx0O2l0ZW0gcXVhbnRpdHk9Im9uZSI+Wm5hbGV6aW9ubyBqZWRuJiN4MDEwNTsgcGlvc2VuayYjeDAxMTk7LiZsdDsvaXRlbT4KKyAgICAgICAgJmx0O2l0ZW0gcXVhbnRpdHk9ImZldyI+Wm5hbGV6aW9ubyAlZCBwaW9zZW5raS4mbHQ7L2l0ZW0+CisgICAgICAgICZsdDtpdGVtIHF1YW50aXR5PSJvdGhlciI+Wm5hbGV6aW9ubyAlZCBwaW9zZW5lay4mbHQ7L2l0ZW0+CisgICAgJmx0Oy9wbHVyYWxzPgorJmx0Oy9yZXNvdXJjZXM+Cis8L3ByZT4KICAgICA8cD5KYXZhIGNvZGU6PC9wPgogPHByZT4KIGludCBjb3VudCA9IGdldE51bWJlck9mc29uZ3NBdmFpbGFibGUoKTsKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvYXhpc19kZXZpY2UucG5nIGIvZG9jcy9odG1sL2ltYWdlcy9heGlzX2RldmljZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmNjY2YQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9pbWFnZXMvYXhpc19kZXZpY2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvYXhpc19nbG9iZS5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL2F4aXNfZ2xvYmUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjY2I1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvaW1hZ2VzL2F4aXNfZ2xvYmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbnRsL2phL2NvbW11bml0eS9pbmRleC5qZCBiL2RvY3MvaHRtbC9pbnRsL2phL2NvbW11bml0eS9pbmRleC5qZAppbmRleCA2NTlhZWU3Li40OTBiMjNmIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvaW50bC9qYS9jb21tdW5pdHkvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL2ludGwvamEvY29tbXVuaXR5L2luZGV4LmpkCkBAIC00LDkgKzQsOSBAQAogCiAJPGRpdiBpZD0ibWFpbkJvZHlGbHVpZCI+CiAJCQk8aDE+44Kz44Of44Ol44OL44OG44KjPC9oMT4KLQkJCTxwPkFuZHJvaWQg44OH44OZ44Ot44OD44OR44O8IOOCs+ODn+ODpeODi+ODhuOCo+OBuOOCiOOBhuOBk+OBneOAguOCs+ODn+ODpeODi+ODhuOCo+OBp+OBruODh+OCo+OCueOCq+ODg+OCt+ODp+ODs+OBq+OBnOOBsuWPguWKoOOBl+OBpuOBj+OBoOOBleOBhOOAguaKleeov+OBmeOCi+WJjeOBq+OAgeOCs+ODn+ODpeODi+ODhuOCoyDjgqzjgqTjg4njg6njgqTjg7PjgYzoqJjovInjgZXjgozjgabjgYTjgos8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2Rpc2N1c3MvYW5kcm9pZC1kaXNjdXNzaW9uLWdyb3Vwcy1jaGFydGVyIj7jgrDjg6vjg7zjg5fjga7otqPmhI88L2E+44KS44GK6Kqt44G/44GP44Gg44GV44GE44CCPC9wPgorCQkJPHA+QW5kcm9pZCDjg4fjg5njg63jg4Pjg5Hjg7wg44Kz44Of44Ol44OL44OG44Kj44G444KI44GG44GT44Gd44CC44Kz44Of44Ol44OL44OG44Kj44Gn44Gu44OH44Kj44K544Kr44OD44K344On44Oz44Gr44Gc44Gy5Y+C5Yqg44GX44Gm44GP44Gg44GV44GE44CC5oqV56i/44GZ44KL5YmN44Gr44CB44Kz44Of44Ol44OL44OG44KjIOOCrOOCpOODieODqeOCpOODs+OBjOiomOi8ieOBleOCjOOBpuOBhOOCizxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vY29tbXVuaXR5L2dyb3Vwcy1jaGFydGVyLmh0bWwiPuOCsOODq+ODvOODl+OBrui2o+aEjzwvYT7jgpLjgYroqq3jgb/jgY/jgaDjgZXjgYTjgII8L3A+CiAKLTxwIGNsYXNzPSJub3RlIj48c3Ryb25nPuazqDo8L3N0cm9uZz4gQW5kcm9pZCDjgr3jg7zjgrkg44Kz44O844OJ77yI44Ki44OX44Oq44Kx44O844K344On44Oz6ZaL55m644Gn44Gv44Gq44GP77yJ44Gr6Zai44GZ44KL44OH44Kj44K544Kr44OD44K344On44Oz44Gv44CBPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9kaXNjdXNzIj7jgqrjg7zjg5fjg7Pjgr3jg7zjgrkg44OX44Ot44K444Kn44Kv44OI44Gu44Oh44O844Oq44Oz44KwIOODquOCueODiDwvYT7vvIjoi7Hoqp7vvInjgpLlj4LnhafjgZfjgabjgY/jgaDjgZXjgYTjgII8L3A+Cis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz7ms6g6PC9zdHJvbmc+IEFuZHJvaWQg44K944O844K5IOOCs+ODvOODie+8iOOCouODl+ODquOCseODvOOCt+ODp+ODs+mWi+eZuuOBp+OBr+OBquOBj++8ieOBq+mWouOBmeOCi+ODh+OCo+OCueOCq+ODg+OCt+ODp+ODs+OBr+OAgTxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vY29tbXVuaXR5Ij7jgqrjg7zjg5fjg7Pjgr3jg7zjgrkg44OX44Ot44K444Kn44Kv44OI44Gu44Oh44O844Oq44Oz44KwIOODquOCueODiDwvYT7vvIjoi7Hoqp7vvInjgpLlj4LnhafjgZfjgabjgY/jgaDjgZXjgYTjgII8L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOi41ZW0iPjxzdHJvbmc+55uu5qyhPC9zdHJvbmc+PC9wPgogPG9sIGNsYXNzPSJ0b2MiPgpAQCAtMjgsNyArMjgsNyBAQAogCiA8cD7os6rllY/jgbjjga7nrZTjgYjjgYzopovjgaTjgYvjgonjgarjgYTloLTlkIjjgIHjgrPjg5/jg6Xjg4vjg4bjgqPjgafos6rllY/jgZnjgovjgZPjgajjgpLjgYrjgZnjgZnjgoHjgZfjgb7jgZnjgILmipXnqL/jgZnjgovpmpvjga/jgIHmrKHjga7miYvpoIbjgavlvpPjgaPjgabjgY/jgaDjgZXjgYTjgIIKIDxvbD4KLTxsaT7jgrPjg5/jg6Xjg4vjg4bjgqMg44Ks44Kk44OJ44Op44Kk44Oz44GM6KiY6LyJ44GV44KM44Gm44GE44KLPGI+PGEgaHJlZj0iaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vYS9hbmRyb2lkLmNvbS9vcGVuc291cmNlL2Rpc2N1c3MvYW5kcm9pZC1kaXNjdXNzaW9uLWdyb3Vwcy1jaGFydGVyIj5BbmRyb2lkIOODoeODvOODquODs+OCsOODquOCueODiOOBrui2o+aEjzwvYT48L2I+44KS44GK6Kqt44G/44GP44Gg44GV44GE44CCIAorPGxpPuOCs+ODn+ODpeODi+ODhuOCoyDjgqzjgqTjg4njg6njgqTjg7PjgYzoqJjovInjgZXjgozjgabjgYTjgos8Yj48YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5odG1sIj5BbmRyb2lkIOODoeODvOODquODs+OCsOODquOCueODiOOBrui2o+aEjzwvYT48L2I+44KS44GK6Kqt44G/44GP44Gg44GV44GE44CCIAogPC9saT4KIDxsaT48Yj7os6rllY/jgavmnIDpganjgarjg6Hjg7zjg6rjg7PjgrAg44Oq44K544OI44KS6YG45oqe44GX44Gm44GP44Gg44GV44GEPC9iPuOAguW+jOi/sOOBmeOCi+OCiOOBhuOBq+OAgeODh+ODmeODreODg+ODkeODvOWQkeOBkeOBruODoeODvOODquODs+OCsCDjg6rjgrnjg4jjga/kvZXnqK7poZ7jgYvjgavliIbjgYvjgozjgabjgYTjgb7jgZnjgII8L2xpPgogPGxpPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2ludGwvamEvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQgYi9kb2NzL2h0bWwvaW50bC9qYS9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZAppbmRleCBjOTliMWY4Li5lY2VkZGUxIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvaW50bC9qYS9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZAorKysgYi9kb2NzL2h0bWwvaW50bC9qYS9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZApAQCAtNCw5ICs0LDkgQEAKIAogCTxkaXYgaWQ9Im1haW5Cb2R5Rmx1aWQiPgogCQkJPGgxPuOCs+ODn+ODpeODi+ODhuOCozwvaDE+Ci0JCQk8cD5BbmRyb2lkIOODh+ODmeODreODg+ODkeODvCDjgrPjg5/jg6Xjg4vjg4bjgqPjgbjjgojjgYbjgZPjgZ3jgILjgrPjg5/jg6Xjg4vjg4bjgqPjgafjga7jg4fjgqPjgrnjgqvjg4Pjgrfjg6fjg7PjgavjgZzjgbLlj4LliqDjgZfjgabjgY/jgaDjgZXjgYTjgILmipXnqL/jgZnjgovliY3jgavjgIHjgrPjg5/jg6Xjg4vjg4bjgqMg44Ks44Kk44OJ44Op44Kk44Oz44GM6KiY6LyJ44GV44KM44Gm44GE44KLPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9kaXNjdXNzL2FuZHJvaWQtZGlzY3Vzc2lvbi1ncm91cHMtY2hhcnRlciI+44Kw44Or44O844OX44Gu6Laj5oSPPC9hPuOCkuOBiuiqreOBv+OBj+OBoOOBleOBhOOAgjwvcD4KKwkJCTxwPkFuZHJvaWQg44OH44OZ44Ot44OD44OR44O8IOOCs+ODn+ODpeODi+ODhuOCo+OBuOOCiOOBhuOBk+OBneOAguOCs+ODn+ODpeODi+ODhuOCo+OBp+OBruODh+OCo+OCueOCq+ODg+OCt+ODp+ODs+OBq+OBnOOBsuWPguWKoOOBl+OBpuOBj+OBoOOBleOBhOOAguaKleeov+OBmeOCi+WJjeOBq+OAgeOCs+ODn+ODpeODi+ODhuOCoyDjgqzjgqTjg4njg6njgqTjg7PjgYzoqJjovInjgZXjgozjgabjgYTjgos8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5odG1sIj7jgrDjg6vjg7zjg5fjga7otqPmhI88L2E+44KS44GK6Kqt44G/44GP44Gg44GV44GE44CCPC9wPgogCi08cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz7ms6g6PC9zdHJvbmc+IEFuZHJvaWQg44K944O844K5IOOCs+ODvOODie+8iOOCouODl+ODquOCseODvOOCt+ODp+ODs+mWi+eZuuOBp+OBr+OBquOBj++8ieOBq+mWouOBmeOCi+ODh+OCo+OCueOCq+ODg+OCt+ODp+ODs+OBr+OAgTxhIGhyZWY9Imh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGlzY3VzcyI+44Kq44O844OX44Oz44K944O844K5IOODl+ODreOCuOOCp+OCr+ODiOOBruODoeODvOODquODs+OCsCDjg6rjgrnjg4g8L2E+77yI6Iux6Kqe77yJ44KS5Y+C54Wn44GX44Gm44GP44Gg44GV44GE44CCPC9wPgorPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+5rOoOjwvc3Ryb25nPiBBbmRyb2lkIOOCveODvOOCuSDjgrPjg7zjg4nvvIjjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7Pplovnmbrjgafjga/jgarjgY/vvInjgavplqLjgZnjgovjg4fjgqPjgrnjgqvjg4Pjgrfjg6fjg7Pjga/jgIE8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eSI+44Kq44O844OX44Oz44K944O844K5IOODl+ODreOCuOOCp+OCr+ODiOOBruODoeODvOODquODs+OCsCDjg6rjgrnjg4g8L2E+77yI6Iux6Kqe77yJ44KS5Y+C54Wn44GX44Gm44GP44Gg44GV44GE44CCPC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTouNWVtIj48c3Ryb25nPuebruasoTwvc3Ryb25nPjwvcD4KIDxvbCBjbGFzcz0idG9jIj4KQEAgLTI4LDcgKzI4LDcgQEAKIAogPHA+6LOq5ZWP44G444Gu562U44GI44GM6KaL44Gk44GL44KJ44Gq44GE5aC05ZCI44CB44Kz44Of44Ol44OL44OG44Kj44Gn6LOq5ZWP44GZ44KL44GT44Go44KS44GK44GZ44GZ44KB44GX44G+44GZ44CC5oqV56i/44GZ44KL6Zqb44Gv44CB5qyh44Gu5omL6aCG44Gr5b6T44Gj44Gm44GP44Gg44GV44GE44CCCiA8b2w+Ci08bGk+44Kz44Of44Ol44OL44OG44KjIOOCrOOCpOODieODqeOCpOODs+OBjOiomOi8ieOBleOCjOOBpuOBhOOCizxiPjxhIGhyZWY9Imh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL2EvYW5kcm9pZC5jb20vb3BlbnNvdXJjZS9kaXNjdXNzL2FuZHJvaWQtZGlzY3Vzc2lvbi1ncm91cHMtY2hhcnRlciI+QW5kcm9pZCDjg6Hjg7zjg6rjg7PjgrDjg6rjgrnjg4jjga7otqPmhI88L2E+PC9iPuOCkuOBiuiqreOBv+OBj+OBoOOBleOBhOOAgiAKKzxsaT7jgrPjg5/jg6Xjg4vjg4bjgqMg44Ks44Kk44OJ44Op44Kk44Oz44GM6KiY6LyJ44GV44KM44Gm44GE44KLPGI+PGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21tdW5pdHkvZ3JvdXBzLWNoYXJ0ZXIuaHRtbCI+QW5kcm9pZCDjg6Hjg7zjg6rjg7PjgrDjg6rjgrnjg4jjga7otqPmhI88L2E+PC9iPuOCkuOBiuiqreOBv+OBj+OBoOOBleOBhOOAgiAKIDwvbGk+CiA8bGk+PGI+6LOq5ZWP44Gr5pyA6YGp44Gq44Oh44O844Oq44Oz44KwIOODquOCueODiOOCkumBuOaKnuOBl+OBpuOBj+OBoOOBleOBhDwvYj7jgILlvozov7DjgZnjgovjgojjgYbjgavjgIHjg4fjg5njg63jg4Pjg5Hjg7zlkJHjgZHjga7jg6Hjg7zjg6rjg7PjgrAg44Oq44K544OI44Gv5L2V56iu6aGe44GL44Gr5YiG44GL44KM44Gm44GE44G+44GZ44CCPC9saT4KIDxsaT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvcGFpbmxlc3MtdGhyZWFkaW5nLmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuamQKaW5kZXggOTIxZjRkZi4uMTdjZWMzNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuamQKQEAgLTEwOCw3ICsxMDgsNyBAQAogICBuZXcgRG93bmxvYWRJbWFnZVRhc2soKS5leGVjdXRlKCJodHRwOi8vZXhhbXBsZS5jb20vaW1hZ2UucG5nIik7CiB9CiAKLXByaXZhdGUgY2xhc3MgRG93bmxvYWRJbWFnZVRhc2sgZXh0ZW5kcyBBc3luY1Rhc2smbHQ7c3RyaW5nLCB2b2lkLD0iIiBiaXRtYXA9IiImZ3Q7IHsKK3ByaXZhdGUgY2xhc3MgRG93bmxvYWRJbWFnZVRhc2sgZXh0ZW5kcyBBc3luY1Rhc2smbHQ7U3RyaW5nLCBWb2lkLCBCaXRtYXAmZ3Q7IHsKICAgICAgcHJvdGVjdGVkIEJpdG1hcCBkb0luQmFja2dyb3VuZChTdHJpbmcuLi4gdXJscykgewogICAgICAgICAgcmV0dXJuIGxvYWRJbWFnZUZyb21OZXR3b3JrKHVybHNbMF0pOwogICAgICB9CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKaW5kZXggNzJiZGY3YS4uNmQ1OTY0OCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZApAQCAtMjIsNyArMjIsNyBAQAogCiA8cD5XZWxjb21lIHRvIHRoZSBBbmRyb2lkIGRldmVsb3BlcnMgY29tbXVuaXR5ISBXZSdyZSBnbGFkIHlvdSdyZSBoZXJlIGFuZCBpbnZpdGUgeW91IHRvIHBhcnRpY2lwYXRlIGluIGRpc2N1c3Npb25zIHdpdGggb3RoZXIgQW5kcm9pZCBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzIG9uIHRvcGljcyB0aGF0IGludGVyZXN0IHlvdS48L3A+CiAKLTxwPlRoZSBsaXN0cyBvbiB0aGlzIHBhZ2UgYXJlIHByaW1hcmlseSBmb3IgZGlzY3Vzc2lvbiBhYm91dCBBbmRyb2lkIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50LiBJZiB5b3UgYXJlIHNlZWtpbmcgZGlzY3Vzc2lvbiBhYm91dCBBbmRyb2lkIHNvdXJjZSBjb2RlIChub3QgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQpLCB0aGVuIHBsZWFzZSByZWZlciB0byB0aGUgPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9kaXNjdXNzIj5PcGVuIFNvdXJjZSBQcm9qZWN0IE1haWxpbmcgbGlzdHM8L2E+LjwvcD4KKzxwPlRoZSBsaXN0cyBvbiB0aGlzIHBhZ2UgYXJlIHByaW1hcmlseSBmb3IgZGlzY3Vzc2lvbiBhYm91dCBBbmRyb2lkIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50LiBJZiB5b3UgYXJlIHNlZWtpbmcgZGlzY3Vzc2lvbiBhYm91dCBBbmRyb2lkIHNvdXJjZSBjb2RlIChub3QgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQpLCB0aGVuIHBsZWFzZSByZWZlciB0byB0aGUgPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21tdW5pdHkiPk9wZW4gU291cmNlIFByb2plY3QgTWFpbGluZyBsaXN0czwvYT4uPC9wPgogCiA8aDIgaWQ9IlN0YWNrT3ZlcmZsb3ciPlN0YWNrIE92ZXJmbG93PC9oMj4KIApAQCAtNTYsNyArNTYsNyBAQAogQXMgeW91IHdyaXRlIHlvdXIgcG9zdCwgcGxlYXNlIGRvIHRoZSBmb2xsb3dpbmc6CiA8b2w+CiA8bGk+PHN0cm9uZz5SZWFkCi10aGUgPGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9kaXNjdXNzL2FuZHJvaWQtZGlzY3Vzc2lvbi1ncm91cHMtY2hhcnRlciI+bWFpbGluZyBsaXN0IGNoYXJ0ZXI8L2E+PC9zdHJvbmc+IHRoYXQgY292ZXJzIHRoZSBjb21tdW5pdHkgZ3VpZGVsaW5lcy4KK3RoZSA8YSBocmVmPSJodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5odG1sIj5tYWlsaW5nIGxpc3QgY2hhcnRlcjwvYT48L3N0cm9uZz4gdGhhdCBjb3ZlcnMgdGhlIGNvbW11bml0eSBndWlkZWxpbmVzLgogPC9saT4KIDxsaT48c3Ryb25nPlNlbGVjdCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBtYWlsaW5nIGxpc3QgZm9yIHlvdXIgcXVlc3Rpb248L3N0cm9uZz4uIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudCBsaXN0cyBmb3IKIGRldmVsb3BlcnMsIGRlc2NyaWJlZCBiZWxvdy48L2xpPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9kYXNoYm9hcmQvcGxhdGZvcm0tdmVyc2lvbnMuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9wbGF0Zm9ybS12ZXJzaW9ucy5qZAppbmRleCA1ZTc1MTA1Li42Y2I3MjI4IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9wbGF0Zm9ybS12ZXJzaW9ucy5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9wbGF0Zm9ybS12ZXJzaW9ucy5qZApAQCAtNDMsMjkgKzQzLDczIEBACiB0aGUgaGFuZHMgb2YgdXNlcnMuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gdGFyZ2V0IHlvdXIgYXBwbGljYXRpb24gdG8gZGV2aWNlcyBiYXNlZCBvbgogcGxhdGZvcm0gdmVyc2lvbiwgc2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9hcGktbGV2ZWxzLmh0bWwiPkFQSSBMZXZlbHM8L2E+LjwvcD4KIAotPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBkYXRhIGlzIGJhc2VkIG9uIHRoZSBudW1iZXIKLW9mIEFuZHJvaWQgZGV2aWNlcyB0aGF0IGhhdmUgYWNjZXNzZWQgQW5kcm9pZCBNYXJrZXQgd2l0aGluIGEgMTQtZGF5IHBlcmlvZAotZW5kaW5nIG9uIHRoZSBkYXRhIGNvbGxlY3Rpb24gZGF0ZSBub3RlZCBiZWxvdy48L3A+CisKKzxoMyBpZD0iQ3VycmVudCI+Q3VycmVudCBEaXN0cmlidXRpb248L2gzPgorCis8cD5UaGUgZm9sbG93aW5nIHBpZSBjaGFydCBhbmQgdGFibGUgaXMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBBbmRyb2lkIGRldmljZXMgdGhhdCBoYXZlIGFjY2Vzc2VkCitBbmRyb2lkIE1hcmtldCB3aXRoaW4gYSAxNC1kYXkgcGVyaW9kIGVuZGluZyBvbiB0aGUgZGF0YSBjb2xsZWN0aW9uIGRhdGUgbm90ZWQgYmVsb3cuPC9wPgogCiA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtcGFuZWwiPgogCi08aW1nIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjI1MCIKLXNyYz0iaHR0cDovL2NoYXJ0LmFwaXMuZ29vZ2xlLmNvbS9jaGFydD8mY2h0PXAmY2hzPTQ2MHgyNTAmY2hkPXQ6MC4xLDI0LjYsMjUuMCwwLjEsMC4zLDUwLjAmY2hsPQotQW5kcm9pZCUyMDEuMXxBbmRyb2lkJTIwMS41fEFuZHJvaWQlMjAxLjZ8QW5kcm9pZCUyMDIuMHxBbmRyb2lkJTIwMi4wLjF8QW5kcm9pZCUyMDIuMSZjaGNvPWM0ZGY5YiwKLTZmYWQwYyIgLz4KKzxpbWcgYWx0PSIiIGhlaWdodD0iMjUwIiB3aWR0aD0iNDYwIgorc3JjPSJodHRwOi8vY2hhcnQuYXBpcy5nb29nbGUuY29tL2NoYXJ0PyZjaHQ9cCZjaHM9NDYweDI1MCZjaGQ9dDowLjMsMjEuMywyMy41LDUzLjEsMS44JmNobD1PdGhlcip8CitBbmRyb2lkJTIwMS41fEFuZHJvaWQlMjAxLjZ8QW5kcm9pZCUyMDIuMXxBbmRyb2lkJTIwMi4yJmNoY289YzRkZjliLDZmYWQwYyIgLz4KIAogPHRhYmxlPgogPHRyPgotICA8dGg+QW5kcm9pZCBQbGF0Zm9ybTwvdGg+Ci0gIDx0aD5QZXJjZW50IG9mIERldmljZXM8L3RoPgorICA8dGg+UGxhdGZvcm08L3RoPgorICA8dGg+QVBJIExldmVsPC90aD4KKyAgPHRoPkRpc3RyaWJ1dGlvbjwvdGg+CiA8L3RyPgotPHRyPjx0ZD5BbmRyb2lkIDEuMTwvdGQ+PHRkPjAuMSU8L3RkPjwvdHI+IAotPHRyPjx0ZD5BbmRyb2lkIDEuNTwvdGQ+PHRkPjI0LjYlPC90ZD48L3RyPiAKLTx0cj48dGQ+QW5kcm9pZCAxLjY8L3RkPjx0ZD4yNS4wJTwvdGQ+PC90cj4gCi08dHI+PHRkPkFuZHJvaWQgMi4wPC90ZD48dGQ+MC4xJTwvdGQ+PC90cj4gCi08dHI+PHRkPkFuZHJvaWQgMi4wLjE8L3RkPjx0ZD4wLjMlPC90ZD48L3RyPiAKLTx0cj48dGQ+QW5kcm9pZCAyLjE8L3RkPjx0ZD41MC4wJTwvdGQ+PC90cj4gCis8dHI+PHRkPkFuZHJvaWQgMS41PC90ZD48dGQ+MzwvdGQ+PHRkPjIxLjMlPC90ZD48L3RyPgorPHRyPjx0ZD5BbmRyb2lkIDEuNjwvdGQ+PHRkPjQ8L3RkPjx0ZD4yMy41JTwvdGQ+PC90cj4KKzx0cj48dGQ+QW5kcm9pZCAyLjE8L3RkPjx0ZD43PC90ZD48dGQ+NTMuMSU8L3RkPjwvdHI+Cis8dHI+PHRkPkFuZHJvaWQgMi4yPC90ZD48dGQ+ODwvdGQ+PHRkPjEuOCU8L3RkPjwvdHI+CiA8L3RhYmxlPgotPHA+PGVtPkRhdGEgY29sbGVjdGVkIGR1cmluZyB0d28gd2Vla3MgZW5kaW5nIG9uIEp1bmUgMTYsIDIwMTA8L2VtPjwvcD4KLTwvZGl2PgorCis8cD48ZW0+RGF0YSBjb2xsZWN0ZWQgZHVyaW5nIHR3byB3ZWVrcyBlbmRpbmcgb24gSnVseSAxLCAyMDEwPC9lbT48L3A+Cis8cCBzdHlsZT0iZm9udC1zaXplOi45ZW0iPiogPGVtPk90aGVyOiAwLjMlIG9mIGRldmljZXMgcnVubmluZyBvYnNvbGV0ZSB2ZXJzaW9uczwvZW0+PC9wPgorCis8L2Rpdj48IS0tIGVuZCBkYXNoYm9hcmQtcGFuZWwgLS0+CisKKworPGgzIGlkPSJIaXN0b3JpY2FsIj5IaXN0b3JpY2FsIERpc3RyaWJ1dGlvbjwvaDM+CisKKzxwPlRoZSBmb2xsb3dpbmcgc3RhY2tlZCBsaW5lIGdyYXBoIHByb3ZpZGVzIGEgaGlzdG9yeSBvZiB0aGUgcmVsYXRpdmUgbnVtYmVyIG9mCithY3RpdmUgQW5kcm9pZCBkZXZpY2VzIHJ1bm5pbmcgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtLiBJdCBhbHNvIHByb3ZpZGVzIGEKK3ZhbHVhYmxlIHBlcnNwZWN0aXZlIG9mIGhvdyBtYW55IGRldmljZXMgeW91ciBhcHBsaWNhdGlvbiBpcyBjb21wYXRpYmxlIHdpdGgsIGJhc2VkIG9uIHRoZQorcGxhdGZvcm0gdmVyc2lvbi48L3A+CisKKzxwPk5vdGljZSB0aGF0IHRoZSBwbGF0Zm9ybSB2ZXJzaW9ucyBhcmUgc3RhY2tlZCBvbiB0b3Agb2YgZWFjaCBvdGhlciB3aXRoIHRoZSBvbGRlc3QgYWN0aXZlCit2ZXJzaW9uIGF0IHRoZSB0b3AuIFRoaXMgZm9ybWF0IGluZGljYXRlcyB0aGUgdG90YWwgcGVyY2VudCBvZiBhY3RpdmUgZGV2aWNlcyB0aGF0IGFyZSBjb21wYXRpYmxlCit3aXRoIGEgZ2l2ZW4gdmVyc2lvbiBvZiBBbmRyb2lkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGRldmVsb3AgeW91ciBhcHBsaWNhdGlvbiBmb3IKK3RoZSB2ZXJzaW9uIHRoYXQgaXMgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBjaGFydCwgdGhlbiB5b3VyIGFwcGxpY2F0aW9uIGlzCitjb21wYXRpYmxlIHdpdGggMTAwJSBvZiBhY3RpdmUgZGV2aWNlcyAoYW5kIGFsbCBmdXR1cmUgdmVyc2lvbnMpLCBiZWNhdXNlIGFsbCBBbmRyb2lkIEFQSXMgYXJlCitmb3J3YXJkIGNvbXBhdGlibGUuIE9yLCBpZiB5b3UgZGV2ZWxvcCB5b3VyIGFwcGxpY2F0aW9uIGZvciBhIHZlcnNpb24gbG93ZXIgb24gdGhlIGNoYXJ0LAordGhlbiBpdCBpcyBjdXJyZW50bHkgY29tcGF0aWJsZSB3aXRoIHRoZSBwZXJjZW50YWdlIG9mIGRldmljZXMgaW5kaWNhdGVkIG9uIHRoZSB5LWF4aXMsIHdoZXJlIHRoZQorbGluZSBmb3IgdGhhdCB2ZXJzaW9uIG1lZXRzIHRoZSB5LWF4aXMgb24gdGhlIHJpZ2h0LjwvcD4KKworPHA+RWFjaCBkYXRhc2V0IGluIHRoZSB0aW1lbGluZSBpcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIEFuZHJvaWQgZGV2aWNlcyB0aGF0IGFjY2Vzc2VkCitBbmRyb2lkIE1hcmtldCB3aXRoaW4gYSAxNC1kYXkgcGVyaW9kIGVuZGluZyBvbiB0aGUgZGF0ZSBpbmRpY2F0ZWQgb24gdGhlIHgtYXhpcy48L3A+CisKKzxkaXYgY2xhc3M9ImRhc2hib2FyZC1wYW5lbCI+CisKKzxpbWcgYWx0PSIiIGhlaWdodD0iMjY1IiB3aWR0aD0iNzAwIiBzdHlsZT0icGFkZGluZzo1cHg7YmFja2dyb3VuZDojZmZmIgorc3JjPSJodHRwOi8vY2hhcnQuYXBpcy5nb29nbGUuY29tL2NoYXJ0PyZjaHQ9bGMmY2hzPTcwMHgyNjUmY2h4dD14LHksciZjaHhyPTAsMCwxMCU3QzEsMCwxMDAlN0MyLDAsCisxMDAmY2h4bD0wJTNBJTdDMjAxMC8wMi8wMSU3QzAyLzE1JTdDMDMvMDElN0MwMy8xNSU3QzA0LzAxJTdDMDQvMTUlN0MwNS8wMSU3QzA1LzE1JTdDMDYvMDElN0MwNi8xNSUKKzdDMjAxMC8wNy8wMSU3QzElM0ElN0MwJTI1JTdDMjUlMjUlN0M1MCUyNSU3Qzc1JTI1JTdDMTAwJTI1JTdDMiUzQSU3QzAlMjUlN0MyNSUyNSU3QzUwJTI1JTdDNzUlMjUlCis3QzEwMCUyNSZjaHhwPTAsMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCZjaHh0Yz0wLDUmY2hkPXQ6OTkuMCw5OS4yLDk5LjQsOTkuNSw5OS42LDk5LjYsOTkuNiw5OS43LDEwMC42CissMTAxLjEsOTkuOSU3QzYzLjQsNjIuNSw2MS42LDYwLjYsNjEuNSw2MS43LDYyLjMsNjMuNSw3My4wLDc2LjQsNzguNiU3QzIyLjYsMjMuMiwyNC4zLDI1LjQsMjkuNCwzMC4yCissMzIuNywzNS4zLDQ2LjIsNTEuMyw1NS4xJTdDMC4wLDAuMCwwLjAsMC4wLDQuMCwyOC4zLDMyLjAsMzQuOSw0NS45LDUxLjAsNTQuOSU3QzAuMCwwLjAsMC4wLDAuMCwwLjAsCiswLjAsMC4wLDAuMCwwLjgsMS4yLDEuOCZjaG09dEFuZHJvaWQlMjAxLjUsN2NhYTM2LDAsMCwxNSwsdDo6LTUlN0NiLGMzZGY5YiwwLDEsMCU3Q3RBbmRyb2lkJTIwMS42LAorNjM4ZDIzLDEsMCwxNSwsdDo6LTUlN0NiLGIwZGI2ZSwxLDIsMCU3Q3RBbmRyb2lkJTIwMi4wLjEsNDk2YzEzLDIsMCwxNSwsdDo6LTUlN0NiLDlkZGIzZCwyLDMsMCUKKzdDdEFuZHJvaWQlMjAyLjEsMmY0NzA4LDMsNSwxNSwsdDo6LTUlN0NiLDg5Y2YxOSwzLDQsMCU3Q0IsNmZhZDBjLDQsNSwwJmNoZz05LDI1JmNoZGw9QW5kcm9pZCUyMDEuNSUKKzIwKEFQSSUyMExldmVsJTIwMyklN0NBbmRyb2lkJTIwMS42JTIwKEFQSSUyMExldmVsJTIwNCklN0NBbmRyb2lkJTIwMi4wLjElMjAoQVBJJTIwTGV2ZWwlMjA2KSUKKzdDQW5kcm9pZCUyMDIuMSUyMChBUEklMjBMZXZlbCUyMDcpJTdDQW5kcm9pZCUyMDIuMiUyMChBUEklMjBMZXZlbCAlMjA4KSZjaGNvPWFkZDI3NCwKKzlhZDE0NSw4NGMzMjMsNmJhMjEzLDUwN2QwOCIgLz4KKworPHA+PGVtPkxhc3QgaGlzdG9yaWNhbCBkYXRhc2V0IGNvbGxlY3RlZCBkdXJpbmcgdHdvIHdlZWtzIGVuZGluZyBvbiBKdWx5IDEsIDIwMTA8L2VtPjwvcD4KKworCis8L2Rpdj48IS0tIGVuZCBkYXNoYm9hcmQtcGFuZWwgLS0+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL3NjcmVlbnMuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9zY3JlZW5zLmpkCmluZGV4IGY4MTMwZWEuLjg5ZmRkMmQgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL3NjcmVlbnMuamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9kYXNoYm9hcmQvc2NyZWVucy5qZApAQCAtNDksNyArNDksNyBAQAogPGRpdiBjbGFzcz0iZGFzaGJvYXJkLXBhbmVsIj4KIAogPGltZyBhbHQ9IiIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSIyNTAiCi1zcmM9Imh0dHA6Ly9jaGFydC5hcGlzLmdvb2dsZS5jb20vY2hhcnQ/JmNodD1wJmNocz00NjB4MjUwJmNoZD10OjEuMSw1Ny44LDQxLjAmY2hsPVNtYWxsJTIwLyUyMGxkcGl8CitzcmM9Imh0dHA6Ly9jaGFydC5hcGlzLmdvb2dsZS5jb20vY2hhcnQ/JmNodD1wJmNocz00NjB4MjUwJmNoZD10OjEuNCw1NC41LDQ0LjEmY2hsPVNtYWxsJTIwLyUyMGxkcGl8CiBOb3JtYWwlMjAvJTIwbWRwaXxOb3JtYWwlMjAvJTIwaGRwaSZjaGNvPWM0ZGY5Yiw2ZmFkMGMiIC8+CiAKIDx0YWJsZT4KQEAgLTYwLDE0ICs2MCwxNCBAQAogPHRoIHNjb3BlPSJjb2wiPkhpZ2ggRGVuc2l0eTwvdGg+CiA8L3RyPgogPHRyPjx0aCBzY29wZT0icm93Ij5TbWFsbDwvdGg+IAotPHRkIGNsYXNzPSdjZW50IGhpJz4xLjElPC90ZD4gCis8dGQgY2xhc3M9J2NlbnQgaGknPjEuNCU8L3RkPiAKIDx0ZD48L3RkPiAKIDx0ZD48L3RkPiAKIDwvdHI+IAogPHRyPjx0aCBzY29wZT0icm93Ij5Ob3JtYWw8L3RoPiAKIDx0ZD48L3RkPiAKLTx0ZCBjbGFzcz0nY2VudCBoaSc+NTcuOCU8L3RkPiAKLTx0ZCBjbGFzcz0nY2VudCBoaSc+NDEuMCU8L3RkPiAKKzx0ZCBjbGFzcz0nY2VudCBoaSc+NTQuNSU8L3RkPiAKKzx0ZCBjbGFzcz0nY2VudCBoaSc+NDQuMSU8L3RkPiAKIDwvdHI+IAogPHRyPjx0aCBzY29wZT0icm93Ij5MYXJnZTwvdGg+IAogPHRkPjwvdGQ+IApAQCAtNzYsNiArNzYsNiBAQAogPC90cj4gCiA8L3RhYmxlPgogCi08cD48ZW0+RGF0YSBjb2xsZWN0ZWQgZHVyaW5nIHR3byB3ZWVrcyBlbmRpbmcgb24gSnVuZSAxNiwgMjAxMDwvZW0+PC9wPgorPHA+PGVtPkRhdGEgY29sbGVjdGVkIGR1cmluZyB0d28gd2Vla3MgZW5kaW5nIG9uIEp1bHkgMSwgMjAxMDwvZW0+PC9wPgogPC9kaXY+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0xLjUuamQgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMS41LmpkCmluZGV4IDFkNmUwYWQuLjBjMTZiNjAgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0xLjUuamQKKysrIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTEuNS5qZApAQCAtMTM5LDcgKzEzOSw3IEBACiAKIDxkaXYgY2xhc3M9InRvZ2dsZWFibGUgY2xvc2VkIj4KICAgPGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIHRvZ2dsZURpdih0aGlzKSI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQucG5nIiBjbGFzcz0idG9nZ2xlLWltZyIgaGVpZ2h0PSI5cHgiIHdpZHRoPSI5cHgiIC8+CisgICAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy90cmlhbmdsZS1jbG9zZWQucG5nIiBjbGFzcz0idG9nZ2xlLWltZyIgaGVpZ2h0PSI5cHgiIHdpZHRoPSI5cHgiIC8+CiAgICAgICAgIEFuZHJvaWQgMS41LCBSZXZpc2lvbiAzPC9hPiA8ZW0+KEp1bHkgMjAwOSk8L2VtPjwvYT4KICAgPGRpdiBjbGFzcz0idG9nZ2xlbWUiPgogPGRsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTEuNi5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0xLjYuamQKaW5kZXggYzI2NTFiNi4uYzRlMDhmZiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTEuNi5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMS42LmpkCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogPGRpdiBjbGFzcz0idG9nZ2xlYWJsZSBjbG9zZWQiPgogICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj4KLSAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KKyAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KICAgICAgICAgQW5kcm9pZCAxLjYsIFJldmlzaW9uIDI8L2E+IDxlbT4oRGVjZW1iZXIgMjAwOSk8L2VtPjwvYT4KICAgPGRpdiBjbGFzcz0idG9nZ2xlbWUiPgogPGRsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMS5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjEuamQKaW5kZXggNzQ5MGJhZS4uY2Q0OGE3MiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMS5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4xLmpkCkBAIC0xMzksNyArMTM5LDcgQEAKIAogPGRpdiBjbGFzcz0idG9nZ2xlYWJsZSBjbG9zZWQiPgogICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj4KLSAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KKyAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KICAgICAgICAgQW5kcm9pZCAyLjEsIFJldmlzaW9uIDE8L2E+IDxlbT4oSmFudWFyeSAyMDEwKTwvZW0+PC9hPgogICA8ZGl2IGNsYXNzPSJ0b2dnbGVtZSI+CiA8ZGw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4yLmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMi5qZAppbmRleCBmODJlZGY5Li40OTVmZDgwIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4yLmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjIuamQKQEAgLTIsNyArMiw2IEBACiBzZGsucGxhdGZvcm0udmVyc2lvbj0yLjIKIHNkay5wbGF0Zm9ybS5hcGlMZXZlbD04CiBzZGsucGxhdGZvcm0ubWFqb3JNaW5vcj1taW5vcgotc2RrLnBsYXRmb3JtLmRlcGxveWFibGVEYXRlPU1heSAyMDEwCiAKIEBqZDpib2R5CiAKQEAgLTExOCw2ICsxMTcsMzAgQEAKIDxkaXYgY2xhc3M9InRvZ2dsZWFibGUgb3BlbmVkIj4KICAgPGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIHRvZ2dsZURpdih0aGlzKSI+CiAgICAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQucG5nIiBjbGFzcz0idG9nZ2xlLWltZyIgaGVpZ2h0PSI5cHgiIHdpZHRoPSI5cHgiIC8+CisgICAgICAgIEFuZHJvaWQge0BzZGtQbGF0Zm9ybVZlcnNpb259LCBSZXZpc2lvbiAyPC9hPiA8ZW0+KEp1bHkgMjAxMCk8L2VtPjwvYT4KKyAgPGRpdiBjbGFzcz0idG9nZ2xlbWUiPgorPGRsPgorPGR0PkRlcGVuZGVuY2llczo8L2R0PgorPGRkPgorPHA+UmVxdWlyZXMgU0RLIFRvb2xzIHI2IG9yIGhpZ2hlci48L3A+Cis8L2RkPgorCis8ZHQ+U3lzdGVtIEltYWdlOjwvZHQ+Cis8ZGQ+Cis8dWw+Cis8bGk+QWRkcyBkZWZhdWx0IFNlYXJjaCBXaWRnZXQuPC9saT4KKzxsaT5JbmNsdWRlcyBwcm9wZXIgcHJvdmlzaW9uaW5nIGZvciB0aGUgcGxhdGZvcm0ncyBCYWNrdXAgTWFuYWdlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHVzZSB0aGUgQmFja3VwIE1hbmFnZXIsIHNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2RhdGEvYmFja3VwLmh0bWwiPkRhdGEgQmFja3VwPC9hPi48L2xpPgorPGxpPlVwZGF0ZXMgdGhlIEFuZHJvaWQgMi4yIHN5c3RlbSBpbWFnZSB0byBGUkY5MS48L2xpPgorPC91bD4KKzwvZGQ+CisKKzwvZGw+CisgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idG9nZ2xlYWJsZSBjbG9zZWQiPgorICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj4KKyAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KICAgICAgICAgQW5kcm9pZCB7QHNka1BsYXRmb3JtVmVyc2lvbn0sIFJldmlzaW9uIDE8L2E+IDxlbT4oTWF5IDIwMTApPC9lbT48L2E+CiAgIDxkaXYgY2xhc3M9InRvZ2dsZW1lIj4KIDxkbD4KQEAgLTEzNSw3ICsxNTgsNiBAQAogIDwvZGl2PgogPC9kaXY+CiAKLQogPGgyIGlkPSJhcGktbGV2ZWwiPkFQSSBMZXZlbDwvaDI+CiAKIDxwPlRoZSBBbmRyb2lkIHtAc2RrUGxhdGZvcm1WZXJzaW9ufSBwbGF0Zm9ybSBkZWxpdmVycyBhbiB1cGRhdGVkIHZlcnNpb24gb2YKQEAgLTQ0NCw0ICs0NjYsNCBAQAogPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRldmVsb3AgYW4gYXBwbGljYXRpb24gdGhhdCBkaXNwbGF5cwogYW5kIGZ1bmN0aW9ucyBwcm9wZXJseSBvbiBhbGwgQW5kcm9pZC1wb3dlcmVkIGRldmljZXMsIHNlZSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZQotU2NyZWVuczwvYT4uPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1NjcmVlbnM8L2E+LjwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvZG93bmxvYWQuamQgYi9kb2NzL2h0bWwvc2RrL2Rvd25sb2FkLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjRmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvc2RrL2Rvd25sb2FkLmpkCkBAIC0wLDAgKzEsNCBAQAorc2RrLnJlZGlyZWN0PXRydWUKKworQGpkOmJvZHkKKwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9lY2xpcHNlLWFkdC5qZCBiL2RvY3MvaHRtbC9zZGsvZWNsaXBzZS1hZHQuamQKaW5kZXggZjU1NThhYi4uYmQ3ZWVlZCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9lY2xpcHNlLWFkdC5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2VjbGlwc2UtYWR0LmpkCkBAIC00OCw2ICs0OCw5IEBACiBob3cgdG8gdXBkYXRlIEFEVCB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb3IgaG93IHRvIHVuaW5zdGFsbCBpdCwgaWYgbmVjZXNzYXJ5LgogPC9wPgogCis8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5DYXV0aW9uOjwvc3Ryb25nPiBUaGVyZSBhcmUga25vd24gaXNzdWVzIHdpdGggdGhlIEFEVCBwbHVnaW4gcnVubmluZyB3aXRoCitFY2xpcHNlIDMuNi4gUGxlYXNlIHN0YXkgb24gMy41IHVudGlsIGZ1cnRoZXIgbm90aWNlLjwvcD4KKwogPGgyIGlkPSJub3RlcyI+UmV2aXNpb25zPC9oMj4KIAogPHA+VGhlIHNlY3Rpb25zIGJlbG93IHByb3ZpZGUgbm90ZXMgYWJvdXQgc3VjY2Vzc2l2ZSByZWxlYXNlcyBvZgpAQCAtMjk1LDcgKzI5OCw3IEBACiAKIDxwPkFkZGl0aW9uYWxseSwgYmVmb3JlIHlvdSBjYW4gY29uZmlndXJlIG9yIHVzZSBBRFQsIHlvdSBtdXN0IGluc3RhbGwgdGhlCiBBbmRyb2lkIFNESyBzdGFydGVyIHBhY2thZ2UsIGFzIGRlc2NyaWJlZCBpbiA8YQotaHJlZj0iaW5zdGFsbGluZy5odG1sI0luc3RhbGxpbmciPkRvd25sb2FkaW5nIHRoZSBTREsgU3RhcnRlciBQYWNza2FnZTwvYT4uCitocmVmPSJpbnN0YWxsaW5nLmh0bWwjSW5zdGFsbGluZyI+RG93bmxvYWRpbmcgdGhlIFNESyBTdGFydGVyIFBhY2thZ2U8L2E+LgogU3BlY2lmaWNhbGx5LCB5b3UgbmVlZCB0byBpbnN0YWxsIGEgY29tcGF0aWJsZSB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIFNESyBUb29scwogYW5kIGF0IGxlYXN0IG9uZSBkZXZlbG9wbWVudCBwbGF0Zm9ybS4gVG8gc2ltcGxpZnkgQURUIHNldHVwLCB3ZSByZWNvbW1lbmQKIGluc3RhbGxpbmcgdGhlIEFuZHJvaWQgU0RLIHByaW9yIHRvIGluc3RhbGxpbmcgQURULiA8L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL25kay9pbmRleC5qZCBiL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkCmluZGV4IDY5Y2M3M2QuLjllODhkOTQgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkCkBAIC0xLDE2ICsxLDE2IEBACiBuZGs9dHJ1ZQogCi1uZGsud2luX2Rvd25sb2FkPWFuZHJvaWQtbmRrLXI0LXdpbmRvd3MuemlwCi1uZGsud2luX2J5dGVzPTQ1Nzc4OTY1Ci1uZGsud2luX2NoZWNrc3VtPTFlZGVkOThhN2Y1Y2Q1ZTcxZjhhYzc0NTY1ZjczZjExCituZGsud2luX2Rvd25sb2FkPWFuZHJvaWQtbmRrLXI0Yi13aW5kb3dzLnppcAorbmRrLndpbl9ieXRlcz00NTc5MjgzNQorbmRrLndpbl9jaGVja3N1bT1lMzk3MTQ1ZTE1NWE2MzliZTUzZWU0YjZkYjhhZDUxMQogCi1uZGsubWFjX2Rvd25sb2FkPWFuZHJvaWQtbmRrLXI0LWRhcndpbi14ODYuemlwCi1uZGsubWFjX2J5dGVzPTUwNTcyMTYzCi1uZGsubWFjX2NoZWNrc3VtPWI3ZDVmMTQ5ZmVjZjk1MWMwNWE3OWIwNDVmMDA0MTlmCituZGsubWFjX2Rvd25sb2FkPWFuZHJvaWQtbmRrLXI0Yi1kYXJ3aW4teDg2LnppcAorbmRrLm1hY19ieXRlcz01MDU4NjA0MQorbmRrLm1hY19jaGVja3N1bT00MWRiZDU0MzM1ZmI4MjhlZTQwOGVhYjE3MTAzYTFiMAogCi1uZGsubGludXhfZG93bmxvYWQ9YW5kcm9pZC1uZGstcjQtbGludXgteDg2LnppcAotbmRrLmxpbnV4X2J5dGVzPTQ5NDUwNjgyCi1uZGsubGludXhfY2hlY2tzdW09MDg5MmIwNjM3ZDQ1ZDE0NWUwNDVjYzY4ZTE2M2RlZTMKK25kay5saW51eF9kb3dubG9hZD1hbmRyb2lkLW5kay1yNGItbGludXgteDg2LnppcAorbmRrLmxpbnV4X2J5dGVzPTQ5NDY0Nzc2CituZGsubGludXhfY2hlY2tzdW09MmRlYWJjYjEyNWMyMTliMzQxNDA5NzViNzEwZjAwZWMKIAogcGFnZS50aXRsZT1BbmRyb2lkIE5ESwogQGpkOmJvZHkKQEAgLTYyLDggKzYyLDE1IEBACiA8ZGl2IGNsYXNzPSJ0b2dnbGVhYmxlIG9wZW4iPgogICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj4KICAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KLUFuZHJvaWQgTkRLLCBSZXZpc2lvbiA0PC9hPiA8ZW0+KE1heSAyMDEwKTwvZW0+CitBbmRyb2lkIE5ESywgUmV2aXNpb24gNGI8L2E+IDxlbT4oSnVuZSAyMDEwKTwvZW0+CiAgIDxkaXYgY2xhc3M9InRvZ2dsZW1lIj4KKzxkbD4KKzxkdD5OREsgcjRiIG5vdGVzOjwvZHQ+Cis8ZGQ+PHA+SW5jbHVkZXMgZml4ZXMgZm9yIHNldmVyYWwgaXNzdWVzIGluIHRoZSBOREsgYnVpbGQgYW5kIGRlYnVnZ2luZyBzY3JpcHRzCismbWRhc2g7IGlmIHlvdSBhcmUgdXNpbmcgTkRLIHI0LCB3ZSByZWNvbW1lbmQgZG93bmxvYWRpbmcgdGhlIE5ESyByNGIgYnVpbGQuIEZvcgorZGV0YWlsZWQgaW5mb3JtYXRpb24gdGhlIGNoYW5nZXMgaW4gdGhpcyByZWxlYXNlLCByZWFkIHRoZSBDSEFOR0VTLlRYVCBkb2N1bWVudAoraW5jbHVkZWQgaW4gdGhlIGRvd25sb2FkZWQgTkRLIHBhY2thZ2UuPC9wPjwvZGQ+Cis8L2RsPgogCiA8ZGw+CiA8ZHQ+R2VuZXJhbCBub3Rlczo8L2R0PgpAQCAtMTE0LDcgKzEyMSw3IEBACiAKIDxkaXYgY2xhc3M9InRvZ2dsZWFibGUgY2xvc2VkIj4KICAgPGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIHRvZ2dsZURpdih0aGlzKSI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQucG5nIiBjbGFzcz0idG9nZ2xlLWltZyIgaGVpZ2h0PSI5cHgiIHdpZHRoPSI5cHgiIC8+CisgICAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy90cmlhbmdsZS1jbG9zZWQucG5nIiBjbGFzcz0idG9nZ2xlLWltZyIgaGVpZ2h0PSI5cHgiIHdpZHRoPSI5cHgiIC8+CiBBbmRyb2lkIE5ESywgUmV2aXNpb24gMzwvYT4gPGVtPihNYXJjaCAyMDEwKTwvZW0+CiAgIDxkaXYgY2xhc3M9InRvZ2dsZW1lIj4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9vbGRlcl9yZWxlYXNlcy5qZCBiL2RvY3MvaHRtbC9zZGsvb2xkZXJfcmVsZWFzZXMuamQKaW5kZXggYzNiYTQ5NS4uNzdmN2U0MyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9vbGRlcl9yZWxlYXNlcy5qZAorKysgYi9kb2NzL2h0bWwvc2RrL29sZGVyX3JlbGVhc2VzLmpkCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgPHRkPldpbmRvd3M8L3RkPgogICAgIDx0ZD4KICAgPGEKLWhyZWY9Ii9zZGsvZG93bmxvYWQuaHRtbD92PWFyY2hpdmVzL2FuZHJvaWQtc2RrLXdpbmRvd3MtMS42X3IxLnppcCI+YW5kcm9pZC1zZGstCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLXdpbmRvd3MtMS42X3IxLnppcCI+YW5kcm9pZC1zZGstCiB3aW5kb3dzLTEgLjZfcjEuemlwPC9hPgogICAgIDwvdGQ+CiAgICAgPHRkPjI2MDUyOTA4NSBieXRlczwvdGQ+CkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgPHRkPk1hYyBPUyBYIChpbnRlbCk8L3RkPgogICAgIDx0ZD4KICAgPGEKLWhyZWY9Ii9zZGsvZG93bmxvYWQuaHRtbD92PWFyY2hpdmVzL2FuZHJvaWQtc2RrLW1hY194ODYtMS42X3IxLnppcCI+YW5kcm9pZC1zZGstCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLW1hY194ODYtMS42X3IxLnppcCI+YW5kcm9pZC1zZGstCiBtYWNfeDg2LTEgLjZfcjEuemlwPC9hPgogICAgIDwvdGQ+CiAgICAgPHRkPjI0NzQxMjUxNSBieXRlczwvdGQ+CkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgPHRkPkxpbnV4IChpMzg2KTwvdGQ+CiAgICAgPHRkPgogICA8YQotaHJlZj0iL3Nkay9kb3dubG9hZC5odG1sP3Y9YXJjaGl2ZXMvYW5kcm9pZC1zZGstbGludXhfeDg2LTEuNl9yMS50Z3oiPmFuZHJvaWQtCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLWxpbnV4X3g4Ni0xLjZfcjEudGd6Ij5hbmRyb2lkLQogc2RrLSBsaW51eF94ODYtMS42X3IxLnRnejwvYT4KICAgICA8L3RkPgogICAgIDx0ZD4yMzgyMjQ4NjAgYnl0ZXM8L3RkPgpAQCAtOTIsNyArOTIsNyBAQAogICAgIDx0ZD5XaW5kb3dzPC90ZD4KICAgICA8dGQ+CiAgIDxhCi1ocmVmPSIvc2RrL2Rvd25sb2FkLmh0bWw/dj1hcmNoaXZlcy9hbmRyb2lkLXNkay13aW5kb3dzLTEuNV9yMy56aXAiPmFuZHJvaWQtc2RrLQoraHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9hcmNoaXZlcy9hbmRyb2lkLXNkay13aW5kb3dzLTEuNV9yMy56aXAiPmFuZHJvaWQtc2RrLQogd2luZG93cy0xIC41X3IzLnppcDwvYT4KICAgICA8L3RkPgogICAgIDx0ZD4xOTE0Nzc4NTMgYnl0ZXM8L3RkPgpAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgPHRkPk1hYyBPUyBYIChpbnRlbCk8L3RkPgogICAgIDx0ZD4KICAgPGEKLWhyZWY9Ii9zZGsvZG93bmxvYWQuaHRtbD92PWFyY2hpdmVzL2FuZHJvaWQtc2RrLW1hY194ODYtMS41X3IzLnppcCI+YW5kcm9pZC1zZGstCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLW1hY194ODYtMS41X3IzLnppcCI+YW5kcm9pZC1zZGstCiBtYWNfeDg2LTEgLjVfcjMuemlwPC9hPgogICAgIDwvdGQ+CiAgICAgPHRkPjE4MzAyNDY3MyBieXRlczwvdGQ+CkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICA8dGQ+TGludXggKGkzODYpPC90ZD4KICAgICA8dGQ+CiAgIDxhCi1ocmVmPSIvc2RrL2Rvd25sb2FkLmh0bWw/dj1hcmNoaXZlcy9hbmRyb2lkLXNkay1saW51eF94ODYtMS41X3IzLnppcCI+YW5kcm9pZC0KK2hyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvYXJjaGl2ZXMvYW5kcm9pZC1zZGstbGludXhfeDg2LTEuNV9yMy56aXAiPmFuZHJvaWQtCiBzZGstIGxpbnV4X3g4Ni0xLjVfcjMuemlwPC9hPgogICAgIDwvdGQ+CiAgICAgPHRkPjE3ODExNzU2MSBieXRlczwvdGQ+CkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICA8dGQ+V2luZG93czwvdGQ+CiAgICAgPHRkPgogICA8YQotaHJlZj0iL3Nkay9kb3dubG9hZC5odG1sP3Y9YXJjaGl2ZXMvYW5kcm9pZC1zZGstd2luZG93cy0xLjFfcjEuemlwIj5hbmRyb2lkLXNkay0KK2hyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvYXJjaGl2ZXMvYW5kcm9pZC1zZGstd2luZG93cy0xLjFfcjEuemlwIj5hbmRyb2lkLXNkay0KIHdpbmRvd3MtMQogLjFfcjEuemlwPC9hPgogICAgIDwvdGQ+CkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICA8dGQ+TWFjIE9TIFggKGludGVsKTwvdGQ+CiAgICAgPHRkPgogICA8YQotaHJlZj0iL3Nkay9kb3dubG9hZC5odG1sP3Y9YXJjaGl2ZXMvYW5kcm9pZC1zZGstbWFjX3g4Ni0xLjFfcjEuemlwIj5hbmRyb2lkLXNkay0KK2hyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvYXJjaGl2ZXMvYW5kcm9pZC1zZGstbWFjX3g4Ni0xLjFfcjEuemlwIj5hbmRyb2lkLXNkay0KIG1hY194ODYtMQogLjFfcjEuemlwPC9hPgogICAgIDwvdGQ+CkBAIC0xNTksNyArMTU5LDcgQEAKICAgICA8dGQ+TGludXggKGkzODYpPC90ZD4KICAgICA8dGQ+CiAgIDxhCi1ocmVmPSIvc2RrL2Rvd25sb2FkLmh0bWw/dj1hcmNoaXZlcy9hbmRyb2lkLXNkay1saW51eF94ODYtMS4xX3IxLnppcCI+YW5kcm9pZC0KK2hyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvYXJjaGl2ZXMvYW5kcm9pZC1zZGstbGludXhfeDg2LTEuMV9yMS56aXAiPmFuZHJvaWQtCiBzZGstCiBsaW51eF94ODYtMS4xX3IxLnppcDwvYT4KICAgICA8L3RkPgpAQCAtMTg1LDcgKzE4NSw3IEBACiAgICAgPHRkPldpbmRvd3M8L3RkPgogICAgIDx0ZD4KICAgPGEKLWhyZWY9Ii9zZGsvZG93bmxvYWQuaHRtbD92PWFyY2hpdmVzL2FuZHJvaWQtc2RrLXdpbmRvd3MtMS4wX3IyLnppcCI+YW5kcm9pZC1zZGstCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLXdpbmRvd3MtMS4wX3IyLnppcCI+YW5kcm9pZC1zZGstCiB3aW5kb3dzLTEKIC4wX3IyLnppcDwvYT4KICAgICA8L3RkPgpAQCAtMTk2LDcgKzE5Niw3IEBACiAgICAgPHRkPk1hYyBPUyBYIChpbnRlbCk8L3RkPgogICAgIDx0ZD4KICAgPGEKLWhyZWY9Ii9zZGsvZG93bmxvYWQuaHRtbD92PWFyY2hpdmVzL2FuZHJvaWQtc2RrLW1hY194ODYtMS4wX3IyLnppcCI+YW5kcm9pZC1zZGstCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLW1hY194ODYtMS4wX3IyLnppcCI+YW5kcm9pZC1zZGstCiBtYWNfeDg2LTEKIC4wX3IyLnppcDwvYT4KICAgICA8L3RkPgpAQCAtMjA3LDcgKzIwNyw3IEBACiAgICAgPHRkPkxpbnV4IChpMzg2KTwvdGQ+CiAgICAgPHRkPgogICA8YQotaHJlZj0iL3Nkay9kb3dubG9hZC5odG1sP3Y9YXJjaGl2ZXMvYW5kcm9pZC1zZGstbGludXhfeDg2LTEuMF9yMi56aXAiPmFuZHJvaWQtCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLWxpbnV4X3g4Ni0xLjBfcjIuemlwIj5hbmRyb2lkLQogc2RrLQogbGludXhfeDg2LTEuMF9yMi56aXA8L2E+CiAgICAgPC90ZD4KQEAgLTI0MSw3ICsyNDEsNyBAQAogICAgIDx0ZD5XaW5kb3dzPC90ZD4KICAgICA8dGQ+CiAgIDxhCi1ocmVmPSIvc2RrL2Rvd25sb2FkLmh0bWw/dj1hcmNoaXZlcy9hbmRyb2lkLXNkay13aW5kb3dzLTEuNV9yMi56aXAiPmFuZHJvaWQtc2RrLQoraHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9hcmNoaXZlcy9hbmRyb2lkLXNkay13aW5kb3dzLTEuNV9yMi56aXAiPmFuZHJvaWQtc2RrLQogd2luZG93cy0xIC41X3IyLnppcDwvYT4KICAgICA8L3RkPgogICAgIDx0ZD4xNzgzNDY4MjggYnl0ZXM8L3RkPgpAQCAtMjUxLDcgKzI1MSw3IEBACiAgICAgPHRkPk1hYyBPUyBYIChpbnRlbCk8L3RkPgogICAgIDx0ZD4KICAgPGEKLWhyZWY9Ii9zZGsvZG93bmxvYWQuaHRtbD92PWFyY2hpdmVzL2FuZHJvaWQtc2RrLW1hY194ODYtMS41X3IyLnppcCI+YW5kcm9pZC1zZGstCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLW1hY194ODYtMS41X3IyLnppcCI+YW5kcm9pZC1zZGstCiBtYWNfeDg2LTEgLjVfcjIuemlwPC9hPgogICAgIDwvdGQ+CiAgICAgPHRkPjE2OTk0NTEyOCBieXRlczwvdGQ+CkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICA8dGQ+TGludXggKGkzODYpPC90ZD4KICAgICA8dGQ+CiAgIDxhCi1ocmVmPSIvc2RrL2Rvd25sb2FkLmh0bWw/dj1hcmNoaXZlcy9hbmRyb2lkLXNkay1saW51eF94ODYtMS41X3IyLnppcCI+YW5kcm9pZC0KK2hyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvYXJjaGl2ZXMvYW5kcm9pZC1zZGstbGludXhfeDg2LTEuNV9yMi56aXAiPmFuZHJvaWQtCiBzZGstIGxpbnV4X3g4Ni0xLjVfcjIuemlwPC9hPgogICAgIDwvdGQ+CiAgICAgPHRkPjE2NTAzNTEzMCBieXRlczwvdGQ+CkBAIC0yODYsNyArMjg2LDcgQEAKICAgICA8dGQ+V2luZG93czwvdGQ+CiAgICAgPHRkPgogICA8YQotaHJlZj0iL3Nkay9kb3dubG9hZC5odG1sP3Y9YXJjaGl2ZXMvYW5kcm9pZC1zZGstd2luZG93cy0xLjVfcjEuemlwIj5hbmRyb2lkLXNkay0KK2hyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvYXJjaGl2ZXMvYW5kcm9pZC1zZGstd2luZG93cy0xLjVfcjEuemlwIj5hbmRyb2lkLXNkay0KIHdpbmRvd3MtMSAuNV9yMS56aXA8L2E+CiAgICAgPC90ZD4KICAgICA8dGQ+MTc2MjYzMzY4IGJ5dGVzPC90ZD4KQEAgLTI5Niw3ICsyOTYsNyBAQAogICAgIDx0ZD5NYWMgT1MgWCAoaW50ZWwpPC90ZD4KICAgICA8dGQ+CiAgIDxhCi1ocmVmPSIvc2RrL2Rvd25sb2FkLmh0bWw/dj1hcmNoaXZlcy9hbmRyb2lkLXNkay1tYWNfeDg2LTEuNV9yMS56aXAiPmFuZHJvaWQtc2RrLQoraHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9hcmNoaXZlcy9hbmRyb2lkLXNkay1tYWNfeDg2LTEuNV9yMS56aXAiPmFuZHJvaWQtc2RrLQogbWFjX3g4Ni0xIC41X3IxLnppcDwvYT4KICAgICA8L3RkPgogICAgIDx0ZD4xNjc4NDg2NzUgYnl0ZXM8L3RkPgpAQCAtMzA2LDcgKzMwNiw3IEBACiAgICAgPHRkPkxpbnV4IChpMzg2KTwvdGQ+CiAgICAgPHRkPgogICA8YQotaHJlZj0iL3Nkay9kb3dubG9hZC5odG1sP3Y9YXJjaGl2ZXMvYW5kcm9pZC1zZGstbGludXhfeDg2LTEuNV9yMS56aXAiPmFuZHJvaWQtCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLWxpbnV4X3g4Ni0xLjVfcjEuemlwIj5hbmRyb2lkLQogc2RrLSBsaW51eF94ODYtMS41X3IxLnppcDwvYT4KICAgICA8L3RkPgogICAgIDx0ZD4xNjI5Mzg4NDUgYnl0ZXM8L3RkPgpAQCAtMzMxLDcgKzMzMSw3IEBACiAgICAgPHRkPldpbmRvd3M8L3RkPgogICAgIDx0ZD4KICAgPGEKLWhyZWY9Ii9zZGsvZG93bmxvYWQuaHRtbD92PWFyY2hpdmVzL2FuZHJvaWQtc2RrLXdpbmRvd3MtMS4wX3IxLnppcCI+YW5kcm9pZC1zZGstCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLXdpbmRvd3MtMS4wX3IxLnppcCI+YW5kcm9pZC1zZGstCiB3aW5kb3dzLTEgLjBfcjEuemlwPC9hPgogICAgIDwvdGQ+CiAgICAgPHRkPjg5LjcgTUIgYnl0ZXM8L3RkPgpAQCAtMzQxLDcgKzM0MSw3IEBACiAgICAgPHRkPk1hYyBPUyBYIChpbnRlbCk8L3RkPgogICAgIDx0ZD4KICAgPGEKLWhyZWY9Ii9zZGsvZG93bmxvYWQuaHRtbD92PWFyY2hpdmVzL2FuZHJvaWQtc2RrLW1hY194ODYtMS4wX3IxLnppcCI+YW5kcm9pZC1zZGstCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLW1hY194ODYtMS4wX3IxLnppcCI+YW5kcm9pZC1zZGstCiBtYWNfeDg2LTEgLjBfcjEuemlwPC9hPgogICAgIDwvdGQ+CiAgICAgPHRkPjg3LjUgTUIgYnl0ZXM8L3RkPgpAQCAtMzUxLDcgKzM1MSw3IEBACiAgICAgPHRkPkxpbnV4IChpMzg2KTwvdGQ+CiAgICAgPHRkPgogICA8YQotaHJlZj0iL3Nkay9kb3dubG9hZC5odG1sP3Y9YXJjaGl2ZXMvYW5kcm9pZC1zZGstbGludXhfeDg2LTEuMF9yMS56aXAiPmFuZHJvaWQtCitocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FyY2hpdmVzL2FuZHJvaWQtc2RrLWxpbnV4X3g4Ni0xLjBfcjEuemlwIj5hbmRyb2lkLQogc2RrLSBsaW51eF94ODYtMS4wX3IxLnppcDwvYT4KICAgICA8L3RkPgogICAgIDx0ZD44Ny44IE1CIGJ5dGVzPC90ZD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvcmVxdWlyZW1lbnRzLmpkIGIvZG9jcy9odG1sL3Nkay9yZXF1aXJlbWVudHMuamQKaW5kZXggY2I5Y2RmMy4uZDcxMGI4ZSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9yZXF1aXJlbWVudHMuamQKKysrIGIvZG9jcy9odG1sL3Nkay9yZXF1aXJlbWVudHMuamQKQEAgLTIzLDYgKzIzLDkgQEAKIDxoNCBzdHlsZT0ibWFyZ2luLXRvcDouMjVlbSI+PGVtPkVjbGlwc2UgSURFPC9lbT48L2g0PgogICAgIDx1bD4KICAgICAgIDxsaT5FY2xpcHNlIDMuNCAoR2FueW1lZGUpIG9yIDMuNSAoR2FsaWxlbykKKyAgICAgICAgIDxwIGNsYXNzPSJjYXV0aW9uIj48c3Ryb25nPkNhdXRpb246PC9zdHJvbmc+IFRoZXJlIGFyZSBrbm93biBpc3N1ZXMgd2l0aCB0aGUgQURUIHBsdWdpbgorcnVubmluZyB3aXRoIEVjbGlwc2UgMy42LiBQbGVhc2Ugc3RheSBvbiAzLjUgdW50aWwgZnVydGhlciBub3RpY2UuPC9wPgorICAgICAgPC9saT4KICAgICAgIDxsaT5FY2xpcHNlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamR0Ij5KRFQ8L2E+IHBsdWdpbiAoaW5jbHVkZWQKIGluIG1vc3QgRWNsaXBzZSBJREUgcGFja2FnZXMpIDwvbGk+CiAgICAgICA8bGk+SWYgeW91IG5lZWQgdG8gaW5zdGFsbCBvciB1cGRhdGUgRWNsaXBzZSwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tIDxhCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL3Nka190b2MuY3MgYi9kb2NzL2h0bWwvc2RrL3Nka190b2MuY3MKaW5kZXggYTgwOTgxY2UuLjQwNGU5MzggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvc2RrX3RvYy5jcworKysgYi9kb2NzL2h0bWwvc2RrL3Nka190b2MuY3MKQEAgLTc1LDcgKzc1LDggQEAKICAgICAgIDwvbGk+CiAgICAgPC91bD4KICAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL3Rvb2xzLW5vdGVzLmh0bWwiPlNESyBUb29scywgcjY8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zZGsvdG9vbHMtbm90ZXMuaHRtbCI+U0RLIFRvb2xzLCByNjwvYT4KKyAgICAgIDwvbGk+CiAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL3dpbi11c2IuaHRtbCI+VVNCIERyaXZlciBmb3IKICAgICAgIFdpbmRvd3MsIHIzPC9hPgogICAgICAgPC9saT4KQEAgLTEwMSw3ICsxMDIsNiBAQAogICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9ImphIj48L3NwYW4+CiAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iemgtQ04iPjwvc3Bhbj4KICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJ6aC1UVyI+PC9zcGFuPjwvYT4KLSAgICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KICAgICAgIDwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9InpoLVRXIj48L3NwYW4+CiAgICAgPC9oMj4KICAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL25kay9pbmRleC5odG1sIj5BbmRyb2lkIE5ESywgcjQ8L2E+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL25kay9pbmRleC5odG1sIj5BbmRyb2lkIE5ESywgcjRiPC9hPgogICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgogICAgIDwvdWw+CiAgIDwvbGk+CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YQppbmRleCA1Mzk0NTMwLi4zMjBmYzRkIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5LmphdmEKQEAgLTY5LDggKzY5LDExIEBACiAgICAgICAgICAqIHRoZSBkZWNvZGVyIHdpbGwgdHJ5IHRvIHBpY2sgdGhlIGJlc3QgbWF0Y2hpbmcgY29uZmlnIGJhc2VkIG9uIHRoZQogICAgICAgICAgKiBzeXN0ZW0ncyBzY3JlZW4gZGVwdGgsIGFuZCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIG9yaWdpbmFsIGltYWdlIHN1Y2gKICAgICAgICAgICogYXMgaWYgaXQgaGFzIHBlci1waXhlbCBhbHBoYSAocmVxdWlyaW5nIGEgY29uZmlnIHRoYXQgYWxzbyBkb2VzKS4KKyAgICAgICAgICogCisgICAgICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGlzIHNldCB0byB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29uZmlnI0FSR0JfODg4OH0KKyAgICAgICAgICogYnkgZGVmYXVsdC4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCaXRtYXAuQ29uZmlnIGluUHJlZmVycmVkQ29uZmlnOworICAgICAgICBwdWJsaWMgQml0bWFwLkNvbmZpZyBpblByZWZlcnJlZENvbmZpZyA9IEJpdG1hcC5Db25maWcuQVJHQl84ODg4OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJZiBkaXRoZXIgaXMgdHJ1ZSwgdGhlIGRlY29kZXIgd2lsbCBhdHRlbXB0IHRvIGRpdGhlciB0aGUgZGVjb2RlZApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFNoYWRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFNoYWRlci5qYXZhCmluZGV4IDYxMmIwYWIuLjM3YjQwZTcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBTaGFkZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEKQEAgLTE2LDEwICsxNiwyNSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CiAKKy8qKgorICogU2hhZGVyIHVzZWQgdG8gZHJhdyBhIGJpdG1hcCBhcyBhIHRleHR1cmUuIFRoZSBiaXRtYXAgY2FuIGJlIHJlcGVhdGVkIG9yCisgKiBtaXJyb3JlZCBieSBzZXR0aW5nIHRoZSB0aWxpbmcgbW9kZS4KKyAqLwogcHVibGljIGNsYXNzIEJpdG1hcFNoYWRlciBleHRlbmRzIFNoYWRlciB7Ci0KLSAgICAvLyB3ZSBob2xkIG9uIGp1c3QgZm9yIHRoZSBHQywgc2luY2Ugb3VyIG5hdGl2ZSBjb3VudGVycGFydCBpcyB1c2luZyBpdAotICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXA7CisgICAgLyoqCisgICAgICogV2UgaG9sZCBvbiBqdXN0IGZvciB0aGUgR0MsIHNpbmNlIG91ciBuYXRpdmUgY291bnRlcnBhcnQgaXMgdXNpbmcgaXQuCisgICAgICogCisgICAgICogQGhpZGUgCisgICAgICovCisgICAgcHVibGljIEJpdG1hcCBtQml0bWFwOworICAgIC8qKgorICAgICAqIEBoaWRlIAorICAgICAqLworICAgIHB1YmxpYyBpbnQgbVRpbGVYOworICAgIC8qKgorICAgICAqIEBoaWRlIAorICAgICAqLworICAgIHB1YmxpYyBpbnQgbVRpbGVZOwogCiAgICAgLyoqCiAgICAgICogQ2FsbCB0aGlzIHRvIGNyZWF0ZSBhIG5ldyBzaGFkZXIgdGhhdCB3aWxsIGRyYXcgd2l0aCBhIGJpdG1hcC4KQEAgLTMwLDEyICs0NSwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBCaXRtYXBTaGFkZXIoQml0bWFwIGJpdG1hcCwgVGlsZU1vZGUgdGlsZVgsIFRpbGVNb2RlIHRpbGVZKSB7CiAgICAgICAgIG1CaXRtYXAgPSBiaXRtYXA7Ci0gICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZShiaXRtYXAubmkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVYLm5hdGl2ZUludCwgdGlsZVkubmF0aXZlSW50KTsKKyAgICAgICAgbVRpbGVYID0gdGlsZVgubmF0aXZlSW50OworICAgICAgICBtVGlsZVkgPSB0aWxlWS5uYXRpdmVJbnQ7CisgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZShiaXRtYXAubmkoKSwgbVRpbGVYLCBtVGlsZVkpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlKGludCBuYXRpdmVfYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoYWRlclRpbGVNb2RlWSk7ICAgIAorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlKGludCBuYXRpdmVfYml0bWFwLCBpbnQgc2hhZGVyVGlsZU1vZGVYLAorICAgICAgICAgICAgaW50IHNoYWRlclRpbGVNb2RlWSk7ICAgIAogfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKaW5kZXggM2IyMjEwYi4uNzdhMTkzMCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQpAQCAtMTI2LDYgKzEyNiw3IEBACiAgICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdHJ1Y3RvciBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgQ2FudmFzKEdMIGdsKSB7CiAgICAgICAgIG1OYXRpdmVDYW52YXMgPSBpbml0R0woKTsKICAgICAgICAgbUdMID0gZ2w7CkBAIC0xNTEsNiArMTUyLDcgQEAKICAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgR0wgZ2V0R0woKSB7CiAgICAgICAgIHJldHVybiBtR0w7CiAgICAgfQpAQCAtMTYyLDYgKzE2NCw3IEBACiAgICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIG5vdCBiZSBpbnZva2VkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZyZWVHbENhY2hlcygpIHsKICAgICAgICAgZnJlZUNhY2hlcygpOwogICAgIH0KQEAgLTE5OCw2ICsyMDEsNyBAQAogICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBub3QgYmUgaW52b2tlZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBpZiAobUdMICE9IG51bGwpIHsKICAgICAgICAgICAgIG5hdGl2ZVNldFZpZXdwb3J0KG1OYXRpdmVDYW52YXMsIHdpZHRoLCBoZWlnaHQpOwpAQCAtNDE1LDggKzQxOSw4IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc3ggVGhlIGFtb3VudCB0byBzY2FsZSBpbiBYCiAgICAgICogQHBhcmFtIHN5IFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gWQotICAgICAqIEBwYXJhbSBweCBUaGUgeC1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHJvdGF0aW9uKQotICAgICAqIEBwYXJhbSBweSBUaGUgeS1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHJvdGF0aW9uKQorICAgICAqIEBwYXJhbSBweCBUaGUgeC1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHNjYWxlKQorICAgICAqIEBwYXJhbSBweSBUaGUgeS1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHNjYWxlKQogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgcHgsIGZsb2F0IHB5KSB7CiAgICAgICAgIHRyYW5zbGF0ZShweCwgcHkpOwpAQCAtMTAwMCw2ICsxMDA0LDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCBiaXRtYXAgYXMgYW4gTi1wYXRjaCAobW9zdCBvZnRlbiwgYSA5LXBhdGNoZXMuKQorICAgICAqCisgICAgICogTm90ZTogT25seSBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgY2FudmFzIGF0IHRoZSBtb21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYml0bWFwIFRoZSBiaXRtYXAgdG8gZHJhdyBhcyBhbiBOLXBhdGNoCisgICAgICogQHBhcmFtIGNodW5rcyBUaGUgcGF0Y2hlcyBpbmZvcm1hdGlvbiAobWF0Y2hlcyB0aGUgbmF0aXZlIHN0cnVjdCBSZXNfcG5nXzlwYXRjaCkKKyAgICAgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byBkcmF3IHRoZSBiaXRtYXAgd2l0aC4gbWF5IGJlIG51bGwKKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdQYXRjaChCaXRtYXAgYml0bWFwLCBieXRlW10gY2h1bmtzLCBSZWN0RiBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgfSAgICAKKyAgICAKKyAgICAvKioKICAgICAgKiBEcmF3IHRoZSBzcGVjaWZpZWQgYml0bWFwLCB3aXRoIGl0cyB0b3AvbGVmdCBjb3JuZXIgYXQgKHgseSksIHVzaW5nCiAgICAgICogdGhlIHNwZWNpZmllZCBwYWludCwgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgbWF0cml4LgogICAgICAqIApAQCAtMTUwNSw3ICsxNTI0LDcgQEAKICAgICAgICAgfQogICAgICAgICBuYXRpdmVfZHJhd1RleHRPblBhdGgobU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5uaSgpLCBoT2Zmc2V0LCB2T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTI1LDcgKzE1NDQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CiAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0T25QYXRoKG1OYXRpdmVDYW52YXMsIHRleHQsIHBhdGgubmkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LCB2T2Zmc2V0LCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsIHZPZmZzZXQsIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTU2OSw2ICsxNTg5LDcgQEAKICAgICAgICAgcmVzdG9yZSgpOwogICAgIH0KICAgICAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgICAgICAvLyBJZiB0aGUgY29uc3RydWN0b3IgdGhyZXcgYW4gZXhjZXB0aW9uIGJlZm9yZSBzZXR0aW5nIG1OYXRpdmVDYW52YXMsIHRoZSBuYXRpdmUgZmluYWxpemVyCkBAIC0xNzE2LDExICsxNzM3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIGludCBiaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWludCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0T25QYXRoKGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaE9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGludCBwYWludCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdQaWN0dXJlKGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYXRpdmVQaWN0dXJlKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5hdGl2ZUNhbnZhcyk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEKaW5kZXggODhkZmQ2Ny4uZGY2ZmViYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9OaW5lUGF0Y2guamF2YQpAQCAtMzUsNiArMzUsMTIgQEAKICAqIDwvcD4KICAqLwogcHVibGljIGNsYXNzIE5pbmVQYXRjaCB7CisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBtQ2h1bms7CisgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVNyY05hbWU7ICAvLyBVc2VmdWwgZm9yIGRlYnVnZ2luZworICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAKICAgICAvKiogCiAgICAgICogQ3JlYXRlIGEgZHJhd2FibGUgcHJvamVjdGlvbiBmcm9tIGEgYml0bWFwIHRvIG5pbmUgcGF0Y2hlcy4KICAgICAgKgpAQCAtNzQsMTAgKzgwLDE0IEBACiAgICAgICogQHBhcmFtIGxvY2F0aW9uICBXaGVyZSB0byBkcmF3IHRoZSBiaXRtYXAuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzLCBSZWN0RiBsb2NhdGlvbikgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKLSAgICAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgIG1QYWludCAhPSBudWxsID8gbVBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGNoKG1CaXRtYXAsIG1DaHVuaywgbG9jYXRpb24sIG51bGwpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKiAKQEAgLTg3LDEwICs5NywxNSBAQAogICAgICAqIEBwYXJhbSBsb2NhdGlvbiAgV2hlcmUgdG8gZHJhdyB0aGUgYml0bWFwLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcywgUmVjdCBsb2NhdGlvbikgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKLSAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRtYXAubmkoKSwgbUNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhaW50ICE9IG51bGwgPyBtUGFpbnQubU5hdGl2ZVBhaW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjdC5zZXQobG9jYXRpb24pOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIG1SZWN0LCBudWxsKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKiAKQEAgLTEwMSw5ICsxMTYsMTQgQEAKICAgICAgKiBAcGFyYW0gcGFpbnQgICAgIFRoZSBQYWludCB0byBkcmF3IHRocm91Z2guCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzLCBSZWN0IGxvY2F0aW9uLCBQYWludCBwYWludCkgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywgcGFpbnQgIT0gbnVsbCA/IHBhaW50Lm1OYXRpdmVQYWludCA6IDAsCi0gICAgICAgICAgICAgICAgY2FudmFzLm1EZW5zaXR5LCBtQml0bWFwLm1EZW5zaXR5KTsKKyAgICAgICAgaWYgKCFjYW52YXMuaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkpIHsKKyAgICAgICAgICAgIG5hdGl2ZURyYXcoY2FudmFzLm1OYXRpdmVDYW52YXMsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywgcGFpbnQgIT0gbnVsbCA/IHBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjdC5zZXQobG9jYXRpb24pOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIG1SZWN0LCBwYWludCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTEzMywxMSArMTUzLDYgQEAKICAgICAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGlzTmluZVBhdGNoQ2h1bmsoYnl0ZVtdIGNodW5rKTsKIAotICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbUNodW5rOwotICAgIHByaXZhdGUgUGFpbnQgICAgICAgIG1QYWludDsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICBtU3JjTmFtZTsgIC8vIFVzZWZ1bCBmb3IgZGVidWdnaW5nCi0KICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCB2YWxpZGF0ZU5pbmVQYXRjaENodW5rKGludCBiaXRtYXAsIGJ5dGVbXSBjaHVuayk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRHJhdyhpbnQgY2FudmFzX2luc3RhbmNlLCBSZWN0RiBsb2MsIGludCBiaXRtYXBfaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYywgaW50IHBhaW50X2luc3RhbmNlX29yX251bGwsCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCmluZGV4IDg4ZmYwZTYuLjliNGQzYTggMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCkBAIC0xNzE4LDcgKzE3MTgsOCBAQAogICAgICAgICBpZiAoKGluZGV4IHwgY291bnQpIDwgMCB8fCBpbmRleCArIGNvdW50ID4gdGV4dC5sZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZ2V0VGV4dFBhdGgobU5hdGl2ZVBhaW50LCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksIHBhdGgubmkoKSk7CisgICAgICAgIG5hdGl2ZV9nZXRUZXh0UGF0aChtTmF0aXZlUGFpbnQsIG1CaWRpRmxhZ3MsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgCisgICAgICAgICAgICAgICAgcGF0aC5uaSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3MzksNyArMTc0MCw4IEBACiAgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCAoZW5kIC0gc3RhcnQpIHwgKHRleHQubGVuZ3RoKCkgLSBlbmQpKSA8IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgcGF0aC5uaSgpKTsKKyAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgbUJpZGlGbGFncywgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgCisgICAgICAgICAgICAgICAgcGF0aC5uaSgpKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xODM2LDkgKzE4MzgsOSBAQAogICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvcihpbnQgbmF0aXZlX29iamVjdCwgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KTsKIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aChpbnQgbmF0aXZlX29iamVjdCwKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsIGludCBiaWRpRmxhZ3MsCiAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgcGF0aCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKGludCBuYXRpdmVfb2JqZWN0LAorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aChpbnQgbmF0aXZlX29iamVjdCwgaW50IGJpZGlGbGFncywKICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgcGF0aCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlR2V0U3RyaW5nQm91bmRzKGludCBuYXRpdmVQYWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgUmVjdCBib3VuZHMpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlY3QuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SZWN0LmphdmEKaW5kZXggOThmZmI4Yi4uNzgzMDIyNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlY3QuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmVjdC5qYXZhCkBAIC03NSw2ICs3NSw3IEBACiAgICAgICAgIGJvdHRvbSA9IHIuYm90dG9tOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgIFJlY3QgciA9IChSZWN0KSBvYmo7CiAgICAgICAgIGlmIChyICE9IG51bGwpIHsKQEAgLTg0LDYgKzg1LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigzMik7CiAgICAgICAgIHNiLmFwcGVuZCgiUmVjdCgiKTsgc2IuYXBwZW5kKGxlZnQpOyBzYi5hcHBlbmQoIiwgIik7CkBAIC0zNTEsNyArMzUzLDcgQEAKICAgICAgKiByZWN0YW5nbGUsIHJldHVybiB0cnVlIGFuZCBzZXQgdGhpcyByZWN0YW5nbGUgdG8gdGhhdCBpbnRlcnNlY3Rpb24sCiAgICAgICogb3RoZXJ3aXNlIHJldHVybiBmYWxzZSBhbmQgZG8gbm90IGNoYW5nZSB0aGlzIHJlY3RhbmdsZS4gTm8gY2hlY2sgaXMKICAgICAgKiBwZXJmb3JtZWQgdG8gc2VlIGlmIGVpdGhlciByZWN0YW5nbGUgaXMgZW1wdHkuIE5vdGU6IFRvIGp1c3QgdGVzdCBmb3IKLSAgICAgKiBpbnRlcnNlY3Rpb24sIHVzZSBpbnRlcnNlY3RzKCkKKyAgICAgKiBpbnRlcnNlY3Rpb24sIHVzZSB7QGxpbmsgI2ludGVyc2VjdHMoUmVjdCwgUmVjdCl9LgogICAgICAqCiAgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIGJlaW5nIGludGVyc2VjdGVkIHdpdGggdGhpcwogICAgICAqICAgICAgICAgICAgIHJlY3RhbmdsZQpAQCAtNDQ1LDcgKzQ0Nyw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmZiB0aGUgdHdvIHNwZWNpZmllZCByZWN0YW5nbGVzIGludGVyc2VjdC4gSW4gbm8gZXZlbnQgYXJlCiAgICAgICogZWl0aGVyIG9mIHRoZSByZWN0YW5nbGVzIG1vZGlmaWVkLiBUbyByZWNvcmQgdGhlIGludGVyc2VjdGlvbiwKLSAgICAgKiB1c2UgaW50ZXJzZWN0KCkgb3Igc2V0SW50ZXJzZWN0KCkuCisgICAgICogdXNlIHtAbGluayAjaW50ZXJzZWN0KFJlY3QpfSBvciB7QGxpbmsgI3NldEludGVyc2VjdChSZWN0LCBSZWN0KX0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gYSBUaGUgZmlyc3QgcmVjdGFuZ2xlIGJlaW5nIHRlc3RlZCBmb3IgaW50ZXJzZWN0aW9uCiAgICAgICogQHBhcmFtIGIgVGhlIHNlY29uZCByZWN0YW5nbGUgYmVpbmcgdGVzdGVkIGZvciBpbnRlcnNlY3Rpb24KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9OaW5lUGF0Y2hEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKaW5kZXggYmFkOTRmYi4uOWE5OGQ1MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKQEAgLTE3NSwxNiArMTc1LDkgQEAKICAgICAgICAgICAgIGRlc3QuYm90dG9tID0gQml0bWFwLnNjYWxlRnJvbURlbnNpdHkoc3JjLmJvdHRvbSwgc2RlbnNpdHksIHRkZW5zaXR5KTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvLyBvdmVycmlkZXMKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIGZsb2F0W10gcHRzID0gbmV3IGZsb2F0WzJdOwotICAgICAgICAgICAgY2FudmFzLmdldE1hdHJpeCgpLm1hcFBvaW50cyhwdHMpOwotICAgICAgICAgICAgTG9nLnYoIjlwYXRjaCIsICJEcmF3aW5nIDktcGF0Y2ggQCAiICsgcHRzWzBdICsgIiwiICsgcHRzWzFdICsgIjogIiArIGdldEJvdW5kcygpKTsKLSAgICAgICAgfQogICAgICAgICBtTmluZVBhdGNoLmRyYXcoY2FudmFzLCBnZXRCb3VuZHMoKSwgbVBhaW50KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKaW5kZXggZGRiMmFiZi4uYmZhNjFmMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKQEAgLTQwLDYgKzQwLDExIEBACiAgICAgICAgIG1UeXBlID0gdDsKICAgICB9CiAKKyAgICBBbGxvY2F0aW9uKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKHJzKTsKKyAgICAgICAgbUlEID0gaWQ7CisgICAgfQorCiAgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIG1UeXBlOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CYXNlT2JqLmphdmEKaW5kZXggMDAyZmM3OC4uMjg2NzVkYyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CYXNlT2JqLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CYXNlT2JqLmphdmEKQEAgLTgxLDUgKzgxLDEwIEBACiAgICAgICAgIG1SUy5uT2JqRGVzdHJveShtSUQpOwogICAgIH0KIAorICAgIC8vIElmIGFuIG9iamVjdCBjYW1lIGZyb20gYW4gYTNkIGZpbGUsIGphdmEgZmllbGRzIG5lZWQgdG8gYmUKKyAgICAvLyBjcmVhdGVkIHdpdGggb2JqZWN0cyBmcm9tIHRoZSBuYXRpdmUgbGF5ZXIKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgfQorCiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEKaW5kZXggZmIzNmYxZi4uM2IzNzExYiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEKQEAgLTM2LDcgKzM2LDYgQEAKIAogICAgICAgICBVTktOT1dOLAogICAgICAgICBNRVNILAotICAgICAgICBTSU1QTEVfTUVTSCwKICAgICAgICAgVFlQRSwKICAgICAgICAgRUxFTUVOVCwKICAgICAgICAgQUxMT0NBVElPTiwKQEAgLTg5LDEwICs4OCw3IEBACiAKICAgICAgICAgICAgIHN3aXRjaCAobUNsYXNzSUQpIHsKICAgICAgICAgICAgIGNhc2UgTUVTSDoKLSAgICAgICAgICAgICAgICBtTG9hZGVkT2JqID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0lNUExFX01FU0g6Ci0gICAgICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG5ldyBTaW1wbGVNZXNoKG9iamVjdElELCBtUlMpOworICAgICAgICAgICAgICAgIG1Mb2FkZWRPYmogPSBuZXcgTWVzaChvYmplY3RJRCwgbVJTKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVFlQRToKICAgICAgICAgICAgICAgICBtTG9hZGVkT2JqID0gbmV3IFR5cGUob2JqZWN0SUQsIG1SUyk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01lc2guamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWVzaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZWU5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01lc2guamF2YQpAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIE1lc2ggZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIEFsbG9jYXRpb25bXSBtVmVydGV4QnVmZmVyczsKKyAgICBBbGxvY2F0aW9uW10gbUluZGV4QnVmZmVyczsKKyAgICBQcmltaXRpdmVbXSBtUHJpbWl0aXZlczsKKworICAgIE1lc2goaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIocnMpOworICAgICAgICBtSUQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFZlcnRleEFsbG9jYXRpb25Db3VudCgpIHsKKyAgICAgICAgaWYobVZlcnRleEJ1ZmZlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1WZXJ0ZXhCdWZmZXJzLmxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0VmVydGV4QWxsb2NhdGlvbihpbnQgc2xvdCkgeworICAgICAgICByZXR1cm4gbVZlcnRleEJ1ZmZlcnNbc2xvdF07CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQcmltaXRpdmVDb3VudCgpIHsKKyAgICAgICAgaWYobUluZGV4QnVmZmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUluZGV4QnVmZmVycy5sZW5ndGg7CisgICAgfQorICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldEluZGV4QWxsb2NhdGlvbihpbnQgc2xvdCkgeworICAgICAgICByZXR1cm4gbUluZGV4QnVmZmVyc1tzbG90XTsKKyAgICB9CisgICAgcHVibGljIFByaW1pdGl2ZSBnZXRQcmltaXRpdmUoaW50IHNsb3QpIHsKKyAgICAgICAgcmV0dXJuIG1QcmltaXRpdmVzW3Nsb3RdOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKyAgICAgICAgaW50IHZ0eENvdW50ID0gbVJTLm5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQobUlEKTsKKyAgICAgICAgaW50IGlkeENvdW50ID0gbVJTLm5NZXNoR2V0SW5kZXhDb3VudChtSUQpOworCisgICAgICAgIGludFtdIHZ0eElEcyA9IG5ldyBpbnRbdnR4Q291bnRdOworICAgICAgICBpbnRbXSBpZHhJRHMgPSBuZXcgaW50W2lkeENvdW50XTsKKyAgICAgICAgaW50W10gcHJpbWl0aXZlcyA9IG5ldyBpbnRbaWR4Q291bnRdOworCisgICAgICAgIG1SUy5uTWVzaEdldFZlcnRpY2VzKG1JRCwgdnR4SURzLCB2dHhDb3VudCk7CisgICAgICAgIG1SUy5uTWVzaEdldEluZGljZXMobUlELCBpZHhJRHMsIHByaW1pdGl2ZXMsIHZ0eENvdW50KTsKKworICAgICAgICBtVmVydGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW3Z0eENvdW50XTsKKyAgICAgICAgbUluZGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2lkeENvdW50XTsKKyAgICAgICAgbVByaW1pdGl2ZXMgPSBuZXcgUHJpbWl0aXZlW2lkeENvdW50XTsKKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdnR4Q291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIGlmKHZ0eElEc1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbaV0gPSBuZXcgQWxsb2NhdGlvbih2dHhJRHNbaV0sIG1SUyk7CisgICAgICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbaV0udXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGlkeENvdW50OyBpICsrKSB7CisgICAgICAgICAgICBpZihpZHhJRHNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlcnNbaV0gPSBuZXcgQWxsb2NhdGlvbihpZHhJRHNbaV0sIG1SUyk7CisgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyc1tpXS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJpbWl0aXZlc1tpXSA9IFByaW1pdGl2ZS52YWx1ZXMoKVtwcmltaXRpdmVzW2ldXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisKKyAgICAgICAgY2xhc3MgRW50cnkgeworICAgICAgICAgICAgVHlwZSB0OworICAgICAgICAgICAgRWxlbWVudCBlOworICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICBQcmltaXRpdmUgcHJpbTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtVmVydGV4VHlwZUNvdW50OworICAgICAgICBFbnRyeVtdIG1WZXJ0ZXhUeXBlczsKKyAgICAgICAgVmVjdG9yIG1JbmRleFR5cGVzOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50ID0gMDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlcyA9IG5ldyBFbnRyeVsxNl07CisgICAgICAgICAgICBtSW5kZXhUeXBlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShUeXBlIHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnQgPSB0OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLmUgPSBudWxsOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0udCA9IG51bGw7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uZSA9IGU7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uc2l6ZSA9IHNpemU7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKFR5cGUgdCwgUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLnQgPSB0OworICAgICAgICAgICAgaW5kZXhUeXBlLmUgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLnNpemUgPSAwOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4VHlwZShQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUudCA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuZSA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuc2l6ZSA9IDA7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUsIFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS50ID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5lID0gZTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgVHlwZSBuZXdUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHsKKyAgICAgICAgICAgIFR5cGUuQnVpbGRlciB0YiA9IG5ldyBUeXBlLkJ1aWxkZXIobVJTLCBlKTsKKyAgICAgICAgICAgIHRiLmFkZChEaW1lbnNpb24uWCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gdGIuY3JlYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIE1lc2ggaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBCdWlsZGVyIGIpIHsKKworICAgICAgICAgICAgaW50IGlkID0gcnMubk1lc2hDcmVhdGUoYi5tVmVydGV4VHlwZUNvdW50LCBiLm1JbmRleFR5cGVzLnNpemUoKSk7CisgICAgICAgICAgICBNZXNoIG5ld01lc2ggPSBuZXcgTWVzaChpZCwgcnMpOworICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVbYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2IubVZlcnRleFR5cGVDb3VudF07CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubUluZGV4VHlwZXMuc2l6ZSgpOyBjdCArKykgeworICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gYWxsb2MgPSBudWxsOworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWIubUluZGV4VHlwZXMuZWxlbWVudEF0KGN0KTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChycywgZW50cnkudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoZW50cnkuZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgZW50cnkuZSwgZW50cnkuc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBhbGxvY0lEID0gKGFsbG9jID09IG51bGwpID8gMCA6IGFsbG9jLmdldElEKCk7CisgICAgICAgICAgICAgICAgcnMubk1lc2hCaW5kSW5kZXgoaWQsIGFsbG9jSUQsIGVudHJ5LnByaW0ubUlELCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzW2N0XSA9IGFsbG9jOworICAgICAgICAgICAgICAgIG5ld01lc2gubVByaW1pdGl2ZXNbY3RdID0gZW50cnkucHJpbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tVmVydGV4VHlwZUNvdW50OyBjdCArKykgeworICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gYWxsb2MgPSBudWxsOworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gYi5tVmVydGV4VHlwZXNbY3RdOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKHJzLCBlbnRyeS50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZW50cnkuZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgZW50cnkuZSwgZW50cnkuc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZFZlcnRleChpZCwgYWxsb2MuZ2V0SUQoKSwgY3QpOworICAgICAgICAgICAgICAgIG5ld01lc2gubVZlcnRleEJ1ZmZlcnNbY3RdID0gYWxsb2M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXdNZXNoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc2ggY3JlYXRlKCkgeworICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgICAgICBNZXNoIHNtID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiBzbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWxsb2NhdGlvbkJ1aWxkZXIgeworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworCisgICAgICAgIGNsYXNzIEVudHJ5IHsKKyAgICAgICAgICAgIEFsbG9jYXRpb24gYTsKKyAgICAgICAgICAgIFByaW1pdGl2ZSBwcmltOworICAgICAgICB9CisKKyAgICAgICAgaW50IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgIEVudHJ5W10gbVZlcnRleFR5cGVzOworCisgICAgICAgIFZlY3RvciBtSW5kZXhUeXBlczsKKworICAgICAgICBwdWJsaWMgQWxsb2NhdGlvbkJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQgPSAwOworICAgICAgICAgICAgbVZlcnRleFR5cGVzID0gbmV3IEVudHJ5WzE2XTsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzID0gbmV3IFZlY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uYSA9IGE7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSwgUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLmEgPSBhOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4VHlwZShQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUuYSA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWVzaCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEFsbG9jYXRpb25CdWlsZGVyIGIpIHsKKworICAgICAgICAgICAgaW50IGlkID0gcnMubk1lc2hDcmVhdGUoYi5tVmVydGV4VHlwZUNvdW50LCBiLm1JbmRleFR5cGVzLnNpemUoKSk7CisgICAgICAgICAgICBNZXNoIG5ld01lc2ggPSBuZXcgTWVzaChpZCwgcnMpOworICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVbYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2IubVZlcnRleFR5cGVDb3VudF07CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubUluZGV4VHlwZXMuc2l6ZSgpOyBjdCArKykgeworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWIubUluZGV4VHlwZXMuZWxlbWVudEF0KGN0KTsKKyAgICAgICAgICAgICAgICBpbnQgYWxsb2NJRCA9IChlbnRyeS5hID09IG51bGwpID8gMCA6IGVudHJ5LmEuZ2V0SUQoKTsKKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRJbmRleChpZCwgYWxsb2NJRCwgZW50cnkucHJpbS5tSUQsIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnNbY3RdID0gZW50cnkuYTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzW2N0XSA9IGVudHJ5LnByaW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubVZlcnRleFR5cGVDb3VudDsgY3QgKyspIHsKKyAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IGIubVZlcnRleFR5cGVzW2N0XTsKKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRWZXJ0ZXgoaWQsIGVudHJ5LmEubUlELCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVyc1tjdF0gPSBlbnRyeS5hOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3TWVzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXNoIGNyZWF0ZSgpIHsKKyAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICAgICAgTWVzaCBzbSA9IGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJpYW5nbGVNZXNoQnVpbGRlciB7CisgICAgICAgIGZsb2F0IG1WdHhEYXRhW107CisgICAgICAgIGludCBtVnR4Q291bnQ7CisgICAgICAgIHNob3J0IG1JbmRleERhdGFbXTsKKyAgICAgICAgaW50IG1JbmRleENvdW50OworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworICAgICAgICBFbGVtZW50IG1FbGVtZW50OworCisgICAgICAgIGZsb2F0IG1OWCA9IDA7CisgICAgICAgIGZsb2F0IG1OWSA9IDA7CisgICAgICAgIGZsb2F0IG1OWiA9IC0xOworICAgICAgICBmbG9hdCBtUzAgPSAwOworICAgICAgICBmbG9hdCBtVDAgPSAwOworICAgICAgICBmbG9hdCBtUiA9IDE7CisgICAgICAgIGZsb2F0IG1HID0gMTsKKyAgICAgICAgZmxvYXQgbUIgPSAxOworICAgICAgICBmbG9hdCBtQSA9IDE7CisKKyAgICAgICAgaW50IG1WdHhTaXplOworICAgICAgICBpbnQgbUZsYWdzOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTE9SID0gMHgwMDAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUwgPSAweDAwMDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRVUkVfMCA9IDB4MDEwMDsKKworICAgICAgICBwdWJsaWMgVHJpYW5nbGVNZXNoQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIGludCB2dHhTaXplLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbVZ0eENvdW50ID0gMDsKKyAgICAgICAgICAgIG1JbmRleENvdW50ID0gMDsKKyAgICAgICAgICAgIG1WdHhEYXRhID0gbmV3IGZsb2F0WzEyOF07CisgICAgICAgICAgICBtSW5kZXhEYXRhID0gbmV3IHNob3J0WzEyOF07CisgICAgICAgICAgICBtVnR4U2l6ZSA9IHZ0eFNpemU7CisgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKworICAgICAgICAgICAgaWYgKHZ0eFNpemUgPCAyIHx8IHZ0eFNpemUgPiAzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmVydGV4IHNpemUgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG1ha2VTcGFjZShpbnQgY291bnQpIHsKKyAgICAgICAgICAgIGlmICgobVZ0eENvdW50ICsgY291bnQpID49IG1WdHhEYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGZsb2F0IHRbXSA9IG5ldyBmbG9hdFttVnR4RGF0YS5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1WdHhEYXRhLCAwLCB0LCAwLCBtVnR4RGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIG1WdHhEYXRhID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBsYXRjaCgpIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYWtlU3BhY2UoNCk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVI7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUc7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUI7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgyKTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUzA7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVQwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYWtlU3BhY2UoMyk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5YOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgaWYgKG1WdHhTaXplICE9IDIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ha2VTcGFjZSgyKTsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHg7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB5OworICAgICAgICAgICAgbGF0Y2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFrZVNwYWNlKDMpOworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB6OworICAgICAgICAgICAgbGF0Y2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmUoZmxvYXQgcywgZmxvYXQgdCkgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TMCA9IHM7CisgICAgICAgICAgICBtVDAgPSB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Tm9ybWFsKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTlggPSB4OworICAgICAgICAgICAgbU5ZID0geTsKKyAgICAgICAgICAgIG1OWiA9IHo7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUiA9IHI7CisgICAgICAgICAgICBtRyA9IGc7CisgICAgICAgICAgICBtQiA9IGI7CisgICAgICAgICAgICBtQSA9IGE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRUcmlhbmdsZShpbnQgaWR4MSwgaW50IGlkeDIsIGludCBpZHgzKSB7CisgICAgICAgICAgICBpZigoaWR4MSA+PSBtVnR4Q291bnQpIHx8IChpZHgxIDwgMCkgfHwKKyAgICAgICAgICAgICAgIChpZHgyID49IG1WdHhDb3VudCkgfHwgKGlkeDIgPCAwKSB8fAorICAgICAgICAgICAgICAgKGlkeDMgPj0gbVZ0eENvdW50KSB8fCAoaWR4MyA8IDApKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbmRleCBwcm92aWRlZCBncmVhdGVyIHRoYW4gdmVydGV4IGNvdW50LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtSW5kZXhDb3VudCArIDMpID49IG1JbmRleERhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgc2hvcnQgdFtdID0gbmV3IHNob3J0W21JbmRleERhdGEubGVuZ3RoICogMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtSW5kZXhEYXRhLCAwLCB0LCAwLCBtSW5kZXhEYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgbUluZGV4RGF0YSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDE7CisgICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDI7CisgICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVzaCBjcmVhdGUoYm9vbGVhbiB1cGxvYWRUb0J1ZmZlck9iamVjdCkgeworICAgICAgICAgICAgRWxlbWVudC5CdWlsZGVyIGIgPSBuZXcgRWxlbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgICAgICBpbnQgZmxvYXRDb3VudCA9IG1WdHhTaXplOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVWZWN0b3IobVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WdHhTaXplKSwgInBvc2l0aW9uIik7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSA0OworICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzQobVJTKSwgImNvbG9yIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8yKG1SUyksICJ0ZXh0dXJlMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfMyhtUlMpLCAibm9ybWFsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRWxlbWVudCA9IGIuY3JlYXRlKCk7CisKKyAgICAgICAgICAgIEJ1aWxkZXIgc21iID0gbmV3IEJ1aWxkZXIobVJTKTsKKyAgICAgICAgICAgIHNtYi5hZGRWZXJ0ZXhUeXBlKG1FbGVtZW50LCBtVnR4Q291bnQgLyBmbG9hdENvdW50KTsKKyAgICAgICAgICAgIHNtYi5hZGRJbmRleFR5cGUoRWxlbWVudC5VMTYobVJTKSwgbUluZGV4Q291bnQsIFByaW1pdGl2ZS5UUklBTkdMRSk7CisKKyAgICAgICAgICAgIE1lc2ggc20gPSBzbWIuY3JlYXRlKCk7CisKKyAgICAgICAgICAgIHNtLmdldFZlcnRleEFsbG9jYXRpb24oMCkuZGF0YShtVnR4RGF0YSk7CisgICAgICAgICAgICBpZih1cGxvYWRUb0J1ZmZlck9iamVjdCkgeworICAgICAgICAgICAgICAgIHNtLmdldFZlcnRleEFsbG9jYXRpb24oMCkudXBsb2FkVG9CdWZmZXJPYmplY3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc20uZ2V0SW5kZXhBbGxvY2F0aW9uKDApLmRhdGEobUluZGV4RGF0YSk7CisgICAgICAgICAgICBzbS5nZXRJbmRleEFsbG9jYXRpb24oMCkudXBsb2FkVG9CdWZmZXJPYmplY3QoKTsKKworICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1SYXN0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhCmluZGV4IDU2ZjliZjQuLmMzYWI0ODEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhCkBAIC0yNiwyMyArMjYsMzQgQEAKICAqCiAgKiovCiBwdWJsaWMgY2xhc3MgUHJvZ3JhbVJhc3RlciBleHRlbmRzIEJhc2VPYmogeworCisgICAgcHVibGljIGVudW0gQ3VsbE1vZGUgeworICAgICAgICBCQUNLICgwKSwKKyAgICAgICAgRlJPTlQgKDEpLAorICAgICAgICBOT05FICgyKTsKKworICAgICAgICBpbnQgbUlEOworICAgICAgICBDdWxsTW9kZShpbnQgaWQpIHsKKyAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICB9CisgICAgfQorCiAgICAgYm9vbGVhbiBtUG9pbnRTbW9vdGg7CiAgICAgYm9vbGVhbiBtTGluZVNtb290aDsKICAgICBib29sZWFuIG1Qb2ludFNwcml0ZTsKLSAgICBmbG9hdCBtUG9pbnRTaXplOwogICAgIGZsb2F0IG1MaW5lV2lkdGg7Ci0gICAgRWxlbWVudCBtSW47Ci0gICAgRWxlbWVudCBtT3V0OworICAgIEN1bGxNb2RlIG1DdWxsTW9kZTsKIAogICAgIFByb2dyYW1SYXN0ZXIoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgc3VwZXIocnMpOwogICAgICAgICBtSUQgPSBpZDsKIAotICAgICAgICBtUG9pbnRTaXplID0gMS4wZjsKICAgICAgICAgbUxpbmVXaWR0aCA9IDEuMGY7CiAgICAgICAgIG1Qb2ludFNtb290aCA9IGZhbHNlOwogICAgICAgICBtTGluZVNtb290aCA9IGZhbHNlOwogICAgICAgICBtUG9pbnRTcHJpdGUgPSBmYWxzZTsKKworICAgICAgICBtQ3VsbE1vZGUgPSBDdWxsTW9kZS5CQUNLOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldExpbmVXaWR0aChmbG9hdCB3KSB7CkBAIC01MSw1MSArNjIsNDggQEAKICAgICAgICAgbVJTLm5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKG1JRCwgdyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0UG9pbnRTaXplKGZsb2F0IHMpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRDdWxsTW9kZShDdWxsTW9kZSBtKSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUG9pbnRTaXplID0gczsKLSAgICAgICAgbVJTLm5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKG1JRCwgcyk7CisgICAgICAgIG1DdWxsTW9kZSA9IG07CisgICAgICAgIG1SUy5uUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKG1JRCwgbS5tSUQpOwogICAgIH0KIAotICAgIHZvaWQgaW50ZXJuYWxJbml0KCkgewotICAgICAgICBpbnQgaW5JRCA9IDA7Ci0gICAgICAgIGludCBvdXRJRCA9IDA7Ci0gICAgICAgIGlmIChtSW4gIT0gbnVsbCkgewotICAgICAgICAgICAgaW5JRCA9IG1Jbi5tSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1PdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0SUQgPSBtT3V0Lm1JRDsKLSAgICAgICAgfQotICAgICAgICBtSUQgPSBtUlMublByb2dyYW1SYXN0ZXJDcmVhdGUoaW5JRCwgb3V0SUQsIG1Qb2ludFNtb290aCwgbUxpbmVTbW9vdGgsIG1Qb2ludFNwcml0ZSk7Ci0gICAgfQotCi0KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBQcm9ncmFtUmFzdGVyIG1QUjsKKyAgICAgICAgYm9vbGVhbiBtUG9pbnRTcHJpdGU7CisgICAgICAgIGJvb2xlYW4gbVBvaW50U21vb3RoOworICAgICAgICBib29sZWFuIG1MaW5lU21vb3RoOwogCisgICAgICAgIC8vIExlZ2FjeSB0byBub3QgYnJlYWsgYXBwIGluIG90aGVyIHByb2plY3RzLCB3aWxsIGJlIHJlbW92ZWQgaW4gY2xlYW51cCBwYXNzCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgRWxlbWVudCBpbiwgRWxlbWVudCBvdXQpIHsKICAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVBSID0gbmV3IFByb2dyYW1SYXN0ZXIoMCwgcnMpOworICAgICAgICAgICAgbVBvaW50U21vb3RoID0gZmFsc2U7CisgICAgICAgICAgICBtTGluZVNtb290aCA9IGZhbHNlOworICAgICAgICAgICAgbVBvaW50U3ByaXRlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbVBvaW50U21vb3RoID0gZmFsc2U7CisgICAgICAgICAgICBtTGluZVNtb290aCA9IGZhbHNlOworICAgICAgICAgICAgbVBvaW50U3ByaXRlID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNwcml0ZUVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVBSLm1Qb2ludFNwcml0ZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIG1Qb2ludFNwcml0ZSA9IGVuYWJsZTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFBvaW50U21vb3RoRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtUFIubVBvaW50U21vb3RoID0gZW5hYmxlOworICAgICAgICAgICAgbVBvaW50U21vb3RoID0gZW5hYmxlOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0TGluZVNtb290aEVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVBSLm1MaW5lU21vb3RoID0gZW5hYmxlOworICAgICAgICAgICAgbUxpbmVTbW9vdGggPSBlbmFibGU7CiAgICAgICAgIH0KIAotCiAgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJvZ3JhbVJhc3RlciBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewotICAgICAgICAgICAgYi5tUFIuaW50ZXJuYWxJbml0KCk7Ci0gICAgICAgICAgICBQcm9ncmFtUmFzdGVyIHByID0gYi5tUFI7Ci0gICAgICAgICAgICBiLm1QUiA9IG5ldyBQcm9ncmFtUmFzdGVyKDAsIGIubVJTKTsKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtUmFzdGVyQ3JlYXRlKGIubVBvaW50U21vb3RoLCBiLm1MaW5lU21vb3RoLCBiLm1Qb2ludFNwcml0ZSk7CisgICAgICAgICAgICBQcm9ncmFtUmFzdGVyIHByID0gbmV3IFByb2dyYW1SYXN0ZXIoaWQsIHJzKTsKICAgICAgICAgICAgIHJldHVybiBwcjsKICAgICAgICAgfQogCkBAIC0xMTEsMyArMTE5LDQgQEAKIAogCiAKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKaW5kZXggYjJlNWIwMi4uMjQwZDU0NCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCkBAIC0xNjUsOSArMTY1LDkgQEAKICAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbVN0b3JlRGl0aGVyKGJvb2xlYW4gZW5hYmxlKTsKICAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbVN0b3JlQ3JlYXRlKCk7CiAKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbVJhc3RlckNyZWF0ZShpbnQgaW4sIGludCBvdXQsIGJvb2xlYW4gcG9pbnRTbW9vdGgsIGJvb2xlYW4gbGluZVNtb290aCwgYm9vbGVhbiBwb2ludFNwcml0ZSk7CisgICAgbmF0aXZlIGludCAgblByb2dyYW1SYXN0ZXJDcmVhdGUoYm9vbGVhbiBwb2ludFNtb290aCwgYm9vbGVhbiBsaW5lU21vb3RoLCBib29sZWFuIHBvaW50U3ByaXRlKTsKICAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChpbnQgcHIsIGZsb2F0IHYpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKGludCBwciwgZmxvYXQgdik7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShpbnQgcHIsIGludCBtb2RlKTsKIAogICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtQmluZENvbnN0YW50cyhpbnQgcHYsIGludCBzbG90LCBpbnQgbUlEKTsKICAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUJpbmRUZXh0dXJlKGludCB2cGYsIGludCBzbG90LCBpbnQgYSk7CkBAIC0xODYsOSArMTg2LDEzIEBACiAgICAgbmF0aXZlIHZvaWQgbkxpZ2h0U2V0Q29sb3IoaW50IGwsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpOwogICAgIG5hdGl2ZSB2b2lkIG5MaWdodFNldFBvc2l0aW9uKGludCBsLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKIAotICAgIG5hdGl2ZSBpbnQgIG5TaW1wbGVNZXNoQ3JlYXRlKGludCBiYXRjaElELCBpbnQgaWR4SUQsIGludFtdIHZ0eElELCBpbnQgcHJpbSk7Ci0gICAgbmF0aXZlIHZvaWQgblNpbXBsZU1lc2hCaW5kVmVydGV4KGludCBpZCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNpbXBsZU1lc2hCaW5kSW5kZXgoaW50IGlkLCBpbnQgYWxsb2MpOworICAgIG5hdGl2ZSBpbnQgIG5NZXNoQ3JlYXRlKGludCB2dHhDb3VudCwgaW50IGluZGV4Q291bnQpOworICAgIG5hdGl2ZSB2b2lkIG5NZXNoQmluZFZlcnRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpOworICAgIG5hdGl2ZSB2b2lkIG5NZXNoQmluZEluZGV4KGludCBpZCwgaW50IGFsbG9jLCBpbnQgcHJpbSwgaW50IHNsb3QpOworICAgIG5hdGl2ZSBpbnQgIG5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoaW50IGlkKTsKKyAgICBuYXRpdmUgaW50ICBuTWVzaEdldEluZGV4Q291bnQoaW50IGlkKTsKKyAgICBuYXRpdmUgdm9pZCBuTWVzaEdldFZlcnRpY2VzKGludCBpZCwgaW50W10gdnR4SWRzLCBpbnQgdnR4SWRDb3VudCk7CisgICAgbmF0aXZlIHZvaWQgbk1lc2hHZXRJbmRpY2VzKGludCBpZCwgaW50W10gaWR4SWRzLCBpbnRbXSBwcmltaXRpdmVzLCBpbnQgdnR4SWRDb3VudCk7CiAKICAgICBuYXRpdmUgdm9pZCBuQW5pbWF0aW9uQmVnaW4oaW50IGF0dHJpYkNvdW50LCBpbnQga2V5ZnJhbWVDb3VudCk7CiAgICAgbmF0aXZlIHZvaWQgbkFuaW1hdGlvbkFkZChmbG9hdCB0aW1lLCBmbG9hdFtdIGF0dHJpYnMpOwpAQCAtMzU4LDMgKzM2Miw0IEBACiB9CiAKIAorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YQppbmRleCBiZWFjOTk3Li5kOWFlYzU5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEKQEAgLTc3LDYgKzc3LDEwIEBACiAgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFySShtSUQsIGluZGV4LCB2KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBib29sZWFuIHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJJKG1JRCwgaW5kZXgsIHYgPyAxIDogMCk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgRmllbGRQYWNrZXIgdikgewogICAgICAgICBtUlMublNjcmlwdFNldFZhclYobUlELCBpbmRleCwgdi5nZXREYXRhKCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2ltcGxlTWVzaC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDA3MzYuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgU2ltcGxlTWVzaCBleHRlbmRzIEJhc2VPYmogewotICAgIFR5cGVbXSBtVmVydGV4VHlwZXM7Ci0gICAgVHlwZSBtSW5kZXhUeXBlOwotICAgIC8vVHlwZSBtQmF0Y2hlVHlwZTsKLSAgICBQcmltaXRpdmUgbVByaW1pdGl2ZTsKLQotICAgIFNpbXBsZU1lc2goaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiaW5kVmVydGV4QWxsb2NhdGlvbihBbGxvY2F0aW9uIGEsIGludCBzbG90KSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNpbXBsZU1lc2hCaW5kVmVydGV4KG1JRCwgYS5tSUQsIHNsb3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJpbmRJbmRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNpbXBsZU1lc2hCaW5kSW5kZXgobUlELCBhLm1JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlVmVydGV4QWxsb2NhdGlvbihpbnQgc2xvdCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgcmV0dXJuIEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCBtVmVydGV4VHlwZXNbc2xvdF0pOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxvY2F0aW9uIGNyZWF0ZUluZGV4QWxsb2NhdGlvbigpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIHJldHVybiBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbUluZGV4VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0VmVydGV4VHlwZShpbnQgc2xvdCkgewotICAgICAgICByZXR1cm4gbVZlcnRleFR5cGVzW3Nsb3RdOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIGdldEluZGV4VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbmRleFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLQotICAgICAgICBjbGFzcyBFbnRyeSB7Ci0gICAgICAgICAgICBUeXBlIHQ7Ci0gICAgICAgICAgICBFbGVtZW50IGU7Ci0gICAgICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtVmVydGV4VHlwZUNvdW50OwotICAgICAgICBFbnRyeVtdIG1WZXJ0ZXhUeXBlczsKLSAgICAgICAgRW50cnkgbUluZGV4VHlwZTsKLSAgICAgICAgLy9FbnRyeSBtQmF0Y2hUeXBlOwotICAgICAgICBQcmltaXRpdmUgbVByaW1pdGl2ZTsKLQotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50ID0gMDsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlcyA9IG5ldyBFbnRyeVsxNl07Ci0gICAgICAgICAgICBtSW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleFR5cGUoVHlwZSB0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS50ID0gdDsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKLSAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLmUgPSBlOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnNpemUgPSBzaXplOwotICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOwotICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbmRleFR5cGUoVHlwZSB0KSB7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLnQgPSB0OwotICAgICAgICAgICAgbUluZGV4VHlwZS5lID0gbnVsbDsKLSAgICAgICAgICAgIG1JbmRleFR5cGUuc2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbmRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgewotICAgICAgICAgICAgbUluZGV4VHlwZS50ID0gbnVsbDsKLSAgICAgICAgICAgIG1JbmRleFR5cGUuZSA9IGU7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLnNpemUgPSBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJpbWl0aXZlKFByaW1pdGl2ZSBwKSB7Ci0gICAgICAgICAgICBtUHJpbWl0aXZlID0gcDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgVHlwZSBuZXdUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHsKLSAgICAgICAgICAgIFR5cGUuQnVpbGRlciB0YiA9IG5ldyBUeXBlLkJ1aWxkZXIobVJTLCBlKTsKLSAgICAgICAgICAgIHRiLmFkZChEaW1lbnNpb24uWCwgc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGIuY3JlYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIFNpbXBsZU1lc2ggaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBCdWlsZGVyIGIpIHsKLSAgICAgICAgICAgIFR5cGVbXSB0b0Rlc3Ryb3kgPSBuZXcgVHlwZVsxOF07Ci0gICAgICAgICAgICBpbnQgdG9EZXN0cm95Q291bnQgPSAwOwotCi0gICAgICAgICAgICBpbnQgaW5kZXhJRCA9IDA7Ci0gICAgICAgICAgICBpZiAoYi5tSW5kZXhUeXBlLnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluZGV4SUQgPSBiLm1JbmRleFR5cGUudC5tSUQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGIubUluZGV4VHlwZS5zaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBiLm1JbmRleFR5cGUudCA9IGIubmV3VHlwZShiLm1JbmRleFR5cGUuZSwgYi5tSW5kZXhUeXBlLnNpemUpOwotICAgICAgICAgICAgICAgIGluZGV4SUQgPSBiLm1JbmRleFR5cGUudC5tSUQ7Ci0gICAgICAgICAgICAgICAgdG9EZXN0cm95W3RvRGVzdHJveUNvdW50KytdID0gYi5tSW5kZXhUeXBlLnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludFtdIElEcyA9IG5ldyBpbnRbYi5tVmVydGV4VHlwZUNvdW50XTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBiLm1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYi5tVmVydGV4VHlwZXNbY3RdLnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJRHNbY3RdID0gYi5tVmVydGV4VHlwZXNbY3RdLnQubUlEOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGIubVZlcnRleFR5cGVzW2N0XS50ID0gYi5uZXdUeXBlKGIubVZlcnRleFR5cGVzW2N0XS5lLCBiLm1WZXJ0ZXhUeXBlc1tjdF0uc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIElEc1tjdF0gPSBiLm1WZXJ0ZXhUeXBlc1tjdF0udC5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIHRvRGVzdHJveVt0b0Rlc3Ryb3lDb3VudCsrXSA9IGIubVZlcnRleFR5cGVzW2N0XS50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGlkID0gcnMublNpbXBsZU1lc2hDcmVhdGUoMCwgaW5kZXhJRCwgSURzLCBiLm1QcmltaXRpdmUubUlEKTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCB0b0Rlc3Ryb3lDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIHRvRGVzdHJveVtjdF0uZGVzdHJveSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZU1lc2goaWQsIHJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTaW1wbGVNZXNoIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICAgICAgU2ltcGxlTWVzaCBzbSA9IGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7Ci0gICAgICAgICAgICBzbS5tVmVydGV4VHlwZXMgPSBuZXcgVHlwZVttVmVydGV4VHlwZUNvdW50XTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgc20ubVZlcnRleFR5cGVzW2N0XSA9IG1WZXJ0ZXhUeXBlc1tjdF0udDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNtLm1JbmRleFR5cGUgPSBtSW5kZXhUeXBlLnQ7Ci0gICAgICAgICAgICBzbS5tUHJpbWl0aXZlID0gbVByaW1pdGl2ZTsKLSAgICAgICAgICAgIHJldHVybiBzbTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJpYW5nbGVNZXNoQnVpbGRlciB7Ci0gICAgICAgIGZsb2F0IG1WdHhEYXRhW107Ci0gICAgICAgIGludCBtVnR4Q291bnQ7Ci0gICAgICAgIHNob3J0IG1JbmRleERhdGFbXTsKLSAgICAgICAgaW50IG1JbmRleENvdW50OwotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBFbGVtZW50IG1FbGVtZW50OwotCi0gICAgICAgIGZsb2F0IG1OWCA9IDA7Ci0gICAgICAgIGZsb2F0IG1OWSA9IDA7Ci0gICAgICAgIGZsb2F0IG1OWiA9IC0xOwotICAgICAgICBmbG9hdCBtUzAgPSAwOwotICAgICAgICBmbG9hdCBtVDAgPSAwOwotICAgICAgICBmbG9hdCBtUiA9IDE7Ci0gICAgICAgIGZsb2F0IG1HID0gMTsKLSAgICAgICAgZmxvYXQgbUIgPSAxOwotICAgICAgICBmbG9hdCBtQSA9IDE7Ci0KLSAgICAgICAgaW50IG1WdHhTaXplOwotICAgICAgICBpbnQgbUZsYWdzOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTE9SID0gMHgwMDAxOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUwgPSAweDAwMDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRVUkVfMCA9IDB4MDEwMDsKLQotICAgICAgICBwdWJsaWMgVHJpYW5nbGVNZXNoQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIGludCB2dHhTaXplLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVZ0eENvdW50ID0gMDsKLSAgICAgICAgICAgIG1JbmRleENvdW50ID0gMDsKLSAgICAgICAgICAgIG1WdHhEYXRhID0gbmV3IGZsb2F0WzEyOF07Ci0gICAgICAgICAgICBtSW5kZXhEYXRhID0gbmV3IHNob3J0WzEyOF07Ci0gICAgICAgICAgICBtVnR4U2l6ZSA9IHZ0eFNpemU7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLQotICAgICAgICAgICAgaWYgKHZ0eFNpemUgPCAyIHx8IHZ0eFNpemUgPiAzKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmVydGV4IHNpemUgb3V0IG9mIHJhbmdlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1ha2VTcGFjZShpbnQgY291bnQpIHsKLSAgICAgICAgICAgIGlmICgobVZ0eENvdW50ICsgY291bnQpID49IG1WdHhEYXRhLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGZsb2F0IHRbXSA9IG5ldyBmbG9hdFttVnR4RGF0YS5sZW5ndGggKiAyXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1WdHhEYXRhLCAwLCB0LCAwLCBtVnR4RGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhID0gdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBsYXRjaCgpIHsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKLSAgICAgICAgICAgICAgICBtYWtlU3BhY2UoNCk7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVI7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUc7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUI7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgewotICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgyKTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUzA7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVQwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKLSAgICAgICAgICAgICAgICBtYWtlU3BhY2UoMyk7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5YOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSkgewotICAgICAgICAgICAgaWYgKG1WdHhTaXplICE9IDIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ha2VTcGFjZSgyKTsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHg7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB5OwotICAgICAgICAgICAgbGF0Y2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7Ci0gICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFrZVNwYWNlKDMpOwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB6OwotICAgICAgICAgICAgbGF0Y2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmUoZmxvYXQgcywgZmxvYXQgdCkgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TMCA9IHM7Ci0gICAgICAgICAgICBtVDAgPSB0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Tm9ybWFsKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTlggPSB4OwotICAgICAgICAgICAgbU5ZID0geTsKLSAgICAgICAgICAgIG1OWiA9IHo7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUiA9IHI7Ci0gICAgICAgICAgICBtRyA9IGc7Ci0gICAgICAgICAgICBtQiA9IGI7Ci0gICAgICAgICAgICBtQSA9IGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUcmlhbmdsZShpbnQgaWR4MSwgaW50IGlkeDIsIGludCBpZHgzKSB7Ci0gICAgICAgICAgICBpZigoaWR4MSA+PSBtVnR4Q291bnQpIHx8IChpZHgxIDwgMCkgfHwKLSAgICAgICAgICAgICAgIChpZHgyID49IG1WdHhDb3VudCkgfHwgKGlkeDIgPCAwKSB8fAotICAgICAgICAgICAgICAgKGlkeDMgPj0gbVZ0eENvdW50KSB8fCAoaWR4MyA8IDApKSB7Ci0gICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbmRleCBwcm92aWRlZCBncmVhdGVyIHRoYW4gdmVydGV4IGNvdW50LiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtSW5kZXhDb3VudCArIDMpID49IG1JbmRleERhdGEubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgc2hvcnQgdFtdID0gbmV3IHNob3J0W21JbmRleERhdGEubGVuZ3RoICogMl07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtSW5kZXhEYXRhLCAwLCB0LCAwLCBtSW5kZXhEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbUluZGV4RGF0YSA9IHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDE7Ci0gICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDI7Ci0gICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2ltcGxlTWVzaCBjcmVhdGUoKSB7Ci0gICAgICAgICAgICBFbGVtZW50LkJ1aWxkZXIgYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgICAgIGludCBmbG9hdENvdW50ID0gbVZ0eFNpemU7Ci0gICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZVZlY3RvcihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZ0eFNpemUpLCAicG9zaXRpb24iKTsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDQ7Ci0gICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfNChtUlMpLCAiY29sb3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAyOwotICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzIobVJTKSwgInRleHR1cmUwIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMzsKLSAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8zKG1SUyksICJub3JtYWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FbGVtZW50ID0gYi5jcmVhdGUoKTsKLQotICAgICAgICAgICAgQnVpbGRlciBzbWIgPSBuZXcgQnVpbGRlcihtUlMpOwotICAgICAgICAgICAgc21iLmFkZFZlcnRleFR5cGUobUVsZW1lbnQsIG1WdHhDb3VudCAvIGZsb2F0Q291bnQpOwotICAgICAgICAgICAgc21iLnNldEluZGV4VHlwZShFbGVtZW50LlUxNihtUlMpLCBtSW5kZXhDb3VudCk7Ci0gICAgICAgICAgICBzbWIuc2V0UHJpbWl0aXZlKFByaW1pdGl2ZS5UUklBTkdMRSk7Ci0gICAgICAgICAgICBTaW1wbGVNZXNoIHNtID0gc21iLmNyZWF0ZSgpOwotCi0gICAgICAgICAgICBBbGxvY2F0aW9uIHZlcnRleEFsbG9jID0gc20uY3JlYXRlVmVydGV4QWxsb2NhdGlvbigwKTsKLSAgICAgICAgICAgIEFsbG9jYXRpb24gaW5kZXhBbGxvYyA9IHNtLmNyZWF0ZUluZGV4QWxsb2NhdGlvbigpOwotICAgICAgICAgICAgc20uYmluZFZlcnRleEFsbG9jYXRpb24odmVydGV4QWxsb2MsIDApOwotICAgICAgICAgICAgc20uYmluZEluZGV4QWxsb2NhdGlvbihpbmRleEFsbG9jKTsKLQotICAgICAgICAgICAgdmVydGV4QWxsb2MuZGF0YShtVnR4RGF0YSk7Ci0gICAgICAgICAgICB2ZXJ0ZXhBbGxvYy51cGxvYWRUb0J1ZmZlck9iamVjdCgpOwotCi0gICAgICAgICAgICBpbmRleEFsbG9jLmRhdGEobUluZGV4RGF0YSk7Ci0gICAgICAgICAgICBpbmRleEFsbG9jLnVwbG9hZFRvQnVmZmVyT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzbTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAgYi9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcAppbmRleCBjNjFhMjE1Li4xMzM2MGMzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcAorKysgYi9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcApAQCAtNzI1LDEyICs3MjUsMTAgQEAKIHN0YXRpYyBpbnQKIG5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmaWxlQTNEKQogewotICAgIExPR1YoIl9fX19fX25GaWxlQTNEICV1IiwgKHVpbnQzMl90KSBmaWxlQTNEKTsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKIAogICAgIGludDMyX3QgbnVtRW50cmllcyA9IDA7CiAgICAgcnNGaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKGNvbiwgJm51bUVudHJpZXMsIChSc0ZpbGUpZmlsZUEzRCk7Ci0gICAgTE9HVigiX19fX19fbkZpbGVBM0QgTnVtRW50cmllcyAldSIsICh1aW50MzJfdCkgbnVtRW50cmllcyk7CiAgICAgcmV0dXJuIG51bUVudHJpZXM7CiB9CiAKQEAgLTEyMDMsMjEgKzEyMDEsMTIgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgamludAotblByb2dyYW1SYXN0ZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGluLCBqaW50IG91dCwKLSAgICAgICAgICAgICAgICAgICAgIGpib29sZWFuIHBvaW50U21vb3RoLCBqYm9vbGVhbiBsaW5lU21vb3RoLCBqYm9vbGVhbiBwb2ludFNwcml0ZSkKK25Qcm9ncmFtUmFzdGVyQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gcG9pbnRTbW9vdGgsIGpib29sZWFuIGxpbmVTbW9vdGgsIGpib29sZWFuIHBvaW50U3ByaXRlKQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyQ3JlYXRlLCBjb24oJXApLCBpbiglcCksIG91dCglcCksIHBvaW50U21vb3RoKCVpKSwgbGluZVNtb290aCglaSksIHBvaW50U3ByaXRlKCVpKSIsCi0gICAgICAgICAgICBjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0LCBwb2ludFNtb290aCwgbGluZVNtb290aCwgcG9pbnRTcHJpdGUpOwotICAgIHJldHVybiAoamludClyc1Byb2dyYW1SYXN0ZXJDcmVhdGUoY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCwgcG9pbnRTbW9vdGgsIGxpbmVTbW9vdGgsIHBvaW50U3ByaXRlKTsKLX0KLQotc3RhdGljIHZvaWQKLW5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cHIsIGpmbG9hdCB2KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlckNyZWF0ZSwgY29uKCVwKSwgcG9pbnRTbW9vdGgoJWkpLCBsaW5lU21vb3RoKCVpKSwgcG9pbnRTcHJpdGUoJWkpIiwKKyAgICAgICAgICAgIGNvbiwgcG9pbnRTbW9vdGgsIGxpbmVTbW9vdGgsIHBvaW50U3ByaXRlKTsKKyAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtUmFzdGVyQ3JlYXRlKGNvbiwgcG9pbnRTbW9vdGgsIGxpbmVTbW9vdGgsIHBvaW50U3ByaXRlKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEyMjUsNyArMTIxNCwxNSBAQAogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtUmFzdGVyKXZwciwgdik7Cit9CisKK3N0YXRpYyB2b2lkCituUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cHIsIGppbnQgdikKK3sKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglaSkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCAoUnNDdWxsTW9kZSl2KTsKIH0KIAogCkBAIC0xMzUxLDMyICsxMzQ4LDg0IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5TaW1wbGVNZXNoQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBiYXRjaElELCBqaW50IGluZGV4SUQsIGppbnRBcnJheSB2dHhJRHMsIGppbnQgcHJpbUlEKQorbk1lc2hDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHZ0eENvdW50LCBqaW50IGlkeENvdW50KQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgodnR4SURzKTsKLSAgICBMT0dfQVBJKCJuU2ltcGxlTWVzaENyZWF0ZSwgY29uKCVwKSwgYmF0Y2hJRCglaSksIGluZGV4SUQoJWkpLCB2dHhJRHMubGVuKCVpKSwgcHJpbUlEKCVpKSIsCi0gICAgICAgICAgICBjb24sIGJhdGNoSUQsIGluZGV4SUQsIGxlbiwgcHJpbUlEKTsKLSAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHZ0eElEcywgTlVMTCk7Ci0gICAgaW50IGlkID0gKGludClyc1NpbXBsZU1lc2hDcmVhdGUoY29uLCAodm9pZCAqKWJhdGNoSUQsICh2b2lkICopaW5kZXhJRCwgKHZvaWQgKiopcHRyLCBsZW4sIHByaW1JRCk7Ci0gICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHModnR4SURzLCBwdHIsIDAvKkpOSV9BQk9SVCovKTsKKyAgICBMT0dfQVBJKCJuTWVzaENyZWF0ZSwgY29uKCVwKSwgdnR4Q291bnQoJWkpLCBpZHhDb3VudCglaSkiLCBjb24sIHZ0eENvdW50LCBpZHhDb3VudCk7CisgICAgaW50IGlkID0gKGludClyc01lc2hDcmVhdGUoY29uLCB2dHhDb3VudCwgaWR4Q291bnQpOwogICAgIHJldHVybiBpZDsKIH0KIAogc3RhdGljIHZvaWQKLW5TaW1wbGVNZXNoQmluZFZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcywgamludCBhbGxvYywgamludCBzbG90KQorbk1lc2hCaW5kVmVydGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBtZXNoLCBqaW50IGFsbG9jLCBqaW50IHNsb3QpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hCaW5kVmVydGV4LCBjb24oJXApLCBTaW1wbGVNZXNoKCVwKSwgQWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKLSAgICByc1NpbXBsZU1lc2hCaW5kVmVydGV4KGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKKyAgICBMT0dfQVBJKCJuTWVzaEJpbmRWZXJ0ZXgsIGNvbiglcCksIE1lc2goJXApLCBBbGxvYyglcCksIHNsb3QoJWkpIiwgY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOworICAgIHJzTWVzaEJpbmRWZXJ0ZXgoY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNpbXBsZU1lc2hCaW5kSW5kZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHMsIGppbnQgYWxsb2MpCituTWVzaEJpbmRJbmRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbWVzaCwgamludCBhbGxvYywgamludCBwcmltSUQsIGppbnQgc2xvdCkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2ltcGxlTWVzaEJpbmRJbmRleCwgY29uKCVwKSwgU2ltcGxlTWVzaCglcCksIEFsbG9jKCVwKSIsIGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKLSAgICByc1NpbXBsZU1lc2hCaW5kSW5kZXgoY29uLCAoUnNTaW1wbGVNZXNoKXMsIChSc0FsbG9jYXRpb24pYWxsb2MpOworICAgIExPR19BUEkoIm5NZXNoQmluZEluZGV4LCBjb24oJXApLCBNZXNoKCVwKSwgQWxsb2MoJXApIiwgY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MpOworICAgIHJzTWVzaEJpbmRJbmRleChjb24sIChSc01lc2gpbWVzaCwgKFJzQWxsb2NhdGlvbilhbGxvYywgcHJpbUlELCBzbG90KTsKK30KKworc3RhdGljIGppbnQKK25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG1lc2gpCit7CisgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudCwgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisgICAgamludCB2dHhDb3VudCA9IDA7CisgICAgcnNNZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoY29uLCAoUnNNZXNoKW1lc2gsICZ2dHhDb3VudCk7CisgICAgcmV0dXJuIHZ0eENvdW50OworfQorCitzdGF0aWMgamludAorbk1lc2hHZXRJbmRleENvdW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBtZXNoKQoreworICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5NZXNoR2V0SW5kZXhDb3VudCwgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisgICAgamludCBpZHhDb3VudCA9IDA7CisgICAgcnNNZXNoR2V0SW5kZXhDb3VudChjb24sIChSc01lc2gpbWVzaCwgJmlkeENvdW50KTsKKyAgICByZXR1cm4gaWR4Q291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCituTWVzaEdldFZlcnRpY2VzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBtZXNoLCBqaW50QXJyYXkgX2lkcywgaW50IG51bVZ0eElEcykKK3sKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKyAgICBMT0dfQVBJKCJuTWVzaEdldFZlcnRpY2VzLCBjb24oJXApLCBNZXNoKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoKTsKKworICAgIFJzQWxsb2NhdGlvbiAqYWxsb2NzID0gKFJzQWxsb2NhdGlvbiopbWFsbG9jKCh1aW50MzJfdCludW1WdHhJRHMgKiBzaXplb2YoUnNBbGxvY2F0aW9uKSk7CisgICAgcnNNZXNoR2V0VmVydGljZXMoY29uLCAoUnNNZXNoKW1lc2gsIGFsbG9jcywgKHVpbnQzMl90KW51bVZ0eElEcyk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bVZ0eElEczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWRzLCBpLCAxLCAoY29uc3QgamludCopJmFsbG9jc1tpXSk7CisgICAgfQorCisgICAgZnJlZShhbGxvY3MpOworfQorCitzdGF0aWMgdm9pZAorbk1lc2hHZXRJbmRpY2VzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBtZXNoLCBqaW50QXJyYXkgX2lkeElkcywgamludEFycmF5IF9wcmltaXRpdmVzLCBpbnQgbnVtSW5kaWNlcykKK3sKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKyAgICBMT0dfQVBJKCJuTWVzaEdldFZlcnRpY2VzLCBjb24oJXApLCBNZXNoKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoKTsKKworICAgIFJzQWxsb2NhdGlvbiAqYWxsb2NzID0gKFJzQWxsb2NhdGlvbiopbWFsbG9jKCh1aW50MzJfdCludW1JbmRpY2VzICogc2l6ZW9mKFJzQWxsb2NhdGlvbikpOworICAgIHVpbnQzMl90ICpwcmltcz0gKHVpbnQzMl90KiltYWxsb2MoKHVpbnQzMl90KW51bUluZGljZXMgKiBzaXplb2YodWludDMyX3QpKTsKKworICAgIHJzTWVzaEdldEluZGljZXMoY29uLCAoUnNNZXNoKW1lc2gsIGFsbG9jcywgcHJpbXMsICh1aW50MzJfdCludW1JbmRpY2VzKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgbnVtSW5kaWNlczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWR4SWRzLCBpLCAxLCAoY29uc3QgamludCopJmFsbG9jc1tpXSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9wcmltaXRpdmVzLCBpLCAxLCAoY29uc3QgamludCopJnByaW1zW2ldKTsKKyAgICB9CisKKyAgICBmcmVlKGFsbG9jcyk7CisgICAgZnJlZShwcmltcyk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQ4NSw5ICsxNTM0LDkgQEAKIHsiblByb2dyYW1GcmFnbWVudENyZWF0ZSIsICAgICAgICAgIihbSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50Q3JlYXRlIH0sCiB7Im5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyIiwgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudENyZWF0ZTIgfSwKIAoteyJuUHJvZ3JhbVJhc3RlckNyZWF0ZSIsICAgICAgICAgICAiKElJWlpaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyQ3JlYXRlIH0sCi17Im5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplIiwgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUgfSwKK3siblByb2dyYW1SYXN0ZXJDcmVhdGUiLCAgICAgICAgICAgIihaWlopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJDcmVhdGUgfSwKIHsiblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgiLCAgICAgIihJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCB9LAoreyJuUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlIiwgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUgfSwKIAogeyJuUHJvZ3JhbVZlcnRleENyZWF0ZSIsICAgICAgICAgICAiKFopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtVmVydGV4Q3JlYXRlIH0sCiB7Im5Qcm9ncmFtVmVydGV4Q3JlYXRlMiIsICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUyIH0sCkBAIC0xNTA5LDkgKzE1NTgsMTQgQEAKIHsiblNhbXBsZXJTZXQiLCAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlclNldCB9LAogeyJuU2FtcGxlckNyZWF0ZSIsICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQ3JlYXRlIH0sCiAKLXsiblNpbXBsZU1lc2hDcmVhdGUiLCAgICAgICAgICAgICAgIihJSVtJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2ltcGxlTWVzaENyZWF0ZSB9LAoteyJuU2ltcGxlTWVzaEJpbmRWZXJ0ZXgiLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TaW1wbGVNZXNoQmluZFZlcnRleCB9LAoteyJuU2ltcGxlTWVzaEJpbmRJbmRleCIsICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TaW1wbGVNZXNoQmluZEluZGV4IH0sCit7Im5NZXNoQ3JlYXRlIiwgICAgICAgICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hDcmVhdGUgfSwKK3sibk1lc2hCaW5kVmVydGV4IiwgICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEJpbmRWZXJ0ZXggfSwKK3sibk1lc2hCaW5kSW5kZXgiLCAgICAgICAgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEJpbmRJbmRleCB9LAorCit7Im5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQiLCAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IH0sCit7Im5NZXNoR2V0SW5kZXhDb3VudCIsICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRJbmRleENvdW50IH0sCit7Im5NZXNoR2V0VmVydGljZXMiLCAgICAgICAgICAgICAgICIoSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldFZlcnRpY2VzIH0sCit7Im5NZXNoR2V0SW5kaWNlcyIsICAgICAgICAgICAgICAgICIoSVtJW0lJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRJbmRpY2VzIH0sCiAKIH07CiAKQEAgLTE1NDUsMyArMTU5OSw0IEBACiBiYWlsOgogICAgIHJldHVybiByZXN1bHQ7CiB9CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5LmggYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YTlhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BTkRST0lEX0FQUF9OQVRJVkVBQ1RJVklUWV9ICisjZGVmaW5lIF9BTkRST0lEX0FQUF9OQVRJVkVBQ1RJVklUWV9ICisKKyNpbmNsdWRlIDx1aS9JbnB1dFRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuaD4KKworI2luY2x1ZGUgImpuaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2V4dGVybiB2b2lkIGFuZHJvaWRfTmF0aXZlQWN0aXZpdHlfc2V0V2luZG93Rm9ybWF0KAorICAgICAgICBBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBpbnQzMl90IGZvcm1hdCk7CisKK2V4dGVybiB2b2lkIGFuZHJvaWRfTmF0aXZlQWN0aXZpdHlfc2V0V2luZG93RmxhZ3MoCisgICAgICAgIEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGludDMyX3QgdmFsdWVzLCBpbnQzMl90IG1hc2spOworCitleHRlcm4gdm9pZCBhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X3Nob3dTb2Z0SW5wdXQoCisgICAgICAgIEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGludDMyX3QgZmxhZ3MpOworCitleHRlcm4gdm9pZCBhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X2hpZGVTb2Z0SW5wdXQoCisgICAgICAgIEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGludDMyX3QgZmxhZ3MpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKworLyoKKyAqIE5ESyBpbnB1dCBxdWV1ZSBBUEkuCisgKi8KK3N0cnVjdCBBSW5wdXRRdWV1ZSB7CitwdWJsaWM6CisgICAgLyogQ3JlYXRlcyBhIGNvbnN1bWVyIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnB1dCBjaGFubmVsLiAqLworICAgIGV4cGxpY2l0IEFJbnB1dFF1ZXVlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklucHV0Q2hhbm5lbD4mIGNoYW5uZWwsIGludCB3b3JrV3JpdGUpOworCisgICAgLyogRGVzdHJveXMgdGhlIGNvbnN1bWVyIGFuZCByZWxlYXNlcyBpdHMgaW5wdXQgY2hhbm5lbC4gKi8KKyAgICB+QUlucHV0UXVldWUoKTsKKworICAgIHZvaWQgYXR0YWNoTG9vcGVyKEFMb29wZXIqIGxvb3BlciwgQUxvb3Blcl9jYWxsYmFja0Z1bmMqIGNhbGxiYWNrLCB2b2lkKiBkYXRhKTsKKworICAgIHZvaWQgZGV0YWNoTG9vcGVyKCk7CisKKyAgICBpbnQzMl90IGhhc0V2ZW50cygpOworCisgICAgaW50MzJfdCBnZXRFdmVudChBSW5wdXRFdmVudCoqIG91dEV2ZW50KTsKKworICAgIHZvaWQgZmluaXNoRXZlbnQoQUlucHV0RXZlbnQqIGV2ZW50LCBib29sIGhhbmRsZWQpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBpbmxpbmUgYW5kcm9pZDo6SW5wdXRDb25zdW1lciYgZ2V0Q29uc3VtZXIoKSB7IHJldHVybiBtQ29uc3VtZXI7IH0KKworICAgIHZvaWQgZGlzcGF0Y2hFdmVudChhbmRyb2lkOjpLZXlFdmVudCogZXZlbnQpOworCisgICAgYW5kcm9pZDo6S2V5RXZlbnQqIGNvbnN1bWVVbmhhbmRsZWRFdmVudCgpOworCisgICAgaW50IG1Xb3JrV3JpdGU7CisKK3ByaXZhdGU6CisgICAgdm9pZCBkb0RlZmF1bHRLZXkoYW5kcm9pZDo6S2V5RXZlbnQqIGtleUV2ZW50KTsKKworICAgIGFuZHJvaWQ6OklucHV0Q29uc3VtZXIgbUNvbnN1bWVyOworICAgIGFuZHJvaWQ6OlByZWFsbG9jYXRlZElucHV0RXZlbnRGYWN0b3J5IG1JbnB1dEV2ZW50RmFjdG9yeTsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpQb2xsTG9vcD4gbVBvbGxMb29wOworCisgICAgaW50IG1EaXNwYXRjaEtleVJlYWQ7CisgICAgaW50IG1EaXNwYXRjaEtleVdyaXRlOworCisgICAgLy8gVGhpcyBpcyBvbmx5IHRvdWNoZWQgYnkgdGhlIGV2ZW50IHJlYWRlciB0aHJlYWQuICBJdCBpcyB0aGUgY3VycmVudAorICAgIC8vIGtleSBldmVudHMgdGhhdCBjYW1lIG91dCBvZiB0aGUgbURpc3BhdGNoaW5nS2V5cyBsaXN0IGFuZCBhcmUgbm93CisgICAgLy/KZGVsaXZlcmVkIHRvIHRoZSBhcHAuCisgICAgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OktleUV2ZW50Kj4gbURlbGl2ZXJpbmdLZXlzOworCisgICAgYW5kcm9pZDo6TXV0ZXggbUxvY2s7CisgICAgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OktleUV2ZW50Kj4gbVBlbmRpbmdLZXlzOworICAgIGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpLZXlFdmVudCo+IG1EaXNwYXRjaGluZ0tleXM7Cit9OworCisjZW5kaWYgLy8gX0FORFJPSURfQVBQX05BVElWRUFDVElWSVRZX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfdmlld19TdXJmYWNlLmggYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzkzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BTkRST0lEX1ZJRVdfU1VSRkFDRV9ICisjZGVmaW5lIF9BTkRST0lEX1ZJRVdfU1VSRkFDRV9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KKworI2luY2x1ZGUgImpuaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2V4dGVybiBzcDxBTmF0aXZlV2luZG93PiBhbmRyb2lkX1N1cmZhY2VfZ2V0TmF0aXZlV2luZG93KAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eik7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9BTkRST0lEX1ZJRVdfU1VSRkFDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9QYXJjZWwuaCBiL2luY2x1ZGUvYmluZGVyL1BhcmNlbC5oCmluZGV4IDJjYzRkYjkuLjNhYmE1ZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYmluZGVyL1BhcmNlbC5oCisrKyBiL2luY2x1ZGUvYmluZGVyL1BhcmNlbC5oCkBAIC0xMDMsNiArMTAzLDExIEBACiAgICAgCiAgICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZU9iamVjdChjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QmIHZhbCwgYm9vbCBudWxsTWV0YURhdGEpOwogCisgICAgLy8gTGlrZSBQYXJjZWwuamF2YSdzIHdyaXRlTm9FeGNlcHRpb24oKS4gIEp1c3Qgd3JpdGVzIGEgemVybyBpbnQzMi4KKyAgICAvLyBDdXJyZW50bHkgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGRvIGFueSBvZiB0aGUgU3RyaWN0TW9kZQorICAgIC8vIHN0YWNrIGdhdGhlcmluZyBhbmQgc2VyaWFsaXphdGlvbiB0aGF0IHRoZSBKYXZhIGltcGxlbWVudGF0aW9uIGRvZXMuCisgICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZU5vRXhjZXB0aW9uKCk7CisKICAgICB2b2lkICAgICAgICAgICAgICAgIHJlbW92ZShzaXplX3Qgc3RhcnQsIHNpemVfdCBhbXQpOwogICAgIAogICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhZCh2b2lkKiBvdXREYXRhLCBzaXplX3QgbGVuKSBjb25zdDsKQEAgLTEyNSw3ICsxMzAsMTQgQEAKICAgICBzcDxJQmluZGVyPiAgICAgICAgIHJlYWRTdHJvbmdCaW5kZXIoKSBjb25zdDsKICAgICB3cDxJQmluZGVyPiAgICAgICAgIHJlYWRXZWFrQmluZGVyKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgICAgICAgICAgICByZWFkKEZsYXR0ZW5hYmxlJiB2YWwpIGNvbnN0OwotICAgIAorCisgICAgLy8gTGlrZSBQYXJjZWwuamF2YSdzIHJlYWRFeGNlcHRpb25Db2RlKCkuICBSZWFkcyB0aGUgZmlyc3QgaW50MzIKKyAgICAvLyBvZmYgb2YgYSBQYXJjZWwncyBoZWFkZXIsIHJldHVybmluZyAwIG9yIHRoZSBuZWdhdGl2ZSBlcnJvcgorICAgIC8vIGNvZGUgb24gZXhjZXB0aW9ucywgYnV0IGFsc28gZGVhbHMgd2l0aCBza2lwcGluZyBvdmVyIHJpY2gKKyAgICAvLyByZXNwb25zZSBoZWFkZXJzLiAgQ2FsbGVycyBzaG91bGQgdXNlIHRoaXMgdG8gcmVhZCAmIHBhcnNlIHRoZQorICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgcmF0aGVyIHRoYW4gZG9pbmcgaXQgYnkgaGFuZC4KKyAgICBpbnQzMl90ICAgICAgICAgICAgIHJlYWRFeGNlcHRpb25Db2RlKCkgY29uc3Q7CisKICAgICAvLyBSZXRyaWV2ZSBuYXRpdmVfaGFuZGxlIGZyb20gdGhlIHBhcmNlbC4gVGhpcyByZXR1cm5zIGEgY29weSBvZiB0aGUKICAgICAvLyBwYXJjZWwncyBuYXRpdmVfaGFuZGxlICh0aGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcCkuIFRoZSBjYWxsZXIKICAgICAvLyBtdXN0IGZyZWUgdGhlIG5hdGl2ZV9oYW5kbGUgd2l0aCBuYXRpdmVfaGFuZGxlX2Nsb3NlKCkgYW5kIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCmluZGV4IDY2NjcwZjMuLmU5ZmY4YTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKQEAgLTMwNywyOSArMzA3LDE4IEBACiAgICAgICAgICAgICBpbnQzMl90ICAgICBwcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIG1Qcmlvcml0eTsgfQogCiAKLSAgICAvKiBFbmFibGVzIHRoZSBlZmZlY3QgZW5naW5lLgorICAgIC8qIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGVmZmVjdCBlbmdpbmUuCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqICAgICAgTm9uZS4KKyAgICAgKiAgZW5hYmxlZDogcmVxdWVzdGVkIGVuYWJsZSBzdGF0ZS4KICAgICAgKgogICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbgotICAgICAqICAtIElOVkFMSURfT1BFUkFUSU9OOiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZSBjb250cm9sIG9mIHRoZSBlZmZlY3QgZW5naW5lCisgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUgb3IgdGhlCisgICAgICogIGVmZmVjdCBpcyBhbHJlYWR5IGluIHRoZSByZXF1ZXN0ZWQgc3RhdGUuCiAgICAgICovCi0gICAgICAgICAgICBzdGF0dXNfdCAgICBlbmFibGUoKTsKLQotICAgIC8qIERpc2FibGVzIHRoZSBlZmZlY3QgZW5naW5lLgotICAgICAqCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgIE5vbmUuCi0gICAgICoKLSAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKLSAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KLSAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgY29udHJvbCBvZiB0aGUgZWZmZWN0IGVuZ2luZQotICAgICAqLwotICAgICAgICAgICAgIHN0YXR1c190ICAgIGRpc2FibGUoKTsKLQotICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRW5hYmxlZCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOworICAgICAgICAgICAgYm9vbCAgICAgICAgZ2V0RW5hYmxlZCgpIGNvbnN0OwogCiAgICAgLyogU2V0cyBhIHBhcmFtZXRlciB2YWx1ZS4KICAgICAgKgpAQCAtMzQyLDcgKzMzMSw3IEBACiAgICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlciBpZGVudGlmaWVyIG9yIHZhbHVlLgogICAgICAqICAtIERFQURfT0JKRUNUOiB0aGUgZWZmZWN0IGVuZ2luZSBoYXMgYmVlbiBkZWxldGVkLgogICAgICAqLwotICAgICAgICAgICAgIHN0YXR1c190ICAgc2V0UGFyYW1ldGVyKGVmZmVjdF9wYXJhbV90ICpwYXJhbSk7CisgICAgIHZpcnR1YWwgc3RhdHVzX3QgICBzZXRQYXJhbWV0ZXIoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKTsKIAogICAgIC8qIFByZXBhcmUgYSBuZXcgcGFyYW1ldGVyIHZhbHVlIHRoYXQgd2lsbCBiZSBzZXQgYnkgbmV4dCBjYWxsIHRvCiAgICAgICogc2V0UGFyYW1ldGVyQ29tbWl0KCkuIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNldCBtdWx0aXBsZSBwYXJhbWV0ZXJzCkBAIC0zNTksNyArMzQ4LDcgQEAKICAgICAgKiAgLSBOT19NRU1PUlk6IG5vIG1vcmUgc3BhY2UgYXZhaWxhYmxlIGluIHNoYXJlZCBtZW1vcnkgdXNlZCBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyCiAgICAgICogIHNldHRpbmcuCiAgICAgICovCi0gICAgICAgICAgICAgc3RhdHVzX3QgICBzZXRQYXJhbWV0ZXJEZWZlcnJlZChlZmZlY3RfcGFyYW1fdCAqcGFyYW0pOworICAgICB2aXJ0dWFsIHN0YXR1c190ICAgc2V0UGFyYW1ldGVyRGVmZXJyZWQoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKTsKIAogICAgICAvKiBDb21taXQgYWxsIHBhcmFtZXRlciB2YWx1ZXMgcHJldmlvdXNseSBwcmVwYXJlZCBieSBzZXRQYXJhbWV0ZXJEZWZlcnJlZCgpLgogICAgICAgKgpAQCAtMzczLDcgKzM2Miw3IEBACiAgICAgICAqICAgICBhcyB0byB3aGljaCBvZiB0aGUgcGFyYW1ldGVycyBjYXVzZWQgdGhpcyBlcnJvci4KICAgICAgICogIC0gREVBRF9PQkpFQ1Q6IHRoZSBlZmZlY3QgZW5naW5lIGhhcyBiZWVuIGRlbGV0ZWQuCiAgICAgICAqLwotICAgICAgICAgICAgIHN0YXR1c190ICAgc2V0UGFyYW1ldGVyQ29tbWl0KCk7CisgICAgIHZpcnR1YWwgc3RhdHVzX3QgICBzZXRQYXJhbWV0ZXJDb21taXQoKTsKIAogICAgIC8qIEdldHMgYSBwYXJhbWV0ZXIgdmFsdWUuCiAgICAgICoKQEAgLTM4NywxMyArMzc2LDE3IEBACiAgICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlciBpZGVudGlmaWVyLgogICAgICAqICAtIERFQURfT0JKRUNUOiB0aGUgZWZmZWN0IGVuZ2luZSBoYXMgYmVlbiBkZWxldGVkLgogICAgICAqLwotICAgICAgICAgICAgIHN0YXR1c190ICAgZ2V0UGFyYW1ldGVyKGVmZmVjdF9wYXJhbV90ICpwYXJhbSk7CisgICAgIHZpcnR1YWwgc3RhdHVzX3QgICBnZXRQYXJhbWV0ZXIoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKTsKIAogICAgICAvKiBTZW5kcyBhIGNvbW1hbmQgYW5kIHJlY2VpdmVzIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgogICAgICAgKiAgICAgU2VlIEVmZmVjdEFwaS5oIGZvciBkZXRhaWxzIG9uIGVmZmVjdCBjb21tYW5kKCkgZnVuY3Rpb24sIHZhbGlkIGNvbW1hbmQgY29kZXMKICAgICAgICogICAgIGFuZCBmb3JtYXRzLgogICAgICAgKi8KLSAgICAgICAgICAgICBzdGF0dXNfdCBjb21tYW5kKGludDMyX3QgY21kQ29kZSwgaW50MzJfdCBjbWRTaXplLCB2b2lkICpjbWREYXRhLCBpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnJlcGx5RGF0YSk7CisgICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZChpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVwbHlEYXRhKTsKIAogCiAgICAgIC8qCkBAIC00MDksNiArNDAyLDE3IEBACiAgICAgICAqLwogICAgICBzdGF0aWMgc3RhdHVzX3QgZ3VpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKmd1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbik7CiAKK3Byb3RlY3RlZDoKKyAgICAgdm9sYXRpbGUgaW50MzJfdCAgICAgICAgbUVuYWJsZWQ7ICAgICAgICAgICAvLyBlbmFibGUgc3RhdGUKKyAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1Qcmlvcml0eTsgICAgICAgICAgLy8gcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sCisgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7ICAgICAgICAgICAgLy8gZWZmZWN0IHN0YXR1cworICAgICBlZmZlY3RfY2FsbGJhY2tfdCAgICAgICBtQ2JmOyAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBzdGF0dXMsIGNvbnRyb2wgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIGNoYW5nZXMgbm90aWZpY2F0aW9ucworICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtVXNlckRhdGE7ICAgICAgICAgIC8vIGNsaWVudCBjb250ZXh0IGZvciBjYWxsYmFjayBmdW5jdGlvbgorICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICAgICBtRGVzY3JpcHRvcjsgICAgICAgIC8vIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1JZDsgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHdpZGUgdW5pcXVlIGVmZmVjdCBlbmdpbmUgaW5zdGFuY2UgSUQKKwogcHJpdmF0ZToKIAogICAgICAvLyBJbXBsZW1lbnRzIHRoZSBJRWZmZWN0Q2xpZW50IGludGVyZmFjZQpAQCAtNDE5LDkgKzQyMywxNyBAQAogICAgICAgICBFZmZlY3RDbGllbnQoQXVkaW9FZmZlY3QgKmVmZmVjdCkgOiBtRWZmZWN0KGVmZmVjdCl7fQogCiAgICAgICAgIC8vIElFZmZlY3RDbGllbnQKLSAgICAgICAgdmlydHVhbCB2b2lkIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpIHttRWZmZWN0LT5jb250cm9sU3RhdHVzQ2hhbmdlZChjb250cm9sR3JhbnRlZCk7fQotICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlU3RhdHVzQ2hhbmdlZChib29sIGVuYWJsZWQpIHttRWZmZWN0LT5lbmFibGVTdGF0dXNDaGFuZ2VkKGVuYWJsZWQpO30KLSAgICAgICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZChpbnQgY21kQ29kZSwgaW50IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCBpbnQgcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKSB7CisgICAgICAgICAgICBtRWZmZWN0LT5jb250cm9sU3RhdHVzQ2hhbmdlZChjb250cm9sR3JhbnRlZCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIGVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBlbmFibGVkKSB7CisgICAgICAgICAgICBtRWZmZWN0LT5lbmFibGVTdGF0dXNDaGFuZ2VkKGVuYWJsZWQpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBjb21tYW5kRXhlY3V0ZWQoaW50IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKSB7CiAgICAgICAgICAgICBtRWZmZWN0LT5jb21tYW5kRXhlY3V0ZWQoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CiAgICAgICAgIH0KIApAQCAtNDQ2LDE0ICs0NTgsNiBAQAogICAgIHNwPEVmZmVjdENsaWVudD4gICAgICAgIG1JRWZmZWN0Q2xpZW50OyAgICAgLy8gSUVmZmVjdENsaWVudCBpbXBsZW1lbnRhdGlvbgogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OyAgICAgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKICAgICBlZmZlY3RfcGFyYW1fY2Jsa190KiAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIGRlZmVycmVkIHBhcmFtZXRlciBzZXR0aW5nCi0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVByaW9yaXR5OyAgICAgICAgICAvLyBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2wKLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtU3RhdHVzOyAgICAgICAgICAgIC8vIGVmZmVjdCBzdGF0dXMKLSAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICBtRW5hYmxlZDsgICAgICAgICAgIC8vIGVuYWJsZSBzdGF0ZQotICAgIGVmZmVjdF9jYWxsYmFja190ICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHN0YXR1cywgY29udHJvbCwgcGFyYW1ldGVyIGNoYW5nZXMgbm90aWZpY2F0aW9ucwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YTsgICAgICAgICAgLy8gY2xpZW50IGNvbnRleHQgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAgICAgbURlc2NyaXB0b3I7ICAgICAgICAvLyBlZmZlY3QgZGVzY3JpcHRvcgotICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1JZDsgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHdpZGUgdW5pcXVlIGVmZmVjdCBlbmdpbmUgaW5zdGFuY2UgaWRlbnRpZmllcgotICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7ICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdEFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RBcGkuaAppbmRleCBiNGQ3MzhjLi45ZjNkMGI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0VmZmVjdEFwaS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QXBpLmgKQEAgLTIyMyw2ICsyMjMsMTEgQEAKIC8vICAgICAgICAgIHNhbXBsZXMgYXMgc3BlY2lmaWVkIGluIG91dHB1dCBidWZmZXIgZGVzY3JpcHRvci4gSWYgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yCiAvLyAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkIHRoZSBmdW5jdGlvbiBtdXN0IHVzZSBlaXRoZXIgdGhlIGJ1ZmZlciBvciB0aGUKIC8vICAgICAgICAgIGJ1ZmZlciBwcm92aWRlciBmdW5jdGlvbiBpbnN0YWxsZWQgYnkgdGhlIEVGRkVDVF9DTURfQ09ORklHVVJFIGNvbW1hbmQuCisvLyAgICAgICAgICBUaGUgZWZmZWN0IGZyYW1ld29yayB3aWxsIGNhbGwgdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBhZnRlciB0aGUgRUZGRUNUX0NNRF9FTkFCTEUKKy8vICAgICAgICAgIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIHVudGlsIHRoZSBFRkZFQ1RfQ01EX0RJU0FCTEUgaXMgcmVjZWl2ZWQuIFdoZW4gdGhlIGVuZ2luZQorLy8gICAgICAgICAgcmVjZWl2ZXMgdGhlIEVGRkVDVF9DTURfRElTQUJMRSBjb21tYW5kIGl0IHNob3VsZCB0dXJuIG9mZiB0aGUgZWZmZWN0IGdyYWNlZnVsbHkKKy8vICAgICAgICAgIGFuZCB3aGVuIGRvbmUgaW5kaWNhdGUgdGhhdCBpdCBpcyBPSyB0byBzdG9wIGNhbGxpbmcgdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBieQorLy8gICAgICAgICAgcmV0dXJuaW5nIHRoZSAtRU5PREFUQSBzdGF0dXMuCiAvLwogLy8gICAgTk9URTogdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgInJlYWwtdGltZSBzYWZlIiB0aGF0IGlzCiAvLyAgICAgIGl0IHNob3VsZCBub3QgcGVyZm9ybSBibG9ja2luZyBjYWxsczogbWFsbG9jL2ZyZWUsIHNsZWVwLCByZWFkL3dyaXRlL29wZW4vY2xvc2UsCkBAIC0yMzksNiArMjQ0LDggQEAKIC8vCiAvLyAgICBPdXRwdXQ6CiAvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREFUQSB0aGUgZW5naW5lIGhhcyBmaW5pc2hlZCB0aGUgZGlzYWJsZSBwaGFzZSBhbmQgdGhlIGZyYW1ld29yaworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIHN0b3AgY2FsbGluZyBwcm9jZXNzKCkKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZSBvcgogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBpbnB1dC9vdXRwdXQgYnVmZmVyIGRlc2NyaXB0aW9uCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RCYXNzQm9vc3RBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0YTVmNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RCQVNTQk9PU1RBUElfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RCQVNTQk9PU1RBUElfSF8KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFRPRE86IGluY2x1ZGUgT3BlblNMRVNfSUlELmggaW5zdGVhZAorc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX0JBU1NCT09TVF8gPSB7IDB4MDYzNGYyMjAsIDB4ZGRkNCwgMHgxMWRiLCAweGEwZmMsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07Citjb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX0JBU1NCT09TVCA9ICZTTF9JSURfQkFTU0JPT1NUXzsKKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIEJhc3NCb29zdCBlZmZlY3QgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQsCisgICAgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RICit9IHRfYmFzc2Jvb3N0X3BhcmFtczsKKworI2lmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworCisjZW5kaWYgLypBTkRST0lEX0VGRkVDVEJBU1NCT09TVEFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFJldmVyYkFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmgKc2ltaWxhcml0eSBpbmRleCA3OSUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9FZmZlY3RSZXZlcmJBcGkuaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmgKaW5kZXggNjM3MWFkYi4uZDQ5MGY3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RSZXZlcmJBcGkuaAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdEVudmlyb25tZW50YWxSZXZlcmJBcGkuaApAQCAtMTQsOCArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBBTkRST0lEX0VGRkVDVFJFVkVSQkFQSV9IXwotI2RlZmluZSBBTkRST0lEX0VGRkVDVFJFVkVSQkFQSV9IXworI2lmbmRlZiBBTkRST0lEX0VGRkVDVEVOVklST05NRU5UQUxSRVZFUkJBUElfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RFTlZJUk9OTUVOVEFMUkVWRVJCQVBJX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KIApAQCAtMjcsMTQgKzI3LDkgQEAKIHN0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCXyA9IHsgMHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgeyAweDRlLCAweDIzLCAweDRkLCAweDYsIDB4ODMsIDB4OWUgfSB9OwogY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCID0gJlNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCXzsKIAotc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1BSRVNFVFJFVkVSQl8gPSB7IDB4NDczODJkNjAsIDB4ZGRkOCwgMHgxMWRiLCAweGJmM2EsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07Ci1jb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX1BSRVNFVFJFVkVSQiA9ICZTTF9JSURfUFJFU0VUUkVWRVJCXzsKLQotLyogZW51bWVyYXRlZCBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIFJldmVyYiBlZmZlY3QgKi8KKy8qIGVudW1lcmF0ZWQgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBlbnZpcm9ubWVudGFsIHJldmVyYiBlZmZlY3QgKi8KIHR5cGVkZWYgZW51bQogewotICAgIFJFVkVSQl9QQVJBTV9CWVBBU1MsCi0gICAgUkVWRVJCX1BBUkFNX1BSRVNFVCwKICAgICAvLyBQYXJhbWV0ZXJzIGJlbG93IGFyZSBhcyBkZWZpbmVkIGluIE9wZW5TTCBFUyBzcGVjaWZpY2F0aW9uIGZvciBlbnZpcm9ubWVudGFsIHJldmVyYiBpbnRlcmZhY2UKICAgICBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCwgICAgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC02MDAwIHRvIDAKICAgICBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC00MDAwIHRvIDAKQEAgLTQ2LDE3ICs0MSw5IEBACiAgICAgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWSwgICAgICAgICAgLy8gaW4gbWlsbGlzZWNvbmRzLCByYW5nZSAwIHRvIDY1CiAgICAgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTiwgICAgICAgICAgICAgLy8gaW4gcGVybWlsbGVzLCAgICByYW5nZSAwIHRvIDEwMDAKICAgICBSRVZFUkJfUEFSQU1fREVOU0lUWSwgICAgICAgICAgICAgICAvLyBpbiBwZXJtaWxsZXMsICAgIHJhbmdlIDAgdG8gMTAwMAotICAgIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTCi19IHRfcmV2ZXJiX3BhcmFtczsKLQotCi10eXBlZGVmIGVudW0KLXsKLSAgICBSRVZFUkJfUFJFU0VUX0xBUkdFX0hBTEwsCi0gICAgUkVWRVJCX1BSRVNFVF9IQUxMLAotICAgIFJFVkVSQl9QUkVTRVRfQ0hBTUJFUiwKLSAgICBSRVZFUkJfUFJFU0VUX1JPT00sCi19IHRfcmV2ZXJiX3ByZXNldHM7CisgICAgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMsCisgICAgUkVWRVJCX1BBUkFNX0JZUEFTUworfSB0X2Vudl9yZXZlcmJfcGFyYW1zOwogCiAvL3RfcmV2ZXJiX3Byb3BlcnRpZXMgaXMgZXF1YWwgdG8gU0xFbnZpcm9ubWVudGFsUmV2ZXJiU2V0dGluZ3MgZGVmaW5lZCBpbiBPcGVuU0wgRVMgc3BlY2lmaWNhdGlvbi4KIHR5cGVkZWYgc3RydWN0IHNfcmV2ZXJiX3Byb3BlcnRpZXMgewpAQCAtNzksNCArNjYsNCBAQAogI2VuZGlmCiAKIAotI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RSRVZFUkJBUElfSF8qLworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RFTlZJUk9OTUVOVEFMUkVWRVJCQVBJX0hfKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0UHJlc2V0UmV2ZXJiQXBpLmggYi9pbmNsdWRlL21lZGlhL0VmZmVjdFByZXNldFJldmVyYkFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmZmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdFByZXNldFJldmVyYkFwaS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUUFJFU0VUUkVWRVJCQVBJX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNUUFJFU0VUUkVWRVJCQVBJX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBUT0RPOiBpbmNsdWRlIE9wZW5TTEVTX0lJRC5oIGluc3RlYWQKKworc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1BSRVNFVFJFVkVSQl8gPSB7IDB4NDczODJkNjAsIDB4ZGRkOCwgMHgxMWRiLCAweGJmM2EsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07Citjb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX1BSRVNFVFJFVkVSQiA9ICZTTF9JSURfUFJFU0VUUkVWRVJCXzsKKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIHByZXNldCByZXZlcmIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBSRVZFUkJfUEFSQU1fUFJFU0VUCit9IHRfcHJlc2V0X3JldmVyYl9wYXJhbXM7CisKKwordHlwZWRlZiBlbnVtCit7CisgICAgUkVWRVJCX1BSRVNFVF9OT05FLAorICAgIFJFVkVSQl9QUkVTRVRfU01BTExST09NLAorICAgIFJFVkVSQl9QUkVTRVRfTUVESVVNUk9PTSwKKyAgICBSRVZFUkJfUFJFU0VUX0xBUkdFUk9PTSwKKyAgICBSRVZFUkJfUFJFU0VUX01FRElVTUhBTEwsCisgICAgUkVWRVJCX1BSRVNFVF9MQVJHRUhBTEwsCisgICAgUkVWRVJCX1BSRVNFVF9QTEFURQorfSB0X3JldmVyYl9wcmVzZXRzOworCisjaWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisKKyNlbmRpZiAvKkFORFJPSURfRUZGRUNUUFJFU0VUUkVWRVJCQVBJX0hfKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlydHVhbGl6ZXJBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlydHVhbGl6ZXJBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFjMzg0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXJ0dWFsaXplckFwaS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUVklSVFVBTElaRVJBUElfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RWSVJUVUFMSVpFUkFQSV9IXworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gVE9ETzogaW5jbHVkZSBPcGVuU0xFU19JSUQuaCBpbnN0ZWFkCitzdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBTTF9JSURfVklSVFVBTElaRVJfID0geyAweDM3Y2MyYzAwLCAweGRkZGQsIDB4MTFkYiwgMHg4NTc3LCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9OworY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9WSVJUVUFMSVpFUiA9ICZTTF9JSURfVklSVFVBTElaRVJfOworCisvKiBlbnVtZXJhdGVkIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgdmlydHVhbGl6ZXIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQsCisgICAgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEgKK30gdF92aXJ0dWFsaXplcl9wYXJhbXM7CisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RWSVJUVUFMSVpFUkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNTVkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFZJU1VBTElaRVJBUElfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RWSVNVQUxJWkVSQVBJX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvL1RPRE8gcmVwbGFjZSBieSBvcGVuU0wgRVMgaW5jbHVkZSB3aGVuIGF2YWlsYWJsZQorc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1ZJU1VBTElaQVRJT05fID0KKyAgICB7IDB4ZTQ2YjI2YTAsIDB4ZGRkZCwgMHgxMWRiLCAweDhhZmQsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07Citjb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX1ZJU1VBTElaQVRJT04gPSAmU0xfSUlEX1ZJU1VBTElaQVRJT05fOworCisjZGVmaW5lIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWCAxMDI0ICAvLyBtYXhpbXVtIGNhcHR1cmUgc2l6ZSBpbiBzYW1wbGVzCisjZGVmaW5lIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01JTiAxMjggICAvLyBtaW5pbXVtIGNhcHR1cmUgc2l6ZSBpbiBzYW1wbGVzCisKKy8qIGVudW1lcmF0ZWQgcGFyYW1ldGVycyBmb3IgVmlzdWFsaXplciBlZmZlY3QgKi8KK3R5cGVkZWYgZW51bQoreworICAgIFZJU1VfUEFSQU1fQ0FQVFVSRV9TSVpFLCAgICAgICAgLy8gU2V0cyB0aGUgbnVtYmVyIFBDTSBzYW1wbGVzIGluIHRoZSBjYXB0dXJlLgorfSB0X3Zpc3VhbGl6ZXJfcGFyYW1zOworCisvKiBjb21tYW5kcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgVklTVV9DTURfQ0FQVFVSRSA9IEVGRkVDVF9DTURfRklSU1RfUFJPUFJJRVRBUlksIC8vIEdldHMgdGhlIGxhdGVzdCBQQ00gY2FwdHVyZS4KK310X3Zpc3VhbGl6ZXJfY21kczsKKworLy8gVklTVV9DTURfQ0FQVFVSRSByZXRyaWV2ZXMgdGhlIGxhdGVzdCBQQ00gc25hcHNob3QgY2FwdHVyZWQgYnkgdGhlIHZpc3VhbGl6ZXIgZW5naW5lLgorLy8gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgc3BlY2lmaWVkIGJ5IFZJU1VfUEFSQU1fQ0FQVFVSRV9TSVpFCisvLyBpbiA4IGJpdCB1bnNpZ25lZCBmb3JtYXQgKDAgPSAweDgwKQorCisjaWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisKKyNlbmRpZiAvKkFORFJPSURfRUZGRUNUVklTVUFMSVpFUkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IGU4OTI4NzUuLjk0MTZjYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCkBAIC00OCwxMCArNDgsNiBAQAogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLCBpbnQqIHBGb3JtYXQpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICAgICAgZGVjb2RlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLCBpbnQqIHBGb3JtYXQpID0gMDsKICAgICB2aXJ0dWFsIHNwPElPTVg+ICAgICAgICAgICAgZ2V0T01YKCkgPSAwOwotCi0gICAgLy8gVGFrZSBhIHBlZWsgYXQgY3VycmVudGx5IHBsYXlpbmcgYXVkaW8sIGZvciB2aXN1YWxpemF0aW9uIHB1cnBvc2VzLgotICAgIC8vIFRoaXMgcmV0dXJucyBhIGJ1ZmZlciBvZiAxNiBiaXQgbW9ubyBQQ00gZGF0YSwgb3IgTlVMTCBpZiBubyB2aXN1YWxpemF0aW9uIGJ1ZmZlciBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLgotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICBzbm9vcCgpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggYTRlZWEyYS4uYzNjZDM2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTQ4LDggKzQ4LDggQEAKICAgICBzdGF0aWMgTWVkaWFQcm9maWxlcyogZ2V0SW5zdGFuY2UoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcGFyYW0gbmFtZSBhdCB0aGUgZ2l2ZW4gcXVhbGl0eSBsZXZlbCwKLSAgICAgKiBvciAtMSBpZiBlcnJvci4KKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHBhcmFtIG5hbWUgZm9yIHRoZSBnaXZlbiBjYW1lcmEgYXQKKyAgICAgKiB0aGUgZ2l2ZW4gcXVhbGl0eSBsZXZlbCwgb3IgLTEgaWYgZXJyb3IuCiAgICAgICoKICAgICAgKiBTdXBwb3J0ZWQgcGFyYW0gbmFtZSBhcmU6CiAgICAgICogZHVyYXRpb24gLSB0aGUgcmVjb3JkaW5nIGR1cmF0aW9uLgpAQCAtNjQsNyArNjQsOCBAQAogICAgICAqIGF1ZC5oeiAtIGF1ZGlvIHNhbXBsZSByYXRlCiAgICAgICogYXVkLmNoIC0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCiAgICAgICovCi0gICAgaW50IGdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lLCBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdDsKKyAgICBpbnQgZ2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb3V0cHV0IGZpbGUgZm9ybWF0cyBzdXBwb3J0ZWQuCkBAIC0xMjQsMTIgKzEyNSw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGltYWdlIGVuY29kaW5nIHF1YWxpdHkgbGV2ZWxzIHN1cHBvcnRlZC4KICAgICAgKi8KLSAgICBWZWN0b3I8aW50PiBnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscygpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IGluIGJ5dGVzIHdlIGNhbiB1c2UgZm9yIGRlY29kaW5nIGEgSlBFRyBmaWxlLgotICAgICAqLwotICAgIGludCBnZXRJbWFnZURlY29kaW5nTWF4TWVtb3J5KCkgY29uc3Q7CisgICAgVmVjdG9yPGludD4gZ2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoaW50IGNhbWVyYUlkKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBNZWRpYVByb2ZpbGVzJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFQcm9maWxlcyYpOyAgLy8gRG9uJ3QgY2FsbCBtZQpAQCAtMTcxLDcgKzE2Nyw4IEBACiAKICAgICBzdHJ1Y3QgQ2FtY29yZGVyUHJvZmlsZSB7CiAgICAgICAgIENhbWNvcmRlclByb2ZpbGUoKQotICAgICAgICAgICAgOiBtRmlsZUZvcm1hdChPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCksCisgICAgICAgICAgICA6IG1DYW1lcmFJZCgwKSwKKyAgICAgICAgICAgICAgbUZpbGVGb3JtYXQoT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFApLAogICAgICAgICAgICAgICBtUXVhbGl0eShDQU1DT1JERVJfUVVBTElUWV9ISUdIKSwKICAgICAgICAgICAgICAgbUR1cmF0aW9uKDApLAogICAgICAgICAgICAgICBtVmlkZW9Db2RlYygwKSwKQEAgLTE4Miw2ICsxNzksNyBAQAogICAgICAgICAgICAgZGVsZXRlIG1BdWRpb0NvZGVjOwogICAgICAgICB9CiAKKyAgICAgICAgaW50IG1DYW1lcmFJZDsKICAgICAgICAgb3V0cHV0X2Zvcm1hdCBtRmlsZUZvcm1hdDsKICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgbVF1YWxpdHk7CiAgICAgICAgIGludCBtRHVyYXRpb247CkBAIC0yNDksNiArMjQ3LDExIEBACiAgICAgICAgIGludCB0YWc7CiAgICAgfTsKIAorICAgIHN0cnVjdCBJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyB7CisgICAgICAgIGludCBtQ2FtZXJhSWQ7CisgICAgICAgIFZlY3RvcjxpbnQ+IG1MZXZlbHM7CisgICAgfTsKKwogICAgIC8vIERlYnVnCiAgICAgc3RhdGljIHZvaWQgbG9nVmlkZW9Db2RlYyhjb25zdCBWaWRlb0NvZGVjJiBjb2RlYyk7CiAgICAgc3RhdGljIHZvaWQgbG9nQXVkaW9Db2RlYyhjb25zdCBBdWRpb0NvZGVjJiBjb2RlYyk7CkBAIC0yNjcsOSArMjcwLDExIEBACiAgICAgc3RhdGljIFZpZGVvRGVjb2RlckNhcCogY3JlYXRlVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKTsKICAgICBzdGF0aWMgVmlkZW9FbmNvZGVyQ2FwKiBjcmVhdGVWaWRlb0VuY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMpOwogICAgIHN0YXRpYyBBdWRpb0VuY29kZXJDYXAqIGNyZWF0ZUF1ZGlvRW5jb2RlckNhcChjb25zdCBjaGFyICoqYXR0cyk7Ci0gICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUqIGNyZWF0ZUNhbWNvcmRlclByb2ZpbGUoY29uc3QgY2hhciAqKmF0dHMpOwotICAgIHN0YXRpYyBpbnQgZ2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChjb25zdCBjaGFyICoqYXR0cyk7Ci0gICAgc3RhdGljIGludCBnZXRJbWFnZURlY29kaW5nTWF4TWVtb3J5KGNvbnN0IGNoYXIgKiphdHRzKTsKKyAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSogY3JlYXRlQ2FtY29yZGVyUHJvZmlsZShpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIgKiphdHRzKTsKKyAgICBzdGF0aWMgaW50IGdldENhbWVyYUlkKGNvbnN0IGNoYXIgKiphdHRzKTsKKworICAgIEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKiBmaW5kSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoaW50IGNhbWVyYUlkKSBjb25zdDsKKyAgICB2b2lkIGFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyKiogYXR0cyk7CiAKICAgICAvLyBDdXN0b21pemVkIGVsZW1lbnQgdGFnIGhhbmRsZXIgZm9yIHBhcnNpbmcgdGhlIHhtbCBjb25maWd1cmF0aW9uIGZpbGUuCiAgICAgc3RhdGljIHZvaWQgc3RhcnRFbGVtZW50SGFuZGxlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHMpOwpAQCAtMzAzLDYgKzMwOCw3IEBACiAgICAgc3RhdGljIGJvb2wgc0lzSW5pdGlhbGl6ZWQ7CiAgICAgc3RhdGljIE1lZGlhUHJvZmlsZXMgKnNJbnN0YW5jZTsKICAgICBzdGF0aWMgTXV0ZXggc0xvY2s7CisgICAgaW50IG1DdXJyZW50Q2FtZXJhSWQ7CiAKICAgICBWZWN0b3I8Q2FtY29yZGVyUHJvZmlsZSo+IG1DYW1jb3JkZXJQcm9maWxlczsKICAgICBWZWN0b3I8QXVkaW9FbmNvZGVyQ2FwKj4gIG1BdWRpb0VuY29kZXJzOwpAQCAtMzEwLDggKzMxNiw3IEBACiAgICAgVmVjdG9yPEF1ZGlvRGVjb2RlckNhcCo+ICBtQXVkaW9EZWNvZGVyczsKICAgICBWZWN0b3I8VmlkZW9EZWNvZGVyQ2FwKj4gIG1WaWRlb0RlY29kZXJzOwogICAgIFZlY3RvcjxvdXRwdXRfZm9ybWF0PiAgICAgbUVuY29kZXJPdXRwdXRGaWxlRm9ybWF0czsKLSAgICBWZWN0b3I8aW50PiAgICAgICAgICAgICAgIG1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsczsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIG1JbWFnZURlY29kaW5nTWF4TWVtb3J5OworICAgIFZlY3RvcjxJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyAqPiAgbUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCA0OTc5NjVjLi41ZTllMzY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC00OCw2ICs0OCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4QW1wbGl0dWRlKGludCAqbWF4KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgPSAwOwogCiBwcml2YXRlOgogICAgIE1lZGlhUmVjb3JkZXJCYXNlKGNvbnN0IE1lZGlhUmVjb3JkZXJCYXNlICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmgKaW5kZXggYzA0MTA1ZS4uZjc1ZDgwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1BWTWVkaWFSZWNvcmRlci5oCkBAIC01Miw2ICs1Miw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heEFtcGxpdHVkZShpbnQgKm1heCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3QgZG9TdG9wKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaCBiL2luY2x1ZGUvbWVkaWEvVmlzdWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTFkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9WSVNVQUxJWkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9WSVNVQUxJWkVSX0gKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyAqIFRoZSBWaXN1YWxpemVyIGNsYXNzIGVuYWJsZXMgYXBwbGljYXRpb24gdG8gcmV0cmlldmUgcGFydCBvZiB0aGUgY3VycmVudGx5IHBsYXlpbmcgYXVkaW8gZm9yCisgKiB2aXN1YWxpemF0aW9uIHB1cnBvc2UuIEl0IGlzIG5vdCBhbiBhdWRpbyByZWNvcmRpbmcgaW50ZXJmYWNlIGFuZCBvbmx5IHJldHVybnMgcGFydGlhbCBhbmQgbG93CisgKiBxdWFsaXR5IGF1ZGlvIGNvbnRlbnQuIEhvd2V2ZXIsIHRvIHByb3RlY3QgcHJpdmFjeSBvZiBjZXJ0YWluIGF1ZGlvIGRhdGEgKGUuZyB2b2ljZSBtYWlsKSB0aGUgdXNlCisgKiBvZiB0aGUgdmlzdWFsaXplciByZXF1aXJlcyB0aGUgcGVybWlzc2lvbiBhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLgorICogVGhlIGF1ZGlvIHNlc3Npb24gSUQgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBpbmRpY2F0ZXMgd2hpY2ggYXVkaW8gY29udGVudCBzaG91bGQgYmUKKyAqIHZpc3VhbGl6ZWQ6CisgKiAtIElmIHRoZSBzZXNzaW9uIGlzIDAsIHRoZSBhdWRpbyBvdXRwdXQgbWl4IGlzIHZpc3VhbGl6ZWQKKyAqIC0gSWYgdGhlIHNlc3Npb24gaXMgbm90IDAsIHRoZSBhdWRpbyBmcm9tIGEgcGFydGljdWxhciBNZWRpYVBsYXllciBvciBBdWRpb1RyYWNrCisgKiAgIHVzaW5nIHRoaXMgYXVkaW8gc2Vzc2lvbiBpcyB2aXN1YWxpemVkCisgKiBUd28gdHlwZXMgb2YgcmVwcmVzZW50YXRpb24gb2YgYXVkaW8gY29udGVudCBjYW4gYmUgY2FwdHVyZWQ6CisgKiAtIFdhdmVmb3JtIGRhdGE6IGNvbnNlY3V0aXZlIDgtYml0ICh1bnNpZ25lZCkgbW9ubyBzYW1wbGVzIGJ5IHVzaW5nIHRoZSBnZXRXYXZlRm9ybSgpIG1ldGhvZAorICogLSBGcmVxdWVuY3kgZGF0YTogOC1iaXQgbWFnbml0dWRlIEZGVCBieSB1c2luZyB0aGUgZ2V0RmZ0KCkgbWV0aG9kCisgKgorICogVGhlIGxlbmd0aCBvZiB0aGUgY2FwdHVyZSBjYW4gYmUgcmV0cmlldmVkIG9yIHNwZWNpZmllZCBieSBjYWxsaW5nIHJlc3BlY3RpdmVseQorICogZ2V0Q2FwdHVyZVNpemUoKSBhbmQgc2V0Q2FwdHVyZVNpemUoKSBtZXRob2RzLiBOb3RlIHRoYXQgdGhlIHNpemUgb2YgdGhlIEZGVAorICogaXMgaGFsZiBvZiB0aGUgc3BlY2lmaWVkIGNhcHR1cmUgc2l6ZSBidXQgYm90aCBzaWRlcyBvZiB0aGUgc3BlY3RydW0gYXJlIHJldHVybmVkIHlpZWxkaW5nIGluIGEKKyAqIG51bWJlciBvZiBieXRlcyBlcXVhbCB0byB0aGUgY2FwdHVyZSBzaXplLiBUaGUgY2FwdHVyZSBzaXplIG11c3QgYmUgYSBwb3dlciBvZiAyIGluIHRoZSByYW5nZQorICogcmV0dXJuZWQgYnkgZ2V0TWluQ2FwdHVyZVNpemUoKSBhbmQgZ2V0TWF4Q2FwdHVyZVNpemUoKS4KKyAqIEluIGFkZGl0aW9uIHRvIHRoZSBwb2xsaW5nIGNhcHR1cmUgbW9kZSwgYSBjYWxsYmFjayBtb2RlIGlzIGFsc28gYXZhaWxhYmxlIGJ5IGluc3RhbGxpbmcgYQorICogY2FsbGJhY2sgZnVuY3Rpb24gYnkgdXNlIG9mIHRoZSBzZXRDYXB0dXJlQ2FsbEJhY2soKSBtZXRob2QuIFRoZSByYXRlIGF0IHdoaWNoIHRoZSBjYWxsYmFjaworICogaXMgY2FsbGVkIGFzIHdlbGwgYXMgdGhlIHR5cGUgb2YgZGF0YSByZXR1cm5lZCBpcyBzcGVjaWZpZWQuCisgKiBCZWZvcmUgY2FwdHVyaW5nIGRhdGEsIHRoZSBWaXN1YWxpemVyIG11c3QgYmUgZW5hYmxlZCBieSBjYWxsaW5nIHRoZSBzZXRFbmFibGVkKCkgbWV0aG9kLgorICogV2hlbiBkYXRhIGNhcHR1cmUgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSwgdGhlIFZpc3VhbGl6ZXIgc2hvdWxkIGJlIGRpc2FibGVkLgorICovCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFZpc3VhbGl6ZXI6IHB1YmxpYyBBdWRpb0VmZmVjdCB7CitwdWJsaWM6CisKKyAgICBlbnVtIGNhbGxiYWNrX2ZsYWdzIHsKKyAgICAgICAgQ0FQVFVSRV9XQVZFRk9STSA9IDB4MDAwMDAwMDEsICAvLyBjYXB0dXJlIGNhbGxiYWNrIHJldHVybnMgYSBQQ00gd2F2ZSBmb3JtCisgICAgICAgIENBUFRVUkVfRkZUID0gMHgwMDAwMDAwMiwgICAgICAgLy8gYXB0dXJlIGNhbGxiYWNrIHJldHVybnMgYSBmcmVxdWVuY3kgcmVwcmVzZW50YXRpb24KKyAgICAgICAgQ0FQVFVSRV9DQUxMX0pBVkEgPSAweDAwMDAwMDA0ICAvLyB0aGUgY2FsbGJhY2sgdGhyZWFkIGNhbiBjYWxsIGphdmEKKyAgICB9OworCisKKyAgICAvKiBDb25zdHJ1Y3Rvci4KKyAgICAgKiBTZWUgQXVkaW9FZmZlY3QgY29uc3RydWN0b3IgZm9yIGRldGFpbHMgb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFZpc3VhbGl6ZXIoaW50MzJfdCBwcmlvcml0eSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH5WaXN1YWxpemVyKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKworICAgIC8vIG1heGltdW0gY2FwdHVyZSBzaXplIGluIHNhbXBsZXMKKyAgICBzdGF0aWMgdWludDMyX3QgZ2V0TWF4Q2FwdHVyZVNpemUoKSB7IHJldHVybiBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVg7IH0KKyAgICAvLyBtaW5pbXVtIGNhcHR1cmUgc2l6ZSBpbiBzYW1wbGVzCisgICAgc3RhdGljIHVpbnQzMl90IGdldE1pbkNhcHR1cmVTaXplKCkgeyByZXR1cm4gVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUlOOyB9CisgICAgLy8gbWF4aW11bSBjYXB0dXJlIHJhdGUgaW4gbWlsbGloZXJ0egorICAgIHN0YXRpYyB1aW50MzJfdCBnZXRNYXhDYXB0dXJlUmF0ZSgpIHsgcmV0dXJuIENBUFRVUkVfUkFURV9NQVg7IH0KKworICAgIC8vIGNhbGxiYWNrIHVzZWQgdG8gcmV0dXJuIHBlcmlvZGljIFBDTSBvciBGRlQgY2FwdHVyZXMgdG8gdGhlIGFwcGxpY2F0aW9uLiBFaXRoZXIgb25lIG9yIGJvdGgKKyAgICAvLyB0eXBlcyBvZiBkYXRhIGFyZSByZXR1cm5lZCAoUENNIGFuZCBGRlQpIGFjY29yZGluZyB0byBmbGFncyBpbmRpY2F0ZWQgd2hlbiBpbnN0YWxsaW5nIHRoZQorICAgIC8vIGNhbGxiYWNrLiBXaGVuIGEgdHlwZSBvZiBkYXRhIGlzIG5vdCBwcmVzZW50LCB0aGUgY29ycmVzcG9uZGluZyBzaXplICh3YXZlZm9ybVNpemUgb3IKKyAgICAvLyBmZnRTaXplKSBpcyAwLgorICAgIHR5cGVkZWYgdm9pZCAoKmNhcHR1cmVfY2JrX3QpKHZvaWQqIHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3YXZlZm9ybVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp3YXZlZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZmdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpmZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ3JhdGUpOworCisgICAgLy8gaW5zdGFsbCBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgcGVyaW9kaWMgY2FwdHVyZXMuIFRoZSBjYXB0dXJlIHJhdGUgaXMgc3BlY2lmaWVkIGluIG1pbGxpSGVydHoKKyAgICAvLyBhbmQgdGhlIGNhcHR1cmUgZm9ybWF0IGlzIGFjY29yZGluZyB0byBmbGFncyAgKHNlZSBjYWxsYmFja19mbGFncykuCisgICAgc3RhdHVzX3Qgc2V0Q2FwdHVyZUNhbGxCYWNrKGNhcHR1cmVfY2JrX3QgY2JrLCB2b2lkKiB1c2VyLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgcmF0ZSk7CisKKyAgICAvLyBzZXQgdGhlIGNhcHR1cmUgc2l6ZSBjYXB0dXJlIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byBpbiB0aGUgcmFuZ2UKKyAgICAvLyBbVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYLiBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NSU5dCisgICAgLy8gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgdmlzdWFsaXplciBpcyBub3QgZW5hYmxlZAorICAgIHN0YXR1c190IHNldENhcHR1cmVTaXplKHVpbnQzMl90IHNpemUpOworICAgIHVpbnQzMl90IGdldENhcHR1cmVTaXplKCkgeyByZXR1cm4gbUNhcHR1cmVTaXplOyB9CisKKyAgICAvLyByZXR1cm5zIHRoZSBjYXB0dXJlIHJhdGUgaW5kaWNhdGVkIHdoZW4gaW5zdGFsbGluZyB0aGUgY2FsbGJhY2sKKyAgICB1aW50MzJfdCBnZXRDYXB0dXJlUmF0ZSgpIHsgcmV0dXJuIG1DYXB0dXJlUmF0ZTsgfQorCisgICAgLy8gcmV0dXJucyB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgYXVkaW8gYmVpbmcgY2FwdHVyZWQKKyAgICB1aW50MzJfdCBnZXRTYW1wbGluZ1JhdGUoKSB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQorCisgICAgLy8gcmV0dXJuIGEgY2FwdHVyZSBpbiBQQ00gOCBiaXQgdW5zaWduZWQgZm9ybWF0LiBUaGUgc2l6ZSBvZiB0aGUgY2FwdHVyZSBpcyBlcXVhbCB0bworICAgIC8vIGdldENhcHR1cmVTaXplKCkKKyAgICBzdGF0dXNfdCBnZXRXYXZlRm9ybSh1aW50OF90ICp3YXZlZm9ybSk7CisKKyAgICAvLyByZXR1cm4gYSBjYXB0dXJlIGluIEZGVCA4IGJpdCBzaWduZWQgZm9ybWF0LiBUaGUgc2l6ZSBvZiB0aGUgY2FwdHVyZSBpcyBlcXVhbCB0bworICAgIC8vIGdldENhcHR1cmVTaXplKCkgYnV0IHRoZSBsZW5ndGggb2YgdGhlIEZGVCBpcyBoYWxmIG9mIHRoZSBzaXplIChib3RoIHBhcnRzIG9mIHRoZSBzcGVjdHJ1bQorICAgIC8vIGFyZSByZXR1cm5lZAorICAgIHN0YXR1c190IGdldEZmdCh1aW50OF90ICpmZnQpOworCitwcml2YXRlOgorCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IENBUFRVUkVfUkFURV9NQVggPSAyMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgQ0FQVFVSRV9SQVRFX0RFRiA9IDEwMDAwOworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBDQVBUVVJFX1NJWkVfREVGID0gVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYOworCisgICAgLyogaW50ZXJuYWwgY2xhc3MgdG8gaGFuZGxlIHRoZSBjYWxsYmFjayAqLworICAgIGNsYXNzIENhcHR1cmVUaHJlYWQgOiBwdWJsaWMgVGhyZWFkCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgQ2FwdHVyZVRocmVhZChWaXN1YWxpemVyJiByZWNlaXZlciwgdWludDMyX3QgY2FwdHVyZVJhdGUsIGJvb2wgYkNhbkNhbGxKYXZhID0gZmFsc2UpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzIFZpc3VhbGl6ZXI7CisgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7CisgICAgICAgIFZpc3VhbGl6ZXImIG1SZWNlaXZlcjsKKyAgICAgICAgTXV0ZXggICAgICAgbUxvY2s7CisgICAgICAgIHVpbnQzMl90IG1TbGVlcFRpbWVVczsKKyAgICB9OworCisgICAgc3RhdHVzX3QgZG9GZnQodWludDhfdCAqZmZ0LCB1aW50OF90ICp3YXZlZm9ybSk7CisgICAgdm9pZCBwZXJpb2RpY0NhcHR1cmUoKTsKKyAgICB1aW50MzJfdCBpbml0Q2FwdHVyZVNpemUoKTsKKworICAgIE11dGV4IG1Mb2NrOworICAgIHVpbnQzMl90IG1DYXB0dXJlUmF0ZTsKKyAgICB1aW50MzJfdCBtQ2FwdHVyZVNpemU7CisgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgY2FwdHVyZV9jYmtfdCBtQ2FwdHVyZUNhbGxCYWNrOworICAgIHZvaWQgKm1DYXB0dXJlQ2JrVXNlcjsKKyAgICBzcDxDYXB0dXJlVGhyZWFkPiBtQ2FwdHVyZVRocmVhZDsKKyAgICB1aW50MzJfdCBtQ2FwdHVyZUZsYWdzOworICAgIHZvaWQgKm1GZnRUYWJsZTsKK307CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVklTVUFMSVpFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKaW5kZXggNjJhNGU1MC4uNDk2M2Y3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaApAQCAtMTY2LDcgKzE2Niw2IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0Mik7CiAgICAgc3RhdGljICBzcDxJTWVtb3J5PiAgICAgZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywgaW50KiBwRm9ybWF0KTsKICAgICBzdGF0aWMgIHNwPElNZW1vcnk+ICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCk7Ci0gICAgc3RhdGljICBpbnQgICAgICAgICAgICAgc25vb3Aoc2hvcnQgKmRhdGEsIGludCBsZW4sIGludCBraW5kKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBpbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRNZXRhZGF0YUZpbHRlcihjb25zdCBQYXJjZWwmIGZpbHRlcik7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0TWV0YWRhdGEoYm9vbCB1cGRhdGVfb25seSwgYm9vbCBhcHBseV9maWx0ZXIsIFBhcmNlbCAqbWV0YWRhdGEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggMzE5MmQwMy4uZmQzMGJhNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMzUsNiArMzUsMTAgQEAKICAgICBzdGF0aWMgQ2FtZXJhU291cmNlICpDcmVhdGUoKTsKICAgICBzdGF0aWMgQ2FtZXJhU291cmNlICpDcmVhdGVGcm9tQ2FtZXJhKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSk7CiAKKyAgICB2b2lkIGVuYWJsZVRpbWVMYXBzZU1vZGUoCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpOworICAgIHZvaWQgZGlzYWJsZVRpbWVMYXBzZU1vZGUoKTsKKwogICAgIHZpcnR1YWwgfkNhbWVyYVNvdXJjZSgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CkBAIC03MSw2ICs3NSwxNCBAQAogICAgIGJvb2wgbUNvbGxlY3RTdGF0czsKICAgICBib29sIG1TdGFydGVkOwogCisgICAgLy8gVGltZSBiZXR3ZWVuIGNhcHR1cmUgb2YgdHdvIGZyYW1lcyBkdXJpbmcgdGltZSBsYXBzZSByZWNvcmRpbmcKKyAgICAvLyBOZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aW1lbGFwc2UgaXMgZGlzYWJsZWQuCisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKKyAgICAvLyBUaW1lIGJldHdlZW4gdHdvIGZyYW1lcyBpbiBmaW5hbCB2aWRlbyAoMS9mcmFtZVJhdGUpCisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzOworICAgIC8vIFJlYWwgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGVuY29kZWQgdGltZSBsYXBzZSBmcmFtZQorICAgIGludDY0X3QgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVczsKKwogICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOwogCiAgICAgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKaW5kZXggZTkxZDA2Ni4uOGQzYTlkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaApAQCAtMjcsNyArMjcsMTAgQEAKIHN0cnVjdCBNZXRhRGF0YTsKIAogc3RydWN0IE1lZGlhV3JpdGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIE1lZGlhV3JpdGVyKCkge30KKyAgICBNZWRpYVdyaXRlcigpCisgICAgICAgIDogbU1heEZpbGVTaXplTGltaXRCeXRlcygwKSwKKyAgICAgICAgICBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcygwKSB7CisgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAppbmRleCA5NWZlNmY2Li43M2Y1NTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCkBAIC02OSw2ICs2OSwxMCBAQAogICAgIGtLZXlEYXRlICAgICAgICAgICAgICA9ICdkYXRlJywgIC8vIGNzdHJpbmcKICAgICBrS2V5V3JpdGVyICAgICAgICAgICAgPSAnd3JpdCcsICAvLyBjc3RyaW5nCiAKKyAgICAvLyB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbAorICAgIGtLZXlWaWRlb1Byb2ZpbGUgICAgICA9ICd2cHJmJywgIC8vIGludDMyX3QKKyAgICBrS2V5VmlkZW9MZXZlbCAgICAgICAgPSAndmxldicsICAvLyBpbnQzMl90CisKICAgICAvLyBTZXQgdGhpcyBrZXkgdG8gZW5hYmxlIGF1dGhvcmluZyBmaWxlcyBpbiA2NC1iaXQgb2Zmc2V0CiAgICAga0tleTY0Qml0RmlsZU9mZnNldCAgID0gJ2ZvYnQnLCAgLy8gaW50MzJfdCAoYm9vbCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCmluZGV4IDk5ZWM4ZTYuLjIxNGY0M2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKQEAgLTI3LDYgKzI3LDcgQEAKIAogY2xhc3MgTWVtb3J5RGVhbGVyOwogc3RydWN0IE9NWENvZGVjT2JzZXJ2ZXI7CitzdHJ1Y3QgQ29kZWNQcm9maWxlTGV2ZWw7CiAKIHN0cnVjdCBPTVhDb2RlYyA6IHB1YmxpYyBNZWRpYVNvdXJjZSwKICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKQEAgLTE3OCw2ICsxNzksMTIgQEAKICAgICBzdGF0dXNfdCBzZXR1cE1QRUc0RW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKICAgICBzdGF0dXNfdCBzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSk7CiAKKyAgICAvLyBJZiBwcm9maWxlL2xldmVsIGlzIHNldCBpbiB0aGUgbWV0YSBkYXRhLCBpdHMgdmFsdWUgaW4gdGhlIG1ldGEKKyAgICAvLyBkYXRhIHdpbGwgYmUgdXNlZDsgb3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuCisgICAgc3RhdHVzX3QgZ2V0VmlkZW9Qcm9maWxlTGV2ZWwoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLAorICAgICAgICAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwmIGRlZmF1bHRQcm9maWxlTGV2ZWwsCisgICAgICAgICAgICBDb2RlY1Byb2ZpbGVMZXZlbCYgcHJvZmlsZUxldmVsKTsKKwogICAgIHN0YXR1c190IHNldFZpZGVvT3V0cHV0Rm9ybWF0KAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgT01YX1UzMiB3aWR0aCwgT01YX1UzMiBoZWlnaHQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oCmluZGV4IDlmY2NlYWQuLmIwMDhiNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oCkBAIC0zNCw2ICszNCw4IEBACiAgICAgICAgIHJldHVybiBtSUQ7CiAgICAgfQogCisgICAgc3A8QUxvb3Blcj4gbG9vcGVyKCk7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmgKaW5kZXggNjlhZDgzNy4uMTk0ZjFmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oCkBAIC0zOSw3ICszOSwxMCBAQAogICAgIGhhbmRsZXJfaWQgcmVnaXN0ZXJIYW5kbGVyKGNvbnN0IHNwPEFIYW5kbGVyPiAmaGFuZGxlcik7CiAgICAgdm9pZCB1bnJlZ2lzdGVySGFuZGxlcihoYW5kbGVyX2lkIGhhbmRsZXJJRCk7CiAKLSAgICBzdGF0dXNfdCBzdGFydChib29sIHJ1bk9uQ2FsbGluZ1RocmVhZCA9IGZhbHNlKTsKKyAgICBzdGF0dXNfdCBzdGFydCgKKyAgICAgICAgICAgIGJvb2wgcnVuT25DYWxsaW5nVGhyZWFkID0gZmFsc2UsCisgICAgICAgICAgICBib29sIGNhbkNhbGxKYXZhID0gZmFsc2UpOworCiAgICAgc3RhdHVzX3Qgc3RvcCgpOwogCiAgICAgc3RhdGljIGludDY0X3QgR2V0Tm93VXMoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oCmluZGV4IDFjNjg2OWMuLmMxYmQ0ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaApAQCAtMzQsMTAgKzM0LDEyIEBACiAgICAgdm9pZCBwb3N0TWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzID0gMCk7CiAgICAgdm9pZCBkZWxpdmVyTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKKyAgICBzcDxBTG9vcGVyPiBmaW5kTG9vcGVyKEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEKTsKKwogcHJpdmF0ZToKICAgICBzdHJ1Y3QgSGFuZGxlckluZm8gewotICAgICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgICAgICBzcDxBSGFuZGxlcj4gbUhhbmRsZXI7CisgICAgICAgIHdwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgICAgIHdwPEFIYW5kbGVyPiBtSGFuZGxlcjsKICAgICB9OwogCiAgICAgTXV0ZXggbUxvY2s7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCmluZGV4IDEzOWM2MjAuLmM2NzRjYmFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaApAQCAtNjAsNiArNjAsOCBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IGR1cCgpIGNvbnN0OwogCisgICAgQVN0cmluZyBkZWJ1Z1N0cmluZyhpbnQzMl90IGluZGVudCA9IDApIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QU1lc3NhZ2UoKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9JbnB1dC5oIGIvaW5jbHVkZS91aS9JbnB1dC5oCmluZGV4IGEyZTBiYTA2Li5hN2QyM2Q0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0lucHV0LmgKKysrIGIvaW5jbHVkZS91aS9JbnB1dC5oCkBAIC00Myw3ICs0Myw5IEBACiAvKgogICogRGVjbGFyZSBhIGNvbmNyZXRlIHR5cGUgZm9yIHRoZSBOREsncyBpbnB1dCBldmVudCBmb3J3YXJkIGRlY2xhcmF0aW9uLgogICovCi1zdHJ1Y3QgQUlucHV0RXZlbnQgeyB9Oworc3RydWN0IEFJbnB1dEV2ZW50IHsKKyAgICB2aXJ0dWFsIH5BSW5wdXRFdmVudCgpIHsgfQorfTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL0lucHV0RGV2aWNlLmggYi9pbmNsdWRlL3VpL0lucHV0RGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyMDYwMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWkvSW5wdXREZXZpY2UuaApAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1VJX0lOUFVUX0RFVklDRV9ICisjZGVmaW5lIF9VSV9JTlBVVF9ERVZJQ0VfSAorCisjaW5jbHVkZSA8dWkvRXZlbnRIdWIuaD4KKyNpbmNsdWRlIDx1aS9JbnB1dC5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvQml0U2V0Lmg+CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogTWF4aW11bSBwb2ludGVyIGlkIHZhbHVlIHN1cHBvcnRlZC4KKyAqIChUaGlzIGlzIGxpbWl0ZWQgYnkgb3VyIHVzZSBvZiBCaXRTZXQzMiB0byB0cmFjayBwb2ludGVyIGFzc2lnbm1lbnRzLikgKi8KKyNkZWZpbmUgTUFYX1BPSU5URVJfSUQgMzEKKworLyogTWF4aW11bSBudW1iZXIgb2YgaGlzdG9yaWNhbCBzYW1wbGVzIHRvIGF2ZXJhZ2UuICovCisjZGVmaW5lIEFWRVJBR0lOR19ISVNUT1JZX1NJWkUgNQorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuIGludDMyX3QgdXBkYXRlTWV0YVN0YXRlKGludDMyX3Qga2V5Q29kZSwgYm9vbCBkb3duLCBpbnQzMl90IG9sZE1ldGFTdGF0ZSk7CitleHRlcm4gaW50MzJfdCByb3RhdGVLZXlDb2RlKGludDMyX3Qga2V5Q29kZSwgaW50MzJfdCBvcmllbnRhdGlvbik7CisKKy8qCisgKiBBbiBpbnB1dCBkZXZpY2Ugc3RydWN0dXJlIHRyYWNrcyB0aGUgc3RhdGUgb2YgYSBzaW5nbGUgaW5wdXQgZGV2aWNlLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIG9ubHkgdXNlZCBieSBSZWFkZXJUaHJlYWQgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzaGFyZWQgd2l0aAorICogRGlzcGF0Y2hlclRocmVhZCAoYmVjYXVzZSB0aGF0IHdvdWxkIHJlcXVpcmUgbG9ja2luZykuICBUaGlzIHdvcmtzIG91dCBmaW5lIGJlY2F1c2UKKyAqIERpc3BhdGNoZXJUaHJlYWQgaXMgb25seSBpbnRlcmVzdGVkIGluIGNvb2tlZCBldmVudCBkYXRhIGFueXdheXMgYW5kIGRvZXMgbm90IG5lZWQKKyAqIGFueSBvZiB0aGUgbG93LWxldmVsIGRhdGEgZnJvbSBJbnB1dERldmljZS4KKyAqLworc3RydWN0IElucHV0RGV2aWNlIHsKKyAgICBzdHJ1Y3QgQWJzb2x1dGVBeGlzSW5mbyB7CisgICAgICAgIGJvb2wgdmFsaWQ7ICAgICAgICAvLyBzZXQgdG8gdHJ1ZSBpZiBheGlzIHBhcmFtZXRlcnMgYXJlIGtub3duLCBmYWxzZSBvdGhlcndpc2UKKworICAgICAgICBpbnQzMl90IG1pblZhbHVlOyAgLy8gbWluaW11bSB2YWx1ZQorICAgICAgICBpbnQzMl90IG1heFZhbHVlOyAgLy8gbWF4aW11bSB2YWx1ZQorICAgICAgICBpbnQzMl90IHJhbmdlOyAgICAgLy8gcmFuZ2Ugb2YgdmFsdWVzLCBlcXVhbCB0byBtYXhWYWx1ZSAtIG1pblZhbHVlCisgICAgICAgIGludDMyX3QgZmxhdDsgICAgICAvLyBjZW50ZXIgZmxhdCBwb3NpdGlvbiwgZWcuIGZsYXQgPT0gOCBtZWFucyBjZW50ZXIgaXMgYmV0d2VlbiAtOCBhbmQgOAorICAgICAgICBpbnQzMl90IGZ1eno7ICAgICAgLy8gZXJyb3IgdG9sZXJhbmNlLCBlZy4gZnV6eiA9PSA0IG1lYW5zIHZhbHVlIGlzICsvLSA0IGR1ZSB0byBub2lzZQorICAgIH07CisKKyAgICBzdHJ1Y3QgVmlydHVhbEtleSB7CisgICAgICAgIGludDMyX3Qga2V5Q29kZTsKKyAgICAgICAgaW50MzJfdCBzY2FuQ29kZTsKKyAgICAgICAgdWludDMyX3QgZmxhZ3M7CisKKyAgICAgICAgLy8gY29tcHV0ZWQgaGl0IGJveCwgc3BlY2lmaWVkIGluIHRvdWNoIHNjcmVlbiBjb29yZHMgYmFzZWQgb24ga25vd24gZGlzcGxheSBzaXplCisgICAgICAgIGludDMyX3QgaGl0TGVmdDsKKyAgICAgICAgaW50MzJfdCBoaXRUb3A7CisgICAgICAgIGludDMyX3QgaGl0UmlnaHQ7CisgICAgICAgIGludDMyX3QgaGl0Qm90dG9tOworCisgICAgICAgIGlubGluZSBib29sIGlzSGl0KGludDMyX3QgeCwgaW50MzJfdCB5KSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4geCA+PSBoaXRMZWZ0ICYmIHggPD0gaGl0UmlnaHQgJiYgeSA+PSBoaXRUb3AgJiYgeSA8PSBoaXRCb3R0b207CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RydWN0IEtleWJvYXJkU3RhdGUgeworICAgICAgICBzdHJ1Y3QgQ3VycmVudCB7CisgICAgICAgICAgICBpbnQzMl90IG1ldGFTdGF0ZTsKKyAgICAgICAgICAgIG5zZWNzX3QgZG93blRpbWU7IC8vIHRpbWUgb2YgbW9zdCByZWNlbnQga2V5IGRvd24KKyAgICAgICAgfSBjdXJyZW50OworCisgICAgICAgIHZvaWQgcmVzZXQoKTsKKyAgICB9OworCisgICAgc3RydWN0IFRyYWNrYmFsbFN0YXRlIHsKKyAgICAgICAgc3RydWN0IEFjY3VtdWxhdG9yIHsKKyAgICAgICAgICAgIGVudW0geworICAgICAgICAgICAgICAgIEZJRUxEX0JUTl9NT1VTRSA9IDEsCisgICAgICAgICAgICAgICAgRklFTERfUkVMX1ggPSAyLAorICAgICAgICAgICAgICAgIEZJRUxEX1JFTF9ZID0gNAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdWludDMyX3QgZmllbGRzOworCisgICAgICAgICAgICBib29sIGJ0bk1vdXNlOworICAgICAgICAgICAgaW50MzJfdCByZWxYOworICAgICAgICAgICAgaW50MzJfdCByZWxZOworCisgICAgICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgICAgICBmaWVsZHMgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmxpbmUgYm9vbCBpc0RpcnR5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHMgIT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBhY2N1bXVsYXRvcjsKKworICAgICAgICBzdHJ1Y3QgQ3VycmVudCB7CisgICAgICAgICAgICBib29sIGRvd247CisgICAgICAgICAgICBuc2Vjc190IGRvd25UaW1lOworICAgICAgICB9IGN1cnJlbnQ7CisKKyAgICAgICAgc3RydWN0IFByZWNhbGN1bGF0ZWQgeworICAgICAgICAgICAgZmxvYXQgeFNjYWxlOworICAgICAgICAgICAgZmxvYXQgeVNjYWxlOworICAgICAgICAgICAgZmxvYXQgeFByZWNpc2lvbjsKKyAgICAgICAgICAgIGZsb2F0IHlQcmVjaXNpb247CisgICAgICAgIH0gcHJlY2FsY3VsYXRlZDsKKworICAgICAgICB2b2lkIHJlc2V0KCk7CisgICAgfTsKKworICAgIHN0cnVjdCBTaW5nbGVUb3VjaFNjcmVlblN0YXRlIHsKKyAgICAgICAgc3RydWN0IEFjY3VtdWxhdG9yIHsKKyAgICAgICAgICAgIGVudW0geworICAgICAgICAgICAgICAgIEZJRUxEX0JUTl9UT1VDSCA9IDEsCisgICAgICAgICAgICAgICAgRklFTERfQUJTX1ggPSAyLAorICAgICAgICAgICAgICAgIEZJRUxEX0FCU19ZID0gNCwKKyAgICAgICAgICAgICAgICBGSUVMRF9BQlNfUFJFU1NVUkUgPSA4LAorICAgICAgICAgICAgICAgIEZJRUxEX0FCU19UT09MX1dJRFRIID0gMTYKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHVpbnQzMl90IGZpZWxkczsKKworICAgICAgICAgICAgYm9vbCBidG5Ub3VjaDsKKyAgICAgICAgICAgIGludDMyX3QgYWJzWDsKKyAgICAgICAgICAgIGludDMyX3QgYWJzWTsKKyAgICAgICAgICAgIGludDMyX3QgYWJzUHJlc3N1cmU7CisgICAgICAgICAgICBpbnQzMl90IGFic1Rvb2xXaWR0aDsKKworICAgICAgICAgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICAgICAgZmllbGRzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5saW5lIGJvb2wgaXNEaXJ0eSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmllbGRzICE9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYWNjdW11bGF0b3I7CisKKyAgICAgICAgc3RydWN0IEN1cnJlbnQgeworICAgICAgICAgICAgYm9vbCBkb3duOworICAgICAgICAgICAgaW50MzJfdCB4OworICAgICAgICAgICAgaW50MzJfdCB5OworICAgICAgICAgICAgaW50MzJfdCBwcmVzc3VyZTsKKyAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICAgICAgfSBjdXJyZW50OworCisgICAgICAgIHZvaWQgcmVzZXQoKTsKKyAgICB9OworCisgICAgc3RydWN0IE11bHRpVG91Y2hTY3JlZW5TdGF0ZSB7CisgICAgICAgIHN0cnVjdCBBY2N1bXVsYXRvciB7CisgICAgICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgICAgICBGSUVMRF9BQlNfTVRfUE9TSVRJT05fWCA9IDEsCisgICAgICAgICAgICAgICAgRklFTERfQUJTX01UX1BPU0lUSU9OX1kgPSAyLAorICAgICAgICAgICAgICAgIEZJRUxEX0FCU19NVF9UT1VDSF9NQUpPUiA9IDQsCisgICAgICAgICAgICAgICAgRklFTERfQUJTX01UX1dJRFRIX01BSk9SID0gOCwKKyAgICAgICAgICAgICAgICBGSUVMRF9BQlNfTVRfVFJBQ0tJTkdfSUQgPSAxNgorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdWludDMyX3QgcG9pbnRlckNvdW50OworICAgICAgICAgICAgc3RydWN0IFBvaW50ZXIgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpZWxkczsKKworICAgICAgICAgICAgICAgIGludDMyX3QgYWJzTVRQb3NpdGlvblg7CisgICAgICAgICAgICAgICAgaW50MzJfdCBhYnNNVFBvc2l0aW9uWTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGFic01UVG91Y2hNYWpvcjsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGFic01UV2lkdGhNYWpvcjsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGFic01UVHJhY2tpbmdJZDsKKworICAgICAgICAgICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgICAgICAgICBmaWVsZHMgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gcG9pbnRlcnNbTUFYX1BPSU5URVJTICsgMV07IC8vICsgMSB0byByZW1vdmUgdGhlIG5lZWQgZm9yIGV4dHJhIHJhbmdlIGNoZWNrcworCisgICAgICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHBvaW50ZXJzWzBdLmNsZWFyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlubGluZSBib29sIGlzRGlydHkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvaW50ZXJDb3VudCAhPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGFjY3VtdWxhdG9yOworCisgICAgICAgIHZvaWQgcmVzZXQoKTsKKyAgICB9OworCisgICAgc3RydWN0IFBvaW50ZXJEYXRhIHsKKyAgICAgICAgdWludDMyX3QgaWQ7CisgICAgICAgIGludDMyX3QgeDsKKyAgICAgICAgaW50MzJfdCB5OworICAgICAgICBpbnQzMl90IHByZXNzdXJlOworICAgICAgICBpbnQzMl90IHNpemU7CisgICAgfTsKKworICAgIHN0cnVjdCBUb3VjaERhdGEgeworICAgICAgICB1aW50MzJfdCBwb2ludGVyQ291bnQ7CisgICAgICAgIFBvaW50ZXJEYXRhIHBvaW50ZXJzW01BWF9QT0lOVEVSU107CisgICAgICAgIEJpdFNldDMyIGlkQml0czsKKyAgICAgICAgdWludDMyX3QgaWRUb0luZGV4W01BWF9QT0lOVEVSX0lEICsgMV07CisKKyAgICAgICAgdm9pZCBjb3B5RnJvbShjb25zdCBUb3VjaERhdGEmIG90aGVyKTsKKworICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIHBvaW50ZXJDb3VudCA9IDA7CisgICAgICAgICAgICBpZEJpdHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBjb21tb24gc3RhdGUgdXNlZCBmb3IgYm90aCBzaW5nbGUtdG91Y2ggYW5kIG11bHRpLXRvdWNoIHNjcmVlbnMgYWZ0ZXIgdGhlIGluaXRpYWwKKyAgICAvLyB0b3VjaCBkZWNvZGluZyBoYXMgYmVlbiBwZXJmb3JtZWQKKyAgICBzdHJ1Y3QgVG91Y2hTY3JlZW5TdGF0ZSB7CisgICAgICAgIFZlY3RvcjxWaXJ0dWFsS2V5PiB2aXJ0dWFsS2V5czsKKworICAgICAgICBzdHJ1Y3QgUGFyYW1ldGVycyB7CisgICAgICAgICAgICBib29sIHVzZUJhZFRvdWNoRmlsdGVyOworICAgICAgICAgICAgYm9vbCB1c2VKdW1weVRvdWNoRmlsdGVyOworICAgICAgICAgICAgYm9vbCB1c2VBdmVyYWdpbmdUb3VjaEZpbHRlcjsKKworICAgICAgICAgICAgQWJzb2x1dGVBeGlzSW5mbyB4QXhpczsKKyAgICAgICAgICAgIEFic29sdXRlQXhpc0luZm8geUF4aXM7CisgICAgICAgICAgICBBYnNvbHV0ZUF4aXNJbmZvIHByZXNzdXJlQXhpczsKKyAgICAgICAgICAgIEFic29sdXRlQXhpc0luZm8gc2l6ZUF4aXM7CisgICAgICAgIH0gcGFyYW1ldGVyczsKKworICAgICAgICAvLyBUaGUgdG91Y2ggZGF0YSBvZiB0aGUgY3VycmVudCBzYW1wbGUgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAgICBUb3VjaERhdGEgY3VycmVudFRvdWNoOworCisgICAgICAgIC8vIFRoZSB0b3VjaCBkYXRhIG9mIHRoZSBwcmV2aW91cyBzYW1wbGUgdGhhdCB3YXMgcHJvY2Vzc2VkLiAgVGhpcyBpcyB1cGRhdGVkCisgICAgICAgIC8vIGluY3JlbWVudGFsbHkgd2hpbGUgdGhlIGN1cnJlbnQgc2FtcGxlIGlzIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgICAgVG91Y2hEYXRhIGxhc3RUb3VjaDsKKworICAgICAgICAvLyBUaGUgdGltZSB0aGUgcHJpbWFyeSBwb2ludGVyIGxhc3Qgd2VudCBkb3duLgorICAgICAgICBuc2Vjc190IGRvd25UaW1lOworCisgICAgICAgIHN0cnVjdCBDdXJyZW50VmlydHVhbEtleVN0YXRlIHsKKyAgICAgICAgICAgIGVudW0gU3RhdHVzIHsKKyAgICAgICAgICAgICAgICBTVEFUVVNfVVAsCisgICAgICAgICAgICAgICAgU1RBVFVTX0RPV04sCisgICAgICAgICAgICAgICAgU1RBVFVTX0NBTkNFTEVECisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBTdGF0dXMgc3RhdHVzOworICAgICAgICAgICAgbnNlY3NfdCBkb3duVGltZTsKKyAgICAgICAgICAgIGludDMyX3Qga2V5Q29kZTsKKyAgICAgICAgICAgIGludDMyX3Qgc2NhbkNvZGU7CisgICAgICAgIH0gY3VycmVudFZpcnR1YWxLZXk7CisKKyAgICAgICAgc3RydWN0IEF2ZXJhZ2luZ1RvdWNoRmlsdGVyU3RhdGUgeworICAgICAgICAgICAgLy8gSW5kaXZpZHVhbCBoaXN0b3J5IHRyYWNrcyBhcmUgc3RvcmVkIGJ5IHBvaW50ZXIgaWQKKyAgICAgICAgICAgIHVpbnQzMl90IGhpc3RvcnlTdGFydFtNQVhfUE9JTlRFUlNdOworICAgICAgICAgICAgdWludDMyX3QgaGlzdG9yeUVuZFtNQVhfUE9JTlRFUlNdOworICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHg7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmVzc3VyZTsKKyAgICAgICAgICAgICAgICB9IHBvaW50ZXJzW01BWF9QT0lOVEVSU107CisgICAgICAgICAgICB9IGhpc3RvcnlEYXRhW0FWRVJBR0lOR19ISVNUT1JZX1NJWkVdOworICAgICAgICB9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyOworCisgICAgICAgIHN0cnVjdCBKdW1wVG91Y2hGaWx0ZXJTdGF0ZSB7CisgICAgICAgICAgICBpbnQzMl90IGp1bXB5UG9pbnRzRHJvcHBlZDsKKyAgICAgICAgfSBqdW1weVRvdWNoRmlsdGVyOworCisgICAgICAgIHN0cnVjdCBQcmVjYWxjdWxhdGVkIHsKKyAgICAgICAgICAgIGludDMyX3QgeE9yaWdpbjsKKyAgICAgICAgICAgIGZsb2F0IHhTY2FsZTsKKworICAgICAgICAgICAgaW50MzJfdCB5T3JpZ2luOworICAgICAgICAgICAgZmxvYXQgeVNjYWxlOworCisgICAgICAgICAgICBpbnQzMl90IHByZXNzdXJlT3JpZ2luOworICAgICAgICAgICAgZmxvYXQgcHJlc3N1cmVTY2FsZTsKKworICAgICAgICAgICAgaW50MzJfdCBzaXplT3JpZ2luOworICAgICAgICAgICAgZmxvYXQgc2l6ZVNjYWxlOworICAgICAgICB9IHByZWNhbGN1bGF0ZWQ7CisKKyAgICAgICAgdm9pZCByZXNldCgpOworCisgICAgICAgIGJvb2wgYXBwbHlCYWRUb3VjaEZpbHRlcigpOworICAgICAgICBib29sIGFwcGx5SnVtcHlUb3VjaEZpbHRlcigpOworICAgICAgICB2b2lkIGFwcGx5QXZlcmFnaW5nVG91Y2hGaWx0ZXIoKTsKKyAgICAgICAgdm9pZCBjYWxjdWxhdGVQb2ludGVySWRzKCk7CisKKyAgICAgICAgYm9vbCBpc1BvaW50SW5zaWRlRGlzcGxheShpbnQzMl90IHgsIGludDMyX3QgeSkgY29uc3Q7CisgICAgICAgIGNvbnN0IElucHV0RGV2aWNlOjpWaXJ0dWFsS2V5KiBmaW5kVmlydHVhbEtleUhpdCgpIGNvbnN0OworICAgIH07CisKKyAgICBJbnB1dERldmljZShpbnQzMl90IGlkLCB1aW50MzJfdCBjbGFzc2VzLCBTdHJpbmc4IG5hbWUpOworCisgICAgaW50MzJfdCBpZDsKKyAgICB1aW50MzJfdCBjbGFzc2VzOworICAgIFN0cmluZzggbmFtZTsKKyAgICBib29sIGlnbm9yZWQ7CisKKyAgICBLZXlib2FyZFN0YXRlIGtleWJvYXJkOworICAgIFRyYWNrYmFsbFN0YXRlIHRyYWNrYmFsbDsKKyAgICBUb3VjaFNjcmVlblN0YXRlIHRvdWNoU2NyZWVuOworICAgIHVuaW9uIHsKKyAgICAgICAgU2luZ2xlVG91Y2hTY3JlZW5TdGF0ZSBzaW5nbGVUb3VjaFNjcmVlbjsKKyAgICAgICAgTXVsdGlUb3VjaFNjcmVlblN0YXRlIG11bHRpVG91Y2hTY3JlZW47CisgICAgfTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIGlubGluZSBib29sIGlzS2V5Ym9hcmQoKSBjb25zdCB7IHJldHVybiBjbGFzc2VzICYgSU5QVVRfREVWSUNFX0NMQVNTX0tFWUJPQVJEOyB9CisgICAgaW5saW5lIGJvb2wgaXNBbHBoYUtleSgpIGNvbnN0IHsgcmV0dXJuIGNsYXNzZXMgJiBJTlBVVF9ERVZJQ0VfQ0xBU1NfQUxQSEFLRVk7IH0KKyAgICBpbmxpbmUgYm9vbCBpc1RyYWNrYmFsbCgpIGNvbnN0IHsgcmV0dXJuIGNsYXNzZXMgJiBJTlBVVF9ERVZJQ0VfQ0xBU1NfVFJBQ0tCQUxMOyB9CisgICAgaW5saW5lIGJvb2wgaXNEUGFkKCkgY29uc3QgeyByZXR1cm4gY2xhc3NlcyAmIElOUFVUX0RFVklDRV9DTEFTU19EUEFEOyB9CisgICAgaW5saW5lIGJvb2wgaXNTaW5nbGVUb3VjaFNjcmVlbigpIGNvbnN0IHsgcmV0dXJuIChjbGFzc2VzCisgICAgICAgICAgICAmIChJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU4gfCBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU5fTVQpKQorICAgICAgICAgICAgPT0gSU5QVVRfREVWSUNFX0NMQVNTX1RPVUNIU0NSRUVOOyB9CisgICAgaW5saW5lIGJvb2wgaXNNdWx0aVRvdWNoU2NyZWVuKCkgY29uc3QgeyByZXR1cm4gY2xhc3NlcworICAgICAgICAgICAgJiBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU5fTVQ7IH0KKyAgICBpbmxpbmUgYm9vbCBpc1RvdWNoU2NyZWVuKCkgY29uc3QgeyByZXR1cm4gY2xhc3NlcworICAgICAgICAgICAgJiAoSU5QVVRfREVWSUNFX0NMQVNTX1RPVUNIU0NSRUVOIHwgSU5QVVRfREVWSUNFX0NMQVNTX1RPVUNIU0NSRUVOX01UKTsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX1VJX0lOUFVUX0RFVklDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL0lucHV0UmVhZGVyLmggYi9pbmNsdWRlL3VpL0lucHV0UmVhZGVyLmgKaW5kZXggNzgxZGEzNS4uODVhMDA4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91aS9JbnB1dFJlYWRlci5oCisrKyBiL2luY2x1ZGUvdWkvSW5wdXRSZWFkZXIuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8dWkvRXZlbnRIdWIuaD4KICNpbmNsdWRlIDx1aS9JbnB1dC5oPgorI2luY2x1ZGUgPHVpL0lucHV0RGV2aWNlLmg+CiAjaW5jbHVkZSA8dWkvSW5wdXREaXNwYXRjaGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC0zMCwzMDQgKzMxLDggQEAKICNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotLyogTWF4aW11bSBwb2ludGVyIGlkIHZhbHVlIHN1cHBvcnRlZC4KLSAqIChUaGlzIGlzIGxpbWl0ZWQgYnkgb3VyIHVzZSBvZiBCaXRTZXQzMiB0byB0cmFjayBwb2ludGVyIGFzc2lnbm1lbnRzLikgKi8KLSNkZWZpbmUgTUFYX1BPSU5URVJfSUQgMzIKLQotLyogTWF4aW11bSBudW1iZXIgb2YgaGlzdG9yaWNhbCBzYW1wbGVzIHRvIGF2ZXJhZ2UuICovCi0jZGVmaW5lIEFWRVJBR0lOR19ISVNUT1JZX1NJWkUgNQotCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotZXh0ZXJuIGludDMyX3QgdXBkYXRlTWV0YVN0YXRlKGludDMyX3Qga2V5Q29kZSwgYm9vbCBkb3duLCBpbnQzMl90IG9sZE1ldGFTdGF0ZSk7Ci1leHRlcm4gaW50MzJfdCByb3RhdGVLZXlDb2RlKGludDMyX3Qga2V5Q29kZSwgaW50MzJfdCBvcmllbnRhdGlvbik7Ci0KLS8qCi0gKiBBbiBpbnB1dCBkZXZpY2Ugc3RydWN0dXJlIHRyYWNrcyB0aGUgc3RhdGUgb2YgYSBzaW5nbGUgaW5wdXQgZGV2aWNlLgotICoKLSAqIFRoaXMgc3RydWN0dXJlIGlzIG9ubHkgdXNlZCBieSBSZWFkZXJUaHJlYWQgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzaGFyZWQgd2l0aAotICogRGlzcGF0Y2hlclRocmVhZCAoYmVjYXVzZSB0aGF0IHdvdWxkIHJlcXVpcmUgbG9ja2luZykuICBUaGlzIHdvcmtzIG91dCBmaW5lIGJlY2F1c2UKLSAqIERpc3BhdGNoZXJUaHJlYWQgaXMgb25seSBpbnRlcmVzdGVkIGluIGNvb2tlZCBldmVudCBkYXRhIGFueXdheXMgYW5kIGRvZXMgbm90IG5lZWQKLSAqIGFueSBvZiB0aGUgbG93LWxldmVsIGRhdGEgZnJvbSBJbnB1dERldmljZS4KLSAqLwotc3RydWN0IElucHV0RGV2aWNlIHsKLSAgICBzdHJ1Y3QgQWJzb2x1dGVBeGlzSW5mbyB7Ci0gICAgICAgIGJvb2wgdmFsaWQ7ICAgICAgICAvLyBzZXQgdG8gdHJ1ZSBpZiBheGlzIHBhcmFtZXRlcnMgYXJlIGtub3duLCBmYWxzZSBvdGhlcndpc2UKLQotICAgICAgICBpbnQzMl90IG1pblZhbHVlOyAgLy8gbWluaW11bSB2YWx1ZQotICAgICAgICBpbnQzMl90IG1heFZhbHVlOyAgLy8gbWF4aW11bSB2YWx1ZQotICAgICAgICBpbnQzMl90IHJhbmdlOyAgICAgLy8gcmFuZ2Ugb2YgdmFsdWVzLCBlcXVhbCB0byBtYXhWYWx1ZSAtIG1pblZhbHVlCi0gICAgICAgIGludDMyX3QgZmxhdDsgICAgICAvLyBjZW50ZXIgZmxhdCBwb3NpdGlvbiwgZWcuIGZsYXQgPT0gOCBtZWFucyBjZW50ZXIgaXMgYmV0d2VlbiAtOCBhbmQgOAotICAgICAgICBpbnQzMl90IGZ1eno7ICAgICAgLy8gZXJyb3IgdG9sZXJhbmNlLCBlZy4gZnV6eiA9PSA0IG1lYW5zIHZhbHVlIGlzICsvLSA0IGR1ZSB0byBub2lzZQotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVmlydHVhbEtleSB7Ci0gICAgICAgIGludDMyX3Qga2V5Q29kZTsKLSAgICAgICAgaW50MzJfdCBzY2FuQ29kZTsKLSAgICAgICAgdWludDMyX3QgZmxhZ3M7Ci0KLSAgICAgICAgLy8gY29tcHV0ZWQgaGl0IGJveCwgc3BlY2lmaWVkIGluIHRvdWNoIHNjcmVlbiBjb29yZHMgYmFzZWQgb24ga25vd24gZGlzcGxheSBzaXplCi0gICAgICAgIGludDMyX3QgaGl0TGVmdDsKLSAgICAgICAgaW50MzJfdCBoaXRUb3A7Ci0gICAgICAgIGludDMyX3QgaGl0UmlnaHQ7Ci0gICAgICAgIGludDMyX3QgaGl0Qm90dG9tOwotCi0gICAgICAgIGlubGluZSBib29sIGlzSGl0KGludDMyX3QgeCwgaW50MzJfdCB5KSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4geCA+PSBoaXRMZWZ0ICYmIHggPD0gaGl0UmlnaHQgJiYgeSA+PSBoaXRUb3AgJiYgeSA8PSBoaXRCb3R0b207Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgc3RydWN0IEtleWJvYXJkU3RhdGUgewotICAgICAgICBzdHJ1Y3QgQ3VycmVudCB7Ci0gICAgICAgICAgICBpbnQzMl90IG1ldGFTdGF0ZTsKLSAgICAgICAgICAgIG5zZWNzX3QgZG93blRpbWU7IC8vIHRpbWUgb2YgbW9zdCByZWNlbnQga2V5IGRvd24KLSAgICAgICAgfSBjdXJyZW50OwotCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrYmFsbFN0YXRlIHsKLSAgICAgICAgc3RydWN0IEFjY3VtdWxhdG9yIHsKLSAgICAgICAgICAgIGVudW0gewotICAgICAgICAgICAgICAgIEZJRUxEX0JUTl9NT1VTRSA9IDEsCi0gICAgICAgICAgICAgICAgRklFTERfUkVMX1ggPSAyLAotICAgICAgICAgICAgICAgIEZJRUxEX1JFTF9ZID0gNAotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgdWludDMyX3QgZmllbGRzOwotCi0gICAgICAgICAgICBib29sIGJ0bk1vdXNlOwotICAgICAgICAgICAgaW50MzJfdCByZWxYOwotICAgICAgICAgICAgaW50MzJfdCByZWxZOwotCi0gICAgICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgICAgICBmaWVsZHMgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbmxpbmUgYm9vbCBpc0RpcnR5KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHMgIT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBhY2N1bXVsYXRvcjsKLQotICAgICAgICBzdHJ1Y3QgQ3VycmVudCB7Ci0gICAgICAgICAgICBib29sIGRvd247Ci0gICAgICAgICAgICBuc2Vjc190IGRvd25UaW1lOwotICAgICAgICB9IGN1cnJlbnQ7Ci0KLSAgICAgICAgc3RydWN0IFByZWNhbGN1bGF0ZWQgewotICAgICAgICAgICAgZmxvYXQgeFNjYWxlOwotICAgICAgICAgICAgZmxvYXQgeVNjYWxlOwotICAgICAgICAgICAgZmxvYXQgeFByZWNpc2lvbjsKLSAgICAgICAgICAgIGZsb2F0IHlQcmVjaXNpb247Ci0gICAgICAgIH0gcHJlY2FsY3VsYXRlZDsKLQotICAgICAgICB2b2lkIHJlc2V0KCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBTaW5nbGVUb3VjaFNjcmVlblN0YXRlIHsKLSAgICAgICAgc3RydWN0IEFjY3VtdWxhdG9yIHsKLSAgICAgICAgICAgIGVudW0gewotICAgICAgICAgICAgICAgIEZJRUxEX0JUTl9UT1VDSCA9IDEsCi0gICAgICAgICAgICAgICAgRklFTERfQUJTX1ggPSAyLAotICAgICAgICAgICAgICAgIEZJRUxEX0FCU19ZID0gNCwKLSAgICAgICAgICAgICAgICBGSUVMRF9BQlNfUFJFU1NVUkUgPSA4LAotICAgICAgICAgICAgICAgIEZJRUxEX0FCU19UT09MX1dJRFRIID0gMTYKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IGZpZWxkczsKLQotICAgICAgICAgICAgYm9vbCBidG5Ub3VjaDsKLSAgICAgICAgICAgIGludDMyX3QgYWJzWDsKLSAgICAgICAgICAgIGludDMyX3QgYWJzWTsKLSAgICAgICAgICAgIGludDMyX3QgYWJzUHJlc3N1cmU7Ci0gICAgICAgICAgICBpbnQzMl90IGFic1Rvb2xXaWR0aDsKLQotICAgICAgICAgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICAgICAgZmllbGRzID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW5saW5lIGJvb2wgaXNEaXJ0eSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmllbGRzICE9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gYWNjdW11bGF0b3I7Ci0KLSAgICAgICAgc3RydWN0IEN1cnJlbnQgewotICAgICAgICAgICAgYm9vbCBkb3duOwotICAgICAgICAgICAgaW50MzJfdCB4OwotICAgICAgICAgICAgaW50MzJfdCB5OwotICAgICAgICAgICAgaW50MzJfdCBwcmVzc3VyZTsKLSAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKLSAgICAgICAgfSBjdXJyZW50OwotCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLSAgICB9OwotCi0gICAgc3RydWN0IE11bHRpVG91Y2hTY3JlZW5TdGF0ZSB7Ci0gICAgICAgIHN0cnVjdCBBY2N1bXVsYXRvciB7Ci0gICAgICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgICAgICBGSUVMRF9BQlNfTVRfUE9TSVRJT05fWCA9IDEsCi0gICAgICAgICAgICAgICAgRklFTERfQUJTX01UX1BPU0lUSU9OX1kgPSAyLAotICAgICAgICAgICAgICAgIEZJRUxEX0FCU19NVF9UT1VDSF9NQUpPUiA9IDQsCi0gICAgICAgICAgICAgICAgRklFTERfQUJTX01UX1dJRFRIX01BSk9SID0gOCwKLSAgICAgICAgICAgICAgICBGSUVMRF9BQlNfTVRfVFJBQ0tJTkdfSUQgPSAxNgotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgdWludDMyX3QgcG9pbnRlckNvdW50OwotICAgICAgICAgICAgc3RydWN0IFBvaW50ZXIgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpZWxkczsKLQotICAgICAgICAgICAgICAgIGludDMyX3QgYWJzTVRQb3NpdGlvblg7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBhYnNNVFBvc2l0aW9uWTsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGFic01UVG91Y2hNYWpvcjsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGFic01UV2lkdGhNYWpvcjsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGFic01UVHJhY2tpbmdJZDsKLQotICAgICAgICAgICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgICAgICAgICBmaWVsZHMgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gcG9pbnRlcnNbTUFYX1BPSU5URVJTICsgMV07IC8vICsgMSB0byByZW1vdmUgdGhlIG5lZWQgZm9yIGV4dHJhIHJhbmdlIGNoZWNrcwotCi0gICAgICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgICAgICBwb2ludGVyQ291bnQgPSAwOwotICAgICAgICAgICAgICAgIHBvaW50ZXJzWzBdLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlubGluZSBib29sIGlzRGlydHkoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBvaW50ZXJDb3VudCAhPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGFjY3VtdWxhdG9yOwotCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLSAgICB9OwotCi0gICAgc3RydWN0IFBvaW50ZXJEYXRhIHsKLSAgICAgICAgdWludDMyX3QgaWQ7Ci0gICAgICAgIGludDMyX3QgeDsKLSAgICAgICAgaW50MzJfdCB5OwotICAgICAgICBpbnQzMl90IHByZXNzdXJlOwotICAgICAgICBpbnQzMl90IHNpemU7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBUb3VjaERhdGEgewotICAgICAgICB1aW50MzJfdCBwb2ludGVyQ291bnQ7Ci0gICAgICAgIFBvaW50ZXJEYXRhIHBvaW50ZXJzW01BWF9QT0lOVEVSU107Ci0gICAgICAgIEJpdFNldDMyIGlkQml0czsKLSAgICAgICAgdWludDMyX3QgaWRUb0luZGV4W01BWF9QT0lOVEVSX0lEXTsKLQotICAgICAgICB2b2lkIGNvcHlGcm9tKGNvbnN0IFRvdWNoRGF0YSYgb3RoZXIpOwotCi0gICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgcG9pbnRlckNvdW50ID0gMDsKLSAgICAgICAgICAgIGlkQml0cy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8vIGNvbW1vbiBzdGF0ZSB1c2VkIGZvciBib3RoIHNpbmdsZS10b3VjaCBhbmQgbXVsdGktdG91Y2ggc2NyZWVucyBhZnRlciB0aGUgaW5pdGlhbAotICAgIC8vIHRvdWNoIGRlY29kaW5nIGhhcyBiZWVuIHBlcmZvcm1lZAotICAgIHN0cnVjdCBUb3VjaFNjcmVlblN0YXRlIHsKLSAgICAgICAgVmVjdG9yPFZpcnR1YWxLZXk+IHZpcnR1YWxLZXlzOwotCi0gICAgICAgIHN0cnVjdCBQYXJhbWV0ZXJzIHsKLSAgICAgICAgICAgIGJvb2wgdXNlQmFkVG91Y2hGaWx0ZXI7Ci0gICAgICAgICAgICBib29sIHVzZUp1bXB5VG91Y2hGaWx0ZXI7Ci0gICAgICAgICAgICBib29sIHVzZUF2ZXJhZ2luZ1RvdWNoRmlsdGVyOwotCi0gICAgICAgICAgICBBYnNvbHV0ZUF4aXNJbmZvIHhBeGlzOwotICAgICAgICAgICAgQWJzb2x1dGVBeGlzSW5mbyB5QXhpczsKLSAgICAgICAgICAgIEFic29sdXRlQXhpc0luZm8gcHJlc3N1cmVBeGlzOwotICAgICAgICAgICAgQWJzb2x1dGVBeGlzSW5mbyBzaXplQXhpczsKLSAgICAgICAgfSBwYXJhbWV0ZXJzOwotCi0gICAgICAgIC8vIFRoZSB0b3VjaCBkYXRhIG9mIHRoZSBjdXJyZW50IHNhbXBsZSBiZWluZyBwcm9jZXNzZWQuCi0gICAgICAgIFRvdWNoRGF0YSBjdXJyZW50VG91Y2g7Ci0KLSAgICAgICAgLy8gVGhlIHRvdWNoIGRhdGEgb2YgdGhlIHByZXZpb3VzIHNhbXBsZSB0aGF0IHdhcyBwcm9jZXNzZWQuICBUaGlzIGlzIHVwZGF0ZWQKLSAgICAgICAgLy8gaW5jcmVtZW50YWxseSB3aGlsZSB0aGUgY3VycmVudCBzYW1wbGUgaXMgYmVpbmcgcHJvY2Vzc2VkLgotICAgICAgICBUb3VjaERhdGEgbGFzdFRvdWNoOwotCi0gICAgICAgIC8vIFRoZSB0aW1lIHRoZSBwcmltYXJ5IHBvaW50ZXIgbGFzdCB3ZW50IGRvd24uCi0gICAgICAgIG5zZWNzX3QgZG93blRpbWU7Ci0KLSAgICAgICAgc3RydWN0IEN1cnJlbnRWaXJ0dWFsS2V5U3RhdGUgewotICAgICAgICAgICAgYm9vbCBkb3duOwotICAgICAgICAgICAgbnNlY3NfdCBkb3duVGltZTsKLSAgICAgICAgICAgIGludDMyX3Qga2V5Q29kZTsKLSAgICAgICAgICAgIGludDMyX3Qgc2NhbkNvZGU7Ci0gICAgICAgIH0gY3VycmVudFZpcnR1YWxLZXk7Ci0KLSAgICAgICAgc3RydWN0IEF2ZXJhZ2luZ1RvdWNoRmlsdGVyU3RhdGUgewotICAgICAgICAgICAgLy8gSW5kaXZpZHVhbCBoaXN0b3J5IHRyYWNrcyBhcmUgc3RvcmVkIGJ5IHBvaW50ZXIgaWQKLSAgICAgICAgICAgIHVpbnQzMl90IGhpc3RvcnlTdGFydFtNQVhfUE9JTlRFUlNdOwotICAgICAgICAgICAgdWludDMyX3QgaGlzdG9yeUVuZFtNQVhfUE9JTlRFUlNdOwotICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHg7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgeTsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmVzc3VyZTsKLSAgICAgICAgICAgICAgICB9IHBvaW50ZXJzW01BWF9QT0lOVEVSU107Ci0gICAgICAgICAgICB9IGhpc3RvcnlEYXRhW0FWRVJBR0lOR19ISVNUT1JZX1NJWkVdOwotICAgICAgICB9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyOwotCi0gICAgICAgIHN0cnVjdCBKdW1wVG91Y2hGaWx0ZXJTdGF0ZSB7Ci0gICAgICAgICAgICBpbnQzMl90IGp1bXB5UG9pbnRzRHJvcHBlZDsKLSAgICAgICAgfSBqdW1weVRvdWNoRmlsdGVyOwotCi0gICAgICAgIHN0cnVjdCBQcmVjYWxjdWxhdGVkIHsKLSAgICAgICAgICAgIGludDMyX3QgeE9yaWdpbjsKLSAgICAgICAgICAgIGZsb2F0IHhTY2FsZTsKLQotICAgICAgICAgICAgaW50MzJfdCB5T3JpZ2luOwotICAgICAgICAgICAgZmxvYXQgeVNjYWxlOwotCi0gICAgICAgICAgICBpbnQzMl90IHByZXNzdXJlT3JpZ2luOwotICAgICAgICAgICAgZmxvYXQgcHJlc3N1cmVTY2FsZTsKLQotICAgICAgICAgICAgaW50MzJfdCBzaXplT3JpZ2luOwotICAgICAgICAgICAgZmxvYXQgc2l6ZVNjYWxlOwotICAgICAgICB9IHByZWNhbGN1bGF0ZWQ7Ci0KLSAgICAgICAgdm9pZCByZXNldCgpOwotCi0gICAgICAgIGJvb2wgYXBwbHlCYWRUb3VjaEZpbHRlcigpOwotICAgICAgICBib29sIGFwcGx5SnVtcHlUb3VjaEZpbHRlcigpOwotICAgICAgICB2b2lkIGFwcGx5QXZlcmFnaW5nVG91Y2hGaWx0ZXIoKTsKLSAgICAgICAgdm9pZCBjYWxjdWxhdGVQb2ludGVySWRzKCk7Ci0KLSAgICAgICAgYm9vbCBpc1BvaW50SW5zaWRlRGlzcGxheShpbnQzMl90IHgsIGludDMyX3QgeSkgY29uc3Q7Ci0gICAgfTsKLQotICAgIElucHV0RGV2aWNlKGludDMyX3QgaWQsIHVpbnQzMl90IGNsYXNzZXMsIFN0cmluZzggbmFtZSk7Ci0KLSAgICBpbnQzMl90IGlkOwotICAgIHVpbnQzMl90IGNsYXNzZXM7Ci0gICAgU3RyaW5nOCBuYW1lOwotICAgIGJvb2wgaWdub3JlZDsKLQotICAgIEtleWJvYXJkU3RhdGUga2V5Ym9hcmQ7Ci0gICAgVHJhY2tiYWxsU3RhdGUgdHJhY2tiYWxsOwotICAgIFRvdWNoU2NyZWVuU3RhdGUgdG91Y2hTY3JlZW47Ci0gICAgdW5pb24gewotICAgICAgICBTaW5nbGVUb3VjaFNjcmVlblN0YXRlIHNpbmdsZVRvdWNoU2NyZWVuOwotICAgICAgICBNdWx0aVRvdWNoU2NyZWVuU3RhdGUgbXVsdGlUb3VjaFNjcmVlbjsKLSAgICB9OwotCi0gICAgdm9pZCByZXNldCgpOwotCi0gICAgaW5saW5lIGJvb2wgaXNLZXlib2FyZCgpIGNvbnN0IHsgcmV0dXJuIGNsYXNzZXMgJiBJTlBVVF9ERVZJQ0VfQ0xBU1NfS0VZQk9BUkQ7IH0KLSAgICBpbmxpbmUgYm9vbCBpc0FscGhhS2V5KCkgY29uc3QgeyByZXR1cm4gY2xhc3NlcyAmIElOUFVUX0RFVklDRV9DTEFTU19BTFBIQUtFWTsgfQotICAgIGlubGluZSBib29sIGlzVHJhY2tiYWxsKCkgY29uc3QgeyByZXR1cm4gY2xhc3NlcyAmIElOUFVUX0RFVklDRV9DTEFTU19UUkFDS0JBTEw7IH0KLSAgICBpbmxpbmUgYm9vbCBpc0RQYWQoKSBjb25zdCB7IHJldHVybiBjbGFzc2VzICYgSU5QVVRfREVWSUNFX0NMQVNTX0RQQUQ7IH0KLSAgICBpbmxpbmUgYm9vbCBpc1NpbmdsZVRvdWNoU2NyZWVuKCkgY29uc3QgeyByZXR1cm4gKGNsYXNzZXMKLSAgICAgICAgICAgICYgKElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTiB8IElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTl9NVCkpCi0gICAgICAgICAgICA9PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU47IH0KLSAgICBpbmxpbmUgYm9vbCBpc011bHRpVG91Y2hTY3JlZW4oKSBjb25zdCB7IHJldHVybiBjbGFzc2VzCi0gICAgICAgICAgICAmIElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTl9NVDsgfQotICAgIGlubGluZSBib29sIGlzVG91Y2hTY3JlZW4oKSBjb25zdCB7IHJldHVybiBjbGFzc2VzCi0gICAgICAgICAgICAmIChJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU4gfCBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU5fTVQpOyB9Ci19OwotCi0KIC8qCiAgKiBJbnB1dCByZWFkZXIgcG9saWN5IGludGVyZmFjZS4KICAqCkBAIC0zOTAsMTEgKzk1LDkgQEAKICAgICB2aXJ0dWFsIGJvb2wgZ2V0RGlzcGxheUluZm8oaW50MzJfdCBkaXNwbGF5SWQsCiAgICAgICAgICAgICBpbnQzMl90KiB3aWR0aCwgaW50MzJfdCogaGVpZ2h0LCBpbnQzMl90KiBvcmllbnRhdGlvbikgPSAwOwogCi0gICAgLyogUHJvdmlkZXMgZmVlZGJhY2sgZm9yIGEgdmlydHVhbCBrZXkuCisgICAgLyogUHJvdmlkZXMgZmVlZGJhY2sgZm9yIGEgdmlydHVhbCBrZXkgZG93bi4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgdmlydHVhbEtleUZlZWRiYWNrKG5zZWNzX3Qgd2hlbiwgaW50MzJfdCBkZXZpY2VJZCwKLSAgICAgICAgICAgIGludDMyX3QgYWN0aW9uLCBpbnQzMl90IGZsYWdzLCBpbnQzMl90IGtleUNvZGUsCi0gICAgICAgICAgICBpbnQzMl90IHNjYW5Db2RlLCBpbnQzMl90IG1ldGFTdGF0ZSwgbnNlY3NfdCBkb3duVGltZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCB2aXJ0dWFsS2V5RG93bkZlZWRiYWNrKCkgPSAwOwogCiAgICAgLyogSW50ZXJjZXB0cyBhIGtleSBldmVudC4KICAgICAgKiBUaGUgcG9saWN5IGNhbiB1c2UgdGhpcyBtZXRob2QgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcGVyZm9ybSBwb3dlciBtYW5hZ2VtZW50IGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9JbnB1dFRyYW5zcG9ydC5oIGIvaW5jbHVkZS91aS9JbnB1dFRyYW5zcG9ydC5oCmluZGV4IDJkZmUyYTguLjIyNmQxZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvSW5wdXRUcmFuc3BvcnQuaAorKysgYi9pbmNsdWRlL3VpL0lucHV0VHJhbnNwb3J0LmgKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KICNpbmNsdWRlIDx1aS9JbnB1dC5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1BvbGxMb29wLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTMzMCwyNiArMzMxLDQgQEAKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0vKgotICogTkRLIGlucHV0IHF1ZXVlIEFQSS4KLSAqLwotc3RydWN0IEFJbnB1dFF1ZXVlIHsKLXB1YmxpYzoKLSAgICAvKiBDcmVhdGVzIGEgY29uc3VtZXIgYXNzb2NpYXRlZCB3aXRoIGFuIGlucHV0IGNoYW5uZWwuICovCi0gICAgZXhwbGljaXQgQUlucHV0UXVldWUoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SW5wdXRDaGFubmVsPiYgY2hhbm5lbCk7Ci0KLSAgICAvKiBEZXN0cm95cyB0aGUgY29uc3VtZXIgYW5kIHJlbGVhc2VzIGl0cyBpbnB1dCBjaGFubmVsLiAqLwotICAgIHZpcnR1YWwgfkFJbnB1dFF1ZXVlKCk7Ci0KLSAgICBpbmxpbmUgYW5kcm9pZDo6SW5wdXRDb25zdW1lciYgZ2V0Q29uc3VtZXIoKSB7IHJldHVybiBtQ29uc3VtZXI7IH0KLSAgICAKLSAgICBhbmRyb2lkOjpzdGF0dXNfdCBjb25zdW1lKGFuZHJvaWQ6OklucHV0RXZlbnQqKiBldmVudCk7Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIGRvRGVmYXVsdEtleShhbmRyb2lkOjpLZXlFdmVudCoga2V5RXZlbnQpID0gMDsKLSAgICAKLXByaXZhdGU6Ci0gICAgYW5kcm9pZDo6SW5wdXRDb25zdW1lciBtQ29uc3VtZXI7Ci0gICAgYW5kcm9pZDo6UHJlYWxsb2NhdGVkSW5wdXRFdmVudEZhY3RvcnkgbUlucHV0RXZlbnRGYWN0b3J5OwotfTsKLQogI2VuZGlmIC8vIF9VSV9JTlBVVF9UUkFOU1BPUlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9LZXljb2RlTGFiZWxzLmggYi9pbmNsdWRlL3VpL0tleWNvZGVMYWJlbHMuaAppbmRleCBlODFkMGY5Li5jOGQ2ZmZjIDEwMDc1NQotLS0gYS9pbmNsdWRlL3VpL0tleWNvZGVMYWJlbHMuaAorKysgYi9pbmNsdWRlL3VpL0tleWNvZGVMYWJlbHMuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBfVUlfS0VZQ09ERV9MQUJFTFNfSAogI2RlZmluZSBfVUlfS0VZQ09ERV9MQUJFTFNfSAogCisjaW5jbHVkZSA8YW5kcm9pZC9rZXljb2Rlcy5oPgorCiBzdHJ1Y3QgS2V5Y29kZUxhYmVsIHsKICAgICBjb25zdCBjaGFyICpsaXRlcmFsOwogICAgIGludCB2YWx1ZTsKQEAgLTExOCwxMTcgKzEyMCwyOCBAQAogICAgIHsgIlBBR0VfRE9XTiIsIDkzIH0sCiAgICAgeyAiUElDVFNZTUJPTFMiLCA5NCB9LAogICAgIHsgIlNXSVRDSF9DSEFSU0VUIiwgOTUgfSwKKyAgICB7ICJCVVRUT05fQSIsIDk2IH0sCisgICAgeyAiQlVUVE9OX0IiLCA5NyB9LAorICAgIHsgIkJVVFRPTl9DIiwgOTggfSwKKyAgICB7ICJCVVRUT05fWCIsIDk5IH0sCisgICAgeyAiQlVUVE9OX1kiLCAxMDAgfSwKKyAgICB7ICJCVVRUT05fWiIsIDEwMSB9LAorICAgIHsgIkJVVFRPTl9MMSIsIDEwMiB9LAorICAgIHsgIkJVVFRPTl9SMSIsIDEwMyB9LAorICAgIHsgIkJVVFRPTl9MMiIsIDEwNCB9LAorICAgIHsgIkJVVFRPTl9SMiIsIDEwNSB9LAorICAgIHsgIkJVVFRPTl9USFVNQkwiLCAxMDYgfSwKKyAgICB7ICJCVVRUT05fVEhVTUJSIiwgMTA3IH0sCisgICAgeyAiQlVUVE9OX1NUQVJUIiwgMTA4IH0sCisgICAgeyAiQlVUVE9OX1NFTEVDVCIsIDEwOSB9LAorICAgIHsgIkJVVFRPTl9NT0RFIiwgMTEwIH0sCiAKLSAgICAvLyBOT1RFOiBJZiB5b3UgYWRkIGEgbmV3IGtleWNvZGUgaGVyZSB5b3UgbXVzdCBhbHNvIGFkZCBpdCB0bzoKLSAgICAvLyAgIChlbnVtIEtleUNvZGUsIGluIHRoaXMgZmlsZSkKLSAgICAvLyAgIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0tleUV2ZW50LmphdmEKLSAgICAvLyAgIHRvb2xzL3B1cHBldF9tYXN0ZXIvUHVwcGV0TWFzdGVyLm5hdl9rZXlzLnB5Ci0gICAgLy8gICBmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKKyAgICAvLyBOT1RFOiBJZiB5b3UgYWRkIGEgbmV3IGtleWNvZGUgaGVyZSB5b3UgbXVzdCBhbHNvIGFkZCBpdCB0byBzZXZlcmFsIG90aGVyIGZpbGVzLgorICAgIC8vICAgICAgIFJlZmVyIHRvIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0tleUV2ZW50LmphdmEgZm9yIHRoZSBmdWxsIGxpc3QuCiAKICAgICB7IE5VTEwsIDAgfQogfTsKIAotLy8gVGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gbWF0Y2ggdGhlIGFib3ZlIG1hcHBpbmdzLgotdHlwZWRlZiBlbnVtIEtleUNvZGUgewotICAgIGtLZXlDb2RlVW5rbm93biA9IDAsCi0KLSAgICBrS2V5Q29kZVNvZnRMZWZ0ID0gMSwKLSAgICBrS2V5Q29kZVNvZnRSaWdodCA9IDIsCi0gICAga0tleUNvZGVIb21lID0gMywKLSAgICBrS2V5Q29kZUJhY2sgPSA0LAotICAgIGtLZXlDb2RlQ2FsbCA9IDUsCi0gICAga0tleUNvZGVFbmRDYWxsID0gNiwKLSAgICBrS2V5Q29kZTAgPSA3LAotICAgIGtLZXlDb2RlMSA9IDgsCi0gICAga0tleUNvZGUyID0gOSwKLSAgICBrS2V5Q29kZTMgPSAxMCwKLSAgICBrS2V5Q29kZTQgPSAxMSwKLSAgICBrS2V5Q29kZTUgPSAxMiwKLSAgICBrS2V5Q29kZTYgPSAxMywKLSAgICBrS2V5Q29kZTcgPSAxNCwKLSAgICBrS2V5Q29kZTggPSAxNSwKLSAgICBrS2V5Q29kZTkgPSAxNiwKLSAgICBrS2V5Q29kZVN0YXIgPSAxNywKLSAgICBrS2V5Q29kZVBvdW5kID0gMTgsCi0gICAga0tleUNvZGVEcGFkVXAgPSAxOSwKLSAgICBrS2V5Q29kZURwYWREb3duID0gMjAsCi0gICAga0tleUNvZGVEcGFkTGVmdCA9IDIxLAotICAgIGtLZXlDb2RlRHBhZFJpZ2h0ID0gMjIsCi0gICAga0tleUNvZGVEcGFkQ2VudGVyID0gMjMsCi0gICAga0tleUNvZGVWb2x1bWVVcCA9IDI0LAotICAgIGtLZXlDb2RlVm9sdW1lRG93biA9IDI1LAotICAgIGtLZXlDb2RlUG93ZXIgPSAyNiwKLSAgICBrS2V5Q29kZUNhbWVyYSA9IDI3LAotICAgIGtLZXlDb2RlQ2xlYXIgPSAyOCwKLSAgICBrS2V5Q29kZUEgPSAyOSwKLSAgICBrS2V5Q29kZUIgPSAzMCwKLSAgICBrS2V5Q29kZUMgPSAzMSwKLSAgICBrS2V5Q29kZUQgPSAzMiwKLSAgICBrS2V5Q29kZUUgPSAzMywKLSAgICBrS2V5Q29kZUYgPSAzNCwKLSAgICBrS2V5Q29kZUcgPSAzNSwKLSAgICBrS2V5Q29kZUggPSAzNiwKLSAgICBrS2V5Q29kZUkgPSAzNywKLSAgICBrS2V5Q29kZUogPSAzOCwKLSAgICBrS2V5Q29kZUsgPSAzOSwKLSAgICBrS2V5Q29kZUwgPSA0MCwKLSAgICBrS2V5Q29kZU0gPSA0MSwKLSAgICBrS2V5Q29kZU4gPSA0MiwKLSAgICBrS2V5Q29kZU8gPSA0MywKLSAgICBrS2V5Q29kZVAgPSA0NCwKLSAgICBrS2V5Q29kZVEgPSA0NSwKLSAgICBrS2V5Q29kZVIgPSA0NiwKLSAgICBrS2V5Q29kZVMgPSA0NywKLSAgICBrS2V5Q29kZVQgPSA0OCwKLSAgICBrS2V5Q29kZVUgPSA0OSwKLSAgICBrS2V5Q29kZVYgPSA1MCwKLSAgICBrS2V5Q29kZVcgPSA1MSwKLSAgICBrS2V5Q29kZVggPSA1MiwKLSAgICBrS2V5Q29kZVkgPSA1MywKLSAgICBrS2V5Q29kZVogPSA1NCwKLSAgICBrS2V5Q29kZUNvbW1hID0gNTUsCi0gICAga0tleUNvZGVQZXJpb2QgPSA1NiwKLSAgICBrS2V5Q29kZUFsdExlZnQgPSA1NywKLSAgICBrS2V5Q29kZUFsdFJpZ2h0ID0gNTgsCi0gICAga0tleUNvZGVTaGlmdExlZnQgPSA1OSwKLSAgICBrS2V5Q29kZVNoaWZ0UmlnaHQgPSA2MCwKLSAgICBrS2V5Q29kZVRhYiA9IDYxLAotICAgIGtLZXlDb2RlU3BhY2UgPSA2MiwKLSAgICBrS2V5Q29kZVN5bSA9IDYzLAotICAgIGtLZXlDb2RlRXhwbG9yZXIgPSA2NCwKLSAgICBrS2V5Q29kZUVudmVsb3BlID0gNjUsCi0gICAga0tleUNvZGVOZXdsaW5lID0gNjYsCi0gICAga0tleUNvZGVEZWwgPSA2NywKLSAgICBrS2V5Q29kZUdyYXZlID0gNjgsCi0gICAga0tleUNvZGVNaW51cyA9IDY5LAotICAgIGtLZXlDb2RlRXF1YWxzID0gNzAsCi0gICAga0tleUNvZGVMZWZ0QnJhY2tldCA9IDcxLAotICAgIGtLZXlDb2RlUmlnaHRCcmFja2V0ID0gNzIsCi0gICAga0tleUNvZGVCYWNrc2xhc2ggPSA3MywKLSAgICBrS2V5Q29kZVNlbWljb2xvbiA9IDc0LAotICAgIGtLZXlDb2RlQXBvc3Ryb3BoZSA9IDc1LAotICAgIGtLZXlDb2RlU2xhc2ggPSA3NiwKLSAgICBrS2V5Q29kZUF0ID0gNzcsCi0gICAga0tleUNvZGVOdW0gPSA3OCwKLSAgICBrS2V5Q29kZUhlYWRTZXRIb29rID0gNzksCi0gICAga0tleUNvZGVGb2N1cyA9IDgwLAotICAgIGtLZXlDb2RlUGx1cyA9IDgxLAotICAgIGtLZXlDb2RlTWVudSA9IDgyLAotICAgIGtLZXlDb2RlTm90aWZpY2F0aW9uID0gODMsCi0gICAga0tleUNvZGVTZWFyY2ggPSA4NCwKLSAgICBrS2V5Q29kZVBsYXlQYXVzZSA9IDg1LAotICAgIGtLZXlDb2RlU3RvcCA9IDg2LAotICAgIGtLZXlDb2RlTmV4dFNvbmcgPSA4NywKLSAgICBrS2V5Q29kZVByZXZpb3VzU29uZyA9IDg4LAotICAgIGtLZXlDb2RlUmV3aW5kID0gODksCi0gICAga0tleUNvZGVGb3J3YXJkID0gOTAsCi0gICAga0tleUNvZGVNdXRlID0gOTEsCi0gICAga0tleUNvZGVQYWdlVXAgPSA5MiwKLSAgICBrS2V5Q29kZVBhZ2VEb3duID0gOTMsCi0gICAga0tleUNvZGVQaWN0U3ltYm9scyA9IDk0LAotICAgIGtLZXlDb2RlU3dpdGNoQ2hhcnNldCA9IDk1Ci19IEtleUNvZGU7Ci0KIHN0YXRpYyBjb25zdCBLZXljb2RlTGFiZWwgRkxBR1NbXSA9IHsKICAgICB7ICJXQUtFIiwgMHgwMDAwMDAwMSB9LAogICAgIHsgIldBS0VfRFJPUFBFRCIsIDB4MDAwMDAwMDIgfSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvUmVjdC5oIGIvaW5jbHVkZS91aS9SZWN0LmgKaW5kZXggYTIxM2MwOS4uNGU2NWEyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91aS9SZWN0LmgKKysrIGIvaW5jbHVkZS91aS9SZWN0LmgKQEAgLTIwLDMxICsyMCwyOCBAQAogI2luY2x1ZGUgPHV0aWxzL1R5cGVIZWxwZXJzLmg+CiAjaW5jbHVkZSA8dWkvUG9pbnQuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvcmVjdC5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIFJlY3QKK2NsYXNzIFJlY3QgOiBwdWJsaWMgQVJlY3QKIHsKIHB1YmxpYzoKLSAgICBpbnQgbGVmdDsKLSAgICBpbnQgdG9wOwotICAgIGludCByaWdodDsKLSAgICBpbnQgYm90dG9tOwotCi0gICAgdHlwZWRlZiBpbnQgdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIGludDMyX3QgdmFsdWVfdHlwZTsKIAogICAgIC8vIHdlIGRvbid0IHByb3ZpZGUgY29weS1jdG9yIGFuZCBvcGVyYXRvcj0gb24gcHVycG9zZQogICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgZ2VuZXJhdGVkIHZlcnNpb25zCiAKICAgICBpbmxpbmUgUmVjdCgpIHsKICAgICB9Ci0gICAgaW5saW5lIFJlY3QoaW50IHcsIGludCBoKQotICAgICAgICA6IGxlZnQoMCksIHRvcCgwKSwgcmlnaHQodyksIGJvdHRvbShoKSB7CisgICAgaW5saW5lIFJlY3QoaW50MzJfdCB3LCBpbnQzMl90IGgpIHsKKyAgICAgICAgbGVmdCA9IHRvcCA9IDA7IHJpZ2h0ID0gdzsgYm90dG9tID0gaDsKICAgICB9Ci0gICAgaW5saW5lIFJlY3QoaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpCi0gICAgICAgIDogbGVmdChsKSwgdG9wKHQpLCByaWdodChyKSwgYm90dG9tKGIpIHsKKyAgICBpbmxpbmUgUmVjdChpbnQzMl90IGwsIGludDMyX3QgdCwgaW50MzJfdCByLCBpbnQzMl90IGIpIHsKKyAgICAgICAgbGVmdCA9IGw7IHRvcCA9IHQ7IHJpZ2h0ID0gcjsgYm90dG9tID0gYjsKICAgICB9Ci0gICAgaW5saW5lIFJlY3QoY29uc3QgUG9pbnQmIGx0LCBjb25zdCBQb2ludCYgcmIpIAotICAgICAgICA6IGxlZnQobHQueCksIHRvcChsdC55KSwgcmlnaHQocmIueCksIGJvdHRvbShyYi55KSB7CisgICAgaW5saW5lIFJlY3QoY29uc3QgUG9pbnQmIGx0LCBjb25zdCBQb2ludCYgcmIpIHsKKyAgICAgICAgbGVmdCA9IGx0Lng7IHRvcCA9IGx0Lnk7IHJpZ2h0ID0gcmIueDsgYm90dG9tID0gcmIueTsKICAgICB9CiAKICAgICB2b2lkIG1ha2VJbnZhbGlkKCk7CkBAIC02OCwxMiArNjUsMTIgQEAKICAgICB9CiAKICAgICAvLyByZWN0YW5nbGUncyB3aWR0aAotICAgIGlubGluZSBpbnQgd2lkdGgoKSBjb25zdCB7CisgICAgaW5saW5lIGludDMyX3Qgd2lkdGgoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiByaWdodC1sZWZ0OwogICAgIH0KICAgICAKICAgICAvLyByZWN0YW5nbGUncyBoZWlnaHQKLSAgICBpbmxpbmUgaW50IGhlaWdodCgpIGNvbnN0IHsKKyAgICBpbmxpbmUgaW50MzJfdCBoZWlnaHQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBib3R0b20tdG9wOwogICAgIH0KIApAQCAtMTM2LDEyICsxMzMsMTIgQEAKICAgICBjb25zdCBSZWN0IG9wZXJhdG9yICsgKGNvbnN0IFBvaW50JiByaHMpIGNvbnN0OwogICAgIGNvbnN0IFJlY3Qgb3BlcmF0b3IgLSAoY29uc3QgUG9pbnQmIHJocykgY29uc3Q7CiAKLSAgICB2b2lkIHRyYW5zbGF0ZShpbnQgZHgsIGludCBkeSkgeyAvLyBsZWdhY3ksIGRvbid0IHVzZS4KKyAgICB2b2lkIHRyYW5zbGF0ZShpbnQzMl90IGR4LCBpbnQzMl90IGR5KSB7IC8vIGxlZ2FjeSwgZG9uJ3QgdXNlLgogICAgICAgICBvZmZzZXRCeShkeCwgZHkpOwogICAgIH0KICAKLSAgICBSZWN0JiAgIG9mZnNldFRvKGludCB4LCBpbnQgeSk7Ci0gICAgUmVjdCYgICBvZmZzZXRCeShpbnQgeCwgaW50IHkpOworICAgIFJlY3QmICAgb2Zmc2V0VG8oaW50MzJfdCB4LCBpbnQzMl90IHkpOworICAgIFJlY3QmICAgb2Zmc2V0QnkoaW50MzJfdCB4LCBpbnQzMl90IHkpOwogICAgIGJvb2wgICAgaW50ZXJzZWN0KGNvbnN0IFJlY3QmIHdpdGgsIFJlY3QqIHJlc3VsdCkgY29uc3Q7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL09iYkZpbGUuaCBiL2luY2x1ZGUvdXRpbHMvT2JiRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTkyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3V0aWxzL09iYkZpbGUuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBPQkJGSUxFX0hfCisjZGVmaW5lIE9CQkZJTEVfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBPYmJGaWxlIDogcHVibGljIFJlZkJhc2UgeworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk9iYkZpbGUoKTsKKworcHVibGljOgorICAgIE9iYkZpbGUoKTsKKworICAgIGJvb2wgcmVhZEZyb20oY29uc3QgY2hhciogZmlsZW5hbWUpOworICAgIGJvb2wgcmVhZEZyb20oaW50IGZkKTsKKyAgICBib29sIHdyaXRlVG8oY29uc3QgY2hhciogZmlsZW5hbWUpOworICAgIGJvb2wgd3JpdGVUbyhpbnQgZmQpOworCisgICAgY29uc3QgY2hhciogZ2V0RmlsZU5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRmlsZU5hbWU7CisgICAgfQorCisgICAgY29uc3QgU3RyaW5nOCBnZXRQYWNrYWdlTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldFZlcnNpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVmVyc2lvbjsKKyAgICB9CisKKyAgICB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZzggcGFja2FnZU5hbWUpIHsKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisgICAgfQorCisgICAgdm9pZCBzZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikgeworICAgICAgICBtVmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXQ0TEUoY29uc3QgdW5zaWduZWQgY2hhciogYnVmKSB7CisgICAgICAgIHJldHVybiBidWZbMF0gfCAoYnVmWzFdIDw8IDgpIHwgKGJ1ZlsyXSA8PCAxNikgfCAoYnVmWzNdIDw8IDI0KTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgcHV0NExFKHVuc2lnbmVkIGNoYXIqIGJ1ZiwgdWludDMyX3QgdmFsKSB7CisgICAgICAgIGJ1ZlswXSA9IHZhbCAmIDB4RkY7CisgICAgICAgIGJ1ZlsxXSA9ICh2YWwgPj4gOCkgJiAweEZGOworICAgICAgICBidWZbMl0gPSAodmFsID4+IDE2KSAmIDB4RkY7CisgICAgICAgIGJ1ZlszXSA9ICh2YWwgPj4gMjQpICYgMHhGRjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyogUGFja2FnZSBuYW1lIHRoaXMgT2JiRmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggKi8KKyAgICBTdHJpbmc4IG1QYWNrYWdlTmFtZTsKKworICAgIC8qIFBhY2thZ2UgdmVyc2lvbiB0aGlzIE9iYkZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoICovCisgICAgaW50MzJfdCBtVmVyc2lvbjsKKworICAgIGNvbnN0IGNoYXIqIG1GaWxlTmFtZTsKKworICAgIHNpemVfdCBtRmlsZVNpemU7CisKKyAgICB1bnNpZ25lZCBjaGFyKiBtUmVhZEJ1ZjsKKworICAgIGJvb2wgcGFyc2VPYmJGaWxlKGludCBmZCk7Cit9OworCit9CisjZW5kaWYgLyogT0JCRklMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9Qb2xsTG9vcC5oIGIvaW5jbHVkZS91dGlscy9Qb2xsTG9vcC5oCmluZGV4IGE5NWZiMTcuLjgxMjMwZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXRpbHMvUG9sbExvb3AuaAorKysgYi9pbmNsdWRlL3V0aWxzL1BvbGxMb29wLmgKQEAgLTIyLDE3ICsyMiwyNyBAQAogCiAjaW5jbHVkZSA8c3lzL3BvbGwuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbG9vcGVyLmg+CisKK3N0cnVjdCBBTG9vcGVyIDogcHVibGljIGFuZHJvaWQ6OlJlZkJhc2UgeworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFMb29wZXIoKSB7IH0KKworcHVibGljOgorICAgIEFMb29wZXIoKSB7IH0KK307CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLyoqCiAgKiBBIGJhc2ljIGZpbGUgZGVzY3JpcHRvciBwb2xsaW5nIGxvb3AgYmFzZWQgb24gcG9sbCgpIHdpdGggY2FsbGJhY2tzLgogICovCi1jbGFzcyBQb2xsTG9vcCA6IHB1YmxpYyBSZWZCYXNlIHsKK2NsYXNzIFBvbGxMb29wIDogcHVibGljIEFMb29wZXIgewogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflBvbGxMb29wKCk7CiAKIHB1YmxpYzoKLSAgICBQb2xsTG9vcCgpOworICAgIFBvbGxMb29wKGJvb2wgYWxsb3dOb25DYWxsYmFja3MpOwogCiAgICAgLyoqCiAgICAgICogQSBjYWxsYmFjayB0aGF0IGl0IHRvIGJlIGludm9rZWQgd2hlbiBhbiBldmVudCBvY2N1cnMgb24gYSBmaWxlIGRlc2NyaXB0b3IuCkBAIC00NCw2ICs1NCwxMiBAQAogICAgICAqLwogICAgIHR5cGVkZWYgYm9vbCAoKkNhbGxiYWNrKShpbnQgZmQsIGludCBldmVudHMsIHZvaWQqIGRhdGEpOwogCisgICAgZW51bSB7CisgICAgICAgIFBPTExfQ0FMTEJBQ0sgPSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0ssCisgICAgICAgIFBPTExfVElNRU9VVCA9IEFMT09QRVJfUE9MTF9USU1FT1VULAorICAgICAgICBQT0xMX0VSUk9SID0gQUxPT1BFUl9QT0xMX0VSUk9SLAorICAgIH07CisgICAgCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgYSBzaW5nbGUgY2FsbCB0byBwb2xsKCkgd2l0aCBvcHRpb25hbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KICAgICAgKiBJbnZva2VzIGNhbGxiYWNrcyBmb3IgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb24gd2hpY2ggYW4gZXZlbnQgb2NjdXJyZWQuCkBAIC01MSwxNiArNjcsMjUgQEAKICAgICAgKiBJZiB0aGUgdGltZW91dCBpcyB6ZXJvLCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGhvdXQgYmxvY2tpbmcuCiAgICAgICogSWYgdGhlIHRpbWVvdXQgaXMgbmVnYXRpdmUsIHdhaXRzIGluZGVmaW5pdGVseSB1bnRpbCBhd29rZW4uCiAgICAgICoKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBjYWxsYmFjayB3YXMgaW52b2tlZCBvciBpZiB0aGUgbG9vcCB3YXMgYXdva2VuIGJ5IHdha2UoKS4KLSAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIGEgdGltZW91dCBvciBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiBSZXR1cm5zIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBpZiBhIGNhbGxiYWNrIHdhcyBpbnZva2VkLgogICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICogUmV0dXJucyBBTE9PUEVSX1BPTExfVElNRU9VVCBpZiB0aGVyZSB3YXMgbm8gZGF0YSBiZWZvcmUgdGhlIGdpdmVuCisgICAgICogdGltZW91dCBleHBpcmVkLgorICAgICAqCisgICAgICogUmV0dXJucyBBTE9QRVJfUE9MTF9FUlJPUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICAgKgorICAgICAqIFJldHVybnMgYSB2YWx1ZSA+PSAwIGNvbnRhaW5pbmcgYSBmaWxlIGRlc2NyaXB0b3IgaWYgaXQgaGFzIGRhdGEKKyAgICAgKiBhbmQgaXQgaGFzIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIChyZXF1aXJpbmcgdGhlIGNhbGxlciBoZXJlIHRvIGhhbmRsZSBpdCkuCisgICAgICogSW4gdGhpcyAoYW5kIG9ubHkgdGhpcykgY2FzZSBvdXRFdmVudHMgYW5kIG91dERhdGEgd2lsbCBjb250YWluIHRoZSBwb2xsCisgICAgICogZXZlbnRzIGFuZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIG9uIHRoZSB0aHJlYWQgb3duaW5nIHRoZSBQb2xsTG9vcC4KICAgICAgKiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgZWl0aGVyIGEgZmlsZSBkZXNjcmlwdG9yIGlzIHNpZ25hbGxlZCwgYSB0aW1lb3V0IG9jY3VycywKICAgICAgKiBvciB3YWtlKCkgaXMgY2FsbGVkLgogICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHJldHVybiB1bnRpbCBpdCBoYXMgZmluaXNoZWQgaW52b2tpbmcgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrcwogICAgICAqIGZvciBhbGwgZmlsZSBkZXNjcmlwdG9ycyB0aGF0IHdlcmUgc2lnbmFsbGVkLgogICAgICAqLwotICAgIGJvb2wgcG9sbE9uY2UoaW50IHRpbWVvdXRNaWxsaXMpOworICAgIGludDMyX3QgcG9sbE9uY2UoaW50IHRpbWVvdXRNaWxsaXMsIGludCogb3V0RXZlbnRzID0gTlVMTCwgdm9pZCoqIG91dERhdGEgPSBOVUxMKTsKIAogICAgIC8qKgogICAgICAqIFdha2VzIHRoZSBsb29wIGFzeW5jaHJvbm91c2x5LgpAQCAtNzEsNiArOTYsMTIgQEAKICAgICB2b2lkIHdha2UoKTsKIAogICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciB0aGlzIFBvbGxMb29wIGluc3RhbmNlIGFsbG93cyB1c2luZyBJRHMgaW5zdGVhZAorICAgICAqIG9mIGNhbGxiYWNrcy4KKyAgICAgKi8KKyAgICBib29sIGdldEFsbG93Tm9uQ2FsbGJhY2tzKCkgY29uc3Q7CisgICAgCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY2FsbGJhY2sgZm9yIGEgZmlsZSBkZXNjcmlwdG9yLCByZXBsYWNpbmcgdGhlIGV4aXN0aW5nIG9uZSwgaWYgYW55LgogICAgICAqIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBldmVudHMgPT0gMCBvciBjYWxsYmFjayA9PSBOVUxMLgogICAgICAqCkBAIC04Myw2ICsxMTQsMTIgQEAKICAgICB2b2lkIHNldENhbGxiYWNrKGludCBmZCwgaW50IGV2ZW50cywgQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIGRhdGEgPSBOVUxMKTsKIAogICAgIC8qKgorICAgICAqIExpa2Ugc2V0Q2FsbGJhY2soKSwgYnV0IGZvciB0aGUgTkRLIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgICAqLworICAgIHZvaWQgc2V0TG9vcGVyQ2FsbGJhY2soaW50IGZkLCBpbnQgZXZlbnRzLCBBTG9vcGVyX2NhbGxiYWNrRnVuYyogY2FsbGJhY2ssCisgICAgICAgICAgICB2b2lkKiBkYXRhKTsKKyAgICAKKyAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBjYWxsYmFjayBmb3IgYSBmaWxlIGRlc2NyaXB0b3IsIGlmIG9uZSBleGlzdHMuCiAgICAgICoKICAgICAgKiBXaGVuIHRoaXMgbWV0aG9kIHJldHVybnMsIGl0IGlzIHNhZmUgdG8gY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciBzaW5jZSB0aGUgcG9sbCBsb29wCkBAIC0xMDAsOSArMTM3LDIyIEBACiAgICAgICovCiAgICAgYm9vbCByZW1vdmVDYWxsYmFjayhpbnQgZmQpOwogCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnaXZlbiBQb2xsTG9vcCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogY2FsbGluZyB0aHJlYWQuICBUaGVyZSBtdXN0IGJlIGEgMToxIHJlbGF0aW9uc2hpcCBiZXR3ZWVuCisgICAgICogUG9sbExvb3AgYW5kIHRocmVhZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzZXRGb3JUaHJlYWQoY29uc3Qgc3A8UG9sbExvb3A+JiBwb2xsTG9vcCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQb2xsTG9vcCBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgdGhyZWFkLgorICAgICAqLworICAgIHN0YXRpYyBzcDxQb2xsTG9vcD4gZ2V0Rm9yVGhyZWFkKCk7CisgICAgCiBwcml2YXRlOgogICAgIHN0cnVjdCBSZXF1ZXN0ZWRDYWxsYmFjayB7CiAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrOworICAgICAgICBBTG9vcGVyX2NhbGxiYWNrRnVuYyogbG9vcGVyQ2FsbGJhY2s7CiAgICAgICAgIHZvaWQqIGRhdGE7CiAgICAgfTsKIApAQCAtMTEwLDkgKzE2MCwxMiBAQAogICAgICAgICBpbnQgZmQ7CiAgICAgICAgIGludCBldmVudHM7CiAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrOworICAgICAgICBBTG9vcGVyX2NhbGxiYWNrRnVuYyogbG9vcGVyQ2FsbGJhY2s7CiAgICAgICAgIHZvaWQqIGRhdGE7CiAgICAgfTsKLQorICAgIAorICAgIGNvbnN0IGJvb2wgbUFsbG93Tm9uQ2FsbGJhY2tzOworICAgIAogICAgIE11dGV4IG1Mb2NrOwogICAgIGJvb2wgbVBvbGxpbmc7CiAgICAgdWludDMyX3QgbVdhaXRlcnM7CkBAIC0xMjYsMTIgKzE3OSwxNyBAQAogICAgIFZlY3RvcjxSZXF1ZXN0ZWRDYWxsYmFjaz4gbVJlcXVlc3RlZENhbGxiYWNrczsKIAogICAgIFZlY3RvcjxQZW5kaW5nQ2FsbGJhY2s+IG1QZW5kaW5nQ2FsbGJhY2tzOyAvLyB1c2VkIHByaXZhdGVseSBieSBwb2xsT25jZQotCisgICAgVmVjdG9yPFBlbmRpbmdDYWxsYmFjaz4gbVBlbmRpbmdGZHM7ICAgICAgIC8vIHVzZWQgcHJpdmF0ZWx5IGJ5IHBvbGxPbmNlCisgICAgc2l6ZV90IG1QZW5kaW5nRmRzUG9zOworICAgIAogICAgIHZvaWQgb3Blbldha2VQaXBlKCk7CiAgICAgdm9pZCBjbG9zZVdha2VQaXBlKCk7CiAKKyAgICB2b2lkIHNldENhbGxiYWNrQ29tbW9uKGludCBmZCwgaW50IGV2ZW50cywgQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICBBTG9vcGVyX2NhbGxiYWNrRnVuYyogbG9vcGVyQ2FsbGJhY2ssIHZvaWQqIGRhdGEpOwogICAgIHNzaXplX3QgZ2V0UmVxdWVzdEluZGV4TG9ja2VkKGludCBmZCk7CiAgICAgdm9pZCB3YWtlQW5kTG9jaygpOworICAgIHN0YXRpYyB2b2lkIHRocmVhZERlc3RydWN0b3Iodm9pZCAqc3QpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggNDhjMDRhNi4uOTdlYjZjMCAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC01Miw2ICs1Miw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyB0aGUgc2ltIGJ1aWxkIGRvZXNuJ3QgaGF2ZSBnZXR0aWQKQEAgLTQ0OTgsNiArNDQ5OSwxMSBAQAogICAgIHJldHVybiBFZmZlY3RHZXREZXNjcmlwdG9yKHBVdWlkLCBkZXNjcmlwdG9yKTsKIH0KIAorCisvLyB0aGlzIFVVSUQgbXVzdCBtYXRjaCB0aGUgb25lIGRlZmluZWQgaW4gbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RWaXN1YWxpemVyLmNwcAorc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgVklTVUFMSVpBVElPTl9VVUlEXyA9CisgICAgezB4ZDA2OWQ5ZTAsIDB4ODMyOSwgMHgxMWRmLCAweDkxNjgsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX07CisKIHNwPElFZmZlY3Q+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KHBpZF90IHBpZCwKICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCiAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCkBAIC00NTI1LDYgKzQ1MzEsMTUgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKKyAgICAgICAgLy8gY2hlY2sgcmVjb3JkaW5nIHBlcm1pc3Npb24gZm9yIHZpc3VhbGl6ZXIKKyAgICAgICAgaWYgKG1lbWNtcCgmcERlc2MtPnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDAgfHwKKyAgICAgICAgICAgIG1lbWNtcCgmcERlc2MtPnV1aWQsICZWSVNVQUxJWkFUSU9OX1VVSURfLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgIGlmICghcmVjb3JkaW5nQWxsb3dlZCgpKSB7CisgICAgICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmICghRWZmZWN0SXNOdWxsVXVpZCgmcERlc2MtPnV1aWQpKSB7CiAgICAgICAgICAgICAvLyBpZiB1dWlkIGlzIHNwZWNpZmllZCwgcmVxdWVzdCBlZmZlY3QgZGVzY3JpcHRvcgogICAgICAgICAgICAgbFN0YXR1cyA9IEVmZmVjdEdldERlc2NyaXB0b3IoJnBEZXNjLT51dWlkLCAmZGVzYyk7CkBAIC01MDY5LDE1ICs1MDg0LDUzIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjp1cGRhdGVTdGF0ZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICBjYXNlIFJFU1RBUlQ6CisgICAgICAgIHJlc2V0X2woKTsKKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIFNUQVJUSU5HOgorICAgICAgICAvLyBjbGVhciBhdXhpbGlhcnkgZWZmZWN0IGlucHV0IGJ1ZmZlciBmb3IgbmV4dCBhY2N1bXVsYXRpb24KKyAgICAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgICAgIG1lbXNldChtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcsCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KnNpemVvZihpbnQzMl90KSk7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRfbCgpOworICAgICAgICBtU3RhdGUgPSBBQ1RJVkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RPUFBJTkc6CisgICAgICAgIHN0b3BfbCgpOworICAgICAgICBtRGlzYWJsZVdhaXRDbnQgPSBtTWF4RGlzYWJsZVdhaXRDbnQ7CisgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RPUFBFRDoKKyAgICAgICAgLy8gbURpc2FibGVXYWl0Q250IGlzIGZvcmNlZCB0byAxIGJ5IHByb2Nlc3MoKSB3aGVuIHRoZSBlbmdpbmUgaW5kaWNhdGVzIHRoZSBlbmQgb2YgdGhlCisgICAgICAgIC8vIHR1cm4gb2ZmIHNlcXVlbmNlLgorICAgICAgICBpZiAoLS1tRGlzYWJsZVdhaXRDbnQgPT0gMCkgeworICAgICAgICAgICAgcmVzZXRfbCgpOworICAgICAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvL0lETEUgLCBBQ1RJVkUKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpwcm9jZXNzKCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgPT0gTlVMTCB8fCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPT0gTlVMTCB8fCBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3ID09IE5VTEwpIHsKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSA9PSBOVUxMIHx8CisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPT0gTlVMTCB8fAorICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAobVN0YXRlICE9IElETEUpIHsKKyAgICBpZiAobVN0YXRlID09IEFDVElWRSB8fCBtU3RhdGUgPT0gU1RPUFBJTkcgfHwgbVN0YXRlID09IFNUT1BQRUQpIHsKICAgICAgICAgLy8gZG8gMzIgYml0IHRvIDE2IGJpdCBjb252ZXJzaW9uIGZvciBhdXhpbGlhcnkgZWZmZWN0IGlucHV0IGJ1ZmZlcgogICAgICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICAgICAgQXVkaW9NaXhlcjo6ZGl0aGVyQW5kQ2xhbXAobUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczMyLApAQCAtNTA4NSwzMyArNTEzOCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVE9ETzogaGFuZGxlIGVmZmVjdHMgd2l0aCBidWZmZXIgcHJvdmlkZXIKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBBQ1RJVkUpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgICAgIHJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBUlRJTkc7Ci0gICAgICAgICAgICAgICAgLy8gY2xlYXIgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBidWZmZXIgZm9yIG5leHQgYWNjdW11bGF0aW9uCi0gICAgICAgICAgICAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywgMCwgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCpzaXplb2YoaW50MzJfdCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIFNUQVJUSU5HOgotICAgICAgICAgICAgICAgIHN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gQUNUSVZFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVE9QUElORzoKLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUEVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVE9QUEVEOgotICAgICAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBJRExFOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIC8vIGRvIHRoZSBhY3R1YWwgcHJvY2Vzc2luZyBpbiB0aGUgZWZmZWN0IGVuZ2luZQotICAgICAgICAoKm1FZmZlY3RJbnRlcmZhY2UpLT5wcm9jZXNzKG1FZmZlY3RJbnRlcmZhY2UsICZtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlciwgJm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlcik7CisgICAgICAgIGludCByZXQgPSAoKm1FZmZlY3RJbnRlcmZhY2UpLT5wcm9jZXNzKG1FZmZlY3RJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlcik7CisKKyAgICAgICAgLy8gZm9yY2UgdHJhbnNpdGlvbiB0byBJRExFIHN0YXRlIHdoZW4gZW5naW5lIGlzIHJlYWR5CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBFRCAmJiByZXQgPT0gLUVOT0RBVEEpIHsKKyAgICAgICAgICAgIG1EaXNhYmxlV2FpdENudCA9IDE7CisgICAgICAgIH0KIAogICAgICAgICAvLyBjbGVhciBhdXhpbGlhcnkgZWZmZWN0IGlucHV0IGJ1ZmZlciBmb3IgbmV4dCBhY2N1bXVsYXRpb24KICAgICAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKQEAgLTUxMzIsNyArNTE2Nyw3IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpyZXNldCgpCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpyZXNldF9sKCkKIHsKICAgICBpZiAobUVmZmVjdEludGVyZmFjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTUyMDAsMTEgKzUyMzUsMTYgQEAKICAgICBpZiAoc3RhdHVzID09IDApIHsKICAgICAgICAgc3RhdHVzID0gY21kU3RhdHVzOwogICAgIH0KKworICAgIG1NYXhEaXNhYmxlV2FpdENudCA9IChNQVhfRElTQUJMRV9USU1FX01TICogbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKSAvCisgICAgICAgICAgICAoMTAwMCAqIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjppbml0KCkKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtNTIxNyw3ICs1MjU3LDcgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c3RhcnQoKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnN0YXJ0X2woKQogewogICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC01MjMxLDcgKzUyNzEsNyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzdG9wKCkKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzdG9wX2woKQogewogICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC01MjQ3LDcgKzUyODcsOCBAQAogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6Y29tbWFuZChpbnQgY21kQ29kZSwgaW50IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCBpbnQgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkKIHsKLSAgICBMT0dWKCJjb21tYW5kKCksIGNtZENvZGU6ICVkLCBtRWZmZWN0SW50ZXJmYWNlOiAlcCIsIGNtZENvZGUsIG1FZmZlY3RJbnRlcmZhY2UpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisvLyAgICBMT0dWKCJjb21tYW5kKCksIGNtZENvZGU6ICVkLCBtRWZmZWN0SW50ZXJmYWNlOiAlcCIsIGNtZENvZGUsIG1FZmZlY3RJbnRlcmZhY2UpOwogCiAgICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTUyNTUsNyArNTI5Niw2IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLCBjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKICAgICBpZiAoY21kQ29kZSAhPSBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAmJiBzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaW50IHNpemUgPSAocmVwbHlTaXplID09IE5VTEwpID8gMCA6ICpyZXBseVNpemU7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbUhhbmRsZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gaCA9IG1IYW5kbGVzW2ldLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChoICE9IDApIHsKQEAgLTUyNzUsMjEgKzUzMTUsMTkgQEAKICAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgLy8gZ29pbmcgZnJvbSBkaXNhYmxlZCB0byBlbmFibGVkCiAgICAgICAgIGNhc2UgSURMRToKLSAgICAgICAgICAgIG1TdGF0ZSA9IFJFU0VUOworICAgICAgICAgICAgbVN0YXRlID0gU1RBUlRJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVE9QUEVEOgorICAgICAgICAgICAgbVN0YXRlID0gUkVTVEFSVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNUT1BQSU5HOgogICAgICAgICAgICAgbVN0YXRlID0gQUNUSVZFOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUFBFRDoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVJUSU5HOwotICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgLy8gZ29pbmcgZnJvbSBlbmFibGVkIHRvIGRpc2FibGVkCi0gICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgICAgICBtU3RhdGUgPSBJRExFOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVTVEFSVDoKICAgICAgICAgY2FzZSBTVEFSVElORzoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgICAgICBtU3RhdGUgPSBJRExFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUNUSVZFOgogICAgICAgICAgICAgbVN0YXRlID0gU1RPUFBJTkc7CkBAIC01MzA4LDcgKzUzNDYsNyBAQAogYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6aXNFbmFibGVkKCkKIHsKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgIGNhc2UgUkVTRVQ6CisgICAgY2FzZSBSRVNUQVJUOgogICAgIGNhc2UgU1RBUlRJTkc6CiAgICAgY2FzZSBBQ1RJVkU6CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNTMyMiw2ICs1MzYwLDcgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldFZvbHVtZSh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0LCBib29sIGNvbnRyb2xsZXIpCiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKIAogICAgIC8vIFNlbmQgdm9sdW1lIGluZGljYXRpb24gaWYgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCBpcyBzZXQgYW5kIHJlYWQgYmFjayBhbHRlcmVkIHZvbHVtZQpAQCAtNTM0Nyw2ICs1Mzg2LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldERldmljZSh1aW50MzJfdCBkZXZpY2UpCiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0spID09IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpIHsKICAgICAgICAgLy8gY29udmVydCBkZXZpY2UgYml0IGZpZWxkIGZyb20gQXVkaW9TeXN0ZW0gdG8gRWZmZWN0QXBpIGZvcm1hdC4KQEAgLTUzNjYsNiArNTQwNiw3IEBACiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzZXRNb2RlKHVpbnQzMl90IG1vZGUpCiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORCkgewogICAgICAgICAvLyBjb252ZXJ0IGF1ZGlvIG1vZGUgZnJvbSBBdWRpb1N5c3RlbSB0byBFZmZlY3RBcGkgZm9ybWF0LgpAQCAtNTU4Niw3ICs1NjI3LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmNvbW1hbmQoaW50IGNtZENvZGUsIGludCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwgaW50ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpCiB7Ci0gICAgTE9HVigiY29tbWFuZCgpLCBjbWRDb2RlOiAlZCwgbUhhc0NvbnRyb2w6ICVkLCBtRWZmZWN0OiAlcCIsIGNtZENvZGUsIG1IYXNDb250cm9sLCAobUVmZmVjdCA9PSAwKSA/IDAgOiBtRWZmZWN0LmdldCgpKTsKKy8vICAgIExPR1YoImNvbW1hbmQoKSwgY21kQ29kZTogJWQsIG1IYXNDb250cm9sOiAlZCwgbUVmZmVjdDogJXAiLCBjbWRDb2RlLCBtSGFzQ29udHJvbCwgKG1FZmZlY3QgPT0gMCkgPyAwIDogbUVmZmVjdC5nZXQoKSk7CiAKICAgICAvLyBvbmx5IGdldCBwYXJhbWV0ZXIgY29tbWFuZCBpcyBwZXJtaXR0ZWQgZm9yIGFwcGxpY2F0aW9ucyBub3QgY29udHJvbGxpbmcgdGhlIGVmZmVjdAogICAgIGlmICghbUhhc0NvbnRyb2wgJiYgY21kQ29kZSAhPSBFRkZFQ1RfQ01EX0dFVF9QQVJBTSkgewpAQCAtNTc1Miw2ICs1NzkzLDkgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBtRWZmZWN0c1tpXS0+cHJvY2VzcygpOwogICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBtRWZmZWN0c1tpXS0+dXBkYXRlU3RhdGUoKTsKKyAgICB9CiAgICAgLy8gaWYgbm8gdHJhY2sgaXMgYWN0aXZlLCBpbnB1dCBidWZmZXIgbXVzdCBiZSBjbGVhcmVkIGhlcmUgYXMgdGhlIG1peGVyIHByb2Nlc3MKICAgICAvLyB3aWxsIG5vdCBkbyBpdAogICAgIGlmIChtU2Vzc2lvbklkID4gMCAmJiBhY3RpdmVUcmFja3MoKSA9PSAwKSB7CmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDQyZGNhNGMuLjUwN2M5YWMgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC05MDUsNyArOTA1LDcgQEAKIAogICAgICAgICBlbnVtIGVmZmVjdF9zdGF0ZSB7CiAgICAgICAgICAgICBJRExFLAotICAgICAgICAgICAgUkVTRVQsCisgICAgICAgICAgICBSRVNUQVJULAogICAgICAgICAgICAgU1RBUlRJTkcsCiAgICAgICAgICAgICBBQ1RJVkUsCiAgICAgICAgICAgICBTVE9QUElORywKQEAgLTkxNCw5ICs5MTQsMTAgQEAKIAogICAgICAgICBpbnQgICAgICAgICBpZCgpIHsgcmV0dXJuIG1JZDsgfQogICAgICAgICB2b2lkIHByb2Nlc3MoKTsKKyAgICAgICAgdm9pZCB1cGRhdGVTdGF0ZSgpOwogICAgICAgICBzdGF0dXNfdCBjb21tYW5kKGludCBjbWRDb2RlLCBpbnQgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIGludCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKIAotICAgICAgICB2b2lkIHJlc2V0KCk7CisgICAgICAgIHZvaWQgcmVzZXRfbCgpOwogICAgICAgICBzdGF0dXNfdCBjb25maWd1cmUoKTsKICAgICAgICAgc3RhdHVzX3QgaW5pdCgpOwogICAgICAgICB1aW50MzJfdCBzdGF0ZSgpIHsKQEAgLTk0OCwxMSArOTQ5LDE0IEBACiAKICAgICBwcm90ZWN0ZWQ6CiAKKyAgICAgICAgLy8gTWF4aW11bSB0aW1lIGFsbG9jYXRlZCB0byBlZmZlY3QgZW5naW5lcyB0byBjb21wbGV0ZSB0aGUgdHVybiBvZmYgc2VxdWVuY2UKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9ESVNBQkxFX1RJTUVfTVMgPSAxMDAwMDsKKwogICAgICAgICBFZmZlY3RNb2R1bGUoY29uc3QgRWZmZWN0TW9kdWxlJik7CiAgICAgICAgIEVmZmVjdE1vZHVsZSYgb3BlcmF0b3IgPSAoY29uc3QgRWZmZWN0TW9kdWxlJik7CiAKLSAgICAgICAgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RvcCgpOworICAgICAgICBzdGF0dXNfdCBzdGFydF9sKCk7CisgICAgICAgIHN0YXR1c190IHN0b3BfbCgpOwogCiAgICAgICAgIC8vIHVwZGF0ZSB0aGlzIHRhYmxlIHdoZW4gQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgb3IgYXVkaW9fZGV2aWNlX2UgKGluIEVmZmVjdEFwaS5oKSBhcmUgbW9kaWZpZWQKICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHNEZXZpY2VDb252VGFibGVbXTsKQEAgLTk3Myw2ICs5NzcsOSBAQAogICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOyAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uIHN0YXR1cwogICAgICAgICB1aW50MzJfdCBtU3RhdGU7ICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYWN0aXZhdGlvbiBzdGF0ZSAoZWZmZWN0X3N0YXRlKQogICAgICAgICBWZWN0b3I8IHdwPEVmZmVjdEhhbmRsZT4gPiBtSGFuZGxlczsgICAgLy8gbGlzdCBvZiBjbGllbnQgaGFuZGxlcworICAgICAgICB1aW50MzJfdCBtTWF4RGlzYWJsZVdhaXRDbnQ7ICAgIC8vIG1heGltdW0gZ3JhY2UgcGVyaW9kIGJlZm9yZSBmb3JjaW5nIGFuIGVmZmVjdCBvZmYgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kaW5nIGRpc2FibGUgY29tbWFuZC4KKyAgICAgICAgdWludDMyX3QgbURpc2FibGVXYWl0Q250OyAgICAgICAvLyBjdXJyZW50IHByb2Nlc3MoKSBjYWxscyBjb3VudCBkdXJpbmcgZGlzYWJsZSBwZXJpb2QuCiAgICAgfTsKIAogICAgIC8vIFRoZSBFZmZlY3RIYW5kbGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgSUVmZmVjdCBpbnRlcmZhY2UuIEl0IHByb3ZpZGVzIHJlc291cmNlcwpkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvSVBlcm1pc3Npb25Db250cm9sbGVyLmNwcCBiL2xpYnMvYmluZGVyL0lQZXJtaXNzaW9uQ29udHJvbGxlci5jcHAKaW5kZXggYmZmNGM5Yi4uZTEzMDM2ZiAxMDA2NDQKLS0tIGEvbGlicy9iaW5kZXIvSVBlcm1pc3Npb25Db250cm9sbGVyLmNwcAorKysgYi9saWJzL2JpbmRlci9JUGVybWlzc2lvbkNvbnRyb2xsZXIuY3BwCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIDogQnBJbnRlcmZhY2U8SVBlcm1pc3Npb25Db250cm9sbGVyPihpbXBsKQogICAgIHsKICAgICB9Ci0gICAgICAgIAorCiAgICAgdmlydHVhbCBib29sIGNoZWNrUGVybWlzc2lvbihjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwgaW50MzJfdCBwaWQsIGludDMyX3QgdWlkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNDYsNyArNDYsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENIRUNLX1BFUk1JU1NJT05fVFJBTlNBQ1RJT04sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIC8vIGZhaWwgb24gZXhjZXB0aW9uCi0gICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSByZXR1cm4gMDsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCkgIT0gMCkgcmV0dXJuIDA7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKSAhPSAwOwogICAgIH0KIH07CkBAIC02Niw4ICs2Niw3IEBACiAgICAgICAgICAgICBpbnQzMl90IHBpZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQzMl90IHVpZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBib29sIHJlcyA9IGNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uLCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICAvLyB3cml0ZSBleGNlcHRpb24KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlcyA/IDEgOiAwKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTc3LDQgKzc2LDMgQEAKIH0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmNwcCBiL2xpYnMvYmluZGVyL0lTZXJ2aWNlTWFuYWdlci5jcHAKaW5kZXggYTNhM2YwZS4uMWZhNGMzNSAxMDA2NDQKLS0tIGEvbGlicy9iaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmNwcAorKysgYi9saWJzL2JpbmRlci9JU2VydmljZU1hbmFnZXIuY3BwCkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG5hbWUpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNlcnZpY2UpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoQUREX1NFUlZJQ0VfVFJBTlNBQ1RJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBlcnIgPT0gTk9fRVJST1IgPyByZXBseS5yZWFkSW50MzIoKSA6IGVycjsKKyAgICAgICAgcmV0dXJuIGVyciA9PSBOT19FUlJPUiA/IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCkgOiBlcnI7CiAgICAgfQogCiAgICAgdmlydHVhbCBWZWN0b3I8U3RyaW5nMTY+IGxpc3RTZXJ2aWNlcygpCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9QYXJjZWwuY3BwIGIvbGlicy9iaW5kZXIvUGFyY2VsLmNwcAppbmRleCBjMjU3NGJkLi40N2JlMWJmIDEwMDY0NAotLS0gYS9saWJzL2JpbmRlci9QYXJjZWwuY3BwCisrKyBiL2xpYnMvYmluZGVyL1BhcmNlbC5jcHAKQEAgLTc1NCw2ICs3NTQsMTEgQEAKICAgICBnb3RvIHJlc3RhcnRfd3JpdGU7CiB9CiAKK3N0YXR1c190IFBhcmNlbDo6d3JpdGVOb0V4Y2VwdGlvbigpCit7CisgICAgcmV0dXJuIHdyaXRlSW50MzIoMCk7Cit9CisKIHZvaWQgUGFyY2VsOjpyZW1vdmUoc2l6ZV90IHN0YXJ0LCBzaXplX3QgYW10KQogewogICAgIExPR19BTFdBWVNfRkFUQUwoIlBhcmNlbDo6cmVtb3ZlKCkgbm90IHlldCBpbXBsZW1lbnRlZCEiKTsKQEAgLTk0Miw2ICs5NDcsMTIgQEAKICAgICByZXR1cm4gdmFsOwogfQogCitpbnQzMl90IFBhcmNlbDo6cmVhZEV4Y2VwdGlvbkNvZGUoKSBjb25zdAoreworICBpbnQzMl90IGV4Y2VwdGlvbl9jb2RlID0gcmVhZEFsaWduZWQ8aW50MzJfdD4oKTsKKyAgLy8gVE9ETzogc2tpcCBvdmVyIHRoZSByZXNwb25zZSBoZWFkZXIgaGVyZSwgb25jZSB0aGF0J3MgaW4uCisgIHJldHVybiBleGNlcHRpb25fY29kZTsKK30KIAogbmF0aXZlX2hhbmRsZSogUGFyY2VsOjpyZWFkTmF0aXZlSGFuZGxlKCkgY29uc3QKIHsKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9BbmRyb2lkLm1rIGIvbGlicy9od3VpL0FuZHJvaWQubWsKaW5kZXggOTVlYmRhMS4uODA5Zjc0ZDYgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9BbmRyb2lkLm1rCisrKyBiL2xpYnMvaHd1aS9BbmRyb2lkLm1rCkBAIC0yLDggKzIsMTEgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCisJTGF5ZXJDYWNoZS5jcHAgXAogCU1hdHJpeC5jcHAgXAogCU9wZW5HTFJlbmRlcmVyLmNwcCBcCisJUGF0Y2guY3BwIFwKKwlQYXRjaENhY2hlLmNwcCBcCiAJUHJvZ3JhbS5jcHAgXAogCVRleHR1cmVDYWNoZS5jcHAKIApAQCAtMTgsNyArMjEsNyBAQAogCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU0hBUkVEX0xJQlJBUklFUwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlidXRpbHMgbGliR0xFU3YyIGxpYnNraWEKLUxPQ0FMX01PRFVMRTo9IGxpYmh3dWkKK0xPQ0FMX01PRFVMRSA6PSBsaWJod3VpCiBMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvR2VuZXJhdGlvbkNhY2hlLmggYi9saWJzL2h3dWkvR2VuZXJhdGlvbkNhY2hlLmgKaW5kZXggNGEzY2E3Ny4uNWMxYjVlMSAxMDA2NDQKLS0tIGEvbGlicy9od3VpL0dlbmVyYXRpb25DYWNoZS5oCisrKyBiL2xpYnMvaHd1aS9HZW5lcmF0aW9uQ2FjaGUuaApAQCAtMjcsNjUgKzI3LDc4IEBACiBjbGFzcyBPbkVudHJ5UmVtb3ZlZCB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCB+T25FbnRyeVJlbW92ZWQoKSB7IH07Ci0gICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoRW50cnlLZXkga2V5LCBFbnRyeVZhbHVlIHZhbHVlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoRW50cnlLZXkmIGtleSwgRW50cnlWYWx1ZSYgdmFsdWUpID0gMDsKIH07IC8vIGNsYXNzIE9uRW50cnlSZW1vdmVkCiAKK3RlbXBsYXRlPHR5cGVuYW1lIEVudHJ5S2V5LCB0eXBlbmFtZSBFbnRyeVZhbHVlPgorc3RydWN0IEVudHJ5OiBwdWJsaWMgTGlnaHRSZWZCYXNlPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHsKKyAgICBFbnRyeSgpIHsgfQorICAgIEVudHJ5KGNvbnN0IEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiYgZSk6CisgICAgICAgICAgICBrZXkoZS5rZXkpLCB2YWx1ZShlLnZhbHVlKSwgaW5kZXgoZS5pbmRleCksIHBhcmVudChlLnBhcmVudCksIGNoaWxkKGUuY2hpbGQpIHsgfQorICAgIEVudHJ5KHNwPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IGUpOgorICAgICAgICAgICAga2V5KGUtPmtleSksIHZhbHVlKGUtPnZhbHVlKSwgaW5kZXgoZS0+aW5kZXgpLCBwYXJlbnQoZS0+cGFyZW50KSwgY2hpbGQoZS0+Y2hpbGQpIHsgfQorCisgICAgRW50cnlLZXkga2V5OworICAgIEVudHJ5VmFsdWUgdmFsdWU7CisgICAgc3NpemVfdCBpbmRleDsKKworICAgIHNwPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHBhcmVudDsKKyAgICBzcDxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiBjaGlsZDsKK307IC8vIHN0cnVjdCBFbnRyeQorCiB0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgogY2xhc3MgR2VuZXJhdGlvbkNhY2hlIHsKIHB1YmxpYzoKLSAgICBHZW5lcmF0aW9uQ2FjaGUodW5zaWduZWQgaW50IG1heENhcGFjaXR5KTogbU1heENhcGFjaXR5KG1heENhcGFjaXR5KSwgbUxpc3RlbmVyKE5VTEwpIHsgfTsKLSAgICB+R2VuZXJhdGlvbkNhY2hlKCkgeyBjbGVhcigpOyB9OworICAgIEdlbmVyYXRpb25DYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSk7CisgICAgdmlydHVhbCB+R2VuZXJhdGlvbkNhY2hlKCk7CiAKLSAgICB2b2lkIHNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIoT25FbnRyeVJlbW92ZWQ8SyosIFYqPiogbGlzdGVuZXIpOworICAgIGVudW0gQ2FwYWNpdHkgeworICAgICAgICBrVW5saW1pdGVkQ2FwYWNpdHksCisgICAgfTsKKworICAgIHZvaWQgc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihPbkVudHJ5UmVtb3ZlZDxLLCBWPiogbGlzdGVuZXIpOwogCiAgICAgdm9pZCBjbGVhcigpOwogCi0gICAgYm9vbCBjb250YWlucyhLKiBrZXkpIGNvbnN0OwotICAgIFYqIGdldChLKiBrZXkpOwotICAgIHZvaWQgcHV0KEsqIGtleSwgViogdmFsdWUpOwotICAgIFYqIHJlbW92ZShLKiBrZXkpOworICAgIGJvb2wgY29udGFpbnMoSyBrZXkpIGNvbnN0OworICAgIFYgZ2V0KEsga2V5KTsKKyAgICB2b2lkIHB1dChLIGtleSwgViB2YWx1ZSk7CisgICAgViByZW1vdmUoSyBrZXkpOworICAgIFYgcmVtb3ZlT2xkZXN0KCk7CiAKLSAgICB1bnNpZ25lZCBpbnQgc2l6ZSgpIGNvbnN0OworICAgIHVpbnQzMl90IHNpemUoKSBjb25zdDsKIAotcHJpdmF0ZToKLSAgICB2b2lkIHJlbW92ZU9sZGVzdCgpOworICAgIHZvaWQgYWRkVG9DYWNoZShzcDxFbnRyeTxLLCBWPiA+IGVudHJ5LCBLIGtleSwgViB2YWx1ZSk7CisgICAgdm9pZCBhdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworICAgIHZvaWQgZGV0YWNoRnJvbUNhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOwogCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgRW50cnlLZXksIHR5cGVuYW1lIEVudHJ5VmFsdWU+Ci0gICAgc3RydWN0IEVudHJ5OiBwdWJsaWMgTGlnaHRSZWZCYXNlPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHsKLSAgICAgICAgRW50cnkoKSB7IH0KLSAgICAgICAgRW50cnkoY29uc3QgRW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+JiBlKToKLSAgICAgICAgICAgICAgICBrZXkoZS5rZXkpLCB2YWx1ZShlLnZhbHVlKSwgcGFyZW50KGUucGFyZW50KSwgY2hpbGQoZS5jaGlsZCkgeyB9Ci0gICAgICAgIEVudHJ5KHNwPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IGUpOgotICAgICAgICAgICAgICAgIGtleShlLT5rZXkpLCB2YWx1ZShlLT52YWx1ZSksIHBhcmVudChlLT5wYXJlbnQpLCBjaGlsZChlLT5jaGlsZCkgeyB9CisgICAgViByZW1vdmVBdChzc2l6ZV90IGluZGV4KTsKIAotICAgICAgICBFbnRyeUtleSBrZXk7Ci0gICAgICAgIEVudHJ5VmFsdWUgdmFsdWU7CisgICAgS2V5ZWRWZWN0b3I8Sywgc3A8RW50cnk8SywgVj4gPiA+IG1DYWNoZTsKKyAgICB1aW50MzJfdCBtTWF4Q2FwYWNpdHk7CiAKLSAgICAgICAgc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gcGFyZW50OwotICAgICAgICBzcDxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiBjaGlsZDsKLSAgICB9OyAvLyBzdHJ1Y3QgRW50cnkKKyAgICBPbkVudHJ5UmVtb3ZlZDxLLCBWPiogbUxpc3RlbmVyOwogCi0gICAgdm9pZCBhZGRUb0NhY2hlKHNwPEVudHJ5PEsqLCBWKj4gPiBlbnRyeSwgSyoga2V5LCBWKiB2YWx1ZSk7Ci0gICAgdm9pZCBhdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEsqLCBWKj4gPiBlbnRyeSk7Ci0gICAgdm9pZCBkZXRhY2hGcm9tQ2FjaGUoc3A8RW50cnk8SyosIFYqPiA+IGVudHJ5KTsKLQotICAgIHVuc2lnbmVkIGludCBtTWF4Q2FwYWNpdHk7Ci0KLSAgICBPbkVudHJ5UmVtb3ZlZDxLKiwgVio+KiBtTGlzdGVuZXI7Ci0KLSAgICBLZXllZFZlY3RvcjxLKiwgc3A8RW50cnk8SyosIFYqPiA+ID4gbUNhY2hlOwotCi0gICAgc3A8RW50cnk8SyosIFYqPiA+IG1PbGRlc3Q7Ci0gICAgc3A8RW50cnk8SyosIFYqPiA+IG1Zb3VnZXN0OworICAgIHNwPEVudHJ5PEssIFY+ID4gbU9sZGVzdDsKKyAgICBzcDxFbnRyeTxLLCBWPiA+IG1Zb3VuZ2VzdDsKIH07IC8vIGNsYXNzIEdlbmVyYXRpb25DYWNoZQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotdW5zaWduZWQgaW50IEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6c2l6ZSgpIGNvbnN0IHsKK0dlbmVyYXRpb25DYWNoZTxLLCBWPjo6R2VuZXJhdGlvbkNhY2hlKHVpbnQzMl90IG1heENhcGFjaXR5KTogbU1heENhcGFjaXR5KG1heENhcGFjaXR5KSwgbUxpc3RlbmVyKE5VTEwpIHsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitHZW5lcmF0aW9uQ2FjaGU8SywgVj46On5HZW5lcmF0aW9uQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Cit1aW50MzJfdCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnNpemUoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1DYWNoZS5zaXplKCk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci12b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6c2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihPbkVudHJ5UmVtb3ZlZDxLKiwgVio+KiBsaXN0ZW5lcikgewordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIoT25FbnRyeVJlbW92ZWQ8SywgVj4qIGxpc3RlbmVyKSB7CiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiB9CiAKQEAgLTk4LDIwICsxMTEsMjAgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtQ2FjaGUuY2xlYXIoKTsKICAgICB9Ci0gICAgbVlvdWdlc3QuY2xlYXIoKTsKKyAgICBtWW91bmdlc3QuY2xlYXIoKTsKICAgICBtT2xkZXN0LmNsZWFyKCk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1ib29sIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Y29udGFpbnMoSyoga2V5KSBjb25zdCB7Citib29sIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Y29udGFpbnMoSyBrZXkpIGNvbnN0IHsKICAgICByZXR1cm4gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KSA+PSAwOwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotViogR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpnZXQoSyoga2V5KSB7CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0KEsga2V5KSB7CiAgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgc3A8RW50cnk8SyosIFYqPiA+IGVudHJ5ID0gbUNhY2hlLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBzcDxFbnRyeTxLLCBWPiA+IGVudHJ5ID0gbUNhY2hlLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBpZiAoZW50cnkuZ2V0KCkpIHsKICAgICAgICAgICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7CiAgICAgICAgICAgICBhdHRhY2hUb0NhY2hlKGVudHJ5KTsKQEAgLTEyMyw2NSArMTM2LDc0IEBACiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci12b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cHV0KEsqIGtleSwgViogdmFsdWUpIHsKLSAgICBpZiAobUNhY2hlLnNpemUoKSA+PSBtTWF4Q2FwYWNpdHkpIHsKK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpwdXQoSyBrZXksIFYgdmFsdWUpIHsKKyAgICBpZiAobU1heENhcGFjaXR5ICE9IGtVbmxpbWl0ZWRDYXBhY2l0eSAmJiBtQ2FjaGUuc2l6ZSgpID49IG1NYXhDYXBhY2l0eSkgewogICAgICAgICByZW1vdmVPbGRlc3QoKTsKICAgICB9CiAKICAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KTsKICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBzcDxFbnRyeTxLKiwgVio+ID4gZW50cnkgPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7CisgICAgICAgIHNwPEVudHJ5PEssIFY+ID4gZW50cnkgPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7CiAgICAgICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7CiAgICAgICAgIGFkZFRvQ2FjaGUoZW50cnksIGtleSwgdmFsdWUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPEVudHJ5PEsqLCBWKj4gPiBlbnRyeSA9IG5ldyBFbnRyeTxLKiwgVio+OworICAgICAgICBzcDxFbnRyeTxLLCBWPiA+IGVudHJ5ID0gbmV3IEVudHJ5PEssIFY+OwogICAgICAgICBhZGRUb0NhY2hlKGVudHJ5LCBrZXksIHZhbHVlKTsKICAgICB9CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci12b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6YWRkVG9DYWNoZShzcDxFbnRyeTxLKiwgVio+ID4gZW50cnksIEsqIGtleSwgViogdmFsdWUpIHsKK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjphZGRUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnksIEsga2V5LCBWIHZhbHVlKSB7CiAgICAgZW50cnktPmtleSA9IGtleTsKICAgICBlbnRyeS0+dmFsdWUgPSB2YWx1ZTsKLSAgICBtQ2FjaGUuYWRkKGtleSwgZW50cnkpOworICAgIGVudHJ5LT5pbmRleCA9IG1DYWNoZS5hZGQoa2V5LCBlbnRyeSk7CiAgICAgYXR0YWNoVG9DYWNoZShlbnRyeSk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1WKiBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnJlbW92ZShLKiBrZXkpIHsKK1YgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpyZW1vdmUoSyBrZXkpIHsKICAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KTsKICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBzcDxFbnRyeTxLKiwgVio+ID4gZW50cnkgPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIpIHsKLSAgICAgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1DYWNoZS5yZW1vdmVJdGVtc0F0KGluZGV4LCAxKTsKLSAgICAgICAgZGV0YWNoRnJvbUNhY2hlKGVudHJ5KTsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUF0KGluZGV4KTsKICAgICB9CiAKICAgICByZXR1cm4gTlVMTDsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLXZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpyZW1vdmVPbGRlc3QoKSB7CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlQXQoc3NpemVfdCBpbmRleCkgeworICAgIHNwPEVudHJ5PEssIFY+ID4gZW50cnkgPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7CisgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAoKm1MaXN0ZW5lcikoZW50cnktPmtleSwgZW50cnktPnZhbHVlKTsKKyAgICB9CisgICAgbUNhY2hlLnJlbW92ZUl0ZW1zQXQoaW5kZXgsIDEpOworICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7CisKKyAgICByZXR1cm4gZW50cnktPnZhbHVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorViBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnJlbW92ZU9sZGVzdCgpIHsKICAgICBpZiAobU9sZGVzdC5nZXQoKSkgewotICAgICAgICByZW1vdmUobU9sZGVzdC0+a2V5KTsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUF0KG1PbGRlc3QtPmluZGV4KTsKICAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLXZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjphdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEsqLCBWKj4gPiBlbnRyeSkgewotICAgIGlmICghbVlvdWdlc3QuZ2V0KCkpIHsKLSAgICAgICAgbVlvdWdlc3QgPSBtT2xkZXN0ID0gZW50cnk7Cit2b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6YXR0YWNoVG9DYWNoZShzcDxFbnRyeTxLLCBWPiA+IGVudHJ5KSB7CisgICAgaWYgKCFtWW91bmdlc3QuZ2V0KCkpIHsKKyAgICAgICAgbVlvdW5nZXN0ID0gbU9sZGVzdCA9IGVudHJ5OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGVudHJ5LT5wYXJlbnQgPSBtWW91Z2VzdDsKLSAgICAgICAgbVlvdWdlc3QtPmNoaWxkID0gZW50cnk7Ci0gICAgICAgIG1Zb3VnZXN0ID0gZW50cnk7CisgICAgICAgIGVudHJ5LT5wYXJlbnQgPSBtWW91bmdlc3Q7CisgICAgICAgIG1Zb3VuZ2VzdC0+Y2hpbGQgPSBlbnRyeTsKKyAgICAgICAgbVlvdW5nZXN0ID0gZW50cnk7CiAgICAgfQogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotdm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmRldGFjaEZyb21DYWNoZShzcDxFbnRyeTxLKiwgVio+ID4gZW50cnkpIHsKK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpkZXRhY2hGcm9tQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSkgewogICAgIGlmIChlbnRyeS0+cGFyZW50LmdldCgpKSB7CiAgICAgICAgIGVudHJ5LT5wYXJlbnQtPmNoaWxkID0gZW50cnktPmNoaWxkOwogICAgIH0KQEAgLTE5NCw4ICsyMTYsOCBAQAogICAgICAgICBtT2xkZXN0ID0gZW50cnktPmNoaWxkOwogICAgIH0KIAotICAgIGlmIChtWW91Z2VzdCA9PSBlbnRyeSkgewotICAgICAgICBtWW91Z2VzdCA9IGVudHJ5LT5wYXJlbnQ7CisgICAgaWYgKG1Zb3VuZ2VzdCA9PSBlbnRyeSkgeworICAgICAgICBtWW91bmdlc3QgPSBlbnRyeS0+cGFyZW50OwogICAgIH0KIAogICAgIGVudHJ5LT5wYXJlbnQuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9MYXllci5oIGIvbGlicy9od3VpL0xheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkYjc4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9MYXllci5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfTEFZRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX0xBWUVSX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa1hmZXJtb2RlLmg+CisKKyNpbmNsdWRlICJSZWN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBEaW1lbnNpb25zIG9mIGEgbGF5ZXIuCisgKi8KK3N0cnVjdCBMYXllclNpemUgeworICAgIExheWVyU2l6ZSgpOiB3aWR0aCgwKSwgaGVpZ2h0KDApLCBpZCgwKSB7IH0KKyAgICBMYXllclNpemUoY29uc3QgdWludDMyX3Qgd2lkdGgsIGNvbnN0IHVpbnQzMl90IGhlaWdodCk6IHdpZHRoKHdpZHRoKSwgaGVpZ2h0KGhlaWdodCksIGlkKDApIHsgfQorICAgIExheWVyU2l6ZShjb25zdCBMYXllclNpemUmIHNpemUpOiB3aWR0aChzaXplLndpZHRoKSwgaGVpZ2h0KHNpemUuaGVpZ2h0KSwgaWQoc2l6ZS5pZCkgeyB9CisKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisKKyAgICAvLyBJbmNyZW1lbnRhbCBpZCB1c2VkIGJ5IHRoZSBsYXllciBjYWNoZSB0byBzdG9yZSBtdWx0aXBsZQorICAgIC8vIExheWVyU2l6ZSB3aXRoIHRoZSBzYW1lIGRpbWVuc2lvbnMKKyAgICB1aW50MzJfdCBpZDsKKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExheWVyU2l6ZSYgcmhzKSBjb25zdCB7CisgICAgICAgIGlmIChpZCAhPSAwICYmIHJocy5pZCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gaWQgPCByaHMuaWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdpZHRoID09IHJocy53aWR0aCkgeworICAgICAgICAgICAgcmV0dXJuIGhlaWdodCA8IHJocy5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdpZHRoIDwgcmhzLndpZHRoOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMYXllclNpemUmIHJocykgY29uc3QgeworICAgICAgICByZXR1cm4gd2lkdGggPT0gcmhzLndpZHRoICYmIGhlaWdodCA9PSByaHMuaGVpZ2h0OworICAgIH0KK307IC8vIHN0cnVjdCBMYXllclNpemUKKworLyoqCisgKiBBIGxheWVyIGhhcyBkaW1lbnNpb25zIGFuZCBpcyBiYWNrZWQgYnkgYW4gT3BlbkdMIHRleHR1cmUuCisgKi8KK3N0cnVjdCBMYXllciB7CisgICAgLyoqCisgICAgICogQ29vcmRpbmF0ZXMgb2YgdGhlIGxheWVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzbmFwc2hvdC4KKyAgICAgKiBPbmx5IHNldCB3aGVuIHRoZSBmbGFnIGtGbGFnSXNMYXllciBpcyBzZXQuCisgICAgICovCisgICAgUmVjdCBsYXllcjsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB0ZXh0dXJlIHVzZWQgdG8gcmVuZGVyIHRoZSBsYXllci4KKyAgICAgKiBPbmx5IHNldCB3aGVuIHRoZSBmbGFnIGtGbGFnSXNMYXllciBpcyBzZXQuCisgICAgICovCisgICAgR0x1aW50IHRleHR1cmU7CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgRkJPIHVzZWQgdG8gcmVuZGVyIHRoZSBsYXllci4KKyAgICAgKiBPbmx5IHNldCB3aGVuIHRoZSBmbGFnIGtGbGFnSXNMYXllciBpcyBzZXQuCisgICAgICovCisgICAgR0x1aW50IGZibzsKKyAgICAvKioKKyAgICAgKiBPcGFjaXR5IG9mIHRoZSBsYXllci4KKyAgICAgKiBPbmx5IHNldCB3aGVuIHRoZSBmbGFnIGtGbGFnSXNMYXllciBpcyBzZXQuCisgICAgICovCisgICAgZmxvYXQgYWxwaGE7CisgICAgLyoqCisgICAgICogQmxlbmRpbmcgbW9kZSBvZiB0aGUgbGF5ZXIuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGxheWVyIHNob3VsZCBiZSBibGVuZGVkLgorICAgICAqLworICAgIGJvb2wgYmxlbmQ7Cit9OyAvLyBzdHJ1Y3QgTGF5ZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0xBWUVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcCBiL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2RhNDVlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTGF5ZXJDYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0xheWVyQ2FjaGU6OkxheWVyQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPExheWVyU2l6ZSwgTGF5ZXIqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbUlkR2VuZXJhdG9yKDEpLCBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKK30KKworTGF5ZXJDYWNoZTo6fkxheWVyQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IExheWVyQ2FjaGU6OmdldFNpemUoKSB7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBMYXllckNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBMYXllckNhY2hlOjpzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBtTWF4U2l6ZSA9IG1heFNpemU7CisgICAgd2hpbGUgKG1TaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgTGF5ZXIqIG9sZGVzdCA9IG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgZGVsZXRlTGF5ZXIob2xkZXN0KTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIExheWVyQ2FjaGU6Om9wZXJhdG9yKCkoTGF5ZXJTaXplJiBzaXplLCBMYXllciomIGxheWVyKSB7CisgICAgZGVsZXRlTGF5ZXIobGF5ZXIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTGF5ZXJDYWNoZTo6ZGVsZXRlTGF5ZXIoTGF5ZXIqIGxheWVyKSB7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIG1TaXplIC09IGxheWVyLT5sYXllci5nZXRXaWR0aCgpICogbGF5ZXItPmxheWVyLmdldEhlaWdodCgpICogNDsKKworICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmbGF5ZXItPmZibyk7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKyAgICAgICAgZGVsZXRlIGxheWVyOworICAgIH0KK30KKwordm9pZCBMYXllckNhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihOVUxMKTsKK30KKworTGF5ZXIqIExheWVyQ2FjaGU6OmdldChMYXllclNpemUmIHNpemUsIEdMdWludCBwcmV2aW91c0ZibykgeworICAgIExheWVyKiBsYXllciA9IG1DYWNoZS5yZW1vdmUoc2l6ZSk7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIExBWUVSX0xPR0QoIlJldXNpbmcgbGF5ZXIiKTsKKworICAgICAgICBtU2l6ZSAtPSBsYXllci0+bGF5ZXIuZ2V0V2lkdGgoKSAqIGxheWVyLT5sYXllci5nZXRIZWlnaHQoKSAqIDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTEFZRVJfTE9HRCgiQ3JlYXRpbmcgbmV3IGxheWVyIik7CisKKyAgICAgICAgbGF5ZXIgPSBuZXcgTGF5ZXI7CisgICAgICAgIGxheWVyLT5ibGVuZCA9IHRydWU7CisKKyAgICAgICAgLy8gR2VuZXJhdGUgdGhlIEZCTyBhbmQgYXR0YWNoIHRoZSB0ZXh0dXJlCisgICAgICAgIGdsR2VuRnJhbWVidWZmZXJzKDEsICZsYXllci0+ZmJvKTsKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGxheWVyLT5mYm8pOworCisgICAgICAgIC8vIEdlbmVyYXRlIHRoZSB0ZXh0dXJlIGluIHdoaWNoIHRoZSBGQk8gd2lsbCBkcmF3CisgICAgICAgIGdsR2VuVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBsYXllci0+dGV4dHVyZSk7CisKKyAgICAgICAgLy8gVGhlIEZCTyB3aWxsIG5vdCBiZSBzY2FsZWQsIHNvIHdlIGNhbiB1c2UgbG93ZXIgcXVhbGl0eSBmaWx0ZXJpbmcKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIE5VTEwpOworICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworCisgICAgICAgIC8vIEJpbmQgdGV4dHVyZSB0byBGQk8KKyAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgbGF5ZXItPnRleHR1cmUsIDApOworCisgICAgICAgIEdMZW51bSBzdGF0dXMgPSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpOworICAgICAgICBpZiAoc3RhdHVzICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7CisgICAgICAgICAgICBMT0dFKCJGcmFtZWJ1ZmZlciBpbmNvbXBsZXRlIChHTCBlcnJvciBjb2RlIDB4JXgpIiwgc3RhdHVzKTsKKworICAgICAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIHByZXZpb3VzRmJvKTsKKworICAgICAgICAgICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoMSwgJmxheWVyLT5mYm8pOworICAgICAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbGF5ZXItPnRleHR1cmUpOworICAgICAgICAgICAgZGVsZXRlIGxheWVyOworCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsYXllcjsKK30KKworYm9vbCBMYXllckNhY2hlOjpwdXQoTGF5ZXJTaXplJiBsYXllclNpemUsIExheWVyKiBsYXllcikgeworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBsYXllclNpemUud2lkdGggKiBsYXllclNpemUuaGVpZ2h0ICogNDsKKyAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGxheWVyIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgTGF5ZXIqIG9sZGVzdCA9IG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgICAgIGRlbGV0ZUxheWVyKG9sZGVzdCk7CisgICAgICAgIH0KKworICAgICAgICBsYXllclNpemUuaWQgPSBtSWRHZW5lcmF0b3IrKzsKKyAgICAgICAgbUNhY2hlLnB1dChsYXllclNpemUsIGxheWVyKTsKKyAgICAgICAgbVNpemUgKz0gc2l6ZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9MYXllckNhY2hlLmggYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODA1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0xBWUVSX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9MQVlFUl9DQUNIRV9ICisKKyNpbmNsdWRlICJMYXllci5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVidWcKKyNkZWZpbmUgREVCVUdfTEFZRVJTIDAKKworLy8gRGVidWcKKyNpZiBERUJVR19MQVlFUlMKKyAgICAjZGVmaW5lIExBWUVSX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIExBWUVSX0xPR0QoLi4uKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIExheWVyQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxMYXllclNpemUsIExheWVyKj4geworcHVibGljOgorICAgIExheWVyQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOworICAgIH5MYXllckNhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGFzIGEgY2FsbGJhY2sgd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIERvIG5vdCBpbnZva2UgZGlyZWN0bHkuCisgICAgICovCisgICAgdm9pZCBvcGVyYXRvcigpKExheWVyU2l6ZSYgc2l6ZSwgTGF5ZXIqJiBsYXllcik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsYXllciBvZiBzcGVjaWZpZWQgZGltZW5zaW9ucy4gSWYgbm90IHN1aXRhYmxlIGxheWVyCisgICAgICogY2FuIGJlIGZvdW5kLCBhIG5ldyBvbmUgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuIElmIGNyZWF0aW5nIGEgbmV3CisgICAgICogbGF5ZXIgZmFpbHMsIE5VTEwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBXaGVuIGEgbGF5ZXIgaXMgb2J0YWluZWQgZnJvbSB0aGUgY2FjaGUsIGl0IGlzIHJlbW92ZWQgYW5kIHRoZSB0b3RhbAorICAgICAqIHNpemUgb2YgdGhlIGNhY2hlIGdvZXMgZG93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIFRoZSBkaW1lbnNpb25zIG9mIHRoZSBkZXNpcmVkIGxheWVyCisgICAgICogQHBhcmFtIHByZXZpb3VzRmJvIFRoZSBuYW1lIG9mIHRoZSBGQk8gdG8gYmluZCB0byBpZiBjcmVhdGluZyBhIG5ldworICAgICAqICAgICAgICBsYXllciBmYWlscworICAgICAqLworICAgIExheWVyKiBnZXQoTGF5ZXJTaXplJiBzaXplLCBHTHVpbnQgcHJldmlvdXNGYm8pOworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGxheWVyIHRvIHRoZSBjYWNoZS4gVGhlIGxheWVyIHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZXJlIGlzCisgICAgICogbm90IGVub3VnaCBzcGFjZSBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgZGltZW5zaW9ucyBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gbGF5ZXIgVGhlIGxheWVyIHRvIGFkZCB0byB0aGUgY2FjaGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGF5ZXIgd2FzIGFkZGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBwdXQoTGF5ZXJTaXplJiBzaXplLCBMYXllciogbGF5ZXIpOworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgY2F1c2VzIGFsbCBsYXllcnMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGRlbGV0ZUxheWVyKExheWVyKiBsYXllcik7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8TGF5ZXJTaXplLCBMYXllcio+IG1DYWNoZTsKKyAgICB1aW50MzJfdCBtSWRHZW5lcmF0b3I7CisKKyAgICB1aW50MzJfdCBtU2l6ZTsKKyAgICB1aW50MzJfdCBtTWF4U2l6ZTsKK307IC8vIGNsYXNzIExheWVyQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0xBWUVSX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuY3BwCmluZGV4IGQ4MDIzODU5Li45NzM5YjliIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuY3BwCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPFNrQ2FudmFzLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiT3BlbkdMUmVuZGVyZXIuaCIKQEAgLTMzLDggKzM0LDE4IEBACiAvLyBEZWZpbmVzCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSNkZWZpbmUgTUFYX1RFWFRVUkVfQ09VTlQgMTI4CisvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIG1lZ2EtYnl0ZXMKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVFVSRV9DQUNIRV9TSVpFICJyby5od3VpLnRleHR1cmVfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfTEFZRVJfQ0FDSEVfU0laRSAicm8uaHd1aS5sYXllcl9jYWNoZV9zaXplIgogCisjZGVmaW5lIERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFIDIwCisjZGVmaW5lIERFRkFVTFRfTEFZRVJfQ0FDSEVfU0laRSAxMAorI2RlZmluZSBERUZBVUxUX1BBVENIX0NBQ0hFX1NJWkUgMTAwCisKKy8vIENvbnZlcnRzIGEgbnVtYmVyIG9mIG1lZ2EtYnl0ZXMgaW50byBieXRlcworI2RlZmluZSBNQihzKSBzICogMTAyNCAqIDEwMjQKKworLy8gR2VuZXJhdGVzIHNpbXBsZSBhbmQgdGV4dHVyZWQgdmVydGljZXMKICNkZWZpbmUgU1YoeCwgeSkgeyB7IHgsIHkgfSB9CiAjZGVmaW5lIEZWKHgsIHksIHUsIHYpIHsgeyB4LCB5IH0sIHsgdSwgdiB9IH0KIApAQCAtNTQsMTAgKzY1LDEwIEBACiAvLyBUaGlzIGFycmF5IGlzIG5ldmVyIHVzZWQgZGlyZWN0bHkgYnV0IHVzZWQgYXMgYSBtZW1jcHkgc291cmNlIGluIHRoZQogLy8gT3BlbkdMUmVuZGVyZXIgY29uc3RydWN0b3IKIHN0YXRpYyBjb25zdCBUZXh0dXJlVmVydGV4IGdEcmF3VGV4dHVyZVZlcnRpY2VzW10gPSB7Ci0gICAgICAgIEZWKDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpLAotICAgICAgICBGVigxLjBmLCAwLjBmLCAxLjBmLCAxLjBmKSwKLSAgICAgICAgRlYoMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiksCi0gICAgICAgIEZWKDEuMGYsIDEuMGYsIDEuMGYsIDAuMGYpCisgICAgICAgIEZWKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLAorICAgICAgICBGVigxLjBmLCAwLjBmLCAxLjBmLCAwLjBmKSwKKyAgICAgICAgRlYoMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiksCisgICAgICAgIEZWKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpCiB9Owogc3RhdGljIGNvbnN0IEdMc2l6ZWkgZ0RyYXdUZXh0dXJlVmVydGV4U3RyaWRlID0gc2l6ZW9mKFRleHR1cmVWZXJ0ZXgpOwogc3RhdGljIGNvbnN0IEdMc2l6ZWkgZ0RyYXdUZXh0dXJlVmVydGV4Q291bnQgPSA0OwpAQCAtODMsMTEgKzk0LDMxIEBACiAvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1PcGVuR0xSZW5kZXJlcjo6T3BlbkdMUmVuZGVyZXIoKTogbVRleHR1cmVDYWNoZShNQVhfVEVYVFVSRV9DT1VOVCkgeworT3BlbkdMUmVuZGVyZXI6Ok9wZW5HTFJlbmRlcmVyKCk6CisgICAgICAgIG1CbGVuZChmYWxzZSksIG1MYXN0U3JjTW9kZShHTF9aRVJPKSwgbUxhc3REc3RNb2RlKEdMX1pFUk8pLAorICAgICAgICBtVGV4dHVyZUNhY2hlKE1CKERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFKSksCisgICAgICAgIG1MYXllckNhY2hlKE1CKERFRkFVTFRfTEFZRVJfQ0FDSEVfU0laRSkpLAorICAgICAgICBtUGF0Y2hDYWNoZShERUZBVUxUX1BBVENIX0NBQ0hFX1NJWkUpIHsKICAgICBMT0dEKCJDcmVhdGUgT3BlbkdMUmVuZGVyZXIiKTsKIAorICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRVUkVfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dHVyZSBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1UZXh0dXJlQ2FjaGUuc2V0TWF4U2l6ZShNQihhdG9pKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0dXJlIGNhY2hlIHNpemUgb2YgJWRNQiIsIERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFKTsKKyAgICB9CisKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX0xBWUVSX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIGxheWVyIGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgbUxheWVyQ2FjaGUuc2V0TWF4U2l6ZShNQihhdG9pKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBsYXllciBjYWNoZSBzaXplIG9mICVkTUIiLCBERUZBVUxUX0xBWUVSX0NBQ0hFX1NJWkUpOworICAgIH0KKwogICAgIG1EcmF3Q29sb3JTaGFkZXIgPSBuZXcgRHJhd0NvbG9yUHJvZ3JhbTsKICAgICBtRHJhd1RleHR1cmVTaGFkZXIgPSBuZXcgRHJhd1RleHR1cmVQcm9ncmFtOworICAgIG1DdXJyZW50U2hhZGVyID0gbURyYXdUZXh0dXJlU2hhZGVyOwogCiAgICAgbWVtY3B5KG1EcmF3VGV4dHVyZVZlcnRpY2VzLCBnRHJhd1RleHR1cmVWZXJ0aWNlcywgc2l6ZW9mKGdEcmF3VGV4dHVyZVZlcnRpY2VzKSk7CiB9CkBAIC05Niw2ICsxMjcsOCBAQAogICAgIExPR0QoIkRlc3Ryb3kgT3BlbkdMUmVuZGVyZXIiKTsKIAogICAgIG1UZXh0dXJlQ2FjaGUuY2xlYXIoKTsKKyAgICBtTGF5ZXJDYWNoZS5jbGVhcigpOworICAgIG1QYXRjaENhY2hlLmNsZWFyKCk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTEwNSwxMiArMTM4LDExIEBACiB2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXRWaWV3cG9ydChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICBnbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogCi0gICAgbWF0NCBvcnRobzsKLSAgICBvcnRoby5sb2FkT3J0aG8oMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEpOwotICAgIG9ydGhvLmNvcHlUbyhtT3J0aG9NYXRyaXgpOworICAgIG1PcnRob01hdHJpeC5sb2FkT3J0aG8oMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEpOwogCiAgICAgbVdpZHRoID0gd2lkdGg7CiAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICBtRmlyc3RTbmFwc2hvdC5oZWlnaHQgPSBoZWlnaHQ7CiB9CiAKIHZvaWQgT3BlbkdMUmVuZGVyZXI6OnByZXBhcmUoKSB7CkBAIC0xNzAsMTAgKzIwMiwxNSBAQAogYm9vbCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZVNuYXBzaG90KCkgewogICAgIGJvb2wgcmVzdG9yZUNsaXAgPSBtU25hcHNob3QtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnQ2xpcFNldDsKICAgICBib29sIHJlc3RvcmVMYXllciA9IG1TbmFwc2hvdC0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdJc0xheWVyOworICAgIGJvb2wgcmVzdG9yZU9ydGhvID0gbVNuYXBzaG90LT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0RpcnR5T3J0aG87CiAKICAgICBzcDxTbmFwc2hvdD4gY3VycmVudCA9IG1TbmFwc2hvdDsKICAgICBzcDxTbmFwc2hvdD4gcHJldmlvdXMgPSBtU25hcHNob3QtPnByZXZpb3VzOwogCisgICAgaWYgKHJlc3RvcmVPcnRobykgeworICAgICAgICBtT3J0aG9NYXRyaXgubG9hZChjdXJyZW50LT5vcnRob01hdHJpeCk7CisgICAgfQorCiAgICAgaWYgKHJlc3RvcmVMYXllcikgewogICAgICAgICBjb21wb3NlTGF5ZXIoY3VycmVudCwgcHJldmlvdXMpOwogICAgIH0KQEAgLTE4NSw2ICsyMjIsMTEgQEAKIH0KIAogdm9pZCBPcGVuR0xSZW5kZXJlcjo6Y29tcG9zZUxheWVyKHNwPFNuYXBzaG90PiBjdXJyZW50LCBzcDxTbmFwc2hvdD4gcHJldmlvdXMpIHsKKyAgICBpZiAoIWN1cnJlbnQtPmxheWVyKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gY29tcG9zZSBhIGxheWVyIHRoYXQgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIC8vIFVuYmluZCBjdXJyZW50IEZCTyBhbmQgcmVzdG9yZSBwcmV2aW91cyBvbmUKICAgICAvLyBNb3N0IG9mIHRoZSB0aW1lLCBwcmV2aW91cy0+ZmJvIHdpbGwgYmUgMCB0byBiaW5kIHRoZSBkZWZhdWx0IGJ1ZmZlcgogICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBwcmV2aW91cy0+ZmJvKTsKQEAgLTE5MywyNyArMjM1LDI3IEBACiAgICAgY29uc3QgUmVjdCYgY2xpcCA9IHByZXZpb3VzLT5nZXRNYXBwZWRDbGlwKCk7CiAgICAgZ2xTY2lzc29yKGNsaXAubGVmdCwgbUhlaWdodCAtIGNsaXAuYm90dG9tLCBjbGlwLmdldFdpZHRoKCksIGNsaXAuZ2V0SGVpZ2h0KCkpOwogCisgICAgTGF5ZXIqIGxheWVyID0gY3VycmVudC0+bGF5ZXI7CisKICAgICAvLyBDb21wdXRlIHRoZSBjb3JyZWN0IHRleHR1cmUgY29vcmRpbmF0ZXMgZm9yIHRoZSBGQk8gdGV4dHVyZQogICAgIC8vIFRoZSB0ZXh0dXJlIGlzIGN1cnJlbnRseSBhcyBiaWcgYXMgdGhlIHdpbmRvdyBidXQgZHJhd24gd2l0aAogICAgIC8vIGEgcXVhZCBvZiB0aGUgYXBwcm9wcmlhdGUgc2l6ZQotICAgIGNvbnN0IFJlY3QmIGxheWVyID0gY3VycmVudC0+bGF5ZXI7Ci0gICAgUmVjdCB0ZXhDb29yZHMoY3VycmVudC0+bGF5ZXIpOwotICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLm1hcFJlY3QodGV4Q29vcmRzKTsKKyAgICBjb25zdCBSZWN0JiByZWN0ID0gbGF5ZXItPmxheWVyOwogCi0gICAgY29uc3QgZmxvYXQgdTEgPSB0ZXhDb29yZHMubGVmdCAvIGZsb2F0KG1XaWR0aCk7Ci0gICAgY29uc3QgZmxvYXQgdjEgPSAobUhlaWdodCAtIHRleENvb3Jkcy50b3ApIC8gZmxvYXQobUhlaWdodCk7Ci0gICAgY29uc3QgZmxvYXQgdTIgPSB0ZXhDb29yZHMucmlnaHQgLyBmbG9hdChtV2lkdGgpOwotICAgIGNvbnN0IGZsb2F0IHYyID0gKG1IZWlnaHQgLSB0ZXhDb29yZHMuYm90dG9tKSAvIGZsb2F0KG1IZWlnaHQpOworICAgIGRyYXdUZXh0dXJlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwKKyAgICAgICAgICAgIGxheWVyLT50ZXh0dXJlLCBsYXllci0+YWxwaGEsIGxheWVyLT5tb2RlLCBsYXllci0+YmxlbmQpOwogCi0gICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3Jkcyh1MSwgdjEsIHUyLCB2MSk7CisgICAgTGF5ZXJTaXplIHNpemUocmVjdC5nZXRXaWR0aCgpLCByZWN0LmdldEhlaWdodCgpKTsKKyAgICAvLyBGYWlsaW5nIHRvIGFkZCB0aGUgbGF5ZXIgdG8gdGhlIGNhY2hlIHNob3VsZCBoYXBwZW4gb25seSBpZiB0aGUKKyAgICAvLyBsYXllciBpcyB0b28gbGFyZ2UKKyAgICBpZiAoIW1MYXllckNhY2hlLnB1dChzaXplLCBsYXllcikpIHsKKyAgICAgICAgTEFZRVJfTE9HRCgiRGVsZXRpbmcgbGF5ZXIiKTsKIAotICAgIGRyYXdUZXh0dXJlUmVjdChsYXllci5sZWZ0LCBsYXllci50b3AsIGxheWVyLnJpZ2h0LCBsYXllci5ib3R0b20sCi0gICAgICAgICAgICBjdXJyZW50LT50ZXh0dXJlLCBjdXJyZW50LT5hbHBoYSwgY3VycmVudC0+bW9kZSwgdHJ1ZSk7CisgICAgICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZsYXllci0+ZmJvKTsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbGF5ZXItPnRleHR1cmUpOwogCi0gICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcygwLjBmLCAxLjBmLCAxLjBmLCAwLjBmKTsKLQotICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZjdXJyZW50LT5mYm8pOwotICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJmN1cnJlbnQtPnRleHR1cmUpOworICAgICAgICBkZWxldGUgbGF5ZXI7CisgICAgfQogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yNTIsNTEgKzI5NCw0OSBAQAogCiBib29sIE9wZW5HTFJlbmRlcmVyOjpjcmVhdGVMYXllcihzcDxTbmFwc2hvdD4gc25hcHNob3QsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKICAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsaW50IGZsYWdzKSB7Ci0gICAgLy8gR2VuZXJhdGUgdGhlIEZCTyBhbmQgYXR0YWNoIHRoZSB0ZXh0dXJlCi0gICAgZ2xHZW5GcmFtZWJ1ZmZlcnMoMSwgJnNuYXBzaG90LT5mYm8pOwotICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBzbmFwc2hvdC0+ZmJvKTsKIAotICAgIC8vIEdlbmVyYXRlIHRoZSB0ZXh0dXJlIGluIHdoaWNoIHRoZSBGQk8gd2lsbCBkcmF3Ci0gICAgZ2xHZW5UZXh0dXJlcygxLCAmc25hcHNob3QtPnRleHR1cmUpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgc25hcHNob3QtPnRleHR1cmUpOworICAgIExBWUVSX0xPR0QoIlJlcXVlc3RpbmcgbGF5ZXIgJWR4JWQiLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCk7CisgICAgTEFZRVJfTE9HRCgiTGF5ZXIgY2FjaGUgc2l6ZSA9ICVkIiwgbUxheWVyQ2FjaGUuZ2V0U2l6ZSgpKTsKIAotICAgIC8vIFRoZSBGQk8gd2lsbCBub3QgYmUgc2NhbGVkLCBzbyB3ZSBjYW4gdXNlIGxvd2VyIHF1YWxpdHkgZmlsdGVyaW5nCi0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIEdMdWludCBwcmV2aW91c0ZibyA9IHNuYXBzaG90LT5wcmV2aW91cy5nZXQoKSA/IHNuYXBzaG90LT5wcmV2aW91cy0+ZmJvIDogMDsKKyAgICBMYXllclNpemUgc2l6ZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CiAKLSAgICAvLyBUT0RPICoqKioqIElNUE9SVEFOVCAqKioqKgotICAgIC8vIENyZWF0aW5nIGEgdGV4dHVyZS1iYWNrZWQgRkJPIHdvcmtzIG9ubHkgaWYgdGhlIHRleHR1cmUgaXMgdGhlIHNhbWUgc2l6ZQotICAgIC8vIGFzIHRoZSBvcmlnaW5hbCByZW5kZXJpbmcgYnVmZmVyIChpbiB0aGlzIGNhc2UsIG1XaWR0aCBhbmQgbUhlaWdodC4pCi0gICAgLy8gVGhpcyBpcyBleHBlbnNpdmUgYW5kIHdhc3RlZnVsIGFuZCBtdXN0IGJlIGZpeGVkLgotICAgIC8vIFRPRE8gQWRkaXRpb25hbGx5IHdlIHNob3VsZCB1c2UgYW4gRkJPIGNhY2hlCi0KLSAgICBjb25zdCBHTHNpemVpIHdpZHRoID0gbVdpZHRoOyAvL3JpZ2h0IC0gbGVmdDsKLSAgICBjb25zdCBHTHNpemVpIGhlaWdodCA9IG1IZWlnaHQ7IC8vYm90dG9tIC0gcmlnaHQ7Ci0KLSAgICBjb25zdCBHTGludCBmb3JtYXQgPSAoZmxhZ3MgJiBTa0NhbnZhczo6a0hhc0FscGhhTGF5ZXJfU2F2ZUZsYWcpID8gR0xfUkdCQSA6IEdMX1JHQjsKLSAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBmb3JtYXQsIEdMX1VOU0lHTkVEX0JZVEUsIE5VTEwpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0KLSAgICAvLyBCaW5kIHRleHR1cmUgdG8gRkJPCi0gICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RFWFRVUkVfMkQsCi0gICAgICAgICAgICBzbmFwc2hvdC0+dGV4dHVyZSwgMCk7Ci0KLSAgICBHTGVudW0gc3RhdHVzID0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKTsKLSAgICBpZiAoc3RhdHVzICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7Ci0gICAgICAgIExPR0QoIkZyYW1lYnVmZmVyIGluY29tcGxldGUgJWQiLCBzdGF0dXMpOwotCi0gICAgICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZzbmFwc2hvdC0+ZmJvKTsKLSAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmc25hcHNob3QtPnRleHR1cmUpOwotCisgICAgTGF5ZXIqIGxheWVyID0gbUxheWVyQ2FjaGUuZ2V0KHNpemUsIHByZXZpb3VzRmJvKTsKKyAgICBpZiAoIWxheWVyKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgbGF5ZXItPmZibyk7CisKKyAgICAvLyBDbGVhciB0aGUgRkJPCisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKworICAgIC8vIFNhdmUgdGhlIGxheWVyIGluIHRoZSBzbmFwc2hvdAogICAgIHNuYXBzaG90LT5mbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdJc0xheWVyOwotICAgIHNuYXBzaG90LT5tb2RlID0gbW9kZTsKLSAgICBzbmFwc2hvdC0+YWxwaGEgPSBhbHBoYSAvIDI1NS4wZjsKLSAgICBzbmFwc2hvdC0+bGF5ZXIuc2V0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgbGF5ZXItPm1vZGUgPSBtb2RlOworICAgIGxheWVyLT5hbHBoYSA9IGFscGhhIC8gMjU1LjBmOworICAgIGxheWVyLT5sYXllci5zZXQobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKworICAgIHNuYXBzaG90LT5sYXllciA9IGxheWVyOworICAgIHNuYXBzaG90LT5mYm8gPSBsYXllci0+ZmJvOworCisgICAgLy8gQ3JlYXRlcyBhIG5ldyBzbmFwc2hvdCB0byBkcmF3IGludG8gdGhlIEZCTworICAgIHNhdmVTbmFwc2hvdCgpOworICAgIC8vIFRPRE86IFRoaXMgZG9lc24ndCBwcmVzZXJ2ZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgKGNoZWNrIFNraWEgZmlyc3QpCisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ubG9hZFRyYW5zbGF0ZSgtbGVmdCwgLXRvcCwgMC4wZik7CisgICAgbVNuYXBzaG90LT5jbGlwUmVjdC5zZXQobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBtU25hcHNob3QtPmhlaWdodCA9IGJvdHRvbSAtIHRvcDsKKyAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKworICAgIG1TbmFwc2hvdC0+ZmxhZ3MgPSBTbmFwc2hvdDo6a0ZsYWdEaXJ0eVRyYW5zZm9ybSB8IFNuYXBzaG90OjprRmxhZ0RpcnR5T3J0aG8gfAorICAgICAgICAgICAgU25hcHNob3Q6OmtGbGFnQ2xpcFNldDsKKyAgICBtU25hcHNob3QtPm9ydGhvTWF0cml4LmxvYWQobU9ydGhvTWF0cml4KTsKKworICAgIC8vIENoYW5nZSB0aGUgb3J0aG8gcHJvamVjdGlvbgorICAgIG1PcnRob01hdHJpeC5sb2FkT3J0aG8oMC4wZiwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3AsIDAuMGYsIDAuMGYsIDEuMGYpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0zNDEsNyArMzgxLDcgQEAKIAogdm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0U2Npc3NvckZyb21DbGlwKCkgewogICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBtU25hcHNob3QtPmdldE1hcHBlZENsaXAoKTsKLSAgICBnbFNjaXNzb3IoY2xpcC5sZWZ0LCBtSGVpZ2h0IC0gY2xpcC5ib3R0b20sIGNsaXAuZ2V0V2lkdGgoKSwgY2xpcC5nZXRIZWlnaHQoKSk7CisgICAgZ2xTY2lzc29yKGNsaXAubGVmdCwgbVNuYXBzaG90LT5oZWlnaHQgLSBjbGlwLmJvdHRvbSwgY2xpcC5nZXRXaWR0aCgpLCBjbGlwLmdldEhlaWdodCgpKTsKIH0KIAogY29uc3QgUmVjdCYgT3BlbkdMUmVuZGVyZXI6OmdldENsaXBCb3VuZHMoKSB7CkBAIC0zNzgsOCArNDE4LDc3IEBACiAvLyBEcmF3aW5nCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdCaXRtYXAoY29uc3QgU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBjb25zdCBTa1BhaW50KiBwYWludCkgewotICAgIExPR0QoIkRyYXdpbmcgYml0bWFwISIpOwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgY29uc3QgZmxvYXQgcmlnaHQgPSBsZWZ0ICsgYml0bWFwLT53aWR0aCgpOworICAgIGNvbnN0IGZsb2F0IGJvdHRvbSA9IHRvcCArIGJpdG1hcC0+aGVpZ2h0KCk7CisKKyAgICBpZiAocXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1UZXh0dXJlQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgZHJhd1RleHR1cmVSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdGV4dHVyZSwgcGFpbnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgUmVjdCByKDAuMGYsIDAuMGYsIGJpdG1hcC0+d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQoKSk7CisgICAgY29uc3QgbWF0NCB0cmFuc2Zvcm0oKm1hdHJpeCk7CisgICAgdHJhbnNmb3JtLm1hcFJlY3Qocik7CisKKyAgICBpZiAocXVpY2tSZWplY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbVRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBkcmF3VGV4dHVyZVJlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHRleHR1cmUsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLAorICAgICAgICAgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAorICAgICAgICAgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLCBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLAorICAgICAgICAgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpZiAocXVpY2tSZWplY3QoZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSA9IG1UZXh0dXJlQ2FjaGUuZ2V0KGJpdG1hcCk7CisKKyAgICBjb25zdCBmbG9hdCB3aWR0aCA9IHRleHR1cmUtPndpZHRoOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHRleHR1cmUtPmhlaWdodDsKKworICAgIGNvbnN0IGZsb2F0IHUxID0gc3JjTGVmdCAvIHdpZHRoOworICAgIGNvbnN0IGZsb2F0IHYxID0gc3JjVG9wIC8gaGVpZ2h0OworICAgIGNvbnN0IGZsb2F0IHUyID0gc3JjUmlnaHQgLyB3aWR0aDsKKyAgICBjb25zdCBmbG9hdCB2MiA9IHNyY0JvdHRvbSAvIGhlaWdodDsKKworICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHModTEsIHYxLCB1MiwgdjIpOworCisgICAgZHJhd1RleHR1cmVSZWN0KGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbSwgdGV4dHVyZSwgcGFpbnQpOworCisgICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcygwLjBmLCAwLjBmLCAxLjBmLCAxLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1BhdGNoKFNrQml0bWFwKiBiaXRtYXAsIFJlc19wbmdfOXBhdGNoKiBwYXRjaCwKKyAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChxdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbVRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKworICAgIGludCBhbHBoYTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgZ2V0QWxwaGFBbmRNb2RlKHBhaW50LCAmYWxwaGEsICZtb2RlKTsKKworICAgIFBhdGNoKiBtZXNoID0gbVBhdGNoQ2FjaGUuZ2V0KHBhdGNoKTsKKyAgICBtZXNoLT51cGRhdGVWZXJ0aWNlcyhiaXRtYXAsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKKyAgICAgICAgICAgICZwYXRjaC0+eERpdnNbMF0sICZwYXRjaC0+eURpdnNbMF0sIHBhdGNoLT5udW1YRGl2cywgcGF0Y2gtPm51bVlEaXZzKTsKKworICAgIC8vIFNwZWNpZnkgcmlnaHQgYW5kIGJvdHRvbSBhcyArMS4wZiBmcm9tIGxlZnQvdG9wIHRvIHByZXZlbnQgc2NhbGluZyBzaW5jZSB0aGUKKyAgICAvLyBwYXRjaCBtZXNoIGFscmVhZHkgZGVmaW5lcyB0aGUgZmluYWwgc2l6ZQorICAgIGRyYXdUZXh0dXJlTWVzaChsZWZ0LCB0b3AsIGxlZnQgKyAxLjBmLCB0b3AgKyAxLjBmLCB0ZXh0dXJlLT5pZCwgYWxwaGEgLyAyNTUuMGYsCisgICAgICAgICAgICBtb2RlLCB0ZXh0dXJlLT5ibGVuZCwgJm1lc2gtPnZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLAorICAgICAgICAgICAgJm1lc2gtPnZlcnRpY2VzWzBdLnRleHR1cmVbMF0sIG1lc2gtPmluZGljZXMsIG1lc2gtPmluZGljZXNDb3VudCk7CiB9CiAKIHZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdDb2xvcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSkgewpAQCAtMzg4LDYgKzQ5NywxMCBAQAogfQogCiB2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHApIHsKKyAgICBpZiAocXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOwogCiAgICAgY29uc3QgYm9vbCBpc01vZGUgPSBTa1hmZXJtb2RlOjpJc01vZGUocC0+Z2V0WGZlcm1vZGUoKSwgJm1vZGUpOwpAQCAtNDA2LDk0ICs1MTksMTQ5IEBACiAgICAgZHJhd0NvbG9yUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGNvbG9yLCBtb2RlKTsKIH0KIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZyBpbXBsZW1lbnRhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCiB2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Q29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKICAgICAgICAgaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKICAgICBjb25zdCBpbnQgYWxwaGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRjsKLSAgICBjb25zdCBib29sIGJsZW5kID0gYWxwaGEgPCAyNTUgfHwgbW9kZSAhPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOwotCiAgICAgY29uc3QgR0xmbG9hdCBhID0gYWxwaGEgICAgICAgICAgICAgICAgICAvIDI1NS4wZjsKICAgICBjb25zdCBHTGZsb2F0IHIgPSAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOwogICAgIGNvbnN0IEdMZmxvYXQgZyA9ICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CiAgICAgY29uc3QgR0xmbG9hdCBiID0gKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKIAotICAgIGlmIChibGVuZCkgewotICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIGdsQmxlbmRGdW5jKGdCbGVuZHNbbW9kZV0uc3JjLCBnQmxlbmRzW21vZGVdLmRzdCk7Ci0gICAgfQorICAgIC8vIFByZS1tdWx0aXBsaWNhdGlvbiBoYXBwZW5zIHdoZW4gc2V0dGluZyB0aGUgc2hhZGVyIGNvbG9yCisgICAgY2hvb3NlQmxlbmRpbmcoYWxwaGEgPCAyNTUsIG1vZGUpOwogCiAgICAgbU1vZGVsVmlldy5sb2FkVHJhbnNsYXRlKGxlZnQsIHRvcCwgMC4wZik7CiAgICAgbU1vZGVsVmlldy5zY2FsZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCwgMS4wZik7CiAKLSAgICBtRHJhd0NvbG9yU2hhZGVyLT51c2UoJm1PcnRob01hdHJpeFswXSwgJm1Nb2RlbFZpZXcuZGF0YVswXSwgJm1TbmFwc2hvdC0+dHJhbnNmb3JtLmRhdGFbMF0pOworICAgIGNvbnN0IGJvb2wgaW5Vc2UgPSB1c2VTaGFkZXIobURyYXdDb2xvclNoYWRlcik7CisgICAgbURyYXdDb2xvclNoYWRlci0+c2V0KG1PcnRob01hdHJpeCwgbU1vZGVsVmlldywgbVNuYXBzaG90LT50cmFuc2Zvcm0pOwogCi0gICAgY29uc3QgR0x2b2lkKiBwID0gJmdEcmF3Q29sb3JWZXJ0aWNlc1swXS5wb3NpdGlvblswXTsKLQotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobURyYXdDb2xvclNoYWRlci0+cG9zaXRpb24pOwotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtRHJhd0NvbG9yU2hhZGVyLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAotICAgICAgICAgICAgZ0RyYXdDb2xvclZlcnRleFN0cmlkZSwgcCk7Ci0gICAgZ2xWZXJ0ZXhBdHRyaWI0ZihtRHJhd0NvbG9yU2hhZGVyLT5jb2xvciwgciwgZywgYiwgYSk7CisgICAgaWYgKCFpblVzZSkgeworICAgICAgICBjb25zdCBHTHZvaWQqIHAgPSAmZ0RyYXdDb2xvclZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdOworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobURyYXdDb2xvclNoYWRlci0+cG9zaXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgICAgICBnRHJhd0NvbG9yVmVydGV4U3RyaWRlLCBwKTsKKyAgICB9CisgICAgLy8gUmVuZGVyIHVzaW5nIHByZS1tdWx0aXBsaWVkIGFscGhhCisgICAgZ2xVbmlmb3JtNGYobURyYXdDb2xvclNoYWRlci0+Y29sb3IsIHIgKiBhLCBnICogYSwgYiAqIGEsIGEpOwogCiAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCBnRHJhd0NvbG9yVmVydGV4Q291bnQpOwotCi0gICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobURyYXdDb2xvclNoYWRlci0+cG9zaXRpb24pOwotCi0gICAgaWYgKGJsZW5kKSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgfQogfQogCiB2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dHVyZVJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAotICAgICAgICBHTHVpbnQgdGV4dHVyZSwgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBpc1ByZW11bHRpcGxpZWQpIHsKKyAgICAgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpbnQgYWxwaGE7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGdldEFscGhhQW5kTW9kZShwYWludCwgJmFscGhhLCAmbW9kZSk7CisKKyAgICBkcmF3VGV4dHVyZU1lc2gobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0ZXh0dXJlLT5pZCwgYWxwaGEgLyAyNTUuMGYsIG1vZGUsIHRleHR1cmUtPmJsZW5kLAorICAgICAgICAgICAgJm1EcmF3VGV4dHVyZVZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLCAmbURyYXdUZXh0dXJlVmVydGljZXNbMF0udGV4dHVyZVswXSwgTlVMTCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIEdMdWludCB0ZXh0dXJlLCBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kKSB7CisgICAgZHJhd1RleHR1cmVNZXNoKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdGV4dHVyZSwgYWxwaGEsIG1vZGUsIGJsZW5kLAorICAgICAgICAgICAgJm1EcmF3VGV4dHVyZVZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLCAmbURyYXdUZXh0dXJlVmVydGljZXNbMF0udGV4dHVyZVswXSwgTlVMTCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlTWVzaChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIEdMdWludCB0ZXh0dXJlLCBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kLAorICAgICAgICBHTHZvaWQqIHZlcnRpY2VzLCBHTHZvaWQqIHRleENvb3JkcywgR0x2b2lkKiBpbmRpY2VzLCBHTHNpemVpIGVsZW1lbnRzQ291bnQpIHsKICAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUobGVmdCwgdG9wLCAwLjBmKTsKICAgICBtTW9kZWxWaWV3LnNjYWxlKHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCAxLjBmKTsKIAotICAgIG1EcmF3VGV4dHVyZVNoYWRlci0+dXNlKCZtT3J0aG9NYXRyaXhbMF0sICZtTW9kZWxWaWV3LmRhdGFbMF0sICZtU25hcHNob3QtPnRyYW5zZm9ybS5kYXRhWzBdKTsKKyAgICB1c2VTaGFkZXIobURyYXdUZXh0dXJlU2hhZGVyKTsKKyAgICBtRHJhd1RleHR1cmVTaGFkZXItPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsIG1TbmFwc2hvdC0+dHJhbnNmb3JtKTsKIAotICAgIEdMZW51bSBzb3VyY2VNb2RlID0gZ0JsZW5kc1ttb2RlXS5zcmM7Ci0gICAgaWYgKCFpc1ByZW11bHRpcGxpZWQgJiYgc291cmNlTW9kZSA9PSBHTF9PTkUpIHsKLSAgICAgICAgc291cmNlTW9kZSA9IEdMX1NSQ19BTFBIQTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBUcnkgdG8gZGlzYWJsZSBibGVuZGluZyB3aGVuIHRoZSB0ZXh0dXJlIGlzIG9wYXF1ZSBhbmQgYWxwaGEgPT0gMS4wZgotICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICBnbEJsZW5kRnVuYyhzb3VyY2VNb2RlLCBnQmxlbmRzW21vZGVdLmRzdCk7CisgICAgY2hvb3NlQmxlbmRpbmcoYmxlbmQgfHwgYWxwaGEgPCAxLjBmLCBtb2RlKTsKIAogICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7CiAKLSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwotICAgIGdsVW5pZm9ybTFpKG1EcmF3VGV4dHVyZVNoYWRlci0+c2FtcGxlciwgMCk7CisgICAgLy8gVE9ETyBoYW5kbGUgdGlsaW5nIGFuZCBmaWx0ZXJpbmcgaGVyZQogCi0gICAgY29uc3QgR0x2b2lkKiBwID0gJm1EcmF3VGV4dHVyZVZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdOwotICAgIGNvbnN0IEdMdm9pZCogdCA9ICZtRHJhd1RleHR1cmVWZXJ0aWNlc1swXS50ZXh0dXJlWzBdOworICAgIC8vIEFsd2F5cyBwcmVtdWx0aXBsaWVkCisgICAgZ2xVbmlmb3JtNGYobURyYXdUZXh0dXJlU2hhZGVyLT5jb2xvciwgYWxwaGEsIGFscGhhLCBhbHBoYSwgYWxwaGEpOwogCi0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtRHJhd1RleHR1cmVTaGFkZXItPnBvc2l0aW9uKTsKICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobURyYXdUZXh0dXJlU2hhZGVyLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAotICAgICAgICAgICAgZ0RyYXdUZXh0dXJlVmVydGV4U3RyaWRlLCBwKTsKLQotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobURyYXdUZXh0dXJlU2hhZGVyLT50ZXhDb29yZHMpOworICAgICAgICAgICAgZ0RyYXdUZXh0dXJlVmVydGV4U3RyaWRlLCB2ZXJ0aWNlcyk7CiAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1EcmF3VGV4dHVyZVNoYWRlci0+dGV4Q29vcmRzLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCi0gICAgICAgICAgICBnRHJhd1RleHR1cmVWZXJ0ZXhTdHJpZGUsIHQpOworICAgICAgICAgICAgZ0RyYXdUZXh0dXJlVmVydGV4U3RyaWRlLCB0ZXhDb29yZHMpOwogCi0gICAgZ2xWZXJ0ZXhBdHRyaWI0ZihtRHJhd1RleHR1cmVTaGFkZXItPmNvbG9yLCAxLjBmLCAxLjBmLCAxLjBmLCBhbHBoYSk7Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIGdEcmF3VGV4dHVyZVZlcnRleENvdW50KTsKLQotICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1EcmF3VGV4dHVyZVNoYWRlci0+cG9zaXRpb24pOwotICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1EcmF3VGV4dHVyZVNoYWRlci0+dGV4Q29vcmRzKTsKKyAgICBpZiAoIWluZGljZXMpIHsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCBnRHJhd1RleHR1cmVWZXJ0ZXhDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBlbGVtZW50c0NvdW50LCBHTF9VTlNJR05FRF9TSE9SVCwgaW5kaWNlcyk7CisgICAgfQogCiAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLSAgICBnbERpc2FibGUoR0xfQkxFTkQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpjaG9vc2VCbGVuZGluZyhib29sIGJsZW5kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaXNQcmVtdWx0aXBsaWVkKSB7CisgICAgLy8gSW4gdGhlb3J5IHdlIHNob3VsZCBub3QgYmxlbmQgaWYgdGhlIG1vZGUgaXMgU3JjLCBidXQgaXQncyByYXJlIGVub3VnaAorICAgIC8vIHRoYXQgaXQncyBub3Qgd29ydGggaXQKKyAgICBibGVuZCA9IGJsZW5kIHx8IG1vZGUgIT0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICBpZiAoYmxlbmQpIHsKKyAgICAgICAgaWYgKCFtQmxlbmQpIHsKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgfQorCisgICAgICAgIEdMZW51bSBzb3VyY2VNb2RlID0gZ0JsZW5kc1ttb2RlXS5zcmM7CisgICAgICAgIEdMZW51bSBkZXN0TW9kZSA9IGdCbGVuZHNbbW9kZV0uZHN0OworICAgICAgICBpZiAoIWlzUHJlbXVsdGlwbGllZCAmJiBzb3VyY2VNb2RlID09IEdMX09ORSkgeworICAgICAgICAgICAgc291cmNlTW9kZSA9IEdMX1NSQ19BTFBIQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzb3VyY2VNb2RlICE9IG1MYXN0U3JjTW9kZSB8fCBkZXN0TW9kZSAhPSBtTGFzdERzdE1vZGUpIHsKKyAgICAgICAgICAgIGdsQmxlbmRGdW5jKHNvdXJjZU1vZGUsIGRlc3RNb2RlKTsKKyAgICAgICAgICAgIG1MYXN0U3JjTW9kZSA9IHNvdXJjZU1vZGU7CisgICAgICAgICAgICBtTGFzdERzdE1vZGUgPSBkZXN0TW9kZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUJsZW5kKSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgfQorICAgIG1CbGVuZCA9IGJsZW5kOworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjp1c2VTaGFkZXIoY29uc3Qgc3A8UHJvZ3JhbT4mIHNoYWRlcikgeworICAgIGlmICghc2hhZGVyLT5pc0luVXNlKCkpIHsKKyAgICAgICAgbUN1cnJlbnRTaGFkZXItPnJlbW92ZSgpOworICAgICAgICBzaGFkZXItPnVzZSgpOworICAgICAgICBtQ3VycmVudFNoYWRlciA9IHNoYWRlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXREcmF3VGV4dHVyZVRleENvb3JkcyhmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2MikgewotICAgIG1EcmF3VGV4dHVyZVZlcnRpY2VzWzBdLnRleHR1cmVbMF0gPSB1MTsKLSAgICBtRHJhd1RleHR1cmVWZXJ0aWNlc1swXS50ZXh0dXJlWzFdID0gdjI7Ci0gICAgbURyYXdUZXh0dXJlVmVydGljZXNbMV0udGV4dHVyZVswXSA9IHUyOwotICAgIG1EcmF3VGV4dHVyZVZlcnRpY2VzWzFdLnRleHR1cmVbMV0gPSB2MjsKLSAgICBtRHJhd1RleHR1cmVWZXJ0aWNlc1syXS50ZXh0dXJlWzBdID0gdTE7Ci0gICAgbURyYXdUZXh0dXJlVmVydGljZXNbMl0udGV4dHVyZVsxXSA9IHYxOwotICAgIG1EcmF3VGV4dHVyZVZlcnRpY2VzWzNdLnRleHR1cmVbMF0gPSB1MjsKLSAgICBtRHJhd1RleHR1cmVWZXJ0aWNlc1szXS50ZXh0dXJlWzFdID0gdjE7CisgICAgVGV4dHVyZVZlcnRleCogdiA9ICZtRHJhd1RleHR1cmVWZXJ0aWNlc1swXTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUxLCB2MSk7CisgICAgVGV4dHVyZVZlcnRleDo6c2V0VVYodisrLCB1MiwgdjEpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldFVWKHYrKywgdTEsIHYyKTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUyLCB2Mik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmdldEFscGhhQW5kTW9kZShjb25zdCBTa1BhaW50KiBwYWludCwgaW50KiBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSogbW9kZSkgeworICAgIGlmIChwYWludCkgeworICAgICAgICBjb25zdCBib29sIGlzTW9kZSA9IFNrWGZlcm1vZGU6OklzTW9kZShwYWludC0+Z2V0WGZlcm1vZGUoKSwgbW9kZSk7CisgICAgICAgIGlmICghaXNNb2RlKSB7CisgICAgICAgICAgICAvLyBBc3N1bWUgU1JDX09WRVIKKyAgICAgICAgICAgICptb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNraWEgZHJhd3MgdXNpbmcgdGhlIGNvbG9yJ3MgYWxwaGEgY2hhbm5lbCBpZiA8IDI1NQorICAgICAgICAvLyBPdGhlcndpc2UsIGl0IHVzZXMgdGhlIHBhaW50J3MgYWxwaGEKKyAgICAgICAgaW50IGNvbG9yID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgICAgICphbHBoYSA9IChjb2xvciA+PiAyNCkgJiAweEZGOworICAgICAgICBpZiAoKmFscGhhID09IDI1NSkgeworICAgICAgICAgICAgKmFscGhhID0gcGFpbnQtPmdldEFscGhhKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgICphbHBoYSA9IDI1NTsKKyAgICB9CiB9CiAKIH07IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCmluZGV4IGU1Y2M5OGMuLjExNjVhYjYgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCkBAIC0yNiwxMyArMjYsMTYgQEAKICNpbmNsdWRlIDxTa1hmZXJtb2RlLmg+CiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVzb3VyY2VUeXBlcy5oPgogCiAjaW5jbHVkZSAiTWF0cml4LmgiCiAjaW5jbHVkZSAiUHJvZ3JhbS5oIgogI2luY2x1ZGUgIlJlY3QuaCIKICNpbmNsdWRlICJTbmFwc2hvdC5oIgotI2luY2x1ZGUgIlRleHR1cmUuaCIKICNpbmNsdWRlICJUZXh0dXJlQ2FjaGUuaCIKKyNpbmNsdWRlICJMYXllckNhY2hlLmgiCisjaW5jbHVkZSAiUGF0Y2hDYWNoZS5oIgorI2luY2x1ZGUgIlZlcnRleC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgdWlyZW5kZXJlciB7CkBAIC00MiwyMiArNDUsNiBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAvKioKLSAqIFNpbXBsZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSB2ZXJ0ZXggd2l0aCBhIHBvc2l0aW9uLgotICogVGhpcyBpcyB1c2VkIHRvIGRyYXcgZmlsbGVkIHJlY3RhbmdsZXMgd2l0aG91dCBhIHRleHR1cmUuCi0gKi8KLXN0cnVjdCBTaW1wbGVWZXJ0ZXggewotICAgIGZsb2F0IHBvc2l0aW9uWzJdOwotfTsgLy8gc3RydWN0IFNpbXBsZVZlcnRleAotCi0vKioKLSAqIFNpbXBsZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSB2ZXJ0ZXggd2l0aCBhIHBvc2l0aW9uIGFuZCBhIHRleHR1cmUuCi0gKi8KLXN0cnVjdCBUZXh0dXJlVmVydGV4IHsKLSAgICBmbG9hdCBwb3NpdGlvblsyXTsKLSAgICBmbG9hdCB0ZXh0dXJlWzJdOwotfTsgLy8gc3RydWN0IFRleHR1cmVWZXJ0ZXgKLQotLyoqCiAgKiBTdHJ1Y3R1cmUgbWFwcGluZyBTa2lhIHhmZXJtb2RlcyB0byBPcGVuR0wgYmxlbmRpbmcgZmFjdG9ycy4KICAqLwogc3RydWN0IEJsZW5kZXIgewpAQCAtMTAyLDcgKzg5LDEyIEBACiAgICAgYm9vbCBxdWlja1JlamVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pOwogICAgIGJvb2wgY2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKTsKIAotICAgIHZvaWQgZHJhd0JpdG1hcChjb25zdCBTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAorICAgICAgICAgICAgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLCBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3UGF0Y2goU2tCaXRtYXAqIGJpdG1hcCwgUmVzX3BuZ185cGF0Y2gqIHBhdGNoLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CiAgICAgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOwogICAgIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CiAKQEAgLTE4MywxNiArMTc1LDUxIEBACiAgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHRleHR1cmUgbmFtZSB0byBtYXAgb250byB0aGUgcmVjdGFuZ2xlCiAgICAgICogQHBhcmFtIGFscGhhIEFuIGFkZGl0aW9uYWwgdHJhbnNsdWNlbmN5IHBhcmFtZXRlciwgYmV0d2VlbiAwLjBmIGFuZCAxLjBmCiAgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUKLSAgICAgKiBAcGFyYW0gaXNQcmVtdWx0aXBsaWVkIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0ZXh0dXJlIGhhcyBwcmVtdWx0aXBsaWVkIGFscGhhCisgICAgICogQHBhcmFtIGJsZW5kIFRydWUgaWYgdGhlIHRleHR1cmUgY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbAogICAgICAqLwogICAgIHZvaWQgZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgR0x1aW50IHRleHR1cmUsCi0gICAgICAgICAgICBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlzUHJlbXVsdGlwbGllZCA9IGZhbHNlKTsKKyAgICAgICAgICAgIGZsb2F0IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgYmxlbmQpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSB0ZXh0dXJlZCByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHR1cmUuIFRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMKKyAgICAgKiBhcmUgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgc25hcHNob3QncyB0cmFuc2Zvcm0gbWF0cml4LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIHRvIHVzZQorICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgY29udGFpbmluZyB0aGUgYWxwaGEsIGJsZW5kaW5nIG1vZGUsIGV0Yy4KKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIHRleHR1cmVkIG1lc2ggd2l0aCB0aGUgc3BlY2lmaWVkIHRleHR1cmUuIElmIHRoZSBpbmRpY2VzIGFyZSBvbWl0dGVkLCB0aGUKKyAgICAgKiBtZXNoIGlzIGRyYXduIGFzIGEgc2ltcGxlIHF1YWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHRleHR1cmUgbmFtZSB0byBtYXAgb250byB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGFscGhhIEFuIGFkZGl0aW9uYWwgdHJhbnNsdWNlbmN5IHBhcmFtZXRlciwgYmV0d2VlbiAwLjBmIGFuZCAxLjBmCisgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUKKyAgICAgKiBAcGFyYW0gYmxlbmQgVHJ1ZSBpZiB0aGUgdGV4dHVyZSBjb250YWlucyBhbiBhbHBoYSBjaGFubmVsCisgICAgICogQHBhcmFtIHZlcnRpY2VzIFRoZSB2ZXJ0aWNlcyB0aGF0IGRlZmluZSB0aGUgbWVzaAorICAgICAqIEBwYXJhbSB0ZXhDb29yZHMgVGhlIHRleHR1cmUgY29vcmRpbmF0ZXMgb2YgZWFjaCB2ZXJ0ZXgKKyAgICAgKiBAcGFyYW0gaW5kaWNlcyBUaGUgaW5kaWNlcyBvZiB0aGUgdmVydGljZXMsIGNhbiBiZSBOVUxMCisgICAgICogQHBhcmFtIGVsZW1lbnRzQ291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWVzaCwgcmVxdWlyZWQgYnkgaW5kaWNlcworICAgICAqLworICAgIHZvaWQgZHJhd1RleHR1cmVNZXNoKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgR0x1aW50IHRleHR1cmUsCisgICAgICAgICAgICBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kLAorICAgICAgICAgICAgR0x2b2lkKiB2ZXJ0aWNlcywgR0x2b2lkKiB0ZXhDb29yZHMsIEdMdm9pZCogaW5kaWNlcywgR0xzaXplaSBlbGVtZW50c0NvdW50ID0gMCk7CiAKICAgICAvKioKICAgICAgKiBSZXNldHMgdGhlIHRleHR1cmUgY29vcmRpbmF0ZXMgc3RvcmVkIGluIG1EcmF3VGV4dHVyZVZlcnRpY2VzLiBTZXR0aW5nIHRoZSB2YWx1ZXMKICAgICAgKiBiYWNrIHRvIGRlZmF1bHQgaXMgYWNoaWV2ZWQgYnkgY2FsbGluZzoKICAgICAgKgotICAgICAqIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoMC4wZiwgMS4wZiwgMS4wZiwgMC4wZik7CisgICAgICogcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcygwLjBmLCAwLjBmLCAxLjBmLCAxLjBmKTsKICAgICAgKgogICAgICAqIEBwYXJhbSB1MSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCiAgICAgICogQHBhcmFtIHYxIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgdGV4dHVyZQpAQCAtMjAxLDExICsyMjgsMzcgQEAKICAgICAgKi8KICAgICB2b2lkIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB1MiwgZmxvYXQgdjIpOwogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYWxwaGEgYW5kIHhmZXJtb2RlIG91dCBvZiBhIHBhaW50IG9iamVjdC4gSWYgdGhlIHBhaW50IGlzIG51bGwKKyAgICAgKiBhbHBoYSB3aWxsIGJlIDI1NSBhbmQgdGhlIHhmZXJtb2RlIHdpbGwgYmUgU1JDX09WRVIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IHRvIGV4dHJhY3QgdmFsdWVzIGZyb20KKyAgICAgKiBAcGFyYW0gYWxwaGEgV2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyBhbHBoYQorICAgICAqIEBwYXJhbSBtb2RlIFdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgeGZlcm1vZGUKKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBnZXRBbHBoYUFuZE1vZGUoY29uc3QgU2tQYWludCogcGFpbnQsIGludCogYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUqIG1vZGUpOworCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgYmxlbmRpbmcgYXMgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGFwcHJvcHJpYXRlCisgICAgICogYmxlbmQgZnVuY3Rpb24gYmFzZWQgb24gdGhlIHNwZWNpZmllZCB4ZmVybW9kZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBjaG9vc2VCbGVuZGluZyhib29sIGJsZW5kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaXNQcmVtdWx0aXBsaWVkID0gdHJ1ZSk7CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhlIHNwZWNpZmllZCBzaGFkZXIgd2l0aCB0aGUgY3VycmVudCBHTCBjb250ZXh0LiBJZiB0aGUgc2hhZGVyIGlzIGFscmVhZHkKKyAgICAgKiBpbiB1c2UsIGl0IHdpbGwgbm90IGJlIGJvdW5kIGFnYWluLiBJZiBpdCBpcyBub3QgaW4gdXNlLCB0aGUgY3VycmVudCBzaGFkZXIgaXMKKyAgICAgKiBtYXJrZWQgdW51c2VkIGFuZCB0aGUgc3BlY2lmaWVkIHNoYWRlciBiZWNvbWVzIHVzZWQgYW5kIGJlY29tZXMgdGhlIG5ldworICAgICAqIGN1cnJlbnQgc2hhZGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIElmIHRoZSBzcGVjaWZpZWQgc2hhZGVyIHdhcyBhbHJlYWR5IGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGlubGluZSBib29sIHVzZVNoYWRlcihjb25zdCBzcDxQcm9ncmFtPiYgc2hhZGVyKTsKKwogICAgIC8vIERpbWVuc2lvbnMgb2YgdGhlIGRyYXdpbmcgc3VyZmFjZQogICAgIGludCBtV2lkdGgsIG1IZWlnaHQ7CiAKICAgICAvLyBNYXRyaXggdXNlZCBmb3Igb3J0aG8gcHJvamVjdGlvbiBpbiBzaGFkZXJzCi0gICAgZmxvYXQgbU9ydGhvTWF0cml4WzE2XTsKKyAgICBtYXQ0IG1PcnRob01hdHJpeDsKIAogICAgIC8vIE1vZGVsLXZpZXcgbWF0cml4IHVzZWQgdG8gcG9zaXRpb24vc2l6ZSBvYmplY3RzCiAgICAgbWF0NCBtTW9kZWxWaWV3OwpAQCAtMjE4LDE0ICsyNzEsMjIgQEAKICAgICBzcDxTbmFwc2hvdD4gbVNuYXBzaG90OwogCiAgICAgLy8gU2hhZGVycworICAgIHNwPFByb2dyYW0+IG1DdXJyZW50U2hhZGVyOwogICAgIHNwPERyYXdDb2xvclByb2dyYW0+IG1EcmF3Q29sb3JTaGFkZXI7CiAgICAgc3A8RHJhd1RleHR1cmVQcm9ncmFtPiBtRHJhd1RleHR1cmVTaGFkZXI7CiAKICAgICAvLyBVc2VkIHRvIGRyYXcgdGV4dHVyZWQgcXVhZHMKICAgICBUZXh0dXJlVmVydGV4IG1EcmF3VGV4dHVyZVZlcnRpY2VzWzRdOwogCi0gICAgLy8gVXNlZCB0byBjYWNoZSBhbGwgZHJhd0JpdG1hcCB0ZXh0dXJlcworICAgIC8vIExhc3Qga25vd24gYmxlbmQgc3RhdGUKKyAgICBib29sIG1CbGVuZDsKKyAgICBHTGVudW0gbUxhc3RTcmNNb2RlOworICAgIEdMZW51bSBtTGFzdERzdE1vZGU7CisKKyAgICAvLyBWYXJpb3VzIGNhY2hlcwogICAgIFRleHR1cmVDYWNoZSBtVGV4dHVyZUNhY2hlOworICAgIExheWVyQ2FjaGUgbUxheWVyQ2FjaGU7CisgICAgUGF0Y2hDYWNoZSBtUGF0Y2hDYWNoZTsKIH07IC8vIGNsYXNzIE9wZW5HTFJlbmRlcmVyCiAKIH07IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0Y2guY3BwIGIvbGlicy9od3VpL1BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjZiYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGNoLmNwcApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJQYXRjaC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhdGNoOjpQYXRjaChjb25zdCB1aW50MzJfdCB4Q291bnQsIGNvbnN0IHVpbnQzMl90IHlDb3VudCk6CisgICAgICAgIHhDb3VudCh4Q291bnQgKyAyKSwgeUNvdW50KHlDb3VudCArIDIpIHsKKyAgICB2ZXJ0aWNlc0NvdW50ID0gKHhDb3VudCArIDIpICogKHlDb3VudCArIDIpOworICAgIHZlcnRpY2VzID0gbmV3IFRleHR1cmVWZXJ0ZXhbdmVydGljZXNDb3VudF07CisKKyAgICAvLyAyIHRyaWFuZ2xlcyBwZXIgcGF0Y2gsIDMgdmVydGljZXMgcGVyIHRyaWFuZ2xlCisgICAgaW5kaWNlc0NvdW50ID0gKHhDb3VudCArIDEpICogKHlDb3VudCArIDEpICogMiAqIDM7CisgICAgaW5kaWNlcyA9IG5ldyB1aW50MTZfdFtpbmRpY2VzQ291bnRdOworCisgICAgY29uc3QgdWludDMyX3QgeE51bSA9IHhDb3VudCArIDE7CisgICAgY29uc3QgdWludDMyX3QgeU51bSA9IHlDb3VudCArIDE7CisKKyAgICB1aW50MTZfdCogc3RhcnRJbmRpY2VzID0gaW5kaWNlczsKKyAgICB1aW50MzJfdCBuID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgeU51bTsgeSsrKSB7CisgICAgICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCB4TnVtOyB4KyspIHsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG47CisgICAgICAgICAgICAqc3RhcnRJbmRpY2VzKysgPSBuICsgMTsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyB4TnVtICsgMjsKKworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbjsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyB4TnVtICsgMjsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyB4TnVtICsgMTsKKworICAgICAgICAgICAgbiArPSAxOworICAgICAgICB9CisgICAgICAgIG4gKz0gMTsKKyAgICB9Cit9CisKK1BhdGNoOjp+UGF0Y2goKSB7CisgICAgZGVsZXRlIGluZGljZXM7CisgICAgZGVsZXRlIHZlcnRpY2VzOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWZXJ0aWNlcyBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0Y2g6OnVwZGF0ZVZlcnRpY2VzKGNvbnN0IFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsCisgICAgICAgIGZsb2F0IGJvdHRvbSwgY29uc3QgaW50MzJfdCogeERpdnMsICBjb25zdCBpbnQzMl90KiB5RGl2cywgY29uc3QgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCkgeworICAgIGNvbnN0IHVpbnQzMl90IHhTdHJldGNoQ291bnQgPSAod2lkdGggKyAxKSA+PiAxOworICAgIGNvbnN0IHVpbnQzMl90IHlTdHJldGNoQ291bnQgPSAoaGVpZ2h0ICsgMSkgPj4gMTsKKworICAgIGZsb2F0IHhTdHJldGNoID0gMDsKKyAgICBmbG9hdCB5U3RyZXRjaCA9IDA7CisgICAgZmxvYXQgeFN0cmV0Y2hUZXggPSAwOworICAgIGZsb2F0IHlTdHJldGNoVGV4ID0gMDsKKworICAgIGNvbnN0IGZsb2F0IG1lc2hXaWR0aCA9IHJpZ2h0IC0gbGVmdDsKKworICAgIGNvbnN0IGZsb2F0IGJpdG1hcFdpZHRoID0gZmxvYXQoYml0bWFwLT53aWR0aCgpKTsKKyAgICBjb25zdCBmbG9hdCBiaXRtYXBIZWlnaHQgPSBmbG9hdChiaXRtYXAtPmhlaWdodCgpKTsKKworICAgIGlmICh4U3RyZXRjaENvdW50ID4gMCkgeworICAgICAgICB1aW50MzJfdCBzdHJldGNoU2l6ZSA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCB3aWR0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBzdHJldGNoU2l6ZSArPSB4RGl2c1tpXSAtIHhEaXZzW2kgLSAxXTsKKyAgICAgICAgfQorICAgICAgICB4U3RyZXRjaFRleCA9IChzdHJldGNoU2l6ZSAvIGJpdG1hcFdpZHRoKSAvIHhTdHJldGNoQ291bnQ7CisgICAgICAgIGNvbnN0IGZsb2F0IGZpeGVkID0gYml0bWFwV2lkdGggLSBzdHJldGNoU2l6ZTsKKyAgICAgICAgeFN0cmV0Y2ggPSAocmlnaHQgLSBsZWZ0IC0gZml4ZWQpIC8geFN0cmV0Y2hDb3VudDsKKyAgICB9CisKKyAgICBpZiAoeVN0cmV0Y2hDb3VudCA+IDApIHsKKyAgICAgICAgdWludDMyX3Qgc3RyZXRjaFNpemUgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgaGVpZ2h0OyBpICs9IDIpIHsKKyAgICAgICAgICAgIHN0cmV0Y2hTaXplICs9IHlEaXZzW2ldIC0geURpdnNbaSAtIDFdOworICAgICAgICB9CisgICAgICAgIHlTdHJldGNoVGV4ID0gKHN0cmV0Y2hTaXplIC8gYml0bWFwSGVpZ2h0KSAvIHlTdHJldGNoQ291bnQ7CisgICAgICAgIGNvbnN0IGZsb2F0IGZpeGVkID0gYml0bWFwSGVpZ2h0IC0gc3RyZXRjaFNpemU7CisgICAgICAgIHlTdHJldGNoID0gKGJvdHRvbSAtIHRvcCAtIGZpeGVkKSAvIHlTdHJldGNoQ291bnQ7CisgICAgfQorCisgICAgZmxvYXQgdnkgPSAwLjBmOworICAgIGZsb2F0IHR5ID0gMC4wZjsKKyAgICBUZXh0dXJlVmVydGV4KiB2ZXJ0ZXggPSB2ZXJ0aWNlczsKKworICAgIGdlbmVyYXRlVmVydGljZXModmVydGV4LCAwLjBmLCAwLjBmLCB4RGl2cywgd2lkdGgsIHhTdHJldGNoLCB4U3RyZXRjaFRleCwKKyAgICAgICAgICAgIG1lc2hXaWR0aCwgYml0bWFwV2lkdGgpOworICAgIHZlcnRleCArPSB3aWR0aCArIDI7CisKKyAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKHkgJiAxKSB7CisgICAgICAgICAgICB2eSArPSB5U3RyZXRjaDsKKyAgICAgICAgICAgIHR5ICs9IHlTdHJldGNoVGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgc3RlcCA9IGZsb2F0KHlEaXZzW3ldKTsKKyAgICAgICAgICAgIHZ5ICs9IHN0ZXA7CisgICAgICAgICAgICB0eSArPSBzdGVwIC8gYml0bWFwSGVpZ2h0OworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlVmVydGljZXModmVydGV4LCB2eSwgdHksIHhEaXZzLCB3aWR0aCwgeFN0cmV0Y2gsIHhTdHJldGNoVGV4LAorICAgICAgICAgICAgICAgIG1lc2hXaWR0aCwgYml0bWFwV2lkdGgpOworICAgICAgICB2ZXJ0ZXggKz0gd2lkdGggKyAyOworICAgIH0KKworICAgIGdlbmVyYXRlVmVydGljZXModmVydGV4LCBib3R0b20gLSB0b3AsIDEuMGYsIHhEaXZzLCB3aWR0aCwgeFN0cmV0Y2gsIHhTdHJldGNoVGV4LAorICAgICAgICAgICAgbWVzaFdpZHRoLCBiaXRtYXBXaWR0aCk7Cit9CisKK2lubGluZSB2b2lkIFBhdGNoOjpnZW5lcmF0ZVZlcnRpY2VzKFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgeSwgZmxvYXQgdiwKKyAgICAgICAgY29uc3QgaW50MzJfdCB4RGl2c1tdLCB1aW50MzJfdCB4Q291bnQsIGZsb2F0IHhTdHJldGNoLCBmbG9hdCB4U3RyZXRjaFRleCwKKyAgICAgICAgZmxvYXQgd2lkdGgsIGZsb2F0IHdpZHRoVGV4KSB7CisgICAgZmxvYXQgdnggPSAwLjBmOworICAgIGZsb2F0IHR4ID0gMC4wZjsKKworICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgsIHZ4LCB5LCB0eCwgdik7CisgICAgdmVydGV4Kys7CisKKyAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgeENvdW50OyB4KyspIHsKKyAgICAgICAgaWYgKHggJiAxKSB7CisgICAgICAgICAgICB2eCArPSB4U3RyZXRjaDsKKyAgICAgICAgICAgIHR4ICs9IHhTdHJldGNoVGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgc3RlcCA9IGZsb2F0KHhEaXZzW3hdKTsKKyAgICAgICAgICAgIHZ4ICs9IHN0ZXA7CisgICAgICAgICAgICB0eCArPSBzdGVwIC8gd2lkdGhUZXg7CisgICAgICAgIH0KKworICAgICAgICBUZXh0dXJlVmVydGV4OjpzZXQodmVydGV4LCB2eCwgeSwgdHgsIHYpOworICAgICAgICB2ZXJ0ZXgrKzsKKyAgICB9CisKKyAgICBUZXh0dXJlVmVydGV4OjpzZXQodmVydGV4LCB3aWR0aCwgeSwgMS4wZiwgdik7CisgICAgdmVydGV4Kys7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlYnVnIHRvb2xzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0Y2g6OmR1bXAoKSB7CisgICAgTE9HRCgiVmVydGljZXMgWyIpOworICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCB5Q291bnQ7IHkrKykgeworICAgICAgICBjaGFyIGJ1ZmZlcls1MTJdOworICAgICAgICBidWZmZXJbMF0gPSAnXDAnOworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgeENvdW50OyB4KyspIHsKKyAgICAgICAgICAgIFRleHR1cmVWZXJ0ZXgqIHYgPSAmdmVydGljZXNbeSAqIHhDb3VudCArIHhdOworICAgICAgICAgICAgb2Zmc2V0ICs9IHNwcmludGYoJmJ1ZmZlcltvZmZzZXRdLCAiICglLjRmLCUuNGYpLSglLjRmLCUuNGYpIiwKKyAgICAgICAgICAgICAgICAgICAgdi0+cG9zaXRpb25bMF0sIHYtPnBvc2l0aW9uWzFdLCB2LT50ZXh0dXJlWzBdLCB2LT50ZXh0dXJlWzFdKTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCIgIFslcyBdIiwgYnVmZmVyKTsKKyAgICB9CisgICAgTE9HRCgiXVxuSW5kaWNlcyBbICIpOworICAgIGNoYXIgYnVmZmVyWzQwOTZdOworICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5kaWNlc0NvdW50OyBpKyspIHsKKyAgICAgICAgb2Zmc2V0ICs9IHNwcmludGYoJmJ1ZmZlcltvZmZzZXRdLCAiJWQgIiwgaW5kaWNlc1tpXSk7CisgICAgfQorICAgIExPR0QoIiAgJXNcbl0iLCBidWZmZXIpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaC5oIGIvbGlicy9od3VpL1BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzYWQwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUEFUQ0hfSAorI2RlZmluZSBBTkRST0lEX1VJX1BBVENIX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKworI2luY2x1ZGUgIlZlcnRleC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBwYXRjaC4KKyAqLworc3RydWN0IFBhdGNoRGVzY3JpcHRpb24geworICAgIFBhdGNoRGVzY3JpcHRpb24oKTogeENvdW50KDApLCB5Q291bnQoMCkgeyB9CisgICAgUGF0Y2hEZXNjcmlwdGlvbihjb25zdCB1aW50MzJfdCB4Q291bnQsIGNvbnN0IHVpbnQzMl90IHlDb3VudCk6CisgICAgICAgICAgICB4Q291bnQoeENvdW50KSwgeUNvdW50KHlDb3VudCkgeyB9CisgICAgUGF0Y2hEZXNjcmlwdGlvbihjb25zdCBQYXRjaERlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik6CisgICAgICAgICAgICB4Q291bnQoZGVzY3JpcHRpb24ueENvdW50KSwgeUNvdW50KGRlc2NyaXB0aW9uLnlDb3VudCkgeyB9CisKKyAgICB1aW50MzJfdCB4Q291bnQ7CisgICAgdWludDMyX3QgeUNvdW50OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiYgcmhzKSBjb25zdCB7CisgICAgICAgIGlmICh4Q291bnQgPT0gcmhzLnhDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIHlDb3VudCA8IHJocy55Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHhDb3VudCA8IHJocy54Q291bnQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhdGNoRGVzY3JpcHRpb24mIHJocykgY29uc3QgeworICAgICAgICByZXR1cm4geENvdW50ID09IHJocy54Q291bnQgJiYgeUNvdW50ID09IHJocy55Q291bnQ7CisgICAgfQorfTsgLy8gc3RydWN0IFBhdGNoRGVzY3JpcHRpb24KKworLyoqCisgKiBBbiBPcGVuR0wgcGF0Y2guIFRoaXMgY29udGFpbnMgYW4gYXJyYXkgb2YgdmVydGljZXMgYW5kIGFuIGFycmF5IG9mCisgKiBpbmRpY2VzIHRvIHJlbmRlciB0aGUgdmVydGljZXMuCisgKi8KK3N0cnVjdCBQYXRjaCB7CisgICAgUGF0Y2goY29uc3QgdWludDMyX3QgeENvdW50LCBjb25zdCB1aW50MzJfdCB5Q291bnQpOworICAgIH5QYXRjaCgpOworCisgICAgdm9pZCB1cGRhdGVWZXJ0aWNlcyhjb25zdCBTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBpbnQzMl90KiB4RGl2cywgIGNvbnN0IGludDMyX3QqIHlEaXZzLAorICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgd2lkdGgsIGNvbnN0IHVpbnQzMl90IGhlaWdodCk7CisgICAgdm9pZCBkdW1wKCk7CisKKyAgICB1aW50MzJfdCB4Q291bnQ7CisgICAgdWludDMyX3QgeUNvdW50OworCisgICAgdWludDE2X3QqIGluZGljZXM7CisgICAgdWludDMyX3QgaW5kaWNlc0NvdW50OworCisgICAgVGV4dHVyZVZlcnRleCogdmVydGljZXM7CisgICAgdWludDMyX3QgdmVydGljZXNDb3VudDsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgZ2VuZXJhdGVWZXJ0aWNlcyhUZXh0dXJlVmVydGV4KiB2ZXJ0ZXgsIGZsb2F0IHksIGZsb2F0IHYsCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHhEaXZzW10sIHVpbnQzMl90IHhDb3VudCwgZmxvYXQgeFN0cmV0Y2gsIGZsb2F0IHhTdHJldGNoVGV4LAorICAgICAgICAgICAgZmxvYXQgd2lkdGgsIGZsb2F0IHdpZHRoVGV4KTsKK307IC8vIHN0cnVjdCBQYXRjaAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUEFUQ0hfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoQ2FjaGUuY3BwIGIvbGlicy9od3VpL1BhdGNoQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NGUzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2hDYWNoZS5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlICJQYXRjaENhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGF0Y2hDYWNoZTo6UGF0Y2hDYWNoZSh1aW50MzJfdCBtYXhFbnRyaWVzKTogbUNhY2hlKG1heEVudHJpZXMpIHsKK30KKworUGF0Y2hDYWNoZTo6flBhdGNoQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FsbGJhY2tzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0Y2hDYWNoZTo6b3BlcmF0b3IoKShQYXRjaERlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgUGF0Y2gqJiBtZXNoKSB7CisgICAgaWYgKG1lc2gpIGRlbGV0ZSBtZXNoOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0Y2hDYWNoZTo6Y2xlYXIoKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7CisgICAgbUNhY2hlLmNsZWFyKCk7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIoTlVMTCk7Cit9CisKK1BhdGNoKiBQYXRjaENhY2hlOjpnZXQoY29uc3QgUmVzX3BuZ185cGF0Y2gqIHBhdGNoKSB7CisgICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBwYXRjaC0+bnVtWERpdnM7CisgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gcGF0Y2gtPm51bVlEaXZzOworICAgIGNvbnN0IFBhdGNoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24od2lkdGgsIGhlaWdodCk7CisKKyAgICBQYXRjaCogbWVzaCA9IG1DYWNoZS5nZXQoZGVzY3JpcHRpb24pOworICAgIGlmICghbWVzaCkgeworICAgICAgICBQQVRDSF9MT0dEKCJDcmVhdGluZyBuZXcgcGF0Y2ggbWVzaCwgdz0lZCBoPSVkIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIG1lc2ggPSBuZXcgUGF0Y2god2lkdGgsIGhlaWdodCk7CisgICAgICAgIG1DYWNoZS5wdXQoZGVzY3JpcHRpb24sIG1lc2gpOworICAgIH0KKworICAgIHJldHVybiBtZXNoOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaENhY2hlLmggYi9saWJzL2h3dWkvUGF0Y2hDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTUwODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2hDYWNoZS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUEFUQ0hfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1BBVENIX0NBQ0hFX0gKKworI2luY2x1ZGUgIlBhdGNoLmgiCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBEZWJ1ZworI2RlZmluZSBERUJVR19QQVRDSEVTIDAKKworLy8gRGVidWcKKyNpZiBERUJVR19QQVRDSEVTCisgICAgI2RlZmluZSBQQVRDSF9MT0dEKC4uLikgTE9HRChfX1ZBX0FSR1NfXykKKyNlbHNlCisgICAgI2RlZmluZSBQQVRDSF9MT0dEKC4uLikKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBQYXRjaENhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8UGF0Y2hEZXNjcmlwdGlvbiwgUGF0Y2gqPiB7CitwdWJsaWM6CisgICAgUGF0Y2hDYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSk7CisgICAgflBhdGNoQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoUGF0Y2hEZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIFBhdGNoKiYgbWVzaCk7CisKKyAgICBQYXRjaCogZ2V0KGNvbnN0IFJlc19wbmdfOXBhdGNoKiBwYXRjaCk7CisgICAgdm9pZCBjbGVhcigpOworCitwcml2YXRlOgorICAgIEdlbmVyYXRpb25DYWNoZTxQYXRjaERlc2NyaXB0aW9uLCBQYXRjaCo+IG1DYWNoZTsKK307IC8vIGNsYXNzIFBhdGNoQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BBVENIX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9ncmFtLmNwcCBiL2xpYnMvaHd1aS9Qcm9ncmFtLmNwcAppbmRleCAyYWNkZGZjLi42MDliMjhhIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvUHJvZ3JhbS5jcHAKKysrIGIvbGlicy9od3VpL1Byb2dyYW0uY3BwCkBAIC01OSw2ICs1OSw4IEBACiAgICAgICAgIH0KICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKGlkKTsKICAgICB9CisKKyAgICBtVXNlID0gZmFsc2U7CiB9CiAKIFByb2dyYW06On5Qcm9ncmFtKCkgewpAQCAtNjksNiArNzEsMTEgQEAKIAogdm9pZCBQcm9ncmFtOjp1c2UoKSB7CiAgICAgZ2xVc2VQcm9ncmFtKGlkKTsKKyAgICBtVXNlID0gdHJ1ZTsKK30KKwordm9pZCBQcm9ncmFtOjpyZW1vdmUoKSB7CisgICAgbVVzZSA9IGZhbHNlOwogfQogCiBpbnQgUHJvZ3JhbTo6YWRkQXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpIHsKQEAgLTEyNiwxOCArMTMzLDI3IEBACiAKIHZvaWQgRHJhd0NvbG9yUHJvZ3JhbTo6Z2V0QXR0cmlic0FuZFVuaWZvcm1zKCkgewogICAgIHBvc2l0aW9uID0gYWRkQXR0cmliKCJwb3NpdGlvbiIpOwotICAgIGNvbG9yID0gYWRkQXR0cmliKCJjb2xvciIpOwotICAgIHByb2plY3Rpb24gPSBhZGRVbmlmb3JtKCJwcm9qZWN0aW9uIik7Ci0gICAgbW9kZWxWaWV3ID0gYWRkVW5pZm9ybSgibW9kZWxWaWV3Iik7CisgICAgY29sb3IgPSBhZGRVbmlmb3JtKCJjb2xvciIpOwogICAgIHRyYW5zZm9ybSA9IGFkZFVuaWZvcm0oInRyYW5zZm9ybSIpOwogfQogCi12b2lkIERyYXdDb2xvclByb2dyYW06OnVzZShjb25zdCBHTGZsb2F0KiBwcm9qZWN0aW9uTWF0cml4LCBjb25zdCBHTGZsb2F0KiBtb2RlbFZpZXdNYXRyaXgsCi0gICAgICAgIGNvbnN0IEdMZmxvYXQqIHRyYW5zZm9ybU1hdHJpeCkgewordm9pZCBEcmF3Q29sb3JQcm9ncmFtOjpzZXQoY29uc3QgbWF0NCYgcHJvamVjdGlvbk1hdHJpeCwgY29uc3QgbWF0NCYgbW9kZWxWaWV3TWF0cml4LAorICAgICAgICBjb25zdCBtYXQ0JiB0cmFuc2Zvcm1NYXRyaXgpIHsKKyAgICBtYXQ0IHQocHJvamVjdGlvbk1hdHJpeCk7CisgICAgdC5tdWx0aXBseSh0cmFuc2Zvcm1NYXRyaXgpOworICAgIHQubXVsdGlwbHkobW9kZWxWaWV3TWF0cml4KTsKKworICAgIGdsVW5pZm9ybU1hdHJpeDRmdih0cmFuc2Zvcm0sIDEsIEdMX0ZBTFNFLCAmdC5kYXRhWzBdKTsKK30KKwordm9pZCBEcmF3Q29sb3JQcm9ncmFtOjp1c2UoKSB7CiAgICAgUHJvZ3JhbTo6dXNlKCk7Ci0gICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2plY3Rpb24sIDEsIEdMX0ZBTFNFLCBwcm9qZWN0aW9uTWF0cml4KTsKLSAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobW9kZWxWaWV3LCAxLCBHTF9GQUxTRSwgbW9kZWxWaWV3TWF0cml4KTsKLSAgICBnbFVuaWZvcm1NYXRyaXg0ZnYodHJhbnNmb3JtLCAxLCBHTF9GQUxTRSwgdHJhbnNmb3JtTWF0cml4KTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKTsKK30KKwordm9pZCBEcmF3Q29sb3JQcm9ncmFtOjpyZW1vdmUoKSB7CisgICAgUHJvZ3JhbTo6cmVtb3ZlKCk7CisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNTAsNSArMTY2LDE3IEBACiAgICAgc2FtcGxlciA9IGFkZFVuaWZvcm0oInNhbXBsZXIiKTsKIH0KIAordm9pZCBEcmF3VGV4dHVyZVByb2dyYW06OnVzZSgpIHsKKyAgICBEcmF3Q29sb3JQcm9ncmFtOjp1c2UoKTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGdsVW5pZm9ybTFpKHNhbXBsZXIsIDApOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGV4Q29vcmRzKTsKK30KKwordm9pZCBEcmF3VGV4dHVyZVByb2dyYW06OnJlbW92ZSgpIHsKKyAgICBEcmF3Q29sb3JQcm9ncmFtOjpyZW1vdmUoKTsKKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHMpOworfQorCiB9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9ncmFtLmggYi9saWJzL2h3dWkvUHJvZ3JhbS5oCmluZGV4IGVlMTZhOTIuLmQ5MGJjYWYgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9Qcm9ncmFtLmgKKysrIGIvbGlicy9od3VpL1Byb2dyYW0uaApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCisjaW5jbHVkZSAiTWF0cml4LmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB1aXJlbmRlcmVyIHsKIApAQCAtMzcsMTIgKzM5LDI2IEBACiAgICAgICogc2hhZGVycyBzb3VyY2VzLgogICAgICAqLwogICAgIFByb2dyYW0oY29uc3QgY2hhciogdmVydGV4LCBjb25zdCBjaGFyKiBmcmFnbWVudCk7Ci0gICAgflByb2dyYW0oKTsKKyAgICB2aXJ0dWFsIH5Qcm9ncmFtKCk7CiAKICAgICAvKioKICAgICAgKiBCaW5kcyB0aGlzIHByb2dyYW0gdG8gdGhlIEdMIGNvbnRleHQuCiAgICAgICovCi0gICAgdm9pZCB1c2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgdXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGlzIHByb2dyYW0gYXMgdW51c2VkLiBUaGlzIHdpbGwgbm90IHVuYmluZAorICAgICAqIHRoZSBwcm9ncmFtIGZyb20gdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZSgpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwcm9ncmFtIGlzIGN1cnJlbnRseSBpbiB1c2Ugd2l0aAorICAgICAqIHRoZSBHTCBjb250ZXh0LgorICAgICAqLworICAgIGlubGluZSBib29sIGlzSW5Vc2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVXNlOworICAgIH0KIAogcHJvdGVjdGVkOgogICAgIC8qKgpAQCAtODUsNiArMTAxLDggQEAKICAgICAvLyBLZWVwcyB0cmFjayBvZiBhdHRyaWJ1dGVzIGFuZCB1bmlmb3JtcyBzbG90cwogICAgIEtleWVkVmVjdG9yPGNvbnN0IGNoYXIqLCBpbnQ+IGF0dHJpYnV0ZXM7CiAgICAgS2V5ZWRWZWN0b3I8Y29uc3QgY2hhciosIGludD4gdW5pZm9ybXM7CisKKyAgICBib29sIG1Vc2U7CiB9OyAvLyBjbGFzcyBQcm9ncmFtCiAKIC8qKgpAQCAtMTA3LDI2ICsxMjUsMjkgQEAKICAgICAgKiBCaW5kcyB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvamVjdGlvbiwgbW9kZWxWaWV3IGFuZAogICAgICAqIHRyYW5zZm9ybSBtYXRyaWNlcy4KICAgICAgKi8KLSAgICB2b2lkIHVzZShjb25zdCBHTGZsb2F0KiBwcm9qZWN0aW9uTWF0cml4LCBjb25zdCBHTGZsb2F0KiBtb2RlbFZpZXdNYXRyaXgsCi0gICAgICAgICAgICAgY29uc3QgR0xmbG9hdCogdHJhbnNmb3JtTWF0cml4KTsKKyAgICB2b2lkIHNldChjb25zdCBtYXQ0JiBwcm9qZWN0aW9uTWF0cml4LCBjb25zdCBtYXQ0JiBtb2RlbFZpZXdNYXRyaXgsCisgICAgICAgICAgICAgY29uc3QgbWF0NCYgdHJhbnNmb3JtTWF0cml4KTsKKworICAgIC8qKgorICAgICAqIEJpbmRzIHRoaXMgcHJvZ3JhbSB0byB0aGUgR0wgY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgdXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGlzIHByb2dyYW0gYXMgdW51c2VkLiBUaGlzIHdpbGwgbm90IHVuYmluZAorICAgICAqIHRoZSBwcm9ncmFtIGZyb20gdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZSgpOwogCiAgICAgLyoqCiAgICAgICogTmFtZSBvZiB0aGUgcG9zaXRpb24gYXR0cmlidXRlLgogICAgICAqLwogICAgIGludCBwb3NpdGlvbjsKLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSBjb2xvciBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgaW50IGNvbG9yOwogCiAgICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgcHJvamVjdGlvbiB1bmlmb3JtLgorICAgICAqIE5hbWUgb2YgdGhlIGNvbG9yIHVuaWZvcm0uCiAgICAgICovCi0gICAgaW50IHByb2plY3Rpb247Ci0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgbW9kZWxWaWV3IHVuaWZvcm0uCi0gICAgICovCi0gICAgaW50IG1vZGVsVmlldzsKKyAgICBpbnQgY29sb3I7CiAgICAgLyoqCiAgICAgICogTmFtZSBvZiB0aGUgdHJhbnNmb3JtIHVuaWZvcm0uCiAgICAgICovCkBAIC0xNDYsNyArMTY3LDI1IEBACiBwdWJsaWM6CiAgICAgRHJhd1RleHR1cmVQcm9ncmFtKCk7CiAKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGlzIHByb2dyYW0gdG8gdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHVzZSgpOworCisgICAgLyoqCisgICAgICogTWFya3MgdGhpcyBwcm9ncmFtIGFzIHVudXNlZC4gVGhpcyB3aWxsIG5vdCB1bmJpbmQKKyAgICAgKiB0aGUgcHJvZ3JhbSBmcm9tIHRoZSBHTCBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCByZW1vdmUoKTsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRleHR1cmUgc2FtcGxlciB1bmlmb3JtLgorICAgICAqLwogICAgIGludCBzYW1wbGVyOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyBhdHRyaWJ1dGUuCisgICAgICovCiAgICAgaW50IHRleENvb3JkczsKIH07CiAKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9TbmFwc2hvdC5oIGIvbGlicy9od3VpL1NuYXBzaG90LmgKaW5kZXggY2E5MWIzNC4uZWY5MjY5ZiAxMDA2NDQKLS0tIGEvbGlicy9od3VpL1NuYXBzaG90LmgKKysrIGIvbGlicy9od3VpL1NuYXBzaG90LmgKQEAgLTIwLDEwICsyMCw5IEBACiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CiAKLSNpbmNsdWRlIDxTa1hmZXJtb2RlLmg+Ci0KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKKyNpbmNsdWRlICJMYXllci5oIgogI2luY2x1ZGUgIk1hdHJpeC5oIgogI2luY2x1ZGUgIlJlY3QuaCIKIApAQCAtNDEsOCArNDAsNyBAQAogICovCiBjbGFzcyBTbmFwc2hvdDogcHVibGljIExpZ2h0UmVmQmFzZTxTbmFwc2hvdD4gewogcHVibGljOgotICAgIFNuYXBzaG90KCkgewotICAgIH0KKyAgICBTbmFwc2hvdCgpOiBsYXllcihOVUxMKSwgZmJvKDApIHsgfQogCiAgICAgLyoqCiAgICAgICogQ29waWVzIHRoZSBzcGVjaWZpZWQgc25hcHNob3QuIE9ubHkgdGhlIHRyYW5zZm9ybSBhbmQgY2xpcCByZWN0YW5nbGUKQEAgLTUxLDE0ICs0OSwxMyBAQAogICAgICAqIHNuYXBzaG90LgogICAgICAqLwogICAgIFNuYXBzaG90KGNvbnN0IHNwPFNuYXBzaG90PiBzKToKKyAgICAgICAgICAgIGhlaWdodChzLT5oZWlnaHQpLAogICAgICAgICAgICAgdHJhbnNmb3JtKHMtPnRyYW5zZm9ybSksCiAgICAgICAgICAgICBjbGlwUmVjdChzLT5jbGlwUmVjdCksCiAgICAgICAgICAgICBmbGFncyhrRmxhZ0RpcnR5VHJhbnNmb3JtKSwKICAgICAgICAgICAgIHByZXZpb3VzKHMpLAotICAgICAgICAgICAgbGF5ZXIoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiksCi0gICAgICAgICAgICB0ZXh0dXJlKDApLAotICAgICAgICAgICAgZmJvKDApLAotICAgICAgICAgICAgYWxwaGEoMjU1KSB7CisgICAgICAgICAgICBsYXllcihOVUxMKSwKKyAgICAgICAgICAgIGZibyhzLT5mYm8pIHsKICAgICB9CiAKICAgICAvKioKQEAgLTgwLDYgKzc3LDEwIEBACiAgICAgICAgICAqIGEgbmV3IGxheWVyLgogICAgICAgICAgKi8KICAgICAgICAga0ZsYWdJc0xheWVyID0gMHg0LAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhpcyBzbmFwc2hvdCBoYXMgY2hhbmdlZCB0aGUgb3J0aG8gbWF0cml4LgorICAgICAgICAgKi8KKyAgICAgICAga0ZsYWdEaXJ0eU9ydGhvID0gMHg4LAogICAgIH07CiAKICAgICAvKioKQEAgLTk1LDYgKzk2LDExIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSGVpZ2h0IG9mIHRoZSBmcmFtZWJ1ZmZlciB0aGUgc25hcHNob3QgaXMgcmVuZGVyaW5nIGludG8uCisgICAgICovCisgICAgaW50IGhlaWdodDsKKworICAgIC8qKgogICAgICAqIExvY2FsIHRyYW5zZm9ybWF0aW9uLiBIb2xkcyB0aGUgY3VycmVudCB0cmFuc2xhdGlvbiwgc2NhbGUgYW5kCiAgICAgICogcm90YXRpb24gdmFsdWVzLgogICAgICAqLwpAQCAtMTE2LDMwICsxMjIsMTUgQEAKICAgICBzcDxTbmFwc2hvdD4gcHJldmlvdXM7CiAKICAgICAvKioKLSAgICAgKiBDb29yZGluYXRlcyBvZiB0aGUgbGF5ZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIHNuYXBzaG90LgogICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KICAgICAgKi8KLSAgICBSZWN0IGxheWVyOwotICAgIC8qKgotICAgICAqIE5hbWUgb2YgdGhlIHRleHR1cmUgdXNlZCB0byByZW5kZXIgdGhlIGxheWVyLgotICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KLSAgICAgKi8KLSAgICBHTHVpbnQgdGV4dHVyZTsKLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSBGQk8gdXNlZCB0byByZW5kZXIgdGhlIGxheWVyLgotICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KLSAgICAgKi8KKyAgICBMYXllciogbGF5ZXI7CiAgICAgR0x1aW50IGZibzsKKwogICAgIC8qKgotICAgICAqIE9wYWNpdHkgb2YgdGhlIGxheWVyLgotICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKiBDb250YWlucyB0aGUgcHJldmlvdXMgb3J0aG8gbWF0cml4LgogICAgICAqLwotICAgIGZsb2F0IGFscGhhOwotICAgIC8qKgotICAgICAqIEJsZW5kaW5nIG1vZGUgb2YgdGhlIGxheWVyLgotICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KLSAgICAgKi8KLSAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgbWF0NCBvcnRob01hdHJpeDsKIAogcHJpdmF0ZToKICAgICAvLyBDbGlwcGluZyByZWN0YW5nbGUgbWFwcGVkIHdpdGggdGhlIHRyYW5zZm9ybQpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHR1cmUuaCBiL2xpYnMvaHd1aS9UZXh0dXJlLmgKaW5kZXggNjgwMmM1OS4uZDM3MDEzZCAxMDA2NDQKLS0tIGEvbGlicy9od3VpL1RleHR1cmUuaAorKysgYi9saWJzL2h3dWkvVGV4dHVyZS5oCkBAIC00MSwxMSArNDEsMTEgQEAKICAgICAvKioKICAgICAgKiBXaWR0aCBvZiB0aGUgYmFja2luZyBiaXRtYXAuCiAgICAgICovCi0gICAgdW5zaWduZWQgaW50IHdpZHRoOworICAgIHVpbnQzMl90IHdpZHRoOwogICAgIC8qKgogICAgICAqIEhlaWdodCBvZiB0aGUgYmFja2luZyBiaXRtYXAuCiAgICAgICovCi0gICAgdW5zaWduZWQgaW50IGhlaWdodDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CiB9OyAvLyBzdHJ1Y3QgVGV4dHVyZQogCiB9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHR1cmVDYWNoZS5jcHAgYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcAppbmRleCBjM2IxNDYzLi40OTc3ZjQ2IDEwMDY0NAotLS0gYS9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcAorKysgYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKwogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogCiAjaW5jbHVkZSAiVGV4dHVyZUNhY2hlLmgiCkBAIC0yMSw3ICsyMywxMyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHVpcmVuZGVyZXIgewogCi1UZXh0dXJlQ2FjaGU6OlRleHR1cmVDYWNoZSh1bnNpZ25lZCBpbnQgbWF4RW50cmllcyk6IG1DYWNoZShtYXhFbnRyaWVzKSB7CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlQ2FjaGU6OlRleHR1cmVDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8U2tCaXRtYXAqLCBUZXh0dXJlKj46OmtVbmxpbWl0ZWRDYXBhY2l0eSksCisgICAgICAgIG1TaXplKDApLCBtTWF4U2l6ZShtYXhCeXRlU2l6ZSkgewogICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOwogfQogCkBAIC0yOSwyOCArMzcsNzEgQEAKICAgICBtQ2FjaGUuY2xlYXIoKTsKIH0KIAotdm9pZCBUZXh0dXJlQ2FjaGU6Om9wZXJhdG9yKCkoU2tCaXRtYXAqIGtleSwgVGV4dHVyZSogdmFsdWUpIHsKLSAgICBMT0dEKCJFbnRyeSByZW1vdmVkIik7Ci0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnZhbHVlLT5pZCk7Ci0gICAgICAgIGRlbGV0ZSB2YWx1ZTsKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBUZXh0dXJlQ2FjaGU6OmdldFNpemUoKSB7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBUZXh0dXJlQ2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6c2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKSB7CisgICAgbU1heFNpemUgPSBtYXhTaXplOworICAgIHdoaWxlIChtU2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKICAgICB9CiB9CiAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRleHR1cmVDYWNoZTo6b3BlcmF0b3IoKShTa0JpdG1hcComIGJpdG1hcCwgVGV4dHVyZSomIHRleHR1cmUpIHsKKyAgICBpZiAoYml0bWFwKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBiaXRtYXAtPnJvd0J5dGVzKCkgKiBiaXRtYXAtPmhlaWdodCgpOworICAgICAgICBtU2l6ZSAtPSBzaXplOworICAgIH0KKworICAgIGlmICh0ZXh0dXJlKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKyAgICAgICAgZGVsZXRlIHRleHR1cmU7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKIFRleHR1cmUqIFRleHR1cmVDYWNoZTo6Z2V0KFNrQml0bWFwKiBiaXRtYXApIHsKICAgICBUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlLmdldChiaXRtYXApOwogICAgIGlmICghdGV4dHVyZSkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gYml0bWFwLT5yb3dCeXRlcygpICogYml0bWFwLT5oZWlnaHQoKTsKKyAgICAgICAgLy8gRG9uJ3QgZXZlbiB0cnkgdG8gY2FjaGUgYSBiaXRtYXAgdGhhdCdzIGJpZ2dlciB0aGFuIHRoZSBjYWNoZQorICAgICAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgICAgICB3aGlsZSAobVNpemUgKyBzaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICB0ZXh0dXJlID0gbmV3IFRleHR1cmU7Ci0gICAgICAgIGdlbmVyYXRlVGV4dHVyZShiaXRtYXAsIHRleHR1cmUpOwotICAgICAgICBtQ2FjaGUucHV0KGJpdG1hcCwgdGV4dHVyZSk7CisgICAgICAgIGdlbmVyYXRlVGV4dHVyZShiaXRtYXAsIHRleHR1cmUsIGZhbHNlKTsKKworICAgICAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICAgICAgbUNhY2hlLnB1dChiaXRtYXAsIHRleHR1cmUpOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChiaXRtYXAtPmdldEdlbmVyYXRpb25JRCgpICE9IHRleHR1cmUtPmdlbmVyYXRpb24pIHsKICAgICAgICAgZ2VuZXJhdGVUZXh0dXJlKGJpdG1hcCwgdGV4dHVyZSwgdHJ1ZSk7CiAgICAgfQogICAgIHJldHVybiB0ZXh0dXJlOwogfQogCi1UZXh0dXJlKiBUZXh0dXJlQ2FjaGU6OnJlbW92ZShTa0JpdG1hcCogYml0bWFwKSB7Ci0gICAgcmV0dXJuIG1DYWNoZS5yZW1vdmUoYml0bWFwKTsKK3ZvaWQgVGV4dHVyZUNhY2hlOjpyZW1vdmUoU2tCaXRtYXAqIGJpdG1hcCkgeworICAgIG1DYWNoZS5yZW1vdmUoYml0bWFwKTsKIH0KIAogdm9pZCBUZXh0dXJlQ2FjaGU6OmNsZWFyKCkgewpAQCAtNTgsNyArMTA5LDE0IEBACiB9CiAKIHZvaWQgVGV4dHVyZUNhY2hlOjpnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAqIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSwgYm9vbCByZWdlbmVyYXRlKSB7CisgICAgU2tBdXRvTG9ja1BpeGVscyBhbHAoKmJpdG1hcCk7CisgICAgaWYgKCFiaXRtYXAtPnJlYWR5VG9EcmF3KCkpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGdlbmVyYXRlIHRleHR1cmUgZnJvbSBiaXRtYXAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGlmICghcmVnZW5lcmF0ZSkgeworICAgICAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsKICAgICAgICAgdGV4dHVyZS0+d2lkdGggPSBiaXRtYXAtPndpZHRoKCk7CiAgICAgICAgIHRleHR1cmUtPmhlaWdodCA9IGJpdG1hcC0+aGVpZ2h0KCk7CiAKQEAgLTY2LDI1ICsxMjQsMjkgQEAKICAgICB9CiAKICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUtPmlkKTsKLQotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CiAKICAgICBzd2l0Y2ggKGJpdG1hcC0+Z2V0Q29uZmlnKCkpIHsKICAgICBjYXNlIFNrQml0bWFwOjprUkdCXzU2NV9Db25maWc6Ci0gICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0I1NjUsIHRleHR1cmUtPndpZHRoLCB0ZXh0dXJlLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgMCwgR0xfUkdCNTY1LCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisgICAgICAgIHRleHR1cmUtPmJsZW5kID0gZmFsc2U7CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnOgotICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgdGV4dHVyZS0+d2lkdGgsIHRleHR1cmUtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKyAgICAgICAgdGV4dHVyZS0+YmxlbmQgPSAhYml0bWFwLT5pc09wYXF1ZSgpOworICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworCiAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHR1cmVDYWNoZS5oIGIvbGlicy9od3VpL1RleHR1cmVDYWNoZS5oCmluZGV4IGJmNjgwNjEuLmJlZDExOTEgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuaAorKysgYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmgKQEAgLTI1LDIxICsyNSw2MyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHVpcmVuZGVyZXIgewogCisvKioKKyAqIEEgc2ltcGxlIExSVSB0ZXh0dXJlIGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLwogY2xhc3MgVGV4dHVyZUNhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8U2tCaXRtYXAqLCBUZXh0dXJlKj4gewogcHVibGljOgotICAgIFRleHR1cmVDYWNoZSh1bnNpZ25lZCBpbnQgbWF4RW50cmllcyk7CisgICAgVGV4dHVyZUNhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKTsKICAgICB+VGV4dHVyZUNhY2hlKCk7CiAKLSAgICB2b2lkIG9wZXJhdG9yKCkoU2tCaXRtYXAqIGtleSwgVGV4dHVyZSogdmFsdWUpOworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2tCaXRtYXAqJiBiaXRtYXAsIFRleHR1cmUqJiB0ZXh0dXJlKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYml0bWFwLiBJZiB0aGUgdGV4dHVyZQorICAgICAqIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY2FjaGUsIGEgbmV3IHRleHR1cmUgaXMgZ2VuZXJhdGVkLgorICAgICAqLwogICAgIFRleHR1cmUqIGdldChTa0JpdG1hcCogYml0bWFwKTsKLSAgICBUZXh0dXJlKiByZW1vdmUoU2tCaXRtYXAqIGJpdG1hcCk7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBiaXRtYXAuIFJldHVybnMgTlVMTAorICAgICAqIGlmIHRoZSB0ZXh0dXJlIGNhbm5vdCBiZSBmb3VuZC4gVXBvbiByZW1vdmUgdGhlIHRleHR1cmUgaXMgZnJlZWQuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoU2tCaXRtYXAqIGJpdG1hcCk7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCiAgICAgdm9pZCBjbGVhcigpOwogCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKIHByaXZhdGU6CisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSB0ZXh0dXJlIGZyb20gYSBiaXRtYXAgaW50byB0aGUgc3BlY2lmaWVkIHRleHR1cmUgc3RydWN0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZ2VuZXJhdGUgSWYgdHJ1ZSwgdGhlIGJpdG1hcCBkYXRhIGlzIHJldXBsb2FkZWQgaW50byB0aGUgdGV4dHVyZSwgYnV0CisgICAgICogICAgICAgIG5vIG5ldyB0ZXh0dXJlIGlzIGdlbmVyYXRlZC4KKyAgICAgKi8KICAgICB2b2lkIGdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCogYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlLCBib29sIHJlZ2VuZXJhdGUgPSBmYWxzZSk7CiAKLSAgICBHZW5lcmF0aW9uQ2FjaGU8U2tCaXRtYXAsIFRleHR1cmU+IG1DYWNoZTsKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2tCaXRtYXAqLCBUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CiB9OyAvLyBjbGFzcyBUZXh0dXJlQ2FjaGUKIAogfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9WZXJ0ZXguaCBiL2xpYnMvaHd1aS9WZXJ0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQwNjMzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1ZlcnRleC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfVkVSVEVYX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9WRVJURVhfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogU2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHZlcnRleCB3aXRoIGEgcG9zaXRpb24uCisgKiBUaGlzIGlzIHVzZWQgdG8gZHJhdyBmaWxsZWQgcmVjdGFuZ2xlcyB3aXRob3V0IGEgdGV4dHVyZS4KKyAqLworc3RydWN0IFNpbXBsZVZlcnRleCB7CisgICAgZmxvYXQgcG9zaXRpb25bMl07Cit9OyAvLyBzdHJ1Y3QgU2ltcGxlVmVydGV4CisKKy8qKgorICogU2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHZlcnRleCB3aXRoIGEgcG9zaXRpb24gYW5kIGEgdGV4dHVyZS4KKyAqLworc3RydWN0IFRleHR1cmVWZXJ0ZXggeworICAgIGZsb2F0IHBvc2l0aW9uWzJdOworICAgIGZsb2F0IHRleHR1cmVbMl07CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgc2V0KFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgdSwgZmxvYXQgdikgeworICAgICAgICB2ZXJ0ZXhbMF0ucG9zaXRpb25bMF0gPSB4OworICAgICAgICB2ZXJ0ZXhbMF0ucG9zaXRpb25bMV0gPSB5OworICAgICAgICB2ZXJ0ZXhbMF0udGV4dHVyZVswXSA9IHU7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzFdID0gdjsKKyAgICB9CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgc2V0VVYoVGV4dHVyZVZlcnRleCogdmVydGV4LCBmbG9hdCB1LCBmbG9hdCB2KSB7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzBdID0gdTsKKyAgICAgICAgdmVydGV4WzBdLnRleHR1cmVbMV0gPSB2OworICAgIH0KK307IC8vIHN0cnVjdCBUZXh0dXJlVmVydGV4CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9WRVJURVhfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL3NoYWRlcnMvZHJhd0NvbG9yLmZyYWcgYi9saWJzL2h3dWkvc2hhZGVycy9kcmF3Q29sb3IuZnJhZwppbmRleCBlODRjNDdiLi4wNjI4ODUwIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvc2hhZGVycy9kcmF3Q29sb3IuZnJhZworKysgYi9saWJzL2h3dWkvc2hhZGVycy9kcmF3Q29sb3IuZnJhZwpAQCAtMSw5ICsxLDkgQEAKIFNIQURFUl9TT1VSQ0UoZ0RyYXdDb2xvckZyYWdtZW50U2hhZGVyLAogCi12YXJ5aW5nIGxvd3AgdmVjNCBvdXRDb2xvcjsKK3VuaWZvcm0gdmVjNCBjb2xvcjsKIAogdm9pZCBtYWluKHZvaWQpIHsKLSAgICBnbF9GcmFnQ29sb3IgPSBvdXRDb2xvcjsKKyAgICBnbF9GcmFnQ29sb3IgPSBjb2xvcjsKIH0KIAogKTsKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdDb2xvci52ZXJ0IGIvbGlicy9od3VpL3NoYWRlcnMvZHJhd0NvbG9yLnZlcnQKaW5kZXggY2VmNmU0OS4uMjBlMjYzNiAxMDA2NDQKLS0tIGEvbGlicy9od3VpL3NoYWRlcnMvZHJhd0NvbG9yLnZlcnQKKysrIGIvbGlicy9od3VpL3NoYWRlcnMvZHJhd0NvbG9yLnZlcnQKQEAgLTEsMTcgKzEsMTEgQEAKIFNIQURFUl9TT1VSQ0UoZ0RyYXdDb2xvclZlcnRleFNoYWRlciwKIAogYXR0cmlidXRlIHZlYzQgcG9zaXRpb247Ci1hdHRyaWJ1dGUgdmVjNCBjb2xvcjsKIAotdW5pZm9ybSBtYXQ0IHByb2plY3Rpb247Ci11bmlmb3JtIG1hdDQgbW9kZWxWaWV3OwogdW5pZm9ybSBtYXQ0IHRyYW5zZm9ybTsKIAotdmFyeWluZyB2ZWM0IG91dENvbG9yOwotCiB2b2lkIG1haW4odm9pZCkgewotICAgIG91dENvbG9yID0gY29sb3I7Ci0gICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdHJhbnNmb3JtICogbW9kZWxWaWV3ICogcG9zaXRpb247CisgICAgZ2xfUG9zaXRpb24gPSB0cmFuc2Zvcm0gKiBwb3NpdGlvbjsKIH0KIAogKTsKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdUZXh0dXJlLmZyYWcgYi9saWJzL2h3dWkvc2hhZGVycy9kcmF3VGV4dHVyZS5mcmFnCmluZGV4IDViZDQyMGUuLjBmMmFhOTEgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdUZXh0dXJlLmZyYWcKKysrIGIvbGlicy9od3VpL3NoYWRlcnMvZHJhd1RleHR1cmUuZnJhZwpAQCAtMSwxMiArMSwxMiBAQAogU0hBREVSX1NPVVJDRShnRHJhd1RleHR1cmVGcmFnbWVudFNoYWRlciwKIAotdmFyeWluZyBsb3dwIHZlYzQgb3V0Q29sb3I7CiB2YXJ5aW5nIG1lZGl1bXAgdmVjMiBvdXRUZXhDb29yZHM7CiAKK3VuaWZvcm0gdmVjNCBjb2xvcjsKIHVuaWZvcm0gc2FtcGxlcjJEIHNhbXBsZXI7CiAKIHZvaWQgbWFpbih2b2lkKSB7Ci0gICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHNhbXBsZXIsIG91dFRleENvb3JkcykgKiBvdXRDb2xvcjsKKyAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoc2FtcGxlciwgb3V0VGV4Q29vcmRzKSAqIGNvbG9yOwogfQogCiApOwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL3NoYWRlcnMvZHJhd1RleHR1cmUudmVydCBiL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdUZXh0dXJlLnZlcnQKaW5kZXggMzEwYTgxMi4uMjQwYWViZiAxMDA2NDQKLS0tIGEvbGlicy9od3VpL3NoYWRlcnMvZHJhd1RleHR1cmUudmVydAorKysgYi9saWJzL2h3dWkvc2hhZGVycy9kcmF3VGV4dHVyZS52ZXJ0CkBAIC0yLDE5ICsyLDE0IEBACiAKIGF0dHJpYnV0ZSB2ZWM0IHBvc2l0aW9uOwogYXR0cmlidXRlIHZlYzIgdGV4Q29vcmRzOwotYXR0cmlidXRlIHZlYzQgY29sb3I7CiAKLXVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uOwotdW5pZm9ybSBtYXQ0IG1vZGVsVmlldzsKIHVuaWZvcm0gbWF0NCB0cmFuc2Zvcm07CiAKLXZhcnlpbmcgdmVjNCBvdXRDb2xvcjsKIHZhcnlpbmcgdmVjMiBvdXRUZXhDb29yZHM7CiAKIHZvaWQgbWFpbih2b2lkKSB7Ci0gICAgb3V0Q29sb3IgPSBjb2xvcjsKICAgICBvdXRUZXhDb29yZHMgPSB0ZXhDb29yZHM7Ci0gICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdHJhbnNmb3JtICogbW9kZWxWaWV3ICogcG9zaXRpb247CisgICAgZ2xfUG9zaXRpb24gPSB0cmFuc2Zvcm0gKiBwb3NpdGlvbjsKIH0KIAogKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvQW5kcm9pZC5tayBiL2xpYnMvcnMvQW5kcm9pZC5tawppbmRleCA3YWZjNGYyLi4zN2M0MThiIDEwMDY0NAotLS0gYS9saWJzL3JzL0FuZHJvaWQubWsKKysrIGIvbGlicy9ycy9BbmRyb2lkLm1rCkBAIC0xMDIsNyArMTAyLDYgQEAKIAlyc1NjcmlwdENfTGliR0wuY3BwIFwKIAlyc1NoYWRlckNhY2hlLmNwcCBcCiAJcnNTaWduYWwuY3BwIFwKLQlyc1NpbXBsZU1lc2guY3BwIFwKIAlyc1N0cmVhbS5jcHAgXAogCXJzVGhyZWFkSU8uY3BwIFwKIAlyc1R5cGUuY3BwIFwKZGlmZiAtLWdpdCBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmggYi9saWJzL3JzL1JlbmRlclNjcmlwdC5oCmluZGV4IDE0MjgzMTguLjc0NWRmOTUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKKysrIGIvbGlicy9ycy9SZW5kZXJTY3JpcHQuaApAQCAtMzgsNyArMzgsNyBAQAogdHlwZWRlZiB2b2lkICogUnNGb250OwogdHlwZWRlZiB2b2lkICogUnNTYW1wbGVyOwogdHlwZWRlZiB2b2lkICogUnNTY3JpcHQ7Ci10eXBlZGVmIHZvaWQgKiBSc1NpbXBsZU1lc2g7Cit0eXBlZGVmIHZvaWQgKiBSc01lc2g7CiB0eXBlZGVmIHZvaWQgKiBSc1R5cGU7CiB0eXBlZGVmIHZvaWQgKiBSc0xpZ2h0OwogdHlwZWRlZiB2b2lkICogUnNPYmplY3RCYXNlOwpAQCAtMjI5LDcgKzIyOSw2IEBACiBlbnVtIFJzQTNEQ2xhc3NJRCB7CiAgICAgUlNfQTNEX0NMQVNTX0lEX1VOS05PV04sCiAgICAgUlNfQTNEX0NMQVNTX0lEX01FU0gsCi0gICAgUlNfQTNEX0NMQVNTX0lEX1NJTVBMRV9NRVNILAogICAgIFJTX0EzRF9DTEFTU19JRF9UWVBFLAogICAgIFJTX0EzRF9DTEFTU19JRF9FTEVNRU5ULAogICAgIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OLApAQCAtMjQ1LDYgKzI0NCwxMiBAQAogICAgIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQwogfTsKIAorZW51bSBSc0N1bGxNb2RlIHsKKyAgICBSU19DVUxMX0JBQ0ssCisgICAgUlNfQ1VMTF9GUk9OVCwKKyAgICBSU19DVUxMX05PTkUKK307CisKIHR5cGVkZWYgc3RydWN0IHsKICAgICBSc0EzRENsYXNzSUQgY2xhc3NJRDsKICAgICBjb25zdCBjaGFyKiBvYmplY3ROYW1lOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaCBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmgKaW5kZXggMTQ0ZTUzOS4uOTIyNTkwNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaAorKysgYi9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oCkBAIC05LDcgKzksNyBAQAogdHlwZWRlZiB2b2lkICogUnNFbGVtZW50OwogdHlwZWRlZiB2b2lkICogUnNTYW1wbGVyOwogdHlwZWRlZiB2b2lkICogUnNTY3JpcHQ7Ci10eXBlZGVmIHZvaWQgKiBSc1NpbXBsZU1lc2g7Cit0eXBlZGVmIHZvaWQgKiBSc01lc2g7CiB0eXBlZGVmIHZvaWQgKiBSc1R5cGU7CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudDsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVN0b3JlOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9TY3JpcHRDX01vZGVsdmlld2VyLmphdmEgYi9saWJzL3JzL1NjcmlwdENfTW9kZWx2aWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzZmI2MC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL1NjcmlwdENfTW9kZWx2aWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKLQotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotcHVibGljIGNsYXNzIFNjcmlwdENfTW9kZWx2aWV3ZXIgZXh0ZW5kcyBTY3JpcHRDIHsKLSAgICAvLyBDb25zdHJ1Y3RvcgotICAgIHB1YmxpYyAgU2NyaXB0Q19Nb2RlbHZpZXdlcihSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCBpZCwgYm9vbGVhbiBpc1Jvb3QpIHsKLSAgICAgICAgc3VwZXIocnMsIHJlc291cmNlcywgaWQsIGlzUm9vdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1BWQmFja2dyb3VuZCA9IDA7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1FeHBvcnRWYXJfZ1BWQmFja2dyb3VuZDsKLSAgICBwdWJsaWMgdm9pZCBzZXRfZ1BWQmFja2dyb3VuZChQcm9ncmFtVmVydGV4IHYpIHsKLSAgICAgICAgbUV4cG9ydFZhcl9nUFZCYWNrZ3JvdW5kID0gdjsKLSAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1BWQmFja2dyb3VuZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvZ3JhbVZlcnRleCBnZXRfZ1BWQmFja2dyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1BWQmFja2dyb3VuZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9nUEZCYWNrZ3JvdW5kID0gMTsKLSAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtRXhwb3J0VmFyX2dQRkJhY2tncm91bmQ7Ci0gICAgcHVibGljIHZvaWQgc2V0X2dQRkJhY2tncm91bmQoUHJvZ3JhbUZyYWdtZW50IHYpIHsKLSAgICAgICAgbUV4cG9ydFZhcl9nUEZCYWNrZ3JvdW5kID0gdjsKLSAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1BGQmFja2dyb3VuZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvZ3JhbUZyYWdtZW50IGdldF9nUEZCYWNrZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nUEZCYWNrZ3JvdW5kOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dUR3JpZCA9IDI7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfZ1RHcmlkOwotICAgIHB1YmxpYyB2b2lkIHNldF9nVEdyaWQoQWxsb2NhdGlvbiB2KSB7Ci0gICAgICAgIG1FeHBvcnRWYXJfZ1RHcmlkID0gdjsKLSAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1RHcmlkLCAodiA9PSBudWxsKSA/IDAgOiB2LmdldElEKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldF9nVEdyaWQoKSB7Ci0gICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dUR3JpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9nVGVzdE1lc2ggPSAzOwotICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtRXhwb3J0VmFyX2dUZXN0TWVzaDsKLSAgICBwdWJsaWMgdm9pZCBzZXRfZ1Rlc3RNZXNoKFNpbXBsZU1lc2ggdikgewotICAgICAgICBtRXhwb3J0VmFyX2dUZXN0TWVzaCA9IHY7Ci0gICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dUZXN0TWVzaCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2ltcGxlTWVzaCBnZXRfZ1Rlc3RNZXNoKCkgewotICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nVGVzdE1lc2g7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1BGU0JhY2tncm91bmQgPSA0OwotICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1FeHBvcnRWYXJfZ1BGU0JhY2tncm91bmQ7Ci0gICAgcHVibGljIHZvaWQgc2V0X2dQRlNCYWNrZ3JvdW5kKFByb2dyYW1TdG9yZSB2KSB7Ci0gICAgICAgIG1FeHBvcnRWYXJfZ1BGU0JhY2tncm91bmQgPSB2OwotICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9nUEZTQmFja2dyb3VuZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvZ3JhbVN0b3JlIGdldF9nUEZTQmFja2dyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1BGU0JhY2tncm91bmQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1JvdGF0ZSA9IDU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRXhwb3J0VmFyX2dSb3RhdGU7Ci0gICAgcHVibGljIHZvaWQgc2V0X2dSb3RhdGUoZmxvYXQgdikgewotICAgICAgICBtRXhwb3J0VmFyX2dSb3RhdGUgPSB2OwotICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9nUm90YXRlLCB2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0X2dSb3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dSb3RhdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ0l0YWxpYyA9IDY7Ci0gICAgcHJpdmF0ZSBGb250IG1FeHBvcnRWYXJfZ0l0YWxpYzsKLSAgICBwdWJsaWMgdm9pZCBzZXRfZ0l0YWxpYyhGb250IHYpIHsKLSAgICAgICAgbUV4cG9ydFZhcl9nSXRhbGljID0gdjsKLSAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ0l0YWxpYywgdik7Ci0gICAgfQotCi0gICAgcHVibGljIEZvbnQgZ2V0X2dJdGFsaWMoKSB7Ci0gICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dJdGFsaWM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1RleHRBbGxvYyA9IDc7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfZ1RleHRBbGxvYzsKLSAgICBwdWJsaWMgdm9pZCBzZXRfZ1RleHRBbGxvYyhBbGxvY2F0aW9uIHYpIHsKLSAgICAgICAgbUV4cG9ydFZhcl9nVGV4dEFsbG9jID0gdjsKLSAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1RleHRBbGxvYywgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRfZ1RleHRBbGxvYygpIHsKLSAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1RleHRBbGxvYzsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4ucnMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5ycwppbmRleCBlZjEyZDlhLi5jOGMxMGNkIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5ycworKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5ycwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlICIuLi8uLi8uLi8uLi9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaCIKIAogc3RhdGljIGludCBuZXdQYXJ0ID0gMDsKLXN0YXRpYyBmbG9hdDQgcGFydENvbG9yOwogcnNfbWVzaCBwYXJ0TWVzaDsKIAogdHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgUG9pbnQgewpAQCAtMzYsMjAgKzM1LDIxIEBACiAgICAgICAgIHArKzsKICAgICB9CiAKLSAgICByc2dEcmF3U2ltcGxlTWVzaChwYXJ0TWVzaCk7CisgICAgcnNnRHJhd01lc2gocGFydE1lc2gpOwogICAgIHJldHVybiAxOwogfQogCi12b2lkIGFkZFBhcnRpY2xlcyhpbnQgcmF0ZSwgZmxvYXQgeCwgZmxvYXQgeSwgYm9vbCBuZXdDb2xvcikKK3N0YXRpYyBmbG9hdDQgcGFydENvbG9yWzEwXTsKK3ZvaWQgYWRkUGFydGljbGVzKGludCByYXRlLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgaW5kZXgsIGJvb2wgbmV3Q29sb3IpCiB7CiAgICAgaWYgKG5ld0NvbG9yKSB7Ci0gICAgICAgIHBhcnRDb2xvci54ID0gcnNSYW5kKDAuNWYsIDEuMGYpOwotICAgICAgICBwYXJ0Q29sb3IueSA9IHJzUmFuZCgxLjBmKTsKLSAgICAgICAgcGFydENvbG9yLnogPSByc1JhbmQoMS4wZik7CisgICAgICAgIHBhcnRDb2xvcltpbmRleF0ueCA9IHJzUmFuZCgwLjVmLCAxLjBmKTsKKyAgICAgICAgcGFydENvbG9yW2luZGV4XS55ID0gcnNSYW5kKDEuMGYpOworICAgICAgICBwYXJ0Q29sb3JbaW5kZXhdLnogPSByc1JhbmQoMS4wZik7CiAgICAgfQotICAgIGZsb2F0IHJNYXggPSAoKGZsb2F0KXJhdGUpICogMC4wMDVmOworICAgIGZsb2F0IHJNYXggPSAoKGZsb2F0KXJhdGUpICogMC4wMmY7CiAgICAgaW50IHNpemUgPSByc0FsbG9jYXRpb25HZXREaW1YKHJzR2V0QWxsb2NhdGlvbihwb2ludCkpOwotICAgIHVjaGFyNCBjID0gcnNQYWNrQ29sb3JUbzg4ODgocGFydENvbG9yKTsKKyAgICB1Y2hhcjQgYyA9IHJzUGFja0NvbG9yVG84ODg4KHBhcnRDb2xvcltpbmRleF0pOwogCiAgICAgUG9pbnRfdCAqIG5wID0gJnBvaW50W25ld1BhcnRdOwogICAgIGZsb2F0MiBwID0ge3gsIHl9OwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW5fYmMuYmMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbl9iYy5iYwppbmRleCBhYzZiN2Q0Li4yYzhjZThiIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbl9iYy5iYworKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbl9iYy5iYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCmluZGV4IGZmZTJmYWQuLmNmZThlMjcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCkBAIC0zNiwxMSArMzYsMTAgQEAKIAogICAgICAgICBTY3JpcHRGaWVsZF9Qb2ludCBwb2ludHMgPSBuZXcgU2NyaXB0RmllbGRfUG9pbnQobVJTLCBQQVJUX0NPVU5UKTsKIAotICAgICAgICBTaW1wbGVNZXNoLkJ1aWxkZXIgc21iID0gbmV3IFNpbXBsZU1lc2guQnVpbGRlcihtUlMpOwotICAgICAgICBpbnQgdnR4U2xvdCA9IHNtYi5hZGRWZXJ0ZXhUeXBlKHBvaW50cy5nZXRUeXBlKCkpOwotICAgICAgICBzbWIuc2V0UHJpbWl0aXZlKFByaW1pdGl2ZS5QT0lOVCk7Ci0gICAgICAgIFNpbXBsZU1lc2ggc20gPSBzbWIuY3JlYXRlKCk7Ci0gICAgICAgIHNtLmJpbmRWZXJ0ZXhBbGxvY2F0aW9uKHBvaW50cy5nZXRBbGxvY2F0aW9uKCksIHZ0eFNsb3QpOworICAgICAgICBNZXNoLkFsbG9jYXRpb25CdWlsZGVyIHNtYiA9IG5ldyBNZXNoLkFsbG9jYXRpb25CdWlsZGVyKG1SUyk7CisgICAgICAgIHNtYi5hZGRWZXJ0ZXhBbGxvY2F0aW9uKHBvaW50cy5nZXRBbGxvY2F0aW9uKCkpOworICAgICAgICBzbWIuYWRkSW5kZXhUeXBlKFByaW1pdGl2ZS5QT0lOVCk7CisgICAgICAgIE1lc2ggc20gPSBzbWIuY3JlYXRlKCk7CiAKICAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX0ZvdW50YWluKG1SUywgbVJlcywgUi5yYXcuZm91bnRhaW5fYmMsIHRydWUpOwogICAgICAgICBtU2NyaXB0LnNldF9wYXJ0TWVzaChzbSk7CkBAIC00OCwxMyArNDcsMjAgQEAKICAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKICAgICB9CiAKLSAgICBib29sZWFuIGhvbGRpbmdDb2xvciA9IGZhbHNlOwotICAgIHB1YmxpYyB2b2lkIG5ld1RvdWNoUG9zaXRpb24oaW50IHgsIGludCB5LCBpbnQgcmF0ZSkgeworICAgIGJvb2xlYW4gaG9sZGluZ0NvbG9yW10gPSBuZXcgYm9vbGVhblsxMF07CisgICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBwcmVzc3VyZSwgaW50IGlkKSB7CisgICAgICAgIGlmIChpZCA+IGhvbGRpbmdDb2xvci5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgcmF0ZSA9IChpbnQpKHByZXNzdXJlICogcHJlc3N1cmUgKiA1MDAuZik7CisgICAgICAgIGlmKHJhdGUgPiA1MDApIHsKKyAgICAgICAgICAgIHJhdGUgPSA1MDA7CisgICAgICAgIH0KICAgICAgICAgaWYgKHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9hZGRQYXJ0aWNsZXMocmF0ZSwgeCwgeSwgIWhvbGRpbmdDb2xvcik7Ci0gICAgICAgICAgICBob2xkaW5nQ29sb3IgPSB0cnVlOworICAgICAgICAgICAgbVNjcmlwdC5pbnZva2VfYWRkUGFydGljbGVzKHJhdGUsIHgsIHksIGlkLCAhaG9sZGluZ0NvbG9yW2lkXSk7CisgICAgICAgICAgICBob2xkaW5nQ29sb3JbaWRdID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhvbGRpbmdDb2xvciA9IGZhbHNlOworICAgICAgICAgICAgaG9sZGluZ0NvbG9yW2lkXSA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICB9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQppbmRleCBkZmQ2YTQ5Li5jMTQxMTY1NmIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQpAQCAtNzEsMTcgKzcxLDMzIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQogICAgIHsKLSAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CiAgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCwgZXYuZ2V0UG9pbnRlcklkKDApKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChhY3QgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKKyAgICAgICAgICAgIC8vIG9ubHkgb25lIHBvaW50ZXIgZ29pbmcgdXAsIHdlIGNhbiBnZXQgdGhlIGluZGV4IGxpa2UgdGhpcworICAgICAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmdldEFjdGlvbkluZGV4KCk7CisgICAgICAgICAgICBpbnQgcG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKHBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCwgcG9pbnRlcklkKTsKICAgICAgICAgfQotICAgICAgICBmbG9hdCByYXRlID0gKGV2LmdldFByZXNzdXJlKCkgKiA1MC5mKTsKLSAgICAgICAgcmF0ZSAqPSByYXRlOwotICAgICAgICBpZihyYXRlID4gMjAwMC5mKSB7Ci0gICAgICAgICAgICByYXRlID0gMjAwMC5mOworICAgICAgICBpbnQgY291bnQgPSBldi5nZXRIaXN0b3J5U2l6ZSgpOworICAgICAgICBpbnQgcGNvdW50ID0gZXYuZ2V0UG9pbnRlckNvdW50KCk7CisKKyAgICAgICAgZm9yIChpbnQgcD0wOyBwIDwgcGNvdW50OyBwKyspIHsKKyAgICAgICAgICAgIGludCBpZCA9IGV2LmdldFBvaW50ZXJJZChwKTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRYKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFkocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0UHJlc3N1cmUocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKGV2LmdldEhpc3RvcmljYWxYKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRIaXN0b3JpY2FsWShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFByZXNzdXJlKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSwgKGludClyYXRlKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9TY3JpcHRDX0ZvdW50YWluLmphdmEgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL1NjcmlwdENfRm91bnRhaW4uamF2YQppbmRleCBhNGM1OThiLi4wZWMwMDA5IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL1NjcmlwdENfRm91bnRhaW4uamF2YQorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL1NjcmlwdENfRm91bnRhaW4uamF2YQpAQCAtMjcsMTMgKzI3LDEzIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfcGFydE1lc2ggPSAwOwotICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtRXhwb3J0VmFyX3BhcnRNZXNoOwotICAgIHB1YmxpYyB2b2lkIHNldF9wYXJ0TWVzaChTaW1wbGVNZXNoIHYpIHsKKyAgICBwcml2YXRlIE1lc2ggbUV4cG9ydFZhcl9wYXJ0TWVzaDsKKyAgICBwdWJsaWMgdm9pZCBzZXRfcGFydE1lc2goTWVzaCB2KSB7CiAgICAgICAgIG1FeHBvcnRWYXJfcGFydE1lc2ggPSB2OwogICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9wYXJ0TWVzaCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU2ltcGxlTWVzaCBnZXRfcGFydE1lc2goKSB7CisgICAgcHVibGljIE1lc2ggZ2V0X3BhcnRNZXNoKCkgewogICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9wYXJ0TWVzaDsKICAgICB9CiAKQEAgLTUwLDExICs1MCwxMiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0RnVuY0lkeF9hZGRQYXJ0aWNsZXMgPSAwOwotICAgIHB1YmxpYyB2b2lkIGludm9rZV9hZGRQYXJ0aWNsZXMoaW50IHJhdGUsIGZsb2F0IHgsIGZsb2F0IHksIGJvb2xlYW4gbmV3Q29sb3IpIHsKLSAgICAgICAgRmllbGRQYWNrZXIgYWRkUGFydGljbGVzX2ZwID0gbmV3IEZpZWxkUGFja2VyKDE2KTsKKyAgICBwdWJsaWMgdm9pZCBpbnZva2VfYWRkUGFydGljbGVzKGludCByYXRlLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgaW5kZXgsIGJvb2xlYW4gbmV3Q29sb3IpIHsKKyAgICAgICAgRmllbGRQYWNrZXIgYWRkUGFydGljbGVzX2ZwID0gbmV3IEZpZWxkUGFja2VyKDIwKTsKICAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEkzMihyYXRlKTsKICAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEYzMih4KTsKICAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEYzMih5KTsKKyAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEkzMihpbmRleCk7CiAgICAgICAgIGFkZFBhcnRpY2xlc19mcC5hZGRCb29sZWFuKG5ld0NvbG9yKTsKICAgICAgICAgYWRkUGFydGljbGVzX2ZwLnNraXAoMyk7CiAgICAgICAgIGludm9rZShtRXhwb3J0RnVuY0lkeF9hZGRQYXJ0aWNsZXMsIGFkZFBhcnRpY2xlc19mcCk7CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9kcmF3YWJsZS9kYXRhLmpwZyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2RyYXdhYmxlL2RhdGEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTg3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9kcmF3YWJsZS9kYXRhLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlci5ycyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L21vZGVsdmlld2VyLnJzCmluZGV4IDkxMTk0ZTguLjU1OWJmNDggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L21vZGVsdmlld2VyLnJzCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L21vZGVsdmlld2VyLnJzCkBAIC02Miw3ICs2Miw3IEBACiAgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1JvdGF0ZSwgMC4wZiwgMS4wZiwgMC4wZik7CiAgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKIAotICAgIHJzZ0RyYXdTaW1wbGVNZXNoKGdUZXN0TWVzaCk7CisgICAgcnNnRHJhd01lc2goZ1Rlc3RNZXNoKTsKIAogICAgIGNvbG9yKDAuM2YsIDAuM2YsIDAuM2YsIDEuMGYpOwogICAgIHJzZ0RyYXdUZXh0KCJSZW5kZXJzY3JpcHQgbW9kZWwgdGVzdCIsIDMwLCA2OTUpOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9yYXcvbW9kZWx2aWV3ZXJfYmMuYmMgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlcl9iYy5iYwppbmRleCBhNjRlNzI1Li5mYjg1MDI4IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlcl9iYy5iYworKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlcl9iYy5iYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QKaW5kZXggYzBjNjZhZS4uMmQ3ZDMyYiAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9yYXcvcm9ib3QuYTNkCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXJSUy5qYXZhCmluZGV4IGI2NDg1ZGMuLjM3ZWI5YzEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXJSUy5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXJSUy5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1HcmlkSW1hZ2U7CiAgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BWOwogCi0gICAgcHJpdmF0ZSBTaW1wbGVNZXNoIG1NZXNoOworICAgIHByaXZhdGUgTWVzaCBtTWVzaDsKIAogICAgIHByaXZhdGUgRm9udCBtSXRhbGljOwogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4dEFsbG9jOwpAQCAtMTQ5LDE1ICsxNDksMTUgQEAKIAogICAgICAgICBGaWxlQTNEIG1vZGVsID0gRmlsZUEzRC5jcmVhdGVGcm9tUmVzb3VyY2UobVJTLCBtUmVzLCBSLnJhdy5yb2JvdCk7CiAgICAgICAgIEZpbGVBM0QuSW5kZXhFbnRyeSBlbnRyeSA9IG1vZGVsLmdldEluZGV4RW50cnkoMCk7Ci0gICAgICAgIGlmKGVudHJ5ID09IG51bGwgfHwgZW50cnkuZ2V0Q2xhc3NJRCgpICE9IEZpbGVBM0QuQ2xhc3NJRC5TSU1QTEVfTUVTSCkgeworICAgICAgICBpZihlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmdldENsYXNzSUQoKSAhPSBGaWxlQTNELkNsYXNzSUQuTUVTSCkgewogICAgICAgICAgICAgTG9nLmUoInJzIiwgImNvdWxkIG5vdCBsb2FkIG1vZGVsIik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBtTWVzaCA9IChTaW1wbGVNZXNoKWVudHJ5LmdldE9iamVjdCgpOworICAgICAgICAgICAgbU1lc2ggPSAoTWVzaCllbnRyeS5nZXRPYmplY3QoKTsKICAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dUZXN0TWVzaChtTWVzaCk7CiAgICAgICAgIH0KIAotICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIiwgMTApOworICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIiwgOCk7CiAgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CiAKICAgICAgICAgaW5pdFRleHRBbGxvY2F0aW9uKCk7CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjcmlwdENfTW9kZWx2aWV3ZXIuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NyaXB0Q19Nb2RlbHZpZXdlci5qYXZhCmluZGV4IGQzYTJhMjkuLjA2YzEwYWIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NyaXB0Q19Nb2RlbHZpZXdlci5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NyaXB0Q19Nb2RlbHZpZXdlci5qYXZhCkBAIC02MCwxMyArNjAsMTMgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9nVGVzdE1lc2ggPSAzOwotICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtRXhwb3J0VmFyX2dUZXN0TWVzaDsKLSAgICBwdWJsaWMgdm9pZCBzZXRfZ1Rlc3RNZXNoKFNpbXBsZU1lc2ggdikgeworICAgIHByaXZhdGUgTWVzaCBtRXhwb3J0VmFyX2dUZXN0TWVzaDsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1Rlc3RNZXNoKE1lc2ggdikgewogICAgICAgICBtRXhwb3J0VmFyX2dUZXN0TWVzaCA9IHY7CiAgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dUZXN0TWVzaCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU2ltcGxlTWVzaCBnZXRfZ1Rlc3RNZXNoKCkgeworICAgIHB1YmxpYyBNZXNoIGdldF9nVGVzdE1lc2goKSB7CiAgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dUZXN0TWVzaDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnMuc3BlYyBiL2xpYnMvcnMvcnMuc3BlYwppbmRleCAzNjk0YjY1Li4xNzE5MDI5IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzLnNwZWMKKysrIGIvbGlicy9ycy9ycy5zcGVjCkBAIC0zNDcsOCArMzQ3LDYgQEAKIAl9CiAKIFByb2dyYW1SYXN0ZXJDcmVhdGUgewotCXBhcmFtIFJzRWxlbWVudCBpbgotCXBhcmFtIFJzRWxlbWVudCBvdXQKIAlwYXJhbSBib29sIHBvaW50U21vb3RoCiAJcGFyYW0gYm9vbCBsaW5lU21vb3RoCiAJcGFyYW0gYm9vbCBwb2ludFNwcml0ZQpAQCAtMzYwLDEyICszNTgsMTEgQEAKIAlwYXJhbSBmbG9hdCBsdwogfQogCi1Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXpleworUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlIHsKIAlwYXJhbSBSc1Byb2dyYW1SYXN0ZXIgcHIKLQlwYXJhbSBmbG9hdCBwcworCXBhcmFtIFJzQ3VsbE1vZGUgbW9kZQogfQogCi0KIFByb2dyYW1CaW5kQ29uc3RhbnRzIHsKIAlwYXJhbSBSc1Byb2dyYW0gdnAKIAlwYXJhbSB1aW50MzJfdCBzbG90CkBAIC00NzgsMzIgKzQ3NSw0OCBAQAogCXJldCBSc0ZvbnQKIAl9CiAKLVNpbXBsZU1lc2hDcmVhdGUgewotCXJldCBSc1NpbXBsZU1lc2gKLQlwYXJhbSBSc0FsbG9jYXRpb24gcHJpbQotCXBhcmFtIFJzQWxsb2NhdGlvbiBpbmRleAotCXBhcmFtIFJzQWxsb2NhdGlvbiAqdnR4CitNZXNoQ3JlYXRlIHsKKwlyZXQgUnNNZXNoCiAJcGFyYW0gdWludDMyX3QgdnR4Q291bnQKLQlwYXJhbSB1aW50MzJfdCBwcmltVHlwZQorCXBhcmFtIHVpbnQzMl90IGlkeENvdW50CiAJfQogCi0KLVNpbXBsZU1lc2hCaW5kSW5kZXggewotCXBhcmFtIFJzU2ltcGxlTWVzaCBtZXNoCitNZXNoQmluZEluZGV4IHsKKwlwYXJhbSBSc01lc2ggbWVzaAogCXBhcmFtIFJzQWxsb2NhdGlvbiBpZHgKKwlwYXJhbSB1aW50MzJfdCBwcmltVHlwZQorCXBhcmFtIHVpbnQzMl90IHNsb3QKIAl9CiAKLVNpbXBsZU1lc2hCaW5kUHJpbWl0aXZlIHsKLQlwYXJhbSBSc1NpbXBsZU1lc2ggbWVzaAotCXBhcmFtIFJzQWxsb2NhdGlvbiBwcmltCi0JfQotCi1TaW1wbGVNZXNoQmluZFZlcnRleCB7Ci0JcGFyYW0gUnNTaW1wbGVNZXNoIG1lc2gKK01lc2hCaW5kVmVydGV4IHsKKwlwYXJhbSBSc01lc2ggbWVzaAogCXBhcmFtIFJzQWxsb2NhdGlvbiB2dHgKIAlwYXJhbSB1aW50MzJfdCBzbG90CiAJfQogCitNZXNoR2V0VmVydGV4QnVmZmVyQ291bnQgeworCXBhcmFtIFJzTWVzaCBtZXNoCisJcGFyYW0gaW50MzJfdCAqbnVtVnR4CisJfQorCitNZXNoR2V0SW5kZXhDb3VudCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKKwlwYXJhbSBpbnQzMl90ICpudW1JZHgKKwl9CisKK01lc2hHZXRWZXJ0aWNlcyB7CisJcGFyYW0gUnNNZXNoIG12CisJcGFyYW0gUnNBbGxvY2F0aW9uICp2dHhEYXRhCisJcGFyYW0gdWludDMyX3QgdnR4RGF0YUNvdW50CisJfQorCitNZXNoR2V0SW5kaWNlcyB7CisJcGFyYW0gUnNNZXNoIG12CisJcGFyYW0gUnNBbGxvY2F0aW9uICp2YQorCXBhcmFtIHVpbnQzMl90ICpwcmltVHlwZQorCXBhcmFtIHVpbnQzMl90IGlkeERhdGFDb3VudAorCX0KKwogQW5pbWF0aW9uQ3JlYXRlIHsKIAlwYXJhbSBjb25zdCBmbG9hdCAqaW5WYWx1ZXMKIAlwYXJhbSBjb25zdCBmbG9hdCAqb3V0VmFsdWVzCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAKaW5kZXggZDlkMGJjNS4uNjU2MDEwMSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcApAQCAtNjgzLDYgKzY4MywxNCBAQAogICAgIGEtPnJlYWQoZGF0YSk7CiB9CiAKK2NvbnN0IHZvaWQqIHJzaV9BbGxvY2F0aW9uR2V0VHlwZShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgYS0+Z2V0VHlwZSgpLT5pbmNVc2VyUmVmKCk7CisKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpOworfQorCiAjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAKIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb250ZXh0LmggYi9saWJzL3JzL3JzQ29udGV4dC5oCmluZGV4IDczZjQ3OGEuLjA2NDMzYTEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb250ZXh0LmgKKysrIGIvbGlicy9ycy9yc0NvbnRleHQuaApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgInJzVHlwZS5oIgogI2luY2x1ZGUgInJzTWF0cml4LmgiCiAjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCi0jaW5jbHVkZSAicnNTaW1wbGVNZXNoLmgiCiAjaW5jbHVkZSAicnNNZXNoLmgiCiAjaW5jbHVkZSAicnNEZXZpY2UuaCIKICNpbmNsdWRlICJyc1NjcmlwdEMuaCIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaCBiL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaAppbmRleCBiZTFmZmY2Li5jNDM3NjA2IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmgKKysrIGIvbGlicy9ycy9yc0NvbnRleHRIb3N0U3R1Yi5oCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSAicnNUeXBlLmgiCiAjaW5jbHVkZSAicnNNYXRyaXguaCIKICNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKLSNpbmNsdWRlICJyc1NpbXBsZU1lc2guaCIKICNpbmNsdWRlICJyc01lc2guaCIKIC8vI2luY2x1ZGUgInJzRGV2aWNlLmgiCiAjaW5jbHVkZSAicnNTY3JpcHRDLmgiCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRmlsZUEzRC5jcHAgYi9saWJzL3JzL3JzRmlsZUEzRC5jcHAKaW5kZXggNGZhYzQyMS4uNTcwOWYyYSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpbGVBM0QuY3BwCisrKyBiL2xpYnMvcnMvcnNGaWxlQTNELmNwcApAQCAtMjU4LDkgKzI1OCw2IEBACiAgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX01FU0g6CiAgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfU0lNUExFX01FU0g6Ci0gICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gU2ltcGxlTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfVFlQRToKICAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBUeXBlOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZvbnQuY3BwIGIvbGlicy9ycy9yc0ZvbnQuY3BwCmluZGV4IDJhNDdjYTQuLmQxMzQ2ZmMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNGb250LmNwcAorKysgYi9saWJzL3JzL3JzRm9udC5jcHAKQEAgLTUxMSw2ICs1MTEsOSBAQAogICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVZlcnRleD4gdG1wVihtUlNDLT5nZXRWZXJ0ZXgoKSk7CiAgICAgbVJTQy0+c2V0VmVydGV4KG1SU0MtPmdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkpOwogCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtUmFzdGVyPiB0bXBSKG1SU0MtPmdldFJhc3RlcigpKTsKKyAgICBtUlNDLT5zZXRSYXN0ZXIobVJTQy0+Z2V0RGVmYXVsdFByb2dyYW1SYXN0ZXIoKSk7CisKICAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1GcmFnbWVudD4gdG1wRihtUlNDLT5nZXRGcmFnbWVudCgpKTsKICAgICBtUlNDLT5zZXRGcmFnbWVudChtRm9udFNoYWRlckYuZ2V0KCkpOwogCkBAIC01MTksNiArNTIyLDcgQEAKIAogICAgIGlmICghbVJTQy0+c2V0dXBDaGVjaygpKSB7CiAgICAgICAgIG1SU0MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcFYuZ2V0KCkpOworICAgICAgICBtUlNDLT5zZXRSYXN0ZXIoKFByb2dyYW1SYXN0ZXIgKil0bXBSLmdldCgpKTsKICAgICAgICAgbVJTQy0+c2V0RnJhZ21lbnQoKFByb2dyYW1GcmFnbWVudCAqKXRtcEYuZ2V0KCkpOwogICAgICAgICBtUlNDLT5zZXRGcmFnbWVudFN0b3JlKChQcm9ncmFtU3RvcmUgKil0bXBQUy5nZXQoKSk7CiAgICAgICAgIHJldHVybjsKQEAgLTUzOCw2ICs1NDIsNyBAQAogCiAgICAgLy8gUmVzZXQgdGhlIHN0YXRlCiAgICAgbVJTQy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wVi5nZXQoKSk7CisgICAgbVJTQy0+c2V0UmFzdGVyKChQcm9ncmFtUmFzdGVyICopdG1wUi5nZXQoKSk7CiAgICAgbVJTQy0+c2V0RnJhZ21lbnQoKFByb2dyYW1GcmFnbWVudCAqKXRtcEYuZ2V0KCkpOwogICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUoKFByb2dyYW1TdG9yZSAqKXRtcFBTLmdldCgpKTsKIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNZXNoLmNwcCBiL2xpYnMvcnMvcnNNZXNoLmNwcAppbmRleCBiZDljZDI3Li45MDI2NTc4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWVzaC5jcHAKKysrIGIvbGlicy9ycy9yc01lc2guY3BwCkBAIC0zNSwxNCArMzUsMTExIEBACiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICBtVmVydGljaWVzID0gTlVMTDsKLSAgICBtVmVydGljaWVzQ291bnQgPSAwOwogICAgIG1QcmltaXRpdmVzID0gTlVMTDsKICAgICBtUHJpbWl0aXZlc0NvdW50ID0gMDsKKyAgICBtVmVydGV4QnVmZmVycyA9IE5VTEw7CisgICAgbVZlcnRleEJ1ZmZlckNvdW50ID0gMDsKIH0KIAogTWVzaDo6fk1lc2goKQogeworICAgIGlmKG1WZXJ0ZXhCdWZmZXJzKSB7CisgICAgICAgIGRlbGV0ZVtdIG1WZXJ0ZXhCdWZmZXJzOworICAgIH0KKworICAgIGlmKG1QcmltaXRpdmVzKSB7CisgICAgICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1QcmltaXRpdmVzQ291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtUHJpbWl0aXZlc1tpXTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGVbXSBtUHJpbWl0aXZlczsKKyAgICB9Cit9CisKK3ZvaWQgTWVzaDo6cmVuZGVyKENvbnRleHQgKnJzYykgY29uc3QKK3sKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IG1QcmltaXRpdmVzQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIHJlbmRlclByaW1pdGl2ZShyc2MsIGN0KTsKKyAgICB9Cit9CisKK3ZvaWQgTWVzaDo6cmVuZGVyUHJpbWl0aXZlKENvbnRleHQgKnJzYywgdWludDMyX3QgcHJpbUluZGV4KSBjb25zdCB7CisgICAgaWYgKHByaW1JbmRleCA+PSBtUHJpbWl0aXZlc0NvdW50KSB7CisgICAgICAgIExPR0UoIkludmFsaWQgcHJpbWl0aXZlIGluZGV4Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQcmltaXRpdmVfdCAqcHJpbSA9IG1QcmltaXRpdmVzW3ByaW1JbmRleF07CisKKyAgICBpZiAocHJpbS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgIHJlbmRlclByaW1pdGl2ZVJhbmdlKHJzYywgcHJpbUluZGV4LCAwLCBwcmltLT5tSW5kZXhCdWZmZXItPmdldFR5cGUoKS0+Z2V0RGltWCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJlbmRlclByaW1pdGl2ZVJhbmdlKHJzYywgcHJpbUluZGV4LCAwLCBtVmVydGV4QnVmZmVyc1swXS0+Z2V0VHlwZSgpLT5nZXREaW1YKCkpOworfQorCit2b2lkIE1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlKENvbnRleHQgKnJzYywgdWludDMyX3QgcHJpbUluZGV4LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdAoreworICAgIGlmIChsZW4gPCAxIHx8IHByaW1JbmRleCA+PSBtUHJpbWl0aXZlc0NvdW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIk1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlIDEiKTsKKyAgICBWZXJ0ZXhBcnJheSB2YTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleEJ1ZmZlckNvdW50OyBjdCsrKSB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKKyAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0SXNCdWZmZXJPYmplY3QoKSkgeworICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRQdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRUeXBlKCktPmVuYWJsZUdMVmVydGV4QnVmZmVyKCZ2YSk7CisgICAgfQorICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIk1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlIDIiKTsKKyAgICBQcmltaXRpdmVfdCAqcHJpbSA9IG1QcmltaXRpdmVzW3ByaW1JbmRleF07CisgICAgaWYgKHByaW0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICBwcmltLT5tSW5kZXhCdWZmZXItPnVwbG9hZENoZWNrKHJzYyk7CisgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgcHJpbS0+bUluZGV4QnVmZmVyLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKKyAgICAgICAgZ2xEcmF3RWxlbWVudHMocHJpbS0+bUdMUHJpbWl0aXZlLCBsZW4sIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoc3RhcnQgKiAyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKHByaW0tPm1HTFByaW1pdGl2ZSwgc3RhcnQsIGxlbik7CisgICAgfQorCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZSIpOworfQorCisKK3ZvaWQgTWVzaDo6dXBsb2FkQWxsKENvbnRleHQgKnJzYykKK3sKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtVmVydGV4QnVmZmVyQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIGlmIChtVmVydGV4QnVmZmVyc1tjdF0uZ2V0KCkpIHsKKyAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtUHJpbWl0aXZlc0NvdW50OyBjdCArKykgeworICAgICAgICBpZiAobVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIG1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJzYy0+Y2hlY2tFcnJvcigiTWVzaDo6dXBsb2FkQWxsIik7Cit9CisKK3ZvaWQgTWVzaDo6dXBkYXRlR0xQcmltaXRpdmVzKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtUHJpbWl0aXZlc0NvdW50OyBpICsrKSB7CisgICAgICAgIHN3aXRjaChtUHJpbWl0aXZlc1tpXS0+bVByaW1pdGl2ZSkgeworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfUE9JTlQ6ICAgICAgICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9QT0lOVFM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORTogICAgICAgICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FUzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FX1NUUklQOiAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVfU1RSSVA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEU6ICAgICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRVM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfU1RSSVA6IG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9TVFJJUDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9GQU46ICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX0ZBTjsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHZvaWQgTWVzaDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKQEAgLTUzLDI1ICsxNTAsMTAgQEAKICAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKICAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CiAKLSAgICBzdHJlYW0tPmFkZFUzMihtVmVydGljaWVzQ291bnQpOwotCi0gICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1WZXJ0aWNpZXNDb3VudDsgdkNvdW50ICsrKSB7Ci0gICAgICAgIFZlcnRpY2llc190ICp2ZXJ0cyA9IG1WZXJ0aWNpZXNbdkNvdW50XTsKLQotICAgICAgICBzdHJlYW0tPmFkZFUzMih2ZXJ0cy0+bUFsbG9jYXRpb25Db3VudCk7Ci0KLSAgICAgICAgZm9yICh1aW50MzJfdCBhQ291bnQgPSAwOyBhQ291bnQgPCB2ZXJ0cy0+bUFsbG9jYXRpb25Db3VudDsgYUNvdW50KyspIHsKLSAgICAgICAgICAgIHZlcnRzLT5tQWxsb2NhdGlvbnNbYUNvdW50XS0+c2VyaWFsaXplKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydHMtPm1WZXJ0ZXhEYXRhU2l6ZSk7Ci0KLSAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydHMtPm1PZmZzZXRDb29yZCk7Ci0gICAgICAgIHN0cmVhbS0+YWRkVTMyKHZlcnRzLT5tT2Zmc2V0VGV4KTsKLSAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydHMtPm1PZmZzZXROb3JtKTsKLQotICAgICAgICBzdHJlYW0tPmFkZFUzMih2ZXJ0cy0+bVNpemVDb29yZCk7Ci0gICAgICAgIHN0cmVhbS0+YWRkVTMyKHZlcnRzLT5tU2l6ZVRleCk7Ci0gICAgICAgIHN0cmVhbS0+YWRkVTMyKHZlcnRzLT5tU2l6ZU5vcm0gKTsKKyAgICAvLyBTdG9yZSBudW1iZXIgb2YgdmVydGV4IHN0cmVhbXMKKyAgICBzdHJlYW0tPmFkZFUzMihtVmVydGV4QnVmZmVyQ291bnQpOworICAgIGZvcih1aW50MzJfdCB2Q291bnQgPSAwOyB2Q291bnQgPCBtVmVydGV4QnVmZmVyQ291bnQ7IHZDb3VudCArKykgeworICAgICAgICBtVmVydGV4QnVmZmVyc1t2Q291bnRdLT5zZXJpYWxpemUoc3RyZWFtKTsKICAgICB9CiAKICAgICBzdHJlYW0tPmFkZFUzMihtUHJpbWl0aXZlc0NvdW50KTsKQEAgLTc5LDI3ICsxNjEsMTQgQEAKICAgICBmb3IgKHVpbnQzMl90IHBDb3VudCA9IDA7IHBDb3VudCA8IG1QcmltaXRpdmVzQ291bnQ7IHBDb3VudCArKykgewogICAgICAgICBQcmltaXRpdmVfdCAqIHByaW0gPSBtUHJpbWl0aXZlc1twQ291bnRdOwogCi0gICAgICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpcHJpbS0+bVR5cGUpOworICAgICAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KXByaW0tPm1QcmltaXRpdmUpOwogCi0gICAgICAgIC8vIFdlIHN0b3JlIHRoZSBpbmRleCB0byB0aGUgdmVydGljZXMKLSAgICAgICAgLy8gU28gaXRlcmF0ZSBvdmVyIG91ciB2ZXJ0aWNlcyB0byBmaW5kIHdoaWNoIG9uZSB3ZSBwb2ludCB0bwotICAgICAgICB1aW50MzJfdCB2ZXJ0ZXhJbmRleCA9IDA7Ci0gICAgICAgIGZvcih1aW50MzJfdCB2Q291bnQgPSAwOyB2Q291bnQgPCBtVmVydGljaWVzQ291bnQ7IHZDb3VudCArKykgewotICAgICAgICAgICAgaWYocHJpbS0+bVZlcnRpY2llcyA9PSBtVmVydGljaWVzW3ZDb3VudF0pIHsKLSAgICAgICAgICAgICAgICB2ZXJ0ZXhJbmRleCA9IHZDb3VudDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYocHJpbS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICBzdHJlYW0tPmFkZFUzMigxKTsKKyAgICAgICAgICAgIHByaW0tPm1JbmRleEJ1ZmZlci0+c2VyaWFsaXplKHN0cmVhbSk7CiAgICAgICAgIH0KLSAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydGV4SW5kZXgpOwotCi0gICAgICAgIHN0cmVhbS0+YWRkVTMyKHByaW0tPm1JbmRleENvdW50KTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcHJpbS0+bUluZGV4Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIHN0cmVhbS0+YWRkVTE2KHByaW0tPm1JbmRpY2llc1tjdF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RyZWFtLT5hZGRVMzIocHJpbS0+bVJlc3RhcnRDb3VudHMpOwotICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBwcmltLT5tUmVzdGFydENvdW50czsgY3QrKykgewotICAgICAgICAgICAgc3RyZWFtLT5hZGRVMTYocHJpbS0+bVJlc3RhcnRzW2N0XSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RyZWFtLT5hZGRVMzIoMCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xMTksODYgKzE4OCwzOSBAQAogICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CiAgICAgbWVzaC0+c2V0TmFtZShuYW1lLnN0cmluZygpLCBuYW1lLnNpemUoKSk7CiAKLSAgICBtZXNoLT5tVmVydGljaWVzQ291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKLSAgICBpZihtZXNoLT5tVmVydGljaWVzQ291bnQpIHsKLSAgICAgICAgbWVzaC0+bVZlcnRpY2llcyA9IG5ldyBWZXJ0aWNpZXNfdCAqW21lc2gtPm1WZXJ0aWNpZXNDb3VudF07Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBtZXNoLT5tVmVydGljaWVzID0gTlVMTDsKLSAgICB9CisgICAgbWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYobWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50KSB7CisgICAgICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bbWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50XTsKIAotICAgIGZvcih1aW50MzJfdCB2Q291bnQgPSAwOyB2Q291bnQgPCBtZXNoLT5tVmVydGljaWVzQ291bnQ7IHZDb3VudCArKykgewotICAgICAgICBWZXJ0aWNpZXNfdCAqdmVydHMgPSBuZXcgVmVydGljaWVzX3QoKTsKLSAgICAgICAgLy8gU3RvcmUgb3VyIHZlcnRpY2VzIG9uZSB0aGUgbWVzaAotICAgICAgICBtZXNoLT5tVmVydGljaWVzW3ZDb3VudF0gPSB2ZXJ0czsKLQotICAgICAgICB2ZXJ0cy0+bUFsbG9jYXRpb25Db3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOwotICAgICAgICB2ZXJ0cy0+bUFsbG9jYXRpb25zID0gbmV3IEFsbG9jYXRpb24gKlt2ZXJ0cy0+bUFsbG9jYXRpb25Db3VudF07Ci0KLSAgICAgICAgTE9HRSgicHJvY2Vzc0NodW5rX1ZlcnRpY2llcyBjb3VudCAlaSIsIHZlcnRzLT5tQWxsb2NhdGlvbkNvdW50KTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBhQ291bnQgPSAwOyBhQ291bnQgPCB2ZXJ0cy0+bUFsbG9jYXRpb25Db3VudDsgYUNvdW50KyspIHsKLSAgICAgICAgICAgIHZlcnRzLT5tQWxsb2NhdGlvbnNbYUNvdW50XSA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgICAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50OyB2Q291bnQgKyspIHsKKyAgICAgICAgICAgIEFsbG9jYXRpb24gKnZlcnRleEFsbG9jID0gQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgICAgICBtZXNoLT5tVmVydGV4QnVmZmVyc1t2Q291bnRdLnNldCh2ZXJ0ZXhBbGxvYyk7CiAgICAgICAgIH0KLSAgICAgICAgdmVydHMtPm1WZXJ0ZXhEYXRhU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOwotCi0gICAgICAgIHZlcnRzLT5tT2Zmc2V0Q29vcmQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKLSAgICAgICAgdmVydHMtPm1PZmZzZXRUZXggPSBzdHJlYW0tPmxvYWRVMzIoKTsKLSAgICAgICAgdmVydHMtPm1PZmZzZXROb3JtID0gc3RyZWFtLT5sb2FkVTMyKCk7Ci0KLSAgICAgICAgdmVydHMtPm1TaXplQ29vcmQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKLSAgICAgICAgdmVydHMtPm1TaXplVGV4ID0gc3RyZWFtLT5sb2FkVTMyKCk7Ci0gICAgICAgIHZlcnRzLT5tU2l6ZU5vcm0gPSBzdHJlYW0tPmxvYWRVMzIoKTsKICAgICB9CiAKICAgICBtZXNoLT5tUHJpbWl0aXZlc0NvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CiAgICAgaWYobWVzaC0+bVByaW1pdGl2ZXNDb3VudCkgewogICAgICAgICBtZXNoLT5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVfdCAqW21lc2gtPm1QcmltaXRpdmVzQ291bnRdOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgbWVzaC0+bVByaW1pdGl2ZXMgPSBOVUxMOwotICAgIH0KIAotICAgIC8vIGxvYWQgYWxsIHByaW1pdGl2ZXMKLSAgICBmb3IgKHVpbnQzMl90IHBDb3VudCA9IDA7IHBDb3VudCA8IG1lc2gtPm1QcmltaXRpdmVzQ291bnQ7IHBDb3VudCArKykgewotICAgICAgICBQcmltaXRpdmVfdCAqIHByaW0gPSBuZXcgUHJpbWl0aXZlX3Q7Ci0gICAgICAgIG1lc2gtPm1QcmltaXRpdmVzW3BDb3VudF0gPSBwcmltOworICAgICAgICAvLyBsb2FkIGFsbCBwcmltaXRpdmVzCisgICAgICAgIGZvciAodWludDMyX3QgcENvdW50ID0gMDsgcENvdW50IDwgbWVzaC0+bVByaW1pdGl2ZXNDb3VudDsgcENvdW50ICsrKSB7CisgICAgICAgICAgICBQcmltaXRpdmVfdCAqIHByaW0gPSBuZXcgUHJpbWl0aXZlX3Q7CisgICAgICAgICAgICBtZXNoLT5tUHJpbWl0aXZlc1twQ291bnRdID0gcHJpbTsKIAotICAgICAgICBwcmltLT5tVHlwZSA9IChSc1ByaW1pdGl2ZSlzdHJlYW0tPmxvYWRVOCgpOworICAgICAgICAgICAgcHJpbS0+bVByaW1pdGl2ZSA9IChSc1ByaW1pdGl2ZSlzdHJlYW0tPmxvYWRVOCgpOwogCi0gICAgICAgIC8vIFdlIHN0b3JlIHRoZSBpbmRleCB0byB0aGUgdmVydGljZXMKLSAgICAgICAgdWludDMyX3QgdmVydGV4SW5kZXggPSBzdHJlYW0tPmxvYWRVMzIoKTsKLSAgICAgICAgaWYodmVydGV4SW5kZXggPCBtZXNoLT5tVmVydGljaWVzQ291bnQpIHsKLSAgICAgICAgICAgIHByaW0tPm1WZXJ0aWNpZXMgPSBtZXNoLT5tVmVydGljaWVzW3ZlcnRleEluZGV4XTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByaW0tPm1WZXJ0aWNpZXMgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbS0+bUluZGV4Q291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKLSAgICAgICAgaWYocHJpbS0+bUluZGV4Q291bnQpewotICAgICAgICAgICAgcHJpbS0+bUluZGljaWVzID0gbmV3IHVpbnQxNl90W3ByaW0tPm1JbmRleENvdW50XTsKLSAgICAgICAgICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IHByaW0tPm1JbmRleENvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgcHJpbS0+bUluZGljaWVzW2N0XSA9IHN0cmVhbS0+bG9hZFUxNigpOworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBpbmRleCBidWZmZXIgd2FzIHN0b3JlZAorICAgICAgICAgICAgdWludDMyX3QgaXNJbmRleFByZXNlbnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgICAgIGlmKGlzSW5kZXhQcmVzZW50KSB7CisgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqaW5kZXhBbGxvYyA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgICAgICAgICAgICAgIHByaW0tPm1JbmRleEJ1ZmZlci5zZXQoaW5kZXhBbGxvYyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwcmltLT5tSW5kaWNpZXMgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbS0+bVJlc3RhcnRDb3VudHMgPSBzdHJlYW0tPmxvYWRVMzIoKTsKLSAgICAgICAgaWYgKHByaW0tPm1SZXN0YXJ0Q291bnRzKSB7Ci0gICAgICAgICAgICBwcmltLT5tUmVzdGFydHMgPSBuZXcgdWludDE2X3RbcHJpbS0+bVJlc3RhcnRDb3VudHNdOwotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcHJpbS0+bVJlc3RhcnRDb3VudHM7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBwcmltLT5tUmVzdGFydHNbY3RdID0gc3RyZWFtLT5sb2FkVTE2KCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByaW0tPm1SZXN0YXJ0cyA9IE5VTEw7Ci0gICAgICAgIH0KLQogICAgIH0KIAorICAgIG1lc2gtPnVwZGF0ZUdMUHJpbWl0aXZlcygpOworICAgIG1lc2gtPnVwbG9hZEFsbChyc2MpOworCiAgICAgcmV0dXJuIG1lc2g7CiB9CiAKQEAgLTIxMSwzICsyMzMsODMgQEAKIHsKIH0KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK1JzTWVzaCByc2lfTWVzaENyZWF0ZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHZ0eENvdW50LCB1aW50MzJfdCBpZHhDb3VudCkKK3sKKyAgICBNZXNoICpzbSA9IG5ldyBNZXNoKHJzYyk7CisgICAgc20tPmluY1VzZXJSZWYoKTsKKworICAgIHNtLT5tUHJpbWl0aXZlc0NvdW50ID0gaWR4Q291bnQ7CisgICAgc20tPm1QcmltaXRpdmVzID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90ICpbc20tPm1QcmltaXRpdmVzQ291bnRdOworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgaWR4Q291bnQ7IGN0ICsrKSB7CisgICAgICAgIHNtLT5tUHJpbWl0aXZlc1tjdF0gPSBuZXcgTWVzaDo6UHJpbWl0aXZlX3Q7CisgICAgfQorCisgICAgc20tPm1WZXJ0ZXhCdWZmZXJDb3VudCA9IHZ0eENvdW50OworICAgIHNtLT5tVmVydGV4QnVmZmVycyA9IG5ldyBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+W3Z0eENvdW50XTsKKworICAgIHJldHVybiBzbTsKK30KKwordm9pZCByc2lfTWVzaEJpbmRWZXJ0ZXgoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3Qgc2xvdCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KHNsb3QgPCBzbS0+bVZlcnRleEJ1ZmZlckNvdW50KTsKKworICAgIHNtLT5tVmVydGV4QnVmZmVyc1tzbG90XS5zZXQoKEFsbG9jYXRpb24gKil2YSk7Cit9CisKK3ZvaWQgcnNpX01lc2hCaW5kSW5kZXgoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgcHJpbVR5cGUsIHVpbnQzMl90IHNsb3QpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydChzbG90IDwgc20tPm1QcmltaXRpdmVzQ291bnQpOworCisgICAgc20tPm1QcmltaXRpdmVzW3Nsb3RdLT5tSW5kZXhCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOworICAgIHNtLT5tUHJpbWl0aXZlc1tzbG90XS0+bVByaW1pdGl2ZSA9IChSc1ByaW1pdGl2ZSlwcmltVHlwZTsKKyAgICBzbS0+dXBkYXRlR0xQcmltaXRpdmVzKCk7Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgaW50MzJfdCAqbnVtVnR4KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgKm51bVZ0eCA9IHNtLT5tVmVydGV4QnVmZmVyQ291bnQ7Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRJbmRleENvdW50KENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBpbnQzMl90ICpudW1JZHgpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICAqbnVtSWR4ID0gc20tPm1QcmltaXRpdmVzQ291bnQ7Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRWZXJ0aWNlcyhDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uICp2dHhEYXRhLCB1aW50MzJfdCB2dHhEYXRhQ291bnQpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydCh2dHhEYXRhQ291bnQgPT0gc20tPm1WZXJ0ZXhCdWZmZXJDb3VudCk7CisKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IHZ0eERhdGFDb3VudDsgY3QgKyspIHsKKyAgICAgICAgdnR4RGF0YVtjdF0gPSBzbS0+bVZlcnRleEJ1ZmZlcnNbY3RdLmdldCgpOworICAgICAgICBzbS0+bVZlcnRleEJ1ZmZlcnNbY3RdLT5pbmNVc2VyUmVmKCk7CisgICAgfQorfQorCit2b2lkIHJzaV9NZXNoR2V0SW5kaWNlcyhDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uICp2YSwgdWludDMyX3QgKnByaW1UeXBlLCB1aW50MzJfdCBpZHhEYXRhQ291bnQpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydChpZHhEYXRhQ291bnQgPT0gc20tPm1QcmltaXRpdmVzQ291bnQpOworCisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpZHhEYXRhQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIHZhW2N0XSA9IHNtLT5tUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci5nZXQoKTsKKyAgICAgICAgcHJpbVR5cGVbY3RdID0gc20tPm1QcmltaXRpdmVzW2N0XS0+bVByaW1pdGl2ZTsKKyAgICAgICAgaWYoc20tPm1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICBzbS0+bVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXItPmluY1VzZXJSZWYoKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisKKworCit9fQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc01lc2guaCBiL2xpYnMvcnMvcnNNZXNoLmgKaW5kZXggOGM3ZThhNC4uNzY1YTk3MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc01lc2guaAorKysgYi9saWJzL3JzL3JzTWVzaC5oCkBAIC0zMiw0MyArMzIsMzEgQEAKICAgICBNZXNoKENvbnRleHQgKik7CiAgICAgfk1lc2goKTsKIAotICAgIHN0cnVjdCBWZXJ0aWNpZXNfdAotICAgIHsKLSAgICAgICAgQWxsb2NhdGlvbiAqKiBtQWxsb2NhdGlvbnM7Ci0gICAgICAgIHVpbnQzMl90IG1BbGxvY2F0aW9uQ291bnQ7CisgICAgLy8gQ29udGFpbnMgdmVydGV4IGRhdGEKKyAgICAvLyBQb3NpdGlvbiwgbm9ybWFsLCB0ZXhjb29yZCwgZXRjIGNvdWxkIGVpdGhlciBiZSBzdHJpZGVkIGluIG9uZSBhbGxvY2F0aW9uCisgICAgLy8gb2YgcHJvdmlkZWQgc2VwYXJldGVseSBpbiBtdWx0aXBsZSBvbmVzCisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiAqbVZlcnRleEJ1ZmZlcnM7CisgICAgdWludDMyX3QgbVZlcnRleEJ1ZmZlckNvdW50OwogCi0gICAgICAgIHNpemVfdCBtVmVydGV4RGF0YVNpemU7Ci0KLSAgICAgICAgc2l6ZV90IG1PZmZzZXRDb29yZDsKLSAgICAgICAgc2l6ZV90IG1PZmZzZXRUZXg7Ci0gICAgICAgIHNpemVfdCBtT2Zmc2V0Tm9ybTsKLQotICAgICAgICBzaXplX3QgbVNpemVDb29yZDsKLSAgICAgICAgc2l6ZV90IG1TaXplVGV4OwotICAgICAgICBzaXplX3QgbVNpemVOb3JtOwotCi0gICAgICAgIHVpbnQzMl90IG1CdWZmZXJPYmplY3Q7Ci0gICAgfTsKLQorICAgIC8vIEVpdGhlciBtSW5kZXhCdWZmZXIsIG1QcmltaXRpdmVCdWZmZXIgb3IgYm90aCBjb3VsZCBoYXZlIGEgTlVMTCByZWZlcmVuY2UKKyAgICAvLyBJZiBib3RoIGFyZSBudWxsLCBtUHJpbWl0aXZlIG9ubHkgd291bGQgYmUgdXNlZCB0byByZW5kZXIgdGhlIG1lc2gKICAgICBzdHJ1Y3QgUHJpbWl0aXZlX3QKICAgICB7Ci0gICAgICAgIFJzUHJpbWl0aXZlIG1UeXBlOwotICAgICAgICBWZXJ0aWNpZXNfdCAqbVZlcnRpY2llczsKKyAgICAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtSW5kZXhCdWZmZXI7CiAKLSAgICAgICAgdWludDMyX3QgbUluZGV4Q291bnQ7Ci0gICAgICAgIHVpbnQxNl90ICptSW5kaWNpZXM7Ci0KLSAgICAgICAgdWludDMyX3QgbVJlc3RhcnRDb3VudHM7Ci0gICAgICAgIHVpbnQxNl90ICptUmVzdGFydHM7CisgICAgICAgIFJzUHJpbWl0aXZlIG1QcmltaXRpdmU7CisgICAgICAgIHVpbnQzMl90IG1HTFByaW1pdGl2ZTsKICAgICB9OwogCi0gICAgVmVydGljaWVzX3QgKiogbVZlcnRpY2llczsKLSAgICB1aW50MzJfdCBtVmVydGljaWVzQ291bnQ7Ci0KICAgICBQcmltaXRpdmVfdCAqKiBtUHJpbWl0aXZlczsKICAgICB1aW50MzJfdCBtUHJpbWl0aXZlc0NvdW50OwogCi0gICAgdm9pZCBhbmFseXplRWxlbWVudCgpOworICAgIHZvaWQgcmVuZGVyKENvbnRleHQgKikgY29uc3Q7CisgICAgdm9pZCByZW5kZXJQcmltaXRpdmUoQ29udGV4dCAqLCB1aW50MzJfdCBwcmltSW5kZXgpIGNvbnN0OworICAgIHZvaWQgcmVuZGVyUHJpbWl0aXZlUmFuZ2UoQ29udGV4dCAqLCB1aW50MzJfdCBwcmltSW5kZXgsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0OworICAgIHZvaWQgdXBsb2FkQWxsKENvbnRleHQgKik7CisgICAgdm9pZCB1cGRhdGVHTFByaW1pdGl2ZXMoKTsKKwogICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKICAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX01FU0g7IH0KICAgICBzdGF0aWMgTWVzaCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CkBAIC05MCwzICs3OCw0IEBACiAjZW5kaWYgLy9BTkRST0lEX1JTX1RSSUFOR0xFX01FU0hfSAogCiAKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwCmluZGV4IDY2ZjZlZjguLjViNjkzNzAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAKQEAgLTQxLDkgKzQxLDggQEAKICAgICBtUG9pbnRTbW9vdGggPSBwb2ludFNtb290aDsKICAgICBtTGluZVNtb290aCA9IGxpbmVTbW9vdGg7CiAgICAgbVBvaW50U3ByaXRlID0gcG9pbnRTcHJpdGU7Ci0KLSAgICBtUG9pbnRTaXplID0gMS4wZjsKICAgICBtTGluZVdpZHRoID0gMS4wZjsKKyAgICBtQ3VsbCA9IFJTX0NVTExfQkFDSzsKIH0KIAogUHJvZ3JhbVJhc3Rlcjo6flByb2dyYW1SYXN0ZXIoKQpAQCAtNTMsMjEgKzUyLDIzIEBACiB2b2lkIFByb2dyYW1SYXN0ZXI6OnNldExpbmVXaWR0aChmbG9hdCBzKQogewogICAgIG1MaW5lV2lkdGggPSBzOworICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKLXZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0UG9pbnRTaXplKGZsb2F0IHMpCit2b2lkIFByb2dyYW1SYXN0ZXI6OnNldEN1bGxNb2RlKFJzQ3VsbE1vZGUgbW9kZSkKIHsKLSAgICBtUG9pbnRTaXplID0gczsKKyAgICBtQ3VsbCA9IG1vZGU7CisgICAgbURpcnR5ID0gdHJ1ZTsKIH0KIAogdm9pZCBQcm9ncmFtUmFzdGVyOjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVJhc3RlclN0YXRlICpzdGF0ZSkKIHsKLSAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKKyAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMgJiYgIW1EaXJ0eSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CisgICAgbURpcnR5ID0gZmFsc2U7CiAKLSAgICBnbFBvaW50U2l6ZShtUG9pbnRTaXplKTsKICAgICBpZiAobVBvaW50U21vb3RoKSB7CiAgICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NNT09USCk7CiAgICAgfSBlbHNlIHsKQEAgLTkwLDE5ICs5MSw0OCBAQAogICAgICAgICB9CiAjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgfQorCisgICAgc3dpdGNoKG1DdWxsKSB7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9CQUNLOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfQkFDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19DVUxMX0ZST05UOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfRlJPTlQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9OT05FOgorICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CiB9CiAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtUmFzdGVyU3RhdGUgKnN0YXRlKQogewotICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgeworICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcyAmJiAhbURpcnR5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKyAgICBtRGlydHkgPSBmYWxzZTsKKworICAgIHN3aXRjaChtQ3VsbCkgeworICAgICAgICBjYXNlIFJTX0NVTExfQkFDSzoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9GUk9OVDoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0ZST05UKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0NVTExfTk9ORToKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQogfQogCiB2b2lkIFByb2dyYW1SYXN0ZXI6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0CiB7Ci0gICAgCisKIH0KIAogUHJvZ3JhbVJhc3RlciAqUHJvZ3JhbVJhc3Rlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKQEAgLTEzNCw3ICsxNjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKLVJzUHJvZ3JhbVJhc3RlciByc2lfUHJvZ3JhbVJhc3RlckNyZWF0ZShDb250ZXh0ICogcnNjLCBSc0VsZW1lbnQgaW4sIFJzRWxlbWVudCBvdXQsCitSc1Byb2dyYW1SYXN0ZXIgcnNpX1Byb2dyYW1SYXN0ZXJDcmVhdGUoQ29udGV4dCAqIHJzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludFNtb290aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaW5lU21vb3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50U3ByaXRlKQpAQCAtMTQ3LDE4ICsxNzcsMTggQEAKICAgICByZXR1cm4gcHI7CiB9CiAKLXZvaWQgcnNpX1Byb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoQ29udGV4dCAqIHJzYywgUnNQcm9ncmFtUmFzdGVyIHZwciwgZmxvYXQgcykKLXsKLSAgICBQcm9ncmFtUmFzdGVyICpwciA9IHN0YXRpY19jYXN0PFByb2dyYW1SYXN0ZXIgKj4odnByKTsKLSAgICBwci0+c2V0UG9pbnRTaXplKHMpOwotfQotCiB2b2lkIHJzaV9Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKENvbnRleHQgKiByc2MsIFJzUHJvZ3JhbVJhc3RlciB2cHIsIGZsb2F0IHMpCiB7CiAgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7CiAgICAgcHItPnNldExpbmVXaWR0aChzKTsKIH0KIAordm9pZCByc2lfUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKENvbnRleHQgKiByc2MsIFJzUHJvZ3JhbVJhc3RlciB2cHIsIFJzQ3VsbE1vZGUgbW9kZSkKK3sKKyAgICBQcm9ncmFtUmFzdGVyICpwciA9IHN0YXRpY19jYXN0PFByb2dyYW1SYXN0ZXIgKj4odnByKTsKKyAgICBwci0+c2V0Q3VsbE1vZGUobW9kZSk7Cit9CisKIAogfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaCBiL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmgKaW5kZXggNzliMTQ3NTMuLjgwMWFiMmEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaApAQCAtNDEsMTcgKzQxLDE0IEBACiAgICAgc3RhdGljIFByb2dyYW1SYXN0ZXIgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCiAgICAgdm9pZCBzZXRMaW5lV2lkdGgoZmxvYXQgdyk7Ci0gICAgdm9pZCBzZXRQb2ludFNpemUoZmxvYXQgcyk7CisgICAgdm9pZCBzZXRDdWxsTW9kZShSc0N1bGxNb2RlIG1vZGUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgYm9vbCBtUG9pbnRTbW9vdGg7CiAgICAgYm9vbCBtTGluZVNtb290aDsKICAgICBib29sIG1Qb2ludFNwcml0ZTsKLQotICAgIGZsb2F0IG1Qb2ludFNpemU7CiAgICAgZmxvYXQgbUxpbmVXaWR0aDsKLQotCisgICAgUnNDdWxsTW9kZSBtQ3VsbDsKIH07CiAKIGNsYXNzIFByb2dyYW1SYXN0ZXJTdGF0ZQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCmluZGV4IDg1ZDkwYzcuLjU1NTgwMDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKQEAgLTE5MSw3ICsxOTEsNiBAQAogICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX3Bvc2l0aW9uO1xuIik7CiAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfY29sb3I7XG4iKTsKICAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWMzIEFUVFJJQl9ub3JtYWw7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSBmbG9hdCBBVFRSSUJfcG9pbnRTaXplO1xuIik7CiAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfdGV4dHVyZTA7XG4iKTsKIAogICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVVuaWZvcm1Db3VudDsgY3QrKykgewpAQCAtMjAyLDcgKzIwMSw3IEBACiAKICAgICAgICAgbVNoYWRlci5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOwogICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBBVFRSSUJfcG9zaXRpb247XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9pbnRTaXplID0gQVRUUklCX3BvaW50U2l6ZTtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBnbF9Qb2ludFNpemUgPSAxLjA7XG4iKTsKIAogICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJDb2xvciA9IEFUVFJJQl9jb2xvcjtcbiIpOwogICAgICAgICBpZiAobVRleHR1cmVNYXRyaXhFbmFibGUpIHsKQEAgLTIxMCw5ICsyMDksNiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyVGV4MCA9IEFUVFJJQl90ZXh0dXJlMDtcbiIpOwogICAgICAgICB9Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgcG9zLnggPSBwb3MueCAvIDQ4MC4wO1xuIik7Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgcG9zLnkgPSBwb3MueSAvIDgwMC4wO1xuIik7Ci0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBwb3M7XG4iKTsKICAgICAgICAgbVNoYWRlci5hcHBlbmQoIn1cbiIpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkdMLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkdMLmNwcAppbmRleCBkYmQzOThlLi5lOTk3MWEyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwCkBAIC00MCwxOCArNDAsNiBAQAogCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSU8gcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ191cGRhdGVTaW1wbGVNZXNoKFJzU2ltcGxlTWVzaCBtZXNoKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obWVzaCk7Ci0gICAgc20tPnVwbG9hZEFsbChyc2MpOwotfQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQ29udGV4dAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKQEAgLTIyMCwyNCArMjA4LDM0IEBACiAgICAgICAgICAgICAgICAgeDEsIHkxLCB6KTsKIH0KIAotc3RhdGljIHZvaWQgU0NfZHJhd1NpbXBsZU1lc2goUnNTaW1wbGVNZXNoIHZzbSkKK3N0YXRpYyB2b2lkIFNDX2RyYXdNZXNoKFJzTWVzaCB2c20pCiB7CiAgICAgR0VUX1RMUygpOwotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPih2c20pOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOwogICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBzbS0+cmVuZGVyKHJzYyk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2RyYXdTaW1wbGVNZXNoUmFuZ2UoUnNTaW1wbGVNZXNoIHZzbSwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikKK3N0YXRpYyB2b2lkIFNDX2RyYXdNZXNoUHJpbWl0aXZlKFJzTWVzaCB2c20sIHVpbnQzMl90IHByaW1JbmRleCkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KHZzbSk7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KHZzbSk7CiAgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNtLT5yZW5kZXJSYW5nZShyc2MsIHN0YXJ0LCBsZW4pOworICAgIHNtLT5yZW5kZXJQcmltaXRpdmUocnNjLCBwcmltSW5kZXgpOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3TWVzaFByaW1pdGl2ZVJhbmdlKFJzTWVzaCB2c20sIHVpbnQzMl90IHByaW1JbmRleCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KHZzbSk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNtLT5yZW5kZXJQcmltaXRpdmVSYW5nZShyc2MsIHByaW1JbmRleCwgc3RhcnQsIGxlbik7CiB9CiAKIApAQCAtMzcyLDggKzM3MCwxMCBAQAogICAgIHsgInJzZ0RyYXdRdWFkVGV4Q29vcmRzIiwgKHZvaWQgKikmU0NfZHJhd1F1YWRUZXhDb29yZHMgfSwKICAgICAvL3sgImRyYXdTcHJpdGUiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlIH0sCiAgICAgeyAicnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlIH0sCi0gICAgeyAiX1oxN3JzZ0RyYXdTaW1wbGVNZXNoN3JzX21lc2giLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaCB9LAotICAgIHsgIl9aMTdyc2dEcmF3U2ltcGxlTWVzaDdyc19tZXNoaWkiLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaFJhbmdlIH0sCisKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaCIsICh2b2lkICopJlNDX2RyYXdNZXNoIH0sCisgICAgeyAiX1oxMXJzZ0RyYXdNZXNoN3JzX21lc2hpIiwgKHZvaWQgKikmU0NfZHJhd01lc2hQcmltaXRpdmUgfSwKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaGlpaSIsICh2b2lkICopJlNDX2RyYXdNZXNoUHJpbWl0aXZlUmFuZ2UgfSwKIAogICAgIHsgInJzZ0NsZWFyQ29sb3IiLCAodm9pZCAqKSZTQ19DbGVhckNvbG9yIH0sCiAgICAgeyAicnNnQ2xlYXJEZXB0aCIsICh2b2lkICopJlNDX0NsZWFyRGVwdGggfSwKQEAgLTM4MywxMSArMzgzLDYgQEAKIAogICAgIHsgInJzZ0JpbmRGb250IiwgKHZvaWQgKikmU0NfQmluZEZvbnQgfSwKIAotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBJTwotICAgIHsgInVwZGF0ZVNpbXBsZU1lc2giLCAodm9pZCAqKSZTQ191cGRhdGVTaW1wbGVNZXNoIH0sCi0KICAgICAvLyBtaXNjCiAgICAgeyAiY29sb3IiLCAodm9pZCAqKSZTQ19jb2xvciB9LAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwIGIvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcAppbmRleCA1MDRmZmJhLi41YzA3M2IzIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwCisrKyBiL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAKQEAgLTEwMSw4ICsxMDEsNyBAQAogICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAwLCAiQVRUUklCX3Bvc2l0aW9uIik7CiAgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDEsICJBVFRSSUJfY29sb3IiKTsKICAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMiwgIkFUVFJJQl9ub3JtYWwiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMywgIkFUVFJJQl9wb2ludFNpemUiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgNCwgIkFUVFJJQl90ZXh0dXJlMCIpOworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAzLCAiQVRUUklCX3RleHR1cmUwIik7CiAgICAgICAgIH0KIAogICAgICAgICAvL0xPR0UoImUyICV4IiwgZ2xHZXRFcnJvcigpKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmNwcCBiL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVjMmViNS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAotI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLSNlbHNlCi0jaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKLQotI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgotI2luY2x1ZGUgPE9wZW5HbC9nbGV4dC5oPgotI2VuZGlmCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKLQotCi0KLQotU2ltcGxlTWVzaDo6U2ltcGxlTWVzaChDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpCi17Ci0gICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwotICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLX0KLQotU2ltcGxlTWVzaDo6flNpbXBsZU1lc2goKQotewotICAgIGRlbGV0ZVtdIG1WZXJ0ZXhUeXBlczsKLSAgICBkZWxldGVbXSBtVmVydGV4QnVmZmVyczsKLX0KLQotdm9pZCBTaW1wbGVNZXNoOjpyZW5kZXIoQ29udGV4dCAqcnNjKSBjb25zdAotewotICAgIGlmIChtUHJpbWl0aXZlVHlwZS5nZXQoKSkgewotICAgICAgICByZW5kZXJSYW5nZShyc2MsIDAsIG1QcmltaXRpdmVUeXBlLT5nZXREaW1YKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1JbmRleFR5cGUuZ2V0KCkpIHsKLSAgICAgICAgcmVuZGVyUmFuZ2UocnNjLCAwLCBtSW5kZXhUeXBlLT5nZXREaW1YKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcmVuZGVyUmFuZ2UocnNjLCAwLCBtVmVydGV4VHlwZXNbMF0tPmdldERpbVgoKSk7Ci19Ci0KLXZvaWQgU2ltcGxlTWVzaDo6cmVuZGVyUmFuZ2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdAotewotICAgIGlmIChsZW4gPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnJlbmRlclJhbmdlIDEiKTsKLSAgICBWZXJ0ZXhBcnJheSB2YTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgIGlmIChtVmVydGV4QnVmZmVyc1tjdF0tPmdldElzQnVmZmVyT2JqZWN0KCkpIHsKLSAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldEJ1ZmZlck9iamVjdElEKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0UHRyKCkpOwotICAgICAgICB9Ci0gICAgICAgIG1WZXJ0ZXhUeXBlc1tjdF0tPmVuYWJsZUdMVmVydGV4QnVmZmVyKCZ2YSk7Ci0gICAgfQotICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnJlbmRlclJhbmdlIDIiKTsKLSAgICBpZiAobUluZGV4VHlwZS5nZXQoKSkgewotICAgICAgICBtSW5kZXhCdWZmZXItPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKLSAgICAgICAgZ2xEcmF3RWxlbWVudHMobUdMUHJpbWl0aXZlLCBsZW4sIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoc3RhcnQgKiAyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKG1HTFByaW1pdGl2ZSwgc3RhcnQsIGxlbik7Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSIpOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnVwbG9hZEFsbChDb250ZXh0ICpyc2MpCi17Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS5nZXQoKSkgewotICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobUluZGV4QnVmZmVyLmdldCgpKSB7Ci0gICAgICAgIG1JbmRleEJ1ZmZlci0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7Ci0gICAgfQotICAgIGlmIChtUHJpbWl0aXZlQnVmZmVyLmdldCgpKSB7Ci0gICAgICAgIG1QcmltaXRpdmVCdWZmZXItPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOwotICAgIH0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnVwbG9hZEFsbCIpOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnVwZGF0ZUdMUHJpbWl0aXZlKCkKLXsKLSAgICBzd2l0Y2gobVByaW1pdGl2ZSkgewotICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9QT0lOVDogICAgICAgICAgbUdMUHJpbWl0aXZlID0gR0xfUE9JTlRTOyBicmVhazsKLSAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORTogICAgICAgICAgIG1HTFByaW1pdGl2ZSA9IEdMX0xJTkVTOyBicmVhazsKLSAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORV9TVFJJUDogICAgIG1HTFByaW1pdGl2ZSA9IEdMX0xJTkVfU1RSSVA7IGJyZWFrOwotICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRTogICAgICAgbUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVTOyBicmVhazsKLSAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfU1RSSVA6IG1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX1NUUklQOyBicmVhazsKLSAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfRkFOOiAgIG1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX0ZBTjsgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIFNpbXBsZU1lc2g6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Ci17Ci0gICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKLSAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKLQotICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOwotICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKLQotICAgIC8vIEFkZCBwcmltaXRpdmUgdHlwZQotICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpbVByaW1pdGl2ZSk7Ci0KLSAgICAvLyBBbmQgbm93IHNlcmlhbGl6ZSB0aGUgYWxsb2NhdGlvbnMKLSAgICBtSW5kZXhCdWZmZXItPnNlcmlhbGl6ZShzdHJlYW0pOwotCi0gICAgLy8gV2UgbmVlZCB0byBpbmRpY2F0ZSBpZiB0aGUgcHJpbWl0aXZlIGJ1ZmZlciBpcyBwcmVzZW50Ci0gICAgaWYobVByaW1pdGl2ZUJ1ZmZlci5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFdyaXRlIGlmIHRoZSBwcmltaXRpdmUgYnVmZmVyIGlzIHByZXNlbnQKLSAgICAgICAgc3RyZWFtLT5hZGRVMzIoMSk7Ci0gICAgICAgIG1QcmltaXRpdmVCdWZmZXItPnNlcmlhbGl6ZShzdHJlYW0pOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gTm8gYnVmZmVyIHByZXNlbnQsIHdpbGwgbmVlZCB0aGlzIHdoZW4gd2UgcmVhZAotICAgICAgICBzdHJlYW0tPmFkZFUzMigwKTsKLSAgICB9Ci0KLSAgICAvLyBTdG9yZSBudW1iZXIgb2YgdmVydGV4IHN0cmVhbXMKLSAgICBzdHJlYW0tPmFkZFUzMihtVmVydGV4VHlwZUNvdW50KTsKLSAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbVZlcnRleFR5cGVDb3VudDsgdkNvdW50ICsrKSB7Ci0gICAgICAgIG1WZXJ0ZXhCdWZmZXJzW3ZDb3VudF0tPnNlcmlhbGl6ZShzdHJlYW0pOwotICAgIH0KLX0KLQotU2ltcGxlTWVzaCAqU2ltcGxlTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKLXsKLSAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0Ci0gICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOwotICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX1NJTVBMRV9NRVNIKSB7Ci0gICAgICAgIExPR0UoInNpbXBsZSBtZXNoIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBTaW1wbGVNZXNoICogbWVzaCA9IG5ldyBTaW1wbGVNZXNoKHJzYyk7Ci0KLSAgICBTdHJpbmc4IG5hbWU7Ci0gICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKLSAgICBtZXNoLT5zZXROYW1lKG5hbWUuc3RyaW5nKCksIG5hbWUuc2l6ZSgpKTsKLQotICAgIG1lc2gtPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpc3RyZWFtLT5sb2FkVTgoKTsKLSAgICBtZXNoLT51cGRhdGVHTFByaW1pdGl2ZSgpOwotCi0gICAgQWxsb2NhdGlvbiAqaW5kZXhBbGxvYyA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOwotICAgIGNvbnN0IFR5cGUgKmluZGV4VHlwZSA9IGluZGV4QWxsb2MtPmdldFR5cGUoKTsKLSAgICBtZXNoLT5tSW5kZXhCdWZmZXIuc2V0KGluZGV4QWxsb2MpOwotICAgIG1lc2gtPm1JbmRleFR5cGUuc2V0KGluZGV4VHlwZSk7Ci0KLSAgICBib29sIGlzUHJpbWl0aXZlUHJlc2VudCA9IHN0cmVhbS0+bG9hZFUzMigpICE9IDA7Ci0gICAgaWYoaXNQcmltaXRpdmVQcmVzZW50KSB7Ci0gICAgICAgIG1lc2gtPm1QcmltaXRpdmVCdWZmZXIuc2V0KEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pKTsKLSAgICAgICAgbWVzaC0+bVByaW1pdGl2ZVR5cGUuc2V0KG1lc2gtPm1QcmltaXRpdmVCdWZmZXItPmdldFR5cGUoKSk7Ci0gICAgfQotCi0gICAgbWVzaC0+bVZlcnRleFR5cGVDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOwotICAgIGlmKG1lc2gtPm1WZXJ0ZXhUeXBlQ291bnQpIHsKLSAgICAgICAgbWVzaC0+bVZlcnRleFR5cGVzID0gbmV3IE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT5bbWVzaC0+bVZlcnRleFR5cGVDb3VudF07Ci0gICAgICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bbWVzaC0+bVZlcnRleFR5cGVDb3VudF07Ci0KLSAgICAgICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1lc2gtPm1WZXJ0ZXhUeXBlQ291bnQ7IHZDb3VudCArKykgewotICAgICAgICAgICAgQWxsb2NhdGlvbiAqdmVydGV4QWxsb2MgPSBBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKLSAgICAgICAgICAgIGNvbnN0IFR5cGUgKnZlcnRleFR5cGUgPSB2ZXJ0ZXhBbGxvYy0+Z2V0VHlwZSgpOwotICAgICAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlcnNbdkNvdW50XS5zZXQodmVydGV4QWxsb2MpOwotICAgICAgICAgICAgbWVzaC0+bVZlcnRleFR5cGVzW3ZDb3VudF0uc2V0KHZlcnRleFR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbWVzaC0+dXBsb2FkQWxsKHJzYyk7Ci0KLSAgICByZXR1cm4gbWVzaDsKLX0KLQotCi1TaW1wbGVNZXNoQ29udGV4dDo6U2ltcGxlTWVzaENvbnRleHQoKQotewotfQotCi1TaW1wbGVNZXNoQ29udGV4dDo6flNpbXBsZU1lc2hDb250ZXh0KCkKLXsKLX0KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotCi1Sc1NpbXBsZU1lc2ggcnNpX1NpbXBsZU1lc2hDcmVhdGUoQ29udGV4dCAqcnNjLCBSc1R5cGUgcHJpbSwgUnNUeXBlIGlkeCwgUnNUeXBlICp2dHgsIHVpbnQzMl90IHZ0eENvdW50LCB1aW50MzJfdCBwcmltVHlwZSkKLXsKLSAgICBTaW1wbGVNZXNoICpzbSA9IG5ldyBTaW1wbGVNZXNoKHJzYyk7Ci0gICAgc20tPmluY1VzZXJSZWYoKTsKLQotICAgIHNtLT5tSW5kZXhUeXBlLnNldCgoY29uc3QgVHlwZSAqKWlkeCk7Ci0gICAgc20tPm1QcmltaXRpdmVUeXBlLnNldCgoY29uc3QgVHlwZSAqKXByaW0pOwotCi0gICAgc20tPm1WZXJ0ZXhUeXBlQ291bnQgPSB2dHhDb3VudDsKLSAgICBzbS0+bVZlcnRleFR5cGVzID0gbmV3IE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT5bdnR4Q291bnRdOwotICAgIHNtLT5tVmVydGV4QnVmZmVycyA9IG5ldyBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+W3Z0eENvdW50XTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgdnR4Q291bnQ7IGN0KyspIHsKLSAgICAgICAgc20tPm1WZXJ0ZXhUeXBlc1tjdF0uc2V0KChjb25zdCBUeXBlICopdnR4W2N0XSk7Ci0gICAgfQotCi0gICAgc20tPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpcHJpbVR5cGU7Ci0gICAgc20tPnVwZGF0ZUdMUHJpbWl0aXZlKCk7Ci0gICAgcmV0dXJuIHNtOwotfQotCi12b2lkIHJzaV9TaW1wbGVNZXNoQmluZFZlcnRleChDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBzbG90KQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgcnNBc3NlcnQoc2xvdCA8IHNtLT5tVmVydGV4VHlwZUNvdW50KTsKLQotICAgIHNtLT5tVmVydGV4QnVmZmVyc1tzbG90XS5zZXQoKEFsbG9jYXRpb24gKil2YSk7Ci19Ci0KLXZvaWQgcnNpX1NpbXBsZU1lc2hCaW5kSW5kZXgoQ29udGV4dCAqcnNjLCBSc1NpbXBsZU1lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSkKLXsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obXYpOwotICAgIHNtLT5tSW5kZXhCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOwotfQotCi12b2lkIHJzaV9TaW1wbGVNZXNoQmluZFByaW1pdGl2ZShDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhKQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgc20tPm1QcmltaXRpdmVCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOwotfQotCi0KLQotCi19fQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5oIGIvbGlicy9ycy9yc1NpbXBsZU1lc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyYzdmYi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9SU19TSU1QTEVfTUVTSF9ICi0jZGVmaW5lIEFORFJPSURfUlNfU0lNUExFX01FU0hfSAotCi0KLSNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotCi0vLyBBbiBlbGVtZW50IGlzIGEgZ3JvdXAgb2YgQ29tcG9uZW50cyB0aGF0IG9jY3VwaWVzIG9uZSBjZWxsIGluIGEgc3RydWN0dXJlLgotY2xhc3MgU2ltcGxlTWVzaCA6IHB1YmxpYyBPYmplY3RCYXNlCi17Ci1wdWJsaWM6Ci0gICAgU2ltcGxlTWVzaChDb250ZXh0ICopOwotICAgIH5TaW1wbGVNZXNoKCk7Ci0KLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1JbmRleFR5cGU7Ci0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtUHJpbWl0aXZlVHlwZTsKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+ICptVmVydGV4VHlwZXM7Ci0gICAgdWludDMyX3QgbVZlcnRleFR5cGVDb3VudDsKLQotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUluZGV4QnVmZmVyOwotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVByaW1pdGl2ZUJ1ZmZlcjsKLSAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+ICptVmVydGV4QnVmZmVyczsKLQotICAgIFJzUHJpbWl0aXZlIG1QcmltaXRpdmU7Ci0gICAgdWludDMyX3QgbUdMUHJpbWl0aXZlOwotCi0KLSAgICB2b2lkIHJlbmRlcihDb250ZXh0ICopIGNvbnN0OwotICAgIHZvaWQgcmVuZGVyUmFuZ2UoQ29udGV4dCAqLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdDsKLSAgICB2b2lkIHVwbG9hZEFsbChDb250ZXh0ICopOwotICAgIHZvaWQgdXBkYXRlR0xQcmltaXRpdmUoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKLSAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1NJTVBMRV9NRVNIOyB9Ci0gICAgc3RhdGljIFNpbXBsZU1lc2ggKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwotCi1wcm90ZWN0ZWQ6Ci19OwotCi1jbGFzcyBTaW1wbGVNZXNoQ29udGV4dAotewotcHVibGljOgotICAgIFNpbXBsZU1lc2hDb250ZXh0KCk7Ci0gICAgflNpbXBsZU1lc2hDb250ZXh0KCk7Ci0KLQotfTsKLQotCi19Ci19Ci0jZW5kaWYgLy9BTkRST0lEX1JTX1NJTVBMRV9NRVNIX0gKLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAKaW5kZXggNjkzN2E4NS4uMDAxOTI3YyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcAorKysgYi9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwCkBAIC0xNDQsMTAgKzE0NCw4IEBACiAgICAgICAgICAgICAgICAgc2xvdCA9IDE7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJub3JtYWwiKSB7CiAgICAgICAgICAgICAgICAgc2xvdCA9IDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJwb2ludFNpemUiKSB7Ci0gICAgICAgICAgICAgICAgc2xvdCA9IDM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJ0ZXh0dXJlMCIpIHsKLSAgICAgICAgICAgICAgICBzbG90ID0gNDsKKyAgICAgICAgICAgICAgICBzbG90ID0gMzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaAppbmRleCBmYmEzZDZkLi40ZGMzNTFkIDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2gKQEAgLTI5LDggKzI5LDEwIEBACiBleHRlcm4gdm9pZCByc2dEcmF3UXVhZFRleENvb3JkcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOwogLy9leHRlcm4gdm9pZCByc2dEcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwogZXh0ZXJuIHZvaWQgcnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwotZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNnRHJhd1NpbXBsZU1lc2gocnNfbWVzaCBpc20pOwotZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNnRHJhd1NpbXBsZU1lc2gocnNfbWVzaCBpc20sIGludCBzdGFydCwgaW50IGxlbik7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzZ0RyYXdNZXNoKHJzX21lc2ggaXNtKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzZ0RyYXdNZXNoKHJzX21lc2ggaXNtLCBpbnQgcHJpbWl0aXZlSW5kZXgpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNnRHJhd01lc2gocnNfbWVzaCBpc20sIGludCBwcmltaXRpdmVJbmRleCwgaW50IHN0YXJ0LCBpbnQgbGVuKTsKIAogZXh0ZXJuIHZvaWQgcnNnQ2xlYXJDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiBleHRlcm4gdm9pZCByc2dDbGVhckRlcHRoKGZsb2F0KTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaAppbmRleCA4YmY1M2JmLi40MzkwYTVkIDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCkBAIC0xLDMgKzEsNiBAQAorI2lmbmRlZiBfX1JTX01BVEhfUlNIX18KKyNkZWZpbmUgX19SU19NQVRIX1JTSF9fCisKICNpbmNsdWRlICJyc19jbC5yc2giCiAjaW5jbHVkZSAicnNfY29yZS5yc2giCiAKQEAgLTQ1LDYgKzQ4LDIzIEBACiBleHRlcm4gaW50IHJzU2VuZFRvQ2xpZW50KHZvaWQgKmRhdGEsIGludCBjbWRJRCwgaW50IGxlbiwgaW50IHdhaXRGb3JTcGFjZSk7CiAKIC8vIFNjcmlwdCB0byBTY3JpcHQKK3R5cGVkZWYgc3RydWN0IHJzX3NjcmlwdF9jYWxsX3JlYyB7CisgICAgcnNfc2NyaXB0IHNjcmlwdDsKKyAgICByc19hbGxvY2F0aW9uIGlucHV0OworICAgIHJzX2FsbG9jYXRpb24gb3V0cHV0OworCisgICAgdWludDMyX3QgeFN0YXJ0OworICAgIHVpbnQzMl90IHhFbmQ7CisgICAgdWludDMyX3QgeVN0YXJ0OworICAgIHVpbnQzMl90IHlFbmQ7CisgICAgdWludDMyX3QgelN0YXJ0OworICAgIHVpbnQzMl90IHpFbmQ7CisgICAgdWludDMyX3QgYXJyYXlTdGFydDsKKyAgICB1aW50MzJfdCBhcnJheUVuZDsKKworICAgIGNvbnN0IHZvaWQgKiB1c3JEYXRhOworfSByc19zY3JpcHRfY2FsbDsKKwogZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSlyc0ZvckVhY2gocnNfc2NyaXB0LCByc19hbGxvY2F0aW9uIGlucHV0KTsKIGV4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNGb3JFYWNoKHJzX3NjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwgcnNfYWxsb2NhdGlvbiBvdXRwdXQpOwogZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSlyc0ZvckVhY2gocnNfc2NyaXB0LCByc19hbGxvY2F0aW9uIGlucHV0LCBpbnQgeFN0YXJ0LCBpbnQgeEVuZCk7CkBAIC01Miw0ICs3Miw0IEBACiBleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKXJzRm9yRWFjaChyc19zY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsIGludCB4U3RhcnQsIGludCB5U3RhcnQsIGludCB4RW5kLCBpbnQgeUVuZCk7CiBleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKXJzRm9yRWFjaChyc19zY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBpbnQgeFN0YXJ0LCBpbnQgeVN0YXJ0LCBpbnQgeEVuZCwgaW50IHlFbmQpOwogCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9UZXh0dXJlTWFuYWdlci5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyL1RleHR1cmVNYW5hZ2VyLmNwcAppbmRleCBmYTE5MjU2Li42NTI2MDMyIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL1RleHR1cmVNYW5hZ2VyLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL1RleHR1cmVNYW5hZ2VyLmNwcApAQCAtODcsNyArODcsNyBAQAogICAgIEdMZW51bSB0YXJnZXQgPSBHTF9URVhUVVJFXzJEOwogI2lmIGRlZmluZWQoR0xfT0VTX3RleHR1cmVfZXh0ZXJuYWwpCiAgICAgaWYgKEdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKS5oYXZlVGV4dHVyZUV4dGVybmFsKCkpIHsKLSAgICAgICAgaWYgKGZvcm1hdCAmJiBpc1N1cHBvcnRlZFl1dkZvcm1hdChmb3JtYXQpKSB7CisgICAgICAgIGlmIChmb3JtYXQgJiYgaXNZdXZGb3JtYXQoZm9ybWF0KSkgewogICAgICAgICAgICAgdGFyZ2V0ID0gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVM7CiAgICAgICAgICAgICBwSW1hZ2UtPnRhcmdldCA9IFRleHR1cmU6OlRFWFRVUkVfRVhURVJOQUw7CiAgICAgICAgIH0KQEAgLTEwNSwyMyArMTA1LDMyIEBACiAKIGJvb2wgVGV4dHVyZU1hbmFnZXI6OmlzU3VwcG9ydGVkWXV2Rm9ybWF0KGludCBmb3JtYXQpCiB7Ci0gICAgcmV0dXJuIGlzWXV2Rm9ybWF0KGZvcm1hdCk7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxNjoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogYm9vbCBUZXh0dXJlTWFuYWdlcjo6aXNZdXZGb3JtYXQoaW50IGZvcm1hdCkKIHsKICAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9OVjE2OgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9OVjIxOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JWVVWOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVVY5OgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVVkyOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9VWVZZOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9OVjEyOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9OVjYxOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9OVjEyX0FEUkVOT19USUxFRDoKKyAgICAvLyBzdXBwb3J0ZWQgWVVWIGZvcm1hdHMKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxNjoKKyAgICAvLyBMZWdhY3kvZGVwcmVjYXRlZCBZVVYgZm9ybWF0cworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX0k6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9TUF9USUxFRDoKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorCisgICAgLy8gQW55IE9FTSBmb3JtYXQgbmVlZHMgdG8gYmUgY29uc2lkZXJlZAorICAgIGlmIChmb3JtYXQ+PTB4MTAwICYmIGZvcm1hdDw9MHgxRkYpCisgICAgICAgIHJldHVybiB0cnVlOworCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC0yNTUsNyArMjY0LDcgQEAKICAgICAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLAogICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCB0ZXh0dXJlLT5wb3RXaWR0aCwgdGV4dHVyZS0+cG90SGVpZ2h0LCAwLAogICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmIChpc1l1dkZvcm1hdCh0LmZvcm1hdCkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChpc1N1cHBvcnRlZFl1dkZvcm1hdCh0LmZvcm1hdCkpIHsKICAgICAgICAgICAgIC8vIGp1c3Qgc2hvdyB0aGUgWSBwbGFuZSBvZiBZVVYgYnVmZmVycwogICAgICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsCiAgICAgICAgICAgICAgICAgICAgIEdMX0xVTUlOQU5DRSwgdGV4dHVyZS0+cG90V2lkdGgsIHRleHR1cmUtPnBvdEhlaWdodCwgMCwKQEAgLTI4Myw3ICsyOTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAwLCBib3VuZHMudG9wLCB0LndpZHRoLCBib3VuZHMuaGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsCiAgICAgICAgICAgICAgICAgICAgIHQuZGF0YSArIGJvdW5kcy50b3AqdC5zdHJpZGUqNCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNZdXZGb3JtYXQodC5mb3JtYXQpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoaXNTdXBwb3J0ZWRZdXZGb3JtYXQodC5mb3JtYXQpKSB7CiAgICAgICAgICAgICAvLyBqdXN0IHNob3cgdGhlIFkgcGxhbmUgb2YgWVVWIGJ1ZmZlcnMKICAgICAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLAogICAgICAgICAgICAgICAgICAgICAwLCBib3VuZHMudG9wLCB0LndpZHRoLCBib3VuZHMuaGVpZ2h0KCksCmRpZmYgLS1naXQgYS9saWJzL3VpL0FuZHJvaWQubWsgYi9saWJzL3VpL0FuZHJvaWQubWsKaW5kZXggMjRjZGM3OC4uNDI0M2JiZiAxMDA2NDQKLS0tIGEvbGlicy91aS9BbmRyb2lkLm1rCisrKyBiL2xpYnMvdWkvQW5kcm9pZC5tawpAQCAtMTIsNiArMTIsNyBAQAogCUtleUxheW91dE1hcC5jcHAgXAogCUtleUNoYXJhY3Rlck1hcC5jcHAgXAogCUlucHV0LmNwcCBcCisJSW5wdXREZXZpY2UuY3BwIFwKIAlJbnB1dERpc3BhdGNoZXIuY3BwIFwKIAlJbnB1dE1hbmFnZXIuY3BwIFwKIAlJbnB1dFJlYWRlci5jcHAgXApAQCAtMzgsMyArMzksMTMgQEAKIGVuZGlmCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworCisjIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBJZiB3ZSdyZSBidWlsZGluZyB3aXRoIE9ORV9TSE9UX01BS0VGSUxFIChtbSwgbW1tKSwgdGhlbiB3aGF0IHRoZSBmcmFtZXdvcmsKKyMgdGVhbSByZWFsbHkgd2FudHMgaXMgdG8gYnVpbGQgdGhlIHN0dWZmIGRlZmluZWQgYnkgdGhpcyBtYWtlZmlsZS4KK2lmZXEgKCwkKE9ORV9TSE9UX01BS0VGSUxFKSkKK2luY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvdWkvRXZlbnRIdWIuY3BwIGIvbGlicy91aS9FdmVudEh1Yi5jcHAKaW5kZXggMjc4OTVmMi4uNzY4YjA0ZSAxMDA2NDQKLS0tIGEvbGlicy91aS9FdmVudEh1Yi5jcHAKKysrIGIvbGlicy91aS9FdmVudEh1Yi5jcHAKQEAgLTU0LDYgKzU0LDkgQEAKICAqLwogI2RlZmluZSB0ZXN0X2JpdChiaXQsIGFycmF5KSAgICAoYXJyYXlbYml0LzhdICYgKDE8PChiaXQlOCkpKQogCisvKiB0aGlzIG1hY3JvIGNvbXB1dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHJlcHJlc2VudCBhIGJpdCBhcnJheSBvZiB0aGUgc3BlY2lmaWVkIHNpemUgKi8KKyNkZWZpbmUgc2l6ZW9mX2JpdF9hcnJheShiaXRzKSAgKChiaXRzICsgNykgLyA4KQorCiAjZGVmaW5lIElEX01BU0sgIDB4MDAwMGZmZmYKICNkZWZpbmUgU0VRX01BU0sgMHg3ZmZmMDAwMAogI2RlZmluZSBTRVFfU0hJRlQgMTYKQEAgLTE4Miw3ICsxODUsNyBAQAogfQogCiBpbnQzMl90IEV2ZW50SHViOjpnZXRTY2FuQ29kZVN0YXRlTG9ja2VkKGRldmljZV90KiBkZXZpY2UsIGludDMyX3Qgc2NhbkNvZGUpIGNvbnN0IHsKLSAgICB1aW50OF90IGtleV9iaXRtYXNrWyhLRVlfTUFYICsgNykgLyA4XTsKKyAgICB1aW50OF90IGtleV9iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoS0VZX01BWCArIDEpXTsKICAgICBtZW1zZXQoa2V5X2JpdG1hc2ssIDAsIHNpemVvZihrZXlfYml0bWFzaykpOwogICAgIGlmIChpb2N0bChtRkRzW2lkX3RvX2luZGV4KGRldmljZS0+aWQpXS5mZCwKICAgICAgICAgICAgICAgIEVWSU9DR0tFWShzaXplb2Yoa2V5X2JpdG1hc2spKSwga2V5X2JpdG1hc2spID49IDApIHsKQEAgLTIxOCw3ICsyMjEsNyBAQAogICAgIFZlY3RvcjxpbnQzMl90PiBzY2FuQ29kZXM7CiAgICAgZGV2aWNlLT5sYXlvdXRNYXAtPmZpbmRTY2FuY29kZXMoa2V5Q29kZSwgJnNjYW5Db2Rlcyk7CiAKLSAgICB1aW50OF90IGtleV9iaXRtYXNrWyhLRVlfTUFYICsgNykgLyA4XTsKKyAgICB1aW50OF90IGtleV9iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoS0VZX01BWCArIDEpXTsKICAgICBtZW1zZXQoa2V5X2JpdG1hc2ssIDAsIHNpemVvZihrZXlfYml0bWFzaykpOwogICAgIGlmIChpb2N0bChtRkRzW2lkX3RvX2luZGV4KGRldmljZS0+aWQpXS5mZCwKICAgICAgICAgICAgICAgIEVWSU9DR0tFWShzaXplb2Yoa2V5X2JpdG1hc2spKSwga2V5X2JpdG1hc2spID49IDApIHsKQEAgLTI2NCw3ICsyNjcsNyBAQAogfQogCiBpbnQzMl90IEV2ZW50SHViOjpnZXRTd2l0Y2hTdGF0ZUxvY2tlZChkZXZpY2VfdCogZGV2aWNlLCBpbnQzMl90IHN3KSBjb25zdCB7Ci0gICAgdWludDhfdCBzd19iaXRtYXNrWyhTV19NQVggKyA3KSAvIDhdOworICAgIHVpbnQ4X3Qgc3dfYml0bWFza1tzaXplb2ZfYml0X2FycmF5KFNXX01BWCArIDEpXTsKICAgICBtZW1zZXQoc3dfYml0bWFzaywgMCwgc2l6ZW9mKHN3X2JpdG1hc2spKTsKICAgICBpZiAoaW9jdGwobUZEc1tpZF90b19pbmRleChkZXZpY2UtPmlkKV0uZmQsCiAgICAgICAgICAgICAgICBFVklPQ0dTVyhzaXplb2Yoc3dfYml0bWFzaykpLCBzd19iaXRtYXNrKSA+PSAwKSB7CkBAIC00MDksNyArNDEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJpZXYuY29kZT0lZCBvdXRLZXljb2RlPSVkIG91dEZsYWdzPTB4JTA4eCBlcnI9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlldi5jb2RlLCAqb3V0S2V5Y29kZSwgKm91dEZsYWdzLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0S2V5Y29kZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRLZXljb2RlID0gQUtFWUNPREVfVU5LTk9XTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dEZsYWdzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTA5LDYgKzUxMiwyNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBib29sIGNvbnRhaW5zTm9uWmVyb0J5dGUoY29uc3QgdWludDhfdCogYXJyYXksIHVpbnQzMl90IHN0YXJ0SW5kZXgsIHVpbnQzMl90IGVuZEluZGV4KSB7CisgICAgY29uc3QgdWludDhfdCogZW5kID0gYXJyYXkgKyBlbmRJbmRleDsKKyAgICBhcnJheSArPSBzdGFydEluZGV4OworICAgIHdoaWxlIChhcnJheSAhPSBlbmQpIHsKKyAgICAgICAgaWYgKCooYXJyYXkrKykgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgY29uc3QgaW50MzJfdCBHQU1FUEFEX0tFWUNPREVTW10gPSB7CisgICAgICAgIEFLRVlDT0RFX0JVVFRPTl9BLCBBS0VZQ09ERV9CVVRUT05fQiwgQUtFWUNPREVfQlVUVE9OX0MsCisgICAgICAgIEFLRVlDT0RFX0JVVFRPTl9YLCBBS0VZQ09ERV9CVVRUT05fWSwgQUtFWUNPREVfQlVUVE9OX1osCisgICAgICAgIEFLRVlDT0RFX0JVVFRPTl9MMSwgQUtFWUNPREVfQlVUVE9OX1IxLAorICAgICAgICBBS0VZQ09ERV9CVVRUT05fTDIsIEFLRVlDT0RFX0JVVFRPTl9SMiwKKyAgICAgICAgQUtFWUNPREVfQlVUVE9OX1RIVU1CTCwgQUtFWUNPREVfQlVUVE9OX1RIVU1CUiwKKyAgICAgICAgQUtFWUNPREVfQlVUVE9OX1NUQVJULCBBS0VZQ09ERV9CVVRUT05fU0VMRUNULCBBS0VZQ09ERV9CVVRUT05fTU9ERQorfTsKKwogaW50IEV2ZW50SHViOjpvcGVuX2RldmljZShjb25zdCBjaGFyICpkZXZpY2VOYW1lKQogewogICAgIGludCB2ZXJzaW9uOwpAQCAtNjI2LDI3ICs2NDksMjcgQEAKICAgICBtRkRzW21GRENvdW50XS5mZCA9IGZkOwogICAgIG1GRHNbbUZEQ291bnRdLmV2ZW50cyA9IFBPTExJTjsKIAotICAgIC8vIGZpZ3VyZSBvdXQgdGhlIGtpbmRzIG9mIGV2ZW50cyB0aGUgZGV2aWNlIHJlcG9ydHMKKyAgICAvLyBGaWd1cmUgb3V0IHRoZSBraW5kcyBvZiBldmVudHMgdGhlIGRldmljZSByZXBvcnRzLgogICAgIAotICAgIC8vIFNlZSBpZiB0aGlzIGlzIGEga2V5Ym9hcmQsIGFuZCBjbGFzc2lmeSBpdC4gIE5vdGUgdGhhdCB3ZSBvbmx5Ci0gICAgLy8gY29uc2lkZXIgdXAgdGhyb3VnaCB0aGUgZnVuY3Rpb24ga2V5czsgd2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlCi0gICAgLy8gb25lcyBhZnRlciB0aGF0IChwbGF5IGNkIGV0Yykgc28gd2UgZG9uJ3QgbWlzdGFrZW5seSBjb25zaWRlciBhCi0gICAgLy8gY29udHJvbGxlciB0byBiZSBhIGtleWJvYXJkLgotICAgIHVpbnQ4X3Qga2V5X2JpdG1hc2tbKEtFWV9NQVgrNykvOF07CisgICAgdWludDhfdCBrZXlfYml0bWFza1tzaXplb2ZfYml0X2FycmF5KEtFWV9NQVggKyAxKV07CiAgICAgbWVtc2V0KGtleV9iaXRtYXNrLCAwLCBzaXplb2Yoa2V5X2JpdG1hc2spKTsKKwogICAgIExPR1YoIkdldHRpbmcga2V5cy4uLiIpOwogICAgIGlmIChpb2N0bChmZCwgRVZJT0NHQklUKEVWX0tFWSwgc2l6ZW9mKGtleV9iaXRtYXNrKSksIGtleV9iaXRtYXNrKSA+PSAwKSB7CiAgICAgICAgIC8vTE9HSSgiTUFQXG4iKTsKLSAgICAgICAgLy9mb3IgKGludCBpPTA7IGk8KChLRVlfTUFYKzcpLzgpOyBpKyspIHsKKyAgICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihrZXlfYml0bWFzayk7IGkrKykgewogICAgICAgICAvLyAgICBMT0dJKCIlZDogMHglMDJ4XG4iLCBpLCBrZXlfYml0bWFza1tpXSk7CiAgICAgICAgIC8vfQotICAgICAgICBmb3IgKGludCBpPTA7IGk8KChCVE5fTUlTQys3KS84KTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoa2V5X2JpdG1hc2tbaV0gIT0gMCkgewotICAgICAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfS0VZQk9BUkQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkZXZpY2UtPmNsYXNzZXMgJiBJTlBVVF9ERVZJQ0VfQ0xBU1NfS0VZQk9BUkQpICE9IDApIHsKKworICAgICAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIGtleWJvYXJkLiAgSWdub3JlIGV2ZXJ5dGhpbmcgaW4gdGhlIGJ1dHRvbiByYW5nZSBleGNlcHQgZm9yCisgICAgICAgIC8vIGdhbWVwYWRzIHdoaWNoIGFyZSBhbHNvIGNvbnNpZGVyZWQga2V5Ym9hcmRzLgorICAgICAgICBpZiAoY29udGFpbnNOb25aZXJvQnl0ZShrZXlfYml0bWFzaywgMCwgc2l6ZW9mX2JpdF9hcnJheShCVE5fTUlTQykpCisgICAgICAgICAgICAgICAgfHwgY29udGFpbnNOb25aZXJvQnl0ZShrZXlfYml0bWFzaywgc2l6ZW9mX2JpdF9hcnJheShCVE5fR0FNRVBBRCksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2ZfYml0X2FycmF5KEJUTl9ESUdJKSkKKyAgICAgICAgICAgICAgICB8fCBjb250YWluc05vblplcm9CeXRlKGtleV9iaXRtYXNrLCBzaXplb2ZfYml0X2FycmF5KEtFWV9PSyksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2ZfYml0X2FycmF5KEtFWV9NQVggKyAxKSkpIHsKKyAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfS0VZQk9BUkQ7CisKICAgICAgICAgICAgIGRldmljZS0+a2V5Qml0bWFzayA9IG5ldyB1aW50OF90W3NpemVvZihrZXlfYml0bWFzayldOwogICAgICAgICAgICAgaWYgKGRldmljZS0+a2V5Qml0bWFzayAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbWVtY3B5KGRldmljZS0+a2V5Qml0bWFzaywga2V5X2JpdG1hc2ssIHNpemVvZihrZXlfYml0bWFzaykpOwpAQCAtNjU4LDM5ICs2ODEsMzkgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKLSAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIHRyYWNrYmFsbC4KKyAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIHRyYWNrYmFsbCAob3IgbW91c2UpLgogICAgIGlmICh0ZXN0X2JpdChCVE5fTU9VU0UsIGtleV9iaXRtYXNrKSkgewotICAgICAgICB1aW50OF90IHJlbF9iaXRtYXNrWyhSRUxfTUFYKzcpLzhdOworICAgICAgICB1aW50OF90IHJlbF9iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoUkVMX01BWCArIDEpXTsKICAgICAgICAgbWVtc2V0KHJlbF9iaXRtYXNrLCAwLCBzaXplb2YocmVsX2JpdG1hc2spKTsKICAgICAgICAgTE9HVigiR2V0dGluZyByZWxhdGl2ZSBjb250cm9sbGVycy4uLiIpOwotICAgICAgICBpZiAoaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9SRUwsIHNpemVvZihyZWxfYml0bWFzaykpLCByZWxfYml0bWFzaykgPj0gMCkKLSAgICAgICAgeworICAgICAgICBpZiAoaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9SRUwsIHNpemVvZihyZWxfYml0bWFzaykpLCByZWxfYml0bWFzaykgPj0gMCkgewogICAgICAgICAgICAgaWYgKHRlc3RfYml0KFJFTF9YLCByZWxfYml0bWFzaykgJiYgdGVzdF9iaXQoUkVMX1ksIHJlbF9iaXRtYXNrKSkgewogICAgICAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfVFJBQ0tCQUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIHVpbnQ4X3QgYWJzX2JpdG1hc2tbKEFCU19NQVgrNykvOF07CisKKyAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIHRvdWNoIHBhZC4KKyAgICB1aW50OF90IGFic19iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoQUJTX01BWCArIDEpXTsKICAgICBtZW1zZXQoYWJzX2JpdG1hc2ssIDAsIHNpemVvZihhYnNfYml0bWFzaykpOwogICAgIExPR1YoIkdldHRpbmcgYWJzb2x1dGUgY29udHJvbGxlcnMuLi4iKTsKLSAgICBpb2N0bChmZCwgRVZJT0NHQklUKEVWX0FCUywgc2l6ZW9mKGFic19iaXRtYXNrKSksIGFic19iaXRtYXNrKTsKLSAgICAKLSAgICAvLyBJcyB0aGlzIGEgbmV3IG1vZGVybiBtdWx0aS10b3VjaCBkcml2ZXI/Ci0gICAgaWYgKHRlc3RfYml0KEFCU19NVF9UT1VDSF9NQUpPUiwgYWJzX2JpdG1hc2spCi0gICAgICAgICAgICAmJiB0ZXN0X2JpdChBQlNfTVRfUE9TSVRJT05fWCwgYWJzX2JpdG1hc2spCi0gICAgICAgICAgICAmJiB0ZXN0X2JpdChBQlNfTVRfUE9TSVRJT05fWSwgYWJzX2JpdG1hc2spKSB7Ci0gICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU4gfCBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU5fTVQ7Ci0gICAgICAgIAotICAgIC8vIElzIHRoaXMgYW4gb2xkIHN0eWxlIHNpbmdsZS10b3VjaCBkcml2ZXI/Ci0gICAgfSBlbHNlIGlmICh0ZXN0X2JpdChCVE5fVE9VQ0gsIGtleV9iaXRtYXNrKQotICAgICAgICAgICAgJiYgdGVzdF9iaXQoQUJTX1gsIGFic19iaXRtYXNrKSAmJiB0ZXN0X2JpdChBQlNfWSwgYWJzX2JpdG1hc2spKSB7Ci0gICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU47CisgICAgaWYgKGlvY3RsKGZkLCBFVklPQ0dCSVQoRVZfQUJTLCBzaXplb2YoYWJzX2JpdG1hc2spKSwgYWJzX2JpdG1hc2spID49IDApIHsKKyAgICAgICAgLy8gSXMgdGhpcyBhIG5ldyBtb2Rlcm4gbXVsdGktdG91Y2ggZHJpdmVyPworICAgICAgICBpZiAodGVzdF9iaXQoQUJTX01UX1RPVUNIX01BSk9SLCBhYnNfYml0bWFzaykKKyAgICAgICAgICAgICAgICAmJiB0ZXN0X2JpdChBQlNfTVRfUE9TSVRJT05fWCwgYWJzX2JpdG1hc2spCisgICAgICAgICAgICAgICAgJiYgdGVzdF9iaXQoQUJTX01UX1BPU0lUSU9OX1ksIGFic19iaXRtYXNrKSkgeworICAgICAgICAgICAgZGV2aWNlLT5jbGFzc2VzIHw9IElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTiB8IElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTl9NVDsKKworICAgICAgICAvLyBJcyB0aGlzIGFuIG9sZCBzdHlsZSBzaW5nbGUtdG91Y2ggZHJpdmVyPworICAgICAgICB9IGVsc2UgaWYgKHRlc3RfYml0KEJUTl9UT1VDSCwga2V5X2JpdG1hc2spCisgICAgICAgICAgICAgICAgJiYgdGVzdF9iaXQoQUJTX1gsIGFic19iaXRtYXNrKSAmJiB0ZXN0X2JpdChBQlNfWSwgYWJzX2JpdG1hc2spKSB7CisgICAgICAgICAgICBkZXZpY2UtPmNsYXNzZXMgfD0gSU5QVVRfREVWSUNFX0NMQVNTX1RPVUNIU0NSRUVOOworICAgICAgICB9CiAgICAgfQogCiAjaWZkZWYgRVZfU1cKICAgICAvLyBmaWd1cmUgb3V0IHRoZSBzd2l0Y2hlcyB0aGlzIGRldmljZSByZXBvcnRzCi0gICAgdWludDhfdCBzd19iaXRtYXNrWyhTV19NQVgrNykvOF07CisgICAgdWludDhfdCBzd19iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoU1dfTUFYICsgMSldOwogICAgIG1lbXNldChzd19iaXRtYXNrLCAwLCBzaXplb2Yoc3dfYml0bWFzaykpOwogICAgIGlmIChpb2N0bChmZCwgRVZJT0NHQklUKEVWX1NXLCBzaXplb2Yoc3dfYml0bWFzaykpLCBzd19iaXRtYXNrKSA+PSAwKSB7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxFVl9TVzsgaSsrKSB7CkBAIC03MjYsNyArNzQ5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAiJXMvdXNyL2tleWxheW91dC8lcyIsIHJvb3QsICJxd2VydHkua2wiKTsKICAgICAgICAgICAgIGRlZmF1bHRLZXltYXAgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGRldmljZS0+bGF5b3V0TWFwLT5sb2FkKGtleWxheW91dEZpbGVuYW1lKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlLT5sYXlvdXRNYXAtPmxvYWQoa2V5bGF5b3V0RmlsZW5hbWUpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciAlZCBsb2FkaW5nIGtleSBsYXlvdXQuIiwgc3RhdHVzKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHRlbGwgdGhlIHdvcmxkIGFib3V0IHRoZSBkZXZuYW1lICh0aGUgZGVzY3JpcHRpdmUgbmFtZSkKICAgICAgICAgaWYgKCFtSGF2ZUZpcnN0S2V5Ym9hcmQgJiYgIWRlZmF1bHRLZXltYXAgJiYgc3Ryc3RyKG5hbWUsICIta2V5cGFkIikpIHsKQEAgLTc0NiwxOSArNzcyLDI3IEBACiAgICAgICAgIHByb3BlcnR5X3NldChwcm9wTmFtZSwgbmFtZSk7CiAKICAgICAgICAgLy8gJ1EnIGtleSBzdXBwb3J0ID0gY2hlYXAgdGVzdCBvZiB3aGV0aGVyIHRoaXMgaXMgYW4gYWxwaGEtY2FwYWJsZSBrYmQKLSAgICAgICAgaWYgKGhhc0tleWNvZGUoZGV2aWNlLCBrS2V5Q29kZVEpKSB7CisgICAgICAgIGlmIChoYXNLZXljb2RlKGRldmljZSwgQUtFWUNPREVfUSkpIHsKICAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfQUxQSEFLRVk7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIC8vIFNlZSBpZiB0aGlzIGhhcyBhIERQQUQuCi0gICAgICAgIGlmIChoYXNLZXljb2RlKGRldmljZSwga0tleUNvZGVEcGFkVXApICYmCi0gICAgICAgICAgICAgICAgaGFzS2V5Y29kZShkZXZpY2UsIGtLZXlDb2RlRHBhZERvd24pICYmCi0gICAgICAgICAgICAgICAgaGFzS2V5Y29kZShkZXZpY2UsIGtLZXlDb2RlRHBhZExlZnQpICYmCi0gICAgICAgICAgICAgICAgaGFzS2V5Y29kZShkZXZpY2UsIGtLZXlDb2RlRHBhZFJpZ2h0KSAmJgotICAgICAgICAgICAgICAgIGhhc0tleWNvZGUoZGV2aWNlLCBrS2V5Q29kZURwYWRDZW50ZXIpKSB7CisgICAgICAgIC8vIFNlZSBpZiB0aGlzIGRldmljZSBoYXMgYSBEUEFELgorICAgICAgICBpZiAoaGFzS2V5Y29kZShkZXZpY2UsIEFLRVlDT0RFX0RQQURfVVApICYmCisgICAgICAgICAgICAgICAgaGFzS2V5Y29kZShkZXZpY2UsIEFLRVlDT0RFX0RQQURfRE9XTikgJiYKKyAgICAgICAgICAgICAgICBoYXNLZXljb2RlKGRldmljZSwgQUtFWUNPREVfRFBBRF9MRUZUKSAmJgorICAgICAgICAgICAgICAgIGhhc0tleWNvZGUoZGV2aWNlLCBBS0VZQ09ERV9EUEFEX1JJR0hUKSAmJgorICAgICAgICAgICAgICAgIGhhc0tleWNvZGUoZGV2aWNlLCBBS0VZQ09ERV9EUEFEX0NFTlRFUikpIHsKICAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfRFBBRDsKICAgICAgICAgfQogICAgICAgICAKKyAgICAgICAgLy8gU2VlIGlmIHRoaXMgZGV2aWNlIGhhcyBhIGdhbWVwYWQuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKEdBTUVQQURfS0VZQ09ERVMpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChoYXNLZXljb2RlKGRldmljZSwgR0FNRVBBRF9LRVlDT0RFU1tpXSkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UtPmNsYXNzZXMgfD0gSU5QVVRfREVWSUNFX0NMQVNTX0dBTUVQQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBMT0dJKCJOZXcga2V5Ym9hcmQ6IGRldmljZS0+aWQ9MHgleCBkZXZuYW1lPSclcycgcHJvcE5hbWU9JyVzJyBrZXlsYXlvdXQ9JyVzJ1xuIiwKICAgICAgICAgICAgICAgICBkZXZpY2UtPmlkLCBuYW1lLCBwcm9wTmFtZSwga2V5bGF5b3V0RmlsZW5hbWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYnMvdWkvSW5wdXQuY3BwIGIvbGlicy91aS9JbnB1dC5jcHAKaW5kZXggYTY0MjUxZi4uMWYxOWMyYyAxMDA2NDQKLS0tIGEvbGlicy91aS9JbnB1dC5jcHAKKysrIGIvbGlicy91aS9JbnB1dC5jcHAKQEAgLTIyLDI2ICsyMiwyNiBAQAogCiBib29sIEtleUV2ZW50OjpoYXNEZWZhdWx0QWN0aW9uKGludDMyX3Qga2V5Q29kZSkgewogICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICBjYXNlIEtFWUNPREVfSE9NRToKLSAgICAgICAgY2FzZSBLRVlDT0RFX0JBQ0s6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9DQUxMOgotICAgICAgICBjYXNlIEtFWUNPREVfRU5EQ0FMTDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX1ZPTFVNRV9VUDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX1ZPTFVNRV9ET1dOOgotICAgICAgICBjYXNlIEtFWUNPREVfUE9XRVI6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9DQU1FUkE6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9IRUFEU0VUSE9PSzoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FTlU6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9OT1RJRklDQVRJT046Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9GT0NVUzoKLSAgICAgICAgY2FzZSBLRVlDT0RFX1NFQVJDSDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FRElBX1BMQVlfUEFVU0U6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9NRURJQV9TVE9QOgotICAgICAgICBjYXNlIEtFWUNPREVfTUVESUFfTkVYVDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FRElBX1BSRVZJT1VTOgotICAgICAgICBjYXNlIEtFWUNPREVfTUVESUFfUkVXSU5EOgotICAgICAgICBjYXNlIEtFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEOgotICAgICAgICBjYXNlIEtFWUNPREVfTVVURToKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9IT01FOgorICAgICAgICBjYXNlIEFLRVlDT0RFX0JBQ0s6CisgICAgICAgIGNhc2UgQUtFWUNPREVfQ0FMTDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9FTkRDQUxMOgorICAgICAgICBjYXNlIEFLRVlDT0RFX1ZPTFVNRV9VUDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9WT0xVTUVfRE9XTjoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9QT1dFUjoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9DQU1FUkE6CisgICAgICAgIGNhc2UgQUtFWUNPREVfSEVBRFNFVEhPT0s6CisgICAgICAgIGNhc2UgQUtFWUNPREVfTUVOVToKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9OT1RJRklDQVRJT046CisgICAgICAgIGNhc2UgQUtFWUNPREVfRk9DVVM6CisgICAgICAgIGNhc2UgQUtFWUNPREVfU0VBUkNIOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BMQVlfUEFVU0U6CisgICAgICAgIGNhc2UgQUtFWUNPREVfTUVESUFfU1RPUDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9NRURJQV9ORVhUOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BSRVZJT1VTOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1JFV0lORDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9NRURJQV9GQVNUX0ZPUldBUkQ6CisgICAgICAgIGNhc2UgQUtFWUNPREVfTVVURToKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAKQEAgLTU0LDI2ICs1NCwyNiBAQAogCiBib29sIEtleUV2ZW50Ojppc1N5c3RlbUtleShpbnQzMl90IGtleUNvZGUpIHsKICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FTlU6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9TT0ZUX1JJR0hUOgotICAgICAgICBjYXNlIEtFWUNPREVfSE9NRToKLSAgICAgICAgY2FzZSBLRVlDT0RFX0JBQ0s6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9DQUxMOgotICAgICAgICBjYXNlIEtFWUNPREVfRU5EQ0FMTDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX1ZPTFVNRV9VUDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX1ZPTFVNRV9ET1dOOgotICAgICAgICBjYXNlIEtFWUNPREVfTVVURToKLSAgICAgICAgY2FzZSBLRVlDT0RFX1BPV0VSOgotICAgICAgICBjYXNlIEtFWUNPREVfSEVBRFNFVEhPT0s6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9NRURJQV9QTEFZX1BBVVNFOgotICAgICAgICBjYXNlIEtFWUNPREVfTUVESUFfU1RPUDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FRElBX05FWFQ6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9NRURJQV9QUkVWSU9VUzoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FRElBX1JFV0lORDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FRElBX0ZBU1RfRk9SV0FSRDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX0NBTUVSQToKLSAgICAgICAgY2FzZSBLRVlDT0RFX0ZPQ1VTOgotICAgICAgICBjYXNlIEtFWUNPREVfU0VBUkNIOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FTlU6CisgICAgICAgIGNhc2UgQUtFWUNPREVfU09GVF9SSUdIVDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9IT01FOgorICAgICAgICBjYXNlIEFLRVlDT0RFX0JBQ0s6CisgICAgICAgIGNhc2UgQUtFWUNPREVfQ0FMTDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9FTkRDQUxMOgorICAgICAgICBjYXNlIEFLRVlDT0RFX1ZPTFVNRV9VUDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9WT0xVTUVfRE9XTjoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9NVVRFOgorICAgICAgICBjYXNlIEFLRVlDT0RFX1BPV0VSOgorICAgICAgICBjYXNlIEFLRVlDT0RFX0hFQURTRVRIT09LOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BMQVlfUEFVU0U6CisgICAgICAgIGNhc2UgQUtFWUNPREVfTUVESUFfU1RPUDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9NRURJQV9ORVhUOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BSRVZJT1VTOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1JFV0lORDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9NRURJQV9GQVNUX0ZPUldBUkQ6CisgICAgICAgIGNhc2UgQUtFWUNPREVfQ0FNRVJBOgorICAgICAgICBjYXNlIEFLRVlDT0RFX0ZPQ1VTOgorICAgICAgICBjYXNlIEFLRVlDT0RFX1NFQVJDSDoKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL2xpYnMvdWkvSW5wdXREZXZpY2UuY3BwIGIvbGlicy91aS9JbnB1dERldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxNDAxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvdWkvSW5wdXREZXZpY2UuY3BwCkBAIC0wLDAgKzEsNzI5IEBACisvLworLy8gQ29weXJpZ2h0IDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoZSBpbnB1dCByZWFkZXIuCisvLworI2RlZmluZSBMT0dfVEFHICJJbnB1dERldmljZSIKKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyBMb2cgZGVidWcgbWVzc2FnZXMgZm9yIGVhY2ggcmF3IGV2ZW50IHJlY2VpdmVkIGZyb20gdGhlIEV2ZW50SHViLgorI2RlZmluZSBERUJVR19SQVdfRVZFTlRTIDAKKworLy8gTG9nIGRlYnVnIG1lc3NhZ2VzIGFib3V0IHRvdWNoIHNjcmVlbiBmaWx0ZXJpbmcgaGFja3MuCisjZGVmaW5lIERFQlVHX0hBQ0tTIDAKKworLy8gTG9nIGRlYnVnIG1lc3NhZ2VzIGFib3V0IHZpcnR1YWwga2V5IHByb2Nlc3NpbmcuCisjZGVmaW5lIERFQlVHX1ZJUlRVQUxfS0VZUyAwCisKKy8vIExvZyBkZWJ1ZyBtZXNzYWdlcyBhYm91dCBwb2ludGVycy4KKyNkZWZpbmUgREVCVUdfUE9JTlRFUlMgMAorCisvLyBMb2cgZGVidWcgbWVzc2FnZXMgYWJvdXQgcG9pbnRlciBhc3NpZ25tZW50IGNhbGN1bGF0aW9ucy4KKyNkZWZpbmUgREVCVUdfUE9JTlRFUl9BU1NJR05NRU5UIDAKKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDx1aS9JbnB1dERldmljZS5oPgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLyogU2xvcCBkaXN0YW5jZSBmb3IganVtcHkgcG9pbnRlciBkZXRlY3Rpb24uCisgKiBUaGUgdmVydGljYWwgcmFuZ2Ugb2YgdGhlIHNjcmVlbiBkaXZpZGVkIGJ5IHRoaXMgaXMgb3VyIGVwc2lsb24gdmFsdWUuICovCisjZGVmaW5lIEpVTVBZX0VQU0lMT05fRElWSVNPUiAyMTIKKworLyogTnVtYmVyIG9mIGp1bXB5IHBvaW50cyB0byBkcm9wIGZvciB0b3VjaHNjcmVlbnMgdGhhdCBuZWVkIGl0LiAqLworI2RlZmluZSBKVU1QWV9UUkFOU0lUSU9OX0RST1BTIDMKKyNkZWZpbmUgSlVNUFlfRFJPUF9MSU1JVCAzCisKKy8qIE1heGltdW0gc3F1YXJlZCBkaXN0YW5jZSBmb3IgYXZlcmFnaW5nLgorICogSWYgbW92aW5nIGZhcnRoZXIgdGhhbiB0aGlzLCB0dXJuIG9mIGF2ZXJhZ2luZyB0byBhdm9pZCBsYWcgaW4gcmVzcG9uc2UuICovCisjZGVmaW5lIEFWRVJBR0lOR19ESVNUQU5DRV9MSU1JVCAoNzUgKiA3NSkKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLSBTdGF0aWMgRnVuY3Rpb25zIC0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIHN0YXRpYyBUIGFicyhjb25zdCBUJiB2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZSA8IDAgPyAtIHZhbHVlIDogdmFsdWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgc3RhdGljIFQgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpIHsKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBzdGF0aWMgdm9pZCBzd2FwKFQmIGEsIFQmIGIpIHsKKyAgICBUIHRlbXAgPSBhOworICAgIGEgPSBiOworICAgIGIgPSB0ZW1wOworfQorCisKKy8vIC0tLSBJbnB1dERldmljZSAtLS0KKworSW5wdXREZXZpY2U6OklucHV0RGV2aWNlKGludDMyX3QgaWQsIHVpbnQzMl90IGNsYXNzZXMsIFN0cmluZzggbmFtZSkgOgorICAgIGlkKGlkKSwgY2xhc3NlcyhjbGFzc2VzKSwgbmFtZShuYW1lKSwgaWdub3JlZChmYWxzZSkgeworfQorCit2b2lkIElucHV0RGV2aWNlOjpyZXNldCgpIHsKKyAgICBpZiAoaXNLZXlib2FyZCgpKSB7CisgICAgICAgIGtleWJvYXJkLnJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKGlzVHJhY2tiYWxsKCkpIHsKKyAgICAgICAgdHJhY2tiYWxsLnJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKGlzTXVsdGlUb3VjaFNjcmVlbigpKSB7CisgICAgICAgIG11bHRpVG91Y2hTY3JlZW4ucmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKGlzU2luZ2xlVG91Y2hTY3JlZW4oKSkgeworICAgICAgICBzaW5nbGVUb3VjaFNjcmVlbi5yZXNldCgpOworICAgIH0KKworICAgIGlmIChpc1RvdWNoU2NyZWVuKCkpIHsKKyAgICAgICAgdG91Y2hTY3JlZW4ucmVzZXQoKTsKKyAgICB9Cit9CisKKworLy8gLS0tIElucHV0RGV2aWNlOjpUb3VjaERhdGEgLS0tCisKK3ZvaWQgSW5wdXREZXZpY2U6OlRvdWNoRGF0YTo6Y29weUZyb20oY29uc3QgVG91Y2hEYXRhJiBvdGhlcikgeworICAgIHBvaW50ZXJDb3VudCA9IG90aGVyLnBvaW50ZXJDb3VudDsKKyAgICBpZEJpdHMgPSBvdGhlci5pZEJpdHM7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcG9pbnRlckNvdW50OyBpKyspIHsKKyAgICAgICAgcG9pbnRlcnNbaV0gPSBvdGhlci5wb2ludGVyc1tpXTsKKyAgICAgICAgaWRUb0luZGV4W2ldID0gb3RoZXIuaWRUb0luZGV4W2ldOworICAgIH0KK30KKworCisvLyAtLS0gSW5wdXREZXZpY2U6OktleWJvYXJkU3RhdGUgLS0tCisKK3ZvaWQgSW5wdXREZXZpY2U6OktleWJvYXJkU3RhdGU6OnJlc2V0KCkgeworICAgIGN1cnJlbnQubWV0YVN0YXRlID0gTUVUQV9OT05FOworICAgIGN1cnJlbnQuZG93blRpbWUgPSAwOworfQorCisKKy8vIC0tLSBJbnB1dERldmljZTo6VHJhY2tiYWxsU3RhdGUgLS0tCisKK3ZvaWQgSW5wdXREZXZpY2U6OlRyYWNrYmFsbFN0YXRlOjpyZXNldCgpIHsKKyAgICBhY2N1bXVsYXRvci5jbGVhcigpOworICAgIGN1cnJlbnQuZG93biA9IGZhbHNlOworICAgIGN1cnJlbnQuZG93blRpbWUgPSAwOworfQorCisKKy8vIC0tLSBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZSAtLS0KKwordm9pZCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6cmVzZXQoKSB7CisgICAgbGFzdFRvdWNoLmNsZWFyKCk7CisgICAgZG93blRpbWUgPSAwOworICAgIGN1cnJlbnRWaXJ0dWFsS2V5LnN0YXR1cyA9IEN1cnJlbnRWaXJ0dWFsS2V5U3RhdGU6OlNUQVRVU19VUDsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfUE9JTlRFUlM7IGkrKykgeworICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5U3RhcnRbaV0gPSAwOworICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RW5kW2ldID0gMDsKKyAgICB9CisKKyAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCA9IDA7Cit9CisKK3N0cnVjdCBQb2ludGVyRGlzdGFuY2VIZWFwRWxlbWVudCB7CisgICAgdWludDMyX3QgY3VycmVudFBvaW50ZXJJbmRleCA6IDg7CisgICAgdWludDMyX3QgbGFzdFBvaW50ZXJJbmRleCA6IDg7CisgICAgdWludDY0X3QgZGlzdGFuY2UgOiA0ODsgLy8gc3F1YXJlZCBkaXN0YW5jZQorfTsKKwordm9pZCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6Y2FsY3VsYXRlUG9pbnRlcklkcygpIHsKKyAgICB1aW50MzJfdCBjdXJyZW50UG9pbnRlckNvdW50ID0gY3VycmVudFRvdWNoLnBvaW50ZXJDb3VudDsKKyAgICB1aW50MzJfdCBsYXN0UG9pbnRlckNvdW50ID0gbGFzdFRvdWNoLnBvaW50ZXJDb3VudDsKKworICAgIGlmIChjdXJyZW50UG9pbnRlckNvdW50ID09IDApIHsKKyAgICAgICAgLy8gTm8gcG9pbnRlcnMgdG8gYXNzaWduLgorICAgICAgICBjdXJyZW50VG91Y2guaWRCaXRzLmNsZWFyKCk7CisgICAgfSBlbHNlIGlmIChsYXN0UG9pbnRlckNvdW50ID09IDApIHsKKyAgICAgICAgLy8gQWxsIHBvaW50ZXJzIGFyZSBuZXcuCisgICAgICAgIGN1cnJlbnRUb3VjaC5pZEJpdHMuY2xlYXIoKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGN1cnJlbnRQb2ludGVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLmlkID0gaTsKKyAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaV0gPSBpOworICAgICAgICAgICAgY3VycmVudFRvdWNoLmlkQml0cy5tYXJrQml0KGkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjdXJyZW50UG9pbnRlckNvdW50ID09IDEgJiYgbGFzdFBvaW50ZXJDb3VudCA9PSAxKSB7CisgICAgICAgIC8vIE9ubHkgb25lIHBvaW50ZXIgYW5kIG5vIGNoYW5nZSBpbiBjb3VudCBzbyBpdCBtdXN0IGhhdmUgdGhlIHNhbWUgaWQgYXMgYmVmb3JlLgorICAgICAgICB1aW50MzJfdCBpZCA9IGxhc3RUb3VjaC5wb2ludGVyc1swXS5pZDsKKyAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzWzBdLmlkID0gaWQ7CisgICAgICAgIGN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaWRdID0gMDsKKyAgICAgICAgY3VycmVudFRvdWNoLmlkQml0cy52YWx1ZSA9IEJpdFNldDMyOjp2YWx1ZUZvckJpdChpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gR2VuZXJhbCBjYXNlLgorICAgICAgICAvLyBXZSBidWlsZCBhIGhlYXAgb2Ygc3F1YXJlZCBldWNsaWRlYW4gZGlzdGFuY2VzIGJldHdlZW4gY3VycmVudCBhbmQgbGFzdCBwb2ludGVycworICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYW5kIGxhc3QgcG9pbnRlciBpbmRpY2VzLiAgVGhlbiwgd2UgZmluZCB0aGUgYmVzdAorICAgICAgICAvLyBtYXRjaCAoYnkgZGlzdGFuY2UpIGZvciBlYWNoIGN1cnJlbnQgcG9pbnRlci4KKyAgICAgICAgUG9pbnRlckRpc3RhbmNlSGVhcEVsZW1lbnQgaGVhcFtNQVhfUE9JTlRFUlMgKiBNQVhfUE9JTlRFUlNdOworCisgICAgICAgIHVpbnQzMl90IGhlYXBTaXplID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdXJyZW50UG9pbnRlckluZGV4ID0gMDsgY3VycmVudFBvaW50ZXJJbmRleCA8IGN1cnJlbnRQb2ludGVyQ291bnQ7CisgICAgICAgICAgICAgICAgY3VycmVudFBvaW50ZXJJbmRleCsrKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGxhc3RQb2ludGVySW5kZXggPSAwOyBsYXN0UG9pbnRlckluZGV4IDwgbGFzdFBvaW50ZXJDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFBvaW50ZXJJbmRleCsrKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkZWx0YVggPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudFBvaW50ZXJJbmRleF0ueAorICAgICAgICAgICAgICAgICAgICAgICAgLSBsYXN0VG91Y2gucG9pbnRlcnNbbGFzdFBvaW50ZXJJbmRleF0ueDsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbHRhWSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50UG9pbnRlckluZGV4XS55CisgICAgICAgICAgICAgICAgICAgICAgICAtIGxhc3RUb3VjaC5wb2ludGVyc1tsYXN0UG9pbnRlckluZGV4XS55OworCisgICAgICAgICAgICAgICAgdWludDY0X3QgZGlzdGFuY2UgPSB1aW50NjRfdChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpOworCisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IG5ldyBlbGVtZW50IGludG8gdGhlIGhlYXAgKHNpZnQgdXApLgorICAgICAgICAgICAgICAgIGhlYXBbaGVhcFNpemVdLmN1cnJlbnRQb2ludGVySW5kZXggPSBjdXJyZW50UG9pbnRlckluZGV4OworICAgICAgICAgICAgICAgIGhlYXBbaGVhcFNpemVdLmxhc3RQb2ludGVySW5kZXggPSBsYXN0UG9pbnRlckluZGV4OworICAgICAgICAgICAgICAgIGhlYXBbaGVhcFNpemVdLmRpc3RhbmNlID0gZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgaGVhcFNpemUgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEhlYXBpZnkKKyAgICAgICAgZm9yICh1aW50MzJfdCBzdGFydEluZGV4ID0gaGVhcFNpemUgLyAyOyBzdGFydEluZGV4ICE9IDA7ICkgeworICAgICAgICAgICAgc3RhcnRJbmRleCAtPSAxOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBwYXJlbnRJbmRleCA9IHN0YXJ0SW5kZXg7IDspIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGlsZEluZGV4ID0gcGFyZW50SW5kZXggKiAyICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+PSBoZWFwU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCArIDEgPCBoZWFwU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGVhcFtjaGlsZEluZGV4ICsgMV0uZGlzdGFuY2UgPCBoZWFwW2NoaWxkSW5kZXhdLmRpc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaGVhcFtwYXJlbnRJbmRleF0uZGlzdGFuY2UgPD0gaGVhcFtjaGlsZEluZGV4XS5kaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2FwKGhlYXBbcGFyZW50SW5kZXhdLCBoZWFwW2NoaWxkSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBwYXJlbnRJbmRleCA9IGNoaWxkSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIERFQlVHX1BPSU5URVJfQVNTSUdOTUVOVAorICAgICAgICBMT0dEKCJjYWxjdWxhdGVQb2ludGVySWRzIC0gaW5pdGlhbCBkaXN0YW5jZSBtaW4taGVhcDogc2l6ZT0lZCIsIGhlYXBTaXplKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFwU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBMT0dEKCIgIGhlYXBbJWRdOiBjdXI9JWQsIGxhc3Q9JWQsIGRpc3RhbmNlPSVsbGQiLAorICAgICAgICAgICAgICAgICAgICBpLCBoZWFwW2ldLmN1cnJlbnRQb2ludGVySW5kZXgsIGhlYXBbaV0ubGFzdFBvaW50ZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgaGVhcFtpXS5kaXN0YW5jZSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vIFB1bGwgbWF0Y2hlcyBvdXQgYnkgaW5jcmVhc2luZyBvcmRlciBvZiBkaXN0YW5jZS4KKyAgICAgICAgLy8gVG8gYXZvaWQgcmVhc3NpZ25pbmcgcG9pbnRlcnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBtYXRjaGVkLCB0aGUgbG9vcCBrZWVwcyB0cmFjaworICAgICAgICAvLyBvZiB3aGljaCBsYXN0IGFuZCBjdXJyZW50IHBvaW50ZXJzIGhhdmUgYmVlbiBtYXRjaGVkIHVzaW5nIHRoZSBtYXRjaGVkWFhYQml0cyB2YXJpYWJsZXMuCisgICAgICAgIC8vIEl0IGFsc28gdHJhY2tzIHRoZSB1c2VkIHBvaW50ZXIgaWQgYml0cy4KKyAgICAgICAgQml0U2V0MzIgbWF0Y2hlZExhc3RCaXRzKDApOworICAgICAgICBCaXRTZXQzMiBtYXRjaGVkQ3VycmVudEJpdHMoMCk7CisgICAgICAgIEJpdFNldDMyIHVzZWRJZEJpdHMoMCk7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSBtaW4oY3VycmVudFBvaW50ZXJDb3VudCwgbGFzdFBvaW50ZXJDb3VudCk7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgd2UganVzdCBjb25zdW1lIHRoZSByb290IGVsZW1lbnQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGhlYXAgKHRoZSBvbmUgd2l0aCBzbWFsbGVzdCBkaXN0YW5jZSkuCisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJldmlvdXMgaXRlcmF0aW9ucyBjb25zdW1lZCB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBoZWFwLgorICAgICAgICAgICAgICAgICAgICAvLyBQb3Agcm9vdCBlbGVtZW50IG9mZiBvZiB0aGUgaGVhcCAoc2lmdCBkb3duKS4KKyAgICAgICAgICAgICAgICAgICAgaGVhcFNpemUgLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGhlYXBTaXplID4gMCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2lmdCBkb3duLgorICAgICAgICAgICAgICAgICAgICBoZWFwWzBdID0gaGVhcFtoZWFwU2l6ZV07CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgcGFyZW50SW5kZXggPSAwOyA7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGlsZEluZGV4ID0gcGFyZW50SW5kZXggKiAyICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID49IGhlYXBTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ICsgMSA8IGhlYXBTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGhlYXBbY2hpbGRJbmRleCArIDFdLmRpc3RhbmNlIDwgaGVhcFtjaGlsZEluZGV4XS5kaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYXBbcGFyZW50SW5kZXhdLmRpc3RhbmNlIDw9IGhlYXBbY2hpbGRJbmRleF0uZGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dhcChoZWFwW3BhcmVudEluZGV4XSwgaGVhcFtjaGlsZEluZGV4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmRleCA9IGNoaWxkSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKworI2lmIERFQlVHX1BPSU5URVJfQVNTSUdOTUVOVAorICAgICAgICAgICAgICAgICAgICBMT0dEKCJjYWxjdWxhdGVQb2ludGVySWRzIC0gcmVkdWNlZCBkaXN0YW5jZSBtaW4taGVhcDogc2l6ZT0lZCIsIGhlYXBTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFwU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCIgIGhlYXBbJWRdOiBjdXI9JWQsIGxhc3Q9JWQsIGRpc3RhbmNlPSVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBoZWFwW2ldLmN1cnJlbnRQb2ludGVySW5kZXgsIGhlYXBbaV0ubGFzdFBvaW50ZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFtpXS5kaXN0YW5jZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRQb2ludGVySW5kZXggPSBoZWFwWzBdLmN1cnJlbnRQb2ludGVySW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRDdXJyZW50Qml0cy5oYXNCaXQoY3VycmVudFBvaW50ZXJJbmRleCkpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IG1hdGNoZWQKKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhc3RQb2ludGVySW5kZXggPSBoZWFwWzBdLmxhc3RQb2ludGVySW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRMYXN0Qml0cy5oYXNCaXQobGFzdFBvaW50ZXJJbmRleCkpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IG1hdGNoZWQKKworICAgICAgICAgICAgICAgIG1hdGNoZWRDdXJyZW50Qml0cy5tYXJrQml0KGN1cnJlbnRQb2ludGVySW5kZXgpOworICAgICAgICAgICAgICAgIG1hdGNoZWRMYXN0Qml0cy5tYXJrQml0KGxhc3RQb2ludGVySW5kZXgpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSBsYXN0VG91Y2gucG9pbnRlcnNbbGFzdFBvaW50ZXJJbmRleF0uaWQ7CisgICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2N1cnJlbnRQb2ludGVySW5kZXhdLmlkID0gaWQ7CisgICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLmlkVG9JbmRleFtpZF0gPSBjdXJyZW50UG9pbnRlckluZGV4OworICAgICAgICAgICAgICAgIHVzZWRJZEJpdHMubWFya0JpdChpZCk7CisKKyNpZiBERUJVR19QT0lOVEVSX0FTU0lHTk1FTlQKKyAgICAgICAgICAgICAgICBMT0dEKCJjYWxjdWxhdGVQb2ludGVySWRzIC0gbWF0Y2hlZDogY3VyPSVkLCBsYXN0PSVkLCBpZD0lZCwgZGlzdGFuY2U9JWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UG9pbnRlckluZGV4LCBjdXJyZW50UG9pbnRlckluZGV4LCBpZCwgaGVhcFswXS5kaXN0YW5jZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFzc2lnbiBmcmVzaCBpZHMgdG8gbmV3IHBvaW50ZXJzLgorICAgICAgICBpZiAoY3VycmVudFBvaW50ZXJDb3VudCA+IGxhc3RQb2ludGVyQ291bnQpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IGN1cnJlbnRQb2ludGVyQ291bnQgLSBsYXN0UG9pbnRlckNvdW50OyA7KSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudFBvaW50ZXJJbmRleCA9IG1hdGNoZWRDdXJyZW50Qml0cy5maXJzdFVubWFya2VkQml0KCk7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSB1c2VkSWRCaXRzLmZpcnN0VW5tYXJrZWRCaXQoKTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50UG9pbnRlckluZGV4XS5pZCA9IGlkOworICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaWRdID0gY3VycmVudFBvaW50ZXJJbmRleDsKKyAgICAgICAgICAgICAgICB1c2VkSWRCaXRzLm1hcmtCaXQoaWQpOworCisjaWYgREVCVUdfUE9JTlRFUl9BU1NJR05NRU5UCisgICAgICAgICAgICAgICAgTE9HRCgiY2FsY3VsYXRlUG9pbnRlcklkcyAtIGFzc2lnbmVkOiBjdXI9JWQsIGlkPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb2ludGVySW5kZXgsIGlkKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgaWYgKC0taSA9PSAwKSBicmVhazsgLy8gZG9uZQorICAgICAgICAgICAgICAgIG1hdGNoZWRDdXJyZW50Qml0cy5tYXJrQml0KGN1cnJlbnRQb2ludGVySW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRml4IGlkIGJpdHMuCisgICAgICAgIGN1cnJlbnRUb3VjaC5pZEJpdHMgPSB1c2VkSWRCaXRzOworICAgIH0KK30KKworLyogU3BlY2lhbCBoYWNrIGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBiYWQgc2NyZWVuIGRhdGE6IGlmIG9uZSBvZiB0aGUKKyAqIHBvaW50cyBoYXMgbW92ZWQgbW9yZSB0aGFuIGEgc2NyZWVuIGhlaWdodCBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLAorICogdGhlbiBkcm9wIGl0LiAqLworYm9vbCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6YXBwbHlCYWRUb3VjaEZpbHRlcigpIHsKKyAgICAvLyBUaGlzIGhhY2sgcmVxdWlyZXMgdmFsaWQgYXhpcyBwYXJhbWV0ZXJzLgorICAgIGlmICghIHBhcmFtZXRlcnMueUF4aXMudmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IHBvaW50ZXJDb3VudCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQ7CisKKyAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHRoZXJlIGFyZSBubyBwb2ludHMuCisgICAgaWYgKHBvaW50ZXJDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhIGZpbmdlciBpcyBnb2luZyBkb3duIG9yIHVwLiAgV2UgcnVuCisgICAgLy8gaGVyZSBiZWZvcmUgYXNzaWduaW5nIHBvaW50ZXIgSURzLCBzbyB0aGVyZSBpc24ndCBhIGdvb2QKKyAgICAvLyB3YXkgdG8gZG8gcGVyLWZpbmdlciBtYXRjaGluZy4KKyAgICBpZiAocG9pbnRlckNvdW50ICE9IGxhc3RUb3VjaC5wb2ludGVyQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFdlIGNvbnNpZGVyIGEgc2luZ2xlIG1vdmVtZW50IGFjcm9zcyBtb3JlIHRoYW4gYSA3LzE2IG9mCisgICAgLy8gdGhlIGxvbmcgc2l6ZSBvZiB0aGUgc2NyZWVuIHRvIGJlIGJhZC4gIFRoaXMgd2FzIGEgbWFnaWMgdmFsdWUKKyAgICAvLyBkZXRlcm1pbmVkIGJ5IGxvb2tpbmcgYXQgdGhlIG1heGltdW0gZGlzdGFuY2UgaXQgaXMgZmVhc2libGUKKyAgICAvLyB0byBhY3R1YWxseSBtb3ZlIGluIG9uZSBzYW1wbGUuCisgICAgaW50MzJfdCBtYXhEZWx0YVkgPSBwYXJhbWV0ZXJzLnlBeGlzLnJhbmdlICogNyAvIDE2OworCisgICAgLy8gWFhYIFRoZSBvcmlnaW5hbCBjb2RlIGluIElucHV0RGV2aWNlLmphdmEgaW5jbHVkZWQgY29tbWVudGVkIG91dAorICAgIC8vICAgICBjb2RlIGZvciB0ZXN0aW5nIHRoZSBYIGF4aXMuICBOb3RlIHRoYXQgd2hlbiB3ZSBkcm9wIGEgcG9pbnQKKyAgICAvLyAgICAgd2UgZG9uJ3QgYWN0dWFsbHkgcmVzdG9yZSB0aGUgb2xkIFggZWl0aGVyLiAgU3RyYW5nZS4KKyAgICAvLyAgICAgVGhlIG9sZCBjb2RlIGFsc28gdHJpZXMgdG8gdHJhY2sgd2hlbiBiYWQgcG9pbnRzIHdlcmUgcHJldmlvdXNseQorICAgIC8vICAgICBkZXRlY3RlZCBidXQgaXQgdHVybnMgb3V0IHRoYXQgZHVlIHRvIHRoZSBwbGFjZW1lbnQgb2YgYSAiYnJlYWsiCisgICAgLy8gICAgIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AsIHdlIG5ldmVyIHNldCBtRHJvcHBlZEJhZFBvaW50IHRvIHRydWUKKyAgICAvLyAgICAgc28gaXQgaXMgZWZmZWN0aXZlbHkgZGVhZCBjb2RlLgorICAgIC8vIE5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgb2xkIGNvZGUgaXMgYnVzdGVkIG9yIGp1c3Qgb3ZlcmNvbXBsaWNhdGVkCisgICAgLy8gYnV0IHdvcmtpbmcgYXMgaW50ZW5kZWQuCisKKyAgICAvLyBMb29rIHRocm91Z2ggYWxsIG5ldyBwb2ludHMgYW5kIHNlZSBpZiBhbnkgYXJlIGZhcnRoZXIgdGhhbgorICAgIC8vIGFjY2VwdGFibGUgZnJvbSBhbGwgcHJldmlvdXMgcG9pbnRzLgorICAgIGZvciAodWludDMyX3QgaSA9IHBvaW50ZXJDb3VudDsgaS0tID4gMDsgKSB7CisgICAgICAgIGludDMyX3QgeSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55OworICAgICAgICBpbnQzMl90IGNsb3Nlc3RZID0gSU5UX01BWDsKKyAgICAgICAgaW50MzJfdCBjbG9zZXN0RGVsdGFZID0gMDsKKworI2lmIERFQlVHX0hBQ0tTCisgICAgICAgIExPR0QoIkJhZFRvdWNoRmlsdGVyOiBMb29raW5nIGF0IG5leHQgcG9pbnQgIyVkOiB5PSVkIiwgaSwgeSk7CisjZW5kaWYKKworICAgICAgICBmb3IgKHVpbnQzMl90IGogPSBwb2ludGVyQ291bnQ7IGotLSA+IDA7ICkgeworICAgICAgICAgICAgaW50MzJfdCBsYXN0WSA9IGxhc3RUb3VjaC5wb2ludGVyc1tqXS55OworICAgICAgICAgICAgaW50MzJfdCBkZWx0YVkgPSBhYnMoeSAtIGxhc3RZKTsKKworI2lmIERFQlVHX0hBQ0tTCisgICAgICAgICAgICBMT0dEKCJCYWRUb3VjaEZpbHRlcjogQ29tcGFyaW5nIHdpdGggbGFzdCBwb2ludCAjJWQ6IHk9JWQgZGVsdGFZPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgaiwgbGFzdFksIGRlbHRhWSk7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKGRlbHRhWSA8IG1heERlbHRhWSkgeworICAgICAgICAgICAgICAgIGdvdG8gU2tpcFN1ZmZpY2llbnRseUNsb3NlUG9pbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVsdGFZIDwgY2xvc2VzdERlbHRhWSkgeworICAgICAgICAgICAgICAgIGNsb3Nlc3REZWx0YVkgPSBkZWx0YVk7CisgICAgICAgICAgICAgICAgY2xvc2VzdFkgPSBsYXN0WTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE11c3Qgbm90IGhhdmUgZm91bmQgYSBjbG9zZSBlbm91Z2ggbWF0Y2guCisjaWYgREVCVUdfSEFDS1MKKyAgICAgICAgTE9HRCgiQmFkVG91Y2hGaWx0ZXI6IERyb3BwaW5nIGJhZCBwb2ludCAjJWQ6IG5ld1k9JWQgb2xkWT0lZCBkZWx0YVk9JWQgbWF4RGVsdGFZPSVkIiwKKyAgICAgICAgICAgICAgICBpLCB5LCBjbG9zZXN0WSwgY2xvc2VzdERlbHRhWSwgbWF4RGVsdGFZKTsKKyNlbmRpZgorCisgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55ID0gY2xvc2VzdFk7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBYWFggb3JpZ2luYWwgY29kZSBvbmx5IGNvcnJlY3RzIG9uZSBwb2ludAorCisgICAgU2tpcFN1ZmZpY2llbnRseUNsb3NlUG9pbnQ6IDsKKyAgICB9CisKKyAgICAvLyBObyBjaGFuZ2UuCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiBTcGVjaWFsIGhhY2sgZm9yIGRldmljZXMgdGhhdCBoYXZlIGJhZCBzY3JlZW4gZGF0YTogZHJvcCBwb2ludHMgd2hlcmUKKyAqIHRoZSBjb29yZGluYXRlIHZhbHVlIGZvciBvbmUgYXhpcyBoYXMganVtcGVkIHRvIHRoZSBvdGhlciBwb2ludGVyJ3MgbG9jYXRpb24uCisgKi8KK2Jvb2wgSW5wdXREZXZpY2U6OlRvdWNoU2NyZWVuU3RhdGU6OmFwcGx5SnVtcHlUb3VjaEZpbHRlcigpIHsKKyAgICAvLyBUaGlzIGhhY2sgcmVxdWlyZXMgdmFsaWQgYXhpcyBwYXJhbWV0ZXJzLgorICAgIGlmICghIHBhcmFtZXRlcnMueUF4aXMudmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IHBvaW50ZXJDb3VudCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQ7CisgICAgaWYgKGxhc3RUb3VjaC5wb2ludGVyQ291bnQgIT0gcG9pbnRlckNvdW50KSB7CisjaWYgREVCVUdfSEFDS1MKKyAgICAgICAgTE9HRCgiSnVtcHlUb3VjaEZpbHRlcjogRGlmZmVyZW50IHBvaW50ZXIgY291bnQgJWQgLT4gJWQiLAorICAgICAgICAgICAgICAgIGxhc3RUb3VjaC5wb2ludGVyQ291bnQsIHBvaW50ZXJDb3VudCk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwb2ludGVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgTE9HRCgiICBQb2ludGVyICVkICglZCwgJWQpIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLngsIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkIDwgSlVNUFlfVFJBTlNJVElPTl9EUk9QUykgeworICAgICAgICAgICAgaWYgKGxhc3RUb3VjaC5wb2ludGVyQ291bnQgPT0gMSAmJiBwb2ludGVyQ291bnQgPT0gMikgeworICAgICAgICAgICAgICAgIC8vIEp1c3QgZHJvcCB0aGUgZmlyc3QgZmV3IGV2ZW50cyBnb2luZyBmcm9tIDEgdG8gMiBwb2ludGVycy4KKyAgICAgICAgICAgICAgICAvLyBUaGV5J3JlIGJhZCBvZnRlbiBlbm91Z2ggdGhhdCB0aGV5J3JlIG5vdCB3b3J0aCBjb25zaWRlcmluZy4KKyAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCArPSAxOworCisjaWYgREVCVUdfSEFDS1MKKyAgICAgICAgICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBQb2ludGVyIDIgZHJvcHBlZCIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RUb3VjaC5wb2ludGVyQ291bnQgPT0gMiAmJiBwb2ludGVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCB3aGVuIHdlIGdvIGZyb20gMiAtPiAxIHRlbmRzIHRvIGJlIG1lc3NlZCB1cCB0b28KKyAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID0gMjsKKyAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbMF0gPSBsYXN0VG91Y2gucG9pbnRlcnNbMF07CisgICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzWzFdID0gbGFzdFRvdWNoLnBvaW50ZXJzWzFdOworICAgICAgICAgICAgICAgIGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkICs9IDE7CisKKyNpZiBERUJVR19IQUNLUworICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBQb2ludGVyICVkIHJlcGxhY2VkICglZCwgJWQpIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbaV0ueCwgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLnkpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFJlc2V0IGp1bXB5IHBvaW50cyBkcm9wcGVkIG9uIG90aGVyIHRyYW5zaXRpb25zIG9yIGlmIGxpbWl0IGV4Y2VlZGVkLgorICAgICAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCA9IDA7CisKKyNpZiBERUJVR19IQUNLUworICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBUcmFuc2l0aW9uIC0gZHJvcCBsaW1pdCByZXNldCIpOworI2VuZGlmCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBXZSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwb2ludGVycyBhcyBsYXN0IHRpbWUuCisgICAgLy8gQSAnanVtcHknIHBvaW50IGlzIG9uZSB3aGVyZSB0aGUgY29vcmRpbmF0ZSB2YWx1ZSBmb3Igb25lIGF4aXMKKyAgICAvLyBoYXMganVtcGVkIHRvIHRoZSBvdGhlciBwb2ludGVyJ3MgbG9jYXRpb24uIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcKKyAgICAvLyBlbHNlIGlmIHdlIG9ubHkgaGF2ZSBvbmUgcG9pbnRlci4KKyAgICBpZiAocG9pbnRlckNvdW50IDwgMikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkIDwgSlVNUFlfRFJPUF9MSU1JVCkgeworICAgICAgICBpbnQganVtcHlFcHNpbG9uID0gcGFyYW1ldGVycy55QXhpcy5yYW5nZSAvIEpVTVBZX0VQU0lMT05fRElWSVNPUjsKKworICAgICAgICAvLyBXZSBvbmx5IHJlcGxhY2UgdGhlIHNpbmdsZSB3b3JzdCBqdW1weSBwb2ludCBhcyBjaGFyYWN0ZXJpemVkIGJ5IHBvaW50ZXIgZGlzdGFuY2UKKyAgICAgICAgLy8gaW4gYSBzaW5nbGUgYXhpcy4KKyAgICAgICAgaW50MzJfdCBiYWRQb2ludGVySW5kZXggPSAtMTsKKyAgICAgICAgaW50MzJfdCBiYWRQb2ludGVyUmVwbGFjZW1lbnRJbmRleCA9IC0xOworICAgICAgICBpbnQzMl90IGJhZFBvaW50ZXJEaXN0YW5jZSA9IElOVF9NSU47IC8vIGRpc3RhbmNlIHRvIGJlIGNvcnJlY3RlZAorCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IHBvaW50ZXJDb3VudDsgaS0tID4gMDsgKSB7CisgICAgICAgICAgICBpbnQzMl90IHggPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbaV0ueDsKKyAgICAgICAgICAgIGludDMyX3QgeSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55OworCisjaWYgREVCVUdfSEFDS1MKKyAgICAgICAgICAgIExPR0QoIkp1bXB5VG91Y2hGaWx0ZXI6IFBvaW50ICVkICglZCwgJWQpIiwgaSwgeCwgeSk7CisjZW5kaWYKKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYSB0b3VjaCBwb2ludCBpcyB0b28gY2xvc2UgdG8gYW5vdGhlcidzIGNvb3JkaW5hdGVzCisgICAgICAgICAgICBib29sIGRyb3BYID0gZmFsc2UsIGRyb3BZID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgcG9pbnRlckNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBqKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhYnMoeCAtIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tqXS54KSA8PSBqdW1weUVwc2lsb24pIHsKKyAgICAgICAgICAgICAgICAgICAgZHJvcFggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYWJzKHkgLSBjdXJyZW50VG91Y2gucG9pbnRlcnNbal0ueSkgPD0ganVtcHlFcHNpbG9uKSB7CisgICAgICAgICAgICAgICAgICAgIGRyb3BZID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEgZHJvcFggJiYgISBkcm9wWSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QganVtcHkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmluZCBhIHJlcGxhY2VtZW50IGNhbmRpZGF0ZSBieSBjb21wYXJpbmcgd2l0aCBvbGRlciBwb2ludHMgb24gdGhlCisgICAgICAgICAgICAvLyBjb21wbGVtZW50YXJ5IChub24tanVtcHkpIGF4aXMuCisgICAgICAgICAgICBpbnQzMl90IGRpc3RhbmNlID0gSU5UX01JTjsgLy8gZGlzdGFuY2UgdG8gYmUgY29ycmVjdGVkCisgICAgICAgICAgICBpbnQzMl90IHJlcGxhY2VtZW50SW5kZXggPSAtMTsKKworICAgICAgICAgICAgaWYgKGRyb3BYKSB7CisgICAgICAgICAgICAgICAgLy8gWCBsb29rcyB0b28gY2xvc2UuICBGaW5kIGFuIG9sZGVyIHJlcGxhY2VtZW50IHBvaW50IHdpdGggYSBjbG9zZSBZLgorICAgICAgICAgICAgICAgIGludDMyX3Qgc21hbGxlc3REZWx0YVkgPSBJTlRfTUFYOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwb2ludGVyQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbHRhWSA9IGFicyh5IC0gbGFzdFRvdWNoLnBvaW50ZXJzW2pdLnkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZIDwgc21hbGxlc3REZWx0YVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0RGVsdGFZID0gZGVsdGFZOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRJbmRleCA9IGo7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBhYnMoeCAtIGxhc3RUb3VjaC5wb2ludGVyc1tyZXBsYWNlbWVudEluZGV4XS54KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gWSBsb29rcyB0b28gY2xvc2UuICBGaW5kIGFuIG9sZGVyIHJlcGxhY2VtZW50IHBvaW50IHdpdGggYSBjbG9zZSBYLgorICAgICAgICAgICAgICAgIGludDMyX3Qgc21hbGxlc3REZWx0YVggPSBJTlRfTUFYOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwb2ludGVyQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbHRhWCA9IGFicyh4IC0gbGFzdFRvdWNoLnBvaW50ZXJzW2pdLngpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYIDwgc21hbGxlc3REZWx0YVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0RGVsdGFYID0gZGVsdGFYOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRJbmRleCA9IGo7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBhYnMoeSAtIGxhc3RUb3VjaC5wb2ludGVyc1tyZXBsYWNlbWVudEluZGV4XS55KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgcmVwbGFjaW5nIHRoaXMgcG9pbnRlciB3b3VsZCBjb3JyZWN0IGEgd29yc2UgZXJyb3IgdGhhbiB0aGUgcHJldmlvdXMgb25lcworICAgICAgICAgICAgLy8gY29uc2lkZXJlZCwgdGhlbiB1c2UgdGhpcyByZXBsYWNlbWVudCBpbnN0ZWFkLgorICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gYmFkUG9pbnRlckRpc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgYmFkUG9pbnRlckluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBiYWRQb2ludGVyUmVwbGFjZW1lbnRJbmRleCA9IHJlcGxhY2VtZW50SW5kZXg7CisgICAgICAgICAgICAgICAgYmFkUG9pbnRlckRpc3RhbmNlID0gZGlzdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3JyZWN0IHRoZSBqdW1weSBwb2ludGVyIGlmIG9uZSB3YXMgZm91bmQuCisgICAgICAgIGlmIChiYWRQb2ludGVySW5kZXggPj0gMCkgeworI2lmIERFQlVHX0hBQ0tTCisgICAgICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBSZXBsYWNpbmcgYmFkIHBvaW50ZXIgJWQgd2l0aCAoJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgIGJhZFBvaW50ZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgbGFzdFRvdWNoLnBvaW50ZXJzW2JhZFBvaW50ZXJSZXBsYWNlbWVudEluZGV4XS54LAorICAgICAgICAgICAgICAgICAgICBsYXN0VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlclJlcGxhY2VtZW50SW5kZXhdLnkpOworI2VuZGlmCisKKyAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tiYWRQb2ludGVySW5kZXhdLnggPQorICAgICAgICAgICAgICAgICAgICBsYXN0VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlclJlcGxhY2VtZW50SW5kZXhdLng7CisgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlckluZGV4XS55ID0KKyAgICAgICAgICAgICAgICAgICAgbGFzdFRvdWNoLnBvaW50ZXJzW2JhZFBvaW50ZXJSZXBsYWNlbWVudEluZGV4XS55OworICAgICAgICAgICAganVtcHlUb3VjaEZpbHRlci5qdW1weVBvaW50c0Ryb3BwZWQgKz0gMTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAganVtcHlUb3VjaEZpbHRlci5qdW1weVBvaW50c0Ryb3BwZWQgPSAwOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyogU3BlY2lhbCBoYWNrIGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBiYWQgc2NyZWVuIGRhdGE6IGFnZ3JlZ2F0ZSBhbmQKKyAqIGNvbXB1dGUgYXZlcmFnZXMgb2YgdGhlIGNvb3JkaW5hdGUgZGF0YSwgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YKKyAqIGppdHRlciBzZWVuIGJ5IGFwcGxpY2F0aW9ucy4gKi8KK3ZvaWQgSW5wdXREZXZpY2U6OlRvdWNoU2NyZWVuU3RhdGU6OmFwcGx5QXZlcmFnaW5nVG91Y2hGaWx0ZXIoKSB7CisgICAgZm9yICh1aW50MzJfdCBjdXJyZW50SW5kZXggPSAwOyBjdXJyZW50SW5kZXggPCBjdXJyZW50VG91Y2gucG9pbnRlckNvdW50OyBjdXJyZW50SW5kZXgrKykgeworICAgICAgICB1aW50MzJfdCBpZCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50SW5kZXhdLmlkOworICAgICAgICBpbnQzMl90IHggPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudEluZGV4XS54OworICAgICAgICBpbnQzMl90IHkgPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudEluZGV4XS55OworICAgICAgICBpbnQzMl90IHByZXNzdXJlID0gY3VycmVudFRvdWNoLnBvaW50ZXJzW2N1cnJlbnRJbmRleF0ucHJlc3N1cmU7CisKKyAgICAgICAgaWYgKGxhc3RUb3VjaC5pZEJpdHMuaGFzQml0KGlkKSkgeworICAgICAgICAgICAgLy8gUG9pbnRlciB3YXMgZG93biBiZWZvcmUgYW5kIGlzIHN0aWxsIGRvd24gbm93LgorICAgICAgICAgICAgLy8gQ29tcHV0ZSBhdmVyYWdlIG92ZXIgaGlzdG9yeSB0cmFjZS4KKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0ID0gYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeVN0YXJ0W2lkXTsKKyAgICAgICAgICAgIHVpbnQzMl90IGVuZCA9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlFbmRbaWRdOworCisgICAgICAgICAgICBpbnQ2NF90IGRlbHRhWCA9IHggLSBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS54OworICAgICAgICAgICAgaW50NjRfdCBkZWx0YVkgPSB5IC0gYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeURhdGFbZW5kXS5wb2ludGVyc1tpZF0ueTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGRpc3RhbmNlID0gdWludDY0X3QoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTsKKworI2lmIERFQlVHX0hBQ0tTCisgICAgICAgICAgICBMT0dEKCJBdmVyYWdpbmdUb3VjaEZpbHRlcjogUG9pbnRlciBpZCAlZCAtIERpc3RhbmNlIGZyb20gbGFzdCBzYW1wbGU6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICBpZCwgZGlzdGFuY2UpOworI2VuZGlmCisKKyAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IEFWRVJBR0lOR19ESVNUQU5DRV9MSU1JVCkgeworICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBlbmQgaW5kZXggaW4gcHJlcGFyYXRpb24gZm9yIHJlY29yZGluZyBuZXcgaGlzdG9yaWNhbCBkYXRhLgorICAgICAgICAgICAgICAgIGVuZCArPSAxOworICAgICAgICAgICAgICAgIGlmIChlbmQgPiBBVkVSQUdJTkdfSElTVE9SWV9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVuZCBpbmRleCBoYXMgbG9vcGVkIGJhY2sgdG8gdGhlIHN0YXJ0IGluZGV4IHRoZW4gd2UgaGF2ZSBmaWxsZWQKKyAgICAgICAgICAgICAgICAvLyB0aGUgaGlzdG9yaWNhbCB0cmFjZSB1cCB0byB0aGUgZGVzaXJlZCBzaXplIHNvIHdlIGRyb3AgdGhlIGhpc3RvcmljYWwKKyAgICAgICAgICAgICAgICAvLyBkYXRhIGF0IHRoZSBzdGFydCBvZiB0aGUgdHJhY2UuCisgICAgICAgICAgICAgICAgaWYgKGVuZCA9PSBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICBzdGFydCArPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPiBBVkVSQUdJTkdfSElTVE9SWV9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJhdyBkYXRhIHRvIHRoZSBoaXN0b3JpY2FsIHRyYWNlLgorICAgICAgICAgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlTdGFydFtpZF0gPSBzdGFydDsKKyAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RW5kW2lkXSA9IGVuZDsKKyAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS54ID0geDsKKyAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS55ID0geTsKKyAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS5wcmVzc3VyZSA9IHByZXNzdXJlOworCisgICAgICAgICAgICAgICAgLy8gQXZlcmFnZSBvdmVyIGFsbCBoaXN0b3JpY2FsIHBvc2l0aW9ucyBpbiB0aGUgdHJhY2UgYnkgdG90YWwgcHJlc3N1cmUuCisgICAgICAgICAgICAgICAgaW50MzJfdCBhdmVyYWdlZFggPSAwOworICAgICAgICAgICAgICAgIGludDMyX3QgYXZlcmFnZWRZID0gMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRvdGFsUHJlc3N1cmUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaXN0b3JpY2FsWCA9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW3N0YXJ0XS5wb2ludGVyc1tpZF0ueDsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaXN0b3JpY2FsWSA9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW3N0YXJ0XS5wb2ludGVyc1tpZF0ueTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaXN0b3JpY2FsUHJlc3N1cmUgPSBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtzdGFydF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9pbnRlcnNbaWRdLnByZXNzdXJlOworCisgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2VkWCArPSBoaXN0b3JpY2FsWCAqIGhpc3RvcmljYWxQcmVzc3VyZTsKKyAgICAgICAgICAgICAgICAgICAgYXZlcmFnZWRZICs9IGhpc3RvcmljYWxZICogaGlzdG9yaWNhbFByZXNzdXJlOworICAgICAgICAgICAgICAgICAgICB0b3RhbFByZXNzdXJlICs9IGhpc3RvcmljYWxQcmVzc3VyZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA+IEFWRVJBR0lOR19ISVNUT1JZX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF2ZXJhZ2VkWCAvPSB0b3RhbFByZXNzdXJlOworICAgICAgICAgICAgICAgIGF2ZXJhZ2VkWSAvPSB0b3RhbFByZXNzdXJlOworCisjaWYgREVCVUdfSEFDS1MKKyAgICAgICAgICAgICAgICBMT0dEKCJBdmVyYWdpbmdUb3VjaEZpbHRlcjogUG9pbnRlciBpZCAlZCAtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbFByZXNzdXJlPSVkLCBhdmVyYWdlZFg9JWQsIGF2ZXJhZ2VkWT0lZCIsIGlkLCB0b3RhbFByZXNzdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZWRYLCBhdmVyYWdlZFkpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudEluZGV4XS54ID0gYXZlcmFnZWRYOworICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50SW5kZXhdLnkgPSBhdmVyYWdlZFk7CisgICAgICAgICAgICB9IGVsc2UgeworI2lmIERFQlVHX0hBQ0tTCisgICAgICAgICAgICAgICAgTE9HRCgiQXZlcmFnaW5nVG91Y2hGaWx0ZXI6IFBvaW50ZXIgaWQgJWQgLSBFeGNlZWRlZCBtYXggZGlzdGFuY2UiLCBpZCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNpZiBERUJVR19IQUNLUworICAgICAgICAgICAgTE9HRCgiQXZlcmFnaW5nVG91Y2hGaWx0ZXI6IFBvaW50ZXIgaWQgJWQgLSBQb2ludGVyIHdlbnQgdXAiLCBpZCk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2V0IHBvaW50ZXIgaGlzdG9yeS4KKyAgICAgICAgYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeVN0YXJ0W2lkXSA9IDA7CisgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlFbmRbaWRdID0gMDsKKyAgICAgICAgYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeURhdGFbMF0ucG9pbnRlcnNbaWRdLnggPSB4OworICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVswXS5wb2ludGVyc1tpZF0ueSA9IHk7CisgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhWzBdLnBvaW50ZXJzW2lkXS5wcmVzc3VyZSA9IHByZXNzdXJlOworICAgIH0KK30KKworYm9vbCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6aXNQb2ludEluc2lkZURpc3BsYXkoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0IHsKKyAgICBpZiAoISBwYXJhbWV0ZXJzLnhBeGlzLnZhbGlkIHx8ICEgcGFyYW1ldGVycy55QXhpcy52YWxpZCkgeworICAgICAgICAvLyBBc3N1bWUgYWxsIHBvaW50cyBvbiBhIHRvdWNoIHNjcmVlbiB3aXRob3V0IHZhbGlkIGF4aXMgcGFyYW1ldGVycyBhcmUKKyAgICAgICAgLy8gaW5zaWRlIHRoZSBkaXNwbGF5LgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4geCA+PSBwYXJhbWV0ZXJzLnhBeGlzLm1pblZhbHVlCisgICAgICAgICYmIHggPD0gcGFyYW1ldGVycy54QXhpcy5tYXhWYWx1ZQorICAgICAgICAmJiB5ID49IHBhcmFtZXRlcnMueUF4aXMubWluVmFsdWUKKyAgICAgICAgJiYgeSA8PSBwYXJhbWV0ZXJzLnlBeGlzLm1heFZhbHVlOworfQorCitjb25zdCBJbnB1dERldmljZTo6VmlydHVhbEtleSogSW5wdXREZXZpY2U6OlRvdWNoU2NyZWVuU3RhdGU6OmZpbmRWaXJ0dWFsS2V5SGl0KCkgY29uc3QgeworICAgIGludDMyX3QgeCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1swXS54OworICAgIGludDMyX3QgeSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1swXS55OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmlydHVhbEtleXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgSW5wdXREZXZpY2U6OlZpcnR1YWxLZXkmIHZpcnR1YWxLZXkgPSB2aXJ0dWFsS2V5c1tpXTsKKworI2lmIERFQlVHX1ZJUlRVQUxfS0VZUworICAgICAgICBMT0dEKCJWaXJ0dWFsS2V5czogSGl0IHRlc3QgKCVkLCAlZCk6IGtleUNvZGU9JWQsIHNjYW5Db2RlPSVkLCAiCisgICAgICAgICAgICAgICAgImxlZnQ9JWQsIHRvcD0lZCwgcmlnaHQ9JWQsIGJvdHRvbT0lZCIsCisgICAgICAgICAgICAgICAgeCwgeSwKKyAgICAgICAgICAgICAgICB2aXJ0dWFsS2V5LmtleUNvZGUsIHZpcnR1YWxLZXkuc2NhbkNvZGUsCisgICAgICAgICAgICAgICAgdmlydHVhbEtleS5oaXRMZWZ0LCB2aXJ0dWFsS2V5LmhpdFRvcCwKKyAgICAgICAgICAgICAgICB2aXJ0dWFsS2V5LmhpdFJpZ2h0LCB2aXJ0dWFsS2V5LmhpdEJvdHRvbSk7CisjZW5kaWYKKworICAgICAgICBpZiAodmlydHVhbEtleS5pc0hpdCh4LCB5KSkgeworICAgICAgICAgICAgcmV0dXJuICYgdmlydHVhbEtleTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisKKy8vIC0tLSBJbnB1dERldmljZTo6U2luZ2xlVG91Y2hTY3JlZW5TdGF0ZSAtLS0KKwordm9pZCBJbnB1dERldmljZTo6U2luZ2xlVG91Y2hTY3JlZW5TdGF0ZTo6cmVzZXQoKSB7CisgICAgYWNjdW11bGF0b3IuY2xlYXIoKTsKKyAgICBjdXJyZW50LmRvd24gPSBmYWxzZTsKKyAgICBjdXJyZW50LnggPSAwOworICAgIGN1cnJlbnQueSA9IDA7CisgICAgY3VycmVudC5wcmVzc3VyZSA9IDA7CisgICAgY3VycmVudC5zaXplID0gMDsKK30KKworCisvLyAtLS0gSW5wdXREZXZpY2U6Ok11bHRpVG91Y2hTY3JlZW5TdGF0ZSAtLS0KKwordm9pZCBJbnB1dERldmljZTo6TXVsdGlUb3VjaFNjcmVlblN0YXRlOjpyZXNldCgpIHsKKyAgICBhY2N1bXVsYXRvci5jbGVhcigpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3VpL0lucHV0RGlzcGF0Y2hlci5jcHAgYi9saWJzL3VpL0lucHV0RGlzcGF0Y2hlci5jcHAKaW5kZXggOGY2ZDFmZS4uYzRmZmNlMSAxMDA2NDQKLS0tIGEvbGlicy91aS9JbnB1dERpc3BhdGNoZXIuY3BwCisrKyBiL2xpYnMvdWkvSW5wdXREaXNwYXRjaGVyLmNwcApAQCAtNDAsMTAgKzQwLDEwIEBACiAKIC8vIFRPRE8sIHRoaXMgbmVlZHMgdG8gYmUgc29tZXdoZXJlIGVsc2UsIHBlcmhhcHMgaW4gdGhlIHBvbGljeQogc3RhdGljIGlubGluZSBib29sIGlzTW92ZW1lbnRLZXkoaW50MzJfdCBrZXlDb2RlKSB7Ci0gICAgcmV0dXJuIGtleUNvZGUgPT0gS0VZQ09ERV9EUEFEX1VQCi0gICAgICAgICAgICB8fCBrZXlDb2RlID09IEtFWUNPREVfRFBBRF9ET1dOCi0gICAgICAgICAgICB8fCBrZXlDb2RlID09IEtFWUNPREVfRFBBRF9MRUZUCi0gICAgICAgICAgICB8fCBrZXlDb2RlID09IEtFWUNPREVfRFBBRF9SSUdIVDsKKyAgICByZXR1cm4ga2V5Q29kZSA9PSBBS0VZQ09ERV9EUEFEX1VQCisgICAgICAgICAgICB8fCBrZXlDb2RlID09IEFLRVlDT0RFX0RQQURfRE9XTgorICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBBS0VZQ09ERV9EUEFEX0xFRlQKKyAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gQUtFWUNPREVfRFBBRF9SSUdIVDsKIH0KIAogc3RhdGljIGlubGluZSBuc2Vjc190IG5vdygpIHsKQEAgLTU0LDcgKzU0LDcgQEAKIAogSW5wdXREaXNwYXRjaGVyOjpJbnB1dERpc3BhdGNoZXIoY29uc3Qgc3A8SW5wdXREaXNwYXRjaGVyUG9saWN5SW50ZXJmYWNlPiYgcG9saWN5KSA6CiAgICAgbVBvbGljeShwb2xpY3kpIHsKLSAgICBtUG9sbExvb3AgPSBuZXcgUG9sbExvb3AoKTsKKyAgICBtUG9sbExvb3AgPSBuZXcgUG9sbExvb3AoZmFsc2UpOwogCiAgICAgbUluYm91bmRRdWV1ZS5oZWFkLnJlZkNvdW50ID0gLTE7CiAgICAgbUluYm91bmRRdWV1ZS5oZWFkLnR5cGUgPSBFdmVudEVudHJ5OjpUWVBFX1NFTlRJTkVMOwpAQCAtMjk5LDE0ICsyOTksMTMgQEAKICAgICB1aW50MzJfdCBwb2xpY3lGbGFncyA9IGVudHJ5LT5wb2xpY3lGbGFncyAmIFBPTElDWV9GTEFHX1JBV19NQVNLOwogICAgIGlmIChlbnRyeS0+cmVmQ291bnQgPT0gMSkgewogICAgICAgICBlbnRyeS0+ZXZlbnRUaW1lID0gY3VycmVudFRpbWU7Ci0gICAgICAgIGVudHJ5LT5kb3duVGltZSA9IGN1cnJlbnRUaW1lOwogICAgICAgICBlbnRyeS0+cG9saWN5RmxhZ3MgPSBwb2xpY3lGbGFnczsKICAgICAgICAgZW50cnktPnJlcGVhdENvdW50ICs9IDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgS2V5RW50cnkqIG5ld0VudHJ5ID0gbUFsbG9jYXRvci5vYnRhaW5LZXlFbnRyeShjdXJyZW50VGltZSwKICAgICAgICAgICAgICAgICBlbnRyeS0+ZGV2aWNlSWQsIGVudHJ5LT5uYXR1cmUsIHBvbGljeUZsYWdzLAogICAgICAgICAgICAgICAgIGVudHJ5LT5hY3Rpb24sIGVudHJ5LT5mbGFncywgZW50cnktPmtleUNvZGUsIGVudHJ5LT5zY2FuQ29kZSwKLSAgICAgICAgICAgICAgICBlbnRyeS0+bWV0YVN0YXRlLCBlbnRyeS0+cmVwZWF0Q291bnQgKyAxLCBjdXJyZW50VGltZSk7CisgICAgICAgICAgICAgICAgZW50cnktPm1ldGFTdGF0ZSwgZW50cnktPnJlcGVhdENvdW50ICsgMSwgZW50cnktPmRvd25UaW1lKTsKIAogICAgICAgICBtS2V5UmVwZWF0U3RhdGUubGFzdEtleUVudHJ5ID0gbmV3RW50cnk7CiAgICAgICAgIG1BbGxvY2F0b3IucmVsZWFzZUtleUVudHJ5KGVudHJ5KTsKQEAgLTMxNCw2ICszMTMsMTAgQEAKICAgICAgICAgZW50cnkgPSBuZXdFbnRyeTsKICAgICB9CiAKKyAgICBpZiAoZW50cnktPnJlcGVhdENvdW50ID09IDEpIHsKKyAgICAgICAgZW50cnktPmZsYWdzIHw9IEtFWV9FVkVOVF9GTEFHX0xPTkdfUFJFU1M7CisgICAgfQorCiAgICAgbUtleVJlcGVhdFN0YXRlLm5leHRSZXBlYXRUaW1lID0gY3VycmVudFRpbWUgKyBrZXlSZXBlYXRUaW1lb3V0OwogCiAjaWYgREVCVUdfT1VUQk9VTkRfRVZFTlRfREVUQUlMUwpkaWZmIC0tZ2l0IGEvbGlicy91aS9JbnB1dFJlYWRlci5jcHAgYi9saWJzL3VpL0lucHV0UmVhZGVyLmNwcAppbmRleCA4OTkwMjdjLi4wYTIxZGI3IDEwMDY0NAotLS0gYS9saWJzL3VpL0lucHV0UmVhZGVyLmNwcAorKysgYi9saWJzL3VpL0lucHV0UmVhZGVyLmNwcApAQCAtMzMsMTggKzMzLDYgQEAKIC8qKiBBbW91bnQgdGhhdCB0cmFja2JhbGwgbmVlZHMgdG8gbW92ZSBpbiBvcmRlciB0byBnZW5lcmF0ZSBhIGtleSBldmVudC4gKi8KICNkZWZpbmUgVFJBQ0tCQUxMX01PVkVNRU5UX1RIUkVTSE9MRCA2CiAKLS8qIFNsb3AgZGlzdGFuY2UgZm9yIGp1bXB5IHBvaW50ZXIgZGV0ZWN0aW9uLgotICogVGhlIHZlcnRpY2FsIHJhbmdlIG9mIHRoZSBzY3JlZW4gZGl2aWRlZCBieSB0aGlzIGlzIG91ciBlcHNpbG9uIHZhbHVlLiAqLwotI2RlZmluZSBKVU1QWV9FUFNJTE9OX0RJVklTT1IgMjEyCi0KLS8qIE51bWJlciBvZiBqdW1weSBwb2ludHMgdG8gZHJvcCBmb3IgdG91Y2hzY3JlZW5zIHRoYXQgbmVlZCBpdC4gKi8KLSNkZWZpbmUgSlVNUFlfVFJBTlNJVElPTl9EUk9QUyAzCi0jZGVmaW5lIEpVTVBZX0RST1BfTElNSVQgMwotCi0vKiBNYXhpbXVtIHNxdWFyZWQgZGlzdGFuY2UgZm9yIGF2ZXJhZ2luZy4KLSAqIElmIG1vdmluZyBmYXJ0aGVyIHRoYW4gdGhpcywgdHVybiBvZiBhdmVyYWdpbmcgdG8gYXZvaWQgbGFnIGluIHJlc3BvbnNlLiAqLwotI2RlZmluZSBBVkVSQUdJTkdfRElTVEFOQ0VfTElNSVQgKDc1ICogNzUpCi0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC03MSwxOSArNTksMTkgQEAKIGludDMyX3QgdXBkYXRlTWV0YVN0YXRlKGludDMyX3Qga2V5Q29kZSwgYm9vbCBkb3duLCBpbnQzMl90IG9sZE1ldGFTdGF0ZSkgewogICAgIGludDMyX3QgbWFzazsKICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICBjYXNlIEtFWUNPREVfQUxUX0xFRlQ6CisgICAgY2FzZSBBS0VZQ09ERV9BTFRfTEVGVDoKICAgICAgICAgbWFzayA9IE1FVEFfQUxUX0xFRlRfT047CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgS0VZQ09ERV9BTFRfUklHSFQ6CisgICAgY2FzZSBBS0VZQ09ERV9BTFRfUklHSFQ6CiAgICAgICAgIG1hc2sgPSBNRVRBX0FMVF9SSUdIVF9PTjsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLRVlDT0RFX1NISUZUX0xFRlQ6CisgICAgY2FzZSBBS0VZQ09ERV9TSElGVF9MRUZUOgogICAgICAgICBtYXNrID0gTUVUQV9TSElGVF9MRUZUX09OOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIEtFWUNPREVfU0hJRlRfUklHSFQ6CisgICAgY2FzZSBBS0VZQ09ERV9TSElGVF9SSUdIVDoKICAgICAgICAgbWFzayA9IE1FVEFfU0hJRlRfUklHSFRfT047CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgS0VZQ09ERV9TWU06CisgICAgY2FzZSBBS0VZQ09ERV9TWU06CiAgICAgICAgIG1hc2sgPSBNRVRBX1NZTV9PTjsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTEwNywxMCArOTUsMTAgQEAKIHN0YXRpYyBjb25zdCBpbnQzMl90IGtleUNvZGVSb3RhdGlvbk1hcFtdWzRdID0gewogICAgICAgICAvLyBrZXkgY29kZXMgZW51bWVyYXRlZCBjb3VudGVyLWNsb2Nrd2lzZSB3aXRoIHRoZSBvcmlnaW5hbCAodW5yb3RhdGVkKSBrZXkgZmlyc3QKICAgICAgICAgLy8gbm8gcm90YXRpb24sICAgICAgICA5MCBkZWdyZWUgcm90YXRpb24sICAxODAgZGVncmVlIHJvdGF0aW9uLCAyNzAgZGVncmVlIHJvdGF0aW9uCi0gICAgICAgIHsgS0VZQ09ERV9EUEFEX0RPV04sICAgS0VZQ09ERV9EUEFEX1JJR0hULCAgS0VZQ09ERV9EUEFEX1VQLCAgICAgS0VZQ09ERV9EUEFEX0xFRlQgfSwKLSAgICAgICAgeyBLRVlDT0RFX0RQQURfUklHSFQsICBLRVlDT0RFX0RQQURfVVAsICAgICBLRVlDT0RFX0RQQURfTEVGVCwgICBLRVlDT0RFX0RQQURfRE9XTiB9LAotICAgICAgICB7IEtFWUNPREVfRFBBRF9VUCwgICAgIEtFWUNPREVfRFBBRF9MRUZULCAgIEtFWUNPREVfRFBBRF9ET1dOLCAgIEtFWUNPREVfRFBBRF9SSUdIVCB9LAotICAgICAgICB7IEtFWUNPREVfRFBBRF9MRUZULCAgIEtFWUNPREVfRFBBRF9ET1dOLCAgIEtFWUNPREVfRFBBRF9SSUdIVCwgIEtFWUNPREVfRFBBRF9VUCB9LAorICAgICAgICB7IEFLRVlDT0RFX0RQQURfRE9XTiwgICBBS0VZQ09ERV9EUEFEX1JJR0hULCAgQUtFWUNPREVfRFBBRF9VUCwgICAgIEFLRVlDT0RFX0RQQURfTEVGVCB9LAorICAgICAgICB7IEFLRVlDT0RFX0RQQURfUklHSFQsICBBS0VZQ09ERV9EUEFEX1VQLCAgICAgQUtFWUNPREVfRFBBRF9MRUZULCAgIEFLRVlDT0RFX0RQQURfRE9XTiB9LAorICAgICAgICB7IEFLRVlDT0RFX0RQQURfVVAsICAgICBBS0VZQ09ERV9EUEFEX0xFRlQsICAgQUtFWUNPREVfRFBBRF9ET1dOLCAgIEFLRVlDT0RFX0RQQURfUklHSFQgfSwKKyAgICAgICAgeyBBS0VZQ09ERV9EUEFEX0xFRlQsICAgQUtFWUNPREVfRFBBRF9ET1dOLCAgIEFLRVlDT0RFX0RQQURfUklHSFQsICBBS0VZQ09ERV9EUEFEX1VQIH0sCiB9Owogc3RhdGljIGNvbnN0IGludCBrZXlDb2RlUm90YXRpb25NYXBTaXplID0KICAgICAgICAgc2l6ZW9mKGtleUNvZGVSb3RhdGlvbk1hcCkgLyBzaXplb2Yoa2V5Q29kZVJvdGF0aW9uTWFwWzBdKTsKQEAgLTEyNyw2NDUgKzExNSw2IEBACiB9CiAKIAotLy8gLS0tIElucHV0RGV2aWNlIC0tLQotCi1JbnB1dERldmljZTo6SW5wdXREZXZpY2UoaW50MzJfdCBpZCwgdWludDMyX3QgY2xhc3NlcywgU3RyaW5nOCBuYW1lKSA6Ci0gICAgaWQoaWQpLCBjbGFzc2VzKGNsYXNzZXMpLCBuYW1lKG5hbWUpLCBpZ25vcmVkKGZhbHNlKSB7Ci19Ci0KLXZvaWQgSW5wdXREZXZpY2U6OnJlc2V0KCkgewotICAgIGlmIChpc0tleWJvYXJkKCkpIHsKLSAgICAgICAga2V5Ym9hcmQucmVzZXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNUcmFja2JhbGwoKSkgewotICAgICAgICB0cmFja2JhbGwucmVzZXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNNdWx0aVRvdWNoU2NyZWVuKCkpIHsKLSAgICAgICAgbXVsdGlUb3VjaFNjcmVlbi5yZXNldCgpOwotICAgIH0gZWxzZSBpZiAoaXNTaW5nbGVUb3VjaFNjcmVlbigpKSB7Ci0gICAgICAgIHNpbmdsZVRvdWNoU2NyZWVuLnJlc2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKGlzVG91Y2hTY3JlZW4oKSkgewotICAgICAgICB0b3VjaFNjcmVlbi5yZXNldCgpOwotICAgIH0KLX0KLQotCi0vLyAtLS0gSW5wdXREZXZpY2U6OlRvdWNoRGF0YSAtLS0KLQotdm9pZCBJbnB1dERldmljZTo6VG91Y2hEYXRhOjpjb3B5RnJvbShjb25zdCBUb3VjaERhdGEmIG90aGVyKSB7Ci0gICAgcG9pbnRlckNvdW50ID0gb3RoZXIucG9pbnRlckNvdW50OwotICAgIGlkQml0cyA9IG90aGVyLmlkQml0czsKLQotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwb2ludGVyQ291bnQ7IGkrKykgewotICAgICAgICBwb2ludGVyc1tpXSA9IG90aGVyLnBvaW50ZXJzW2ldOwotICAgICAgICBpZFRvSW5kZXhbaV0gPSBvdGhlci5pZFRvSW5kZXhbaV07Ci0gICAgfQotfQotCi0KLS8vIC0tLSBJbnB1dERldmljZTo6S2V5Ym9hcmRTdGF0ZSAtLS0KLQotdm9pZCBJbnB1dERldmljZTo6S2V5Ym9hcmRTdGF0ZTo6cmVzZXQoKSB7Ci0gICAgY3VycmVudC5tZXRhU3RhdGUgPSBNRVRBX05PTkU7Ci0gICAgY3VycmVudC5kb3duVGltZSA9IDA7Ci19Ci0KLQotLy8gLS0tIElucHV0RGV2aWNlOjpUcmFja2JhbGxTdGF0ZSAtLS0KLQotdm9pZCBJbnB1dERldmljZTo6VHJhY2tiYWxsU3RhdGU6OnJlc2V0KCkgewotICAgIGFjY3VtdWxhdG9yLmNsZWFyKCk7Ci0gICAgY3VycmVudC5kb3duID0gZmFsc2U7Ci0gICAgY3VycmVudC5kb3duVGltZSA9IDA7Ci19Ci0KLQotLy8gLS0tIElucHV0RGV2aWNlOjpUb3VjaFNjcmVlblN0YXRlIC0tLQotCi12b2lkIElucHV0RGV2aWNlOjpUb3VjaFNjcmVlblN0YXRlOjpyZXNldCgpIHsKLSAgICBsYXN0VG91Y2guY2xlYXIoKTsKLSAgICBkb3duVGltZSA9IDA7Ci0gICAgY3VycmVudFZpcnR1YWxLZXkuZG93biA9IGZhbHNlOwotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9QT0lOVEVSUzsgaSsrKSB7Ci0gICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlTdGFydFtpXSA9IDA7Ci0gICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlFbmRbaV0gPSAwOwotICAgIH0KLQotICAgIGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkID0gMDsKLX0KLQotc3RydWN0IFBvaW50ZXJEaXN0YW5jZUhlYXBFbGVtZW50IHsKLSAgICB1aW50MzJfdCBjdXJyZW50UG9pbnRlckluZGV4IDogODsKLSAgICB1aW50MzJfdCBsYXN0UG9pbnRlckluZGV4IDogODsKLSAgICB1aW50NjRfdCBkaXN0YW5jZSA6IDQ4OyAvLyBzcXVhcmVkIGRpc3RhbmNlCi19OwotCi12b2lkIElucHV0RGV2aWNlOjpUb3VjaFNjcmVlblN0YXRlOjpjYWxjdWxhdGVQb2ludGVySWRzKCkgewotICAgIHVpbnQzMl90IGN1cnJlbnRQb2ludGVyQ291bnQgPSBjdXJyZW50VG91Y2gucG9pbnRlckNvdW50OwotICAgIHVpbnQzMl90IGxhc3RQb2ludGVyQ291bnQgPSBsYXN0VG91Y2gucG9pbnRlckNvdW50OwotCi0gICAgaWYgKGN1cnJlbnRQb2ludGVyQ291bnQgPT0gMCkgewotICAgICAgICAvLyBObyBwb2ludGVycyB0byBhc3NpZ24uCi0gICAgICAgIGN1cnJlbnRUb3VjaC5pZEJpdHMuY2xlYXIoKTsKLSAgICB9IGVsc2UgaWYgKGxhc3RQb2ludGVyQ291bnQgPT0gMCkgewotICAgICAgICAvLyBBbGwgcG9pbnRlcnMgYXJlIG5ldy4KLSAgICAgICAgY3VycmVudFRvdWNoLmlkQml0cy5jbGVhcigpOwotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3VycmVudFBvaW50ZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbaV0uaWQgPSBpOwotICAgICAgICAgICAgY3VycmVudFRvdWNoLmlkVG9JbmRleFtpXSA9IGk7Ci0gICAgICAgICAgICBjdXJyZW50VG91Y2guaWRCaXRzLm1hcmtCaXQoaSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGN1cnJlbnRQb2ludGVyQ291bnQgPT0gMSAmJiBsYXN0UG9pbnRlckNvdW50ID09IDEpIHsKLSAgICAgICAgLy8gT25seSBvbmUgcG9pbnRlciBhbmQgbm8gY2hhbmdlIGluIGNvdW50IHNvIGl0IG11c3QgaGF2ZSB0aGUgc2FtZSBpZCBhcyBiZWZvcmUuCi0gICAgICAgIHVpbnQzMl90IGlkID0gbGFzdFRvdWNoLnBvaW50ZXJzWzBdLmlkOwotICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbMF0uaWQgPSBpZDsKLSAgICAgICAgY3VycmVudFRvdWNoLmlkVG9JbmRleFtpZF0gPSAwOwotICAgICAgICBjdXJyZW50VG91Y2guaWRCaXRzLnZhbHVlID0gQml0U2V0MzI6OnZhbHVlRm9yQml0KGlkKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBHZW5lcmFsIGNhc2UuCi0gICAgICAgIC8vIFdlIGJ1aWxkIGEgaGVhcCBvZiBzcXVhcmVkIGV1Y2xpZGVhbiBkaXN0YW5jZXMgYmV0d2VlbiBjdXJyZW50IGFuZCBsYXN0IHBvaW50ZXJzCi0gICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBhbmQgbGFzdCBwb2ludGVyIGluZGljZXMuICBUaGVuLCB3ZSBmaW5kIHRoZSBiZXN0Ci0gICAgICAgIC8vIG1hdGNoIChieSBkaXN0YW5jZSkgZm9yIGVhY2ggY3VycmVudCBwb2ludGVyLgotICAgICAgICBQb2ludGVyRGlzdGFuY2VIZWFwRWxlbWVudCBoZWFwW01BWF9QT0lOVEVSUyAqIE1BWF9QT0lOVEVSU107Ci0KLSAgICAgICAgdWludDMyX3QgaGVhcFNpemUgPSAwOwotICAgICAgICBmb3IgKHVpbnQzMl90IGN1cnJlbnRQb2ludGVySW5kZXggPSAwOyBjdXJyZW50UG9pbnRlckluZGV4IDwgY3VycmVudFBvaW50ZXJDb3VudDsKLSAgICAgICAgICAgICAgICBjdXJyZW50UG9pbnRlckluZGV4KyspIHsKLSAgICAgICAgICAgIGZvciAodWludDMyX3QgbGFzdFBvaW50ZXJJbmRleCA9IDA7IGxhc3RQb2ludGVySW5kZXggPCBsYXN0UG9pbnRlckNvdW50OwotICAgICAgICAgICAgICAgICAgICBsYXN0UG9pbnRlckluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbHRhWCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50UG9pbnRlckluZGV4XS54Ci0gICAgICAgICAgICAgICAgICAgICAgICAtIGxhc3RUb3VjaC5wb2ludGVyc1tsYXN0UG9pbnRlckluZGV4XS54OwotICAgICAgICAgICAgICAgIGludDY0X3QgZGVsdGFZID0gY3VycmVudFRvdWNoLnBvaW50ZXJzW2N1cnJlbnRQb2ludGVySW5kZXhdLnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gbGFzdFRvdWNoLnBvaW50ZXJzW2xhc3RQb2ludGVySW5kZXhdLnk7Ci0KLSAgICAgICAgICAgICAgICB1aW50NjRfdCBkaXN0YW5jZSA9IHVpbnQ2NF90KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbnNlcnQgbmV3IGVsZW1lbnQgaW50byB0aGUgaGVhcCAoc2lmdCB1cCkuCi0gICAgICAgICAgICAgICAgaGVhcFtoZWFwU2l6ZV0uY3VycmVudFBvaW50ZXJJbmRleCA9IGN1cnJlbnRQb2ludGVySW5kZXg7Ci0gICAgICAgICAgICAgICAgaGVhcFtoZWFwU2l6ZV0ubGFzdFBvaW50ZXJJbmRleCA9IGxhc3RQb2ludGVySW5kZXg7Ci0gICAgICAgICAgICAgICAgaGVhcFtoZWFwU2l6ZV0uZGlzdGFuY2UgPSBkaXN0YW5jZTsKLSAgICAgICAgICAgICAgICBoZWFwU2l6ZSArPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGVhcGlmeQotICAgICAgICBmb3IgKHVpbnQzMl90IHN0YXJ0SW5kZXggPSBoZWFwU2l6ZSAvIDI7IHN0YXJ0SW5kZXggIT0gMDsgKSB7Ci0gICAgICAgICAgICBzdGFydEluZGV4IC09IDE7Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IHBhcmVudEluZGV4ID0gc3RhcnRJbmRleDsgOykgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoaWxkSW5kZXggPSBwYXJlbnRJbmRleCAqIDIgKyAxOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID49IGhlYXBTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ICsgMSA8IGhlYXBTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBoZWFwW2NoaWxkSW5kZXggKyAxXS5kaXN0YW5jZSA8IGhlYXBbY2hpbGRJbmRleF0uZGlzdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRJbmRleCArPSAxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChoZWFwW3BhcmVudEluZGV4XS5kaXN0YW5jZSA8PSBoZWFwW2NoaWxkSW5kZXhdLmRpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN3YXAoaGVhcFtwYXJlbnRJbmRleF0sIGhlYXBbY2hpbGRJbmRleF0pOwotICAgICAgICAgICAgICAgIHBhcmVudEluZGV4ID0gY2hpbGRJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0jaWYgREVCVUdfUE9JTlRFUl9BU1NJR05NRU5UCi0gICAgICAgIExPR0QoImNhbGN1bGF0ZVBvaW50ZXJJZHMgLSBpbml0aWFsIGRpc3RhbmNlIG1pbi1oZWFwOiBzaXplPSVkIiwgaGVhcFNpemUpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlYXBTaXplOyBpKyspIHsKLSAgICAgICAgICAgIExPR0QoIiAgaGVhcFslZF06IGN1cj0lZCwgbGFzdD0lZCwgZGlzdGFuY2U9JWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIGksIGhlYXBbaV0uY3VycmVudFBvaW50ZXJJbmRleCwgaGVhcFtpXS5sYXN0UG9pbnRlckluZGV4LAotICAgICAgICAgICAgICAgICAgICBoZWFwW2ldLmRpc3RhbmNlKTsKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgLy8gUHVsbCBtYXRjaGVzIG91dCBieSBpbmNyZWFzaW5nIG9yZGVyIG9mIGRpc3RhbmNlLgotICAgICAgICAvLyBUbyBhdm9pZCByZWFzc2lnbmluZyBwb2ludGVycyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIG1hdGNoZWQsIHRoZSBsb29wIGtlZXBzIHRyYWNrCi0gICAgICAgIC8vIG9mIHdoaWNoIGxhc3QgYW5kIGN1cnJlbnQgcG9pbnRlcnMgaGF2ZSBiZWVuIG1hdGNoZWQgdXNpbmcgdGhlIG1hdGNoZWRYWFhCaXRzIHZhcmlhYmxlcy4KLSAgICAgICAgLy8gSXQgYWxzbyB0cmFja3MgdGhlIHVzZWQgcG9pbnRlciBpZCBiaXRzLgotICAgICAgICBCaXRTZXQzMiBtYXRjaGVkTGFzdEJpdHMoMCk7Ci0gICAgICAgIEJpdFNldDMyIG1hdGNoZWRDdXJyZW50Qml0cygwKTsKLSAgICAgICAgQml0U2V0MzIgdXNlZElkQml0cygwKTsKLSAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAodWludDMyX3QgaSA9IG1pbihjdXJyZW50UG9pbnRlckNvdW50LCBsYXN0UG9pbnRlckNvdW50KTsgaSA+IDA7IGktLSkgewotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wLCB3ZSBqdXN0IGNvbnN1bWUgdGhlIHJvb3QgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaGVhcCAodGhlIG9uZSB3aXRoIHNtYWxsZXN0IGRpc3RhbmNlKS4KLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBpdGVyYXRpb25zIGNvbnN1bWVkIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGhlYXAuCi0gICAgICAgICAgICAgICAgICAgIC8vIFBvcCByb290IGVsZW1lbnQgb2ZmIG9mIHRoZSBoZWFwIChzaWZ0IGRvd24pLgotICAgICAgICAgICAgICAgICAgICBoZWFwU2l6ZSAtPSAxOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoaGVhcFNpemUgPiAwKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTaWZ0IGRvd24uCi0gICAgICAgICAgICAgICAgICAgIGhlYXBbMF0gPSBoZWFwW2hlYXBTaXplXTsKLSAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBwYXJlbnRJbmRleCA9IDA7IDspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoaWxkSW5kZXggPSBwYXJlbnRJbmRleCAqIDIgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggPj0gaGVhcFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggKyAxIDwgaGVhcFNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGVhcFtjaGlsZEluZGV4ICsgMV0uZGlzdGFuY2UgPCBoZWFwW2NoaWxkSW5kZXhdLmRpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRJbmRleCArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhcFtwYXJlbnRJbmRleF0uZGlzdGFuY2UgPD0gaGVhcFtjaGlsZEluZGV4XS5kaXN0YW5jZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2FwKGhlYXBbcGFyZW50SW5kZXhdLCBoZWFwW2NoaWxkSW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEluZGV4ID0gY2hpbGRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0jaWYgREVCVUdfUE9JTlRFUl9BU1NJR05NRU5UCi0gICAgICAgICAgICAgICAgICAgIExPR0QoImNhbGN1bGF0ZVBvaW50ZXJJZHMgLSByZWR1Y2VkIGRpc3RhbmNlIG1pbi1oZWFwOiBzaXplPSVkIiwgaGVhcFNpemUpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlYXBTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0QoIiAgaGVhcFslZF06IGN1cj0lZCwgbGFzdD0lZCwgZGlzdGFuY2U9JWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGhlYXBbaV0uY3VycmVudFBvaW50ZXJJbmRleCwgaGVhcFtpXS5sYXN0UG9pbnRlckluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwW2ldLmRpc3RhbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudFBvaW50ZXJJbmRleCA9IGhlYXBbMF0uY3VycmVudFBvaW50ZXJJbmRleDsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEN1cnJlbnRCaXRzLmhhc0JpdChjdXJyZW50UG9pbnRlckluZGV4KSkgY29udGludWU7IC8vIGFscmVhZHkgbWF0Y2hlZAotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgbGFzdFBvaW50ZXJJbmRleCA9IGhlYXBbMF0ubGFzdFBvaW50ZXJJbmRleDsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZExhc3RCaXRzLmhhc0JpdChsYXN0UG9pbnRlckluZGV4KSkgY29udGludWU7IC8vIGFscmVhZHkgbWF0Y2hlZAotCi0gICAgICAgICAgICAgICAgbWF0Y2hlZEN1cnJlbnRCaXRzLm1hcmtCaXQoY3VycmVudFBvaW50ZXJJbmRleCk7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlZExhc3RCaXRzLm1hcmtCaXQobGFzdFBvaW50ZXJJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCA9IGxhc3RUb3VjaC5wb2ludGVyc1tsYXN0UG9pbnRlckluZGV4XS5pZDsKLSAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudFBvaW50ZXJJbmRleF0uaWQgPSBpZDsKLSAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2guaWRUb0luZGV4W2lkXSA9IGN1cnJlbnRQb2ludGVySW5kZXg7Ci0gICAgICAgICAgICAgICAgdXNlZElkQml0cy5tYXJrQml0KGlkKTsKLQotI2lmIERFQlVHX1BPSU5URVJfQVNTSUdOTUVOVAotICAgICAgICAgICAgICAgIExPR0QoImNhbGN1bGF0ZVBvaW50ZXJJZHMgLSBtYXRjaGVkOiBjdXI9JWQsIGxhc3Q9JWQsIGlkPSVkLCBkaXN0YW5jZT0lbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQb2ludGVySW5kZXgsIGN1cnJlbnRQb2ludGVySW5kZXgsIGlkLCBoZWFwWzBdLmRpc3RhbmNlKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXNzaWduIGZyZXNoIGlkcyB0byBuZXcgcG9pbnRlcnMuCi0gICAgICAgIGlmIChjdXJyZW50UG9pbnRlckNvdW50ID4gbGFzdFBvaW50ZXJDb3VudCkgewotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gY3VycmVudFBvaW50ZXJDb3VudCAtIGxhc3RQb2ludGVyQ291bnQ7IDspIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50UG9pbnRlckluZGV4ID0gbWF0Y2hlZEN1cnJlbnRCaXRzLmZpcnN0VW5tYXJrZWRCaXQoKTsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCA9IHVzZWRJZEJpdHMuZmlyc3RVbm1hcmtlZEJpdCgpOwotCi0gICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2N1cnJlbnRQb2ludGVySW5kZXhdLmlkID0gaWQ7Ci0gICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLmlkVG9JbmRleFtpZF0gPSBjdXJyZW50UG9pbnRlckluZGV4OwotICAgICAgICAgICAgICAgIHVzZWRJZEJpdHMubWFya0JpdChpZCk7Ci0KLSNpZiBERUJVR19QT0lOVEVSX0FTU0lHTk1FTlQKLSAgICAgICAgICAgICAgICBMT0dEKCJjYWxjdWxhdGVQb2ludGVySWRzIC0gYXNzaWduZWQ6IGN1cj0lZCwgaWQ9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvaW50ZXJJbmRleCwgaWQpOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBpZiAoLS1pID09IDApIGJyZWFrOyAvLyBkb25lCi0gICAgICAgICAgICAgICAgbWF0Y2hlZEN1cnJlbnRCaXRzLm1hcmtCaXQoY3VycmVudFBvaW50ZXJJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaXggaWQgYml0cy4KLSAgICAgICAgY3VycmVudFRvdWNoLmlkQml0cyA9IHVzZWRJZEJpdHM7Ci0gICAgfQotfQotCi0vKiBTcGVjaWFsIGhhY2sgZm9yIGRldmljZXMgdGhhdCBoYXZlIGJhZCBzY3JlZW4gZGF0YTogaWYgb25lIG9mIHRoZQotICogcG9pbnRzIGhhcyBtb3ZlZCBtb3JlIHRoYW4gYSBzY3JlZW4gaGVpZ2h0IGZyb20gdGhlIGxhc3QgcG9zaXRpb24sCi0gKiB0aGVuIGRyb3AgaXQuICovCi1ib29sIElucHV0RGV2aWNlOjpUb3VjaFNjcmVlblN0YXRlOjphcHBseUJhZFRvdWNoRmlsdGVyKCkgewotICAgIC8vIFRoaXMgaGFjayByZXF1aXJlcyB2YWxpZCBheGlzIHBhcmFtZXRlcnMuCi0gICAgaWYgKCEgcGFyYW1ldGVycy55QXhpcy52YWxpZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdWludDMyX3QgcG9pbnRlckNvdW50ID0gY3VycmVudFRvdWNoLnBvaW50ZXJDb3VudDsKLQotICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cy4KLSAgICBpZiAocG9pbnRlckNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGEgZmluZ2VyIGlzIGdvaW5nIGRvd24gb3IgdXAuICBXZSBydW4KLSAgICAvLyBoZXJlIGJlZm9yZSBhc3NpZ25pbmcgcG9pbnRlciBJRHMsIHNvIHRoZXJlIGlzbid0IGEgZ29vZAotICAgIC8vIHdheSB0byBkbyBwZXItZmluZ2VyIG1hdGNoaW5nLgotICAgIGlmIChwb2ludGVyQ291bnQgIT0gbGFzdFRvdWNoLnBvaW50ZXJDb3VudCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gV2UgY29uc2lkZXIgYSBzaW5nbGUgbW92ZW1lbnQgYWNyb3NzIG1vcmUgdGhhbiBhIDcvMTYgb2YKLSAgICAvLyB0aGUgbG9uZyBzaXplIG9mIHRoZSBzY3JlZW4gdG8gYmUgYmFkLiAgVGhpcyB3YXMgYSBtYWdpYyB2YWx1ZQotICAgIC8vIGRldGVybWluZWQgYnkgbG9va2luZyBhdCB0aGUgbWF4aW11bSBkaXN0YW5jZSBpdCBpcyBmZWFzaWJsZQotICAgIC8vIHRvIGFjdHVhbGx5IG1vdmUgaW4gb25lIHNhbXBsZS4KLSAgICBpbnQzMl90IG1heERlbHRhWSA9IHBhcmFtZXRlcnMueUF4aXMucmFuZ2UgKiA3IC8gMTY7Ci0KLSAgICAvLyBYWFggVGhlIG9yaWdpbmFsIGNvZGUgaW4gSW5wdXREZXZpY2UuamF2YSBpbmNsdWRlZCBjb21tZW50ZWQgb3V0Ci0gICAgLy8gICAgIGNvZGUgZm9yIHRlc3RpbmcgdGhlIFggYXhpcy4gIE5vdGUgdGhhdCB3aGVuIHdlIGRyb3AgYSBwb2ludAotICAgIC8vICAgICB3ZSBkb24ndCBhY3R1YWxseSByZXN0b3JlIHRoZSBvbGQgWCBlaXRoZXIuICBTdHJhbmdlLgotICAgIC8vICAgICBUaGUgb2xkIGNvZGUgYWxzbyB0cmllcyB0byB0cmFjayB3aGVuIGJhZCBwb2ludHMgd2VyZSBwcmV2aW91c2x5Ci0gICAgLy8gICAgIGRldGVjdGVkIGJ1dCBpdCB0dXJucyBvdXQgdGhhdCBkdWUgdG8gdGhlIHBsYWNlbWVudCBvZiBhICJicmVhayIKLSAgICAvLyAgICAgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCwgd2UgbmV2ZXIgc2V0IG1Ecm9wcGVkQmFkUG9pbnQgdG8gdHJ1ZQotICAgIC8vICAgICBzbyBpdCBpcyBlZmZlY3RpdmVseSBkZWFkIGNvZGUuCi0gICAgLy8gTmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBvbGQgY29kZSBpcyBidXN0ZWQgb3IganVzdCBvdmVyY29tcGxpY2F0ZWQKLSAgICAvLyBidXQgd29ya2luZyBhcyBpbnRlbmRlZC4KLQotICAgIC8vIExvb2sgdGhyb3VnaCBhbGwgbmV3IHBvaW50cyBhbmQgc2VlIGlmIGFueSBhcmUgZmFydGhlciB0aGFuCi0gICAgLy8gYWNjZXB0YWJsZSBmcm9tIGFsbCBwcmV2aW91cyBwb2ludHMuCi0gICAgZm9yICh1aW50MzJfdCBpID0gcG9pbnRlckNvdW50OyBpLS0gPiAwOyApIHsKLSAgICAgICAgaW50MzJfdCB5ID0gY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLnk7Ci0gICAgICAgIGludDMyX3QgY2xvc2VzdFkgPSBJTlRfTUFYOwotICAgICAgICBpbnQzMl90IGNsb3Nlc3REZWx0YVkgPSAwOwotCi0jaWYgREVCVUdfSEFDS1MKLSAgICAgICAgTE9HRCgiQmFkVG91Y2hGaWx0ZXI6IExvb2tpbmcgYXQgbmV4dCBwb2ludCAjJWQ6IHk9JWQiLCBpLCB5KTsKLSNlbmRpZgotCi0gICAgICAgIGZvciAodWludDMyX3QgaiA9IHBvaW50ZXJDb3VudDsgai0tID4gMDsgKSB7Ci0gICAgICAgICAgICBpbnQzMl90IGxhc3RZID0gbGFzdFRvdWNoLnBvaW50ZXJzW2pdLnk7Ci0gICAgICAgICAgICBpbnQzMl90IGRlbHRhWSA9IGFicyh5IC0gbGFzdFkpOwotCi0jaWYgREVCVUdfSEFDS1MKLSAgICAgICAgICAgIExPR0QoIkJhZFRvdWNoRmlsdGVyOiBDb21wYXJpbmcgd2l0aCBsYXN0IHBvaW50ICMlZDogeT0lZCBkZWx0YVk9JWQiLAotICAgICAgICAgICAgICAgICAgICBqLCBsYXN0WSwgZGVsdGFZKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBpZiAoZGVsdGFZIDwgbWF4RGVsdGFZKSB7Ci0gICAgICAgICAgICAgICAgZ290byBTa2lwU3VmZmljaWVudGx5Q2xvc2VQb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWx0YVkgPCBjbG9zZXN0RGVsdGFZKSB7Ci0gICAgICAgICAgICAgICAgY2xvc2VzdERlbHRhWSA9IGRlbHRhWTsKLSAgICAgICAgICAgICAgICBjbG9zZXN0WSA9IGxhc3RZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTXVzdCBub3QgaGF2ZSBmb3VuZCBhIGNsb3NlIGVub3VnaCBtYXRjaC4KLSNpZiBERUJVR19IQUNLUwotICAgICAgICBMT0dEKCJCYWRUb3VjaEZpbHRlcjogRHJvcHBpbmcgYmFkIHBvaW50ICMlZDogbmV3WT0lZCBvbGRZPSVkIGRlbHRhWT0lZCBtYXhEZWx0YVk9JWQiLAotICAgICAgICAgICAgICAgIGksIHksIGNsb3Nlc3RZLCBjbG9zZXN0RGVsdGFZLCBtYXhEZWx0YVkpOwotI2VuZGlmCi0KLSAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLnkgPSBjbG9zZXN0WTsKLSAgICAgICAgcmV0dXJuIHRydWU7IC8vIFhYWCBvcmlnaW5hbCBjb2RlIG9ubHkgY29ycmVjdHMgb25lIHBvaW50Ci0KLSAgICBTa2lwU3VmZmljaWVudGx5Q2xvc2VQb2ludDogOwotICAgIH0KLQotICAgIC8vIE5vIGNoYW5nZS4KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNwZWNpYWwgaGFjayBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgYmFkIHNjcmVlbiBkYXRhOiBkcm9wIHBvaW50cyB3aGVyZQotICogdGhlIGNvb3JkaW5hdGUgdmFsdWUgZm9yIG9uZSBheGlzIGhhcyBqdW1wZWQgdG8gdGhlIG90aGVyIHBvaW50ZXIncyBsb2NhdGlvbi4KLSAqLwotYm9vbCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6YXBwbHlKdW1weVRvdWNoRmlsdGVyKCkgewotICAgIC8vIFRoaXMgaGFjayByZXF1aXJlcyB2YWxpZCBheGlzIHBhcmFtZXRlcnMuCi0gICAgaWYgKCEgcGFyYW1ldGVycy55QXhpcy52YWxpZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdWludDMyX3QgcG9pbnRlckNvdW50ID0gY3VycmVudFRvdWNoLnBvaW50ZXJDb3VudDsKLSAgICBpZiAobGFzdFRvdWNoLnBvaW50ZXJDb3VudCAhPSBwb2ludGVyQ291bnQpIHsKLSNpZiBERUJVR19IQUNLUwotICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBEaWZmZXJlbnQgcG9pbnRlciBjb3VudCAlZCAtPiAlZCIsCi0gICAgICAgICAgICAgICAgbGFzdFRvdWNoLnBvaW50ZXJDb3VudCwgcG9pbnRlckNvdW50KTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBvaW50ZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBMT0dEKCIgIFBvaW50ZXIgJWQgKCVkLCAlZCkiLCBpLAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbaV0ueCwgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLnkpOwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICBpZiAoanVtcHlUb3VjaEZpbHRlci5qdW1weVBvaW50c0Ryb3BwZWQgPCBKVU1QWV9UUkFOU0lUSU9OX0RST1BTKSB7Ci0gICAgICAgICAgICBpZiAobGFzdFRvdWNoLnBvaW50ZXJDb3VudCA9PSAxICYmIHBvaW50ZXJDb3VudCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgLy8gSnVzdCBkcm9wIHRoZSBmaXJzdCBmZXcgZXZlbnRzIGdvaW5nIGZyb20gMSB0byAyIHBvaW50ZXJzLgotICAgICAgICAgICAgICAgIC8vIFRoZXkncmUgYmFkIG9mdGVuIGVub3VnaCB0aGF0IHRoZXkncmUgbm90IHdvcnRoIGNvbnNpZGVyaW5nLgotICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQgPSAxOwotICAgICAgICAgICAgICAgIGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkICs9IDE7Ci0KLSNpZiBERUJVR19IQUNLUwotICAgICAgICAgICAgICAgIExPR0QoIkp1bXB5VG91Y2hGaWx0ZXI6IFBvaW50ZXIgMiBkcm9wcGVkIik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdFRvdWNoLnBvaW50ZXJDb3VudCA9PSAyICYmIHBvaW50ZXJDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGV2ZW50IHdoZW4gd2UgZ28gZnJvbSAyIC0+IDEgdGVuZHMgdG8gYmUgbWVzc2VkIHVwIHRvbwotICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQgPSAyOwotICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1swXSA9IGxhc3RUb3VjaC5wb2ludGVyc1swXTsKLSAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbMV0gPSBsYXN0VG91Y2gucG9pbnRlcnNbMV07Ci0gICAgICAgICAgICAgICAganVtcHlUb3VjaEZpbHRlci5qdW1weVBvaW50c0Ryb3BwZWQgKz0gMTsKLQotI2lmIERFQlVHX0hBQ0tTCi0gICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0QoIkp1bXB5VG91Y2hGaWx0ZXI6IFBvaW50ZXIgJWQgcmVwbGFjZWQgKCVkLCAlZCkiLCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS54LCBjdXJyZW50VG91Y2gucG9pbnRlcnNbaV0ueSk7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVzZXQganVtcHkgcG9pbnRzIGRyb3BwZWQgb24gb3RoZXIgdHJhbnNpdGlvbnMgb3IgaWYgbGltaXQgZXhjZWVkZWQuCi0gICAgICAgIGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkID0gMDsKLQotI2lmIERFQlVHX0hBQ0tTCi0gICAgICAgIExPR0QoIkp1bXB5VG91Y2hGaWx0ZXI6IFRyYW5zaXRpb24gLSBkcm9wIGxpbWl0IHJlc2V0Iik7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFdlIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHBvaW50ZXJzIGFzIGxhc3QgdGltZS4KLSAgICAvLyBBICdqdW1weScgcG9pbnQgaXMgb25lIHdoZXJlIHRoZSBjb29yZGluYXRlIHZhbHVlIGZvciBvbmUgYXhpcwotICAgIC8vIGhhcyBqdW1wZWQgdG8gdGhlIG90aGVyIHBvaW50ZXIncyBsb2NhdGlvbi4gTm8gbmVlZCB0byBkbyBhbnl0aGluZwotICAgIC8vIGVsc2UgaWYgd2Ugb25seSBoYXZlIG9uZSBwb2ludGVyLgotICAgIGlmIChwb2ludGVyQ291bnQgPCAyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoanVtcHlUb3VjaEZpbHRlci5qdW1weVBvaW50c0Ryb3BwZWQgPCBKVU1QWV9EUk9QX0xJTUlUKSB7Ci0gICAgICAgIGludCBqdW1weUVwc2lsb24gPSBwYXJhbWV0ZXJzLnlBeGlzLnJhbmdlIC8gSlVNUFlfRVBTSUxPTl9ESVZJU09SOwotCi0gICAgICAgIC8vIFdlIG9ubHkgcmVwbGFjZSB0aGUgc2luZ2xlIHdvcnN0IGp1bXB5IHBvaW50IGFzIGNoYXJhY3Rlcml6ZWQgYnkgcG9pbnRlciBkaXN0YW5jZQotICAgICAgICAvLyBpbiBhIHNpbmdsZSBheGlzLgotICAgICAgICBpbnQzMl90IGJhZFBvaW50ZXJJbmRleCA9IC0xOwotICAgICAgICBpbnQzMl90IGJhZFBvaW50ZXJSZXBsYWNlbWVudEluZGV4ID0gLTE7Ci0gICAgICAgIGludDMyX3QgYmFkUG9pbnRlckRpc3RhbmNlID0gSU5UX01JTjsgLy8gZGlzdGFuY2UgdG8gYmUgY29ycmVjdGVkCi0KLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gcG9pbnRlckNvdW50OyBpLS0gPiAwOyApIHsKLSAgICAgICAgICAgIGludDMyX3QgeCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS54OwotICAgICAgICAgICAgaW50MzJfdCB5ID0gY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLnk7Ci0KLSNpZiBERUJVR19IQUNLUwotICAgICAgICAgICAgTE9HRCgiSnVtcHlUb3VjaEZpbHRlcjogUG9pbnQgJWQgKCVkLCAlZCkiLCBpLCB4LCB5KTsKLSNlbmRpZgotCi0gICAgICAgICAgICAvLyBDaGVjayBpZiBhIHRvdWNoIHBvaW50IGlzIHRvbyBjbG9zZSB0byBhbm90aGVyJ3MgY29vcmRpbmF0ZXMKLSAgICAgICAgICAgIGJvb2wgZHJvcFggPSBmYWxzZSwgZHJvcFkgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwb2ludGVyQ291bnQ7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChpID09IGopIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGFicyh4IC0gY3VycmVudFRvdWNoLnBvaW50ZXJzW2pdLngpIDw9IGp1bXB5RXBzaWxvbikgewotICAgICAgICAgICAgICAgICAgICBkcm9wWCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChhYnMoeSAtIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tqXS55KSA8PSBqdW1weUVwc2lsb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZHJvcFkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoISBkcm9wWCAmJiAhIGRyb3BZKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5vdCBqdW1weQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGaW5kIGEgcmVwbGFjZW1lbnQgY2FuZGlkYXRlIGJ5IGNvbXBhcmluZyB3aXRoIG9sZGVyIHBvaW50cyBvbiB0aGUKLSAgICAgICAgICAgIC8vIGNvbXBsZW1lbnRhcnkgKG5vbi1qdW1weSkgYXhpcy4KLSAgICAgICAgICAgIGludDMyX3QgZGlzdGFuY2UgPSBJTlRfTUlOOyAvLyBkaXN0YW5jZSB0byBiZSBjb3JyZWN0ZWQKLSAgICAgICAgICAgIGludDMyX3QgcmVwbGFjZW1lbnRJbmRleCA9IC0xOwotCi0gICAgICAgICAgICBpZiAoZHJvcFgpIHsKLSAgICAgICAgICAgICAgICAvLyBYIGxvb2tzIHRvbyBjbG9zZS4gIEZpbmQgYW4gb2xkZXIgcmVwbGFjZW1lbnQgcG9pbnQgd2l0aCBhIGNsb3NlIFkuCi0gICAgICAgICAgICAgICAgaW50MzJfdCBzbWFsbGVzdERlbHRhWSA9IElOVF9NQVg7Ci0gICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBvaW50ZXJDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVsdGFZID0gYWJzKHkgLSBsYXN0VG91Y2gucG9pbnRlcnNbal0ueSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgPCBzbWFsbGVzdERlbHRhWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxlc3REZWx0YVkgPSBkZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudEluZGV4ID0gajsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IGFicyh4IC0gbGFzdFRvdWNoLnBvaW50ZXJzW3JlcGxhY2VtZW50SW5kZXhdLngpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBZIGxvb2tzIHRvbyBjbG9zZS4gIEZpbmQgYW4gb2xkZXIgcmVwbGFjZW1lbnQgcG9pbnQgd2l0aCBhIGNsb3NlIFguCi0gICAgICAgICAgICAgICAgaW50MzJfdCBzbWFsbGVzdERlbHRhWCA9IElOVF9NQVg7Ci0gICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IHBvaW50ZXJDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVsdGFYID0gYWJzKHggLSBsYXN0VG91Y2gucG9pbnRlcnNbal0ueCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggPCBzbWFsbGVzdERlbHRhWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxlc3REZWx0YVggPSBkZWx0YVg7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudEluZGV4ID0gajsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IGFicyh5IC0gbGFzdFRvdWNoLnBvaW50ZXJzW3JlcGxhY2VtZW50SW5kZXhdLnkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiByZXBsYWNpbmcgdGhpcyBwb2ludGVyIHdvdWxkIGNvcnJlY3QgYSB3b3JzZSBlcnJvciB0aGFuIHRoZSBwcmV2aW91cyBvbmVzCi0gICAgICAgICAgICAvLyBjb25zaWRlcmVkLCB0aGVuIHVzZSB0aGlzIHJlcGxhY2VtZW50IGluc3RlYWQuCi0gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiBiYWRQb2ludGVyRGlzdGFuY2UpIHsKLSAgICAgICAgICAgICAgICBiYWRQb2ludGVySW5kZXggPSBpOwotICAgICAgICAgICAgICAgIGJhZFBvaW50ZXJSZXBsYWNlbWVudEluZGV4ID0gcmVwbGFjZW1lbnRJbmRleDsKLSAgICAgICAgICAgICAgICBiYWRQb2ludGVyRGlzdGFuY2UgPSBkaXN0YW5jZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvcnJlY3QgdGhlIGp1bXB5IHBvaW50ZXIgaWYgb25lIHdhcyBmb3VuZC4KLSAgICAgICAgaWYgKGJhZFBvaW50ZXJJbmRleCA+PSAwKSB7Ci0jaWYgREVCVUdfSEFDS1MKLSAgICAgICAgICAgIExPR0QoIkp1bXB5VG91Y2hGaWx0ZXI6IFJlcGxhY2luZyBiYWQgcG9pbnRlciAlZCB3aXRoICglZCwgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgYmFkUG9pbnRlckluZGV4LAotICAgICAgICAgICAgICAgICAgICBsYXN0VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlclJlcGxhY2VtZW50SW5kZXhdLngsCi0gICAgICAgICAgICAgICAgICAgIGxhc3RUb3VjaC5wb2ludGVyc1tiYWRQb2ludGVyUmVwbGFjZW1lbnRJbmRleF0ueSk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2JhZFBvaW50ZXJJbmRleF0ueCA9Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RUb3VjaC5wb2ludGVyc1tiYWRQb2ludGVyUmVwbGFjZW1lbnRJbmRleF0ueDsKLSAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tiYWRQb2ludGVySW5kZXhdLnkgPQotICAgICAgICAgICAgICAgICAgICBsYXN0VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlclJlcGxhY2VtZW50SW5kZXhdLnk7Ci0gICAgICAgICAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCArPSAxOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCA9IDA7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTcGVjaWFsIGhhY2sgZm9yIGRldmljZXMgdGhhdCBoYXZlIGJhZCBzY3JlZW4gZGF0YTogYWdncmVnYXRlIGFuZAotICogY29tcHV0ZSBhdmVyYWdlcyBvZiB0aGUgY29vcmRpbmF0ZSBkYXRhLCB0byByZWR1Y2UgdGhlIGFtb3VudCBvZgotICogaml0dGVyIHNlZW4gYnkgYXBwbGljYXRpb25zLiAqLwotdm9pZCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6YXBwbHlBdmVyYWdpbmdUb3VjaEZpbHRlcigpIHsKLSAgICBmb3IgKHVpbnQzMl90IGN1cnJlbnRJbmRleCA9IDA7IGN1cnJlbnRJbmRleCA8IGN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQ7IGN1cnJlbnRJbmRleCsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGlkID0gY3VycmVudFRvdWNoLnBvaW50ZXJzW2N1cnJlbnRJbmRleF0uaWQ7Ci0gICAgICAgIGludDMyX3QgeCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50SW5kZXhdLng7Ci0gICAgICAgIGludDMyX3QgeSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50SW5kZXhdLnk7Ci0gICAgICAgIGludDMyX3QgcHJlc3N1cmUgPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudEluZGV4XS5wcmVzc3VyZTsKLQotICAgICAgICBpZiAobGFzdFRvdWNoLmlkQml0cy5oYXNCaXQoaWQpKSB7Ci0gICAgICAgICAgICAvLyBQb2ludGVyIHdhcyBkb3duIGJlZm9yZSBhbmQgaXMgc3RpbGwgZG93biBub3cuCi0gICAgICAgICAgICAvLyBDb21wdXRlIGF2ZXJhZ2Ugb3ZlciBoaXN0b3J5IHRyYWNlLgotICAgICAgICAgICAgdWludDMyX3Qgc3RhcnQgPSBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5U3RhcnRbaWRdOwotICAgICAgICAgICAgdWludDMyX3QgZW5kID0gYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeUVuZFtpZF07Ci0KLSAgICAgICAgICAgIGludDY0X3QgZGVsdGFYID0geCAtIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW2VuZF0ucG9pbnRlcnNbaWRdLng7Ci0gICAgICAgICAgICBpbnQ2NF90IGRlbHRhWSA9IHkgLSBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS55OwotICAgICAgICAgICAgdWludDY0X3QgZGlzdGFuY2UgPSB1aW50NjRfdChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpOwotCi0jaWYgREVCVUdfSEFDS1MKLSAgICAgICAgICAgIExPR0QoIkF2ZXJhZ2luZ1RvdWNoRmlsdGVyOiBQb2ludGVyIGlkICVkIC0gRGlzdGFuY2UgZnJvbSBsYXN0IHNhbXBsZTogJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIGlkLCBkaXN0YW5jZSk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgQVZFUkFHSU5HX0RJU1RBTkNFX0xJTUlUKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGVuZCBpbmRleCBpbiBwcmVwYXJhdGlvbiBmb3IgcmVjb3JkaW5nIG5ldyBoaXN0b3JpY2FsIGRhdGEuCi0gICAgICAgICAgICAgICAgZW5kICs9IDE7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZCA+IEFWRVJBR0lOR19ISVNUT1JZX1NJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZW5kIGluZGV4IGhhcyBsb29wZWQgYmFjayB0byB0aGUgc3RhcnQgaW5kZXggdGhlbiB3ZSBoYXZlIGZpbGxlZAotICAgICAgICAgICAgICAgIC8vIHRoZSBoaXN0b3JpY2FsIHRyYWNlIHVwIHRvIHRoZSBkZXNpcmVkIHNpemUgc28gd2UgZHJvcCB0aGUgaGlzdG9yaWNhbAotICAgICAgICAgICAgICAgIC8vIGRhdGEgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0cmFjZS4KLSAgICAgICAgICAgICAgICBpZiAoZW5kID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA+IEFWRVJBR0lOR19ISVNUT1JZX1NJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcmF3IGRhdGEgdG8gdGhlIGhpc3RvcmljYWwgdHJhY2UuCi0gICAgICAgICAgICAgICAgYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeVN0YXJ0W2lkXSA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlFbmRbaWRdID0gZW5kOwotICAgICAgICAgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW2VuZF0ucG9pbnRlcnNbaWRdLnggPSB4OwotICAgICAgICAgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW2VuZF0ucG9pbnRlcnNbaWRdLnkgPSB5OwotICAgICAgICAgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW2VuZF0ucG9pbnRlcnNbaWRdLnByZXNzdXJlID0gcHJlc3N1cmU7Ci0KLSAgICAgICAgICAgICAgICAvLyBBdmVyYWdlIG92ZXIgYWxsIGhpc3RvcmljYWwgcG9zaXRpb25zIGluIHRoZSB0cmFjZSBieSB0b3RhbCBwcmVzc3VyZS4KLSAgICAgICAgICAgICAgICBpbnQzMl90IGF2ZXJhZ2VkWCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBhdmVyYWdlZFkgPSAwOwotICAgICAgICAgICAgICAgIGludDMyX3QgdG90YWxQcmVzc3VyZSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpc3RvcmljYWxYID0gYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeURhdGFbc3RhcnRdLnBvaW50ZXJzW2lkXS54OwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpc3RvcmljYWxZID0gYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeURhdGFbc3RhcnRdLnBvaW50ZXJzW2lkXS55OwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpc3RvcmljYWxQcmVzc3VyZSA9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW3N0YXJ0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb2ludGVyc1tpZF0ucHJlc3N1cmU7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXZlcmFnZWRYICs9IGhpc3RvcmljYWxYICogaGlzdG9yaWNhbFByZXNzdXJlOwotICAgICAgICAgICAgICAgICAgICBhdmVyYWdlZFkgKz0gaGlzdG9yaWNhbFkgKiBoaXN0b3JpY2FsUHJlc3N1cmU7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsUHJlc3N1cmUgKz0gaGlzdG9yaWNhbFByZXNzdXJlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID4gQVZFUkFHSU5HX0hJU1RPUllfU0laRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXZlcmFnZWRYIC89IHRvdGFsUHJlc3N1cmU7Ci0gICAgICAgICAgICAgICAgYXZlcmFnZWRZIC89IHRvdGFsUHJlc3N1cmU7Ci0KLSNpZiBERUJVR19IQUNLUwotICAgICAgICAgICAgICAgIExPR0QoIkF2ZXJhZ2luZ1RvdWNoRmlsdGVyOiBQb2ludGVyIGlkICVkIC0gIgotICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsUHJlc3N1cmU9JWQsIGF2ZXJhZ2VkWD0lZCwgYXZlcmFnZWRZPSVkIiwgaWQsIHRvdGFsUHJlc3N1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlZFgsIGF2ZXJhZ2VkWSk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50SW5kZXhdLnggPSBhdmVyYWdlZFg7Ci0gICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2N1cnJlbnRJbmRleF0ueSA9IGF2ZXJhZ2VkWTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0jaWYgREVCVUdfSEFDS1MKLSAgICAgICAgICAgICAgICBMT0dEKCJBdmVyYWdpbmdUb3VjaEZpbHRlcjogUG9pbnRlciBpZCAlZCAtIEV4Y2VlZGVkIG1heCBkaXN0YW5jZSIsIGlkKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotI2lmIERFQlVHX0hBQ0tTCi0gICAgICAgICAgICBMT0dEKCJBdmVyYWdpbmdUb3VjaEZpbHRlcjogUG9pbnRlciBpZCAlZCAtIFBvaW50ZXIgd2VudCB1cCIsIGlkKTsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzZXQgcG9pbnRlciBoaXN0b3J5LgotICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5U3RhcnRbaWRdID0gMDsKLSAgICAgICAgYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeUVuZFtpZF0gPSAwOwotICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVswXS5wb2ludGVyc1tpZF0ueCA9IHg7Ci0gICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhWzBdLnBvaW50ZXJzW2lkXS55ID0geTsKLSAgICAgICAgYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeURhdGFbMF0ucG9pbnRlcnNbaWRdLnByZXNzdXJlID0gcHJlc3N1cmU7Ci0gICAgfQotfQotCi1ib29sIElucHV0RGV2aWNlOjpUb3VjaFNjcmVlblN0YXRlOjppc1BvaW50SW5zaWRlRGlzcGxheShpbnQzMl90IHgsIGludDMyX3QgeSkgY29uc3QgewotICAgIGlmICghIHBhcmFtZXRlcnMueEF4aXMudmFsaWQgfHwgISBwYXJhbWV0ZXJzLnlBeGlzLnZhbGlkKSB7Ci0gICAgICAgIC8vIEFzc3VtZSBhbGwgcG9pbnRzIG9uIGEgdG91Y2ggc2NyZWVuIHdpdGhvdXQgdmFsaWQgYXhpcyBwYXJhbWV0ZXJzIGFyZQotICAgICAgICAvLyBpbnNpZGUgdGhlIGRpc3BsYXkuCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiB4ID49IHBhcmFtZXRlcnMueEF4aXMubWluVmFsdWUKLSAgICAgICAgJiYgeCA8PSBwYXJhbWV0ZXJzLnhBeGlzLm1heFZhbHVlCi0gICAgICAgICYmIHkgPj0gcGFyYW1ldGVycy55QXhpcy5taW5WYWx1ZQotICAgICAgICAmJiB5IDw9IHBhcmFtZXRlcnMueUF4aXMubWF4VmFsdWU7Ci19Ci0KLQotLy8gLS0tIElucHV0RGV2aWNlOjpTaW5nbGVUb3VjaFNjcmVlblN0YXRlIC0tLQotCi12b2lkIElucHV0RGV2aWNlOjpTaW5nbGVUb3VjaFNjcmVlblN0YXRlOjpyZXNldCgpIHsKLSAgICBhY2N1bXVsYXRvci5jbGVhcigpOwotICAgIGN1cnJlbnQuZG93biA9IGZhbHNlOwotICAgIGN1cnJlbnQueCA9IDA7Ci0gICAgY3VycmVudC55ID0gMDsKLSAgICBjdXJyZW50LnByZXNzdXJlID0gMDsKLSAgICBjdXJyZW50LnNpemUgPSAwOwotfQotCi0KLS8vIC0tLSBJbnB1dERldmljZTo6TXVsdGlUb3VjaFNjcmVlblN0YXRlIC0tLQotCi12b2lkIElucHV0RGV2aWNlOjpNdWx0aVRvdWNoU2NyZWVuU3RhdGU6OnJlc2V0KCkgewotICAgIGFjY3VtdWxhdG9yLmNsZWFyKCk7Ci19Ci0KLQogLy8gLS0tIElucHV0UmVhZGVyIC0tLQogCiBJbnB1dFJlYWRlcjo6SW5wdXRSZWFkZXIoY29uc3Qgc3A8RXZlbnRIdWJJbnRlcmZhY2U+JiBldmVudEh1YiwKQEAgLTkwNCwzMiArMjUzLDMwIEBACiAgICAgYm9vbCBkb3duID0gcmF3RXZlbnQtPnZhbHVlICE9IDA7CiAgICAgaW50MzJfdCBzY2FuQ29kZSA9IHJhd0V2ZW50LT5zY2FuQ29kZTsKIAotICAgIGlmIChkZXZpY2UtPmlzS2V5Ym9hcmQoKSAmJiAoc2NhbkNvZGUgPCBCVE5fRklSU1QgfHwgc2NhbkNvZGUgPiBCVE5fTEFTVCkpIHsKLSAgICAgICAgaW50MzJfdCBrZXlDb2RlID0gcmF3RXZlbnQtPmtleUNvZGU7Ci0gICAgICAgIG9uS2V5KHJhd0V2ZW50LT53aGVuLCBkZXZpY2UsIGRvd24sIGtleUNvZGUsIHNjYW5Db2RlLCByYXdFdmVudC0+ZmxhZ3MpOwotICAgIH0gZWxzZSBpZiAoZGV2aWNlLT5pc1NpbmdsZVRvdWNoU2NyZWVuKCkpIHsKKyAgICBpZiAoZGV2aWNlLT5pc1NpbmdsZVRvdWNoU2NyZWVuKCkpIHsKICAgICAgICAgc3dpdGNoIChyYXdFdmVudC0+c2NhbkNvZGUpIHsKICAgICAgICAgY2FzZSBCVE5fVE9VQ0g6CiAgICAgICAgICAgICBkZXZpY2UtPnNpbmdsZVRvdWNoU2NyZWVuLmFjY3VtdWxhdG9yLmZpZWxkcyB8PQogICAgICAgICAgICAgICAgICAgICBJbnB1dERldmljZTo6U2luZ2xlVG91Y2hTY3JlZW5TdGF0ZTo6QWNjdW11bGF0b3I6OkZJRUxEX0JUTl9UT1VDSDsKICAgICAgICAgICAgIGRldmljZS0+c2luZ2xlVG91Y2hTY3JlZW4uYWNjdW11bGF0b3IuYnRuVG91Y2ggPSBkb3duOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGRldmljZS0+aXNUcmFja2JhbGwoKSkgeworICAgIH0KKworICAgIGlmIChkZXZpY2UtPmlzVHJhY2tiYWxsKCkpIHsKICAgICAgICAgc3dpdGNoIChyYXdFdmVudC0+c2NhbkNvZGUpIHsKICAgICAgICAgY2FzZSBCVE5fTU9VU0U6CiAgICAgICAgICAgICBkZXZpY2UtPnRyYWNrYmFsbC5hY2N1bXVsYXRvci5maWVsZHMgfD0KICAgICAgICAgICAgICAgICAgICAgSW5wdXREZXZpY2U6OlRyYWNrYmFsbFN0YXRlOjpBY2N1bXVsYXRvcjo6RklFTERfQlROX01PVVNFOwogICAgICAgICAgICAgZGV2aWNlLT50cmFja2JhbGwuYWNjdW11bGF0b3IuYnRuTW91c2UgPSBkb3duOwotCi0gICAgICAgICAgICAvLyBzZW5kIHRoZSBkb3duIGltbWVkaWF0ZWx5Ci0gICAgICAgICAgICAvLyBYWFggdGhpcyBlbXVsYXRlcyB0aGUgb2xkIGJlaGF2aW9yIG9mIEtleUlucHV0UXVldWUsIHVuY2xlYXIgd2hldGhlciBpdCBpcwotICAgICAgICAgICAgLy8gICAgIG5lY2Vzc2FyeSBvciBpZiB3ZSBjYW4gd2FpdCB1bnRpbCB0aGUgbmV4dCBzeW5jCi0gICAgICAgICAgICBvblRyYWNrYmFsbFN0YXRlQ2hhbmdlZChyYXdFdmVudC0+d2hlbiwgZGV2aWNlKTsKLSAgICAgICAgICAgIGRldmljZS0+dHJhY2tiYWxsLmFjY3VtdWxhdG9yLmNsZWFyKCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KKworICAgIGlmIChkZXZpY2UtPmlzS2V5Ym9hcmQoKSkgeworICAgICAgICBpbnQzMl90IGtleUNvZGUgPSByYXdFdmVudC0+a2V5Q29kZTsKKyAgICAgICAgb25LZXkocmF3RXZlbnQtPndoZW4sIGRldmljZSwgZG93biwga2V5Q29kZSwgc2NhbkNvZGUsIHJhd0V2ZW50LT5mbGFncyk7CisgICAgfQogfQogCiB2b2lkIElucHV0UmVhZGVyOjpoYW5kbGVSZWxhdGl2ZU1vdGlvbihjb25zdCBSYXdFdmVudCogcmF3RXZlbnQpIHsKQEAgLTEyNjksODEgKzYxNiw3NiBAQAogCiBib29sIElucHV0UmVhZGVyOjpjb25zdW1lVmlydHVhbEtleVRvdWNoZXMobnNlY3NfdCB3aGVuLAogICAgICAgICBJbnB1dERldmljZSogZGV2aWNlLCB1aW50MzJfdCBwb2xpY3lGbGFncykgewotICAgIGlmIChkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LmRvd24pIHsKKyAgICBzd2l0Y2ggKGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkuc3RhdHVzKSB7CisgICAgY2FzZSBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6Q3VycmVudFZpcnR1YWxLZXlTdGF0ZTo6U1RBVFVTX0NBTkNFTEVEOgogICAgICAgICBpZiAoZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID09IDApIHsKLSAgICAgICAgICAgIC8vIFBvaW50ZXIgd2VudCB1cCB3aGlsZSB2aXJ0dWFsIGtleSB3YXMgZG93bi4gIFNlbmQga2V5IHVwIGV2ZW50LgotICAgICAgICAgICAgZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VmlydHVhbEtleS5kb3duID0gZmFsc2U7CisgICAgICAgICAgICAvLyBQb2ludGVyIHdlbnQgdXAgYWZ0ZXIgdmlydHVhbCBrZXkgY2FuY2VsZWQuCisgICAgICAgICAgICBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LnN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIElucHV0RGV2aWNlOjpUb3VjaFNjcmVlblN0YXRlOjpDdXJyZW50VmlydHVhbEtleVN0YXRlOjpTVEFUVVNfVVA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNvbnN1bWVkCiAKKyAgICBjYXNlIElucHV0RGV2aWNlOjpUb3VjaFNjcmVlblN0YXRlOjpDdXJyZW50VmlydHVhbEtleVN0YXRlOjpTVEFUVVNfRE9XTjoKKyAgICAgICAgaWYgKGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFRvdWNoLnBvaW50ZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAvLyBQb2ludGVyIHdlbnQgdXAgd2hpbGUgdmlydHVhbCBrZXkgd2FzIGRvd24uCisgICAgICAgICAgICBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LnN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIElucHV0RGV2aWNlOjpUb3VjaFNjcmVlblN0YXRlOjpDdXJyZW50VmlydHVhbEtleVN0YXRlOjpTVEFUVVNfVVA7CiAjaWYgREVCVUdfVklSVFVBTF9LRVlTCiAgICAgICAgICAgICBMT0dEKCJWaXJ0dWFsS2V5czogR2VuZXJhdGluZyBrZXkgdXA6IGtleUNvZGU9JWQsIHNjYW5Db2RlPSVkIiwKICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VmlydHVhbEtleS5rZXlDb2RlLAogICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LnNjYW5Db2RlKTsKICNlbmRpZgotCiAgICAgICAgICAgICBkaXNwYXRjaFZpcnR1YWxLZXkod2hlbiwgZGV2aWNlLCBwb2xpY3lGbGFncywgS0VZX0VWRU5UX0FDVElPTl9VUCwKICAgICAgICAgICAgICAgICAgICAgS0VZX0VWRU5UX0ZMQUdfRlJPTV9TWVNURU0gfCBLRVlfRVZFTlRfRkxBR19WSVJUVUFMX0hBUkRfS0VZKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBjb25zdW1lZAogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCB4ID0gZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VG91Y2gucG9pbnRlcnNbMF0ueDsKLSAgICAgICAgaW50MzJfdCB5ID0gZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VG91Y2gucG9pbnRlcnNbMF0ueTsKLSAgICAgICAgaWYgKGRldmljZS0+dG91Y2hTY3JlZW4uaXNQb2ludEluc2lkZURpc3BsYXkoeCwgeSkKLSAgICAgICAgICAgICAgICB8fCBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQgIT0gMSkgewotICAgICAgICAgICAgLy8gUG9pbnRlciBtb3ZlZCBpbnNpZGUgdGhlIGRpc3BsYXkgYXJlYSBvciBhbm90aGVyIHBvaW50ZXIgYWxzbyB3ZW50IGRvd24uCi0gICAgICAgICAgICAvLyBTZW5kIGtleSBjYW5jZWxsYXRpb24uCi0gICAgICAgICAgICBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LmRvd24gPSBmYWxzZTsKLQotI2lmIERFQlVHX1ZJUlRVQUxfS0VZUwotICAgICAgICAgICAgTE9HRCgiVmlydHVhbEtleXM6IENhbmNlbGluZyBrZXk6IGtleUNvZGU9JWQsIHNjYW5Db2RlPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VmlydHVhbEtleS5rZXlDb2RlLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LnNjYW5Db2RlKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBkaXNwYXRjaFZpcnR1YWxLZXkod2hlbiwgZGV2aWNlLCBwb2xpY3lGbGFncywgS0VZX0VWRU5UX0FDVElPTl9VUCwKLSAgICAgICAgICAgICAgICAgICAgS0VZX0VWRU5UX0ZMQUdfRlJPTV9TWVNURU0gfCBLRVlfRVZFTlRfRkxBR19WSVJUVUFMX0hBUkRfS0VZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLRVlfRVZFTlRfRkxBR19DQU5DRUxFRCk7Ci0KLSAgICAgICAgICAgIC8vIENsZWFyIHRoZSBsYXN0IHRvdWNoIGRhdGEgc28gd2Ugd2lsbCBjb25zaWRlciB0aGUgcG9pbnRlciBhcyBoYXZpbmcganVzdCBiZWVuCi0gICAgICAgICAgICAvLyBwcmVzc2VkIGRvd24gd2hlbiBnZW5lcmF0aW5nIHN1YnNlcXVlbnQgbW90aW9uIGV2ZW50cy4KLSAgICAgICAgICAgIGRldmljZS0+dG91Y2hTY3JlZW4ubGFzdFRvdWNoLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBjb25zdW1lZAorICAgICAgICBpZiAoZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGNvbnN0IElucHV0RGV2aWNlOjpWaXJ0dWFsS2V5KiB2aXJ0dWFsS2V5ID0gZGV2aWNlLT50b3VjaFNjcmVlbi5maW5kVmlydHVhbEtleUhpdCgpOworICAgICAgICAgICAgaWYgKHZpcnR1YWxLZXkKKyAgICAgICAgICAgICAgICAgICAgJiYgdmlydHVhbEtleS0+a2V5Q29kZSA9PSBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LmtleUNvZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBQb2ludGVyIGlzIHN0aWxsIHdpdGhpbiB0aGUgc3BhY2Ugb2YgdGhlIHZpcnR1YWwga2V5LgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBjb25zdW1lZAorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQgPT0gMQotICAgICAgICAgICAgJiYgZGV2aWNlLT50b3VjaFNjcmVlbi5sYXN0VG91Y2gucG9pbnRlckNvdW50ID09IDApIHsKLSAgICAgICAgaW50MzJfdCB4ID0gZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VG91Y2gucG9pbnRlcnNbMF0ueDsKLSAgICAgICAgaW50MzJfdCB5ID0gZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VG91Y2gucG9pbnRlcnNbMF0ueTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2UtPnRvdWNoU2NyZWVuLnZpcnR1YWxLZXlzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBJbnB1dERldmljZTo6VmlydHVhbEtleSYgdmlydHVhbEtleSA9IGRldmljZS0+dG91Y2hTY3JlZW4udmlydHVhbEtleXNbaV07CiAKKyAgICAgICAgLy8gUG9pbnRlciBsZWZ0IHZpcnR1YWwga2V5IGFyZWEgb3IgYW5vdGhlciBwb2ludGVyIGFsc28gd2VudCBkb3duLgorICAgICAgICAvLyBTZW5kIGtleSBjYW5jZWxsYXRpb24uCisgICAgICAgIGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkuc3RhdHVzID0KKyAgICAgICAgICAgICAgICBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6Q3VycmVudFZpcnR1YWxLZXlTdGF0ZTo6U1RBVFVTX0NBTkNFTEVEOwogI2lmIERFQlVHX1ZJUlRVQUxfS0VZUwotICAgICAgICAgICAgTE9HRCgiVmlydHVhbEtleXM6IEhpdCB0ZXN0ICglZCwgJWQpOiBrZXlDb2RlPSVkLCBzY2FuQ29kZT0lZCwgIgotICAgICAgICAgICAgICAgICAgICAibGVmdD0lZCwgdG9wPSVkLCByaWdodD0lZCwgYm90dG9tPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgdmlydHVhbEtleS5rZXlDb2RlLCB2aXJ0dWFsS2V5LnNjYW5Db2RlLAotICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsS2V5LmhpdExlZnQsIHZpcnR1YWxLZXkuaGl0VG9wLAotICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsS2V5LmhpdFJpZ2h0LCB2aXJ0dWFsS2V5LmhpdEJvdHRvbSk7CisgICAgICAgIExPR0QoIlZpcnR1YWxLZXlzOiBDYW5jZWxpbmcga2V5OiBrZXlDb2RlPSVkLCBzY2FuQ29kZT0lZCIsCisgICAgICAgICAgICAgICAgZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VmlydHVhbEtleS5rZXlDb2RlLAorICAgICAgICAgICAgICAgIGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkuc2NhbkNvZGUpOwogI2VuZGlmCisgICAgICAgIGRpc3BhdGNoVmlydHVhbEtleSh3aGVuLCBkZXZpY2UsIHBvbGljeUZsYWdzLCBLRVlfRVZFTlRfQUNUSU9OX1VQLAorICAgICAgICAgICAgICAgIEtFWV9FVkVOVF9GTEFHX0ZST01fU1lTVEVNIHwgS0VZX0VWRU5UX0ZMQUdfVklSVFVBTF9IQVJEX0tFWQorICAgICAgICAgICAgICAgICAgICAgICAgfCBLRVlfRVZFTlRfRkxBR19DQU5DRUxFRCk7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBjb25zdW1lZAogCi0gICAgICAgICAgICBpZiAodmlydHVhbEtleS5pc0hpdCh4LCB5KSkgewotICAgICAgICAgICAgICAgIGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkuZG93biA9IHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFRvdWNoLnBvaW50ZXJDb3VudCA9PSAxCisgICAgICAgICAgICAgICAgJiYgZGV2aWNlLT50b3VjaFNjcmVlbi5sYXN0VG91Y2gucG9pbnRlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIC8vIFBvaW50ZXIganVzdCB3ZW50IGRvd24uICBDaGVjayBmb3IgdmlydHVhbCBrZXkgaGl0LgorICAgICAgICAgICAgY29uc3QgSW5wdXREZXZpY2U6OlZpcnR1YWxLZXkqIHZpcnR1YWxLZXkgPSBkZXZpY2UtPnRvdWNoU2NyZWVuLmZpbmRWaXJ0dWFsS2V5SGl0KCk7CisgICAgICAgICAgICBpZiAodmlydHVhbEtleSkgeworICAgICAgICAgICAgICAgIGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkuc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0RGV2aWNlOjpUb3VjaFNjcmVlblN0YXRlOjpDdXJyZW50VmlydHVhbEtleVN0YXRlOjpTVEFUVVNfRE9XTjsKICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LmRvd25UaW1lID0gd2hlbjsKLSAgICAgICAgICAgICAgICBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LmtleUNvZGUgPSB2aXJ0dWFsS2V5LmtleUNvZGU7Ci0gICAgICAgICAgICAgICAgZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VmlydHVhbEtleS5zY2FuQ29kZSA9IHZpcnR1YWxLZXkuc2NhbkNvZGU7Ci0KKyAgICAgICAgICAgICAgICBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LmtleUNvZGUgPSB2aXJ0dWFsS2V5LT5rZXlDb2RlOworICAgICAgICAgICAgICAgIGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkuc2NhbkNvZGUgPSB2aXJ0dWFsS2V5LT5zY2FuQ29kZTsKICNpZiBERUJVR19WSVJUVUFMX0tFWVMKLSAgICAgICAgICAgICAgICAgICAgTE9HRCgiVmlydHVhbEtleXM6IEdlbmVyYXRpbmcga2V5IGRvd246IGtleUNvZGU9JWQsIHNjYW5Db2RlPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvdWNoU2NyZWVuLmN1cnJlbnRWaXJ0dWFsS2V5LmtleUNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VmlydHVhbEtleS5zY2FuQ29kZSk7CisgICAgICAgICAgICAgICAgTE9HRCgiVmlydHVhbEtleXM6IEdlbmVyYXRpbmcga2V5IGRvd246IGtleUNvZGU9JWQsIHNjYW5Db2RlPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkua2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkuc2NhbkNvZGUpOwogI2VuZGlmCi0KICAgICAgICAgICAgICAgICBkaXNwYXRjaFZpcnR1YWxLZXkod2hlbiwgZGV2aWNlLCBwb2xpY3lGbGFncywgS0VZX0VWRU5UX0FDVElPTl9ET1dOLAogICAgICAgICAgICAgICAgICAgICAgICAgS0VZX0VWRU5UX0ZMQUdfRlJPTV9TWVNURU0gfCBLRVlfRVZFTlRfRkxBR19WSVJUVUFMX0hBUkRfS0VZKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gY29uc3VtZWQKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBjb25zdW1lZAogICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGNvbnN1bWVkCiB9CiAKIHZvaWQgSW5wdXRSZWFkZXI6OmRpc3BhdGNoVmlydHVhbEtleShuc2Vjc190IHdoZW4sCkBAIC0xMzU2LDggKzY5OCw5IEBACiAgICAgbnNlY3NfdCBkb3duVGltZSA9IGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkuZG93blRpbWU7CiAgICAgaW50MzJfdCBtZXRhU3RhdGUgPSBnbG9iYWxNZXRhU3RhdGUoKTsKIAotICAgIG1Qb2xpY3ktPnZpcnR1YWxLZXlGZWVkYmFjayh3aGVuLCBkZXZpY2UtPmlkLCBrZXlFdmVudEFjdGlvbiwga2V5RXZlbnRGbGFncywKLSAgICAgICAgICAgIGtleUNvZGUsIHNjYW5Db2RlLCBtZXRhU3RhdGUsIGRvd25UaW1lKTsKKyAgICBpZiAoa2V5RXZlbnRBY3Rpb24gPT0gS0VZX0VWRU5UX0FDVElPTl9ET1dOKSB7CisgICAgICAgIG1Qb2xpY3ktPnZpcnR1YWxLZXlEb3duRmVlZGJhY2soKTsKKyAgICB9CiAKICAgICBpbnQzMl90IHBvbGljeUFjdGlvbnMgPSBtUG9saWN5LT5pbnRlcmNlcHRLZXkod2hlbiwgZGV2aWNlLT5pZCwKICAgICAgICAgICAgIGtleUV2ZW50QWN0aW9uID09IEtFWV9FVkVOVF9BQ1RJT05fRE9XTiwga2V5Q29kZSwgc2NhbkNvZGUsIHBvbGljeUZsYWdzKTsKQEAgLTE4NTIsNyArMTE5NSw3IEBACiAgICAgICAgIHVpbnQzMl90IGZsYWdzOwogICAgICAgICBpZiAobUV2ZW50SHViLT5zY2FuY29kZVRvS2V5Y29kZShkZXZpY2UtPmlkLCB2aXJ0dWFsS2V5LnNjYW5Db2RlLAogICAgICAgICAgICAgICAgICYga2V5Q29kZSwgJiBmbGFncykpIHsKLSAgICAgICAgICAgIExPR0koIiAgVmlydHVhbEtleSAlZDogY291bGQgbm90IG9idGFpbiBrZXkgY29kZSwgaWdub3JpbmciLCB2aXJ0dWFsS2V5LnNjYW5Db2RlKTsKKyAgICAgICAgICAgIExPR1coIiAgVmlydHVhbEtleSAlZDogY291bGQgbm90IG9idGFpbiBrZXkgY29kZSwgaWdub3JpbmciLCB2aXJ0dWFsS2V5LnNjYW5Db2RlKTsKICAgICAgICAgICAgIGRldmljZS0+dG91Y2hTY3JlZW4udmlydHVhbEtleXMucG9wKCk7IC8vIGRyb3AgdGhlIGtleQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTE5MzMsNyArMTI3Niw4IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICBJbnB1dERldmljZSogZGV2aWNlID0gbURldmljZXMudmFsdWVBdChpKTsKICAgICAgICAgaWYgKGRldmljZS0+aXNUb3VjaFNjcmVlbigpKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VmlydHVhbEtleS5kb3duKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlLT50b3VjaFNjcmVlbi5jdXJyZW50VmlydHVhbEtleS5zdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgPT0gSW5wdXREZXZpY2U6OlRvdWNoU2NyZWVuU3RhdGU6OkN1cnJlbnRWaXJ0dWFsS2V5U3RhdGU6OlNUQVRVU19ET1dOKSB7CiAgICAgICAgICAgICAgICAga2V5Q29kZSA9IGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkua2V5Q29kZTsKICAgICAgICAgICAgICAgICBzY2FuQ29kZSA9IGRldmljZS0+dG91Y2hTY3JlZW4uY3VycmVudFZpcnR1YWxLZXkuc2NhbkNvZGU7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJzL3VpL0lucHV0VHJhbnNwb3J0LmNwcCBiL2xpYnMvdWkvSW5wdXRUcmFuc3BvcnQuY3BwCmluZGV4IDI1ZGVmM2MuLmZjODNlMzEgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvSW5wdXRUcmFuc3BvcnQuY3BwCisrKyBiL2xpYnMvdWkvSW5wdXRUcmFuc3BvcnQuY3BwCkBAIC02OTAsMjIgKzY5MCwzIEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tIEFJbnB1dFF1ZXVlIC0tLQotCi11c2luZyBhbmRyb2lkOjpJbnB1dEV2ZW50OwotdXNpbmcgYW5kcm9pZDo6SW5wdXRDaGFubmVsOwotdXNpbmcgYW5kcm9pZDo6SW5wdXRDb25zdW1lcjsKLXVzaW5nIGFuZHJvaWQ6OnNwOwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci0KLUFJbnB1dFF1ZXVlOjpBSW5wdXRRdWV1ZShjb25zdCBzcDxJbnB1dENoYW5uZWw+JiBjaGFubmVsKSA6Ci0gICAgICAgIG1Db25zdW1lcihjaGFubmVsKSB7Ci19Ci0KLUFJbnB1dFF1ZXVlOjp+QUlucHV0UXVldWUoKSB7Ci19Ci0KLXN0YXR1c190IEFJbnB1dFF1ZXVlOjpjb25zdW1lKElucHV0RXZlbnQqKiBldmVudCkgewotICAgIHJldHVybiBtQ29uc3VtZXIuY29uc3VtZSgmbUlucHV0RXZlbnRGYWN0b3J5LCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9saWJzL3VpL1BpeGVsRm9ybWF0LmNwcCBiL2xpYnMvdWkvUGl4ZWxGb3JtYXQuY3BwCmluZGV4IGM5YTU5NTAuLmIyMDU0MTggMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvUGl4ZWxGb3JtYXQuY3BwCisrKyBiL2xpYnMvdWkvUGl4ZWxGb3JtYXQuY3BwCkBAIC01OSwxNiArNTksMTMgQEAKICAgICAvLyBZVVYgZm9ybWF0IGZyb20gdGhlIEhBTCBhcmUgaGFuZGxlZCBoZXJlCiAgICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjJfU1A6Ci0gICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9QOgogICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSToKLSAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ2JZQ3JZXzQyMl9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjE2OgogICAgICAgICBpbmZvLT5iaXRzUGVyUGl4ZWwgPSAxNjsKICAgICAgICAgZ290byBkb25lOwotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1A6CiAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDoKICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQX1RJTEVEOgotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKICAgICAgICAgaW5mby0+Yml0c1BlclBpeGVsID0gMTI7CiAgICAgIGRvbmU6CiAgICAgICAgIGluZm8tPmZvcm1hdCA9IGZvcm1hdDsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvUmVjdC5jcHAgYi9saWJzL3VpL1JlY3QuY3BwCmluZGV4IDY2Yjk1NzYuLjU2OTRlMDAgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvUmVjdC5jcHAKKysrIGIvbGlicy91aS9SZWN0LmNwcApAQCAtMTgsMTEgKzE4LDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGlubGluZSBpbnQgbWluKGludCBhLCBpbnQgYikgeworc3RhdGljIGlubGluZSBpbnQzMl90IG1pbihpbnQzMl90IGEsIGludDMyX3QgYikgewogICAgIHJldHVybiAoYTxiKSA/IGEgOiBiOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtYXgoaW50IGEsIGludCBiKSB7CitzdGF0aWMgaW5saW5lIGludDMyX3QgbWF4KGludDMyX3QgYSwgaW50MzJfdCBiKSB7CiAgICAgcmV0dXJuIChhPmIpID8gYSA6IGI7CiB9CiAKQEAgLTUzLDcgKzUzLDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLVJlY3QmIFJlY3Q6Om9mZnNldFRvKGludCB4LCBpbnQgeSkKK1JlY3QmIFJlY3Q6Om9mZnNldFRvKGludDMyX3QgeCwgaW50MzJfdCB5KQogewogICAgIHJpZ2h0IC09IGxlZnQgLSB4OwogICAgIGJvdHRvbSAtPSB0b3AgLSB5OwpAQCAtNjIsNyArNjIsNyBAQAogICAgIHJldHVybiAqdGhpczsKIH0KIAotUmVjdCYgUmVjdDo6b2Zmc2V0QnkoaW50IHgsIGludCB5KQorUmVjdCYgUmVjdDo6b2Zmc2V0QnkoaW50MzJfdCB4LCBpbnQzMl90IHkpCiB7CiAgICAgbGVmdCArPSB4OwogICAgIHRvcCAgKz0geTsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvdGVzdHMvSW5wdXRQdWJsaXNoZXJBbmRDb25zdW1lcl90ZXN0LmNwcCBiL2xpYnMvdWkvdGVzdHMvSW5wdXRQdWJsaXNoZXJBbmRDb25zdW1lcl90ZXN0LmNwcAppbmRleCAyZDZiNTMxLi41NTUwNGYyIDEwMDY0NAotLS0gYS9saWJzL3VpL3Rlc3RzL0lucHV0UHVibGlzaGVyQW5kQ29uc3VtZXJfdGVzdC5jcHAKKysrIGIvbGlicy91aS90ZXN0cy9JbnB1dFB1Ymxpc2hlckFuZENvbnN1bWVyX3Rlc3QuY3BwCkBAIC03Niw3ICs3Niw3IEBACiAgICAgY29uc3QgaW50MzJfdCBuYXR1cmUgPSBJTlBVVF9FVkVOVF9OQVRVUkVfS0VZOwogICAgIGNvbnN0IGludDMyX3QgYWN0aW9uID0gS0VZX0VWRU5UX0FDVElPTl9ET1dOOwogICAgIGNvbnN0IGludDMyX3QgZmxhZ3MgPSBLRVlfRVZFTlRfRkxBR19GUk9NX1NZU1RFTTsKLSAgICBjb25zdCBpbnQzMl90IGtleUNvZGUgPSBLRVlDT0RFX0VOVEVSOworICAgIGNvbnN0IGludDMyX3Qga2V5Q29kZSA9IEFLRVlDT0RFX0VOVEVSOwogICAgIGNvbnN0IGludDMyX3Qgc2NhbkNvZGUgPSAxMzsKICAgICBjb25zdCBpbnQzMl90IG1ldGFTdGF0ZSA9IE1FVEFfQUxUX0xFRlRfT04gfCBNRVRBX0FMVF9PTjsKICAgICBjb25zdCBpbnQzMl90IHJlcGVhdENvdW50ID0gMTsKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvQW5kcm9pZC5tayBiL2xpYnMvdXRpbHMvQW5kcm9pZC5tawppbmRleCA3ZDQ1MjRhLi44YmQ1ODIzIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL0FuZHJvaWQubWsKKysrIGIvbGlicy91dGlscy9BbmRyb2lkLm1rCkBAIC0yNiw2ICsyNiw3IEBACiAJRGVidWcuY3BwIFwKIAlGaWxlTWFwLmNwcCBcCiAJRmxhdHRlbmFibGUuY3BwIFwKKwlPYmJGaWxlLmNwcCBcCiAJUG9vbC5jcHAgXAogCVJlZkJhc2UuY3BwIFwKIAlSZXNvdXJjZVR5cGVzLmNwcCBcCkBAIC02NSw2ICs2NiwxMSBAQAogZW5kaWYKIGVuZGlmCiAKK2lmZXEgKCQoSE9TVF9PUyksZGFyd2luKQorIyBNYWNPUyBkb2Vzbid0IGhhdmUgbHNlZWs2NC4gSG93ZXZlciwgb2ZmX3QgaXMgNjQtYml0IGFueXdheS4KK0xPQ0FMX0NGTEFHUyArPSAtRE9GRl9UX0lTXzY0X0JJVAorZW5kaWYKKwogaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCiAKIApAQCAtMTE2LDMgKzEyMiwxMyBAQAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogZW5kaWYKIGVuZGlmCisKKworIyBJbmNsdWRlIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgSWYgd2UncmUgYnVpbGRpbmcgd2l0aCBPTkVfU0hPVF9NQUtFRklMRSAobW0sIG1tbSksIHRoZW4gd2hhdCB0aGUgZnJhbWV3b3JrCisjIHRlYW0gcmVhbGx5IHdhbnRzIGlzIHRvIGJ1aWxkIHRoZSBzdHVmZiBkZWZpbmVkIGJ5IHRoaXMgbWFrZWZpbGUuCitpZmVxICgsJChPTkVfU0hPVF9NQUtFRklMRSkpCitpbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9PYmJGaWxlLmNwcCBiL2xpYnMvdXRpbHMvT2JiRmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0OTMwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvdXRpbHMvT2JiRmlsZS5jcHAKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIExPR19UQUcgIk9iYkZpbGUiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvT2JiRmlsZS5oPgorCisvLyNkZWZpbmUgREVCVUcgMQorCisjZGVmaW5lIGtGb290ZXJUYWdTaXplIDggIC8qIGxhc3QgdHdvIDMyLWJpdCBpbnRlZ2VycyAqLworCisjZGVmaW5lIGtGb290ZXJNaW5TaXplIDIxIC8qIDMyLWJpdCBzaWduYXR1cmUgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAzMi1iaXQgcGFja2FnZSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDMyLWJpdCBwYWNrYWdlIG5hbWUgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxLWNoYXJhY3RlciBwYWNrYWdlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogMzItYml0IGZvb3RlciBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDMyLWJpdCBmb290ZXIgbWFya2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIGtNYXhCdWZTaXplICAgIDMyNzY4IC8qIE1heGltdW0gZmlsZSByZWFkIGJ1ZmZlciAqLworCisjZGVmaW5lIGtTaWduYXR1cmUgICAgIDB4MDEwNTk5ODNVIC8qIE9iYkZpbGUgc2lnbmF0dXJlICovCisKKyNkZWZpbmUga1NpZ1ZlcnNpb24gICAgMSAvKiBXZSBvbmx5IGtub3cgYWJvdXQgc2lnbmF0dXJlIHZlcnNpb24gMSAqLworCisvKiBvZmZzZXRzIGluIHZlcnNpb24gMSBvZiB0aGUgaGVhZGVyICovCisjZGVmaW5lIGtQYWNrYWdlVmVyc2lvbk9mZnNldCA0CisjZGVmaW5lIGtQYWNrYWdlTmFtZUxlbk9mZnNldCA4CisjZGVmaW5lIGtQYWNrYWdlTmFtZU9mZnNldCAgICAxMgorCisvKgorICogVEVNUF9GQUlMVVJFX1JFVFJZIGlzIGRlZmluZWQgYnkgc29tZSwgYnV0IG5vdCBhbGwsIHZlcnNpb25zIG9mCisgKiA8dW5pc3RkLmg+LiAoQWxhcywgaXQgaXMgbm90IGFzIHN0YW5kYXJkIGFzIHdlJ2QgaG9wZWQhKSBTbywgaWYgaXQncworICogbm90IGFscmVhZHkgZGVmaW5lZCwgdGhlbiBkZWZpbmUgaXQgaGVyZS4KKyAqLworI2lmbmRlZiBURU1QX0ZBSUxVUkVfUkVUUlkKKy8qIFVzZWQgdG8gcmV0cnkgc3lzY2FsbHMgdGhhdCBjYW4gcmV0dXJuIEVJTlRSLiAqLworI2RlZmluZSBURU1QX0ZBSUxVUkVfUkVUUlkoZXhwKSAoeyAgICAgICAgIFwKKyAgICB0eXBlb2YgKGV4cCkgX3JjOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfcmMgPSAoZXhwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlIChfcmMgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOyBcCisgICAgX3JjOyB9KQorI2VuZGlmCisKKy8qCisgKiBXb3JrIGFyb3VuZCBzaXR1YXRpb25zIHdoZXJlIG9mZl90IGlzIDY0LWJpdCBhbmQgdXNlIG9mZjY0X3QgaW4KKyAqIHNpdHVhdGlvbnMgd2hlcmUgaXQncyAzMi1iaXQuCisgKi8KKyNpZmRlZiBPRkZfVF9JU182NF9CSVQKKyNkZWZpbmUgbXlfbHNlZWs2NCBsc2VlawordHlwZWRlZiBvZmZfdCBteV9vZmY2NF90OworI2Vsc2UKKyNkZWZpbmUgbXlfbHNlZWs2NCBsc2VlazY0Cit0eXBlZGVmIG9mZjY0X3QgbXlfb2ZmNjRfdDsKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK09iYkZpbGU6Ok9iYkZpbGUoKSA6CisgICAgICAgIG1WZXJzaW9uKC0xKSB7Cit9CisKK09iYkZpbGU6On5PYmJGaWxlKCkgeworfQorCitib29sIE9iYkZpbGU6OnJlYWRGcm9tKGNvbnN0IGNoYXIqIGZpbGVuYW1lKQoreworICAgIGludCBmZDsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgIGZkID0gOjpvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBMT0dXKCJjb3VsZG4ndCBvcGVuIGZpbGUgJXM6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBzdWNjZXNzID0gcmVhZEZyb20oZmQpOworICAgIGNsb3NlKGZkKTsKKworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICBMT0dXKCJmYWlsZWQgdG8gcmVhZCBmcm9tICVzIChmZD0lZClcbiIsIGZpbGVuYW1lLCBmZCk7CisgICAgfQorCitvdXQ6CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2Jvb2wgT2JiRmlsZTo6cmVhZEZyb20oaW50IGZkKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HVygiYXR0ZW1wdCB0byByZWFkIGZyb20gaW52YWxpZCBmZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gcGFyc2VPYmJGaWxlKGZkKTsKK30KKworYm9vbCBPYmJGaWxlOjpwYXJzZU9iYkZpbGUoaW50IGZkKQoreworICAgIG15X29mZjY0X3QgZmlsZUxlbmd0aCA9IG15X2xzZWVrNjQoZmQsIDAsIFNFRUtfRU5EKTsKKworICAgIGlmIChmaWxlTGVuZ3RoIDwga0Zvb3Rlck1pblNpemUpIHsKKyAgICAgICAgaWYgKGZpbGVMZW5ndGggPCAwKSB7CisgICAgICAgICAgICBMT0dXKCJlcnJvciBzZWVraW5nIGluIE9iYkZpbGU6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVygiZmlsZSBpcyBvbmx5ICVsbGQgKGxlc3MgdGhhbiAlZCBtaW5pbXVtKVxuIiwgZmlsZUxlbmd0aCwga0Zvb3Rlck1pblNpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGFjdHVhbDsKKyAgICBzaXplX3QgZm9vdGVyU2l6ZTsKKworICAgIHsKKyAgICAgICAgbXlfbHNlZWs2NChmZCwgZmlsZUxlbmd0aCAtIGtGb290ZXJUYWdTaXplLCBTRUVLX1NFVCk7CisKKyAgICAgICAgY2hhciAqZm9vdGVyID0gbmV3IGNoYXJba0Zvb3RlclRhZ1NpemVdOworICAgICAgICBhY3R1YWwgPSBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChmZCwgZm9vdGVyLCBrRm9vdGVyVGFnU2l6ZSkpOworICAgICAgICBpZiAoYWN0dWFsICE9IGtGb290ZXJUYWdTaXplKSB7CisgICAgICAgICAgICBMT0dXKCJjb3VsZG4ndCByZWFkIGZvb3RlciBzaWduYXR1cmU6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgaW50IGZpbGVTaWcgPSBnZXQ0TEUoKHVuc2lnbmVkIGNoYXIqKWZvb3RlciArIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgIGlmIChmaWxlU2lnICE9IGtTaWduYXR1cmUpIHsKKyAgICAgICAgICAgIExPR1coImZvb3RlciBkaWRuJ3QgbWF0Y2ggbWFnaWMgc3RyaW5nIChleHBlY3RlZCAweCUwOHg7IGdvdCAweCUwOHgpXG4iLAorICAgICAgICAgICAgICAgICAgICBrU2lnbmF0dXJlLCBmaWxlU2lnKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvb3RlclNpemUgPSBnZXQ0TEUoKHVuc2lnbmVkIGNoYXIqKWZvb3Rlcik7CisgICAgICAgIGlmIChmb290ZXJTaXplID4gKHNpemVfdClmaWxlTGVuZ3RoIC0ga0Zvb3RlclRhZ1NpemUKKyAgICAgICAgICAgICAgICB8fCBmb290ZXJTaXplID4ga01heEJ1ZlNpemUpIHsKKyAgICAgICAgICAgIExPR1coImNsYWltZWQgZm9vdGVyIHNpemUgaXMgdG9vIGxhcmdlICgweCUwOHp4OyBmaWxlIHNpemUgaXMgMHglMDhsbHgpXG4iLAorICAgICAgICAgICAgICAgICAgICBmb290ZXJTaXplLCBmaWxlTGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb290ZXJTaXplIDwga0Zvb3Rlck1pblNpemUpIHsKKyAgICAgICAgICAgIExPR1coImNsYWltZWQgZm9vdGVyIHNpemUgaXMgdG9vIHNtYWxsICglMDh6eDsgbWluaW11bSBzaXplIGlzIDB4JXgpXG4iLAorICAgICAgICAgICAgICAgICAgICBmb290ZXJTaXplLCBrRm9vdGVyTWluU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBteV9vZmY2NF90IGZpbGVPZmZzZXQgPSBmaWxlTGVuZ3RoIC0gZm9vdGVyU2l6ZSAtIGtGb290ZXJUYWdTaXplOworICAgIGlmIChteV9sc2VlazY0KGZkLCBmaWxlT2Zmc2V0LCBTRUVLX1NFVCkgIT0gZmlsZU9mZnNldCkgeworICAgICAgICBMT0dXKCJzZWVrICVsbGQgZmFpbGVkOiAlc1xuIiwgZmlsZU9mZnNldCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNoYXIqIHNjYW5CdWYgPSAoY2hhciopbWFsbG9jKGZvb3RlclNpemUpOworICAgIGlmIChzY2FuQnVmID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiY291bGRuJ3QgYWxsb2NhdGUgc2NhbkJ1ZjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhY3R1YWwgPSBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChmZCwgc2NhbkJ1ZiwgZm9vdGVyU2l6ZSkpOworICAgIC8vIHJlYWRBbW91bnQgaXMgZ3VhcmFudGVlZCB0byBiZSBsZXNzIHRoYW4ga01heEJ1ZlNpemUKKyAgICBpZiAoYWN0dWFsICE9IChzc2l6ZV90KWZvb3RlclNpemUpIHsKKyAgICAgICAgTE9HSSgiY291bGRuJ3QgcmVhZCBPYmJGaWxlIGZvb3RlcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGZyZWUoc2NhbkJ1Zik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZmRlZiBERUJVRworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9vdGVyU2l6ZTsgKytpKSB7CisgICAgICAgIExPR0koImNoYXI6IDB4JTAyeCIsIHNjYW5CdWZbaV0pOworICAgIH0KKyNlbmRpZgorCisgICAgdWludDMyX3Qgc2lnVmVyc2lvbiA9IGdldDRMRSgodW5zaWduZWQgY2hhciopc2NhbkJ1Zik7CisgICAgaWYgKHNpZ1ZlcnNpb24gIT0ga1NpZ1ZlcnNpb24pIHsKKyAgICAgICAgTE9HVygiVW5zdXBwb3J0ZWQgT2JiRmlsZSB2ZXJzaW9uICVkXG4iLCBzaWdWZXJzaW9uKTsKKyAgICAgICAgZnJlZShzY2FuQnVmKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1WZXJzaW9uID0gKGludDMyX3QpIGdldDRMRSgodW5zaWduZWQgY2hhciopc2NhbkJ1ZiArIGtQYWNrYWdlVmVyc2lvbk9mZnNldCk7CisKKyAgICB1aW50MzJfdCBwYWNrYWdlTmFtZUxlbiA9IGdldDRMRSgodW5zaWduZWQgY2hhciopc2NhbkJ1ZiArIGtQYWNrYWdlTmFtZUxlbk9mZnNldCk7CisgICAgaWYgKHBhY2thZ2VOYW1lTGVuIDw9IDAKKyAgICAgICAgICAgIHx8IHBhY2thZ2VOYW1lTGVuID4gKGZvb3RlclNpemUgLSBrUGFja2FnZU5hbWVPZmZzZXQpKSB7CisgICAgICAgIExPR1coImJhZCBPYmJGaWxlIHBhY2thZ2UgbmFtZSBsZW5ndGggKDB4JTA0eDsgMHglMDR4IHBvc3NpYmxlKVxuIiwKKyAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZUxlbiwgZm9vdGVyU2l6ZSAtIGtQYWNrYWdlTmFtZU9mZnNldCk7CisgICAgICAgIGZyZWUoc2NhbkJ1Zik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjaGFyKiBwYWNrYWdlTmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHNjYW5CdWYgKyBrUGFja2FnZU5hbWVPZmZzZXQpOworICAgIG1QYWNrYWdlTmFtZSA9IFN0cmluZzgoY29uc3RfY2FzdDxjaGFyKj4ocGFja2FnZU5hbWUpLCBwYWNrYWdlTmFtZUxlbik7CisKKyAgICBmcmVlKHNjYW5CdWYpOworCisjaWZkZWYgREVCVUcKKyAgICBMT0dJKCJPYmIgc2NhbiBzdWNjZWVkZWQ6IHBhY2thZ2VOYW1lPSVzLCB2ZXJzaW9uPSVkXG4iLCBtUGFja2FnZU5hbWUuc3RyaW5nKCksIG1WZXJzaW9uKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2JiRmlsZTo6d3JpdGVUbyhjb25zdCBjaGFyKiBmaWxlbmFtZSkKK3sKKyAgICBpbnQgZmQ7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisKKyAgICBmZCA9IDo6b3BlbihmaWxlbmFtZSwgT19XUk9OTFkpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHN1Y2Nlc3MgPSB3cml0ZVRvKGZkKTsKKyAgICBjbG9zZShmZCk7CisKK291dDoKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgTE9HVygiZmFpbGVkIHRvIHdyaXRlIHRvICVzOiAlc1xuIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorICAgIHJldHVybiBzdWNjZXNzOworfQorCitib29sIE9iYkZpbGU6OndyaXRlVG8oaW50IGZkKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG15X2xzZWVrNjQoZmQsIDAsIFNFRUtfRU5EKTsKKworICAgIGlmIChtUGFja2FnZU5hbWUuc2l6ZSgpID09IDAgfHwgbVZlcnNpb24gPT0gLTEpIHsKKyAgICAgICAgTE9HVygidHJpZWQgdG8gd3JpdGUgdW5pbml0aWFsaXplZCBPYmJGaWxlIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIGNoYXIgaW50QnVmW3NpemVvZih1aW50MzJfdCkrMV07CisgICAgbWVtc2V0KCZpbnRCdWYsIDAsIHNpemVvZihpbnRCdWYpKTsKKworICAgIHB1dDRMRShpbnRCdWYsIGtTaWdWZXJzaW9uKTsKKyAgICBpZiAod3JpdGUoZmQsICZpbnRCdWYsIHNpemVvZih1aW50MzJfdCkpICE9IChzc2l6ZV90KXNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgTE9HVygiY291bGRuJ3Qgd3JpdGUgc2lnbmF0dXJlIHZlcnNpb246ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1dDRMRShpbnRCdWYsIG1WZXJzaW9uKTsKKyAgICBpZiAod3JpdGUoZmQsICZpbnRCdWYsIHNpemVvZih1aW50MzJfdCkpICE9IChzc2l6ZV90KXNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgTE9HVygiY291bGRuJ3Qgd3JpdGUgcGFja2FnZSB2ZXJzaW9uIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3QgcGFja2FnZU5hbWVMZW4gPSBtUGFja2FnZU5hbWUuc2l6ZSgpOworICAgIHB1dDRMRShpbnRCdWYsIHBhY2thZ2VOYW1lTGVuKTsKKyAgICBpZiAod3JpdGUoZmQsICZpbnRCdWYsIHNpemVvZih1aW50MzJfdCkpICE9IChzc2l6ZV90KXNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgTE9HVygiY291bGRuJ3Qgd3JpdGUgcGFja2FnZSBuYW1lIGxlbmd0aDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHdyaXRlKGZkLCBtUGFja2FnZU5hbWUuc3RyaW5nKCksIHBhY2thZ2VOYW1lTGVuKSAhPSAoc3NpemVfdClwYWNrYWdlTmFtZUxlbikgeworICAgICAgICBMT0dXKCJjb3VsZG4ndCB3cml0ZSBwYWNrYWdlIG5hbWU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1dDRMRShpbnRCdWYsIDMqc2l6ZW9mKHVpbnQzMl90KSArIHBhY2thZ2VOYW1lTGVuKTsKKyAgICBpZiAod3JpdGUoZmQsICZpbnRCdWYsIHNpemVvZih1aW50MzJfdCkpICE9IChzc2l6ZV90KXNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgTE9HVygiY291bGRuJ3Qgd3JpdGUgZm9vdGVyIHNpemU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1dDRMRShpbnRCdWYsIGtTaWduYXR1cmUpOworICAgIGlmICh3cml0ZShmZCwgJmludEJ1Ziwgc2l6ZW9mKHVpbnQzMl90KSkgIT0gKHNzaXplX3Qpc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICBMT0dXKCJjb3VsZG4ndCB3cml0ZSBmb290ZXIgbWFnaWMgc2lnbmF0dXJlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9Qb2xsTG9vcC5jcHAgYi9saWJzL3V0aWxzL1BvbGxMb29wLmNwcAppbmRleCAyMGE0ZDEzLi5mNzQwZmEwIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL1BvbGxMb29wLmNwcAorKysgYi9saWJzL3V0aWxzL1BvbGxMb29wLmNwcApAQCAtMjEsOCArMjEsMTMgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1Qb2xsTG9vcDo6UG9sbExvb3AoKSA6Ci0gICAgICAgIG1Qb2xsaW5nKGZhbHNlKSwgbVdhaXRlcnMoMCkgeworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnVExTTXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworc3RhdGljIGJvb2wgZ0hhdmVUTFMgPSBmYWxzZTsKK3N0YXRpYyBwdGhyZWFkX2tleV90IGdUTFMgPSAwOworCitQb2xsTG9vcDo6UG9sbExvb3AoYm9vbCBhbGxvd05vbkNhbGxiYWNrcykgOgorICAgICAgICBtQWxsb3dOb25DYWxsYmFja3MoYWxsb3dOb25DYWxsYmFja3MpLCBtUG9sbGluZyhmYWxzZSksCisgICAgICAgIG1XYWl0ZXJzKDApLCBtUGVuZGluZ0Zkc1BvcygwKSB7CiAgICAgb3Blbldha2VQaXBlKCk7CiB9CiAKQEAgLTMwLDYgKzM1LDQxIEBACiAgICAgY2xvc2VXYWtlUGlwZSgpOwogfQogCit2b2lkIFBvbGxMb29wOjp0aHJlYWREZXN0cnVjdG9yKHZvaWQgKnN0KSB7CisgICAgUG9sbExvb3AqIGNvbnN0IHNlbGYgPSBzdGF0aWNfY2FzdDxQb2xsTG9vcCo+KHN0KTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIHNlbGYtPmRlY1N0cm9uZygodm9pZCopdGhyZWFkRGVzdHJ1Y3Rvcik7CisgICAgfQorfQorCit2b2lkIFBvbGxMb29wOjpzZXRGb3JUaHJlYWQoY29uc3Qgc3A8UG9sbExvb3A+JiBwb2xsTG9vcCkgeworICAgIHNwPFBvbGxMb29wPiBvbGQgPSBnZXRGb3JUaHJlYWQoKTsKKyAgICAKKyAgICBpZiAocG9sbExvb3AgIT0gTlVMTCkgeworICAgICAgICBwb2xsTG9vcC0+aW5jU3Ryb25nKCh2b2lkKil0aHJlYWREZXN0cnVjdG9yKTsKKyAgICB9CisgICAgCisgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnVExTLCBwb2xsTG9vcC5nZXQoKSk7CisgICAgCisgICAgaWYgKG9sZCAhPSBOVUxMKSB7CisgICAgICAgIG9sZC0+ZGVjU3Ryb25nKCh2b2lkKil0aHJlYWREZXN0cnVjdG9yKTsKKyAgICB9Cit9CisgICAgCitzcDxQb2xsTG9vcD4gUG9sbExvb3A6OmdldEZvclRocmVhZCgpIHsKKyAgICBpZiAoIWdIYXZlVExTKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ1RMU011dGV4KTsKKyAgICAgICAgaWYgKHB0aHJlYWRfa2V5X2NyZWF0ZSgmZ1RMUywgdGhyZWFkRGVzdHJ1Y3RvcikgIT0gMCkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdUTFNNdXRleCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBnSGF2ZVRMUyA9IHRydWU7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnVExTTXV0ZXgpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKFBvbGxMb29wKilwdGhyZWFkX2dldHNwZWNpZmljKGdUTFMpOworfQorCiB2b2lkIFBvbGxMb29wOjpvcGVuV2FrZVBpcGUoKSB7CiAgICAgaW50IHdha2VGZHNbMl07CiAgICAgaW50IHJlc3VsdCA9IHBpcGUod2FrZUZkcyk7CkBAIC01NCw2ICs5NCw3IEBACiAKICAgICBSZXF1ZXN0ZWRDYWxsYmFjayByZXF1ZXN0ZWRDYWxsYmFjazsKICAgICByZXF1ZXN0ZWRDYWxsYmFjay5jYWxsYmFjayA9IE5VTEw7CisgICAgcmVxdWVzdGVkQ2FsbGJhY2subG9vcGVyQ2FsbGJhY2sgPSBOVUxMOwogICAgIHJlcXVlc3RlZENhbGxiYWNrLmRhdGEgPSBOVUxMOwogICAgIG1SZXF1ZXN0ZWRDYWxsYmFja3MuaW5zZXJ0QXQocmVxdWVzdGVkQ2FsbGJhY2ssIDApOwogfQpAQCAtNjYsNyArMTA3LDE4IEBACiAgICAgLy8gICAgICAgbWV0aG9kIGlzIGN1cnJlbnRseSBvbmx5IGNhbGxlZCBieSB0aGUgZGVzdHJ1Y3Rvci4KIH0KIAotYm9vbCBQb2xsTG9vcDo6cG9sbE9uY2UoaW50IHRpbWVvdXRNaWxsaXMpIHsKK2ludDMyX3QgUG9sbExvb3A6OnBvbGxPbmNlKGludCB0aW1lb3V0TWlsbGlzLCBpbnQqIG91dEV2ZW50cywgdm9pZCoqIG91dERhdGEpIHsKKyAgICAvLyBJZiB0aGVyZSBhcmUgc3RpbGwgcGVuZGluZyBmZHMgZnJvbSB0aGUgbGFzdCBjYWxsLCBkaXNwYXRjaCB0aG9zZQorICAgIC8vIGZpcnN0LCB0byBhdm9pZCBhbiBlYXJsaWVyIGZkIGZyb20gc3RhcnZpbmcgbGF0ZXIgb25lcy4KKyAgICBjb25zdCBzaXplX3QgcGVuZGluZ0Zkc0NvdW50ID0gbVBlbmRpbmdGZHMuc2l6ZSgpOworICAgIGlmIChtUGVuZGluZ0Zkc1BvcyA8IHBlbmRpbmdGZHNDb3VudCkgeworICAgICAgICBjb25zdCBQZW5kaW5nQ2FsbGJhY2smIHBlbmRpbmcgPSBtUGVuZGluZ0Zkcy5pdGVtQXQobVBlbmRpbmdGZHNQb3MpOworICAgICAgICBtUGVuZGluZ0Zkc1BvcysrOworICAgICAgICBpZiAob3V0RXZlbnRzICE9IE5VTEwpICpvdXRFdmVudHMgPSBwZW5kaW5nLmV2ZW50czsKKyAgICAgICAgaWYgKG91dERhdGEgIT0gTlVMTCkgKm91dERhdGEgPSBwZW5kaW5nLmRhdGE7CisgICAgICAgIHJldHVybiBwZW5kaW5nLmZkOworICAgIH0KKyAgICAKICAgICBtTG9jay5sb2NrKCk7CiAgICAgd2hpbGUgKG1XYWl0ZXJzICE9IDApIHsKICAgICAgICAgbVJlc3VtZS53YWl0KG1Mb2NrKTsKQEAgLTc0LDcgKzEyNiw3IEBACiAgICAgbVBvbGxpbmcgPSB0cnVlOwogICAgIG1Mb2NrLnVubG9jaygpOwogCi0gICAgYm9vbCByZXN1bHQ7CisgICAgaW50MzJfdCByZXN1bHQ7CiAgICAgc2l6ZV90IHJlcXVlc3RlZENvdW50ID0gbVJlcXVlc3RlZEZkcy5zaXplKCk7CiAKICNpZiBERUJVR19QT0xMX0FORF9XQUtFCkBAIC05MSw3ICsxNDMsNyBAQAogI2lmIERFQlVHX1BPTExfQU5EX1dBS0UKICAgICAgICAgTE9HRCgiJXAgfiBwb2xsT25jZSAtIHRpbWVvdXQiLCB0aGlzKTsKICNlbmRpZgotICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgcmVzdWx0ID0gUE9MTF9USU1FT1VUOwogICAgICAgICBnb3RvIERvbmU7CiAgICAgfQogCkBAIC0xMDMsNyArMTU1LDcgQEAKICAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7CiAgICAgICAgICAgICBMT0dXKCJQb2xsIGZhaWxlZCB3aXRoIGFuIHVuZXhwZWN0ZWQgZXJyb3IsIGVycm5vPSVkIiwgZXJybm8pOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICByZXN1bHQgPSBQT0xMX0VSUk9SOwogICAgICAgICBnb3RvIERvbmU7CiAgICAgfQogCkBAIC0xMTYsMzYgKzE2OCw0NCBAQAogI2VuZGlmCiAKICAgICBtUGVuZGluZ0NhbGxiYWNrcy5jbGVhcigpOworICAgIG1QZW5kaW5nRmRzLmNsZWFyKCk7CisgICAgbVBlbmRpbmdGZHNQb3MgPSAwOworICAgIGlmIChvdXRFdmVudHMgIT0gTlVMTCkgKm91dEV2ZW50cyA9IDA7CisgICAgaWYgKG91dERhdGEgIT0gTlVMTCkgKm91dERhdGEgPSBOVUxMOworICAgIAorICAgIHJlc3VsdCA9IFBPTExfQ0FMTEJBQ0s7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0ZWRDb3VudDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHN0cnVjdCBwb2xsZmQmIHJlcXVlc3RlZEZkID0gbVJlcXVlc3RlZEZkcy5pdGVtQXQoaSk7CiAKICAgICAgICAgc2hvcnQgcmV2ZW50cyA9IHJlcXVlc3RlZEZkLnJldmVudHM7CiAgICAgICAgIGlmIChyZXZlbnRzKSB7CiAgICAgICAgICAgICBjb25zdCBSZXF1ZXN0ZWRDYWxsYmFjayYgcmVxdWVzdGVkQ2FsbGJhY2sgPSBtUmVxdWVzdGVkQ2FsbGJhY2tzLml0ZW1BdChpKTsKLSAgICAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrID0gcmVxdWVzdGVkQ2FsbGJhY2suY2FsbGJhY2s7CisgICAgICAgICAgICBQZW5kaW5nQ2FsbGJhY2sgcGVuZGluZzsKKyAgICAgICAgICAgIHBlbmRpbmcuZmQgPSByZXF1ZXN0ZWRGZC5mZDsKKyAgICAgICAgICAgIHBlbmRpbmcuZXZlbnRzID0gcmV2ZW50czsKKyAgICAgICAgICAgIHBlbmRpbmcuY2FsbGJhY2sgPSByZXF1ZXN0ZWRDYWxsYmFjay5jYWxsYmFjazsKKyAgICAgICAgICAgIHBlbmRpbmcubG9vcGVyQ2FsbGJhY2sgPSByZXF1ZXN0ZWRDYWxsYmFjay5sb29wZXJDYWxsYmFjazsKKyAgICAgICAgICAgIHBlbmRpbmcuZGF0YSA9IHJlcXVlc3RlZENhbGxiYWNrLmRhdGE7CiAKLSAgICAgICAgICAgIGlmIChjYWxsYmFjaykgewotICAgICAgICAgICAgICAgIFBlbmRpbmdDYWxsYmFjayBwZW5kaW5nQ2FsbGJhY2s7Ci0gICAgICAgICAgICAgICAgcGVuZGluZ0NhbGxiYWNrLmZkID0gcmVxdWVzdGVkRmQuZmQ7Ci0gICAgICAgICAgICAgICAgcGVuZGluZ0NhbGxiYWNrLmV2ZW50cyA9IHJlcXVlc3RlZEZkLnJldmVudHM7Ci0gICAgICAgICAgICAgICAgcGVuZGluZ0NhbGxiYWNrLmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgICAgICAgICAgcGVuZGluZ0NhbGxiYWNrLmRhdGEgPSByZXF1ZXN0ZWRDYWxsYmFjay5kYXRhOwotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnB1c2gocGVuZGluZ0NhbGxiYWNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZEZkLmZkID09IG1XYWtlUmVhZFBpcGVGZCkgewotI2lmIERFQlVHX1BPTExfQU5EX1dBS0UKLSAgICAgICAgICAgICAgICAgICAgTE9HRCgiJXAgfiBwb2xsT25jZSAtIGF3b2tlbiIsIHRoaXMpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzE2XTsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBuUmVhZDsKLSAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgblJlYWQgPSByZWFkKG1XYWtlUmVhZFBpcGVGZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG5SZWFkID09IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIGlmIChwZW5kaW5nLmNhbGxiYWNrIHx8IHBlbmRpbmcubG9vcGVyQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5wdXNoKHBlbmRpbmcpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwZW5kaW5nLmZkICE9IG1XYWtlUmVhZFBpcGVGZCkgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUE9MTF9DQUxMQkFDSykgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwZW5kaW5nLmZkOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0RXZlbnRzICE9IE5VTEwpICpvdXRFdmVudHMgPSBwZW5kaW5nLmV2ZW50czsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dERhdGEgIT0gTlVMTCkgKm91dERhdGEgPSBwZW5kaW5nLmRhdGE7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSNpZiBERUJVR19QT0xMX0FORF9XQUtFIHx8IERFQlVHX0NBTExCQUNLUwotICAgICAgICAgICAgICAgICAgICBMT0dEKCIlcCB+IHBvbGxPbmNlIC0gZmQgJWQgaGFzIG5vIGNhbGxiYWNrISIsIHRoaXMsIHJlcXVlc3RlZEZkLmZkKTsKLSNlbmRpZgorICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0Zkcy5wdXNoKHBlbmRpbmcpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisjaWYgREVCVUdfUE9MTF9BTkRfV0FLRQorICAgICAgICAgICAgICAgIExPR0QoIiVwIH4gcG9sbE9uY2UgLSBhd29rZW4iLCB0aGlzKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzE2XTsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG5SZWFkOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgblJlYWQgPSByZWFkKG1XYWtlUmVhZFBpcGVGZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoblJlYWQgPT0gc2l6ZW9mKGJ1ZmZlcikpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXNwb25kZWRDb3VudCAtPSAxOwpAQCAtMTU0LDcgKzIxNCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmVzdWx0ID0gdHJ1ZTsKIAogRG9uZToKICAgICBtTG9jay5sb2NrKCk7CkBAIC0xNjQsNyArMjIzLDcgQEAKICAgICB9CiAgICAgbUxvY2sudW5sb2NrKCk7CiAKLSAgICBpZiAocmVzdWx0KSB7CisgICAgaWYgKHJlc3VsdCA9PSBQT0xMX0NBTExCQUNLIHx8IHJlc3VsdCA+PSAwKSB7CiAgICAgICAgIHNpemVfdCBwZW5kaW5nQ291bnQgPSBtUGVuZGluZ0NhbGxiYWNrcy5zaXplKCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGVuZGluZ0NvdW50OyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IFBlbmRpbmdDYWxsYmFjayYgcGVuZGluZ0NhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuaXRlbUF0KGkpOwpAQCAtMTcyLDggKzIzMSwxNCBAQAogICAgICAgICAgICAgTE9HRCgiJXAgfiBwb2xsT25jZSAtIGludm9raW5nIGNhbGxiYWNrIGZvciBmZCAlZCIsIHRoaXMsIHBlbmRpbmdDYWxsYmFjay5mZCk7CiAjZW5kaWYKIAotICAgICAgICAgICAgYm9vbCBrZWVwID0gcGVuZGluZ0NhbGxiYWNrLmNhbGxiYWNrKHBlbmRpbmdDYWxsYmFjay5mZCwgcGVuZGluZ0NhbGxiYWNrLmV2ZW50cywKLSAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0NhbGxiYWNrLmRhdGEpOworICAgICAgICAgICAgYm9vbCBrZWVwID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChwZW5kaW5nQ2FsbGJhY2suY2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGtlZXAgPSBwZW5kaW5nQ2FsbGJhY2suY2FsbGJhY2socGVuZGluZ0NhbGxiYWNrLmZkLCBwZW5kaW5nQ2FsbGJhY2suZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0NhbGxiYWNrLmRhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBrZWVwID0gcGVuZGluZ0NhbGxiYWNrLmxvb3BlckNhbGxiYWNrKHBlbmRpbmdDYWxsYmFjay5mZCwgcGVuZGluZ0NhbGxiYWNrLmV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdDYWxsYmFjay5kYXRhKSAhPSAwOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCEga2VlcCkgewogICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrKHBlbmRpbmdDYWxsYmFjay5mZCk7CiAgICAgICAgICAgICB9CkBAIC0xOTksMTcgKzI2NCwzOCBAQAogICAgIH0KIH0KIAorYm9vbCBQb2xsTG9vcDo6Z2V0QWxsb3dOb25DYWxsYmFja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BbGxvd05vbkNhbGxiYWNrczsKK30KKwogdm9pZCBQb2xsTG9vcDo6c2V0Q2FsbGJhY2soaW50IGZkLCBpbnQgZXZlbnRzLCBDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogZGF0YSkgeworICAgIHNldENhbGxiYWNrQ29tbW9uKGZkLCBldmVudHMsIGNhbGxiYWNrLCBOVUxMLCBkYXRhKTsKK30KKwordm9pZCBQb2xsTG9vcDo6c2V0TG9vcGVyQ2FsbGJhY2soaW50IGZkLCBpbnQgZXZlbnRzLCBBTG9vcGVyX2NhbGxiYWNrRnVuYyogY2FsbGJhY2ssCisgICAgICAgIHZvaWQqIGRhdGEpIHsKKyAgICBzZXRDYWxsYmFja0NvbW1vbihmZCwgZXZlbnRzLCBOVUxMLCBjYWxsYmFjaywgZGF0YSk7Cit9CisKK3ZvaWQgUG9sbExvb3A6OnNldENhbGxiYWNrQ29tbW9uKGludCBmZCwgaW50IGV2ZW50cywgQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgIEFMb29wZXJfY2FsbGJhY2tGdW5jKiBsb29wZXJDYWxsYmFjaywgdm9pZCogZGF0YSkgeworCiAjaWYgREVCVUdfQ0FMTEJBQ0tTCiAgICAgTE9HRCgiJXAgfiBzZXRDYWxsYmFjayAtIGZkPSVkLCBldmVudHM9JWQiLCB0aGlzLCBmZCwgZXZlbnRzKTsKICNlbmRpZgogCi0gICAgaWYgKCEgZXZlbnRzIHx8ICEgY2FsbGJhY2spIHsKLSAgICAgICAgTE9HRSgiSW52YWxpZCBhdHRlbXB0IHRvIHNldCBhIGNhbGxiYWNrIHdpdGggbm8gc2VsZWN0ZWQgcG9sbCBldmVudHMgb3Igbm8gY2FsbGJhY2suIik7CisgICAgaWYgKCEgZXZlbnRzKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgYXR0ZW1wdCB0byBzZXQgYSBjYWxsYmFjayB3aXRoIG5vIHNlbGVjdGVkIHBvbGwgZXZlbnRzLiIpOwogICAgICAgICByZW1vdmVDYWxsYmFjayhmZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBpZiAoISBjYWxsYmFjayAmJiAhIGxvb3BlckNhbGxiYWNrICYmICEgbUFsbG93Tm9uQ2FsbGJhY2tzKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgYXR0ZW1wdCB0byBzZXQgTlVMTCBjYWxsYmFjayBidXQgbm90IGFsbG93ZWQuIik7CisgICAgICAgIHJlbW92ZUNhbGxiYWNrKGZkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKICAgICB3YWtlQW5kTG9jaygpOwogCiAgICAgc3RydWN0IHBvbGxmZCByZXF1ZXN0ZWRGZDsKQEAgLTIxOCw2ICszMDQsNyBAQAogCiAgICAgUmVxdWVzdGVkQ2FsbGJhY2sgcmVxdWVzdGVkQ2FsbGJhY2s7CiAgICAgcmVxdWVzdGVkQ2FsbGJhY2suY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICByZXF1ZXN0ZWRDYWxsYmFjay5sb29wZXJDYWxsYmFjayA9IGxvb3BlckNhbGxiYWNrOwogICAgIHJlcXVlc3RlZENhbGxiYWNrLmRhdGEgPSBkYXRhOwogCiAgICAgc3NpemVfdCBpbmRleCA9IGdldFJlcXVlc3RJbmRleExvY2tlZChmZCk7CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL3Rlc3RzL0FuZHJvaWQubWsgYi9saWJzL3V0aWxzL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggOTJlYmZkN2MuLmYxYjhjZDUgMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvdGVzdHMvQW5kcm9pZC5taworKysgYi9saWJzL3V0aWxzL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTMsNiArMyw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogdGVzdF9zcmNfZmlsZXMgOj0gXAorCU9iYkZpbGVfdGVzdC5jcHAgXAogCVBvbGxMb29wX3Rlc3QuY3BwCiAKIHNoYXJlZF9saWJyYXJpZXMgOj0gXApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy90ZXN0cy9PYmJGaWxlX3Rlc3QuY3BwIGIvbGlicy91dGlscy90ZXN0cy9PYmJGaWxlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YmI3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3V0aWxzL3Rlc3RzL09iYkZpbGVfdGVzdC5jcHAKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT2JiRmlsZV90ZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL09iYkZpbGUuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGZjbnRsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBURVNUX0ZJTEVOQU1FICIvdGVzdC5vYmIiCisKK2NsYXNzIE9iYkZpbGVUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIHNwPE9iYkZpbGU+IG1PYmJGaWxlOworICAgIGNoYXIqIG1FeHRlcm5hbFN0b3JhZ2U7CisgICAgY2hhciogbUZpbGVOYW1lOworCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgICAgICBtT2JiRmlsZSA9IG5ldyBPYmJGaWxlKCk7CisgICAgICAgIG1FeHRlcm5hbFN0b3JhZ2UgPSBnZXRlbnYoIkVYVEVSTkFMX1NUT1JBR0UiKTsKKworICAgICAgICBjb25zdCBpbnQgdG90YWxMZW4gPSBzdHJsZW4obUV4dGVybmFsU3RvcmFnZSkgKyBzdHJsZW4oVEVTVF9GSUxFTkFNRSkgKyAxOworICAgICAgICBtRmlsZU5hbWUgPSBuZXcgY2hhclt0b3RhbExlbl07CisgICAgICAgIHNucHJpbnRmKG1GaWxlTmFtZSwgdG90YWxMZW4sICIlcyVzIiwgbUV4dGVybmFsU3RvcmFnZSwgVEVTVF9GSUxFTkFNRSk7CisKKyAgICAgICAgaW50IGZkID0gOjpvcGVuKG1GaWxlTmFtZSwgT19DUkVBVCB8IE9fVFJVTkMpOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkNvdWxkbid0IGNyZWF0ZSAiIDw8IG1GaWxlTmFtZSA8PCAiIGZvciB0ZXN0cyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgfQorfTsKKworVEVTVF9GKE9iYkZpbGVUZXN0LCBSZWFkRmFpbHVyZSkgeworICAgIEVYUEVDVF9GQUxTRShtT2JiRmlsZS0+cmVhZEZyb20oLTEpKQorICAgICAgICAgICAgPDwgIk5vIGZhaWx1cmUgb24gaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IiOworfQorCitURVNUX0YoT2JiRmlsZVRlc3QsIFdyaXRlVGhlblJlYWQpIHsKKyAgICBjb25zdCBjaGFyKiBwYWNrYWdlTmFtZSA9ICJjb20uZXhhbXBsZS5vYmJmaWxlIjsKKyAgICBjb25zdCBpbnQzMl90IHZlcnNpb25OdW0gPSAxOworCisgICAgbU9iYkZpbGUtPnNldFBhY2thZ2VOYW1lKFN0cmluZzgocGFja2FnZU5hbWUpKTsKKyAgICBtT2JiRmlsZS0+c2V0VmVyc2lvbih2ZXJzaW9uTnVtKTsKKworICAgIEVYUEVDVF9UUlVFKG1PYmJGaWxlLT53cml0ZVRvKG1GaWxlTmFtZSkpCisgICAgICAgICAgICA8PCAiY291bGRuJ3Qgd3JpdGUgdG8gZmFrZSAub2JiIGZpbGUiOworCisgICAgbU9iYkZpbGUgPSBuZXcgT2JiRmlsZSgpOworCisgICAgRVhQRUNUX1RSVUUobU9iYkZpbGUtPnJlYWRGcm9tKG1GaWxlTmFtZSkpCisgICAgICAgICAgICA8PCAiY291bGRuJ3QgcmVhZCBmcm9tIGZha2UgLm9iYiBmaWxlIjsKKworICAgIEVYUEVDVF9FUSh2ZXJzaW9uTnVtLCBtT2JiRmlsZS0+Z2V0VmVyc2lvbigpKQorICAgICAgICAgICAgPDwgInZlcnNpb24gZGlkbid0IGNvbWUgb3V0IHRoZSBzYW1lIGFzIGl0IHdlbnQgaW4iOworICAgIGNvbnN0IGNoYXIqIGN1cnJlbnRQYWNrYWdlTmFtZSA9IG1PYmJGaWxlLT5nZXRQYWNrYWdlTmFtZSgpLnN0cmluZygpOworICAgIEVYUEVDVF9TVFJFUShwYWNrYWdlTmFtZSwgY3VycmVudFBhY2thZ2VOYW1lKQorICAgICAgICAgICAgPDwgInBhY2thZ2UgbmFtZSBkaWRuJ3QgY29tZSBvdXQgdGhlIHNhbWUgYXMgaXQgd2VudCBpbiI7Cit9CisKK30KZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvdGVzdHMvUG9sbExvb3BfdGVzdC5jcHAgYi9saWJzL3V0aWxzL3Rlc3RzL1BvbGxMb29wX3Rlc3QuY3BwCmluZGV4IDQ4NDhjMGYuLjAyZjE4MDggMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvdGVzdHMvUG9sbExvb3BfdGVzdC5jcHAKKysrIGIvbGlicy91dGlscy90ZXN0cy9Qb2xsTG9vcF90ZXN0LmNwcApAQCAtODcsNyArODcsNyBAQAogICAgIHNwPFBvbGxMb29wPiBtUG9sbExvb3A7CiAKICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIG1Qb2xsTG9vcCA9IG5ldyBQb2xsTG9vcCgpOworICAgICAgICBtUG9sbExvb3AgPSBuZXcgUG9sbExvb3AoZmFsc2UpOwogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKQEAgLTk4LDI2ICs5OCwyNiBAQAogCiBURVNUX0YoUG9sbExvb3BUZXN0LCBQb2xsT25jZV9XaGVuTm9uWmVyb1RpbWVvdXRBbmROb3RBd29rZW5fV2FpdHNGb3JUaW1lb3V0QW5kUmV0dXJuc0ZhbHNlKSB7CiAgICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBib29sIHJlc3VsdCA9IG1Qb2xsTG9vcC0+cG9sbE9uY2UoMTAwKTsKKyAgICBpbnQzMl90IHJlc3VsdCA9IG1Qb2xsTG9vcC0+cG9sbE9uY2UoMTAwKTsKICAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7CiAKICAgICBFWFBFQ1RfTkVBUigxMDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCiAgICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIGVxdWFsIHRpbWVvdXQiOwotICAgIEVYUEVDVF9GQUxTRShyZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBmYWxzZSBiZWNhdXNlIHRpbWVvdXQgb2NjdXJyZWQiOworICAgIEVYUEVDVF9FUShyZXN1bHQsIFBvbGxMb29wOjpQT0xMX1RJTUVPVVQpCisgICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBQT0xMX1RJTUVPVVQiOwogfQogCiBURVNUX0YoUG9sbExvb3BUZXN0LCBQb2xsT25jZV9XaGVuTm9uWmVyb1RpbWVvdXRBbmRBd29rZW5CZWZvcmVXYWl0aW5nX0ltbWVkaWF0ZWx5UmV0dXJuc1RydWUpIHsKICAgICBtUG9sbExvb3AtPndha2UoKTsKIAogICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgYm9vbCByZXN1bHQgPSBtUG9sbExvb3AtPnBvbGxPbmNlKDEwMDApOworICAgIGludDMyX3QgcmVzdWx0ID0gbVBvbGxMb29wLT5wb2xsT25jZSgxMDAwKTsKICAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7CiAKICAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQogICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiB6ZXJvIGJlY2F1c2Ugd2FrZSgpIHdhcyBjYWxsZWQgYmVmb3JlIHdhaXRpbmciOwotICAgIEVYUEVDVF9UUlVFKHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIHRydWUgYmVjYXVzZSBsb29wIHdhcyBhd29rZW4iOworICAgIEVYUEVDVF9FUShyZXN1bHQsIFBvbGxMb29wOjpQT0xMX0NBTExCQUNLKQorICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgUE9MTF9DQUxMQkFDSyBiZWNhdXNlIGxvb3Agd2FzIGF3b2tlbiI7CiB9CiAKIFRFU1RfRihQb2xsTG9vcFRlc3QsIFBvbGxPbmNlX1doZW5Ob25aZXJvVGltZW91dEFuZEF3b2tlbldoaWxlV2FpdGluZ19Qcm9tcHRseVJldHVybnNUcnVlKSB7CkBAIC0xMjUsMjQgKzEyNSwyNCBAQAogICAgIGRlbGF5ZWRXYWtlLT5ydW4oKTsKIAogICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgYm9vbCByZXN1bHQgPSBtUG9sbExvb3AtPnBvbGxPbmNlKDEwMDApOworICAgIGludDMyX3QgcmVzdWx0ID0gbVBvbGxMb29wLT5wb2xsT25jZSgxMDAwKTsKICAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7CiAKICAgICBFWFBFQ1RfTkVBUigxMDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCiAgICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIGVxdWFsIHdha2UgZGVsYXkiOwotICAgIEVYUEVDVF9UUlVFKHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIHRydWUgYmVjYXVzZSBsb29wIHdhcyBhd29rZW4iOworICAgIEVYUEVDVF9FUShyZXN1bHQsIFBvbGxMb29wOjpQT0xMX0NBTExCQUNLKQorICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgUE9MTF9DQUxMQkFDSyBiZWNhdXNlIGxvb3Agd2FzIGF3b2tlbiI7CiB9CiAKIFRFU1RfRihQb2xsTG9vcFRlc3QsIFBvbGxPbmNlX1doZW5aZXJvVGltZW91dEFuZE5vUmVnaXN0ZXJlZEZEc19JbW1lZGlhdGVseVJldHVybnNGYWxzZSkgewogICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgYm9vbCByZXN1bHQgPSBtUG9sbExvb3AtPnBvbGxPbmNlKDApOworICAgIGludDMyX3QgcmVzdWx0ID0gbVBvbGxMb29wLT5wb2xsT25jZSgwKTsKICAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7CiAKICAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQogICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYmUgYXBwcm94LiB6ZXJvIjsKLSAgICBFWFBFQ1RfRkFMU0UocmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgZmFsc2UgYmVjYXVzZSB0aW1lb3V0IG9jY3VycmVkIjsKKyAgICBFWFBFQ1RfRVEocmVzdWx0LCBQb2xsTG9vcDo6UE9MTF9USU1FT1VUKQorICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgUE9MTF9USU1FT1VUIjsKIH0KIAogVEVTVF9GKFBvbGxMb29wVGVzdCwgUG9sbE9uY2VfV2hlblplcm9UaW1lb3V0QW5kTm9TaWduYWxsZWRGRHNfSW1tZWRpYXRlbHlSZXR1cm5zRmFsc2UpIHsKQEAgLTE1MiwxMyArMTUyLDEzIEBACiAgICAgaGFuZGxlci5zZXRDYWxsYmFjayhtUG9sbExvb3AsIHBpcGUucmVjZWl2ZUZkLCBQT0xMX0lOKTsKIAogICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgYm9vbCByZXN1bHQgPSBtUG9sbExvb3AtPnBvbGxPbmNlKDApOworICAgIGludDMyX3QgcmVzdWx0ID0gbVBvbGxMb29wLT5wb2xsT25jZSgwKTsKICAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7CiAKICAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQogICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYmUgYXBwcm94LiB6ZXJvIjsKLSAgICBFWFBFQ1RfRkFMU0UocmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgZmFsc2UgYmVjYXVzZSB0aW1lb3V0IG9jY3VycmVkIjsKKyAgICBFWFBFQ1RfRVEocmVzdWx0LCBQb2xsTG9vcDo6UE9MTF9USU1FT1VUKQorICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgUE9MTF9USU1FT1VUIjsKICAgICBFWFBFQ1RfRVEoMCwgaGFuZGxlci5jYWxsYmFja0NvdW50KQogICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBub3QgaGF2ZSBiZWVuIGludm9rZWQgYmVjYXVzZSBGRCB3YXMgbm90IHNpZ25hbGxlZCI7CiB9CkBAIC0xNzEsMTMgKzE3MSwxMyBAQAogICAgIGhhbmRsZXIuc2V0Q2FsbGJhY2sobVBvbGxMb29wLCBwaXBlLnJlY2VpdmVGZCwgUE9MTF9JTik7CiAKICAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGJvb2wgcmVzdWx0ID0gbVBvbGxMb29wLT5wb2xsT25jZSgwKTsKKyAgICBpbnQzMl90IHJlc3VsdCA9IG1Qb2xsTG9vcC0+cG9sbE9uY2UoMCk7CiAgICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwogCiAgICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKICAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGJlIGFwcHJveC4gemVybyI7Ci0gICAgRVhQRUNUX1RSVUUocmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgdHJ1ZSBiZWNhdXNlIEZEIHdhcyBzaWduYWxsZWQiOworICAgIEVYUEVDVF9FUShyZXN1bHQsIFBvbGxMb29wOjpQT0xMX0NBTExCQUNLKQorICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgUE9MTF9DQUxMQkFDSyBiZWNhdXNlIEZEIHdhcyBzaWduYWxsZWQiOwogICAgIEVYUEVDVF9FUSgxLCBoYW5kbGVyLmNhbGxiYWNrQ291bnQpCiAgICAgICAgICAgICA8PCAiY2FsbGJhY2sgc2hvdWxkIGJlIGludm9rZWQgZXhhY3RseSBvbmNlIjsKICAgICBFWFBFQ1RfRVEocGlwZS5yZWNlaXZlRmQsIGhhbmRsZXIuZmQpCkBAIC0xOTMsMTMgKzE5MywxMyBAQAogICAgIGhhbmRsZXIuc2V0Q2FsbGJhY2sobVBvbGxMb29wLCBwaXBlLnJlY2VpdmVGZCwgUE9MTF9JTik7CiAKICAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGJvb2wgcmVzdWx0ID0gbVBvbGxMb29wLT5wb2xsT25jZSgxMDApOworICAgIGludDMyX3QgcmVzdWx0ID0gbVBvbGxMb29wLT5wb2xsT25jZSgxMDApOwogICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKIAogICAgIEVYUEVDVF9ORUFSKDEwMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKICAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gZXF1YWwgdGltZW91dCI7Ci0gICAgRVhQRUNUX0ZBTFNFKHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIGZhbHNlIGJlY2F1c2UgdGltZW91dCBvY2N1cnJlZCI7CisgICAgRVhQRUNUX0VRKHJlc3VsdCwgUG9sbExvb3A6OlBPTExfVElNRU9VVCkKKyAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIFBPTExfVElNRU9VVCI7CiAgICAgRVhQRUNUX0VRKDAsIGhhbmRsZXIuY2FsbGJhY2tDb3VudCkKICAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgbm90IGhhdmUgYmVlbiBpbnZva2VkIGJlY2F1c2UgRkQgd2FzIG5vdCBzaWduYWxsZWQiOwogfQpAQCAtMjEyLDE1ICsyMTIsMTUgQEAKICAgICBoYW5kbGVyLnNldENhbGxiYWNrKG1Qb2xsTG9vcCwgcGlwZS5yZWNlaXZlRmQsIFBPTExfSU4pOwogCiAgICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBib29sIHJlc3VsdCA9IG1Qb2xsTG9vcC0+cG9sbE9uY2UoMTAwKTsKKyAgICBpbnQzMl90IHJlc3VsdCA9IG1Qb2xsTG9vcC0+cG9sbE9uY2UoMTAwKTsKICAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7CiAKICAgICBBU1NFUlRfRVEoT0ssIHBpcGUucmVhZFNpZ25hbCgpKQogICAgICAgICAgICAgPDwgInNpZ25hbCBzaG91bGQgYWN0dWFsbHkgaGF2ZSBiZWVuIHdyaXR0ZW4iOwogICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCiAgICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBiZSBhcHByb3guIHplcm8iOwotICAgIEVYUEVDVF9UUlVFKHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIHRydWUgYmVjYXVzZSBGRCB3YXMgc2lnbmFsbGVkIjsKKyAgICBFWFBFQ1RfRVEocmVzdWx0LCBQb2xsTG9vcDo6UE9MTF9DQUxMQkFDSykKKyAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIFBPTExfQ0FMTEJBQ0sgYmVjYXVzZSBGRCB3YXMgc2lnbmFsbGVkIjsKICAgICBFWFBFQ1RfRVEoMSwgaGFuZGxlci5jYWxsYmFja0NvdW50KQogICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIGV4YWN0bHkgb25jZSI7CiAgICAgRVhQRUNUX0VRKHBpcGUucmVjZWl2ZUZkLCBoYW5kbGVyLmZkKQpAQCAtMjM4LDE1ICsyMzgsMTUgQEAKICAgICBkZWxheWVkV3JpdGVTaWduYWwtPnJ1bigpOwogCiAgICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBib29sIHJlc3VsdCA9IG1Qb2xsTG9vcC0+cG9sbE9uY2UoMTAwMCk7CisgICAgaW50MzJfdCByZXN1bHQgPSBtUG9sbExvb3AtPnBvbGxPbmNlKDEwMDApOwogICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKIAogICAgIEFTU0VSVF9FUShPSywgcGlwZS5yZWFkU2lnbmFsKCkpCiAgICAgICAgICAgICA8PCAic2lnbmFsIHNob3VsZCBhY3R1YWxseSBoYXZlIGJlZW4gd3JpdHRlbiI7CiAgICAgRVhQRUNUX05FQVIoMTAwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQogICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiBlcXVhbCBzaWduYWwgZGVsYXkiOwotICAgIEVYUEVDVF9UUlVFKHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIHRydWUgYmVjYXVzZSBGRCB3YXMgc2lnbmFsbGVkIjsKKyAgICBFWFBFQ1RfRVEocmVzdWx0LCBQb2xsTG9vcDo6UE9MTF9DQUxMQkFDSykKKyAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIFBPTExfQ0FMTEJBQ0sgYmVjYXVzZSBGRCB3YXMgc2lnbmFsbGVkIjsKICAgICBFWFBFQ1RfRVEoMSwgaGFuZGxlci5jYWxsYmFja0NvdW50KQogICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIGV4YWN0bHkgb25jZSI7CiAgICAgRVhQRUNUX0VRKHBpcGUucmVjZWl2ZUZkLCBoYW5kbGVyLmZkKQpAQCAtMjY0LDE1ICsyNjQsMTUgQEAKICAgICBtUG9sbExvb3AtPnJlbW92ZUNhbGxiYWNrKHBpcGUucmVjZWl2ZUZkKTsKIAogICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgYm9vbCByZXN1bHQgPSBtUG9sbExvb3AtPnBvbGxPbmNlKDEwMCk7CisgICAgaW50MzJfdCByZXN1bHQgPSBtUG9sbExvb3AtPnBvbGxPbmNlKDEwMCk7CiAgICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwogCiAgICAgQVNTRVJUX0VRKE9LLCBwaXBlLnJlYWRTaWduYWwoKSkKICAgICAgICAgICAgIDw8ICJzaWduYWwgc2hvdWxkIGFjdHVhbGx5IGhhdmUgYmVlbiB3cml0dGVuIjsKICAgICBFWFBFQ1RfTkVBUigxMDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCiAgICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIGVxdWFsIHRpbWVvdXQgYmVjYXVzZSBGRCB3YXMgbm8gbG9uZ2VyIHJlZ2lzdGVyZWQiOwotICAgIEVYUEVDVF9GQUxTRShyZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBmYWxzZSBiZWNhdXNlIHRpbWVvdXQgb2NjdXJyZWQiOworICAgIEVYUEVDVF9FUShyZXN1bHQsIFBvbGxMb29wOjpQT0xMX1RJTUVPVVQpCisgICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBQT0xMX1RJTUVPVVQiOwogICAgIEVYUEVDVF9FUSgwLCBoYW5kbGVyLmNhbGxiYWNrQ291bnQpCiAgICAgICAgICAgICA8PCAiY2FsbGJhY2sgc2hvdWxkIG5vdCBiZSBpbnZva2VkIjsKIH0KQEAgLTI4NywxNSArMjg3LDE1IEBACiAgICAgcGlwZS53cml0ZVNpZ25hbCgpOwogCiAgICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBib29sIHJlc3VsdCA9IG1Qb2xsTG9vcC0+cG9sbE9uY2UoMCk7CisgICAgaW50MzJfdCByZXN1bHQgPSBtUG9sbExvb3AtPnBvbGxPbmNlKDApOwogICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKIAogICAgIEFTU0VSVF9FUShPSywgcGlwZS5yZWFkU2lnbmFsKCkpCiAgICAgICAgICAgICA8PCAic2lnbmFsIHNob3VsZCBhY3R1YWxseSBoYXZlIGJlZW4gd3JpdHRlbiI7CiAgICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKICAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gZXF1YWwgemVybyBiZWNhdXNlIEZEIHdhcyBhbHJlYWR5IHNpZ25hbGxlZCI7Ci0gICAgRVhQRUNUX1RSVUUocmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgdHJ1ZSBiZWNhdXNlIEZEIHdhcyBzaWduYWxsZWQiOworICAgIEVYUEVDVF9FUShyZXN1bHQsIFBvbGxMb29wOjpQT0xMX0NBTExCQUNLKQorICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgUE9MTF9DQUxMQkFDSyBiZWNhdXNlIEZEIHdhcyBzaWduYWxsZWQiOwogICAgIEVYUEVDVF9FUSgxLCBoYW5kbGVyLmNhbGxiYWNrQ291bnQpCiAgICAgICAgICAgICA8PCAiY2FsbGJhY2sgc2hvdWxkIGJlIGludm9rZWQiOwogCkBAIC0zMTAsOCArMzEwLDggQEAKICAgICAgICAgICAgIDw8ICJzaWduYWwgc2hvdWxkIGFjdHVhbGx5IGhhdmUgYmVlbiB3cml0dGVuIjsKICAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQogICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiBlcXVhbCB6ZXJvIGJlY2F1c2UgdGltZW91dCB3YXMgemVybyI7Ci0gICAgRVhQRUNUX0ZBTFNFKHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIGZhbHNlIGJlY2F1c2UgdGltZW91dCBvY2N1cnJlZCI7CisgICAgRVhQRUNUX0VRKHJlc3VsdCwgUG9sbExvb3A6OlBPTExfVElNRU9VVCkKKyAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIFBPTExfVElNRU9VVCI7CiAgICAgRVhQRUNUX0VRKDEsIGhhbmRsZXIuY2FsbGJhY2tDb3VudCkKICAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgbm90IGJlIGludm9rZWQgdGhpcyB0aW1lIjsKIH0KQEAgLTM1MSwxNSArMzUxLDE1IEBACiAgICAgcGlwZS53cml0ZVNpZ25hbCgpOyAvLyB3b3VsZCBjYXVzZSBGRCB0byBiZSBjb25zaWRlcmVkIHNpZ25hbGxlZAogCiAgICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBib29sIHJlc3VsdCA9IG1Qb2xsTG9vcC0+cG9sbE9uY2UoMTAwKTsKKyAgICBpbnQzMl90IHJlc3VsdCA9IG1Qb2xsTG9vcC0+cG9sbE9uY2UoMTAwKTsKICAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7CiAKICAgICBBU1NFUlRfRVEoT0ssIHBpcGUucmVhZFNpZ25hbCgpKQogICAgICAgICAgICAgPDwgInNpZ25hbCBzaG91bGQgYWN0dWFsbHkgaGF2ZSBiZWVuIHdyaXR0ZW4iOwogICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCiAgICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIHplcm8gYmVjYXVzZSBGRCB3YXMgYWxyZWFkeSBzaWduYWxsZWQiOwotICAgIEVYUEVDVF9UUlVFKHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIHRydWUgYmVjYXVzZSBGRCB3YXMgc2lnbmFsbGVkIjsKKyAgICBFWFBFQ1RfRVEocmVzdWx0LCBQb2xsTG9vcDo6UE9MTF9DQUxMQkFDSykKKyAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIFBPTExfQ0FMTEJBQ0sgYmVjYXVzZSBGRCB3YXMgc2lnbmFsbGVkIjsKICAgICBFWFBFQ1RfRVEoMCwgaGFuZGxlcjEuY2FsbGJhY2tDb3VudCkKICAgICAgICAgICAgIDw8ICJvcmlnaW5hbCBoYW5kbGVyIGNhbGxiYWNrIHNob3VsZCBub3QgYmUgaW52b2tlZCBiZWNhdXNlIGl0IHdhcyByZXBsYWNlZCI7CiAgICAgRVhQRUNUX0VRKDEsIGhhbmRsZXIyLmNhbGxiYWNrQ291bnQpCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9FZmZlY3QuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0VmZmVjdC5qYXZhCmluZGV4IGIxYjdmZWQuLjA1M2NjMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0VmZmVjdC5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0VmZmVjdC5qYXZhCkBAIC0yNywyMiArMjcsMjUgQEAKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAogLyoqCi0gKiBBdWRpb0VmZmVjdCBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIGF1ZGlvIGVmZmVjdCBjb250cm9sIGluIEphdmEgYXBwbGljYXRpb25zLgotICogQ3JlYXRpbmcgYW4gQXVkaW9FZmZlY3Qgb2JqZWN0IHdpbGwgY3JlYXRlIHRoZSBlZmZlY3QgZW5naW5lIGluIGF1ZGlvIGZyYW1ld29yayBpZiBubwotICogaW5zdGFuY2Ugb2YgdGhlIHNhbWUgZWZmZWN0IHR5cGUgZXhpc3RzIGluIHRoZSBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbi4KLSAqIElmIG9uZSBleGlzdHMsIHRoaXMgaW5zdGFuY2Ugd2lsbCBiZSB1c2VkLiBUaGUgYXBwbGljYXRpb24gY3JlYXRpbmcgdGhlIEF1ZGlvRWZmZWN0IG9iamVjdAotICogKG9yIGEgZGVyaXZlZCBjbGFzcykgd2lsbCBlaXRoZXIgcmVjZWl2ZSBjb250cm9sIG9mIHRoZSBlZmZlY3QgZW5naW5lIG9yIG5vdCBkZXBlbmRpbmcKLSAqIG9uIHRoZSBwcmlvcml0eSBwYXJhbWV0ZXIuIElmIHByaW9yaXR5IGlzIGhpZ2hlciB0aGFuIHRoZSBwcmlvcml0eSB1c2VkIGJ5IHRoZSBjdXJyZW50Ci0gKiBlZmZlY3QgZW5naW5lIG93bmVyLCB0aGUgY29udHJvbCB3aWxsIGJlIHRyYW5zZmVyZWQgdG8gdGhlIG5ldyBvYmplY3QuIE90aGVyd2lzZQotICogY29udHJvbCB3aWxsIHJlbWFpbiB3aXRoIHRoZSBwcmV2aW91cyBvYmplY3QuIEluIHRoaXMgY2FzZSwgdGhlIG5ldyBhcHBsaWNhdGlvbiB3aWxsIGJlCi0gKiBub3RpZmllZCBvZiBjaGFuZ2VzIGluIGVmZmVjdCBlbmdpbmUgc3RhdGUgb3IgY29udHJvbCBvd25lcnNoaXAgYnkgdGhlIGFwcHJvcGlhdGUgbGlzdGVuZXIuCi0gKiBJZiB0aGUgZWZmZWN0IGlzIHRvIGJlIGFwcGxpZWQgdG8gYSBzcGVjaWZpYyBBdWRpb1RyYWNrIG9yIE1lZGlhUGxheWVyIGluc3RhbmNlLAotICogdGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUgYXVkaW8gc2Vzc2lvbiBJRCBvZiB0aGF0IGluc3RhbmNlLgorICogQXVkaW9FZmZlY3QgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyBhdWRpbyBlZmZlY3QgY29udHJvbCBpbiBKYXZhCisgKiBhcHBsaWNhdGlvbnMuCisgKiA8cD5DcmVhdGluZyBhbiBBdWRpb0VmZmVjdCBvYmplY3Qgd2lsbCBjcmVhdGUgdGhlIGVmZmVjdCBlbmdpbmUgaW4KKyAqIGF1ZGlvIGZyYW1ld29yayBpZiBubyBpbnN0YW5jZSBvZiB0aGUgc2FtZSBlZmZlY3QgdHlwZSBleGlzdHMgaW4gdGhlCisgKiBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbi4gSWYgb25lIGV4aXN0cywgdGhpcyBpbnN0YW5jZSB3aWxsIGJlIHVzZWQuCisgKiA8cD5UaGUgYXBwbGljYXRpb24gY3JlYXRpbmcgdGhlIEF1ZGlvRWZmZWN0IG9iamVjdCAob3IgYSBkZXJpdmVkIGNsYXNzKSB3aWxsIGVpdGhlcgorICogcmVjZWl2ZSBjb250cm9sIG9mIHRoZSBlZmZlY3QgZW5naW5lIG9yIG5vdCBkZXBlbmRpbmcgb24gdGhlIHByaW9yaXR5CisgKiBwYXJhbWV0ZXIuIElmIHByaW9yaXR5IGlzIGhpZ2hlciB0aGFuIHRoZSBwcmlvcml0eSB1c2VkIGJ5IHRoZSBjdXJyZW50IGVmZmVjdAorICogZW5naW5lIG93bmVyLCB0aGUgY29udHJvbCB3aWxsIGJlIHRyYW5zZmVyZWQgdG8gdGhlIG5ldyBvYmplY3QuIE90aGVyd2lzZQorICogY29udHJvbCB3aWxsIHJlbWFpbiB3aXRoIHRoZSBwcmV2aW91cyBvYmplY3QuIEluIHRoaXMgY2FzZSwgdGhlIG5ldworICogYXBwbGljYXRpb24gd2lsbCBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIGluIGVmZmVjdCBlbmdpbmUgc3RhdGUgb3IgY29udHJvbAorICogb3duZXJzaGlwIGJ5IHRoZSBhcHByb3BpYXRlIGxpc3RlbmVyLgorICogPHA+SWYgdGhlIGVmZmVjdCBpcyB0byBiZSBhcHBsaWVkIHRvIGEgc3BlY2lmaWMgQXVkaW9UcmFjayBvciBNZWRpYVBsYXllciBpbnN0YW5jZSwKKyAqIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNwZWNpZnkgdGhlIGF1ZGlvIHNlc3Npb24gSUQgb2YgdGhhdCBpbnN0YW5jZSB3aGVuIGNhbGxpbmcgdGhlIEF1ZGlvRWZmZWN0CisgKiBjb25zdHJ1Y3Rvci4KICAqCi0gKiB7QGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCByZXZpZXd9CisgKiB7IEBoaWRlIFBlbmRpbmcgQVBJIGNvdW5jaWwgcmV2aWV3IH0KICAqLwotcHVibGljIGNsYXNzIEF1ZGlvRWZmZWN0Ci17CitwdWJsaWMgY2xhc3MgQXVkaW9FZmZlY3QgewogICAgIHN0YXRpYyB7CiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiYXVkaW9lZmZlY3Rfam5pIik7CiAgICAgICAgIG5hdGl2ZV9pbml0KCk7CkBAIC01MSwzMSArNTQsNjAgQEAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIkF1ZGlvRWZmZWN0LUpBVkEiOwogCiAgICAgLyoqCi0gICAgICogVGhlIGZvbGxvd2luZyBVVUlEcyBkZWZpbmUgZWZmZWN0IHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgYXVkaW8gZWZmZWN0cwotICAgICAqIHdob3NlIGltcGxlbWVudGF0aW9uIGFuZCBpbnRlcmZhY2UgY29uZm9ybSB0byB0aGUgT3BlblNMIEVTIHNwZWNpZmljYXRpb24uCi0gICAgICogVGhlIGRlZmluaXRpb25zIG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIGludGVyZmFjZSBJRHMgaW4gT3BlblNMRVNfSUlELmgKKyAgICAgKiBUaGUgZm9sbG93aW5nIFVVSURzIGRlZmluZSBlZmZlY3QgdHlwZXMgY29ycmVzcG9uZGluZyB0byBzdGFuZGFyZCBhdWRpbworICAgICAqIGVmZmVjdHMgd2hvc2UgaW1wbGVtZW50YXRpb24gYW5kIGludGVyZmFjZSBjb25mb3JtIHRvIHRoZSBPcGVuU0wgRVMKKyAgICAgKiBzcGVjaWZpY2F0aW9uLiBUaGUgZGVmaW5pdGlvbnMgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlIElEcyBpbgorICAgICAqIE9wZW5TTEVTX0lJRC5oCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVVUlEIEVGRkVDVF9UWVBFX0VOVl9SRVZFUkIgPSBVVUlELmZyb21TdHJpbmcoImMyZTVkNWYwLTk0YmQtNDc2My05Y2FjLTRlMjM0ZDA2ODM5ZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVVVJRCBFRkZFQ1RfVFlQRV9QUkVTRVRfUkVWRVJCID0gVVVJRC5mcm9tU3RyaW5nKCI0NzM4MmQ2MC1kZGQ4LTExZGItYmYzYS0wMDAyYTVkNWM1MWIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVVSUQgRUZGRUNUX1RZUEVfRVFVQUxJWkVSID0gVVVJRC5mcm9tU3RyaW5nKCIwYmVkNDMwMC1kZGQ2LTExZGItOGYzNC0wMDAyYTVkNWM1MWIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVVSUQgRUZGRUNUX1RZUEVfQkFTU19CT09TVCA9IFVVSUQuZnJvbVN0cmluZygiMDYzNGYyMjAtZGRkNC0xMWRiLWEwZmMtMDAwMmE1ZDVjNTFiIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVVUlEIEVGRkVDVF9UWVBFX1ZJUlRVQUxJWkVSID0gVVVJRC5mcm9tU3RyaW5nKCIzN2NjMmMwMC1kZGRkLTExZGItODU3Ny0wMDAyYTVkNWM1MWIiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVVVJRCBFRkZFQ1RfVFlQRV9JTlZBTElEID0gVVVJRC5mcm9tU3RyaW5nKCJlYzcxNzhlYy1lNWUxLTQ0MzItYTNmNC00NjU3ZTY3OTUyMTAiKTsKIAogICAgIC8qKgotICAgICAqIFN0YXRlIG9mIGFuIEF1ZGlvRWZmZWN0IG9iamVjdCB0aGF0IHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIHVwb24gY3JlYXRpb24KKyAgICAgKiBVVUlEIGZvciBlbnZpcm9ubWVudGFsIHJldmVyYiBlZmZlY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVVSUQgRUZGRUNUX1RZUEVfRU5WX1JFVkVSQiA9IFVVSUQKKyAgICAgICAgICAgIC5mcm9tU3RyaW5nKCJjMmU1ZDVmMC05NGJkLTQ3NjMtOWNhYy00ZTIzNGQwNjgzOWUiKTsKKyAgICAvKioKKyAgICAgKiBVVUlEIGZvciBwcmVzZXQgcmV2ZXJiIGVmZmVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVVVJRCBFRkZFQ1RfVFlQRV9QUkVTRVRfUkVWRVJCID0gVVVJRAorICAgICAgICAgICAgLmZyb21TdHJpbmcoIjQ3MzgyZDYwLWRkZDgtMTFkYi1iZjNhLTAwMDJhNWQ1YzUxYiIpOworICAgIC8qKgorICAgICAqIFVVSUQgZm9yIGVxdWFsaXplciBlZmZlY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVVSUQgRUZGRUNUX1RZUEVfRVFVQUxJWkVSID0gVVVJRAorICAgICAgICAgICAgLmZyb21TdHJpbmcoIjBiZWQ0MzAwLWRkZDYtMTFkYi04ZjM0LTAwMDJhNWQ1YzUxYiIpOworICAgIC8qKgorICAgICAqIFVVSUQgZm9yIGJhc3MgYm9vc3QgZWZmZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVVUlEIEVGRkVDVF9UWVBFX0JBU1NfQk9PU1QgPSBVVUlECisgICAgICAgICAgICAuZnJvbVN0cmluZygiMDYzNGYyMjAtZGRkNC0xMWRiLWEwZmMtMDAwMmE1ZDVjNTFiIik7CisgICAgLyoqCisgICAgICogVVVJRCBmb3IgdmlydHVhbGl6ZXIgZWZmZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVVUlEIEVGRkVDVF9UWVBFX1ZJUlRVQUxJWkVSID0gVVVJRAorICAgICAgICAgICAgLmZyb21TdHJpbmcoIjM3Y2MyYzAwLWRkZGQtMTFkYi04NTc3LTAwMDJhNWQ1YzUxYiIpOworCisgICAgLyoqCisgICAgICogTnVsbCBlZmZlY3QgVVVJRC4gVXNlZCB3aGVuIHRoZSBVVUlEIGZvciBlZmZlY3QgdHlwZSBvZgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVVVJRCBFRkZFQ1RfVFlQRV9OVUxMID0gVVVJRAorICAgICAgICAgICAgLmZyb21TdHJpbmcoImVjNzE3OGVjLWU1ZTEtNDQzMi1hM2Y0LTQ2NTdlNjc5NTIxMCIpOworCisgICAgLyoqCisgICAgICogU3RhdGUgb2YgYW4gQXVkaW9FZmZlY3Qgb2JqZWN0IHRoYXQgd2FzIG5vdCBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgdXBvbgorICAgICAqIGNyZWF0aW9uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVU5JTklUSUFMSVpFRCA9IDA7CiAgICAgLyoqCiAgICAgICogU3RhdGUgb2YgYW4gQXVkaW9FZmZlY3Qgb2JqZWN0IHRoYXQgaXMgcmVhZHkgdG8gYmUgdXNlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTklUSUFMSVpFRCAgID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTklUSUFMSVpFRCA9IDE7CiAKKyAgICAvLyB0byBrZWVwIGluIHN5bmMgd2l0aAorICAgIC8vIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qbmkvYXVkaW9lZmZlY3QvYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdC5jcHAKICAgICAvKioKICAgICAgKiBFdmVudCBpZCBmb3IgZW5naW5lIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb24uCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTkFUSVZFX0VWRU5UX0VOQUJMRURfU1RBVFVTICA9IDA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTkFUSVZFX0VWRU5UX0VOQUJMRURfU1RBVFVTID0gMDsKICAgICAvKioKICAgICAgKiBFdmVudCBpZCBmb3IgZW5naW5lIGNvbnRyb2wgb3duZXJzaGlwIGNoYW5nZSBub3RpZmljYXRpb24uCiAgICAgICovCkBAIC04NSw1NiArMTE3LDg5IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTkFUSVZFX0VWRU5UX1BBUkFNRVRFUl9DSEFOR0VEID0gMjsKIAorICAgIC8qKgorICAgICAqIFN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1MgPSAwOworICAgIC8qKgorICAgICAqIFVuc3BlY2lmaWVkIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gLTE7CisgICAgLyoqCisgICAgICogSW50ZXJuYWwgb3ByZWF0aW9uIHN0YXR1cy4gTm90IHJldHVybmVkIGJ5IGFueSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxSRUFEWV9FWElTVFMgPSAtMjsKKyAgICAvKioKKyAgICAgKiBPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBiYWQgb2JqZWN0IGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX05PX0lOSVQgPSAtMzsKKyAgICAvKioKKyAgICAgKiBPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBiYWQgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0JBRF9WQUxVRSA9IC00OworICAgIC8qKgorICAgICAqIE9wZXJhdGlvbiBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgcmVxdWVzdGVkIGluIHdyb25nIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OID0gLTU7CisgICAgLyoqCisgICAgICogT3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gbGFjayBvZiBtZW1vcnkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTk9fTUVNT1JZID0gLTY7CisgICAgLyoqCisgICAgICogT3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gZGVhZCByZW1vdGUgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQURfT0JKRUNUID0gLTc7CiAKLSAgICAvLyB0byBrZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvam5pL2F1ZGlvZWZmZWN0L2FuZHJvaWRfbWVkaWFfQXVkaW9FZmZlY3QuY3BwCi0gICAgcHVibGljICBzdGF0aWMgZmluYWwgaW50IFNVQ0NFU1MgICAgICAgICAgICAgID0gMDsKLSAgICBwdWJsaWMgIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgICAgICAgICAgICAgICAgPSAtMTsKLSAgICBwdWJsaWMgIHN0YXRpYyBmaW5hbCBpbnQgQUxSRUFEWV9FWElTVFMgICAgICAgPSAtMjsKLSAgICBwdWJsaWMgIHN0YXRpYyBmaW5hbCBpbnQgTk9fSU5JVCAgICAgICAgICAgICAgPSAtMzsKLSAgICBwdWJsaWMgIHN0YXRpYyBmaW5hbCBpbnQgQkFEX1ZBTFVFICAgICAgICAgICAgPSAtNDsKLSAgICBwdWJsaWMgIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9PUEVSQVRJT04gICAgPSAtNTsKLSAgICBwdWJsaWMgIHN0YXRpYyBmaW5hbCBpbnQgTk9fTUVNT1JZICAgICAgICAgICAgPSAtNjsKLSAgICBwdWJsaWMgIHN0YXRpYyBmaW5hbCBpbnQgREVBRF9PQkpFQ1QgICAgICAgICAgPSAtNzsKKyAgICAvKioKKyAgICAgKiBUaGUgZWZmZWN0IGRlc2NyaXB0b3IgY29udGFpbnMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGZhY2lsaXRhdGUKKyAgICAgKiBlZmZlY3RzIGVudW1lcmF0aW9uOjxicj4KKyAgICAgKiA8dWw+CisgICAgICogIDxsaT5tVHlwZTogVVVJRCBjb3JyZXNwb25kaW5nIHRvIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0PC9saT4KKyAgICAgKiAgPGxpPm1VdWlkOiBVVUlEIGZvciB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb248L2xpPgorICAgICAqICA8bGk+bUNvbm5lY3RNb2RlOiB7QGxpbmsgI0VGRkVDVF9JTlNFUlR9IG9yIHtAbGluayAjRUZGRUNUX0FVWElMSUFSWX08L2xpPgorICAgICAqICA8bGk+bU5hbWU6IGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBuYW1lPC9saT4KKyAgICAgKiAgPGxpPm1JbXBsZW1lbnRvcjogaHVtYW4gcmVhZGFibGUgZWZmZWN0IGltcGxlbWVudG9yIG5hbWU8L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZXNjcmlwdG9yIHsKIAorICAgICAgICBwdWJsaWMgRGVzY3JpcHRvcigpIHsKKyAgICAgICAgfQogCi0gICAgIC8qKgotICAgICAgKiBUaGUgZWZmZWN0IGRlc2NyaXB0b3IgY29udGFpbnMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGZhY2lsaXRhdGUKLSAgICAgICogZWZmZWN0cyBlbnVtZXJhdGlvbjoKLSAgICAgICogbVR5cGU6IFVVSUQgY29ycmVzcG9uZGluZyB0byB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdAotICAgICAgKiBtVXVpZDogVVVJRCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uCi0gICAgICAqIG1Db25uZWN0TW9kZToge0BsaW5rICNFRkZFQ1RfSU5TRVJUfSBvciB7QGxpbmsgI0VGRkVDVF9BVVhJTElBUll9Ci0gICAgICAqIG1OYW1lOiBodW1hbiByZWFkYWJsZSBlZmZlY3QgbmFtZQotICAgICAgKiBtSW1wbGVtZW50b3I6IGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBpbXBsZW1lbnRvciBuYW1lCi0gICAgICAqLwotICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlc2NyaXB0b3IgeworICAgICAgICBwdWJsaWMgRGVzY3JpcHRvcihTdHJpbmcgdHlwZSwgU3RyaW5nIHV1aWQsIFN0cmluZyBjb25uZWN0TW9kZSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIGltcGxlbWVudG9yKSB7CisgICAgICAgICAgICBtVHlwZSA9IFVVSUQuZnJvbVN0cmluZyh0eXBlKTsKKyAgICAgICAgICAgIG1VdWlkID0gVVVJRC5mcm9tU3RyaW5nKHV1aWQpOworICAgICAgICAgICAgbUNvbm5lY3RNb2RlID0gY29ubmVjdE1vZGU7CisgICAgICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBtSW1wbGVtZW50b3IgPSBpbXBsZW1lbnRvcjsKKyAgICAgICAgfQogCi0gICAgICAgICBwdWJsaWMgRGVzY3JpcHRvcigpIHsKLSAgICAgICAgIH0KLSAgICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKFN0cmluZyB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29ubmVjdE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbXBsZW1lbnRvcikgewotICAgICAgICAgICAgIG1UeXBlID0gVVVJRC5mcm9tU3RyaW5nKHR5cGUpOwotICAgICAgICAgICAgIG1VdWlkID0gVVVJRC5mcm9tU3RyaW5nKHV1aWQpOwotICAgICAgICAgICAgIG1Db25uZWN0TW9kZSA9IGNvbm5lY3RNb2RlOwotICAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgICAgICBtSW1wbGVtZW50b3IgPSBpbXBsZW1lbnRvcjsKLSAgICAgICAgIH0KKyAgICAgICAgcHVibGljIFVVSUQgbVR5cGU7CisgICAgICAgIHB1YmxpYyBVVUlEIG1VdWlkOworICAgICAgICBwdWJsaWMgU3RyaW5nIG1Db25uZWN0TW9kZTsKKyAgICAgICAgcHVibGljIFN0cmluZyBtTmFtZTsKKyAgICAgICAgcHVibGljIFN0cmluZyBtSW1wbGVtZW50b3I7CisgICAgfTsKIAotICAgICAgICAgcHVibGljIFVVSUQgbVR5cGU7Ci0gICAgICAgICBwdWJsaWMgVVVJRCBtVXVpZDsKLSAgICAgICAgIHB1YmxpYyBTdHJpbmcgbUNvbm5lY3RNb2RlOwotICAgICAgICAgcHVibGljIFN0cmluZyBtTmFtZTsKLSAgICAgICAgIHB1YmxpYyBTdHJpbmcgbUltcGxlbWVudG9yOwotICAgICB9OworICAgIC8qKgorICAgICAqIEVmZmVjdCBjb25uZWN0aW9uIG1vZGUgaXMgaW5zZXJ0LiBTcGVjaWZ5aW5nIGFuIGF1ZGlvIHNlc3Npb24gSUQgd2hlbiBjcmVhdGluZyB0aGUgZWZmZWN0CisgICAgICogd2lsbCBpbnNlcnQgdGhpcyBlZmZlY3QgYWZ0ZXIgYWxsIHBsYXllcnMgaW4gdGhlIHNhbWUgYXVkaW8gc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRkZFQ1RfSU5TRVJUID0gIkluc2VydCI7CisgICAgLyoqCisgICAgICogRWZmZWN0IGNvbm5lY3Rpb24gbW9kZSBpcyBhdXhpbGlhcnkuCisgICAgICogPHA+QXV4aWxpYXJ5IGVmZmVjdHMgbXVzdCBiZSBjcmVhdGVkIG9uIHNlc3Npb24gMCAoZ2xvYmFsIG91dHB1dCBtaXgpLiBJbiBvcmRlciBmb3IgYQorICAgICAqIE1lZGlhUGxheWVyIG9yIEF1ZGlvVHJhY2sgdG8gYmUgZmVkIGludG8gdGhpcyBlZmZlY3QsIHRoZXkgbXVzdCBiZSBleHBsaWNpdGVseSBhdHRhY2hlZCB0bworICAgICAqIHRoaXMgZWZmZWN0IGFuZCBhIHNlbmQgbGV2ZWwgbXVzdCBiZSBzcGVjaWZpZWQuCisgICAgICogPHA+VXNlIHRoZSBlZmZlY3QgSUQgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRJZCgpfSB0byBkZXNpZ25hdGUgdGhpcyBwYXJ0aWN1bGFyIGVmZmVjdCB3aGVuCisgICAgICogYXR0YWNoaW5nIGl0IHRvIHRoZSBNZWRpYVBsYXllciBvciBBdWRpb1RyYWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVGRkVDVF9BVVhJTElBUlkgPSAiQXV4aWxpYXJ5IjsKIAotICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRkZFQ1RfSU5TRVJUID0gIkluc2VydCI7Ci0gICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVGRkVDVF9BVVhJTElBUlkgPSAiQXV4aWxpYXJ5IjsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIE1lbWJlciB2YXJpYWJsZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHN0YXRlIG9mIHRoZSBBdWRpb0VmZmVjdCBpbnN0YW5jZQogICAgICAqLwpAQCAtMTU5LDE3ICsyMjQsMjAgQEAKIAogICAgIC8qKgogICAgICAqIExpc3RlbmVyIGZvciBlZmZlY3QgZW5naW5lIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zLgotICAgICAqICBAc2VlICNzZXRFbmFibGVTdGF0dXNMaXN0ZW5lcihPbkVuYWJsZVN0YXR1c0NoYW5nZUxpc3RlbmVyKQorICAgICAqCisgICAgICogQHNlZSAjc2V0RW5hYmxlU3RhdHVzTGlzdGVuZXIoT25FbmFibGVTdGF0dXNDaGFuZ2VMaXN0ZW5lcikKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT25FbmFibGVTdGF0dXNDaGFuZ2VMaXN0ZW5lciBtRW5hYmxlU3RhdHVzQ2hhbmdlTGlzdGVuZXIgPSBudWxsOwogICAgIC8qKgogICAgICAqIExpc3RlbmVyIGZvciBlZmZlY3QgZW5naW5lIGNvbnRyb2wgb3duZXJzaGlwIGNoYW5nZSBub3RpZmljYXRpb25zLgotICAgICAqICBAc2VlICNzZXRDb250cm9sU3RhdHVzTGlzdGVuZXIoT25Db250cm9sU3RhdHVzQ2hhbmdlTGlzdGVuZXIpCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRDb250cm9sU3RhdHVzTGlzdGVuZXIoT25Db250cm9sU3RhdHVzQ2hhbmdlTGlzdGVuZXIpCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9uQ29udHJvbFN0YXR1c0NoYW5nZUxpc3RlbmVyIG1Db250cm9sQ2hhbmdlU3RhdHVzTGlzdGVuZXIgPSBudWxsOwogICAgIC8qKgogICAgICAqIExpc3RlbmVyIGZvciBlZmZlY3QgZW5naW5lIGNvbnRyb2wgb3duZXJzaGlwIGNoYW5nZSBub3RpZmljYXRpb25zLgotICAgICAqICBAc2VlICNzZXRQYXJhbWV0ZXJMaXN0ZW5lcihPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyKQorICAgICAqCisgICAgICogQHNlZSAjc2V0UGFyYW1ldGVyTGlzdGVuZXIoT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lcikKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBtUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIgPSBudWxsOwogICAgIC8qKgpAQCAtMTgxLDMyICsyNDksMzYgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgTmF0aXZlRXZlbnRIYW5kbGVyIG1OYXRpdmVFdmVudEhhbmRsZXIgPSBudWxsOwogCi0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIENvbnN0cnVjdG9yLCBGaW5hbGl6ZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8qKgogICAgICAqIENsYXNzIGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSB0eXBlOiAgdHlwZSBvZiBlZmZlY3QgZW5naW5lIGNyZWF0ZWQuIFNlZQotICAgICAqICAge0BsaW5rICNFRkZFQ1RfVFlQRV9FTlZfUkVWRVJCfSwge0BsaW5rICNFRkZFQ1RfVFlQRV9FUVVBTElaRVJ9IC4uLgotICAgICAqICAgVHlwZXMgY29ycmVzcG9uZGluZyB0byBidWlsdC1pbiBlZmZlY3RzIGFyZSBkZWZpbmVkIGJ5IEF1ZGlvRWZmZWN0IGNsYXNzLgotICAgICAqICAgT3RoZXIgdHlwZXMgY2FuIGJlIHNwZWNpZmllZCBwcm92aWRlZCB0aGV5IGNvcnJlc3BvbmQgYW4gZXhpc3RpbmcgT3BlblNMIEVTCi0gICAgICogICBpbnRlcmZhY2UgSUQgYW5kIHRoZSBjb3JyZXNwb25zaW5nIGVmZmVjdCBpcyBhdmFpbGFibGUgb24gdGhlIHBsYXRmb3JtLgotICAgICAqICAgSWYgYW4gdW5zcGVjaWZpZWQgZWZmZWN0IHR5cGUgaXMgcmVxdWVzdGVkLCB0aGUgY29uc3RydWN0b3Igd2l0aCB0aHJvdyB0aGUKLSAgICAgKiAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLSAgICAgKiBAcGFyYW0gdXVpZDogIHVuaXF1ZSBpZGVudGlmaWVyIG9mIGEgcGFydGljdWxhciBlZmZlY3QgaW1wbGVtZW50YXRpb24uIE11c3QgYmUKLSAgICAgKiAgc3BlY2lmaWVkIGlmIHRoZSBjYWxsZXIgd2FudHMgdG8gdXNlIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlZmZlY3QgdHlwZS4KLSAgICAgKiAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBudWxsIGluIHdoaWNoIGNhc2Ugb25seSB0aGUgdHlwZSB3aWxsIGJlIHVzZWQgdG8gc2VsZWN0Ci0gICAgICogIHRoZSBlZmZlY3QuCi0gICAgICogQHBhcmFtIHByaW9yaXR5OiAgdGhlIHByaW9yaXR5IGxldmVsIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24gZm9yIGNvbnRyb2xsaW5nCi0gICAgICogIHRoZSBlZmZlY3QgZW5naW5lLiBBcyB0aGUgc2FtZSBlZmZlY3QgZW5naW5lIGNhbiBiZSBzaGFyZWQgYnkgc2V2ZXJhbCBhcHBsaWNhdGlvbnMsCi0gICAgICogIHRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyBob3cgbXVjaCB0aGUgcmVxdWVzdGluZyBhcHBsaWNhdGlvbiBuZWVkcyBjb250cm9sIG9mCi0gICAgICogIGVmZmVjdCBwYXJhbWV0ZXJzLiBUaGUgbm9ybWFsIHByaW9yaXR5IGlzIDAsIGFib3ZlIG5vcm1hbCBpcyBhIHBvc2l0aXZlIG51bWJlciwKLSAgICAgKiAgYmVsb3cgbm9ybWFsIGEgbmVnYXRpdmUgbnVtYmVyLgotICAgICAqIEBwYXJhbSBhdWRpb1Nlc3Npb246ICBTeXN0ZW0gd2lkZSB1bmlxdWUgYXVkaW8gc2Vzc2lvbiBpZGVudGlmaWVyLiBJZiBhdWRpb1Nlc3Npb24KLSAgICAgKiAgaXMgbm90IDAsIHRoZSBlZmZlY3Qgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgTWVkaWFQbGF5ZXIgb3IgQXVkaW9UcmFjayBpbiB0aGUKLSAgICAgKiAgc2FtZSBhdWRpbyBzZXNzaW9uLiBPdGhlcndpc2UsIHRoZSBlZmZlY3Qgd2lsbCBhcHBseSB0byB0aGUgb3V0cHV0IG1peC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgZWZmZWN0IGVuZ2luZSBjcmVhdGVkLiBTZWUge0BsaW5rICNFRkZFQ1RfVFlQRV9FTlZfUkVWRVJCfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjRUZGRUNUX1RZUEVfRVFVQUxJWkVSfSAuLi4gVHlwZXMgY29ycmVzcG9uZGluZyB0bworICAgICAqICAgICAgICAgICAgYnVpbHQtaW4gZWZmZWN0cyBhcmUgZGVmaW5lZCBieSBBdWRpb0VmZmVjdCBjbGFzcy4gT3RoZXIgdHlwZXMKKyAgICAgKiAgICAgICAgICAgIGNhbiBiZSBzcGVjaWZpZWQgcHJvdmlkZWQgdGhleSBjb3JyZXNwb25kIGFuIGV4aXN0aW5nIE9wZW5TTAorICAgICAqICAgICAgICAgICAgRVMgaW50ZXJmYWNlIElEIGFuZCB0aGUgY29ycmVzcG9uc2luZyBlZmZlY3QgaXMgYXZhaWxhYmxlIG9uCisgICAgICogICAgICAgICAgICB0aGUgcGxhdGZvcm0uIElmIGFuIHVuc3BlY2lmaWVkIGVmZmVjdCB0eXBlIGlzIHJlcXVlc3RlZCwgdGhlCisgICAgICogICAgICAgICAgICBjb25zdHJ1Y3RvciB3aXRoIHRocm93IHRoZSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uIFRoaXMKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIHtAbGluayAjRUZGRUNUX1RZUEVfTlVMTH0gaW4gd2hpY2gKKyAgICAgKiAgICAgICAgICAgIGNhc2Ugb25seSB0aGUgdXVpZCB3aWxsIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBlZmZlY3QuCisgICAgICogQHBhcmFtIHV1aWQgdW5pcXVlIGlkZW50aWZpZXIgb2YgYSBwYXJ0aWN1bGFyIGVmZmVjdCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiAgICAgICAgICAgIE11c3QgYmUgc3BlY2lmaWVkIGlmIHRoZSBjYWxsZXIgd2FudHMgdG8gdXNlIGEgcGFydGljdWxhcgorICAgICAqICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgYW4gZWZmZWN0IHR5cGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8KKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjRUZGRUNUX1RZUEVfTlVMTH0gaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSB0eXBlIHdpbGwKKyAgICAgKiAgICAgICAgICAgIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBlZmZlY3QuCisgICAgICogQHBhcmFtIHByaW9yaXR5IHRoZSBwcmlvcml0eSBsZXZlbCByZXF1ZXN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGZvcgorICAgICAqICAgICAgICAgICAgY29udHJvbGxpbmcgdGhlIGVmZmVjdCBlbmdpbmUuIEFzIHRoZSBzYW1lIGVmZmVjdCBlbmdpbmUgY2FuCisgICAgICogICAgICAgICAgICBiZSBzaGFyZWQgYnkgc2V2ZXJhbCBhcHBsaWNhdGlvbnMsIHRoaXMgcGFyYW1ldGVyIGluZGljYXRlcworICAgICAqICAgICAgICAgICAgaG93IG11Y2ggdGhlIHJlcXVlc3RpbmcgYXBwbGljYXRpb24gbmVlZHMgY29udHJvbCBvZiBlZmZlY3QKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlcnMuIFRoZSBub3JtYWwgcHJpb3JpdHkgaXMgMCwgYWJvdmUgbm9ybWFsIGlzIGEKKyAgICAgKiAgICAgICAgICAgIHBvc2l0aXZlIG51bWJlciwgYmVsb3cgbm9ybWFsIGEgbmVnYXRpdmUgbnVtYmVyLgorICAgICAqIEBwYXJhbSBhdWRpb1Nlc3Npb24gU3lzdGVtIHdpZGUgdW5pcXVlIGF1ZGlvIHNlc3Npb24gaWRlbnRpZmllci4gSWYgYXVkaW9TZXNzaW9uCisgICAgICogICAgICAgICAgICBpcyBub3QgMCwgdGhlIGVmZmVjdCB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBNZWRpYVBsYXllciBvcgorICAgICAqICAgICAgICAgICAgQXVkaW9UcmFjayBpbiB0aGUgc2FtZSBhdWRpbyBzZXNzaW9uLiBPdGhlcndpc2UsIHRoZSBlZmZlY3QKKyAgICAgKiAgICAgICAgICAgIHdpbGwgYXBwbHkgdG8gdGhlIG91dHB1dCBtaXguCiAgICAgICoKICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgpAQCAtMjE0LDIyICsyODYsMjggQEAKICAgICAgKi8KIAogICAgIHB1YmxpYyBBdWRpb0VmZmVjdChVVUlEIHR5cGUsIFVVSUQgdXVpZCwgaW50IHByaW9yaXR5LCBpbnQgYXVkaW9TZXNzaW9uKQotICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLCBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLAorICAgICAgICAgICAgUnVudGltZUV4Y2VwdGlvbiB7CiAgICAgICAgIGludFtdIGlkID0gbmV3IGludFsxXTsKICAgICAgICAgRGVzY3JpcHRvcltdIGRlc2MgPSBuZXcgRGVzY3JpcHRvclsxXTsKICAgICAgICAgLy8gbmF0aXZlIGluaXRpYWxpemF0aW9uCiAgICAgICAgIGludCBpbml0UmVzdWx0ID0gbmF0aXZlX3NldHVwKG5ldyBXZWFrUmVmZXJlbmNlPEF1ZGlvRWZmZWN0Pih0aGlzKSwKLSAgICAgICAgICAgICAgICB0eXBlLnRvU3RyaW5nKCksIHV1aWQudG9TdHJpbmcoKSwgcHJpb3JpdHksIGF1ZGlvU2Vzc2lvbiwgaWQsIGRlc2MpOworICAgICAgICAgICAgICAgIHR5cGUudG9TdHJpbmcoKSwgdXVpZC50b1N0cmluZygpLCBwcmlvcml0eSwgYXVkaW9TZXNzaW9uLCBpZCwKKyAgICAgICAgICAgICAgICBkZXNjKTsKICAgICAgICAgaWYgKGluaXRSZXN1bHQgIT0gU1VDQ0VTUyAmJiBpbml0UmVzdWx0ICE9IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjb2RlICIraW5pdFJlc3VsdCsiIHdoZW4gaW5pdGlhbGl6aW5nIEF1ZGlvRWZmZWN0LiIpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgY29kZSAiICsgaW5pdFJlc3VsdAorICAgICAgICAgICAgICAgICAgICArICIgd2hlbiBpbml0aWFsaXppbmcgQXVkaW9FZmZlY3QuIik7CiAgICAgICAgICAgICBzd2l0Y2ggKGluaXRSZXN1bHQpIHsKLSAgICAgICAgICAgIGNhc2UgQkFEX1ZBTFVFOgotICAgICAgICAgICAgICAgIHRocm93IChuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFZmZlY3QgdHlwZTogIit0eXBlKyAiIG5vdCBzdXBwb3J0ZWQuIikpOwotICAgICAgICAgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjoKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJFZmZlY3QgbGlicmFyeSBub3QgbG9hZGVkIikpOworICAgICAgICAgICAgY2FzZSBFUlJPUl9CQURfVkFMVUU6CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVmZmVjdCB0eXBlOiAiICsgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBzdXBwb3J0ZWQuIikpOworICAgICAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkVmZmVjdCBsaWJyYXJ5IG5vdCBsb2FkZWQiKSk7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IChuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGluaXRpYWxpemUgZWZmZWN0IGVuZ2luZSBmb3IgdHlwZTogIit0eXBlKwotICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yOiAiKyBpbml0UmVzdWx0KSk7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBpbml0aWFsaXplIGVmZmVjdCBlbmdpbmUgZm9yIHR5cGU6ICIgKyB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkVycm9yOiAiICsgaW5pdFJlc3VsdCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1JZCA9IGlkWzBdOwpAQCAtMjQwLDkgKzMxOCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVsZWFzZXMgdGhlIG5hdGl2ZSBBdWRpb0VmZmVjdCByZXNvdXJjZXMuIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byByZWxlYXNlIHRoZQotICAgICAqIGVmZmVjdCBlbmdpbmUgd2hlbiBub3QgaW4gdXNlIGFzIGNvbnRyb2wgY2FuIGJlIHJldHVybmVkIHRvIG90aGVyIGFwcGxpY2F0aW9ucwotICAgICAqIG9yIHRoZSBuYXRpdmUgcmVzb3VyY2VzIHJlbGVhc2VkLgorICAgICAqIFJlbGVhc2VzIHRoZSBuYXRpdmUgQXVkaW9FZmZlY3QgcmVzb3VyY2VzLiBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8KKyAgICAgKiByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lIHdoZW4gbm90IGluIHVzZSBhcyBjb250cm9sIGNhbiBiZSByZXR1cm5lZCB0bworICAgICAqIG90aGVyIGFwcGxpY2F0aW9ucyBvciB0aGUgbmF0aXZlIHJlc291cmNlcyByZWxlYXNlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZUxvY2spIHsKQEAgLTI1OCwxMTkgKzMzNiwxMTUgQEAKIAogICAgIC8qKgogICAgICAqIEdldCB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0gICAgICoge0BzZWUgI0Rlc2NyaXB0b3J9LgorICAgICAqCisgICAgIC8vVE9ETyB3aGVuIEF1ZGlvRWZmZWN0IGNsYXNzIGlzIHVuaGlkZGVuIEAgc2VlIGFuZHJvaWQubWVkaWEuQXVkaW9FZmZlY3QuRGVzY3JpcHRvcgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCiAgICAgICovCi0gICAgcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBjaGVja1N0YXRlKCJnZXREZXNjcmlwdG9yKCkiKTsKICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yOwogICAgIH0KIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIEVmZmVjdHMgRW51bWVyYXRpb24KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIC8qKgogICAgICAqIFF1ZXJ5IGFsbCBlZmZlY3RzIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0uIFJldHVybnMgYW4gYXJyYXkgb2YKLSAgICAgKiB7QGxpbmsgI0Rlc2NyaXB0b3J9IG9iamVjdHMKKyAgICAgLy9UT0RPIHdoZW4gQXVkaW9FZmZlY3QgY2xhc3MgaXMgdW5oaWRkZW46IHtAIGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0VmZmVjdC5EZXNjcmlwdG9yfSBvYmplY3RzCiAgICAgICoKICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogICAgICAqLwogCiAgICAgc3RhdGljIHB1YmxpYyBEZXNjcmlwdG9yW10gcXVlcnlFZmZlY3RzKCkgewotICAgICAgICByZXR1cm4gKERlc2NyaXB0b3JbXSluYXRpdmVfcXVlcnlfZWZmZWN0cygpOworICAgICAgICByZXR1cm4gKERlc2NyaXB0b3JbXSkgbmF0aXZlX3F1ZXJ5X2VmZmVjdHMoKTsKICAgICB9CiAKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBDb250cm9sIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIC8qKgotICAgICAqIEVuYWJsZSBlZmZlY3QgZW5naW5lLgotICAgICAqIEByZXR1cm4ge0BsaW5rICNOT19FUlJPUn0gaW4gY2FzZSBvZiBzdWNjZXNzLAotICAgICAqIHtAbGluayAjSU5WQUxJRF9PUEVSQVRJT059IG9yIHtAbGluayAjREVBRF9PQkpFQ1R9IGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBlZmZlY3QgZW5naW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZWQgdGhlIHJlcXVlc3RlZCBlbmFibGUgc3RhdGUKKyAgICAgKiBAcmV0dXJuIHtAbGluayAjU1VDQ0VTU30gaW4gY2FzZSBvZiBzdWNjZXNzLCB7QGxpbmsgI0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OfQorICAgICAqICAgICAgICAgb3Ige0BsaW5rICNFUlJPUl9ERUFEX09CSkVDVH0gaW4gY2FzZSBvZiBmYWlsdXJlLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCiAgICAgICovCi0gICAgcHVibGljIGludCBlbmFibGUoKQotICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBjaGVja1N0YXRlKCJlbmFibGUoKSIpOwotICAgICAgICByZXR1cm4gbmF0aXZlX2VuYWJsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGUgZWZmZWN0IGVuZ2luZS4KLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGluIGNhc2Ugb2Ygc3VjY2VzcywKLSAgICAgKiBJTlZBTElEX09QRVJBVElPTiBvciBERUFEX09CSkVDVCBpbiBjYXNlIG9mIGZhaWx1cmUuCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGRpc2FibGUoKQotICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBjaGVja1N0YXRlKCJkaXNhYmxlKCkiKTsKLSAgICAgICAgcmV0dXJuIG5hdGl2ZV9kaXNhYmxlKCk7CisgICAgcHVibGljIGludCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrU3RhdGUoInNldEVuYWJsZWQoKSIpOworICAgICAgICByZXR1cm4gbmF0aXZlX3NldEVuYWJsZWQoZW5hYmxlZCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IGVmZmVjdCBwYXJhbWV0ZXIuIFRoZSBzZXRQYXJhbWV0ZXIgbWV0aG9kIGlzIHByb3ZpZGVkIGluIHNldmVyYWwKLSAgICAgKiBmb3JtcyBhZGRyZXNzaW5nIG1vc3QgY29tbW9uIHBhcmFtZXRlciBmb3JtYXRzLiBUaGlzIGZvcm0gaXMgdGhlCi0gICAgICogbW9zdCBnZW5lcmljIG9uZSB3aGVyZSB0aGUgcGFyYW1ldGVyIGFuZCBpdHMgdmFsdWUgYXJlIGJvdGggc3BlY2lmaWVkCi0gICAgICogYXMgYW4gYXJyYXkgb2YgYnl0ZXMuIFRoZSBwYXJhbWV0ZXIgYW5kIHZhbHVlIHR5cGUgYW5kIGxlbmd0aCBhcmUgdGhlcmVmb3JlCi0gICAgICogdG90YWxseSBmcmVlLiBGb3Igc3RhbmRhcmQgZWZmZWN0IGRlZmluZWQgYnkgT3BlblNMIEVTLCB0aGUgcGFyYW1ldGVyIGZvcm1hdAotICAgICAqIGFuZCB2YWx1ZXMgbXVzdCBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgT3BlblNMIEVTIGludGVyZmFjZS4KKyAgICAgKiBmb3JtcyBhZGRyZXNzaW5nIG1vc3QgY29tbW9uIHBhcmFtZXRlciBmb3JtYXRzLiBUaGlzIGZvcm0gaXMgdGhlIG1vc3QKKyAgICAgKiBnZW5lcmljIG9uZSB3aGVyZSB0aGUgcGFyYW1ldGVyIGFuZCBpdHMgdmFsdWUgYXJlIGJvdGggc3BlY2lmaWVkIGFzIGFuCisgICAgICogYXJyYXkgb2YgYnl0ZXMuIFRoZSBwYXJhbWV0ZXIgYW5kIHZhbHVlIHR5cGUgYW5kIGxlbmd0aCBhcmUgdGhlcmVmb3JlCisgICAgICogdG90YWxseSBmcmVlLiBGb3Igc3RhbmRhcmQgZWZmZWN0IGRlZmluZWQgYnkgT3BlblNMIEVTLCB0aGUgcGFyYW1ldGVyCisgICAgICogZm9ybWF0IGFuZCB2YWx1ZXMgbXVzdCBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgT3BlblNMCisgICAgICogRVMgaW50ZXJmYWNlLgogICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtOiAgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmFtZXRlciB0byBzZXQKLSAgICAgKiBAcGFyYW0gdmFsdWU6ICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gTk9fRVJST1IgaW4gY2FzZSBvZiBzdWNjZXNzLAotICAgICAqIHtAbGluayAjQkFEX1ZBTFVFfSwge0BsaW5rICNOT19NRU1PUll9LCB7QGxpbmsgI0lOVkFMSURfT1BFUkFUSU9OfSBvciB7QGxpbmsgREVBRF9PQkpFQ1R9IGluIGNhc2Ugb2YgZmFpbHVyZQorICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgaWRlbnRpZmllciBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldAorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcgorICAgICAqIEByZXR1cm4ge0BsaW5rICNTVUNDRVNTfSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIHtAbGluayAjRVJST1JfQkFEX1ZBTFVFfSwKKyAgICAgKiAgICAgICAgIHtAbGluayAjRVJST1JfTk9fTUVNT1JZfSwge0BsaW5rICNFUlJPUl9JTlZBTElEX09QRVJBVElPTn0gb3IKKyAgICAgKiAgICAgICAgIHtAbGluayAjRVJST1JfREVBRF9PQkpFQ1R9IGluIGNhc2Ugb2YgZmFpbHVyZQogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIGludCBzZXRQYXJhbWV0ZXIoYnl0ZVtdIHBhcmFtLCBieXRlW10gdmFsdWUpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tTdGF0ZSgic2V0UGFyYW1ldGVyKCkiKTsKICAgICAgICAgcmV0dXJuIG5hdGl2ZV9zZXRQYXJhbWV0ZXIocGFyYW0ubGVuZ3RoLCBwYXJhbSwgdmFsdWUubGVuZ3RoLCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IGVmZmVjdCBwYXJhbWV0ZXIuIFRoZSBwYXJhbWV0ZXIgYW5kIGl0cyB2YWx1ZSBhcmUgaW50ZWdlcnMuCi0gICAgICogIEBzZWUgI3NldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKICAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNldFBhcmFtZXRlcihpbnQgcGFyYW0sIGludCB2YWx1ZSkKLSAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgaW50IHNldFBhcmFtZXRlcihpbnQgcGFyYW0sIGludCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBwID0gaW50VG9CeXRlQXJyYXkocGFyYW0pOwogICAgICAgICBieXRlW10gdiA9IGludFRvQnl0ZUFycmF5KHZhbHVlKTsKICAgICAgICAgcmV0dXJuIHNldFBhcmFtZXRlcihwLCB2KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBpbnRlZ2VyIGFuZCB0aGUgdmFsdWUgaXMgYSBzaG9ydCBpbnRlZ2VyLgotICAgICAqICBAc2VlICNzZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pCisgICAgICogU2V0IGVmZmVjdCBwYXJhbWV0ZXIuIFRoZSBwYXJhbWV0ZXIgaXMgYW4gaW50ZWdlciBhbmQgdGhlIHZhbHVlIGlzIGEKKyAgICAgKiBzaG9ydCBpbnRlZ2VyLgorICAgICAqCisgICAgICogQHNlZSAjc2V0UGFyYW1ldGVyKGJ5dGVbXSwgYnl0ZVtdKQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc2V0UGFyYW1ldGVyKGludCBwYXJhbSwgc2hvcnQgdmFsdWUpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIHAgPSBpbnRUb0J5dGVBcnJheShwYXJhbSk7CiAgICAgICAgIGJ5dGVbXSB2ID0gc2hvcnRUb0J5dGVBcnJheSh2YWx1ZSk7CiAgICAgICAgIHJldHVybiBzZXRQYXJhbWV0ZXIocCwgdik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IGVmZmVjdCBwYXJhbWV0ZXIuIFRoZSBwYXJhbWV0ZXIgaXMgYW4gaW50ZWdlciBhbmQgdGhlIHZhbHVlIGlzIGFuIGFycmF5IG9mIGJ5dGVzLgotICAgICAqICBAc2VlICNzZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pCisgICAgICogU2V0IGVmZmVjdCBwYXJhbWV0ZXIuIFRoZSBwYXJhbWV0ZXIgaXMgYW4gaW50ZWdlciBhbmQgdGhlIHZhbHVlIGlzIGFuCisgICAgICogYXJyYXkgb2YgYnl0ZXMuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pCiAgICAgICovCiAgICAgcHVibGljIGludCBzZXRQYXJhbWV0ZXIoaW50IHBhcmFtLCBieXRlW10gdmFsdWUpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIHAgPSBpbnRUb0J5dGVBcnJheShwYXJhbSk7CiAgICAgICAgIHJldHVybiBzZXRQYXJhbWV0ZXIocCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCBlZmZlY3QgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIGlzIGFuIGFycmF5IG9mIDEgb3IgMiBpbnRlZ2VycyBhbmQgdGhlIHZhbHVlCi0gICAgICogIGlzIGFsc28gYW4gYXJyYXkgb2YgMSBvciAyIGludGVnZXJzCi0gICAgICogIEBzZWUgI3NldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKKyAgICAgKiBTZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvZiAxIG9yIDIgaW50ZWdlcnMgYW5kCisgICAgICogdGhlIHZhbHVlIGlzIGFsc28gYW4gYXJyYXkgb2YgMSBvciAyIGludGVnZXJzCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pCiAgICAgICovCiAgICAgcHVibGljIGludCBzZXRQYXJhbWV0ZXIoaW50W10gcGFyYW0sIGludFtdIHZhbHVlKQotICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwYXJhbS5sZW5ndGggPiAyIHx8IHZhbHVlLmxlbmd0aCA+IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIGJ5dGVbXSBwID0gaW50VG9CeXRlQXJyYXkocGFyYW1bMF0pOwogICAgICAgICBpZiAocGFyYW0ubGVuZ3RoID4gMSkgewpAQCAtMzg2LDE0ICs0NjAsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvZiAxIG9yIDIgaW50ZWdlcnMgYW5kIHRoZSB2YWx1ZQotICAgICAqICBpcyBhbiBhcnJheSBvZiAxIG9yIDIgc2hvcnQgaW50ZWdlcnMKLSAgICAgKiAgQHNlZSAjc2V0UGFyYW1ldGVyKGJ5dGVbXSwgYnl0ZVtdKQorICAgICAqIFNldCBlZmZlY3QgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIGlzIGFuIGFycmF5IG9mIDEgb3IgMiBpbnRlZ2VycyBhbmQKKyAgICAgKiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgb2YgMSBvciAyIHNob3J0IGludGVnZXJzCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pCiAgICAgICovCiAgICAgcHVibGljIGludCBzZXRQYXJhbWV0ZXIoaW50W10gcGFyYW0sIHNob3J0W10gdmFsdWUpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHBhcmFtLmxlbmd0aCA+IDIgfHwgdmFsdWUubGVuZ3RoID4gMikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9CQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgYnl0ZVtdIHAgPSBpbnRUb0J5dGVBcnJheShwYXJhbVswXSk7CiAgICAgICAgIGlmIChwYXJhbS5sZW5ndGggPiAxKSB7CkBAIC00MTAsMTQgKzQ4NSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCBlZmZlY3QgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIGlzIGFuIGFycmF5IG9mIDEgb3IgMiBpbnRlZ2VycyBhbmQgdGhlIHZhbHVlCi0gICAgICogIGlzIGFuIGFycmF5IG9mIGJ5dGVzCi0gICAgICogIEBzZWUgI3NldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKKyAgICAgKiBTZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvZiAxIG9yIDIgaW50ZWdlcnMgYW5kCisgICAgICogdGhlIHZhbHVlIGlzIGFuIGFycmF5IG9mIGJ5dGVzCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pCiAgICAgICovCiAgICAgcHVibGljIGludCBzZXRQYXJhbWV0ZXIoaW50W10gcGFyYW0sIGJ5dGVbXSB2YWx1ZSkKLSAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBpZiAocGFyYW0ubGVuZ3RoID4gMikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9CQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgYnl0ZVtdIHAgPSBpbnRUb0J5dGVBcnJheShwYXJhbVswXSk7CiAgICAgICAgIGlmIChwYXJhbS5sZW5ndGggPiAxKSB7CkBAIC00MjksMjAgKzUwNSwyMyBAQAogCiAgICAgLyoqCiAgICAgICogR2V0IGVmZmVjdCBwYXJhbWV0ZXIuIFRoZSBnZXRQYXJhbWV0ZXIgbWV0aG9kIGlzIHByb3ZpZGVkIGluIHNldmVyYWwKLSAgICAgKiBmb3JtcyBhZGRyZXNzaW5nIG1vc3QgY29tbW9uIHBhcmFtZXRlciBmb3JtYXRzLiBUaGlzIGZvcm0gaXMgdGhlCi0gICAgICogbW9zdCBnZW5lcmljIG9uZSB3aGVyZSB0aGUgcGFyYW1ldGVyIGFuZCBpdHMgdmFsdWUgYXJlIGJvdGggc3BlY2lmaWVkCi0gICAgICogYXMgYW4gYXJyYXkgb2YgYnl0ZXMuIFRoZSBwYXJhbWV0ZXIgYW5kIHZhbHVlIHR5cGUgYW5kIGxlbmd0aCBhcmUgdGhlcmVmb3JlCisgICAgICogZm9ybXMgYWRkcmVzc2luZyBtb3N0IGNvbW1vbiBwYXJhbWV0ZXIgZm9ybWF0cy4gVGhpcyBmb3JtIGlzIHRoZSBtb3N0CisgICAgICogZ2VuZXJpYyBvbmUgd2hlcmUgdGhlIHBhcmFtZXRlciBhbmQgaXRzIHZhbHVlIGFyZSBib3RoIHNwZWNpZmllZCBhcyBhbgorICAgICAqIGFycmF5IG9mIGJ5dGVzLiBUaGUgcGFyYW1ldGVyIGFuZCB2YWx1ZSB0eXBlIGFuZCBsZW5ndGggYXJlIHRoZXJlZm9yZQogICAgICAqIHRvdGFsbHkgZnJlZS4KLSAgICAgKiBAcGFyYW0gcGFyYW06ICB0aGUgaWRlbnRpZmllciBvZiB0aGUgcGFyYW1ldGVyIHRvIHNldAotICAgICAqIEBwYXJhbSB2YWx1ZTogIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyCi0gICAgICogQHJldHVybiBOT19FUlJPUiBpbiBjYXNlIG9mIHN1Y2Nlc3MsCi0gICAgICoge0BsaW5rICNCQURfVkFMVUV9LCB7QGxpbmsgI05PX01FTU9SWX0sIHtAbGluayAjSU5WQUxJRF9PUEVSQVRJT059IG9yIHtAbGluayBERUFEX09CSkVDVH0gaW4gY2FzZSBvZiBmYWlsdXJlCi0gICAgICogV2hlbiBjYWxsZWQsIHZhbHVlLmxlbmd0aCBpbmRpY2F0ZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcmV0dXJuZWQgcGFyYW1ldGVycyB2YWx1ZS4KLSAgICAgKiBXaGVuIHJldHVybmluZywgdmFsdWUubGVuZ3RoIGlzIHVwZGF0ZWQgd2l0aCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHJldHVybmVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJhbWV0ZXIgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyCisgICAgICogQHJldHVybiB7QGxpbmsgI1NVQ0NFU1N9IGluIGNhc2Ugb2Ygc3VjY2Vzcywge0BsaW5rICNFUlJPUl9CQURfVkFMVUV9LAorICAgICAqICAgICAgICAge0BsaW5rICNFUlJPUl9OT19NRU1PUll9LCB7QGxpbmsgI0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OfSBvcgorICAgICAqICAgICAgICAge0BsaW5rICNFUlJPUl9ERUFEX09CSkVDVH0gaW4gY2FzZSBvZiBmYWlsdXJlIFdoZW4gY2FsbGVkLCB2YWx1ZS5sZW5ndGgKKyAgICAgKiAgICAgICAgIGluZGljYXRlcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSByZXR1cm5lZCBwYXJhbWV0ZXJzIHZhbHVlLiBXaGVuCisgICAgICogICAgICAgICByZXR1cm5pbmcsIHZhbHVlLmxlbmd0aCBpcyB1cGRhdGVkIHdpdGggdGhlIGFjdHVhbCBzaXplIG9mIHRoZQorICAgICAqICAgICAgICAgcmV0dXJuZWQgdmFsdWUuCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBhcmFtZXRlcihieXRlW10gcGFyYW0sIGJ5dGVbXSB2YWx1ZSkKLSAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBjaGVja1N0YXRlKCJnZXRQYXJhbWV0ZXIoKSIpOwogICAgICAgICBpbnRbXSB2U2l6ZSA9IG5ldyBpbnRbMV07CiAgICAgICAgIHZTaXplWzBdID0gdmFsdWUubGVuZ3RoOwpAQCAtNDU2LDI1ICs1MzUsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBpbnRlZ2VyIGFuZCB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgb2YgYnl0ZXMuCi0gICAgICogIEBzZWUgI2dldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKKyAgICAgKiBHZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBpbnRlZ2VyIGFuZCB0aGUgdmFsdWUgaXMgYW4KKyAgICAgKiBhcnJheSBvZiBieXRlcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBhcmFtZXRlcihpbnQgcGFyYW0sIGJ5dGVbXSB2YWx1ZSkKLSAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBieXRlW10gcCA9IGludFRvQnl0ZUFycmF5KHBhcmFtKTsKIAogICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVyKHAsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBpbnRlZ2VyIGFuZCB0aGUgdmFsdWUKLSAgICAgKiAgaXMgYW4gYXJyYXkgb2YgMSBvciAyIGludGVnZXJzCi0gICAgICogIEBzZWUgI2dldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKKyAgICAgKiBHZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBpbnRlZ2VyIGFuZCB0aGUgdmFsdWUgaXMgYW4KKyAgICAgKiBhcnJheSBvZiAxIG9yIDIgaW50ZWdlcnMKKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBhcmFtZXRlcihpbnQgcGFyYW0sIGludFtdIHZhbHVlKQotICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBieXRlW10gcCA9IGludFRvQnl0ZUFycmF5KHBhcmFtKTsKIApAQCAtNDkwLDE0ICs1NzIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBpbnRlZ2VyIGFuZCB0aGUgdmFsdWUKLSAgICAgKiAgaXMgYW4gYXJyYXkgb2YgMSBvciAyIHNob3J0IGludGVnZXJzCi0gICAgICogIEBzZWUgI2dldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKKyAgICAgKiBHZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBpbnRlZ2VyIGFuZCB0aGUgdmFsdWUgaXMgYW4KKyAgICAgKiBhcnJheSBvZiAxIG9yIDIgc2hvcnQgaW50ZWdlcnMKKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBhcmFtZXRlcihpbnQgcGFyYW0sIHNob3J0W10gdmFsdWUpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIGJ5dGVbXSBwID0gaW50VG9CeXRlQXJyYXkocGFyYW0pOwogCkBAIC01MTMsMTQgKzU5NiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCBlZmZlY3QgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIGlzIGFuIGFycmF5IG9mIDEgb3IgMiBpbnRlZ2VycyBhbmQgdGhlIHZhbHVlCi0gICAgICogIGlzIGFsc28gYW4gYXJyYXkgb2YgMSBvciAyIGludGVnZXJzCi0gICAgICogIEBzZWUgI2dldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKKyAgICAgKiBHZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvZiAxIG9yIDIgaW50ZWdlcnMgYW5kCisgICAgICogdGhlIHZhbHVlIGlzIGFsc28gYW4gYXJyYXkgb2YgMSBvciAyIGludGVnZXJzCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQYXJhbWV0ZXIoaW50W10gcGFyYW0sIGludFtdIHZhbHVlKQotICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwYXJhbS5sZW5ndGggPiAyIHx8IHZhbHVlLmxlbmd0aCA+IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIGJ5dGVbXSBwID0gaW50VG9CeXRlQXJyYXkocGFyYW1bMF0pOwogICAgICAgICBpZiAocGFyYW0ubGVuZ3RoID4gMSkgewpAQCAtNTM5LDE0ICs2MjMsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvZiAxIG9yIDIgaW50ZWdlcnMgYW5kIHRoZSB2YWx1ZQotICAgICAqICBpcyBhbiBhcnJheSBvZiAxIG9yIDIgc2hvcnQgaW50ZWdlcnMKLSAgICAgKiAgQHNlZSAjZ2V0UGFyYW1ldGVyKGJ5dGVbXSwgYnl0ZVtdKQorICAgICAqIEdldCBlZmZlY3QgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIGlzIGFuIGFycmF5IG9mIDEgb3IgMiBpbnRlZ2VycyBhbmQKKyAgICAgKiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgb2YgMSBvciAyIHNob3J0IGludGVnZXJzCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQYXJhbWV0ZXIoaW50W10gcGFyYW0sIHNob3J0W10gdmFsdWUpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHBhcmFtLmxlbmd0aCA+IDIgfHwgdmFsdWUubGVuZ3RoID4gMikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9CQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgYnl0ZVtdIHAgPSBpbnRUb0J5dGVBcnJheShwYXJhbVswXSk7CiAgICAgICAgIGlmIChwYXJhbS5sZW5ndGggPiAxKSB7CkBAIC01NjUsMTQgKzY1MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCBlZmZlY3QgcGFyYW1ldGVyLiBUaGUgcGFyYW1ldGVyIGlzIGFuIGFycmF5IG9mIDEgb3IgMiBpbnRlZ2VycyBhbmQgdGhlIHZhbHVlCi0gICAgICogIGlzIGFuIGFycmF5IG9mIGJ5dGVzCi0gICAgICogIEBzZWUgI2dldFBhcmFtZXRlcihieXRlW10sIGJ5dGVbXSkKKyAgICAgKiBHZXQgZWZmZWN0IHBhcmFtZXRlci4gVGhlIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvZiAxIG9yIDIgaW50ZWdlcnMgYW5kCisgICAgICogdGhlIHZhbHVlIGlzIGFuIGFycmF5IG9mIGJ5dGVzCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQYXJhbWV0ZXIoaW50W10gcGFyYW0sIGJ5dGVbXSB2YWx1ZSkKLSAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBpZiAocGFyYW0ubGVuZ3RoID4gMikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9CQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgYnl0ZVtdIHAgPSBpbnRUb0J5dGVBcnJheShwYXJhbVswXSk7CiAgICAgICAgIGlmIChwYXJhbS5sZW5ndGggPiAxKSB7CkBAIC01ODMsMTkgKzY2OSwxOSBAQAogICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVyKHAsIHZhbHVlKTsKICAgICB9CiAKLQogICAgIC8qKgotICAgICAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBlZmZlY3QgZW5naW5lLiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBzZW5kIHByb3ByaWV0YXJ5Ci0gICAgICogY29tbWFuZHMgdG8gYSBwYXJ0aWN1bGFyIGVmZmVjdCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgZWZmZWN0IGVuZ2luZS4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gc2VuZAorICAgICAqIHByb3ByaWV0YXJ5IGNvbW1hbmRzIHRvIGEgcGFydGljdWxhciBlZmZlY3QgaW1wbGVtZW50YXRpb24uCiAgICAgICoKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNvbW1hbmQoaW50IGNtZENvZGUsIGJ5dGVbXSBjb21tYW5kLCBieXRlW10gcmVwbHkpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tTdGF0ZSgiY29tbWFuZCgpIik7CiAgICAgICAgIGludFtdIHJlcGx5U2l6ZSA9IG5ldyBpbnRbMV07CiAgICAgICAgIHJlcGx5U2l6ZVswXSA9IHJlcGx5Lmxlbmd0aDsKIAotICAgICAgICBpbnQgc3RhdHVzID0gbmF0aXZlX2NvbW1hbmQoY21kQ29kZSwgY29tbWFuZC5sZW5ndGgsIGNvbW1hbmQsIHJlcGx5U2l6ZSwgcmVwbHkpOworICAgICAgICBpbnQgc3RhdHVzID0gbmF0aXZlX2NvbW1hbmQoY21kQ29kZSwgY29tbWFuZC5sZW5ndGgsIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgcmVwbHlTaXplLCByZXBseSk7CiAKICAgICAgICAgaWYgKHJlcGx5Lmxlbmd0aCA+IHJlcGx5U2l6ZVswXSkgewogICAgICAgICAgICAgYnl0ZVtdIHJlc2l6ZWRSZXBseSA9IG5ldyBieXRlW3JlcGx5U2l6ZVswXV07CkBAIC02MDUsNTEgKzY5MSw1MyBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIEdldHRlcnMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgZWZmZWN0IHVuaXF1ZSBpZGVudGlmaWVyLiBUaGlzIHN5c3RlbSB3aWRlIHVuaXF1ZSBpZGVudGlmaWVyCi0gICAgICogY2FuIGJlIHVzZWQgdG8gYXR0YWNoIHRoaXMgZWZmZWN0IHRvIGEgTWVkaWFQbGF5ZXIgb3IgYW4gQXVkaW9UcmFjawotICAgICAqIHdoZW4gdGhlIGVmZmVjdCBpcyBhbiBhdXhpbGlhcnkgZWZmZWN0IChSZXZlcmIpCisgICAgICogUmV0dXJucyBlZmZlY3QgdW5pcXVlIGlkZW50aWZpZXIuIFRoaXMgc3lzdGVtIHdpZGUgdW5pcXVlIGlkZW50aWZpZXIgY2FuCisgICAgICogYmUgdXNlZCB0byBhdHRhY2ggdGhpcyBlZmZlY3QgdG8gYSBNZWRpYVBsYXllciBvciBhbiBBdWRpb1RyYWNrIHdoZW4gdGhlCisgICAgICogZWZmZWN0IGlzIGFuIGF1eGlsaWFyeSBlZmZlY3QgKFJldmVyYikKKyAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGVmZmVjdCBpZGVudGlmaWVyLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCiAgICAgICovCi0gICAgcHVibGljIGludCBnZXRJZCgpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIGludCBnZXRJZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBjaGVja1N0YXRlKCJnZXRJZCgpIik7CiAgICAgICAgIHJldHVybiBtSWQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBlZmZlY3QgZW5naW5lIGVuYWJsZSBzdGF0ZQorICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlZmZlY3QgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlKCkKLSAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tTdGF0ZSgiZ2V0RW5hYmxlKCkiKTsKLSAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRFbmFibGUoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrU3RhdGUoImdldEVuYWJsZWQoKSIpOworICAgICAgICByZXR1cm4gbmF0aXZlX2dldEVuYWJsZWQoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBBdWRpb0VmZmVjdCBvYmplY3QgaXMgY29udHJvbGxpbmcgdGhlIGVmZmVjdCBlbmdpbmUuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaW5zdGFuY2UgaGFzIGNvbnRyb2wgb2YgZWZmZWN0IGVuZ2luZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaW5zdGFuY2UgaGFzIGNvbnRyb2wgb2YgZWZmZWN0IGVuZ2luZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRyb2woKQotICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRyb2woKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tTdGF0ZSgiaGFzQ29udHJvbCgpIik7CiAgICAgICAgIHJldHVybiBuYXRpdmVfaGFzQ29udHJvbCgpOwogICAgIH0KIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIEluaXRpYWxpemF0aW9uIC8gY29uZmlndXJhdGlvbgotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxpc3RlbmVyIEF1ZGlvRWZmZWN0IG5vdGlmaWVzIHdoZW4gdGhlIGVmZmVjdCBlbmdpbmUgaXMgZW5hYmxlZAogICAgICAqIG9yIGRpc2FibGVkLgorICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlU3RhdHVzTGlzdGVuZXIoT25FbmFibGVTdGF0dXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewpAQCAtNjYyLDggKzc1MCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgbGlzdGVuZXIgQXVkaW9FZmZlY3Qgbm90aWZpZXMgd2hlbiB0aGUgZWZmZWN0IGVuZ2luZSBjb250cm9sCi0gICAgICogaXMgdGFrZW4gb3IgcmV0dXJuZWQuCisgICAgICogU2V0cyB0aGUgbGlzdGVuZXIgQXVkaW9FZmZlY3Qgbm90aWZpZXMgd2hlbiB0aGUgZWZmZWN0IGVuZ2luZSBjb250cm9sIGlzCisgICAgICogdGFrZW4gb3IgcmV0dXJuZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sU3RhdHVzTGlzdGVuZXIoT25Db250cm9sU3RhdHVzQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKQEAgLTY3Nyw2ICs3NjYsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbGlzdGVuZXIgQXVkaW9FZmZlY3Qgbm90aWZpZXMgd2hlbiBhIHBhcmFtZXRlciBpcyBjaGFuZ2VkLgorICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyTGlzdGVuZXIoT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewpAQCAtNjkxLDcgKzc4MSw3IEBACiAgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIG5hdGl2ZSBldmVudCBoYW5kbGVyCiAgICAgLy8gSXQgaXMgY2FsbGVkIG9ubHkgd2hlbiBhIG5vbi1udWxsIGV2ZW50IGxpc3RlbmVyIGlzIHNldC4KICAgICAvLyBwcmVjb25kaXRpb246Ci0gICAgLy8gICAgbU5hdGl2ZUV2ZW50SGFuZGxlciBpcyBudWxsCisgICAgLy8gbU5hdGl2ZUV2ZW50SGFuZGxlciBpcyBudWxsCiAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU5hdGl2ZUV2ZW50SGFuZGxlcigpIHsKICAgICAgICAgTG9vcGVyIGxvb3BlcjsKICAgICAgICAgaWYgKChsb29wZXIgPSBMb29wZXIubXlMb29wZXIoKSkgIT0gbnVsbCkgewpAQCAtNzAzLDUyICs3OTMsNjIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gSW50ZXJmYWNlIGRlZmluaXRpb25zCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZQotICAgICAqIGVmZmVjdCBlbmdpbmUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgKiBUaGUgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBpbnRlcmZhY2UgZGVmaW5lcyBhIG1ldGhvZCBjYWxsZWQgYnkgdGhlIEF1ZGlvRWZmZWN0CisgICAgICogd2hlbiBhIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBlZmZlY3QgZW5naW5lIHdhcyBjaGFuZ2VkIGJ5IHRoZSBjb250cm9sbGluZyBhcHBsaWNhdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIE9uRW5hYmxlU3RhdHVzQ2hhbmdlTGlzdGVuZXIgIHsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uRW5hYmxlU3RhdHVzQ2hhbmdlTGlzdGVuZXIgewogICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIG9uIHRoZSBsaXN0ZW5lciB0byBub3RpZnkgaXQgdGhhdCB0aGUgZWZmZWN0IGVuZ2luZQotICAgICAgICAgKiBoYXMgYmVlbiBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgICAgKiBDYWxsZWQgb24gdGhlIGxpc3RlbmVyIHRvIG5vdGlmeSBpdCB0aGF0IHRoZSBlZmZlY3QgZW5naW5lIGhhcyBiZWVuCisgICAgICAgICAqIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAqIEBwYXJhbSBlZmZlY3QgdGhlIGVmZmVjdCBvbiB3aGljaCB0aGUgaW50ZXJmYWNlIGlzIHJlZ2lzdGVyZWQuCisgICAgICAgICAqIEBwYXJhbSBlbmFibGVkIG5ldyBlZmZlY3Qgc3RhdGUuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIG9uRW5hYmxlU3RhdHVzQ2hhbmdlKEF1ZGlvRWZmZWN0IGVmZmVjdCwgYm9vbGVhbiBlbmFibGVkKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlCi0gICAgICogZWZmZWN0IGVuZ2luZSBjb250cm9sIGlzIHRha2VuIG9yIHJldHVybmVkLgorICAgICAqIFRoZSBPbkNvbnRyb2xTdGF0dXNDaGFuZ2VMaXN0ZW5lciBpbnRlcmZhY2UgZGVmaW5lcyBhIG1ldGhvZCBjYWxsZWQgYnkgdGhlIEF1ZGlvRWZmZWN0CisgICAgICogd2hlbiBhIHRoZSBjb250cm9sIG9mIHRoZSBlZmZlY3QgZW5naW5lIGlzIGdhaW5lZCBvciBsb3N0IGJ5IHRoZSBhcHBsaWNhdGlvbgogICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgT25Db250cm9sU3RhdHVzQ2hhbmdlTGlzdGVuZXIgIHsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uQ29udHJvbFN0YXR1c0NoYW5nZUxpc3RlbmVyIHsKICAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCBvbiB0aGUgbGlzdGVuZXIgdG8gbm90aWZ5IGl0IHRoYXQgdGhlIGVmZmVjdCBlbmdpbmUKLSAgICAgICAgICogY29udHJvbCBoYXMgYmVlbiB0YWtlbiBvciByZXR1cm5lZC4KKyAgICAgICAgICogQ2FsbGVkIG9uIHRoZSBsaXN0ZW5lciB0byBub3RpZnkgaXQgdGhhdCB0aGUgZWZmZWN0IGVuZ2luZSBjb250cm9sCisgICAgICAgICAqIGhhcyBiZWVuIHRha2VuIG9yIHJldHVybmVkLgorICAgICAgICAgKiBAcGFyYW0gZWZmZWN0IHRoZSBlZmZlY3Qgb24gd2hpY2ggdGhlIGludGVyZmFjZSBpcyByZWdpc3RlcmVkLgorICAgICAgICAgKiBAcGFyYW0gY29udHJvbEdyYW50ZWQgdHJ1ZSBpZiB0aGUgYXBwbGljYXRpb24gaGFzIGJlZW4gZ3JhbnRlZCBjb250cm9sIG9mIHRoZSBlZmZlY3QKKyAgICAgICAgICogZW5naW5lLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIG9uQ29udHJvbFN0YXR1c0NoYW5nZShBdWRpb0VmZmVjdCBlZmZlY3QsIGJvb2xlYW4gY29udHJvbEdyYW50ZWQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhCi0gICAgICogcGFyYW1ldGVyIHZhbHVlIGhhcyBjaGFuZ2VkLgorICAgICAqIFRoZSBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyIGludGVyZmFjZSBkZWZpbmVzIGEgbWV0aG9kIGNhbGxlZCBieSB0aGUgQXVkaW9FZmZlY3QKKyAgICAgKiB3aGVuIGEgcGFyYW1ldGVyIGlzIGNoYW5nZWQgaW4gdGhlIGVmZmVjdCBlbmdpbmUgYnkgdGhlIGNvbnRyb2xsaW5nIGFwcGxpY2F0aW9uLgogICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciAgeworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDYWxsZWQgb24gdGhlIGxpc3RlbmVyIHRvIG5vdGlmeSBpdCB0aGF0IGEgcGFyYW1ldGVyIHZhbHVlIGhhcyBjaGFuZ2VkLgorICAgICAgICAgKiBAcGFyYW0gZWZmZWN0IHRoZSBlZmZlY3Qgb24gd2hpY2ggdGhlIGludGVyZmFjZSBpcyByZWdpc3RlcmVkLgorICAgICAgICAgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyBvZiB0aGUgc2V0IHBhcmFtZXRlciBvcGVyYXRpb24uCisgICAgICAgICAqIEBwYXJhbSBwYXJhbSBJRCBvZiB0aGUgbW9kaWZpZWQgcGFyYW1ldGVyLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBwYXJhbWV0ZXIgdmFsdWUuCiAgICAgICAgICAqLwotICAgICAgICB2b2lkIG9uUGFyYW1ldGVyQ2hhbmdlKEF1ZGlvRWZmZWN0IGVmZmVjdCwgaW50IHN0YXR1cywgYnl0ZVtdIHBhcmFtLCBieXRlW10gdmFsdWUpOworICAgICAgICB2b2lkIG9uUGFyYW1ldGVyQ2hhbmdlKEF1ZGlvRWZmZWN0IGVmZmVjdCwgaW50IHN0YXR1cywgYnl0ZVtdIHBhcmFtLAorICAgICAgICAgICAgICAgIGJ5dGVbXSB2YWx1ZSk7CiAgICAgfQogCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBJbm5lciBjbGFzc2VzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLyoqCi0gICAgICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSB0aGUgZm9yd2FyZGluZyBvZiBuYXRpdmUgZXZlbnRzIHRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lcnMKKyAgICAgKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIHRoZSBmb3J3YXJkaW5nIG9mIG5hdGl2ZSBldmVudHMgdG8gdGhlIGFwcHJvcHJpYXRlCisgICAgICogbGlzdGVuZXJzCiAgICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBOYXRpdmVFdmVudEhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyCi0gICAgeworICAgIHByaXZhdGUgY2xhc3MgTmF0aXZlRXZlbnRIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CiAgICAgICAgIHByaXZhdGUgQXVkaW9FZmZlY3QgbUF1ZGlvRWZmZWN0OwogCiAgICAgICAgIHB1YmxpYyBOYXRpdmVFdmVudEhhbmRsZXIoQXVkaW9FZmZlY3QgYWUsIExvb3BlciBsb29wZXIpIHsKQEAgLTc2MSwxNCArODYxLDE1IEBACiAgICAgICAgICAgICBpZiAobUF1ZGlvRWZmZWN0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2gobXNnLndoYXQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKICAgICAgICAgICAgIGNhc2UgTkFUSVZFX0VWRU5UX0VOQUJMRURfU1RBVFVTOgogICAgICAgICAgICAgICAgIE9uRW5hYmxlU3RhdHVzQ2hhbmdlTGlzdGVuZXIgZW5hYmxlU3RhdHVzQ2hhbmdlTGlzdGVuZXIgPSBudWxsOwogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVyTG9jaykgewogICAgICAgICAgICAgICAgICAgICBlbmFibGVTdGF0dXNDaGFuZ2VMaXN0ZW5lciA9IG1BdWRpb0VmZmVjdC5tRW5hYmxlU3RhdHVzQ2hhbmdlTGlzdGVuZXI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChlbmFibGVTdGF0dXNDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZVN0YXR1c0NoYW5nZUxpc3RlbmVyLm9uRW5hYmxlU3RhdHVzQ2hhbmdlKG1BdWRpb0VmZmVjdCwgKGJvb2xlYW4pKG1zZy5hcmcxICE9IDApKTsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdHVzQ2hhbmdlTGlzdGVuZXIub25FbmFibGVTdGF0dXNDaGFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRWZmZWN0LCAoYm9vbGVhbikgKG1zZy5hcmcxICE9IDApKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE5BVElWRV9FVkVOVF9DT05UUk9MX1NUQVRVUzoKQEAgLTc3Nyw3ICs4NzgsOCBAQAogICAgICAgICAgICAgICAgICAgICBjb250cm9sU3RhdHVzQ2hhbmdlTGlzdGVuZXIgPSBtQXVkaW9FZmZlY3QubUNvbnRyb2xDaGFuZ2VTdGF0dXNMaXN0ZW5lcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xTdGF0dXNDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xTdGF0dXNDaGFuZ2VMaXN0ZW5lci5vbkNvbnRyb2xTdGF0dXNDaGFuZ2UobUF1ZGlvRWZmZWN0LCAoYm9vbGVhbikobXNnLmFyZzEgIT0gMCkpOworICAgICAgICAgICAgICAgICAgICBjb250cm9sU3RhdHVzQ2hhbmdlTGlzdGVuZXIub25Db250cm9sU3RhdHVzQ2hhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0VmZmVjdCwgKGJvb2xlYW4pIChtc2cuYXJnMSAhPSAwKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBOQVRJVkVfRVZFTlRfUEFSQU1FVEVSX0NIQU5HRUQ6CkBAIC03ODYsMTAgKzg4OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciA9IG1BdWRpb0VmZmVjdC5tUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFyZzEgY29udGFpbnMgb2Zmc2V0IG9mIHBhcmFtZXRlciB2YWx1ZSBmcm9tIHN0YXJ0IG9mIGJ5dGUgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJnMSBjb250YWlucyBvZmZzZXQgb2YgcGFyYW1ldGVyIHZhbHVlIGZyb20gc3RhcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSBhcnJheQogICAgICAgICAgICAgICAgICAgICBpbnQgdk9mZnNldCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgICAgICBieXRlW10gcCA9IChieXRlW10pbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGVmZmVjdF9wYXJhbV90IGluIEVmZmVjdEFwaS5oIGZvciBwc2l6ZSBhbmQgdnNpemUgZmllbGRzIG9mZnNldHMKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHAgPSAoYnl0ZVtdKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAvLyBTZWUgZWZmZWN0X3BhcmFtX3QgaW4gRWZmZWN0QXBpLmggZm9yIHBzaXplIGFuZCB2c2l6ZQorICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZHMgb2Zmc2V0cwogICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gYnl0ZUFycmF5VG9JbnQocCwgMCk7CiAgICAgICAgICAgICAgICAgICAgIGludCBwc2l6ZSA9IGJ5dGVBcnJheVRvSW50KHAsIDQpOwogICAgICAgICAgICAgICAgICAgICBpbnQgdnNpemUgPSBieXRlQXJyYXlUb0ludChwLCA4KTsKQEAgLTc5OCw5MCArOTAyLDc2IEBACiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocCwgMTIsIHBhcmFtLCAwLCBwc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocCwgdk9mZnNldCwgdmFsdWUsIDAsIHZzaXplKTsKIAotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lci5vblBhcmFtZXRlckNoYW5nZShtQXVkaW9FZmZlY3QsIHN0YXR1cywgcGFyYW0sIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIub25QYXJhbWV0ZXJDaGFuZ2UobUF1ZGlvRWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGFyYW0sIHZhbHVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJoYW5kbGVNZXNzYWdlKCkgVW5rbm93biBldmVudCB0eXBlOiAiICsgbXNnLndoYXQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIEphdmEgbWV0aG9kcyBjYWxsZWQgZnJvbSB0aGUgbmF0aXZlIHNpZGUKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvc3RFdmVudEZyb21OYXRpdmUoT2JqZWN0IGVmZmVjdF9yZWYsCi0gICAgICAgICAgICBpbnQgd2hhdCwgaW50IGFyZzEsIGludCBhcmcyLCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIEF1ZGlvRWZmZWN0IGVmZmVjdCA9IChBdWRpb0VmZmVjdCkoKFdlYWtSZWZlcmVuY2UpZWZmZWN0X3JlZikuZ2V0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3N0RXZlbnRGcm9tTmF0aXZlKE9iamVjdCBlZmZlY3RfcmVmLCBpbnQgd2hhdCwKKyAgICAgICAgICAgIGludCBhcmcxLCBpbnQgYXJnMiwgT2JqZWN0IG9iaikgeworICAgICAgICBBdWRpb0VmZmVjdCBlZmZlY3QgPSAoQXVkaW9FZmZlY3QpICgoV2Vha1JlZmVyZW5jZSkgZWZmZWN0X3JlZikuZ2V0KCk7CiAgICAgICAgIGlmIChlZmZlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVmZmVjdC5tTmF0aXZlRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IGVmZmVjdC5tTmF0aXZlRXZlbnRIYW5kbGVyLm9idGFpbk1lc3NhZ2Uod2hhdCwgYXJnMSwgYXJnMiwgb2JqKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IGVmZmVjdC5tTmF0aXZlRXZlbnRIYW5kbGVyLm9idGFpbk1lc3NhZ2Uod2hhdCwgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgYXJnMiwgb2JqKTsKICAgICAgICAgICAgIGVmZmVjdC5tTmF0aXZlRXZlbnRIYW5kbGVyLnNlbmRNZXNzYWdlKG0pOwogICAgICAgICB9CiAKICAgICB9CiAKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gTmF0aXZlIG1ldGhvZHMgY2FsbGVkIGZyb20gdGhlIEphdmEgc2lkZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2luaXQoKTsKIAotICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIGludCBuYXRpdmVfc2V0dXAoT2JqZWN0IGF1ZGlvZWZmZWN0X3RoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gZGVzYyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgaW50IG5hdGl2ZV9zZXR1cChPYmplY3QgYXVkaW9lZmZlY3RfdGhpcywgU3RyaW5nIHR5cGUsCisgICAgICAgICAgICBTdHJpbmcgdXVpZCwgaW50IHByaW9yaXR5LCBpbnQgYXVkaW9TZXNzaW9uLCBpbnRbXSBpZCwgT2JqZWN0W10gZGVzYyk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOwogCiAgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfcmVsZWFzZSgpOwogCi0gICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgaW50IG5hdGl2ZV9lbmFibGUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCBpbnQgbmF0aXZlX3NldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKIAotICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIGludCBuYXRpdmVfZGlzYWJsZSgpOwotCi0gICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgYm9vbGVhbiBuYXRpdmVfZ2V0RW5hYmxlKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgYm9vbGVhbiBuYXRpdmVfZ2V0RW5hYmxlZCgpOwogCiAgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgYm9vbGVhbiBuYXRpdmVfaGFzQ29udHJvbCgpOwogCi0gICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgaW50IG5hdGl2ZV9zZXRQYXJhbWV0ZXIoaW50IHBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHZhbHVlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCBpbnQgbmF0aXZlX3NldFBhcmFtZXRlcihpbnQgcHNpemUsIGJ5dGVbXSBwYXJhbSwKKyAgICAgICAgICAgIGludCB2c2l6ZSwgYnl0ZVtdIHZhbHVlKTsKIAotICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIGludCBuYXRpdmVfZ2V0UGFyYW1ldGVyKGludCBwc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gdnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHZhbHVlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCBpbnQgbmF0aXZlX2dldFBhcmFtZXRlcihpbnQgcHNpemUsIGJ5dGVbXSBwYXJhbSwKKyAgICAgICAgICAgIGludFtdIHZzaXplLCBieXRlW10gdmFsdWUpOwogCi0gICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgaW50IG5hdGl2ZV9jb21tYW5kKGludCBjbWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY21kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGNtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHJlcFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSByZXBEYXRhKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCBpbnQgbmF0aXZlX2NvbW1hbmQoaW50IGNtZENvZGUsIGludCBjbWRTaXplLAorICAgICAgICAgICAgYnl0ZVtdIGNtZERhdGEsIGludFtdIHJlcFNpemUsIGJ5dGVbXSByZXBEYXRhKTsKIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBPYmplY3RbXSBuYXRpdmVfcXVlcnlfZWZmZWN0cygpOwogCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBVdGlsaXR5IG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tTdGF0ZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tTdGF0ZShTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgewogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgIHRocm93KG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obWV0aG9kTmFtZSsiIGNhbGxlZCBvbiB1bmluaXRpYWxpemVkIEF1ZGlvRWZmZWN0LiIpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtZXRob2ROYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICIgY2FsbGVkIG9uIHVuaW5pdGlhbGl6ZWQgQXVkaW9FZmZlY3QuIikpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtODkwLDEwICs5ODAsMTIgQEAKICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICAgICAgY2FzZSBBdWRpb0VmZmVjdC5TVUNDRVNTOgogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQXVkaW9FZmZlY3QuQkFEX1ZBTFVFOgotICAgICAgICAgICAgdGhyb3cgKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF1ZGlvRWZmZWN0OiBiYWQgcGFyYW1ldGVyIHZhbHVlIikpOwotICAgICAgICBjYXNlIEF1ZGlvRWZmZWN0LklOVkFMSURfT1BFUkFUSU9OOgotICAgICAgICAgICAgdGhyb3cgKG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQXVkaW9FZmZlY3Q6IGludmFsaWQgcGFyYW1ldGVyIG9wZXJhdGlvbiIpKTsKKyAgICAgICAgY2FzZSBBdWRpb0VmZmVjdC5FUlJPUl9CQURfVkFMVUU6CisgICAgICAgICAgICB0aHJvdyAobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkF1ZGlvRWZmZWN0OiBiYWQgcGFyYW1ldGVyIHZhbHVlIikpOworICAgICAgICBjYXNlIEF1ZGlvRWZmZWN0LkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgdGhyb3cgKG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkF1ZGlvRWZmZWN0OiBpbnZhbGlkIHBhcmFtZXRlciBvcGVyYXRpb24iKSk7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB0aHJvdyAobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF1ZGlvRWZmZWN0OiBzZXQvZ2V0IHBhcmFtZXRlciBlcnJvciIpKTsKICAgICAgICAgfQpAQCAtOTAzLDYgKzk5NSw3IEBACiAgICAgICAgIHJldHVybiBieXRlQXJyYXlUb0ludCh2YWx1ZUJ1ZiwgMCk7CiAKICAgICB9CisKICAgICBwcm90ZWN0ZWQgaW50IGJ5dGVBcnJheVRvSW50KGJ5dGVbXSB2YWx1ZUJ1ZiwgaW50IG9mZnNldCkgewogICAgICAgICBCeXRlQnVmZmVyIGNvbnZlcnRlciA9IEJ5dGVCdWZmZXIud3JhcCh2YWx1ZUJ1Zik7CiAgICAgICAgIGNvbnZlcnRlci5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSk7CkBAIC05MzEsMTIgKzEwMjQsMTIgQEAKICAgICBwcm90ZWN0ZWQgYnl0ZVtdIHNob3J0VG9CeXRlQXJyYXkoc2hvcnQgdmFsdWUpIHsKICAgICAgICAgQnl0ZUJ1ZmZlciBjb252ZXJ0ZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDIpOwogICAgICAgICBjb252ZXJ0ZXIub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpOwotICAgICAgICBzaG9ydCBzVmFsdWUgPSAoc2hvcnQpdmFsdWU7CisgICAgICAgIHNob3J0IHNWYWx1ZSA9IChzaG9ydCkgdmFsdWU7CiAgICAgICAgIGNvbnZlcnRlci5wdXRTaG9ydChzVmFsdWUpOwogICAgICAgICByZXR1cm4gY29udmVydGVyLmFycmF5KCk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGJ5dGVbXSBjb25jYXRBcnJheXMoYnl0ZVtdIC4uLmFycmF5cykgeworICAgIHByb3RlY3RlZCBieXRlW10gY29uY2F0QXJyYXlzKGJ5dGVbXS4uLiBhcnJheXMpIHsKICAgICAgICAgaW50IGxlbiA9IDA7CiAgICAgICAgIGZvciAoYnl0ZVtdIGEgOiBhcnJheXMpIHsKICAgICAgICAgICAgIGxlbiArPSBhLmxlbmd0aDsKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1NlcnZpY2UuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1NlcnZpY2UuamF2YQppbmRleCA1MGYwNjc0Li45MjEyNzA4IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9TZXJ2aWNlLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZS5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAoraW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CkBAIC0xMDE2LDcgKzEwMTcsMTEgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtU3RhcnRjb3VudC0tOwogICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0Y291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNiLnVubGlua1RvRGVhdGgodGhpcywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYi51bmxpbmtUb0RlYXRoKHRoaXMsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZGVjQ291bnQoKSBnb2luZyB0byAwIGJ1dCBub3QgcmVnaXN0ZXJlZCB0byBiaW5kZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U2NvU3RhdGUoQmx1ZXRvb3RoSGVhZHNldC5BVURJT19TVEFURV9ESVNDT05ORUNURUQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwMjUsOCArMTAzMCwxNCBAQAogCiAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyQ291bnQoYm9vbGVhbiBzdG9wU2NvKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobVNjb0NsaWVudHMpIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0Y291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNiLnVubGlua1RvRGVhdGgodGhpcywgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY2xlYXJDb3VudCgpIG1TdGFydGNvdW50OiAiK21TdGFydGNvdW50KyIgIT0gMCBidXQgbm90IHJlZ2lzdGVyZWQgdG8gYmluZGVyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVN0YXJ0Y291bnQgPSAwOwotICAgICAgICAgICAgICAgIG1DYi51bmxpbmtUb0RlYXRoKHRoaXMsIDApOwogICAgICAgICAgICAgICAgIGlmIChzdG9wU2NvKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTY29TdGF0ZShCbHVldG9vdGhIZWFkc2V0LkFVRElPX1NUQVRFX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0Jhc3NCb29zdC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0Jhc3NCb29zdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNGNlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQmFzc0Jvb3N0LmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9FZmZlY3Q7CisKKy8qKgorICogQmFzcyBib29zdCBpcyBhbiBhdWRpbyBlZmZlY3QgdG8gYm9vc3Qgb3IgYW1wbGlmeSBsb3cgZnJlcXVlbmNpZXMgb2YgdGhlIHNvdW5kLiBJdCBpcyBjb21wYXJhYmxlCisgKiB0byBhbiBzaW1wbGUgZXF1YWxpemVyIGJ1dCBsaW1pdGVkIHRvIG9uZSBiYW5kIGFtcGxpZmljYXRpb24gaW4gdGhlIGxvdyBmcmVxdWVuY3kgcmFuZ2UuCisgKiA8cD5BbiBhcHBsaWNhdGlvbiBjcmVhdGVzIGEgQmFzc0Jvb3N0IG9iamVjdCB0byBpbnN0YW50aWF0ZSBhbmQgY29udHJvbCBhIGJhc3MgYm9vc3QgZW5naW5lCisgKiBpbiB0aGUgYXVkaW8gZnJhbWV3b3JrLgorICogPHA+VGhlIG1ldGhvZHMsIHBhcmFtZXRlciB0eXBlcyBhbmQgdW5pdHMgZXhwb3NlZCBieSB0aGUgQmFzc0Jvb3N0IGltcGxlbWVudGF0aW9uIGFyZSBkaXJlY3RseQorICogbWFwcGluZyB0aG9zZSBkZWZpbmVkIGJ5IHRoZSBPcGVuU0wgRVMgMS4wLjEgU3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy5raHJvbm9zLm9yZy9vcGVuc2xlcy8pCisgKiBmb3IgdGhlIFNMQmFzc0Jvb3N0SXRmIGludGVyZmFjZS4gUGxlYXNlIHJlZmVyIHRvIHRoaXMgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorICogPHA+VG8gYXR0YWNoIHRoZSBCYXNzQm9vc3QgdG8gYSBwYXJ0aWN1bGFyIEF1ZGlvVHJhY2sgb3IgTWVkaWFQbGF5ZXIsIHNwZWNpZnkgdGhlIGF1ZGlvIHNlc3Npb24KKyAqIElEIG9mIHRoaXMgQXVkaW9UcmFjayBvciBNZWRpYVBsYXllciB3aGVuIGNvbnN0cnVjdGluZyB0aGUgQmFzc0Jvb3N0LiBJZiB0aGUgYXVkaW8gc2Vzc2lvbiBJRCAwCisgKiBpcyBzcGVjaWZpZWQsIHRoZSBCYXNzQm9vc3QgYXBwbGllcyB0byB0aGUgbWFpbiBhdWRpbyBvdXRwdXQgbWl4LgorIC8vIFRPRE8gd2hlbiBBdWRpb0VmZmVjdCBpcyB1bmhpZGRlbgorIC8vIDxwPiBTZWUge19hdF9saW5rIGFuZHJvaWQubWVkaWEuQXVkaW9FZmZlY3R9IGNsYXNzIGZvciBtb3JlIGRldGFpbHMgb24gY29udHJvbGxpbmcgYXVkaW8gZWZmZWN0cy4KKyAqCisgKiB7QGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCByZXZpZXd9CisgKi8KKworcHVibGljIGNsYXNzIEJhc3NCb29zdCBleHRlbmRzIEF1ZGlvRWZmZWN0IHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQmFzc0Jvb3N0IjsKKworICAgIC8vIFRoZXNlIGNvbnN0YW50cyBtdXN0IGJlIHN5bmNocm9uaXplZCB3aXRoIHRob3NlIGluCisgICAgLy8gZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmgKKyAgICAvKioKKyAgICAgKiBJcyBzdHJlbmd0aCBwYXJhbWV0ZXIgc3VwcG9ydGVkIGJ5IGJhc3MgYm9vc3QgZW5naW5lLiBQYXJhbWV0ZXIgSUQgZm9yIGdldFBhcmFtZXRlcigpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCA9IDA7CisgICAgLyoqCisgICAgICogQmFzcyBib29zdCBlZmZlY3Qgc3RyZW5ndGguIFBhcmFtZXRlciBJRCBmb3IKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5CYXNzQm9vc3QuT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTV9TVFJFTkdUSCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgc3RyZW5ndGggcGFyYW1ldGVyIGlzIHN1cHBvcnRlZCBieSB0aGUgYmFzcyBib29zdCBlbmdpbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0cmVuZ3RoU3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcmVkIGxpc3RlbmVyIGZvciBwYXJhbWV0ZXIgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIgbVBhcmFtTGlzdGVuZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgdXNlZCBpbnRlcm5hbGx5IHRvIHRvIHJlY2VpdmUgcmF3IHBhcmFtZXRlciBjaGFuZ2UgZXZlbnQgZnJvbSBBdWRpb0VmZmVjdCBzdXBlciBjbGFzcworICAgICAqLworICAgIHByaXZhdGUgQmFzZVBhcmFtZXRlckxpc3RlbmVyIG1CYXNlUGFyYW1MaXN0ZW5lciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBMb2NrIGZvciBhY2Nlc3MgdG8gbVBhcmFtTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtUGFyYW1MaXN0ZW5lckxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyBjb25zdHJ1Y3Rvci4KKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIHByaW9yaXR5IGxldmVsIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24gZm9yIGNvbnRyb2xsaW5nIHRoZSBCYXNzQm9vc3QKKyAgICAgKiBlbmdpbmUuIEFzIHRoZSBzYW1lIGVuZ2luZSBjYW4gYmUgc2hhcmVkIGJ5IHNldmVyYWwgYXBwbGljYXRpb25zLCB0aGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMKKyAgICAgKiBob3cgbXVjaCB0aGUgcmVxdWVzdGluZyBhcHBsaWNhdGlvbiBuZWVkcyBjb250cm9sIG9mIGVmZmVjdCBwYXJhbWV0ZXJzLiBUaGUgbm9ybWFsIHByaW9yaXR5CisgICAgICogaXMgMCwgYWJvdmUgbm9ybWFsIGlzIGEgcG9zaXRpdmUgbnVtYmVyLCBiZWxvdyBub3JtYWwgYSBuZWdhdGl2ZSBudW1iZXIuCisgICAgICogQHBhcmFtIGF1ZGlvU2Vzc2lvbiAgU3lzdGVtIHdpZGUgdW5pcXVlIGF1ZGlvIHNlc3Npb24gaWRlbnRpZmllci4gSWYgYXVkaW9TZXNzaW9uCisgICAgICogIGlzIG5vdCAwLCB0aGUgQmFzc0Jvb3N0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIE1lZGlhUGxheWVyIG9yIEF1ZGlvVHJhY2sgaW4gdGhlCisgICAgICogIHNhbWUgYXVkaW8gc2Vzc2lvbi4gT3RoZXJ3aXNlLCB0aGUgQmFzc0Jvb3N0IHdpbGwgYXBwbHkgdG8gdGhlIG91dHB1dCBtaXguCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQmFzc0Jvb3N0KGludCBwcmlvcml0eSwgaW50IGF1ZGlvU2Vzc2lvbikKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sCisgICAgICAgICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLCBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoRUZGRUNUX1RZUEVfQkFTU19CT09TVCwgRUZGRUNUX1RZUEVfTlVMTCwgcHJpb3JpdHksIGF1ZGlvU2Vzc2lvbik7CisKKyAgICAgICAgc2hvcnRbXSB2YWx1ZSA9IG5ldyBzaG9ydFsxXTsKKyAgICAgICAgY2hlY2tTdGF0dXMoZ2V0UGFyYW1ldGVyKFBBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCwgdmFsdWUpKTsKKyAgICAgICAgbVN0cmVuZ3RoU3VwcG9ydGVkID0gKHZhbHVlWzBdICE9IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHNldHRpbmcgc3RyZW5ndGggaXMgc3VwcG9ydGVkLiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLCBvbmx5IG9uZQorICAgICAqIHN0cmVuZ3RoIGlzIHN1cHBvcnRlZCBhbmQgdGhlIHNldFN0cmVuZ3RoKCkgbWV0aG9kIGFsd2F5cyByb3VuZHMgdG8gdGhhdCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaXMgc3RyZW5ndGggcGFyYW1ldGVyIGlzIHN1cHBvcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3RyZW5ndGhTdXBwb3J0ZWQoKSB7CisgICAgICAgcmV0dXJuIG1TdHJlbmd0aFN1cHBvcnRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdHJlbmd0aCBvZiB0aGUgYmFzcyBib29zdCBlZmZlY3QuIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHBlciBtaWxsZQorICAgICAqIGFjY3VyYWN5IGZvciBzZXR0aW5nIHRoZSBzdHJlbmd0aCwgaXQgaXMgYWxsb3dlZCB0byByb3VuZCB0aGUgZ2l2ZW4gc3RyZW5ndGggdG8gdGhlIG5lYXJlc3QKKyAgICAgKiBzdXBwb3J0ZWQgdmFsdWUuIFlvdSBjYW4gdXNlIHRoZSB7QGxpbmsgI2dldFJvdW5kZWRTdHJlbmd0aCgpfSBtZXRob2QgdG8gcXVlcnkgdGhlCisgICAgICogKHBvc3NpYmx5IHJvdW5kZWQpIHZhbHVlIHRoYXQgd2FzIGFjdHVhbGx5IHNldC4KKyAgICAgKiBAcGFyYW0gc3RyZW5ndGggU3RyZW5ndGggb2YgdGhlIGVmZmVjdC4gVGhlIHZhbGlkIHJhbmdlIGZvciBzdHJlbmd0aCBzdHJlbmd0aCBpcyBbMCwgMTAwMF0sCisgICAgICogd2hlcmUgMCBwZXIgbWlsbGUgZGVzaWduYXRlcyB0aGUgbWlsZGVzdCBlZmZlY3QgYW5kIDEwMDAgcGVyIG1pbGxlIGRlc2lnbmF0ZXMgdGhlIHN0cm9uZ2VzdC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmVuZ3RoKHNob3J0IHN0cmVuZ3RoKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBjaGVja1N0YXR1cyhzZXRQYXJhbWV0ZXIoUEFSQU1fU1RSRU5HVEgsIHN0cmVuZ3RoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBzdHJlbmd0aCBvZiB0aGUgZWZmZWN0LgorICAgICAqIEByZXR1cm4gVGhlIHN0cmVuZ3RoIG9mIHRoZSBlZmZlY3QuIFRoZSB2YWxpZCByYW5nZSBmb3Igc3RyZW5ndGggaXMgWzAsIDEwMDBdLCB3aGVyZSAwIHBlcgorICAgICAqIG1pbGxlIGRlc2lnbmF0ZXMgdGhlIG1pbGRlc3QgZWZmZWN0IGFuZCAxMDAwIHBlciBtaWxsZSB0aGUgc3Ryb25nZXN0CisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0Um91bmRlZFN0cmVuZ3RoKCkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgc2hvcnRbXSB2YWx1ZSA9IG5ldyBzaG9ydFsxXTsKKyAgICAgICAgY2hlY2tTdGF0dXMoZ2V0UGFyYW1ldGVyKFBBUkFNX1NUUkVOR1RILCB2YWx1ZSkpOworICAgICAgICByZXR1cm4gdmFsdWVbMF07CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIgaW50ZXJmYWNlIGRlZmluZXMgYSBtZXRob2QgY2FsbGVkIGJ5IHRoZSBCYXNzQm9vc3Qgd2hlbiBhCisgICAgICogcGFyYW1ldGVyIHZhbHVlIGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciAgeworICAgICAgICAvKioKKyAgICAgICAgICogTWV0aG9kIGNhbGxlZCB3aGVuIGEgcGFyYW1ldGVyIHZhbHVlIGhhcyBjaGFuZ2VkLiBUaGUgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IGlmIHRoZQorICAgICAgICAgKiBwYXJhbWV0ZXIgd2FzIGNoYW5nZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbiBoYXZpbmcgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUKKyAgICAgICAgICogQmFzc0Jvb3N0IGVuZ2luZS4KKyAgICAgICAgICogQHBhcmFtIGVmZmVjdCB0aGUgQmFzc0Jvb3N0IG9uIHdoaWNoIHRoZSBpbnRlcmZhY2UgaXMgcmVnaXN0ZXJlZC4KKyAgICAgICAgICogQHBhcmFtIHN0YXR1cyBzdGF0dXMgb2YgdGhlIHNldCBwYXJhbWV0ZXIgb3BlcmF0aW9uLgorICAgICAgICAgLy8gVE9ETyB3aGVuIEF1ZGlvRWZmZWN0IGlzIHVuaGlkZGVuCisgICAgICAgICAvLyBTZWUge19hdF9saW5rIGFuZHJvaWQubWVkaWEuQXVkaW9FZmZlY3Qjc2V0UGFyYW1ldGVyKGJ5dGVbXSwgYnl0ZVtdKX0uCisgICAgICAgICAqIEBwYXJhbSBwYXJhbSBJRCBvZiB0aGUgbW9kaWZpZWQgcGFyYW1ldGVyLiBTZWUge0BsaW5rICNQQVJBTV9TVFJFTkdUSH0gLi4uCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25QYXJhbWV0ZXJDaGFuZ2UoQmFzc0Jvb3N0IGVmZmVjdCwgaW50IHN0YXR1cywgaW50IHBhcmFtLCBzaG9ydCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgdXNlZCBpbnRlcm5hbGx5IHRvIHJlY2VpdmUgdW5mb3JtYXR0ZWQgcGFyYW1ldGVyIGNoYW5nZSBldmVudHMgZnJvbSBBdWRpb0VmZmVjdAorICAgICAqIHN1cGVyIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQmFzZVBhcmFtZXRlckxpc3RlbmVyIGltcGxlbWVudHMgQXVkaW9FZmZlY3QuT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgQmFzZVBhcmFtZXRlckxpc3RlbmVyKCkgeworCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25QYXJhbWV0ZXJDaGFuZ2UoQXVkaW9FZmZlY3QgZWZmZWN0LCBpbnQgc3RhdHVzLCBieXRlW10gcGFyYW0sIGJ5dGVbXSB2YWx1ZSkgeworICAgICAgICAgICAgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBsID0gbnVsbDsKKworICAgICAgICAgICAgc3luY2hyb25pemVkIChtUGFyYW1MaXN0ZW5lckxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAobVBhcmFtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsID0gbVBhcmFtTGlzdGVuZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBwID0gLTE7CisgICAgICAgICAgICAgICAgc2hvcnQgdiA9IC0xOworCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLmxlbmd0aCA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgIHAgPSBieXRlQXJyYXlUb0ludChwYXJhbSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMikgeworICAgICAgICAgICAgICAgICAgICB2ID0gYnl0ZUFycmF5VG9TaG9ydCh2YWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwICE9IC0xICYmIHYgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbC5vblBhcmFtZXRlckNoYW5nZShCYXNzQm9vc3QudGhpcywgc3RhdHVzLCBwLCB2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYW4gT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBpbnRlcmZhY2UuCisgICAgICogQHBhcmFtIGxpc3RlbmVyIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIgaW50ZXJmYWNlIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJMaXN0ZW5lcihPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmFtTGlzdGVuZXJMb2NrKSB7CisgICAgICAgICAgICBpZiAobVBhcmFtTGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QYXJhbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICAgICAgbUJhc2VQYXJhbUxpc3RlbmVyID0gbmV3IEJhc2VQYXJhbWV0ZXJMaXN0ZW5lcigpOworICAgICAgICAgICAgICAgIHN1cGVyLnNldFBhcmFtZXRlckxpc3RlbmVyKG1CYXNlUGFyYW1MaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuamF2YQppbmRleCA2NGQ2NDYwLi5hMjdkZjU3IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmphdmEKQEAgLTExOSwxNSArMTE5LDI2IEBACiAgICAgcHVibGljIGludCBhdWRpb0NoYW5uZWxzOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2FtY29yZGVyIHByb2ZpbGUgZm9yIHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsLgorICAgICAqIFJldHVybnMgdGhlIGNhbWNvcmRlciBwcm9maWxlIGZvciB0aGUgZGVmYXVsdCBjYW1lcmEgYXQgdGhlIGdpdmVuCisgICAgICogcXVhbGl0eSBsZXZlbC4KICAgICAgKiBAcGFyYW0gcXVhbGl0eSB0aGUgdGFyZ2V0IHF1YWxpdHkgbGV2ZWwgZm9yIHRoZSBjYW1jb3JkZXIgcHJvZmlsZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSBnZXQoaW50IHF1YWxpdHkpIHsKKyAgICAgICAgcmV0dXJuIGdldCgwLCBxdWFsaXR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjYW1jb3JkZXIgcHJvZmlsZSBmb3IgdGhlIGdpdmVuIGNhbWVyYSBhdCB0aGUgZ2l2ZW4KKyAgICAgKiBxdWFsaXR5IGxldmVsLgorICAgICAqIEBwYXJhbSBjYW1lcmFJZCB0aGUgaWQgZm9yIHRoZSBjYW1lcmEKKyAgICAgKiBAcGFyYW0gcXVhbGl0eSB0aGUgdGFyZ2V0IHF1YWxpdHkgbGV2ZWwgZm9yIHRoZSBjYW1jb3JkZXIgcHJvZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSBnZXQoaW50IGNhbWVyYUlkLCBpbnQgcXVhbGl0eSkgewogICAgICAgICBpZiAocXVhbGl0eSA8IFFVQUxJVFlfTE9XIHx8IHF1YWxpdHkgPiBRVUFMSVRZX0hJR0gpIHsKICAgICAgICAgICAgIFN0cmluZyBlcnJNZXNzYWdlID0gIlVuc3VwcG9ydGVkIHF1YWxpdHkgbGV2ZWw6ICIgKyBxdWFsaXR5OwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlcnJNZXNzYWdlKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZShxdWFsaXR5KTsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGUoY2FtZXJhSWQsIHF1YWxpdHkpOwogICAgIH0KIAogICAgIHN0YXRpYyB7CkBAIC0xNjUsNSArMTc2LDYgQEAKIAogICAgIC8vIE1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgSk5JCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2luaXQoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmluYWwgQ2FtY29yZGVyUHJvZmlsZSBuYXRpdmVfZ2V0X2NhbWNvcmRlcl9wcm9maWxlKGludCBxdWFsaXR5KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmluYWwgQ2FtY29yZGVyUHJvZmlsZSBuYXRpdmVfZ2V0X2NhbWNvcmRlcl9wcm9maWxlKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgcXVhbGl0eSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtZXJhUHJvZmlsZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0NhbWVyYVByb2ZpbGUuamF2YQppbmRleCBmOGQzOTM1Li42YTBiZTA4IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtZXJhUHJvZmlsZS5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1lcmFQcm9maWxlLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiAKIC8qKgogICogVGhlIENhbWVyYVByb2ZpbGUgY2xhc3MgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgcHJlLWRlZmluZWQgc3RpbGwgaW1hZ2UKQEAgLTQwLDM2ICs0MSw1NSBAQAogICAgIC8qCiAgICAgICogQ2FjaGUgdGhlIEpwZWcgZW5jb2RpbmcgcXVhbGl0eSBwYXJhbWV0ZXJzCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc0pwZWdFbmNvZGluZ1F1YWxpdHlQYXJhbWV0ZXJzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8SW50ZWdlciwgaW50W10+IHNDYWNoZSA9IG5ldyBIYXNoTWFwPEludGVnZXIsIGludFtdPigpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHByZS1kZWZpbmVkIHN0aWxsIGltYWdlIGNhcHR1cmUgKGpwZWcpIHF1YWxpdHkgbGV2ZWwKLSAgICAgKiB1c2VkIGZvciB0aGUgZ2l2ZW4gcXVhbGl0eSBsZXZlbCBpbiB0aGUgQ2FtZXJhIGFwcGxpY2F0aW9uLgorICAgICAqIHVzZWQgZm9yIHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsIGluIHRoZSBDYW1lcmEgYXBwbGljYXRpb24gZm9yCisgICAgICogdGhlIGRlZmF1bHQgY2FtZXJhLgogICAgICAqCiAgICAgICogQHBhcmFtIHF1YWxpdHkgVGhlIHRhcmdldCBxdWFsaXR5IGxldmVsCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SnBlZ0VuY29kaW5nUXVhbGl0eVBhcmFtZXRlcihpbnQgcXVhbGl0eSkgeworICAgICAgICByZXR1cm4gZ2V0SnBlZ0VuY29kaW5nUXVhbGl0eVBhcmFtZXRlcigwLCBxdWFsaXR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcHJlLWRlZmluZWQgc3RpbGwgaW1hZ2UgY2FwdHVyZSAoanBlZykgcXVhbGl0eSBsZXZlbAorICAgICAqIHVzZWQgZm9yIHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsIGluIHRoZSBDYW1lcmEgYXBwbGljYXRpb24gZm9yCisgICAgICogdGhlIHNwZWNpZmllZCBjYW1lcmEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FtZXJhSWQgVGhlIGlkIG9mIHRoZSBjYW1lcmEKKyAgICAgKiBAcGFyYW0gcXVhbGl0eSBUaGUgdGFyZ2V0IHF1YWxpdHkgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRKcGVnRW5jb2RpbmdRdWFsaXR5UGFyYW1ldGVyKGludCBjYW1lcmFJZCwgaW50IHF1YWxpdHkpIHsKICAgICAgICAgaWYgKHF1YWxpdHkgPCBRVUFMSVRZX0xPVyB8fCBxdWFsaXR5ID4gUVVBTElUWV9ISUdIKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBxdWFsaXR5IGxldmVsOiAiICsgcXVhbGl0eSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNKcGVnRW5jb2RpbmdRdWFsaXR5UGFyYW1ldGVyc1txdWFsaXR5XTsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ2FjaGUpIHsKKyAgICAgICAgICAgIGludFtdIGxldmVscyA9IHNDYWNoZS5nZXQoY2FtZXJhSWQpOworICAgICAgICAgICAgaWYgKGxldmVscyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIHNDYWNoZS5wdXQoY2FtZXJhSWQsIGxldmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGV2ZWxzW3F1YWxpdHldOworICAgICAgICB9CiAgICAgfQogCiAgICAgc3RhdGljIHsKICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYV9qbmkiKTsKICAgICAgICAgbmF0aXZlX2luaXQoKTsKLSAgICAgICAgc0pwZWdFbmNvZGluZ1F1YWxpdHlQYXJhbWV0ZXJzID0gZ2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscygpIHsKLSAgICAgICAgaW50IG5MZXZlbHMgPSBuYXRpdmVfZ2V0X251bV9pbWFnZV9lbmNvZGluZ19xdWFsaXR5X2xldmVscygpOworICAgIHByaXZhdGUgc3RhdGljIGludFtdIGdldEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKGludCBjYW1lcmFJZCkgeworICAgICAgICBpbnQgbkxldmVscyA9IG5hdGl2ZV9nZXRfbnVtX2ltYWdlX2VuY29kaW5nX3F1YWxpdHlfbGV2ZWxzKGNhbWVyYUlkKTsKICAgICAgICAgaWYgKG5MZXZlbHMgIT0gUVVBTElUWV9ISUdIICsgMSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgSnBlZyBlbmNvZGluZyBxdWFsaXR5IGxldmVscyAiICsgbkxldmVscyk7CiAgICAgICAgIH0KIAogICAgICAgICBpbnRbXSBsZXZlbHMgPSBuZXcgaW50W25MZXZlbHNdOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5MZXZlbHM7ICsraSkgewotICAgICAgICAgICAgbGV2ZWxzW2ldID0gbmF0aXZlX2dldF9pbWFnZV9lbmNvZGluZ19xdWFsaXR5X2xldmVsKGkpOworICAgICAgICAgICAgbGV2ZWxzW2ldID0gbmF0aXZlX2dldF9pbWFnZV9lbmNvZGluZ19xdWFsaXR5X2xldmVsKGNhbWVyYUlkLCBpKTsKICAgICAgICAgfQogICAgICAgICBBcnJheXMuc29ydChsZXZlbHMpOyAgLy8gTG93ZXIgcXVhbGl0eSBsZXZlbCBBTFdBWVMgY29tZXMgYmVmb3JlIGhpZ2hlciBvbmUKICAgICAgICAgcmV0dXJuIGxldmVsczsKQEAgLTc3LDYgKzk3LDYgQEAKIAogICAgIC8vIE1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgSk5JCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2luaXQoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmluYWwgaW50IG5hdGl2ZV9nZXRfbnVtX2ltYWdlX2VuY29kaW5nX3F1YWxpdHlfbGV2ZWxzKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIGludCBuYXRpdmVfZ2V0X2ltYWdlX2VuY29kaW5nX3F1YWxpdHlfbGV2ZWwoaW50IGluZGV4KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmluYWwgaW50IG5hdGl2ZV9nZXRfbnVtX2ltYWdlX2VuY29kaW5nX3F1YWxpdHlfbGV2ZWxzKGludCBjYW1lcmFJZCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIGludCBuYXRpdmVfZ2V0X2ltYWdlX2VuY29kaW5nX3F1YWxpdHlfbGV2ZWwoaW50IGNhbWVyYUlkLCBpbnQgaW5kZXgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0Vudmlyb25tZW50YWxSZXZlcmIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9FbnZpcm9ubWVudGFsUmV2ZXJiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyMzBmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9FbnZpcm9ubWVudGFsUmV2ZXJiLmphdmEKQEAgLTAsMCArMSw1MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRWZmZWN0OworCisvKioKKyAqIEEgc291bmQgZ2VuZXJhdGVkIHdpdGhpbiBhIHJvb20gdHJhdmVscyBpbiBtYW55IGRpcmVjdGlvbnMuIFRoZSBsaXN0ZW5lciBmaXJzdCBoZWFycyB0aGUKKyAqIGRpcmVjdCBzb3VuZCBmcm9tIHRoZSBzb3VyY2UgaXRzZWxmLiBMYXRlciwgaGUgb3Igc2hlIGhlYXJzIGRpc2NyZXRlIGVjaG9lcyBjYXVzZWQgYnkgc291bmQKKyAqIGJvdW5jaW5nIG9mZiBuZWFyYnkgd2FsbHMsIHRoZSBjZWlsaW5nIGFuZCB0aGUgZmxvb3IuIEFzIHNvdW5kIHdhdmVzIGFycml2ZSBhZnRlcgorICogdW5kZXJnb2luZyBtb3JlIGFuZCBtb3JlIHJlZmxlY3Rpb25zLCBpbmRpdmlkdWFsIHJlZmxlY3Rpb25zIGJlY29tZSBpbmRpc3Rpbmd1aXNoYWJsZSBhbmQKKyAqIHRoZSBsaXN0ZW5lciBoZWFycyBjb250aW51b3VzIHJldmVyYmVyYXRpb24gdGhhdCBkZWNheXMgb3ZlciB0aW1lLgorICogUmV2ZXJiIGlzIHZpdGFsIGZvciBtb2RlbGluZyBhIGxpc3RlbmVyJ3MgZW52aXJvbm1lbnQuIEl0IGNhbiBiZSB1c2VkIGluIG11c2ljIGFwcGxpY2F0aW9ucworICogdG8gc2ltdWxhdGUgbXVzaWMgYmVpbmcgcGxheWVkIGJhY2sgaW4gdmFyaW91cyBlbnZpcm9ubWVudHMsIG9yIGluIGdhbWVzIHRvIGltbWVyc2UgdGhlCisgKiBsaXN0ZW5lciB3aXRoaW4gdGhlIGdhbWUncyBlbnZpcm9ubWVudC4KKyAqIFRoZSBFbnZpcm9ubWVudGFsUmV2ZXJiIGNsYXNzIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBjb250cm9sIGVhY2ggcmV2ZXJiIGVuZ2luZSBwcm9wZXJ0eSBpbiBhCisgKiBnbG9iYWwgcmV2ZXJiIGVudmlyb25tZW50IGFuZCBpcyBtb3JlIHN1aXRhYmxlIGZvciBnYW1lcy4gRm9yIGJhc2ljIGNvbnRyb2wsIG1vcmUgc3VpdGFibGUgZm9yCisgKiBtdXNpYyBhcHBsaWNhdGlvbnMsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUKKyAvLyBUT0RPIHdoZW4gUHJlc2V0UmV2ZXJiIGlzIHVuaGlkZGVuCisgLy8ge19hdF9saW5rIGFuZHJvaWQubWVkaWEuUHJlc2V0UmV2ZXJifSBjbGFzcy4KKyAqIDxwPkFuIGFwcGxpY2F0aW9uIGNyZWF0ZXMgYSBFbnZpcm9ubWVudGFsUmV2ZXJiIG9iamVjdCB0byBpbnN0YW50aWF0ZSBhbmQgY29udHJvbCBhIHJldmVyYiBlbmdpbmUKKyAqIGluIHRoZSBhdWRpbyBmcmFtZXdvcmsuCisgKiA8cD5UaGUgbWV0aG9kcywgcGFyYW1ldGVyIHR5cGVzIGFuZCB1bml0cyBleHBvc2VkIGJ5IHRoZSBFbnZpcm9ubWVudGFsUmV2ZXJiIGltcGxlbWVudGF0aW9uIGFyZQorICogZGlyZWN0bHkgbWFwcGluZyB0aG9zZSBkZWZpbmVkIGJ5IHRoZSBPcGVuU0wgRVMgMS4wLjEgU3BlY2lmaWNhdGlvbgorICogKGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3BlbnNsZXMvKSBmb3IgdGhlIFNMRW52aXJvbm1lbnRhbFJldmVyYkl0ZiBpbnRlcmZhY2UuCisgKiBQbGVhc2UgcmVmZXIgdG8gdGhpcyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCisgKiA8cD5UaGUgRW52aXJvbm1lbnRhbFJldmVyYiBpcyBhbiBvdXRwdXQgbWl4IGF1eGlsaWFyeSBlZmZlY3QgYW5kIHNob3VsZCBiZSBjcmVhdGVkIG9uCisgKiBBdWRpbyBzZXNzaW9uIDAuIEluIG9yZGVyIGZvciBhIE1lZGlhUGxheWVyIG9yIEF1ZGlvVHJhY2sgdG8gYmUgZmVkIGludG8gdGhpcyBlZmZlY3QsCisgKiB0aGV5IG11c3QgYmUgZXhwbGljaXRlbHkgYXR0YWNoZWQgdG8gaXQgYW5kIGEgc2VuZCBsZXZlbCBtdXN0IGJlIHNwZWNpZmllZC4gVXNlIHRoZSBlZmZlY3QgSUQKKyAqIHJldHVybmVkIGJ5IGdldElkKCkgbWV0aG9kIHRvIGRlc2lnbmF0ZSB0aGlzIHBhcnRpY3VsYXIgZWZmZWN0IHdoZW4gYXR0YWNoaW5nIGl0IHRvIHRoZQorICogTWVkaWFQbGF5ZXIgb3IgQXVkaW9UcmFjay4KKyAvLyBUT0RPIHdoZW4gQXVkaW9FZmZlY3QgaXMgdW5oaWRkZW4KKyAvLyA8cD4gU2VlIHtfYXRfbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvRWZmZWN0fSBjbGFzcyBmb3IgbW9yZSBkZXRhaWxzIG9uIGNvbnRyb2xsaW5nCisgKiBhdWRpbyBlZmZlY3RzLgorICoKKyAqIHtAaGlkZSBQZW5kaW5nIEFQSSBjb3VuY2lsIHJldmlld30KKyAqLworCitwdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRhbFJldmVyYiBleHRlbmRzIEF1ZGlvRWZmZWN0IHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiRW52aXJvbm1lbnRhbFJldmVyYiI7CisKKyAgICAvLyBUaGVzZSBjb25zdGFudHMgbXVzdCBiZSBzeW5jaHJvbml6ZWQgd2l0aCB0aG9zZSBpbgorICAgIC8vIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL0VmZmVjdEVudmlyb25tZW50YWxSZXZlcmJBcGkuaAorCisgICAgLyoqCisgICAgICogUm9vbSBsZXZlbC4gUGFyYW1ldGVyIElEIGZvcgorICAgICAqIHtAbGluayBhbmRyb2lkLm1lZGlhLkVudmlyb25tZW50YWxSZXZlcmIuT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTV9ST09NX0xFVkVMID0gMDsKKyAgICAvKioKKyAgICAgKiBSb29tIEhGIGxldmVsLiBQYXJhbWV0ZXIgSUQgZm9yIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTV9ST09NX0hGX0xFVkVMID0gMTsKKyAgICAvKioKKyAgICAgKiBEZWNheSB0aW1lLiBQYXJhbWV0ZXIgSUQgZm9yIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTV9ERUNBWV9USU1FID0gMjsKKyAgICAvKioKKyAgICAgKiBEZWNheSBIRiByYXRpby4gUGFyYW1ldGVyIElEIGZvciBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fREVDQVlfSEZfUkFUSU8gPSAzOworICAgIC8qKgorICAgICAqIEVhcmx5IHJlZmxlY3Rpb25zIGxldmVsLiBQYXJhbWV0ZXIgSUQgZm9yIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTV9SRUZMRUNUSU9OU19MRVZFTCA9IDQ7CisgICAgLyoqCisgICAgICogRWFybHkgcmVmbGVjdGlvbnMgZGVsYXkuIFBhcmFtZXRlciBJRCBmb3IgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUkFNX1JFRkxFQ1RJT05TX0RFTEFZID0gNTsKKyAgICAvKioKKyAgICAgKiBSZXZlcmIgbGV2ZWwuIFBhcmFtZXRlciBJRCBmb3IgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUkFNX1JFVkVSQl9MRVZFTCA9IDY7CisgICAgLyoqCisgICAgICogUmV2ZXJiIGRlbGF5LiBQYXJhbWV0ZXIgSUQgZm9yIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTV9SRVZFUkJfREVMQVkgPSA3OworICAgIC8qKgorICAgICAqIERpZmZ1c2lvbi4gUGFyYW1ldGVyIElEIGZvciBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fRElGRlVTSU9OID0gODsKKyAgICAvKioKKyAgICAgKiBEZW5zaXR5LiBQYXJhbWV0ZXIgSUQgZm9yIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTV9ERU5TSVRZID0gOTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyZWQgbGlzdGVuZXIgZm9yIHBhcmFtZXRlciBjaGFuZ2VzCisgICAgICovCisgICAgcHJpdmF0ZSBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyIG1QYXJhbUxpc3RlbmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIExpc3RlbmVyIHVzZWQgaW50ZXJuYWxseSB0byB0byByZWNlaXZlIHJhdyBwYXJhbWV0ZXIgY2hhbmdlIGV2ZW50IGZyb20gQXVkaW9FZmZlY3Qgc3VwZXIKKyAgICAgKiBjbGFzcworICAgICAqLworICAgIHByaXZhdGUgQmFzZVBhcmFtZXRlckxpc3RlbmVyIG1CYXNlUGFyYW1MaXN0ZW5lciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBMb2NrIGZvciBhY2Nlc3MgdG8gbVBhcmFtTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtUGFyYW1MaXN0ZW5lckxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyBjb25zdHJ1Y3Rvci4KKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIHByaW9yaXR5IGxldmVsIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24gZm9yIGNvbnRyb2xsaW5nIHRoZQorICAgICAqIEVudmlyb25tZW50YWxSZXZlcmIgZW5naW5lLiBBcyB0aGUgc2FtZSBlbmdpbmUgY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsIGFwcGxpY2F0aW9ucywgdGhpcworICAgICAqIHBhcmFtZXRlciBpbmRpY2F0ZXMgaG93IG11Y2ggdGhlIHJlcXVlc3RpbmcgYXBwbGljYXRpb24gbmVlZHMgY29udHJvbCBvZiBlZmZlY3QgcGFyYW1ldGVycy4KKyAgICAgKiBUaGUgbm9ybWFsIHByaW9yaXR5IGlzIDAsIGFib3ZlIG5vcm1hbCBpcyBhIHBvc2l0aXZlIG51bWJlciwgYmVsb3cgbm9ybWFsIGEgbmVnYXRpdmUgbnVtYmVyLgorICAgICAqIEBwYXJhbSBhdWRpb1Nlc3Npb24gIFN5c3RlbSB3aWRlIHVuaXF1ZSBhdWRpbyBzZXNzaW9uIGlkZW50aWZpZXIuIElmIGF1ZGlvU2Vzc2lvbgorICAgICAqICBpcyBub3QgMCwgdGhlIEVudmlyb25tZW50YWxSZXZlcmIgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgTWVkaWFQbGF5ZXIgb3IgQXVkaW9UcmFjayBpbiB0aGUKKyAgICAgKiAgc2FtZSBhdWRpbyBzZXNzaW9uLiBPdGhlcndpc2UsIHRoZSBFbnZpcm9ubWVudGFsUmV2ZXJiIHdpbGwgYXBwbHkgdG8gdGhlIG91dHB1dCBtaXguCisgICAgICogIEFzIHRoZSBFbnZpcm9ubWVudGFsUmV2ZXJiIGlzIGFuIGF1eGlsaWFyeSBlZmZlY3QgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFudGlhdGUgaXQgb24KKyAgICAgKiAgYXVkaW8gc2Vzc2lvbiAwIGFuZCB0byBhdHRhY2ggaXQgdG8gdGhlIE1lZGlhUExheWVyIGF1eGlsaWFyeSBvdXRwdXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgRW52aXJvbm1lbnRhbFJldmVyYihpbnQgcHJpb3JpdHksIGludCBhdWRpb1Nlc3Npb24pCisgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24sIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBzdXBlcihFRkZFQ1RfVFlQRV9FTlZfUkVWRVJCLCBFRkZFQ1RfVFlQRV9OVUxMLCBwcmlvcml0eSwgYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgTG9nLmUoVEFHLCAiY29udHJ1Y3RvciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1hc3RlciB2b2x1bWUgbGV2ZWwgb2YgdGhlIGVudmlyb25tZW50YWwgcmV2ZXJiIGVmZmVjdC4KKyAgICAgKiBAcGFyYW0gcm9vbSBSb29tIGxldmVsIGluIG1pbGxpYmVscy4gVGhlIHZhbGlkIHJhbmdlIGlzIFstOTAwMCwgMF0uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb29tTGV2ZWwoc2hvcnQgcm9vbSkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIHBhcmFtID0gc2hvcnRUb0J5dGVBcnJheShyb29tKTsKKyAgICAgICAgY2hlY2tTdGF0dXMoc2V0UGFyYW1ldGVyKFBBUkFNX1JPT01fTEVWRUwsIHBhcmFtKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWFzdGVyIHZvbHVtZSBsZXZlbCBvZiB0aGUgZW52aXJvbm1lbnRhbCByZXZlcmIgZWZmZWN0LgorICAgICAqIEByZXR1cm4gdGhlIHJvb20gbGV2ZWwgaW4gbWlsbGliZWxzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHNob3J0IGdldFJvb21MZXZlbCgpCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBwYXJhbSA9IG5ldyBieXRlWzJdOworICAgICAgICBjaGVja1N0YXR1cyhnZXRQYXJhbWV0ZXIoUEFSQU1fUk9PTV9MRVZFTCwgcGFyYW0pKTsKKyAgICAgICAgcmV0dXJuIGJ5dGVBcnJheVRvU2hvcnQocGFyYW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZvbHVtZSBsZXZlbCBhdCA1IGtIeiByZWxhdGl2ZSB0byB0aGUgdm9sdW1lIGxldmVsIGF0IGxvdyBmcmVxdWVuY2llcyBvZiB0aGUKKyAgICAgKiBvdmVyYWxsIHJldmVyYiBlZmZlY3QuCisgICAgICogPHA+VGhpcyBjb250cm9scyBhIGxvdy1wYXNzIGZpbHRlciB0aGF0IHdpbGwgcmVkdWNlIHRoZSBsZXZlbCBvZiB0aGUgaGlnaC1mcmVxdWVuY3kuCisgICAgICogQHBhcmFtIHJvb21IRiBIaWdoIGZyZXF1ZW5jeSBhdHRlbnVhdGlvbiBsZXZlbCBpbiBtaWxsaWJlbHMuIFRoZSB2YWxpZCByYW5nZSBpcyBbLTkwMDAsIDBdLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9vbUhGTGV2ZWwoc2hvcnQgcm9vbUhGKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBieXRlW10gcGFyYW0gPSBzaG9ydFRvQnl0ZUFycmF5KHJvb21IRik7CisgICAgICAgIGNoZWNrU3RhdHVzKHNldFBhcmFtZXRlcihQQVJBTV9ST09NX0hGX0xFVkVMLCBwYXJhbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvb20gSEYgbGV2ZWwuCisgICAgICogQHJldHVybiB0aGUgcm9vbSBIRiBsZXZlbCBpbiBtaWxsaWJlbHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0Um9vbUhGTGV2ZWwoKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBieXRlW10gcGFyYW0gPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAgY2hlY2tTdGF0dXMoZ2V0UGFyYW1ldGVyKFBBUkFNX1JPT01fSEZfTEVWRUwsIHBhcmFtKSk7CisgICAgICAgIHJldHVybiBieXRlQXJyYXlUb1Nob3J0KHBhcmFtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0aW1lIHRha2VuIGZvciB0aGUgbGV2ZWwgb2YgcmV2ZXJiZXJhdGlvbiB0byBkZWNheSBieSA2MCBkQi4KKyAgICAgKiBAcGFyYW0gZGVjYXlUaW1lIERlY2F5IHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBUaGUgdmFsaWQgcmFuZ2UgaXMgWzEwMCwgMjAwMDBdLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVjYXlUaW1lKGludCBkZWNheVRpbWUpCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBwYXJhbSA9IGludFRvQnl0ZUFycmF5KGRlY2F5VGltZSk7CisgICAgICAgIGNoZWNrU3RhdHVzKHNldFBhcmFtZXRlcihQQVJBTV9ERUNBWV9USU1FLCBwYXJhbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRlY2F5IHRpbWUuCisgICAgICogQHJldHVybiB0aGUgZGVjYXkgdGltZSBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERlY2F5VGltZSgpCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBwYXJhbSA9IG5ldyBieXRlWzRdOworICAgICAgICBjaGVja1N0YXR1cyhnZXRQYXJhbWV0ZXIoUEFSQU1fREVDQVlfVElNRSwgcGFyYW0pKTsKKyAgICAgICAgcmV0dXJuIGJ5dGVBcnJheVRvSW50KHBhcmFtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByYXRpbyBvZiBoaWdoIGZyZXF1ZW5jeSBkZWNheSB0aW1lIChhdCA1IGtIeikgcmVsYXRpdmUgdG8gdGhlIGRlY2F5IHRpbWUgYXQgbG93CisgICAgICogZnJlcXVlbmNpZXMuCisgICAgICogQHBhcmFtIGRlY2F5SEZSYXRpbyBIaWdoIGZyZXF1ZW5jeSBkZWNheSByYXRpbyB1c2luZyBhIHBlcm1pbGxlIHNjYWxlLiBUaGUgdmFsaWQgcmFuZ2UgaXMKKyAgICAgKiBbMTAwLCAyMDAwXS4gQSByYXRpbyBvZiAxMDAwIGluZGljYXRlcyB0aGF0IGFsbCBmcmVxdWVuY2llcyBkZWNheSBhdCB0aGUgc2FtZSByYXRlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVjYXlIRlJhdGlvKHNob3J0IGRlY2F5SEZSYXRpbykKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIHBhcmFtID0gc2hvcnRUb0J5dGVBcnJheShkZWNheUhGUmF0aW8pOworICAgICAgICBjaGVja1N0YXR1cyhzZXRQYXJhbWV0ZXIoUEFSQU1fREVDQVlfSEZfUkFUSU8sIHBhcmFtKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcmF0aW8gb2YgaGlnaCBmcmVxdWVuY3kgZGVjYXkgdGltZSAoYXQgNSBrSHopIHJlbGF0aXZlIHRvIGxvdyBmcmVxdWVuY2llcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNheSBIRiByYXRpb24uIFNlZSB7QGxpbmsgI3NldERlY2F5SEZSYXRpbyhzaG9ydCl9IGZvciB1bml0cy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzaG9ydCBnZXREZWNheUhGUmF0aW8oKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBieXRlW10gcGFyYW0gPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAgY2hlY2tTdGF0dXMoZ2V0UGFyYW1ldGVyKFBBUkFNX0RFQ0FZX0hGX1JBVElPLCBwYXJhbSkpOworICAgICAgICByZXR1cm4gYnl0ZUFycmF5VG9TaG9ydChwYXJhbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdm9sdW1lIGxldmVsIG9mIHRoZSBlYXJseSByZWZsZWN0aW9ucy4KKyAgICAgKiA8cD5UaGlzIGxldmVsIGlzIGNvbWJpbmVkIHdpdGggdGhlIG92ZXJhbGwgcm9vbSBsZXZlbAorICAgICAqIChzZXQgdXNpbmcge0BsaW5rICNzZXRSb29tTGV2ZWwoc2hvcnQpfSkuCisgICAgICogQHBhcmFtIHJlZmxlY3Rpb25zTGV2ZWwgUmVmbGVjdGlvbiBsZXZlbCBpbiBtaWxsaWJlbHMuIFRoZSB2YWxpZCByYW5nZSBpcyBbLTkwMDAsIDEwMDBdLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmbGVjdGlvbnNMZXZlbChzaG9ydCByZWZsZWN0aW9uc0xldmVsKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBieXRlW10gcGFyYW0gPSBzaG9ydFRvQnl0ZUFycmF5KHJlZmxlY3Rpb25zTGV2ZWwpOworICAgICAgICBjaGVja1N0YXR1cyhzZXRQYXJhbWV0ZXIoUEFSQU1fUkVGTEVDVElPTlNfTEVWRUwsIHBhcmFtKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdm9sdW1lIGxldmVsIG9mIHRoZSBlYXJseSByZWZsZWN0aW9ucy4KKyAgICAgKiBAcmV0dXJuIHRoZSBlYXJseSByZWZsZWN0aW9ucyBsZXZlbCBpbiBtaWxsaWJlbHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0UmVmbGVjdGlvbnNMZXZlbCgpCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBwYXJhbSA9IG5ldyBieXRlWzJdOworICAgICAgICBjaGVja1N0YXR1cyhnZXRQYXJhbWV0ZXIoUEFSQU1fUkVGTEVDVElPTlNfTEVWRUwsIHBhcmFtKSk7CisgICAgICAgIHJldHVybiBieXRlQXJyYXlUb1Nob3J0KHBhcmFtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWxheSB0aW1lIGZvciB0aGUgZWFybHkgcmVmbGVjdGlvbnMuCisgICAgICogPHA+VGhpcyBtZXRob2Qgc2V0cyB0aGUgdGltZSBiZXR3ZWVuIHdoZW4gdGhlIGRpcmVjdCBwYXRoIGlzIGhlYXJkIGFuZCB3aGVuIHRoZSBmaXJzdAorICAgICAqIHJlZmxlY3Rpb24gaXMgaGVhcmQuCisgICAgICogQHBhcmFtIHJlZmxlY3Rpb25zRGVsYXkgUmVmbGVjdGlvbnMgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBUaGUgdmFsaWQgcmFuZ2UgaXMgWzAsIDMwMF0uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZsZWN0aW9uc0RlbGF5KGludCByZWZsZWN0aW9uc0RlbGF5KQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBieXRlW10gcGFyYW0gPSBpbnRUb0J5dGVBcnJheShyZWZsZWN0aW9uc0RlbGF5KTsKKyAgICAgICAgY2hlY2tTdGF0dXMoc2V0UGFyYW1ldGVyKFBBUkFNX1JFRkxFQ1RJT05TX0RFTEFZLCBwYXJhbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJlZmxlY3Rpb25zIGRlbGF5LgorICAgICAqIEByZXR1cm4gdGhlIGVhcmx5IHJlZmxlY3Rpb25zIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVmbGVjdGlvbnNEZWxheSgpCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBwYXJhbSA9IG5ldyBieXRlWzRdOworICAgICAgICBjaGVja1N0YXR1cyhnZXRQYXJhbWV0ZXIoUEFSQU1fUkVGTEVDVElPTlNfREVMQVksIHBhcmFtKSk7CisgICAgICAgIHJldHVybiBieXRlQXJyYXlUb0ludChwYXJhbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdm9sdW1lIGxldmVsIG9mIHRoZSBsYXRlIHJldmVyYmVyYXRpb24uCisgICAgICogPHA+VGhpcyBsZXZlbCBpcyBjb21iaW5lZCB3aXRoIHRoZSBvdmVyYWxsIHJvb20gbGV2ZWwgKHNldCB1c2luZyB7QGxpbmsgI3NldFJvb21MZXZlbChzaG9ydCl9KS4KKyAgICAgKiBAcGFyYW0gcmV2ZXJiTGV2ZWwgUmV2ZXJiIGxldmVsIGluIG1pbGxpYmVscy4gVGhlIHZhbGlkIHJhbmdlIGlzIFstOTAwMCwgMjAwMF0uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXZlcmJMZXZlbChzaG9ydCByZXZlcmJMZXZlbCkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIHBhcmFtID0gc2hvcnRUb0J5dGVBcnJheShyZXZlcmJMZXZlbCk7CisgICAgICAgIGNoZWNrU3RhdHVzKHNldFBhcmFtZXRlcihQQVJBTV9SRVZFUkJfTEVWRUwsIHBhcmFtKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcmV2ZXJiIGxldmVsLgorICAgICAqIEByZXR1cm4gdGhlIHJldmVyYiBsZXZlbCBpbiBtaWxsaWJlbHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0UmV2ZXJiTGV2ZWwoKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBieXRlW10gcGFyYW0gPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAgY2hlY2tTdGF0dXMoZ2V0UGFyYW1ldGVyKFBBUkFNX1JFVkVSQl9MRVZFTCwgcGFyYW0pKTsKKyAgICAgICAgcmV0dXJuIGJ5dGVBcnJheVRvU2hvcnQocGFyYW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRpbWUgYmV0d2VlbiB0aGUgZmlyc3QgcmVmbGVjdGlvbiBhbmQgdGhlIHJldmVyYmVyYXRpb24uCisgICAgICogQHBhcmFtIHJldmVyYkRlbGF5IFJldmVyYiBkZWxheSBpbiBtaWxsaXNlY29uZHMuIFRoZSB2YWxpZCByYW5nZSBpcyBbMCwgMTAwXS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJldmVyYkRlbGF5KGludCByZXZlcmJEZWxheSkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIHBhcmFtID0gaW50VG9CeXRlQXJyYXkocmV2ZXJiRGVsYXkpOworICAgICAgICBjaGVja1N0YXR1cyhzZXRQYXJhbWV0ZXIoUEFSQU1fUkVWRVJCX0RFTEFZLCBwYXJhbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJldmVyYiBkZWxheS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXZlcmIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXZlcmJEZWxheSgpCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBwYXJhbSA9IG5ldyBieXRlWzRdOworICAgICAgICBjaGVja1N0YXR1cyhnZXRQYXJhbWV0ZXIoUEFSQU1fUkVWRVJCX0RFTEFZLCBwYXJhbSkpOworICAgICAgICByZXR1cm4gYnl0ZUFycmF5VG9JbnQocGFyYW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGVjaG8gZGVuc2l0eSBpbiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIGRlY2F5LgorICAgICAqIDxwPlRoZSBzY2FsZSBzaG91bGQgYXBwcm94aW1hdGVseSBtYXAgbGluZWFybHkgdG8gdGhlIHBlcmNlaXZlZCBjaGFuZ2UgaW4gcmV2ZXJiZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gZGlmZnVzaW9uIERpZmZ1c2lvbiBzcGVjaWZpZWQgdXNpbmcgYSBwZXJtaWxsZSBzY2FsZS4gVGhlIGRpZmZ1c2lvbiB2YWxpZCByYW5nZSBpcworICAgICAqIFswLCAxMDAwXS4gQSB2YWx1ZSBvZiAxMDAwIG8vb28gaW5kaWNhdGVzIGEgc21vb3RoIHJldmVyYmVyYXRpb24gZGVjYXkuCisgICAgICogVmFsdWVzIGJlbG93IHRoaXMgbGV2ZWwgZ2l2ZSBhIG1vcmUgPGk+Z3JhaW55PC9pPiBjaGFyYWN0ZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaWZmdXNpb24oc2hvcnQgZGlmZnVzaW9uKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBieXRlW10gcGFyYW0gPSBzaG9ydFRvQnl0ZUFycmF5KGRpZmZ1c2lvbik7CisgICAgICAgIGNoZWNrU3RhdHVzKHNldFBhcmFtZXRlcihQQVJBTV9ESUZGVVNJT04sIHBhcmFtKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBkaWZmdXNpb24gbGV2ZWwuCisgICAgICogQHJldHVybiB0aGUgZGlmZnVzaW9uIGxldmVsLiBTZWUge0BsaW5rICNzZXREaWZmdXNpb24oc2hvcnQpfSBmb3IgdW5pdHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0RGlmZnVzaW9uKCkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIHBhcmFtID0gbmV3IGJ5dGVbMl07CisgICAgICAgIGNoZWNrU3RhdHVzKGdldFBhcmFtZXRlcihQQVJBTV9ESUZGVVNJT04sIHBhcmFtKSk7CisgICAgICAgIHJldHVybiBieXRlQXJyYXlUb1Nob3J0KHBhcmFtKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIHRoZSBtb2RhbCBkZW5zaXR5IG9mIHRoZSBsYXRlIHJldmVyYmVyYXRpb24gZGVjYXkuCisgICAgICogPHA+IFRoZSBzY2FsZSBzaG91bGQgYXBwcm94aW1hdGVseSBtYXAgbGluZWFybHkgdG8gdGhlIHBlcmNlaXZlZCBjaGFuZ2UgaW4gcmV2ZXJiZXJhdGlvbi4KKyAgICAgKiBBIGxvd2VyIGRlbnNpdHkgY3JlYXRlcyBhIGhvbGxvdyBzb3VuZCB0aGF0IGlzIHVzZWZ1bCBmb3Igc2ltdWxhdGluZyBzbWFsbCByZXZlcmJlcmF0aW9uCisgICAgICogc3BhY2VzIHN1Y2ggYXMgYmF0aHJvb21zLgorICAgICAqIEBwYXJhbSBkZW5zaXR5IERlbnNpdHkgc3BlY2lmaWVkIHVzaW5nIGEgcGVybWlsbGUgc2NhbGUuIFRoZSB2YWxpZCByYW5nZSBpcyBbMCwgMTAwMF0uCisgICAgICogQSB2YWx1ZSBvZiAxMDAwIG8vb28gaW5kaWNhdGVzIGEgbmF0dXJhbCBzb3VuZGluZyByZXZlcmJlcmF0aW9uLiBWYWx1ZXMgYmVsb3cgdGhpcyBsZXZlbAorICAgICAqIHByb2R1Y2UgYSBtb3JlIGNvbG9yZWQgZWZmZWN0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVuc2l0eShzaG9ydCBkZW5zaXR5KQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBieXRlW10gcGFyYW0gPSBzaG9ydFRvQnl0ZUFycmF5KGRlbnNpdHkpOworICAgICAgICBjaGVja1N0YXR1cyhzZXRQYXJhbWV0ZXIoUEFSQU1fREVOU0lUWSwgcGFyYW0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZW5zaXR5IGxldmVsLgorICAgICAqIEByZXR1cm4gdGhlIGRlbnNpdHkgbGV2ZWwuIFNlZSB7QGxpbmsgI3NldERpZmZ1c2lvbihzaG9ydCl9IGZvciB1bml0cy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzaG9ydCBnZXREZW5zaXR5KCkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIHBhcmFtID0gbmV3IGJ5dGVbMl07CisgICAgICAgIGNoZWNrU3RhdHVzKGdldFBhcmFtZXRlcihQQVJBTV9ERU5TSVRZLCBwYXJhbSkpOworICAgICAgICByZXR1cm4gYnl0ZUFycmF5VG9TaG9ydChwYXJhbSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBpbnRlcmZhY2UgZGVmaW5lcyBhIG1ldGhvZCBjYWxsZWQgYnkgdGhlIEVudmlyb25tZW50YWxSZXZlcmIKKyAgICAgKiB3aGVuIGEgcGFyYW1ldGVyIHZhbHVlIGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciAgeworICAgICAgICAvKioKKyAgICAgICAgICogTWV0aG9kIGNhbGxlZCB3aGVuIGEgcGFyYW1ldGVyIHZhbHVlIGhhcyBjaGFuZ2VkLiBUaGUgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IGlmIHRoZQorICAgICAgICAgKiBwYXJhbWV0ZXIgd2FzIGNoYW5nZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbiBoYXZpbmcgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUKKyAgICAgICAgICogRW52aXJvbm1lbnRhbFJldmVyYiBlbmdpbmUuCisgICAgICAgICAqIEBwYXJhbSBlZmZlY3QgdGhlIEVudmlyb25tZW50YWxSZXZlcmIgb24gd2hpY2ggdGhlIGludGVyZmFjZSBpcyByZWdpc3RlcmVkLgorICAgICAgICAgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyBvZiB0aGUgc2V0IHBhcmFtZXRlciBvcGVyYXRpb24uCisgICAgICAgICAvLyBUT0RPIHdoZW4gQXVkaW9FZmZlY3QgaXMgdW5oaWRkZW4KKyAgICAgICAgIC8vIFNlZSB7X2F0X2xpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0VmZmVjdCNzZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pfS4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtIElEIG9mIHRoZSBtb2RpZmllZCBwYXJhbWV0ZXIuIFNlZSB7QGxpbmsgI1BBUkFNX1JPT01fTEVWRUx9IC4uLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uUGFyYW1ldGVyQ2hhbmdlKEVudmlyb25tZW50YWxSZXZlcmIgZWZmZWN0LCBpbnQgc3RhdHVzLCBpbnQgcGFyYW0sIGludCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgdXNlZCBpbnRlcm5hbGx5IHRvIHJlY2VpdmUgdW5mb3JtYXR0ZWQgcGFyYW1ldGVyIGNoYW5nZSBldmVudHMgZnJvbSBBdWRpb0VmZmVjdAorICAgICAqIHN1cGVyIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQmFzZVBhcmFtZXRlckxpc3RlbmVyIGltcGxlbWVudHMgQXVkaW9FZmZlY3QuT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgQmFzZVBhcmFtZXRlckxpc3RlbmVyKCkgeworCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25QYXJhbWV0ZXJDaGFuZ2UoQXVkaW9FZmZlY3QgZWZmZWN0LCBpbnQgc3RhdHVzLCBieXRlW10gcGFyYW0sIGJ5dGVbXSB2YWx1ZSkgeworICAgICAgICAgICAgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBsID0gbnVsbDsKKworICAgICAgICAgICAgc3luY2hyb25pemVkIChtUGFyYW1MaXN0ZW5lckxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAobVBhcmFtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsID0gbVBhcmFtTGlzdGVuZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBwID0gLTE7CisgICAgICAgICAgICAgICAgaW50IHYgPSAtMTsKKworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5sZW5ndGggPT0gNCkgeworICAgICAgICAgICAgICAgICAgICBwID0gYnl0ZUFycmF5VG9JbnQocGFyYW0sIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9IChpbnQpYnl0ZUFycmF5VG9TaG9ydCh2YWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPT0gNCkgeworICAgICAgICAgICAgICAgICAgICB2ID0gYnl0ZUFycmF5VG9JbnQodmFsdWUsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocCAhPSAtMSAmJiB2ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGwub25QYXJhbWV0ZXJDaGFuZ2UoRW52aXJvbm1lbnRhbFJldmVyYi50aGlzLCBzdGF0dXMsIHAsIHYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhbiBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBpbnRlcmZhY2UgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckxpc3RlbmVyKE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUGFyYW1MaXN0ZW5lckxvY2spIHsKKyAgICAgICAgICAgIGlmIChtUGFyYW1MaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBhcmFtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICBtQmFzZVBhcmFtTGlzdGVuZXIgPSBuZXcgQmFzZVBhcmFtZXRlckxpc3RlbmVyKCk7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0UGFyYW1ldGVyTGlzdGVuZXIobUJhc2VQYXJhbUxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9FcXVhbGl6ZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9FcXVhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODJmNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0VxdWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRWZmZWN0OworCisvKioKKyAqIEFuIEVxdWFsaXplciBpcyB1c2VkIHRvIGFsdGVyIHRoZSBmcmVxdWVuY3kgcmVzcG9uc2Ugb2YgYSBwYXJ0aWN1bGFyIG11c2ljIHNvdXJjZSBvciBvZiB0aGUgbWFpbgorICogb3V0cHV0IG1peC4KKyAqIDxwPkFuIGFwcGxpY2F0aW9uIGNyZWF0ZXMgYW4gRXF1YWxpemVyIG9iamVjdCB0byBpbnN0YW50aWF0ZSBhbmQgY29udHJvbCBhbiBFcXVhbGl6ZXIgZW5naW5lCisgKiBpbiB0aGUgYXVkaW8gZnJhbWV3b3JrLiBUaGUgYXBwbGljYXRpb24gY2FuIGVpdGhlciBzaW1wbHkgdXNlIHByZWRlZmluZWQgcHJlc2V0cyBvciBoYXZlIGEgbW9yZQorICogcHJlY2lzZSBjb250cm9sIG9mIHRoZSBnYWluIGluIGVhY2ggZnJlcXVlbmN5IGJhbmQgY29udHJvbGxlZCBieSB0aGUgZXF1YWxpemVyLgorICogPHA+VGhlIG1ldGhvZHMsIHBhcmFtZXRlciB0eXBlcyBhbmQgdW5pdHMgZXhwb3NlZCBieSB0aGUgRXF1YWxpemVyIGltcGxlbWVudGF0aW9uIGFyZSBkaXJlY3RseQorICogbWFwcGluZyB0aG9zZSBkZWZpbmVkIGJ5IHRoZSBPcGVuU0wgRVMgMS4wLjEgU3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy5raHJvbm9zLm9yZy9vcGVuc2xlcy8pCisgKiBmb3IgdGhlIFNMRXF1YWxpemVySXRmIGludGVyZmFjZS4gUGxlYXNlIHJlZmVyIHRvIHRoaXMgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorICogPHA+VG8gYXR0YWNoIHRoZSBFcXVhbGl6ZXIgdG8gYSBwYXJ0aWN1bGFyIEF1ZGlvVHJhY2sgb3IgTWVkaWFQbGF5ZXIsIHNwZWNpZnkgdGhlIGF1ZGlvIHNlc3Npb24KKyAqIElEIG9mIHRoaXMgQXVkaW9UcmFjayBvciBNZWRpYVBsYXllciB3aGVuIGNvbnN0cnVjdGluZyB0aGUgRXF1YWxpemVyLiBJZiB0aGUgYXVkaW8gc2Vzc2lvbiBJRCAwCisgKiBpcyBzcGVjaWZpZWQsIHRoZSBFcXVhbGl6ZXIgYXBwbGllcyB0byB0aGUgbWFpbiBhdWRpbyBvdXRwdXQgbWl4LgorIC8vIFRPRE8gd2hlbiBBdWRpb0VmZmVjdCBpcyB1bmhpZGRlbgorIC8vIDxwPiBTZWUge19hdF9saW5rIGFuZHJvaWQubWVkaWEuQXVkaW9FZmZlY3R9IGNsYXNzIGZvciBtb3JlIGRldGFpbHMgb24gY29udHJvbGxpbmcgYXVkaW8gZWZmZWN0cy4KKyAqCisgKiB7QGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCByZXZpZXd9CisgKi8KKworcHVibGljIGNsYXNzIEVxdWFsaXplciBleHRlbmRzIEF1ZGlvRWZmZWN0IHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiRXF1YWxpemVyIjsKKworICAgIC8vIFRoZXNlIGNvbnN0YW50cyBtdXN0IGJlIHN5bmNocm9uaXplZCB3aXRoIHRob3NlIGluCisgICAgLy8gZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvRWZmZWN0RXF1YWxpemVyQXBpLmgKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgYmFuZHMuIFBhcmFtZXRlciBJRCBmb3Ige0BsaW5rIGFuZHJvaWQubWVkaWEuRXF1YWxpemVyLk9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXJ9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fTlVNX0JBTkRTID0gMDsKKyAgICAvKioKKyAgICAgKiBCYW5kIGxldmVsIHJhbmdlLiBQYXJhbWV0ZXIgSUQgZm9yIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTV9MRVZFTF9SQU5HRSA9IDE7CisgICAgLyoqCisgICAgICogQmFuZCBsZXZlbC4gUGFyYW1ldGVyIElEIGZvciBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fQkFORF9MRVZFTCA9IDI7CisgICAgLyoqCisgICAgICogQmFuZCBjZW50ZXIgZnJlcXVlbmN5LiBQYXJhbWV0ZXIgSUQgZm9yIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTV9DRU5URVJfRlJFUSA9IDM7CisgICAgLyoqCisgICAgICogQmFuZCBmcmVxdWVuY3kgcmFuZ2UuIFBhcmFtZXRlciBJRCBmb3IgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUkFNX0JBTkRfRlJFUV9SQU5HRSA9IDQ7CisgICAgLyoqCisgICAgICogQmFuZCBmb3IgYSBnaXZlbiBmcmVxdWVuY3kuIFBhcmFtZXRlciBJRCBmb3IgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUkFNX0dFVF9CQU5EID0gNTsKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IHByZXNldC4gUGFyYW1ldGVyIElEIGZvciBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fQ1VSUkVOVF9QUkVTRVQgPSA2OworICAgIC8qKgorICAgICAqIFJlcXVlc3QgbnVtYmVyIG9mIHByZXNldHMuIFBhcmFtZXRlciBJRCBmb3IgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUyA9IDc7CisgICAgLyoqCisgICAgICogUmVxdWVzdCBwcmVzZXQgbmFtZS4gUGFyYW1ldGVyIElEIGZvciBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fR0VUX1BSRVNFVF9OQU1FID0gODsKKyAgICAvKioKKyAgICAgKiBtYXhpbXVtIHNpemUgZm9yIHBlcnNldCBuYW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fU1RSSU5HX1NJWkVfTUFYID0gMzI7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgcHJlc2V0cyBpbXBsZW1lbnRlZCBieSBFcXVhbGl6ZXIgZW5naW5lCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbU51bVByZXNldHM7CisgICAgLyoqCisgICAgICogTmFtZXMgb2YgcHJlc2V0cyBpbXBsZW1lbnRlZCBieSBFcXVhbGl6ZXIgZW5naW5lCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtUHJlc2V0TmFtZXM7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcmVkIGxpc3RlbmVyIGZvciBwYXJhbWV0ZXIgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIgbVBhcmFtTGlzdGVuZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgdXNlZCBpbnRlcm5hbGx5IHRvIHRvIHJlY2VpdmUgcmF3IHBhcmFtZXRlciBjaGFuZ2UgZXZlbnQgZnJvbSBBdWRpb0VmZmVjdCBzdXBlciBjbGFzcworICAgICAqLworICAgIHByaXZhdGUgQmFzZVBhcmFtZXRlckxpc3RlbmVyIG1CYXNlUGFyYW1MaXN0ZW5lciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBMb2NrIGZvciBhY2Nlc3MgdG8gbVBhcmFtTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtUGFyYW1MaXN0ZW5lckxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyBjb25zdHJ1Y3Rvci4KKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIHByaW9yaXR5IGxldmVsIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24gZm9yIGNvbnRyb2xsaW5nIHRoZSBFcXVhbGl6ZXIKKyAgICAgKiBlbmdpbmUuIEFzIHRoZSBzYW1lIGVuZ2luZSBjYW4gYmUgc2hhcmVkIGJ5IHNldmVyYWwgYXBwbGljYXRpb25zLCB0aGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMKKyAgICAgKiBob3cgbXVjaCB0aGUgcmVxdWVzdGluZyBhcHBsaWNhdGlvbiBuZWVkcyBjb250cm9sIG9mIGVmZmVjdCBwYXJhbWV0ZXJzLiBUaGUgbm9ybWFsIHByaW9yaXR5CisgICAgICogaXMgMCwgYWJvdmUgbm9ybWFsIGlzIGEgcG9zaXRpdmUgbnVtYmVyLCBiZWxvdyBub3JtYWwgYSBuZWdhdGl2ZSBudW1iZXIuCisgICAgICogQHBhcmFtIGF1ZGlvU2Vzc2lvbiAgU3lzdGVtIHdpZGUgdW5pcXVlIGF1ZGlvIHNlc3Npb24gaWRlbnRpZmllci4gSWYgYXVkaW9TZXNzaW9uCisgICAgICogIGlzIG5vdCAwLCB0aGUgRXF1YWxpemVyIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIE1lZGlhUGxheWVyIG9yIEF1ZGlvVHJhY2sgaW4gdGhlCisgICAgICogIHNhbWUgYXVkaW8gc2Vzc2lvbi4gT3RoZXJ3aXNlLCB0aGUgRXF1YWxpemVyIHdpbGwgYXBwbHkgdG8gdGhlIG91dHB1dCBtaXguCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgRXF1YWxpemVyKGludCBwcmlvcml0eSwgaW50IGF1ZGlvU2Vzc2lvbikKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sCisgICAgICAgICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLCBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoRUZGRUNUX1RZUEVfRVFVQUxJWkVSLCBFRkZFQ1RfVFlQRV9OVUxMLCBwcmlvcml0eSwgYXVkaW9TZXNzaW9uKTsKKworICAgICAgICBtTnVtUHJlc2V0cyA9IChpbnQpZ2V0TnVtYmVyT2ZQcmVzZXRzKCk7CisKKyAgICAgICAgaWYgKG1OdW1QcmVzZXRzICE9IDApIHsKKyAgICAgICAgICAgIG1QcmVzZXROYW1lcyA9IG5ldyBTdHJpbmdbbU51bVByZXNldHNdOworICAgICAgICAgICAgYnl0ZVtdIHZhbHVlID0gbmV3IGJ5dGVbUEFSQU1fU1RSSU5HX1NJWkVfTUFYXTsKKyAgICAgICAgICAgIGludFtdIHBhcmFtID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgIHBhcmFtWzBdID0gUEFSQU1fR0VUX1BSRVNFVF9OQU1FOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtUHJlc2V0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgcGFyYW1bMV0gPSBpOworICAgICAgICAgICAgICAgIGNoZWNrU3RhdHVzKGdldFBhcmFtZXRlcihwYXJhbSwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAodmFsdWVbbGVuZ3RoXSAhPSAwKSBsZW5ndGgrKzsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtUHJlc2V0TmFtZXNbaV0gPSBuZXcgU3RyaW5nKHZhbHVlLCAwLCBsZW5ndGgsICJJU08tODg1OS0xIik7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInByZXNldCAjOiAiK2krIiBuYW1lOiAiK21QcmVzZXROYW1lc1tpXSsiIGxlbmd0aDogIitsZW5ndGgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInByZXNldCBuYW1lIGRlY29kZSBlcnJvciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMgc3VwcG9ydGVkIGJ5IHRoZSBFcXVhbGl6ZXIgZW5naW5lLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBiYW5kcworICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHNob3J0IGdldE51bWJlck9mQmFuZHMoKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMV07CisgICAgICAgIHBhcmFtWzBdID0gUEFSQU1fTlVNX0JBTkRTOworICAgICAgICBzaG9ydFtdIHZhbHVlID0gbmV3IHNob3J0WzFdOworICAgICAgICBjaGVja1N0YXR1cyhnZXRQYXJhbWV0ZXIocGFyYW0sIHZhbHVlKSk7CisgICAgICAgIHJldHVybiB2YWx1ZVswXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsZXZlbCByYW5nZSBmb3IgdXNlIGJ5IHtAbGluayAjc2V0QmFuZExldmVsKGludCxzaG9ydCl9LiBUaGUgbGV2ZWwgaXMgZXhwcmVzc2VkIGluCisgICAgICogbWlsbGlCZWwuCisgICAgICogQHJldHVybiB0aGUgYmFuZCBsZXZlbCByYW5nZSBpbiBhbiBhcnJheSBvZiBzaG9ydCBpbnRlZ2Vycy4gVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIGxvd2VyCisgICAgICogbGltaXQgb2YgdGhlIHJhbmdlLCB0aGUgc2Vjb25kIGVsZW1lbnQgdGhlIHVwcGVyIGxpbWl0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHNob3J0W10gZ2V0QmFuZExldmVsUmFuZ2UoKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMV07CisgICAgICAgIGludFtdIHZhbHVlID0gbmV3IGludFsyXTsKKyAgICAgICAgcGFyYW1bMF0gPSBQQVJBTV9MRVZFTF9SQU5HRTsKKyAgICAgICAgY2hlY2tTdGF0dXMoZ2V0UGFyYW1ldGVyKHBhcmFtLCB2YWx1ZSkpOworCisgICAgICAgIHNob3J0W10gcmVzdWx0ID0gbmV3IHNob3J0WzJdOworCisgICAgICAgIHJlc3VsdFswXSA9IChzaG9ydCl2YWx1ZVswXTsKKyAgICAgICAgcmVzdWx0WzFdID0gKHNob3J0KXZhbHVlWzFdOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZ2l2ZW4gZXF1YWxpemVyIGJhbmQgdG8gdGhlIGdpdmVuIGdhaW4gdmFsdWUuCisgICAgICogQHBhcmFtIGJhbmQgRnJlcXVlbmN5IGJhbmQgdGhhdCB3aWxsIGhhdmUgdGhlIG5ldyBnYWluLiBUaGUgbnVtYmVyaW5nIG9mIHRoZSBiYW5kcyBzdGFydHMKKyAgICAgKiBmcm9tIDAgYW5kIGVuZHMgYXQgKG51bWJlciBvZiBiYW5kcyAtIDEpLiBTZWUgQHNlZSAjZ2V0TnVtYmVyT2ZCYW5kcygpLgorICAgICAqIEBwYXJhbSBsZXZlbCBOZXcgZ2FpbiBpbiBtaWxsaWJlbHMgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZ2l2ZW4gYmFuZC4gZ2V0QmFuZExldmVsUmFuZ2UoKQorICAgICAqIHdpbGwgZGVmaW5lIHRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIHZhbHVlcy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhbmRMZXZlbChpbnQgYmFuZCwgc2hvcnQgbGV2ZWwpCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGludFtdIHBhcmFtID0gbmV3IGludFsyXTsKKyAgICAgICAgaW50W10gdmFsdWUgPSBuZXcgaW50WzFdOworCisgICAgICAgIHBhcmFtWzBdID0gUEFSQU1fQkFORF9MRVZFTDsKKyAgICAgICAgcGFyYW1bMV0gPSBiYW5kOworICAgICAgICB2YWx1ZVswXSA9IChpbnQpbGV2ZWw7CisgICAgICAgIGNoZWNrU3RhdHVzKHNldFBhcmFtZXRlcihwYXJhbSwgdmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBnYWluIHNldCBmb3IgdGhlIGdpdmVuIGVxdWFsaXplciBiYW5kLgorICAgICAqIEBwYXJhbSBiYW5kIEZyZXF1ZW5jeSBiYW5kIHdob3NlIGdhaW4gaXMgcmVxdWVzdGVkLiBUaGUgbnVtYmVyaW5nIG9mIHRoZSBiYW5kcyBzdGFydHMKKyAgICAgKiBmcm9tIDAgYW5kIGVuZHMgYXQgKG51bWJlciBvZiBiYW5kcyAtIDEpLgorICAgICAqIEByZXR1cm4gR2FpbiBpbiBtaWxsaWJlbHMgb2YgdGhlIGdpdmVuIGJhbmQuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0QmFuZExldmVsKGludCBiYW5kKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMl07CisgICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbMV07CisKKyAgICAgICAgcGFyYW1bMF0gPSBQQVJBTV9CQU5EX0xFVkVMOworICAgICAgICBwYXJhbVsxXSA9IGJhbmQ7CisgICAgICAgIGNoZWNrU3RhdHVzKGdldFBhcmFtZXRlcihwYXJhbSwgcmVzdWx0KSk7CisKKyAgICAgICAgcmV0dXJuIChzaG9ydClyZXN1bHRbMF07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBnaXZlbiBiYW5kLgorICAgICAqIEBwYXJhbSBiYW5kIEZyZXF1ZW5jeSBiYW5kIHdob3NlIGNlbnRlciBmcmVxdWVuY3kgaXMgcmVxdWVzdGVkLiBUaGUgbnVtYmVyaW5nIG9mIHRoZSBiYW5kcworICAgICAqIHN0YXJ0cyBmcm9tIDAgYW5kIGVuZHMgYXQgKG51bWJlciBvZiBiYW5kcyAtIDEpLgorICAgICAqIEByZXR1cm4gVGhlIGNlbnRlciBmcmVxdWVuY3kgaW4gbWlsbGlIZXJ0egorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDZW50ZXJGcmVxKGludCBiYW5kKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMl07CisgICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbMV07CisKKyAgICAgICAgcGFyYW1bMF0gPSBQQVJBTV9DRU5URVJfRlJFUTsKKyAgICAgICAgcGFyYW1bMV0gPSBiYW5kOworICAgICAgICBjaGVja1N0YXR1cyhnZXRQYXJhbWV0ZXIocGFyYW0sIHJlc3VsdCkpOworCisgICAgICAgIHJldHVybiByZXN1bHRbMF07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZnJlcXVlbmN5IHJhbmdlIG9mIHRoZSBnaXZlbiBmcmVxdWVuY3kgYmFuZC4KKyAgICAgKiBAcGFyYW0gYmFuZCBGcmVxdWVuY3kgYmFuZCB3aG9zZSBmcmVxdWVuY3kgcmFuZ2UgaXMgcmVxdWVzdGVkLiBUaGUgbnVtYmVyaW5nIG9mIHRoZSBiYW5kcworICAgICAqIHN0YXJ0cyBmcm9tIDAgYW5kIGVuZHMgYXQgKG51bWJlciBvZiBiYW5kcyAtIDEpLgorICAgICAqIEByZXR1cm4gVGhlIGZyZXF1ZW5jeSByYW5nZSBpbiBtaWxsSGVydHogaW4gYW4gYXJyYXkgb2YgaW50ZWdlcnMuIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZQorICAgICAqIGxvd2VyIGxpbWl0IG9mIHRoZSByYW5nZSwgdGhlIHNlY29uZCBlbGVtZW50IHRoZSB1cHBlciBsaW1pdC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBpbnRbXSBnZXRCYW5kRnJlcVJhbmdlKGludCBiYW5kKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMl07CisgICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbMl07CisgICAgICAgIHBhcmFtWzBdID0gUEFSQU1fQkFORF9GUkVRX1JBTkdFOworICAgICAgICBwYXJhbVsxXSA9IGJhbmQ7CisgICAgICAgIGNoZWNrU3RhdHVzKGdldFBhcmFtZXRlcihwYXJhbSwgcmVzdWx0KSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBiYW5kIHRoYXQgaGFzIHRoZSBtb3N0IGVmZmVjdCBvbiB0aGUgZ2l2ZW4gZnJlcXVlbmN5LgorICAgICAqIEBwYXJhbSBmcmVxdWVuY3kgRnJlcXVlbmN5IGluIG1pbGxpSGVydHogd2hpY2ggaXMgdG8gYmUgZXF1YWxpemVkIHZpYSB0aGUgcmV0dXJuZWQgYmFuZC4KKyAgICAgKiBAcmV0dXJuIEZyZXF1ZW5jeSBiYW5kIHRoYXQgaGFzIG1vc3QgZWZmZWN0IG9uIHRoZSBnaXZlbiBmcmVxdWVuY3kuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEJhbmQoaW50IGZyZXF1ZW5jeSkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaW50W10gcGFyYW0gPSBuZXcgaW50WzJdOworICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50WzFdOworCisgICAgICAgIHBhcmFtWzBdID0gUEFSQU1fR0VUX0JBTkQ7CisgICAgICAgIHBhcmFtWzFdID0gZnJlcXVlbmN5OworICAgICAgICBjaGVja1N0YXR1cyhnZXRQYXJhbWV0ZXIocGFyYW0sIHJlc3VsdCkpOworCisgICAgICAgIHJldHVybiByZXN1bHRbMF07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBjdXJyZW50IHByZXNldC4KKyAgICAgKiBAcmV0dXJuIFByZXNldCB0aGF0IGlzIHNldCBhdCB0aGUgbW9tZW50LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHNob3J0IGdldEN1cnJlbnRQcmVzZXQoKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMV07CisgICAgICAgIHBhcmFtWzBdID0gUEFSQU1fQ1VSUkVOVF9QUkVTRVQ7CisgICAgICAgIHNob3J0W10gdmFsdWUgPSBuZXcgc2hvcnRbMV07CisgICAgICAgIGNoZWNrU3RhdHVzKGdldFBhcmFtZXRlcihwYXJhbSwgdmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlWzBdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGVxdWFsaXplciBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHByZXNldC4KKyAgICAgKiBAcGFyYW0gcHJlc2V0IE5ldyBwcmVzZXQgdGhhdCB3aWxsIGJlIHRha2VuIGludG8gdXNlLiBUaGUgdmFsaWQgcmFuZ2UgaXMgWzAsCisgICAgICogbnVtYmVyIG9mIHByZXNldHMtMV0uIFNlZSB7QHNlZSAjZ2V0TnVtYmVyT2ZQcmVzZXRzKCl9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXNlUHJlc2V0KHNob3J0IHByZXNldCkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tTdGF0dXMoc2V0UGFyYW1ldGVyKFBBUkFNX0NVUlJFTlRfUFJFU0VULCBwcmVzZXQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgcHJlc2V0cyB0aGUgZXF1YWxpemVyIHN1cHBvcnRzLiBUaGUgcHJlc2V0cyB3aWxsIGhhdmUgaW5kaWNlcworICAgICAqIFswLCBudW1iZXIgb2YgcHJlc2V0cy0xXS4KKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgcHJlc2V0cyB0aGUgZXF1YWxpemVyIHN1cHBvcnRzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHNob3J0IGdldE51bWJlck9mUHJlc2V0cygpCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGludFtdIHBhcmFtID0gbmV3IGludFsxXTsKKyAgICAgICAgcGFyYW1bMF0gPSBQQVJBTV9HRVRfTlVNX09GX1BSRVNFVFM7CisgICAgICAgIHNob3J0W10gdmFsdWUgPSBuZXcgc2hvcnRbMV07CisgICAgICAgIGNoZWNrU3RhdHVzKGdldFBhcmFtZXRlcihwYXJhbSwgdmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlWzBdOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHByZXNldCBuYW1lIGJhc2VkIG9uIHRoZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gcHJlc2V0IEluZGV4IG9mIHRoZSBwcmVzZXQuIFRoZSB2YWxpZCByYW5nZSBpcyBbMCwgbnVtYmVyIG9mIHByZXNldHMtMV0uCisgICAgICogQHJldHVybiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBwcmVzZXQuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZXNldE5hbWUoc2hvcnQgcHJlc2V0KQorICAgIHsKKyAgICAgICAgaWYgKHByZXNldCA+PSAwICYmIHByZXNldCA8IG1OdW1QcmVzZXRzKSB7CisgICAgICAgICAgICByZXR1cm4gbVByZXNldE5hbWVzW3ByZXNldF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBpbnRlcmZhY2UgZGVmaW5lcyBhIG1ldGhvZCBjYWxsZWQgYnkgdGhlIEVxdWFsaXplciB3aGVuIGEKKyAgICAgKiBwYXJhbWV0ZXIgdmFsdWUgaGFzIGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBNZXRob2QgY2FsbGVkIHdoZW4gYSBwYXJhbWV0ZXIgdmFsdWUgaGFzIGNoYW5nZWQuIFRoZSBtZXRob2QgaXMgY2FsbGVkIG9ubHkgaWYgdGhlCisgICAgICAgICAqIHBhcmFtZXRlciB3YXMgY2hhbmdlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uIGhhdmluZyB0aGUgY29udHJvbCBvZiB0aGUgc2FtZQorICAgICAgICAgKiBFcXVhbGl6ZXIgZW5naW5lLgorICAgICAgICAgKiBAcGFyYW0gZWZmZWN0IHRoZSBFcXVhbGl6ZXIgb24gd2hpY2ggdGhlIGludGVyZmFjZSBpcyByZWdpc3RlcmVkLgorICAgICAgICAgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyBvZiB0aGUgc2V0IHBhcmFtZXRlciBvcGVyYXRpb24uCisgICAgICAgICAvLyBUT0RPIHdoZW4gQXVkaW9FZmZlY3QgaXMgdW5oaWRkZW4KKyAgICAgICAgIC8vIFNlZSB7X2F0X2xpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0VmZmVjdCNzZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pfS4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtMSBJRCBvZiB0aGUgbW9kaWZpZWQgcGFyYW1ldGVyLiBTZWUge0BsaW5rICNQQVJBTV9CQU5EX0xFVkVMfSAuLi4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtMiBhZGRpdGlvbmFsIHBhcmFtZXRlciBxdWFsaWZpZXIgKGUuZyB0aGUgYmFuZCBmb3IgYmFuZCBsZXZlbCBwYXJhbWV0ZXIpLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uUGFyYW1ldGVyQ2hhbmdlKEVxdWFsaXplciBlZmZlY3QsIGludCBzdGF0dXMsIGludCBwYXJhbTEsIGludCBwYXJhbTIsIGludCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgdXNlZCBpbnRlcm5hbGx5IHRvIHJlY2VpdmUgdW5mb3JtYXR0ZWQgcGFyYW1ldGVyIGNoYW5nZSBldmVudHMgZnJvbSBBdWRpb0VmZmVjdAorICAgICAqIHN1cGVyIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQmFzZVBhcmFtZXRlckxpc3RlbmVyIGltcGxlbWVudHMgQXVkaW9FZmZlY3QuT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgQmFzZVBhcmFtZXRlckxpc3RlbmVyKCkgeworCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25QYXJhbWV0ZXJDaGFuZ2UoQXVkaW9FZmZlY3QgZWZmZWN0LCBpbnQgc3RhdHVzLCBieXRlW10gcGFyYW0sIGJ5dGVbXSB2YWx1ZSkgeworICAgICAgICAgICAgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBsID0gbnVsbDsKKworICAgICAgICAgICAgc3luY2hyb25pemVkIChtUGFyYW1MaXN0ZW5lckxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAobVBhcmFtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsID0gbVBhcmFtTGlzdGVuZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBwMSA9IC0xOworICAgICAgICAgICAgICAgIGludCBwMiA9IC0xOworICAgICAgICAgICAgICAgIGludCB2ID0gLTE7CisKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0ubGVuZ3RoID49IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgcDEgPSBieXRlQXJyYXlUb0ludChwYXJhbSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5sZW5ndGggPj0gOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSBieXRlQXJyYXlUb0ludChwYXJhbSwgNCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSAoaW50KWJ5dGVBcnJheVRvU2hvcnQodmFsdWUsIDApOzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBieXRlQXJyYXlUb0ludCh2YWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHAxICE9IC0xICYmIHYgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbC5vblBhcmFtZXRlckNoYW5nZShFcXVhbGl6ZXIudGhpcywgc3RhdHVzLCBwMSwgcDIsIHYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhbiBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBpbnRlcmZhY2UgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckxpc3RlbmVyKE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUGFyYW1MaXN0ZW5lckxvY2spIHsKKyAgICAgICAgICAgIGlmIChtUGFyYW1MaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBhcmFtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICBtQmFzZVBhcmFtTGlzdGVuZXIgPSBuZXcgQmFzZVBhcmFtZXRlckxpc3RlbmVyKCk7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0UGFyYW1ldGVyTGlzdGVuZXIobUJhc2VQYXJhbUxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCmluZGV4IDZlNTI3ZDkuLmEzNDZhZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGUuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuQXVkaW87CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkltYWdlczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuVmlkZW87CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5EZWNvZGVyQ2FwYWJpbGl0aWVzOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuRGVjb2RlckNhcGFiaWxpdGllcy5WaWRlb0RlY29kZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5EZWNvZGVyQ2FwYWJpbGl0aWVzLkF1ZGlvRGVjb2RlcjsKQEAgLTk2LDE1ICs5NywzMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBNZWRpYUZpbGVUeXBlPiBzRmlsZVR5cGVNYXAgCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+IHNGaWxlVHlwZU1hcAogICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNNaW1lVHlwZU1hcCAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOyAgICAgICAgICAgIAorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzTWltZVR5cGVNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgZmlsZSBleHRlbnNpb24gdG8gTVRQIGZvcm1hdCBjb2RlCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNGaWxlVHlwZVRvRm9ybWF0TWFwCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAvLyBtYXBzIG1pbWUgdHlwZSB0byBNVFAgZm9ybWF0IGNvZGUKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc01pbWVUeXBlVG9Gb3JtYXRNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgTVRQIGZvcm1hdCBjb2RlIHRvIG1pbWUgdHlwZQorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiBzRm9ybWF0VG9NaW1lVHlwZU1hcAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisKICAgICBzdGF0aWMgdm9pZCBhZGRGaWxlVHlwZShTdHJpbmcgZXh0ZW5zaW9uLCBpbnQgZmlsZVR5cGUsIFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICBzRmlsZVR5cGVNYXAucHV0KGV4dGVuc2lvbiwgbmV3IE1lZGlhRmlsZVR5cGUoZmlsZVR5cGUsIG1pbWVUeXBlKSk7CiAgICAgICAgIHNNaW1lVHlwZU1hcC5wdXQobWltZVR5cGUsIEludGVnZXIudmFsdWVPZihmaWxlVHlwZSkpOwogICAgIH0KIAorICAgIHN0YXRpYyB2b2lkIGFkZEZpbGVUeXBlKFN0cmluZyBleHRlbnNpb24sIGludCBmaWxlVHlwZSwgU3RyaW5nIG1pbWVUeXBlLCBpbnQgbXRwRm9ybWF0Q29kZSkgeworICAgICAgICBhZGRGaWxlVHlwZShleHRlbnNpb24sIGZpbGVUeXBlLCBtaW1lVHlwZSk7CisgICAgICAgIHNGaWxlVHlwZVRvRm9ybWF0TWFwLnB1dChleHRlbnNpb24sIEludGVnZXIudmFsdWVPZihtdHBGb3JtYXRDb2RlKSk7CisgICAgICAgIHNNaW1lVHlwZVRvRm9ybWF0TWFwLnB1dChtaW1lVHlwZSwgSW50ZWdlci52YWx1ZU9mKG10cEZvcm1hdENvZGUpKTsKKyAgICAgICAgc0Zvcm1hdFRvTWltZVR5cGVNYXAucHV0KG10cEZvcm1hdENvZGUsIG1pbWVUeXBlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV01BRW5hYmxlZCgpIHsKICAgICAgICAgTGlzdDxBdWRpb0RlY29kZXI+IGRlY29kZXJzID0gRGVjb2RlckNhcGFiaWxpdGllcy5nZXRBdWRpb0RlY29kZXJzKCk7CiAgICAgICAgIGZvciAoQXVkaW9EZWNvZGVyIGRlY29kZXI6IGRlY29kZXJzKSB7CkBAIC0xMjYsMTcgKzE0NCwxNyBAQAogICAgIH0KIAogICAgIHN0YXRpYyB7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJNUDMiLCBGSUxFX1RZUEVfTVAzLCAiYXVkaW8vbXBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTTRBIiwgRklMRV9UWVBFX000QSwgImF1ZGlvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiV0FWIiwgRklMRV9UWVBFX1dBViwgImF1ZGlvL3gtd2F2Iik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNUDMiLCBGSUxFX1RZUEVfTVAzLCAiYXVkaW8vbXBlZyIsIE10cC5PYmplY3QuRk9STUFUX01QMyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNNEEiLCBGSUxFX1RZUEVfTTRBLCAiYXVkaW8vbXA0IiwgTXRwLk9iamVjdC5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJXQVYiLCBGSUxFX1RZUEVfV0FWLCAiYXVkaW8veC13YXYiLCBNdHAuT2JqZWN0LkZPUk1BVF9XQVYpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQU1SIiwgRklMRV9UWVBFX0FNUiwgImF1ZGlvL2FtciIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQVdCIiwgRklMRV9UWVBFX0FXQiwgImF1ZGlvL2Ftci13YiIpOwogICAgICAgICBpZiAoaXNXTUFFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTUEiLCBGSUxFX1RZUEVfV01BLCAiYXVkaW8veC1tcy13bWEiKTsKKyAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTUEiLCBGSUxFX1RZUEVfV01BLCAiYXVkaW8veC1tcy13bWEiLCBNdHAuT2JqZWN0LkZPUk1BVF9XTUEpOwogICAgICAgICB9Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJPR0ciLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJPR0EiLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJBQUMiLCBGSUxFX1RZUEVfQUFDLCAiYXVkaW8vYWFjIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJPR0ciLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIiwgTXRwLk9iamVjdC5GT1JNQVRfT0dHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk9HQSIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciLCBNdHAuT2JqZWN0LkZPUk1BVF9PR0cpOworICAgICAgICBhZGRGaWxlVHlwZSgiQUFDIiwgRklMRV9UWVBFX0FBQywgImF1ZGlvL2FhYyIsIE10cC5PYmplY3QuRk9STUFUX0FBQyk7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJNS0EiLCBGSUxFX1RZUEVfTUtBLCAiYXVkaW8veC1tYXRyb3NrYSIpOwogIAogICAgICAgICBhZGRGaWxlVHlwZSgiTUlEIiwgRklMRV9UWVBFX01JRCwgImF1ZGlvL21pZGkiKTsKQEAgLTE0OCwzMiArMTY2LDMyIEBACiAgICAgICAgIGFkZEZpbGVUeXBlKCJSVFgiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiT1RBIiwgRklMRV9UWVBFX01JRCwgImF1ZGlvL21pZGkiKTsKICAgICAgICAgCi0gICAgICAgIGFkZEZpbGVUeXBlKCJNUEVHIiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wZWciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk1QNCIsIEZJTEVfVFlQRV9NUDQsICJ2aWRlby9tcDQiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk00ViIsIEZJTEVfVFlQRV9NNFYsICJ2aWRlby9tcDQiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIjNHUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0cyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk1QRUciLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXBlZyIsIE10cC5PYmplY3QuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiTVA0IiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wNCIsIE10cC5PYmplY3QuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiTTRWIiwgRklMRV9UWVBFX000ViwgInZpZGVvL21wNCIsIE10cC5PYmplY3QuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0dQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIiwgIE10cC5PYmplY3QuRk9STUFUXzNHUF9DT05UQUlORVIpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIsIE10cC5PYmplY3QuRk9STUFUXzNHUF9DT05UQUlORVIpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0cyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiLCBNdHAuT2JqZWN0LkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiLCBNdHAuT2JqZWN0LkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIk1LViIsIEZJTEVfVFlQRV9NS1YsICJ2aWRlby94LW1hdHJvc2thIik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJXRUJNIiwgRklMRV9UWVBFX01LViwgInZpZGVvL3gtbWF0cm9za2EiKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIlRTIiwgRklMRV9UWVBFX01QMlRTLCAidmlkZW8vbXAydHMiKTsKIAogICAgICAgICBpZiAoaXNXTVZFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTVYiLCBGSUxFX1RZUEVfV01WLCAidmlkZW8veC1tcy13bXYiKTsKKyAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTVYiLCBGSUxFX1RZUEVfV01WLCAidmlkZW8veC1tcy13bXYiLCBNdHAuT2JqZWN0LkZPUk1BVF9XTVYpOwogICAgICAgICAgICAgYWRkRmlsZVR5cGUoIkFTRiIsIEZJTEVfVFlQRV9BU0YsICJ2aWRlby94LW1zLWFzZiIpOwogICAgICAgICB9CiAKLSAgICAgICAgYWRkRmlsZVR5cGUoIkpQRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiSlBFRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiR0lGIiwgRklMRV9UWVBFX0dJRiwgImltYWdlL2dpZiIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiUE5HIiwgRklMRV9UWVBFX1BORywgImltYWdlL3BuZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiQk1QIiwgRklMRV9UWVBFX0JNUCwgImltYWdlL3gtbXMtYm1wIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJKUEciLCBGSUxFX1RZUEVfSlBFRywgImltYWdlL2pwZWciLCBNdHAuT2JqZWN0LkZPUk1BVF9FWElGX0pQRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiSlBFRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIsIE10cC5PYmplY3QuRk9STUFUX0VYSUZfSlBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJHSUYiLCBGSUxFX1RZUEVfR0lGLCAiaW1hZ2UvZ2lmIiwgTXRwLk9iamVjdC5GT1JNQVRfR0lGKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBORyIsIEZJTEVfVFlQRV9QTkcsICJpbWFnZS9wbmciLCBNdHAuT2JqZWN0LkZPUk1BVF9QTkcpOworICAgICAgICBhZGRGaWxlVHlwZSgiQk1QIiwgRklMRV9UWVBFX0JNUCwgImltYWdlL3gtbXMtYm1wIiwgTXRwLk9iamVjdC5GT1JNQVRfQk1QKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIldCTVAiLCBGSUxFX1RZUEVfV0JNUCwgImltYWdlL3ZuZC53YXAud2JtcCIpOwogIAotICAgICAgICBhZGRGaWxlVHlwZSgiTTNVIiwgRklMRV9UWVBFX00zVSwgImF1ZGlvL3gtbXBlZ3VybCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiUExTIiwgRklMRV9UWVBFX1BMUywgImF1ZGlvL3gtc2NwbHMiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIldQTCIsIEZJTEVfVFlQRV9XUEwsICJhcHBsaWNhdGlvbi92bmQubXMtd3BsIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNM1UiLCBGSUxFX1RZUEVfTTNVLCAiYXVkaW8veC1tcGVndXJsIiwgTXRwLk9iamVjdC5GT1JNQVRfTTNVX1BMQVlMSVNUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBMUyIsIEZJTEVfVFlQRV9QTFMsICJhdWRpby94LXNjcGxzIiwgTXRwLk9iamVjdC5GT1JNQVRfUExTX1BMQVlMSVNUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIldQTCIsIEZJTEVfVFlQRV9XUEwsICJhcHBsaWNhdGlvbi92bmQubXMtd3BsIiwgTXRwLk9iamVjdC5GT1JNQVRfV1BMX1BMQVlMSVNUKTsKIAogICAgICAgICAvLyBjb21wdXRlIGZpbGUgZXh0ZW5zaW9ucyBsaXN0IGZvciBuYXRpdmUgTWVkaWEgU2Nhbm5lcgogICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMjIyLDQgKzI0MCwyNSBAQAogICAgICAgICByZXR1cm4gKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUuaW50VmFsdWUoKSk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9ybWF0Q29kZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IHNNaW1lVHlwZVRvRm9ybWF0TWFwLmdldChtaW1lVHlwZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBsYXN0RG90ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGxhc3REb3QgPiAwKSB7CisgICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKTsKKyAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSBzRmlsZVR5cGVUb0Zvcm1hdE1hcC5nZXQoZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmludFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE10cC5PYmplY3QuRk9STUFUX1VOREVGSU5FRDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNaW1lVHlwZUZvckZvcm1hdENvZGUoaW50IGZvcm1hdENvZGUpIHsKKyAgICAgICAgcmV0dXJuIHNGb3JtYXRUb01pbWVUeXBlTWFwLmdldChmb3JtYXRDb2RlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEKaW5kZXggMzMzMzI2OC4uN2NiZTQwOSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YQpAQCAtMzA1LDYgKzMwNSw3IEBACiAgICAgcHJpdmF0ZSBVcmkgbUdlbnJlc1VyaTsKICAgICBwcml2YXRlIFVyaSBtUGxheWxpc3RzVXJpOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUHJvY2Vzc1BsYXlsaXN0cywgbVByb2Nlc3NHZW5yZXM7CisgICAgcHJpdmF0ZSBpbnQgbU10cE9iamVjdEhhbmRsZTsKIAogICAgIC8vIHVzZWQgd2hlbiBzY2FubmluZyB0aGUgaW1hZ2UgZGF0YWJhc2Ugc28gd2Uga25vdyB3aGV0aGVyIHdlIGhhdmUgdG8gcHJ1bmUKICAgICAvLyBvbGQgdGh1bWJuYWlsIGZpbGVzCkBAIC02MjUsNiArNjI2LDkgQEAKICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFURV9NT0RJRklFRCwgbUxhc3RNb2RpZmllZCk7CiAgICAgICAgICAgICBtYXAucHV0KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLlNJWkUsIG1GaWxlU2l6ZSk7CiAgICAgICAgICAgICBtYXAucHV0KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLk1JTUVfVFlQRSwgbU1pbWVUeXBlKTsKKyAgICAgICAgICAgIGlmIChtTXRwT2JqZWN0SGFuZGxlICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYXAucHV0KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLk1UUF9PQkpFQ1RfSEFORExFLCBtTXRwT2JqZWN0SGFuZGxlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKE1lZGlhRmlsZS5pc1ZpZGVvRmlsZVR5cGUobUZpbGVUeXBlKSkgewogICAgICAgICAgICAgICAgIG1hcC5wdXQoVmlkZW8uTWVkaWEuQVJUSVNULCAobUFydGlzdCAhPSBudWxsICYmIG1BcnRpc3QubGVuZ3RoKCkgPiAwID8gbUFydGlzdCA6IE1lZGlhU3RvcmUuVU5LTk9XTl9TVFJJTkcpKTsKQEAgLTEyMjcsNiArMTIzMSwxNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIFVyaSBzY2FuTXRwRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIHZvbHVtZU5hbWUsIGludCBvYmplY3RIYW5kbGUsIGludCBmb3JtYXQpIHsKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gTWVkaWFGaWxlLmdldE1pbWVUeXBlRm9yRm9ybWF0Q29kZShmb3JtYXQpOworICAgICAgICBtTXRwT2JqZWN0SGFuZGxlID0gb2JqZWN0SGFuZGxlOworICAgICAgICBVcmkgcmVzdWx0ID0gc2NhblNpbmdsZUZpbGUocGF0aCwgdm9sdW1lTmFtZSwgbWltZVR5cGUpOworICAgICAgICBtTXRwT2JqZWN0SGFuZGxlID0gMDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgZmlsZS9kaXJlY3RvcnkgbmFtZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHJpZ2h0CiAgICAgcHJpdmF0ZSBpbnQgbWF0Y2hQYXRocyhTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgICAgICBpbnQgcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQuamF2YQppbmRleCBhZDY2NDBmLi4wZmU5YmI0IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ2xpZW50LmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhCkBAIC00NCw5ICs0NCwxMiBAQAogICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgbUV2ZW50VGhyZWFkID0gbmV3IE10cEV2ZW50VGhyZWFkKCk7Ci0gICAgICAgIG1FdmVudFRocmVhZC5zdGFydCgpOworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0KCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX3N0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgbmF0aXZlX3N0b3AoKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVPYmplY3QoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKQEAgLTYxLDI0ICs2NCw2IEBACiAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQoZGV2aWNlSUQsIG9iamVjdElEKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIE10cEV2ZW50VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURvbmU7Ci0KLSAgICAgICAgcHVibGljIE10cEV2ZW50VGhyZWFkKCkgewotICAgICAgICAgICAgc3VwZXIoIk10cEV2ZW50VGhyZWFkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJNdHBFdmVudFRocmVhZCBzdGFydGluZyIpOwotICAgICAgICAgICAgd2hpbGUgKCFtRG9uZSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCB3YWl0IGZvciBhbiBldmVudCBmcm9tIGFuIE1UUCBkZXZpY2UKLSAgICAgICAgICAgICAgICBuYXRpdmVfd2FpdF9mb3JfZXZlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5kKFRBRywgIk10cEV2ZW50VGhyZWFkIGV4aXRpbmciKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgewogICAgICAgICAvLyBjYWxsZWQgd2hlbiBhIG5ldyBNVFAgZGV2aWNlIGhhcyBiZWVuIGRpc2NvdmVyZWQKICAgICAgICAgdm9pZCBkZXZpY2VBZGRlZChpbnQgaWQpOwpAQCAtOTksMTQgKzg0LDEzIEBACiAgICAgICAgIG1MaXN0ZW5lci5kZXZpY2VSZW1vdmVkKGlkKTsKICAgICB9CiAKLSAgICBwcml2YXRlIE10cEV2ZW50VGhyZWFkIG1FdmVudFRocmVhZDsKLQogICAgIC8vIHVzZWQgYnkgdGhlIEpOSSBjb2RlCiAgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQ7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZXR1cCgpOwogICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2ZpbmFsaXplKCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfd2FpdF9mb3JfZXZlbnQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9zdGFydCgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3N0b3AoKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9kZWxldGVfb2JqZWN0KGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldF9wYXJlbnQoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg5OTllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLk10cE9iamVjdHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBjbGFzcyBNdHBEYXRhYmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cERhdGFiYXNlIjsKKworICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtTWVkaWFQcm92aWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVm9sdW1lTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFVyaSBtT2JqZWN0c1VyaTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElEX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLl9JRCwgLy8gMAorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFUSF9TSVpFX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEEsIC8vIDEKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5TSVpFLCAvLyAyCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPQkpFQ1RfSU5GT19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5EQVRBLCAvLyAxCisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuRk9STUFULCAvLyAyCisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuUEFSRU5ULCAvLyAzCisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuU0laRSwgLy8gNAorICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEVfTU9ESUZJRUQsIC8vIDUKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9XSEVSRSA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5fSUQgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1dIRVJFID0gTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEEgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfV0hFUkUgPSBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuUEFSRU5UICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0ZPUk1BVF9XSEVSRSA9IFBBUkVOVF9XSEVSRSArICIgQU5EICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuRk9STUFUICsgIj0/IjsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFTY2FubmVyIG1NZWRpYVNjYW5uZXI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBEYXRhYmFzZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyB2b2x1bWVOYW1lKSB7CisgICAgICAgIG5hdGl2ZV9zZXR1cCgpOworCisgICAgICAgIG1NZWRpYVByb3ZpZGVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5hY3F1aXJlUHJvdmlkZXIoIm1lZGlhIik7CisgICAgICAgIG1Wb2x1bWVOYW1lID0gdm9sdW1lTmFtZTsKKyAgICAgICAgbU9iamVjdHNVcmkgPSBNdHBPYmplY3RzLmdldENvbnRlbnRVcmkodm9sdW1lTmFtZSk7CisgICAgICAgIG1NZWRpYVNjYW5uZXIgPSBuZXcgTWVkaWFTY2FubmVyKGNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBiZWdpblNlbmRPYmplY3QoU3RyaW5nIHBhdGgsIGludCBmb3JtYXQsIGludCBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2UsIGxvbmcgc2l6ZSwgbG9uZyBtb2RpZmllZCkgeworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHZhbHVlcy5wdXQoTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEEsIHBhdGgpOworICAgICAgICB2YWx1ZXMucHV0KE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgIHZhbHVlcy5wdXQoTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLlBBUkVOVCwgcGFyZW50KTsKKyAgICAgICAgLy8gc3RvcmFnZSBpcyBpZ25vcmVkIGZvciBub3cKKyAgICAgICAgdmFsdWVzLnB1dChNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuU0laRSwgc2l6ZSk7CisgICAgICAgIHZhbHVlcy5wdXQoTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEVfTU9ESUZJRUQsIG1vZGlmaWVkKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVXJpIHVyaSA9IG1NZWRpYVByb3ZpZGVyLmluc2VydChtT2JqZWN0c1VyaSwgdmFsdWVzKTsKKyAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHVyaS5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gYmVnaW5TZW5kT2JqZWN0IiwgZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kU2VuZE9iamVjdChTdHJpbmcgcGF0aCwgaW50IGhhbmRsZSwgaW50IGZvcm1hdCwgYm9vbGVhbiBzdWNjZWVkZWQpIHsKKyAgICAgICAgaWYgKHN1Y2NlZWRlZCkgeworICAgICAgICAgICAgVXJpIHVyaSA9IG1NZWRpYVNjYW5uZXIuc2Nhbk10cEZpbGUocGF0aCwgbVZvbHVtZU5hbWUsIGhhbmRsZSwgZm9ybWF0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbGV0ZUZpbGUoaGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0T2JqZWN0TGlzdChpbnQgc3RvcmFnZUlELCBpbnQgZm9ybWF0LCBpbnQgcGFyZW50KSB7CisgICAgICAgIC8vIHdlIGNhbiBpZ25vcmUgc3RvcmFnZUlEIHVudGlsIHdlIHN1cHBvcnQgbXVsdGlwbGUgc3RvcmFnZXMKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0TGlzdCBwYXJlbnQ6ICIgKyBwYXJlbnQpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX0ZPUk1BVF9XSEVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCksIEludGVnZXIudG9TdHJpbmcoZm9ybWF0KSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpIH0sIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm51bGwgY3Vyc29yIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY291bnQgPSBjLmdldENvdW50KCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGMubW92ZVRvTmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmV0dXJuaW5nICIgKyByZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0TGlzdCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRPYmplY3RQcm9wZXJ0eShpbnQgaGFuZGxlLCBpbnQgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1tdIG91dEludFZhbHVlLCBjaGFyW10gb3V0U3RyaW5nVmFsdWUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0UHJvcGVydHk6ICIgKyBwcm9wZXJ0eSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBnZXRPYmplY3RJbmZvKGludCBoYW5kbGUsIGludFtdIG91dFN0b3JhZ2VGb3JtYXRQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gb3V0TmFtZSwgbG9uZ1tdIG91dFNpemVNb2RpZmllZCkgeworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RJbmZvOiAiICsgaGFuZGxlKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBPQkpFQ1RfSU5GT19QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX1dIRVJFLCBuZXcgU3RyaW5nW10geyAgSW50ZWdlci50b1N0cmluZyhoYW5kbGUpIH0sIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIG91dFN0b3JhZ2VGb3JtYXRQYXJlbnRbMF0gPSAweDAwMDEwMDAxOworICAgICAgICAgICAgICAgIG91dFN0b3JhZ2VGb3JtYXRQYXJlbnRbMV0gPSBjLmdldEludCgyKTsKKyAgICAgICAgICAgICAgICBvdXRTdG9yYWdlRm9ybWF0UGFyZW50WzJdID0gYy5nZXRJbnQoMyk7CisKKyAgICAgICAgICAgICAgICAvLyBleHRyYWN0IG5hbWUgZnJvbSBwYXRoCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgIGludCBzdGFydCA9IChsYXN0U2xhc2ggPj0gMCA/IGxhc3RTbGFzaCArIDEgOiAwKTsKKyAgICAgICAgICAgICAgICBpbnQgZW5kID0gcGF0aC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gc3RhcnQgKyAyNTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGguZ2V0Q2hhcnMoc3RhcnQsIGVuZCwgb3V0TmFtZSwgMCk7CisgICAgICAgICAgICAgICAgb3V0TmFtZVtlbmQgLSBzdGFydF0gPSAwOworCisgICAgICAgICAgICAgICAgb3V0U2l6ZU1vZGlmaWVkWzBdID0gYy5nZXRMb25nKDQpOworICAgICAgICAgICAgICAgIG91dFNpemVNb2RpZmllZFsxXSA9IGMuZ2V0TG9uZyg1KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXRPYmplY3RQcm9wZXJ0eSIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGdldE9iamVjdEZpbGVQYXRoKGludCBoYW5kbGUsIGNoYXJbXSBvdXRGaWxlUGF0aCwgbG9uZ1tdIG91dEZpbGVMZW5ndGgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0RmlsZVBhdGg6ICIgKyBoYW5kbGUpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIFBBVEhfU0laRV9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX1dIRVJFLCBuZXcgU3RyaW5nW10geyAgSW50ZWdlci50b1N0cmluZyhoYW5kbGUpIH0sIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgcGF0aC5nZXRDaGFycygwLCBwYXRoLmxlbmd0aCgpLCBvdXRGaWxlUGF0aCwgMCk7CisgICAgICAgICAgICAgICAgb3V0RmlsZVBhdGhbcGF0aC5sZW5ndGgoKV0gPSAwOworICAgICAgICAgICAgICAgIG91dEZpbGVMZW5ndGhbMF0gPSBjLmdldExvbmcoMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0RmlsZVBhdGgiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVGaWxlKGludCBoYW5kbGUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGVsZXRlRmlsZTogIiArIGhhbmRsZSk7CisgICAgICAgIFVyaSB1cmkgPSBNdHBPYmplY3RzLmdldENvbnRlbnRVcmkobVZvbHVtZU5hbWUsIGhhbmRsZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKG1NZWRpYVByb3ZpZGVyLmRlbGV0ZSh1cmksIG51bGwsIG51bGwpID09IDEpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGRlbGV0ZUZpbGUiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVzZWQgYnkgdGhlIEpOSSBjb2RlCisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZXR1cCgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2ZpbmFsaXplKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwU2VydmVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwU2VydmVyLmphdmEKaW5kZXggYTlhNTRlNy4uYjA5NDVhNSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIuamF2YQpAQCAtMzAsOCArMzAsOCBAQAogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOwogICAgIH0KIAotICAgIHB1YmxpYyBNdHBTZXJ2ZXIoU3RyaW5nIHN0b3JhZ2VQYXRoLCBTdHJpbmcgZGF0YWJhc2VQYXRoKSB7Ci0gICAgICAgIG5hdGl2ZV9zZXR1cChzdG9yYWdlUGF0aCwgZGF0YWJhc2VQYXRoKTsKKyAgICBwdWJsaWMgTXRwU2VydmVyKE10cERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgc3RvcmFnZVBhdGgpIHsKKyAgICAgICAgbmF0aXZlX3NldHVwKGRhdGFiYXNlLCBzdG9yYWdlUGF0aCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00NywxMSArNDcsMjEgQEAKICAgICAgICAgbmF0aXZlX3N0b3AoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZW5kT2JqZWN0QWRkZWQoaW50IGhhbmRsZSkgeworICAgICAgICBuYXRpdmVfc2VuZF9vYmplY3RfYWRkZWQoaGFuZGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kT2JqZWN0UmVtb3ZlZChpbnQgaGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9zZW5kX29iamVjdF9yZW1vdmVkKGhhbmRsZSk7CisgICAgfQorCiAgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKICAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKIAotICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKFN0cmluZyBzdG9yYWdlUGF0aCwgU3RyaW5nIGRhdGFiYXNlUGF0aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoTXRwRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyBzdG9yYWdlUGF0aCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKICAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zdGFydCgpOwogICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3N0b3AoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZChpbnQgaGFuZGxlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZW5kX29iamVjdF9yZW1vdmVkKGludCBoYW5kbGUpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL1ByZXNldFJldmVyYi5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL1ByZXNldFJldmVyYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYTAxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvUHJlc2V0UmV2ZXJiLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRWZmZWN0OworCisvKioKKyAqIEEgc291bmQgZ2VuZXJhdGVkIHdpdGhpbiBhIHJvb20gdHJhdmVscyBpbiBtYW55IGRpcmVjdGlvbnMuIFRoZSBsaXN0ZW5lciBmaXJzdCBoZWFycyB0aGUKKyAqIGRpcmVjdCBzb3VuZCBmcm9tIHRoZSBzb3VyY2UgaXRzZWxmLiBMYXRlciwgaGUgb3Igc2hlIGhlYXJzIGRpc2NyZXRlIGVjaG9lcyBjYXVzZWQgYnkgc291bmQKKyAqIGJvdW5jaW5nIG9mZiBuZWFyYnkgd2FsbHMsIHRoZSBjZWlsaW5nIGFuZCB0aGUgZmxvb3IuIEFzIHNvdW5kIHdhdmVzIGFycml2ZSBhZnRlcgorICogdW5kZXJnb2luZyBtb3JlIGFuZCBtb3JlIHJlZmxlY3Rpb25zLCBpbmRpdmlkdWFsIHJlZmxlY3Rpb25zIGJlY29tZSBpbmRpc3Rpbmd1aXNoYWJsZSBhbmQKKyAqIHRoZSBsaXN0ZW5lciBoZWFycyBjb250aW51b3VzIHJldmVyYmVyYXRpb24gdGhhdCBkZWNheXMgb3ZlciB0aW1lLgorICogUmV2ZXJiIGlzIHZpdGFsIGZvciBtb2RlbGluZyBhIGxpc3RlbmVyJ3MgZW52aXJvbm1lbnQuIEl0IGNhbiBiZSB1c2VkIGluIG11c2ljIGFwcGxpY2F0aW9ucworICogdG8gc2ltdWxhdGUgbXVzaWMgYmVpbmcgcGxheWVkIGJhY2sgaW4gdmFyaW91cyBlbnZpcm9ubWVudHMsIG9yIGluIGdhbWVzIHRvIGltbWVyc2UgdGhlCisgKiBsaXN0ZW5lciB3aXRoaW4gdGhlIGdhbWUncyBlbnZpcm9ubWVudC4KKyAqIFRoZSBQcmVzZXRSZXZlcmIgY2xhc3MgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgZ2xvYmFsIHJldmVyYiB1c2luZyBhIHJldmVyYiBwcmVzZXQuCisgKiBUaGlzIGlzIHByaW1hcmlseSB1c2VkIGZvciBhZGRpbmcgc29tZSByZXZlcmIgaW4gYSBtdXNpYyBwbGF5YmFjayBjb250ZXh0LiBBcHBsaWNhdGlvbnMKKyAqIHJlcXVpcmluZyBjb250cm9sIG92ZXIgYSBtb3JlIGFkdmFuY2VkIGVudmlyb25tZW50YWwgcmV2ZXJiIGFyZSBhZHZpc2VkIHRvIHVzZSB0aGUKKyAvLyBUT0RPIHdoZW4gRW52aXJvbm1lbnRhbFJldmVyYiBpcyB1bmhpZGRlbgorIC8vIHtfYXRfbGluayBhbmRyb2lkLm1lZGlhLkVudmlyb25tZW50YWxSZXZlcmJ9IGNsYXNzLgorICogPHA+QW4gYXBwbGljYXRpb24gY3JlYXRlcyBhIFByZXNldFJldmVyYiBvYmplY3QgdG8gaW5zdGFudGlhdGUgYW5kIGNvbnRyb2wgYSByZXZlcmIgZW5naW5lIGluIHRoZQorICogYXVkaW8gZnJhbWV3b3JrLgorICogPHA+VGhlIG1ldGhvZHMsIHBhcmFtZXRlciB0eXBlcyBhbmQgdW5pdHMgZXhwb3NlZCBieSB0aGUgUHJlc2V0UmV2ZXJiIGltcGxlbWVudGF0aW9uIGFyZQorICogZGlyZWN0bHkgbWFwcGluZyB0aG9zZSBkZWZpbmVkIGJ5IHRoZSBPcGVuU0wgRVMgMS4wLjEgU3BlY2lmaWNhdGlvbgorICogKGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3BlbnNsZXMvKSBmb3IgdGhlIFNMUHJlc2V0UmV2ZXJiSXRmIGludGVyZmFjZS4KKyAqIFBsZWFzZSByZWZlciB0byB0aGlzIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqIDxwPlRoZSBQcmVzZXRSZXZlcmIgaXMgYW4gb3V0cHV0IG1peCBhdXhpbGlhcnkgZWZmZWN0IGFuZCBzaG91bGQgYmUgY3JlYXRlZCBvbgorICogQXVkaW8gc2Vzc2lvbiAwLiBJbiBvcmRlciBmb3IgYSBNZWRpYVBsYXllciBvciBBdWRpb1RyYWNrIHRvIGJlIGZlZCBpbnRvIHRoaXMgZWZmZWN0LAorICogdGhleSBtdXN0IGJlIGV4cGxpY2l0ZWx5IGF0dGFjaGVkIHRvIGl0IGFuZCBhIHNlbmQgbGV2ZWwgbXVzdCBiZSBzcGVjaWZpZWQuIFVzZSB0aGUgZWZmZWN0IElECisgKiByZXR1cm5lZCBieSBnZXRJZCgpIG1ldGhvZCB0byBkZXNpZ25hdGUgdGhpcyBwYXJ0aWN1bGFyIGVmZmVjdCB3aGVuIGF0dGFjaGluZyBpdCB0byB0aGUKKyAqIE1lZGlhUGxheWVyIG9yIEF1ZGlvVHJhY2suCisgLy8gVE9ETyB3aGVuIEF1ZGlvRWZmZWN0IGlzIHVuaGlkZGVuCisgLy8gPHA+IFNlZSB7X2F0X2xpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0VmZmVjdH0gY2xhc3MgZm9yIG1vcmUgZGV0YWlscyBvbiBjb250cm9sbGluZyBhdWRpbyBlZmZlY3RzLgorICoKKyAqIHtAaGlkZSBQZW5kaW5nIEFQSSBjb3VuY2lsIHJldmlld30KKyAqLworCitwdWJsaWMgY2xhc3MgUHJlc2V0UmV2ZXJiIGV4dGVuZHMgQXVkaW9FZmZlY3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJQcmVzZXRSZXZlcmIiOworCisgICAgLy8gVGhlc2UgY29uc3RhbnRzIG11c3QgYmUgc3luY2hyb25pemVkIHdpdGggdGhvc2UgaW4KKyAgICAvLyBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaAorCisgICAgLyoqCisgICAgICogUHJlc2V0LiBQYXJhbWV0ZXIgSUQgZm9yCisgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuUHJlc2V0UmV2ZXJiLk9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXJ9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fUFJFU0VUID0gMDsKKworICAgIC8qKgorICAgICAqIFJvb20gbGV2ZWwuIFBhcmFtZXRlciBJRCBmb3IKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5QcmVzZXRSZXZlcmIuT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVRfTk9ORSAgICAgICAgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFVF9TTUFMTFJPT00gICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VUX01FRElVTVJPT00gID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVRfTEFSR0VST09NICAgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFVF9NRURJVU1IQUxMICA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VUX0xBUkdFSEFMTCAgID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVRfUExBVEUgICAgICAgPSA2OworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJlZCBsaXN0ZW5lciBmb3IgcGFyYW1ldGVyIGNoYW5nZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyIG1QYXJhbUxpc3RlbmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIExpc3RlbmVyIHVzZWQgaW50ZXJuYWxseSB0byB0byByZWNlaXZlIHJhdyBwYXJhbWV0ZXIgY2hhbmdlIGV2ZW50IGZyb20gQXVkaW9FZmZlY3Qgc3VwZXIgY2xhc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIEJhc2VQYXJhbWV0ZXJMaXN0ZW5lciBtQmFzZVBhcmFtTGlzdGVuZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogTG9jayBmb3IgYWNjZXNzIHRvIG1QYXJhbUxpc3RlbmVyCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVBhcmFtTGlzdGVuZXJMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogQ2xhc3MgY29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIHByaW9yaXR5IHRoZSBwcmlvcml0eSBsZXZlbCByZXF1ZXN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGZvciBjb250cm9sbGluZyB0aGUKKyAgICAgKiBQcmVzZXRSZXZlcmIgZW5naW5lLiBBcyB0aGUgc2FtZSBlbmdpbmUgY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsIGFwcGxpY2F0aW9ucywgdGhpcworICAgICAqIHBhcmFtZXRlciBpbmRpY2F0ZXMgaG93IG11Y2ggdGhlIHJlcXVlc3RpbmcgYXBwbGljYXRpb24gbmVlZHMgY29udHJvbCBvZiBlZmZlY3QgcGFyYW1ldGVycy4KKyAgICAgKiBUaGUgbm9ybWFsIHByaW9yaXR5IGlzIDAsIGFib3ZlIG5vcm1hbCBpcyBhIHBvc2l0aXZlIG51bWJlciwgYmVsb3cgbm9ybWFsIGEgbmVnYXRpdmUgbnVtYmVyLgorICAgICAqIEBwYXJhbSBhdWRpb1Nlc3Npb24gIFN5c3RlbSB3aWRlIHVuaXF1ZSBhdWRpbyBzZXNzaW9uIGlkZW50aWZpZXIuIElmIGF1ZGlvU2Vzc2lvbgorICAgICAqICBpcyBub3QgMCwgdGhlIFByZXNldFJldmVyYiB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBNZWRpYVBsYXllciBvciBBdWRpb1RyYWNrIGluIHRoZQorICAgICAqICBzYW1lIGF1ZGlvIHNlc3Npb24uIE90aGVyd2lzZSwgdGhlIFByZXNldFJldmVyYiB3aWxsIGFwcGx5IHRvIHRoZSBvdXRwdXQgbWl4LgorICAgICAqICBBcyB0aGUgUHJlc2V0UmV2ZXJiIGlzIGFuIGF1eGlsaWFyeSBlZmZlY3QgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFudGlhdGUgaXQgb24KKyAgICAgKiAgYXVkaW8gc2Vzc2lvbiAwIGFuZCB0byBhdHRhY2ggaXQgdG8gdGhlIE1lZGlhUExheWVyIGF1eGlsaWFyeSBvdXRwdXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlc2V0UmV2ZXJiKGludCBwcmlvcml0eSwgaW50IGF1ZGlvU2Vzc2lvbikKKyAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKEVGRkVDVF9UWVBFX1BSRVNFVF9SRVZFUkIsIEVGRkVDVF9UWVBFX05VTEwsIHByaW9yaXR5LCBhdWRpb1Nlc3Npb24pOworICAgICAgICBMb2cuZShUQUcsICJjb250cnVjdG9yIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogIEVuYWJsZXMgYSBwcmVzZXQgb24gdGhlIHJldmVyYi4KKyAgICAgKiAgPHA+VGhlIHJldmVyYiBQUkVTRVRfTk9ORSBkaXNhYmxlcyBhbnkgcmV2ZXJiIGZyb20gdGhlIGN1cnJlbnQgb3V0cHV0IGJ1dCBkb2VzIG5vdCBmcmVlIHRoZQorICAgICAqICByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXZlcmIuIEZvciBhbiBhcHBsaWNhdGlvbiB0byBzaWduYWwgdG8gdGhlIGltcGxlbWVudGF0aW9uCisgICAgICogIHRvIGZyZWUgdGhlIHJlc291cmNlcywgaXQgbXVzdCBjYWxsIHRoZSByZWxlYXNlKCkgbWV0aG9kLgorICAgICAqIEBwYXJhbSBwcmVzZXQgVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUgdGhlIHByZXNldCBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLgorICAgICAqIGUuZy4ge0BsaW5rICNQUkVTRVRfU01BTExST09NfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlc2V0KHNob3J0IHByZXNldCkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tTdGF0dXMoc2V0UGFyYW1ldGVyKFBBUkFNX1BSRVNFVCwgcHJlc2V0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBjdXJyZW50IHJldmVyYiBwcmVzZXQuCisgICAgICogQHJldHVybiBQcmVzZXQgdGhhdCBpcyBzZXQgYXQgdGhlIG1vbWVudC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzaG9ydCBnZXRQcmVzZXQoKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBpbnRbXSBwYXJhbSA9IG5ldyBpbnRbMV07CisgICAgICAgIHBhcmFtWzBdID0gUEFSQU1fUFJFU0VUOworICAgICAgICBzaG9ydFtdIHZhbHVlID0gbmV3IHNob3J0WzFdOworICAgICAgICBjaGVja1N0YXR1cyhnZXRQYXJhbWV0ZXIocGFyYW0sIHZhbHVlKSk7CisgICAgICAgIHJldHVybiB2YWx1ZVswXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBpbnRlcmZhY2UgZGVmaW5lcyBhIG1ldGhvZCBjYWxsZWQgYnkgdGhlIFByZXNldFJldmVyYgorICAgICAqIHdoZW4gYSBwYXJhbWV0ZXIgdmFsdWUgaGFzIGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBNZXRob2QgY2FsbGVkIHdoZW4gYSBwYXJhbWV0ZXIgdmFsdWUgaGFzIGNoYW5nZWQuIFRoZSBtZXRob2QgaXMgY2FsbGVkIG9ubHkgaWYgdGhlCisgICAgICAgICAqIHBhcmFtZXRlciB3YXMgY2hhbmdlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uIGhhdmluZyB0aGUgY29udHJvbCBvZiB0aGUgc2FtZQorICAgICAgICAgKiBQcmVzZXRSZXZlcmIgZW5naW5lLgorICAgICAgICAgKiBAcGFyYW0gZWZmZWN0IHRoZSBQcmVzZXRSZXZlcmIgb24gd2hpY2ggdGhlIGludGVyZmFjZSBpcyByZWdpc3RlcmVkLgorICAgICAgICAgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyBvZiB0aGUgc2V0IHBhcmFtZXRlciBvcGVyYXRpb24uCisgICAgICAgICAvLyBUT0RPIHdoZW4gQXVkaW9FZmZlY3QgaXMgdW5oaWRkZW4KKyAgICAgICAgIC8vIFNlZSB7X2F0X2xpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0VmZmVjdCNzZXRQYXJhbWV0ZXIoYnl0ZVtdLCBieXRlW10pfS4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtIElEIG9mIHRoZSBtb2RpZmllZCBwYXJhbWV0ZXIuIFNlZSB7QGxpbmsgI1BBUkFNX1BSRVNFVH0gLi4uCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25QYXJhbWV0ZXJDaGFuZ2UoUHJlc2V0UmV2ZXJiIGVmZmVjdCwgaW50IHN0YXR1cywgaW50IHBhcmFtLCBzaG9ydCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgdXNlZCBpbnRlcm5hbGx5IHRvIHJlY2VpdmUgdW5mb3JtYXR0ZWQgcGFyYW1ldGVyIGNoYW5nZSBldmVudHMgZnJvbSBBdWRpb0VmZmVjdAorICAgICAqIHN1cGVyIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQmFzZVBhcmFtZXRlckxpc3RlbmVyIGltcGxlbWVudHMgQXVkaW9FZmZlY3QuT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgQmFzZVBhcmFtZXRlckxpc3RlbmVyKCkgeworCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25QYXJhbWV0ZXJDaGFuZ2UoQXVkaW9FZmZlY3QgZWZmZWN0LCBpbnQgc3RhdHVzLCBieXRlW10gcGFyYW0sIGJ5dGVbXSB2YWx1ZSkgeworICAgICAgICAgICAgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBsID0gbnVsbDsKKworICAgICAgICAgICAgc3luY2hyb25pemVkIChtUGFyYW1MaXN0ZW5lckxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAobVBhcmFtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsID0gbVBhcmFtTGlzdGVuZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBwID0gLTE7CisgICAgICAgICAgICAgICAgc2hvcnQgdiA9IC0xOworCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLmxlbmd0aCA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgIHAgPSBieXRlQXJyYXlUb0ludChwYXJhbSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMikgeworICAgICAgICAgICAgICAgICAgICB2ID0gYnl0ZUFycmF5VG9TaG9ydCh2YWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwICE9IC0xICYmIHYgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbC5vblBhcmFtZXRlckNoYW5nZShQcmVzZXRSZXZlcmIudGhpcywgc3RhdHVzLCBwLCB2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYW4gT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBpbnRlcmZhY2UuCisgICAgICogQHBhcmFtIGxpc3RlbmVyIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIgaW50ZXJmYWNlIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJMaXN0ZW5lcihPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmFtTGlzdGVuZXJMb2NrKSB7CisgICAgICAgICAgICBpZiAobVBhcmFtTGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QYXJhbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICAgICAgbUJhc2VQYXJhbUxpc3RlbmVyID0gbmV3IEJhc2VQYXJhbWV0ZXJMaXN0ZW5lcigpOworICAgICAgICAgICAgICAgIHN1cGVyLnNldFBhcmFtZXRlckxpc3RlbmVyKG1CYXNlUGFyYW1MaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvVmlydHVhbGl6ZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9WaXJ0dWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzEyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvVmlydHVhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0VmZmVjdDsKKworLyoqCisgKiBBbiBhdWRpbyB2aXJ0dWFsaXplciBpcyBhIGdlbmVyYWwgbmFtZSBmb3IgYW4gZWZmZWN0IHRvIHNwYXRpYWxpemUgYXVkaW8gY2hhbm5lbHMuIFRoZSBleGFjdAorICogYmVoYXZpb3Igb2YgdGhpcyBlZmZlY3QgaXMgZGVwZW5kZW50IG9uIHRoZSBudW1iZXIgb2YgYXVkaW8gaW5wdXQgY2hhbm5lbHMgYW5kIHRoZSB0eXBlcyBhbmQKKyAqIG51bWJlciBvZiBhdWRpbyBvdXRwdXQgY2hhbm5lbHMgb2YgdGhlIGRldmljZS4gRm9yIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIGEgc3RlcmVvIGlucHV0IGFuZAorICogc3RlcmVvIGhlYWRwaG9uZSBvdXRwdXQsIGEgc3RlcmVvIHdpZGVuaW5nIGVmZmVjdCBpcyB1c2VkIHdoZW4gdGhpcyBlZmZlY3QgaXMgdHVybmVkIG9uLgorICogPHA+QW4gYXBwbGljYXRpb24gY3JlYXRlcyBhIFZpcnR1YWxpemVyIG9iamVjdCB0byBpbnN0YW50aWF0ZSBhbmQgY29udHJvbCBhIHZpcnR1YWxpemVyIGVuZ2luZQorICogaW4gdGhlIGF1ZGlvIGZyYW1ld29yay4KKyAqIDxwPlRoZSBtZXRob2RzLCBwYXJhbWV0ZXIgdHlwZXMgYW5kIHVuaXRzIGV4cG9zZWQgYnkgdGhlIFZpcnR1YWxpemVyIGltcGxlbWVudGF0aW9uIGFyZSBkaXJlY3RseQorICogbWFwcGluZyB0aG9zZSBkZWZpbmVkIGJ5IHRoZSBPcGVuU0wgRVMgMS4wLjEgU3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy5raHJvbm9zLm9yZy9vcGVuc2xlcy8pCisgKiBmb3IgdGhlIFNMVmlydHVhbGl6ZXJJdGYgaW50ZXJmYWNlLiBQbGVhc2UgcmVmZXIgdG8gdGhpcyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuCisgKiA8cD5UbyBhdHRhY2ggdGhlIFZpcnR1YWxpemVyIHRvIGEgcGFydGljdWxhciBBdWRpb1RyYWNrIG9yIE1lZGlhUGxheWVyLCBzcGVjaWZ5IHRoZSBhdWRpbyBzZXNzaW9uCisgKiBJRCBvZiB0aGlzIEF1ZGlvVHJhY2sgb3IgTWVkaWFQbGF5ZXIgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIFZpcnR1YWxpemVyLiBJZiB0aGUgYXVkaW8gc2Vzc2lvbiBJRCAwCisgKiBpcyBzcGVjaWZpZWQsIHRoZSBWaXJ0dWFsaXplciBhcHBsaWVzIHRvIHRoZSBtYWluIGF1ZGlvIG91dHB1dCBtaXguCisgLy8gVE9ETyB3aGVuIEF1ZGlvRWZmZWN0IGlzIHVuaGlkZGVuCisgLy8gPHA+IFNlZSB7X2F0X2xpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0VmZmVjdH0gY2xhc3MgZm9yIG1vcmUgZGV0YWlscyBvbiBjb250cm9sbGluZyBhdWRpbyBlZmZlY3RzLgorICoKKyAqIHtAaGlkZSBQZW5kaW5nIEFQSSBjb3VuY2lsIHJldmlld30KKyAqLworCitwdWJsaWMgY2xhc3MgVmlydHVhbGl6ZXIgZXh0ZW5kcyBBdWRpb0VmZmVjdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlZpcnR1YWxpemVyIjsKKworICAgIC8vIFRoZXNlIGNvbnN0YW50cyBtdXN0IGJlIHN5bmNocm9uaXplZCB3aXRoIHRob3NlIGluIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL0VmZmVjdFZpcnR1YWxpemVyQXBpLmgKKyAgICAvKioKKyAgICAgKiBJcyBzdHJlbmd0aCBwYXJhbWV0ZXIgc3VwcG9ydGVkIGJ5IHZpcnR1YWxpemVyIGVuZ2luZS4gUGFyYW1ldGVyIElEIGZvciBnZXRQYXJhbWV0ZXIoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgPSAwOworICAgIC8qKgorICAgICAqIFZpcnR1YWxpemVyIGVmZmVjdCBzdHJlbmd0aC4gUGFyYW1ldGVyIElEIGZvcgorICAgICAqIHtAbGluayBhbmRyb2lkLm1lZGlhLlZpcnR1YWxpemVyLk9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXJ9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1fU1RSRU5HVEggPSAxOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHN0cmVuZ3RoIHBhcmFtZXRlciBpcyBzdXBwb3J0ZWQgYnkgdGhlIHZpcnR1YWxpemVyIGVuZ2luZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RyZW5ndGhTdXBwb3J0ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyZWQgbGlzdGVuZXIgZm9yIHBhcmFtZXRlciBjaGFuZ2VzLgorICAgICAqLworICAgIHByaXZhdGUgT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBtUGFyYW1MaXN0ZW5lciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5lciB1c2VkIGludGVybmFsbHkgdG8gdG8gcmVjZWl2ZSByYXcgcGFyYW1ldGVyIGNoYW5nZSBldmVudCBmcm9tIEF1ZGlvRWZmZWN0IHN1cGVyIGNsYXNzCisgICAgICovCisgICAgcHJpdmF0ZSBCYXNlUGFyYW1ldGVyTGlzdGVuZXIgbUJhc2VQYXJhbUxpc3RlbmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIExvY2sgZm9yIGFjY2VzcyB0byBtUGFyYW1MaXN0ZW5lcgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1QYXJhbUxpc3RlbmVyTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIC8qKgorICAgICAqIENsYXNzIGNvbnN0cnVjdG9yLgorICAgICAqIEBwYXJhbSBwcmlvcml0eSB0aGUgcHJpb3JpdHkgbGV2ZWwgcmVxdWVzdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBmb3IgY29udHJvbGxpbmcgdGhlIFZpcnR1YWxpemVyCisgICAgICogZW5naW5lLiBBcyB0aGUgc2FtZSBlbmdpbmUgY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsIGFwcGxpY2F0aW9ucywgdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzCisgICAgICogaG93IG11Y2ggdGhlIHJlcXVlc3RpbmcgYXBwbGljYXRpb24gbmVlZHMgY29udHJvbCBvZiBlZmZlY3QgcGFyYW1ldGVycy4gVGhlIG5vcm1hbCBwcmlvcml0eQorICAgICAqIGlzIDAsIGFib3ZlIG5vcm1hbCBpcyBhIHBvc2l0aXZlIG51bWJlciwgYmVsb3cgbm9ybWFsIGEgbmVnYXRpdmUgbnVtYmVyLgorICAgICAqIEBwYXJhbSBhdWRpb1Nlc3Npb24gIFN5c3RlbSB3aWRlIHVuaXF1ZSBhdWRpbyBzZXNzaW9uIGlkZW50aWZpZXIuIElmIGF1ZGlvU2Vzc2lvbgorICAgICAqICBpcyBub3QgMCwgdGhlIFZpcnR1YWxpemVyIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIE1lZGlhUGxheWVyIG9yIEF1ZGlvVHJhY2sgaW4gdGhlCisgICAgICogIHNhbWUgYXVkaW8gc2Vzc2lvbi4gT3RoZXJ3aXNlLCB0aGUgVmlydHVhbGl6ZXIgd2lsbCBhcHBseSB0byB0aGUgb3V0cHV0IG1peC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBWaXJ0dWFsaXplcihpbnQgcHJpb3JpdHksIGludCBhdWRpb1Nlc3Npb24pCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLAorICAgICAgICAgICBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKEVGRkVDVF9UWVBFX1ZJUlRVQUxJWkVSLCBFRkZFQ1RfVFlQRV9OVUxMLCBwcmlvcml0eSwgYXVkaW9TZXNzaW9uKTsKKworICAgICAgICBzaG9ydFtdIHZhbHVlID0gbmV3IHNob3J0WzFdOworICAgICAgICBjaGVja1N0YXR1cyhnZXRQYXJhbWV0ZXIoUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVELCB2YWx1ZSkpOworICAgICAgICBtU3RyZW5ndGhTdXBwb3J0ZWQgPSAodmFsdWVbMF0gIT0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgc2V0dGluZyBzdHJlbmd0aCBpcyBzdXBwb3J0ZWQuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsIG9ubHkgb25lCisgICAgICogc3RyZW5ndGggaXMgc3VwcG9ydGVkIGFuZCB0aGUgc2V0U3RyZW5ndGgoKSBtZXRob2QgYWx3YXlzIHJvdW5kcyB0byB0aGF0IHZhbHVlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpcyBzdHJlbmd0aCBwYXJhbWV0ZXIgaXMgc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTdHJlbmd0aFN1cHBvcnRlZCgpIHsKKyAgICAgICByZXR1cm4gbVN0cmVuZ3RoU3VwcG9ydGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHN0cmVuZ3RoIG9mIHRoZSB2aXJ0dWFsaXplciBlZmZlY3QuIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHBlciBtaWxsZQorICAgICAqIGFjY3VyYWN5IGZvciBzZXR0aW5nIHRoZSBzdHJlbmd0aCwgaXQgaXMgYWxsb3dlZCB0byByb3VuZCB0aGUgZ2l2ZW4gc3RyZW5ndGggdG8gdGhlIG5lYXJlc3QKKyAgICAgKiBzdXBwb3J0ZWQgdmFsdWUuIFlvdSBjYW4gdXNlIHRoZSB7QGxpbmsgI2dldFJvdW5kZWRTdHJlbmd0aCgpfSBtZXRob2QgdG8gcXVlcnkgdGhlCisgICAgICogKHBvc3NpYmx5IHJvdW5kZWQpIHZhbHVlIHRoYXQgd2FzIGFjdHVhbGx5IHNldC4KKyAgICAgKiBAcGFyYW0gc3RyZW5ndGggU3RyZW5ndGggb2YgdGhlIGVmZmVjdC4gVGhlIHZhbGlkIHJhbmdlIGZvciBzdHJlbmd0aCBzdHJlbmd0aCBpcyBbMCwgMTAwMF0sCisgICAgICogd2hlcmUgMCBwZXIgbWlsbGUgZGVzaWduYXRlcyB0aGUgbWlsZGVzdCBlZmZlY3QgYW5kIDEwMDAgcGVyIG1pbGxlIGRlc2lnbmF0ZXMgdGhlIHN0cm9uZ2VzdC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmVuZ3RoKHNob3J0IHN0cmVuZ3RoKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBjaGVja1N0YXR1cyhzZXRQYXJhbWV0ZXIoUEFSQU1fU1RSRU5HVEgsIHN0cmVuZ3RoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBzdHJlbmd0aCBvZiB0aGUgZWZmZWN0LgorICAgICAqIEByZXR1cm4gVGhlIHN0cmVuZ3RoIG9mIHRoZSBlZmZlY3QuIFRoZSB2YWxpZCByYW5nZSBmb3Igc3RyZW5ndGggaXMgWzAsIDEwMDBdLCB3aGVyZSAwIHBlcgorICAgICAqIG1pbGxlIGRlc2lnbmF0ZXMgdGhlIG1pbGRlc3QgZWZmZWN0IGFuZCAxMDAwIHBlciBtaWxsZSB0aGUgc3Ryb25nZXN0CisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0Um91bmRlZFN0cmVuZ3RoKCkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgc2hvcnRbXSB2YWx1ZSA9IG5ldyBzaG9ydFsxXTsKKyAgICAgICAgY2hlY2tTdGF0dXMoZ2V0UGFyYW1ldGVyKFBBUkFNX1NUUkVOR1RILCB2YWx1ZSkpOworICAgICAgICByZXR1cm4gdmFsdWVbMF07CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIgaW50ZXJmYWNlIGRlZmluZXMgYSBtZXRob2QgY2FsbGVkIGJ5IHRoZSBWaXJ0dWFsaXplciB3aGVuIGEKKyAgICAgKiBwYXJhbWV0ZXIgdmFsdWUgaGFzIGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBNZXRob2QgY2FsbGVkIHdoZW4gYSBwYXJhbWV0ZXIgdmFsdWUgaGFzIGNoYW5nZWQuIFRoZSBtZXRob2QgaXMgY2FsbGVkIG9ubHkgaWYgdGhlCisgICAgICAgICAqIHBhcmFtZXRlciB3YXMgY2hhbmdlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uIGhhdmluZyB0aGUgY29udHJvbCBvZiB0aGUgc2FtZQorICAgICAgICAgKiBWaXJ0dWFsaXplciBlbmdpbmUuCisgICAgICAgICAqIEBwYXJhbSBlZmZlY3QgdGhlIFZpcnR1YWxpemVyIG9uIHdoaWNoIHRoZSBpbnRlcmZhY2UgaXMgcmVnaXN0ZXJlZC4KKyAgICAgICAgICogQHBhcmFtIHN0YXR1cyBzdGF0dXMgb2YgdGhlIHNldCBwYXJhbWV0ZXIgb3BlcmF0aW9uLgorICAgICAgICAgLy8gVE9ETyB3aGVuIEF1ZGlvRWZmZWN0IGlzIHVuaGlkZGVuCisgICAgICAgICAvLyBTZWUge19hdF9saW5rIGFuZHJvaWQubWVkaWEuQXVkaW9FZmZlY3Qjc2V0UGFyYW1ldGVyKGJ5dGVbXSwgYnl0ZVtdKX0uCisgICAgICAgICAqIEBwYXJhbSBwYXJhbSBJRCBvZiB0aGUgbW9kaWZpZWQgcGFyYW1ldGVyLiBTZWUge0BsaW5rICNQQVJBTV9TVFJFTkdUSH0gLi4uCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25QYXJhbWV0ZXJDaGFuZ2UoVmlydHVhbGl6ZXIgZWZmZWN0LCBpbnQgc3RhdHVzLCBpbnQgcGFyYW0sIHNob3J0IHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5lciB1c2VkIGludGVybmFsbHkgdG8gcmVjZWl2ZSB1bmZvcm1hdHRlZCBwYXJhbWV0ZXIgY2hhbmdlIGV2ZW50cyBmcm9tIEF1ZGlvRWZmZWN0CisgICAgICogc3VwZXIgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBCYXNlUGFyYW1ldGVyTGlzdGVuZXIgaW1wbGVtZW50cyBBdWRpb0VmZmVjdC5PblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBCYXNlUGFyYW1ldGVyTGlzdGVuZXIoKSB7CisKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvblBhcmFtZXRlckNoYW5nZShBdWRpb0VmZmVjdCBlZmZlY3QsIGludCBzdGF0dXMsIGJ5dGVbXSBwYXJhbSwgYnl0ZVtdIHZhbHVlKSB7CisgICAgICAgICAgICBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyIGwgPSBudWxsOworCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYXJhbUxpc3RlbmVyTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChtUGFyYW1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGwgPSBtUGFyYW1MaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IHAgPSAtMTsKKyAgICAgICAgICAgICAgICBzaG9ydCB2ID0gLTE7CisKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0ubGVuZ3RoID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGJ5dGVBcnJheVRvSW50KHBhcmFtLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBieXRlQXJyYXlUb1Nob3J0KHZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gLTEgJiYgdiAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBsLm9uUGFyYW1ldGVyQ2hhbmdlKFZpcnR1YWxpemVyLnRoaXMsIHN0YXR1cywgcCwgdik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGFuIE9uUGFyYW1ldGVyQ2hhbmdlTGlzdGVuZXIgaW50ZXJmYWNlLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBPblBhcmFtZXRlckNoYW5nZUxpc3RlbmVyIGludGVyZmFjZSByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyTGlzdGVuZXIoT25QYXJhbWV0ZXJDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYXJhbUxpc3RlbmVyTG9jaykgeworICAgICAgICAgICAgaWYgKG1QYXJhbUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUGFyYW1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgICAgIG1CYXNlUGFyYW1MaXN0ZW5lciA9IG5ldyBCYXNlUGFyYW1ldGVyTGlzdGVuZXIoKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXJMaXN0ZW5lcihtQmFzZVBhcmFtTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL1Zpc3VhbGl6ZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9WaXN1YWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2RkM2NkZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9WaXN1YWxpemVyLmphdmEKQEAgLTAsMCArMSw1MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CisKKy8qKgorICogVGhlIFZpc3VhbGl6ZXIgY2xhc3MgZW5hYmxlcyBhcHBsaWNhdGlvbiB0byByZXRyaWV2ZSBwYXJ0IG9mIHRoZSBjdXJyZW50bHkgcGxheWluZyBhdWRpbyBmb3IKKyAqIHZpc3VhbGl6YXRpb24gcHVycG9zZS4gSXQgaXMgbm90IGFuIGF1ZGlvIHJlY29yZGluZyBpbnRlcmZhY2UgYW5kIG9ubHkgcmV0dXJucyBwYXJ0aWFsIGFuZCBsb3cKKyAqIHF1YWxpdHkgYXVkaW8gY29udGVudC4gSG93ZXZlciwgdG8gcHJvdGVjdCBwcml2YWN5IG9mIGNlcnRhaW4gYXVkaW8gZGF0YSAoZS5nIHZvaWNlIG1haWwpIHRoZSB1c2UKKyAqIG9mIHRoZSB2aXN1YWxpemVyIHJlcXVpcmVzIHRoZSBwZXJtaXNzaW9uIGFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8uCisgKiA8cD5UaGUgYXVkaW8gc2Vzc2lvbiBJRCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGluZGljYXRlcyB3aGljaCBhdWRpbyBjb250ZW50IHNob3VsZCBiZQorICogdmlzdWFsaXplZDo8YnI+CisgKiA8dWw+CisgKiAgIDxsaT5JZiB0aGUgc2Vzc2lvbiBpcyAwLCB0aGUgYXVkaW8gb3V0cHV0IG1peCBpcyB2aXN1YWxpemVkPC9saT4KKyAqICAgPGxpPklmIHRoZSBzZXNzaW9uIGlzIG5vdCAwLCB0aGUgYXVkaW8gZnJvbSBhIHBhcnRpY3VsYXIge0BsaW5rIE1lZGlhUGxheWVyfSBvcgorICogICB7QGxpbmsgQXVkaW9UcmFja30KKyAqICAgdXNpbmcgdGhpcyBhdWRpbyBzZXNzaW9uIGlzIHZpc3VhbGl6ZWQgPC9saT4KKyAqIDwvdWw+CisgKiA8cD5Ud28gdHlwZXMgb2YgcmVwcmVzZW50YXRpb24gb2YgYXVkaW8gY29udGVudCBjYW4gYmUgY2FwdHVyZWQ6IDxicj4KKyAqIDx1bD4KKyAqICAgPGxpPldhdmVmb3JtIGRhdGE6IGNvbnNlY3V0aXZlIDgtYml0ICh1bnNpZ25lZCkgbW9ubyBzYW1wbGVzIGJ5IHVzaW5nIHRoZQorICogICB7QGxpbmsgI2dldFdhdmVGb3JtKGJ5dGVbXSl9IG1ldGhvZDwvbGk+CisgKiAgIDxsaT5GcmVxdWVuY3kgZGF0YTogOC1iaXQgbWFnbml0dWRlIEZGVCBieSB1c2luZyB0aGUge0BsaW5rICNnZXRGZnQoYnl0ZVtdKX0gbWV0aG9kPC9saT4KKyAqIDwvdWw+CisgKiA8cD5UaGUgbGVuZ3RoIG9mIHRoZSBjYXB0dXJlIGNhbiBiZSByZXRyaWV2ZWQgb3Igc3BlY2lmaWVkIGJ5IGNhbGxpbmcgcmVzcGVjdGl2ZWx5CisgKiB7QGxpbmsgI2dldENhcHR1cmVTaXplKCl9IGFuZCB7QGxpbmsgI3NldENhcHR1cmVTaXplKGludCl9IG1ldGhvZHMuIE5vdGUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgRkZUCisgKiBpcyBoYWxmIG9mIHRoZSBzcGVjaWZpZWQgY2FwdHVyZSBzaXplIGJ1dCBib3RoIHNpZGVzIG9mIHRoZSBzcGVjdHJ1bSBhcmUgcmV0dXJuZWQgeWllbGRpbmcgaW4gYQorICogbnVtYmVyIG9mIGJ5dGVzIGVxdWFsIHRvIHRoZSBjYXB0dXJlIHNpemUuIFRoZSBjYXB0dXJlIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgaW4gdGhlIHJhbmdlCisgKiByZXR1cm5lZCBieSB7QGxpbmsgI2dldENhcHR1cmVTaXplUmFuZ2UoKX0uCisgKiA8cD5JbiBhZGRpdGlvbiB0byB0aGUgcG9sbGluZyBjYXB0dXJlIG1vZGUgZGVzY3JpYmVkIGFib3ZlIHdpdGgge0BsaW5rICNnZXRXYXZlRm9ybShieXRlW10pfSBhbmQKKyAqICB7QGxpbmsgI2dldEZmdChieXRlW10pfSBtZXRob2RzLCBhIGNhbGxiYWNrIG1vZGUgaXMgYWxzbyBhdmFpbGFibGUgYnkgaW5zdGFsbGluZyBhIGxpc3RlbmVyIGJ5CisgKiAgdXNlIG9mIHRoZSB7QGxpbmsgI3NldERhdGFDYXB0dXJlTGlzdGVuZXIoT25EYXRhQ2FwdHVyZUxpc3RlbmVyLCBpbnQsIGJvb2xlYW4sIGJvb2xlYW4pfSBtZXRob2QuCisgKiAgVGhlIHJhdGUgYXQgd2hpY2ggdGhlIGxpc3RlbmVyIGNhcHR1cmUgbWV0aG9kIGlzIGNhbGxlZCBhcyB3ZWxsIGFzIHRoZSB0eXBlIG9mIGRhdGEgcmV0dXJuZWQgaXMKKyAqICBzcGVjaWZpZWQuCisgKiA8cD5CZWZvcmUgY2FwdHVyaW5nIGRhdGEsIHRoZSBWaXN1YWxpemVyIG11c3QgYmUgZW5hYmxlZCBieSBjYWxsaW5nIHRoZQorICoge0BsaW5rICNzZXRFbmFibGVkKGJvb2xlYW4pfSBtZXRob2QuCisgKiBXaGVuIGRhdGEgY2FwdHVyZSBpcyBub3QgbmVlZGVkIGFueSBtb3JlLCB0aGUgVmlzdWFsaXplciBzaG91bGQgYmUgZGlzYWJsZWQuCisgKiA8cD5JdCBpcyBnb29kIHByYWN0aWNlIHRvIGNhbGwgdGhlIHtAbGluayAjcmVsZWFzZSgpfSBtZXRob2Qgd2hlbiB0aGUgVmlzdWFsaXplciBpcyBub3QgdXNlZAorICogYW55bW9yZSB0byBmcmVlIHVwIG5hdGl2ZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB0byB0aGUgVmlzdWFsaXplciBpbnN0YW5jZS4KKyAqCisgKiB7QGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCByZXZpZXd9CisgKi8KKworcHVibGljIGNsYXNzIFZpc3VhbGl6ZXIgeworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJhdWRpb2VmZmVjdF9qbmkiKTsKKyAgICAgICAgbmF0aXZlX2luaXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlZpc3VhbGl6ZXItSkFWQSI7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBvZiBhIFZpc3VhbGl6ZXIgb2JqZWN0IHRoYXQgd2FzIG5vdCBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgdXBvbiBjcmVhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1VOSU5JVElBTElaRUQgPSAwOworICAgIC8qKgorICAgICAqIFN0YXRlIG9mIGEgVmlzdWFsaXplciBvYmplY3QgdGhhdCBpcyByZWFkeSB0byBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lOSVRJQUxJWkVEICAgPSAxOworICAgIC8qKgorICAgICAqIFN0YXRlIG9mIGEgVmlzdWFsaXplciBvYmplY3QgdGhhdCBpcyBhY3RpdmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRU5BQkxFRCAgID0gMjsKKworICAgIC8vIHRvIGtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qbmkvYXVkaW9lZmZlY3QvYW5kcm9pZF9tZWRpYV9WaXN1YWxpemVyLmNwcAorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5BVElWRV9FVkVOVF9QQ01fQ0FQVFVSRSA9IDA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTkFUSVZFX0VWRU5UX0ZGVF9DQVBUVVJFID0gMTsKKworICAgIC8vIEVycm9yIGNvZGVzOgorICAgIC8qKgorICAgICAqIFN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyAgc3RhdGljIGZpbmFsIGludCBTVUNDRVNTICAgICAgICAgICAgICA9IDA7CisgICAgLyoqCisgICAgICogVW5zcGVjaWZpZWQgZXJyb3IuCisgICAgICovCisgICAgcHVibGljICBzdGF0aWMgZmluYWwgaW50IEVSUk9SICAgICAgICAgICAgICAgID0gLTE7CisgICAgLyoqCisgICAgICogSW50ZXJuYWwgb3ByZWF0aW9uIHN0YXR1cy4gTm90IHJldHVybmVkIGJ5IGFueSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljICBzdGF0aWMgZmluYWwgaW50IEFMUkVBRFlfRVhJU1RTICAgICAgID0gLTI7CisgICAgLyoqCisgICAgICogT3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gYmFkIG9iamVjdCBpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTk9fSU5JVCAgICAgICAgICAgICAgPSAtMzsKKyAgICAvKioKKyAgICAgKiBPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBiYWQgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyAgc3RhdGljIGZpbmFsIGludCBFUlJPUl9CQURfVkFMVUUgICAgICAgICAgICA9IC00OworICAgIC8qKgorICAgICAqIE9wZXJhdGlvbiBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgcmVxdWVzdGVkIGluIHdyb25nIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyAgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX09QRVJBVElPTiAgICA9IC01OworICAgIC8qKgorICAgICAqIE9wZXJhdGlvbiBmYWlsZWQgZHVlIHRvIGxhY2sgb2YgbWVtb3J5LgorICAgICAqLworICAgIHB1YmxpYyAgc3RhdGljIGZpbmFsIGludCBFUlJPUl9OT19NRU1PUlkgICAgICAgICAgICA9IC02OworICAgIC8qKgorICAgICAqIE9wZXJhdGlvbiBmYWlsZWQgZHVlIHRvIGRlYWQgcmVtb3RlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVBRF9PQkpFQ1QgICAgICAgICAgPSAtNzsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBNZW1iZXIgdmFyaWFibGVzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgdGhlIFZpc3VhbGl6ZXIgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1TdGF0ZSA9IFNUQVRFX1VOSU5JVElBTElaRUQ7CisgICAgLyoqCisgICAgICogTG9jayB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gbVN0YXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtU3RhdGVMb2NrID0gbmV3IE9iamVjdCgpOworICAgIC8qKgorICAgICAqIFN5c3RlbSB3aWRlIHVuaXF1ZSBJZGVudGlmaWVyIG9mIHRoZSB2aXN1YWxpemVyIGVuZ2luZSB1c2VkIGJ5IHRoaXMgVmlzdWFsaXplciBpbnN0YW5jZQorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbUlkOworCisgICAgLyoqCisgICAgICogTG9jayB0byBwcm90ZWN0IGxpc3RlbmVycyB1cGRhdGVzIGFnYWluc3QgZXZlbnQgbm90aWZpY2F0aW9ucworICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbUxpc3RlbmVyTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIGZvciBldmVudHMgY29taW5nIGZyb20gdGhlIG5hdGl2ZSBjb2RlCisgICAgICovCisgICAgcHJvdGVjdGVkIE5hdGl2ZUV2ZW50SGFuZGxlciBtTmF0aXZlRXZlbnRIYW5kbGVyID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiAgUENNIGFuZCBGRlQgY2FwdHVyZSBsaXN0ZW5lciByZWdpc3RlcmVkIGJ5IGNsaWVudAorICAgICAqLworICAgIHByb3RlY3RlZCBPbkRhdGFDYXB0dXJlTGlzdGVuZXIgbUNhcHR1cmVMaXN0ZW5lciA9IG51bGw7CisKKyAgICAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgbWV0aG9kcworICAgIHByaXZhdGUgaW50IG1OYXRpdmVWaXN1YWxpemVyOworICAgIHByaXZhdGUgaW50IG1KbmlEYXRhOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENvbnN0cnVjdG9yLCBGaW5hbGl6ZQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvKioKKyAgICAgKiBDbGFzcyBjb25zdHJ1Y3Rvci4KKyAgICAgKiBAcGFyYW0gYXVkaW9TZXNzaW9uICBTeXN0ZW0gd2lkZSB1bmlxdWUgYXVkaW8gc2Vzc2lvbiBpZGVudGlmaWVyLiBJZiBhdWRpb1Nlc3Npb24KKyAgICAgKiAgaXMgbm90IDAsIHRoZSB2aXN1YWxpemVyIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIE1lZGlhUGxheWVyIG9yIEF1ZGlvVHJhY2sgaW4gdGhlCisgICAgICogIHNhbWUgYXVkaW8gc2Vzc2lvbi4gT3RoZXJ3aXNlLCB0aGUgVmlzdWFsaXplciB3aWxsIGFwcGx5IHRvIHRoZSBvdXRwdXQgbWl4LgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCisgICAgICovCisKKyAgICBwdWJsaWMgVmlzdWFsaXplcihpbnQgYXVkaW9TZXNzaW9uKQorICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIGludFtdIGlkID0gbmV3IGludFsxXTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZUxvY2spIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1VOSU5JVElBTElaRUQ7CisgICAgICAgICAgICAvLyBuYXRpdmUgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgIGludCByZXN1bHQgPSBuYXRpdmVfc2V0dXAobmV3IFdlYWtSZWZlcmVuY2U8VmlzdWFsaXplcj4odGhpcyksIGF1ZGlvU2Vzc2lvbiwgaWQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBTVUNDRVNTICYmIHJlc3VsdCAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGNvZGUgIityZXN1bHQrIiB3aGVuIGluaXRpYWxpemluZyBWaXN1YWxpemVyLiIpOworICAgICAgICAgICAgICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiRWZmZWN0IGxpYnJhcnkgbm90IGxvYWRlZCIpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBpbml0aWFsaXplIFZpc3VhbGl6ZXIgZW5naW5lLCBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICtyZXN1bHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSWQgPSBpZFswXTsKKyAgICAgICAgICAgIGlmIChuYXRpdmVfZ2V0RW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfRU5BQkxFRDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5JVElBTElaRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgbmF0aXZlIFZpc3VhbGl6ZXIgcmVzb3VyY2VzLiBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gcmVsZWFzZSB0aGUKKyAgICAgKiB2aXN1YWxpemF0aW9uIGVuZ2luZSB3aGVuIG5vdCBpbiB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBuYXRpdmVfcmVsZWFzZSgpOworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgdmlzdWFsaXphdGlvbiBlbmdpbmUuCisgICAgICogQHBhcmFtIGVuYWJsZWQgcmVxdWVzdGVkIGVuYWJsZSBzdGF0ZQorICAgICAqIEByZXR1cm4ge0BsaW5rICNTVUNDRVNTfSBpbiBjYXNlIG9mIHN1Y2Nlc3MsCisgICAgICoge0BsaW5rICNFUlJPUl9JTlZBTElEX09QRVJBVElPTn0gb3Ige0BsaW5rICNFUlJPUl9ERUFEX09CSkVDVH0gaW4gY2FzZSBvZiBmYWlsdXJlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBpZiAoKGVuYWJsZWQgJiYgbVN0YXRlICE9IFNUQVRFX0lOSVRJQUxJWkVEKSB8fAorICAgICAgICAgICAgICAgICAgICAoIWVuYWJsZWQgJiYgbVN0YXRlICE9IFNUQVRFX0VOQUJMRUQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2V0RW5hYmxlZCgpIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZTogIittU3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzdGF0dXMgPSBuYXRpdmVfc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IGVuYWJsZWQgPyBTVEFURV9FTkFCTEVEIDogU1RBVEVfSU5JVElBTElaRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGN1cnJlbnQgYWN0aXZhdGlvbiBzdGF0ZSBvZiB0aGUgdmlzdWFsaXplci4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZpc3VhbGl6ZXIgaXMgYWN0aXZlLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgdGhyb3cobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0RW5hYmxlZCgpIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZTogIittU3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0RW5hYmxlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2FwdHVyZSBzaXplIHJhbmdlLgorICAgICAqIEByZXR1cm4gdGhlIG1pbmludW0gY2FwdHVyZSBzaXplIGlzIHJldHVybmVkIGluIGZpcnN0IGFycmF5IGVsZW1lbnQgYW5kIHRoZSBtYXhpbXVtIGluIHNlY29uZAorICAgICAqIGFycmF5IGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50W10gZ2V0Q2FwdHVyZVNpemVSYW5nZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBjYXB0dXJlIHJhdGUgZm9yIHRoZSBjYWxsYmFjayBjYXB0dXJlIG1ldGhvZC4gVGhpcyBpcyB0aGUgbWF4aW11bSB2YWx1ZQorICAgICAqIGZvciB0aGUgcmF0ZSBwYXJhbWV0ZXIgb2YgdGhlCisgICAgICoge0BsaW5rICNzZXREYXRhQ2FwdHVyZUxpc3RlbmVyKE9uRGF0YUNhcHR1cmVMaXN0ZW5lciwgaW50LCBib29sZWFuLCBib29sZWFuKX0gbWV0aG9kLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gY2FwdHVyZSByYXRlIGV4cHJlc3NlZCBpbiBtaWxsaUhlcnR6CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGdldE1heENhcHR1cmVSYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjYXB0dXJlIHNpemUsIGkuZS4gdGhlIG51bWJlciBvZiBieXRlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFdhdmVGb3JtKGJ5dGVbXSl9IGFuZAorICAgICAqIHtAbGluayAjZ2V0RmZ0KGJ5dGVbXSl9IG1ldGhvZHMuIFRoZSBjYXB0dXJlIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgaW4gdGhlIHJhbmdlIHJldHVybmVkCisgICAgICogYnkge0BsaW5rICNnZXRDYXB0dXJlU2l6ZVJhbmdlKCl9LgorICAgICAqIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBWaXN1YWxpemVyIGlzIGVuYWJsZWQuCisgICAgICogQHBhcmFtIHNpemUgcmVxdWVzdGVkIGNhcHR1cmUgc2l6ZQorICAgICAqIEByZXR1cm4ge0BsaW5rICNTVUNDRVNTfSBpbiBjYXNlIG9mIHN1Y2Nlc3MsCisgICAgICoge0BsaW5rICNFUlJPUl9CQURfVkFMVUV9IGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2V0Q2FwdHVyZVNpemUoaW50IHNpemUpCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgIHRocm93KG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNldENhcHR1cmVTaXplKCkgY2FsbGVkIGluIHdyb25nIHN0YXRlOiAiK21TdGF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZV9zZXRDYXB0dXJlU2l6ZShzaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgY3VycmVudCBjYXB0dXJlIHNpemUuCisgICAgICogQHJldHVybiB0aGUgY2FwdHVyZSBzaXplIGluIGJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2FwdHVyZVNpemUoKQorICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZUxvY2spIHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgIHRocm93KG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldENhcHR1cmVTaXplKCkgY2FsbGVkIGluIHdyb25nIHN0YXRlOiAiK21TdGF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRDYXB0dXJlU2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgY2FwdHVyZWQgYXVkaW8uCisgICAgICogQHJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBtaWxsaUhlcnR6LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2FtcGxpbmdSYXRlKCkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyhuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRTYW1wbGluZ1JhdGUoKSBjYWxsZWQgaW4gd3Jvbmcgc3RhdGU6ICIrbVN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlX2dldFNhbXBsaW5nUmF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHdhdmVmb3JtIGNhcHR1cmUgb2YgY3VycmVudGx5IHBsYXlpbmcgYXVkaW8gY29udGVudC4gVGhlIGNhcHR1cmUgY29uc2lzdHMgaW4KKyAgICAgKiBhIG51bWJlciBvZiBjb25zZWN1dGl2ZSA4LWJpdCAodW5zaWduZWQpIG1vbm8gUENNIHNhbXBsZXMgZXF1YWwgdG8gdGhlIGNhcHR1cmUgc2l6ZSByZXR1cm5lZAorICAgICAqIGJ5IHtAbGluayAjZ2V0Q2FwdHVyZVNpemUoKX0uCisgICAgICogPHA+VGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgVmlzdWFsaXplciBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSB3YXZlZm9ybSBhcnJheSBvZiBieXRlcyB3aGVyZSB0aGUgd2F2ZWZvcm0gc2hvdWxkIGJlIHJldHVybmVkCisgICAgICogQHJldHVybiB7QGxpbmsgI1NVQ0NFU1N9IGluIGNhc2Ugb2Ygc3VjY2VzcywKKyAgICAgKiB7QGxpbmsgI0VSUk9SX05PX01FTU9SWX0sIHtAbGluayAjRVJST1JfSU5WQUxJRF9PUEVSQVRJT059IG9yIHtAbGluayAjRVJST1JfREVBRF9PQkpFQ1R9CisgICAgICogaW4gY2FzZSBvZiBmYWlsdXJlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRXYXZlRm9ybShieXRlW10gd2F2ZWZvcm0pCisgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgdGhyb3cobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0V2F2ZUZvcm0oKSBjYWxsZWQgaW4gd3Jvbmcgc3RhdGU6ICIrbVN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlX2dldFdhdmVGb3JtKHdhdmVmb3JtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZnJlcXVlbmN5IGNhcHR1cmUgb2YgY3VycmVudGx5IHBsYXlpbmcgYXVkaW8gY29udGVudC4gVGhlIGNhcHR1cmUgaXMgYSA4LWJpdAorICAgICAqIG1hZ25pdHVkZSBGRlQuIE5vdGUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgRkZUIGlzIGhhbGYgb2YgdGhlIHNwZWNpZmllZCBjYXB0dXJlIHNpemUgYnV0IGJvdGgKKyAgICAgKiBzaWRlcyBvZiB0aGUgc3BlY3RydW0gYXJlIHJldHVybmVkIHlpZWxkaW5nIGluIGEgbnVtYmVyIG9mIGJ5dGVzIGVxdWFsIHRvIHRoZSBjYXB0dXJlIHNpemUuCisgICAgICoge0BzZWUgI2dldENhcHR1cmVTaXplKCl9LgorICAgICAqIDxwPlRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIFZpc3VhbGl6ZXIgaXMgZW5hYmxlZC4KKyAgICAgKiBAcGFyYW0gZmZ0IGFycmF5IG9mIGJ5dGVzIHdoZXJlIHRoZSBGRlQgc2hvdWxkIGJlIHJldHVybmVkCisgICAgICogQHJldHVybiB7QGxpbmsgI1NVQ0NFU1N9IGluIGNhc2Ugb2Ygc3VjY2VzcywKKyAgICAgKiB7QGxpbmsgI0VSUk9SX05PX01FTU9SWX0sIHtAbGluayAjRVJST1JfSU5WQUxJRF9PUEVSQVRJT059IG9yIHtAbGluayAjRVJST1JfREVBRF9PQkpFQ1R9CisgICAgICogaW4gY2FzZSBvZiBmYWlsdXJlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRGZnQoYnl0ZVtdIGZmdCkKKyAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyhuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRGZnQoKSBjYWxsZWQgaW4gd3Jvbmcgc3RhdGU6ICIrbVN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlX2dldEZmdChmZnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbnRlcmZhY2UgZGVmaW5pdGlvbnMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLyoqCisgICAgICogVGhlIE9uRGF0YUNhcHR1cmVMaXN0ZW5lciBpbnRlcmZhY2UgZGVmaW5lcyBtZXRob2RzIGNhbGxlZCBieSB0aGUgVmlzdWFsaXplciB0byBwZXJpb2RpY2FsbHkKKyAgICAgKiB1cGRhdGUgdGhlIGF1ZGlvIHZpc3VhbGl6YXRpb24gY2FwdHVyZS4KKyAgICAgKiBUaGUgY2xpZW50IGFwcGxpY2F0aW9uIGNhbiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgYW5kIHJlZ2lzdGVyIHRoZSBsaXN0ZW5lciB3aXRoIHRoZQorICAgICAqIHtAbGluayAjc2V0RGF0YUNhcHR1cmVMaXN0ZW5lcihPbkRhdGFDYXB0dXJlTGlzdGVuZXIsIGludCwgYm9vbGVhbiwgYm9vbGVhbil9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uRGF0YUNhcHR1cmVMaXN0ZW5lciAgeworICAgICAgICAvKioKKyAgICAgICAgICogTWV0aG9kIGNhbGxlZCB3aGVuIGEgbmV3IHdhdmVmb3JtIGNhcHR1cmUgaXMgYXZhaWxhYmxlLgorICAgICAgICAgKiBAcGFyYW0gdmlzdWFsaXplciBWaXN1YWxpemVyIG9iamVjdCBvbiB3aGljaCB0aGUgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC4KKyAgICAgICAgICogQHBhcmFtIHdhdmVmb3JtIGFycmF5IG9mIGJ5dGVzIGNvbnRhaW5pbmcgdGhlIHdhdmVmb3JtIHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gc2FtcGxpbmdSYXRlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIGF1ZGlvIHZpc3VhbGl6ZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uV2F2ZUZvcm1EYXRhQ2FwdHVyZShWaXN1YWxpemVyIHZpc3VhbGl6ZXIsIGJ5dGVbXSB3YXZlZm9ybSwgaW50IHNhbXBsaW5nUmF0ZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ldGhvZCBjYWxsZWQgd2hlbiBhIG5ldyBmcmVxdWVuY3kgY2FwdHVyZSBpcyBhdmFpbGFibGUuCisgICAgICAgICAqIEBwYXJhbSB2aXN1YWxpemVyIFZpc3VhbGl6ZXIgb2JqZWN0IG9uIHdoaWNoIHRoZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLgorICAgICAgICAgKiBAcGFyYW0gZmZ0IGFycmF5IG9mIGJ5dGVzIGNvbnRhaW5pbmcgdGhlIGZyZXF1ZW5jeSByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHNhbXBsaW5nUmF0ZSBzYW1wbGluZyByYXRlIG9mIHRoZSBhdWRpbyB2aXN1YWxpemVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkZmdERhdGFDYXB0dXJlKFZpc3VhbGl6ZXIgdmlzdWFsaXplciwgYnl0ZVtdIGZmdCwgaW50IHNhbXBsaW5nUmF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGFuIE9uRGF0YUNhcHR1cmVMaXN0ZW5lciBpbnRlcmZhY2UgYW5kIHNwZWNpZmllcyB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgY2FwdHVyZQorICAgICAqIHNob3VsZCBiZSB1cGRhdGVkIGFzIHdlbGwgYXMgdGhlIHR5cGUgb2YgY2FwdHVyZSByZXF1ZXN0ZWQuCisgICAgICogPHA+Q2FsbCB0aGlzIG1ldGhvZCB3aXRoIGEgbnVsbCBsaXN0ZW5lciB0byBzdG9wIHJlY2VpdmluZyB0aGUgY2FwdHVyZSB1cGRhdGVzLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBPbkRhdGFDYXB0dXJlTGlzdGVuZXIgcmVnaXN0ZXJlZAorICAgICAqIEBwYXJhbSByYXRlIHJhdGUgaW4gbWlsbGlIZXJ0eiBhdCB3aGljaCB0aGUgY2FwdHVyZSBzaG91bGQgYmUgdXBkYXRlZAorICAgICAqIEBwYXJhbSB3YXZlZm9ybSB0cnVlIGlmIGEgd2F2ZWZvcm0gY2FwdHVyZSBpcyByZXF1ZXN0ZWQ6IHRoZSBvbldhdmVGb3JtRGF0YUNhcHR1cmUoKQorICAgICAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgT25EYXRhQ2FwdHVyZUxpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gZmZ0IHRydWUgaWYgYSBmcmVxdWVuY3kgY2FwdHVyZSBpcyByZXF1ZXN0ZWQ6IHRoZSBvbkZmdERhdGFDYXB0dXJlKCkgbWV0aG9kIHdpbGwgYmUKKyAgICAgKiBjYWxsZWQgb24gdGhlIE9uRGF0YUNhcHR1cmVMaXN0ZW5lciBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiB7QGxpbmsgI1NVQ0NFU1N9IGluIGNhc2Ugb2Ygc3VjY2VzcywKKyAgICAgKiB7QGxpbmsgI0VSUk9SX05PX0lOSVR9IG9yIHtAbGluayAjRVJST1JfQkFEX1ZBTFVFfSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgICAgICovCisgICAgcHVibGljIGludCBzZXREYXRhQ2FwdHVyZUxpc3RlbmVyKE9uRGF0YUNhcHR1cmVMaXN0ZW5lciBsaXN0ZW5lciwKKyAgICAgICAgICAgIGludCByYXRlLCBib29sZWFuIHdhdmVmb3JtLCBib29sZWFuIGZmdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1MaXN0ZW5lckxvY2spIHsKKyAgICAgICAgICAgIG1DYXB0dXJlTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNhcHR1cmUgY2FsbGJhY2sgaXMgc3RvcHBlZCBpbiBuYXRpdmUgY29kZQorICAgICAgICAgICAgd2F2ZWZvcm0gPSBmYWxzZTsKKyAgICAgICAgICAgIGZmdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCBzdGF0dXMgPSBuYXRpdmVfc2V0UGVyaW9kaWNDYXB0dXJlKHJhdGUsIHdhdmVmb3JtLCBmZnQpOworICAgICAgICBpZiAoc3RhdHVzID09IFNVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmICgobGlzdGVuZXIgIT0gbnVsbCkgJiYgKG1OYXRpdmVFdmVudEhhbmRsZXIgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBMb29wZXIgbG9vcGVyOworICAgICAgICAgICAgICAgIGlmICgobG9vcGVyID0gTG9vcGVyLm15TG9vcGVyKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUV2ZW50SGFuZGxlciA9IG5ldyBOYXRpdmVFdmVudEhhbmRsZXIodGhpcywgbG9vcGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChsb29wZXIgPSBMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVFdmVudEhhbmRsZXIgPSBuZXcgTmF0aXZlRXZlbnRIYW5kbGVyKHRoaXMsIGxvb3Blcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUV2ZW50SGFuZGxlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEVSUk9SX05PX0lOSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSB0aGUgZm9yd2FyZGluZyBvZiBuYXRpdmUgZXZlbnRzIHRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIE5hdGl2ZUV2ZW50SGFuZGxlciBleHRlbmRzIEhhbmRsZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgVmlzdWFsaXplciBtVmlzdWFsaXplcjsKKworICAgICAgICBwdWJsaWMgTmF0aXZlRXZlbnRIYW5kbGVyKFZpc3VhbGl6ZXIgdiwgTG9vcGVyIGxvb3BlcikgeworICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKKyAgICAgICAgICAgIG1WaXN1YWxpemVyID0gdjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAobVZpc3VhbGl6ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9uRGF0YUNhcHR1cmVMaXN0ZW5lciBsID0gbnVsbDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVyTG9jaykgeworICAgICAgICAgICAgICAgIGwgPSBtVmlzdWFsaXplci5tQ2FwdHVyZUxpc3RlbmVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSAoYnl0ZVtdKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgaW50IHNhbXBsaW5nUmF0ZSA9IG1zZy5hcmcxOworICAgICAgICAgICAgICAgIHN3aXRjaChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTkFUSVZFX0VWRU5UX1BDTV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICBsLm9uV2F2ZUZvcm1EYXRhQ2FwdHVyZShtVmlzdWFsaXplciwgZGF0YSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBOQVRJVkVfRVZFTlRfRkZUX0NBUFRVUkU6CisgICAgICAgICAgICAgICAgICAgIGwub25GZnREYXRhQ2FwdHVyZShtVmlzdWFsaXplciwgZGF0YSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCJVbmtub3duIG5hdGl2ZSBldmVudDogIittc2cud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW50ZXJmYWNlIGRlZmluaXRpb25zCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2luaXQoKTsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIGludCBuYXRpdmVfc2V0dXAoT2JqZWN0IGF1ZGlvZWZmZWN0X3RoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gaWQpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3JlbGVhc2UoKTsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIGludCBuYXRpdmVfc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgYm9vbGVhbiBuYXRpdmVfZ2V0RW5hYmxlZCgpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgaW50IG5hdGl2ZV9zZXRDYXB0dXJlU2l6ZShpbnQgc2l6ZSk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCBpbnQgbmF0aXZlX2dldENhcHR1cmVTaXplKCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCBpbnQgbmF0aXZlX2dldFNhbXBsaW5nUmF0ZSgpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgaW50IG5hdGl2ZV9nZXRXYXZlRm9ybShieXRlW10gd2F2ZWZvcm0pOworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgaW50IG5hdGl2ZV9nZXRGZnQoYnl0ZVtdIGZmdCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCBpbnQgbmF0aXZlX3NldFBlcmlvZGljQ2FwdHVyZShpbnQgcmF0ZSwgYm9vbGVhbiB3YXZlRm9ybSwgYm9vbGVhbiBmZnQpOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBKYXZhIG1ldGhvZHMgY2FsbGVkIGZyb20gdGhlIG5hdGl2ZSBzaWRlCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9zdEV2ZW50RnJvbU5hdGl2ZShPYmplY3QgZWZmZWN0X3JlZiwKKyAgICAgICAgICAgIGludCB3aGF0LCBpbnQgYXJnMSwgaW50IGFyZzIsIE9iamVjdCBvYmopIHsKKyAgICAgICAgVmlzdWFsaXplciB2aXN1ID0gKFZpc3VhbGl6ZXIpKChXZWFrUmVmZXJlbmNlKWVmZmVjdF9yZWYpLmdldCgpOworICAgICAgICBpZiAodmlzdSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodmlzdS5tTmF0aXZlRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IHZpc3UubU5hdGl2ZUV2ZW50SGFuZGxlci5vYnRhaW5NZXNzYWdlKHdoYXQsIGFyZzEsIGFyZzIsIG9iaik7CisgICAgICAgICAgICB2aXN1Lm1OYXRpdmVFdmVudEhhbmRsZXIuc2VuZE1lc3NhZ2UobSk7CisgICAgICAgIH0KKworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2puaS9BbmRyb2lkLm1rCmluZGV4IDNhNzI5MWYuLjZmZTNjM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2puaS9BbmRyb2lkLm1rCkBAIC0xNSw2ICsxNSw3IEBACiAgICAgYW5kcm9pZF9tZWRpYV9BbXJJbnB1dFN0cmVhbS5jcHAgXAogCWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcCBcCiAJYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcCBcCiAJYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKaW5kZXggY2E4OGJjYy4uNWMyZWMwMCAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcApAQCAtNjgxLDE4ICs2ODEsNiBAQAogfQogCiBzdGF0aWMgamludAotYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllcl9zbm9vcChKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGRhdGEsIGppbnQga2luZCkgewotICAgIGpzaG9ydCogYXIgPSAoanNob3J0KillbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoKGphcnJheSlkYXRhLCAwKTsKLSAgICBqc2l6ZSBsZW4gPSBlbnYtPkdldEFycmF5TGVuZ3RoKChqYXJyYXkpZGF0YSk7Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgaWYgKGFyKSB7Ci0gICAgICAgIHJldCA9IE1lZGlhUGxheWVyOjpzbm9vcChhciwgbGVuLCBraW5kKTsKLSAgICAgICAgZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbCgoamFycmF5KWRhdGEsIGFyLCAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGppbnQKIGFuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXJfbmF0aXZlX3N1c3BlbmRfcmVzdW1lKAogICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqYm9vbGVhbiBpc1N1c3BlbmQpIHsKICAgICBMT0dWKCJzdXNwZW5kX3Jlc3VtZSglZCkiLCBpc1N1c3BlbmQpOwpAQCAtNzU3LDcgKzc0NSw2IEBACiAgICAgeyJuYXRpdmVfaW5pdCIsICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUGxheWVyX25hdGl2ZV9pbml0fSwKICAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAiKExqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXJfbmF0aXZlX3NldHVwfSwKICAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXJfbmF0aXZlX2ZpbmFsaXplfSwKLSAgICB7InNub29wIiwgICAgICAgICAgICAgICAiKFtTSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXJfc25vb3B9LAogICAgIHsibmF0aXZlX3N1c3BlbmRfcmVzdW1lIiwgIihaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllcl9uYXRpdmVfc3VzcGVuZF9yZXN1bWV9LAogICAgIHsiZ2V0QXVkaW9TZXNzaW9uSWQiLCAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllcl9nZXRfYXVkaW9fc2Vzc2lvbl9pZH0sCiAgICAgeyJzZXRBdWRpb1Nlc3Npb25JZCIsICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUGxheWVyX3NldF9hdWRpb19zZXNzaW9uX2lkfSwKQEAgLTc3OSw2ICs3NjYsNyBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXMoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudChKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yKEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZShKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyKEpOSUVudiAqZW52KTsKIAogI2lmbmRlZiBOT19PUEVOQ09SRQpAQCAtODQzLDYgKzgzMSwxMSBAQAogICAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UoZW52KSA8IDApIHsKKyAgICAgICAgTE9HRSgiRVJST1I6IE10cERhdGFiYXNlIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKICAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIoZW52KSA8IDApIHsKICAgICAgICAgTE9HRSgiRVJST1I6IE10cFNlcnZlciBuYXRpdmUgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOwogICAgICAgICBnb3RvIGJhaWw7CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IDdkNzUzM2EuLmNjZTlmZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXMuY3BwCkBAIC0xNjIsMjYgKzE2MiwyNiBAQAogfQogCiBzdGF0aWMgam9iamVjdAotYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBxdWFsaXR5KQorYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBpZCwgamludCBxdWFsaXR5KQogewotICAgIExPR1YoIm5hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGU6ICVkIiwgcXVhbGl0eSk7CisgICAgTE9HVigibmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZTogJWQgJWQiLCBpZCwgcXVhbGl0eSk7CiAgICAgaWYgKHF1YWxpdHkgIT0gQ0FNQ09SREVSX1FVQUxJVFlfSElHSCAmJiBxdWFsaXR5ICE9IENBTUNPUkRFUl9RVUFMSVRZX0xPVykgewogICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbiIsICJVbmtub3duIGNhbWNvcmRlciBwcm9maWxlIHF1YWxpdHkiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgY2FtY29yZGVyX3F1YWxpdHkgcSA9IHN0YXRpY19jYXN0PGNhbWNvcmRlcl9xdWFsaXR5PihxdWFsaXR5KTsKLSAgICBpbnQgZHVyYXRpb24gICAgICAgICA9IHNQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKCJkdXJhdGlvbiIsIHEpOwotICAgIGludCBmaWxlRm9ybWF0ICAgICAgID0gc1Byb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoImZpbGUuZm9ybWF0IiwgcSk7Ci0gICAgaW50IHZpZGVvQ29kZWMgICAgICAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgidmlkLmNvZGVjIiwgICBxKTsKLSAgICBpbnQgdmlkZW9CaXRSYXRlICAgICA9IHNQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKCJ2aWQuYnBzIiwgICAgIHEpOwotICAgIGludCB2aWRlb0ZyYW1lUmF0ZSAgID0gc1Byb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoInZpZC5mcHMiLCAgICAgcSk7Ci0gICAgaW50IHZpZGVvRnJhbWVXaWR0aCAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgidmlkLndpZHRoIiwgICBxKTsKLSAgICBpbnQgdmlkZW9GcmFtZUhlaWdodCA9IHNQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKCJ2aWQuaGVpZ2h0IiwgIHEpOwotICAgIGludCBhdWRpb0NvZGVjICAgICAgID0gc1Byb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoImF1ZC5jb2RlYyIsICAgcSk7Ci0gICAgaW50IGF1ZGlvQml0UmF0ZSAgICAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgiYXVkLmJwcyIsICAgICBxKTsKLSAgICBpbnQgYXVkaW9TYW1wbGVSYXRlICA9IHNQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKCJhdWQuaHoiLCAgICAgIHEpOwotICAgIGludCBhdWRpb0NoYW5uZWxzICAgID0gc1Byb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoImF1ZC5jaCIsICAgICAgcSk7CisgICAgaW50IGR1cmF0aW9uICAgICAgICAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgiZHVyYXRpb24iLCAgICBpZCwgcSk7CisgICAgaW50IGZpbGVGb3JtYXQgICAgICAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgiZmlsZS5mb3JtYXQiLCBpZCwgcSk7CisgICAgaW50IHZpZGVvQ29kZWMgICAgICAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgidmlkLmNvZGVjIiwgICBpZCwgcSk7CisgICAgaW50IHZpZGVvQml0UmF0ZSAgICAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgidmlkLmJwcyIsICAgICBpZCwgcSk7CisgICAgaW50IHZpZGVvRnJhbWVSYXRlICAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgidmlkLmZwcyIsICAgICBpZCwgcSk7CisgICAgaW50IHZpZGVvRnJhbWVXaWR0aCAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgidmlkLndpZHRoIiwgICBpZCwgcSk7CisgICAgaW50IHZpZGVvRnJhbWVIZWlnaHQgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgidmlkLmhlaWdodCIsICBpZCwgcSk7CisgICAgaW50IGF1ZGlvQ29kZWMgICAgICAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgiYXVkLmNvZGVjIiwgICBpZCwgcSk7CisgICAgaW50IGF1ZGlvQml0UmF0ZSAgICAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgiYXVkLmJwcyIsICAgICBpZCwgcSk7CisgICAgaW50IGF1ZGlvU2FtcGxlUmF0ZSAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgiYXVkLmh6IiwgICAgICBpZCwgcSk7CisgICAgaW50IGF1ZGlvQ2hhbm5lbHMgICAgPSBzUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgiYXVkLmNoIiwgICAgICBpZCwgcSk7CiAKICAgICAvLyBDaGVjayBvbiB0aGUgdmFsdWVzIHJldHJpZXZlZAogICAgIGlmIChkdXJhdGlvbiA9PSAtMSB8fCBmaWxlRm9ybWF0ID09IC0xIHx8IHZpZGVvQ29kZWMgPT0gLTEgfHwgYXVkaW9Db2RlYyA9PSAtMSB8fApAQCAtMjUzLDE3ICsyNTMsMTcgQEAKIH0KIAogc3RhdGljIGppbnQKLWFuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlc19uYXRpdmVfZ2V0X251bV9pbWFnZV9lbmNvZGluZ19xdWFsaXR5X2xldmVscyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQorYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9nZXRfbnVtX2ltYWdlX2VuY29kaW5nX3F1YWxpdHlfbGV2ZWxzKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgY2FtZXJhSWQpCiB7CiAgICAgTE9HVigibmF0aXZlX2dldF9udW1faW1hZ2VfZW5jb2RpbmdfcXVhbGl0eV9sZXZlbHMiKTsKLSAgICByZXR1cm4gc1Byb2ZpbGVzLT5nZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscygpLnNpemUoKTsKKyAgICByZXR1cm4gc1Byb2ZpbGVzLT5nZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhjYW1lcmFJZCkuc2l6ZSgpOwogfQogCiBzdGF0aWMgamludAotYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9nZXRfaW1hZ2VfZW5jb2RpbmdfcXVhbGl0eV9sZXZlbChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGluZGV4KQorYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9nZXRfaW1hZ2VfZW5jb2RpbmdfcXVhbGl0eV9sZXZlbChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGNhbWVyYUlkLCBqaW50IGluZGV4KQogewogICAgIExPR1YoIm5hdGl2ZV9nZXRfaW1hZ2VfZW5jb2RpbmdfcXVhbGl0eV9sZXZlbCIpOwotICAgIFZlY3RvcjxpbnQ+IGxldmVscyA9IHNQcm9maWxlcy0+Z2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoKTsKKyAgICBWZWN0b3I8aW50PiBsZXZlbHMgPSBzUHJvZmlsZXMtPmdldEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKGNhbWVyYUlkKTsKICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxldmVscy5zaXplKCkpIHsKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsICJvdXQgb2YgYXJyYXkgYm91bmRhcnkiKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNGb3JDYW1jb3JkZXJQcm9maWxlQ2xhc3NbXSA9IHsKICAgICB7Im5hdGl2ZV9pbml0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlc19uYXRpdmVfaW5pdH0sCi0gICAgeyJuYXRpdmVfZ2V0X2NhbWNvcmRlcl9wcm9maWxlIiwgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlOyIsCisgICAgeyJuYXRpdmVfZ2V0X2NhbWNvcmRlcl9wcm9maWxlIiwgICAgICAgICAgICIoSUkpTGFuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZTsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGV9LAogfTsKIApAQCAtMzAyLDggKzMwMiw4IEBACiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzRm9yQ2FtZXJhUHJvZmlsZUNsYXNzW10gPSB7CiAgICAgeyJuYXRpdmVfaW5pdCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2luaXR9LAogICAgIHsibmF0aXZlX2dldF9udW1faW1hZ2VfZW5jb2RpbmdfcXVhbGl0eV9sZXZlbHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9nZXRfbnVtX2ltYWdlX2VuY29kaW5nX3F1YWxpdHlfbGV2ZWxzfSwKLSAgICB7Im5hdGl2ZV9nZXRfaW1hZ2VfZW5jb2RpbmdfcXVhbGl0eV9sZXZlbCIsIihJKUkiLCAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlc19uYXRpdmVfZ2V0X2ltYWdlX2VuY29kaW5nX3F1YWxpdHlfbGV2ZWx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9nZXRfbnVtX2ltYWdlX2VuY29kaW5nX3F1YWxpdHlfbGV2ZWxzfSwKKyAgICB7Im5hdGl2ZV9nZXRfaW1hZ2VfZW5jb2RpbmdfcXVhbGl0eV9sZXZlbCIsIihJSSlJIiwgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2dldF9pbWFnZV9lbmNvZGluZ19xdWFsaXR5X2xldmVsfSwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRW5jb2RlckNhcGFiaWxpdGllc0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9FbmNvZGVyQ2FwYWJpbGl0aWVzIjsKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCmluZGV4IDIzMjg4ODkuLjVjMzk3YTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcApAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAiSk5JSGVscC5oIgpAQCAtMzksMzQgKzM4LDI1IEBACiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9kZXZpY2VSZW1vdmVkOwogc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CiAKK3N0YXRpYyB2b2lkIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1ldGhvZE5hbWUpIHsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGNhbGxiYWNrICclcycuIiwgbWV0aG9kTmFtZSk7CisgICAgICAgIExPR0VfRVgoZW52KTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIH0KK30KKwogY2xhc3MgTXlDbGllbnQgOiBwdWJsaWMgTXRwQ2xpZW50IHsKIHByaXZhdGU6Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga0RldmljZUFkZGVkID0gMSwKLSAgICAgICAga0RldmljZVJlbW92ZWQsCi0gICAgfTsKLQogICAgIHZpcnR1YWwgdm9pZCAgICBkZXZpY2VBZGRlZChNdHBEZXZpY2UgKmRldmljZSk7CiAgICAgdmlydHVhbCB2b2lkICAgIGRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpOwogCi0gICAgYm9vbCAgICAgICAgICAgIHJlcG9ydERldmljZUFkZGVkKEpOSUVudiAqZW52LCBNdHBEZXZpY2UgKmRldmljZSk7Ci0gICAgYm9vbCAgICAgICAgICAgIHJlcG9ydERldmljZVJlbW92ZWQoSk5JRW52ICplbnYsIE10cERldmljZSAqZGV2aWNlKTsKLQotICAgIEpOSUVudiogICAgICAgICBtRW52OwogICAgIGpvYmplY3QgICAgICAgICBtQ2xpZW50OwotICAgIE11dGV4ICAgICAgICAgICBtRXZlbnRMb2NrOwotICAgIENvbmRpdGlvbiAgICAgICBtRXZlbnRDb25kaXRpb247Ci0gICAgTXV0ZXggICAgICAgICAgIG1BY2tMb2NrOwotICAgIENvbmRpdGlvbiAgICAgICBtQWNrQ29uZGl0aW9uOwotICAgIGludCAgICAgICAgICAgICBtRXZlbnQ7CiAgICAgTXRwRGV2aWNlKiAgICAgIG1FdmVudERldmljZTsKIAogcHVibGljOgogICAgICAgICAgICAgICAgICAgICBNeUNsaWVudChKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpOwotICAgIHZpcnR1YWwgICAgICAgICB+TXlDbGllbnQoKTsKLSAgICB2b2lkICAgICAgICAgICAgd2FpdEZvckV2ZW50KEpOSUVudiAqZW52KTsKLQorICAgIHZvaWQgICAgICAgICAgICBjbGVhbnVwKEpOSUVudiAqZW52KTsKIH07CiAKIE10cENsaWVudCogZ2V0X2NsaWVudF9mcm9tX29iamVjdChKTklFbnYqIGVudiwgam9iamVjdCBqYXZhQ2xpZW50KQpAQCAtNzYsODcgKzY2LDM2IEBACiAKIAogTXlDbGllbnQ6Ok15Q2xpZW50KEpOSUVudiAqZW52LCBqb2JqZWN0IGNsaWVudCkKLSAgICA6ICAgbUVudihlbnYpLAotICAgICAgICBtQ2xpZW50KGVudi0+TmV3R2xvYmFsUmVmKGNsaWVudCkpLAotICAgICAgICBtRXZlbnQoMCksCi0gICAgICAgIG1FdmVudERldmljZShOVUxMKQorICAgIDogICBtQ2xpZW50KGVudi0+TmV3R2xvYmFsUmVmKGNsaWVudCkpCiB7CiB9CiAKLU15Q2xpZW50Ojp+TXlDbGllbnQoKSB7Ci0gICAgbUVudi0+RGVsZXRlR2xvYmFsUmVmKG1DbGllbnQpOwordm9pZCBNeUNsaWVudDo6Y2xlYW51cChKTklFbnYgKmVudikgeworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1DbGllbnQpOwogfQogCi0KIHZvaWQgTXlDbGllbnQ6OmRldmljZUFkZGVkKE10cERldmljZSAqZGV2aWNlKSB7Ci0gICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZUFkZGVkXG4iKTsKLSAgICBtQWNrTG9jay5sb2NrKCk7Ci0gICAgbUV2ZW50TG9jay5sb2NrKCk7Ci0gICAgbUV2ZW50ID0ga0RldmljZUFkZGVkOwotICAgIG1FdmVudERldmljZSA9IGRldmljZTsKLSAgICBtRXZlbnRDb25kaXRpb24uc2lnbmFsKCk7Ci0gICAgbUV2ZW50TG9jay51bmxvY2soKTsKLSAgICBtQWNrQ29uZGl0aW9uLndhaXQobUFja0xvY2spOwotICAgIG1BY2tMb2NrLnVubG9jaygpOwotfQotCi12b2lkIE15Q2xpZW50OjpkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKSB7Ci0gICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZVJlbW92ZWRcbiIpOwotICAgIG1BY2tMb2NrLmxvY2soKTsKLSAgICBtRXZlbnRMb2NrLmxvY2soKTsKLSAgICBtRXZlbnQgPSBrRGV2aWNlUmVtb3ZlZDsKLSAgICBtRXZlbnREZXZpY2UgPSBkZXZpY2U7Ci0gICAgbUV2ZW50Q29uZGl0aW9uLnNpZ25hbCgpOwotICAgIG1FdmVudExvY2sudW5sb2NrKCk7Ci0gICAgbUFja0NvbmRpdGlvbi53YWl0KG1BY2tMb2NrKTsKLSAgICBtQWNrTG9jay51bmxvY2soKTsKLX0KLQotYm9vbCBNeUNsaWVudDo6cmVwb3J0RGV2aWNlQWRkZWQoSk5JRW52ICplbnYsIE10cERldmljZSAqZGV2aWNlKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CiAgICAgY29uc3QgY2hhciogbmFtZSA9IGRldmljZS0+Z2V0RGV2aWNlTmFtZSgpOwotICAgIExPR0QoIk15Q2xpZW50OjpyZXBvcnREZXZpY2VBZGRlZCAlc1xuIiwgbmFtZSk7CisgICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZUFkZGVkICVzXG4iLCBuYW1lKTsKIAogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUNsaWVudCwgbWV0aG9kX2RldmljZUFkZGVkLCBkZXZpY2UtPmdldElEKCkpOwogCi0gICAgcmV0dXJuICghZW52LT5FeGNlcHRpb25DaGVjaygpKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKIH0KIAotYm9vbCBNeUNsaWVudDo6cmVwb3J0RGV2aWNlUmVtb3ZlZChKTklFbnYgKmVudiwgTXRwRGV2aWNlICpkZXZpY2UpIHsKLSAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZXZpY2UtPmdldERldmljZU5hbWUoKTsKLSAgICBMT0dEKCJNeUNsaWVudDo6cmVwb3J0RGV2aWNlUmVtb3ZlZCAlc1xuIiwgbmFtZSk7Cit2b2lkIE15Q2xpZW50OjpkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgY29uc3QgY2hhciogbmFtZSA9IGRldmljZS0+Z2V0RGV2aWNlTmFtZSgpOworICAgIExPR0QoIk15Q2xpZW50OjpkZXZpY2VSZW1vdmVkICVzXG4iLCBuYW1lKTsKIAogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUNsaWVudCwgbWV0aG9kX2RldmljZVJlbW92ZWQsIGRldmljZS0+Z2V0SUQoKSk7CiAKLSAgICByZXR1cm4gKCFlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOwogfQogCi12b2lkIE15Q2xpZW50Ojp3YWl0Rm9yRXZlbnQoSk5JRW52ICplbnYpIHsKLSAgICBtRXZlbnRMb2NrLmxvY2soKTsKLSAgICBtRXZlbnRDb25kaXRpb24ud2FpdChtRXZlbnRMb2NrKTsKLSAgICBtRXZlbnRMb2NrLnVubG9jaygpOwotCi0gICAgc3dpdGNoIChtRXZlbnQpIHsKLSAgICAgICAgY2FzZSBrRGV2aWNlQWRkZWQ6Ci0gICAgICAgICAgICByZXBvcnREZXZpY2VBZGRlZChlbnYsIG1FdmVudERldmljZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBrRGV2aWNlUmVtb3ZlZDoKLSAgICAgICAgICAgIHJlcG9ydERldmljZVJlbW92ZWQoZW52LCBtRXZlbnREZXZpY2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbUFja0xvY2subG9jaygpOwotICAgIG1BY2tDb25kaXRpb24uc2lnbmFsKCk7Ci0gICAgbUFja0xvY2sudW5sb2NrKCk7Ci19Ci0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMgYm9vbCBFeGNlcHRpb25DaGVjayh2b2lkKiBlbnYpCi17Ci0gICAgcmV0dXJuICgoSk5JRW52ICopZW52KS0+RXhjZXB0aW9uQ2hlY2soKTsKLX0KLQogc3RhdGljIHZvaWQKIGFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCiB7CkBAIC0xNzEsMTUgKzExMCwyNSBAQAogewogICAgIExPR0QoImZpbmFsaXplXG4iKTsKICAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBjbGllbnQtPmNsZWFudXAoZW52KTsKICAgICBkZWxldGUgY2xpZW50OworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgMCk7Cit9CisKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc3RhcnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBMT0dEKCJzdGFydFxuIik7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgcmV0dXJuIGNsaWVudC0+c3RhcnQoKTsKIH0KIAogc3RhdGljIHZvaWQKLWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3dhaXRfZm9yX2V2ZW50KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCithbmRyb2lkX21lZGlhX010cENsaWVudF9zdG9wKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCiB7Ci0gICAgTE9HRCgid2FpdF9mb3JfZXZlbnRcbiIpOworICAgIExPR0QoInN0b3BcbiIpOwogICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOwotICAgIGNsaWVudC0+d2FpdEZvckV2ZW50KGVudik7CisgICAgY2xpZW50LT5zdG9wKCk7CiB9CiAKIHN0YXRpYyBqYm9vbGVhbgpAQCAtMjIzLDcgKzE3Miw4IEBACiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CiAgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zZXR1cH0sCiAgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9maW5hbGl6ZX0sCi0gICAgeyJuYXRpdmVfd2FpdF9mb3JfZXZlbnQiLCAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF93YWl0X2Zvcl9ldmVudH0sCisgICAgeyJuYXRpdmVfc3RhcnQiLCAgICAgICAgICAgICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zdGFydH0sCisgICAgeyJuYXRpdmVfc3RvcCIsICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zdG9wfSwKICAgICB7Im5hdGl2ZV9kZWxldGVfb2JqZWN0IiwgICAiKElJKVoiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2RlbGV0ZV9vYmplY3R9LAogICAgIHsibmF0aXZlX2dldF9wYXJlbnQiLCAgICAgICIoSUkpSSIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3BhcmVudH0sCiAgICAgeyJuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQiLCAgIihJSSlJIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZH0sCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlNDFlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcApAQCAtMCwwICsxLDQ1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRGF0YWJhc2VKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhYmFzZS5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorI2luY2x1ZGUgIm10cC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9iZWdpblNlbmRPYmplY3Q7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9lbmRTZW5kT2JqZWN0Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0TGlzdDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdFByb3BlcnR5Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0SW5mbzsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdEZpbGVQYXRoOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGVsZXRlRmlsZTsKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCitNdHBEYXRhYmFzZSogZ2V0TXRwRGF0YWJhc2UoSk5JRW52ICplbnYsIGpvYmplY3QgZGF0YWJhc2UpIHsKKyAgICByZXR1cm4gKE10cERhdGFiYXNlICopZW52LT5HZXRJbnRGaWVsZChkYXRhYmFzZSwgZmllbGRfY29udGV4dCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTXlNdHBEYXRhYmFzZSA6IHB1YmxpYyBNdHBEYXRhYmFzZSB7Citwcml2YXRlOgorICAgIGpvYmplY3QgICAgICAgICBtRGF0YWJhc2U7CisgICAgamludEFycmF5ICAgICAgIG1JbnRCdWZmZXI7CisgICAgamxvbmdBcnJheSAgICAgIG1Mb25nQnVmZmVyOworICAgIGpjaGFyQXJyYXkgICAgICBtU3RyaW5nQnVmZmVyOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeU10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsaWVudCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgICAgICAgICB+TXlNdHBEYXRhYmFzZSgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cChKTklFbnYgKmVudik7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGJlZ2luU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IG1vZGlmaWVkKTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2NlZWRlZCk7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0UHJvcGVydHkoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICAgICAgICAgZ2V0T2JqZWN0RmlsZVBhdGgoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nJiBmaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgZmlsZUxlbmd0aCk7CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworCisgICAgLy8gaGVscGVyIGZvciBtZWRpYSBzY2FubmVyCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGUqICAgICAgICBnZXRGaWxlTGlzdChpbnQmIG91dENvdW50KTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgYmVnaW5UcmFuc2FjdGlvbigpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgY29tbWl0VHJhbnNhY3Rpb24oKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrVHJhbnNhY3Rpb24oKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvcGVydHlJbmZvKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpOworfTsKKworTXlNdHBEYXRhYmFzZTo6TXlNdHBEYXRhYmFzZShKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpCisgICAgOiAgIG1EYXRhYmFzZShlbnYtPk5ld0dsb2JhbFJlZihjbGllbnQpKSwKKyAgICAgICAgbUludEJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbUxvbmdCdWZmZXIoTlVMTCksCisgICAgICAgIG1TdHJpbmdCdWZmZXIoTlVMTCkKK3sKKyAgICBqaW50QXJyYXkgaW50QXJyYXk7CisgICAgamxvbmdBcnJheSBsb25nQXJyYXk7CisgICAgamNoYXJBcnJheSBjaGFyQXJyYXk7CisKKyAgICAvLyBjcmVhdGUgYnVmZmVycyBmb3Igb3V0IGFyZ3VtZW50cworICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gYmUgdGhyZWFkLXNhZmUgc28gdGhpcyBpcyBPSworICAgIGludEFycmF5ID0gZW52LT5OZXdJbnRBcnJheSgzKTsKKyAgICBpZiAoIWludEFycmF5KQorICAgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisgICAgbUludEJ1ZmZlciA9IChqaW50QXJyYXkpZW52LT5OZXdHbG9iYWxSZWYoaW50QXJyYXkpOworICAgIGxvbmdBcnJheSA9IGVudi0+TmV3TG9uZ0FycmF5KDIpOworICAgIGlmICghbG9uZ0FycmF5KQorICAgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisgICAgbUxvbmdCdWZmZXIgPSAoamxvbmdBcnJheSllbnYtPk5ld0dsb2JhbFJlZihsb25nQXJyYXkpOworICAgIGNoYXJBcnJheSA9IGVudi0+TmV3Q2hhckFycmF5KDI1Nik7CisgICAgaWYgKCFjaGFyQXJyYXkpCisgICAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKyAgICBtU3RyaW5nQnVmZmVyID0gKGpjaGFyQXJyYXkpZW52LT5OZXdHbG9iYWxSZWYoY2hhckFycmF5KTsKKyAgICByZXR1cm47CisKK291dF9vZl9tZW1vcnk6CisgICAgZW52LT5UaHJvd05ldyhlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiKSwgTlVMTCk7Cit9CisKK3ZvaWQgTXlNdHBEYXRhYmFzZTo6Y2xlYW51cChKTklFbnYgKmVudikgeworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1EYXRhYmFzZSk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUludEJ1ZmZlcik7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUxvbmdCdWZmZXIpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1TdHJpbmdCdWZmZXIpOworfQorCitNeU10cERhdGFiYXNlOjp+TXlNdHBEYXRhYmFzZSgpIHsKK30KKworTXRwT2JqZWN0SGFuZGxlIE15TXRwRGF0YWJhc2U6OmJlZ2luU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IG1vZGlmaWVkKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9iZWdpblNlbmRPYmplY3QsIGVudi0+TmV3U3RyaW5nVVRGKHBhdGgpLAorICAgICAgICAgICAgICAgIChqaW50KWZvcm1hdCwgKGppbnQpcGFyZW50LCAoamludClzdG9yYWdlLCAoamxvbmcpc2l6ZSwgKGpsb25nKW1vZGlmaWVkKTsKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjplbmRTZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIGJvb2wgc3VjY2VlZGVkKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9lbmRTZW5kT2JqZWN0LCBlbnYtPk5ld1N0cmluZ1VURihwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgKGppbnQpZm9ybWF0LCAoamJvb2xlYW4pc3VjY2VlZGVkKTsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RMaXN0LAorICAgICAgICAgICAgICAgIChqaW50KXN0b3JhZ2VJRCwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0SGFuZGxlTGlzdCgpOworICAgIGppbnQqIGhhbmRsZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworTE9HRCgiZ2V0T2JqZWN0TGlzdCBsZW5ndGg6ICVkIiwgbGVuZ3RoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CitMT0dEKCJwdXNoOiAlZCIsIGhhbmRsZXNbaV0pOworICAgICAgICBsaXN0LT5wdXNoKGhhbmRsZXNbaV0pOworICAgIH0KKyAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIGhhbmRsZXMsIDApOworICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RQcm9wZXJ0eShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0UHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREU7CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAoamludCloYW5kbGUsIChqaW50KXByb3BlcnR5LCBtTG9uZ0J1ZmZlciwgbVN0cmluZ0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIGpsb25nIGxvbmdWYWx1ZSA9IGxvbmdWYWx1ZXNbMF07CisgICAgZW52LT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIGxvbmdWYWx1ZXMsIDApOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50OChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTYobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTYobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dEludDMyKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDMyKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ2NChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ2NChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICB7CisgICAgICAgICAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICAgICAgICAgIHBhY2tldC5wdXRTdHJpbmcoc3RyKTsKKyAgICAgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVuc3VwcG9ydGVkIG9iamVjdCB0eXBlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIH0KKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBjaGFyICAgIGRhdGVbMjBdOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RJbmZvLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgbUludEJ1ZmZlciwgbVN0cmluZ0J1ZmZlciwgbUxvbmdCdWZmZXIpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKworICAgIGppbnQqIGludFZhbHVlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhtSW50QnVmZmVyLCAwKTsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gaW50VmFsdWVzWzBdOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBpbnRWYWx1ZXNbMV07CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IGludFZhbHVlc1syXTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKG1JbnRCdWZmZXIsIGludFZhbHVlcywgMCk7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIHVpbnQ2NF90IHNpemUgPSBsb25nVmFsdWVzWzBdOworICAgIHVpbnQ2NF90IG1vZGlmaWVkID0gbG9uZ1ZhbHVlc1sxXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisKKyAgICBpbnQgYXNzb2NpYXRpb25UeXBlID0gKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVFBfQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEKTsKKworICAgIHBhY2tldC5wdXRVSW50MzIoc3RvcmFnZUlEKTsKKyAgICBwYWNrZXQucHV0VUludDE2KGZvcm1hdCk7CisgICAgcGFja2V0LnB1dFVJbnQxNigwKTsgICAvLyBwcm90ZWN0aW9uIHN0YXR1cworICAgIHBhY2tldC5wdXRVSW50MzIoKHNpemUgPiAweEZGRkZGRkZGTEwgPyAweEZGRkZGRkZGIDogc2l6ZSkpOworICAgIHBhY2tldC5wdXRVSW50MTYoMCk7ICAgLy8gdGh1bWIgZm9ybWF0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBjb21wcmVzc2VkIHNpemUKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIHBpeCB3aWR0aAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgcGl4IGhlaWdodAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gaW1hZ2UgcGl4IHdpZHRoCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBwaXggaGVpZ2h0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBiaXQgZGVwdGgKKyAgICBwYWNrZXQucHV0VUludDMyKHBhcmVudCk7CisgICAgcGFja2V0LnB1dFVJbnQxNihhc3NvY2lhdGlvblR5cGUpOworICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gYXNzb2NpYXRpb24gZGVzYworICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gc2VxdWVuY2UgbnVtYmVyCisKKyAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICBwYWNrZXQucHV0U3RyaW5nKHN0cik7ICAgLy8gZmlsZSBuYW1lCisgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgc3RyLCAwKTsKKworICAgIHBhY2tldC5wdXRFbXB0eVN0cmluZygpOworICAgIGZvcm1hdERhdGVUaW1lKG1vZGlmaWVkLCBkYXRlLCBzaXplb2YoZGF0ZSkpOworICAgIHBhY2tldC5wdXRTdHJpbmcoZGF0ZSk7ICAgLy8gZGF0ZSBtb2RpZmllZAorICAgIHBhY2tldC5wdXRFbXB0eVN0cmluZygpOyAgIC8vIGtleXdvcmRzCisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitib29sIE15TXRwRGF0YWJhc2U6OmdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIGZpbGVMZW5ndGgpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdEZpbGVQYXRoLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgbVN0cmluZ0J1ZmZlciwgbUxvbmdCdWZmZXIpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICBmaWxlUGF0aC5zZXRUbyhzdHIsIHN0cmxlbjE2KHN0cikpOworICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIGZpbGVMZW5ndGggPSBsb25nVmFsdWVzWzBdOworICAgIGVudi0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCBsb25nVmFsdWVzLCAwKTsKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNeU10cERhdGFiYXNlOjpkZWxldGVGaWxlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICByZXR1cm4gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9kZWxldGVGaWxlLCAoamludCloYW5kbGUpOyAKK30KKworICAgIC8vIGhlbHBlciBmb3IgbWVkaWEgc2Nhbm5lcgorTXRwT2JqZWN0SGFuZGxlKiBNeU10cERhdGFiYXNlOjpnZXRGaWxlTGlzdChpbnQmIG91dENvdW50KSB7CisgICAgLy8gUkVNT1ZFIE1FCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTXlNdHBEYXRhYmFzZTo6YmVnaW5UcmFuc2FjdGlvbigpIHsKKyAgICAvLyBSRU1PVkUgTUUKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjpjb21taXRUcmFuc2FjdGlvbigpIHsKKyAgICAvLyBSRU1PVkUgTUUKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjpyb2xsYmFja1RyYW5zYWN0aW9uKCkgeworICAgIC8vIFJFTU9WRSBNRQorfQorCitzdHJ1Y3QgUHJvcGVydHlUYWJsZUVudHJ5IHsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSAgIHByb3BlcnR5OworICAgIGludCAgICAgICAgICAgICAgICAgdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkgICBrUHJvcGVydHlUYWJsZVtdID0geworICAgIHsgICBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVCwgICAgIE1UUF9UWVBFX1VJTlQzMiB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCwgICAgICAgIE1UUF9UWVBFX1VJTlQzMiB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwgICAgIE1UUF9UWVBFX1VJTlQzMiB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwgIE1UUF9UWVBFX1NUUiAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkUsICAgICAgIE1UUF9UWVBFX1VJTlQ2NCB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRCwgICAgIE1UUF9UWVBFX1NUUiAgICB9LAorfTsKKworYm9vbCBNeU10cERhdGFiYXNlOjpnZXRQcm9wZXJ0eUluZm8oTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksIGludCYgdHlwZSkgeworICAgIGludCBjb3VudCA9IHNpemVvZihrUHJvcGVydHlUYWJsZSkgLyBzaXplb2Yoa1Byb3BlcnR5VGFibGVbMF0pOworICAgIGNvbnN0IFByb3BlcnR5VGFibGVFbnRyeSogZW50cnkgPSBrUHJvcGVydHlUYWJsZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyssIGVudHJ5KyspIHsKKyAgICAgICAgaWYgKGVudHJ5LT5wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgeworICAgICAgICAgICAgdHlwZSA9IGVudHJ5LT50eXBlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1ldGhvZE5hbWUpIHsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGNhbGxiYWNrICclcycuIiwgbWV0aG9kTmFtZSk7CisgICAgICAgIExPR0VfRVgoZW52KTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZV9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIExPR0QoInNldHVwXG4iKTsKKyAgICBNeU10cERhdGFiYXNlKiBkYXRhYmFzZSA9IG5ldyBNeU10cERhdGFiYXNlKGVudiwgdGhpeik7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KWRhdGFiYXNlKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2VfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXlNdHBEYXRhYmFzZSogZGF0YWJhc2UgPSAoTXlNdHBEYXRhYmFzZSAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgZGF0YWJhc2UtPmNsZWFudXAoZW52KTsKKyAgICBkZWxldGUgZGF0YWJhc2U7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAwKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cERhdGFiYXNlX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2VfZmluYWxpemV9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZShKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICBMT0dEKCJyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfYmVnaW5TZW5kT2JqZWN0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImJlZ2luU2VuZE9iamVjdCIsICIoTGphdmEvbGFuZy9TdHJpbmc7SUlJSkopSSIpOworICAgIGlmIChtZXRob2RfYmVnaW5TZW5kT2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBiZWdpblNlbmRPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZW5kU2VuZE9iamVjdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJlbmRTZW5kT2JqZWN0IiwgIihMamF2YS9sYW5nL1N0cmluZztJSVopViIpOworICAgIGlmIChtZXRob2RfZW5kU2VuZE9iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZW5kU2VuZE9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RMaXN0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdExpc3QiLCAiKElJSSlbSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0TGlzdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0TGlzdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RQcm9wZXJ0eSA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RQcm9wZXJ0eSIsICIoSUlbSltDKUkiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdFByb3BlcnR5ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RQcm9wZXJ0eSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RJbmZvID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdEluZm8iLCAiKElbSVtDW0opWiIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0SW5mbyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0SW5mbyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RGaWxlUGF0aCIsICIoSVtDW0opWiIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGggPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdEZpbGVQYXRoIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RlbGV0ZUZpbGUgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGVsZXRlRmlsZSIsICIoSSlaIik7CisgICAgaWYgKG1ldGhvZF9kZWxldGVGaWxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZWxldGVGaWxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwRGF0YWJhc2UubU5hdGl2ZUNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cFNlcnZlci5jcHAKaW5kZXggMzU1YTVlYi4uMDg4MzUyNyAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgInByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIgogCiAjaW5jbHVkZSAiTXRwU2VydmVyLmgiCiAKQEAgLTM2LDYgKzM3LDggQEAKIAogc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CiAKKy8vIGluIGFuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwCitleHRlcm4gTXRwRGF0YWJhc2UqIGdldE10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGRhdGFiYXNlKTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00NiwxNCArNDksMTUgQEAKIAogY2xhc3MgTXRwVGhyZWFkIDogcHVibGljIFRocmVhZCB7CiBwcml2YXRlOgorICAgIE10cERhdGFiYXNlKiAgICBtRGF0YWJhc2U7CisgICAgTXRwU2VydmVyKiAgICAgIG1TZXJ2ZXI7CiAgICAgU3RyaW5nOCBtU3RvcmFnZVBhdGg7Ci0gICAgU3RyaW5nOCBtRGF0YWJhc2VQYXRoOwogICAgIGJvb2wgbURvbmU7Ci0gICAgYm9vbCBtU2Nhbm5lZE9uY2U7CisgICAgTXV0ZXggICAgICAgICAgIG1NdXRleDsKIAogcHVibGljOgotICAgIE10cFRocmVhZChjb25zdCBjaGFyKiBzdG9yYWdlUGF0aCwgY29uc3QgY2hhciogZGF0YWJhc2VQYXRoKQotICAgICAgICA6IG1TdG9yYWdlUGF0aChzdG9yYWdlUGF0aCksIG1EYXRhYmFzZVBhdGgoZGF0YWJhc2VQYXRoKSwgbURvbmUoZmFsc2UpLCBtU2Nhbm5lZE9uY2UoZmFsc2UpCisgICAgTXRwVGhyZWFkKE10cERhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgY2hhciogc3RvcmFnZVBhdGgpCisgICAgICAgIDogbURhdGFiYXNlKGRhdGFiYXNlKSwgbVNlcnZlcihOVUxMKSwgbVN0b3JhZ2VQYXRoKHN0b3JhZ2VQYXRoKSwgbURvbmUoZmFsc2UpCiAgICAgewogICAgIH0KIApAQCAtNjUsMTYgKzY5LDE5IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBNdHBTZXJ2ZXIqIHNlcnZlciA9IG5ldyBNdHBTZXJ2ZXIoZmQsIG1EYXRhYmFzZVBhdGgpOwotICAgICAgICBzZXJ2ZXItPmFkZFN0b3JhZ2UobVN0b3JhZ2VQYXRoKTsKKyAgICAgICAgbU11dGV4LmxvY2soKTsKKyAgICAgICAgbVNlcnZlciA9IG5ldyBNdHBTZXJ2ZXIoZmQsIG1EYXRhYmFzZSwgQUlEX1NEQ0FSRF9SVywgMDY2NCwgMDc3NSk7CisgICAgICAgIG1TZXJ2ZXItPmFkZFN0b3JhZ2UobVN0b3JhZ2VQYXRoKTsKKyAgICAgICAgbU11dGV4LnVubG9jaygpOwogCi0gICAgICAgIC8vIHRlbXBvcmFyeQotICAgICAgICBMT0dEKCJNdHBUaHJlYWQgc2VydmVyLT5zY2FuU3RvcmFnZSIpOwotICAgICAgICBzZXJ2ZXItPnNjYW5TdG9yYWdlKCk7Ci0gICAgICAgIExPR0QoIk10cFRocmVhZCBzZXJ2ZXItPnJ1biIpOwotICAgICAgICBzZXJ2ZXItPnJ1bigpOworICAgICAgICBMT0dEKCJNdHBUaHJlYWQgbVNlcnZlci0+cnVuIik7CisgICAgICAgIG1TZXJ2ZXItPnJ1bigpOwogICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgIGRlbGV0ZSBzZXJ2ZXI7CisKKyAgICAgICAgbU11dGV4LmxvY2soKTsKKyAgICAgICAgZGVsZXRlIG1TZXJ2ZXI7CisgICAgICAgIG1TZXJ2ZXIgPSBOVUxMOworICAgICAgICBtTXV0ZXgudW5sb2NrKCk7CiAKICAgICAgICAgYm9vbCBkb25lID0gbURvbmU7CiAgICAgICAgIGlmIChkb25lKQpAQCAtODQsMjEgKzkxLDM4IEBACiAgICAgfQogCiAgICAgdm9pZCBzZXREb25lKCkgeyBtRG9uZSA9IHRydWU7IH0KKworICAgIHZvaWQgc2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICAgICAgbU11dGV4LmxvY2soKTsKKyAgICAgICAgaWYgKG1TZXJ2ZXIpCisgICAgICAgICAgICBtU2VydmVyLT5zZW5kT2JqZWN0QWRkZWQoaGFuZGxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTE9HRSgic2VuZE9iamVjdEFkZGVkIGNhbGxlZCB3aGlsZSBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgICBtTXV0ZXgudW5sb2NrKCk7CisgICAgfQorCisgICAgdm9pZCBzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgICAgIG1NdXRleC5sb2NrKCk7CisgICAgICAgIGlmIChtU2VydmVyKQorICAgICAgICAgICAgbVNlcnZlci0+c2VuZE9iamVjdFJlbW92ZWQoaGFuZGxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTE9HRSgic2VuZE9iamVjdFJlbW92ZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICAgIG1NdXRleC51bmxvY2soKTsKKyAgICB9CiB9OwogCiBzdGF0aWMgdm9pZAotYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwganN0cmluZyBzdG9yYWdlUGF0aCwganN0cmluZyBkYXRhYmFzZVBhdGgpCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFEYXRhYmFzZSwganN0cmluZyBzdG9yYWdlUGF0aCkKIHsKICAgICBMT0dEKCJzZXR1cFxuIik7CiAKKyAgICBNdHBEYXRhYmFzZSogZGF0YWJhc2UgPSBnZXRNdHBEYXRhYmFzZShlbnYsIGphdmFEYXRhYmFzZSk7CiAgICAgY29uc3QgY2hhciAqc3RvcmFnZVBhdGhTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHN0b3JhZ2VQYXRoLCBOVUxMKTsKLSAgICBjb25zdCBjaGFyICpkYXRhYmFzZVBhdGhTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRhdGFiYXNlUGF0aCwgTlVMTCk7CiAKLSAgICBNdHBUaHJlYWQqIHRocmVhZCA9IG5ldyBNdHBUaHJlYWQoc3RvcmFnZVBhdGhTdHIsIGRhdGFiYXNlUGF0aFN0cik7CisgICAgTXRwVGhyZWFkKiB0aHJlYWQgPSBuZXcgTXRwVGhyZWFkKGRhdGFiYXNlLCBzdG9yYWdlUGF0aFN0cik7CiAgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KXRocmVhZCk7CiAKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzdG9yYWdlUGF0aCwgc3RvcmFnZVBhdGhTdHIpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGRhdGFiYXNlUGF0aCwgZGF0YWJhc2VQYXRoU3RyKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEyNywxMyArMTUxLDM4IEBACiAgICAgfQogfQogCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfYWRkZWQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBoYW5kbGUpCit7CisgICAgTE9HRCgic2VuZF9vYmplY3RfYWRkZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgTXRwVGhyZWFkICp0aHJlYWQgPSAoTXRwVGhyZWFkICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBpZiAodGhyZWFkKQorICAgICAgICB0aHJlYWQtPnNlbmRPYmplY3RBZGRlZChoYW5kbGUpOworICAgIGVsc2UKKyAgICAgICAgTE9HRSgic2VuZE9iamVjdEFkZGVkIGNhbGxlZCB3aGlsZSBkaXNjb25uZWN0ZWRcbiIpOworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGhhbmRsZSkKK3sKKyAgICBMT0dEKCJzZW5kX29iamVjdF9yZW1vdmVkICVkXG4iLCBoYW5kbGUpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgaWYgKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLT5zZW5kT2JqZWN0UmVtb3ZlZChoYW5kbGUpOworICAgIGVsc2UKKyAgICAgICAgTE9HRSgic2VuZE9iamVjdFJlbW92ZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewotICAgIHsibmF0aXZlX3NldHVwIiwgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2V0dXB9LAotICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfZmluYWxpemV9LAotICAgIHsibmF0aXZlX3N0YXJ0IiwgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RhcnR9LAotICAgIHsibmF0aXZlX3N0b3AiLCAgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RvcH0sCisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL010cERhdGFiYXNlO0xqYXZhL2xhbmcvU3RyaW5nOylWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfZmluYWxpemV9LAorICAgIHsibmF0aXZlX3N0YXJ0IiwgICAgICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0YXJ0fSwKKyAgICB7Im5hdGl2ZV9zdG9wIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zdG9wfSwKKyAgICB7Im5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZCIsICAgICIoSSlWIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZW5kX29iamVjdF9hZGRlZH0sCisgICAgeyJuYXRpdmVfc2VuZF9vYmplY3RfcmVtb3ZlZCIsICAiKEkpViIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZH0sCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2F1ZGlvZWZmZWN0L0FuZHJvaWQubWsgYi9tZWRpYS9qbmkvYXVkaW9lZmZlY3QvQW5kcm9pZC5tawppbmRleCBkMDNiNjNiLi40YzVjZjcxIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYXVkaW9lZmZlY3QvQW5kcm9pZC5taworKysgYi9tZWRpYS9qbmkvYXVkaW9lZmZlY3QvQW5kcm9pZC5tawpAQCAtMiw3ICsyLDggQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0JYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdC5jcHAKKwlhbmRyb2lkX21lZGlhX0F1ZGlvRWZmZWN0LmNwcCBcCisJYW5kcm9pZF9tZWRpYV9WaXN1YWxpemVyLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJjdXRpbHMgXApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2F1ZGlvZWZmZWN0L2FuZHJvaWRfbWVkaWFfQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvam5pL2F1ZGlvZWZmZWN0L2FuZHJvaWRfbWVkaWFfQXVkaW9FZmZlY3QuY3BwCmluZGV4IDE3ZjJkOGYuLmJlYjNkZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9hdWRpb2VmZmVjdC9hbmRyb2lkX21lZGlhX0F1ZGlvRWZmZWN0LmNwcAorKysgYi9tZWRpYS9qbmkvYXVkaW9lZmZlY3QvYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdC5jcHAKQEAgLTMyMyw4ICszMjMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZscEpuaVN0b3JhZ2UtPm1DYWxsYmFja0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgIGlmIChscEF1ZGlvRWZmZWN0ID09IE5VTEwpIHsKICAgICAgICAgTE9HRSgiRXJyb3IgY3JlYXRpbmcgQXVkaW9FZmZlY3QiKTsKICAgICAgICAgZ290byBzZXR1cF9mYWlsdXJlOwpAQCAtNDU1LDkgKzQ1NSw4IEBACiAgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZHMuZmlkSm5pRGF0YSwgMCk7CiB9CiAKLQogc3RhdGljIGppbnQKLWFuZHJvaWRfbWVkaWFfQXVkaW9FZmZlY3RfbmF0aXZlX2VuYWJsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQorYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdF9uYXRpdmVfc2V0RW5hYmxlZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqYm9vbGVhbiBlbmFibGVkKQogewogICAgIC8vIHJldHJpZXZlIHRoZSBBdWRpb0VmZmVjdCBvYmplY3QKICAgICBBdWRpb0VmZmVjdCogbHBBdWRpb0VmZmVjdCA9IChBdWRpb0VmZmVjdCAqKWVudi0+R2V0SW50RmllbGQoCkBAIC00NjksMjkgKzQ2OCwxMSBAQAogICAgICAgICByZXR1cm4gQVVESU9FRkZFQ1RfRVJST1JfTk9fSU5JVDsKICAgICB9CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3IobHBBdWRpb0VmZmVjdC0+ZW5hYmxlKCkpOworICAgIHJldHVybiB0cmFuc2xhdGVFcnJvcihscEF1ZGlvRWZmZWN0LT5zZXRFbmFibGVkKGVuYWJsZWQpKTsKIH0KIAotCi1zdGF0aWMgamludAotYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdF9uYXRpdmVfZGlzYWJsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQotewotICAgIC8vIHJldHJpZXZlIHRoZSBBdWRpb0VmZmVjdCBvYmplY3QKLSAgICBBdWRpb0VmZmVjdCogbHBBdWRpb0VmZmVjdCA9IChBdWRpb0VmZmVjdCAqKWVudi0+R2V0SW50RmllbGQoCi0gICAgICAgIHRoaXosIGZpZWxkcy5maWROYXRpdmVBdWRpb0VmZmVjdCk7Ci0KLSAgICBpZiAobHBBdWRpb0VmZmVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb24iLAotICAgICAgICAgICAgIlVuYWJsZSB0byByZXRyaWV2ZSBBdWRpb0VmZmVjdCBwb2ludGVyIGZvciBkaXNhYmxlKCkiKTsKLSAgICAgICAgcmV0dXJuIEFVRElPRUZGRUNUX0VSUk9SX05PX0lOSVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yKGxwQXVkaW9FZmZlY3QtPmRpc2FibGUoKSk7Ci19Ci0KLQogc3RhdGljIGpib29sZWFuCi1hbmRyb2lkX21lZGlhX0F1ZGlvRWZmZWN0X25hdGl2ZV9nZXRFbmFibGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK2FuZHJvaWRfbWVkaWFfQXVkaW9FZmZlY3RfbmF0aXZlX2dldEVuYWJsZWQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKIHsKICAgICAvLyByZXRyaWV2ZSB0aGUgQXVkaW9FZmZlY3Qgb2JqZWN0CiAgICAgQXVkaW9FZmZlY3QqIGxwQXVkaW9FZmZlY3QgPSAoQXVkaW9FZmZlY3QgKillbnYtPkdldEludEZpZWxkKApAQCAtNTAzLDcgKzQ4NCw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gKGpib29sZWFuKWxwQXVkaW9FZmZlY3QtPmlzRW5hYmxlZCgpOworICAgIHJldHVybiAoamJvb2xlYW4pbHBBdWRpb0VmZmVjdC0+Z2V0RW5hYmxlZCgpOwogfQogCiAKQEAgLTUxNiw3ICs0OTcsNyBAQAogCiAgICAgaWYgKGxwQXVkaW9FZmZlY3QgPT0gTlVMTCkgewogICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICJVbmFibGUgdG8gcmV0cmlldmUgQXVkaW9FZmZlY3QgcG9pbnRlciBmb3IgZ2V0RW5hYmxlZCgpIik7CisgICAgICAgICAgICAiVW5hYmxlIHRvIHJldHJpZXZlIEF1ZGlvRWZmZWN0IHBvaW50ZXIgZm9yIGhhc0NvbnRyb2woKSIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC04MTcsOSArNzk4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX0F1ZGlvRWZmZWN0X25hdGl2ZV9zZXR1cH0sCiAgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICIoKVYiLCAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdF9uYXRpdmVfZmluYWxpemV9LAogICAgIHsibmF0aXZlX3JlbGVhc2UiLCAgICAgICAiKClWIiwgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfQXVkaW9FZmZlY3RfbmF0aXZlX3JlbGVhc2V9LAotICAgIHsibmF0aXZlX2VuYWJsZSIsICAgICAgICAiKClJIiwgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfQXVkaW9FZmZlY3RfbmF0aXZlX2VuYWJsZX0sCi0gICAgeyJuYXRpdmVfZGlzYWJsZSIsICAgICAgICIoKUkiLCAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdF9uYXRpdmVfZGlzYWJsZX0sCi0gICAgeyJuYXRpdmVfZ2V0RW5hYmxlIiwgICAgICIoKVoiLCAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdF9uYXRpdmVfZ2V0RW5hYmxlfSwKKyAgICB7Im5hdGl2ZV9zZXRFbmFibGVkIiwgICAgIihaKUkiLCAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdF9uYXRpdmVfc2V0RW5hYmxlZH0sCisgICAgeyJuYXRpdmVfZ2V0RW5hYmxlZCIsICAgICIoKVoiLCAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdF9uYXRpdmVfZ2V0RW5hYmxlZH0sCiAgICAgeyJuYXRpdmVfaGFzQ29udHJvbCIsICAgICIoKVoiLCAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9BdWRpb0VmZmVjdF9uYXRpdmVfaGFzQ29udHJvbH0sCiAgICAgeyJuYXRpdmVfc2V0UGFyYW1ldGVyIiwgICIoSVtCSVtCKUkiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX0F1ZGlvRWZmZWN0X25hdGl2ZV9zZXRQYXJhbWV0ZXJ9LAogICAgIHsibmF0aXZlX2dldFBhcmFtZXRlciIsICAiKElbQltJW0IpSSIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfQXVkaW9FZmZlY3RfbmF0aXZlX2dldFBhcmFtZXRlcn0sCkBAIC04MzAsNiArODEwLDggQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfdmlzdWFsaXplcihKTklFbnYgKmVudik7CisKIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX0F1ZGlvRWZmZWN0KEpOSUVudiAqZW52KQogewogICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwga0NsYXNzUGF0aE5hbWUsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOwpAQCAtODUyLDYgKzgzNCwxMSBAQAogICAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfdmlzdWFsaXplcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogVmlzdWFsaXplciBuYXRpdmUgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKICAgICAvKiBzdWNjZXNzIC0tIHJldHVybiB2YWxpZCB2ZXJzaW9uIG51bWJlciAqLwogICAgIHJlc3VsdCA9IEpOSV9WRVJTSU9OXzFfNDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2F1ZGlvZWZmZWN0L2FuZHJvaWRfbWVkaWFfVmlzdWFsaXplci5jcHAgYi9tZWRpYS9qbmkvYXVkaW9lZmZlY3QvYW5kcm9pZF9tZWRpYV9WaXN1YWxpemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTExOWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvam5pL2F1ZGlvZWZmZWN0L2FuZHJvaWRfbWVkaWFfVmlzdWFsaXplci5jcHAKQEAgLTAsMCArMSw1MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJ2aXN1YWxpemVycy1KTkkiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvam5pLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlICJtZWRpYS9WaXN1YWxpemVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisjZGVmaW5lIFZJU1VBTElaRVJfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZJU1VBTElaRVJfRVJST1IgICAgICAgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIFZJU1VBTElaRVJfRVJST1JfQUxSRUFEWV9FWElTVFMgICAgICAgIC0yCisjZGVmaW5lIFZJU1VBTElaRVJfRVJST1JfTk9fSU5JVCAgICAgICAgICAgICAgIC0zCisjZGVmaW5lIFZJU1VBTElaRVJfRVJST1JfQkFEX1ZBTFVFICAgICAgICAgICAgIC00CisjZGVmaW5lIFZJU1VBTElaRVJfRVJST1JfSU5WQUxJRF9PUEVSQVRJT04gICAgIC01CisjZGVmaW5lIFZJU1VBTElaRVJfRVJST1JfTk9fTUVNT1JZICAgICAgICAgICAgIC02CisjZGVmaW5lIFZJU1VBTElaRVJfRVJST1JfREVBRF9PQkpFQ1QgICAgICAgICAgIC03CisKKyNkZWZpbmUgTkFUSVZFX0VWRU5UX1BDTV9DQVBUVVJFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTkFUSVZFX0VWRU5UX0ZGVF9DQVBUVVJFICAgICAgICAgICAgICAgIDEKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvVmlzdWFsaXplciI7CisKK3N0cnVjdCBmaWVsZHNfdCB7CisgICAgLy8gdGhlc2UgZmllbGRzIHByb3ZpZGUgYWNjZXNzIGZyb20gQysrIHRvIHRoZS4uLgorICAgIGpjbGFzcyAgICBjbGF6ekVmZmVjdDsgICAgICAgICAgLy8gVmlzdWFsaXplciBjbGFzcworICAgIGptZXRob2RJRCBtaWRQb3N0TmF0aXZlRXZlbnQ7ICAgLy8gZXZlbnQgcG9zdCBjYWxsYmFjayBtZXRob2QKKyAgICBqZmllbGRJRCAgZmlkTmF0aXZlVmlzdWFsaXplcjsgLy8gc3RvcmVzIGluIEphdmEgdGhlIG5hdGl2ZSBWaXN1YWxpemVyIG9iamVjdAorICAgIGpmaWVsZElEICBmaWRKbmlEYXRhOyAgICAgICAgICAgLy8gc3RvcmVzIGluIEphdmEgYWRkaXRpb25hbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgbmF0aXZlIFZpc3VhbGl6ZXIKK307CitzdGF0aWMgZmllbGRzX3QgZmllbGRzOworCitzdHJ1Y3QgdmlzdWFsaXplcl9jYWxsYmFja19jb29raWUgeworICAgIGpjbGFzcyAgICAgIHZpc3VhbGl6ZXJfY2xhc3M7ICAvLyBWaXN1YWxpemVyIGNsYXNzCisgICAgam9iamVjdCAgICAgdmlzdWFsaXplcl9yZWY7ICAgIC8vIFZpc3VhbGl6ZXIgb2JqZWN0IGluc3RhbmNlCisgfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgdmlzdWFsaXplckpuaVN0b3JhZ2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlzdWFsaXplcl9jYWxsYmFja19jb29raWUgbUNhbGxiYWNrRGF0YTsKKworICAgIHZpc3VhbGl6ZXJKbmlTdG9yYWdlKCkgeworICAgIH0KKworICAgIH52aXN1YWxpemVySm5pU3RvcmFnZSgpIHsKKyAgICB9CisKK307CisKKworc3RhdGljIGppbnQgdHJhbnNsYXRlRXJyb3IoaW50IGNvZGUpIHsKKyAgICBzd2l0Y2goY29kZSkgeworICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgIHJldHVybiBWSVNVQUxJWkVSX1NVQ0NFU1M7CisgICAgY2FzZSBBTFJFQURZX0VYSVNUUzoKKyAgICAgICAgcmV0dXJuIFZJU1VBTElaRVJfRVJST1JfQUxSRUFEWV9FWElTVFM7CisgICAgY2FzZSBOT19JTklUOgorICAgICAgICByZXR1cm4gVklTVUFMSVpFUl9FUlJPUl9OT19JTklUOworICAgIGNhc2UgQkFEX1ZBTFVFOgorICAgICAgICByZXR1cm4gVklTVUFMSVpFUl9FUlJPUl9CQURfVkFMVUU7CisgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgcmV0dXJuIFZJU1VBTElaRVJfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgY2FzZSBOT19NRU1PUlk6CisgICAgICAgIHJldHVybiBWSVNVQUxJWkVSX0VSUk9SX05PX01FTU9SWTsKKyAgICBjYXNlIERFQURfT0JKRUNUOgorICAgICAgICByZXR1cm4gVklTVUFMSVpFUl9FUlJPUl9ERUFEX09CSkVDVDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gVklTVUFMSVpFUl9FUlJPUjsKKyAgICB9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgY2FwdHVyZUNhbGxiYWNrKHZvaWQqIHVzZXIsCisgICAgICAgIHVpbnQzMl90IHdhdmVmb3JtU2l6ZSwKKyAgICAgICAgdWludDhfdCAqd2F2ZWZvcm0sCisgICAgICAgIHVpbnQzMl90IGZmdFNpemUsCisgICAgICAgIHVpbnQ4X3QgKmZmdCwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdyYXRlKSB7CisKKyAgICBpbnQgYXJnMSA9IDA7CisgICAgaW50IGFyZzIgPSAwOworICAgIHNpemVfdCBzaXplOworCisgICAgdmlzdWFsaXplcl9jYWxsYmFja19jb29raWUgKmNhbGxiYWNrSW5mbyA9ICh2aXN1YWxpemVyX2NhbGxiYWNrX2Nvb2tpZSAqKXVzZXI7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisKKyAgICBMT0dWKCJjYXB0dXJlQ2FsbGJhY2s6IGNhbGxiYWNrSW5mbyAlcCwgdmlzdWFsaXplcl9yZWYgJXAgdmlzdWFsaXplcl9jbGFzcyAlcCIsCisgICAgICAgICAgICBjYWxsYmFja0luZm8sCisgICAgICAgICAgICBjYWxsYmFja0luZm8tPnZpc3VhbGl6ZXJfcmVmLAorICAgICAgICAgICAgY2FsbGJhY2tJbmZvLT52aXN1YWxpemVyX2NsYXNzKTsKKworICAgIGlmICghdXNlciB8fCAhZW52KSB7CisgICAgICAgIExPR1coImNhcHR1cmVDYWxsYmFjayBlcnJvciB1c2VyICVwLCBlbnYgJXAiLCB1c2VyLCBlbnYpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHdhdmVmb3JtU2l6ZSAhPSAwICYmIHdhdmVmb3JtICE9IE5VTEwpIHsKKyAgICAgICAgamJ5dGVBcnJheSBqQXJyYXkgPSBlbnYtPk5ld0J5dGVBcnJheSh3YXZlZm9ybVNpemUpOworICAgICAgICBpZiAoakFycmF5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGpieXRlICpuQXJyYXkgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGpBcnJheSwgTlVMTCk7CisgICAgICAgICAgICBtZW1jcHkobkFycmF5LCB3YXZlZm9ybSwgd2F2ZWZvcm1TaXplKTsKKyAgICAgICAgICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGpBcnJheSwgbkFycmF5LCAwKTsKKyAgICAgICAgICAgIGVudi0+Q2FsbFN0YXRpY1ZvaWRNZXRob2QoCisgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLT52aXN1YWxpemVyX2NsYXNzLAorICAgICAgICAgICAgICAgIGZpZWxkcy5taWRQb3N0TmF0aXZlRXZlbnQsCisgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLT52aXN1YWxpemVyX3JlZiwKKyAgICAgICAgICAgICAgICBOQVRJVkVfRVZFTlRfUENNX0NBUFRVUkUsCisgICAgICAgICAgICAgICAgc2FtcGxpbmdyYXRlLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgakFycmF5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmZnRTaXplICE9IDAgJiYgZmZ0ICE9IE5VTEwpIHsKKyAgICAgICAgamJ5dGVBcnJheSBqQXJyYXkgPSBlbnYtPk5ld0J5dGVBcnJheShmZnRTaXplKTsKKyAgICAgICAgaWYgKGpBcnJheSAhPSBOVUxMKSB7CisgICAgICAgICAgICBqYnl0ZSAqbkFycmF5ID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhqQXJyYXksIE5VTEwpOworICAgICAgICAgICAgbWVtY3B5KG5BcnJheSwgZmZ0LCBmZnRTaXplKTsKKyAgICAgICAgICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGpBcnJheSwgbkFycmF5LCAwKTsKKyAgICAgICAgICAgIGVudi0+Q2FsbFN0YXRpY1ZvaWRNZXRob2QoCisgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLT52aXN1YWxpemVyX2NsYXNzLAorICAgICAgICAgICAgICAgIGZpZWxkcy5taWRQb3N0TmF0aXZlRXZlbnQsCisgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLT52aXN1YWxpemVyX3JlZiwKKyAgICAgICAgICAgICAgICBOQVRJVkVfRVZFTlRfRkZUX0NBUFRVUkUsCisgICAgICAgICAgICAgICAgc2FtcGxpbmdyYXRlLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgakFycmF5KTsKKyAgICAgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoakFycmF5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgZW52LT5FeGNlcHRpb25EZXNjcmliZSgpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCitzdGF0aWMgVmlzdWFsaXplciAqZ2V0VmlzdWFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCB0aGl6KQoreworICAgIFZpc3VhbGl6ZXIgKnYgPSAoVmlzdWFsaXplciAqKWVudi0+R2V0SW50RmllbGQoCisgICAgICAgIHRoaXosIGZpZWxkcy5maWROYXRpdmVWaXN1YWxpemVyKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgIlVuYWJsZSB0byByZXRyaWV2ZSBWaXN1YWxpemVyIHBvaW50ZXIiKTsKKyAgICB9CisgICAgcmV0dXJuIHY7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoaXMgZnVuY3Rpb24gZ2V0cyBzb21lIGZpZWxkIElEcywgd2hpY2ggaW4gdHVybiBjYXVzZXMgY2xhc3MgaW5pdGlhbGl6YXRpb24uCisvLyBJdCBpcyBjYWxsZWQgZnJvbSBhIHN0YXRpYyBibG9jayBpbiBWaXN1YWxpemVyLCB3aGljaCB3b24ndCBydW4gdW50aWwgdGhlCisvLyBmaXJzdCB0aW1lIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgdXNlZC4KK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX2luaXQoSk5JRW52ICplbnYpCit7CisKKyAgICBMT0dWKCJhbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX2luaXQiKTsKKworICAgIGZpZWxkcy5jbGF6ekVmZmVjdCA9IE5VTEw7CisKKyAgICAvLyBHZXQgdGhlIFZpc3VhbGl6ZXIgY2xhc3MKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcyhrQ2xhc3NQYXRoTmFtZSk7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCAlcyIsIGtDbGFzc1BhdGhOYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZpZWxkcy5jbGF6ekVmZmVjdCA9IChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOworCisgICAgLy8gR2V0IHRoZSBwb3N0RXZlbnQgbWV0aG9kCisgICAgZmllbGRzLm1pZFBvc3ROYXRpdmVFdmVudCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoCisgICAgICAgICAgICBmaWVsZHMuY2xhenpFZmZlY3QsCisgICAgICAgICAgICAicG9zdEV2ZW50RnJvbU5hdGl2ZSIsICIoTGphdmEvbGFuZy9PYmplY3Q7SUlJTGphdmEvbGFuZy9PYmplY3Q7KVYiKTsKKyAgICBpZiAoZmllbGRzLm1pZFBvc3ROYXRpdmVFdmVudCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgVmlzdWFsaXplci4lcyIsICJwb3N0RXZlbnRGcm9tTmF0aXZlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIHZhcmlhYmxlcyBmaWVsZHMKKyAgICAvLyAgICAgIG5hdGl2ZVRyYWNrSW5KYXZhT2JqCisgICAgZmllbGRzLmZpZE5hdGl2ZVZpc3VhbGl6ZXIgPSBlbnYtPkdldEZpZWxkSUQoCisgICAgICAgICAgICBmaWVsZHMuY2xhenpFZmZlY3QsCisgICAgICAgICAgICAibU5hdGl2ZVZpc3VhbGl6ZXIiLCAiSSIpOworICAgIGlmIChmaWVsZHMuZmlkTmF0aXZlVmlzdWFsaXplciA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgVmlzdWFsaXplci4lcyIsICJtTmF0aXZlVmlzdWFsaXplciIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vICAgICAgZmlkSm5pRGF0YTsKKyAgICBmaWVsZHMuZmlkSm5pRGF0YSA9IGVudi0+R2V0RmllbGRJRCgKKyAgICAgICAgICAgIGZpZWxkcy5jbGF6ekVmZmVjdCwKKyAgICAgICAgICAgICJtSm5pRGF0YSIsICJJIik7CisgICAgaWYgKGZpZWxkcy5maWRKbmlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBWaXN1YWxpemVyLiVzIiwgIm1KbmlEYXRhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKK30KKworCitzdGF0aWMgamludAorYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IHdlYWtfdGhpcywKKyAgICAgICAgamludCBzZXNzaW9uSWQsIGppbnRBcnJheSBqSWQpCit7CisgICAgTE9HVigiYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9zZXR1cCIpOworICAgIHZpc3VhbGl6ZXJKbmlTdG9yYWdlKiBscEpuaVN0b3JhZ2UgPSBOVUxMOworICAgIGludCBsU3RhdHVzID0gVklTVUFMSVpFUl9FUlJPUl9OT19NRU1PUlk7CisgICAgVmlzdWFsaXplciogbHBWaXN1YWxpemVyID0gTlVMTDsKKyAgICBqaW50KiBuSWQgPSBOVUxMOworCisgICAgbHBKbmlTdG9yYWdlID0gbmV3IHZpc3VhbGl6ZXJKbmlTdG9yYWdlKCk7CisgICAgaWYgKGxwSm5pU3RvcmFnZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoInNldHVwOiBFcnJvciBjcmVhdGluZyBKTkkgU3RvcmFnZSIpOworICAgICAgICBnb3RvIHNldHVwX2ZhaWx1cmU7CisgICAgfQorCisgICAgbHBKbmlTdG9yYWdlLT5tQ2FsbGJhY2tEYXRhLnZpc3VhbGl6ZXJfY2xhc3MgPSAoamNsYXNzKWVudi0+TmV3R2xvYmFsUmVmKGZpZWxkcy5jbGF6ekVmZmVjdCk7CisgICAgLy8gd2UgdXNlIGEgd2VhayByZWZlcmVuY2Ugc28gdGhlIFZpc3VhbGl6ZXIgb2JqZWN0IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICBscEpuaVN0b3JhZ2UtPm1DYWxsYmFja0RhdGEudmlzdWFsaXplcl9yZWYgPSBlbnYtPk5ld0dsb2JhbFJlZih3ZWFrX3RoaXMpOworCisgICAgTE9HVigic2V0dXA6IGxwSm5pU3RvcmFnZTogJXAgdmlzdWFsaXplcl9yZWYgJXAgdmlzdWFsaXplcl9jbGFzcyAlcCwgJm1DYWxsYmFja0RhdGEgJXAiLAorICAgICAgICAgICAgbHBKbmlTdG9yYWdlLAorICAgICAgICAgICAgbHBKbmlTdG9yYWdlLT5tQ2FsbGJhY2tEYXRhLnZpc3VhbGl6ZXJfcmVmLAorICAgICAgICAgICAgbHBKbmlTdG9yYWdlLT5tQ2FsbGJhY2tEYXRhLnZpc3VhbGl6ZXJfY2xhc3MsCisgICAgICAgICAgICAmbHBKbmlTdG9yYWdlLT5tQ2FsbGJhY2tEYXRhKTsKKworICAgIGlmIChqSWQpIHsKKyAgICAgICAgbklkID0gKGppbnQgKikgZW52LT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGpJZCwgTlVMTCk7CisgICAgICAgIGlmIChuSWQgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgic2V0dXA6IEVycm9yIHJldHJpZXZpbmcgaWQgcG9pbnRlciIpOworICAgICAgICAgICAgbFN0YXR1cyA9IFZJU1VBTElaRVJfRVJST1JfQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBzZXR1cF9mYWlsdXJlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgic2V0dXA6IE5VTEwgamF2YSBhcnJheSBmb3IgaWQgcG9pbnRlciIpOworICAgICAgICBsU3RhdHVzID0gVklTVUFMSVpFUl9FUlJPUl9CQURfVkFMVUU7CisgICAgICAgIGdvdG8gc2V0dXBfZmFpbHVyZTsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdGhlIG5hdGl2ZSBWaXN1YWxpemVyIG9iamVjdAorICAgIGxwVmlzdWFsaXplciA9IG5ldyBWaXN1YWxpemVyKDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgaWYgKGxwVmlzdWFsaXplciA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkVycm9yIGNyZWF0aW5nIFZpc3VhbGl6ZXIiKTsKKyAgICAgICAgZ290byBzZXR1cF9mYWlsdXJlOworICAgIH0KKworICAgIGxTdGF0dXMgPSB0cmFuc2xhdGVFcnJvcihscFZpc3VhbGl6ZXItPmluaXRDaGVjaygpKTsKKyAgICBpZiAobFN0YXR1cyAhPSBWSVNVQUxJWkVSX1NVQ0NFU1MgJiYgbFN0YXR1cyAhPSBWSVNVQUxJWkVSX0VSUk9SX0FMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgIExPR0UoIlZpc3VhbGl6ZXIgaW5pdENoZWNrIGZhaWxlZCAlZCIsIGxTdGF0dXMpOworICAgICAgICBnb3RvIHNldHVwX2ZhaWx1cmU7CisgICAgfQorCisgICAgbklkWzBdID0gbHBWaXN1YWxpemVyLT5pZCgpOworCisgICAgZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChqSWQsIG5JZCwgMCk7CisgICAgbklkID0gTlVMTDsKKworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRzLmZpZE5hdGl2ZVZpc3VhbGl6ZXIsIChpbnQpbHBWaXN1YWxpemVyKTsKKworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRzLmZpZEpuaURhdGEsIChpbnQpbHBKbmlTdG9yYWdlKTsKKworICAgIHJldHVybiBWSVNVQUxJWkVSX1NVQ0NFU1M7CisKKyAgICAvLyBmYWlsdXJlczoKK3NldHVwX2ZhaWx1cmU6CisKKyAgICBpZiAobklkICE9IE5VTEwpIHsKKyAgICAgICAgZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChqSWQsIG5JZCwgMCk7CisgICAgfQorCisgICAgaWYgKGxwVmlzdWFsaXplcikgeworICAgICAgICBkZWxldGUgbHBWaXN1YWxpemVyOworICAgIH0KKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkcy5maWROYXRpdmVWaXN1YWxpemVyLCAwKTsKKworICAgIGlmIChscEpuaVN0b3JhZ2UpIHsKKyAgICAgICAgZGVsZXRlIGxwSm5pU3RvcmFnZTsKKyAgICB9CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZHMuZmlkSm5pRGF0YSwgMCk7CisKKyAgICByZXR1cm4gbFN0YXR1czsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9maW5hbGl6ZShKTklFbnYgKmVudiwgIGpvYmplY3QgdGhpeikgeworICAgIExPR1YoImFuZHJvaWRfbWVkaWFfdmlzdWFsaXplcl9uYXRpdmVfZmluYWxpemUgam9iamVjdDogJXhcbiIsIChpbnQpdGhpeik7CisKKyAgICAvLyBkZWxldGUgdGhlIFZpc3VhbGl6ZXIgb2JqZWN0CisgICAgVmlzdWFsaXplciogbHBWaXN1YWxpemVyID0gKFZpc3VhbGl6ZXIgKillbnYtPkdldEludEZpZWxkKAorICAgICAgICB0aGl6LCBmaWVsZHMuZmlkTmF0aXZlVmlzdWFsaXplcik7CisgICAgaWYgKGxwVmlzdWFsaXplcikgeworICAgICAgICBMT0dWKCJkZWxldGluZyBWaXN1YWxpemVyOiAleFxuIiwgKGludClscFZpc3VhbGl6ZXIpOworICAgICAgICBkZWxldGUgbHBWaXN1YWxpemVyOworICAgIH0KKworICAgIC8vIGRlbGV0ZSB0aGUgSk5JIGRhdGEKKyAgICB2aXN1YWxpemVySm5pU3RvcmFnZSogbHBKbmlTdG9yYWdlID0gKHZpc3VhbGl6ZXJKbmlTdG9yYWdlICopZW52LT5HZXRJbnRGaWVsZCgKKyAgICAgICAgdGhpeiwgZmllbGRzLmZpZEpuaURhdGEpOworICAgIGlmIChscEpuaVN0b3JhZ2UpIHsKKyAgICAgICAgTE9HVigiZGVsZXRpbmcgcEpuaVN0b3JhZ2U6ICV4XG4iLCAoaW50KWxwSm5pU3RvcmFnZSk7CisgICAgICAgIGRlbGV0ZSBscEpuaVN0b3JhZ2U7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBhbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX3JlbGVhc2UoSk5JRW52ICplbnYsICBqb2JqZWN0IHRoaXopIHsKKworICAgIC8vIGRvIGV2ZXJ5dGhpbmcgYSBjYWxsIHRvIGZpbmFsaXplIHdvdWxkCisgICAgYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9maW5hbGl6ZShlbnYsIHRoaXopOworICAgIC8vICsgcmVzZXQgdGhlIG5hdGl2ZSByZXNvdXJjZXMgaW4gdGhlIEphdmEgb2JqZWN0IHNvIGFueSBhdHRlbXB0IHRvIGFjY2VzcworICAgIC8vIHRoZW0gYWZ0ZXIgYSBjYWxsIHRvIHJlbGVhc2UgZmFpbHMuCisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZHMuZmlkTmF0aXZlVmlzdWFsaXplciwgMCk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZHMuZmlkSm5pRGF0YSwgMCk7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX3NldEVuYWJsZWQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamJvb2xlYW4gZW5hYmxlZCkKK3sKKyAgICBWaXN1YWxpemVyKiBscFZpc3VhbGl6ZXIgPSBnZXRWaXN1YWxpemVyKGVudiwgdGhpeik7CisgICAgaWYgKGxwVmlzdWFsaXplciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBWSVNVQUxJWkVSX0VSUk9SX05PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yKGxwVmlzdWFsaXplci0+c2V0RW5hYmxlZChlbmFibGVkKSk7Cit9CisKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9nZXRFbmFibGVkKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgVmlzdWFsaXplciogbHBWaXN1YWxpemVyID0gZ2V0VmlzdWFsaXplcihlbnYsIHRoaXopOworICAgIGlmIChscFZpc3VhbGl6ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIChqYm9vbGVhbilscFZpc3VhbGl6ZXItPmdldEVuYWJsZWQoKTsKK30KKworc3RhdGljIGppbnRBcnJheQorYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9nZXRDYXB0dXJlU2l6ZVJhbmdlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgamludEFycmF5IGpSYW5nZSA9IGVudi0+TmV3SW50QXJyYXkoMik7CisgICAgamludCAqblJhbmdlID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGpSYW5nZSwgTlVMTCk7CisgICAgblJhbmdlWzBdID0gVmlzdWFsaXplcjo6Z2V0TWluQ2FwdHVyZVNpemUoKTsKKyAgICBuUmFuZ2VbMV0gPSBWaXN1YWxpemVyOjpnZXRNYXhDYXB0dXJlU2l6ZSgpOworICAgIExPR1YoImdldENhcHR1cmVTaXplUmFuZ2UoKSBtaW4gJWQgbWF4ICVkIiwgblJhbmdlWzBdLCBuUmFuZ2VbMV0pOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoalJhbmdlLCBuUmFuZ2UsIDApOworICAgIHJldHVybiBqUmFuZ2U7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX2dldE1heENhcHR1cmVSYXRlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgcmV0dXJuIFZpc3VhbGl6ZXI6OmdldE1heENhcHR1cmVSYXRlKCk7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX3NldENhcHR1cmVTaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgc2l6ZSkKK3sKKyAgICBWaXN1YWxpemVyKiBscFZpc3VhbGl6ZXIgPSBnZXRWaXN1YWxpemVyKGVudiwgdGhpeik7CisgICAgaWYgKGxwVmlzdWFsaXplciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBWSVNVQUxJWkVSX0VSUk9SX05PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yKGxwVmlzdWFsaXplci0+c2V0Q2FwdHVyZVNpemUoc2l6ZSkpOworfQorCitzdGF0aWMgamludAorYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9nZXRDYXB0dXJlU2l6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIFZpc3VhbGl6ZXIqIGxwVmlzdWFsaXplciA9IGdldFZpc3VhbGl6ZXIoZW52LCB0aGl6KTsKKyAgICBpZiAobHBWaXN1YWxpemVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbHBWaXN1YWxpemVyLT5nZXRDYXB0dXJlU2l6ZSgpOworfQorCitzdGF0aWMgamludAorYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9nZXRTYW1wbGluZ1JhdGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBWaXN1YWxpemVyKiBscFZpc3VhbGl6ZXIgPSBnZXRWaXN1YWxpemVyKGVudiwgdGhpeik7CisgICAgaWYgKGxwVmlzdWFsaXplciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGxwVmlzdWFsaXplci0+Z2V0U2FtcGxpbmdSYXRlKCk7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX2dldFdhdmVGb3JtKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpieXRlQXJyYXkgaldhdmVmb3JtKQoreworICAgIFZpc3VhbGl6ZXIqIGxwVmlzdWFsaXplciA9IGdldFZpc3VhbGl6ZXIoZW52LCB0aGl6KTsKKyAgICBpZiAobHBWaXN1YWxpemVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZJU1VBTElaRVJfRVJST1JfTk9fSU5JVDsKKyAgICB9CisKKyAgICBqYnl0ZSogbldhdmVmb3JtID0gKGpieXRlICopIGVudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChqV2F2ZWZvcm0sIE5VTEwpOworICAgIGlmIChuV2F2ZWZvcm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVklTVUFMSVpFUl9FUlJPUl9OT19NRU1PUlk7CisgICAgfQorICAgIGppbnQgc3RhdHVzID0gdHJhbnNsYXRlRXJyb3IobHBWaXN1YWxpemVyLT5nZXRXYXZlRm9ybSgodWludDhfdCAqKW5XYXZlZm9ybSkpOworCisgICAgZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChqV2F2ZWZvcm0sIG5XYXZlZm9ybSwgMCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgamludAorYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9nZXRGZnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamJ5dGVBcnJheSBqRmZ0KQoreworICAgIFZpc3VhbGl6ZXIqIGxwVmlzdWFsaXplciA9IGdldFZpc3VhbGl6ZXIoZW52LCB0aGl6KTsKKyAgICBpZiAobHBWaXN1YWxpemVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZJU1VBTElaRVJfRVJST1JfTk9fSU5JVDsKKyAgICB9CisKKyAgICBqYnl0ZSogbkZmdCA9IChqYnl0ZSAqKSBlbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoakZmdCwgTlVMTCk7CisgICAgaWYgKG5GZnQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVklTVUFMSVpFUl9FUlJPUl9OT19NRU1PUlk7CisgICAgfQorICAgIGppbnQgc3RhdHVzID0gdHJhbnNsYXRlRXJyb3IobHBWaXN1YWxpemVyLT5nZXRGZnQoKHVpbnQ4X3QgKiluRmZ0KSk7CisKKyAgICBlbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGpGZnQsIG5GZnQsIDApOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGppbnQKK2FuZHJvaWRfbWVkaWFfc2V0UGVyaW9kaWNDYXB0dXJlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgcmF0ZSwgamJvb2xlYW4galdhdmVmb3JtLCBqYm9vbGVhbiBqRmZ0KQoreworICAgIFZpc3VhbGl6ZXIqIGxwVmlzdWFsaXplciA9IGdldFZpc3VhbGl6ZXIoZW52LCB0aGl6KTsKKyAgICBpZiAobHBWaXN1YWxpemVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZJU1VBTElaRVJfRVJST1JfTk9fSU5JVDsKKyAgICB9CisgICAgdmlzdWFsaXplckpuaVN0b3JhZ2UqIGxwSm5pU3RvcmFnZSA9ICh2aXN1YWxpemVySm5pU3RvcmFnZSAqKWVudi0+R2V0SW50RmllbGQodGhpeiwKKyAgICAgICAgICAgIGZpZWxkcy5maWRKbmlEYXRhKTsKKyAgICBpZiAobHBKbmlTdG9yYWdlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZJU1VBTElaRVJfRVJST1JfTk9fSU5JVDsKKyAgICB9CisKKyAgICBMT0dWKCJzZXRQZXJpb2RpY0NhcHR1cmU6IHJhdGUgJWQsIGpXYXZlZm9ybSAlZCBqRmZ0ICVkIiwKKyAgICAgICAgICAgIHJhdGUsCisgICAgICAgICAgICBqV2F2ZWZvcm0sCisgICAgICAgICAgICBqRmZ0KTsKKworICAgIHVpbnQzMl90IGZsYWdzID0gVmlzdWFsaXplcjo6Q0FQVFVSRV9DQUxMX0pBVkE7CisgICAgaWYgKGpXYXZlZm9ybSkgZmxhZ3MgfD0gVmlzdWFsaXplcjo6Q0FQVFVSRV9XQVZFRk9STTsKKyAgICBpZiAoakZmdCkgZmxhZ3MgfD0gVmlzdWFsaXplcjo6Q0FQVFVSRV9GRlQ7CisgICAgVmlzdWFsaXplcjo6Y2FwdHVyZV9jYmtfdCBjYmsgPSBjYXB0dXJlQ2FsbGJhY2s7CisgICAgaWYgKCFqV2F2ZWZvcm0gJiYgIWpGZnQpIGNiayA9IE5VTEw7CisKKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3IobHBWaXN1YWxpemVyLT5zZXRDYXB0dXJlQ2FsbEJhY2soY2JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxwSm5pU3RvcmFnZS0+bUNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIERhbHZpayBWTSB0eXBlIHNpZ25hdHVyZXMKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9pbml0IiwgICAgICAgICAgICAiKClWIiwgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9pbml0fSwKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAiKExqYXZhL2xhbmcvT2JqZWN0O0lbSSlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICAiKClWIiwgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfdmlzdWFsaXplcl9uYXRpdmVfZmluYWxpemV9LAorICAgIHsibmF0aXZlX3JlbGVhc2UiLCAgICAgICAgICAgIigpViIsICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX3JlbGVhc2V9LAorICAgIHsibmF0aXZlX3NldEVuYWJsZWQiLCAgICAgICAgIihaKUkiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX3NldEVuYWJsZWR9LAorICAgIHsibmF0aXZlX2dldEVuYWJsZWQiLCAgICAgICAgIigpWiIsICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX2dldEVuYWJsZWR9LAorICAgIHsiZ2V0Q2FwdHVyZVNpemVSYW5nZSIsICAgICAgIigpW0kiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX2dldENhcHR1cmVTaXplUmFuZ2V9LAorICAgIHsiZ2V0TWF4Q2FwdHVyZVJhdGUiLCAgICAgICAgIigpSSIsICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX2dldE1heENhcHR1cmVSYXRlfSwKKyAgICB7Im5hdGl2ZV9zZXRDYXB0dXJlU2l6ZSIsICAgICIoSSlJIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV92aXN1YWxpemVyX25hdGl2ZV9zZXRDYXB0dXJlU2l6ZX0sCisgICAgeyJuYXRpdmVfZ2V0Q2FwdHVyZVNpemUiLCAgICAiKClJIiwgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfdmlzdWFsaXplcl9uYXRpdmVfZ2V0Q2FwdHVyZVNpemV9LAorICAgIHsibmF0aXZlX2dldFNhbXBsaW5nUmF0ZSIsICAgIigpSSIsICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX2dldFNhbXBsaW5nUmF0ZX0sCisgICAgeyJuYXRpdmVfZ2V0V2F2ZUZvcm0iLCAgICAgICAiKFtCKUkiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfdmlzdWFsaXplcl9uYXRpdmVfZ2V0V2F2ZUZvcm19LAorICAgIHsibmF0aXZlX2dldEZmdCIsICAgICAgICAgICAgIihbQilJIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX3Zpc3VhbGl6ZXJfbmF0aXZlX2dldEZmdH0sCisgICAgeyJuYXRpdmVfc2V0UGVyaW9kaWNDYXB0dXJlIiwiKElaWilJIiwodm9pZCAqKWFuZHJvaWRfbWVkaWFfc2V0UGVyaW9kaWNDYXB0dXJlfSwKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfdmlzdWFsaXplcihKTklFbnYgKmVudikKK3sKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsIGtDbGFzc1BhdGhOYW1lLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLm1rCmluZGV4IGI1ZjFkNDIuLjU0ZTg3ZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQubWsKQEAgLTk0LDMgKzk0LDMzIEBACiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKIGVuZGlmCisKKworIyBWaXN1YWxpemVyIGxpYnJhcnkKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJRWZmZWN0VmlzdWFsaXplci5jcHAKKworTE9DQUxfQ0ZMQUdTKz0gLU8yCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscworCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvc291bmRmeAorTE9DQUxfTU9EVUxFOj0gbGlidmlzdWFsaXplcgorCitpZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2VuZGlmCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCitlbmRpZgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdEVxdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdEVxdWFsaXplci5jcHAKaW5kZXggZDE5YzZiOS4uYWYwYzQxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RFcXVhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvRWZmZWN0RXF1YWxpemVyLmNwcApAQCAtMzAsNiArMzAsMTIgQEAKIC8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGVxdWFsaXplciBlZmZlY3QKIGV4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnRXF1YWxpemVySW50ZXJmYWNlOwogCitlbnVtIGVxdWFsaXplcl9zdGF0ZV9lIHsKKyAgICBFUVVBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRCwKKyAgICBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQsCisgICAgRVFVQUxJWkVSX1NUQVRFX0FDVElWRSwKK307CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB7CiAKQEAgLTEwMCw2ICsxMDYsNyBAQAogICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CiAgICAgRm9ybWF0QWRhcHRlciBhZGFwdGVyOwogICAgIEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplcjsKKyAgICB1aW50MzJfdCBzdGF0ZTsKIH07CiAKIC8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKQEAgLTE1MSw2ICsxNTgsNyBAQAogCiAgICAgcENvbnRleHQtPml0ZmUgPSAmZ0VxdWFsaXplckludGVyZmFjZTsKICAgICBwQ29udGV4dC0+cEVxdWFsaXplciA9IE5VTEw7CisgICAgcENvbnRleHQtPnN0YXRlID0gRVFVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQ7CiAKICAgICByZXQgPSBFcXVhbGl6ZXJfaW5pdChwQ29udGV4dCk7CiAgICAgaWYgKHJldCA8IDApIHsKQEAgLTE2MCw2ICsxNjgsNyBAQAogICAgIH0KIAogICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKyAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQ7CiAKICAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QgJXAsIHNpemUgJWQiLCBwQ29udGV4dCwgQXVkaW9FcXVhbGl6ZXI6OkdldEluc3RhbmNlU2l6ZShrTnVtQmFuZHMpK3NpemVvZihFcXVhbGl6ZXJDb250ZXh0KSk7CiAKQEAgLTE3NSw2ICsxODQsNyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRDsKICAgICBwQ29udGV4dC0+cEVxdWFsaXplci0+ZnJlZSgpOwogICAgIGRlbGV0ZSBwQ29udGV4dDsKIApAQCAtNTI4LDYgKzUzOCwxMyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBpZiAocENvbnRleHQtPnN0YXRlID09IEVRVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAocENvbnRleHQtPnN0YXRlID09IEVRVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgfQorCiAgICAgcENvbnRleHQtPmFkYXB0ZXIucHJvY2VzcyhpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50KTsKIAogICAgIHJldHVybiAwOwpAQCAtNTM5LDcgKzU1Niw3IEBACiAgICAgYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKikgc2VsZjsKICAgICBpbnQgcmV0c2l6ZTsKIAotICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcENvbnRleHQtPnN0YXRlID09IEVRVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtNTk0LDEwICs2MTEsMjUgQEAKICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOwogICAgICAgICB9IGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5zdGF0ZSAhPSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5zdGF0ZSA9IEVRVUFMSVpFUl9TVEFURV9BQ1RJVkU7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRU5BQkxFKCkgT0siKTsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0RJU0FCTEU6CiAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5zdGF0ZSAhPSBFUVVBTElaRVJfU1RBVEVfQUNUSVZFKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQ7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRElTQUJMRSgpIE9LIik7CiAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RSZXZlcmIuYyBiL21lZGlhL2xpYmVmZmVjdHMvRWZmZWN0UmV2ZXJiLmMKaW5kZXggYWRhMjUyYy4uMmNlNzU1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RSZXZlcmIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdFJldmVyYi5jCkBAIC0xNSw4ICsxNSw3IEBACiAgKi8KIAogI2RlZmluZSBMT0dfVEFHICJFZmZlY3RSZXZlcmIiCi0vLwotI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC01Nyw3ICs1Niw3IEBACiAKIC8vIEdvb2dsZSBhdXhpbGlhcnkgcHJlc2V0IHJldmVyYiBVVUlEOiA2MzkwOTMyMC01M2E2LTExZGYtYmRiZC0wMDAyYTVkNWM1MWIKIHN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdBdXhQcmVzZXRSZXZlcmJEZXNjcmlwdG9yID0gewotICAgICAgICB7MHg0NzM4MmQ2MCwgMHhkZGQ4LCAweDQ3NjMsIDB4MTFkYiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgezB4NDczODJkNjAsIDB4ZGRkOCwgMHgxMWRiLCAweGJmM2EsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCiAgICAgICAgIHsweDYzOTA5MzIwLCAweDUzYTYsIDB4MTFkZiwgMHhiZGJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCiAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZLApAQCAtNjksNyArNjgsNyBAQAogCiAvLyBHb29nbGUgaW5zZXJ0IHByZXNldCByZXZlcmIgVVVJRDogZDkzZGM2YTAtNjM0Mi0xMWRmLWIxMjgtMDAwMmE1ZDVjNTFiCiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciA9IHsKLSAgICAgICAgezB4NDczODJkNjAsIDB4ZGRkOCwgMHg0NzYzLCAweDExZGIsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIHsweDQ3MzgyZDYwLCAweGRkZDgsIDB4MTFkYiwgMHhiZjNhLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICB7MHhkOTNkYzZhMCwgMHg2MzQyLCAweDExZGYsIDB4YjEyOCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwKQEAgLTE0Myw2ICsxNDIsOCBAQAogCiAgICAgbW9kdWxlLT5pdGZlID0gJmdSZXZlcmJJbnRlcmZhY2U7CiAKKyAgICBtb2R1bGUtPmNvbnRleHQubVN0YXRlID0gUkVWRVJCX1NUQVRFX1VOSU5JVElBTElaRUQ7CisKICAgICBpZiAobWVtY21wKCZkZXNjLT50eXBlLCBTTF9JSURfUFJFU0VUUkVWRVJCLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKICAgICAgICAgcHJlc2V0ID0gMTsKICAgICB9CkBAIC0xNTgsNiArMTU5LDggQEAKIAogICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdCkgbW9kdWxlOwogCisgICAgbW9kdWxlLT5jb250ZXh0Lm1TdGF0ZSA9IFJFVkVSQl9TVEFURV9JTklUSUFMSVpFRDsKKwogICAgIExPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCAlcCAsc2l6ZSAlZCIsIG1vZHVsZSwgc2l6ZW9mKHJldmVyYl9tb2R1bGVfdCkpOwogCiAgICAgcmV0dXJuIDA7CkBAIC0xNzEsNiArMTc0LDggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgcFJ2Yk1vZHVsZS0+Y29udGV4dC5tU3RhdGUgPSBSRVZFUkJfU1RBVEVfVU5JTklUSUFMSVpFRDsKKwogICAgIGZyZWUocFJ2Yk1vZHVsZSk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xOTUsOCArMjAwLDE1IEBACiAKICAgICBwUmV2ZXJiID0gKHJldmVyYl9vYmplY3RfdCopICZwUnZiTW9kdWxlLT5jb250ZXh0OwogCisgICAgaWYgKHBSZXZlcmItPm1TdGF0ZSA9PSBSRVZFUkJfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHBSZXZlcmItPm1TdGF0ZSA9PSBSRVZFUkJfU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9EQVRBOworICAgIH0KKwogICAgIC8vaWYgYnlwYXNzZWQgb3IgdGhlIHByZXNldCBmb3JjZXMgdGhlIHNpZ25hbCB0byBiZSBjb21wbGV0ZWx5IGRyeQotICAgIGlmIChwUmV2ZXJiLT5tX2JCeXBhc3MpIHsKKyAgICBpZiAocFJldmVyYi0+bV9iQnlwYXNzICE9IDApIHsKICAgICAgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKICAgICAgICAgICAgIGludDE2X3Qgc21wOwogICAgICAgICAgICAgcFNyYyA9IGluQnVmZmVyLT5zMTY7CkBAIC0yNTcsMTMgKzI2OSwxNSBAQAogICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyBpbnQgUmV2ZXJiX0NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIGludCBjbWRDb2RlLCBpbnQgY21kU2l6ZSwKICAgICAgICAgdm9pZCAqcENtZERhdGEsIGludCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CiAgICAgcmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlID0gKHJldmVyYl9tb2R1bGVfdCAqKSBzZWxmOwogICAgIHJldmVyYl9vYmplY3RfdCAqcFJldmVyYjsKICAgICBpbnQgcmV0c2l6ZTsKIAotICAgIGlmIChwUnZiTW9kdWxlID09IE5VTEwpIHsKKyAgICBpZiAocFJ2Yk1vZHVsZSA9PSBOVUxMIHx8CisgICAgICAgICAgICBwUnZiTW9kdWxlLT5jb250ZXh0Lm1TdGF0ZSA9PSBSRVZFUkJfU1RBVEVfVU5JTklUSUFMSVpFRCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTI3Nyw2ICsyOTEsOSBAQAogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IFJldmVyYl9Jbml0KHBSdmJNb2R1bGUsIHBSZXZlcmItPm1fQXV4LCBwUmV2ZXJiLT5tX1ByZXNldCk7CisgICAgICAgIGlmICgqKGludCAqKSBwUmVwbHlEYXRhID09IDApIHsKKyAgICAgICAgICAgIHBSdmJNb2R1bGUtPmNvbnRleHQubVN0YXRlID0gUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVEOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0NNRF9DT05GSUdVUkU6CiAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKQEAgLTMxNSwxMCArMzMyLDI1IEBACiAgICAgICAgICAgICAgICAgY21kLT52c2l6ZSwgY21kLT5kYXRhICsgc2l6ZW9mKGludDMyX3QpKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocFJldmVyYi0+bVN0YXRlICE9IFJFVkVSQl9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgICAgIH0KKyAgICAgICAgcFJldmVyYi0+bVN0YXRlID0gUkVWRVJCX1NUQVRFX0FDVElWRTsKKyAgICAgICAgTE9HVigiRUZGRUNUX0NNRF9FTkFCTEUoKSBPSyIpOworICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICBicmVhazsKICAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQorICAgICAgICBpZiAocFJldmVyYi0+bVN0YXRlICE9IFJFVkVSQl9TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBSZXZlcmItPm1TdGF0ZSA9IFJFVkVSQl9TVEFURV9JTklUSUFMSVpFRDsKKyAgICAgICAgTE9HVigiRUZGRUNUX0NNRF9ESVNBQkxFKCkgT0siKTsKICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6CkBAIC01MjAsNyArNTUyLDcgQEAKICAgICAgICAgcFJldmVyYi0+bV9iVXNlTm9pc2UgPSB0cnVlOwogCiAgICAgICAgIC8vIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGFsbG93IGJ5cGFzcwotICAgICAgICBwUmV2ZXJiLT5tX2JCeXBhc3MgPSBmYWxzZTsKKyAgICAgICAgcFJldmVyYi0+bV9iQnlwYXNzID0gMDsKIAogICAgICAgICBwUmV2ZXJiLT5tX25OZXh0Um9vbSA9IDE7CiAKQEAgLTY2MiwyNDggKzY5NCwyNTQgQEAKICAgICBpbnQzMl90IHRlbXAyOwogICAgIHNpemVfdCBzaXplOwogCi0gICAgaWYgKHBSZXZlcmItPm1fUHJlc2V0ICYmIHBhcmFtICE9IFJFVkVSQl9QQVJBTV9QUkVTRVQpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmICghcFJldmVyYi0+bV9QcmVzZXQgJiYgcGFyYW0gPT0gUkVWRVJCX1BBUkFNX1BSRVNFVCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHBhcmFtKSB7Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTDoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgotICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ESUZGVVNJT046Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKKyAgICBpZiAocFJldmVyYi0+bV9QcmVzZXQpIHsKKyAgICAgICAgaWYgKHBhcmFtICE9IFJFVkVSQl9QQVJBTV9QUkVTRVQgfHwgKnBTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQogICAgICAgICBzaXplID0gc2l6ZW9mKGludDE2X3QpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgUkVWRVJCX1BBUkFNX0JZUEFTUzoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUkVTRVQ6Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6Ci0gICAgICAgIHNpemUgPSBzaXplb2YoaW50MzJfdCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUzoKLSAgICAgICAgc2l6ZSA9IHNpemVvZih0X3JldmVyYl9wcm9wZXJ0aWVzKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoKnBTaXplIDwgc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgKnBTaXplID0gc2l6ZTsKLSAgICBwVmFsdWUzMiA9IChpbnQzMl90ICopIHBWYWx1ZTsKLSAgICBwVmFsdWUxNiA9IChpbnQxNl90ICopIHBWYWx1ZTsKLSAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9wcm9wZXJ0aWVzICopIHBWYWx1ZTsKLQotICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9CWVBBU1M6Ci0gICAgICAgICooaW50MzJfdCAqKSBwVmFsdWUgPSAoaW50MzJfdCkgcFJldmVyYi0+bV9iQnlwYXNzOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUkVTRVQ6Ci0gICAgICAgICooaW50MzJfdCAqKSBwVmFsdWUgPSAoaW50OF90KSBwUmV2ZXJiLT5tX25DdXJyZW50Um9vbTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgotICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+cm9vbUxldmVsOwotICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KLQotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6Ci0gICAgICAgIC8vIENvbnZlcnQgbV9uUm9vbUxwZkZ3ZCB0byBtaWxsaWJlbHMKLSAgICAgICAgdGVtcCA9IChwUmV2ZXJiLT5tX25Sb29tTHBmRndkIDw8IDE1KQotICAgICAgICAgICAgICAgIC8gKDMyNzY3IC0gcFJldmVyYi0+bV9uUm9vbUxwZkZiayk7Ci0gICAgICAgICpwVmFsdWUxNiA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyh0ZW1wKTsKLQotICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwgJWQsIGdhaW4gJWQsIG1fblJvb21McGZGd2QgJWQsIG1fblJvb21McGZGYmsgJWQiLCAqcFZhbHVlMTYsIHRlbXAsIHBSZXZlcmItPm1fblJvb21McGZGd2QsIHBSZXZlcmItPm1fblJvb21McGZGYmspOwotCi0gICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcFZhbHVlMTYgPSAmcFByb3BlcnRpZXMtPnJvb21IRkxldmVsOwotICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KLQotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUw6Ci0gICAgICAgIC8vIFRoZSByYXRpbyBiZXR3ZWVuIGxpbmVhciBnYWluIGF0IDBIeiBhbmQgYXQgNTAwMEh6IGZvciB0aGUgcm9vbSBsb3cgcGFzcyBpczoKLSAgICAgICAgLy8gKDEgKyBhMSkgLyBzcXJ0KGExXjIgKyAyKkMqYTEgKyAxKSB3aGVyZToKLSAgICAgICAgLy8gLSBhMSBpcyBtaW51cyB0aGUgTFAgZmVlZGJhY2sgZ2FpbjogLXBSZXZlcmItPm1fblJvb21McGZGYmsKLSAgICAgICAgLy8gLSBDIGlzIGNvcygycGlXVCkgQCA1MDAwSHo6IHBSZXZlcmItPm1fbkNvc1dUXzVLSHoKLQotICAgICAgICB0ZW1wID0gTVVMVF9FRzFfRUcxKHBSZXZlcmItPm1fblJvb21McGZGYmssIHBSZXZlcmItPm1fblJvb21McGZGYmspOwotICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIGExXjIgJWQiLCB0ZW1wKTsKLSAgICAgICAgdGVtcDIgPSBNVUxUX0VHMV9FRzEocFJldmVyYi0+bV9uUm9vbUxwZkZiaywgcFJldmVyYi0+bV9uQ29zV1RfNUtIeikKLSAgICAgICAgICAgICAgICA8PCAxOwotICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIDIgQ29zIGExICVkIiwgdGVtcDIpOwotICAgICAgICB0ZW1wID0gMzI3NjcgKyB0ZW1wIC0gdGVtcDI7Ci0gICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgYTFeMiArIDIgQ29zIGExICsgMSAlZCIsIHRlbXApOwotICAgICAgICB0ZW1wID0gRWZmZWN0c19TcXJ0KHRlbXApICogMTgxOwotICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIFNRUlQoYTFeMiArIDIgQ29zIGExICsgMSkgJWQiLCB0ZW1wKTsKLSAgICAgICAgdGVtcCA9ICgoMzI3NjcgLSBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrKSA8PCAxNSkgLyB0ZW1wOwotCi0gICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgZ2FpbiAlZCwgbV9uUm9vbUxwZkZ3ZCAlZCwgbV9uUm9vbUxwZkZiayAlZCIsIHRlbXAsIHBSZXZlcmItPm1fblJvb21McGZGd2QsIHBSZXZlcmItPm1fblJvb21McGZGYmspOwotCi0gICAgICAgICpwVmFsdWUxNiA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyh0ZW1wKTsKLQotICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBWYWx1ZTMyID0gJnBQcm9wZXJ0aWVzLT5kZWNheVRpbWU7Ci0gICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLwotCi0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLSAgICAgICAgLy8gQ2FsY3VsYXRlIHJldmVyYiBmZWVkYmFjayBwYXRoIGdhaW4KLSAgICAgICAgdGVtcCA9IChwUmV2ZXJiLT5tX25SdmJMcGZGd2QgPDwgMTUpIC8gKDMyNzY3IC0gcFJldmVyYi0+bV9uUnZiTHBmRmJrKTsKLSAgICAgICAgdGVtcCA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyh0ZW1wKTsKLQotICAgICAgICAvLyBDYWxjdWxhdGUgZGVjYXkgdGltZTogZyA9IC02MDAwIGQvRFQgLCBnIGdhaW4gaW4gbWlsbGliZWxzLCBkIHJldmVyYiBkZWxheSwgRFQgZGVjYXkgdGltZQotICAgICAgICB0ZW1wID0gKC02MDAwICogcFJldmVyYi0+bV9uTGF0ZURlbGF5KSAvIHRlbXA7Ci0KLSAgICAgICAgLy8gQ29udmVydCBzYW1wbGVzIHRvIG1zCi0gICAgICAgICpwVmFsdWUzMiA9ICh0ZW1wICogMTAwMCkgLyBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGU7Ci0KLSAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FLCBzYW1wbGVzICVkLCBtcyAlZCIsIHRlbXAsICpwVmFsdWUzMik7Ci0KLSAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+ZGVjYXlIRlJhdGlvOwotICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KLQotICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgotICAgICAgICAvLyBJZiByIGlzIHRoZSBkZWNheSBIRiByYXRpbyAgKHIgPSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8vMTAwMCkgd2UgaGF2ZToKLSAgICAgICAgLy8gICAgICAgRFRfNTAwMEh6ID0gRFRfMEh6ICogcgotICAgICAgICAvLyAgYW5kICBHXzUwMDBIeiA9IC02MDAwICogZCAvIERUXzUwMDBIeiBhbmQgR18wSHogPSAtNjAwMCAqIGQgLyBEVF8wSHogaW4gbWlsbGliZWxzIHNvIDoKLSAgICAgICAgLy8gciA9IEdfMEh6L0dfNTAwMEh6IGluIG1pbGxpYmVscwotICAgICAgICAvLyBUaGUgbGluZWFyIGdhaW4gYXQgNTAwMEh6IGlzIGIwIC8gc3FydChhMV4yICsgMipDKmExICsgMSkgd2hlcmU6Ci0gICAgICAgIC8vIC0gYTEgaXMgbWludXMgdGhlIExQIGZlZWRiYWNrIGdhaW46IC1wUmV2ZXJiLT5tX25SdmJMcGZGYmsKLSAgICAgICAgLy8gLSBiMCBpcyB0aGUgTFAgZm9yd2FyZCBnYWluOiBwUmV2ZXJiLT5tX25SdmJMcGZGd2QKLSAgICAgICAgLy8gLSBDIGlzIGNvcygycGlXVCkgQCA1MDAwSHo6IHBSZXZlcmItPm1fbkNvc1dUXzVLSHoKLSAgICAgICAgaWYgKHBSZXZlcmItPm1fblJ2YkxwZkZiayA9PSAwKSB7Ci0gICAgICAgICAgICAqcFZhbHVlMTYgPSAxMDAwOwotICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgcFJldmVyYi0+bV9uUnZiTHBmRmJrID09IDAsIHJhdGlvICVkIiwgKnBWYWx1ZTE2KTsKKyAgICAgICAgcFZhbHVlMTYgPSAoaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgLy8gUkVWRVJCX1BSRVNFVF9OT05FIGlzIG1hcHBlZCB0byBieXBhc3MKKyAgICAgICAgaWYgKHBSZXZlcmItPm1fYkJ5cGFzcyAhPSAwKSB7CisgICAgICAgICAgICAqcFZhbHVlMTYgPSAoaW50MTZfdClSRVZFUkJfUFJFU0VUX05PTkU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0ZW1wID0gTVVMVF9FRzFfRUcxKHBSZXZlcmItPm1fblJ2YkxwZkZiaywgcFJldmVyYi0+bV9uUnZiTHBmRmJrKTsKLSAgICAgICAgICAgIHRlbXAyID0gTVVMVF9FRzFfRUcxKHBSZXZlcmItPm1fblJ2YkxwZkZiaywgcFJldmVyYi0+bV9uQ29zV1RfNUtIeikKKyAgICAgICAgICAgICpwVmFsdWUxNiA9IChpbnQxNl90KShwUmV2ZXJiLT5tX25OZXh0Um9vbSArIDEpOworICAgICAgICB9CisgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUFJFU0VULCBwcmVzZXQgJWQiLCAqcFZhbHVlMTYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9CWVBBU1M6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUU6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YodF9yZXZlcmJfcHJvcGVydGllcyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKnBTaXplIDwgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBwVmFsdWUzMiA9IChpbnQzMl90ICopIHBWYWx1ZTsKKyAgICAgICAgcFZhbHVlMTYgPSAoaW50MTZfdCAqKSBwVmFsdWU7CisgICAgICAgIHBQcm9wZXJ0aWVzID0gKHRfcmV2ZXJiX3Byb3BlcnRpZXMgKikgcFZhbHVlOworCisgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fQllQQVNTOgorICAgICAgICAgICAgKnBWYWx1ZTMyID0gKGludDMyX3QpIHBSZXZlcmItPm1fYkJ5cGFzczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+cm9vbUxldmVsOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTDoKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbV9uUm9vbUxwZkZ3ZCB0byBtaWxsaWJlbHMKKyAgICAgICAgICAgIHRlbXAgPSAocFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCA8PCAxNSkKKyAgICAgICAgICAgICAgICAgICAgLyAoMzI3NjcgLSBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrKTsKKyAgICAgICAgICAgICpwVmFsdWUxNiA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyh0ZW1wKTsKKworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMICVkLCBnYWluICVkLCBtX25Sb29tTHBmRndkICVkLCBtX25Sb29tTHBmRmJrICVkIiwgKnBWYWx1ZTE2LCB0ZW1wLCBwUmV2ZXJiLT5tX25Sb29tTHBmRndkLCBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+cm9vbUhGTGV2ZWw7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgorICAgICAgICAgICAgLy8gVGhlIHJhdGlvIGJldHdlZW4gbGluZWFyIGdhaW4gYXQgMEh6IGFuZCBhdCA1MDAwSHogZm9yIHRoZSByb29tIGxvdyBwYXNzIGlzOgorICAgICAgICAgICAgLy8gKDEgKyBhMSkgLyBzcXJ0KGExXjIgKyAyKkMqYTEgKyAxKSB3aGVyZToKKyAgICAgICAgICAgIC8vIC0gYTEgaXMgbWludXMgdGhlIExQIGZlZWRiYWNrIGdhaW46IC1wUmV2ZXJiLT5tX25Sb29tTHBmRmJrCisgICAgICAgICAgICAvLyAtIEMgaXMgY29zKDJwaVdUKSBAIDUwMDBIejogcFJldmVyYi0+bV9uQ29zV1RfNUtIegorCisgICAgICAgICAgICB0ZW1wID0gTVVMVF9FRzFfRUcxKHBSZXZlcmItPm1fblJvb21McGZGYmssIHBSZXZlcmItPm1fblJvb21McGZGYmspOworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCBhMV4yICVkIiwgdGVtcCk7CisgICAgICAgICAgICB0ZW1wMiA9IE1VTFRfRUcxX0VHMShwUmV2ZXJiLT5tX25Sb29tTHBmRmJrLCBwUmV2ZXJiLT5tX25Db3NXVF81S0h6KQogICAgICAgICAgICAgICAgICAgICA8PCAxOworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCAyIENvcyBhMSAlZCIsIHRlbXAyKTsKICAgICAgICAgICAgIHRlbXAgPSAzMjc2NyArIHRlbXAgLSB0ZW1wMjsKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgYTFeMiArIDIgQ29zIGExICsgMSAlZCIsIHRlbXApOwogICAgICAgICAgICAgdGVtcCA9IEVmZmVjdHNfU3FydCh0ZW1wKSAqIDE4MTsKLSAgICAgICAgICAgIHRlbXAgPSAocFJldmVyYi0+bV9uUnZiTHBmRndkIDw8IDE1KSAvIHRlbXA7Ci0gICAgICAgICAgICAvLyBUaGUgbGluZWFyIGdhaW4gYXQgMEh6IGlzIGIwIC8gKGExICsgMSkKLSAgICAgICAgICAgIHRlbXAyID0gKHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCA8PCAxNSkgLyAoMzI3NjcKLSAgICAgICAgICAgICAgICAgICAgLSBwUmV2ZXJiLT5tX25SdmJMcGZGYmspOworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCBTUVJUKGExXjIgKyAyIENvcyBhMSArIDEpICVkIiwgdGVtcCk7CisgICAgICAgICAgICB0ZW1wID0gKCgzMjc2NyAtIHBSZXZlcmItPm1fblJvb21McGZGYmspIDw8IDE1KSAvIHRlbXA7CiAKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgZ2FpbiAlZCwgbV9uUm9vbUxwZkZ3ZCAlZCwgbV9uUm9vbUxwZkZiayAlZCIsIHRlbXAsIHBSZXZlcmItPm1fblJvb21McGZGd2QsIHBSZXZlcmItPm1fblJvb21McGZGYmspOworCisgICAgICAgICAgICAqcFZhbHVlMTYgPSBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHModGVtcCk7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFZhbHVlMzIgPSAmcFByb3BlcnRpZXMtPmRlY2F5VGltZTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUU6CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgcmV2ZXJiIGZlZWRiYWNrIHBhdGggZ2FpbgorICAgICAgICAgICAgdGVtcCA9IChwUmV2ZXJiLT5tX25SdmJMcGZGd2QgPDwgMTUpIC8gKDMyNzY3IC0gcFJldmVyYi0+bV9uUnZiTHBmRmJrKTsKICAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHModGVtcCk7Ci0gICAgICAgICAgICB0ZW1wMiA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyh0ZW1wMik7Ci0gICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPLCBnYWluIDVLSHogJWQgbUIsIGdhaW4gREMgJWQgbUIiLCB0ZW1wLCB0ZW1wMik7CiAKLSAgICAgICAgICAgIGlmICh0ZW1wID09IDApCi0gICAgICAgICAgICAgICAgdGVtcCA9IDE7Ci0gICAgICAgICAgICB0ZW1wID0gKGludDE2X3QpICgoMTAwMCAqIHRlbXAyKSAvIHRlbXApOworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGRlY2F5IHRpbWU6IGcgPSAtNjAwMCBkL0RUICwgZyBnYWluIGluIG1pbGxpYmVscywgZCByZXZlcmIgZGVsYXksIERUIGRlY2F5IHRpbWUKKyAgICAgICAgICAgIHRlbXAgPSAoLTYwMDAgKiBwUmV2ZXJiLT5tX25MYXRlRGVsYXkpIC8gdGVtcDsKKworICAgICAgICAgICAgLy8gQ29udmVydCBzYW1wbGVzIHRvIG1zCisgICAgICAgICAgICAqcFZhbHVlMzIgPSAodGVtcCAqIDEwMDApIC8gcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUsIHNhbXBsZXMgJWQsIG1zICVkIiwgdGVtcCwgKnBWYWx1ZTMyKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+ZGVjYXlIRlJhdGlvOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86CisgICAgICAgICAgICAvLyBJZiByIGlzIHRoZSBkZWNheSBIRiByYXRpbyAgKHIgPSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8vMTAwMCkgd2UgaGF2ZToKKyAgICAgICAgICAgIC8vICAgICAgIERUXzUwMDBIeiA9IERUXzBIeiAqIHIKKyAgICAgICAgICAgIC8vICBhbmQgIEdfNTAwMEh6ID0gLTYwMDAgKiBkIC8gRFRfNTAwMEh6IGFuZCBHXzBIeiA9IC02MDAwICogZCAvIERUXzBIeiBpbiBtaWxsaWJlbHMgc28gOgorICAgICAgICAgICAgLy8gciA9IEdfMEh6L0dfNTAwMEh6IGluIG1pbGxpYmVscworICAgICAgICAgICAgLy8gVGhlIGxpbmVhciBnYWluIGF0IDUwMDBIeiBpcyBiMCAvIHNxcnQoYTFeMiArIDIqQyphMSArIDEpIHdoZXJlOgorICAgICAgICAgICAgLy8gLSBhMSBpcyBtaW51cyB0aGUgTFAgZmVlZGJhY2sgZ2FpbjogLXBSZXZlcmItPm1fblJ2YkxwZkZiaworICAgICAgICAgICAgLy8gLSBiMCBpcyB0aGUgTFAgZm9yd2FyZCBnYWluOiBwUmV2ZXJiLT5tX25SdmJMcGZGd2QKKyAgICAgICAgICAgIC8vIC0gQyBpcyBjb3MoMnBpV1QpIEAgNTAwMEh6OiBwUmV2ZXJiLT5tX25Db3NXVF81S0h6CisgICAgICAgICAgICBpZiAocFJldmVyYi0+bV9uUnZiTHBmRmJrID09IDApIHsKKyAgICAgICAgICAgICAgICAqcFZhbHVlMTYgPSAxMDAwOworICAgICAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8sIHBSZXZlcmItPm1fblJ2YkxwZkZiayA9PSAwLCByYXRpbyAlZCIsICpwVmFsdWUxNik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAgPSBNVUxUX0VHMV9FRzEocFJldmVyYi0+bV9uUnZiTHBmRmJrLCBwUmV2ZXJiLT5tX25SdmJMcGZGYmspOworICAgICAgICAgICAgICAgIHRlbXAyID0gTVVMVF9FRzFfRUcxKHBSZXZlcmItPm1fblJ2YkxwZkZiaywgcFJldmVyYi0+bV9uQ29zV1RfNUtIeikKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE7CisgICAgICAgICAgICAgICAgdGVtcCA9IDMyNzY3ICsgdGVtcCAtIHRlbXAyOworICAgICAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX1NxcnQodGVtcCkgKiAxODE7CisgICAgICAgICAgICAgICAgdGVtcCA9IChwUmV2ZXJiLT5tX25SdmJMcGZGd2QgPDwgMTUpIC8gdGVtcDsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbGluZWFyIGdhaW4gYXQgMEh6IGlzIGIwIC8gKGExICsgMSkKKyAgICAgICAgICAgICAgICB0ZW1wMiA9IChwUmV2ZXJiLT5tX25SdmJMcGZGd2QgPDwgMTUpIC8gKDMyNzY3CisgICAgICAgICAgICAgICAgICAgICAgICAtIHBSZXZlcmItPm1fblJ2YkxwZkZiayk7CisKKyAgICAgICAgICAgICAgICB0ZW1wID0gRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzKHRlbXApOworICAgICAgICAgICAgICAgIHRlbXAyID0gRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzKHRlbXAyKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPLCBnYWluIDVLSHogJWQgbUIsIGdhaW4gREMgJWQgbUIiLCB0ZW1wLCB0ZW1wMik7CisKKyAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0ZW1wID0gMTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKGludDE2X3QpICgoMTAwMCAqIHRlbXAyKSAvIHRlbXApOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID4gMTAwMCkKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IDEwMDA7CisKKyAgICAgICAgICAgICAgICAqcFZhbHVlMTYgPSB0ZW1wOworICAgICAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8sIHJhdGlvICVkIiwgKnBWYWx1ZTE2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFZhbHVlMTYgPSAmcFByb3BlcnRpZXMtPnJlZmxlY3Rpb25zTGV2ZWw7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKKyAgICAgICAgICAgICpwVmFsdWUxNiA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyhwUmV2ZXJiLT5tX25FYXJseUdhaW4pOworCisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMLCAlZCIsICpwVmFsdWUxNik7CisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUzMiA9ICZwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNEZWxheTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICAgICAgLy8gY29udmVydCBzYW1wbGVzIHRvIG1zCisgICAgICAgICAgICAqcFZhbHVlMzIgPSAocFJldmVyYi0+bV9uRWFybHlEZWxheSAqIDEwMDApIC8gcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZLCBzYW1wbGVzICVkLCBtcyAlZCIsIHBSZXZlcmItPm1fbkVhcmx5RGVsYXksICpwVmFsdWUzMik7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBWYWx1ZTE2ID0gJnBQcm9wZXJ0aWVzLT5yZXZlcmJMZXZlbDsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbGluZWFyIGdhaW4gdG8gbWlsbGliZWxzCisgICAgICAgICAgICAqcFZhbHVlMTYgPSBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHMocFJldmVyYi0+bV9uTGF0ZUdhaW4gPDwgMik7CisKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMICVkIiwgKnBWYWx1ZTE2KTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBWYWx1ZTMyID0gJnBQcm9wZXJ0aWVzLT5yZXZlcmJEZWxheTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgc2FtcGxlcyB0byBtcworICAgICAgICAgICAgKnBWYWx1ZTMyID0gKHBSZXZlcmItPm1fbkxhdGVEZWxheSAqIDEwMDApIC8gcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWSwgc2FtcGxlcyAlZCwgbXMgJWQiLCBwUmV2ZXJiLT5tX25MYXRlRGVsYXksICpwVmFsdWUzMik7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+ZGlmZnVzaW9uOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgorICAgICAgICAgICAgdGVtcCA9IChpbnQxNl90KSAoKDEwMDAgKiAocFJldmVyYi0+bV9zQXAwLm1fbkFwR2FpbiAtIEFQMF9HQUlOX0JBU0UpKQorICAgICAgICAgICAgICAgICAgICAvIEFQMF9HQUlOX1JBTkdFKTsKKworICAgICAgICAgICAgaWYgKHRlbXAgPCAwKQorICAgICAgICAgICAgICAgIHRlbXAgPSAwOwogICAgICAgICAgICAgaWYgKHRlbXAgPiAxMDAwKQogICAgICAgICAgICAgICAgIHRlbXAgPSAxMDAwOwogCiAgICAgICAgICAgICAqcFZhbHVlMTYgPSB0ZW1wOwotICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgcmF0aW8gJWQiLCAqcFZhbHVlMTYpOwotICAgICAgICB9CisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTiwgJWQsIEFQMCBnYWluICVkIiwgKnBWYWx1ZTE2LCBwUmV2ZXJiLT5tX3NBcDAubV9uQXBHYWluKTsKIAotICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPKSB7CisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RJRkZVU0lPTikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFZhbHVlMTYgPSAmcFByb3BlcnRpZXMtPmRlbnNpdHk7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgorICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIEFQIGRlbGF5IGluIHRpbWUgdW5pdHMKKyAgICAgICAgICAgIHRlbXAgPSAoKHBSZXZlcmItPm1fc0FwMC5tX3pBcE91dCAtIHBSZXZlcmItPm1fc0FwMC5tX3pBcEluKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgLyBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGU7CisKKyAgICAgICAgICAgIHRlbXAgPSAoaW50MTZfdCkgKCgxMDAwICogKHRlbXAgLSBBUDBfVElNRV9CQVNFKSkgLyBBUDBfVElNRV9SQU5HRSk7CisKKyAgICAgICAgICAgIGlmICh0ZW1wIDwgMCkKKyAgICAgICAgICAgICAgICB0ZW1wID0gMDsKKyAgICAgICAgICAgIGlmICh0ZW1wID4gMTAwMCkKKyAgICAgICAgICAgICAgICB0ZW1wID0gMTAwMDsKKworICAgICAgICAgICAgKnBWYWx1ZTE2ID0gdGVtcDsKKworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ERU5TSVRZLCAlZCwgQVAwIGRlbGF5IHNtcHMgJWQiLCAqcFZhbHVlMTYsIHBSZXZlcmItPm1fc0FwMC5tX3pBcE91dCAtIHBSZXZlcmItPm1fc0FwMC5tX3pBcEluKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNMZXZlbDsKLSAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKLSAgICAgICAgKnBWYWx1ZTE2ID0gRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzKHBSZXZlcmItPm1fbkVhcmx5R2Fpbik7Ci0KLSAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTCwgJWQiLCAqcFZhbHVlMTYpOwotICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwVmFsdWUzMiA9ICZwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNEZWxheTsKLSAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKLSAgICAgICAgLy8gY29udmVydCBzYW1wbGVzIHRvIG1zCi0gICAgICAgICpwVmFsdWUzMiA9IChwUmV2ZXJiLT5tX25FYXJseURlbGF5ICogMTAwMCkgLyBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGU7Ci0KLSAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWSwgc2FtcGxlcyAlZCwgbXMgJWQiLCBwUmV2ZXJiLT5tX25FYXJseURlbGF5LCAqcFZhbHVlMzIpOwotCi0gICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBWYWx1ZTE2ID0gJnBQcm9wZXJ0aWVzLT5yZXZlcmJMZXZlbDsKLSAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6Ci0gICAgICAgIC8vIENvbnZlcnQgbGluZWFyIGdhaW4gdG8gbWlsbGliZWxzCi0gICAgICAgICpwVmFsdWUxNiA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyhwUmV2ZXJiLT5tX25MYXRlR2FpbiA8PCAyKTsKLQotICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTCAlZCIsICpwVmFsdWUxNik7Ci0KLSAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBWYWx1ZTMyID0gJnBQcm9wZXJ0aWVzLT5yZXZlcmJEZWxheTsKLSAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6Ci0gICAgICAgIC8vIGNvbnZlcnQgc2FtcGxlcyB0byBtcwotICAgICAgICAqcFZhbHVlMzIgPSAocFJldmVyYi0+bV9uTGF0ZURlbGF5ICogMTAwMCkgLyBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGU7Ci0KLSAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVksIHNhbXBsZXMgJWQsIG1zICVkIiwgcFJldmVyYi0+bV9uTGF0ZURlbGF5LCAqcFZhbHVlMzIpOwotCi0gICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+ZGlmZnVzaW9uOwotICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KLQotICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKLSAgICAgICAgdGVtcCA9IChpbnQxNl90KSAoKDEwMDAgKiAocFJldmVyYi0+bV9zQXAwLm1fbkFwR2FpbiAtIEFQMF9HQUlOX0JBU0UpKQotICAgICAgICAgICAgICAgIC8gQVAwX0dBSU5fUkFOR0UpOwotCi0gICAgICAgIGlmICh0ZW1wIDwgMCkKLSAgICAgICAgICAgIHRlbXAgPSAwOwotICAgICAgICBpZiAodGVtcCA+IDEwMDApCi0gICAgICAgICAgICB0ZW1wID0gMTAwMDsKLQotICAgICAgICAqcFZhbHVlMTYgPSB0ZW1wOwotICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTiwgJWQsIEFQMCBnYWluICVkIiwgKnBWYWx1ZTE2LCBwUmV2ZXJiLT5tX3NBcDAubV9uQXBHYWluKTsKLQotICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RJRkZVU0lPTikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcFZhbHVlMTYgPSAmcFByb3BlcnRpZXMtPmRlbnNpdHk7Ci0gICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLwotCi0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKLSAgICAgICAgLy8gQ2FsY3VsYXRlIEFQIGRlbGF5IGluIHRpbWUgdW5pdHMKLSAgICAgICAgdGVtcCA9ICgocFJldmVyYi0+bV9zQXAwLm1fekFwT3V0IC0gcFJldmVyYi0+bV9zQXAwLm1fekFwSW4pIDw8IDE2KQotICAgICAgICAgICAgICAgIC8gcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlOwotCi0gICAgICAgIHRlbXAgPSAoaW50MTZfdCkgKCgxMDAwICogKHRlbXAgLSBBUDBfVElNRV9CQVNFKSkgLyBBUDBfVElNRV9SQU5HRSk7Ci0KLSAgICAgICAgaWYgKHRlbXAgPCAwKQotICAgICAgICAgICAgdGVtcCA9IDA7Ci0gICAgICAgIGlmICh0ZW1wID4gMTAwMCkKLSAgICAgICAgICAgIHRlbXAgPSAxMDAwOwotCi0gICAgICAgICpwVmFsdWUxNiA9IHRlbXA7Ci0KLSAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ERU5TSVRZLCAlZCwgQVAwIGRlbGF5IHNtcHMgJWQiLCAqcFZhbHVlMTYsIHBSZXZlcmItPm1fc0FwMC5tX3pBcE91dCAtIHBSZXZlcmItPm1fc0FwMC5tX3pBcEluKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKICAgICB9CiAKKyAgICAqcFNpemUgPSBzaXplOworCiAgICAgTE9HVigiUmV2ZXJiX2dldFBhcmFtZXRlciwgY29udGV4dCAlcCwgcGFyYW0gJWQsIHZhbHVlICVkIiwKICAgICAgICAgICAgIHBSZXZlcmIsIHBhcmFtLCAqKGludCAqKXBWYWx1ZSk7CiAKQEAgLTk0NSwzODIgKzk4MywzODYgQEAKICAgICBMT0dWKCJSZXZlcmJfc2V0UGFyYW1ldGVyLCBjb250ZXh0ICVwLCBwYXJhbSAlZCwgdmFsdWUxNiAlZCwgdmFsdWUzMiAlZCIsCiAgICAgICAgICAgICBwUmV2ZXJiLCBwYXJhbSwgKihpbnQxNl90ICopcFZhbHVlLCAqKGludDMyX3QgKilwVmFsdWUpOwogCi0gICAgaWYgKHBSZXZlcmItPm1fUHJlc2V0ICYmIHBhcmFtICE9IFJFVkVSQl9QQVJBTV9QUkVTRVQpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmICghcFJldmVyYi0+bV9QcmVzZXQgJiYgcGFyYW0gPT0gUkVWRVJCX1BBUkFNX1BSRVNFVCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHBhcmFtKSB7Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTDoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgotICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ESUZGVVNJT046Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKLSAgICAgICAgcGFyYW1TaXplID0gc2l6ZW9mKGludDE2X3QpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgUkVWRVJCX1BBUkFNX0JZUEFTUzoKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUkVTRVQ6Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6Ci0gICAgICAgIHBhcmFtU2l6ZSA9IHNpemVvZihpbnQzMl90KTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgotICAgICAgICBwYXJhbVNpemUgPSBzaXplb2YodF9yZXZlcmJfcHJvcGVydGllcyk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgIT0gcGFyYW1TaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChwYXJhbVNpemUgPT0gc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgIHZhbHVlMTYgPSAqKGludDE2X3QgKikgcFZhbHVlOwotICAgIH0gZWxzZSBpZiAocGFyYW1TaXplID09IHNpemVvZihpbnQzMl90KSkgewotICAgICAgICB2YWx1ZTMyID0gKihpbnQzMl90ICopIHBWYWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9wcm9wZXJ0aWVzICopIHBWYWx1ZTsKLSAgICB9Ci0KLSAgICBwUHJlc2V0ID0gJnBSZXZlcmItPm1fc1ByZXNldC5tX3NQcmVzZXRbcFJldmVyYi0+bV9uQ3VycmVudFJvb21dOwotCi0gICAgc3dpdGNoIChwYXJhbSkgewotICAgIGNhc2UgUkVWRVJCX1BBUkFNX0JZUEFTUzoKLSAgICAgICAgcFJldmVyYi0+bV9iQnlwYXNzID0gKHVpbnQxNl90KXZhbHVlMzI7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1BSRVNFVDoKLSAgICAgICAgaWYgKHZhbHVlMzIgIT0gUkVWRVJCX1BSRVNFVF9MQVJHRV9IQUxMICYmIHZhbHVlMzIKLSAgICAgICAgICAgICAgICAhPSBSRVZFUkJfUFJFU0VUX0hBTEwgJiYgdmFsdWUzMiAhPSBSRVZFUkJfUFJFU0VUX0NIQU1CRVIKLSAgICAgICAgICAgICAgICAmJiB2YWx1ZTMyICE9IFJFVkVSQl9QUkVTRVRfUk9PTSkKKyAgICBpZiAocFJldmVyYi0+bV9QcmVzZXQpIHsKKyAgICAgICAgaWYgKHBhcmFtICE9IFJFVkVSQl9QQVJBTV9QUkVTRVQgfHwgc2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICBwUmV2ZXJiLT5tX25OZXh0Um9vbSA9IChpbnQxNl90KSB2YWx1ZTMyOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgIHZhbHVlMTYgPSBwUHJvcGVydGllcy0+cm9vbUxldmVsOwotICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KLQotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6Ci0gICAgICAgIC8vIENvbnZlcnQgbWlsbGliZWxzIHRvIGxpbmVhciAxNiBiaXQgc2lnbmVkID0+IG1fblJvb21McGZGd2QKLSAgICAgICAgaWYgKHZhbHVlMTYgPiAwKQotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAgICAgdGVtcCA9IEVmZmVjdHNfTWlsbGliZWxzVG9MaW5lYXIxNih2YWx1ZTE2KTsKLQotICAgICAgICBwUmV2ZXJiLT5tX25Sb29tTHBmRndkCi0gICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEodGVtcCwgKDMyNzY3IC0gcFJldmVyYi0+bV9uUm9vbUxwZkZiaykpOwotCi0gICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0xFVkVMLCBnYWluICVkLCBuZXcgbV9uUm9vbUxwZkZ3ZCAlZCwgbV9uUm9vbUxwZkZiayAlZCIsIHRlbXAsIHBSZXZlcmItPm1fblJvb21McGZGd2QsIHBSZXZlcmItPm1fblJvb21McGZGYmspOwotICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5yb29tSEZMZXZlbDsKLSAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgotCi0gICAgICAgIC8vIExpbWl0IHRvIDAgLCAtNDBkQiByYW5nZSBiZWNhdXNlIG9mIGxvdyBwYXNzIGltcGxlbWVudGF0aW9uCi0gICAgICAgIGlmICh2YWx1ZTE2ID4gMCB8fCB2YWx1ZTE2IDwgLTQwMDApCi0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgLy8gQ29udmVydCBhdHRlbnVhdGlvbiBAIDUwMDBIIGV4cHJlc3NlZCBpbiBtaWxsaWJlbHMgdG8gPT4gbV9uUm9vbUxwZkZiawotICAgICAgICAvLyBtX25Sb29tTHBmRmJrIGlzIC1hMSB3aGVyZSBhMSBpcyB0aGUgc29sdXRpb24gb2Y6Ci0gICAgICAgIC8vIGExXjIgKyAyKihDLWRHXjIpLygxLWRHXjIpKmExICsgMSA9IDAgd2hlcmU6Ci0gICAgICAgIC8vIC0gQyBpcyBjb3MoMipwaSo1MDAwL0ZzKSAocFJldmVyYi0+bV9uQ29zV1RfNUtIeikKLSAgICAgICAgLy8gLSBkRyBpcyBHMC9HZiAoRzAgaXMgdGhlIGxpbmVhciBnYWluIGF0IERDIGFuZCBHZiBpcyB0aGUgd2FudGVkIGdhaW4gYXQgNTAwMEh6KQotCi0gICAgICAgIC8vIFNhdmUgY3VycmVudCBEQyBnYWluIG1fblJvb21McGZGd2QgLyAoMzI3NjcgLSBtX25Sb29tTHBmRmJrKSB0byBrZWVwIGl0IHVuY2hhbmdlZAotICAgICAgICAvLyB3aGlsZSBjaGFuZ2luZyBIRiBsZXZlbAotICAgICAgICB0ZW1wMiA9IChwUmV2ZXJiLT5tX25Sb29tTHBmRndkIDw8IDE1KSAvICgzMjc2NwotICAgICAgICAgICAgICAgIC0gcFJldmVyYi0+bV9uUm9vbUxwZkZiayk7Ci0gICAgICAgIGlmICh2YWx1ZTE2ID09IDApIHsKLSAgICAgICAgICAgIHBSZXZlcmItPm1fblJvb21McGZGYmsgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50MzJfdCBkRzIsIGIsIGRlbHRhOwotCi0gICAgICAgICAgICAvLyBkR14yCi0gICAgICAgICAgICB0ZW1wID0gRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2KHZhbHVlMTYpOwotICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIEhGIGdhaW4gJWQiLCB0ZW1wKTsKLSAgICAgICAgICAgIHRlbXAgPSAoMSA8PCAzMCkgLyB0ZW1wOwotICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIDEvIEhGIGdhaW4gJWQiLCB0ZW1wKTsKLSAgICAgICAgICAgIGRHMiA9IChpbnQzMl90KSAoKChpbnQ2NF90KSB0ZW1wICogKGludDY0X3QpIHRlbXApID4+IDE1KTsKLSAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCAxLyBIRiBnYWluIF4gMiAlZCIsIGRHMik7Ci0gICAgICAgICAgICAvLyBiID0gMiooQy1kR14yKS8oMS1kR14yKQotICAgICAgICAgICAgYiA9IChpbnQzMl90KSAoKCgoaW50NjRfdCkgMSA8PCAoMTUgKyAxKSkKLSAgICAgICAgICAgICAgICAgICAgKiAoKGludDY0X3QpIHBSZXZlcmItPm1fbkNvc1dUXzVLSHogLSAoaW50NjRfdCkgZEcyKSkKLSAgICAgICAgICAgICAgICAgICAgLyAoKGludDY0X3QpIDMyNzY3IC0gKGludDY0X3QpIGRHMikpOwotCi0gICAgICAgICAgICAvLyBkZWx0YSA9IGJeMiAtIDQKLSAgICAgICAgICAgIGRlbHRhID0gKGludDMyX3QpICgoKChpbnQ2NF90KSBiICogKGludDY0X3QpIGIpID4+IDE1KSAtICgxIDw8ICgxNQotICAgICAgICAgICAgICAgICAgICArIDIpKSk7Ci0KLSAgICAgICAgICAgIExPR1ZfSUYoZGVsdGEgPiAoMTw8MzApLCAiIGRlbHRhIG92ZXJmbG93ICVkIiwgZGVsdGEpOwotCi0gICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgZEcyICVkLCBiICVkLCBkZWx0YSAlZCwgbV9uQ29zV1RfNUtIeiAlZCIsIGRHMiwgYiwgZGVsdGEsIHBSZXZlcmItPm1fbkNvc1dUXzVLSHopOwotICAgICAgICAgICAgLy8gbV9uUm9vbUxwZkZiayA9IC1hMSA9IC0gKC0gYiArIHNxcnQoZGVsdGEpKSAvIDIKLSAgICAgICAgICAgIHBSZXZlcmItPm1fblJvb21McGZGYmsgPSAoYiAtIEVmZmVjdHNfU3FydChkZWx0YSkgKiAxODEpID4+IDE7CiAgICAgICAgIH0KLSAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIG9sZyBEQyBnYWluICVkIG5ldyBtX25Sb29tTHBmRmJrICVkLCBvbGQgbV9uUm9vbUxwZkZ3ZCAlZCIsCi0gICAgICAgICAgICAgICAgdGVtcDIsIHBSZXZlcmItPm1fblJvb21McGZGYmssIHBSZXZlcmItPm1fblJvb21McGZGd2QpOwotCi0gICAgICAgIHBSZXZlcmItPm1fblJvb21McGZGd2QKLSAgICAgICAgICAgICAgICA9IE1VTFRfRUcxX0VHMSh0ZW1wMiwgKDMyNzY3IC0gcFJldmVyYi0+bV9uUm9vbUxwZkZiaykpOwotICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgbmV3IG1fblJvb21McGZGd2QgJWQiLCBwUmV2ZXJiLT5tX25Sb29tTHBmRndkKTsKLQotICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdmFsdWUzMiA9IHBQcm9wZXJ0aWVzLT5kZWNheVRpbWU7Ci0gICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLwotCi0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLQotICAgICAgICAvLyBDb252ZXJ0IG1pbGxpc2Vjb25kcyB0byA9PiBtX25SdmJMcGZGd2QgKGZ1bmN0aW9uIG9mIG1fblJ2YkxwZkZiaykKLSAgICAgICAgLy8gY29udmVydCBtcyB0byBzYW1wbGVzCi0gICAgICAgIHZhbHVlMzIgPSAodmFsdWUzMiAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgLyAxMDAwOwotCi0gICAgICAgIC8vIGNhbGN1bGF0ZSB2YWxpZCBkZWNheSB0aW1lIHJhbmdlIGFzIGEgZnVuY3Rpb24gb2YgY3VycmVudCByZXZlcmIgZGVsYXkgYW5kCi0gICAgICAgIC8vIG1heCBmZWVkIGJhY2sgZ2Fpbi4gTWluIHZhbHVlIDw9PiAtNDBkQiBpbiBvbmUgcGFzcywgTWF4IHZhbHVlIDw9PiBmZWVkYmFjayBnYWluID0gLTEgZEIKLSAgICAgICAgLy8gQ2FsY3VsYXRlIGF0dGVudWF0aW9uIGZvciBlYWNoIHJvdW5kIGluIGxhdGUgcmV2ZXJiIGdpdmVuIGEgdG90YWwgYXR0ZW51YXRpb24gb2YgLTYwMDAgbWlsbGliZWxzLgotICAgICAgICAvLyBnID0gLTYwMDAgZC9EVCAsIGcgZ2FpbiBpbiBtaWxsaWJlbHMsIGQgcmV2ZXJiIGRlbGF5LCBEVCBkZWNheSB0aW1lCi0gICAgICAgIGF2ZXJhZ2VEZWxheSA9IHBSZXZlcmItPm1fbkxhdGVEZWxheSAtIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbjsKLSAgICAgICAgYXZlcmFnZURlbGF5ICs9ICgocFJldmVyYi0+bV9zQXAwLm1fekFwT3V0IC0gcFJldmVyYi0+bV9zQXAwLm1fekFwSW4pCi0gICAgICAgICAgICAgICAgKyAocFJldmVyYi0+bV9zQXAxLm1fekFwT3V0IC0gcFJldmVyYi0+bV9zQXAxLm1fekFwSW4pKSA+PiAxOwotCi0gICAgICAgIHRlbXAgPSAoLTYwMDAgKiBhdmVyYWdlRGVsYXkpIC8gdmFsdWUzMjsKLSAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUsIGRlbGF5IHNtcHMgJWQsIERUIHNtcHMgJWQsIGdhaW4gbUIgJWQiLGF2ZXJhZ2VEZWxheSwgdmFsdWUzMiwgdGVtcCk7Ci0gICAgICAgIGlmICh0ZW1wIDwgLTQwMDAgfHwgdGVtcCA+IC0xMDApCisgICAgICAgIHZhbHVlMTYgPSAqKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgIExPR1YoInNldCBSRVZFUkJfUEFSQU1fUFJFU0VULCBwcmVzZXQgJWQiLCB2YWx1ZTE2KTsKKyAgICAgICAgaWYgKHZhbHVlMTYgPCBSRVZFUkJfUFJFU0VUX05PTkUgfHwgdmFsdWUxNiA+IFJFVkVSQl9QUkVTRVRfUExBVEUpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotCi0gICAgICAgIC8vIGNhbGN1bGF0ZSBsb3cgcGFzcyBnYWluIGJ5IGFkZGluZyByZXZlcmIgaW5wdXQgYXR0ZW51YXRpb24gKHBSZXZlcmItPm1fbkxhdGVHYWluKSBhbmQgc3Vic3RyYXRpbmcgb3V0cHV0Ci0gICAgICAgIC8vIHhmYWRlIGFuZCBzdW0gZ2FpbiAobWF4ICs5ZEIpCi0gICAgICAgIHRlbXAgLT0gRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzKHBSZXZlcmItPm1fbkxhdGVHYWluKSArIDkwMDsKLSAgICAgICAgdGVtcCA9IEVmZmVjdHNfTWlsbGliZWxzVG9MaW5lYXIxNih0ZW1wKTsKLQotICAgICAgICAvLyBEQyBnYWluICh0ZW1wKSA9IGIwIC8gKDEgKyBhMSkgPSBwUmV2ZXJiLT5tX25SdmJMcGZGd2QgLyAoMzI3NjcgLSBwUmV2ZXJiLT5tX25SdmJMcGZGYmspCi0gICAgICAgIHBSZXZlcmItPm1fblJ2YkxwZkZ3ZAotICAgICAgICAgICAgICAgID0gTVVMVF9FRzFfRUcxKHRlbXAsICgzMjc2NyAtIHBSZXZlcmItPm1fblJ2YkxwZkZiaykpOwotCi0gICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9USU1FLCBnYWluICVkLCBuZXcgbV9uUnZiTHBmRndkICVkLCBvbGQgbV9uUnZiTHBmRmJrICVkLCByZXZlcmIgZ2FpbiAlZCIsIHRlbXAsIHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCwgcFJldmVyYi0+bV9uUnZiTHBmRmJrLCBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHMocFJldmVyYi0+bV9uTGF0ZUdhaW4pKTsKLQotICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5kZWNheUhGUmF0aW87Ci0gICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLwotCi0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86Ci0KLSAgICAgICAgLy8gV2UgbGltaXQgbWF4IHZhbHVlIHRvIDEwMDAgYmVjYXVzZSByZXZlcmIgZmlsdGVyIGlzIGxvd3Bhc3Mgb25seQotICAgICAgICBpZiAodmFsdWUxNiA8IDEwMCB8fCB2YWx1ZTE2ID4gMTAwMCkKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAvLyBDb252ZXJ0IHBlciBtaWxsZSB0byA9PiBtX25McGZGd2QsIG1fbkxwZkZiawotCi0gICAgICAgIC8vIFNhdmUgY3VycmVudCBEQyBnYWluIG1fblJvb21McGZGd2QgLyAoMzI3NjcgLSBtX25Sb29tTHBmRmJrKSB0byBrZWVwIGl0IHVuY2hhbmdlZAotICAgICAgICAvLyB3aGlsZSBjaGFuZ2luZyBIRiBsZXZlbAotICAgICAgICB0ZW1wMiA9IChwUmV2ZXJiLT5tX25SdmJMcGZGd2QgPDwgMTUpIC8gKDMyNzY3IC0gcFJldmVyYi0+bV9uUnZiTHBmRmJrKTsKLQotICAgICAgICBpZiAodmFsdWUxNiA9PSAxMDAwKSB7Ci0gICAgICAgICAgICBwUmV2ZXJiLT5tX25SdmJMcGZGYmsgPSAwOworICAgICAgICB9CisgICAgICAgIC8vIFJFVkVSQl9QUkVTRVRfTk9ORSBpcyBtYXBwZWQgdG8gYnlwYXNzCisgICAgICAgIGlmICh2YWx1ZTE2ID09IFJFVkVSQl9QUkVTRVRfTk9ORSkgeworICAgICAgICAgICAgcFJldmVyYi0+bV9iQnlwYXNzID0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDMyX3QgZEcyLCBiLCBkZWx0YTsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fYkJ5cGFzcyA9IDA7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX25OZXh0Um9vbSA9IHZhbHVlMTYgLSAxOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChwYXJhbSkgeworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUw6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgorICAgICAgICAgICAgcGFyYW1TaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHModGVtcDIpOwotICAgICAgICAgICAgLy8gR181MDAwSHogPSBHX0RDICogKDEwMDAvUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPKSBpbiBtaWxsaWJlbHMKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fQllQQVNTOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgorICAgICAgICAgICAgcGFyYW1TaXplID0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIHZhbHVlMzIgPSAoKGludDMyX3QpIDEwMDAgPDwgMTUpIC8gKGludDMyX3QpIHZhbHVlMTY7Ci0gICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8sIERDIGdhaW4gJWQsIERDIGdhaW4gbUIgJWQsIDEwMDAvUiAlZCIsIHRlbXAyLCB0ZW1wLCB2YWx1ZTMyKTsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIHBhcmFtU2l6ZSA9IHNpemVvZih0X3JldmVyYl9wcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICB0ZW1wID0gKGludDMyX3QpICgoKGludDY0X3QpIHRlbXAgKiAoaW50NjRfdCkgdmFsdWUzMikgPj4gMTUpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHRlbXAgPCAtNDAwMCkgewotICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTyBIRiBnYWluIG92ZXJmbG93ICVkIG1CIiwgdGVtcCk7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IC00MDAwOworICAgICAgICBpZiAoc2l6ZSAhPSBwYXJhbVNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA9PSBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgIHZhbHVlMTYgPSAqKGludDE2X3QgKikgcFZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKHBhcmFtU2l6ZSA9PSBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIHZhbHVlMzIgPSAqKGludDMyX3QgKikgcFZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFByb3BlcnRpZXMgPSAodF9yZXZlcmJfcHJvcGVydGllcyAqKSBwVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwUHJlc2V0ID0gJnBSZXZlcmItPm1fc1ByZXNldC5tX3NQcmVzZXRbcFJldmVyYi0+bV9uTmV4dFJvb21dOworCisgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fQllQQVNTOgorICAgICAgICAgICAgcFJldmVyYi0+bV9iQnlwYXNzID0gKHVpbnQxNl90KXZhbHVlMzI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5yb29tTGV2ZWw7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgorICAgICAgICAgICAgLy8gQ29udmVydCBtaWxsaWJlbHMgdG8gbGluZWFyIDE2IGJpdCBzaWduZWQgPT4gbV9uUm9vbUxwZkZ3ZAorICAgICAgICAgICAgaWYgKHZhbHVlMTYgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICB0ZW1wID0gRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2KHZhbHVlMTYpOworCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25Sb29tTHBmRndkCisgICAgICAgICAgICAgICAgICAgID0gTVVMVF9FRzFfRUcxKHRlbXAsICgzMjc2NyAtIHBSZXZlcmItPm1fblJvb21McGZGYmspKTsKKworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwsIGdhaW4gJWQsIG5ldyBtX25Sb29tTHBmRndkICVkLCBtX25Sb29tTHBmRmJrICVkIiwgdGVtcCwgcFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCwgcFJldmVyYi0+bV9uUm9vbUxwZkZiayk7CisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZTE2ID0gcFByb3BlcnRpZXMtPnJvb21IRkxldmVsOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKworICAgICAgICAgICAgLy8gTGltaXQgdG8gMCAsIC00MGRCIHJhbmdlIGJlY2F1c2Ugb2YgbG93IHBhc3MgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIGlmICh2YWx1ZTE2ID4gMCB8fCB2YWx1ZTE2IDwgLTQwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAvLyBDb252ZXJ0IGF0dGVudWF0aW9uIEAgNTAwMEggZXhwcmVzc2VkIGluIG1pbGxpYmVscyB0byA9PiBtX25Sb29tTHBmRmJrCisgICAgICAgICAgICAvLyBtX25Sb29tTHBmRmJrIGlzIC1hMSB3aGVyZSBhMSBpcyB0aGUgc29sdXRpb24gb2Y6CisgICAgICAgICAgICAvLyBhMV4yICsgMiooQy1kR14yKS8oMS1kR14yKSphMSArIDEgPSAwIHdoZXJlOgorICAgICAgICAgICAgLy8gLSBDIGlzIGNvcygyKnBpKjUwMDAvRnMpIChwUmV2ZXJiLT5tX25Db3NXVF81S0h6KQorICAgICAgICAgICAgLy8gLSBkRyBpcyBHMC9HZiAoRzAgaXMgdGhlIGxpbmVhciBnYWluIGF0IERDIGFuZCBHZiBpcyB0aGUgd2FudGVkIGdhaW4gYXQgNTAwMEh6KQorCisgICAgICAgICAgICAvLyBTYXZlIGN1cnJlbnQgREMgZ2FpbiBtX25Sb29tTHBmRndkIC8gKDMyNzY3IC0gbV9uUm9vbUxwZkZiaykgdG8ga2VlcCBpdCB1bmNoYW5nZWQKKyAgICAgICAgICAgIC8vIHdoaWxlIGNoYW5naW5nIEhGIGxldmVsCisgICAgICAgICAgICB0ZW1wMiA9IChwUmV2ZXJiLT5tX25Sb29tTHBmRndkIDw8IDE1KSAvICgzMjc2NworICAgICAgICAgICAgICAgICAgICAtIHBSZXZlcmItPm1fblJvb21McGZGYmspOworICAgICAgICAgICAgaWYgKHZhbHVlMTYgPT0gMCkgeworICAgICAgICAgICAgICAgIHBSZXZlcmItPm1fblJvb21McGZGYmsgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGRHMiwgYiwgZGVsdGE7CisKKyAgICAgICAgICAgICAgICAvLyBkR14yCisgICAgICAgICAgICAgICAgdGVtcCA9IEVmZmVjdHNfTWlsbGliZWxzVG9MaW5lYXIxNih2YWx1ZTE2KTsKKyAgICAgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgSEYgZ2FpbiAlZCIsIHRlbXApOworICAgICAgICAgICAgICAgIHRlbXAgPSAoMSA8PCAzMCkgLyB0ZW1wOworICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCAxLyBIRiBnYWluICVkIiwgdGVtcCk7CisgICAgICAgICAgICAgICAgZEcyID0gKGludDMyX3QpICgoKGludDY0X3QpIHRlbXAgKiAoaW50NjRfdCkgdGVtcCkgPj4gMTUpOworICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCAxLyBIRiBnYWluIF4gMiAlZCIsIGRHMik7CisgICAgICAgICAgICAgICAgLy8gYiA9IDIqKEMtZEdeMikvKDEtZEdeMikKKyAgICAgICAgICAgICAgICBiID0gKGludDMyX3QpICgoKChpbnQ2NF90KSAxIDw8ICgxNSArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAoKGludDY0X3QpIHBSZXZlcmItPm1fbkNvc1dUXzVLSHogLSAoaW50NjRfdCkgZEcyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gKChpbnQ2NF90KSAzMjc2NyAtIChpbnQ2NF90KSBkRzIpKTsKKworICAgICAgICAgICAgICAgIC8vIGRlbHRhID0gYl4yIC0gNAorICAgICAgICAgICAgICAgIGRlbHRhID0gKGludDMyX3QpICgoKChpbnQ2NF90KSBiICogKGludDY0X3QpIGIpID4+IDE1KSAtICgxIDw8ICgxNQorICAgICAgICAgICAgICAgICAgICAgICAgKyAyKSkpOworCisgICAgICAgICAgICAgICAgTE9HVl9JRihkZWx0YSA+ICgxPDwzMCksICIgZGVsdGEgb3ZlcmZsb3cgJWQiLCBkZWx0YSk7CisKKyAgICAgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgZEcyICVkLCBiICVkLCBkZWx0YSAlZCwgbV9uQ29zV1RfNUtIeiAlZCIsIGRHMiwgYiwgZGVsdGEsIHBSZXZlcmItPm1fbkNvc1dUXzVLSHopOworICAgICAgICAgICAgICAgIC8vIG1fblJvb21McGZGYmsgPSAtYTEgPSAtICgtIGIgKyBzcXJ0KGRlbHRhKSkgLyAyCisgICAgICAgICAgICAgICAgcFJldmVyYi0+bV9uUm9vbUxwZkZiayA9IChiIC0gRWZmZWN0c19TcXJ0KGRlbHRhKSAqIDE4MSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCBvbGcgREMgZ2FpbiAlZCBuZXcgbV9uUm9vbUxwZkZiayAlZCwgb2xkIG1fblJvb21McGZGd2QgJWQiLAorICAgICAgICAgICAgICAgICAgICB0ZW1wMiwgcFJldmVyYi0+bV9uUm9vbUxwZkZiaywgcFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCk7CisKKyAgICAgICAgICAgIHBSZXZlcmItPm1fblJvb21McGZGd2QKKyAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEodGVtcDIsICgzMjc2NyAtIHBSZXZlcmItPm1fblJvb21McGZGYmspKTsKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCBuZXcgbV9uUm9vbUxwZkZ3ZCAlZCIsIHBSZXZlcmItPm1fblJvb21McGZGd2QpOworCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZTMyID0gcFByb3BlcnRpZXMtPmRlY2F5VGltZTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUU6CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbWlsbGlzZWNvbmRzIHRvID0+IG1fblJ2YkxwZkZ3ZCAoZnVuY3Rpb24gb2YgbV9uUnZiTHBmRmJrKQorICAgICAgICAgICAgLy8gY29udmVydCBtcyB0byBzYW1wbGVzCisgICAgICAgICAgICB2YWx1ZTMyID0gKHZhbHVlMzIgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpIC8gMTAwMDsKKworICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHZhbGlkIGRlY2F5IHRpbWUgcmFuZ2UgYXMgYSBmdW5jdGlvbiBvZiBjdXJyZW50IHJldmVyYiBkZWxheSBhbmQKKyAgICAgICAgICAgIC8vIG1heCBmZWVkIGJhY2sgZ2Fpbi4gTWluIHZhbHVlIDw9PiAtNDBkQiBpbiBvbmUgcGFzcywgTWF4IHZhbHVlIDw9PiBmZWVkYmFjayBnYWluID0gLTEgZEIKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhdHRlbnVhdGlvbiBmb3IgZWFjaCByb3VuZCBpbiBsYXRlIHJldmVyYiBnaXZlbiBhIHRvdGFsIGF0dGVudWF0aW9uIG9mIC02MDAwIG1pbGxpYmVscy4KKyAgICAgICAgICAgIC8vIGcgPSAtNjAwMCBkL0RUICwgZyBnYWluIGluIG1pbGxpYmVscywgZCByZXZlcmIgZGVsYXksIERUIGRlY2F5IHRpbWUKKyAgICAgICAgICAgIGF2ZXJhZ2VEZWxheSA9IHBSZXZlcmItPm1fbkxhdGVEZWxheSAtIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbjsKKyAgICAgICAgICAgIGF2ZXJhZ2VEZWxheSArPSAoKHBSZXZlcmItPm1fc0FwMC5tX3pBcE91dCAtIHBSZXZlcmItPm1fc0FwMC5tX3pBcEluKQorICAgICAgICAgICAgICAgICAgICArIChwUmV2ZXJiLT5tX3NBcDEubV96QXBPdXQgLSBwUmV2ZXJiLT5tX3NBcDEubV96QXBJbikpID4+IDE7CisKKyAgICAgICAgICAgIHRlbXAgPSAoLTYwMDAgKiBhdmVyYWdlRGVsYXkpIC8gdmFsdWUzMjsKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9USU1FLCBkZWxheSBzbXBzICVkLCBEVCBzbXBzICVkLCBnYWluIG1CICVkIixhdmVyYWdlRGVsYXksIHZhbHVlMzIsIHRlbXApOworICAgICAgICAgICAgaWYgKHRlbXAgPCAtNDAwMCB8fCB0ZW1wID4gLTEwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGxvdyBwYXNzIGdhaW4gYnkgYWRkaW5nIHJldmVyYiBpbnB1dCBhdHRlbnVhdGlvbiAocFJldmVyYi0+bV9uTGF0ZUdhaW4pIGFuZCBzdWJzdHJhdGluZyBvdXRwdXQKKyAgICAgICAgICAgIC8vIHhmYWRlIGFuZCBzdW0gZ2FpbiAobWF4ICs5ZEIpCisgICAgICAgICAgICB0ZW1wIC09IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyhwUmV2ZXJiLT5tX25MYXRlR2FpbikgKyA5MDA7CisgICAgICAgICAgICB0ZW1wID0gRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2KHRlbXApOworCisgICAgICAgICAgICAvLyBEQyBnYWluICh0ZW1wKSA9IGIwIC8gKDEgKyBhMSkgPSBwUmV2ZXJiLT5tX25SdmJMcGZGd2QgLyAoMzI3NjcgLSBwUmV2ZXJiLT5tX25SdmJMcGZGYmspCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25SdmJMcGZGd2QKKyAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEodGVtcCwgKDMyNzY3IC0gcFJldmVyYi0+bV9uUnZiTHBmRmJrKSk7CisKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9USU1FLCBnYWluICVkLCBuZXcgbV9uUnZiTHBmRndkICVkLCBvbGQgbV9uUnZiTHBmRmJrICVkLCByZXZlcmIgZ2FpbiAlZCIsIHRlbXAsIHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCwgcFJldmVyYi0+bV9uUnZiTHBmRmJrLCBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHMocFJldmVyYi0+bV9uTGF0ZUdhaW4pKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5kZWNheUhGUmF0aW87CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKworICAgICAgICAgICAgLy8gV2UgbGltaXQgbWF4IHZhbHVlIHRvIDEwMDAgYmVjYXVzZSByZXZlcmIgZmlsdGVyIGlzIGxvd3Bhc3Mgb25seQorICAgICAgICAgICAgaWYgKHZhbHVlMTYgPCAxMDAgfHwgdmFsdWUxNiA+IDEwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAvLyBDb252ZXJ0IHBlciBtaWxsZSB0byA9PiBtX25McGZGd2QsIG1fbkxwZkZiaworCisgICAgICAgICAgICAvLyBTYXZlIGN1cnJlbnQgREMgZ2FpbiBtX25Sb29tTHBmRndkIC8gKDMyNzY3IC0gbV9uUm9vbUxwZkZiaykgdG8ga2VlcCBpdCB1bmNoYW5nZWQKKyAgICAgICAgICAgIC8vIHdoaWxlIGNoYW5naW5nIEhGIGxldmVsCisgICAgICAgICAgICB0ZW1wMiA9IChwUmV2ZXJiLT5tX25SdmJMcGZGd2QgPDwgMTUpIC8gKDMyNzY3IC0gcFJldmVyYi0+bV9uUnZiTHBmRmJrKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlMTYgPT0gMTAwMCkgeworICAgICAgICAgICAgICAgIHBSZXZlcmItPm1fblJ2YkxwZkZiayA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludDMyX3QgZEcyLCBiLCBkZWx0YTsKKworICAgICAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHModGVtcDIpOworICAgICAgICAgICAgICAgIC8vIEdfNTAwMEh6ID0gR19EQyAqICgxMDAwL1JFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTykgaW4gbWlsbGliZWxzCisKKyAgICAgICAgICAgICAgICB2YWx1ZTMyID0gKChpbnQzMl90KSAxMDAwIDw8IDE1KSAvIChpbnQzMl90KSB2YWx1ZTE2OworICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgREMgZ2FpbiAlZCwgREMgZ2FpbiBtQiAlZCwgMTAwMC9SICVkIiwgdGVtcDIsIHRlbXAsIHZhbHVlMzIpOworCisgICAgICAgICAgICAgICAgdGVtcCA9IChpbnQzMl90KSAoKChpbnQ2NF90KSB0ZW1wICogKGludDY0X3QpIHZhbHVlMzIpID4+IDE1KTsKKworICAgICAgICAgICAgICAgIGlmICh0ZW1wIDwgLTQwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPIEhGIGdhaW4gb3ZlcmZsb3cgJWQgbUIiLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IC00MDAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX01pbGxpYmVsc1RvTGluZWFyMTYodGVtcCk7CisgICAgICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPLCBIRiBnYWluICVkIiwgdGVtcCk7CisgICAgICAgICAgICAgICAgLy8gZEdeMgorICAgICAgICAgICAgICAgIHRlbXAgPSAodGVtcDIgPDwgMTUpIC8gdGVtcDsKKyAgICAgICAgICAgICAgICBkRzIgPSAoaW50MzJfdCkgKCgoaW50NjRfdCkgdGVtcCAqIChpbnQ2NF90KSB0ZW1wKSA+PiAxNSk7CisKKyAgICAgICAgICAgICAgICAvLyBiID0gMiooQy1kR14yKS8oMS1kR14yKQorICAgICAgICAgICAgICAgIGIgPSAoaW50MzJfdCkgKCgoKGludDY0X3QpIDEgPDwgKDE1ICsgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAqICgoaW50NjRfdCkgcFJldmVyYi0+bV9uQ29zV1RfNUtIeiAtIChpbnQ2NF90KSBkRzIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLyAoKGludDY0X3QpIDMyNzY3IC0gKGludDY0X3QpIGRHMikpOworCisgICAgICAgICAgICAgICAgLy8gZGVsdGEgPSBiXjIgLSA0CisgICAgICAgICAgICAgICAgZGVsdGEgPSAoaW50MzJfdCkgKCgoKGludDY0X3QpIGIgKiAoaW50NjRfdCkgYikgPj4gMTUpIC0gKDEgPDwgKDE1CisgICAgICAgICAgICAgICAgICAgICAgICArIDIpKSk7CisKKyAgICAgICAgICAgICAgICAvLyBtX25Sb29tTHBmRmJrID0gLWExID0gLSAoLSBiICsgc3FydChkZWx0YSkpIC8gMgorICAgICAgICAgICAgICAgIHBSZXZlcmItPm1fblJ2YkxwZkZiayA9IChiIC0gRWZmZWN0c19TcXJ0KGRlbHRhKSAqIDE4MSkgPj4gMTsKKworICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgZEcyICVkLCBiICVkLCBkZWx0YSAlZCIsIGRHMiwgYiwgZGVsdGEpOworCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX01pbGxpYmVsc1RvTGluZWFyMTYodGVtcCk7Ci0gICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8sIEhGIGdhaW4gJWQiLCB0ZW1wKTsKLSAgICAgICAgICAgIC8vIGRHXjIKLSAgICAgICAgICAgIHRlbXAgPSAodGVtcDIgPDwgMTUpIC8gdGVtcDsKLSAgICAgICAgICAgIGRHMiA9IChpbnQzMl90KSAoKChpbnQ2NF90KSB0ZW1wICogKGludDY0X3QpIHRlbXApID4+IDE1KTsKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgZ2FpbiAlZCwgbV9uUnZiTHBmRmJrICVkLCBtX25SdmJMcGZGd2QgJWQiLCB0ZW1wMiwgcFJldmVyYi0+bV9uUnZiTHBmRmJrLCBwUmV2ZXJiLT5tX25SdmJMcGZGd2QpOwogCi0gICAgICAgICAgICAvLyBiID0gMiooQy1kR14yKS8oMS1kR14yKQotICAgICAgICAgICAgYiA9IChpbnQzMl90KSAoKCgoaW50NjRfdCkgMSA8PCAoMTUgKyAxKSkKLSAgICAgICAgICAgICAgICAgICAgKiAoKGludDY0X3QpIHBSZXZlcmItPm1fbkNvc1dUXzVLSHogLSAoaW50NjRfdCkgZEcyKSkKLSAgICAgICAgICAgICAgICAgICAgLyAoKGludDY0X3QpIDMyNzY3IC0gKGludDY0X3QpIGRHMikpOworICAgICAgICAgICAgcFJldmVyYi0+bV9uUnZiTHBmRndkCisgICAgICAgICAgICAgICAgICAgID0gTVVMVF9FRzFfRUcxKHRlbXAyLCAoMzI3NjcgLSBwUmV2ZXJiLT5tX25SdmJMcGZGYmspKTsKIAotICAgICAgICAgICAgLy8gZGVsdGEgPSBiXjIgLSA0Ci0gICAgICAgICAgICBkZWx0YSA9IChpbnQzMl90KSAoKCgoaW50NjRfdCkgYiAqIChpbnQ2NF90KSBiKSA+PiAxNSkgLSAoMSA8PCAoMTUKLSAgICAgICAgICAgICAgICAgICAgKyAyKSkpOworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbHVlMTYgPSBwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNMZXZlbDsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLwogCi0gICAgICAgICAgICAvLyBtX25Sb29tTHBmRmJrID0gLWExID0gLSAoLSBiICsgc3FydChkZWx0YSkpIC8gMgotICAgICAgICAgICAgcFJldmVyYi0+bV9uUnZiTHBmRmJrID0gKGIgLSBFZmZlY3RzX1NxcnQoZGVsdGEpICogMTgxKSA+PiAxOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKKyAgICAgICAgICAgIC8vIFdlIGxpbWl0IG1heCB2YWx1ZSB0byAwIGJlY2F1c2UgZ2FpbiBpcyBsaW1pdGVkIHRvIDBkQgorICAgICAgICAgICAgaWYgKHZhbHVlMTYgPiAwIHx8IHZhbHVlMTYgPCAtNjAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKIAotICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPLCBkRzIgJWQsIGIgJWQsIGRlbHRhICVkIiwgZEcyLCBiLCBkZWx0YSk7CisgICAgICAgICAgICAvLyBDb252ZXJ0IG1pbGxpYmVscyB0byBsaW5lYXIgMTYgYml0IHNpZ25lZCBhbmQgcmVjb21wdXRlIG1fc0Vhcmx5TC5tX25HYWluW2ldIGFuZCBtX3NFYXJseVIubV9uR2FpbltpXS4KKyAgICAgICAgICAgIHZhbHVlMTYgPSBFZmZlY3RzX01pbGxpYmVsc1RvTGluZWFyMTYodmFsdWUxNik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUkVWRVJCX01BWF9OVU1fUkVGTEVDVElPTlM7IGkrKykgeworICAgICAgICAgICAgICAgIHBSZXZlcmItPm1fc0Vhcmx5TC5tX25HYWluW2ldCisgICAgICAgICAgICAgICAgICAgICAgICA9IE1VTFRfRUcxX0VHMShwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpbltpXSx2YWx1ZTE2KTsKKyAgICAgICAgICAgICAgICBwUmV2ZXJiLT5tX3NFYXJseVIubV9uR2FpbltpXQorICAgICAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEocFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5baV0sdmFsdWUxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwUmV2ZXJiLT5tX25FYXJseUdhaW4gPSB2YWx1ZTE2OworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMLCBtX25FYXJseUdhaW4gJWQiLCBwUmV2ZXJiLT5tX25FYXJseUdhaW4pOwogCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdmFsdWUzMiA9IHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0RlbGF5OworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVk6CisgICAgICAgICAgICAvLyBXZSBsaW1pdCBtYXggdmFsdWUgTUFYX0VBUkxZX1RJTUUKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgbXMgdG8gdGltZSB1bml0cworICAgICAgICAgICAgdGVtcCA9ICh2YWx1ZTMyICogNjU1MzYpIC8gMTAwMDsKKyAgICAgICAgICAgIGlmICh0ZW1wIDwgMCB8fCB0ZW1wID4gTUFYX0VBUkxZX1RJTUUpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgIG1heFNhbXBsZXMgPSAoaW50MzJfdCkgKE1BWF9FQVJMWV9USU1FICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKQorICAgICAgICAgICAgICAgICAgICA+PiAxNjsKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTY7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUkVWRVJCX01BWF9OVU1fUkVGTEVDVElPTlM7IGkrKykgeworICAgICAgICAgICAgICAgIHRlbXAyID0gdGVtcCArICgoKGludDMyX3QpIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVtpXQorICAgICAgICAgICAgICAgICAgICAgICAgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2KTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcDIgPiBtYXhTYW1wbGVzKQorICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9IG1heFNhbXBsZXM7CisgICAgICAgICAgICAgICAgcFJldmVyYi0+bV9zRWFybHlMLm1fekRlbGF5W2ldID0gcFJldmVyYi0+bV9uRWFybHkwaW4gKyB0ZW1wMjsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9IHRlbXAgKyAoKChpbnQzMl90KSBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNik7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAyID4gbWF4U2FtcGxlcykKKyAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBtYXhTYW1wbGVzOworICAgICAgICAgICAgICAgIHBSZXZlcmItPm1fc0Vhcmx5Ui5tX3pEZWxheVtpXSA9IHBSZXZlcmItPm1fbkVhcmx5MWluICsgdGVtcDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwUmV2ZXJiLT5tX25FYXJseURlbGF5ID0gdGVtcDsKKworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZLCBtX25FYXJseURlbGF5IHNtcHMgJWQgbWF4IHNtcCBkZWxheSAlZCIsIHBSZXZlcmItPm1fbkVhcmx5RGVsYXksIG1heFNhbXBsZXMpOworCisgICAgICAgICAgICAvLyBDb252ZXJ0IG1pbGxpc2Vjb25kcyB0byBzYW1wbGUgY291bnQgPT4gbV9uRWFybHlEZWxheQorICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbHVlMTYgPSBwUHJvcGVydGllcy0+cmV2ZXJiTGV2ZWw7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6CisgICAgICAgICAgICAvLyBXZSBsaW1pdCBtYXggdmFsdWUgdG8gMCBiZWNhdXNlIGdhaW4gaXMgbGltaXRlZCB0byAwZEIKKyAgICAgICAgICAgIGlmICh2YWx1ZTE2ID4gMCB8fCB2YWx1ZTE2IDwgLTYwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAvLyBDb252ZXJ0IG1pbGxpYmVscyB0byBsaW5lYXIgMTYgYml0cyAoZ2FuZ2UgMCAtIDgxOTEpID0+IG1fbkxhdGVHYWluLgorICAgICAgICAgICAgcFJldmVyYi0+bV9uTGF0ZUdhaW4gPSBFZmZlY3RzX01pbGxpYmVsc1RvTGluZWFyMTYodmFsdWUxNikgPj4gMjsKKworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTCwgbV9uTGF0ZUdhaW4gJWQiLCBwUmV2ZXJiLT5tX25MYXRlR2Fpbik7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdmFsdWUzMiA9IHBQcm9wZXJ0aWVzLT5yZXZlcmJEZWxheTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKKyAgICAgICAgICAgIC8vIFdlIGxpbWl0IG1heCB2YWx1ZSB0byBNQVhfREVMQVlfVElNRQorICAgICAgICAgICAgLy8gY29udmVydCBtcyB0byB0aW1lIHVuaXRzCisgICAgICAgICAgICB0ZW1wID0gKHZhbHVlMzIgKiA2NTUzNikgLyAxMDAwOworICAgICAgICAgICAgaWYgKHRlbXAgPCAwIHx8IHRlbXAgPiBNQVhfREVMQVlfVElNRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgbWF4U2FtcGxlcyA9IChpbnQzMl90KSAoTUFYX0RFTEFZX1RJTUUgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpCisgICAgICAgICAgICAgICAgICAgID4+IDE2OworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKKyAgICAgICAgICAgIGlmICgodGVtcCArIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbikgPiBtYXhTYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgdGVtcCA9IG1heFNhbXBsZXMgLSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGVtcCA8IHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbikgeworICAgICAgICAgICAgICAgIHRlbXAgPSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXAgLT0gcFJldmVyYi0+bV9uTGF0ZURlbGF5OworICAgICAgICAgICAgcFJldmVyYi0+bV9uRGVsYXkwT3V0ICs9IHRlbXA7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX25EZWxheTFPdXQgKz0gdGVtcDsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fbkxhdGVEZWxheSArPSB0ZW1wOworCisgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZLCBtX25MYXRlRGVsYXkgc21wcyAlZCBtYXggc21wIGRlbGF5ICVkIiwgcFJldmVyYi0+bV9uTGF0ZURlbGF5LCBtYXhTYW1wbGVzKTsKKworICAgICAgICAgICAgLy8gQ29udmVydCBtaWxsaXNlY29uZHMgdG8gc2FtcGxlIGNvdW50ID0+IG1fbkRlbGF5MU91dCArIG1fbk1heEV4Y3Vyc2lvbgorICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHZhbHVlMTYgPSBwUHJvcGVydGllcy0+ZGlmZnVzaW9uOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgorICAgICAgICAgICAgaWYgKHZhbHVlMTYgPCAwIHx8IHZhbHVlMTYgPiAxMDAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAvLyBDb252ZXJ0IHBlciBtaWxsZSB0byBtX3NBcDAubV9uQXBHYWluLCBtX3NBcDEubV9uQXBHYWluCisgICAgICAgICAgICBwUmV2ZXJiLT5tX3NBcDAubV9uQXBHYWluID0gQVAwX0dBSU5fQkFTRSArICgoaW50MzJfdCkgdmFsdWUxNgorICAgICAgICAgICAgICAgICAgICAqIEFQMF9HQUlOX1JBTkdFKSAvIDEwMDA7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX3NBcDEubV9uQXBHYWluID0gQVAxX0dBSU5fQkFTRSArICgoaW50MzJfdCkgdmFsdWUxNgorICAgICAgICAgICAgICAgICAgICAqIEFQMV9HQUlOX1JBTkdFKSAvIDEwMDA7CisKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ESUZGVVNJT04sIG1fc0FwMC5tX25BcEdhaW4gJWQgbV9zQXAxLm1fbkFwR2FpbiAlZCIsIHBSZXZlcmItPm1fc0FwMC5tX25BcEdhaW4sIHBSZXZlcmItPm1fc0FwMS5tX25BcEdhaW4pOworCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RJRkZVU0lPTikKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5kZW5zaXR5OworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKKyAgICAgICAgICAgIGlmICh2YWx1ZTE2IDwgMCB8fCB2YWx1ZTE2ID4gMTAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgLy8gQ29udmVydCBwZXIgbWlsbGUgdG8gbV9zQXAwLm1fekFwT3V0LCBtX3NBcDEubV96QXBPdXQKKyAgICAgICAgICAgIG1heFNhbXBsZXMgPSAoaW50MzJfdCkgKE1BWF9BUF9USU1FICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKKworICAgICAgICAgICAgdGVtcCA9IEFQMF9USU1FX0JBU0UgKyAoKGludDMyX3QpIHZhbHVlMTYgKiBBUDBfVElNRV9SQU5HRSkgLyAxMDAwOworICAgICAgICAgICAgLypsaW50IC1lezcwMn0gc2hpZnQgZm9yIHBlcmZvcm1hbmNlICovCisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2OworICAgICAgICAgICAgaWYgKHRlbXAgPiBtYXhTYW1wbGVzKQorICAgICAgICAgICAgICAgIHRlbXAgPSBtYXhTYW1wbGVzOworICAgICAgICAgICAgcFJldmVyYi0+bV9zQXAwLm1fekFwT3V0ID0gKHVpbnQxNl90KSAocFJldmVyYi0+bV9zQXAwLm1fekFwSW4gKyB0ZW1wKTsKKworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFTlNJVFksIEFwMCBkZWxheSBzbXBzICVkIiwgdGVtcCk7CisKKyAgICAgICAgICAgIHRlbXAgPSBBUDFfVElNRV9CQVNFICsgKChpbnQzMl90KSB2YWx1ZTE2ICogQVAxX1RJTUVfUkFOR0UpIC8gMTAwMDsKKyAgICAgICAgICAgIC8qbGludCAtZXs3MDJ9IHNoaWZ0IGZvciBwZXJmb3JtYW5jZSAqLworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKKyAgICAgICAgICAgIGlmICh0ZW1wID4gbWF4U2FtcGxlcykKKyAgICAgICAgICAgICAgICB0ZW1wID0gbWF4U2FtcGxlczsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fc0FwMS5tX3pBcE91dCA9ICh1aW50MTZfdCkgKHBSZXZlcmItPm1fc0FwMS5tX3pBcEluICsgdGVtcCk7CisKKyAgICAgICAgICAgIExPR1YoIkFwMSBkZWxheSBzbXBzICVkIiwgdGVtcCk7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCi0gICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgZ2FpbiAlZCwgbV9uUnZiTHBmRmJrICVkLCBtX25SdmJMcGZGd2QgJWQiLCB0ZW1wMiwgcFJldmVyYi0+bV9uUnZiTHBmRmJrLCBwUmV2ZXJiLT5tX25SdmJMcGZGd2QpOwotCi0gICAgICAgIHBSZXZlcmItPm1fblJ2YkxwZkZ3ZAotICAgICAgICAgICAgICAgID0gTVVMVF9FRzFfRUcxKHRlbXAyLCAoMzI3NjcgLSBwUmV2ZXJiLT5tX25SdmJMcGZGYmspKTsKLQotICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHZhbHVlMTYgPSBwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNMZXZlbDsKLSAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKLSAgICAgICAgLy8gV2UgbGltaXQgbWF4IHZhbHVlIHRvIDAgYmVjYXVzZSBnYWluIGlzIGxpbWl0ZWQgdG8gMGRCCi0gICAgICAgIGlmICh2YWx1ZTE2ID4gMCB8fCB2YWx1ZTE2IDwgLTYwMDApCi0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgICAgICAvLyBDb252ZXJ0IG1pbGxpYmVscyB0byBsaW5lYXIgMTYgYml0IHNpZ25lZCBhbmQgcmVjb21wdXRlIG1fc0Vhcmx5TC5tX25HYWluW2ldIGFuZCBtX3NFYXJseVIubV9uR2FpbltpXS4KLSAgICAgICAgdmFsdWUxNiA9IEVmZmVjdHNfTWlsbGliZWxzVG9MaW5lYXIxNih2YWx1ZTE2KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TOyBpKyspIHsKLSAgICAgICAgICAgIHBSZXZlcmItPm1fc0Vhcmx5TC5tX25HYWluW2ldCi0gICAgICAgICAgICAgICAgICAgID0gTVVMVF9FRzFfRUcxKHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluW2ldLHZhbHVlMTYpOwotICAgICAgICAgICAgcFJldmVyYi0+bV9zRWFybHlSLm1fbkdhaW5baV0KLSAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEocFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5baV0sdmFsdWUxNik7Ci0gICAgICAgIH0KLSAgICAgICAgcFJldmVyYi0+bV9uRWFybHlHYWluID0gdmFsdWUxNjsKLSAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMLCBtX25FYXJseUdhaW4gJWQiLCBwUmV2ZXJiLT5tX25FYXJseUdhaW4pOwotCi0gICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdmFsdWUzMiA9IHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0RlbGF5OwotICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KLQotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgotICAgICAgICAvLyBXZSBsaW1pdCBtYXggdmFsdWUgTUFYX0VBUkxZX1RJTUUKLSAgICAgICAgLy8gY29udmVydCBtcyB0byB0aW1lIHVuaXRzCi0gICAgICAgIHRlbXAgPSAodmFsdWUzMiAqIDY1NTM2KSAvIDEwMDA7Ci0gICAgICAgIGlmICh0ZW1wIDwgMCB8fCB0ZW1wID4gTUFYX0VBUkxZX1RJTUUpCi0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgICAgICBtYXhTYW1wbGVzID0gKGludDMyX3QpIChNQVhfRUFSTFlfVElNRSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkKLSAgICAgICAgICAgICAgICA+PiAxNjsKLSAgICAgICAgdGVtcCA9ICh0ZW1wICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TOyBpKyspIHsKLSAgICAgICAgICAgIHRlbXAyID0gdGVtcCArICgoKGludDMyX3QpIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVtpXQotICAgICAgICAgICAgICAgICAgICAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTYpOwotICAgICAgICAgICAgaWYgKHRlbXAyID4gbWF4U2FtcGxlcykKLSAgICAgICAgICAgICAgICB0ZW1wMiA9IG1heFNhbXBsZXM7Ci0gICAgICAgICAgICBwUmV2ZXJiLT5tX3NFYXJseUwubV96RGVsYXlbaV0gPSBwUmV2ZXJiLT5tX25FYXJseTBpbiArIHRlbXAyOwotICAgICAgICAgICAgdGVtcDIgPSB0ZW1wICsgKCgoaW50MzJfdCkgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5W2ldCi0gICAgICAgICAgICAgICAgICAgICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNik7Ci0gICAgICAgICAgICBpZiAodGVtcDIgPiBtYXhTYW1wbGVzKQotICAgICAgICAgICAgICAgIHRlbXAyID0gbWF4U2FtcGxlczsKLSAgICAgICAgICAgIHBSZXZlcmItPm1fc0Vhcmx5Ui5tX3pEZWxheVtpXSA9IHBSZXZlcmItPm1fbkVhcmx5MWluICsgdGVtcDI7Ci0gICAgICAgIH0KLSAgICAgICAgcFJldmVyYi0+bV9uRWFybHlEZWxheSA9IHRlbXA7Ci0KLSAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZLCBtX25FYXJseURlbGF5IHNtcHMgJWQgbWF4IHNtcCBkZWxheSAlZCIsIHBSZXZlcmItPm1fbkVhcmx5RGVsYXksIG1heFNhbXBsZXMpOwotCi0gICAgICAgIC8vIENvbnZlcnQgbWlsbGlzZWNvbmRzIHRvIHNhbXBsZSBjb3VudCA9PiBtX25FYXJseURlbGF5Ci0gICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5yZXZlcmJMZXZlbDsKLSAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6Ci0gICAgICAgIC8vIFdlIGxpbWl0IG1heCB2YWx1ZSB0byAwIGJlY2F1c2UgZ2FpbiBpcyBsaW1pdGVkIHRvIDBkQgotICAgICAgICBpZiAodmFsdWUxNiA+IDAgfHwgdmFsdWUxNiA8IC02MDAwKQotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIC8vIENvbnZlcnQgbWlsbGliZWxzIHRvIGxpbmVhciAxNiBiaXRzIChnYW5nZSAwIC0gODE5MSkgPT4gbV9uTGF0ZUdhaW4uCi0gICAgICAgIHBSZXZlcmItPm1fbkxhdGVHYWluID0gRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2KHZhbHVlMTYpID4+IDI7Ci0KLSAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTCwgbV9uTGF0ZUdhaW4gJWQiLCBwUmV2ZXJiLT5tX25MYXRlR2Fpbik7Ci0KLSAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdmFsdWUzMiA9IHBQcm9wZXJ0aWVzLT5yZXZlcmJEZWxheTsKLSAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6Ci0gICAgICAgIC8vIFdlIGxpbWl0IG1heCB2YWx1ZSB0byBNQVhfREVMQVlfVElNRQotICAgICAgICAvLyBjb252ZXJ0IG1zIHRvIHRpbWUgdW5pdHMKLSAgICAgICAgdGVtcCA9ICh2YWx1ZTMyICogNjU1MzYpIC8gMTAwMDsKLSAgICAgICAgaWYgKHRlbXAgPCAwIHx8IHRlbXAgPiBNQVhfREVMQVlfVElNRSkKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotCi0gICAgICAgIG1heFNhbXBsZXMgPSAoaW50MzJfdCkgKE1BWF9ERUxBWV9USU1FICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKQotICAgICAgICAgICAgICAgID4+IDE2OwotICAgICAgICB0ZW1wID0gKHRlbXAgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2OwotICAgICAgICBpZiAoKHRlbXAgKyBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24pID4gbWF4U2FtcGxlcykgewotICAgICAgICAgICAgdGVtcCA9IG1heFNhbXBsZXMgLSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb247Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRlbXAgPCBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24pIHsKLSAgICAgICAgICAgIHRlbXAgPSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb247Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wIC09IHBSZXZlcmItPm1fbkxhdGVEZWxheTsKLSAgICAgICAgcFJldmVyYi0+bV9uRGVsYXkwT3V0ICs9IHRlbXA7Ci0gICAgICAgIHBSZXZlcmItPm1fbkRlbGF5MU91dCArPSB0ZW1wOwotICAgICAgICBwUmV2ZXJiLT5tX25MYXRlRGVsYXkgKz0gdGVtcDsKLQotICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZLCBtX25MYXRlRGVsYXkgc21wcyAlZCBtYXggc21wIGRlbGF5ICVkIiwgcFJldmVyYi0+bV9uTGF0ZURlbGF5LCBtYXhTYW1wbGVzKTsKLQotICAgICAgICAvLyBDb252ZXJ0IG1pbGxpc2Vjb25kcyB0byBzYW1wbGUgY291bnQgPT4gbV9uRGVsYXkxT3V0ICsgbV9uTWF4RXhjdXJzaW9uCi0gICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5kaWZmdXNpb247Ci0gICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLwotCi0gICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgotICAgICAgICBpZiAodmFsdWUxNiA8IDAgfHwgdmFsdWUxNiA+IDEwMDApCi0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgICAgICAvLyBDb252ZXJ0IHBlciBtaWxsZSB0byBtX3NBcDAubV9uQXBHYWluLCBtX3NBcDEubV9uQXBHYWluCi0gICAgICAgIHBSZXZlcmItPm1fc0FwMC5tX25BcEdhaW4gPSBBUDBfR0FJTl9CQVNFICsgKChpbnQzMl90KSB2YWx1ZTE2Ci0gICAgICAgICAgICAgICAgKiBBUDBfR0FJTl9SQU5HRSkgLyAxMDAwOwotICAgICAgICBwUmV2ZXJiLT5tX3NBcDEubV9uQXBHYWluID0gQVAxX0dBSU5fQkFTRSArICgoaW50MzJfdCkgdmFsdWUxNgotICAgICAgICAgICAgICAgICogQVAxX0dBSU5fUkFOR0UpIC8gMTAwMDsKLQotICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fRElGRlVTSU9OLCBtX3NBcDAubV9uQXBHYWluICVkIG1fc0FwMS5tX25BcEdhaW4gJWQiLCBwUmV2ZXJiLT5tX3NBcDAubV9uQXBHYWluLCBwUmV2ZXJiLT5tX3NBcDEubV9uQXBHYWluKTsKLQotICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RJRkZVU0lPTikKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHZhbHVlMTYgPSBwUHJvcGVydGllcy0+ZGVuc2l0eTsKLSAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCi0KLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgotICAgICAgICBpZiAodmFsdWUxNiA8IDAgfHwgdmFsdWUxNiA+IDEwMDApCi0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgICAgICAvLyBDb252ZXJ0IHBlciBtaWxsZSB0byBtX3NBcDAubV96QXBPdXQsIG1fc0FwMS5tX3pBcE91dAotICAgICAgICBtYXhTYW1wbGVzID0gKGludDMyX3QpIChNQVhfQVBfVElNRSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTY7Ci0KLSAgICAgICAgdGVtcCA9IEFQMF9USU1FX0JBU0UgKyAoKGludDMyX3QpIHZhbHVlMTYgKiBBUDBfVElNRV9SQU5HRSkgLyAxMDAwOwotICAgICAgICAvKmxpbnQgLWV7NzAyfSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KLSAgICAgICAgdGVtcCA9ICh0ZW1wICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKLSAgICAgICAgaWYgKHRlbXAgPiBtYXhTYW1wbGVzKQotICAgICAgICAgICAgdGVtcCA9IG1heFNhbXBsZXM7Ci0gICAgICAgIHBSZXZlcmItPm1fc0FwMC5tX3pBcE91dCA9ICh1aW50MTZfdCkgKHBSZXZlcmItPm1fc0FwMC5tX3pBcEluICsgdGVtcCk7Ci0KLSAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFTlNJVFksIEFwMCBkZWxheSBzbXBzICVkIiwgdGVtcCk7Ci0KLSAgICAgICAgdGVtcCA9IEFQMV9USU1FX0JBU0UgKyAoKGludDMyX3QpIHZhbHVlMTYgKiBBUDFfVElNRV9SQU5HRSkgLyAxMDAwOwotICAgICAgICAvKmxpbnQgLWV7NzAyfSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KLSAgICAgICAgdGVtcCA9ICh0ZW1wICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKLSAgICAgICAgaWYgKHRlbXAgPiBtYXhTYW1wbGVzKQotICAgICAgICAgICAgdGVtcCA9IG1heFNhbXBsZXM7Ci0gICAgICAgIHBSZXZlcmItPm1fc0FwMS5tX3pBcE91dCA9ICh1aW50MTZfdCkgKHBSZXZlcmItPm1fc0FwMS5tX3pBcEluICsgdGVtcCk7Ci0KLSAgICAgICAgTE9HVigiQXAxIGRlbGF5IHNtcHMgJWQiLCB0ZW1wKTsKLQotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwogICAgIH0KKwogICAgIHJldHVybiAwOwogfSAvKiBlbmQgUmV2ZXJiX3NldFBhcmFtZXRlciAqLwogCkBAIC0xOTA1LDEzOSArMTk0NywxNSBAQAogICovCiBzdGF0aWMgaW50IFJldmVyYlJlYWRJblByZXNldHMocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiKSB7CiAKLSAgICBpbnQgcHJlc2V0ID0gMDsKLSAgICBpbnQgZGVmYXVsdFByZXNldCA9IDA7CisgICAgaW50IHByZXNldDsKIAotICAgIC8vbm93IGluaXQgYW55IHJlbWFpbmluZyBwcmVzZXRzIHRvIGRlZmF1bHRzCi0gICAgZm9yIChkZWZhdWx0UHJlc2V0ID0gcHJlc2V0OyBkZWZhdWx0UHJlc2V0IDwgUkVWRVJCX01BWF9ST09NX1RZUEU7IGRlZmF1bHRQcmVzZXQrKykgewotICAgICAgICByZXZlcmJfcHJlc2V0X3QgKnBQcmVzZXQgPSAmcFJldmVyYi0+bV9zUHJlc2V0Lm1fc1ByZXNldFtkZWZhdWx0UHJlc2V0XTsKLSAgICAgICAgaWYgKGRlZmF1bHRQcmVzZXQgPT0gMCB8fCBkZWZhdWx0UHJlc2V0ID4gUkVWRVJCX01BWF9ST09NX1RZUEUgLSAxKSB7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25SdmJMcGZGYmsgPSA4MzA3OwotICAgICAgICAgICAgcFByZXNldC0+bV9uUnZiTHBmRndkID0gMTQ3Njg7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25FYXJseUdhaW4gPSAyNzY5MDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fbkVhcmx5RGVsYXkgPSAxMzExOwotICAgICAgICAgICAgcFByZXNldC0+bV9uTGF0ZUdhaW4gPSA4MTkxOwotICAgICAgICAgICAgcFByZXNldC0+bV9uTGF0ZURlbGF5ID0gMzkzMjsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fblJvb21McGZGYmsgPSAzNjkyOwotICAgICAgICAgICAgcFByZXNldC0+bV9uUm9vbUxwZkZ3ZCA9IDI0NTY5OwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzBdID0gMTM3NjsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzBdID0gMjIxNTI7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMV0gPSAyMTYzOwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMV0gPSAxNzUzNzsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVsyXSA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblsyXSA9IDE0NzY4OwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzNdID0gMTgzNTsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzNdID0gMTQzMDc7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbNF0gPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bNF0gPSAxMzM4NDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVswXSA9IDcyMTsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzBdID0gMjAzMDY7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMV0gPSAyNjIxOwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMV0gPSAxNzUzNzsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVsyXSA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblsyXSA9IDE0NzY4OwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzNdID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzNdID0gMTYxNTM7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbNF0gPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bNF0gPSAxMzM4NDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fbk1heEV4Y3Vyc2lvbiA9IDEyNzsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fblhmYWRlSW50ZXJ2YWwgPSA2Mzg4OwotICAgICAgICAgICAgcFByZXNldC0+bV9uQXAwX0FwR2FpbiA9IDE1NjkxOwotICAgICAgICAgICAgcFByZXNldC0+bV9uQXAwX0FwT3V0ID0gNzExOwotICAgICAgICAgICAgcFByZXNldC0+bV9uQXAxX0FwR2FpbiA9IDE2MzE3OwotICAgICAgICAgICAgcFByZXNldC0+bV9uQXAxX0FwT3V0ID0gMTAyOTsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NCA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTUgPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9yZnU2ID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NyA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTggPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9yZnU5ID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1MTAgPSAwOwotICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRQcmVzZXQgPT0gMSkgewotICAgICAgICAgICAgcFByZXNldC0+bV9uUnZiTHBmRmJrID0gNjQ2MTsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZ3ZCA9IDE0MzA3OwotICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlHYWluID0gMjc2OTA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25FYXJseURlbGF5ID0gMTMxMTsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fbkxhdGVHYWluID0gODE5MTsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fbkxhdGVEZWxheSA9IDM5MzI7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRmJrID0gMzY5MjsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fblJvb21McGZGd2QgPSAyNDU2OTsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVswXSA9IDEzNzY7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblswXSA9IDIyMTUyOwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzFdID0gMTQ2MjsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzFdID0gMTc1Mzc7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMl0gPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMl0gPSAxNDc2ODsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVszXSA9IDE4MzU7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblszXSA9IDE0MzA3OwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzRdID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzRdID0gMTMzODQ7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMF0gPSA3MjE7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblswXSA9IDIwMzA2OwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzFdID0gMjYyMTsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzFdID0gMTc1Mzc7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMl0gPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMl0gPSAxNDc2ODsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVszXSA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblszXSA9IDE2MTUzOwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzRdID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzRdID0gMTMzODQ7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25NYXhFeGN1cnNpb24gPSAxMjc7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25YZmFkZUludGVydmFsID0gNjM5MTsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMF9BcEdhaW4gPSAxNTIzMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMF9BcE91dCA9IDcwODsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMV9BcEdhaW4gPSAxNTU0NzsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMV9BcE91dCA9IDEwMjM7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTQgPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9yZnU1ID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NiA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTcgPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9yZnU4ID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1OSA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTEwID0gMDsKLSAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0UHJlc2V0ID09IDIpIHsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZiayA9IDUwNzc7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25SdmJMcGZGd2QgPSAxMjkyMjsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fbkVhcmx5R2FpbiA9IDI3NjkwOwotICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlEZWxheSA9IDEzMTE7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlR2FpbiA9IDgxOTE7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlRGVsYXkgPSAzOTMyOwotICAgICAgICAgICAgcFByZXNldC0+bV9uUm9vbUxwZkZiayA9IDM2OTI7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRndkID0gMjE3MDM7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMF0gPSAxMzc2OwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMF0gPSAyMjE1MjsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVsxXSA9IDE0NjI7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblsxXSA9IDE3NTM3OwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzJdID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzJdID0gMTQ3Njg7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbM10gPSAxODM1OwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bM10gPSAxNDMwNzsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVs0XSA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2Fpbls0XSA9IDEzMzg0OwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzBdID0gNzIxOwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMF0gPSAyMDMwNjsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVsxXSA9IDI2MjE7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblsxXSA9IDE3NTM3OwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzJdID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzJdID0gMTQ3Njg7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbM10gPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bM10gPSAxNjE1MzsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVs0XSA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2Fpbls0XSA9IDEzMzg0OwotICAgICAgICAgICAgcFByZXNldC0+bV9uTWF4RXhjdXJzaW9uID0gMTI3OwotICAgICAgICAgICAgcFByZXNldC0+bV9uWGZhZGVJbnRlcnZhbCA9IDY0NDk7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBHYWluID0gMTU2OTE7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBPdXQgPSA3NzQ7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBHYWluID0gMTYzMTc7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBPdXQgPSAxMTU1OwotICAgICAgICAgICAgcFByZXNldC0+bV9yZnU0ID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NSA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTYgPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9yZnU3ID0gMDsKLSAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1OCA9IDA7Ci0gICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTkgPSAwOwotICAgICAgICAgICAgcFByZXNldC0+bV9yZnUxMCA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdFByZXNldCA9PSAzKSB7CisgICAgLy8gdGhpcyBpcyBmb3IgdGVzdCBvbmx5LiBPcGVuU0wgRVMgcHJlc2V0cyBhcmUgbWFwcGVkIHRvIDQgcHJlc2V0cy4KKyAgICAvLyBSRVZFUkJfUFJFU0VUX05PTkUgaXMgbWFwcGVkIHRvIGJ5cGFzcworICAgIGZvciAocHJlc2V0ID0gMDsgcHJlc2V0IDwgUkVWRVJCX05VTV9QUkVTRVRTOyBwcmVzZXQrKykgeworICAgICAgICByZXZlcmJfcHJlc2V0X3QgKnBQcmVzZXQgPSAmcFJldmVyYi0+bV9zUHJlc2V0Lm1fc1ByZXNldFtwcmVzZXRdOworICAgICAgICBzd2l0Y2ggKHByZXNldCArIDEpIHsKKyAgICAgICAgY2FzZSBSRVZFUkJfUFJFU0VUX1BMQVRFOgorICAgICAgICBjYXNlIFJFVkVSQl9QUkVTRVRfU01BTExST09NOgogICAgICAgICAgICAgcFByZXNldC0+bV9uUnZiTHBmRmJrID0gNTA3NzsKICAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZ3ZCA9IDExMDc2OwogICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlHYWluID0gMjc2OTA7CkBAIC0yMDc5LDYgKzE5OTcsMTM3IEBACiAgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTggPSAwOwogICAgICAgICAgICAgcFByZXNldC0+bV9yZnU5ID0gMDsKICAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1MTAgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BSRVNFVF9NRURJVU1ST09NOgorICAgICAgICBjYXNlIFJFVkVSQl9QUkVTRVRfTEFSR0VST09NOgorICAgICAgICAgICAgcFByZXNldC0+bV9uUnZiTHBmRmJrID0gNTA3NzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZ3ZCA9IDEyOTIyOworICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlHYWluID0gMjc2OTA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25FYXJseURlbGF5ID0gMTMxMTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkxhdGVHYWluID0gODE5MTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkxhdGVEZWxheSA9IDM5MzI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRmJrID0gMzY5MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJvb21McGZGd2QgPSAyMTcwMzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVswXSA9IDEzNzY7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblswXSA9IDIyMTUyOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzFdID0gMTQ2MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzFdID0gMTc1Mzc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMl0gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMl0gPSAxNDc2ODsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVszXSA9IDE4MzU7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblszXSA9IDE0MzA3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzRdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzRdID0gMTMzODQ7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMF0gPSA3MjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblswXSA9IDIwMzA2OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzFdID0gMjYyMTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzFdID0gMTc1Mzc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMl0gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMl0gPSAxNDc2ODsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVszXSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblszXSA9IDE2MTUzOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzRdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzRdID0gMTMzODQ7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25NYXhFeGN1cnNpb24gPSAxMjc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25YZmFkZUludGVydmFsID0gNjQ0OTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMF9BcEdhaW4gPSAxNTY5MTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMF9BcE91dCA9IDc3NDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMV9BcEdhaW4gPSAxNjMxNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMV9BcE91dCA9IDExNTU7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTQgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU1ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NiA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTcgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU4ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1OSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTEwID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QUkVTRVRfTUVESVVNSEFMTDoKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZiayA9IDY0NjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25SdmJMcGZGd2QgPSAxNDMwNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkVhcmx5R2FpbiA9IDI3NjkwOworICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlEZWxheSA9IDEzMTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlR2FpbiA9IDgxOTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlRGVsYXkgPSAzOTMyOworICAgICAgICAgICAgcFByZXNldC0+bV9uUm9vbUxwZkZiayA9IDM2OTI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRndkID0gMjQ1Njk7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMF0gPSAxMzc2OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMF0gPSAyMjE1MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVsxXSA9IDE0NjI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbM10gPSAxODM1OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bM10gPSAxNDMwNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzBdID0gNzIxOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMF0gPSAyMDMwNjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVsxXSA9IDI2MjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbM10gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bM10gPSAxNjE1MzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9uTWF4RXhjdXJzaW9uID0gMTI3OworICAgICAgICAgICAgcFByZXNldC0+bV9uWGZhZGVJbnRlcnZhbCA9IDYzOTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBHYWluID0gMTUyMzA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBPdXQgPSA3MDg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBHYWluID0gMTU1NDc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBPdXQgPSAxMDIzOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU0ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTYgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU3ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1OCA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTkgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnUxMCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUFJFU0VUX0xBUkdFSEFMTDoKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZiayA9IDgzMDc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25SdmJMcGZGd2QgPSAxNDc2ODsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkVhcmx5R2FpbiA9IDI3NjkwOworICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlEZWxheSA9IDEzMTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlR2FpbiA9IDgxOTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlRGVsYXkgPSAzOTMyOworICAgICAgICAgICAgcFByZXNldC0+bV9uUm9vbUxwZkZiayA9IDM2OTI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRndkID0gMjQ1Njk7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMF0gPSAxMzc2OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMF0gPSAyMjE1MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVsxXSA9IDIxNjM7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbM10gPSAxODM1OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bM10gPSAxNDMwNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzBdID0gNzIxOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMF0gPSAyMDMwNjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVsxXSA9IDI2MjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbM10gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bM10gPSAxNjE1MzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9uTWF4RXhjdXJzaW9uID0gMTI3OworICAgICAgICAgICAgcFByZXNldC0+bV9uWGZhZGVJbnRlcnZhbCA9IDYzODg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBHYWluID0gMTU2OTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBPdXQgPSA3MTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBHYWluID0gMTYzMTc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBPdXQgPSAxMDI5OworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU0ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTYgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU3ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1OCA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTkgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnUxMCA9IDA7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RSZXZlcmIuaCBiL21lZGlhL2xpYmVmZmVjdHMvRWZmZWN0UmV2ZXJiLmgKaW5kZXggZjVhYWRmYS4uZWU4ZTM5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RSZXZlcmIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdFJldmVyYi5oCkBAIC0xNyw3ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfRUZGRUNUUkVWRVJCX0hfCiAjZGVmaW5lIEFORFJPSURfRUZGRUNUUkVWRVJCX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RSZXZlcmJBcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0UHJlc2V0UmV2ZXJiQXBpLmg+CiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQzLDcgKzQ0LDcgQEAKIAogI2RlZmluZSBSRVZFUkJfQlVGRkVSX1NJWkVfSU5fU0FNUExFU19NQVggICAxNjM4NAogCi0jZGVmaW5lIFJFVkVSQl9NQVhfUk9PTV9UWVBFICAgICAgICAgICAgNCAgIC8vIGFueSByb29tIG51bWJlcnMgbGFyZ2VyIHRoYW4gdGhpcyBhcmUgaW52YWxpZAorI2RlZmluZSBSRVZFUkJfTlVNX1BSRVNFVFMgIFJFVkVSQl9QUkVTRVRfUExBVEUgICAvLyBSRVZFUkJfUFJFU0VUX05PTkUgaXMgbm90IGluY2x1ZGVkCiAjZGVmaW5lIFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TICAgICAgNSAgIC8vIG1heCBudW0gcmVmbGVjdGlvbnMgcGVyIGNoYW5uZWwKIAogCkBAIC0xMTMsNiArMTE0LDEyIEBACiAjZGVmaW5lIEFQMV9HQUlOX1JBTkdFIChpbnQpKDIyOTM2LTY1NTMpCiAKIAorZW51bSByZXZlcmJfc3RhdGVfZSB7CisgICAgUkVWRVJCX1NUQVRFX1VOSU5JVElBTElaRUQsCisgICAgUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVELAorICAgIFJFVkVSQl9TVEFURV9BQ1RJVkUsCit9OworCiAvKiBwYXJhbWV0ZXJzIGZvciBlYWNoIGFsbHBhc3MgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xNzEsNyArMTc4LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICByZXZlcmJfcHJlc2V0X3QgICAgIG1fc1ByZXNldFtSRVZFUkJfTUFYX1JPT01fVFlQRV07ICAgIC8vYXJyYXkgb2YgcHJlc2V0cworICAgIHJldmVyYl9wcmVzZXRfdCAgICAgbV9zUHJlc2V0W1JFVkVSQl9OVU1fUFJFU0VUU107IC8vIGFycmF5IG9mIHByZXNldHMoZG9lcyBub3QgaW5jbHVkZSBSRVZFUkJfUFJFU0VUX05PTkUpCiAKIH0gcmV2ZXJiX3ByZXNldF9iYW5rX3Q7CiAKQEAgLTI3OCw2ICsyODUsNyBAQAogICAgIHVpbnQxNl90ICAgICAgICAgICAgbV9BdXg7ICAgICAgICAgICAgICAgIC8vIGlmIFRSVUUsIGlzIGNvbm5lY3RlZCBhcyBhdXhpbGlhcnkgZWZmZWN0CiAgICAgdWludDE2X3QgICAgICAgICAgICBtX1ByZXNldDsgICAgICAgICAgICAgLy8gaWYgVFJVRSwgZXhwb3NlIHByZXNldCByZXZlcnQgaW50ZXJmYWNlCiAKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1TdGF0ZTsKIH0gcmV2ZXJiX29iamVjdF90OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvRWZmZWN0VmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZGEwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJWaXN1YWxpemVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHZpc3VhbGl6ZXIgZWZmZWN0CitleHRlcm4gIkMiIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ1Zpc3VhbGl6ZXJJbnRlcmZhY2U7CisKKy8vIEdvb2dsZSBWaXN1YWxpemVyIFVVSUQ6IGQwNjlkOWUwLTgzMjktMTFkZi05MTY4LTAwMDJhNWQ1YzUxYgorY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnVmlzdWFsaXplckRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweGU0NmIyNmEwLCAweGRkZGQsIDB4MTFkYiwgMHg4YWZkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB0eXBlCisgICAgICAgIHsweGQwNjlkOWUwLCAweDgzMjksIDB4MTFkZiwgMHg5MTY4LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB1dWlkCisgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUKSwKKyAgICAgICAgMCwgLy8gVE9ETworICAgICAgICAxLAorICAgICAgICAiVmlzdWFsaXplciIsCisgICAgICAgICJHb29nbGUgSW5jLiIsCit9OworCitlbnVtIHZpc3VhbGl6ZXJfc3RhdGVfZSB7CisgICAgVklTVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVELAorICAgIFZJU1VBTElaRVJfU1RBVEVfSU5JVElBTElaRUQsCisgICAgVklTVUFMSVpFUl9TVEFURV9BQ1RJVkUsCit9OworCitzdHJ1Y3QgVmlzdWFsaXplckNvbnRleHQgeworICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKm1JdGZlOworICAgIGVmZmVjdF9jb25maWdfdCBtQ29uZmlnOworICAgIHVpbnQzMl90IG1TdGF0ZTsKKyAgICB1aW50MzJfdCBtQ2FwdHVyZUlkeDsKKyAgICB1aW50MzJfdCBtQ2FwdHVyZVNpemU7CisgICAgdWludDMyX3QgbUN1cnJlbnRCdWY7CisgICAgdWludDhfdCBtQ2FwdHVyZUJ1ZlsyXVtWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVhdOworfTsKKworCisvLworLy8tLS0gTG9jYWwgZnVuY3Rpb25zCisvLworCit2b2lkIFZpc3VhbGl6ZXJfcmVzZXQoVmlzdWFsaXplckNvbnRleHQgKnBDb250ZXh0KQoreworICAgIHBDb250ZXh0LT5tQ2FwdHVyZUlkeCA9IDA7CisgICAgcENvbnRleHQtPm1DdXJyZW50QnVmID0gMDsKKyAgICBtZW1zZXQocENvbnRleHQtPm1DYXB0dXJlQnVmWzBdLCAwLCBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVgpOworICAgIG1lbXNldChwQ29udGV4dC0+bUNhcHR1cmVCdWZbMV0sIDAsIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlzdWFsaXplcl9jb25maWd1cmUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBTZXQgaW5wdXQgYW5kIG91dHB1dCBhdWRpbyBjb25maWd1cmF0aW9uLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBwQ29uZmlnOiAgICBwb2ludGVyIHRvIGVmZmVjdF9jb25maWdfdCBzdHJ1Y3R1cmUgaG9sZGluZyBpbnB1dCBhbmQgb3V0cHV0CisvLyAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWaXN1YWxpemVyX2NvbmZpZ3VyZShWaXN1YWxpemVyQ29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZykKK3sKKyAgICBMT0dWKCJWaXN1YWxpemVyX2NvbmZpZ3VyZSBzdGFydCIpOworCisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBDSEFOTkVMX1NURVJFTykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCisgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IFNBTVBMRV9GT1JNQVRfUENNX1MxNSkgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBtZW1jcHkoJnBDb250ZXh0LT5tQ29uZmlnLCBwQ29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7CisKKyAgICBWaXN1YWxpemVyX3Jlc2V0KHBDb250ZXh0KTsKKworICAgIHJldHVybiAwOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlzdWFsaXplcl9pbml0KCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogSW5pdGlhbGl6ZSBlbmdpbmUgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWaXN1YWxpemVyX2luaXQoVmlzdWFsaXplckNvbnRleHQgKnBDb250ZXh0KQoreworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfU1RFUkVPOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgICAgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSA9IFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWDsKKworICAgIFZpc3VhbGl6ZXJfY29uZmlndXJlKHBDb250ZXh0LCAmcENvbnRleHQtPm1Db25maWcpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8vCisvLy0tLSBFZmZlY3QgTGlicmFyeSBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KKy8vCisKK2V4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKKyAgICAqcE51bUVmZmVjdHMgPSAxOworICAgIHJldHVybiAwOworfQorCitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKGluZGV4ID4gMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ1Zpc3VhbGl6ZXJEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIHJldHVybiAwOworfQorCitleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCisgICAgICAgIGludDMyX3QgaW9JZCwKKyAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90ICpwSW50ZXJmYWNlKSB7CisgICAgaW50IHJldDsKKyAgICBpbnQgaTsKKworICAgIGlmIChwSW50ZXJmYWNlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChtZW1jbXAodXVpZCwgJmdWaXN1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgVmlzdWFsaXplckNvbnRleHQgKnBDb250ZXh0ID0gbmV3IFZpc3VhbGl6ZXJDb250ZXh0OworCisgICAgcENvbnRleHQtPm1JdGZlID0gJmdWaXN1YWxpemVySW50ZXJmYWNlOworICAgIHBDb250ZXh0LT5tU3RhdGUgPSBWSVNVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQ7CisKKyAgICByZXQgPSBWaXN1YWxpemVyX2luaXQocENvbnRleHQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIExPR1coIkVmZmVjdENyZWF0ZSgpIGluaXQgZmFpbGVkIik7CisgICAgICAgIGRlbGV0ZSBwQ29udGV4dDsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqcEludGVyZmFjZSA9IChlZmZlY3RfaW50ZXJmYWNlX3QpcENvbnRleHQ7CisKKyAgICBwQ29udGV4dC0+bVN0YXRlID0gVklTVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRDsKKworICAgIExPR1YoIkVmZmVjdENyZWF0ZSAlcCIsIHBDb250ZXh0KTsKKworICAgIHJldHVybiAwOworCit9CisKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSkgeworICAgIFZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoVmlzdWFsaXplckNvbnRleHQgKilpbnRlcmZhY2U7CisKKyAgICBMT0dWKCJFZmZlY3RSZWxlYXNlICVwIiwgaW50ZXJmYWNlKTsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcENvbnRleHQtPm1TdGF0ZSA9IFZJU1VBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRDsKKyAgICBkZWxldGUgcENvbnRleHQ7CisKKyAgICByZXR1cm4gMDsKK30KKworLy8KKy8vLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgorLy8KKworc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCit7CisgICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKKyAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOworICAgIHJldHVybiBzYW1wbGU7Cit9CisKK2V4dGVybiAiQyIgaW50IFZpc3VhbGl6ZXJfcHJvY2VzcygKKyAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQoreworICAgIGFuZHJvaWQ6OlZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKilzZWxmOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IFZJU1VBTElaRVJfU1RBVEVfQUNUSVZFKSB7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9CisKKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvLyBhbGwgY29kZSBiZWxvdyBhc3N1bWVzIHN0ZXJlbyAxNiBiaXQgUENNIG91dHB1dCBhbmQgaW5wdXQKKyAgICB1aW50MzJfdCBjYXB0SWR4OworICAgIHVpbnQzMl90IGluSWR4OworICAgIHVpbnQ4X3QgKmJ1ZiA9IHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZltwQ29udGV4dC0+bUN1cnJlbnRCdWZdOworICAgIGZvciAoaW5JZHggPSAwLCBjYXB0SWR4ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4OworICAgICAgICAgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAmJiBjYXB0SWR4IDwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZTsKKyAgICAgICAgIGluSWR4KyssIGNhcHRJZHgrKykgeworICAgICAgICBpbnQzMl90IHNtcCA9IGluQnVmZmVyLT5zMTZbMiAqIGluSWR4XSArIGluQnVmZmVyLT5zMTZbMiAqIGluSWR4ICsgMV07CisgICAgICAgIHNtcCA9IChzbXAgKyAoMSA8PCA4KSkgPj4gOTsKKyAgICAgICAgYnVmW2NhcHRJZHhdID0gKCh1aW50OF90KXNtcCleMHg4MDsKKyAgICB9CisgICAgcENvbnRleHQtPm1DYXB0dXJlSWR4ID0gY2FwdElkeDsKKworICAgIC8vIGdvIHRvIG5leHQgYnVmZmVyIHdoZW4gYnVmZmVyIGZ1bGwKKyAgICBpZiAocENvbnRleHQtPm1DYXB0dXJlSWR4ID09IHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpIHsKKyAgICAgICAgcENvbnRleHQtPm1DdXJyZW50QnVmIF49IDE7CisgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUlkeCA9IDA7CisgICAgfQorCisgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKykgeworICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2W2ldID0gY2xhbXAxNihvdXRCdWZmZXItPnMxNltpXSArIGluQnVmZmVyLT5zMTZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30gICAvLyBlbmQgVmlzdWFsaXplcl9wcm9jZXNzCisKK2V4dGVybiAiQyIgaW50IFZpc3VhbGl6ZXJfY29tbWFuZChlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgaW50IGNtZENvZGUsIGludCBjbWRTaXplLAorICAgICAgICB2b2lkICpwQ21kRGF0YSwgaW50ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKworICAgIGFuZHJvaWQ6OlZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKilzZWxmOworICAgIGludCByZXRzaXplOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcENvbnRleHQtPm1TdGF0ZSA9PSBWSVNVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisvLyAgICBMT0dWKCJWaXN1YWxpemVyX2NvbW1hbmQgY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKworICAgIHN3aXRjaCAoY21kQ29kZSkgeworICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBWaXN1YWxpemVyX2luaXQocENvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfQ09ORklHVVJFOgorICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCisgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBWaXN1YWxpemVyX2NvbmZpZ3VyZShwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAoZWZmZWN0X2NvbmZpZ190ICopIHBDbWREYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX1JFU0VUOgorICAgICAgICBWaXN1YWxpemVyX3Jlc2V0KHBDb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocENvbnRleHQtPm1TdGF0ZSAhPSBWSVNVQUxJWkVSX1NUQVRFX0lOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+bVN0YXRlID0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkU7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRU5BQkxFKCkgT0siKTsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0RJU0FCTEU6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5tU3RhdGUgPSBWSVNVQUxJWkVSX1NUQVRFX0lOSVRJQUxJWkVEOworICAgICAgICBMT0dWKCJFRkZFQ1RfQ01EX0RJU0FCTEUoKSBPSyIpOworICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOiB7CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICBjbWRTaXplICE9IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodWludDMyX3QpKSB8fAorICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAqcmVwbHlTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YodWludDMyX3QpKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKyAgICAgICAgcC0+c3RhdHVzID0gMDsKKyAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodWludDMyX3QpOworICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSB8fAorICAgICAgICAgICAgKih1aW50MzJfdCAqKXAtPmRhdGEgIT0gVklTVV9QQVJBTV9DQVBUVVJFX1NJWkUpIHsKKyAgICAgICAgICAgIHAtPnN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBMT0dWKCJnZXQgbUNhcHR1cmVTaXplID0gJWQiLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgKigodWludDMyX3QgKilwLT5kYXRhICsgMSkgPSBwQ29udGV4dC0+bUNhcHR1cmVTaXplOworICAgICAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICpyZXBseVNpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgfSBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOiB7CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICBjbWRTaXplICE9IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKHVpbnQzMl90KSkgfHwKKyAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQzMl90ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7CisgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YodWludDMyX3QpIHx8CisgICAgICAgICAgICBwLT52c2l6ZSAhPSBzaXplb2YodWludDMyX3QpIHx8CisgICAgICAgICAgICAqKHVpbnQzMl90ICopcC0+ZGF0YSAhPSBWSVNVX1BBUkFNX0NBUFRVUkVfU0laRSkgeworICAgICAgICAgICAgKihpbnQzMl90ICopcFJlcGx5RGF0YSA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazs7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOworICAgICAgICBMT0dWKCJzZXQgbUNhcHR1cmVTaXplID0gJWQiLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgfSBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRToKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6CisgICAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIFZJU1VfQ01EX0NBUFRVUkU6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSAoaW50KXBDb250ZXh0LT5tQ2FwdHVyZVNpemUpIHsKKyAgICAgICAgICAgIExPR1YoIlZJU1VfQ01EX0NBUFRVUkUoKSBlcnJvciAqcmVwbHlTaXplICVkIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUgJWQiLAorICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGlmIChwQ29udGV4dC0+bVN0YXRlID09IFZJU1VBTElaRVJfU1RBVEVfQUNUSVZFKSB7CisgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwKKyAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUNhcHR1cmVCdWZbcENvbnRleHQtPm1DdXJyZW50QnVmIF4gMV0sCisgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQocFJlcGx5RGF0YSwgMHg4MCwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dXKCJWaXN1YWxpemVyX2NvbW1hbmQgaW52YWxpZCBjb21tYW5kICVkIixjbWRDb2RlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHZpc3VhbGl6ZXIgZWZmZWN0Citjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdWaXN1YWxpemVySW50ZXJmYWNlID0geworICAgICAgICBWaXN1YWxpemVyX3Byb2Nlc3MsCisgICAgICAgIFZpc3VhbGl6ZXJfY29tbWFuZAorfTsKKworfSAvLyBuYW1lc3BhY2UKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKaW5kZXggZGU5ZTUxZC4uOTc3ZTZiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCkBAIC0zMCw3ICszMCw4IEBACiAgICAgTWVkaWFQcm9maWxlcy5jcHAgXAogICAgIElFZmZlY3QuY3BwIFwKICAgICBJRWZmZWN0Q2xpZW50LmNwcCBcCi0gICAgQXVkaW9FZmZlY3QuY3BwCisgICAgQXVkaW9FZmZlY3QuY3BwIFwKKyAgICBWaXN1YWxpemVyLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJ1aSBsaWJjdXRpbHMgbGlidXRpbHMgbGliYmluZGVyIGxpYnNvbml2b3ggbGliaWN1dWMgbGliZXhwYXQgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IGxpYmNhbWVyYV9jbGllbnQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcAppbmRleCA0YWZhMmRjLi5kZjBmNzNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgICAgICAgICAgKQogICAgIDogbVN0YXR1cyhOT19JTklUKQogewotICAgIG1TdGF0dXMgPSBzZXQodHlwZSwgdXVpZCwgcHJpb3JpdHksIGNiZiwgdXNlciwgb3V0cHV0LCBzZXNzaW9uSWQpOworICAgIG1TdGF0dXMgPSBzZXQodHlwZSwgdXVpZCwgcHJpb3JpdHksIGNiZiwgdXNlciwgc2Vzc2lvbklkLCBvdXRwdXQpOwogfQogCiBBdWRpb0VmZmVjdDo6QXVkaW9FZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1TdGF0dXMgPSBzZXQocFR5cGUsIHBVdWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBvdXRwdXQsIHNlc3Npb25JZCk7CisgICAgbVN0YXR1cyA9IHNldChwVHlwZSwgcFV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgb3V0cHV0KTsKIH0KIAogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLApAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgTE9HVigiRGVzdHJ1Y3RvciAlcCIsIHRoaXMpOwogCiAgICAgaWYgKG1TdGF0dXMgPT0gTk9fRVJST1IgfHwgbVN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgewotICAgICAgICBkaXNhYmxlKCk7CisgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICBpZiAobUlFZmZlY3QgIT0gTlVMTCkgewogICAgICAgICAgICAgbUlFZmZlY3QtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIG1JRWZmZWN0LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1JRWZmZWN0Q2xpZW50KTsKQEAgLTE5NiwzNiArMTk2LDI4IEBACiAgICAgcmV0dXJuIG1EZXNjcmlwdG9yOwogfQogCi1ib29sIEF1ZGlvRWZmZWN0Ojppc0VuYWJsZWQoKSBjb25zdAorYm9vbCBBdWRpb0VmZmVjdDo6Z2V0RW5hYmxlZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIChtRW5hYmxlZCAhPSAwKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmVuYWJsZSgpCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCiB7CiAgICAgaWYgKG1TdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBMT0dWKCJlbmFibGUgJXAiLCB0aGlzKTsKIAotICAgIGlmIChhbmRyb2lkX2F0b21pY19vcigxLCAmbUVuYWJsZWQpID09IDApIHsKLSAgICAgICByZXR1cm4gbUlFZmZlY3QtPmVuYWJsZSgpOworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIExPR1YoImVuYWJsZSAlcCIsIHRoaXMpOworICAgICAgICBpZiAoYW5kcm9pZF9hdG9taWNfb3IoMSwgJm1FbmFibGVkKSA9PSAwKSB7CisgICAgICAgICAgIHJldHVybiBtSUVmZmVjdC0+ZW5hYmxlKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCJkaXNhYmxlICVwIiwgdGhpcyk7CisgICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofjEsICZtRW5hYmxlZCkgPT0gMSkgeworICAgICAgICAgICByZXR1cm4gbUlFZmZlY3QtPmRpc2FibGUoKTsKKyAgICAgICAgfQogICAgIH0KLQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmRpc2FibGUoKQotewotICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgTE9HVigiZGlzYWJsZSAlcCIsIHRoaXMpOwotCi0gICAgaWYgKGFuZHJvaWRfYXRvbWljX2FuZCh+MSwgJm1FbmFibGVkKSA9PSAxKSB7Ci0gICAgICAgcmV0dXJuIG1JRWZmZWN0LT5kaXNhYmxlKCk7Ci0gICAgfQotCiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCkBAIC0zNDksNyArMzQxLDcgQEAKIAogdm9pZCBBdWRpb0VmZmVjdDo6ZW5hYmxlU3RhdHVzQ2hhbmdlZChib29sIGVuYWJsZWQpCiB7Ci0gICAgTE9HVigiZW5hYmxlU3RhdHVzQ2hhbmdlZCAlcCBlbmFibGVkICVkIiwgdGhpcywgZW5hYmxlZCk7CisgICAgTE9HVigiZW5hYmxlU3RhdHVzQ2hhbmdlZCAlcCBlbmFibGVkICVkIG1DYmYgJXAiLCB0aGlzLCBlbmFibGVkLCBtQ2JmKTsKICAgICBpZiAobVN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7CiAgICAgICAgIGlmIChtQ2JmKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDFhZTIyMmUuLjRhYmZhNzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0zNSw4ICszNSw3IEBACiAgICAgREVDT0RFX0ZELAogICAgIENSRUFURV9NRURJQV9SRUNPUkRFUiwKICAgICBDUkVBVEVfTUVUQURBVEFfUkVUUklFVkVSLAotICAgIEdFVF9PTVgsCi0gICAgU05PT1AKKyAgICBHRVRfT01YCiB9OwogCiBjbGFzcyBCcE1lZGlhUGxheWVyU2VydmljZTogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVBsYXllclNlcnZpY2U+CkBAIC0xMzQsMTQgKzEzMyw2IEBACiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gc25vb3AoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNOT09QLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIHNwPElPTVg+IGdldE9NWCgpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTIyMSwxMiArMjEyLDYgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihwbGF5ZXItPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNOT09QOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SU1lbW9yeT4gc25vb3BlZF9hdWRpbyA9IHNub29wKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoc25vb3BlZF9hdWRpby0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ1JFQVRFX01FRElBX1JFQ09SREVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcGlkX3QgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggMTI2MzM3My4uMzg2OTM4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTI3Miw3ICsyNzIsNyBAQAogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVDYW1jb3JkZXJQcm9maWxlKGNvbnN0IGNoYXIgKiphdHRzKQorTWVkaWFQcm9maWxlczo6Y3JlYXRlQ2FtY29yZGVyUHJvZmlsZShpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIgKiphdHRzKQogewogICAgIENIRUNLKCFzdHJjbXAoInF1YWxpdHkiLCAgICBhdHRzWzBdKSAmJgogICAgICAgICAgICFzdHJjbXAoImZpbGVGb3JtYXQiLCBhdHRzWzJdKSAmJgpAQCAtMjg3LDE2ICsyODcsNDcgQEAKICAgICBDSEVDSyhmaWxlRm9ybWF0ICE9IC0xKTsKIAogICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKKyAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSBjYW1lcmFJZDsKICAgICBwcm9maWxlLT5tRmlsZUZvcm1hdCA9IHN0YXRpY19jYXN0PG91dHB1dF9mb3JtYXQ+KGZpbGVGb3JtYXQpOwogICAgIHByb2ZpbGUtPm1RdWFsaXR5ID0gc3RhdGljX2Nhc3Q8Y2FtY29yZGVyX3F1YWxpdHk+KHF1YWxpdHkpOwogICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IGF0b2koYXR0c1s1XSk7CiAgICAgcmV0dXJuIHByb2ZpbGU7CiB9CiAKLS8qc3RhdGljKi8gaW50Ci1NZWRpYVByb2ZpbGVzOjpnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsKGNvbnN0IGNoYXIqKiBhdHRzKQorTWVkaWFQcm9maWxlczo6SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMqCitNZWRpYVByb2ZpbGVzOjpmaW5kSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoaW50IGNhbWVyYUlkKSBjb25zdAoreworICAgIGludCBuID0gbUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzLnNpemUoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyAqbGV2ZWxzID0gbUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzW2ldOworICAgICAgICBpZiAobGV2ZWxzLT5tQ2FtZXJhSWQgPT0gY2FtZXJhSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBsZXZlbHM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTWVkaWFQcm9maWxlczo6YWRkSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIqKiBhdHRzKQogewogICAgIENIRUNLKCFzdHJjbXAoInF1YWxpdHkiLCBhdHRzWzBdKSk7CisgICAgaW50IHF1YWxpdHkgPSBhdG9pKGF0dHNbMV0pOworICAgIExPR1YoIiVzOiBjYW1lcmFJZD0lZCwgcXVhbGl0eT0lZFxuIiwgX19mdW5jX18sIGNhbWVyYUlkLCBxdWFsaXR5KTsKKyAgICBJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyAqbGV2ZWxzID0gZmluZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKGNhbWVyYUlkKTsKKworICAgIGlmIChsZXZlbHMgPT0gTlVMTCkgeworICAgICAgICBsZXZlbHMgPSBuZXcgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoKTsKKyAgICAgICAgbGV2ZWxzLT5tQ2FtZXJhSWQgPSBjYW1lcmFJZDsKKyAgICAgICAgbUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzLmFkZChsZXZlbHMpOworICAgIH0KKworICAgIGxldmVscy0+bUxldmVscy5hZGQocXVhbGl0eSk7Cit9CisKKy8qc3RhdGljKi8gaW50CitNZWRpYVByb2ZpbGVzOjpnZXRDYW1lcmFJZChjb25zdCBjaGFyKiogYXR0cykKK3sKKyAgICBpZiAoIWF0dHNbMF0pIHJldHVybiAwOyAgLy8gZGVmYXVsdCBjYW1lcmFJZCA9IDAKKyAgICBDSEVDSyghc3RyY21wKCJjYW1lcmFJZCIsIGF0dHNbMF0pKTsKICAgICByZXR1cm4gYXRvaShhdHRzWzFdKTsKIH0KIApAQCAtMzIyLDEwICszNTMsMTMgQEAKICAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0RlY29kZXJzLmFkZChjcmVhdGVBdWRpb0RlY29kZXJDYXAoYXR0cykpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdCIsIG5hbWUpID09IDApIHsKICAgICAgICAgcHJvZmlsZXMtPm1FbmNvZGVyT3V0cHV0RmlsZUZvcm1hdHMuYWRkKGNyZWF0ZUVuY29kZXJPdXRwdXRGaWxlRm9ybWF0KGF0dHMpKTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcCgiQ2FtY29yZGVyUHJvZmlsZXMiLCBuYW1lKSA9PSAwKSB7CisgICAgICAgIHByb2ZpbGVzLT5tQ3VycmVudENhbWVyYUlkID0gZ2V0Q2FtZXJhSWQoYXR0cyk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkVuY29kZXJQcm9maWxlIiwgbmFtZSkgPT0gMCkgewotICAgICAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChjcmVhdGVDYW1jb3JkZXJQcm9maWxlKGF0dHMpKTsKKyAgICAgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoCisgICAgICAgICAgICBjcmVhdGVDYW1jb3JkZXJQcm9maWxlKHByb2ZpbGVzLT5tQ3VycmVudENhbWVyYUlkLCBhdHRzKSk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkltYWdlRW5jb2RpbmciLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgIHByb2ZpbGVzLT5tSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMuYWRkKGdldEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwoYXR0cykpOworICAgICAgICBwcm9maWxlcy0+YWRkSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cyk7CiAgICAgfQogfQogCkBAIC0zODMsNyArNDE3LDggQEAKICAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAzNjAwMDAsIDM1MiwgMjg4LCAyMCk7CiAKICAgICBBdWRpb0NvZGVjICphdWRpb0NvZGVjID0gbmV3IEF1ZGlvQ29kZWMoQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwLCA4MDAwLCAxKTsKLSAgICBDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IENhbWNvcmRlclByb2ZpbGU7CisgICAgQ2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOworICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IDA7CiAgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKICAgICBwcm9maWxlLT5tUXVhbGl0eSA9IENBTUNPUkRFUl9RVUFMSVRZX0hJR0g7CiAgICAgcHJvZmlsZS0+bUR1cmF0aW9uID0gNjA7CkBAIC00MDIsNiArNDM3LDcgQEAKICAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OkF1ZGlvQ29kZWMoQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwLCA4MDAwLCAxKTsKIAogICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKKyAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSAwOwogICAgIHByb2ZpbGUtPm1GaWxlRm9ybWF0ID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7CiAgICAgcHJvZmlsZS0+bVF1YWxpdHkgPSBDQU1DT1JERVJfUVVBTElUWV9MT1c7CiAgICAgcHJvZmlsZS0+bUR1cmF0aW9uID0gMzA7CkBAIC00NTgsOSArNDk0LDEyIEBACiAvKnN0YXRpYyovIHZvaWQKIE1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhNZWRpYVByb2ZpbGVzICpwcm9maWxlcykKIHsKLSAgICBwcm9maWxlcy0+bUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzLmFkZCg3MCk7Ci0gICAgcHJvZmlsZXMtPm1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscy5hZGQoODApOwotICAgIHByb2ZpbGVzLT5tSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMuYWRkKDkwKTsKKyAgICBJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyAqbGV2ZWxzID0gbmV3IEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKCk7CisgICAgbGV2ZWxzLT5tQ2FtZXJhSWQgPSAwOworICAgIGxldmVscy0+bUxldmVscy5hZGQoNzApOworICAgIGxldmVscy0+bUxldmVscy5hZGQoODApOworICAgIGxldmVscy0+bUxldmVscy5hZGQoOTApOworICAgIHByb2ZpbGVzLT5tSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMuYWRkKGxldmVscyk7CiB9CiAKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlcyoKQEAgLTYyOSwxOSArNjY4LDI0IEBACiAgICAgcmV0dXJuIGRlY29kZXJzOyAgLy8gY29weSBvdXQKIH0KIAotaW50IE1lZGlhUHJvZmlsZXM6OmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lLCBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdAoraW50IE1lZGlhUHJvZmlsZXM6OmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0CiB7Ci0gICAgTE9HVigiZ2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lOiAlcyBmb3IgcXVhbGl0eSAlZCIsIG5hbWUsIHF1YWxpdHkpOworICAgIExPR1YoImdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZTogJXMgZm9yIGNhbWVyYSAlZCwgcXVhbGl0eSAlZCIsCisgICAgICAgICBuYW1lLCBjYW1lcmFJZCwgcXVhbGl0eSk7CiAKICAgICBpbnQgaW5kZXggPSAtMTsKICAgICBmb3IgKHNpemVfdCBpID0gMCwgbiA9IG1DYW1jb3JkZXJQcm9maWxlcy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgaWYgKG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bVF1YWxpdHkgPT0gcXVhbGl0eSkgeworICAgICAgICBpZiAobUNhbWNvcmRlclByb2ZpbGVzW2ldLT5tQ2FtZXJhSWQgPT0gY2FtZXJhSWQgJiYKKyAgICAgICAgICAgIG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bVF1YWxpdHkgPT0gcXVhbGl0eSkgewogICAgICAgICAgICAgaW5kZXggPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgIExPR0UoIlRoZSBnaXZlbiBjYW1jb3JkZXIgcHJvZmlsZSBxdWFsaXR5ICVkIGlzIG5vdCBmb3VuZCIsIHF1YWxpdHkpOworICAgICAgICBMT0dFKCJUaGUgZ2l2ZW4gY2FtY29yZGVyIHByb2ZpbGUgY2FtZXJhICVkIHF1YWxpdHkgJWQgaXMgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICBjYW1lcmFJZCwgcXVhbGl0eSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKQEAgLTY1NywxMyArNzAxLDE4IEBACiAgICAgaWYgKCFzdHJjbXAoImF1ZC5jaCIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUF1ZGlvQ29kZWMtPm1DaGFubmVsczsKICAgICBpZiAoIXN0cmNtcCgiYXVkLmh6IiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tQXVkaW9Db2RlYy0+bVNhbXBsZVJhdGU7CiAKLSAgICBMT0dFKCJUaGUgZ2l2ZW4gY2FtY29yZGVyIHByb2ZpbGUgcGFyYW0gbmFtZSAlcyBpcyBub3QgZm91bmQiLCBuYW1lKTsKKyAgICBMT0dFKCJUaGUgZ2l2ZW4gY2FtY29yZGVyIHByb2ZpbGUgcGFyYW0gaWQgJWQgbmFtZSAlcyBpcyBub3QgZm91bmQiLCBjYW1lcmFJZCwgbmFtZSk7CiAgICAgcmV0dXJuIC0xOwogfQogCi1WZWN0b3I8aW50PiBNZWRpYVByb2ZpbGVzOjpnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscygpIGNvbnN0CitWZWN0b3I8aW50PiBNZWRpYVByb2ZpbGVzOjpnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhpbnQgY2FtZXJhSWQpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsczsgIC8vIGNvcHkgb3V0CisgICAgVmVjdG9yPGludD4gcmVzdWx0OworICAgIEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzICpsZXZlbHMgPSBmaW5kSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoY2FtZXJhSWQpOworICAgIGlmIChsZXZlbHMgIT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPSBsZXZlbHMtPm1MZXZlbHM7ICAvLyBjb3B5IG91dAorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBNZWRpYVByb2ZpbGVzOjp+TWVkaWFQcm9maWxlcygpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZTk2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcApAQCAtMCwwICsxLDMzMCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpc3VhbGl6ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL1Zpc3VhbGl6ZXIuaD4KKworZXh0ZXJuICJDIiB7CisjZGVmaW5lIEZMT0FUSU5HX1BPSU5UIDEKKyNpbmNsdWRlICJmZnR3cmFwLmgiCit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Zpc3VhbGl6ZXI6OlZpc3VhbGl6ZXIgKGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgaW50IHNlc3Npb25JZCkKKyAgICA6ICAgQXVkaW9FZmZlY3QoU0xfSUlEX1ZJU1VBTElaQVRJT04sIE5VTEwsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCksCisgICAgICAgIG1DYXB0dXJlUmF0ZShDQVBUVVJFX1JBVEVfREVGKSwKKyAgICAgICAgbUNhcHR1cmVTaXplKENBUFRVUkVfU0laRV9ERUYpLAorICAgICAgICBtU2FtcGxlUmF0ZSg0NDEwMDAwMCksCisgICAgICAgIG1DYXB0dXJlQ2FsbEJhY2soTlVMTCksCisgICAgICAgIG1DYXB0dXJlQ2JrVXNlcihOVUxMKQoreworICAgIGluaXRDYXB0dXJlU2l6ZSgpOworICAgIGlmIChtQ2FwdHVyZVNpemUgIT0gMCkgeworICAgICAgICBtRmZ0VGFibGUgPSBzcHhfZmZ0X2luaXQobUNhcHR1cmVTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRmZ0VGFibGUgPSBOVUxMOworICAgIH0KK30KKworVmlzdWFsaXplcjo6flZpc3VhbGl6ZXIoKQoreworICAgIGlmIChtRmZ0VGFibGUgIT0gTlVMTCkgeworICAgICAgICBzcHhfZmZ0X2Rlc3Ryb3kobUZmdFRhYmxlKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFZpc3VhbGl6ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzcDxDYXB0dXJlVGhyZWFkPiB0ID0gbUNhcHR1cmVUaHJlYWQ7CisgICAgaWYgKHQgIT0gMCkgeworICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKHQtPmV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodC0+cmVxdWVzdEV4aXRBbmRXYWl0KCkgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiVmlzdWFsaXplcjo6ZW5hYmxlKCkgY2FsbGVkIGZyb20gdGhyZWFkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdC0+bUxvY2subG9jaygpOworICAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb0VmZmVjdDo6c2V0RW5hYmxlZChlbmFibGVkKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKHQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICB0LT5ydW4oIkF1ZGlvVHJhY2tUaHJlYWQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdC0+cmVxdWVzdEV4aXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgdC0+bUxvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgVmlzdWFsaXplcjo6c2V0Q2FwdHVyZUNhbGxCYWNrKGNhcHR1cmVfY2JrX3QgY2JrLCB2b2lkKiB1c2VyLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgcmF0ZSkKK3sKKyAgICBpZiAocmF0ZSA+IENBUFRVUkVfUkFURV9NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIGlmIChtRW5hYmxlZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8Q2FwdHVyZVRocmVhZD4gdCA9IG1DYXB0dXJlVGhyZWFkOworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgdC0+bUxvY2subG9jaygpOworICAgIH0KKyAgICBtQ2FwdHVyZVRocmVhZC5jbGVhcigpOworICAgIG1DYXB0dXJlQ2FsbEJhY2sgPSBjYms7CisgICAgbUNhcHR1cmVDYmtVc2VyID0gdXNlcjsKKyAgICBtQ2FwdHVyZUZsYWdzID0gZmxhZ3M7CisgICAgbUNhcHR1cmVSYXRlID0gcmF0ZTsKKworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgdC0+bUxvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgaWYgKGNiayAhPSBOVUxMKSB7CisgICAgICAgIG1DYXB0dXJlVGhyZWFkID0gbmV3IENhcHR1cmVUaHJlYWQoKnRoaXMsIHJhdGUsICgoZmxhZ3MgJiBDQVBUVVJFX0NBTExfSkFWQSkgIT0gMCkpOworICAgICAgICBpZiAobUNhcHR1cmVUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGNyZWF0ZSBjYWxsYmFjayB0aHJlYWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQorICAgIExPR1YoInNldENhcHR1cmVDYWxsQmFjaygpIHJhdGU6ICVkIHRocmVhZCAlcCBmbGFncyAweCUwOHgiLAorICAgICAgICAgICAgcmF0ZSwgbUNhcHR1cmVUaHJlYWQuZ2V0KCksIG1DYXB0dXJlRmxhZ3MpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgVmlzdWFsaXplcjo6c2V0Q2FwdHVyZVNpemUodWludDMyX3Qgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA+IFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWCB8fAorICAgICAgICBzaXplIDwgVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUlOIHx8CisgICAgICAgIEF1ZGlvU3lzdGVtOjpwb3BDb3VudChzaXplKSAhPSAxKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHVpbnQzMl90IGJ1ZjMyW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMl07CisgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilidWYzMjsKKworICAgIHAtPnBzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgKihpbnQzMl90ICopcC0+ZGF0YSA9IFZJU1VfUEFSQU1fQ0FQVFVSRV9TSVpFOworICAgICooKGludDMyX3QgKilwLT5kYXRhICsgMSk9IHNpemU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0UGFyYW1ldGVyKHApOworCisgICAgTE9HVigic2V0Q2FwdHVyZVNpemUgc2l6ZSAlZCAgc3RhdHVzICVkIHAtPnN0YXR1cyAlZCIsIHNpemUsIHN0YXR1cywgcC0+c3RhdHVzKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gcC0+c3RhdHVzOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1DYXB0dXJlU2l6ZSA9IHNpemU7CisgICAgICAgIGlmIChtRmZ0VGFibGUgIT0gTlVMTCkgeworICAgICAgICAgICAgc3B4X2ZmdF9kZXN0cm95KG1GZnRUYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgbUZmdFRhYmxlID0gc3B4X2ZmdF9pbml0KG1DYXB0dXJlU2l6ZSk7CisgICAgICAgIExPR1YoInNldENhcHR1cmVTaXplIHNpemUgJWQgbUZmdFRhYmxlICVwIiwgbUNhcHR1cmVTaXplLCBtRmZ0VGFibGUpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFZpc3VhbGl6ZXI6OmdldFdhdmVGb3JtKHVpbnQ4X3QgKndhdmVmb3JtKQoreworICAgIGlmICh3YXZlZm9ybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtQ2FwdHVyZVNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgaW50MzJfdCByZXBseVNpemUgPSBtQ2FwdHVyZVNpemU7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbW1hbmQoVklTVV9DTURfQ0FQVFVSRSwgMCwgTlVMTCwgJnJlcGx5U2l6ZSwgd2F2ZWZvcm0pOworICAgICAgICBpZiAocmVwbHlTaXplID09IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldCh3YXZlZm9ybSwgMHg4MCwgbUNhcHR1cmVTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgVmlzdWFsaXplcjo6Z2V0RmZ0KHVpbnQ4X3QgKmZmdCkKK3sKKyAgICBpZiAoZmZ0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1DYXB0dXJlU2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChtRW5hYmxlZCkgeworICAgICAgICB1aW50OF90IGJ1ZlttQ2FwdHVyZVNpemVdOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRXYXZlRm9ybShidWYpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBkb0ZmdChmZnQsIGJ1Zik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQoZmZ0LCAwLCBtQ2FwdHVyZVNpemUpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBWaXN1YWxpemVyOjpkb0ZmdCh1aW50OF90ICpmZnQsIHVpbnQ4X3QgKndhdmVmb3JtKQoreworICAgIGlmIChtRmZ0VGFibGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBmbG9hdCBmc3JjW21DYXB0dXJlU2l6ZV07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYXB0dXJlU2l6ZTsgaSsrKSB7CisgICAgICAgIGZzcmNbaV0gPSAoaW50MTZfdCkod2F2ZWZvcm1baV0gXiAweDgwKSA8PCA4OworICAgIH0KKyAgICBmbG9hdCBmZHN0W21DYXB0dXJlU2l6ZV07CisgICAgc3B4X2ZmdF9mbG9hdChtRmZ0VGFibGUsIGZzcmMsIGZkc3QpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FwdHVyZVNpemU7IGkrKykgeworICAgICAgICBmZnRbaV0gPSAodWludDhfdCkoKGludDMyX3QpZmRzdFtpXSA+PiA4KTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIFZpc3VhbGl6ZXI6OnBlcmlvZGljQ2FwdHVyZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBMT0dWKCJwZXJpb2RpY0NhcHR1cmUoKSAlcCBtQ2FwdHVyZUNhbGxCYWNrICVwIG1DYXB0dXJlRmxhZ3MgMHglMDh4IiwKKyAgICAgICAgICAgIHRoaXMsIG1DYXB0dXJlQ2FsbEJhY2ssIG1DYXB0dXJlRmxhZ3MpOworICAgIGlmIChtQ2FwdHVyZUNhbGxCYWNrICE9IE5VTEwgJiYKKyAgICAgICAgKG1DYXB0dXJlRmxhZ3MgJiAoQ0FQVFVSRV9XQVZFRk9STXxDQVBUVVJFX0ZGVCkpICYmCisgICAgICAgIG1DYXB0dXJlU2l6ZSAhPSAwKSB7CisgICAgICAgIHVpbnQ4X3Qgd2F2ZWZvcm1bbUNhcHR1cmVTaXplXTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0V2F2ZUZvcm0od2F2ZWZvcm0pOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBmZnRbbUNhcHR1cmVTaXplXTsKKyAgICAgICAgaWYgKG1DYXB0dXJlRmxhZ3MgJiBDQVBUVVJFX0ZGVCkgeworICAgICAgICAgICAgc3RhdHVzID0gZG9GZnQoZmZ0LCB3YXZlZm9ybSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgKndhdmVQdHIgPSBOVUxMOworICAgICAgICB1aW50OF90ICpmZnRQdHIgPSBOVUxMOworICAgICAgICB1aW50MzJfdCB3YXZlU2l6ZSA9IDA7CisgICAgICAgIHVpbnQzMl90IGZmdFNpemUgPSAwOworICAgICAgICBpZiAobUNhcHR1cmVGbGFncyAmIENBUFRVUkVfV0FWRUZPUk0pIHsKKyAgICAgICAgICAgIHdhdmVQdHIgPSB3YXZlZm9ybTsKKyAgICAgICAgICAgIHdhdmVTaXplID0gbUNhcHR1cmVTaXplOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FwdHVyZUZsYWdzICYgQ0FQVFVSRV9GRlQpIHsKKyAgICAgICAgICAgIGZmdFB0ciA9IGZmdDsKKyAgICAgICAgICAgIGZmdFNpemUgPSBtQ2FwdHVyZVNpemU7CisgICAgICAgIH0KKyAgICAgICAgbUNhcHR1cmVDYWxsQmFjayhtQ2FwdHVyZUNia1VzZXIsIHdhdmVTaXplLCB3YXZlUHRyLCBmZnRTaXplLCBmZnRQdHIsIG1TYW1wbGVSYXRlKTsKKyAgICB9Cit9CisKK3VpbnQzMl90IFZpc3VhbGl6ZXI6OmluaXRDYXB0dXJlU2l6ZSgpCit7CisgICAgdWludDMyX3QgYnVmMzJbc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSAvIHNpemVvZih1aW50MzJfdCkgKyAyXTsKKyAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKWJ1ZjMyOworCisgICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAqKGludDMyX3QgKilwLT5kYXRhID0gVklTVV9QQVJBTV9DQVBUVVJFX1NJWkU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UGFyYW1ldGVyKHApOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBzdGF0dXMgPSBwLT5zdGF0dXM7CisgICAgfQorCisgICAgdWludDMyX3Qgc2l6ZSA9IDA7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBzaXplID0gKigoaW50MzJfdCAqKXAtPmRhdGEgKyAxKTsKKyAgICB9CisgICAgbUNhcHR1cmVTaXplID0gc2l6ZTsKKworICAgIExPR1YoImluaXRDYXB0dXJlU2l6ZSBzaXplICVkIHN0YXR1cyAlZCIsIG1DYXB0dXJlU2l6ZSwgc3RhdHVzKTsKKworICAgIHJldHVybiBzaXplOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVmlzdWFsaXplcjo6Q2FwdHVyZVRocmVhZDo6Q2FwdHVyZVRocmVhZChWaXN1YWxpemVyJiByZWNlaXZlciwgdWludDMyX3QgY2FwdHVyZVJhdGUsIGJvb2wgYkNhbkNhbGxKYXZhKQorICAgIDogVGhyZWFkKGJDYW5DYWxsSmF2YSksIG1SZWNlaXZlcihyZWNlaXZlcikKK3sKKyAgICBtU2xlZXBUaW1lVXMgPSAxMDAwMDAwMDAwIC8gY2FwdHVyZVJhdGU7CisgICAgTE9HVigiQ2FwdHVyZVRocmVhZCBjc3RvciAlcCBjYXB0dXJlUmF0ZSAlZCBtU2xlZXBUaW1lVXMgJWQiLCB0aGlzLCBjYXB0dXJlUmF0ZSwgbVNsZWVwVGltZVVzKTsKK30KKworYm9vbCBWaXN1YWxpemVyOjpDYXB0dXJlVGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICBMT0dWKCJDYXB0dXJlVGhyZWFkICVwIGVudGVyIiwgdGhpcyk7CisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQorICAgIHsKKyAgICAgICAgdXNsZWVwKG1TbGVlcFRpbWVVcyk7CisgICAgICAgIG1SZWNlaXZlci5wZXJpb2RpY0NhcHR1cmUoKTsKKyAgICB9CisgICAgTE9HVigiQ2FwdHVyZVRocmVhZCAlcCBleGl0aW5nIiwgdGhpcyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBWaXN1YWxpemVyOjpDYXB0dXJlVGhyZWFkOjpyZWFkeVRvUnVuKCkKK3sKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgVmlzdWFsaXplcjo6Q2FwdHVyZVRocmVhZDo6b25GaXJzdFJlZigpCit7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAppbmRleCBkNWEzYzEzLi5iNDNmNzVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCkBAIC02NTgsNjEgKzY1OCw0IEBACiAKIH0KIAotZXh0ZXJuICJDIiB7Ci0jZGVmaW5lIEZMT0FUSU5HX1BPSU5UIDEKLSNpbmNsdWRlICJmZnR3cmFwLmgiCi19Ci0KLXN0YXRpYyB2b2lkICpmZnR0YWJsZSA9IE5VTEw7Ci0KLS8vIHBlZWtzIGF0IHRoZSBhdWRpbyBkYXRhIGFuZCBmaWxscyAnZGF0YScgd2l0aCB0aGUgcmVxdWVzdGVkIGtpbmQKLS8vIChjdXJyZW50bHkga2luZD0wIHJldHVybnMgbW9ubyAxNiBiaXQgUENNIGRhdGEsIGFuZCBraW5kPTEgcmV0dXJucwotLy8gMjU2IHBvaW50IEZGVCBkYXRhKS4gUmV0dXJuIHZhbHVlIGlzIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkLAotLy8gd2hpY2ggbWF5IGJlIDAuCi0vKnN0YXRpYyovIGludCBNZWRpYVBsYXllcjo6c25vb3Aoc2hvcnQqIGRhdGEsIGludCBsZW4sIGludCBraW5kKSB7Ci0KLSAgICBzcDxJTWVtb3J5PiBwOwotICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICAvLyBUYWtlIGEgcGVlayBhdCB0aGUgd2F2ZWZvcm0uIFRoZSByZXR1cm5lZCBkYXRhIGNvbnNpc3RzIG9mIDE2IGJpdCBtb25vIFBDTSBkYXRhLgotICAgICAgICBwID0gc2VydmljZS0+c25vb3AoKTsKLQotICAgICAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChraW5kID09IDApIHsgLy8gcmV0dXJuIHdhdmVmb3JtIGRhdGEKLSAgICAgICAgICAgIGludCBwbGVuID0gcC0+c2l6ZSgpOwotICAgICAgICAgICAgbGVuICo9IDI7IC8vIG51bWJlciBvZiBzaG9ydHMgLT4gbnVtYmVyIG9mIGJ5dGVzCi0gICAgICAgICAgICBzaG9ydCAqc3JjID0gKHNob3J0KikgcC0+cG9pbnRlcigpOwotICAgICAgICAgICAgaWYgKHBsZW4gPiBsZW4pIHsKLSAgICAgICAgICAgICAgICBwbGVuID0gbGVuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHNyYywgcGxlbik7Ci0gICAgICAgICAgICByZXR1cm4gcGxlbiAvIHNpemVvZihzaG9ydCk7IC8vIHJldHVybiBudW1iZXIgb2Ygc2FtcGxlcwotICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT0gMSkgewotICAgICAgICAgICAgLy8gVE9ETzogdXNlIGEgbW9yZSBlZmZpY2llbnQgRkZUCi0gICAgICAgICAgICAvLyBSaWdodCBub3cgdGhpcyB1c2VzIHRoZSBzcGVleCBsaWJyYXJ5LCB3aGljaCBpcyBjb21waWxlZCB0byBkbyBhIGZsb2F0IEZGVAotICAgICAgICAgICAgaWYgKCFmZnR0YWJsZSkgZmZ0dGFibGUgPSBzcHhfZmZ0X2luaXQoNTEyKTsKLSAgICAgICAgICAgIHNob3J0ICp1c3JjID0gKHNob3J0KikgcC0+cG9pbnRlcigpOwotICAgICAgICAgICAgZmxvYXQgZnNyY1s1MTJdOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8NTEyO2krKykKLSAgICAgICAgICAgICAgICBmc3JjW2ldID0gdXNyY1tpXTsKLSAgICAgICAgICAgIGZsb2F0IGZkc3RbNTEyXTsKLSAgICAgICAgICAgIHNweF9mZnRfZmxvYXQoZmZ0dGFibGUsIGZzcmMsIGZkc3QpOwotICAgICAgICAgICAgaWYgKGxlbiA+IDUxMikgewotICAgICAgICAgICAgICAgIGxlbiA9IDUxMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlbiAvPSAyOyAvLyBvbmx5IGhhbGYgdGhlIG91dHB1dCBkYXRhIGlzIHZhbGlkCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgICAgICBkYXRhW2ldID0gZmRzdFtpXTsKLSAgICAgICAgICAgIHJldHVybiBsZW47Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0UoIlVuYWJsZSB0byBsb2NhdGUgbWVkaWEgc2VydmljZSIpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggODJkNWMxNC4uNTQwMWVjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTUxMSwxMSArNTExLDE3IEBACiAgICAgICAgICAgICBzcDxDbGllbnQ+IGMgPSBtQ2xpZW50c1tpXS5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoYyAhPSAwKSBjLT5kdW1wKGZkLCBhcmdzKTsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IG1NZWRpYVJlY29yZGVyQ2xpZW50cy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBNZWRpYVJlY29yZGVyQ2xpZW50XG4iKTsKLSAgICAgICAgICAgIHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+IGMgPSBtTWVkaWFSZWNvcmRlckNsaWVudHNbaV0ucHJvbW90ZSgpOwotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHBpZCglZClcblxuIiwgYy0+bVBpZCk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGlmIChtTWVkaWFSZWNvcmRlckNsaWVudHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgTm8gbWVkaWEgcmVjb3JkZXIgY2xpZW50XG5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG4gPSBtTWVkaWFSZWNvcmRlckNsaWVudHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICAgICAgc3A8TWVkaWFSZWNvcmRlckNsaWVudD4gYyA9IG1NZWRpYVJlY29yZGVyQ2xpZW50c1tpXS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgTWVkaWFSZWNvcmRlckNsaWVudCBwaWQoJWQpXG4iLCBjLT5tUGlkKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlxuIjsKKyAgICAgICAgICAgICAgICBjLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOwpAQCAtMTI2NSw5OCArMTI3MSw2IEBACiAgICAgcmV0dXJuIG1lbTsKIH0KIAotLyoKLSAqIEF2ZXJ0IHlvdXIgZXllcywgdWdseSBoYWNrIGFoZWFkLgotICogVGhlIGZvbGxvd2luZyBpcyB0byBzdXBwb3J0IG11c2ljIHZpc3VhbGl6YXRpb25zLgotICovCi0KLXN0YXRpYyBjb25zdCBpbnQgTlVNVklaQlVGID0gMzI7Ci1zdGF0aWMgY29uc3QgaW50IFZJWkJVRkZSQU1FUyA9IDEwMjQ7Ci1zdGF0aWMgY29uc3QgaW50IEJVRlRJTUVNU0VDID0gTlVNVklaQlVGICogVklaQlVGRlJBTUVTICogMTAwMCAvIDQ0MTAwOwotc3RhdGljIGNvbnN0IGludCBUT1RBTEJVRlRJTUVNU0VDID0gTlVNVklaQlVGICogQlVGVElNRU1TRUM7Ci0KLXN0YXRpYyBib29sIGdvdE1lbSA9IGZhbHNlOwotc3RhdGljIHNwPE1lbW9yeUhlYXBCYXNlPiBoZWFwOyAKLXN0YXRpYyBzcDxNZW1vcnlCYXNlPiBtZW1bTlVNVklaQlVGXTsKLXN0YXRpYyB1aW50NjRfdCBlbmRUaW1lOwotc3RhdGljIHVpbnQ2NF90IGxhc3RSZWFkVGltZTsKLXN0YXRpYyB1aW50NjRfdCBsYXN0V3JpdGVUaW1lOwotc3RhdGljIGludCB3cml0ZUlkeCA9IDA7Ci0KLXN0YXRpYyB2b2lkIGFsbG9jVml6QnVmcygpIHsKLSAgICBpZiAoIWdvdE1lbSkgewotICAgICAgICBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKE5VTVZJWkJVRiAqIFZJWkJVRkZSQU1FUyAqIDIsIDAsICJzbm9vcGVyIik7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPE5VTVZJWkJVRjtpKyspIHsKLSAgICAgICAgICAgIG1lbVtpXSA9IG5ldyBNZW1vcnlCYXNlKGhlYXAsIFZJWkJVRkZSQU1FUyAqIDIgKiBpLCBWSVpCVUZGUkFNRVMgKiAyKTsKLSAgICAgICAgfQotICAgICAgICBlbmRUaW1lID0gMDsKLSAgICAgICAgZ290TWVtID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIEdldCBhIGJ1ZmZlciBvZiBhdWRpbyBkYXRhIHRoYXQgaXMgYWJvdXQgdG8gYmUgcGxheWVkLgotICogV2UgZG9uJ3Qgc3luY2hyb25pemUgdGhpcyBiZWNhdXNlIGluIHByYWN0aWNlIHRoZSB3cml0ZXIKLSAqIGlzIGFoZWFkIG9mIHRoZSByZWFkZXIsIGFuZCBldmVuIGlmIHdlIGRpZCBoYXBwZW4gdG8gY2F0Y2gKLSAqIGEgYnVmZmVyIHdoaWxlIGl0J3MgYmVpbmcgd3JpdHRlbiwgaXQncyBqdXN0IGEgdmlzdWFsaXphdGlvbiwKLSAqIHNvIG5vIGhhcm0gZG9uZS4KLSAqLwotc3RhdGljIHNwPE1lbW9yeUJhc2U+IGdldFZpekJ1ZmZlcigpIHsKLQotICAgIGFsbG9jVml6QnVmcygpOwotCi0gICAgbGFzdFJlYWRUaW1lID0gdXB0aW1lTWlsbGlzKCk7Ci0KLSAgICAvLyBpZiB0aGVyZSBpcyBubyByZWNlbnQgYnVmZmVyICh5ZXQpLCBqdXN0IHJldHVybiBlbXB0eSBoYW5kZWQKLSAgICBpZiAobGFzdFdyaXRlVGltZSArIFRPVEFMQlVGVElNRU1TRUMgPCBsYXN0UmVhZFRpbWUpIHsKLSAgICAgICAgLy9MT0dJKCJAQEBAICAgIG5vIGF1ZGlvIGRhdGEgdG8gbG9vayBhdCB5ZXQ6ICVkICsgJWQgPCAlZCIsIChpbnQpbGFzdFdyaXRlVGltZSwgVE9UQUxCVUZUSU1FTVNFQywgKGludClsYXN0UmVhZFRpbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpbnQgdGltZWRlbHRhID0gZW5kVGltZSAtIGxhc3RSZWFkVGltZTsKLSAgICBpZiAodGltZWRlbHRhIDwgMCkgdGltZWRlbHRhID0gMDsKLSAgICBpbnQgZnJhbWVkZWx0YSA9IHRpbWVkZWx0YSAqIDQ0MTAwIC8gMTAwMDsKLSAgICBpbnQgaGVhZElkeCA9ICh3cml0ZUlkeCAtIGZyYW1lZGVsdGEpIC8gVklaQlVGRlJBTUVTIC0gMTsKLSAgICB3aGlsZSAoaGVhZElkeCA8IDApIHsKLSAgICAgICAgaGVhZElkeCArPSBOVU1WSVpCVUY7Ci0gICAgfQotICAgIHJldHVybiBtZW1baGVhZElkeF07Ci19Ci0KLS8vIEFwcGVuZCB0aGUgZGF0YSB0byB0aGUgdml6dWFsaXphdGlvbiBidWZmZXIKLXN0YXRpYyB2b2lkIG1ha2VWaXpCdWZmZXJzKGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4sIHVpbnQ2NF90IHRpbWUpIHsKLQotICAgIGFsbG9jVml6QnVmcygpOwotCi0gICAgdWludDY0X3Qgc3RhcnRUaW1lID0gdGltZTsKLSAgICBjb25zdCBpbnQgZnJhbWVTaXplID0gNDsgLy8gMTYgYml0IHN0ZXJlbyBzYW1wbGUgaXMgNCBieXRlcwotICAgIGludCBvZmZzZXQgPSB3cml0ZUlkeDsKLSAgICBpbnQgbWF4b2ZmID0gaGVhcC0+Z2V0U2l6ZSgpIC8gMjsgLy8gaW4gc2hvcnRzCi0gICAgc2hvcnQgKmJhc2UgPSAoc2hvcnQqKWhlYXAtPmdldEJhc2UoKTsKLSAgICBzaG9ydCAqc3JjID0gKHNob3J0KilkYXRhOwotICAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBEZWdyYWRlIHF1YWxpdHkgYnkgbWl4aW5nIHRvIG1vbm8gYW5kIGNsZWFyaW5nIHRoZSBsb3dlc3QgMyBiaXRzLgotICAgICAgICAvLyBUaGlzIHNob3VsZCBzdGlsbCBiZSBnb29kIGVub3VnaCBmb3IgYSB2aXN1YWxpemF0aW9uCi0gICAgICAgIGJhc2Vbb2Zmc2V0KytdID0gKChpbnQoc3JjWzBdKSArIGludChzcmNbMV0pKSA+PiAxKSAmIH4weDc7Ci0gICAgICAgIHNyYyArPSAyOwotICAgICAgICBsZW4gLT0gZnJhbWVTaXplOwotICAgICAgICBpZiAob2Zmc2V0ID49IG1heG9mZikgewotICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICB3cml0ZUlkeCA9IG9mZnNldDsKLSAgICBlbmRUaW1lID0gdGltZSArIChsZW4gLyBmcmFtZVNpemUpIC8gNDQ7Ci0gICAgLy9MT0dJKCJAQEAgc3RvcmVkIGJ1ZmZlcnMgZnJvbSAlZCB0byAlZCIsIHVpbnQzMl90KHN0YXJ0VGltZSksIHVpbnQzMl90KHRpbWUpKTsKLX0KLQotc3A8SU1lbW9yeT4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjpzbm9vcCgpCi17Ci0gICAgc3A8TWVtb3J5QmFzZT4gbWVtID0gZ2V0Vml6QnVmZmVyKCk7Ci0gICAgcmV0dXJuIG1lbTsKLX0KLQogCiAjdW5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJBdWRpb1NpbmsiCkBAIC0xMzcxLDcgKzEyODUsNiBAQAogICAgIG1SaWdodFZvbHVtZSA9IDEuMDsKICAgICBtTGF0ZW5jeSA9IDA7CiAgICAgbU1zZWNzUGVyRnJhbWUgPSAwOwotICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKICAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwogfQogCkBAIC0xNTE2LDMwICsxNDI5LDkgQEAKICAgICBpZiAobVRyYWNrKSB7CiAgICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwogICAgICAgICBtVHJhY2stPnN0YXJ0KCk7Ci0gICAgICAgIG1UcmFjay0+Z2V0UG9zaXRpb24oJm1OdW1GcmFtZXNXcml0dGVuKTsKICAgICB9CiB9CiAKLXZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c25vb3BXcml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gICAgLy8gT25seSBtYWtlIHZpc3VhbGl6YXRpb24gYnVmZmVycyBpZiBhbnlvbmUgcmVjZW50bHkgcmVxdWVzdGVkIHZpc3VhbGl6YXRpb24gZGF0YQotICAgIHVpbnQ2NF90IG5vdyA9IHVwdGltZU1pbGxpcygpOwotICAgIGlmIChsYXN0UmVhZFRpbWUgKyBUT1RBTEJVRlRJTUVNU0VDID49IG5vdykgewotICAgICAgICAvLyBCYXNlZCBvbiB0aGUgY3VycmVudCBwbGF5IGNvdW50ZXIsIHRoZSBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gYW5kCi0gICAgICAgIC8vIHRoZSBjdXJyZW50IHJlYWwgdGltZSB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBhcHByb3hpbWF0ZSByZWFsIHN0YXJ0Ci0gICAgICAgIC8vIHRpbWUgb2YgdGhlIGJ1ZmZlciB3ZSdyZSBhYm91dCB0byB3cml0ZS4KLSAgICAgICAgdWludDMyX3QgcG9zOwotICAgICAgICBtVHJhY2stPmdldFBvc2l0aW9uKCZwb3MpOwotCi0gICAgICAgIC8vIHdlJ3JlIHdyaXRpbmcgYWhlYWQgYnkgdGhpcyBtYW55IGZyYW1lczoKLSAgICAgICAgaW50IGFoZWFkID0gbU51bUZyYW1lc1dyaXR0ZW4gLSBwb3M7Ci0gICAgICAgIC8vTE9HSSgiQEBAIHdyaXR0ZW46ICVkLCBwbGF5cG9zOiAlZCwgbGF0ZW5jeTogJWQiLCBtTnVtRnJhbWVzV3JpdHRlbiwgcG9zLCBtVHJhY2stPmxhdGVuY3koKSk7Ci0gICAgICAgIC8vIHdoaWNoIGlzIHRoaXMgbWFueSBtaWxsaXNlY29uZHMsIGFzc3VtaW5nIDQ0MTAwIEh6OgotICAgICAgICBhaGVhZCAvPSA0NDsKLQotICAgICAgICBtYWtlVml6QnVmZmVycygoY29uc3QgY2hhciopYnVmZmVyLCBzaXplLCBub3cgKyBhaGVhZCArIG1UcmFjay0+bGF0ZW5jeSgpKTsKLSAgICAgICAgbGFzdFdyaXRlVGltZSA9IG5vdzsKLSAgICB9Ci19CiAKIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQpAQCAtMTU0OCw5ICsxNDQwLDcgQEAKIAogICAgIC8vTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7CiAgICAgaWYgKG1UcmFjaykgewotICAgICAgICBzbm9vcFdyaXRlKGJ1ZmZlciwgc2l6ZSk7CiAgICAgICAgIHNzaXplX3QgcmV0ID0gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUpOwotICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSByZXQgLyA0OyAvLyBhc3N1bWUgMTYgYml0IHN0ZXJlbwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE1NjAsNyArMTQ1MCw2IEBACiB7CiAgICAgTE9HVigic3RvcCIpOwogICAgIGlmIChtVHJhY2spIG1UcmFjay0+c3RvcCgpOwotICAgIGxhc3RXcml0ZVRpbWUgPSAwOwogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmZsdXNoKCkKQEAgLTE1NzMsNyArMTQ2Miw2IEBACiB7CiAgICAgTE9HVigicGF1c2UiKTsKICAgICBpZiAobVRyYWNrKSBtVHJhY2stPnBhdXNlKCk7Ci0gICAgbGFzdFdyaXRlVGltZSA9IDA7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Y2xvc2UoKQpAQCAtMTYwOSw5ICsxNDk3LDYgQEAKIAogICAgIGJ1ZmZlci0+c2l6ZSA9IGFjdHVhbFNpemU7CiAKLSAgICBpZiAoYWN0dWFsU2l6ZSA+IDApIHsKLSAgICAgICAgbWUtPnNub29wV3JpdGUoYnVmZmVyLT5yYXcsIGFjdHVhbFNpemUpOwotICAgIH0KIH0KIAogI3VuZGVmIExPR19UQUcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCA2MGI5MWM2Li4zOWY1MjVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC0xMTMsOSArMTEzLDYgQEAKICAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKICAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgbU1pbkJ1ZmZlckNvdW50OyAgLy8gMTIgZm9yIGVtdWxhdG9yOyBvdGhlcndpc2UgNAogCi0gICAgICAgIHB1YmxpYzogLy8gdmlzdWFsaXphdGlvbiBoYWNrIHN1cHBvcnQKLSAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHNub29wV3JpdGUoY29uc3Qgdm9pZCosIHNpemVfdCk7CiAgICAgfTsKIAogICAgIGNsYXNzIEF1ZGlvQ2FjaGUgOiBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsKQEAgLTE5MSw3ICsxODgsNiBAQAogICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiAgICBjcmVhdGUocGlkX3QgcGlkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBpbnQgYXVkaW9TZXNzaW9uSWQpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLCBpbnQqIHBGb3JtYXQpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCk7Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgIHNub29wKCk7CiAgICAgdmlydHVhbCBzcDxJT01YPiAgICAgICAgICAgIGdldE9NWCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCA4MGIxY2ZkLi5mZWYzZTZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC0zMjksNSArMzI5LDEyIEBACiAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOwogfQogCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgeworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAppbmRleCBiNTNkOTUwLi5kMTJlNTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKQEAgLTI4LDcgKzI4LDcgQEAKIGNsYXNzIE1lZGlhUmVjb3JkZXJDbGllbnQgOiBwdWJsaWMgQm5NZWRpYVJlY29yZGVyCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbAkgICAgc3RhdHVzX3QJCXNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1NvdXJjZShpbnQgdnMpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1NvdXJjZShpbnQgYXMpOwpAQCAtNDUsMjEgKzQ1LDIyIEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIGdldE1heEFtcGxpdHVkZShpbnQqIG1heCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHN0b3AoKTsKLSAgICB2aXJ0dWFsCSAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgaW5pdCgpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBjbG9zZSgpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlKCk7CiAKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTsgIC8vIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBjb25zdHJ1Y3RvcgorICAgIGZyaWVuZCBjbGFzcyAgICAgICAgICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U7ICAvLyBmb3IgYWNjZXNzaW5nIHByaXZhdGUgY29uc3RydWN0b3IKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZWNvcmRlckNsaWVudChjb25zdCBzcDxNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlLCBwaWRfdCBwaWQpOwotICAgIHZpcnR1YWwgCQkgICAgICAgICB+TWVkaWFSZWNvcmRlckNsaWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlY29yZGVyQ2xpZW50KGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsIHBpZF90IHBpZCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgICAgIH5NZWRpYVJlY29yZGVyQ2xpZW50KCk7CiAKLSAgICBwaWRfdAkJCSBtUGlkOwotICAgIE11dGV4CQkJIG1Mb2NrOwotICAgIE1lZGlhUmVjb3JkZXJCYXNlICAgICAgICAgICAgKm1SZWNvcmRlcjsKLSAgICBzcDxNZWRpYVBsYXllclNlcnZpY2U+ICAgICAgIG1NZWRpYVBsYXllclNlcnZpY2U7CisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgIE1lZGlhUmVjb3JkZXJCYXNlICAgICAgICAgICAqbVJlY29yZGVyOworICAgIHNwPE1lZGlhUGxheWVyU2VydmljZT4gICAgICBtTWVkaWFQbGF5ZXJTZXJ2aWNlOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCA4YmM2ZTlhLi4zYmVhZTdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC02OSw2ICs2OSw3IEBACiAgICAgTE9HVigic2V0QXVkaW9Tb3VyY2U6ICVkIiwgYXMpOwogICAgIGlmIChhcyA8IEFVRElPX1NPVVJDRV9ERUZBVUxUIHx8CiAgICAgICAgIGFzID49IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGF1ZGlvIHNvdXJjZTogJWQiLCBhcyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC04NSw2ICs4Niw3IEBACiAgICAgTE9HVigic2V0VmlkZW9Tb3VyY2U6ICVkIiwgdnMpOwogICAgIGlmICh2cyA8IFZJREVPX1NPVVJDRV9ERUZBVUxUIHx8CiAgICAgICAgIHZzID49IFZJREVPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHZpZGVvIHNvdXJjZTogJWQiLCB2cyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xMDEsNiArMTAzLDcgQEAKICAgICBMT0dWKCJzZXRPdXRwdXRGb3JtYXQ6ICVkIiwgb2YpOwogICAgIGlmIChvZiA8IE9VVFBVVF9GT1JNQVRfREVGQVVMVCB8fAogICAgICAgICBvZiA+PSBPVVRQVVRfRk9STUFUX0xJU1RfRU5EKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgb3V0cHV0IGZvcm1hdDogJWQiLCBvZik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xMTcsNiArMTIwLDcgQEAKICAgICBMT0dWKCJzZXRBdWRpb0VuY29kZXI6ICVkIiwgYWUpOwogICAgIGlmIChhZSA8IEFVRElPX0VOQ09ERVJfREVGQVVMVCB8fAogICAgICAgICBhZSA+PSBBVURJT19FTkNPREVSX0xJU1RfRU5EKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgYXVkaW8gZW5jb2RlcjogJWQiLCBhZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xMzMsNiArMTM3LDcgQEAKICAgICBMT0dWKCJzZXRWaWRlb0VuY29kZXI6ICVkIiwgdmUpOwogICAgIGlmICh2ZSA8IFZJREVPX0VOQ09ERVJfREVGQVVMVCB8fAogICAgICAgICB2ZSA+PSBWSURFT19FTkNPREVSX0xJU1RfRU5EKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgdmlkZW8gZW5jb2RlcjogJWQiLCB2ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xNzYsNyArMTgxLDcgQEAKICAgICBMT0dWKCJzZXRDYW1lcmEiKTsKICAgICBpZiAoY2FtZXJhID09IDApIHsKICAgICAgICAgTE9HRSgiY2FtZXJhIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC0xODUsNyArMTkwLDcgQEAKICAgICBpZiAobUNhbWVyYSA9PSAwKSB7CiAgICAgICAgIExPR0UoIlVuYWJsZSB0byBjb25uZWN0IHRvIGNhbWVyYSIpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiAtRUJVU1k7CiAgICAgfQogCiAgICAgTE9HVigiQ29ubmVjdGVkIHRvIGNhbWVyYSIpOwpAQCAtMjA2LDExICsyMTEsMTEgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgTE9HRSgic2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKikgc2hvdWxkIG5vdCBiZSBjYWxsZWQiKTsKKyAgICBMT0dFKCJzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqKSBtdXN0IG5vdCBiZSBjYWxsZWQiKTsKICAgICAvLyBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHRoaXMgYXQgYWxsLCBhcyB0aGUgbWVkaWFfc2VydmVyIHByb2Nlc3MKICAgICAvLyBubyBsb25nZXIgaGFzIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBmaWxlcy4KIAotICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiAtRVBFUk07CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKQEAgLTIxOSw2ICsyMjQsMTEgQEAKICAgICBDSEVDS19FUShvZmZzZXQsIDApOwogICAgIENIRUNLX0VRKGxlbmd0aCwgMCk7CiAKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yOiAlZCIsIGZkKTsKKyAgICAgICAgcmV0dXJuIC1FQkFERjsKKyAgICB9CisKICAgICBpZiAobU91dHB1dEZkID49IDApIHsKICAgICAgICAgOjpjbG9zZShtT3V0cHV0RmQpOwogICAgIH0KQEAgLTI5NCw2ICszMDQsNyBAQAogICAgIExPR1YoInNldFBhcmFtQXVkaW9OdW1iZXJPZkNoYW5uZWxzOiAlZCIsIGNoYW5uZWxzKTsKICAgICBpZiAoY2hhbm5lbHMgPD0gMCB8fCBjaGFubmVscyA+PSAzKSB7CiAgICAgICAgIExPR0UoIkludmFsaWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzOiAlZCIsIGNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIG9uIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgd2lsbCBiZSBwZXJmb3JtZWQgbGF0ZXIuCkBAIC0zMzEsMjEgKzM0MiwyMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1NYXhEdXJhdGlvbk9yRmlsZVNpemUoaW50NjRfdCBsaW1pdCwKLSAgICAgICAgYm9vbCBsaW1pdF9pc19kdXJhdGlvbikgewotICAgIExPR1YoInNldFBhcmFtTWF4RHVyYXRpb25PckZpbGVTaXplOiBsaW1pdCAoJWxsZCkgZm9yICVzIiwKLSAgICAgICAgICAgIGxpbWl0LCBsaW1pdF9pc19kdXJhdGlvbj8iZHVyYXRpb24iOiJzaXplIik7Ci0gICAgaWYgKGxpbWl0X2lzX2R1cmF0aW9uKSB7ICAvLyBsaW1pdCBpcyBpbiBtcwotICAgICAgICBpZiAobGltaXQgPD0gMTAwMCkgeyAgLy8gWFhYOiAxIHNlY29uZAotICAgICAgICAgICAgTE9HRSgiTWF4IGZpbGUgZHVyYXRpb24gaXMgdG9vIHNob3J0OiAlbGxkIHVzIiwgbGltaXQpOwotICAgICAgICB9Ci0gICAgICAgIG1NYXhGaWxlRHVyYXRpb25VcyA9IGxpbWl0ICogMTAwMExMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChsaW1pdCA8PSAxMDI0KSB7ICAvLyBYWFg6IDEga0IKLSAgICAgICAgICAgIExPR0UoIk1heCBmaWxlIHNpemUgaXMgdG9vIHNtYWxsOiAlbGxkIGJ5dGVzIiwgbGltaXQpOwotICAgICAgICB9Ci0gICAgICAgIG1NYXhGaWxlU2l6ZUJ5dGVzID0gbGltaXQ7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbU1heEZpbGVEdXJhdGlvblVzKGludDY0X3QgdGltZVVzKSB7CisgICAgTE9HVigic2V0UGFyYW1NYXhGaWxlRHVyYXRpb25VczogJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgaWYgKHRpbWVVcyA8PSAxMDAwMDAwTEwpIHsgIC8vIFhYWDogMSBzZWNvbmQKKyAgICAgICAgTE9HRSgiTWF4IGZpbGUgZHVyYXRpb24gaXMgdG9vIHNob3J0OiAlbGxkIHVzIiwgdGltZVVzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgbU1heEZpbGVEdXJhdGlvblVzID0gdGltZVVzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1NYXhGaWxlU2l6ZUJ5dGVzKGludDY0X3QgYnl0ZXMpIHsKKyAgICBMT0dWKCJzZXRQYXJhbU1heEZpbGVTaXplQnl0ZXM6ICVsbGQgYnl0ZXMiLCBieXRlcyk7CisgICAgaWYgKGJ5dGVzIDw9IDEwMjQpIHsgIC8vIFhYWDogMSBrQgorICAgICAgICBMT0dFKCJNYXggZmlsZSBzaXplIGlzIHRvbyBzbWFsbDogJWxsZCBieXRlcyIsIGJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU1heEZpbGVTaXplQnl0ZXMgPSBieXRlczsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTM3MCw3ICszODMsNyBAQAogCiAvLyBJZiBpbnRlcnZhbCA8ICAwLCBvbmx5IHRoZSBmaXJzdCBmcmFtZSBpcyBJIGZyYW1lLCBhbmQgcmVzdCBhcmUgYWxsIFAgZnJhbWVzCiAvLyBJZiBpbnRlcnZhbCA9PSAwLCBhbGwgZnJhbWVzIGFyZSBlbmNvZGVkIGFzIEkgZnJhbWVzLiBObyBQIGZyYW1lcwotLy8gSWYgaW50ZXJ2YWwgPiAgMCwgaXQgaXMgdGhlIHRpbWUgc3BhY2luZyBiZXR3ZWVuIDIgbmVpZ2hib3JpbmcgSSBmcmFtZXMKKy8vIElmIGludGVydmFsID4gIDAsIGl0IGlzIHRoZSB0aW1lIHNwYWNpbmcgKHNlY29uZHMpIGJldHdlZW4gMiBuZWlnaGJvcmluZyBJIGZyYW1lcwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1WaWRlb0lGcmFtZXNJbnRlcnZhbChpbnQzMl90IGludGVydmFsKSB7CiAgICAgTE9HVigic2V0UGFyYW1WaWRlb0lGcmFtZXNJbnRlcnZhbDogJWQgc2Vjb25kcyIsIGludGVydmFsKTsKICAgICBtSUZyYW1lc0ludGVydmFsID0gaW50ZXJ2YWw7CkBAIC0zOTYsNiArNDA5LDcgQEAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVHJhY2tGcmFtZVN0YXR1cyhpbnQzMl90IG5GcmFtZXMpIHsKICAgICBMT0dWKCJzZXRQYXJhbVRyYWNrRnJhbWVTdGF0dXM6ICVkIiwgbkZyYW1lcyk7CiAgICAgaWYgKG5GcmFtZXMgPD0gMCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIG51bWJlciBvZiBmcmFtZXMgdG8gdHJhY2s6ICVkIiwgbkZyYW1lcyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1UcmFja0V2ZXJ5TnVtYmVyT2ZGcmFtZXMgPSBuRnJhbWVzOwpAQCAtNDA1LDI2ICs0MTksNDMgQEAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVHJhY2tUaW1lU3RhdHVzKGludDY0X3QgdGltZUR1cmF0aW9uVXMpIHsKICAgICBMT0dWKCJzZXRQYXJhbVRyYWNrVGltZVN0YXR1czogJWxsZCIsIHRpbWVEdXJhdGlvblVzKTsKICAgICBpZiAodGltZUR1cmF0aW9uVXMgPCAyMDAwMCkgeyAgLy8gSW5mZWFzaWJsZSBpZiBzaG9ydGVyIHRoYW4gMjAgbXM/CisgICAgICAgIExPR0UoIlRyYWNraW5nIHRpbWUgZHVyYXRpb24gdG9vIHNob3J0OiAlbGxkIHVzIiwgdGltZUR1cmF0aW9uVXMpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID0gdGltZUR1cmF0aW9uVXM7CiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGUoaW50MzJfdCBwcm9maWxlKSB7CisgICAgTE9HVigic2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlOiAlZCIsIHByb2ZpbGUpOworCisgICAgLy8gQWRkaXRpb25hbCBjaGVjayB3aWxsIGJlIGRvbmUgbGF0ZXIgd2hlbiB3ZSBsb2FkIHRoZSBlbmNvZGVyLgorICAgIC8vIEZvciBub3csIHdlIGFyZSBhY2NlcHRpbmcgdmFsdWVzIGRlZmluZWQgaW4gT3Blbk1BWCBJTC4KKyAgICBtVmlkZW9FbmNvZGVyUHJvZmlsZSA9IHByb2ZpbGU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvRW5jb2RlckxldmVsKGludDMyX3QgbGV2ZWwpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVZpZGVvRW5jb2RlckxldmVsOiAlZCIsIGxldmVsKTsKKworICAgIC8vIEFkZGl0aW9uYWwgY2hlY2sgd2lsbCBiZSBkb25lIGxhdGVyIHdoZW4gd2UgbG9hZCB0aGUgZW5jb2Rlci4KKyAgICAvLyBGb3Igbm93LCB3ZSBhcmUgYWNjZXB0aW5nIHZhbHVlcyBkZWZpbmVkIGluIE9wZW5NQVggSUwuCisgICAgbVZpZGVvRW5jb2RlckxldmVsID0gbGV2ZWw7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbWV0ZXIoCiAgICAgICAgIGNvbnN0IFN0cmluZzggJmtleSwgY29uc3QgU3RyaW5nOCAmdmFsdWUpIHsKICAgICBMT0dWKCJzZXRQYXJhbWV0ZXI6IGtleSAoJXMpID0+IHZhbHVlICglcykiLCBrZXkuc3RyaW5nKCksIHZhbHVlLnN0cmluZygpKTsKICAgICBpZiAoa2V5ID09ICJtYXgtZHVyYXRpb24iKSB7CiAgICAgICAgIGludDY0X3QgbWF4X2R1cmF0aW9uX21zOwogICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJm1heF9kdXJhdGlvbl9tcykpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbU1heER1cmF0aW9uT3JGaWxlU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgbWF4X2R1cmF0aW9uX21zLCB0cnVlIC8qIGxpbWl0X2lzX2R1cmF0aW9uICovKTsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbU1heEZpbGVEdXJhdGlvblVzKDEwMDBMTCAqIG1heF9kdXJhdGlvbl9tcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGtleSA9PSAibWF4LWZpbGVzaXplIikgewogICAgICAgICBpbnQ2NF90IG1heF9maWxlc2l6ZV9ieXRlczsKICAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZtYXhfZmlsZXNpemVfYnl0ZXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1NYXhEdXJhdGlvbk9yRmlsZVNpemUoCi0gICAgICAgICAgICAgICAgICAgIG1heF9maWxlc2l6ZV9ieXRlcywgZmFsc2UgLyogbGltaXQgaXMgZmlsZXNpemUgKi8pOworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtTWF4RmlsZVNpemVCeXRlcyhtYXhfZmlsZXNpemVfYnl0ZXMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChrZXkgPT0gImludGVybGVhdmUtZHVyYXRpb24tdXMiKSB7CiAgICAgICAgIGludDMyX3QgZHVyYXRpb25VczsKQEAgLTQ3MSw2ICs1MDIsMTYgQEAKICAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZpbnRlcnZhbCkpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKGludGVydmFsKTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS1lbmNvZGVyLXByb2ZpbGUiKSB7CisgICAgICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZwcm9maWxlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9FbmNvZGVyUHJvZmlsZShwcm9maWxlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS1lbmNvZGVyLWxldmVsIikgeworICAgICAgICBpbnQzMl90IGxldmVsOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmxldmVsKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9FbmNvZGVyTGV2ZWwobGV2ZWwpOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLWNhbWVyYS1pZCIpIHsKICAgICAgICAgaW50MzJfdCBjYW1lcmFJZDsKICAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZjYW1lcmFJZCkpIHsKQEAgLTUyOCw3ICs1NjksMTAgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnQoKSB7CisgICAgQ0hFQ0sobU91dHB1dEZkID49IDApOworCiAgICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgeworICAgICAgICBMT0dFKCJGaWxlIHdyaXRlciBpcyBub3QgYXZhaWFsYmxlIik7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIApAQCAtNTQ3LDYgKzU5MSw3IEBACiAgICAgICAgICAgICByZXR1cm4gc3RhcnRBQUNSZWNvcmRpbmcoKTsKIAogICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiVW5zdXBwb3J0ZWQgb3V0cHV0IGZpbGUgZm9ybWF0OiAlZCIsIG1PdXRwdXRGb3JtYXQpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogfQpAQCAtNjEwLDcgKzY1NSw2IEBACiAKICAgICBDSEVDSyhtQXVkaW9FbmNvZGVyID09IEFVRElPX0VOQ09ERVJfQUFDKTsKICAgICBDSEVDSyhtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKTsKLSAgICBDSEVDSyhtT3V0cHV0RmQgPj0gMCk7CiAKICAgICBDSEVDSygwID09ICJBQUNXcml0ZXIgaXMgbm90IGltcGxlbWVudGVkIHlldCIpOwogCkBAIC02MjYsMzQgKzY3MCwzNCBAQAogICAgICAgICAgICAgbUF1ZGlvRW5jb2RlciAhPSBBVURJT19FTkNPREVSX0FNUl9OQikgewogICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBlbmNvZGVyICVkIHVzZWQgZm9yIEFNUk5CIHJlY29yZGluZyIsCiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0VuY29kZXIpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtU2FtcGxlUmF0ZSAhPSA4MDAwKSB7CiAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQgdXNlZCBmb3IgQU1STkIgcmVjb3JkaW5nIiwKICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsgIC8vIG1PdXRwdXRGb3JtYXQgbXVzdCBiZSBPVVRQVVRfRk9STUFUX0FNUl9XQgogICAgICAgICBpZiAobUF1ZGlvRW5jb2RlciAhPSBBVURJT19FTkNPREVSX0FNUl9XQikgewogICAgICAgICAgICAgTE9HRSgiSW52bGFpZCBlbmNvZGVyICVkIHVzZWQgZm9yIEFNUldCIHJlY29yZGluZyIsCiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0VuY29kZXIpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtU2FtcGxlUmF0ZSAhPSAxNjAwMCkgewogICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBzYW1wbGUgcmF0ZSAlZCB1c2VkIGZvciBBTVJXQiByZWNvcmRpbmciLAogICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1BdWRpb0NoYW5uZWxzICE9IDEpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgJWQgdXNlZCBmb3IgYW1yIHJlY29yZGluZyIsCiAgICAgICAgICAgICAgICAgbUF1ZGlvQ2hhbm5lbHMpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpZiAobUF1ZGlvU291cmNlID49IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgewogICAgICAgICBMT0dFKCJJbnZhbGlkIGF1ZGlvIHNvdXJjZTogJWQiLCBtQXVkaW9Tb3VyY2UpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBzcDxNZWRpYVNvdXJjZT4gYXVkaW9FbmNvZGVyID0gY3JlYXRlQXVkaW9Tb3VyY2UoKTsKQEAgLTY2Miw3ICs3MDYsNiBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBDSEVDSyhtT3V0cHV0RmQgPj0gMCk7CiAgICAgbVdyaXRlciA9IG5ldyBBTVJXcml0ZXIoZHVwKG1PdXRwdXRGZCkpOwogICAgIG1Xcml0ZXItPmFkZFNvdXJjZShhdWRpb0VuY29kZXIpOwogCkBAIC03MjksNiArNzcyLDU0IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cENhbWVyYVNvdXJjZSgpIHsKKyAgICBjbGlwVmlkZW9CaXRSYXRlKCk7CisgICAgY2xpcFZpZGVvRnJhbWVSYXRlKCk7CisgICAgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOworICAgIGNsaXBWaWRlb0ZyYW1lSGVpZ2h0KCk7CisKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBpZiAobUNhbWVyYSA9PSAwKSB7CisgICAgICAgIG1DYW1lcmEgPSBDYW1lcmE6OmNvbm5lY3QobUNhbWVyYUlkKTsKKyAgICAgICAgaWYgKG1DYW1lcmEgPT0gMCkgeworICAgICAgICAgICAgTE9HRSgiQ2FtZXJhIGNvbm5lY3Rpb24gY291bGQgbm90IGJlIGVzdGFibGlzaGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorICAgICAgICBtRmxhZ3MgJj0gfkZMQUdTX0hPVF9DQU1FUkE7CisgICAgICAgIG1DYW1lcmEtPmxvY2soKTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGFjdHVhbCB2aWRlbyByZWNvcmRpbmcgZnJhbWUgc2l6ZQorICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKSk7CisgICAgcGFyYW1zLnNldFByZXZpZXdTaXplKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgIHBhcmFtcy5zZXRQcmV2aWV3RnJhbWVSYXRlKG1GcmFtZVJhdGUpOworICAgIFN0cmluZzggcyA9IHBhcmFtcy5mbGF0dGVuKCk7CisgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMocykpOworICAgIENhbWVyYVBhcmFtZXRlcnMgbmV3Q2FtZXJhUGFyYW1zKG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKSk7CisKKyAgICAvLyBDaGVjayBvbiB2aWRlbyBmcmFtZSBzaXplCisgICAgaW50IGZyYW1lV2lkdGggPSAwLCBmcmFtZUhlaWdodCA9IDA7CisgICAgbmV3Q2FtZXJhUGFyYW1zLmdldFByZXZpZXdTaXplKCZmcmFtZVdpZHRoLCAmZnJhbWVIZWlnaHQpOworICAgIGlmIChmcmFtZVdpZHRoICA8IDAgfHwgZnJhbWVXaWR0aCAgIT0gbVZpZGVvV2lkdGggfHwKKyAgICAgICAgZnJhbWVIZWlnaHQgPCAwIHx8IGZyYW1lSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IHRoZSB2aWRlbyBmcmFtZSBzaXplIHRvICVkeCVkIiwKKyAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIENoZWNrIG9uIHZpZGVvIGZyYW1lIHJhdGUKKyAgICBpbnQgZnJhbWVSYXRlID0gbmV3Q2FtZXJhUGFyYW1zLmdldFByZXZpZXdGcmFtZVJhdGUoKTsKKyAgICBpZiAoZnJhbWVSYXRlIDwgMCB8fCAoZnJhbWVSYXRlIC0gbUZyYW1lUmF0ZSkgIT0gMCkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IGZyYW1lIHJhdGUgdG8gJWQgZnBzLiBUaGUgYWN0dWFsICIKKyAgICAgICAgICAgICAiZnJhbWUgcmF0ZSBpcyAlZCIsIG1GcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnNldFByZXZpZXdEaXNwbGF5KG1QcmV2aWV3U3VyZmFjZSkpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIHJldHVybiBPSzsKK30KKwogdm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpjbGlwVmlkZW9GcmFtZUhlaWdodCgpIHsKICAgICBMT0dWKCJjbGlwVmlkZW9GcmFtZUhlaWdodDogZW5jb2RlciAlZCIsIG1WaWRlb0VuY29kZXIpOwogICAgIGludCBtaW5GcmFtZUhlaWdodCA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKApAQCAtNzQ2LDE0NiArODM3LDEyMSBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBWaWRlb0VuY29kZXIoY29uc3Qgc3A8TWVkaWFXcml0ZXI+JiB3cml0ZXIpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cENhbWVyYVNvdXJjZSgpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZSA9IENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhKTsKKyAgICBDSEVDSyhjYW1lcmFTb3VyY2UgIT0gTlVMTCk7CisgICAgaWYobUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgY2FtZXJhU291cmNlLT5lbmFibGVUaW1lTGFwc2VNb2RlKDFFNiwgbUZyYW1lUmF0ZSk7CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IGVuY19tZXRhID0gbmV3IE1ldGFEYXRhOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbVZpZGVvQml0UmF0ZSk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtRnJhbWVSYXRlKTsKKworICAgIHN3aXRjaCAobVZpZGVvRW5jb2RlcikgeworICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfSDI2MzoKKyAgICAgICAgICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfTVBFR180X1NQOgorICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfSDI2NDoKKyAgICAgICAgICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZSwgdW5zdXBwb3J0ZWQgdmlkZW8gZW5jb2RpbmcuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGNhbWVyYVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgc2xpY2VIZWlnaHQsIGNvbG9yRm9ybWF0OworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICZzdHJpZGUpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNsaWNlSGVpZ2h0LCAmc2xpY2VIZWlnaHQpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpKTsKKworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgbUlGcmFtZXNJbnRlcnZhbCk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTdHJpZGUsIHN0cmlkZSk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgc2xpY2VIZWlnaHQpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKKyAgICBpZiAobVZpZGVvRW5jb2RlclByb2ZpbGUgIT0gLTEpIHsKKyAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIG1WaWRlb0VuY29kZXJQcm9maWxlKTsKKyAgICB9CisgICAgaWYgKG1WaWRlb0VuY29kZXJMZXZlbCAhPSAtMSkgeworICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIG1WaWRlb0VuY29kZXJMZXZlbCk7CisgICAgfQorCisgICAgT01YQ2xpZW50IGNsaWVudDsKKyAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCBPSyk7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCisgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY19tZXRhLAorICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBjYW1lcmFTb3VyY2UpOworICAgIGlmIChlbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgd3JpdGVyLT5hZGRTb3VyY2UoZW5jb2Rlcik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cEF1ZGlvRW5jb2Rlcihjb25zdCBzcDxNZWRpYVdyaXRlcj4mIHdyaXRlcikgeworICAgIHNwPE1lZGlhU291cmNlPiBhdWRpb0VuY29kZXI7CisgICAgc3dpdGNoKG1BdWRpb0VuY29kZXIpIHsKKyAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FNUl9OQjoKKyAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FNUl9XQjoKKyAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKKyAgICAgICAgICAgIGF1ZGlvRW5jb2RlciA9IGNyZWF0ZUF1ZGlvU291cmNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIlVuc3VwcG9ydGVkIGF1ZGlvIGVuY29kZXI6ICVkIiwgbUF1ZGlvRW5jb2Rlcik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoYXVkaW9FbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHdyaXRlci0+YWRkU291cmNlKGF1ZGlvRW5jb2Rlcik7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydE1QRUc0UmVjb3JkaW5nKCkgewotICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZHVwKG1PdXRwdXRGZCkpOwogICAgIGludDMyX3QgdG90YWxCaXRSYXRlID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGR1cChtT3V0cHV0RmQpKTsKIAogICAgIC8vIEFkZCBhdWRpbyBzb3VyY2UgZmlyc3QgaWYgaXQgZXhpc3RzCi0gICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpIHsKLSAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGF1ZGlvRW5jb2RlcjsKLSAgICAgICAgc3dpdGNoKG1BdWRpb0VuY29kZXIpIHsKLSAgICAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BTVJfTkI6Ci0gICAgICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX1dCOgotICAgICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKLSAgICAgICAgICAgICAgICBhdWRpb0VuY29kZXIgPSBjcmVhdGVBdWRpb1NvdXJjZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBMT0dFKCJVbnN1cHBvcnRlZCBhdWRpbyBlbmNvZGVyOiAlZCIsIG1BdWRpb0VuY29kZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF1ZGlvRW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQorICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpKSB7CisgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CiAgICAgICAgIHRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwotICAgICAgICBtV3JpdGVyLT5hZGRTb3VyY2UoYXVkaW9FbmNvZGVyKTsKICAgICB9CiAgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfREVGQVVMVAogICAgICAgICAgICAgfHwgbVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9DQU1FUkEpIHsKLQotICAgICAgICBjbGlwVmlkZW9CaXRSYXRlKCk7Ci0gICAgICAgIGNsaXBWaWRlb0ZyYW1lUmF0ZSgpOwotICAgICAgICBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7Ci0gICAgICAgIGNsaXBWaWRlb0ZyYW1lSGVpZ2h0KCk7Ci0KLSAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIGlmIChtQ2FtZXJhID09IDApIHsKLSAgICAgICAgICAgIG1DYW1lcmEgPSBDYW1lcmE6OmNvbm5lY3QobUNhbWVyYUlkKTsKLSAgICAgICAgICAgIGlmIChtQ2FtZXJhID09IDApIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJDYW1lcmEgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1GbGFncyAmPSB+RkxBR1NfSE9UX0NBTUVSQTsKLSAgICAgICAgICAgIG1DYW1lcmEtPmxvY2soKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gU2V0IHRoZSBhY3R1YWwgdmlkZW8gcmVjb3JkaW5nIGZyYW1lIHNpemUKLSAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICAgICAgcGFyYW1zLnNldFByZXZpZXdTaXplKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwotICAgICAgICBwYXJhbXMuc2V0UHJldmlld0ZyYW1lUmF0ZShtRnJhbWVSYXRlKTsKLSAgICAgICAgU3RyaW5nOCBzID0gcGFyYW1zLmZsYXR0ZW4oKTsKLSAgICAgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMocykpOwotICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIG5ld0NhbWVyYVBhcmFtcyhtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCkpOwotCi0gICAgICAgIC8vIENoZWNrIG9uIHZpZGVvIGZyYW1lIHNpemUKLSAgICAgICAgaW50IGZyYW1lV2lkdGggPSAwLCBmcmFtZUhlaWdodCA9IDA7Ci0gICAgICAgIG5ld0NhbWVyYVBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmZnJhbWVXaWR0aCwgJmZyYW1lSGVpZ2h0KTsKLSAgICAgICAgaWYgKGZyYW1lV2lkdGggIDwgMCB8fCBmcmFtZVdpZHRoICAhPSBtVmlkZW9XaWR0aCB8fAotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPCAwIHx8IGZyYW1lSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkgewotICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCB0aGUgdmlkZW8gZnJhbWUgc2l6ZSB0byAlZHglZCIsCi0gICAgICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIG9uIHZpZGVvIGZyYW1lIHJhdGUKLSAgICAgICAgaW50IGZyYW1lUmF0ZSA9IG5ld0NhbWVyYVBhcmFtcy5nZXRQcmV2aWV3RnJhbWVSYXRlKCk7Ci0gICAgICAgIGlmIChmcmFtZVJhdGUgPCAwIHx8IChmcmFtZVJhdGUgLSBtRnJhbWVSYXRlKSAhPSAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IGZyYW1lIHJhdGUgdG8gJWQgZnBzLiBUaGUgYWN0dWFsICIKLSAgICAgICAgICAgICAgICAgImZyYW1lIHJhdGUgaXMgJWQiLCBtRnJhbWVSYXRlLCBmcmFtZVJhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnNldFByZXZpZXdEaXNwbGF5KG1QcmV2aWV3U3VyZmFjZSkpOwotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLQotICAgICAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZSA9Ci0gICAgICAgICAgICBDYW1lcmFTb3VyY2U6OkNyZWF0ZUZyb21DYW1lcmEobUNhbWVyYSk7Ci0KLSAgICAgICAgQ0hFQ0soY2FtZXJhU291cmNlICE9IE5VTEwpOwotCi0gICAgICAgIHNwPE1ldGFEYXRhPiBlbmNfbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmlkZW9CaXRSYXRlKTsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtRnJhbWVSYXRlKTsKLQotICAgICAgICBzd2l0Y2ggKG1WaWRlb0VuY29kZXIpIHsKLSAgICAgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjYzOgotICAgICAgICAgICAgICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9NUEVHXzRfU1A6Ci0gICAgICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjY0OgotICAgICAgICAgICAgICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZSwgdW5zdXBwb3J0ZWQgdmlkZW8gZW5jb2RpbmcuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGNhbWVyYVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNsaWNlSGVpZ2h0OwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICZzdHJpZGUpKTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTbGljZUhlaWdodCwgJnNsaWNlSGVpZ2h0KSk7Ci0KLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsIG1JRnJhbWVzSW50ZXJ2YWwpOwotICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgc3RyaWRlKTsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgc2xpY2VIZWlnaHQpOwotCi0gICAgICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIE9LKTsKLQotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9Ci0gICAgICAgICAgICBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY19tZXRhLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSk7Ci0KLSAgICAgICAgQ0hFQ0sobU91dHB1dEZkID49IDApOworICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2Rlcih3cml0ZXIpOworICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwogICAgICAgICB0b3RhbEJpdFJhdGUgKz0gbVZpZGVvQml0UmF0ZTsKLSAgICAgICAgbVdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOwogICAgIH0KIAotICAgIHsKLSAgICAgICAgLy8gTVBFR1dyaXRlciBzcGVjaWZpYyBoYW5kbGluZwotICAgICAgICBNUEVHNFdyaXRlciAqd3JpdGVyID0gKChNUEVHNFdyaXRlciAqKSBtV3JpdGVyLmdldCgpKTsKLSAgICAgICAgd3JpdGVyLT5zZXRJbnRlcmxlYXZlRHVyYXRpb24obUludGVybGVhdmVEdXJhdGlvblVzKTsKLSAgICB9CisgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KKyAgICAgICAgc2V0SW50ZXJsZWF2ZUR1cmF0aW9uKG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7CiAKICAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKLSAgICAgICAgbVdyaXRlci0+c2V0TWF4RmlsZUR1cmF0aW9uKG1NYXhGaWxlRHVyYXRpb25Vcyk7CisgICAgICAgIHdyaXRlci0+c2V0TWF4RmlsZUR1cmF0aW9uKG1NYXhGaWxlRHVyYXRpb25Vcyk7CiAgICAgfQogICAgIGlmIChtTWF4RmlsZVNpemVCeXRlcyAhPSAwKSB7Ci0gICAgICAgIG1Xcml0ZXItPnNldE1heEZpbGVTaXplKG1NYXhGaWxlU2l6ZUJ5dGVzKTsKKyAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CiAgICAgfQotICAgIG1Xcml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7CiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgbWV0YS0+c2V0SW50NjQoa0tleVRpbWUsIHN5c3RlbVRpbWUoKSAvIDEwMDApOwogICAgIG1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgbU91dHB1dEZvcm1hdCk7CkBAIC04OTcsOCArOTYzLDkgQEAKICAgICBpZiAobVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA+IDApIHsKICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CiAgICAgfQotICAgIG1Xcml0ZXItPnN0YXJ0KG1ldGEuZ2V0KCkpOwotICAgIHJldHVybiBPSzsKKyAgICB3cml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7CisgICAgbVdyaXRlciA9IHdyaXRlcjsKKyAgICByZXR1cm4gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnBhdXNlKCkgewpAQCAtOTE0LDcgKzk4MSw3IEBACiAgICAgTE9HVigic3RvcCIpOwogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKICAgICAgICAgbVdyaXRlci0+c3RvcCgpOwotICAgICAgICBtV3JpdGVyID0gTlVMTDsKKyAgICAgICAgbVdyaXRlci5jbGVhcigpOwogICAgIH0KIAogICAgIGlmIChtQ2FtZXJhICE9IDApIHsKQEAgLTkyNSw3ICs5OTIsNyBAQAogICAgICAgICAgICAgbUNhbWVyYS0+c3RvcFByZXZpZXcoKTsKICAgICAgICAgfQogICAgICAgICBtQ2FtZXJhLT51bmxvY2soKTsKLSAgICAgICAgbUNhbWVyYSA9IE5VTEw7CisgICAgICAgIG1DYW1lcmEuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgICAgIG1GbGFncyA9IDA7CiAgICAgfQpAQCAtOTY0LDggKzEwMzEsMTMgQEAKICAgICBtQXVkaW9Tb3VyY2VOb2RlID0gMDsKICAgICBtVXNlNjRCaXRGaWxlT2Zmc2V0ID0gZmFsc2U7CiAgICAgbUNhbWVyYUlkICAgICAgICA9IDA7CisgICAgbVZpZGVvRW5jb2RlclByb2ZpbGUgPSAtMTsKKyAgICBtVmlkZW9FbmNvZGVyTGV2ZWwgICA9IC0xOworICAgIG1NYXhGaWxlRHVyYXRpb25VcyA9IDA7CisgICAgbU1heEZpbGVTaXplQnl0ZXMgPSAwOwogICAgIG1UcmFja0V2ZXJ5TnVtYmVyT2ZGcmFtZXMgPSAwOwogICAgIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPSAwOworICAgIG1DYXB0dXJlVGltZUxhcHNlID0gZmFsc2U7CiAgICAgbUVuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CiAKICAgICBtT3V0cHV0RmQgPSAtMTsKQEAgLTk5MSw0ICsxMDYzLDY0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgeworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIFJlY29yZGVyOiAlcCIsIHRoaXMpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIE91dHB1dCBmaWxlIChmZCAlZCk6XG4iLCBtT3V0cHV0RmQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZpbGUgZm9ybWF0OiAlZFxuIiwgbU91dHB1dEZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTWF4IGZpbGUgc2l6ZSAoYnl0ZXMpOiAlbGxkXG4iLCBtTWF4RmlsZVNpemVCeXRlcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTWF4IGZpbGUgZHVyYXRpb24gKHVzKTogJWxsZFxuIiwgbU1heEZpbGVEdXJhdGlvblVzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGaWxlIG9mZnNldCBsZW5ndGggKGJpdHMpOiAlZFxuIiwgbVVzZTY0Qml0RmlsZU9mZnNldD8gNjQ6IDMyKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBJbnRlcmxlYXZlIGR1cmF0aW9uICh1cyk6ICVkXG4iLCBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIFByb2dyZXNzIG5vdGlmaWNhdGlvbjogJWQgZnJhbWVzXG4iLCBtVHJhY2tFdmVyeU51bWJlck9mRnJhbWVzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBQcm9ncmVzcyBub3RpZmljYXRpb246ICVsbGQgdXNcbiIsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBBdWRpb1xuIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgU291cmNlOiAlZFxuIiwgbUF1ZGlvU291cmNlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBFbmNvZGVyOiAlZFxuIiwgbUF1ZGlvRW5jb2Rlcik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQml0IHJhdGUgKGJwcyk6ICVkXG4iLCBtQXVkaW9CaXRSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBTYW1wbGluZyByYXRlIChoeik6ICVkXG4iLCBtU2FtcGxlUmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTnVtYmVyIG9mIGNoYW5uZWxzOiAlZFxuIiwgbUF1ZGlvQ2hhbm5lbHMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBhbXBsaXR1ZGU6ICVkXG4iLCBtQXVkaW9Tb3VyY2VOb2RlID09IDA/IDA6IG1BdWRpb1NvdXJjZU5vZGUtPmdldE1heEFtcGxpdHVkZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgVmlkZW9cbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIFNvdXJjZTogJWRcbiIsIG1WaWRlb1NvdXJjZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQ2FtZXJhIElkOiAlZFxuIiwgbUNhbWVyYUlkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBDYW1lcmEgZmxhZ3M6ICVkXG4iLCBtRmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEVuY29kZXI6ICVkXG4iLCBtVmlkZW9FbmNvZGVyKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBFbmNvZGVyIHByb2ZpbGU6ICVkXG4iLCBtVmlkZW9FbmNvZGVyUHJvZmlsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRW5jb2RlciBsZXZlbDogJWRcbiIsIG1WaWRlb0VuY29kZXJMZXZlbCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgSSBmcmFtZXMgaW50ZXJ2YWwgKHMpOiAlZFxuIiwgbUlGcmFtZXNJbnRlcnZhbCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRnJhbWUgc2l6ZSAocGl4ZWxzKTogJWR4JWRcbiIsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZyYW1lIHJhdGUgKGZwcyk6ICVkXG4iLCBtRnJhbWVSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBCaXQgcmF0ZSAoYnBzKTogJWRcbiIsIG1WaWRlb0JpdFJhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBPSzsKK30KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCBmNDQ4OGI2Li41OGYwMDMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTU0LDYgKzU0LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4QW1wbGl0dWRlKGludCAqbWF4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBlbnVtIENhbWVyYUZsYWdzIHsKQEAgLTgyLDExICs4MywxNSBAQAogICAgIGludDMyX3QgbUludGVybGVhdmVEdXJhdGlvblVzOwogICAgIGludDMyX3QgbUlGcmFtZXNJbnRlcnZhbDsKICAgICBpbnQzMl90IG1DYW1lcmFJZDsKKyAgICBpbnQzMl90IG1WaWRlb0VuY29kZXJQcm9maWxlOworICAgIGludDMyX3QgbVZpZGVvRW5jb2RlckxldmVsOwogICAgIGludDY0X3QgbU1heEZpbGVTaXplQnl0ZXM7CiAgICAgaW50NjRfdCBtTWF4RmlsZUR1cmF0aW9uVXM7CiAgICAgaW50MzJfdCBtVHJhY2tFdmVyeU51bWJlck9mRnJhbWVzOwogICAgIGludDY0X3QgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VczsKIAorICAgIGJvb2wgbUNhcHR1cmVUaW1lTGFwc2U7CisKICAgICBTdHJpbmc4IG1QYXJhbXM7CiAgICAgaW50IG1PdXRwdXRGZDsKICAgICBpbnQzMl90IG1GbGFnczsKQEAgLTk3LDE4ICsxMDIsMjYgQEAKICAgICBzdGF0dXNfdCBzdGFydEFNUlJlY29yZGluZygpOwogICAgIHN0YXR1c190IHN0YXJ0QUFDUmVjb3JkaW5nKCk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUF1ZGlvU291cmNlKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBDYW1lcmFTb3VyY2UoKTsKKyAgICBzdGF0dXNfdCBzZXR1cEF1ZGlvRW5jb2Rlcihjb25zdCBzcDxNZWRpYVdyaXRlcj4mIHdyaXRlcik7CisgICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoY29uc3Qgc3A8TWVkaWFXcml0ZXI+JiB3cml0ZXIpOworCisgICAgLy8gRW5jb2RpbmcgcGFyYW1ldGVyIGhhbmRsaW5nIHV0aWxpdGllcwogICAgIHN0YXR1c190IHNldFBhcmFtZXRlcihjb25zdCBTdHJpbmc4ICZrZXksIGNvbnN0IFN0cmluZzggJnZhbHVlKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbUF1ZGlvRW5jb2RpbmdCaXRSYXRlKGludDMyX3QgYml0UmF0ZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb051bWJlck9mQ2hhbm5lbHMoaW50MzJfdCBjaGFubmxlcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1NhbXBsaW5nUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKGludDMyX3QgaW50ZXJ2YWwpOworICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGVyUHJvZmlsZShpbnQzMl90IHByb2ZpbGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGVyTGV2ZWwoaW50MzJfdCBsZXZlbCk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0NhbWVyYUlkKGludDMyX3QgY2FtZXJhSWQpOwogICAgIHN0YXR1c190IHNldFBhcmFtVHJhY2tUaW1lU3RhdHVzKGludDY0X3QgdGltZUR1cmF0aW9uVXMpOwogICAgIHN0YXR1c190IHNldFBhcmFtVHJhY2tGcmFtZVN0YXR1cyhpbnQzMl90IG5GcmFtZXMpOwogICAgIHN0YXR1c190IHNldFBhcmFtSW50ZXJsZWF2ZUR1cmF0aW9uKGludDMyX3QgZHVyYXRpb25Vcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW02NEJpdEZpbGVPZmZzZXQoYm9vbCB1c2U2NEJpdEZpbGVPZmZzZXQpOwotICAgIHN0YXR1c190IHNldFBhcmFtTWF4RHVyYXRpb25PckZpbGVTaXplKGludDY0X3QgbGltaXQsIGJvb2wgbGltaXRfaXNfZHVyYXRpb24pOworICAgIHN0YXR1c190IHNldFBhcmFtTWF4RmlsZUR1cmF0aW9uVXMoaW50NjRfdCB0aW1lVXMpOworICAgIHN0YXR1c190IHNldFBhcmFtTWF4RmlsZVNpemVCeXRlcyhpbnQ2NF90IGJ5dGVzKTsKICAgICB2b2lkIGNsaXBWaWRlb0JpdFJhdGUoKTsKICAgICB2b2lkIGNsaXBWaWRlb0ZyYW1lUmF0ZSgpOwogICAgIHZvaWQgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggNjBkMDIzMy4uNDljZjY0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC02Niw2ICs2Niw3IEBACiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNkZWMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNlbmMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbXAzZGVjIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfdm9yYmlzZGVjIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggNGExNTgwZi4uZmZlZDc0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTM3MSw5ICszNzEsNiBAQAogICAgIH0KICAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKIAotICAgIGlmIChtVGltZVNvdXJjZSAhPSBtQXVkaW9QbGF5ZXIpIHsKLSAgICAgICAgZGVsZXRlIG1UaW1lU291cmNlOwotICAgIH0KICAgICBtVGltZVNvdXJjZSA9IE5VTEw7CiAKICAgICBkZWxldGUgbUF1ZGlvUGxheWVyOwpAQCAtNDk0LDIyICs0OTEsMzUgQEAKICAgICB9CiAgICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSBmYWxzZTsKIAotICAgIGlmIChtU3RyZWFtRG9uZVN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNICYmIChtRmxhZ3MgJiBMT09QSU5HKSkgeworICAgIGlmIChtU3RyZWFtRG9uZVN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIExPR1YoIk1FRElBX0VSUk9SICVkIiwgbVN0cmVhbURvbmVTdGF0dXMpOworCisgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCisgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIG1TdHJlYW1Eb25lU3RhdHVzKTsKKworICAgICAgICBwYXVzZV9sKCk7CisKKyAgICAgICAgbUZsYWdzIHw9IEFUX0VPUzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgYWxsRG9uZSA9CisgICAgICAgIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCB8fCAobUZsYWdzICYgVklERU9fQVRfRU9TKSkKKyAgICAgICAgICAgICYmIChtQXVkaW9Tb3VyY2UgPT0gTlVMTCB8fCAobUZsYWdzICYgQVVESU9fQVRfRU9TKSk7CisKKyAgICBpZiAoIWFsbERvbmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRmxhZ3MgJiBMT09QSU5HKSB7CiAgICAgICAgIHNlZWtUb19sKDApOwogCiAgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1TdHJlYW1Eb25lU3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgIExPR1YoIk1FRElBX1BMQVlCQUNLX0NPTVBMRVRFIik7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR1YoIk1FRElBX0VSUk9SICVkIiwgbVN0cmVhbURvbmVTdGF0dXMpOwotCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICAgICAgICAgICAgICBNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgbVN0cmVhbURvbmVTdGF0dXMpOwotICAgICAgICB9CisgICAgICAgIExPR1YoIk1FRElBX1BMQVlCQUNLX0NPTVBMRVRFIik7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUExBWUJBQ0tfQ09NUExFVEUpOwogCiAgICAgICAgIHBhdXNlX2woKTsKIApAQCAtNTYzLDcgKzU3Myw2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZGVsZXRlIG1UaW1lU291cmNlOwogICAgICAgICAgICAgICAgIG1UaW1lU291cmNlID0gbUF1ZGlvUGxheWVyOwogCiAgICAgICAgICAgICAgICAgZGVmZXJyZWRBdWRpb1NlZWsgPSB0cnVlOwpAQCAtNTc5LDcgKzU4OCw3IEBACiAgICAgfQogCiAgICAgaWYgKG1UaW1lU291cmNlID09IE5VTEwgJiYgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgbVRpbWVTb3VyY2UgPSBuZXcgU3lzdGVtVGltZVNvdXJjZTsKKyAgICAgICAgbVRpbWVTb3VyY2UgPSAmbVN5c3RlbVRpbWVTb3VyY2U7CiAgICAgfQogCiAgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7CkBAIC03NDQsNyArNzUzLDcgQEAKICAgICBtU2Vla2luZyA9IHRydWU7CiAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7CiAgICAgbVNlZWtUaW1lVXMgPSB0aW1lVXM7Ci0gICAgbUZsYWdzICY9IH5BVF9FT1M7CisgICAgbUZsYWdzICY9IH4oQVRfRU9TIHwgQVVESU9fQVRfRU9TIHwgVklERU9fQVRfRU9TKTsKIAogICAgIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKIApAQCAtOTI0LDYgKzkzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7CiAgICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtOTY4LDE5ICs5NzgsMjEgQEAKICAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7CiAgICAgfQogCisgICAgVGltZVNvdXJjZSAqdHMgPSAobUZsYWdzICYgQVVESU9fQVRfRU9TKSA/ICZtU3lzdGVtVGltZVNvdXJjZSA6IG1UaW1lU291cmNlOworCiAgICAgaWYgKG1GbGFncyAmIEZJUlNUX0ZSQU1FKSB7CiAgICAgICAgIG1GbGFncyAmPSB+RklSU1RfRlJBTUU7CiAKLSAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gbVRpbWVTb3VyY2UtPmdldFJlYWxUaW1lVXMoKSAtIHRpbWVVczsKKyAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIHRpbWVVczsKICAgICB9CiAKICAgICBpbnQ2NF90IHJlYWxUaW1lVXMsIG1lZGlhVGltZVVzOwotICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTAorICAgIGlmICghKG1GbGFncyAmIEFVRElPX0FUX0VPUykgJiYgbUF1ZGlvUGxheWVyICE9IE5VTEwKICAgICAgICAgJiYgbUF1ZGlvUGxheWVyLT5nZXRNZWRpYVRpbWVNYXBwaW5nKCZyZWFsVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7CiAgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHJlYWxUaW1lVXMgLSBtZWRpYVRpbWVVczsKICAgICB9CiAKLSAgICBpbnQ2NF90IG5vd1VzID0gbVRpbWVTb3VyY2UtPmdldFJlYWxUaW1lVXMoKSAtIG1UaW1lU291cmNlRGVsdGFVczsKKyAgICBpbnQ2NF90IG5vd1VzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIG1UaW1lU291cmNlRGVsdGFVczsKIAogICAgIGludDY0X3QgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOwogCkBAIC0xMDgxLDYgKzEwOTMsOCBAQAogICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwogICAgIGlmIChtV2F0Y2hGb3JBdWRpb0VPUyAmJiBtQXVkaW9QbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgewogICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IGZhbHNlOworICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOworICAgICAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7CiAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChmaW5hbFN0YXR1cyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAppbmRleCA2ZjRjOTgwLi5iYjUzZDk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKQEAgLTExNiw2ICsxMTYsMTkgQEAKICAgICByZXR1cm4gbmV3IENhbWVyYVNvdXJjZShjYW1lcmEpOwogfQogCit2b2lkIENhbWVyYVNvdXJjZTo6ZW5hYmxlVGltZUxhcHNlTW9kZSgKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLCBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKSB7CisgICAgTE9HVigic3RhcnRpbmcgdGltZSBsYXBzZSBtb2RlIik7CisgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgPSB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOworICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXMgPSAoMUU2L3ZpZGVvRnJhbWVSYXRlKTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2U6OmRpc2FibGVUaW1lTGFwc2VNb2RlKCkgeworICAgIExPR1YoInN0b3BwaW5nIHRpbWUgbGFwc2UgbW9kZSIpOworICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID0gLTE7CisgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVcyA9IDA7Cit9CisKIENhbWVyYVNvdXJjZTo6Q2FtZXJhU291cmNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSkKICAgICA6IG1DYW1lcmEoY2FtZXJhKSwKICAgICAgIG1GaXJzdEZyYW1lVGltZVVzKDApLApAQCAtMTI2LDcgKzEzOSwxMCBAQAogICAgICAgbU51bUdsaXRjaGVzKDApLAogICAgICAgbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMoMjAwMDAwKSwKICAgICAgIG1Db2xsZWN0U3RhdHMoZmFsc2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKC0xKSwKKyAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXMoMCksCisgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzKDApIHsKIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKQEAgLTMxNiw2ICszMzIsMzUgQEAKICAgICAgICAgKyttTnVtR2xpdGNoZXM7CiAgICAgfQogCisgICAgLy8gdGltZSBsYXBzZQorICAgIGlmKG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID49IDApIHsKKyAgICAgICAgaWYobUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyA9PSAwKSB7CisgICAgICAgICAgICAvLyBGaXJzdCB0aW1lIGxhcHNlIGZyYW1lLiBJbml0aWFsaXplIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMKKyAgICAgICAgICAgIC8vIHRvIGN1cnJlbnQgdGltZSAodGltZXN0YW1wVXMpIGFuZCBzYXZlIGZyYW1lIGRhdGEuCisgICAgICAgICAgICBMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAgdGltZWxhcHNlOiBpbml0aWFsIGZyYW1lIik7CisKKyAgICAgICAgICAgIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfSBlbHNlIGlmICh0aW1lc3RhbXBVcyA8CisgICAgICAgICAgICAgICAgKG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykpIHsKKyAgICAgICAgICAgIC8vIFNraXAgYWxsIGZyYW1lcyBmcm9tIGxhc3QgZW5jb2RlZCBmcmFtZSB1bnRpbAorICAgICAgICAgICAgLy8gc3VmZmljaWVudCB0aW1lIChtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykgaGFzIHBhc3NlZC4KKyAgICAgICAgICAgIC8vIFRlbGwgdGhlIGNhbWVyYSB0byByZWxlYXNlIGl0cyByZWNvcmRpbmcgZnJhbWUgYW5kIHJldHVybi4KKyAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IHNraXBwaW5nIGludGVybWVkaWF0ZSBmcmFtZSIpOworCisgICAgICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoZGF0YSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEZXNpcmVkIGZyYW1lIGhhcyBhcnJpdmVkIGFmdGVyIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIHRpbWU6CisgICAgICAgICAgICAvLyAtIFJlc2V0IG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgdG8gY3VycmVudCB0aW1lLgorICAgICAgICAgICAgLy8gLSBBcnRpZmljaWFsbHkgbW9kaWZ5IHRpbWVzdGFtcFVzIHRvIGJlIG9uZSBmcmFtZSB0aW1lICgxL2ZyYW1lcmF0ZSkgYWhlYWQKKyAgICAgICAgICAgIC8vIG9mIHRoZSBsYXN0IGVuY29kZWQgZnJhbWUncyB0aW1lIHN0YW1wLgorICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogZ290IHRpbWVsYXBzZSBmcmFtZSIpOworCisgICAgICAgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IG1MYXN0RnJhbWVUaW1lc3RhbXBVcyArIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXM7CisgICAgICAgIH0KKyAgICB9CisKICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDApIHsKICAgICAgICAgbUZpcnN0RnJhbWVUaW1lVXMgPSB0aW1lc3RhbXBVczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAppbmRleCBhNTJjODg4Li42YTRhMTMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCkBAIC0zNCw2ICszNCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKKyNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBNUEVHNFdyaXRlcjo6VHJhY2sgewpAQCAtMTI2LDYgKzEyOCw4IEBACiAgICAgICAgICAgICBpbnQzMl90ICptaW4sIGludDMyX3QgKmF2ZywgaW50MzJfdCAqbWF4KTsKICAgICB2b2lkIGZpbmRNaW5NYXhDaHVua0R1cmF0aW9ucyhpbnQ2NF90ICptaW4sIGludDY0X3QgKm1heCk7CiAKKyAgICB2b2lkIGdldENvZGVjU3BlY2lmaWNEYXRhRnJvbUlucHV0Rm9ybWF0SWZQb3NzaWJsZSgpOworCiAgICAgVHJhY2soY29uc3QgVHJhY2sgJik7CiAgICAgVHJhY2sgJm9wZXJhdG9yPShjb25zdCBUcmFjayAmKTsKIH07CkBAIC02NzgsNiArNjgyLDM4IEBACiAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKDApLAogICAgICAgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKICAgICAgIG1SZWFjaGVkRU9TKGZhbHNlKSB7CisgICAgZ2V0Q29kZWNTcGVjaWZpY0RhdGFGcm9tSW5wdXRGb3JtYXRJZlBvc3NpYmxlKCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXRDb2RlY1NwZWNpZmljRGF0YUZyb21JbnB1dEZvcm1hdElmUG9zc2libGUoKSB7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChtTWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGEgPSBtYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIG1lbWNweShtQ29kZWNTcGVjaWZpY0RhdGEsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCisgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAobU1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgRVNEUyBlc2RzKGRhdGEsIHNpemUpOworICAgICAgICAgICAgaWYgKGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmRhdGEsICZzaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkobUNvZGVjU3BlY2lmaWNEYXRhLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgICAgICBtR290QWxsQ29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiBNUEVHNFdyaXRlcjo6VHJhY2s6On5UcmFjaygpIHsKQEAgLTcyMSw3ICs3NTcsMTAgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOwotICAgIENIRUNLKHBhcmFtcyAmJiBwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnN0YXJ0VGltZVVzKSk7CisgICAgaWYgKHBhcmFtcyA9PSBOVUxMIHx8ICFwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnN0YXJ0VGltZVVzKSkgeworICAgICAgICBzdGFydFRpbWVVcyA9IDA7CisgICAgfQorCiAgICAgaW5pdFRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMocGFyYW1zKTsKIAogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IGRhY2I4ZDMuLjA3N2UxMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJpbmNsdWRlL0FNUldCRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvQU1SV0JFbmNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9BVkNEZWNvZGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9BVkNFbmNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NNHZIMjYzRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTVAzRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvVm9yYmlzRGVjb2Rlci5oIgpAQCAtODEsNiArODIsNyBAQAogRkFDVE9SWV9DUkVBVEVfRU5DT0RFUihBTVJOQkVuY29kZXIpCiBGQUNUT1JZX0NSRUFURV9FTkNPREVSKEFNUldCRW5jb2RlcikKIEZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIoQUFDRW5jb2RlcikKK0ZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIoQVZDRW5jb2RlcikKIAogc3RhdGljIHNwPE1lZGlhU291cmNlPiBJbnN0YW50aWF0ZVNvZnR3YXJlRW5jb2RlcigKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCkBAIC05NCw2ICs5Niw3IEBACiAgICAgICAgIEZBQ1RPUllfUkVGKEFNUk5CRW5jb2RlcikKICAgICAgICAgRkFDVE9SWV9SRUYoQU1SV0JFbmNvZGVyKQogICAgICAgICBGQUNUT1JZX1JFRihBQUNFbmNvZGVyKQorICAgICAgICBGQUNUT1JZX1JFRihBVkNFbmNvZGVyKQogICAgIH07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7CiAgICAgICAgICBpIDwgc2l6ZW9mKGtGYWN0b3J5SW5mbykgLyBzaXplb2Yoa0ZhY3RvcnlJbmZvWzBdKTsgKytpKSB7CkBAIC0xODYsNiArMTg5LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiQVZDRW5jb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlBWLmF2Y2VuYyIgfSwKIH07CiAKQEAgLTgzMSw3ICs4MzUsNyBAQAogCiAgICAgdmlkZW9fZGVmLT5uRnJhbWVXaWR0aCA9IHdpZHRoOwogICAgIHZpZGVvX2RlZi0+bkZyYW1lSGVpZ2h0ID0gaGVpZ2h0OwotICAgIHZpZGVvX2RlZi0+eEZyYW1lcmF0ZSA9IChmcmFtZVJhdGUgPDwgMTYpOyAgLy8gUTE2IGZvcm1hdAorICAgIHZpZGVvX2RlZi0+eEZyYW1lcmF0ZSA9IDA7ICAgICAgLy8gTm8gbmVlZCBmb3Igb3V0cHV0IHBvcnQKICAgICB2aWRlb19kZWYtPm5CaXRyYXRlID0gYml0UmF0ZTsgIC8vIFExNiBmb3JtYXQKICAgICB2aWRlb19kZWYtPmVDb21wcmVzc2lvbkZvcm1hdCA9IGNvbXByZXNzaW9uRm9ybWF0OwogICAgIHZpZGVvX2RlZi0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKQEAgLTkxOCw2ICs5MjIsNTIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE9NWENvZGVjOjpnZXRWaWRlb1Byb2ZpbGVMZXZlbCgKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLAorICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCYgZGVmYXVsdFByb2ZpbGVMZXZlbCwKKyAgICAgICAgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCkgeworICAgIENPREVDX0xPR1YoIkRlZmF1bHQgcHJvZmlsZTogJWxkLCBsZXZlbCAlbGQiLAorICAgICAgICAgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZSwgZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWwpOworCisgICAgLy8gQXJlIHRoZSBkZWZhdWx0IHByb2ZpbGUgYW5kIGxldmVsIG92ZXJ3cml0ZW4/CisgICAgaW50MzJfdCBwcm9maWxlLCBsZXZlbDsKKyAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgcHJvZmlsZSA9IGRlZmF1bHRQcm9maWxlTGV2ZWwubVByb2ZpbGU7CisgICAgfQorICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlWaWRlb0xldmVsLCAmbGV2ZWwpKSB7CisgICAgICAgIGxldmVsID0gZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWw7CisgICAgfQorICAgIENPREVDX0xPR1YoIlRhcmdldCBwcm9maWxlOiAlZCwgbGV2ZWw6ICVkIiwgcHJvZmlsZSwgbGV2ZWwpOworCisgICAgLy8gQXJlIHRoZSB0YXJnZXQgcHJvZmlsZSBhbmQgbGV2ZWwgc3VwcG9ydGVkIGJ5IHRoZSBlbmNvZGVyPworICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFIHBhcmFtOworICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtKTsKKyAgICBwYXJhbS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICBmb3IgKHBhcmFtLm5Qcm9maWxlSW5kZXggPSAwOzsgKytwYXJhbS5uUHJvZmlsZUluZGV4KSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgICAgICBpbnQzMl90IHN1cHBvcnRlZFByb2ZpbGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihwYXJhbS5lUHJvZmlsZSk7CisgICAgICAgIGludDMyX3Qgc3VwcG9ydGVkTGV2ZWwgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihwYXJhbS5lTGV2ZWwpOworICAgICAgICBDT0RFQ19MT0dWKCJTdXBwb3J0ZWQgcHJvZmlsZTogJWQsIGxldmVsICVkIiwKKyAgICAgICAgICAgIHN1cHBvcnRlZFByb2ZpbGUsIHN1cHBvcnRlZExldmVsKTsKKworICAgICAgICBpZiAocHJvZmlsZSA9PSBzdXBwb3J0ZWRQcm9maWxlICYmCisgICAgICAgICAgICBsZXZlbCA9PSBzdXBwb3J0ZWRMZXZlbCkgeworICAgICAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlID0gcHJvZmlsZTsKKyAgICAgICAgICAgIHByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIENPREVDX0xPR0UoIlRhcmdldCBwcm9maWxlICglZCkgYW5kIGxldmVsICglZCkgaXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICBwcm9maWxlLCBsZXZlbCk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKwogc3RhdHVzX3QgT01YQ29kZWM6OnNldHVwSDI2M0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSkgewogICAgIGludDMyX3QgaUZyYW1lc0ludGVydmFsLCBmcmFtZVJhdGUsIGJpdFJhdGU7CiAgICAgYm9vbCBzdWNjZXNzID0gbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0UmF0ZSk7CkBAIC05NDEsOCArOTkxLDE0IEBACiAgICAgfQogICAgIGgyNjN0eXBlLm5CRnJhbWVzID0gMDsKIAotICAgIGgyNjN0eXBlLmVQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmU7Ci0gICAgaDI2M3R5cGUuZUxldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQ1OworICAgIC8vIENoZWNrIHByb2ZpbGUgYW5kIGxldmVsIHBhcmFtZXRlcnMKKyAgICBDb2RlY1Byb2ZpbGVMZXZlbCBkZWZhdWx0UHJvZmlsZUxldmVsLCBwcm9maWxlTGV2ZWw7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lOworICAgIGRlZmF1bHRQcm9maWxlTGV2ZWwubUxldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQ1OworICAgIGVyciA9IGdldFZpZGVvUHJvZmlsZUxldmVsKG1ldGEsIGRlZmF1bHRQcm9maWxlTGV2ZWwsIHByb2ZpbGVMZXZlbCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICBoMjYzdHlwZS5lUHJvZmlsZSA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEU+KHByb2ZpbGVMZXZlbC5tUHJvZmlsZSk7CisgICAgaDI2M3R5cGUuZUxldmVsID0gc3RhdGljX2Nhc3Q8T01YX1ZJREVPX0gyNjNMRVZFTFRZUEU+KHByb2ZpbGVMZXZlbC5tTGV2ZWwpOwogCiAgICAgaDI2M3R5cGUuYlBMVVNQVFlQRUFsbG93ZWQgPSBPTVhfRkFMU0U7CiAgICAgaDI2M3R5cGUuYkZvcmNlUm91bmRpbmdUeXBlVG9aZXJvID0gT01YX0ZBTFNFOwpAQCAtOTkyLDggKzEwNDgsMTQgQEAKICAgICBtcGVnNHR5cGUubkhlYWRlckV4dGVuc2lvbiA9IDA7CiAgICAgbXBlZzR0eXBlLmJSZXZlcnNpYmxlVkxDID0gT01YX0ZBTFNFOwogCi0gICAgbXBlZzR0eXBlLmVQcm9maWxlID0gT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZTsKLSAgICBtcGVnNHR5cGUuZUxldmVsID0gT01YX1ZJREVPX01QRUc0TGV2ZWwyOworICAgIC8vIENoZWNrIHByb2ZpbGUgYW5kIGxldmVsIHBhcmFtZXRlcnMKKyAgICBDb2RlY1Byb2ZpbGVMZXZlbCBkZWZhdWx0UHJvZmlsZUxldmVsLCBwcm9maWxlTGV2ZWw7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZSA9IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGU7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBPTVhfVklERU9fTVBFRzRMZXZlbDI7CisgICAgZXJyID0gZ2V0VmlkZW9Qcm9maWxlTGV2ZWwobWV0YSwgZGVmYXVsdFByb2ZpbGVMZXZlbCwgcHJvZmlsZUxldmVsKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgIG1wZWc0dHlwZS5lUHJvZmlsZSA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFPihwcm9maWxlTGV2ZWwubVByb2ZpbGUpOworICAgIG1wZWc0dHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fTVBFRzRMRVZFTFRZUEU+KHByb2ZpbGVMZXZlbC5tTGV2ZWwpOwogCiAgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNCwgJm1wZWc0dHlwZSwgc2l6ZW9mKG1wZWc0dHlwZSkpOwpAQCAtMTAyOSwyMiArMTA5MSwzOSBAQAogICAgIGlmIChoMjY0dHlwZS5uUEZyYW1lcyA9PSAwKSB7CiAgICAgICAgIGgyNjR0eXBlLm5BbGxvd2VkUGljdHVyZVR5cGVzID0gT01YX1ZJREVPX1BpY3R1cmVUeXBlSTsKICAgICB9Ci0gICAgaDI2NHR5cGUuYlVzZUhhZGFtYXJkID0gT01YX1RSVUU7Ci0gICAgaDI2NHR5cGUublJlZkZyYW1lcyA9IDE7Ci0gICAgaDI2NHR5cGUublJlZklkeDEwQWN0aXZlTWludXMxID0gMDsKLSAgICBoMjY0dHlwZS5uUmVmSWR4MTFBY3RpdmVNaW51czEgPSAwOworCisgICAgLy8gQ2hlY2sgcHJvZmlsZSBhbmQgbGV2ZWwgcGFyYW1ldGVycworICAgIENvZGVjUHJvZmlsZUxldmVsIGRlZmF1bHRQcm9maWxlTGV2ZWwsIHByb2ZpbGVMZXZlbDsKKyAgICBkZWZhdWx0UHJvZmlsZUxldmVsLm1Qcm9maWxlID0gaDI2NHR5cGUuZVByb2ZpbGU7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBoMjY0dHlwZS5lTGV2ZWw7CisgICAgZXJyID0gZ2V0VmlkZW9Qcm9maWxlTGV2ZWwobWV0YSwgZGVmYXVsdFByb2ZpbGVMZXZlbCwgcHJvZmlsZUxldmVsKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgIGgyNjR0eXBlLmVQcm9maWxlID0gc3RhdGljX2Nhc3Q8T01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFPihwcm9maWxlTGV2ZWwubVByb2ZpbGUpOworICAgIGgyNjR0eXBlLmVMZXZlbCA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19BVkNMRVZFTFRZUEU+KHByb2ZpbGVMZXZlbC5tTGV2ZWwpOworCisgICAgaWYgKGgyNjR0eXBlLmVQcm9maWxlID09IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUpIHsKKyAgICAgICAgaDI2NHR5cGUuYlVzZUhhZGFtYXJkID0gT01YX1RSVUU7CisgICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSAxOworICAgICAgICBoMjY0dHlwZS5uUmVmSWR4MTBBY3RpdmVNaW51czEgPSAwOworICAgICAgICBoMjY0dHlwZS5uUmVmSWR4MTFBY3RpdmVNaW51czEgPSAwOworICAgICAgICBoMjY0dHlwZS5iRW50cm9weUNvZGluZ0NBQkFDID0gT01YX0ZBTFNFOworICAgICAgICBoMjY0dHlwZS5iV2VpZ2h0ZWRQUHJlZGljdGlvbiA9IE9NWF9GQUxTRTsKKyAgICAgICAgaDI2NHR5cGUuYmNvbnN0SXByZWQgPSBPTVhfRkFMU0U7CisgICAgICAgIGgyNjR0eXBlLmJEaXJlY3Q4eDhJbmZlcmVuY2UgPSBPTVhfRkFMU0U7CisgICAgICAgIGgyNjR0eXBlLmJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgPSBPTVhfRkFMU0U7CisgICAgICAgIGgyNjR0eXBlLm5DYWJhY0luaXRJZGMgPSAwOworICAgIH0KKworICAgIGlmIChoMjY0dHlwZS5uQkZyYW1lcyAhPSAwKSB7CisgICAgICAgIGgyNjR0eXBlLm5BbGxvd2VkUGljdHVyZVR5cGVzIHw9IE9NWF9WSURFT19QaWN0dXJlVHlwZUI7CisgICAgfQorCiAgICAgaDI2NHR5cGUuYkVuYWJsZVVFUCA9IE9NWF9GQUxTRTsKICAgICBoMjY0dHlwZS5iRW5hYmxlRk1PID0gT01YX0ZBTFNFOwogICAgIGgyNjR0eXBlLmJFbmFibGVBU08gPSBPTVhfRkFMU0U7CiAgICAgaDI2NHR5cGUuYkVuYWJsZVJTID0gT01YX0ZBTFNFOwogICAgIGgyNjR0eXBlLmJGcmFtZU1Cc09ubHkgPSBPTVhfVFJVRTsKICAgICBoMjY0dHlwZS5iTUJBRkYgPSBPTVhfRkFMU0U7Ci0gICAgaDI2NHR5cGUuYkVudHJvcHlDb2RpbmdDQUJBQyA9IE9NWF9GQUxTRTsKLSAgICBoMjY0dHlwZS5iV2VpZ2h0ZWRQUHJlZGljdGlvbiA9IE9NWF9GQUxTRTsKLSAgICBoMjY0dHlwZS5iY29uc3RJcHJlZCA9IE9NWF9GQUxTRTsKLSAgICBoMjY0dHlwZS5iRGlyZWN0OHg4SW5mZXJlbmNlID0gT01YX0ZBTFNFOwotICAgIGgyNjR0eXBlLmJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgPSBPTVhfRkFMU0U7Ci0gICAgaDI2NHR5cGUubkNhYmFjSW5pdElkYyA9IDA7CiAgICAgaDI2NHR5cGUuZUxvb3BGaWx0ZXJNb2RlID0gT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGU7CiAKICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FBQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BQUNEZWNvZGVyLmNwcAppbmRleCAyYmM0NDQ4Li5mM2IyODFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FBQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQUFDRGVjb2Rlci5jcHAKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiQUFDRGVjb2Rlci5oIgorI2RlZmluZSBMT0dfVEFHICJBQUNEZWNvZGVyIgogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9FU0RTLmgiCiAKQEAgLTM2LDI2ICszNywzMyBAQAogICAgICAgbUFuY2hvclRpbWVVcygwKSwKICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApLAogICAgICAgbUlucHV0QnVmZmVyKE5VTEwpIHsKLX0KIAotQUFDRGVjb2Rlcjo6fkFBQ0RlY29kZXIoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKKyAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgQ0hFQ0soc3JjRm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7CisKKyAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisKKyAgICAvLyBXZSdsbCBhbHdheXMgb3V0cHV0IHN0ZXJlbywgcmVnYXJkbGVzcyBvZiBob3cgbWFueSBjaGFubmVscyBhcmUKKyAgICAvLyBwcmVzZW50IGluIHRoZSBpbnB1dCBkdWUgdG8gZGVjb2RlciBsaW1pdGF0aW9ucy4KKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMik7CisgICAgbU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAoc3JjRm9ybWF0LT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgbU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CiAgICAgfQorICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiQUFDRGVjb2RlciIpOwogCi0gICAgZGVsZXRlIG1Db25maWc7Ci0gICAgbUNvbmZpZyA9IE5VTEw7CisgICAgbUluaXRDaGVjayA9IGluaXRDaGVjaygpOwogfQogCi1zdGF0dXNfdCBBQUNEZWNvZGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLQotICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIoMjA0OCAqIDIpKTsKLQorc3RhdHVzX3QgQUFDRGVjb2Rlcjo6aW5pdENoZWNrKCkgeworICAgIG1lbXNldChtQ29uZmlnLCAwLCBzaXplb2YodFBWTVA0QXVkaW9EZWNvZGVyRXh0ZXJuYWwpKTsKICAgICBtQ29uZmlnLT5vdXRwdXRGb3JtYXQgPSBPVVRQVVRGT1JNQVRfMTZQQ01fSU5URVJMRUFWRUQ7Ci0gICAgbUNvbmZpZy0+YWFjUGx1c1Vwc2FtcGxpbmdGYWN0b3IgPSAwOwotICAgIG1Db25maWctPmFhY1BsdXNFbmFibGVkID0gZmFsc2U7CisgICAgbUNvbmZpZy0+YWFjUGx1c0VuYWJsZWQgPSAxOwogCiAgICAgLy8gVGhlIHNvZnR3YXJlIGRlY29kZXIgZG9lc24ndCBwcm9wZXJseSBzdXBwb3J0IG1vbm8gb3V0cHV0IG9uCiAgICAgLy8gQUFDcGx1cyBmaWxlcy4gQWx3YXlzIG91dHB1dCBzdGVyZW8uCkBAIC02NCw4ICs3MiwxMSBAQAogICAgIFVJbnQzMiBtZW1SZXF1aXJlbWVudHMgPSBQVk1QNEF1ZGlvRGVjb2RlckdldE1lbVJlcXVpcmVtZW50cygpOwogICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CiAKLSAgICBDSEVDS19FUShQVk1QNEF1ZGlvRGVjb2RlckluaXRMaWJyYXJ5KG1Db25maWcsIG1EZWNvZGVyQnVmKSwKLSAgICAgICAgICAgICBNUDRBVURFQ19TVUNDRVNTKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBQVk1QNEF1ZGlvRGVjb2RlckluaXRMaWJyYXJ5KG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBpZiAoZXJyICE9IE1QNEFVREVDX1NVQ0NFU1MpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgTVA0IGF1ZGlvIGRlY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQogCiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpkYXRhOwpAQCAtODMsMTggKzk0LDM4IEBACiAgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9IChVQ2hhciAqKWNvZGVjX3NwZWNpZmljX2RhdGE7CiAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJNYXhMZW5ndGggPSAwOwotICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOwotICAgICAgICBtQ29uZmlnLT5yZW1haW5kZXJCaXRzID0gMDsKLQotICAgICAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlcl9wbHVzID0gTlVMTDsKLSAgICAgICAgbUNvbmZpZy0+cmVwb3NpdGlvbkZsYWcgPSBmYWxzZTsKIAogICAgICAgICBpZiAoUFZNUDRBdWRpb0RlY29kZXJDb25maWcobUNvbmZpZywgbURlY29kZXJCdWYpCiAgICAgICAgICAgICAgICAgIT0gTVA0QVVERUNfU1VDQ0VTUykgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgb24gdGhlIHNhbXBsaW5nIHJhdGUgdG8gc2VlIHdoZXRoZXIgaXQgaXMgY2hhbmdlZC4KKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOworICAgICAgICBpZiAobUNvbmZpZy0+c2FtcGxpbmdSYXRlICE9IHNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgIExPR1coIlNhbXBsZSByYXRlIHdhcyAlZCwgYnV0IG5vdyBpcyAlZCIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSk7CisgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitBQUNEZWNvZGVyOjp+QUFDRGVjb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KKworICAgIGRlbGV0ZSBtQ29uZmlnOworICAgIG1Db25maWcgPSBOVUxMOworfQorCitzdGF0dXNfdCBBQUNEZWNvZGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgQ0hFQ0soIW1TdGFydGVkKTsKKworICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIoNDA5NiAqIDIpKTsKIAogICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CiAKQEAgLTEyNywyOCArMTU4LDcgQEAKIH0KIAogc3A8TWV0YURhdGE+IEFBQ0RlY29kZXI6OmdldEZvcm1hdCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgQ0hFQ0soc3JjRm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLQotICAgIC8vIFdlJ2xsIGFsd2F5cyBvdXRwdXQgc3RlcmVvLCByZWdhcmRsZXNzIG9mIGhvdyBtYW55IGNoYW5uZWxzIGFyZQotICAgIC8vIHByZXNlbnQgaW4gdGhlIGlucHV0IGR1ZSB0byBkZWNvZGVyIGxpbWl0YXRpb25zLgotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOwotCi0gICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwotCi0gICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgIGlmIChzcmNGb3JtYXQtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewotICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgIH0KLQotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJBQUNEZWNvZGVyIik7Ci0KLSAgICByZXR1cm4gbWV0YTsKKyAgICByZXR1cm4gbU1ldGE7CiB9CiAKIHN0YXR1c190IEFBQ0RlY29kZXI6OnJlYWQoCkBAIC0yMDAsMTMgKzIxMCwxOSBAQAogICAgIG1Db25maWctPnJlbWFpbmRlckJpdHMgPSAwOwogCiAgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9IHN0YXRpY19jYXN0PEludDE2ICo+KGJ1ZmZlci0+ZGF0YSgpKTsKLSAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyX3BsdXMgPSBOVUxMOworICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXJfcGx1cyA9ICZtQ29uZmlnLT5wT3V0cHV0QnVmZmVyWzIwNDhdOwogICAgIG1Db25maWctPnJlcG9zaXRpb25GbGFnID0gZmFsc2U7CiAKICAgICBJbnQgZGVjb2RlckVyciA9IFBWTVA0QXVkaW9EZWNvZGVGcmFtZShtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAKICAgICBzaXplX3QgbnVtT3V0Qnl0ZXMgPQogICAgICAgICBtQ29uZmlnLT5mcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1Db25maWctPmRlc2lyZWRDaGFubmVsczsKKyAgICBpZiAobUNvbmZpZy0+YWFjUGx1c1Vwc2FtcGxpbmdGYWN0b3IgPT0gMikgeworICAgICAgICBpZiAobUNvbmZpZy0+ZGVzaXJlZENoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICAgIG1lbWNweSgmbUNvbmZpZy0+cE91dHB1dEJ1ZmZlclsxMDI0XSwgJm1Db25maWctPnBPdXRwdXRCdWZmZXJbMjA0OF0sIG51bU91dEJ5dGVzICogMik7CisgICAgICAgIH0KKyAgICAgICAgbnVtT3V0Qnl0ZXMgKj0gMjsKKyAgICB9CiAKICAgICBpZiAoZGVjb2RlckVyciAhPSBNUDRBVURFQ19TVUNDRVNTKSB7CiAgICAgICAgIExPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkLCBzdWJzdGl0dXRpbmcgc2lsZW5jZSIsIGRlY29kZXJFcnIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQVZDRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BVkNFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWViMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQVZDRW5jb2Rlci5jcHAKQEAgLTAsMCArMSw0OTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFWQ0VuY29kZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBVkNFbmNvZGVyLmgiCisKKyNpbmNsdWRlICJhdmNlbmNfYXBpLmgiCisjaW5jbHVkZSAiYXZjZW5jX2ludC5oIgorI2luY2x1ZGUgIk9NWF9WaWRlby5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbmxpbmUgc3RhdGljIHZvaWQgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgdWludDhfdCAqaW55dXYsIHVpbnQ4X3QqIG91dHl1diwKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKworICAgIGludDMyX3Qgb3V0WXNpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgICB1aW50MzJfdCAqb3V0eSA9ICAodWludDMyX3QgKikgb3V0eXV2OworICAgIHVpbnQxNl90ICpvdXRjYiA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUpOworICAgIHVpbnQxNl90ICpvdXRjciA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUgKyAob3V0WXNpemUgPj4gMikpOworCisgICAgLyogWSBjb3B5aW5nICovCisgICAgbWVtY3B5KG91dHksIGlueXV2LCBvdXRZc2l6ZSk7CisKKyAgICAvKiBVICYgViBjb3B5aW5nICovCisgICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOworICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmlueXV2XzQrKzsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7CisgICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKKworICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7CisKKyAgICAgICAgICAgIC8vIEZsaXAgVSBhbmQgVgorICAgICAgICAgICAgKm91dGNiKysgPSB0ZW1wVjsKKyAgICAgICAgICAgICpvdXRjcisrID0gdGVtcFU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQzMl90IE1hbGxvY1dyYXBwZXIoCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IHNpemUsIGludDMyX3QgYXR0cnMpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90PihtYWxsb2Moc2l6ZSkpOworfQorCitzdGF0aWMgdm9pZCBGcmVlV3JhcHBlcih2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBwdHIpIHsKKyAgICBmcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihwdHIpKTsKK30KKworc3RhdGljIGludDMyX3QgRHBiQWxsb2NXcmFwcGVyKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZUluTWJzLCB1bnNpZ25lZCBpbnQgbnVtQnVmZmVycykgeworICAgIEFWQ0VuY29kZXIgKmVuY29kZXIgPSBzdGF0aWNfY2FzdDxBVkNFbmNvZGVyICo+KHVzZXJEYXRhKTsKKyAgICBDSEVDSyhlbmNvZGVyICE9IE5VTEwpOworICAgIHJldHVybiBlbmNvZGVyLT5hbGxvY091dHB1dEJ1ZmZlcnMoc2l6ZUluTWJzLCBudW1CdWZmZXJzKTsKK30KKworc3RhdGljIGludDMyX3QgQmluZEZyYW1lV3JhcHBlcigKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsIGludDMyX3QgaW5kZXgsIHVpbnQ4X3QgKip5dXYpIHsKKyAgICBBVkNFbmNvZGVyICplbmNvZGVyID0gc3RhdGljX2Nhc3Q8QVZDRW5jb2RlciAqPih1c2VyRGF0YSk7CisgICAgQ0hFQ0soZW5jb2RlciAhPSBOVUxMKTsKKyAgICByZXR1cm4gZW5jb2Rlci0+YmluZE91dHB1dEJ1ZmZlcihpbmRleCwgeXV2KTsKK30KKworc3RhdGljIHZvaWQgVW5iaW5kRnJhbWVXcmFwcGVyKHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IGluZGV4KSB7CisgICAgQVZDRW5jb2RlciAqZW5jb2RlciA9IHN0YXRpY19jYXN0PEFWQ0VuY29kZXIgKj4odXNlckRhdGEpOworICAgIENIRUNLKGVuY29kZXIgIT0gTlVMTCk7CisgICAgcmV0dXJuIGVuY29kZXItPnVuYmluZE91dHB1dEJ1ZmZlcihpbmRleCk7Cit9CisKK0FWQ0VuY29kZXI6OkFWQ0VuY29kZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtTWV0YShtZXRhKSwKKyAgICAgIG1OdW1JbnB1dEZyYW1lcygtMSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtSW5wdXRCdWZmZXIoTlVMTCksCisgICAgICBtSW5wdXRGcmFtZURhdGEoTlVMTCksCisgICAgICBtR3JvdXAoTlVMTCkgeworCisgICAgTE9HVigiQ29uc3RydWN0IHNvZnR3YXJlIEFWQ0VuY29kZXIiKTsKKworICAgIG1IYW5kbGUgPSBuZXcgdGFnQVZDSGFuZGxlOworICAgIG1lbXNldChtSGFuZGxlLCAwLCBzaXplb2YodGFnQVZDSGFuZGxlKSk7CisgICAgbUhhbmRsZS0+QVZDT2JqZWN0ID0gTlVMTDsKKyAgICBtSGFuZGxlLT51c2VyRGF0YSA9IHRoaXM7CisgICAgbUhhbmRsZS0+Q0JBVkNfRFBCQWxsb2MgPSBEcGJBbGxvY1dyYXBwZXI7CisgICAgbUhhbmRsZS0+Q0JBVkNfRnJhbWVCaW5kID0gQmluZEZyYW1lV3JhcHBlcjsKKyAgICBtSGFuZGxlLT5DQkFWQ19GcmFtZVVuYmluZCA9IFVuYmluZEZyYW1lV3JhcHBlcjsKKyAgICBtSGFuZGxlLT5DQkFWQ19NYWxsb2MgPSBNYWxsb2NXcmFwcGVyOworICAgIG1IYW5kbGUtPkNCQVZDX0ZyZWUgPSBGcmVlV3JhcHBlcjsKKworICAgIG1Jbml0Q2hlY2sgPSBpbml0Q2hlY2sobWV0YSk7Cit9CisKK0FWQ0VuY29kZXI6On5BVkNFbmNvZGVyKCkgeworICAgIExPR1YoIkRlc3RydWN0IHNvZnR3YXJlIEFWQ0VuY29kZXIiKTsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KKworICAgIGRlbGV0ZSBtRW5jUGFyYW1zOworICAgIGRlbGV0ZSBtSGFuZGxlOworfQorCitzdGF0dXNfdCBBVkNFbmNvZGVyOjppbml0Q2hlY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKSB7CisgICAgTE9HVigiaW5pdENoZWNrIik7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1WaWRlb1dpZHRoKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZtVmlkZW9IZWlnaHQpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtVmlkZW9GcmFtZVJhdGUpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZtVmlkZW9CaXRSYXRlKSk7CisKKyAgICAvLyBYWFg6IEFkZCBtb3JlIGNvbG9yIGZvcm1hdCBzdXBwb3J0CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJm1WaWRlb0NvbG9yRm9ybWF0KSk7CisgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgICAgICBMT0dFKCJDb2xvciBmb3JtYXQgJWQgaXMgbm90IHN1cHBvcnRlZCIsIG1WaWRlb0NvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWxsb2NhdGUgc3BhcmUgYnVmZmVyIG9ubHkgd2hlbiBjb2xvciBjb252ZXJzaW9uIGlzIG5lZWRlZC4KKyAgICAgICAgLy8gQXNzdW1lIHRoZSBjb2xvciBmb3JtYXQgaXMgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIuCisgICAgICAgIG1JbnB1dEZyYW1lRGF0YSA9CisgICAgICAgICAgICAodWludDhfdCAqKSBtYWxsb2MoKG1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ICogMyApID4+IDEpOworICAgICAgICBDSEVDSyhtSW5wdXRGcmFtZURhdGEpOworICAgIH0KKworICAgIC8vIFhYWDogUmVtb3ZlIHRoaXMgcmVzdHJpY3Rpb24KKyAgICBpZiAobVZpZGVvV2lkdGggJSAxNiAhPSAwIHx8IG1WaWRlb0hlaWdodCAlIDE2ICE9IDApIHsKKyAgICAgICAgTE9HRSgiVmlkZW8gZnJhbWUgc2l6ZSAlZHglZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYiLAorICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbUVuY1BhcmFtcyA9IG5ldyB0YWdBVkNFbmNQYXJhbTsKKyAgICBtZW1zZXQobUVuY1BhcmFtcywgMCwgc2l6ZW9mKG1FbmNQYXJhbXMpKTsKKyAgICBtRW5jUGFyYW1zLT53aWR0aCA9IG1WaWRlb1dpZHRoOworICAgIG1FbmNQYXJhbXMtPmhlaWdodCA9IG1WaWRlb0hlaWdodDsKKyAgICBtRW5jUGFyYW1zLT5mcmFtZV9yYXRlID0gMTAwMCAqIG1WaWRlb0ZyYW1lUmF0ZTsgIC8vIEluIGZyYW1lcy9tcyEKKyAgICBtRW5jUGFyYW1zLT5yYXRlX2NvbnRyb2wgPSBBVkNfT047CisgICAgbUVuY1BhcmFtcy0+Yml0cmF0ZSA9IG1WaWRlb0JpdFJhdGU7CisgICAgbUVuY1BhcmFtcy0+aW5pdFFQID0gMDsKKyAgICBtRW5jUGFyYW1zLT5pbml0X0NCUF9yZW1vdmFsX2RlbGF5ID0gMTYwMDsKKyAgICBtRW5jUGFyYW1zLT5DUEJfc2l6ZSA9ICh1aW50MzJfdCkgKG1WaWRlb0JpdFJhdGUgPj4gMSk7CisKKyAgICBtRW5jUGFyYW1zLT5pbnRyYW1iX3JlZnJlc2ggPSAwOworICAgIG1FbmNQYXJhbXMtPmF1dG9fc2NkID0gQVZDX09OOworICAgIG1FbmNQYXJhbXMtPm91dF9vZl9iYW5kX3BhcmFtX3NldCA9IEFWQ19PTjsKKyAgICBtRW5jUGFyYW1zLT5wb2NfdHlwZSA9IDI7CisgICAgbUVuY1BhcmFtcy0+bG9nMl9tYXhfcG9jX2xzYl9taW51c180ID0gMTI7CisgICAgbUVuY1BhcmFtcy0+ZGVsdGFfcG9jX3plcm9fZmxhZyA9IDA7CisgICAgbUVuY1BhcmFtcy0+b2Zmc2V0X3BvY19ub25fcmVmID0gMDsKKyAgICBtRW5jUGFyYW1zLT5vZmZzZXRfdG9wX2JvdHRvbSA9IDA7CisgICAgbUVuY1BhcmFtcy0+bnVtX3JlZl9pbl9jeWNsZSA9IDA7CisgICAgbUVuY1BhcmFtcy0+b2Zmc2V0X3BvY19yZWYgPSBOVUxMOworCisgICAgbUVuY1BhcmFtcy0+bnVtX3JlZl9mcmFtZSA9IDE7CisgICAgbUVuY1BhcmFtcy0+bnVtX3NsaWNlX2dyb3VwID0gMTsKKyAgICBtRW5jUGFyYW1zLT5mbW9fdHlwZSA9IDA7CisKKyAgICBtRW5jUGFyYW1zLT5kYl9maWx0ZXIgPSBBVkNfT047CisgICAgbUVuY1BhcmFtcy0+ZGlzYWJsZV9kYl9pZGMgPSAwOworCisgICAgbUVuY1BhcmFtcy0+YWxwaGFfb2Zmc2V0ID0gMDsKKyAgICBtRW5jUGFyYW1zLT5iZXRhX29mZnNldCA9IDA7CisgICAgbUVuY1BhcmFtcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZCA9IEFWQ19PRkY7CisKKyAgICBtRW5jUGFyYW1zLT5kYXRhX3BhciA9IEFWQ19PRkY7CisgICAgbUVuY1BhcmFtcy0+ZnVsbHNlYXJjaCA9IEFWQ19PRkY7CisgICAgbUVuY1BhcmFtcy0+c2VhcmNoX3JhbmdlID0gMTY7CisgICAgbUVuY1BhcmFtcy0+c3ViX3BlbCA9IEFWQ19PRkY7CisgICAgbUVuY1BhcmFtcy0+c3VibWJfcHJlZCA9IEFWQ19PRkY7CisgICAgbUVuY1BhcmFtcy0+cmRvcHRfbW9kZSA9IEFWQ19PRkY7CisgICAgbUVuY1BhcmFtcy0+YmlkaXJfcHJlZCA9IEFWQ19PRkY7CisgICAgaW50MzJfdCBuTWFjcm9CbG9ja3MgPSAoKCgobVZpZGVvV2lkdGggKyAxNSkgPj4gNCkgPDwgNCkgKgorICAgICAgICAgICAgKCgobVZpZGVvSGVpZ2h0ICsgMTUpID4+IDQpIDw8IDQpKSA+PiA4OworICAgIHVpbnQzMl90ICpzbGljZUdyb3VwID0gKHVpbnQzMl90ICopIG1hbGxvYyhzaXplb2YodWludDMyX3QpICogbk1hY3JvQmxvY2tzKTsKKyAgICBmb3IgKGludCBpaSA9IDAsIGlkeCA9IDA7IGlpIDwgbk1hY3JvQmxvY2tzOyArK2lpKSB7CisgICAgICAgIHNsaWNlR3JvdXBbaWldID0gaWR4Kys7CisgICAgICAgIGlmIChpZHggPj0gbUVuY1BhcmFtcy0+bnVtX3NsaWNlX2dyb3VwKSB7CisgICAgICAgICAgICBpZHggPSAwOworICAgICAgICB9CisgICAgfQorICAgIG1FbmNQYXJhbXMtPnNsaWNlX2dyb3VwID0gc2xpY2VHcm91cDsKKworICAgIG1FbmNQYXJhbXMtPnVzZV9vdmVycnVuX2J1ZmZlciA9IEFWQ19PRkY7CisKKyAgICAvLyBTZXQgSURSIGZyYW1lIHJlZnJlc2ggaW50ZXJ2YWwKKyAgICBpbnQzMl90IGlGcmFtZXNJbnRlcnZhbFNlYzsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgJmlGcmFtZXNJbnRlcnZhbFNlYykpOworICAgIGlmIChpRnJhbWVzSW50ZXJ2YWxTZWMgPCAwKSB7CisgICAgICAgIG1FbmNQYXJhbXMtPmlkcl9wZXJpb2QgPSAtMTsKKyAgICB9IGVsc2UgaWYgKGlGcmFtZXNJbnRlcnZhbFNlYyA9PSAwKSB7CisgICAgICAgIG1FbmNQYXJhbXMtPmlkcl9wZXJpb2QgPSAxOyAgLy8gQWxsIEkgZnJhbWVzCisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+aWRyX3BlcmlvZCA9CisgICAgICAgICAgICAoaUZyYW1lc0ludGVydmFsU2VjICogbVZpZGVvRnJhbWVSYXRlKTsKKyAgICB9CisgICAgTE9HVigiaWRyX3BlcmlvZDogJWQsIEktZnJhbWVzIGludGVydmFsOiAlZCBzZWNvbmRzLCBhbmQgZnJhbWUgcmF0ZTogJWQiLAorICAgICAgICBtRW5jUGFyYW1zLT5pZHJfcGVyaW9kLCBpRnJhbWVzSW50ZXJ2YWxTZWMsIG1WaWRlb0ZyYW1lUmF0ZSk7CisKKyAgICAvLyBTZXQgcHJvZmlsZSBhbmQgbGV2ZWwKKyAgICAvLyBJZiBwcm9maWxlIGFuZCBsZXZlbCBzZXR0aW5nIGlzIG5vdCBjb3JyZWN0LCBmYWlsdXJlCisgICAgLy8gaXMgcmVwb3J0ZWQgd2hlbiB0aGUgZW5jb2RlciBpcyBpbml0aWFsaXplZC4KKyAgICBtRW5jUGFyYW1zLT5wcm9maWxlID0gQVZDX0JBU0VMSU5FOworICAgIG1FbmNQYXJhbXMtPmxldmVsID0gQVZDX0xFVkVMM18yOworICAgIGludDMyX3QgcHJvZmlsZSwgbGV2ZWw7CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+cHJvZmlsZSA9IChBVkNQcm9maWxlKSBwcm9maWxlOworICAgIH0KKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlWaWRlb0xldmVsLCAmbGV2ZWwpKSB7CisgICAgICAgIG1FbmNQYXJhbXMtPmxldmVsID0gKEFWQ0xldmVsKSBsZXZlbDsKKyAgICB9CisKKworICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCBtVmlkZW9XaWR0aCk7CisgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgbVZpZGVvSGVpZ2h0KTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbVZpZGVvQml0UmF0ZSk7CisgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1WaWRlb0ZyYW1lUmF0ZSk7CisgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBtVmlkZW9Db2xvckZvcm1hdCk7CisgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkFWQ0VuY29kZXIiKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFWQ0VuY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBMT0dWKCJzdGFydCIpOworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBMT0dXKCJDYWxsIHN0YXJ0KCkgd2hlbiBlbmNvZGVyIGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgQVZDRW5jX1N0YXR1cyBlcnI7CisgICAgZXJyID0gUFZBVkNFbmNJbml0aWFsaXplKG1IYW5kbGUsIG1FbmNQYXJhbXMsIE5VTEwsIE5VTEwpOworICAgIGlmIChlcnIgIT0gQVZDRU5DX1NVQ0NFU1MpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGVuY29kZXI6ICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKKyAgICBpbnQzMl90IG1heFNpemU7CisgICAgaWYgKEFWQ0VOQ19TVUNDRVNTICE9CisgICAgICAgIFBWQVZDRW5jR2V0TWF4T3V0cHV0QnVmZmVyU2l6ZShtSGFuZGxlLCAmbWF4U2l6ZSkpIHsKKyAgICAgICAgbWF4U2l6ZSA9IDMxNTg0OyAgLy8gTWFnaWMgIworICAgIH0KKyAgICBtR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1heFNpemUpKTsKKworICAgIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisgICAgbU51bUlucHV0RnJhbWVzID0gLTI7ICAvLyAxc3QgdHdvIGJ1ZmZlcnMgY29udGFpbiBTUFMgYW5kIFBQUworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSBmYWxzZTsKKyAgICBtUmVhZHlGb3JOZXh0RnJhbWUgPSB0cnVlOworICAgIG1Jc0lEUkZyYW1lID0gMDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQVZDRW5jb2Rlcjo6c3RvcCgpIHsKKyAgICBMT0dWKCJzdG9wIik7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICBMT0dXKCJDYWxsIHN0b3AoKSB3aGVuIGVuY29kZXIgaGFzIG5vdCBzdGFydGVkIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtR3JvdXApIHsKKyAgICAgICAgZGVsZXRlIG1Hcm91cDsKKyAgICAgICAgbUdyb3VwID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUlucHV0RnJhbWVEYXRhKSB7CisgICAgICAgIGRlbGV0ZSBtSW5wdXRGcmFtZURhdGE7CisgICAgICAgIG1JbnB1dEZyYW1lRGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgUFZBVkNDbGVhblVwRW5jb2RlcihtSGFuZGxlKTsKKyAgICBtU291cmNlLT5zdG9wKCk7CisgICAgcmVsZWFzZU91dHB1dEJ1ZmZlcnMoKTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEFWQ0VuY29kZXI6OnJlbGVhc2VPdXRwdXRCdWZmZXJzKCkgeworICAgIExPR1YoInJlbGVhc2VPdXRwdXRCdWZmZXJzIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0QnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbU91dHB1dEJ1ZmZlcnMuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihOVUxMKTsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgfQorICAgIG1PdXRwdXRCdWZmZXJzLmNsZWFyKCk7Cit9CisKK3NwPE1ldGFEYXRhPiBBVkNFbmNvZGVyOjpnZXRGb3JtYXQoKSB7CisgICAgTE9HVigiZ2V0Rm9ybWF0Iik7CisgICAgcmV0dXJuIG1Gb3JtYXQ7Cit9CisKK3N0YXR1c190IEFWQ0VuY29kZXI6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworCisgICAgQ0hFQ0soIW9wdGlvbnMpOworICAgICpvdXQgPSBOVUxMOworCisgICAgTWVkaWFCdWZmZXIgKm91dHB1dEJ1ZmZlcjsKKyAgICBDSEVDS19FUShPSywgbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0cHV0QnVmZmVyKSk7CisgICAgdWludDhfdCAqb3V0UHRyID0gKHVpbnQ4X3QgKikgb3V0cHV0QnVmZmVyLT5kYXRhKCk7CisgICAgdWludDMyX3QgZGF0YUxlbmd0aCA9IG91dHB1dEJ1ZmZlci0+c2l6ZSgpOworCisgICAgaW50MzJfdCB0eXBlOworICAgIEFWQ0VuY19TdGF0dXMgZW5jb2RlclN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworCisgICAgLy8gUmV0dXJuIFNQUyBhbmQgUFBTIGZvciB0aGUgZmlyc3QgdHdvIGJ1ZmZlcnMKKyAgICBpZiAoIW1TcHNQcHNIZWFkZXJSZWNlaXZlZCkgeworICAgICAgICBlbmNvZGVyU3RhdHVzID0gUFZBVkNFbmNvZGVOQUwobUhhbmRsZSwgb3V0UHRyLCAmZGF0YUxlbmd0aCwgJnR5cGUpOworICAgICAgICBpZiAoZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfV1JPTkdfU1RBVEUpIHsKKyAgICAgICAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IHRydWU7CisgICAgICAgICAgICBDSEVDS19FUSgwLCBtTnVtSW5wdXRGcmFtZXMpOyAgLy8gMXN0IHZpZGVvIGZyYW1lIGlzIDAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU1BTOgorICAgICAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfUFBTOgorICAgICAgICAgICAgICAgICAgICBMT0dWKCIlcyByZWNlaXZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gQVZDX05BTFRZUEVfU1BTKT8gIlNQUyI6ICJQUFMiKTsKKyAgICAgICAgICAgICAgICAgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAqb3V0ID0gb3V0cHV0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiTmFsIHR5cGUgKCVkKSBvdGhlciB0aGFuIFNQUy9QUFMgaXMgdW5leHBlY3RlZCIsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdldCBuZXh0IGlucHV0IHZpZGVvIGZyYW1lCisgICAgaWYgKG1SZWFkeUZvck5leHRGcmFtZSkgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJlYWQgaW5wdXQgdmlkZW8gZnJhbWU6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgQ0hFQ0sobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworCisgICAgICAgIEFWQ0ZyYW1lSU8gdmlkZW9JbnB1dDsKKyAgICAgICAgbWVtc2V0KCZ2aWRlb0lucHV0LCAwLCBzaXplb2YodmlkZW9JbnB1dCkpOworICAgICAgICB2aWRlb0lucHV0LmhlaWdodCA9ICgobVZpZGVvSGVpZ2h0ICArIDE1KSA+PiA0KSA8PCA0OworICAgICAgICB2aWRlb0lucHV0LnBpdGNoID0gKChtVmlkZW9XaWR0aCArIDE1KSA+PiA0KSA8PCA0OworICAgICAgICB2aWRlb0lucHV0LmNvZGluZ190aW1lc3RhbXAgPSAodGltZVVzICsgNTAwKSAvIDEwMDA7ICAvLyBpbiBtcworICAgICAgICB1aW50OF90ICppbnB1dERhdGEgPSAodWludDhfdCAqKSBtSW5wdXRCdWZmZXItPmRhdGEoKTsKKworICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICAgICAgQ0hFQ0sobUlucHV0RnJhbWVEYXRhKTsKKyAgICAgICAgICAgIENIRUNLKG1WaWRlb0NvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKTsKKyAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCisgICAgICAgICAgICAgICAgaW5wdXREYXRhLCBtSW5wdXRGcmFtZURhdGEsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgaW5wdXREYXRhID0gbUlucHV0RnJhbWVEYXRhOworICAgICAgICB9CisgICAgICAgIENIRUNLKGlucHV0RGF0YSAhPSBOVUxMKTsKKyAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclswXSA9IGlucHV0RGF0YTsKKyAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclsxXSA9IHZpZGVvSW5wdXQuWUNiQ3JbMF0gKyB2aWRlb0lucHV0LmhlaWdodCAqIHZpZGVvSW5wdXQucGl0Y2g7CisgICAgICAgIHZpZGVvSW5wdXQuWUNiQ3JbMl0gPSB2aWRlb0lucHV0LllDYkNyWzFdICsKKyAgICAgICAgICAgICgodmlkZW9JbnB1dC5oZWlnaHQgKiB2aWRlb0lucHV0LnBpdGNoKSA+PiAyKTsKKyAgICAgICAgdmlkZW9JbnB1dC5kaXNwX29yZGVyID0gbU51bUlucHV0RnJhbWVzOworCisgICAgICAgIGVuY29kZXJTdGF0dXMgPSBQVkFWQ0VuY1NldElucHV0KG1IYW5kbGUsICZ2aWRlb0lucHV0KTsKKyAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX1NVQ0NFU1MgfHwKKyAgICAgICAgICAgIGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX05FV19JRFIpIHsKKyAgICAgICAgICAgIG1SZWFkeUZvck5leHRGcmFtZSA9IGZhbHNlOworICAgICAgICAgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgICAgICAgICBpZiAoZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfTkVXX0lEUikgeworICAgICAgICAgICAgICAgIG1Jc0lEUkZyYW1lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVyU3RhdHVzIDwgQVZDRU5DX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLT5zZXRfcmFuZ2UoMCwgMCk7CisgICAgICAgICAgICAgICAgKm91dCA9IG91dHB1dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbmNvZGUgYW4gaW5wdXQgdmlkZW8gZnJhbWUKKyAgICBDSEVDSyhlbmNvZGVyU3RhdHVzID09IEFWQ0VOQ19TVUNDRVNTIHx8CisgICAgICAgICAgZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfTkVXX0lEUik7CisgICAgZGF0YUxlbmd0aCA9IG91dHB1dEJ1ZmZlci0+c2l6ZSgpOyAgLy8gUmVzZXQgdGhlIG91dHB1dCBidWZmZXIgbGVuZ3RoCisgICAgZW5jb2RlclN0YXR1cyA9IFBWQVZDRW5jb2RlTkFMKG1IYW5kbGUsIG91dFB0ciwgJmRhdGFMZW5ndGgsICZ0eXBlKTsKKyAgICBpZiAoZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfU1VDQ0VTUykgeworICAgICAgICBvdXRwdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIG1Jc0lEUkZyYW1lKTsKKyAgICAgICAgQ0hFQ0tfRVEoTlVMTCwgUFZBVkNFbmNHZXRPdmVycnVuQnVmZmVyKG1IYW5kbGUpKTsKKyAgICB9IGVsc2UgaWYgKGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX1BJQ1RVUkVfUkVBRFkpIHsKKyAgICAgICAgQ0hFQ0tfRVEoTlVMTCwgUFZBVkNFbmNHZXRPdmVycnVuQnVmZmVyKG1IYW5kbGUpKTsKKyAgICAgICAgaWYgKG1Jc0lEUkZyYW1lKSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIG1Jc0lEUkZyYW1lKTsKKyAgICAgICAgICAgIG1Jc0lEUkZyYW1lID0gMDsKKyAgICAgICAgICAgIExPR1YoIk91dHB1dCBhbiBJRFIgZnJhbWUiKTsKKyAgICAgICAgfQorICAgICAgICBtUmVhZHlGb3JOZXh0RnJhbWUgPSB0cnVlOworICAgICAgICBBVkNGcmFtZUlPIHJlY29uOworICAgICAgICBpZiAoUFZBVkNFbmNHZXRSZWNvbihtSGFuZGxlLCAmcmVjb24pID09IEFWQ0VOQ19TVUNDRVNTKSB7CisgICAgICAgICAgICBQVkFWQ0VuY1JlbGVhc2VSZWNvbihtSGFuZGxlLCAmcmVjb24pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YUxlbmd0aCA9IDA7CisgICAgICAgIG1SZWFkeUZvck5leHRGcmFtZSA9IHRydWU7CisgICAgfQorICAgIGlmIChlbmNvZGVyU3RhdHVzIDwgQVZDRU5DX1NVQ0NFU1MpIHsKKyAgICAgICAgb3V0cHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG91dHB1dEJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRhdGFMZW5ndGgpOworICAgICpvdXQgPSBvdXRwdXRCdWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitpbnQzMl90IEFWQ0VuY29kZXI6OmFsbG9jT3V0cHV0QnVmZmVycygKKyAgICAgICAgdW5zaWduZWQgaW50IHNpemVJbk1icywgdW5zaWduZWQgaW50IG51bUJ1ZmZlcnMpIHsKKyAgICBDSEVDSyhtT3V0cHV0QnVmZmVycy5pc0VtcHR5KCkpOworICAgIHNpemVfdCBmcmFtZVNpemUgPSAoc2l6ZUluTWJzIDw8IDcpICogMzsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8ICBudW1CdWZmZXJzOyArK2kpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihmcmFtZVNpemUpOworICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOworICAgICAgICBtT3V0cHV0QnVmZmVycy5wdXNoKGJ1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgQVZDRW5jb2Rlcjo6dW5iaW5kT3V0cHV0QnVmZmVyKGludDMyX3QgaW5kZXgpIHsKKyAgICBDSEVDSyhpbmRleCA+PSAwKTsKK30KKworaW50MzJfdCBBVkNFbmNvZGVyOjpiaW5kT3V0cHV0QnVmZmVyKGludDMyX3QgaW5kZXgsIHVpbnQ4X3QgKip5dXYpIHsKKyAgICBDSEVDSyhpbmRleCA+PSAwKTsKKyAgICBDSEVDSyhpbmRleCA8IChpbnQzMl90KSBtT3V0cHV0QnVmZmVycy5zaXplKCkpOworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgIG1PdXRwdXRCdWZmZXJzW2luZGV4XS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworCisgICAgKnl1diA9ICh1aW50OF90ICopIG1PdXRwdXRCdWZmZXJzW2luZGV4XS0+ZGF0YSgpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgQVZDRW5jb2Rlcjo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwZjIzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgQVZDRW5jb2Rlci5jcHAgXAorICAgIHNyYy9hdmNlbmNfYXBpLmNwcCBcCisgICAgc3JjL2JpdHN0cmVhbV9pby5jcHAgXAorICAgIHNyYy9ibG9jay5jcHAgXAorICAgIHNyYy9maW5kaGFsZnBlbC5jcHAgXAorICAgIHNyYy9oZWFkZXIuY3BwIFwKKyAgICBzcmMvaW5pdC5jcHAgXAorICAgIHNyYy9pbnRyYV9lc3QuY3BwIFwKKyAgICBzcmMvbW90aW9uX2NvbXAuY3BwIFwKKyAgICBzcmMvbW90aW9uX2VzdC5jcHAgXAorICAgIHNyYy9yYXRlX2NvbnRyb2wuY3BwIFwKKyAgICBzcmMvcmVzaWR1YWwuY3BwIFwKKyAgICBzcmMvc2FkLmNwcCBcCisgICAgc3JjL3NhZF9oYWxmcGVsLmNwcCBcCisgICAgc3JjL3NsaWNlLmNwcCBcCisgICAgc3JjL3ZsY19lbmNvZGUuY3BwCisKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2F2Y2VuYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCisgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24vaW5jbHVkZSBcCisgICAgJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUKKworTE9DQUxfQ0ZMQUdTIDo9IFwKKyAgICAtRF9fYXJtX18gXAorICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0VYUE9SVF9SRUY9CisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfYXBpLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfYXBpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzk4ODVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19hcGkuY3BwCkBAIC0wLDAgKzEsNzQ0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19hcGkuaCIKKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZBVkNHZXROQUxUeXBlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAxMS80LzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFNuaWZmIE5BTCB0eXBlIGZyb20gdGhlIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZWVkLCBBVkNFTkNfRkFJTCBpZiBmYWlsLiAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0dldE5BTFR5cGUodW5zaWduZWQgY2hhciAqYml0c3RyZWFtLCBpbnQgc2l6ZSwKKyAgICAgICAgaW50ICpuYWxfdHlwZSwgaW50ICpuYWxfcmVmX2lkYykKK3sKKyAgICBpbnQgZm9yYmlkZGVuX3plcm9fYml0OworICAgIGlmIChzaXplID4gMCkKKyAgICB7CisgICAgICAgIGZvcmJpZGRlbl96ZXJvX2JpdCA9IGJpdHN0cmVhbVswXSA+PiA3OworICAgICAgICBpZiAoZm9yYmlkZGVuX3plcm9fYml0ICE9IDApCisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7CisgICAgICAgICpuYWxfcmVmX2lkYyA9IChiaXRzdHJlYW1bMF0gJiAweDYwKSA+PiA1OworICAgICAgICAqbmFsX3R5cGUgPSBiaXRzdHJlYW1bMF0gJiAweDFGOworICAgICAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZBVkNFbmNJbml0aWFsaXplKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAzLzE4LzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEluaXRpYWxpemUgdGhlIGVuY29kZXIgbGlicmFyeSwgYWxsb2NhdGUgbWVtb3J5IGFuZCB2ZXJpZnkgICAqLworLyogICAgICAgICAgICAgIHRoZSBwcm9maWxlL2xldmVsIHN1cHBvcnQvc2V0dGluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiBFbmNvZGluZyBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jSW5pdGlhbGl6ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRW5jUGFyYW1zICplbmNQYXJhbSwKKyAgICAgICAgdm9pZCogZXh0U1BTLCB2b2lkKiBleHRQUFMpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQ7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbzsKKyAgICB1aW50MzIgKnVzZXJEYXRhID0gKHVpbnQzMiopIGF2Y0hhbmRsZS0+dXNlckRhdGE7CisgICAgaW50IGZyYW1lc2l6ZTsKKworICAgIGlmIChhdmNIYW5kbGUtPkFWQ09iamVjdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19BTFJFQURZX0lOSVRJQUxJWkVEOyAvKiBJdCdzIGFscmVhZHkgaW5pdGlhbGl6ZWQsIG5lZWQgdG8gY2xlYW51cCBmaXJzdCAqLworICAgIH0KKworICAgIC8qIG5vdCBpbml0aWFsaXplZCAqLworCisgICAgLyogYWxsb2NhdGUgdmlkZW9PYmplY3QgKi8KKyAgICBhdmNIYW5kbGUtPkFWQ09iamVjdCA9ICh2b2lkKilhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ0VuY09iamVjdCksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGF2Y0hhbmRsZS0+QVZDT2JqZWN0ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKworICAgIGVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBtZW1zZXQoZW5jdmlkLCAwLCBzaXplb2YoQVZDRW5jT2JqZWN0KSk7IC8qIHJlc2V0IGV2ZXJ5dGhpbmcgKi8KKworICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0luaXRpYWxpemluZzsKKworICAgIGVuY3ZpZC0+YXZjSGFuZGxlID0gYXZjSGFuZGxlOworCisgICAgZW5jdmlkLT5jb21tb24gPSAoQVZDQ29tbW9uT2JqKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNDb21tb25PYmopLCBERUZBVUxUX0FUVFIpOworICAgIGlmIChlbmN2aWQtPmNvbW1vbiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICB2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIG1lbXNldCh2aWRlbywgMCwgc2l6ZW9mKEFWQ0NvbW1vbk9iaikpOworCisgICAgLyogYWxsb2NhdGUgYml0c3RyZWFtIHN0cnVjdHVyZSAqLworICAgIGVuY3ZpZC0+Yml0c3RyZWFtID0gKEFWQ0VuY0JpdHN0cmVhbSopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDRW5jQml0c3RyZWFtKSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAoZW5jdmlkLT5iaXRzdHJlYW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIGVuY3ZpZC0+Yml0c3RyZWFtLT5lbmN2aWQgPSBlbmN2aWQ7IC8qIHRvIHBvaW50IGJhY2sgZm9yIHJlYWxsb2NhdGlvbiAqLworCisgICAgLyogYWxsb2NhdGUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBzdHJ1Y3R1cmUgKi8KKyAgICB2aWRlby0+Y3VyclNlcVBhcmFtcyA9IChBVkNTZXFQYXJhbVNldCopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDU2VxUGFyYW1TZXQpLCBERUZBVUxUX0FUVFIpOworICAgIGlmICh2aWRlby0+Y3VyclNlcVBhcmFtcyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisgICAgbWVtc2V0KHZpZGVvLT5jdXJyU2VxUGFyYW1zLCAwLCBzaXplb2YoQVZDU2VxUGFyYW1TZXQpKTsKKworICAgIC8qIGFsbG9jYXRlIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBzdHJ1Y3R1cmUgKi8KKyAgICB2aWRlby0+Y3VyclBpY1BhcmFtcyA9IChBVkNQaWNQYXJhbVNldCopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDUGljUGFyYW1TZXQpLCBERUZBVUxUX0FUVFIpOworICAgIGlmICh2aWRlby0+Y3VyclBpY1BhcmFtcyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisgICAgbWVtc2V0KHZpZGVvLT5jdXJyUGljUGFyYW1zLCAwLCBzaXplb2YoQVZDUGljUGFyYW1TZXQpKTsKKworICAgIC8qIGFsbG9jYXRlIHNsaWNlIGhlYWRlciBzdHJ1Y3R1cmUgKi8KKyAgICB2aWRlby0+c2xpY2VIZHIgPSAoQVZDU2xpY2VIZWFkZXIqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ1NsaWNlSGVhZGVyKSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAodmlkZW8tPnNsaWNlSGRyID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKyAgICBtZW1zZXQodmlkZW8tPnNsaWNlSGRyLCAwLCBzaXplb2YoQVZDU2xpY2VIZWFkZXIpKTsKKworICAgIC8qIGFsbG9jYXRlIGVuY29kZWQgcGljdHVyZSBidWZmZXIgc3RydWN0dXJlKi8KKyAgICB2aWRlby0+ZGVjUGljQnVmID0gKEFWQ0RlY1BpY0J1ZmZlciopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDRGVjUGljQnVmZmVyKSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAodmlkZW8tPmRlY1BpY0J1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisgICAgbWVtc2V0KHZpZGVvLT5kZWNQaWNCdWYsIDAsIHNpemVvZihBVkNEZWNQaWNCdWZmZXIpKTsKKworICAgIC8qIGFsbG9jYXRlIHJhdGUgY29udHJvbCBzdHJ1Y3R1cmUgKi8KKyAgICBlbmN2aWQtPnJhdGVDdHJsID0gKEFWQ1JhdGVDb250cm9sKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNSYXRlQ29udHJvbCksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+cmF0ZUN0cmwgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIG1lbXNldChlbmN2aWQtPnJhdGVDdHJsLCAwLCBzaXplb2YoQVZDUmF0ZUNvbnRyb2wpKTsKKworICAgIC8qIHJlc2V0IGZyYW1lIGxpc3QsIG5vdCByZWFsbHkgbmVlZGVkICovCisgICAgdmlkZW8tPmN1cnJQaWMgPSBOVUxMOworICAgIHZpZGVvLT5jdXJyRlMgPSBOVUxMOworICAgIGVuY3ZpZC0+Y3VycklucHV0ID0gTlVMTDsKKyAgICB2aWRlby0+cHJldlJlZlBpYyA9IE5VTEw7CisKKyAgICAvKiBub3cgcmVhZCBlbmNQYXJhbXMsIGFuZCBhbGxvY2F0ZSBkaW1lbnNpb24tZGVwZW5kZW50IHZhcmlhYmxlcyAqLworICAgIC8qIHN1Y2ggYXMgbWJsb2NrICovCisgICAgc3RhdHVzID0gU2V0RW5jb2RlUGFyYW0oYXZjSGFuZGxlLCBlbmNQYXJhbSwgZXh0U1BTLCBleHRQUFMpOyAvKiBpbml0aWFsaXplZCB2YXJpYWJsZXMgdG8gYmUgdXNlZCBpbiBTUFMqLworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGlmIChlbmNQYXJhbS0+dXNlX292ZXJydW5fYnVmZmVyID09IEFWQ19PTikKKyAgICB7CisgICAgICAgIC8qIGFsbG9jYXRlIG92ZXJydW4gYnVmZmVyICovCisgICAgICAgIGVuY3ZpZC0+b0JTaXplID0gZW5jdmlkLT5yYXRlQ3RybC0+Y3BiU2l6ZTsKKyAgICAgICAgaWYgKGVuY3ZpZC0+b0JTaXplID4gREVGQVVMVF9PVkVSUlVOX0JVRkZFUl9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBlbmN2aWQtPm9CU2l6ZSA9IERFRkFVTFRfT1ZFUlJVTl9CVUZGRVJfU0laRTsKKyAgICAgICAgfQorICAgICAgICBlbmN2aWQtPm92ZXJydW5CdWZmZXIgPSAodWludDgqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgZW5jdmlkLT5vQlNpemUsIERFRkFVTFRfQVRUUik7CisgICAgICAgIGlmIChlbmN2aWQtPm92ZXJydW5CdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlbmN2aWQtPm9CU2l6ZSA9IDA7CisgICAgICAgIGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgZnJhbWUgc2l6ZSBkZXBlbmRlbnQgc3RydWN0dXJlcyAqLworICAgIGZyYW1lc2l6ZSA9IHZpZGVvLT5GcmFtZUhlaWdodEluTWJzICogdmlkZW8tPlBpY1dpZHRoSW5NYnM7CisKKyAgICB2aWRlby0+bWJsb2NrID0gKEFWQ01hY3JvYmxvY2sqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ01hY3JvYmxvY2spICogZnJhbWVzaXplLCBERUZBVUxUX0FUVFIpOworICAgIGlmICh2aWRlby0+bWJsb2NrID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKworICAgIHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCA9IChpbnQqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKHVpbnQpICogdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzICogMiwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAodmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKworICAgIGVuY3ZpZC0+bW90MTZ4MTYgPSAoQVZDTVYqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ01WKSAqIGZyYW1lc2l6ZSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAoZW5jdmlkLT5tb3QxNngxNiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisgICAgbWVtc2V0KGVuY3ZpZC0+bW90MTZ4MTYsIDAsIHNpemVvZihBVkNNVikqZnJhbWVzaXplKTsKKworICAgIGVuY3ZpZC0+aW50cmFTZWFyY2ggPSAodWludDgqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKHVpbnQ4KSAqIGZyYW1lc2l6ZSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAoZW5jdmlkLT5pbnRyYVNlYXJjaCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICBlbmN2aWQtPm1pbl9jb3N0ID0gKGludCopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoaW50KSAqIGZyYW1lc2l6ZSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAoZW5jdmlkLT5taW5fY29zdCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIG1vdGlvbiBzZWFyY2ggcmVsYXRlZCBtZW1vcnkgKi8KKyAgICBpZiAoQVZDRU5DX1NVQ0NFU1MgIT0gSW5pdE1vdGlvblNlYXJjaE1vZHVsZShhdmNIYW5kbGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICBpZiAoQVZDRU5DX1NVQ0NFU1MgIT0gSW5pdFJhdGVDb250cm9sTW9kdWxlKGF2Y0hhbmRsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKworICAgIC8qIGludGlhbGl6ZSBmdW5jdGlvbiBwb2ludGVycyAqLworICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyID0gKEFWQ0VuY0Z1bmNQdHIqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ0VuY0Z1bmNQdHIpLCBERUZBVUxUX0FUVFIpOworICAgIGlmIChlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrID0gJkFWQ1NBRF9NYWNyb2Jsb2NrX0M7CisgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzBdID0gTlVMTDsKKyAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMV0gPSAmQVZDU0FEX01CX0hhbGZQZWxfQ3hoOworICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsyXSA9ICZBVkNTQURfTUJfSGFsZlBlbF9DeWg7CisgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzNdID0gJkFWQ1NBRF9NQl9IYWxmUGVsX0N4aHloOworCisgICAgLyogaW5pdGlhbGl6ZSB0aW1pbmcgY29udHJvbCAqLworICAgIGVuY3ZpZC0+bW9kVGltZVJlZiA9IDA7ICAgICAvKiBBTFdBWVMgQVNTVU1FIFRIQVQgVElNRVNUQU1QIFNUQVJUIEZST00gMCAhISEqLworICAgIHZpZGVvLT5wcmV2RnJhbWVOdW0gPSAwOworICAgIGVuY3ZpZC0+cHJldkNvZGVkRnJhbWVOdW0gPSAwOworICAgIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZiA9IDA7CisKKyAgICBpZiAoZW5jdmlkLT5vdXRPZkJhbmRQYXJhbVNldCA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfRW5jb2RpbmdfU1BTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19BbmFseXppbmdfRnJhbWU7CisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDRW5jR2V0TWF4T3V0cHV0U2l6ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTEvMjkvMjAwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBSZXR1cm4gbWF4IG91dHB1dCBidWZmZXIgc2l6ZSB0aGF0IGFwcHMgc2hvdWxkIGFsbG9jYXRlIGZvciAgKi8KKy8qICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jR2V0TWF4T3V0cHV0QnVmZmVyU2l6ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50KiBzaXplKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisKKyAgICBpZiAoZW5jdmlkID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX1VOSU5JVElBTElaRUQ7CisgICAgfQorCisgICAgKnNpemUgPSBlbmN2aWQtPnJhdGVDdHJsLT5jcGJTaXplOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDRW5jU2V0SW5wdXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8xOC8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUbyBmZWVkIGFuIHVuZW5jb2RlZCBvcmlnaW5hbCBmcmFtZSB0byB0aGUgZW5jb2RlciBsaWJyYXJ5LiAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNTZXRJbnB1dChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRnJhbWVJTyAqaW5wdXQpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KilhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworICAgIHVpbnQgZnJhbWVOdW07CisKKyAgICBpZiAoZW5jdmlkID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX1VOSU5JVElBTElaRUQ7CisgICAgfQorCisgICAgaWYgKGVuY3ZpZC0+ZW5jX3N0YXRlID09IEFWQ0VuY19XYWl0aW5nRm9yQnVmZmVyKQorICAgIHsKKyAgICAgICAgZ290byBSRUNBTExfSU5JVEZSQU1FOworICAgIH0KKyAgICBlbHNlIGlmIChlbmN2aWQtPmVuY19zdGF0ZSAhPSBBVkNFbmNfQW5hbHl6aW5nX0ZyYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgIH0KKworICAgIGlmIChpbnB1dC0+cGl0Y2ggPiAweEZGRkYpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7IC8vIHdlIHVzZSAyLWJ5dGVzIGZvciBwaXRjaAorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIExldCdzIHJhdGUgY29udHJvbCBkZWNpZGUgd2hldGhlciB0byBlbmNvZGUgdGhpcyBmcmFtZSBvciBub3QgKi8KKyAgICAvKiBBbHNvIHNldCB2aWRlby0+bmFsX3VuaXRfdHlwZSwgc2xpY2VIZHItPnNsaWNlX3R5cGUsIHZpZGVvLT5zbGljZV90eXBlICovCisgICAgaWYgKEFWQ0VOQ19TVUNDRVNTICE9IFJDRGV0ZXJtaW5lRnJhbWVOdW0oZW5jdmlkLCByYXRlQ3RybCwgaW5wdXQtPmNvZGluZ190aW1lc3RhbXAsICZmcmFtZU51bSkpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX1NLSVBQRURfUElDVFVSRTsgLyogbm90IHRpbWUgdG8gZW5jb2RlLCB0aHVzIHNraXBwaW5nICovCisgICAgfQorCisgICAgLyogd2UgbWF5IG5vdCBuZWVkIHRoaXMgbGluZSAqLworICAgIC8vbmV4dEZybU1vZFRpbWUgPSAodWludDMyKSgoKChmcmFtZU51bSsxKSoxMDAwKS9yYXRlQ3RybC0+ZnJhbWVfcmF0ZSkgKyBtb2RUaW1lUmVmKTsgLyogcmVjLiB0aW1lICovCisgICAgLy9lbmN2aWQtPm5leHRNb2RUaW1lID0gbmV4dEZybU1vZFRpbWUgLSAoZW5jdmlkLT5mcmFtZUludGVydmFsPj4xKSAtIDE7IC8qIGJldHdlZW4gY3VycmVudCBhbmQgbmV4dCBmcmFtZSAqLworCisgICAgZW5jdmlkLT5jdXJySW5wdXQgPSBpbnB1dDsKKyAgICBlbmN2aWQtPmN1cnJJbnB1dC0+Y29kaW5nX29yZGVyID0gZnJhbWVOdW07CisKK1JFQ0FMTF9JTklURlJBTUU6CisgICAgLyogaW5pdGlhbGl6ZSBhbmQgYW5hbHl6ZSB0aGUgZnJhbWUgKi8KKyAgICBzdGF0dXMgPSBJbml0RnJhbWUoZW5jdmlkKTsKKworICAgIGlmIChzdGF0dXMgPT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19FbmNvZGluZ19GcmFtZTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RhdHVzID09IEFWQ0VOQ19ORVdfSURSKQorICAgIHsKKyAgICAgICAgaWYgKGVuY3ZpZC0+b3V0T2ZCYW5kUGFyYW1TZXQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfRW5jb2RpbmdfRnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvLyBhc3N1bWluZyB0aGF0IGluLWJhbmQgcGFyYW1zZXQga2VlcHMgc2VuZGluZyBuZXcgU1BTIGFuZCBQUFMuCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0VuY29kaW5nX1NQUzsKKyAgICAgICAgICAgIC8vdmlkZW8tPmN1cnJTZXFQYXJhbXMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkKys7CisgICAgICAgICAgICAvL2lmKHZpZGVvLT5jdXJyU2VxUGFyYW1zLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA+IDMxKSAvLyByYW5nZSBjaGVjaworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyU2VxUGFyYW1zLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IDA7ICAvLyByZXNldAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlkZW8tPnNsaWNlSGRyLT5pZHJfcGljX2lkKys7CisgICAgICAgIGlmICh2aWRlby0+c2xpY2VIZHItPmlkcl9waWNfaWQgPiA2NTUzNSkgLy8gcmFuZ2UgY2hlY2sKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPnNsaWNlSGRyLT5pZHJfcGljX2lkID0gMDsgIC8vIHJlc2V0CisgICAgICAgIH0KKyAgICB9CisgICAgLyogdGhlIGZvbGxvd2luZyBsb2dpY3MgbmVlZCB0byBiZSByZXZpc2l0ZWQgKi8KKyAgICBlbHNlIGlmIChzdGF0dXMgPT0gQVZDRU5DX1BJQ1RVUkVfUkVBRFkpIC8vIG5vIGJ1ZmZlcnMgcmV0dXJuZWQgYmFjayB0byB0aGUgZW5jb2RlcgorICAgIHsKKyAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfV2FpdGluZ0ZvckJ1ZmZlcjsgLy8gSW5wdXQgYWNjZXB0ZWQgYnV0IGNhbid0IGNvbnRpbnVlCisgICAgICAgIC8vIG5lZWQgdG8gZnJlZSB1cCBzb21lIG1lbW9yeSBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIEVuY29kZQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7IC8vIHJldHVybiBzdGF0dXMsIGluY2x1ZGluZyB0aGUgQVZDRU5DX0ZBSUwgY2FzZSBhbmQgYWxsIDMgYWJvdmUuCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZBVkNFbmNvZGVOQUwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA0LzI5LzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFRvIGVuY29kZSBvbmUgTkFML3NsaWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY29kZU5BTChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgKmJ1Zl9uYWxfc2l6ZSwgaW50ICpuYWxfdHlwZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKWF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSA9IGVuY3ZpZC0+Yml0c3RyZWFtOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworCisgICAgaWYgKGVuY3ZpZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19VTklOSVRJQUxJWkVEOworICAgIH0KKworICAgIHN3aXRjaCAoZW5jdmlkLT5lbmNfc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEFWQ0VuY19Jbml0aWFsaXppbmc6CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1VOSU5JVElBTElaRUQ7CisgICAgICAgIGNhc2UgQVZDRW5jX0VuY29kaW5nX1NQUzoKKyAgICAgICAgICAgIC8qIGluaXRpYWxpemVkIHRoZSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIEJpdHN0cmVhbUVuY0luaXQoYml0c3RyZWFtLCBidWZmZXIsICpidWZfbmFsX3NpemUsIE5VTEwsIDApOworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKGJpdHN0cmVhbSwgOCwgKDEgPDwgNSkgfCBBVkNfTkFMVFlQRV9TUFMpOworCisgICAgICAgICAgICAvKiBlbmNvZGUgU1BTICovCisgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVTUFMoZW5jdmlkLCBiaXRzdHJlYW0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjbG9zaW5nIHRoZSBOQUwgd2l0aCB0cmFpbGluZyBiaXRzICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1UcmFpbGluZ0JpdHMoYml0c3RyZWFtLCBidWZfbmFsX3NpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19FbmNvZGluZ19QUFM7CisgICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJQaWNQYXJhbXMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gdmlkZW8tPmN1cnJTZXFQYXJhbXMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkOworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyUGljUGFyYW1zLT5waWNfcGFyYW1ldGVyX3NldF9pZCsrOworICAgICAgICAgICAgICAgICpuYWxfdHlwZSA9IEFWQ19OQUxUWVBFX1NQUzsKKyAgICAgICAgICAgICAgICAqYnVmX25hbF9zaXplID0gYml0c3RyZWFtLT53cml0ZV9wb3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVkNFbmNfRW5jb2RpbmdfUFBTOgorICAgICAgICAgICAgLyogaW5pdGlhbGl6ZWQgdGhlIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgQml0c3RyZWFtRW5jSW5pdChiaXRzdHJlYW0sIGJ1ZmZlciwgKmJ1Zl9uYWxfc2l6ZSwgTlVMTCwgMCk7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoYml0c3RyZWFtLCA4LCAoMSA8PCA1KSB8IEFWQ19OQUxUWVBFX1BQUyk7CisKKyAgICAgICAgICAgIC8qIGVuY29kZSBQUFMgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZVBQUyhlbmN2aWQsIGJpdHN0cmVhbSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNsb3NpbmcgdGhlIE5BTCB3aXRoIHRyYWlsaW5nIGJpdHMgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVRyYWlsaW5nQml0cyhiaXRzdHJlYW0sIGJ1Zl9uYWxfc2l6ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbmN2aWQtPm91dE9mQmFuZFBhcmFtU2V0ID09IFRSVUUpIC8vIGFscmVhZHkgZXh0cmFjdCBQUFMsIFNQUworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfQW5hbHl6aW5nX0ZyYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8vIFNldElucHV0IGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgU1BTIGFuZCBQUFMuCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19FbmNvZGluZ19GcmFtZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqbmFsX3R5cGUgPSBBVkNfTkFMVFlQRV9QUFM7CisgICAgICAgICAgICAgICAgKmJ1Zl9uYWxfc2l6ZSA9IGJpdHN0cmVhbS0+d3JpdGVfcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVkNFbmNfRW5jb2RpbmdfRnJhbWU6CisgICAgICAgICAgICAvKiBpbml0aWFsaXplZCB0aGUgc3RydWN0dXJlICovCisgICAgICAgICAgICBCaXRzdHJlYW1FbmNJbml0KGJpdHN0cmVhbSwgYnVmZmVyLCAqYnVmX25hbF9zaXplLCBlbmN2aWQtPm92ZXJydW5CdWZmZXIsIGVuY3ZpZC0+b0JTaXplKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhiaXRzdHJlYW0sIDgsICh2aWRlby0+bmFsX3JlZl9pZGMgPDwgNSkgfCAodmlkZW8tPm5hbF91bml0X3R5cGUpKTsKKworICAgICAgICAgICAgLyogUmUtb3JkZXIgdGhlIHJlZmVyZW5jZSBsaXN0IGFjY29yZGluZyB0byB0aGUgcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoKSAqLworICAgICAgICAgICAgLyogV2UgZG9uJ3QgaGF2ZSB0byByZW9yZGVyIHRoZSBsaXN0IGZvciB0aGUgZW5jb2RlciBoZXJlLiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUKKyAgICAgICAgICAgIGFmdGVyIHdlIGVuY29kZSB0aGlzIHNsaWNlLiBXZSBjYW4gcnVuIHRocnUgYSBzZWNvbmQtcGFzcyB0byBzZWUgaWYgbmV3IG9yZGVyaW5nCisgICAgICAgICAgICB3b3VsZCBzYXZlIG1vcmUgYml0cy4gVG9vIG11Y2ggZGVsYXkgISEgKi8KKyAgICAgICAgICAgIC8qIHN0YXR1cyA9IFJlT3JkZXJMaXN0KHZpZGVvKTsqLworICAgICAgICAgICAgc3RhdHVzID0gSW5pdFNsaWNlKGVuY3ZpZCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHdoZW4gd2UgaGF2ZSBldmVyeXRoaW5nLCB3ZSBlbmNvZGUgdGhlIHNsaWNlIGhlYWRlciAqLworICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlU2xpY2VIZWFkZXIoZW5jdmlkLCBiaXRzdHJlYW0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXMgPSBBVkNFbmNvZGVTbGljZShlbmN2aWQpOworCisgICAgICAgICAgICB2aWRlby0+c2xpY2VfaWQrKzsKKworICAgICAgICAgICAgLyogY2xvc2luZyB0aGUgTkFMIHdpdGggdHJhaWxpbmcgYml0cyAqLworICAgICAgICAgICAgQml0c3RyZWFtVHJhaWxpbmdCaXRzKGJpdHN0cmVhbSwgYnVmX25hbF9zaXplKTsKKworICAgICAgICAgICAgKmJ1Zl9uYWxfc2l6ZSA9IGJpdHN0cmVhbS0+d3JpdGVfcG9zOworCisgICAgICAgICAgICBlbmN2aWQtPnJhdGVDdHJsLT5udW1GcmFtZUJpdHMgKz0gKCgqYnVmX25hbF9zaXplKSA8PCAzKTsKKworICAgICAgICAgICAgKm5hbF90eXBlID0gdmlkZW8tPm5hbF91bml0X3R5cGU7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQVZDRU5DX1BJQ1RVUkVfUkVBRFkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUkNVcGRhdGVGcmFtZShlbmN2aWQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQVZDRU5DX1NLSVBQRURfUElDVFVSRSkgLyogc2tpcCBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEUEJSZWxlYXNlQ3VycmVudEZyYW1lKGF2Y0hhbmRsZSwgdmlkZW8pOworICAgICAgICAgICAgICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19BbmFseXppbmdfRnJhbWU7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBwZXJmb3JtIGxvb3AtZmlsdGVyaW5nIG9uIHRoZSBlbnRpcmUgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICBEZWJsb2NrUGljdHVyZSh2aWRlbyk7CisKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdGhlIG9yaWdpbmFsIGZyYW1lIGFycmF5ICovCisgICAgICAgICAgICAgICAgZW5jdmlkLT5wcmV2Q29kZWRGcmFtZU51bSA9IGVuY3ZpZC0+Y3VycklucHV0LT5jb2Rpbmdfb3JkZXI7CisKKyAgICAgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZW5jb2RlZCBwaWN0dXJlIGluIHRoZSBEUEIgYnVmZmVyICovCisgICAgICAgICAgICAgICAgU3RvcmVQaWN0dXJlSW5EUEIoYXZjSGFuZGxlLCB2aWRlbyk7CisKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJQaWMtPmlzUmVmZXJlbmNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPlByZXZSZWZGcmFtZU51bSA9IHZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBQT0MgcmVsYXRlZCB2YXJpYWJsZXMgKi8KKyAgICAgICAgICAgICAgICBQb3N0UE9DKHZpZGVvKTsKKworICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0FuYWx5emluZ19GcmFtZTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfUElDVFVSRV9SRUFEWTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfV1JPTkdfU1RBVEU7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0VuY0dldE92ZXJydW5CdWZmZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFRvIHJldHJpZXZlIHRoZSBvdmVycnVuIGJ1ZmZlci4gQ2hlY2sgd2hldGhlciBvdmVycnVuIGJ1ZmZlciAqLworLyogICAgICAgICAgICAgIGlzIHVzZWQgb3Igbm90IGJlZm9yZSByZXR1cm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBvaW50ZXIgdG8gdGhlIGludGVybmFsIG92ZXJydW4gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiB1aW50OCogUFZBVkNFbmNHZXRPdmVycnVuQnVmZmVyKEFWQ0hhbmRsZSogYXZjSGFuZGxlKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0gPSBlbmN2aWQtPmJpdHN0cmVhbTsKKworICAgIGlmIChiaXRzdHJlYW0tPm92ZXJydW5CdWZmZXIgPT0gYml0c3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIpIC8qIE9CIGlzIHVzZWQgKi8KKyAgICB7CisgICAgICAgIHJldHVybiBlbmN2aWQtPm92ZXJydW5CdWZmZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDRW5jR2V0UmVjb24oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8yOS8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUbyByZXRyaWV2ZSB0aGUgbW9zdCByZWNlbnRseSBlbmNvZGVkIGZyYW1lLiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBhc3N1bWUgdGhhdCB1c2VyIHdpbGwgbWFrZSBhIGNvcHkgaWYgdGhleSB3YW50IHRvIGhvbGQgb24gICAqLworLyogICAgICAgICAgICAgIHRvIGl0LiBPdGhlcndpc2UsIGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHJlc2VydmVkLiAgICAgICovCisvKiAgICAgICAgICAgICAgTW9zdCBhcHBsaWNhdGlvbnMgcHJlZmVyIHRvIHNlZSBvcmlnaW5hbCBmcmFtZSByYXRoZXIgdGhhbiAgKi8KKy8qICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lLiBTbywgd2UgYXJlIHN0YXlpbmcgYXdhcmUgZnJvbSBjb21wbGV4ICAqLworLyogICAgICAgICAgICAgIGJ1ZmZlcmluZyBtZWNoYW5pc20uIElmIG5lZWRlZCwgY2FuIGJlIGFkZGVkIGxhdGVyLiAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jR2V0UmVjb24oQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0ZyYW1lSU8gKnJlY29uKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0ZyYW1lU3RvcmUgKmN1cnJGUyA9IHZpZGVvLT5jdXJyRlM7CisKKyAgICBpZiAoZW5jdmlkID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX1VOSU5JVElBTElaRUQ7CisgICAgfQorCisgICAgcmVjb24tPllDYkNyWzBdID0gY3VyckZTLT5mcmFtZS5TbDsKKyAgICByZWNvbi0+WUNiQ3JbMV0gPSBjdXJyRlMtPmZyYW1lLlNjYjsKKyAgICByZWNvbi0+WUNiQ3JbMl0gPSBjdXJyRlMtPmZyYW1lLlNjcjsKKyAgICByZWNvbi0+aGVpZ2h0ID0gY3VyckZTLT5mcmFtZS5oZWlnaHQ7CisgICAgcmVjb24tPnBpdGNoID0gY3VyckZTLT5mcmFtZS5waXRjaDsKKyAgICByZWNvbi0+ZGlzcF9vcmRlciA9IGN1cnJGUy0+UGljT3JkZXJDbnQ7CisgICAgcmVjb24tPmNvZGluZ19vcmRlciA9IGN1cnJGUy0+RnJhbWVOdW07CisgICAgcmVjb24tPmlkID0gKHVpbnQzMikgY3VyckZTLT5iYXNlX2RwYjsgLyogdXNlIHRoZSBwb2ludGVyIGFzIHRoZSBpZCAqLworCisgICAgY3VyckZTLT5Jc091dHB1dHRlZCB8PSAxOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1JlbGVhc2VSZWNvbihBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRnJhbWVJTyAqcmVjb24pCit7CisgICAgT1NDTF9VTlVTRURfQVJHKGF2Y0hhbmRsZSk7CisgICAgT1NDTF9VTlVTRURfQVJHKHJlY29uKTsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsgLy9mb3Igbm93Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZBVkNDbGVhblVwRW5jb2RlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA0LzE4LzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFRvIGNsZWFuIHVwIG1lbW9yaWVzIGFsbG9jYXRlZCBieSBQVkFWQ0VuY0luaXRpYWxpemUoKSAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgdm9pZCAgICBQVkFWQ0NsZWFuVXBFbmNvZGVyKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW87CisgICAgdWludDMyICp1c2VyRGF0YSA9ICh1aW50MzIqKSBhdmNIYW5kbGUtPnVzZXJEYXRhOworCisgICAgaWYgKGVuY3ZpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgQ2xlYW5Nb3Rpb25TZWFyY2hNb2R1bGUoYXZjSGFuZGxlKTsKKworICAgICAgICBDbGVhbnVwUmF0ZUNvbnRyb2xNb2R1bGUoYXZjSGFuZGxlKTsKKworICAgICAgICBpZiAoZW5jdmlkLT5mdW5jdGlvblBvaW50ZXIgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmN2aWQtPm1pbl9jb3N0KQorICAgICAgICB7CisgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpZW5jdmlkLT5taW5fY29zdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jdmlkLT5pbnRyYVNlYXJjaCkKKyAgICAgICAgeworICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZC0+aW50cmFTZWFyY2gpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuY3ZpZC0+bW90MTZ4MTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQtPm1vdDE2eDE2KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmN2aWQtPnJhdGVDdHJsKQorICAgICAgICB7CisgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpZW5jdmlkLT5yYXRlQ3RybCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jdmlkLT5vdmVycnVuQnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpZW5jdmlkLT5vdmVycnVuQnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgICAgIGlmICh2aWRlbyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5tYmxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPm1ibG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlkZW8tPmRlY1BpY0J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsZWFuVXBEUEIoYXZjSGFuZGxlLCB2aWRlbyk7CisgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KXZpZGVvLT5kZWNQaWNCdWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5zbGljZUhkciAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+c2xpY2VIZHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyUGljUGFyYW1zICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyUGljUGFyYW1zLT5zbGljZV9ncm91cF9pZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+Y3VyclBpY1BhcmFtcy0+c2xpY2VfZ3JvdXBfaWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+Y3VyclBpY1BhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJTZXFQYXJhbXMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPmN1cnJTZXFQYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVuY3ZpZC0+Yml0c3RyZWFtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZC0+Yml0c3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlbyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpZW5jdmlkKTsKKworICAgICAgICBhdmNIYW5kbGUtPkFWQ09iamVjdCA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVCaXRSYXRlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCB1aW50MzIgYml0cmF0ZSkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoYXZjSGFuZGxlKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcoYml0cmF0ZSk7CisKKyAgICByZXR1cm4gQVZDRU5DX0ZBSUw7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlRnJhbWVSYXRlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCB1aW50MzIgbnVtLCB1aW50MzIgZGVub20pCit7CisgICAgT1NDTF9VTlVTRURfQVJHKGF2Y0hhbmRsZSk7CisgICAgT1NDTF9VTlVTRURfQVJHKG51bSk7CisgICAgT1NDTF9VTlVTRURfQVJHKGRlbm9tKTsKKworICAgIHJldHVybiBBVkNFTkNfRkFJTDsKK30KKworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVJRFJJbnRlcnZhbChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50IElEUkludGVydmFsKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhhdmNIYW5kbGUpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhJRFJJbnRlcnZhbCk7CisKKyAgICByZXR1cm4gQVZDRU5DX0ZBSUw7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jSURSUmVxdWVzdChBVkNIYW5kbGUgKmF2Y0hhbmRsZSkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoYXZjSGFuZGxlKTsKKworICAgIHJldHVybiBBVkNFTkNfRkFJTDsKK30KKworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVJTUJSZWZyZXNoKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBpbnQgbnVtTUIpCit7CisgICAgT1NDTF9VTlVTRURfQVJHKGF2Y0hhbmRsZSk7CisgICAgT1NDTF9VTlVTRURfQVJHKG51bU1CKTsKKworICAgIHJldHVybiBBVkNFTkNfRkFJTDsKK30KKwordm9pZCBQVkFWQ0VuY0dldEZyYW1lU3RhdHMoQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0VuY0ZyYW1lU3RhdHMgKmF2Y1N0YXRzKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisKKyAgICBhdmNTdGF0cy0+YXZnRnJhbWVRUCA9IEdldEF2Z0ZyYW1lUVAocmF0ZUN0cmwpOworICAgIGF2Y1N0YXRzLT5udW1JbnRyYU1CcyA9IGVuY3ZpZC0+bnVtSW50cmFNQjsKKworICAgIHJldHVybiA7Cit9CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQxZWMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19hcGkuaApAQCAtMCwwICsxLDMyMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKgorVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGZ1bmN0aW9uIGludGVyZmFjZXMgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkKK2FuZCBuZWNlc3NhcnkgdHlwZSBkZWZpdGlvbml0aW9ucyBhbmQgZW51bWVyYXRpb25zLgorQHB1Ymxpc2hlZEFsbAorKi8KKworI2lmbmRlZiBBVkNFTkNfQVBJX0hfSU5DTFVERUQKKyNkZWZpbmUgQVZDRU5DX0FQSV9IX0lOQ0xVREVECisKKyNpZm5kZWYgQVZDQVBJX0NPTU1PTl9IX0lOQ0xVREVECisjaW5jbHVkZSAiYXZjYXBpX2NvbW1vbi5oIgorI2VuZGlmCisKKy8vIEZvciBtZW1zZXQsIGV0YworI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioKKyBUaGlzIGVudW1lcmF0aW9uIGlzIHVzZWQgZm9yIHRoZSBzdGF0dXMgcmV0dXJuZWQgZnJvbSB0aGUgbGlicmFyeSBpbnRlcmZhY2UuCisqLwordHlwZWRlZiBlbnVtCit7CisgICAgLyoqCisgICAgRmFpbCBpbmZvcm1hdGlvbiwgbmVlZCB0byBhZGQgbW9yZSBlcnJvciBjb2RlIGZvciBtb3JlIHNwZWNpZmljIGluZm8KKyAgICAqLworICAgIEFWQ0VOQ19UUkFJTElOR09ORVNfRkFJTCA9IC0zNSwKKyAgICBBVkNFTkNfU0xJQ0VfRU1QVFkgPSAtMzQsCisgICAgQVZDRU5DX1BPQ19GQUlMID0gLTMzLAorICAgIEFWQ0VOQ19DT05TRUNVVElWRV9OT05SRUYgPSAtMzIsCisgICAgQVZDRU5DX0NBQkFDX0ZBSUwgPSAtMzEsCisgICAgQVZDRU5DX1BSRURfV0VJR0hUX1RBQl9GQUlMID0gLTMwLAorICAgIEFWQ0VOQ19ERUNfUkVGX1BJQ19NQVJLX0ZBSUwgPSAtMjksCisgICAgQVZDRU5DX1NQU19GQUlMID0gLTI4LAorICAgIEFWQ0VOQ19CSVRTVFJFQU1fQlVGRkVSX0ZVTEwgICAgPSAtMjcsCisgICAgQVZDRU5DX0JJVFNUUkVBTV9JTklUX0ZBSUwgPSAtMjYsCisgICAgQVZDRU5DX0NIUk9NQV9RUF9GQUlMID0gLTI1LAorICAgIEFWQ0VOQ19JTklUX1FTX0ZBSUwgPSAtMjQsCisgICAgQVZDRU5DX0lOSVRfUVBfRkFJTCA9IC0yMywKKyAgICBBVkNFTkNfV0VJR0hURURfQklQUkVEX0ZBSUwgPSAtMjIsCisgICAgQVZDRU5DX0lOVkFMSURfSU5UUkFfUEVSSU9EID0gLTIxLAorICAgIEFWQ0VOQ19JTlZBTElEX0NIQU5HRV9SQVRFID0gLTIwLAorICAgIEFWQ0VOQ19JTlZBTElEX0JFVEFfT0ZGU0VUID0gLTE5LAorICAgIEFWQ0VOQ19JTlZBTElEX0FMUEhBX09GRlNFVCA9IC0xOCwKKyAgICBBVkNFTkNfSU5WQUxJRF9ERUJMT0NLX0lEQyA9IC0xNywKKyAgICBBVkNFTkNfSU5WQUxJRF9SRURVTkRBTlRfUElDID0gLTE2LAorICAgIEFWQ0VOQ19JTlZBTElEX0ZSQU1FUkFURSA9IC0xNSwKKyAgICBBVkNFTkNfSU5WQUxJRF9OVU1fU0xJQ0VHUk9VUCA9IC0xNCwKKyAgICBBVkNFTkNfSU5WQUxJRF9QT0NfTFNCID0gLTEzLAorICAgIEFWQ0VOQ19JTlZBTElEX05VTV9SRUYgPSAtMTIsCisgICAgQVZDRU5DX0lOVkFMSURfRk1PX1RZUEUgPSAtMTEsCisgICAgQVZDRU5DX0VOQ1BBUkFNX01FTV9GQUlMID0gLTEwLAorICAgIEFWQ0VOQ19MRVZFTF9OT1RfU1VQUE9SVEVEID0gLTksCisgICAgQVZDRU5DX0xFVkVMX0ZBSUwgPSAtOCwKKyAgICBBVkNFTkNfUFJPRklMRV9OT1RfU1VQUE9SVEVEID0gLTcsCisgICAgQVZDRU5DX1RPT0xTX05PVF9TVVBQT1JURUQgPSAtNiwKKyAgICBBVkNFTkNfV1JPTkdfU1RBVEUgPSAtNSwKKyAgICBBVkNFTkNfVU5JTklUSUFMSVpFRCA9IC00LAorICAgIEFWQ0VOQ19BTFJFQURZX0lOSVRJQUxJWkVEID0gLTMsCisgICAgQVZDRU5DX05PVF9TVVBQT1JURUQgPSAtMiwKKyAgICBBVkNFTkNfTUVNT1JZX0ZBSUwgPSBBVkNfTUVNT1JZX0ZBSUwsCisgICAgQVZDRU5DX0ZBSUwgPSBBVkNfRkFJTCwKKyAgICAvKioKKyAgICBHZW5lcmljIHN1Y2Nlc3MgdmFsdWUKKyAgICAqLworICAgIEFWQ0VOQ19TVUNDRVNTID0gQVZDX1NVQ0NFU1MsCisgICAgQVZDRU5DX1BJQ1RVUkVfUkVBRFkgPSAyLAorICAgIEFWQ0VOQ19ORVdfSURSID0gMywgLyogdXBvbiBnZXR0aW5nIHRoaXMsIHVzZXJzIGhhdmUgdG8gY2FsbCBQVkFWQ0VuY29kZVNQUyBhbmQgUFZBVkNFbmNvZGVQUFMgdG8gZ2V0IGEgbmV3IFNQUyBhbmQgUFBTKi8KKyAgICBBVkNFTkNfU0tJUFBFRF9QSUNUVVJFID0gNCAvKiBjb250aW51YWJsZSBlcnJvciBtZXNzYWdlICovCisKK30gQVZDRW5jX1N0YXR1czsKKworI2RlZmluZSBNQVhfTlVNX1NMSUNFX0dST1VQICA4ICAgICAgLyogbWF4aW11bSBmb3IgYWxsIHRoZSBwcm9maWxlcyAqLworCisvKioKK1RoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzLgorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0FWQ0VuY1BhcmFtCit7CisgICAgLyogaWYgcHJvZmlsZS9sZXZlbCBpcyBzZXQgdG8gemVybywgZW5jb2RlciB3aWxsIGNob29zZSB0aGUgY2xvc2VzdCBvbmUgZm9yIHlvdSAqLworICAgIEFWQ1Byb2ZpbGUgcHJvZmlsZTsgLyogcHJvZmlsZSBvZiB0aGUgYml0c3RyZWFtIHRvIGJlIGNvbXBsaWFudCB3aXRoKi8KKyAgICBBVkNMZXZlbCAgIGxldmVsOyAgIC8qIGxldmVsIG9mIHRoZSBiaXRzdHJlYW0gdG8gYmUgY29tcGxpYW50IHdpdGgqLworCisgICAgaW50IHdpZHRoOyAgICAgIC8qIHdpZHRoIG9mIGFuIGlucHV0IGZyYW1lIGluIHBpeGVsICovCisgICAgaW50IGhlaWdodDsgICAgIC8qIGhlaWdodCBvZiBhbiBpbnB1dCBmcmFtZSBpbiBwaXhlbCAqLworCisgICAgaW50IHBvY190eXBlOyAvKiBwaWN0dXJlIG9yZGVyIGNvdW50IG1vZGUsIDAsMSBvciAyICovCisgICAgLyogZm9yIHBvY190eXBlID09IDAgKi8KKyAgICB1aW50IGxvZzJfbWF4X3BvY19sc2JfbWludXNfNDsgLyogc3BlY2lmeSBtYXhpbXVtIHZhbHVlIG9mIFBPQyBMc2IsIHJhbmdlIDAuLjEyKi8KKyAgICAvKiBmb3IgcG9jX3R5cGUgPT0gMSAqLworICAgIHVpbnQgZGVsdGFfcG9jX3plcm9fZmxhZzsgLyogZGVsdGEgUE9DIGFsd2F5cyB6ZXJvICovCisgICAgaW50IG9mZnNldF9wb2Nfbm9uX3JlZjsgLyogb2Zmc2V0IGZvciBub24tcmVmZXJlbmNlIHBpYyAqLworICAgIGludCBvZmZzZXRfdG9wX2JvdHRvbTsgLyogb2Zmc2V0IGJldHdlZW4gdG9wIGFuZCBib3R0b20gZmllbGQgKi8KKyAgICB1aW50IG51bV9yZWZfaW5fY3ljbGU7IC8qIG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWUgaW4gb25lIGN5Y2xlICovCisgICAgaW50ICpvZmZzZXRfcG9jX3JlZjsgLyogYXJyYXkgb2Ygb2Zmc2V0IGZvciByZWYgcGljLCBkaW1lbnNpb24gW251bV9yZWZfaW5fY3ljbGVdICovCisKKyAgICBpbnQgbnVtX3JlZl9mcmFtZTsgIC8qIG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWUgdXNlZCAqLworICAgIGludCBudW1fc2xpY2VfZ3JvdXA7ICAvKiBudW1iZXIgb2Ygc2xpY2UgZ3JvdXAgKi8KKyAgICBpbnQgZm1vX3R5cGU7ICAgLyogMDogaW50ZXJsZWF2ZSwgMTogZGlzcGVyc2VkLCAyOiBmb3JlZ3JvdW5kIHdpdGggbGVmdC1vdmVyCisgICAgICAgICAgICAgICAgICAgIDM6IGJveC1vdXQsIDQ6cmFzdGVyIHNjYW4sIDU6d2lwZSwgNjpleHBsaWNpdCAqLworICAgIC8qIGZvciBmbW9fdHlwZSA9PSAwICovCisgICAgdWludCBydW5fbGVuZ3RoX21pbnVzMVtNQVhfTlVNX1NMSUNFX0dST1VQXTsgICAvKiBhcnJheSBvZiBzaXplIG51bV9zbGljZV9ncm91cCwgaW4gcm91bmQgcm9iaW4gZmFzaW9uICovCisgICAgLyogZm1vX3R5cGUgPT0gMiovCisgICAgdWludCB0b3BfbGVmdFtNQVhfTlVNX1NMSUNFX0dST1VQLTFdOyAgICAgICAgICAgLyogYXJyYXkgb2YgY28tb3JkaW5hdGVzIG9mIGVhY2ggc2xpY2VfZ3JvdXAgKi8KKyAgICB1aW50IGJvdHRvbV9yaWdodFtNQVhfTlVNX1NMSUNFX0dST1VQLTFdOyAgICAgICAvKiBleGNlcHQgdGhlIGxhc3Qgb25lIHdoaWNoIGlzIHRoZSBiYWNrZ3JvdW5kLiAqLworICAgIC8qIGZtb190eXBlID09IDMsNCw1ICovCisgICAgQVZDRmxhZyBjaGFuZ2VfZGlyX2ZsYWc7ICAvKiBzbGljZSBncm91cCBjaGFuZ2UgZGlyZWN0aW9uIGZsYWcgKi8KKyAgICB1aW50IGNoYW5nZV9yYXRlX21pbnVzMTsKKyAgICAvKiBmbW9fdHlwZSA9PSA2ICovCisgICAgdWludCAqc2xpY2VfZ3JvdXA7IC8qIGFycmF5IG9mIHNpemUgTUJXaWR0aCpNQkhlaWdodCAqLworCisgICAgQVZDRmxhZyBkYl9maWx0ZXI7ICAvKiBlbmFibGUgZGVibG9ja2luZyBsb29wIGZpbHRlciAqLworICAgIGludCBkaXNhYmxlX2RiX2lkYzsgIC8qIDA6IGZpbHRlciBldmVyeXdoZXJlLCAxOiBubyBmaWx0ZXIsIDI6IG5vIGZpbHRlciBhY3Jvc3Mgc2xpY2UgYm91bmRhcnkgKi8KKyAgICBpbnQgYWxwaGFfb2Zmc2V0OyAgIC8qIGFscGhhIG9mZnNldCByYW5nZSAtNiwuLi4sNiAqLworICAgIGludCBiZXRhX29mZnNldDsgICAgLyogYmV0YSBvZmZzZXQgcmFuZ2UgLTYsLi4uLDYgKi8KKworICAgIEFWQ0ZsYWcgY29uc3RyYWluZWRfaW50cmFfcHJlZDsgLyogY29uc3RyYWluZWQgaW50cmEgcHJlZGljdGlvbiBmbGFnICovCisKKyAgICBBVkNGbGFnIGF1dG9fc2NkOyAgIC8qIHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24gb24gb3Igb2ZmICovCisgICAgaW50IGlkcl9wZXJpb2Q7IC8qIGlkciBmcmFtZSByZWZyZXNoIHJhdGUgaW4gbnVtYmVyIG9mIHRhcmdldCBlbmNvZGVkIGZyYW1lIChubyBjb25jZXB0IG9mIGFjdHVhbCB0aW1lKS4qLworICAgIGludCBpbnRyYW1iX3JlZnJlc2g7ICAgIC8qIG1pbmltdW0gbnVtYmVyIG9mIGludHJhIE1CIHBlciBmcmFtZSAqLworICAgIEFWQ0ZsYWcgZGF0YV9wYXI7ICAgLyogZW5hYmxlIGRhdGEgcGFydGl0aW9uaW5nICovCisKKyAgICBBVkNGbGFnIGZ1bGxzZWFyY2g7IC8qIGVuYWJsZSBmdWxsLXBlbCBmdWxsLXNlYXJjaCBtb2RlICovCisgICAgaW50IHNlYXJjaF9yYW5nZTsgICAvKiBzZWFyY2ggcmFuZ2UgZm9yIG1vdGlvbiB2ZWN0b3IgaW4gKC1zZWFyY2hfcmFuZ2UsK3NlYXJjaF9yYW5nZSkgcGl4ZWxzICovCisgICAgQVZDRmxhZyBzdWJfcGVsOyAgICAvKiBlbmFibGUgc3ViIHBlbCBwcmVkaWN0aW9uICovCisgICAgQVZDRmxhZyBzdWJtYl9wcmVkOyAvKiBlbmFibGUgc3ViIE1CIHBhcnRpdGlvbiBtb2RlICovCisgICAgQVZDRmxhZyByZG9wdF9tb2RlOyAvKiBSRCBvcHRpbWFsIG1vZGUgc2VsZWN0aW9uICovCisgICAgQVZDRmxhZyBiaWRpcl9wcmVkOyAvKiBlbmFibGUgYmktZGlyZWN0aW9uYWwgZm9yIEItc2xpY2UsIHRoaXMgZmxhZyBmb3JjZXMgdGhlIGVuY29kZXIgdG8gZW5jb2RlCisgICAgICAgICAgICAgICAgICAgICAgICBhbnkgZnJhbWUgd2l0aCBQT0MgbGVzcyB0aGFuIHRoZSBwcmV2aW91c2x5IGVuY29kZWQgZnJhbWUgYXMgYSBCLWZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgSWYgaXQncyBvZmYsIHRoZW4gc3VjaCBmcmFtZXMgd2lsbCByZW1haW4gUC1mcmFtZS4gKi8KKworICAgIEFWQ0ZsYWcgcmF0ZV9jb250cm9sOyAvKiByYXRlIGNvbnRyb2wgZW5hYmxlLCBvbjogUkMgb24sIG9mZjogY29uc3RhbnQgUVAgKi8KKyAgICBpbnQgaW5pdFFQOyAgICAgLyogaW5pdGlhbCBRUCAqLworICAgIHVpbnQzMiBiaXRyYXRlOyAgICAvKiB0YXJnZXQgZW5jb2RpbmcgYml0IHJhdGUgaW4gYml0cy9zZWNvbmQgKi8KKyAgICB1aW50MzIgQ1BCX3NpemU7ICAvKiBjb2RlZCBwaWN0dXJlIGJ1ZmZlciBpbiBudW1iZXIgb2YgYml0cyAqLworICAgIHVpbnQzMiBpbml0X0NCUF9yZW1vdmFsX2RlbGF5OyAvKiBpbml0aWFsIENCUCByZW1vdmFsIGRlbGF5IGluIG1zZWMgKi8KKworICAgIHVpbnQzMiBmcmFtZV9yYXRlOyAgLyogZnJhbWUgcmF0ZSBpbiB0aGUgdW5pdCBvZiBmcmFtZXMgcGVyIDEwMDAgc2Vjb25kICovCisgICAgLyogbm90ZSwgZnJhbWUgcmF0ZSBpcyBvbmx5IG5lZWRlZCBieSB0aGUgcmF0ZSBjb250cm9sLCBBVkMgaXMgdGltZXN0YW1wIGFnbm9zdGljLiAqLworCisgICAgQVZDRmxhZyBvdXRfb2ZfYmFuZF9wYXJhbV9zZXQ7IC8qIGZsYWcgdG8gc2V0IHdoZXRoZXIgcGFyYW0gc2V0cyBhcmUgdG8gYmUgcmV0cmlldmVkIHVwIGZyb250IG9yIG5vdCAqLworCisgICAgQVZDRmxhZyB1c2Vfb3ZlcnJ1bl9idWZmZXI7ICAvKiBkbyBub3QgdGhyb3cgYXdheSB0aGUgZnJhbWUgaWYgb3V0cHV0IGJ1ZmZlciBpcyBub3QgYmlnIGVub3VnaC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgZXhjZXNzIGJpdHMgdG8gdGhlIG92ZXJydW4gYnVmZmVyICovCit9IEFWQ0VuY1BhcmFtczsKKworCisvKioKK1RoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGN1cnJlbnQgZnJhbWUgZW5jb2Rpbmcgc3RhdGlzdGljcyBmb3IgZGVidWdnaW5nIHB1cnBvc2UuCisqLwordHlwZWRlZiBzdHJ1Y3QgdGFnQVZDRW5jRnJhbWVTdGF0cworeworICAgIGludCBhdmdGcmFtZVFQOyAgIC8qIGF2ZXJhZ2UgZnJhbWUgUVAgKi8KKyAgICBpbnQgbnVtSW50cmFNQnM7ICAvKiBudW1iZXIgb2YgaW50cmEgTUJzICovCisgICAgaW50IG51bUZhbHNlQWxhcm07CisgICAgaW50IG51bU1pc0RldGVjdGVkOworICAgIGludCBudW1EZXRlY3RlZDsKKworfSBBVkNFbmNGcmFtZVN0YXRzOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorICAgIC8qKiBUSEUgRk9MTE9XSU5HUyBBUkUgQVBJUyAqLworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGVuY29kZXIgbGlicmFyeS4gSXQgdmVyaWZpZXMgdGhlIHZhbGlkaXR5IG9mIHRoZQorICAgIGVuY29kaW5nIHBhcmFtZXRlcnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHByb2ZpbGUvbGV2ZWwgYW5kIHRoZSBsaXN0IG9mIHN1cHBvcnRlZAorICAgIHRvb2xzIGJ5IHRoaXMgbGlicmFyeS4gSXQgYWxsb2NhdGVzIG5lY2Vzc2FyeSBtZW1vcmllcyByZXF1aXJlZCB0byBwZXJmb3JtIGVuY29kaW5nLgorICAgIEZvciByZS1lbmNvZGluZyBhcHBsaWNhdGlvbiwgaWYgdXNlcnMgd2FudCB0byBzZXR1cCBlbmNvZGVyIGluIGEgbW9yZSBwcmVjaXNlIHdheSwKKyAgICB1c2VycyBjYW4gZ2l2ZSB0aGUgZXh0ZXJuYWwgU1BTIGFuZCBQUFMgdG8gdGhlIGVuY29kZXIgdG8gZm9sbG93LgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIkhhbmRsZSB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeSBvYmplY3QuIgorICAgIFxwYXJhbSAiZW5jUGFyYW0iICAgIlBvaW50ZXIgdG8gdGhlIGVuY29kaW5nIHBhcmFtZXRlciBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiZXh0U1BTIiAgICAgIkV4dGVybmFsIFNQUyB1c2VkIGZvciByZS1lbmNvZGluZyBwdXJwb3NlLiBOVUxMIGlmIG5vdCBwcmVzZW50IgorICAgIFxwYXJhbSAiZXh0UFBTIiAgICAgIkV4dGVybmFsIFBQUyB1c2VkIGZvciByZS1lbmNvZGluZyBwdXJwb3NlLiBOVUxMIGlmIG5vdCBwcmVzZW50IgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLAorICAgICAgICAgICAgIEFWQ0VOQ19OT1RfU1VQUE9SVEVEIGZvciB0aGUgdXNlIG9mIHVuc3VwcG9ydGVkIHRvb2xzLAorICAgICAgICAgICAgIEFWQ0VOQ19NRU1PUllfRkFJTCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwKKyAgICAgICAgICAgICBBVkNFTkNfRkFJTCBmb3IgZ2VuZXJpYyBmYWlsdXJlLiIKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jSW5pdGlhbGl6ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRW5jUGFyYW1zICplbmNQYXJhbSwgdm9pZCogZXh0U1BTLCB2b2lkKiBleHRQUFMpOworCisKKyAgICAvKioKKyAgICBTaW5jZSB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplIGlzIG5vdCBrbm93biBwcmlvciB0byBlbmNvZGluZyBhIGZyYW1lLCB1c2VycyBuZWVkIHRvCisgICAgYWxsb2NhdGUgYmlnIGVub3VnaCBidWZmZXIgb3RoZXJ3aXNlLCB0aGF0IGZyYW1lIHdpbGwgYmUgZHJvcHBlZC4gVGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIgdG8gYmUgYWxsb2NhdGVkIGJ5IHRoZSB1c2VycyB0aGF0IGd1YXJhbnRlZXMgdG8gaG9sZCBvbmUgZnJhbWUuCisgICAgSXQgZm9sbG93cyB0aGUgQ1BCIHNwZWMgZm9yIGEgcGFydGljdWxhciBsZXZlbC4gIEhvd2V2ZXIsIHdoZW4gdGhlIHVzZXJzIHNldCB1c2Vfb3ZlcnJ1bl9idWZmZXIKKyAgICBmbGFnLCB0aGlzIEFQSSBpcyB1c2VsZXNzIGFzIGV4Y2VzcyBvdXRwdXQgYml0cyBhcmUgc2F2ZWQgaW4gdGhlIG92ZXJydW4gYnVmZmVyIHdhaXRpbmcgdG8gYmUKKyAgICBjb3BpZWQgb3V0IGluIHNtYWxsIGNodW5rcywgaS5lLiB1c2VycyBjYW4gYWxsb2NhdGUgYW55IHNpemUgb2Ygb3V0cHV0IGJ1ZmZlci4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKKyAgICBccGFyYW0gInNpemUiICAgIlBvaW50ZXIgdG8gdGhlIHNpemUgdG8gYmUgbW9kaWZpZWQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLCBBVkNFTkNfVU5JTklUSUFMSVpFRCB3aGVuIGxldmVsIGlzIG5vdCBrbm93bi4KKyAgICAqLworCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNHZXRNYXhPdXRwdXRCdWZmZXJTaXplKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBpbnQqIHNpemUpOworCisgICAgLyoqCisgICAgVXNlcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHByb3ZpZGUgYW4gaW5wdXQgc3RydWN0dXJlIHRvIHRoZSBlbmNvZGVyIGxpYnJhcnkgd2hpY2ggd2lsbCBrZWVwCisgICAgYSBsaXN0IG9mIGlucHV0IHN0cnVjdHVyZXMgaXQgcmVjZWl2ZXMgaW4gY2FzZSB0aGUgdXNlcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIG1hbnkgdGltZSBiZWZvcmUKKyAgICBjYWxsaW5nIFBWQVZDRW5jb2RlU2xpY2UuIFRoZSBlbmNvZGVyIGxpYnJhcnkgd2lsbCBlbmNvZGUgdGhlbSBhY2NvcmRpbmcgdG8gdGhlIGZyYW1lX251bSBvcmRlci4KKyAgICBVc2VycyBzaG91bGQgbm90IG1vZGlmeSB0aGUgY29udGVudCBvZiBhIHBhcnRpY3VsYXIgZnJhbWUgdW50aWwgdGhpcyBmcmFtZSBpcyBlbmNvZGVkIGFuZAorICAgIHJldHVybmVkIHRocnUgQ0JBVkNFbmNfUmV0dXJuSW5wdXQoKSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKKyAgICBccGFyYW0gImlucHV0IiAgICAgICJQb2ludGVyIHRvIHRoZSBpbnB1dCBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLAorICAgICAgICAgICAgQVZDRU5DX0ZBSUwgaWYgdGhlIGVuY29kZXIgaXMgbm90IGluIHRoZSByaWdodCBzdGF0ZSB0byB0YWtlIGEgbmV3IGlucHV0IGZyYW1lLgorICAgICAgICAgICAgQVZDRU5DX05FV19JRFIgZm9yIHRoZSBkZXRlY3Rpb24gb3IgZGV0ZXJtaW5hdGlvbiBvZiBhIG5ldyBJRFIsIHdpdGggdGhpcyBzdGF0dXMsCisgICAgICAgICAgICB0aGUgcmV0dXJuZWQgTkFMIGlzIGFuIFNQUyBOQUwsCisgICAgICAgICAgICBBVkNFTkNfTk9fUElDVFVSRSBpZiB0aGUgaW5wdXQgZnJhbWUgY29kaW5nIHRpbWVzdGFtcCBpcyB0b28gZWFybHksIHVzZXJzIG11c3QKKyAgICAgICAgICAgIGdldCBuZXh0IGZyYW1lIG9yIGFkanVzdCB0aGUgY29kaW5nIHRpbWVzdGFtcC4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1NldElucHV0KEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNGcmFtZUlPICppbnB1dCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBlbmNvZGUgYSBOQUwgdW5pdCB3aGljaCBjYW4gYmUgYW4gU1BTIE5BTCwgYSBQUFMgTkFMIG9yCisgICAgYSBWQ0wgKHZpZGVvIGNvZGluZyBsYXllcikgTkFMIHdoaWNoIGNvbnRhaW5zIG9uZSBzbGljZSBvZiBkYXRhLiBJdCBjb3VsZCBiZSBhCisgICAgZml4ZWQgbnVtYmVyIG9mIG1hY3JvYmxvY2tzLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGVuY29kZXIgcGFyYW1ldGVycyBzZXQsIG9yIHRoZQorICAgIG1heGltdW0gbnVtYmVyIG9mIG1hY3JvYmxvY2tzIGZpdHRlZCBpbnRvIHRoZSBnaXZlbiBpbnB1dCBhcmd1bWVudCAiYnVmZmVyIi4gVGhlCisgICAgaW5wdXQgZnJhbWUgaXMgdGFrZW4gZnJvbSB0aGUgb2xkZXN0IHVuZW5jb2RlZCBpbnB1dCBmcmFtZSByZXRyaWV2ZWQgYnkgdXNlcnMgYnkKKyAgICBQVkFWQ0VuY0dldElucHV0IEFQSS4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKKyAgICBccGFyYW0gImJ1ZmZlciIgICAgICJQb2ludGVyIHRvIHRoZSBvdXRwdXQgQVZDIGJpdHN0cmVhbSBidWZmZXIsIHRoZSBmb3JtYXQgd2lsbCBiZSBFQlNQLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBSQlNQLiIKKyAgICBccGFyYW0gImJ1Zl9uYWxfc2l6ZSIgICAiQXMgaW5wdXQsIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBwaHlzaWNhbCBsaW1pdGF0aW9uIG9mIHRoZSBidWZmZXIuIEFzIG91dHB1dCwgdGhlIHNpemUgb2YgdGhlIEVCU1AuIgorICAgIFxwYXJhbSAibmFsX3R5cGUiICAgIlBvaW50ZXIgdG8gdGhlIE5BTCB0eXBlIG9mIHRoZSByZXR1cm5lZCBidWZmZXIuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9mIGVuY29kaW5nIG9uZSBzbGljZSwKKyAgICAgICAgICAgICBBVkNFTkNfUElDVFVSRV9SRUFEWSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgYSBmcmFtZSBlbmNvZGluZywKKyAgICAgICAgICAgICBBVkNFTkNfRkFJTCBmb3IgZmFpbHVyZSAodGhpcyBzaG91bGQgbm90IG9jY3VyLCB0aG91Z2gpLiIKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jb2RlTkFMKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCB1aW50OCAqYnVmZmVyLCB1aW50ICpidWZfbmFsX3NpemUsIGludCAqbmFsX3R5cGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBzbmlmZnMgdGhlIG5hbF91bml0X3R5cGUgc3VjaCB0aGF0IHVzZXJzIGNhbiBjYWxsIGNvcnJlc3BvbmRpbmcgQVBJcy4KKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBQVkFWQ0RlY0dldE5BTFR5cGUoKSBpbiB0aGUgZGVjb2Rlci4KKyAgICBccGFyYW0gImJpdHN0cmVhbSIgICJQb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBOQUwgdW5pdCAoc3RhcnQgd2l0aCBmb3JiaWRkZW5femVyb19iaXQsIGV0Yy4pLiIKKyAgICBccGFyYW0gInNpemUiICAgICAgICJzaXplIG9mIHRoZSBiaXRzdHJlYW0gKE51bUJ5dGVzSW5OQUx1bml0ICsgMSkuIgorICAgIFxwYXJhbSAibmFsX3VuaXRfdHlwZSIgIlBvaW50ZXIgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBuYWwgdW5pdCB0eXBlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLCBBVkNFTkNfRkFJTCBvdGhlcndpc2UuIgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNHZXROQUxUeXBlKHVpbnQ4ICpiaXRzdHJlYW0sIGludCBzaXplLCBpbnQgKm5hbF90eXBlLCBpbnQgKm5hbF9yZWZfaWRjKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcG9pbnRlciB0byBpbnRlcm5hbCBvdmVycnVuIGJ1ZmZlci4gVXNlcnMgY2FuIGNhbGwgdGhpcyB0byBxdWVyeQorICAgIHdoZXRoZXIgdGhlIG92ZXJydW4gYnVmZmVyIGhhcyBiZWVuIHVzZWQgdG8gZW5jb2RlIHRoZSBjdXJyZW50IE5BTC4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJQb2ludGVyIHRvIHRoZSBoYW5kbGUuIgorICAgIFxyZXR1cm4gIlBvaW50ZXIgdG8gb3ZlcnJ1biBidWZmZXIgaWYgaXQgaXMgdXNlZCwgb3RoZXJ3aXNlLCBOVUxMLiIKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiB1aW50OCogUFZBVkNFbmNHZXRPdmVycnVuQnVmZmVyKEFWQ0hhbmRsZSogYXZjSGFuZGxlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBvZiB0aGUgbW9zdCByZWNlbnRseSBlbmNvZGVkIGZyYW1lLgorICAgIE5vdGUgdGhhdCB0aGlzIGZyYW1lIGlzIG5vdCByZXR1cm5lZCB0byB0aGUgdXNlcnMgeWV0LiBVc2VycyBzaG91bGQgb25seSByZWFkIHRoZQorICAgIGNvbnRlbnQgb2YgdGhpcyBmcmFtZS4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKKyAgICBccGFyYW0gIm91dHB1dCIgICAgICJQb2ludGVyIHRvIHRoZSBpbnB1dCBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLCBBVkNFTkNfTk9fUElDVFVSRSBpZiBubyBwaWN0dXJlIHRvIGJlIG91dHB1dHRlZC4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0dldFJlY29uKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNGcmFtZUlPICpyZWNvbik7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSByZWNvbnRydWN0ZWQgZnJhbWUgYmFjayB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeQorICAgIGluIG9yZGVyIHRvIGJlIHJlLXVzZWQgZm9yIGVuY29kaW5nIG9wZXJhdGlvbi4gSWYgdXNlcnMgd2FudCB0aGUgY29udGVudCBvZiBpdCB0byByZW1haW4KKyAgICB1bmNoYW5nZWQgZm9yIGEgbG9uZyB0aW1lLCB0aGV5IHNob3VsZCBtYWtlIGEgY29weSBvZiBpdCBhbmQgcmVsZWFzZSB0aGUgbWVtb3J5IGJhY2sgdG8KKyAgICB0aGUgZW5jb2Rlci4gVGhlIGVuY29kZXIgcmVsaWVzIG9uIHRoZSBpZCBlbGVtZW50IGluIHRoZSBBVkNGcmFtZUlPIHN0cnVjdHVyZSwKKyAgICB0aHVzIHVzZXJzIHNob3VsZCBub3QgY2hhbmdlIHRoZSBpZCB2YWx1ZS4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBkZWNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKKyAgICBccGFyYW0gIm91dHB1dCIgICAgICAiUG9pbnRlciB0byB0aGUgQVZDRnJhbWVJTyBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLCBBVkNFTkNfRkFJTCBmb3IgZmFpbCBmb3IgaWQgbm90IGZvdW5kLiIKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jUmVsZWFzZVJlY29uKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNGcmFtZUlPICpyZWNvbik7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNsZWFuIHVwIG9wZXJhdGlvbiBpbmNsdWRpbmcgbWVtb3J5IGRlYWxsb2NhdGlvbi4KKyAgICBUaGUgZW5jb2RlciB3aWxsIGFsc28gY2xlYXIgdGhlIGxpc3Qgb2YgaW5wdXQgc3RydWN0dXJlcyBpdCBoYXMgbm90IHJlbGVhc2VkLgorICAgIFRoaXMgaW1wbGllcyB0aGF0IHVzZXJzIG11c3Qga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGlucHV0IHN0cnVjdHVyZSB0aGV5IGhhdmUgYWxsb2NhdGVkCisgICAgYW5kIGZyZWUgdGhlbSBhY2NvcmRpbmdseS4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiB2b2lkICAgIFBWQVZDQ2xlYW5VcEVuY29kZXIoQVZDSGFuZGxlICphdmNIYW5kbGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBzdGF0aXN0aWNzIG9mIHRoZSBjdXJyZW50IGZyYW1lLiBJZiB0aGUgZW5jb2RlciBoYXMgbm90IGZpbmlzaGVkCisgICAgd2l0aCB0aGUgY3VycmVudCBmcmFtZSwgdGhlIHJlc3VsdCBpcyBub3QgYWNjdXJhdGUuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJhdmNTdGF0cyIgICAiUG9pbnRlciB0byBBVkNFbmNGcmFtZVN0YXRzIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIFBWQVZDRW5jR2V0RnJhbWVTdGF0cyhBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRW5jRnJhbWVTdGF0cyAqYXZjU3RhdHMpOworCisgICAgLyoqCisgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciB0aGUgbW9kaWZpY2F0aW9uIG9mIGVuY29kaW5nIHBhcmFtZXRlcnMuCisgICAgVG8gYmUgcG9saXNoZWQuCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1VwZGF0ZUJpdFJhdGUoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQzMiBiaXRyYXRlKTsKKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1VwZGF0ZUZyYW1lUmF0ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdWludDMyIG51bSwgdWludDMyIGRlbm9tKTsKKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1VwZGF0ZUlEUkludGVydmFsKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBpbnQgSURSSW50ZXJ2YWwpOworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jSURSUmVxdWVzdChBVkNIYW5kbGUgKmF2Y0hhbmRsZSk7CisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVJTUJSZWZyZXNoKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBpbnQgbnVtTUIpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgIC8qIF9BVkNFTkNfQVBJX0hfICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfaW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZTA4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2ludC5oCkBAIC0wLDAgKzEsNDcxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqCitUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gZnVuY3Rpb24gaW50ZXJmYWNlcyB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeQorYW5kIG5lY2Vzc2FyeSB0eXBlIGRlZml0aW9uaXRpb25zIGFuZCBlbnVtZXJhdGlvbnMuCitAcHVibGlzaGVkQWxsCisqLworCisjaWZuZGVmIEFWQ0VOQ19JTlRfSF9JTkNMVURFRAorI2RlZmluZSBBVkNFTkNfSU5UX0hfSU5DTFVERUQKKworI2lmbmRlZiBBVkNJTlRfQ09NTU9OX0hfSU5DTFVERUQKKyNpbmNsdWRlICJhdmNpbnRfY29tbW9uLmgiCisjZW5kaWYKKyNpZm5kZWYgQVZDRU5DX0FQSV9IX0lOQ0xVREVECisjaW5jbHVkZSAiYXZjZW5jX2FwaS5oIgorI2VuZGlmCisKK3R5cGVkZWYgZmxvYXQgT3NjbEZsb2F0OworCisvKiBEZWZpbml0aW9uIGZvciB0aGUgc3RydWN0dXJlcyBiZWxvdyAqLworI2RlZmluZSBERUZBVUxUX0FUVFIgICAgMCAvKiBkZWZhdWx0IG1lbW9yeSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTUFYX0lOUFVUX0ZSQU1FIDMwIC8qIHNvbWUgYXJiaXRyYXJ5IG51bWJlciwgaXQgY2FuIGJlIG11Y2ggaGlnaGVyIHRoYW4gdGhpcy4gKi8KKyNkZWZpbmUgTUFYX1JFRl9GUkFNRSAgMTYgLyogbWF4IHNpemUgb2YgdGhlIFJlZlBpY0xpc3QwIGFuZCBSZWZQaWNMaXN0MSAqLworI2RlZmluZSBNQVhfUkVGX1BJQ19MSVNUIDMzCisKKyNkZWZpbmUgTUlOX1FQICAgICAgICAgIDAKKyNkZWZpbmUgTUFYX1FQICAgICAgICAgIDUxCisjZGVmaW5lIFNISUZUX1FQICAgICAgICAxMgorI2RlZmluZSAgTEFNQkRBX0FDQ1VSQUNZX0JJVFMgICAgICAgICAxNgorI2RlZmluZSAgTEFNQkRBX0ZBQ1RPUihsYW1iZGEpICAgICAgICAoKGludCkoKGRvdWJsZSkoMTw8TEFNQkRBX0FDQ1VSQUNZX0JJVFMpKmxhbWJkYSswLjUpKQorCisKKyNkZWZpbmUgRElTQUJMRV9USFJFU0hPTERJTkcgIDAKKy8vIGZvciBiZXR0ZXIgUi1EIHBlcmZvcm1hbmNlCisjZGVmaW5lIF9MVU1BX0NPRUZGX0NPU1RfICAgICAgIDQgLy8hPCB0aHJlc2hvbGQgZm9yIGx1bWEgY29lZmZzCisjZGVmaW5lIF9DSFJPTUFfQ09FRkZfQ09TVF8gICAgIDQgLy8hPCB0aHJlc2hvbGQgZm9yIGNocm9tYSBjb2VmZnMsIHVzZWQgdG8gYmUgNworI2RlZmluZSBfTFVNQV9NQl9DT0VGRl9DT1NUXyAgICA1IC8vITwgdGhyZXNob2xkIGZvciBsdW1hIGNvZWZmcyBvZiBpbnRlciBNYWNyb2Jsb2NrcworI2RlZmluZSBfTFVNQV84eDhfQ09FRkZfQ09TVF8gICA1IC8vITwgdGhyZXNob2xkIGZvciBsdW1hIGNvZWZmcyBvZiA4eDggSW50ZXIgUGFydGl0aW9uCisjZGVmaW5lIE1BWF9WQUxVRSAgICAgICA5OTk5OTkgICAvLyE8IHVzZWQgZm9yIHN0YXJ0IHZhbHVlIGZvciBzb21lIHZhcmlhYmxlcworCisjZGVmaW5lICBXRUlHSFRFRF9DT1NUKGZhY3RvcixiaXRzKSAgICgoKGZhY3RvcikqKGJpdHMpKT4+TEFNQkRBX0FDQ1VSQUNZX0JJVFMpCisjZGVmaW5lICBNVl9DT1NUKGYscyxjeCxjeSxweCxweSkgICAgIChXRUlHSFRFRF9DT1NUKGYsbXZiaXRzWygoY3gpPDwocykpLXB4XSttdmJpdHNbKChjeSk8PChzKSktcHldKSkKKyNkZWZpbmUgIE1WX0NPU1RfUyhmLGN4LGN5LHB4LHB5KSAgICAgKFdFSUdIVEVEX0NPU1QoZixtdmJpdHNbY3gtcHhdK212Yml0c1tjeS1weV0pKQorCisvKiBmb3Igc3ViLXBlbCBzZWFyY2ggYW5kIGludGVycG9sYXRpb24gKi8KKyNkZWZpbmUgU1VCUEVMX1BSRURfQkxLX1NJWkUgNTc2IC8vIDI0eDI0CisjZGVmaW5lIFJFRl9DRU5URVIgNzUKKyNkZWZpbmUgVjJRX0gwUSAxCisjZGVmaW5lIFYwUV9IMlEgMgorI2RlZmluZSBWMlFfSDJRIDMKKworLyoKKyNkZWZpbmUgVjNRX0gwUSAxCisjZGVmaW5lIFYzUV9IMVEgMgorI2RlZmluZSBWMFFfSDFRIDMKKyNkZWZpbmUgVjFRX0gxUSA0CisjZGVmaW5lIFYxUV9IMFEgNQorI2RlZmluZSBWMVFfSDNRIDYKKyNkZWZpbmUgVjBRX0gzUSA3CisjZGVmaW5lIFYzUV9IM1EgOAorI2RlZmluZSBWMlFfSDNRIDkKKyNkZWZpbmUgVjJRX0gwUSAxMAorI2RlZmluZSBWMlFfSDFRIDExCisjZGVmaW5lIFYyUV9IMlEgMTIKKyNkZWZpbmUgVjNRX0gyUSAxMworI2RlZmluZSBWMFFfSDJRIDE0CisjZGVmaW5lIFYxUV9IMlEgMTUKKyovCisKKworI2RlZmluZSBERUZBVUxUX09WRVJSVU5fQlVGRkVSX1NJWkUgMTAwMAorCisvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGFib3ZlIGNvc3QgbW9kZWwKK2NvbnN0IHVpbnQ4IENPRUZGX0NPU1RbMl1bMTZdID0KK3sKKyAgICB7MywgMiwgMiwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDksIDl9Cit9OworCisKKworLy8hIGNvbnZlcnQgZnJvbSBILjI2MyBRUCB0byBILjI2NCBxdWFudCBnaXZlbiBieTogcXVhbnQ9cG93KDIsUVAvNikKK2NvbnN0IGludCBRUDJRVUFOVFs0MF0gPQoreworICAgIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsCisgICAgMywgMywgMywgNCwgNCwgNCwgNSwgNiwKKyAgICA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNCwKKyAgICAxNiwgMTgsIDIwLCAyMywgMjUsIDI5LCAzMiwgMzYsCisgICAgNDAsIDQ1LCA1MSwgNTcsIDY0LCA3MiwgODEsIDkxCit9OworCisKKy8qKgorVGhpcyBlbnVtZXJhdGlvbiBrZWVwcyB0cmFjayBvZiB0aGUgaW50ZXJuYWwgc3RhdHVzIG9mIHRoZSBlbmNvZGVyIHdoZXRoZXIgaXQgaXMgZG9pbmcKK3NvbWV0aGluZy4gVGhlIGVuY29kaW5nIGZsb3cgZm9sbG93cyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlc2Ugc3RhdGVzIGFyZS4KK0BwdWJsaXNoZWRBbGwKKyovCit0eXBlZGVmIGVudW0KK3sKKyAgICBBVkNFbmNfSW5pdGlhbGl6aW5nID0gMCwKKyAgICBBVkNFbmNfRW5jb2RpbmdfU1BTLAorICAgIEFWQ0VuY19FbmNvZGluZ19QUFMsCisgICAgQVZDRW5jX0FuYWx5emluZ19GcmFtZSwKKyAgICBBVkNFbmNfV2FpdGluZ0ZvckJ1ZmZlciwgIC8vIHBlbmRpbmcgc3RhdGUKKyAgICBBVkNFbmNfRW5jb2RpbmdfRnJhbWUsCit9IEFWQ0VuY19TdGF0ZSA7CisKKy8qKgorQml0c3RyZWFtIHN0cnVjdHVyZSBjb250YWlucyBiaXRzdHJlYW0gcmVsYXRlZCBwYXJhbWV0ZXJzIHN1Y2ggYXMgdGhlIHBvaW50ZXIKK3RvIHRoZSBidWZmZXIsIHRoZSBjdXJyZW50IGJ5dGUgcG9zaXRpb24gYW5kIGJpdCBwb3NpdGlvbi4gVGhlIGNvbnRlbnQgb2YgdGhlCitiaXRzdHJlYW1CdWZmZXIgd2lsbCBiZSBpbiBFQlNQIGZvcm1hdCBhcyB0aGUgZW11bGF0aW9uIHByZXZlbnRpb24gY29kZXMgYXJlCithdXRvbWF0aWNhbGx5IGluc2VydGVkIGFzIHRoZSBSQlNQIGlzIHJlY29yZGVkLgorQHB1Ymxpc2hlZEFsbAorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0VuY0JpdHN0cmVhbQoreworICAgIHVpbnQ4ICpiaXRzdHJlYW1CdWZmZXI7IC8qIHBvaW50ZXIgdG8gYnVmZmVyIG1lbW9yeSAgICovCisgICAgaW50IGJ1Zl9zaXplOyAgICAgICAvKiBzaXplIG9mIHRoZSBidWZmZXIgbWVtb3J5ICovCisgICAgaW50IHdyaXRlX3BvczsgICAgICAvKiBuZXh0IHBvc2l0aW9uIHRvIHdyaXRlIHRvIGJpdHN0cmVhbUJ1ZmZlciAgKi8KKyAgICBpbnQgY291bnRfemVyb3M7ICAgLyogY291bnQgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHplcm8gKi8KKyAgICB1aW50IGN1cnJlbnRfd29yZDsgIC8qIGJ5dGUtc3dhcHBlZCAoTVNCIGxlZnQpIGN1cnJlbnQgd29yZCB0byB3cml0ZSB0byBidWZmZXIgKi8KKyAgICBpbnQgYml0X2xlZnQ7ICAgICAgLyogbnVtYmVyIG9mIGJpdCBsZWZ0IGluIGN1cnJlbnRfd29yZCAqLworICAgIHVpbnQ4ICAgKm92ZXJydW5CdWZmZXI7ICAvKiBleHRyYSBvdXRwdXQgYnVmZmVyIHRvIHByZXZlbnQgY3VycmVudCBza2lwIGR1ZSB0byBvdXRwdXQgYnVmZmVyIG92ZXJydW4qLworICAgIGludCAgICAgb0JTaXplOyAgICAgLyogc2l6ZSBvZiBhbGxvY2F0ZWQgb3ZlcnJ1biBidWZmZXIgKi8KKyAgICB2b2lkICAgKmVuY3ZpZDsgLyogcG9pbnRlciB0byB0aGUgbWFpbiBvYmplY3QgKi8KKworfSBBVkNFbmNCaXRzdHJlYW07CisKKy8qKgorVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgcmF0ZSBjb250cm9sIHB1cnBvc2UgYW5kIG90aGVyIHBlcmZvcm1hbmNlIHJlbGF0ZWQgY29udHJvbAordmFyaWFibGVzIHN1Y2ggYXMsIFJEIGNvc3QsIHN0YXRpc3RpY3MsIG1vdGlvbiBzZWFyY2ggc3R1ZmZzLCBldGMuCitzaG91bGQgYmUgaW4gdGhpcyBzdHJ1Y3R1cmUuCitAcHVibGlzaGVkQWxsCisqLworCisKK3R5cGVkZWYgc3RydWN0IHRhZ1JESW5mbworeworICAgIGludCBRUDsKKyAgICBpbnQgYWN0dWFsX2JpdHM7CisgICAgT3NjbEZsb2F0IG1hZDsKKyAgICBPc2NsRmxvYXQgUl9EOworfSBSREluZm87CisKK3R5cGVkZWYgc3RydWN0IHRhZ011bHRpUGFzcworeworICAgIC8qIG11bHRpcGFzcyByYXRlIGNvbnRyb2wgZGF0YSAqLworICAgIGludCB0YXJnZXRfYml0czsgICAgLyogdGFyZ2V0IGJpdHMgZm9yIGN1cnJlbnQgZnJhbWUsID0gcmMtPlQgKi8KKyAgICBpbnQgYWN0dWFsX2JpdHM7ICAgIC8qIGFjdHVhbCBiaXRzIGZvciBjdXJyZW50IGZyYW1lIG9idGFpbmVkIGFmdGVyIGVuY29kaW5nLCA9IHJjLT5SYyovCisgICAgaW50IFFQOyAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gbGV2ZWwgZm9yIGN1cnJlbnQgZnJhbWUsID0gcmMtPlFjKi8KKyAgICBpbnQgcHJldl9RUDsgICAgICAgIC8qIHF1YW50aXphdGlvbiBsZXZlbCBmb3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICBpbnQgcHJldl9wcmV2X1FQOyAgIC8qIHF1YW50aXphdGlvbiBsZXZlbCBmb3IgcHJldmlvdXMgZnJhbWUgYmVmb3JlIGxhc3QqLworICAgIE9zY2xGbG9hdCBtYWQ7ICAgICAgICAgIC8qIG1hZCBmb3IgY3VycmVudCBmcmFtZSwgPSB2aWRlby0+YXZnTUFEKi8KKyAgICBpbnQgYml0cmF0ZTsgICAgICAgIC8qIGJpdHJhdGUgZm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBPc2NsRmxvYXQgZnJhbWVyYXRlOyAgICAvKiBmcmFtZXJhdGUgZm9yIGN1cnJlbnQgZnJhbWUqLworCisgICAgaW50IG5SZV9RdWFudGl6ZWQ7ICAvKiBjb250cm9sIHZhcmlhYmxlIGZvciBtdWx0aXBhc3MgZW5jb2RpbmcsICovCisgICAgLyogMCA6IGZpcnN0IHBhc3MgKi8KKyAgICAvKiAxIDogaW50ZXJtZWRpYXRlIHBhc3MocXVhbnRpemF0aW9uIGFuZCBWTEMgbG9vcCBvbmx5KSAqLworICAgIC8qIDIgOiBmaW5hbCBwYXNzKGRlLXF1YW50aXphdGlvbiwgaWRjdCwgZXRjKSAqLworICAgIC8qIDMgOiBtYWNyb2Jsb2NrIGxldmVsIHJhdGUgY29udHJvbCAqLworCisgICAgaW50IGVuY29kZWRfZnJhbWVzOyAgICAgLyogY291bnRlciBmb3IgYWxsIGVuY29kZWQgZnJhbWVzICovCisgICAgaW50IHJlX2VuY29kZWRfZnJhbWVzOyAgLyogY291bnRlciBmb3IgYWxsIG11bHRpcGFzcyBlbmNvZGVkIGZyYW1lcyovCisgICAgaW50IHJlX2VuY29kZWRfdGltZXM7ICAgLyogY291bnRlciBmb3IgYWxsIHRpbWVzIG9mIG11bHRpcGFzcyBmcmFtZSBlbmNvZGluZyAqLworCisgICAgLyogTXVsdGlwbGUgZnJhbWUgcHJlZGljdGlvbiovCisgICAgUkRJbmZvICoqcFJEU2FtcGxlczsgICAgICAgIC8qIHBSRFNhbXBsZXNbMzBdWzMyXSwgMzAtPjMwZnBzLCAzMiAtPiA1IGJpdCBxdWFudGl6ZXIsIDMyIGNhbmRpZGF0ZXMqLworICAgIGludCBmcmFtZVBvczsgICAgICAgICAgICAgICAvKiBzcGVjaWZpYyBwb3NpdGlvbiBpbiBwcmV2aW91cyBtdWx0aXBsZSBmcmFtZXMqLworICAgIGludCBmcmFtZVJhbmdlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygb3ZlcmFsbCBwcmV2aW91cyBtdWx0aXBsZSBmcmFtZXMgKi8KKyAgICBpbnQgc2FtcGxlc1BlckZyYW1lWzMwXTsgICAgLyogbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lLCAzMC0+MzBmcHMgKi8KKworICAgIC8qIEJpdCBhbGxvY2F0aW9uIGZvciBzY2VuZSBjaGFuZ2UgZnJhbWVzIGFuZCBoaWdoIG1vdGlvbiBmcmFtZXMgKi8KKyAgICBPc2NsRmxvYXQgc3VtX21hZDsKKyAgICBpbnQgY291bnRlcl9CVHNyYzsgIC8qIEJUID0gQml0IFRyYW5zZmVyLCBiaXQgdHJhbnNmZXIgZnJvbSBsb3cgbW90aW9uIGZyYW1lcyBvciBsZXNzIGNvbXBsaWNhdGVkbHkgY29tcHJlc3NlZCBmcmFtZXMgKi8KKyAgICBpbnQgY291bnRlcl9CVGRzdDsgIC8qIEJUID0gQml0IFRyYW5zZmVyLCBiaXQgdHJhbnNmZXIgdG8gc2NlbmUgY2hhbmdlIGZyYW1lcyBvciBoaWdoIG1vdGlvbiBmcmFtZXMgb3IgbW9yZSBjb21wbGljYXRlZGx5IGNvbXByZXNzZWQgZnJhbWVzICovCisgICAgT3NjbEZsb2F0IHN1bV9RUDsKKyAgICBpbnQgZGlmZl9jb3VudGVyOyAgIC8qIGRpZmZfY291bnRlciA9IC1kaWZmX2NvdW50ZXJfQlRkc3QsIG9yIGRpZmZfY291bnRlcl9CVHNyYyAqLworCisgICAgLyogRm9yIHRhcmdldCBiaXRyYXRlIG9yIGZyYW1lcmF0ZSB1cGRhdGUgKi8KKyAgICBPc2NsRmxvYXQgdGFyZ2V0X2JpdHNfcGVyX2ZyYW1lOyAgICAgICAgLyogPSBDID0gYml0cmF0ZS9mcmFtZXJhdGUgKi8KKyAgICBPc2NsRmxvYXQgdGFyZ2V0X2JpdHNfcGVyX2ZyYW1lX3ByZXY7ICAgLyogcHJldmlvdXMgQyAqLworICAgIE9zY2xGbG9hdCBhdmVyX21hZDsgICAgICAgICAgICAgICAgICAgICAvKiBzby1mYXIgYXZlcmFnZSBtYWQgY291bGQgcmVwbGFjZSBzdW1fbWFkICovCisgICAgT3NjbEZsb2F0IGF2ZXJfbWFkX3ByZXY7ICAgICAgICAgICAgICAgIC8qIHByZXZpb3VzIGF2ZXJhZ2UgbWFkICovCisgICAgaW50ICAgb3ZlcmxhcHBlZF93aW5fc2l6ZTsgICAgICAgICAgLyogdHJhbnNpdGlvbiBwZXJpb2Qgb2YgdGltZSAqLworICAgIGludCAgIGVuY29kZWRfZnJhbWVzX3ByZXY7ICAgICAgICAgIC8qIHByZXZpb3VzIGVuY29kZWRfZnJhbWVzICovCit9IE11bHRpUGFzczsKKworCit0eXBlZGVmIHN0cnVjdCB0YWdkYXRhUG9pbnRBcnJheQoreworICAgIGludCBRcDsKKyAgICBpbnQgUnA7CisgICAgT3NjbEZsb2F0IE1wOyAgIC8qIGZvciBNQi1iYXNlZCBSQyAqLworICAgIHN0cnVjdCB0YWdkYXRhUG9pbnRBcnJheSAqbmV4dDsKKyAgICBzdHJ1Y3QgdGFnZGF0YVBvaW50QXJyYXkgKnByZXY7Cit9IGRhdGFQb2ludEFycmF5OworCit0eXBlZGVmIHN0cnVjdCB0YWdBVkNSYXRlQ29udHJvbAoreworCisgICAgLyogdGhlc2UgcGFyYW1ldGVycyBhcmUgaW5pdGlhbGl6ZWQgYnkgdGhlIHVzZXJzIEFWQ0VuY1BhcmFtcyAqLworICAgIC8qIGJpdHJhdGUtcm9idXN0bmVzcyB0cmFkZW9mZiAqLworICAgIHVpbnQgc2NkRW5hYmxlOyAvKiBlbmFibGUgc2NlbmUgY2hhbmdlIGRldGVjdGlvbiAqLworICAgIGludCBpZHJQZXJpb2Q7ICAvKiBJRFIgcGVyaW9kIGluIG51bWJlciBvZiBmcmFtZXMgKi8KKyAgICBpbnQgaW50cmFNQlJhdGU7ICAgLyogaW50cmEgTUIgcmVmcmVzaCByYXRlIHBlciBmcmFtZSAqLworICAgIHVpbnQgZHBFbmFibGU7ICAvKiBlbmFibGUgZGF0YSBwYXJ0aXRpb25pbmcgKi8KKworICAgIC8qIHF1YWxpdHktY29tcGxleGl0eSB0cmFkZW9mZiAqLworICAgIHVpbnQgc3ViUGVsRW5hYmxlOyAgLyogZW5hYmxlIHF1YXJ0ZXIgcGVsIHNlYXJjaCAqLworICAgIGludCBtdlJhbmdlOyAgICAvKiBtb3Rpb24gdmVjdG9yIHNlYXJjaCByYW5nZSBpbiArLy0gcGl4ZWwgKi8KKyAgICB1aW50IHN1Yk1CRW5hYmxlOyAgLyogZW5hYmxlIHN1YiBNQiBwcmVkaWN0aW9uIG1vZGUgKDR4NCwgNHg4LCA4eDQpICovCisgICAgdWludCByZE9wdEVuYWJsZTsgIC8qIGVuYWJsZSBSRC1vcHQgbW9kZSBzZWxlY3Rpb24gKi8KKyAgICB1aW50IHR3b1Bhc3M7IC8qIGZsYWcgZm9yIDIgcGFzcyBlbmNvZGluZyAoIGZvciBmdXR1cmUgKSovCisgICAgdWludCBiaWRpclByZWQ7IC8qIGJpLWRpcmVjdGlvbmFsIHByZWRpY3Rpb24gZm9yIEItZnJhbWUuICovCisKKyAgICB1aW50IHJjRW5hYmxlOyAgLyogZW5hYmxlIHJhdGUgY29udHJvbCwgJzEnIG9uLCAnMCcgY29uc3QgUVAgKi8KKyAgICBpbnQgaW5pdFFQOyAvKiBpbml0aWFsIFFQICovCisKKyAgICAvKiBub3RlIHRoZSBmb2xsb3dpbmcgMyBwYXJhbXMgYXJlIGZvciBIUkQsIHRoZXNlIHRyaXBsZXRzIGNhbiBiZSBhIHNlcmllcworICAgIG9mIHRyaXBsZXRzIGFzIHRoZSBnZW5lcmFsaXplZCBIUkQgYWxsb3dzLiBTRUkgbWVzc2FnZSBtdXN0IGJlIGdlbmVyYXRlZCBpbiB0aGlzIGNhc2UuICovCisgICAgLyogV2Ugbm8gbG9uZ2VyIGhhdmUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIENCUiBhbmQgVkJSLiBUaGUgdXNlcnMgdG8gdGhlCisgICAgQVZDIGVuY29kZXIgbGliIHdpbGwgZG8gdGhlIG1hcHBpbmcgZnJvbSBDQlIvVkJSIHRvIHRoZXNlIHBhcmFtZXRlcnMuICovCisgICAgaW50MzIgYml0UmF0ZTsgIC8qIHRhcmdldCBiaXQgcmF0ZSBmb3IgdGhlIG92ZXJhbGwgY2xpcCBpbiBiaXRzL3NlY29uZCovCisgICAgaW50MzIgY3BiU2l6ZTsgIC8qIGNvZGVkIHBpY3R1cmUgYnVmZmVyIHNpemUgaW4gYnl0ZXMgKi8KKyAgICBpbnQzMiBpbml0RGVsYXlPZmZzZXQ7IC8qIGluaXRpYWwgQ0JQIHJlbW92YWwgZGVsYXkgaW4gYml0cyAqLworCisgICAgT3NjbEZsb2F0IGZyYW1lX3JhdGU7IC8qIGZyYW1lIHJhdGUgKi8KKyAgICBpbnQgc3JjSW50ZXJ2YWw7IC8qIHNvdXJjZSBmcmFtZSByYXRlIGluIG1zZWMgKi8KKyAgICBpbnQgYmFzaWNVbml0OyAgLyogbnVtYmVyIG9mIG1hY3JvYmxvY2tzIHBlciBCVSAqLworCisgICAgLyogVGhlbiBpbnRlcm5hbCBwYXJhbWV0ZXJzIGZvciB0aGUgb3BlcmF0aW9uICovCisgICAgdWludCBmaXJzdF9mcmFtZTsgLyogYSBmbGFnIGZvciB0aGUgZmlyc3QgZnJhbWUgKi8KKyAgICBpbnQgbGFtYmRhX21mOyAvKiBmb3IgZXhhbXBsZSAqLworICAgIGludCB0b3RhbFNBRDsgICAgLyogU0FEIG9mIGN1cnJlbnQgZnJhbWUgKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIHRoaXMgcGFydCBjb21lcyBmcm9tIE1QRUc0IHJhdGUgY29udHJvbCAqLworICAgIGludCBhbHBoYTsgIC8qIHdlaWdodCBmb3IgSSBmcmFtZSAqLworICAgIGludCBSczsgICAgIC8qYml0IHJhdGUgZm9yIHRoZSBzZXF1ZW5jZSAob3Igc2VnbWVudCkgZS5nLiwgMjQwMDAgYml0cy9zZWMgKi8KKyAgICBpbnQgUmM7ICAgICAvKmJpdHMgdXNlZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuIEl0IGlzIHRoZSBiaXQgY291bnQgb2J0YWluZWQgYWZ0ZXIgZW5jb2RpbmcuICovCisgICAgaW50IFJwOyAgICAgLypiaXRzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyIHBlciBwaWN0dXJlLiAqLworICAgIC8qPyBpcyB0aGlzIHRoZSBhdmVyYWdlIG9uZSwgb3IganVzdCB0aGUgYml0cyBjb2RlZCBmb3IgdGhlIHByZXZpb3VzIGZyYW1lICovCisgICAgaW50IFJwczsgICAgLypiaXQgdG8gYmUgcmVtb3ZlZCBmcm9tIGJ1ZmZlciBwZXIgc3JjIGZyYW1lICovCisgICAgT3NjbEZsb2F0IFRzOyAgIC8qbnVtYmVyIG9mIHNlY29uZHMgZm9yIHRoZSBzZXF1ZW5jZSAgKG9yIHNlZ21lbnQpLiBlLmcuLCAxMCBzZWMgKi8KKyAgICBPc2NsRmxvYXQgRXA7CisgICAgT3NjbEZsb2F0IEVjOyAgIC8qbWVhbiBhYnNvbHV0ZSBkaWZmZXJlbmNlIGZvciB0aGUgY3VycmVudCBmcmFtZSBhZnRlciBtb3Rpb24gY29tcGVuc2F0aW9uLiovCisgICAgLypJZiB0aGUgbWFjcm9ibG9jayBpcyBpbnRyYSBjb2RlZCwgdGhlIG9yaWdpbmFsIHNwYXRpYWwgcGl4ZWwgdmFsdWVzIGFyZSBzdW1tZWQuKi8KKyAgICBpbnQgUWM7ICAgICAvKnF1YW50aXphdGlvbiBsZXZlbCB1c2VkIGZvciB0aGUgY3VycmVudCBmcmFtZS4gKi8KKyAgICBpbnQgTnI7ICAgICAvKm51bWJlciBvZiBQIGZyYW1lcyByZW1haW5pbmcgZm9yIGVuY29kaW5nLiovCisgICAgaW50IFJyOyAvKm51bWJlciBvZiBiaXRzIHJlbWFpbmluZyBmb3IgZW5jb2RpbmcgdGhpcyBzZXF1ZW5jZSAob3Igc2VnbWVudCkuKi8KKyAgICBpbnQgUnJfT2xkOworICAgIGludCBUOyAgICAgIC8qdGFyZ2V0IGJpdCB0byBiZSB1c2VkIGZvciB0aGUgY3VycmVudCBmcmFtZS4qLworICAgIGludCBTOyAgICAgIC8qbnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgZW5jb2RpbmcgdGhlIHByZXZpb3VzIGZyYW1lLiovCisgICAgaW50IEhjOyAvKmhlYWRlciBhbmQgbW90aW9uIHZlY3RvciBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgZnJhbWUuIEl0IGluY2x1ZGVzIGFsbCB0aGUgIGluZm9ybWF0aW9uIGV4Y2VwdCB0byB0aGUgcmVzaWR1YWwgaW5mb3JtYXRpb24uKi8KKyAgICBpbnQgSHA7IC8qaGVhZGVyIGFuZCBtb3Rpb24gdmVjdG9yIGJpdHMgdXNlZCBpbiB0aGUgcHJldmlvdXMgZnJhbWUuIEl0IGluY2x1ZGVzIGFsbCB0aGUgICAgIGluZm9ybWF0aW9uIGV4Y2VwdCB0byB0aGUgcmVzaWR1YWwgaW5mb3JtYXRpb24uKi8KKyAgICBpbnQgUWw7IC8qcXVhbnRpemF0aW9uIGxldmVsIHVzZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lICovCisgICAgaW50IEJzOyAvKmJ1ZmZlciBzaXplIGUuZy4sIFIvMiAqLworICAgIGludCBCOyAgICAgIC8qY3VycmVudCBidWZmZXIgbGV2ZWwgZS5nLiwgUi80IC0gc3RhcnQgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSBidWZmZXIgKi8KKyAgICBPc2NsRmxvYXQgWDE7CisgICAgT3NjbEZsb2F0IFgyOworICAgIE9zY2xGbG9hdCBYMTE7CisgICAgT3NjbEZsb2F0IE07ICAgICAgICAgICAgLypzYWZlIG1hcmdpbiBmb3IgdGhlIGJ1ZmZlciAqLworICAgIE9zY2xGbG9hdCBzbVRpY2s7ICAgIC8qcmF0aW8gb2Ygc3JjIHZlcnN1cyBlbmMgZnJhbWUgcmF0ZSAqLworICAgIGRvdWJsZSByZW1uYW50OyAgLypyZW1haW5kZXIgZnJhbWUgb2Ygc3JjL2VuYyBmcmFtZSBmb3IgZmluZSBmcmFtZSBza2lwcGluZyAqLworICAgIGludCB0aW1lSW5jUmVzOyAvKiB2b2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uICovCisKKyAgICBkYXRhUG9pbnRBcnJheSAgICplbmQ7IC8qcXVhbnRpemF0aW9uIGxldmVscyBmb3IgdGhlIHBhc3QgKDIwKSBmcmFtZXMgKi8KKworICAgIGludCAgICAgZnJhbWVOdW1iZXI7IC8qIHJhbmdpbmcgZnJvbSAwIHRvIDIwIG5vZGVzKi8KKyAgICBpbnQgICAgIHc7CisgICAgaW50ICAgICBOcl9PcmlnaW5hbDsKKyAgICBpbnQgICAgIE5yX09sZCwgTnJfT2xkMjsKKyAgICBpbnQgICAgIHNraXBfbmV4dF9mcmFtZTsKKyAgICBpbnQgICAgIFFkZXA7ICAgICAgIC8qIHNtb290aCBRIGFkanVzdG1lbnQgKi8KKyAgICBpbnQgICAgIFZCUl9FbmFibGVkOworCisgICAgaW50IHRvdGFsRnJhbWVOdW1iZXI7IC8qIHRvdGFsIGNvZGVkIGZyYW1lcywgZm9yIGRlYnVnZ2luZyEhKi8KKworICAgIGNoYXIgICAgb0ZpcnN0VGltZTsKKworICAgIGludCBudW1GcmFtZUJpdHM7IC8qIGtlZXAgdHJhY2sgb2YgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKyAgICBpbnQgTnVtYmVyb2ZIZWFkZXJCaXRzOworICAgIGludCBOdW1iZXJvZlRleHR1cmVCaXRzOworICAgIGludCBudW1NQkhlYWRlckJpdHM7CisgICAgaW50IG51bU1CVGV4dHVyZUJpdHM7CisgICAgZG91YmxlICpNQURvZk1COworICAgIGludDMyIGJpdHNQZXJGcmFtZTsKKworICAgIC8qIEJYIHJhdGUgY29udHJvbCwgc29tZXRoaW5nIGxpa2UgVE1OOCByYXRlIGNvbnRyb2wqLworCisgICAgTXVsdGlQYXNzICpwTVA7CisKKyAgICBpbnQgICAgIFRNTl9XOworICAgIGludCAgICAgVE1OX1RIOworICAgIGludCAgICAgVkJWX2Z1bGxuZXNzOworICAgIGludCAgICAgbWF4X0JpdFZhcmlhbmNlX251bTsgLyogdGhlIG51bWJlciBvZiB0aGUgbWF4aW11bSBiaXQgdmFyaWFuY2Ugd2l0aGluIHRoZSBnaXZlbiBidWZmZXIgd2l0aCB0aGUgdW5pdCBvZiAxMCUgb2YgYml0cmF0ZS9mcmFtZXJhdGUqLworICAgIGludCAgICAgZW5jb2RlZF9mcmFtZXM7IC8qIGNvdW50ZXIgZm9yIGFsbCBlbmNvZGVkIGZyYW1lcyAqLworICAgIGludCAgICAgbG93X2JvdW5kOyAgICAgICAgICAgICAgLyogYm91bmQgZm9yIHVuZGVyZmxvdyBkZXRlY3Rpb24sIHVzdWFsbHkgbG93X2JvdW5kPS1Ccy8yLCBidXQgY291bGQgYmUgY2hhbmdlZCBpbiBILjI2MyBtb2RlICovCisgICAgaW50ICAgICBWQlZfZnVsbG5lc3Nfb2Zmc2V0OyAgICAvKiBvZmZzZXQgb2YgVkJWX2Z1bGxuZXNzLCB1c3VhbGx5IGlzIHplcm8sIGJ1dCBjYW4gYmUgY2hhbmdlZCBpbiBILjI2MyBtb2RlKi8KKyAgICAvKiBFbmQgQlggKi8KKworfSBBVkNSYXRlQ29udHJvbDsKKworCisvKioKK1RoaXMgc3RydWN0dXJlIGlzIGZvciB0aGUgbW90aW9uIHZlY3RvciBpbmZvcm1hdGlvbi4gKi8KK3R5cGVkZWYgc3RydWN0IHRhZ01WCit7CisgICAgaW50IHg7CisgICAgaW50IHk7CisgICAgdWludCBzYWQ7Cit9IEFWQ01WOworCisvKioKK1RoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm0gZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mCitmdW5jdGlvbnMuICovCit0eXBlZGVmIHN0cnVjdCB0YWdBVkNFbmNGdW5jUHRyCit7CisKKyAgICBpbnQgKCpTQURfTUJfSGFsZlBlbFs0XSkodWludDgqLCB1aW50OCosIGludCwgdm9pZCAqKTsKKyAgICBpbnQgKCpTQURfTWFjcm9ibG9jaykodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworCit9IEFWQ0VuY0Z1bmNQdHI7CisKKy8qKgorVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBjb3JyZWN0IHBhZGRpbmcuCisqLwordHlwZWRlZiBzdHJ1Y3QgdGFnUGFkSW5mbworeworICAgIGludCBpOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgajsKKyAgICBpbnQgaGVpZ2h0OworfSBBVkNQYWRJbmZvOworCisKKyNpZmRlZiBIVEZNCit0eXBlZGVmIHN0cnVjdCB0YWdIVEZNX1N0YXQKK3sKKyAgICBpbnQgYWJzX2RpZl9tYWRfYXZnOworICAgIHVpbnQgY291bnRicmVhazsKKyAgICBpbnQgb2Zmc2V0QXJyYXlbMTZdOworICAgIGludCBvZmZzZXRSZWZbMTZdOworfSBIVEZNX1N0YXQ7CisjZW5kaWYKKworCisvKioKK1RoaXMgc3RydWN0dXJlIGlzIHRoZSBtYWluIG9iamVjdCBmb3IgQVZDIGVuY29kZXIgbGlicmFyeSBwcm92aWRpbmcgYWNjZXNzIHRvIGFsbAorZ2xvYmFsIHZhcmlhYmxlcy4gSXQgaXMgYWxsb2NhdGVkIGF0IFBWQVZDSW5pdEVuY29kZXIgYW5kIGZyZWVkIGF0IFBWQVZDQ2xlYW5VcEVuY29kZXIuCitAcHVibGlzaGVkQWxsCisqLwordHlwZWRlZiBzdHJ1Y3QgdGFnRW5jT2JqZWN0Cit7CisKKyAgICBBVkNDb21tb25PYmogKmNvbW1vbjsKKworICAgIEFWQ0VuY0JpdHN0cmVhbSAgICAgKmJpdHN0cmVhbTsgLyogZm9yIGN1cnJlbnQgTkFMICovCisgICAgdWludDggICAqb3ZlcnJ1bkJ1ZmZlcjsgIC8qIGV4dHJhIG91dHB1dCBidWZmZXIgdG8gcHJldmVudCBjdXJyZW50IHNraXAgZHVlIHRvIG91dHB1dCBidWZmZXIgb3ZlcnJ1biovCisgICAgaW50ICAgICBvQlNpemU7ICAgICAvKiBzaXplIG9mIGFsbG9jYXRlZCBvdmVycnVuIGJ1ZmZlciAqLworCisgICAgLyogcmF0ZSBjb250cm9sICovCisgICAgQVZDUmF0ZUNvbnRyb2wgICAgICAqcmF0ZUN0cmw7IC8qIHBvaW50ZXIgdG8gdGhlIHJhdGUgY29udHJvbCBzdHJ1Y3R1cmUgKi8KKworICAgIC8qIGVuY29kaW5nIG9wZXJhdGlvbiAqLworICAgIEFWQ0VuY19TdGF0ZSAgICAgICAgZW5jX3N0YXRlOyAvKiBlbmNvZGluZyBzdGF0ZSAqLworCisgICAgQVZDRnJhbWVJTyAgICAgICAgICAqY3VycklucHV0OyAvKiBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGlucHV0IGZyYW1lICovCisKKyAgICBpbnQgICAgICAgICAgICAgICAgIGN1cnJTbGljZUdyb3VwOyAvKiBjdXJyZW50bHkgZW5jb2RlZCBzbGljZSBncm91cCBpZCAqLworCisgICAgaW50ICAgICBsZXZlbFsyNF1bMTZdLCBydW5bMjRdWzE2XTsgLyogc2NyYXRjaCBtZW1vcnkgKi8KKyAgICBpbnQgICAgIGxldmVsZGNbMTZdLCBydW5kY1sxNl07IC8qIGZvciBEQyBjb21wb25lbnQgKi8KKyAgICBpbnQgICAgIGxldmVsY2RjWzE2XSwgcnVuY2RjWzE2XTsgLyogZm9yIGNocm9tYSBEQyBjb21wb25lbnQgKi8KKyAgICBpbnQgICAgIG51bWNvZWZjZGNbMl07IC8qIG51bWJlciBvZiBjb2VmZmljaWVudCBmb3IgY2hyb21hIERDICovCisgICAgaW50ICAgICBudW1jb2VmZGM7ICAgICAgLyogbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBmb3IgREMgY29tcG9uZW50ICovCisKKyAgICBpbnQgICAgIHFwX2NvbnN0OworICAgIGludCAgICAgcXBfY29uc3RfYzsKKyAgICAvKioqKioqKioqIGludHJhIHByZWRpY3Rpb24gc2NyYXRjaCBtZW1vcnkgKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB1aW50OCAgIHByZWRfaTE2W0FWQ051bUkxNlByZWRNb2RlXVsyNTZdOyAvKiBzYXZlIHByZWRpY3Rpb24gZm9yIE1CICovCisgICAgdWludDggICBwcmVkX2k0W0FWQ051bUk0UHJlZE1vZGVdWzE2XTsgIC8qIHNhdmUgcHJlZGljdGlvbiBmb3IgYmxrICovCisgICAgdWludDggICBwcmVkX2ljW0FWQ051bUlDaHJvbWFNb2RlXVsxMjhdOyAgLyogZm9yIDIgY2hyb21hICovCisKKyAgICBpbnQgICAgIG1vc3RQcm9iYWJsZUk0TW9kZVsxNl07IC8qIGluIHJhc3RlciBzY2FuIG9yZGVyICovCisgICAgLyoqKioqKioqKiBtb3Rpb24gY29tcGVuc2F0aW9uIHJlbGF0ZWQgdmFyaWFibGVzICoqKioqKioqKioqKioqKiovCisgICAgQVZDTVYgICAqbW90MTZ4MTY7ICAgICAgICAgIC8qIFNhdmVkIG1vdGlvbiB2ZWN0b3JzIGZvciAxNngxNiBibG9jayovCisgICAgQVZDTVYoKm1vdDE2eDgpWzJdOyAgICAgLyogU2F2ZWQgbW90aW9uIHZlY3RvcnMgZm9yIDE2eDggYmxvY2sqLworICAgIEFWQ01WKCptb3Q4eDE2KVsyXTsgICAgIC8qIFNhdmVkIG1vdGlvbiB2ZWN0b3JzIGZvciA4eDE2IGJsb2NrKi8KKyAgICBBVkNNVigqbW90OHg4KVs0XTsgICAgICAvKiBTYXZlZCBtb3Rpb24gdmVjdG9ycyBmb3IgOHg4IGJsb2NrKi8KKworICAgIC8qKioqKioqKiogc3VicGVsIHBvc2l0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHVpbnQzMiAgc3VicGVsX3ByZWRbU1VCUEVMX1BSRURfQkxLX1NJWkUvKjw8MiovXTsgLyogYWxsIDE2IHN1Yi1wZWwgcG9zaXRpb25zICAqLworICAgIHVpbnQ4ICAgKmhwZWxfY2FuZFs5XTsgICAgICAvKiBwb2ludGVyIHRvIGhhbGYtcGVsIHBvc2l0aW9uICovCisgICAgaW50ICAgICBiZXN0X2hwZWxfcG9zOyAgICAgICAgICAvKiBiZXN0IHBvc2l0aW9uICovCisgICAgdWludDggICBxcGVsX2NhbmRbOF1bMjQqMTZdOyAgICAgICAgLyogcG9pbnRlciB0byBxdWFydGVyLXBlbCBwb3NpdGlvbiAqLworICAgIGludCAgICAgYmVzdF9xcGVsX3BvczsKKyAgICB1aW50OCAgICpiaWxpbl9iYXNlWzldWzRdOyAgICAvKiBwb2ludGVyIHRvIDQgcG9zaXRpb24gYXQgdG9wIGxlZnQgb2YgYmlsaW5lYXIgcXVhcnRlci1wZWwgKi8KKworICAgIC8qIG5lZWQgZm9yIGludHJhIHJlZnJlc2ggcmF0ZSAqLworICAgIHVpbnQ4ICAgKmludHJhU2VhcmNoOyAgICAgICAvKiBJbnRyYSBBcnJheSBmb3IgTUJzIHRvIGJlIGludHJhIHNlYXJjaGVkICovCisgICAgdWludCAgICBmaXJzdEludHJhUmVmcmVzaE1CSW5keDsgLyoga2VlcCB0cmFjayBmb3IgaW50cmEgcmVmcmVzaCAqLworCisgICAgaW50ICAgICBpNF9zYWQ7ICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSBmb3IgaTQgbW9kZSBTQUQgKi8KKyAgICBpbnQgICAgICptaW5fY29zdDsgICAgICAgICAgLyogTWluaW11bSBjb3N0IGZvciB0aGUgYWxsIE1CcyAqLworICAgIGludCAgICAgbGFtYmRhX21vZGU7ICAgICAgICAvKiBMYWdyYW5nZSBwYXJhbWV0ZXIgZm9yIG1vZGUgc2VsZWN0aW9uICovCisgICAgaW50ICAgICBsYW1iZGFfbW90aW9uOyAgICAgIC8qIExhZ3JhbmdlIHBhcmFtZXRlciBmb3IgTVYgc2VsZWN0aW9uICovCisKKyAgICB1aW50OCAgICptdmJpdHNfYXJyYXk7ICAgICAgLyogVGFibGUgZm9yIGJpdHMgc3BlbnQgaW4gdGhlIGNvc3QgZnVuY2l0b24gKi8KKyAgICB1aW50OCAgICptdmJpdHM7ICAgICAgICAgICAgLyogQW4gb2Zmc2V0IHRvIHRoZSBhYm92ZSBhcnJheS4gKi8KKworICAgIC8qIHRvIHNwZWVkdXAgdGhlIFNBRCBjYWxjdWxhdGlvbiAqLworICAgIHZvaWQgKnNhZF9leHRyYV9pbmZvOworICAgIHVpbnQ4IGN1cnJZTUJbMjU2XTsgICAgIC8qIGludGVybGVhdmVkIGN1cnJlbnQgbWFjcm9ibG9jayBpbiBIVEZNIG9yZGVyICovCisKKyNpZmRlZiBIVEZNCisgICAgaW50IG5ybWx6X3RoWzQ4XTsgICAgICAgLyogVGhyZXNob2xkIGZvciBmYXN0IFNBRCBjYWxjdWxhdGlvbiB1c2luZyBIVEZNICovCisgICAgSFRGTV9TdGF0IGh0Zm1fc3RhdDsgICAgLyogRm9yIHN0YXRpc3RpY3MgY29sbGVjdGlvbiAqLworI2VuZGlmCisKKyAgICAvKiBzdGF0aXN0aWNzICovCisgICAgaW50IG51bUludHJhTUI7ICAgICAgICAgLyoga2VlcCB0cmFjayBvZiBudW1iZXIgb2YgaW50cmEgTUIgKi8KKworICAgIC8qIGVuY29kaW5nIGNvbXBsZXhpdHkgY29udHJvbCAqLworICAgIHVpbnQgZnVsbHNlYXJjaF9lbmFibGU7IC8qIGZsYWcgdG8gZW5hYmxlIGZ1bGwtcGVsIGZ1bGwtc2VhcmNoICovCisKKyAgICAvKiBtaXNjLiovCisgICAgYm9vbCBvdXRPZkJhbmRQYXJhbVNldDsgLyogZmxhZyB0byBlbmFibGUgb3V0LW9mLWJhbmQgcGFyYW0gc2V0ICovCisKKyAgICBBVkNTZXFQYXJhbVNldCBleHRTUFM7IC8qIGZvciBleHRlcm5hbCBTUFMgKi8KKyAgICBBVkNQaWNQYXJhbVNldCBleHRQUFM7IC8qIGZvciBleHRlcm5hbCBQUFMgKi8KKworICAgIC8qIHRpbWUgY29udHJvbCAqLworICAgIHVpbnQzMiAgcHJldkZyYW1lTnVtOyAgIC8qIHByZXZpb3VzIGZyYW1lIG51bWJlciBzdGFydGluZyBmcm9tIG1vZFRpbWVSZWYgKi8KKyAgICB1aW50MzIgIG1vZFRpbWVSZWY7ICAgICAvKiBSZWZlcmVuY2UgbW9kVGltZSB1cGRhdGUgZXZlcnkgSS1Wb3AqLworICAgIHVpbnQzMiAgd3JhcE1vZFRpbWU7ICAgIC8qIE9mZnNldCB0byBtb2RUaW1lIFJlZiwgcmFyZWx5IHVzZWQgKi8KKworICAgIHVpbnQgICAgcHJldlByb2NGcmFtZU51bTsgIC8qIHByZXZpb3VzbHkgcHJvY2Vzc2VkIGZyYW1lIG51bWJlciwgY291bGQgYmUgc2tpcHBlZCAqLworICAgIHVpbnQgICAgcHJldkNvZGVkRnJhbWVOdW07ICAvKiBwcmV2aW91c2x5IGVuY29kZWQgZnJhbWUgbnVtYmVyICovCisgICAgLyogUE9DIHJlbGF0ZWQgdmFyaWFibGVzICovCisgICAgdWludDMyICBkaXNwT3JkUE9DUmVmOyAgICAgIC8qIHJlZmVyZW5jZSBQT0MgaXMgZGlzcGxheWVyIG9yZGVyIHVuaXQuICovCisKKyAgICAvKiBGdW5jdGlvbiBwb2ludGVycyAqLworICAgIEFWQ0VuY0Z1bmNQdHIgKmZ1bmN0aW9uUG9pbnRlcjsgLyogc3RvcmUgcG9pbnRlcnMgdG8gcGxhdGZvcm0gc3BlY2lmaWMgZnVuY3Rpb25zICovCisKKyAgICAvKiBBcHBsaWNhdGlvbiBjb250cm9sIGRhdGEgKi8KKyAgICBBVkNIYW5kbGUgKmF2Y0hhbmRsZTsKKworCit9IEFWQ0VuY09iamVjdDsKKworCisjZW5kaWYgLypBVkNFTkNfSU5UX0hfSU5DTFVERUQqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2xpYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2UyOGVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19saWIuaApAQCAtMCwwICsxLDEwMjAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioKK1RoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbnMgb2YgaW50ZXJuYWwgZnVuY3Rpb25zIGZvciBBVkMgZGVjb2RlciBsaWJyYXJ5LgorQHB1Ymxpc2hlZEFsbAorKi8KKyNpZm5kZWYgQVZDRU5DX0xJQl9IX0lOQ0xVREVECisjZGVmaW5lIEFWQ0VOQ19MSUJfSF9JTkNMVURFRAorCisjaWZuZGVmIEFWQ0xJQl9DT01NT05fSF9JTkNMVURFRAorI2luY2x1ZGUgImF2Y2xpYl9jb21tb24uaCIKKyNlbmRpZgorI2lmbmRlZiBBVkNFTkNfSU5UX0hfSU5DTFVERUQKKyNpbmNsdWRlICJhdmNlbmNfaW50LmgiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKyAgICAvKi0tLS0tLS0tLS0tLS0gYmxvY2suYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSByZXNpZHVlIGNhbGN1bGF0aW9uLCB0cmFuc2Zvcm0sIHF1YW50aXplLCBpbnZlcnNlIHF1YW50aXplLAorICAgIGludmVyc2UgdHJhbnNmb3JtIGFuZCByZXNpZHVlIGNvbXBlbnNhdGlvbiBvbiBhIDR4NCBibG9jay4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gImJsa2lkeCIgICJyYXN0ZXIgc2NhbiBibG9jayBpbmRleCBvZiB0aGUgY3VycmVudCA0eDQgYmxvY2suIgorICAgIFxwYXJhbSAiY3VyIiAgICAiUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCBibG9jay4iCisgICAgXHBhcmFtICJvcmciICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jay4iCisgICAgXHBhcmFtICJjb2VmX2Nvc3QiICAiUG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29zdCB0byBiZSBmaWxsZWQgaW4gYW5kIHJldHVybmVkLiIKKyAgICBccmV0dXJuICJOdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzLiIKKyAgICAqLworICAgIGludCBkY3RfbHVtYShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IGJsa2lkeCwgdWludDggKmN1ciwgdWludDggKm9yZywgaW50ICpjb2VmX2Nvc3QpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBJRENUIG9uIGFuIElOVEVSIG1hY3JvYmxvY2suCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCisgICAgXHBhcmFtICJjdXJMIiAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW4gb2YgdGhlIG1hY3JvYmxvY2sgb24gdGhlIGN1cnJlbnQgZnJhbWUuIgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgQVZDTWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAicGljUGl0Y2giICJQaXRjaCBvZiB0aGUgY3VycmVudCBmcmFtZS4iCisgICAgXHJldHVybiAidm9pZCIuCisgICAgKi8KKyAgICB2b2lkIE1CSW50ZXJJZGN0KEFWQ0NvbW1vbk9iaiAqdmlkZW8sIHVpbnQ4ICpjdXJMLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIGludCBwaWNQaXRjaCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gcmVzaWR1ZSBjYWxjdWxhdGlvbiwgdHJhbnNmb3JtLCBxdWFudGl6ZSwgaW52ZXJzZSBxdWFudGl6ZSwKKyAgICBpbnZlcnNlIHRyYW5zZm9ybSBhbmQgcmVzaWR1ZSBjb21wZW5zYXRpb24gb24gYSBtYWNyb2Jsb2NrLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAiY3VyTCIgICAiUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCBNQi4iCisgICAgXHBhcmFtICJvcmdMIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgTUIuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIGRjdF9sdW1hXzE2eDE2KEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyTCwgdWludDggKm9yZ0wpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHJlc2lkdWUgY2FsY3VsYXRpb24sIHRyYW5zZm9ybSwgcXVhbnRpemUsIGludmVyc2UgcXVhbnRpemUsCisgICAgaW52ZXJzZSB0cmFuc2Zvcm0gYW5kIHJlc2lkdWUgY29tcGVuc2F0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cyBvZiBhbiBNQi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gImN1ckMiICAgIlBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgTUIuIgorICAgIFxwYXJhbSAib3JnQyIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIE1CLiIKKyAgICBccGFyYW0gImNyIiAgICAgIkZsYWcgd2hldGhlciBpdCBpcyBDciBvciBub3QuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIGRjdF9jaHJvbWEoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXJDLCB1aW50OCAqb3JnQywgaW50IGNyKTsKKworICAgIC8qLS0tLS0tLS0tLS0gaW5pdC5jIC0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpbnRlcnByZXRzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIHByb3ZpZGVkIGJ5IHVzZXJzIGluIGVuY1BhcmFtLgorICAgIFRoZSByZXN1bHRzIGFyZSBrZXB0IGluIEFWQ0VuY09iamVjdCwgQVZDU2VxUGFyYW1TZXQsIEFWQ1BpY1BhcmFtU2V0IGFuZCBBVkNTbGljZUhlYWRlci4KKyAgICBccGFyYW0gImVuY3ZpZCIgICAgICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJlbmNQYXJhbSIgICAiUG9pbnRlciB0byBBVkNFbmNQYXJhbS4iCisgICAgXHBhcmFtICJleHRTUFMiICAgICAiRXh0ZXJuYWwgU1BTIHRlbXBsYXRlIHRvIGJlIGZvbGxvd2VkLiBOVUxMIGlmIG5vdCBwcmVzZW50LiIKKyAgICBccGFyYW0gImV4dFBQUyIgICAgICJFeHRlcm5hbCBQUFMgdGVtcGxhdGUgdG8gYmUgZm9sbG93ZWQuIE5VTEwgaWYgbm90IHByZXNlbnQuIgorICAgIFxyZXR1cm4gInNlZSBBVkNFbmNfU3RhdHVzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgIFNldEVuY29kZVBhcmFtKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNFbmNQYXJhbXMgKmVuY1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dFNQUywgdm9pZCAqZXh0UFBTKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMgd2hldGhlciB0aGV5IG1lZXQgdGhlIHNldCBvZiBzdXBwb3J0ZWQKKyAgICB0b29sIGJ5IGEgc3BlY2lmaWMgcHJvZmlsZS4gSWYgdGhlIHByb2ZpbGUgaXMgbm90IHNldCwgaXQgd2lsbCBqdXN0IGZpbmQgdGhlIGNsb3Nlc3QKKyAgICBwcm9maWxlIGluc3RlYWQgb2YgdmVyaWZ5aW5nIGl0LgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAic2VxUGFyYW0iICAgIlBvaW50ZXIgdG8gQVZDU2VxUGFyYW1TZXQuIgorICAgIFxwYXJhbSAicGljUGFyYW0iICAgIlBvaW50ZXIgdG8gQVZDUGljUGFyYW1TZXQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3MsCisgICAgICAgICAgICBBVkNFTkNfUFJPRklMRV9OT1RfU1VQUE9SVEVEIGlmIHRoZSBzcGVjaWZpZWQgcHJvZmlsZQorICAgICAgICAgICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LAorICAgICAgICAgICAgQVZDRU5DX1RPT0xTX05PVF9TVVBQT1JURUQgaWYgYW55IG9mIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgdG9vbHMgYXJlCisgICAgICAgICAgICBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB1c2VyLXNlbGVjdGVkIHByb2ZpbGUuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBWZXJpZnlQcm9maWxlKEFWQ0VuY09iamVjdCAqdmlkZW8sIEFWQ1NlcVBhcmFtU2V0ICpzZXFQYXJhbSwgQVZDUGljUGFyYW1TZXQgKnBpY1BhcmFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMgd2hldGhlciB0aGV5IG1lZXQgdGhlIHJlcXVpcmVtZW50CisgICAgZm9yIGEgc3BlY2lmaWMgbGV2ZWwuIElmIHRoZSBsZXZlbCBpcyBub3Qgc2V0LCBpdCB3aWxsIGp1c3QgZmluZCB0aGUgY2xvc2VzdAorICAgIGxldmVsIGluc3RlYWQgb2YgdmVyaWZ5aW5nIGl0LgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAic2VxUGFyYW0iICAgIlBvaW50ZXIgdG8gQVZDU2VxUGFyYW1TZXQuIgorICAgIFxwYXJhbSAicGljUGFyYW0iICAgIlBvaW50ZXIgdG8gQVZDUGljUGFyYW1TZXQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3MsCisgICAgICAgICAgICBBVkNFTkNfTEVWRUxfTk9UX1NVUFBPUlRFRCBpZiB0aGUgc3BlY2lmaWVkIGxldmVsCisgICAgICAgICAgICAgICAgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksCisgICAgICAgICAgICBBVkNFTkNfTEVWRUxfRkFJTCBpZiBhbnkgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMgZXhjZWVkCisgICAgICAgICAgICB0aGUgcmFuZ2Ugb2YgdGhlIHVzZXItc2VsZWN0ZWQgbGV2ZWwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBWZXJpZnlMZXZlbChBVkNFbmNPYmplY3QgKnZpZGVvLCBBVkNTZXFQYXJhbVNldCAqc2VxUGFyYW0sIEFWQ1BpY1BhcmFtU2V0ICpwaWNQYXJhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmNpdG9uIGluaXRpYWxpemVzIHRoZSBmcmFtZSBlbmNvZGluZyBieSBzZXR0aW5nIHBvYy9mcmFtZV9udW0gcmVsYXRlZCBwYXJhbWV0ZXJzLiBpdAorICAgIGFsc28gcGVyZm9ybXMgbW90aW9uIGVzdGltYXRpb24uCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3MsIEFWQ0VOQ19OT19QSUNUVVJFIGlmIHRoZXJlIGlzIG5vIGlucHV0IHBpY3R1cmUKKyAgICAgICAgICAgIGluIHRoZSBxdWV1ZSB0byBlbmNvZGUsIEFWQ0VOQ19QT0NfRkFJTCBvciBBVkNFTkNfQ09OU0VDVVRJVkVfTk9OUkVGIGZvciBQT0MKKyAgICAgICAgICAgIHJlbGF0ZWQgZXJyb3JzLCBBVkNFTkNfTkVXX0lEUiBpZiBuZXcgSURSIGlzIGRldGVjdGVkLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgSW5pdEZyYW1lKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgc2xpY2UgaGVhZGVyIHJlbGF0ZWQgdmFyaWFibGVzIGFuZCBvdGhlciB2YXJpYWJsZXMgbmVjZXNzYXJ5CisgICAgZm9yIGRlY29kaW5nIG9uZSBzbGljZS4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2Vzcy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEluaXRTbGljZShBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKi0tLS0tLS0tLS0tIGhlYWRlci5jIC0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYml0c3RyZWFtIGVuY29kaW5nIG9mIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IE5BTC4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcyBvciBBVkNFTkNfU1BTX0ZBSUwgb3Igb3RoZXJzIGZvciB1bmV4cGVjdGVkIGZhaWx1cmUgd2hpY2gKKyAgICBzaG91bGQgbm90IG9jY3VyLiBUaGUgU1BTIHBhcmFtZXRlcnMgc2hvdWxkIGFsbCBiZSB2ZXJpZmllZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBFbmNvZGVTUFMoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyB0aGUgVlVJIHBhcmFtZXRlcnMgaW50byB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBiaXRzdHJlYW0uCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJ2dWkiICAgICJQb2ludGVyIHRvIEFWQ1ZVSVBhcmFtcy4iCisgICAgXHJldHVybiAibm90aGluZy4iCisgICAgKi8KKyAgICB2b2lkIEVuY29kZVZVSShBVkNFbmNCaXRzdHJlYW0qIHN0cmVhbSwgQVZDVlVJUGFyYW1zKiB2dWkpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIEhSRCBwYXJhbWV0ZXJzIGludG8gdGhlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgYml0c3RyZWFtCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJocmQiICAgICJQb2ludGVyIHRvIEFWQ0hSRFBhcmFtcy4iCisgICAgXHJldHVybiAibm90aGluZy4iCisgICAgKi8KKyAgICB2b2lkIEVuY29kZUhSRChBVkNFbmNCaXRzdHJlYW0qIHN0cmVhbSwgQVZDSFJEUGFyYW1zKiBocmQpOworCisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGJpdHN0cmVhbSBlbmNvZGluZyBvZiB0aGUgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IE5BTC4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcyBvciBBVkNFTkNfUFBTX0ZBSUwgb3Igb3RoZXJzIGZvciB1bmV4cGVjdGVkIGZhaWx1cmUgd2hpY2gKKyAgICBzaG91bGQgbm90IG9jY3VyLiBUaGUgU1BTIHBhcmFtZXRlcnMgc2hvdWxkIGFsbCBiZSB2ZXJpZmllZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBFbmNvZGVQUFMoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBzbGljZSBoZWFkZXIgaW5mb3JtYXRpb24gd2hpY2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgb3IgZmFicmljYXRlZAorICAgIHByaW9yIHRvIGVudGVyaW5nIHRoaXMgZnVuY2l0b24uCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3Mgb3IgYml0c3RyZWFtIGZhaWwgc3RhdHVzZXMuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBFbmNvZGVTbGljZUhlYWRlcihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyByZWx0ZWQgc3ludGF4LgorICAgIFxwYXJhbSAidmlkZW8iICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJzbGljZUhkciIgIlBvaW50ZXIgdG8gQVZDU2xpY2VIZHIuIgorICAgIFxwYXJhbSAic2xpY2VfdHlwZSIgIlZhbHVlIG9mIHNsaWNlX3R5cGUgLSA1IGlmIGdyZWF0ZXIgdGhhbiA1LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBhbmQgQVZDRU5DX0ZBSUwgb3RoZXJ3aXNlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciwgaW50IHNsaWNlX3R5cGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIGRlY19yZWZfcGljX21hcmtpbmcgcmVsYXRlZCBzeW50YXguCisgICAgXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gInNsaWNlSGRyIiAiUG9pbnRlciB0byBBVkNTbGljZUhkci4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MgYW5kIEFWQ0VOQ19GQUlMIG90aGVyd2lzZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIGRlY19yZWZfcGljX21hcmtpbmcoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkcik7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBQT0MgcmVsYXRlZCB2YXJpYWJsZXMgYW5kIHRoZSBQT0Mgc3ludGF4IHRvIGJlIGVuY29kZWQKKyAgICB0byB0aGUgc2xpY2UgaGVhZGVyIGRlcml2ZWQgZnJvbSB0aGUgZGlzcF9vcmRlciBhbmQgaXNfcmVmZXJlbmNlIGZsYWcgb2YgdGhlIG9yaWdpbmFsCisgICAgaW5wdXQgZnJhbWUgdG8gYmUgZW5jb2RlZC4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcywKKyAgICAgICAgICAgIEFWQ0VOQ19QT0NfRkFJTCBpZiB0aGUgcG9jIHR5cGUgaXMgdW5kZWZpbmVkIG9yCisgICAgICAgICAgICBBVkNFTkNfQ09OU0VDVVRJVkVfTk9OUkVGIGlmIHRoZXJlIGFyZSBjb25zZWN1dGl2ZSBub24tcmVmZXJlbmNlIGZyYW1lIGZvciBQT0MgdHlwZSAyLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgSW5pdFBPQyhBVkNFbmNPYmplY3QgKnZpZGVvKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgUE9DIHJlbGF0ZWQgb3BlcmF0aW9uIGFmdGVyIGEgcGljdHVyZSBpcyBkZWNvZGVkLgorICAgIFxwYXJhbSAidmlkZW8iICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MiCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIFBvc3RQT0MoQVZDQ29tbW9uT2JqICp2aWRlbyk7CisKKyAgICAvKi0tLS0tLS0tLS0tIGJpdHN0cmVhbV9pby5jIC0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGJpdHN0cmVhbSBzdHJ1Y3R1cmUgd2l0aCB0aGUgaW5mb3JtYXRpb24gZ2l2ZW4gYnkKKyAgICB0aGUgdXNlcnMuCisgICAgXHBhcmFtICJiaXRzdHJlYW0iICAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJidWZmZXIiICAgICAiUG9pbnRlciB0byB0aGUgdW5zaWduZWQgY2hhciBidWZmZXIgZm9yIG91dHB1dC4iCisgICAgXHBhcmFtICJidWZfc2l6ZSIgICAiVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcy4iCisgICAgXHBhcmFtICJvdmVycnVuQnVmZmVyIiAgIlBvaW50ZXIgdG8gZXh0cmEgb3ZlcnJ1biBidWZmZXIuIgorICAgIFxwYXJhbSAib0JTaXplIiAgICAgIlNpemUgb2Ygb3ZlcnJ1biBidWZmZXIgaW4gYnl0ZXMuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3MsIEFWQ0VOQ19CSVRTVFJFQU1fSU5JVF9GQUlMIGlmIGZhaWwiCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEJpdHN0cmVhbUVuY0luaXQoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQ4ICpidWZmZXIsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKm92ZXJydW5CdWZmZXIsIGludCBvQlNpemUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGRhdGEgZnJvbSB0aGUgY2FjaGUgaW50byB0aGUgYml0c3RyZWFtIGJ1ZmZlci4gSXQgYWxzbyBhZGRzIHRoZQorICAgIGVtdWxhdGlvbiBwcmV2ZW50aW9uIGNvZGUgaWYgbmVjZXNzYXJ5LgorICAgIFxwYXJhbSAic3RyZWFtIiAgICAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3Mgb3IgQVZDRU5DX0JJVFNUUkVBTV9CVUZGRVJfRlVMTCBpZiBmYWlsLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgQVZDQml0c3RyZWFtU2F2ZVdvcmQoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGNvZGV3b3JkIGludG8gdGhlIGNhY2hlIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBiZSB3cml0dGVuIHRvCisgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIuCisgICAgXHBhcmFtICJzdHJlYW0iICAgICAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJuQml0cyIgICAgICAiTnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvZGV3b3JkLiIKKyAgICBccGFyYW0gImNvZGUiICAgICAgICJUaGUgY29kZXdvcmQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3Mgb3IgQVZDRU5DX0JJVFNUUkVBTV9CVUZGRVJfRlVMTCBpZiBmYWlsLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgQml0c3RyZWFtV3JpdGVCaXRzKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgbkJpdHMsIHVpbnQgY29kZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBvbmUgYml0IG9mIGRhdGEgaW50byB0aGUgY2FjaGUgd2hpY2ggd2lsbCBldmVudHVhbGx5IGJlIHdyaXR0ZW4KKyAgICB0byB0aGUgYml0c3RyZWFtIGJ1ZmZlci4KKyAgICBccGFyYW0gInN0cmVhbSIgICAgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImNvZGUiICAgICAgICJUaGUgY29kZXdvcmQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3Mgb3IgQVZDRU5DX0JJVFNUUkVBTV9CVUZGRVJfRlVMTCBpZiBmYWlsLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgQml0c3RyZWFtV3JpdGUxQml0KEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCB1aW50IGNvZGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBhZGRzIHRyYWlsaW5nIGJpdHMgdG8gdGhlIGJpdHN0cmVhbSBhbmQgcmVwb3J0cyBiYWNrIHRoZSBmaW5hbCBFQlNQIHNpemUuCisgICAgXHBhcmFtICJzdHJlYW0iICAgICAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJuYWxfc2l6ZSIgICAiT3V0cHV0IHRoZSBmaW5hbCBOQUwgc2l6ZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcyBvciBBVkNFTkNfQklUU1RSRUFNX0JVRkZFUl9GVUxMIGlmIGZhaWwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1UcmFpbGluZ0JpdHMoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgKm5hbF9zaXplKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgYml0IHBvc2l0aW9uIGlzIGJ5dGUtYWxpZ25lZCBvciBub3QuCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBiaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJ0cnVlIGlmIGJ5dGUtYWxpZ25lZCwgZmFsc2Ugb3RoZXJ3aXNlLiIKKyAgICAqLworICAgIGJvb2wgYnl0ZV9hbGlnbmVkKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIGF2YWlsYWJpbGl0eSBvZiBvdmVycnVuIGJ1ZmZlciBhbmQgc3dpdGNoZXMgdG8gdXNlIGl0IHdoZW4KKyAgICBub3JtYWwgYnVmZmZlciBpcyBub3QgYmlnIGVub3VnaC4KKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAibnVtRXh0cmFCeXRlcyIgIk51bWJlciBvZiBleHRyYSBieXRlIG5lZWRlZC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1Mgb3IgQVZDRU5DX0ZBSUwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBBVkNCaXRzdHJlYW1Vc2VPdmVycnVuQnVmZmVyKEFWQ0VuY0JpdHN0cmVhbSogc3RyZWFtLCBpbnQgbnVtRXh0cmFCeXRlcyk7CisKKworICAgIC8qLS0tLS0tLS0tLS0tLS0gaW50cmFfZXN0LmMgLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludHJhL2ludGVyIGRlY2lzaW9uIGJhc2VkIG9uIEFCRS4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gIm1pbl9jb3N0IiAgICJCZXN0IGludGVyIGNvc3QuIgorICAgIFxwYXJhbSAiY3VyTCIgICAiUG9pbnRlciB0byB0aGUgY3VycmVudCBNQiBvcmlnaW4gaW4gcmVjb25zdHJ1Y3RlZCBmcmFtZS4iCisgICAgXHBhcmFtICJwaWNQaXRjaCIgIlBpdGNoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lLiIKKyAgICBccmV0dXJuICJCb29sZWFuIGZvciBpbnRyYSBtb2RlLiIKKyAgICAqLworCisvL2Jvb2wgSW50cmFEZWNpc2lvbkFCRShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IG1pbl9jb3N0LCB1aW50OCAqY3VyTCwgaW50IHBpY1BpdGNoKTsKKyAgICBib29sIEludHJhRGVjaXNpb24oaW50ICptaW5fY29zdCwgdWludDggKmN1ciwgaW50IHBpdGNoLCBib29sIGF2ZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludHJhIHByZWRpY3Rpb24gbW9kZSBzZWFyY2guCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJtYm51bSIgICJDdXJyZW50IE1CIG51bWJlci4iCisgICAgXHBhcmFtICJjdXJMIiAgICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IE1CIG9yaWdpbiBpbiByZWNvbnN0cnVjdGVkIGZyYW1lLiIKKyAgICBccGFyYW0gInBpY1BpdGNoIiAiUGl0Y2ggb2YgdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBNQkludHJhU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgbWJudW0sIHVpbnQ4ICpjdXJMLCBpbnQgcGljUGl0Y2gpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYWxsIHRoZSBJMTYgcHJlZGljdGlvbiBtb2RlcyBmb3IgYW4gTUIgYW5kIGtlZXAgaXQgaW4KKyAgICBlbmN2aWQtPnByZWRfaTE2LgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIGludHJhcHJlZF9sdW1hXzE2eDE2KEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBjb3N0IG9mIGFsbCBJMTYgbW9kZXMgYW5kIGNvbXBhcmUgdGhlbSB0byBnZXQgdGhlIG1pbmltdW0uCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJvcmdZIiAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBsdW1hIE1CLiIKKyAgICBccGFyYW0gIm1pbl9jb3N0IiAiUG9pbnRlciB0byB0aGUgbWluaW1hbCBjb3N0IHNvLWZhci4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgZmluZF9jb3N0XzE2eDE2KEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqb3JnWSwgaW50ICptaW5fY29zdCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGNvc3Qgb2YgZWFjaCBJMTYgbW9kZS4KKyAgICBccGFyYW0gIm9yZyIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGx1bWEgTUIuIgorICAgIFxwYXJhbSAib3JnX3BpdGNoIiAiU3RyaWRlIHNpemUgb2YgdGhlIG9yaWdpbmFsIGZyYW1lLiIKKyAgICBccGFyYW0gInByZWQiICAgIlBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gdmFsdWVzLiIKKyAgICBccGFyYW0gIm1pbl9jb3N0IiAiTWluaW1hbCBjb3N0IHNvLWZhci4iCisgICAgXHJldHVybiAiQ29zdCIKKyAgICAqLworCisgICAgaW50IGNvc3RfaTE2KHVpbnQ4ICpvcmcsIGludCBvcmdfcGl0Y2gsIHVpbnQ4ICpwcmVkLCBpbnQgbWluX2Nvc3QpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYWxsIHRoZSBJNCBwcmVkaWN0aW9uIG1vZGVzIGFuZCBzZWxlY3QgdGhlIGJlc3Qgb25lCisgICAgZm9yIGFsbCB0aGUgYmxvY2tzIGluc2lkZSBhIG1hY3JvYmxvY2suSXQgYWxzbyBjYWxscyBkY3RfbHVtYSB0byBnZW5lcmF0ZSB0aGUgcmVjb25zdHJ1Y3RlZAorICAgIE1CLCBhbmQgdHJhbnNmb3JtIGNvZWZmaWNpZW50cyB0byBiZSBlbmNvZGVkLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAibWluX2Nvc3QiICJQb2ludGVyIHRvIHRoZSBtaW5pbWFsIGNvc3Qgc28tZmFyLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBtYl9pbnRyYTR4NF9zZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCAqbWluX2Nvc3QpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBtb3N0IHByb2JhYmxlIEk0IG1vZGUgb2YgYSBnaXZlbiA0eDQgYmxvY2sKKyAgICBmcm9tIG5laWdoYm9yaW5nIGluZm9ybWF0aW9uYWNjb3JkaW5nIHRvIEFWQy9ILjI2NCBzdGFuZGFyZC4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKKyAgICBccGFyYW0gImJsa2lkeCIgIlRoZSBjdXJyZW50IGJsb2NrIGluZGV4LiIKKyAgICBccmV0dXJuICJNb3N0IHByb2JhYmxlIG1vZGUuIgorICAgICovCisgICAgaW50IEZpbmRNb3N0UHJvYmFibGVJNE1vZGUoQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IGJsa2lkeCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIHdoZXJlIGEgbG90IG9mIGFjdGlvbnMgdGFrZSBwbGFjZSBpbiB0aGUgNHg0IGJsb2NrIGxldmVsIGluc2lkZQorICAgIG1iX2ludHJhNHg0X3NlYXJjaC4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gImJsa2lkeCIgIlRoZSBjdXJyZW50IDR4NCBibG9jayBpbmRleC4iCisgICAgXHBhcmFtICJjdXIiICAgICJQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIGJsb2NrLiIKKyAgICBccGFyYW0gIm9yZyIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrLiIKKyAgICBccmV0dXJuICJNaW5pbWFsIGNvc3QsIGFsc28gc2V0IGN1cnJNQi0+aTRNb2RlIgorICAgICovCisgICAgaW50IGJsa19pbnRyYTR4NF9zZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBibGtpZHgsIHVpbnQ4ICpjdXIsIHVpbnQ4ICpvcmcpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjb3N0IG9mIGEgZ2l2ZW4gSTQgcHJlZGljdGlvbiBtb2RlLgorICAgIFxwYXJhbSAib3JnIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2suIgorICAgIFxwYXJhbSAib3JnX3BpdGNoIiAgIlN0cmlkZSBzaXplIG9mIHRoZSBvcmlnaW5hbCBmcmFtZS4iCisgICAgXHBhcmFtICJwcmVkIiAgICJQb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGJsb2NrLiAoZW5jdmlkLT5wcmVkX2k0KSIKKyAgICBccGFyYW0gImNvc3QiICAgIlBvaW50ZXIgdG8gdGhlIG1pbmltYWwgY29zdCAodG8gYmUgdXBkYXRlZCkuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIGNvc3RfaTQodWludDggKm9yZywgaW50IG9yZ19waXRjaCwgdWludDggKnByZWQsIHVpbnQxNiAqY29zdCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNocm9tYSBpbnRyYSBzZWFyY2guIEVhY2ggbW9kZSBpcyBzYXZlZCBpbiBlbmN2aWQtPnByZWRfaWMuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgY2hyb21hX2ludHJhX3NlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGNvc3Qgb2YgYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLgorICAgIFxwYXJhbSAib3JnQ2IiICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgQ2IgYmxvY2suIgorICAgIFxwYXJhbSAib3JnQ3IiICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgQ3IgYmxvY2suIgorICAgIFxwYXJhbSAib3JnX3BpdGNoIiAgIlN0cmlkZSBzaXplIG9mIHRoZSBvcmlnaW5hbCBmcmFtZS4iCisgICAgXHBhcmFtICJwcmVkIiAgICJQb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGJsb2NrIChlbmN2aWQtPnByZWRfaWMpIgorICAgIFxwYXJhbSAibWluY29zdCIgICAgIk1pbmltYWwgY29zdCBzbyBmYXIuIgorICAgIFxyZXR1cm4gIkNvc3QuIgorICAgICovCisKKyAgICBpbnQgU0FURENocm9tYSh1aW50OCAqb3JnQ2IsIHVpbnQ4ICpvcmdDciwgaW50IG9yZ19waXRjaCwgdWludDggKnByZWQsIGludCBtaW5jb3N0KTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0gbW90aW9uX2NvbXAuYyAtLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgVGhpcyBpcyBhIG1haW4gZnVuY3Rpb24gdG8gcGVmb3JtIGludGVyIHByZWRpY3Rpb24uCisgICAgXHBhcmFtICJlbmN2aWQiICAgICAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAidmlkZW8iICAgICAgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKKyAgICBccmV0dXJuICJ2b2lkIi4KKyAgICAqLworICAgIHZvaWQgQVZDTUJNb3Rpb25Db21wKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNDb21tb25PYmogKnZpZGVvKTsKKworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGx1bWEgbW90aW9uIGNvbXBlbnNhdGlvbi4KKyAgICBccGFyYW0gInJlZiIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbiBvZiBhIHJlZmVyZW5jZSBsdW1hLiIKKyAgICBccGFyYW0gInBpY3dpZHRoIiAgICJXaWR0aCBvZiB0aGUgcGljdHVyZS4iCisgICAgXHBhcmFtICJwaWNoZWlnaHQiICAiSGVpZ2h0IG9mIHRoZSBwaWN0dXJlLiIKKyAgICBccGFyYW0gInhfcG9zIiAgIlgtY29vcmRpbmF0ZSBvZiB0aGUgcHJlZGljdGVkIGJsb2NrIGluIHF1YXJ0ZXIgcGVsIHJlc29sdXRpb24uIgorICAgIFxwYXJhbSAieV9wb3MiICAiWS1jb29yZGluYXRlIG9mIHRoZSBwcmVkaWN0ZWQgYmxvY2sgaW4gcXVhcnRlciBwZWwgcmVzb2x1dGlvbi4iCisgICAgXHBhcmFtICJwcmVkIiAgICJQb2ludGVyIHRvIHRoZSBvdXRwdXQgcHJlZGljdGVkIGJsb2NrLiIKKyAgICBccGFyYW0gInByZWRfcGl0Y2giICJXaWR0aCBvZiBwcmVkLiIKKyAgICBccGFyYW0gImJsa3dpZHRoIiAgICJXaWR0aCBvZiB0aGUgY3VycmVudCBwYXJ0aXRpb24uIgorICAgIFxwYXJhbSAiYmxraGVpZ2h0IiAgIkhlaWdodCBvZiB0aGUgY3VycmVudCBwYXJ0aXRpb24uIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIGVMdW1hTW90aW9uQ29tcCh1aW50OCAqcmVmLCBpbnQgcGljd2lkdGgsIGludCBwaWNoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfcG9zLCBpbnQgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnByZWQsIGludCBwcmVkX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVGdWxsUGVsTUModWludDggKmluLCBpbnQgaW53aWR0aCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlSG9yekludGVycDFNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeCk7CisKKyAgICB2b2lkIGVIb3J6SW50ZXJwMk1DKGludCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeCk7CisKKyAgICB2b2lkIGVIb3J6SW50ZXJwM01DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIGludCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlVmVydEludGVycDFNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeSk7CisKKyAgICB2b2lkIGVWZXJ0SW50ZXJwMk1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIGludCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlVmVydEludGVycDNNQyhpbnQgKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHkpOworCisgICAgdm9pZCBlRGlhZ29uYWxJbnRlcnBNQyh1aW50OCAqaW4xLCB1aW50OCAqaW4yLCBpbnQgaW5waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFNb3Rpb25Db21wKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwgaW50IHBpY2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3BvcywgaW50IHlfcG9zLCB1aW50OCAqcHJlZCwgaW50IHByZWRfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlQ2hyb21hRGlhZ29uYWxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYUhvcml6b250YWxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlQ2hyb21hVmVydGljYWxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYUZ1bGxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlQ2hyb21hVmVydGljYWxNQzJfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlQ2hyb21hSG9yaXpvbnRhbE1DMl9TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYURpYWdvbmFsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworCisgICAgLyotLS0tLS0tLS0tLS0tLSBtb3Rpb25fZXN0LmMgLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFycmF5cyBuZWNlc3NhcnkgZm9yIG1vdGlvbiBzZWFyY2ggYWxnb3JpdGhtLgorICAgIFxwYXJhbSAiZW52aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAiQVZDX1NVQ0NFU1Mgb3IgQVZDX01FTU9SWV9GQUlMLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgSW5pdE1vdGlvblNlYXJjaE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSk7CisKKyAgICAvKioKKyAgICBDbGVhbiB1cCBtZW1vcnkgYWxsb2NhdGVkIGluIEluaXRNb3Rpb25TZWFyY2hNb2R1bGUuCisgICAgXHBhcmFtICJlbnZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgQ2xlYW5Nb3Rpb25TZWFyY2hNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpOworCisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIG1vdGlvbiBlc3RpbWF0aW9uIG9mIGFsbCBtYWNyb2Jsb2NrcyBpbiBhIGZyYW1lIGR1cmluZyB0aGUgSW5pdEZyYW1lLgorICAgIFRoZSBnb2FsIGlzIHRvIGZpbmQgdGhlIGJlc3QgTUIgcGFydGl0aW9uIGZvciBpbnRlciBhbmQgZmluZCBvdXQgaWYgaW50cmEgc2VhcmNoIGlzIG5lZWRlZCBmb3IKKyAgICBhbnkgTUJzLiBUaGlzIGludHJhIE1CIHRlbmRlbmN5IGNhbiBiZSB1c2VkIGZvciBzY2VuZSBjaGFuZ2UgZGV0ZWN0aW9uLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIEFWQ01vdGlvbkVzdGltYXRpb24oQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyByZXBldGl0aXZlIGVkZ2UgcGFkZGluZyB0byB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgYnkgYWRkaW5nIDE2IHBpeGVscworICAgIGFyb3VuZCB0aGUgbHVtYSBhbmQgOCBwaXhlbHMgYXJvdW5kIHRoZSBjaHJvbWFzLgorICAgIFxwYXJhbSAicmVmUGljIiAiUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIHBpY3R1cmUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkICBBVkNQYWRkaW5nRWRnZShBVkNQaWN0dXJlRGF0YSAqcmVmUGljKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24ga2VlcHMgdHJhY2sgb2YgaW50cmEgcmVmcmVzaCBtYWNyb2Jsb2NrIGxvY2F0aW9ucy4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGdsb2JhbCBhcnJheSBzdHJ1Y3R1cmUgQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gIm1ibG9jayIgIlBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIEFWQ01hY3JvYmxvY2sgc3RydWN0dXJlcy4iCisgICAgXHBhcmFtICJ0b3RhbE1CIiAiVG90YWwgbnVtYmVyIG9mIE1CcyBpbiBhIGZyYW1lLiIKKyAgICBccGFyYW0gIm51bVJlZnJlc2giICJOdW1iZXIgb2YgTUIgdG8gYmUgaW50cmEgcmVmcmVzaCBpbiBhIHNpbmdsZSBmcmFtZS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgQVZDUmFzdGVySW50cmFVcGRhdGUoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgaW50IHRvdGFsTUIsIGludCBudW1SZWZyZXNoKTsKKworI2lmZGVmIEhURk0KKyAgICB2b2lkIEluaXRIVEZNKFZpZGVvRW5jRGF0YSAqZW5jdmlkLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCwgZG91YmxlICpuZXd2YXIsIGludCAqY29sbGVjdCk7CisgICAgdm9pZCBVcGRhdGVIVEZNKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBkb3VibGUgKm5ld3ZhciwgZG91YmxlICpleHBfbGFtZGEsIEhURk1fU3RhdCAqaHRmbV9zdGF0KTsKKyAgICB2b2lkIENhbGNUaHJlc2hvbGQoZG91YmxlIHBmLCBkb3VibGUgZXhwX2xhbWRhW10sIGludCBucm1sel90aFtdKTsKKyAgICB2b2lkICAgIEhURk1QcmVwYXJlQ3VyTUJfQVZDKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCwgdWludDggKmN1ciwgaW50IHBpdGNoKTsKKyNlbmRpZgorCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaW5wdXQgTUIgaW50byBhIHNtYWxsZXIgZmFzdGVyIG1lbW9yeSBzcGFjZSB0byBtaW5pbWl6ZSB0aGUgY2FjaGUgbWlzcy4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGdsb2JhbCBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAiY3VyIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgaW5wdXQgbWFjcm9ibG9jay4iCisgICAgXHBhcmFtICJwaXRjaCIgICJTdHJpZGUgc2l6ZSBvZiB0aGUgaW5wdXQgZnJhbWUgKGx1bWEpLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCAgICBBVkNQcmVwYXJlQ3VyTUIoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXIsIGludCBwaXRjaCk7CisKKyAgICAvKioKKyAgICBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHNlYXJjaCBmb3IgYSBtYWNyb2Jsb2NrLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgaW5wdXQgZnJhbWUuIgorICAgIFxwYXJhbSAiYmVzdF9jYW5kIiAiQXJyYXkgb2YgYmVzdCBjYW5kaWRhdGVzICh0byBiZSBmaWxsZWQgaW4gYW5kIHJldHVybmVkKS4iCisgICAgXHBhcmFtICJpMCIgICAgICJYLWNvb3JkaW5hdGUgb2YgdGhlIG1hY3JvYmxvY2suIgorICAgIFxwYXJhbSAiajAiICAgICAiWS1jb29yZGluYXRlIG9mIHRoZSBtYWNyb2Jsb2NrLiIKKyAgICBccGFyYW0gInR5cGVfcHJlZCIgIkluZGljYXRlcyB0aGUgdHlwZSBvZiBvcGVyYXRpb25zLiIKKyAgICBccGFyYW0gIkZTX2VuIiAgICAgICJGbGFnIGZvciBmdWxsc2VhcmNoIGVuYWJsZS4iCisgICAgXHBhcmFtICJocF9ndWVzcyIgICAiR3Vlc3MgZm9yIGhhbGYtcGVsIHNlYXJjaC4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgQVZDTUJNb3Rpb25TZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXIsIHVpbnQ4ICpiZXN0X2NhbmRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpMCwgaW50IGowLCBpbnQgdHlwZV9wcmVkLCBpbnQgRlNfZW4sIGludCAqaHBfZ3Vlc3MpOworCisvL0FWQ0VuY19TdGF0dXMgQVZDTUJNb3Rpb25TZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgaW50IG1iTnVtLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3Bhc3MpOworCisgICAgLyoqCisgICAgUGVyZm9ybSBmdWxsLXBlbCBleGhhdXN0aXZlIHNlYXJjaCBhcm91bmQgdGhlIHByZWRpY3RlZCBNVi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJwcmV2IiAgICJQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgZnJhbWUuIgorICAgIFxwYXJhbSAiY3VyIiAgICAiUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4iCisgICAgXHBhcmFtICJpbWluIiAgICJQb2ludGVyIHRvIG1pbmltYWwgbXYgKHgpLiIKKyAgICBccGFyYW0gImptaW4iICAgIlBvaW50ZXIgdG8gbWluaW1hbCBtdiAoeSkuIgorICAgIFxwYXJhbSAiaWxvdywgaWhpZ2gsIGpsb3csIGpoaWdoIiAgICJMb3dlciBib3VuZCBvbiBzZWFyY2ggcmFuZ2UuIgorICAgIFxwYXJhbSAiY212eCwgY212eSIgIlByZWRpY3RlZCBNViB2YWx1ZS4iCisKKyAgICBccmV0dXJuICJUaGUgY29zdCBmdW5jdGlvbiBvZiB0aGUgYmVzdCBjYW5kaWRhdGUuIgorICAgICovCisgICAgaW50IEFWQ0Z1bGxTZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpwcmV2LCB1aW50OCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqaW1pbiwgaW50ICpqbWluLCBpbnQgaWxvdywgaW50IGloaWdoLCBpbnQgamxvdywgaW50IGpoaWdoLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjbXZ4LCBpbnQgY212eSk7CisKKyAgICAvKioKKyAgICBTZWxlY3QgY2FuZGlkYXRlcyBmcm9tIG5laWdoYm9yaW5nIGJsb2NrcyBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgdGhlCisgICAgcHJlZGljdGlvbiBzZWxlY3Rpb24uCisgICAgXHBhcmFtICJtdngiICAgICJQb2ludGVyIHRvIHRoZSBjYW5kaWRhdGUsIHgtY29vcmRpbmF0ZS4iCisgICAgXHBhcmFtICJtdnkiICAgICJQb2ludGVyIHRvIHRoZSBjYW5kaWRhdGUsIHktY29vcmRpbmF0ZS4iCisgICAgXHBhcmFtICJudW1fY2FuIiAgICAiUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGNhbmRpZGF0ZXMgcmV0dXJuZWQuIgorICAgIFxwYXJhbSAiaW1iIiAgICAiVGhlIE1CIGluZGV4IHgtY29vcmRpbmF0ZS4iCisgICAgXHBhcmFtICJqbWIiICAgICJUaGUgTUIgaW5kZXggeS1jb29yZGluYXRlLiIKKyAgICBccGFyYW0gInR5cGVfcHJlZCIgICJUeXBlIG9mIHRoZSBwcmVkaWN0aW9uLiIKKyAgICBccGFyYW0gImNtdngsIGNtdnkiICJQb2ludGVyIHRvIHByZWRpY3RlZCBNViAobW9kaWZpZWQgdmVyc2lvbikuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBBVkNDYW5kaWRhdGVTZWxlY3Rpb24oaW50ICptdngsIGludCAqbXZ5LCBpbnQgKm51bV9jYW4sIGludCBpbWIsIGludCBqbWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCB0eXBlX3ByZWQsIGludCAqY212eCwgaW50ICpjbXZ5KTsKKworICAgIC8qKgorICAgIFV0aWxpdHkgZnVuY3Rpb24gdG8gbW92ZSB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBkbiBhY2NvcmRpbmcgdG8gdGhlIG5ldworICAgIGxvY2F0aW9uIHRvIGF2b2lkIHJlZHVuZGFudCBjYWxjdWxhdGlvbi4KKyAgICBccGFyYW0gImRuIiAiQXJyYXkgb2YgaW50ZWdlciBvZiBzaXplIDkuIgorICAgIFxwYXJhbSAibmV3X2xvYyIgICAgIk5ldyBsb2NhdGlvbiBpbmRleC4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIEFWQ01vdmVOZWlnaGJvclNBRChpbnQgZG5bXSwgaW50IG5ld19sb2MpOworCisgICAgLyoqCisgICAgRmluZCBtaW5pbXVtIGluZGV4IG9mIGRuLgorICAgIFxwYXJhbSAiZG4iICJBcnJheSBvZiBpbnRlZ2VyIG9mIHNpemUgOS4iCisgICAgXHJldHVybiAiVGhlIGluZGV4IG9mIGRuIHdpdGggdGhlIHNtYWxsZXN0IGRuW10gdmFsdWUuIgorICAgICovCisgICAgaW50IEFWQ0ZpbmRNaW4oaW50IGRuW10pOworCisKKyAgICAvKi0tLS0tLS0tLS0tLS0gZmluZGhhbGZwZWwuYyAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgIFNlYXJjaCBmb3IgdGhlIGJlc3QgaGFsZi1wZWwgcmVzb2x1dGlvbiBNViBhcm91bmQgdGhlIGZ1bGwtcGVsIE1WLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZ2xvYmFsIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiY3VyIiAgICAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiIKKyAgICBccGFyYW0gIm1vdCIgICAgIlBvaW50ZXIgdG8gdGhlIEFWQ01WIGFycmF5IG9mIHRoZSBmcmFtZS4iCisgICAgXHBhcmFtICJuY2FuZCIgICJQb2ludGVyIHRvIHRoZSBvcmlnaW4gb2YgdGhlIGZ1bGxzZWFyY2ggcmVzdWx0LiIKKyAgICBccGFyYW0gInhwb3MiICAgIlRoZSBjdXJyZW50IE1CIHBvc2l0aW9uIGluIHguIgorICAgIFxwYXJhbSAieXBvcyIgICAiVGhlIGN1cnJlbnQgTUIgcG9zaXRpb24gaW4geS4iCisgICAgXHBhcmFtICJocF9ndWVzcyIgICAiSW5wdXQgdG8gaGVscCBzcGVlZHVwIHRoZSBzZWFyY2guIgorICAgIFxwYXJhbSAiY212eCwgY212eSIgIlByZWRpY3RlZCBtb3Rpb24gdmVjdG9yIHVzZSBmb3IgbXZjb3N0LiIKKyAgICBccmV0dXJuICJNaW5pbWFsIGNvc3QgKFNBVEQpIHdpdGhvdXQgTVYgY29zdC4gKGZvciByYXRlIGNvbnRyb2wgcHVycG9zZSkiCisgICAgKi8KKyAgICBpbnQgQVZDRmluZEhhbGZQZWxNQihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ciwgQVZDTVYgKm1vdCwgdWludDggKm5jYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4cG9zLCBpbnQgeXBvcywgaW50IGhwX2d1ZXNzLCBpbnQgY212eCwgaW50IGNtdnkpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgc3ViLXBlbCBwaXhlbHMgcmVxdWlyZWQgdG8gZG8gc3VicGVsIE1WIHNlYXJjaC4KKyAgICBccGFyYW0gInN1YnBlbF9wcmVkIiAiUG9pbnRlciB0byAyLUQgYXJyYXksIGVhY2ggYXJyYXkgZm9yIGVhY2ggcG9zaXRpb24uIgorICAgIFxwYXJhbSAibmNhbmQiICJQb2ludGVyIHRvIHRoZSBmdWxsLXBlbCBjZW50ZXIgcG9zaXRpb24gaW4gcmVmIGZyYW1lLiIKKyAgICBccGFyYW0gImx4IiAiUGl0Y2ggb2YgdGhlIHJlZiBmcmFtZS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAgKi8KKyAgICB2b2lkIEdlbmVyYXRlSGFsZlBlbFByZWQodWludDggKnN1YnBlbF9wcmVkLCB1aW50OCAqbmNhbmQsIGludCBseCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGF0IGhhbGYtcG9pbnQgb2Ygc2l6ZSA0eDE3LgorICAgIFxwYXJhbSAiZHN0IiAiUG9pbnRlciB0byBkZXN0aW5hdGlvbi4iCisgICAgXHBhcmFtICJyZWYiICJQb2ludGVyIHRvIHRoZSBzdGFydGluZyByZWZlcmVuY2UgcGl4ZWwuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBWZXJ0SW50ZXJwV0NsaXAodWludDggKmRzdCwgdWludDggKnJlZik7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBxdWFydGVyLXBlbCBwaXhlbHMgYXJvdW5kIHRoZSBiZXN0IGhhbGYtcGVsIHJlc3VsdAorICAgIGR1cmluZyB0aGUgc3ViLXBlbCBNViBzZWFyY2guCisgICAgXHBhcmFtICJiaWxpbl9iYXNlIiAgIkFycmF5IG9mIHBvaW50ZXJzIHRvIGJlIHVzZWQgYXMgYmFzaXMgZm9yIHEtcGVsIGludGVycC4iCisgICAgXHBhcmFtICJxcGVsX3ByZWQiICAiQXJyYXkgb2YgcG9pbnRlcnMgcG9pbnRpbmcgdG8gcXVhcnRlci1wZWwgY2FuZGlkYXRlcy4iCisgICAgXHBhcmFtICJocGVsX3BvcyIgIkJlc3QgaGFsZi1wZWwgcG9zaXRpb24gYXQgdGhlIGNlbnRlci4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgR2VuZXJhdGVRdWFydFBlbFByZWQodWludDggKipiaWxpbl9iYXNlLCB1aW50OCAqcXBlbF9wcmVkLCBpbnQgaHBlbF9wb3MpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQVREIG9mIGEgc3VicGVsIGNhbmRpZGF0ZS4KKyAgICBccGFyYW0gImNhbmQiICAgIlBvaW50ZXIgdG8gYSBjYW5kaWRhdGUuIgorICAgIFxwYXJhbSAiY3VyIiAgICAiUG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jay4iCisgICAgXHBhcmFtICJkbWluIiAgICJNaW4tc28tZmFyIFNBVEQuIgorICAgIFxyZXR1cm4gIlN1bSBvZiBBYnNvbHV0ZSBUcmFuc2Zvcm1lZCBEaWZmZXJlbmNlLiIKKyAgICAqLworICAgIGludCBTQVREX01CKHVpbnQ4ICpjYW5kLCB1aW50OCAqY3VyLCBpbnQgZG1pbik7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0gcmF0ZV9jb250cm9sLmMgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKiogVGhpcyBmdW5jdGlvbiBpcyBhIHV0aWxpdHkgZnVuY3Rpb24uIEl0IHJldHVybnMgYXZlcmFnZSBRUCBvZiB0aGUgcHJldmlvdXNseSBlbmNvZGVkIGZyYW1lLgorICAgIFxwYXJhbSAicmF0ZUN0cmwiICJQb2ludGVyIHRvIEFWQ1JhdGVDb250cm9sIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQXZlcmFnZSBRUC4iCisgICAgKi8KKyAgICBpbnQgR2V0QXZnRnJhbWVRUChBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdGltZXN0YW1wIG9mIHRoZSBpbnB1dCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgc2hvdWxkIGJlIGVuY29kZWQKKyAgICBvciBza2lwcGVkLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJyYXRlQ3RybCIgICAiUG9pbnRlciB0byB0aGUgQVZDUmF0ZUNvbnRyb2wgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gIm1vZFRpbWUiICAgICJUaGUgMzIgYml0IHRpbWVzdGFtcCBvZiB0aGUgaW5wdXQgZnJhbWUuIgorICAgIFxwYXJhbSAiZnJhbWVOdW0iICAgIlBvaW50ZXIgdG8gdGhlIGZyYW1lIG51bWJlciBpZiB0byBiZSBlbmNvZGVkLiIKKyAgICBccmV0dXJuICJBVkNfU1VDQ0VTUyBvciBlbHNlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgUkNEZXRlcm1pbmVGcmFtZU51bShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCB1aW50MzIgbW9kVGltZSwgdWludCAqZnJhbWVOdW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBidWZmZXIgZnVsbG5lc3Mgd2hlbiBmcmFtZXMgYXJlIGRyb3BwZWQgZWl0aGVyIGJ5IHRoZQorICAgIHJhdGUgY29udHJvbCBhbGdvcml0aG0gb3IgYnkgdGhlIHVzZXJzIHRvIG1ha2Ugc3VyZSB0aGF0IHRhcmdldCBiaXQgcmF0ZSBpcyBzdGlsbCBtZXQuCisgICAgXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gdGhlIGNvbW1vbiBvYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInJhdGVDdHJsIiAiUG9pbnRlciB0byByYXRlIGNvbnRyb2wgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImZyYW1lSW5jIiAiRGlmZmVyZW5jZSBvZiB0aGUgY3VycmVudCBmcmFtZSBudW1iZXIgYW5kIHByZXZpb3VzIGZyYW1lIG51bWJlci4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIFJDVXBkYXRlQnVmZmVyKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgaW50IGZyYW1lSW5jKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgcmF0ZSBjb250cm9sIG1vZHVsZSBhbmQgYWxsb2NhdGVzIG5lY2Vzc2FyeSBidWZmZXJlcyB0byBkbyB0aGUgam9iLgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAiUG9pbnRlciB0byB0aGUgZW5jb2RlciBoYW5kbGUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIG9yIEFWQ0VOQ19NRU1PUllfRkFJTC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEluaXRSYXRlQ29udHJvbE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGZyZWVzIGJ1ZmZlcnMgYWxsb2NhdGVkIGluIEluaXRSYXRlQ29udHJvbE1vZHVsZS4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgIlBvaW50ZXIgdG8gdGhlIGVuY29kZXIgaGFuZGxlLiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgQ2xlYW51cFJhdGVDb250cm9sTW9kdWxlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBHT1Agb3IgdGhlIGZpcnN0IElEUiBmcmFtZS4gSXQgY2FsY3VsYXRlcworICAgIHRhcmdldCBiaXRzIGZvciBhIEdPUC4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGVuY29kZXIgb2JqZWN0LiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgUkNJbml0R09QKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0YXJnZXQgYml0cyBmb3IgYSBwYXJ0aWN1bGFyIGZyYW1lLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgUkNJbml0RnJhbWVRUChBVkNFbmNPYmplY3QgKnZpZGVvKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBRUCBmb3IgdGhlIHVwY29taW5nIGZyYW1lIG9yIGJhc2ljIHVuaXQuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBlbmNvZGVyIG9iamVjdC4iCisgICAgXHBhcmFtICJyYXRlQ3RybCIgIlBvaW50ZXIgdG8gdGhlIHJhdGUgY29udHJvbCBvYmplY3QuIgorICAgIFxyZXR1cm4gIlFQIHZhbHVlIHJhbmdpbmcgZnJvbSAwLTUxLiIKKyAgICAqLworICAgIGludCAgUkNDYWxjdWxhdGVRUChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgbHVtYSBRUCB0byBjaHJvbWEgUVAgYW5kIGNhbGN1bGF0ZXMgbGFtYmRhIGJhc2VkIG9uIFFQLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgUkNJbml0Q2hyb21hUVAoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGVuY29kaW5nIGVhY2ggbWFjcm9ibG9jay4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGVuY29kZXIgb2JqZWN0LiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgUkNJbml0TUJRUChBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgYml0cyB1c2FnZSBzdGF0cyBhZnRlciBlbmNvZGluZyBhbiBtYWNyb2Jsb2NrLgorICAgIFxwYXJhbSAidmlkZW8iICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCisgICAgXHBhcmFtICJyYXRlQ3RybCIgIlBvaW50ZXIgdG8gQVZDUmF0ZUNvbnRyb2wuIgorICAgIFxwYXJhbSAibnVtX2hlYWRlcl9iaXRzIiAiTnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgTUIgaGVhZGVyLiIKKyAgICBccGFyYW0gIm51bV90ZXh0dXJlX2JpdHMiICJOdW1iZXIgb2YgYml0cyB1c2VkIGZvciBNQiB0ZXh0dXJlLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBSQ1Bvc3RNQihBVkNDb21tb25PYmogKnZpZGVvLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIGludCBudW1faGVhZGVyX2JpdHMsIGludCBudW1fdGV4dHVyZV9iaXRzKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHByZWRpY3Rpb24gYW5kIG9yaWdpbmFsIE1CLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZW5jb2RlciBvYmplY3QuIgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJvcmdMIiAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgTUIuIgorICAgIFxwYXJhbSAib3JnUGl0Y2giICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBpdGNoLiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgUkNDYWxjdWxhdGVNQUQoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgdWludDggKm9yZ0wsIGludCBvcmdQaXRjaCk7CisKKyAgICAvKioKKyAgICBSZXN0b3JlIFFQIHJlbGF0ZWQgcGFyYW1ldGVycyBvZiBwcmV2aW91cyBNQiB3aGVuIGN1cnJlbnQgTUIgaXMgc2tpcHBlZC4KKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4iCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIHRoZSBjb21tb24gdmlkZW8gc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGdsb2JhbCBlbmNvZGluZyBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIFJDUmVzdG9yZVFQKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgZG9uZSB3aXRoIGEgZnJhbWUuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBlbmNvZGVyIG9iamVjdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1Mgb3IgQVZDRU5DX1NLSVBQRURfUElDVFVSRSB3aGVuIGJ1ZmVyIG92ZXJmbG93IChuZWVkIHRvIGRpc2NhcmQgY3VycmVudCBmcmFtZSkuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBSQ1VwZGF0ZUZyYW1lKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qLS0tLS0tLS0tIHJlc2lkdWFsLmMgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdGhlIGludHJhIHBjbSBkYXRhIGFuZCBmaWxsIGl0IGluIHRoZSBjb3JyZXNwb25kaW5nIGxvY2F0aW9uCisgICAgb24gdGhlIGN1cnJlbnQgcGljdHVyZS4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLCBvciBlbHNlIGZvciBiaXRzdHJlYW0gZXJyb3JzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlSW50cmFQQ00oQVZDRW5jT2JqZWN0ICp2aWRlbyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIENBVkxDIHN5bnRheCBlbmNvZGluZyBvbiB0aGUgcnVuIGFuZCBsZXZlbCBpbmZvcm1hdGlvbiBvZiB0aGUgY29lZmZpY2llbnRzLgorICAgIFRoZSBsZXZlbCBhbmQgcnVuIGFycmF5cyBhcmUgZWxlbWVudHMgaW4gQVZDRW5jT2JqZWN0IHN0cnVjdHVyZSwgcG9wdWxhdGVkIGJ5IFRyYW5zUXVhbnRaWiwKKyAgICBUcmFuc1F1YW50SW50cmFEQyBhbmQgVHJhbnNRdWFudENocm9tYURDIGZ1bmN0aW9ucy4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInR5cGUiICAgIk9uZSBvZiBBVkNSZXNpZHVhbFR5cGUgZm9yIGEgcGFydGljdWxhciA0eDQgYmxvY2suIgorICAgIFxwYXJhbSAiYmluZHgiICAiQmxvY2sgaW5kZXggb3IgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGZvciBBVkNfSW50cmExNkRDIGFuZCBBVkNfQ2hyb21hREMgbW9kZS4iCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4iCisgICAgXE5vdGUgICAiVGhpcyBmdW5jdGlvbiBoYXMgMzItYml0IG1hY2hpbmUgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24hISEhIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBlbmNfcmVzaWR1YWxfYmxvY2soQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1Jlc2lkdWFsVHlwZSB0eXBlLCBpbnQgYmluZHgsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQik7CisKKworICAgIC8qLS0tLS0tLS0tLS0tLSBzYWQuYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBpbnQgQVZDU0FEX01CX0hhbGZQZWxfQ3hoeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSGFsZlBlbF9DeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSGFsZlBlbF9DeGgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTWFjcm9ibG9ja19DKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKworI2lmZGVmIEhURk0gLyogIDMvMi8xLCBIeXBvdGhlc2lzIFRlc3RpbmcgRmFzdCBNYXRjaGluZyAqLworICAgIGludCBBVkNTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGh5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl94LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3gsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5feCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IUF9IVEZNeGh5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IUF9IVEZNeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSFBfSFRGTXhoKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hURk1fQ29sbGVjdCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IVEZNKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyNlbmRpZgorCisKKyAgICAvKi0tLS0tLS0tLS0tLS0gc2xpY2UuYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIG1haW4gZW5jb2RpbmcgbG9vcCBmb3IgYSBzbGljZS4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywgQVZDRU5DX1BJQ1RVUkVfUkVBRFkgZm9yIGVuZC1vZi1waWN0dXJlIGFuZAorICAgICAgICAgICAgIEFWQ0VOQ19GQUlMIG9yIEFWQ0VOQ19TTElDRV9FTVBUWSBvdGhlcndpc2UuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBBVkNFbmNvZGVTbGljZShBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBtYWluIGVuY29kaW5nIG9wZXJhdGlvbiBmb3Igb25lIG1hY3JvYmxvY2suCisgICAgXHBhcmFtICJ2aWRlbyIgInBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcywgb3Igb3RoZXIgYml0c3RyZWFtIHJlbGF0ZWQgZmFpbHVyZSBzdGF0dXMuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBFbmNvZGVNQihBVkNFbmNPYmplY3QgKnZpZGVvKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgcHJlZGljdGlvbiBJTlRSQS9JTlRFUiBmdW5jdGlvbnMsIHRyYW5zZm9ybSwKKyAgICBxdWFudGl6YXRpb24gYW5kIHppZ3phZyBzY2FubmluZyB0byBnZXQgdGhlIHJ1bi1sZXZlbCBzeW1ib2xzLgorICAgIFxwYXJhbSAiZW5jdmlkIiAicG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAiY3VyTCIgICAicG9pbnRlciB0byBMdW1hIGNvbXBvbmVudCBvZiB0aGUgY3VycmVudCBmcmFtZS4KKyAgICBccGFyYW0gImN1ckNiIiAgInBvaW50ZXIgdG8gQ2IgY29tcG9uZW50IG9mIHRoZSBjdXJyZW50IGZyYW1lLgorICAgIFxwYXJhbSAiY3VyQ3IiICAicG9pbnRlciB0byBDciBjb21wb25lbnQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuCisgICAgXHJldHVybiAidm9pZCBmb3Igbm93LiIKKyAgICAgKi8KKyAgICB2b2lkIE1CUHJlZFRyYW5zUXVhbnRaWihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ckwsIHVpbnQ4ICpjdXJDYiwgdWludDggKmN1ckNyKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBjb250ZW50IG9mIHRoZSBwcmVkaWN0aW9uIE1CIGludG8gdGhlIHJlY29uc3RydWN0ZWQgWVVWCisgICAgZnJhbWUgZGlyZWN0bHkuCisgICAgXHBhcmFtICJjdXJMIiAgICJQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBZIGNvbXBvbmVudC4iCisgICAgXHBhcmFtICJjdXJDYiIgICJQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBDYiBjb21wb25lbnQuIgorICAgIFxwYXJhbSAiY3VyQ3IiICAiUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gQ3IgY29tcG9uZW50LiIKKyAgICBccGFyYW0gInByZWRCbG9jayIgICJQb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIE1CLiIKKyAgICBccGFyYW0gInBpY1dpZHRoIiAgICJUaGUgd2lkdGggb2YgdGhlIGZyYW1lLiIKKyAgICBccmV0dXJuICJOb25lLiIKKyAgICAqLworICAgIHZvaWQgQ29weV9NQih1aW50OCAqY3VyTCwgdWludDggKmN1ckNiLCB1aW50OCAqY3VyQ3IsIHVpbnQ4ICpwcmVkQmxvY2ssIGludCBwaWNXaWR0aCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdGhlIG1iX3R5cGUsIENCUCwgcHJlZGljdGlvbiBtb2RlLCByZWYgaWR4IGFuZCBNVi4KKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAidmlkZW8iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlbHNlIGZvciBmYWlsLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlTUJIZWFkZXIoQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNPYmplY3QgKnZpZGVvKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIHJpZ2h0IG1iX3R5cGUgZm9yIGEgbWFjcm9ibG9jayBnaXZlbiB0aGUgbWJNb2RlLCBDQlAsCisgICAgTnVtUGFydCwgUHJlZFBhcnRNb2RlLgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJzbGljZV90eXBlIiAiVmFsdWUgb2YgdGhlIHNsaWNlX3R5cGUuIgorICAgIFxyZXR1cm4gIm1iX3R5cGUuIgorICAgICovCisgICAgdWludCBJbnRlcnByZXRNQlR5cGUoQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgc2xpY2VfdHlwZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdGhlIG1iX3ByZWQgcGFydCBvZiB0aGUgbWFjcm9ibG9jayBkYXRhLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byB0aGUgQVZDQ29tbW9uT2JqIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGJpdHN0cmVhbSBmYWlsIHN0YXR1cy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIG1iX3ByZWQoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdGhlIHN1Yl9tYl9wcmVkIHBhcnQgb2YgdGhlIG1hY3JvYmxvY2sgZGF0YS4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0NvbW1vbk9iaiBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBiaXRzdHJlYW0gZmFpbCBzdGF0dXMuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBzdWJfbWJfcHJlZChBVkNDb21tb25PYmogKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaW50ZXJwcmV0cyB0aGUgc3ViX21iX3R5cGUgYW5kIHNldHMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCisgICAgd2hlbiB0aGUgc2xpY2UgdHlwZSBpcyBBVkNfUF9TTElDRS4KKyAgICBpbiB0aGUgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuCisgICAgXHBhcmFtICJtYmxvY2siICJQb2ludGVyIHRvIGN1cnJlbnQgQVZDTWFjcm9ibG9jay4iCisgICAgXHBhcmFtICJzdWJfbWJfdHlwZSIgIkZyb20gdGhlIHN5bnRheCBiaXRzdHJlYW0uIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIEludGVycHJldFN1Yk1CVHlwZVAoQVZDTWFjcm9ibG9jayAqbWJsb2NrLCB1aW50ICpzdWJfbWJfdHlwZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhlIHN1Yl9tYl90eXBlIGFuZCBzZXRzIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICAgIHdoZW4gdGhlIHNsaWNlIHR5cGUgaXMgQVZDX0JfU0xJQ0UuCisgICAgaW4gdGhlIG1hY3JvYmxvY2sgc3RydWN0dXJlLgorICAgIFxwYXJhbSAibWJsb2NrIiAiUG9pbnRlciB0byBjdXJyZW50IEFWQ01hY3JvYmxvY2suIgorICAgIFxwYXJhbSAic3ViX21iX3R5cGUiICJGcm9tIHRoZSBzeW50YXggYml0c3RyZWFtLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBJbnRlcnByZXRTdWJNQlR5cGVCKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCAqc3ViX21iX3R5cGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIGludHJhIDR4NCBtb2RlLiBJdCBjYWxjdWxhdGVzIHRoZSBwcmVkaWN0ZWQgSTR4NCBtb2RlIGFuZCB0aGUKKyAgICByZW1uYW50IHRvIGJlIGVuY29kZWQuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgQVZDTWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0gc3J1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlSW50cmE0eDRNb2RlKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pOworCisgICAgLyotLS0tLS0tLS0tLS0tIHZsY19lbmNvZGUuYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIGFuZCB3cml0ZXMgYSB2YWx1ZSBpbnRvIGFuIEV4cC1Hb2xvbWIgY29kZXdvcmQuCisgICAgXHBhcmFtICJiaXRzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJjb2RlTnVtIiAiUG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGNvZGVOdW0uIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGJpdHN0cmVhbSBlcnJvciBtZXNzYWdlcyBmb3IgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIHVlX3YoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgY29kZU51bSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIG1hcHMgYW5kIGVuY29kZXMgc2lnbmVkIEV4cC1Hb2xvbWIgY29kZXMuCisgICAgXHBhcmFtICJiaXRzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJ2YWx1ZSIgICJQb2ludGVyIHRvIHN5bnRheCBlbGVtZW50IHZhbHVlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBvciBBVkNFTkNfRkFJTC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzICBzZV92KEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCBpbnQgdmFsdWUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBtYXBzIGFuZCBlbmNvZGVzIHRydW5jYXRlZCBFeHAtR29sb21iIGNvZGVzLgorICAgIFxwYXJhbSAiYml0c3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAidmFsdWUiICAiUG9pbnRlciB0byBzeW50YXggZWxlbWVudCB2YWx1ZS4iCisgICAgXHBhcmFtICJyYW5nZSIgICJSYW5nZSBvZiB0aGUgdmFsdWUgYXMgaW5wdXQgdG8gZGV0ZXJtaW5lIHRoZSBhbGdvcml0aG0uIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIG9yIEFWQ0VOQ19GQUlMLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgdGVfdihBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgdWludCB2YWx1ZSwgdWludCByYW5nZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgRXhwLUdvbG9tYiBjb2Rld29yZCBmcm9tIGNvZGVOdW0uCisgICAgXHBhcmFtICJiaXRzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJjb2RlTnVtIiAiUG9pbnRlciB0byB0aGUgY29kZU51bSB2YWx1ZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgYml0c3RyZWFtIGVycm9yIG1lc3NhZ2VzIGZvciBmYWlsLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgU2V0RUdCaXRzdHJpbmcoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgY29kZU51bSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIENBVkxDIGVuY29kaW5nIG9mIHRoZSBDQlAgKGNvZGVkIGJsb2NrIHBhdHRlcm4pIG9mIGEgbWFjcm9ibG9jaworICAgIGJ5IGNhbGxpbmcgdWVfdigpIGFuZCB0aGVuIG1hcHBpbmcgdGhlIENCUCB0byB0aGUgY29ycmVzcG9uZGluZyBWTEMgY29kZU51bS4KKyAgICBccGFyYW0gImN1cnJNQiIgICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IEFWQ01hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInN0cmVhbSIgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZUNCUChBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyB0cmFpbGluZyBvbmVzIGFuZCB0b3RhbCBjb2VmZmljaWVudC4KKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJUcmFpbGluZ09uZXMiICAgIlRoZSB0cmFpbGluZyBvbmUgdmFyaWFibGUgb3V0cHV0LiIKKyAgICBccGFyYW0gIlRvdGFsQ29lZmYiICJUaGUgdG90YWwgY29lZmZpY2llbnQgdmFyaWFibGUgb3V0cHV0LiIKKyAgICBccGFyYW0gIm5DIiAiQ29udGV4dCBmb3IgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnQgKHByZWRpY3Rpb24gY29udGV4dCkuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVsc2UgZm9yIGJpdHN0cmVhbSBmYWlsdXJlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lcyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IFRyYWlsaW5nT25lcywgaW50IFRvdGFsQ29lZmYsIGludCBuQyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdHJhaWxpbmcgb25lcyBhbmQgdG90YWwgY29lZmZpY2llbnQgZm9yIGNocm9tYSBEQyBibG9jay4KKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJUcmFpbGluZ09uZXMiICAgIlRoZSB0cmFpbGluZyBvbmUgdmFyaWFibGUgb3V0cHV0LiIKKyAgICBccGFyYW0gIlRvdGFsQ29lZmYiICJUaGUgdG90YWwgY29lZmZpY2llbnQgdmFyaWFibGUgb3V0cHV0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlbHNlIGZvciBiaXRzdHJlYW0gZmFpbHVyZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXNDaHJvbWFEQyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IFRyYWlsaW5nT25lcywgaW50IFRvdGFsQ29lZmYpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRvdGFsX3plcm9zIHZhbHVlIGFzIGluIFRhYmxlIDktNyBhbmQgOS04LgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gIlRvdGFsWmVyb3MiICJUaGUgdG90YWxfemVyb3MgdmFsdWUuIgorICAgIFxwYXJhbSAiVG90YWxDb2VmZiIgIlRoZSB0b3RhbCBjb2VmZmljaWVudCB2YXJpYWJsZSBvdXRwdXQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVsc2UgZm9yIGJpdHN0cmVhbSBmYWlsdXJlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgY2VfVG90YWxaZXJvcyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IHRvdGFsX3plcm9zLCBpbnQgVG90YWxDb2VmZik7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdG90YWxfemVyb3MgVkxDIHN5bnRheCBmb3IgY2hyb21hIERDIGFzIGluIFRhYmxlIDktOS4KKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJUb3RhbFplcm9zIiAiVGhlIHRvdGFsX3plcm9zIHZhbHVlLiIKKyAgICBccGFyYW0gIlRvdGFsQ29lZmYiICJUaGUgdG90YWwgY29lZmZpY2llbnQgdmFyaWFibGUgb3V0cHV0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlbHNlIGZvciBiaXRzdHJlYW0gZmFpbHVyZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIGNlX1RvdGFsWmVyb3NDaHJvbWFEQyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IHRvdGFsX3plcm9zLCBpbnQgVG90YWxDb2VmZik7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgcnVuX2JlZm9yZSBWTEMgc3ludGF4IGFzIGluIFRhYmxlIDktMTAuCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAicnVuX2JlZm9yZSIgIlRoZSBydW5fYmVmb3JlIHZhbHVlLiIKKyAgICBccGFyYW0gInplcm9zTGVmdCIgICJUaGUgY29udGV4dCBmb3IgbnVtYmVyIG9mIHplcm9zIGxlZnQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVsc2UgZm9yIGJpdHN0cmVhbSBmYWlsdXJlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgY2VfUnVuQmVmb3JlKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgcnVuX2JlZm9yZSwgaW50IHplcm9zTGVmdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIF9BVkNFTkNfTElCX0hfICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhYjUxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCkBAIC0wLDAgKzEsMzM2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworI2RlZmluZSBXT1JEX1NJWkUgMzIKKworLyogYXJyYXkgZm9yIHRyYWlsaW5nIGJpdCBwYXR0ZXJuIGFzIGZ1bmN0aW9uIG9mIG51bWJlciBvZiBiaXRzICovCisvKiB0aGUgZmlyc3Qgb25lIGlzIHVudXNlZC4gKi8KK2NvbnN0IHN0YXRpYyB1aW50OCB0cmFpbGluZ19iaXRzWzldID0gezAsIDB4MSwgMHgyLCAweDQsIDB4OCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtSW5pdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAxMS80LzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFBvcHVsYXRlIGJpdHN0cmVhbSBzdHJ1Y3R1cmUgd2l0aCBiaXRzdHJlYW0gYnVmZmVyIGFuZCBzaXplICAqLworLyogICAgICAgICAgICAgaXQgYWxzbyBpbml0aWFsaXplcyBpbnRlcm5hbCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDRU5DX0ZBSUwgaWYgZmFpbGVkLiAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiB8LS0tLS0tLS18LS0tLS0tLS18LS0tLX5+fn5+LS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18CisgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXndyaXRlX3BvcyAgICAgICAgICBeYnVmX3NpemUKKyAgIGJpdHN0cmVhbUJ1ZmZlciAgICAgICAgICAgICAgICAgIDwtLS0tLS0tLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3dvcmQKKworICAgfC0tLS0teHh4eHh4eHh4eHh4eHwgID0gY3VycmVudF93b3JkIDMyIG9yIDE2IGJpdHMKKyAgICA8LS0tLT4KKyAgICAgYml0X2xlZnQKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1FbmNJbml0KEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCB1aW50OCAqYnVmZmVyLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKm92ZXJydW5CdWZmZXIsIGludCBvQlNpemUpCit7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMIHx8IGJ1Zl9zaXplIDw9IDApCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0JJVFNUUkVBTV9JTklUX0ZBSUw7CisgICAgfQorCisgICAgc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgPSBidWZmZXI7CisKKyAgICBzdHJlYW0tPmJ1Zl9zaXplID0gYnVmX3NpemU7CisKKyAgICBzdHJlYW0tPndyaXRlX3BvcyA9IDA7CisKKyAgICBzdHJlYW0tPmNvdW50X3plcm9zID0gMDsKKworICAgIHN0cmVhbS0+Y3VycmVudF93b3JkID0gMDsKKworICAgIHN0cmVhbS0+Yml0X2xlZnQgPSBXT1JEX1NJWkU7CisKKyAgICBzdHJlYW0tPm92ZXJydW5CdWZmZXIgPSBvdmVycnVuQnVmZmVyOworCisgICAgc3RyZWFtLT5vQlNpemUgPSBvQlNpemU7CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQVZDQml0c3RyZWFtU2F2ZVdvcmQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMy8yOS8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBTYXZlIHRoZSBjdXJyZW50X3dvcmQgaW50byB0aGUgYnVmZmVyLCBieXRlLXN3YXAsIGFuZCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBhZGQgZW11bGF0aW9uIHByZXZlbnRpb24gaW5zZXJ0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIEFWQ0VOQ19XUklURV9GQUlMIGlmIGJ1ZmZlciBpcyAgKi8KKy8qICAgICAgICAgICAgICBmdWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0FWQ0VuY19TdGF0dXMgQVZDQml0c3RyZWFtU2F2ZVdvcmQoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgaW50IG51bV9iaXRzOworICAgIHVpbnQ4ICp3cml0ZV9wbnQsIGJ5dGU7CisgICAgdWludCBjdXJyZW50X3dvcmQ7CisKKyAgICAvKiBjaGVjayBudW1iZXIgb2YgYnl0ZXMgaW4gY3VycmVudF93b3JkLCBtdXN0IGFsd2F5cyBiZSBieXRlLWFsaWduZWQhISEhICovCisgICAgbnVtX2JpdHMgPSBXT1JEX1NJWkUgLSBzdHJlYW0tPmJpdF9sZWZ0OyAvKiBtdXN0IGJlIG11bHRpcGxlIG9mIDggISEqLworCisgICAgaWYgKHN0cmVhbS0+YnVmX3NpemUgLSBzdHJlYW0tPndyaXRlX3BvcyA8PSAobnVtX2JpdHMgPj4gMykgKyAyKSAvKiAyIG1vcmUgYnl0ZXMgZm9yIHBvc3NpYmxlIEVQQlMgKi8KKyAgICB7CisgICAgICAgIGlmIChBVkNFTkNfU1VDQ0VTUyAhPSBBVkNCaXRzdHJlYW1Vc2VPdmVycnVuQnVmZmVyKHN0cmVhbSwgKG51bV9iaXRzID4+IDMpICsgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfQklUU1RSRUFNX0JVRkZFUl9GVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLyogd3JpdGUgd29yZCwgYnl0ZS1ieS1ieXRlICovCisgICAgd3JpdGVfcG50ID0gc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgKyBzdHJlYW0tPndyaXRlX3BvczsKKyAgICBjdXJyZW50X3dvcmQgPSBzdHJlYW0tPmN1cnJlbnRfd29yZDsKKyAgICB3aGlsZSAobnVtX2JpdHMpIC8qIG5vIG5lZWQgdG8gY2hlY2sgc3RyZWFtLT5idWZfc2l6ZSBhbmQgc3RyZWFtLT53cml0ZV9wb3MsIHRha2VuIGNhcmUgYWxyZWFkeSAqLworICAgIHsKKyAgICAgICAgbnVtX2JpdHMgLT0gODsKKyAgICAgICAgYnl0ZSA9IChjdXJyZW50X3dvcmQgPj4gbnVtX2JpdHMpICYgMHhGRjsKKyAgICAgICAgaWYgKGJ5dGUgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgKndyaXRlX3BudCsrID0gYnl0ZTsKKyAgICAgICAgICAgIHN0cmVhbS0+d3JpdGVfcG9zKys7CisgICAgICAgICAgICBzdHJlYW0tPmNvdW50X3plcm9zID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmVhbS0+Y291bnRfemVyb3MrKzsKKyAgICAgICAgICAgICp3cml0ZV9wbnQrKyA9IGJ5dGU7CisgICAgICAgICAgICBzdHJlYW0tPndyaXRlX3BvcysrOworICAgICAgICAgICAgaWYgKHN0cmVhbS0+Y291bnRfemVyb3MgPT0gMikKKyAgICAgICAgICAgIHsgICAvKiBmb3IgbnVtX2JpdHMgPSAzMiwgdGhpcyBjYW4gYWRkIDIgbW9yZSBieXRlcyBleHRyYSBmb3IgRVBCUyAqLworICAgICAgICAgICAgICAgICp3cml0ZV9wbnQrKyA9IDB4MzsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPndyaXRlX3BvcysrOworICAgICAgICAgICAgICAgIHN0cmVhbS0+Y291bnRfemVyb3MgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogcmVzZXQgY3VycmVudF93b3JkIGFuZCBiaXRfbGVmdCAqLworICAgIHN0cmVhbS0+Y3VycmVudF93b3JkID0gMDsKKyAgICBzdHJlYW0tPmJpdF9sZWZ0ID0gV09SRF9TSVpFOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbVdyaXRlQml0cygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMy8yOS8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBXcml0ZSB1cCB0byBtYWNoaW5lIHdvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IFVudXNlZCBiaXRzIGluICdjb2RlJyBtdXN0IGJlIGFsbCB6ZXJvcy4gICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBBVkNFTkNfV1JJVEVfRkFJTCBpZiBidWZmZXIgaXMgICovCisvKiAgICAgICAgICAgICAgZnVsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitBVkNFbmNfU3RhdHVzIEJpdHN0cmVhbVdyaXRlQml0cyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IG5CaXRzLCB1aW50IGNvZGUpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBpbnQgYml0X2xlZnQgPSBzdHJlYW0tPmJpdF9sZWZ0OworICAgIHVpbnQgY3VycmVudF93b3JkID0gc3RyZWFtLT5jdXJyZW50X3dvcmQ7CisKKyAgICAvL0RFQlVHX0xPRyh1c2VyRGF0YSxBVkNfTE9HVFlQRV9JTkZPLCJCaXRzdHJlYW1Xcml0ZUJpdHMiLG5CaXRzLC0xKTsKKworICAgIGlmIChuQml0cyA+IFdPUkRfU0laRSkgLyogaGFzIHRvIGJlIHRha2VuIGNhcmUgb2Ygc3BlY2lhbGx5ICovCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7IC8qIGZvciBub3cgKi8KKyAgICAgICAgLyogb3RoZXJ3aXNlLCBicmVhayBpdCBkb3duIHRvIDIgd3JpdGUgb2YgbGVzcyB0aGFuIDE2IGJpdHMgYXQgYSB0aW1lLiAqLworICAgIH0KKworICAgIGlmIChuQml0cyA8PSBiaXRfbGVmdCkgLyogbW9yZSBiaXRzIGxlZnQgaW4gY3VycmVudF93b3JkICovCisgICAgeworICAgICAgICBzdHJlYW0tPmN1cnJlbnRfd29yZCA9IChjdXJyZW50X3dvcmQgPDwgbkJpdHMpIHwgY29kZTsKKyAgICAgICAgc3RyZWFtLT5iaXRfbGVmdCAtPSBuQml0czsKKyAgICAgICAgaWYgKHN0cmVhbS0+Yml0X2xlZnQgPT0gMCkgLyogcHJlcGFyZSBmb3IgdGhlIG5leHQgd29yZCAqLworICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBBVkNCaXRzdHJlYW1TYXZlV29yZChzdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdHJlYW0tPmN1cnJlbnRfd29yZCA9IChjdXJyZW50X3dvcmQgPDwgYml0X2xlZnQpIHwgKGNvZGUgPj4gKG5CaXRzIC0gYml0X2xlZnQpKTsKKworICAgICAgICBuQml0cyAtPSBiaXRfbGVmdDsKKworICAgICAgICBzdHJlYW0tPmJpdF9sZWZ0ID0gMDsKKworICAgICAgICBzdGF0dXMgPSBBVkNCaXRzdHJlYW1TYXZlV29yZChzdHJlYW0pOyAvKiBzYXZlIGN1cnJlbnQgd29yZCAqLworCisgICAgICAgIHN0cmVhbS0+Yml0X2xlZnQgPSBXT1JEX1NJWkUgLSBuQml0czsKKworICAgICAgICBzdHJlYW0tPmN1cnJlbnRfd29yZCA9IGNvZGU7IC8qIG5vIGV4dHJhIG1hc2tpbmcgZm9yIGNvZGUsIG11c3QgYmUgaGFuZGxlZCBiZWZvcmUgc2F2aW5nICovCisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbVdyaXRlMUJpdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMy8zMC8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBXcml0ZSAxIGJpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IFVudXNlZCBiaXRzIGluICdjb2RlJyBtdXN0IGJlIGFsbCB6ZXJvcy4gICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBBVkNFTkNfV1JJVEVfRkFJTCBpZiBidWZmZXIgaXMgICovCisvKiAgICAgICAgICAgICAgZnVsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitBVkNFbmNfU3RhdHVzIEJpdHN0cmVhbVdyaXRlMUJpdChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgdWludCBjb2RlKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworICAgIHVpbnQgY3VycmVudF93b3JkID0gc3RyZWFtLT5jdXJyZW50X3dvcmQ7CisKKyAgICAvL0RFQlVHX0xPRyh1c2VyRGF0YSxBVkNfTE9HVFlQRV9JTkZPLCJCaXRzdHJlYW1Xcml0ZTFCaXQiLGNvZGUsLTEpOworCisgICAgLy9pZigxIDw9IGJpdF9sZWZ0KSAvKiBtb3JlIGJpdHMgbGVmdCBpbiBjdXJyZW50X3dvcmQgKi8KKyAgICAvKiB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlcmUgYWx3YXlzIGJlIHBvc2l0aXZlIGJpdF9sZWZ0IGluIHRoZSBjdXJyZW50IHdvcmQgKi8KKyAgICBzdHJlYW0tPmN1cnJlbnRfd29yZCA9IChjdXJyZW50X3dvcmQgPDwgMSkgfCBjb2RlOworICAgIHN0cmVhbS0+Yml0X2xlZnQtLTsKKyAgICBpZiAoc3RyZWFtLT5iaXRfbGVmdCA9PSAwKSAvKiBwcmVwYXJlIGZvciB0aGUgbmV4dCB3b3JkICovCisgICAgeworICAgICAgICBzdGF0dXMgPSBBVkNCaXRzdHJlYW1TYXZlV29yZChzdHJlYW0pOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbVRyYWlsaW5nQml0cygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMy8zMS8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBBZGQgdHJhaWxpbmcgYml0cyBhbmQgcmVwb3J0IHRoZSBmaW5hbCBFQlNQIHNpemUuICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBBVkNFTkNfV1JJVEVfRkFJTCBpZiBidWZmZXIgaXMgICovCisvKiAgICAgICAgICAgICAgZnVsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitBVkNFbmNfU3RhdHVzIEJpdHN0cmVhbVRyYWlsaW5nQml0cyhBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgdWludCAqbmFsX3NpemUpCit7CisgICAgKHZvaWQpKG5hbF9zaXplKTsKKworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworICAgIGludCBiaXRfbGVmdCA9IGJpdHN0cmVhbS0+Yml0X2xlZnQ7CisKKyAgICBiaXRfbGVmdCAmPSAweDc7IC8qIG1vZHVsbyBieSA4ICovCisgICAgaWYgKGJpdF9sZWZ0ID09IDApIGJpdF9sZWZ0ID0gODsKKyAgICAvKiBiaXRzdHJlYW0tPmJpdF9sZWZ0ID09IDAgY2Fubm90IGhhcHBlbiBoZXJlIHNpbmNlIGl0IHdvdWxkIGhhdmUgYmVlbiBTYXZlZCBhbHJlYWR5ICovCisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoYml0c3RyZWFtLCBiaXRfbGVmdCwgdHJhaWxpbmdfYml0c1tiaXRfbGVmdF0pOworCisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyogaWYgaXQncyBub3Qgc2F2ZWQsIHNhdmUgaXQuICovCisgICAgLy9pZihiaXRzdHJlYW0tPmJpdF9sZWZ0PChXT1JEX1NJWkU8PDMpKSAvKiBpbiBmYWN0LCBubyBuZWVkIHRvIGNoZWNrICovCisgICAgeworICAgICAgICBzdGF0dXMgPSBBVkNCaXRzdHJlYW1TYXZlV29yZChiaXRzdHJlYW0pOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIGNoZWNrIHdoZXRoZXIgaXQncyBieXRlLWFsaWduZWQgKi8KK2Jvb2wgYnl0ZV9hbGlnbmVkKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKQoreworICAgIGlmIChzdHJlYW0tPmJpdF9sZWZ0ICUgOCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHRydWU7Cit9CisKKworLyogZGV0ZXJtaW5lIHdoZXRoZXIgb3ZlcnJ1biBidWZmZXIgY2FuIGJlIHVzZWQgb3Igbm90ICovCitBVkNFbmNfU3RhdHVzIEFWQ0JpdHN0cmVhbVVzZU92ZXJydW5CdWZmZXIoQVZDRW5jQml0c3RyZWFtKiBzdHJlYW0sIGludCBudW1FeHRyYUJ5dGVzKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopc3RyZWFtLT5lbmN2aWQ7CisKKyAgICBpZiAoc3RyZWFtLT5vdmVycnVuQnVmZmVyICE9IE5VTEwpIC8vIG92ZXJydW5CdWZmZXIgaXMgc2V0CisgICAgeworICAgICAgICBpZiAoc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgIT0gc3RyZWFtLT5vdmVycnVuQnVmZmVyKSAvLyBub3QgYWxyZWFkeSB1c2VkCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0tPndyaXRlX3BvcyArIG51bUV4dHJhQnl0ZXMgPj0gc3RyZWFtLT5vQlNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUgPSBzdHJlYW0tPndyaXRlX3BvcyArIG51bUV4dHJhQnl0ZXMgKyAxMDA7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUgJj0gKH4weDMpOyAvLyBtYWtlIGl0IG11bHRpcGxlIG9mIDQKKworICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIG5ldyBvdmVycnVuIEJ1ZmZlcgorICAgICAgICAgICAgICAgIGlmIChlbmN2aWQtPm92ZXJydW5CdWZmZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmN2aWQtPmF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSgodWludDMyKillbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpZW5jdmlkLT5vdmVycnVuQnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbmN2aWQtPm9CU2l6ZSA9IHN0cmVhbS0+b0JTaXplOworICAgICAgICAgICAgICAgIGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlciA9ICh1aW50OCopIGVuY3ZpZC0+YXZjSGFuZGxlLT5DQkFWQ19NYWxsb2MoZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+b0JTaXplLCBERUZBVUxUX0FUVFIpOworCisgICAgICAgICAgICAgICAgc3RyZWFtLT5vdmVycnVuQnVmZmVyID0gZW5jdmlkLT5vdmVycnVuQnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0tPm92ZXJydW5CdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgZXZlcnl0aGluZyB0byBvdmVycnVuIGJ1ZmZlciBhbmQgc3RhcnQgdXNpbmcgaXQuCisgICAgICAgICAgICBtZW1jcHkoc3RyZWFtLT5vdmVycnVuQnVmZmVyLCBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciwgc3RyZWFtLT53cml0ZV9wb3MpOworICAgICAgICAgICAgc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgPSBzdHJlYW0tPm92ZXJydW5CdWZmZXI7CisgICAgICAgICAgICBzdHJlYW0tPmJ1Zl9zaXplID0gc3RyZWFtLT5vQlNpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvLyBvdmVycnVuIGJ1ZmZlciBpcyBhbHJlYWR5IHVzZWQKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUgPSBzdHJlYW0tPndyaXRlX3BvcyArIG51bUV4dHJhQnl0ZXMgKyAxMDA7CisgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSAmPSAofjB4Myk7IC8vIG1ha2UgaXQgbXVsdGlwbGUgb2YgNAorCisgICAgICAgICAgICAvLyBhbGxvY2F0ZSBuZXcgb3ZlcnJ1biBidWZmZXIKKyAgICAgICAgICAgIGVuY3ZpZC0+b0JTaXplID0gc3RyZWFtLT5vQlNpemU7CisgICAgICAgICAgICBlbmN2aWQtPm92ZXJydW5CdWZmZXIgPSAodWludDgqKSBlbmN2aWQtPmF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKGVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+b0JTaXplLCBERUZBVUxUX0FUVFIpOworCisgICAgICAgICAgICBpZiAoZW5jdmlkLT5vdmVycnVuQnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIGNvcHkgZnJvbSB0aGUgb2xkIGJ1ZmZlciB0byBuZXcgYnVmZmVyCisgICAgICAgICAgICBtZW1jcHkoZW5jdmlkLT5vdmVycnVuQnVmZmVyLCBzdHJlYW0tPm92ZXJydW5CdWZmZXIsIHN0cmVhbS0+d3JpdGVfcG9zKTsKKyAgICAgICAgICAgIC8vIGZyZWUgb2xkIGJ1ZmZlcgorICAgICAgICAgICAgZW5jdmlkLT5hdmNIYW5kbGUtPkNCQVZDX0ZyZWUoKHVpbnQzMiopZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzdHJlYW0tPm92ZXJydW5CdWZmZXIpOworCisgICAgICAgICAgICAvLyBhc3NpZ24gcG9pbnRlciB0byBuZXcgYnVmZmVyCisgICAgICAgICAgICBzdHJlYW0tPm92ZXJydW5CdWZmZXIgPSBlbmN2aWQtPm92ZXJydW5CdWZmZXI7CisgICAgICAgICAgICBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9IHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlcjsKKyAgICAgICAgICAgIHN0cmVhbS0+YnVmX3NpemUgPSBzdHJlYW0tPm9CU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZSAvLyBvdmVycnVuQnVmZmVyIGlzIG5vdCBlbmFibGUuCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7CisgICAgfQorCit9CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYmxvY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2Jsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWUyNmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2Jsb2NrLmNwcApAQCAtMCwwICsxLDEyODMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorCisvKiBzdWJ0cmFjdCB3aXRoIHRoZSBwcmVkaWN0aW9uIGFuZCBkbyB0cmFuc2Zvcm1hdGlvbiAqLwordm9pZCB0cmFucyh1aW50OCAqY3VyLCBpbnQgcGl0Y2gsIHVpbnQ4ICpwcmVkQmxvY2ssIGludDE2ICpkYXRhQmxvY2spCit7CisgICAgaW50MTYgKnB0ciA9IGRhdGFCbG9jazsKKyAgICBpbnQgcjAsIHIxLCByMiwgcjMsIGo7CisgICAgaW50IGN1cnBpdGNoID0gKHVpbnQpcGl0Y2ggPj4gMTY7CisgICAgaW50IHByZWRwaXRjaCA9IChwaXRjaCAmIDB4RkZGRik7CisKKyAgICAvKiBob3Jpem9udGFsICovCisgICAgaiA9IDQ7CisgICAgd2hpbGUgKGogPiAwKQorICAgIHsKKyAgICAgICAgLyogY2FsY3VsYXRlIHRoZSByZXNpZHVlIGZpcnN0ICovCisgICAgICAgIHIwID0gY3VyWzBdIC0gcHJlZEJsb2NrWzBdOworICAgICAgICByMSA9IGN1clsxXSAtIHByZWRCbG9ja1sxXTsKKyAgICAgICAgcjIgPSBjdXJbMl0gLSBwcmVkQmxvY2tbMl07CisgICAgICAgIHIzID0gY3VyWzNdIC0gcHJlZEJsb2NrWzNdOworCisgICAgICAgIHIwICs9IHIzOyAgICAgICAgICAgLy9wdHJbMF0gKyBwdHJbM107CisgICAgICAgIHIzID0gcjAgLSAocjMgPDwgMSk7ICAgIC8vcHRyWzBdIC0gcHRyWzNdOworICAgICAgICByMSArPSByMjsgICAgICAgICAgIC8vcHRyWzFdICsgcHRyWzJdOworICAgICAgICByMiA9IHIxIC0gKHIyIDw8IDEpOyAgICAvL3B0clsxXSAtIHB0clsyXTsKKworICAgICAgICBwdHJbMF0gPSByMCArIHIxOworICAgICAgICBwdHJbMl0gPSByMCAtIHIxOworICAgICAgICBwdHJbMV0gPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgcHRyWzNdID0gcjMgLSAocjIgPDwgMSk7CisKKyAgICAgICAgcHRyICs9IDE2OworICAgICAgICBwcmVkQmxvY2sgKz0gcHJlZHBpdGNoOworICAgICAgICBjdXIgKz0gY3VycGl0Y2g7CisgICAgICAgIGotLTsKKyAgICB9CisgICAgLyogdmVydGljYWwgKi8KKyAgICBwdHIgPSBkYXRhQmxvY2s7CisgICAgaiA9IDQ7CisgICAgd2hpbGUgKGogPiAwKQorICAgIHsKKyAgICAgICAgcjAgPSBwdHJbMF0gKyBwdHJbNDhdOworICAgICAgICByMyA9IHB0clswXSAtIHB0cls0OF07CisgICAgICAgIHIxID0gcHRyWzE2XSArIHB0clszMl07CisgICAgICAgIHIyID0gcHRyWzE2XSAtIHB0clszMl07CisKKyAgICAgICAgcHRyWzBdID0gcjAgKyByMTsKKyAgICAgICAgcHRyWzMyXSA9IHIwIC0gcjE7CisgICAgICAgIHB0clsxNl0gPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgcHRyWzQ4XSA9IHIzIC0gKHIyIDw8IDEpOworCisgICAgICAgIHB0cisrOworICAgICAgICBqLS07CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisvKiBkbyByZXNpZHVlIHRyYW5zZm9ybSBxdWFudCBpbnZxdWFudCwgaW52dHJhbnMgYW5kIHdyaXRlIG91dHB1dCBvdXQgKi8KK2ludCBkY3RfbHVtYShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IGJsa2lkeCwgdWludDggKmN1ciwgdWludDggKm9yZywgaW50ICpjb2VmX2Nvc3QpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBvcmdfcGl0Y2ggPSBlbmN2aWQtPmN1cnJJbnB1dC0+cGl0Y2g7CisgICAgaW50IHBpdGNoID0gdmlkZW8tPmN1cnJQaWMtPnBpdGNoOworICAgIGludDE2ICpjb2VmID0gdmlkZW8tPmJsb2NrOworICAgIHVpbnQ4ICpwcmVkID0gdmlkZW8tPnByZWRfYmxvY2s7IC8vIHNpemUgMTYgZm9yIGEgNHg0IGJsb2NrCisgICAgaW50IHByZWRfcGl0Y2ggPSB2aWRlby0+cHJlZF9waXRjaDsKKyAgICBpbnQgcjAsIHIxLCByMiwgcjMsIGosIGssIGlkeDsKKyAgICBpbnQgKmxldmVsLCAqcnVuOworICAgIGludCBRcSwgUnEsIHFfYml0cywgcXBfY29uc3QsIHF1YW50OworICAgIGludCBkYXRhLCBsZXYsIHplcm9fcnVuOworICAgIGludCBudW1jb2VmZjsKKworICAgIGNvZWYgKz0gKChibGtpZHggJiAweDMpIDw8IDIpICsgKChibGtpZHggPj4gMikgPDwgNik7IC8qIHBvaW50IHRvIHRoZSA0eDQgYmxvY2sgKi8KKworICAgIC8qIGZpcnN0IHRha2UgYSA0eDQgdHJhbnNmb3JtICovCisgICAgLyogaG9yaXpvbnRhbCAqLworICAgIGogPSA0OworICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcmVzaWR1ZSBmaXJzdCAqLworICAgICAgICByMCA9IG9yZ1swXSAtIHByZWRbMF07ICAgLyogT1BUSU1JWkVBQkxFICovCisgICAgICAgIHIxID0gb3JnWzFdIC0gcHJlZFsxXTsKKyAgICAgICAgcjIgPSBvcmdbMl0gLSBwcmVkWzJdOworICAgICAgICByMyA9IG9yZ1szXSAtIHByZWRbM107CisKKyAgICAgICAgcjAgKz0gcjM7ICAgICAgICAgICAvL3B0clswXSArIHB0clszXTsKKyAgICAgICAgcjMgPSByMCAtIChyMyA8PCAxKTsgICAgLy9wdHJbMF0gLSBwdHJbM107CisgICAgICAgIHIxICs9IHIyOyAgICAgICAgICAgLy9wdHJbMV0gKyBwdHJbMl07CisgICAgICAgIHIyID0gcjEgLSAocjIgPDwgMSk7ICAgIC8vcHRyWzFdIC0gcHRyWzJdOworCisgICAgICAgIGNvZWZbMF0gPSByMCArIHIxOworICAgICAgICBjb2VmWzJdID0gcjAgLSByMTsKKyAgICAgICAgY29lZlsxXSA9IChyMyA8PCAxKSArIHIyOworICAgICAgICBjb2VmWzNdID0gcjMgLSAocjIgPDwgMSk7CisKKyAgICAgICAgY29lZiArPSAxNjsKKyAgICAgICAgb3JnICs9IG9yZ19waXRjaDsKKyAgICAgICAgcHJlZCArPSBwcmVkX3BpdGNoOworICAgICAgICBqLS07CisgICAgfQorICAgIC8qIHZlcnRpY2FsICovCisgICAgY29lZiAtPSA2NDsKKyAgICBwcmVkIC09IChwcmVkX3BpdGNoIDw8IDIpOworICAgIGogPSA0OworICAgIHdoaWxlIChqID4gMCkgICAvKiBPUFRJTUlaQUJMRSAqLworICAgIHsKKyAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZls0OF07CisgICAgICAgIHIzID0gY29lZlswXSAtIGNvZWZbNDhdOworICAgICAgICByMSA9IGNvZWZbMTZdICsgY29lZlszMl07CisgICAgICAgIHIyID0gY29lZlsxNl0gLSBjb2VmWzMyXTsKKworICAgICAgICBjb2VmWzBdID0gcjAgKyByMTsKKyAgICAgICAgY29lZlszMl0gPSByMCAtIHIxOworICAgICAgICBjb2VmWzE2XSA9IChyMyA8PCAxKSArIHIyOworICAgICAgICBjb2VmWzQ4XSA9IHIzIC0gKHIyIDw8IDEpOworCisgICAgICAgIGNvZWYrKzsKKyAgICAgICAgai0tOworICAgIH0KKworICAgIGNvZWYgLT0gNDsKKworICAgIC8qIHF1YW50ICovCisgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsW3JhczJkZWNbYmxraWR4XV07CisgICAgcnVuID0gZW5jdmlkLT5ydW5bcmFzMmRlY1tibGtpZHhdXTsKKworICAgIFJxID0gdmlkZW8tPlFQeV9tb2RfNjsKKyAgICBRcSA9IHZpZGVvLT5RUHlfZGl2XzY7CisgICAgcXBfY29uc3QgPSBlbmN2aWQtPnFwX2NvbnN0OworICAgIHFfYml0cyA9IDE1ICsgUXE7CisKKyAgICB6ZXJvX3J1biA9IDA7CisgICAgbnVtY29lZmYgPSAwOworICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKQorICAgIHsKKyAgICAgICAgaWR4ID0gWlpfU0NBTl9CTE9DS1trXTsgLyogbWFwIGJhY2sgdG8gcmFzdGVyIHNjYW4gb3JkZXIgKi8KKyAgICAgICAgZGF0YSA9IGNvZWZbaWR4XTsKKyAgICAgICAgcXVhbnQgPSBxdWFudF9jb2VmW1JxXVtrXTsKKyAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSBkYXRhICogcXVhbnQgKyBxcF9jb25zdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IC1kYXRhICogcXVhbnQgKyBxcF9jb25zdDsKKyAgICAgICAgfQorICAgICAgICBsZXYgPj49IHFfYml0czsKKyAgICAgICAgaWYgKGxldikKKyAgICAgICAgeworICAgICAgICAgICAgKmNvZWZfY29zdCArPSAoKGxldiA+IDEpID8gTUFYX1ZBTFVFIDogQ09FRkZfQ09TVFtESVNBQkxFX1RIUkVTSE9MRElOR11bemVyb19ydW5dKTsKKworICAgICAgICAgICAgLyogZGVxdWFudCAqLworICAgICAgICAgICAgcXVhbnQgPSBkZXF1YW50X2NvZWZyZXNbUnFdW2tdOworICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW251bWNvZWZmXSA9IGxldjsKKyAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAobGV2ICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW251bWNvZWZmXSA9IC1sZXY7CisgICAgICAgICAgICAgICAgY29lZltpZHhdID0gKC1sZXYgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydW5bbnVtY29lZmYrK10gPSB6ZXJvX3J1bjsKKyAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHplcm9fcnVuKys7CisgICAgICAgICAgICBjb2VmW2lkeF0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5jdXJyTUItPm1iX2ludHJhKSAvLyBvbmx5IGRvIGludmVyc2UgdHJhbnNmb3JtIHdpdGggaW50cmEgYmxvY2sKKyAgICB7CisgICAgICAgIGlmIChudW1jb2VmZikgLyogdGhlbiBkbyBpbnZlcnNlIHRyYW5zZm9ybSAqLworICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKSAvKiBob3Jpem9udGFsICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlsyXTsKKyAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzJdOworICAgICAgICAgICAgICAgIHIyID0gKGNvZWZbMV0gPj4gMSkgLSBjb2VmWzNdOworICAgICAgICAgICAgICAgIHIzID0gY29lZlsxXSArIChjb2VmWzNdID4+IDEpOworCisgICAgICAgICAgICAgICAgY29lZlswXSA9IHIwICsgcjM7CisgICAgICAgICAgICAgICAgY29lZlsxXSA9IHIxICsgcjI7CisgICAgICAgICAgICAgICAgY29lZlsyXSA9IHIxIC0gcjI7CisgICAgICAgICAgICAgICAgY29lZlszXSA9IHIwIC0gcjM7CisKKyAgICAgICAgICAgICAgICBjb2VmICs9IDE2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb2VmIC09IDY0OworICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkgLyogdmVydGljYWwsIGhhcyB0byBiZSBkb25lIGFmdGVyIGhvcml6b250YWwgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzMyXTsKKyAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzMyXTsKKyAgICAgICAgICAgICAgICByMiA9IChjb2VmWzE2XSA+PiAxKSAtIGNvZWZbNDhdOworICAgICAgICAgICAgICAgIHIzID0gY29lZlsxNl0gKyAoY29lZls0OF0gPj4gMSk7CisgICAgICAgICAgICAgICAgcjAgKz0gcjM7CisgICAgICAgICAgICAgICAgcjMgPSAocjAgLSAocjMgPDwgMSkpOyAvKiByMC1yMyAqLworICAgICAgICAgICAgICAgIHIxICs9IHIyOworICAgICAgICAgICAgICAgIHIyID0gKHIxIC0gKHIyIDw8IDEpKTsgLyogcjEtcjIgKi8KKyAgICAgICAgICAgICAgICByMCArPSAzMjsKKyAgICAgICAgICAgICAgICByMSArPSAzMjsKKyAgICAgICAgICAgICAgICByMiArPSAzMjsKKyAgICAgICAgICAgICAgICByMyArPSAzMjsKKworICAgICAgICAgICAgICAgIHIwID0gcHJlZFswXSArIChyMCA+PiA2KTsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjAgPiAweEZGKSAgIHIwID0gMHhGRiAmICh+KHIwID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgcjEgPSAqKHByZWQgKz0gcHJlZF9waXRjaCkgKyAocjEgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIxID4gMHhGRikgICByMSA9IDB4RkYgJiAofihyMSA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIyID0gKihwcmVkICs9IHByZWRfcGl0Y2gpICsgKHIyID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMiA+IDB4RkYpICAgcjIgPSAweEZGICYgKH4ocjIgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMyA9IHByZWRbcHJlZF9waXRjaF0gKyAocjMgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIzID4gMHhGRikgICByMyA9IDB4RkYgJiAofihyMyA+PiAzMSkpOyAgLyogY2xpcCAqLworCisgICAgICAgICAgICAgICAgKmN1ciA9IHIwOworICAgICAgICAgICAgICAgICooY3VyICs9IHBpdGNoKSA9IHIxOworICAgICAgICAgICAgICAgICooY3VyICs9IHBpdGNoKSA9IHIyOworICAgICAgICAgICAgICAgIGN1cltwaXRjaF0gPSByMzsKKyAgICAgICAgICAgICAgICBjdXIgLT0gKHBpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgIGN1cisrOworICAgICAgICAgICAgICAgIHByZWQgLT0gKHByZWRfcGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgcHJlZCsrOworICAgICAgICAgICAgICAgIGNvZWYrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlICAvLyBjb3B5IGZyb20gcHJlZCB0byBjdXIKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyKiljdXIpID0gKigodWludDMyKilwcmVkKTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGN1ciArPSBwaXRjaCkpID0gKigodWludDMyKikocHJlZCArPSBwcmVkX3BpdGNoKSk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShjdXIgKz0gcGl0Y2gpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gcHJlZF9waXRjaCkpOworICAgICAgICAgICAgKigodWludDMyKikoY3VyICs9IHBpdGNoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IHByZWRfcGl0Y2gpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudW1jb2VmZjsKK30KKworCit2b2lkIE1CSW50ZXJJZGN0KEFWQ0NvbW1vbk9iaiAqdmlkZW8sIHVpbnQ4ICpjdXJMLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIGludCBwaWNQaXRjaCkKK3sKKyAgICBpbnQxNiAqY29lZiwgKmNvZWY4ID0gdmlkZW8tPmJsb2NrOworICAgIHVpbnQ4ICpjdXI7ICAvLyB0aGUgc2FtZSBhcyBjdXJMCisgICAgaW50IGI4LCBiNDsKKyAgICBpbnQgcjAsIHIxLCByMiwgcjMsIGosIGJsa2lkeDsKKworICAgIGZvciAoYjggPSAwOyBiOCA8IDQ7IGI4KyspCisgICAgeworICAgICAgICBjdXIgPSBjdXJMOworICAgICAgICBjb2VmID0gY29lZjg7CisKKyAgICAgICAgaWYgKGN1cnJNQi0+Q0JQJigxIDw8IGI4KSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBibGtpZHggPSBibGtJZHgyYmxrWFlbYjhdW2I0XTsKKyAgICAgICAgICAgICAgICAvKiBkbyBJRENUICovCisgICAgICAgICAgICAgICAgaWYgKGN1cnJNQi0+bnpfY29lZmZbYmxraWR4XSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pIC8qIGhvcml6b250YWwgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IChjb2VmWzFdID4+IDEpIC0gY29lZlszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gY29lZlsxXSArIChjb2VmWzNdID4+IDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmWzBdID0gcjAgKyByMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZbMV0gPSByMSArIHIyOworICAgICAgICAgICAgICAgICAgICAgICAgY29lZlsyXSA9IHIxIC0gcjI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmWzNdID0gcjAgLSByMzsKKworICAgICAgICAgICAgICAgICAgICAgICAgY29lZiArPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNvZWYgLT0gNjQ7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pIC8qIHZlcnRpY2FsLCBoYXMgdG8gYmUgZG9uZSBhZnRlciBob3Jpem9udGFsICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMzJdOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlszMl07CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IChjb2VmWzE2XSA+PiAxKSAtIGNvZWZbNDhdOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSBjb2VmWzE2XSArIChjb2VmWzQ4XSA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwICs9IHIzOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAocjAgLSAocjMgPDwgMSkpOyAvKiByMC1yMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjEgKz0gcjI7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IChyMSAtIChyMiA8PCAxKSk7IC8qIHIxLXIyICovCisgICAgICAgICAgICAgICAgICAgICAgICByMCArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxICs9IDMyOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgICAgICByMyArPSAzMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSBjdXJbMF0gKyAocjAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjAgPiAweEZGKSAgIHIwID0gMHhGRiAmICh+KHIwID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICAqY3VyID0gcjA7CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9ICooY3VyICs9IHBpY1BpdGNoKSArIChyMSA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMSA+IDB4RkYpICAgcjEgPSAweEZGICYgKH4ocjEgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpjdXIgPSByMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKihjdXIgKz0gcGljUGl0Y2gpICsgKHIyID4+IDYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIyID4gMHhGRikgICByMiA9IDB4RkYgJiAofihyMiA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmN1ciA9IHIyOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSBjdXJbcGljUGl0Y2hdICsgKHIzID4+IDYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIzID4gMHhGRikgICByMyA9IDB4RkYgJiAofihyMyA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3VyW3BpY1BpdGNoXSA9IHIzOworCisgICAgICAgICAgICAgICAgICAgICAgICBjdXIgLT0gKHBpY1BpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyKys7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY3VyIC09IDQ7CisgICAgICAgICAgICAgICAgICAgIGNvZWYgLT0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGI0JjEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXIgKz0gKChwaWNQaXRjaCA8PCAyKSAtIDQpOworICAgICAgICAgICAgICAgICAgICBjb2VmICs9IDYwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXIgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgY29lZiArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChiOCYxKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJMICs9ICgocGljUGl0Y2ggPDwgMykgLSA4KTsKKyAgICAgICAgICAgIGNvZWY4ICs9IDEyMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1ckwgKz0gODsKKyAgICAgICAgICAgIGNvZWY4ICs9IDg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisvKiBwZXJmb3JtYSBkY3QsIHF1YW50LCBpcXVhbnQsIGlkY3QgZm9yIHRoZSBlbnRpcmUgTUIgKi8KK3ZvaWQgZGN0X2x1bWFfMTZ4MTYoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXJMLCB1aW50OCAqb3JnTCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50IHBpdGNoID0gdmlkZW8tPmN1cnJQaWMtPnBpdGNoOworICAgIGludCBvcmdfcGl0Y2ggPSBlbmN2aWQtPmN1cnJJbnB1dC0+cGl0Y2g7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBpbnQxNiAqY29lZiA9IHZpZGVvLT5ibG9jazsKKyAgICB1aW50OCAqcHJlZCA9IGVuY3ZpZC0+cHJlZF9pMTZbY3Vyck1CLT5pMTZNb2RlXTsKKyAgICBpbnQgYmxrX3gsIGJsa195LCBqLCBrLCBpZHgsIGI4LCBiNDsKKyAgICBpbnQgcjAsIHIxLCByMiwgcjMsIG0wLCBtMSwgbTIgLCBtMzsKKyAgICBpbnQgZGF0YSwgbGV2OworICAgIGludCAqbGV2ZWwsICpydW4sIHplcm9fcnVuLCBuY29lZmY7CisgICAgaW50IFJxLCBRcSwgcXVhbnQsIHFfYml0cywgcXBfY29uc3Q7CisgICAgaW50IG9mZnNldF9jdXJbNF0sIG9mZnNldF9wcmVkWzRdLCBvZmZzZXQ7CisKKyAgICAvKiBob3Jpem9udGFsICovCisgICAgZm9yIChqID0gMTY7IGogPiAwOyBqLS0pCisgICAgeworICAgICAgICBmb3IgKGJsa194ID0gNDsgYmxrX3ggPiAwOyBibGtfeC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIHJlc2lkdWUgZmlyc3QgKi8KKyAgICAgICAgICAgIHIwID0gKm9yZ0wrKyAtICpwcmVkKys7CisgICAgICAgICAgICByMSA9ICpvcmdMKysgLSAqcHJlZCsrOworICAgICAgICAgICAgcjIgPSAqb3JnTCsrIC0gKnByZWQrKzsKKyAgICAgICAgICAgIHIzID0gKm9yZ0wrKyAtICpwcmVkKys7CisKKyAgICAgICAgICAgIHIwICs9IHIzOyAgICAgICAgICAgLy9wdHJbMF0gKyBwdHJbM107CisgICAgICAgICAgICByMyA9IHIwIC0gKHIzIDw8IDEpOyAgICAvL3B0clswXSAtIHB0clszXTsKKyAgICAgICAgICAgIHIxICs9IHIyOyAgICAgICAgICAgLy9wdHJbMV0gKyBwdHJbMl07CisgICAgICAgICAgICByMiA9IHIxIC0gKHIyIDw8IDEpOyAgICAvL3B0clsxXSAtIHB0clsyXTsKKworICAgICAgICAgICAgKmNvZWYrKyA9IHIwICsgcjE7CisgICAgICAgICAgICAqY29lZisrID0gKHIzIDw8IDEpICsgcjI7CisgICAgICAgICAgICAqY29lZisrID0gcjAgLSByMTsKKyAgICAgICAgICAgICpjb2VmKysgPSByMyAtIChyMiA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBvcmdMICs9IChvcmdfcGl0Y2ggLSAxNik7CisgICAgfQorICAgIHByZWQgLT0gMjU2OworICAgIGNvZWYgLT0gMjU2OworICAgIC8qIHZlcnRpY2FsICovCisgICAgZm9yIChibGtfeSA9IDQ7IGJsa195ID4gMDsgYmxrX3ktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDE2OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzQ4XTsKKyAgICAgICAgICAgIHIzID0gY29lZlswXSAtIGNvZWZbNDhdOworICAgICAgICAgICAgcjEgPSBjb2VmWzE2XSArIGNvZWZbMzJdOworICAgICAgICAgICAgcjIgPSBjb2VmWzE2XSAtIGNvZWZbMzJdOworCisgICAgICAgICAgICBjb2VmWzBdID0gcjAgKyByMTsKKyAgICAgICAgICAgIGNvZWZbMzJdID0gcjAgLSByMTsKKyAgICAgICAgICAgIGNvZWZbMTZdID0gKHIzIDw8IDEpICsgcjI7CisgICAgICAgICAgICBjb2VmWzQ4XSA9IHIzIC0gKHIyIDw8IDEpOworCisgICAgICAgICAgICBjb2VmKys7CisgICAgICAgIH0KKyAgICAgICAgY29lZiArPSA0ODsKKyAgICB9CisKKyAgICAvKiB0aGVuIHBlcmZvcm0gREMgdHJhbnNmb3JtICovCisgICAgY29lZiAtPSAyNTY7CisgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICB7CisgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMTJdOworICAgICAgICByMyA9IGNvZWZbMF0gLSBjb2VmWzEyXTsKKyAgICAgICAgcjEgPSBjb2VmWzRdICsgY29lZls4XTsKKyAgICAgICAgcjIgPSBjb2VmWzRdIC0gY29lZls4XTsKKworICAgICAgICBjb2VmWzBdID0gcjAgKyByMTsKKyAgICAgICAgY29lZls4XSA9IHIwIC0gcjE7CisgICAgICAgIGNvZWZbNF0gPSByMyArIHIyOworICAgICAgICBjb2VmWzEyXSA9IHIzIC0gcjI7CisgICAgICAgIGNvZWYgKz0gNjQ7CisgICAgfQorICAgIGNvZWYgLT0gMjU2OworICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgeworICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzE5Ml07CisgICAgICAgIHIzID0gY29lZlswXSAtIGNvZWZbMTkyXTsKKyAgICAgICAgcjEgPSBjb2VmWzY0XSArIGNvZWZbMTI4XTsKKyAgICAgICAgcjIgPSBjb2VmWzY0XSAtIGNvZWZbMTI4XTsKKworICAgICAgICBjb2VmWzBdID0gKHIwICsgcjEpID4+IDE7CisgICAgICAgIGNvZWZbMTI4XSA9IChyMCAtIHIxKSA+PiAxOworICAgICAgICBjb2VmWzY0XSA9IChyMyArIHIyKSA+PiAxOworICAgICAgICBjb2VmWzE5Ml0gPSAocjMgLSByMikgPj4gMTsKKyAgICAgICAgY29lZiArPSA0OworICAgIH0KKworICAgIGNvZWYgLT0gMTY7CisgICAgLy8gdGhlbiBxdWFudGl6ZSBEQworICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbGRjOworICAgIHJ1biA9IGVuY3ZpZC0+cnVuZGM7CisKKyAgICBScSA9IHZpZGVvLT5RUHlfbW9kXzY7CisgICAgUXEgPSB2aWRlby0+UVB5X2Rpdl82OworICAgIHF1YW50ID0gcXVhbnRfY29lZltScV1bMF07CisgICAgcV9iaXRzID0gMTUgKyBRcTsKKyAgICBxcF9jb25zdCA9IGVuY3ZpZC0+cXBfY29uc3Q7CisKKyAgICB6ZXJvX3J1biA9IDA7CisgICAgbmNvZWZmID0gMDsKKyAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykgLyogaW4gemlnemFnIHNjYW4gb3JkZXIgKi8KKyAgICB7CisgICAgICAgIGlkeCA9IFpJR1pBRzJSQVNURVJEQ1trXTsKKyAgICAgICAgZGF0YSA9IGNvZWZbaWR4XTsKKyAgICAgICAgaWYgKGRhdGEgPiAwKSAgIC8vIHF1YW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIChxcF9jb25zdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IC1kYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgbGV2ID4+PSAocV9iaXRzICsgMSk7CisgICAgICAgIGlmIChsZXYpIC8vIGRlcXVhbnQKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSBsZXY7CisgICAgICAgICAgICAgICAgY29lZltpZHhdID0gbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSAtbGV2OworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IC1sZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydW5bbmNvZWZmKytdID0gemVyb19ydW47CisgICAgICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZXJvX3J1bisrOworICAgICAgICAgICAgY29lZltpZHhdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGludmVyc2UgdHJhbnNmb3JtIERDICovCisgICAgZW5jdmlkLT5udW1jb2VmZGMgPSBuY29lZmY7CisgICAgaWYgKG5jb2VmZikKKyAgICB7CisgICAgICAgIHF1YW50ID0gZGVxdWFudF9jb2VmcmVzW1JxXVswXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBtMCA9IGNvZWZbMF0gKyBjb2VmWzRdOworICAgICAgICAgICAgbTEgPSBjb2VmWzBdIC0gY29lZls0XTsKKyAgICAgICAgICAgIG0yID0gY29lZls4XSArIGNvZWZbMTJdOworICAgICAgICAgICAgbTMgPSBjb2VmWzhdIC0gY29lZlsxMl07CisKKworICAgICAgICAgICAgY29lZlswXSA9IG0wICsgbTI7CisgICAgICAgICAgICBjb2VmWzRdID0gbTAgLSBtMjsKKyAgICAgICAgICAgIGNvZWZbOF0gPSBtMSAtIG0zOworICAgICAgICAgICAgY29lZlsxMl0gPSBtMSArIG0zOworICAgICAgICAgICAgY29lZiArPSA2NDsKKyAgICAgICAgfQorCisgICAgICAgIGNvZWYgLT0gMjU2OworCisgICAgICAgIGlmIChRcSA+PSAyKSAgLyogdGhpcyB3YXkgc2hvdWxkIGJlIGZhc3RlciB0aGFuIEpNICovCisgICAgICAgIHsgICAgICAgICAgIC8qIHRoZXkgdXNlICgoKG00KnNjYWxlKTw8KFFQeS82KSkrMik+PjIgZm9yIGJvdGggY2FzZXMuICovCisgICAgICAgICAgICBRcSAtPSAyOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtMCA9IGNvZWZbMF0gKyBjb2VmWzY0XTsKKyAgICAgICAgICAgICAgICBtMSA9IGNvZWZbMF0gLSBjb2VmWzY0XTsKKyAgICAgICAgICAgICAgICBtMiA9IGNvZWZbMTI4XSArIGNvZWZbMTkyXTsKKyAgICAgICAgICAgICAgICBtMyA9IGNvZWZbMTI4XSAtIGNvZWZbMTkyXTsKKworICAgICAgICAgICAgICAgIGNvZWZbMF0gPSAoKG0wICsgbTIpICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgICAgIGNvZWZbNjRdID0gKChtMCAtIG0yKSAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICBjb2VmWzEyOF0gPSAoKG0xIC0gbTMpICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgICAgIGNvZWZbMTkyXSA9ICgobTEgKyBtMykgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICAgICAgY29lZiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUXEgKz0gMjsgLyogcmVzdG9yZSB0aGUgdmFsdWUgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFFxID0gMiAtIFFxOworICAgICAgICAgICAgb2Zmc2V0ID0gMSA8PCAoUXEgLSAxKTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtMCA9IGNvZWZbMF0gKyBjb2VmWzY0XTsKKyAgICAgICAgICAgICAgICBtMSA9IGNvZWZbMF0gLSBjb2VmWzY0XTsKKyAgICAgICAgICAgICAgICBtMiA9IGNvZWZbMTI4XSArIGNvZWZbMTkyXTsKKyAgICAgICAgICAgICAgICBtMyA9IGNvZWZbMTI4XSAtIGNvZWZbMTkyXTsKKworICAgICAgICAgICAgICAgIGNvZWZbMF0gPSAoKChtMCArIG0yKSAqIHF1YW50ICsgb2Zmc2V0KSA+PiBRcSk7CisgICAgICAgICAgICAgICAgY29lZls2NF0gPSAoKChtMCAtIG0yKSAqIHF1YW50ICsgb2Zmc2V0KSA+PiBRcSk7CisgICAgICAgICAgICAgICAgY29lZlsxMjhdID0gKCgobTEgLSBtMykgKiBxdWFudCArIG9mZnNldCkgPj4gUXEpOworICAgICAgICAgICAgICAgIGNvZWZbMTkyXSA9ICgoKG0xICsgbTMpICogcXVhbnQgKyBvZmZzZXQpID4+IFFxKTsKKyAgICAgICAgICAgICAgICBjb2VmICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBRcSA9IDIgLSBRcTsgLyogcmVzdG9yZSB0aGUgdmFsdWUgKi8KKyAgICAgICAgfQorICAgICAgICBjb2VmIC09IDE2OyAvKiBiYWNrIHRvIHRoZSBvcmlnaW4gKi8KKyAgICB9CisKKyAgICAvKiBub3cgemlnemFnIHNjYW4gYWMgY29lZnMsIHF1YW50LCBpcXVhbnQgYW5kIGl0cmFucyAqLworICAgIHJ1biA9IGVuY3ZpZC0+cnVuWzBdOworICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbFswXTsKKworICAgIC8qIG9mZnNldCBidHcgNHg0IGJsb2NrICovCisgICAgb2Zmc2V0X2N1clswXSA9IDA7CisgICAgb2Zmc2V0X2N1clsxXSA9IChwaXRjaCA8PCAyKSAtIDg7CisKKyAgICAvKiBvZmZzZXQgYnR3IDh4OCBibG9jayAqLworICAgIG9mZnNldF9jdXJbMl0gPSA4IC0gKHBpdGNoIDw8IDMpOworICAgIG9mZnNldF9jdXJbM10gPSAtODsKKworICAgIC8qIHNpbWlsYXJseSBmb3IgcHJlZCAqLworICAgIG9mZnNldF9wcmVkWzBdID0gMDsKKyAgICBvZmZzZXRfcHJlZFsxXSA9IDU2OworICAgIG9mZnNldF9wcmVkWzJdID0gLTEyMDsKKyAgICBvZmZzZXRfcHJlZFszXSA9IC04OworCisgICAgY3Vyck1CLT5DQlAgPSAwOworCisgICAgZm9yIChiOCA9IDA7IGI4IDwgNDsgYjgrKykKKyAgICB7CisgICAgICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspCisgICAgICAgIHsKKworICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICAgICAgbmNvZWZmID0gMDsKKworICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDE2OyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWR4ID0gWlpfU0NBTl9CTE9DS1trXTsgLyogbWFwIGJhY2sgdG8gcmFzdGVyIHNjYW4gb3JkZXIgKi8KKyAgICAgICAgICAgICAgICBkYXRhID0gY29lZltpZHhdOworICAgICAgICAgICAgICAgIHF1YW50ID0gcXVhbnRfY29lZltScV1ba107CisgICAgICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ID0gZGF0YSAqIHF1YW50ICsgcXBfY29uc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxldiA9IC1kYXRhICogcXVhbnQgKyBxcF9jb25zdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGV2ID4+PSBxX2JpdHM7CisgICAgICAgICAgICAgICAgaWYgKGxldikKKyAgICAgICAgICAgICAgICB7ICAgLyogZGVxdWFudCAqLworICAgICAgICAgICAgICAgICAgICBxdWFudCA9IGRlcXVhbnRfY29lZnJlc1tScV1ba107CisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IGxldjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IChsZXYgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gLWxldjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9ICgtbGV2ICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJ1bltuY29lZmYrK10gPSB6ZXJvX3J1bjsKKyAgICAgICAgICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZXJvX3J1bisrOworICAgICAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3Vyck1CLT5uel9jb2VmZltibGtJZHgyYmxrWFlbYjhdW2I0XV0gPSBuY29lZmY7IC8qIGluIHJhc3RlciBzY2FuICEhISAqLworICAgICAgICAgICAgaWYgKG5jb2VmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPkNCUCB8PSAoMSA8PCBiOCk7CisKKyAgICAgICAgICAgICAgICAvLyBkbyBpbnZlcnNlIHRyYW5zZm9ybSBoZXJlCisgICAgICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMl07CisgICAgICAgICAgICAgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbMl07CisgICAgICAgICAgICAgICAgICAgIHIyID0gKGNvZWZbMV0gPj4gMSkgLSBjb2VmWzNdOworICAgICAgICAgICAgICAgICAgICByMyA9IGNvZWZbMV0gKyAoY29lZlszXSA+PiAxKTsKKworICAgICAgICAgICAgICAgICAgICBjb2VmWzBdID0gcjAgKyByMzsKKyAgICAgICAgICAgICAgICAgICAgY29lZlsxXSA9IHIxICsgcjI7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbMl0gPSByMSAtIHIyOworICAgICAgICAgICAgICAgICAgICBjb2VmWzNdID0gcjAgLSByMzsKKworICAgICAgICAgICAgICAgICAgICBjb2VmICs9IDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2VmIC09IDY0OworICAgICAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzMyXTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlszMl07CisgICAgICAgICAgICAgICAgICAgIHIyID0gKGNvZWZbMTZdID4+IDEpIC0gY29lZls0OF07CisgICAgICAgICAgICAgICAgICAgIHIzID0gY29lZlsxNl0gKyAoY29lZls0OF0gPj4gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgcjAgKz0gcjM7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKHIwIC0gKHIzIDw8IDEpKTsgLyogcjAtcjMgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgKz0gcjI7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHIxIC0gKHIyIDw8IDEpKTsgLyogcjEtcjIgKi8KKyAgICAgICAgICAgICAgICAgICAgcjAgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIHIxICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMiArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjMgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIHIwID0gcHJlZFswXSArIChyMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMSA9IHByZWRbMTZdICsgKHIxID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjEgPiAweEZGKSAgIHIxID0gMHhGRiAmICh+KHIxID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIyID0gcHJlZFszMl0gKyAocjIgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMiA+IDB4RkYpICAgcjIgPSAweEZGICYgKH4ocjIgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjMgPSBwcmVkWzQ4XSArIChyMyA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIzID4gMHhGRikgICByMyA9IDB4RkYgJiAofihyMyA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAqY3VyTCA9IHIwOworICAgICAgICAgICAgICAgICAgICAqKGN1ckwgKz0gcGl0Y2gpID0gcjE7CisgICAgICAgICAgICAgICAgICAgICooY3VyTCArPSBwaXRjaCkgPSByMjsKKyAgICAgICAgICAgICAgICAgICAgY3VyTFtwaXRjaF0gPSByMzsKKyAgICAgICAgICAgICAgICAgICAgY3VyTCAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgICAgIGN1ckwrKzsKKyAgICAgICAgICAgICAgICAgICAgcHJlZCsrOworICAgICAgICAgICAgICAgICAgICBjb2VmKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgLy8gZG8gREMtb25seSBpbnZlcnNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbTAgPSBjb2VmWzBdICsgMzI7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBwcmVkWzBdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjAgPiAweEZGKSAgIHIwID0gMHhGRiAmICh+KHIwID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIxID0gcHJlZFsxNl0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMSA+IDB4RkYpICAgcjEgPSAweEZGICYgKH4ocjEgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjIgPSBwcmVkWzMyXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIyID4gMHhGRikgICByMiA9IDB4RkYgJiAofihyMiA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMyA9IHByZWRbNDhdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjMgPiAweEZGKSAgIHIzID0gMHhGRiAmICh+KHIzID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICpjdXJMID0gcjA7CisgICAgICAgICAgICAgICAgICAgICooY3VyTCArPSBwaXRjaCkgPSByMTsKKyAgICAgICAgICAgICAgICAgICAgKihjdXJMICs9IHBpdGNoKSA9IHIyOworICAgICAgICAgICAgICAgICAgICBjdXJMW3BpdGNoXSA9IHIzOworICAgICAgICAgICAgICAgICAgICBjdXJMIC09IChwaXRjaCA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyTCsrOworICAgICAgICAgICAgICAgICAgICBwcmVkKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZWYgKz0gNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcnVuICs9IDE2OyAgLy8gZm9sbG93IGNvZGluZyBvcmRlcgorICAgICAgICAgICAgbGV2ZWwgKz0gMTY7CisgICAgICAgICAgICBjdXJMICs9IG9mZnNldF9jdXJbYjQmMV07CisgICAgICAgICAgICBwcmVkICs9IG9mZnNldF9wcmVkW2I0JjFdOworICAgICAgICAgICAgY29lZiArPSBvZmZzZXRfcHJlZFtiNCYxXTsKKyAgICAgICAgfQorCisgICAgICAgIGN1ckwgKz0gb2Zmc2V0X2N1clsyICsgKGI4JjEpXTsKKyAgICAgICAgcHJlZCArPSBvZmZzZXRfcHJlZFsyICsgKGI4JjEpXTsKKyAgICAgICAgY29lZiArPSBvZmZzZXRfcHJlZFsyICsgKGI4JjEpXTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgZGN0X2Nocm9tYShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ckMsIHVpbnQ4ICpvcmdDLCBpbnQgY3IpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgaW50IG9yZ19waXRjaCA9IChlbmN2aWQtPmN1cnJJbnB1dC0+cGl0Y2gpID4+IDE7CisgICAgaW50IHBpdGNoID0gKHZpZGVvLT5jdXJyUGljLT5waXRjaCkgPj4gMTsKKyAgICBpbnQgcHJlZF9waXRjaCA9IDE2OworICAgIGludDE2ICpjb2VmID0gdmlkZW8tPmJsb2NrICsgMjU2OworICAgIHVpbnQ4ICpwcmVkID0gdmlkZW8tPnByZWRfYmxvY2s7CisgICAgaW50IGosIGJsa194LCBibGtfeSwgaywgaWR4LCBiNDsKKyAgICBpbnQgcjAsIHIxLCByMiwgcjMsIG0wOworICAgIGludCBRcSwgUnEsIHFwX2NvbnN0LCBxX2JpdHMsIHF1YW50OworICAgIGludCAqbGV2ZWwsICpydW4sIHplcm9fcnVuLCBuY29lZmY7CisgICAgaW50IGRhdGEsIGxldjsKKyAgICBpbnQgb2Zmc2V0X2N1clsyXSwgb2Zmc2V0X3ByZWRbMl0sIG9mZnNldF9jb2VmWzJdOworICAgIHVpbnQ4IG56X3RlbXBbNF07CisgICAgaW50ICBjb2VmZl9jb3N0OworCisgICAgaWYgKGNyKQorICAgIHsKKyAgICAgICAgY29lZiArPSA4OworICAgICAgICBwcmVkICs9IDg7CisgICAgfQorCisgICAgaWYgKGN1cnJNQi0+bWJfaW50cmEgPT0gMCkgLy8gaW50ZXIgbW9kZQorICAgIHsKKyAgICAgICAgcHJlZCA9IGN1ckM7CisgICAgICAgIHByZWRfcGl0Y2ggPSBwaXRjaDsKKyAgICB9CisKKyAgICAvKiBkbyA0eDQgdHJhbnNmb3JtICovCisgICAgLyogaG9yaXpvbnRhbCAqLworICAgIGZvciAoaiA9IDg7IGogPiAwOyBqLS0pCisgICAgeworICAgICAgICBmb3IgKGJsa194ID0gMjsgYmxrX3ggPiAwOyBibGtfeC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIHJlc2lkdWUgZmlyc3QgKi8KKyAgICAgICAgICAgIHIwID0gKm9yZ0MrKyAtICpwcmVkKys7CisgICAgICAgICAgICByMSA9ICpvcmdDKysgLSAqcHJlZCsrOworICAgICAgICAgICAgcjIgPSAqb3JnQysrIC0gKnByZWQrKzsKKyAgICAgICAgICAgIHIzID0gKm9yZ0MrKyAtICpwcmVkKys7CisKKyAgICAgICAgICAgIHIwICs9IHIzOyAgICAgICAgICAgLy9wdHJbMF0gKyBwdHJbM107CisgICAgICAgICAgICByMyA9IHIwIC0gKHIzIDw8IDEpOyAgICAvL3B0clswXSAtIHB0clszXTsKKyAgICAgICAgICAgIHIxICs9IHIyOyAgICAgICAgICAgLy9wdHJbMV0gKyBwdHJbMl07CisgICAgICAgICAgICByMiA9IHIxIC0gKHIyIDw8IDEpOyAgICAvL3B0clsxXSAtIHB0clsyXTsKKworICAgICAgICAgICAgKmNvZWYrKyA9IHIwICsgcjE7CisgICAgICAgICAgICAqY29lZisrID0gKHIzIDw8IDEpICsgcjI7CisgICAgICAgICAgICAqY29lZisrID0gcjAgLSByMTsKKyAgICAgICAgICAgICpjb2VmKysgPSByMyAtIChyMiA8PCAxKTsKKworICAgICAgICB9CisgICAgICAgIGNvZWYgKz0gODsgLy8gY29lZiBwaXRjaCBpcyAxNgorICAgICAgICBwcmVkICs9IChwcmVkX3BpdGNoIC0gOCk7IC8vIHByZWRfcGl0Y2ggaXMgMTYKKyAgICAgICAgb3JnQyArPSAob3JnX3BpdGNoIC0gOCk7CisgICAgfQorICAgIHByZWQgLT0gKHByZWRfcGl0Y2ggPDwgMyk7CisgICAgY29lZiAtPSAxMjg7CisgICAgLyogdmVydGljYWwgKi8KKyAgICBmb3IgKGJsa195ID0gMjsgYmxrX3kgPiAwOyBibGtfeS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gODsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZls0OF07CisgICAgICAgICAgICByMyA9IGNvZWZbMF0gLSBjb2VmWzQ4XTsKKyAgICAgICAgICAgIHIxID0gY29lZlsxNl0gKyBjb2VmWzMyXTsKKyAgICAgICAgICAgIHIyID0gY29lZlsxNl0gLSBjb2VmWzMyXTsKKworICAgICAgICAgICAgY29lZlswXSA9IHIwICsgcjE7CisgICAgICAgICAgICBjb2VmWzMyXSA9IHIwIC0gcjE7CisgICAgICAgICAgICBjb2VmWzE2XSA9IChyMyA8PCAxKSArIHIyOworICAgICAgICAgICAgY29lZls0OF0gPSByMyAtIChyMiA8PCAxKTsKKworICAgICAgICAgICAgY29lZisrOworICAgICAgICB9CisgICAgICAgIGNvZWYgKz0gNTY7CisgICAgfQorICAgIC8qIHRoZW4gcGVyZm9ybSBEQyB0cmFuc2Zvcm0gKi8KKyAgICBjb2VmIC09IDEyODsKKworICAgIC8qIDJ4MiB0cmFuc2Zvcm0gb2YgREMgY29tcG9uZW50cyovCisgICAgcjAgPSBjb2VmWzBdOworICAgIHIxID0gY29lZls0XTsKKyAgICByMiA9IGNvZWZbNjRdOworICAgIHIzID0gY29lZls2OF07CisKKyAgICBjb2VmWzBdID0gcjAgKyByMSArIHIyICsgcjM7CisgICAgY29lZls0XSA9IHIwIC0gcjEgKyByMiAtIHIzOworICAgIGNvZWZbNjRdID0gcjAgKyByMSAtIHIyIC0gcjM7CisgICAgY29lZls2OF0gPSByMCAtIHIxIC0gcjIgKyByMzsKKworICAgIFFxICAgID0gdmlkZW8tPlFQY19kaXZfNjsKKyAgICBScSAgICA9IHZpZGVvLT5RUGNfbW9kXzY7CisgICAgcXVhbnQgPSBxdWFudF9jb2VmW1JxXVswXTsKKyAgICBxX2JpdHMgICAgPSAxNSArIFFxOworICAgIHFwX2NvbnN0ID0gZW5jdmlkLT5xcF9jb25zdF9jOworCisgICAgemVyb19ydW4gPSAwOworICAgIG5jb2VmZiA9IDA7CisgICAgcnVuID0gZW5jdmlkLT5ydW5jZGMgKyAoY3IgPDwgMik7CisgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsY2RjICsgKGNyIDw8IDIpOworCisgICAgLyogaW4gemlnemFnIHNjYW4gb3JkZXIgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQorICAgIHsKKyAgICAgICAgaWR4ID0gKChrID4+IDEpIDw8IDYpICsgKChrICYgMSkgPDwgMik7CisgICAgICAgIGRhdGEgPSBjb2VmW2lkeF07CisgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gZGF0YSAqIHF1YW50ICsgKHFwX2NvbnN0IDw8IDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gLWRhdGEgKiBxdWFudCArIChxcF9jb25zdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBsZXYgPj49IChxX2JpdHMgKyAxKTsKKyAgICAgICAgaWYgKGxldikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSBsZXY7CisgICAgICAgICAgICAgICAgY29lZltpZHhdID0gbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSAtbGV2OworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IC1sZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydW5bbmNvZWZmKytdID0gemVyb19ydW47CisgICAgICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZXJvX3J1bisrOworICAgICAgICAgICAgY29lZltpZHhdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVuY3ZpZC0+bnVtY29lZmNkY1tjcl0gPSBuY29lZmY7CisKKyAgICBpZiAobmNvZWZmKQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5DQlAgfD0gKDEgPDwgNCk7IC8vIERDIHByZXNlbnQKKyAgICAgICAgLy8gZG8gaW52ZXJzZSB0cmFuc2Zvcm0KKyAgICAgICAgcXVhbnQgPSBkZXF1YW50X2NvZWZyZXNbUnFdWzBdOworCisgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbNF07CisgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbNF07CisgICAgICAgIHIyID0gY29lZls2NF0gKyBjb2VmWzY4XTsKKyAgICAgICAgcjMgPSBjb2VmWzY0XSAtIGNvZWZbNjhdOworCisgICAgICAgIHIwICs9IHIyOworICAgICAgICByMiA9IHIwIC0gKHIyIDw8IDEpOworICAgICAgICByMSArPSByMzsKKyAgICAgICAgcjMgPSByMSAtIChyMyA8PCAxKTsKKworICAgICAgICBpZiAoUXEgPj0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgUXEgLT0gMTsKKyAgICAgICAgICAgIGNvZWZbMF0gPSAocjAgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICBjb2VmWzRdID0gKHIxICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgY29lZls2NF0gPSAocjIgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICBjb2VmWzY4XSA9IChyMyAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgIFFxKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb2VmWzBdID0gKHIwICogcXVhbnQpID4+IDE7CisgICAgICAgICAgICBjb2VmWzRdID0gKHIxICogcXVhbnQpID4+IDE7CisgICAgICAgICAgICBjb2VmWzY0XSA9IChyMiAqIHF1YW50KSA+PiAxOworICAgICAgICAgICAgY29lZls2OF0gPSAocjMgKiBxdWFudCkgPj4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG5vdyBkbyBBQyB6aWd6YWcgc2NhbiwgcXVhbnQsIGlxdWFudCBhbmQgaXRyYW5zICovCisgICAgaWYgKGNyKQorICAgIHsKKyAgICAgICAgcnVuID0gZW5jdmlkLT5ydW5bMjBdOworICAgICAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxbMjBdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBydW4gPSBlbmN2aWQtPnJ1blsxNl07CisgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbFsxNl07CisgICAgfQorCisgICAgLyogb2Zmc2V0IGJ0dyA0eDQgYmxvY2sgKi8KKyAgICBvZmZzZXRfY3VyWzBdID0gMDsKKyAgICBvZmZzZXRfY3VyWzFdID0gKHBpdGNoIDw8IDIpIC0gODsKKyAgICBvZmZzZXRfcHJlZFswXSA9IDA7CisgICAgb2Zmc2V0X3ByZWRbMV0gPSAocHJlZF9waXRjaCA8PCAyKSAtIDg7CisgICAgb2Zmc2V0X2NvZWZbMF0gPSAwOworICAgIG9mZnNldF9jb2VmWzFdID0gNTY7CisKKyAgICBjb2VmZl9jb3N0ID0gMDsKKworICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspCisgICAgeworICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgIG5jb2VmZiA9IDA7CisgICAgICAgIGZvciAoayA9IDE7IGsgPCAxNjsgaysrKSAvKiBpbiB6aWd6YWcgc2NhbiBvcmRlciAqLworICAgICAgICB7CisgICAgICAgICAgICBpZHggPSBaWl9TQ0FOX0JMT0NLW2tdOyAvKiBtYXAgYmFjayB0byByYXN0ZXIgc2NhbiBvcmRlciAqLworICAgICAgICAgICAgZGF0YSA9IGNvZWZbaWR4XTsKKyAgICAgICAgICAgIHF1YW50ID0gcXVhbnRfY29lZltScV1ba107CisgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ID0gZGF0YSAqIHF1YW50ICsgcXBfY29uc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ID0gLWRhdGEgKiBxdWFudCArIHFwX2NvbnN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV2ID4+PSBxX2JpdHM7CisgICAgICAgICAgICBpZiAobGV2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGZvciBSRCBwZXJmb3JtYW5jZSovCisgICAgICAgICAgICAgICAgaWYgKGxldiA+IDEpCisgICAgICAgICAgICAgICAgICAgIGNvZWZmX2Nvc3QgKz0gTUFYX1ZBTFVFOyAgICAgICAgICAgICAgICAvLyBzZXQgaGlnaCBjb3N0LCBzaGFsbCBub3QgYmUgZGlzY2FyZGVkCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjb2VmZl9jb3N0ICs9IENPRUZGX0NPU1RbRElTQUJMRV9USFJFU0hPTERJTkddW3plcm9fcnVuXTsKKworICAgICAgICAgICAgICAgIC8qIGRlcXVhbnQgKi8KKyAgICAgICAgICAgICAgICBxdWFudCA9IGRlcXVhbnRfY29lZnJlc1tScV1ba107CisgICAgICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IGxldjsKKyAgICAgICAgICAgICAgICAgICAgY29lZltpZHhdID0gKGxldiAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IC1sZXY7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9ICgtbGV2ICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBydW5bbmNvZWZmKytdID0gemVyb19ydW47CisgICAgICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHplcm9fcnVuKys7CisgICAgICAgICAgICAgICAgY29lZltpZHhdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG56X3RlbXBbYjRdID0gbmNvZWZmOyAvLyByYXN0ZXIgc2NhbgorCisgICAgICAgIC8vIGp1c3QgYWR2YW5jZSB0aGUgcG9pbnRlcnMgZm9yIG5vdywgZG8gSURDVCBsYXRlcgorICAgICAgICBjb2VmICs9IDQ7CisgICAgICAgIHJ1biArPSAxNjsKKyAgICAgICAgbGV2ZWwgKz0gMTY7CisgICAgICAgIGNvZWYgKz0gb2Zmc2V0X2NvZWZbYjQmMV07CisgICAgfQorCisgICAgLyogcmV3aW5kIHRoZSBwb2ludGVycyAqLworICAgIGNvZWYgLT0gMTI4OworCisgICAgaWYgKGNvZWZmX2Nvc3QgPCBfQ0hST01BX0NPRUZGX0NPU1RfKQorICAgIHsKKyAgICAgICAgLyogaWYgaXQncyBub3QgZWZmaWNpZW50IHRvIGVuY29kZSBhbnkgYmxvY2tzLgorICAgICAgICBKdXN0IGRvIERDIG9ubHkgKi8KKyAgICAgICAgLyogV2UgY2FuIHJlc2V0IGxldmVsIGFuZCBydW4gYWxzbywgYnV0IHNldHRpbmcgbnogdG8gemVybyBzaG91bGQgYmUgZW5vdWdoLiAqLworICAgICAgICBjdXJyTUItPm56X2NvZWZmWzE2Kyhjcjw8MSldID0gMDsKKyAgICAgICAgY3Vyck1CLT5uel9jb2VmZlsxNysoY3I8PDEpXSA9IDA7CisgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbMjArKGNyPDwxKV0gPSAwOworICAgICAgICBjdXJyTUItPm56X2NvZWZmWzIxKyhjcjw8MSldID0gMDsKKworICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBEQy1vbmx5IGludmVyc2UKKyAgICAgICAgICAgIG0wID0gY29lZlswXSArIDMyOworCisgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIwID0gcHJlZFswXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjAgPiAweEZGKSAgIHIwID0gMHhGRiAmICh+KHIwID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgcjEgPSAqKHByZWQgKz0gcHJlZF9waXRjaCkgKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIxID4gMHhGRikgICByMSA9IDB4RkYgJiAofihyMSA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIyID0gcHJlZFtwcmVkX3BpdGNoXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjIgPiAweEZGKSAgIHIyID0gMHhGRiAmICh+KHIyID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgcjMgPSBwcmVkW3ByZWRfcGl0Y2g8PDFdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAqY3VyQyA9IHIwOworICAgICAgICAgICAgICAgICooY3VyQyArPSBwaXRjaCkgPSByMTsKKyAgICAgICAgICAgICAgICAqKGN1ckMgKz0gcGl0Y2gpID0gcjI7CisgICAgICAgICAgICAgICAgY3VyQ1twaXRjaF0gPSByMzsKKyAgICAgICAgICAgICAgICBjdXJDIC09IChwaXRjaCA8PCAxKTsKKyAgICAgICAgICAgICAgICBjdXJDKys7CisgICAgICAgICAgICAgICAgcHJlZCArPSAoMSAtIHByZWRfcGl0Y2gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29lZiArPSA0OworICAgICAgICAgICAgY3VyQyArPSBvZmZzZXRfY3VyW2I0JjFdOworICAgICAgICAgICAgcHJlZCArPSBvZmZzZXRfcHJlZFtiNCYxXTsKKyAgICAgICAgICAgIGNvZWYgKz0gb2Zmc2V0X2NvZWZbYjQmMV07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvLyBub3QgZHJvcHBpbmcgYW55dGhpbmcsIGNvbnRpbnVlIHdpdGggdGhlIElEQ1QKKyAgICB7CisgICAgICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jb2VmZiA9IG56X3RlbXBbYjRdIDsgLy8gaW4gcmFzdGVyIHNjYW4KKyAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbMTYrKGI0JjEpKyhjcjw8MSkrKChiND4+MSk8PDIpXSA9IG5jb2VmZjsgLy8gaW4gcmFzdGVyIHNjYW4KKworICAgICAgICAgICAgaWYgKG5jb2VmZikgLy8gZG8gYSBjaGVjayBvbiB0aGUgbm9uemVyby1jb2VmZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+Q0JQIHw9ICgyIDw8IDQpOworCisgICAgICAgICAgICAgICAgLy8gZG8gaW52ZXJzZSB0cmFuc2Zvcm0gaGVyZQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzJdOworICAgICAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzJdOworICAgICAgICAgICAgICAgICAgICByMiA9IChjb2VmWzFdID4+IDEpIC0gY29lZlszXTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSBjb2VmWzFdICsgKGNvZWZbM10gPj4gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgY29lZlswXSA9IHIwICsgcjM7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbMV0gPSByMSArIHIyOworICAgICAgICAgICAgICAgICAgICBjb2VmWzJdID0gcjEgLSByMjsKKyAgICAgICAgICAgICAgICAgICAgY29lZlszXSA9IHIwIC0gcjM7CisKKyAgICAgICAgICAgICAgICAgICAgY29lZiArPSAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29lZiAtPSA2NDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlszMl07CisgICAgICAgICAgICAgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbMzJdOworICAgICAgICAgICAgICAgICAgICByMiA9IChjb2VmWzE2XSA+PiAxKSAtIGNvZWZbNDhdOworICAgICAgICAgICAgICAgICAgICByMyA9IGNvZWZbMTZdICsgKGNvZWZbNDhdID4+IDEpOworCisgICAgICAgICAgICAgICAgICAgIHIwICs9IHIzOworICAgICAgICAgICAgICAgICAgICByMyA9IChyMCAtIChyMyA8PCAxKSk7IC8qIHIwLXIzICovCisgICAgICAgICAgICAgICAgICAgIHIxICs9IHIyOworICAgICAgICAgICAgICAgICAgICByMiA9IChyMSAtIChyMiA8PCAxKSk7IC8qIHIxLXIyICovCisgICAgICAgICAgICAgICAgICAgIHIwICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMSArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjIgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIHIzICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMCA9IHByZWRbMF0gKyAocjAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMCA+IDB4RkYpICAgcjAgPSAweEZGICYgKH4ocjAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHByZWQgKz0gcHJlZF9waXRjaCkgKyAocjEgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMSA+IDB4RkYpICAgcjEgPSAweEZGICYgKH4ocjEgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjIgPSBwcmVkW3ByZWRfcGl0Y2hdICsgKHIyID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjIgPiAweEZGKSAgIHIyID0gMHhGRiAmICh+KHIyID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIzID0gcHJlZFtwcmVkX3BpdGNoPDwxXSArIChyMyA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIzID4gMHhGRikgICByMyA9IDB4RkYgJiAofihyMyA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAqY3VyQyA9IHIwOworICAgICAgICAgICAgICAgICAgICAqKGN1ckMgKz0gcGl0Y2gpID0gcjE7CisgICAgICAgICAgICAgICAgICAgICooY3VyQyArPSBwaXRjaCkgPSByMjsKKyAgICAgICAgICAgICAgICAgICAgY3VyQ1twaXRjaF0gPSByMzsKKyAgICAgICAgICAgICAgICAgICAgY3VyQyAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgICAgIGN1ckMrKzsKKyAgICAgICAgICAgICAgICAgICAgcHJlZCArPSAoMSAtIHByZWRfcGl0Y2gpOworICAgICAgICAgICAgICAgICAgICBjb2VmKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRvIERDLW9ubHkgaW52ZXJzZQorICAgICAgICAgICAgICAgIG0wID0gY29lZlswXSArIDMyOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIwID0gcHJlZFswXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMSA9ICoocHJlZCArPSBwcmVkX3BpdGNoKSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIxID4gMHhGRikgICByMSA9IDB4RkYgJiAofihyMSA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMiA9IHByZWRbcHJlZF9waXRjaF0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMiA+IDB4RkYpICAgcjIgPSAweEZGICYgKH4ocjIgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjMgPSBwcmVkW3ByZWRfcGl0Y2g8PDFdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjMgPiAweEZGKSAgIHIzID0gMHhGRiAmICh+KHIzID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICpjdXJDID0gcjA7CisgICAgICAgICAgICAgICAgICAgICooY3VyQyArPSBwaXRjaCkgPSByMTsKKyAgICAgICAgICAgICAgICAgICAgKihjdXJDICs9IHBpdGNoKSA9IHIyOworICAgICAgICAgICAgICAgICAgICBjdXJDW3BpdGNoXSA9IHIzOworICAgICAgICAgICAgICAgICAgICBjdXJDIC09IChwaXRjaCA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyQysrOworICAgICAgICAgICAgICAgICAgICBwcmVkICs9ICgxIC0gcHJlZF9waXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZWYgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1ckMgKz0gb2Zmc2V0X2N1cltiNCYxXTsKKyAgICAgICAgICAgIHByZWQgKz0gb2Zmc2V0X3ByZWRbYjQmMV07CisgICAgICAgICAgICBjb2VmICs9IG9mZnNldF9jb2VmW2I0JjFdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisvKiBvbmx5IERDIHRyYW5zZm9ybSAqLworaW50IFRyYW5zUXVhbnRJbnRyYTE2REMoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludDE2ICpibG9jayA9IHZpZGVvLT5ibG9jazsKKyAgICBpbnQgKmxldmVsID0gZW5jdmlkLT5sZXZlbGRjOworICAgIGludCAqcnVuID0gZW5jdmlkLT5ydW5kYzsKKyAgICBpbnQxNiAqcHRyID0gYmxvY2s7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBqOworICAgIGludCBRcSA9IHZpZGVvLT5RUHlfZGl2XzY7CisgICAgaW50IFJxID0gdmlkZW8tPlFQeV9tb2RfNjsKKyAgICBpbnQgcV9iaXRzLCBxcF9jb25zdCwgcXVhbnQ7CisgICAgaW50IGRhdGEsIGxldiwgemVyb19ydW47CisgICAgaW50IGssIG5jb2VmZiwgaWR4OworCisgICAgLyogREMgdHJhbnNmb3JtICovCisgICAgLyogaG9yaXpvbnRhbCAqLworICAgIGogPSA0OworICAgIHdoaWxlIChqKQorICAgIHsKKyAgICAgICAgcjAgPSBwdHJbMF0gKyBwdHJbMTJdOworICAgICAgICByMyA9IHB0clswXSAtIHB0clsxMl07CisgICAgICAgIHIxID0gcHRyWzRdICsgcHRyWzhdOworICAgICAgICByMiA9IHB0cls0XSAtIHB0cls4XTsKKworICAgICAgICBwdHJbMF0gPSByMCArIHIxOworICAgICAgICBwdHJbOF0gPSByMCAtIHIxOworICAgICAgICBwdHJbNF0gPSByMyArIHIyOworICAgICAgICBwdHJbMTJdID0gcjMgLSByMjsKKyAgICAgICAgcHRyICs9IDY0OworICAgICAgICBqLS07CisgICAgfQorICAgIC8qIHZlcnRpY2FsICovCisgICAgcHRyID0gYmxvY2s7CisgICAgaiA9IDQ7CisgICAgd2hpbGUgKGopCisgICAgeworICAgICAgICByMCA9IHB0clswXSArIHB0clsxOTJdOworICAgICAgICByMyA9IHB0clswXSAtIHB0clsxOTJdOworICAgICAgICByMSA9IHB0cls2NF0gKyBwdHJbMTI4XTsKKyAgICAgICAgcjIgPSBwdHJbNjRdIC0gcHRyWzEyOF07CisKKyAgICAgICAgcHRyWzBdID0gKHIwICsgcjEpID4+IDE7CisgICAgICAgIHB0clsxMjhdID0gKHIwIC0gcjEpID4+IDE7CisgICAgICAgIHB0cls2NF0gPSAocjMgKyByMikgPj4gMTsKKyAgICAgICAgcHRyWzE5Ml0gPSAocjMgLSByMikgPj4gMTsKKyAgICAgICAgcHRyICs9IDQ7CisgICAgICAgIGotLTsKKyAgICB9CisKKyAgICBxdWFudCA9IHF1YW50X2NvZWZbUnFdWzBdOworICAgIHFfYml0cyAgICA9IDE1ICsgUXE7CisgICAgcXBfY29uc3QgPSAoMSA8PCBxX2JpdHMpIC8gMzsgICAgLy8gaW50cmEKKworICAgIHplcm9fcnVuID0gMDsKKyAgICBuY29lZmYgPSAwOworCisgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspIC8qIGluIHppZ3phZyBzY2FuIG9yZGVyICovCisgICAgeworICAgICAgICBpZHggPSBaSUdaQUcyUkFTVEVSRENba107CisgICAgICAgIGRhdGEgPSBibG9ja1tpZHhdOworICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIChxcF9jb25zdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IC1kYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgbGV2ID4+PSAocV9iaXRzICsgMSk7CisgICAgICAgIGlmIChsZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gbGV2OworICAgICAgICAgICAgICAgIGJsb2NrW2lkeF0gPSBsZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IC1sZXY7CisgICAgICAgICAgICAgICAgYmxvY2tbaWR4XSA9IC1sZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydW5bbmNvZWZmKytdID0gemVyb19ydW47CisgICAgICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZXJvX3J1bisrOworICAgICAgICAgICAgYmxvY2tbaWR4XSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5jb2VmZjsKK30KKworaW50IFRyYW5zUXVhbnRDaHJvbWFEQyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50MTYgKmJsb2NrLCBpbnQgc2xpY2VfdHlwZSwgaW50IGNyKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgKmxldmVsLCAqcnVuOworICAgIGludCByMCwgcjEsIHIyLCByMzsKKyAgICBpbnQgUXEsIFJxLCBxX2JpdHMsIHFwX2NvbnN0LCBxdWFudDsKKyAgICBpbnQgZGF0YSwgbGV2LCB6ZXJvX3J1bjsKKyAgICBpbnQgaywgbmNvZWZmLCBpZHg7CisKKyAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxjZGMgKyAoY3IgPDwgMik7IC8qIGNiIG9yIGNyICovCisgICAgcnVuID0gZW5jdmlkLT5ydW5jZGMgKyAoY3IgPDwgMik7CisKKyAgICAvKiAyeDIgdHJhbnNmb3JtIG9mIERDIGNvbXBvbmVudHMqLworICAgIHIwID0gYmxvY2tbMF07CisgICAgcjEgPSBibG9ja1s0XTsKKyAgICByMiA9IGJsb2NrWzY0XTsKKyAgICByMyA9IGJsb2NrWzY4XTsKKworICAgIGJsb2NrWzBdID0gcjAgKyByMSArIHIyICsgcjM7CisgICAgYmxvY2tbNF0gPSByMCAtIHIxICsgcjIgLSByMzsKKyAgICBibG9ja1s2NF0gPSByMCArIHIxIC0gcjIgLSByMzsKKyAgICBibG9ja1s2OF0gPSByMCAtIHIxIC0gcjIgKyByMzsKKworICAgIFFxICAgID0gdmlkZW8tPlFQY19kaXZfNjsKKyAgICBScSAgICA9IHZpZGVvLT5RUGNfbW9kXzY7CisgICAgcXVhbnQgPSBxdWFudF9jb2VmW1JxXVswXTsKKyAgICBxX2JpdHMgICAgPSAxNSArIFFxOworICAgIGlmIChzbGljZV90eXBlID09IEFWQ19JX1NMSUNFKQorICAgIHsKKyAgICAgICAgcXBfY29uc3QgPSAoMSA8PCBxX2JpdHMpIC8gMzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcXBfY29uc3QgPSAoMSA8PCBxX2JpdHMpIC8gNjsKKyAgICB9CisKKyAgICB6ZXJvX3J1biA9IDA7CisgICAgbmNvZWZmID0gMDsKKworICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspIC8qIGluIHppZ3phZyBzY2FuIG9yZGVyICovCisgICAgeworICAgICAgICBpZHggPSAoKGsgPj4gMSkgPDwgNikgKyAoKGsgJiAxKSA8PCAyKTsKKyAgICAgICAgZGF0YSA9IGJsb2NrW2lkeF07CisgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gZGF0YSAqIHF1YW50ICsgKHFwX2NvbnN0IDw8IDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gLWRhdGEgKiBxdWFudCArIChxcF9jb25zdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBsZXYgPj49IChxX2JpdHMgKyAxKTsKKyAgICAgICAgaWYgKGxldikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSBsZXY7CisgICAgICAgICAgICAgICAgYmxvY2tbaWR4XSA9IGxldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gLWxldjsKKyAgICAgICAgICAgICAgICBibG9ja1tpZHhdID0gLWxldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ1bltuY29lZmYrK10gPSB6ZXJvX3J1bjsKKyAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHplcm9fcnVuKys7CisgICAgICAgICAgICBibG9ja1tpZHhdID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmNvZWZmOworfQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9maW5kaGFsZnBlbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTJhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwCkBAIC0wLDAgKzEsNjIyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKy8qIDMvMjkvMDEgZmFzdCBoYWxmLXBlbCBzZWFyY2ggYmFzZWQgb24gbmVpZ2hib3JpbmcgZ3Vlc3MgKi8KKy8qIHZhbHVlIHJhbmdpbmcgZnJvbSAwIHRvIDQsIGhpZ2ggY29tcGxleGl0eSAobW9yZSBhY2N1cmF0ZSkgdG8KKyAgIGxvdyBjb21wbGV4aXR5IChsZXNzIGFjY3VyYXRlKSAqLworI2RlZmluZSBIUF9ESVNUQU5DRV9USCAgICAgIDUgLy8gMiAgLyogaGFsZi1wZWwgZGlzdGFuY2UgdGhyZXNob2xkICovCisKKyNkZWZpbmUgUFJFRl8xNl9WRUMgMTI5ICAgICAvKiAxTVYgYmlhcyB2ZXJzdXMgNE1WcyovCisKK2NvbnN0IHN0YXRpYyBpbnQgZGlzdGFuY2VfdGFiWzldWzldID0gICAvKiBbaHBfZ3Vlc3NdW2tdICovCit7CisgICAgezAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9LAorICAgIHsxLCAwLCAxLCAyLCAzLCA0LCAzLCAyLCAxfSwKKyAgICB7MSwgMCwgMCwgMCwgMSwgMiwgMywgMiwgMX0sCisgICAgezEsIDIsIDEsIDAsIDEsIDIsIDMsIDQsIDN9LAorICAgIHsxLCAyLCAxLCAwLCAwLCAwLCAxLCAyLCAzfSwKKyAgICB7MSwgNCwgMywgMiwgMSwgMCwgMSwgMiwgM30sCisgICAgezEsIDIsIDMsIDIsIDEsIDAsIDAsIDAsIDF9LAorICAgIHsxLCAyLCAzLCA0LCAzLCAyLCAxLCAwLCAxfSwKKyAgICB7MSwgMCwgMSwgMiwgMywgMiwgMSwgMCwgMH0KK307CisKKyNkZWZpbmUgQ0xJUF9SRVNVTFQoeCkgICAgICBpZigodWludCl4ID4gMHhGRil7IFwKKyAgICAgICAgICAgICAgICAgeCA9IDB4RkYgJiAofih4Pj4zMSkpO30KKworI2RlZmluZSBDTElQX1VQUEVSMTYoeCkgICAgIGlmKCh1aW50KXggPj0gMHgyMDAwMDAwMCl7IFwKKyAgICAgICAgeCA9IDB4RkYwMDAwICYgKH4oeD4+MzEpKTt9IFwKKyAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgeCA9ICh4Pj41KSYweEZGMDAwMDsgXAorICAgICAgICB9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgQVZDRmluZEhhbGZQZWxNQgorICAgIERhdGU6ICAgICAgIDEwLzMxLzIwMDcKKyAgICBQdXJwb3NlOiAgICBGaW5kIGhhbGYgcGVsIHJlc29sdXRpb24gTVYgc3Vycm91bmRpbmcgdGhlIGZ1bGwtcGVsIE1WCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQgQVZDRmluZEhhbGZQZWxNQihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ciwgQVZDTVYgKm1vdCwgdWludDggKm5jYW5kLAorICAgICAgICAgICAgICAgICAgICAgaW50IHhwb3MsIGludCB5cG9zLCBpbnQgaHBfZ3Vlc3MsIGludCBjbXZ4LCBpbnQgY212eSkKK3sKKyAgICBBVkNQaWN0dXJlRGF0YSAqY3VyclBpYyA9IGVuY3ZpZC0+Y29tbW9uLT5jdXJyUGljOworICAgIGludCBseCA9IGN1cnJQaWMtPnBpdGNoOworICAgIGludCBkLCBkbWluLCBzYXRkX21pbjsKKyAgICB1aW50OCogY2FuZDsKKyAgICBpbnQgbGFtYmRhX21vdGlvbiA9IGVuY3ZpZC0+bGFtYmRhX21vdGlvbjsKKyAgICB1aW50OCAqbXZiaXRzID0gZW5jdmlkLT5tdmJpdHM7CisgICAgaW50IG12Y29zdDsKKyAgICAvKiBsaXN0IG9mIGNhbmRpZGF0ZSB0byBnbyB0aHJvdWdoIGZvciBoYWxmLXBlbCBzZWFyY2gqLworICAgIHVpbnQ4ICpzdWJwZWxfcHJlZCA9ICh1aW50OCopIGVuY3ZpZC0+c3VicGVsX3ByZWQ7IC8vIGFsbCAxNiBzdWItcGVsIHBvc2l0aW9ucworICAgIHVpbnQ4ICoqaHBlbF9jYW5kID0gKHVpbnQ4KiopIGVuY3ZpZC0+aHBlbF9jYW5kOyAvKiBoYWxmLXBlbCBwb3NpdGlvbiAqLworCisgICAgaW50IHhoWzldID0gezAsIDAsIDIsIDIsIDIsIDAsIC0yLCAtMiwgLTJ9OworICAgIGludCB5aFs5XSA9IHswLCAtMiwgLTIsIDAsIDIsIDIsIDIsIDAsIC0yfTsKKyAgICBpbnQgeHFbOF0gPSB7MCwgMSwgMSwgMSwgMCwgLTEsIC0xLCAtMX07CisgICAgaW50IHlxWzhdID0geyAtMSwgLTEsIDAsIDEsIDEsIDEsIDAsIC0xfTsKKyAgICBpbnQgaCwgaG1pbiwgcSwgcW1pbjsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyh4cG9zKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcoeXBvcyk7CisgICAgT1NDTF9VTlVTRURfQVJHKGhwX2d1ZXNzKTsKKworICAgIEdlbmVyYXRlSGFsZlBlbFByZWQoc3VicGVsX3ByZWQsIG5jYW5kLCBseCk7CisKKyAgICBjdXIgPSBlbmN2aWQtPmN1cnJZTUI7IC8vIHByZS1sb2FkIGN1cnJlbnQgb3JpZ2luYWwgTUIKKworICAgIGNhbmQgPSBocGVsX2NhbmRbMF07CisKKyAgICAvLyBmaW5kIGNvc3QgZm9yIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uCisgICAgZG1pbiA9IFNBVERfTUIoY2FuZCwgY3VyLCA2NTUzNSk7IC8vIGdldCBIYWRhbWFhcmQgdHJhbnNmb3JtIFNBRAorICAgIG12Y29zdCA9IE1WX0NPU1RfUyhsYW1iZGFfbW90aW9uLCBtb3QtPngsIG1vdC0+eSwgY212eCwgY212eSk7CisgICAgc2F0ZF9taW4gPSBkbWluOworICAgIGRtaW4gKz0gbXZjb3N0OworICAgIGhtaW4gPSAwOworCisgICAgLyogZmluZCBoYWxmLXBlbCAqLworICAgIGZvciAoaCA9IDE7IGggPCA5OyBoKyspCisgICAgeworICAgICAgICBkID0gU0FURF9NQihocGVsX2NhbmRbaF0sIGN1ciwgZG1pbik7CisgICAgICAgIG12Y29zdCA9IE1WX0NPU1RfUyhsYW1iZGFfbW90aW9uLCBtb3QtPnggKyB4aFtoXSwgbW90LT55ICsgeWhbaF0sIGNtdngsIGNtdnkpOworICAgICAgICBkICs9IG12Y29zdDsKKworICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgaG1pbiA9IGg7CisgICAgICAgICAgICBzYXRkX21pbiA9IGQgLSBtdmNvc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtb3QtPnNhZCA9IGRtaW47CisgICAgbW90LT54ICs9IHhoW2htaW5dOworICAgIG1vdC0+eSArPSB5aFtobWluXTsKKyAgICBlbmN2aWQtPmJlc3RfaHBlbF9wb3MgPSBobWluOworCisgICAgLyoqKiBzZWFyY2ggZm9yIHF1YXJ0ZXItcGVsICoqKiovCisgICAgR2VuZXJhdGVRdWFydFBlbFByZWQoZW5jdmlkLT5iaWxpbl9iYXNlW2htaW5dLCAmKGVuY3ZpZC0+cXBlbF9jYW5kWzBdWzBdKSwgaG1pbik7CisKKyAgICBlbmN2aWQtPmJlc3RfcXBlbF9wb3MgPSBxbWluID0gLTE7CisKKyAgICBmb3IgKHEgPSAwOyBxIDwgODsgcSsrKQorICAgIHsKKyAgICAgICAgZCA9IFNBVERfTUIoZW5jdmlkLT5xcGVsX2NhbmRbcV0sIGN1ciwgZG1pbik7CisgICAgICAgIG12Y29zdCA9IE1WX0NPU1RfUyhsYW1iZGFfbW90aW9uLCBtb3QtPnggKyB4cVtxXSwgbW90LT55ICsgeXFbcV0sIGNtdngsIGNtdnkpOworICAgICAgICBkICs9IG12Y29zdDsKKyAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICB7CisgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgIHFtaW4gPSBxOworICAgICAgICAgICAgc2F0ZF9taW4gPSBkIC0gbXZjb3N0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHFtaW4gIT0gLTEpCisgICAgeworICAgICAgICBtb3QtPnNhZCA9IGRtaW47CisgICAgICAgIG1vdC0+eCArPSB4cVtxbWluXTsKKyAgICAgICAgbW90LT55ICs9IHlxW3FtaW5dOworICAgICAgICBlbmN2aWQtPmJlc3RfcXBlbF9wb3MgPSBxbWluOworICAgIH0KKworICAgIHJldHVybiBzYXRkX21pbjsKK30KKworCisKKy8qKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBzdWItcGVsIHByZWRpY3Rpb24gYXJvdW5kIHRoZSBmdWxsLXBlbCBjYW5kaWRhdGUuCitFYWNoIHN1Yi1wZWwgcG9zaXRpb24gYXJyYXkgaXMgMjAgcGl4ZWwgd2lkZSAoZm9yIHdvcmQtYWxpZ25tZW50KSBhbmQgMTcgcGl4ZWwgdGFsbC4gKi8KKy8qKiBUaGUgc3ViLXBlbCBwb3NpdGlvbiBpcyBsYWJlbGVkIGluIHNwaXJhbCBtYW5uZXIgZnJvbSB0aGUgY2VudGVyLiAqLworCit2b2lkIEdlbmVyYXRlSGFsZlBlbFByZWQodWludDgqIHN1YnBlbF9wcmVkLCB1aW50OCAqbmNhbmQsIGludCBseCkKK3sKKyAgICAvKiBsZXQncyBkbyBzdHJhaWdodGZvcndhcmQgd2F5IGZpcnN0ICovCisgICAgdWludDggKnJlZjsKKyAgICB1aW50OCAqZHN0OworICAgIHVpbnQ4IHRtcDg7CisgICAgaW50MzIgdG1wMzI7CisgICAgaW50MTYgdG1wX2hvcnpbMTgqMjJdLCAqZHN0XzE2LCAqc3JjXzE2OworICAgIHJlZ2lzdGVyIGludCBhID0gMCwgYiA9IDAsIGMgPSAwLCBkID0gMCwgZSA9IDAsIGYgPSAwOyAvLyB0ZW1wIHJlZ2lzdGVyCisgICAgaW50IG1zazsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIGZpcnN0IGNvcHkgZnVsbC1wZWwgdG8gdGhlIGZpcnN0IGFycmF5ICovCisgICAgLyogdG8gYmUgb3B0aW1pemVkIGxhdGVyIGJhc2VkIG9uIGJ5dGUtb2Zmc2V0IGxvYWQgKi8KKyAgICByZWYgPSBuY2FuZCAtIDMgLSBseCAtIChseCA8PCAxKTsgLyogbW92ZSBiYWNrICgtMywtMykgKi8KKyAgICBkc3QgPSBzdWJwZWxfcHJlZDsKKworICAgIGRzdCAtPSA0OyAvKiBvZmZzZXQgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMjI7IGorKykgLyogMjR4MjIgKi8KKyAgICB7CisgICAgICAgIGkgPSA2OworICAgICAgICB3aGlsZSAoaSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDMyID0gKnJlZisrOworICAgICAgICAgICAgdG1wOCA9ICpyZWYrKzsKKyAgICAgICAgICAgIHRtcDMyIHw9ICh0bXA4IDw8IDgpOworICAgICAgICAgICAgdG1wOCA9ICpyZWYrKzsKKyAgICAgICAgICAgIHRtcDMyIHw9ICh0bXA4IDw8IDE2KTsKKyAgICAgICAgICAgIHRtcDggPSAqcmVmKys7CisgICAgICAgICAgICB0bXAzMiB8PSAodG1wOCA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gdG1wMzI7CisgICAgICAgICAgICBpLS07CisgICAgICAgIH0KKyAgICAgICAgcmVmICs9IChseCAtIDI0KTsKKyAgICB9CisKKyAgICAvKiBmcm9tIHRoZSBmaXJzdCBhcnJheSwgd2UgZG8gaG9yaXpvbnRhbCBpbnRlcnAgKi8KKyAgICByZWYgPSBzdWJwZWxfcHJlZCArIDI7CisgICAgZHN0XzE2ID0gdG1wX2hvcno7IC8qIDE3IHggMjIgKi8KKworICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgeworICAgICAgICBmb3IgKGkgPSAxNjsgaSA+IDA7IGkgLT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9IHJlZlstMl07CisgICAgICAgICAgICBiID0gcmVmWy0xXTsKKyAgICAgICAgICAgIGMgPSByZWZbMF07CisgICAgICAgICAgICBkID0gcmVmWzFdOworICAgICAgICAgICAgZSA9IHJlZlsyXTsKKyAgICAgICAgICAgIGYgPSByZWZbM107CisgICAgICAgICAgICAqZHN0XzE2KysgPSBhICsgZiAtIDUgKiAoYiArIGUpICsgMjAgKiAoYyArIGQpOworICAgICAgICAgICAgYSA9IHJlZls0XTsKKyAgICAgICAgICAgICpkc3RfMTYrKyA9IGIgKyBhIC0gNSAqIChjICsgZikgKyAyMCAqIChkICsgZSk7CisgICAgICAgICAgICBiID0gcmVmWzVdOworICAgICAgICAgICAgKmRzdF8xNisrID0gYyArIGIgLSA1ICogKGQgKyBhKSArIDIwICogKGUgKyBmKTsKKyAgICAgICAgICAgIGMgPSByZWZbNl07CisgICAgICAgICAgICAqZHN0XzE2KysgPSBkICsgYyAtIDUgKiAoZSArIGIpICsgMjAgKiAoZiArIGEpOworCisgICAgICAgICAgICByZWYgKz0gNDsKKyAgICAgICAgfQorICAgICAgICAvKiBkbyB0aGUgMTd0aCBjb2x1bW4gaGVyZSAqLworICAgICAgICBkID0gcmVmWzNdOworICAgICAgICAqZHN0XzE2ID0gIGUgKyBkIC0gNSAqIChmICsgYykgKyAyMCAqIChhICsgYik7CisgICAgICAgIGRzdF8xNiArPSAyOyAvKiBzdHJpZGUgZm9yIHRtcF9ob3J6IGlzIDE4ICovCisgICAgICAgIHJlZiArPSA4OyAgLyogc3RyaWRlIGZvciByZWYgaXMgMjQgKi8KKyAgICAgICAgaWYgKGogPT0gMykgIC8vIG1vdmUgMTggbGluZXMgZG93bgorICAgICAgICB7CisgICAgICAgICAgICBkc3RfMTYgKz0gMzI0Oy8vMTgqMTg7CisgICAgICAgICAgICByZWYgKz0gNDMyOy8vMTgqMjQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZWYgLT0gNDgwOy8vMjAqMjQ7CisgICAgZHN0XzE2IC09IDM2MDsvLzIwKjE4OworICAgIGRzdCA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOyAvKiBnbyB0byB0aGUgMTR0aCBhcnJheSAxN3gxOCovCisKKyAgICBmb3IgKGogPSAxODsgaiA+IDA7IGotLSkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDE2OyBpID4gMDsgaSAtPSA0KQorICAgICAgICB7CisgICAgICAgICAgICBhID0gcmVmWy0yXTsKKyAgICAgICAgICAgIGIgPSByZWZbLTFdOworICAgICAgICAgICAgYyA9IHJlZlswXTsKKyAgICAgICAgICAgIGQgPSByZWZbMV07CisgICAgICAgICAgICBlID0gcmVmWzJdOworICAgICAgICAgICAgZiA9IHJlZlszXTsKKyAgICAgICAgICAgIHRtcDMyID0gYSArIGYgLSA1ICogKGIgKyBlKSArIDIwICogKGMgKyBkKTsKKyAgICAgICAgICAgICpkc3RfMTYrKyA9IHRtcDMyOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKmRzdCsrID0gdG1wMzI7CisKKyAgICAgICAgICAgIGEgPSByZWZbNF07CisgICAgICAgICAgICB0bXAzMiA9IGIgKyBhIC0gNSAqIChjICsgZikgKyAyMCAqIChkICsgZSk7CisgICAgICAgICAgICAqZHN0XzE2KysgPSB0bXAzMjsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICpkc3QrKyA9IHRtcDMyOworCisgICAgICAgICAgICBiID0gcmVmWzVdOworICAgICAgICAgICAgdG1wMzIgPSBjICsgYiAtIDUgKiAoZCArIGEpICsgMjAgKiAoZSArIGYpOworICAgICAgICAgICAgKmRzdF8xNisrID0gdG1wMzI7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqZHN0KysgPSB0bXAzMjsKKworICAgICAgICAgICAgYyA9IHJlZls2XTsKKyAgICAgICAgICAgIHRtcDMyID0gZCArIGMgLSA1ICogKGUgKyBiKSArIDIwICogKGYgKyBhKTsKKyAgICAgICAgICAgICpkc3RfMTYrKyA9IHRtcDMyOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKmRzdCsrID0gdG1wMzI7CisKKyAgICAgICAgICAgIHJlZiArPSA0OworICAgICAgICB9CisgICAgICAgIC8qIGRvIHRoZSAxN3RoIGNvbHVtbiBoZXJlICovCisgICAgICAgIGQgPSByZWZbM107CisgICAgICAgIHRtcDMyID0gIGUgKyBkIC0gNSAqIChmICsgYykgKyAyMCAqIChhICsgYik7CisgICAgICAgICpkc3RfMTYgPSB0bXAzMjsKKyAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICpkc3QgPSB0bXAzMjsKKworICAgICAgICBkc3QgKz0gODsgIC8qIHN0cmlkZSBmb3IgZHN0IGlzIDI0ICovCisgICAgICAgIGRzdF8xNiArPSAyOyAvKiBzdHJpZGUgZm9yIHRtcF9ob3J6IGlzIDE4ICovCisgICAgICAgIHJlZiArPSA4OyAgLyogc3RyaWRlIGZvciByZWYgaXMgMjQgKi8KKyAgICB9CisKKworICAgIC8qIERvIG1pZGRsZSBwb2ludCBmaWx0ZXJpbmcqLworICAgIHNyY18xNiA9IHRtcF9ob3J6OyAvKiAxNyB4IDIyICovCisgICAgZHN0ID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7IC8qIDEydGggYXJyYXkgMTd4MTcqLworICAgIGRzdCAtPSAyNDsgLy8gb2Zmc2V0CisgICAgZm9yIChpID0gMDsgaSA8IDE3OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAxNjsgaiA+IDA7IGogLT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9ICpzcmNfMTY7CisgICAgICAgICAgICBiID0gKihzcmNfMTYgKz0gMTgpOworICAgICAgICAgICAgYyA9ICooc3JjXzE2ICs9IDE4KTsKKyAgICAgICAgICAgIGQgPSAqKHNyY18xNiArPSAxOCk7CisgICAgICAgICAgICBlID0gKihzcmNfMTYgKz0gMTgpOworICAgICAgICAgICAgZiA9ICooc3JjXzE2ICs9IDE4KTsKKworICAgICAgICAgICAgdG1wMzIgPSBhICsgZiAtIDUgKiAoYiArIGUpICsgMjAgKiAoYyArIGQpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsKKworICAgICAgICAgICAgYSA9ICooc3JjXzE2ICs9IDE4KTsKKyAgICAgICAgICAgIHRtcDMyID0gYiArIGEgLSA1ICogKGMgKyBmKSArIDIwICogKGQgKyBlKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7CisKKyAgICAgICAgICAgIGIgPSAqKHNyY18xNiArPSAxOCk7CisgICAgICAgICAgICB0bXAzMiA9IGMgKyBiIC0gNSAqIChkICsgYSkgKyAyMCAqIChlICsgZik7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDUxMikgPj4gMTA7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOworCisgICAgICAgICAgICBjID0gKihzcmNfMTYgKz0gMTgpOworICAgICAgICAgICAgdG1wMzIgPSBkICsgYyAtIDUgKiAoZSArIGIpICsgMjAgKiAoZiArIGEpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsKKworICAgICAgICAgICAgc3JjXzE2IC09ICgxOCA8PCAyKTsKKyAgICAgICAgfQorCisgICAgICAgIGQgPSBzcmNfMTZbOTBdOyAvLyAxOCo1CisgICAgICAgIHRtcDMyID0gZSArIGQgLSA1ICogKGYgKyBjKSArIDIwICogKGEgKyBiKTsKKyAgICAgICAgdG1wMzIgPSAodG1wMzIgKyA1MTIpID4+IDEwOworICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgZHN0WzI0XSA9IHRtcDMyOworCisgICAgICAgIHNyY18xNiAtPSAoKDE4IDw8IDQpIC0gMSk7CisgICAgICAgIGRzdCAtPSAoKDI0IDw8IDQpIC0gMSk7CisgICAgfQorCisgICAgLyogZG8gdmVydGljYWwgaW50ZXJwb2xhdGlvbiAqLworICAgIHJlZiA9IHN1YnBlbF9wcmVkICsgMjsKKyAgICBkc3QgPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsgLyogMTB0aCBhcnJheSAxOHgxNyAqLworICAgIGRzdCAtPSAyNDsgLy8gb2Zmc2V0CisKKyAgICBmb3IgKGkgPSAyOyBpID4gMDsgaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMTY7IGogPiAwOyBqIC09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGEgPSAqcmVmOworICAgICAgICAgICAgYiA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIGMgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBkID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgZSA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIGYgPSAqKHJlZiArPSAyNCk7CisKKyAgICAgICAgICAgIHRtcDMyID0gYSArIGYgLSA1ICogKGIgKyBlKSArIDIwICogKGMgKyBkKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgICAgICBhID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgdG1wMzIgPSBiICsgYSAtIDUgKiAoYyArIGYpICsgMjAgKiAoZCArIGUpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIGIgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICB0bXAzMiA9IGMgKyBiIC0gNSAqIChkICsgYSkgKyAyMCAqIChlICsgZik7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgYyA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIHRtcDMyID0gZCArIGMgLSA1ICogKGUgKyBiKSArIDIwICogKGYgKyBhKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgICAgICByZWYgLT0gKDI0IDw8IDIpOworICAgICAgICB9CisKKyAgICAgICAgZCA9IHJlZlsxMjBdOyAvLyAyNCo1CisgICAgICAgIHRtcDMyID0gZSArIGQgLSA1ICogKGYgKyBjKSArIDIwICogKGEgKyBiKTsKKyAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgIGRzdFsyNF0gPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICBkc3QgLT0gKCgyNCA8PCA0KSAtIDEpOworICAgICAgICByZWYgLT0gKCgyNCA8PCA0KSAtIDEpOworICAgIH0KKworICAgIC8vIG5vdGUgdGhhdCB1c2luZyBTSU1EIGhlcmUgZG9lc24ndCBoZWxwIG11Y2gsIHRoZSBjeWNsZSBhbG1vc3Qgc3RheXMgdGhlIHNhbWUKKyAgICAvLyBvbmUgY2FuIGp1c3QgdXNlIHRoZSBhYm92ZSBjb2RlIGFuZCBjaGFuZ2UgdGhlIGZvcihpPTIgdG8gZm9yKGk9MTgKKyAgICBmb3IgKGkgPSAxNjsgaSA+IDA7IGkgLT0gNCkKKyAgICB7CisgICAgICAgIG1zayA9IDA7CisgICAgICAgIGZvciAoaiA9IDE3OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICBhID0gKigodWludDMyKilyZWYpOyAvKiBsb2FkIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgIGIgPSAoYSA+PiA4KSAmIDB4RkYwMEZGOyAvKiBzZWNvbmQgYW5kIGZvdXJ0aCBieXRlICovCisgICAgICAgICAgICBhICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICBjID0gKigodWludDMyKikocmVmICsgMTIwKSk7CisgICAgICAgICAgICBkID0gKGMgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIGMgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIGEgKz0gYzsKKyAgICAgICAgICAgIGIgKz0gZDsKKworICAgICAgICAgICAgZSA9ICooKHVpbnQzMiopKHJlZiArIDcyKSk7IC8qIGUsIGYgKi8KKyAgICAgICAgICAgIGYgPSAoZSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgZSAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgYyA9ICooKHVpbnQzMiopKHJlZiArIDQ4KSk7IC8qIGMsIGQgKi8KKyAgICAgICAgICAgIGQgPSAoYyA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgYyAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgYyArPSBlOworICAgICAgICAgICAgZCArPSBmOworCisgICAgICAgICAgICBhICs9IDIwICogYzsKKyAgICAgICAgICAgIGIgKz0gMjAgKiBkOworICAgICAgICAgICAgYSArPSAweDEwMDAxMDsKKyAgICAgICAgICAgIGIgKz0gMHgxMDAwMTA7CisKKyAgICAgICAgICAgIGUgPSAqKCh1aW50MzIqKShyZWYgKz0gMjQpKTsgLyogZSwgZiAqLworICAgICAgICAgICAgZiA9IChlID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICBlICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICBjID0gKigodWludDMyKikocmVmICsgNzIpKTsgLyogYywgZCAqLworICAgICAgICAgICAgZCA9IChjID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICBjICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICBjICs9IGU7CisgICAgICAgICAgICBkICs9IGY7CisKKyAgICAgICAgICAgIGEgLT0gNSAqIGM7CisgICAgICAgICAgICBiIC09IDUgKiBkOworCisgICAgICAgICAgICBjID0gYSA8PCAxNjsKKyAgICAgICAgICAgIGQgPSBiIDw8IDE2OworICAgICAgICAgICAgQ0xJUF9VUFBFUjE2KGEpCisgICAgICAgICAgICBDTElQX1VQUEVSMTYoYykKKyAgICAgICAgICAgIENMSVBfVVBQRVIxNihiKQorICAgICAgICAgICAgQ0xJUF9VUFBFUjE2KGQpCisKKyAgICAgICAgICAgIGEgfD0gKGMgPj4gMTYpOworICAgICAgICAgICAgYiB8PSAoZCA+PiAxNik7CisgICAgICAgICAgICAvLyAgYT4+PTU7CisgICAgICAgICAgICAvLyAgYj4+PTU7CisgICAgICAgICAgICAvKiBjbGlwICovCisgICAgICAgICAgICAvLyAgbXNrIHw9IGI7ICBtc2t8PWE7CisgICAgICAgICAgICAvLyAgYSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIC8vICBiICY9IDB4RkYwMEZGOworICAgICAgICAgICAgYSB8PSAoYiA8PCA4KTsgIC8qIHBhY2sgaXQgYmFjayAqLworCisgICAgICAgICAgICAqKCh1aW50MTYqKShkc3QgKz0gMjQpKSA9IGEgJiAweEZGRkY7IC8vZHN0IGlzIG5vdCB3b3JkLWFsaWduZWQuCisgICAgICAgICAgICAqKCh1aW50MTYqKShkc3QgKyAyKSkgPSBhID4+IDE2OworCisgICAgICAgIH0KKyAgICAgICAgZHN0IC09IDQwNDsgLy8gMjQqMTctNAorICAgICAgICByZWYgLT0gNDA0OworICAgICAgICAvKiAgICAgIGlmKG1zayAmIDB4RkYwMEZGMDApIC8vIG5lZWQgY2xpcHBpbmcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZlcnRJbnRlcnBXQ2xpcChkc3QscmVmKTsgLy8gcmUtZG8gNCBjb2x1bW4gd2l0aCBjbGlwCisgICAgICAgICAgICAgICAgfSovCisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBWZXJ0SW50ZXJwV0NsaXAodWludDggKmRzdCwgdWludDggKnJlZikKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgYSwgYiwgYywgZCwgZSwgZjsKKyAgICBpbnQzMiB0bXAzMjsKKworICAgIGRzdCAtPSA0OworICAgIHJlZiAtPSA0OworCisgICAgZm9yIChpID0gNDsgaSA+IDA7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDE2OyBqID4gMDsgaiAtPSA0KQorICAgICAgICB7CisgICAgICAgICAgICBhID0gKnJlZjsKKyAgICAgICAgICAgIGIgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBjID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgZCA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIGUgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBmID0gKihyZWYgKz0gMjQpOworCisgICAgICAgICAgICB0bXAzMiA9IGEgKyBmIC0gNSAqIChiICsgZSkgKyAyMCAqIChjICsgZCk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgYSA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIHRtcDMyID0gYiArIGEgLSA1ICogKGMgKyBmKSArIDIwICogKGQgKyBlKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgICAgICBiID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgdG1wMzIgPSBjICsgYiAtIDUgKiAoZCArIGEpICsgMjAgKiAoZSArIGYpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIGMgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICB0bXAzMiA9IGQgKyBjIC0gNSAqIChlICsgYikgKyAyMCAqIChmICsgYSk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgcmVmIC09ICgyNCA8PCAyKTsKKyAgICAgICAgfQorCisgICAgICAgIGQgPSByZWZbMTIwXTsgLy8gMjQqNQorICAgICAgICB0bXAzMiA9IGUgKyBkIC0gNSAqIChmICsgYykgKyAyMCAqIChhICsgYik7CisgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICBkc3RbMjRdID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgZHN0IC09ICgoMjQgPDwgNCkgLSAxKTsKKyAgICAgICAgcmVmIC09ICgoMjQgPDwgNCkgLSAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgR2VuZXJhdGVRdWFydFBlbFByZWQodWludDggKipiaWxpbl9iYXNlLCB1aW50OCAqcXBlbF9jYW5kLCBpbnQgaHBlbF9wb3MpCit7CisgICAgLy8gZm9yIGV2ZW4gdmFsdWUgb2YgaHBlbF9wb3MsIHN0YXJ0IHdpdGggcGF0dGVybiAxLCBvdGhlcndpc2UsIHN0YXJ0IHdpdGggcGF0dGVybiAyCisgICAgaW50IGksIGo7CisKKyAgICB1aW50OCAqYzEgPSBxcGVsX2NhbmQ7CisgICAgdWludDggKnRsID0gYmlsaW5fYmFzZVswXTsKKyAgICB1aW50OCAqdHIgPSBiaWxpbl9iYXNlWzFdOworICAgIHVpbnQ4ICpibCA9IGJpbGluX2Jhc2VbMl07CisgICAgdWludDggKmJyID0gYmlsaW5fYmFzZVszXTsKKyAgICBpbnQgYSwgYiwgYywgZDsKKyAgICBpbnQgb2Zmc2V0ID0gMSAtICgzODQgKiA3KTsKKworICAgIGlmICghKGhwZWxfcG9zJjEpKSAvLyBkaWFtb25kIHBhdHRlcm4KKyAgICB7CisgICAgICAgIGogPSAxNjsKKyAgICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDE2OworICAgICAgICAgICAgd2hpbGUgKGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gdHJbMjRdOworICAgICAgICAgICAgICAgIGEgPSAqdHIrKzsKKyAgICAgICAgICAgICAgICBiID0gYmxbMV07CisgICAgICAgICAgICAgICAgYyA9ICpicisrOworCisgICAgICAgICAgICAgICAgKmMxID0gKGMgKyBhICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYiArIGEgKyAxKSA+PiAxOyAvKiBjMiAqLworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChiICsgYyArIDEpID4+IDE7IC8qIGMzICovCisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGIgKyBkICsgMSkgPj4gMTsgLyogYzQgKi8KKworICAgICAgICAgICAgICAgIGIgPSAqYmwrKzsKKworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChjICsgZCArIDEpID4+IDE7ICAvKiBjNSAqLworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChiICsgZCArIDEpID4+IDE7ICAvKiBjNiAqLworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChiICsgYyArIDEpID4+IDE7ICAvKiBjNyAqLworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChiICsgYSArIDEpID4+IDE7ICAvKiBjOCAqLworCisgICAgICAgICAgICAgICAgYzEgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWR2YW5jZSB0byB0aGUgbmV4dCBsaW5lLCBwaXRjaCBpcyAyNAorICAgICAgICAgICAgdGwgKz0gODsKKyAgICAgICAgICAgIHRyICs9IDg7CisgICAgICAgICAgICBibCArPSA4OworICAgICAgICAgICAgYnIgKz0gODsKKyAgICAgICAgICAgIGMxICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvLyBzdGFyIHBhdHRlcm4KKyAgICB7CisgICAgICAgIGogPSAxNjsKKyAgICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDE2OworICAgICAgICAgICAgd2hpbGUgKGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhID0gKmJyKys7CisgICAgICAgICAgICAgICAgYiA9ICp0cisrOworICAgICAgICAgICAgICAgIGMgPSB0bFsxXTsKKyAgICAgICAgICAgICAgICAqYzEgPSAoYSArIGIgKyAxKSA+PiAxOworICAgICAgICAgICAgICAgIGIgPSBibFsxXTsKKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYSArIGMgKyAxKSA+PiAxOyAvKiBjMiAqLworICAgICAgICAgICAgICAgIGMgPSB0bFsyNV07CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBiICsgMSkgPj4gMTsgLyogYzMgKi8KKyAgICAgICAgICAgICAgICBiID0gdHJbMjNdOworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChhICsgYyArIDEpID4+IDE7IC8qIGM0ICovCisgICAgICAgICAgICAgICAgYyA9IHRsWzI0XTsKKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYSArIGIgKyAxKSA+PiAxOyAvKiBjNSAqLworICAgICAgICAgICAgICAgIGIgPSAqYmwrKzsKKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYSArIGMgKyAxKSA+PiAxOyAvKiBjNiAqLworICAgICAgICAgICAgICAgIGMgPSAqdGwrKzsKKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYSArIGIgKyAxKSA+PiAxOyAvKiBjNyAqLworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChhICsgYyArIDEpID4+IDE7IC8qIGM4ICovCisKKyAgICAgICAgICAgICAgICBjMSArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGxpbmUsIHBpdGNoIGlzIDI0CisgICAgICAgICAgICB0bCArPSA4OworICAgICAgICAgICAgdHIgKz0gODsKKyAgICAgICAgICAgIGJsICs9IDg7CisgICAgICAgICAgICBiciArPSA4OworICAgICAgICAgICAgYzEgKz0gODsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworLyogYXNzdW1pbmcgY2FuZCBhbHdheXMgaGFzIGEgcGl0Y2ggb2YgMjQgKi8KK2ludCBTQVREX01CKHVpbnQ4ICpjYW5kLCB1aW50OCAqY3VyLCBpbnQgZG1pbikKK3sKKyAgICBpbnQgY29zdDsKKworCisgICAgZG1pbiA9IChkbWluIDw8IDE2KSB8IDI0OworICAgIGNvc3QgPSBBVkNTQURfTWFjcm9ibG9ja19DKGNhbmQsIGN1ciwgZG1pbiwgTlVMTCk7CisKKyAgICByZXR1cm4gY29zdDsKK30KKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaGVhZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9oZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2ZmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaGVhZGVyLmNwcApAQCAtMCwwICsxLDkxNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisjaW5jbHVkZSAiYXZjZW5jX2FwaS5oIgorCisvKiogc2VlIHN1YmNsYXVzZSA3LjQuMi4xICovCisvKiBubyBuZWVkIGZvciBjaGVja2luZyB0aGUgdmFsaWQgcmFuZ2UgLCBhbHJlYWR5IGRvbmUgaW4gU2V0RW5jb2RlUGFyYW0oKSwKK2lmIHdlIGhhdmUgdG8gc2VuZCBhbm90aGVyIFNQUywgdGhlIHJhbmdlcyBzaG91bGQgYmUgdmVyaWZpZWQgZmlyc3QgYmVmb3JlCit1c2VycyBjYWxsIFBWQVZDRW5jb2RlU1BTKCkgKi8KK0FWQ0VuY19TdGF0dXMgRW5jb2RlU1BTKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDU2VxUGFyYW1TZXQgKnNlcVBhcmFtID0gdmlkZW8tPmN1cnJTZXFQYXJhbXM7CisgICAgQVZDVlVJUGFyYW1zICp2dWkgPSAmKHNlcVBhcmFtLT52dWlfcGFyYW1ldGVycyk7CisgICAgaW50IGk7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKworICAgIC8vREVCVUdfTE9HKHVzZXJEYXRhLEFWQ19MT0dUWVBFX0lORk8sIkVuY29kZVNQUyIsLTEsLTEpOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgOCwgc2VxUGFyYW0tPnByb2ZpbGVfaWRjKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MF9mbGFnKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MV9mbGFnKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0Ml9mbGFnKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0M19mbGFnKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA0LCAwKTsgIC8qIGZvcmJpZGRlbiB6ZXJvIGJpdHMgKi8KKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKSAgLyogd2UgY2FuIGNoZWNrIGFmdGVyIGVhY2ggd3JpdGUgYWxzbyAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA4LCBzZXFQYXJhbS0+bGV2ZWxfaWRjKTsKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkKTsKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQpOworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+cGljX29yZGVyX2NudF90eXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQpOworICAgIH0KKyAgICBlbHNlIGlmIChzZXFQYXJhbS0+cGljX29yZGVyX2NudF90eXBlID09IDEpCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpOworICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2VxUGFyYW0tPm9mZnNldF9mb3Jfbm9uX3JlZl9waWMpOyAvKiB1cHRvIDMyIGJpdHMgKi8KKyAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNlcVBhcmFtLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQpOyAvKiB1cHRvIDMyIGJpdHMgKi8KKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkoc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV0pOyAvKiB1cHRvIDMyIGJpdHMgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnKTsKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPnBpY193aWR0aF9pbl9tYnNfbWludXMxKTsKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmZyYW1lX21ic19vbmx5X2ZsYWcpOworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAvKiBpZiBmcmFtZV9tYnNfb25seV9mbGFnIGlzIDAsIHRoZW4gd3JpdGUsIG1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZyYW1lIGhlcmUgKi8KKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+ZnJhbWVfY3JvcHBpbmdfZmxhZyk7CisgICAgaWYgKHNlcVBhcmFtLT5mcmFtZV9jcm9wcGluZ19mbGFnKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0KTsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCk7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0KTsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQpOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKTsKKyAgICBpZiAoc2VxUGFyYW0tPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykKKyAgICB7CisgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgLy9yZXR1cm4gQVZDRU5DX1NQU19GQUlMOworICAgICAgICBFbmNvZGVWVUkoc3RyZWFtLCB2dWkpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBFbmNvZGVWVUkoQVZDRW5jQml0c3RyZWFtKiBzdHJlYW0sIEFWQ1ZVSVBhcmFtcyogdnVpKQoreworICAgIGludCB0ZW1wOworCisgICAgdGVtcCA9IHZ1aS0+YXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnOworICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHRlbXApOworICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgOCwgdnVpLT5hc3BlY3RfcmF0aW9faWRjKTsKKyAgICAgICAgaWYgKHZ1aS0+YXNwZWN0X3JhdGlvX2lkYyA9PSAyNTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDE2LCB2dWktPnNhcl93aWR0aCk7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNiwgdnVpLT5zYXJfaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0ZW1wID0gdnVpLT5vdmVyc2Nhbl9pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHZ1aS0+b3ZlcnNjYW5fYXBwcm9wcmlhdGVfZmxhZyk7CisgICAgfQorICAgIHRlbXAgPSB2dWktPnZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDMsIHZ1aS0+dmlkZW9fZm9ybWF0KTsKKyAgICAgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdnVpLT52aWRlb19mdWxsX3JhbmdlX2ZsYWcpOworICAgICAgICB0ZW1wID0gdnVpLT5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnOworICAgICAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICAgICAgaWYgKHRlbXApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDgsIHZ1aS0+Y29sb3VyX3ByaW1hcmllcyk7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA4LCB2dWktPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyk7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA4LCB2dWktPm1hdHJpeF9jb2VmZmljaWVudHMpOworICAgICAgICB9CisgICAgfQorICAgIHRlbXAgPSB2dWktPmNocm9tYV9sb2NhdGlvbl9pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPmNocm9tYV9zYW1wbGVfbG9jX3R5cGVfdG9wX2ZpZWxkKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+Y2hyb21hX3NhbXBsZV9sb2NfdHlwZV9ib3R0b21fZmllbGQpOworICAgIH0KKworICAgIHRlbXAgPSB2dWktPnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDMyLCB2dWktPm51bV91bml0c19pbl90aWNrKTsKKyAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMzIsIHZ1aS0+dGltZV9zY2FsZSk7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHZ1aS0+Zml4ZWRfZnJhbWVfcmF0ZV9mbGFnKTsKKyAgICB9CisKKyAgICB0ZW1wID0gdnVpLT5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHRlbXApOworICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgRW5jb2RlSFJEKHN0cmVhbSwgJih2dWktPm5hbF9ocmRfcGFyYW1ldGVycykpOworICAgIH0KKyAgICB0ZW1wID0gdnVpLT52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHRlbXApOworICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgRW5jb2RlSFJEKHN0cmVhbSwgJih2dWktPnZjbF9ocmRfcGFyYW1ldGVycykpOworICAgIH0KKyAgICBpZiAodnVpLT5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnIHx8IHZ1aS0+dmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHZ1aS0+bG93X2RlbGF5X2hyZF9mbGFnKTsKKyAgICB9CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdnVpLT5waWNfc3RydWN0X3ByZXNlbnRfZmxhZyk7CisgICAgdGVtcCA9IHZ1aS0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB2dWktPm1vdGlvbl92ZWN0b3JzX292ZXJfcGljX2JvdW5kYXJpZXNfZmxhZyk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPm1heF9ieXRlc19wZXJfcGljX2Rlbm9tKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+bWF4X2JpdHNfcGVyX21iX2Rlbm9tKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+bG9nMl9tYXhfbXZfbGVuZ3RoX2hvcml6b250YWwpOworICAgICAgICB1ZV92KHN0cmVhbSwgdnVpLT5sb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwpOworICAgICAgICB1ZV92KHN0cmVhbSwgdnVpLT5tYXhfZGVjX2ZyYW1lX3Jlb3JkZXJpbmcpOworICAgICAgICB1ZV92KHN0cmVhbSwgdnVpLT5tYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyk7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIEVuY29kZUhSRChBVkNFbmNCaXRzdHJlYW0qIHN0cmVhbSwgQVZDSFJEUGFyYW1zKiBocmQpCit7CisgICAgaW50IGk7CisKKyAgICB1ZV92KHN0cmVhbSwgaHJkLT5jcGJfY250X21pbnVzMSk7CisgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgNCwgaHJkLT5iaXRfcmF0ZV9zY2FsZSk7CisgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgNCwgaHJkLT5jcGJfc2l6ZV9zY2FsZSk7CisgICAgZm9yIChpID0gMDsgaSA8PSAoaW50KWhyZC0+Y3BiX2NudF9taW51czE7IGkrKykKKyAgICB7CisgICAgICAgIHVlX3Yoc3RyZWFtLCBocmQtPmJpdF9yYXRlX3ZhbHVlX21pbnVzMVtpXSk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCBocmQtPmNwYl9zaXplX3ZhbHVlX21pbnVzMVtpXSk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCBocmQtPmNicl9mbGFnW2ldKTsKKyAgICB9CisgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgNSwgaHJkLT5pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEpOworICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDUsIGhyZC0+Y3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSk7CisgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgNSwgaHJkLT5kcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEpOworICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDUsIGhyZC0+dGltZV9vZmZzZXRfbGVuZ3RoKTsKKworICAgIHJldHVybiA7Cit9CisKKworCisvKiogc2VlIHN1YmNsYXVzZSA3LjQuMi4yICovCisvKiBubyBuZWVkIGZvciBjaGVja2luZyB0aGUgdmFsaWQgcmFuZ2UgLCBhbHJlYWR5IGRvbmUgaW4gU2V0RW5jb2RlUGFyYW0oKS4KK0lmIHdlIGhhdmUgdG8gc2VuZCBhbm90aGVyIFNQUywgdGhlIHJhbmdlcyBzaG91bGQgYmUgdmVyaWZpZWQgZmlyc3QgYmVmb3JlCit1c2VycyBjYWxsIFBWQVZDRW5jb2RlU1BTKCkqLworQVZDRW5jX1N0YXR1cyBFbmNvZGVQUFMoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIEFWQ1BpY1BhcmFtU2V0ICpwaWNQYXJhbSA9IHZpZGVvLT5jdXJyUGljUGFyYW1zOworICAgIGludCBpLCBpR3JvdXAsIG51bUJpdHM7CisgICAgdWludCB0ZW1wOworCisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5waWNfcGFyYW1ldGVyX3NldF9pZCk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5zZXFfcGFyYW1ldGVyX3NldF9pZCk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgcGljUGFyYW0tPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgcGljUGFyYW0tPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcpOworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEpOworICAgIGlmIChwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiAwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSk7CisgICAgICAgIGlmIChwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpR3JvdXAgPSAwOyBpR3JvdXAgPD0gKGludClwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7IGlHcm91cCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+cnVuX2xlbmd0aF9taW51czFbaUdyb3VwXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaUdyb3VwID0gMDsgaUdyb3VwIDwgKGludClwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7IGlHcm91cCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+dG9wX2xlZnRbaUdyb3VwXSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5ib3R0b21fcmlnaHRbaUdyb3VwXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDMgfHwKKyAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDQgfHwKKyAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcpOworICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyppZihwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPT0gNikqLworICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPnBpY19zaXplX2luX21hcF91bml0c19taW51czEpOworCisgICAgICAgICAgICBudW1CaXRzID0gMDsvKiBjZWlsKGxvZzIobnVtX3NsaWNlX2dyb3Vwc19taW51czErMSkpIGJpdHMgKi8KKyAgICAgICAgICAgIGkgPSBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7CisgICAgICAgICAgICB3aGlsZSAoaSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbnVtQml0cysrOworICAgICAgICAgICAgICAgIGkgPj49IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gKGludClwaWNQYXJhbS0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIG51bUJpdHMsIHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxKTsKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHBpY1BhcmFtLT53ZWlnaHRlZF9wcmVkX2ZsYWcpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDIsIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgcGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYpOworICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNik7CisgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHBpY1BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0KTsKKworICAgIHRlbXAgPSBwaWNQYXJhbS0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPDwgMjsKKyAgICB0ZW1wIHw9IChwaWNQYXJhbS0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnIDw8IDEpOworICAgIHRlbXAgfD0gcGljUGFyYW0tPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZzsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDMsIHRlbXApOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqIHNlZSBzdWJjbGF1c2UgNy40LjMgKi8KK0FWQ0VuY19TdGF0dXMgRW5jb2RlU2xpY2VIZWFkZXIoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgQVZDUGljUGFyYW1TZXQgKmN1cnJQUFMgPSB2aWRlby0+Y3VyclBpY1BhcmFtczsKKyAgICBBVkNTZXFQYXJhbVNldCAqY3VyclNQUyA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgaW50IHNsaWNlX3R5cGUsIHRlbXAsIGk7CisgICAgaW50IG51bV9iaXRzOworCisgICAgbnVtX2JpdHMgPSAoc3RyZWFtLT53cml0ZV9wb3MgPDwgMykgLSBzdHJlYW0tPmJpdF9sZWZ0OworCisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5maXJzdF9tYl9pbl9zbGljZSk7CisKKyAgICBzbGljZV90eXBlID0gdmlkZW8tPnNsaWNlX3R5cGU7CisKKyAgICBpZiAodmlkZW8tPm1iTnVtID09IDApIC8qIGZpcnN0IG1iIGluIGZyYW1lICovCisgICAgeworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPnNsaWNlX3R5cGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VfdHlwZSk7CisgICAgfQorCisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5waWNfcGFyYW1ldGVyX3NldF9pZCk7CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBjdXJyU1BTLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCwgc2xpY2VIZHItPmZyYW1lX251bSk7CisKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgLyogaWYgZnJhbWVfbWJzX29ubHlfZmxhZyBpcyAwLCBlbmNvZGUgZmllbGRfcGljX2ZsYWcsIGJvdHRvbV9maWVsZF9mbGFnIGhlcmUgKi8KKworICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgeworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmlkcl9waWNfaWQpOworICAgIH0KKworICAgIGlmIChjdXJyU1BTLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIGN1cnJTUFMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IpOworCisgICAgICAgIGlmIChjdXJyUFBTLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnICYmICFzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20pOyAvKiAzMiBiaXRzICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGN1cnJTUFMtPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxICYmICFjdXJyU1BTLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXSk7ICAgIC8qIDMyIGJpdHMgKi8KKyAgICAgICAgaWYgKGN1cnJQUFMtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgJiYgIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzFdKTsgLyogMzIgYml0cyAqLworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJQUFMtPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZykKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+cmVkdW5kYW50X3BpY19jbnQpOworICAgIH0KKworICAgIGlmIChzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPmRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZyk7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UgfHwgc2xpY2VfdHlwZSA9PSBBVkNfU1BfU0xJQ0UgfHwgc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZyk7CisgICAgICAgIGlmIChzbGljZUhkci0+bnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdlIHNob3VsZG4ndCBlbnRlciB0aGlzIHBhcnQgYXQgYWxsICovCisgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEpOworICAgICAgICAgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiByZWZfcGljX2xpc3RfcmVvcmRlcmluZygpICovCisgICAgc3RhdHVzID0gcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcodmlkZW8sIHN0cmVhbSwgc2xpY2VIZHIsIHNsaWNlX3R5cGUpOworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGlmICgoY3VyclBQUy0+d2VpZ2h0ZWRfcHJlZF9mbGFnICYmIChzbGljZV90eXBlID09IEFWQ19QX1NMSUNFIHx8IHNsaWNlX3R5cGUgPT0gQVZDX1NQX1NMSUNFKSkgfHwKKyAgICAgICAgICAgIChjdXJyUFBTLT53ZWlnaHRlZF9iaXByZWRfaWRjID09IDEgJiYgc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkpCisgICAgeworICAgICAgICAvLyAgICAgIHByZWRfd2VpZ2h0X3RhYmxlKCk7IC8vIG5vdCBzdXBwb3J0ZWQgISEKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19QUkVEX1dFSUdIVF9UQUJfRkFJTDsKKyAgICB9CisKKyAgICBpZiAodmlkZW8tPm5hbF9yZWZfaWRjICE9IDApCisgICAgeworICAgICAgICBzdGF0dXMgPSBkZWNfcmVmX3BpY19tYXJraW5nKHZpZGVvLCBzdHJlYW0sIHNsaWNlSGRyKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdXJyUFBTLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgJiYgc2xpY2VfdHlwZSAhPSBBVkNfSV9TTElDRSAmJiBzbGljZV90eXBlICE9IEFWQ19TSV9TTElDRSkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfQ0FCQUNfRkFJTDsKKyAgICAgICAgLyogICAgICB1ZV92KHN0cmVhbSwmKHNsaWNlSGRyLT5jYWJhY19pbml0X2lkYykpOworICAgICAgICAgICAgICAgIGlmKHNsaWNlSGRyLT5jYWJhY19pbml0X2lkYyA+IDIpeworICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc3VwcG9ydGVkICEhISEKKyAgICAgICAgICAgICAgICB9Ki8KKyAgICB9CisKKyAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2xpY2VIZHItPnNsaWNlX3FwX2RlbHRhKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfU1BfU0xJQ0UgfHwgc2xpY2VfdHlwZSA9PSBBVkNfU0lfU0xJQ0UpCisgICAgeworICAgICAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfU1BfU0xJQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5zcF9mb3Jfc3dpdGNoX2ZsYWcpOworICAgICAgICAgICAgLyogaWYgc3BfZm9yX3N3aXRjaF9mbGFnIGlzIDAsIFAgbWFjcm9ibG9ja3MgaW4gU1Agc2xpY2UgaXMgZGVjb2RlZCB1c2luZworICAgICAgICAgICAgU1AgZGVjb2RpbmcgcHJvY2VzcyBmb3Igbm9uLXN3aXRjaGluZyBwaWN0dXJlcyBpbiA4LjYuMSAqLworICAgICAgICAgICAgLyogZWxzZSwgUCBtYWNyb2Jsb2NrcyBpbiBTUCBzbGljZSBpcyBkZWNvZGVkIHVzaW5nIFNQIGFuZCBTSSBkZWNvZGluZworICAgICAgICAgICAgcHJvY2VzcyBmb3Igc3dpdGNoaW5nIHBpY3R1cmUgaW4gOC42LjIgKi8KKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2xpY2VIZHItPnNsaWNlX3FzX2RlbHRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdXJyUFBTLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZykKKyAgICB7CisKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2lkYyk7CisKKyAgICAgICAgaWYgKHNsaWNlSGRyLT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2lkYyAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2xpY2VIZHItPnNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyKTsKKworICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNsaWNlSGRyLT5zbGljZV9iZXRhX29mZnNldF9kaXZfMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdXJyUFBTLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDAgJiYgY3VyclBQUy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPj0gMworICAgICAgICAgICAgJiYgY3VyclBQUy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPD0gNSkKKyAgICB7CisgICAgICAgIC8qIENlaWwoTG9nMihQaWNTaXplSW5NYXBVbml0cy8oZmxvYXQpU2xpY2VHcm91cENoYW5nZVJhdGUgKyAxKSkgKi8KKyAgICAgICAgdGVtcCA9IHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyAvIHZpZGVvLT5TbGljZUdyb3VwQ2hhbmdlUmF0ZTsKKyAgICAgICAgaWYgKHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyAlIHZpZGVvLT5TbGljZUdyb3VwQ2hhbmdlUmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCsrOworICAgICAgICB9CisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAodGVtcCA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPj49IDE7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKworICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBpLCBzbGljZUhkci0+c2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlKTsKKyAgICB9CisKKworICAgIGVuY3ZpZC0+cmF0ZUN0cmwtPk51bWJlcm9mSGVhZGVyQml0cyArPSAoc3RyZWFtLT53cml0ZV9wb3MgPDwgMykgLSBzdHJlYW0tPmJpdF9sZWZ0IC0gbnVtX2JpdHM7CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qKiBzZWUgc3ViY2xhdXNlIDcuNC4zLjEgKi8KK0FWQ0VuY19TdGF0dXMgcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciwgaW50IHNsaWNlX3R5cGUpCit7CisgICAgKHZvaWQpKHZpZGVvKTsKKyAgICBpbnQgaTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworCisgICAgaWYgKHNsaWNlX3R5cGUgIT0gQVZDX0lfU0xJQ0UgJiYgc2xpY2VfdHlwZSAhPSBBVkNfU0lfU0xJQ0UpCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzbGljZUhkci0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ19sMCk7CisgICAgICAgIGlmIChzbGljZUhkci0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ19sMCkKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDBbaV0pOworICAgICAgICAgICAgICAgIGlmIChzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDBbaV0gPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmFic19kaWZmX3BpY19udW1fbWludXMxX2wwW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBjaGVjayBzaG91bGQgYmUgaW4gSW5pdFNsaWNlKCksIGlmIHdlIGV2ZXIgdXNlIGl0ICovCisgICAgICAgICAgICAgICAgICAgIC8qaWYoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMV9sMFtpXSA+IHZpZGVvLT5NYXhQaWNOdW0vMiAtMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19SRUZfUElDX1JFT1JERVJfRkFJTDsgLy8gb3V0IG9mIHJhbmdlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldID09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMV9sMFtpXSA+IHZpZGVvLT5NYXhQaWNOdW0vMiAtMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19SRUZfUElDX1JFT1JERVJfRkFJTDsgLy8gb3V0IG9mIHJhbmdlCisgICAgICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDBbaV0gPT0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bG9uZ190ZXJtX3BpY19udW1fbDBbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldICE9IDMKKyAgICAgICAgICAgICAgICAgICAgJiYgaSA8PSAoaW50KXNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICsgMSkgOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDEpOworICAgICAgICBpZiAoc2xpY2VIZHItPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wxW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wxW2ldID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMVtpXSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMV9sMVtpXSk7CisgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY2hlY2sgc2hvdWxkIGJlIGluIEluaXRTbGljZSgpIGlmIHdlIGV2ZXIgdXNlIGl0CisgICAgICAgICAgICAgICAgICAgIGlmKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMVtpXSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+YWJzX2RpZmZfcGljX251bV9taW51czFfbDFbaV0gPiB2aWRlby0+TWF4UGljTnVtLzIgLTEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfUkVGX1BJQ19SRU9SREVSX0ZBSUw7IC8vIG91dCBvZiByYW5nZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMVtpXSA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+YWJzX2RpZmZfcGljX251bV9taW51czFfbDFbaV0gPiB2aWRlby0+TWF4UGljTnVtLzIgLTIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfUkVGX1BJQ19SRU9SREVSX0ZBSUw7IC8vIG91dCBvZiByYW5nZQorICAgICAgICAgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wxW2ldID09IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmxvbmdfdGVybV9waWNfbnVtX2wxW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMVtpXSAhPSAzCisgICAgICAgICAgICAgICAgICAgICYmIGkgPD0gKGludClzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSArIDEpIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKiBzZWUgc3ViY2xhdXNlIDcuNC4zLjMgKi8KK0FWQ0VuY19TdGF0dXMgZGVjX3JlZl9waWNfbWFya2luZyhBVkNDb21tb25PYmogKnZpZGVvLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyKQoreworICAgIGludCBpOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisKKyAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcpOworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzbGljZUhkci0+bG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnKTsKKyAgICAgICAgaWYgKHNsaWNlSGRyLT5sb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcgPT0gMCkgLyogdXNlZCBmb3Igc2hvcnQtdGVybSAqLworICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+TWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IC0xOyAvKiBubyBsb25nLXRlcm0gZnJhbWUgaW5keCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogdXNlZCBmb3IgbG9uZy10ZXJtICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5NYXhMb25nVGVybUZyYW1lSWR4ID0gMDsKKyAgICAgICAgICAgIHZpZGVvLT5Mb25nVGVybUZyYW1lSWR4ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzbGljZUhkci0+YWRhcHRpdmVfcmVmX3BpY19tYXJraW5nX21vZGVfZmxhZyk7IC8qIGRlZmF1bHQgdG8gemVybyAqLworICAgICAgICBpZiAoc2xpY2VIZHItPmFkYXB0aXZlX3JlZl9waWNfbWFya2luZ19tb2RlX2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldID09IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5kaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gPT0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bG9uZ190ZXJtX3BpY19udW1baV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldID09IDMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSA2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5sb25nX3Rlcm1fZnJhbWVfaWR4W2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5tYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gIT0gMCAmJiBpIDwgTUFYX0RFQ19SRUZfUElDX01BUktJTkcpOworICAgICAgICAgICAgaWYgKGkgPj0gTUFYX0RFQ19SRUZfUElDX01BUktJTkcgJiYgc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19ERUNfUkVGX1BJQ19NQVJLX0ZBSUw7IC8qIHdlJ3JlIHNjcmV3ZWQhISwgbm90IGVub3VnaCBtZW1vcnkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIHNlZSBzdWJjbGF1c2UgOC4yLjEgRGVjb2RpbmcgcHJvY2VzcyBmb3IgcGljdHVyZSBvcmRlciBjb3VudC4KK1NlZSBhbHNvIFBvc3RQT0MoKSBmb3IgaW5pdGlhbGl6YXRpb24gb2Ygc29tZSB2YXJpYWJsZXMuICovCitBVkNFbmNfU3RhdHVzIEluaXRQT0MoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTID0gdmlkZW8tPmN1cnJTZXFQYXJhbXM7CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIEFWQ0ZyYW1lSU8gICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBpbnQgaTsKKworICAgIHN3aXRjaCAoY3VyclNQUy0+cGljX29yZGVyX2NudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSAwOiAvKiBQT0MgTU9ERSAwICwgc3ViY2xhdXNlIDguMi4xLjEgKi8KKyAgICAgICAgICAgIC8qIGVuY29kaW5nIHBhcnQgKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5kaXNwT3JkUE9DUmVmID0gY3VycklucHV0LT5kaXNwX29yZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGN1cnJJbnB1dC0+ZGlzcF9vcmRlciA8IGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmN2aWQtPmRpc3BPcmRQT0NSZWYgLT0gdmlkZW8tPk1heFBpY09yZGVyQ250THNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiID0gY3VycklucHV0LT5kaXNwX29yZGVyIC0gZW5jdmlkLT5kaXNwT3JkUE9DUmVmOworICAgICAgICAgICAgd2hpbGUgKHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiA+PSB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiIC09IHZpZGVvLT5NYXhQaWNPcmRlckNudExzYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRlY29kaW5nIHBhcnQgKi8KKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgTVNCcyBvZiBjdXJyZW50IHBpY3R1cmUgKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYiA9IDA7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudExzYiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiICA8ICB2aWRlby0+cHJldlBpY09yZGVyQ250THNiICAmJgorICAgICAgICAgICAgICAgICAgICAodmlkZW8tPnByZXZQaWNPcmRlckNudExzYiAtIHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYikgID49ICh2aWRlby0+TWF4UGljT3JkZXJDbnRMc2IgLyAyKSkKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnRNc2IgPSB2aWRlby0+cHJldlBpY09yZGVyQ250TXNiICsgdmlkZW8tPk1heFBpY09yZGVyQ250THNiOworICAgICAgICAgICAgZWxzZSBpZiAoc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiICA+ICB2aWRlby0+cHJldlBpY09yZGVyQ250THNiICAmJgorICAgICAgICAgICAgICAgICAgICAgKHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiAtIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IpICA+ICh2aWRlby0+TWF4UGljT3JkZXJDbnRMc2IgLyAyKSkKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnRNc2IgPSB2aWRlby0+cHJldlBpY09yZGVyQ250TXNiIC0gdmlkZW8tPk1heFBpY09yZGVyQ250THNiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudE1zYiA9IHZpZGVvLT5wcmV2UGljT3JkZXJDbnRNc2I7CisKKyAgICAgICAgICAgIC8qIEpWVC1JMDEwIHBhZ2UgODEgaXMgZGlmZmVyZW50IGZyb20gSk03LjMgKi8KKyAgICAgICAgICAgIGlmICghc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnIHx8ICFzbGljZUhkci0+Ym90dG9tX2ZpZWxkX2ZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQgPSB2aWRlby0+UGljT3JkZXJDbnRNc2IgKyBzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250ID0gdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQgKyBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b207CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzbGljZUhkci0+Ym90dG9tX2ZpZWxkX2ZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSB2aWRlby0+UGljT3JkZXJDbnRNc2IgKyBzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IEFWQ19NSU4odmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQsIHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyUGljUGFyYW1zLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnICYmICFzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tID0gMDsgLyogZGVmYXVsdGVkIHRvIHplcm8gKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLyogUE9DIE1PREUgMSwgc3ViY2xhdXNlIDguMi4xLjIgKi8KKyAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBGcmFtZU51bU9mZnNldCAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmN2aWQtPmRpc3BPcmRQT0NSZWYgPSBjdXJySW5wdXQtPmRpc3Bfb3JkZXI7ICAvKiByZXNldCB0aGUgcmVmZXJlbmNlIHBvaW50ICovCisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5wcmV2RnJhbWVOdW0gPiBzbGljZUhkci0+ZnJhbWVfbnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5GcmFtZU51bU9mZnNldCA9IHZpZGVvLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyB2aWRlby0+TWF4RnJhbWVOdW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBhYnNGcmFtZU51bSAqLworICAgICAgICAgICAgaWYgKGN1cnJTUFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmFic0ZyYW1lTnVtID0gdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ICsgc2xpY2VIZHItPmZyYW1lX251bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+YWJzRnJhbWVOdW0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmlkZW8tPmFic0ZyYW1lTnVtID4gMCAmJiB2aWRlby0+bmFsX3JlZl9pZGMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+YWJzRnJhbWVOdW0tLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZGVyaXZlIHBpY09yZGVyQ250Q3ljbGVDbnQgYW5kIGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlICovCisgICAgICAgICAgICBpZiAodmlkZW8tPmFic0ZyYW1lTnVtID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cGljT3JkZXJDbnRDeWNsZUNudCA9ICh2aWRlby0+YWJzRnJhbWVOdW0gLSAxKSAvIGN1cnJTUFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7CisgICAgICAgICAgICAgICAgdmlkZW8tPmZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlID0gKHZpZGVvLT5hYnNGcmFtZU51bSAtIDEpICUgY3VyclNQUy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRlcml2ZSBleHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZSwgdGhpcyB2YWx1ZSBjYW4gYmUgY29tcHV0ZWQgdXAgZnJvbnQuICovCisgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpY3VyclNQUy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5leHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZSArPSBjdXJyU1BTLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRlcml2ZSBleHBlY3RlZFBpY09yZGVyQ250ICovCisgICAgICAgICAgICBpZiAodmlkZW8tPmFic0ZyYW1lTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5leHBlY3RlZFBpY09yZGVyQ250ID0gdmlkZW8tPnBpY09yZGVyQ250Q3ljbGVDbnQgKiB2aWRlby0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGU7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSB2aWRlby0+ZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5leHBlY3RlZFBpY09yZGVyQ250ICs9IGN1cnJTUFMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3JlZl9pZGMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCArPSBjdXJyU1BTLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGVyaXZlIFRvcEZpZWxkT3JkZXJDbnQgYW5kIEJvdHRvbUZpZWxkT3JkZXJDbnQgKi8KKyAgICAgICAgICAgIC8qIGVuY29kaW5nIHBhcnQgKi8KKyAgICAgICAgICAgIGlmICghY3VyclNQUy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0gPSBjdXJySW5wdXQtPmRpc3Bfb3JkZXIgLSBlbmN2aWQtPmRpc3BPcmRQT0NSZWYgLSB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudDsKKworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclBpY1BhcmFtcy0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyAmJiAhc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0gPSBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsgLyogc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZnJvbSBjdXJySW5wdXQtPmJvdHRvbV9maWVsZC0+ZGlzcF9vcmRlciAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdID0gc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQgPSB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCArIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOworICAgICAgICAgICAgICAgIHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250ID0gdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQgKyBjdXJyU1BTLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgKyBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFsxXTsKKworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IEFWQ19NSU4odmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQsIHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlSGRyLT5ib3R0b21fZmllbGRfZmxhZyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ID0gdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgKyBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSB2aWRlby0+VG9wRmllbGRPcmRlckNudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCA9IHZpZGVvLT5leHBlY3RlZFBpY09yZGVyQ250ICsgY3VyclNQUy0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkICsgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF07CisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgMjogLyogUE9DIE1PREUgMiwgc3ViY2xhdXNlIDguMi4xLjMgKi8KKyAgICAgICAgICAgIC8qIGRlY29kaW5nIG9yZGVyIG11c3QgYmUgdGhlIHNhbWUgYXMgZGlzcGxheSBvcmRlciAqLworICAgICAgICAgICAgLyogd2UgZG9uJ3QgY2hlY2sgZm9yIHRoYXQuIFRoZSBkZWNvZGVyIHdpbGwganVzdCBvdXRwdXQgaW4gZGVjb2Rpbmcgb3JkZXIuICovCisgICAgICAgICAgICAvKiBDaGVjayBmb3IgMiBjb25zZWN1dGl2ZSBub24tcmVmZXJlbmNlIGZyYW1lICovCisgICAgICAgICAgICBpZiAodmlkZW8tPm5hbF9yZWZfaWRjID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19DT05TRUNVVElWRV9OT05SRUY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZiA9IDE7ICAvKiBhY3QgYXMgYSBmbGFnIGZvciBub24gcmVmICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5kaXNwT3JkUE9DUmVmID0gMDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5GcmFtZU51bU9mZnNldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+cHJldkZyYW1lTnVtID4gc2xpY2VIZHItPmZyYW1lX251bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgdmlkZW8tPk1heEZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5GcmFtZU51bU9mZnNldCA9IHZpZGVvLT5wcmV2RnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZXJpdmUgdGVtcFBpY09yZGVyQ250LCB3ZSBqdXN0IHVzZSBQaWNPcmRlckNudCAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPm5hbF9yZWZfaWRjID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gMiAqICh2aWRlby0+RnJhbWVOdW1PZmZzZXQgKyBzbGljZUhkci0+ZnJhbWVfbnVtKSAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gMiAqICh2aWRlby0+RnJhbWVOdW1PZmZzZXQgKyBzbGljZUhkci0+ZnJhbWVfbnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRlcml2ZSBUb3BGaWVsZE9yZGVyQ250IGFuZCBCb3R0b21GaWVsZE9yZGVyQ250ICovCisgICAgICAgICAgICBpZiAoc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQgPSB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCA9IHZpZGVvLT5QaWNPcmRlckNudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlSGRyLT5ib3R0b21fZmllbGRfZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCA9IHZpZGVvLT5QaWNPcmRlckNudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+VG9wRmllbGRPcmRlckNudCA9IHZpZGVvLT5QaWNPcmRlckNudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19QT0NfRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qKiBzZWUgc3ViY2xhdXNlIDguMi4xICovCitBVkNFbmNfU3RhdHVzIFBvc3RQT0MoQVZDQ29tbW9uT2JqICp2aWRlbykKK3sKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgQVZDU2VxUGFyYW1TZXQgKmN1cnJTUFMgPSB2aWRlby0+Y3VyclNlcVBhcmFtczsKKworICAgIHZpZGVvLT5wcmV2RnJhbWVOdW0gPSBzbGljZUhkci0+ZnJhbWVfbnVtOworCisgICAgc3dpdGNoIChjdXJyU1BTLT5waWNfb3JkZXJfY250X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIDA6IC8qIHN1YmNsYXVzZSA4LjIuMS4xICovCisgICAgICAgICAgICBpZiAodmlkZW8tPm1lbV9tZ3JfY3RybF9lcV81KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRNc2IgPSAwOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IgPSB2aWRlby0+VG9wRmllbGRPcmRlckNudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlBpY09yZGVyQ250TXNiID0gdmlkZW8tPlBpY09yZGVyQ250TXNiOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IgPSBzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAgLyogc3ViY2xhdXNlIDguMi4xLjIgYW5kIDguMi4xLjMgKi8KKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKHZpZGVvLT5tZW1fbWdyX2N0cmxfZXFfNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gdmlkZW8tPkZyYW1lTnVtT2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaW5pdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1OGI1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9pbml0LmNwcApAQCAtMCwwICsxLDg5OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisjaW5jbHVkZSAiYXZjZW5jX2FwaS5oIgorCisjZGVmaW5lIExPRzJfTUFYX0ZSQU1FX05VTV9NSU5VUzQgICAxMiAgIC8qIDEyIGRlZmF1bHQgKi8KKyNkZWZpbmUgU0xJQ0VfR1JPVVBfQ0hBTkdFX0NZQ0xFICAgIDEgICAgLyogZGVmYXVsdCAqLworCisvKiBpbml0aWFsaXplZCB2YXJpYWJsZXMgdG8gYmUgdXNlZCBpbiBTUFMqLworQVZDRW5jX1N0YXR1cyAgU2V0RW5jb2RlUGFyYW0oQVZDSGFuZGxlKiBhdmNIYW5kbGUsIEFWQ0VuY1BhcmFtcyogZW5jUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRTUFMsIHZvaWQqIGV4dFBQUykKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDU2VxUGFyYW1TZXQgKnNlcVBhcmFtID0gdmlkZW8tPmN1cnJTZXFQYXJhbXM7CisgICAgQVZDUGljUGFyYW1TZXQgKnBpY1BhcmFtID0gdmlkZW8tPmN1cnJQaWNQYXJhbXM7CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisgICAgdm9pZCAqdXNlckRhdGEgPSBhdmNIYW5kbGUtPnVzZXJEYXRhOworICAgIGludCBpaSwgbWF4RnJhbWVOdW07CisKKyAgICBBVkNTZXFQYXJhbVNldCogZXh0UyA9IE5VTEw7CisgICAgQVZDUGljUGFyYW1TZXQqIGV4dFAgPSBOVUxMOworCisgICAgaWYgKGV4dFNQUykgZXh0UyA9IChBVkNTZXFQYXJhbVNldCopIGV4dFNQUzsKKyAgICBpZiAoZXh0UFBTKSBleHRQID0gKEFWQ1BpY1BhcmFtU2V0KikgZXh0UFBTOworCisgICAgLyogVGhpcyBwYXJ0IHNldHMgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyBvcHRpb25zIHRoaXMKKyAgICBsaWJyYXJ5IHN1cHBvcnRzIGluIHNlcVBhcmFtLCBwaWNQYXJhbSBhbmQgc2xpY2VIZHIgc3RydWN0dXJlcyBhbmQKKyAgICBhbHNvIGNvcHkgdGhlIHZhbHVlcyBmcm9tIHRoZSBlbmNQYXJhbSBpbnRvIHRoZSBhYm92ZSAzIHN0cnVjdHVyZXMuCisKKyAgICBTb21lIHBhcmFtZXRlcnMgd2lsbCBiZSBhc3NpZ25lZCBsYXRlciB3aGVuIHdlIGVuY29kZSBTUFMgb3IgUFBTIHN1Y2ggYXMKKyAgICB0aGUgc2VxX3BhcmFtZXRlcl9pZCBvciBwaWNfcGFyYW1ldGVyX2lkLiBBbHNvIHNvbWUgb2YgdGhlIHNsaWNlIHBhcmFtZXRlcnMKKyAgICBoYXZlIHRvIGJlIHJlLWFzc2lnbmVkIHBlciBzbGljZSBiYXNpcyBzdWNoIGFzIGZyYW1lX251bSwgc2xpY2VfdHlwZSwKKyAgICBmaXJzdF9tYl9pbl9zbGljZSwgcGljX29yZGVyX2NudF9sc2IsIHNsaWNlX3FwX2RlbHRhLCBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUgKi8KKworICAgIC8qIHByb2ZpbGVfaWRjLCBjb25zdHJhaW5lZF9zZXR4X2ZsYWcgYW5kIGxldmVsX2lkYyBpcyBzZXQgYnkgVmVyaWZ5UHJvZmlsZSgpLAorICAgIGFuZCBWZXJpZnlMZXZlbCgpIGZ1bmN0aW9ucyBsYXRlci4gKi8KKworICAgIGVuY3ZpZC0+ZnVsbHNlYXJjaF9lbmFibGUgPSBlbmNQYXJhbS0+ZnVsbHNlYXJjaDsKKworICAgIGVuY3ZpZC0+b3V0T2ZCYW5kUGFyYW1TZXQgPSAoKGVuY1BhcmFtLT5vdXRfb2ZfYmFuZF9wYXJhbV9zZXQgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRSk7CisKKyAgICAvKiBwYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSB0aGUgdGhlIGVuY1BhcmFtIHRoYXQgYXJlIHVzZWQgaW4gU1BTICovCisgICAgaWYgKGV4dFMpCisgICAgeworICAgICAgICB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2IgPSAgMSA8PCAoZXh0Uy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7CisgICAgICAgIHZpZGVvLT5QaWNXaWR0aEluTWJzID0gZXh0Uy0+cGljX3dpZHRoX2luX21ic19taW51czEgKyAxOworICAgICAgICB2aWRlby0+UGljSGVpZ2h0SW5NYXBVbml0cyA9IGV4dFMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEgOworICAgICAgICB2aWRlby0+RnJhbWVIZWlnaHRJbk1icyA9ICgyIC0gZXh0Uy0+ZnJhbWVfbWJzX29ubHlfZmxhZykgKiB2aWRlby0+UGljSGVpZ2h0SW5NYXBVbml0cyA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvLT5NYXhQaWNPcmRlckNudExzYiA9ICAxIDw8IChlbmNQYXJhbS0+bG9nMl9tYXhfcG9jX2xzYl9taW51c180ICsgNCk7CisgICAgICAgIHZpZGVvLT5QaWNXaWR0aEluTWJzID0gKGVuY1BhcmFtLT53aWR0aCArIDE1KSA+PiA0OyAvKiByb3VuZCBpdCB0byBtdWx0aXBsZSBvZiAxNiAqLworICAgICAgICB2aWRlby0+RnJhbWVIZWlnaHRJbk1icyA9IChlbmNQYXJhbS0+aGVpZ2h0ICsgMTUpID4+IDQ7IC8qIHJvdW5kIGl0IHRvIG11bHRpcGxlIG9mIDE2ICovCisgICAgICAgIHZpZGVvLT5QaWNIZWlnaHRJbk1hcFVuaXRzID0gdmlkZW8tPkZyYW1lSGVpZ2h0SW5NYnM7CisgICAgfQorCisgICAgdmlkZW8tPlBpY1dpZHRoSW5TYW1wbGVzTCA9IHZpZGVvLT5QaWNXaWR0aEluTWJzICogMTYgOworICAgIGlmICh2aWRlby0+UGljV2lkdGhJblNhbXBsZXNMICsgMzIgPiAweEZGRkYpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7IC8vIHdlIHVzZSAyLWJ5dGVzIGZvciBwaXRjaAorICAgIH0KKworICAgIHZpZGVvLT5QaWNXaWR0aEluU2FtcGxlc0MgPSB2aWRlby0+UGljV2lkdGhJbk1icyAqIDggOworICAgIHZpZGVvLT5QaWNIZWlnaHRJbk1icyA9IHZpZGVvLT5GcmFtZUhlaWdodEluTWJzOworICAgIHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyA9IHZpZGVvLT5QaWNXaWR0aEluTWJzICogdmlkZW8tPlBpY0hlaWdodEluTWFwVW5pdHMgOworICAgIHZpZGVvLT5QaWNIZWlnaHRJblNhbXBsZXNMID0gdmlkZW8tPlBpY0hlaWdodEluTWJzICogMTY7CisgICAgdmlkZW8tPlBpY0hlaWdodEluU2FtcGxlc0MgPSB2aWRlby0+UGljSGVpZ2h0SW5NYnMgKiA4OworICAgIHZpZGVvLT5QaWNTaXplSW5NYnMgPSB2aWRlby0+UGljV2lkdGhJbk1icyAqIHZpZGVvLT5QaWNIZWlnaHRJbk1iczsKKworICAgIGlmICghZXh0UyAmJiAhZXh0UCkKKyAgICB7CisgICAgICAgIG1heEZyYW1lTnVtID0gKGVuY1BhcmFtLT5pZHJfcGVyaW9kID09IC0xKSA/ICgxIDw8IDE2KSA6IGVuY1BhcmFtLT5pZHJfcGVyaW9kOworICAgICAgICBpaSA9IDA7CisgICAgICAgIHdoaWxlIChtYXhGcmFtZU51bSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlpKys7CisgICAgICAgICAgICBtYXhGcmFtZU51bSA+Pj0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaWkgPCA0KSBpaSA9IDQ7CisgICAgICAgIGVsc2UgaWYgKGlpID4gMTYpIGlpID0gMTY7CisKKyAgICAgICAgc2VxUGFyYW0tPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPSBpaSAtIDQ7Ly9MT0cyX01BWF9GUkFNRV9OVU1fTUlOVVM0OyAvKiBkZWZhdWx0ICovCisKKyAgICAgICAgdmlkZW8tPk1heEZyYW1lTnVtID0gMSA8PCBpaTsgLy8oTE9HMl9NQVhfRlJBTUVfTlVNX01JTlVTNCArIDQpOyAvKiBkZWZhdWx0ICovCisgICAgICAgIHZpZGVvLT5NYXhQaWNOdW0gPSB2aWRlby0+TWF4RnJhbWVOdW07CisKKyAgICAgICAgLyoqKioqKioqKioqKiogc2V0IHRoZSBTUFMgKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgc2VxUGFyYW0tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gMDsgLyogc3RhcnQgd2l0aCB6ZXJvICovCisgICAgICAgIC8qIFBPQyAqLworICAgICAgICBzZXFQYXJhbS0+cGljX29yZGVyX2NudF90eXBlID0gZW5jUGFyYW0tPnBvY190eXBlOyAvKiBQT0MgdHlwZSAqLworICAgICAgICBpZiAoZW5jUGFyYW0tPnBvY190eXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgvKmVuY1BhcmFtLT5sb2cyX21heF9wb2NfbHNiX21pbnVzXzQ8MCB8fCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkqLworICAgICAgICAgICAgICAgIGVuY1BhcmFtLT5sb2cyX21heF9wb2NfbHNiX21pbnVzXzQgPiAxMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfUE9DX0xTQjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcVBhcmFtLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgPSBlbmNQYXJhbS0+bG9nMl9tYXhfcG9jX2xzYl9taW51c180OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGVuY1BhcmFtLT5wb2NfdHlwZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBzZXFQYXJhbS0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgPSBlbmNQYXJhbS0+ZGVsdGFfcG9jX3plcm9fZmxhZzsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljID0gZW5jUGFyYW0tPm9mZnNldF9wb2Nfbm9uX3JlZjsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgPSBlbmNQYXJhbS0+b2Zmc2V0X3RvcF9ib3R0b207CisgICAgICAgICAgICBzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSA9IGVuY1BhcmFtLT5udW1fcmVmX2luX2N5Y2xlOworICAgICAgICAgICAgaWYgKGVuY1BhcmFtLT5vZmZzZXRfcG9jX3JlZiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRU5DUEFSQU1fTUVNX0ZBSUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBlbmNQYXJhbS0+bnVtX3JlZl9mcmFtZTsgaWkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaWldID0gZW5jUGFyYW0tPm9mZnNldF9wb2NfcmVmW2lpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lICovCisgICAgICAgIGlmIChlbmNQYXJhbS0+bnVtX3JlZl9mcmFtZSA+IDE2IHx8IGVuY1BhcmFtLT5udW1fcmVmX2ZyYW1lIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX05VTV9SRUY7CisgICAgICAgIH0KKyAgICAgICAgc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzID0gZW5jUGFyYW0tPm51bV9yZWZfZnJhbWU7IC8qIG51bSByZWZlcmVuY2UgZnJhbWUgcmFuZ2UgMC4uLjE2Ki8KKyAgICAgICAgc2VxUGFyYW0tPmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZyA9IEZBTFNFOworICAgICAgICBzZXFQYXJhbS0+cGljX3dpZHRoX2luX21ic19taW51czEgPSB2aWRlby0+UGljV2lkdGhJbk1icyAtIDE7CisgICAgICAgIHNlcVBhcmFtLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgPSB2aWRlby0+UGljSGVpZ2h0SW5NYXBVbml0cyAtIDE7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9tYnNfb25seV9mbGFnID0gVFJVRTsKKyAgICAgICAgc2VxUGFyYW0tPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgc2VxUGFyYW0tPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCAqLworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcHBpbmdfZmxhZyA9IEZBTFNFOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSAwOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgPSAwOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IEZBTFNFOyAvKiBkZWZhdWx0ICovCisgICAgfQorICAgIGVsc2UgaWYgKGV4dFMpIC8vIHVzZSBleHRlcm5hbCBTUFMgYW5kIFBQUworICAgIHsKKyAgICAgICAgc2VxUGFyYW0tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gZXh0Uy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQ7CisgICAgICAgIHNlcVBhcmFtLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0gZXh0Uy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKKyAgICAgICAgdmlkZW8tPk1heEZyYW1lTnVtID0gMSA8PCAoZXh0Uy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOworICAgICAgICB2aWRlby0+TWF4UGljTnVtID0gdmlkZW8tPk1heEZyYW1lTnVtOworICAgICAgICBpZiAoZW5jUGFyYW0tPmlkcl9wZXJpb2QgPiAoaW50KSh2aWRlby0+TWF4RnJhbWVOdW0pIHx8IChlbmNQYXJhbS0+aWRyX3BlcmlvZCA9PSAtMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY1BhcmFtLT5pZHJfcGVyaW9kID0gKGludCl2aWRlby0+TWF4RnJhbWVOdW07CisgICAgICAgIH0KKworICAgICAgICBzZXFQYXJhbS0+cGljX29yZGVyX2NudF90eXBlID0gZXh0Uy0+cGljX29yZGVyX2NudF90eXBlOworICAgICAgICBpZiAoc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoLypleHRTLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ8MCB8fCAobm8gbmVlZCBpdCdzIHVuc2lnbmVkKSovCisgICAgICAgICAgICAgICAgZXh0Uy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID4gMTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX1BPQ19MU0I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXFQYXJhbS0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0gZXh0Uy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNlcVBhcmFtLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgc2VxUGFyYW0tPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnID0gZXh0Uy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7CisgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYyA9IGV4dFMtPm9mZnNldF9mb3Jfbm9uX3JlZl9waWM7CisgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkID0gZXh0Uy0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOworICAgICAgICAgICAgc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSBleHRTLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOworICAgICAgICAgICAgaWYgKGV4dFMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19FTkNQQVJBTV9NRU1fRkFJTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IChpbnQpIGV4dFMtPm51bV9yZWZfZnJhbWVzOyBpaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcVBhcmFtLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpaV0gPSBleHRTLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZSAqLworICAgICAgICBpZiAoZXh0Uy0+bnVtX3JlZl9mcmFtZXMgPiAxNiAvKnx8IGV4dFMtPm51bV9yZWZfZnJhbWVzPDAgKG5vIG5lZWQsIGl0J3MgdW5zaWduZWQpKi8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9OVU1fUkVGOworICAgICAgICB9CisgICAgICAgIHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lcyA9IGV4dFMtPm51bV9yZWZfZnJhbWVzOyAvKiBudW0gcmVmZXJlbmNlIGZyYW1lIHJhbmdlIDAuLi4xNiovCisgICAgICAgIHNlcVBhcmFtLT5nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcgPSBleHRTLT5nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWc7CisgICAgICAgIHNlcVBhcmFtLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSA9IGV4dFMtPnBpY193aWR0aF9pbl9tYnNfbWludXMxOworICAgICAgICBzZXFQYXJhbS0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxID0gZXh0Uy0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9IGV4dFMtPmZyYW1lX21ic19vbmx5X2ZsYWc7CisgICAgICAgIGlmIChleHRTLT5mcmFtZV9tYnNfb25seV9mbGFnICE9IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgICAgICBzZXFQYXJhbS0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyA9IGV4dFMtPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWc7CisgICAgICAgIGlmIChleHRTLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnICE9IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICBzZXFQYXJhbS0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyA9IGV4dFMtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWc7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wcGluZ19mbGFnID0gZXh0Uy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyA7CisgICAgICAgIGlmIChleHRTLT5mcmFtZV9jcm9wcGluZ19mbGFnICE9IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSAwOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgPSAwOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IGV4dFMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKyAgICAgICAgaWYgKGV4dFMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCYoc2VxUGFyYW0tPnZ1aV9wYXJhbWV0ZXJzKSwgJihleHRTLT52dWlfcGFyYW1ldGVycyksIHNpemVvZihBVkNWVUlQYXJhbXMpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqIG5vdyBQUFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICghZXh0UCAmJiAhZXh0UykKKyAgICB7CisgICAgICAgIHBpY1BhcmFtLT5waWNfcGFyYW1ldGVyX3NldF9pZCA9ICh1aW50KSgtMSk7IC8qIHN0YXJ0IHdpdGggemVybyAqLworICAgICAgICBwaWNQYXJhbS0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPSAodWludCkoLTEpOyAvKiBzdGFydCB3aXRoIHplcm8gKi8KKyAgICAgICAgcGljUGFyYW0tPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9IDA7IC8qIGRlZmF1bHQgdG8gQ0FWTEMgKi8KKyAgICAgICAgcGljUGFyYW0tPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgPSAwOyAvKiBkZWZhdWx0IGZvciBub3csIHdpbGwgbmVlZCBpdCBmb3IgQi1zbGljZSAqLworICAgICAgICAvKiBGTU8gKi8KKyAgICAgICAgaWYgKGVuY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXAgPCAxIHx8IGVuY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXAgPiBNQVhfTlVNX1NMSUNFX0dST1VQKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfTlVNX1NMSUNFR1JPVVA7CisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID0gZW5jUGFyYW0tPm51bV9zbGljZV9ncm91cCAtIDE7CisKKyAgICAgICAgaWYgKHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9IGVuY1BhcmFtLT5mbW9fdHlwZTsKKyAgICAgICAgICAgIHN3aXRjaCAoZW5jUGFyYW0tPmZtb190eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDw9IChpbnQpcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+cnVuX2xlbmd0aF9taW51czFbaWldID0gZW5jUGFyYW0tPnJ1bl9sZW5ndGhfbWludXMxW2lpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IChpbnQpcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+dG9wX2xlZnRbaWldID0gZW5jUGFyYW0tPnRvcF9sZWZ0W2lpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5ib3R0b21fcmlnaHRbaWldID0gZW5jUGFyYW0tPmJvdHRvbV9yaWdodFtpaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNQYXJhbS0+Y2hhbmdlX2Rpcl9mbGFnID09IEFWQ19PTikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKC8qZW5jUGFyYW0tPmNoYW5nZV9yYXRlX21pbnVzMSA8IDAgfHwgKG5vIG5lZWQgaXQncyB1bnNpZ25lZCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtLT5jaGFuZ2VfcmF0ZV9taW51czEgPiB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgLSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfQ0hBTkdFX1JBVEU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSA9IGVuY1BhcmFtLT5jaGFuZ2VfcmF0ZV9taW51czE7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5TbGljZUdyb3VwQ2hhbmdlUmF0ZSA9IHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgKyAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxID0gdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzIC0gMTsKKworICAgICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWQgKi8KKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkID0gKHVpbnQqKWF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YodWludCkgKiB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMsIERFRkFVTFRfQVRUUik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNQYXJhbS0+c2xpY2VfZ3JvdXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19FTkNQQVJBTV9NRU1fRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoaW50KXZpZGVvLT5QaWNTaXplSW5NYXBVbml0czsgaWkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkW2lpXSA9IGVuY1BhcmFtLT5zbGljZV9ncm91cFtpaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0ZNT19UWVBFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID0gZW5jUGFyYW0tPm51bV9yZWZfZnJhbWUgLSAxOyAvKiBhc3N1bWUgZnJhbWUgb25seSAqLworICAgICAgICBwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSA9IDA7IC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX3ByZWRfZmxhZyA9IDA7IC8qIG5vIHdlaWdodGVkIHByZWRpY3Rpb24gc3VwcG9ydGVkICovCisgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjID0gMDsgLyogcmFuZ2UgMCwxLDIgKi8KKyAgICAgICAgaWYgKC8qcGljUGFyYW0tPndlaWdodGVkX2JpcHJlZF9pZGMgPCAwIHx8IChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSAqLworICAgICAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX2JpcHJlZF9pZGMgPiAyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1dFSUdIVEVEX0JJUFJFRF9GQUlMOworICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2ID0gMDsgLyogZGVmYXVsdCwgd2lsbCBiZSBjaGFuZ2VkIGF0IHNsaWNlIGxldmVsIGFueXdheSAqLworICAgICAgICBpZiAocGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgPCAtMjYgfHwgcGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgPiAyNSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTklUX1FQX0ZBSUw7IC8qIG91dCBvZiByYW5nZSAqLworICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5waWNfaW5pdF9xc19taW51czI2ID0gMDsKKyAgICAgICAgaWYgKHBpY1BhcmFtLT5waWNfaW5pdF9xc19taW51czI2IDwgLTI2IHx8IHBpY1BhcmFtLT5waWNfaW5pdF9xc19taW51czI2ID4gMjUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5JVF9RU19GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorCisgICAgICAgIHBpY1BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID0gMDsgLyogZGVmYXVsdCB0byB6ZXJvIGZvciBub3cgKi8KKyAgICAgICAgaWYgKHBpY1BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0IDwgLTEyIHx8IHBpY1BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID4gMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfQ0hST01BX1FQX0ZBSUw7IC8qIG91dCBvZiByYW5nZSAqLworICAgICAgICB9CisgICAgICAgIC8qIGRlYmxvY2tpbmcgKi8KKyAgICAgICAgcGljUGFyYW0tPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnID0gKGVuY1BhcmFtLT5kYl9maWx0ZXIgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRSA7CisgICAgICAgIC8qIGNvbnN0cmFpbmVkIGludHJhIHByZWRpY3Rpb24gKi8KKyAgICAgICAgcGljUGFyYW0tPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyA9IChlbmNQYXJhbS0+Y29uc3RyYWluZWRfaW50cmFfcHJlZCA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFOworICAgICAgICBwaWNQYXJhbS0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnID0gMDsgLyogZGVmYXVsdCAqLworICAgIH0KKyAgICBlbHNlIGlmIChleHRQKS8vIGV4dGVybmFsIFBQUworICAgIHsKKyAgICAgICAgcGljUGFyYW0tPnBpY19wYXJhbWV0ZXJfc2V0X2lkID0gZXh0UC0+cGljX3BhcmFtZXRlcl9zZXRfaWQgLSAxOyAvKiB0byBiZSBpbmNyZWFzZWQgYnkgb25lICovCisgICAgICAgIHBpY1BhcmFtLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IGV4dFAtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkOworICAgICAgICBwaWNQYXJhbS0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID0gZXh0UC0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnOworICAgICAgICBpZiAoZXh0UC0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICE9IDApIC8qIGRlZmF1bHQgdG8gQ0FWTEMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnID0gZXh0UC0+cGljX29yZGVyX3ByZXNlbnRfZmxhZzsgLyogZGVmYXVsdCBmb3Igbm93LCB3aWxsIG5lZWQgaXQgZm9yIEItc2xpY2UgKi8KKyAgICAgICAgaWYgKGV4dFAtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIC8qIEZNTyAqLworICAgICAgICBpZiAoLyooZXh0UC0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE8MCkgfHwgKG5vIG5lZWQgaXQncyB1bnNpZ25lZCkgKi8KKyAgICAgICAgICAgIChleHRQLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IE1BWF9OVU1fU0xJQ0VfR1JPVVAgLSAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX05VTV9TTElDRUdST1VQOworICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA9IGV4dFAtPm51bV9zbGljZV9ncm91cHNfbWludXMxOworCisgICAgICAgIGlmIChwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSBleHRQLT5zbGljZV9ncm91cF9tYXBfdHlwZTsKKyAgICAgICAgICAgIHN3aXRjaCAoZXh0UC0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPD0gKGludClleHRQLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaWkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnJ1bl9sZW5ndGhfbWludXMxW2lpXSA9IGV4dFAtPnJ1bl9sZW5ndGhfbWludXMxW2lpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IChpbnQpcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+dG9wX2xlZnRbaWldID0gZXh0UC0+dG9wX2xlZnRbaWldOworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPmJvdHRvbV9yaWdodFtpaV0gPSBleHRQLT5ib3R0b21fcmlnaHRbaWldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnID0gZXh0UC0+c2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnOworICAgICAgICAgICAgICAgICAgICBpZiAoLypleHRQLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgPCAwIHx8IChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZXh0UC0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxID4gdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0NIQU5HRV9SQVRFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgPSBleHRQLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czE7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5TbGljZUdyb3VwQ2hhbmdlUmF0ZSA9IHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgKyAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRQLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxICE9IHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxID0gZXh0UC0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMTsKKworICAgICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWQgKi8KKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkID0gKHVpbnQqKWF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YodWludCkgKiB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMsIERFRkFVTFRfQVRUUik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChleHRQLT5zbGljZV9ncm91cF9pZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0VOQ1BBUkFNX01FTV9GQUlMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IChpbnQpdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzOyBpaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWRbaWldID0gZXh0UC0+c2xpY2VfZ3JvdXBfaWRbaWldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9GTU9fVFlQRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA9IGV4dFAtPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czE7CisgICAgICAgIHBpY1BhcmFtLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID0gZXh0UC0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMTsgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICBpZiAocGljUGFyYW0tPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4dFAtPndlaWdodGVkX3ByZWRfZmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX3ByZWRfZmxhZyA9IDA7IC8qIG5vIHdlaWdodGVkIHByZWRpY3Rpb24gc3VwcG9ydGVkICovCisgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjID0gZXh0UC0+d2VpZ2h0ZWRfYmlwcmVkX2lkYzsgLyogcmFuZ2UgMCwxLDIgKi8KKyAgICAgICAgaWYgKC8qcGljUGFyYW0tPndlaWdodGVkX2JpcHJlZF9pZGMgPCAwIHx8IChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSAqLworICAgICAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX2JpcHJlZF9pZGMgPiAyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1dFSUdIVEVEX0JJUFJFRF9GQUlMOworICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2ID0gZXh0UC0+cGljX2luaXRfcXBfbWludXMyNjsgLyogZGVmYXVsdCwgd2lsbCBiZSBjaGFuZ2VkIGF0IHNsaWNlIGxldmVsIGFueXdheSAqLworICAgICAgICBpZiAocGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgPCAtMjYgfHwgcGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgPiAyNSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTklUX1FQX0ZBSUw7IC8qIG91dCBvZiByYW5nZSAqLworICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5waWNfaW5pdF9xc19taW51czI2ID0gZXh0UC0+cGljX2luaXRfcXNfbWludXMyNjsKKyAgICAgICAgaWYgKHBpY1BhcmFtLT5waWNfaW5pdF9xc19taW51czI2IDwgLTI2IHx8IHBpY1BhcmFtLT5waWNfaW5pdF9xc19taW51czI2ID4gMjUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5JVF9RU19GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorCisgICAgICAgIHBpY1BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID0gZXh0UC0+Y2hyb21hX3FwX2luZGV4X29mZnNldDsgLyogZGVmYXVsdCB0byB6ZXJvIGZvciBub3cgKi8KKyAgICAgICAgaWYgKHBpY1BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0IDwgLTEyIHx8IHBpY1BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID4gMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfQ0hST01BX1FQX0ZBSUw7IC8qIG91dCBvZiByYW5nZSAqLworICAgICAgICB9CisgICAgICAgIC8qIGRlYmxvY2tpbmcgKi8KKyAgICAgICAgcGljUGFyYW0tPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnID0gZXh0UC0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWc7CisgICAgICAgIC8qIGNvbnN0cmFpbmVkIGludHJhIHByZWRpY3Rpb24gKi8KKyAgICAgICAgcGljUGFyYW0tPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyA9IGV4dFAtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZzsKKyAgICAgICAgaWYgKGV4dFAtPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyAgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcgPSBleHRQLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWc7IC8qIGRlZmF1bHQgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKiogbm93IHNldCB1cCBzb21lIFNsaWNlSGVhZGVyIHBhcmFtZXRlcnMgKioqKioqKioqKiovCisgICAgaWYgKHBpY1BhcmFtLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgLyogdGhlc2UgdmFsdWVzIG9ubHkgcHJlc2VudCB3aGVuIGRiX2ZpbHRlciBpcyBPTiAqLworICAgICAgICBpZiAoZW5jUGFyYW0tPmRpc2FibGVfZGJfaWRjID4gMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0RFQkxPQ0tfSURDOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorICAgICAgICBzbGljZUhkci0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgPSBlbmNQYXJhbS0+ZGlzYWJsZV9kYl9pZGM7CisKKyAgICAgICAgaWYgKGVuY1BhcmFtLT5hbHBoYV9vZmZzZXQgPCAtNiB8fCBlbmNQYXJhbS0+YWxwaGFfb2Zmc2V0ID4gNikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0FMUEhBX09GRlNFVDsKKyAgICAgICAgfQorICAgICAgICBzbGljZUhkci0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjIgPSBlbmNQYXJhbS0+YWxwaGFfb2Zmc2V0OworCisgICAgICAgIGlmIChlbmNQYXJhbS0+YmV0YV9vZmZzZXQgPCAtNiB8fCBlbmNQYXJhbS0+YmV0YV9vZmZzZXQgPiA2KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfQkVUQV9PRkZTRVQ7CisgICAgICAgIH0KKyAgICAgICAgc2xpY2VIZHItPnNsaWNlX2JldGFfb2Zmc2V0X2Rpdl8yID0gIGVuY1BhcmFtLT5iZXRhX29mZnNldDsKKyAgICB9CisgICAgaWYgKGVuY3ZpZC0+b3V0T2ZCYW5kUGFyYW1TZXQgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIHNsaWNlSGRyLT5pZHJfcGljX2lkID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2xpY2VIZHItPmlkcl9waWNfaWQgPSAodWludCkoLTEpOyAvKiBzdGFydCB3aXRoIHplcm8gKi8KKyAgICB9CisgICAgc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnID0gRkFMU0U7CisgICAgc2xpY2VIZHItPmJvdHRvbV9maWVsZF9mbGFnID0gRkFMU0U7ICAvKiB3b24ndCBiZSB1c2VkIGFueXdheSAqLworICAgIHZpZGVvLT5NYmFmZkZyYW1lRmxhZyA9IChzZXFQYXJhbS0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyAmJiAhc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnKTsKKworICAgIC8qIHRoZSByZXN0IHdpbGwgYmUgc2V0IGluIEluaXRTbGljZSgpICovCisKKyAgICAvKiBub3cgdGhlIHJhdGUgY29udHJvbCBhbmQgcGVyZm9ybWFuY2UgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisgICAgcmF0ZUN0cmwtPnNjZEVuYWJsZSA9IChlbmNQYXJhbS0+YXV0b19zY2QgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKyAgICByYXRlQ3RybC0+aWRyUGVyaW9kID0gZW5jUGFyYW0tPmlkcl9wZXJpb2QgKyAxOworICAgIHJhdGVDdHJsLT5pbnRyYU1CUmF0ZSA9IGVuY1BhcmFtLT5pbnRyYW1iX3JlZnJlc2g7CisgICAgcmF0ZUN0cmwtPmRwRW5hYmxlID0gKGVuY1BhcmFtLT5kYXRhX3BhciA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFOworCisgICAgcmF0ZUN0cmwtPnN1YlBlbEVuYWJsZSA9IChlbmNQYXJhbS0+c3ViX3BlbCA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFOworICAgIHJhdGVDdHJsLT5tdlJhbmdlID0gZW5jUGFyYW0tPnNlYXJjaF9yYW5nZTsKKworICAgIHJhdGVDdHJsLT5zdWJNQkVuYWJsZSA9IChlbmNQYXJhbS0+c3VibWJfcHJlZCA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFOworICAgIHJhdGVDdHJsLT5yZE9wdEVuYWJsZSA9IChlbmNQYXJhbS0+cmRvcHRfbW9kZSA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFOworICAgIHJhdGVDdHJsLT5iaWRpclByZWQgPSAoZW5jUGFyYW0tPmJpZGlyX3ByZWQgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKworICAgIHJhdGVDdHJsLT5yY0VuYWJsZSA9IChlbmNQYXJhbS0+cmF0ZV9jb250cm9sID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0U7CisgICAgcmF0ZUN0cmwtPmluaXRRUCA9IGVuY1BhcmFtLT5pbml0UVA7CisgICAgcmF0ZUN0cmwtPmluaXRRUCA9IEFWQ19DTElQMygwLCA1MSwgcmF0ZUN0cmwtPmluaXRRUCk7CisKKyAgICByYXRlQ3RybC0+Yml0UmF0ZSA9IGVuY1BhcmFtLT5iaXRyYXRlOworICAgIHJhdGVDdHJsLT5jcGJTaXplID0gZW5jUGFyYW0tPkNQQl9zaXplOworICAgIHJhdGVDdHJsLT5pbml0RGVsYXlPZmZzZXQgPSAocmF0ZUN0cmwtPmJpdFJhdGUgKiBlbmNQYXJhbS0+aW5pdF9DQlBfcmVtb3ZhbF9kZWxheSAvIDEwMDApOworCisgICAgaWYgKGVuY1BhcmFtLT5mcmFtZV9yYXRlID09IDApCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfRlJBTUVSQVRFOworICAgIH0KKworICAgIHJhdGVDdHJsLT5mcmFtZV9yYXRlID0gKE9zY2xGbG9hdCkoZW5jUGFyYW0tPmZyYW1lX3JhdGUgKiAxLjAgLyAxMDAwKTsKKy8vICByYXRlQ3RybC0+c3JjSW50ZXJ2YWwgPSBlbmNQYXJhbS0+c3JjX2ludGVydmFsOworICAgIHJhdGVDdHJsLT5maXJzdF9mcmFtZSA9IDE7IC8qIHNldCB0aGlzIGZsYWcgZm9yIHRoZSBmaXJzdCB0aW1lICovCisKKyAgICAvKiBjb250cmFpbmVkX3NldHhfZmxhZyB3aWxsIGJlIHNldCBpbnNpZGUgdGhlIFZlcmlmeVByb2ZpbGUgY2FsbGVkIGJlbG93LiovCisgICAgaWYgKCFleHRTICYmICFleHRQKQorICAgIHsKKyAgICAgICAgc2VxUGFyYW0tPnByb2ZpbGVfaWRjID0gZW5jUGFyYW0tPnByb2ZpbGU7CisgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQwX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDFfZmxhZyA9IEZBTFNFOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0Ml9mbGFnID0gRkFMU0U7CisgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQzX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgc2VxUGFyYW0tPmxldmVsX2lkYyA9IGVuY1BhcmFtLT5sZXZlbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2VxUGFyYW0tPnByb2ZpbGVfaWRjID0gZXh0Uy0+cHJvZmlsZV9pZGM7CisgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQwX2ZsYWcgPSBleHRTLT5jb25zdHJhaW5lZF9zZXQwX2ZsYWc7CisgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQxX2ZsYWcgPSBleHRTLT5jb25zdHJhaW5lZF9zZXQxX2ZsYWc7CisgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQyX2ZsYWcgPSBleHRTLT5jb25zdHJhaW5lZF9zZXQyX2ZsYWc7CisgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQzX2ZsYWcgPSBleHRTLT5jb25zdHJhaW5lZF9zZXQzX2ZsYWc7CisgICAgICAgIHNlcVBhcmFtLT5sZXZlbF9pZGMgPSBleHRTLT5sZXZlbF9pZGM7CisgICAgfQorCisKKyAgICBzdGF0dXMgPSBWZXJpZnlQcm9maWxlKGVuY3ZpZCwgc2VxUGFyYW0sIHBpY1BhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBWZXJpZnlMZXZlbChlbmN2aWQsIHNlcVBhcmFtLCBwaWNQYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiB2ZXJpZnkgdGhlIHByb2ZpbGUgc2V0dGluZyAqLworQVZDRW5jX1N0YXR1cyBWZXJpZnlQcm9maWxlKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNTZXFQYXJhbVNldCAqc2VxUGFyYW0sIEFWQ1BpY1BhcmFtU2V0ICpwaWNQYXJhbSkKK3sKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisKKyAgICBpZiAoc2VxUGFyYW0tPnByb2ZpbGVfaWRjID09IDApIC8qIGZpbmQgcHJvZmlsZSBmb3IgdGhpcyBzZXR0aW5nICovCisgICAgeworICAgICAgICAvKiBmaW5kIHRoZSByaWdodCBwcm9maWxlIGZvciBpdCAqLworICAgICAgICBpZiAoc2VxUGFyYW0tPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPT0gVFJVRSAmJgorICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gRkFMU0UgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPD0gNyAvKiYmCisgICAgICAgICAgICBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE+PTAgKG5vIG5lZWQsIGl0J3MgdW5zaWduZWQpICovKQorICAgICAgICB7CisgICAgICAgICAgICBzZXFQYXJhbS0+cHJvZmlsZV9pZGMgPSBBVkNfRVhURU5ERUQ7CisgICAgICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0Ml9mbGFnID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYXRlQ3RybC0+ZHBFbmFibGUgPT0gRkFMU0UgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPT0gMCAmJgorICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9IEFWQ19NQUlOOworICAgICAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDFfZmxhZyA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmF0ZUN0cmwtPmJpZGlyUHJlZCA9PSBGQUxTRSAmJgorICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5kcEVuYWJsZSA9PSBGQUxTRSAmJgorICAgICAgICAgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9tYnNfb25seV9mbGFnID09IFRSVUUgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfcHJlZF9mbGFnID09IEZBTFNFICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMCAmJgorICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gRkFMU0UgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPD0gNyAvKiYmCisgICAgICAgICAgICBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE+PTAgKG5vIG5lZWQsIGl0J3MgdW5zaWduZWQpKi8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9IEFWQ19CQVNFTElORTsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQwX2ZsYWcgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9PSAwKSAvKiBzdGlsbCB6ZXJvICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2hlY2sgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHByb2ZpbGUgYnkgdGhpcyBsaWJyYXJ5ICovCisgICAgc3dpdGNoIChzZXFQYXJhbS0+cHJvZmlsZV9pZGMpCisgICAgeworICAgICAgICBjYXNlIEFWQ19CQVNFTElORToKKyAgICAgICAgICAgIGlmIChyYXRlQ3RybC0+YmlkaXJQcmVkID09IFRSVUUgfHwKKyAgICAgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPmRwRW5hYmxlID09IFRSVUUgfHwKKyAgICAgICAgICAgICAgICAgICAgc2VxUGFyYW0tPmZyYW1lX21ic19vbmx5X2ZsYWcgIT0gVFJVRSB8fAorICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfcHJlZF9mbGFnID09IFRSVUUgfHwKKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX2JpcHJlZF9pZGMgIT0gMCB8fAorICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IFRSVUUgfHwKKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gNyAvKnx8CisgICAgICAgICAgICBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE8MCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkgKi8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1RPT0xTX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFWQ19NQUlOOgorICAgICAgICBjYXNlIEFWQ19FWFRFTkRFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19QUk9GSUxFX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogdmVyaWZ5IHRoZSBsZXZlbCBzZXR0aW5nICovCitBVkNFbmNfU3RhdHVzIFZlcmlmeUxldmVsKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNTZXFQYXJhbVNldCAqc2VxUGFyYW0sIEFWQ1BpY1BhcmFtU2V0ICpwaWNQYXJhbSkKK3sKKyAgICAodm9pZCkocGljUGFyYW0pOworCisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50IG1iX3Blcl9zZWMsIGlpOworICAgIGludCBsZXZfaWR4OworICAgIGludCBkcGJfc2l6ZTsKKworICAgIG1iX3Blcl9zZWMgPSAoaW50KSh2aWRlby0+UGljU2l6ZUluTWJzICogcmF0ZUN0cmwtPmZyYW1lX3JhdGUgKyAwLjUpOworICAgIGRwYl9zaXplID0gKHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lcyAqIHZpZGVvLT5QaWNTaXplSW5NYnMgKiAzKSA+PiA2OworCisgICAgaWYgKHNlcVBhcmFtLT5sZXZlbF9pZGMgPT0gMCkgLyogZmluZCBsZXZlbCBmb3IgdGhpcyBzZXR0aW5nICovCisgICAgeworICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBNQVhfTEVWRUxfSURYOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobWJfcGVyX3NlYyA8PSBNYXhNQlBTW2lpXSAmJgorICAgICAgICAgICAgICAgICAgICB2aWRlby0+UGljU2l6ZUluTWJzIDw9ICh1aW50KU1heEZTW2lpXSAmJgorICAgICAgICAgICAgICAgICAgICByYXRlQ3RybC0+Yml0UmF0ZSA8PSAoaW50MzIpTWF4QlJbaWldKjEwMDAgJiYKKyAgICAgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPmNwYlNpemUgPD0gKGludDMyKU1heENQQltpaV0qMTAwMCAmJgorICAgICAgICAgICAgICAgICAgICByYXRlQ3RybC0+bXZSYW5nZSA8PSBNYXhWbXZSW2lpXSAmJgorICAgICAgICAgICAgICAgICAgICBkcGJfc2l6ZSA8PSBNYXhEUEJYMltpaV0qNTEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcVBhcmFtLT5sZXZlbF9pZGMgPSBtYXBJZHgyTGV2W2lpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2VxUGFyYW0tPmxldmVsX2lkYyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0xFVkVMX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayBpZiB0aGlzIGxldmVsIGlzIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkgKi8KKyAgICBsZXZfaWR4ID0gbWFwTGV2MklkeFtzZXFQYXJhbS0+bGV2ZWxfaWRjXTsKKyAgICBpZiAoc2VxUGFyYW0tPmxldmVsX2lkYyA9PSBBVkNfTEVWRUwxX0IpCisgICAgeworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0M19mbGFnID0gMTsKKyAgICB9CisKKworICAgIGlmIChsZXZfaWR4ID09IDI1NSkgLyogbm90IGRlZmluZWQgKi8KKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTEVWRUxfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvKiBjaGVjayBpZiB0aGUgZW5jb2Rpbmcgc2V0dGluZyBjb21wbGllcyB3aXRoIHRoZSBsZXZlbCAqLworICAgIGlmIChtYl9wZXJfc2VjID4gTWF4TUJQU1tsZXZfaWR4XSB8fAorICAgICAgICAgICAgdmlkZW8tPlBpY1NpemVJbk1icyA+ICh1aW50KU1heEZTW2xldl9pZHhdIHx8CisgICAgICAgICAgICByYXRlQ3RybC0+Yml0UmF0ZSA+IChpbnQzMilNYXhCUltsZXZfaWR4XSoxMDAwIHx8CisgICAgICAgICAgICByYXRlQ3RybC0+Y3BiU2l6ZSA+IChpbnQzMilNYXhDUEJbbGV2X2lkeF0qMTAwMCB8fAorICAgICAgICAgICAgcmF0ZUN0cmwtPm12UmFuZ2UgPiBNYXhWbXZSW2xldl9pZHhdKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19MRVZFTF9GQUlMOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGZyYW1lICovCisvKiBkZXRlcm1pbmUgdGhlIHBpY3R1cmUgdHlwZSAqLworLyogZW5jb2RlIFBPQyAqLworLyogbWF5YmUgd2Ugc2hvdWxkIGRvIG1vcmUgc3R1ZmYgaGVyZS4gTW90aW9uRXN0aW1hdGlvbitTQ0QgYW5kIGdlbmVyYXRlIGEgbmV3IFNQUyBhbmQgUFBTICovCitBVkNFbmNfU3RhdHVzIEluaXRGcmFtZShBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNTdGF0dXMgcmV0OworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisKKyAgICAvKiBsb29rIGZvciB0aGUgbmV4dCBmcmFtZSBpbiBjb2Rpbmdfb3JkZXIgYW5kIGxvb2sgZm9yIGF2YWlsYWJsZSBwaWN0dXJlCisgICAgICAgaW4gdGhlIERQQi4gTm90ZSwgdmlkZW8tPmN1cnJGUy0+UGljT3JkZXJDbnQsIGN1cnJGUy0+RnJhbWVOdW0gYW5kIGN1cnJQaWMtPlBpY051bQorICAgICAgIGFyZSBzZXQgdG8gd3JvbmcgbnVtYmVyIGluIHRoaXMgZnVuY3Rpb24gKHJpZ2h0IGZvciBkZWNvZGVyKS4gKi8KKyAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgIHsKKyAgICAgICAgLy8gY2FsbCBpbml0IERQQiBpbiBoZXJlLgorICAgICAgICByZXQgPSBBVkNDb25maWd1cmVTZXF1ZW5jZShlbmN2aWQtPmF2Y0hhbmRsZSwgdmlkZW8sIFRSVUUpOworICAgICAgICBpZiAocmV0ICE9IEFWQ19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmbGV4aWJsZSBtYWNyb2Jsb2NrIG9yZGVyaW5nIChldmVyeSBmcmFtZSkqLworICAgIC8qIHBvcHVsYXRlIHZpZGVvLT5tYXBVbml0VG9TbGljZUdyb3VwTWFwIGFuZCB2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXAgKi8KKyAgICAvKiBJdCBjaGFuZ2VzIG9uY2UgcGVyIGVhY2ggUFBTLiAqLworICAgIEZNT0luaXQodmlkZW8pOworCisgICAgcmV0ID0gRFBCSW5pdEJ1ZmZlcihlbmN2aWQtPmF2Y0hhbmRsZSwgdmlkZW8pOyAvLyBnZXQgbmV3IGJ1ZmZlcgorCisgICAgaWYgKHJldCAhPSBBVkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiAoQVZDRW5jX1N0YXR1cylyZXQ7IC8vIEFWQ0VOQ19QSUNUVVJFX1JFQURZLCBGQUlMCisgICAgfQorCisgICAgRFBCSW5pdFBpYyh2aWRlbywgMCk7IC8qIDAgaXMgZHVtbXkgKi8KKworICAgIC8qKioqKioqKioqKioqIGRldGVybWluZSBwaWN0dXJlIHR5cGUgSURSIG9yIG5vbi1JRFIgKioqKioqKioqKiovCisgICAgdmlkZW8tPmN1cnJQaWNUeXBlID0gQVZDX0ZSQU1FOworICAgIHZpZGVvLT5zbGljZV9kYXRhX3BhcnRpdGlvbmluZyA9IEZBTFNFOworICAgIGVuY3ZpZC0+Y3VycklucHV0LT5pc19yZWZlcmVuY2UgPSAxOyAvKiBkZWZhdWx0IHRvIGFsbCBmcmFtZXMgKi8KKyAgICB2aWRlby0+bmFsX3JlZl9pZGMgPSAxOyAgLyogbmVlZCB0byBzZXQgdGhpcyBmb3IgSW5pdFBPQyAqLworICAgIHZpZGVvLT5jdXJyUGljLT5pc1JlZmVyZW5jZSA9IFRSVUU7CisKKyAgICAvKioqKioqKioqKioqKiBzZXQgZnJhbWVfbnVtICoqKioqKioqKioqKioqKioqKioqLworICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgeworICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtID0gdmlkZW8tPk1heEZyYW1lTnVtOworICAgICAgICB2aWRlby0+UHJldlJlZkZyYW1lTnVtID0gMDsKKyAgICAgICAgc2xpY2VIZHItPmZyYW1lX251bSA9IDA7CisgICAgfQorICAgIC8qIG90aGVyd2lzZSwgaXQncyBzZXQgdG8gcHJldmlvdXMgcmVmZXJlbmNlIGZyYW1lIGFjY2VzcyB1bml0J3MgZnJhbWVfbnVtIGluIGRlY29kaW5nIG9yZGVyLAorICAgICAgIHNlZSB0aGUgZW5kIG9mIFBWQVZDRGVjb2RlU2xpY2UoKSovCisgICAgLyogVGhlcmUncyBhbHNvIHJlc3RyaWN0aW9uIG9uIHRoZSBmcmFtZV9udW0sIHNlZSBwYWdlIDU5IG9mIEpWVC1JMTAxMC5kb2MuICovCisgICAgLyogQmFzaWNhbGx5LCBmcmFtZV9udW0gY2FuJ3QgYmUgcmVwZWF0ZWQgdW5sZXNzIGl0J3Mgb3Bwb3NpdGUgZmllbGRzIG9yIG5vbiByZWZlcmVuY2UgZmllbGRzICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2xpY2VIZHItPmZyYW1lX251bSA9ICh2aWRlby0+UHJldlJlZkZyYW1lTnVtICsgMSkgJSB2aWRlby0+TWF4RnJhbWVOdW07CisgICAgfQorICAgIHZpZGVvLT5DdXJyUGljTnVtID0gc2xpY2VIZHItPmZyYW1lX251bTsgIC8qIGZvciBmaWVsZF9waWNfZmxhZyA9IDAgKi8KKyAgICAvL3ZpZGVvLT5DdXJyUGljTnVtID0gMipzbGljZUhkci0+ZnJhbWVfbnVtICsgMTsgLyogZm9yIGZpZWxkX3BpY19mbGFnID0gMSAqLworCisgICAgLyogYXNzaWduIHBpY19vcmRlcl9jbnQsIHZpZGVvLT5QaWNPcmRlckNudCAqLworICAgIHN0YXR1cyA9IEluaXRQT0MoZW5jdmlkKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKSAgLyogaW5jb3JyaWdhYmxlIGZhaWwgKi8KKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSByZWZMaXN0SWR4IGZvciB0aGlzIHBpY3R1cmUgKi8KKyAgICBSZWZMaXN0SW5pdCh2aWRlbyk7CisKKyAgICAvKioqKioqKioqKioqKiBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2NlbmUgYW5hbHlzaXMgKioqKioqKioqKioqLworICAgIC8vICwgdG8gbW92ZSB0aGlzIHRvIE1CLWJhc2VkIE1WIHNlYXJjaCBmb3IgY29tcGFyaXNvbgorICAgIC8vIHVzZSBzdWItb3B0aW1hbCBRUCBmb3IgbXYgc2VhcmNoCisgICAgQVZDTW90aW9uRXN0aW1hdGlvbihlbmN2aWQpOyAgLyogQVZDRU5DX1NVQ0NFU1Mgb3IgQVZDRU5DX05FV19JRFIgKi8KKworICAgIC8qIGFmdGVyIHRoaXMgcG9pbnQsIHRoZSBwaWN0dXJlIHR5cGUgd2lsbCBiZSBmaXhlZCB0byBlaXRoZXIgSURSIG9yIG5vbi1JRFIgKi8KKyAgICB2aWRlby0+Y3VyckZTLT5QaWNPcmRlckNudCA9IHZpZGVvLT5QaWNPcmRlckNudDsKKyAgICB2aWRlby0+Y3VyckZTLT5GcmFtZU51bSA9IHZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtOworICAgIHZpZGVvLT5jdXJyUGljLT5QaWNOdW0gPSB2aWRlby0+Q3VyclBpY051bTsKKyAgICB2aWRlby0+bWJOdW0gPSAwOyAvKiBzdGFydCBmcm9tIHplcm8gTUIgKi8KKyAgICBlbmN2aWQtPmN1cnJTbGljZUdyb3VwID0gMDsgLyogc3RhcnQgZnJvbSBzbGljZSBncm91cCAjMCAqLworICAgIGVuY3ZpZC0+bnVtSW50cmFNQiA9IDA7IC8qIHJlc2V0IHRoaXMgY291bnRlciAqLworCisgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICB7CisgICAgICAgIFJDSW5pdEdPUChlbmN2aWQpOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSBwaWN0dXJlIFFQICovCisgICAgICAgIFJDSW5pdEZyYW1lUVAoZW5jdmlkKTsKKworICAgICAgICByZXR1cm4gQVZDRU5DX05FV19JRFI7CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIHBpY3R1cmUgUVAgKi8KKyAgICBSQ0luaXRGcmFtZVFQKGVuY3ZpZCk7IC8qIGdldCBRUCBhZnRlciBNViBzZWFyY2ggKi8KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgZm9yIHRoaXMgc2xpY2UgKi8KK0FWQ0VuY19TdGF0dXMgSW5pdFNsaWNlKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgQVZDUGljUGFyYW1TZXQgKmN1cnJQUFMgPSB2aWRlby0+Y3VyclBpY1BhcmFtczsKKyAgICBBVkNTZXFQYXJhbVNldCAqY3VyclNQUyA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworICAgIGludCBzbGljZV90eXBlID0gdmlkZW8tPnNsaWNlX3R5cGU7CisKKyAgICBzbGljZUhkci0+Zmlyc3RfbWJfaW5fc2xpY2UgPSB2aWRlby0+bWJOdW07CisgICAgaWYgKHZpZGVvLT5tYk51bSkgLy8gbm90IGZpcnN0IHNsaWNlIG9mIGEgZnJhbWUKKyAgICB7CisgICAgICAgIHZpZGVvLT5zbGljZUhkci0+c2xpY2VfdHlwZSA9IChBVkNTbGljZVR5cGUpc2xpY2VfdHlwZTsKKyAgICB9CisKKyAgICAvKiBzbGljZUhkci0+c2xpY2VfdHlwZSBhbHJlYWR5IHNldCBpbiBJbml0RnJhbWUgKi8KKworICAgIHNsaWNlSGRyLT5waWNfcGFyYW1ldGVyX3NldF9pZCA9IHZpZGVvLT5jdXJyUGljUGFyYW1zLT5waWNfcGFyYW1ldGVyX3NldF9pZDsKKworICAgIC8qIHNsaWNlSGRyLT5mcmFtZV9udW0gYWxyZWFkeSBzZXQgaW4gSW5pdEZyYW1lICovCisKKyAgICBpZiAoIWN1cnJTUFMtPmZyYW1lX21ic19vbmx5X2ZsYWcpICAvKiB3ZSBzaG91bGRuJ3QgbmVlZCB0aGlzIGNoZWNrICovCisgICAgeworICAgICAgICBzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcgPSBzbGljZUhkci0+Ym90dG9tX2ZpZWxkX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19UT09MU19OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIC8qIHNsaWNlSGRyLT5pZHJfcGljX2lkIGFscmVhZHkgc2V0IGluIFBWQVZDRW5jb2RlTkFMCisKKyAgICAgc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiIGFscmVhZHkgc2V0IGluIEluaXRGcmFtZS4uSW5pdFBPQworICAgICBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gIGFscmVhZHkgc2V0IGluIEluaXRQT0MKKworICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdIGFscmVhZHkgc2V0IGluIEluaXRQT0MKKyAgICBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSBhbHJlYWR5IHNldCBpbiBJbml0UE9DCisgICAgKi8KKworICAgIHNsaWNlSGRyLT5yZWR1bmRhbnRfcGljX2NudCA9IDA7IC8qIGRlZmF1bHQgaWYoY3VyclBQUy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnKSwgcmFuZ2UgMC4uMTI3ICovCisgICAgc2xpY2VIZHItPmRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZyA9IDA7IC8vIGRlZmF1bHQgaWYoc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKworICAgIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZyA9IEZBTFNFOyAvKiBkZWZhdWx0LCBpZihzbGljZV90eXBlPT0gUCxTUCBvciBCKSovCisgICAgc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPSAwOyAvKiBkZWZhdWx0LCBpZiAobnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcpICovCisgICAgc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPSAwOyAvKiBkZWZhdWx0LCBpZiBhYm92ZSBhbmQgQl9zbGljZSAqLworICAgIC8qIHRoZSBhYm92ZSAyIHZhbHVlcyByYW5nZSBmcm9tIDAuLjE1IGZvciBmcmFtZSBwaWN0dXJlIGFuZCAwLi4zMSBmb3IgZmllbGQgcGljdHVyZSAqLworCisgICAgLyogcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoKSwgY3VycmVudGx5IHdlIGRvbid0IGRvIGFueXRoaW5nICovCisgICAgc2xpY2VIZHItPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDAgPSBGQUxTRTsgLyogZGVmYXVsdCAqLworICAgIHNsaWNlSGRyLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wxID0gRkFMU0U7IC8qIGRlZmF1bHQgKi8KKyAgICAvKiBpZiB0aGUgYWJvdmUgYXJlIFRSVUUsIHNvbWUgb3RoZXIgcGFyYW1zIG11c3QgYmUgc2V0ICovCisKKyAgICBpZiAoKGN1cnJQUFMtPndlaWdodGVkX3ByZWRfZmxhZyAmJiAoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSB8fCBzbGljZV90eXBlID09IEFWQ19TUF9TTElDRSkpIHx8CisgICAgICAgICAgICAoY3VyclBQUy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9PSAxICYmIHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpKQorICAgIHsKKyAgICAgICAgLy8gICAgICBwcmVkX3dlaWdodF90YWJsZSgpOyAvLyBub3Qgc3VwcG9ydGVkICEhCisgICAgICAgIHJldHVybiBBVkNFTkNfVE9PTFNfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvKiBkZWNfcmVmX3BpY19tYXJraW5nKCksIHRoaXMgd2lsbCBiZSBkb25lIGxhdGVyKi8KKyAgICBzbGljZUhkci0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyA9IEZBTFNFOyAvKiBkZWZhdWx0ICovCisgICAgc2xpY2VIZHItPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyA9IEZBTFNFOyAvKiBmb3IgSURSIGZyYW1lLCBkbyBub3QgbWFrZSBpdCBsb25nIHRlcm0gKi8KKyAgICBzbGljZUhkci0+YWRhcHRpdmVfcmVmX3BpY19tYXJraW5nX21vZGVfZmxhZyA9IEZBTFNFOyAvKiBkZWZhdWx0ICovCisgICAgLyogb3RoZXIgcGFyYW1zIGFyZSBub3Qgc2V0IGhlcmUgYmVjYXVzZSB0aGV5IGFyZSBub3QgdXNlZCAqLworCisgICAgc2xpY2VIZHItPmNhYmFjX2luaXRfaWRjID0gMDsgLyogZGVmYXVsdCwgaWYgZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICYmIHNsaWNlX3R5cGU9PUkgb3IgU0ksIHJhbmdlIDAuLjIgICovCisgICAgc2xpY2VIZHItPnNsaWNlX3FwX2RlbHRhID0gMDsgLyogZGVmYXVsdCBmb3Igbm93ICovCisgICAgc2xpY2VIZHItPnNwX2Zvcl9zd2l0Y2hfZmxhZyA9IEZBTFNFOyAvKiBkZWZhdWx0LCBpZiBzbGljZV90eXBlID09IFNQICovCisgICAgc2xpY2VIZHItPnNsaWNlX3FzX2RlbHRhID0gMDsgLyogZGVmYXVsdCwgaWYgc2xpY2VfdHlwZSA9PSBTUCBvciBTSSAqLworCisgICAgLyogZGVyaXZlZCB2YXJpYWJsZXMgZnJvbSBlbmNQYXJhbSAqLworICAgIC8qIGRlYmxvY2tpbmcgZmlsdGVyICovCisgICAgdmlkZW8tPkZpbHRlck9mZnNldEEgPSB2aWRlby0+RmlsdGVyT2Zmc2V0QiA9IDA7CisgICAgaWYgKGN1cnJQUFMtPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnID09IFRSVUUpCisgICAgeworICAgICAgICB2aWRlby0+RmlsdGVyT2Zmc2V0QSA9IHNsaWNlSGRyLT5zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiA8PCAxOworICAgICAgICB2aWRlby0+RmlsdGVyT2Zmc2V0QiA9IHNsaWNlSGRyLT5zbGljZV9iZXRhX29mZnNldF9kaXZfMiA8PCAxOworICAgIH0KKworICAgIC8qIGZsZXhpYmxlIG1hY3JvYmxvY2sgb3JkZXJpbmcgKi8KKyAgICAvKiBwb3B1bGF0ZSB2aWRlby0+bWFwVW5pdFRvU2xpY2VHcm91cE1hcCBhbmQgdmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwICovCisgICAgLyogV2UgYWxyZWFkeSBjYWxsIGl0IGF0IHRoZSBlbmQgb2YgUFZBVkNFbmNJbml0aWFsaXplKCkuIEl0IGNoYW5nZXMgb25jZSBwZXIgZWFjaCBQUFMuICovCisgICAgaWYgKHZpZGVvLT5jdXJyUGljUGFyYW1zLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDAgJiYgdmlkZW8tPmN1cnJQaWNQYXJhbXMtPnNsaWNlX2dyb3VwX21hcF90eXBlID49IDMKKyAgICAgICAgICAgICYmIHZpZGVvLT5jdXJyUGljUGFyYW1zLT5zbGljZV9ncm91cF9tYXBfdHlwZSA8PSA1KQorICAgIHsKKyAgICAgICAgc2xpY2VIZHItPnNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSA9IFNMSUNFX0dST1VQX0NIQU5HRV9DWUNMRTsgIC8qIGRlZmF1bHQsIGRvbid0IHVuZGVyc3RhbmQgaG93IHRvIHNldCBpdCEhISovCisKKyAgICAgICAgdmlkZW8tPk1hcFVuaXRzSW5TbGljZUdyb3VwMCA9CisgICAgICAgICAgICBBVkNfTUlOKHNsaWNlSGRyLT5zbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUgKiB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGUsIHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyk7CisKKyAgICAgICAgRk1PSW5pdCh2aWRlbyk7CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIFNsaWNlUVB5IGZpcnN0ICAqLworICAgIC8qIGNhbGN1bGF0ZSBRU3kgZmlyc3QgKi8KKworICAgIHNsaWNlSGRyLT5zbGljZV9xcF9kZWx0YSA9IHZpZGVvLT5RUHkgLSAyNiAtIGN1cnJQUFMtPnBpY19pbml0X3FwX21pbnVzMjY7CisgICAgLy9zbGljZUhkci0+c2xpY2VfcXNfZGVsdGEgPSB2aWRlby0+UVN5IC0gMjYgLSBjdXJyUFBTLT5waWNfaW5pdF9xc19taW51czI2OworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaW50cmFfZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9pbnRyYV9lc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTU5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaW50cmFfZXN0LmNwcApAQCAtMCwwICsxLDIxOTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorCisjZGVmaW5lIFRIX0k0ICAwICAvKiB0aHJlc2hvbGQgYmlhc2luZyB0b3dhcmQgSTE2IG1vZGUgaW5zdGVhZCBvZiBJNCBtb2RlICovCisjZGVmaW5lIFRIX0ludHJhICAwIC8qIHRocmVzaG9sZCBiaWFzaW5nIHRvd2FyZCBJTlRFUiBtb2RlIGluc3RlYWQgb2YgaW50cmEgbW9kZSAqLworCisjZGVmaW5lIEZJWEVEX0lOVFJBUFJFRF9NT0RFICBBVkNfSTE2CisjZGVmaW5lIEZJWEVEX0kxNl9NT0RFICBBVkNfSTE2X0RDCisjZGVmaW5lIEZJWEVEX0k0X01PREUgICBBVkNfSTRfRGlhZ29uYWxfRG93bl9MZWZ0CisjZGVmaW5lIEZJWEVEX0lOVFJBX0NIUk9NQV9NT0RFIEFWQ19JQ19EQworCisjZGVmaW5lIENMSVBfUkVTVUxUKHgpICAgICAgaWYoKHVpbnQpeCA+IDB4RkYpeyBcCisgICAgICAgICAgICAgICAgIHggPSAweEZGICYgKH4oeD4+MzEpKTt9CisKKworYm9vbCBJbnRyYURlY2lzaW9uQUJFKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgbWluX2Nvc3QsIHVpbnQ4ICpjdXJMLCBpbnQgcGljUGl0Y2gpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0ZyYW1lSU8gKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIGludCBvcmdQaXRjaCA9IGN1cnJJbnB1dC0+cGl0Y2g7CisgICAgaW50IHhfcG9zID0gKHZpZGVvLT5tYl94KSA8PCA0OworICAgIGludCB5X3BvcyA9ICh2aWRlby0+bWJfeSkgPDwgNDsKKyAgICB1aW50OCAqb3JnWSA9IGN1cnJJbnB1dC0+WUNiQ3JbMF0gKyB5X3BvcyAqIG9yZ1BpdGNoICsgeF9wb3M7CisgICAgaW50IGo7CisgICAgdWludDggKnRvcEwsICpsZWZ0TCwgKm9yZ1lfMiwgKm9yZ1lfMzsKKyAgICBpbnQgdGVtcCwgU0JFLCBvZmZzZXQ7CisgICAgT3NjbEZsb2F0IEFCRTsKKyAgICBib29sIGludHJhID0gdHJ1ZTsKKworICAgIGlmICgoKHhfcG9zID4+IDQpICE9IChpbnQpdmlkZW8tPlBpY1dpZHRoSW5NYnMgLSAxKSAmJgorICAgICAgICAgICAgKCh5X3BvcyA+PiA0KSAhPSAoaW50KXZpZGVvLT5QaWNIZWlnaHRJbk1icyAtIDEpICYmCisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEEgJiYKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIFNCRSA9IDA7CisgICAgICAgIC8qIHRvcCBuZWlnaGJvciAqLworICAgICAgICB0b3BMID0gY3VyTCAtIHBpY1BpdGNoOworICAgICAgICAvKiBsZWZ0IG5laWdoYm9yICovCisgICAgICAgIGxlZnRMID0gY3VyTCAtIDE7CisgICAgICAgIG9yZ1lfMiA9IG9yZ1kgLSBvcmdQaXRjaDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9ICp0b3BMKysgLSBvcmdZW2pdOworICAgICAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgICAgICAgICB0ZW1wID0gKihsZWZ0TCArPSBwaWNQaXRjaCkgLSAqKG9yZ1lfMiArPSBvcmdQaXRjaCk7CisgICAgICAgICAgICBTQkUgKz0gKCh0ZW1wID49IDApID8gdGVtcCA6IC10ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNhbGN1bGF0ZSBjaHJvbWEgKi8KKyAgICAgICAgb2Zmc2V0ID0gKHlfcG9zID4+IDIpICogcGljUGl0Y2ggKyAoeF9wb3MgPj4gMSk7CisgICAgICAgIHRvcEwgPSB2aWRlby0+Y3VyclBpYy0+U2NiICsgb2Zmc2V0OworICAgICAgICBvcmdZXzIgPSBjdXJySW5wdXQtPllDYkNyWzFdICsgb2Zmc2V0ICsgKHlfcG9zID4+IDIpICogKG9yZ1BpdGNoIC0gcGljUGl0Y2gpOworCisgICAgICAgIGxlZnRMID0gdG9wTCAtIDE7CisgICAgICAgIHRvcEwgLT0gKHBpY1BpdGNoID4+IDEpOworICAgICAgICBvcmdZXzMgPSBvcmdZXzIgLSAob3JnUGl0Y2ggPj4gMSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAqdG9wTCsrIC0gb3JnWV8yW2pdOworICAgICAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgICAgICAgICB0ZW1wID0gKihsZWZ0TCArPSAocGljUGl0Y2ggPj4gMSkpIC0gKihvcmdZXzMgKz0gKG9yZ1BpdGNoID4+IDEpKTsKKyAgICAgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgICAgICB9CisKKyAgICAgICAgdG9wTCA9IHZpZGVvLT5jdXJyUGljLT5TY3IgKyBvZmZzZXQ7CisgICAgICAgIG9yZ1lfMiA9IGN1cnJJbnB1dC0+WUNiQ3JbMl0gKyBvZmZzZXQgKyAoeV9wb3MgPj4gMikgKiAob3JnUGl0Y2ggLSBwaWNQaXRjaCk7CisKKyAgICAgICAgbGVmdEwgPSB0b3BMIC0gMTsKKyAgICAgICAgdG9wTCAtPSAocGljUGl0Y2ggPj4gMSk7CisgICAgICAgIG9yZ1lfMyA9IG9yZ1lfMiAtIChvcmdQaXRjaCA+PiAxKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9ICp0b3BMKysgLSBvcmdZXzJbal07CisgICAgICAgICAgICBTQkUgKz0gKCh0ZW1wID49IDApID8gdGVtcCA6IC10ZW1wKTsKKyAgICAgICAgICAgIHRlbXAgPSAqKGxlZnRMICs9IChwaWNQaXRjaCA+PiAxKSkgLSAqKG9yZ1lfMyArPSAob3JnUGl0Y2ggPj4gMSkpOworICAgICAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBjb21wYXJlIG1pbmNvc3QvMzg0IGFuZCBTQkUvNjQgKi8KKyAgICAgICAgQUJFID0gU0JFIC8gNjQuMDsKKyAgICAgICAgaWYgKEFCRSowLjggPj0gbWluX2Nvc3QgLyAzODQuMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50cmEgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbnRyYTsKK30KKworLyogcGVyZm9ybSBzZWFyY2hpbmcgZm9yIE1CIG1vZGUgKi8KKy8qIGFzc3VtaW5nIHRoYXQgdGhpcyBpcyBkb25lIGluc2lkZSB0aGUgZW5jb2RpbmcgbG9vcCwKK25vIG5lZWQgdG8gY2FsbCBJbml0TmVpZ2hib3JBdmFpbGFiaWxpdHkgKi8KKwordm9pZCBNQkludHJhU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgbWJudW0sIHVpbnQ4ICpjdXJMLCBpbnQgcGljUGl0Y2gpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0ZyYW1lSU8gKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgaW50IG1pbl9jb3N0OworICAgIHVpbnQ4ICpvcmdZOworICAgIGludCB4X3BvcyA9ICh2aWRlby0+bWJfeCkgPDwgNDsKKyAgICBpbnQgeV9wb3MgPSAodmlkZW8tPm1iX3kpIDw8IDQ7CisgICAgdWludDMyICpzYXZlZF9pbnRlcjsKKyAgICBpbnQgajsKKyAgICBpbnQgb3JnUGl0Y2ggPSBjdXJySW5wdXQtPnBpdGNoOworICAgIGJvb2wgaW50cmEgPSB0cnVlOworCisgICAgY3Vyck1CLT5DQlAgPSAwOworCisgICAgLyogZmlyc3QgZG8gbW90aW9uIHZlY3RvciBhbmQgdmFyaWFibGUgYmxvY2sgc2l6ZSBzZWFyY2ggKi8KKyAgICBtaW5fY29zdCA9IGVuY3ZpZC0+bWluX2Nvc3RbbWJudW1dOworCisgICAgLyogbm93IHBlcmZvcm0gaW50cmEgcHJlZGljdGlvbiBzZWFyY2ggKi8KKyAgICAvKiBuZWVkIHRvIGFkZCB0aGUgY2hlY2sgZm9yIGVuY3ZpZC0+aW50cmFTZWFyY2hbdmlkZW8tPm1iTnVtXSB0byBza2lwIGludHJhCisgICAgICAgaWYgaXQncyBub3Qgd29ydGggY2hlY2tpbmcuICovCisgICAgaWYgKHZpZGVvLT5zbGljZV90eXBlID09IEFWQ19QX1NMSUNFKQorICAgIHsKKyAgICAgICAgLyogRGVjaWRlIHdoZXRoZXIgaW50cmEgc2VhcmNoIGlzIG5lY2Vzc2FyeSBvciBub3QgKi8KKyAgICAgICAgLyogVGhpcyBvbmUsIHdlIGRvIGl0IGluIHRoZSBlbmNvZGluZyBsb29wIHNvIHRoZSBuZWlnaGJvcmluZyBwaXhlbCBhcmUgdGhlCisgICAgICAgIGFjdHVhbCByZWNvbnN0cnVjdGVkIHBpeGVscy4gKi8KKyAgICAgICAgaW50cmEgPSBJbnRyYURlY2lzaW9uQUJFKGVuY3ZpZCwgbWluX2Nvc3QsIGN1ckwsIHBpY1BpdGNoKTsKKyAgICB9CisKKyAgICBpZiAoaW50cmEgPT0gdHJ1ZSB8fCB2aWRlby0+c2xpY2VfdHlwZSA9PSBBVkNfSV9TTElDRSkKKyAgICB7CisgICAgICAgIG9yZ1kgPSBjdXJySW5wdXQtPllDYkNyWzBdICsgeV9wb3MgKiBvcmdQaXRjaCArIHhfcG9zOworCisgICAgICAgIC8qIGkxNiBtb2RlIHNlYXJjaCAqLworICAgICAgICAvKiBnZW5lcmF0ZSBhbGwgdGhlIHByZWRpY3Rpb25zICovCisgICAgICAgIGludHJhcHJlZF9sdW1hXzE2eDE2KGVuY3ZpZCk7CisKKyAgICAgICAgLyogZXZhbHVhdGUgdGhlbSBvbmUgYnkgb25lICovCisgICAgICAgIGZpbmRfY29zdF8xNngxNihlbmN2aWQsIG9yZ1ksICZtaW5fY29zdCk7CisKKyAgICAgICAgaWYgKHZpZGVvLT5zbGljZV90eXBlID09IEFWQ19QX1NMSUNFKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzYXZlIGN1cnJlbnQgaW50ZXIgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgc2F2ZWRfaW50ZXIgPSBlbmN2aWQtPnN1YnBlbF9wcmVkOyAvKiByZXVzZSBleGlzdGluZyBidWZmZXIgKi8KKyAgICAgICAgICAgIGogPSAxNjsKKyAgICAgICAgICAgIGN1ckwgLT0gNDsKKyAgICAgICAgICAgIHBpY1BpdGNoIC09IDE2OworICAgICAgICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqc2F2ZWRfaW50ZXIrKyA9ICooKHVpbnQzMiopKGN1ckwgKz0gNCkpOworICAgICAgICAgICAgICAgICpzYXZlZF9pbnRlcisrID0gKigodWludDMyKikoY3VyTCArPSA0KSk7CisgICAgICAgICAgICAgICAgKnNhdmVkX2ludGVyKysgPSAqKCh1aW50MzIqKShjdXJMICs9IDQpKTsKKyAgICAgICAgICAgICAgICAqc2F2ZWRfaW50ZXIrKyA9ICooKHVpbnQzMiopKGN1ckwgKz0gNCkpOworICAgICAgICAgICAgICAgIGN1ckwgKz0gcGljUGl0Y2g7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIGk0IG1vZGUgc2VhcmNoICovCisgICAgICAgIG1iX2ludHJhNHg0X3NlYXJjaChlbmN2aWQsICZtaW5fY29zdCk7CisKKyAgICAgICAgZW5jdmlkLT5taW5fY29zdFttYm51bV0gPSBtaW5fY29zdDsgLyogdXBkYXRlIG1pbl9jb3N0ICovCisgICAgfQorCisKKyAgICBpZiAoY3Vyck1CLT5tYl9pbnRyYSkKKyAgICB7CisgICAgICAgIGNocm9tYV9pbnRyYV9zZWFyY2goZW5jdmlkKTsKKworICAgICAgICAvKiBuZWVkIHRvIHNldCB0aGlzIGluIG9yZGVyIGZvciB0aGUgTUJJbnRlclByZWRpY3Rpb24gdG8gd29yayEhICovCisgICAgICAgIG1lbXNldChjdXJyTUItPm12TDAsIDAsIHNpemVvZihpbnQzMikqMTYpOworICAgICAgICBjdXJyTUItPnJlZl9pZHhfTDBbMF0gPSBjdXJyTUItPnJlZl9pZHhfTDBbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzJdID0gY3Vyck1CLT5yZWZfaWR4X0wwWzNdID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKHZpZGVvLT5zbGljZV90eXBlID09IEFWQ19QX1NMSUNFICYmIGludHJhID09IHRydWUpCisgICAgeworICAgICAgICAvKiByZXN0b3JlIGN1cnJlbnQgaW50ZXIgcHJlZGljdGlvbiAqLworICAgICAgICBzYXZlZF9pbnRlciA9IGVuY3ZpZC0+c3VicGVsX3ByZWQ7IC8qIHJldXNlIGV4aXN0aW5nIGJ1ZmZlciAqLworICAgICAgICBqID0gMTY7CisgICAgICAgIGN1ckwgLT0gKChwaWNQaXRjaCArIDE2KSA8PCA0KTsKKyAgICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyKikoY3VyTCArPSA0KSkgPSAqc2F2ZWRfaW50ZXIrKzsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGN1ckwgKz0gNCkpID0gKnNhdmVkX2ludGVyKys7CisgICAgICAgICAgICAqKCh1aW50MzIqKShjdXJMICs9IDQpKSA9ICpzYXZlZF9pbnRlcisrOworICAgICAgICAgICAgKigodWludDMyKikoY3VyTCArPSA0KSkgPSAqc2F2ZWRfaW50ZXIrKzsKKyAgICAgICAgICAgIGN1ckwgKz0gcGljUGl0Y2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisvKiBnZW5lcmF0ZSBhbGwgdGhlIHByZWRpY3Rpb24gdmFsdWVzICovCit2b2lkIGludHJhcHJlZF9sdW1hXzE2eDE2KEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNQaWN0dXJlRGF0YSAqY3VyclBpYyA9IHZpZGVvLT5jdXJyUGljOworCisgICAgaW50IHhfcG9zID0gKHZpZGVvLT5tYl94KSA8PCA0OworICAgIGludCB5X3BvcyA9ICh2aWRlby0+bWJfeSkgPDwgNDsKKyAgICBpbnQgcGl0Y2ggPSBjdXJyUGljLT5waXRjaDsKKworICAgIGludCBvZmZzZXQgPSB5X3BvcyAqIHBpdGNoICsgeF9wb3M7CisKKyAgICB1aW50OCAqcHJlZCwgKnRvcCwgKmxlZnQ7CisgICAgdWludDggKmN1ckwgPSBjdXJyUGljLT5TbCArIG9mZnNldDsgLyogcG9pbnQgdG8gcmVjb25zdHJ1Y3RlZCBmcmFtZSAqLworICAgIHVpbnQzMiB3b3JkMSwgd29yZDIsIHdvcmQzLCB3b3JkNDsKKyAgICB1aW50MzIgc3VtID0gMDsKKworICAgIGludCBhXzE2LCBiLCBjLCBmYWN0b3JfYzsKKyAgICB1aW50OCAqY29tcF9yZWZfeDAsICpjb21wX3JlZl94MSwgKmNvbXBfcmVmX3kwLCAqY29tcF9yZWZfeTE7CisgICAgaW50IEggPSAwLCBWID0gMCwgdG1wLCB2YWx1ZTsKKyAgICBpbnQgaTsKKworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgeworICAgICAgICAvL2dldCB2ZXJ0aWNhbCBwcmVkaWN0aW9uIG1vZGUKKyAgICAgICAgdG9wID0gY3VyTCAtIHBpdGNoOworCisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfVmVydGljYWxdIC0gMTY7CisKKyAgICAgICAgd29yZDEgPSAqKCh1aW50MzIqKSh0b3ApKTsgIC8qIHJlYWQgNCBieXRlcyBmcm9tIHRvcCAqLworICAgICAgICB3b3JkMiA9ICooKHVpbnQzMiopKHRvcCArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gdG9wICovCisgICAgICAgIHdvcmQzID0gKigodWludDMyKikodG9wICsgOCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSB0b3AgKi8KKyAgICAgICAgd29yZDQgPSAqKCh1aW50MzIqKSh0b3AgKyAxMikpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSB0b3AgKi8KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArPSAxNikpID0gd29yZDE7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gd29yZDI7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgOCkpID0gd29yZDM7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHdvcmQ0OworCisgICAgICAgIH0KKworICAgICAgICBzdW0gPSB3b3JkMSAmIDB4RkYwMEZGOworICAgICAgICB3b3JkMSA9ICh3b3JkMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICBzdW0gKz0gd29yZDE7CisgICAgICAgIHdvcmQxID0gKHdvcmQyICYgMHhGRjAwRkYpOworICAgICAgICBzdW0gKz0gd29yZDE7CisgICAgICAgIHdvcmQyID0gKHdvcmQyID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgIHN1bSArPSB3b3JkMjsKKyAgICAgICAgd29yZDEgPSAod29yZDMgJiAweEZGMDBGRik7CisgICAgICAgIHN1bSArPSB3b3JkMTsKKyAgICAgICAgd29yZDMgPSAod29yZDMgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgc3VtICs9IHdvcmQzOworICAgICAgICB3b3JkMSA9ICh3b3JkNCAmIDB4RkYwMEZGKTsKKyAgICAgICAgc3VtICs9IHdvcmQxOworICAgICAgICB3b3JkNCA9ICh3b3JkNCA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICBzdW0gKz0gd29yZDQ7CisKKyAgICAgICAgc3VtICs9IChzdW0gPj4gMTYpOworICAgICAgICBzdW0gJj0gMHhGRkZGOworCisgICAgICAgIGlmICghdmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICB7CisgICAgICAgICAgICBzdW0gPSAoc3VtICsgOCkgPj4gNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCisgICAgeworICAgICAgICAvLyBnZXQgaG9yaXpvbnRhbCBtb2RlCisgICAgICAgIGxlZnQgPSBjdXJMIC0gMSAtIHBpdGNoOworCisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfSG9yaXpvbnRhbF0gLSAxNjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgd29yZDEgPSAqKGxlZnQgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtICs9IHdvcmQxOworCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSA8PCA4KSB8IHdvcmQxOworICAgICAgICAgICAgd29yZDEgPSAod29yZDEgPDwgMTYpIHwgd29yZDE7IC8qIG1ha2UgaXQgNCAqLworCisgICAgICAgICAgICAqKHVpbnQzMiopKHByZWQgKz0gMTYpID0gd29yZDE7CisgICAgICAgICAgICAqKHVpbnQzMiopKHByZWQgKyA0KSA9IHdvcmQxOworICAgICAgICAgICAgKih1aW50MzIqKShwcmVkICsgOCkgPSB3b3JkMTsKKyAgICAgICAgICAgICoodWludDMyKikocHJlZCArIDEyKSA9IHdvcmQxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1bSA9IChzdW0gKyA4KSA+PiA0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3VtID0gKHN1bSArIDE2KSA+PiA1OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZ2V0IERDIG1vZGUKKyAgICBpZiAoIXZpZGVvLT5pbnRyYUF2YWlsQSAmJiAhdmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgc3VtID0gMHg4MDgwODA4MDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3VtID0gKHN1bSA8PCA4KSB8IHN1bTsKKyAgICAgICAgc3VtID0gKHN1bSA8PCAxNikgfCBzdW07CisgICAgfQorCisgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pMTZbQVZDX0kxNl9EQ10gLSAxNjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gMTYpKSA9IHN1bTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHN1bTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHN1bTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSBzdW07CisgICAgfQorCisgICAgLy8gZ2V0IHBsYW5lIG1vZGUKKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpCisgICAgeworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X1BsYW5lXSAtIDE2OworCisgICAgICAgIGNvbXBfcmVmX3gwID0gY3VyTCAtIHBpdGNoICsgODsKKyAgICAgICAgY29tcF9yZWZfeDEgPSBjdXJMIC0gcGl0Y2ggKyA2OworICAgICAgICBjb21wX3JlZl95MCA9IGN1ckwgLSAxICsgKHBpdGNoIDw8IDMpOworICAgICAgICBjb21wX3JlZl95MSA9IGN1ckwgLSAxICsgNiAqIHBpdGNoOworCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEggKz0gaSAqICgqY29tcF9yZWZfeDArKyAtICpjb21wX3JlZl94MS0tKTsKKyAgICAgICAgICAgIFYgKz0gaSAqICgqY29tcF9yZWZfeTAgLSAqY29tcF9yZWZfeTEpOworICAgICAgICAgICAgY29tcF9yZWZfeTAgKz0gcGl0Y2g7CisgICAgICAgICAgICBjb21wX3JlZl95MSAtPSBwaXRjaDsKKyAgICAgICAgfQorCisgICAgICAgIEggKz0gaSAqICgqY29tcF9yZWZfeDArKyAtIGN1ckxbLXBpdGNoLTFdKTsKKyAgICAgICAgViArPSBpICogKCpjb21wX3JlZl95MCAtICpjb21wX3JlZl95MSk7CisKKworICAgICAgICBhXzE2ID0gKCgqKGN1ckwgLSBwaXRjaCArIDE1KSArICooY3VyTCAtIDEgKyAxNSAqIHBpdGNoKSkgPDwgNCkgKyAxNjs7CisgICAgICAgIGIgPSAoNSAqIEggKyAzMikgPj4gNjsKKyAgICAgICAgYyA9ICg1ICogViArIDMyKSA+PiA2OworCisgICAgICAgIHRtcCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmYWN0b3JfYyA9IGFfMTYgKyBjICogKHRtcCsrIC0gNyk7CisgICAgICAgICAgICBmYWN0b3JfYyAtPSA3ICogYjsKKworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCA4KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArPSAxNikpID0gd29yZDE7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9IHZhbHVlOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDgpOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDE2KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gd29yZDE7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9IHZhbHVlOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDgpOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDE2KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgOCkpID0gd29yZDE7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9IHZhbHVlOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDgpOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDE2KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyAxMikpID0gd29yZDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKy8qIGV2YWx1YXRlIGVhY2ggcHJlZGljdGlvbiBtb2RlIG9mIEkxNiAqLwordm9pZCBmaW5kX2Nvc3RfMTZ4MTYoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpvcmdZLCBpbnQgKm1pbl9jb3N0KQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIGludCBjb3N0OworICAgIGludCBvcmdfcGl0Y2ggPSBlbmN2aWQtPmN1cnJJbnB1dC0+cGl0Y2g7CisKKyAgICAvKiBldmFsdWF0ZSB2ZXJ0aWNhbCBtb2RlICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIGNvc3QgPSBjb3N0X2kxNihvcmdZLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pMTZbQVZDX0kxNl9WZXJ0aWNhbF0sICptaW5fY29zdCk7CisgICAgICAgIGlmIChjb3N0IDwgKm1pbl9jb3N0KQorICAgICAgICB7CisgICAgICAgICAgICAqbWluX2Nvc3QgPSBjb3N0OworICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfSTE2OworICAgICAgICAgICAgY3Vyck1CLT5tYl9pbnRyYSA9IDE7CisgICAgICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X1ZlcnRpY2FsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBldmFsdWF0ZSBob3Jpem9udGFsIG1vZGUgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgIHsKKyAgICAgICAgY29zdCA9IGNvc3RfaTE2KG9yZ1ksIG9yZ19waXRjaCwgZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X0hvcml6b250YWxdLCAqbWluX2Nvc3QpOworICAgICAgICBpZiAoY29zdCA8ICptaW5fY29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgKm1pbl9jb3N0ID0gY29zdDsKKyAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX0kxNjsKKyAgICAgICAgICAgIGN1cnJNQi0+bWJfaW50cmEgPSAxOworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9Ib3Jpem9udGFsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZXZhbHVhdGUgREMgbW9kZSAqLworICAgIGNvc3QgPSBjb3N0X2kxNihvcmdZLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pMTZbQVZDX0kxNl9EQ10sICptaW5fY29zdCk7CisgICAgaWYgKGNvc3QgPCAqbWluX2Nvc3QpCisgICAgeworICAgICAgICAqbWluX2Nvc3QgPSBjb3N0OworICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19JMTY7CisgICAgICAgIGN1cnJNQi0+bWJfaW50cmEgPSAxOworICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X0RDOworICAgIH0KKworICAgIC8qIGV2YWx1YXRlIHBsYW5lIG1vZGUgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpCisgICAgeworICAgICAgICBjb3N0ID0gY29zdF9pMTYob3JnWSwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfUGxhbmVdLCAqbWluX2Nvc3QpOworICAgICAgICBpZiAoY29zdCA8ICptaW5fY29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgKm1pbl9jb3N0ID0gY29zdDsKKyAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX0kxNjsKKyAgICAgICAgICAgIGN1cnJNQi0+bWJfaW50cmEgPSAxOworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9QbGFuZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworaW50IGNvc3RfaTE2KHVpbnQ4ICpvcmcsIGludCBvcmdfcGl0Y2gsIHVpbnQ4ICpwcmVkLCBpbnQgbWluX2Nvc3QpCit7CisKKyAgICBpbnQgY29zdDsKKyAgICBpbnQgaiwgazsKKyAgICBpbnQxNiByZXNbMjU2XSwgKnByZXM7IC8vIHJlc2lkdWUKKyAgICBpbnQgbTAsIG0xLCBtMiwgbTM7CisKKyAgICAvLyBjYWxjdWxhdGUgU0FURAorICAgIG9yZ19waXRjaCAtPSAxNjsKKyAgICBwcmVzID0gcmVzOworICAgIC8vIGhvcml6b250YWwgdHJhbnNmb3JtCisgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgeworICAgICAgICBrID0gNDsKKyAgICAgICAgd2hpbGUgKGsgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBtMCA9IG9yZ1swXSAtIHByZWRbMF07CisgICAgICAgICAgICBtMyA9IG9yZ1szXSAtIHByZWRbM107CisgICAgICAgICAgICBtMCArPSBtMzsKKyAgICAgICAgICAgIG0zID0gbTAgLSAobTMgPDwgMSk7CisgICAgICAgICAgICBtMSA9IG9yZ1sxXSAtIHByZWRbMV07CisgICAgICAgICAgICBtMiA9IG9yZ1syXSAtIHByZWRbMl07CisgICAgICAgICAgICBtMSArPSBtMjsKKyAgICAgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgICAgICBwcmVzWzBdID0gbTAgKyBtMTsKKyAgICAgICAgICAgIHByZXNbMl0gPSBtMCAtIG0xOworICAgICAgICAgICAgcHJlc1sxXSA9IG0yICsgbTM7CisgICAgICAgICAgICBwcmVzWzNdID0gbTMgLSBtMjsKKworICAgICAgICAgICAgb3JnICs9IDQ7CisgICAgICAgICAgICBwcmVzICs9IDQ7CisgICAgICAgICAgICBwcmVkICs9IDQ7CisgICAgICAgICAgICBrLS07CisgICAgICAgIH0KKyAgICAgICAgb3JnICs9IG9yZ19waXRjaDsKKyAgICB9CisgICAgLyogdmVydGljYWwgdHJhbnNmb3JtICovCisgICAgY29zdCA9IDA7CisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIHByZXMgPSByZXMgKyAoaiA8PCA2KTsKKyAgICAgICAgayA9IDE2OworICAgICAgICB3aGlsZSAoayA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG0wID0gcHJlc1swXTsKKyAgICAgICAgICAgIG0zID0gcHJlc1szPDw0XTsKKyAgICAgICAgICAgIG0wICs9IG0zOworICAgICAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgICAgIG0xID0gcHJlc1sxPDw0XTsKKyAgICAgICAgICAgIG0yID0gcHJlc1syPDw0XTsKKyAgICAgICAgICAgIG0xICs9IG0yOworICAgICAgICAgICAgbTIgPSBtMSAtIChtMiA8PCAxKTsKKyAgICAgICAgICAgIHByZXNbMF0gPSBtMCA9IG0wICsgbTE7CisKKyAgICAgICAgICAgIGlmIChrJjB4MykgIC8vIG9ubHkgc3VtIHVwIG5vbiBEQyB2YWx1ZXMuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29zdCArPSAoKG0wID4gMCkgPyBtMCA6IC1tMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG0xID0gbTAgLSAobTEgPDwgMSk7CisgICAgICAgICAgICBjb3N0ICs9ICgobTEgPiAwKSA/IG0xIDogLW0xKTsKKyAgICAgICAgICAgIG0zID0gbTIgKyBtMzsKKyAgICAgICAgICAgIGNvc3QgKz0gKChtMyA+IDApID8gbTMgOiAtbTMpOworICAgICAgICAgICAgbTIgPSBtMyAtIChtMiA8PCAxKTsKKyAgICAgICAgICAgIGNvc3QgKz0gKChtMiA+IDApID8gbTIgOiAtbTIpOworCisgICAgICAgICAgICBwcmVzKys7CisgICAgICAgICAgICBrLS07CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjb3N0ID4+IDEpID4gbWluX2Nvc3QpIC8qIGVhcmx5IGRyb3Agb3V0ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoY29zdCA+PiAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEhhZGFtYXJkIG9mIHRoZSBEQyBjb2VmZmljaWVudCAqLworICAgIHByZXMgPSByZXM7CisgICAgayA9IDQ7CisgICAgd2hpbGUgKGsgPiAwKQorICAgIHsKKyAgICAgICAgbTAgPSBwcmVzWzBdOworICAgICAgICBtMyA9IHByZXNbMzw8Ml07CisgICAgICAgIG0wID4+PSAyOworICAgICAgICBtMCArPSAobTMgPj4gMik7CisgICAgICAgIG0zID0gbTAgLSAobTMgPj4gMSk7CisgICAgICAgIG0xID0gcHJlc1sxPDwyXTsKKyAgICAgICAgbTIgPSBwcmVzWzI8PDJdOworICAgICAgICBtMSA+Pj0gMjsKKyAgICAgICAgbTEgKz0gKG0yID4+IDIpOworICAgICAgICBtMiA9IG0xIC0gKG0yID4+IDEpOworICAgICAgICBwcmVzWzBdID0gKG0wICsgbTEpOworICAgICAgICBwcmVzWzI8PDJdID0gKG0wIC0gbTEpOworICAgICAgICBwcmVzWzE8PDJdID0gKG0yICsgbTMpOworICAgICAgICBwcmVzWzM8PDJdID0gKG0zIC0gbTIpOworICAgICAgICBwcmVzICs9ICg0IDw8IDQpOworICAgICAgICBrLS07CisgICAgfQorCisgICAgcHJlcyA9IHJlczsKKyAgICBrID0gNDsKKyAgICB3aGlsZSAoayA+IDApCisgICAgeworICAgICAgICBtMCA9IHByZXNbMF07CisgICAgICAgIG0zID0gcHJlc1szPDw2XTsKKyAgICAgICAgbTAgKz0gbTM7CisgICAgICAgIG0zID0gbTAgLSAobTMgPDwgMSk7CisgICAgICAgIG0xID0gcHJlc1sxPDw2XTsKKyAgICAgICAgbTIgPSBwcmVzWzI8PDZdOworICAgICAgICBtMSArPSBtMjsKKyAgICAgICAgbTIgPSBtMSAtIChtMiA8PCAxKTsKKyAgICAgICAgbTAgPSBtMCArIG0xOworICAgICAgICBjb3N0ICs9ICgobTAgPj0gMCkgPyBtMCA6IC1tMCk7CisgICAgICAgIG0xID0gbTAgLSAobTEgPDwgMSk7CisgICAgICAgIGNvc3QgKz0gKChtMSA+PSAwKSA/IG0xIDogLW0xKTsKKyAgICAgICAgbTMgPSBtMiArIG0zOworICAgICAgICBjb3N0ICs9ICgobTMgPj0gMCkgPyBtMyA6IC1tMyk7CisgICAgICAgIG0yID0gbTMgLSAobTIgPDwgMSk7CisgICAgICAgIGNvc3QgKz0gKChtMiA+PSAwKSA/IG0yIDogLW0yKTsKKyAgICAgICAgcHJlcyArPSA0OworCisgICAgICAgIGlmICgoY29zdCA+PiAxKSA+IG1pbl9jb3N0KSAvKiBlYXJseSBkcm9wIG91dCAqLworICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGNvc3QgPj4gMSk7CisgICAgICAgIH0KKworICAgICAgICBrLS07CisgICAgfQorCisgICAgcmV0dXJuIChjb3N0ID4+IDEpOworfQorCisKK3ZvaWQgbWJfaW50cmE0eDRfc2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgKm1pbl9jb3N0KQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gdmlkZW8tPmN1cnJQaWM7CisgICAgQVZDRnJhbWVJTyAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgaW50IHBpdGNoID0gY3VyclBpYy0+cGl0Y2g7CisgICAgaW50IG9yZ19waXRjaCA9IGN1cnJJbnB1dC0+cGl0Y2g7CisgICAgaW50IG9mZnNldDsKKyAgICB1aW50OCAqY3VyTCwgKmNvbXAsICpvcmc0LCAqb3JnODsKKyAgICBpbnQgeSA9IHZpZGVvLT5tYl95IDw8IDQ7CisgICAgaW50IHggPSB2aWRlby0+bWJfeCA8PCA0OworCisgICAgaW50IGI4LCBiNCwgY29zdDR4NCwgYmxraWR4OworICAgIGludCBjb3N0ID0gMDsKKyAgICBpbnQgbnVtY29lZjsKKyAgICBpbnQgZHVtbXkgPSAwOworICAgIGludCBtYl9pbnRyYSA9IGN1cnJNQi0+bWJfaW50cmE7IC8vIHNhdmUgdGhlIG9yaWdpbmFsIHZhbHVlCisKKyAgICBvZmZzZXQgPSB5ICogcGl0Y2ggKyB4OworCisgICAgY3VyTCA9IGN1cnJQaWMtPlNsICsgb2Zmc2V0OworICAgIG9yZzggPSBjdXJySW5wdXQtPllDYkNyWzBdICsgeSAqIG9yZ19waXRjaCArIHg7CisgICAgdmlkZW8tPnByZWRfcGl0Y2ggPSA0OworCisgICAgY29zdCA9IChpbnQpKDYuMCAqIGVuY3ZpZC0+bGFtYmRhX21vZGUgKyAwLjQ5OTkpOworICAgIGNvc3QgPDw9IDI7CisKKyAgICBjdXJyTUItPm1iX2ludHJhID0gMTsgIC8vIHRlbXBvcmFyeSBzZXQgdGhpcyB0byBvbmUgdG8gZW5hYmxlIHRoZSBJRENUCisgICAgLy8gb3BlcmF0aW9uIGluc2lkZSBkY3RfbHVtYQorCisgICAgZm9yIChiOCA9IDA7IGI4IDwgNDsgYjgrKykKKyAgICB7CisgICAgICAgIGNvbXAgPSBjdXJMOworICAgICAgICBvcmc0ID0gb3JnODsKKworICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgICAgICB7CisgICAgICAgICAgICBibGtpZHggPSBibGtJZHgyYmxrWFlbYjhdW2I0XTsKKyAgICAgICAgICAgIGNvc3Q0eDQgPSBibGtfaW50cmE0eDRfc2VhcmNoKGVuY3ZpZCwgYmxraWR4LCBjb21wLCBvcmc0KTsKKyAgICAgICAgICAgIGNvc3QgKz0gY29zdDR4NDsKKyAgICAgICAgICAgIGlmIChjb3N0ID4gKm1pbl9jb3N0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+bWJfaW50cmEgPSBtYl9pbnRyYTsgLy8gcmVzdG9yZSB0aGUgdmFsdWUKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBkbyByZXNpZHVlLCBYZnJtLCBRLCBpbnZRLCBpbnZYZnJtLCByZWNvbiBhbmQgc2F2ZSB0aGUgRENUIGNvZWZzLiovCisgICAgICAgICAgICB2aWRlby0+cHJlZF9ibG9jayA9IGVuY3ZpZC0+cHJlZF9pNFtjdXJyTUItPmk0TW9kZVtibGtpZHhdXTsKKyAgICAgICAgICAgIG51bWNvZWYgPSBkY3RfbHVtYShlbmN2aWQsIGJsa2lkeCwgY29tcCwgb3JnNCwgJmR1bW15KTsKKyAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbYmxraWR4XSA9IG51bWNvZWY7CisgICAgICAgICAgICBpZiAobnVtY29lZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+Y2JwNHg0IHw9ICgxIDw8IGJsa2lkeCk7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5DQlAgfD0gKDEgPDwgYjgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYjQmMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb21wICs9ICgocGl0Y2ggPDwgMikgLSA0KTsKKyAgICAgICAgICAgICAgICBvcmc0ICs9ICgob3JnX3BpdGNoIDw8IDIpIC0gNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29tcCArPSA0OworICAgICAgICAgICAgICAgIG9yZzQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChiOCYxKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJMICs9ICgocGl0Y2ggPDwgMykgLSA4KTsKKyAgICAgICAgICAgIG9yZzggKz0gKChvcmdfcGl0Y2ggPDwgMykgLSA4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1ckwgKz0gODsKKyAgICAgICAgICAgIG9yZzggKz0gODsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN1cnJNQi0+bWJfaW50cmEgPSBtYl9pbnRyYTsgLy8gcmVzdG9yZSB0aGUgdmFsdWUKKworICAgIGlmIChjb3N0IDwgKm1pbl9jb3N0KQorICAgIHsKKyAgICAgICAgKm1pbl9jb3N0ID0gY29zdDsKKyAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfSTQ7CisgICAgICAgIGN1cnJNQi0+bWJfaW50cmEgPSAxOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworLyogc2VhcmNoIGZvciBpNCBtb2RlIGZvciBhIDR4NCBibG9jayAqLworaW50IGJsa19pbnRyYTR4NF9zZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBibGtpZHgsIHVpbnQ4ICpjdXIsIHVpbnQ4ICpvcmcpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ05laWdoYm9yQXZhaWxhYmlsaXR5IGF2YWlsYWJpbGl0eTsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIGJvb2wgdG9wX2xlZnQgPSBGQUxTRTsKKyAgICBpbnQgcGl0Y2ggPSB2aWRlby0+Y3VyclBpYy0+cGl0Y2g7CisgICAgdWludDggbW9kZV9hdmFpbFtBVkNOdW1JNFByZWRNb2RlXTsKKyAgICB1aW50MzIgdGVtcCwgREM7CisgICAgdWludDggKnByZWQ7CisgICAgaW50IG9yZ19waXRjaCA9IGVuY3ZpZC0+Y3VycklucHV0LT5waXRjaDsKKyAgICB1aW50MTYgbWluX2Nvc3QsIGNvc3Q7CisKKyAgICBpbnQgUF94LCBRX3gsIFJfeCwgUF95LCBRX3ksIFJfeSwgRCwgRDAsIEQxOworICAgIGludCBQMCwgUTAsIFIwLCBTMCwgUDEsIFExLCBSMSwgUDIsIFEyOworICAgIHVpbnQ4IFBfQSwgUF9CLCBQX0MsIFBfRCwgUF9FLCBQX0YsIFBfRywgUF9ILCBQX0ksIFBfSiwgUF9LLCBQX0wsIFBfWDsKKyAgICBpbnQgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3OworICAgIGludCB4MCwgeDEsIHgyLCB4MywgeDQsIHg1OworICAgIHVpbnQzMiB0ZW1wMSwgdGVtcDI7CisKKyAgICBpbnQgaXBtb2RlLCBtb3N0UHJvYmFibGVNb2RlOworICAgIGludCBmaXhlZGNvc3QgPSA0ICogZW5jdmlkLT5sYW1iZGFfbW9kZTsKKyAgICBpbnQgbWluX3NhZCA9IDB4N0ZGRjsKKworICAgIGF2YWlsYWJpbGl0eS5sZWZ0ID0gVFJVRTsKKyAgICBhdmFpbGFiaWxpdHkudG9wID0gVFJVRTsKKyAgICBpZiAoYmxraWR4IDw9IDMpIC8qIHRvcCByb3cgYmxvY2sgICghYmxvY2tfeSkgKi8KKyAgICB7IC8qIGNoZWNrIGF2YWlsYWJpbGl0eSB1cCAqLworICAgICAgICBhdmFpbGFiaWxpdHkudG9wID0gdmlkZW8tPmludHJhQXZhaWxCIDsKKyAgICB9CisgICAgaWYgKCEoYmxraWR4JjB4MykpIC8qIGxlZnQgY29sdW1uIGJsb2NrICghYmxvY2tfeCkqLworICAgIHsgLyogY2hlY2sgYXZhaWxhYmlsaXR5IGxlZnQgKi8KKyAgICAgICAgYXZhaWxhYmlsaXR5LmxlZnQgPSB2aWRlby0+aW50cmFBdmFpbEEgOworICAgIH0KKyAgICBhdmFpbGFiaWxpdHkudG9wX3JpZ2h0ID0gQmxrVG9wUmlnaHRbYmxraWR4XTsKKworICAgIGlmIChhdmFpbGFiaWxpdHkudG9wX3JpZ2h0ID09IDIpCisgICAgeworICAgICAgICBhdmFpbGFiaWxpdHkudG9wX3JpZ2h0ID0gdmlkZW8tPmludHJhQXZhaWxCOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFiaWxpdHkudG9wX3JpZ2h0ID09IDMpCisgICAgeworICAgICAgICBhdmFpbGFiaWxpdHkudG9wX3JpZ2h0ID0gdmlkZW8tPmludHJhQXZhaWxDOworICAgIH0KKworICAgIGlmIChhdmFpbGFiaWxpdHkudG9wID09IFRSVUUpCisgICAgeworICAgICAgICB0ZW1wID0gKih1aW50MzIqKShjdXIgLSBwaXRjaCk7CisgICAgICAgIFBfQSA9IHRlbXAgJiAweEZGOworICAgICAgICBQX0IgPSAodGVtcCA+PiA4KSAmIDB4RkY7CisgICAgICAgIFBfQyA9ICh0ZW1wID4+IDE2KSAmIDB4RkY7CisgICAgICAgIFBfRCA9ICh0ZW1wID4+IDI0KSAmIDB4RkY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBfQSA9IFBfQiA9IFBfQyA9IFBfRCA9IDEyODsKKyAgICB9CisKKyAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICoodWludDMyKikoY3VyIC0gcGl0Y2ggKyA0KTsKKyAgICAgICAgUF9FID0gdGVtcCAmIDB4RkY7CisgICAgICAgIFBfRiA9ICh0ZW1wID4+IDgpICYgMHhGRjsKKyAgICAgICAgUF9HID0gKHRlbXAgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgUF9IID0gKHRlbXAgPj4gMjQpICYgMHhGRjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUF9FID0gUF9GID0gUF9HID0gUF9IID0gMTI4OworICAgIH0KKworICAgIGlmIChhdmFpbGFiaWxpdHkubGVmdCA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgY3VyLS07CisgICAgICAgIFBfSSA9ICpjdXI7CisgICAgICAgIFBfSiA9ICooY3VyICs9IHBpdGNoKTsKKyAgICAgICAgUF9LID0gKihjdXIgKz0gcGl0Y2gpOworICAgICAgICBQX0wgPSAqKGN1ciArIHBpdGNoKTsKKyAgICAgICAgY3VyIC09IChwaXRjaCA8PCAxKTsKKyAgICAgICAgY3VyKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBfSSA9IFBfSiA9IFBfSyA9IFBfTCA9IDEyODsKKyAgICB9CisKKyAgICAvKiBjaGVjayBpZiB0b3AtbGVmdCBwaXhlbCBpcyBhdmFpbGFibGUgKi8KKyAgICBpZiAoKChibGtpZHggPiAzKSAmJiAoYmxraWR4JjB4MykpIHx8ICgoYmxraWR4ID4gMykgJiYgdmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICAgICAgfHwgKChibGtpZHgmMHgzKSAmJiB2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgICAgICB8fCAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsRCAmJiB2aWRlby0+aW50cmFBdmFpbEIpKQorICAgIHsKKyAgICAgICAgdG9wX2xlZnQgPSBUUlVFOworICAgICAgICBQX1ggPSAqKGN1ciAtIHBpdGNoIC0gMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBfWCA9IDEyODsKKyAgICB9CisKKyAgICAvLz09PT09IElOVFJBIFBSRURJQ1RJT04gRk9SIDR4NCBCTE9DSyA9PT09PQorICAgIC8qIHZlcnRpY2FsICovCisgICAgbW9kZV9hdmFpbFtBVkNfSTRfVmVydGljYWxdID0gMDsKKyAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcCkKKyAgICB7CisgICAgICAgIG1vZGVfYXZhaWxbQVZDX0k0X1ZlcnRpY2FsXSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X1ZlcnRpY2FsXTsKKworICAgICAgICB0ZW1wID0gKFBfRCA8PCAyNCkgfCAoUF9DIDw8IDE2KSB8IChQX0IgPDwgOCkgfCBQX0EgOworICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gIHRlbXA7IC8qIHdyaXRlIDQgYXQgYSB0aW1lICovCisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gIHRlbXA7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gIHRlbXA7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gIHRlbXA7CisgICAgfQorICAgIC8qIGhvcml6b250YWwgKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9Ib3Jpem9udGFsXSA9IDA7CisgICAgbW9kZV9hdmFpbFtBVkNfSTRfSG9yaXpvbnRhbF9VcF0gPSAwOworICAgIGlmIChhdmFpbGFiaWxpdHkubGVmdCkKKyAgICB7CisgICAgICAgIG1vZGVfYXZhaWxbQVZDX0k0X0hvcml6b250YWxdID0gMTsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtBVkNfSTRfSG9yaXpvbnRhbF07CisKKyAgICAgICAgdGVtcCA9IFBfSSB8IChQX0kgPDwgOCk7CisgICAgICAgIHRlbXAgPSB0ZW1wIHwgKHRlbXAgPDwgMTYpOworICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKKyAgICAgICAgdGVtcCA9IFBfSiB8IChQX0ogPDwgOCk7CisgICAgICAgIHRlbXAgPSB0ZW1wIHwgKHRlbXAgPDwgMTYpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisgICAgICAgIHRlbXAgPSBQX0sgfCAoUF9LIDw8IDgpOworICAgICAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworICAgICAgICB0ZW1wID0gUF9MIHwgKFBfTCA8PCA4KTsKKyAgICAgICAgdGVtcCA9IHRlbXAgfCAodGVtcCA8PCAxNik7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9Ib3Jpem9udGFsX1VwXSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X0hvcml6b250YWxfVXBdOworCisgICAgICAgIFEwID0gKFBfSiArIFBfSyArIDEpID4+IDE7CisgICAgICAgIFExID0gKFBfSiArIChQX0sgPDwgMSkgKyBQX0wgKyAyKSA+PiAyOworICAgICAgICBQMCA9ICgoUF9JICsgUF9KICsgMSkgPj4gMSk7CisgICAgICAgIFAxID0gKChQX0kgKyAoUF9KIDw8IDEpICsgUF9LICsgMikgPj4gMik7CisKKyAgICAgICAgdGVtcCA9IFAwIHwgKFAxIDw8IDgpOyAgICAgIC8vIFtQMCBQMSBRMCBRMV0KKyAgICAgICAgdGVtcCB8PSAoUTAgPDwgMTYpOyAgICAgLy8gW1EwIFExIFIwIERPXQorICAgICAgICB0ZW1wIHw9IChRMSA8PCAyNCk7ICAgICAvLyBbUjAgRDAgRDEgRDFdCisgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOyAgICAgIC8vIFtEMSBEMSBEMSBEMV0KKworICAgICAgICBEMCA9IChQX0sgKyAzICogUF9MICsgMikgPj4gMjsKKyAgICAgICAgUjAgPSAoUF9LICsgUF9MICsgMSkgPj4gMTsKKworICAgICAgICB0ZW1wID0gUTAgfCAoUTEgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKFIwIDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoRDAgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgRDEgPSBQX0w7CisKKyAgICAgICAgdGVtcCA9IFIwIHwgKEQwIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChEMSA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKEQxIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIHRlbXAgPSBEMSB8IChEMSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAodGVtcCA8PCAxNik7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKyAgICB9CisgICAgLyogREMgKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9EQ10gPSAxOworICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X0RDXTsKKyAgICBpZiAoYXZhaWxhYmlsaXR5LmxlZnQpCisgICAgeworICAgICAgICBEQyA9IFBfSSArIFBfSiArIFBfSyArIFBfTDsKKworICAgICAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcCkKKyAgICAgICAgeworICAgICAgICAgICAgREMgPSAoUF9BICsgUF9CICsgUF9DICsgUF9EICsgREMgKyA0KSA+PiAzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgREMgPSAoREMgKyAyKSA+PiAyOworCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmlsaXR5LnRvcCkKKyAgICB7CisgICAgICAgIERDID0gKFBfQSArIFBfQiArIFBfQyArIFBfRCArIDIpID4+IDI7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREMgPSAxMjg7CisgICAgfQorCisgICAgdGVtcCA9IERDIHwgKERDIDw8IDgpOworICAgIHRlbXAgPSB0ZW1wIHwgKHRlbXAgPDwgMTYpOworICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOworICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKyAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgLyogRG93bi1sZWZ0ICovCisgICAgbW9kZV9hdmFpbFtBVkNfSTRfRGlhZ29uYWxfRG93bl9MZWZ0XSA9IDA7CisKKyAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcCkKKyAgICB7CisgICAgICAgIG1vZGVfYXZhaWxbQVZDX0k0X0RpYWdvbmFsX0Rvd25fTGVmdF0gPSAxOworCisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X0RpYWdvbmFsX0Rvd25fTGVmdF07CisKKyAgICAgICAgcjAgPSBQX0E7CisgICAgICAgIHIxID0gUF9COworICAgICAgICByMiA9IFBfQzsKKyAgICAgICAgcjMgPSBQX0Q7CisKKyAgICAgICAgcjAgKz0gKHIxIDw8IDEpOworICAgICAgICByMCArPSByMjsKKyAgICAgICAgcjAgKz0gMjsKKyAgICAgICAgcjAgPj49IDI7CisgICAgICAgIHIxICs9IChyMiA8PCAxKTsKKyAgICAgICAgcjEgKz0gcjM7CisgICAgICAgIHIxICs9IDI7CisgICAgICAgIHIxID4+PSAyOworCisgICAgICAgIGlmIChhdmFpbGFiaWxpdHkudG9wX3JpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICByNCA9IFBfRTsKKyAgICAgICAgICAgIHI1ID0gUF9GOworICAgICAgICAgICAgcjYgPSBQX0c7CisgICAgICAgICAgICByNyA9IFBfSDsKKworICAgICAgICAgICAgcjIgKz0gKHIzIDw8IDEpOworICAgICAgICAgICAgcjIgKz0gcjQ7CisgICAgICAgICAgICByMiArPSAyOworICAgICAgICAgICAgcjIgPj49IDI7CisgICAgICAgICAgICByMyArPSAocjQgPDwgMSk7CisgICAgICAgICAgICByMyArPSByNTsKKyAgICAgICAgICAgIHIzICs9IDI7CisgICAgICAgICAgICByMyA+Pj0gMjsKKyAgICAgICAgICAgIHI0ICs9IChyNSA8PCAxKTsKKyAgICAgICAgICAgIHI0ICs9IHI2OworICAgICAgICAgICAgcjQgKz0gMjsKKyAgICAgICAgICAgIHI0ID4+PSAyOworICAgICAgICAgICAgcjUgKz0gKHI2IDw8IDEpOworICAgICAgICAgICAgcjUgKz0gcjc7CisgICAgICAgICAgICByNSArPSAyOworICAgICAgICAgICAgcjUgPj49IDI7CisgICAgICAgICAgICByNiArPSAoMyAqIHI3KTsKKyAgICAgICAgICAgIHI2ICs9IDI7CisgICAgICAgICAgICByNiA+Pj0gMjsKKyAgICAgICAgICAgIHRlbXAgPSByMCB8IChyMSA8PCA4KTsKKyAgICAgICAgICAgIHRlbXAgfD0gKHIyIDw8IDE2KTsKKyAgICAgICAgICAgIHRlbXAgfD0gKHIzIDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOworCisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPj4gOCkgfCAocjQgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPj4gOCkgfCAocjUgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPj4gOCkgfCAocjYgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcjIgKz0gKHIzICogMyk7CisgICAgICAgICAgICByMiArPSAyOworICAgICAgICAgICAgcjIgPj49IDI7CisgICAgICAgICAgICByMyA9ICgocjMgPDwgMikgKyAyKTsKKyAgICAgICAgICAgIHIzID4+PSAyOworCisgICAgICAgICAgICB0ZW1wID0gcjAgfCAocjEgPDwgOCk7CisgICAgICAgICAgICB0ZW1wIHw9IChyMiA8PCAxNik7CisgICAgICAgICAgICB0ZW1wIHw9IChyMyA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKKworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wID4+IDgpIHwgKHIzIDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wID4+IDgpIHwgKHIzIDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wID4+IDgpIHwgKHIzIDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICB9CisgICAgfQorCisgICAgLyogRG93biBSaWdodCAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X0RpYWdvbmFsX0Rvd25fUmlnaHRdID0gMDsKKyAgICAvKiBEaWFnb25hbCBWZXJ0aWNhbCBSaWdodCAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X1ZlcnRpY2FsX1JpZ2h0XSA9IDA7CisgICAgLyogSG9yaXpvbnRhbCBEb3duICovCisgICAgbW9kZV9hdmFpbFtBVkNfSTRfSG9yaXpvbnRhbF9Eb3duXSA9IDA7CisKKyAgICBpZiAodG9wX2xlZnQgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIC8qIERvd24gUmlnaHQgKi8KKyAgICAgICAgbW9kZV9hdmFpbFtBVkNfSTRfRGlhZ29uYWxfRG93bl9SaWdodF0gPSAxOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9EaWFnb25hbF9Eb3duX1JpZ2h0XTsKKworICAgICAgICBRX3ggPSAoUF9BICsgMiAqIFBfQiArIFBfQyArIDIpID4+IDI7CisgICAgICAgIFJfeCA9IChQX0IgKyAyICogUF9DICsgUF9EICsgMikgPj4gMjsKKyAgICAgICAgUF94ID0gKFBfWCArIDIgKiBQX0EgKyBQX0IgKyAyKSA+PiAyOworICAgICAgICBEICAgPSAoUF9BICsgMiAqIFBfWCArIFBfSSArIDIpID4+IDI7CisgICAgICAgIFBfeSA9IChQX1ggKyAyICogUF9JICsgUF9KICsgMikgPj4gMjsKKyAgICAgICAgUV95ID0gKFBfSSArIDIgKiBQX0ogKyBQX0sgKyAyKSA+PiAyOworICAgICAgICBSX3kgPSAoUF9KICsgMiAqIFBfSyArIFBfTCArIDIpID4+IDI7CisKKyAgICAgICAgLyogd2UgY2FuIHBhY2sgdGhlc2UgKi8KKyAgICAgICAgdGVtcCA9ICBEIHwgKFBfeCA8PCA4KTsgICAvL1tEICAgUF94IFFfeCBSX3hdCisgICAgICAgIC8vW1BfeSBEICAgUF94IFFfeF0KKyAgICAgICAgdGVtcCB8PSAoUV94IDw8IDE2KTsgLy9bUV95IFBfeSBEICAgUF94XQorICAgICAgICB0ZW1wIHw9IChSX3ggPDwgMjQpOyAgLy9bUl95IFFfeSBQX3kgRCAgXQorICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gIFBfeSB8IChEIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChQX3ggPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChRX3ggPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9ICBRX3kgfCAoUF95IDw8IDgpOworICAgICAgICB0ZW1wIHw9IChEIDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoUF94IDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIHRlbXAgPSBSX3kgfCAoUV95IDw8IDgpOworICAgICAgICB0ZW1wIHw9IChQX3kgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChEIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisKKyAgICAgICAgLyogRGlhZ29uYWwgVmVydGljYWwgUmlnaHQgKi8KKyAgICAgICAgbW9kZV9hdmFpbFtBVkNfSTRfVmVydGljYWxfUmlnaHRdID0gMTsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtBVkNfSTRfVmVydGljYWxfUmlnaHRdOworCisgICAgICAgIFEwID0gUF9BICsgUF9CICsgMTsKKyAgICAgICAgUjAgPSBQX0IgKyBQX0MgKyAxOworICAgICAgICBTMCA9IFBfQyArIFBfRCArIDE7CisgICAgICAgIFAwID0gUF9YICsgUF9BICsgMTsKKyAgICAgICAgRCA9IChQX0kgKyAyICogUF9YICsgUF9BICsgMikgPj4gMjsKKworICAgICAgICBQMSA9IChQMCArIFEwKSA+PiAyOworICAgICAgICBRMSA9IChRMCArIFIwKSA+PiAyOworICAgICAgICBSMSA9IChSMCArIFMwKSA+PiAyOworCisgICAgICAgIFAwID4+PSAxOworICAgICAgICBRMCA+Pj0gMTsKKyAgICAgICAgUjAgPj49IDE7CisgICAgICAgIFMwID4+PSAxOworCisgICAgICAgIFAyID0gKFBfWCArIDIgKiBQX0kgKyBQX0ogKyAyKSA+PiAyOworICAgICAgICBRMiA9IChQX0kgKyAyICogUF9KICsgUF9LICsgMikgPj4gMjsKKworICAgICAgICB0ZW1wID0gIFAwIHwgKFEwIDw8IDgpOyAgLy9bUDAgUTAgUjAgUzBdCisgICAgICAgIC8vW0QgIFAxIFExIFIxXQorICAgICAgICB0ZW1wIHw9IChSMCA8PCAxNik7IC8vW1AyIFAwIFEwIFIwXQorICAgICAgICB0ZW1wIHw9IChTMCA8PCAyNCk7IC8vW1EyIEQgIFAxIFExXQorICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gIHRlbXA7CisKKyAgICAgICAgdGVtcCA9ICBEIHwgKFAxIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChRMSA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKFIxIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSAgdGVtcDsKKworICAgICAgICB0ZW1wID0gUDIgfCAoUDAgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKFEwIDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoUjAgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9ICB0ZW1wOworCisgICAgICAgIHRlbXAgPSBRMiB8IChEIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChQMSA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKFExIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSAgdGVtcDsKKworCisgICAgICAgIC8qIEhvcml6b250YWwgRG93biAqLworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9Ib3Jpem9udGFsX0Rvd25dID0gMTsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtBVkNfSTRfSG9yaXpvbnRhbF9Eb3duXTsKKworCisgICAgICAgIFEyID0gKFBfQSArIDIgKiBQX0IgKyBQX0MgKyAyKSA+PiAyOworICAgICAgICBQMiA9IChQX1ggKyAyICogUF9BICsgUF9CICsgMikgPj4gMjsKKyAgICAgICAgRCA9IChQX0kgKyAyICogUF9YICsgUF9BICsgMikgPj4gMjsKKyAgICAgICAgUDAgPSBQX1ggKyBQX0kgKyAxOworICAgICAgICBRMCA9IFBfSSArIFBfSiArIDE7CisgICAgICAgIFIwID0gUF9KICsgUF9LICsgMTsKKyAgICAgICAgUzAgPSBQX0sgKyBQX0wgKyAxOworCisgICAgICAgIFAxID0gKFAwICsgUTApID4+IDI7CisgICAgICAgIFExID0gKFEwICsgUjApID4+IDI7CisgICAgICAgIFIxID0gKFIwICsgUzApID4+IDI7CisKKyAgICAgICAgUDAgPj49IDE7CisgICAgICAgIFEwID4+PSAxOworICAgICAgICBSMCA+Pj0gMTsKKyAgICAgICAgUzAgPj49IDE7CisKKworICAgICAgICAvKiB3ZSBjYW4gcGFjayB0aGVzZSAqLworICAgICAgICB0ZW1wID0gUDAgfCAoRCA8PCA4KTsgICAvL1tQMCBEICBQMiBRMl0KKyAgICAgICAgLy9bUTAgUDEgUDAgRCBdCisgICAgICAgIHRlbXAgfD0gKFAyIDw8IDE2KTsgIC8vW1IwIFExIFEwIFAxXQorICAgICAgICB0ZW1wIHw9IChRMiA8PCAyNCk7IC8vW1MwIFIxIFIwIFExXQorICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gUTAgfCAoUDEgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKFAwIDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoRCA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gUjAgfCAoUTEgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKFEwIDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoUDEgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IFMwIHwgKFIxIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChSMCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKFExIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgfQorCisgICAgLyogdmVydGljYWwgbGVmdCAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X1ZlcnRpY2FsX0xlZnRdID0gMDsKKyAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcCkKKyAgICB7CisgICAgICAgIG1vZGVfYXZhaWxbQVZDX0k0X1ZlcnRpY2FsX0xlZnRdID0gMTsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtBVkNfSTRfVmVydGljYWxfTGVmdF07CisKKyAgICAgICAgeDAgPSBQX0EgKyBQX0IgKyAxOworICAgICAgICB4MSA9IFBfQiArIFBfQyArIDE7CisgICAgICAgIHgyID0gUF9DICsgUF9EICsgMTsKKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eS50b3BfcmlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHgzID0gUF9EICsgUF9FICsgMTsKKyAgICAgICAgICAgIHg0ID0gUF9FICsgUF9GICsgMTsKKyAgICAgICAgICAgIHg1ID0gUF9GICsgUF9HICsgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHgzID0geDQgPSB4NSA9IChQX0QgPDwgMSkgKyAxOworICAgICAgICB9CisKKyAgICAgICAgdGVtcDEgPSAoeDAgPj4gMSk7CisgICAgICAgIHRlbXAxIHw9ICgoeDEgPj4gMSkgPDwgOCk7CisgICAgICAgIHRlbXAxIHw9ICgoeDIgPj4gMSkgPDwgMTYpOworICAgICAgICB0ZW1wMSB8PSAoKHgzID4+IDEpIDw8IDI0KTsKKworICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDE7CisKKyAgICAgICAgdGVtcDIgPSAoKHgwICsgeDEpID4+IDIpOworICAgICAgICB0ZW1wMiB8PSAoKCh4MSArIHgyKSA+PiAyKSA8PCA4KTsKKyAgICAgICAgdGVtcDIgfD0gKCgoeDIgKyB4MykgPj4gMikgPDwgMTYpOworICAgICAgICB0ZW1wMiB8PSAoKCh4MyArIHg0KSA+PiAyKSA8PCAyNCk7CisKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wMjsKKworICAgICAgICB0ZW1wMSA9ICh0ZW1wMSA+PiA4KSB8ICgoeDQgPj4gMSkgPDwgMjQpOyAgIC8qIHJvdGF0ZSBvdXQgb2xkIHZhbHVlICovCisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDE7CisKKyAgICAgICAgdGVtcDIgPSAodGVtcDIgPj4gOCkgfCAoKCh4NCArIHg1KSA+PiAyKSA8PCAyNCk7IC8qIHJvdGF0ZSBvdXQgb2xkIHZhbHVlICovCisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDI7CisgICAgfQorCisgICAgLy89PT09PSBMT09QIE9WRVIgQUxMIDR4NCBJTlRSQSBQUkVESUNUSU9OIE1PREVTID09PT09CisgICAgLy8gY2FuIHJlLW9yZGVyIHRoZSBzZWFyY2ggaGVyZSBpbnN0ZWFkIG9mIGdvaW5nIGluIG9yZGVyCisKKyAgICAvLyBmaW5kIG1vc3QgcHJvYmFibGUgbW9kZQorICAgIGVuY3ZpZC0+bW9zdFByb2JhYmxlSTRNb2RlW2Jsa2lkeF0gPSBtb3N0UHJvYmFibGVNb2RlID0gRmluZE1vc3RQcm9iYWJsZUk0TW9kZSh2aWRlbywgYmxraWR4KTsKKworICAgIG1pbl9jb3N0ID0gMHhGRkZGOworCisgICAgZm9yIChpcG1vZGUgPSAwOyBpcG1vZGUgPCBBVkNOdW1JNFByZWRNb2RlOyBpcG1vZGUrKykKKyAgICB7CisgICAgICAgIGlmIChtb2RlX2F2YWlsW2lwbW9kZV0gPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgY29zdCAgPSAoaXBtb2RlID09IG1vc3RQcm9iYWJsZU1vZGUpID8gMCA6IGZpeGVkY29zdDsKKyAgICAgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbaXBtb2RlXTsKKworICAgICAgICAgICAgY29zdF9pNChvcmcsIG9yZ19waXRjaCwgcHJlZCwgJmNvc3QpOworCisgICAgICAgICAgICBpZiAoY29zdCA8IG1pbl9jb3N0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlW2Jsa2lkeF0gPSAoQVZDSW50cmE0eDRQcmVkTW9kZSlpcG1vZGU7CisgICAgICAgICAgICAgICAgbWluX2Nvc3QgICA9IGNvc3Q7CisgICAgICAgICAgICAgICAgbWluX3NhZCA9IGNvc3QgLSAoKGlwbW9kZSA9PSBtb3N0UHJvYmFibGVNb2RlKSA/IDAgOiBmaXhlZGNvc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJsa2lkeCA9PSAwKQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5pNF9zYWQgPSBtaW5fc2FkOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlbmN2aWQtPmk0X3NhZCArPSBtaW5fc2FkOworICAgIH0KKworICAgIHJldHVybiBtaW5fY29zdDsKK30KKworaW50IEZpbmRNb3N0UHJvYmFibGVJNE1vZGUoQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IGJsa2lkeCkKK3sKKyAgICBpbnQgZGNPbmx5UHJlZGljdGlvbkZsYWc7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBpbnQgaW50cmE0eDRQcmVkTW9kZUEsIGludHJhNHg0UHJlZE1vZGVCLCBwcmVkSW50cmE0eDRQcmVkTW9kZTsKKworCisgICAgZGNPbmx5UHJlZGljdGlvbkZsYWcgPSAwOworICAgIGlmIChibGtpZHgmMHgzKQorICAgIHsKKyAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSBjdXJyTUItPmk0TW9kZVtibGtpZHgtMV07IC8vIGJsb2NrIHRvIHRoZSBsZWZ0CisgICAgfQorICAgIGVsc2UgLyogZm9yIGJsayAwLCA0LCA4LCAxMiAqLworICAgIHsKKyAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckFdLm1iTW9kZSA9PSBBVkNfSTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5pNE1vZGVbYmxraWR4ICsgM107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkY09ubHlQcmVkaWN0aW9uRmxhZyA9IDE7CisgICAgICAgICAgICBnb3RvIFBSRURfUkVTVUxUX1JFQURZOyAgLy8gc2tpcCBiZWxvdworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJsa2lkeCA+PiAyKQorICAgIHsKKyAgICAgICAgaW50cmE0eDRQcmVkTW9kZUIgPSBjdXJyTUItPmk0TW9kZVtibGtpZHgtNF07IC8vIGJsb2NrIGFib3ZlCisgICAgfQorICAgIGVsc2UgLyogYmxvY2sgMCwgMSwgMiwgMyAqLworICAgIHsKKyAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdLm1iTW9kZSA9PSBBVkNfSTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUIgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXS5pNE1vZGVbYmxraWR4KzEyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQiA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjT25seVByZWRpY3Rpb25GbGFnID0gMTsKKyAgICAgICAgfQorICAgIH0KKworUFJFRF9SRVNVTFRfUkVBRFk6CisgICAgaWYgKGRjT25seVByZWRpY3Rpb25GbGFnKQorICAgIHsKKyAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSBpbnRyYTR4NFByZWRNb2RlQiA9IEFWQ19JNF9EQzsKKyAgICB9CisKKyAgICBwcmVkSW50cmE0eDRQcmVkTW9kZSA9IEFWQ19NSU4oaW50cmE0eDRQcmVkTW9kZUEsIGludHJhNHg0UHJlZE1vZGVCKTsKKworICAgIHJldHVybiBwcmVkSW50cmE0eDRQcmVkTW9kZTsKK30KKwordm9pZCBjb3N0X2k0KHVpbnQ4ICpvcmcsIGludCBvcmdfcGl0Y2gsIHVpbnQ4ICpwcmVkLCB1aW50MTYgKmNvc3QpCit7CisgICAgaW50IGs7CisgICAgaW50MTYgcmVzWzE2XSwgKnByZXM7CisgICAgaW50IG0wLCBtMSwgbTIsIG0zLCB0bXAxOworICAgIGludCBzYXRkID0gMDsKKworICAgIHByZXMgPSByZXM7CisgICAgLy8gaG9yaXpvbnRhbCB0cmFuc2Zvcm0KKyAgICBrID0gNDsKKyAgICB3aGlsZSAoayA+IDApCisgICAgeworICAgICAgICBtMCA9IG9yZ1swXSAtIHByZWRbMF07CisgICAgICAgIG0zID0gb3JnWzNdIC0gcHJlZFszXTsKKyAgICAgICAgbTAgKz0gbTM7CisgICAgICAgIG0zID0gbTAgLSAobTMgPDwgMSk7CisgICAgICAgIG0xID0gb3JnWzFdIC0gcHJlZFsxXTsKKyAgICAgICAgbTIgPSBvcmdbMl0gLSBwcmVkWzJdOworICAgICAgICBtMSArPSBtMjsKKyAgICAgICAgbTIgPSBtMSAtIChtMiA8PCAxKTsKKyAgICAgICAgcHJlc1swXSA9IG0wICsgbTE7CisgICAgICAgIHByZXNbMl0gPSBtMCAtIG0xOworICAgICAgICBwcmVzWzFdID0gbTIgKyBtMzsKKyAgICAgICAgcHJlc1szXSA9IG0zIC0gbTI7CisKKyAgICAgICAgb3JnICs9IG9yZ19waXRjaDsKKyAgICAgICAgcHJlcyArPSA0OworICAgICAgICBwcmVkICs9IDQ7CisgICAgICAgIGstLTsKKyAgICB9CisgICAgLyogdmVydGljYWwgdHJhbnNmb3JtICovCisgICAgcHJlcyA9IHJlczsKKyAgICBrID0gNDsKKyAgICB3aGlsZSAoayA+IDApCisgICAgeworICAgICAgICBtMCA9IHByZXNbMF07CisgICAgICAgIG0zID0gcHJlc1sxMl07CisgICAgICAgIG0wICs9IG0zOworICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICBtMSA9IHByZXNbNF07CisgICAgICAgIG0yID0gcHJlc1s4XTsKKyAgICAgICAgbTEgKz0gbTI7CisgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgIHByZXNbMF0gPSBtMCArIG0xOworICAgICAgICBwcmVzWzhdID0gbTAgLSBtMTsKKyAgICAgICAgcHJlc1s0XSA9IG0yICsgbTM7CisgICAgICAgIHByZXNbMTJdID0gbTMgLSBtMjsKKworICAgICAgICBwcmVzKys7CisgICAgICAgIGstLTsKKworICAgIH0KKworICAgIHByZXMgPSByZXM7CisgICAgayA9IDQ7CisgICAgd2hpbGUgKGsgPiAwKQorICAgIHsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIHNhdGQgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIHNhdGQgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIHNhdGQgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIHNhdGQgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgay0tOworICAgIH0KKworICAgIHNhdGQgPSAoc2F0ZCArIDEpID4+IDE7CisgICAgKmNvc3QgKz0gc2F0ZDsKKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgY2hyb21hX2ludHJhX3NlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSB2aWRlby0+Y3VyclBpYzsKKworICAgIGludCB4X3BvcyA9IHZpZGVvLT5tYl94IDw8IDM7CisgICAgaW50IHlfcG9zID0gdmlkZW8tPm1iX3kgPDwgMzsKKyAgICBpbnQgcGl0Y2ggPSBjdXJyUGljLT5waXRjaCA+PiAxOworICAgIGludCBvZmZzZXQgPSB5X3BvcyAqIHBpdGNoICsgeF9wb3M7CisKKyAgICB1aW50OCAqY29tcF9yZWZfeCwgKmNvbXBfcmVmX3ksICpwcmVkOworICAgIGludCAgc3VtX3gwLCBzdW1feDEsIHN1bV95MCwgc3VtX3kxOworICAgIGludCBwcmVkXzBbMl0sIHByZWRfMVsyXSwgcHJlZF8yWzJdLCBwcmVkXzNbMl07CisgICAgdWludDMyIHByZWRfYSwgcHJlZF9iLCBwcmVkX2MsIHByZWRfZDsKKyAgICBpbnQgaSwgaiwgY29tcG9uZW50OworICAgIGludCBhXzE2LCBiLCBjLCBmYWN0b3JfYywgdG9wbGVmdDsKKyAgICBpbnQgSCwgViwgdmFsdWU7CisgICAgdWludDggKmNvbXBfcmVmX3gwLCAqY29tcF9yZWZfeDEsICAqY29tcF9yZWZfeTAsICpjb21wX3JlZl95MTsKKworICAgIHVpbnQ4ICpjdXJDYiA9IGN1cnJQaWMtPlNjYiArIG9mZnNldDsKKyAgICB1aW50OCAqY3VyQ3IgPSBjdXJyUGljLT5TY3IgKyBvZmZzZXQ7CisKKyAgICB1aW50OCAqb3JnQ2IsICpvcmdDcjsKKyAgICBBVkNGcmFtZUlPICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIGludCBvcmdfcGl0Y2g7CisgICAgaW50IGNvc3QsIG1pbmNvc3Q7CisKKyAgICAvKiBldmFsdWF0ZSBEQyBtb2RlICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQiAmIHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDYiAtIHBpdGNoOworICAgICAgICBjb21wX3JlZl95ID0gY3VyQ2IgLSAxOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWRfYSA9ICooKHVpbnQzMiopY29tcF9yZWZfeCk7CisgICAgICAgICAgICBjb21wX3JlZl94ICs9IDQ7CisgICAgICAgICAgICBwcmVkX2IgPSAocHJlZF9hID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICBwcmVkX2EgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICBwcmVkX2EgKz0gcHJlZF9iOworICAgICAgICAgICAgcHJlZF9hICs9IChwcmVkX2EgPj4gMTYpOworICAgICAgICAgICAgc3VtX3gwID0gcHJlZF9hICYgMHhGRkZGOworCisgICAgICAgICAgICBwcmVkX2EgPSAqKCh1aW50MzIqKWNvbXBfcmVmX3gpOworICAgICAgICAgICAgcHJlZF9iID0gKHByZWRfYSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICY9IDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICs9IHByZWRfYjsKKyAgICAgICAgICAgIHByZWRfYSArPSAocHJlZF9hID4+IDE2KTsKKyAgICAgICAgICAgIHN1bV94MSA9IHByZWRfYSAmIDB4RkZGRjsKKworICAgICAgICAgICAgcHJlZF8xW2ldID0gKHN1bV94MSArIDIpID4+IDI7CisKKyAgICAgICAgICAgIHN1bV95MCA9ICpjb21wX3JlZl95OworICAgICAgICAgICAgc3VtX3kwICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTAgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MCArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworCisgICAgICAgICAgICBzdW1feTEgPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kxICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTEgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MSArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworCisgICAgICAgICAgICBwcmVkXzJbaV0gPSAoc3VtX3kxICsgMikgPj4gMjsKKworICAgICAgICAgICAgcHJlZF8wW2ldID0gKHN1bV95MCArIHN1bV94MCArIDQpID4+IDM7CisgICAgICAgICAgICBwcmVkXzNbaV0gPSAoc3VtX3kxICsgc3VtX3gxICsgNCkgPj4gMzsKKworICAgICAgICAgICAgY29tcF9yZWZfeCA9IGN1ckNyIC0gcGl0Y2g7CisgICAgICAgICAgICBjb21wX3JlZl95ID0gY3VyQ3IgLSAxOworICAgICAgICB9CisgICAgfQorCisgICAgZWxzZSBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgIHsKKyAgICAgICAgY29tcF9yZWZfeSA9IGN1ckNiIC0gMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc3VtX3kwID0gKmNvbXBfcmVmX3k7CisgICAgICAgICAgICBzdW1feTAgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MCArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kwICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisKKyAgICAgICAgICAgIHN1bV95MSA9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTEgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MSArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kxICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisKKyAgICAgICAgICAgIHByZWRfMFtpXSA9IHByZWRfMVtpXSA9IChzdW1feTAgKyAyKSA+PiAyOworICAgICAgICAgICAgcHJlZF8yW2ldID0gcHJlZF8zW2ldID0gKHN1bV95MSArIDIpID4+IDI7CisKKyAgICAgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDciAtIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgY29tcF9yZWZfeCA9IGN1ckNiIC0gcGl0Y2g7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWRfYSA9ICooKHVpbnQzMiopY29tcF9yZWZfeCk7CisgICAgICAgICAgICBjb21wX3JlZl94ICs9IDQ7CisgICAgICAgICAgICBwcmVkX2IgPSAocHJlZF9hID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICBwcmVkX2EgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICBwcmVkX2EgKz0gcHJlZF9iOworICAgICAgICAgICAgcHJlZF9hICs9IChwcmVkX2EgPj4gMTYpOworICAgICAgICAgICAgc3VtX3gwID0gcHJlZF9hICYgMHhGRkZGOworCisgICAgICAgICAgICBwcmVkX2EgPSAqKCh1aW50MzIqKWNvbXBfcmVmX3gpOworICAgICAgICAgICAgcHJlZF9iID0gKHByZWRfYSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICY9IDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICs9IHByZWRfYjsKKyAgICAgICAgICAgIHByZWRfYSArPSAocHJlZF9hID4+IDE2KTsKKyAgICAgICAgICAgIHN1bV94MSA9IHByZWRfYSAmIDB4RkZGRjsKKworICAgICAgICAgICAgcHJlZF8wW2ldID0gcHJlZF8yW2ldID0gKHN1bV94MCArIDIpID4+IDI7CisgICAgICAgICAgICBwcmVkXzFbaV0gPSBwcmVkXzNbaV0gPSAoc3VtX3gxICsgMikgPj4gMjsKKworICAgICAgICAgICAgY29tcF9yZWZfeCA9IGN1ckNyIC0gcGl0Y2g7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJlZF8wWzBdID0gcHJlZF8wWzFdID0gcHJlZF8xWzBdID0gcHJlZF8xWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfMlswXSA9IHByZWRfMlsxXSA9IHByZWRfM1swXSA9IHByZWRfM1sxXSA9IDEyODsKKyAgICB9CisKKyAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2ljW0FWQ19JQ19EQ107CisKKyAgICBwcmVkX2EgPSBwcmVkXzBbMF07CisgICAgcHJlZF9iID0gcHJlZF8xWzBdOworICAgIHByZWRfYSB8PSAocHJlZF9hIDw8IDgpOworICAgIHByZWRfYSB8PSAocHJlZF9hIDw8IDE2KTsKKyAgICBwcmVkX2IgfD0gKHByZWRfYiA8PCA4KTsKKyAgICBwcmVkX2IgfD0gKHByZWRfYiA8PCAxNik7CisKKyAgICBwcmVkX2MgPSBwcmVkXzBbMV07CisgICAgcHJlZF9kID0gcHJlZF8xWzFdOworICAgIHByZWRfYyB8PSAocHJlZF9jIDw8IDgpOworICAgIHByZWRfYyB8PSAocHJlZF9jIDw8IDE2KTsKKyAgICBwcmVkX2QgfD0gKHByZWRfZCA8PCA4KTsKKyAgICBwcmVkX2QgfD0gKHByZWRfZCA8PCAxNik7CisKKworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIC8qIDQgbGluZXMgKi8KKyAgICB7CisgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSBwcmVkX2E7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSBwcmVkX2I7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA4KSkgPSBwcmVkX2M7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyAxMikpID0gcHJlZF9kOworICAgICAgICBwcmVkICs9IDE2OyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICB9CisKKyAgICBwcmVkX2EgPSBwcmVkXzJbMF07CisgICAgcHJlZF9iID0gcHJlZF8zWzBdOworICAgIHByZWRfYSB8PSAocHJlZF9hIDw8IDgpOworICAgIHByZWRfYSB8PSAocHJlZF9hIDw8IDE2KTsKKyAgICBwcmVkX2IgfD0gKHByZWRfYiA8PCA4KTsKKyAgICBwcmVkX2IgfD0gKHByZWRfYiA8PCAxNik7CisKKyAgICBwcmVkX2MgPSBwcmVkXzJbMV07CisgICAgcHJlZF9kID0gcHJlZF8zWzFdOworICAgIHByZWRfYyB8PSAocHJlZF9jIDw8IDgpOworICAgIHByZWRfYyB8PSAocHJlZF9jIDw8IDE2KTsKKyAgICBwcmVkX2QgfD0gKHByZWRfZCA8PCA4KTsKKyAgICBwcmVkX2QgfD0gKHByZWRfZCA8PCAxNik7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSAvKiA0IGxpbmVzICovCisgICAgeworICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gcHJlZF9hOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gcHJlZF9iOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgOCkpID0gcHJlZF9jOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHByZWRfZDsKKyAgICAgICAgcHJlZCArPSAxNjsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgfQorCisgICAgLyogcHJlZGljdCBob3Jpem9udGFsIG1vZGUgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgIHsKKyAgICAgICAgY29tcF9yZWZfeSA9IGN1ckNiIC0gMTsKKyAgICAgICAgY29tcF9yZWZfeCA9IGN1ckNyIC0gMTsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfSG9yaXpvbnRhbF07CisKKyAgICAgICAgZm9yIChpID0gNDsgaSA8IDY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmVkX2EgPSAqY29tcF9yZWZfeTsKKyAgICAgICAgICAgICAgICBjb21wX3JlZl95ICs9IHBpdGNoOworICAgICAgICAgICAgICAgIHByZWRfYSB8PSAocHJlZF9hIDw8IDgpOworICAgICAgICAgICAgICAgIHByZWRfYSB8PSAocHJlZF9hIDw8IDE2KTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gcHJlZF9hOworICAgICAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSBwcmVkX2E7CisKKyAgICAgICAgICAgICAgICBwcmVkX2EgPSAqY29tcF9yZWZfeDsKKyAgICAgICAgICAgICAgICBjb21wX3JlZl94ICs9IHBpdGNoOworICAgICAgICAgICAgICAgIHByZWRfYSB8PSAocHJlZF9hIDw8IDgpOworICAgICAgICAgICAgICAgIHByZWRfYSB8PSAocHJlZF9hIDw8IDE2KTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgOCkpID0gcHJlZF9hOworICAgICAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyAxMikpID0gcHJlZF9hOworCisgICAgICAgICAgICAgICAgcHJlZCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHZlcnRpY2FsIG1vZGUgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgY29tcF9yZWZfeCA9IGN1ckNiIC0gcGl0Y2g7CisgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDciAtIHBpdGNoOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2ljW0FWQ19JQ19WZXJ0aWNhbF07CisKKyAgICAgICAgcHJlZF9hID0gKigodWludDMyKiljb21wX3JlZl94KTsKKyAgICAgICAgcHJlZF9iID0gKigodWludDMyKikoY29tcF9yZWZfeCArIDQpKTsKKyAgICAgICAgcHJlZF9jID0gKigodWludDMyKiljb21wX3JlZl95KTsKKyAgICAgICAgcHJlZF9kID0gKigodWludDMyKikoY29tcF9yZWZfeSArIDQpKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gcHJlZF9hOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHByZWRfYjsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA4KSkgPSBwcmVkX2M7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHByZWRfZDsKKyAgICAgICAgICAgIHByZWQgKz0gMTY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpCisgICAgeworICAgICAgICBjb21wX3JlZl94ID0gY3VyQ2IgLSBwaXRjaDsKKyAgICAgICAgY29tcF9yZWZfeSA9IGN1ckNiIC0gMTsKKyAgICAgICAgdG9wbGVmdCA9IGN1ckNiWy1waXRjaC0xXTsKKworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2ljW0FWQ19JQ19QbGFuZV07CisgICAgICAgIGZvciAoY29tcG9uZW50ID0gMDsgY29tcG9uZW50IDwgMjsgY29tcG9uZW50KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEggPSBWID0gMDsKKyAgICAgICAgICAgIGNvbXBfcmVmX3gwID0gY29tcF9yZWZfeCArIDQ7CisgICAgICAgICAgICBjb21wX3JlZl94MSA9IGNvbXBfcmVmX3ggKyAyOworICAgICAgICAgICAgY29tcF9yZWZfeTAgPSBjb21wX3JlZl95ICsgKHBpdGNoIDw8IDIpOworICAgICAgICAgICAgY29tcF9yZWZfeTEgPSBjb21wX3JlZl95ICsgKHBpdGNoIDw8IDEpOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBIICs9IGkgKiAoKmNvbXBfcmVmX3gwKysgLSAqY29tcF9yZWZfeDEtLSk7CisgICAgICAgICAgICAgICAgViArPSBpICogKCpjb21wX3JlZl95MCAtICpjb21wX3JlZl95MSk7CisgICAgICAgICAgICAgICAgY29tcF9yZWZfeTAgKz0gcGl0Y2g7CisgICAgICAgICAgICAgICAgY29tcF9yZWZfeTEgLT0gcGl0Y2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIICs9IGkgKiAoKmNvbXBfcmVmX3gwKysgLSB0b3BsZWZ0KTsKKyAgICAgICAgICAgIFYgKz0gaSAqICgqY29tcF9yZWZfeTAgLSAqY29tcF9yZWZfeTEpOworCisgICAgICAgICAgICBhXzE2ID0gKCgqKGNvbXBfcmVmX3ggKyA3KSArICooY29tcF9yZWZfeSArIDcgKiBwaXRjaCkpIDw8IDQpICsgMTY7CisgICAgICAgICAgICBiID0gKDE3ICogSCArIDE2KSA+PiA1OworICAgICAgICAgICAgYyA9ICgxNyAqIFYgKyAxNikgPj4gNTsKKworICAgICAgICAgICAgcHJlZF9hID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDQ7IGkgPCA2OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jID0gYV8xNiArIGMgKiAocHJlZF9hKysgLSAzKTsKKworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyAtPSAzICogYjsKKworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBwcmVkX2IgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iIHw9ICh2YWx1ZSA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iIHw9ICh2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiB8PSAodmFsdWUgPDwgMjQpOworICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gcHJlZF9iOworCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBwcmVkX2IgfD0gKHZhbHVlIDw8IDgpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBwcmVkX2IgfD0gKHZhbHVlIDw8IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iIHw9ICh2YWx1ZSA8PCAyNCk7CisgICAgICAgICAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSBwcmVkX2I7CisgICAgICAgICAgICAgICAgICAgIHByZWQgKz0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmVkIC09IDEyMDsgLyogcG9pbnQgdG8gY3IgKi8KKyAgICAgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDciAtIHBpdGNoOworICAgICAgICAgICAgY29tcF9yZWZfeSA9IGN1ckNyIC0gMTsKKyAgICAgICAgICAgIHRvcGxlZnQgPSBjdXJDclstcGl0Y2gtMV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBub3cgZXZhbHVhdGUgaXQgKi8KKworICAgIG9yZ19waXRjaCA9IChjdXJySW5wdXQtPnBpdGNoKSA+PiAxOworICAgIG9mZnNldCA9IHhfcG9zICsgeV9wb3MgKiBvcmdfcGl0Y2g7CisKKyAgICBvcmdDYiA9IGN1cnJJbnB1dC0+WUNiQ3JbMV0gKyBvZmZzZXQ7CisgICAgb3JnQ3IgPSBjdXJySW5wdXQtPllDYkNyWzJdICsgb2Zmc2V0OworCisgICAgbWluY29zdCA9IDB4N2ZmZmZmZmY7CisgICAgY29zdCA9IFNBVERDaHJvbWEob3JnQ2IsIG9yZ0NyLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfRENdLCBtaW5jb3N0KTsKKyAgICBpZiAoY29zdCA8IG1pbmNvc3QpCisgICAgeworICAgICAgICBtaW5jb3N0ID0gY29zdDsKKyAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0RDOworICAgIH0KKworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCisgICAgeworICAgICAgICBjb3N0ID0gU0FURENocm9tYShvcmdDYiwgb3JnQ3IsIG9yZ19waXRjaCwgZW5jdmlkLT5wcmVkX2ljW0FWQ19JQ19Ib3Jpem9udGFsXSwgbWluY29zdCk7CisgICAgICAgIGlmIChjb3N0IDwgbWluY29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgbWluY29zdCA9IGNvc3Q7CisgICAgICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfSG9yaXpvbnRhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgeworICAgICAgICBjb3N0ID0gU0FURENocm9tYShvcmdDYiwgb3JnQ3IsIG9yZ19waXRjaCwgZW5jdmlkLT5wcmVkX2ljW0FWQ19JQ19WZXJ0aWNhbF0sIG1pbmNvc3QpOworICAgICAgICBpZiAoY29zdCA8IG1pbmNvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pbmNvc3QgPSBjb3N0OworICAgICAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX1ZlcnRpY2FsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQorICAgIHsKKyAgICAgICAgY29zdCA9IFNBVERDaHJvbWEob3JnQ2IsIG9yZ0NyLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfUGxhbmVdLCBtaW5jb3N0KTsKKyAgICAgICAgaWYgKGNvc3QgPCBtaW5jb3N0KQorICAgICAgICB7CisgICAgICAgICAgICBtaW5jb3N0ID0gY29zdDsKKyAgICAgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19QbGFuZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcmV0dXJuIDsKK30KKworCitpbnQgU0FURENocm9tYSh1aW50OCAqb3JnQ2IsIHVpbnQ4ICpvcmdDciwgaW50IG9yZ19waXRjaCwgdWludDggKnByZWQsIGludCBtaW5fY29zdCkKK3sKKyAgICBpbnQgY29zdDsKKyAgICAvKiBmaXJzdCB0YWtlIGRpZmZlcmVuY2UgYmV0d2VlbiBvcmdDYiwgb3JnQ3IgYW5kIHByZWQgKi8KKyAgICBpbnQxNiByZXNbMTI4XSwgKnByZXM7IC8vIHJlc2lkdWUKKyAgICBpbnQgbTAsIG0xLCBtMiwgbTMsIHRtcDE7CisgICAgaW50IGosIGs7CisKKyAgICBwcmVzID0gcmVzOworICAgIG9yZ19waXRjaCAtPSA4OworICAgIC8vIGhvcml6b250YWwgdHJhbnNmb3JtCisgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICB7CisgICAgICAgIGsgPSAyOworICAgICAgICB3aGlsZSAoayA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG0wID0gb3JnQ2JbMF0gLSBwcmVkWzBdOworICAgICAgICAgICAgbTMgPSBvcmdDYlszXSAtIHByZWRbM107CisgICAgICAgICAgICBtMCArPSBtMzsKKyAgICAgICAgICAgIG0zID0gbTAgLSAobTMgPDwgMSk7CisgICAgICAgICAgICBtMSA9IG9yZ0NiWzFdIC0gcHJlZFsxXTsKKyAgICAgICAgICAgIG0yID0gb3JnQ2JbMl0gLSBwcmVkWzJdOworICAgICAgICAgICAgbTEgKz0gbTI7CisgICAgICAgICAgICBtMiA9IG0xIC0gKG0yIDw8IDEpOworICAgICAgICAgICAgcHJlc1swXSA9IG0wICsgbTE7CisgICAgICAgICAgICBwcmVzWzJdID0gbTAgLSBtMTsKKyAgICAgICAgICAgIHByZXNbMV0gPSBtMiArIG0zOworICAgICAgICAgICAgcHJlc1szXSA9IG0zIC0gbTI7CisKKyAgICAgICAgICAgIG9yZ0NiICs9IDQ7CisgICAgICAgICAgICBwcmVzICs9IDQ7CisgICAgICAgICAgICBwcmVkICs9IDQ7CisgICAgICAgICAgICBrLS07CisgICAgICAgIH0KKyAgICAgICAgb3JnQ2IgKz0gb3JnX3BpdGNoOworICAgICAgICBrID0gMjsKKyAgICAgICAgd2hpbGUgKGsgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBtMCA9IG9yZ0NyWzBdIC0gcHJlZFswXTsKKyAgICAgICAgICAgIG0zID0gb3JnQ3JbM10gLSBwcmVkWzNdOworICAgICAgICAgICAgbTAgKz0gbTM7CisgICAgICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICAgICAgbTEgPSBvcmdDclsxXSAtIHByZWRbMV07CisgICAgICAgICAgICBtMiA9IG9yZ0NyWzJdIC0gcHJlZFsyXTsKKyAgICAgICAgICAgIG0xICs9IG0yOworICAgICAgICAgICAgbTIgPSBtMSAtIChtMiA8PCAxKTsKKyAgICAgICAgICAgIHByZXNbMF0gPSBtMCArIG0xOworICAgICAgICAgICAgcHJlc1syXSA9IG0wIC0gbTE7CisgICAgICAgICAgICBwcmVzWzFdID0gbTIgKyBtMzsKKyAgICAgICAgICAgIHByZXNbM10gPSBtMyAtIG0yOworCisgICAgICAgICAgICBvcmdDciArPSA0OworICAgICAgICAgICAgcHJlcyArPSA0OworICAgICAgICAgICAgcHJlZCArPSA0OworICAgICAgICAgICAgay0tOworICAgICAgICB9CisgICAgICAgIG9yZ0NyICs9IG9yZ19waXRjaDsKKyAgICB9CisKKyAgICAvKiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgIHsKKyAgICAgICAgcHJlcyA9IHJlcyArIChqIDw8IDYpOworICAgICAgICBrID0gMTY7CisgICAgICAgIHdoaWxlIChrID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbTAgPSBwcmVzWzBdOworICAgICAgICAgICAgbTMgPSBwcmVzWzM8PDRdOworICAgICAgICAgICAgbTAgKz0gbTM7CisgICAgICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICAgICAgbTEgPSBwcmVzWzE8PDRdOworICAgICAgICAgICAgbTIgPSBwcmVzWzI8PDRdOworICAgICAgICAgICAgbTEgKz0gbTI7CisgICAgICAgICAgICBtMiA9IG0xIC0gKG0yIDw8IDEpOworICAgICAgICAgICAgcHJlc1swXSA9IG0wICsgbTE7CisgICAgICAgICAgICBwcmVzWzI8PDRdID0gbTAgLSBtMTsKKyAgICAgICAgICAgIHByZXNbMTw8NF0gPSBtMiArIG0zOworICAgICAgICAgICAgcHJlc1szPDw0XSA9IG0zIC0gbTI7CisKKyAgICAgICAgICAgIHByZXMrKzsKKyAgICAgICAgICAgIGstLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG5vdyBzdW0gb2YgYWJzb2x1dGUgdmFsdWUgKi8KKyAgICBwcmVzID0gcmVzOworICAgIGNvc3QgPSAwOworICAgIGsgPSAxMjg7CisgICAgd2hpbGUgKGsgPiAwKQorICAgIHsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIGNvc3QgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIGNvc3QgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIGNvc3QgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIGNvc3QgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIGNvc3QgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIGNvc3QgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIGNvc3QgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgdG1wMSA9ICpwcmVzKys7CisgICAgICAgIGNvc3QgKz0gKCh0bXAxID49IDApID8gdG1wMSA6IC10bXAxKTsKKyAgICAgICAgayAtPSA4OworICAgICAgICBpZiAoY29zdCA+IG1pbl9jb3N0KSAvKiBlYXJseSBkcm9wIG91dCAqLworICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29zdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb3N0OworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG9sZCBjb2RlLCB1bnVzZWQKKy8qIGZpbmQgdGhlIGJlc3QgaW50cmEgbW9kZSBiYXNlZCBvbiBvcmlnaW5hbCAodW5lbmNvZGVkKSBmcmFtZSAqLworLyogb3V0cHV0IGlzCisgICAgY3Vyck1CLT5tYl9pbnRyYSwgY3Vyck1CLT5tYk1vZGUsCisgICAgY3Vyck1CLT5pMTZNb2RlICAoaWYgY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikKKyAgICBjdXJyTUItPmk0TW9kZVsuLl0gKGlmIGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCkgKi8KKworI2lmZGVmIEZJWEVEX0lOVFJBUFJFRF9NT0RFCit2b2lkIE1CSW50cmFTZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgaW50IG1iTnVtKQoreworICAgICh2b2lkKShtYk51bSk7CisKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50IGluZHgsIGJsb2NrX3gsIGJsb2NrX3k7CisKKyAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+aW50cmFBdmFpbEQgPSAwOworCisgICAgaWYgKCF2aWRlby0+Y3VyclBpY1BhcmFtcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnKQorICAgIHsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPm1iQXZhaWxBOworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+bWJBdmFpbEI7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5tYkF2YWlsQzsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxEID0gdmlkZW8tPm1iQXZhaWxEOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxBKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5tYl9pbnRyYTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxCKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXS5tYl9pbnRyYSA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQykKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQ10ubWJfaW50cmE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsRCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxEID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyRF0ubWJfaW50cmE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdXJyTUItPm1iX2ludHJhID0gVFJVRTsKKyAgICBjdXJyTUItPm1iTW9kZSA9IEZJWEVEX0lOVFJBUFJFRF9NT0RFOworCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JMTYpCisgICAgeworICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBGSVhFRF9JMTZfTU9ERTsKKworICAgICAgICBpZiAoRklYRURfSTE2X01PREUgPT0gQVZDX0kxNl9WZXJ0aWNhbCAmJiAhdmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X0RDOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEZJWEVEX0kxNl9NT0RFID09IEFWQ19JMTZfSG9yaXpvbnRhbCAmJiAhdmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X0RDOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEZJWEVEX0kxNl9NT0RFID09IEFWQ19JMTZfUGxhbmUgJiYgISh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxCICYmIHZpZGVvLT5pbnRyYUF2YWlsRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfREM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvL2lmKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCkKKyAgICB7CisgICAgICAgIGZvciAoaW5keCA9IDA7IGluZHggPCAxNjsgaW5keCsrKQorICAgICAgICB7CisgICAgICAgICAgICBibG9ja194ID0gYmxrSWR4MmJsa1hbaW5keF07CisgICAgICAgICAgICBibG9ja195ID0gYmxrSWR4MmJsa1lbaW5keF07CisKKyAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEZJWEVEX0k0X01PREU7CisKKyAgICAgICAgICAgIGlmIChGSVhFRF9JNF9NT0RFID09IEFWQ19JNF9WZXJ0aWNhbCAmJiAhKGJsb2NrX3kgPiAwIHx8IHZpZGVvLT5pbnRyYUF2YWlsQikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfSG9yaXpvbnRhbCAmJiAhKGJsb2NrX3ggfHwgdmlkZW8tPmludHJhQXZhaWxBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChGSVhFRF9JNF9NT0RFID09IEFWQ19JNF9EaWFnb25hbF9Eb3duX0xlZnQgJiYKKyAgICAgICAgICAgICAgICAgICAgKGJsb2NrX3kgPT0gMCAmJiAhdmlkZW8tPmludHJhQXZhaWxCKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChGSVhFRF9JNF9NT0RFID09IEFWQ19JNF9EaWFnb25hbF9Eb3duX1JpZ2h0ICYmCisgICAgICAgICAgICAgICAgICAgICEoKGJsb2NrX3kgJiYgYmxvY2tfeCkKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoYmxvY2tfeSAmJiB2aWRlby0+aW50cmFBdmFpbEEpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKGJsb2NrX3ggJiYgdmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICAgICAgICAgICAgICAgIHx8ICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxEICYmIHZpZGVvLT5pbnRyYUF2YWlsQikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZJWEVEX0k0X01PREUgPT0gQVZDX0k0X1ZlcnRpY2FsX1JpZ2h0ICYmCisgICAgICAgICAgICAgICAgICAgICEoKGJsb2NrX3kgJiYgYmxvY2tfeCkKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoYmxvY2tfeSAmJiB2aWRlby0+aW50cmFBdmFpbEEpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKGJsb2NrX3ggJiYgdmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICAgICAgICAgICAgICAgIHx8ICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxEICYmIHZpZGVvLT5pbnRyYUF2YWlsQikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZJWEVEX0k0X01PREUgPT0gQVZDX0k0X0hvcml6b250YWxfRG93biAmJgorICAgICAgICAgICAgICAgICAgICAhKChibG9ja195ICYmIGJsb2NrX3gpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKGJsb2NrX3kgJiYgdmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICAgICAgICAgICAgICAgIHx8IChibG9ja194ICYmIHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgICAgICAgICAgICAgICB8fCAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsRCAmJiB2aWRlby0+aW50cmFBdmFpbEIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChGSVhFRF9JNF9NT0RFID09IEFWQ19JNF9WZXJ0aWNhbF9MZWZ0ICYmCisgICAgICAgICAgICAgICAgICAgIChibG9ja195ID09IDAgJiYgIXZpZGVvLT5pbnRyYUF2YWlsQikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfSG9yaXpvbnRhbF9VcCAmJiAhKGJsb2NrX3ggfHwgdmlkZW8tPmludHJhQXZhaWxBKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBGSVhFRF9JTlRSQV9DSFJPTUFfTU9ERTsKKworICAgIGlmIChGSVhFRF9JTlRSQV9DSFJPTUFfTU9ERSA9PSBBVkNfSUNfSG9yaXpvbnRhbCAmJiAhKHZpZGVvLT5pbnRyYUF2YWlsQSkpCisgICAgeworICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfREM7CisgICAgfQorCisgICAgaWYgKEZJWEVEX0lOVFJBX0NIUk9NQV9NT0RFID09IEFWQ19JQ19WZXJ0aWNhbCAmJiAhKHZpZGVvLT5pbnRyYUF2YWlsQikpCisgICAgeworICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfREM7CisgICAgfQorCisgICAgaWYgKEZJWEVEX0lOVFJBX0NIUk9NQV9NT0RFID09IEFWQ19JQ19QbGFuZSAmJiAhKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKSkKKyAgICB7CisgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19EQzsKKyAgICB9CisKKyAgICAvKiBhbHNvIHJlc2V0IHRoZSBtb3Rpb24gdmVjdG9ycyAqLworICAgIC8qIHNldCBNViBhbmQgUmVmX0lkeCBjb2RlcyBvZiBJbnRyYSBibG9ja3MgaW4gUC1zbGljZXMgKi8KKyAgICBtZW1zZXQoY3Vyck1CLT5tdkwwLCAwLCBzaXplb2YoaW50MzIpKjE2KTsKKyAgICBjdXJyTUItPnJlZl9pZHhfTDBbMF0gPSAtMTsKKyAgICBjdXJyTUItPnJlZl9pZHhfTDBbMV0gPSAtMTsKKyAgICBjdXJyTUItPnJlZl9pZHhfTDBbMl0gPSAtMTsKKyAgICBjdXJyTUItPnJlZl9pZHhfTDBbM10gPSAtMTsKKworICAgIC8vIG91dHB1dCBmcm9tIHRoaXMgZnVuY3Rpb24sIGN1cnJNQi0+bWJNb2RlIHNob3VsZCBiZSBzZXQgdG8gZWl0aGVyCisgICAgLy8gQVZDX0k0LCBBVkNfSTE2LCBvciBlbHNlIGluIEFWQ01CTW9kZSBlbnVtLCBtYlR5cGUsIG1iX2ludHJhLCBpbnRyYV9jaHJvbWFfcHJlZF9tb2RlICovCisgICAgcmV0dXJuIDsKK30KKyNlbHNlIC8vIGZhc3RlciBjb21iaW5lZCBwcmVkaWN0aW9uK1NBRCBjYWxjdWxhdGlvbgordm9pZCBNQkludHJhU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIGludCBtYk51bSkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDRnJhbWVJTyAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgdWludDggKmN1ckwsICpjdXJDYiwgKmN1ckNyOworICAgIHVpbnQ4ICpjb21wLCAqcHJlZF9ibG9jazsKKyAgICBpbnQgYmxvY2tfeCwgYmxvY2tfeSwgb2Zmc2V0OworICAgIHVpbnQgc2FkLCBzYWQ0LCBzYWRJNCwgc2FkSTE2OworICAgIGludCBjb21wb25lbnQsIFN1YkJsb2NrX2luZHgsIHRlbXA7CisgICAgaW50IHBpdGNoID0gdmlkZW8tPmN1cnJQaWMtPnBpdGNoOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBjb3N0IG9mIGVhY2ggaW50cmEgcHJlZGljdGlvbiBtb2RlICBhbmQgY29tcGFyZSB0byB0aGUKKyAgICBpbnRlciBtb2RlICovCisgICAgLyogZnVsbCBzZWFyY2ggZm9yIGFsbCBpbnRyYSBwcmVkaWN0aW9uICovCisgICAgb2Zmc2V0ID0gKHZpZGVvLT5tYl95IDw8IDQpICogcGl0Y2ggKyAodmlkZW8tPm1iX3ggPDwgNCk7CisgICAgY3VyTCA9IGN1cnJJbnB1dC0+WUNiQ3JbMF0gKyBvZmZzZXQ7CisgICAgcHJlZF9ibG9jayA9IHZpZGVvLT5wcmVkX2Jsb2NrICsgODQ7CisKKyAgICAvKiBBc3N1bWluZyB0aGF0IEluaXROZWlnaGJvckF2YWlsYWJpbGl0eSBoYXMgYmVlbiBjYWxsZWQgcHJpb3IgdG8gdGhpcyBmdW5jdGlvbiAqLworICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5pbnRyYUF2YWlsRCA9IDA7CisKKyAgICBpZiAoIXZpZGVvLT5jdXJyUGljUGFyYW1zLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcpCisgICAgeworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+bWJBdmFpbEE7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5tYkF2YWlsQjsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPm1iQXZhaWxDOworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEQgPSB2aWRlby0+bWJBdmFpbEQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckFdLm1iX2ludHJhOworICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdLm1iX2ludHJhIDsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxDKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJDXS5tYl9pbnRyYTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxEKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEQgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJEXS5tYl9pbnRyYTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGN1cnJlbnRseSB3ZSdyZSBkb2luZyBleGhhdXN0aXZlIHNlYXJjaC4gU21hcnQgc2VhcmNoIHdpbGwgYmUgdXNlZCBsYXRlciAqLworCisgICAgLyogSTE2IG1vZGVzICovCisgICAgY3VyTCA9IGN1cnJJbnB1dC0+WUNiQ3JbMF0gKyBvZmZzZXQ7CisgICAgdmlkZW8tPnBpbnRyYV9wcmVkX3RvcCA9IGN1ckwgLSBwaXRjaDsKKyAgICB2aWRlby0+cGludHJhX3ByZWRfbGVmdCA9IGN1ckwgLSAxOworICAgIGlmICh2aWRlby0+bWJfeSkKKyAgICB7CisgICAgICAgIHZpZGVvLT5pbnRyYV9wcmVkX3RvcGxlZnQgPSAqKGN1ckwgLSBwaXRjaCAtIDEpOworICAgIH0KKworICAgIC8qIEludHJhXzE2eDE2X1ZlcnRpY2FsICovCisgICAgc2FkSTE2ID0gNjU1MzY7CisgICAgLyogY2hlY2sgYXZhaWxhYmlsaXR5IG9mIHRvcCAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgeworICAgICAgICBzYWQgPSBTQURfSTE2X1ZlcnQodmlkZW8sIGN1ckwsIHNhZEkxNik7CisKKyAgICAgICAgaWYgKHNhZCA8IHNhZEkxNikKKyAgICAgICAgeworICAgICAgICAgICAgc2FkSTE2ID0gc2FkOworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9WZXJ0aWNhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsICovCisgICAgLyogY2hlY2sgYXZhaWxhYmlsaXR5IG9mIGxlZnQgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgIHsKKyAgICAgICAgc2FkID0gU0FEX0kxNl9Ib3J6REModmlkZW8sIGN1ckwsIEFWQ19JMTZfSG9yaXpvbnRhbCwgc2FkSTE2KTsKKworICAgICAgICBpZiAoc2FkIDwgc2FkSTE2KQorICAgICAgICB7CisgICAgICAgICAgICBzYWRJMTYgPSBzYWQ7CisgICAgICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X0hvcml6b250YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbnRyYV8xNngxNl9EQywgZGVmYXVsdCBtb2RlICovCisgICAgc2FkID0gU0FEX0kxNl9Ib3J6REModmlkZW8sIGN1ckwsIEFWQ19JMTZfREMsIHNhZEkxNik7CisgICAgaWYgKHNhZCA8IHNhZEkxNikKKyAgICB7CisgICAgICAgIHNhZEkxNiA9IHNhZDsKKyAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9EQzsKKyAgICB9CisKKyAgICAvKiBJbnRyYV8xNngxNl9QbGFuZSAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxCICYmIHZpZGVvLT5pbnRyYUF2YWlsRCkKKyAgICB7CisgICAgICAgIHNhZCA9IFNBRF9JMTZfUGxhbmUodmlkZW8sIGN1ckwsIHNhZEkxNik7CisKKyAgICAgICAgaWYgKHNhZCA8IHNhZEkxNikKKyAgICAgICAgeworICAgICAgICAgICAgc2FkSTE2ID0gc2FkOworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9QbGFuZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNhZEkxNiA+Pj0gMTsgIC8qIGJlZm9yZSBjb21wYXJpc29uICovCisKKyAgICAvKiBzZWxlY3Rpb24gYmV0d2VlbiBpbnRyYTQsIGludHJhMTYgb3IgaW50ZXIgbW9kZSAqLworICAgIGlmIChzYWRJMTYgPCBlbmN2aWQtPm1pbl9jb3N0KQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5tYl9pbnRyYSA9IFRSVUU7CisgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX0kxNjsKKyAgICAgICAgZW5jdmlkLT5taW5fY29zdCA9IHNhZEkxNjsKKyAgICB9CisKKyAgICBpZiAoY3Vyck1CLT5tYl9pbnRyYSkgLyogb25seSBkbyB0aGUgY2hyb21pbmFuY2Ugc2VhcmNoIHdoZW4gaW50cmEgaXMgZGVjaWRlZCAqLworICAgIHsKKyAgICAgICAgLyogTm90ZSB0aGF0IHdlIG1pZ2h0IGJlIGFibGUgdG8gZ3Vlc3MgdGhlIHR5cGUgb2YgcHJlZGljdGlvbiBmcm9tCisgICAgICAgIHRoZSBsdW1hIHByZWRpY3Rpb24gdHlwZSAqLworCisgICAgICAgIC8qIG5vdyBzZWFyY2ggZm9yIHRoZSBiZXN0IGNocm9tYSBpbnRyYSBwcmVkaWN0aW9uICovCisgICAgICAgIG9mZnNldCA9IChvZmZzZXQgPj4gMikgKyAodmlkZW8tPm1iX3ggPDwgMik7CisgICAgICAgIGN1ckNiID0gY3VycklucHV0LT5ZQ2JDclsxXSArIG9mZnNldDsKKyAgICAgICAgY3VyQ3IgPSBjdXJySW5wdXQtPllDYkNyWzJdICsgb2Zmc2V0OworCisgICAgICAgIHBpdGNoID4+PSAxOworICAgICAgICB2aWRlby0+cGludHJhX3ByZWRfdG9wX2NiID0gY3VyQ2IgLSBwaXRjaDsKKyAgICAgICAgdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnRfY2IgPSBjdXJDYiAtIDE7CisgICAgICAgIHZpZGVvLT5waW50cmFfcHJlZF90b3BfY3IgPSBjdXJDciAtIHBpdGNoOworICAgICAgICB2aWRlby0+cGludHJhX3ByZWRfbGVmdF9jciA9IGN1ckNyIC0gMTsKKworICAgICAgICBpZiAodmlkZW8tPm1iX3kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYV9wcmVkX3RvcGxlZnRfY2IgPSAqKGN1ckNiIC0gcGl0Y2ggLSAxKTsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYV9wcmVkX3RvcGxlZnRfY3IgPSAqKGN1ckNyIC0gcGl0Y2ggLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEludHJhX0Nocm9tYV9EQyAqLworICAgICAgICBzYWQ0ID0gU0FEX0Nocm9tYV9EQyh2aWRlbywgY3VyQ2IsIGN1ckNyLCA2NTUzNik7CisgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19EQzsKKworICAgICAgICAvKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLworICAgICAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGVjayBhdmFpbGFiaWxpdHkgb2YgbGVmdCAqLworICAgICAgICAgICAgc2FkID0gU0FEX0Nocm9tYV9Ib3J6KHZpZGVvLCBjdXJDYiwgY3VyQ3IsIHNhZDQpOworICAgICAgICAgICAgaWYgKHNhZCA8IHNhZDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2FkNCA9IHNhZDsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfSG9yaXpvbnRhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLworICAgICAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGVjayBhdmFpbGFiaWxpdHkgb2YgdG9wICovCisgICAgICAgICAgICBzYWQgPSBTQURfQ2hyb21hX1ZlcnQodmlkZW8sIGN1ckNiLCBjdXJDciwgc2FkNCk7CisKKyAgICAgICAgICAgIGlmIChzYWQgPCBzYWQ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNhZDQgPSBzYWQ7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX1ZlcnRpY2FsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSW50cmFfQ2hyb21hX1BsYW5lICovCisgICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxCICYmIHZpZGVvLT5pbnRyYUF2YWlsRCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2hlY2sgYXZhaWxhYmlsaXR5IG9mIHRvcCBhbmQgbGVmdCAqLworICAgICAgICAgICAgSW50cmFfQ2hyb21hX1BsYW5lKHZpZGVvLCBwaXRjaCk7CisKKyAgICAgICAgICAgIHNhZCA9IFNBRENocm9tYShwcmVkX2Jsb2NrICsgNDUyLCBjdXJDYiwgY3VyQ3IsIHBpdGNoKTsKKworICAgICAgICAgICAgaWYgKHNhZCA8IHNhZDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2FkNCA9IHNhZDsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfUGxhbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBhbHNvIHJlc2V0IHRoZSBtb3Rpb24gdmVjdG9ycyAqLworICAgICAgICAvKiBzZXQgTVYgYW5kIFJlZl9JZHggY29kZXMgb2YgSW50cmEgYmxvY2tzIGluIFAtc2xpY2VzICovCisgICAgICAgIG1lbXNldChjdXJyTUItPm12TDAsIDAsIHNpemVvZihpbnQzMikqMTYpOworICAgICAgICBtZW1zZXQoY3Vyck1CLT5yZWZfaWR4X0wwLCAtMSwgc2l6ZW9mKGludDE2KSo0KTsKKworICAgIH0KKworICAgIC8vIG91dHB1dCBmcm9tIHRoaXMgZnVuY3Rpb24sIGN1cnJNQi0+bWJNb2RlIHNob3VsZCBiZSBzZXQgdG8gZWl0aGVyCisgICAgLy8gQVZDX0k0LCBBVkNfSTE2LCBvciBlbHNlIGluIEFWQ01CTW9kZSBlbnVtLCBtYlR5cGUsIG1iX2ludHJhLCBpbnRyYV9jaHJvbWFfcHJlZF9tb2RlICovCisKKyAgICByZXR1cm4gOworfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL21vdGlvbl9jb21wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2MmQ3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAKQEAgLTAsMCArMSwyMTU2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKyNpbmNsdWRlICJhdmNlbmNfaW50LmgiCisKKworI2RlZmluZSBDTElQX1JFU1VMVCh4KSAgICAgIGlmKCh1aW50KXggPiAweEZGKXsgXAorICAgICAgICAgICAgICAgICB4ID0gMHhGRiAmICh+KHg+PjMxKSk7fQorCisvKiAoYmxrd2lkdGggPDwgMikgKyAoZHkgPDwgMSkgKyBkeCAqLworc3RhdGljIHZvaWQgKCpjb25zdCBlQ2hyb21hTUNfU0lNRFs4XSkodWludDggKiwgaW50ICwgaW50ICwgaW50ICwgdWludDggKiwgaW50LCBpbnQgLCBpbnQpID0KK3sKKyAgICAmZUNocm9tYUZ1bGxNQ19TSU1ELAorICAgICZlQ2hyb21hSG9yaXpvbnRhbE1DX1NJTUQsCisgICAgJmVDaHJvbWFWZXJ0aWNhbE1DX1NJTUQsCisgICAgJmVDaHJvbWFEaWFnb25hbE1DX1NJTUQsCisgICAgJmVDaHJvbWFGdWxsTUNfU0lNRCwKKyAgICAmZUNocm9tYUhvcml6b250YWxNQzJfU0lNRCwKKyAgICAmZUNocm9tYVZlcnRpY2FsTUMyX1NJTUQsCisgICAgJmVDaHJvbWFEaWFnb25hbE1DMl9TSU1ECit9OworLyogUGVyZm9ybSBtb3Rpb24gcHJlZGljdGlvbiBhbmQgY29tcGVuc2F0aW9uIHdpdGggcmVzaWR1ZSBpZiBleGlzdC4gKi8KK3ZvaWQgQVZDTUJNb3Rpb25Db21wKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNDb21tb25PYmogKnZpZGVvKQoreworICAgICh2b2lkKShlbmN2aWQpOworCisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBBVkNQaWN0dXJlRGF0YSAqY3VyclBpYyA9IHZpZGVvLT5jdXJyUGljOworICAgIGludCBtYlBhcnRJZHgsIHN1Yk1iUGFydElkeDsKKyAgICBpbnQgcmVmX2lkeDsKKyAgICBpbnQgb2Zmc2V0X01iUGFydF9pbmR4ID0gMDsKKyAgICBpbnQxNiAqbXY7CisgICAgdWludDMyIHhfcG9zLCB5X3BvczsKKyAgICB1aW50OCAqY3VyTCwgKmN1ckNiLCAqY3VyQ3I7CisgICAgdWludDggKnJlZl9sLCAqcmVmX0NiLCAqcmVmX0NyOworICAgIHVpbnQ4ICpwcmVkQmxvY2ssICpwcmVkQ2IsICpwcmVkQ3I7CisgICAgaW50IGJsb2NrX3gsIGJsb2NrX3ksIG9mZnNldF94LCBvZmZzZXRfeSwgb2Zmc2V0UCwgb2Zmc2V0OworICAgIGludCB4X3Bvc2l0aW9uID0gKHZpZGVvLT5tYl94IDw8IDQpOworICAgIGludCB5X3Bvc2l0aW9uID0gKHZpZGVvLT5tYl95IDw8IDQpOworICAgIGludCBNYkhlaWdodCwgTWJXaWR0aCwgbWJQYXJ0SWR4X1gsIG1iUGFydElkeF9ZLCBvZmZzZXRfaW5keDsKKyAgICBpbnQgcGljV2lkdGggPSBjdXJyUGljLT53aWR0aDsKKyAgICBpbnQgcGljUGl0Y2ggPSBjdXJyUGljLT5waXRjaDsKKyAgICBpbnQgcGljSGVpZ2h0ID0gY3VyclBpYy0+aGVpZ2h0OworICAgIHVpbnQzMiB0bXBfd29yZDsKKworICAgIHRtcF93b3JkID0geV9wb3NpdGlvbiAqIHBpY1BpdGNoOworICAgIGN1ckwgPSBjdXJyUGljLT5TbCArIHRtcF93b3JkICsgeF9wb3NpdGlvbjsKKyAgICBvZmZzZXQgPSAodG1wX3dvcmQgPj4gMikgKyAoeF9wb3NpdGlvbiA+PiAxKTsKKyAgICBjdXJDYiA9IGN1cnJQaWMtPlNjYiArIG9mZnNldDsKKyAgICBjdXJDciA9IGN1cnJQaWMtPlNjciArIG9mZnNldDsKKworICAgIHByZWRCbG9jayA9IGN1ckw7CisgICAgcHJlZENiID0gY3VyQ2I7CisgICAgcHJlZENyID0gY3VyQ3I7CisKKyAgICBHZXRNb3Rpb25WZWN0b3JQcmVkaWN0b3IodmlkZW8sIDEpOworCisgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCBjdXJyTUItPk51bU1iUGFydDsgbWJQYXJ0SWR4KyspCisgICAgeworICAgICAgICBNYkhlaWdodCA9IGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0W21iUGFydElkeF07CisgICAgICAgIE1iV2lkdGggPSBjdXJyTUItPlN1Yk1iUGFydFdpZHRoW21iUGFydElkeF07CisgICAgICAgIG1iUGFydElkeF9YID0gKChtYlBhcnRJZHggKyBvZmZzZXRfTWJQYXJ0X2luZHgpICYgMSk7CisgICAgICAgIG1iUGFydElkeF9ZID0gKG1iUGFydElkeCArIG9mZnNldF9NYlBhcnRfaW5keCkgPj4gMTsKKyAgICAgICAgcmVmX2lkeCA9IGN1cnJNQi0+cmVmX2lkeF9MMFsobWJQYXJ0SWR4X1kgPDwgMSkgKyBtYlBhcnRJZHhfWF07CisgICAgICAgIG9mZnNldF9pbmR4ID0gMDsKKworICAgICAgICByZWZfbCA9IHZpZGVvLT5SZWZQaWNMaXN0MFtyZWZfaWR4XS0+U2w7CisgICAgICAgIHJlZl9DYiA9IHZpZGVvLT5SZWZQaWNMaXN0MFtyZWZfaWR4XS0+U2NiOworICAgICAgICByZWZfQ3IgPSB2aWRlby0+UmVmUGljTGlzdDBbcmVmX2lkeF0tPlNjcjsKKworICAgICAgICBmb3IgKHN1Yk1iUGFydElkeCA9IDA7IHN1Yk1iUGFydElkeCA8IGN1cnJNQi0+TnVtU3ViTWJQYXJ0W21iUGFydElkeF07IHN1Yk1iUGFydElkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBibG9ja194ID0gKG1iUGFydElkeF9YIDw8IDEpICsgKChzdWJNYlBhcnRJZHggKyBvZmZzZXRfaW5keCkgJiAxKTsKKyAgICAgICAgICAgIGJsb2NrX3kgPSAobWJQYXJ0SWR4X1kgPDwgMSkgKyAoKChzdWJNYlBhcnRJZHggKyBvZmZzZXRfaW5keCkgPj4gMSkgJiAxKTsKKyAgICAgICAgICAgIG12ID0gKGludDE2KikoY3Vyck1CLT5tdkwwICsgYmxvY2tfeCArIChibG9ja195IDw8IDIpKTsKKyAgICAgICAgICAgIG9mZnNldF94ID0geF9wb3NpdGlvbiArIChibG9ja194IDw8IDIpOworICAgICAgICAgICAgb2Zmc2V0X3kgPSB5X3Bvc2l0aW9uICsgKGJsb2NrX3kgPDwgMik7CisgICAgICAgICAgICB4X3BvcyA9IChvZmZzZXRfeCA8PCAyKSArICptdisrOyAgIC8qcXVhcnRlciBwZWwgKi8KKyAgICAgICAgICAgIHlfcG9zID0gKG9mZnNldF95IDw8IDIpICsgKm12OyAgIC8qcXVhcnRlciBwZWwgKi8KKworICAgICAgICAgICAgLy9vZmZzZXQgPSBvZmZzZXRfeSAqIGN1cnJQaWMtPndpZHRoOworICAgICAgICAgICAgLy9vZmZzZXRDID0gKG9mZnNldCA+PiAyKSArIChvZmZzZXRfeCA+PiAxKTsKKyAgICAgICAgICAgIG9mZnNldFAgPSAoYmxvY2tfeSA8PCAyKSAqIHBpY1BpdGNoICsgKGJsb2NrX3ggPDwgMik7CisgICAgICAgICAgICBlTHVtYU1vdGlvbkNvbXAocmVmX2wsIHBpY1BpdGNoLCBwaWNIZWlnaHQsIHhfcG9zLCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbXBfU2wgKyBvZmZzZXQgKyBvZmZzZXRfeCwqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRCbG9jayArIG9mZnNldFAsIHBpY1BpdGNoLCBNYldpZHRoLCBNYkhlaWdodCk7CisKKyAgICAgICAgICAgIG9mZnNldFAgPSAoYmxvY2tfeSAqIHBpY1dpZHRoKSArIChibG9ja194IDw8IDEpOworICAgICAgICAgICAgZUNocm9tYU1vdGlvbkNvbXAocmVmX0NiLCBwaWNXaWR0aCA+PiAxLCBwaWNIZWlnaHQgPj4gMSwgeF9wb3MsIHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb21wX1NjYiArICBvZmZzZXRDLCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkQ2IgKyBvZmZzZXRQLCBwaWNQaXRjaCA+PiAxLCBNYldpZHRoID4+IDEsIE1iSGVpZ2h0ID4+IDEpOworICAgICAgICAgICAgZUNocm9tYU1vdGlvbkNvbXAocmVmX0NyLCBwaWNXaWR0aCA+PiAxLCBwaWNIZWlnaHQgPj4gMSwgeF9wb3MsIHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb21wX1NjciArICBvZmZzZXRDLCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkQ3IgKyBvZmZzZXRQLCBwaWNQaXRjaCA+PiAxLCBNYldpZHRoID4+IDEsIE1iSGVpZ2h0ID4+IDEpOworCisgICAgICAgICAgICBvZmZzZXRfaW5keCA9IGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbbWJQYXJ0SWR4XSA+PiAzOworICAgICAgICB9CisgICAgICAgIG9mZnNldF9NYlBhcnRfaW5keCA9IGN1cnJNQi0+TWJQYXJ0V2lkdGggPj4gNDsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKy8qIHByZWZvcm0gdGhlIGFjdHVhbCAgbW90aW9uIGNvbXAgaGVyZSAqLwordm9pZCBlTHVtYU1vdGlvbkNvbXAodWludDggKnJlZiwgaW50IHBpY3BpdGNoLCBpbnQgcGljaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgaW50IHhfcG9zLCBpbnQgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcHJlZCwgaW50IHByZWRfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgKHZvaWQpKHBpY2hlaWdodCk7CisKKyAgICBpbnQgZHgsIGR5OworICAgIGludCB0ZW1wMlsyMV1bMjFdOyAvKiBmb3IgaW50ZXJtZWRpYXRlIHJlc3VsdHMgKi8KKyAgICB1aW50OCAqcmVmMjsKKworICAgIGR4ID0geF9wb3MgJiAzOworICAgIGR5ID0geV9wb3MgJiAzOworICAgIHhfcG9zID0geF9wb3MgPj4gMjsgIC8qIHJvdW5kIGl0IHRvIGZ1bGwtcGVsIHJlc29sdXRpb24gKi8KKyAgICB5X3BvcyA9IHlfcG9zID4+IDI7CisKKyAgICAvKiBwZXJmb3JtIGFjdHVhbCBtb3Rpb24gY29tcGVuc2F0aW9uICovCisgICAgaWYgKGR4ID09IDAgJiYgZHkgPT0gMCkKKyAgICB7ICAvKiBmdWxscGVsIHBvc2l0aW9uICovLyogRyAqLworCisgICAgICAgIHJlZiArPSB5X3BvcyAqIHBpY3BpdGNoICsgeF9wb3M7CisKKyAgICAgICAgZUZ1bGxQZWxNQyhyZWYsIHBpY3BpdGNoLCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0KTsKKworICAgIH0gICAvKiBvdGhlciBwb3NpdGlvbnMgKi8KKyAgICBlbHNlICBpZiAoZHkgPT0gMCkKKyAgICB7IC8qIG5vIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8vKiBhLGIsYyovCisKKyAgICAgICAgcmVmICs9IHlfcG9zICogcGljcGl0Y2ggKyB4X3BvczsKKworICAgICAgICBlSG9yekludGVycDFNQyhyZWYsIHBpY3BpdGNoLCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0LCBkeCk7CisgICAgfQorICAgIGVsc2UgaWYgKGR4ID09IDApCisgICAgeyAvKm5vIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLy8qIGQsaCxuICovCisKKyAgICAgICAgcmVmICs9IHlfcG9zICogcGljcGl0Y2ggKyB4X3BvczsKKworICAgICAgICBlVmVydEludGVycDFNQyhyZWYsIHBpY3BpdGNoLCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0LCBkeSk7CisgICAgfQorICAgIGVsc2UgaWYgKGR5ID09IDIpCisgICAgeyAgLyogaG9yaXpvbnRhbCBjcm9zcyAqLy8qIGksIGosIGsgKi8KKworICAgICAgICByZWYgKz0geV9wb3MgKiBwaWNwaXRjaCArIHhfcG9zIC0gMjsgLyogbW92ZSB0byB0aGUgbGVmdCAyIHBpeGVscyAqLworCisgICAgICAgIGVWZXJ0SW50ZXJwMk1DKHJlZiwgcGljcGl0Y2gsICZ0ZW1wMlswXVswXSwgMjEsIGJsa3dpZHRoICsgNSwgYmxraGVpZ2h0KTsKKworICAgICAgICBlSG9yekludGVycDJNQygmdGVtcDJbMF1bMl0sIDIxLCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0LCBkeCk7CisgICAgfQorICAgIGVsc2UgaWYgKGR4ID09IDIpCisgICAgeyAvKiB2ZXJ0aWNhbCBjcm9zcyAqLyAvKiBmLHEgKi8KKworICAgICAgICByZWYgKz0gKHlfcG9zIC0gMikgKiBwaWNwaXRjaCArIHhfcG9zOyAvKiBtb3ZlIHRvIHVwIDIgbGluZXMgKi8KKworICAgICAgICBlSG9yekludGVycDNNQyhyZWYsIHBpY3BpdGNoLCAmdGVtcDJbMF1bMF0sIDIxLCBibGt3aWR0aCwgYmxraGVpZ2h0ICsgNSk7CisgICAgICAgIGVWZXJ0SW50ZXJwM01DKCZ0ZW1wMlsyXVswXSwgMjEsIHByZWQsIHByZWRfcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQsIGR5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogZGlhZ29uYWwgKi8vKiBlLGcscCxyICovCisKKyAgICAgICAgcmVmMiA9IHJlZiArICh5X3BvcyArIChkeSAvIDIpKSAqIHBpY3BpdGNoICsgeF9wb3M7CisKKyAgICAgICAgcmVmICs9ICh5X3BvcyAqIHBpY3BpdGNoKSArIHhfcG9zICsgKGR4IC8gMik7CisKKyAgICAgICAgZURpYWdvbmFsSW50ZXJwTUMocmVmMiwgcmVmLCBwaWNwaXRjaCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBlQ3JlYXRlQWxpZ24odWludDggKnJlZiwgaW50IHBpY3BpdGNoLCBpbnQgeV9wb3MsCisgICAgICAgICAgICAgICAgICB1aW50OCAqb3V0LCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IG9mZnNldCwgb3V0X29mZnNldDsKKyAgICB1aW50MzIgcHJldl9waXgsIHJlc3VsdCwgcGl4MSwgcGl4MiwgcGl4NDsKKworICAgIHJlZiArPSB5X3BvcyAqIHBpY3BpdGNoOy8vICsgeF9wb3M7CisgICAgb3V0X29mZnNldCA9IDI0IC0gYmxrd2lkdGg7CisKKyAgICAvL3N3aXRjaCh4X3BvcyYweDMpeworICAgIHN3aXRjaCAoKCh1aW50MzIpcmVmKSYweDMpCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBvZmZzZXQgPSAgcGljcGl0Y2ggLSBibGt3aWR0aCAtIDM7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxraGVpZ2h0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGl4MSA9ICpyZWYrKzsKKyAgICAgICAgICAgICAgICBwaXgyID0gKigodWludDE2KilyZWYpOworICAgICAgICAgICAgICAgIHJlZiArPSAyOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChwaXgyIDw8IDgpIHwgcGl4MTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDM7IGkgPCBibGt3aWR0aDsgaSArPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4NCA9ICooKHVpbnQzMiopcmVmKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIHByZXZfcGl4ID0gKHBpeDQgPDwgMjQpICYgMHhGRjAwMDAwMDsgLyogbWFzayBvdXQgYnl0ZSBiZWxvbmcgdG8gcHJldmlvdXMgd29yZCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gcHJldl9waXg7CisgICAgICAgICAgICAgICAgICAgICooKHVpbnQzMiopb3V0KSA9IHJlc3VsdDsgIC8qIHdyaXRlIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBpeDQgPj4gODsgLyogZm9yIHRoZSBuZXh0IGxvb3AgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVmICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICBvdXQgKz0gb3V0X29mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBvZmZzZXQgPSAgcGljcGl0Y2ggLSBibGt3aWR0aCAtIDI7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxraGVpZ2h0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKigodWludDE2KilyZWYpOworICAgICAgICAgICAgICAgIHJlZiArPSAyOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDI7IGkgPCBibGt3aWR0aDsgaSArPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4NCA9ICooKHVpbnQzMiopcmVmKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIHByZXZfcGl4ID0gKHBpeDQgPDwgMTYpICYgMHhGRkZGMDAwMDsgLyogbWFzayBvdXQgYnl0ZSBiZWxvbmcgdG8gcHJldmlvdXMgd29yZCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gcHJldl9waXg7CisgICAgICAgICAgICAgICAgICAgICooKHVpbnQzMiopb3V0KSA9IHJlc3VsdDsgIC8qIHdyaXRlIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBpeDQgPj4gMTY7IC8qIGZvciB0aGUgbmV4dCBsb29wICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZiArPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgb3V0ICs9IG91dF9vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgb2Zmc2V0ID0gIHBpY3BpdGNoIC0gYmxrd2lkdGggLSAxOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa2hlaWdodDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9ICpyZWYrKzsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYmxrd2lkdGg7IGkgKz0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpeDQgPSAqKCh1aW50MzIqKXJlZik7CisgICAgICAgICAgICAgICAgICAgIHJlZiArPSA0OworICAgICAgICAgICAgICAgICAgICBwcmV2X3BpeCA9IChwaXg0IDw8IDgpICYgMHhGRkZGRkYwMDsgLyogbWFzayBvdXQgYnl0ZSBiZWxvbmcgdG8gcHJldmlvdXMgd29yZCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gcHJldl9waXg7CisgICAgICAgICAgICAgICAgICAgICooKHVpbnQzMiopb3V0KSA9IHJlc3VsdDsgIC8qIHdyaXRlIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgb3V0ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBpeDQgPj4gMjQ7IC8qIGZvciB0aGUgbmV4dCBsb29wICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZiArPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgb3V0ICs9IG91dF9vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgZUhvcnpJbnRlcnAxTUModWludDggKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeCkKK3sKKyAgICB1aW50OCAqcF9yZWY7CisgICAgdWludDMyICpwX2N1cjsKKyAgICB1aW50MzIgdG1wLCBwa3JlczsKKyAgICBpbnQgcmVzdWx0LCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKKyAgICBpbnQgajsKKyAgICBpbnQzMiByMCwgcjEsIHIyLCByMywgcjQsIHI1OworICAgIGludDMyIHIxMywgcjY7CisKKyAgICBwX2N1ciA9ICh1aW50MzIqKW91dDsgLyogYXNzdW1lIGl0J3Mgd29yZCBhbGlnbmVkICovCisgICAgY3Vycl9vZmZzZXQgPSAob3V0cGl0Y2ggLSBibGt3aWR0aCkgPj4gMjsKKyAgICBwX3JlZiA9IGluOworICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoIC0gYmxrd2lkdGg7CisKKyAgICBpZiAoZHgmMSkKKyAgICB7CisgICAgICAgIGR4ID0gKChkeCA+PiAxKSA/IC0zIDogLTQpOyAvKiB1c2UgaW4gMy80IHBlbCAqLworICAgICAgICBwX3JlZiAtPSAyOworICAgICAgICByMTMgPSAwOworICAgICAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOworICAgICAgICAgICAgcjAgPSBwX3JlZlswXTsKKyAgICAgICAgICAgIHIxID0gcF9yZWZbMl07CisgICAgICAgICAgICByMCB8PSAocjEgPDwgMTYpOyAgICAgICAgICAgLyogMCxjLDAsYSAqLworICAgICAgICAgICAgcjEgPSBwX3JlZlsxXTsKKyAgICAgICAgICAgIHIyID0gcF9yZWZbM107CisgICAgICAgICAgICByMSB8PSAocjIgPDwgMTYpOyAgICAgICAgICAgLyogMCxkLDAsYiAqLworICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IDQpOyAvKiBtb3ZlIHBvaW50ZXIgdG8gZSAqLworICAgICAgICAgICAgICAgIHIzID0gcF9yZWZbMl07CisgICAgICAgICAgICAgICAgcjIgfD0gKHIzIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZywwLGUgKi8KKyAgICAgICAgICAgICAgICByMyA9IHBfcmVmWzFdOworICAgICAgICAgICAgICAgIHI0ID0gcF9yZWZbM107CisgICAgICAgICAgICAgICAgcjMgfD0gKHI0IDw8IDE2KTsgICAgICAgICAgIC8qIDAsaCwwLGYgKi8KKworICAgICAgICAgICAgICAgIHI0ID0gcjAgKyByMzsgICAgICAgLyogYytoLCBhK2YgKi8KKyAgICAgICAgICAgICAgICByNSA9IHIwICsgcjE7ICAgLyogYytkLCBhK2IgKi8KKyAgICAgICAgICAgICAgICByNiA9IHIyICsgcjM7ICAgLyogZytoLCBlK2YgKi8KKyAgICAgICAgICAgICAgICByNSA+Pj0gMTY7CisgICAgICAgICAgICAgICAgcjUgfD0gKHI2IDw8IDE2KTsgICAvKiBlK2YsIGMrZCAqLworICAgICAgICAgICAgICAgIHI0ICs9IHI1ICogMjA7ICAgICAgLyogYysyMCplKzIwKmYraCwgYSsyMCpjKzIwKmQrZiAqLworICAgICAgICAgICAgICAgIHI0ICs9IDB4MTAwMDEwOyAvKiArMTYsICsxNiAqLworICAgICAgICAgICAgICAgIHI1ID0gcjEgKyByMjsgICAgICAgLyogZCtnLCBiK2UgKi8KKyAgICAgICAgICAgICAgICByNCAtPSByNSAqIDU7ICAgICAgIC8qIGMtNSpkKzIwKmUrMjAqZi01KmcraCwgYS01KmIrMjAqYysyMCpkLTUqZStmICovCisgICAgICAgICAgICAgICAgcjQgPj49IDU7CisgICAgICAgICAgICAgICAgcjEzIHw9IHI0OyAgICAgIC8qIGNoZWNrIGNsaXBwaW5nICovCisKKyAgICAgICAgICAgICAgICByNSA9IHBfcmVmW2R4KzJdOworICAgICAgICAgICAgICAgIHI2ID0gcF9yZWZbZHgrNF07CisgICAgICAgICAgICAgICAgcjUgfD0gKHI2IDw8IDE2KTsKKyAgICAgICAgICAgICAgICByNCArPSByNTsKKyAgICAgICAgICAgICAgICByNCArPSAweDEwMDAxOworICAgICAgICAgICAgICAgIHI0ID0gKHI0ID4+IDEpICYgMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByNSA9IHBfcmVmWzRdOyAgLyogaSAqLworICAgICAgICAgICAgICAgIHI2ID0gKHI1IDw8IDE2KTsKKyAgICAgICAgICAgICAgICByNSA9IHI2IHwgKHIyID4+IDE2KTsvKiAwLGksMCxnICovCisgICAgICAgICAgICAgICAgcjUgKz0gcjE7ICAgICAgIC8qIGQraSwgYitnICovIC8qIHI1IG5vdCBmcmVlICovCisgICAgICAgICAgICAgICAgcjEgPj49IDE2OworICAgICAgICAgICAgICAgIHIxIHw9IChyMyA8PCAxNik7IC8qIDAsZiwwLGQgKi8gLyogcjEgaGFzIGNoYW5nZWQgKi8KKyAgICAgICAgICAgICAgICByMSArPSByMjsgICAgICAgLyogZitnLCBkK2UgKi8KKyAgICAgICAgICAgICAgICByNSArPSAyMCAqIHIxOyAgLyogZCsyMGYrMjBnK2ksIGIrMjBkKzIwZStnICovCisgICAgICAgICAgICAgICAgcjAgPj49IDE2OworICAgICAgICAgICAgICAgIHIwIHw9IChyMiA8PCAxNik7IC8qIDAsZSwwLGMgKi8gLyogcjAgaGFzIGNoYW5nZWQgKi8KKyAgICAgICAgICAgICAgICByMCArPSByMzsgICAgICAgLyogZStoLCBjK2YgKi8KKyAgICAgICAgICAgICAgICByNSArPSAweDEwMDAxMDsgLyogMTYsMTYgKi8KKyAgICAgICAgICAgICAgICByNSAtPSByMCAqIDU7ICAgICAgIC8qIGQtNWUrMjBmKzIwZy01aCtpLCBiLTVjKzIwZCsyMGUtNWYrZyAqLworICAgICAgICAgICAgICAgIHI1ID4+PSA1OworICAgICAgICAgICAgICAgIHIxMyB8PSByNTsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLworCisgICAgICAgICAgICAgICAgcjAgPSBwX3JlZltkeCszXTsKKyAgICAgICAgICAgICAgICByMSA9IHBfcmVmW2R4KzVdOworICAgICAgICAgICAgICAgIHIwIHw9IChyMSA8PCAxNik7CisgICAgICAgICAgICAgICAgcjUgKz0gcjA7CisgICAgICAgICAgICAgICAgcjUgKz0gMHgxMDAwMTsKKyAgICAgICAgICAgICAgICByNSA9IChyNSA+PiAxKSAmIDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjQgfD0gKHI1IDw8IDgpOyAgICAvKiBwYWNrIHRoZW0gdG9nZXRoZXIgKi8KKyAgICAgICAgICAgICAgICAqcF9jdXIrKyA9IHI0OworICAgICAgICAgICAgICAgIHIxID0gcjM7CisgICAgICAgICAgICAgICAgcjAgPSByMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAvKiAgICByZWZfb2Zmc2V0ID0gaW5waXRjaC1ibGt3aWR0aDsgKi8KKworICAgICAgICAgICAgaWYgKHIxMyYweEZGMDAwNzAwKSAvKiBuZWVkIGNsaXBwaW5nICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbW92ZSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiAtPSAocmVmX29mZnNldCArIGJsa3dpZHRoKTsgICAvKiBpbnB1dCAqLworICAgICAgICAgICAgICAgIHBfY3VyIC09IChvdXRwaXRjaCA+PiAyKTsKKworICAgICAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOworICAgICAgICAgICAgICAgIGZvciAoOyAodWludDMyKXBfcmVmIDwgdG1wOykKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcjQgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjUgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHhdICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHBrcmVzID0gKHJlc3VsdCA+PiAxKSA7CisgICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeF0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R4XSArIDEpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAxNik7CisgICAgICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeF0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMjQpOworICAgICAgICAgICAgICAgICAgICAqcF9jdXIrKyA9IHBrcmVzOyAvKiB3cml0ZSA0IHBpeGVscyAqLworICAgICAgICAgICAgICAgICAgICBwX3JlZiAtPSA1OyAgLyogb2Zmc2V0IGJhY2sgdG8gdGhlIG1pZGRsZSBvZiBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7ICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwX3JlZiAtPSAyOworICAgICAgICByMTMgPSAwOworICAgICAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOworICAgICAgICAgICAgcjAgPSBwX3JlZlswXTsKKyAgICAgICAgICAgIHIxID0gcF9yZWZbMl07CisgICAgICAgICAgICByMCB8PSAocjEgPDwgMTYpOyAgICAgICAgICAgLyogMCxjLDAsYSAqLworICAgICAgICAgICAgcjEgPSBwX3JlZlsxXTsKKyAgICAgICAgICAgIHIyID0gcF9yZWZbM107CisgICAgICAgICAgICByMSB8PSAocjIgPDwgMTYpOyAgICAgICAgICAgLyogMCxkLDAsYiAqLworICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IDQpOyAvKiBtb3ZlIHBvaW50ZXIgdG8gZSAqLworICAgICAgICAgICAgICAgIHIzID0gcF9yZWZbMl07CisgICAgICAgICAgICAgICAgcjIgfD0gKHIzIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZywwLGUgKi8KKyAgICAgICAgICAgICAgICByMyA9IHBfcmVmWzFdOworICAgICAgICAgICAgICAgIHI0ID0gcF9yZWZbM107CisgICAgICAgICAgICAgICAgcjMgfD0gKHI0IDw8IDE2KTsgICAgICAgICAgIC8qIDAsaCwwLGYgKi8KKworICAgICAgICAgICAgICAgIHI0ID0gcjAgKyByMzsgICAgICAgLyogYytoLCBhK2YgKi8KKyAgICAgICAgICAgICAgICByNSA9IHIwICsgcjE7ICAgLyogYytkLCBhK2IgKi8KKyAgICAgICAgICAgICAgICByNiA9IHIyICsgcjM7ICAgLyogZytoLCBlK2YgKi8KKyAgICAgICAgICAgICAgICByNSA+Pj0gMTY7CisgICAgICAgICAgICAgICAgcjUgfD0gKHI2IDw8IDE2KTsgICAvKiBlK2YsIGMrZCAqLworICAgICAgICAgICAgICAgIHI0ICs9IHI1ICogMjA7ICAgICAgLyogYysyMCplKzIwKmYraCwgYSsyMCpjKzIwKmQrZiAqLworICAgICAgICAgICAgICAgIHI0ICs9IDB4MTAwMDEwOyAvKiArMTYsICsxNiAqLworICAgICAgICAgICAgICAgIHI1ID0gcjEgKyByMjsgICAgICAgLyogZCtnLCBiK2UgKi8KKyAgICAgICAgICAgICAgICByNCAtPSByNSAqIDU7ICAgICAgIC8qIGMtNSpkKzIwKmUrMjAqZi01KmcraCwgYS01KmIrMjAqYysyMCpkLTUqZStmICovCisgICAgICAgICAgICAgICAgcjQgPj49IDU7CisgICAgICAgICAgICAgICAgcjEzIHw9IHI0OyAgICAgIC8qIGNoZWNrIGNsaXBwaW5nICovCisgICAgICAgICAgICAgICAgcjQgJj0gMHhGRjAwRkY7IC8qIG1hc2sgKi8KKworICAgICAgICAgICAgICAgIHI1ID0gcF9yZWZbNF07ICAvKiBpICovCisgICAgICAgICAgICAgICAgcjYgPSAocjUgPDwgMTYpOworICAgICAgICAgICAgICAgIHI1ID0gcjYgfCAocjIgPj4gMTYpOy8qIDAsaSwwLGcgKi8KKyAgICAgICAgICAgICAgICByNSArPSByMTsgICAgICAgLyogZCtpLCBiK2cgKi8gLyogcjUgbm90IGZyZWUgKi8KKyAgICAgICAgICAgICAgICByMSA+Pj0gMTY7CisgICAgICAgICAgICAgICAgcjEgfD0gKHIzIDw8IDE2KTsgLyogMCxmLDAsZCAqLyAvKiByMSBoYXMgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgIHIxICs9IHIyOyAgICAgICAvKiBmK2csIGQrZSAqLworICAgICAgICAgICAgICAgIHI1ICs9IDIwICogcjE7ICAvKiBkKzIwZisyMGcraSwgYisyMGQrMjBlK2cgKi8KKyAgICAgICAgICAgICAgICByMCA+Pj0gMTY7CisgICAgICAgICAgICAgICAgcjAgfD0gKHIyIDw8IDE2KTsgLyogMCxlLDAsYyAqLyAvKiByMCBoYXMgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgIHIwICs9IHIzOyAgICAgICAvKiBlK2gsIGMrZiAqLworICAgICAgICAgICAgICAgIHI1ICs9IDB4MTAwMDEwOyAvKiAxNiwxNiAqLworICAgICAgICAgICAgICAgIHI1IC09IHIwICogNTsgICAgICAgLyogZC01ZSsyMGYrMjBnLTVoK2ksIGItNWMrMjBkKzIwZS01ZitnICovCisgICAgICAgICAgICAgICAgcjUgPj49IDU7CisgICAgICAgICAgICAgICAgcjEzIHw9IHI1OyAgICAgIC8qIGNoZWNrIGNsaXBwaW5nICovCisgICAgICAgICAgICAgICAgcjUgJj0gMHhGRjAwRkY7IC8qIG1hc2sgKi8KKworICAgICAgICAgICAgICAgIHI0IHw9IChyNSA8PCA4KTsgICAgLyogcGFjayB0aGVtIHRvZ2V0aGVyICovCisgICAgICAgICAgICAgICAgKnBfY3VyKysgPSByNDsKKyAgICAgICAgICAgICAgICByMSA9IHIzOworICAgICAgICAgICAgICAgIHIwID0gcjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgLyogICAgcmVmX29mZnNldCA9IGlucGl0Y2gtYmxrd2lkdGg7ICovCisKKyAgICAgICAgICAgIGlmIChyMTMmMHhGRjAwMDcwMCkgLyogbmVlZCBjbGlwcGluZyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG1vdmUgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lICovCisgICAgICAgICAgICAgICAgcF9yZWYgLT0gKHJlZl9vZmZzZXQgKyBibGt3aWR0aCk7ICAgLyogaW5wdXQgKi8KKyAgICAgICAgICAgICAgICBwX2N1ciAtPSAob3V0cGl0Y2ggPj4gMik7CisKKyAgICAgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgICAgICAgICBmb3IgKDsgKHVpbnQzMilwX3JlZiA8IHRtcDspCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHI1ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHBrcmVzICA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDgpOworICAgICAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAxNik7CisgICAgICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAyNCk7CisgICAgICAgICAgICAgICAgICAgICpwX2N1cisrID0gcGtyZXM7ICAgLyogd3JpdGUgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgcF9yZWYgLT0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGVIb3J6SW50ZXJwMk1DKGludCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR4KQoreworICAgIGludCAqcF9yZWY7CisgICAgdWludDMyICpwX2N1cjsKKyAgICB1aW50MzIgdG1wLCBwa3JlczsKKyAgICBpbnQgcmVzdWx0LCByZXN1bHQyLCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKKyAgICBpbnQgaiwgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKKworICAgIHBfY3VyID0gKHVpbnQzMiopb3V0OyAvKiBhc3N1bWUgaXQncyB3b3JkIGFsaWduZWQgKi8KKyAgICBjdXJyX29mZnNldCA9IChvdXRwaXRjaCAtIGJsa3dpZHRoKSA+PiAyOworICAgIHBfcmVmID0gaW47CisgICAgcmVmX29mZnNldCA9IGlucGl0Y2ggLSBibGt3aWR0aDsKKworICAgIGlmIChkeCYxKQorICAgIHsKKyAgICAgICAgZHggPSAoKGR4ID4+IDEpID8gLTMgOiAtNCk7IC8qIHVzZSBpbiAzLzQgcGVsICovCisKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMCA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgICAgICBmb3IgKDsgKHVpbnQzMilwX3JlZiA8IHRtcDspCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICByMCA9IHBfcmVmWy0yXTsKKyAgICAgICAgICAgICAgICByMSA9IHBfcmVmWy0xXTsKKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHIzID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcjQgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHI1ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R4XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHBrcmVzID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeF0gKyAxNikgPj4gNSk7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKKyAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDgpOworICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHhdICsgMTYpID4+IDUpOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCisgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAxNik7CisgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHhdICsgMTYpID4+IDUpOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCisgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAyNCk7CisgICAgICAgICAgICAgICAgKnBfY3VyKysgPSBwa3JlczsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiAtPSAzOyAgLyogb2Zmc2V0IGJhY2sgdG8gdGhlIG1pZGRsZSBvZiBmaWx0ZXIgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwIDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgICAgIGZvciAoOyAodWludDMyKXBfcmVmIDwgdG1wOykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHIwID0gcF9yZWZbLTJdOworICAgICAgICAgICAgICAgIHIxID0gcF9yZWZbLTFdOworICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcjMgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByNCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgcjUgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcGtyZXMgID0gcmVzdWx0OworICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDgpOworICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMTYpOworICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDI0KTsKKyAgICAgICAgICAgICAgICAqcF9jdXIrKyA9IHBrcmVzOyAvKiB3cml0ZSA0IHBpeGVscyAqLworICAgICAgICAgICAgICAgIHBfcmVmIC09IDM7ICAvKiBvZmZzZXQgYmFjayB0byB0aGUgbWlkZGxlIG9mIGZpbHRlciAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7ICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAgIC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBlSG9yekludGVycDNNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCBpbnQgKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgdWludDggKnBfcmVmOworICAgIGludCAgICpwX2N1cjsKKyAgICB1aW50MzIgdG1wOworICAgIGludCByZXN1bHQsIGN1cnJfb2Zmc2V0LCByZWZfb2Zmc2V0OworICAgIGludCBqLCByMCwgcjEsIHIyLCByMywgcjQsIHI1OworCisgICAgcF9jdXIgPSBvdXQ7CisgICAgY3Vycl9vZmZzZXQgPSAob3V0cGl0Y2ggLSBibGt3aWR0aCk7CisgICAgcF9yZWYgPSBpbjsKKyAgICByZWZfb2Zmc2V0ID0gaW5waXRjaCAtIGJsa3dpZHRoOworCisgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMCA7IGotLSkKKyAgICB7CisgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOworICAgICAgICBmb3IgKDsgKHVpbnQzMilwX3JlZiA8IHRtcDspCisgICAgICAgIHsKKworICAgICAgICAgICAgcjAgPSBwX3JlZlstMl07CisgICAgICAgICAgICByMSA9IHBfcmVmWy0xXTsKKyAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICByMyA9ICpwX3JlZisrOworICAgICAgICAgICAgcjQgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICByNSA9ICpwX3JlZisrOworICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICpwX2N1cisrID0gcmVzdWx0OworICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICpwX2N1cisrID0gcmVzdWx0OworICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgKnBfY3VyKysgPSByZXN1bHQ7CisgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgKnBfY3VyKysgPSByZXN1bHQ7CisgICAgICAgICAgICBwX3JlZiAtPSAzOyAvKiBtb3ZlIGJhY2sgdG8gdGhlIG1pZGRsZSBvZiB0aGUgZmlsdGVyICovCisgICAgICAgIH0KKyAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OworICAgIH0KKworICAgIHJldHVybiA7Cit9Cit2b2lkIGVWZXJ0SW50ZXJwMU1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHkpCit7CisgICAgdWludDggKnBfY3VyLCAqcF9yZWY7CisgICAgdWludDMyIHRtcDsKKyAgICBpbnQgcmVzdWx0LCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKKyAgICBpbnQgaiwgaTsKKyAgICBpbnQzMiByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByMTM7CisgICAgdWludDggIHRtcF9pblsyNF1bMjRdOworCisgICAgLyogbm90IHdvcmQtYWxpZ25lZCAqLworICAgIGlmICgoKHVpbnQzMilpbikmMHgzKQorICAgIHsKKyAgICAgICAgZUNyZWF0ZUFsaWduKGluLCBpbnBpdGNoLCAtMiwgJnRtcF9pblswXVswXSwgYmxrd2lkdGgsIGJsa2hlaWdodCArIDUpOworICAgICAgICBpbiA9ICZ0bXBfaW5bMl1bMF07CisgICAgICAgIGlucGl0Y2ggPSAyNDsKKyAgICB9CisgICAgcF9jdXIgPSBvdXQ7CisgICAgY3Vycl9vZmZzZXQgPSAxIC0gb3V0cGl0Y2ggKiAoYmxraGVpZ2h0IC0gMSk7IC8qIG9mZnNldCB2ZXJ0aWNhbGx5IGJhY2sgdXAgYW5kIG9uZSBwaXhlbCB0byByaWdodCAqLworICAgIHJlZl9vZmZzZXQgPSBibGtoZWlnaHQgKiBpbnBpdGNoOyAvKiBmb3IgbGltaXQgKi8KKworICAgIGN1cnJfb2Zmc2V0ICs9IDM7CisKKyAgICBpZiAoZHkmMSkKKyAgICB7CisgICAgICAgIGR5ID0gKGR5ID4+IDEpID8gMCA6IC1pbnBpdGNoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaiArPSA0LCBpbiArPSA0KQorICAgICAgICB7CisgICAgICAgICAgICByMTMgPSAwOworICAgICAgICAgICAgcF9yZWYgPSBpbjsKKyAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KKyAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKSAgLyogdGhlIGxvb3AgdW4tcm9sbGVkICAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIwID0gKigodWludDMyKikocF9yZWYgLSAoaW5waXRjaCA8PCAxKSkpOyAvKiBsb2FkIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiArPSBpbnBpdGNoOworICAgICAgICAgICAgICAgIHI2ID0gKHIwID4+IDgpICYgMHhGRjAwRkY7IC8qIHNlY29uZCBhbmQgZm91cnRoIGJ5dGUgKi8KKyAgICAgICAgICAgICAgICByMCAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyAoaW5waXRjaCA8PCAxKSkpOyAgLyogcjEsIHI3LCByZWZbM10gKi8KKyAgICAgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjAgKz0gcjE7CisgICAgICAgICAgICAgICAgcjYgKz0gcjc7CisKKyAgICAgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopcF9yZWYpOyAvKiByMiwgcjgsIHJlZlsxXSAqLworICAgICAgICAgICAgICAgIHI4ID0gKHIyID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjIgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmIC0gaW5waXRjaCkpOyAvKiByMSwgcjcsIHJlZlswXSAqLworICAgICAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgKz0gcjI7CisKKyAgICAgICAgICAgICAgICByNyArPSByODsKKworICAgICAgICAgICAgICAgIHIwICs9IDIwICogcjE7CisgICAgICAgICAgICAgICAgcjYgKz0gMjAgKiByNzsKKyAgICAgICAgICAgICAgICByMCArPSAweDEwMDAxMDsKKyAgICAgICAgICAgICAgICByNiArPSAweDEwMDAxMDsKKworICAgICAgICAgICAgICAgIHIyID0gKigodWludDMyKikocF9yZWYgLSAoaW5waXRjaCA8PCAxKSkpOyAvKiByMiwgcjgsIHJlZlstMV0gKi8KKyAgICAgICAgICAgICAgICByOCA9IChyMiA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMl0gKi8KKyAgICAgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICs9IHIyOworCisgICAgICAgICAgICAgICAgcjcgKz0gcjg7CisKKyAgICAgICAgICAgICAgICByMCAtPSA1ICogcjE7CisgICAgICAgICAgICAgICAgcjYgLT0gNSAqIHI3OworCisgICAgICAgICAgICAgICAgcjAgPj49IDU7CisgICAgICAgICAgICAgICAgcjYgPj49IDU7CisgICAgICAgICAgICAgICAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIxMyB8PSByNjsKKyAgICAgICAgICAgICAgICByMTMgfD0gcjA7CisgICAgICAgICAgICAgICAgLy9DTElQUEFDSyhyNixyZXN1bHQpCisKKyAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgZHkpKTsKKyAgICAgICAgICAgICAgICByMiA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIwICs9IHIxOworICAgICAgICAgICAgICAgIHI2ICs9IHIyOworICAgICAgICAgICAgICAgIHIwICs9IDB4MTAwMDE7CisgICAgICAgICAgICAgICAgcjYgKz0gMHgxMDAwMTsKKyAgICAgICAgICAgICAgICByMCA9IChyMCA+PiAxKSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHI2ID0gKHI2ID4+IDEpICYgMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMCB8PSAocjYgPDwgOCk7ICAvKiBwYWNrIGl0IGJhY2sgKi8KKyAgICAgICAgICAgICAgICAqKCh1aW50MzIqKShwX2N1ciArPSBvdXRwaXRjaCkpID0gcjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgLyogb2Zmc2V0IHRvIHRoZSBuZXh0IHBpeGVsICovCisgICAgICAgICAgICBpZiAocjEzICYgMHhGRjAwMDcwMCkgLyogdGhpcyBjb2x1bW4gbmVlZCBjbGlwcGluZyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfY3VyIC09IDQ7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfcmVmID0gaW4gKyBpOworICAgICAgICAgICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKworICAgICAgICAgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHJlZl9vZmZzZXQpOyAvKiBsaW1pdCAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW4tcm9sbGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgLSAoaW5waXRjaCA8PCAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAqKHBfcmVmICs9IGlucGl0Y2gpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByNSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R5LShpbnBpdGNoPDwxKV0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeS0oaW5waXRjaDw8MSldICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeS0oaW5waXRjaDw8MSldICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHktKGlucGl0Y2g8PDEpXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgcF9yZWYgLT0gKGlucGl0Y2ggPDwgMSk7ICAvKiBtb3ZlIGJhY2sgdG8gY2VudGVyIG9mIHRoZSBmaWx0ZXIgb2YgdGhlIG5leHQgb25lICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcF9jdXIgKz0gKGN1cnJfb2Zmc2V0IC0gMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaiArPSA0LCBpbiArPSA0KQorICAgICAgICB7CisgICAgICAgICAgICByMTMgPSAwOworICAgICAgICAgICAgcF9yZWYgPSBpbjsKKyAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KKyAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKSAgLyogdGhlIGxvb3AgdW4tcm9sbGVkICAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIwID0gKigodWludDMyKikocF9yZWYgLSAoaW5waXRjaCA8PCAxKSkpOyAvKiBsb2FkIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiArPSBpbnBpdGNoOworICAgICAgICAgICAgICAgIHI2ID0gKHIwID4+IDgpICYgMHhGRjAwRkY7IC8qIHNlY29uZCBhbmQgZm91cnRoIGJ5dGUgKi8KKyAgICAgICAgICAgICAgICByMCAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyAoaW5waXRjaCA8PCAxKSkpOyAgLyogcjEsIHI3LCByZWZbM10gKi8KKyAgICAgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjAgKz0gcjE7CisgICAgICAgICAgICAgICAgcjYgKz0gcjc7CisKKyAgICAgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopcF9yZWYpOyAvKiByMiwgcjgsIHJlZlsxXSAqLworICAgICAgICAgICAgICAgIHI4ID0gKHIyID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjIgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmIC0gaW5waXRjaCkpOyAvKiByMSwgcjcsIHJlZlswXSAqLworICAgICAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgKz0gcjI7CisKKyAgICAgICAgICAgICAgICByNyArPSByODsKKworICAgICAgICAgICAgICAgIHIwICs9IDIwICogcjE7CisgICAgICAgICAgICAgICAgcjYgKz0gMjAgKiByNzsKKyAgICAgICAgICAgICAgICByMCArPSAweDEwMDAxMDsKKyAgICAgICAgICAgICAgICByNiArPSAweDEwMDAxMDsKKworICAgICAgICAgICAgICAgIHIyID0gKigodWludDMyKikocF9yZWYgLSAoaW5waXRjaCA8PCAxKSkpOyAvKiByMiwgcjgsIHJlZlstMV0gKi8KKyAgICAgICAgICAgICAgICByOCA9IChyMiA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMl0gKi8KKyAgICAgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICs9IHIyOworCisgICAgICAgICAgICAgICAgcjcgKz0gcjg7CisKKyAgICAgICAgICAgICAgICByMCAtPSA1ICogcjE7CisgICAgICAgICAgICAgICAgcjYgLT0gNSAqIHI3OworCisgICAgICAgICAgICAgICAgcjAgPj49IDU7CisgICAgICAgICAgICAgICAgcjYgPj49IDU7CisgICAgICAgICAgICAgICAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIxMyB8PSByNjsKKyAgICAgICAgICAgICAgICByMTMgfD0gcjA7CisgICAgICAgICAgICAgICAgLy9DTElQUEFDSyhyNixyZXN1bHQpCisgICAgICAgICAgICAgICAgcjAgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjYgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjAgfD0gKHI2IDw8IDgpOyAgLyogcGFjayBpdCBiYWNrICovCisgICAgICAgICAgICAgICAgKigodWludDMyKikocF9jdXIgKz0gb3V0cGl0Y2gpKSA9IHIwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgbmV4dCBwaXhlbCAqLworICAgICAgICAgICAgaWYgKHIxMyAmIDB4RkYwMDA3MDApIC8qIHRoaXMgY29sdW1uIG5lZWQgY2xpcHBpbmcgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX2N1ciAtPSA0OworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwX3JlZiA9IGluICsgaTsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9vcCB1bi1yb2xsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiAtIChpbnBpdGNoIDw8IDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiAtIGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWY7CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9ICoocF9yZWYgKz0gaW5waXRjaCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjQgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHI1ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgcF9yZWYgLT0gKGlucGl0Y2ggPDwgMSk7ICAvKiBtb3ZlIGJhY2sgdG8gY2VudGVyIG9mIHRoZSBmaWx0ZXIgb2YgdGhlIG5leHQgb25lICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcF9jdXIgKz0gKGN1cnJfb2Zmc2V0IC0gMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBlVmVydEludGVycDJNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCBpbnQgKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgaW50ICpwX2N1cjsKKyAgICB1aW50OCAqcF9yZWY7CisgICAgdWludDMyIHRtcDsKKyAgICBpbnQgcmVzdWx0LCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKKyAgICBpbnQgaiwgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKKworICAgIHBfY3VyID0gb3V0OworICAgIGN1cnJfb2Zmc2V0ID0gMSAtIG91dHBpdGNoICogKGJsa2hlaWdodCAtIDEpOyAvKiBvZmZzZXQgdmVydGljYWxseSBiYWNrIHVwIGFuZCBvbmUgcGl4ZWwgdG8gcmlnaHQgKi8KKyAgICByZWZfb2Zmc2V0ID0gYmxraGVpZ2h0ICogaW5waXRjaDsgLyogZm9yIGxpbWl0ICovCisKKyAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGorKykKKyAgICB7CisgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgIHBfcmVmID0gaW4rKzsKKworICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHJlZl9vZmZzZXQpOyAvKiBsaW1pdCAqLworICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW4tcm9sbGVkICovCisgICAgICAgICAgICByMCA9ICoocF9yZWYgLSAoaW5waXRjaCA8PCAxKSk7CisgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKKyAgICAgICAgICAgIHIyID0gKnBfcmVmOworICAgICAgICAgICAgcjMgPSAqKHBfcmVmICs9IGlucGl0Y2gpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KKyAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICByNSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICByMSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLworICAgICAgICB9CisgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZVZlcnRJbnRlcnAzTUMoaW50ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHkpCit7CisgICAgdWludDggKnBfY3VyOworICAgIGludCAqcF9yZWY7CisgICAgdWludDMyIHRtcDsKKyAgICBpbnQgcmVzdWx0LCByZXN1bHQyLCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKKyAgICBpbnQgaiwgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKKworICAgIHBfY3VyID0gb3V0OworICAgIGN1cnJfb2Zmc2V0ID0gMSAtIG91dHBpdGNoICogKGJsa2hlaWdodCAtIDEpOyAvKiBvZmZzZXQgdmVydGljYWxseSBiYWNrIHVwIGFuZCBvbmUgcGl4ZWwgdG8gcmlnaHQgKi8KKyAgICByZWZfb2Zmc2V0ID0gYmxraGVpZ2h0ICogaW5waXRjaDsgLyogZm9yIGxpbWl0ICovCisKKyAgICBpZiAoZHkmMSkKKyAgICB7CisgICAgICAgIGR5ID0gKGR5ID4+IDEpID8gLShpbnBpdGNoIDw8IDEpIDogLShpbnBpdGNoIDw8IDEpIC0gaW5waXRjaDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7IC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgICAgIHBfcmVmID0gaW4rKzsKKworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KKyAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW4tcm9sbGVkICovCisgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOworICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiAtIGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmOworICAgICAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCisgICAgICAgICAgICAgICAgcjQgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeV0gKyAxNikgPj4gNSk7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKKyAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHldICsgMTYpID4+IDUpOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCisgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHldICsgMTYpID4+IDUpOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCisgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R5XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgcF9yZWYgLT0gKGlucGl0Y2ggPDwgMSk7ICAvKiBtb3ZlIGJhY2sgdG8gY2VudGVyIG9mIHRoZSBmaWx0ZXIgb2YgdGhlIG5leHQgb25lICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7IC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgICAgIHBfcmVmID0gaW4rKzsKKworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KKyAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW4tcm9sbGVkICovCisgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOworICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiAtIGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmOworICAgICAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCisgICAgICAgICAgICAgICAgcjQgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGVEaWFnb25hbEludGVycE1DKHVpbnQ4ICppbjEsIHVpbnQ4ICppbjIsIGludCBpbnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICBpbnQgaiwgaTsKKyAgICBpbnQgcmVzdWx0OworICAgIHVpbnQ4ICpwX2N1ciwgKnBfcmVmLCAqcF90bXA4OworICAgIGludCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKKyAgICB1aW50OCB0bXBfcmVzWzI0XVsyNF0sIHRtcF9pblsyNF1bMjRdOworICAgIHVpbnQzMiAqcF90bXA7CisgICAgdWludDMyIHRtcCwgcGtyZXMsIHRtcF9yZXN1bHQ7CisgICAgaW50MzIgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKKyAgICBpbnQzMiByNiwgcjcsIHI4LCByOSwgcjEwLCByMTM7CisKKyAgICByZWZfb2Zmc2V0ID0gaW5waXRjaCAtIGJsa3dpZHRoOworICAgIHBfcmVmID0gaW4xIC0gMjsKKyAgICAvKiBwZXJmb3JtIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLworICAgIC8qIG5vdCB3b3JkLWFsaWduZWQgKi8KKyAgICAvKiBJdCBpcyBmYXN0ZXIgdG8gcmVhZCAxIGJ5dGUgYXQgdGltZSB0byBhdm9pZCBjYWxsaW5nIENyZWF0ZUFsaWduICovCisgICAgLyogIGlmKCgodWludDMyKXBfcmVmKSYweDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENyZWF0ZUFsaWduKHBfcmVmLGlucGl0Y2gsMCwmdG1wX2luWzBdWzBdLGJsa3dpZHRoKzgsYmxraGVpZ2h0KTsKKyAgICAgICAgICAgIHBfcmVmID0gJnRtcF9pblswXVswXTsKKyAgICAgICAgICAgIHJlZl9vZmZzZXQgPSAyNC1ibGt3aWR0aDsKKyAgICAgICAgfSovCisKKyAgICBwX3RtcCA9ICh1aW50MzIqKSAmICh0bXBfcmVzWzBdWzBdKTsKKyAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwOyBqLS0pCisgICAgeworICAgICAgICByMTMgPSAwOworICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKworICAgICAgICAvL3IwID0gKigodWludDMyKilwX3JlZik7ICAgLyogZCxjLGIsYSAqLworICAgICAgICAvL3IxID0gKHIwPj44KSYweEZGMDBGRjsgICAgLyogMCxkLDAsYiAqLworICAgICAgICAvL3IwICY9IDB4RkYwMEZGOyAgICAgICAgICAgLyogMCxjLDAsYSAqLworICAgICAgICAvKiBJdCBpcyBmYXN0ZXIgdG8gcmVhZCAxIGJ5dGUgYXQgYSB0aW1lICovCisgICAgICAgIHIwID0gcF9yZWZbMF07CisgICAgICAgIHIxID0gcF9yZWZbMl07CisgICAgICAgIHIwIHw9IChyMSA8PCAxNik7ICAgICAgICAgICAvKiAwLGMsMCxhICovCisgICAgICAgIHIxID0gcF9yZWZbMV07CisgICAgICAgIHIyID0gcF9yZWZbM107CisgICAgICAgIHIxIHw9IChyMiA8PCAxNik7ICAgICAgICAgICAvKiAwLGQsMCxiICovCisKKyAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vcjIgPSAqKCh1aW50MzIqKShwX3JlZis9NCkpOy8qIGgsZyxmLGUgKi8KKyAgICAgICAgICAgIC8vcjMgPSAocjI+PjgpJjB4RkYwMEZGOyAgLyogMCxoLDAsZiAqLworICAgICAgICAgICAgLy9yMiAmPSAweEZGMDBGRjsgICAgICAgICAgIC8qIDAsZywwLGUgKi8KKyAgICAgICAgICAgIC8qIEl0IGlzIGZhc3RlciB0byByZWFkIDEgYnl0ZSBhdCBhIHRpbWUgKi8KKyAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSA0KTsKKyAgICAgICAgICAgIHIzID0gcF9yZWZbMl07CisgICAgICAgICAgICByMiB8PSAocjMgPDwgMTYpOyAgICAgICAgICAgLyogMCxnLDAsZSAqLworICAgICAgICAgICAgcjMgPSBwX3JlZlsxXTsKKyAgICAgICAgICAgIHI0ID0gcF9yZWZbM107CisgICAgICAgICAgICByMyB8PSAocjQgPDwgMTYpOyAgICAgICAgICAgLyogMCxoLDAsZiAqLworCisgICAgICAgICAgICByNCA9IHIwICsgcjM7ICAgICAgIC8qIGMraCwgYStmICovCisgICAgICAgICAgICByNSA9IHIwICsgcjE7ICAgLyogYytkLCBhK2IgKi8KKyAgICAgICAgICAgIHI2ID0gcjIgKyByMzsgICAvKiBnK2gsIGUrZiAqLworICAgICAgICAgICAgcjUgPj49IDE2OworICAgICAgICAgICAgcjUgfD0gKHI2IDw8IDE2KTsgICAvKiBlK2YsIGMrZCAqLworICAgICAgICAgICAgcjQgKz0gcjUgKiAyMDsgICAgICAvKiBjKzIwKmUrMjAqZitoLCBhKzIwKmMrMjAqZCtmICovCisgICAgICAgICAgICByNCArPSAweDEwMDAxMDsgLyogKzE2LCArMTYgKi8KKyAgICAgICAgICAgIHI1ID0gcjEgKyByMjsgICAgICAgLyogZCtnLCBiK2UgKi8KKyAgICAgICAgICAgIHI0IC09IHI1ICogNTsgICAgICAgLyogYy01KmQrMjAqZSsyMCpmLTUqZytoLCBhLTUqYisyMCpjKzIwKmQtNSplK2YgKi8KKyAgICAgICAgICAgIHI0ID4+PSA1OworICAgICAgICAgICAgcjEzIHw9IHI0OyAgICAgIC8qIGNoZWNrIGNsaXBwaW5nICovCisgICAgICAgICAgICByNCAmPSAweEZGMDBGRjsgLyogbWFzayAqLworCisgICAgICAgICAgICByNSA9IHBfcmVmWzRdOyAgLyogaSAqLworICAgICAgICAgICAgcjYgPSAocjUgPDwgMTYpOworICAgICAgICAgICAgcjUgPSByNiB8IChyMiA+PiAxNik7LyogMCxpLDAsZyAqLworICAgICAgICAgICAgcjUgKz0gcjE7ICAgICAgIC8qIGQraSwgYitnICovIC8qIHI1IG5vdCBmcmVlICovCisgICAgICAgICAgICByMSA+Pj0gMTY7CisgICAgICAgICAgICByMSB8PSAocjMgPDwgMTYpOyAvKiAwLGYsMCxkICovIC8qIHIxIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICByMSArPSByMjsgICAgICAgLyogZitnLCBkK2UgKi8KKyAgICAgICAgICAgIHI1ICs9IDIwICogcjE7ICAvKiBkKzIwZisyMGcraSwgYisyMGQrMjBlK2cgKi8KKyAgICAgICAgICAgIHIwID4+PSAxNjsKKyAgICAgICAgICAgIHIwIHw9IChyMiA8PCAxNik7IC8qIDAsZSwwLGMgKi8gLyogcjAgaGFzIGNoYW5nZWQgKi8KKyAgICAgICAgICAgIHIwICs9IHIzOyAgICAgICAvKiBlK2gsIGMrZiAqLworICAgICAgICAgICAgcjUgKz0gMHgxMDAwMTA7IC8qIDE2LDE2ICovCisgICAgICAgICAgICByNSAtPSByMCAqIDU7ICAgICAgIC8qIGQtNWUrMjBmKzIwZy01aCtpLCBiLTVjKzIwZCsyMGUtNWYrZyAqLworICAgICAgICAgICAgcjUgPj49IDU7CisgICAgICAgICAgICByMTMgfD0gcjU7ICAgICAgLyogY2hlY2sgY2xpcHBpbmcgKi8KKyAgICAgICAgICAgIHI1ICY9IDB4RkYwMEZGOyAvKiBtYXNrICovCisKKyAgICAgICAgICAgIHI0IHw9IChyNSA8PCA4KTsgICAgLyogcGFjayB0aGVtIHRvZ2V0aGVyICovCisgICAgICAgICAgICAqcF90bXArKyA9IHI0OworICAgICAgICAgICAgcjEgPSByMzsKKyAgICAgICAgICAgIHIwID0gcjI7CisgICAgICAgIH0KKyAgICAgICAgcF90bXAgKz0gKCgyNCAtIGJsa3dpZHRoKSA+PiAyKTsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAvKiAgICByZWZfb2Zmc2V0ID0gaW5waXRjaC1ibGt3aWR0aDsgKi8KKworICAgICAgICBpZiAocjEzJjB4RkYwMDA3MDApIC8qIG5lZWQgY2xpcHBpbmcgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogbW92ZSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKi8KKyAgICAgICAgICAgIHBfcmVmIC09IChyZWZfb2Zmc2V0ICsgYmxrd2lkdGgpOyAgIC8qIGlucHV0ICovCisgICAgICAgICAgICBwX3RtcCAtPSA2OyAvKiBpbnRlcm1lZGlhdGUgb3V0cHV0ICovCisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHIzID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcjQgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHI1ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwa3JlcyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcGtyZXMgfD0gKHJlc3VsdCA8PCA4KTsKKyAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwa3JlcyB8PSAocmVzdWx0IDw8IDE2KTsKKyAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcGtyZXMgfD0gKHJlc3VsdCA8PCAyNCk7CisKKyAgICAgICAgICAgICAgICAqcF90bXArKyA9IHBrcmVzOyAvKiB3cml0ZSA0IHBpeGVsICovCisgICAgICAgICAgICAgICAgcF9yZWYgLT0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfdG1wICs9ICgoMjQgLSBibGt3aWR0aCkgPj4gMik7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgIC8qICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoLWJsa3dpZHRoOyAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyogIHBlcmZvcm0gdmVydGljYWwgaW50ZXJwb2xhdGlvbiAqLworICAgIC8qIG5vdCB3b3JkLWFsaWduZWQgKi8KKyAgICBpZiAoKCh1aW50MzIpaW4yKSYweDMpCisgICAgeworICAgICAgICBlQ3JlYXRlQWxpZ24oaW4yLCBpbnBpdGNoLCAtMiwgJnRtcF9pblswXVswXSwgYmxrd2lkdGgsIGJsa2hlaWdodCArIDUpOworICAgICAgICBpbjIgPSAmdG1wX2luWzJdWzBdOworICAgICAgICBpbnBpdGNoID0gMjQ7CisgICAgfQorCisgICAgcF9jdXIgPSBvdXQ7CisgICAgY3Vycl9vZmZzZXQgPSAxIC0gb3V0cGl0Y2ggKiAoYmxraGVpZ2h0IC0gMSk7IC8qIG9mZnNldCB2ZXJ0aWNhbGx5IHVwIGFuZCBvbmUgcGl4ZWwgcmlnaHQgKi8KKyAgICBwa3JlcyA9IGJsa2hlaWdodCAqIGlucGl0Y2g7IC8qIHJldXNlIGl0IGZvciBsaW1pdCAqLworCisgICAgY3Vycl9vZmZzZXQgKz0gMzsKKworICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaiArPSA0LCBpbjIgKz0gNCkKKyAgICB7CisgICAgICAgIHIxMyA9IDA7CisgICAgICAgIHBfcmVmID0gaW4yOworICAgICAgICBwX3RtcDggPSAmKHRtcF9yZXNbMF1bal0pOyAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCisgICAgICAgIHBfdG1wOCAtPSAyNDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcGtyZXMpOyAvKiBsaW1pdCAqLworICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkgIC8qIHRoZSBsb29wIHVuLXJvbGxlZCAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVhZCAxIGJ5dGUgYXQgYSB0aW1lIGlzIHRvbyBzbG93LCB0b28gbWFueSByZWFkIGFuZCBwYWNrIG9wcywgbmVlZCB0byBjYWxsIENyZWF0ZUFsaWduICovCisgICAgICAgICAgICAvKnBfcmVmOCA9IHBfcmVmLShpbnBpdGNoPDwxKTsgICAgICAgICAgcjAgPSBwX3JlZjhbMF07ICAgICAgICAgcjEgPSBwX3JlZjhbMl07CisgICAgICAgICAgICByMCB8PSAocjE8PDE2KTsgICAgICAgICByNiA9IHBfcmVmOFsxXTsgICAgICAgICByMSA9IHBfcmVmOFszXTsKKyAgICAgICAgICAgIHI2IHw9IChyMTw8MTYpOyAgICAgICAgIHBfcmVmKz1pbnBpdGNoOyAqLworICAgICAgICAgICAgcjAgPSAqKCh1aW50MzIqKShwX3JlZiAtIChpbnBpdGNoIDw8IDEpKSk7IC8qIGxvYWQgNCBieXRlcyAqLworICAgICAgICAgICAgcF9yZWYgKz0gaW5waXRjaDsKKyAgICAgICAgICAgIHI2ID0gKHIwID4+IDgpICYgMHhGRjAwRkY7IC8qIHNlY29uZCBhbmQgZm91cnRoIGJ5dGUgKi8KKyAgICAgICAgICAgIHIwICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAvKnBfcmVmOCA9IHBfcmVmKyhpbnBpdGNoPDwxKTsKKyAgICAgICAgICAgIHIxID0gcF9yZWY4WzBdOyAgICAgICAgIHI3ID0gcF9yZWY4WzJdOyAgICAgICAgIHIxIHw9IChyNzw8MTYpOworICAgICAgICAgICAgcjcgPSBwX3JlZjhbMV07ICAgICAgICAgcjIgPSBwX3JlZjhbM107ICAgICAgICAgcjcgfD0gKHIyPDwxNik7Ki8KKyAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyAoaW5waXRjaCA8PCAxKSkpOyAgLyogcjEsIHI3LCByZWZbM10gKi8KKyAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgcjAgKz0gcjE7CisgICAgICAgICAgICByNiArPSByNzsKKworICAgICAgICAgICAgLypyMiA9IHBfcmVmWzBdOyAgICAgICAgICAgIHI4ID0gcF9yZWZbMl07ICAgICAgICAgIHIyIHw9IChyODw8MTYpOworICAgICAgICAgICAgcjggPSBwX3JlZlsxXTsgICAgICAgICAgcjEgPSBwX3JlZlszXTsgICAgICAgICAgcjggfD0gKHIxPDwxNik7Ki8KKyAgICAgICAgICAgIHIyID0gKigodWludDMyKilwX3JlZik7IC8qIHIyLCByOCwgcmVmWzFdICovCisgICAgICAgICAgICByOCA9IChyMiA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcjIgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIC8qcF9yZWY4ID0gcF9yZWYtaW5waXRjaDsgICAgICAgICAgIHIxID0gcF9yZWY4WzBdOyAgICAgICAgIHI3ID0gcF9yZWY4WzJdOworICAgICAgICAgICAgcjEgfD0gKHI3PDwxNik7ICAgICAgICAgcjEgKz0gcjI7ICAgICAgICAgICByNyA9IHBfcmVmOFsxXTsKKyAgICAgICAgICAgIHIyID0gcF9yZWY4WzNdOyAgICAgICAgIHI3IHw9IChyMjw8MTYpOyovCisgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmIC0gaW5waXRjaCkpOyAvKiByMSwgcjcsIHJlZlswXSAqLworICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworICAgICAgICAgICAgcjEgKz0gcjI7CisKKyAgICAgICAgICAgIHI3ICs9IHI4OworCisgICAgICAgICAgICByMCArPSAyMCAqIHIxOworICAgICAgICAgICAgcjYgKz0gMjAgKiByNzsKKyAgICAgICAgICAgIHIwICs9IDB4MTAwMDEwOworICAgICAgICAgICAgcjYgKz0gMHgxMDAwMTA7CisKKyAgICAgICAgICAgIC8qcF9yZWY4ID0gcF9yZWYtKGlucGl0Y2g8PDEpOyAgICAgICAgICByMiA9IHBfcmVmOFswXTsgICAgICAgICByOCA9IHBfcmVmOFsyXTsKKyAgICAgICAgICAgIHIyIHw9IChyODw8MTYpOyAgICAgICAgIHI4ID0gcF9yZWY4WzFdOyAgICAgICAgIHIxID0gcF9yZWY4WzNdOyAgICAgICAgIHI4IHw9IChyMTw8MTYpOyovCisgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogcjIsIHI4LCByZWZbLTFdICovCisgICAgICAgICAgICByOCA9IChyMiA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcjIgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIC8qcF9yZWY4ID0gcF9yZWYraW5waXRjaDsgICAgICAgICAgIHIxID0gcF9yZWY4WzBdOyAgICAgICAgIHI3ID0gcF9yZWY4WzJdOworICAgICAgICAgICAgcjEgfD0gKHI3PDwxNik7ICAgICAgICAgcjEgKz0gcjI7ICAgICAgICAgICByNyA9IHBfcmVmOFsxXTsKKyAgICAgICAgICAgIHIyID0gcF9yZWY4WzNdOyAgICAgICAgIHI3IHw9IChyMjw8MTYpOyovCisgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgaW5waXRjaCkpOyAvKiByMSwgcjcsIHJlZlsyXSAqLworICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworICAgICAgICAgICAgcjEgKz0gcjI7CisKKyAgICAgICAgICAgIHI3ICs9IHI4OworCisgICAgICAgICAgICByMCAtPSA1ICogcjE7CisgICAgICAgICAgICByNiAtPSA1ICogcjc7CisKKyAgICAgICAgICAgIHIwID4+PSA1OworICAgICAgICAgICAgcjYgPj49IDU7CisgICAgICAgICAgICAvKiBjbGlwICovCisgICAgICAgICAgICByMTMgfD0gcjY7CisgICAgICAgICAgICByMTMgfD0gcjA7CisgICAgICAgICAgICAvL0NMSVBQQUNLKHI2LHJlc3VsdCkKKyAgICAgICAgICAgIC8qIGFkZCB3aXRoIGhvcml6b250YWwgcmVzdWx0cyAqLworICAgICAgICAgICAgcjEwID0gKigodWludDMyKikocF90bXA4ICs9IDI0KSk7CisgICAgICAgICAgICByOSA9IChyMTAgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHIxMCAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgcjAgKz0gcjEwOworICAgICAgICAgICAgcjAgKz0gMHgxMDAwMTsKKyAgICAgICAgICAgIHIwID0gKHIwID4+IDEpICYgMHhGRjAwRkY7ICAgLyogbWFzayB0byA4IGJ5dGVzICovCisKKyAgICAgICAgICAgIHI2ICs9IHI5OworICAgICAgICAgICAgcjYgKz0gMHgxMDAwMTsKKyAgICAgICAgICAgIHI2ID0gKHI2ID4+IDEpICYgMHhGRjAwRkY7ICAgLyogbWFzayB0byA4IGJ5dGVzICovCisKKyAgICAgICAgICAgIHIwIHw9IChyNiA8PCA4KTsgIC8qIHBhY2sgaXQgYmFjayAqLworICAgICAgICAgICAgKigodWludDMyKikocF9jdXIgKz0gb3V0cGl0Y2gpKSA9IHIwOworICAgICAgICB9CisgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG5leHQgcGl4ZWwgKi8KKyAgICAgICAgaWYgKHIxMyAmIDB4RkYwMDA3MDApIC8qIHRoaXMgY29sdW1uIG5lZWQgY2xpcHBpbmcgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcF9jdXIgLT0gNDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9yZWYgPSBpbjIgKyBpOworICAgICAgICAgICAgICAgIHBfdG1wOCA9ICYodG1wX3Jlc1swXVtqK2ldKTsgLyogaW50ZXJtZWRpYXRlIHJlc3VsdCAqLworICAgICAgICAgICAgICAgIHBfdG1wOCAtPSAyNDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHBrcmVzKTsgLyogbGltaXQgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkgIC8qIHRoZSBsb29wIHVuLXJvbGxlZCAgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiAtIChpbnBpdGNoIDw8IDEpKTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmIC0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmOworICAgICAgICAgICAgICAgICAgICByMyA9ICoocF9yZWYgKz0gaW5waXRjaCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLworICAgICAgICAgICAgICAgICAgICByNCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHI1ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgdG1wX3Jlc3VsdCA9ICoocF90bXA4ICs9IDI0KTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyB0bXBfcmVzdWx0ICsgMSk7ICAvKiBubyBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICB0bXBfcmVzdWx0ID0gKihwX3RtcDggKz0gMjQpOyAgLyogaW50ZXJtZWRpYXRlIHJlc3VsdCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgdG1wX3Jlc3VsdCArIDEpOyAgLyogbm8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICB0bXBfcmVzdWx0ID0gKihwX3RtcDggKz0gMjQpOyAgLyogaW50ZXJtZWRpYXRlIHJlc3VsdCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgdG1wX3Jlc3VsdCArIDEpOyAgLyogbm8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgdG1wX3Jlc3VsdCA9ICoocF90bXA4ICs9IDI0KTsgIC8qIGludGVybWVkaWF0ZSByZXN1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHRtcF9yZXN1bHQgKyAxKTsgIC8qIG5vIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2N1ciArPSAoY3Vycl9vZmZzZXQgLSAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKy8qIHBvc2l0aW9uIEcgKi8KK3ZvaWQgZUZ1bGxQZWxNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIGludCBpLCBqOworICAgIGludCBvZmZzZXRfaW4gPSBpbnBpdGNoIC0gYmxrd2lkdGg7CisgICAgaW50IG9mZnNldF9vdXQgPSBvdXRwaXRjaCAtIGJsa3dpZHRoOworICAgIHVpbnQzMiB0ZW1wOworICAgIHVpbnQ4IGJ5dGU7CisKKyAgICBpZiAoKCh1aW50MzIpaW4pJjMpCisgICAgeworICAgICAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IGJsa3dpZHRoOyBpID4gMDsgaSAtPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSAqaW4rKzsKKyAgICAgICAgICAgICAgICBieXRlID0gKmluKys7CisgICAgICAgICAgICAgICAgdGVtcCB8PSAoYnl0ZSA8PCA4KTsKKyAgICAgICAgICAgICAgICBieXRlID0gKmluKys7CisgICAgICAgICAgICAgICAgdGVtcCB8PSAoYnl0ZSA8PCAxNik7CisgICAgICAgICAgICAgICAgYnl0ZSA9ICppbisrOworICAgICAgICAgICAgICAgIHRlbXAgfD0gKGJ5dGUgPDwgMjQpOworCisgICAgICAgICAgICAgICAgKigodWludDMyKilvdXQpID0gdGVtcDsgLyogd3JpdGUgNCBieXRlcyAqLworICAgICAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0ICs9IG9mZnNldF9vdXQ7CisgICAgICAgICAgICBpbiArPSBvZmZzZXRfaW47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBibGt3aWR0aDsgaSA+IDA7IGkgLT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKigodWludDMyKilpbik7CisgICAgICAgICAgICAgICAgKigodWludDMyKilvdXQpID0gdGVtcDsKKyAgICAgICAgICAgICAgICBpbiArPSA0OworICAgICAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0ICs9IG9mZnNldF9vdXQ7CisgICAgICAgICAgICBpbiArPSBvZmZzZXRfaW47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDsKK30KKwordm9pZCBlUGFkQ2hyb21hKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwgaW50IHBpY2hlaWdodCwgaW50IHBpY3BpdGNoLCBpbnQgeF9wb3MsIGludCB5X3BvcykKK3sKKyAgICBpbnQgcGFkX2hlaWdodDsKKyAgICBpbnQgcGFkX3dpZHRoOworICAgIHVpbnQ4ICpzdGFydDsKKyAgICB1aW50MzIgd29yZDEsIHdvcmQyLCB3b3JkMzsKKyAgICBpbnQgb2Zmc2V0LCBqOworCisKKyAgICBwYWRfaGVpZ2h0ID0gOCArICgoeV9wb3MgJiA3KSA/IDEgOiAwKTsKKyAgICBwYWRfd2lkdGggPSA4ICsgKCh4X3BvcyAmIDcpID8gMSA6IDApOworCisgICAgeV9wb3MgPj49IDM7CisgICAgeF9wb3MgPj49IDM7CisgICAgLy8gcGFkIHZlcnRpY2FsIGZpcnN0CisgICAgaWYgKHlfcG9zIDwgMCkgLy8gbmVlZCB0byBwYWQgdXAKKyAgICB7CisgICAgICAgIGlmICh4X3BvcyA8IC04KSBzdGFydCA9IHJlZiAtIDg7CisgICAgICAgIGVsc2UgaWYgKHhfcG9zICsgcGFkX3dpZHRoID4gcGljd2lkdGggKyA3KSBzdGFydCA9IHJlZiArIHBpY3dpZHRoICsgNyAtIHBhZF93aWR0aDsKKyAgICAgICAgZWxzZSBzdGFydCA9IHJlZiArIHhfcG9zOworCisgICAgICAgIC8qIHdvcmQtYWxpZ24gc3RhcnQgKi8KKyAgICAgICAgb2Zmc2V0ID0gKHVpbnQzMilzdGFydCAmIDB4MzsKKyAgICAgICAgaWYgKG9mZnNldCkgc3RhcnQgLT0gb2Zmc2V0OworCisgICAgICAgIHdvcmQxID0gKigodWludDMyKilzdGFydCk7CisgICAgICAgIHdvcmQyID0gKigodWludDMyKikoc3RhcnQgKyA0KSk7CisgICAgICAgIHdvcmQzID0gKigodWludDMyKikoc3RhcnQgKyA4KSk7CisKKyAgICAgICAgLyogcGFkIHVwIE4gcm93cyAqLworICAgICAgICBqID0gLXlfcG9zOworICAgICAgICBpZiAoaiA+IDgpIGogPSA4OworICAgICAgICB3aGlsZSAoai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCAtPSBwaWNwaXRjaCkpID0gd29yZDE7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCArIDQpKSA9IHdvcmQyOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKyA4KSkgPSB3b3JkMzsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UgaWYgKHlfcG9zICsgcGFkX2hlaWdodCA+PSBwaWNoZWlnaHQpIC8qIHBhZCBkb3duICovCisgICAgeworICAgICAgICBpZiAoeF9wb3MgPCAtOCkgc3RhcnQgPSByZWYgKyBwaWNwaXRjaCAqIChwaWNoZWlnaHQgLSAxKSAtIDg7CisgICAgICAgIGVsc2UgaWYgKHhfcG9zICsgcGFkX3dpZHRoID4gcGljd2lkdGggKyA3KSBzdGFydCA9IHJlZiArIHBpY3BpdGNoICogKHBpY2hlaWdodCAtIDEpICsKKyAgICAgICAgICAgICAgICAgICAgcGljd2lkdGggKyA3IC0gcGFkX3dpZHRoOworICAgICAgICBlbHNlICAgIHN0YXJ0ID0gcmVmICsgcGljcGl0Y2ggKiAocGljaGVpZ2h0IC0gMSkgKyB4X3BvczsKKworICAgICAgICAvKiB3b3JkLWFsaWduIHN0YXJ0ICovCisgICAgICAgIG9mZnNldCA9ICh1aW50MzIpc3RhcnQgJiAweDM7CisgICAgICAgIGlmIChvZmZzZXQpIHN0YXJ0IC09IG9mZnNldDsKKworICAgICAgICB3b3JkMSA9ICooKHVpbnQzMiopc3RhcnQpOworICAgICAgICB3b3JkMiA9ICooKHVpbnQzMiopKHN0YXJ0ICsgNCkpOworICAgICAgICB3b3JkMyA9ICooKHVpbnQzMiopKHN0YXJ0ICsgOCkpOworCisgICAgICAgIC8qIHBhZCBkb3duIE4gcm93cyAqLworICAgICAgICBqID0geV9wb3MgKyBwYWRfaGVpZ2h0IC0gcGljaGVpZ2h0OworICAgICAgICBpZiAoaiA+IDgpIGogPSA4OworICAgICAgICB3aGlsZSAoai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCArPSBwaWNwaXRjaCkpID0gd29yZDE7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCArIDQpKSA9IHdvcmQyOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKyA4KSkgPSB3b3JkMzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG5vdyBwYWQgaG9yaXpvbnRhbCAqLworICAgIGlmICh4X3BvcyA8IDApIC8vIHBhZCBsZWZ0CisgICAgeworICAgICAgICBpZiAoeV9wb3MgPCAtOCkgc3RhcnQgPSByZWYgLSAocGljcGl0Y2ggPDwgMyk7CisgICAgICAgIGVsc2UgaWYgKHlfcG9zICsgcGFkX2hlaWdodCA+IHBpY2hlaWdodCArIDcpIHN0YXJ0ID0gcmVmICsgKHBpY2hlaWdodCArIDcgLSBwYWRfaGVpZ2h0KSAqIHBpY3BpdGNoOworICAgICAgICBlbHNlIHN0YXJ0ID0gcmVmICsgeV9wb3MgKiBwaWNwaXRjaDsKKworICAgICAgICAvLyBub3cgcGFkIGxlZnQgOCBwaXhlbHMgZm9yIHBhZF9oZWlnaHQgcm93cyAqLworICAgICAgICBqID0gcGFkX2hlaWdodDsKKyAgICAgICAgc3RhcnQgLT0gcGljcGl0Y2g7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdvcmQxID0gKihzdGFydCArPSBwaWNwaXRjaCk7CisgICAgICAgICAgICB3b3JkMSB8PSAod29yZDEgPDwgOCk7CisgICAgICAgICAgICB3b3JkMSB8PSAod29yZDEgPDwgMTYpOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgLSA4KSkgPSB3b3JkMTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0IC0gNCkpID0gd29yZDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoeF9wb3MgKyBwYWRfd2lkdGggPj0gcGljd2lkdGgpIC8qIHBhZCByaWdodCAqLworICAgIHsKKyAgICAgICAgaWYgKHlfcG9zIDwgLTgpIHN0YXJ0ID0gcmVmIC0gKHBpY3BpdGNoIDw8IDMpICsgcGljd2lkdGggLSAxOworICAgICAgICBlbHNlIGlmICh5X3BvcyArIHBhZF9oZWlnaHQgPiBwaWNoZWlnaHQgKyA3KSBzdGFydCA9IHJlZiArIChwaWNoZWlnaHQgKyA3IC0gcGFkX2hlaWdodCkgKiBwaWNwaXRjaCArIHBpY3dpZHRoIC0gMTsKKyAgICAgICAgZWxzZSBzdGFydCA9IHJlZiArIHlfcG9zICogcGljcGl0Y2ggKyBwaWN3aWR0aCAtIDE7CisKKyAgICAgICAgLy8gbm93IHBhZCByaWdodCA4IHBpeGVscyBmb3IgcGFkX2hlaWdodCByb3dzICovCisgICAgICAgIGogPSBwYWRfaGVpZ2h0OworICAgICAgICBzdGFydCAtPSBwaWNwaXRjaDsKKyAgICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgd29yZDEgPSAqKHN0YXJ0ICs9IHBpY3BpdGNoKTsKKyAgICAgICAgICAgIHdvcmQxIHw9ICh3b3JkMSA8PCA4KTsKKyAgICAgICAgICAgIHdvcmQxIHw9ICh3b3JkMSA8PCAxNik7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCArIDEpKSA9IHdvcmQxOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKyA1KSkgPSB3b3JkMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBlQ2hyb21hTW90aW9uQ29tcCh1aW50OCAqcmVmLCBpbnQgcGljd2lkdGgsIGludCBwaWNoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3BvcywgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcHJlZCwgaW50IHBpY3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgaW50IGR4LCBkeTsKKyAgICBpbnQgb2Zmc2V0X2R4LCBvZmZzZXRfZHk7CisgICAgaW50IGluZGV4OworCisgICAgZVBhZENocm9tYShyZWYsIHBpY3dpZHRoLCBwaWNoZWlnaHQsIHBpY3BpdGNoLCB4X3BvcywgeV9wb3MpOworCisgICAgZHggPSB4X3BvcyAmIDc7CisgICAgZHkgPSB5X3BvcyAmIDc7CisgICAgb2Zmc2V0X2R4ID0gKGR4ICsgNykgPj4gMzsKKyAgICBvZmZzZXRfZHkgPSAoZHkgKyA3KSA+PiAzOworICAgIHhfcG9zID0geF9wb3MgPj4gMzsgIC8qIHJvdW5kIGl0IHRvIGZ1bGwtcGVsIHJlc29sdXRpb24gKi8KKyAgICB5X3BvcyA9IHlfcG9zID4+IDM7CisKKyAgICByZWYgKz0geV9wb3MgKiBwaWNwaXRjaCArIHhfcG9zOworCisgICAgaW5kZXggPSBvZmZzZXRfZHggKyAob2Zmc2V0X2R5IDw8IDEpICsgKChibGt3aWR0aCA8PCAxKSAmIDB4Nyk7CisKKyAgICAoKihlQ2hyb21hTUNfU0lNRFtpbmRleF0pKShyZWYsIHBpY3BpdGNoICwgZHgsIGR5LCBwcmVkLCBwaWNwaXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCk7CisgICAgcmV0dXJuIDsKK30KKworCisvKiBTSU1EIHJvdXRpbmVzLCB1bnJvbGwgdGhlIGxvb3BzIGluIHZlcnRpY2FsIGRpcmVjdGlvbiwgZGVjcmVhc2luZyBsb29wcyAodGhpbmdzIHRvIGJlIGRvbmUpICovCit2b2lkIGVDaHJvbWFEaWFnb25hbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICBpbnQzMiByMCwgcjEsIHIyLCByMywgcmVzdWx0MCwgcmVzdWx0MTsKKyAgICB1aW50OCB0ZW1wWzI4OF07CisgICAgdWludDggKnJlZiwgKm91dDsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgZHhfOCA9IDggLSBkeDsKKyAgICBpbnQgZHlfOCA9IDggLSBkeTsKKworICAgIC8qIGhvcml6b250YWwgZmlyc3QgKi8KKyAgICBvdXQgPSB0ZW1wOworICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQgKyAxOyBpKyspCisgICAgeworICAgICAgICByZWYgPSBwUmVmOworICAgICAgICByMCA9IHJlZlswXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqICs9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHIwIHw9IChyZWZbMl0gPDwgMTYpOworICAgICAgICAgICAgcmVzdWx0MCA9IGR4XzggKiByMDsKKworICAgICAgICAgICAgcjEgPSByZWZbMV0gfCAocmVmWzNdIDw8IDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDAgKz0gZHggKiByMTsKKyAgICAgICAgICAgICooaW50MzIgKilvdXQgPSByZXN1bHQwOworCisgICAgICAgICAgICByZXN1bHQwID0gZHhfOCAqIHIxOworCisgICAgICAgICAgICByMiA9IHJlZls0XTsKKyAgICAgICAgICAgIHIwID0gcjAgPj4gMTY7CisgICAgICAgICAgICByMSA9IHIwIHwgKHIyIDw8IDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDAgKz0gZHggKiByMTsKKyAgICAgICAgICAgICooaW50MzIgKikob3V0ICsgMTYpID0gcmVzdWx0MDsKKworICAgICAgICAgICAgcmVmICs9IDQ7CisgICAgICAgICAgICBvdXQgKz0gNDsKKyAgICAgICAgICAgIHIwID0gcjI7CisgICAgICAgIH0KKyAgICAgICAgcFJlZiArPSBzcmNQaXRjaDsKKyAgICAgICAgb3V0ICs9ICgzMiAtIGJsa3dpZHRoKTsKKyAgICB9CisKKy8vICBwUmVmIC09IHNyY1BpdGNoKihibGtoZWlnaHQrMSk7CisgICAgcmVmID0gdGVtcDsKKworICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaiArPSA0KQorICAgIHsKKyAgICAgICAgcjAgPSAqKGludDMyICopcmVmOworICAgICAgICByMSA9ICooaW50MzIgKikocmVmICsgMTYpOworICAgICAgICByZWYgKz0gMzI7CisgICAgICAgIG91dCA9IHBPdXQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoYmxraGVpZ2h0ID4+IDEpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdDAgPSBkeV84ICogcjAgKyAweDAwMjAwMDIwOworICAgICAgICAgICAgcjIgPSAqKGludDMyICopcmVmOworICAgICAgICAgICAgcmVzdWx0MCArPSBkeSAqIHIyOworICAgICAgICAgICAgcmVzdWx0MCA+Pj0gNjsKKyAgICAgICAgICAgIHJlc3VsdDAgJj0gMHgwMEZGMDBGRjsKKyAgICAgICAgICAgIHIwID0gcjI7CisKKyAgICAgICAgICAgIHJlc3VsdDEgPSBkeV84ICogcjEgKyAweDAwMjAwMDIwOworICAgICAgICAgICAgcjMgPSAqKGludDMyICopKHJlZiArIDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDEgKz0gZHkgKiByMzsKKyAgICAgICAgICAgIHJlc3VsdDEgPj49IDY7CisgICAgICAgICAgICByZXN1bHQxICY9IDB4MDBGRjAwRkY7CisgICAgICAgICAgICByMSA9IHIzOworICAgICAgICAgICAgKihpbnQzMiAqKW91dCA9IHJlc3VsdDAgfCAocmVzdWx0MSA8PCA4KTsKKyAgICAgICAgICAgIG91dCArPSBwcmVkUGl0Y2g7CisgICAgICAgICAgICByZWYgKz0gMzI7CisKKyAgICAgICAgICAgIHJlc3VsdDAgPSBkeV84ICogcjAgKyAweDAwMjAwMDIwOworICAgICAgICAgICAgcjIgPSAqKGludDMyICopcmVmOworICAgICAgICAgICAgcmVzdWx0MCArPSBkeSAqIHIyOworICAgICAgICAgICAgcmVzdWx0MCA+Pj0gNjsKKyAgICAgICAgICAgIHJlc3VsdDAgJj0gMHgwMEZGMDBGRjsKKyAgICAgICAgICAgIHIwID0gcjI7CisKKyAgICAgICAgICAgIHJlc3VsdDEgPSBkeV84ICogcjEgKyAweDAwMjAwMDIwOworICAgICAgICAgICAgcjMgPSAqKGludDMyICopKHJlZiArIDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDEgKz0gZHkgKiByMzsKKyAgICAgICAgICAgIHJlc3VsdDEgPj49IDY7CisgICAgICAgICAgICByZXN1bHQxICY9IDB4MDBGRjAwRkY7CisgICAgICAgICAgICByMSA9IHIzOworICAgICAgICAgICAgKihpbnQzMiAqKW91dCA9IHJlc3VsdDAgfCAocmVzdWx0MSA8PCA4KTsKKyAgICAgICAgICAgIG91dCArPSBwcmVkUGl0Y2g7CisgICAgICAgICAgICByZWYgKz0gMzI7CisgICAgICAgIH0KKyAgICAgICAgcE91dCArPSA0OworICAgICAgICByZWYgPSB0ZW1wICsgNDsgLyogc2luY2UgaXQgY2FuIG9ubHkgaXRlcmF0ZSB0d2ljZSBtYXggKi8KKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGVDaHJvbWFIb3Jpem9udGFsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgKHZvaWQpKGR5KTsKKworICAgIGludDMyIHIwLCByMSwgcjIsIHJlc3VsdDAsIHJlc3VsdDE7CisgICAgdWludDggKnJlZiwgKm91dDsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgZHhfOCA9IDggLSBkeDsKKworICAgIC8qIGhvcml6b250YWwgZmlyc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxraGVpZ2h0OyBpKyspCisgICAgeworICAgICAgICByZWYgPSBwUmVmOworICAgICAgICBvdXQgPSBwT3V0OworCisgICAgICAgIHIwID0gcmVmWzBdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgcjAgfD0gKHJlZlsyXSA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQwID0gZHhfOCAqIHIwICsgMHgwMDA0MDAwNDsKKworICAgICAgICAgICAgcjEgPSByZWZbMV0gfCAocmVmWzNdIDw8IDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDAgKz0gZHggKiByMTsKKyAgICAgICAgICAgIHJlc3VsdDAgPj49IDM7CisgICAgICAgICAgICByZXN1bHQwICY9IDB4MDBGRjAwRkY7CisKKyAgICAgICAgICAgIHJlc3VsdDEgPSBkeF84ICogcjEgKyAweDAwMDQwMDA0OworCisgICAgICAgICAgICByMiA9IHJlZls0XTsKKyAgICAgICAgICAgIHIwID0gcjAgPj4gMTY7CisgICAgICAgICAgICByMSA9IHIwIHwgKHIyIDw8IDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDEgKz0gZHggKiByMTsKKyAgICAgICAgICAgIHJlc3VsdDEgPj49IDM7CisgICAgICAgICAgICByZXN1bHQxICY9IDB4MDBGRjAwRkY7CisKKyAgICAgICAgICAgICooaW50MzIgKilvdXQgPSByZXN1bHQwIHwgKHJlc3VsdDEgPDwgOCk7CisKKyAgICAgICAgICAgIHJlZiArPSA0OworICAgICAgICAgICAgb3V0ICs9IDQ7CisgICAgICAgICAgICByMCA9IHIyOworICAgICAgICB9CisKKyAgICAgICAgcFJlZiArPSBzcmNQaXRjaDsKKyAgICAgICAgcE91dCArPSBwcmVkUGl0Y2g7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBlQ2hyb21hVmVydGljYWxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgKHZvaWQpKGR4KTsKKworICAgIGludDMyIHIwLCByMSwgcjIsIHIzLCByZXN1bHQwLCByZXN1bHQxOworICAgIGludCBpLCBqOworICAgIHVpbnQ4ICpyZWYsICpvdXQ7CisgICAgaW50IGR5XzggPSA4IC0gZHk7CisgICAgLyogdmVydGljYWwgZmlyc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxrd2lkdGg7IGkgKz0gNCkKKyAgICB7CisgICAgICAgIHJlZiA9IHBSZWY7CisgICAgICAgIG91dCA9IHBPdXQ7CisKKyAgICAgICAgcjAgPSByZWZbMF0gfCAocmVmWzJdIDw8IDE2KTsKKyAgICAgICAgcjEgPSByZWZbMV0gfCAocmVmWzNdIDw8IDE2KTsKKyAgICAgICAgcmVmICs9IHNyY1BpdGNoOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxraGVpZ2h0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdDAgPSBkeV84ICogcjAgKyAweDAwMDQwMDA0OworICAgICAgICAgICAgcjIgPSByZWZbMF0gfCAocmVmWzJdIDw8IDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDAgKz0gZHkgKiByMjsKKyAgICAgICAgICAgIHJlc3VsdDAgPj49IDM7CisgICAgICAgICAgICByZXN1bHQwICY9IDB4MDBGRjAwRkY7CisgICAgICAgICAgICByMCA9IHIyOworCisgICAgICAgICAgICByZXN1bHQxID0gZHlfOCAqIHIxICsgMHgwMDA0MDAwNDsKKyAgICAgICAgICAgIHIzID0gcmVmWzFdIHwgKHJlZlszXSA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQxICs9IGR5ICogcjM7CisgICAgICAgICAgICByZXN1bHQxID4+PSAzOworICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOworICAgICAgICAgICAgcjEgPSByMzsKKyAgICAgICAgICAgICooaW50MzIgKilvdXQgPSByZXN1bHQwIHwgKHJlc3VsdDEgPDwgOCk7CisgICAgICAgICAgICByZWYgKz0gc3JjUGl0Y2g7CisgICAgICAgICAgICBvdXQgKz0gcHJlZFBpdGNoOworICAgICAgICB9CisgICAgICAgIHBPdXQgKz0gNDsKKyAgICAgICAgcFJlZiArPSA0OworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgZUNocm9tYURpYWdvbmFsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCAgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShibGt3aWR0aCk7CisKKyAgICBpbnQzMiByMCwgcjEsIHRlbXAwLCB0ZW1wMSwgcmVzdWx0OworICAgIGludDMyIHRlbXBbOV07CisgICAgaW50MzIgKm91dDsKKyAgICBpbnQgaSwgcl90ZW1wOworICAgIGludCBkeV84ID0gOCAtIGR5OworCisgICAgLyogaG9yaXpvbnRhbCBmaXJzdCAqLworICAgIG91dCA9IHRlbXA7CisgICAgZm9yIChpID0gMDsgaSA8IGJsa2hlaWdodCArIDE7IGkrKykKKyAgICB7CisgICAgICAgIHJfdGVtcCA9IHBSZWZbMV07CisgICAgICAgIHRlbXAwID0gKHBSZWZbMF0gPDwgMykgKyBkeCAqIChyX3RlbXAgLSBwUmVmWzBdKTsKKyAgICAgICAgdGVtcDEgPSAocl90ZW1wIDw8IDMpICsgZHggKiAocFJlZlsyXSAtIHJfdGVtcCk7CisgICAgICAgIHIwID0gdGVtcDAgfCAodGVtcDEgPDwgMTYpOworICAgICAgICAqb3V0KysgPSByMDsKKyAgICAgICAgcFJlZiArPSBzcmNQaXRjaDsKKyAgICB9CisKKyAgICBwUmVmIC09IHNyY1BpdGNoICogKGJsa2hlaWdodCArIDEpOworCisgICAgb3V0ID0gdGVtcDsKKworICAgIHIwID0gKm91dCsrOworCisgICAgZm9yIChpID0gMDsgaSA8IGJsa2hlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gZHlfOCAqIHIwICsgMHgwMDIwMDAyMDsKKyAgICAgICAgcjEgPSAqb3V0Kys7CisgICAgICAgIHJlc3VsdCArPSBkeSAqIHIxOworICAgICAgICByZXN1bHQgPj49IDY7CisgICAgICAgIHJlc3VsdCAmPSAweDAwRkYwMEZGOworICAgICAgICAqKGludDE2ICopcE91dCA9IChyZXN1bHQgPj4gOCkgfCAocmVzdWx0ICYgMHhGRik7CisgICAgICAgIHIwID0gcjE7CisgICAgICAgIHBPdXQgKz0gcHJlZFBpdGNoOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgZUNocm9tYUhvcml6b250YWxNQzJfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShkeSk7CisgICAgKHZvaWQpKGJsa3dpZHRoKTsKKworICAgIGludCBpLCB0ZW1wLCB0ZW1wMCwgdGVtcDE7CisKKyAgICAvKiBob3Jpem9udGFsIGZpcnN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IGJsa2hlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgdGVtcCA9IHBSZWZbMV07CisgICAgICAgIHRlbXAwID0gKChwUmVmWzBdIDw8IDMpICsgZHggKiAodGVtcCAtIHBSZWZbMF0pICsgNCkgPj4gMzsKKyAgICAgICAgdGVtcDEgPSAoKHRlbXAgPDwgMykgKyBkeCAqIChwUmVmWzJdIC0gdGVtcCkgKyA0KSA+PiAzOworCisgICAgICAgICooaW50MTYgKilwT3V0ID0gdGVtcDAgfCAodGVtcDEgPDwgOCk7CisgICAgICAgIHBSZWYgKz0gc3JjUGl0Y2g7CisgICAgICAgIHBPdXQgKz0gcHJlZFBpdGNoOworCisgICAgfQorICAgIHJldHVybjsKK30KK3ZvaWQgZUNocm9tYVZlcnRpY2FsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgKHZvaWQpKGR4KTsKKyAgICAodm9pZCkoYmxrd2lkdGgpOworCisgICAgaW50MzIgcjAsIHIxLCByZXN1bHQ7CisgICAgaW50IGk7CisgICAgaW50IGR5XzggPSA4IC0gZHk7CisgICAgcjAgPSBwUmVmWzBdIHwgKHBSZWZbMV0gPDwgMTYpOworICAgIHBSZWYgKz0gc3JjUGl0Y2g7CisgICAgZm9yIChpID0gMDsgaSA8IGJsa2hlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gZHlfOCAqIHIwICsgMHgwMDA0MDAwNDsKKyAgICAgICAgcjEgPSBwUmVmWzBdIHwgKHBSZWZbMV0gPDwgMTYpOworICAgICAgICByZXN1bHQgKz0gZHkgKiByMTsKKyAgICAgICAgcmVzdWx0ID4+PSAzOworICAgICAgICByZXN1bHQgJj0gMHgwMEZGMDBGRjsKKyAgICAgICAgKihpbnQxNiAqKXBPdXQgPSAocmVzdWx0ID4+IDgpIHwgKHJlc3VsdCAmIDB4RkYpOworICAgICAgICByMCA9IHIxOworICAgICAgICBwUmVmICs9IHNyY1BpdGNoOworICAgICAgICBwT3V0ICs9IHByZWRQaXRjaDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGVDaHJvbWFGdWxsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgKHZvaWQpKGR4KTsKKyAgICAodm9pZCkoZHkpOworCisgICAgaW50IGksIGo7CisgICAgaW50IG9mZnNldF9pbiA9IHNyY1BpdGNoIC0gYmxrd2lkdGg7CisgICAgaW50IG9mZnNldF9vdXQgPSBwcmVkUGl0Y2ggLSBibGt3aWR0aDsKKyAgICB1aW50MTYgdGVtcDsKKyAgICB1aW50OCBieXRlOworCisgICAgaWYgKCgodWludDMyKXBSZWYpJjEpCisgICAgeworICAgICAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IGJsa3dpZHRoOyBpID4gMDsgaSAtPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSAqcFJlZisrOworICAgICAgICAgICAgICAgIGJ5dGUgPSAqcFJlZisrOworICAgICAgICAgICAgICAgIHRlbXAgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgICAgICAgICAgKigodWludDE2KilwT3V0KSA9IHRlbXA7IC8qIHdyaXRlIDIgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICBwT3V0ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwT3V0ICs9IG9mZnNldF9vdXQ7CisgICAgICAgICAgICBwUmVmICs9IG9mZnNldF9pbjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IGJsa3dpZHRoOyBpID4gMDsgaSAtPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSAqKCh1aW50MTYqKXBSZWYpOworICAgICAgICAgICAgICAgICooKHVpbnQxNiopcE91dCkgPSB0ZW1wOworICAgICAgICAgICAgICAgIHBSZWYgKz0gMjsKKyAgICAgICAgICAgICAgICBwT3V0ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwT3V0ICs9IG9mZnNldF9vdXQ7CisgICAgICAgICAgICBwUmVmICs9IG9mZnNldF9pbjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL21vdGlvbl9lc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL21vdGlvbl9lc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTBlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvbW90aW9uX2VzdC5jcHAKQEAgLTAsMCArMSwxNzc0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworI2RlZmluZSBNSU5fR09QICAgICAxICAgLyogbWluaW11bSBzaXplIG9mIEdPUCwgMS8yMy8wMSwgbmVlZCB0byBiZSB0ZXN0ZWQgKi8KKworI2RlZmluZSBERUZBVUxUX1JFRl9JRFggICAgIDAgIC8qIGFsd2F5cyBmcm9tIHRoZSBmaXJzdCBmcmFtZSBpbiB0aGUgcmVmbGlzdCAqLworCisjZGVmaW5lIEFMTF9DQU5EX0VRVUFMICAxMCAgLyogIGFueSBudW1iZXIgZ3JlYXRlciB0aGFuIDUgd2lsbCB3b3JrICovCisKKworLyogZnJvbSBUTU4gMy4yICovCisjZGVmaW5lIFBSRUZfTlVMTF9WRUMgMTI5ICAgLyogemVybyB2ZWN0b3IgYmlhcyAqLworI2RlZmluZSBQUkVGXzE2X1ZFQyAxMjkgICAgIC8qIDFNViBiaWFzIHZlcnN1cyA0TVZzKi8KKyNkZWZpbmUgUFJFRl9JTlRSQSAgMzAyNC8vNTEyICAgICAgIC8qIGJpYXMgZm9yIElOVFJBIGNvZGluZyAqLworCitjb25zdCBzdGF0aWMgaW50IHRhYl9leGNsdWRlWzldWzldID0gIC8vIFtsYXN0X2xvY11bY3Vycl9sb2NdCit7CisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIHswLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMX0sCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDF9LAorICAgIHswLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAxfSwKKyAgICB7MCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMX0sCisgICAgezAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDF9LAorICAgIHswLCAwLCAxLCAxLCAxLCAwLCAwLCAwLCAwfSwKKyAgICB7MCwgMCwgMSwgMSwgMSwgMSwgMSwgMCwgMH0KK307IC8vdG8gZGVjaWRlIHdoZXRoZXIgdG8gY29udGludWUgb3IgY29tcHV0ZQorCitjb25zdCBzdGF0aWMgaW50IHJlZmluZV9uZXh0WzhdWzJdID0gICAgLyogW2N1cnJfa11baW5jcmVtZW50XSAqLworeworICAgIHswLCAwfSwgezIsIDB9LCB7MSwgMX0sIHswLCAyfSwgeyAtMSwgMX0sIHsgLTIsIDB9LCB7IC0xLCAtMX0sIHswLCAtMn0KK307CisKKyNpZmRlZiBfU0FEX1NUQVQKK3VpbnQzMiBudW1fTUIgPSAwOwordWludDMyIG51bV9jYW5kID0gMDsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUSF9JTlRFUl8yICAxMDAgIC8qIHRlbXBvcmFyeSBmb3Igbm93ICovCisKKy8vI2RlZmluZSBGSVhFRF9JTlRFUlBSRURfTU9ERSAgQVZDX1AxNgorI2RlZmluZSBGSVhFRF9SRUZfSURYICAgMAorI2RlZmluZSBGSVhFRF9NVlggMAorI2RlZmluZSBGSVhFRF9NVlkgMAorCisvLyBvbmx5IHVzZSB3aGVuIEFWQ19QOCBvciBBVkNfUDhyZWYwCisjZGVmaW5lIEZJWEVEX1NVQk1CX01PREUgICAgQVZDXzR4NAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluaXRpYWxpemUgYXJyYXlzIG5lY2Vzc2FyeSBmb3IgbW90aW9uIHNlYXJjaCAqLworQVZDRW5jX1N0YXR1cyBJbml0TW90aW9uU2VhcmNoTW9kdWxlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgaW50IHNlYXJjaF9yYW5nZSA9IHJhdGVDdHJsLT5tdlJhbmdlOworICAgIGludCBudW1iZXJfb2Zfc3VicGVsX3Bvc2l0aW9ucyA9IDQgKiAoMiAqIHNlYXJjaF9yYW5nZSArIDMpOworICAgIGludCBtYXhfbXZfYml0cywgbWF4X212ZDsKKyAgICBpbnQgdGVtcF9iaXRzID0gMDsKKyAgICB1aW50OCAqbXZiaXRzOworICAgIGludCBiaXRzLCBpbWF4LCBpbWluLCBpOworICAgIHVpbnQ4KiBzdWJwZWxfcHJlZCA9ICh1aW50OCopIGVuY3ZpZC0+c3VicGVsX3ByZWQ7IC8vIGFsbCAxNiBzdWItcGVsIHBvc2l0aW9ucworCisKKyAgICB3aGlsZSAobnVtYmVyX29mX3N1YnBlbF9wb3NpdGlvbnMgPiAwKQorICAgIHsKKyAgICAgICAgdGVtcF9iaXRzKys7CisgICAgICAgIG51bWJlcl9vZl9zdWJwZWxfcG9zaXRpb25zID4+PSAxOworICAgIH0KKworICAgIG1heF9tdl9iaXRzID0gMyArIDIgKiB0ZW1wX2JpdHM7CisgICAgbWF4X212ZCAgPSAoMSA8PCAobWF4X212X2JpdHMgPj4gMSkpIC0gMTsKKworICAgIGVuY3ZpZC0+bXZiaXRzX2FycmF5ID0gKHVpbnQ4KikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2MoZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4KSAqICgyICogbWF4X212ZCArIDEpLCBERUZBVUxUX0FUVFIpOworCisgICAgaWYgKGVuY3ZpZC0+bXZiaXRzX2FycmF5ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKworICAgIG12Yml0cyA9IGVuY3ZpZC0+bXZiaXRzICA9IGVuY3ZpZC0+bXZiaXRzX2FycmF5ICsgbWF4X212ZDsKKworICAgIG12Yml0c1swXSA9IDE7CisgICAgZm9yIChiaXRzID0gMzsgYml0cyA8PSBtYXhfbXZfYml0czsgYml0cyArPSAyKQorICAgIHsKKyAgICAgICAgaW1heCA9IDEgICAgPDwgKGJpdHMgPj4gMSk7CisgICAgICAgIGltaW4gPSBpbWF4ID4+IDE7CisKKyAgICAgICAgZm9yIChpID0gaW1pbjsgaSA8IGltYXg7IGkrKykgICBtdmJpdHNbLWldID0gbXZiaXRzW2ldID0gYml0czsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIGhhbGYtcGVsIHNlYXJjaCAqLworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzBdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSOworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzFdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxIDsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFsyXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFszXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjU7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbNF0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI1OworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzVdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFs2XSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbN10gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzhdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7CisKKyAgICAvKiBGb3IgcXVhcnRlci1wZWwgaW50ZXJwb2xhdGlvbiBhcm91bmQgYmVzdCBoYWxmLXBlbCByZXN1bHQgKi8KKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVswXVswXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVswXVsxXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMF1bMl0gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVswXVszXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUjsKKworCisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzFdWzBdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzFdWzFdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSIC0gMjQ7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzFdWzJdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzFdWzNdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxOworCisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzJdWzBdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSIC0gMjQ7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzJdWzFdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsyXVsyXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMl1bM10gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbM11bMF0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzNdWzFdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVszXVsyXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUjsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbM11bM10gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI1OworCisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzRdWzBdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs0XVsxXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzRdWzJdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNF1bM10gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI1OworCisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzVdWzBdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNV1bMV0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVI7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzVdWzJdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNV1bM10gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI1OworCisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzZdWzBdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSIC0gMTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNl1bMV0gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs2XVsyXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzZdWzNdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs3XVswXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs3XVsxXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs3XVsyXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUiAtIDE7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzddWzNdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs4XVswXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUiAtIDI1OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs4XVsxXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs4XVsyXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs4XVszXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworCisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qIENsZWFuLXVwIG1lbW9yeSAqLwordm9pZCBDbGVhbk1vdGlvblNlYXJjaE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKworICAgIGlmIChlbmN2aWQtPm12Yml0c19hcnJheSkKKyAgICB7CisgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZShhdmNIYW5kbGUtPnVzZXJEYXRhLCAoaW50KShlbmN2aWQtPm12Yml0c19hcnJheSkpOworICAgICAgICBlbmN2aWQtPm12Yml0cyA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCitib29sIEludHJhRGVjaXNpb25BQkUoaW50ICptaW5fY29zdCwgdWludDggKmN1ciwgaW50IHBpdGNoLCBib29sIGF2ZSkKK3sKKyAgICBpbnQgajsKKyAgICB1aW50OCAqb3V0OworICAgIGludCB0ZW1wLCBTQkU7CisgICAgT3NjbEZsb2F0IEFCRTsKKyAgICBib29sIGludHJhID0gdHJ1ZTsKKworICAgIFNCRSA9IDA7CisgICAgLyogdG9wIG5laWdoYm9yICovCisgICAgb3V0ID0gY3VyIC0gcGl0Y2g7CisgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgeworICAgICAgICB0ZW1wID0gb3V0W2pdIC0gY3VyW2pdOworICAgICAgICBTQkUgKz0gKCh0ZW1wID49IDApID8gdGVtcCA6IC10ZW1wKTsKKyAgICB9CisKKyAgICAvKiBsZWZ0IG5laWdoYm9yICovCisgICAgb3V0ID0gY3VyIC0gMTsKKyAgICBvdXQgLT0gcGl0Y2g7CisgICAgY3VyIC09IHBpdGNoOworICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICoob3V0ICs9IHBpdGNoKSAtICooY3VyICs9IHBpdGNoKTsKKyAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgfQorCisgICAgLyogY29tcGFyZSBtaW5jb3N0LzM4NCBhbmQgU0JFLzY0ICovCisgICAgQUJFID0gU0JFIC8gMzIuMDsgLy9BQkUgPSBTQkUvNjQuMDsgLy8KKyAgICBpZiAoQUJFID49ICptaW5fY29zdCAvIDI1Ni4wKSAvL2lmKCBBQkUqMC44ID49IG1pbl9jb3N0LzM4NC4wKSAvLworICAgIHsKKyAgICAgICAgaW50cmEgPSBmYWxzZTsgLy8gbm8gcG9zc2liaWxpdHkgb2YgaW50cmEsIGp1c3QgdXNlIGludGVyCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChhdmUgPT0gdHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgKm1pbl9jb3N0ID0gKCptaW5fY29zdCArIChpbnQpKFNCRSAqIDgpKSA+PiAxOyAvLyBwb3NzaWJpbGl0eSBvZiBpbnRyYSwgYXZlcmFnaW5nIHRoZSBjb3N0CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqbWluX2Nvc3QgPSAoaW50KShTQkUgKiA4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbnRyYTsKK30KKworLyoqKioqKiogbWFpbiBmdW5jdGlvbiBmb3IgbWFjcm9ibG9jayBwcmVkaWN0aW9uIGZvciB0aGUgZW50aXJlIGZyYW1lICoqKi8KKy8qIGlmIHR1cm5zIG91dCB0byBiZSBJRFIgZnJhbWUsIHNldCB2aWRlby0+bmFsX3VuaXRfdHlwZSB0byBBVkNfTkFMVFlQRV9JRFIgKi8KK3ZvaWQgQVZDTW90aW9uRXN0aW1hdGlvbihBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50IHNsaWNlX3R5cGUgPSB2aWRlby0+c2xpY2VfdHlwZTsKKyAgICBBVkNGcmFtZUlPICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBBVkNQaWN0dXJlRGF0YSAqcmVmUGljID0gdmlkZW8tPlJlZlBpY0xpc3QwWzBdOworICAgIGludCBpLCBqLCBrOworICAgIGludCBtYndpZHRoID0gdmlkZW8tPlBpY1dpZHRoSW5NYnM7CisgICAgaW50IG1iaGVpZ2h0ID0gdmlkZW8tPlBpY0hlaWdodEluTWJzOworICAgIGludCB0b3RhbE1CID0gdmlkZW8tPlBpY1NpemVJbk1iczsKKyAgICBpbnQgcGl0Y2ggPSBjdXJySW5wdXQtPnBpdGNoOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgKm1ibG9jayA9IHZpZGVvLT5tYmxvY2s7CisgICAgQVZDTVYgKm1vdF9tYl8xNngxNiwgKm1vdDE2eDE2ID0gZW5jdmlkLT5tb3QxNngxNjsKKyAgICAvLyBBVkNNViAqbW90X21iXzE2eDgsICptb3RfbWJfOHgxNiwgKm1vdF9tYl84eDgsIGV0YzsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIHVpbnQ4ICppbnRyYVNlYXJjaCA9IGVuY3ZpZC0+aW50cmFTZWFyY2g7CisgICAgdWludCBGU19lbiA9IGVuY3ZpZC0+ZnVsbHNlYXJjaF9lbmFibGU7CisKKyAgICBpbnQgTnVtSW50cmFTZWFyY2gsIHN0YXJ0X2ksIG51bUxvb3AsIGluY3JfaTsKKyAgICBpbnQgbWJudW0sIG9mZnNldDsKKyAgICB1aW50OCAqY3VyLCAqYmVzdF9jYW5kWzVdOworICAgIGludCB0b3RhbFNBRCA9IDA7ICAgLyogYXZlcmFnZSBTQUQgZm9yIHJhdGUgY29udHJvbCAqLworICAgIGludCB0eXBlX3ByZWQ7CisgICAgaW50IGFiZV9jb3N0OworCisjaWZkZWYgSFRGTQorICAgIC8qKioqKiBIWVBPVEhFU0lTIFRFU1RJTkcgKioqKioqKiovICAvKiAyLzI4LzAxICovCisgICAgaW50IGNvbGxlY3QgPSAwOworICAgIEhURk1fU3RhdCBodGZtX3N0YXQ7CisgICAgZG91YmxlIG5ld3ZhclsxNl07CisgICAgZG91YmxlIGV4cF9sYW1kYVsxNV07CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZgorICAgIGludCBocF9ndWVzcyA9IDA7CisgICAgdWludDMyIG12X3VpbnQzMjsKKworICAgIG9mZnNldCA9IDA7CisKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfSV9TTElDRSkKKyAgICB7CisgICAgICAgIC8qIGNhbm5vdCBkbyBJMTYgcHJlZGljdGlvbiBoZXJlIGJlY2F1c2UgaXQgbmVlZHMgZnVsbCBkZWNvZGluZy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsTUI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZW5jdmlkLT5taW5fY29zdFtpXSA9IDB4N0ZGRkZGRkY7ICAvKiBtYXggdmFsdWUgZm9yIGludCAqLworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KGludHJhU2VhcmNoLCAxLCBzaXplb2YodWludDgpKnRvdGFsTUIpOworCisgICAgICAgIGVuY3ZpZC0+Zmlyc3RJbnRyYVJlZnJlc2hNQkluZHggPSAwOyAvKiByZXNldCB0aGlzICovCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgZWxzZSAgIC8vIFBfU0xJQ0UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbE1COyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG1ibG9ja1tpXS5tYl9pbnRyYSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGludHJhU2VhcmNoLCAxLCBzaXplb2YodWludDgpKnRvdGFsTUIpOworICAgIH0KKworICAgIGlmIChyZWZQaWMtPnBhZGRlZCA9PSAwKQorICAgIHsKKyAgICAgICAgQVZDUGFkZGluZ0VkZ2UocmVmUGljKTsKKyAgICAgICAgcmVmUGljLT5wYWRkZWQgPSAxOworICAgIH0KKyAgICAvKiBSYW5kb20gSU5UUkEgdXBkYXRlICovCisgICAgaWYgKHJhdGVDdHJsLT5pbnRyYU1CUmF0ZSkKKyAgICB7CisgICAgICAgIEFWQ1Jhc3RlckludHJhVXBkYXRlKGVuY3ZpZCwgbWJsb2NrLCB0b3RhbE1CLCByYXRlQ3RybC0+aW50cmFNQlJhdGUpOworICAgIH0KKworICAgIGVuY3ZpZC0+c2FkX2V4dHJhX2luZm8gPSBOVUxMOworI2lmZGVmIEhURk0KKyAgICAvKioqKiogSFlQT1RIRVNJUyBURVNUSU5HICoqKioqKioqLworICAgIEluaXRIVEZNKHZpZGVvLCAmaHRmbV9zdGF0LCBuZXd2YXIsICZjb2xsZWN0KTsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisKKyAgICBpZiAoKHJhdGVDdHJsLT5zY2RFbmFibGUgPT0gMSkKKyAgICAgICAgICAgICYmICgocmF0ZUN0cmwtPmZyYW1lX3JhdGUgPCA1LjApIHx8ICh2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bSA+IE1JTl9HT1ApKSkKKyAgICAgICAgLyogZG8gbm90IHRyeSB0byBkZXRlY3QgYSBuZXcgc2NlbmUgaWYgbG93IGZyYW1lIHJhdGUgYW5kIHRvbyBjbG9zZSB0byBwcmV2aW91cyBJLWZyYW1lICovCisgICAgeworICAgICAgICBpbmNyX2kgPSAyOworICAgICAgICBudW1Mb29wID0gMjsKKyAgICAgICAgc3RhcnRfaSA9IDE7CisgICAgICAgIHR5cGVfcHJlZCA9IDA7IC8qIGZvciBpbml0aWFsIGNhbmRpZGF0ZSBzZWxlY3Rpb24gKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW5jcl9pID0gMTsKKyAgICAgICAgbnVtTG9vcCA9IDE7CisgICAgICAgIHN0YXJ0X2kgPSAwOworICAgICAgICB0eXBlX3ByZWQgPSAyOworICAgIH0KKworICAgIC8qIEZpcnN0IHBhc3MsIGxvb3AgdGhydSBoYWxmIHRoZSBtYWNyb2Jsb2NrICovCisgICAgLyogZGV0ZXJtaW5lIHNjZW5lIGNoYW5nZSAqLworICAgIC8qIFNlY29uZCBwYXNzLCBmb3IgdGhlIHJlc3Qgb2YgbWFjcm9ibG9ja3MgKi8KKyAgICBOdW1JbnRyYVNlYXJjaCA9IDA7IC8vIHRvIGJlIGludHJhIHNlYXJjaGVkIGluIHRoZSBlbmNvZGluZyBsb29wLgorICAgIHdoaWxlIChudW1Mb29wLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWJoZWlnaHQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluY3JfaSA+IDEpCisgICAgICAgICAgICAgICAgc3RhcnRfaSA9IChzdGFydF9pID09IDAgPyAxIDogMCkgOyAvKiB0b2dnbGUgMCBhbmQgMSAqLworCisgICAgICAgICAgICBvZmZzZXQgPSBwaXRjaCAqIChqIDw8IDQpICsgKHN0YXJ0X2kgPDwgNCk7CisKKyAgICAgICAgICAgIG1ibnVtID0gaiAqIG1id2lkdGggKyBzdGFydF9pOworCisgICAgICAgICAgICBmb3IgKGkgPSBzdGFydF9pOyBpIDwgbWJ3aWR0aDsgaSArPSBpbmNyX2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm1iTnVtID0gbWJudW07CisgICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJNQiA9IGN1cnJNQiA9IG1ibG9jayArIG1ibnVtOworICAgICAgICAgICAgICAgIG1vdF9tYl8xNngxNiA9IG1vdDE2eDE2ICsgbWJudW07CisKKyAgICAgICAgICAgICAgICBjdXIgPSBjdXJySW5wdXQtPllDYkNyWzBdICsgb2Zmc2V0OworCisgICAgICAgICAgICAgICAgaWYgKGN1cnJNQi0+bWJfaW50cmEgPT0gMCkgLyogZm9yIElOVEVSIG1vZGUgKi8KKyAgICAgICAgICAgICAgICB7CisjaWYgZGVmaW5lZChIVEZNKQorICAgICAgICAgICAgICAgICAgICBIVEZNUHJlcGFyZUN1ck1CX0FWQyhlbmN2aWQsICZodGZtX3N0YXQsIGN1ciwgcGl0Y2gpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgQVZDUHJlcGFyZUN1ck1CKGVuY3ZpZCwgY3VyLCBwaXRjaCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqIGZ1bGwtcGVsIDFNViBzZWFyY2ggKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgICAgICAgICBBVkNNQk1vdGlvblNlYXJjaChlbmN2aWQsIGN1ciwgYmVzdF9jYW5kLCBpIDw8IDQsIGogPDwgNCwgdHlwZV9wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19lbiwgJmhwX2d1ZXNzKTsKKworICAgICAgICAgICAgICAgICAgICBhYmVfY29zdCA9IGVuY3ZpZC0+bWluX2Nvc3RbbWJudW1dID0gbW90X21iXzE2eDE2LT5zYWQ7CisKKyAgICAgICAgICAgICAgICAgICAgLyogc2V0IG1iTW9kZSBhbmQgTVZzICovCisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX1AxNjsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVswXVswXSA9IEFWQ19QcmVkX0wwOworICAgICAgICAgICAgICAgICAgICBtdl91aW50MzIgPSAoKG1vdF9tYl8xNngxNi0+eSkgPDwgMTYpIHwgKChtb3RfbWJfMTZ4MTYtPngpICYgMHhmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDMyOyBrICs9IDIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bXZMMFtrPj4xXSA9IG12X3VpbnQzMjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIG1ha2UgYSBkZWNpc2lvbiB3aGV0aGVyIGl0IHNob3VsZCBiZSB0ZXN0ZWQgZm9yIGludHJhIG9yIG5vdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBtYndpZHRoIC0gMSAmJiBqICE9IG1iaGVpZ2h0IC0gMSAmJiBpICE9IDAgJiYgaiAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFsc2UgPT0gSW50cmFEZWNpc2lvbkFCRSgmYWJlX2Nvc3QsIGN1ciwgcGl0Y2gsIHRydWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJhU2VhcmNoW21ibnVtXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtSW50cmFTZWFyY2grKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlQ3RybC0+TUFEb2ZNQlttYm51bV0gPSBhYmVfY29zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vIGJvdW5kYXJ5IE1CcywgYWx3YXlzIGRvIGludHJhIHNlYXJjaAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOdW1JbnRyYVNlYXJjaCsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdG90YWxTQUQgKz0gKGludCkgcmF0ZUN0cmwtPk1BRG9mTUJbbWJudW1dOy8vbW90X21iXzE2eDE2LT5zYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgICAgLyogSU5UUkEgdXBkYXRlLCB1c2UgZm9yIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1vdF9tYl8xNngxNlswXS54ID0gbW90X21iXzE2eDE2WzBdLnkgPSAwOworCisgICAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IGFsbCBvdGhlciBNVnMgdG8gemVybyAqLworICAgICAgICAgICAgICAgICAgICAvKiBtb3RfbWJfMTZ4OCwgbW90X21iXzh4MTYsIG1vdF9tYl84eDgsIGV0Yy4gKi8KKyAgICAgICAgICAgICAgICAgICAgYWJlX2Nvc3QgPSBlbmN2aWQtPm1pbl9jb3N0W21ibnVtXSA9IDB4N0ZGRkZGRkY7ICAvKiBtYXggdmFsdWUgZm9yIGludCAqLworCisgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IG1id2lkdGggLSAxICYmIGogIT0gbWJoZWlnaHQgLSAxICYmIGkgIT0gMCAmJiBqICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEludHJhRGVjaXNpb25BQkUoJmFiZV9jb3N0LCBjdXIsIHBpdGNoLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5NQURvZk1CW21ibnVtXSA9IGFiZV9jb3N0OworICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTQUQgKz0gYWJlX2Nvc3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBOdW1JbnRyYVNlYXJjaCsrIDsKKyAgICAgICAgICAgICAgICAgICAgLyogY2Fubm90IGRvIEkxNiBwcmVkaWN0aW9uIGhlcmUgYmVjYXVzZSBpdCBuZWVkcyBmdWxsIGRlY29kaW5nLiAqLworICAgICAgICAgICAgICAgICAgICAvLyBpbnRyYVNlYXJjaFttYm51bV0gPSAxOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWJudW0gKz0gaW5jcl9pOworICAgICAgICAgICAgICAgIG9mZnNldCArPSAoaW5jcl9pIDw8IDQpOworCisgICAgICAgICAgICB9IC8qIGZvciBpICovCisgICAgICAgIH0gLyogZm9yIGogKi8KKworICAgICAgICAvKiBzaW5jZSB3ZSBjYW5ub3QgZG8gaW50cmEvaW50ZXIgZGVjaXNpb24gaGVyZSwgdGhlIFNDRCBoYXMgdG8gYmUKKyAgICAgICAgYmFzZWQgb24gb3RoZXIgY3JpdGVyaWEgc3VjaCBhcyBtb3Rpb24gdmVjdG9ycyBjb2hlcmVuY3kgb3IgdGhlIFNBRCAqLworICAgICAgICBpZiAoaW5jcl9pID4gMSAmJiBudW1Mb29wKSAvKiBzY2VuZSBjaGFuZ2Ugb24gYW5kIGZpcnN0IGxvb3AgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLy9pZihOdW1JbnRyYVNlYXJjaCA+ICgodG90YWxNQj4+Myk8PDEpICsgKHRvdGFsTUI+PjMpKSAvKiA3NSUgb2YgNTAlTUJzICovCisgICAgICAgICAgICBpZiAoTnVtSW50cmFTZWFyY2gqOTkgPiAoNDgqdG90YWxNQikpIC8qIDIwJSBvZiA1MCVNQnMgKi8KKyAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIGRvIG1vcmUgaW52ZXN0aWdhdGlvbiBhYm91dCB0aGlzIHRocmVzaG9sZCBzaW5jZSB0aGUgTnVtSW50cmFTZWFyY2gKKyAgICAgICAgICAgICAgICBvbmx5IHNob3cgcG90ZW50aWFsIGludHJhIE1Ccywgbm90IHRoZSBhY3R1YWwgb25lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd2UgY2FuIGNob29zZSB0byBqdXN0IGVuY29kZSBJX1NMSUNFIHdpdGhvdXQgSURSICovCisgICAgICAgICAgICAgICAgLy92aWRlby0+bmFsX3VuaXRfdHlwZSA9IEFWQ19OQUxUWVBFX0lEUjsKKyAgICAgICAgICAgICAgICB2aWRlby0+bmFsX3VuaXRfdHlwZSA9IEFWQ19OQUxUWVBFX1NMSUNFOworICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZUhkci0+c2xpY2VfdHlwZSA9IEFWQ19JX0FMTF9TTElDRTsKKyAgICAgICAgICAgICAgICB2aWRlby0+c2xpY2VfdHlwZSA9IEFWQ19JX1NMSUNFOworICAgICAgICAgICAgICAgIG1lbXNldChpbnRyYVNlYXJjaCwgMSwgc2l6ZW9mKHVpbnQ4KSp0b3RhbE1CKTsKKyAgICAgICAgICAgICAgICBpID0gdG90YWxNQjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWJsb2NrW2ldLm1iX2ludHJhID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZW5jdmlkLT5taW5fY29zdFtpXSA9IDB4N0ZGRkZGRkY7ICAvKiBtYXggdmFsdWUgZm9yIGludCAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJhdGVDdHJsLT50b3RhbFNBRCA9IHRvdGFsU0FEICogMjsgIC8qIFNBRCAqLworCisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKioqKioqKiogbm8gc2NlbmUgY2hhbmdlLCBjb250aW51ZSBtb3Rpb24gc2VhcmNoICoqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHN0YXJ0X2kgPSAwOworICAgICAgICB0eXBlX3ByZWQrKzsgLyogc2Vjb25kIHBhc3MgKi8KKyAgICB9CisKKyAgICByYXRlQ3RybC0+dG90YWxTQUQgPSB0b3RhbFNBRDsgIC8qIFNBRCAqLworCisjaWZkZWYgSFRGTQorICAgIC8qKioqKiBIWVBPVEhFU0lTIFRFU1RJTkcgKioqKioqKiovCisgICAgaWYgKGNvbGxlY3QpCisgICAgeworICAgICAgICBjb2xsZWN0ID0gMDsKKyAgICAgICAgVXBkYXRlSFRGTShlbmN2aWQsIG5ld3ZhciwgZXhwX2xhbWRhLCAmaHRmbV9zdGF0KTsKKyAgICB9CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZgorCisgICAgcmV0dXJuIDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBQYWRkaW5nRWRnZQorICAgIERhdGU6ICAgICAgIDA5LzE2LzIwMDAKKyAgICBQdXJwb3NlOiAgICBQYWQgZWRnZSBvZiBhIFZvcAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCAgQVZDUGFkZGluZ0VkZ2UoQVZDUGljdHVyZURhdGEgKnJlZlBpYykKK3sKKyAgICB1aW50OCAqc3JjLCAqZHN0OworICAgIGludCBpOworICAgIGludCBwaXRjaCwgd2lkdGgsIGhlaWdodDsKKyAgICB1aW50MzIgdGVtcDEsIHRlbXAyOworCisgICAgd2lkdGggPSByZWZQaWMtPndpZHRoOworICAgIGhlaWdodCA9IHJlZlBpYy0+aGVpZ2h0OworICAgIHBpdGNoID0gcmVmUGljLT5waXRjaDsKKworICAgIC8qIHBhZCB0b3AgKi8KKyAgICBzcmMgPSByZWZQaWMtPlNsOworCisgICAgdGVtcDEgPSAqc3JjOyAvKiB0b3AtbGVmdCBjb3JuZXIgKi8KKyAgICB0ZW1wMiA9IHNyY1t3aWR0aC0xXTsgLyogdG9wLXJpZ2h0IGNvcm5lciAqLworICAgIHRlbXAxIHw9ICh0ZW1wMSA8PCA4KTsKKyAgICB0ZW1wMSB8PSAodGVtcDEgPDwgMTYpOworICAgIHRlbXAyIHw9ICh0ZW1wMiA8PCA4KTsKKyAgICB0ZW1wMiB8PSAodGVtcDIgPDwgMTYpOworCisgICAgZHN0ID0gc3JjIC0gKHBpdGNoIDw8IDQpOworCisgICAgKigodWludDMyKikoZHN0IC0gMTYpKSA9IHRlbXAxOworICAgICooKHVpbnQzMiopKGRzdCAtIDEyKSkgPSB0ZW1wMTsKKyAgICAqKCh1aW50MzIqKShkc3QgLSA4KSkgPSB0ZW1wMTsKKyAgICAqKCh1aW50MzIqKShkc3QgLSA0KSkgPSB0ZW1wMTsKKworICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworCisgICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSB0ZW1wMjsKKyAgICAqKCh1aW50MzIqKShkc3QgKyA0KSkgPSB0ZW1wMjsKKyAgICAqKCh1aW50MzIqKShkc3QgKyA4KSkgPSB0ZW1wMjsKKyAgICAqKCh1aW50MzIqKShkc3QgKyAxMikpID0gdGVtcDI7CisKKyAgICBkc3QgPSBkc3QgLSB3aWR0aCAtIDE2OworCisgICAgaSA9IDE1OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICBtZW1jcHkoZHN0ICsgcGl0Y2gsIGRzdCwgcGl0Y2gpOworICAgICAgICBkc3QgKz0gcGl0Y2g7CisgICAgfQorCisgICAgLyogcGFkIHNpZGVzICovCisgICAgZHN0ICs9IChwaXRjaCArIDE2KTsKKyAgICBzcmMgPSBkc3Q7CisgICAgaSA9IGhlaWdodDsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgdGVtcDEgPSAqc3JjOworICAgICAgICB0ZW1wMiA9IHNyY1t3aWR0aC0xXTsKKyAgICAgICAgdGVtcDEgfD0gKHRlbXAxIDw8IDgpOworICAgICAgICB0ZW1wMSB8PSAodGVtcDEgPDwgMTYpOworICAgICAgICB0ZW1wMiB8PSAodGVtcDIgPDwgOCk7CisgICAgICAgIHRlbXAyIHw9ICh0ZW1wMiA8PCAxNik7CisKKyAgICAgICAgKigodWludDMyKikoZHN0IC0gMTYpKSA9IHRlbXAxOworICAgICAgICAqKCh1aW50MzIqKShkc3QgLSAxMikpID0gdGVtcDE7CisgICAgICAgICooKHVpbnQzMiopKGRzdCAtIDgpKSA9IHRlbXAxOworICAgICAgICAqKCh1aW50MzIqKShkc3QgLSA0KSkgPSB0ZW1wMTsKKworICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9IHRlbXAyOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKyA0KSkgPSB0ZW1wMjsKKyAgICAgICAgKigodWludDMyKikoZHN0ICsgOCkpID0gdGVtcDI7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArIDEyKSkgPSB0ZW1wMjsKKworICAgICAgICBzcmMgKz0gcGl0Y2g7CisgICAgICAgIGRzdCA9IHNyYzsKKyAgICB9CisKKyAgICAvKiBwYWQgYm90dG9tICovCisgICAgZHN0IC09IDE2OworICAgIGkgPSAxNjsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgZHN0IC0gcGl0Y2gsIHBpdGNoKTsKKyAgICAgICAgZHN0ICs9IHBpdGNoOworICAgIH0KKworCisgICAgcmV0dXJuIDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBBVkNSYXN0ZXJJbnRyYVVwZGF0ZQorICAgIERhdGU6ICAgICAgIDIvMjYvMDEKKyAgICBQdXJwb3NlOiAgICBUbyByYXN0ZXItc2NhbiBhc3NpZ24gSU5UUkEtdXBkYXRlIC4KKyAgICAgICAgICAgICAgICBOIG1hY3JvYmxvY2tzIGFyZSB1cGRhdGVkIChhbHNvIHdhcyBwcm9ncmFtbWFibGUpLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgQVZDUmFzdGVySW50cmFVcGRhdGUoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgaW50IHRvdGFsTUIsIGludCBudW1SZWZyZXNoKQoreworICAgIGludCBpbmR4LCBpOworCisgICAgaW5keCA9IGVuY3ZpZC0+Zmlyc3RJbnRyYVJlZnJlc2hNQkluZHg7CisgICAgZm9yIChpID0gMDsgaSA8IG51bVJlZnJlc2ggJiYgaW5keCA8IHRvdGFsTUI7IGkrKykKKyAgICB7CisgICAgICAgIChtYmxvY2sgKyBpbmR4KS0+bWJfaW50cmEgPSAxOworICAgICAgICBlbmN2aWQtPmludHJhU2VhcmNoW2luZHgrK10gPSAxOworICAgIH0KKworICAgIC8qIGlmIHJlYWQgdGhlIGVuZCBvZiBmcmFtZSwgcmVzZXQgYW5kIGxvb3AgYXJvdW5kICovCisgICAgaWYgKGluZHggPj0gdG90YWxNQiAtIDEpCisgICAgeworICAgICAgICBpbmR4ID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBudW1SZWZyZXNoICYmIGluZHggPCB0b3RhbE1CKQorICAgICAgICB7CisgICAgICAgICAgICAobWJsb2NrICsgaW5keCktPm1iX2ludHJhID0gMTsKKyAgICAgICAgICAgIGVuY3ZpZC0+aW50cmFTZWFyY2hbaW5keCsrXSA9IDE7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbmN2aWQtPmZpcnN0SW50cmFSZWZyZXNoTUJJbmR4ID0gaW5keDsgLyogdXBkYXRlIHdpdGggYSBuZXcgdmFsdWUgKi8KKworICAgIHJldHVybiA7Cit9CisKKworI2lmZGVmIEhURk0KK3ZvaWQgSW5pdEhURk0oVmlkZW9FbmNEYXRhICplbmN2aWQsIEhURk1fU3RhdCAqaHRmbV9zdGF0LCBkb3VibGUgKm5ld3ZhciwgaW50ICpjb2xsZWN0KQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgaTsKKyAgICBpbnQgbHggPSB2aWRlby0+Y3VyclBpYy0+d2lkdGg7IC8vIHBhZGRpbmcKKyAgICBpbnQgbHgyID0gbHggPDwgMTsKKyAgICBpbnQgbHgzID0gbHgyICsgbHg7CisgICAgaW50IHJ4ID0gdmlkZW8tPmN1cnJQaWMtPnBpdGNoOworICAgIGludCByeDIgPSByeCA8PCAxOworICAgIGludCByeDMgPSByeDIgKyByeDsKKworICAgIGludCAqb2Zmc2V0LCAqb2Zmc2V0MjsKKworICAgIC8qIDQvMTEvMDEsIGNvbGxlY3QgZGF0YSBldmVyeSAzMCBmcmFtZXMsIGRvZXNuJ3QgaGF2ZSB0byBiZSBiYXNlIGxheWVyICovCisgICAgaWYgKCgoaW50KXZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtKSAlIDMwID09IDEpCisgICAgeworCisgICAgICAgICpjb2xsZWN0ID0gMTsKKworICAgICAgICBodGZtX3N0YXQtPmNvdW50YnJlYWsgPSAwOworICAgICAgICBodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2ZyA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld3ZhcltpXSA9IDAuMDsKKyAgICAgICAgfQorLy8gICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX1BBRERJTkcgPSAmU0FEX01CX1BBRERJTkdfSFRGTV9Db2xsZWN0OworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01hY3JvYmxvY2sgPSAmU0FEX01CX0hURk1fQ29sbGVjdDsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzBdID0gTlVMTDsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzFdID0gJlNBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aDsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzJdID0gJlNBRF9NQl9IUF9IVEZNX0NvbGxlY3R5aDsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzNdID0gJlNBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aHloOworICAgICAgICBlbmN2aWQtPnNhZF9leHRyYV9pbmZvID0gKHZvaWQqKShodGZtX3N0YXQpOworICAgICAgICBvZmZzZXQgPSBodGZtX3N0YXQtPm9mZnNldEFycmF5OworICAgICAgICBvZmZzZXQyID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisvLyAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfUEFERElORyA9ICZTQURfTUJfUEFERElOR19IVEZNOworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01hY3JvYmxvY2sgPSAmU0FEX01CX0hURk07CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFswXSA9IE5VTEw7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsxXSA9ICZTQURfTUJfSFBfSFRGTXhoOworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMl0gPSAmU0FEX01CX0hQX0hURk15aDsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzNdID0gJlNBRF9NQl9IUF9IVEZNeGh5aDsKKyAgICAgICAgZW5jdmlkLT5zYWRfZXh0cmFfaW5mbyA9ICh2b2lkKikoZW5jdmlkLT5ucm1sel90aCk7CisgICAgICAgIG9mZnNldCA9IGVuY3ZpZC0+bnJtbHpfdGggKyAxNjsKKyAgICAgICAgb2Zmc2V0MiA9IGVuY3ZpZC0+bnJtbHpfdGggKyAzMjsKKyAgICB9CisKKyAgICBvZmZzZXRbMF0gPSAwOworICAgIG9mZnNldFsxXSA9IGx4MiArIDI7CisgICAgb2Zmc2V0WzJdID0gMjsKKyAgICBvZmZzZXRbM10gPSBseDI7CisgICAgb2Zmc2V0WzRdID0gbHggKyAxOworICAgIG9mZnNldFs1XSA9IGx4MyArIDM7CisgICAgb2Zmc2V0WzZdID0gbHggKyAzOworICAgIG9mZnNldFs3XSA9IGx4MyArIDE7CisgICAgb2Zmc2V0WzhdID0gbHg7CisgICAgb2Zmc2V0WzldID0gbHgzICsgMjsKKyAgICBvZmZzZXRbMTBdID0gbHgzIDsKKyAgICBvZmZzZXRbMTFdID0gbHggKyAyIDsKKyAgICBvZmZzZXRbMTJdID0gMTsKKyAgICBvZmZzZXRbMTNdID0gbHgyICsgMzsKKyAgICBvZmZzZXRbMTRdID0gbHgyICsgMTsKKyAgICBvZmZzZXRbMTVdID0gMzsKKworICAgIG9mZnNldDJbMF0gPSAwOworICAgIG9mZnNldDJbMV0gPSByeDIgKyAyOworICAgIG9mZnNldDJbMl0gPSAyOworICAgIG9mZnNldDJbM10gPSByeDI7CisgICAgb2Zmc2V0Mls0XSA9IHJ4ICsgMTsKKyAgICBvZmZzZXQyWzVdID0gcngzICsgMzsKKyAgICBvZmZzZXQyWzZdID0gcnggKyAzOworICAgIG9mZnNldDJbN10gPSByeDMgKyAxOworICAgIG9mZnNldDJbOF0gPSByeDsKKyAgICBvZmZzZXQyWzldID0gcngzICsgMjsKKyAgICBvZmZzZXQyWzEwXSA9IHJ4MyA7CisgICAgb2Zmc2V0MlsxMV0gPSByeCArIDIgOworICAgIG9mZnNldDJbMTJdID0gMTsKKyAgICBvZmZzZXQyWzEzXSA9IHJ4MiArIDM7CisgICAgb2Zmc2V0MlsxNF0gPSByeDIgKyAxOworICAgIG9mZnNldDJbMTVdID0gMzsKKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgVXBkYXRlSFRGTShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgZG91YmxlICpuZXd2YXIsIGRvdWJsZSAqZXhwX2xhbWRhLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCkKK3sKKyAgICBpZiAoaHRmbV9zdGF0LT5jb3VudGJyZWFrID09IDApCisgICAgICAgIGh0Zm1fc3RhdC0+Y291bnRicmVhayA9IDE7CisKKyAgICBuZXd2YXJbMF0gPSAoZG91YmxlKShodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2ZykgLyAoaHRmbV9zdGF0LT5jb3VudGJyZWFrICogMTYuKTsKKworICAgIGlmIChuZXd2YXJbMF0gPCAwLjAwMSkKKyAgICB7CisgICAgICAgIG5ld3ZhclswXSA9IDAuMDAxOyAvKiB0byBwcmV2ZW50IGZsb2F0aW5nIG92ZXJmbG93ICovCisgICAgfQorICAgIGV4cF9sYW1kYVswXSA9ICAxIC8gKG5ld3ZhclswXSAqIDEuNDE0MjEzNik7CisgICAgZXhwX2xhbWRhWzFdID0gZXhwX2xhbWRhWzBdICogMS41ODI1OworICAgIGV4cF9sYW1kYVsyXSA9IGV4cF9sYW1kYVswXSAqIDIuMTc1MDsKKyAgICBleHBfbGFtZGFbM10gPSBleHBfbGFtZGFbMF0gKiAzLjUwNjU7CisgICAgZXhwX2xhbWRhWzRdID0gZXhwX2xhbWRhWzBdICogMy4xNDM2OworICAgIGV4cF9sYW1kYVs1XSA9IGV4cF9sYW1kYVswXSAqIDMuNTMxNTsKKyAgICBleHBfbGFtZGFbNl0gPSBleHBfbGFtZGFbMF0gKiAzLjc0NDk7CisgICAgZXhwX2xhbWRhWzddID0gZXhwX2xhbWRhWzBdICogNC41ODU0OworICAgIGV4cF9sYW1kYVs4XSA9IGV4cF9sYW1kYVswXSAqIDQuNjE5MTsKKyAgICBleHBfbGFtZGFbOV0gPSBleHBfbGFtZGFbMF0gKiA1LjQwNDE7CisgICAgZXhwX2xhbWRhWzEwXSA9IGV4cF9sYW1kYVswXSAqIDYuNTk3NDsKKyAgICBleHBfbGFtZGFbMTFdID0gZXhwX2xhbWRhWzBdICogMTAuNTM0MTsKKyAgICBleHBfbGFtZGFbMTJdID0gZXhwX2xhbWRhWzBdICogMTAuMDcxOTsKKyAgICBleHBfbGFtZGFbMTNdID0gZXhwX2xhbWRhWzBdICogMTIuMDUxNjsKKyAgICBleHBfbGFtZGFbMTRdID0gZXhwX2xhbWRhWzBdICogMTUuNDU1MjsKKworICAgIENhbGNUaHJlc2hvbGQoSFRGTV9QZiwgZXhwX2xhbWRhLCBlbmN2aWQtPm5ybWx6X3RoKTsKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgQ2FsY1RocmVzaG9sZChkb3VibGUgcGYsIGRvdWJsZSBleHBfbGFtZGFbXSwgaW50IG5ybWx6X3RoW10pCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIHRlbXBbMTVdOworICAgIC8vICBwcmludGYoIlxuTGFtZGE6ICIpOworCisgICAgLyogcGFyYW1ldHJpYyBQUkVNT0RFTGxpbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykKKyAgICB7CisgICAgICAgIC8vICAgIHByaW50ZigiJWcgIixleHBfbGFtZGFbaV0pOworICAgICAgICBpZiAocGYgPCAwLjUpCisgICAgICAgICAgICB0ZW1wW2ldID0gMSAvIGV4cF9sYW1kYVtpXSAqIE00VkVOQ19MT0coMiAqIHBmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGVtcFtpXSA9IC0xIC8gZXhwX2xhbWRhW2ldICogTTRWRU5DX0xPRygyICogKDEgLSBwZikpOworICAgIH0KKworICAgIG5ybWx6X3RoWzE1XSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspICAgICAgICAvKiBzY2FsZSB1cHRvIG5vLnBpeGVscyAqLworICAgICAgICBucm1sel90aFtpXSA9IChpbnQpKHRlbXBbaV0gKiAoKGkgKyAxKSA8PCA0KSArIDAuNSk7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkICAgIEhURk1QcmVwYXJlQ3VyTUJfQVZDKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCwgdWludDggKmN1ciwgaW50IHBpdGNoKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICB1aW50MzIgKmh0Zm1NQiA9ICh1aW50MzIqKShlbmN2aWQtPmN1cnJZTUIpOworICAgIHVpbnQ4ICpwdHIsIGJ5dGU7CisgICAgaW50ICpvZmZzZXQ7CisgICAgaW50IGk7CisgICAgdWludDMyIHdvcmQ7CisKKyAgICBpZiAoKChpbnQpdmlkZW8tPnNsaWNlSGRyLT5mcmFtZV9udW0pICUgMzAgPT0gMSkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IGh0Zm1fc3RhdC0+b2Zmc2V0QXJyYXk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG9mZnNldCA9IGVuY3ZpZC0+bnJtbHpfdGggKyAxNjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHB0ciA9IGN1ciArIG9mZnNldFtpXTsKKyAgICAgICAgd29yZCA9IHB0clswXTsKKyAgICAgICAgYnl0ZSA9IHB0cls0XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCA4KTsKKyAgICAgICAgYnl0ZSA9IHB0cls4XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAxNik7CisgICAgICAgIGJ5dGUgPSBwdHJbMTJdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDI0KTsKKyAgICAgICAgKmh0Zm1NQisrID0gd29yZDsKKworICAgICAgICB3b3JkID0gKihwdHIgKz0gKHBpdGNoIDw8IDIpKTsKKyAgICAgICAgYnl0ZSA9IHB0cls0XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCA4KTsKKyAgICAgICAgYnl0ZSA9IHB0cls4XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAxNik7CisgICAgICAgIGJ5dGUgPSBwdHJbMTJdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDI0KTsKKyAgICAgICAgKmh0Zm1NQisrID0gd29yZDsKKworICAgICAgICB3b3JkID0gKihwdHIgKz0gKHBpdGNoIDw8IDIpKTsKKyAgICAgICAgYnl0ZSA9IHB0cls0XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCA4KTsKKyAgICAgICAgYnl0ZSA9IHB0cls4XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAxNik7CisgICAgICAgIGJ5dGUgPSBwdHJbMTJdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDI0KTsKKyAgICAgICAgKmh0Zm1NQisrID0gd29yZDsKKworICAgICAgICB3b3JkID0gKihwdHIgKz0gKHBpdGNoIDw8IDIpKTsKKyAgICAgICAgYnl0ZSA9IHB0cls0XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCA4KTsKKyAgICAgICAgYnl0ZSA9IHB0cls4XTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAxNik7CisgICAgICAgIGJ5dGUgPSBwdHJbMTJdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDI0KTsKKyAgICAgICAgKmh0Zm1NQisrID0gd29yZDsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKyNlbmRpZiAvLyBIVEZNCisKK3ZvaWQgICAgQVZDUHJlcGFyZUN1ck1CKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyLCBpbnQgcGl0Y2gpCit7CisgICAgdm9pZCogdG1wID0gKHZvaWQqKShlbmN2aWQtPmN1cnJZTUIpOworICAgIHVpbnQzMiAqY3VycllNQiA9ICh1aW50MzIqKSB0bXA7CisgICAgaW50IGk7CisKKyAgICBjdXIgLT0gcGl0Y2g7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgICpjdXJyWU1CKysgPSAqKCh1aW50MzIqKShjdXIgKz0gcGl0Y2gpKTsKKyAgICAgICAgKmN1cnJZTUIrKyA9ICooKHVpbnQzMiopKGN1ciArIDQpKTsKKyAgICAgICAgKmN1cnJZTUIrKyA9ICooKHVpbnQzMiopKGN1ciArIDgpKTsKKyAgICAgICAgKmN1cnJZTUIrKyA9ICooKHVpbnQzMiopKGN1ciArIDEyKSk7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworI2lmZGVmIEZJWEVEX0lOVEVSUFJFRF9NT0RFCisKKy8qIGR1ZSB0byB0aGUgY29tcGxleGl0eSBvZiB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IsIHdlIG1heSBub3QgZGVjaWRlIHRvIHNraXAKK2EgbWFjcm9ibG9jayBoZXJlIGp1c3QgeWV0LiAqLworLyogV2Ugd2lsbCBmaW5kIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IgYW5kIHRoZSBiZXN0IGludHJhIHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jay4gKi8KKy8qIG91dHB1dCBhcmUKKyAgICBjdXJyTUItPk51bU1iUGFydCwgIGN1cnJNQi0+TWJQYXJ0V2lkdGgsIGN1cnJNQi0+TWJQYXJ0SGVpZ2h0LAorICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0W10sIGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbXSwgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHQsCisgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVtdW10gKEwwIG9yIEwxIG9yIEJpUHJlZCkKKyAgICBjdXJyTUItPlJlZklkeFtdLCBjdXJyTUItPnJlZl9pZHhfTDBbXSwKKyAgICBjdXJyTUItPm12TDBbXSwgY3Vyck1CLT5tdkwxW10KKyAgICAqLworCitBVkNFbmNfU3RhdHVzIEFWQ01CTW90aW9uU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIGludCBtYk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wYXNzKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgbWJQYXJ0SWR4LCBzdWJNYlBhcnRJZHg7CisgICAgaW50MTYgKm12OworICAgIGludCBpOworICAgIGludCBTdWJNYlBhcnRIZWlnaHQsIFN1Yk1iUGFydFdpZHRoLCBOdW1TdWJNYlBhcnQ7CisKKyAgICAvKiBhc3NpZ24gdmFsdWUgdG8gY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVtdW3hdLHN1Yk1iTW9kZVtdLE51bVN1Yk1iUGFydFtdLFN1Yk1iUGFydFdpZHRoW10sU3ViTWJQYXJ0SGVpZ2h0W10gKi8KKworICAgIGN1cnJNQi0+bWJNb2RlID0gRklYRURfSU5URVJQUkVEX01PREU7CisgICAgY3Vyck1CLT5tYl9pbnRyYSA9IDA7CisKKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1AxNikKKyAgICB7CisgICAgICAgIGN1cnJNQi0+TnVtTWJQYXJ0ID0gMTsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRXaWR0aCA9IDE2OworICAgICAgICBjdXJyTUItPk1iUGFydEhlaWdodCA9IDE2OworICAgICAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFswXSA9IDE2OworICAgICAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzBdID0gMTY7CisgICAgICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0WzBdID0gIDE7CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QMTZ4OCkKKyAgICB7CisgICAgICAgIGN1cnJNQi0+TnVtTWJQYXJ0ID0gMjsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRXaWR0aCA9IDE2OworICAgICAgICBjdXJyTUItPk1iUGFydEhlaWdodCA9IDg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbaV0gPSAxNjsKKyAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0W2ldID0gODsKKyAgICAgICAgICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0W2ldID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDh4MTYpCisgICAgeworICAgICAgICBjdXJyTUItPk51bU1iUGFydCA9IDI7CisgICAgICAgIGN1cnJNQi0+TWJQYXJ0V2lkdGggPSA4OworICAgICAgICBjdXJyTUItPk1iUGFydEhlaWdodCA9IDE2OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoW2ldID0gODsKKyAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0W2ldID0gMTY7CisgICAgICAgICAgICBjdXJyTUItPk51bVN1Yk1iUGFydFtpXSA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4IHx8IGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOHJlZjApCisgICAgeworICAgICAgICBjdXJyTUItPk51bU1iUGFydCA9IDQ7CisgICAgICAgIGN1cnJNQi0+TWJQYXJ0V2lkdGggPSA4OworICAgICAgICBjdXJyTUItPk1iUGFydEhlaWdodCA9IDg7CisgICAgICAgIGlmIChGSVhFRF9TVUJNQl9NT0RFID09IEFWQ184eDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1Yk1iUGFydEhlaWdodCA9IDg7CisgICAgICAgICAgICBTdWJNYlBhcnRXaWR0aCA9IDg7CisgICAgICAgICAgICBOdW1TdWJNYlBhcnQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEZJWEVEX1NVQk1CX01PREUgPT0gQVZDXzh4NCkKKyAgICAgICAgeworICAgICAgICAgICAgU3ViTWJQYXJ0SGVpZ2h0ID0gNDsKKyAgICAgICAgICAgIFN1Yk1iUGFydFdpZHRoID0gODsKKyAgICAgICAgICAgIE51bVN1Yk1iUGFydCA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoRklYRURfU1VCTUJfTU9ERSA9PSBBVkNfNHg4KQorICAgICAgICB7CisgICAgICAgICAgICBTdWJNYlBhcnRIZWlnaHQgPSA4OworICAgICAgICAgICAgU3ViTWJQYXJ0V2lkdGggPSA0OworICAgICAgICAgICAgTnVtU3ViTWJQYXJ0ID0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChGSVhFRF9TVUJNQl9NT0RFID09IEFWQ180eDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1Yk1iUGFydEhlaWdodCA9IDQ7CisgICAgICAgICAgICBTdWJNYlBhcnRXaWR0aCA9IDQ7CisgICAgICAgICAgICBOdW1TdWJNYlBhcnQgPSA0OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5zdWJNYk1vZGVbaV0gPSBGSVhFRF9TVUJNQl9NT0RFOworICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbaV0gPSBTdWJNYlBhcnRIZWlnaHQ7CisgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoW2ldID0gU3ViTWJQYXJ0V2lkdGg7CisgICAgICAgICAgICBjdXJyTUItPk51bVN1Yk1iUGFydFtpXSA9IE51bVN1Yk1iUGFydDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIGl0J3MgcHJvYmFibHkgaW50cmEgbW9kZSAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworICAgIH0KKworICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgNDsgbWJQYXJ0SWR4KyspCisgICAgeworICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gID0gQVZDX1ByZWRfTDA7CisgICAgICAgIGN1cnJNQi0+cmVmX2lkeF9MMFttYlBhcnRJZHhdID0gRklYRURfUkVGX0lEWDsKKyAgICAgICAgY3Vyck1CLT5SZWZJZHhbbWJQYXJ0SWR4XSA9IHZpZGVvLT5SZWZQaWNMaXN0MFtGSVhFRF9SRUZfSURYXS0+UmVmSWR4OworCisgICAgICAgIGZvciAoc3ViTWJQYXJ0SWR4ID0gMDsgc3ViTWJQYXJ0SWR4IDwgNDsgc3ViTWJQYXJ0SWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG12ID0gKGludDE2KikoY3Vyck1CLT5tdkwwICsgKG1iUGFydElkeCA8PCAyKSArIHN1Yk1iUGFydElkeCk7CisKKyAgICAgICAgICAgICptdisrID0gRklYRURfTVZYOworICAgICAgICAgICAgKm12ID0gRklYRURfTVZZOworICAgICAgICB9CisgICAgfQorCisgICAgZW5jdmlkLT5taW5fY29zdCA9IDA7CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKyNlbHNlIC8qIHBlcmZvcm0gdGhlIHNlYXJjaCAqLworCisvKiBUaGlzIG9wdGlvbiAjMSBzZWFyY2ggaXMgdmVyeSBzaW1pbGFyIHRvIFBWJ3MgTVBFRzQgbW90aW9uIHNlYXJjaCBhbGdvcml0aG0uCisgIFRoZSBzZWFyY2ggaXMgZG9uZSBpbiBoaWVyYXJjaGljYWwgbWFubmVyIGZyb20gMTZ4MTYgTUIgZG93biB0byBzbWFsbGVyIGFuZCBzbWFsbGVyCisgIHBhcnRpdGlvbi4gQXQgZWFjaCBsZXZlbCwgYSBkZWNpc2lvbiBjYW4gYmUgbWFkZSB0byBzdG9wIHRoZSBzZWFyY2ggaWYgdGhlIGV4cGVjdGVkCisgIHByZWRpY3Rpb24gZ2FpbiBpcyBub3Qgd29ydGggdGhlIGNvbXB1dGF0aW9uLiBUaGUgZGVjaXNpb24gY2FuIGFsc28gYmUgbWFkZSBhdCB0aGUgZmluZXN0CisgIGxldmVsIGZvciBtb3JlIGZ1bGxzZWFyY2gtbGlrZSBiZWhhdmlvciB3aXRoIHRoZSBwcmljZSBvZiBoZWF2aWVyIGNvbXB1dGF0aW9uLiAqLwordm9pZCBBVkNNQk1vdGlvblNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ciwgdWludDggKmJlc3RfY2FuZFtdLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTAsIGludCBqMCwgaW50IHR5cGVfcHJlZCwgaW50IEZTX2VuLCBpbnQgKmhwX2d1ZXNzKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNQaWN0dXJlRGF0YSAqY3VyclBpYyA9IHZpZGVvLT5jdXJyUGljOworICAgIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTID0gdmlkZW8tPmN1cnJTZXFQYXJhbXM7CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIHVpbnQ4ICpyZWYsICpjYW5kLCAqbmNhbmQ7CisgICAgdm9pZCAqZXh0cmFfaW5mbyA9IGVuY3ZpZC0+c2FkX2V4dHJhX2luZm87CisgICAgaW50IG1ibnVtID0gdmlkZW8tPm1iTnVtOworICAgIGludCB3aWR0aCA9IGN1cnJQaWMtPndpZHRoOyAvKiA2LzEyLzAxLCBtdXN0IGJlIG11bHRpcGxlIG9mIDE2ICovCisgICAgaW50IGhlaWdodCA9IGN1cnJQaWMtPmhlaWdodDsKKyAgICBBVkNNViAqbW90MTZ4MTYgPSBlbmN2aWQtPm1vdDE2eDE2OworICAgIGludCAoKlNBRF9NYWNyb2Jsb2NrKSh1aW50OCosIHVpbnQ4KiwgaW50LCB2b2lkKikgPSBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01hY3JvYmxvY2s7CisKKyAgICBpbnQgcmFuZ2UgPSByYXRlQ3RybC0+bXZSYW5nZTsKKworICAgIGludCBseCA9IGN1cnJQaWMtPnBpdGNoOyAvKiAgcGFkZGluZyAqLworICAgIGludCBpLCBqLCBpbWluLCBqbWluLCBpbG93LCBpaGlnaCwgamxvdywgamhpZ2g7CisgICAgaW50IGQsIGRtaW4sIGRuWzldOworICAgIGludCBrOworICAgIGludCBtdnhbNV0sIG12eVs1XTsKKyAgICBpbnQgbnVtX2NhbiwgY2VudGVyX2FnYWluOworICAgIGludCBsYXN0X2xvYywgbmV3X2xvYyA9IDA7CisgICAgaW50IHN0ZXAsIG1heF9zdGVwID0gcmFuZ2UgPj4gMTsKKyAgICBpbnQgbmV4dDsKKworICAgIGludCBjbXZ4LCBjbXZ5OyAvKiBlc3RpbWF0ZWQgcHJlZGljdGVkIE1WICovCisgICAgaW50IGxldl9pZHg7CisgICAgaW50IGxhbWJkYV9tb3Rpb24gPSBlbmN2aWQtPmxhbWJkYV9tb3Rpb247CisgICAgdWludDggKm12Yml0cyA9IGVuY3ZpZC0+bXZiaXRzOworICAgIGludCBtdnNoaWZ0ID0gMjsKKyAgICBpbnQgbXZjb3N0OworCisgICAgaW50IG1pbl9zYWQgPSA2NTUzNTsKKworICAgIHJlZiA9IHZpZGVvLT5SZWZQaWNMaXN0MFtERUZBVUxUX1JFRl9JRFhdLT5TbDsgLyogb3JpZ2luIG9mIGFjdHVhbCBmcmFtZSAqLworCisgICAgLyogaGF2ZSB0byBpbml0aWFsaXplIHRoZXNlIHBhcmFtcywgbmVjZXNzYXJ5IGZvciBpbnRlcnByZWRpY3Rpb24gcGFydCAqLworICAgIGN1cnJNQi0+TnVtTWJQYXJ0ID0gMTsKKyAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFswXSA9IDE2OworICAgIGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbMF0gPSAxNjsKKyAgICBjdXJyTUItPk51bVN1Yk1iUGFydFswXSA9IDE7CisgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzBdID0gY3Vyck1CLT5yZWZfaWR4X0wwWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzJdID0gY3Vyck1CLT5yZWZfaWR4X0wwWzNdID0gREVGQVVMVF9SRUZfSURYOworICAgIGN1cnJNQi0+cmVmX2lkeF9MMVswXSA9IGN1cnJNQi0+cmVmX2lkeF9MMVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+cmVmX2lkeF9MMVsyXSA9IGN1cnJNQi0+cmVmX2lkeF9MMVszXSA9IERFRkFVTFRfUkVGX0lEWDsKKyAgICBjdXJyTUItPlJlZklkeFswXSA9IGN1cnJNQi0+UmVmSWR4WzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPlJlZklkeFsyXSA9IGN1cnJNQi0+UmVmSWR4WzNdID0gdmlkZW8tPlJlZlBpY0xpc3QwW0RFRkFVTFRfUkVGX0lEWF0tPlJlZklkeDsKKworICAgIGN1ciA9IGVuY3ZpZC0+Y3VycllNQjsgLyogdXNlIHNtYWxsZXIgbWVtb3J5IHNwYWNlIGZvciBjdXJyZW50IE1CICovCisKKyAgICAvKiAgZmluZCBsaW1pdCBvZiB0aGUgc2VhcmNoIChhZGp1c3Rpbmcgc2VhcmNoIHJhbmdlKSovCisgICAgbGV2X2lkeCA9IG1hcExldjJJZHhbY3VyclNQUy0+bGV2ZWxfaWRjXTsKKworICAgIC8qIHdlIGNhbiBtYWtlIHRoaXMgcGFydCBkeW5hbWljIGJhc2VkIG9uIHByZXZpb3VzIHN0YXRpc3RpY3MgKi8KKyAgICBpbG93ID0gaTAgLSByYW5nZTsKKyAgICBpZiAoaTAgLSBpbG93ID4gMjA0NykgLyogY2xpcCB0byBjb25mb3JtIHdpdGggdGhlIHN0YW5kYXJkICovCisgICAgeworICAgICAgICBpbG93ID0gaTAgLSAyMDQ3OworICAgIH0KKyAgICBpZiAoaWxvdyA8IC0xMykgIC8vIGNoYW5nZSBpdCBmcm9tIC0xNSB0byAtMTMgYmVjYXVzZSBvZiA2LXRhcCBmaWx0ZXIgbmVlZHMgZXh0cmEgMiBsaW5lcy4KKyAgICB7CisgICAgICAgIGlsb3cgPSAtMTM7CisgICAgfQorCisgICAgaWhpZ2ggPSBpMCArIHJhbmdlIC0gMTsKKyAgICBpZiAoaWhpZ2ggLSBpMCA+IDIwNDcpIC8qIGNsaXAgdG8gY29uZm9ybSB3aXRoIHRoZSBzdGFuZGFyZCAqLworICAgIHsKKyAgICAgICAgaWhpZ2ggPSBpMCArIDIwNDc7CisgICAgfQorICAgIGlmIChpaGlnaCA+IHdpZHRoIC0gMykKKyAgICB7CisgICAgICAgIGloaWdoID0gd2lkdGggLSAzOyAgLy8gY2hhbmdlIGZyb20gd2lkdGgtMSB0byB3aWR0aC0zIGZvciB0aGUgc2FtZSByZWFzb24gYXMgYWJvdmUKKyAgICB9CisKKyAgICBqbG93ID0gajAgLSByYW5nZTsKKyAgICBpZiAoajAgLSBqbG93ID4gTWF4Vm12UltsZXZfaWR4XSAtIDEpIC8qIGNsaXAgdG8gY29uZm9ybSB3aXRoIHRoZSBzdGFuZGFyZCAqLworICAgIHsKKyAgICAgICAgamxvdyA9IGowIC0gTWF4Vm12UltsZXZfaWR4XSArIDE7CisgICAgfQorICAgIGlmIChqbG93IDwgLTEzKSAgICAgLy8gc2FtZSByZWFzb24gYXMgYWJvdmUKKyAgICB7CisgICAgICAgIGpsb3cgPSAtMTM7CisgICAgfQorCisgICAgamhpZ2ggPSBqMCArIHJhbmdlIC0gMTsKKyAgICBpZiAoamhpZ2ggLSBqMCA+IE1heFZtdlJbbGV2X2lkeF0gLSAxKSAvKiBjbGlwIHRvIGNvbmZvcm0gd2l0aCB0aGUgc3RhbmRhcmQgKi8KKyAgICB7CisgICAgICAgIGpoaWdoID0gajAgKyBNYXhWbXZSW2xldl9pZHhdIC0gMTsKKyAgICB9CisgICAgaWYgKGpoaWdoID4gaGVpZ2h0IC0gMykgLy8gc2FtZSByZWFzb24gYXMgYWJvdmUKKyAgICB7CisgICAgICAgIGpoaWdoID0gaGVpZ2h0IC0gMzsKKyAgICB9CisKKyAgICAvKiBmaW5kIGluaXRpYWwgbW90aW9uIHZlY3RvciAmIHByZWRpY3RlZCBNViovCisgICAgQVZDQ2FuZGlkYXRlU2VsZWN0aW9uKG12eCwgbXZ5LCAmbnVtX2NhbiwgaTAgPj4gNCwgajAgPj4gNCwgZW5jdmlkLCB0eXBlX3ByZWQsICZjbXZ4LCAmY212eSk7CisKKyAgICBpbWluID0gaTA7CisgICAgam1pbiA9IGowOyAvKiBuZWVkZWQgZm9yIGZ1bGxzZWFyY2ggKi8KKyAgICBuY2FuZCA9IHJlZiArIGkwICsgajAgKiBseDsKKworICAgIC8qIGZvciBmaXJzdCByb3cgb2YgTUIsIGZ1bGxzZWFyY2ggY2FuIGJlIHVzZWQgKi8KKyAgICBpZiAoRlNfZW4pCisgICAgeworICAgICAgICAqaHBfZ3Vlc3MgPSAwOyAvKiBubyBndWVzcyBmb3IgZmFzdCBoYWxmLXBlbCAqLworCisgICAgICAgIGRtaW4gPSAgQVZDRnVsbFNlYXJjaChlbmN2aWQsIHJlZiwgY3VyLCAmaW1pbiwgJmptaW4sIGlsb3csIGloaWdoLCBqbG93LCBqaGlnaCwgY212eCwgY212eSk7CisKKyAgICAgICAgbmNhbmQgPSByZWYgKyBpbWluICsgam1pbiAqIGx4OworICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8qICAgICAgIGZ1bGxzZWFyY2ggdGhlIHRvcCByb3cgdG8gb25seSB1cHRvICgwLDMpIE1CICovCisgICAgICAgIC8qICAgICAgIHVwdG8gMzAlIGNvbXBsZXhpdHkgc2F2aW5nIHdpdGggdGhlIHNhbWUgY29tcGxleGl0eSAqLworICAgICAgICBpZiAodmlkZW8tPlByZXZSZWZGcmFtZU51bSA9PSAwICYmIGowID09IDAgJiYgaTAgPD0gNjQgJiYgdHlwZV9wcmVkICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpocF9ndWVzcyA9IDA7IC8qIG5vIGd1ZXNzIGZvciBmYXN0IGhhbGYtcGVsICovCisgICAgICAgICAgICBkbWluID0gIEFWQ0Z1bGxTZWFyY2goZW5jdmlkLCByZWYsIGN1ciwgJmltaW4sICZqbWluLCBpbG93LCBpaGlnaCwgamxvdywgamhpZ2gsIGNtdngsIGNtdnkpOworICAgICAgICAgICAgbmNhbmQgPSByZWYgKyBpbWluICsgam1pbiAqIGx4OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKioqKioqKioqIGluaXRpYWxpemUgY2FuZGlkYXRlICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBkbWluID0gNjU1MzU7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIGFsbCBhcmUgZXF1YWwgKi8KKyAgICAgICAgICAgIGlmIChudW1fY2FuID09IEFMTF9DQU5EX0VRVUFMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgPSBpMCArIG12eFswXTsKKyAgICAgICAgICAgICAgICBqID0gajAgKyBtdnlbMF07CisKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBpbG93ICYmIGkgPD0gaWhpZ2ggJiYgaiA+PSBqbG93ICYmIGogPD0gamhpZ2gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYW5kID0gcmVmICsgaSArIGogKiBseDsKKworICAgICAgICAgICAgICAgICAgICBkID0gKCpTQURfTWFjcm9ibG9jaykoY2FuZCwgY3VyLCAoZG1pbiA8PCAxNikgfCBseCwgZXh0cmFfaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIG12Y29zdCA9IE1WX0NPU1QobGFtYmRhX21vdGlvbiwgbXZzaGlmdCwgaSAtIGkwLCBqIC0gajAsIGNtdngsIGNtdnkpOworICAgICAgICAgICAgICAgICAgICBkICs9ICBtdmNvc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgam1pbiA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICBuY2FuZCA9IGNhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2FkID0gZCAtIG12Y29zdDsgLy8gZm9yIHJhdGUgY29udHJvbAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKiBldmFsdWF0ZSB1bmlxdWUgY2FuZGlkYXRlcyAqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBudW1fY2FuOyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpID0gaTAgKyBtdnhba107CisgICAgICAgICAgICAgICAgICAgIGogPSBqMCArIG12eVtrXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBpbG93ICYmIGkgPD0gaWhpZ2ggJiYgaiA+PSBqbG93ICYmIGogPD0gamhpZ2gpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmQgPSByZWYgKyBpICsgaiAqIGx4OworICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICgqU0FEX01hY3JvYmxvY2spKGNhbmQsIGN1ciwgKGRtaW4gPDwgMTYpIHwgbHgsIGV4dHJhX2luZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgbXZjb3N0ID0gTVZfQ09TVChsYW1iZGFfbW90aW9uLCBtdnNoaWZ0LCBpIC0gaTAsIGogLSBqMCwgY212eCwgY212eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkICs9ICBtdmNvc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2FuZCA9IGNhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3NhZCA9IGQgLSBtdmNvc3Q7IC8vIGZvciByYXRlIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKiogbG9jYWwgcmVmaW5lbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBjZW50ZXJfYWdhaW4gPSAwOworICAgICAgICAgICAgbGFzdF9sb2MgPSBuZXdfbG9jID0gMDsKKyAgICAgICAgICAgIC8vICAgICAgICAgIG5jYW5kID0gcmVmICsgam1pbipseCArIGltaW47ICAvKiBjZW50ZXIgb2YgdGhlIHNlYXJjaCAqLworICAgICAgICAgICAgc3RlcCA9IDA7CisgICAgICAgICAgICBkblswXSA9IGRtaW47CisgICAgICAgICAgICB3aGlsZSAoIWNlbnRlcl9hZ2FpbiAmJiBzdGVwIDw9IG1heF9zdGVwKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgQVZDTW92ZU5laWdoYm9yU0FEKGRuLCBsYXN0X2xvYyk7CisKKyAgICAgICAgICAgICAgICBjZW50ZXJfYWdhaW4gPSAxOworICAgICAgICAgICAgICAgIGkgPSBpbWluOworICAgICAgICAgICAgICAgIGogPSBqbWluIC0gMTsKKyAgICAgICAgICAgICAgICBjYW5kID0gcmVmICsgaSArIGogKiBseDsKKworICAgICAgICAgICAgICAgIC8qICBzdGFydGluZyBmcm9tIFswLC0xXSAqLworICAgICAgICAgICAgICAgIC8qIHNwaXJhbCBjaGVjayBvbmUgc3RlcCBhdCBhIHRpbWUqLworICAgICAgICAgICAgICAgIGZvciAoayA9IDI7IGsgPD0gODsgayArPSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJfZXhjbHVkZVtsYXN0X2xvY11ba10pIC8qIGV4Y2x1ZGUgbGFzdCBzdGVwIGNvbXB1dGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgLyogbm90IGFscmVhZHkgY29tcHV0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IGlsb3cgJiYgaSA8PSBpaGlnaCAmJiBqID49IGpsb3cgJiYgaiA8PSBqaGlnaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gKCpTQURfTWFjcm9ibG9jaykoY2FuZCwgY3VyLCAoZG1pbiA8PCAxNikgfCBseCwgZXh0cmFfaW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZjb3N0ID0gTVZfQ09TVChsYW1iZGFfbW90aW9uLCBtdnNoaWZ0LCBpIC0gaTAsIGogLSBqMCwgY212eCwgY212eSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBtdmNvc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbltrXSA9IGQ7IC8qIGtlZXAgaXQgZm9yIGhhbGYgcGVsIHVzZSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNhbmQgPSBjYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptaW4gPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfYWdhaW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbG9jID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3NhZCA9IGQgLSBtdmNvc3Q7IC8vIGZvciByYXRlIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT0gOCkgIC8qIGVuZCBzaWRlIHNlYXJjaCovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2VudGVyX2FnYWluKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAtMTsgLyogc3RhcnQgZGlhZ29uYWwgc2VhcmNoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCAtPSBseDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcmVmaW5lX25leHRba11bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kICs9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcmVmaW5lX25leHRba11bMV07CisgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kICs9IGx4ICogbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0X2xvYyA9IG5ld19sb2M7CisgICAgICAgICAgICAgICAgc3RlcCArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY2VudGVyX2FnYWluKQorICAgICAgICAgICAgICAgIEFWQ01vdmVOZWlnaGJvclNBRChkbiwgbGFzdF9sb2MpOworCisgICAgICAgICAgICAqaHBfZ3Vlc3MgPSBBVkNGaW5kTWluKGRuKTsKKworICAgICAgICAgICAgZW5jdmlkLT5yYXRlQ3RybC0+TUFEb2ZNQlttYm51bV0gPSBtaW5fc2FkIC8gMjU2LjA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtb3QxNngxNlttYm51bV0uc2FkID0gZG1pbjsKKyAgICBtb3QxNngxNlttYm51bV0ueCA9IChpbWluIC0gaTApIDw8IDI7CisgICAgbW90MTZ4MTZbbWJudW1dLnkgPSAoam1pbiAtIGowKSA8PCAyOworICAgIGJlc3RfY2FuZFswXSA9IG5jYW5kOworCisgICAgaWYgKHJhdGVDdHJsLT5zdWJQZWxFbmFibGUpIC8vIGFsd2F5cyBlbmFibGUgaGFsZi1wZWwgc2VhcmNoCisgICAgeworICAgICAgICAvKiBmaW5kIGhhbGYtcGVsIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciAqLworICAgICAgICBtaW5fc2FkID0gQVZDRmluZEhhbGZQZWxNQihlbmN2aWQsIGN1ciwgbW90MTZ4MTYgKyBtYm51bSwgYmVzdF9jYW5kWzBdLCBpMCwgajAsICpocF9ndWVzcywgY212eCwgY212eSk7CisKKyAgICAgICAgZW5jdmlkLT5yYXRlQ3RybC0+TUFEb2ZNQlttYm51bV0gPSBtaW5fc2FkIC8gMjU2LjA7CisKKworICAgICAgICBpZiAoZW5jdmlkLT5iZXN0X3FwZWxfcG9zID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBuY2FuZCA9IGVuY3ZpZC0+aHBlbF9jYW5kW2VuY3ZpZC0+YmVzdF9ocGVsX3Bvc107CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBuY2FuZCA9IGVuY3ZpZC0+cXBlbF9jYW5kW2VuY3ZpZC0+YmVzdF9xcGVsX3Bvc107CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5yYXRlQ3RybC0+TUFEb2ZNQlttYm51bV0gPSBtaW5fc2FkIC8gMjU2LjA7CisgICAgfQorCisgICAgLyoqIGRvIG1vdGlvbiBjb21wIGhlcmUgZm9yIG5vdyAqLworICAgIHJlZiA9IGN1cnJQaWMtPlNsICsgaTAgKyBqMCAqIGx4OworICAgIC8qIGNvcHkgZnJvbSB0aGUgYmVzdCByZXN1bHQgdG8gY3VycmVudCBQaWN0dXJlICovCisgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgKnJlZisrID0gKm5jYW5kKys7CisgICAgICAgIH0KKyAgICAgICAgcmVmICs9IChseCAtIDE2KTsKKyAgICAgICAgbmNhbmQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgQVZDRnVsbFNlYXJjaAorICAgIERhdGU6ICAgICAgIDA5LzE2LzIwMDAKKyAgICBQdXJwb3NlOiAgICBQZXJmb3JtIGZ1bGwtc2VhcmNoIG1vdGlvbiBlc3RpbWF0aW9uIG92ZXIgdGhlIHJhbmdlIG9mIHNlYXJjaAorICAgICAgICAgICAgICAgIHJlZ2lvbiBpbiBhIHNwaXJhbC1vdXR3YXJkIG1hbm5lci4KKyAgICBJbnB1dC9PdXRwdXQ6ICAgVmlkZW9FbmNEYXRhLCBjdXJyZW50IFZvbCwgcHJldmlvdSBWb3AsIHBvaW50ZXIgdG8gdGhlIGxlZnQgY29ybmVyIG9mCisgICAgICAgICAgICAgICAgY3VycmVudCBWT1AsIGN1cnJlbnQgY29vcmQgKGFsc28gb3V0cHV0KSwgYm91bmRhcmllcy4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IEFWQ0Z1bGxTZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpwcmV2LCB1aW50OCAqY3VyLAorICAgICAgICAgICAgICAgICAgaW50ICppbWluLCBpbnQgKmptaW4sIGludCBpbG93LCBpbnQgaWhpZ2gsIGludCBqbG93LCBpbnQgamhpZ2gsCisgICAgICAgICAgICAgICAgICBpbnQgY212eCwgaW50IGNtdnkpCit7CisgICAgaW50IHJhbmdlID0gZW5jdmlkLT5yYXRlQ3RybC0+bXZSYW5nZTsKKyAgICBBVkNQaWN0dXJlRGF0YSAqY3VyclBpYyA9IGVuY3ZpZC0+Y29tbW9uLT5jdXJyUGljOworICAgIHVpbnQ4ICpjYW5kOworICAgIGludCBpLCBqLCBrLCBsOworICAgIGludCBkLCBkbWluOworICAgIGludCBpMCA9ICppbWluOyAvKiBjdXJyZW50IHBvc2l0aW9uICovCisgICAgaW50IGowID0gKmptaW47CisgICAgaW50ICgqU0FEX01hY3JvYmxvY2spKHVpbnQ4KiwgdWludDgqLCBpbnQsIHZvaWQqKSA9IGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTWFjcm9ibG9jazsKKyAgICB2b2lkICpleHRyYV9pbmZvID0gZW5jdmlkLT5zYWRfZXh0cmFfaW5mbzsKKyAgICBpbnQgbHggPSBjdXJyUGljLT5waXRjaDsgLyogd2l0aCBwYWRkaW5nICovCisKKyAgICBpbnQgb2Zmc2V0ID0gaTAgKyBqMCAqIGx4OworCisgICAgaW50IGxhbWJkYV9tb3Rpb24gPSBlbmN2aWQtPmxhbWJkYV9tb3Rpb247CisgICAgdWludDggKm12Yml0cyA9IGVuY3ZpZC0+bXZiaXRzOworICAgIGludCBtdnNoaWZ0ID0gMjsKKyAgICBpbnQgbXZjb3N0OworICAgIGludCBtaW5fc2FkOworCisgICAgY2FuZCA9IHByZXYgKyBvZmZzZXQ7CisKKyAgICBkbWluICA9ICgqU0FEX01hY3JvYmxvY2spKGNhbmQsIGN1ciwgKDY1NTM1IDw8IDE2KSB8IGx4LCAodm9pZCopZXh0cmFfaW5mbyk7CisgICAgbXZjb3N0ID0gTVZfQ09TVChsYW1iZGFfbW90aW9uLCBtdnNoaWZ0LCAwLCAwLCBjbXZ4LCBjbXZ5KTsKKyAgICBtaW5fc2FkID0gZG1pbjsKKyAgICBkbWluICs9IG12Y29zdDsKKworICAgIC8qIHBlcmZvcm0gc3BpcmFsIHNlYXJjaCAqLworICAgIGZvciAoayA9IDE7IGsgPD0gcmFuZ2U7IGsrKykKKyAgICB7CisKKyAgICAgICAgaSA9IGkwIC0gazsKKyAgICAgICAgaiA9IGowIC0gazsKKworICAgICAgICBjYW5kID0gcHJldiArIGkgKyBqICogbHg7CisKKyAgICAgICAgZm9yIChsID0gMDsgbCA8IDgqazsgbCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBubyBuZWVkIGZvciBib3VuZGFyeSBjaGVja2luZyBhZ2FpbiAqLworICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsIChkbWluIDw8IDE2KSB8IGx4LCAodm9pZCopZXh0cmFfaW5mbyk7CisgICAgICAgICAgICAgICAgbXZjb3N0ID0gTVZfQ09TVChsYW1iZGFfbW90aW9uLCBtdnNoaWZ0LCBpIC0gaTAsIGogLSBqMCwgY212eCwgY212eSk7CisgICAgICAgICAgICAgICAgZCArPSAgbXZjb3N0OworCisgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICppbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgKmptaW4gPSBqOworICAgICAgICAgICAgICAgICAgICBtaW5fc2FkID0gZCAtIG12Y29zdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsIDwgKGsgPDwgMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGNhbmQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGwgPCAoayA8PCAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgY2FuZCArPSBseDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGwgPCAoKGsgPDwgMikgKyAoayA8PCAxKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgIGNhbmQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgICAgY2FuZCAtPSBseDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVuY3ZpZC0+cmF0ZUN0cmwtPk1BRG9mTUJbZW5jdmlkLT5jb21tb24tPm1iTnVtXSA9IChtaW5fc2FkIC8gMjU2LjApOyAvLyBmb3IgcmF0ZSBjb250cm9sCisKKyAgICByZXR1cm4gZG1pbjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgQVZDQ2FuZGlkYXRlU2VsZWN0aW9uCisgICAgRGF0ZTogICAgICAgMDkvMTYvMjAwMAorICAgIFB1cnBvc2U6ICAgIEZpbGwgdXAgdGhlIGxpc3Qgb2YgY2FuZGlkYXRlIHVzaW5nIHNwYXRpby10ZW1wb3JhbCBjb3JyZWxhdGlvbgorICAgICAgICAgICAgICAgIGFtb25nIG5laWdoYm9yaW5nIGJsb2Nrcy4KKyAgICBJbnB1dC9PdXRwdXQ6ICAgdHlwZV9wcmVkID0gMDogZmlyc3QgcGFzcywgMTogc2Vjb25kIHBhc3MsIG9yIG5vIFNDRAorICAgIE1vZGlmaWVkOiAgICwgMDkvMjMvMDEsIGdldCByaWQgb2YgcmVkdW5kYW50IGNhbmRpZGF0ZXMgYmVmb3JlIHBhc3NpbmcgYmFjay4KKyAgICAgICAgICAgICAgICAsIDA5LzExLzA3LCBhZGRlZCByZXR1cm4gZm9yIG1vZGlmaWVkIHByZWRpY3RlZCBNViwgdGhpcyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBmb3IgYm90aCBmYXN0IHNlYXJjaCBhbmQgZnVsbHNlYXJjaC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIEFWQ0NhbmRpZGF0ZVNlbGVjdGlvbihpbnQgKm12eCwgaW50ICptdnksIGludCAqbnVtX2NhbiwgaW50IGltYiwgaW50IGptYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgdHlwZV9wcmVkLCBpbnQgKmNtdngsIGludCAqY212eSkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDTVYgKm1vdDE2eDE2ID0gZW5jdmlkLT5tb3QxNngxNjsKKyAgICBBVkNNViAqcG1vdDsKKyAgICBpbnQgbWJudW0gPSB2aWRlby0+bWJOdW07CisgICAgaW50IG1id2lkdGggPSB2aWRlby0+UGljV2lkdGhJbk1iczsKKyAgICBpbnQgbWJoZWlnaHQgPSB2aWRlby0+UGljSGVpZ2h0SW5NYnM7CisgICAgaW50IGksIGosIHNhbWUsIG51bTE7CisKKyAgICAvKiB0aGlzIHBhcnQgaXMgZm9yIHByZWRpY3RlZCBNViAqLworICAgIGludCBwbXZBX3ggPSAwLCBwbXZBX3kgPSAwLCBwbXZCX3ggPSAwLCBwbXZCX3kgPSAwLCBwbXZDX3ggPSAwLCBwbXZDX3kgPSAwOworICAgIGludCBhdmFpbEEgPSAwLCBhdmFpbEIgPSAwLCBhdmFpbEMgPSAwOworCisgICAgKm51bV9jYW4gPSAwOworCisgICAgaWYgKHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0gIT0gMCkgLy8gcHJldmlvdXMgZnJhbWUgaXMgYW4gSURSIGZyYW1lCisgICAgeworICAgICAgICAvKiBTcGF0aW8tVGVtcG9yYWwgQ2FuZGlkYXRlIChmaXZlIGNhbmRpZGF0ZXMpICovCisgICAgICAgIGlmICh0eXBlX3ByZWQgPT0gMCkgLyogZmlyc3QgcGFzcyAqLworICAgICAgICB7CisgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtXTsgLyogc2FtZSBjb29yZGluYXRlIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICBpZiAoaW1iID49IChtYndpZHRoID4+IDEpICYmIGltYiA+IDApICAvKmxlZnQgbmVpZ2hib3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLTFdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpbWIgKyAxIDwgbWJ3aWR0aCkgICAvKnJpZ2h0IG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bSsxXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoam1iIDwgbWJoZWlnaHQgLSAxKSAgLypib3R0b20gbmVpZ2hib3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtK21id2lkdGhdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChqbWIgPiAwKSAgIC8qdXBwZXIgbmVpZ2hib3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGhdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbWIgPiAwICYmIGptYiA+IDApICAvKiB1cHBlci1sZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aC0xXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA+IDAgJiYgaW1iIDwgbWJoZWlnaHQgLSAxKSAgLyogdXBwZXIgcmlnaHQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoKzFdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgICAvKiBzZWNvbmQgcGFzcyAqLworICAgICAgICAgICAgLyogb3JpZ2luYWwgU1QxIGFsZ29yaXRobSAqLworICAgICAgICB7CisgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtXTsgLyogc2FtZSBjb29yZGluYXRlIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisKKyAgICAgICAgICAgIGlmIChpbWIgPiAwKSAgLypsZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLTFdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoam1iID4gMCkgIC8qdXBwZXIgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbWIgPCBtYndpZHRoIC0gMSkgIC8qcmlnaHQgbmVpZ2hib3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtKzFdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoam1iIDwgbWJoZWlnaHQgLSAxKSAgLypib3R0b20gbmVpZ2hib3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtK21id2lkdGhdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgcHJlZGljdGVkIE1WICovCisgICAgICAgIGlmIChpbWIgPiAwKSAgICAvKiBnZXQgTVYgZnJvbSBsZWZ0IChBKSBuZWlnaGJvciBlaXRoZXIgb24gY3VycmVudCBvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICB7CisgICAgICAgICAgICBhdmFpbEEgPSAxOworICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0xXTsKKyAgICAgICAgICAgIHBtdkFfeCA9IHBtb3QtPng7CisgICAgICAgICAgICBwbXZBX3kgPSBwbW90LT55OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGptYiA+IDApIC8qIGdldCBNViBmcm9tIHRvcCAoQikgbmVpZ2hib3IgZWl0aGVyIG9uIGN1cnJlbnQgb3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgYXZhaWxCID0gMTsKKyAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aF07CisgICAgICAgICAgICBwbXZCX3ggPSBwbW90LT54OworICAgICAgICAgICAgcG12Ql95ID0gcG1vdC0+eTsKKworICAgICAgICAgICAgYXZhaWxDID0gMTsKKworICAgICAgICAgICAgaWYgKGltYiA8IG1id2lkdGggLSAxKSAvKiBnZXQgTVYgZnJvbSB0b3AtcmlnaHQgKEMpIG5laWdoYm9yIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgrMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIGdldCBNViBmcm9tIHRvcC1sZWZ0IChEKSBuZWlnaGJvciBvZiBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoLTFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG12Q194ID0gcG1vdC0+eDsKKyAgICAgICAgICAgIHBtdkNfeSA9IHBtb3QtPnk7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlICAvKiBvbmx5IFNwYXRpYWwgQ2FuZGlkYXRlIChmb3VyIGNhbmRpZGF0ZXMpKi8KKyAgICB7CisgICAgICAgIGlmICh0eXBlX3ByZWQgPT0gMCkgLypmaXJzdCBwYXNzKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGltYiA+IDEpICAvKiBuZWlnaGJvciB0d28gYmxvY2tzIGF3YXkgdG8gdGhlIGxlZnQgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLTJdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW1iID4gMCAmJiBqbWIgPiAwKSAgLyogdXBwZXItbGVmdCBuZWlnaGJvciAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aC0xXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA+IDAgJiYgaW1iIDwgbWJoZWlnaHQgLSAxKSAgLyogdXBwZXIgcmlnaHQgbmVpZ2hib3IgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgrMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZ2V0IHByZWRpY3RlZCBNViAqLworICAgICAgICAgICAgaWYgKGltYiA+IDEpICAgIC8qIGdldCBNViBmcm9tIDJuZCBsZWZ0IChBKSBuZWlnaGJvciBlaXRoZXIgb2YgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2YWlsQSA9IDE7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0yXTsKKyAgICAgICAgICAgICAgICBwbXZBX3ggPSBwbW90LT54OworICAgICAgICAgICAgICAgIHBtdkFfeSA9IHBtb3QtPnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChqbWIgPiAwICYmIGltYiA+IDApIC8qIGdldCBNViBmcm9tIHRvcC1sZWZ0IChCKSBuZWlnaGJvciBvZiBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZhaWxCID0gMTsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgtMV07CisgICAgICAgICAgICAgICAgcG12Ql94ID0gcG1vdC0+eDsKKyAgICAgICAgICAgICAgICBwbXZCX3kgPSBwbW90LT55OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoam1iID4gMCAmJiBpbWIgPCBtYndpZHRoIC0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmFpbEMgPSAxOworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aCsxXTsKKyAgICAgICAgICAgICAgICBwbXZDX3ggPSBwbW90LT54OworICAgICAgICAgICAgICAgIHBtdkNfeSA9IHBtb3QtPnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKy8vI2lmZGVmIFNDRU5FX0NIQU5HRV9ERVRFQ1RJT04KKyAgICAgICAgLyogc2Vjb25kIHBhc3MgKFNUMiBhbGdvcml0aG0pKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHlwZV9wcmVkID09IDEpIC8qICA0LzcvMDEgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaW1iID4gMCkgIC8qbGVmdCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLTFdOworICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGptYiA+IDApICAvKnVwcGVyIG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aF07CisgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW1iIDwgbWJ3aWR0aCAtIDEpICAvKnJpZ2h0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0rMV07CisgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoam1iIDwgbWJoZWlnaHQgLSAxKSAgLypib3R0b20gbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bSttYndpZHRoXTsKKyAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8jZWxzZQorICAgICAgICAgICAgZWxzZSAvKiBvcmlnaW5hbCBTVDEgYWxnb3JpdGhtICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGltYiA+IDApICAvKmxlZnQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0xXTsKKyAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGptYiA+IDApICAvKnVwcGVyLWxlZnQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgtMV07CisgICAgICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoam1iID4gMCkgIC8qdXBwZXIgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoXTsKKyAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGltYiA8IG1iaGVpZ2h0IC0gMSkgIC8qdXBwZXItcmlnaHQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgrMV07CisgICAgICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGdldCBwcmVkaWN0ZWQgTVYgKi8KKyAgICAgICAgICAgIGlmIChpbWIgPiAwKSAgICAvKiBnZXQgTVYgZnJvbSBsZWZ0IChBKSBuZWlnaGJvciBlaXRoZXIgb24gY3VycmVudCBvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2YWlsQSA9IDE7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0xXTsKKyAgICAgICAgICAgICAgICBwbXZBX3ggPSBwbW90LT54OworICAgICAgICAgICAgICAgIHBtdkFfeSA9IHBtb3QtPnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChqbWIgPiAwKSAvKiBnZXQgTVYgZnJvbSB0b3AgKEIpIG5laWdoYm9yIGVpdGhlciBvbiBjdXJyZW50IG9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZhaWxCID0gMTsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGhdOworICAgICAgICAgICAgICAgIHBtdkJfeCA9IHBtb3QtPng7CisgICAgICAgICAgICAgICAgcG12Ql95ID0gcG1vdC0+eTsKKworICAgICAgICAgICAgICAgIGF2YWlsQyA9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoaW1iIDwgbWJ3aWR0aCAtIDEpIC8qIGdldCBNViBmcm9tIHRvcC1yaWdodCAoQykgbmVpZ2hib3Igb2YgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoKzFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIC8qIGdldCBNViBmcm9tIHRvcC1sZWZ0IChEKSBuZWlnaGJvciBvZiBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgtMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBtdkNfeCA9IHBtb3QtPng7CisgICAgICAgICAgICAgICAgcG12Q195ID0gcG1vdC0+eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorLy8jZW5kaWYKKyAgICB9CisKKyAgICAvKiAgMy8yMy8wMSwgcmVtb3ZlIHJlZHVuZGFudCBjYW5kaWRhdGUgKHBvc3NpYmxlIGstbWVhbikgKi8KKyAgICBudW0xID0gKm51bV9jYW47CisgICAgKm51bV9jYW4gPSAxOworICAgIGZvciAoaSA9IDE7IGkgPCBudW0xOyBpKyspCisgICAgeworICAgICAgICBzYW1lID0gMDsKKyAgICAgICAgaiA9IDA7CisgICAgICAgIHdoaWxlICghc2FtZSAmJiBqIDwgKm51bV9jYW4pCisgICAgICAgIHsKKyNpZiAoQ0FORElEQVRFX0RJU1RBTkNFPT0wKQorICAgICAgICAgICAgaWYgKG12eFtpXSA9PSBtdnhbal0gJiYgbXZ5W2ldID09IG12eVtqXSkKKyNlbHNlCisgICAgICAgICAgICAvLyBtb2RpZmllZCBrLW1lYW4sICAzLzI0LzAxLCBzaG91bGRuJ3QgYmUgZ3JlYXRlciB0aGFuIDMKKyAgICAgICAgICAgIGlmIChBVkNfQUJTKG12eFtpXSAtIG12eFtqXSkgKyBBVkNfQUJTKG12eVtpXSAtIG12eVtqXSkgPCBDQU5ESURBVEVfRElTVEFOQ0UpCisjZW5kaWYKKyAgICAgICAgICAgICAgICBzYW1lID0gMTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNhbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12eFsqbnVtX2Nhbl0gPSBtdnhbaV07CisgICAgICAgICAgICBtdnlbKm51bV9jYW5dID0gbXZ5W2ldOworICAgICAgICAgICAgKCpudW1fY2FuKSsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG51bTEgPT0gNSAmJiAqbnVtX2NhbiA9PSAxKQorICAgICAgICAqbnVtX2NhbiA9IEFMTF9DQU5EX0VRVUFMOyAvKiBhbGwgYXJlIGVxdWFsICovCisKKyAgICAvKiBjYWxjdWxhdGUgcHJlZGljdGVkIE1WICovCisKKyAgICBpZiAoYXZhaWxBICYmICEoYXZhaWxCIHx8IGF2YWlsQykpCisgICAgeworICAgICAgICAqY212eCA9IHBtdkFfeDsKKyAgICAgICAgKmNtdnkgPSBwbXZBX3k7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpjbXZ4ID0gQVZDX01FRElBTihwbXZBX3gsIHBtdkJfeCwgcG12Q194KTsKKyAgICAgICAgKmNtdnkgPSBBVkNfTUVESUFOKHBtdkFfeSwgcG12Ql95LCBwbXZDX3kpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGdW5jdGlvbjogICBBVkNNb3ZlTmVpZ2hib3JTQUQKKyAgICBEYXRlOiAgICAgICAzLzI3LzAxCisgICAgUHVycG9zZTogICAgTW92ZSBuZWlnaGJvcmluZyBTQUQgYXJvdW5kIHdoZW4gY2VudGVyIGhhcyBzaGlmdGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFWQ01vdmVOZWlnaGJvclNBRChpbnQgZG5bXSwgaW50IG5ld19sb2MpCit7CisgICAgaW50IHRtcFs5XTsKKyAgICB0bXBbMF0gPSBkblswXTsKKyAgICB0bXBbMV0gPSBkblsxXTsKKyAgICB0bXBbMl0gPSBkblsyXTsKKyAgICB0bXBbM10gPSBkblszXTsKKyAgICB0bXBbNF0gPSBkbls0XTsKKyAgICB0bXBbNV0gPSBkbls1XTsKKyAgICB0bXBbNl0gPSBkbls2XTsKKyAgICB0bXBbN10gPSBkbls3XTsKKyAgICB0bXBbOF0gPSBkbls4XTsKKyAgICBkblswXSA9IGRuWzFdID0gZG5bMl0gPSBkblszXSA9IGRuWzRdID0gZG5bNV0gPSBkbls2XSA9IGRuWzddID0gZG5bOF0gPSA2NTUzNjsKKworICAgIHN3aXRjaCAobmV3X2xvYykKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBkbls0XSA9IHRtcFsyXTsKKyAgICAgICAgICAgIGRuWzVdID0gdG1wWzBdOworICAgICAgICAgICAgZG5bNl0gPSB0bXBbOF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZG5bNF0gPSB0bXBbM107CisgICAgICAgICAgICBkbls1XSA9IHRtcFs0XTsKKyAgICAgICAgICAgIGRuWzZdID0gdG1wWzBdOworICAgICAgICAgICAgZG5bN10gPSB0bXBbOF07CisgICAgICAgICAgICBkbls4XSA9IHRtcFsxXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBkbls2XSA9IHRtcFs0XTsKKyAgICAgICAgICAgIGRuWzddID0gdG1wWzBdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbMl07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgZG5bMV0gPSB0bXBbMl07CisgICAgICAgICAgICBkblsyXSA9IHRtcFszXTsKKyAgICAgICAgICAgIGRuWzZdID0gdG1wWzVdOworICAgICAgICAgICAgZG5bN10gPSB0bXBbNl07CisgICAgICAgICAgICBkbls4XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBkblsxXSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzJdID0gdG1wWzRdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbNl07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZG5bMV0gPSB0bXBbOF07CisgICAgICAgICAgICBkblsyXSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzNdID0gdG1wWzRdOworICAgICAgICAgICAgZG5bNF0gPSB0bXBbNV07CisgICAgICAgICAgICBkbls4XSA9IHRtcFs3XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBkblsyXSA9IHRtcFs4XTsKKyAgICAgICAgICAgIGRuWzNdID0gdG1wWzBdOworICAgICAgICAgICAgZG5bNF0gPSB0bXBbNl07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgZG5bMl0gPSB0bXBbMV07CisgICAgICAgICAgICBkblszXSA9IHRtcFsyXTsKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzBdOworICAgICAgICAgICAgZG5bNV0gPSB0bXBbNl07CisgICAgICAgICAgICBkbls2XSA9IHRtcFs3XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkblswXSA9IHRtcFtuZXdfbG9jXTsKKworICAgIHJldHVybiA7Cit9CisKKy8qICAzLzI4LzAxLCBmaW5kIG1pbmltYWwgb2YgZG5bOV0gKi8KKworaW50IEFWQ0ZpbmRNaW4oaW50IGRuW10pCit7CisgICAgaW50IG1pbiwgaTsKKyAgICBpbnQgZG1pbjsKKworICAgIGRtaW4gPSBkblsxXTsKKyAgICBtaW4gPSAxOworICAgIGZvciAoaSA9IDI7IGkgPCA5OyBpKyspCisgICAgeworICAgICAgICBpZiAoZG5baV0gPCBkbWluKQorICAgICAgICB7CisgICAgICAgICAgICBkbWluID0gZG5baV07CisgICAgICAgICAgICBtaW4gPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1pbjsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViNTVmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCkBAIC0wLDAgKzEsOTgxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qIHJhdGUgY29udHJvbCB2YXJpYWJsZXMgKi8KKyNkZWZpbmUgUkNfTUFYX1FVQU5UIDUxCisjZGVmaW5lIFJDX01JTl9RVUFOVCAwICAgLy9jYXAgdG8gMTAgdG8gcHJldmVudCByYXRlIGZsdWN0dWF0aW9uICAgIAorCisjZGVmaW5lIE1BRF9NSU4gMSAvKiBoYW5kbGUgdGhlIGNhc2Ugb2YgZGV2aXNpb24gYnkgemVybyBpbiBSQyAqLworCisKKy8qIGxvY2FsIGZ1bmN0aW9ucyAqLworZG91YmxlIFFQMlFzdGVwKGludCBRUCk7CitpbnQgUXN0ZXAyUVAoZG91YmxlIFFzdGVwKTsKKworZG91YmxlIENvbXB1dGVGcmFtZU1BRChBVkNDb21tb25PYmogKnZpZGVvLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwpOworCit2b2lkIHRhcmdldEJpdENhbGN1bGF0aW9uKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNDb21tb25PYmogKnZpZGVvLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIE11bHRpUGFzcyAqcE1QKTsKKwordm9pZCBjYWxjdWxhdGVRdWFudGl6ZXJfTXVsdGlwYXNzKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNDb21tb25PYmogKnZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgTXVsdGlQYXNzICpwTVApOworCit2b2lkIHVwZGF0ZVJDX1Bvc3RQcm9jKEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgTXVsdGlQYXNzICpwTVApOworCit2b2lkIEFWQ1NhdmVSRFNhbXBsZXMoTXVsdGlQYXNzICpwTVAsIGludCBjb3VudGVyX3NhbXBsZXMpOworCit2b2lkIHVwZGF0ZVJhdGVDb250cm9sKEFWQ1JhdGVDb250cm9sICpyYXRlQ29udHJvbCwgaW50IG5hbF90eXBlKTsKKworaW50IEdldEF2Z0ZyYW1lUVAoQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsKQoreworICAgIHJldHVybiByYXRlQ3RybC0+UWM7Cit9CisKK0FWQ0VuY19TdGF0dXMgUkNEZXRlcm1pbmVGcmFtZU51bShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCB1aW50MzIgbW9kVGltZSwgdWludCAqZnJhbWVOdW0pCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICB1aW50MzIgbW9kVGltZVJlZiA9IGVuY3ZpZC0+bW9kVGltZVJlZjsKKyAgICBpbnQzMiAgY3VyckZyYW1lTnVtIDsKKyAgICBpbnQgIGZyYW1lSW5jOworCisKKyAgICAvKiBjaGVjayB3aXRoIHRoZSBidWZmZXIgZnVsbG5lc3MgdG8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYml0cyB0byBlbmNvZGUgdGhpcyBmcmFtZSAqLworICAgIC8qIHdlIGNhbiB1c2UgYSB0aHJlc2hvbGQgdG8gZ3VhcmFudGVlIG1pbmltdW0gcGljdHVyZSBxdWFsaXR5ICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBmb3Igbm93LCB0aGUgZGVmYXVsdCBpcyB0byBlbmNvZGUgZXZlcnkgZnJhbWUsIFRvIEJlIENoYW5nZWQgKi8KKyAgICBpZiAocmF0ZUN0cmwtPmZpcnN0X2ZyYW1lKQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5tb2RUaW1lUmVmID0gbW9kVGltZTsKKyAgICAgICAgZW5jdmlkLT53cmFwTW9kVGltZSA9IDA7CisgICAgICAgIGVuY3ZpZC0+cHJldkZyYW1lTnVtID0gMDsKKyAgICAgICAgZW5jdmlkLT5wcmV2UHJvY0ZyYW1lTnVtID0gMDsKKworICAgICAgICAqZnJhbWVOdW0gPSAwOworCisgICAgICAgIC8qIHNldCBmcmFtZSB0eXBlIHRvIElEUi1mcmFtZSAqLworICAgICAgICB2aWRlby0+bmFsX3VuaXRfdHlwZSA9IEFWQ19OQUxUWVBFX0lEUjsKKyAgICAgICAgc2xpY2VIZHItPnNsaWNlX3R5cGUgPSBBVkNfSV9BTExfU0xJQ0U7CisgICAgICAgIHZpZGVvLT5zbGljZV90eXBlID0gQVZDX0lfU0xJQ0U7CisKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAobW9kVGltZSA8IG1vZFRpbWVSZWYpIC8qIG1vZFRpbWUgd3JhcHBlZCBhcm91bmQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZW5jdmlkLT53cmFwTW9kVGltZSArPSAoKHVpbnQzMikweEZGRkZGRkZGIC0gbW9kVGltZVJlZikgKyAxOworICAgICAgICAgICAgZW5jdmlkLT5tb2RUaW1lUmVmID0gbW9kVGltZVJlZiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbW9kVGltZSArPSBlbmN2aWQtPndyYXBNb2RUaW1lOyAvKiB3cmFwTW9kVGltZSBpcyBub24gemVybyBhZnRlciB3cmFwLWFyb3VuZCAqLworCisgICAgICAgIGN1cnJGcmFtZU51bSA9IChpbnQzMikoKChtb2RUaW1lIC0gbW9kVGltZVJlZikgKiByYXRlQ3RybC0+ZnJhbWVfcmF0ZSArIDIwMCkgLyAxMDAwKTsgLyogYWRkIHNtYWxsIHJvdW5kaW5ncyAqLworCisgICAgICAgIGlmIChjdXJyRnJhbWVOdW0gPD0gKGludDMyKWVuY3ZpZC0+cHJldlByb2NGcmFtZU51bSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOyAgLyogdGhpcyBpcyBhIGxhdGUgZnJhbWUgZG8gbm90IGVuY29kZSBpdCAqLworICAgICAgICB9CisKKyAgICAgICAgZnJhbWVJbmMgPSBjdXJyRnJhbWVOdW0gLSBlbmN2aWQtPnByZXZQcm9jRnJhbWVOdW07CisKKyAgICAgICAgaWYgKGZyYW1lSW5jIDwgcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSArIDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsgIC8qIGZyYW1lIHNraXAgcmVxdWlyZWQgdG8gbWFpbnRhaW4gdGhlIHRhcmdldCBiaXQgcmF0ZS4gKi8KKyAgICAgICAgfQorCisgICAgICAgIFJDVXBkYXRlQnVmZmVyKHZpZGVvLCByYXRlQ3RybCwgZnJhbWVJbmMgLSByYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lKTsgIC8qIGluIGNhc2UgbW9yZSBmcmFtZXMgZHJvcHBlZCAqLworCisgICAgICAgICpmcmFtZU51bSA9IGN1cnJGcmFtZU51bTsKKworICAgICAgICAvKiBUaGlzIHBhcnQgd291bGQgYmUgc2ltaWxhciB0byBEZXRlcm1pbmVWb3BUeXBlIG9mIG00dmVuYyAqLworICAgICAgICBpZiAoKCpmcmFtZU51bSA+PSAodWludClyYXRlQ3RybC0+aWRyUGVyaW9kICYmIHJhdGVDdHJsLT5pZHJQZXJpb2QgPiAwKSB8fCAoKmZyYW1lTnVtID4gdmlkZW8tPk1heEZyYW1lTnVtKSkgLyogZmlyc3QgZnJhbWUgb3IgSURSKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogc2V0IGZyYW1lIHR5cGUgdG8gSURSLWZyYW1lICovCisgICAgICAgICAgICBpZiAocmF0ZUN0cmwtPmlkclBlcmlvZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmN2aWQtPm1vZFRpbWVSZWYgKz0gKHVpbnQzMikocmF0ZUN0cmwtPmlkclBlcmlvZCAqIDEwMDAgLyByYXRlQ3RybC0+ZnJhbWVfcmF0ZSk7CisgICAgICAgICAgICAgICAgKmZyYW1lTnVtIC09IHJhdGVDdHJsLT5pZHJQZXJpb2Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5tb2RUaW1lUmVmICs9ICh1aW50MzIpKHZpZGVvLT5NYXhGcmFtZU51bSAqIDEwMDAgLyByYXRlQ3RybC0+ZnJhbWVfcmF0ZSk7CisgICAgICAgICAgICAgICAgKmZyYW1lTnVtIC09IHZpZGVvLT5NYXhGcmFtZU51bTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlkZW8tPm5hbF91bml0X3R5cGUgPSBBVkNfTkFMVFlQRV9JRFI7CisgICAgICAgICAgICBzbGljZUhkci0+c2xpY2VfdHlwZSA9IEFWQ19JX0FMTF9TTElDRTsKKyAgICAgICAgICAgIHZpZGVvLT5zbGljZV90eXBlID0gQVZDX0lfU0xJQ0U7CisgICAgICAgICAgICBlbmN2aWQtPnByZXZQcm9jRnJhbWVOdW0gPSAqZnJhbWVOdW07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+bmFsX3VuaXRfdHlwZSA9IEFWQ19OQUxUWVBFX1NMSUNFOworICAgICAgICAgICAgc2xpY2VIZHItPnNsaWNlX3R5cGUgPSBBVkNfUF9BTExfU0xJQ0U7CisgICAgICAgICAgICB2aWRlby0+c2xpY2VfdHlwZSA9IEFWQ19QX1NMSUNFOworICAgICAgICAgICAgZW5jdmlkLT5wcmV2UHJvY0ZyYW1lTnVtID0gY3VyckZyYW1lTnVtOworICAgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKK3ZvaWQgUkNVcGRhdGVCdWZmZXIoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBpbnQgZnJhbWVJbmMpCit7CisgICAgaW50IHRtcDsKKyAgICBNdWx0aVBhc3MgKnBNUCA9IHJhdGVDdHJsLT5wTVA7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcodmlkZW8pOworCisgICAgaWYgKHJhdGVDdHJsLT5yY0VuYWJsZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgaWYgKGZyYW1lSW5jID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gcmF0ZUN0cmwtPmJpdHNQZXJGcmFtZSAqIChmcmFtZUluYyAtIDEpOworICAgICAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtPSB0bXA7CisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgKz0gMTAgKiAoZnJhbWVJbmMgLSAxKTsKKworICAgICAgICAgICAgLyogQ2hlY2sgYnVmZmVyIHVuZGVyZmxvdyAqLworICAgICAgICAgICAgaWYgKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPCByYXRlQ3RybC0+bG93X2JvdW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPSByYXRlQ3RybC0+bG93X2JvdW5kOyAvLyAtcmF0ZUN0cmwtPkJzLzI7CisgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPlRNTl9XID0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtIHJhdGVDdHJsLT5sb3dfYm91bmQ7CisgICAgICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjID0gcE1QLT5jb3VudGVyX0JUZHN0ICsgKGludCkoKE9zY2xGbG9hdCkocmF0ZUN0cmwtPkJzIC8gMiAtIHJhdGVDdHJsLT5sb3dfYm91bmQpIC8gMi4wIC8gKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lIC8gMTApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCitBVkNFbmNfU3RhdHVzIEluaXRSYXRlQ29udHJvbE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBkb3VibGUgTDEsIEwyLCBMMywgYnBwOworICAgIGludCBxcDsKKyAgICBpbnQgaSwgajsKKworICAgIHJhdGVDdHJsLT5iYXNpY1VuaXQgPSB2aWRlby0+UGljU2l6ZUluTWJzOworCisgICAgcmF0ZUN0cmwtPk1BRG9mTUIgPSAoZG91YmxlKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2MoZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPlBpY1NpemVJbk1icyAqIHNpemVvZihkb3VibGUpLCBERUZBVUxUX0FUVFIpOworCisgICAgaWYgKCFyYXRlQ3RybC0+TUFEb2ZNQikKKyAgICB7CisgICAgICAgIGdvdG8gQ0xFQU5VUF9SQzsKKyAgICB9CisKKyAgICBpZiAocmF0ZUN0cmwtPnJjRW5hYmxlID09IFRSVUUpCisgICAgeworICAgICAgICByYXRlQ3RybC0+cE1QID0gKE11bHRpUGFzcyopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKGVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwgc2l6ZW9mKE11bHRpUGFzcyksIERFRkFVTFRfQVRUUik7CisgICAgICAgIGlmICghcmF0ZUN0cmwtPnBNUCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBDTEVBTlVQX1JDOworICAgICAgICB9CisgICAgICAgIG1lbXNldChyYXRlQ3RybC0+cE1QLCAwLCBzaXplb2YoTXVsdGlQYXNzKSk7CisgICAgICAgIHJhdGVDdHJsLT5wTVAtPmVuY29kZWRfZnJhbWVzID0gLTE7IC8qIGZvcmdldCBhYm91dCB0aGUgdmVyeSBmaXJzdCBJIGZyYW1lICovCisKKyAgICAgICAgLyogUkRJbmZvICoqcFJEU2FtcGxlcyAqLworICAgICAgICByYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzID0gKFJESW5mbyAqKilhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyhlbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsICgzMCAqIHNpemVvZihSREluZm8gKikpLCBERUZBVUxUX0FUVFIpOworICAgICAgICBpZiAoIXJhdGVDdHJsLT5wTVAtPnBSRFNhbXBsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5VUF9SQzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICByYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzW2ldID0gKFJESW5mbyAqKWF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKGVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwgKDMyICogc2l6ZW9mKFJESW5mbykpLCBERUZBVUxUX0FUVFIpOworICAgICAgICAgICAgaWYgKCFyYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gQ0xFQU5VUF9SQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKSAgICBtZW1zZXQoJihyYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzW2ldW2pdKSwgMCwgc2l6ZW9mKFJESW5mbykpOworICAgICAgICB9CisgICAgICAgIHJhdGVDdHJsLT5wTVAtPmZyYW1lUmFuZ2UgPSAoaW50KShyYXRlQ3RybC0+ZnJhbWVfcmF0ZSAqIDEuMCk7IC8qIDEuMHMgdGltZSBmcmFtZSovCisgICAgICAgIHJhdGVDdHJsLT5wTVAtPmZyYW1lUmFuZ2UgPSBBVkNfTUFYKHJhdGVDdHJsLT5wTVAtPmZyYW1lUmFuZ2UsIDUpOworICAgICAgICByYXRlQ3RybC0+cE1QLT5mcmFtZVJhbmdlID0gQVZDX01JTihyYXRlQ3RybC0+cE1QLT5mcmFtZVJhbmdlLCAzMCk7CisKKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+ZnJhbWVQb3MgPSAtMTsKKworCisgICAgICAgIHJhdGVDdHJsLT5iaXRzUGVyRnJhbWUgPSAoaW50MzIpKHJhdGVDdHJsLT5iaXRSYXRlIC8gcmF0ZUN0cmwtPmZyYW1lX3JhdGUpOworCisgICAgICAgIC8qIEJYIHJhdGUgY29udHJvbCAqLworICAgICAgICByYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lID0gMDsgLyogbXVzdCBiZSBpbml0aWFsaXplZCAqLworCisgICAgICAgIHJhdGVDdHJsLT5CcyA9IHJhdGVDdHJsLT5jcGJTaXplOworICAgICAgICByYXRlQ3RybC0+VE1OX1cgPSAwOworICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzID0gKGludCkocmF0ZUN0cmwtPkJzICogMC41KTsgLyogcmF0ZUN0cmwtPkJzICovCisgICAgICAgIHJhdGVDdHJsLT5lbmNvZGVkX2ZyYW1lcyA9IDA7CisKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9USCA9IHJhdGVDdHJsLT5iaXRzUGVyRnJhbWU7CisKKyAgICAgICAgcmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gPSAoaW50KSgoT3NjbEZsb2F0KShyYXRlQ3RybC0+QnMgLSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzKSAvIChyYXRlQ3RybC0+Yml0c1BlckZyYW1lIC8gMTAuMCkpIC0gNTsKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtIDwgMCkgcmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gKz0gNTsKKworICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgYnVmZmVyIGZ1bGxuZXNzCisgICAgICAgIC8qIEFjY29yZGluZyB0byB0aGUgc3BlYywgdGhlIGluaXRpYWwgYnVmZmVyIGZ1bGxuZXNzIG5lZWRzIHRvIGJlIHNldCB0byAxLzMgKi8KKyAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA9IChpbnQpKHJhdGVDdHJsLT5CcyAvIDMuMCAtIHJhdGVDdHJsLT5CcyAvIDIuMCk7IC8qIHRoZSBidWZmZXIgcmFuZ2UgaXMgWy1Ccy8yLCBCcy8yXSAqLworICAgICAgICByYXRlQ3RybC0+cE1QLT5jb3VudGVyX0JUc3JjID0gKGludCkoKHJhdGVDdHJsLT5CcyAvIDIuMCAtIHJhdGVDdHJsLT5CcyAvIDMuMCkgLyAocmF0ZUN0cmwtPmJpdHNQZXJGcmFtZSAvIDEwLjApKTsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9XID0gKGludCkocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyArIHJhdGVDdHJsLT5wTVAtPmNvdW50ZXJfQlRzcmMgKiAocmF0ZUN0cmwtPmJpdHNQZXJGcmFtZSAvIDEwLjApKTsKKworICAgICAgICByYXRlQ3RybC0+bG93X2JvdW5kID0gLXJhdGVDdHJsLT5CcyAvIDI7CisgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3Nfb2Zmc2V0ID0gMDsKKworICAgICAgICAvKiBTZXR0aW5nIHRoZSBiaXRyYXRlIGFuZCBmcmFtZXJhdGUgKi8KKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+Yml0cmF0ZSA9IHJhdGVDdHJsLT5iaXRSYXRlOworICAgICAgICByYXRlQ3RybC0+cE1QLT5mcmFtZXJhdGUgPSByYXRlQ3RybC0+ZnJhbWVfcmF0ZTsKKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lID0gcmF0ZUN0cmwtPnBNUC0+Yml0cmF0ZSAvIHJhdGVDdHJsLT5wTVAtPmZyYW1lcmF0ZTsKKworICAgICAgICAvKmNvbXB1dGUgdGhlIGluaXRpYWwgUVAqLworICAgICAgICBicHAgPSAxLjAgKiByYXRlQ3RybC0+Yml0UmF0ZSAvIChyYXRlQ3RybC0+ZnJhbWVfcmF0ZSAqICh2aWRlby0+UGljU2l6ZUluTWJzIDw8IDgpKTsKKyAgICAgICAgaWYgKHZpZGVvLT5QaWNXaWR0aEluU2FtcGxlc0wgPT0gMTc2KQorICAgICAgICB7CisgICAgICAgICAgICBMMSA9IDAuMTsKKyAgICAgICAgICAgIEwyID0gMC4zOworICAgICAgICAgICAgTDMgPSAwLjY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmlkZW8tPlBpY1dpZHRoSW5TYW1wbGVzTCA9PSAzNTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEwxID0gMC4yOworICAgICAgICAgICAgTDIgPSAwLjY7CisgICAgICAgICAgICBMMyA9IDEuMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEwxID0gMC42OworICAgICAgICAgICAgTDIgPSAxLjQ7CisgICAgICAgICAgICBMMyA9IDIuNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYXRlQ3RybC0+aW5pdFFQID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChicHAgPD0gTDEpCisgICAgICAgICAgICAgICAgcXAgPSAzNTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJwcCA8PSBMMikKKyAgICAgICAgICAgICAgICBxcCA9IDI1OworICAgICAgICAgICAgZWxzZSBpZiAoYnBwIDw9IEwzKQorICAgICAgICAgICAgICAgIHFwID0gMjA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcXAgPSAxNTsKKyAgICAgICAgICAgIHJhdGVDdHJsLT5pbml0UVAgPSBxcDsKKyAgICAgICAgfQorCisgICAgICAgIHJhdGVDdHJsLT5RYyA9IHJhdGVDdHJsLT5pbml0UVA7CisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworCitDTEVBTlVQX1JDOgorCisgICAgQ2xlYW51cFJhdGVDb250cm9sTW9kdWxlKGF2Y0hhbmRsZSk7CisgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKworfQorCisKK3ZvaWQgQ2xlYW51cFJhdGVDb250cm9sTW9kdWxlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgaW50IGk7CisKKyAgICBpZiAocmF0ZUN0cmwtPk1BRG9mTUIpCisgICAgeworICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUoYXZjSGFuZGxlLT51c2VyRGF0YSwgKGludCkocmF0ZUN0cmwtPk1BRG9mTUIpKTsKKyAgICB9CisKKyAgICBpZiAocmF0ZUN0cmwtPnBNUCkKKyAgICB7CisgICAgICAgIGlmIChyYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlc1tpXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZShhdmNIYW5kbGUtPnVzZXJEYXRhLCAoaW50KXJhdGVDdHJsLT5wTVAtPnBSRFNhbXBsZXNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZShhdmNIYW5kbGUtPnVzZXJEYXRhLCAoaW50KXJhdGVDdHJsLT5wTVAtPnBSRFNhbXBsZXMpOworICAgICAgICB9CisgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZShhdmNIYW5kbGUtPnVzZXJEYXRhLCAoaW50KShyYXRlQ3RybC0+cE1QKSk7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBSQ0luaXRHT1AoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgLyogaW4gQlggUkMsIHRoZXJlJ3Mgbm8gR09QLWxldmVsIFJDICovCisKKyAgICBPU0NMX1VOVVNFRF9BUkcoZW5jdmlkKTsKKworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBSQ0luaXRGcmFtZVFQKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIEFWQ1BpY1BhcmFtU2V0ICpwaWNQYXJhbSA9IHZpZGVvLT5jdXJyUGljUGFyYW1zOworICAgIE11bHRpUGFzcyAqcE1QID0gcmF0ZUN0cmwtPnBNUDsKKworICAgIGlmIChyYXRlQ3RybC0+cmNFbmFibGUgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIC8qIGZyYW1lIGxheWVyIHJhdGUgY29udHJvbCAqLworICAgICAgICBpZiAocmF0ZUN0cmwtPmVuY29kZWRfZnJhbWVzID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5RUHkgPSByYXRlQ3RybC0+UWMgPSByYXRlQ3RybC0+aW5pdFFQOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY2FsY3VsYXRlUXVhbnRpemVyX011bHRpcGFzcyhlbmN2aWQsIHZpZGVvLCByYXRlQ3RybCwgcE1QKTsKKyAgICAgICAgICAgIHZpZGVvLT5RUHkgPSByYXRlQ3RybC0+UWM7CisgICAgICAgIH0KKworICAgICAgICByYXRlQ3RybC0+TnVtYmVyb2ZIZWFkZXJCaXRzID0gMDsKKyAgICAgICAgcmF0ZUN0cmwtPk51bWJlcm9mVGV4dHVyZUJpdHMgPSAwOworICAgICAgICByYXRlQ3RybC0+bnVtRnJhbWVCaXRzID0gMDsgLy8gcmVzZXQKKworICAgICAgICAvKiB1cGRhdGUgcE1QLT5mcmFtZVBvcyAqLworICAgICAgICBpZiAoKytwTVAtPmZyYW1lUG9zID09IHBNUC0+ZnJhbWVSYW5nZSkgcE1QLT5mcmFtZVBvcyA9IDA7CisKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5UID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCA9IChpbnQpKHJhdGVDdHJsLT5mcmFtZV9yYXRlICogNy41ICsgMC41KTsgLyogMC43NXMgdGltZSBmcmFtZSAqLworICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0ID0gQVZDX01JTihwTVAtPmNvdW50ZXJfQlRkc3QsIChpbnQpKHJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtIC8gMiAqIDAuNDApKTsgLyogMC43NXMgdGltZSBmcmFtZSBtYXkgZ28gYmV5b25kIFZCViBidWZmZXIgaWYgd2Ugc2V0IHRoZSBidWZmZXIgc2l6ZSBzbWFsbGVyIHRoYW4gMC43NXMgKi8KKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCA9IEFWQ19NQVgocE1QLT5jb3VudGVyX0JUZHN0LCAoaW50KSgocmF0ZUN0cmwtPkJzIC8gMiAtIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MpICogMC4zMCAvIChyYXRlQ3RybC0+VE1OX1RIIC8gMTAuMCkgKyAwLjUpKTsgLyogQXQgbGVhc3QgMzAlIG9mIFZCViBidWZmZXIgc2l6ZS8yICovCisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgPSBBVkNfTUlOKHBNUC0+Y291bnRlcl9CVGRzdCwgMjApOyAvKiBMaW1pdCB0aGUgdGFyZ2V0IHRvIGJlIHNtYWxsZXIgdGhhbiAzQyAqLworCisgICAgICAgICAgICBwTVAtPnRhcmdldF9iaXRzID0gcmF0ZUN0cmwtPlQgPSByYXRlQ3RybC0+VE1OX1RIID0gKGludCkocmF0ZUN0cmwtPlRNTl9USCAqICgxLjAgKyBwTVAtPmNvdW50ZXJfQlRkc3QgKiAwLjEpKTsKKyAgICAgICAgICAgIHBNUC0+ZGlmZl9jb3VudGVyID0gcE1QLT5jb3VudGVyX0JUZHN0OworICAgICAgICB9CisKKyAgICAgICAgLyogY29sbGVjdCB0aGUgbmVjZXNzYXJ5IGRhdGE6IHRhcmdldCBiaXRzLCBhY3R1YWwgYml0cywgbWFkIGFuZCBRUCAqLworICAgICAgICBwTVAtPnRhcmdldF9iaXRzID0gcmF0ZUN0cmwtPlQ7CisgICAgICAgIHBNUC0+UVAgID0gdmlkZW8tPlFQeTsKKworICAgICAgICBwTVAtPm1hZCA9IChPc2NsRmxvYXQpcmF0ZUN0cmwtPnRvdGFsU0FEIC8gdmlkZW8tPlBpY1NpemVJbk1iczsgLy9Db21wdXRlRnJhbWVNQUQodmlkZW8sIHJhdGVDdHJsKTsKKyAgICAgICAgaWYgKHBNUC0+bWFkIDwgTUFEX01JTikgcE1QLT5tYWQgPSBNQURfTUlOOyAvKiBNQURfTUlOIGlzIGRlZmluZWQgYXMgMSBpbiBtcDRkZWYuaCAqLworCisgICAgICAgIHBNUC0+Yml0cmF0ZSA9IHJhdGVDdHJsLT5iaXRSYXRlOyAvKiBjYWxjdWxhdGVkIGluIFJDVm9wUVBTZXR0aW5nICovCisgICAgICAgIHBNUC0+ZnJhbWVyYXRlID0gcmF0ZUN0cmwtPmZyYW1lX3JhdGU7CisKKyAgICAgICAgLyogZmlyc3QgcGFzcyBlbmNvZGluZyAqLworICAgICAgICBwTVAtPm5SZV9RdWFudGl6ZWQgPSAwOworCisgICAgfSAvLyByY0VuYWJsZQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvLT5RUHkgPSByYXRlQ3RybC0+aW5pdFFQOworICAgIH0KKworLy8gIHByaW50ZigiICVkICIsdmlkZW8tPlFQeSk7CisKKyAgICBpZiAodmlkZW8tPkN1cnJQaWNOdW0gPT0gMCAmJiBlbmN2aWQtPm91dE9mQmFuZFBhcmFtU2V0ID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgcGljUGFyYW0tPnBpY19pbml0X3FzX21pbnVzMjYgPSAwOworICAgICAgICBwaWNQYXJhbS0+cGljX2luaXRfcXBfbWludXMyNiA9IHZpZGVvLT5RUHkgLSAyNjsKKyAgICB9CisKKyAgICAvLyBuZWVkIHRoaXMgZm9yIG1vdGlvbiBlc3RpbWF0aW9uCisgICAgZW5jdmlkLT5sYW1iZGFfbW9kZSA9IFFQMlFVQU5UW0FWQ19NQVgoMCwgdmlkZW8tPlFQeS1TSElGVF9RUCldOworICAgIGVuY3ZpZC0+bGFtYmRhX21vdGlvbiA9IExBTUJEQV9GQUNUT1IoZW5jdmlkLT5sYW1iZGFfbW9kZSk7CisgICAgcmV0dXJuIDsKK30KKworLyogTWFkIGJhc2VkIHZhcmlhYmxlIGJpdCBhbGxvY2F0aW9uICsgUVAgY2FsY3VsYXRpb24gd2l0aCBhIG5ldyBxdWFkcmF0aWMgbWV0aG9kICovCit2b2lkIGNhbGN1bGF0ZVF1YW50aXplcl9NdWx0aXBhc3MoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0NvbW1vbk9iaiAqdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBNdWx0aVBhc3MgKnBNUCkKK3sKKyAgICBpbnQgcHJldl9hY3R1YWxfYml0cyA9IDAsIGN1cnJfdGFyZ2V0LCAvKnBvcz0wLCovaSwgajsKKyAgICBPc2NsRmxvYXQgUXN0ZXAsIHByZXZfUVAgPSAwLjYyNTsKKworICAgIE9zY2xGbG9hdCBjdXJyX21hZCwgcHJldl9tYWQsIGN1cnJfUkQsIHByZXZfUkQsIGF2ZXJhZ2VfbWFkLCBhdmVyX1FQOworCisgICAgLyogTWFkIGJhc2VkIHZhcmlhYmxlIGJpdCBhbGxvY2F0aW9uICovCisgICAgdGFyZ2V0Qml0Q2FsY3VsYXRpb24oZW5jdmlkLCB2aWRlbywgcmF0ZUN0cmwsIHBNUCk7CisKKyAgICBpZiAocmF0ZUN0cmwtPlQgPD0gMCB8fCByYXRlQ3RybC0+dG90YWxTQUQgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChyYXRlQ3RybC0+VCA8IDApICAgIHJhdGVDdHJsLT5RYyA9IFJDX01BWF9RVUFOVDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogY3VycmVudCBmcmFtZSBRUCBlc3RpbWF0aW9uICovCisgICAgY3Vycl90YXJnZXQgPSByYXRlQ3RybC0+VDsKKyAgICBjdXJyX21hZCA9IChPc2NsRmxvYXQpcmF0ZUN0cmwtPnRvdGFsU0FEIC8gdmlkZW8tPlBpY1NpemVJbk1iczsKKyAgICBpZiAoY3Vycl9tYWQgPCBNQURfTUlOKSBjdXJyX21hZCA9IE1BRF9NSU47IC8qIE1BRF9NSU4gaXMgZGVmaW5lZCBhcyAxIGluIG1wNGRlZi5oICovCisgICAgY3Vycl9SRCAgPSAoT3NjbEZsb2F0KWN1cnJfdGFyZ2V0IC8gY3Vycl9tYWQ7CisKKyAgICBpZiAocmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA9PSAtMSkgLy8gcHJldmlvdXMgd2FzIHNraXBwZWQKKyAgICB7CisgICAgICAgIGkgPSBwTVAtPmZyYW1lUG9zOworICAgICAgICBwcmV2X21hZCA9IHBNUC0+cFJEU2FtcGxlc1tpXVswXS5tYWQ7CisgICAgICAgIHByZXZfUVAgPSBwTVAtPnBSRFNhbXBsZXNbaV1bMF0uUVA7CisgICAgICAgIHByZXZfYWN0dWFsX2JpdHMgPSBwTVAtPnBSRFNhbXBsZXNbaV1bMF0uYWN0dWFsX2JpdHM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEFub3RoZXIgdmVyc2lvbiBvZiBzZWFyY2ggdGhlIG9wdGltYWwgcG9pbnQgKi8KKyAgICAgICAgcHJldl9tYWQgPSAwLjA7CisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IHBNUC0+ZnJhbWVSYW5nZSAmJiBwcmV2X21hZCA8IDAuMDAxKSAvKiBmaW5kIGZpcnN0IG9uZSB3aXRoIG5vbnplcm8gcHJldl9tYWQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcHJldl9tYWQgPSBwTVAtPnBSRFNhbXBsZXNbaV1bMF0ubWFkOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBwTVAtPmZyYW1lUmFuZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZfYWN0dWFsX2JpdHMgPSBwTVAtPnBSRFNhbXBsZXNbaS0xXVswXS5hY3R1YWxfYml0czsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaSA8IHBNUC0+ZnJhbWVSYW5nZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwTVAtPnBSRFNhbXBsZXNbaV1bMF0ubWFkICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWQ19BQlMocHJldl9tYWQgLSBjdXJyX21hZCkgPiBBVkNfQUJTKHBNUC0+cFJEU2FtcGxlc1tpXVswXS5tYWQgLSBjdXJyX21hZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmV2X21hZCA9IHBNUC0+cFJEU2FtcGxlc1tpXVswXS5tYWQ7CisgICAgICAgICAgICAgICAgICAgIHByZXZfYWN0dWFsX2JpdHMgPSBwTVAtPnBSRFNhbXBsZXNbaV1bMF0uYWN0dWFsX2JpdHM7CisgICAgICAgICAgICAgICAgICAgIGogPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZfUVAgPSBRUDJRc3RlcChwTVAtPnBSRFNhbXBsZXNbal1bMF0uUVApOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcE1QLT5zYW1wbGVzUGVyRnJhbWVbal07IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQVZDX0FCUyhwcmV2X2FjdHVhbF9iaXRzIC0gY3Vycl90YXJnZXQpID4gQVZDX0FCUyhwTVAtPnBSRFNhbXBsZXNbal1baV0uYWN0dWFsX2JpdHMgLSBjdXJyX3RhcmdldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmV2X2FjdHVhbF9iaXRzID0gcE1QLT5wUkRTYW1wbGVzW2pdW2ldLmFjdHVhbF9iaXRzOworICAgICAgICAgICAgICAgICAgICBwcmV2X1FQID0gUVAyUXN0ZXAocE1QLT5wUkRTYW1wbGVzW2pdW2ldLlFQKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBxdWFkcmF0aWMgYXBwcm94aW1hdGlvbgorICAgIGlmIChwcmV2X21hZCA+IDAuMDAxKSAvLyBvbmx5IHdoZW4gcHJldl9tYWQgaXMgZ3JlYXRlciB0aGFuIDAsIG90aGVyd2lzZSBrZWVwIHVzaW5nIHRoZSBzYW1lIFFQCisgICAgeworICAgICAgICBwcmV2X1JEID0gKE9zY2xGbG9hdClwcmV2X2FjdHVhbF9iaXRzIC8gcHJldl9tYWQ7CisgICAgICAgIC8vcmF0ZUN0cmwtPlFjID0gKEludCkocHJldl9RUCAqIHNxcnQocHJldl9hY3R1YWxfYml0cy9jdXJyX3RhcmdldCkgKyAwLjQpOworICAgICAgICBpZiAocHJldl9RUCA9PSAwLjYyNSkgLy8gYWRkZWQgdGhpcyB0byBhbGxvdyBnZXR0aW5nIG91dCBvZiBRUCA9IDAgZWFzaWx5CisgICAgICAgIHsKKyAgICAgICAgICAgIFFzdGVwID0gKGludCkocHJldl9SRCAvIGN1cnJfUkQgKyAwLjUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gICAgICByYXRlQ3RybC0+UWMgPShJbnQpKHByZXZfUVAgKiBNNFZFTkNfU1FSVChwcmV2X1JEL2N1cnJfUkQpICsgMC45KTsKKworICAgICAgICAgICAgaWYgKHByZXZfUkQgLyBjdXJyX1JEID4gMC41ICYmIHByZXZfUkQgLyBjdXJyX1JEIDwgMi4wKQorICAgICAgICAgICAgICAgIFFzdGVwID0gKGludCkocHJldl9RUCAqIChzcXJ0KHByZXZfUkQgLyBjdXJyX1JEKSArIHByZXZfUkQgLyBjdXJyX1JEKSAvIDIuMCArIDAuOSk7IC8qIFF1YWRyYXRpYyBhbmQgbGluZWFyIGFwcHJveGltYXRpb24gKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBRc3RlcCA9IChpbnQpKHByZXZfUVAgKiAoc3FydChwcmV2X1JEIC8gY3Vycl9SRCkgKyBwb3cocHJldl9SRCAvIGN1cnJfUkQsIDEuMCAvIDMuMCkpIC8gMi4wICsgMC45KTsKKyAgICAgICAgfQorICAgICAgICAvLyBsb3dlciBib3VuZCBvbiBRYyBzaG91bGQgYmUgYSBmdW5jdGlvbiBvZiBjdXJyX21hZAorICAgICAgICAvLyBXaGVuIG1hZCBpcyBhbHJlYWR5IGxvdywgbG93ZXIgYm91bmQgb24gUWMgZG9lc24ndCBoYXZlIHRvIGJlIHNtYWxsLgorICAgICAgICAvLyBOb3RlLCB0aGlzIGRvZXNuJ3Qgd29yayB3ZWxsIGZvciBsb3cgY29tcGxleGl0eSBjbGlwIGVuY29kZWQgYXQgaGlnaCBiaXQgcmF0ZQorICAgICAgICAvLyBpdCBkb2Vzbid0IGhpdCB0aGUgdGFyZ2V0IGJpdCByYXRlIGR1ZSB0byB0aGlzIFFQIGxvd2VyIGJvdW5kLgorICAgICAgICAvLy8gaWYoKGN1cnJfbWFkIDwgOCkgJiYgKHJhdGVDdHJsLT5RYyA8IDEyKSkgICByYXRlQ3RybC0+UWMgPSAxMjsKKyAgICAgICAgLy8gIGVsc2UgICAgaWYoKGN1cnJfbWFkIDwgMTI4KSAmJiAocmF0ZUN0cmwtPlFjIDwgMykpIHJhdGVDdHJsLT5RYyA9IDM7CisKKyAgICAgICAgcmF0ZUN0cmwtPlFjID0gUXN0ZXAyUVAoUXN0ZXApOworCisgICAgICAgIGlmIChyYXRlQ3RybC0+UWMgPCBSQ19NSU5fUVVBTlQpIHJhdGVDdHJsLT5RYyA9IFJDX01JTl9RVUFOVDsKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5RYyA+IFJDX01BWF9RVUFOVCkgICAgcmF0ZUN0cmwtPlFjID0gUkNfTUFYX1FVQU5UOworICAgIH0KKworICAgIC8qIGFjdGl2ZSBiaXQgcmVzb3VyY2UgcHJvdGVjdGlvbiAqLworICAgIGF2ZXJfUVAgPSAocE1QLT5lbmNvZGVkX2ZyYW1lcyA9PSAwID8gMCA6IHBNUC0+c3VtX1FQIC8gKE9zY2xGbG9hdClwTVAtPmVuY29kZWRfZnJhbWVzKTsKKyAgICBhdmVyYWdlX21hZCA9IChwTVAtPmVuY29kZWRfZnJhbWVzID09IDAgPyAwIDogcE1QLT5zdW1fbWFkIC8gKE9zY2xGbG9hdClwTVAtPmVuY29kZWRfZnJhbWVzKTsgLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgc2NvbmQgZW5jb2RlZCBmcmFtZSovCisgICAgaWYgKHBNUC0+ZGlmZl9jb3VudGVyID09IDAgJiYKKyAgICAgICAgICAgICgoT3NjbEZsb2F0KXJhdGVDdHJsLT5RYyA8PSBhdmVyX1FQKjEuMSB8fCBjdXJyX21hZCA8PSBhdmVyYWdlX21hZCoxLjEpICYmCisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgPD0gKHBNUC0+Y291bnRlcl9CVGRzdCArIChpbnQpKHBNUC0+ZnJhbWVyYXRlKjEuMCArIDAuNSkpKQorICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9USCAtPSAoaW50KShwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwLjApOworICAgICAgICByYXRlQ3RybC0+VCA9IHJhdGVDdHJsLT5UTU5fVEggLSByYXRlQ3RybC0+VE1OX1c7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYysrOworICAgICAgICBwTVAtPmRpZmZfY291bnRlci0tOworICAgIH0KKworfQorCit2b2lkIHRhcmdldEJpdENhbGN1bGF0aW9uKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNDb21tb25PYmogKnZpZGVvLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIE11bHRpUGFzcyAqcE1QKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhlbmN2aWQpOworICAgIE9zY2xGbG9hdCBjdXJyX21hZDsvLywgYXZlcmFnZV9tYWQ7CisgICAgaW50IGRpZmZfY291bnRlcl9CVHNyYywgZGlmZl9jb3VudGVyX0JUZHN0LCBwcmV2X2NvdW50ZXJfZGlmZiwgY3Vycl9jb3VudGVyX2RpZmYsIGJvdW5kOworICAgIC8qIEJUID0gQml0IFRyYW5zZmVyLCBmb3IgcE1QLT5jb3VudGVyX0JUc3JjLCBwTVAtPmNvdW50ZXJfQlRkc3QgKi8KKworICAgIC8qIHNvbWUgc3R1ZmYgYWJvdXQgZnJhbWUgZHJvcHBpbmcgcmVtYWluZWQgaGVyZSB0byBiZSBkb25lIGJlY2F1c2UgcE1QIGNhbm5vdCBiZSBpbnNlcnRlZCBpbnRvIHVwZGF0ZVJhdGVDb250cm9sKCkqLworICAgIHVwZGF0ZVJDX1Bvc3RQcm9jKHJhdGVDdHJsLCBwTVApOworCisgICAgLyogdXBkYXRlIHBNUC0+Y291bnRlcl9CVHNyYyBhbmQgcE1QLT5jb3VudGVyX0JUZHN0IHRvIGF2b2lkIGludGVyZ2VyIG92ZXJmbG93ICovCisgICAgaWYgKHBNUC0+Y291bnRlcl9CVHNyYyA+IDEwMDAgJiYgcE1QLT5jb3VudGVyX0JUZHN0ID4gMTAwMCkKKyAgICB7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyAtPSAxMDAwOworICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgLT0gMTAwMDsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIHRhcmdldCBjYWxjdWxhdGlvbiAqLworICAgIGN1cnJfbWFkID0gKE9zY2xGbG9hdClyYXRlQ3RybC0+dG90YWxTQUQgLyB2aWRlby0+UGljU2l6ZUluTWJzOworICAgIGlmIChjdXJyX21hZCA8IE1BRF9NSU4pIGN1cnJfbWFkID0gTUFEX01JTjsgLyogTUFEX01JTiBpcyBkZWZpbmVkIGFzIDEgaW4gbXA0ZGVmLmggKi8KKyAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSBkaWZmX2NvdW50ZXJfQlRkc3QgPSAwOworICAgIHBNUC0+ZGlmZl9jb3VudGVyID0gMDsKKworCisgICAgLyoxLmNhbGN1bGF0ZSBhdmVyYWdlIG1hZCAqLworICAgIHBNUC0+c3VtX21hZCArPSBjdXJyX21hZDsKKyAgICAvL2F2ZXJhZ2VfbWFkID0gKHBNUC0+ZW5jb2RlZF9mcmFtZXMgPCAxID8gY3Vycl9tYWQgOiBwTVAtPnN1bV9tYWQvKE9zY2xGbG9hdCkocE1QLT5lbmNvZGVkX2ZyYW1lcysxKSk7IC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHNjb25kIGVuY29kZWQgZnJhbWUqLworICAgIC8vcE1QLT5hdmVyX21hZCA9IGF2ZXJhZ2VfbWFkOworICAgIGlmIChwTVAtPmVuY29kZWRfZnJhbWVzID49IDApIC8qIHBNUC0+ZW5jb2RlZF9mcmFtZXMgaXMgc2V0IHRvIC0xIGluaXRpYWxseSwgc28gZm9yZ2V0IGFib3V0IHRoZSB2ZXJ5IGZpcnN0IEkgZnJhbWUgKi8KKyAgICAgICAgcE1QLT5hdmVyX21hZCA9IChwTVAtPmF2ZXJfbWFkICogcE1QLT5lbmNvZGVkX2ZyYW1lcyArIGN1cnJfbWFkKSAvIChwTVAtPmVuY29kZWRfZnJhbWVzICsgMSk7CisKKyAgICBpZiAocE1QLT5vdmVybGFwcGVkX3dpbl9zaXplID4gMCAmJiBwTVAtPmVuY29kZWRfZnJhbWVzX3ByZXYgPj0gMCkKKyAgICAgICAgcE1QLT5hdmVyX21hZF9wcmV2ID0gKHBNUC0+YXZlcl9tYWRfcHJldiAqIHBNUC0+ZW5jb2RlZF9mcmFtZXNfcHJldiArIGN1cnJfbWFkKSAvIChwTVAtPmVuY29kZWRfZnJhbWVzX3ByZXYgKyAxKTsKKworICAgIC8qMi5hdmVyYWdlX21hZCwgbWFkID09PiBkaWZmX2NvdW50ZXJfQlRzcmMsIGRpZmZfY291bnRlcl9CVGRzdCAqLworICAgIGlmIChwTVAtPm92ZXJsYXBwZWRfd2luX3NpemUgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIG9yaWdpbmFsIHZlcmlzb24gKi8KKyAgICAgICAgaWYgKGN1cnJfbWFkID4gcE1QLT5hdmVyX21hZCoxLjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkICsgMC4wMDAxKSA+IDIpCisgICAgICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gKGludCkoc3FydChjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkICsgMC4wMDAxKSkgKiAxMCArIDAuNCkgLSAxMDsKKyAgICAgICAgICAgIC8vZGlmZl9jb3VudGVyX0JUZHN0ID0gKGludCkoKHNxcnQoY3Vycl9tYWQvcE1QLT5hdmVyX21hZCkqMitjdXJyX21hZC9wTVAtPmF2ZXJfbWFkKS8oMyowLjEpICsgMC40KSAtIDEwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVGRzdCA9IChpbnQpKGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWQgKyAwLjAwMDEpICogMTAgKyAwLjQpIC0gMTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBjdXJyX21hZCA8PSBhdmVyYWdlX21hZCoxLjEgKi8KKyAgICAgICAgICAgIC8vZGlmZl9jb3VudGVyX0JUc3JjID0gMTAgLSAoaW50KSgoc3FydChjdXJyX21hZC9wTVAtPmF2ZXJfbWFkKSArIHBvdyhjdXJyX21hZC9wTVAtPmF2ZXJfbWFkLCAxLjAvMy4wKSkvKDIuMCowLjEpICsgMC40KTsKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IDEwIC0gKGludCkoc3FydChjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkICsgMC4wMDAxKSkgKiAxMCArIDAuNSk7CisKKyAgICAgICAgLyogYWN0aXZlbHkgZmlsbCBpbiB0aGUgcG9zc2libGUgZ2FwICovCisgICAgICAgIGlmIChkaWZmX2NvdW50ZXJfQlRzcmMgPT0gMCAmJiBkaWZmX2NvdW50ZXJfQlRkc3QgPT0gMCAmJgorICAgICAgICAgICAgICAgIGN1cnJfbWFkIDw9IHBNUC0+YXZlcl9tYWQqMS4xICYmIHBNUC0+Y291bnRlcl9CVHNyYyA8IHBNUC0+Y291bnRlcl9CVGRzdCkKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IDE7CisKKyAgICB9CisgICAgZWxzZSBpZiAocE1QLT5vdmVybGFwcGVkX3dpbl9zaXplID4gMCkKKyAgICB7CisgICAgICAgIC8qIHRyYW5zaXRpb24gdGltZTogdXNlIHByZXZpb3VzIGF2ZXJhZ2UgbWFkICJwTVAtPmF2ZXJfbWFkX3ByZXYiIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgYXZlcmFnZSBtYWQgInBNUC0+YXZlcl9tYWQiICovCisgICAgICAgIGlmIChjdXJyX21hZCA+IHBNUC0+YXZlcl9tYWRfcHJldioxLjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyX21hZCAvIHBNUC0+YXZlcl9tYWRfcHJldiA+IDIpCisgICAgICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gKGludCkoc3FydChjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkX3ByZXYgKyAwLjAwMDEpKSAqIDEwICsgMC40KSAtIDEwOworICAgICAgICAgICAgLy9kaWZmX2NvdW50ZXJfQlRkc3QgPSAoaW50KSgoTTRWRU5DX1NRUlQoY3Vycl9tYWQvcE1QLT5hdmVyX21hZF9wcmV2KSoyK2N1cnJfbWFkL3BNUC0+YXZlcl9tYWRfcHJldikvKDMqMC4xKSArIDAuNCkgLSAxMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAoaW50KShjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkX3ByZXYgKyAwLjAwMDEpICogMTAgKyAwLjQpIC0gMTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBjdXJyX21hZCA8PSBhdmVyYWdlX21hZCoxLjEgKi8KKyAgICAgICAgICAgIC8vZGlmZl9jb3VudGVyX0JUc3JjID0gMTAgLSAoSW50KSgoc3FydChjdXJyX21hZC9wTVAtPmF2ZXJfbWFkX3ByZXYpICsgcG93KGN1cnJfbWFkL3BNUC0+YXZlcl9tYWRfcHJldiwgMS4wLzMuMCkpLygyLjAqMC4xKSArIDAuNCk7CisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAxMCAtIChpbnQpKHNxcnQoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZF9wcmV2ICsgMC4wMDAxKSkgKiAxMCArIDAuNSk7CisKKyAgICAgICAgLyogYWN0aXZlbHkgZmlsbCBpbiB0aGUgcG9zc2libGUgZ2FwICovCisgICAgICAgIGlmIChkaWZmX2NvdW50ZXJfQlRzcmMgPT0gMCAmJiBkaWZmX2NvdW50ZXJfQlRkc3QgPT0gMCAmJgorICAgICAgICAgICAgICAgIGN1cnJfbWFkIDw9IHBNUC0+YXZlcl9tYWRfcHJldioxLjEgJiYgcE1QLT5jb3VudGVyX0JUc3JjIDwgcE1QLT5jb3VudGVyX0JUZHN0KQorICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gMTsKKworICAgICAgICBpZiAoLS1wTVAtPm92ZXJsYXBwZWRfd2luX3NpemUgPD0gMCkgICAgcE1QLT5vdmVybGFwcGVkX3dpbl9zaXplID0gMDsKKyAgICB9CisKKworICAgIC8qIGlmIGRpZmZlcmVuY2UgaXMgdG9vIG11Y2gsIGRvIGNsaXBwaW5nICovCisgICAgLyogRmlyc3QsIHNldCB0aGUgdXBwZXIgYm91bmQgZm9yIGN1cnJlbnQgYml0IGFsbG9jYXRpb24gdmFyaWFuY2U6IDgwJSBvZiBhdmFpbGFibGUgYnVmZmVyICovCisgICAgYm91bmQgPSAoaW50KSgocmF0ZUN0cmwtPkJzIC8gMiAtIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MpICogMC42IC8gKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lIC8gMTApKTsgLyogcmF0ZUN0cmwtPkJzICovCisgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gIEFWQ19NSU4oZGlmZl9jb3VudGVyX0JUc3JjLCBib3VuZCk7CisgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gIEFWQ19NSU4oZGlmZl9jb3VudGVyX0JUZHN0LCBib3VuZCk7CisKKyAgICAvKiBTZWNvbmQsIHNldCBhbm90aGVyIHVwcGVyIGJvdW5kIGZvciBjdXJyZW50IGJpdCBhbGxvY2F0aW9uOiA0LTUqYml0cmF0ZS9mcmFtZXJhdGUgKi8KKyAgICBib3VuZCA9IDUwOworLy8gIGlmKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSX0xPV0RFTEFZKQorLy8gIG5vdCBuZWNlc3NhcnkgICAgICAgYm91bmQgPSAxMDsgIC0tIEZvciBMb3cgZGVsYXkgKi8KKworICAgIGRpZmZfY291bnRlcl9CVHNyYyA9ICBBVkNfTUlOKGRpZmZfY291bnRlcl9CVHNyYywgYm91bmQpOworICAgIGRpZmZfY291bnRlcl9CVGRzdCA9ICBBVkNfTUlOKGRpZmZfY291bnRlcl9CVGRzdCwgYm91bmQpOworCisKKyAgICAvKiBUaGlyZCwgY2hlY2sgdGhlIGJ1ZmZlciAqLworICAgIHByZXZfY291bnRlcl9kaWZmID0gcE1QLT5jb3VudGVyX0JUZHN0IC0gcE1QLT5jb3VudGVyX0JUc3JjOworICAgIGN1cnJfY291bnRlcl9kaWZmID0gcHJldl9jb3VudGVyX2RpZmYgKyAoZGlmZl9jb3VudGVyX0JUZHN0IC0gZGlmZl9jb3VudGVyX0JUc3JjKTsKKworICAgIGlmIChBVkNfQUJTKHByZXZfY291bnRlcl9kaWZmKSA+PSByYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSB8fCBBVkNfQUJTKGN1cnJfY291bnRlcl9kaWZmKSA+PSByYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSkKKyAgICB7ICAgLy9kaWZmX2NvdW50ZXJfQlRzcmMgPSBkaWZmX2NvdW50ZXJfQlRkc3QgPSAwOworCisgICAgICAgIGlmIChjdXJyX2NvdW50ZXJfZGlmZiA+IHJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtICYmIGRpZmZfY291bnRlcl9CVGRzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gKHJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtIC0gcHJldl9jb3VudGVyX2RpZmYpICsgZGlmZl9jb3VudGVyX0JUc3JjOworICAgICAgICAgICAgaWYgKGRpZmZfY291bnRlcl9CVGRzdCA8IDApIGRpZmZfY291bnRlcl9CVGRzdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmIChjdXJyX2NvdW50ZXJfZGlmZiA8IC1yYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSAmJiBkaWZmX2NvdW50ZXJfQlRzcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IGRpZmZfY291bnRlcl9CVGRzdCAtICgtcmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gLSBwcmV2X2NvdW50ZXJfZGlmZik7CisgICAgICAgICAgICBpZiAoZGlmZl9jb3VudGVyX0JUc3JjIDwgMCkgZGlmZl9jb3VudGVyX0JUc3JjID0gMDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyozLmRpZmZfY291bnRlcl9CVHNyYywgZGlmZl9jb3VudGVyX0JUZHN0ID09PiBUTU5fVEggKi8KKyAgICByYXRlQ3RybC0+VE1OX1RIID0gKGludCkocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUpOworICAgIHBNUC0+ZGlmZl9jb3VudGVyID0gMDsKKworICAgIGlmIChkaWZmX2NvdW50ZXJfQlRzcmMpCisgICAgeworICAgICAgICByYXRlQ3RybC0+VE1OX1RIIC09IChpbnQpKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lICogZGlmZl9jb3VudGVyX0JUc3JjICogMC4xKTsKKyAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXIgPSAtZGlmZl9jb3VudGVyX0JUc3JjOworICAgIH0KKyAgICBlbHNlIGlmIChkaWZmX2NvdW50ZXJfQlRkc3QpCisgICAgeworICAgICAgICByYXRlQ3RybC0+VE1OX1RIICs9IChpbnQpKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lICogZGlmZl9jb3VudGVyX0JUZHN0ICogMC4xKTsKKyAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXIgPSBkaWZmX2NvdW50ZXJfQlRkc3Q7CisgICAgfQorCisKKyAgICAvKjQudXBkYXRlIHBNUC0+Y291bnRlcl9CVHNyYywgcE1QLT5jb3VudGVyX0JUZHN0ICovCisgICAgcE1QLT5jb3VudGVyX0JUc3JjICs9IGRpZmZfY291bnRlcl9CVHNyYzsKKyAgICBwTVAtPmNvdW50ZXJfQlRkc3QgKz0gZGlmZl9jb3VudGVyX0JUZHN0OworCisKKyAgICAvKjUudGFyZ2V0IGJpdCBjYWxjdWxhdGlvbiAqLworICAgIHJhdGVDdHJsLT5UID0gcmF0ZUN0cmwtPlRNTl9USCAtIHJhdGVDdHJsLT5UTU5fVzsKKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgdXBkYXRlUkNfUG9zdFByb2MoQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBNdWx0aVBhc3MgKnBNUCkKK3sKKyAgICBpZiAocmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA+IDApIC8qIHNraXAgbmV4dCBmcmFtZSAqLworICAgIHsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjICs9IDEwICogcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZTsKKworICAgIH0KKyAgICBlbHNlIGlmIChyYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lID09IC0xKSAvKiBza2lwIGN1cnJlbnQgZnJhbWUgKi8KKyAgICB7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCAtPSBwTVAtPmRpZmZfY291bnRlcjsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjICs9IDEwOworCisgICAgICAgIHBNUC0+c3VtX21hZCAtPSBwTVAtPm1hZDsKKyAgICAgICAgcE1QLT5hdmVyX21hZCA9IChwTVAtPmF2ZXJfbWFkICogcE1QLT5lbmNvZGVkX2ZyYW1lcyAtIHBNUC0+bWFkKSAvIChwTVAtPmVuY29kZWRfZnJhbWVzIC0gMSArIDAuMDAwMSk7CisgICAgICAgIHBNUC0+c3VtX1FQICAtPSBwTVAtPlFQOworICAgICAgICBwTVAtPmVuY29kZWRfZnJhbWVzIC0tOworICAgIH0KKyAgICAvKiBzb21lIHN0dWZmIGluIHVwZGF0ZSBWQlZfZnVsbG5lc3MgcmVtYWlucyBoZXJlICovCisgICAgLy9pZihyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIDwgLXJhdGVDdHJsLT5Ccy8yKSAvKiByYXRlQ3RybC0+QnMgKi8KKyAgICBpZiAocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA8IHJhdGVDdHJsLT5sb3dfYm91bmQpCisgICAgeworICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzID0gcmF0ZUN0cmwtPmxvd19ib3VuZDsgLy8gLXJhdGVDdHJsLT5Ccy8yOworICAgICAgICByYXRlQ3RybC0+VE1OX1cgPSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIC0gcmF0ZUN0cmwtPmxvd19ib3VuZDsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjID0gcE1QLT5jb3VudGVyX0JUZHN0ICsgKGludCkoKE9zY2xGbG9hdCkocmF0ZUN0cmwtPkJzIC8gMiAtIHJhdGVDdHJsLT5sb3dfYm91bmQpIC8gMi4wIC8gKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lIC8gMTApKTsKKyAgICB9Cit9CisKKwordm9pZCBSQ0luaXRDaHJvbWFRUChBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBpbnQgcV9iaXRzOworCisgICAgLyogd2UgaGF2ZSB0byBkbyB0aGUgc2FtZSB0aGluZyBmb3IgQVZDX0NMSVAzKDAsNTEsdmlkZW8tPlFTeSkgKi8KKworICAgIHZpZGVvLT5RUHlfZGl2XzYgPSAoY3Vyck1CLT5RUHkgKiA0MykgPj4gODsKKyAgICB2aWRlby0+UVB5X21vZF82ID0gY3Vyck1CLT5RUHkgLSA2ICogdmlkZW8tPlFQeV9kaXZfNjsKKyAgICBjdXJyTUItPlFQYyA9IHZpZGVvLT5RUGMgPSBtYXBRUGkyUVBjW0FWQ19DTElQMygwLCA1MSwgY3Vyck1CLT5RUHkgKyB2aWRlby0+Y3VyclBpY1BhcmFtcy0+Y2hyb21hX3FwX2luZGV4X29mZnNldCldOworICAgIHZpZGVvLT5RUGNfZGl2XzYgPSAodmlkZW8tPlFQYyAqIDQzKSA+PiA4OworICAgIHZpZGVvLT5RUGNfbW9kXzYgPSB2aWRlby0+UVBjIC0gNiAqIHZpZGVvLT5RUGNfZGl2XzY7CisKKyAgICAvKiBwcmUtY2FsY3VsYXRlIHRoaXMgdG8gc2F2ZSBjb21wdXRhdGlvbiAqLworICAgIHFfYml0cyA9IDQgKyB2aWRlby0+UVB5X2Rpdl82OworICAgIGlmICh2aWRlby0+c2xpY2VfdHlwZSA9PSBBVkNfSV9TTElDRSkKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+cXBfY29uc3QgPSA2ODIgPDwgcV9iaXRzOyAgICAgICAvLyBpbnRyYQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlbmN2aWQtPnFwX2NvbnN0ID0gMzQyIDw8IHFfYml0czsgICAgICAgLy8gaW50ZXIKKyAgICB9CisKKyAgICBxX2JpdHMgPSA0ICsgdmlkZW8tPlFQY19kaXZfNjsKKyAgICBpZiAodmlkZW8tPnNsaWNlX3R5cGUgPT0gQVZDX0lfU0xJQ0UpCisgICAgeworICAgICAgICBlbmN2aWQtPnFwX2NvbnN0X2MgPSA2ODIgPDwgcV9iaXRzOyAgICAvLyBpbnRyYQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlbmN2aWQtPnFwX2NvbnN0X2MgPSAzNDIgPDwgcV9iaXRzOyAgICAvLyBpbnRlcgorICAgIH0KKworICAgIGVuY3ZpZC0+bGFtYmRhX21vZGUgPSBRUDJRVUFOVFtBVkNfTUFYKDAsIGN1cnJNQi0+UVB5LVNISUZUX1FQKV07CisgICAgZW5jdmlkLT5sYW1iZGFfbW90aW9uID0gTEFNQkRBX0ZBQ1RPUihlbmN2aWQtPmxhbWJkYV9tb2RlKTsKKworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBSQ0luaXRNQlFQKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSAgZW5jdmlkLT5jb21tb247CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKworICAgIGN1cnJNQi0+UVB5ID0gdmlkZW8tPlFQeTsgLyogc2V0IHRvIHByZXZpb3VzIHZhbHVlIG9yIHBpY3R1cmUgbGV2ZWwgKi8KKworICAgIFJDSW5pdENocm9tYVFQKGVuY3ZpZCk7CisKK30KKwordm9pZCBSQ1Bvc3RNQihBVkNDb21tb25PYmogKnZpZGVvLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIGludCBudW1faGVhZGVyX2JpdHMsIGludCBudW1fdGV4dHVyZV9iaXRzKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyh2aWRlbyk7CisgICAgcmF0ZUN0cmwtPm51bU1CSGVhZGVyQml0cyA9IG51bV9oZWFkZXJfYml0czsKKyAgICByYXRlQ3RybC0+bnVtTUJUZXh0dXJlQml0cyA9IG51bV90ZXh0dXJlX2JpdHM7CisgICAgcmF0ZUN0cmwtPk51bWJlcm9mSGVhZGVyQml0cyArPSByYXRlQ3RybC0+bnVtTUJIZWFkZXJCaXRzOworICAgIHJhdGVDdHJsLT5OdW1iZXJvZlRleHR1cmVCaXRzICs9IHJhdGVDdHJsLT5udW1NQlRleHR1cmVCaXRzOworfQorCit2b2lkIFJDUmVzdG9yZVFQKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgY3Vyck1CLT5RUHkgPSB2aWRlby0+UVB5OyAvKiB1c2UgcHJldmlvdXMgUVAgKi8KKyAgICBSQ0luaXRDaHJvbWFRUChlbmN2aWQpOworCisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIFJDQ2FsY3VsYXRlTUFEKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIHVpbnQ4ICpvcmdMLCBpbnQgb3JnUGl0Y2gpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgdWludDMyIGRtaW5fbHg7CisKKyAgICBpZiAocmF0ZUN0cmwtPnJjRW5hYmxlID09IFRSVUUpCisgICAgeworICAgICAgICBpZiAoY3Vyck1CLT5tYl9pbnRyYSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG1pbl9seCA9ICgweEZGRkYgPDwgMTYpIHwgb3JnUGl0Y2g7CisgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPk1BRG9mTUJbdmlkZW8tPm1iTnVtXSA9IEFWQ1NBRF9NYWNyb2Jsb2NrX0Mob3JnTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jdmlkLT5wcmVkX2kxNltjdXJyTUItPmkxNk1vZGVdLCBkbWluX2x4LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogaTQgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlQ3RybC0+TUFEb2ZNQlt2aWRlby0+bWJOdW1dID0gZW5jdmlkLT5pNF9zYWQgLyAyNTYuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGZvciBJTlRFUiwgd2UgaGF2ZSBhbHJlYWR5IHNhdmVkIGl0IHdpdGggdGhlIE1WIHNlYXJjaCAqLworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworCitBVkNFbmNfU3RhdHVzIFJDVXBkYXRlRnJhbWUoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBNdWx0aVBhc3MgKnBNUCA9IHJhdGVDdHJsLT5wTVA7CisgICAgaW50IGRpZmZfQlRDb3VudGVyOworICAgIGludCBuYWxfdHlwZSA9IHZpZGVvLT5uYWxfdW5pdF90eXBlOworCisgICAgLyogdXBkYXRlIHRoZSBjb21wbGV4aXR5IHdlaWdodCBvZiBJLCBQLCBCIGZyYW1lICovCisKKyAgICBpZiAocmF0ZUN0cmwtPnJjRW5hYmxlID09IFRSVUUpCisgICAgeworICAgICAgICBwTVAtPmFjdHVhbF9iaXRzID0gcmF0ZUN0cmwtPm51bUZyYW1lQml0czsKKyAgICAgICAgcE1QLT5tYWQgPSAoT3NjbEZsb2F0KXJhdGVDdHJsLT50b3RhbFNBRCAvIHZpZGVvLT5QaWNTaXplSW5NYnM7IC8vQ29tcHV0ZUZyYW1lTUFEKHZpZGVvLCByYXRlQ3RybCk7CisKKyAgICAgICAgQVZDU2F2ZVJEU2FtcGxlcyhwTVAsIDApOworCisgICAgICAgIHBNUC0+ZW5jb2RlZF9mcmFtZXMrKzsKKworICAgICAgICAvKiBmb3IgcE1QLT5zYW1wbGVzUGVyRnJhbWUgKi8KKyAgICAgICAgcE1QLT5zYW1wbGVzUGVyRnJhbWVbcE1QLT5mcmFtZVBvc10gPSAwOworCisgICAgICAgIHBNUC0+c3VtX1FQICs9IHBNUC0+UVA7CisKKyAgICAgICAgLyogdXBkYXRlIHBNUC0+Y291bnRlcl9CVHNyYywgcE1QLT5jb3VudGVyX0JUZHN0ICovCisgICAgICAgIC8qIHJlLWFsbG9jYXRlIHRoZSB0YXJnZXQgYml0IGFnYWluIGFuZCB0aGVuIHN0b3AgZW5jb2RpbmcgKi8KKyAgICAgICAgZGlmZl9CVENvdW50ZXIgPSAoaW50KSgoT3NjbEZsb2F0KShyYXRlQ3RybC0+VE1OX1RIIC0gcmF0ZUN0cmwtPlRNTl9XIC0gcE1QLT5hY3R1YWxfYml0cykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTVAtPmJpdHJhdGUgLyAocE1QLT5mcmFtZXJhdGUgKyAwLjAwMDEpICsgMC4wMDAxKSAvIDAuMSk7CisgICAgICAgIGlmIChkaWZmX0JUQ291bnRlciA+PSAwKQorICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjICs9IGRpZmZfQlRDb3VudGVyOyAvKiBwTVAtPmFjdHVhbF9iaXRzIGlzIHNtYWxsZXIgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0IC09IGRpZmZfQlRDb3VudGVyOyAvKiBwTVAtPmFjdHVhbF9iaXRzIGlzIGJpZ2dlciAqLworCisgICAgICAgIHJhdGVDdHJsLT5UTU5fVEggLT0gKGludCkoKE9zY2xGbG9hdClwTVAtPmJpdHJhdGUgLyAocE1QLT5mcmFtZXJhdGUgKyAwLjAwMDEpICogKGRpZmZfQlRDb3VudGVyICogMC4xKSk7CisgICAgICAgIHJhdGVDdHJsLT5UID0gcE1QLT50YXJnZXRfYml0cyA9IHJhdGVDdHJsLT5UTU5fVEggLSByYXRlQ3RybC0+VE1OX1c7CisgICAgICAgIHBNUC0+ZGlmZl9jb3VudGVyIC09IGRpZmZfQlRDb3VudGVyOworCisgICAgICAgIHJhdGVDdHJsLT5SYyA9IHJhdGVDdHJsLT5udW1GcmFtZUJpdHM7ICAvKiBUb3RhbCBCaXRzIGZvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgIHJhdGVDdHJsLT5IYyA9IHJhdGVDdHJsLT5OdW1iZXJvZkhlYWRlckJpdHM7ICAgIC8qIFRvdGFsIEJpdHMgaW4gSGVhZGVyIGFuZCBNb3Rpb24gVmVjdG9yICovCisKKyAgICAgICAgLyogQlhfUkMgKi8KKyAgICAgICAgdXBkYXRlUmF0ZUNvbnRyb2wocmF0ZUN0cmwsIG5hbF90eXBlKTsKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPT0gLTEpIC8vIHNraXAgY3VycmVudCBmcmFtZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfU0tJUFBFRF9QSUNUVVJFOworICAgICAgICB9CisgICAgfQorCisgICAgcmF0ZUN0cmwtPmZpcnN0X2ZyYW1lID0gMDsgIC8vIHJlc2V0IGhlcmUgYWZ0ZXIgd2UgZW5jb2RlIHRoZSBmaXJzdCBmcmFtZS4KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQVZDU2F2ZVJEU2FtcGxlcyhNdWx0aVBhc3MgKnBNUCwgaW50IGNvdW50ZXJfc2FtcGxlcykKK3sKKyAgICAvKiBmb3IgcE1QLT5wUkRTYW1wbGVzICovCisgICAgcE1QLT5wUkRTYW1wbGVzW3BNUC0+ZnJhbWVQb3NdW2NvdW50ZXJfc2FtcGxlc10uUVAgICAgPSBwTVAtPlFQOworICAgIHBNUC0+cFJEU2FtcGxlc1twTVAtPmZyYW1lUG9zXVtjb3VudGVyX3NhbXBsZXNdLmFjdHVhbF9iaXRzID0gcE1QLT5hY3R1YWxfYml0czsKKyAgICBwTVAtPnBSRFNhbXBsZXNbcE1QLT5mcmFtZVBvc11bY291bnRlcl9zYW1wbGVzXS5tYWQgICA9IHBNUC0+bWFkOworICAgIHBNUC0+cFJEU2FtcGxlc1twTVAtPmZyYW1lUG9zXVtjb3VudGVyX3NhbXBsZXNdLlJfRCA9IChPc2NsRmxvYXQpcE1QLT5hY3R1YWxfYml0cyAvIChwTVAtPm1hZCArIDAuMDAwMSk7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIHVwZGF0ZVJhdGVDb250cm9sKEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgaW50IG5hbF90eXBlKQoreworICAgIGludCAgZnJhbWVfYml0czsKKyAgICBNdWx0aVBhc3MgKnBNUCA9IHJhdGVDdHJsLT5wTVA7CisKKyAgICAvKiBCWCByYXRlIGNvbnRyb1xsICovCisgICAgZnJhbWVfYml0cyA9IChpbnQpKHJhdGVDdHJsLT5iaXRSYXRlIC8gcmF0ZUN0cmwtPmZyYW1lX3JhdGUpOworICAgIHJhdGVDdHJsLT5UTU5fVyArPSAocmF0ZUN0cmwtPlJjIC0gcmF0ZUN0cmwtPlRNTl9USCk7CisgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyArPSAocmF0ZUN0cmwtPlJjIC0gZnJhbWVfYml0cyk7IC8vcmF0ZUN0cmwtPlJwKTsKKyAgICAvL2lmKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPCAwKSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzID0gLTE7CisKKyAgICByYXRlQ3RybC0+ZW5jb2RlZF9mcmFtZXMrKzsKKworICAgIC8qIGZyYW1lIGRyb3BwaW5nICovCisgICAgcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA9IDA7CisKKyAgICBpZiAoKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPiByYXRlQ3RybC0+QnMgLyAyKSAmJiBuYWxfdHlwZSAhPSBBVkNfTkFMVFlQRV9JRFIpIC8qIHNraXAgdGhlIGN1cnJlbnQgZnJhbWUgKi8gLyogcmF0ZUN0cmwtPkJzICovCisgICAgeworICAgICAgICByYXRlQ3RybC0+VE1OX1cgLT0gKHJhdGVDdHJsLT5SYyAtIHJhdGVDdHJsLT5UTU5fVEgpOworICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIC09IHJhdGVDdHJsLT5SYzsKKyAgICAgICAgcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmICgoT3NjbEZsb2F0KShyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIC0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzc19vZmZzZXQpID4gKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzX29mZnNldCkqMC45NSkgLyogc2tpcCBuZXh0IGZyYW1lICovCisgICAgeworICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIC09IGZyYW1lX2JpdHM7IC8vcmF0ZUN0cmwtPlJwOworICAgICAgICByYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lID0gMTsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjIC09IChpbnQpKChPc2NsRmxvYXQpKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+bG93X2JvdW5kKSAvIDIuMCAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7CisgICAgICAgIC8qIEJYXzEsIHNraXAgbW9yZSB0aGFuIDEgZnJhbWVzICAqLworICAgICAgICAvL3doaWxlKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPiByYXRlQ3RybC0+QnMqMC40NzUpCisgICAgICAgIHdoaWxlICgocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3Nfb2Zmc2V0KSA+IChyYXRlQ3RybC0+QnMgLyAyIC0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzc19vZmZzZXQpKjAuOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLT0gZnJhbWVfYml0czsgLy9yYXRlQ3RybC0+UnA7CisgICAgICAgICAgICByYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lKys7CisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgLT0gKGludCkoKE9zY2xGbG9hdCkocmF0ZUN0cmwtPkJzIC8gMiAtIHJhdGVDdHJsLT5sb3dfYm91bmQpIC8gMi4wIC8gKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lIC8gMTApKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVORCBCWF8xICovCisgICAgfQorfQorCisKK2RvdWJsZSBDb21wdXRlRnJhbWVNQUQoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsKQoreworICAgIGRvdWJsZSBUb3RhbE1BRDsKKyAgICBpbnQgaTsKKyAgICBUb3RhbE1BRCA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGludCl2aWRlby0+UGljU2l6ZUluTWJzOyBpKyspCisgICAgICAgIFRvdGFsTUFEICs9IHJhdGVDdHJsLT5NQURvZk1CW2ldOworICAgIFRvdGFsTUFEIC89IHZpZGVvLT5QaWNTaXplSW5NYnM7CisgICAgcmV0dXJuIFRvdGFsTUFEOworfQorCisKKworCisKKy8qIGNvbnZlcnQgZnJvbSBRUCB0byBRc3RlcCAqLworZG91YmxlIFFQMlFzdGVwKGludCBRUCkKK3sKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgUXN0ZXA7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBRUDJRU1RFUFs2XSA9IHsgMC42MjUsIDAuNjg3NSwgMC44MTI1LCAwLjg3NSwgMS4wLCAxLjEyNSB9OworCisgICAgUXN0ZXAgPSBRUDJRU1RFUFtRUCAlIDZdOworICAgIGZvciAoaSA9IDA7IGkgPCAoUVAgLyA2KTsgaSsrKQorICAgICAgICBRc3RlcCAqPSAyOworCisgICAgcmV0dXJuIFFzdGVwOworfQorCisvKiBjb252ZXJ0IGZyb20gc3RlcCBzaXplIHRvIFFQICovCitpbnQgUXN0ZXAyUVAoZG91YmxlIFFzdGVwKQoreworICAgIGludCBxX3BlciA9IDAsIHFfcmVtID0gMDsKKworICAgIC8vICBhc3NlcnQoIFFzdGVwID49IFFQMlFzdGVwKDApICYmIFFzdGVwIDw9IFFQMlFzdGVwKDUxKSApOworICAgIGlmIChRc3RlcCA8IFFQMlFzdGVwKDApKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlIGlmIChRc3RlcCA+IFFQMlFzdGVwKDUxKSkKKyAgICAgICAgcmV0dXJuIDUxOworCisgICAgd2hpbGUgKFFzdGVwID4gUVAyUXN0ZXAoNSkpCisgICAgeworICAgICAgICBRc3RlcCAvPSAyOworICAgICAgICBxX3BlciArPSAxOworICAgIH0KKworICAgIGlmIChRc3RlcCA8PSAoMC42MjUgKyAwLjY4NzUpIC8gMikKKyAgICB7CisgICAgICAgIFFzdGVwID0gMC42MjU7CisgICAgICAgIHFfcmVtID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUXN0ZXAgPD0gKDAuNjg3NSArIDAuODEyNSkgLyAyKQorICAgIHsKKyAgICAgICAgUXN0ZXAgPSAwLjY4NzU7CisgICAgICAgIHFfcmVtID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUXN0ZXAgPD0gKDAuODEyNSArIDAuODc1KSAvIDIpCisgICAgeworICAgICAgICBRc3RlcCA9IDAuODEyNTsKKyAgICAgICAgcV9yZW0gPSAyOworICAgIH0KKyAgICBlbHNlIGlmIChRc3RlcCA8PSAoMC44NzUgKyAxLjApIC8gMikKKyAgICB7CisgICAgICAgIFFzdGVwID0gMC44NzU7CisgICAgICAgIHFfcmVtID0gMzsKKyAgICB9CisgICAgZWxzZSBpZiAoUXN0ZXAgPD0gKDEuMCArIDEuMTI1KSAvIDIpCisgICAgeworICAgICAgICBRc3RlcCA9IDEuMDsKKyAgICAgICAgcV9yZW0gPSA0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBRc3RlcCA9IDEuMTI1OworICAgICAgICBxX3JlbSA9IDU7CisgICAgfQorCisgICAgcmV0dXJuIChxX3BlciAqIDYgKyBxX3JlbSk7Cit9CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvcmVzaWR1YWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3Jlc2lkdWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmViOTEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3Jlc2lkdWFsLmNwcApAQCAtMCwwICsxLDM4OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisKK0FWQ0VuY19TdGF0dXMgRW5jb2RlSW50cmFQQ00oQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDRnJhbWVJTyAgKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtID0gZW5jdmlkLT5iaXRzdHJlYW07CisgICAgaW50IHhfcG9zaXRpb24gPSAodmlkZW8tPm1iX3ggPDwgNCk7CisgICAgaW50IHlfcG9zaXRpb24gPSAodmlkZW8tPm1iX3kgPDwgNCk7CisgICAgaW50IG9yZ1BpdGNoID0gY3VycklucHV0LT5waXRjaDsKKyAgICBpbnQgb2Zmc2V0MSA9IHlfcG9zaXRpb24gKiBvcmdQaXRjaCArIHhfcG9zaXRpb247CisgICAgaW50IGksIGo7CisgICAgaW50IG9mZnNldDsKKyAgICB1aW50OCAqcERzdCwgKnBTcmM7CisgICAgdWludCBjb2RlOworCisgICAgdWVfdihzdHJlYW0sIDI1KTsKKworICAgIGkgPSBzdHJlYW0tPmJpdF9sZWZ0ICYgMHg3OworICAgIGlmIChpKSAvKiBub3QgYnl0ZS1hbGlnbmVkICovCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAwLCBpKTsKKyAgICB9CisKKyAgICBwU3JjID0gY3VycklucHV0LT5ZQ2JDclswXSArIG9mZnNldDE7CisgICAgcERzdCA9IHZpZGVvLT5jdXJyUGljLT5TbCArIG9mZnNldDE7CisgICAgb2Zmc2V0ID0gdmlkZW8tPlBpY1dpZHRoSW5TYW1wbGVzTCAtIDE2OworCisgICAgLyogYXQgdGhpcyBwb2ludCBiaXRzdHJlYW0gaXMgYnl0ZS1hbGlnbmVkICovCisgICAgaiA9IDE2OworICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisjaWYgKFdPUkRfU0laRT09MzIpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAqKCh1aW50KilwU3JjKTsKKyAgICAgICAgICAgIHBTcmMgKz0gNDsKKyAgICAgICAgICAgICooKHVpbnQqKXBEc3QpID0gY29kZTsKKyAgICAgICAgICAgIHBEc3QgKz0gNDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDMyLCBjb2RlKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29kZSA9ICooKHVpbnQqKXBTcmMpOworICAgICAgICAgICAgcFNyYyArPSAyOworICAgICAgICAgICAgKigodWludCopcERzdCkgPSBjb2RlOworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMTYsIGNvZGUpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcERzdCArPSBvZmZzZXQ7CisgICAgICAgIHBTcmMgKz0gb2Zmc2V0OworICAgICAgICBqLS07CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpICAvKiBjaGVjayBvbmx5IG9uY2UgcGVyIGxpbmUgKi8KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKworICAgIHBEc3QgPSB2aWRlby0+Y3VyclBpYy0+U2NiICsgKChvZmZzZXQxICsgeF9wb3NpdGlvbikgPj4gMik7CisgICAgcFNyYyA9IGN1cnJJbnB1dC0+WUNiQ3JbMV0gKyAoKG9mZnNldDEgKyB4X3Bvc2l0aW9uKSA+PiAyKTsKKyAgICBvZmZzZXQgPj49IDE7CisKKyAgICBqID0gODsKKyAgICB3aGlsZSAoaiA+IDApCisgICAgeworI2lmIChXT1JEX1NJWkU9PTMyKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKigodWludCopcFNyYyk7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICAqKCh1aW50KilwRHN0KSA9IGNvZGU7CisgICAgICAgICAgICBwRHN0ICs9IDQ7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzMiwgY29kZSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAqKCh1aW50KilwU3JjKTsKKyAgICAgICAgICAgIHBTcmMgKz0gMjsKKyAgICAgICAgICAgICooKHVpbnQqKXBEc3QpID0gY29kZTsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDE2LCBjb2RlKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHBEc3QgKz0gb2Zmc2V0OworICAgICAgICBwU3JjICs9IG9mZnNldDsKKyAgICAgICAgai0tOworICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpICAvKiBjaGVjayBvbmx5IG9uY2UgcGVyIGxpbmUgKi8KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKworICAgIHBEc3QgPSB2aWRlby0+Y3VyclBpYy0+U2NyICsgKChvZmZzZXQxICsgeF9wb3NpdGlvbikgPj4gMik7CisgICAgcFNyYyA9IGN1cnJJbnB1dC0+WUNiQ3JbMl0gKyAoKG9mZnNldDEgKyB4X3Bvc2l0aW9uKSA+PiAyKTsKKworICAgIGogPSA4OworICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisjaWYgKFdPUkRfU0laRT09MzIpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAqKCh1aW50KilwU3JjKTsKKyAgICAgICAgICAgIHBTcmMgKz0gNDsKKyAgICAgICAgICAgICooKHVpbnQqKXBEc3QpID0gY29kZTsKKyAgICAgICAgICAgIHBEc3QgKz0gNDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDMyLCBjb2RlKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29kZSA9ICooKHVpbnQqKXBTcmMpOworICAgICAgICAgICAgcFNyYyArPSAyOworICAgICAgICAgICAgKigodWludCopcERzdCkgPSBjb2RlOworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMTYsIGNvZGUpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcERzdCArPSBvZmZzZXQ7CisgICAgICAgIHBTcmMgKz0gb2Zmc2V0OworICAgICAgICBqLS07CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitBVkNFbmNfU3RhdHVzIGVuY19yZXNpZHVhbF9ibG9jayhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDUmVzaWR1YWxUeXBlIHR5cGUsIGludCBjaW5keCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBpLCBtYXhOdW1Db2VmZiwgbkM7CisgICAgaW50IGNkYyA9IDAsIGNhYyA9IDA7CisgICAgaW50IFRyYWlsaW5nT25lczsKKyAgICBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSA9IGVuY3ZpZC0+Yml0c3RyZWFtOworICAgIHVpbnQgdHJhaWxpbmdfb25lc19zaWduX2ZsYWc7CisgICAgaW50IHplcm9zTGVmdDsKKyAgICBpbnQgKmxldmVsLCAqcnVuOworICAgIGludCBUb3RhbENvZWZmOworICAgIGNvbnN0IHN0YXRpYyBpbnQgaW5jVmxjW10gPSB7MCwgMywgNiwgMTIsIDI0LCA0OCwgMzI3Njh9OyAgLy8gbWF4aW11bSB2bGMgPSA2CisgICAgaW50IGVzY2FwZSwgbnVtUHJlZml4LCBzdWZtYXNrLCBzdWZmaXgsIHNoaWZ0LCBzaWduLCB2YWx1ZSwgYWJzdmFsdWUsIHZsY251bSwgbGV2ZWxfdHdvX29yX2hpZ2hlcjsKKyAgICBpbnQgYmluZHggPSBibGtJZHgyYmxrWFlbY2luZHg+PjJdW2NpbmR4JjNdIDsgLy8gcmFzdGVyIHNjYW4gaW5kZXgKKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQVZDX0x1bWE6CisgICAgICAgICAgICBtYXhOdW1Db2VmZiA9IDE2OworICAgICAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsW2NpbmR4XTsKKyAgICAgICAgICAgIHJ1biA9IGVuY3ZpZC0+cnVuW2NpbmR4XTsKKyAgICAgICAgICAgIFRvdGFsQ29lZmYgPSBjdXJyTUItPm56X2NvZWZmW2JpbmR4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWQ19JbnRyYTE2REM6CisgICAgICAgICAgICBtYXhOdW1Db2VmZiA9IDE2OworICAgICAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsZGM7CisgICAgICAgICAgICBydW4gPSBlbmN2aWQtPnJ1bmRjOworICAgICAgICAgICAgVG90YWxDb2VmZiA9IGNpbmR4OyAvKiBzcGVjaWFsIGNhc2UgKi8KKyAgICAgICAgICAgIGJpbmR4ID0gMDsKKyAgICAgICAgICAgIGNpbmR4ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWQ19JbnRyYTE2QUM6CisgICAgICAgICAgICBtYXhOdW1Db2VmZiA9IDE1OworICAgICAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsW2NpbmR4XTsKKyAgICAgICAgICAgIHJ1biA9IGVuY3ZpZC0+cnVuW2NpbmR4XTsKKyAgICAgICAgICAgIFRvdGFsQ29lZmYgPSBjdXJyTUItPm56X2NvZWZmW2JpbmR4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWQ19DaHJvbWFEQzogIC8qIGhvdyB0byBkaWZmZXJlbnRpYXRlIENiIGZyb20gQ3IgKi8KKyAgICAgICAgICAgIG1heE51bUNvZWZmID0gNDsKKyAgICAgICAgICAgIGNkYyA9IDE7CisgICAgICAgICAgICBpZiAoY2luZHggPj0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxjZGMgKyA0OworICAgICAgICAgICAgICAgIHJ1biA9IGVuY3ZpZC0+cnVuY2RjICsgNDsKKyAgICAgICAgICAgICAgICBUb3RhbENvZWZmID0gY2luZHggLSA4OyAgLyogc3BlY2lhbCBjYXNlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsY2RjOworICAgICAgICAgICAgICAgIHJ1biA9IGVuY3ZpZC0+cnVuY2RjOworICAgICAgICAgICAgICAgIFRvdGFsQ29lZmYgPSBjaW5keDsgIC8qIHNwZWNpYWwgY2FzZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDX0Nocm9tYUFDOgorICAgICAgICAgICAgbWF4TnVtQ29lZmYgPSAxNTsKKyAgICAgICAgICAgIGNhYyA9IDE7CisgICAgICAgICAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxbY2luZHhdOworICAgICAgICAgICAgcnVuID0gZW5jdmlkLT5ydW5bY2luZHhdOworICAgICAgICAgICAgY2luZHggLT0gMTY7CisgICAgICAgICAgICBiaW5keCA9IDE2ICsgYmxrSWR4MmJsa1hZW2NpbmR4Pj4yXVtjaW5keCYzXTsKKyAgICAgICAgICAgIGNpbmR4ICs9IDE2OworICAgICAgICAgICAgVG90YWxDb2VmZiA9IGN1cnJNQi0+bnpfY29lZmZbYmluZHhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7CisgICAgfQorCisKKyAgICAvKiBmaW5kIFRyYWlsaW5nT25lcyAqLworICAgIFRyYWlsaW5nT25lcyA9IDA7CisgICAgemVyb3NMZWZ0ID0gMDsKKyAgICBpID0gVG90YWxDb2VmZiAtIDE7CisgICAgbkMgPSAxOworICAgIHdoaWxlIChpID49IDApCisgICAgeworICAgICAgICB6ZXJvc0xlZnQgKz0gcnVuW2ldOworICAgICAgICBpZiAobkMgJiYgKGxldmVsW2ldID09IDEgfHwgbGV2ZWxbaV0gPT0gLTEpKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFpbGluZ09uZXMrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5DID0gMDsKKyAgICAgICAgfQorICAgICAgICBpLS07CisgICAgfQorICAgIGlmIChUcmFpbGluZ09uZXMgPiAzKQorICAgIHsKKyAgICAgICAgVHJhaWxpbmdPbmVzID0gMzsgLyogY2xpcCBpdCAqLworICAgIH0KKworICAgIGlmICghY2RjKQorICAgIHsKKyAgICAgICAgaWYgKCFjYWMpICAvKiBub3QgY2hyb21hICovCisgICAgICAgIHsKKyAgICAgICAgICAgIG5DID0gcHJlZGljdF9ubnoodmlkZW8sIGJpbmR4ICYgMywgYmluZHggPj4gMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBjaHJvbWEgYWMgYnV0IG5vdCBjaHJvbWEgZGMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgbkMgPSBwcmVkaWN0X25uel9jaHJvbWEodmlkZW8sIGJpbmR4ICYgMywgYmluZHggPj4gMik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBjZV9Ub3RhbENvZWZmVHJhaWxpbmdPbmVzKHN0cmVhbSwgVHJhaWxpbmdPbmVzLCBUb3RhbENvZWZmLCBuQyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5DID0gLTE7IC8qIENocm9tYSBEQyBsZXZlbCAqLworICAgICAgICBzdGF0dXMgPSBjZV9Ub3RhbENvZWZmVHJhaWxpbmdPbmVzQ2hyb21hREMoc3RyZWFtLCBUcmFpbGluZ09uZXMsIFRvdGFsQ29lZmYpOworICAgIH0KKworICAgIC8qIFRoaXMgcGFydCBpcyBkb25lIHF1aXRlIGRpZmZlcmVudGx5IGluIFJlYWRDb2VmNHg0X0NBVkxDKCkgKi8KKyAgICBpZiAoVG90YWxDb2VmZiA+IDApCisgICAgeworCisgICAgICAgIGkgPSBUb3RhbENvZWZmIC0gMTsKKworICAgICAgICBpZiAoVHJhaWxpbmdPbmVzKSAvKiBrZWVwIHJlYWRpbmcgdGhlIHNpZ24gb2YgdGhvc2UgdHJhaWxpbmcgb25lcyAqLworICAgICAgICB7CisgICAgICAgICAgICBuQyA9IFRyYWlsaW5nT25lczsKKyAgICAgICAgICAgIHRyYWlsaW5nX29uZXNfc2lnbl9mbGFnID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChuQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFpbGluZ19vbmVzX3NpZ25fZmxhZyA8PD0gMTsKKyAgICAgICAgICAgICAgICB0cmFpbGluZ19vbmVzX3NpZ25fZmxhZyB8PSAoKHVpbnQzMilsZXZlbFtpLS1dID4+IDMxKTsgLyogMCBvciBwb3NpdGl2ZSwgMSBmb3IgbmVnYXRpdmUgKi8KKyAgICAgICAgICAgICAgICBuQy0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpbnN0ZWFkIG9mIHdyaXRpbmcgb25lIGJpdCBhdCBhIHRpbWUsIHJlYWQgdGhlIHdob2xlIHRoaW5nIGF0IG9uY2UgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIFRyYWlsaW5nT25lcywgdHJhaWxpbmdfb25lc19zaWduX2ZsYWcpOworICAgICAgICB9CisKKyAgICAgICAgbGV2ZWxfdHdvX29yX2hpZ2hlciA9IDE7CisgICAgICAgIGlmIChUb3RhbENvZWZmID4gMyAmJiBUcmFpbGluZ09uZXMgPT0gMykKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ZWxfdHdvX29yX2hpZ2hlciA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVG90YWxDb2VmZiA+IDEwICYmIFRyYWlsaW5nT25lcyA8IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZsY251bSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2bGNudW0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogdGhlbiBkbyB0aGlzIFRvdGFsQ29lZmYtVHJhaWxpbmdPbmVzIHRpbWVzICovCisgICAgICAgIGZvciAoaSA9IFRvdGFsQ29lZmYgLSBUcmFpbGluZ09uZXMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsdWUgPSBsZXZlbFtpXTsKKyAgICAgICAgICAgIGFic3ZhbHVlID0gKHZhbHVlID49IDApID8gdmFsdWUgOiAtdmFsdWU7CisKKyAgICAgICAgICAgIGlmIChsZXZlbF90d29fb3JfaGlnaGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IDApIHZhbHVlLS07CisgICAgICAgICAgICAgICAgZWxzZSAgICB2YWx1ZSsrOworICAgICAgICAgICAgICAgIGxldmVsX3R3b19vcl9oaWdoZXIgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmFsdWUgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaWduID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaWduID0gMTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IC12YWx1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZsY251bSA9PSAwKSAvLyBWTEMxCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIHZhbHVlICogMiArIHNpZ24gLSAxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCA4ICsgOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDE0ICsgMSArIDQsICgxIDw8IDQpIHwgKCh2YWx1ZSAtIDgpIDw8IDEpIHwgc2lnbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDE0ICsgMiArIDEyLCAoMSA8PCAxMikgfCAoKHZhbHVlIC0gMTYpIDw8IDEpIHwgc2lnbikgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgIC8vIFZMQ04KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaGlmdCA9IHZsY251bSAtIDE7CisgICAgICAgICAgICAgICAgZXNjYXBlID0gKDE1IDw8IHNoaWZ0KSArIDE7CisgICAgICAgICAgICAgICAgbnVtUHJlZml4ID0gKHZhbHVlIC0gMSkgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgc3VmbWFzayA9IH4oKDB4ZmZmZmZmZmYpIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICBzdWZmaXggPSAodmFsdWUgLSAxKSAmIHN1Zm1hc2s7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgZXNjYXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgbnVtUHJlZml4ICsgdmxjbnVtICsgMSwgKDEgPDwgKHNoaWZ0ICsgMSkpIHwgKHN1ZmZpeCA8PCAxKSB8IHNpZ24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAyOCwgKDEgPDwgMTIpIHwgKCh2YWx1ZSAtIGVzY2FwZSkgPDwgMSkgfCBzaWduKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFic3ZhbHVlID4gaW5jVmxjW3ZsY251bV0pCisgICAgICAgICAgICAgICAgdmxjbnVtKys7CisKKyAgICAgICAgICAgIGlmIChpID09IFRvdGFsQ29lZmYgLSBUcmFpbGluZ09uZXMgLSAxICYmIGFic3ZhbHVlID4gMykKKyAgICAgICAgICAgICAgICB2bGNudW0gPSAyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykgIC8qIG9jY2FzaW9uYWxseSBjaGVjayB0aGUgYml0c3RyZWFtICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFRvdGFsQ29lZmYgPCBtYXhOdW1Db2VmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjZGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2VfVG90YWxaZXJvcyhzdHJlYW0sIHplcm9zTGVmdCwgVG90YWxDb2VmZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2VfVG90YWxaZXJvc0Nocm9tYURDKHN0cmVhbSwgemVyb3NMZWZ0LCBUb3RhbENvZWZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHplcm9zTGVmdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpID0gVG90YWxDb2VmZiAtIDE7CisgICAgICAgIHdoaWxlIChpID4gMCkgLyogZG9uJ3QgZG8gdGhlIGxhc3Qgb25lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh6ZXJvc0xlZnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNlX1J1bkJlZm9yZShzdHJlYW0sIHJ1bltpXSwgemVyb3NMZWZ0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgemVyb3NMZWZ0ID0gemVyb3NMZWZ0IC0gcnVuW2ldOworICAgICAgICAgICAgaS0tOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3YWNkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWQuY3BwCkBAIC0wLDAgKzEsMjkwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKyNpbmNsdWRlICJzYWRfaW5saW5lLmgiCisKKyNkZWZpbmUgQ2FjaGVkX2x4IDE3NgorCisjaWZkZWYgX1NBRF9TVEFUCit1aW50MzIgbnVtX3NhZF9NQiA9IDA7Cit1aW50MzIgbnVtX3NhZF9CbGsgPSAwOwordWludDMyIG51bV9zYWRfTUJfY2FsbCA9IDA7Cit1aW50MzIgbnVtX3NhZF9CbGtfY2FsbCA9IDA7CisKKyNkZWZpbmUgTlVNX1NBRF9NQl9DQUxMKCkgICAgICAgbnVtX3NhZF9NQl9jYWxsKysKKyNkZWZpbmUgTlVNX1NBRF9NQigpICAgICAgICAgICAgbnVtX3NhZF9NQisrCisjZGVmaW5lIE5VTV9TQURfQkxLX0NBTEwoKSAgICAgIG51bV9zYWRfQmxrX2NhbGwrKworI2RlZmluZSBOVU1fU0FEX0JMSygpICAgICAgICAgICBudW1fc2FkX0JsaysrCisKKyNlbHNlCisKKyNkZWZpbmUgTlVNX1NBRF9NQl9DQUxMKCkKKyNkZWZpbmUgTlVNX1NBRF9NQigpCisjZGVmaW5lIE5VTV9TQURfQkxLX0NBTEwoKQorI2RlZmluZSBOVU1fU0FEX0JMSygpCisKKyNlbmRpZgorCisKKy8qIGNvbnNpc3Qgb2YKK2ludCBBVkNTQURfTWFjcm9ibG9ja19DKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgbHgsdm9pZCAqZXh0cmFfaW5mbykKK2ludCBBVkNTQURfTUJfSFRGTV9Db2xsZWN0KHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgbHgsdm9pZCAqZXh0cmFfaW5mbykKK2ludCBBVkNTQURfTUJfSFRGTSh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IGx4LHZvaWQgKmV4dHJhX2luZm8pCisqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgU0FEX01hY3JvYmxvY2sKKyAgICBEYXRlOiAgICAgICAwOS8wNy8yMDAwCisgICAgUHVycG9zZTogICAgQ29tcHV0ZSBTQUQgMTZ4MTYgYmV0d2VlbiBibGsgYW5kIHJlZi4KKyAgICBUbyBkbzogICAgICBVbmlmb3JtIHN1YnNhbXBsaW5nIHdpbGwgYmUgaW5zZXJ0ZWQgbGF0ZXIhCisgICAgICAgICAgICAgICAgSHlwb3RoZXNpcyBUZXN0aW5nIEZhc3QgTWF0Y2hpbmcgdG8gYmUgdXNlZCBsYXRlciEKKyAgICBDaGFuZ2VzOgorICAgIDExLzcvMDA6ICAgIGltcGxlbWVudGVkIE1NWAorICAgIDEvMjQvMDE6ICAgIGltcGxlbWVudGVkIFNTRQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qKioqKioqKioqIEMgKioqKioqKioqKioqLworaW50IEFWQ1NBRF9NYWNyb2Jsb2NrX0ModWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgKHZvaWQpKGV4dHJhX2luZm8pOworCisgICAgaW50MzIgeDEwOworICAgIGludCBkbWluID0gKHVpbnQzMilkbWluX2x4ID4+IDE2OworICAgIGludCBseCA9IGRtaW5fbHggJiAweEZGRkY7CisKKyAgICBOVU1fU0FEX01CX0NBTEwoKTsKKworICAgIHgxMCA9IHNpbWRfc2FkX21iKHJlZiwgYmxrLCBkbWluLCBseCk7CisKKyAgICByZXR1cm4geDEwOworfQorCisjaWZkZWYgSFRGTSAgIC8qIEhURk0gd2l0aCB1bmlmb3JtIHN1YnNhbXBsaW5nIGltcGxlbWVudGF0aW9uIDIvMjgvMDEgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgQVZDQVZDU0FEX01CX0hURk1fQ29sbGVjdCBhbmQgQVZDU0FEX01CX0hURk0KKyAgICBEYXRlOiAgICAgICAzLzIvMQorICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgdGhlIFNBRCBvbiBhIDE2eDE2IGJsb2NrIHVzaW5nCisgICAgICAgICAgICAgICAgdW5pZm9ybSBzdWJzYW1wbGluZyBhbmQgaHlwb3RoZXNpcyB0ZXN0aW5nIGZhc3QgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICBmb3IgZWFybHkgZHJvcG91dC4gU0FEX01CX0hQX0hURk1fQ29sbGVjdCBpcyB0byBjb2xsZWN0CisgICAgICAgICAgICAgICAgdGhlIHN0YXRpc3RpY3MgdG8gY29tcHV0ZSB0aGUgdGhyZXNob2xkcyB0byBiZSB1c2VkIGluCisgICAgICAgICAgICAgICAgU0FEX01CX0hQX0hURk0uCisgICAgSW5wdXQvT3V0cHV0OgorICAgIENoYW5nZXM6CisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK2ludCBBVkNBVkNTQURfTUJfSFRGTV9Db2xsZWN0KHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpwMTsKKyAgICBpbnQgbHg0ID0gKGRtaW5fbHggPDwgMikgJiAweDNGRkZDOworICAgIHVpbnQzMiBjdXJfd29yZDsKKyAgICBpbnQgc2FkZGF0YVsxNl0sIHRtcCwgdG1wMjsgICAgLyogdXNlZCB3aGVuIGNvbGxlY3RpbmcgZmxhZyAoZ2xvYmFsKSBpcyBvbiAqLworICAgIGludCBkaWZtYWQ7CisgICAgaW50IG1hZHN0YXI7CisgICAgSFRGTV9TdGF0ICpodGZtX3N0YXQgPSAoSFRGTV9TdGF0KikgZXh0cmFfaW5mbzsKKyAgICBpbnQgKmFic19kaWZfbWFkX2F2ZyA9ICYoaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcpOworICAgIHVpbnQgKmNvdW50YnJlYWsgPSAmKGh0Zm1fc3RhdC0+Y291bnRicmVhayk7CisgICAgaW50ICpvZmZzZXRSZWYgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKworICAgIG1hZHN0YXIgPSAodWludDMyKWRtaW5fbHggPj4gMjA7CisKKyAgICBOVU1fU0FEX01CX0NBTEwoKTsKKworICAgIGJsayAtPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgcDEgKz0gbHg0OworICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBOVU1fU0FEX01CKCk7CisKKyAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICBpZiAoaSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgodWludDMyKXNhZCA+ICgodWludDMyKWRtaW5fbHggPj4gMTYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAgICAgICAgICAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICAgICAgICAgICAgICgqY291bnRicmVhaykrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgKCpjb3VudGJyZWFrKSsrOworICAgIHJldHVybiBzYWQ7Cit9CisKK2ludCBBVkNTQURfTUJfSFRGTSh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICBpbnQgc2FkID0gMDsKKyAgICB1aW50OCAqcDE7CisKKyAgICBpbnQgaTsKKyAgICBpbnQgdG1wLCB0bXAyOworICAgIGludCBseDQgPSAoZG1pbl9seCA8PCAyKSAmIDB4M0ZGRkM7CisgICAgaW50IHNhZHN0YXIgPSAwLCBtYWRzdGFyOworICAgIGludCAqbnJtbHpfdGggPSAoaW50KikgZXh0cmFfaW5mbzsKKyAgICBpbnQgKm9mZnNldFJlZiA9IChpbnQqKSBleHRyYV9pbmZvICsgMzI7CisgICAgdWludDMyIGN1cl93b3JkOworCisgICAgbWFkc3RhciA9ICh1aW50MzIpZG1pbl9seCA+PiAyMDsKKworICAgIE5VTV9TQURfTUJfQ0FMTCgpOworCisgICAgYmxrIC09IDQ7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgcDEgKz0gbHg0OworICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgcDEgKz0gbHg0OworICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgIE5VTV9TQURfTUIoKTsKKworICAgICAgICBzYWRzdGFyICs9IG1hZHN0YXI7CisgICAgICAgIGlmICgoKHVpbnQzMilzYWQgPD0gKCh1aW50MzIpZG1pbl9seCA+PiAxNikpICYmIChzYWQgPD0gKHNhZHN0YXIgLSAqbnJtbHpfdGgrKykpKQorICAgICAgICAgICAgOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gNjU1MzY7CisgICAgfQorCisgICAgcmV0dXJuIHNhZDsKK30KKyNlbmRpZiAvKiBIVEZNICovCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2hhbGZwZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9oYWxmcGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWYyMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9oYWxmcGVsLmNwcApAQCAtMCwwICsxLDYyOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIGNvbnRhaW5zCitpbnQgQVZDSGFsZlBlbDFfU0FEX01CKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgd2lkdGgsaW50IGloLGludCBqaCkKK2ludCBBVkNIYWxmUGVsMl9TQURfTUIodWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCB3aWR0aCkKK2ludCBBVkNIYWxmUGVsMV9TQURfQmxrKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgd2lkdGgsaW50IGloLGludCBqaCkKK2ludCBBVkNIYWxmUGVsMl9TQURfQmxrKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgd2lkdGgpCisKK2ludCBBVkNTQURfTUJfSGFsZlBlbF9DKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgd2lkdGgsaW50IHJ4LGludCB4aCxpbnQgeWgsdm9pZCAqZXh0cmFfaW5mbykKK2ludCBBVkNTQURfTUJfSFBfSFRGTV9Db2xsZWN0KHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgd2lkdGgsaW50IHJ4LGludCB4aCxpbnQgeWgsdm9pZCAqZXh0cmFfaW5mbykKK2ludCBBVkNTQURfTUJfSFBfSFRGTSh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoLGludCByeCxpbnQgeGgsaW50IHloLHZvaWQgKmV4dHJhX2luZm8pCitpbnQgQVZDU0FEX0Jsa19IYWxmUGVsX0ModWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCB3aWR0aCxpbnQgcngsaW50IHhoLGludCB5aCx2b2lkICpleHRyYV9pbmZvKQorKi8KKworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKyNpbmNsdWRlICJzYWRfaGFsZnBlbF9pbmxpbmUuaCIKKworI2lmZGVmIF9TQURfU1RBVAordWludDMyIG51bV9zYWRfSFBfTUIgPSAwOwordWludDMyIG51bV9zYWRfSFBfQmxrID0gMDsKK3VpbnQzMiBudW1fc2FkX0hQX01CX2NhbGwgPSAwOwordWludDMyIG51bV9zYWRfSFBfQmxrX2NhbGwgPSAwOworI2RlZmluZSBOVU1fU0FEX0hQX01CX0NBTEwoKSAgICBudW1fc2FkX0hQX01CX2NhbGwrKworI2RlZmluZSBOVU1fU0FEX0hQX01CKCkgICAgICAgICBudW1fc2FkX0hQX01CKysKKyNkZWZpbmUgTlVNX1NBRF9IUF9CTEtfQ0FMTCgpICAgbnVtX3NhZF9IUF9CbGtfY2FsbCsrCisjZGVmaW5lIE5VTV9TQURfSFBfQkxLKCkgICAgICAgIG51bV9zYWRfSFBfQmxrKysKKyNlbHNlCisjZGVmaW5lIE5VTV9TQURfSFBfTUJfQ0FMTCgpCisjZGVmaW5lIE5VTV9TQURfSFBfTUIoKQorI2RlZmluZSBOVU1fU0FEX0hQX0JMS19DQUxMKCkKKyNkZWZpbmUgTlVNX1NBRF9IUF9CTEsoKQorI2VuZGlmCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIFNBRF9NQl9IYWxmUGVsCisgICAgRGF0ZTogICAgICAgMDkvMTcvMjAwMAorICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgdGhlIFNBRCBvbiB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbgorICAgIElucHV0L091dHB1dDogICBobWVtIGlzIGFzc3VtZWQgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBzdGFydGluZworICAgICAgICAgICAgICAgIHBvaW50IG9mIHRoZSBzZWFyY2ggaW4gdGhlIDMzeDMzIG1hdHJpeCBzZWFyY2ggcmVnaW9uCisgICAgQ2hhbmdlczoKKyAgICAxMS83LzAwOiAgICBpbXBsZW1lbnRlZCBNTVgKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgQVZDU0FEX01CX0hhbGZQZWxfQworICAgIERhdGU6ICAgICAgIDA0LzMwLzIwMDEKKyAgICBQdXJwb3NlOiAgICBDb21wdXRlIFNBRCAxNngxNiBiZXR3ZWVuIGJsayBhbmQgcmVmIGluIGhhbGZwZWwKKyAgICAgICAgICAgICAgICByZXNvbHV0aW9uLAorICAgIENoYW5nZXM6CisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBPbmUgY29tcG9uZW50IGlzIGhhbGYtcGVsICovCitpbnQgQVZDU0FEX01CX0hhbGZQZWxfQ3hoeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgKHZvaWQpKGV4dHJhX2luZm8pOworCisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDA7CisgICAgdWludDggKmtrLCAqcDEsICpwMiwgKnAzLCAqcDQ7CisvLyAgaW50IHN1bXJlZj0wOworICAgIGludCB0ZW1wOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIHAxID0gcmVmOworICAgIHAyID0gcmVmICsgMTsKKyAgICBwMyA9IHJlZiArIHJ4OworICAgIHA0ID0gcmVmICsgcnggKyAxOworICAgIGtrICA9IGJsazsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgdGVtcCA9ICgocDFbal0gKyBwMltqXSArIHAzW2pdICsgcDRbal0gKyAyKSA+PiAyKSAtICpraysrOworICAgICAgICAgICAgc2FkICs9IEFWQ19BQlModGVtcCk7CisgICAgICAgIH0KKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgaWYgKHNhZCA+IChpbnQpKCh1aW50MzIpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICByZXR1cm4gc2FkOworCisgICAgICAgIHAxICs9IHJ4OworICAgICAgICBwMyArPSByeDsKKyAgICAgICAgcDIgKz0gcng7CisgICAgICAgIHA0ICs9IHJ4OworICAgIH0KKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDU0FEX01CX0hhbGZQZWxfQ3loKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgICh2b2lkKShleHRyYV9pbmZvKTsKKworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpraywgKnAxLCAqcDI7CisvLyAgaW50IHN1bXJlZj0wOworICAgIGludCB0ZW1wOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIHAxID0gcmVmOworICAgIHAyID0gcmVmICsgcng7IC8qIGVpdGhlciBsZWZ0L3JpZ2h0IG9yIHRvcC9ib3R0b20gcGl4ZWwgKi8KKyAgICBrayAgPSBibGs7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyAxKSA+PiAxKSAtICpraysrOworICAgICAgICAgICAgc2FkICs9IEFWQ19BQlModGVtcCk7CisgICAgICAgIH0KKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgaWYgKHNhZCA+IChpbnQpKCh1aW50MzIpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICBwMSArPSByeDsKKyAgICAgICAgcDIgKz0gcng7CisgICAgfQorICAgIHJldHVybiBzYWQ7Cit9CisKK2ludCBBVkNTQURfTUJfSGFsZlBlbF9DeGgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgKHZvaWQpKGV4dHJhX2luZm8pOworCisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDA7CisgICAgdWludDggKmtrLCAqcDE7CisgICAgaW50IHRlbXA7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKworICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgcDEgPSByZWY7CisgICAga2sgID0gYmxrOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgeworCisgICAgICAgICAgICB0ZW1wID0gKChwMVtqXSArIHAxW2orMV0gKyAxKSA+PiAxKSAtICpraysrOworICAgICAgICAgICAgc2FkICs9IEFWQ19BQlModGVtcCk7CisgICAgICAgIH0KKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgaWYgKHNhZCA+IChpbnQpKCh1aW50MzIpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICBwMSArPSByeDsKKyAgICB9CisgICAgcmV0dXJuIHNhZDsKK30KKworI2lmZGVmIEhURk0gIC8qIEhURk0gd2l0aCB1bmlmb3JtIHN1YnNhbXBsaW5nIGltcGxlbWVudGF0aW9uLCAgMi8yOC8wMSAqLworCisvL0NoZWNoZWNrIGhlcmUKK2ludCBBVkNBVkNTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGh5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2FkID0gMDsKKyAgICB1aW50OCAqcDEsICpwMjsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworICAgIGludCByZWZ3eDQgPSByeCA8PCAyOworICAgIGludCBzYWRkYXRhWzE2XTsgICAgICAvKiB1c2VkIHdoZW4gY29sbGVjdGluZyBmbGFnIChnbG9iYWwpIGlzIG9uICovCisgICAgaW50IGRpZm1hZCwgdG1wLCB0bXAyOworICAgIGludCBtYWRzdGFyOworICAgIEhURk1fU3RhdCAqaHRmbV9zdGF0ID0gKEhURk1fU3RhdCopIGV4dHJhX2luZm87CisgICAgaW50ICphYnNfZGlmX21hZF9hdmcgPSAmKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKTsKKyAgICBVSW50ICpjb3VudGJyZWFrID0gJihodGZtX3N0YXQtPmNvdW50YnJlYWspOworICAgIGludCAqb2Zmc2V0UmVmID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisgICAgdWludDMyIGN1cl93b3JkOworCisgICAgbWFkc3RhciA9ICh1aW50MzIpZG1pbl9yeCA+PiAyMDsKKworICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgYmxrIC09IDQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgLyogMTYgc3RhZ2VzICovCisgICAgeworICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgcDIgPSBwMSArIHJ4OworCisgICAgICAgIGogPSA0Oy8qIDQgbGluZXMgKi8KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdICsgcDJbMTJdOworICAgICAgICAgICAgdG1wMiA9IHAxWzEzXSArIHAyWzEzXTsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdICsgcDJbOF07CisgICAgICAgICAgICB0bXAyID0gcDFbOV0gKyBwMls5XTsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdICsgcDJbNF07CisgICAgICAgICAgICB0bXAyID0gcDFbNV0gKyBwMls1XTsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wMiA9IHAxWzFdICsgcDJbMV07CisgICAgICAgICAgICB0bXAgPSBwMVswXSArIHAyWzBdOworICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgcDIgKz0gcmVmd3g0OworICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICB9CisgICAgICAgIHdoaWxlICgtLWopOworCisgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICBzYWRkYXRhW2ldID0gc2FkOworCisgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNhZCA+ICgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAgICAgICAgICAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICAgICAgICAgICAgICgqY291bnRicmVhaykrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICgqY291bnRicmVhaykrKzsKKworICAgIHJldHVybiBzYWQ7Cit9CisKK2ludCBBVkNBVkNTQURfTUJfSFBfSFRGTV9Db2xsZWN0eWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDA7CisgICAgdWludDggKnAxLCAqcDI7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICBpbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICBpbnQgc2FkZGF0YVsxNl07ICAgICAgLyogdXNlZCB3aGVuIGNvbGxlY3RpbmcgZmxhZyAoZ2xvYmFsKSBpcyBvbiAqLworICAgIGludCBkaWZtYWQsIHRtcCwgdG1wMjsKKyAgICBpbnQgbWFkc3RhcjsKKyAgICBIVEZNX1N0YXQgKmh0Zm1fc3RhdCA9IChIVEZNX1N0YXQqKSBleHRyYV9pbmZvOworICAgIGludCAqYWJzX2RpZl9tYWRfYXZnID0gJihodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2Zyk7CisgICAgVUludCAqY291bnRicmVhayA9ICYoaHRmbV9zdGF0LT5jb3VudGJyZWFrKTsKKyAgICBpbnQgKm9mZnNldFJlZiA9IGh0Zm1fc3RhdC0+b2Zmc2V0UmVmOworICAgIHVpbnQzMiBjdXJfd29yZDsKKworICAgIG1hZHN0YXIgPSAodWludDMyKWRtaW5fcnggPj4gMjA7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIGJsayAtPSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgIHsKKyAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgIHAyID0gcDEgKyByeDsKKyAgICAgICAgaiA9IDQ7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSBwMlsxMl07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgdG1wMiA9IHAyWzhdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMls0XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHRtcDIgPSBwMlswXTsKKyAgICAgICAgICAgIHAyICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICB9CisgICAgICAgIHdoaWxlICgtLWopOworCisgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICBzYWRkYXRhW2ldID0gc2FkOworCisgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNhZCA+ICgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAgICAgICAgICAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICAgICAgICAgICAgICgqY291bnRicmVhaykrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICgqY291bnRicmVhaykrKzsKKworICAgIHJldHVybiBzYWQ7Cit9CisKK2ludCBBVkNBVkNTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDA7CisgICAgdWludDggKnAxOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgaW50IHJlZnd4NCA9IHJ4IDw8IDI7CisgICAgaW50IHNhZGRhdGFbMTZdOyAgICAgIC8qIHVzZWQgd2hlbiBjb2xsZWN0aW5nIGZsYWcgKGdsb2JhbCkgaXMgb24gKi8KKyAgICBpbnQgZGlmbWFkLCB0bXAsIHRtcDI7CisgICAgaW50IG1hZHN0YXI7CisgICAgSFRGTV9TdGF0ICpodGZtX3N0YXQgPSAoSFRGTV9TdGF0KikgZXh0cmFfaW5mbzsKKyAgICBpbnQgKmFic19kaWZfbWFkX2F2ZyA9ICYoaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcpOworICAgIFVJbnQgKmNvdW50YnJlYWsgPSAmKGh0Zm1fc3RhdC0+Y291bnRicmVhayk7CisgICAgaW50ICpvZmZzZXRSZWYgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX3J4ID4+IDIwOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworCisgICAgICAgIGogPSA0OyAvKiA0IGxpbmVzICovCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVsxM107CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgdG1wMiA9IHAxWzldOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVs1XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVsxXTsKKyAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICB9CisgICAgICAgIHdoaWxlICgtLWopOworCisgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICBzYWRkYXRhW2ldID0gc2FkOworCisgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNhZCA+ICgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAgICAgICAgICAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICAgICAgICAgICAgICgqY291bnRicmVhaykrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICgqY291bnRicmVhaykrKzsKKworICAgIHJldHVybiBzYWQ7Cit9CisKK2ludCBBVkNTQURfTUJfSFBfSFRGTXhoeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDAsIHRtcCwgdG1wMjsKKyAgICB1aW50OCAqcDEsICpwMjsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworICAgIGludCByZWZ3eDQgPSByeCA8PCAyOworICAgIGludCBzYWRzdGFyID0gMCwgbWFkc3RhcjsKKyAgICBpbnQgKm5ybWx6X3RoID0gKGludCopIGV4dHJhX2luZm87CisgICAgaW50ICpvZmZzZXRSZWYgPSBucm1sel90aCArIDMyOworICAgIHVpbnQzMiBjdXJfd29yZDsKKworICAgIG1hZHN0YXIgPSAodWludDMyKWRtaW5fcnggPj4gMjA7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIGJsayAtPSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgIHsKKyAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgIHAyID0gcDEgKyByeDsKKworICAgICAgICBqID0gNDsgLyogNCBsaW5lcyAqLworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl0gKyBwMlsxMl07CisgICAgICAgICAgICB0bXAyID0gcDFbMTNdICsgcDJbMTNdOworICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbOF0gKyBwMls4XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVs5XSArIHAyWzldOworICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbNF0gKyBwMls0XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVs1XSArIHAyWzVdOworICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAyID0gcDFbMV0gKyBwMlsxXTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdICsgcDJbMF07CisgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICBwMiArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIHNhZHN0YXIgKz0gbWFkc3RhcjsKKyAgICAgICAgaWYgKHNhZCA+IHNhZHN0YXIgLSBucm1sel90aFtpXSB8fCBzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDY1NTM2OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNhZDsKK30KKworaW50IEFWQ1NBRF9NQl9IUF9IVEZNeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDAsIHRtcCwgdG1wMjsKKyAgICB1aW50OCAqcDEsICpwMjsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworICAgIGludCByZWZ3eDQgPSByeCA8PCAyOworICAgIGludCBzYWRzdGFyID0gMCwgbWFkc3RhcjsKKyAgICBpbnQgKm5ybWx6X3RoID0gKGludCopIGV4dHJhX2luZm87CisgICAgaW50ICpvZmZzZXRSZWYgPSBucm1sel90aCArIDMyOworICAgIHVpbnQzMiBjdXJfd29yZDsKKworICAgIG1hZHN0YXIgPSAodWludDMyKWRtaW5fcnggPj4gMjA7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIGJsayAtPSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgIHsKKyAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgIHAyID0gcDEgKyByeDsKKyAgICAgICAgaiA9IDQ7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSBwMlsxMl07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgdG1wMiA9IHAyWzhdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMls0XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHRtcDIgPSBwMlswXTsKKyAgICAgICAgICAgIHAyICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICB9CisgICAgICAgIHdoaWxlICgtLWopOworCisgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKyAgICAgICAgc2Fkc3RhciArPSBtYWRzdGFyOworICAgICAgICBpZiAoc2FkID4gc2Fkc3RhciAtIG5ybWx6X3RoW2ldIHx8IHNhZCA+ICgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gNjU1MzY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDU0FEX01CX0hQX0hURk14aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2FkID0gMCwgdG1wLCB0bXAyOworICAgIHVpbnQ4ICpwMTsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworICAgIGludCByZWZ3eDQgPSByeCA8PCAyOworICAgIGludCBzYWRzdGFyID0gMCwgbWFkc3RhcjsKKyAgICBpbnQgKm5ybWx6X3RoID0gKGludCopIGV4dHJhX2luZm87CisgICAgaW50ICpvZmZzZXRSZWYgPSBucm1sel90aCArIDMyOworICAgIHVpbnQzMiBjdXJfd29yZDsKKworICAgIG1hZHN0YXIgPSAodWludDMyKWRtaW5fcnggPj4gMjA7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIGJsayAtPSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgIHsKKyAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisKKyAgICAgICAgaiA9IDQ7LyogNCBsaW5lcyAqLworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gcDFbMTNdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVs5XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gcDFbNV07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICB0bXAyID0gcDFbMV07CisgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgc2Fkc3RhciArPSBtYWRzdGFyOworICAgICAgICBpZiAoc2FkID4gc2Fkc3RhciAtIG5ybWx6X3RoW2ldIHx8IHNhZCA+ICgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gNjU1MzY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2FkOworfQorCisjZW5kaWYgLyogSFRGTSAqLworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaGFsZnBlbF9pbmxpbmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaGFsZnBlbF9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTIxNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9oYWxmcGVsX2lubGluZS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX1NBRF9IQUxGUEVMX0lOTElORV9IXworI2RlZmluZSBfU0FEX0hBTEZQRUxfSU5MSU5FX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAxX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICB0bXAgPSAodG1wMiA+PiAxKSAtIHRtcDsKKyAgICAgICAgaWYgKHRtcCA+IDApIHNhZCArPSB0bXA7CisgICAgICAgIGVsc2Ugc2FkIC09IHRtcDsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDJfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIHRtcCA9ICh0bXAgPj4gMikgLSB0bXAyOworICAgICAgICBpZiAodG1wID4gMCkgc2FkICs9IHRtcDsKKyAgICAgICAgZWxzZSBzYWQgLT0gdG1wOworCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisjZWxpZiBkZWZpbmVkKF9fQ0NfQVJNKSAgLyogb25seSB3b3JrIHdpdGggYXJtIHY1ICovCisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAxX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICByc2JzICAgIHRtcCwgdG1wLCB0bXAyLCBhc3IgIzEgOworICAgICAgICAgICAgcnNibWkgICB0bXAsIHRtcCwgIzAgOworICAgICAgICAgICAgYWRkICAgICBzYWQsIHNhZCwgdG1wIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMl9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgcnNicyAgICB0bXAsIHRtcDIsIHRtcCwgYXNyICMyIDsKKyAgICAgICAgICAgIHJzYm1pICAgdG1wLCB0bXAsICMwIDsKKyAgICAgICAgICAgIGFkZCAgICAgc2FkLCBzYWQsIHRtcCA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMV9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKK19fYXNtX18gdm9sYXRpbGUoInJzYnMJJTEsICUxLCAlMiwgYXNyICMxXG5cdHJzYm1pICUxLCAlMSwgIzBcblx0YWRkICAlMCwgJTAsICUxIjogIj1yIihzYWQpLCAiPXIiKHRtcCk6ICJyIih0bXAyKSk7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAyX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworX19hc21fXyB2b2xhdGlsZSgicnNicwklMSwgJTIsICUxLCBhc3IgIzJcblx0cnNibWkgJTEsICUxLCAjMFxuXHRhZGQJJTAsICUwLCAlMSI6ICI9ciIoc2FkKSwgIj1yIih0bXApOiAiciIodG1wMikpOworCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vX1NBRF9IQUxGUEVMX0lOTElORV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2lubGluZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzk3OTRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9pbmxpbmUuaApAQCAtMCwwICsxLDQ4OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgX1NBRF9JTkxJTkVfSF8KKyNkZWZpbmUgX1NBRF9JTkxJTkVfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworICAgIF9faW5saW5lIGludDMyIFNVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICB0bXAgPSB0bXAgLSB0bXAyOworICAgICAgICBpZiAodG1wID4gMCkgc2FkICs9IHRtcDsKKyAgICAgICAgZWxzZSBzYWQgLT0gdG1wOworCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgc2FkXzRwaXhlbChpbnQzMiBzcmMxLCBpbnQzMiBzcmMyLCBpbnQzMiBtYXNrKQorICAgIHsKKyAgICAgICAgaW50MzIgeDc7CisKKyAgICAgICAgeDcgPSBzcmMyIF4gc3JjMTsgICAgICAgLyogY2hlY2sgb2RkL2V2ZW4gY29tYmluYXRpb24gKi8KKyAgICAgICAgaWYgKCh1aW50MzIpc3JjMiA+PSAodWludDMyKXNyYzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNyYzEgPSBzcmMyIC0gc3JjMTsgICAgIC8qIHN1YnMgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNyYzEgPSBzcmMxIC0gc3JjMjsKKyAgICAgICAgfQorICAgICAgICB4NyA9IHg3IF4gc3JjMTsgICAgIC8qIG9ubHkgb2RkIGJ5dGVzIG5lZWQgdG8gYWRkIGNhcnJ5ICovCisgICAgICAgIHg3ID0gbWFzayAmICgodWludDMyKXg3ID4+IDEpOworICAgICAgICB4NyA9ICh4NyA8PCA4KSAtIHg3OworICAgICAgICBzcmMxID0gc3JjMSArICh4NyA+PiA3KTsgLyogYWRkIDB4RkYgdG8gdGhlIG5lZ2F0aXZlIGJ5dGUsIGFkZCBiYWNrIGNhcnJ5ICovCisgICAgICAgIHNyYzEgPSBzcmMxIF4oeDcgPj4gNyk7ICAgLyogdGFrZSBhYnNvbHV0ZSB2YWx1ZSBvZiBuZWdhdGl2ZSBieXRlICovCisKKyAgICAgICAgcmV0dXJuIHNyYzE7CisgICAgfQorCisjZGVmaW5lIE5VTUJFUiAzCisjZGVmaW5lIFNISUZUIDI0CisKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDIKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCAxNgorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMQorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDgKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKworICAgIF9faW5saW5lIGludDMyIHNpbWRfc2FkX21iKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluLCBpbnQgbHgpCisgICAgeworICAgICAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OCwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgICAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworCisgICAgICAgIHg4ID0gKHVpbnQzMilyZWYgJiAweDM7CisgICAgICAgIGlmICh4OCA9PSAzKQorICAgICAgICAgICAgZ290byBTYWRNQk9mZnNldDM7CisgICAgICAgIGlmICh4OCA9PSAyKQorICAgICAgICAgICAgZ290byBTYWRNQk9mZnNldDI7CisgICAgICAgIGlmICh4OCA9PSAxKQorICAgICAgICAgICAgZ290byBTYWRNQk9mZnNldDE7CisKKy8vICB4NSA9ICh4NDw8OCkteDQ7IC8qIHg1ID0geDQqMjU1OyAqLworICAgICAgICB4NCA9IHg1ID0gMDsKKworICAgICAgICB4NiA9IDB4RkZGRjAwRkY7CisKKyAgICAgICAgcmVmIC09IGx4OworICAgICAgICBibGsgLT0gMTY7CisKKyAgICAgICAgeDggPSAxNjsKKworTE9PUF9TQUQwOgorICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKz0gbHgpKTsKKyAgICAgICAgeDExID0gKigodWludDMyKikocmVmICsgNCkpOworICAgICAgICB4MTIgPSAqKCh1aW50MzIqKShibGsgKz0gMTYpKTsKKyAgICAgICAgeDE0ID0gKigodWludDMyKikoYmxrICsgNCkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgeDEwID0gKigodWludDMyKikocmVmICsgOCkpOworICAgICAgICB4MTEgPSAqKCh1aW50MzIqKShyZWYgKyAxMikpOworICAgICAgICB4MTIgPSAqKCh1aW50MzIqKShibGsgKyA4KSk7CisgICAgICAgIHgxNCA9ICooKHVpbnQzMiopKGJsayArIDEyKSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICAvKioqKioqKioqKioqKioqKi8KKyAgICAgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICAgICAgaWYgKChpbnQpKCh1aW50MzIpeDEwID4+IDE2KSA8PSBkbWluKSAvKiBjb21wYXJlIHdpdGggZG1pbiAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoLS14OCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIExPT1BfU0FEMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7CisKK1NhZE1CT2Zmc2V0MzoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDMocmVmLCBibGssIGx4LCBkbWluKTsKKworU2FkTUJPZmZzZXQyOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MihyZWYsIGJsaywgbHgsIGRtaW4pOworCitTYWRNQk9mZnNldDE6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQxKHJlZiwgYmxrLCBseCwgZG1pbik7CisKKyAgICB9CisKKyNlbGlmIGRlZmluZWQoX19DQ19BUk0pICAvKiBvbmx5IHdvcmsgd2l0aCBhcm0gdjUgKi8KKworICAgIF9faW5saW5lIGludDMyIFNVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICByc2JzICAgIHRtcCwgdG1wLCB0bXAyIDsKKyAgICAgICAgICAgIHJzYm1pICAgdG1wLCB0bXAsICMwIDsKKyAgICAgICAgICAgIGFkZCAgICAgc2FkLCBzYWQsIHRtcCA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWwoaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKKyAgICB7CisgICAgICAgIGludDMyIHg3OworCisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIEVPUiAgICAgeDcsIHNyYzIsIHNyYzE7ICAgICAvKiBjaGVjayBvZGQvZXZlbiBjb21iaW5hdGlvbiAqLworICAgICAgICAgICAgU1VCUyAgICBzcmMxLCBzcmMyLCBzcmMxOworICAgICAgICAgICAgRU9SICAgICB4NywgeDcsIHNyYzE7CisgICAgICAgICAgICBBTkQgICAgIHg3LCBtYXNrLCB4NywgbHNyICMxOworICAgICAgICAgICAgT1JSQ0MgICB4NywgeDcsICMweDgwMDAwMDAwOworICAgICAgICAgICAgUlNCICAgICB4NywgeDcsIHg3LCBsc2wgIzg7CisgICAgICAgICAgICBBREQgICAgIHNyYzEsIHNyYzEsIHg3LCBhc3IgIzc7ICAgLyogYWRkIDB4RkYgdG8gdGhlIG5lZ2F0aXZlIGJ5dGUsIGFkZCBiYWNrIGNhcnJ5ICovCisgICAgICAgICAgICBFT1IgICAgIHNyYzEsIHNyYzEsIHg3LCBhc3IgIzc7ICAgLyogdGFrZSBhYnNvbHV0ZSB2YWx1ZSBvZiBuZWdhdGl2ZSBieXRlICovCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3JjMTsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBzYWRfNHBpeGVsTihpbnQzMiBzcmMxLCBpbnQzMiBzcmMyLCBpbnQzMiBtYXNrKQorICAgIHsKKyAgICAgICAgaW50MzIgeDc7CisKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgRU9SICAgICAgeDcsIHNyYzIsIHNyYzE7ICAgICAgICAvKiBjaGVjayBvZGQvZXZlbiBjb21iaW5hdGlvbiAqLworICAgICAgICAgICAgQUREUyAgICAgc3JjMSwgc3JjMiwgc3JjMTsKKyAgICAgICAgICAgIEVPUiAgICAgIHg3LCB4Nywgc3JjMTsgICAgICAvKiBvbmx5IG9kZCBieXRlcyBuZWVkIHRvIGFkZCBjYXJyeSAqLworICAgICAgICAgICAgQU5EUyAgICAgeDcsIG1hc2ssIHg3LCBycng7CisgICAgICAgICAgICBSU0IgICAgICB4NywgeDcsIHg3LCBsc2wgIzg7CisgICAgICAgICAgICBTVUIgICAgICBzcmMxLCBzcmMxLCB4NywgYXNyICM3OyAgLyogYWRkIDB4RkYgdG8gdGhlIG5lZ2F0aXZlIGJ5dGUsIGFkZCBiYWNrIGNhcnJ5ICovCisgICAgICAgICAgICBFT1IgICAgICBzcmMxLCBzcmMxLCB4NywgYXNyICM3OyAvKiB0YWtlIGFic29sdXRlIHZhbHVlIG9mIG5lZ2F0aXZlIGJ5dGUgKi8KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzcmMxOworICAgIH0KKworI2RlZmluZSBzdW1fYWNjdW11bGF0ZSAgX19hc217ICAgICAgU0JDICAgICAgeDUsIHg1LCB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLyBcCisgICAgICAgIEJJQyAgICAgIHgxMCwgeDYsIHgxMDsgICAvKiB4MTAgJiAweEZGMDBGRjAwICovIFwKKyAgICAgICAgQUREICAgICAgeDQsIHg0LCB4MTAsbHNyICM4OyAgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLyBcCisgICAgICAgIFNCQyAgICAgIHg1LCB4NSwgeDExOyAgICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLyBcCisgICAgICAgIEJJQyAgICAgIHgxMSwgeDYsIHgxMTsgICAvKiB4MTEgJiAweEZGMDBGRjAwICovIFwKKyAgICAgICAgQUREICAgICAgeDQsIHg0LCB4MTEsbHNyICM4OyB9IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisKKyNkZWZpbmUgTlVNQkVSIDMKKyNkZWZpbmUgU0hJRlQgMjQKKyNkZWZpbmUgSU5DX1g4IDB4MDgwMDAwMDEKKworI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMgorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDE2CisjdW5kZWYgSU5DX1g4CisjZGVmaW5lIElOQ19YOCAweDEwMDAwMDAxCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAxCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgOAorI3VuZGVmIElOQ19YOAorI2RlZmluZSBJTkNfWDggMHgwODAwMDAwMQorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworCisgICAgX19pbmxpbmUgaW50MzIgc2ltZF9zYWRfbWIodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW4sIGludCBseCkKKyAgICB7CisgICAgICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCisgICAgICAgIHg0ID0geDUgPSAwOworCisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIE1PVlMgICAgeDgsIHJlZiwgbHNsICMzMSA7CisgICAgICAgICAgICBCSEkgICAgIFNhZE1CT2Zmc2V0MzsKKyAgICAgICAgICAgIEJDUyAgICAgU2FkTUJPZmZzZXQyOworICAgICAgICAgICAgQk1JICAgICBTYWRNQk9mZnNldDE7CisKKyAgICAgICAgICAgIE1WTiAgICAgeDYsICMweEZGMDA7CisgICAgICAgIH0KK0xPT1BfU0FEMDoKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgeDExID0gKigoaW50MzIqKShyZWYgKyAxMikpOworICAgICAgICB4MTAgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICAgICAgeDE0ID0gKigoaW50MzIqKShibGsgKyAxMikpOworICAgICAgICB4MTIgPSAqKChpbnQzMiopKGJsayArIDgpKTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgICAgICBMRFIgICAgIHgxMSwgW3JlZiwgIzRdOworICAgICAgICAgICAgTERSICAgICB4MTAsIFtyZWZdLCBseCA7CisgICAgICAgICAgICBMRFIgICAgIHgxNCwgW2JsaywgIzRdOworICAgICAgICAgICAgTERSICAgICB4MTIsIFtibGtdLCAjMTYgOworICAgICAgICB9CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICAvKioqKioqKioqKioqKioqKi8KKyAgICAgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBSU0JTICAgIHgxMSwgZG1pbiwgeDEwLCBsc3IgIzE2OworICAgICAgICAgICAgQURETFNTICB4OCwgeDgsICMweDEwMDAwMDAxOworICAgICAgICAgICAgQkxTICAgICBMT09QX1NBRDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKKworU2FkTUJPZmZzZXQzOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MyhyZWYsIGJsaywgbHgsIGRtaW4sIHg4KTsKKworU2FkTUJPZmZzZXQyOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MihyZWYsIGJsaywgbHgsIGRtaW4sIHg4KTsKKworU2FkTUJPZmZzZXQxOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MShyZWYsIGJsaywgbHgsIGRtaW4sIHg4KTsKKyAgICB9CisKKworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisgICAgX19pbmxpbmUgaW50MzIgU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CitfX2FzbV9fIHZvbGF0aWxlKCJyc2JzCSUxLCAlMSwgJTJcblx0cnNibWkgJTEsICUxLCAjMFxuXHRhZGQJJTAsICUwLCAlMSI6ICI9ciIoc2FkKTogInIiKHRtcCksICJyIih0bXAyKSk7CisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgc2FkXzRwaXhlbChpbnQzMiBzcmMxLCBpbnQzMiBzcmMyLCBpbnQzMiBtYXNrKQorICAgIHsKKyAgICAgICAgaW50MzIgeDc7CisKK19fYXNtX18gdm9sYXRpbGUoIkVPUgklMSwgJTIsICUwXG5cdFNVQlMgICUwLCAlMiwgJTBcblx0RU9SCSUxLCAlMSwgJTBcblx0QU5EICAlMSwgJTMsICUxLCBsc3IgIzFcblx0T1JSQ0MJJTEsICUxLCAjMHg4MDAwMDAwMFxuXHRSU0IgICUxLCAlMSwgJTEsIGxzbCAjOFxuXHRBREQgICUwLCAlMCwgJTEsIGFzciAjN1xuXHRFT1IgICUwLCAlMCwgJTEsIGFzciAjNyI6ICI9ciIoc3JjMSksICI9JnIiKHg3KTogInIiKHNyYzIpLCAiciIobWFzaykpOworCisgICAgICAgIHJldHVybiBzcmMxOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWxOKGludDMyIHNyYzEsIGludDMyIHNyYzIsIGludDMyIG1hc2spCisgICAgeworICAgICAgICBpbnQzMiB4NzsKKworX19hc21fXyB2b2xhdGlsZSgiRU9SCSUxLCAlMiwgJTBcblx0QUREUyAgJTAsICUyLCAlMFxuXHRFT1IgICUxLCAlMSwgJTBcblx0QU5EUyAgJTEsICUzLCAlMSwgcnJ4XG5cdFJTQiAgJTEsICUxLCAlMSwgbHNsICM4XG5cdFNVQgklMCwgJTAsICUxLCBhc3IgIzdcblx0RU9SICAgJTAsICUwLCAlMSwgYXNyICM3IjogIj1yIihzcmMxKSwgIj0mciIoeDcpOiAiciIoc3JjMiksICJyIihtYXNrKSk7CisKKyAgICAgICAgcmV0dXJuIHNyYzE7CisgICAgfQorCisjZGVmaW5lIHN1bV9hY2N1bXVsYXRlICBfX2FzbV9fIHZvbGF0aWxlKCJTQkMgICUwLCAlMCwgJTFcblx0QklDICAgJTEsICU0LCAlMVxuXHRBREQgICAlMiwgJTIsICUxLCBsc3IgIzhcblx0U0JDICAgJTAsICUwLCAlM1xuXHRCSUMgICAlMywgJTQsICUzXG5cdEFERCAgICUyLCAlMiwgJTMsIGxzciAjOCI6ICI9JnIiICh4NSksICI9JnIiICh4MTApLCAiPSZyIiAoeDQpLCAiPSZyIiAoeDExKTogInIiICh4NikpOworCisjZGVmaW5lIE5VTUJFUiAzCisjZGVmaW5lIFNISUZUIDI0CisjZGVmaW5lIElOQ19YOCAweDA4MDAwMDAxCisKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDIKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCAxNgorI3VuZGVmIElOQ19YOAorI2RlZmluZSBJTkNfWDggMHgxMDAwMDAwMQorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMQorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDgKKyN1bmRlZiBJTkNfWDgKKyNkZWZpbmUgSU5DX1g4IDB4MDgwMDAwMDEKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKworICAgIF9faW5saW5lIGludDMyIHNpbWRfc2FkX21iKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluLCBpbnQgbHgpCisgICAgeworICAgICAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OCwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgICAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworICAgICAgICB4NCA9IHg1ID0gMDsKKworICAgICAgICB4OCA9ICh1aW50MzIpcmVmICYgMHgzOworICAgICAgICBpZiAoeDggPT0gMykKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQzOworICAgICAgICBpZiAoeDggPT0gMikKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQyOworICAgICAgICBpZiAoeDggPT0gMSkKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQxOworCisgICAgICAgIHg4ID0gMTY7CisvLy8KK19fYXNtX18gdm9sYXRpbGUoIk1WTgklMCwgIzB4RkYwMCI6ICI9ciIoeDYpKTsKKworTE9PUF9TQUQwOgorICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICB4MTEgPSAqKChpbnQzMiopKHJlZiArIDEyKSk7CisgICAgICAgIHgxMCA9ICooKGludDMyKikocmVmICsgOCkpOworICAgICAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDEyKSk7CisgICAgICAgIHgxMiA9ICooKGludDMyKikoYmxrICsgOCkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgeDExID0gKigoaW50MzIqKShyZWYgKyA0KSk7CitfX2FzbV9fIHZvbGF0aWxlKCJMRFIJJTAsIFslMV0sICUyIjogIj0mciIoeDEwKSwgIj1yIihyZWYpOiAiciIobHgpKTsKKyAgICAgICAgLy94MTAgPSAqKChpbnQzMiopcmVmKTsgcmVmKz1seDsKKyAgICAgICAgeDE0ID0gKigoaW50MzIqKShibGsgKyA0KSk7CitfX2FzbV9fIHZvbGF0aWxlKCJMRFIJJTAsIFslMV0sICMxNiI6ICI9JnIiKHgxMiksICI9ciIoYmxrKSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICAvKioqKioqKioqKioqKioqKi8KKyAgICAgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKiovCisKKyAgICAgICAgaWYgKCgodWludDMyKXgxMCA+PiAxNikgPD0gZG1pbikgLyogY29tcGFyZSB3aXRoIGRtaW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKC0teDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBMT09QX1NBRDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworCitTYWRNQk9mZnNldDM6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQzKHJlZiwgYmxrLCBseCwgZG1pbik7CisKK1NhZE1CT2Zmc2V0MjoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDIocmVmLCBibGssIGx4LCBkbWluKTsKKworU2FkTUJPZmZzZXQxOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MShyZWYsIGJsaywgbHgsIGRtaW4pOworICAgIH0KKworCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9TQURfSU5MSU5FX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfbWJfb2Zmc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX21iX29mZnNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZDRhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX21iX29mZnNldC5oCkBAIC0wLDAgKzEsMzExIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisjaWYgKE5VTUJFUj09MykKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQzKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4pCisjZWxpZiAoTlVNQkVSPT0yKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDIodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbikKKyNlbGlmIChOVU1CRVI9PTEpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0MSh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluKQorI2VuZGlmCit7CisgICAgaW50MzIgeDQsIHg1LCB4NiwgeDgsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICAvLyAgeDUgPSAoeDQ8PDgpIC0geDQ7CisgICAgeDQgPSB4NSA9IDA7CisgICAgeDYgPSAweEZGRkYwMEZGOworICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCisgICAgcmVmIC09IE5VTUJFUjsgLyogYmljIHJlZiwgcmVmLCAjMyAqLworICAgIHJlZiAtPSBseDsKKyAgICBibGsgLT0gMTY7CisgICAgeDggPSAxNjsKKworI2lmIChOVU1CRVI9PTMpCitMT09QX1NBRDM6CisjZWxpZiAoTlVNQkVSPT0yKQorTE9PUF9TQUQyOgorI2VsaWYgKE5VTUJFUj09MSkKK0xPT1BfU0FEMToKKyNlbmRpZgorICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDEwID0gKigodWludDMyKikocmVmICs9IGx4KSk7IC8qIEQgQyBCIEEgKi8KKyAgICB4MTEgPSAqKCh1aW50MzIqKShyZWYgKyA0KSk7ICAgIC8qIEggRyBGIEUgKi8KKyAgICB4MTIgPSAqKCh1aW50MzIqKShyZWYgKyA4KSk7ICAgIC8qIEwgSyBKIEkgKi8KKworICAgIHgxMCA9ICgodWludDMyKXgxMCA+PiBTSElGVCk7IC8qIDAgMCAwIEQgKi8KKyAgICB4MTAgPSB4MTAgfCAoeDExIDw8ICgzMiAtIFNISUZUKSk7ICAgICAgICAvKiBHIEYgRSBEICovCisgICAgeDExID0gKCh1aW50MzIpeDExID4+IFNISUZUKTsgLyogMCAwIDAgSCAqLworICAgIHgxMSA9IHgxMSB8ICh4MTIgPDwgKDMyIC0gU0hJRlQpKTsgICAgICAgIC8qIEsgSiBJIEggKi8KKworICAgIHgxMiA9ICooKHVpbnQzMiopKGJsayArPSAxNikpOworICAgIHgxNCA9ICooKHVpbnQzMiopKGJsayArIDQpKTsKKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICB4NSA9IHg1ICsgeDEwOyAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgIHgxMCA9ICooKHVpbnQzMiopKHJlZiArIDgpKTsgLyogRCBDIEIgQSAqLworICAgIHgxMSA9ICooKHVpbnQzMiopKHJlZiArIDEyKSk7ICAgLyogSCBHIEYgRSAqLworICAgIHgxMiA9ICooKHVpbnQzMiopKHJlZiArIDE2KSk7ICAgLyogTCBLIEogSSAqLworCisgICAgeDEwID0gKCh1aW50MzIpeDEwID4+IFNISUZUKTsgLyogbXZuIHgxMCwgeDEwLCBsc3IgIzI0ICA9IDB4RkYgMHhGRiAweEZGIH5EICovCisgICAgeDEwID0geDEwIHwgKHgxMSA8PCAoMzIgLSBTSElGVCkpOyAgICAgICAgLyogYmljIHgxMCwgeDEwLCB4MTEsIGxzbCAjOCA9IH5HIH5GIH5FIH5EICovCisgICAgeDExID0gKCh1aW50MzIpeDExID4+IFNISUZUKTsgLyogMHhGRiAweEZGIDB4RkYgfkggKi8KKyAgICB4MTEgPSB4MTEgfCAoeDEyIDw8ICgzMiAtIFNISUZUKSk7ICAgICAgICAvKiB+SyB+SiB+SSB+SCAqLworCisgICAgeDEyID0gKigodWludDMyKikoYmxrICsgOCkpOworICAgIHgxNCA9ICooKHVpbnQzMiopKGJsayArIDEyKSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgeDUgPSB4NSArIHgxMDsgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgaWYgKChpbnQpKCh1aW50MzIpeDEwID4+IDE2KSA8PSBkbWluKSAvKiBjb21wYXJlIHdpdGggZG1pbiAqLworICAgIHsKKyAgICAgICAgaWYgKC0teDgpCisgICAgICAgIHsKKyNpZiAoTlVNQkVSPT0zKQorICAgICAgICAgICAgZ290byAgICAgICAgIExPT1BfU0FEMzsKKyNlbGlmIChOVU1CRVI9PTIpCisgICAgICAgICAgICBnb3RvICAgICAgICAgTE9PUF9TQUQyOworI2VsaWYgKE5VTUJFUj09MSkKKyAgICAgICAgICAgIGdvdG8gICAgICAgICBMT09QX1NBRDE7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7Cit9CisKKyNlbGlmIGRlZmluZWQoX19DQ19BUk0pICAvKiBvbmx5IHdvcmsgd2l0aCBhcm0gdjUgKi8KKworI2lmIChOVU1CRVI9PTMpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0Myh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluLCBpbnQzMiB4OCkKKyNlbGlmIChOVU1CRVI9PTIpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0Mih1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluLCBpbnQzMiB4OCkKKyNlbGlmIChOVU1CRVI9PTEpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0MSh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluLCBpbnQzMiB4OCkKKyNlbmRpZgoreworICAgIGludDMyIHg0LCB4NSwgeDYsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworICAgIHg0ID0geDUgPSAwOworCisgICAgX19hc217CisgICAgICAgIE1WTiAgICAgIHg2LCAjMHhmZjAwMDA7CisjaWYgKE5VTUJFUj09MykKK0xPT1BfU0FEMzoKKyNlbGlmIChOVU1CRVI9PTIpCitMT09QX1NBRDI6CisjZWxpZiAoTlVNQkVSPT0xKQorTE9PUF9TQUQxOgorI2VuZGlmCisgICAgICAgIEJJQyAgICAgIHJlZiwgcmVmLCAjMzsKKyAgICB9CisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTEgPSAqKChpbnQzMiopKHJlZiArIDEyKSk7CisgICAgeDEyID0gKigoaW50MzIqKShyZWYgKyAxNikpOworICAgIHgxMCA9ICooKGludDMyKikocmVmICsgOCkpOworICAgIHgxNCA9ICooKGludDMyKikoYmxrICsgMTIpKTsKKworICAgIF9fYXNteworICAgICAgICBNVk4gICAgICB4MTAsIHgxMCwgbHNyICNTSElGVDsKKyAgICAgICAgQklDICAgICAgeDEwLCB4MTAsIHgxMSwgbHNsICMoMzItU0hJRlQpOworICAgICAgICBNVk4gICAgICB4MTEsIHgxMSwgbHNyICNTSElGVDsKKyAgICAgICAgQklDICAgICAgeDExLCB4MTEsIHgxMiwgbHNsICMoMzItU0hJRlQpOworCisgICAgICAgIExEUiAgICAgIHgxMiwgW2JsaywgIzhdOworICAgIH0KKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbE4oeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbE4oeDEwLCB4MTIsIHg5KTsKKworICAgIHN1bV9hY2N1bXVsYXRlOworCisgICAgX19hc217CisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIExEUiAgICAgIHgxMSwgW3JlZiwgIzRdOworICAgICAgICBMRFIgICAgICB4MTIsIFtyZWYsICM4XTsKKyAgICAgICAgTERSICB4MTAsIFtyZWZdLCBseCA7CisgICAgICAgIExEUiAgeDE0LCBbYmxrLCAjNF07CisKKyAgICAgICAgTVZOICAgICAgeDEwLCB4MTAsIGxzciAjU0hJRlQ7CisgICAgICAgIEJJQyAgICAgIHgxMCwgeDEwLCB4MTEsIGxzbCAjKDMyLVNISUZUKTsKKyAgICAgICAgTVZOICAgICAgeDExLCB4MTEsIGxzciAjU0hJRlQ7CisgICAgICAgIEJJQyAgICAgIHgxMSwgeDExLCB4MTIsIGxzbCAjKDMyLVNISUZUKTsKKworICAgICAgICBMRFIgICAgICB4MTIsIFtibGtdLCAjMTY7CisgICAgfQorCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsTih4MTEsIHgxNCwgeDkpOworCisgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICB4MTAgPSBzYWRfNHBpeGVsTih4MTAsIHgxMiwgeDkpOworCisgICAgc3VtX2FjY3VtdWxhdGU7CisKKyAgICAvKioqKioqKioqKioqKioqKi8KKyAgICB4MTAgPSB4NSAtICh4NCA8PCA4KTsgLyogZXh0cmFjdCBsb3cgYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICBfX2FzbXsKKyAgICAgICAgUlNCUyAgICAgeDExLCBkbWluLCB4MTAsIGxzciAjMTYKKyAgICAgICAgQURETFNTICAgeDgsIHg4LCAjSU5DX1g4CisjaWYgKE5VTUJFUj09MykKKyAgICAgICAgQkxTICAgICAgTE9PUF9TQUQzOworI2VsaWYgKE5VTUJFUj09MikKK0JMUyAgICAgIExPT1BfU0FEMjsKKyNlbGlmIChOVU1CRVI9PTEpCitCTFMgICAgICBMT09QX1NBRDE7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKK30KKworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisjaWYgKE5VTUJFUj09MykKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQzKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4pCisjZWxpZiAoTlVNQkVSPT0yKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDIodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbikKKyNlbGlmIChOVU1CRVI9PTEpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0MSh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluKQorI2VuZGlmCit7CisgICAgaW50MzIgeDQsIHg1LCB4NiwgeDgsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworICAgIHg0ID0geDUgPSAwOworICAgIHg4ID0gMTY7IC8vPDw9PT09PT09PT09PSoqKioqKioKKworX19hc21fXyB2b2xhdGlsZSgiTVZOCSUwLCAjMHhGRjAwMDAiOiAiPXIiKHg2KSk7CisKKyNpZiAoTlVNQkVSPT0zKQorTE9PUF9TQUQzOgorI2VsaWYgKE5VTUJFUj09MikKK0xPT1BfU0FEMjoKKyNlbGlmIChOVU1CRVI9PTEpCitMT09QX1NBRDE6CisjZW5kaWYKK19fYXNtX18gdm9sYXRpbGUoIkJJQyAgJTAsICUwLCAjMyI6ICI9ciIocmVmKSk7CisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTEgPSAqKChpbnQzMiopKHJlZiArIDEyKSk7CisgICAgeDEyID0gKigoaW50MzIqKShyZWYgKyAxNikpOworICAgIHgxMCA9ICooKGludDMyKikocmVmICsgOCkpOworICAgIHgxNCA9ICooKGludDMyKikoYmxrICsgMTIpKTsKKworI2lmIChTSElGVD09OCkKK19fYXNtX18gdm9sYXRpbGUoIk1WTiAgICUwLCAlMCwgbHNyICM4XG5cdEJJQyAgICUwLCAlMCwgJTEsbHNsICMyNFxuXHRNVk4gICAlMSwgJTEsbHNyICM4XG5cdEJJQyAgICUxLCAlMSwgJTIsbHNsICMyNCI6ICI9JnIiKHgxMCksICI9JnIiKHgxMSk6ICJyIih4MTIpKTsKKyNlbGlmIChTSElGVD09MTYpCitfX2FzbV9fIHZvbGF0aWxlKCJNVk4gICAlMCwgJTAsIGxzciAjMTZcblx0QklDICAgJTAsICUwLCAlMSxsc2wgIzE2XG5cdE1WTiAgICUxLCAlMSxsc3IgIzE2XG5cdEJJQyAgICUxLCAlMSwgJTIsbHNsICMxNiI6ICI9JnIiKHgxMCksICI9JnIiKHgxMSk6ICJyIih4MTIpKTsKKyNlbGlmIChTSElGVD09MjQpCitfX2FzbV9fIHZvbGF0aWxlKCJNVk4gICAlMCwgJTAsIGxzciAjMjRcblx0QklDICAgJTAsICUwLCAlMSxsc2wgIzhcblx0TVZOICAgJTEsICUxLGxzciAjMjRcblx0QklDICAgJTEsICUxLCAlMixsc2wgIzgiOiAiPSZyIih4MTApLCAiPSZyIih4MTEpOiAiciIoeDEyKSk7CisjZW5kaWYKKworICAgIHgxMiA9ICooKGludDMyKikoYmxrICsgOCkpOworCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsTih4MTEsIHgxNCwgeDkpOworCisgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICB4MTAgPSBzYWRfNHBpeGVsTih4MTAsIHgxMiwgeDkpOworCisgICAgc3VtX2FjY3VtdWxhdGU7CisKKyAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgIHgxMSA9ICooKGludDMyKikocmVmICsgNCkpOworICAgIHgxMiA9ICooKGludDMyKikocmVmICsgOCkpOworICAgIHgxMCA9ICooKGludDMyKilyZWYpOyByZWYgKz0gbHg7CisgICAgeDE0ID0gKigoaW50MzIqKShibGsgKyA0KSk7CisKKyNpZiAoU0hJRlQ9PTgpCitfX2FzbV9fIHZvbGF0aWxlKCJNVk4gICAlMCwgJTAsIGxzciAjOFxuXHRCSUMgICAlMCwgJTAsICUxLGxzbCAjMjRcblx0TVZOICAgJTEsICUxLGxzciAjOFxuXHRCSUMgICAlMSwgJTEsICUyLGxzbCAjMjQiOiAiPSZyIih4MTApLCAiPSZyIih4MTEpOiAiciIoeDEyKSk7CisjZWxpZiAoU0hJRlQ9PTE2KQorX19hc21fXyB2b2xhdGlsZSgiTVZOICAgJTAsICUwLCBsc3IgIzE2XG5cdEJJQyAgICUwLCAlMCwgJTEsbHNsICMxNlxuXHRNVk4gICAlMSwgJTEsbHNyICMxNlxuXHRCSUMgICAlMSwgJTEsICUyLGxzbCAjMTYiOiAiPSZyIih4MTApLCAiPSZyIih4MTEpOiAiciIoeDEyKSk7CisjZWxpZiAoU0hJRlQ9PTI0KQorX19hc21fXyB2b2xhdGlsZSgiTVZOICAgJTAsICUwLCBsc3IgIzI0XG5cdEJJQyAgICUwLCAlMCwgJTEsbHNsICM4XG5cdE1WTiAgICUxLCAlMSxsc3IgIzI0XG5cdEJJQyAgICUxLCAlMSwgJTIsbHNsICM4IjogIj0mciIoeDEwKSwgIj0mciIoeDExKTogInIiKHgxMikpOworI2VuZGlmCitfX2FzbV9fIHZvbGF0aWxlKCJMRFIgICAlMCwgWyUxXSwgIzE2IjogIj0mciIoeDEyKSwgIj1yIihibGspKTsKKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbE4oeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbE4oeDEwLCB4MTIsIHg5KTsKKworICAgIHN1bV9hY2N1bXVsYXRlOworCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgaWYgKCgodWludDMyKXgxMCA+PiAxNikgPD0gKHVpbnQzMilkbWluKSAvKiBjb21wYXJlIHdpdGggZG1pbiAqLworICAgIHsKKyAgICAgICAgaWYgKC0teDgpCisgICAgICAgIHsKKyNpZiAoTlVNQkVSPT0zKQorICAgICAgICAgICAgZ290byAgICAgICAgIExPT1BfU0FEMzsKKyNlbGlmIChOVU1CRVI9PTIpCitnb3RvICAgICAgICAgTE9PUF9TQUQyOworI2VsaWYgKE5VTUJFUj09MSkKK2dvdG8gICAgICAgICBMT09QX1NBRDE7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2xpY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NsaWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQwNjZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NsaWNlLmNwcApAQCAtMCwwICsxLDEwMjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorCisKK0FWQ0VuY19TdGF0dXMgQVZDRW5jb2RlU2xpY2UoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUGljUGFyYW1TZXQgKnBwcyA9IHZpZGVvLT5jdXJyUGljUGFyYW1zOworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgOworICAgIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtID0gZW5jdmlkLT5iaXRzdHJlYW07CisgICAgdWludCBzbGljZV9ncm91cF9pZDsKKyAgICBpbnQgQ3Vyck1iQWRkciwgc2xpY2VfdHlwZTsKKworICAgIHNsaWNlX3R5cGUgPSB2aWRlby0+c2xpY2VfdHlwZTsKKworICAgIC8qIHNldCB0aGUgZmlyc3QgbWIgaW4gc2xpY2UgKi8KKyAgICB2aWRlby0+bWJOdW0gPSBDdXJyTWJBZGRyID0gc2xpY2VIZHItPmZpcnN0X21iX2luX3NsaWNlOy8vICogKDErdmlkZW8tPk1iYWZmRnJhbWVGbGFnKTsKKyAgICBzbGljZV9ncm91cF9pZCA9IHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcFtDdXJyTWJBZGRyXTsKKworICAgIHZpZGVvLT5tYl9za2lwX3J1biA9IDA7CisKKyAgICAvKiB3aGlsZSBsb29wICwgc2VlIHN1YmNsYXVzZSA3LjMuNCAqLworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgdmlkZW8tPm1iTnVtID0gQ3Vyck1iQWRkcjsKKyAgICAgICAgY3Vyck1CID0gdmlkZW8tPmN1cnJNQiA9ICYodmlkZW8tPm1ibG9ja1tDdXJyTWJBZGRyXSk7CisgICAgICAgIGN1cnJNQi0+c2xpY2VfaWQgPSB2aWRlby0+c2xpY2VfaWQ7ICAvLyBmb3IgZGVibG9ja2luZworCisgICAgICAgIHZpZGVvLT5tYl94ID0gQ3Vyck1iQWRkciAlIHZpZGVvLT5QaWNXaWR0aEluTWJzOworICAgICAgICB2aWRlby0+bWJfeSA9IEN1cnJNYkFkZHIgLyB2aWRlby0+UGljV2lkdGhJbk1iczsKKworICAgICAgICAvKiBpbml0aWFsaXplIFFQIGZvciB0aGlzIE1CIGhlcmUqLworICAgICAgICAvKiBjYWxjdWxhdGUgY3Vyck1CLT5RUHkgKi8KKyAgICAgICAgUkNJbml0TUJRUChlbmN2aWQpOworCisgICAgICAgIC8qIGNoZWNrIHRoZSBhdmFpbGFiaWxpdHkgb2YgbmVpZ2hib3JpbmcgbWFjcm9ibG9ja3MgKi8KKyAgICAgICAgSW5pdE5laWdoYm9yQXZhaWxhYmlsaXR5KHZpZGVvLCBDdXJyTWJBZGRyKTsKKworICAgICAgICAvKiBBc3N1bWluZyB0aGF0IEluaXROZWlnaGJvckF2YWlsYWJpbGl0eSBoYXMgYmVlbiBjYWxsZWQgcHJpb3IgdG8gdGhpcyBmdW5jdGlvbiAqLworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+aW50cmFBdmFpbEQgPSAwOworICAgICAgICAvKiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgYWxsIHN1YnNlcXVlbnQgaW50cmEgc2VhcmNoICovCisKKyAgICAgICAgaWYgKCF2aWRlby0+Y3VyclBpY1BhcmFtcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+bWJBdmFpbEE7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+bWJBdmFpbEI7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+bWJBdmFpbEM7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEQgPSB2aWRlby0+bWJBdmFpbEQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxBKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckFdLm1iX2ludHJhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXS5tYl9pbnRyYSA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxDKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckNdLm1iX2ludHJhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEQgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJEXS5tYl9pbnRyYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGVuY29kZV9vbmVfbWFjcm9ibG9jaygpICovCisgICAgICAgIHN0YXR1cyA9IEVuY29kZU1CKGVuY3ZpZCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogZ28gdG8gbmV4dCBNQiAqLworICAgICAgICBDdXJyTWJBZGRyKys7CisKKyAgICAgICAgd2hpbGUgKCh1aW50KXZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcFtDdXJyTWJBZGRyXSAhPSBzbGljZV9ncm91cF9pZCAmJgorICAgICAgICAgICAgICAgICh1aW50KUN1cnJNYkFkZHIgPCB2aWRlby0+UGljU2l6ZUluTWJzKQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyTWJBZGRyKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHVpbnQpQ3Vyck1iQWRkciA+PSB2aWRlby0+UGljU2l6ZUluTWJzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBlbmQgb2Ygc2xpY2UsIHJldHVybiwgYnV0IGJlZm9yZSB0aGF0IGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgb3RoZXIgc2xpY2VzCisgICAgICAgICAgICB0byBiZSBlbmNvZGVkLiAqLworICAgICAgICAgICAgZW5jdmlkLT5jdXJyU2xpY2VHcm91cCsrOworICAgICAgICAgICAgaWYgKGVuY3ZpZC0+Y3VyclNsaWNlR3JvdXAgPiAoaW50KXBwcy0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEpIC8qIG5vIG1vcmUgc2xpY2UgZ3JvdXAgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfUElDVFVSRV9SRUFEWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmaW5kIGZpcnN0X21iX251bSBmb3IgdGhlIG5leHQgc2xpY2UgKi8KKyAgICAgICAgICAgICAgICBDdXJyTWJBZGRyID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAodmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwW0N1cnJNYkFkZHJdICE9IGVuY3ZpZC0+Y3VyclNsaWNlR3JvdXAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50KUN1cnJNYkFkZHIgPCB2aWRlby0+UGljU2l6ZUluTWJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3Vyck1iQWRkcisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpQ3Vyck1iQWRkciA+PSB2aWRlby0+UGljU2l6ZUluTWJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1NMSUNFX0VNUFRZOyAvKiBlcnJvciwgb25lIHNsaWNlIGdyb3VwIGhhcyBubyBNQnMgaW4gaXQgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aWRlby0+bWJOdW0gPSBDdXJyTWJBZGRyOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5tYl9za2lwX3J1biA+IDApCisgICAgeworICAgICAgICAvKiB3cml0ZSBza2lwX3J1biAqLworICAgICAgICBpZiAoc2xpY2VfdHlwZSAhPSBBVkNfSV9TTElDRSAmJiBzbGljZV90eXBlICE9IEFWQ19TSV9TTElDRSkKKyAgICAgICAgeworICAgICAgICAgICAgdWVfdihzdHJlYW0sIHZpZGVvLT5tYl9za2lwX3J1bik7CisgICAgICAgICAgICB2aWRlby0+bWJfc2tpcF9ydW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAgLyogc2hvdWxkbid0IGhhcHBlbiAqLworICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfRkFJTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworQVZDRW5jX1N0YXR1cyBFbmNvZGVNQihBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNQaWN0dXJlRGF0YSAqY3VyclBpYyA9IHZpZGVvLT5jdXJyUGljOworICAgIEFWQ0ZyYW1lSU8gICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIEFWQ01hY3JvYmxvY2sgKk1CX0EsICpNQl9COworICAgIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtID0gZW5jdmlkLT5iaXRzdHJlYW07CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICB1aW50OCAqY3VyLCAqY3VyTCwgKmN1ckNiLCAqY3VyQ3I7CisgICAgdWludDggKm9yZ0wsICpvcmdDYiwgKm9yZ0NyLCAqb3JnNDsKKyAgICBpbnQgQ3Vyck1iQWRkciA9IHZpZGVvLT5tYk51bTsKKyAgICBpbnQgcGljUGl0Y2ggPSBjdXJyUGljLT5waXRjaDsKKyAgICBpbnQgb3JnUGl0Y2ggPSBjdXJySW5wdXQtPnBpdGNoOworICAgIGludCB4X3Bvc2l0aW9uID0gKHZpZGVvLT5tYl94IDw8IDQpOworICAgIGludCB5X3Bvc2l0aW9uID0gKHZpZGVvLT5tYl95IDw8IDQpOworICAgIGludCBvZmZzZXQ7CisgICAgaW50IGI4LCBiNCwgYmxraWR4OworICAgIEFWQ1Jlc2lkdWFsVHlwZSAgcmVzVHlwZTsKKyAgICBpbnQgc2xpY2VfdHlwZTsKKyAgICBpbnQgbnVtY29lZmY7IC8qIG91dHB1dCBmcm9tIHJlc2lkdWFsX2Jsb2NrX2NhdmxjICovCisgICAgaW50IGNvc3QxNiwgY29zdDg7CisKKyAgICBpbnQgbnVtX2JpdHMsIHN0YXJ0X21iX2JpdHMsIHN0YXJ0X3RleHRfYml0czsKKworICAgIHNsaWNlX3R5cGUgPSB2aWRlby0+c2xpY2VfdHlwZTsKKworICAgIC8qIG5vdywgcG9pbnQgdG8gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgKi8KKyAgICBvZmZzZXQgPSB5X3Bvc2l0aW9uICogcGljUGl0Y2ggKyB4X3Bvc2l0aW9uOworICAgIGN1ckwgPSBjdXJyUGljLT5TbCArIG9mZnNldDsKKyAgICBvcmdMID0gY3VycklucHV0LT5ZQ2JDclswXSArIG9mZnNldDsKKyAgICBvZmZzZXQgPSAob2Zmc2V0ICsgeF9wb3NpdGlvbikgPj4gMjsKKyAgICBjdXJDYiA9IGN1cnJQaWMtPlNjYiArIG9mZnNldDsKKyAgICBjdXJDciA9IGN1cnJQaWMtPlNjciArIG9mZnNldDsKKyAgICBvcmdDYiA9IGN1cnJJbnB1dC0+WUNiQ3JbMV0gKyBvZmZzZXQ7CisgICAgb3JnQ3IgPSBjdXJySW5wdXQtPllDYkNyWzJdICsgb2Zmc2V0OworCisgICAgaWYgKG9yZ1BpdGNoICE9IHBpY1BpdGNoKQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0geV9wb3NpdGlvbiAqIChvcmdQaXRjaCAtIHBpY1BpdGNoKTsKKyAgICAgICAgb3JnTCArPSBvZmZzZXQ7CisgICAgICAgIG9mZnNldCA+Pj0gMjsKKyAgICAgICAgb3JnQ2IgKz0gb2Zmc2V0OworICAgICAgICBvcmdDciArPSBvZmZzZXQ7CisgICAgfQorCisgICAgLyoqKioqKiogZGV0ZXJtaW5lIE1CIHByZWRpY3Rpb24gbW9kZSAqKioqKioqLworICAgIGlmIChlbmN2aWQtPmludHJhU2VhcmNoW0N1cnJNYkFkZHJdKQorICAgIHsKKyAgICAgICAgTUJJbnRyYVNlYXJjaChlbmN2aWQsIEN1cnJNYkFkZHIsIGN1ckwsIHBpY1BpdGNoKTsKKyAgICB9CisgICAgLyoqKioqKiogVGhpcyBwYXJ0IHNob3VsZCBiZSBkZXRlcm1pbmVkIHNvbWVob3cgKioqKioqKioqKioqKioqLworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSV9QQ00pCisgICAgeworICAgICAgICAvKiB3cml0ZSBkb3duIG1iX3R5cGUgYW5kIFBDTSBkYXRhICovCisgICAgICAgIC8qIGFuZCBjb3B5IGZyb20gY3VycklucHV0IHRvIGN1cnJQaWMgKi8KKyAgICAgICAgc3RhdHVzID0gRW5jb2RlSW50cmFQQ00oZW5jdmlkKTsKKworCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyoqKioqKiBmb3IgaW50cmEgcHJlZGljdGlvbiwgcHJlZCBpcyBhbHJlYWR5IGRvbmUgKioqKioqKi8KKyAgICAvKioqKioqIGZvciBJNCwgdGhlIHJlY29uIGlzIHJlYWR5IGFuZCBYZnJtIGNvZWZzIGFyZSByZWFkeSB0byBiZSBlbmNvZGVkICoqKioqLworCisgICAgLy9SQ0NhbGN1bGF0ZU1BRChlbmN2aWQsY3Vyck1CLG9yZ0wsb3JnUGl0Y2gpOyAvLyBubyBuZWVkIHRvIHJlLWNhbGN1bGF0ZSBNQUQgZm9yIEludHJhCisgICAgLy8gbm90IHVzZWQgc2luY2UgdG90YWxTQUQgaXMgdXNlZCBpbnN0ZWFkCisKKyAgICAvKiBjb21wdXRlIHRoZSBwcmVkaWN0aW9uICovCisgICAgLyogb3V0cHV0IGlzIHZpZGVvLT5wcmVkX2Jsb2NrICovCisgICAgaWYgKCFjdXJyTUItPm1iX2ludHJhKQorICAgIHsKKyAgICAgICAgQVZDTUJNb3Rpb25Db21wKGVuY3ZpZCwgdmlkZW8pOyAvKiBwZXJmb3JtIHByZWRpY3Rpb24gYW5kIHJlc2lkdWUgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgLyogd2UgY2FuIGRvIHRoZSBsb29wIGhlcmUgYW5kIGNhbGwgZGN0X2x1bWEgKi8KKyAgICAgICAgdmlkZW8tPnByZWRfcGl0Y2ggPSBwaWNQaXRjaDsKKyAgICAgICAgY3Vyck1CLT5DQlAgPSAwOworICAgICAgICBjb3N0MTYgPSAwOworICAgICAgICBjdXIgPSBjdXJMOworICAgICAgICBvcmc0ID0gb3JnTDsKKworICAgICAgICBmb3IgKGI4ID0gMDsgYjggPCA0OyBiOCsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb3N0OCA9IDA7CisKKyAgICAgICAgICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxraWR4ID0gYmxrSWR4MmJsa1hZW2I4XVtiNF07CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZWRfYmxvY2sgPSBjdXI7CisgICAgICAgICAgICAgICAgbnVtY29lZmYgPSBkY3RfbHVtYShlbmN2aWQsIGJsa2lkeCwgY3VyLCBvcmc0LCAmY29zdDgpOworICAgICAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbYmxraWR4XSA9IG51bWNvZWZmOworICAgICAgICAgICAgICAgIGlmIChudW1jb2VmZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5jYnA0eDQgfD0gKDEgPDwgYmxraWR4KTsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5DQlAgfD0gKDEgPDwgYjgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChiNCYxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyICs9ICgocGljUGl0Y2ggPDwgMikgLSA0KTsKKyAgICAgICAgICAgICAgICAgICAgb3JnNCArPSAoKG9yZ1BpdGNoIDw8IDIpIC0gNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1ciArPSA0OworICAgICAgICAgICAgICAgICAgICBvcmc0ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBtb3ZlIHRoZSBJRENUIHBhcnQgb3V0IG9mIGRjdF9sdW1hIHRvIGFjY29tbW9kYXRlIHRoZSBjaGVjaworICAgICAgICAgICAgICAgZm9yIGNvZWZmX2Nvc3QuICovCisKKyAgICAgICAgICAgIGlmICgoY3Vyck1CLT5DQlAmKDEgPDwgYjgpKSAmJiAoY29zdDggPD0gX0xVTUFfQ09FRkZfQ09TVF8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvc3Q4ID0gMDsgLy8gcmVzZXQgaXQKKworICAgICAgICAgICAgICAgIGN1cnJNQi0+Q0JQIF49ICgxIDw8IGI4KTsKKyAgICAgICAgICAgICAgICBibGtpZHggPSBibGtJZHgyYmxrWFlbYjhdWzBdOworCisgICAgICAgICAgICAgICAgY3Vyck1CLT5uel9jb2VmZltibGtpZHhdID0gMDsKKyAgICAgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmW2Jsa2lkeCsxXSA9IDA7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5uel9jb2VmZltibGtpZHgrNF0gPSAwOworICAgICAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbYmxraWR4KzVdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29zdDE2ICs9IGNvc3Q4OworCisgICAgICAgICAgICBpZiAoYjgmMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXIgLT0gODsKKyAgICAgICAgICAgICAgICBvcmc0IC09IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyICs9ICg4IC0gKHBpY1BpdGNoIDw8IDMpKTsKKyAgICAgICAgICAgICAgICBvcmc0ICs9ICg4IC0gKG9yZ1BpdGNoIDw8IDMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGFmdGVyIHRoZSB3aG9sZSBNQiwgd2UgZG8gYW5vdGhlciBjaGVjayBmb3IgY29lZmZfY29zdCAqLworICAgICAgICBpZiAoKGN1cnJNQi0+Q0JQJjB4RikgJiYgKGNvc3QxNiA8PSBfTFVNQV9NQl9DT0VGRl9DT1NUXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJNQi0+Q0JQID0gMDsgIC8vIHJlc2V0IGl0IHRvIHplcm8KKyAgICAgICAgICAgIG1lbXNldChjdXJyTUItPm56X2NvZWZmLCAwLCBzaXplb2YodWludDgpKjE2KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyB3ZSBkbyBJRENUCisgICAgICAgIE1CSW50ZXJJZGN0KHZpZGVvLCBjdXJMLCBjdXJyTUIsIHBpY1BpdGNoKTsKKworLy8gICAgICB2aWRlby0+cHJlZF9ibG9jayA9IHZpZGVvLT5wcmVkICsgMjU2OworICAgIH0KKyAgICBlbHNlICAgIC8qIEludHJhIHByZWRpY3Rpb24gKi8KKyAgICB7CisgICAgICAgIGVuY3ZpZC0+bnVtSW50cmFNQisrOworCisgICAgICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KSAvKiBkbyBwcmVkaWN0aW9uIGZvciB0aGUgd2hvbGUgbWFjcm9ibG9jayAqLworICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPkNCUCA9IDA7CisgICAgICAgICAgICAvKiBnZXQgdGhlIHByZWRpY3Rpb24gZnJvbSBlbmN2aWQtPnByZWRfaTE2ICovCisgICAgICAgICAgICBkY3RfbHVtYV8xNngxNihlbmN2aWQsIGN1ckwsIG9yZ0wpOworICAgICAgICB9CisgICAgICAgIHZpZGVvLT5wcmVkX2Jsb2NrID0gZW5jdmlkLT5wcmVkX2ljW2N1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZV07CisgICAgfQorCisgICAgLyogY2hyb21pbmFuY2UgKi8KKyAgICAvKiBub3QgbmVlZCB0byBkbyBhbnl0aGluZywgdGhlIHJlc3VsdCBpcyBpbiBlbmN2aWQtPnByZWRfaWMKKyAgICBjaHJvbWEgZGN0IG11c3QgYmUgYXdhcmUgdGhhdCBwcmVkaWN0aW9uIGJsb2NrIGNhbiBjb21lIGZyb20gZWl0aGVyIGludHJhIG9yIGludGVyLiAqLworCisgICAgZGN0X2Nocm9tYShlbmN2aWQsIGN1ckNiLCBvcmdDYiwgMCk7CisKKyAgICBkY3RfY2hyb21hKGVuY3ZpZCwgY3VyQ3IsIG9yZ0NyLCAxKTsKKworCisgICAgLyogNC4xIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGVyZSwgdmlkZW8tPm1iX3NraXBfcnVuKysgKi8KKyAgICAvKiA0LjIgaWYgY29kZWQsIGNoZWNrIGlmIHRoZXJlIGlzIGEgcnVuIG9mIHNraXBwZWQgTUIsIGVuY29kZXMgaXQsCisgICAgICAgICAgICBzZXQgdmlkZW8tPlFQeXByZXYgPSBjdXJyTUItPlFQeTsgKi8KKworICAgIC8qIDUuIHZsYyBlbmNvZGUgKi8KKworICAgIC8qIGNoZWNrIGZvciBza2lwcGVkIG1hY3JvYmxvY2ssIElOVEVSIG9ubHkgKi8KKyAgICBpZiAoIWN1cnJNQi0+bWJfaW50cmEpCisgICAgeworICAgICAgICAvKiBkZWNpZGUgd2hldGhlciB0aGlzIE1CIChmb3IgaW50ZXIgTUIpIHNob3VsZCBiZSBza2lwcGVkIGlmIHRoZXJlJ3Mgbm90aGluZyBsZWZ0LiAqLworICAgICAgICBpZiAoIWN1cnJNQi0+Q0JQICYmIGN1cnJNQi0+TnVtTWJQYXJ0ID09IDEgJiYgY3Vyck1CLT5RUHkgPT0gdmlkZW8tPlFQeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbMF1bMF0gPT0gQVZDX1ByZWRfTDAgJiYgY3Vyck1CLT5yZWZfaWR4X0wwWzBdID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTUJfQSA9ICZ2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXTsKKyAgICAgICAgICAgICAgICBNQl9CID0gJnZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdOworCisgICAgICAgICAgICAgICAgaWYgKCF2aWRlby0+bWJBdmFpbEEgfHwgIXZpZGVvLT5tYkF2YWlsQikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyTUItPm12TDBbMF0gPT0gMCkgLyogYm90aCBtdiBjb21wb25lbnRzIGFyZSB6ZXJvcy4qLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19TS0lQOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm12ZF9sMFswXVswXVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+bXZkX2wwWzBdWzBdWzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKE1CX0EtPnJlZl9pZHhfTDBbMV0gPT0gMCAmJiBNQl9BLT5tdkwwWzNdID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1CX0ItPnJlZl9pZHhfTDBbMl0gPT0gMCAmJiBNQl9CLT5tdkwwWzEyXSA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJNQi0+bXZMMFswXSA9PSAwKSAvKiBib3RoIG12IGNvbXBvbmVudHMgYXJlIHplcm9zLiovCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfU0tJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+bXZkX2wwWzBdWzBdWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+bXZkX2wwWzBdWzBdWzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+bXZkX2wwWzBdWzBdWzBdID09IDAgJiYgdmlkZW8tPm12ZF9sMFswXVswXVsxXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19TS0lQOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1NLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm1iX3NraXBfcnVuKys7CisKKyAgICAgICAgICAgICAgICAvKiBzZXQgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgICAgIC8qIG5vdCBzdXJlIHdoZXRoZXIgd2UgbmVlZCB0aGUgZm9sbG93aW5ncyAqLworICAgICAgICAgICAgICAgIGlmIChzbGljZV90eXBlID09IEFWQ19QX1NMSUNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfU0tJUDsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5NYlBhcnRXaWR0aCA9IGN1cnJNQi0+TWJQYXJ0SGVpZ2h0ID0gMTY7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbMF1bMF0gPSBBVkNfUHJlZF9MMDsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5OdW1NYlBhcnQgPSAxOworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk51bVN1Yk1iUGFydFswXSA9IGN1cnJNQi0+TnVtU3ViTWJQYXJ0WzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbMl0gPSBjdXJyTUItPk51bVN1Yk1iUGFydFszXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbMF0gPSBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzJdID0gY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFszXSA9IGN1cnJNQi0+TWJQYXJ0V2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0WzBdID0gY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFsyXSA9IGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0WzNdID0gY3Vyck1CLT5NYlBhcnRIZWlnaHQ7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX1NLSVA7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TWJQYXJ0V2lkdGggPSBjdXJyTUItPk1iUGFydEhlaWdodCA9IDg7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbMF1bMF0gPSBBVkNfRGlyZWN0OworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk51bU1iUGFydCA9IC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGZvciBza2lwcGVkIE1CLCBhbHdheXMgbG9vayBhdCB0aGUgZmlyc3QgZW50cnkgaW4gUmVmUGljTGlzdCAqLworICAgICAgICAgICAgICAgIGN1cnJNQi0+UmVmSWR4WzBdID0gY3Vyck1CLT5SZWZJZHhbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+UmVmSWR4WzJdID0gY3Vyck1CLT5SZWZJZHhbM10gPSB2aWRlby0+UmVmUGljTGlzdDBbMF0tPlJlZklkeDsKKworICAgICAgICAgICAgICAgIC8qIGRvIG5vdCByZXR1cm4geWV0LCBuZWVkIHRvIGRvIHNvbWUgY29waWVzICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogbm9uLXNraXBwZWQgTUIgKi8KKworCisgICAgLyoqKioqKioqKioqKiogU1RBUlQgRU5UUk9QWSBDT0RJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIHN0YXJ0X21iX2JpdHMgPSAzMiArIChlbmN2aWQtPmJpdHN0cmVhbS0+d3JpdGVfcG9zIDw8IDMpIC0gZW5jdmlkLT5iaXRzdHJlYW0tPmJpdF9sZWZ0OworCisgICAgLyogZW5jb2RlIG1iX3R5cGUsIG1iX3ByZWQsIHN1Yl9tYl9wcmVkLCBDQlAgKi8KKyAgICBpZiAoc2xpY2VfdHlwZSAhPSBBVkNfSV9TTElDRSAmJiBzbGljZV90eXBlICE9IEFWQ19TSV9TTElDRSAmJiBjdXJyTUItPm1iTW9kZSAhPSBBVkNfU0tJUCkKKyAgICB7CisgICAgICAgIC8vaWYoIXBwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnKSAgQUxXQVlTIHRydWUKKyAgICAgICAgeworICAgICAgICAgICAgdWVfdihzdHJlYW0sIHZpZGVvLT5tYl9za2lwX3J1bik7CisgICAgICAgICAgICB2aWRlby0+bWJfc2tpcF9ydW4gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlICE9IEFWQ19TS0lQKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gRW5jb2RlTUJIZWFkZXIoY3Vyck1CLCBlbmN2aWQpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhcnRfdGV4dF9iaXRzID0gMzIgKyAoZW5jdmlkLT5iaXRzdHJlYW0tPndyaXRlX3BvcyA8PCAzKSAtIGVuY3ZpZC0+Yml0c3RyZWFtLT5iaXRfbGVmdDsKKworICAgIC8qKioqIG5vdyBkZWNvZGluZyBwYXJ0ICoqKioqKiovCisgICAgcmVzVHlwZSA9IEFWQ19MdW1hOworCisgICAgLyogREMgdHJhbnNmb3JtIGZvciBsdW1hIEkxNiBtb2RlICovCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JMTYpCisgICAgeworICAgICAgICAvKiB2bGMgZW5jb2RlIGxldmVsL3J1biAqLworICAgICAgICBzdGF0dXMgPSBlbmNfcmVzaWR1YWxfYmxvY2soZW5jdmlkLCBBVkNfSW50cmExNkRDLCBlbmN2aWQtPm51bWNvZWZkYywgY3Vyck1CKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXNUeXBlID0gQVZDX0ludHJhMTZBQzsKKyAgICB9CisKKyAgICAvKiBWTEMgZW5jb2RpbmcgZm9yIGx1bWEgKi8KKyAgICBmb3IgKGI4ID0gMDsgYjggPCA0OyBiOCsrKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJNQi0+Q0JQJigxIDw8IGI4KSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB2bGMgZW5jb2RlIGxldmVsL3J1biAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVuY19yZXNpZHVhbF9ibG9jayhlbmN2aWQsIHJlc1R5cGUsIChiOCA8PCAyKSArIGI0LCBjdXJyTUIpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNocm9tYSAqLworICAgIGlmIChjdXJyTUItPkNCUCAmICgzIDw8IDQpKSAvKiBjaHJvbWEgREMgcmVzaWR1YWwgcHJlc2VudCAqLworICAgIHsKKyAgICAgICAgZm9yIChiOCA9IDA7IGI4IDwgMjsgYjgrKykgLyogZm9yIGlDYkNyICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHZsYyBlbmNvZGUgbGV2ZWwvcnVuICovCisgICAgICAgICAgICBzdGF0dXMgPSBlbmNfcmVzaWR1YWxfYmxvY2soZW5jdmlkLCBBVkNfQ2hyb21hREMsIGVuY3ZpZC0+bnVtY29lZmNkY1tiOF0gKyAoYjggPDwgMyksIGN1cnJNQik7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3Vyck1CLT5DQlAgJiAoMiA8PCA0KSkKKyAgICB7CisgICAgICAgIC8qIEFDIHBhcnQgKi8KKyAgICAgICAgZm9yIChiOCA9IDA7IGI4IDwgMjsgYjgrKykgLyogZm9yIGlDYkNyICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspICAvKiBmb3IgZWFjaCBibG9jayBpbnNpZGUgQ2Igb3IgQ3IgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB2bGMgZW5jb2RlIGxldmVsL3J1biAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVuY19yZXNpZHVhbF9ibG9jayhlbmN2aWQsIEFWQ19DaHJvbWFBQywgMTYgKyAoYjggPDwgMikgKyBiNCwgY3Vyck1CKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIG51bV9iaXRzID0gMzIgKyAoZW5jdmlkLT5iaXRzdHJlYW0tPndyaXRlX3BvcyA8PCAzKSAtIGVuY3ZpZC0+Yml0c3RyZWFtLT5iaXRfbGVmdDsKKworICAgIFJDUG9zdE1CKHZpZGVvLCByYXRlQ3RybCwgc3RhcnRfdGV4dF9iaXRzIC0gc3RhcnRfbWJfYml0cywKKyAgICAgICAgICAgICBudW1fYml0cyAtIHN0YXJ0X3RleHRfYml0cyk7CisKKy8vICBudW1fYml0cyAtPSBzdGFydF9tYl9iaXRzOworLy8gIGZwcmludGYoZmRlYnVnLCJNQiAjJWQ6ICVkIGJpdHNcbiIsQ3Vyck1iQWRkcixudW1fYml0cyk7CisvLyAgZmNsb3NlKGZkZWJ1Zyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogY29weSB0aGUgY29udGVudCBmcm9tIHByZWRCbG9jayBiYWNrIHRvIHRoZSByZWNvbnN0cnVjdGVkIFlVViBmcmFtZSAqLwordm9pZCBDb3B5X01CKHVpbnQ4ICpjdXJMLCB1aW50OCAqY3VyQ2IsIHVpbnQ4ICpjdXJDciwgdWludDggKnByZWRCbG9jaywgaW50IHBpY1BpdGNoKQoreworICAgIGludCBqLCBvZmZzZXQ7CisgICAgdWludDMyICpkc3QsICpkc3QyLCAqc3JjOworCisgICAgZHN0ID0gKHVpbnQzMiopY3VyTDsKKyAgICBzcmMgPSAodWludDMyKilwcmVkQmxvY2s7CisKKyAgICBvZmZzZXQgPSAocGljUGl0Y2ggLSAxNikgPj4gMjsKKworICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgIHsKKyAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgKmRzdCsrID0gKnNyYysrOworCisgICAgICAgIGRzdCArPSBvZmZzZXQ7CisgICAgfQorCisgICAgZHN0ID0gKHVpbnQzMiopY3VyQ2I7CisgICAgZHN0MiA9ICh1aW50MzIqKWN1ckNyOworICAgIG9mZnNldCA+Pj0gMTsKKworICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgeworICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgKmRzdDIrKyA9ICpzcmMrKzsKKyAgICAgICAgKmRzdDIrKyA9ICpzcmMrKzsKKworICAgICAgICBkc3QgKz0gb2Zmc2V0OworICAgICAgICBkc3QyICs9IG9mZnNldDsKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKworLyogZW5jb2RlIG1iX3R5cGUsIG1iX3ByZWQsIHN1Yl9tYl9wcmVkLCBDQlAgKi8KKy8qIGRlY2lkZSB3aGV0aGVyIHRoaXMgTUIgKGZvciBpbnRlciBNQikgc2hvdWxkIGJlIHNraXBwZWQgKi8KK0FWQ0VuY19TdGF0dXMgRW5jb2RlTUJIZWFkZXIoQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIHVpbnQgbWJfdHlwZTsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0gPSBlbmN2aWQtPmJpdHN0cmVhbTsKKworICAgIGlmIChjdXJyTUItPkNCUCA+IDQ3KSAgIC8qIGNocm9tYSBDQlAgaXMgMTEgKi8KKyAgICB7CisgICAgICAgIGN1cnJNQi0+Q0JQIC09IDE2OyAgLyogcmVtb3ZlIHRoZSA1dGggYml0IGZyb20gdGhlIHJpZ2h0ICovCisgICAgfQorCisgICAgbWJfdHlwZSA9IEludGVycHJldE1CVHlwZShjdXJyTUIsIHZpZGVvLT5zbGljZV90eXBlKTsKKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBtYl90eXBlKTsKKworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDggfHwgY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4cmVmMCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHN1Yl9tYl9wcmVkKHZpZGVvLCBjdXJyTUIsIHN0cmVhbSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IG1iX3ByZWQodmlkZW8sIGN1cnJNQiwgc3RyZWFtKSA7CisgICAgfQorCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlICE9IEFWQ19JMTYpCisgICAgeworICAgICAgICAvKiBkZWNvZGUgY29kZWRfYmxvY2tfcGF0dGVybiAqLworICAgICAgICBzdGF0dXMgPSBFbmNvZGVDQlAoY3Vyck1CLCBzdHJlYW0pOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBjdXJyTUItPm1iX3FwX2RlbHRhID0gY3Vyck1CLT5RUHkgLSB2aWRlby0+UVB5cHJldiAqLworICAgIGlmIChjdXJyTUItPkNCUCA+IDAgfHwgY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBjdXJyTUItPlFQeSAtIHZpZGVvLT5RUHkpOworICAgICAgICB2aWRlby0+UVB5ID0gY3Vyck1CLT5RUHk7IC8qID0gKHZpZGVvLT5RUHlwcmV2ICsgY3Vyck1CLT5tYl9xcF9kZWx0YSArIDUyKSU1MjsgKi8KKyAgICAgICAgLy8gbm8gbmVlZCB2aWRlby0+UVBjID0gY3Vyck1CLT5RUGM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChjdXJyTUItPlFQeSAhPSB2aWRlby0+UVB5KSAvLyBjdXJyZW50IFFQIGlzIG5vdCB0aGUgc2FtZSBhcyBwcmV2aW91cyBRUAorICAgICAgICB7CisgICAgICAgICAgICAvKiByZXN0b3JlIHRoZXNlIHZhbHVlcyAqLworICAgICAgICAgICAgUkNSZXN0b3JlUVAoY3Vyck1CLCB2aWRlbywgZW5jdmlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyogaW5wdXRzIGFyZSBtYk1vZGUsIG1iX2ludHJhLCBpMTZNb2RlLCBDQlAsIE51bU1iUGFydCwgTWJQYXJ0V2lkdGgsIE1iUGFydEhlaWdodCAqLwordWludCBJbnRlcnByZXRNQlR5cGUoQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgc2xpY2VfdHlwZSkKK3sKKyAgICBpbnQgQ0JQX2Nocm9tOworICAgIGludCBtYl90eXBlOy8vIHBhcnQxLCBwYXJ0MiwgcGFydDM7CisvLyAgY29uc3Qgc3RhdGljIGludCBNYXBQYXJ0czJUeXBlWzJdWzNdWzNdPXt7ezQsOCwxMn0sezEwLDYsMTR9LHsxNiwxOCwyMH19LAorLy8gIHt7NSw5LDEzfSx7MTEsNywxNX0sezE3LDE5LDIxfX19OworCisgICAgaWYgKGN1cnJNQi0+bWJfaW50cmEpCisgICAgeworICAgICAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0k0KQorICAgICAgICB7CisgICAgICAgICAgICBtYl90eXBlID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgICAgICB7CisgICAgICAgICAgICBDQlBfY2hyb20gPSAoY3Vyck1CLT5DQlAgJiAweDMwKTsKKyAgICAgICAgICAgIGlmIChjdXJyTUItPkNCUCYweEYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5DQlAgfD0gMHhGOyAgLyogZWl0aGVyIDB4MCBvciAweEYgKi8KKyAgICAgICAgICAgICAgICBtYl90eXBlID0gMTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWJfdHlwZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYl90eXBlICs9IChDQlBfY2hyb20gPj4gMikgKyBjdXJyTUItPmkxNk1vZGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBpZihjdXJyTUItPm1iTW9kZSA9PSBBVkNfSV9QQ00pICovCisgICAgICAgIHsKKyAgICAgICAgICAgIG1iX3R5cGUgPSAyNTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyAgLyogUC1NQiAqLy8qIG5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIGVudW0gQVZDTUJNb2RlIGNhbm5vdCBiZSBjaGFuZ2VkCisgICAgICAgIHNpbmNlIHdlIHVzZSBpdCBoZXJlLiAqLworICAgICAgICBtYl90eXBlID0gY3Vyck1CLT5tYk1vZGUgLSBBVkNfUDE2OworICAgIH0KKworICAgIGlmIChzbGljZV90eXBlID09IEFWQ19QX1NMSUNFKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJNQi0+bWJfaW50cmEpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1iX3R5cGUgKz0gNTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBmb2xsb3dpbmcgY29kZXMgaGF2ZSBub3QgYmVlbiB0ZXN0ZWQgeWV0LCBub3QgbmVlZGVkLgorICAgIC8qICBlbHNlIGlmKHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGN1cnJNQi0+bWJNb2RlID09IEFWQ19CRGlyZWN0MTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWJfdHlwZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWJfdHlwZSA9IGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbMF1bMF0gKyAxOyAvLyAxIG9yIDIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSAyNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4cmVmMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYl90eXBlID0gMjc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFydDEgPSBjdXJyTUItPm1iTW9kZSAtIEFWQ19QMTZ4ODsKKyAgICAgICAgICAgICAgICBwYXJ0MiA9IGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbMF1bMF07CisgICAgICAgICAgICAgICAgcGFydDMgPSBjdXJyTUItPk1CUGFydFByZWRNb2RlWzFdWzBdOworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSBNYXBQYXJ0czJUeXBlW3BhcnQxXVtwYXJ0Ml1bcGFydDNdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoc2xpY2VfdHlwZSA9PSBBVkNfU0lfU0xJQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1iX3R5cGUrKzsKKyAgICAgICAgfQorICAgICovCisgICAgcmV0dXJuICh1aW50KW1iX3R5cGU7Cit9CisKKy8vY29uc3Qgc3RhdGljIGludCBtYlBhcnQycmFzdGVyWzNdWzRdID0ge3swLDAsMCwwfSx7MSwxLDAsMH0sezEsMCwxLDB9fTsKKworLyogc2VlIHN1YmNsYXVzZSA3LjMuNS4xICovCitBVkNFbmNfU3RhdHVzIG1iX3ByZWQoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIGludCBtYlBhcnRJZHg7CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIGludCBtYXhfcmVmX2lkeDsKKyAgICB1aW50IGNvZGU7CisKKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0k0IHx8IGN1cnJNQi0+bWJNb2RlID09IEFWQ19JMTYpCisgICAgeworICAgICAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0k0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBwZXJmb3JtIHByZWRpY3Rpb24gdG8gZ2V0IHRoZSBhY3R1YWwgaW50cmEgNHg0IHByZWQgbW9kZSAqLworICAgICAgICAgICAgRW5jb2RlSW50cmE0eDRNb2RlKHZpZGVvLCBjdXJyTUIsIHN0cmVhbSk7CisgICAgICAgICAgICAvKiBvdXRwdXQgd2lsbCBiZSBpbiBjdXJyTUItPmk0TW9kZVs0XVs0XSAqLworICAgICAgICB9CisKKyAgICAgICAgLyogYXNzdW1lIGFscmVhZHkgc2V0IGZyb20gTUJQcmVkaWN0aW9uKCkgKi8KKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbMF1bMF0gIT0gQVZDX0RpcmVjdCkKKyAgICB7CisKKyAgICAgICAgbWVtc2V0KGN1cnJNQi0+cmVmX2lkeF9MMCwgMCwgc2l6ZW9mKGludDE2KSo0KTsKKworICAgICAgICAvKiBzZWUgc3ViY2xhdXNlIDcuNC41LjEgZm9yIHRoZSByYW5nZSBvZiByZWZfaWR4X2xYICovCisgICAgICAgIG1heF9yZWZfaWR4ID0gc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czE7CisgICAgICAgIC8qICAgICAgaWYodmlkZW8tPk1iYWZmRnJhbWVGbGFnICYmIGN1cnJNQi0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgbWF4X3JlZl9pZHggPSAyKnNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICsgMTsKKyAgICAgICAgKi8KKyAgICAgICAgLyogZGVjb2RlIHJlZiBpbmRleCBmb3IgTDAgKi8KKyAgICAgICAgaWYgKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCBjdXJyTUItPk51bU1iUGFydDsgbWJQYXJ0SWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKC8qKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxPjAgfHwgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKSAmJiovCisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbbWJQYXJ0SWR4XVswXSAhPSBBVkNfUHJlZF9MMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBjdXJyTUItPnJlZl9pZHhfTDBbbWJQYXJ0SWR4XTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGVfdihzdHJlYW0sIGNvZGUsIG1heF9yZWZfaWR4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBzZWUgc3ViY2xhdXNlIDcuNC41LjEgZm9yIHRoZSByYW5nZSBvZiByZWZfaWR4X2xYICovCisgICAgICAgIG1heF9yZWZfaWR4ID0gc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7CisgICAgICAgIC8qICAgICAgaWYodmlkZW8tPk1iYWZmRnJhbWVGbGFnICYmIGN1cnJNQi0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgbWF4X3JlZl9pZHggPSAyKnNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICsgMTsKKyAgICAgICAgKi8KKyAgICAgICAgLyogZGVjb2RlIHJlZiBpbmRleCBmb3IgTDEgKi8KKyAgICAgICAgaWYgKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCBjdXJyTUItPk51bU1iUGFydDsgbWJQYXJ0SWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKC8qKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxPjAgfHwgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKSAmJiovCisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbbWJQYXJ0SWR4XVswXSAhPSBBVkNfUHJlZF9MMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRlX3Yoc3RyZWFtLCBjdXJyTUItPnJlZl9pZHhfTDFbbWJQYXJ0SWR4XSwgbWF4X3JlZl9pZHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGVuY29kZSBtdmRfbDAgKi8KKyAgICAgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCBjdXJyTUItPk51bU1iUGFydDsgbWJQYXJ0SWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDBbbWJQYXJ0SWR4XVswXVswXSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDBbbWJQYXJ0SWR4XVswXVsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogZW5jb2RlIG12ZF9sMSAqLworICAgICAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IGN1cnJNQi0+TnVtTWJQYXJ0OyBtYlBhcnRJZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbbWJQYXJ0SWR4XVswXSAhPSBBVkNfUHJlZF9MMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgdmlkZW8tPm12ZF9sMVttYlBhcnRJZHhdWzBdWzBdKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgdmlkZW8tPm12ZF9sMVttYlBhcnRJZHhdWzBdWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIHNlZSBzdWJjbGF1c2UgNy4zLjUuMiAqLworQVZDRW5jX1N0YXR1cyBzdWJfbWJfcHJlZChBVkNDb21tb25PYmogKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgaW50IG1iUGFydElkeCwgc3ViTWJQYXJ0SWR4OworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICB1aW50IG1heF9yZWZfaWR4OworICAgIHVpbnQgc2xpY2VfdHlwZSA9IHZpZGVvLT5zbGljZV90eXBlOworICAgIHVpbnQgc3ViX21iX3R5cGVbNF07CisKKyAgICAvKiB0aGlzIHNob3VsZCBtb3ZlIHNvbWV3aGVyZSBlbHNlIHdoZXJlIHdlIGRvbid0IGhhdmUgdG8gbWFrZSB0aGlzIGNoZWNrICovCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOHJlZjApCisgICAgeworICAgICAgICBtZW1zZXQoY3Vyck1CLT5yZWZfaWR4X0wwLCAwLCBzaXplb2YoaW50MTYpKjQpOworICAgIH0KKworICAgIC8qIHdlIGhhdmUgdG8gY2hlY2sgdGhlIHZhbHVlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgdmFsaWQgICovCisgICAgLyogYXNzaWduIHZhbHVlcyB0byBjdXJyTUItPnN1Yl9tYl90eXBlW10gKi8KKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkKKyAgICB7CisgICAgICAgIEludGVycHJldFN1Yk1CVHlwZVAoY3Vyck1CLCBzdWJfbWJfdHlwZSk7CisgICAgfQorICAgIC8qIG5vIG5lZWQgdG8gY2hlY2sgZm9yIEItc2xpY2UKKyAgICAgICAgZWxzZSBpZihzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKQorICAgICAgICB7CisgICAgICAgICAgICBJbnRlcnByZXRTdWJNQlR5cGVCKGN1cnJNQixzdWJfbWJfdHlwZSk7CisgICAgICAgIH0qLworCisgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCA0OyBtYlBhcnRJZHgrKykKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzdWJfbWJfdHlwZVttYlBhcnRJZHhdKTsKKyAgICB9CisKKyAgICAvKiBzZWUgc3ViY2xhdXNlIDcuNC41LjEgZm9yIHRoZSByYW5nZSBvZiByZWZfaWR4X2xYICovCisgICAgbWF4X3JlZl9pZHggPSBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsKKyAgICAvKiAgaWYodmlkZW8tPk1iYWZmRnJhbWVGbGFnICYmIGN1cnJNQi0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZykKKyAgICAgICAgICAgIG1heF9yZWZfaWR4ID0gMipzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSArIDE7ICovCisKKyAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IDQ7IG1iUGFydElkeCsrKQorICAgIHsKKyAgICAgICAgaWYgKChzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA+IDAgLyp8fCBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcqLykgJiYKKyAgICAgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSAhPSBBVkNfUDhyZWYwICYmIC8qY3Vyck1CLT5zdWJNYk1vZGVbbWJQYXJ0SWR4XSE9QVZDX0JEaXJlY3Q4ICYmKi8KKyAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHRlX3Yoc3RyZWFtLCBjdXJyTUItPnJlZl9pZHhfTDBbbWJQYXJ0SWR4XSwgbWF4X3JlZl9pZHgpOworICAgICAgICB9CisgICAgICAgIC8qIHVzZWQgaW4gZGVibG9ja2luZyAqLworICAgICAgICBjdXJyTUItPlJlZklkeFttYlBhcnRJZHhdID0gdmlkZW8tPlJlZlBpY0xpc3QwW2N1cnJNQi0+cmVmX2lkeF9MMFttYlBhcnRJZHhdXS0+UmVmSWR4OworICAgIH0KKyAgICAvKiBzZWUgc3ViY2xhdXNlIDcuNC41LjEgZm9yIHRoZSByYW5nZSBvZiByZWZfaWR4X2xYICovCisgICAgbWF4X3JlZl9pZHggPSBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMTsKKyAgICAvKiAgaWYodmlkZW8tPk1iYWZmRnJhbWVGbGFnICYmIGN1cnJNQi0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZykKKyAgICAgICAgICAgIG1heF9yZWZfaWR4ID0gMipzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSArIDE7Ki8KKworICAgIGlmIChzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSA+IDApCisgICAgeworICAgICAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IDQ7IG1iUGFydElkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoLyooc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE+MCB8fCBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpICYmKi8KKyAgICAgICAgICAgICAgICAvKmN1cnJNQi0+c3ViTWJNb2RlW21iUGFydElkeF0hPUFWQ19CRGlyZWN0OCAmJiovCisgICAgICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRlX3Yoc3RyZWFtLCBjdXJyTUItPnJlZl9pZHhfTDFbbWJQYXJ0SWR4XSwgbWF4X3JlZl9pZHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCA0OyBtYlBhcnRJZHgrKykKKyAgICB7CisgICAgICAgIGlmICgvKmN1cnJNQi0+c3ViTWJNb2RlW21iUGFydElkeF0hPUFWQ19CRGlyZWN0OCAmJiovCisgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoc3ViTWJQYXJ0SWR4ID0gMDsgc3ViTWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1TdWJNYlBhcnRbbWJQYXJ0SWR4XTsgc3ViTWJQYXJ0SWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDBbbWJQYXJ0SWR4XVtzdWJNYlBhcnRJZHhdWzBdKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgdmlkZW8tPm12ZF9sMFttYlBhcnRJZHhdW3N1Yk1iUGFydElkeF1bMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCA0OyBtYlBhcnRJZHgrKykKKyAgICB7CisgICAgICAgIGlmICgvKmN1cnJNQi0+c3ViTWJNb2RlW21iUGFydElkeF0hPUFWQ19CRGlyZWN0OCAmJiovCisgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoc3ViTWJQYXJ0SWR4ID0gMDsgc3ViTWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1TdWJNYlBhcnRbbWJQYXJ0SWR4XTsgc3ViTWJQYXJ0SWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDFbbWJQYXJ0SWR4XVtzdWJNYlBhcnRJZHhdWzBdKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgdmlkZW8tPm12ZF9sMVttYlBhcnRJZHhdW3N1Yk1iUGFydElkeF1bMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogaW5wdXQgaXMgbWJsb2NrLT5zdWJfbWJfdHlwZVtdICovCit2b2lkIEludGVycHJldFN1Yk1CVHlwZVAoQVZDTWFjcm9ibG9jayAqbWJsb2NrLCB1aW50ICpzdWJfbWJfdHlwZSkKK3sKKyAgICBpbnQgaTsKKyAgICAvKiBzZWUgZW51bSBBVkNNQlR5cGUgZGVjbGFyYXRpb24gKi8KKyAgICAvKmNvbnN0IHN0YXRpYyBBVkNTdWJNQk1vZGUgbWFwMnN1Yk1iTW9kZVs0XSA9IHtBVkNfOHg4LEFWQ184eDQsQVZDXzR4OCxBVkNfNHg0fTsKKyAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJzdWJQYXJ0V2lkdGhbNF0gPSB7OCw4LDQsNH07CisgICAgY29uc3Qgc3RhdGljIGludCBtYXAyc3ViUGFydEhlaWdodFs0XSA9IHs4LDQsOCw0fTsKKyAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJudW1TdWJQYXJ0WzRdID0gezEsMiwyLDR9OyovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNCA7IGkrKykKKyAgICB7CisgICAgICAgIHN1Yl9tYl90eXBlW2ldID0gbWJsb2NrLT5zdWJNYk1vZGVbaV0gLSBBVkNfOHg4OworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgSW50ZXJwcmV0U3ViTUJUeXBlQihBVkNNYWNyb2Jsb2NrICptYmxvY2ssIHVpbnQgKnN1Yl9tYl90eXBlKQoreworICAgIGludCBpOworICAgIC8qIHNlZSBlbnVtIEFWQ01CVHlwZSBkZWNsYXJhdGlvbiAqLworICAgIC8qICBjb25zdCBzdGF0aWMgQVZDU3ViTUJNb2RlIG1hcDJzdWJNYk1vZGVbMTNdID0ge0FWQ19CRGlyZWN0OCxBVkNfOHg4LEFWQ184eDgsCisgICAgICAgICAgICBBVkNfOHg4LEFWQ184eDQsQVZDXzR4OCxBVkNfOHg0LEFWQ180eDgsQVZDXzh4NCxBVkNfNHg4LEFWQ180eDQsQVZDXzR4NCxBVkNfNHg0fTsKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBtYXAyc3ViUGFydFdpZHRoWzEzXSA9IHs0LDgsOCw4LDgsNCw4LDQsOCw0LDQsNCw0fTsKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBtYXAyc3ViUGFydEhlaWdodFsxM10gPSB7NCw4LDgsOCw0LDgsNCw4LDQsOCw0LDQsNH07CisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMm51bVN1YlBhcnRbMTNdID0gezQsMSwxLDEsMiwyLDIsMiwyLDIsNCw0LDR9OworICAgICAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJwcmVkTW9kZVsxM10gPSB7MywwLDEsMiwwLDAsMSwxLDIsMiwwLDEsMn07Ki8KKworICAgIGZvciAoaSA9IDA7IGkgPCA0IDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG1ibG9jay0+c3ViTWJNb2RlW2ldID09IEFWQ19CRGlyZWN0OCkKKyAgICAgICAgeworICAgICAgICAgICAgc3ViX21iX3R5cGVbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1ibG9jay0+c3ViTWJNb2RlW2ldID09IEFWQ184eDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1Yl9tYl90eXBlW2ldID0gMSArIG1ibG9jay0+TUJQYXJ0UHJlZE1vZGVbaV1bMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobWJsb2NrLT5zdWJNYk1vZGVbaV0gPT0gQVZDXzR4NCkKKyAgICAgICAgeworICAgICAgICAgICAgc3ViX21iX3R5cGVbaV0gPSAxMCArIG1ibG9jay0+TUJQYXJ0UHJlZE1vZGVbaV1bMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdWJfbWJfdHlwZVtpXSA9IDQgKyAobWJsb2NrLT5NQlBhcnRQcmVkTW9kZVtpXVswXSA8PCAxKSArIChtYmxvY2stPnN1Yk1iTW9kZVtpXSAtIEFWQ184eDQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyogc2VlIHN1YmNsYXVzZSA4LjMuMSAqLworQVZDRW5jX1N0YXR1cyBFbmNvZGVJbnRyYTR4NE1vZGUoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBpbnQgaW50cmE0eDRQcmVkTW9kZUEgPSAwOworICAgIGludCBpbnRyYTR4NFByZWRNb2RlQiwgcHJlZEludHJhNHg0UHJlZE1vZGU7CisgICAgaW50IGNvbXBvbmVudCwgU3ViQmxvY2tfaW5keCwgYmxvY2tfeCwgYmxvY2tfeTsKKyAgICBpbnQgZGNPbmx5UHJlZGljdGlvbkZsYWc7CisgICAgdWludCAgICBmbGFnOworICAgIGludCAgICAgcmVtID0gMDsKKyAgICBpbnQgICAgIG1vZGU7CisgICAgaW50IGJpbmR4ID0gMDsKKworICAgIGZvciAoY29tcG9uZW50ID0gMDsgY29tcG9uZW50IDwgNDsgY29tcG9uZW50KyspIC8qIHBhcnRpdGlvbiBpbmRleCAqLworICAgIHsKKyAgICAgICAgYmxvY2tfeCA9ICgoY29tcG9uZW50ICYgMSkgPDwgMSk7CisgICAgICAgIGJsb2NrX3kgPSAoKGNvbXBvbmVudCA+PiAxKSA8PCAxKTsKKworICAgICAgICBmb3IgKFN1YkJsb2NrX2luZHggPSAwOyBTdWJCbG9ja19pbmR4IDwgNDsgU3ViQmxvY2tfaW5keCsrKSAvKiBzdWItcGFydGl0aW9uIGluZGV4ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjT25seVByZWRpY3Rpb25GbGFnID0gMDsKKyAgICAgICAgICAgIGlmIChibG9ja194ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IGN1cnJNQi0+aTRNb2RlWyhibG9ja195IDw8IDIpICsgYmxvY2tfeCAtIDEgXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckFdLm1iTW9kZSA9PSBBVkNfSTQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0uaTRNb2RlWyhibG9ja195IDw8IDIpICsgM107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkY09ubHlQcmVkaWN0aW9uRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYmxvY2tfeSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUIgPSBjdXJyTUItPmk0TW9kZVsoKGJsb2NrX3ktMSkgPDwgMikgKyBibG9ja194XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdLm1iTW9kZSA9PSBBVkNfSTQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVCID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0uaTRNb2RlWygzIDw8IDIpICsgYmxvY2tfeF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQiA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkY09ubHlQcmVkaWN0aW9uRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGNPbmx5UHJlZGljdGlvbkZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSBpbnRyYTR4NFByZWRNb2RlQiA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJlZEludHJhNHg0UHJlZE1vZGUgPSBBVkNfTUlOKGludHJhNHg0UHJlZE1vZGVBLCBpbnRyYTR4NFByZWRNb2RlQik7CisKKyAgICAgICAgICAgIGZsYWcgPSAwOworICAgICAgICAgICAgbW9kZSA9IGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XTsKKworICAgICAgICAgICAgaWYgKG1vZGUgPT0gKEFWQ0ludHJhNHg0UHJlZE1vZGUpcHJlZEludHJhNHg0UHJlZE1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtb2RlIDwgcHJlZEludHJhNHg0UHJlZE1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVtID0gbW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW0gPSBtb2RlIC0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgZmxhZyk7CisKKyAgICAgICAgICAgIGlmICghZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzLCByZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiaW5keCsrOworICAgICAgICAgICAgYmxvY2tfeSArPSAoU3ViQmxvY2tfaW5keCAmIDEpIDsKKyAgICAgICAgICAgIGJsb2NrX3ggKz0gKDEgLSAyICogKFN1YkJsb2NrX2luZHggJiAxKSkgOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMmU3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAKQEAgLTAsMCArMSwzMzYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorCisvKioKK1NlZSBhbGdvcml0aG0gaW4gc3ViY2xhdXNlIDkuMSwgVGFibGUgOS0xLCBUYWJsZSA5LTIuICovCitBVkNFbmNfU3RhdHVzIHVlX3YoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgY29kZU51bSkKK3sKKyAgICBpZiAoQVZDRU5DX1NVQ0NFU1MgIT0gU2V0RUdCaXRzdHJpbmcoYml0c3RyZWFtLCBjb2RlTnVtKSkKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKioKK1NlZSBzdWJjbGF1c2UgOS4xLjEsIFRhYmxlIDktMyAqLworQVZDRW5jX1N0YXR1cyAgc2VfdihBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgaW50IHZhbHVlKQoreworICAgIHVpbnQgY29kZU51bTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKworICAgIGlmICh2YWx1ZSA8PSAwKQorICAgIHsKKyAgICAgICAgY29kZU51bSA9IC12YWx1ZSAqIDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNvZGVOdW0gPSB2YWx1ZSAqIDIgLSAxOworICAgIH0KKworICAgIHN0YXR1cyA9IHVlX3YoYml0c3RyZWFtLCBjb2RlTnVtKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0FWQ0VuY19TdGF0dXMgdGVfdihBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgdWludCB2YWx1ZSwgdWludCByYW5nZSkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKworICAgIGlmIChyYW5nZSA+IDEpCisgICAgeworICAgICAgICByZXR1cm4gdWVfdihiaXRzdHJlYW0sIHZhbHVlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KGJpdHN0cmVhbSwgMSAtIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9Cit9CisKKy8qKgorU2VlIHN1YmNsYXVzZSA5LjEsIFRhYmxlIDktMSwgOS0yLiAqLworLy8gY29tcHV0ZSBsZWFkaW5nWmVyb3MgYW5kIGluZm9yYml0cworLy9jb2RlTnVtID0gKDE8PGxlYWRpbmdaZXJvcyktMStpbmZvYml0czsKK0FWQ0VuY19TdGF0dXMgU2V0RUdCaXRzdHJpbmcoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgY29kZU51bSkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICBpbnQgbGVhZGluZ1plcm9zOworICAgIGludCBpbmZvYml0czsKKworICAgIGlmICghY29kZU51bSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChiaXRzdHJlYW0sIDEpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBsZWFkaW5nWmVyb3MgYW5kIGluZm9iaXRzICovCisgICAgbGVhZGluZ1plcm9zID0gMTsKKyAgICB3aGlsZSAoKHVpbnQpKDEgPDwgbGVhZGluZ1plcm9zKSA8IGNvZGVOdW0gKyAyKQorICAgIHsKKyAgICAgICAgbGVhZGluZ1plcm9zKys7CisgICAgfQorICAgIGxlYWRpbmdaZXJvcy0tOworICAgIGluZm9iaXRzID0gY29kZU51bSAtICgxIDw8IGxlYWRpbmdaZXJvcykgKyAxOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKGJpdHN0cmVhbSwgbGVhZGluZ1plcm9zLCAwKTsKKyAgICBpbmZvYml0cyB8PSAoMSA8PCBsZWFkaW5nWmVyb3MpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhiaXRzdHJlYW0sIGxlYWRpbmdaZXJvcyArIDEsIGluZm9iaXRzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBzZWUgVGFibGUgOS00IGFzc2lnbm1lbnQgb2YgY29kZU51bSB0byB2YWx1ZXMgb2YgY29kZWRfYmxvY2tfcGF0dGVybi4gKi8KK2NvbnN0IHN0YXRpYyB1aW50OCBNYXBDQlAyY29kZVs0OF1bMl0gPQoreworICAgIHszLCAwfSwgezI5LCAyfSwgezMwLCAzfSwgezE3LCA3fSwgezMxLCA0fSwgezE4LCA4fSwgezM3LCAxN30sIHs4LCAxM30sIHszMiwgNX0sIHszOCwgMTh9LCB7MTksIDl9LCB7OSwgMTR9LAorICAgIHsyMCwgMTB9LCB7MTAsIDE1fSwgezExLCAxNn0sIHsyLCAxMX0sIHsxNiwgMX0sIHszMywgMzJ9LCB7MzQsIDMzfSwgezIxLCAzNn0sIHszNSwgMzR9LCB7MjIsIDM3fSwgezM5LCA0NH0sIHs0LCA0MH0sCisgICAgezM2LCAzNX0sIHs0MCwgNDV9LCB7MjMsIDM4fSwgezUsIDQxfSwgezI0LCAzOX0sIHs2LCA0Mn0sIHs3LCA0M30sIHsxLCAxOX0sIHs0MSwgNn0sIHs0MiwgMjR9LCB7NDMsIDI1fSwgezI1LCAyMH0sCisgICAgezQ0LCAyNn0sIHsyNiwgMjF9LCB7NDYsIDQ2fSwgezEyLCAyOH0sIHs0NSwgMjd9LCB7NDcsIDQ3fSwgezI3LCAyMn0sIHsxMywgMjl9LCB7MjgsIDIzfSwgezE0LCAzMH0sIHsxNSwgMzF9LCB7MCwgMTJ9Cit9OworCitBVkNFbmNfU3RhdHVzIEVuY29kZUNCUChBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworICAgIHVpbnQgY29kZU51bTsKKworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTQpCisgICAgeworICAgICAgICBjb2RlTnVtID0gTWFwQ0JQMmNvZGVbY3Vyck1CLT5DQlBdWzBdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb2RlTnVtID0gTWFwQ0JQMmNvZGVbY3Vyck1CLT5DQlBdWzFdOworICAgIH0KKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBjb2RlTnVtKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0FWQ0VuY19TdGF0dXMgY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lcyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IFRyYWlsaW5nT25lcywgaW50IFRvdGFsQ29lZmYsIGludCBuQykKK3sKKyAgICBjb25zdCBzdGF0aWMgdWludDggdG90Q29lZmZUcmFpbE9uZVszXVs0XVsxN11bMl0gPQorICAgIHsKKyAgICAgICAgeyAgIC8vIDA3MDIKKyAgICAgICAgICAgIHt7MSwgMX0sIHs2LCA1fSwgezgsIDd9LCB7OSwgN30sIHsxMCwgN30sIHsxMSwgN30sIHsxMywgMTV9LCB7MTMsIDExfSwgezEzLCA4fSwgezE0LCAxNX0sIHsxNCwgMTF9LCB7MTUsIDE1fSwgezE1LCAxMX0sIHsxNiwgMTV9LCB7MTYsIDExfSwgezE2LCA3fSwgezE2LCA0fX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7MiwgMX0sIHs2LCA0fSwgezgsIDZ9LCB7OSwgNn0sIHsxMCwgNn0sIHsxMSwgNn0sIHsxMywgMTR9LCB7MTMsIDEwfSwgezE0LCAxNH0sIHsxNCwgMTB9LCB7MTUsIDE0fSwgezE1LCAxMH0sIHsxNSwgMX0sIHsxNiwgMTR9LCB7MTYsIDEwfSwgezE2LCA2fX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7MCwgMH0sIHszLCAxfSwgezcsIDV9LCB7OCwgNX0sIHs5LCA1fSwgezEwLCA1fSwgezExLCA1fSwgezEzLCAxM30sIHsxMywgOX0sIHsxNCwgMTN9LCB7MTQsIDl9LCB7MTUsIDEzfSwgezE1LCA5fSwgezE2LCAxM30sIHsxNiwgOX0sIHsxNiwgNX19LAorICAgICAgICAgICAge3swLCAwfSwgezAsIDB9LCB7MCwgMH0sIHs1LCAzfSwgezYsIDN9LCB7NywgNH0sIHs4LCA0fSwgezksIDR9LCB7MTAsIDR9LCB7MTEsIDR9LCB7MTMsIDEyfSwgezE0LCAxMn0sIHsxNCwgOH0sIHsxNSwgMTJ9LCB7MTUsIDh9LCB7MTYsIDEyfSwgezE2LCA4fX0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHt7MiwgM30sIHs2LCAxMX0sIHs2LCA3fSwgezcsIDd9LCB7OCwgN30sIHs4LCA0fSwgezksIDd9LCB7MTEsIDE1fSwgezExLCAxMX0sIHsxMiwgMTV9LCB7MTIsIDExfSwgezEyLCA4fSwgezEzLCAxNX0sIHsxMywgMTF9LCB7MTMsIDd9LCB7MTQsIDl9LCB7MTQsIDd9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHsyLCAyfSwgezUsIDd9LCB7NiwgMTB9LCB7NiwgNn0sIHs3LCA2fSwgezgsIDZ9LCB7OSwgNn0sIHsxMSwgMTR9LCB7MTEsIDEwfSwgezEyLCAxNH0sIHsxMiwgMTB9LCB7MTMsIDE0fSwgezEzLCAxMH0sIHsxNCwgMTF9LCB7MTQsIDh9LCB7MTQsIDZ9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHswLCAwfSwgezMsIDN9LCB7NiwgOX0sIHs2LCA1fSwgezcsIDV9LCB7OCwgNX0sIHs5LCA1fSwgezExLCAxM30sIHsxMSwgOX0sIHsxMiwgMTN9LCB7MTIsIDl9LCB7MTMsIDEzfSwgezEzLCA5fSwgezEzLCA2fSwgezE0LCAxMH0sIHsxNCwgNX19LAorICAgICAgICAgICAge3swLCAwfSwgezAsIDB9LCB7MCwgMH0sIHs0LCA1fSwgezQsIDR9LCB7NSwgNn0sIHs2LCA4fSwgezYsIDR9LCB7NywgNH0sIHs5LCA0fSwgezExLCAxMn0sIHsxMSwgOH0sIHsxMiwgMTJ9LCB7MTMsIDEyfSwgezEzLCA4fSwgezEzLCAxfSwgezE0LCA0fX0sCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHt7NCwgMTV9LCB7NiwgMTV9LCB7NiwgMTF9LCB7NiwgOH0sIHs3LCAxNX0sIHs3LCAxMX0sIHs3LCA5fSwgezcsIDh9LCB7OCwgMTV9LCB7OCwgMTF9LCB7OSwgMTV9LCB7OSwgMTF9LCB7OSwgOH0sIHsxMCwgMTN9LCB7MTAsIDl9LCB7MTAsIDV9LCB7MTAsIDF9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHs0LCAxNH0sIHs1LCAxNX0sIHs1LCAxMn0sIHs1LCAxMH0sIHs1LCA4fSwgezYsIDE0fSwgezYsIDEwfSwgezcsIDE0fSwgezgsIDE0fSwgezgsIDEwfSwgezksIDE0fSwgezksIDEwfSwgezksIDd9LCB7MTAsIDEyfSwgezEwLCA4fSwgezEwLCA0fX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7MCwgMH0sIHs0LCAxM30sIHs1LCAxNH0sIHs1LCAxMX0sIHs1LCA5fSwgezYsIDEzfSwgezYsIDl9LCB7NywgMTN9LCB7NywgMTB9LCB7OCwgMTN9LCB7OCwgOX0sIHs5LCAxM30sIHs5LCA5fSwgezEwLCAxMX0sIHsxMCwgN30sIHsxMCwgM319LAorICAgICAgICAgICAge3swLCAwfSwgezAsIDB9LCB7MCwgMH0sIHs0LCAxMn0sIHs0LCAxMX0sIHs0LCAxMH0sIHs0LCA5fSwgezQsIDh9LCB7NSwgMTN9LCB7NiwgMTJ9LCB7NywgMTJ9LCB7OCwgMTJ9LCB7OCwgOH0sIHs5LCAxMn0sIHsxMCwgMTB9LCB7MTAsIDZ9LCB7MTAsIDJ9fQorICAgICAgICB9CisgICAgfTsKKworCisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICB1aW50IGNvZGUsIGxlbjsKKyAgICBpbnQgdmxjbnVtOworCisgICAgaWYgKFRyYWlsaW5nT25lcyA+IDMpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX1RSQUlMSU5HT05FU19GQUlMOworICAgIH0KKworICAgIGlmIChuQyA+PSA4KQorICAgIHsKKyAgICAgICAgaWYgKFRvdGFsQ29lZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAoKFRvdGFsQ29lZmYgLSAxKSA8PCAyKSB8IChUcmFpbGluZ09uZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY29kZSA9IDM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgNiwgY29kZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChuQyA8IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZsY251bSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobkMgPCA0KQorICAgICAgICB7CisgICAgICAgICAgICB2bGNudW0gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmxjbnVtID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IHRvdENvZWZmVHJhaWxPbmVbdmxjbnVtXVtUcmFpbGluZ09uZXNdW1RvdGFsQ29lZmZdWzBdOworICAgICAgICBjb2RlID0gdG90Q29lZmZUcmFpbE9uZVt2bGNudW1dW1RyYWlsaW5nT25lc11bVG90YWxDb2VmZl1bMV07CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIGxlbiwgY29kZSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworQVZDRW5jX1N0YXR1cyBjZV9Ub3RhbENvZWZmVHJhaWxpbmdPbmVzQ2hyb21hREMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBUcmFpbGluZ09uZXMsIGludCBUb3RhbENvZWZmKQoreworICAgIGNvbnN0IHN0YXRpYyB1aW50OCB0b3RDb2VmZlRyYWlsT25lQ2hyb21bNF1bNV1bMl0gPQorICAgIHsKKyAgICAgICAgeyB7MiwgMX0sIHs2LCA3fSwgezYsIDR9LCB7NiwgM30sIHs2LCAyfX0sCisgICAgICAgIHsgezAsIDB9LCB7MSwgMX0sIHs2LCA2fSwgezcsIDN9LCB7OCwgM319LAorICAgICAgICB7IHswLCAwfSwgezAsIDB9LCB7MywgMX0sIHs3LCAyfSwgezgsIDJ9fSwKKyAgICAgICAgeyB7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7NiwgNX0sIHs3LCAwfX0sCisgICAgfTsKKworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgdWludCBjb2RlLCBsZW47CisKKyAgICBsZW4gPSB0b3RDb2VmZlRyYWlsT25lQ2hyb21bVHJhaWxpbmdPbmVzXVtUb3RhbENvZWZmXVswXTsKKyAgICBjb2RlID0gdG90Q29lZmZUcmFpbE9uZUNocm9tW1RyYWlsaW5nT25lc11bVG90YWxDb2VmZl1bMV07CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgbGVuLCBjb2RlKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIHNlZSBUYWJsZSA5LTcgYW5kIDktOCAqLworQVZDRW5jX1N0YXR1cyBjZV9Ub3RhbFplcm9zKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgdG90YWxfemVyb3MsIGludCBUb3RhbENvZWZmKQoreworICAgIGNvbnN0IHN0YXRpYyB1aW50OCBsZW5Ub3RhbFplcm9zWzE1XVsxNl0gPQorICAgIHsKKyAgICAgICAgeyAxLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4LCA4LCA5LCA5LCA5fSwKKyAgICAgICAgeyAzLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA2LCA2LCA2LCA2fSwKKyAgICAgICAgeyA0LCAzLCAzLCAzLCA0LCA0LCAzLCAzLCA0LCA1LCA1LCA2LCA1LCA2fSwKKyAgICAgICAgeyA1LCAzLCA0LCA0LCAzLCAzLCAzLCA0LCAzLCA0LCA1LCA1LCA1fSwKKyAgICAgICAgeyA0LCA0LCA0LCAzLCAzLCAzLCAzLCAzLCA0LCA1LCA0LCA1fSwKKyAgICAgICAgeyA2LCA1LCAzLCAzLCAzLCAzLCAzLCAzLCA0LCAzLCA2fSwKKyAgICAgICAgeyA2LCA1LCAzLCAzLCAzLCAyLCAzLCA0LCAzLCA2fSwKKyAgICAgICAgeyA2LCA0LCA1LCAzLCAyLCAyLCAzLCAzLCA2fSwKKyAgICAgICAgeyA2LCA2LCA0LCAyLCAyLCAzLCAyLCA1fSwKKyAgICAgICAgeyA1LCA1LCAzLCAyLCAyLCAyLCA0fSwKKyAgICAgICAgeyA0LCA0LCAzLCAzLCAxLCAzfSwKKyAgICAgICAgeyA0LCA0LCAyLCAxLCAzfSwKKyAgICAgICAgeyAzLCAzLCAxLCAyfSwKKyAgICAgICAgeyAyLCAyLCAxfSwKKyAgICAgICAgeyAxLCAxfSwKKyAgICB9OworCisgICAgY29uc3Qgc3RhdGljIHVpbnQ4IGNvZFRvdGFsWmVyb3NbMTVdWzE2XSA9CisgICAgeworICAgICAgICB7MSwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMX0sCisgICAgICAgIHs3LCA2LCA1LCA0LCAzLCA1LCA0LCAzLCAyLCAzLCAyLCAzLCAyLCAxLCAwfSwKKyAgICAgICAgezUsIDcsIDYsIDUsIDQsIDMsIDQsIDMsIDIsIDMsIDIsIDEsIDEsIDB9LAorICAgICAgICB7MywgNywgNSwgNCwgNiwgNSwgNCwgMywgMywgMiwgMiwgMSwgMH0sCisgICAgICAgIHs1LCA0LCAzLCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAxLCAwfSwKKyAgICAgICAgezEsIDEsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDEsIDB9LAorICAgICAgICB7MSwgMSwgNSwgNCwgMywgMywgMiwgMSwgMSwgMH0sCisgICAgICAgIHsxLCAxLCAxLCAzLCAzLCAyLCAyLCAxLCAwfSwKKyAgICAgICAgezEsIDAsIDEsIDMsIDIsIDEsIDEsIDEsIH0sCisgICAgICAgIHsxLCAwLCAxLCAzLCAyLCAxLCAxLCB9LAorICAgICAgICB7MCwgMSwgMSwgMiwgMSwgM30sCisgICAgICAgIHswLCAxLCAxLCAxLCAxfSwKKyAgICAgICAgezAsIDEsIDEsIDF9LAorICAgICAgICB7MCwgMSwgMX0sCisgICAgICAgIHswLCAxfSwKKyAgICB9OworICAgIGludCBsZW4sIGNvZGU7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisKKyAgICBsZW4gPSBsZW5Ub3RhbFplcm9zW1RvdGFsQ29lZmYtMV1bdG90YWxfemVyb3NdOworICAgIGNvZGUgPSBjb2RUb3RhbFplcm9zW1RvdGFsQ29lZmYtMV1bdG90YWxfemVyb3NdOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgbGVuLCBjb2RlKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIHNlZSBUYWJsZSA5LTkgKi8KK0FWQ0VuY19TdGF0dXMgY2VfVG90YWxaZXJvc0Nocm9tYURDKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgdG90YWxfemVyb3MsIGludCBUb3RhbENvZWZmKQoreworICAgIGNvbnN0IHN0YXRpYyB1aW50OCBsZW5Ub3RhbFplcm9zQ2hyb21hRENbM11bNF0gPQorICAgIHsKKyAgICAgICAgeyAxLCAyLCAzLCAzLCB9LAorICAgICAgICB7IDEsIDIsIDIsIDAsIH0sCisgICAgICAgIHsgMSwgMSwgMCwgMCwgfSwKKyAgICB9OworCisgICAgY29uc3Qgc3RhdGljIHVpbnQ4IGNvZFRvdGFsWmVyb3NDaHJvbWFEQ1szXVs0XSA9CisgICAgeworICAgICAgICB7IDEsIDEsIDEsIDAsIH0sCisgICAgICAgIHsgMSwgMSwgMCwgMCwgfSwKKyAgICAgICAgeyAxLCAwLCAwLCAwLCB9LAorICAgIH07CisKKyAgICBpbnQgbGVuLCBjb2RlOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworCisgICAgbGVuID0gbGVuVG90YWxaZXJvc0Nocm9tYURDW1RvdGFsQ29lZmYtMV1bdG90YWxfemVyb3NdOworICAgIGNvZGUgPSBjb2RUb3RhbFplcm9zQ2hyb21hRENbVG90YWxDb2VmZi0xXVt0b3RhbF96ZXJvc107CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBsZW4sIGNvZGUpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogc2VlIFRhYmxlIDktMTAgKi8KK0FWQ0VuY19TdGF0dXMgY2VfUnVuQmVmb3JlKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgcnVuX2JlZm9yZSwgaW50IHplcm9zTGVmdCkKK3sKKyAgICBjb25zdCBzdGF0aWMgdWludDggbGVuUnVuQmVmb3JlWzddWzE2XSA9CisgICAgeworICAgICAgICB7MSwgMX0sCisgICAgICAgIHsxLCAyLCAyfSwKKyAgICAgICAgezIsIDIsIDIsIDJ9LAorICAgICAgICB7MiwgMiwgMiwgMywgM30sCisgICAgICAgIHsyLCAyLCAzLCAzLCAzLCAzfSwKKyAgICAgICAgezIsIDMsIDMsIDMsIDMsIDMsIDN9LAorICAgICAgICB7MywgMywgMywgMywgMywgMywgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExfSwKKyAgICB9OworCisgICAgY29uc3Qgc3RhdGljIHVpbnQ4IGNvZFJ1bkJlZm9yZVs3XVsxNl0gPQorICAgIHsKKyAgICAgICAgezEsIDB9LAorICAgICAgICB7MSwgMSwgMH0sCisgICAgICAgIHszLCAyLCAxLCAwfSwKKyAgICAgICAgezMsIDIsIDEsIDEsIDB9LAorICAgICAgICB7MywgMiwgMywgMiwgMSwgMH0sCisgICAgICAgIHszLCAwLCAxLCAzLCAyLCA1LCA0fSwKKyAgICAgICAgezcsIDYsIDUsIDQsIDMsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9LAorICAgIH07CisKKyAgICBpbnQgbGVuLCBjb2RlOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworCisgICAgaWYgKHplcm9zTGVmdCA8PSA2KQorICAgIHsKKyAgICAgICAgbGVuID0gbGVuUnVuQmVmb3JlW3plcm9zTGVmdC0xXVtydW5fYmVmb3JlXTsKKyAgICAgICAgY29kZSA9IGNvZFJ1bkJlZm9yZVt6ZXJvc0xlZnQtMV1bcnVuX2JlZm9yZV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxlbiA9IGxlblJ1bkJlZm9yZVs2XVtydW5fYmVmb3JlXTsKKyAgICAgICAgY29kZSA9IGNvZFJ1bkJlZm9yZVs2XVtydW5fYmVmb3JlXTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBsZW4sIGNvZGUpOworCisKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDVmN2U5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFIYW5kbGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3A8QUxvb3Blcj4gQUhhbmRsZXI6Omxvb3BlcigpIHsKKyAgICBleHRlcm4gQUxvb3BlclJvc3RlciBnTG9vcGVyUm9zdGVyOworCisgICAgcmV0dXJuIGdMb29wZXJSb3N0ZXIuZmluZExvb3BlcihpZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCmluZGV4IDgzMWZhMmEuLmNkNGYzNDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcApAQCAtMzEsOCArMzEsOSBAQAogQUxvb3BlclJvc3RlciBnTG9vcGVyUm9zdGVyOwogCiBzdHJ1Y3QgQUxvb3Blcjo6TG9vcGVyVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgTG9vcGVyVGhyZWFkKEFMb29wZXIgKmxvb3BlcikKLSAgICAgICAgOiBtTG9vcGVyKGxvb3BlcikgeworICAgIExvb3BlclRocmVhZChBTG9vcGVyICpsb29wZXIsIGJvb2wgY2FuQ2FsbEphdmEpCisgICAgICAgIDogVGhyZWFkKGNhbkNhbGxKYXZhKSwKKyAgICAgICAgICBtTG9vcGVyKGxvb3BlcikgewogICAgIH0KIAogICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgewpAQCAtNzIsNyArNzMsNyBAQAogICAgIGdMb29wZXJSb3N0ZXIudW5yZWdpc3RlckhhbmRsZXIoaGFuZGxlcklEKTsKIH0KIAotc3RhdHVzX3QgQUxvb3Blcjo6c3RhcnQoYm9vbCBydW5PbkNhbGxpbmdUaHJlYWQpIHsKK3N0YXR1c190IEFMb29wZXI6OnN0YXJ0KGJvb2wgcnVuT25DYWxsaW5nVGhyZWFkLCBib29sIGNhbkNhbGxKYXZhKSB7CiAgICAgaWYgKHJ1bk9uQ2FsbGluZ1RocmVhZCkgewogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtOTYsNyArOTcsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgbVRocmVhZCA9IG5ldyBMb29wZXJUaHJlYWQodGhpcyk7CisgICAgbVRocmVhZCA9IG5ldyBMb29wZXJUaHJlYWQodGhpcywgY2FuQ2FsbEphdmEpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbVRocmVhZC0+cnVuKCJBTG9vcGVyIik7CiAgICAgaWYgKGVyciAhPSBPSykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKaW5kZXggNWJiMWNmOS4uNjVmNzU5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCkBAIC01NCwxMCArNTQsMTUgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1IYW5kbGVycy5pbmRleE9mS2V5KGhhbmRsZXJJRCk7Ci0gICAgQ0hFQ0soaW5kZXggPj0gMCk7CisgICAgQ0hFQ0tfR0UoaW5kZXgsIDApOwogCiAgICAgY29uc3QgSGFuZGxlckluZm8gJmluZm8gPSBtSGFuZGxlcnMudmFsdWVBdChpbmRleCk7Ci0gICAgaW5mby5tSGFuZGxlci0+c2V0SUQoMCk7CisKKyAgICBzcDxBSGFuZGxlcj4gaGFuZGxlciA9IGluZm8ubUhhbmRsZXIucHJvbW90ZSgpOworCisgICAgaWYgKGhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICBoYW5kbGVyLT5zZXRJRCgwKTsKKyAgICB9CiAKICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CiB9CkBAIC03NCw3ICs3OSwxOCBAQAogICAgIH0KIAogICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaW5kZXgpOwotICAgIGluZm8ubUxvb3Blci0+cG9zdChtc2csIGRlbGF5VXMpOworCisgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gaW5mby5tTG9vcGVyLnByb21vdGUoKTsKKworICAgIGlmIChsb29wZXIgPT0gTlVMTCkgeworICAgICAgICBMT0coV0FSTklORykgPDwgImZhaWxlZCB0byBwb3N0IG1lc3NhZ2UuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJUYXJnZXQgaGFuZGxlciBzdGlsbCByZWdpc3RlcmVkLCBidXQgb2JqZWN0IGdvbmUuIjsKKworICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsb29wZXItPnBvc3QobXNnLCBkZWxheVVzKTsKIH0KIAogdm9pZCBBTG9vcGVyUm9zdGVyOjpkZWxpdmVyTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtODYsMTUgKzEwMiw0MyBAQAogICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUhhbmRsZXJzLmluZGV4T2ZLZXkobXNnLT50YXJnZXQoKSk7CiAKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJmYWlsZWQgdG8gZGVsaXZlciBtZXNzYWdlLiBUYXJnZXQgaGFuZGxlciBub3QgcmVnaXN0ZXJlZC4iOworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJmYWlsZWQgdG8gZGVsaXZlciBtZXNzYWdlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRhcmdldCBoYW5kbGVyIG5vdCByZWdpc3RlcmVkLiI7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaGFuZGxlciA9IGluZm8ubUhhbmRsZXI7CisgICAgICAgIGhhbmRsZXIgPSBpbmZvLm1IYW5kbGVyLnByb21vdGUoKTsKKworICAgICAgICBpZiAoaGFuZGxlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgImZhaWxlZCB0byBkZWxpdmVyIG1lc3NhZ2UuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0IGhhbmRsZXIgcmVnaXN0ZXJlZCwgYnV0IG9iamVjdCBnb25lLiI7CisKKyAgICAgICAgICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGhhbmRsZXItPm9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CiB9CiAKK3NwPEFMb29wZXI+IEFMb29wZXJSb3N0ZXI6OmZpbmRMb29wZXIoQUxvb3Blcjo6aGFuZGxlcl9pZCBoYW5kbGVySUQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3NpemVfdCBpbmRleCA9IG1IYW5kbGVycy5pbmRleE9mS2V5KGhhbmRsZXJJRCk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG1IYW5kbGVycy52YWx1ZUF0KGluZGV4KS5tTG9vcGVyLnByb21vdGUoKTsKKworICAgIGlmIChsb29wZXIgPT0gTlVMTCkgeworICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBsb29wZXI7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCmluZGV4IGRmZDFhZTMuLjI2YzZkNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAKICNpbmNsdWRlICJBTWVzc2FnZS5oIgogCisjaW5jbHVkZSA8Y3R5cGUuaD4KKwogI2luY2x1ZGUgIkFBdG9taXplci5oIgogI2luY2x1ZGUgIkFEZWJ1Zy5oIgogI2luY2x1ZGUgIkFMb29wZXJSb3N0ZXIuaCIKQEAgLTIzOCw0ICsyNDAsMTA1IEBACiAgICAgcmV0dXJuIG1zZzsKIH0KIAorc3RhdGljIHZvaWQgYXBwZW5kSW5kZW50KEFTdHJpbmcgKnMsIGludDMyX3QgaW5kZW50KSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1doaXRlc3BhY2VbXSA9CisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CisKKyAgICBDSEVDS19MVCgoc2l6ZV90KWluZGVudCwgc2l6ZW9mKGtXaGl0ZXNwYWNlKSk7CisKKyAgICBzLT5hcHBlbmQoa1doaXRlc3BhY2UsIGluZGVudCk7Cit9CisKK3N0YXRpYyBib29sIGlzRm91cmNjKHVpbnQzMl90IHdoYXQpIHsKKyAgICByZXR1cm4gaXNwcmludCh3aGF0ICYgMHhmZikKKyAgICAgICAgJiYgaXNwcmludCgod2hhdCA+PiA4KSAmIDB4ZmYpCisgICAgICAgICYmIGlzcHJpbnQoKHdoYXQgPj4gMTYpICYgMHhmZikKKyAgICAgICAgJiYgaXNwcmludCgod2hhdCA+PiAyNCkgJiAweGZmKTsKK30KKworQVN0cmluZyBBTWVzc2FnZTo6ZGVidWdTdHJpbmcoaW50MzJfdCBpbmRlbnQpIGNvbnN0IHsKKyAgICBBU3RyaW5nIHMgPSAiQU1lc3NhZ2Uod2hhdCA9ICI7CisKKyAgICBBU3RyaW5nIHRtcDsKKyAgICBpZiAoaXNGb3VyY2MobVdoYXQpKSB7CisgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAiJyVjJWMlYyVjJyIsCisgICAgICAgICAgICAgICAgKGNoYXIpKG1XaGF0ID4+IDI0KSwKKyAgICAgICAgICAgICAgICAoY2hhcikoKG1XaGF0ID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgIChjaGFyKSgobVdoYXQgPj4gOCkgJiAweGZmKSwKKyAgICAgICAgICAgICAgICAoY2hhcikobVdoYXQgJiAweGZmKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKCIweCUwOHgiLCBtV2hhdCk7CisgICAgfQorICAgIHMuYXBwZW5kKHRtcCk7CisKKyAgICBpZiAobVRhcmdldCAhPSAwKSB7CisgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigiLCB0YXJnZXQgPSAlZCIsIG1UYXJnZXQpOworICAgICAgICBzLmFwcGVuZCh0bXApOworICAgIH0KKyAgICBzLmFwcGVuZCgiKSA9IHtcbiIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgeworICAgICAgICBjb25zdCBJdGVtICZpdGVtID0gbUl0ZW1zW2ldOworCisgICAgICAgIHN3aXRjaCAoaXRlbS5tVHlwZSkgeworICAgICAgICAgICAgY2FzZSBrVHlwZUludDMyOgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQzMl90ICVzID0gJWQiLCBpdGVtLm1OYW1lLCBpdGVtLnUuaW50MzJWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgImludDY0X3QgJXMgPSAlbGxkIiwgaXRlbS5tTmFtZSwgaXRlbS51LmludDY0VmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrVHlwZVNpemU6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgInNpemVfdCAlcyA9ICVkIiwgaXRlbS5tTmFtZSwgaXRlbS51LnNpemVWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlRmxvYXQ6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0ICVzID0gJWYiLCBpdGVtLm1OYW1lLCBpdGVtLnUuZmxvYXRWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJkb3VibGUgJXMgPSAlZiIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5kb3VibGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlUG9pbnRlcjoKKyAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAidm9pZCAqJXMgPSAlcCIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5wdHJWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlU3RyaW5nOgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgJXMgPSBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udS5zdHJpbmdWYWx1ZS0+Y19zdHIoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlT2JqZWN0OgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZWZCYXNlIColcyA9ICVwIiwgaXRlbS5tTmFtZSwgaXRlbS51LnJlZlZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVNZXNzYWdlOgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJBTWVzc2FnZSAlcyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBTWVzc2FnZSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnUucmVmVmFsdWUpLT5kZWJ1Z1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICsgc3RybGVuKGl0ZW0ubU5hbWUpICsgMTQpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICB9CisKKyAgICAgICAgYXBwZW5kSW5kZW50KCZzLCBpbmRlbnQpOworICAgICAgICBzLmFwcGVuZCgiICAiKTsKKyAgICAgICAgcy5hcHBlbmQodG1wKTsKKyAgICAgICAgcy5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgYXBwZW5kSW5kZW50KCZzLCBpbmRlbnQpOworICAgIHMuYXBwZW5kKCJ9Iik7CisKKyAgICByZXR1cm4gczsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tawppbmRleCA3MzA0N2U3Li4zNWVlYTdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCkBAIC01LDYgKzUsNyBAQAogICAgIEFBdG9taXplci5jcHAgICAgICAgICAgICAgICBcCiAgICAgQUJ1ZmZlci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICBBRGVidWcuY3BwICAgICAgICAgICAgICAgICAgXAorICAgIEFIYW5kbGVyLmNwcCAgICAgICAgICAgICAgICBcCiAgICAgQUxvb3Blci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICBBTG9vcGVyUm9zdGVyLmNwcCAgICAgICAgICAgXAogICAgIEFNZXNzYWdlLmNwcCAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRGVjb2Rlci5oCmluZGV4IGYwOWFkZGQuLjIwMGY5M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRGVjb2Rlci5oCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOworc3RydWN0IE1ldGFEYXRhOwogCiBzdHJ1Y3QgQUFDRGVjb2RlciA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CiAgICAgQUFDRGVjb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CkBAIC00MSw2ICs0Miw3IEBACiAgICAgdmlydHVhbCB+QUFDRGVjb2RlcigpOwogCiBwcml2YXRlOgorICAgIHNwPE1ldGFEYXRhPiAgICBtTWV0YTsKICAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICBib29sIG1TdGFydGVkOwogCkBAIC01MCw5ICs1MiwxMSBAQAogICAgIHZvaWQgKm1EZWNvZGVyQnVmOwogICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKICAgICBpbnQ2NF90IG1OdW1TYW1wbGVzT3V0cHV0OworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBNZWRpYUJ1ZmZlciAqbUlucHV0QnVmZmVyOwogCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7CiAgICAgQUFDRGVjb2Rlcihjb25zdCBBQUNEZWNvZGVyICYpOwogICAgIEFBQ0RlY29kZXIgJm9wZXJhdG9yPShjb25zdCBBQUNEZWNvZGVyICYpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVkNFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMmUzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZDRW5jb2Rlci5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFWQ19FTkNPREVSX0hfCisKKyNkZWZpbmUgQVZDX0VOQ09ERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworc3RydWN0IHRhZ0FWQ0hhbmRsZTsKK3N0cnVjdCB0YWdBVkNFbmNQYXJhbTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFCdWZmZXI7CitzdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKKworc3RydWN0IEFWQ0VuY29kZXIgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKKyAgICBBVkNFbmNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICAvLyBDYWxsYmFja3MgcmVxdWlyZWQgYnkgdGhlIGVuY29kZXIKKyAgICBpbnQzMl90IGFsbG9jT3V0cHV0QnVmZmVycyh1bnNpZ25lZCBpbnQgc2l6ZUluTWJzLCB1bnNpZ25lZCBpbnQgbnVtQnVmZmVycyk7CisgICAgdm9pZCAgICB1bmJpbmRPdXRwdXRCdWZmZXIoaW50MzJfdCBpbmRleCk7CisgICAgaW50MzJfdCBiaW5kT3V0cHV0QnVmZmVyKGludDMyX3QgaW5kZXgsIHVpbnQ4X3QgKip5dXYpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QVZDRW5jb2RlcigpOworCitwcml2YXRlOgorICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPE1ldGFEYXRhPiAgICBtRm9ybWF0OworICAgIHNwPE1ldGFEYXRhPiAgICBtTWV0YTsKKworICAgIGludDMyX3QgIG1WaWRlb1dpZHRoOworICAgIGludDMyX3QgIG1WaWRlb0hlaWdodDsKKyAgICBpbnQzMl90ICBtVmlkZW9GcmFtZVJhdGU7CisgICAgaW50MzJfdCAgbVZpZGVvQml0UmF0ZTsKKyAgICBpbnQzMl90ICBtVmlkZW9Db2xvckZvcm1hdDsKKyAgICBpbnQ2NF90ICBtTnVtSW5wdXRGcmFtZXM7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBib29sICAgICBtU3RhcnRlZDsKKyAgICBib29sICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQ7CisgICAgYm9vbCAgICAgbVJlYWR5Rm9yTmV4dEZyYW1lOworICAgIGludDMyX3QgIG1Jc0lEUkZyYW1lOyAgLy8gZm9yIHNldCBrS2V5SXNTeW5jRnJhbWUKKworICAgIHRhZ0FWQ0hhbmRsZSAgICAgICAgICAqbUhhbmRsZTsKKyAgICB0YWdBVkNFbmNQYXJhbSAgICAgICAgKm1FbmNQYXJhbXM7CisgICAgTWVkaWFCdWZmZXIgICAgICAgICAgICptSW5wdXRCdWZmZXI7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICptSW5wdXRGcmFtZURhdGE7CisgICAgTWVkaWFCdWZmZXJHcm91cCAgICAgICptR3JvdXA7CisgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1PdXRwdXRCdWZmZXJzOworCisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKyAgICB2b2lkIHJlbGVhc2VPdXRwdXRCdWZmZXJzKCk7CisKKyAgICBBVkNFbmNvZGVyKGNvbnN0IEFWQ0VuY29kZXIgJik7CisgICAgQVZDRW5jb2RlciAmb3BlcmF0b3I9KGNvbnN0IEFWQ0VuY29kZXIgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFWQ19FTkNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IDJhOWYyMWIuLjhkMDg3N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVGltZVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzMsNyArMzQsNiBAQAogc3RydWN0IE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhRXh0cmFjdG9yOwogc3RydWN0IE1lZGlhU291cmNlOwotc3RydWN0IFRpbWVTb3VyY2U7CiBzdHJ1Y3QgTnVDYWNoZWRTb3VyY2UyOwogCiBzdHJ1Y3QgQUxvb3BlcjsKQEAgLTEwMiw2ICsxMDIsOCBAQAogICAgICAgICBBVF9FT1MgICAgICAgICAgICAgID0gMzIsCiAgICAgICAgIFBSRVBBUkVfQ0FOQ0VMTEVEICAgPSA2NCwKICAgICAgICAgQ0FDSEVfVU5ERVJSVU4gICAgICA9IDEyOCwKKyAgICAgICAgQVVESU9fQVRfRU9TICAgICAgICA9IDI1NiwKKyAgICAgICAgVklERU9fQVRfRU9TICAgICAgICA9IDUxMiwKICAgICB9OwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKQEAgLTExNSw2ICsxMTcsNyBAQAogICAgIHNwPElTdXJmYWNlPiBtSVN1cmZhY2U7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAKKyAgICBTeXN0ZW1UaW1lU291cmNlIG1TeXN0ZW1UaW1lU291cmNlOwogICAgIFRpbWVTb3VyY2UgKm1UaW1lU291cmNlOwogCiAgICAgU3RyaW5nOCBtVXJpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCBhZDViMGY5Li42ZGU3NjFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtMTY0LDYgKzE2NCwxMCBAQAogICAgICAgICBpbnN0YW5jZSA9IG1MaXZlTm9kZXMuZWRpdFZhbHVlQXQoaW5kZXgpOwogICAgICAgICBtTGl2ZU5vZGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogCisgICAgICAgIGluZGV4ID0gbURpc3BhdGNoZXJzLmluZGV4T2ZLZXkoaW5zdGFuY2UtPm5vZGVJRCgpKTsKKyAgICAgICAgQ0hFQ0soaW5kZXggPj0gMCk7CisgICAgICAgIG1EaXNwYXRjaGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKwogICAgICAgICBpbnZhbGlkYXRlTm9kZUlEX2woaW5zdGFuY2UtPm5vZGVJRCgpKTsKICAgICB9CiAKQEAgLTI0MCw2ICsyNDQsMTEgQEAKICAgICBzc2l6ZV90IGluZGV4ID0gbUxpdmVOb2Rlcy5pbmRleE9mS2V5KGluc3RhbmNlLT5vYnNlcnZlcigpLT5hc0JpbmRlcigpKTsKICAgICBDSEVDSyhpbmRleCA+PSAwKTsKICAgICBtTGl2ZU5vZGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworCisgICAgaW5kZXggPSBtRGlzcGF0Y2hlcnMuaW5kZXhPZktleShub2RlKTsKKyAgICBDSEVDSyhpbmRleCA+PSAwKTsKKyAgICBtRGlzcGF0Y2hlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisKICAgICBpbnN0YW5jZS0+b2JzZXJ2ZXIoKS0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKIAogICAgIHJldHVybiBpbnN0YW5jZS0+ZnJlZU5vZGUobU1hc3Rlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvQW5kcm9pZC5tayBiL21lZGlhL210cC9BbmRyb2lkLm1rCmluZGV4IGYzNjNiN2MuLjQ2NTk3MDkgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL210cC9BbmRyb2lkLm1rCkBAIC0xNSwxOSArMTUsMTYgQEAKICMKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCi1pZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICBNdHBDbGllbnQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgIE10cEN1cnNvci5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgTXRwRGF0YWJhc2UuY3BwICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgIE10cERlYnVnLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBFdmVudFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8uY3BwICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgTXRwTWVkaWFTY2FubmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgIE10cFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkuY3BwICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zOCw1OCArMzUsOSBAQAogICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgIE10cFV0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgU3FsaXRlRGF0YWJhc2UuY3BwICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBTcWxpdGVTdGF0ZW1lbnQuY3BwICAgICAgICAgICAgICAgICAgIFwKIAogTE9DQUxfTU9EVUxFOj0gbGlibXRwCiAKLUxPQ0FMX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvc3FsaXRlL2Rpc3QKLQogTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0RFVklDRSAtRE1UUF9IT1NUCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgbXRwdGVzdC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLUxPQ0FMX01PRFVMRTo9IG10cHRlc3QKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0RFVklDRQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnV0aWxzIGxpYnNxbGl0ZSBsaWJzdGFnZWZyaWdodCBsaWJjdXRpbHMgXAotCWxpYm1lZGlhCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlibXRwCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1lbmRpZgotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IHNjYW50ZXN0Ci1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIHNjYW50ZXN0LmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgTXRwTWVkaWFTY2FubmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBNdHBEYXRhYmFzZS5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgTXRwUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIuY3BwICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIE10cFV0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgU3FsaXRlRGF0YWJhc2UuY3BwICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBTcWxpdGVTdGF0ZW1lbnQuY3BwICAgICAgICAgICAgICAgICAgIFwKLQotCi0jTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJ1c2Job3N0Ci0jTE9DQUxfTERMSUJTIDo9IC1scHRocmVhZAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IGV4dGVybmFsL3NxbGl0ZS9kaXN0Ci1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnV0aWxzIGxpYnNxbGl0ZSBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYQotCi0KLUxPQ0FMX0NGTEFHUyA6PSAtZwotTE9DQUxfTERGTEFHUyA6PSAtZwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBDbGllbnQuY3BwIGIvbWVkaWEvbXRwL010cENsaWVudC5jcHAKaW5kZXggZmJmMWM3Ny4uYjRjNDdhZjggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBDbGllbnQuY3BwCisrKyBiL21lZGlhL210cC9NdHBDbGllbnQuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiAjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgpAQCAtMzgsMzQgKzM5LDU5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgTXRwQ2xpZW50VGhyZWFkIDogcHVibGljIFRocmVhZCB7Citwcml2YXRlOgorICAgIE10cENsaWVudCogICBtQ2xpZW50OworCitwdWJsaWM6CisgICAgTXRwQ2xpZW50VGhyZWFkKE10cENsaWVudCogY2xpZW50KQorICAgICAgICA6IG1DbGllbnQoY2xpZW50KQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPnRocmVhZExvb3AoKTsKKyAgICB9Cit9OworCisKIE10cENsaWVudDo6TXRwQ2xpZW50KCkKLSAgICA6ICAgbVN0YXJ0ZWQoZmFsc2UpCisgICAgOiAgIG1UaHJlYWQoTlVMTCksCisgICAgICAgIG1Vc2JIb3N0Q29udGV4dChOVUxMKSwKKyAgICAgICAgbURvbmUoZmFsc2UpCiB7CiB9CiAKIE10cENsaWVudDo6fk10cENsaWVudCgpIHsKKyAgICB1c2JfaG9zdF9jbGVhbnVwKG1Vc2JIb3N0Q29udGV4dCk7CiB9CiAKIGJvb2wgTXRwQ2xpZW50OjpzdGFydCgpIHsKLSAgICBpZiAobVN0YXJ0ZWQpCisgICAgaWYgKG1UaHJlYWQpCiAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgaWYgKHVzYl9ob3N0X2luaXQodXNiX2RldmljZV9hZGRlZCwgdXNiX2RldmljZV9yZW1vdmVkLCB0aGlzKSkgewotICAgICAgICBMT0dFKCJNdHBDbGllbnQ6OnN0YXJ0IGZhaWxlZFxuIik7CisgICAgbVVzYkhvc3RDb250ZXh0ID0gdXNiX2hvc3RfaW5pdCgpOworICAgIGlmICghbVVzYkhvc3RDb250ZXh0KQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIG1UaHJlYWQgPSBuZXcgTXRwQ2xpZW50VGhyZWFkKHRoaXMpOworICAgIG1UaHJlYWQtPnJ1bigiTXRwQ2xpZW50VGhyZWFkIik7CisKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBNdHBDbGllbnQ6OnVzYkRldmljZUFkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUpIHsKK3ZvaWQgTXRwQ2xpZW50OjpzdG9wKCkgeworICAgIG1Eb25lID0gdHJ1ZTsKK30KKworYm9vbCBNdHBDbGllbnQ6OnVzYkRldmljZUFkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUpIHsKICAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyKiBkZXNjOwogICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9pdGVyIGl0ZXI7CiAKICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlID0gdXNiX2RldmljZV9vcGVuKGRldm5hbWUpOwogICAgIGlmICghZGV2aWNlKSB7CiAgICAgICAgIExPR0UoInVzYl9kZXZpY2Vfb3BlbiBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBtRG9uZTsKICAgICB9CiAKICAgICB1c2JfZGVzY3JpcHRvcl9pdGVyX2luaXQoZGV2aWNlLCAmaXRlcik7CkBAIC05MCw3ICsxMTYsNyBAQAogICAgICAgICAgICAgICAgICAgICBlcCA9IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKil1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWVwIHx8IGVwLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJlbmRwb2ludHMgbm90IGZvdW5kXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRG9uZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCkBAIC0xMDQsNyArMTMwLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCFlcF9pbl9kZXNjIHx8ICFlcF9vdXRfZGVzYyB8fCAhZXBfaW50cl9kZXNjKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRG9uZTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiA9IHVzYl9lbmRwb2ludF9vcGVuKGRldmljZSwgZXBfaW5fZGVzYyk7CkBAIC0xMTYsNyArMTQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX2luKTsKICAgICAgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX291dCk7CiAgICAgICAgICAgICAgICAgICAgIHVzYl9lbmRwb2ludF9jbG9zZShlcF9pbnRyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbURvbmU7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgTXRwRGV2aWNlKiBtdHBEZXZpY2UgPSBuZXcgTXRwRGV2aWNlKGRldmljZSwgaW50ZXJmYWNlLT5iSW50ZXJmYWNlTnVtYmVyLApAQCAtMTI0LDEyICsxNTAsMTMgQEAKICAgICAgICAgICAgICAgICBtRGV2aWNlTGlzdC5hZGQobXRwRGV2aWNlKTsKICAgICAgICAgICAgICAgICBtdHBEZXZpY2UtPmluaXRpYWxpemUoKTsKICAgICAgICAgICAgICAgICBkZXZpY2VBZGRlZChtdHBEZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbURvbmU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICB1c2JfZGV2aWNlX2Nsb3NlKGRldmljZSk7CisgICAgcmV0dXJuIG1Eb25lOwogfQogCiBNdHBEZXZpY2UqIE10cENsaWVudDo6Z2V0RGV2aWNlKGludCBpZCkgewpAQCAtMTQxLDcgKzE2OCw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgTXRwQ2xpZW50Ojp1c2JEZXZpY2VSZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUpIHsKK2Jvb2wgTXRwQ2xpZW50Ojp1c2JEZXZpY2VSZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VMaXN0LnNpemUoKTsgaSsrKSB7CiAgICAgICAgIE10cERldmljZSogZGV2aWNlID0gbURldmljZUxpc3RbaV07CiAgICAgICAgIGlmICghc3RyY21wKGRldm5hbWUsIGRldmljZS0+Z2V0RGV2aWNlTmFtZSgpKSkgewpAQCAtMTUyLDE2ICsxNzksMjIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiBtRG9uZTsKIH0KIAotdm9pZCBNdHBDbGllbnQ6OnVzYl9kZXZpY2VfYWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKK2Jvb2wgTXRwQ2xpZW50Ojp0aHJlYWRMb29wKCkgeworICAgIHVzYl9ob3N0X3J1bihtVXNiSG9zdENvbnRleHQsIHVzYl9kZXZpY2VfYWRkZWQsIHVzYl9kZXZpY2VfcmVtb3ZlZCwgdGhpcyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgTXRwQ2xpZW50Ojp1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CiAgICAgTE9HRCgidXNiX2RldmljZV9hZGRlZCAlc1xuIiwgZGV2bmFtZSk7Ci0gICAgKChNdHBDbGllbnQgKiljbGllbnRfZGF0YSktPnVzYkRldmljZUFkZGVkKGRldm5hbWUpOworICAgIHJldHVybiAoKE10cENsaWVudCAqKWNsaWVudF9kYXRhKS0+dXNiRGV2aWNlQWRkZWQoZGV2bmFtZSk7CiB9CiAKLXZvaWQgTXRwQ2xpZW50Ojp1c2JfZGV2aWNlX3JlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKK2ludCBNdHBDbGllbnQ6OnVzYl9kZXZpY2VfcmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSkgewogICAgIExPR0QoInVzYl9kZXZpY2VfcmVtb3ZlZCAlc1xuIiwgZGV2bmFtZSk7Ci0gICAgKChNdHBDbGllbnQgKiljbGllbnRfZGF0YSktPnVzYkRldmljZVJlbW92ZWQoZGV2bmFtZSk7CisgICAgcmV0dXJuICgoTXRwQ2xpZW50ICopY2xpZW50X2RhdGEpLT51c2JEZXZpY2VSZW1vdmVkKGRldm5hbWUpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cENsaWVudC5oIGIvbWVkaWEvbXRwL010cENsaWVudC5oCmluZGV4IGQ4N2MyMjYuLjkwN2E4MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBDbGllbnQuaAorKysgYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmgKQEAgLTE5LDE4ICsxOSwyNSBAQAogCiAjaW5jbHVkZSAiTXRwVHlwZXMuaCIKIAorc3RydWN0IHVzYl9ob3N0X2NvbnRleHQ7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgTXRwQ2xpZW50VGhyZWFkOworCiBjbGFzcyBNdHBDbGllbnQgewogcHJpdmF0ZToKLSAgICBNdHBEZXZpY2VMaXN0ICAgICAgICAgICBtRGV2aWNlTGlzdDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhcnRlZDsKKyAgICBNdHBEZXZpY2VMaXN0ICAgICAgICAgICAgICAgbURldmljZUxpc3Q7CisgICAgTXRwQ2xpZW50VGhyZWFkKiAgICAgICAgICAgIG1UaHJlYWQ7CisgICAgc3RydWN0IHVzYl9ob3N0X2NvbnRleHQqICAgIG1Vc2JIb3N0Q29udGV4dDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbURvbmU7CiAKIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBDbGllbnQoKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwQ2xpZW50KCk7CiAKICAgICBib29sICAgICAgICAgICAgICAgICAgICBzdGFydCgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHN0b3AoKTsKIAogICAgIGlubGluZSBNdHBEZXZpY2VMaXN0JiAgIGdldERldmljZUxpc3QoKSB7IHJldHVybiBtRGV2aWNlTGlzdDsgfQogICAgIE10cERldmljZSogICAgICAgICAgICAgIGdldERldmljZShpbnQgaWQpOwpAQCAtNDAsMTAgKzQ3LDE0IEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGV2aWNlUmVtb3ZlZChNdHBEZXZpY2UgKmRldmljZSkgPSAwOwogCiBwcml2YXRlOgotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHVzYkRldmljZUFkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHVzYkRldmljZVJlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSk7Ci0gICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgdXNiX2RldmljZV9hZGRlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSk7Ci0gICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgdXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKTsKKyAgICAvLyB0aGVzZSByZXR1cm4gdHJ1ZSBpZiB3ZSBzaG91bGQgc3RvcCBtb25pdG9yaW5nIFVTQiBhbmQgY2xlYW4gdXAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB1c2JEZXZpY2VBZGRlZChjb25zdCBjaGFyICpkZXZuYW1lKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB1c2JEZXZpY2VSZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUpOworCisgICAgZnJpZW5kIGNsYXNzIE10cENsaWVudFRocmVhZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wKCk7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgdXNiX2RldmljZV9hZGRlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSk7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgdXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKaW5kZXggYTdlOTc1Yy4uNmY5ZWEyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcApAQCAtMjk5LDE3ICsyOTksMjggQEAKICAgICAgICAgcHV0VUludDY0KCp2YWx1ZXMrKyk7CiB9CiAKLXZvaWQgTXRwRGF0YVBhY2tldDo6cHV0U3RyaW5nKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKQotewordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRTdHJpbmcoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpIHsKICAgICBzdHJpbmcud3JpdGVUb1BhY2tldCh0aGlzKTsKIH0KIAotdm9pZCBNdHBEYXRhUGFja2V0OjpwdXRTdHJpbmcoY29uc3QgY2hhciogcykKLXsKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0U3RyaW5nKGNvbnN0IGNoYXIqIHMpIHsKICAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nKHMpOwogICAgIHN0cmluZy53cml0ZVRvUGFja2V0KHRoaXMpOwogfQogCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFN0cmluZyhjb25zdCB1aW50MTZfdCogc3RyaW5nKSB7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGlmIChzdHJpbmdbaV0pCisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcHV0VUludDgoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDE2KHN0cmluZ1tpXSk7Cit9CisKICNpZmRlZiBNVFBfREVWSUNFIAogaW50IE10cERhdGFQYWNrZXQ6OnJlYWQoaW50IGZkKSB7CiAgICAgLy8gZmlyc3QgcmVhZCB0aGUgaGVhZGVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaAppbmRleCAxNDZlZjY0Li43NTljMGY5IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKQEAgLTc5LDYgKzc5LDcgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50NjQoY29uc3QgdWludDY0X3QqIHZhbHVlcywgaW50IGNvdW50KTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFN0cmluZyhjb25zdCBNdHBTdHJpbmdCdWZmZXImIHN0cmluZyk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRTdHJpbmcoY29uc3QgY2hhciogc3RyaW5nKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFN0cmluZyhjb25zdCB1aW50MTZfdCogc3RyaW5nKTsKICAgICBpbmxpbmUgdm9pZCAgICAgICAgIHB1dEVtcHR5U3RyaW5nKCkgeyBwdXRVSW50MTYoMCk7IH0KICAgICBpbmxpbmUgdm9pZCAgICAgICAgIHB1dEVtcHR5QXJyYXkoKSB7IHB1dFVJbnQzMigwKTsgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuY3BwIGIvbWVkaWEvbXRwL010cERhdGFiYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5Yjg5OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk10cERhdGFiYXNlIgotCi0jaW5jbHVkZSAiTXRwRGVidWcuaCIKLSNpbmNsdWRlICJNdHBEYXRhYmFzZS5oIgotI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKLSNpbmNsdWRlICJNdHBVdGlscy5oIgotI2luY2x1ZGUgIlNxbGl0ZURhdGFiYXNlLmgiCi0jaW5jbHVkZSAiU3FsaXRlU3RhdGVtZW50LmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNxbGl0ZTMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0jZGVmaW5lIEZJTEVfSURfQ09MVU1OICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBGSUxFX1BBVEhfQ09MVU1OICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgRklMRV9GT1JNQVRfQ09MVU1OICAgICAgICAgICAgICAzCi0jZGVmaW5lIEZJTEVfUEFSRU5UX0NPTFVNTiAgICAgICAgICAgICAgNAotI2RlZmluZSBGSUxFX1NUT1JBR0VfQ09MVU1OICAgICAgICAgICAgIDUKLSNkZWZpbmUgRklMRV9TSVpFX0NPTFVNTiAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEZJTEVfTU9ESUZJRURfQ09MVU1OICAgICAgICAgICAgNwotCi0jZGVmaW5lIEFVRElPX0lEX0NPTFVNTiAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBVURJT19USVRMRV9DT0xVTU4gICAgICAgICAgICAgIDIKLSNkZWZpbmUgQVVESU9fQVJUSVNUX0NPTFVNTiAgICAgICAgICAgICAzCi0jZGVmaW5lIEFVRElPX0FMQlVNX0NPTFVNTiAgICAgICAgICAgICAgNAotI2RlZmluZSBBVURJT19BTEJVTV9BUlRJU1RfQ09MVU1OICAgICAgIDUKLSNkZWZpbmUgQVVESU9fR0VOUkVfQ09MVU1OICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEFVRElPX0NPTVBPU0VSX0NPTFVNTiAgICAgICAgICAgNwotI2RlZmluZSBBVURJT19UUkFDS19OVU1CRVJfQ09MVU1OICAgICAgIDgKLSNkZWZpbmUgQVVESU9fWUVBUl9DT0xVTU4gICAgICAgICAgICAgICA5Ci0jZGVmaW5lIEFVRElPX0RVUkFUSU9OX0NPTFVNTiAgICAgICAgICAgMTAKLSNkZWZpbmUgQVVESU9fVVNFX0NPVU5UX0NPTFVNTiAgICAgICAgICAxMQotI2RlZmluZSBBVURJT19TQU1QTEVfUkFURV9DT0xVTU4gICAgICAgIDEyCi0jZGVmaW5lIEFVRElPX05VTV9DSEFOTkVMU19DT0xVTU4gICAgICAgMTMKLSNkZWZpbmUgQVVESU9fQVVESU9fV0FWRV9DT0RFQ19DT0xVTU4gICAxNAotI2RlZmluZSBBVURJT19BVURJT19CSVRfUkFURV9DT0xVTU4gICAgIDE1Ci0KLSNkZWZpbmUgRklMRV9UQUJMRV9DUkVBVEUgICAgIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGZpbGVzICgiICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICJfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwiICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAicGF0aCBURVhULCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCBJTlRFR0VSLCIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnQgSU5URUdFUiwiICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAic3RvcmFnZSBJTlRFR0VSLCIgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgSU5URUdFUiwiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICJkYXRlX21vZGlmaWVkIElOVEVHRVIiICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICIpOyIKLQotI2RlZmluZSBBVURJT19UQUJMRV9DUkVBVEUgICAgIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGF1ZGlvICgiICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUgVEVYVCwiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgImFydGlzdCBURVhULCIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICJhbGJ1bSBURVhULCIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWxidW1fYXJ0aXN0IFRFWFQsIiAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgImdlbnJlIFRFWFQsIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb3NlciBURVhULCIgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAidHJhY2tfbnVtYmVyIElOVEVHRVIsIiAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgInllYXIgSU5URUdFUiwiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiBJTlRFR0VSLCIgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAidXNlX2NvdW50IElOVEVHRVIsIiAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZV9yYXRlIElOVEVHRVIsIiAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICJudW1fY2hhbm5lbHMgSU5URUdFUiwiICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fd2F2ZV9jb2RlYyBURVhULCIgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2JpdF9yYXRlIElOVEVHRVIiICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICIpOyIKLQotI2RlZmluZSBQQVRIX0lOREVYX0NSRUFURSAiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgcGF0aF9pbmRleCBvbiBmaWxlcyhwYXRoKTsiCi0KLSNkZWZpbmUgRklMRV9JRF9RVUVSWSAgICJTRUxFQ1QgX2lkLGZvcm1hdCBGUk9NIGZpbGVzIFdIRVJFIHBhdGggPSA/OyIKLSNkZWZpbmUgRklMRV9QQVRIX1FVRVJZICJTRUxFQ1QgcGF0aCxzaXplIEZST00gZmlsZXMgV0hFUkUgX2lkID0gPyIKLQotI2RlZmluZSBHRVRfT0JKRUNUX0lORk9fUVVFUlkgICAiU0VMRUNUIHN0b3JhZ2UsZm9ybWF0LHBhcmVudCxwYXRoLHNpemUsZGF0ZV9tb2RpZmllZCBGUk9NIGZpbGVzIFdIRVJFIF9pZCA9ID87IgotI2RlZmluZSBGSUxFX0lOU0VSVCAgICAgIklOU0VSVCBJTlRPIGZpbGVzIFZBTFVFUyg/LD8sPyw/LD8sPyw/KTsiCi0jZGVmaW5lIEZJTEVfREVMRVRFICAgICAiREVMRVRFIEZST00gZmlsZXMgV0hFUkUgX2lkID0gPzsiCi0KLSNkZWZpbmUgQVVESU9fSU5TRVJUICAgICJJTlNFUlQgSU5UTyBhdWRpbyBWQUxVRVMoPyw/LD8sPyw/LD8sPyw/LD8sPyw/LD8sPyw/LD8pOyIKLSNkZWZpbmUgQVVESU9fREVMRVRFICAgICJERUxFVEUgRlJPTSBhdWRpbyBXSEVSRSBpZCA9ID87IgotCi1zdHJ1Y3QgUHJvcGVydHlUYWJsZUVudHJ5IHsKLSAgICBNdHBPYmplY3RQcm9wZXJ0eSAgIHByb3BlcnR5OwotICAgIGludCAgICAgICAgICAgICAgICAgdHlwZTsKLSAgICBjb25zdCBjaGFyKiAgICAgICAgIGNvbHVtbk5hbWU7Ci19OwotCi1zdGF0aWMgY29uc3QgUHJvcGVydHlUYWJsZUVudHJ5ICAga1Byb3BlcnR5VGFibGVbXSA9IHsKLSAgICB7ICAgTVRQX1BST1BFUlRZX1BBUkVOVF9PQkpFQ1QsICAgICBNVFBfVFlQRV9VSU5UMzIsICAgICJwYXJlbnQiICAgICAgICB9LAotICAgIHsgICBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCwgICAgICAgIE1UUF9UWVBFX1VJTlQzMiwgICAgInN0b3JhZ2UiICAgICAgIH0sCi0gICAgeyAgIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFULCAgICAgTVRQX1RZUEVfVUlOVDMyLCAgICAiZm9ybWF0IiAgICAgICAgfSwKLSAgICB7ICAgTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUsICBNVFBfVFlQRV9TVFIsICAgICAgICJwYXRoIiAgICAgICAgICB9LAotICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkUsICAgICAgIE1UUF9UWVBFX1VJTlQ2NCwgICAgInNpemUiICAgICAgICAgIH0sCi0gICAgeyAgIE1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVELCAgICAgTVRQX1RZUEVfU1RSLCAgICAgICAiZGF0ZV9tb2RpZmllZCIgfSwKLX07Ci0KLXN0YXRpYyBib29sIGdldFByb3BlcnR5SW5mbyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwgaW50JiB0eXBlLCBjb25zdCBjaGFyKiYgY29sdW1uTmFtZSkgewotICAgIGludCBjb3VudCA9IHNpemVvZihrUHJvcGVydHlUYWJsZSkgLyBzaXplb2Yoa1Byb3BlcnR5VGFibGVbMF0pOwotICAgIGNvbnN0IFByb3BlcnR5VGFibGVFbnRyeSogZW50cnkgPSBrUHJvcGVydHlUYWJsZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyssIGVudHJ5KyspIHsKLSAgICAgICAgaWYgKGVudHJ5LT5wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgewotICAgICAgICAgICAgdHlwZSA9IGVudHJ5LT50eXBlOwotICAgICAgICAgICAgY29sdW1uTmFtZSA9IGVudHJ5LT5jb2x1bW5OYW1lOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0KLQotTXRwRGF0YWJhc2U6Ok10cERhdGFiYXNlKCkKLSAgICA6ICAgbUZpbGVJZFF1ZXJ5KE5VTEwpLAotICAgICAgICBtRmlsZVBhdGhRdWVyeShOVUxMKSwKLSAgICAgICAgbU9iamVjdEluZm9RdWVyeShOVUxMKSwKLSAgICAgICAgbUZpbGVJbnNlcnRlcihOVUxMKSwKLSAgICAgICAgbUZpbGVEZWxldGVyKE5VTEwpLAotICAgICAgICBtQXVkaW9JbnNlcnRlcihOVUxMKSwKLSAgICAgICAgbUF1ZGlvRGVsZXRlcihOVUxMKQotewotfQotCi1NdHBEYXRhYmFzZTo6fk10cERhdGFiYXNlKCkgewotfQotCi1ib29sIE10cERhdGFiYXNlOjpvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGJvb2wgY3JlYXRlKSB7Ci0gICAgaWYgKCFTcWxpdGVEYXRhYmFzZTo6b3BlbihwYXRoLCBjcmVhdGUpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBjcmVhdGUgdGFibGVzIGFuZCBpbmRpY2VzIGlmIG5lY2Vzc2FyeQotICAgIGlmICghZXhlYyhGSUxFX1RBQkxFX0NSRUFURSkpIHsKLSAgICAgICAgTE9HRSgiY291bGQgbm90IGNyZWF0ZSBmaWxlIHRhYmxlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFleGVjKFBBVEhfSU5ERVhfQ1JFQVRFKSkgewotICAgICAgICBMT0dFKCJjb3VsZCBub3QgcGF0aCBpbmRleCBvbiBmaWxlIHRhYmxlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFleGVjKEFVRElPX1RBQkxFX0NSRUFURSkpIHsKLSAgICAgICAgTE9HRSgiY291bGQgbm90IGNyZWF0ZSBmaWxlIHRhYmxlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIW1GaWxlSWRRdWVyeSkgewotICAgICAgICBtRmlsZUlkUXVlcnkgPSBuZXcgU3FsaXRlU3RhdGVtZW50KHRoaXMpOwotICAgICAgICBpZiAoIW1GaWxlSWRRdWVyeS0+cHJlcGFyZShGSUxFX0lEX1FVRVJZKSkgewotICAgICAgICAgICAgTE9HRSgiY291bGQgbm90IGNvbXBpbGUgRklMRV9JRF9RVUVSWSIpOwotICAgICAgICAgICAgZXhpdCgtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFtRmlsZVBhdGhRdWVyeSkgewotICAgICAgICBtRmlsZVBhdGhRdWVyeSA9IG5ldyBTcWxpdGVTdGF0ZW1lbnQodGhpcyk7Ci0gICAgICAgIGlmICghbUZpbGVQYXRoUXVlcnktPnByZXBhcmUoRklMRV9QQVRIX1FVRVJZKSkgewotICAgICAgICAgICAgTE9HRSgiY291bGQgbm90IGNvbXBpbGUgRklMRV9QQVRIX1FVRVJZIik7Ci0gICAgICAgICAgICBleGl0KC0xKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIW1PYmplY3RJbmZvUXVlcnkpIHsKLSAgICAgICAgbU9iamVjdEluZm9RdWVyeSA9IG5ldyBTcWxpdGVTdGF0ZW1lbnQodGhpcyk7Ci0gICAgICAgIGlmICghbU9iamVjdEluZm9RdWVyeS0+cHJlcGFyZShHRVRfT0JKRUNUX0lORk9fUVVFUlkpKSB7Ci0gICAgICAgICAgICBMT0dFKCJjb3VsZCBub3QgY29tcGlsZSBHRVRfT0JKRUNUX0lORk9fUVVFUlkiKTsKLSAgICAgICAgICAgIGV4aXQoLTEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghbUZpbGVJbnNlcnRlcikgewotICAgICAgICBtRmlsZUluc2VydGVyID0gbmV3IFNxbGl0ZVN0YXRlbWVudCh0aGlzKTsKLSAgICAgICAgaWYgKCFtRmlsZUluc2VydGVyLT5wcmVwYXJlKEZJTEVfSU5TRVJUKSkgewotICAgICAgICAgICAgTE9HRSgiY291bGQgbm90IGNvbXBpbGUgRklMRV9JTlNFUlRcbiIpOwotICAgICAgICAgICAgZXhpdCgtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFtRmlsZURlbGV0ZXIpIHsKLSAgICAgICAgbUZpbGVEZWxldGVyID0gbmV3IFNxbGl0ZVN0YXRlbWVudCh0aGlzKTsKLSAgICAgICAgaWYgKCFtRmlsZURlbGV0ZXItPnByZXBhcmUoRklMRV9ERUxFVEUpKSB7Ci0gICAgICAgICAgICBMT0dFKCJjb3VsZCBub3QgY29tcGlsZSBGSUxFX0RFTEVURVxuIik7Ci0gICAgICAgICAgICBleGl0KC0xKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIW1BdWRpb0luc2VydGVyKSB7Ci0gICAgICAgIG1BdWRpb0luc2VydGVyID0gbmV3IFNxbGl0ZVN0YXRlbWVudCh0aGlzKTsKLSAgICAgICAgaWYgKCFtQXVkaW9JbnNlcnRlci0+cHJlcGFyZShBVURJT19JTlNFUlQpKSB7Ci0gICAgICAgICAgICBMT0dFKCJjb3VsZCBub3QgY29tcGlsZSBBVURJT19JTlNFUlRcbiIpOwotICAgICAgICAgICAgZXhpdCgtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFtQXVkaW9EZWxldGVyKSB7Ci0gICAgICAgIG1BdWRpb0RlbGV0ZXIgPSBuZXcgU3FsaXRlU3RhdGVtZW50KHRoaXMpOwotICAgICAgICBpZiAoIW1BdWRpb0RlbGV0ZXItPnByZXBhcmUoQVVESU9fREVMRVRFKSkgewotICAgICAgICAgICAgTE9HRSgiY291bGQgbm90IGNvbXBpbGUgQVVESU9fREVMRVRFXG4iKTsKLSAgICAgICAgICAgIGV4aXQoLTEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQzMl90IE10cERhdGFiYXNlOjpnZXRUYWJsZUZvckZpbGUoTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgewotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9BSUZGOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfV0FWOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfTVAzOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfRkxBQzoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTzoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX1dNQToKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX09HRzoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX0FBQzoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX0FVRElCTEU6Ci0gICAgICAgICAgICByZXR1cm4ga09iamVjdEhhbmRsZVRhYmxlQXVkaW87Ci0gICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9BVkk6Ci0gICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9NUEVHOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQVNGOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfV01WOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfTVA0X0NPTlRBSU5FUjoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX01QMjoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUXzNHUF9DT05UQUlORVI6Ci0gICAgICAgICAgICByZXR1cm4ga09iamVjdEhhbmRsZVRhYmxlVmlkZW87Ci0gICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9ERUZJTkVEOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfRVhJRl9KUEVHOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfVElGRl9FUDoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX0ZMQVNIUElYOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQk1QOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQ0lGRjoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX0dJRjoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX0pGSUY6Ci0gICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9DRDoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX1BJQ1Q6Ci0gICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9QTkc6Ci0gICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9USUZGOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfVElGRl9JVDoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX0pQMjoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX0pQWDoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX1dJTkRPV1NfSU1BR0VfRk9STUFUOgotICAgICAgICAgICAgcmV0dXJuIGtPYmplY3RIYW5kbGVUYWJsZUltYWdlOwotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1Q6Ci0gICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVDoKLSAgICAgICAgY2FzZSBNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX1BMQVlMSVNUOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfV1BMX1BMQVlMSVNUOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfTTNVX1BMQVlMSVNUOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfTVBMX1BMQVlMSVNUOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQVNYX1BMQVlMSVNUOgotICAgICAgICBjYXNlIE1UUF9GT1JNQVRfUExTX1BMQVlMSVNUOgotICAgICAgICAgICAgcmV0dXJuIGtPYmplY3RIYW5kbGVUYWJsZVBsYXlsaXN0OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGtPYmplY3RIYW5kbGVUYWJsZUZpbGU7Ci0gICAgfQotfQotCi1NdHBPYmplY3RIYW5kbGUgTXRwRGF0YWJhc2U6OmdldE9iamVjdEhhbmRsZShjb25zdCBjaGFyKiBwYXRoKSB7Ci0gICAgbUZpbGVJZFF1ZXJ5LT5yZXNldCgpOwotICAgIG1GaWxlSWRRdWVyeS0+YmluZCgxLCBwYXRoKTsKLSAgICBpZiAobUZpbGVJZFF1ZXJ5LT5zdGVwKCkpIHsKLSAgICAgICAgaW50IHJvdyA9IG1GaWxlSWRRdWVyeS0+Z2V0Q29sdW1uSW50KDApOwotICAgICAgICBpZiAocm93ID4gMCkgewotICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1GaWxlSWRRdWVyeS0+Z2V0Q29sdW1uSW50KDEpOwotICAgICAgICAgICAgcm93IHw9IGdldFRhYmxlRm9yRmlsZShmb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1NdHBPYmplY3RIYW5kbGUgTXRwRGF0YWJhc2U6OmFkZEZpbGUoY29uc3QgY2hhciogcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IG1vZGlmaWVkKSB7Ci0gICAgbUZpbGVJbnNlcnRlci0+YmluZChGSUxFX1BBVEhfQ09MVU1OLCBwYXRoKTsKLSAgICBtRmlsZUluc2VydGVyLT5iaW5kKEZJTEVfRk9STUFUX0NPTFVNTiwgZm9ybWF0KTsKLSAgICBtRmlsZUluc2VydGVyLT5iaW5kKEZJTEVfUEFSRU5UX0NPTFVNTiwgcGFyZW50KTsKLSAgICBtRmlsZUluc2VydGVyLT5iaW5kKEZJTEVfU1RPUkFHRV9DT0xVTU4sIHN0b3JhZ2UpOwotICAgIG1GaWxlSW5zZXJ0ZXItPmJpbmQoRklMRV9TSVpFX0NPTFVNTiwgc2l6ZSk7Ci0gICAgbUZpbGVJbnNlcnRlci0+YmluZChGSUxFX01PRElGSUVEX0NPTFVNTiwgbW9kaWZpZWQpOwotICAgIG1GaWxlSW5zZXJ0ZXItPnN0ZXAoKTsKLSAgICBtRmlsZUluc2VydGVyLT5yZXNldCgpOwotICAgIGludCByZXN1bHQgPSBsYXN0SW5zZXJ0ZWRSb3coKTsKLSAgICByZXR1cm4gKHJlc3VsdCA8PSAwID8ga0ludmFsaWRPYmplY3RIYW5kbGUgOiByZXN1bHQpOwotfQotCi1NdHBPYmplY3RIYW5kbGUgTXRwRGF0YWJhc2U6OmFkZEF1ZGlvRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7Ci0gICAgbUF1ZGlvSW5zZXJ0ZXItPmJpbmQoQVVESU9fSURfQ09MVU1OLCBoYW5kbGUpOwotICAgIG1BdWRpb0luc2VydGVyLT5zdGVwKCk7Ci0gICAgbUF1ZGlvSW5zZXJ0ZXItPnJlc2V0KCk7Ci0gICAgaW50IHJlc3VsdCA9IGxhc3RJbnNlcnRlZFJvdygpOwotICAgIGhhbmRsZSB8PSBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbzsKLSAgICByZXR1cm4gKHJlc3VsdCA+IDAgPyBoYW5kbGUgOiBrSW52YWxpZE9iamVjdEhhbmRsZSk7Ci19Ci0KLU10cE9iamVjdEhhbmRsZSBNdHBEYXRhYmFzZTo6YWRkQXVkaW9GaWxlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0aXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFydGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFsYnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWxidW1BcnRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBnZW5yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeWVhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbikgewotICAgIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX0lEX0NPTFVNTiwgaGFuZGxlKTsKLSAgICBpZiAodGl0bGUpIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX1RJVExFX0NPTFVNTiwgdGl0bGUpOwotICAgIGlmIChhcnRpc3QpIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX0FSVElTVF9DT0xVTU4sIGFydGlzdCk7Ci0gICAgaWYgKGFsYnVtKSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19BTEJVTV9DT0xVTU4sIGFsYnVtKTsKLSAgICBpZiAoYWxidW1BcnRpc3QpIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX0FMQlVNX0FSVElTVF9DT0xVTU4sIGFsYnVtQXJ0aXN0KTsKLSAgICBpZiAoZ2VucmUpIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX0dFTlJFX0NPTFVNTiwgZ2VucmUpOwotICAgIGlmIChjb21wb3NlcikgbUF1ZGlvSW5zZXJ0ZXItPmJpbmQoQVVESU9fQ09NUE9TRVJfQ09MVU1OLCBjb21wb3Nlcik7Ci0gICAgaWYgKHRyYWNrKSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19UUkFDS19OVU1CRVJfQ09MVU1OLCB0cmFjayk7Ci0gICAgaWYgKHllYXIpIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX1lFQVJfQ09MVU1OLCB5ZWFyKTsKLSAgICBpZiAoZHVyYXRpb24pIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX0RVUkFUSU9OX0NPTFVNTiwgZHVyYXRpb24pOwotICAgIG1BdWRpb0luc2VydGVyLT5zdGVwKCk7Ci0gICAgbUF1ZGlvSW5zZXJ0ZXItPnJlc2V0KCk7Ci0gICAgaW50IHJlc3VsdCA9IGxhc3RJbnNlcnRlZFJvdygpOwotICAgIGlmIChyZXN1bHQgPD0gMCkKLSAgICAgICAgcmV0dXJuIGtJbnZhbGlkT2JqZWN0SGFuZGxlOwotICAgIHJlc3VsdCB8PSBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbzsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1NdHBPYmplY3RIYW5kbGVMaXN0KiBNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpIHsKLSAgICBib29sICAgICAgICAgICAgICAgIHdoZXJlU3RvcmFnZSA9IChzdG9yYWdlSUQgIT0gMHhGRkZGRkZGRik7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICB3aGVyZUZvcm1hdCA9IChmb3JtYXQgIT0gMCk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICB3aGVyZVBhcmVudCA9IChwYXJlbnQgIT0gMCk7Ci0gICAgY2hhciAgICAgICAgICAgICAgICBpbnRCdWZmZXJbMjBdOwotCi0gICAgTXRwU3RyaW5nICBxdWVyeSgiU0VMRUNUIF9pZCxmb3JtYXQgRlJPTSBmaWxlcyIpOwotICAgIGlmICh3aGVyZVN0b3JhZ2UgfHwgd2hlcmVGb3JtYXQgfHwgd2hlcmVQYXJlbnQpCi0gICAgICAgIHF1ZXJ5ICs9ICIgV0hFUkUiOwotICAgIGlmICh3aGVyZVN0b3JhZ2UpIHsKLSAgICAgICAgc25wcmludGYoaW50QnVmZmVyLCBzaXplb2YoaW50QnVmZmVyKSwgIiVkIiwgc3RvcmFnZUlEKTsKLSAgICAgICAgcXVlcnkgKz0gIiBzdG9yYWdlID0gIjsKLSAgICAgICAgcXVlcnkgKz0gaW50QnVmZmVyOwotICAgIH0KLSAgICBpZiAod2hlcmVGb3JtYXQpIHsKLSAgICAgICAgc25wcmludGYoaW50QnVmZmVyLCBzaXplb2YoaW50QnVmZmVyKSwgIiVkIiwgZm9ybWF0KTsKLSAgICAgICAgaWYgKHdoZXJlU3RvcmFnZSkKLSAgICAgICAgICAgIHF1ZXJ5ICs9ICIgQU5EIjsKLSAgICAgICAgcXVlcnkgKz0gIiBmb3JtYXQgPSAiOwotICAgICAgICBxdWVyeSArPSBpbnRCdWZmZXI7Ci0gICAgfQotICAgIGlmICh3aGVyZVBhcmVudCkgewotICAgICAgICBpZiAocGFyZW50ICE9IE1UUF9QQVJFTlRfUk9PVCkKLSAgICAgICAgICAgIHBhcmVudCAmPSBrT2JqZWN0SGFuZGxlSW5kZXhNYXNrOwotICAgICAgICBzbnByaW50ZihpbnRCdWZmZXIsIHNpemVvZihpbnRCdWZmZXIpLCAiJWQiLCBwYXJlbnQpOwotICAgICAgICBpZiAod2hlcmVTdG9yYWdlIHx8IHdoZXJlRm9ybWF0KQotICAgICAgICAgICAgcXVlcnkgKz0gIiBBTkQiOwotICAgICAgICBxdWVyeSArPSAiIHBhcmVudCA9ICI7Ci0gICAgICAgIHF1ZXJ5ICs9IGludEJ1ZmZlcjsKLSAgICB9Ci0gICAgcXVlcnkgKz0gIjsiOwotCi0gICAgU3FsaXRlU3RhdGVtZW50IHN0bXQodGhpcyk7Ci0gICAgTE9HVigiJXMiLCAoY29uc3QgY2hhciAqKXF1ZXJ5KTsKLSAgICBzdG10LnByZXBhcmUocXVlcnkpOwotCi0gICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7Ci0gICAgd2hpbGUgKCFzdG10LmlzRG9uZSgpKSB7Ci0gICAgICAgIGlmIChzdG10LnN0ZXAoKSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gc3RtdC5nZXRDb2x1bW5JbnQoMCk7Ci0gICAgICAgICAgICBMT0dWKCJzdG10LmdldENvbHVtbkludCByZXR1cm5lZCAlZCIsIGluZGV4KTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gc3RtdC5nZXRDb2x1bW5JbnQoMSk7Ci0gICAgICAgICAgICAgICAgaW5kZXggfD0gZ2V0VGFibGVGb3JGaWxlKGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbGlzdC0+cHVzaChpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTE9HVigibGlzdCBzaXplOiAlZCIsIGxpc3QtPnNpemUoKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci19Ci0KLQotTXRwUmVzcG9uc2VDb2RlIE10cERhdGFiYXNlOjpnZXRPYmplY3RQcm9wZXJ0eShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKLSAgICBpbnQgICAgICAgICB0eXBlOwotICAgIGNvbnN0IGNoYXIqIGNvbHVtbk5hbWU7Ci0gICAgY2hhciAgICAgICAgaW50QnVmZmVyWzIwXTsKLQotICAgIGlmIChoYW5kbGUgIT0gTVRQX1BBUkVOVF9ST09UKQotICAgICAgICBoYW5kbGUgJj0ga09iamVjdEhhbmRsZUluZGV4TWFzazsKLQotICAgIGlmICghZ2V0UHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlLCBjb2x1bW5OYW1lKSkKLSAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREU7Ci0gICAgc25wcmludGYoaW50QnVmZmVyLCBzaXplb2YoaW50QnVmZmVyKSwgIiVkIiwgaGFuZGxlKTsKLQotICAgIE10cFN0cmluZyAgcXVlcnkoIlNFTEVDVCAiKTsKLSAgICBxdWVyeSArPSBjb2x1bW5OYW1lOwotICAgIHF1ZXJ5ICs9ICIgRlJPTSBmaWxlcyBXSEVSRSBfaWQgPSAiOwotICAgIHF1ZXJ5ICs9IGludEJ1ZmZlcjsKLSAgICBxdWVyeSArPSAiOyI7Ci0KLSAgICBTcWxpdGVTdGF0ZW1lbnQgc3RtdCh0aGlzKTsKLSAgICBMT0dWKCIlcyIsIChjb25zdCBjaGFyICopcXVlcnkpOwotICAgIHN0bXQucHJlcGFyZShxdWVyeSk7Ci0KLSAgICBpZiAoIXN0bXQuc3RlcCgpKQotICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6Ci0gICAgICAgICAgICBwYWNrZXQucHV0SW50OChzdG10LmdldENvbHVtbkludCgwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKLSAgICAgICAgICAgIHBhY2tldC5wdXRVSW50OChzdG10LmdldENvbHVtbkludCgwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKLSAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxNihzdG10LmdldENvbHVtbkludCgwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6Ci0gICAgICAgICAgICBwYWNrZXQucHV0VUludDE2KHN0bXQuZ2V0Q29sdW1uSW50KDApKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgotICAgICAgICAgICAgcGFja2V0LnB1dEludDMyKHN0bXQuZ2V0Q29sdW1uSW50KDApKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKLSAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MzIoc3RtdC5nZXRDb2x1bW5JbnQoMCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6Ci0gICAgICAgICAgICBwYWNrZXQucHV0SW50NjQoc3RtdC5nZXRDb2x1bW5JbnQ2NCgwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6Ci0gICAgICAgICAgICBwYWNrZXQucHV0VUludDY0KHN0bXQuZ2V0Q29sdW1uSW50NjQoMCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgotICAgICAgICAgICAgcGFja2V0LnB1dFN0cmluZyhzdG10LmdldENvbHVtblN0cmluZygwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR0UoInVuc3VwcG9ydGVkIG9iamVjdCB0eXBlXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOwotICAgIH0KLSAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOwotfQotCi1NdHBSZXNwb25zZUNvZGUgTXRwRGF0YWJhc2U6OmdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKLSAgICBjaGFyICAgIGRhdGVbMjBdOwotCi0gICAgaWYgKGhhbmRsZSAhPSBNVFBfUEFSRU5UX1JPT1QpCi0gICAgICAgIGhhbmRsZSAmPSBrT2JqZWN0SGFuZGxlSW5kZXhNYXNrOwotCi0gICAgbU9iamVjdEluZm9RdWVyeS0+cmVzZXQoKTsKLSAgICBtT2JqZWN0SW5mb1F1ZXJ5LT5iaW5kKDEsIGhhbmRsZSk7Ci0gICAgaWYgKCFtT2JqZWN0SW5mb1F1ZXJ5LT5zdGVwKCkpCi0gICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOwotCi0gICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1PYmplY3RJbmZvUXVlcnktPmdldENvbHVtbkludCgwKTsKLSAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbU9iamVjdEluZm9RdWVyeS0+Z2V0Q29sdW1uSW50KDEpOwotICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtT2JqZWN0SW5mb1F1ZXJ5LT5nZXRDb2x1bW5JbnQoMik7Ci0gICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gcGF0aC4gIGRvIHdlIHdhbnQgYSBzZXBhcmF0ZSBkYXRhYmFzZSBlbnRyeSBmb3IgdGhpcz8KLSAgICBjb25zdCBjaGFyKiBuYW1lID0gbU9iamVjdEluZm9RdWVyeS0+Z2V0Q29sdW1uU3RyaW5nKDMpOwotICAgIGNvbnN0IGNoYXIqIGxhc3RTbGFzaCA9IHN0cnJjaHIobmFtZSwgJy8nKTsKLSAgICBpZiAobGFzdFNsYXNoKQotICAgICAgICBuYW1lID0gbGFzdFNsYXNoICsgMTsKLSAgICBpbnQ2NF90IHNpemUgPSBtT2JqZWN0SW5mb1F1ZXJ5LT5nZXRDb2x1bW5JbnQ2NCg0KTsKLSAgICB0aW1lX3QgbW9kaWZpZWQgPSBtT2JqZWN0SW5mb1F1ZXJ5LT5nZXRDb2x1bW5JbnQoNSk7Ci0gICAgaW50IGFzc29jaWF0aW9uVHlwZSA9IChmb3JtYXQgPT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRQX0FTU09DSUFUSU9OX1RZUEVfR0VORVJJQ19GT0xERVIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UUF9BU1NPQ0lBVElPTl9UWVBFX1VOREVGSU5FRCk7Ci0KLSAgICBMT0dWKCJzdG9yYWdlSUQ6ICVkLCBmb3JtYXQ6ICVkLCBwYXJlbnQ6ICVkIiwgc3RvcmFnZUlELCBmb3JtYXQsIHBhcmVudCk7Ci0KLSAgICBwYWNrZXQucHV0VUludDMyKHN0b3JhZ2VJRCk7Ci0gICAgcGFja2V0LnB1dFVJbnQxNihmb3JtYXQpOwotICAgIHBhY2tldC5wdXRVSW50MTYoMCk7ICAgLy8gcHJvdGVjdGlvbiBzdGF0dXMKLSAgICBwYWNrZXQucHV0VUludDMyKChzaXplID4gMHhGRkZGRkZGRkxMID8gMHhGRkZGRkZGRiA6IHNpemUpKTsKLSAgICBwYWNrZXQucHV0VUludDE2KDApOyAgIC8vIHRodW1iIGZvcm1hdAotICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgY29tcHJlc3NlZCBzaXplCi0gICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBwaXggd2lkdGgKLSAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIHBpeCBoZWlnaHQKLSAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIHBpeCB3aWR0aAotICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gaW1hZ2UgcGl4IGhlaWdodAotICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gaW1hZ2UgYml0IGRlcHRoCi0gICAgcGFja2V0LnB1dFVJbnQzMihwYXJlbnQpOwotICAgIHBhY2tldC5wdXRVSW50MTYoYXNzb2NpYXRpb25UeXBlKTsKLSAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGFzc29jaWF0aW9uIGRlc2MKLSAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHNlcXVlbmNlIG51bWJlcgotICAgIHBhY2tldC5wdXRTdHJpbmcobmFtZSk7ICAgLy8gZmlsZSBuYW1lCi0gICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7Ci0gICAgZm9ybWF0RGF0ZVRpbWUobW9kaWZpZWQsIGRhdGUsIHNpemVvZihkYXRlKSk7Ci0gICAgcGFja2V0LnB1dFN0cmluZyhkYXRlKTsgICAvLyBkYXRlIG1vZGlmaWVkCi0gICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7ICAgLy8ga2V5d29yZHMKLQotICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Ci19Ci0KLWJvb2wgTXRwRGF0YWJhc2U6OmdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgZmlsZUxlbmd0aCkgewotICAgIGlmIChoYW5kbGUgIT0gTVRQX1BBUkVOVF9ST09UKQotICAgICAgICBoYW5kbGUgJj0ga09iamVjdEhhbmRsZUluZGV4TWFzazsKLSAgICBtRmlsZVBhdGhRdWVyeS0+cmVzZXQoKTsKLSAgICBtRmlsZVBhdGhRdWVyeS0+YmluZCgxLCBoYW5kbGUpOwotICAgIGlmICghbUZpbGVQYXRoUXVlcnktPnN0ZXAoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY29uc3QgY2hhciogcGF0aCA9IG1GaWxlUGF0aFF1ZXJ5LT5nZXRDb2x1bW5TdHJpbmcoMCk7Ci0gICAgaWYgKCFwYXRoKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZmlsZVBhdGggPSBwYXRoOwotICAgIGZpbGVMZW5ndGggPSBtRmlsZVBhdGhRdWVyeS0+Z2V0Q29sdW1uSW50NjQoMSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTXRwRGF0YWJhc2U6OmRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgewotICAgIHVpbnQzMl90IHRhYmxlID0gaGFuZGxlICYga09iamVjdEhhbmRsZVRhYmxlTWFzazsKLSAgICBoYW5kbGUgJj0ga09iamVjdEhhbmRsZUluZGV4TWFzazsKLSAgICBtRmlsZURlbGV0ZXItPmJpbmQoMSwgaGFuZGxlKTsKLSAgICBtRmlsZURlbGV0ZXItPnN0ZXAoKTsKLSAgICBtRmlsZURlbGV0ZXItPnJlc2V0KCk7Ci0gICAgaWYgKHRhYmxlID09IGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvKSB7Ci0gICAgICAgIG1BdWRpb0RlbGV0ZXItPmJpbmQoMSwgaGFuZGxlKTsKLSAgICAgICAgbUF1ZGlvRGVsZXRlci0+c3RlcCgpOwotICAgICAgICBtQXVkaW9EZWxldGVyLT5yZXNldCgpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1NdHBPYmplY3RIYW5kbGUqIE10cERhdGFiYXNlOjpnZXRGaWxlTGlzdChpbnQmIG91dENvdW50KSB7Ci0gICAgTXRwT2JqZWN0SGFuZGxlKiByZXN1bHQgPSBOVUxMOwotICAgIGludCBjb3VudCA9IDA7Ci0gICAgU3FsaXRlU3RhdGVtZW50IHN0bXQodGhpcyk7Ci0gICAgc3RtdC5wcmVwYXJlKCJTRUxFQ1QgY291bnQoKikgRlJPTSBmaWxlczsiKTsKLQotICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0SGFuZGxlTGlzdCgpOwotICAgIGlmIChzdG10LnN0ZXAoKSkKLSAgICAgICAgY291bnQgPSBzdG10LmdldENvbHVtbkludCgwKTsKLQotICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IE10cE9iamVjdEhhbmRsZVtjb3VudF07Ci0gICAgICAgIG1lbXNldChyZXN1bHQsIDAsIGNvdW50ICogc2l6ZW9mKCpyZXN1bHQpKTsKLSAgICAgICAgU3FsaXRlU3RhdGVtZW50IHN0bXQyKHRoaXMpOwotICAgICAgICBzdG10Mi5wcmVwYXJlKCJTRUxFQ1QgX2lkLGZvcm1hdCBGUk9NIGZpbGVzOyIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKCFzdG10Mi5zdGVwKCkpIHsKLSAgICAgICAgICAgICAgICBMT0dXKCJnZXRGaWxlTGlzdCBlbmRlZCBlYXJseSIpOwotICAgICAgICAgICAgICAgIGNvdW50ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBzdG10Mi5nZXRDb2x1bW5JbnQoMCk7Ci0gICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gc3RtdDIuZ2V0Q29sdW1uSW50KDEpOwotICAgICAgICAgICAgaGFuZGxlIHw9IGdldFRhYmxlRm9yRmlsZShmb3JtYXQpOwotICAgICAgICAgICAgcmVzdWx0W2ldID0gaGFuZGxlOwotICAgICAgICB9Ci0gICAgfQotICAgIG91dENvdW50ID0gY291bnQ7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAgICBmb3IgZ2V0T2JqZWN0UHJvcERlc2MKLQotICAgIHBhY2tldC5wdXRVSW50MTYocHJvcGVydHkpOwotICAgIHBhY2tldC5wdXRVSW50MTYoZGF0YVR5cGUpOwotICAgIHBhY2tldC5wdXRVSW50OChnZXRTZXQpOwotICAgIC8vIGRlZmF1bHQgdmFsdWUgRFRTCi0gICAgcGFja2V0LnB1dFVJbnQzMihncm91cENvZGUpOwotICAgIHBhY2tldC5wdXRVSW50OChmb3JtRmxhZyk7Ci0gICAgLy8gZm9ybSwgdmFyaWFibGUKLSovCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaCBiL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCmluZGV4IDUxZDVmYjEuLjdmZWIzZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCisrKyBiL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCkBAIC0xOCw3MCArMTgsNTAgQEAKICNkZWZpbmUgX01UUF9EQVRBQkFTRV9ICiAKICNpbmNsdWRlICJNdHBUeXBlcy5oIgotI2luY2x1ZGUgIlNxbGl0ZURhdGFiYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTXRwRGF0YVBhY2tldDsKLWNsYXNzIFNxbGl0ZVN0YXRlbWVudDsKIAotY2xhc3MgTXRwRGF0YWJhc2UgOiBwdWJsaWMgU3FsaXRlRGF0YWJhc2UgewotcHJpdmF0ZToKLSAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtRmlsZUlkUXVlcnk7Ci0gICAgU3FsaXRlU3RhdGVtZW50KiAgICAgICAgbUZpbGVQYXRoUXVlcnk7Ci0gICAgU3FsaXRlU3RhdGVtZW50KiAgICAgICAgbU9iamVjdEluZm9RdWVyeTsKLSAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtRmlsZUluc2VydGVyOwotICAgIFNxbGl0ZVN0YXRlbWVudCogICAgICAgIG1GaWxlRGVsZXRlcjsKLSAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtQXVkaW9JbnNlcnRlcjsKLSAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtQXVkaW9EZWxldGVyOwotCitjbGFzcyBNdHBEYXRhYmFzZSB7CiBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YWJhc2UoKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwRGF0YWJhc2UoKTsKKyAgICB2aXJ0dWFsIH5NdHBEYXRhYmFzZSgpIHt9CiAKLSAgICBzdGF0aWMgdWludDMyX3QgICAgICAgICBnZXRUYWJsZUZvckZpbGUoTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCk7CisgICAgLy8gY2FsbGVkIGZyb20gU2VuZE9iamVjdEluZm8gdG8gcmVzZXJ2ZSBhIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgaW5jb21pbmcgZmlsZQorICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgYmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgbW9kaWZpZWQpID0gMDsKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG9wZW4oY29uc3QgY2hhciogcGF0aCwgYm9vbCBjcmVhdGUpOwotICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGdldE9iamVjdEhhbmRsZShjb25zdCBjaGFyKiBwYXRoKTsKLSAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBhZGRGaWxlKGNvbnN0IGNoYXIqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCk7CisgICAgLy8gY2FsbGVkIHRvIHJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIFNlbmRPYmplY3QgZmlsZSB0cmFuc2ZlcgorICAgIC8vIHN1Y2Nlc3Mgc2hvdWxkIHNpZ25hbCBhIG5vdGlmaWNhdGlvbiBvZiB0aGUgbmV3IG9iamVjdCdzIGNyZWF0aW9uLAorICAgIC8vIGZhaWx1cmUgc2hvdWxkIHJlbW92ZSB0aGUgZGF0YWJhc2UgZW50cnkgY3JlYXRlZCBpbiBiZWdpblNlbmRPYmplY3QKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZFNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZWVkZWQpID0gMDsKIAotICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGFkZEF1ZGlvRmlsZShNdHBPYmplY3RIYW5kbGUgaWQpOworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSA9IDA7CiAKLSAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBhZGRBdWRpb0ZpbGUoTXRwT2JqZWN0SGFuZGxlIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcnRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhbGJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFsYnVtQXJ0aXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZ2VucmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21wb3NlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb24pOworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0UHJvcGVydHkoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOwogCi0gICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpOworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKIAotICAgIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKSA9IDA7CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKIAotICAgIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7Ci0KLSAgICBib29sICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nJiBmaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIGZpbGVMZW5ndGgpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7Ci0KLSAgICAvLyBoZWxwZXIgZm9yIG1lZGlhIHNjYW5uZXIKLSAgICBNdHBPYmplY3RIYW5kbGUqICAgICAgICBnZXRGaWxlTGlzdChpbnQmIG91dENvdW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24oKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBjb21taXRUcmFuc2FjdGlvbigpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrVHJhbnNhY3Rpb24oKSA9IDA7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxNzYxZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5jcHAKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRXZlbnRQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpbmNsdWRlIDxmX210cC5oPgorCisjaW5jbHVkZSAiTXRwRXZlbnRQYWNrZXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBFdmVudFBhY2tldDo6TXRwRXZlbnRQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKQoreworfQorCitNdHBFdmVudFBhY2tldDo6fk10cEV2ZW50UGFja2V0KCkgeworfQorCisjaWZkZWYgTVRQX0RFVklDRQoraW50IE10cEV2ZW50UGFja2V0Ojp3cml0ZShpbnQgZmQpIHsKKyAgICBzdHJ1Y3QgbXRwX2V2ZW50ICAgIGV2ZW50OworCisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfRVZFTlQpOworCisgICAgZXZlbnQuZGF0YSA9IG1CdWZmZXI7CisgICAgZXZlbnQubGVuZ3RoID0gbVBhY2tldFNpemU7CisgICAgaW50IHJldCA9IDo6aW9jdGwoZmQsIE1UUF9TRU5EX0VWRU5ULCAodW5zaWduZWQgbG9uZykmZXZlbnQpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAoraW50IE10cEV2ZW50UGFja2V0OjpyZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaCBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWU4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0VWRU5UX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfRVZFTlRfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cEV2ZW50UGFja2V0IDogcHVibGljIE10cFBhY2tldCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cEV2ZW50UGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwRXZlbnRQYWNrZXQoKTsKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyB3cml0ZSBvdXIgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShpbnQgZmQpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisjZW5kaWYKKworICAgIGlubGluZSBNdHBFdmVudENvZGUgICAgIGdldEV2ZW50Q29kZSgpIGNvbnN0IHsgcmV0dXJuIGdldENvbnRhaW5lckNvZGUoKTsgfQorICAgIGlubGluZSB2b2lkICAgICAgICAgICAgIHNldEV2ZW50Q29kZShNdHBFdmVudENvZGUgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc2V0Q29udGFpbmVyQ29kZShjb2RlKTsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfRVZFTlRfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbXRwL010cE1lZGlhU2Nhbm5lci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNGMwY2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbXRwL010cE1lZGlhU2Nhbm5lci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTXRwTWVkaWFTY2FubmVyIgotCi0jaW5jbHVkZSAiTXRwRGVidWcuaCIKLSNpbmNsdWRlICJNdHBEYXRhYmFzZS5oIgotI2luY2x1ZGUgIk10cE1lZGlhU2Nhbm5lci5oIgotI2luY2x1ZGUgIm10cC5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvbWVkaWFzY2FubmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNdHBNZWRpYVNjYW5uZXJDbGllbnQgOiBwdWJsaWMgTWVkaWFTY2FubmVyQ2xpZW50Ci17Ci1wdWJsaWM6Ci0gICAgTXRwTWVkaWFTY2FubmVyQ2xpZW50KCkKLSAgICB7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+TXRwTWVkaWFTY2FubmVyQ2xpZW50KCkKLSAgICB7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRlZCwgZmFsc2UgaWYgYW4gZXhjZXB0aW9uIG9jY3VyZWQgaW4gdGhlIEphdmEgY29kZQotICAgIHZpcnR1YWwgYm9vbCBzY2FuRmlsZShjb25zdCBjaGFyKiBwYXRoLCBsb25nIGxvbmcgbGFzdE1vZGlmaWVkLCBsb25nIGxvbmcgZmlsZVNpemUpCi0gICAgewotICAgICAgICBMT0dWKCJzY2FuRmlsZSAlcyIsIHBhdGgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBmYWxzZSBpZiBhbiBleGNlcHRpb24gb2NjdXJlZCBpbiB0aGUgSmF2YSBjb2RlCi0gICAgdmlydHVhbCBib29sIGhhbmRsZVN0cmluZ1RhZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGludCB0ZW1wOwotCi0gICAgICAgIGlmICghc3RyY21wKG5hbWUsICJ0aXRsZSIpKSB7Ci0gICAgICAgICAgICBtVGl0bGUgPSB2YWx1ZTsKLSAgICAgICAgICAgIG1IYXNUaXRsZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAgKCFzdHJjbXAobmFtZSwgImFydGlzdCIpKSB7Ci0gICAgICAgICAgICBtQXJ0aXN0ID0gdmFsdWU7Ci0gICAgICAgICAgICBtSGFzQXJ0aXN0ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICAoIXN0cmNtcChuYW1lLCAiYWxidW0iKSkgewotICAgICAgICAgICAgbUFsYnVtID0gdmFsdWU7Ci0gICAgICAgICAgICBtSGFzQWxidW0gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJhbGJ1bWFydGlzdCIpKSB7Ci0gICAgICAgICAgICBtQWxidW1BcnRpc3QgPSB2YWx1ZTsKLSAgICAgICAgICAgIG1IYXNBbGJ1bUFydGlzdCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAgKCFzdHJjbXAobmFtZSwgImdlbnJlIikpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FIC0gaGFuZGxlIG51bWVyaWMgdmFsdWVzIGhlcmUKLSAgICAgICAgICAgIG1HZW5yZSA9IHZhbHVlOwotICAgICAgICAgICAgbUhhc0dlbnJlID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICAoIXN0cmNtcChuYW1lLCAiY29tcG9zZXIiKSkgewotICAgICAgICAgICAgbUNvbXBvc2VyID0gdmFsdWU7Ci0gICAgICAgICAgICBtSGFzQ29tcG9zZXIgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJ0cmFja251bWJlciIpKSB7Ci0gICAgICAgICAgICBpZiAoc3NjYW5mKHZhbHVlLCAiJWQiLCAmdGVtcCkgPT0gMSkKLSAgICAgICAgICAgICAgICBtVHJhY2sgPSB0ZW1wOwotICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJkaXNjbnVtYmVyIikpIHsKLSAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1bnVzZWQKLSAgICAgICAgfSBlbHNlIGlmICAoIXN0cmNtcChuYW1lLCAieWVhciIpIHx8ICFzdHJjbXAobmFtZSwgImRhdGUiKSkgewotICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiVkIiwgJnRlbXApID09IDEpCi0gICAgICAgICAgICAgICAgbVllYXIgPSB0ZW1wOwotICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJkdXJhdGlvbiIpKSB7Ci0gICAgICAgICAgICBpZiAoc3NjYW5mKHZhbHVlLCAiJWQiLCAmdGVtcCkgPT0gMSkKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSB0ZW1wOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HVigiaGFuZGxlU3RyaW5nVGFnICVzIDogJXMiLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRlZCwgZmFsc2UgaWYgYW4gZXhjZXB0aW9uIG9jY3VyZWQgaW4gdGhlIEphdmEgY29kZQotICAgIHZpcnR1YWwgYm9vbCBzZXRNaW1lVHlwZShjb25zdCBjaGFyKiBtaW1lVHlwZSkKLSAgICB7Ci0gICAgICAgIG1NaW1lVHlwZSA9IG1pbWVUeXBlOwotICAgICAgICBtSGFzTWltZVR5cGUgPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBmYWxzZSBpZiBhbiBleGNlcHRpb24gb2NjdXJlZCBpbiB0aGUgSmF2YSBjb2RlCi0gICAgdmlydHVhbCBib29sIGFkZE5vTWVkaWFGb2xkZXIoY29uc3QgY2hhciogcGF0aCkKLSAgICB7Ci0gICAgICAgIExPR1YoImFkZE5vTWVkaWFGb2xkZXIgJXMiLCBwYXRoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICBtSGFzVGl0bGUgPSBmYWxzZTsKLSAgICAgICAgbUhhc0FydGlzdCA9IGZhbHNlOwotICAgICAgICBtSGFzQWxidW0gPSBmYWxzZTsKLSAgICAgICAgbUhhc0FsYnVtQXJ0aXN0ID0gZmFsc2U7Ci0gICAgICAgIG1IYXNHZW5yZSA9IGZhbHNlOwotICAgICAgICBtSGFzQ29tcG9zZXIgPSBmYWxzZTsKLSAgICAgICAgbUhhc01pbWVUeXBlID0gZmFsc2U7Ci0gICAgICAgIG1UcmFjayA9IG1ZZWFyID0gbUR1cmF0aW9uID0gMDsKLSAgICB9Ci0KLSAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0VGl0bGUoKSBjb25zdCB7IHJldHVybiBtSGFzVGl0bGUgPyAoY29uc3QgY2hhciAqKW1UaXRsZSA6IE5VTEw7IH0KLSAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0QXJ0aXN0KCkgY29uc3QgeyByZXR1cm4gbUhhc0FydGlzdCA/IChjb25zdCBjaGFyICopbUFydGlzdCA6IE5VTEw7IH0KLSAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0QWxidW0oKSBjb25zdCB7IHJldHVybiBtSGFzQWxidW0gPyAoY29uc3QgY2hhciAqKW1BbGJ1bSA6IE5VTEw7IH0KLSAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0QWxidW1BcnRpc3QoKSBjb25zdCB7IHJldHVybiBtSGFzQWxidW1BcnRpc3QgPyAoY29uc3QgY2hhciAqKW1BbGJ1bUFydGlzdCA6IE5VTEw7IH0KLSAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0R2VucmUoKSBjb25zdCB7IHJldHVybiBtSGFzR2VucmUgPyAoY29uc3QgY2hhciAqKW1HZW5yZSA6IE5VTEw7IH0KLSAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0Q29tcG9zZXIoKSBjb25zdCB7IHJldHVybiBtSGFzQ29tcG9zZXIgPyAoY29uc3QgY2hhciAqKW1Db21wb3NlciA6IE5VTEw7IH0KLSAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0TWltZVR5cGUoKSBjb25zdCB7IHJldHVybiBtSGFzTWltZVR5cGUgPyAoY29uc3QgY2hhciAqKW1NaW1lVHlwZSA6IE5VTEw7IH0KLSAgICBpbmxpbmUgaW50IGdldFRyYWNrKCkgY29uc3QgeyByZXR1cm4gbVRyYWNrOyB9Ci0gICAgaW5saW5lIGludCBnZXRZZWFyKCkgY29uc3QgeyByZXR1cm4gbVllYXI7IH0KLSAgICBpbmxpbmUgaW50IGdldER1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUR1cmF0aW9uOyB9Ci0KLXByaXZhdGU6Ci0gICAgTXRwU3RyaW5nICAgbVRpdGxlOwotICAgIE10cFN0cmluZyAgIG1BcnRpc3Q7Ci0gICAgTXRwU3RyaW5nICAgbUFsYnVtOwotICAgIE10cFN0cmluZyAgIG1BbGJ1bUFydGlzdDsKLSAgICBNdHBTdHJpbmcgICBtR2VucmU7Ci0gICAgTXRwU3RyaW5nICAgbUNvbXBvc2VyOwotICAgIE10cFN0cmluZyAgIG1NaW1lVHlwZTsKLQotICAgIGJvb2wgICAgICAgIG1IYXNUaXRsZTsKLSAgICBib29sICAgICAgICBtSGFzQXJ0aXN0OwotICAgIGJvb2wgICAgICAgIG1IYXNBbGJ1bTsKLSAgICBib29sICAgICAgICBtSGFzQWxidW1BcnRpc3Q7Ci0gICAgYm9vbCAgICAgICAgbUhhc0dlbnJlOwotICAgIGJvb2wgICAgICAgIG1IYXNDb21wb3NlcjsKLSAgICBib29sICAgICAgICBtSGFzTWltZVR5cGU7Ci0KLSAgICBpbnQgICAgICAgICBtVHJhY2s7Ci0gICAgaW50ICAgICAgICAgbVllYXI7Ci0gICAgaW50ICAgICAgICAgbUR1cmF0aW9uOwotfTsKLQotCi1NdHBNZWRpYVNjYW5uZXI6Ok10cE1lZGlhU2Nhbm5lcihNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLCBNdHBEYXRhYmFzZSogZGIpCi0gICAgOiAgIG1TdG9yYWdlSUQoaWQpLAotICAgICAgICBtRmlsZVBhdGgoZmlsZVBhdGgpLAotICAgICAgICBtRGF0YWJhc2UoZGIpLAotICAgICAgICBtTWVkaWFTY2FubmVyKE5VTEwpLAotICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50KE5VTEwpLAotICAgICAgICBtRmlsZUxpc3QoTlVMTCksCi0gICAgICAgIG1GaWxlQ291bnQoMCkKLXsKLSAgICBtTWVkaWFTY2FubmVyID0gbmV3IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOwotICAgIG1NZWRpYVNjYW5uZXJDbGllbnQgPSBuZXcgTXRwTWVkaWFTY2FubmVyQ2xpZW50OwotfQotCi1NdHBNZWRpYVNjYW5uZXI6On5NdHBNZWRpYVNjYW5uZXIoKSB7Ci19Ci0KLWJvb2wgTXRwTWVkaWFTY2FubmVyOjpzY2FuRmlsZXMoKSB7Ci0gICAgbURhdGFiYXNlLT5iZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgbUZpbGVDb3VudCA9IDA7Ci0gICAgbUZpbGVMaXN0ID0gbURhdGFiYXNlLT5nZXRGaWxlTGlzdChtRmlsZUNvdW50KTsKLQotICAgIGludCByZXQgPSBzY2FuRGlyZWN0b3J5KG1GaWxlUGF0aCwgTVRQX1BBUkVOVF9ST09UKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUZpbGVDb3VudDsgaSsrKSB7Ci0gICAgICAgIE10cE9iamVjdEhhbmRsZSB0ZXN0ID0gbUZpbGVMaXN0W2ldOwotICAgICAgICBpZiAoISAodGVzdCAmIGtPYmplY3RIYW5kbGVNYXJrQml0KSkgewotICAgICAgICAgICAgTE9HVigiZGVsZXRlIG1pc3NpbmcgZmlsZSAlMDhYIiwgdGVzdCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UtPmRlbGV0ZUZpbGUodGVzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWxldGVbXSBtRmlsZUxpc3Q7Ci0gICAgbUZpbGVDb3VudCA9IDA7Ci0gICAgbURhdGFiYXNlLT5jb21taXRUcmFuc2FjdGlvbigpOwotICAgIHJldHVybiAocmV0ID09IDApOwotfQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgTWVkaWFGaWxlVHlwZUVudHJ5Ci17Ci0gICAgY29uc3QgY2hhciogICAgIGV4dGVuc2lvbjsKLSAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0OwotICAgIHVpbnQzMl90ICAgICAgICB0YWJsZTsKLX0gc0ZpbGVUeXBlc1tdID0KLXsKLSAgICB7ICJNUDMiLCAgICBNVFBfRk9STUFUX01QMywgICAgICAgICAgICAga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCi0gICAgeyAiTTRBIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAotICAgIHsgIldBViIsICAgIE1UUF9GT1JNQVRfV0FWLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKLSAgICB7ICJBTVIiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCi0gICAgeyAiQVdCIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAotICAgIHsgIldNQSIsICAgIE1UUF9GT1JNQVRfV01BLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKLSAgICB7ICJPR0ciLCAgICBNVFBfRk9STUFUX09HRywgICAgICAgICAgICAga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCi0gICAgeyAiT0dBIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAotICAgIHsgIkFBQyIsICAgIE1UUF9GT1JNQVRfQUFDLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKLSAgICB7ICJNSUQiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCi0gICAgeyAiTUlESSIsICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAotICAgIHsgIlhNRiIsICAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPLCBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKLSAgICB7ICJSVFRUTCIsICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCi0gICAgeyAiU01GIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAotICAgIHsgIklNWSIsICAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPLCBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKLSAgICB7ICJSVFgiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCi0gICAgeyAiT1RBIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAotICAgIHsgIk1QRUciLCAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPLCBrT2JqZWN0SGFuZGxlVGFibGVWaWRlbyAgICAgfSwKLSAgICB7ICJNUDQiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTywga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIH0sCi0gICAgeyAiTTRWIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8sIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvICAgICB9LAotICAgIHsgIjNHUCIsICAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPLCBrT2JqZWN0SGFuZGxlVGFibGVWaWRlbyAgICAgfSwKLSAgICB7ICIzR1BQIiwgICBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTywga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIH0sCi0gICAgeyAiM0cyIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8sIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvICAgICB9LAotICAgIHsgIjNHUFAyIiwgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPLCBrT2JqZWN0SGFuZGxlVGFibGVWaWRlbyAgICAgfSwKLSAgICB7ICJXTVYiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTywga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIH0sCi0gICAgeyAiQVNGIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8sIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvICAgICB9LAotICAgIHsgIkpQRyIsICAgIE1UUF9GT1JNQVRfRVhJRl9KUEVHLCAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVJbWFnZSAgICAgfSwKLSAgICB7ICJKUEVHIiwgICBNVFBfRk9STUFUX0VYSUZfSlBFRywgICAgICAga09iamVjdEhhbmRsZVRhYmxlSW1hZ2UgICAgIH0sCi0gICAgeyAiR0lGIiwgICAgTVRQX0ZPUk1BVF9HSUYsICAgICAgICAgICAgIGtPYmplY3RIYW5kbGVUYWJsZUltYWdlICAgICB9LAotICAgIHsgIlBORyIsICAgIE1UUF9GT1JNQVRfUE5HLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVJbWFnZSAgICAgfSwKLSAgICB7ICJCTVAiLCAgICBNVFBfRk9STUFUX0JNUCwgICAgICAgICAgICAga09iamVjdEhhbmRsZVRhYmxlSW1hZ2UgICAgIH0sCi0gICAgeyAiV0JNUCIsICAgTVRQX0ZPUk1BVF9CTVAsICAgICAgICAgICAgIGtPYmplY3RIYW5kbGVUYWJsZUltYWdlICAgICB9LAotICAgIHsgIk0zVSIsICAgIE1UUF9GT1JNQVRfTTNVX1BMQVlMSVNULCAgICBrT2JqZWN0SGFuZGxlVGFibGVQbGF5bGlzdCAgfSwKLSAgICB7ICJQTFMiLCAgICBNVFBfRk9STUFUX1BMU19QTEFZTElTVCwgICAga09iamVjdEhhbmRsZVRhYmxlUGxheWxpc3QgIH0sCi0gICAgeyAiV1BMIiwgICAgTVRQX0ZPUk1BVF9XUExfUExBWUxJU1QsICAgIGtPYmplY3RIYW5kbGVUYWJsZVBsYXlsaXN0ICB9LAotfTsKLQotTXRwT2JqZWN0Rm9ybWF0IE10cE1lZGlhU2Nhbm5lcjo6Z2V0RmlsZUZvcm1hdChjb25zdCBjaGFyKiBwYXRoLCB1aW50MzJfdCYgdGFibGUpCi17Ci0gICAgY29uc3QgY2hhciogZXh0ZW5zaW9uID0gc3RycmNocihwYXRoLCAnLicpOwotICAgIGlmICghZXh0ZW5zaW9uKQotICAgICAgICByZXR1cm4gTVRQX0ZPUk1BVF9VTkRFRklORUQ7Ci0gICAgZXh0ZW5zaW9uKys7IC8vIHNraXAgdGhlIGRvdAotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemVvZihzRmlsZVR5cGVzKSAvIHNpemVvZihzRmlsZVR5cGVzWzBdKTsgaSsrKSB7Ci0gICAgICAgIGlmICghc3RyY2FzZWNtcChleHRlbnNpb24sIHNGaWxlVHlwZXNbaV0uZXh0ZW5zaW9uKSkgewotICAgICAgICAgICAgdGFibGUgPSBzRmlsZVR5cGVzW2ldLnRhYmxlOwotICAgICAgICAgICAgcmV0dXJuIHNGaWxlVHlwZXNbaV0uZm9ybWF0OwotICAgICAgICB9Ci0gICAgfQotICAgIHRhYmxlID0ga09iamVjdEhhbmRsZVRhYmxlRmlsZTsKLSAgICByZXR1cm4gTVRQX0ZPUk1BVF9VTkRFRklORUQ7Ci19Ci0KLWludCBNdHBNZWRpYVNjYW5uZXI6OnNjYW5EaXJlY3RvcnkoY29uc3QgY2hhciogcGF0aCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkKLXsKLSAgICBjaGFyIGJ1ZmZlcltQQVRIX01BWF07Ci0gICAgc3RydWN0IGRpcmVudCogZW50cnk7Ci0KLSAgICB1bnNpZ25lZCBsZW5ndGggPSBzdHJsZW4ocGF0aCk7Ci0gICAgaWYgKGxlbmd0aCA+IHNpemVvZihidWZmZXIpICsgMikgewotICAgICAgICBMT0dFKCJwYXRoIHRvbyBsb25nOiAlcyIsIHBhdGgpOwotICAgIH0KLQotICAgIERJUiogZGlyID0gb3BlbmRpcihwYXRoKTsKLSAgICBpZiAoIWRpcikgewotICAgICAgICBMT0dFKCJvcGVuZGlyICVzIGZhaWxlZCwgZXJybm86ICVkIiwgcGF0aCwgZXJybm8pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc3RybmNweShidWZmZXIsIHBhdGgsIHNpemVvZihidWZmZXIpKTsKLSAgICBjaGFyKiBmaWxlU3RhcnQgPSBidWZmZXIgKyBsZW5ndGg7Ci0gICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYSB0cmFpbGluZyBzbGFzaAotICAgIGlmIChmaWxlU3RhcnRbLTFdICE9ICcvJykgewotICAgICAgICAqKGZpbGVTdGFydCsrKSA9ICcvJzsKLSAgICB9Ci0gICAgaW50IGZpbGVOYW1lTGVuZ3RoID0gc2l6ZW9mKGJ1ZmZlcikgKyBmaWxlU3RhcnQgLSBidWZmZXI7Ci0KLSAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgewotICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gZW50cnktPmRfbmFtZTsKLQotICAgICAgICAvLyBpZ25vcmUgIi4iIGFuZCAiLi4iLCBhcyB3ZWxsIGFzIGFueSBmaWxlcyBvciBkaXJlY3RvcmllcyBzdGFyaW5nIHdpdGggZG90Ci0gICAgICAgIGlmIChuYW1lWzBdID09ICcuJykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cmxlbihuYW1lKSArIDEgPiBmaWxlTmFtZUxlbmd0aCkgewotICAgICAgICAgICAgTE9HRSgicGF0aCB0b28gbG9uZyBmb3IgJXMiLCBuYW1lKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN0cmNweShmaWxlU3RhcnQsIG5hbWUpOwotCi0gICAgICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgICAgIG1lbXNldCgmc3RhdGJ1ZiwgMCwgc2l6ZW9mKHN0YXRidWYpKTsKLSAgICAgICAgc3RhdChidWZmZXIsICZzdGF0YnVmKTsKLQotICAgICAgICBpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7Ci0gICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5nZXRPYmplY3RIYW5kbGUoYnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBtYXJrRmlsZShoYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBtRGF0YWJhc2UtPmFkZEZpbGUoYnVmZmVyLCBNVFBfRk9STUFUX0FTU09DSUFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBtU3RvcmFnZUlELCAwLCBzdGF0YnVmLnN0X210aW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjYW5EaXJlY3RvcnkoYnVmZmVyLCBoYW5kbGUpOwotICAgICAgICB9IGVsc2UgaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkgewotICAgICAgICAgICAgc2NhbkZpbGUoYnVmZmVyLCBwYXJlbnQsIHN0YXRidWYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xvc2VkaXIoZGlyKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBNdHBNZWRpYVNjYW5uZXI6OnNjYW5GaWxlKGNvbnN0IGNoYXIqIHBhdGgsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsIHN0cnVjdCBzdGF0JiBzdGF0YnVmKSB7Ci0gICAgdWludDMyX3QgdGFibGU7Ci0gICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IGdldEZpbGVGb3JtYXQocGF0aCwgdGFibGUpOwotICAgIC8vIGRvbid0IHNjYW4gdW5rbm93biBmaWxlIHR5cGVzCi0gICAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX1VOREVGSU5FRCkKLSAgICAgICAgcmV0dXJuOwotICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtRGF0YWJhc2UtPmdldE9iamVjdEhhbmRsZShwYXRoKTsKLSAgICAvLyBmaXhtZSAtIHJlc2NhbiBpZiBtb2QgZGF0ZSBjaGFuZ2VkCi0gICAgaWYgKGhhbmRsZSkgewotICAgICAgICBtYXJrRmlsZShoYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1EYXRhYmFzZS0+YmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICBoYW5kbGUgPSBtRGF0YWJhc2UtPmFkZEZpbGUocGF0aCwgZm9ybWF0LCBwYXJlbnQsIG1TdG9yYWdlSUQsCi0gICAgICAgICAgICAgICAgc3RhdGJ1Zi5zdF9zaXplLCBzdGF0YnVmLnN0X210aW1lKTsKLSAgICAgICAgaWYgKGhhbmRsZSA8PSAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJhZGRGaWxlIGZhaWxlZCBpbiBNdHBNZWRpYVNjYW5uZXI6OnNjYW5GaWxlKCkiKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS0+cm9sbGJhY2tUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRhYmxlID09IGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvKSB7Ci0gICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5yZXNldCgpOwotICAgICAgICAgICAgbU1lZGlhU2Nhbm5lci0+cHJvY2Vzc0ZpbGUocGF0aCwgTlVMTCwgKm1NZWRpYVNjYW5uZXJDbGllbnQpOwotICAgICAgICAgICAgaGFuZGxlID0gbURhdGFiYXNlLT5hZGRBdWRpb0ZpbGUoaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRUaXRsZSgpLAotICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRBcnRpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Nhbm5lckNsaWVudC0+Z2V0QWxidW0oKSwKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Nhbm5lckNsaWVudC0+Z2V0QWxidW1BcnRpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Nhbm5lckNsaWVudC0+Z2V0R2VucmUoKSwKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Nhbm5lckNsaWVudC0+Z2V0Q29tcG9zZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Nhbm5lckNsaWVudC0+Z2V0TWltZVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Nhbm5lckNsaWVudC0+Z2V0VHJhY2soKSwKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Nhbm5lckNsaWVudC0+Z2V0WWVhcigpLAotICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXREdXJhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBtRGF0YWJhc2UtPmNvbW1pdFRyYW5zYWN0aW9uKCk7Ci0gICAgfQotfQotCi12b2lkIE10cE1lZGlhU2Nhbm5lcjo6bWFya0ZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgewotICAgIGlmIChtRmlsZUxpc3QpIHsKLSAgICAgICAgaGFuZGxlICY9IGtPYmplY3RIYW5kbGVJbmRleE1hc2s7Ci0gICAgICAgIC8vIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBmaWxlIGluIG1GaWxlTGlzdAotICAgICAgICBpbnQgbG93ID0gMDsKLSAgICAgICAgaW50IGhpZ2ggPSBtRmlsZUNvdW50OwotICAgICAgICBpbnQgaW5kZXg7Ci0KLSAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHsKLSAgICAgICAgICAgIGluZGV4ID0gKGxvdyArIGhpZ2gpID4+IDE7Ci0gICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgdGVzdCA9IChtRmlsZUxpc3RbaW5kZXhdICYga09iamVjdEhhbmRsZUluZGV4TWFzayk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlIDwgdGVzdCkKLSAgICAgICAgICAgICAgICBoaWdoID0gaW5kZXg7ICAgICAgIC8vIGl0ZW0gaXMgbGVzcyB0aGFuIGluZGV4Ci0gICAgICAgICAgICBlbHNlIGlmIChoYW5kbGUgPiB0ZXN0KQotICAgICAgICAgICAgICAgIGxvdyA9IGluZGV4ICsgMTsgICAgLy8gaXRlbSBpcyBncmVhdGVyIHRoYW4gaW5kZXgKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG1GaWxlTGlzdFtpbmRleF0gfD0ga09iamVjdEhhbmRsZU1hcmtCaXQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExPR0UoImZpbGUgJWQgbm90IGZvdW5kIGluIG1GaWxlTGlzdCIsIGhhbmRsZSk7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE1lZGlhU2Nhbm5lci5oIGIvbWVkaWEvbXRwL010cE1lZGlhU2Nhbm5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2Q1MDYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL210cC9NdHBNZWRpYVNjYW5uZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9NVFBfTUVESUFfU0NBTk5FUl9ICi0jZGVmaW5lIF9NVFBfTUVESUFfU0NBTk5FUl9ICi0KLXN0cnVjdCBzdGF0OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE10cERhdGFiYXNlOwotY2xhc3MgU3FsaXRlU3RhdGVtZW50OwotY2xhc3MgTWVkaWFTY2FubmVyOwotY2xhc3MgTXRwTWVkaWFTY2FubmVyQ2xpZW50OwotCi1jbGFzcyBNdHBNZWRpYVNjYW5uZXIgewotcHJpdmF0ZToKLSAgICBNdHBTdG9yYWdlSUQgICAgICAgICAgICBtU3RvcmFnZUlEOwotICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIG1GaWxlUGF0aDsKLSAgICBNdHBEYXRhYmFzZSogICAgICAgICAgICBtRGF0YWJhc2U7Ci0gICAgTWVkaWFTY2FubmVyKiAgICAgICAgICAgbU1lZGlhU2Nhbm5lcjsKLSAgICBNdHBNZWRpYVNjYW5uZXJDbGllbnQqICBtTWVkaWFTY2FubmVyQ2xpZW50OwotCi0gICAgLy8gZm9yIGdhcmJhZ2UgY29sbGVjdGluZyBtaXNzaW5nIGZpbGVzCi0gICAgTXRwT2JqZWN0SGFuZGxlKiAgICAgICAgbUZpbGVMaXN0OwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1GaWxlQ291bnQ7Ci0KLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBNZWRpYVNjYW5uZXIoTXRwU3RvcmFnZUlEIGlkLCBjb25zdCBjaGFyKiBmaWxlUGF0aCwgTXRwRGF0YWJhc2UqIGRiKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwTWVkaWFTY2FubmVyKCk7Ci0KLSAgICBib29sICAgICAgICAgICAgICAgICAgICBzY2FuRmlsZXMoKTsKLQotcHJpdmF0ZToKLSAgICBNdHBPYmplY3RGb3JtYXQgICAgICAgICBnZXRGaWxlRm9ybWF0KGNvbnN0IGNoYXIqIHBhdGgsIHVpbnQzMl90JiB0YWJsZSk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2NhbkRpcmVjdG9yeShjb25zdCBjaGFyKiBwYXRoLCBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBzY2FuRmlsZShjb25zdCBjaGFyKiBwYXRoLCBNdHBPYmplY3RIYW5kbGUgcGFyZW50LCBzdHJ1Y3Qgc3RhdCYgc3RhdGJ1Zik7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgbWFya0ZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gX01UUF9NRURJQV9TQ0FOTkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKaW5kZXggMGI5OWNiMS4uZmRhNWY4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTczLDYgKzczLDExIEBACiAvLyAgICBNVFBfT1BFUkFUSU9OX1NLSVAsCiB9OwogCitzdGF0aWMgY29uc3QgTXRwRXZlbnRDb2RlIGtTdXBwb3J0ZWRFdmVudENvZGVzW10gPSB7CisgICAgTVRQX0VWRU5UX09CSkVDVF9BRERFRCwKKyAgICBNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQsCit9OworCiBzdGF0aWMgY29uc3QgTXRwT2JqZWN0UHJvcGVydHkga1N1cHBvcnRlZE9iamVjdFByb3BlcnRpZXNbXSA9IHsKICAgICBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCwKICAgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwKQEAgLTExMywxOCArMTE4LDE5IEBACiAgICAgLy8gTVRQX0ZPUk1BVF9QTFNfUExBWUxJU1QsCiB9OwogCi1NdHBTZXJ2ZXI6Ok10cFNlcnZlcihpbnQgZmQsIGNvbnN0IGNoYXIqIGRhdGFiYXNlUGF0aCkKK010cFNlcnZlcjo6TXRwU2VydmVyKGludCBmZCwgTXRwRGF0YWJhc2UqIGRhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZUdyb3VwLCBpbnQgZmlsZVBlcm0sIGludCBkaXJlY3RvcnlQZXJtKQogICAgIDogICBtRkQoZmQpLAotICAgICAgICBtRGF0YWJhc2VQYXRoKGRhdGFiYXNlUGF0aCksCi0gICAgICAgIG1EYXRhYmFzZShOVUxMKSwKKyAgICAgICAgbURhdGFiYXNlKGRhdGFiYXNlKSwKKyAgICAgICAgbUZpbGVHcm91cChmaWxlR3JvdXApLAorICAgICAgICBtRmlsZVBlcm1pc3Npb24oZmlsZVBlcm0pLAorICAgICAgICBtRGlyZWN0b3J5UGVybWlzc2lvbihkaXJlY3RvcnlQZXJtKSwKICAgICAgICAgbVNlc3Npb25JRCgwKSwKICAgICAgICAgbVNlc3Npb25PcGVuKGZhbHNlKSwKICAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUoa0ludmFsaWRPYmplY3RIYW5kbGUpLAorICAgICAgICBtU2VuZE9iamVjdEZvcm1hdCgwKSwKICAgICAgICAgbVNlbmRPYmplY3RGaWxlU2l6ZSgwKQogewotICAgIG1EYXRhYmFzZSA9IG5ldyBNdHBEYXRhYmFzZSgpOwotICAgIG1EYXRhYmFzZS0+b3BlbihkYXRhYmFzZVBhdGgsIHRydWUpOwotCiAgICAgaW5pdE9iamVjdFByb3BlcnRpZXMoKTsKIH0KIApAQCAtMTQ3LDEzICsxNTMsNiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIE10cFNlcnZlcjo6c2NhblN0b3JhZ2UoKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9ICBtU3RvcmFnZXNbaV07Ci0gICAgICAgIHN0b3JhZ2UtPnNjYW5GaWxlcygpOwotICAgIH0KLX0KLQogdm9pZCBNdHBTZXJ2ZXI6OnJ1bigpIHsKICAgICBpbnQgZmQgPSBtRkQ7CiAKQEAgLTI0NSw2ICsyNDQsMjQgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAordm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgTE9HRCgic2VuZE9iamVjdEFkZGVkICVkXG4iLCBoYW5kbGUpOworICAgIG1FdmVudC5zZXRFdmVudENvZGUoTVRQX0VWRU5UX09CSkVDVF9BRERFRCk7CisgICAgbUV2ZW50LnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBtRXZlbnQuc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaW50IHJldCA9IG1FdmVudC53cml0ZShtRkQpOworICAgIExPR0QoIm1FdmVudC53cml0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBMT0dEKCJzZW5kT2JqZWN0UmVtb3ZlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICBtRXZlbnQuc2V0RXZlbnRDb2RlKE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCk7CisgICAgbUV2ZW50LnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBtRXZlbnQuc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaW50IHJldCA9IG1FdmVudC53cml0ZShtRkQpOworICAgIExPR0QoIm1FdmVudC53cml0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKK30KKwogdm9pZCBNdHBTZXJ2ZXI6OmluaXRPYmplY3RQcm9wZXJ0aWVzKCkgewogICAgIG1PYmplY3RQcm9wZXJ0aWVzLnB1c2gobmV3IE10cFByb3BlcnR5KE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lELCBNVFBfVFlQRV9VSU5UMTYpKTsKICAgICBtT2JqZWN0UHJvcGVydGllcy5wdXNoKG5ldyBNdHBQcm9wZXJ0eShNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwgTVRQX1RZUEVfVUlOVDE2KSk7CkBAIC0zMzIsNyArMzQ5LDggQEAKICAgICBtRGF0YS5wdXRVSW50MTYoMCk7IC8vRnVuY3Rpb25hbCBNb2RlCiAgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXMsCiAgICAgICAgICAgICBzaXplb2Yoa1N1cHBvcnRlZE9wZXJhdGlvbkNvZGVzKSAvIHNpemVvZih1aW50MTZfdCkpOyAvLyBPcGVyYXRpb25zIFN1cHBvcnRlZAotICAgIG1EYXRhLnB1dEVtcHR5QXJyYXkoKTsgLy8gRXZlbnRzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoa1N1cHBvcnRlZEV2ZW50Q29kZXMsCisgICAgICAgICAgICBzaXplb2Yoa1N1cHBvcnRlZEV2ZW50Q29kZXMpIC8gc2l6ZW9mKHVpbnQxNl90KSk7IC8vIEV2ZW50cyBTdXBwb3J0ZWQKICAgICBtRGF0YS5wdXRFbXB0eUFycmF5KCk7IC8vIERldmljZSBQcm9wZXJ0aWVzIFN1cHBvcnRlZAogICAgIG1EYXRhLnB1dEVtcHR5QXJyYXkoKTsgLy8gQ2FwdHVyZSBGb3JtYXRzCiAgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzLApAQCAtNDIzLDYgKzQ0MSw4IEBACiAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsgICAgICAvLyAwIGZvciBhbGwgZm9ybWF0cwogICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3Igb2JqZWN0cyB3aXRoIG5vIHBhcmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHM/CisgICAgaWYgKHBhcmVudCA9PSAweEZGRkZGRkZGKQorICAgICAgICBwYXJlbnQgPSAwOwogCiAgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0TGlzdChzdG9yYWdlSUQsIGZvcm1hdCwgcGFyZW50KTsKICAgICBtRGF0YS5wdXRBVUludDMyKGhhbmRsZXMpOwpAQCAtNDg0LDkgKzUwNCwxMCBAQAogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRDsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSB0aGUgcm9vdAotICAgIGlmIChwYXJlbnQgPT0gTVRQX1BBUkVOVF9ST09UKQorICAgIGlmIChwYXJlbnQgPT0gTVRQX1BBUkVOVF9ST09UKSB7CiAgICAgICAgIHBhdGggPSBzdG9yYWdlLT5nZXRQYXRoKCk7Ci0gICAgZWxzZSB7CisgICAgICAgIHBhcmVudCA9IDA7CisgICAgfSBlbHNlIHsKICAgICAgICAgaW50NjRfdCBkdW1teTsKICAgICAgICAgaWYgKCFtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKHBhcmVudCwgcGF0aCwgZHVtbXkpKQogICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CkBAIC01MjMsNDQgKzU0NCw0OCBAQAogICAgIHBhdGggKz0gKGNvbnN0IGNoYXIgKiluYW1lOwogCiAgICAgbURhdGFiYXNlLT5iZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+YWRkRmlsZSgoY29uc3QgY2hhciopcGF0aCwgZm9ybWF0LCBwYXJlbnQsIHN0b3JhZ2VJRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplLCBtb2RpZmllZFRpbWUpOworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtRGF0YWJhc2UtPmJlZ2luU2VuZE9iamVjdCgoY29uc3QgY2hhciopcGF0aCwKKyAgICAgICAgICAgIGZvcm1hdCwgcGFyZW50LCBzdG9yYWdlSUQsIG1TZW5kT2JqZWN0RmlsZVNpemUsIG1vZGlmaWVkVGltZSk7CiAgICAgaWYgKGhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgewogICAgICAgICBtRGF0YWJhc2UtPnJvbGxiYWNrVHJhbnNhY3Rpb24oKTsKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgIH0KLSAgICB1aW50MzJfdCB0YWJsZSA9IE10cERhdGFiYXNlOjpnZXRUYWJsZUZvckZpbGUoZm9ybWF0KTsKLSAgICBpZiAodGFibGUgPT0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW8pCi0gICAgICAgIGhhbmRsZSA9IG1EYXRhYmFzZS0+YWRkQXVkaW9GaWxlKGhhbmRsZSk7CiAgICAgbURhdGFiYXNlLT5jb21taXRUcmFuc2FjdGlvbigpOwogCiAgIGlmIChmb3JtYXQgPT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTikgewogICAgICAgICBtb2RlX3QgbWFzayA9IHVtYXNrKDApOwotICAgICAgICBpbnQgcmV0ID0gbWtkaXIoKGNvbnN0IGNoYXIgKilwYXRoLCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOworICAgICAgICBpbnQgcmV0ID0gbWtkaXIoKGNvbnN0IGNoYXIgKilwYXRoLCBtRGlyZWN0b3J5UGVybWlzc2lvbik7CiAgICAgICAgIHVtYXNrKG1hc2spOwogICAgICAgICBpZiAocmV0ICYmIHJldCAhPSAtRUVYSVNUKQogICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICBjaG93bigoY29uc3QgY2hhciAqKXBhdGgsIGdldHVpZCgpLCBtRmlsZUdyb3VwKTsKICAgICB9IGVsc2UgewogICAgICAgICBtU2VuZE9iamVjdEZpbGVQYXRoID0gcGF0aDsKICAgICAgICAgLy8gc2F2ZSB0aGUgaGFuZGxlIGZvciB0aGUgU2VuZE9iamVjdCBjYWxsLCB3aGljaCBzaG91bGQgZm9sbG93CiAgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0gaGFuZGxlOworICAgICAgICBtU2VuZE9iamVjdEZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIHN0b3JhZ2VJRCk7Ci0gICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigyLCBwYXJlbnQpOworICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMiwgKHBhcmVudCA9PSAwID8gMHhGRkZGRkZGRjogcGFyZW50KSk7CiAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigzLCBoYW5kbGUpOwogCiAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKIH0KIAogTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0KCkgeworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBNVFBfUkVTUE9OU0VfT0s7CisgICAgbW9kZV90IG1hc2s7CisgICAgaW50IHJldDsKKwogICAgIGlmIChtU2VuZE9iamVjdEhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgewogICAgICAgICBMT0dFKCJFeHBlY3RlZCBTZW5kT2JqZWN0SW5mbyBiZWZvcmUgU2VuZE9iamVjdCIpOwotICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX05PX1ZBTElEX09CSkVDVF9JTkZPOworICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfTk9fVkFMSURfT0JKRUNUX0lORk87CisgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAKICAgICAvLyByZWFkIHRoZSBoZWFkZXIKLSAgICBpbnQgcmV0ID0gbURhdGEucmVhZERhdGFIZWFkZXIobUZEKTsKKyAgICByZXQgPSBtRGF0YS5yZWFkRGF0YUhlYWRlcihtRkQpOwogICAgIC8vIEZJWE1FIC0gY2hlY2sgZm9yIGVycm9ycyBoZXJlLgogCiAgICAgLy8gcmVzZXQgc28gd2UgZG9uJ3QgYXR0ZW1wdCB0byBzZW5kIHRoaXMgYmFjawpAQCAtNTY5LDI2ICs1OTQsMzggQEAKICAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOwogICAgIG1mci5mZCA9IG9wZW4obVNlbmRPYmplY3RGaWxlUGF0aCwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMpOwogICAgIGlmIChtZnIuZmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CisgICAgZmNob3duKG1mci5mZCwgZ2V0dWlkKCksIG1GaWxlR3JvdXApOworICAgIC8vIHNldCBwZXJtaXNzaW9ucworICAgIG1hc2sgPSB1bWFzaygwKTsKKyAgICBmY2htb2QobWZyLmZkLCBtRmlsZVBlcm1pc3Npb24pOworICAgIHVtYXNrKG1hc2spOworCiAgICAgbWZyLm9mZnNldCA9IDA7CiAgICAgbWZyLmxlbmd0aCA9IG1TZW5kT2JqZWN0RmlsZVNpemU7CiAKICAgICAvLyB0cmFuc2ZlciB0aGUgZmlsZQogICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CiAgICAgY2xvc2UobWZyLmZkKTsKLSAgICAvLyBGSVhNRSAtIHdlIG5lZWQgdG8gZGVsZXRlIG1TZW5kT2JqZWN0SGFuZGxlIGZyb20gdGhlIGRhdGFiYXNlIGlmIHRoaXMgZmFpbHMuCisKICAgICBMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkIiwgcmV0KTsKLSAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOwogCiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgdW5saW5rKG1TZW5kT2JqZWN0RmlsZVBhdGgpOwogICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKQotICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICB9Ci0gICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKKworZG9uZToKKyAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QobVNlbmRPYmplY3RGaWxlUGF0aCwgbVNlbmRPYmplY3RIYW5kbGUsIG1TZW5kT2JqZWN0Rm9ybWF0LAorICAgICAgICAgICAgcmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSyk7CisgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICBtU2VuZE9iamVjdEZvcm1hdCA9IDA7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9EZWxldGVPYmplY3QoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggNDAzMjljNS4uYWZmOTczYSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMjAsMTUgKzIwLDE2IEBACiAjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgogI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKICNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorI2luY2x1ZGUgIk10cEV2ZW50UGFja2V0LmgiCiAjaW5jbHVkZSAibXRwLmgiCiAKICNpbmNsdWRlICJNdHBVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIE10cFN0b3JhZ2U7CiBjbGFzcyBNdHBEYXRhYmFzZTsKIGNsYXNzIE10cFByb3BlcnR5OworY2xhc3MgTXRwU3RvcmFnZTsKIAogY2xhc3MgTXRwU2VydmVyIHsKIApAQCAtMzYsMTEgKzM3LDE0IEBACiAgICAgLy8gZmlsZSBkZXNjcmlwdG9yIGZvciBNVFAga2VybmVsIGRyaXZlcgogICAgIGludCAgICAgICAgICAgICAgICAgbUZEOwogCi0gICAgLy8gcGF0aCB0byBvdXIgc3FsaXRlMyBkYXRhYmFzZQotICAgIGNvbnN0IGNoYXIqICAgICAgICAgbURhdGFiYXNlUGF0aDsKLQogICAgIE10cERhdGFiYXNlKiAgICAgICAgbURhdGFiYXNlOwogCisgICAgLy8gZ3JvdXAgdG8gb3duIG5ldyBmaWxlcyBhbmQgZm9sZGVycworICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVHcm91cDsKKyAgICAvLyBwZXJtaXNzaW9ucyBmb3IgbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcworICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVQZXJtaXNzaW9uOworICAgIGludCAgICAgICAgICAgICAgICAgbURpcmVjdG9yeVBlcm1pc3Npb247CisKICAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKICAgICBNdHBTZXNzaW9uSUQgICAgICAgIG1TZXNzaW9uSUQ7CiAgICAgLy8gdHJ1ZSBpZiB3ZSBoYXZlIGFuIG9wZW4gc2Vzc2lvbiBhbmQgbVNlc3Npb25JRCBpcyB2YWxpZApAQCAtNDksNiArNTMsNyBAQAogICAgIE10cFJlcXVlc3RQYWNrZXQgICAgbVJlcXVlc3Q7CiAgICAgTXRwRGF0YVBhY2tldCAgICAgICBtRGF0YTsKICAgICBNdHBSZXNwb25zZVBhY2tldCAgIG1SZXNwb25zZTsKKyAgICBNdHBFdmVudFBhY2tldCAgICAgIG1FdmVudDsKIAogICAgIE10cFN0b3JhZ2VMaXN0ICAgICAgbVN0b3JhZ2VzOwogCkBAIC01NywyMiArNjIsMjYgQEAKIAogICAgIC8vIGhhbmRsZSBmb3IgbmV3IG9iamVjdCwgc2V0IGJ5IFNlbmRPYmplY3RJbmZvIGFuZCB1c2VkIGJ5IFNlbmRPYmplY3QKICAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1TZW5kT2JqZWN0SGFuZGxlOworICAgIE10cE9iamVjdEZvcm1hdCAgICAgbVNlbmRPYmplY3RGb3JtYXQ7CiAgICAgTXRwU3RyaW5nICAgICAgICAgICBtU2VuZE9iamVjdEZpbGVQYXRoOwogICAgIHNpemVfdCAgICAgICAgICAgICAgbVNlbmRPYmplY3RGaWxlU2l6ZTsKIAogcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgTXRwU2VydmVyKGludCBmZCwgY29uc3QgY2hhciogZGF0YWJhc2VQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFNlcnZlcihpbnQgZmQsIE10cERhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlR3JvdXAsIGludCBmaWxlUGVybSwgaW50IGRpcmVjdG9yeVBlcm0pOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFNlcnZlcigpOwogCiAgICAgdm9pZCAgICAgICAgICAgICAgICBhZGRTdG9yYWdlKGNvbnN0IGNoYXIqIGZpbGVQYXRoKTsKICAgICBpbmxpbmUgdm9pZCAgICAgICAgIGFkZFN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgeyBtU3RvcmFnZXMucHVzaChzdG9yYWdlKTsgfQogICAgIE10cFN0b3JhZ2UqICAgICAgICAgZ2V0U3RvcmFnZShNdHBTdG9yYWdlSUQgaWQpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgc2NhblN0b3JhZ2UoKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHJ1bigpOwogCiAgICAgTXRwUHJvcGVydHkqICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUpOwogICAgIE10cFByb3BlcnR5KiAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHkoTXRwUHJvcGVydHlDb2RlIHByb3BDb2RlKTsKIAorICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisKIHByaXZhdGU6CiAgICAgdm9pZCAgICAgICAgICAgICAgICBpbml0T2JqZWN0UHJvcGVydGllcygpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKaW5kZXggN2U4OWE5MC4uZWNjZjE4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcApAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgIk10cERlYnVnLmgiCiAjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKICNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCi0jaW5jbHVkZSAiTXRwTWVkaWFTY2FubmVyLmgiCiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpAQCAtNzgsOSArNzcsNCBAQAogICAgIHJldHVybiAiRGV2aWNlIFN0b3JhZ2UiOwogfQogCi1ib29sIE10cFN0b3JhZ2U6OnNjYW5GaWxlcygpIHsKLSAgICBNdHBNZWRpYVNjYW5uZXIgc2Nhbm5lcihtU3RvcmFnZUlELCBtRmlsZVBhdGgsIG1EYXRhYmFzZSk7Ci0gICAgcmV0dXJuIHNjYW5uZXIuc2NhbkZpbGVzKCk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuaAppbmRleCA2MDk3MjcyLi5iMTNiOTI2IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKQEAgLTIyLDcgKzIyLDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTXRwRGF0YWJhc2U7Ci1jbGFzcyBTcWxpdGVTdGF0ZW1lbnQ7CiAKIGNsYXNzIE10cFN0b3JhZ2UgewogCkBAIC00NCw4ICs0Myw2IEBACiAgICAgdWludDY0X3QgICAgICAgICAgICAgICAgZ2V0RnJlZVNwYWNlKCk7CiAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb24oKSBjb25zdDsKICAgICBpbmxpbmUgY29uc3QgY2hhciogICAgICBnZXRQYXRoKCkgY29uc3QgeyByZXR1cm4gbUZpbGVQYXRoOyB9Ci0KLSAgICBib29sICAgICAgICAgICAgICAgICAgICBzY2FuRmlsZXMoKTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwVHlwZXMuaCBiL21lZGlhL210cC9NdHBUeXBlcy5oCmluZGV4IGI3Yzc5YjIuLjJhODk1YTcgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBUeXBlcy5oCisrKyBiL21lZGlhL210cC9NdHBUeXBlcy5oCkBAIC0yOCw2ICsyOCw3IEBACiAKIHR5cGVkZWYgdWludDE2X3QgTXRwT3BlcmF0aW9uQ29kZTsKIHR5cGVkZWYgdWludDE2X3QgTXRwUmVzcG9uc2VDb2RlOwordHlwZWRlZiB1aW50MTZfdCBNdHBFdmVudENvZGU7CiB0eXBlZGVmIHVpbnQzMl90IE10cFNlc3Npb25JRDsKIHR5cGVkZWYgdWludDMyX3QgTXRwU3RvcmFnZUlEOwogdHlwZWRlZiB1aW50MzJfdCBNdHBUcmFuc2FjdGlvbklEOwpAQCAtNjAsMTYgKzYxLDYgQEAKICNkZWZpbmUgTVRQX1BBUkVOVF9ST09UICAgICAgICAgMHhGRkZGRkZGRiAgICAgICAvLyBwYXJlbnQgaXMgcm9vdCBvZiB0aGUgc3RvcmFnZQogI2RlZmluZSBrSW52YWxpZE9iamVjdEhhbmRsZSAgICAweEZGRkZGRkZGCiAKLS8vIE10cE9iamVjdEhhbmRsZSBiaXRzIGFuZCBtYXNrcwotI2RlZmluZSBrT2JqZWN0SGFuZGxlTWFya0JpdCAgICAgICAgMHg4MDAwMDAwMCAgICAgIC8vIHVzZWQgZm9yIG1hcmsgJiBzd2VlcCBieSBNdHBNZWRpYVNjYW5uZXIKLSNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlTWFzayAgICAgIDB4NzAwMDAwMDAgICAgICAvLyBtYXNrIGZvciBvYmplY3QgdGFibGUKLSNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlRmlsZSAgICAgIDB4MDAwMDAwMDAgICAgICAvLyBvYmplY3QgaXMgb25seSBpbiB0aGUgZmlsZSB0YWJsZQotI2RlZmluZSBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgMHgxMDAwMDAwMCAgICAgIC8vIG9iamVjdCBpcyBpbiB0aGUgYXVkaW8gdGFibGUKLSNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIDB4MjAwMDAwMDAgICAgICAvLyBvYmplY3QgaXMgaW4gdGhlIHZpZGVvIHRhYmxlCi0jZGVmaW5lIGtPYmplY3RIYW5kbGVUYWJsZUltYWdlICAgICAweDMwMDAwMDAwICAgICAgLy8gb2JqZWN0IGlzIGluIHRoZSBpbWFnZXMgdGFibGUKLSNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlUGxheWxpc3QgIDB4NDAwMDAwMDAgICAgICAvLyBvYmplY3QgaXMgaW4gdGhlIHBsYXlsaXN0IHRhYmxlCi0jZGVmaW5lIGtPYmplY3RIYW5kbGVJbmRleE1hc2sgICAgICAweDBGRkZGRkZGICAgICAgLy8gbWFzayBmb3Igb2JqZWN0IGluZGV4IGluIGZpbGUgdGFibGUKLQogY2xhc3MgTXRwU3RvcmFnZTsKIGNsYXNzIE10cERldmljZTsKIGNsYXNzIE10cFByb3BlcnR5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL1NxbGl0ZURhdGFiYXNlLmNwcCBiL21lZGlhL210cC9TcWxpdGVEYXRhYmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZTNhNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbXRwL1NxbGl0ZURhdGFiYXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlNxbGl0ZURhdGFiYXNlIgotCi0jaW5jbHVkZSAiTXRwRGVidWcuaCIKLSNpbmNsdWRlICJTcWxpdGVEYXRhYmFzZS5oIgotI2luY2x1ZGUgIlNxbGl0ZVN0YXRlbWVudC5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzcWxpdGUzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3FsaXRlRGF0YWJhc2U6OlNxbGl0ZURhdGFiYXNlKCkKLSAgICA6ICAgbURhdGFiYXNlSGFuZGxlKE5VTEwpCi17Ci19Ci0KLVNxbGl0ZURhdGFiYXNlOjp+U3FsaXRlRGF0YWJhc2UoKSB7Ci0gICAgY2xvc2UoKTsKLX0KLQotYm9vbCBTcWxpdGVEYXRhYmFzZTo6b3Blbihjb25zdCBjaGFyKiBwYXRoLCBib29sIGNyZWF0ZSkgewotICAgIGludCBmbGFncyA9IFNRTElURV9PUEVOX1JFQURXUklURTsKLSAgICBpZiAoY3JlYXRlKSBmbGFncyB8PSBTUUxJVEVfT1BFTl9DUkVBVEU7Ci0gICAgLy8gU1FMSVRFX09QRU5fTk9NVVRFWD8KLSAgICBpbnQgcmV0ID0gc3FsaXRlM19vcGVuX3YyKHBhdGgsICZtRGF0YWJhc2VIYW5kbGUsIGZsYWdzLCBOVUxMKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIExPR0UoImNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlXG4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTcWxpdGVEYXRhYmFzZTo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1EYXRhYmFzZUhhbmRsZSkgewotICAgICAgICBzcWxpdGUzX2Nsb3NlKG1EYXRhYmFzZUhhbmRsZSk7Ci0gICAgICAgIG1EYXRhYmFzZUhhbmRsZSA9IE5VTEw7Ci0gICAgfQotfQotCi1ib29sIFNxbGl0ZURhdGFiYXNlOjpleGVjKGNvbnN0IGNoYXIqIHNxbCkgewotICAgIHJldHVybiAoc3FsaXRlM19leGVjKG1EYXRhYmFzZUhhbmRsZSwgc3FsLCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKTsKLX0KLQotaW50IFNxbGl0ZURhdGFiYXNlOjpsYXN0SW5zZXJ0ZWRSb3coKSB7Ci0gICAgcmV0dXJuIHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQobURhdGFiYXNlSGFuZGxlKTsKLX0KLQotdm9pZCBTcWxpdGVEYXRhYmFzZTo6YmVnaW5UcmFuc2FjdGlvbigpIHsKLSAgICBleGVjKCJCRUdJTiBUUkFOU0FDVElPTiIpOwotfQotCi12b2lkIFNxbGl0ZURhdGFiYXNlOjpjb21taXRUcmFuc2FjdGlvbigpIHsKLSAgICBleGVjKCJDT01NSVQgVFJBTlNBQ1RJT04iKTsKLX0KLQotdm9pZCBTcWxpdGVEYXRhYmFzZTo6cm9sbGJhY2tUcmFuc2FjdGlvbigpIHsKLSAgICBleGVjKCJST0xMQkFDSyBUUkFOU0FDVElPTiIpOwotfQotCi1pbnQgU3FsaXRlRGF0YWJhc2U6OmdldFZlcnNpb24oKSB7Ci0gICAgU3FsaXRlU3RhdGVtZW50IHN0bXQodGhpcyk7Ci0gICAgc3RtdC5wcmVwYXJlKCJQUkFHTUEgdXNlcl92ZXJzaW9uOyIpOwotICAgIHN0bXQuc3RlcCgpOwotICAgIHJldHVybiBzdG10LmdldENvbHVtbkludCgwKTsKLX0KLXZvaWQgU3FsaXRlRGF0YWJhc2U6OnNldFZlcnNpb24oaW50IHZlcnNpb24pIHsKLSAgICBjaGFyICAgIGJ1ZmZlcls0MF07Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIlBSQUdNQSB1c2VyX3ZlcnNpb24gPSAlZCIsIHZlcnNpb24pOwotICAgIGV4ZWMoYnVmZmVyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9TcWxpdGVEYXRhYmFzZS5oIGIvbWVkaWEvbXRwL1NxbGl0ZURhdGFiYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZGQ5ZGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbXRwL1NxbGl0ZURhdGFiYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfU1FMSVRFX0RBVEFCQVNFX0gKLSNkZWZpbmUgX1NRTElURV9EQVRBQkFTRV9ICi0KLXR5cGVkZWYgc3RydWN0IHNxbGl0ZTMgc3FsaXRlMzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTcWxpdGVEYXRhYmFzZSB7Ci1wcml2YXRlOgotICAgIHNxbGl0ZTMqICAgICAgICBtRGF0YWJhc2VIYW5kbGU7Ci0KLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgU3FsaXRlRGF0YWJhc2UoKTsKLSAgICB2aXJ0dWFsICAgICAgICAgflNxbGl0ZURhdGFiYXNlKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgICAgb3Blbihjb25zdCBjaGFyKiBwYXRoLCBib29sIGNyZWF0ZSk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGNsb3NlKCk7Ci0KLSAgICBib29sICAgICAgICAgICAgZXhlYyhjb25zdCBjaGFyKiBzcWwpOwotICAgIGludCAgICAgICAgICAgICBsYXN0SW5zZXJ0ZWRSb3coKTsKLQotICAgIHZvaWQgICAgICAgICAgICBiZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgdm9pZCAgICAgICAgICAgIGNvbW1pdFRyYW5zYWN0aW9uKCk7Ci0gICAgdm9pZCAgICAgICAgICAgIHJvbGxiYWNrVHJhbnNhY3Rpb24oKTsKLQotICAgIGludCAgICAgICAgICAgICBnZXRWZXJzaW9uKCk7Ci0gICAgdm9pZCAgICAgICAgICAgIHNldFZlcnNpb24oaW50IHZlcnNpb24pOwotCi0gICAgaW5saW5lIHNxbGl0ZTMqIGdldERhdGFiYXNlSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbURhdGFiYXNlSGFuZGxlOyB9Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gX1NRTElURV9EQVRBQkFTRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvU3FsaXRlU3RhdGVtZW50LmNwcCBiL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGVmN2FlLi4wMDAwMDAwCi0tLSBhL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3FsaXRlU3RhdGVtZW50IgotCi0jaW5jbHVkZSAiU3FsaXRlU3RhdGVtZW50LmgiCi0jaW5jbHVkZSAiU3FsaXRlRGF0YWJhc2UuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3FsaXRlMy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVNxbGl0ZVN0YXRlbWVudDo6U3FsaXRlU3RhdGVtZW50KFNxbGl0ZURhdGFiYXNlKiBkYikKLSAgICA6ICAgbURhdGFiYXNlSGFuZGxlKGRiLT5nZXREYXRhYmFzZUhhbmRsZSgpKSwKLSAgICAgICAgbVN0YXRlbWVudChOVUxMKSwKLSAgICAgICAgbURvbmUoZmFsc2UpCi17Ci19Ci0KLVNxbGl0ZVN0YXRlbWVudDo6flNxbGl0ZVN0YXRlbWVudCgpIHsKLSAgICBmaW5hbGl6ZSgpOwotfQotCi1ib29sIFNxbGl0ZVN0YXRlbWVudDo6cHJlcGFyZShjb25zdCBjaGFyKiBzcWwpIHsKLSAgICByZXR1cm4gKHNxbGl0ZTNfcHJlcGFyZV92MihtRGF0YWJhc2VIYW5kbGUsIHNxbCwgLTEsICZtU3RhdGVtZW50LCBOVUxMKSA9PSAwKTsKLX0KLQotYm9vbCBTcWxpdGVTdGF0ZW1lbnQ6OnN0ZXAoKSB7Ci0gICAgaW50IHJldCA9IHNxbGl0ZTNfc3RlcChtU3RhdGVtZW50KTsKLSAgICBpZiAocmV0ID09IFNRTElURV9ET05FKSB7Ci0gICAgICAgIG1Eb25lID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiAocmV0ID09IFNRTElURV9PSyB8fCByZXQgPT0gU1FMSVRFX1JPVyk7Ci19Ci0KLXZvaWQgU3FsaXRlU3RhdGVtZW50OjpyZXNldCgpIHsKLSAgICBzcWxpdGUzX3Jlc2V0KG1TdGF0ZW1lbnQpOwotICAgIG1Eb25lID0gZmFsc2U7Ci19Ci0KLXZvaWQgU3FsaXRlU3RhdGVtZW50OjpmaW5hbGl6ZSgpIHsKLSAgICBpZiAobVN0YXRlbWVudCkgewotICAgICAgICBzcWxpdGUzX2ZpbmFsaXplKG1TdGF0ZW1lbnQpOwotICAgICAgICBtU3RhdGVtZW50ID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgU3FsaXRlU3RhdGVtZW50OjpiaW5kKGludCBjb2x1bW4sIGludCB2YWx1ZSkgewotICAgIHNxbGl0ZTNfYmluZF9pbnQobVN0YXRlbWVudCwgY29sdW1uLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgU3FsaXRlU3RhdGVtZW50OjpiaW5kKGludCBjb2x1bW4sIGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gICAgc3FsaXRlM19iaW5kX3RleHQobVN0YXRlbWVudCwgY29sdW1uLCB2YWx1ZSwgLTEsIFNRTElURV9UUkFOU0lFTlQpOwotfQotCi1pbnQgU3FsaXRlU3RhdGVtZW50OjpnZXRDb2x1bW5JbnQoaW50IGNvbHVtbikgewotICAgIHJldHVybiBzcWxpdGUzX2NvbHVtbl9pbnQobVN0YXRlbWVudCwgY29sdW1uKTsKLX0KLQotaW50NjRfdCBTcWxpdGVTdGF0ZW1lbnQ6OmdldENvbHVtbkludDY0KGludCBjb2x1bW4pIHsKLSAgICByZXR1cm4gc3FsaXRlM19jb2x1bW5faW50NjQobVN0YXRlbWVudCwgY29sdW1uKTsKLX0KLQotY29uc3QgY2hhciogU3FsaXRlU3RhdGVtZW50OjpnZXRDb2x1bW5TdHJpbmcoaW50IGNvbHVtbikgewotICAgIHJldHVybiAoY29uc3QgY2hhciAqKXNxbGl0ZTNfY29sdW1uX3RleHQobVN0YXRlbWVudCwgY29sdW1uKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuaCBiL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlYmZmZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9tdHAvU3FsaXRlU3RhdGVtZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfU1FMSVRFX1NUQVRFTUVOVF9ICi0jZGVmaW5lIF9TUUxJVEVfU1RBVEVNRU5UX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi10eXBlZGVmIHN0cnVjdCBzcWxpdGUzIHNxbGl0ZTM7Ci10eXBlZGVmIHN0cnVjdCBzcWxpdGUzX3N0bXQgc3FsaXRlM19zdG10OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFNxbGl0ZURhdGFiYXNlOwotCi1jbGFzcyBTcWxpdGVTdGF0ZW1lbnQgewotcHJpdmF0ZToKLSAgICBzcWxpdGUzKiAgICAgICAgbURhdGFiYXNlSGFuZGxlOwotICAgIHNxbGl0ZTNfc3RtdCogICBtU3RhdGVtZW50OwotICAgIGJvb2wgICAgICAgICAgICBtRG9uZTsKLQotcHVibGljOgotICAgICAgICAgICAgICAgICAgICBTcWxpdGVTdGF0ZW1lbnQoU3FsaXRlRGF0YWJhc2UqIGRiKTsKLSAgICB2aXJ0dWFsICAgICAgICAgflNxbGl0ZVN0YXRlbWVudCgpOwotCi0gICAgYm9vbCAgICAgICAgICAgIHByZXBhcmUoY29uc3QgY2hhciogc3FsKTsKLSAgICBib29sICAgICAgICAgICAgc3RlcCgpOwotICAgIHZvaWQgICAgICAgICAgICByZXNldCgpOwotICAgIHZvaWQgICAgICAgICAgICBmaW5hbGl6ZSgpOwotCi0gICAgdm9pZCAgICAgICAgICAgIGJpbmQoaW50IGNvbHVtbiwgaW50IHZhbHVlKTsKLSAgICB2b2lkICAgICAgICAgICAgYmluZChpbnQgY29sdW1uLCBjb25zdCBjaGFyKiB2YWx1ZSk7Ci0KLSAgICBpbnQgICAgICAgICAgICAgZ2V0Q29sdW1uSW50KGludCBjb2x1bW4pOwotICAgIGludDY0X3QgICAgICAgICBnZXRDb2x1bW5JbnQ2NChpbnQgY29sdW1uKTsKLSAgICBjb25zdCBjaGFyKiAgICAgZ2V0Q29sdW1uU3RyaW5nKGludCBjb2x1bW4pOwotCi0gICAgaW5saW5lIGJvb2wgICAgIGlzRG9uZSgpIGNvbnN0IHsgcmV0dXJuIG1Eb25lOyB9Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gX1NRTElURV9TVEFURU1FTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL2ZfbXRwLmggYi9tZWRpYS9tdHAvZl9tdHAuaAppbmRleCBjMWM5YWVmLi40MjZjNmI1IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvZl9tdHAuaAorKysgYi9tZWRpYS9tdHAvZl9tdHAuaApAQCAtMzIsNiArMzIsMTMgQEAKIAlzaXplX3QJCWxlbmd0aDsKIH07CiAKK3N0cnVjdCBtdHBfZXZlbnQgeworCS8qIHNpemUgb2YgdGhlIGV2ZW50ICovCisJc2l6ZV90CQlsZW5ndGg7CisJLyogZXZlbnQgZGF0YSB0byBzZW5kICovCisJdm9pZCAgCQkqZGF0YTsKK307CisKIC8qIFNlbmRzIHRoZSBzcGVjaWZpZWQgZmlsZSByYW5nZSB0byB0aGUgaG9zdCAqLwogI2RlZmluZSBNVFBfU0VORF9GSUxFICAgICAgICAgICAgICBfSU9XKCdNJywgMCwgc3RydWN0IG10cF9maWxlX3JhbmdlKQogLyogUmVjZWl2ZXMgZGF0YSBmcm9tIHRoZSBob3N0IGFuZCB3cml0ZXMgaXQgdG8gYSBmaWxlLgpAQCAtNDAsNSArNDcsNyBAQAogI2RlZmluZSBNVFBfUkVDRUlWRV9GSUxFICAgICAgICAgICBfSU9XKCdNJywgMSwgc3RydWN0IG10cF9maWxlX3JhbmdlKQogLyogU2V0cyB0aGUgZHJpdmVyIG1vZGUgdG8gZWl0aGVyIE1UUCBvciBQVFAgKi8KICNkZWZpbmUgTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSAgICAgX0lPVygnTScsIDIsIGludCkKKy8qIFNlbmRzIGFuIGV2ZW50IHRvIHRoZSBob3N0IHZpYSB0aGUgaW50ZXJydXB0IGVuZHBvaW50ICovCisjZGVmaW5lIE1UUF9TRU5EX0VWRU5UICAgICAgICAgICAgIF9JT1coJ00nLCAzLCBzdHJ1Y3QgbXRwX2V2ZW50KQogCiAjZW5kaWYgLyogX19MSU5VWF9VU0JfRl9NVFBfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL210cHRlc3QuY3BwIGIvbWVkaWEvbXRwL210cHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYyNDk0Li4wMDAwMDAwCi0tLSBhL21lZGlhL210cC9tdHB0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIm10cF91c2IiCi0KLSNpbmNsdWRlICJNdHBEZWJ1Zy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotCi0jaW5jbHVkZSAiTXRwU2VydmVyLmgiCi0jaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgotI2luY2x1ZGUgImZfbXRwLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1zdGF0aWMgYm9vbCBlbmFibGVfdXNiX2Z1bmN0aW9uKGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wgZW5hYmxlKSB7Ci0gICAgY2hhciAgICBwYXRoW1BBVEhfTUFYXTsKLQotICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvY2xhc3MvdXNiX2NvbXBvc2l0ZS8lcy9lbmFibGUiLCBuYW1lKTsKLSAgICBpbnQgZmQgPSBvcGVuKHBhdGgsIE9fUkRXUik7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuICVzIGluIGVuYWJsZV91c2JfZnVuY3Rpb25cbiIsIHBhdGgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHdyaXRlKGZkLCBlbmFibGUgPyAiMSIgOiAiMCIsIDIpOwotICAgIGNsb3NlKGZkKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotICAgIGJvb2wgdXNlUFRQID0gZmFsc2U7Ci0gICAgY29uc3QgY2hhciogc3RvcmFnZVBhdGggPSAiL3NkY2FyZCI7Ci0KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBjb25zdCBjaGFyKiBhcmcgPSBhcmd2W2ldOwotICAgICAgICBpZiAoIXN0cmNtcChhcmcsICItcCIpKQotICAgICAgICAgICAgdXNlUFRQID0gdHJ1ZTsKLSAgICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICcvJykKLSAgICAgICAgICAgIHN0b3JhZ2VQYXRoID0gYXJnOwotICAgIH0KLQotICAgIGludCBmZCA9IG9wZW4oIi9kZXYvbXRwX3VzYiIsIE9fUkRXUik7Ci0gICAgcHJpbnRmKCJvcGVuIHJldHVybmVkICVkXG4iLCBmZCk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuIE1UUCBkcml2ZXJcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKHVzZVBUUCkgewotICAgICAgICAvLyBzZXQgZHJpdmVyIG1vZGUgdG8gUFRQCi0gICAgICAgIGludCByZXQgPSBpb2N0bChmZCwgTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSwgTVRQX0lOVEVSRkFDRV9NT0RFX1BUUCk7Ci0gICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSBmYWlsZWRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZGlzYWJsZSBVTVMgYW5kIGVuYWJsZSBNVFAgVVNCIGZ1bmN0aW9ucwotICAgIGVuYWJsZV91c2JfZnVuY3Rpb24oInVzYl9tYXNzX3N0b3JhZ2UiLCBmYWxzZSk7Ci0gICAgZW5hYmxlX3VzYl9mdW5jdGlvbigibXRwIiwgdHJ1ZSk7Ci0KLSAgICBNdHBTZXJ2ZXIgICBzZXJ2ZXIoZmQsICIvZGF0YS9kYXRhL210cC9tdHAuZGIiKTsKLSAgICBzZXJ2ZXIuYWRkU3RvcmFnZShzdG9yYWdlUGF0aCk7Ci0gICAgc2VydmVyLnNjYW5TdG9yYWdlKCk7Ci0gICAgc2VydmVyLnJ1bigpOwotCi0gICAgY2xvc2UoZmQpOwotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvc2NhbnRlc3QuY3BwIGIvbWVkaWEvbXRwL3NjYW50ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxMGJiNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9tdHAvc2NhbnRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKLSNpbmNsdWRlICJNdHBNZWRpYVNjYW5uZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgICBpZiAoYXJnYyAhPSAyKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIDxzdG9yYWdlIHBhdGg+XG4iLCBhcmd2WzBdKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIE10cERhdGFiYXNlKiBkYXRhYmFzZSA9IG5ldyBNdHBEYXRhYmFzZSgpOwotICAgIGRhdGFiYXNlLT5vcGVuKCJzY2FudGVzdC5kYiIsIHRydWUpOwotCi0gICAgTXRwTWVkaWFTY2FubmVyIHNjYW5uZXIoMSwgYXJndlsxXSwgZGF0YWJhc2UpOwotICAgIHNjYW5uZXIuc2NhbkZpbGVzKCk7Ci0gICAgZGF0YWJhc2UtPmNsb3NlKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L01lZGlhUHJvZmlsZVJlYWRlci5qYXZhIGIvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvTWVkaWFQcm9maWxlUmVhZGVyLmphdmEKaW5kZXggMDU2NTM3ZC4uYjFhZDMxNSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvTWVkaWFQcm9maWxlUmVhZGVyLmphdmEKKysrIGIvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvTWVkaWFQcm9maWxlUmVhZGVyLmphdmEKQEAgLTM0LDEwICszNCwxMiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8QXVkaW9EZWNvZGVyPiBhdWRpb0RlY29kZXJzID0gRGVjb2RlckNhcGFiaWxpdGllcy5nZXRBdWRpb0RlY29kZXJzKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxWaWRlb0VuY29kZXJDYXA+IHZpZGVvRW5jb2RlcnMgPSBFbmNvZGVyQ2FwYWJpbGl0aWVzLmdldFZpZGVvRW5jb2RlcnMoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PEF1ZGlvRW5jb2RlckNhcD4gYXVkaW9FbmNvZGVycyA9IEVuY29kZXJDYXBhYmlsaXRpZXMuZ2V0QXVkaW9FbmNvZGVycygpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiBlbmNvZGVyTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiB2aWRlb0VuY29kZXJNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGF1ZGlvRW5jb2Rlck1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKIAogICAgIHN0YXRpYyB7Ci0gICAgICAgIGluaXRFbmNvZGVyTWFwKCk7CisgICAgICAgIGluaXRBdWRpb0VuY29kZXJNYXAoKTsKKyAgICAgICAgaW5pdFZpZGVvRW5jb2Rlck1hcCgpOwogICAgIH07CiAKICAgICBwdWJsaWMgc3RhdGljIExpc3Q8VmlkZW9FbmNvZGVyQ2FwPiBnZXRWaWRlb0VuY29kZXJzKCkgewpAQCAtNzksNyArODEsNyBAQAogICAgICAgICAgICAgdmlkZW9FbmNvZGVyICE9IE1lZGlhUmVjb3JkZXIuVmlkZW9FbmNvZGVyLk1QRUdfNF9TUCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgdmlkZW8gZW5jb2RlciAiICsgdmlkZW9FbmNvZGVyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5jb2Rlck1hcC5nZXQodmlkZW9FbmNvZGVyKTsKKyAgICAgICAgcmV0dXJuIHZpZGVvRW5jb2Rlck1hcC5nZXQodmlkZW9FbmNvZGVyKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdWRpb0NvZGVjTmFtZShpbnQgYXVkaW9FbmNvZGVyKSB7CkBAIC05MCwyMiArOTIsMjQgQEAKICAgICAgICAgICAgIGF1ZGlvRW5jb2RlciAhPSBNZWRpYVJlY29yZGVyLkF1ZGlvRW5jb2Rlci5FQUFDX1BMVVMpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGF1ZGlvIGVuY29kZWVyICIgKyBhdWRpb0VuY29kZXIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVyTWFwLmdldChhdWRpb0VuY29kZXIpOworICAgICAgICByZXR1cm4gYXVkaW9FbmNvZGVyTWFwLmdldChhdWRpb0VuY29kZXIpOwogICAgIH0KIAogICAgIHByaXZhdGUgTWVkaWFQcm9maWxlUmVhZGVyKCkge30gLy8gRG9uJ3QgY2FsbCBtZQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0RW5jb2Rlck1hcCgpIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRWaWRlb0VuY29kZXJNYXAoKSB7CiAgICAgICAgIC8vIHZpZGVvIGVuY29kZXJzCi0gICAgICAgIGVuY29kZXJNYXAucHV0KE1lZGlhUmVjb3JkZXIuVmlkZW9FbmNvZGVyLkgyNjMsICJoMjYzIik7Ci0gICAgICAgIGVuY29kZXJNYXAucHV0KE1lZGlhUmVjb3JkZXIuVmlkZW9FbmNvZGVyLkgyNjQsICJoMjY0Iik7Ci0gICAgICAgIGVuY29kZXJNYXAucHV0KE1lZGlhUmVjb3JkZXIuVmlkZW9FbmNvZGVyLk1QRUdfNF9TUCwgIm00diIpOworICAgICAgICB2aWRlb0VuY29kZXJNYXAucHV0KE1lZGlhUmVjb3JkZXIuVmlkZW9FbmNvZGVyLkgyNjMsICJoMjYzIik7CisgICAgICAgIHZpZGVvRW5jb2Rlck1hcC5wdXQoTWVkaWFSZWNvcmRlci5WaWRlb0VuY29kZXIuSDI2NCwgImgyNjQiKTsKKyAgICAgICAgdmlkZW9FbmNvZGVyTWFwLnB1dChNZWRpYVJlY29yZGVyLlZpZGVvRW5jb2Rlci5NUEVHXzRfU1AsICJtNHYiKTsKKyAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRBdWRpb0VuY29kZXJNYXAoKSB7CiAgICAgICAgIC8vIGF1ZGlvIGVuY29kZXJzCi0gICAgICAgIGVuY29kZXJNYXAucHV0KE1lZGlhUmVjb3JkZXIuQXVkaW9FbmNvZGVyLkFNUl9OQiwgImFtcm5iIik7Ci0gICAgICAgIGVuY29kZXJNYXAucHV0KE1lZGlhUmVjb3JkZXIuQXVkaW9FbmNvZGVyLkFNUl9XQiwgImFtcndiIik7Ci0gICAgICAgIGVuY29kZXJNYXAucHV0KE1lZGlhUmVjb3JkZXIuQXVkaW9FbmNvZGVyLkFBQywgImFhYyIpOwotICAgICAgICBlbmNvZGVyTWFwLnB1dChNZWRpYVJlY29yZGVyLkF1ZGlvRW5jb2Rlci5BQUNfUExVUywgImFhY3BsdXMiKTsKLSAgICAgICAgZW5jb2Rlck1hcC5wdXQoTWVkaWFSZWNvcmRlci5BdWRpb0VuY29kZXIuRUFBQ19QTFVTLCAiZWFhY3BsdXMiKTsKKyAgICAgICAgYXVkaW9FbmNvZGVyTWFwLnB1dChNZWRpYVJlY29yZGVyLkF1ZGlvRW5jb2Rlci5BTVJfTkIsICJhbXJuYiIpOworICAgICAgICBhdWRpb0VuY29kZXJNYXAucHV0KE1lZGlhUmVjb3JkZXIuQXVkaW9FbmNvZGVyLkFNUl9XQiwgImFtcndiIik7CisgICAgICAgIGF1ZGlvRW5jb2Rlck1hcC5wdXQoTWVkaWFSZWNvcmRlci5BdWRpb0VuY29kZXIuQUFDLCAiYWFjIik7CisgICAgICAgIGF1ZGlvRW5jb2Rlck1hcC5wdXQoTWVkaWFSZWNvcmRlci5BdWRpb0VuY29kZXIuQUFDX1BMVVMsICJhYWNwbHVzIik7CisgICAgICAgIGF1ZGlvRW5jb2Rlck1hcC5wdXQoTWVkaWFSZWNvcmRlci5BdWRpb0VuY29kZXIuRUFBQ19QTFVTLCAiZWFhY3BsdXMiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9mdW5jdGlvbmFsL01lZGlhUmVjb3JkZXJUZXN0LmphdmEgYi9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9mdW5jdGlvbmFsL01lZGlhUmVjb3JkZXJUZXN0LmphdmEKaW5kZXggYTUyZmQ3Ni4uMjMzMjY1NyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvZnVuY3Rpb25hbC9NZWRpYVJlY29yZGVyVGVzdC5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L2Z1bmN0aW9uYWwvTWVkaWFSZWNvcmRlclRlc3QuamF2YQpAQCAtMTIxLDggKzEyMSw4IEBACiAgICAgICAgIG1TdXJmYWNlSG9sZGVyID0gTWVkaWFGcmFtZXdvcmtUZXN0Lm1TdXJmYWNlVmlldy5nZXRIb2xkZXIoKTsKICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gKCIvc2RjYXJkLyIgKyB2aWRlb0VuY29kZXIgKyAiXyIgKyBhdWRpb0VuY29kZXIgKyAiXyIgKyBoaWdoUXVhbGl0eSArICIuM2dwIik7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICJ2aWRlbyBlbmNvZGVyIDoiICsgdmlkZW9FbmNvZGVyKTsKLSAgICAgICAgICAgIExvZy52KFRBRywgImF1ZGlvIGVuY29kZXIgOiIgKyBhdWRpb0VuY29kZXIpOworICAgICAgICAgICAgTG9nLnYoVEFHLCAidmlkZW8gZW5jb2RlciA6ICIgKyB2aWRlb0VuY29kZXIpOworICAgICAgICAgICAgTG9nLnYoVEFHLCAiYXVkaW8gZW5jb2RlciA6ICIgKyBhdWRpb0VuY29kZXIpOwogICAgICAgICAgICAgTG9nLnYoVEFHLCAicXVhbGl0eSA6ICIgKyAoaGlnaFF1YWxpdHk/ImhpZ2giOiAibG93IikpOwogICAgICAgICAgICAgTG9nLnYoVEFHLCAiZW5jb2RlciA6ICIgKyBNZWRpYVByb2ZpbGVSZWFkZXIuZ2V0VmlkZW9Db2RlY05hbWUodmlkZW9FbmNvZGVyKSk7CiAgICAgICAgICAgICBMb2cudihUQUcsICJhdWRpbyA6ICIgKyBNZWRpYVByb2ZpbGVSZWFkZXIuZ2V0QXVkaW9Db2RlY05hbWUoYXVkaW9FbmNvZGVyKSk7CmRpZmYgLS1naXQgYS9uYXRpdmUvYW5kcm9pZC9BbmRyb2lkLm1rIGIvbmF0aXZlL2FuZHJvaWQvQW5kcm9pZC5tawppbmRleCA4YzYyMWI2Li41MDlhMzc5IDEwMDY0NAotLS0gYS9uYXRpdmUvYW5kcm9pZC9BbmRyb2lkLm1rCisrKyBiL25hdGl2ZS9hbmRyb2lkL0FuZHJvaWQubWsKQEAgLTYsMTUgKzYsMTggQEAKICMgb3VyIHNvdXJjZSBmaWxlcwogIwogTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIGFjdGl2aXR5LmNwcCBcCi0gICAgaW5wdXQuY3BwCisgICAgaW5wdXQuY3BwIFwKKyAgICBsb29wZXIuY3BwIFwKKyAgICBuYXRpdmVfYWN0aXZpdHkuY3BwIFwKKyAgICBuYXRpdmVfd2luZG93LmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmJpbmRlciBcCi0gICAgbGlidWkKKyAgICBsaWJ1aSBcCisgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwKKyAgICBsaWJhbmRyb2lkX3J1bnRpbWUKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL25hdGl2ZS9pbmNsdWRlIFwKZGlmZiAtLWdpdCBhL25hdGl2ZS9hbmRyb2lkL2FjdGl2aXR5LmNwcCBiL25hdGl2ZS9hbmRyb2lkL2FjdGl2aXR5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9uYXRpdmUvYW5kcm9pZC9hY3Rpdml0eS5jcHAKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbmF0aXZlL2FuZHJvaWQvaW5wdXQuY3BwIGIvbmF0aXZlL2FuZHJvaWQvaW5wdXQuY3BwCmluZGV4IDg0OTg4NDAuLmE0ZGRlNTEgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9hbmRyb2lkL2lucHV0LmNwcAorKysgYi9uYXRpdmUvYW5kcm9pZC9pbnB1dC5jcHAKQEAgLTIwLDYgKzIwLDkgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2lucHV0Lmg+CiAjaW5jbHVkZSA8dWkvSW5wdXQuaD4KICNpbmNsdWRlIDx1aS9JbnB1dFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHV0aWxzL1BvbGxMb29wLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF9hcHBfTmF0aXZlQWN0aXZpdHkuaD4KIAogI2luY2x1ZGUgPHBvbGwuaD4KIApAQCAtMTg0LDU5ICsxODcsMjMgQEAKICAgICAgICAgICAgIHBvaW50ZXJfaW5kZXgsIGhpc3RvcnlfaW5kZXgpOwogfQogCi1pbnQgQUlucHV0UXVldWVfZ2V0RmQoQUlucHV0UXVldWUqIHF1ZXVlKSB7Ci0gICAgcmV0dXJuIHF1ZXVlLT5nZXRDb25zdW1lcigpLmdldENoYW5uZWwoKS0+Z2V0UmVjZWl2ZVBpcGVGZCgpOwordm9pZCBBSW5wdXRRdWV1ZV9hdHRhY2hMb29wZXIoQUlucHV0UXVldWUqIHF1ZXVlLCBBTG9vcGVyKiBsb29wZXIsCisgICAgICAgIEFMb29wZXJfY2FsbGJhY2tGdW5jKiBjYWxsYmFjaywgdm9pZCogZGF0YSkgeworICAgIHF1ZXVlLT5hdHRhY2hMb29wZXIobG9vcGVyLCBjYWxsYmFjaywgZGF0YSk7Cit9CisKK3ZvaWQgQUlucHV0UXVldWVfZGV0YWNoTG9vcGVyKEFJbnB1dFF1ZXVlKiBxdWV1ZSkgeworICAgIHF1ZXVlLT5kZXRhY2hMb29wZXIoKTsKIH0KIAogaW50IEFJbnB1dFF1ZXVlX2hhc0V2ZW50cyhBSW5wdXRRdWV1ZSogcXVldWUpIHsKLSAgICBzdHJ1Y3QgcG9sbGZkIHBmZDsKLSAgICAKLSAgICBwZmQuZmQgPSBxdWV1ZS0+Z2V0Q29uc3VtZXIoKS5nZXRDaGFubmVsKCktPmdldFJlY2VpdmVQaXBlRmQoKTsKLSAgICBwZmQuZXZlbnRzID0gUE9MTElOOwotICAgIHBmZC5yZXZlbnRzID0gMDsKLSAgICAKLSAgICBpbnQgbmZkID0gcG9sbCgmcGZkLCAxLCAwKTsKLSAgICBpZiAobmZkIDw9IDApIHJldHVybiBuZmQ7Ci0gICAgcmV0dXJuIHBmZC5yZXZlbnRzID09IFBPTExJTiA/IDEgOiAtMTsKKyAgICByZXR1cm4gcXVldWUtPmhhc0V2ZW50cygpOwogfQogCiBpbnQzMl90IEFJbnB1dFF1ZXVlX2dldEV2ZW50KEFJbnB1dFF1ZXVlKiBxdWV1ZSwgQUlucHV0RXZlbnQqKiBvdXRFdmVudCkgewotICAgICpvdXRFdmVudCA9IE5VTEw7Ci0gICAgCi0gICAgaW50MzJfdCByZXMgPSBxdWV1ZS0+Z2V0Q29uc3VtZXIoKS5yZWNlaXZlRGlzcGF0Y2hTaWduYWwoKTsKLSAgICBpZiAocmVzICE9IGFuZHJvaWQ6Ok9LKSB7Ci0gICAgICAgIExPR0UoImNoYW5uZWwgJyVzJyB+IEZhaWxlZCB0byByZWNlaXZlIGRpc3BhdGNoIHNpZ25hbC4gIHN0YXR1cz0lZCIsCi0gICAgICAgICAgICAgICAgcXVldWUtPmdldENvbnN1bWVyKCkuZ2V0Q2hhbm5lbCgpLT5nZXROYW1lKCkuc3RyaW5nKCksIHJlcyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgSW5wdXRFdmVudCogbXlFdmVudCA9IE5VTEw7Ci0gICAgcmVzID0gcXVldWUtPmNvbnN1bWUoJm15RXZlbnQpOwotICAgIGlmIChyZXMgIT0gYW5kcm9pZDo6T0spIHsKLSAgICAgICAgTE9HVygiY2hhbm5lbCAnJXMnIH4gRmFpbGVkIHRvIGNvbnN1bWUgaW5wdXQgZXZlbnQuICBzdGF0dXM9JWQiLAotICAgICAgICAgICAgICAgIHF1ZXVlLT5nZXRDb25zdW1lcigpLmdldENoYW5uZWwoKS0+Z2V0TmFtZSgpLnN0cmluZygpLCByZXMpOwotICAgICAgICBxdWV1ZS0+Z2V0Q29uc3VtZXIoKS5zZW5kRmluaXNoZWRTaWduYWwoKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICAqb3V0RXZlbnQgPSBteUV2ZW50OwotICAgIHJldHVybiAwOworICAgIHJldHVybiBxdWV1ZS0+Z2V0RXZlbnQob3V0RXZlbnQpOwogfQogCi12b2lkIEFJbnB1dFF1ZXVlX2ZpbmlzaEV2ZW50KEFJbnB1dFF1ZXVlKiBxdWV1ZSwgQUlucHV0RXZlbnQqIGV2ZW50LAotICAgICAgICBpbnQgaGFuZGxlZCkgewotICAgIGlmICghaGFuZGxlZCAmJiAoKElucHV0RXZlbnQqKWV2ZW50KS0+Z2V0VHlwZSgpID09IElOUFVUX0VWRU5UX1RZUEVfS0VZCi0gICAgICAgICAgICAmJiAoKEtleUV2ZW50KilldmVudCktPmhhc0RlZmF1bHRBY3Rpb24oKSkgewotICAgICAgICAvLyBUaGUgYXBwIGRpZG4ndCBoYW5kbGUgdGhpcywgYnV0IGl0IG1heSBoYXZlIGEgZGVmYXVsdCBhY3Rpb24KLSAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGl0LiAgV2UgbmVlZCB0byBoYW5kIHRoaXMgYmFjayB0byBKYXZhIHRvIGJlCi0gICAgICAgIC8vIGV4ZWN1dGVkLgotICAgICAgICBxdWV1ZS0+ZG9EZWZhdWx0S2V5KChLZXlFdmVudCopZXZlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGludDMyX3QgcmVzID0gcXVldWUtPmdldENvbnN1bWVyKCkuc2VuZEZpbmlzaGVkU2lnbmFsKCk7Ci0gICAgaWYgKHJlcyAhPSBhbmRyb2lkOjpPSykgewotICAgICAgICBMT0dXKCJGYWlsZWQgdG8gc2VuZCBmaW5pc2hlZCBzaWduYWwgb24gY2hhbm5lbCAnJXMnLiAgc3RhdHVzPSVkIiwKLSAgICAgICAgICAgICAgICBxdWV1ZS0+Z2V0Q29uc3VtZXIoKS5nZXRDaGFubmVsKCktPmdldE5hbWUoKS5zdHJpbmcoKSwgcmVzKTsKLSAgICB9Cit2b2lkIEFJbnB1dFF1ZXVlX2ZpbmlzaEV2ZW50KEFJbnB1dFF1ZXVlKiBxdWV1ZSwgQUlucHV0RXZlbnQqIGV2ZW50LCBpbnQgaGFuZGxlZCkgeworICAgIHF1ZXVlLT5maW5pc2hFdmVudChldmVudCwgaGFuZGxlZCAhPSAwKTsKIH0KZGlmZiAtLWdpdCBhL25hdGl2ZS9hbmRyb2lkL2xvb3Blci5jcHAgYi9uYXRpdmUvYW5kcm9pZC9sb29wZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjRjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvYW5kcm9pZC9sb29wZXIuY3BwCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFMb29wZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2xvb3Blci5oPgorI2luY2x1ZGUgPHV0aWxzL1BvbGxMb29wLmg+CisKK3VzaW5nIGFuZHJvaWQ6OlBvbGxMb29wOwordXNpbmcgYW5kcm9pZDo6c3A7CisKK0FMb29wZXIqIEFMb29wZXJfZm9yVGhyZWFkKCkgeworICAgIHJldHVybiBQb2xsTG9vcDo6Z2V0Rm9yVGhyZWFkKCkuZ2V0KCk7Cit9CisKK0FMb29wZXIqIEFMb29wZXJfcHJlcGFyZShpbnQzMl90IG9wdHMpIHsKKyAgICBib29sIGFsbG93RmRzID0gKG9wdHMmQUxPT1BFUl9QUkVQQVJFX0FMTE9XX05PTl9DQUxMQkFDS1MpICE9IDA7CisgICAgc3A8UG9sbExvb3A+IGxvb3AgPSBQb2xsTG9vcDo6Z2V0Rm9yVGhyZWFkKCk7CisgICAgaWYgKGxvb3AgPT0gTlVMTCkgeworICAgICAgICBsb29wID0gbmV3IFBvbGxMb29wKGFsbG93RmRzKTsKKyAgICAgICAgUG9sbExvb3A6OnNldEZvclRocmVhZChsb29wKTsKKyAgICB9CisgICAgaWYgKGxvb3AtPmdldEFsbG93Tm9uQ2FsbGJhY2tzKCkgIT0gYWxsb3dGZHMpIHsKKyAgICAgICAgTE9HVygiQUxvb3Blcl9wcmVwYXJlIGFnYWluIHdpdGggZGlmZmVyZW50IEFMT09QRVJfUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTIik7CisgICAgfQorICAgIHJldHVybiBsb29wLmdldCgpOworfQorCitpbnQzMl90IEFMb29wZXJfcG9sbE9uY2UoaW50IHRpbWVvdXRNaWxsaXMsIGludCogb3V0RXZlbnRzLCB2b2lkKiogb3V0RGF0YSkgeworICAgIHNwPFBvbGxMb29wPiBsb29wID0gUG9sbExvb3A6OmdldEZvclRocmVhZCgpOworICAgIGlmIChsb29wID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiQUxvb3Blcl9wb2xsT25jZTogTm8gbG9vcGVyIGZvciB0aGlzIHRocmVhZCEiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbG9vcC0+cG9sbE9uY2UodGltZW91dE1pbGxpcywgb3V0RXZlbnRzLCBvdXREYXRhKTsKK30KKworaW50MzJfdCBBTG9vcGVyX3BvbGxBbGwoaW50IHRpbWVvdXRNaWxsaXMsIGludCogb3V0RXZlbnRzLCB2b2lkKiogb3V0RGF0YSkgeworICAgIHNwPFBvbGxMb29wPiBsb29wID0gUG9sbExvb3A6OmdldEZvclRocmVhZCgpOworICAgIGlmIChsb29wID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiQUxvb3Blcl9wb2xsT25jZTogTm8gbG9vcGVyIGZvciB0aGlzIHRocmVhZCEiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBpbnQzMl90IHJlc3VsdDsKKyAgICB3aGlsZSAoKHJlc3VsdCA9IGxvb3AtPnBvbGxPbmNlKHRpbWVvdXRNaWxsaXMsIG91dEV2ZW50cywgb3V0RGF0YSkpID09IEFMT09QRVJfUE9MTF9DQUxMQkFDSykgeworICAgICAgICA7CisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQUxvb3Blcl9hY3F1aXJlKEFMb29wZXIqIGxvb3BlcikgeworICAgIHN0YXRpY19jYXN0PFBvbGxMb29wKj4obG9vcGVyKS0+aW5jU3Ryb25nKCh2b2lkKilBTG9vcGVyX2FjcXVpcmUpOworfQorCit2b2lkIEFMb29wZXJfcmVsZWFzZShBTG9vcGVyKiBsb29wZXIpIHsKKyAgICBzdGF0aWNfY2FzdDxQb2xsTG9vcCo+KGxvb3BlciktPmRlY1N0cm9uZygodm9pZCopQUxvb3Blcl9hY3F1aXJlKTsKK30KKwordm9pZCBBTG9vcGVyX2FkZEZkKEFMb29wZXIqIGxvb3BlciwgaW50IGZkLCBpbnQgZXZlbnRzLAorICAgICAgICBBTG9vcGVyX2NhbGxiYWNrRnVuYyogY2FsbGJhY2ssIHZvaWQqIGRhdGEpIHsKKyAgICBzdGF0aWNfY2FzdDxQb2xsTG9vcCo+KGxvb3BlciktPnNldExvb3BlckNhbGxiYWNrKGZkLCBldmVudHMsIGNhbGxiYWNrLCBkYXRhKTsKK30KKworaW50MzJfdCBBTG9vcGVyX3JlbW92ZUZkKEFMb29wZXIqIGxvb3BlciwgaW50IGZkKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFBvbGxMb29wKj4obG9vcGVyKS0+cmVtb3ZlQ2FsbGJhY2soZmQpID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9uYXRpdmUvYW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuY3BwIGIvbmF0aXZlL2FuZHJvaWQvbmF0aXZlX2FjdGl2aXR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzY4MjNhCi0tLSAvZGV2L251bGwKKysrIGIvbmF0aXZlL2FuZHJvaWQvbmF0aXZlX2FjdGl2aXR5LmNwcApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJuYXRpdmVfYWN0aXZpdHkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF9hcHBfTmF0aXZlQWN0aXZpdHkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3ZvaWQgQU5hdGl2ZUFjdGl2aXR5X3NldFdpbmRvd0Zvcm1hdChBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBpbnQzMl90IGZvcm1hdCkgeworCWFuZHJvaWRfTmF0aXZlQWN0aXZpdHlfc2V0V2luZG93Rm9ybWF0KGFjdGl2aXR5LCBmb3JtYXQpOworfQorCit2b2lkIEFOYXRpdmVBY3Rpdml0eV9zZXRXaW5kb3dGbGFncyhBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LAorCQl1aW50MzJfdCBhZGRGbGFncywgdWludDMyX3QgcmVtb3ZlRmxhZ3MpIHsKKwlhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X3NldFdpbmRvd0ZsYWdzKGFjdGl2aXR5LCBhZGRGbGFncywgYWRkRmxhZ3N8cmVtb3ZlRmxhZ3MpOworfQorCit2b2lkIEFOYXRpdmVBY3Rpdml0eV9zaG93U29mdElucHV0KEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIHVpbnQzMl90IGZsYWdzKSB7CisJYW5kcm9pZF9OYXRpdmVBY3Rpdml0eV9zaG93U29mdElucHV0KGFjdGl2aXR5LCBmbGFncyk7Cit9CisKK3ZvaWQgQU5hdGl2ZUFjdGl2aXR5X2hpZGVTb2Z0SW5wdXQoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgdWludDMyX3QgZmxhZ3MpIHsKKwlhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X2hpZGVTb2Z0SW5wdXQoYWN0aXZpdHksIGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL25hdGl2ZS9hbmRyb2lkL25hdGl2ZV93aW5kb3cuY3BwIGIvbmF0aXZlL2FuZHJvaWQvbmF0aXZlX3dpbmRvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkYTA3OAotLS0gL2Rldi9udWxsCisrKyBiL25hdGl2ZS9hbmRyb2lkL25hdGl2ZV93aW5kb3cuY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN1cmZhY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3dfam5pLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworQU5hdGl2ZVdpbmRvdyogQU5hdGl2ZVdpbmRvd19mcm9tU3VyZmFjZShKTklFbnYqIGVudiwgam9iamVjdCBzdXJmYWNlKSB7CisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luID0gYW5kcm9pZF9TdXJmYWNlX2dldE5hdGl2ZVdpbmRvdyhlbnYsIHN1cmZhY2UpOworICAgIGlmICh3aW4gIT0gTlVMTCkgeworICAgICAgICB3aW4tPmluY1N0cm9uZygodm9pZCopQU5hdGl2ZVdpbmRvd19hY3F1aXJlKTsKKyAgICB9CisgICAgcmV0dXJuIHdpbi5nZXQoKTsKK30KKwordm9pZCBBTmF0aXZlV2luZG93X2FjcXVpcmUoQU5hdGl2ZVdpbmRvdyogd2luZG93KSB7CisgICAgd2luZG93LT5pbmNTdHJvbmcoKHZvaWQqKUFOYXRpdmVXaW5kb3dfYWNxdWlyZSk7Cit9CisKK3ZvaWQgQU5hdGl2ZVdpbmRvd19yZWxlYXNlKEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIHdpbmRvdy0+ZGVjU3Ryb25nKCh2b2lkKilBTmF0aXZlV2luZG93X2FjcXVpcmUpOworfQorCitzdGF0aWMgaW50MzJfdCBnZXRXaW5kb3dQcm9wKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50IHdoYXQpIHsKKyAgICBpbnQgdmFsdWU7CisgICAgaW50IHJlcyA9IHdpbmRvdy0+cXVlcnkod2luZG93LCB3aGF0LCAmdmFsdWUpOworICAgIHJldHVybiByZXMgPCAwID8gcmVzIDogdmFsdWU7Cit9CisKK2ludDMyX3QgQU5hdGl2ZVdpbmRvd19nZXRXaWR0aChBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICByZXR1cm4gZ2V0V2luZG93UHJvcCh3aW5kb3csIE5BVElWRV9XSU5ET1dfV0lEVEgpOworfQorCitpbnQzMl90IEFOYXRpdmVXaW5kb3dfZ2V0SGVpZ2h0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIHJldHVybiBnZXRXaW5kb3dQcm9wKHdpbmRvdywgTkFUSVZFX1dJTkRPV19IRUlHSFQpOworfQorCitpbnQzMl90IEFOYXRpdmVXaW5kb3dfZ2V0Rm9ybWF0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIHJldHVybiBnZXRXaW5kb3dQcm9wKHdpbmRvdywgTkFUSVZFX1dJTkRPV19GT1JNQVQpOworfQorCitpbnQzMl90IEFOYXRpdmVXaW5kb3dfc2V0QnVmZmVyc0dlb21ldHJ5KEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KHdpbmRvdywgd2lkdGgsIGhlaWdodCwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgQU5hdGl2ZVdpbmRvd19sb2NrKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgQU5hdGl2ZVdpbmRvd19CdWZmZXIqIG91dEJ1ZmZlciwKKyAgICAgICAgQVJlY3QqIGluT3V0RGlydHlCb3VuZHMpIHsKKyAgICBSZWdpb24gZGlydHlSZWdpb247CisgICAgUmVnaW9uKiBkaXJ0eVBhcmFtID0gTlVMTDsKKyAgICBpZiAoaW5PdXREaXJ0eUJvdW5kcyAhPSBOVUxMKSB7CisgICAgICAgIGRpcnR5UmVnaW9uLnNldCgqKFJlY3QqKWluT3V0RGlydHlCb3VuZHMpOworICAgICAgICBkaXJ0eVBhcmFtID0gJmRpcnR5UmVnaW9uOworICAgIH0KKyAgICAKKyAgICBTdXJmYWNlOjpTdXJmYWNlSW5mbyBpbmZvOworICAgIHN0YXR1c190IHJlcyA9IHN0YXRpY19jYXN0PFN1cmZhY2UqPih3aW5kb3cpLT5sb2NrKCZpbmZvLCBkaXJ0eVBhcmFtKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgb3V0QnVmZmVyLT53aWR0aCA9IChpbnQzMl90KWluZm8udzsKKyAgICBvdXRCdWZmZXItPmhlaWdodCA9IChpbnQzMl90KWluZm8uaDsKKyAgICBvdXRCdWZmZXItPnN0cmlkZSA9IChpbnQzMl90KWluZm8uczsKKyAgICBvdXRCdWZmZXItPmZvcm1hdCA9IChpbnQzMl90KWluZm8uZm9ybWF0OworICAgIG91dEJ1ZmZlci0+Yml0cyA9IGluZm8uYml0czsKKyAgICAKKyAgICBpZiAoaW5PdXREaXJ0eUJvdW5kcyAhPSBOVUxMKSB7CisgICAgICAgICppbk91dERpcnR5Qm91bmRzID0gZGlydHlSZWdpb24uZ2V0Qm91bmRzKCk7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQorCitpbnQzMl90IEFOYXRpdmVXaW5kb3dfdW5sb2NrQW5kUG9zdChBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBzdGF0aWNfY2FzdDxTdXJmYWNlKj4od2luZG93KS0+dW5sb2NrQW5kUG9zdCgpOworICAgIHJldHVybiByZXMgPT0gYW5kcm9pZDo6T0sgPyAwIDogLTE7Cit9CmRpZmYgLS1naXQgYS9uYXRpdmUvZ2x1ZS90aHJlYWRlZF9hcHAvQW5kcm9pZC5tayBiL25hdGl2ZS9nbHVlL3RocmVhZGVkX2FwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzliMmEKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvZ2x1ZS90aHJlYWRlZF9hcHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE4IEBACitCQVNFX1BBVEggOj0gJChjYWxsIG15LWRpcikKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBvdXIgc291cmNlIGZpbGVzCisjCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgdGhyZWFkZWRfYXBwLmMKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL25hdGl2ZS9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkvYW5kcm9pZCBcCisgICAgZGFsdmlrL2xpYm5hdGl2ZWhlbHBlci9pbmNsdWRlL25hdGl2ZWhlbHBlcgorCitMT0NBTF9NT0RVTEU6PSBsaWJ0aHJlYWRlZF9hcHAKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbmF0aXZlL2dsdWUvdGhyZWFkZWRfYXBwL3RocmVhZGVkX2FwcC5jIGIvbmF0aXZlL2dsdWUvdGhyZWFkZWRfYXBwL3RocmVhZGVkX2FwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MmM3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvZ2x1ZS90aHJlYWRlZF9hcHAvdGhyZWFkZWRfYXBwLmMKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGpuaS5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZF9nbHVlL3RocmVhZGVkX2FwcC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKworI2RlZmluZSBMT0dJKC4uLikgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgInRocmVhZGVkX2FwcCIsIF9fVkFfQVJHU19fKSkKKyNkZWZpbmUgTE9HVyguLi4pICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1dBUk4sICJ0aHJlYWRlZF9hcHAiLCBfX1ZBX0FSR1NfXykpCisKK2ludDhfdCBhbmRyb2lkX2FwcF9yZWFkX2NtZChzdHJ1Y3QgYW5kcm9pZF9hcHAqIGFuZHJvaWRfYXBwKSB7CisgICAgaW50OF90IGNtZDsKKyAgICBpZiAocmVhZChhbmRyb2lkX2FwcC0+bXNncmVhZCwgJmNtZCwgc2l6ZW9mKGNtZCkpID09IHNpemVvZihjbWQpKSB7CisgICAgICAgIHJldHVybiBjbWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVygiTm8gZGF0YSBvbiBjb21tYW5kIHBpcGUhIik7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworaW50MzJfdCBhbmRyb2lkX2FwcF9leGVjX2NtZChzdHJ1Y3QgYW5kcm9pZF9hcHAqIGFuZHJvaWRfYXBwLCBpbnQ4X3QgY21kKSB7CisgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBBUFBfQ01EX0lOUFVUX0NIQU5HRUQ6CisgICAgICAgICAgICBMT0dJKCJBUFBfQ01EX0lOUFVUX0NIQU5HRURcbiIpOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgICAgICAgICAgaWYgKGFuZHJvaWRfYXBwLT5pbnB1dFF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBSW5wdXRRdWV1ZV9kZXRhY2hMb29wZXIoYW5kcm9pZF9hcHAtPmlucHV0UXVldWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5kcm9pZF9hcHAtPmlucHV0UXVldWUgPSBhbmRyb2lkX2FwcC0+cGVuZGluZ0lucHV0UXVldWU7CisgICAgICAgICAgICBpZiAoYW5kcm9pZF9hcHAtPmlucHV0UXVldWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIExPR0koIkF0dGFjaGluZyBpbnB1dCBxdWV1ZSB0byBsb29wZXIiKTsKKyAgICAgICAgICAgICAgICBBSW5wdXRRdWV1ZV9hdHRhY2hMb29wZXIoYW5kcm9pZF9hcHAtPmlucHV0UXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2FwcC0+bG9vcGVyLCBOVUxMLCAodm9pZCopTE9PUEVSX0lEX0VWRU5UKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJmFuZHJvaWRfYXBwLT5jb25kKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBUFBfQ01EX1dJTkRPV19DSEFOR0VEOgorICAgICAgICAgICAgTE9HSSgiQVBQX0NNRF9XSU5ET1dfQ0hBTkdFRFxuIik7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgICAgICAgICBhbmRyb2lkX2FwcC0+d2luZG93ID0gYW5kcm9pZF9hcHAtPnBlbmRpbmdXaW5kb3c7CisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZhbmRyb2lkX2FwcC0+Y29uZCk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVBQX0NNRF9TVEFSVDoKKyAgICAgICAgY2FzZSBBUFBfQ01EX1JFU1VNRToKKyAgICAgICAgY2FzZSBBUFBfQ01EX1BBVVNFOgorICAgICAgICBjYXNlIEFQUF9DTURfU1RPUDoKKyAgICAgICAgICAgIExPR0koImFjdGl2aXR5U3RhdGU9JWRcbiIsIGNtZCk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgICAgICAgICBhbmRyb2lkX2FwcC0+YWN0aXZpdHlTdGF0ZSA9IGNtZDsKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJmFuZHJvaWRfYXBwLT5jb25kKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBUFBfQ01EX1dJTkRPV19SRURSQVdfTkVFREVEOgorICAgICAgICAgICAgTE9HSSgiQVBQX0NNRF9XSU5ET1dfUkVEUkFXX05FRURFRFxuIik7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgICAgICAgICBhbmRyb2lkX2FwcC0+cmVkcmF3TmVlZGVkID0gMDsKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJmFuZHJvaWRfYXBwLT5jb25kKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBUFBfQ01EX0NPTlRFTlRfUkVDVF9DSEFOR0VEOgorICAgICAgICAgICAgTE9HSSgiQVBQX0NNRF9DT05URU5UX1JFQ1RfQ0hBTkdFRFxuIik7CisgICAgICAgICAgICBhbmRyb2lkX2FwcC0+Y29udGVudFJlY3QgPSBhbmRyb2lkX2FwcC0+cGVuZGluZ0NvbnRlbnRSZWN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBUFBfQ01EX0RFU1RST1k6CisgICAgICAgICAgICBMT0dJKCJBUFBfQ01EX0RFU1RST1lcbiIpOworICAgICAgICAgICAgYW5kcm9pZF9hcHAtPmRlc3Ryb3lSZXF1ZXN0ZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIHJldHVybiBhbmRyb2lkX2FwcC0+ZGVzdHJveVJlcXVlc3RlZCA/IDAgOiAxOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX2FwcF9kZXN0cm95KHN0cnVjdCBhbmRyb2lkX2FwcCogYW5kcm9pZF9hcHApIHsKKyAgICBMT0dJKCJhbmRyb2lkX2FwcF9kZXN0cm95ISIpOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKKyAgICBpZiAoYW5kcm9pZF9hcHAtPmlucHV0UXVldWUgIT0gTlVMTCkgeworICAgICAgICBBSW5wdXRRdWV1ZV9kZXRhY2hMb29wZXIoYW5kcm9pZF9hcHAtPmlucHV0UXVldWUpOworICAgIH0KKyAgICBhbmRyb2lkX2FwcC0+ZGVzdHJveWVkID0gMTsKKyAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZhbmRyb2lkX2FwcC0+Y29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgLy8gQ2FuJ3QgdG91Y2ggYW5kcm9pZF9hcHAgb2JqZWN0IGFmdGVyIHRoaXMuCit9CisKK3N0YXRpYyB2b2lkKiBhbmRyb2lkX2FwcF9lbnRyeSh2b2lkKiBwYXJhbSkgeworICAgIHN0cnVjdCBhbmRyb2lkX2FwcCogYW5kcm9pZF9hcHAgPSAoc3RydWN0IGFuZHJvaWRfYXBwKilwYXJhbTsKKyAgICAKKyAgICBBTG9vcGVyKiBsb29wZXIgPSBBTG9vcGVyX3ByZXBhcmUoQUxPT1BFUl9QUkVQQVJFX0FMTE9XX05PTl9DQUxMQkFDS1MpOworICAgIEFMb29wZXJfYWRkRmQobG9vcGVyLCBhbmRyb2lkX2FwcC0+bXNncmVhZCwgUE9MTElOLCBOVUxMLCAodm9pZCopTE9PUEVSX0lEX01BSU4pOworICAgIGFuZHJvaWRfYXBwLT5sb29wZXIgPSBsb29wZXI7CisgICAgCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgIGFuZHJvaWRfYXBwLT5ydW5uaW5nID0gMTsKKyAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZhbmRyb2lkX2FwcC0+Y29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgCisgICAgYW5kcm9pZF9tYWluKGFuZHJvaWRfYXBwKTsKKyAgICAKKyAgICBhbmRyb2lkX2FwcF9kZXN0cm95KGFuZHJvaWRfYXBwKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5hdGl2ZSBhY3Rpdml0eSBpbnRlcmFjdGlvbiAoY2FsbGVkIGZyb20gbWFpbiB0aHJlYWQpCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3RydWN0IGFuZHJvaWRfYXBwKiBhbmRyb2lkX2FwcF9jcmVhdGUoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSkgeworICAgIHN0cnVjdCBhbmRyb2lkX2FwcCogYW5kcm9pZF9hcHAgPSAoc3RydWN0IGFuZHJvaWRfYXBwKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbmRyb2lkX2FwcCkpOworICAgIG1lbXNldChhbmRyb2lkX2FwcCwgMCwgc2l6ZW9mKHN0cnVjdCBhbmRyb2lkX2FwcCkpOworICAgIGFuZHJvaWRfYXBwLT5hY3Rpdml0eSA9IGFjdGl2aXR5OworICAgIAorICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmYW5kcm9pZF9hcHAtPm11dGV4LCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmYW5kcm9pZF9hcHAtPmNvbmQsIE5VTEwpOworICAgIAorICAgIGludCBtc2dwaXBlWzJdOworICAgIGlmIChwaXBlKG1zZ3BpcGUpKSB7CisgICAgICAgIExPR0koImNvdWxkIG5vdCBjcmVhdGUgcGlwZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKyAgICBhbmRyb2lkX2FwcC0+bXNncmVhZCA9IG1zZ3BpcGVbMF07CisgICAgYW5kcm9pZF9hcHAtPm1zZ3dyaXRlID0gbXNncGlwZVsxXTsKKyAgICBpbnQgcmVzdWx0ID0gZmNudGwoYW5kcm9pZF9hcHAtPm1zZ3JlYWQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOworICAgIGlmIChyZXN1bHQgIT0gMCkgTE9HVygiQ291bGQgbm90IG1ha2UgbWVzc2FnZSByZWFkIHBpcGUgIgorICAgICAgICAgICAgIm5vbi1ibG9ja2luZzogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJlc3VsdCA9IGZjbnRsKGFuZHJvaWRfYXBwLT5tc2d3cml0ZSwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisgICAgaWYgKHJlc3VsdCAhPSAwKSBMT0dXKCJDb3VsZCBub3QgbWFrZSBtZXNzYWdlIHdyaXRlIHBpcGUgIgorICAgICAgICAgICAgIm5vbi1ibG9ja2luZzogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIAorICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7IAorICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsKKyAgICBwdGhyZWFkX2NyZWF0ZSgmYW5kcm9pZF9hcHAtPnRocmVhZCwgJmF0dHIsIGFuZHJvaWRfYXBwX2VudHJ5LCBhbmRyb2lkX2FwcCk7CisgICAgCisgICAgLy8gV2FpdCBmb3IgdGhyZWFkIHRvIHN0YXJ0LgorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKKyAgICB3aGlsZSAoIWFuZHJvaWRfYXBwLT5ydW5uaW5nKSB7CisgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZhbmRyb2lkX2FwcC0+Y29uZCwgJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgIAorICAgIHJldHVybiBhbmRyb2lkX2FwcDsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9hcHBfd3JpdGVfY21kKHN0cnVjdCBhbmRyb2lkX2FwcCogYW5kcm9pZF9hcHAsIGludDhfdCBjbWQpIHsKKyAgICBpZiAod3JpdGUoYW5kcm9pZF9hcHAtPm1zZ3dyaXRlLCAmY21kLCBzaXplb2YoY21kKSkgIT0gc2l6ZW9mKGNtZCkpIHsKKyAgICAgICAgTE9HSSgiRmFpbHVyZSB3cml0aW5nIGFuZHJvaWRfYXBwIGNtZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX2FwcF9zZXRfaW5wdXQoc3RydWN0IGFuZHJvaWRfYXBwKiBhbmRyb2lkX2FwcCwgQUlucHV0UXVldWUqIGlucHV0UXVldWUpIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgYW5kcm9pZF9hcHAtPnBlbmRpbmdJbnB1dFF1ZXVlID0gaW5wdXRRdWV1ZTsKKyAgICBhbmRyb2lkX2FwcF93cml0ZV9jbWQoYW5kcm9pZF9hcHAsIEFQUF9DTURfSU5QVVRfQ0hBTkdFRCk7CisgICAgd2hpbGUgKGFuZHJvaWRfYXBwLT5pbnB1dFF1ZXVlICE9IGFuZHJvaWRfYXBwLT5wZW5kaW5nSW5wdXRRdWV1ZSkgeworICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmYW5kcm9pZF9hcHAtPmNvbmQsICZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9hcHBfc2V0X3dpbmRvdyhzdHJ1Y3QgYW5kcm9pZF9hcHAqIGFuZHJvaWRfYXBwLCBBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgYW5kcm9pZF9hcHAtPnBlbmRpbmdXaW5kb3cgPSB3aW5kb3c7CisgICAgYW5kcm9pZF9hcHBfd3JpdGVfY21kKGFuZHJvaWRfYXBwLCBBUFBfQ01EX1dJTkRPV19DSEFOR0VEKTsKKyAgICB3aGlsZSAoYW5kcm9pZF9hcHAtPndpbmRvdyAhPSBhbmRyb2lkX2FwcC0+cGVuZGluZ1dpbmRvdykgeworICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmYW5kcm9pZF9hcHAtPmNvbmQsICZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9hcHBfc2V0X2FjdGl2aXR5X3N0YXRlKHN0cnVjdCBhbmRyb2lkX2FwcCogYW5kcm9pZF9hcHAsIGludDhfdCBjbWQpIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgYW5kcm9pZF9hcHBfd3JpdGVfY21kKGFuZHJvaWRfYXBwLCBjbWQpOworICAgIHdoaWxlIChhbmRyb2lkX2FwcC0+YWN0aXZpdHlTdGF0ZSAhPSBjbWQpIHsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmFuZHJvaWRfYXBwLT5jb25kLCAmYW5kcm9pZF9hcHAtPm11dGV4KTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfYXBwX3dhaXRfcmVkcmF3KHN0cnVjdCBhbmRyb2lkX2FwcCogYW5kcm9pZF9hcHApIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgYW5kcm9pZF9hcHAtPnJlZHJhd05lZWRlZCA9IDE7CisgICAgYW5kcm9pZF9hcHBfd3JpdGVfY21kKGFuZHJvaWRfYXBwLCBBUFBfQ01EX1dJTkRPV19SRURSQVdfTkVFREVEKTsKKyAgICB3aGlsZSAoYW5kcm9pZF9hcHAtPnJlZHJhd05lZWRlZCkgeworICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmYW5kcm9pZF9hcHAtPmNvbmQsICZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9hcHBfc2V0X2NvbnRlbnRfcmVjdChzdHJ1Y3QgYW5kcm9pZF9hcHAqIGFuZHJvaWRfYXBwLCBjb25zdCBBUmVjdCogcmVjdCkgeworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKKyAgICBhbmRyb2lkX2FwcC0+cGVuZGluZ0NvbnRlbnRSZWN0ID0gKnJlY3Q7CisgICAgYW5kcm9pZF9hcHBfd3JpdGVfY21kKGFuZHJvaWRfYXBwLCBBUFBfQ01EX0NPTlRFTlRfUkVDVF9DSEFOR0VEKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9hcHBfZnJlZShzdHJ1Y3QgYW5kcm9pZF9hcHAqIGFuZHJvaWRfYXBwKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgIGFuZHJvaWRfYXBwX3dyaXRlX2NtZChhbmRyb2lkX2FwcCwgQVBQX0NNRF9ERVNUUk9ZKTsKKyAgICB3aGlsZSAoIWFuZHJvaWRfYXBwLT5kZXN0cm95ZWQpIHsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmFuZHJvaWRfYXBwLT5jb25kLCAmYW5kcm9pZF9hcHAtPm11dGV4KTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgCisgICAgY2xvc2UoYW5kcm9pZF9hcHAtPm1zZ3JlYWQpOworICAgIGNsb3NlKGFuZHJvaWRfYXBwLT5tc2d3cml0ZSk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmFuZHJvaWRfYXBwLT5jb25kKTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgZnJlZShhbmRyb2lkX2FwcCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uRGVzdHJveShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5KSB7CisgICAgTE9HSSgiRGVzdHJveTogJXBcbiIsIGFjdGl2aXR5KTsKKyAgICBhbmRyb2lkX2FwcF9mcmVlKChzdHJ1Y3QgYW5kcm9pZF9hcHAqKWFjdGl2aXR5LT5pbnN0YW5jZSk7Cit9CisKK3N0YXRpYyB2b2lkIG9uU3RhcnQoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSkgeworICAgIExPR0koIlN0YXJ0OiAlcFxuIiwgYWN0aXZpdHkpOworICAgIGFuZHJvaWRfYXBwX3NldF9hY3Rpdml0eV9zdGF0ZSgoc3RydWN0IGFuZHJvaWRfYXBwKilhY3Rpdml0eS0+aW5zdGFuY2UsIEFQUF9DTURfU1RBUlQpOworfQorCitzdGF0aWMgdm9pZCBvblJlc3VtZShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5KSB7CisgICAgTE9HSSgiUmVzdW1lOiAlcFxuIiwgYWN0aXZpdHkpOworICAgIGFuZHJvaWRfYXBwX3NldF9hY3Rpdml0eV9zdGF0ZSgoc3RydWN0IGFuZHJvaWRfYXBwKilhY3Rpdml0eS0+aW5zdGFuY2UsIEFQUF9DTURfUkVTVU1FKTsKK30KKworc3RhdGljIHZvaWQqIG9uU2F2ZUluc3RhbmNlU3RhdGUoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgc2l6ZV90KiBvdXRMZW4pIHsKKyAgICBMT0dJKCJTYXZlSW5zdGFuY2VTdGF0ZTogJXBcbiIsIGFjdGl2aXR5KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgb25QYXVzZShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5KSB7CisgICAgTE9HSSgiUGF1c2U6ICVwXG4iLCBhY3Rpdml0eSk7CisgICAgYW5kcm9pZF9hcHBfc2V0X2FjdGl2aXR5X3N0YXRlKChzdHJ1Y3QgYW5kcm9pZF9hcHAqKWFjdGl2aXR5LT5pbnN0YW5jZSwgQVBQX0NNRF9QQVVTRSk7Cit9CisKK3N0YXRpYyB2b2lkIG9uU3RvcChBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5KSB7CisgICAgTE9HSSgiU3RvcDogJXBcbiIsIGFjdGl2aXR5KTsKKyAgICBhbmRyb2lkX2FwcF9zZXRfYWN0aXZpdHlfc3RhdGUoKHN0cnVjdCBhbmRyb2lkX2FwcCopYWN0aXZpdHktPmluc3RhbmNlLCBBUFBfQ01EX1NUT1ApOworfQorCitzdGF0aWMgdm9pZCBvbkxvd01lbW9yeShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5KSB7CisgICAgTE9HSSgiTG93TWVtb3J5OiAlcFxuIiwgYWN0aXZpdHkpOworICAgIGFuZHJvaWRfYXBwX3dyaXRlX2NtZCgoc3RydWN0IGFuZHJvaWRfYXBwKilhY3Rpdml0eS0+aW5zdGFuY2UsCisgICAgICAgICAgICBBUFBfQ01EX0xPV19NRU1PUlkpOworfQorCitzdGF0aWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZChBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBpbnQgZm9jdXNlZCkgeworICAgIExPR0koIldpbmRvd0ZvY3VzQ2hhbmdlZDogJXAgLS0gJWRcbiIsIGFjdGl2aXR5LCBmb2N1c2VkKTsKKyAgICBhbmRyb2lkX2FwcF93cml0ZV9jbWQoKHN0cnVjdCBhbmRyb2lkX2FwcCopYWN0aXZpdHktPmluc3RhbmNlLAorICAgICAgICAgICAgZm9jdXNlZCA/IEFQUF9DTURfR0FJTkVEX0ZPQ1VTIDogQVBQX0NNRF9MT1NUX0ZPQ1VTKTsKK30KKworc3RhdGljIHZvaWQgb25OYXRpdmVXaW5kb3dDcmVhdGVkKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIExPR0koIk5hdGl2ZVdpbmRvd0NyZWF0ZWQ6ICVwIC0tICVwXG4iLCBhY3Rpdml0eSwgd2luZG93KTsKKyAgICBhbmRyb2lkX2FwcF9zZXRfd2luZG93KChzdHJ1Y3QgYW5kcm9pZF9hcHAqKWFjdGl2aXR5LT5pbnN0YW5jZSwgd2luZG93KTsKK30KKworc3RhdGljIHZvaWQgb25OYXRpdmVXaW5kb3dSZXNpemVkKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIExPR0koIk5hdGl2ZVdpbmRvd1Jlc2l6ZWQ6ICVwIC0tICVwXG4iLCBhY3Rpdml0eSwgd2luZG93KTsKKyAgICBhbmRyb2lkX2FwcF93cml0ZV9jbWQoKHN0cnVjdCBhbmRyb2lkX2FwcCopYWN0aXZpdHktPmluc3RhbmNlLAorICAgICAgICAgICAgQVBQX0NNRF9XSU5ET1dfUkVTSVpFRCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uTmF0aXZlV2luZG93UmVkcmF3TmVlZGVkKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIExPR0koIk5hdGl2ZVdpbmRvd1JlZHJhd05lZWRlZDogJXAgLS0gJXBcbiIsIGFjdGl2aXR5LCB3aW5kb3cpOworICAgIGFuZHJvaWRfYXBwX3dhaXRfcmVkcmF3KChzdHJ1Y3QgYW5kcm9pZF9hcHAqKWFjdGl2aXR5LT5pbnN0YW5jZSk7Cit9CisKK3N0YXRpYyB2b2lkIG9uQ29udGVudFJlY3RDaGFuZ2VkKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGNvbnN0IEFSZWN0KiByZWN0KSB7CisgICAgTE9HSSgiQ29udGVudFJlY3RDaGFuZ2VkOiAlcCAtLSAoJWQsJWQpLSglZCwlZClcbiIsIGFjdGl2aXR5LCByZWN0LT5sZWZ0LAorICAgICAgICAgICAgcmVjdC0+dG9wLCByZWN0LT5yaWdodCwgcmVjdC0+Ym90dG9tKTsKKyAgICBhbmRyb2lkX2FwcF9zZXRfY29udGVudF9yZWN0KChzdHJ1Y3QgYW5kcm9pZF9hcHAqKWFjdGl2aXR5LT5pbnN0YW5jZSwgcmVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIG9uTmF0aXZlV2luZG93RGVzdHJveWVkKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIExPR0koIk5hdGl2ZVdpbmRvd0Rlc3Ryb3llZDogJXAgLS0gJXBcbiIsIGFjdGl2aXR5LCB3aW5kb3cpOworICAgIGFuZHJvaWRfYXBwX3NldF93aW5kb3coKHN0cnVjdCBhbmRyb2lkX2FwcCopYWN0aXZpdHktPmluc3RhbmNlLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgb25JbnB1dFF1ZXVlQ3JlYXRlZChBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBBSW5wdXRRdWV1ZSogcXVldWUpIHsKKyAgICBMT0dJKCJJbnB1dFF1ZXVlQ3JlYXRlZDogJXAgLS0gJXBcbiIsIGFjdGl2aXR5LCBxdWV1ZSk7CisgICAgYW5kcm9pZF9hcHBfc2V0X2lucHV0KChzdHJ1Y3QgYW5kcm9pZF9hcHAqKWFjdGl2aXR5LT5pbnN0YW5jZSwgcXVldWUpOworfQorCitzdGF0aWMgdm9pZCBvbklucHV0UXVldWVEZXN0cm95ZWQoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgQUlucHV0UXVldWUqIHF1ZXVlKSB7CisgICAgTE9HSSgiSW5wdXRRdWV1ZURlc3Ryb3llZDogJXAgLS0gJXBcbiIsIGFjdGl2aXR5LCBxdWV1ZSk7CisgICAgYW5kcm9pZF9hcHBfc2V0X2lucHV0KChzdHJ1Y3QgYW5kcm9pZF9hcHAqKWFjdGl2aXR5LT5pbnN0YW5jZSwgTlVMTCk7Cit9CisKK3ZvaWQgQU5hdGl2ZUFjdGl2aXR5X29uQ3JlYXRlKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksCisgICAgICAgIHZvaWQqIHNhdmVkU3RhdGUsIHNpemVfdCBzYXZlZFN0YXRlU2l6ZSkgeworICAgIExPR0koIkNyZWF0aW5nOiAlcFxuIiwgYWN0aXZpdHkpOworICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uRGVzdHJveSA9IG9uRGVzdHJveTsKKyAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vblN0YXJ0ID0gb25TdGFydDsKKyAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vblJlc3VtZSA9IG9uUmVzdW1lOworICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uU2F2ZUluc3RhbmNlU3RhdGUgPSBvblNhdmVJbnN0YW5jZVN0YXRlOworICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uUGF1c2UgPSBvblBhdXNlOworICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uU3RvcCA9IG9uU3RvcDsKKyAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vbldpbmRvd0ZvY3VzQ2hhbmdlZCA9IG9uV2luZG93Rm9jdXNDaGFuZ2VkOworICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uTmF0aXZlV2luZG93Q3JlYXRlZCA9IG9uTmF0aXZlV2luZG93Q3JlYXRlZDsKKyAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vbk5hdGl2ZVdpbmRvd1Jlc2l6ZWQgPSBvbk5hdGl2ZVdpbmRvd1Jlc2l6ZWQ7CisgICAgYWN0aXZpdHktPmNhbGxiYWNrcy0+b25OYXRpdmVXaW5kb3dSZWRyYXdOZWVkZWQgPSBvbk5hdGl2ZVdpbmRvd1JlZHJhd05lZWRlZDsKKyAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vbk5hdGl2ZVdpbmRvd0Rlc3Ryb3llZCA9IG9uTmF0aXZlV2luZG93RGVzdHJveWVkOworICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uSW5wdXRRdWV1ZUNyZWF0ZWQgPSBvbklucHV0UXVldWVDcmVhdGVkOworICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uSW5wdXRRdWV1ZURlc3Ryb3llZCA9IG9uSW5wdXRRdWV1ZURlc3Ryb3llZDsKKyAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vbkNvbnRlbnRSZWN0Q2hhbmdlZCA9IG9uQ29udGVudFJlY3RDaGFuZ2VkOworICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uTG93TWVtb3J5ID0gb25Mb3dNZW1vcnk7CisgICAgCisgICAgYWN0aXZpdHktPmluc3RhbmNlID0gYW5kcm9pZF9hcHBfY3JlYXRlKGFjdGl2aXR5KTsKK30KZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvaW5wdXQuaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvaW5wdXQuaAppbmRleCA3NjE3NjYyLi4yNWRkNjhlIDEwMDY0NAotLS0gYS9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL2lucHV0LmgKKysrIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9pbnB1dC5oCkBAIC00Miw2ICs0Miw3IEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2tleWNvZGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb29wZXIuaD4KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKQEAgLTY3LDcgKzY4LDEwIEBACiAgICAgSU5QVVRfREVWSUNFX0NMQVNTX1RPVUNIU0NSRUVOX01UPSAweDAwMDAwMDEwLAogCiAgICAgLyogVGhlIGlucHV0IGRldmljZSBpcyBhIGRpcmVjdGlvbmFsIHBhZC4gKi8KLSAgICBJTlBVVF9ERVZJQ0VfQ0xBU1NfRFBBRCAgICAgICAgICA9IDB4MDAwMDAwMjAKKyAgICBJTlBVVF9ERVZJQ0VfQ0xBU1NfRFBBRCAgICAgICAgICA9IDB4MDAwMDAwMjAsCisKKyAgICAvKiBUaGUgaW5wdXQgZGV2aWNlIGlzIGEgZ2FtZXBhZCAoaW1wbGllcyBrZXlib2FyZCkuICovCisgICAgSU5QVVRfREVWSUNFX0NMQVNTX0dBTUVQQUQgICAgICAgPSAweDAwMDAwMDQwCiB9OwogCiAvKgpAQCAtNTMzLDEyICs1MzcsMTYgQEAKIHR5cGVkZWYgc3RydWN0IEFJbnB1dFF1ZXVlIEFJbnB1dFF1ZXVlOwogCiAvKgotICogUmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgcXVldWUsIHdoaWNoIHlvdQotICogY2FuIHVzZSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIGV2ZW50cyBhdmFpbGFibGUuICBUaGlzCi0gKiBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIHNlbGVjdCgpIG9yIHBvbGwoKSB0byBtdWx0aXBsZXgKLSAqIHdpdGggb3RoZXIga2luZHMgb2YgZXZlbnRzLgorICogQWRkIHRoaXMgaW5wdXQgcXVldWUgdG8gYSBsb29wZXIgZm9yIHByb2Nlc3NpbmcuICBTZWUKKyAqIEFMb29wZXJfYWRkRmQoKSBmb3IgaW5mb3JtYXRpb24gb24gdGhlIGNhbGxiYWNrIGFuZCBkYXRhIHBhcmFtcy4KICAqLwotaW50IEFJbnB1dFF1ZXVlX2dldEZkKEFJbnB1dFF1ZXVlKiBxdWV1ZSk7Cit2b2lkIEFJbnB1dFF1ZXVlX2F0dGFjaExvb3BlcihBSW5wdXRRdWV1ZSogcXVldWUsIEFMb29wZXIqIGxvb3BlciwKKyAgICAgICAgQUxvb3Blcl9jYWxsYmFja0Z1bmMqIGNhbGxiYWNrLCB2b2lkKiBkYXRhKTsKKworLyoKKyAqIFJlbW92ZSB0aGUgaW5wdXQgcXVldWUgZnJvbSB0aGUgbG9vcGVyIGl0IGlzIGN1cnJlbnRseSBhdHRhY2hlZCB0by4KKyAqLwordm9pZCBBSW5wdXRRdWV1ZV9kZXRhY2hMb29wZXIoQUlucHV0UXVldWUqIHF1ZXVlKTsKIAogLyoKICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb25lIG9yIG1vcmUgZXZlbnRzIGF2YWlsYWJsZSBpbiB0aGUKZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQva2V5Y29kZXMuaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQva2V5Y29kZXMuaAppbmRleCAzNjg1NWM1Li40OTZlY2NjMCAxMDA2NDQKLS0tIGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9rZXljb2Rlcy5oCisrKyBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQva2V5Y29kZXMuaApAQCAtNDEsMTE0ICs0MSwxMjIgQEAKIAogLyoKICAqIEtleSBjb2Rlcy4KLSAqCi0gKiBYWFg6IFRoZSBkZWNsYXJhdGlvbnMgaW4gPHVpL0tleWNvZGVMYWJlbC5oPiBzaG91bGQgYmUgdXBkYXRlZCB0byB1c2UgdGhlc2UgaW5zdGVhZC4KLSAqICAgICAgV2Ugc2hvdWxkIHByb2JhYmx5IG1vdmUgdGhpcyBpbnRvIGFuZHJvaWQva2V5Y29kZXMuaCBhbmQgYWRkIHNvbWUgbmV3IEFQSSBmb3IKLSAqICAgICAgZ2V0dGluZyBsYWJlbHMgc28gdGhhdCB3ZSBjYW4gcmVtb3ZlIHRoZSBvdGhlciB0YWJsZXMgYWxzbyBpbiBLZXljb2RlTGFiZWwuaC4KICAqLwogZW51bSB7Ci0gICAgS0VZQ09ERV9VTktOT1dOICAgICAgICAgPSAwLAotICAgIEtFWUNPREVfU09GVF9MRUZUICAgICAgID0gMSwKLSAgICBLRVlDT0RFX1NPRlRfUklHSFQgICAgICA9IDIsCi0gICAgS0VZQ09ERV9IT01FICAgICAgICAgICAgPSAzLAotICAgIEtFWUNPREVfQkFDSyAgICAgICAgICAgID0gNCwKLSAgICBLRVlDT0RFX0NBTEwgICAgICAgICAgICA9IDUsCi0gICAgS0VZQ09ERV9FTkRDQUxMICAgICAgICAgPSA2LAotICAgIEtFWUNPREVfMCAgICAgICAgICAgICAgID0gNywKLSAgICBLRVlDT0RFXzEgICAgICAgICAgICAgICA9IDgsCi0gICAgS0VZQ09ERV8yICAgICAgICAgICAgICAgPSA5LAotICAgIEtFWUNPREVfMyAgICAgICAgICAgICAgID0gMTAsCi0gICAgS0VZQ09ERV80ICAgICAgICAgICAgICAgPSAxMSwKLSAgICBLRVlDT0RFXzUgICAgICAgICAgICAgICA9IDEyLAotICAgIEtFWUNPREVfNiAgICAgICAgICAgICAgID0gMTMsCi0gICAgS0VZQ09ERV83ICAgICAgICAgICAgICAgPSAxNCwKLSAgICBLRVlDT0RFXzggICAgICAgICAgICAgICA9IDE1LAotICAgIEtFWUNPREVfOSAgICAgICAgICAgICAgID0gMTYsCi0gICAgS0VZQ09ERV9TVEFSICAgICAgICAgICAgPSAxNywKLSAgICBLRVlDT0RFX1BPVU5EICAgICAgICAgICA9IDE4LAotICAgIEtFWUNPREVfRFBBRF9VUCAgICAgICAgID0gMTksCi0gICAgS0VZQ09ERV9EUEFEX0RPV04gICAgICAgPSAyMCwKLSAgICBLRVlDT0RFX0RQQURfTEVGVCAgICAgICA9IDIxLAotICAgIEtFWUNPREVfRFBBRF9SSUdIVCAgICAgID0gMjIsCi0gICAgS0VZQ09ERV9EUEFEX0NFTlRFUiAgICAgPSAyMywKLSAgICBLRVlDT0RFX1ZPTFVNRV9VUCAgICAgICA9IDI0LAotICAgIEtFWUNPREVfVk9MVU1FX0RPV04gICAgID0gMjUsCi0gICAgS0VZQ09ERV9QT1dFUiAgICAgICAgICAgPSAyNiwKLSAgICBLRVlDT0RFX0NBTUVSQSAgICAgICAgICA9IDI3LAotICAgIEtFWUNPREVfQ0xFQVIgICAgICAgICAgID0gMjgsCi0gICAgS0VZQ09ERV9BICAgICAgICAgICAgICAgPSAyOSwKLSAgICBLRVlDT0RFX0IgICAgICAgICAgICAgICA9IDMwLAotICAgIEtFWUNPREVfQyAgICAgICAgICAgICAgID0gMzEsCi0gICAgS0VZQ09ERV9EICAgICAgICAgICAgICAgPSAzMiwKLSAgICBLRVlDT0RFX0UgICAgICAgICAgICAgICA9IDMzLAotICAgIEtFWUNPREVfRiAgICAgICAgICAgICAgID0gMzQsCi0gICAgS0VZQ09ERV9HICAgICAgICAgICAgICAgPSAzNSwKLSAgICBLRVlDT0RFX0ggICAgICAgICAgICAgICA9IDM2LAotICAgIEtFWUNPREVfSSAgICAgICAgICAgICAgID0gMzcsCi0gICAgS0VZQ09ERV9KICAgICAgICAgICAgICAgPSAzOCwKLSAgICBLRVlDT0RFX0sgICAgICAgICAgICAgICA9IDM5LAotICAgIEtFWUNPREVfTCAgICAgICAgICAgICAgID0gNDAsCi0gICAgS0VZQ09ERV9NICAgICAgICAgICAgICAgPSA0MSwKLSAgICBLRVlDT0RFX04gICAgICAgICAgICAgICA9IDQyLAotICAgIEtFWUNPREVfTyAgICAgICAgICAgICAgID0gNDMsCi0gICAgS0VZQ09ERV9QICAgICAgICAgICAgICAgPSA0NCwKLSAgICBLRVlDT0RFX1EgICAgICAgICAgICAgICA9IDQ1LAotICAgIEtFWUNPREVfUiAgICAgICAgICAgICAgID0gNDYsCi0gICAgS0VZQ09ERV9TICAgICAgICAgICAgICAgPSA0NywKLSAgICBLRVlDT0RFX1QgICAgICAgICAgICAgICA9IDQ4LAotICAgIEtFWUNPREVfVSAgICAgICAgICAgICAgID0gNDksCi0gICAgS0VZQ09ERV9WICAgICAgICAgICAgICAgPSA1MCwKLSAgICBLRVlDT0RFX1cgICAgICAgICAgICAgICA9IDUxLAotICAgIEtFWUNPREVfWCAgICAgICAgICAgICAgID0gNTIsCi0gICAgS0VZQ09ERV9ZICAgICAgICAgICAgICAgPSA1MywKLSAgICBLRVlDT0RFX1ogICAgICAgICAgICAgICA9IDU0LAotICAgIEtFWUNPREVfQ09NTUEgICAgICAgICAgID0gNTUsCi0gICAgS0VZQ09ERV9QRVJJT0QgICAgICAgICAgPSA1NiwKLSAgICBLRVlDT0RFX0FMVF9MRUZUICAgICAgICA9IDU3LAotICAgIEtFWUNPREVfQUxUX1JJR0hUICAgICAgID0gNTgsCi0gICAgS0VZQ09ERV9TSElGVF9MRUZUICAgICAgPSA1OSwKLSAgICBLRVlDT0RFX1NISUZUX1JJR0hUICAgICA9IDYwLAotICAgIEtFWUNPREVfVEFCICAgICAgICAgICAgID0gNjEsCi0gICAgS0VZQ09ERV9TUEFDRSAgICAgICAgICAgPSA2MiwKLSAgICBLRVlDT0RFX1NZTSAgICAgICAgICAgICA9IDYzLAotICAgIEtFWUNPREVfRVhQTE9SRVIgICAgICAgID0gNjQsCi0gICAgS0VZQ09ERV9FTlZFTE9QRSAgICAgICAgPSA2NSwKLSAgICBLRVlDT0RFX0VOVEVSICAgICAgICAgICA9IDY2LAotICAgIEtFWUNPREVfREVMICAgICAgICAgICAgID0gNjcsCi0gICAgS0VZQ09ERV9HUkFWRSAgICAgICAgICAgPSA2OCwKLSAgICBLRVlDT0RFX01JTlVTICAgICAgICAgICA9IDY5LAotICAgIEtFWUNPREVfRVFVQUxTICAgICAgICAgID0gNzAsCi0gICAgS0VZQ09ERV9MRUZUX0JSQUNLRVQgICAgPSA3MSwKLSAgICBLRVlDT0RFX1JJR0hUX0JSQUNLRVQgICA9IDcyLAotICAgIEtFWUNPREVfQkFDS1NMQVNIICAgICAgID0gNzMsCi0gICAgS0VZQ09ERV9TRU1JQ09MT04gICAgICAgPSA3NCwKLSAgICBLRVlDT0RFX0FQT1NUUk9QSEUgICAgICA9IDc1LAotICAgIEtFWUNPREVfU0xBU0ggICAgICAgICAgID0gNzYsCi0gICAgS0VZQ09ERV9BVCAgICAgICAgICAgICAgPSA3NywKLSAgICBLRVlDT0RFX05VTSAgICAgICAgICAgICA9IDc4LAotICAgIEtFWUNPREVfSEVBRFNFVEhPT0sgICAgID0gNzksCi0gICAgS0VZQ09ERV9GT0NVUyAgICAgICAgICAgPSA4MCwgICAvLyAqQ2FtZXJhKiBmb2N1cwotICAgIEtFWUNPREVfUExVUyAgICAgICAgICAgID0gODEsCi0gICAgS0VZQ09ERV9NRU5VICAgICAgICAgICAgPSA4MiwKLSAgICBLRVlDT0RFX05PVElGSUNBVElPTiAgICA9IDgzLAotICAgIEtFWUNPREVfU0VBUkNIICAgICAgICAgID0gODQsCi0gICAgS0VZQ09ERV9NRURJQV9QTEFZX1BBVVNFPSA4NSwKLSAgICBLRVlDT0RFX01FRElBX1NUT1AgICAgICA9IDg2LAotICAgIEtFWUNPREVfTUVESUFfTkVYVCAgICAgID0gODcsCi0gICAgS0VZQ09ERV9NRURJQV9QUkVWSU9VUyAgPSA4OCwKLSAgICBLRVlDT0RFX01FRElBX1JFV0lORCAgICA9IDg5LAotICAgIEtFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEID0gOTAsCi0gICAgS0VZQ09ERV9NVVRFICAgICAgICAgICAgPSA5MSwKLSAgICBLRVlDT0RFX1BBR0VfVVAgICAgICAgICA9IDkyLAotICAgIEtFWUNPREVfUEFHRV9ET1dOICAgICAgID0gOTMKKyAgICBBS0VZQ09ERV9VTktOT1dOICAgICAgICAgPSAwLAorICAgIEFLRVlDT0RFX1NPRlRfTEVGVCAgICAgICA9IDEsCisgICAgQUtFWUNPREVfU09GVF9SSUdIVCAgICAgID0gMiwKKyAgICBBS0VZQ09ERV9IT01FICAgICAgICAgICAgPSAzLAorICAgIEFLRVlDT0RFX0JBQ0sgICAgICAgICAgICA9IDQsCisgICAgQUtFWUNPREVfQ0FMTCAgICAgICAgICAgID0gNSwKKyAgICBBS0VZQ09ERV9FTkRDQUxMICAgICAgICAgPSA2LAorICAgIEFLRVlDT0RFXzAgICAgICAgICAgICAgICA9IDcsCisgICAgQUtFWUNPREVfMSAgICAgICAgICAgICAgID0gOCwKKyAgICBBS0VZQ09ERV8yICAgICAgICAgICAgICAgPSA5LAorICAgIEFLRVlDT0RFXzMgICAgICAgICAgICAgICA9IDEwLAorICAgIEFLRVlDT0RFXzQgICAgICAgICAgICAgICA9IDExLAorICAgIEFLRVlDT0RFXzUgICAgICAgICAgICAgICA9IDEyLAorICAgIEFLRVlDT0RFXzYgICAgICAgICAgICAgICA9IDEzLAorICAgIEFLRVlDT0RFXzcgICAgICAgICAgICAgICA9IDE0LAorICAgIEFLRVlDT0RFXzggICAgICAgICAgICAgICA9IDE1LAorICAgIEFLRVlDT0RFXzkgICAgICAgICAgICAgICA9IDE2LAorICAgIEFLRVlDT0RFX1NUQVIgICAgICAgICAgICA9IDE3LAorICAgIEFLRVlDT0RFX1BPVU5EICAgICAgICAgICA9IDE4LAorICAgIEFLRVlDT0RFX0RQQURfVVAgICAgICAgICA9IDE5LAorICAgIEFLRVlDT0RFX0RQQURfRE9XTiAgICAgICA9IDIwLAorICAgIEFLRVlDT0RFX0RQQURfTEVGVCAgICAgICA9IDIxLAorICAgIEFLRVlDT0RFX0RQQURfUklHSFQgICAgICA9IDIyLAorICAgIEFLRVlDT0RFX0RQQURfQ0VOVEVSICAgICA9IDIzLAorICAgIEFLRVlDT0RFX1ZPTFVNRV9VUCAgICAgICA9IDI0LAorICAgIEFLRVlDT0RFX1ZPTFVNRV9ET1dOICAgICA9IDI1LAorICAgIEFLRVlDT0RFX1BPV0VSICAgICAgICAgICA9IDI2LAorICAgIEFLRVlDT0RFX0NBTUVSQSAgICAgICAgICA9IDI3LAorICAgIEFLRVlDT0RFX0NMRUFSICAgICAgICAgICA9IDI4LAorICAgIEFLRVlDT0RFX0EgICAgICAgICAgICAgICA9IDI5LAorICAgIEFLRVlDT0RFX0IgICAgICAgICAgICAgICA9IDMwLAorICAgIEFLRVlDT0RFX0MgICAgICAgICAgICAgICA9IDMxLAorICAgIEFLRVlDT0RFX0QgICAgICAgICAgICAgICA9IDMyLAorICAgIEFLRVlDT0RFX0UgICAgICAgICAgICAgICA9IDMzLAorICAgIEFLRVlDT0RFX0YgICAgICAgICAgICAgICA9IDM0LAorICAgIEFLRVlDT0RFX0cgICAgICAgICAgICAgICA9IDM1LAorICAgIEFLRVlDT0RFX0ggICAgICAgICAgICAgICA9IDM2LAorICAgIEFLRVlDT0RFX0kgICAgICAgICAgICAgICA9IDM3LAorICAgIEFLRVlDT0RFX0ogICAgICAgICAgICAgICA9IDM4LAorICAgIEFLRVlDT0RFX0sgICAgICAgICAgICAgICA9IDM5LAorICAgIEFLRVlDT0RFX0wgICAgICAgICAgICAgICA9IDQwLAorICAgIEFLRVlDT0RFX00gICAgICAgICAgICAgICA9IDQxLAorICAgIEFLRVlDT0RFX04gICAgICAgICAgICAgICA9IDQyLAorICAgIEFLRVlDT0RFX08gICAgICAgICAgICAgICA9IDQzLAorICAgIEFLRVlDT0RFX1AgICAgICAgICAgICAgICA9IDQ0LAorICAgIEFLRVlDT0RFX1EgICAgICAgICAgICAgICA9IDQ1LAorICAgIEFLRVlDT0RFX1IgICAgICAgICAgICAgICA9IDQ2LAorICAgIEFLRVlDT0RFX1MgICAgICAgICAgICAgICA9IDQ3LAorICAgIEFLRVlDT0RFX1QgICAgICAgICAgICAgICA9IDQ4LAorICAgIEFLRVlDT0RFX1UgICAgICAgICAgICAgICA9IDQ5LAorICAgIEFLRVlDT0RFX1YgICAgICAgICAgICAgICA9IDUwLAorICAgIEFLRVlDT0RFX1cgICAgICAgICAgICAgICA9IDUxLAorICAgIEFLRVlDT0RFX1ggICAgICAgICAgICAgICA9IDUyLAorICAgIEFLRVlDT0RFX1kgICAgICAgICAgICAgICA9IDUzLAorICAgIEFLRVlDT0RFX1ogICAgICAgICAgICAgICA9IDU0LAorICAgIEFLRVlDT0RFX0NPTU1BICAgICAgICAgICA9IDU1LAorICAgIEFLRVlDT0RFX1BFUklPRCAgICAgICAgICA9IDU2LAorICAgIEFLRVlDT0RFX0FMVF9MRUZUICAgICAgICA9IDU3LAorICAgIEFLRVlDT0RFX0FMVF9SSUdIVCAgICAgICA9IDU4LAorICAgIEFLRVlDT0RFX1NISUZUX0xFRlQgICAgICA9IDU5LAorICAgIEFLRVlDT0RFX1NISUZUX1JJR0hUICAgICA9IDYwLAorICAgIEFLRVlDT0RFX1RBQiAgICAgICAgICAgICA9IDYxLAorICAgIEFLRVlDT0RFX1NQQUNFICAgICAgICAgICA9IDYyLAorICAgIEFLRVlDT0RFX1NZTSAgICAgICAgICAgICA9IDYzLAorICAgIEFLRVlDT0RFX0VYUExPUkVSICAgICAgICA9IDY0LAorICAgIEFLRVlDT0RFX0VOVkVMT1BFICAgICAgICA9IDY1LAorICAgIEFLRVlDT0RFX0VOVEVSICAgICAgICAgICA9IDY2LAorICAgIEFLRVlDT0RFX0RFTCAgICAgICAgICAgICA9IDY3LAorICAgIEFLRVlDT0RFX0dSQVZFICAgICAgICAgICA9IDY4LAorICAgIEFLRVlDT0RFX01JTlVTICAgICAgICAgICA9IDY5LAorICAgIEFLRVlDT0RFX0VRVUFMUyAgICAgICAgICA9IDcwLAorICAgIEFLRVlDT0RFX0xFRlRfQlJBQ0tFVCAgICA9IDcxLAorICAgIEFLRVlDT0RFX1JJR0hUX0JSQUNLRVQgICA9IDcyLAorICAgIEFLRVlDT0RFX0JBQ0tTTEFTSCAgICAgICA9IDczLAorICAgIEFLRVlDT0RFX1NFTUlDT0xPTiAgICAgICA9IDc0LAorICAgIEFLRVlDT0RFX0FQT1NUUk9QSEUgICAgICA9IDc1LAorICAgIEFLRVlDT0RFX1NMQVNIICAgICAgICAgICA9IDc2LAorICAgIEFLRVlDT0RFX0FUICAgICAgICAgICAgICA9IDc3LAorICAgIEFLRVlDT0RFX05VTSAgICAgICAgICAgICA9IDc4LAorICAgIEFLRVlDT0RFX0hFQURTRVRIT09LICAgICA9IDc5LAorICAgIEFLRVlDT0RFX0ZPQ1VTICAgICAgICAgICA9IDgwLCAgIC8vICpDYW1lcmEqIGZvY3VzCisgICAgQUtFWUNPREVfUExVUyAgICAgICAgICAgID0gODEsCisgICAgQUtFWUNPREVfTUVOVSAgICAgICAgICAgID0gODIsCisgICAgQUtFWUNPREVfTk9USUZJQ0FUSU9OICAgID0gODMsCisgICAgQUtFWUNPREVfU0VBUkNIICAgICAgICAgID0gODQsCisgICAgQUtFWUNPREVfTUVESUFfUExBWV9QQVVTRT0gODUsCisgICAgQUtFWUNPREVfTUVESUFfU1RPUCAgICAgID0gODYsCisgICAgQUtFWUNPREVfTUVESUFfTkVYVCAgICAgID0gODcsCisgICAgQUtFWUNPREVfTUVESUFfUFJFVklPVVMgID0gODgsCisgICAgQUtFWUNPREVfTUVESUFfUkVXSU5EICAgID0gODksCisgICAgQUtFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEID0gOTAsCisgICAgQUtFWUNPREVfTVVURSAgICAgICAgICAgID0gOTEsCisgICAgQUtFWUNPREVfUEFHRV9VUCAgICAgICAgID0gOTIsCisgICAgQUtFWUNPREVfUEFHRV9ET1dOICAgICAgID0gOTMsCisgICAgQUtFWUNPREVfUElDVFNZTUJPTFMgICAgID0gOTQsCisgICAgQUtFWUNPREVfU1dJVENIX0NIQVJTRVQgID0gOTUsCisgICAgQUtFWUNPREVfQlVUVE9OX0EgICAgICAgID0gOTYsCisgICAgQUtFWUNPREVfQlVUVE9OX0IgICAgICAgID0gOTcsCisgICAgQUtFWUNPREVfQlVUVE9OX0MgICAgICAgID0gOTgsCisgICAgQUtFWUNPREVfQlVUVE9OX1ggICAgICAgID0gOTksCisgICAgQUtFWUNPREVfQlVUVE9OX1kgICAgICAgID0gMTAwLAorICAgIEFLRVlDT0RFX0JVVFRPTl9aICAgICAgICA9IDEwMSwKKyAgICBBS0VZQ09ERV9CVVRUT05fTDEgICAgICAgPSAxMDIsCisgICAgQUtFWUNPREVfQlVUVE9OX1IxICAgICAgID0gMTAzLAorICAgIEFLRVlDT0RFX0JVVFRPTl9MMiAgICAgICA9IDEwNCwKKyAgICBBS0VZQ09ERV9CVVRUT05fUjIgICAgICAgPSAxMDUsCisgICAgQUtFWUNPREVfQlVUVE9OX1RIVU1CTCAgID0gMTA2LAorICAgIEFLRVlDT0RFX0JVVFRPTl9USFVNQlIgICA9IDEwNywKKyAgICBBS0VZQ09ERV9CVVRUT05fU1RBUlQgICAgPSAxMDgsCisgICAgQUtFWUNPREVfQlVUVE9OX1NFTEVDVCAgID0gMTA5LAorICAgIEFLRVlDT0RFX0JVVFRPTl9NT0RFICAgICA9IDExMCwKIAotICAgIC8qIE5PVEU6IElmIHlvdSBhZGQgYSBuZXcga2V5Y29kZSBoZXJlIHlvdSBtdXN0IGFsc28gYWRkIGl0IHRvOgotICAgICAqICBuYXRpdmUvaW5jbHVkZS9hbmRyb2lkL2tleWNvZGVzLmgKLSAgICAgKiAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvdWkvS2V5Y29kZUxhYmVscy5oCi0gICAgICogICBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9LZXlFdmVudC5qYXZhCi0gICAgICogICB0b29scy9wdXBwZXRfbWFzdGVyL1B1cHBldE1hc3Rlci5uYXZfa2V5cy5weQotICAgICAqICAgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCi0gICAgICovCisgICAgLy8gTk9URTogSWYgeW91IGFkZCBhIG5ldyBrZXljb2RlIGhlcmUgeW91IG11c3QgYWxzbyBhZGQgaXQgdG8gc2V2ZXJhbCBvdGhlciBmaWxlcy4KKyAgICAvLyAgICAgICBSZWZlciB0byBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9LZXlFdmVudC5qYXZhIGZvciB0aGUgZnVsbCBsaXN0LgogfTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL2xvb3Blci5oIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9sb29wZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTE3MjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9sb29wZXIuaApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX0xPT1BFUl9ICisjZGVmaW5lIEFORFJPSURfTE9PUEVSX0gKKworI2luY2x1ZGUgPHBvbGwuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEFMb29wZXIKKyAqCisgKiBBIGxvb3BlciBpcyB0aGUgc3RhdGUgdHJhY2tpbmcgYW4gZXZlbnQgbG9vcCBmb3IgYSB0aHJlYWQuCisgKiBMb29wZXJzIGRvIG5vdCBkZWZpbmUgZXZlbnQgc3RydWN0dXJlcyBvciBvdGhlciBzdWNoIHRoaW5nczsgcmF0aGVyCisgKiB0aGV5IGFyZSBhIGxvd2VyLWxldmVsIGZhY2lsaXR5IHRvIGF0dGFjaCBvbmUgb3IgbW9yZSBkaXNjcmV0ZSBvYmplY3RzCisgKiBsaXN0ZW5pbmcgZm9yIGFuIGV2ZW50LiAgQW4gImV2ZW50IiBoZXJlIGlzIHNpbXBseSBkYXRhIGF2YWlsYWJsZSBvbgorICogYSBmaWxlIGRlc2NyaXB0b3I6IGVhY2ggYXR0YWNoZWQgb2JqZWN0IGhhcyBhbiBhc3NvY2lhdGVkIGZpbGUgZGVzY3JpcHRvciwKKyAqIGFuZCB3YWl0aW5nIGZvciAiZXZlbnRzIiBtZWFucyAoaW50ZXJuYWxseSkgcG9sbGluZyBvbiBhbGwgb2YgdGhlc2UgZmlsZQorICogZGVzY3JpcHRvcnMgdW50aWwgb25lIG9yIG1vcmUgb2YgdGhlbSBoYXZlIGRhdGEgYXZhaWxhYmxlLgorICoKKyAqIEEgdGhyZWFkIGNhbiBoYXZlIG9ubHkgb25lIEFMb29wZXIgYXNzb2NpYXRlZCB3aXRoIGl0LgorICovCitzdHJ1Y3QgQUxvb3BlcjsKK3R5cGVkZWYgc3RydWN0IEFMb29wZXIgQUxvb3BlcjsKKworLyoqCisgKiBGb3IgY2FsbGJhY2stYmFzZWQgZXZlbnQgbG9vcHMsIHRoaXMgaXMgdGhlIHByb3RvdHlwZSBvZiB0aGUgZnVuY3Rpb24KKyAqIHRoYXQgaXMgY2FsbGVkLiAgSXQgaXMgZ2l2ZW4gdGhlIGZpbGUgZGVzY3JpcHRvciBpdCBpcyBhc3NvY2lhdGVkIHdpdGgsCisgKiBhIGJpdG1hc2sgb2YgdGhlIHBvbGwgZXZlbnRzIHRoYXQgd2VyZSB0cmlnZ2VyZWQgKHR5cGljYWxseSBQT0xMSU4pLCBhbmQKKyAqIHRoZSBkYXRhIHBvaW50ZXIgdGhhdCB3YXMgb3JpZ2luYWxseSBzdXBwbGllZC4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHJldHVybiAxIHRvIGNvbnRpbnVlIHJlY2VpdmluZyBjYWxsYmFja3MsIG9yIDAKKyAqIHRvIGhhdmUgdGhpcyBmaWxlIGRlc2NyaXB0b3IgYW5kIGNhbGxiYWNrIHVucmVnaXN0ZXJlZCBmcm9tIHRoZSBsb29wZXIuCisgKi8KK3R5cGVkZWYgaW50IEFMb29wZXJfY2FsbGJhY2tGdW5jKGludCBmZCwgaW50IGV2ZW50cywgdm9pZCogZGF0YSk7CisKKy8qKgorICogUmV0dXJuIHRoZSBBTG9vcGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyB0aHJlYWQsIG9yIE5VTEwgaWYKKyAqIHRoZXJlIGlzIG5vdCBvbmUuCisgKi8KK0FMb29wZXIqIEFMb29wZXJfZm9yVGhyZWFkKCk7CisKK2VudW0geworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgQUxvb3Blcl9wcmVwYXJlOiB0aGlzIEFMb29wZXIgd2lsbCBhY2NlcHQgY2FsbHMgdG8KKyAgICAgKiBBTG9vcGVyX2FkZEZkKCkgdGhhdCBkbyBub3QgaGF2ZSBhIGNhbGxiYWNrICh0aGF0IGlzIHByb3ZpZGUgTlVMTAorICAgICAqIGZvciB0aGUgY2FsbGJhY2spLiAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgb2YgQUxvb3Blcl9wb2xsT25jZSgpCisgICAgICogb3IgQUxvb3Blcl9wb2xsQWxsKCkgTVVTVCBjaGVjayB0aGUgcmV0dXJuIGZyb20gdGhlc2UgZnVuY3Rpb25zIHRvCisgICAgICogZGlzY292ZXIgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZSBvbiBzdWNoIGZkcyBhbmQgcHJvY2VzcyBpdC4KKyAgICAgKi8KKyAgICBBTE9PUEVSX1BSRVBBUkVfQUxMT1dfTk9OX0NBTExCQUNLUyA9IDE8PDAKK307CisKKy8qKgorICogUHJlcGFyZSBhbiBBTG9vcGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyB0aHJlYWQsIGFuZCByZXR1cm4gaXQuCisgKiBJZiB0aGUgdGhyZWFkIGFscmVhZHkgaGFzIGFuIEFMb29wZXIsIGl0IGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBhIG5ldworICogb25lIGlzIGNyZWF0ZWQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGhyZWFkLCBhbmQgcmV0dXJuZWQuCisgKgorICogVGhlIG9wdHMgbWF5IGJlIEFMT09QRVJfUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTIG9yIDAuCisgKi8KK0FMb29wZXIqIEFMb29wZXJfcHJlcGFyZShpbnQzMl90IG9wdHMpOworCitlbnVtIHsKKyAgICAvKioKKyAgICAgKiBSZXN1bHQgZnJvbSBBTG9vcGVyX3BvbGxPbmNlKCkgYW5kIEFMb29wZXJfcG9sbEFsbCgpOiBvbmUgb3IKKyAgICAgKiBtb3JlIGNhbGxiYWNrcyB3ZXJlIGV4ZWN1dGVkLgorICAgICAqLworICAgIEFMT09QRVJfUE9MTF9DQUxMQkFDSyA9IC0xLAorICAgIAorICAgIC8qKgorICAgICAqIFJlc3VsdCBmcm9tIEFMb29wZXJfcG9sbE9uY2UoKSBhbmQgQUxvb3Blcl9wb2xsQWxsKCk6IHRoZQorICAgICAqIHRpbWVvdXQgZXhwaXJlZC4KKyAgICAgKi8KKyAgICBBTE9PUEVSX1BPTExfVElNRU9VVCA9IC0yLAorICAgIAorICAgIC8qKgorICAgICAqIFJlc3VsdCBmcm9tIEFMb29wZXJfcG9sbE9uY2UoKSBhbmQgQUxvb3Blcl9wb2xsQWxsKCk6IGFuIGVycm9yCisgICAgICogb2NjdXJyZWQuCisgICAgICovCisgICAgQUxPT1BFUl9QT0xMX0VSUk9SID0gLTMsCit9OworCisvKioKKyAqIFdhaXQgZm9yIGV2ZW50cyB0byBiZSBhdmFpbGFibGUsIHdpdGggb3B0aW9uYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgKiBJbnZva2VzIGNhbGxiYWNrcyBmb3IgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb24gd2hpY2ggYW4gZXZlbnQgb2NjdXJyZWQuCisgKgorICogSWYgdGhlIHRpbWVvdXQgaXMgemVybywgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRob3V0IGJsb2NraW5nLgorICogSWYgdGhlIHRpbWVvdXQgaXMgbmVnYXRpdmUsIHdhaXRzIGluZGVmaW5pdGVseSB1bnRpbCBhbiBldmVudCBhcHBlYXJzLgorICoKKyAqIFJldHVybnMgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGlmIGEgY2FsbGJhY2sgd2FzIGludm9rZWQuCisgKgorICogUmV0dXJucyBBTE9PUEVSX1BPTExfVElNRU9VVCBpZiB0aGVyZSB3YXMgbm8gZGF0YSBiZWZvcmUgdGhlIGdpdmVuCisgKiB0aW1lb3V0IGV4cGlyZWQuCisgKgorICogUmV0dXJucyBBTE9QRVJfUE9MTF9FUlJPUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqCisgKiBSZXR1cm5zIGEgdmFsdWUgPj0gMCBjb250YWluaW5nIGEgZmlsZSBkZXNjcmlwdG9yIGlmIGl0IGhhcyBkYXRhCisgKiBhbmQgaXQgaGFzIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIChyZXF1aXJpbmcgdGhlIGNhbGxlciBoZXJlIHRvIGhhbmRsZSBpdCkuCisgKiBJbiB0aGlzIChhbmQgb25seSB0aGlzKSBjYXNlIG91dEV2ZW50cyBhbmQgb3V0RGF0YSB3aWxsIGNvbnRhaW4gdGhlIHBvbGwKKyAqIGV2ZW50cyBhbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGZkLgorICoKKyAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHJldHVybiB1bnRpbCBpdCBoYXMgZmluaXNoZWQgaW52b2tpbmcgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrcworICogZm9yIGFsbCBmaWxlIGRlc2NyaXB0b3JzIHRoYXQgd2VyZSBzaWduYWxsZWQuCisgKi8KK2ludDMyX3QgQUxvb3Blcl9wb2xsT25jZShpbnQgdGltZW91dE1pbGxpcywgaW50KiBvdXRFdmVudHMsIHZvaWQqKiBvdXREYXRhKTsKKworLyoqCisgKiBMaWtlIEFMb29wZXJfcG9sbE9uY2UoKSwgYnV0IHBlcmZvcm1zIGFsbCBwZW5kaW5nIGNhbGxiYWNrcyB1bnRpbCBhbGwKKyAqIGRhdGEgaGFzIGJlZW4gY29uc3VtZWQgb3IgYSBmaWxlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlIHdpdGggbm8gY2FsbGJhY2suCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIEFMT09QRVJfUE9MTF9DQUxMQkFDSy4KKyAqLworaW50MzJfdCBBTG9vcGVyX3BvbGxBbGwoaW50IHRpbWVvdXRNaWxsaXMsIGludCogb3V0RXZlbnRzLCB2b2lkKiogb3V0RGF0YSk7CisKKy8qKgorICogQWNxdWlyZSBhIHJlZmVyZW5jZSBvbiB0aGUgZ2l2ZW4gQUxvb3BlciBvYmplY3QuICBUaGlzIHByZXZlbnRzIHRoZSBvYmplY3QKKyAqIGZyb20gYmVpbmcgZGVsZXRlZCB1bnRpbCB0aGUgcmVmZXJlbmNlIGlzIHJlbW92ZWQuICBUaGlzIGlzIG9ubHkgbmVlZGVkCisgKiB0byBzYWZlbHkgaGFuZCBhbiBBTG9vcGVyIGZyb20gb25lIHRocmVhZCB0byBhbm90aGVyLgorICovCit2b2lkIEFMb29wZXJfYWNxdWlyZShBTG9vcGVyKiBsb29wZXIpOworCisvKioKKyAqIFJlbW92ZSBhIHJlZmVyZW5jZSB0aGF0IHdhcyBwcmV2aW91c2x5IGFjcXVpcmVkIHdpdGggQUxvb3Blcl9hY3F1aXJlKCkuCisgKi8KK3ZvaWQgQUxvb3Blcl9yZWxlYXNlKEFMb29wZXIqIGxvb3Blcik7CisKKy8qKgorICogQWRkIGEgbmV3IGZpbGUgZGVzY3JpcHRvciB0byBiZSBwb2xsZWQgYnkgdGhlIGxvb3Blci4gIElmIHRoZSBzYW1lIGZpbGUKKyAqIGRlc2NyaXB0b3Igd2FzIHByZXZpb3VzbHkgYWRkZWQsIGl0IGlzIHJlcGxhY2VkLgorICoKKyAqICJmZCIgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBiZSBhZGRlZC4KKyAqICJldmVudHMiIGFyZSB0aGUgcG9sbCBldmVudHMgdG8gd2FrZSB1cCBvbi4gIFR5cGljYWxseSB0aGlzIGlzIFBPTExJTi4KKyAqICJjYWxsYmFjayIgaXMgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGVyZSBpcyBhbiBldmVudCBvbiB0aGUgZmlsZQorICogZGVzY3JpcHRvci4KKyAqICJpZCIgaXMgYW4gaWRlbnRpZmllciB0byBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIGRlc2NyaXB0b3IsIG9yIDAuCisgKiAiZGF0YSIgaXMgYSBwcml2YXRlIGRhdGEgcG9pbnRlciB0byBzdXBwbHkgdG8gdGhlIGNhbGxiYWNrLgorICoKKyAqIFRoZXJlIGFyZSB0d28gbWFpbiB1c2VzIG9mIHRoaXMgZnVuY3Rpb246CisgKgorICogKDEpIElmICJjYWxsYmFjayIgaXMgbm9uLU5VTEwsIHRoZW4KKyAqIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBkYXRhIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBJdAorICogc2hvdWxkIGV4ZWN1dGUgYW55IGV2ZW50cyBpdCBoYXMgcGVuZGluZywgYXBwcm9wcmlhdGVseSByZWFkaW5nIGZyb20gdGhlCisgKiBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogKDIpIElmICJjYWxsYmFjayIgaXMgTlVMTCwgdGhlIGZkIHdpbGwgYmUgcmV0dXJuZWQgYnkgQUxvb3Blcl9wb2xsT25jZQorICogd2hlbiBpdCBoYXMgZGF0YSBhdmFpbGFibGUsIHJlcXVpcmluZyB0aGUgY2FsbGVyIHRvIHRha2UgY2FyZSBvZiBwcm9jZXNzaW5nCisgKiBpdC4KKyAqLwordm9pZCBBTG9vcGVyX2FkZEZkKEFMb29wZXIqIGxvb3BlciwgaW50IGZkLCBpbnQgZXZlbnRzLAorICAgICAgICBBTG9vcGVyX2NhbGxiYWNrRnVuYyogY2FsbGJhY2ssIHZvaWQqIGRhdGEpOworCisvKioKKyAqIFJlbW92ZSBhIHByZXZpb3VzbHkgYWRkZWQgZmlsZSBkZXNjcmlwdG9yIGZyb20gdGhlIGxvb3Blci4KKyAqLworaW50MzJfdCBBTG9vcGVyX3JlbW92ZUZkKEFMb29wZXIqIGxvb3BlciwgaW50IGZkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZiAvLyBBTkRST0lEX05BVElWRV9XSU5ET1dfSApkaWZmIC0tZ2l0IGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvbmF0aXZlX2FjdGl2aXR5LmgKaW5kZXggYzVjOGY5ZC4uZWE2ZjA1ZiAxMDA2NDQKLS0tIGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuaAorKysgYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL25hdGl2ZV9hY3Rpdml0eS5oCkBAIC0yNCwxNSArMjQsMTIgQEAKICNpbmNsdWRlIDxqbmkuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaW5wdXQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0vLyBUZW1wb3JhcnkgdW50aWwgbmF0aXZlIHN1cmZhY2UgQVBJIGlzIGRlZmluZWQuCi1zdHJ1Y3QgQVN1cmZhY2VIb2xkZXI7Ci10eXBlZGVmIHN0cnVjdCBBU3VyZmFjZUhvbGRlciBBU3VyZmFjZUhvbGRlcjsKLQogc3RydWN0IEFOYXRpdmVBY3Rpdml0eUNhbGxiYWNrczsKIAogLyoqCkBAIC02Nyw2ICs2NCwyMSBAQAogICAgIGpvYmplY3QgY2xheno7CiAKICAgICAvKioKKyAgICAgKiBQYXRoIHRvIHRoaXMgYXBwbGljYXRpb24ncyBpbnRlcm5hbCBkYXRhIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyKiBpbnRlcm5hbERhdGFQYXRoOworICAgIAorICAgIC8qKgorICAgICAqIFBhdGggdG8gdGhpcyBhcHBsaWNhdGlvbidzIGV4dGVybmFsIChyZW1vdmFibGUvbW91bnRhYmxlKSBkYXRhIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyKiBleHRlcm5hbERhdGFQYXRoOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBwbGF0Zm9ybSdzIFNESyB2ZXJzaW9uIGNvZGUuCisgICAgICovCisgICAgaW50MzJfdCBzZGtWZXJzaW9uOworICAgIAorICAgIC8qKgogICAgICAqIFRoaXMgaXMgdGhlIG5hdGl2ZSBpbnN0YW5jZSBvZiB0aGUgYXBwbGljYXRpb24uICBJdCBpcyBub3QgdXNlZCBieQogICAgICAqIHRoZSBmcmFtZXdvcmssIGJ1dCBjYW4gYmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBpdHMgb3duIGluc3RhbmNlCiAgICAgICogc3RhdGUuCkBAIC0xMjksMzAgKzE0MSwzNSBAQAogICAgIHZvaWQgKCpvbldpbmRvd0ZvY3VzQ2hhbmdlZCkoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgaW50IGhhc0ZvY3VzKTsKICAgICAKICAgICAvKioKLSAgICAgKiBUaGUgZHJhd2luZyBzdXJmYWNlIGZvciB0aGlzIG5hdGl2ZSBhY3Rpdml0eSBoYXMgYmVlbiBjcmVhdGVkLiAgWW91Ci0gICAgICogY2FuIHVzZSB0aGUgZ2l2ZW4gc3VyZmFjZSBvYmplY3QgdG8gc3RhcnQgZHJhd2luZy4gIE5PVEU6IHN1cmZhY2UKLSAgICAgKiBkcmF3aW5nIEFQSSBpcyBub3QgeWV0IGRlZmluZWQuCisgICAgICogVGhlIGRyYXdpbmcgd2luZG93IGZvciB0aGlzIG5hdGl2ZSBhY3Rpdml0eSBoYXMgYmVlbiBjcmVhdGVkLiAgWW91CisgICAgICogY2FuIHVzZSB0aGUgZ2l2ZW4gbmF0aXZlIHdpbmRvdyBvYmplY3QgdG8gc3RhcnQgZHJhd2luZy4KICAgICAgKi8KLSAgICB2b2lkICgqb25TdXJmYWNlQ3JlYXRlZCkoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgQVN1cmZhY2VIb2xkZXIqIHN1cmZhY2UpOworICAgIHZvaWQgKCpvbk5hdGl2ZVdpbmRvd0NyZWF0ZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFOYXRpdmVXaW5kb3cqIHdpbmRvdyk7CiAKICAgICAvKioKLSAgICAgKiBUaGUgZHJhd2luZyBzdXJmYWNlIGZvciB0aGlzIG5hdGl2ZSBhY3Rpdml0eSBoYXMgY2hhbmdlZC4gIFRoZSBzdXJmYWNlCi0gICAgICogZ2l2ZW4gaGVyZSBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgbGFzdCBnaXZlbiB0bwotICAgICAqIG9uU3VyZmFjZUNyZWF0ZWQuICBUaGlzIGlzIHNpbXBseSB0byBpbmZvcm0geW91IGFib3V0IGludGVyZXN0aW5nCi0gICAgICogY2hhbmdlZCB0byB0aGF0IHN1cmZhY2UuCisgICAgICogVGhlIGRyYXdpbmcgd2luZG93IGZvciB0aGlzIG5hdGl2ZSBhY3Rpdml0eSBoYXMgYmVlbiByZXNpemVkLiAgWW91IHNob3VsZAorICAgICAqIHJldHJpZXZlIHRoZSBuZXcgc2l6ZSBmcm9tIHRoZSB3aW5kb3cgYW5kIGVuc3VyZSB0aGF0IHlvdXIgcmVuZGVyaW5nIGluCisgICAgICogaXQgbm93IG1hdGNoZXMuCiAgICAgICovCi0gICAgdm9pZCAoKm9uU3VyZmFjZUNoYW5nZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFTdXJmYWNlSG9sZGVyKiBzdXJmYWNlLAotICAgICAgICAgICAgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB2b2lkICgqb25OYXRpdmVXaW5kb3dSZXNpemVkKShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBBTmF0aXZlV2luZG93KiB3aW5kb3cpOwogCiAgICAgLyoqCi0gICAgICogVGhlIGRyYXdpbmcgc3VyZmFjZSBmb3IgdGhpcyBuYXRpdmUgYWN0aXZpdHkgaXMgZ29pbmcgdG8gYmUgZGVzdHJveWVkLgotICAgICAqIFlvdSBNVVNUIGVuc3VyZSB0aGF0IHlvdSBkbyBub3QgdG91Y2ggdGhlIHN1cmZhY2Ugb2JqZWN0IGFmdGVyIHJldHVybmluZwotICAgICAqIGZyb20gdGhpcyBmdW5jdGlvbjogaW4gdGhlIGNvbW1vbiBjYXNlIG9mIGRyYXdpbmcgdG8gdGhlIHN1cmZhY2UgZnJvbQorICAgICAqIFRoZSBkcmF3aW5nIHdpbmRvdyBmb3IgdGhpcyBuYXRpdmUgYWN0aXZpdHkgbmVlZHMgdG8gYmUgcmVkcmF3bi4gIFRvIGF2b2lkCisgICAgICogdHJhbnNpZW50IGFydGlmYWN0cyBkdXJpbmcgc2NyZWVuIGNoYW5nZXMgKHN1Y2ggcmVzaXppbmcgYWZ0ZXIgcm90YXRpb24pLAorICAgICAqIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gdW50aWwgdGhleSBoYXZlIGZpbmlzaGVkCisgICAgICogZHJhd2luZyB0aGVpciB3aW5kb3cgaW4gaXRzIGN1cnJlbnQgc3RhdGUuCisgICAgICovCisgICAgdm9pZCAoKm9uTmF0aXZlV2luZG93UmVkcmF3TmVlZGVkKShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBBTmF0aXZlV2luZG93KiB3aW5kb3cpOworCisgICAgLyoqCisgICAgICogVGhlIGRyYXdpbmcgd2luZG93IGZvciB0aGlzIG5hdGl2ZSBhY3Rpdml0eSBpcyBnb2luZyB0byBiZSBkZXN0cm95ZWQuCisgICAgICogWW91IE1VU1QgZW5zdXJlIHRoYXQgeW91IGRvIG5vdCB0b3VjaCB0aGUgd2luZG93IG9iamVjdCBhZnRlciByZXR1cm5pbmcKKyAgICAgKiBmcm9tIHRoaXMgZnVuY3Rpb246IGluIHRoZSBjb21tb24gY2FzZSBvZiBkcmF3aW5nIHRvIHRoZSB3aW5kb3cgZnJvbQogICAgICAqIGFub3RoZXIgdGhyZWFkLCB0aGF0IG1lYW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNhbGxiYWNrIG11c3QKICAgICAgKiBwcm9wZXJseSBzeW5jaHJvbml6ZSB3aXRoIHRoZSBvdGhlciB0aHJlYWQgdG8gc3RvcCBpdHMgZHJhd2luZyBiZWZvcmUKICAgICAgKiByZXR1cm5pbmcgZnJvbSBoZXJlLgogICAgICAqLwotICAgIHZvaWQgKCpvblN1cmZhY2VEZXN0cm95ZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFTdXJmYWNlSG9sZGVyKiBzdXJmYWNlKTsKKyAgICB2b2lkICgqb25OYXRpdmVXaW5kb3dEZXN0cm95ZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFOYXRpdmVXaW5kb3cqIHdpbmRvdyk7CiAgICAgCiAgICAgLyoqCiAgICAgICogVGhlIGlucHV0IHF1ZXVlIGZvciB0aGlzIG5hdGl2ZSBhY3Rpdml0eSdzIHdpbmRvdyBoYXMgYmVlbiBjcmVhdGVkLgpAQCAtMTY4LDYgKzE4NSwxMSBAQAogICAgIHZvaWQgKCpvbklucHV0UXVldWVEZXN0cm95ZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFJbnB1dFF1ZXVlKiBxdWV1ZSk7CiAKICAgICAvKioKKyAgICAgKiBUaGUgcmVjdGFuZ2xlIGluIHRoZSB3aW5kb3cgaW4gd2hpY2ggY29udGVudCBzaG91bGQgYmUgcGxhY2VkIGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHZvaWQgKCpvbkNvbnRlbnRSZWN0Q2hhbmdlZCkoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgY29uc3QgQVJlY3QqIHJlY3QpOworCisgICAgLyoqCiAgICAgICogVGhlIHN5c3RlbSBpcyBydW5uaW5nIGxvdyBvbiBtZW1vcnkuICBVc2UgdGhpcyBjYWxsYmFjayB0byByZWxlYXNlCiAgICAgICogcmVzb3VyY2VzIHlvdSBkbyBub3QgbmVlZCwgdG8gaGVscCB0aGUgc3lzdGVtIGF2b2lkIGtpbGxpbmcgbW9yZQogICAgICAqIGltcG9ydGFudCBwcm9jZXNzZXMuCkBAIC0xOTAsNiArMjEyLDMzIEBACiAgKi8KIGV4dGVybiBBTmF0aXZlQWN0aXZpdHlfY3JlYXRlRnVuYyBBTmF0aXZlQWN0aXZpdHlfb25DcmVhdGU7CiAKK3ZvaWQgQU5hdGl2ZUFjdGl2aXR5X3NldFdpbmRvd0Zvcm1hdChBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBpbnQzMl90IGZvcm1hdCk7CisKK3ZvaWQgQU5hdGl2ZUFjdGl2aXR5X3NldFdpbmRvd0ZsYWdzKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksCisgICAgICAgIHVpbnQzMl90IGFkZEZsYWdzLCB1aW50MzJfdCByZW1vdmVGbGFncyk7CisKKy8qKgorICogRmxhZ3MgZm9yIEFOYXRpdmVBY3Rpdml0eV9zaG93U29mdElucHV0OyBzZWUgdGhlIEphdmEgSW5wdXRNZXRob2RNYW5hZ2VyCisgKiBBUEkgZm9yIGRvY3VtZW50YXRpb24uCisgKi8KK2VudW0geworICAgIEFOQVRJVkVBQ1RJVklUWV9TSE9XX1NPRlRfSU5QVVRfSU1QTElDSVQgPSAweDAwMDEsCisgICAgQU5BVElWRUFDVElWSVRZX1NIT1dfU09GVF9JTlBVVF9GT1JDRUQgPSAweDAwMDIsCit9OworCit2b2lkIEFOYXRpdmVBY3Rpdml0eV9zaG93U29mdElucHV0KEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIHVpbnQzMl90IGZsYWdzKTsKKworLyoqCisgKiBGbGFncyBmb3IgQU5hdGl2ZUFjdGl2aXR5X2hpZGVTb2Z0SW5wdXQ7IHNlZSB0aGUgSmF2YSBJbnB1dE1ldGhvZE1hbmFnZXIKKyAqIEFQSSBmb3IgZG9jdW1lbnRhdGlvbi4KKyAqLworZW51bSB7CisgICAgQU5BVElWRUFDVElWSVRZX0hJREVfU09GVF9JTlBVVF9JTVBMSUNJVF9PTkxZID0gMHgwMDAxLAorICAgIEFOQVRJVkVBQ1RJVklUWV9ISURFX1NPRlRfSU5QVVRfTk9UX0FMV0FZUyA9IDB4MDAwMiwKK307CisKK3ZvaWQgQU5hdGl2ZUFjdGl2aXR5X2hpZGVTb2Z0SW5wdXQoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgdWludDMyX3QgZmxhZ3MpOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvbmF0aXZlX3dpbmRvdy5oIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9uYXRpdmVfd2luZG93LmgKaW5kZXggZTZkNWZlYS4uNzU5OWQ3ZSAxMDA2NDQKLS0tIGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9uYXRpdmVfd2luZG93LmgKKysrIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9uYXRpdmVfd2luZG93LmgKQEAgLTE0LDE3ICsxNCw5MCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotCiAjaWZuZGVmIEFORFJPSURfTkFUSVZFX1dJTkRPV19ICiAjZGVmaW5lIEFORFJPSURfTkFUSVZFX1dJTkRPV19ICiAKKyNpbmNsdWRlIDxhbmRyb2lkL3JlY3QuaD4KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCisvKgorICogUGl4ZWwgZm9ybWF0cyB0aGF0IGEgd2luZG93IGNhbiB1c2UuCisgKi8KK2VudW0geworICAgIFdJTkRPV19GT1JNQVRfUkdCQV84ODg4ICAgICAgICAgID0gMSwKKyAgICBXSU5ET1dfRk9STUFUX1JHQlhfODg4OCAgICAgICAgICA9IDIsCisgICAgV0lORE9XX0ZPUk1BVF9SR0JfNTY1ICAgICAgICAgICAgPSA0LAorfTsKKwogc3RydWN0IEFOYXRpdmVXaW5kb3c7CiB0eXBlZGVmIHN0cnVjdCBBTmF0aXZlV2luZG93IEFOYXRpdmVXaW5kb3c7CiAKK3R5cGVkZWYgc3RydWN0IEFOYXRpdmVXaW5kb3dfQnVmZmVyIHsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3Qgc3RyaWRlOworICAgIGludDMyX3QgZm9ybWF0OworICAgIHZvaWQqIGJpdHM7CisgICAgCisgICAgdWludDMyX3QgcmVzZXJ2ZWRbNl07Cit9IEFOYXRpdmVXaW5kb3dfQnVmZmVyOworCisvKioKKyAqIEFjcXVpcmUgYSByZWZlcmVuY2Ugb24gdGhlIGdpdmVuIEFOYXRpdmVXaW5kb3cgb2JqZWN0LiAgVGhpcyBwcmV2ZW50cyB0aGUgb2JqZWN0CisgKiBmcm9tIGJlaW5nIGRlbGV0ZWQgdW50aWwgdGhlIHJlZmVyZW5jZSBpcyByZW1vdmVkLgorICovCit2b2lkIEFOYXRpdmVXaW5kb3dfYWNxdWlyZShBTmF0aXZlV2luZG93KiB3aW5kb3cpOworCisvKioKKyAqIFJlbW92ZSBhIHJlZmVyZW5jZSB0aGF0IHdhcyBwcmV2aW91c2x5IGFjcXVpcmVkIHdpdGggQU5hdGl2ZVdpbmRvd19hY3F1aXJlKCkuCisgKi8KK3ZvaWQgQU5hdGl2ZVdpbmRvd19yZWxlYXNlKEFOYXRpdmVXaW5kb3cqIHdpbmRvdyk7CisKKy8qCisgKiBSZXR1cm4gdGhlIGN1cnJlbnQgd2lkdGggaW4gcGl4ZWxzIG9mIHRoZSB3aW5kb3cgc3VyZmFjZS4gIFJldHVybnMgYQorICogbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCisgKi8KK2ludDMyX3QgQU5hdGl2ZVdpbmRvd19nZXRXaWR0aChBTmF0aXZlV2luZG93KiB3aW5kb3cpOworCisvKgorICogUmV0dXJuIHRoZSBjdXJyZW50IGhlaWdodCBpbiBwaXhlbHMgb2YgdGhlIHdpbmRvdyBzdXJmYWNlLiAgUmV0dXJucyBhCisgKiBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqLworaW50MzJfdCBBTmF0aXZlV2luZG93X2dldEhlaWdodChBTmF0aXZlV2luZG93KiB3aW5kb3cpOworCisvKgorICogUmV0dXJuIHRoZSBjdXJyZW50IHBpeGVsIGZvcm1hdCBvZiB0aGUgd2luZG93IHN1cmZhY2UuICBSZXR1cm5zIGEKKyAqIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLgorICovCitpbnQzMl90IEFOYXRpdmVXaW5kb3dfZ2V0Rm9ybWF0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdyk7CisKKy8qCisgKiBDaGFuZ2UgdGhlIGZvcm1hdCBhbmQgc2l6ZSBvZiB0aGUgd2luZG93IGJ1ZmZlcnMuCisgKgorICogVGhlIHdpZHRoIGFuZCBoZWlnaHQgY29udHJvbCB0aGUgbnVtYmVyIG9mIHBpeGVscyBpbiB0aGUgYnVmZmVycywgbm90IHRoZQorICogZGltZW5zaW9ucyBvZiB0aGUgd2luZG93IG9uIHNjcmVlbi4gIElmIHRoZXNlIGFyZSBkaWZmZXJlbnQgdGhhbiB0aGUKKyAqIHdpbmRvdydzIHBoeXNpY2FsIHNpemUsIHRoZW4gaXQgYnVmZmVyIHdpbGwgYmUgc2NhbGVkIHRvIG1hdGNoIHRoYXQgc2l6ZQorICogd2hlbiBjb21wb3NpdGluZyBpdCB0byB0aGUgc2NyZWVuLgorICoKKyAqIEZvciBhbGwgb2YgdGhlc2UgcGFyYW1ldGVycywgaWYgMCBpcyBzdXBwbGllZCB0aGVuIHRoZSB3aW5kb3cncyBiYXNlCisgKiB2YWx1ZSB3aWxsIGNvbWUgYmFjayBpbiBmb3JjZS4KKyAqLworaW50MzJfdCBBTmF0aXZlV2luZG93X3NldEJ1ZmZlcnNHZW9tZXRyeShBTmF0aXZlV2luZG93KiB3aW5kb3csIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworLyoqCisgKiBMb2NrIHRoZSB3aW5kb3cncyBuZXh0IGRyYXdpbmcgc3VyZmFjZSBmb3Igd3JpdGluZy4KKyAqLworaW50MzJfdCBBTmF0aXZlV2luZG93X2xvY2soQU5hdGl2ZVdpbmRvdyogd2luZG93LCBBTmF0aXZlV2luZG93X0J1ZmZlciogb3V0QnVmZmVyLAorICAgICAgICBBUmVjdCogaW5PdXREaXJ0eUJvdW5kcyk7CisKKy8qKgorICogVW5sb2NrIHRoZSB3aW5kb3cncyBkcmF3aW5nIHN1cmZhY2UgYWZ0ZXIgcHJldmlvdXNseSBsb2NraW5nIGl0LAorICogcG9zdGluZyB0aGUgbmV3IGJ1ZmZlciB0byB0aGUgZGlzcGxheS4KKyAqLworaW50MzJfdCBBTmF0aXZlV2luZG93X3VubG9ja0FuZFBvc3QoQU5hdGl2ZVdpbmRvdyogd2luZG93KTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwpkaWZmIC0tZ2l0IGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9uYXRpdmVfd2luZG93X2puaS5oIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9uYXRpdmVfd2luZG93X2puaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTcyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL25hdGl2ZV93aW5kb3dfam5pLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9OQVRJVkVfV0lORE9XX0pOSV9ICisjZGVmaW5lIEFORFJPSURfTkFUSVZFX1dJTkRPV19KTklfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFJldHVybiB0aGUgQU5hdGl2ZVdpbmRvdyBhc3NvY2lhdGVkIHdpdGggYSBKYXZhIFN1cmZhY2Ugb2JqZWN0LAorICogZm9yIGludGVyYWN0aW5nIHdpdGggaXQgdGhyb3VnaCBuYXRpdmUgY29kZS4gIFRoaXMgYWNxdWlyZXMgYSByZWZlcmVuY2UKKyAqIG9uIHRoZSBBTmF0aXZlV2luZG93IHRoYXQgaXMgcmV0dXJuZWQ7IGJlIHN1cmUgdG8gdXNlIEFOYXRpdmVXaW5kb3dfcmVsZWFzZSgpCisgKiB3aGVuIGRvbmUgd2l0aCBpdCBzbyB0aGF0IGl0IGRvZXNuJ3QgbGVhay4KKyAqLworQU5hdGl2ZVdpbmRvdyogQU5hdGl2ZVdpbmRvd19mcm9tU3VyZmFjZShKTklFbnYqIGVudiwgam9iamVjdCBzdXJmYWNlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZiAvLyBBTkRST0lEX05BVElWRV9XSU5ET1dfSApkaWZmIC0tZ2l0IGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9yZWN0LmggYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3JlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTgxZjUzCi0tLSAvZGV2L251bGwKKysrIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9yZWN0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX1JFQ1RfSAorI2RlZmluZSBBTkRST0lEX1JFQ1RfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEFSZWN0IHsKKyAgICBpbnQzMl90IGxlZnQ7CisgICAgaW50MzJfdCB0b3A7CisgICAgaW50MzJfdCByaWdodDsKKyAgICBpbnQzMl90IGJvdHRvbTsKK30gQVJlY3Q7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYgLy8gQU5EUk9JRF9SRUNUX0gKZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvc2Vuc29yLmggYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3NlbnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTFkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3NlbnNvci5oCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEFORFJPSURfU0VOU09SX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSU1QT1JUQU5UIE5PVElDRToKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEFuZHJvaWQncyBzZXQgb2Ygc3RhYmxlIHN5c3RlbSBoZWFkZXJzCisgKiAgIGV4cG9zZWQgYnkgdGhlIEFuZHJvaWQgTkRLIChOYXRpdmUgRGV2ZWxvcG1lbnQgS2l0KS4KKyAqCisgKiAgIFRoaXJkLXBhcnR5IHNvdXJjZSBBTkQgYmluYXJ5IGNvZGUgcmVsaWVzIG9uIHRoZSBkZWZpbml0aW9ucworICogICBoZXJlIHRvIGJlIEZST1pFTiBPTiBBTEwgVVBDT01JTkcgUExBVEZPUk0gUkVMRUFTRVMuCisgKgorICogICAtIERPIE5PVCBNT0RJRlkgRU5VTVMgKEVYQ0VQVCBJRiBZT1UgQUREIE5FVyAzMi1CSVQgVkFMVUVTKQorICogICAtIERPIE5PVCBNT0RJRlkgQ09OU1RBTlRTIE9SIEZVTkNUSU9OQUwgTUFDUk9TCisgKiAgIC0gRE8gTk9UIENIQU5HRSBUSEUgU0lHTkFUVVJFIE9GIEZVTkNUSU9OUyBJTiBBTlkgV0FZCisgKiAgIC0gRE8gTk9UIENIQU5HRSBUSEUgTEFZT1VUIE9SIFNJWkUgT0YgU1RSVUNUVVJFUworICovCisKKy8qCisgKiBTdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgdG8gcmVjZWl2ZSBhbmQgcHJvY2VzcyBzZW5zb3IgZXZlbnRzIGluCisgKiBuYXRpdmUgY29kZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9sb29wZXIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qCisgKiBTZW5zb3IgdHlwZXMKKyAqIChrZWVwIGluIHN5bmMgd2l0aCBoYXJkd2FyZS9zZW5zb3IuaCkKKyAqLworCitlbnVtIHsKKyAgICBBU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUiAgICAgID0gMSwKKyAgICBBU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQgICAgID0gMiwKKyAgICBBU0VOU09SX1RZUEVfR1lST1NDT1BFICAgICAgICAgID0gNCwKKyAgICBBU0VOU09SX1RZUEVfTElHSFQgICAgICAgICAgICAgID0gNSwKKyAgICBBU0VOU09SX1RZUEVfUFJPWElNSVRZICAgICAgICAgID0gOAorfTsKKworLyoKKyAqIFNlbnNvciBhY2N1cmFjeSBtZWFzdXJlCisgKi8KK2VudW0geworICAgIEFTRU5TT1JfU1RBVFVTX1VOUkVMSUFCTEUgICAgICAgPSAwLAorICAgIEFTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0xPVyAgICAgPSAxLAorICAgIEFTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX01FRElVTSAgPSAyLAorICAgIEFTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0hJR0ggICAgPSAzCit9OworCisvKgorICogQSBmZXcgdXNlZnVsIGNvbnN0YW50cworICovCisKKy8qIEVhcnRoJ3MgZ3Jhdml0eSBpbiBtL3NeMiAqLworI2RlZmluZSBBU0VOU09SX1NUQU5EQVJEX0dSQVZJVFkgICAgICAgICAgICAoOS44MDY2NWYpCisvKiBNYXhpbXVtIG1hZ25ldGljIGZpZWxkIG9uIEVhcnRoJ3Mgc3VyZmFjZSBpbiB1VCAqLworI2RlZmluZSBBU0VOU09SX01BR05FVElDX0ZJRUxEX0VBUlRIX01BWCAgICAoNjAuMGYpCisvKiBNaW5pbXVtIG1hZ25ldGljIGZpZWxkIG9uIEVhcnRoJ3Mgc3VyZmFjZSBpbiB1VCovCisjZGVmaW5lIEFTRU5TT1JfTUFHTkVUSUNfRklFTERfRUFSVEhfTUlOICAgICgzMC4wZikKKworLyoKKyAqIEEgc2Vuc29yIGV2ZW50LgorICovCisKK3R5cGVkZWYgc3RydWN0IEFTZW5zb3JWZWN0b3IgeworICAgIHVuaW9uIHsKKyAgICAgICAgZmxvYXQgdlszXTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGZsb2F0IHg7CisgICAgICAgICAgICBmbG9hdCB5OworICAgICAgICAgICAgZmxvYXQgejsKKyAgICAgICAgfTsKKyAgICB9OworICAgIGludDhfdCBzdGF0dXM7CisgICAgdWludDhfdCByZXNlcnZlZFszXTsKK30gQVNlbnNvclZlY3RvcjsKKwordHlwZWRlZiBzdHJ1Y3QgQVNlbnNvckV2ZW50IHsKKyAgICBpbnQgc2Vuc29yOworICAgIGludDMyX3QgcmVzZXJ2ZWQwOworICAgIHVuaW9uIHsKKyAgICAgICAgZmxvYXQgICAgICAgICAgIGRhdGFbMTZdOworICAgICAgICBBU2Vuc29yVmVjdG9yICAgYWNjZWxlcmF0aW9uOworICAgICAgICBBU2Vuc29yVmVjdG9yICAgbWFnbmV0aWM7CisgICAgICAgIGZsb2F0ICAgICAgICAgICB0ZW1wZXJhdHVyZTsKKyAgICAgICAgZmxvYXQgICAgICAgICAgIGRpc3RhbmNlOworICAgICAgICBmbG9hdCAgICAgICAgICAgbGlnaHQ7CisgICAgfTsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICBpbnQzMl90IHJlc2VydmVkMVs0XTsKK30gQVNlbnNvckV2ZW50OworCisKK3N0cnVjdCBBU2Vuc29yTWFuYWdlcjsKK3R5cGVkZWYgc3RydWN0IEFTZW5zb3JNYW5hZ2VyIEFTZW5zb3JNYW5hZ2VyOworCitzdHJ1Y3QgQVNlbnNvckV2ZW50UXVldWU7Cit0eXBlZGVmIHN0cnVjdCBBU2Vuc29yRXZlbnRRdWV1ZSBBU2Vuc29yRXZlbnRRdWV1ZTsKKworc3RydWN0IEFTZW5zb3I7Cit0eXBlZGVmIHN0cnVjdCBBU2Vuc29yIEFTZW5zb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgc2Vuc29yIG1hbmFnZXIuIEFTZW5zb3JNYW5hZ2VyIGlzIGEgc2luZ2xldG9uLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogICAgIEFTZW5zb3JNYW5hZ2VyKiBzZW5zb3JNYW5hZ2VyID0gQVNlbnNvck1hbmFnZXJfZ2V0SW5zdGFuY2UoKTsKKyAqCisgKi8KK0FTZW5zb3JNYW5hZ2VyKiBBU2Vuc29yTWFuYWdlcl9nZXRJbnN0YW5jZSgpOworCisKKy8qCisgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBzZW5zb3JzLgorICovCitpbnQgQVNlbnNvck1hbmFnZXJfZ2V0U2Vuc29yTGlzdChBU2Vuc29yTWFuYWdlciogbWFuYWdlciwgQVNlbnNvcioqIGxpc3QpOworCisvKgorICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZW5zb3IgZm9yIHRoZSBnaXZlbiB0eXBlLCBvciBOVUxMIGlmIG5vIHNlbnNvcgorICogb2YgdGhhdCB0eXBlIGV4aXN0LgorICovCitBU2Vuc29yKiBBU2Vuc29yTWFuYWdlcl9nZXREZWZhdWx0U2Vuc29yKEFTZW5zb3JNYW5hZ2VyKiBtYW5hZ2VyLCBpbnQgdHlwZSk7CisKKy8qCisgKiBDcmVhdGVzIGEgbmV3IHNlbnNvciBldmVudCBxdWV1ZSBhbmQgYXNzb2NpYXRlIGl0IHdpdGggYSBsb29wZXIuCisgKi8KK0FTZW5zb3JFdmVudFF1ZXVlKiBBU2Vuc29yTWFuYWdlcl9jcmVhdGVFdmVudFF1ZXVlKEFTZW5zb3JNYW5hZ2VyKiBtYW5hZ2VyLAorICAgICAgICBBTG9vcGVyKiBsb29wZXIsIEFMb29wZXJfY2FsbGJhY2tGdW5jKiBjYWxsYmFjaywgdm9pZCogZGF0YSk7CisKKy8qCisgKiBEZXN0cm95cyB0aGUgZXZlbnQgcXVldWUgYW5kIGZyZWUgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHRvIGl0LgorICovCitpbnQgQVNlbnNvck1hbmFnZXJfZGVzdHJveUV2ZW50UXVldWUoQVNlbnNvck1hbmFnZXIqIG1hbmFnZXIsIEFTZW5zb3JFdmVudFF1ZXVlKiBxdWV1ZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRW5hYmxlIHRoZSBzZWxlY3RlZCBzZW5zb3IuIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBBU2Vuc29yRXZlbnRRdWV1ZV9lbmFibGVTZW5zb3IoQVNlbnNvckV2ZW50UXVldWUqIHF1ZXVlLCBBU2Vuc29yKiBzZW5zb3IpOworCisvKgorICogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgc2Vuc29yLiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgQVNlbnNvckV2ZW50UXVldWVfZGlzYWJsZVNlbnNvcihBU2Vuc29yRXZlbnRRdWV1ZSogcXVldWUsIEFTZW5zb3IqIHNlbnNvcik7CisKKy8qCisgKiBTZXRzIHRoZSBkZWxpdmVyeSByYXRlIG9mIGV2ZW50cyBpbiBtaWNyb3NlY29uZHMgZm9yIHRoZSBnaXZlbiBzZW5zb3IuCisgKiBOb3RlIHRoYXQgdGhpcyBpcyBhIGhpbnQgb25seSwgZ2VuZXJhbGx5IGV2ZW50IHdpbGwgYXJyaXZlIGF0IGEgaGlnaGVyCisgKiByYXRlLgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IEFTZW5zb3JFdmVudFF1ZXVlX3NldEV2ZW50UmF0ZShBU2Vuc29yRXZlbnRRdWV1ZSogcXVldWUsIEFTZW5zb3IqIHNlbnNvciwgaW50MzJfdCB1c2VjKTsKKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb25lIG9yIG1vcmUgZXZlbnRzIGF2YWlsYWJsZSBpbiB0aGUKKyAqIHNlbnNvciBxdWV1ZS4gIFJldHVybnMgMSBpZiB0aGUgcXVldWUgaGFzIGV2ZW50czsgMCBpZgorICogaXQgZG9lcyBub3QgaGF2ZSBldmVudHM7IGFuZCBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICovCitpbnQgQVNlbnNvckV2ZW50UXVldWVfaGFzRXZlbnRzKEFTZW5zb3JFdmVudFF1ZXVlKiBxdWV1ZSk7CisKKy8qCisgKiBSZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSBldmVudHMgZnJvbSB0aGUgcXVldWUuICBSZXR1cm5zIGEgbmVnYXRpdmUKKyAqIHZhbHVlIGlmIG5vIGV2ZW50cyBhcmUgYXZhaWxhYmxlIG9yIGFuIGVycm9yIGhhcyBvY2N1cnJlZCwgb3RoZXJ3aXNlCisgKiB0aGUgbnVtYmVyIG9mIGV2ZW50cyByZXR1cm5lZC4KKyAqCisgKiBFeGFtcGxlczoKKyAqICAgQVNlbnNvckV2ZW50IGV2ZW50OworICogICBzc2l6ZV90IG51bUV2ZW50ID0gQVNlbnNvckV2ZW50UXVldWVfZ2V0RXZlbnRzKHF1ZXVlLCAmZXZlbnQsIDEpOworICoKKyAqICAgQVNlbnNvckV2ZW50IGV2ZW50QnVmZmVyWzhdOworICogICBzc2l6ZV90IG51bUV2ZW50ID0gQVNlbnNvckV2ZW50UXVldWVfZ2V0RXZlbnRzKHF1ZXVlLCBldmVudEJ1ZmZlciwgOCk7CisgKgorICovCitzc2l6ZV90IEFTZW5zb3JFdmVudFF1ZXVlX2dldEV2ZW50cyhBU2Vuc29yRXZlbnRRdWV1ZSogcXVldWUsCisgICAgICAgICAgICAgICAgQVNlbnNvckV2ZW50KiBldmVudHMsIHNpemVfdCBjb3VudCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUmV0dXJucyB0aGlzIHNlbnNvcidzIG5hbWUgKG5vbiBsb2NhbGl6ZWQpCisgKi8KK2NvbnN0IGNoYXIqIEFTZW5zb3JfZ2V0TmFtZShBU2Vuc29yKiBzZW5zb3IpOworCisvKgorICogUmV0dXJucyB0aGlzIHNlbnNvcidzIHZlbmRvcidzIG5hbWUgKG5vbiBsb2NhbGl6ZWQpCisgKi8KK2NvbnN0IGNoYXIqIEFTZW5zb3JfZ2V0VmVuZG9yKEFTZW5zb3IqIHNlbnNvcik7CisKKy8qCisgKiBSZXR1cm4gdGhpcyBzZW5zb3IncyB0eXBlCisgKi8KK2ludCBBU2Vuc29yX2dldFR5cGUoQVNlbnNvciogc2Vuc29yKTsKKworLyoKKyAqIFJldHVybnMgdGhpcyBzZW5zb3JzJ3MgcmVzb2x1dGlvbgorICovCitmbG9hdCBBU2Vuc29yX2dldFJlc29sdXRpb24oQVNlbnNvciogc2Vuc29yKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SX0gKZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvd2luZG93LmggYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3dpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjE5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3dpbmRvdy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9XSU5ET1dfSAorI2RlZmluZSBBTkRST0lEX1dJTkRPV19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBXaW5kb3cgZmxhZ3MsIGFzIHBlciB0aGUgSmF2YSBBUEkgYXQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLgorICovCitlbnVtIHsKKyAgICBBV0lORE9XX0ZMQUdfQUxMT1dfTE9DS19XSElMRV9TQ1JFRU5fT04gPSAweDAwMDAwMDAxLAorICAgIEFXSU5ET1dfRkxBR19ESU1fQkVISU5EICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgICAgQVdJTkRPV19GTEFHX0JMVVJfQkVISU5EICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgICBBV0lORE9XX0ZMQUdfTk9UX0ZPQ1VTQUJMRSAgICAgICAgICAgICAgPSAweDAwMDAwMDA4LAorICAgIEFXSU5ET1dfRkxBR19OT1RfVE9VQ0hBQkxFICAgICAgICAgICAgICA9IDB4MDAwMDAwMTAsCisgICAgQVdJTkRPV19GTEFHX05PVF9UT1VDSF9NT0RBTCAgICAgICAgICAgID0gMHgwMDAwMDAyMCwKKyAgICBBV0lORE9XX0ZMQUdfVE9VQ0hBQkxFX1dIRU5fV0FLSU5HICAgICAgPSAweDAwMDAwMDQwLAorICAgIEFXSU5ET1dfRkxBR19LRUVQX1NDUkVFTl9PTiAgICAgICAgICAgICA9IDB4MDAwMDAwODAsCisgICAgQVdJTkRPV19GTEFHX0xBWU9VVF9JTl9TQ1JFRU4gICAgICAgICAgID0gMHgwMDAwMDEwMCwKKyAgICBBV0lORE9XX0ZMQUdfTEFZT1VUX05PX0xJTUlUUyAgICAgICAgICAgPSAweDAwMDAwMjAwLAorICAgIEFXSU5ET1dfRkxBR19GVUxMU0NSRUVOICAgICAgICAgICAgICAgICA9IDB4MDAwMDA0MDAsCisgICAgQVdJTkRPV19GTEFHX0ZPUkNFX05PVF9GVUxMU0NSRUVOICAgICAgID0gMHgwMDAwMDgwMCwKKyAgICBBV0lORE9XX0ZMQUdfRElUSEVSICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAxMDAwLAorICAgIEFXSU5ET1dfRkxBR19TRUNVUkUgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDIwMDAsCisgICAgQVdJTkRPV19GTEFHX1NDQUxFRCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwNDAwMCwKKyAgICBBV0lORE9XX0ZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMgICAgICAgPSAweDAwMDA4MDAwLAorICAgIEFXSU5ET1dfRkxBR19MQVlPVVRfSU5TRVRfREVDT1IgICAgICAgICA9IDB4MDAwMTAwMDAsCisgICAgQVdJTkRPV19GTEFHX0FMVF9GT0NVU0FCTEVfSU0gICAgICAgICAgID0gMHgwMDAyMDAwMCwKKyAgICBBV0lORE9XX0ZMQUdfV0FUQ0hfT1VUU0lERV9UT1VDSCAgICAgICAgPSAweDAwMDQwMDAwLAorICAgIEFXSU5ET1dfRkxBR19TSE9XX1dIRU5fTE9DS0VEICAgICAgICAgICA9IDB4MDAwODAwMDAsCisgICAgQVdJTkRPV19GTEFHX1NIT1dfV0FMTFBBUEVSICAgICAgICAgICAgID0gMHgwMDEwMDAwMCwKKyAgICBBV0lORE9XX0ZMQUdfVFVSTl9TQ1JFRU5fT04gICAgICAgICAgICAgPSAweDAwMjAwMDAwLAorICAgIEFXSU5ET1dfRkxBR19ESVNNSVNTX0tFWUdVQVJEICAgICAgICAgICA9IDB4MDA0MDAwMDAsCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmIC8vIEFORFJPSURfV0lORE9XX0gKZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWRfZ2x1ZS90aHJlYWRlZF9hcHAuaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWRfZ2x1ZS90aHJlYWRlZF9hcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjU4ZTljMgotLS0gL2Rldi9udWxsCisrKyBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWRfZ2x1ZS90aHJlYWRlZF9hcHAuaApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvb3Blci5oPgorCisvKioKKyAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIHN0YW5kYXJkIGdsdWUgY29kZSBvZiBhIHRocmVhZGVkCisgKiBhcHBsaWNhdGlvbi4gIEluIHRoaXMgbW9kZWwsIHRoZSBhcHBsaWNhdGlvbidzIGNvZGUgaXMgcnVubmluZworICogaW4gaXRzIG93biB0aHJlYWQgc2VwYXJhdGUgZnJvbSB0aGUgbWFpbiB0aHJlYWQgb2YgdGhlIHByb2Nlc3MuCisgKiBJdCBpcyBub3QgcmVxdWlyZWQgdGhhdCB0aGlzIHRocmVhZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIEphdmEKKyAqIFZNLCBhbHRob3VnaCBpdCB3aWxsIG5lZWQgdG8gYmUgaW4gb3JkZXIgdG8gbWFrZSBKTkkgY2FsbHMgYW55CisgKiBKYXZhIG9iamVjdHMuCisgKi8KK3N0cnVjdCBhbmRyb2lkX2FwcCB7CisgICAgLy8gVGhlIGFwcGxpY2F0aW9uIGNhbiBwbGFjZSBhIHBvaW50ZXIgdG8gaXRzIG93biBzdGF0ZSBvYmplY3QKKyAgICAvLyBoZXJlIGlmIGl0IGxpa2VzLgorICAgIHZvaWQqIHVzZXJEYXRhOworCisgICAgLy8gVGhlIEFOYXRpdmVBY3Rpdml0eSBvYmplY3QgaW5zdGFuY2UgdGhhdCB0aGlzIGFwcCBpcyBydW5uaW5nIGluLgorICAgIEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHk7CisKKyAgICAvLyBUaGUgQUxvb3BlciBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcCdzIHRocmVhZC4KKyAgICBBTG9vcGVyKiBsb29wZXI7CisKKyAgICAvLyBXaGVuIG5vbi1OVUxMLCB0aGlzIGlzIHRoZSBpbnB1dCBxdWV1ZSBmcm9tIHdoaWNoIHRoZSBhcHAgd2lsbAorICAgIC8vIHJlY2VpdmUgdXNlciBpbnB1dCBldmVudHMuCisgICAgQUlucHV0UXVldWUqIGlucHV0UXVldWU7CisKKyAgICAvLyBXaGVuIG5vbi1OVUxMLCB0aGlzIGlzIHRoZSB3aW5kb3cgc3VyZmFjZSB0aGF0IHRoZSBhcHAgY2FuIGRyYXcgaW4uCisgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93OworCisgICAgLy8gQ3VycmVudCBjb250ZW50IHJlY3RhbmdsZSBvZiB0aGUgd2luZG93OyB0aGlzIGlzIHRoZSBhcmVhIHdoZXJlIHRoZQorICAgIC8vIHdpbmRvdydzIGNvbnRlbnQgc2hvdWxkIGJlIHBsYWNlZCB0byBiZSBzZWVuIGJ5IHRoZSB1c2VyLgorICAgIEFSZWN0IGNvbnRlbnRSZWN0OworCisgICAgLy8gQ3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwJ3MgYWN0aXZpdHkuICBNYXkgYmUgZWl0aGVyIEFQUF9DTURfU1RBUlQsCisgICAgLy8gQVBQX0NNRF9SRVNVTUUsIEFQUF9DTURfUEFVU0UsIG9yIEFQUF9DTURfU1RPUDsgc2VlIGJlbG93LgorICAgIGludCBhY3Rpdml0eVN0YXRlOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEJlbG93IGFyZSAicHJpdmF0ZSIgaW1wbGVtZW50YXRpb24gb2YgdGhlIGdsdWUgY29kZS4KKworICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdCBjb25kOworCisgICAgaW50IG1zZ3JlYWQ7CisgICAgaW50IG1zZ3dyaXRlOworCisgICAgcHRocmVhZF90IHRocmVhZDsKKworICAgIC8vIFRoaXMgaXMgbm9uLXplcm8gd2hlbiB0aGUgYXBwbGljYXRpb24ncyBOYXRpdmVBY3Rpdml0eSBpcyBiZWluZworICAgIC8vIGRlc3Ryb3llZCBhbmQgd2FpdGluZyBmb3IgdGhlIGFwcCB0aHJlYWQgdG8gY29tcGxldGUuCisgICAgaW50IGRlc3Ryb3lSZXF1ZXN0ZWQ7CisKKyAgICBpbnQgcnVubmluZzsKKyAgICBpbnQgZGVzdHJveWVkOworICAgIGludCByZWRyYXdOZWVkZWQ7CisgICAgQUlucHV0UXVldWUqIHBlbmRpbmdJbnB1dFF1ZXVlOworICAgIEFOYXRpdmVXaW5kb3cqIHBlbmRpbmdXaW5kb3c7CisgICAgQVJlY3QgcGVuZGluZ0NvbnRlbnRSZWN0OworfTsKKworZW51bSB7CisgICAgLyoqCisgICAgICogTG9vcGVyIGRhdGEgSUQgb2YgY29tbWFuZHMgY29taW5nIGZyb20gdGhlIGFwcCdzIG1haW4gdGhyZWFkLgorICAgICAqIFRoZXNlIGNhbiBiZSByZXRyaWV2ZWQgYW5kIHByb2Nlc3NlZCB3aXRoIGFuZHJvaWRfYXBwX3JlYWRfY21kKCkKKyAgICAgKiBhbmQgYW5kcm9pZF9hcHBfZXhlY19jbWQoKS4KKyAgICAgKi8KKyAgICBMT09QRVJfSURfTUFJTiA9IDEsCisKKyAgICAvKioKKyAgICAgKiBMb29wZXIgZGF0YSBJRCBvZiBldmVudHMgY29taW5nIGZyb20gdGhlIEFJbnB1dFF1ZXVlIG9mIHRoZQorICAgICAqIGFwcGxpY2F0aW9uJ3Mgd2luZG93LiAgVGhlc2UgY2FuIGJlIHJlYWQgdmlhIHRoZSBpbnB1dFF1ZXVlCisgICAgICogb2JqZWN0IG9mIGFuZHJvaWRfYXBwLgorICAgICAqLworICAgIExPT1BFUl9JRF9FVkVOVCA9IDIKK307CisKK2VudW0geworICAgIC8qKgorICAgICAqIENvbW1hbmQgZnJvbSBtYWluIHRocmVhZDogdGhlIEFJbnB1dFF1ZXVlIGhhcyBjaGFuZ2VkLiAgVXBvbiBwcm9jZXNzaW5nCisgICAgICogdGhpcyBjb21tYW5kLCBhbmRyb2lkX2FwcC0+aW5wdXRRdWV1ZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIG5ldyBxdWV1ZQorICAgICAqIChvciBOVUxMKS4KKyAgICAgKi8KKyAgICBBUFBfQ01EX0lOUFVUX0NIQU5HRUQsCisKKyAgICAvKioKKyAgICAgKiBDb21tYW5kIGZyb20gbWFpbiB0aHJlYWQ6IHRoZSBBTmF0aXZlV2luZG93IGhhcyBjaGFuZ2VkLiAgVXBvbiBwcm9jZXNzaW5nCisgICAgICogdGhpcyBjb21tYW5kLCBhbmRyb2lkX2FwcC0+d2luZG93IHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgbmV3IHdpbmRvdyBzdXJmYWNlCisgICAgICogKG9yIE5VTEwpLgorICAgICAqLworICAgIEFQUF9DTURfV0lORE9XX0NIQU5HRUQsCisKKyAgICAvKioKKyAgICAgKiBDb21tYW5kIGZyb20gbWFpbiB0aHJlYWQ6IHRoZSBjdXJyZW50IEFOYXRpdmVXaW5kb3cgaGFzIGJlZW4gcmVzaXplZC4KKyAgICAgKiBQbGVhc2UgcmVkcmF3IHdpdGggaXRzIG5ldyBzaXplLgorICAgICAqLworICAgIEFQUF9DTURfV0lORE9XX1JFU0laRUQsCisKKyAgICAvKioKKyAgICAgKiBDb21tYW5kIGZyb20gbWFpbiB0aHJlYWQ6IHRoZSBzeXN0ZW0gbmVlZHMgdGhhdCB0aGUgY3VycmVudCBBTmF0aXZlV2luZG93CisgICAgICogYmUgcmVkcmF3bi4gIFlvdSBzaG91bGQgcmVkcmF3IHRoZSB3aW5kb3cgYmVmb3JlIGhhbmRpbmcgdGhpcyB0bworICAgICAqIGFuZHJvaWRfYXBwX2V4ZWNfY21kKCkgaW4gb3JkZXIgdG8gYXZvaWQgdHJhbnNpZW50IGRyYXdpbmcgZ2xpdGNoZXMuCisgICAgICovCisgICAgQVBQX0NNRF9XSU5ET1dfUkVEUkFXX05FRURFRCwKKworICAgIC8qKgorICAgICAqIENvbW1hbmQgZnJvbSBtYWluIHRocmVhZDogdGhlIGNvbnRlbnQgYXJlYSBvZiB0aGUgd2luZG93IGhhcyBjaGFuZ2VkLAorICAgICAqIHN1Y2ggYXMgZnJvbSB0aGUgc29mdCBpbnB1dCB3aW5kb3cgYmVpbmcgc2hvd24gb3IgaGlkZGVuLiAgWW91IGNhbgorICAgICAqIGZpbmQgdGhlIG5ldyBjb250ZW50IHJlY3QgaW4gYW5kcm9pZF9hcHA6OmNvbnRlbnRSZWN0LgorICAgICAqLworICAgIEFQUF9DTURfQ09OVEVOVF9SRUNUX0NIQU5HRUQsCisKKyAgICAvKioKKyAgICAgKiBDb21tYW5kIGZyb20gbWFpbiB0aHJlYWQ6IHRoZSBhcHAncyBhY3Rpdml0eSB3aW5kb3cgaGFzIGdhaW5lZAorICAgICAqIGlucHV0IGZvY3VzLgorICAgICAqLworICAgIEFQUF9DTURfR0FJTkVEX0ZPQ1VTLAorCisgICAgLyoqCisgICAgICogQ29tbWFuZCBmcm9tIG1haW4gdGhyZWFkOiB0aGUgYXBwJ3MgYWN0aXZpdHkgd2luZG93IGhhcyBsb3N0CisgICAgICogaW5wdXQgZm9jdXMuCisgICAgICovCisgICAgQVBQX0NNRF9MT1NUX0ZPQ1VTLAorCisgICAgLyoqCisgICAgICogQ29tbWFuZCBmcm9tIG1haW4gdGhyZWFkOiB0aGUgc3lzdGVtIGlzIHJ1bm5pbmcgbG93IG9uIG1lbW9yeS4KKyAgICAgKiBUcnkgdG8gcmVkdWNlIHlvdXIgbWVtb3J5IHVzZS4KKyAgICAgKi8KKyAgICBBUFBfQ01EX0xPV19NRU1PUlksCisKKyAgICAvKioKKyAgICAgKiBDb21tYW5kIGZyb20gbWFpbiB0aHJlYWQ6IHRoZSBhcHAncyBhY3Rpdml0eSBoYXMgYmVlbiBzdGFydGVkLgorICAgICAqLworICAgIEFQUF9DTURfU1RBUlQsCisKKyAgICAvKioKKyAgICAgKiBDb21tYW5kIGZyb20gbWFpbiB0aHJlYWQ6IHRoZSBhcHAncyBhY3Rpdml0eSBoYXMgYmVlbiByZXN1bWVkLgorICAgICAqLworICAgIEFQUF9DTURfUkVTVU1FLAorCisgICAgLyoqCisgICAgICogQ29tbWFuZCBmcm9tIG1haW4gdGhyZWFkOiB0aGUgYXBwJ3MgYWN0aXZpdHkgaGFzIGJlZW4gcGF1c2VkLgorICAgICAqLworICAgIEFQUF9DTURfUEFVU0UsCisKKyAgICAvKioKKyAgICAgKiBDb21tYW5kIGZyb20gbWFpbiB0aHJlYWQ6IHRoZSBhcHAncyBhY3Rpdml0eSBoYXMgYmVlbiBzdG9wcGVkLgorICAgICAqLworICAgIEFQUF9DTURfU1RPUCwKKworICAgIC8qKgorICAgICAqIENvbW1hbmQgZnJvbSBtYWluIHRocmVhZDogdGhlIGFwcCdzIGFjdGl2aXR5IGlzIGJlaW5nIGRlc3Ryb3llZCwKKyAgICAgKiBhbmQgd2FpdGluZyBmb3IgdGhlIGFwcCB0aHJlYWQgdG8gY2xlYW4gdXAgYW5kIGV4aXQgYmVmb3JlIHByb2NlZWRpbmcuCisgICAgICovCisgICAgQVBQX0NNRF9ERVNUUk9ZLAorfTsKKworLyoqCisgKiBDYWxsIHdoZW4gQUxvb3Blcl9wb2xsQWxsKCkgcmV0dXJucyBMT09QRVJfSURfTUFJTiwgcmVhZGluZyB0aGUgbmV4dAorICogYXBwIGNvbW1hbmQgbWVzc2FnZS4KKyAqLworaW50OF90IGFuZHJvaWRfYXBwX3JlYWRfY21kKHN0cnVjdCBhbmRyb2lkX2FwcCogYW5kcm9pZF9hcHApOworCisvKioKKyAqIENhbGwgd2l0aCB0aGUgY29tbWFuZCByZXR1cm5lZCBieSBhbmRyb2lkX2FwcF9yZWFkX2NtZCgpIHRvIGRvIHRoZQorICogZGVmYXVsdCBwcm9jZXNzaW5nIG9mIHRoZSBnaXZlbiBjb21tYW5kLgorICoKKyAqIEltcG9ydGFudDogcmV0dXJucyAwIGlmIHRoZSBhcHAgc2hvdWxkIGV4aXQuICBZb3UgbXVzdCBBTFdBWVMgY2hlY2sgZm9yCisgKiBhIHplcm8gcmV0dXJuIGFuZCwgaWYgZm91bmQsIGV4aXQgeW91ciBhbmRyb2lkX21haW4oKSBmdW5jdGlvbi4KKyAqLworaW50MzJfdCBhbmRyb2lkX2FwcF9leGVjX2NtZChzdHJ1Y3QgYW5kcm9pZF9hcHAqIGFuZHJvaWRfYXBwLCBpbnQ4X3QgY21kKTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGFwcGxpY2F0aW9uIGNvZGUgbXVzdCBpbXBsZW1lbnQsIHJlcHJlc2VudGluZworICogdGhlIG1haW4gZW50cnkgdG8gdGhlIGFwcC4KKyAqLworZXh0ZXJuIHZvaWQgYW5kcm9pZF9tYWluKHN0cnVjdCBhbmRyb2lkX2FwcCogYXBwKTsKZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMU3VyZmFjZVZpZXcuamF2YSBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMU3VyZmFjZVZpZXcuamF2YQppbmRleCAyZmYyMzFkLi40MTIwN2Y3IDEwMDY0NAotLS0gYS9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTFN1cmZhY2VWaWV3LmphdmEKKysrIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xTdXJmYWNlVmlldy5qYXZhCkBAIC0yMjIsNiArMjIyLDEwIEBACiAgICAgICAgIC8vIHVuZGVybHlpbmcgc3VyZmFjZSBpcyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQKICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIgPSBnZXRIb2xkZXIoKTsKICAgICAgICAgaG9sZGVyLmFkZENhbGxiYWNrKHRoaXMpOworICAgICAgICAvLyBzZXRGb3JtYXQgaXMgZG9uZSBieSBTdXJmYWNlVmlldyBpbiBTREsgMi4zIGFuZCBuZXdlci4gVW5jb21tZW50CisgICAgICAgIC8vIHRoaXMgc3RhdGVtZW50IGlmIGJhY2stcG9ydGluZyB0byAyLjIgb3Igb2xkZXI6CisgICAgICAgIC8vIGhvbGRlci5zZXRGb3JtYXQoUGl4ZWxGb3JtYXQuUkdCXzU2NSk7CisgICAgICAgIC8vCiAgICAgICAgIC8vIHNldFR5cGUgaXMgbm90IG5lZWRlZCBmb3IgU0RLIDIuMCBvciBuZXdlci4gVW5jb21tZW50IHRoaXMKICAgICAgICAgLy8gc3RhdGVtZW50IGlmIGJhY2stcG9ydGluZyB0aGlzIGNvZGUgdG8gb2xkZXIgU0RLcy4KICAgICAgICAgLy8gaG9sZGVyLnNldFR5cGUoU3VyZmFjZUhvbGRlci5TVVJGQUNFX1RZUEVfR1BVKTsKQEAgLTExMDMsNyArMTEwNyw2IEBACiAgICAgICAgICAgICBtUmVuZGVyZXIgPSByZW5kZXJlcjsKICAgICAgICAgfQogCi0KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgIHNldE5hbWUoIkdMVGhyZWFkICIgKyBnZXRJZCgpKTsKQEAgLTExNTQsNiArMTE1Nyw3IEBACiAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaXplQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gd2FudFJlbmRlck5vdGlmaWNhdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gZG9SZW5kZXJOb3RpZmljYXRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGFza2VkVG9SZWxlYXNlRWdsQ29udGV4dCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGludCB3ID0gMDsKICAgICAgICAgICAgICAgICBpbnQgaCA9IDA7CiAgICAgICAgICAgICAgICAgUnVubmFibGUgZXZlbnQgPSBudWxsOwpAQCAtMTE3OSw2ICsxMTgzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIGdpdmUgdXAgdGhlIEVHTCBjb250ZXh0PworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2hvdWxkUmVsZWFzZUVnbENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR19TVVJGQUNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaSgiR0xUaHJlYWQiLCAicmVsZWFzaW5nIEVHTCBjb250ZXh0IGJlY2F1c2UgYXNrZWQgdG8gdGlkPSIgKyBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wRWdsU3VyZmFjZUxvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wRWdsQ29udGV4dExvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2hvdWxkUmVsZWFzZUVnbENvbnRleHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNrZWRUb1JlbGVhc2VFZ2xDb250ZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXZlIHdlIGxvc3QgdGhlIEVHTCBjb250ZXh0PwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3N0RWdsQ29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wRWdsU3VyZmFjZUxvY2tlZCgpOwpAQCAtMTIyOCw2ICsxMjQzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9SZW5kZXJOb3RpZmljYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR19TVVJGQUNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaSgiR0xUaHJlYWQiLCAic2VuZGluZyByZW5kZXIgbm90aWZpY2F0aW9uIHRpZD0iICsgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudFJlbmRlck5vdGlmaWNhdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1JlbmRlck5vdGlmaWNhdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVuZGVyQ29tcGxldGUgPSB0cnVlOwpAQCAtMTIzNSwyMiArMTI1MywyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWR5IHRvIGRyYXc/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghbVBhdXNlZCkgJiYgbUhhc1N1cmZhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1XaWR0aCA+IDApICYmIChtSGVpZ2h0ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1SZXF1ZXN0UmVuZGVyIHx8IChtUmVuZGVyTW9kZSA9PSBSRU5ERVJNT0RFX0NPTlRJTlVPVVNMWSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWR5VG9EcmF3KCkpIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIEVHTCBjb250ZXh0LCB0cnkgdG8gYWNxdWlyZSBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoISBtSGF2ZUVnbENvbnRleHQpICYmIHNHTFRocmVhZE1hbmFnZXIudHJ5QWNxdWlyZUVnbENvbnRleHRMb2NrZWQodGhpcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVnbEhlbHBlci5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0dMVGhyZWFkTWFuYWdlci5yZWxlYXNlRWdsQ29udGV4dExvY2tlZCh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhdmVFZ2xDb250ZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVnbENvbnRleHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBtSGF2ZUVnbENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhc2tlZFRvUmVsZWFzZUVnbENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2tlZFRvUmVsZWFzZUVnbENvbnRleHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc0dMVGhyZWFkTWFuYWdlci50cnlBY3F1aXJlRWdsQ29udGV4dExvY2tlZCh0aGlzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZ2xIZWxwZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0dMVGhyZWFkTWFuYWdlci5yZWxlYXNlRWdsQ29udGV4dExvY2tlZCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhdmVFZ2xDb250ZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVFZ2xDb250ZXh0ID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0dMVGhyZWFkTWFuYWdlci5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzR0xUaHJlYWRNYW5hZ2VyLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1IYXZlRWdsQ29udGV4dCAmJiAhbUhhdmVFZ2xTdXJmYWNlKSB7CkBAIC0xMjY1LDYgKzEyODUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBtV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IG1IZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudFJlbmRlck5vdGlmaWNhdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR19TVVJGQUNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKCJHTFRocmVhZCIsICJub3RpY2luZyB0aGF0IHdlIHdhbnQgcmVuZGVyIG5vdGlmaWNhdGlvbiB0aWQ9IiArIGdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEUkFXX1RXSUNFX0FGVEVSX1NJWkVfQ0hBTkdFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBrZWVwIG1SZXF1ZXN0UmVuZGVyIHRydWUgc28gdGhhdCB3ZSBkcmF3IHR3aWNlIGFmdGVyIHRoZSBzaXplIGNoYW5nZXMuCkBAIC0xMjg0LDcgKzEzMDcsMTYgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ5IGRlc2lnbiwgdGhpcyBpcyB0aGUgb25seSBwbGFjZSBpbiBhIEdMVGhyZWFkIHRocmVhZCB3aGVyZSB3ZSB3YWl0KCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR19USFJFQURTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKCJHTFRocmVhZCIsICJ3YWl0aW5nIHRpZD0iICsgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKCJHTFRocmVhZCIsICJ3YWl0aW5nIHRpZD0iICsgZ2V0SWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1IYXZlRWdsQ29udGV4dDogIiArIG1IYXZlRWdsQ29udGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1IYXZlRWdsU3VyZmFjZTogIiArIG1IYXZlRWdsU3VyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1QYXVzZWQ6ICIgKyBtUGF1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbUhhc1N1cmZhY2U6ICIgKyBtSGFzU3VyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1XYWl0aW5nRm9yU3VyZmFjZTogIiArIG1XYWl0aW5nRm9yU3VyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1XaWR0aDogIiArIG1XaWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1IZWlnaHQ6ICIgKyBtSGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVJlcXVlc3RSZW5kZXI6ICIgKyBtUmVxdWVzdFJlbmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1SZW5kZXJNb2RlOiAiICsgbVJlbmRlck1vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzR0xUaHJlYWRNYW5hZ2VyLndhaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEzMjYsNyArMTM1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAoTE9HX1JFTkRFUkVSX0RSQVdfRlJBTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KCJHTFRocmVhZCIsICJvbkRyYXdGcmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoIkdMVGhyZWFkIiwgIm9uRHJhd0ZyYW1lIHRpZD0iICsgZ2V0SWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLm9uRHJhd0ZyYW1lKGdsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWdsSGVscGVyLnN3YXAoKSkgewpAQCAtMTM1Miw2ICsxMzg0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhYmxlVG9EcmF3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1IYXZlRWdsQ29udGV4dCAmJiBtSGF2ZUVnbFN1cmZhY2UgJiYgcmVhZHlUb0RyYXcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiByZWFkeVRvRHJhdygpIHsKKyAgICAgICAgICAgIHJldHVybiAoIW1QYXVzZWQpICYmIG1IYXNTdXJmYWNlCisgICAgICAgICAgICAgICAgJiYgKG1XaWR0aCA+IDApICYmIChtSGVpZ2h0ID4gMCkKKyAgICAgICAgICAgICAgICAmJiAobVJlcXVlc3RSZW5kZXIgfHwgKG1SZW5kZXJNb2RlID09IFJFTkRFUk1PREVfQ09OVElOVU9VU0xZKSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJNb2RlKGludCByZW5kZXJNb2RlKSB7CiAgICAgICAgICAgICBpZiAoICEoKFJFTkRFUk1PREVfV0hFTl9ESVJUWSA8PSByZW5kZXJNb2RlKSAmJiAocmVuZGVyTW9kZSA8PSBSRU5ERVJNT0RFX0NPTlRJTlVPVVNMWSkpICkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbmRlck1vZGUiKTsKQEAgLTE0NjEsOSArMTUwMywxMCBAQAogICAgICAgICAgICAgICAgIHNHTFRocmVhZE1hbmFnZXIubm90aWZ5QWxsKCk7CiAKICAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aHJlYWQgdG8gcmVhY3QgdG8gcmVzaXplIGFuZCByZW5kZXIgYSBmcmFtZQotICAgICAgICAgICAgICAgIHdoaWxlICghIG1FeGl0ZWQgJiYgIW1QYXVzZWQgJiYgIW1SZW5kZXJDb21wbGV0ZSApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoISBtRXhpdGVkICYmICFtUGF1c2VkICYmICFtUmVuZGVyQ29tcGxldGUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChtR0xUaHJlYWQgIT0gbnVsbCAmJiBtR0xUaHJlYWQuYWJsZVRvRHJhdygpKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoTE9HX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKCJNYWluIHRocmVhZCIsICJvbldpbmRvd1Jlc2l6ZSB3YWl0aW5nIGZvciByZW5kZXIgY29tcGxldGUuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaSgiTWFpbiB0aHJlYWQiLCAib25XaW5kb3dSZXNpemUgd2FpdGluZyBmb3IgcmVuZGVyIGNvbXBsZXRlIGZyb20gdGlkPSIgKyBtR0xUaHJlYWQuZ2V0SWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNHTFRocmVhZE1hbmFnZXIud2FpdCgpOwpAQCAtMTQ5MCw2ICsxNTMzLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0UmVsZWFzZUVnbENvbnRleHRMb2NrZWQoKSB7CisgICAgICAgICAgICBtU2hvdWxkUmVsZWFzZUVnbENvbnRleHQgPSB0cnVlOworICAgICAgICAgICAgc0dMVGhyZWFkTWFuYWdlci5ub3RpZnlBbGwoKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBRdWV1ZSBhbiAiZXZlbnQiIHRvIGJlIHJ1biBvbiB0aGUgR0wgcmVuZGVyaW5nIHRocmVhZC4KICAgICAgICAgICogQHBhcmFtIHIgdGhlIHJ1bm5hYmxlIHRvIGJlIHJ1biBvbiB0aGUgR0wgcmVuZGVyaW5nIHRocmVhZC4KQEAgLTE1MTQsNiArMTU2Miw3IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtV2FpdGluZ0ZvclN1cmZhY2U7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGF2ZUVnbENvbnRleHQ7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGF2ZUVnbFN1cmZhY2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvdWxkUmVsZWFzZUVnbENvbnRleHQ7CiAgICAgICAgIHByaXZhdGUgaW50IG1XaWR0aDsKICAgICAgICAgcHJpdmF0ZSBpbnQgbUhlaWdodDsKICAgICAgICAgcHJpdmF0ZSBpbnQgbVJlbmRlck1vZGU7CkBAIC0xNTk4LDYgKzE2NDcsMTMgQEAKICAgICAgICAgICAgIGlmIChtTXVsdGlwbGVHTEVTQ29udGV4dHNBbGxvd2VkKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3RpZnkgdGhlIG93bmluZyB0aHJlYWQgdGhhdCBpdCBzaG91bGQgcmVsZWFzZSB0aGUgY29udGV4dC4KKyAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBhIGZhaXJuZXNzIHBvbGljeS4gQ3VycmVudGx5CisgICAgICAgICAgICAvLyBpZiB0aGUgb3duaW5nIHRocmVhZCBpcyBkcmF3aW5nIGNvbnRpbnVvdXNseSBpdCB3aWxsIGp1c3QKKyAgICAgICAgICAgIC8vIHJlYWNxdWlyZSB0aGUgRUdMIGNvbnRleHQuCisgICAgICAgICAgICBpZiAobUVnbE93bmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRWdsT3duZXIucmVxdWVzdFJlbGVhc2VFZ2xDb250ZXh0TG9ja2VkKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbC5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcAppbmRleCBiYTA5ZDA4Li43MTRmZDNlIDEwMDY0NAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcAorKysgYi9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcApAQCAtMTA0NSw2ICsxMDQ1LDEwIEBACiAgICAgaW50IGk9MCwgaW5kZXg9MDsKICAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHAsIGksIGluZGV4KTsKICAgICBpZiAoY254KSB7CisgICAgICAgIGlmIChzaGFyZV9saXN0ICE9IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgICAgICBlZ2xfY29udGV4dF90KiBjb25zdCBjID0gZ2V0X2NvbnRleHQoc2hhcmVfbGlzdCk7CisgICAgICAgICAgICBzaGFyZV9saXN0ID0gYy0+Y29udGV4dDsKKyAgICAgICAgfQogICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQgPSBjbngtPmVnbC5lZ2xDcmVhdGVDb250ZXh0KAogICAgICAgICAgICAgICAgIGRwLT5kaXNwW2ldLmRweSwgZHAtPmRpc3BbaV0uY29uZmlnW2luZGV4XSwKICAgICAgICAgICAgICAgICBzaGFyZV9saXN0LCBhdHRyaWJfbGlzdCk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL2puaS9nbF9jb2RlLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9qbmkvam5pL2dsX2NvZGUuY3BwCmluZGV4IGYwMzFjNzkuLmVmNjY4NDEgMTAwNjQ0Ci0tLSBhL29wZW5nbC90ZXN0cy9nbF9qbmkvam5pL2dsX2NvZGUuY3BwCisrKyBiL29wZW5nbC90ZXN0cy9nbF9qbmkvam5pL2dsX2NvZGUuY3BwCkBAIC0xODEsNCArMTgxLDMgQEAKIHsKICAgICBiYWNrZ3JvdW5kID0gMS4wZiAtIGJhY2tncm91bmQ7CiB9Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjQ3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlnbDJfcGVyZi5jcHAgXAorCWZpbGx0ZXN0LmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkVHTCBcCisgICAgbGliR0xFU3YyIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1nbDJfcGVyZgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzk4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsdGVzdC5jcHAKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7CisgICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCisgICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZ2xFcnJvciAoMHgleClcbiIsIG9wLCBlcnJvcik7CisgICAgfQorfQorCitHTHVpbnQgbG9hZFNoYWRlcihHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSkgeworICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKKyAgICBpZiAoc2hhZGVyKSB7CisgICAgICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnBTb3VyY2UsIE5VTEwpOworICAgICAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKyAgICAgICAgR0xpbnQgY29tcGlsZWQgPSAwOworICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7CisgICAgICAgIGlmICghY29tcGlsZWQpIHsKKyAgICAgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOworICAgICAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOworICAgICAgICAgICAgaWYgKGluZm9MZW4pIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGluZm9MZW4sIE5VTEwsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICVkOlxuJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyVHlwZSwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNoYWRlcjsKK30KKworZW51bSB7CisgICAgQV9QT1MsCisgICAgQV9DT0xPUiwKKyAgICBBX1RFWDAsCisgICAgQV9URVgxCit9OworCitHTHVpbnQgY3JlYXRlUHJvZ3JhbShjb25zdCBjaGFyKiBwVmVydGV4U291cmNlLCBjb25zdCBjaGFyKiBwRnJhZ21lbnRTb3VyY2UpIHsKKyAgICBHTHVpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCBwVmVydGV4U291cmNlKTsKKyAgICBpZiAoIXZlcnRleFNoYWRlcikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBHTHVpbnQgcGl4ZWxTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwgcEZyYWdtZW50U291cmNlKTsKKyAgICBpZiAoIXBpeGVsU2hhZGVyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEdMdWludCBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0pIHsKKyAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKKyAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciB2Iik7CisgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHBpeGVsU2hhZGVyKTsKKyAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciBwIik7CisKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9QT1MsICJhX3BvcyIpOworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX0NPTE9SLCAiYV9jb2xvciIpOworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX1RFWDAsICJhX3RleDAiKTsKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9URVgxLCAiYV90ZXgxIik7CisgICAgICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7CisgICAgICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKKyAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZsaW5rU3RhdHVzKTsKKyAgICAgICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICAgICAgR0xpbnQgYnVmTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmJ1Zkxlbmd0aCk7CisgICAgICAgICAgICBpZiAoYnVmTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoYnVmTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSwgYnVmTGVuZ3RoLCBOVUxMLCBidWYpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06XG4lc1xuIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKKyAgICAgICAgICAgIHByb2dyYW0gPSAwOworICAgICAgICB9CisgICAgfQorICAgIGNoZWNrR2xFcnJvcigiY3JlYXRlUHJvZ3JhbSIpOworICAgIGdsVXNlUHJvZ3JhbShwcm9ncmFtKTsKKyAgICByZXR1cm4gcHJvZ3JhbTsKK30KKwordWludDY0X3QgZ2V0VGltZSgpIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdDsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnQpOworICAgIHJldHVybiB0LnR2X25zZWMgKyAoKHVpbnQ2NF90KXQudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwKTsKK30KKwordWludDY0X3QgZ1RpbWU7Cit2b2lkIHN0YXJ0VGltZXIoKSB7CisgICAgZ1RpbWUgPSBnZXRUaW1lKCk7Cit9CisKK3ZvaWQgZW5kVGltZXIoY29uc3QgY2hhciAqc3RyLCBpbnQgdywgaW50IGgsIGRvdWJsZSBkYywgaW50IGNvdW50KSB7CisgICAgdWludDY0X3QgdDIgPSBnZXRUaW1lKCk7CisgICAgZG91YmxlIGRlbHRhID0gKChkb3VibGUpKHQyIC0gZ1RpbWUpKSAvIDEwMDAwMDAwMDA7CisgICAgZG91YmxlIHBpeGVscyA9IGRjICogKHcgKiBoKSAqIGNvdW50OworICAgIGRvdWJsZSBtcHBzID0gcGl4ZWxzIC8gZGVsdGEgLyAxMDAwMDAwOworICAgIGRvdWJsZSBkYzYwID0gcGl4ZWxzIC8gZGVsdGEgLyAodyAqIGgpIC8gNjA7CisKKyAgICBwcmludGYoIiVzLCAlZiwgJWZcbiIsIHN0ciwgbXBwcywgZGM2MCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGdWZXJ0ZXhTaGFkZXJbXSA9CisgICAgImF0dHJpYnV0ZSB2ZWM0IGFfcG9zO1xuIgorICAgICJhdHRyaWJ1dGUgdmVjNCBhX2NvbG9yO1xuIgorICAgICJhdHRyaWJ1dGUgdmVjMiBhX3RleDA7XG4iCisgICAgImF0dHJpYnV0ZSB2ZWMyIGFfdGV4MTtcbiIKKyAgICAidmFyeWluZyB2ZWM0IHZfY29sb3I7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDE7XG4iCisKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgICAgdl9jb2xvciA9IGFfY29sb3I7XG4iCisgICAgIiAgICB2X3RleDAgPSBhX3RleDA7XG4iCisgICAgIiAgICB2X3RleDEgPSBhX3RleDE7XG4iCisgICAgIiAgICBnbF9Qb3NpdGlvbiA9IGFfcG9zO1xuIgorICAgICJ9XG4iOworCitzdGF0aWMgY29uc3QgY2hhciBnU2hhZGVyUHJlZml4W10gPQorICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidW5pZm9ybSB2ZWM0IHVfY29sb3I7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1XzA7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1XzE7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1XzI7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1XzM7XG4iCisgICAgInZhcnlpbmcgdmVjNCB2X2NvbG9yO1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgxO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MTtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgZ1NoYWRlclBvc3RmaXhbXSA9CisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gYztcbiIKKyAgICAifVxuIjsKKworCitzdGF0aWMgY2hhciAqIGFwcGVuZChjaGFyICpkLCBjb25zdCBjaGFyICpzKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihzKTsKKyAgICBtZW1jcHkoZCwgcywgbGVuKTsKKyAgICByZXR1cm4gZCArIGxlbjsKK30KKworc3RhdGljIGNoYXIgKiBnZW5TaGFkZXIoCisgICAgYm9vbCB1c2VWYXJDb2xvciwKKyAgICBpbnQgdGV4Q291bnQsCisgICAgYm9vbCBtb2R1bGF0ZUZpcnN0VGV4LAorICAgIGludCBleHRyYU1hdGgpCit7CisgICAgY2hhciAqc3RyID0gKGNoYXIgKiljYWxsb2MoMTYgKiAxMDI0LCAxKTsKKyAgICBjaGFyICp0bXAgPSBhcHBlbmQoc3RyLCBnU2hhZGVyUHJlZml4KTsKKworICAgIGlmIChtb2R1bGF0ZUZpcnN0VGV4IHx8ICF0ZXhDb3VudCkgeworICAgICAgICBpZiAodXNlVmFyQ29sb3IpIHsKKyAgICAgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIHZlYzQgYyA9IHZfY29sb3I7XG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIHZlYzQgYyA9IHVfY29sb3I7XG4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIHZlYzQgYyA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iKTsKKyAgICB9CisKKyAgICBpZiAobW9kdWxhdGVGaXJzdFRleCAmJiB0ZXhDb3VudCkgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICo9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iKTsKKyAgICB9CisgICAgaWYgKHRleENvdW50ID4gMSkgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICo9IHRleHR1cmUyRCh1X3RleDEsIHZfdGV4MSk7XG4iKTsKKyAgICB9CisKKyAgICBpZiAoZXh0cmFNYXRoID4gMCkgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICo9IHVfMDtcbiIpOworICAgIH0KKyAgICBpZiAoZXh0cmFNYXRoID4gMSkgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICo9IHVfMTtcbiIpOworICAgIH0KKyAgICBpZiAoZXh0cmFNYXRoID4gMikgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICo9IHVfMjtcbiIpOworICAgIH0KKyAgICBpZiAoZXh0cmFNYXRoID4gMykgeworICAgICAgICB0bXAgPSBhcHBlbmQodG1wLCAiICBjICo9IHVfMztcbiIpOworICAgIH0KKworCisgICAgdG1wID0gYXBwZW5kKHRtcCwgZ1NoYWRlclBvc3RmaXgpOworICAgIHRtcFswXSA9IDA7CisKKyAgICAvL3ByaW50ZigiJXMiLCBzdHIpOworICAgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwVkEoKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHZ0eFtdID0geworICAgICAgICAtMi4wZiwtMS4wZiwKKyAgICAgICAgIDEuMGYsLTEuMGYsCisgICAgICAgIC0yLjBmLCAxLjBmLAorICAgICAgICAgMS4wZiwgMS4wZiB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBjb2xvcltdID0geworICAgICAgICAxLjBmLDAuMGYsMS4wZiwxLjBmLAorICAgICAgICAwLjBmLDAuMGYsMS4wZiwxLjBmLAorICAgICAgICAxLjBmLDEuMGYsMC4wZiwxLjBmLAorICAgICAgICAxLjBmLDEuMGYsMS4wZiwxLjBmIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHRleDBbXSA9IHsKKyAgICAgICAgMC4wZiwwLjBmLAorICAgICAgICAxLjBmLDAuMGYsCisgICAgICAgIDEuMGYsMS4wZiwKKyAgICAgICAgMC4wZiwxLjBmIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHRleDFbXSA9IHsKKyAgICAgICAgMS4wZiwwLjBmLAorICAgICAgICAxLjBmLDEuMGYsCisgICAgICAgIDAuMGYsMS4wZiwKKyAgICAgICAgMC4wZiwwLjBmIH07CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfUE9TKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfQ09MT1IpOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoQV9URVgwKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfVEVYMSk7CisKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9QT1MsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdnR4KTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9DT0xPUiwgNCwgR0xfRkxPQVQsIGZhbHNlLCAxNiwgY29sb3IpOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX1RFWDAsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdGV4MCk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfVEVYMSwgMiwgR0xfRkxPQVQsIGZhbHNlLCA4LCB0ZXgxKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBwdFN3YXAoKTsKKworc3RhdGljIHZvaWQgZG9Mb29wKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IGNoYXIgKnN0cikgeworICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7CisgICAgcHRTd2FwKCk7CisgICAgZ2xGaW5pc2goKTsKKworICAgIHN0YXJ0VGltZXIoKTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDsgY3QrKykgeworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDQpOworICAgIH0KKyAgICBwdFN3YXAoKTsKKyAgICBnbEZpbmlzaCgpOworICAgIGVuZFRpbWVyKHN0ciwgdywgaCwgMSwgMTAwKTsKK30KKworc3RhdGljIHZvaWQgZG9TaW5nbGVUZXN0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VWYXJDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGV4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtb2R1bGF0ZUZpcnN0VGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHRyYU1hdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRleDAsIGludCB0ZXgxKSB7CisgICAgY2hhciAqcGdtVHh0ID0gZ2VuU2hhZGVyKHVzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoKTsKKyAgICBpbnQgcGdtID0gY3JlYXRlUHJvZ3JhbShnVmVydGV4U2hhZGVyLCBwZ21UeHQpOworICAgIGlmICghcGdtKSB7CisgICAgICAgIHByaW50ZigiZXJyb3IgcnVubmluZyB0ZXN0XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXgwIik7CisgICAgLy9wcmludGYoImxvYyA9ICVpIFxuIiwgbG9jKTsKKyAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTFpKGxvYywgMCk7CisgICAgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXgxIik7CisgICAgaWYgKGxvYyA+PSAwKSBnbFVuaWZvcm0xaShsb2MsIDEpOworCisgICAgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV9jb2xvciIpOworICAgIGlmIChsb2MgPj0gMCkgZ2xVbmlmb3JtNGYobG9jLCAxLmYsIDAuNGYsIDAuNmYsIDAuOGYpOworCisgICAgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV8wIik7CisgICAgaWYgKGxvYyA+PSAwKSBnbFVuaWZvcm00Zihsb2MsIDEuZiwgMC40ZiwgMC42ZiwgMC44Zik7CisKKyAgICBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1XzEiKTsKKyAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTRmKGxvYywgMC43ZiwgMC44ZiwgMC42ZiwgMC44Zik7CisKKyAgICBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1XzIiKTsKKyAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTRmKGxvYywgMC45ZiwgMC42ZiwgMC43ZiwgMS4wZik7CisKKyAgICBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1XzMiKTsKKyAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTRmKGxvYywgMC44OGYsIDAuMmYsIDAuNGYsIDAuMmYpOworCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleDApOworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMSk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXgxKTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworCisgICAgY2hhciBzdHIyWzEwMjRdOworCisgICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkUpOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgc3ByaW50ZihzdHIyLCAiJWksICVpLCAlaSwgJWksICVpLCAwIiwKKyAgICAgICAgICAgIHVzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoLCB0ZXgwKTsKKyAgICBkb0xvb3AodywgaCwgc3RyMik7CisKKyAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgc3ByaW50ZihzdHIyLCAiJWksICVpLCAlaSwgJWksICVpLCAxIiwKKyAgICAgICAgICAgIHVzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoLCB0ZXgwKTsKKyAgICBkb0xvb3AodywgaCwgc3RyMik7Cit9CisKK3ZvaWQgZ2VuVGV4dHVyZXMoKSB7CisgICAgdWludDMyX3QgKm0gPSAodWludDMyX3QgKiltYWxsb2MoMTAyNCoxMDI0KjQpOworICAgIGZvciAoaW50IHk9MDsgeSA8IDEwMjQ7IHkrKyl7CisgICAgICAgIGZvciAoaW50IHg9MDsgeCA8IDEwMjQ7IHgrKyl7CisgICAgICAgICAgICBtW3kqMTAyNCArIHhdID0gMHhmZjAwMDBmZiB8ICgoeCAmIDB4ZmYpIDw8IDgpIHwgKHkgPDwgMTYpOworICAgICAgICB9CisgICAgfQorICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMSk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDEwMjQsIDEwMjQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIG0pOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOworCisgICAgZm9yIChpbnQgeT0wOyB5IDwgMTY7IHkrKyl7CisgICAgICAgIGZvciAoaW50IHg9MDsgeCA8IDE2OyB4KyspeworICAgICAgICAgICAgbVt5KjE2ICsgeF0gPSAweGZmMDAwMGZmIHwgKHg8PDEyKSB8ICh5PDwyMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAyKTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgMTYsIDE2LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBtKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKKworfQorCitib29sIGRvVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoKSB7CisgICAgc2V0dXBWQSgpOworICAgIGdlblRleHR1cmVzKCk7CisKKyAgICBwcmludGYoIlxudmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZSwgZXh0cmFNYXRoLCB0ZXhTaXplLCBibGVuZCwgTXBwcywgREM2MFxuIik7CisKKyAgICBmb3IgKGludCB0ZXhDb3VudCA9IDA7IHRleENvdW50IDwgMzsgdGV4Q291bnQrKykgeworICAgICAgICBmb3IgKGludCBleHRyYU1hdGggPSAwOyBleHRyYU1hdGggPCA1OyBleHRyYU1hdGgrKykgeworCisgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgZmFsc2UsIHRleENvdW50LCBmYWxzZSwgZXh0cmFNYXRoLCAxLCAxKTsKKyAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgZmFsc2UsIGV4dHJhTWF0aCwgMSwgMSk7CisgICAgICAgICAgICBpZiAodGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgZmFsc2UsIHRleENvdW50LCB0cnVlLCBleHRyYU1hdGgsIDEsIDEpOworICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgdHJ1ZSwgZXh0cmFNYXRoLCAxLCAxKTsKKworICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCBmYWxzZSwgdGV4Q291bnQsIGZhbHNlLCBleHRyYU1hdGgsIDIsIDIpOworICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgZmFsc2UsIGV4dHJhTWF0aCwgMiwgMik7CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIGZhbHNlLCB0ZXhDb3VudCwgdHJ1ZSwgZXh0cmFNYXRoLCAyLCAyKTsKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgdHJ1ZSwgdGV4Q291bnQsIHRydWUsIGV4dHJhTWF0aCwgMiwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleGl0KDApOworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmNmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9nbDJfcGVyZi5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KKyNpbmNsdWRlIDx1aS9FR0xVdGlscy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworCitzdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKGNvbnN0IGNoYXIqIG9wLCBFR0xCb29sZWFuIHJldHVyblZhbCA9IEVHTF9UUlVFKSB7CisgICAgaWYgKHJldHVyblZhbCAhPSBFR0xfVFJVRSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCkgcmV0dXJuZWQgJWRcbiIsIG9wLCByZXR1cm5WYWwpOworICAgIH0KKworICAgIGZvciAoRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsgZXJyb3IgIT0gRUdMX1NVQ0NFU1M7IGVycm9yCisgICAgICAgICAgICA9IGVnbEdldEVycm9yKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGVnbEVycm9yICVzICgweCV4KVxuIiwgb3AsIEVHTFV0aWxzOjpzdHJlcnJvcihlcnJvciksCisgICAgICAgICAgICAgICAgZXJyb3IpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7CisgICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCisgICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZ2xFcnJvciAoMHgleClcbiIsIG9wLCBlcnJvcik7CisgICAgfQorfQorCitib29sIGRvVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKKworc3RhdGljIEVHTERpc3BsYXkgZHB5Oworc3RhdGljIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgRUdMQm9vbGVhbiByZXR1cm5WYWx1ZTsKKyAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07CisKKyAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJzW10gPSB7IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0xfTk9ORSB9OworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAorICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAorICAgICAgICAgICAgRUdMX05PTkUgfTsKKyAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgIEVHTGludCBtaW5vclZlcnNpb247CisgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgIEVHTGludCB3LCBoOworCisKKyAgICBjaGVja0VnbEVycm9yKCI8aW5pdD4iKTsKKyAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldERpc3BsYXkiKTsKKyAgICBpZiAoZHB5ID09IEVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgIHByaW50ZigiZWdsR2V0RGlzcGxheSByZXR1cm5lZCBFR0xfTk9fRElTUExBWS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm5WYWx1ZSA9IGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xJbml0aWFsaXplIiwgcmV0dXJuVmFsdWUpOworICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgeworICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7DQorICAgIHJldHVyblZhbHVlID0gRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyhkcHksIHNfY29uZmlnQXR0cmlicywgd2luZG93LCAmbXlDb25maWcpOworICAgIGlmIChyZXR1cm5WYWx1ZSkgeworICAgICAgICBwcmludGYoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coKSByZXR1cm5lZCAlZCIsIHJldHVyblZhbHVlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY2hlY2tFZ2xFcnJvcigiRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyIpOworCisgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBteUNvbmZpZywgd2luZG93LCBOVUxMKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIik7CisgICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgcHJpbnRmKCJnZWxDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIG15Q29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgY29udGV4dF9hdHRyaWJzKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7CisgICAgaWYgKGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm5WYWx1ZSA9IGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsTWFrZUN1cnJlbnQiLCByZXR1cm5WYWx1ZSk7CisgICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKKyAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7CisgICAgR0xpbnQgZGltID0gdyA8IGggPyB3IDogaDsKKworICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGRvVGVzdCh3LCBoKTsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsU3dhcEJ1ZmZlcnMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBwdFN3YXAoKSB7CisgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQppbmRleCBjZDRmOTZkLi43Mzk1MjMzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQpAQCAtNDksNiArNDksNyBAQAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKQEAgLTY3LDExICs2OCwyOSBAQAogCiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IG1WYWxpZFRhYmxlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIG1WYWxpZFRhYmxlcy5hZGQoInN5c3RlbSIpOworICAgICAgICBtVmFsaWRUYWJsZXMuYWRkKCJzZWN1cmUiKTsKKyAgICAgICAgbVZhbGlkVGFibGVzLmFkZCgiYmx1ZXRvb3RoX2RldmljZXMiKTsKKyAgICAgICAgbVZhbGlkVGFibGVzLmFkZCgiYm9va21hcmtzIik7CisKKyAgICAgICAgLy8gVGhlc2UgYXJlIG9sZC4KKyAgICAgICAgbVZhbGlkVGFibGVzLmFkZCgiZmF2b3JpdGVzIik7CisgICAgICAgIG1WYWxpZFRhYmxlcy5hZGQoImdzZXJ2aWNlcyIpOworICAgICAgICBtVmFsaWRUYWJsZXMuYWRkKCJvbGRfZmF2b3JpdGVzIik7CisgICAgfQorCiAgICAgcHVibGljIERhdGFiYXNlSGVscGVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBzdXBlcihjb250ZXh0LCBEQVRBQkFTRV9OQU1FLCBudWxsLCBEQVRBQkFTRV9WRVJTSU9OKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkVGFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZFRhYmxlcy5jb250YWlucyhuYW1lKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2VjdXJlVGFibGUoU1FMaXRlRGF0YWJhc2UgZGIpIHsKICAgICAgICAgZGIuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHNlY3VyZSAoIiArCiAgICAgICAgICAgICAgICAgIl9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsIiArCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvU2V0dGluZ3NQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzUHJvdmlkZXIuamF2YQppbmRleCAxMDE5ZmE4Li42YTUyOTBlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvU2V0dGluZ3NQcm92aWRlci5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc1Byb3ZpZGVyLmphdmEKQEAgLTgzLDYgKzgzLDkgQEAKICAgICAgICAgU3FsQXJndW1lbnRzKFVyaSB1cmwsIFN0cmluZyB3aGVyZSwgU3RyaW5nW10gYXJncykgewogICAgICAgICAgICAgaWYgKHVybC5nZXRQYXRoU2VnbWVudHMoKS5zaXplKCkgPT0gMSkgewogICAgICAgICAgICAgICAgIHRoaXMudGFibGUgPSB1cmwuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmICghRGF0YWJhc2VIZWxwZXIuaXNWYWxpZFRhYmxlKHRoaXMudGFibGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCByb290IHBhdGg6ICIgKyB0aGlzLnRhYmxlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGhpcy53aGVyZSA9IHdoZXJlOwogICAgICAgICAgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHVybC5nZXRQYXRoU2VnbWVudHMoKS5zaXplKCkgIT0gMikgewpAQCAtOTEsNiArOTQsOSBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiV0hFUkUgY2xhdXNlIG5vdCBzdXBwb3J0ZWQ6ICIgKyB1cmwpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlID0gdXJsLmdldFBhdGhTZWdtZW50cygpLmdldCgwKTsKKyAgICAgICAgICAgICAgICBpZiAoIURhdGFiYXNlSGVscGVyLmlzVmFsaWRUYWJsZSh0aGlzLnRhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgcm9vdCBwYXRoOiAiICsgdGhpcy50YWJsZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICgic3lzdGVtIi5lcXVhbHModGhpcy50YWJsZSkgfHwgInNlY3VyZSIuZXF1YWxzKHRoaXMudGFibGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRoaXMud2hlcmUgPSBTZXR0aW5ncy5OYW1lVmFsdWVUYWJsZS5OQU1FICsgIj0/IjsKICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmdzID0gbmV3IFN0cmluZ1tdIHsgdXJsLmdldFBhdGhTZWdtZW50cygpLmdldCgxKSB9OwpAQCAtMTA1LDYgKzExMSw5IEBACiAgICAgICAgIFNxbEFyZ3VtZW50cyhVcmkgdXJsKSB7CiAgICAgICAgICAgICBpZiAodXJsLmdldFBhdGhTZWdtZW50cygpLnNpemUoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgdGhpcy50YWJsZSA9IHVybC5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKCFEYXRhYmFzZUhlbHBlci5pc1ZhbGlkVGFibGUodGhpcy50YWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIHJvb3QgcGF0aDogIiArIHRoaXMudGFibGUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aGlzLndoZXJlID0gbnVsbDsKICAgICAgICAgICAgICAgICB0aGlzLmFyZ3MgPSBudWxsOwogICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGEyMjk2NzcuLjc1MDQ1ZDcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMSw2ICsxLDggQEAKIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnN5c3RlbXVpIgotICAgICAgICBhbmRyb2lkOnNoYXJlZFVzZXJJZD0iYW5kcm9pZC51aWQuc3lzdGVtIj4KKyAgICAgICAgYW5kcm9pZDpzaGFyZWRVc2VySWQ9ImFuZHJvaWQudWlkLnN5c3RlbSIKKyAgICAgICAgYW5kcm9pZDpwcm9jZXNzPSJzeXN0ZW0iCisgICAgICAgID4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU1RBVFVTX0JBUl9TRVJWSUNFIiAvPgogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmYxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjY0OGY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjVmYmEyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMTE3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2ZjYjk1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTFlMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzI4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDk5ZDNlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51X3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWNkMTQzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L2ludHJ1ZGVyX2FsZXJ0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvaW50cnVkZXJfYWxlcnQueG1sCmluZGV4IDI0ZWI5NjAuLmJhNGE3NzQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvaW50cnVkZXJfYWxlcnQueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvaW50cnVkZXJfYWxlcnQueG1sCkBAIC00NCw3ICs0NCw3IEBACiAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsZXJ0SWNvbiIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNWRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjVkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgogICAgICAgICAgICAgLz4KICAgICAgICAgPFRleHRWaWV3CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXIueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbAppbmRleCA1ZmU4ZTc5Li40NjY3MTQ5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXIueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhci54bWwKQEAgLTIxLDYgKzIxLDcgQEAKIDwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuU3RhdHVzQmFyVmlldwogICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczpzeXN0ZW11aT0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9jb20uYW5kcm9pZC5zeXN0ZW11aSIKICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tncm91bmQiCiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCkBAIC01OSw2ICs2MCwzMyBAQAogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCiAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxsZWZ0IgogICAgICAgICAgICAgLz4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9ucyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+CisKKyAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuS2V5QnV0dG9uVmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkAqYW5kcm9pZDpkaW1lbi9zdGF0dXNfYmFyX2hlaWdodCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFjayIKKyAgICAgICAgICAgICAgICBzeXN0ZW11aTprZXlDb2RlPSI0IgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLktleUJ1dHRvblZpZXcgYW5kcm9pZDppZD0iQCtpZC9tZW51IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAKmFuZHJvaWQ6ZGltZW4vc3RhdHVzX2Jhcl9oZWlnaHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX21lbnUiCisgICAgICAgICAgICAgICAgc3lzdGVtdWk6a2V5Q29kZT0iODIiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuS2V5QnV0dG9uVmlldyBhbmRyb2lkOmlkPSJAK2lkL2hvbWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkAqYW5kcm9pZDpkaW1lbi9zdGF0dXNfYmFyX2hlaWdodCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfaG9tZSIKKyAgICAgICAgICAgICAgICBzeXN0ZW11aTprZXlDb2RlPSIzIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAgICAgCiAgICAgPC9MaW5lYXJMYXlvdXQ+CiAgICAgICAgIAogICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC90aWNrZXIiCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3VudXNlZC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3VudXNlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhN2Q3ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvdW51c2VkLnhtbApAQCAtMCwwICsxLDQgQEAKKzxVbnVzZWQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25zIj4KKzwvVW51c2VkPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29sb3JzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxNjFjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb2xvcnMueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyZXNvdXJjZXM+CisgICAgPGRyYXdhYmxlIG5hbWU9InN0YXR1c19iYXJfYmFja2dyb3VuZCI+IzAwMDAwMDwvZHJhd2FibGU+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29uZmlnLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmNWQxOGQxMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAorICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+Cis8cmVzb3VyY2VzPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19zdGF0dXNfYmFyX3Bvc2l0aW9uIj4xPC9pbnRlZ2VyPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9hdHRycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiY2YyMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvYXR0cnMueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IktleUJ1dHRvblZpZXciPgorICAgICAgICA8YXR0ciBuYW1lPSJrZXlDb2RlIiBmb3JtYXQ9ImludGVnZXIiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggOGVhNDZlNS4uYWMwMGM2OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtMjAsNyArMjAsMTYgQEAKIDwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAogICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+CiA8cmVzb3VyY2VzPgotICAgIDwhLS0gQ29udHJvbCB3aGV0aGVyIHN0YXR1cyBiYXIgc2hvdWxkIGRpc3Rpbmd1aXNoIEhTUEEgZGF0YSBpY29uIGZvcm0gVU1UUyBkYXRhIGljb24gb24gZGV2aWNlcyAtLT4KKworICAgIDwhLS0gQ29udHJvbCB3aGV0aGVyIHN0YXR1cyBiYXIgc2hvdWxkIGRpc3Rpbmd1aXNoIEhTUEEgZGF0YSBpY29uIGZvcm0gVU1UUworICAgIGRhdGEgaWNvbiBvbiBkZXZpY2VzIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19oc3BhX2RhdGFfZGlzdGluZ3Vpc2hhYmxlIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBzdGF0dXMgYmFyLgorICAgICAgICAwIC0gdG9wCisgICAgICAgIDEgLSBib3R0b20KKyAgICAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfc3RhdHVzX2Jhcl9wb3NpdGlvbiI+MDwvaW50ZWdlcj4KKwogPC9yZXNvdXJjZXM+CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5QnV0dG9uVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9LZXlCdXR0b25WaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExYWYzNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5QnV0dG9uVmlldy5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIEtleUJ1dHRvblZpZXcgZXh0ZW5kcyBJbWFnZVZpZXcgeworICAgIElXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOworICAgIGxvbmcgbURvd25UaW1lOworICAgIGJvb2xlYW4gbVNlbmRpbmc7CisgICAgaW50IG1Db2RlOworICAgIGludCBtUmVwZWF0OworCisgICAgcHVibGljIEtleUJ1dHRvblZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorCisgICAgcHVibGljIEtleUJ1dHRvblZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBSLnN0eWxlYWJsZS5LZXlCdXR0b25WaWV3LAorICAgICAgICAgICAgICAgIGRlZlN0eWxlLCAwKTsKKworICAgICAgICBtQ29kZSA9IGEuZ2V0SW50ZWdlcihSLnN0eWxlYWJsZS5LZXlCdXR0b25WaWV3X2tleUNvZGUsIDApOworICAgICAgICBpZiAobUNvZGUgPT0gMCkgeworICAgICAgICAgICAgU2xvZy53KFN0YXR1c0JhclNlcnZpY2UuVEFHLCAiS2V5QnV0dG9uVmlldyB3aXRob3V0IGtleSBjb2RlIGlkPTB4IgorICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoZ2V0SWQoKSkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICBtV2luZG93TWFuYWdlciA9IElXaW5kb3dNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaW50IHgsIHk7CisKKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CisgICAgICAgICAgICAgICAgbURvd25UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbVJlcGVhdCA9IDA7CisgICAgICAgICAgICAgICAgbVNlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHNlbmRFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgbURvd25UaW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6CisgICAgICAgICAgICAgICAgaWYgKG1TZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSAoaW50KWV2LmdldFgoKTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IChpbnQpZXYuZ2V0WSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+PSBnZXRXaWR0aCgpIHx8IHkgPCAwIHx8IHkgPj0gZ2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoS2V5RXZlbnQuQUNUSU9OX1VQKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgorICAgICAgICAgICAgICAgIGlmIChtU2VuZGluZykgeworICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoS2V5RXZlbnQuQUNUSU9OX1VQKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRFdmVudChpbnQgYWN0aW9uKSB7CisgICAgICAgIHNlbmRFdmVudChhY3Rpb24sIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpKTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRFdmVudChpbnQgYWN0aW9uLCBsb25nIHdoZW4pIHsKKyAgICAgICAgZmluYWwgS2V5RXZlbnQgZXYgPSBuZXcgS2V5RXZlbnQobURvd25UaW1lLCBtRG93blRpbWUsIGFjdGlvbiwgbUNvZGUsIG1SZXBlYXQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2xvZy5kKFN0YXR1c0JhclNlcnZpY2UuVEFHLCAiaW5qZWN0aW5nIGV2ZW50ICIgKyBldik7CisgICAgICAgICAgICBtV2luZG93TWFuYWdlci5pbmplY3RLZXlFdmVudChldiwgZmFsc2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbSBwcm9jZXNzIGlzIGRlYWQKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCmluZGV4IDhmZTJiNWNlNS4uMGQwMjQ0NyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJTZXJ2aWNlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJTZXJ2aWNlLmphdmEKQEAgLTk3LDYgKzk3LDkgQEAKICAgICAvLyB3aWxsIGxpa2VseSBtb3ZlIHRvIGEgcmVzb3VyY2Ugb3Igb3RoZXIgdHVuYWJsZSBwYXJhbSBhdCBzb21lIHBvaW50CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVFJVREVSX0FMRVJUX0RFQ0FZX01TID0gMTAwMDA7CiAKKyAgICBzdGF0aWMgZmluYWwgaW50IFBPU0lUSU9OX1RPUCA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBQT1NJVElPTl9CT1RUT00gPSAxOworCiAgICAgU3RhdHVzQmFyUG9saWN5IG1JY29uUG9saWN5OwogCiAgICAgQ29tbWFuZFF1ZXVlIG1Db21tYW5kUXVldWU7CkBAIC0xMDQsNiArMTA3LDggQEAKIAogICAgIGludCBtSWNvblNpemU7CiAgICAgRGlzcGxheSBtRGlzcGxheTsKKyAgICBpbnQgbVBvc2l0aW9uOworCiAgICAgU3RhdHVzQmFyVmlldyBtU3RhdHVzQmFyVmlldzsKICAgICBpbnQgbVBpeGVsRm9ybWF0OwogICAgIEggbUhhbmRsZXIgPSBuZXcgSCgpOwpAQCAtMTkzLDEwICsxOTgsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CiAgICAgICAgIC8vIEZpcnN0IHNldCB1cCBvdXIgdmlld3MgYW5kIHN0dWZmLgorICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIG1Qb3NpdGlvbiA9IHJlcy5nZXRJbnRlZ2VyKFIuaW50ZWdlci5jb25maWdfc3RhdHVzX2Jhcl9wb3NpdGlvbik7CiAgICAgICAgIG1EaXNwbGF5ID0gKChXaW5kb3dNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpLmdldERlZmF1bHREaXNwbGF5KCk7CiAgICAgICAgIG1ha2VTdGF0dXNCYXJWaWV3KHRoaXMpOwogCkBAIC0zNDksNyArMzU1LDExIEBACiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UT1VDSEFCTEVfV0hFTl9XQUtJTkcsCiAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuUkdCWF84ODg4KTsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGlmIChtUG9zaXRpb24gPT0gUE9TSVRJT05fVE9QKSB7CisgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICB9CiAgICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXIiKTsKICAgICAgICAgLy8gVE9ETyBscC53aW5kb3dBbmltYXRpb25zID0gUi5zdHlsZS5BbmltYXRpb25fU3RhdHVzQmFyOwogCkBAIC0zNjUsNyArMzc1LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAogICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGlmIChtUG9zaXRpb24gPT0gUE9TSVRJT05fVE9QKSB7CisgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICB9CiAgICAgICAgIGxwLnkgKz0gaGVpZ2h0ICogMS41OyAvLyBGSVhNRQogICAgICAgICBscC5zZXRUaXRsZSgiSW50cnVkZXJBbGVydCIpOwogICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fU3RhdHVzQmFyX0ludHJ1ZGVyQWxlcnQ7CkBAIC00OTAsNyArNTA0LDcgQEAKICAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAogICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKS5lcXVhbHMoY29udGVudFZpZXcuZ2V0UGFja2FnZSgpKQogICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldExheW91dElkKCkgPT0gY29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSkgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgInJldXNpbmcgbm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJldXNpbmcgbm90aWZpY2F0aW9uIik7CiAgICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIC8vIFJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzCkBAIC01MTcsNyArNTMxLDcgQEAKICAgICAgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAibm90IHJldXNpbmcgbm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIm5vdCByZXVzaW5nIG5vdGlmaWNhdGlvbiIpOwogICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKICAgICAgICAgfQpAQCAtNTMxLDcgKzU0NSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5KSB7Ci0gICAgICAgIFNsb2cuZChUQUcsICJyZW1vdmVOb3RpZmljYXRpb24ga2V5PSIgKyBrZXkpOworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSk7CiAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGQgPSByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOwogCiAgICAgICAgIGlmIChvbGQgIT0gbnVsbCkgewpAQCAtNTg0LDcgKzU5OCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGV4cGFuZGVkID09IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyBpZGVudCA9IG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKTsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJjb3VsZG4ndCBpbmZsYXRlIHZpZXcgZm9yIG5vdGlmaWNhdGlvbiAiICsgaWRlbnQpOworICAgICAgICAgICAgU2xvZy5lKFRBRywgImNvdWxkbid0IGluZmxhdGUgdmlldyBmb3Igbm90aWZpY2F0aW9uICIgKyBpZGVudCwgZXhjZXB0aW9uKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29udGVudC5hZGRWaWV3KGV4cGFuZGVkKTsKQEAgLTE0NDcsNyArMTQ2MSw3IEBACiAgICAgICAgICAgICAvLyB0aGUgdXNlcidzIHBlcmNlcHRpb24gb2Ygd2hhdCdzIHNob3dpbmcsIGNhbGwgdG8gc2F5IHRoYXQgdGhlIHZpc2liaWxpdHkKICAgICAgICAgICAgIC8vIGhhcyBjaGFuZ2VkLiAoT3RoZXJ3aXNlLCBzb21lb25lIGVsc2Ugd2lsbCBjYWxsIHRvIGRvIHRoYXQpLgogICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gIT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIHZpc2liaWxpdHlDaGFuZ2VkKCIgKyB2aXNpYmxlICsgIikiKTsKKyAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyB2aXNpYmlsaXR5Q2hhbmdlZCgiICsgdmlzaWJsZSArICIpIik7CiAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQodmlzaWJsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJWaWV3LmphdmEKaW5kZXggMWUxNDBiOS4uNTc0NTJhZiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJWaWV3LmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CkBAIC00MCwxMiArNDEsMTYgQEAKICAgICBWaWV3R3JvdXAgbU5vdGlmaWNhdGlvbkljb25zOwogICAgIFZpZXdHcm91cCBtU3RhdHVzSWNvbnM7CiAgICAgVmlldyBtRGF0ZTsKKyAgICBWaWV3IG1CdXR0b25BcmVhOwogICAgIEZpeGVkU2l6ZURyYXdhYmxlIG1CYWNrZ3JvdW5kOwogICAgIAogICAgIGJvb2xlYW4gbU5pZ2h0TW9kZSA9IGZhbHNlOwogICAgIGludCBtU3RhcnRBbHBoYSA9IDAsIG1FbmRBbHBoYSA9IDA7CiAgICAgbG9uZyBtRW5kVGltZSA9IDA7CiAKKyAgICBSZWN0IG1CdXR0b25Cb3VuZHMgPSBuZXcgUmVjdCgpOworICAgIGJvb2xlYW4gbUNhcHR1cmluZ0V2ZW50cyA9IHRydWU7CisKICAgICBwdWJsaWMgU3RhdHVzQmFyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CiAgICAgfQpAQCAtNjAsNiArNjUsOCBAQAogICAgICAgICBtQmFja2dyb3VuZCA9IG5ldyBGaXhlZFNpemVEcmF3YWJsZShtRGF0ZS5nZXRCYWNrZ3JvdW5kKCkpOwogICAgICAgICBtQmFja2dyb3VuZC5zZXRGaXhlZEJvdW5kcygwLCAwLCAwLCAwKTsKICAgICAgICAgbURhdGUuc2V0QmFja2dyb3VuZERyYXdhYmxlKG1CYWNrZ3JvdW5kKTsKKworICAgICAgICBtQnV0dG9uQXJlYSA9IGZpbmRWaWV3QnlJZChSLmlkLmJ1dHRvbnMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTI1LDYgKzEzMiwxMCBAQAogCiAgICAgICAgIG1EYXRlLmxheW91dChtRGF0ZS5nZXRMZWZ0KCksIG1EYXRlLmdldFRvcCgpLCBuZXdEYXRlUmlnaHQsIG1EYXRlLmdldEJvdHRvbSgpKTsKICAgICAgICAgbUJhY2tncm91bmQuc2V0Rml4ZWRCb3VuZHMoLW1EYXRlLmdldExlZnQoKSwgLW1EYXRlLmdldFRvcCgpLCAoci1sKSwgKGItdCkpOworCisgICAgICAgIGlmIChtQnV0dG9uQXJlYSAhPSBudWxsKSB7CisgICAgICAgICAgICBtQnV0dG9uQXJlYS5nZXRIaXRSZWN0KG1CdXR0b25Cb3VuZHMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNzcsNiArMTg4LDkgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKCFtQ2FwdHVyaW5nRXZlbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpICE9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CiAgICAgICAgICAgICBtU2VydmljZS5pbnRlcmNlcHRUb3VjaEV2ZW50KGV2ZW50KTsKICAgICAgICAgfQpAQCAtMTg1LDYgKzE5OSwxMyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25JbnRlcmNlcHRUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgaWYgKG1CdXR0b25Cb3VuZHMuY29udGFpbnMoKGludClldmVudC5nZXRYKCksIChpbnQpZXZlbnQuZ2V0WSgpKSkgeworICAgICAgICAgICAgICAgIG1DYXB0dXJpbmdFdmVudHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNhcHR1cmluZ0V2ZW50cyA9IHRydWU7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5pbnRlcmNlcHRUb3VjaEV2ZW50KGV2ZW50KQogICAgICAgICAgICAgICAgID8gdHJ1ZSA6IHN1cGVyLm9uSW50ZXJjZXB0VG91Y2hFdmVudChldmVudCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3VzYi9TdG9yYWdlTm90aWZpY2F0aW9uLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvdXNiL1N0b3JhZ2VOb3RpZmljYXRpb24uamF2YQppbmRleCBmOGFiYzVhLi5iOWU5MTVhNCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3VzYi9TdG9yYWdlTm90aWZpY2F0aW9uLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3VzYi9TdG9yYWdlTm90aWZpY2F0aW9uLmphdmEKQEAgLTI0NCwyNyArMjQ0LDEyIEBACiAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3MobUNvbnRleHQsIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnVzYi5Vc2JTdG9yYWdlQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKIAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhZGJPbiA9IDEgPT0gU2V0dGluZ3MuU2VjdXJlLmdldEludCgKLSAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQURCX0VOQUJMRUQsCi0gICAgICAgICAgICAgICAgMCk7Ci0KICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGkgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KG1Db250ZXh0LCAwLCBpbnRlbnQsIDApOwogICAgICAgICAgICAgc2V0VXNiU3RvcmFnZU5vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcudXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy51c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c19kYXRhX3VzYiwKICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUsIHBpKTsKLQotICAgICAgICAgICAgaWYgKFBPUF9VTVNfQUNUSVZJVFlfT05fQ09OTkVDVCAmJiAhYWRiT24pIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhhdCBkZXZlbG9wZXJzIGRvbid0IHdhbnQgdG8gZW5hYmxlIFVNUyBldmVyeQotICAgICAgICAgICAgICAgIC8vIHRpbWUgdGhleSBhdHRhY2ggYSBkZXZpY2UgdG8gYSBVU0IgaG9zdC4gVGhlIGF2ZXJhZ2UgdXNlciwKLSAgICAgICAgICAgICAgICAvLyBob3dldmVyLCBpcyBsb29raW5nIHRvIGNoYXJnZSB0aGUgcGhvbmUgKGluIHdoaWNoIGNhc2UgdGhpcwotICAgICAgICAgICAgICAgIC8vIGlzIGhhcm1sZXNzKSBvciB0cmFuc2ZlciBmaWxlcyAoaW4gd2hpY2ggY2FzZSB0aGlzIGNvYWNoZXMKLSAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBhYm91dCBob3cgdG8gY29tcGxldGUgdGhhdCB0YXNrIGFuZCBzYXZlcyBzZXZlcmFsCi0gICAgICAgICAgICAgICAgLy8gc3RlcHMpLgotICAgICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNldFVzYlN0b3JhZ2VOb3RpZmljYXRpb24oMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBudWxsKTsKICAgICAgICAgfQpAQCAtMzEzLDYgKzI5OCwyMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtVXNiU3RvcmFnZU5vdGlmaWNhdGlvbi5zZXRMYXRlc3RFdmVudEluZm8obUNvbnRleHQsIHRpdGxlLCBtZXNzYWdlLCBwaSk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFkYk9uID0gMSA9PSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BREJfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICAwKTsKKworICAgICAgICAgICAgaWYgKFBPUF9VTVNfQUNUSVZJVFlfT05fQ09OTkVDVCAmJiAhYWRiT24pIHsKKyAgICAgICAgICAgICAgICAvLyBQb3AgdXAgYSBmdWxsLXNjcmVlbiBhbGVydCB0byBjb2FjaCB0aGUgdXNlciB0aHJvdWdoIGVuYWJsaW5nIFVNUy4gVGhlIGF2ZXJhZ2UKKyAgICAgICAgICAgICAgICAvLyB1c2VyIGhhcyBhdHRhY2hlZCB0aGUgZGV2aWNlIHRvIFVTQiBlaXRoZXIgdG8gY2hhcmdlIHRoZSBwaG9uZSAoaW4gd2hpY2ggY2FzZQorICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgaGFybWxlc3MpIG9yIHRyYW5zZmVyIGZpbGVzLCBhbmQgaW4gdGhlIGxhdHRlciBjYXNlIHRoaXMgYWxlcnQgc2F2ZXMKKyAgICAgICAgICAgICAgICAvLyBzZXZlcmFsIHN0ZXBzIChhcyB3ZWxsIGFzIHN1YnRseSBpbmRpY2F0ZXMgdGhhdCB5b3Ugc2hvdWxkbid0IG1peCBVTVMgd2l0aCBvdGhlcgorICAgICAgICAgICAgICAgIC8vIGFjdGl2aXRpZXMgb24gdGhlIGRldmljZSkuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBJZiBBREIgaXMgZW5hYmxlZCwgaG93ZXZlciwgd2Ugc3VwcHJlc3MgdGhpcyBkaWFsb2cgKHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgYQorICAgICAgICAgICAgICAgIC8vIGRldmVsb3BlciAoYSkga25vd3MgaG93IHRvIGVuYWJsZSBVTVMsIGFuZCAoYikgaXMgcHJvYmFibHkgdXNpbmcgVVNCIHRvIGluc3RhbGwKKyAgICAgICAgICAgICAgICAvLyBidWlsZHMgb3IgdXNlIGFkYiBjb21tYW5kcy4KKyAgICAgICAgICAgICAgICBtVXNiU3RvcmFnZU5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50ID0gcGk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAKICAgICAgICAgZmluYWwgaW50IG5vdGlmaWNhdGlvbklkID0gbVVzYlN0b3JhZ2VOb3RpZmljYXRpb24uaWNvbjsKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQppbmRleCA1YzU2ZDNjLi44MzIxNDczIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkNvbnRleHRNZW51QnVpbGRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVEaWFsb2dIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVZpZXc7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJWaWV3OwpAQCAtNzcsOSArNzgsMTIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKIC8qKgogICogQW5kcm9pZC1zcGVjaWZpYyBXaW5kb3cuCiAgKiA8cD4KQEAgLTk2LDcgKzEwMCw3IEBACiAgICAgICogU2ltcGxlIGNhbGxiYWNrIHVzZWQgYnkgdGhlIGNvbnRleHQgbWVudSBhbmQgaXRzIHN1Ym1lbnVzLiBUaGUgb3B0aW9ucwogICAgICAqIG1lbnUgc3VibWVudXMgZG8gbm90IHVzZSB0aGlzICh0aGVpciBiZWhhdmlvciBpcyBtb3JlIGNvbXBsZXgpLgogICAgICAqLwotICAgIENvbnRleHRNZW51Q2FsbGJhY2sgbUNvbnRleHRNZW51Q2FsbGJhY2sgPSBuZXcgQ29udGV4dE1lbnVDYWxsYmFjayhGRUFUVVJFX0NPTlRFWFRfTUVOVSk7CisgICAgRGlhbG9nTWVudUNhbGxiYWNrIG1Db250ZXh0TWVudUNhbGxiYWNrID0gbmV3IERpYWxvZ01lbnVDYWxsYmFjayhGRUFUVVJFX0NPTlRFWFRfTUVOVSk7CiAKICAgICAvLyBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgdmlldyBvZiB0aGUgd2luZG93LCBjb250YWluaW5nIHRoZSB3aW5kb3cgZGVjb3IuCiAgICAgcHJpdmF0ZSBEZWNvclZpZXcgbURlY29yOwpAQCAtMTA1LDcgKzEwOSw3IEBACiAgICAgLy8gbURlY29yIGl0c2VsZiwgb3IgYSBjaGlsZCBvZiBtRGVjb3Igd2hlcmUgdGhlIGNvbnRlbnRzIGdvLgogICAgIHByaXZhdGUgVmlld0dyb3VwIG1Db250ZW50UGFyZW50OwogCi0gICAgU3VyZmFjZUhvbGRlci5DYWxsYmFjayBtVGFrZVN1cmZhY2VDYWxsYmFjazsKKyAgICBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiBtVGFrZVN1cmZhY2VDYWxsYmFjazsKICAgICBCYXNlU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlcjsKICAgICAKICAgICBJbnB1dFF1ZXVlLkNhbGxiYWNrIG1UYWtlSW5wdXRRdWV1ZUNhbGxiYWNrOwpAQCAtMjUxLDcgKzI1NSw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGFrZVN1cmZhY2UoU3VyZmFjZUhvbGRlci5DYWxsYmFjayBjYWxsYmFjaykgeworICAgIHB1YmxpYyB2b2lkIHRha2VTdXJmYWNlKFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syIGNhbGxiYWNrKSB7CiAgICAgICAgIG1UYWtlU3VyZmFjZUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgfQogICAgIApAQCAtODA4LDggKzgxMiwyMCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnaXZlIHVzIGEgdmFsaWQgd2luZG93IHRva2VuCi0gICAgICAgIG5ldyBNZW51RGlhbG9nSGVscGVyKHN1Yk1lbnUpLnNob3cobnVsbCk7CisgICAgICAgIGZpbmFsIE1lbnUgcGFyZW50TWVudSA9IHN1Yk1lbnUuZ2V0Um9vdE1lbnUoKTsKKyAgICAgICAgZmluYWwgUGFuZWxGZWF0dXJlU3RhdGUgcGFuZWwgPSBmaW5kTWVudVBhbmVsKHBhcmVudE1lbnUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSB0aGUgcGFuZWwgb3BlbiBzdGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGNvbWluZyBmcm9tIGFuIG9wZW4gcGFuZWwKKyAgICAgICAgICogb3IgYW4gYWN0aW9uIGJ1dHRvbi4gSWYgaXQncyBhbiBvcGVuIHBhbmVsIHdlIHdhbnQgdG8gdXNlIE1lbnVEaWFsb2dIZWxwZXIuCisgICAgICAgICAqIElmIGl0J3MgY2xvc2VkIHdlIHdhbnQgdG8gZ3JhYiB0aGUgcmVsZXZhbnQgdmlldyBhbmQgY3JlYXRlIGEgcG9wdXAgYW5jaG9yZWQgdG8gaXQuCisgICAgICAgICAqLworICAgICAgICBpZiAocGFuZWwuaXNPcGVuKSB7CisgICAgICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnaXZlIHVzIGEgdmFsaWQgd2luZG93IHRva2VuCisgICAgICAgICAgICBuZXcgTWVudURpYWxvZ0hlbHBlcihzdWJNZW51KS5zaG93KG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihnZXRDb250ZXh0KCksIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTIwNjksNyArMjA4NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgd2lsbFlvdVRha2VUaGVTdXJmYWNlKCkgeworICAgICAgICBwdWJsaWMgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syIHdpbGxZb3VUYWtlVGhlU3VyZmFjZSgpIHsKICAgICAgICAgICAgIHJldHVybiBtRmVhdHVyZUlkIDwgMCA/IG1UYWtlU3VyZmFjZUNhbGxiYWNrIDogbnVsbDsKICAgICAgICAgfQogICAgICAgICAKQEAgLTI3OTcsMTEgKzI4MTMsMTEgQEAKICAgICAgKiA8bGk+IENhbGxzIGJhY2sgdG8gdGhlIGNhbGxiYWNrJ3Mgb25NZW51SXRlbVNlbGVjdGVkIHdoZW4gYW4gaXRlbSBpcwogICAgICAqIHNlbGVjdGVkLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29udGV4dE1lbnVDYWxsYmFjayBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIERpYWxvZ01lbnVDYWxsYmFjayBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkNhbGxiYWNrIHsKICAgICAgICAgcHJpdmF0ZSBpbnQgbUZlYXR1cmVJZDsKICAgICAgICAgcHJpdmF0ZSBNZW51RGlhbG9nSGVscGVyIG1TdWJNZW51SGVscGVyOwogCi0gICAgICAgIHB1YmxpYyBDb250ZXh0TWVudUNhbGxiYWNrKGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgcHVibGljIERpYWxvZ01lbnVDYWxsYmFjayhpbnQgZmVhdHVyZUlkKSB7CiAgICAgICAgICAgICBtRmVhdHVyZUlkID0gZmVhdHVyZUlkOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCmluZGV4IGEwMWUyNWIuLjc2N2YzOGQgMTAwNzU1Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQpAQCAtNjAsNyArNjAsNiBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd09yaWVudGF0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlJhd0lucHV0RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwpAQCAtMTUzLDggKzE1Miw2IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTl9NRURJQV9PVkVSTEFZX1NVQkxBWUVSID0gLTE7CiAgICAgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTl9QQU5FTF9TVUJMQVlFUiA9IDE7CiAgICAgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTl9TVUJfUEFORUxfU1VCTEFZRVIgPSAyOwotCi0gICAgc3RhdGljIGZpbmFsIGZsb2F0IFNMSURFX1RPVUNIX0VWRU5UX1NJWkVfTElNSVQgPSAwLjZmOwogICAgIAogICAgIC8vIERlYnVnZ2luZzogc2V0IHRoaXMgdG8gaGF2ZSB0aGUgc3lzdGVtIGFjdCBsaWtlIHRoZXJlIGlzIG5vIGhhcmQga2V5Ym9hcmQuCiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gS0VZQk9BUkRfQUxXQVlTX0hJRERFTiA9IGZhbHNlOwpAQCAtMTY0LDYgKzE2MSwxMCBAQAogICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFNZU1RFTV9ESUFMT0dfUkVBU09OX1JFQ0VOVF9BUFBTID0gInJlY2VudGFwcHMiOwogICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFNZU1RFTV9ESUFMT0dfUkVBU09OX0hPTUVfS0VZID0gImhvbWVrZXkiOwogCisgICAgLy8gVXNlZnVsIHNjYW4gY29kZXMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNXX0xJRCA9IDB4MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJUTl9NT1VTRSA9IDB4MTEwOworICAgIAogICAgIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICAKICAgICBDb250ZXh0IG1Db250ZXh0OwpAQCAtNjkwLDcgKzY5MSw3IEBACiAgICAgCiAgICAgdm9pZCByZWFkTGlkU3RhdGUoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgc3cgPSBtV2luZG93TWFuYWdlci5nZXRTd2l0Y2hTdGF0ZShSYXdJbnB1dEV2ZW50LlNXX0xJRCk7CisgICAgICAgICAgICBpbnQgc3cgPSBtV2luZG93TWFuYWdlci5nZXRTd2l0Y2hTdGF0ZShTV19MSUQpOwogICAgICAgICAgICAgaWYgKHN3ID49IDApIHsKICAgICAgICAgICAgICAgICBtTGlkT3BlbiA9IHN3ID09IDA7CiAgICAgICAgICAgICB9CkBAIC03MjcsMTkgKzcyOCw2IEBACiAgICAgICAgICAgICAgICAgOiBDb25maWd1cmF0aW9uLktFWUJPQVJESElEREVOX1lFUzsKICAgICB9CiAgICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVla1ByZXNzZWRBZ2FpbnN0U2NyZWVuKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIGlmKGV2LmdldFNpemUoKSA+IFNMSURFX1RPVUNIX0VWRU5UX1NJWkVfTElNSVQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBzaXplID0gZXYuZ2V0SGlzdG9yeVNpemUoKTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgaWYoZXYuZ2V0SGlzdG9yaWNhbFNpemUoaSkgPiBTTElERV9UT1VDSF9FVkVOVF9TSVpFX0xJTUlUKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaGVkUG9pbnRlckV2ZW50THcoTW90aW9uRXZlbnQgZXYsIGludCB0YXJnZXRYLCBpbnQgdGFyZ2V0WSkgewogICAgICAgICBpZiAobVBvaW50ZXJMb2NhdGlvblZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTAzNCwxOSArMTAyMiwyMiBAQAogICAgICAgICB9OwogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcmNlcHRLZXlUaShXaW5kb3dTdGF0ZSB3aW4sIGludCBjb2RlLCBpbnQgbWV0YUtleXMsIGJvb2xlYW4gZG93biwgCi0gICAgICAgICAgICBpbnQgcmVwZWF0Q291bnQsIGludCBmbGFncykgewotICAgICAgICBib29sZWFuIGtleWd1YXJkT24gPSBrZXlndWFyZE9uKCk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaW50ZXJjZXB0S2V5QmVmb3JlRGlzcGF0Y2hpbmcoV2luZG93U3RhdGUgd2luLCBpbnQgYWN0aW9uLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBpbnQga2V5Q29kZSwgaW50IG1ldGFTdGF0ZSwgaW50IHJlcGVhdENvdW50LCBpbnQgcG9saWN5RmxhZ3MpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBrZXlndWFyZE9uID0ga2V5Z3VhcmRPbigpOworICAgICAgICBmaW5hbCBib29sZWFuIGRvd24gPSAoYWN0aW9uID09IEtleUV2ZW50LkFDVElPTl9ET1dOKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBjYW5jZWxlZCA9ICgoZmxhZ3MgJiBLZXlFdmVudC5GTEFHX0NBTkNFTEVEKSAhPSAwKTsKIAogICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImludGVyY2VwdEtleVRpIGNvZGU9IiArIGNvZGUgKyAiIGRvd249IiArIGRvd24gKyAiIHJlcGVhdENvdW50PSIKKyAgICAgICAgICAgIExvZy5kKFRBRywgImludGVyY2VwdEtleVRpIGtleUNvZGU9IiArIGtleUNvZGUgKyAiIGRvd249IiArIGRvd24gKyAiIHJlcGVhdENvdW50PSIKICAgICAgICAgICAgICAgICAgICAgKyByZXBlYXRDb3VudCArICIga2V5Z3VhcmRPbj0iICsga2V5Z3VhcmRPbiArICIgbUhvbWVQcmVzc2VkPSIgKyBtSG9tZVByZXNzZWQpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gQ2xlYXIgYSBwZW5kaW5nIEhPTUUgbG9uZ3ByZXNzIGlmIHRoZSB1c2VyIHJlbGVhc2VzIEhvbWUKICAgICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBwcm9iYWJseSBiZSBpbnNpZGUgdGhlIG5leHQgYml0IG9mIGxvZ2ljLCBidXQgdGhhdCBjb2RlCiAgICAgICAgIC8vIHR1cm5lZCBvdXQgdG8gYmUgYSBiaXQgZnJhZ2lsZSBzbyBJJ20gZG9pbmcgaXQgaGVyZSBleHBsaWNpdGx5LCBmb3Igbm93LgotICAgICAgICBpZiAoKGNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9IT01FKSAmJiAhZG93bikgeworICAgICAgICBpZiAoKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9IT01FKSAmJiAhZG93bikgewogICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1Ib21lTG9uZ1ByZXNzKTsKICAgICAgICAgfQogCkBAIC0xMDU2LDExICsxMDQ3LDExIEBACiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcmVsZWFzZWQgdGhlIGhvbWUga2V5LCBhbmQgZGlkbid0IGRvIGFueXRoaW5nIGVsc2UKICAgICAgICAgICAgIC8vIHdoaWxlIGl0IHdhcyBwcmVzc2VkLCB0aGVuIGl0IGlzIHRpbWUgdG8gZ28gaG9tZSEKLSAgICAgICAgICAgIGlmIChjb2RlID09IEtleUV2ZW50LktFWUNPREVfSE9NRSkgeworICAgICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9IT01FKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFkb3duKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Ib21lUHJlc3NlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyZLZXlFdmVudC5GTEFHX0NBTkNFTEVEKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghIGNhbmNlbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBpbmNvbWluZyBjYWxsIGlzIHJpbmdpbmcsIEhPTUUgaXMgdG90YWxseSBkaXNhYmxlZC4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChUaGUgdXNlciBpcyBhbHJlYWR5IG9uIHRoZSBJbkNhbGxTY3JlZW4gYXQgdGhpcyBwb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBoaXMgT05MWSBvcHRpb25zIGFyZSB0byBhbnN3ZXIgb3IgcmVqZWN0IHRoZSBjYWxsLikKQEAgLTEwOTQsNyArMTA4NSw3IEBACiAgICAgICAgIC8vIGNhbiBuZXZlciBicmVhayBpdCwgYWx0aG91Z2ggaWYga2V5Z3VhcmQgaXMgb24sIHdlIGRvIGxldAogICAgICAgICAvLyBpdCBoYW5kbGUgaXQsIGJlY2F1c2UgdGhhdCBnaXZlcyB1cyB0aGUgY29ycmVjdCA1IHNlY29uZAogICAgICAgICAvLyB0aW1lb3V0LgotICAgICAgICBpZiAoY29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0hPTUUpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9IT01FKSB7CiAKICAgICAgICAgICAgIC8vIElmIGEgc3lzdGVtIHdpbmRvdyBoYXMgZm9jdXMsIHRoZW4gaXQgZG9lc24ndCBtYWtlIHNlbnNlCiAgICAgICAgICAgICAvLyByaWdodCBub3cgdG8gaW50ZXJhY3Qgd2l0aCBhcHBsaWNhdGlvbnMuCkBAIC0xMTIyLDE3ICsxMTEzLDE3IEBACiAgICAgICAgICAgICAgICAgbUhvbWVQcmVzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9NRU5VKSB7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX01FTlUpIHsKICAgICAgICAgICAgIC8vIEhpamFjayBtb2RpZmllZCBtZW51IGtleXMgZm9yIGRlYnVnZ2luZyBmZWF0dXJlcwogICAgICAgICAgICAgZmluYWwgaW50IGNob3JkQnVnID0gS2V5RXZlbnQuTUVUQV9TSElGVF9PTjsKIAogICAgICAgICAgICAgaWYgKGRvd24gJiYgcmVwZWF0Q291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlU2hpZnRNZW51QnVnUmVwb3J0cyAmJiAobWV0YUtleXMgJiBjaG9yZEJ1ZykgPT0gY2hvcmRCdWcpIHsKKyAgICAgICAgICAgICAgICBpZiAobUVuYWJsZVNoaWZ0TWVudUJ1Z1JlcG9ydHMgJiYgKG1ldGFTdGF0ZSAmIGNob3JkQnVnKSA9PSBjaG9yZEJ1ZykgewogICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX0JVR19SRVBPUlQpOwogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kT3JkZXJlZEJyb2FkY2FzdChpbnRlbnQsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNIT1dfUFJPQ0VTU0VTX09OX0FMVF9NRU5VICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAobWV0YUtleXMgJiBLZXlFdmVudC5NRVRBX0FMVF9PTikgPT0gS2V5RXZlbnQuTUVUQV9BTFRfT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIChtZXRhU3RhdGUgJiBLZXlFdmVudC5NRVRBX0FMVF9PTikgPT0gS2V5RXZlbnQuTUVUQV9BTFRfT04pIHsKICAgICAgICAgICAgICAgICAgICAgSW50ZW50IHNlcnZpY2UgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0Q2xhc3NOYW1lKG1Db250ZXh0LCAiY29tLmFuZHJvaWQuc2VydmVyLkxvYWRBdmVyYWdlU2VydmljZSIpOwogICAgICAgICAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgcmVzID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CkBAIC0xMTQ4LDcgKzExMzksNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NFQVJDSCkgeworICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9TRUFSQ0gpIHsKICAgICAgICAgICAgIGlmIChkb3duKSB7CiAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdENvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgbVNlYXJjaEtleVByZXNzZWQgPSB0cnVlOwpAQCAtMTE2Nyw3ICsxMTU4LDcgQEAKICAgICAgICAgLy8gU2hvcnRjdXRzIGFyZSBpbnZva2VkIHRocm91Z2ggU2VhcmNoK2tleSwgc28gaW50ZXJjZXB0IHRob3NlIGhlcmUKICAgICAgICAgaWYgKG1TZWFyY2hLZXlQcmVzc2VkKSB7CiAgICAgICAgICAgICBpZiAoZG93biAmJiByZXBlYXRDb3VudCA9PSAwICYmICFrZXlndWFyZE9uKSB7Ci0gICAgICAgICAgICAgICAgSW50ZW50IHNob3J0Y3V0SW50ZW50ID0gbVNob3J0Y3V0TWFuYWdlci5nZXRJbnRlbnQoY29kZSwgbWV0YUtleXMpOworICAgICAgICAgICAgICAgIEludGVudCBzaG9ydGN1dEludGVudCA9IG1TaG9ydGN1dE1hbmFnZXIuZ2V0SW50ZW50KGtleUNvZGUsIG1ldGFTdGF0ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHNob3J0Y3V0SW50ZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXRJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KHNob3J0Y3V0SW50ZW50KTsKQEAgLTEyNTQsMTAgKzEyNDUsMTcgQEAKICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLmlzVmlzaWJsZUx3KCkpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3RhdHVzIGJhciBpcyBoaWRkZW4sIHdlIGRvbid0IHdhbnQgdG8gY2F1c2UKICAgICAgICAgICAgICAgICAvLyB3aW5kb3dzIGJlaGluZCBpdCB0byBzY3JvbGwuCi0gICAgICAgICAgICAgICAgbURvY2tUb3AgPSBtQ29udGVudFRvcCA9IG1DdXJUb3AgPSBtU3RhdHVzQmFyLmdldEZyYW1lTHcoKS5ib3R0b207Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX0xBWU9VVCkgTG9nLnYoVEFHLCAiU3RhdHVzIGJhcjogbURvY2tCb3R0b209IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtRG9ja0JvdHRvbSArICIgbUNvbnRlbnRCb3R0b209IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ29udGVudEJvdHRvbSArICIgbUN1ckJvdHRvbT0iICsgbUN1ckJvdHRvbSk7CisgICAgICAgICAgICAgICAgZmluYWwgUmVjdCByID0gbVN0YXR1c0Jhci5nZXRGcmFtZUx3KCk7CisgICAgICAgICAgICAgICAgaWYgKG1Eb2NrVG9wID09IHIudG9wKSBtRG9ja1RvcCA9IHIuYm90dG9tOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1Eb2NrQm90dG9tID09IHIuYm90dG9tKSBtRG9ja0JvdHRvbSA9IHIudG9wOworICAgICAgICAgICAgICAgIG1Db250ZW50VG9wID0gbUN1clRvcCA9IG1Eb2NrVG9wOworICAgICAgICAgICAgICAgIG1Db250ZW50Qm90dG9tID0gbUN1ckJvdHRvbSA9IG1Eb2NrQm90dG9tOworICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIlN0YXR1cyBiYXI6IG1Eb2NrVG9wPSIgKyBtRG9ja1RvcAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1Db250ZW50VG9wPSIgKyBtQ29udGVudFRvcAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1DdXJUb3A9IiArIG1DdXJUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtRG9ja0JvdHRvbT0iICsgbURvY2tCb3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ29udGVudEJvdHRvbT0iICsgbUNvbnRlbnRCb3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ3VyQm90dG9tPSIgKyBtQ3VyQm90dG9tKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE2MDYsNDIgKzE2MDQsNiBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgcHVibGljIGJvb2xlYW4gcHJlcHJvY2Vzc0lucHV0RXZlbnRUcShSYXdJbnB1dEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgICAgICAgICAgY2FzZSBSYXdJbnB1dEV2ZW50LkVWX1NXOgotICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXljb2RlID09IFJhd0lucHV0RXZlbnQuU1dfTElEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxpZCBjaGFuZ2VkIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIG1MaWRPcGVuID0gZXZlbnQudmFsdWUgPT0gMDsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhd2FrZU5vdyA9IG1LZXlndWFyZE1lZGlhdG9yLmRvTGlkQ2hhbmdlVHEobUxpZE9wZW4pOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVSb3RhdGlvbihTdXJmYWNlLkZMQUdTX09SSUVOVEFUSU9OX0FOSU1BVElPTl9ESVNBQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWtlTm93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGlkIG9wZW5pbmcgYW5kIHdlIGRvbid0IGhhdmUgdG8ga2VlcCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleWd1YXJkIHVwLCB0aGVuIHdlIGNhbiB0dXJuIG9uIHRoZSBzY3JlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5LgotICAgICAgICAgICAgICAgICAgICAgICAgbUtleWd1YXJkTWVkaWF0b3IucG9rZVdha2Vsb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5Z3VhcmRJc1Nob3dpbmdUcSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxpZE9wZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgb3BlbmluZyB0aGUgbGlkIGFuZCBub3QgaGlkaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleWd1YXJkLCB0aGVuIHdlIG5lZWQgdG8gaGF2ZSBpdCB0dXJuIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjcmVlbiBvbmNlIGl0IGlzIHNob3duLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlndWFyZE1lZGlhdG9yLm9uV2FrZUtleVdoZW5LZXlndWFyZFNob3dpbmdUcSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LktFWUNPREVfUE9XRVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGlnaHQgdXAgdGhlIGtleWJvYXJkIGlmIHdlIGFyZSBzbGlkaW5nIHVwLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MaWRPcGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci51c2VyQWN0aXZpdHkoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3dlck1hbmFnZXIuQlVUVE9OX0VWRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci51c2VyQWN0aXZpdHkoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3dlck1hbmFnZXIuT1RIRVJfRVZFTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCiAgICAgcHVibGljIHZvaWQgbm90aWZ5TGlkU3dpdGNoQ2hhbmdlZChsb25nIHdoZW5OYW5vcywgYm9vbGVhbiBsaWRPcGVuKSB7CiAgICAgICAgIC8vIGxpZCBjaGFuZ2VkIHN0YXRlCiAgICAgICAgIG1MaWRPcGVuID0gbGlkT3BlbjsKQEAgLTE2NzIsMjYgKzE2MzQsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgCi0gICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcFN3aXRjaEtleVRxVGlMd0xpKGludCBrZXljb2RlKSB7Ci0gICAgICAgIHJldHVybiBrZXljb2RlID09IEtleUV2ZW50LktFWUNPREVfSE9NRQotICAgICAgICAgICAgICAgIHx8IGtleWNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9FTkRDQUxMOwotICAgIH0KLSAgICAKLSAgICAvKioge0Bpbmhlcml0RG9jfSAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTW92ZW1lbnRLZXlUaShpbnQga2V5Y29kZSkgewotICAgICAgICBzd2l0Y2ggKGtleWNvZGUpIHsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0xFRlQ6Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KICAgICAvKioKICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgYSB0ZWxlcGhvbmUgY2FsbCBpcyBpbiBwcm9ncmVzcyByaWdodCBub3cuCiAgICAgICovCkBAIC0xNzYyLDYwICsxNzA0LDYzIEBACiAgICAgfQogIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgcHVibGljIGludCBpbnRlcmNlcHRLZXlUcShSYXdJbnB1dEV2ZW50IGV2ZW50LCBib29sZWFuIHNjcmVlbklzT24pIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGludGVyY2VwdEtleUJlZm9yZVF1ZXVlaW5nKGxvbmcgd2hlbk5hbm9zLCBpbnQga2V5Q29kZSwgYm9vbGVhbiBkb3duLAorICAgICAgICAgICAgaW50IHBvbGljeUZsYWdzLCBib29sZWFuIGlzU2NyZWVuT24pIHsKICAgICAgICAgaW50IHJlc3VsdCA9IEFDVElPTl9QQVNTX1RPX1VTRVI7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNXYWtlS2V5ID0gaXNXYWtlS2V5VHEoZXZlbnQpOworICAgICAgICAKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1dha2VLZXkgPSAocG9saWN5RmxhZ3MKKyAgICAgICAgICAgICAgICAmIChXaW5kb3dNYW5hZ2VyUG9saWN5LkZMQUdfV0FLRSB8IFdpbmRvd01hbmFnZXJQb2xpY3kuRkxBR19XQUtFX0RST1BQRUQpKSAhPSAwOworICAgICAgICAKICAgICAgICAgLy8gSWYgc2NyZWVuIGlzIG9mZiB0aGVuIHdlIHRyZWF0IHRoZSBjYXNlIHdoZXJlIHRoZSBrZXlndWFyZCBpcyBvcGVuIGJ1dCBoaWRkZW4KICAgICAgICAgLy8gdGhlIHNhbWUgYXMgaWYgaXQgd2VyZSBvcGVuIGFuZCBpbiBmcm9udC4KICAgICAgICAgLy8gVGhpcyB3aWxsIHByZXZlbnQgYW55IGtleXMgb3RoZXIgdGhhbiB0aGUgcG93ZXIgYnV0dG9uIGZyb20gd2FraW5nIHRoZSBzY3JlZW4KICAgICAgICAgLy8gd2hlbiB0aGUga2V5Z3VhcmQgaXMgaGlkZGVuIGJ5IGFub3RoZXIgYWN0aXZpdHkuCi0gICAgICAgIGZpbmFsIGJvb2xlYW4ga2V5Z3VhcmRBY3RpdmUgPSAoc2NyZWVuSXNPbiA/CisgICAgICAgIGZpbmFsIGJvb2xlYW4ga2V5Z3VhcmRBY3RpdmUgPSAoaXNTY3JlZW5PbiA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUtleWd1YXJkTWVkaWF0b3IuaXNTaG93aW5nQW5kTm90SGlkZGVuKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlndWFyZE1lZGlhdG9yLmlzU2hvd2luZygpKTsKIAogICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImludGVyY2VwdEtleVRxIGV2ZW50PSIgKyBldmVudCArICIga2V5Y29kZT0iICsgZXZlbnQua2V5Y29kZQotICAgICAgICAgICAgICAgICAgKyAiIHNjcmVlbklzT249IiArIHNjcmVlbklzT24gKyAiIGtleWd1YXJkQWN0aXZlPSIgKyBrZXlndWFyZEFjdGl2ZSk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJpbnRlcmNlcHRLZXlUcSBrZXljb2RlPSIgKyBrZXlDb2RlCisgICAgICAgICAgICAgICAgICArICIgc2NyZWVuSXNPbj0iICsgaXNTY3JlZW5PbiArICIga2V5Z3VhcmRBY3RpdmU9IiArIGtleWd1YXJkQWN0aXZlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChrZXlndWFyZEFjdGl2ZSkgewotICAgICAgICAgICAgaWYgKHNjcmVlbklzT24pIHsKKyAgICAgICAgICAgIGlmIChpc1NjcmVlbk9uKSB7CiAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgc2NyZWVuIGlzIG9uLCBhbHdheXMgZ2l2ZSB0aGUgZXZlbnQgdG8gdGhlIGtleWd1YXJkCiAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IEFDVElPTl9QQVNTX1RPX1VTRVI7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZG9uJ3QgcGFzcyBpdCB0byB0aGUgdXNlcgogICAgICAgICAgICAgICAgIHJlc3VsdCAmPSB+QUNUSU9OX1BBU1NfVE9fVVNFUjsKIAotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNLZXlEb3duID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChldmVudC50eXBlID09IFJhd0lucHV0RXZlbnQuRVZfS0VZKSAmJiAoZXZlbnQudmFsdWUgIT0gMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzV2FrZUtleSAmJiBpc0tleURvd24pIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNXYWtlS2V5ICYmIGRvd24pIHsKIAogICAgICAgICAgICAgICAgICAgICAvLyB0ZWxsIHRoZSBtZWRpYXRvciBhYm91dCBhIHdha2Uga2V5LCBpdCBtYXkgZGVjaWRlIHRvCiAgICAgICAgICAgICAgICAgICAgIC8vIHR1cm4gb24gdGhlIHNjcmVlbiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUga2V5IGlzCiAgICAgICAgICAgICAgICAgICAgIC8vIGFwcHJvcHJpYXRlLgotICAgICAgICAgICAgICAgICAgICBpZiAoIW1LZXlndWFyZE1lZGlhdG9yLm9uV2FrZUtleVdoZW5LZXlndWFyZFNob3dpbmdUcShldmVudC5rZXljb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChldmVudC5rZXljb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnQua2V5Y29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtS2V5Z3VhcmRNZWRpYXRvci5vbldha2VLZXlXaGVuS2V5Z3VhcmRTaG93aW5nVHEoa2V5Q29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGtleWd1YXJkIGlzIHNob3dpbmcgYW5kIHNjcmVlbiBvZmYsIHdlIG5lZWQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGhhbmRsZSB0aGUgdm9sdW1lIGtleSBmb3IgY2FsbHMgYW5kICBtdXNpYyBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVZvbHVtZUtleShBdWRpb01hbmFnZXIuU1RSRUFNX1ZPSUNFX0NBTEwsIGV2ZW50LmtleWNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVZvbHVtZUtleShBdWRpb01hbmFnZXIuU1RSRUFNX1ZPSUNFX0NBTEwsIGtleUNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc011c2ljQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVWb2x1bWVLZXkoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgZXZlbnQua2V5Y29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVm9sdW1lS2V5KEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIGtleUNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFzY3JlZW5Jc09uKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIWlzU2NyZWVuT24pIHsKICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBpbi1jYWxsIHdpdGggc2NyZWVuIG9mZiBhbmQga2V5Z3VhcmQgaXMgbm90IHNob3dpbmcsCiAgICAgICAgICAgICAvLyB0aGVuIGhhbmRsZSB0aGUgdm9sdW1lIGtleSBvdXJzZWx2ZXMuCiAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBwaG9uZSBhcHAgd2lsbCBkaXNhYmxlIHRoZSBrZXlndWFyZAogICAgICAgICAgICAgLy8gd2hlbiB0aGUgcHJveGltaXR5IHNlbnNvciBpcyBpbiB1c2UuCi0gICAgICAgICAgICBpZiAoaXNJbkNhbGwoKSAmJiBldmVudC50eXBlID09IFJhd0lucHV0RXZlbnQuRVZfS0VZICYmCi0gICAgICAgICAgICAgICAgICAgICAoZXZlbnQua2V5Y29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50LmtleWNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApKSB7CisgICAgICAgICAgICBpZiAoaXNJbkNhbGwoKSAmJgorICAgICAgICAgICAgICAgICAgICAgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX1VQKSkgewogICAgICAgICAgICAgICAgIHJlc3VsdCAmPSB+QUNUSU9OX1BBU1NfVE9fVVNFUjsKLSAgICAgICAgICAgICAgICBoYW5kbGVWb2x1bWVLZXkoQXVkaW9NYW5hZ2VyLlNUUkVBTV9WT0lDRV9DQUxMLCBldmVudC5rZXljb2RlKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVWb2x1bWVLZXkoQXVkaW9NYW5hZ2VyLlNUUkVBTV9WT0lDRV9DQUxMLCBrZXlDb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChpc1dha2VLZXkpIHsKICAgICAgICAgICAgICAgICAvLyBhIHdha2Uga2V5IGhhcyBhIHNvbGUgcHVycG9zZSBvZiB3YWtpbmcgdGhlIGRldmljZTsgZG9uJ3QgcGFzcwpAQCAtMTgyNSwxNTYgKzE3NzAsMTUxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgdHlwZSA9IGV2ZW50LnR5cGU7Ci0gICAgICAgIGludCBjb2RlID0gZXZlbnQua2V5Y29kZTsKLSAgICAgICAgYm9vbGVhbiBkb3duID0gZXZlbnQudmFsdWUgIT0gMDsKLQotICAgICAgICBpZiAodHlwZSA9PSBSYXdJbnB1dEV2ZW50LkVWX0tFWSkgewotICAgICAgICAgICAgaWYgKGNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9FTkRDQUxMCi0gICAgICAgICAgICAgICAgICAgIHx8IGNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9QT1dFUikgewotICAgICAgICAgICAgICAgIGlmIChkb3duKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGh1bmdVcCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAvLyBrZXkgcmVwZWF0cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSB3aW5kb3cgbWFuYWdlciwgYW5kIHdlIGRvbid0IHNlZSB0aGVtCi0gICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHNvIHVubGVzcyB0aGUgZHJpdmVyIGlzIGRvaW5nIHNvbWV0aGluZyBpdCBzaG91bGRuJ3QgYmUsIHdlIGtub3cKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgcmVhbCBwcmVzcyBldmVudC4KLSAgICAgICAgICAgICAgICAgICAgSVRlbGVwaG9ueSBwaG9uZVNlcnYgPSBnZXRQaG9uZUludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGhvbmVTZXJ2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9FTkRDQUxMKSB7CisgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRU5EQ0FMTAorICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9QT1dFUikgeworICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGh1bmdVcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIC8vIGtleSByZXBlYXRzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIHdpbmRvdyBtYW5hZ2VyLCBhbmQgd2UgZG9uJ3Qgc2VlIHRoZW0KKyAgICAgICAgICAgICAgICAvLyBoZXJlLCBzbyB1bmxlc3MgdGhlIGRyaXZlciBpcyBkb2luZyBzb21ldGhpbmcgaXQgc2hvdWxkbid0IGJlLCB3ZSBrbm93CisgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgcmVhbCBwcmVzcyBldmVudC4KKyAgICAgICAgICAgICAgICBJVGVsZXBob255IHBob25lU2VydiA9IGdldFBob25lSW50ZXJmYWNlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBob25lU2VydiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0VORENBTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gaHVuZ1VwID0gcGhvbmVTZXJ2LmVuZENhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1BPV0VSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob25lU2Vydi5pc1JpbmdpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVzc2luZyBQb3dlciB3aGlsZSB0aGVyZSdzIGEgcmluZ2luZyBpbmNvbWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHNob3VsZCBzaWxlbmNlIHRoZSByaW5nZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lU2Vydi5zaWxlbmNlUmluZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGhvbmVTZXJ2LmlzT2ZmaG9vaygpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1JbmNhbGxQb3dlckJlaGF2aW9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgU2V0dGluZ3MuU2VjdXJlLklOQ0FMTF9QT1dFUl9CVVRUT05fQkVIQVZJT1JfSEFOR1VQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWYgIlBvd2VyIGJ1dHRvbiBlbmRzIGNhbGwiIGlzIGVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBQb3dlciBidXR0b24gd2lsbCBoYW5nIHVwIGFueSBjdXJyZW50IGFjdGl2ZSBjYWxsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gaHVuZ1VwID0gcGhvbmVTZXJ2LmVuZENhbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9QT1dFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvbmVTZXJ2LmlzUmluZ2luZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVzc2luZyBQb3dlciB3aGlsZSB0aGVyZSdzIGEgcmluZ2luZyBpbmNvbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBzaG91bGQgc2lsZW5jZSB0aGUgcmluZ2VyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXJ2LnNpbGVuY2VSaW5nZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBob25lU2Vydi5pc09mZmhvb2soKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobUluY2FsbFBvd2VyQmVoYXZpb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgU2V0dGluZ3MuU2VjdXJlLklOQ0FMTF9QT1dFUl9CVVRUT05fQkVIQVZJT1JfSEFOR1VQKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiAiUG93ZXIgYnV0dG9uIGVuZHMgY2FsbCIgaXMgZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBQb3dlciBidXR0b24gd2lsbCBoYW5nIHVwIGFueSBjdXJyZW50IGFjdGl2ZSBjYWxsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IGh1bmdVcCA9IHBob25lU2Vydi5lbmRDYWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJVGVsZXBob255IHRocmV3IFJlbW90ZUV4Y2VwdGlvbiIgKyBleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICIhISEgVW5hYmxlIHRvIGZpbmQgSVRlbGVwaG9ueSBpbnRlcmZhY2UgISEhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXNjcmVlbklzT24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaGFuZGxlZCAmJiBjb2RlICE9IEtleUV2ZW50LktFWUNPREVfUE9XRVIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGhhbmRsZWQgJiYgaHVuZ1VwICYmIGNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9QT1dFUikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaG91bGRUdXJuT2ZmT25LZXlVcCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB0cnkgdG8gdHVybiBvZmYgdGhlIHNjcmVlbiBpZiB3ZSBkaWRuJ3QgYWxyZWFkeSBoYW5nIHVwCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2hvdWxkVHVybk9mZk9uS2V5VXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVBvd2VyTG9uZ1ByZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3Q29uZmlndXJhdGlvbi5nZXRHbG9iYWxBY3Rpb25LZXlUaW1lb3V0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICY9IH5BQ1RJT05fUEFTU19UT19VU0VSOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklUZWxlcGhvbnkgdGhyZXcgUmVtb3RlRXhjZXB0aW9uIiArIGV4KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUG93ZXJMb25nUHJlc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVNob3VsZFR1cm5PZmZPbktleVVwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2hvdWxkVHVybk9mZk9uS2V5VXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZ29ob21lLCBzbGVlcHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0VORENBTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2hvbWUgPSAobUVuZGNhbGxCZWhhdmlvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIFNldHRpbmdzLlN5c3RlbS5FTkRfQlVUVE9OX0JFSEFWSU9SX0hPTUUpICE9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBzID0gKG1FbmRjYWxsQmVoYXZpb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBTZXR0aW5ncy5TeXN0ZW0uRU5EX0JVVFRPTl9CRUhBVklPUl9TTEVFUCkgIT0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29ob21lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlndWFyZEFjdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc2xlZXBzICYmICFnb2hvbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChnb2hvbWUgJiYgIWdvSG9tZSgpICYmIHNsZWVwcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGV5IG11c3QgYWxyZWFkeSBiZSBvbiB0aGUga2V5Z3VhZCBvciBob21lIHNjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbyB0byBzbGVlcCBpbnN0ZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSSdtIHRpcmVkIG1FbmRjYWxsQmVoYXZpb3I9MHgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcobUVuZGNhbGxCZWhhdmlvcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAmPSB+QUNUSU9OX1BPS0VfVVNFUl9BQ1RJVklUWTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gQUNUSU9OX0dPX1RPX1NMRUVQOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICY9IH5BQ1RJT05fUEFTU19UT19VU0VSOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIiEhISBVbmFibGUgdG8gZmluZCBJVGVsZXBob255IGludGVyZmFjZSAhISEiKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTWVkaWFLZXkoY29kZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGtleSBuZWVkcyB0byBiZSBoYW5kbGVkIGV2ZW4gaWYgdGhlIHNjcmVlbiBpcyBvZmYuCi0gICAgICAgICAgICAgICAgLy8gSWYgb3RoZXJzIG5lZWQgdG8gYmUgaGFuZGxlZCB3aGlsZSBpdCdzIG9mZiwgdGhpcyBpcyBhIHJlYXNvbmFibGUKLSAgICAgICAgICAgICAgICAvLyBwYXR0ZXJuIHRvIGZvbGxvdy4KLSAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdCAmIEFDVElPTl9QQVNTX1RPX1VTRVIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHdlIHdvdWxkIG90aGVyd2lzZSBub3QgcGFzcyBpdCB0byB0aGUgdXNlci4gSW4gdGhhdAotICAgICAgICAgICAgICAgICAgICAvLyBjYXNlLCB0aGUgUGhvbmVXaW5kb3cgY2xhc3Mgd2lsbCBkbyB0aGUgc2FtZSB0aGluZywgZXhjZXB0IGl0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkbyBpdCBpZiB0aGUgc2hvd2luZyBhcHAgZG9lc24ndCBwcm9jZXNzIHRoZSBrZXkgb24gaXRzIG93bi4KLSAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQga2V5RXZlbnQgPSBuZXcgS2V5RXZlbnQoZXZlbnQud2hlbiwgZXZlbnQud2hlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duID8gS2V5RXZlbnQuQUNUSU9OX0RPV04gOiBLZXlFdmVudC5BQ1RJT05fVVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFBhc3NIZWFkc2V0S2V5KGtleUV2ZW50KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWlzU2NyZWVuT24KKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoYW5kbGVkICYmIGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9QT1dFUikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoYW5kbGVkICYmIGh1bmdVcCAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfUE9XRVIpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaG91bGRUdXJuT2ZmT25LZXlVcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdHJ5IHRvIHR1cm4gb2ZmIHRoZSBzY3JlZW4gaWYgd2UgZGlkbid0IGFscmVhZHkgaGFuZyB1cAorICAgICAgICAgICAgICAgICAgICBtU2hvdWxkVHVybk9mZk9uS2V5VXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtUG93ZXJMb25nUHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0R2xvYmFsQWN0aW9uS2V5VGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICY9IH5BQ1RJT05fUEFTU19UT19VU0VSOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0NBTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBhbiBpbmNvbWluZyBjYWxsIGlzIHJpbmdpbmcsIGFuc3dlciBpdCEKLSAgICAgICAgICAgICAgICAvLyAoV2UgaGFuZGxlIHRoaXMga2V5IGhlcmUsIHJhdGhlciB0aGFuIGluIHRoZSBJbkNhbGxTY3JlZW4sIHRvIG1ha2UKLSAgICAgICAgICAgICAgICAvLyBzdXJlIHdlJ2xsIHJlc3BvbmQgdG8gdGhlIGtleSBldmVuIGlmIHRoZSBJbkNhbGxTY3JlZW4gaGFzbid0IGNvbWUgdG8KLSAgICAgICAgICAgICAgICAvLyB0aGUgZm9yZWdyb3VuZCB5ZXQuKQotCi0gICAgICAgICAgICAgICAgLy8gV2UgYW5zd2VyIHRoZSBjYWxsIG9uIHRoZSBET1dOIGV2ZW50LCB0byBhZ3JlZSB3aXRoCi0gICAgICAgICAgICAgICAgLy8gdGhlICJmYWxsYmFjayIgYmVoYXZpb3IgaW4gdGhlIEluQ2FsbFNjcmVlbi4KLSAgICAgICAgICAgICAgICBpZiAoZG93bikgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgSVRlbGVwaG9ueSBwaG9uZVNlcnYgPSBnZXRQaG9uZUludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob25lU2VydiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob25lU2Vydi5pc1JpbmdpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJpbnRlcmNlcHRLZXlUcToiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBDQUxMIGtleS1kb3duIHdoaWxlIHJpbmdpbmc6IEFuc3dlciB0aGUgY2FsbCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXJ2LmFuc3dlclJpbmdpbmdDYWxsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kICpkb24ndCogcGFzcyB0aGlzIGtleSB0aHJ1IHRvIHRoZSBjdXJyZW50IGFjdGl2aXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aGljaCBpcyBwcmVzdW1hYmx5IHRoZSBJbkNhbGxTY3JlZW4uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgJj0gfkFDVElPTl9QQVNTX1RPX1VTRVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDQUxMIGJ1dHRvbjogVW5hYmxlIHRvIGZpbmQgSVRlbGVwaG9ueSBpbnRlcmZhY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDQUxMIGJ1dHRvbjogUmVtb3RlRXhjZXB0aW9uIGZyb20gZ2V0UGhvbmVJbnRlcmZhY2UoKSIsIGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1Qb3dlckxvbmdQcmVzcyk7CisgICAgICAgICAgICAgICAgaWYgKG1TaG91bGRUdXJuT2ZmT25LZXlVcCkgeworICAgICAgICAgICAgICAgICAgICBtU2hvdWxkVHVybk9mZk9uS2V5VXAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBnb2hvbWUsIHNsZWVwczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9FTkRDQUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb2hvbWUgPSAobUVuZGNhbGxCZWhhdmlvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgU2V0dGluZ3MuU3lzdGVtLkVORF9CVVRUT05fQkVIQVZJT1JfSE9NRSkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwcyA9IChtRW5kY2FsbEJlaGF2aW9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBTZXR0aW5ncy5TeXN0ZW0uRU5EX0JVVFRPTl9CRUhBVklPUl9TTEVFUCkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvaG9tZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoa2V5Z3VhcmRBY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc2xlZXBzICYmICFnb2hvbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGdvaG9tZSAmJiAhZ29Ib21lKCkgJiYgc2xlZXBzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBtdXN0IGFscmVhZHkgYmUgb24gdGhlIGtleWd1YWQgb3IgaG9tZSBzY3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbyB0byBzbGVlcCBpbnN0ZWFkCisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJJ20gdGlyZWQgbUVuZGNhbGxCZWhhdmlvcj0weCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1FbmRjYWxsQmVoYXZpb3IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAmPSB+QUNUSU9OX1BPS0VfVVNFUl9BQ1RJVklUWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBBQ1RJT05fR09fVE9fU0xFRVA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICY9IH5BQ1RJT05fUEFTU19UT19VU0VSOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IChjb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04pKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgYW4gaW5jb21pbmcgY2FsbCBpcyByaW5naW5nLCBlaXRoZXIgVk9MVU1FIGtleSBtZWFucwotICAgICAgICAgICAgICAgIC8vICJzaWxlbmNlIHJpbmdlciIuICBXZSBoYW5kbGUgdGhlc2Uga2V5cyBoZXJlLCByYXRoZXIgdGhhbgotICAgICAgICAgICAgICAgIC8vIGluIHRoZSBJbkNhbGxTY3JlZW4sIHRvIG1ha2Ugc3VyZSB3ZSdsbCByZXNwb25kIHRvIHRoZW0KLSAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHRoZSBJbkNhbGxTY3JlZW4gaGFzbid0IGNvbWUgdG8gdGhlIGZvcmVncm91bmQgeWV0LgorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGlzTWVkaWFLZXkoa2V5Q29kZSkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMga2V5IG5lZWRzIHRvIGJlIGhhbmRsZWQgZXZlbiBpZiB0aGUgc2NyZWVuIGlzIG9mZi4KKyAgICAgICAgICAgIC8vIElmIG90aGVycyBuZWVkIHRvIGJlIGhhbmRsZWQgd2hpbGUgaXQncyBvZmYsIHRoaXMgaXMgYSByZWFzb25hYmxlCisgICAgICAgICAgICAvLyBwYXR0ZXJuIHRvIGZvbGxvdy4KKyAgICAgICAgICAgIGlmICgocmVzdWx0ICYgQUNUSU9OX1BBU1NfVE9fVVNFUikgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBpZiB3ZSB3b3VsZCBvdGhlcndpc2Ugbm90IHBhc3MgaXQgdG8gdGhlIHVzZXIuIEluIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBjYXNlLCB0aGUgUGhvbmVXaW5kb3cgY2xhc3Mgd2lsbCBkbyB0aGUgc2FtZSB0aGluZywgZXhjZXB0IGl0IHdpbGwKKyAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIGl0IGlmIHRoZSBzaG93aW5nIGFwcCBkb2Vzbid0IHByb2Nlc3MgdGhlIGtleSBvbiBpdHMgb3duLgorICAgICAgICAgICAgICAgIGxvbmcgd2hlbiA9IHdoZW5OYW5vcyAvIDEwMDAwMDA7CisgICAgICAgICAgICAgICAgS2V5RXZlbnQga2V5RXZlbnQgPSBuZXcgS2V5RXZlbnQod2hlbiwgd2hlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPyBLZXlFdmVudC5BQ1RJT05fRE9XTiA6IEtleUV2ZW50LkFDVElPTl9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleUNvZGUsIDApOworICAgICAgICAgICAgICAgIG1Ccm9hZGNhc3RXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUGFzc0hlYWRzZXRLZXkoa2V5RXZlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQ0FMTCkgeworICAgICAgICAgICAgLy8gSWYgYW4gaW5jb21pbmcgY2FsbCBpcyByaW5naW5nLCBhbnN3ZXIgaXQhCisgICAgICAgICAgICAvLyAoV2UgaGFuZGxlIHRoaXMga2V5IGhlcmUsIHJhdGhlciB0aGFuIGluIHRoZSBJbkNhbGxTY3JlZW4sIHRvIG1ha2UKKyAgICAgICAgICAgIC8vIHN1cmUgd2UnbGwgcmVzcG9uZCB0byB0aGUga2V5IGV2ZW4gaWYgdGhlIEluQ2FsbFNjcmVlbiBoYXNuJ3QgY29tZSB0bworICAgICAgICAgICAgLy8gdGhlIGZvcmVncm91bmQgeWV0LikKIAotICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSBET1dOIGV2ZW50IGhlcmUsIHRvIGFncmVlIHdpdGggdGhlICJmYWxsYmFjayIKLSAgICAgICAgICAgICAgICAvLyBiZWhhdmlvciBpbiB0aGUgSW5DYWxsU2NyZWVuLgotICAgICAgICAgICAgICAgIGlmIChkb3duKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJVGVsZXBob255IHBob25lU2VydiA9IGdldFBob25lSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvbmVTZXJ2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvbmVTZXJ2LmlzUmluZ2luZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgImludGVyY2VwdEtleVRxOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFZPTFVNRSBrZXktZG93biB3aGlsZSByaW5naW5nOiBTaWxlbmNlIHJpbmdlciEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSB0aGUgcmluZ2VyLiAgKEl0J3Mgc2FmZSB0byBjYWxsIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGUgcmluZ2VyIGhhcyBhbHJlYWR5IGJlZW4gc2lsZW5jZWQuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZVNlcnYuc2lsZW5jZVJpbmdlcigpOworICAgICAgICAgICAgLy8gV2UgYW5zd2VyIHRoZSBjYWxsIG9uIHRoZSBET1dOIGV2ZW50LCB0byBhZ3JlZSB3aXRoCisgICAgICAgICAgICAvLyB0aGUgImZhbGxiYWNrIiBiZWhhdmlvciBpbiB0aGUgSW5DYWxsU2NyZWVuLgorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJVGVsZXBob255IHBob25lU2VydiA9IGdldFBob25lSW50ZXJmYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaG9uZVNlcnYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob25lU2Vydi5pc1JpbmdpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgImludGVyY2VwdEtleVRxOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgQ0FMTCBrZXktZG93biB3aGlsZSByaW5naW5nOiBBbnN3ZXIgdGhlIGNhbGwhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXJ2LmFuc3dlclJpbmdpbmdDYWxsKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kICpkb24ndCogcGFzcyB0aGlzIGtleSB0aHJ1IHRvIHRoZSBjdXJyZW50IGFjdGl2aXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aGljaCBpcyBwcm9iYWJseSB0aGUgSW5DYWxsU2NyZWVuLikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICY9IH5BQ1RJT05fUEFTU19UT19VU0VSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVk9MVU1FIGJ1dHRvbjogVW5hYmxlIHRvIGZpbmQgSVRlbGVwaG9ueSBpbnRlcmZhY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmQgKmRvbid0KiBwYXNzIHRoaXMga2V5IHRocnUgdG8gdGhlIGN1cnJlbnQgYWN0aXZpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAod2hpY2ggaXMgcHJlc3VtYWJseSB0aGUgSW5DYWxsU2NyZWVuLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgJj0gfkFDVElPTl9QQVNTX1RPX1VTRVI7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVk9MVU1FIGJ1dHRvbjogUmVtb3RlRXhjZXB0aW9uIGZyb20gZ2V0UGhvbmVJbnRlcmZhY2UoKSIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNBTEwgYnV0dG9uOiBVbmFibGUgdG8gZmluZCBJVGVsZXBob255IGludGVyZmFjZSIpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNBTEwgYnV0dG9uOiBSZW1vdGVFeGNlcHRpb24gZnJvbSBnZXRQaG9uZUludGVyZmFjZSgpIiwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCkKKyAgICAgICAgICAgICAgICAgICB8fCAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOKSkgeworICAgICAgICAgICAgLy8gSWYgYW4gaW5jb21pbmcgY2FsbCBpcyByaW5naW5nLCBlaXRoZXIgVk9MVU1FIGtleSBtZWFucworICAgICAgICAgICAgLy8gInNpbGVuY2UgcmluZ2VyIi4gIFdlIGhhbmRsZSB0aGVzZSBrZXlzIGhlcmUsIHJhdGhlciB0aGFuCisgICAgICAgICAgICAvLyBpbiB0aGUgSW5DYWxsU2NyZWVuLCB0byBtYWtlIHN1cmUgd2UnbGwgcmVzcG9uZCB0byB0aGVtCisgICAgICAgICAgICAvLyBldmVuIGlmIHRoZSBJbkNhbGxTY3JlZW4gaGFzbid0IGNvbWUgdG8gdGhlIGZvcmVncm91bmQgeWV0LgorCisgICAgICAgICAgICAvLyBMb29rIGZvciB0aGUgRE9XTiBldmVudCBoZXJlLCB0byBhZ3JlZSB3aXRoIHRoZSAiZmFsbGJhY2siCisgICAgICAgICAgICAvLyBiZWhhdmlvciBpbiB0aGUgSW5DYWxsU2NyZWVuLgorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJVGVsZXBob255IHBob25lU2VydiA9IGdldFBob25lSW50ZXJmYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaG9uZVNlcnYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob25lU2Vydi5pc1JpbmdpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgImludGVyY2VwdEtleVRxOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgVk9MVU1FIGtleS1kb3duIHdoaWxlIHJpbmdpbmc6IFNpbGVuY2UgcmluZ2VyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgdGhlIHJpbmdlci4gIChJdCdzIHNhZmUgdG8gY2FsbCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGUgcmluZ2VyIGhhcyBhbHJlYWR5IGJlZW4gc2lsZW5jZWQuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lU2Vydi5zaWxlbmNlUmluZ2VyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmQgKmRvbid0KiBwYXNzIHRoaXMga2V5IHRocnUgdG8gdGhlIGN1cnJlbnQgYWN0aXZpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAod2hpY2ggaXMgcHJvYmFibHkgdGhlIEluQ2FsbFNjcmVlbi4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICY9IH5BQ1RJT05fUEFTU19UT19VU0VSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVk9MVU1FIGJ1dHRvbjogVW5hYmxlIHRvIGZpbmQgSVRlbGVwaG9ueSBpbnRlcmZhY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJWT0xVTUUgYnV0dG9uOiBSZW1vdGVFeGNlcHRpb24gZnJvbSBnZXRQaG9uZUludGVyZmFjZSgpIiwgZXgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjAyNCwzNSArMTk2NCw2IEBACiAgICAgfTsKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNXYWtlUmVsTW92ZW1lbnRUcShpbnQgZGV2aWNlLCBpbnQgY2xhc3NlcywKLSAgICAgICAgICAgIFJhd0lucHV0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy8gaWYgaXQncyB0YWdnZWQgd2l0aCBvbmUgb2YgdGhlIHdha2UgYml0cywgaXQgd2FrZXMgdXAgdGhlIGRldmljZQotICAgICAgICByZXR1cm4gKChldmVudC5mbGFncyAmIChGTEFHX1dBS0UgfCBGTEFHX1dBS0VfRFJPUFBFRCkpICE9IDApOwotICAgIH0KLQotICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNXYWtlQWJzTW92ZW1lbnRUcShpbnQgZGV2aWNlLCBpbnQgY2xhc3NlcywKLSAgICAgICAgICAgIFJhd0lucHV0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy8gaWYgaXQncyB0YWdnZWQgd2l0aCBvbmUgb2YgdGhlIHdha2UgYml0cywgaXQgd2FrZXMgdXAgdGhlIGRldmljZQotICAgICAgICByZXR1cm4gKChldmVudC5mbGFncyAmIChGTEFHX1dBS0UgfCBGTEFHX1dBS0VfRFJPUFBFRCkpICE9IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB3b3JsZCwgc2hvdWxkIHRoaXMga2V5IHdha2UgdXAgdGhlIGRldmljZT8KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1dha2VLZXlUcShSYXdJbnB1dEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIFRoZXJlIGFyZSBub3Qga2V5IG1hcHMgZm9yIHRyYWNrYmFsbCBkZXZpY2VzLCBidXQgd2UnZCBzdGlsbAotICAgICAgICAvLyBsaWtlIHRvIGhhdmUgcHJlc3NpbmcgaXQgd2FrZSB0aGUgZGV2aWNlIHVwLCBzbyBmb3JjZSBpdCBoZXJlLgotICAgICAgICBpbnQga2V5Y29kZSA9IGV2ZW50LmtleWNvZGU7Ci0gICAgICAgIGludCBmbGFncyA9IGV2ZW50LmZsYWdzOwotICAgICAgICBpZiAoa2V5Y29kZSA9PSBSYXdJbnB1dEV2ZW50LkJUTl9NT1VTRSkgewotICAgICAgICAgICAgZmxhZ3MgfD0gV2luZG93TWFuYWdlclBvbGljeS5GTEFHX1dBS0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChmbGFncwotICAgICAgICAgICAgICAgICYgKFdpbmRvd01hbmFnZXJQb2xpY3kuRkxBR19XQUtFIHwgV2luZG93TWFuYWdlclBvbGljeS5GTEFHX1dBS0VfRFJPUFBFRCkpICE9IDA7Ci0gICAgfQotCi0gICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBzY3JlZW5UdXJuZWRPZmYoaW50IHdoeSkgewogICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDcwMDAwLCAwKTsKICAgICAgICAgbUtleWd1YXJkTWVkaWF0b3Iub25TY3JlZW5UdXJuZWRPZmYod2h5KTsKQEAgLTIxNjUsNyArMjA3Niw3IEBACiAgICAgICAgICAgICBpbnQgbWVudVN0YXRlID0gbVdpbmRvd01hbmFnZXIuZ2V0S2V5Y29kZVN0YXRlKEtleUV2ZW50LktFWUNPREVfTUVOVSk7CiAgICAgICAgICAgICBpbnQgc1N0YXRlID0gbVdpbmRvd01hbmFnZXIuZ2V0S2V5Y29kZVN0YXRlKEtleUV2ZW50LktFWUNPREVfUyk7CiAgICAgICAgICAgICBpbnQgZHBhZFN0YXRlID0gbVdpbmRvd01hbmFnZXIuZ2V0RFBhZEtleWNvZGVTdGF0ZShLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgICAgIGludCB0cmFja2JhbGxTdGF0ZSA9IG1XaW5kb3dNYW5hZ2VyLmdldFRyYWNrYmFsbFNjYW5jb2RlU3RhdGUoUmF3SW5wdXRFdmVudC5CVE5fTU9VU0UpOworICAgICAgICAgICAgaW50IHRyYWNrYmFsbFN0YXRlID0gbVdpbmRvd01hbmFnZXIuZ2V0VHJhY2tiYWxsU2NhbmNvZGVTdGF0ZShCVE5fTU9VU0UpOwogICAgICAgICAgICAgbVNhZmVNb2RlID0gbWVudVN0YXRlID4gMCB8fCBzU3RhdGUgPiAwIHx8IGRwYWRTdGF0ZSA+IDAgfHwgdHJhY2tiYWxsU3RhdGUgPiAwOwogICAgICAgICAgICAgcGVyZm9ybUhhcHRpY0ZlZWRiYWNrTHcobnVsbCwgbVNhZmVNb2RlCiAgICAgICAgICAgICAgICAgICAgID8gSGFwdGljRmVlZGJhY2tDb25zdGFudHMuU0FGRV9NT0RFX0VOQUJMRUQKQEAgLTI0MTMsMTMgKzIzMjQsNiBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgCi0gICAgcHVibGljIHZvaWQga2V5RmVlZGJhY2tGcm9tSW5wdXQoS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOCi0gICAgICAgICAgICAgICAgJiYgKGV2ZW50LmdldEZsYWdzKCkmS2V5RXZlbnQuRkxBR19WSVJUVUFMX0hBUkRfS0VZKSAhPSAwKSB7Ci0gICAgICAgICAgICBwZXJmb3JtSGFwdGljRmVlZGJhY2tMdyhudWxsLCBIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5WSVJUVUFMX0tFWSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIAogICAgIHB1YmxpYyB2b2lkIHNjcmVlbk9uU3RvcHBlZEx3KCkgewogICAgICAgICBpZiAoIW1LZXlndWFyZE1lZGlhdG9yLmlzU2hvd2luZ0FuZE5vdEhpZGRlbigpICYmIG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKSB7CiAgICAgICAgICAgICBsb25nIGN1clRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0RGV2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dERldmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTRiNjlmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0RGV2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlclBvbGljeTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBJbnB1dERldmljZSB7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUE9JTlRFUlMgPSBmYWxzZTsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19IQUNLUyA9IGZhbHNlOwotICAgIAotICAgIC8qKiBBbW91bnQgdGhhdCB0cmFja2JhbGwgbmVlZHMgdG8gbW92ZSBpbiBvcmRlciB0byBnZW5lcmF0ZSBhIGtleSBldmVudC4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFRSQUNLQkFMTF9NT1ZFTUVOVF9USFJFU0hPTEQgPSA2OwotCi0gICAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHBvaW50ZXJzIHdlIHdpbGwgdHJhY2sgYW5kIHJlcG9ydC4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9QT0lOVEVSUyA9IDEwOwotICAgIAotICAgIC8qKgotICAgICAqIFNsb3AgZGlzdGFuY2UgZm9yIGp1bXB5IHBvaW50ZXIgZGV0ZWN0aW9uLgotICAgICAqIFRoZSB2ZXJ0aWNhbCByYW5nZSBvZiB0aGUgc2NyZWVuIGRpdmlkZWQgYnkgdGhpcyBpcyBvdXIgZXBzaWxvbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSlVNUFlfRVBTSUxPTl9ESVZJU09SID0gMjEyOwotICAgIAotICAgIC8qKiBOdW1iZXIgb2YganVtcHkgcG9pbnRzIHRvIGRyb3AgZm9yIHRvdWNoc2NyZWVucyB0aGF0IG5lZWQgaXQuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpVTVBZX1RSQU5TSVRJT05fRFJPUFMgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKVU1QWV9EUk9QX0xJTUlUID0gMzsKLSAgICAKLSAgICBmaW5hbCBpbnQgaWQ7Ci0gICAgZmluYWwgaW50IGNsYXNzZXM7Ci0gICAgZmluYWwgU3RyaW5nIG5hbWU7Ci0gICAgZmluYWwgQWJzb2x1dGVJbmZvIGFic1g7Ci0gICAgZmluYWwgQWJzb2x1dGVJbmZvIGFic1k7Ci0gICAgZmluYWwgQWJzb2x1dGVJbmZvIGFic1ByZXNzdXJlOwotICAgIGZpbmFsIEFic29sdXRlSW5mbyBhYnNTaXplOwotICAgIAotICAgIGxvbmcgbUtleURvd25UaW1lID0gMDsKLSAgICBpbnQgbU1ldGFLZXlzU3RhdGUgPSAwOwotICAgIAotICAgIC8vIEZvciB1c2UgYnkgS2V5SW5wdXRRdWV1ZSBmb3Iga2VlcGluZyB0cmFjayBvZiB0aGUgY3VycmVudCB0b3VjaAotICAgIC8vIGRhdGEgaW4gdGhlIG9sZCBub24tbXVsdGktdG91Y2ggcHJvdG9jb2wuCi0gICAgZmluYWwgaW50W10gY3VyVG91Y2hWYWxzID0gbmV3IGludFtNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEEgKiAyXTsKLSAgICAKLSAgICBmaW5hbCBNb3Rpb25TdGF0ZSBtQWJzID0gbmV3IE1vdGlvblN0YXRlKDAsIDApOwotICAgIGZpbmFsIE1vdGlvblN0YXRlIG1SZWwgPSBuZXcgTW90aW9uU3RhdGUoVFJBQ0tCQUxMX01PVkVNRU5UX1RIUkVTSE9MRCwKLSAgICAgICAgICAgIFRSQUNLQkFMTF9NT1ZFTUVOVF9USFJFU0hPTEQpOwotICAgIAotICAgIHN0YXRpYyBjbGFzcyBNb3Rpb25TdGF0ZSB7Ci0gICAgICAgIGludCB4UHJlY2lzaW9uOwotICAgICAgICBpbnQgeVByZWNpc2lvbjsKLSAgICAgICAgZmxvYXQgeE1vdmVTY2FsZTsKLSAgICAgICAgZmxvYXQgeU1vdmVTY2FsZTsKLSAgICAgICAgTW90aW9uRXZlbnQgY3VycmVudE1vdmUgPSBudWxsOwotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBldmVyQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICBsb25nIG1Eb3duVGltZSA9IDA7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGUgY3VycmVudGx5IGFzc2lnbmVkIHBvaW50ZXIgSURzLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IGRhdGEuCi0gICAgICAgIGludFtdIG1Qb2ludGVySWRzID0gbmV3IGludFtNQVhfUE9JTlRFUlNdOwotICAgICAgICAKLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGFzdCBnZW5lcmF0ZWQgcG9pbnRlciBkYXRhLCBvcmRlcmVkIHRvIG1hdGNoCi0gICAgICAgIC8vIG1Qb2ludGVySWRzLgotICAgICAgICBib29sZWFuIG1Ta2lwTGFzdFBvaW50ZXJzOwotICAgICAgICBpbnQgbUxhc3ROdW1Qb2ludGVycyA9IDA7Ci0gICAgICAgIGZpbmFsIGludFtdIG1MYXN0RGF0YSA9IG5ldyBpbnRbTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBICogTUFYX1BPSU5URVJTXTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgaXMgdGhlIG5leHQgc2V0IG9mIHBvaW50ZXIgZGF0YSBiZWluZyBnZW5lcmF0ZWQuICBJdCBpcyBub3QKLSAgICAgICAgLy8gaW4gYW55IGtub3duIG9yZGVyLCBhbmQgd2lsbCBiZSBwcm9wYWdhdGVkIGluIHRvIG1MYXN0RGF0YQotICAgICAgICAvLyBhcyBwYXJ0IG9mIG1hcHBpbmcgaXQgdG8gdGhlIGFwcHJvcHJpYXRlIHBvaW50ZXIgSURzLgotICAgICAgICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSBvbmUgZXh0cmEgc2FtcGxlIG9mIGRhdGEgaGVyZSwgdG8gaGVscCBjbGllbnRzCi0gICAgICAgIC8vIGF2b2lkIGRvaW5nIGJvdW5kcyBjaGVja2luZy4KLSAgICAgICAgaW50IG1OZXh0TnVtUG9pbnRlcnMgPSAwOwotICAgICAgICBmaW5hbCBpbnRbXSBtTmV4dERhdGEgPSBuZXcgaW50WyhNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEEgKiBNQVhfUE9JTlRFUlMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEFdOwotICAgICAgICAKLSAgICAgICAgLy8gVXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBkcm9wcGVkIGJhZCBkYXRhLCB0byBhdm9pZCBkb2luZwotICAgICAgICAvLyBpdCByZXBlYXRlZGx5LgotICAgICAgICBmaW5hbCBib29sZWFuW10gbURyb3BwZWRCYWRQb2ludCA9IG5ldyBib29sZWFuW01BWF9QT0lOVEVSU107Ci0KLSAgICAgICAgLy8gVXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIGp1bXB5IHBvaW50cyBkcm9wcGVkLgotICAgICAgICBwcml2YXRlIGludCBtSnVtcHlQb2ludHNEcm9wcGVkID0gMDsKLSAgICAgICAgCi0gICAgICAgIC8vIFVzZWQgdG8gcGVyZm9ybSBhdmVyYWdpbmcgb2YgcmVwb3J0ZWQgY29vcmRpbmF0ZXMsIHRvIHNtb290aAotICAgICAgICAvLyB0aGUgZGF0YSBhbmQgZmlsdGVyIG91dCB0cmFuc2llbnRzIGR1cmluZyBhIHJlbGVhc2UuCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgSElTVE9SWV9TSVpFID0gNTsKLSAgICAgICAgaW50W10gbUhpc3RvcnlEYXRhU3RhcnQgPSBuZXcgaW50W01BWF9QT0lOVEVSU107Ci0gICAgICAgIGludFtdIG1IaXN0b3J5RGF0YUVuZCA9IG5ldyBpbnRbTUFYX1BPSU5URVJTXTsKLSAgICAgICAgZmluYWwgaW50W10gbUhpc3RvcnlEYXRhID0gbmV3IGludFsoTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBICogTUFYX1BPSU5URVJTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSElTVE9SWV9TSVpFXTsKLSAgICAgICAgZmluYWwgaW50W10gbUF2ZXJhZ2VkRGF0YSA9IG5ldyBpbnRbTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBICogTUFYX1BPSU5URVJTXTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlbXBvcmFyeSBkYXRhIHN0cnVjdHVyZXMgZm9yIGRvaW5nIHRoZSBwb2ludGVyIElEIG1hcHBpbmcuCi0gICAgICAgIGZpbmFsIGludFtdIG1MYXN0Mk5leHQgPSBuZXcgaW50W01BWF9QT0lOVEVSU107Ci0gICAgICAgIGZpbmFsIGludFtdIG1OZXh0Mkxhc3QgPSBuZXcgaW50W01BWF9QT0lOVEVSU107Ci0gICAgICAgIGZpbmFsIGxvbmdbXSBtTmV4dDJMYXN0RGlzdGFuY2UgPSBuZXcgbG9uZ1tNQVhfUE9JTlRFUlNdOwotICAgICAgICAKLSAgICAgICAgLy8gVGVtcG9yYXJ5IGRhdGEgc3RydWN0dXJlIGZvciBnZW5lcmF0aW5nIHRoZSBmaW5hbCBtb3Rpb24gZGF0YS4KLSAgICAgICAgZmluYWwgZmxvYXRbXSBtUmVwb3J0RGF0YSA9IG5ldyBmbG9hdFtNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEEgKiBNQVhfUE9JTlRFUlNdOwotICAgICAgICAKLSAgICAgICAgLy8gVGhpcyBpcyBub3QgdXNlZCBoZXJlLCBidXQgY2FuIGJlIHVzZWQgYnkgY2FsbGVycyBmb3Igc3RhdGUgdHJhY2tpbmcuCi0gICAgICAgIGludCBtQWRkaW5nUG9pbnRlck9mZnNldCA9IDA7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW5bXSBtRG93biA9IG5ldyBib29sZWFuW01BWF9QT0lOVEVSU107Ci0gICAgICAgIAotICAgICAgICB2b2lkIGR1bXBJbnRBcnJheShQcmludFdyaXRlciBwdywgaW50W10gYXJyYXkpIHsKLSAgICAgICAgICAgIHB3LnByaW50KCJbIik7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8YXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHB3LnByaW50KCIsICIpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KGFycmF5W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB3LnByaW50KCJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgZHVtcEJvb2xlYW5BcnJheShQcmludFdyaXRlciBwdywgYm9vbGVhbltdIGFycmF5KSB7Ci0gICAgICAgICAgICBwdy5wcmludCgiWyIpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSBwdy5wcmludCgiLCAiKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludChhcnJheVtpXSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHcucHJpbnQoIl0iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBkdW1wKFByaW50V3JpdGVyIHB3LCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgieFByZWNpc2lvbj0iKTsgcHcucHJpbnQoeFByZWNpc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgeVByZWNpc2lvbj0iKTsgcHcucHJpbnRsbih5UHJlY2lzaW9uKTsKLSAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJ4TW92ZVNjYWxlPSIpOyBwdy5wcmludCh4TW92ZVNjYWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiB5TW92ZVNjYWxlPSIpOyBwdy5wcmludGxuKHlNb3ZlU2NhbGUpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRNb3ZlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiY3VycmVudE1vdmU9Iik7IHB3LnByaW50bG4oY3VycmVudE1vdmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYW5nZWQgfHwgbURvd25UaW1lICE9IDApIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiY2hhbmdlZD0iKTsgcHcucHJpbnQoY2hhbmdlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG1Eb3duVGltZT0iKTsgcHcucHJpbnRsbihtRG93blRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1Qb2ludGVySWRzPSIpOyBkdW1wSW50QXJyYXkocHcsIG1Qb2ludGVySWRzKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiIik7Ci0gICAgICAgICAgICBpZiAobVNraXBMYXN0UG9pbnRlcnMgfHwgbUxhc3ROdW1Qb2ludGVycyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1Ta2lwTGFzdFBvaW50ZXJzPSIpOyBwdy5wcmludChtU2tpcExhc3RQb2ludGVycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG1MYXN0TnVtUG9pbnRlcnM9Iik7IHB3LnByaW50bG4obUxhc3ROdW1Qb2ludGVycyk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1MYXN0RGF0YT0iKTsgZHVtcEludEFycmF5KHB3LCBtTGFzdERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU5leHROdW1Qb2ludGVycyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1OZXh0TnVtUG9pbnRlcnM9Iik7IHB3LnByaW50bG4obU5leHROdW1Qb2ludGVycyk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1OZXh0RGF0YT0iKTsgZHVtcEludEFycmF5KHB3LCBtTmV4dERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibURyb3BwZWRCYWRQb2ludD0iKTsKLSAgICAgICAgICAgICAgICAgICAgZHVtcEJvb2xlYW5BcnJheShwdywgbURyb3BwZWRCYWRQb2ludCk7IHB3LnByaW50bG4oIiIpOwotICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1BZGRpbmdQb2ludGVyT2Zmc2V0PSIpOyBwdy5wcmludGxuKG1BZGRpbmdQb2ludGVyT2Zmc2V0KTsKLSAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtRG93bj0iKTsKLSAgICAgICAgICAgICAgICAgICAgZHVtcEJvb2xlYW5BcnJheShwdywgbURvd24pOyBwdy5wcmludGxuKCIiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTW90aW9uU3RhdGUoaW50IG14LCBpbnQgbXkpIHsKLSAgICAgICAgICAgIHhQcmVjaXNpb24gPSBteDsKLSAgICAgICAgICAgIHlQcmVjaXNpb24gPSBteTsKLSAgICAgICAgICAgIHhNb3ZlU2NhbGUgPSBteCAhPSAwID8gKDEuMGYvbXgpIDogMS4wZjsKLSAgICAgICAgICAgIHlNb3ZlU2NhbGUgPSBteSAhPSAwID8gKDEuMGYvbXkpIDogMS4wZjsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxNQVhfUE9JTlRFUlM7IGkrKykgewotICAgICAgICAgICAgICAgIG1Qb2ludGVySWRzW2ldID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNwZWNpYWwgaGFjayBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgYmFkIHNjcmVlbiBkYXRhOiBpZiBvbmUgb2YgdGhlCi0gICAgICAgICAqIHBvaW50cyBoYXMgbW92ZWQgbW9yZSB0aGFuIGEgc2NyZWVuIGhlaWdodCBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLAotICAgICAgICAgKiB0aGVuIGRyb3AgaXQuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIGRyb3BCYWRQb2ludChJbnB1dERldmljZSBkZXYpIHsKLSAgICAgICAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgaGF2ZSBhYnNZLCBidXQgbGV0J3MgYmUgcGFyYW5vaWQuCi0gICAgICAgICAgICBpZiAoZGV2LmFic1kgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGEgZmluZ2VyIGlzIGdvaW5nIGRvd24gb3IgdXAuICBXZSBydW4KLSAgICAgICAgICAgIC8vIGhlcmUgYmVmb3JlIGFzc2lnbmluZyBwb2ludGVyIElEcywgc28gdGhlcmUgaXNuJ3QgYSBnb29kCi0gICAgICAgICAgICAvLyB3YXkgdG8gZG8gcGVyLWZpbmdlciBtYXRjaGluZy4KLSAgICAgICAgICAgIGlmIChtTmV4dE51bVBvaW50ZXJzICE9IG1MYXN0TnVtUG9pbnRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIGNvbnNpZGVyIGEgc2luZ2xlIG1vdmVtZW50IGFjcm9zcyBtb3JlIHRoYW4gYSA3LzE2IG9mCi0gICAgICAgICAgICAvLyB0aGUgbG9uZyBzaXplIG9mIHRoZSBzY3JlZW4gdG8gYmUgYmFkLiAgVGhpcyB3YXMgYSBtYWdpYyB2YWx1ZQotICAgICAgICAgICAgLy8gZGV0ZXJtaW5lZCBieSBsb29raW5nIGF0IHRoZSBtYXhpbXVtIGRpc3RhbmNlIGl0IGlzIGZlYXNpYmxlCi0gICAgICAgICAgICAvLyB0byBhY3R1YWxseSBtb3ZlIGluIG9uZSBzYW1wbGUuCi0gICAgICAgICAgICBmaW5hbCBpbnQgbWF4RHkgPSAoKGRldi5hYnNZLm1heFZhbHVlLWRldi5hYnNZLm1pblZhbHVlKSo3KS8xNjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTG9vayB0aHJvdWdoIGFsbCBuZXcgcG9pbnRzIGFuZCBzZWUgaWYgYW55IGFyZSBmYXJ0aGVyIHRoYW4KLSAgICAgICAgICAgIC8vIGFjY2VwdGFibGUgZnJvbSBhbGwgcHJldmlvdXMgcG9pbnRzLgotICAgICAgICAgICAgZm9yIChpbnQgaT1tTmV4dE51bVBvaW50ZXJzLTE7IGk+PTA7IGktLSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBpb2ZmID0gaSAqIE1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQTsKLSAgICAgICAgICAgICAgICAvL2ZpbmFsIGludCB4ID0gbU5leHREYXRhW2lvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfWF07Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHkgPSBtTmV4dERhdGFbaW9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9ZXTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfSEFDS1MpIFNsb2cudigiSW5wdXREZXZpY2UiLCAiTG9va2luZyBhdCBuZXh0IHBvaW50ICMiICsgaSArICI6IHk9IiArIHkpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZHJvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmICghbURyb3BwZWRCYWRQb2ludFtpXSAmJiBtTGFzdE51bVBvaW50ZXJzID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkcm9wcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNsb3Nlc3REeSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2xvc2VzdFkgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCBkcm9wIHRoaXMgbmV3IHBvaW50IGlmIGl0IGlzIHN1ZmZpY2llbnRseQotICAgICAgICAgICAgICAgICAgICAvLyBmYXIgYXdheSBmcm9tIC1hbGwtIGxhc3QgcG9pbnRzLgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqPW1MYXN0TnVtUG9pbnRlcnMtMTsgaj49MDsgai0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgam9mZiA9IGogKiBNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2ludCBkeCA9IHggLSBtTGFzdERhdGFbam9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkeSA9IHkgLSBtTGFzdERhdGFbam9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9ZXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKGR4IDwgMCkgZHggPSAtZHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHkgPCAwKSBkeSA9IC1keTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19IQUNLUykgU2xvZy52KCJJbnB1dERldmljZSIsICJDb21wYXJpbmcgd2l0aCBsYXN0IHBvaW50ICMiICsgagotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IHk9IiArIG1MYXN0RGF0YVtqb2ZmXSArICIgZHk9IiArIGR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeSA8IG1heER5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbG9zZXN0RHkgPCAwIHx8IGR5IDwgY2xvc2VzdER5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdER5ID0gZHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdFkgPSBtTGFzdERhdGFbam9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9ZXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcHBlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoIklucHV0RGV2aWNlIiwgIkRyb3BwaW5nIGJhZCBwb2ludCAjIiArIGkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBuZXdZPSIgKyB5ICsgIiBjbG9zZXN0RHk9IiArIGNsb3Nlc3REeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbWF4RHk9IiArIG1heER5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0RGF0YVtpb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1ldID0gY2xvc2VzdFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRHJvcHBlZEJhZFBvaW50W2ldID0gZHJvcHBlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBkcm9wSnVtcHlQb2ludChJbnB1dERldmljZSBkZXYpIHsKLSAgICAgICAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgaGF2ZSBhYnNZLCBidXQgbGV0J3MgYmUgcGFyYW5vaWQuCi0gICAgICAgICAgICBpZiAoZGV2LmFic1kgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCBqdW1weUVwc2lsb24gPSBkZXYuYWJzWS5yYW5nZSAvIEpVTVBZX0VQU0lMT05fRElWSVNPUjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgaW50IG5leHROdW1Qb2ludGVycyA9IG1OZXh0TnVtUG9pbnRlcnM7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGFzdE51bVBvaW50ZXJzID0gbUxhc3ROdW1Qb2ludGVyczsKLSAgICAgICAgICAgIGZpbmFsIGludFtdIG5leHREYXRhID0gbU5leHREYXRhOwotICAgICAgICAgICAgZmluYWwgaW50W10gbGFzdERhdGEgPSBtTGFzdERhdGE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChuZXh0TnVtUG9pbnRlcnMgIT0gbUxhc3ROdW1Qb2ludGVycykgewotICAgICAgICAgICAgICAgIGlmIChERUJVR19IQUNLUykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoIklucHV0RGV2aWNlIiwgIkRpZmZlcmVudCBwb2ludGVyIGNvdW50ICIgKyBsYXN0TnVtUG9pbnRlcnMgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC0+ICIgKyBuZXh0TnVtUG9pbnRlcnMpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5leHROdW1Qb2ludGVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW9mZiA9IGkgKiBNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoIklucHV0RGV2aWNlIiwgIlBvaW50ZXIgIiArIGkgKyAiICgiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0RGF0YVtpb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1hdICsgIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0RGF0YVtpb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1ldICsgIikiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBKdXN0IGRyb3AgdGhlIGZpcnN0IGZldyBldmVudHMgZ29pbmcgZnJvbSAxIHRvIDIgcG9pbnRlcnMuCi0gICAgICAgICAgICAgICAgLy8gVGhleSdyZSBiYWQgb2Z0ZW4gZW5vdWdoIHRoYXQgdGhleSdyZSBub3Qgd29ydGggY29uc2lkZXJpbmcuCi0gICAgICAgICAgICAgICAgaWYgKGxhc3ROdW1Qb2ludGVycyA9PSAxICYmIG5leHROdW1Qb2ludGVycyA9PSAyCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtSnVtcHlQb2ludHNEcm9wcGVkIDwgSlVNUFlfVFJBTlNJVElPTl9EUk9QUykgewotICAgICAgICAgICAgICAgICAgICBtTmV4dE51bVBvaW50ZXJzID0gMTsKLSAgICAgICAgICAgICAgICAgICAgbUp1bXB5UG9pbnRzRHJvcHBlZCsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdE51bVBvaW50ZXJzID09IDIgJiYgbmV4dE51bVBvaW50ZXJzID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1KdW1weVBvaW50c0Ryb3BwZWQgPCBKVU1QWV9UUkFOU0lUSU9OX0RST1BTKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCB3aGVuIHdlIGdvIGZyb20gMiAtPiAxIHRlbmRzIHRvIGJlIG1lc3NlZCB1cCB0b28KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShsYXN0RGF0YSwgMCwgbmV4dERhdGEsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROdW1Qb2ludGVycyAqIE1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQSk7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXh0TnVtUG9pbnRlcnMgPSBsYXN0TnVtUG9pbnRlcnM7Ci0gICAgICAgICAgICAgICAgICAgIG1KdW1weVBvaW50c0Ryb3BwZWQrKzsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19IQUNLUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmV4dE51bVBvaW50ZXJzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW9mZiA9IGkgKiBNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKCJJbnB1dERldmljZSIsICJQb2ludGVyICIgKyBpICsgIiByZXBsYWNlZCAoIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5leHREYXRhW2lvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfWF0gKyAiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0RGF0YVtpb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1ldICsgIikiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1KdW1weVBvaW50c0Ryb3BwZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0hBQ0tTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoIklucHV0RGV2aWNlIiwgIlRyYW5zaXRpb24gLSBkcm9wIGxpbWl0IHJlc2V0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBICdqdW1weScgcG9pbnQgaXMgb25lIHdoZXJlIHRoZSBjb29yZGluYXRlIHZhbHVlIGZvciBvbmUgYXhpcwotICAgICAgICAgICAgLy8gaGFzIGp1bXBlZCB0byB0aGUgb3RoZXIgcG9pbnRlcidzIGxvY2F0aW9uLiBObyBuZWVkIHRvIGRvIGFueXRoaW5nCi0gICAgICAgICAgICAvLyBlbHNlIGlmIHdlIG9ubHkgaGF2ZSBvbmUgcG9pbnRlci4KLSAgICAgICAgICAgIGlmIChuZXh0TnVtUG9pbnRlcnMgPCAyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgYmFkUG9pbnRlckluZGV4ID0gLTE7Ci0gICAgICAgICAgICBpbnQgYmFkUG9pbnRlclJlcGxhY2VYV2l0aCA9IDA7Ci0gICAgICAgICAgICBpbnQgYmFkUG9pbnRlclJlcGxhY2VZV2l0aCA9IDA7Ci0gICAgICAgICAgICBpbnQgYmFkUG9pbnRlckRpc3RhbmNlID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbmV4dE51bVBvaW50ZXJzIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRyb3B4ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkcm9weSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIExpbWl0IGhvdyBtYW55IHRpbWVzIGEganVtcHkgcG9pbnQgY2FuIGdldCBkcm9wcGVkLgotICAgICAgICAgICAgICAgIGlmIChtSnVtcHlQb2ludHNEcm9wcGVkIDwgSlVNUFlfRFJPUF9MSU1JVCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW9mZiA9IGkgKiBNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEE7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB4ID0gbmV4dERhdGFbaW9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHkgPSBuZXh0RGF0YVtpb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1ldOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0hBQ0tTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoIklucHV0RGV2aWNlIiwgIlBvaW50ICIgKyBpICsgIiAoIiArIHggKyAiLCAiICsgeSArICIpIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhIHRvdWNoIHBvaW50IGlzIHRvbyBjbG9zZSB0byBhbm90aGVyJ3MgY29vcmRpbmF0ZXMKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuZXh0TnVtUG9pbnRlcnMgJiYgIWRyb3B4ICYmICFkcm9weTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBqb2ZmID0gaiAqIE1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB4T3RoZXIgPSBuZXh0RGF0YVtqb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1hdOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHlPdGhlciA9IG5leHREYXRhW2pvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfWV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRyb3B4ID0gTWF0aC5hYnMoeCAtIHhPdGhlcikgPD0ganVtcHlFcHNpbG9uOwotICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHkgPSBNYXRoLmFicyh5IC0geU90aGVyKSA8PSBqdW1weUVwc2lsb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChkcm9weCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhyZXBsYWNlID0gbGFzdERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1hdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlyZXBsYWNlID0gbGFzdERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1ldOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlID0gTWF0aC5hYnMoeXJlcGxhY2UgLSB5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgbGFzdE51bVBvaW50ZXJzOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgam9mZiA9IGogKiBNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3R5ID0gbGFzdERhdGFbam9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9ZXTsgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VyckRpc3QgPSBNYXRoLmFicyhsYXN0eSAtIHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyRGlzdCA8IGRpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhyZXBsYWNlID0gbGFzdERhdGFbam9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXJlcGxhY2UgPSBsYXN0eTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBjdXJyRGlzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYWRYRGVsdGEgPSBNYXRoLmFicyh4cmVwbGFjZSAtIHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhZFhEZWx0YSA+IGJhZFBvaW50ZXJEaXN0YW5jZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZFBvaW50ZXJEaXN0YW5jZSA9IGJhZFhEZWx0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRQb2ludGVySW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZFBvaW50ZXJSZXBsYWNlWFdpdGggPSB4cmVwbGFjZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRQb2ludGVyUmVwbGFjZVlXaXRoID0geXJlcGxhY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJvcHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB4cmVwbGFjZSA9IGxhc3REYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9YXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB5cmVwbGFjZSA9IGxhc3REYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9ZXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXN0YW5jZSA9IE1hdGguYWJzKHhyZXBsYWNlIC0geCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IGxhc3ROdW1Qb2ludGVyczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGpvZmYgPSBqICogTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0eCA9IGxhc3REYXRhW2pvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfWF07ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN1cnJEaXN0ID0gTWF0aC5hYnMobGFzdHggLSB4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyckRpc3QgPCBkaXN0YW5jZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cmVwbGFjZSA9IGxhc3R4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5cmVwbGFjZSA9IGxhc3REYXRhW2pvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfWV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gY3VyckRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFkWURlbHRhID0gTWF0aC5hYnMoeXJlcGxhY2UgLSB5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWRZRGVsdGEgPiBiYWRQb2ludGVyRGlzdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRQb2ludGVyRGlzdGFuY2UgPSBiYWRZRGVsdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkUG9pbnRlckluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRQb2ludGVyUmVwbGFjZVhXaXRoID0geHJlcGxhY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkUG9pbnRlclJlcGxhY2VZV2l0aCA9IHlyZXBsYWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJhZFBvaW50ZXJJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX0hBQ0tTKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZCgiSW5wdXREZXZpY2UiLCAiUmVwbGFjaW5nIGJhZCBwb2ludGVyICIgKyBiYWRQb2ludGVySW5kZXggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCAoIiArIGJhZFBvaW50ZXJSZXBsYWNlWFdpdGggKyAiLCAiICsgYmFkUG9pbnRlclJlcGxhY2VZV2l0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0ID0gYmFkUG9pbnRlckluZGV4ICogTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBOwotICAgICAgICAgICAgICAgIG5leHREYXRhW29mZnNldCArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXSA9IGJhZFBvaW50ZXJSZXBsYWNlWFdpdGg7Ci0gICAgICAgICAgICAgICAgbmV4dERhdGFbb2Zmc2V0ICsgTW90aW9uRXZlbnQuU0FNUExFX1ldID0gYmFkUG9pbnRlclJlcGxhY2VZV2l0aDsKLSAgICAgICAgICAgICAgICBtSnVtcHlQb2ludHNEcm9wcGVkKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1KdW1weVBvaW50c0Ryb3BwZWQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU3BlY2lhbCBoYWNrIGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBiYWQgc2NyZWVuIGRhdGE6IGFnZ3JlZ2F0ZSBhbmQKLSAgICAgICAgICogY29tcHV0ZSBhdmVyYWdlcyBvZiB0aGUgY29vcmRpbmF0ZSBkYXRhLCB0byByZWR1Y2UgdGhlIGFtb3VudCBvZgotICAgICAgICAgKiBqaXR0ZXIgc2VlbiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBpbnRbXSBnZW5lcmF0ZUF2ZXJhZ2VkRGF0YShpbnQgdXBPckRvd25Qb2ludGVyLCBpbnQgbGFzdE51bVBvaW50ZXJzLAotICAgICAgICAgICAgICAgIGludCBuZXh0TnVtUG9pbnRlcnMpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBudW1Qb2ludGVycyA9IG1MYXN0TnVtUG9pbnRlcnM7Ci0gICAgICAgICAgICBmaW5hbCBpbnRbXSByYXdEYXRhID0gbUxhc3REYXRhOwotICAgICAgICAgICAgaWYgKERFQlVHX0hBQ0tTKSBTbG9nLnYoIklucHV0RGV2aWNlIiwgImxhc3ROdW1Qb2ludGVycz0iICsgbGFzdE51bVBvaW50ZXJzCi0gICAgICAgICAgICAgICAgICAgICsgIiBuZXh0TnVtUG9pbnRlcnM9IiArIG5leHROdW1Qb2ludGVycwotICAgICAgICAgICAgICAgICAgICArICIgbnVtUG9pbnRlcnM9IiArIG51bVBvaW50ZXJzKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1Qb2ludGVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGlvZmYgPSBpICogTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBOwotICAgICAgICAgICAgICAgIC8vIFdlIGtlZXAgdGhlIGF2ZXJhZ2UgZGF0YSBpbiBvZmZzZXRzIGJhc2VkIG9uIHRoZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgLy8gSUQsIHNvIHdlIGRvbid0IG5lZWQgdG8gbW92ZSBpdCBhcm91bmQgYXMgZmluZ2VycyBhcmUKLSAgICAgICAgICAgICAgICAvLyBwcmVzc2VkIGFuZCByZWxlYXNlZC4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcCA9IG1Qb2ludGVySWRzW2ldOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb2ZmID0gcCAqIE1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQSAqIEhJU1RPUllfU0laRTsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSB1cE9yRG93blBvaW50ZXIgJiYgbGFzdE51bVBvaW50ZXJzICE9IG5leHROdW1Qb2ludGVycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdE51bVBvaW50ZXJzIDwgbmV4dE51bVBvaW50ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHBvaW50ZXIgaXMgZ29pbmcgZG93bi4gIENsZWFyIGl0cyBoaXN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc3RhcnQgZnJlc2guCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfSEFDS1MpIFNsb2cudigiSW5wdXREZXZpY2UiLCAiUG9pbnRlciBkb3duIEAgaW5kZXggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVwT3JEb3duUG9pbnRlciArICIgaWQgIiArIG1Qb2ludGVySWRzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IaXN0b3J5RGF0YVN0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IaXN0b3J5RGF0YUVuZFtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJhd0RhdGEsIGlvZmYsIG1IaXN0b3J5RGF0YSwgcG9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmF3RGF0YSwgaW9mZiwgbUF2ZXJhZ2VkRGF0YSwgaW9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHBvaW50ZXIgaXMgZ29pbmcgdXAuICBKdXN0IGZhbGwgdGhyb3VnaCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21wdXRlIHRoZSBsYXN0IGF2ZXJhZ2VkIHBvaW50IChhbmQgZG9uJ3QgYWRkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBhcyBhIG5ldyBwb2ludCB0byBpbmNsdWRlIGluIHRoZSBhdmVyYWdlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19IQUNLUykgU2xvZy52KCJJbnB1dERldmljZSIsICJQb2ludGVyIHVwIEAgaW5kZXggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVwT3JEb3duUG9pbnRlciArICIgaWQgIiArIG1Qb2ludGVySWRzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSBtSGlzdG9yeURhdGFFbmRbaV07Ci0gICAgICAgICAgICAgICAgICAgIGludCBlb2ZmID0gcG9mZiArIChlbmQqTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9sZFggPSBtSGlzdG9yeURhdGFbZW9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtSGlzdG9yeURhdGFbZW9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9ZXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld1ggPSByYXdEYXRhW2lvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfWF07Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdZID0gcmF3RGF0YVtpb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1ldOwotICAgICAgICAgICAgICAgICAgICBpbnQgZHggPSBuZXdYLW9sZFg7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkeSA9IG5ld1ktb2xkWTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gZHgqZHggKyBkeSpkeTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0hBQ0tTKSBTbG9nLnYoIklucHV0RGV2aWNlIiwgIkRlbHRhIGZyb20gbGFzdDogIiArIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID49ICg3NSo3NSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hZ2ljIG51bWJlciwgaWYgbW92aW5nIGZhcnRoZXIgdGhhbiB0aGlzLCB0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmYgZmlsdGVyaW5nIHRvIGF2b2lkIGxhZyBpbiByZXNwb25zZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1IaXN0b3J5RGF0YVN0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IaXN0b3J5RGF0YUVuZFtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJhd0RhdGEsIGlvZmYsIG1IaXN0b3J5RGF0YSwgcG9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmF3RGF0YSwgaW9mZiwgbUF2ZXJhZ2VkRGF0YSwgaW9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5kKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kID49IEhJU1RPUllfU0laRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtPSBISVNUT1JZX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGlzdG9yeURhdGFFbmRbaV0gPSBlbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9mZiA9IHBvZmYgKyAoZW5kKk1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGlzdG9yeURhdGFbbm9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXSA9IG5ld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGlzdG9yeURhdGFbbm9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9ZXSA9IG5ld1k7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGlzdG9yeURhdGFbbm9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9QUkVTU1VSRV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByYXdEYXRhW2lvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfUFJFU1NVUkVdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbUhpc3RvcnlEYXRhU3RhcnRbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gSElTVE9SWV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IC09IEhJU1RPUllfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhpc3RvcnlEYXRhU3RhcnRbaV0gPSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3cgY29tcHV0ZSB0aGUgYXZlcmFnZS4KLSAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBtSGlzdG9yeURhdGFTdGFydFtpXTsKLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gbUhpc3RvcnlEYXRhRW5kW2ldOwotICAgICAgICAgICAgICAgIGludCB4PTAsIHk9MDsKLSAgICAgICAgICAgICAgICBpbnQgdG90YWxQcmVzc3VyZSA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHN0YXJ0ICE9IGVuZCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc29mZiA9IHBvZmYgKyAoc3RhcnQqTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHByZXNzdXJlID0gbUhpc3RvcnlEYXRhW3NvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfUFJFU1NVUkVdOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJlc3N1cmUgPD0gMCkgcHJlc3N1cmUgPSAxOwotICAgICAgICAgICAgICAgICAgICB4ICs9IG1IaXN0b3J5RGF0YVtzb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1hdICogcHJlc3N1cmU7Ci0gICAgICAgICAgICAgICAgICAgIHkgKz0gbUhpc3RvcnlEYXRhW3NvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfWV0gKiBwcmVzc3VyZTsKLSAgICAgICAgICAgICAgICAgICAgdG90YWxQcmVzc3VyZSArPSBwcmVzc3VyZTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IEhJU1RPUllfU0laRSkgc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgZW9mZiA9IHBvZmYgKyAoZW5kKk1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQSk7Ci0gICAgICAgICAgICAgICAgaW50IHByZXNzdXJlID0gbUhpc3RvcnlEYXRhW2VvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfUFJFU1NVUkVdOwotICAgICAgICAgICAgICAgIGlmIChwcmVzc3VyZSA8PSAwKSBwcmVzc3VyZSA9IDE7Ci0gICAgICAgICAgICAgICAgeCArPSBtSGlzdG9yeURhdGFbZW9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXSAqIHByZXNzdXJlOwotICAgICAgICAgICAgICAgIHkgKz0gbUhpc3RvcnlEYXRhW2VvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfWV0gKiBwcmVzc3VyZTsKLSAgICAgICAgICAgICAgICB0b3RhbFByZXNzdXJlICs9IHByZXNzdXJlOwotICAgICAgICAgICAgICAgIHggLz0gdG90YWxQcmVzc3VyZTsKLSAgICAgICAgICAgICAgICB5IC89IHRvdGFsUHJlc3N1cmU7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX0hBQ0tTKSBTbG9nLnYoIklucHV0RGV2aWNlIiwgIkF2ZXJhZ2luZyAiICsgdG90YWxQcmVzc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdlaWdodDogKCIgKyB4ICsgIiwiICsgeSArICIpIik7Ci0gICAgICAgICAgICAgICAgbUF2ZXJhZ2VkRGF0YVtpb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1hdID0geDsKLSAgICAgICAgICAgICAgICBtQXZlcmFnZWREYXRhW2lvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfWV0gPSB5OwotICAgICAgICAgICAgICAgIG1BdmVyYWdlZERhdGFbaW9mZiArIE1vdGlvbkV2ZW50LlNBTVBMRV9QUkVTU1VSRV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgcmF3RGF0YVtpb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1BSRVNTVVJFXTsKLSAgICAgICAgICAgICAgICBtQXZlcmFnZWREYXRhW2lvZmYgKyBNb3Rpb25FdmVudC5TQU1QTEVfU0laRV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgcmF3RGF0YVtpb2ZmICsgTW90aW9uRXZlbnQuU0FNUExFX1NJWkVdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1BdmVyYWdlZERhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBhc3NpZ25Qb2ludGVyKGludCBuZXh0SW5kZXgsIGJvb2xlYW4gYWxsb3dPdmVybGFwKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGFzdE51bVBvaW50ZXJzID0gbUxhc3ROdW1Qb2ludGVyczsKLSAgICAgICAgICAgIGZpbmFsIGludFtdIG5leHQyTGFzdCA9IG1OZXh0Mkxhc3Q7Ci0gICAgICAgICAgICBmaW5hbCBsb25nW10gbmV4dDJMYXN0RGlzdGFuY2UgPSBtTmV4dDJMYXN0RGlzdGFuY2U7Ci0gICAgICAgICAgICBmaW5hbCBpbnRbXSBsYXN0Mk5leHQgPSBtTGFzdDJOZXh0OwotICAgICAgICAgICAgZmluYWwgaW50W10gbGFzdERhdGEgPSBtTGFzdERhdGE7Ci0gICAgICAgICAgICBmaW5hbCBpbnRbXSBuZXh0RGF0YSA9IG1OZXh0RGF0YTsKLSAgICAgICAgICAgIGZpbmFsIGludCBpZCA9IG5leHRJbmRleCAqIE1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKERFQlVHX1BPSU5URVJTKSBTbG9nLnYoIklucHV0RGV2aWNlIiwgImFzc2lnblBvaW50ZXI6IG5leHRJbmRleD0iCi0gICAgICAgICAgICAgICAgICAgICsgbmV4dEluZGV4ICsgIiBkYXRhT2ZmPSIgKyBpZCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgeDEgPSBuZXh0RGF0YVtpZCArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXTsKLSAgICAgICAgICAgIGZpbmFsIGludCB5MSA9IG5leHREYXRhW2lkICsgTW90aW9uRXZlbnQuU0FNUExFX1ldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBsb25nIGJlc3REaXN0YW5jZSA9IC0xOwotICAgICAgICAgICAgaW50IGJlc3RJbmRleCA9IC0xOwotICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPGxhc3ROdW1Qb2ludGVyczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBhbGxvd2luZyBtdWx0aXBsZSBuZXcgcG9pbnRzIHRvIGJlIGFzc2lnbmVkCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIHNhbWUgb2xkIHBvaW50ZXIsIHRoZW4gc2tpcCB0aGlzIG9uZSBpZiBpdCBpcyBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgLy8gZGV0ZWN0ZWQgYXMgYSBjb25mbGljdCAoLTIpLgotICAgICAgICAgICAgICAgIGlmICghYWxsb3dPdmVybGFwICYmIGxhc3QyTmV4dFtqXSA8IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgamQgPSBqICogTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB4ZCA9IGxhc3REYXRhW2pkICsgTW90aW9uRXZlbnQuU0FNUExFX1hdIC0geDE7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHlkID0gbGFzdERhdGFbamQgKyBNb3Rpb25FdmVudC5TQU1QTEVfWV0gLSB5MTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGRpc3RhbmNlID0geGQqKGxvbmcpeGQgKyB5ZCoobG9uZyl5ZDsKLSAgICAgICAgICAgICAgICBpZiAoYmVzdERpc3RhbmNlID09IC0xIHx8IGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlOwotICAgICAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBqOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKERFQlVHX1BPSU5URVJTKSBTbG9nLnYoIklucHV0RGV2aWNlIiwgIk5ldyBpbmRleCAiICsgbmV4dEluZGV4Ci0gICAgICAgICAgICAgICAgICAgICsgIiBiZXN0IG9sZCBpbmRleD0iICsgYmVzdEluZGV4ICsgIiAoZGlzdGFuY2U9IgotICAgICAgICAgICAgICAgICAgICArIGJlc3REaXN0YW5jZSArICIpIik7Ci0gICAgICAgICAgICBuZXh0Mkxhc3RbbmV4dEluZGV4XSA9IGJlc3RJbmRleDsKLSAgICAgICAgICAgIG5leHQyTGFzdERpc3RhbmNlW25leHRJbmRleF0gPSBiZXN0RGlzdGFuY2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChiZXN0SW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsYXN0Mk5leHRbYmVzdEluZGV4XSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGxhc3QyTmV4dFtiZXN0SW5kZXhdID0gbmV4dEluZGV4OwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKERFQlVHX1BPSU5URVJTKSBTbG9nLnYoIklucHV0RGV2aWNlIiwgIk9sZCBpbmRleCAiICsgYmVzdEluZGV4Ci0gICAgICAgICAgICAgICAgICAgICsgIiBoYXMgbXVsdGlwbGUgYmVzdCBuZXcgcG9pbnRlcnMhIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGxhc3QyTmV4dFtiZXN0SW5kZXhdID0gLTI7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBpbnQgdXBkYXRlUG9pbnRlcklkZW50aWZpZXJzKCkgewotICAgICAgICAgICAgZmluYWwgaW50W10gbGFzdERhdGEgPSBtTGFzdERhdGE7Ci0gICAgICAgICAgICBmaW5hbCBpbnRbXSBuZXh0RGF0YSA9IG1OZXh0RGF0YTsKLSAgICAgICAgICAgIGZpbmFsIGludCBuZXh0TnVtUG9pbnRlcnMgPSBtTmV4dE51bVBvaW50ZXJzOwotICAgICAgICAgICAgZmluYWwgaW50IGxhc3ROdW1Qb2ludGVycyA9IG1MYXN0TnVtUG9pbnRlcnM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChuZXh0TnVtUG9pbnRlcnMgPT0gMSAmJiBsYXN0TnVtUG9pbnRlcnMgPT0gMSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV4dERhdGEsIDAsIGxhc3REYXRhLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENsZWFyIG91ciBvbGQgc3RhdGUuCi0gICAgICAgICAgICBmaW5hbCBpbnRbXSBsYXN0Mk5leHQgPSBtTGFzdDJOZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxhc3ROdW1Qb2ludGVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbGFzdDJOZXh0W2ldID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChERUJVR19QT0lOVEVSUykgU2xvZy52KCJJbnB1dERldmljZSIsCi0gICAgICAgICAgICAgICAgICAgICJVcGRhdGUgcG9pbnRlcnM6IGxhc3ROdW1Qb2ludGVycz0iICsgbGFzdE51bVBvaW50ZXJzCi0gICAgICAgICAgICAgICAgICAgICsgIiBuZXh0TnVtUG9pbnRlcnM9IiArIG5leHROdW1Qb2ludGVycyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIGNsb3NlcyBuZXcgcG9pbnRzIHRvIHRoZSBwcmV2aW91cyBwb2ludHMuCi0gICAgICAgICAgICBmaW5hbCBpbnRbXSBuZXh0Mkxhc3QgPSBtTmV4dDJMYXN0OwotICAgICAgICAgICAgZmluYWwgbG9uZ1tdIG5leHQyTGFzdERpc3RhbmNlID0gbU5leHQyTGFzdERpc3RhbmNlOwotICAgICAgICAgICAgYm9vbGVhbiBjb25mbGljdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxuZXh0TnVtUG9pbnRlcnM7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbmZsaWN0cyB8PSBhc3NpZ25Qb2ludGVyKGksIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZXNvbHZlIGFtYmlndWl0aWVzIGluIHBvaW50ZXIgbWFwcGluZ3MsIHdoZW4gdHdvIG9yIG1vcmUKLSAgICAgICAgICAgIC8vIG5ldyBwb2ludGVyIGxvY2F0aW9ucyBmaW5kIHRoZWlyIGJlc3QgcHJldmlvdXMgbG9jYXRpb24gaXMKLSAgICAgICAgICAgIC8vIHRoZSBzYW1lLgotICAgICAgICAgICAgaWYgKGNvbmZsaWN0cykgewotICAgICAgICAgICAgICAgIGlmIChERUJVR19QT0lOVEVSUykgU2xvZy52KCJJbnB1dERldmljZSIsICJSZXNvbHZpbmcgY29uZmxpY3RzIik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxhc3ROdW1Qb2ludGVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Mk5leHRbaV0gIT0gLTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gaXMgZmFyIGZyb20gcGVyZmVjdC4gIElkZWFsbHkKLSAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBvbmUgZGVzY3JpYmVkIGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9wb3J0YWwuYWNtLm9yZy9jaXRhdGlvbi5jZm0/aWQ9OTk3ODU2Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfUE9JTlRFUlMpIFNsb2cudigiSW5wdXREZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNvbHZpbmcgbGFzdCBpbmRleCAjIiArIGkpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IG51bUZvdW5kOwotICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1Gb3VuZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHdvcnN0RGlzdGFuY2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdvcnN0SiA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPG5leHROdW1Qb2ludGVyczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQyTGFzdFtqXSAhPSBpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Gb3VuZCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JzdERpc3RhbmNlIDwgbmV4dDJMYXN0RGlzdGFuY2Vbal0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3REaXN0YW5jZSA9IG5leHQyTGFzdERpc3RhbmNlW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdEogPSBqOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcnN0SiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX1BPSU5URVJTKSBTbG9nLnYoIklucHV0RGV2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXb3JzdCBuZXcgcG9pbnRlcjogIiArIHdvcnN0SgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIChkaXN0YW5jZT0iICsgd29yc3REaXN0YW5jZSArICIpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFzc2lnblBvaW50ZXIod29yc3RKLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHRoZXJlIGlzIG5vIGxhc3QgcG9pbnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1haW5pbmcgZm9yIHRoaXMgbmV3IG9uZSEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDJMYXN0W3dvcnN0Sl0gPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG51bUZvdW5kID4gMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgcmV0SW5kZXggPSAtMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxhc3ROdW1Qb2ludGVycyA8IG5leHROdW1Qb2ludGVycykgewotICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgb25lIG9yIG1vcmUgbmV3IHBvaW50ZXJzIHRoYXQgYXJlIGRvd24uICBDcmVhdGUgYQotICAgICAgICAgICAgICAgIC8vIG5ldyBwb2ludGVyIGlkZW50aWZpZXIgZm9yIG9uZSBvZiB0aGVtLgotICAgICAgICAgICAgICAgIGlmIChERUJVR19QT0lOVEVSUykgU2xvZy52KCJJbnB1dERldmljZSIsICJBZGRpbmcgbmV3IHBvaW50ZXIiKTsKLSAgICAgICAgICAgICAgICBpbnQgbmV4dElkID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgaT0wOwotICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbGFzdE51bVBvaW50ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUG9pbnRlcklkc1tpXSA+IG5leHRJZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm91bmQgYSBob2xlLCBpbnNlcnQgdGhlIHBvaW50ZXIgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19QT0lOVEVSUykgU2xvZy52KCJJbnB1dERldmljZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnNlcnRpbmcgbmV3IHBvaW50ZXIgYXQgaG9sZSAiICsgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1Qb2ludGVySWRzLCBpLCBtUG9pbnRlcklkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsxLCBsYXN0TnVtUG9pbnRlcnMtaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGxhc3REYXRhLCBpKk1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdERhdGEsIChpKzEpKk1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3ROdW1Qb2ludGVycy1pKSpNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEEpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuZXh0Mkxhc3QsIGksIG5leHQyTGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsxLCBsYXN0TnVtUG9pbnRlcnMtaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRJZCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfUE9JTlRFUlMpIFNsb2cudigiSW5wdXREZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgIk5ldyBwb2ludGVyIGlkICIgKyBuZXh0SWQgKyAiIGF0IGluZGV4ICIgKyBpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBtTGFzdE51bVBvaW50ZXJzKys7Ci0gICAgICAgICAgICAgICAgcmV0SW5kZXggPSBpOwotICAgICAgICAgICAgICAgIG1Qb2ludGVySWRzW2ldID0gbmV4dElkOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEFuZCBhc3NpZ24gdGhpcyBpZGVudGlmaWVyIHRvIHRoZSBmaXJzdCBuZXcgcG9pbnRlci4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8bmV4dE51bVBvaW50ZXJzOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQyTGFzdFtqXSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19QT0lOVEVSUykgU2xvZy52KCJJbnB1dERldmljZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NpZ25pbmcgbmV3IGlkIHRvIG5ldyBwb2ludGVyIGluZGV4ICIgKyBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHQyTGFzdFtqXSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGFsbCBvZiB0aGUgY3VycmVudCBkYXRhIGludG8gdGhlIGFwcHJvcHJpYXRlCi0gICAgICAgICAgICAvLyBsb2NhdGlvbiBpbiB0aGUgb2xkIGRhdGEgdG8gbWF0Y2ggdGhlIHBvaW50ZXIgSUQgdGhhdCB3YXMKLSAgICAgICAgICAgIC8vIGFzc2lnbmVkIHRvIGl0LgotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5leHROdW1Qb2ludGVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGxhc3RJbmRleCA9IG5leHQyTGFzdFtpXTsKLSAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX1BPSU5URVJTKSBTbG9nLnYoIklucHV0RGV2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29weWluZyBuZXh0IHBvaW50ZXIgaW5kZXggIiArIGkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdG8gbGFzdCBpbmRleCAiICsgbGFzdEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuZXh0RGF0YSwgaSpNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdERhdGEsIGxhc3RJbmRleCpNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsYXN0TnVtUG9pbnRlcnMgPiBuZXh0TnVtUG9pbnRlcnMpIHsKLSAgICAgICAgICAgICAgICAvLyBPbmUgb3IgbW9yZSBwb2ludGVycyBoYXMgZ29uZSB1cC4gIEZpbmQgdGhlIGZpcnN0IG9uZSwKLSAgICAgICAgICAgICAgICAvLyBhbmQgYWRqdXN0IGFjY29yZGluZ2x5LgotICAgICAgICAgICAgICAgIGlmIChERUJVR19QT0lOVEVSUykgU2xvZy52KCJJbnB1dERldmljZSIsICJSZW1vdmluZyBvbGQgcG9pbnRlciIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsYXN0TnVtUG9pbnRlcnM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdDJOZXh0W2ldID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfUE9JTlRFUlMpIFNsb2cudigiSW5wdXREZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVtb3Zpbmcgb2xkIHBvaW50ZXIgYXQgaW5kZXggIiArIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0SW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiByZXRJbmRleDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCByZW1vdmVPbGRQb2ludGVyKGludCBpbmRleCkgewotICAgICAgICAgICAgZmluYWwgaW50IGxhc3ROdW1Qb2ludGVycyA9IG1MYXN0TnVtUG9pbnRlcnM7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGxhc3ROdW1Qb2ludGVycykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVBvaW50ZXJJZHMsIGluZGV4KzEsIG1Qb2ludGVySWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGxhc3ROdW1Qb2ludGVycy1pbmRleC0xKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1MYXN0RGF0YSwgKGluZGV4KzEpKk1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGF0YSwgKGluZGV4KSpNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAobGFzdE51bVBvaW50ZXJzLWluZGV4LTEpKk1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQSk7Ci0gICAgICAgICAgICAgICAgbUxhc3ROdW1Qb2ludGVycy0tOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNb3Rpb25FdmVudCBnZW5lcmF0ZUFic01vdGlvbihJbnB1dERldmljZSBkZXZpY2UsIGxvbmcgY3VyVGltZSwKLSAgICAgICAgICAgICAgICBsb25nIGN1clRpbWVOYW5vLCBEaXNwbGF5IGRpc3BsYXksIGludCBvcmllbnRhdGlvbiwKLSAgICAgICAgICAgICAgICBpbnQgbWV0YVN0YXRlKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtU2tpcExhc3RQb2ludGVycykgewotICAgICAgICAgICAgICAgIG1Ta2lwTGFzdFBvaW50ZXJzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUxhc3ROdW1Qb2ludGVycyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtTmV4dE51bVBvaW50ZXJzIDw9IDAgJiYgbUxhc3ROdW1Qb2ludGVycyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIGludCBsYXN0TnVtUG9pbnRlcnMgPSBtTGFzdE51bVBvaW50ZXJzOwotICAgICAgICAgICAgZmluYWwgaW50IG5leHROdW1Qb2ludGVycyA9IG1OZXh0TnVtUG9pbnRlcnM7Ci0gICAgICAgICAgICBpZiAobU5leHROdW1Qb2ludGVycyA+IE1BWF9QT0lOVEVSUykgewotICAgICAgICAgICAgICAgIFNsb2cudygiSW5wdXREZXZpY2UiLCAiTnVtYmVyIG9mIHBvaW50ZXJzICIgKyBtTmV4dE51bVBvaW50ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZXhjZWVkZWQgbWF4aW11bSBvZiAiICsgTUFYX1BPSU5URVJTKTsKLSAgICAgICAgICAgICAgICBtTmV4dE51bVBvaW50ZXJzID0gTUFYX1BPSU5URVJTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgdXBPckRvd25Qb2ludGVyID0gdXBkYXRlUG9pbnRlcklkZW50aWZpZXJzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gcmVwb3J0RGF0YSA9IG1SZXBvcnREYXRhOwotICAgICAgICAgICAgZmluYWwgaW50W10gcmF3RGF0YTsKLSAgICAgICAgICAgIGlmIChLZXlJbnB1dFF1ZXVlLkJBRF9UT1VDSF9IQUNLKSB7Ci0gICAgICAgICAgICAgICAgcmF3RGF0YSA9IGdlbmVyYXRlQXZlcmFnZWREYXRhKHVwT3JEb3duUG9pbnRlciwgbGFzdE51bVBvaW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE51bVBvaW50ZXJzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmF3RGF0YSA9IG1MYXN0RGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgaW50IG51bVBvaW50ZXJzID0gbUxhc3ROdW1Qb2ludGVyczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKERFQlVHX1BPSU5URVJTKSBTbG9nLnYoIklucHV0RGV2aWNlIiwgIlByb2Nlc3NpbmcgIgotICAgICAgICAgICAgICAgICAgICArIG51bVBvaW50ZXJzICsgIiBwb2ludGVycyAoZ29pbmcgZnJvbSAiICsgbGFzdE51bVBvaW50ZXJzCi0gICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgbmV4dE51bVBvaW50ZXJzICsgIikiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVBvaW50ZXJzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9zID0gaSAqIE1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQTsKLSAgICAgICAgICAgICAgICByZXBvcnREYXRhW3BvcyArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXSA9IHJhd0RhdGFbcG9zICsgTW90aW9uRXZlbnQuU0FNUExFX1hdOwotICAgICAgICAgICAgICAgIHJlcG9ydERhdGFbcG9zICsgTW90aW9uRXZlbnQuU0FNUExFX1ldID0gcmF3RGF0YVtwb3MgKyBNb3Rpb25FdmVudC5TQU1QTEVfWV07Ci0gICAgICAgICAgICAgICAgcmVwb3J0RGF0YVtwb3MgKyBNb3Rpb25FdmVudC5TQU1QTEVfUFJFU1NVUkVdID0gcmF3RGF0YVtwb3MgKyBNb3Rpb25FdmVudC5TQU1QTEVfUFJFU1NVUkVdOwotICAgICAgICAgICAgICAgIHJlcG9ydERhdGFbcG9zICsgTW90aW9uRXZlbnQuU0FNUExFX1NJWkVdID0gcmF3RGF0YVtwb3MgKyBNb3Rpb25FdmVudC5TQU1QTEVfU0laRV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBhY3Rpb247Ci0gICAgICAgICAgICBpbnQgZWRnZUZsYWdzID0gMDsKLSAgICAgICAgICAgIGlmIChuZXh0TnVtUG9pbnRlcnMgIT0gbGFzdE51bVBvaW50ZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHROdW1Qb2ludGVycyA+IGxhc3ROdW1Qb2ludGVycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdE51bVBvaW50ZXJzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOwotICAgICAgICAgICAgICAgICAgICAgICAgbURvd25UaW1lID0gY3VyVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodXBPckRvd25Qb2ludGVyIDw8IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0lOREVYX1NISUZUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudW1Qb2ludGVycyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fVVA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICh1cE9yRG93blBvaW50ZXIgPDwgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSU5ERVhfU0hJRlQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1cnJlbnRNb3ZlID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIGludCBkaXNwVyA9IGRpc3BsYXkuZ2V0V2lkdGgoKS0xOwotICAgICAgICAgICAgZmluYWwgaW50IGRpc3BIID0gZGlzcGxheS5nZXRIZWlnaHQoKS0xOwotICAgICAgICAgICAgaW50IHcgPSBkaXNwVzsKLSAgICAgICAgICAgIGludCBoID0gZGlzcEg7Ci0gICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gU3VyZmFjZS5ST1RBVElPTl85MAotICAgICAgICAgICAgICAgICAgICB8fCBvcmllbnRhdGlvbiA9PSBTdXJmYWNlLlJPVEFUSU9OXzI3MCkgewotICAgICAgICAgICAgICAgIGludCB0bXAgPSB3OwotICAgICAgICAgICAgICAgIHcgPSBoOwotICAgICAgICAgICAgICAgIGggPSB0bXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIEFic29sdXRlSW5mbyBhYnNYID0gZGV2aWNlLmFic1g7Ci0gICAgICAgICAgICBmaW5hbCBBYnNvbHV0ZUluZm8gYWJzWSA9IGRldmljZS5hYnNZOwotICAgICAgICAgICAgZmluYWwgQWJzb2x1dGVJbmZvIGFic1ByZXNzdXJlID0gZGV2aWNlLmFic1ByZXNzdXJlOwotICAgICAgICAgICAgZmluYWwgQWJzb2x1dGVJbmZvIGFic1NpemUgPSBkZXZpY2UuYWJzU2l6ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1Qb2ludGVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGogPSBpICogTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGFic1ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXBvcnREYXRhW2ogKyBNb3Rpb25FdmVudC5TQU1QTEVfWF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmVwb3J0RGF0YVtqICsgTW90aW9uRXZlbnQuU0FNUExFX1hdLWFic1gubWluVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gYWJzWC5yYW5nZSkgKiB3OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWJzWSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydERhdGFbaiArIE1vdGlvbkV2ZW50LlNBTVBMRV9ZXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyZXBvcnREYXRhW2ogKyBNb3Rpb25FdmVudC5TQU1QTEVfWV0tYWJzWS5taW5WYWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBhYnNZLnJhbmdlKSAqIGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhYnNQcmVzc3VyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydERhdGFbaiArIE1vdGlvbkV2ZW50LlNBTVBMRV9QUkVTU1VSRV0gPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJlcG9ydERhdGFbaiArIE1vdGlvbkV2ZW50LlNBTVBMRV9QUkVTU1VSRV0tYWJzUHJlc3N1cmUubWluVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGZsb2F0KWFic1ByZXNzdXJlLnJhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFic1NpemUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXBvcnREYXRhW2ogKyBNb3Rpb25FdmVudC5TQU1QTEVfU0laRV0gPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJlcG9ydERhdGFbaiArIE1vdGlvbkV2ZW50LlNBTVBMRV9TSVpFXS1hYnNTaXplLm1pblZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChmbG9hdClhYnNTaXplLnJhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3dpdGNoIChvcmllbnRhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFN1cmZhY2UuUk9UQVRJT05fOTA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHRlbXAgPSByZXBvcnREYXRhW2ogKyBNb3Rpb25FdmVudC5TQU1QTEVfWF07Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnREYXRhW2ogKyBNb3Rpb25FdmVudC5TQU1QTEVfWF0gPSByZXBvcnREYXRhW2ogKyBNb3Rpb25FdmVudC5TQU1QTEVfWV07Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnREYXRhW2ogKyBNb3Rpb25FdmVudC5TQU1QTEVfWV0gPSB3LXRlbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFN1cmZhY2UuUk9UQVRJT05fMTgwOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnREYXRhW2ogKyBNb3Rpb25FdmVudC5TQU1QTEVfWF0gPSB3LXJlcG9ydERhdGFbaiArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydERhdGFbaiArIE1vdGlvbkV2ZW50LlNBTVBMRV9ZXSA9IGgtcmVwb3J0RGF0YVtqICsgTW90aW9uRXZlbnQuU0FNUExFX1ldOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTdXJmYWNlLlJPVEFUSU9OXzI3MDogewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgdGVtcCA9IHJlcG9ydERhdGFbaiArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydERhdGFbaiArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXSA9IGgtcmVwb3J0RGF0YVtqICsgTW90aW9uRXZlbnQuU0FNUExFX1ldOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0RGF0YVtqICsgTW90aW9uRXZlbnQuU0FNUExFX1ldID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBXZSBvbmx5IGNvbnNpZGVyIHRoZSBmaXJzdCBwb2ludGVyIHdoZW4gY29tcHV0aW5nIHRoZSBlZGdlCi0gICAgICAgICAgICAvLyBmbGFncywgc2luY2UgdGhleSBhcmUgZ2xvYmFsIHRvIHRoZSBldmVudC4KLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKLSAgICAgICAgICAgICAgICBpZiAocmVwb3J0RGF0YVtNb3Rpb25FdmVudC5TQU1QTEVfWF0gPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBlZGdlRmxhZ3MgfD0gTW90aW9uRXZlbnQuRURHRV9MRUZUOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVwb3J0RGF0YVtNb3Rpb25FdmVudC5TQU1QTEVfWF0gPj0gZGlzcFcpIHsKLSAgICAgICAgICAgICAgICAgICAgZWRnZUZsYWdzIHw9IE1vdGlvbkV2ZW50LkVER0VfUklHSFQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXBvcnREYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9ZXSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVkZ2VGbGFncyB8PSBNb3Rpb25FdmVudC5FREdFX1RPUDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcG9ydERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1ldID49IGRpc3BIKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVkZ2VGbGFncyB8PSBNb3Rpb25FdmVudC5FREdFX0JPVFRPTTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjdXJyZW50TW92ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZhbHNlKSBTbG9nLmkoIklucHV0RGV2aWNlIiwgIkFkZGluZyBiYXRjaCB4PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcmVwb3J0RGF0YVtNb3Rpb25FdmVudC5TQU1QTEVfWF0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiB5PSIgKyByZXBvcnREYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9ZXQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRvICIgKyBjdXJyZW50TW92ZSk7Ci0gICAgICAgICAgICAgICAgY3VycmVudE1vdmUuYWRkQmF0Y2goY3VyVGltZSwgcmVwb3J0RGF0YSwgbWV0YVN0YXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclBvbGljeS5XQVRDSF9QT0lOVEVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuaSgiS2V5SW5wdXRRdWV1ZSIsICJVcGRhdGluZzogIiArIGN1cnJlbnRNb3ZlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1vdGlvbkV2ZW50IG1lID0gTW90aW9uRXZlbnQub2J0YWluTmFubyhtRG93blRpbWUsIGN1clRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGN1clRpbWVOYW5vLCBhY3Rpb24sIG51bVBvaW50ZXJzLCBtUG9pbnRlcklkcywgcmVwb3J0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbWV0YVN0YXRlLCB4UHJlY2lzaW9uLCB5UHJlY2lzaW9uLCBkZXZpY2UuaWQsIGVkZ2VGbGFncyk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudE1vdmUgPSBtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG5leHROdW1Qb2ludGVycyA8IGxhc3ROdW1Qb2ludGVycykgewotICAgICAgICAgICAgICAgIHJlbW92ZU9sZFBvaW50ZXIodXBPckRvd25Qb2ludGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGhhc01vcmUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUxhc3ROdW1Qb2ludGVycyAhPSBtTmV4dE51bVBvaW50ZXJzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGZpbmlzaCgpIHsKLSAgICAgICAgICAgIG1OZXh0TnVtUG9pbnRlcnMgPSBtQWRkaW5nUG9pbnRlck9mZnNldCA9IDA7Ci0gICAgICAgICAgICBtTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1BSRVNTVVJFXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1vdGlvbkV2ZW50IGdlbmVyYXRlUmVsTW90aW9uKElucHV0RGV2aWNlIGRldmljZSwgbG9uZyBjdXJUaW1lLAotICAgICAgICAgICAgICAgIGxvbmcgY3VyVGltZU5hbm8sIGludCBvcmllbnRhdGlvbiwgaW50IG1ldGFTdGF0ZSkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBmbG9hdFtdIHNjYWxlZCA9IG1SZXBvcnREYXRhOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCAxIHBvaW50ZXIgd2l0aCByZWxhdGl2ZSBtb3Rpb25zLgotICAgICAgICAgICAgc2NhbGVkW01vdGlvbkV2ZW50LlNBTVBMRV9YXSA9IG1OZXh0RGF0YVtNb3Rpb25FdmVudC5TQU1QTEVfWF07Ci0gICAgICAgICAgICBzY2FsZWRbTW90aW9uRXZlbnQuU0FNUExFX1ldID0gbU5leHREYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9ZXTsKLSAgICAgICAgICAgIHNjYWxlZFtNb3Rpb25FdmVudC5TQU1QTEVfUFJFU1NVUkVdID0gMS4wZjsKLSAgICAgICAgICAgIHNjYWxlZFtNb3Rpb25FdmVudC5TQU1QTEVfU0laRV0gPSAwOwotICAgICAgICAgICAgaW50IGVkZ2VGbGFncyA9IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBhY3Rpb247Ci0gICAgICAgICAgICBpZiAobU5leHROdW1Qb2ludGVycyAhPSBtTGFzdE51bVBvaW50ZXJzKSB7Ci0gICAgICAgICAgICAgICAgbU5leHREYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9YXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1ldID0gMDsKLSAgICAgICAgICAgICAgICBpZiAobU5leHROdW1Qb2ludGVycyA+IDAgJiYgbUxhc3ROdW1Qb2ludGVycyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOwotICAgICAgICAgICAgICAgICAgICBtRG93blRpbWUgPSBjdXJUaW1lOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU5leHROdW1Qb2ludGVycyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9VUDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxhc3ROdW1Qb2ludGVycyA9IG1OZXh0TnVtUG9pbnRlcnM7Ci0gICAgICAgICAgICAgICAgY3VycmVudE1vdmUgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2NhbGVkW01vdGlvbkV2ZW50LlNBTVBMRV9YXSAqPSB4TW92ZVNjYWxlOwotICAgICAgICAgICAgc2NhbGVkW01vdGlvbkV2ZW50LlNBTVBMRV9ZXSAqPSB5TW92ZVNjYWxlOwotICAgICAgICAgICAgc3dpdGNoIChvcmllbnRhdGlvbikgewotICAgICAgICAgICAgICAgIGNhc2UgU3VyZmFjZS5ST1RBVElPTl85MDogewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB0ZW1wID0gc2NhbGVkW01vdGlvbkV2ZW50LlNBTVBMRV9YXTsKLSAgICAgICAgICAgICAgICAgICAgc2NhbGVkW01vdGlvbkV2ZW50LlNBTVBMRV9YXSA9IHNjYWxlZFtNb3Rpb25FdmVudC5TQU1QTEVfWV07Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlZFtNb3Rpb25FdmVudC5TQU1QTEVfWV0gPSAtdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU3VyZmFjZS5ST1RBVElPTl8xODA6IHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbGVkW01vdGlvbkV2ZW50LlNBTVBMRV9YXSA9IC1zY2FsZWRbTW90aW9uRXZlbnQuU0FNUExFX1hdOwotICAgICAgICAgICAgICAgICAgICBzY2FsZWRbTW90aW9uRXZlbnQuU0FNUExFX1ldID0gLXNjYWxlZFtNb3Rpb25FdmVudC5TQU1QTEVfWV07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFN1cmZhY2UuUk9UQVRJT05fMjcwOiB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHRlbXAgPSBzY2FsZWRbTW90aW9uRXZlbnQuU0FNUExFX1hdOwotICAgICAgICAgICAgICAgICAgICBzY2FsZWRbTW90aW9uRXZlbnQuU0FNUExFX1hdID0gLXNjYWxlZFtNb3Rpb25FdmVudC5TQU1QTEVfWV07Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlZFtNb3Rpb25FdmVudC5TQU1QTEVfWV0gPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjdXJyZW50TW92ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZhbHNlKSBTbG9nLmkoIklucHV0RGV2aWNlIiwgIkFkZGluZyBiYXRjaCB4PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc2NhbGVkW01vdGlvbkV2ZW50LlNBTVBMRV9YXQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHk9IiArIHNjYWxlZFtNb3Rpb25FdmVudC5TQU1QTEVfWV0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgY3VycmVudE1vdmUpOwotICAgICAgICAgICAgICAgIGN1cnJlbnRNb3ZlLmFkZEJhdGNoKGN1clRpbWUsIHNjYWxlZCwgbWV0YVN0YXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclBvbGljeS5XQVRDSF9QT0lOVEVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuaSgiS2V5SW5wdXRRdWV1ZSIsICJVcGRhdGluZzogIiArIGN1cnJlbnRNb3ZlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1vdGlvbkV2ZW50IG1lID0gTW90aW9uRXZlbnQub2J0YWluTmFubyhtRG93blRpbWUsIGN1clRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGN1clRpbWVOYW5vLCBhY3Rpb24sIDEsIG1Qb2ludGVySWRzLCBzY2FsZWQsIG1ldGFTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgeFByZWNpc2lvbiwgeVByZWNpc2lvbiwgZGV2aWNlLmlkLCBlZGdlRmxhZ3MpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRNb3ZlID0gbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIGNsYXNzIEFic29sdXRlSW5mbyB7Ci0gICAgICAgIGludCBtaW5WYWx1ZTsKLSAgICAgICAgaW50IG1heFZhbHVlOwotICAgICAgICBpbnQgcmFuZ2U7Ci0gICAgICAgIGludCBmbGF0OwotICAgICAgICBpbnQgZnV6ejsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIHZvaWQgZHVtcChQcmludFdyaXRlciBwdykgewotICAgICAgICAgICAgcHcucHJpbnQoIm1pblZhbHVlPSIpOyBwdy5wcmludChtaW5WYWx1ZSk7Ci0gICAgICAgICAgICBwdy5wcmludCgiIG1heFZhbHVlPSIpOyBwdy5wcmludChtYXhWYWx1ZSk7Ci0gICAgICAgICAgICBwdy5wcmludCgiIHJhbmdlPSIpOyBwdy5wcmludChyYW5nZSk7Ci0gICAgICAgICAgICBwdy5wcmludCgiIGZsYXQ9Iik7IHB3LnByaW50KGZsYXQpOwotICAgICAgICAgICAgcHcucHJpbnQoIiBmdXp6PSIpOyBwdy5wcmludChmdXp6KTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgSW5wdXREZXZpY2UoaW50IF9pZCwgaW50IF9jbGFzc2VzLCBTdHJpbmcgX25hbWUsCi0gICAgICAgICAgICBBYnNvbHV0ZUluZm8gX2Fic1gsIEFic29sdXRlSW5mbyBfYWJzWSwKLSAgICAgICAgICAgIEFic29sdXRlSW5mbyBfYWJzUHJlc3N1cmUsIEFic29sdXRlSW5mbyBfYWJzU2l6ZSkgewotICAgICAgICBpZCA9IF9pZDsKLSAgICAgICAgY2xhc3NlcyA9IF9jbGFzc2VzOwotICAgICAgICBuYW1lID0gX25hbWU7Ci0gICAgICAgIGFic1ggPSBfYWJzWDsKLSAgICAgICAgYWJzWSA9IF9hYnNZOwotICAgICAgICBhYnNQcmVzc3VyZSA9IF9hYnNQcmVzc3VyZTsKLSAgICAgICAgYWJzU2l6ZSA9IF9hYnNTaXplOwotICAgIH0KLX07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1hbmFnZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWFuYWdlci5qYXZhCmluZGV4IDJiYTI5MTQuLmNkYWUyN2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWFuYWdlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWFuYWdlci5qYXZhCkBAIC01Niw3ICs1Niw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja3MgbUNhbGxiYWNrczsKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBXaW5kb3dNYW5hZ2VyU2VydmljZSBtV2luZG93TWFuYWdlclNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBXaW5kb3dNYW5hZ2VyUG9saWN5IG1XaW5kb3dNYW5hZ2VyUG9saWN5OwogICAgIHByaXZhdGUgZmluYWwgUG93ZXJNYW5hZ2VyIG1Qb3dlck1hbmFnZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBQb3dlck1hbmFnZXJTZXJ2aWNlIG1Qb3dlck1hbmFnZXJTZXJ2aWNlOwogICAgIApAQCAtMTAzLDEyICsxMDIsMTAgQEAKICAgICAKICAgICBwdWJsaWMgSW5wdXRNYW5hZ2VyKENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgIFdpbmRvd01hbmFnZXJTZXJ2aWNlIHdpbmRvd01hbmFnZXJTZXJ2aWNlLAotICAgICAgICAgICAgV2luZG93TWFuYWdlclBvbGljeSB3aW5kb3dNYW5hZ2VyUG9saWN5LAogICAgICAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciwKICAgICAgICAgICAgIFBvd2VyTWFuYWdlclNlcnZpY2UgcG93ZXJNYW5hZ2VyU2VydmljZSkgewogICAgICAgICB0aGlzLm1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgdGhpcy5tV2luZG93TWFuYWdlclNlcnZpY2UgPSB3aW5kb3dNYW5hZ2VyU2VydmljZTsKLSAgICAgICAgdGhpcy5tV2luZG93TWFuYWdlclBvbGljeSA9IHdpbmRvd01hbmFnZXJQb2xpY3k7CiAgICAgICAgIHRoaXMubVBvd2VyTWFuYWdlciA9IHBvd2VyTWFuYWdlcjsKICAgICAgICAgdGhpcy5tUG93ZXJNYW5hZ2VyU2VydmljZSA9IHBvd2VyTWFuYWdlclNlcnZpY2U7CiAgICAgICAgIApAQCAtMzI1LDIzICszMjIsOCBAQAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTFVERURfREVWSUNFU19QQVRIID0gImV0Yy9leGNsdWRlZC1pbnB1dC1kZXZpY2VzLnhtbCI7CiAgICAgICAgIAogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTY3JlZW5PbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG93ZXJNYW5hZ2VyU2VydmljZS5pc1NjcmVlbk9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NjcmVlbkJyaWdodCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG93ZXJNYW5hZ2VyU2VydmljZS5pc1NjcmVlbkJyaWdodCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgcHVibGljIHZvaWQgdmlydHVhbEtleUZlZWRiYWNrKGxvbmcgd2hlbk5hbm9zLCBpbnQgZGV2aWNlSWQsIGludCBhY3Rpb24sIGludCBmbGFncywKLSAgICAgICAgICAgICAgICBpbnQga2V5Q29kZSwgaW50IHNjYW5Db2RlLCBpbnQgbWV0YVN0YXRlLCBsb25nIGRvd25UaW1lTmFub3MpIHsKLSAgICAgICAgICAgIEtleUV2ZW50IGtleUV2ZW50ID0gbmV3IEtleUV2ZW50KGRvd25UaW1lTmFub3MgLyAxMDAwMDAwLAotICAgICAgICAgICAgICAgICAgICB3aGVuTmFub3MgLyAxMDAwMDAwLCBhY3Rpb24sIGtleUNvZGUsIDAsIG1ldGFTdGF0ZSwgc2NhbkNvZGUsIGRldmljZUlkLAotICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyU2VydmljZS52aXJ0dWFsS2V5RmVlZGJhY2soa2V5RXZlbnQpOworICAgICAgICBwdWJsaWMgdm9pZCB2aXJ0dWFsS2V5RG93bkZlZWRiYWNrKCkgeworICAgICAgICAgICAgbVdpbmRvd01hbmFnZXJTZXJ2aWNlLm1JbnB1dE1vbml0b3IudmlydHVhbEtleURvd25GZWVkYmFjaygpOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKQEAgLTM1Niw3ICszMzgsNyBAQAogICAgICAgICAKICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUxpZFN3aXRjaENoYW5nZWQobG9uZyB3aGVuTmFub3MsIGJvb2xlYW4gbGlkT3BlbikgewotICAgICAgICAgICAgbVdpbmRvd01hbmFnZXJQb2xpY3kubm90aWZ5TGlkU3dpdGNoQ2hhbmdlZCh3aGVuTmFub3MsIGxpZE9wZW4pOworICAgICAgICAgICAgbVdpbmRvd01hbmFnZXJTZXJ2aWNlLm1JbnB1dE1vbml0b3Iubm90aWZ5TGlkU3dpdGNoQ2hhbmdlZCh3aGVuTmFub3MsIGxpZE9wZW4pOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKQEAgLTM4MCwxNyArMzYyLDE3IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgICAgICBwdWJsaWMgaW50IGludGVyY2VwdEtleUJlZm9yZVF1ZXVlaW5nKGludCBkZXZpY2VJZCwgaW50IHR5cGUsIGludCBzY2FuQ29kZSwKLSAgICAgICAgICAgICAgICBpbnQga2V5Q29kZSwgaW50IHBvbGljeUZsYWdzLCBpbnQgdmFsdWUsIGxvbmcgd2hlbk5hbm9zLCBib29sZWFuIGlzU2NyZWVuT24pIHsKLSAgICAgICAgICAgIHJldHVybiBtV2luZG93TWFuYWdlclNlcnZpY2UubUlucHV0TW9uaXRvci5pbnRlcmNlcHRLZXlCZWZvcmVRdWV1ZWluZyhkZXZpY2VJZCwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgc2NhbkNvZGUsIGtleUNvZGUsIHBvbGljeUZsYWdzLCB2YWx1ZSwgd2hlbk5hbm9zLCBpc1NjcmVlbk9uKTsKKyAgICAgICAgcHVibGljIGludCBpbnRlcmNlcHRLZXlCZWZvcmVRdWV1ZWluZyhsb25nIHdoZW5OYW5vcywgaW50IGtleUNvZGUsIGJvb2xlYW4gZG93biwKKyAgICAgICAgICAgICAgICBpbnQgcG9saWN5RmxhZ3MsIGJvb2xlYW4gaXNTY3JlZW5PbikgeworICAgICAgICAgICAgcmV0dXJuIG1XaW5kb3dNYW5hZ2VyU2VydmljZS5tSW5wdXRNb25pdG9yLmludGVyY2VwdEtleUJlZm9yZVF1ZXVlaW5nKAorICAgICAgICAgICAgICAgICAgICB3aGVuTmFub3MsIGtleUNvZGUsIGRvd24sIHBvbGljeUZsYWdzLCBpc1NjcmVlbk9uKTsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGludGVyY2VwdEtleUJlZm9yZURpc3BhdGNoaW5nKElucHV0Q2hhbm5lbCBmb2N1cywgaW50IGtleUNvZGUsCi0gICAgICAgICAgICAgICAgaW50IG1ldGFTdGF0ZSwgYm9vbGVhbiBkb3duLCBpbnQgcmVwZWF0Q291bnQsIGludCBwb2xpY3lGbGFncykgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcmNlcHRLZXlCZWZvcmVEaXNwYXRjaGluZyhJbnB1dENoYW5uZWwgZm9jdXMsIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQga2V5Q29kZSwgaW50IG1ldGFTdGF0ZSwgaW50IHJlcGVhdENvdW50LCBpbnQgcG9saWN5RmxhZ3MpIHsKICAgICAgICAgICAgIHJldHVybiBtV2luZG93TWFuYWdlclNlcnZpY2UubUlucHV0TW9uaXRvci5pbnRlcmNlcHRLZXlCZWZvcmVEaXNwYXRjaGluZyhmb2N1cywKLSAgICAgICAgICAgICAgICAgICAga2V5Q29kZSwgbWV0YVN0YXRlLCBkb3duLCByZXBlYXRDb3VudCwgcG9saWN5RmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIGZsYWdzLCBrZXlDb2RlLCBtZXRhU3RhdGUsIHJlcGVhdENvdW50LCBwb2xpY3lGbGFncyk7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQpAQCAtNDAxLDE4ICszODMsNiBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgcHVibGljIHZvaWQgZ29Ub1NsZWVwKGxvbmcgd2hlbk5hbm9zKSB7Ci0gICAgICAgICAgICBsb25nIHdoZW4gPSB3aGVuTmFub3MgLyAxMDAwMDAwOwotICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5nb1RvU2xlZXAod2hlbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgICAgICBwdWJsaWMgdm9pZCBwb2tlVXNlckFjdGl2aXR5KGxvbmcgZXZlbnRUaW1lTmFub3MsIGludCBldmVudFR5cGUpIHsKLSAgICAgICAgICAgIGxvbmcgZXZlbnRUaW1lID0gZXZlbnRUaW1lTmFub3MgLyAxMDAwMDAwOwotICAgICAgICAgICAgbVBvd2VyTWFuYWdlclNlcnZpY2UudXNlckFjdGl2aXR5KGV2ZW50VGltZSwgZmFsc2UsIGV2ZW50VHlwZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5QXBwU3dpdGNoQ29taW5nKCkgewogICAgICAgICAgICAgbVdpbmRvd01hbmFnZXJTZXJ2aWNlLm1JbnB1dE1vbml0b3Iubm90aWZ5QXBwU3dpdGNoQ29taW5nKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBmNmUzNDQxLi4zNmIzYTVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC05ODAsNyArOTgwLDcgQEAKICAgICB2b2lkIHNldElucHV0TWV0aG9kTG9ja2VkKFN0cmluZyBpZCkgewogICAgICAgICBJbnB1dE1ldGhvZEluZm8gaW5mbyA9IG1NZXRob2RNYXAuZ2V0KGlkKTsKICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBpZDogIiArIG1DdXJNZXRob2RJZCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGlkOiAiICsgaWQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlkLmVxdWFscyhtQ3VyTWV0aG9kSWQpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9LZXlJbnB1dFF1ZXVlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9LZXlJbnB1dFF1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MmM3ZWUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvS2V5SW5wdXRRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkxhdGVuY3lUaW1lcjsKLWltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5SYXdJbnB1dEV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyUG9saWN5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKLQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEtleUlucHV0UXVldWUgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIktleUlucHV0UXVldWUiOwotCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19WSVJUVUFMX0tFWVMgPSBmYWxzZTsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19QT0lOVEVSUyA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIFR1cm4gb24gc29tZSBoYWNrcyB3ZSBoYXZlIHRvIGltcHJvdmUgdGhlIHRvdWNoIGludGVyYWN0aW9uIHdpdGggYQotICAgICAqIGNlcnRhaW4gZGV2aWNlIHdob3NlIHNjcmVlbiBjdXJyZW50bHkgaXMgbm90IGFsbCB0aGF0IGdvb2QuCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gQkFEX1RPVUNIX0hBQ0sgPSBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUdXJuIG9uIHNvbWUgaGFja3MgdG8gaW1wcm92ZSB0b3VjaCBpbnRlcmFjdGlvbiB3aXRoIGFub3RoZXIgZGV2aWNlCi0gICAgICogd2hlcmUgdG91Y2ggY29vcmRpbmF0ZSBkYXRhIGNhbiBnZXQgY29ycnVwdGVkLgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIEpVTVBZX1RPVUNIX0hBQ0sgPSBmYWxzZTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTFVERURfREVWSUNFU19QQVRIID0gImV0Yy9leGNsdWRlZC1pbnB1dC1kZXZpY2VzLnhtbCI7Ci0KLSAgICBmaW5hbCBTcGFyc2VBcnJheTxJbnB1dERldmljZT4gbURldmljZXMgPSBuZXcgU3BhcnNlQXJyYXk8SW5wdXREZXZpY2U+KCk7Ci0gICAgZmluYWwgU3BhcnNlQXJyYXk8SW5wdXREZXZpY2U+IG1JZ25vcmVkRGV2aWNlcyA9IG5ldyBTcGFyc2VBcnJheTxJbnB1dERldmljZT4oKTsKLSAgICBmaW5hbCBBcnJheUxpc3Q8VmlydHVhbEtleT4gbVZpcnR1YWxLZXlzID0gbmV3IEFycmF5TGlzdDxWaXJ0dWFsS2V5PigpOwotICAgIGZpbmFsIEhhcHRpY0ZlZWRiYWNrQ2FsbGJhY2sgbUhhcHRpY0ZlZWRiYWNrQ2FsbGJhY2s7Ci0gICAgCi0gICAgaW50IG1HbG9iYWxNZXRhU3RhdGUgPSAwOwotICAgIGJvb2xlYW4gbUhhdmVHbG9iYWxNZXRhU3RhdGUgPSBmYWxzZTsKLSAgICAKLSAgICBmaW5hbCBRdWV1ZWRFdmVudCBtRmlyc3Q7Ci0gICAgZmluYWwgUXVldWVkRXZlbnQgbUxhc3Q7Ci0gICAgUXVldWVkRXZlbnQgbUNhY2hlOwotICAgIGludCBtQ2FjaGVDb3VudDsKLQotICAgIERpc3BsYXkgbURpc3BsYXkgPSBudWxsOwotICAgIGludCBtRGlzcGxheVdpZHRoOwotICAgIGludCBtRGlzcGxheUhlaWdodDsKLSAgICAKLSAgICBpbnQgbU9yaWVudGF0aW9uID0gU3VyZmFjZS5ST1RBVElPTl8wOwotICAgIGludFtdIG1LZXlSb3RhdGlvbk1hcCA9IG51bGw7Ci0gICAgCi0gICAgVmlydHVhbEtleSBtUHJlc3NlZFZpcnR1YWxLZXkgPSBudWxsOwotICAgIAotICAgIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtV2FrZUxvY2s7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50W10gS0VZXzkwX01BUCA9IG5ldyBpbnRbXSB7Ci0gICAgICAgIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQsCi0gICAgICAgIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVCwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sCi0gICAgfTsKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgaW50W10gS0VZXzE4MF9NQVAgPSBuZXcgaW50W10gewotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQsIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVCwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hULAotICAgIH07Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIGludFtdIEtFWV8yNzBfTUFQID0gbmV3IGludFtdIHsKLSAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZULAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVCwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCwKLSAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hULCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwKLSAgICB9OwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9SRU1PVkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9LRUVQID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfQUJPUlQgPSAtMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVBU1VSRV9MQVRFTkNZID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBMYXRlbmN5VGltZXIgbHQ7Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEZpbHRlckNhbGxiYWNrIHsKLSAgICAgICAgaW50IGZpbHRlckV2ZW50KFF1ZXVlZEV2ZW50IGV2KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludGVyZmFjZSBIYXB0aWNGZWVkYmFja0NhbGxiYWNrIHsKLSAgICAgICAgdm9pZCB2aXJ0dWFsS2V5RmVlZGJhY2soS2V5RXZlbnQgZXZlbnQpOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgY2xhc3MgUXVldWVkRXZlbnQgewotICAgICAgICBJbnB1dERldmljZSBpbnB1dERldmljZTsKLSAgICAgICAgbG9uZyB3aGVuTmFubzsKLSAgICAgICAgaW50IGZsYWdzOyAvLyBGcm9tIHRoZSByYXcgZXZlbnQKLSAgICAgICAgaW50IGNsYXNzVHlwZTsgLy8gT25lIG9mIHRoZSBjbGFzcyBjb25zdGFudHMgaW4gSW5wdXRFdmVudAotICAgICAgICBPYmplY3QgZXZlbnQ7Ci0gICAgICAgIGJvb2xlYW4gaW5RdWV1ZTsKLQotICAgICAgICB2b2lkIGNvcHlGcm9tKFF1ZXVlZEV2ZW50IHRoYXQpIHsKLSAgICAgICAgICAgIHRoaXMuaW5wdXREZXZpY2UgPSB0aGF0LmlucHV0RGV2aWNlOwotICAgICAgICAgICAgdGhpcy53aGVuTmFubyA9IHRoYXQud2hlbk5hbm87Ci0gICAgICAgICAgICB0aGlzLmZsYWdzID0gdGhhdC5mbGFnczsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NUeXBlID0gdGhhdC5jbGFzc1R5cGU7Ci0gICAgICAgICAgICB0aGlzLmV2ZW50ID0gdGhhdC5ldmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJRdWV1ZWRFdmVudHsiCi0gICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKQotICAgICAgICAgICAgICAgICsgIiAiICsgZXZlbnQgKyAifSI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIG5vdCBjb3BpZWQKLSAgICAgICAgUXVldWVkRXZlbnQgcHJldjsKLSAgICAgICAgUXVldWVkRXZlbnQgbmV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGtleSB0aGF0IGV4aXN0cyBhcyBhIHBhcnQgb2YgdGhlIHRvdWNoLXNjcmVlbiwgb3V0c2lkZSBvZiB0aGUgbm9ybWFsCi0gICAgICogZGlzcGxheSBhcmVhIG9mIHRoZSBzY3JlZW4uCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIFZpcnR1YWxLZXkgewotICAgICAgICBpbnQgc2NhbmNvZGU7Ci0gICAgICAgIGludCBjZW50ZXJ4OwotICAgICAgICBpbnQgY2VudGVyeTsKLSAgICAgICAgaW50IHdpZHRoOwotICAgICAgICBpbnQgaGVpZ2h0OwotICAgICAgICAKLSAgICAgICAgaW50IGhpdExlZnQ7Ci0gICAgICAgIGludCBoaXRUb3A7Ci0gICAgICAgIGludCBoaXRSaWdodDsKLSAgICAgICAgaW50IGhpdEJvdHRvbTsKLSAgICAgICAgCi0gICAgICAgIElucHV0RGV2aWNlIGxhc3REZXZpY2U7Ci0gICAgICAgIGludCBsYXN0S2V5Y29kZTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gY2hlY2tIaXQoaW50IHgsIGludCB5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKHggPj0gaGl0TGVmdCAmJiB4IDw9IGhpdFJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICYmIHkgPj0gaGl0VG9wICYmIHkgPD0gaGl0Qm90dG9tKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBjb21wdXRlSGl0UmVjdChJbnB1dERldmljZSBkZXYsIGludCBkdywgaW50IGRoKSB7Ci0gICAgICAgICAgICBpZiAoZGV2ID09IGxhc3REZXZpY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChERUJVR19WSVJUVUFMX0tFWVMpIFNsb2cudihUQUcsICJjb21wdXRlSGl0UmVjdCBmb3IgIiArIHNjYW5jb2RlCi0gICAgICAgICAgICAgICAgICAgICsgIjogZGV2PSIgKyBkZXYgKyAiIGFic1g9IiArIGRldi5hYnNYICsgIiBhYnNZPSIgKyBkZXYuYWJzWSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGxhc3REZXZpY2UgPSBkZXY7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBtaW54ID0gZGV2LmFic1gubWluVmFsdWU7Ci0gICAgICAgICAgICBpbnQgbWF4eCA9IGRldi5hYnNYLm1heFZhbHVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgaGFsZncgPSB3aWR0aC8yOwotICAgICAgICAgICAgaW50IGxlZnQgPSBjZW50ZXJ4IC0gaGFsZnc7Ci0gICAgICAgICAgICBpbnQgcmlnaHQgPSBjZW50ZXJ4ICsgaGFsZnc7Ci0gICAgICAgICAgICBoaXRMZWZ0ID0gbWlueCArICgobGVmdCptYXh4LW1pbngpL2R3KTsKLSAgICAgICAgICAgIGhpdFJpZ2h0ID0gbWlueCArICgocmlnaHQqbWF4eC1taW54KS9kdyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBtaW55ID0gZGV2LmFic1kubWluVmFsdWU7Ci0gICAgICAgICAgICBpbnQgbWF4eSA9IGRldi5hYnNZLm1heFZhbHVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgaGFsZmggPSBoZWlnaHQvMjsKLSAgICAgICAgICAgIGludCB0b3AgPSBjZW50ZXJ5IC0gaGFsZmg7Ci0gICAgICAgICAgICBpbnQgYm90dG9tID0gY2VudGVyeSArIGhhbGZoOwotICAgICAgICAgICAgaGl0VG9wID0gbWlueSArICgodG9wKm1heHktbWlueSkvZGgpOwotICAgICAgICAgICAgaGl0Qm90dG9tID0gbWlueSArICgoYm90dG9tKm1heHktbWlueSkvZGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRWaXJ0dWFsS2V5cyhTdHJpbmcgZGV2aWNlTmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICIvc3lzL2JvYXJkX3Byb3BlcnRpZXMvdmlydHVhbGtleXMuIiArIGRldmljZU5hbWUpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcyk7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IsIDIwNDgpOwotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IGJyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAoc3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBpdCA9IHN0ci5zcGxpdCgiOiIpOwotICAgICAgICAgICAgICAgIGlmIChERUJVR19WSVJUVUFMX0tFWVMpIFNsb2cudihUQUcsICIqKioqKiBWSVJUVUFMIEtFWVM6ICIgKyBpdCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBpdC5sZW5ndGgtNjsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8PU47IGkrPTYpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEiMHgwMSIuZXF1YWxzKGl0W2ldKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVua25vd24gdmlydHVhbCBrZXkgdHlwZSBhdCBlbGVtICMiICsgaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBpdFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgVmlydHVhbEtleSBzYiA9IG5ldyBWaXJ0dWFsS2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5zY2FuY29kZSA9IEludGVnZXIucGFyc2VJbnQoaXRbaSsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5jZW50ZXJ4ID0gSW50ZWdlci5wYXJzZUludChpdFtpKzJdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmNlbnRlcnkgPSBJbnRlZ2VyLnBhcnNlSW50KGl0W2krM10pOwotICAgICAgICAgICAgICAgICAgICAgICAgc2Iud2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KGl0W2krNF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuaGVpZ2h0ID0gSW50ZWdlci5wYXJzZUludChpdFtpKzVdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19WSVJUVUFMX0tFWVMpIFNsb2cudihUQUcsICJWaXJ0dWFsIGtleSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2Iuc2NhbmNvZGUgKyAiOiBjZW50ZXI9IiArIHNiLmNlbnRlcnggKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzYi5jZW50ZXJ5ICsgIiBzaXplPSIgKyBzYi53aWR0aCArICJ4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNiLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlydHVhbEtleXMuYWRkKHNiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJCYWQgbnVtYmVyIGF0IHJlZ2lvbiAiICsgaSArICIgaW46ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cuaShUQUcsICJObyB2aXJ0dWFsIGtleXMgZm91bmQiKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU2xvZy53KFRBRywgIkVycm9yIHJlYWRpbmcgdmlydHVhbCBrZXlzIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZEV4Y2x1ZGVkRGV2aWNlcygpIHsKLSAgICAgICAgLy8gUmVhZCBwYXJ0bmVyLXByb3ZpZGVkIGxpc3Qgb2YgZXhjbHVkZWQgaW5wdXQgZGV2aWNlcwotICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0gICAgICAgIC8vIEVudmlyb25tZW50LmdldFJvb3REaXJlY3RvcnkoKSBpcyBhIGZhbmN5IHdheSBvZiBzYXlpbmcgQU5EUk9JRF9ST09UIG9yICIvc3lzdGVtIi4KLSAgICAgICAgRmlsZSBjb25mRmlsZSA9IG5ldyBGaWxlKEVudmlyb25tZW50LmdldFJvb3REaXJlY3RvcnkoKSwgRVhDTFVERURfREVWSUNFU19QQVRIKTsKLSAgICAgICAgRmlsZVJlYWRlciBjb25mcmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbmZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihjb25mRmlsZSk7Ci0gICAgICAgICAgICBwYXJzZXIgPSBYbWwubmV3UHVsbFBhcnNlcigpOwotICAgICAgICAgICAgcGFyc2VyLnNldElucHV0KGNvbmZyZWFkZXIpOwotICAgICAgICAgICAgWG1sVXRpbHMuYmVnaW5Eb2N1bWVudChwYXJzZXIsICJkZXZpY2VzIik7Ci0KLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKLSAgICAgICAgICAgICAgICBpZiAoISJkZXZpY2UiLmVxdWFscyhwYXJzZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgIm5hbWUiKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy52KFRBRywgImFkZEV4Y2x1ZGVkRGV2aWNlICIgKyBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXhjbHVkZWREZXZpY2UobmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSXQncyBvayBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJFeGNlcHRpb24gd2hpbGUgcGFyc2luZyAnIiArIGNvbmZGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiciLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7IGlmIChjb25mcmVhZGVyICE9IG51bGwpIGNvbmZyZWFkZXIuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBLZXlJbnB1dFF1ZXVlKENvbnRleHQgY29udGV4dCwgSGFwdGljRmVlZGJhY2tDYWxsYmFjayAgaGFwdGljRmVlZGJhY2tDYWxsYmFjaykgewotICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7Ci0gICAgICAgICAgICBsdCA9IG5ldyBMYXRlbmN5VGltZXIoMTAwLCAxMDAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlcyByID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgQkFEX1RPVUNIX0hBQ0sgPSByLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19maWx0ZXJUb3VjaEV2ZW50cyk7Ci0gICAgICAgIAotICAgICAgICBKVU1QWV9UT1VDSF9IQUNLID0gci5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfZmlsdGVySnVtcHlUb3VjaEV2ZW50cyk7Ci0gICAgICAgIAotICAgICAgICBtSGFwdGljRmVlZGJhY2tDYWxsYmFjayA9IGhhcHRpY0ZlZWRiYWNrQ2FsbGJhY2s7Ci0gICAgICAgIAotICAgICAgICBpZiAoISBXaW5kb3dNYW5hZ2VyU2VydmljZS5FTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICByZWFkRXhjbHVkZWREZXZpY2VzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFBvd2VyTWFuYWdlciBwbSA9IChQb3dlck1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwotICAgICAgICBtV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlJbnB1dFF1ZXVlIik7Ci0gICAgICAgIG1XYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKLQotICAgICAgICBtRmlyc3QgPSBuZXcgUXVldWVkRXZlbnQoKTsKLSAgICAgICAgbUxhc3QgPSBuZXcgUXVldWVkRXZlbnQoKTsKLSAgICAgICAgbUZpcnN0Lm5leHQgPSBtTGFzdDsKLSAgICAgICAgbUxhc3QucHJldiA9IG1GaXJzdDsKLQotICAgICAgICBpZiAoISBXaW5kb3dNYW5hZ2VyU2VydmljZS5FTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5KERpc3BsYXkgZGlzcGxheSkgewotICAgICAgICBtRGlzcGxheSA9IGRpc3BsYXk7Ci0gICAgICAgIAotICAgICAgICAvLyBXZSBhc3N1bWUgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBkaXNwbGF5IGRpbWVuc2lvbnMgcmVmbGVjdCB0aGUKLSAgICAgICAgLy8gbmF0dXJhbCwgdW5yb3RhdGVkIGRpc3BsYXkuICBXZSB3aWxsIHBlcmZvcm0gaGl0IHRlc3RzIGZvciBzb2Z0Ci0gICAgICAgIC8vIGJ1dHRvbnMgYmFzZWQgb24gdGhhdCBkaXNwbGF5LgotICAgICAgICBtRGlzcGxheVdpZHRoID0gZGlzcGxheS5nZXRXaWR0aCgpOwotICAgICAgICBtRGlzcGxheUhlaWdodCA9IGRpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGdldElucHV0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1GaXJzdCkgewotICAgICAgICAgICAgY29uZmlnLnRvdWNoc2NyZWVuID0gQ29uZmlndXJhdGlvbi5UT1VDSFNDUkVFTl9OT1RPVUNIOwotICAgICAgICAgICAgY29uZmlnLmtleWJvYXJkID0gQ29uZmlndXJhdGlvbi5LRVlCT0FSRF9OT0tFWVM7Ci0gICAgICAgICAgICBjb25maWcubmF2aWdhdGlvbiA9IENvbmZpZ3VyYXRpb24uTkFWSUdBVElPTl9OT05BVjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtRGV2aWNlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXREZXZpY2UgZCA9IG1EZXZpY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGQuY2xhc3NlcyZSYXdJbnB1dEV2ZW50LkNMQVNTX1RPVUNIU0NSRUVOKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudG91Y2hzY3JlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDb25maWd1cmF0aW9uLlRPVUNIU0NSRUVOX0ZJTkdFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU2xvZy5pKCJmb28iLCAiKioqKiogSEFWRSBUT1VDSFNDUkVFTiEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKGQuY2xhc3NlcyZSYXdJbnB1dEV2ZW50LkNMQVNTX0FMUEhBS0VZKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcua2V5Ym9hcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDb25maWd1cmF0aW9uLktFWUJPQVJEX1FXRVJUWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU2xvZy5pKCJmb28iLCAiKioqKiogSEFWRSBRV0VSVFkhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChkLmNsYXNzZXMmUmF3SW5wdXRFdmVudC5DTEFTU19UUkFDS0JBTEwpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5uYXZpZ2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ29uZmlndXJhdGlvbi5OQVZJR0FUSU9OX1RSQUNLQkFMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU2xvZy5pKCJmb28iLCAiKioqKiogSEFWRSBUUkFDS0JBTEwhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGQuY2xhc3NlcyZSYXdJbnB1dEV2ZW50LkNMQVNTX0RQQUQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5uYXZpZ2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ29uZmlndXJhdGlvbi5OQVZJR0FUSU9OX0RQQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1Nsb2cuaSgiZm9vIiwgIioqKioqIEhBVkUgRFBBRCEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNjYW5jb2RlU3RhdGUoaW50IGNvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtRmlyc3QpIHsKLSAgICAgICAgICAgIFZpcnR1YWxLZXkgdmsgPSBtUHJlc3NlZFZpcnR1YWxLZXk7Ci0gICAgICAgICAgICBpZiAodmsgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh2ay5zY2FuY29kZSA9PSBjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuYXRpdmVHZXRTY2FuY29kZVN0YXRlKGNvZGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U2NhbmNvZGVTdGF0ZShpbnQgZGV2aWNlSWQsIGludCBjb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUZpcnN0KSB7Ci0gICAgICAgICAgICBWaXJ0dWFsS2V5IHZrID0gbVByZXNzZWRWaXJ0dWFsS2V5OwotICAgICAgICAgICAgaWYgKHZrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAodmsuc2NhbmNvZGUgPT0gY29kZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmF0aXZlR2V0U2NhbmNvZGVTdGF0ZShkZXZpY2VJZCwgY29kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRUcmFja2JhbGxTY2FuY29kZVN0YXRlKGludCBjb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUZpcnN0KSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1EZXZpY2VzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJbnB1dERldmljZSBkZXYgPSBtRGV2aWNlcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoZGV2LmNsYXNzZXMmUmF3SW5wdXRFdmVudC5DTEFTU19UUkFDS0JBTEwpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlcyA9IG5hdGl2ZUdldFNjYW5jb2RlU3RhdGUoZGV2LmlkLCBjb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldERQYWRTY2FuY29kZVN0YXRlKGludCBjb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUZpcnN0KSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1EZXZpY2VzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJbnB1dERldmljZSBkZXYgPSBtRGV2aWNlcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoZGV2LmNsYXNzZXMmUmF3SW5wdXRFdmVudC5DTEFTU19EUEFEKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXMgPSBuYXRpdmVHZXRTY2FuY29kZVN0YXRlKGRldi5pZCwgY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRLZXljb2RlU3RhdGUoaW50IGNvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtRmlyc3QpIHsKLSAgICAgICAgICAgIFZpcnR1YWxLZXkgdmsgPSBtUHJlc3NlZFZpcnR1YWxLZXk7Ci0gICAgICAgICAgICBpZiAodmsgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh2ay5sYXN0S2V5Y29kZSA9PSBjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuYXRpdmVHZXRLZXljb2RlU3RhdGUoY29kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRLZXljb2RlU3RhdGUoaW50IGRldmljZUlkLCBpbnQgY29kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1GaXJzdCkgewotICAgICAgICAgICAgVmlydHVhbEtleSB2ayA9IG1QcmVzc2VkVmlydHVhbEtleTsKLSAgICAgICAgICAgIGlmICh2ayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZrLmxhc3RLZXljb2RlID09IGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUdldEtleWNvZGVTdGF0ZShkZXZpY2VJZCwgY29kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRUcmFja2JhbGxLZXljb2RlU3RhdGUoaW50IGNvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtRmlyc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBOID0gbURldmljZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIElucHV0RGV2aWNlIGRldiA9IG1EZXZpY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKChkZXYuY2xhc3NlcyZSYXdJbnB1dEV2ZW50LkNMQVNTX1RSQUNLQkFMTCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmVzID0gbmF0aXZlR2V0S2V5Y29kZVN0YXRlKGRldi5pZCwgY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXREUGFkS2V5Y29kZVN0YXRlKGludCBjb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUZpcnN0KSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1EZXZpY2VzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJbnB1dERldmljZSBkZXYgPSBtRGV2aWNlcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoZGV2LmNsYXNzZXMmUmF3SW5wdXRFdmVudC5DTEFTU19EUEFEKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXMgPSBuYXRpdmVHZXRLZXljb2RlU3RhdGUoZGV2LmlkLCBjb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2V0RGV2aWNlTmFtZShpbnQgZGV2aWNlSWQpOwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXREZXZpY2VDbGFzc2VzKGludCBkZXZpY2VJZCk7Ci0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBhZGRFeGNsdWRlZERldmljZShTdHJpbmcgZGV2aWNlTmFtZSk7Ci0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBnZXRBYnNvbHV0ZUluZm8oaW50IGRldmljZUlkLCBpbnQgYXhpcywKLSAgICAgICAgICAgIElucHV0RGV2aWNlLkFic29sdXRlSW5mbyBvdXRJbmZvKTsKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0U3dpdGNoU3RhdGUoaW50IHN3KTsKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgZ2V0U3dpdGNoU3RhdGUoaW50IGRldmljZUlkLCBpbnQgc3cpOwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZXRTY2FuY29kZVN0YXRlKGludCBjb2RlKTsKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlR2V0U2NhbmNvZGVTdGF0ZShpbnQgZGV2aWNlSWQsIGludCBjb2RlKTsKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlR2V0S2V5Y29kZVN0YXRlKGludCBjb2RlKTsKLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlR2V0S2V5Y29kZVN0YXRlKGludCBkZXZpY2VJZCwgaW50IGNvZGUpOwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBzY2FuY29kZVRvS2V5Y29kZShpbnQgZGV2aWNlSWQsIGludCBzY2FuY29kZSk7Ci0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBoYXNLZXlzKGludFtdIGtleWNvZGVzLCBib29sZWFuW10ga2V5RXhpc3RzKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEtleUV2ZW50IG5ld0tleUV2ZW50KElucHV0RGV2aWNlIGRldmljZSwgbG9uZyBkb3duVGltZSwKLSAgICAgICAgICAgIGxvbmcgZXZlbnRUaW1lLCBib29sZWFuIGRvd24sIGludCBrZXljb2RlLCBpbnQgcmVwZWF0Q291bnQsCi0gICAgICAgICAgICBpbnQgc2NhbmNvZGUsIGludCBmbGFncykgewotICAgICAgICByZXR1cm4gbmV3IEtleUV2ZW50KAotICAgICAgICAgICAgICAgIGRvd25UaW1lLCBldmVudFRpbWUsCi0gICAgICAgICAgICAgICAgZG93biA/IEtleUV2ZW50LkFDVElPTl9ET1dOIDogS2V5RXZlbnQuQUNUSU9OX1VQLAotICAgICAgICAgICAgICAgIGtleWNvZGUsIHJlcGVhdENvdW50LAotICAgICAgICAgICAgICAgIGRldmljZSAhPSBudWxsID8gZGV2aWNlLm1NZXRhS2V5c1N0YXRlIDogMCwKLSAgICAgICAgICAgICAgICBkZXZpY2UgIT0gbnVsbCA/IGRldmljZS5pZCA6IC0xLCBzY2FuY29kZSwKLSAgICAgICAgICAgICAgICBmbGFncyB8IEtleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0pOwotICAgIH0KLSAgICAKLSAgICBUaHJlYWQgbVRocmVhZCA9IG5ldyBUaHJlYWQoIklucHV0RGV2aWNlUmVhZGVyIikgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cudihUQUcsICJJbnB1dERldmljZVJlYWRlci5ydW4oKSIpOwotICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLnNldFRocmVhZFByaW9yaXR5KAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX1VSR0VOVF9ESVNQTEFZKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUmF3SW5wdXRFdmVudCBldiA9IG5ldyBSYXdJbnB1dEV2ZW50KCk7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0RGV2aWNlIGRpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrLCBkb2Vzbid0IHJlbGVhc2UgdGhlIG1vbml0b3IKLSAgICAgICAgICAgICAgICAgICAgcmVhZEV2ZW50KGV2KTsKLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlbmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjb25maWdDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJJbnB1dCBldmVudDogZGV2PTB4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoZXYuZGV2aWNlSWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0eXBlPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoZXYudHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNjYW5jb2RlPSIgKyBldi5zY2FuY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5Y29kZT0iICsgZXYua2V5Y29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdmFsdWU9IiArIGV2LnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV2LnR5cGUgPT0gUmF3SW5wdXRFdmVudC5FVl9ERVZJQ0VfQURERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkgPSBuZXdJbnB1dERldmljZShldi5kZXZpY2VJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpLmNsYXNzZXMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGRldmljZSBpcyBzb21lIGtpbmQgb2YgaW5wdXQgY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhcmUgYWJvdXQgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VzLnB1dChldi5kZXZpY2VJZCwgZGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRpLmNsYXNzZXMgJiBSYXdJbnB1dEV2ZW50LkNMQVNTX1RPVUNIU0NSRUVOKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkVmlydHVhbEtleXMoZGkubmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbmZpZ3VyYXRpb24gbWF5IGhhdmUgY2hhbmdlZCBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoaXMgZGV2aWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB3b24ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgZGV2aWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSWdub3JlZERldmljZXMucHV0KGV2LmRldmljZUlkLCBkaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJJZ25vcmluZyBub24taW5wdXQgZGV2aWNlOiBpZD0weCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoZGkuaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBuYW1lPSIgKyBkaS5uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXYudHlwZSA9PSBSYXdJbnB1dEV2ZW50LkVWX0RFVklDRV9SRU1PVkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1GaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiRGV2aWNlIHJlbW92ZWQ6IGlkPTB4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhldi5kZXZpY2VJZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaSA9IG1EZXZpY2VzLmdldChldi5kZXZpY2VJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZXMuZGVsZXRlKGV2LmRldmljZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbmZpZ3VyYXRpb24gbWF5IGhhdmUgY2hhbmdlZCBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoaXMgZGV2aWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChkaT1tSWdub3JlZERldmljZXMuZ2V0KGV2LmRldmljZUlkKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSWdub3JlZERldmljZXMucmVtb3ZlKGV2LmRldmljZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiUmVtb3ZpbmcgYmFkIGRldmljZSBpZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhldi5kZXZpY2VJZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaSA9IGdldElucHV0RGV2aWNlKGV2LmRldmljZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgYmUgc29tZSBqdW5rIGZyb20gYW4gaWdub3JlZCBkZXZpY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNyYWNrIGF0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kID0gcHJlcHJvY2Vzc0V2ZW50KGRpLCBldik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldi50eXBlID09IFJhd0lucHV0RXZlbnQuRVZfS0VZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkubU1ldGFLZXlzU3RhdGUgPSBtYWtlTWV0YVN0YXRlKGV2LmtleWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi52YWx1ZSAhPSAwLCBkaS5tTWV0YUtleXNTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhdmVHbG9iYWxNZXRhU3RhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1GaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExvY2tlZChkaSwgU3lzdGVtLm5hbm9UaW1lKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdJbnB1dEV2ZW50LkNMQVNTX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1GaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhlIGV2ZW50IHRpbWViYXNlIGFic29sdXRlbHkgbXVzdCBiZSB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZWJhc2UgYXMgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2N1clRpbWUgPSBnb3RPbmUgPyBldi53aGVuIDogU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGN1clRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgY3VyVGltZU5hbm8gPSBTeXN0ZW0ubmFub1RpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU2xvZy5pKFRBRywgImN1clRpbWU9IiArIGN1clRpbWUgKyAiLCBzeXN0ZW1DbG9jaz0iICsgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2xhc3NlcyA9IGRpLmNsYXNzZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IGV2LnR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2NhbmNvZGUgPSBldi5zY2FuY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgaXQgYSBrZXkgZXZlbnQ/Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBSYXdJbnB1dEV2ZW50LkVWX0tFWSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhc3NlcyZSYXdJbnB1dEV2ZW50LkNMQVNTX0tFWUJPQVJEKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzY2FuY29kZSA8IFJhd0lucHV0RXZlbnQuQlROX0ZJUlNUIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmNvZGUgPiBSYXdJbnB1dEV2ZW50LkJUTl9MQVNUKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZG93bjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYudmFsdWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkubUtleURvd25UaW1lID0gY3VyVGltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXljb2RlID0gcm90YXRlS2V5Q29kZUxvY2tlZChldi5rZXljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMb2NrZWQoZGksIGN1clRpbWVOYW5vLCBldi5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0lucHV0RXZlbnQuQ0xBU1NfS0VZQk9BUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdLZXlFdmVudChkaSwgZGkubUtleURvd25UaW1lLCBjdXJUaW1lLCBkb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXljb2RlLCAwLCBzY2FuY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChldi5mbGFncyAmIFdpbmRvd01hbmFnZXJQb2xpY3kuRkxBR19XT0tFX0hFUkUpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEtleUV2ZW50LkZMQUdfV09LRV9IRVJFIDogMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldi50eXBlID09IFJhd0lucHV0RXZlbnQuRVZfS0VZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIHRvdWNoIHByb3RvY29sOiB0b3VjaCBnb2luZyBkb3duIG9yIHVwLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldi5zY2FuY29kZSA9PSBSYXdJbnB1dEV2ZW50LkJUTl9UT1VDSCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsYXNzZXMmKFJhd0lucHV0RXZlbnQuQ0xBU1NfVE9VQ0hTQ1JFRU4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFJhd0lucHV0RXZlbnQuQ0xBU1NfVE9VQ0hTQ1JFRU5fTVQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBSYXdJbnB1dEV2ZW50LkNMQVNTX1RPVUNIU0NSRUVOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1BYnMuY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1BYnMubURvd25bMF0gPSBldi52YWx1ZSAhPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrYmFsbCAobW91c2UpIHByb3RvY29sOiBwcmVzcyBkb3duIG9yIHVwLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXYuc2NhbmNvZGUgPT0gUmF3SW5wdXRFdmVudC5CVE5fTU9VU0UgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGFzc2VzJlJhd0lucHV0RXZlbnQuQ0xBU1NfVFJBQ0tCQUxMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1SZWwuY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1SZWwubU5leHROdW1Qb2ludGVycyA9IGV2LnZhbHVlICE9IDAgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBwb3NpdGlvbiBldmVudHMgZnJvbSBtdWx0aXRvdWNoIHByb3RvY29sLgotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldi50eXBlID09IFJhd0lucHV0RXZlbnQuRVZfQUJTICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGFzc2VzJlJhd0lucHV0RXZlbnQuQ0xBU1NfVE9VQ0hTQ1JFRU5fTVQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYuc2NhbmNvZGUgPT0gUmF3SW5wdXRFdmVudC5BQlNfTVRfVE9VQ0hfTUFKT1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkubUFicy5jaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkubUFicy5tTmV4dERhdGFbZGkubUFicy5tQWRkaW5nUG9pbnRlck9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTW90aW9uRXZlbnQuU0FNUExFX1BSRVNTVVJFXSA9IGV2LnZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXYuc2NhbmNvZGUgPT0gUmF3SW5wdXRFdmVudC5BQlNfTVRfUE9TSVRJT05fWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaS5tQWJzLmNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaS5tQWJzLm1OZXh0RGF0YVtkaS5tQWJzLm1BZGRpbmdQb2ludGVyT2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1vdGlvbkV2ZW50LlNBTVBMRV9YXSA9IGV2LnZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfUE9JTlRFUlMpIFNsb2cudihUQUcsICJNVCBAIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGkubUFicy5tQWRkaW5nUG9pbnRlck9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBYOiIgKyBldi52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldi5zY2FuY29kZSA9PSBSYXdJbnB1dEV2ZW50LkFCU19NVF9QT1NJVElPTl9ZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1BYnMuY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1BYnMubU5leHREYXRhW2RpLm1BYnMubUFkZGluZ1BvaW50ZXJPZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTW90aW9uRXZlbnQuU0FNUExFX1ldID0gZXYudmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19QT0lOVEVSUykgU2xvZy52KFRBRywgIk1UIEAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaS5tQWJzLm1BZGRpbmdQb2ludGVyT2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFk6IiArIGV2LnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2LnNjYW5jb2RlID09IFJhd0lucHV0RXZlbnQuQUJTX01UX1dJRFRIX01BSk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1BYnMuY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1BYnMubU5leHREYXRhW2RpLm1BYnMubUFkZGluZ1BvaW50ZXJPZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTW90aW9uRXZlbnQuU0FNUExFX1NJWkVdID0gZXYudmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIHBvc2l0aW9uIGV2ZW50cyBmcm9tIHNpbmdsZSB0b3VjaCBwcm90b2NvbC4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXYudHlwZSA9PSBSYXdJbnB1dEV2ZW50LkVWX0FCUyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhc3NlcyZSYXdJbnB1dEV2ZW50LkNMQVNTX1RPVUNIU0NSRUVOKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2LnNjYW5jb2RlID09IFJhd0lucHV0RXZlbnQuQUJTX1gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkubUFicy5jaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkuY3VyVG91Y2hWYWxzW01vdGlvbkV2ZW50LlNBTVBMRV9YXSA9IGV2LnZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXYuc2NhbmNvZGUgPT0gUmF3SW5wdXRFdmVudC5BQlNfWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaS5tQWJzLmNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaS5jdXJUb3VjaFZhbHNbTW90aW9uRXZlbnQuU0FNUExFX1ldID0gZXYudmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldi5zY2FuY29kZSA9PSBSYXdJbnB1dEV2ZW50LkFCU19QUkVTU1VSRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaS5tQWJzLmNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaS5jdXJUb3VjaFZhbHNbTW90aW9uRXZlbnQuU0FNUExFX1BSRVNTVVJFXSA9IGV2LnZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaS5jdXJUb3VjaFZhbHNbTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNb3Rpb25FdmVudC5TQU1QTEVfUFJFU1NVUkVdID0gZXYudmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldi5zY2FuY29kZSA9PSBSYXdJbnB1dEV2ZW50LkFCU19UT09MX1dJRFRIKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1BYnMuY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLmN1clRvdWNoVmFsc1tNb3Rpb25FdmVudC5TQU1QTEVfU0laRV0gPSBldi52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkuY3VyVG91Y2hWYWxzW01vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTW90aW9uRXZlbnQuU0FNUExFX1NJWkVdID0gZXYudmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBtb3ZlbWVudCBldmVudHMgZnJvbSB0cmFja2JhbGwgKG1vdXNlKSBwcm90b2NvbC4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXYudHlwZSA9PSBSYXdJbnB1dEV2ZW50LkVWX1JFTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhc3NlcyZSYXdJbnB1dEV2ZW50LkNMQVNTX1RSQUNLQkFMTCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHJlbGF0aXZlIG1vdmVtZW50IGludG8gb3VyIHRvdGFscy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYuc2NhbmNvZGUgPT0gUmF3SW5wdXRFdmVudC5SRUxfWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaS5tUmVsLmNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaS5tUmVsLm1OZXh0RGF0YVtNb3Rpb25FdmVudC5TQU1QTEVfWF0gKz0gZXYudmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldi5zY2FuY29kZSA9PSBSYXdJbnB1dEV2ZW50LlJFTF9ZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1SZWwuY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1SZWwubU5leHREYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9ZXSArPSBldi52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBtdWx0aXRvdWNoIHByb3RvY29sIHN5bmM6IHRlbGxzIHVzIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkcml2ZXIgaGFzIHJldHVybmVkIGFsbCBkYXRhIGZvciAtb25lLSBvZiB0aGUgcG9pbnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgaXMgY3VycmVudGx5IGRvd24uCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYudHlwZSA9PSBSYXdJbnB1dEV2ZW50LkVWX1NZTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBldi5zY2FuY29kZSA9PSBSYXdJbnB1dEV2ZW50LlNZTl9NVF9SRVBPUlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGkubUFicyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkubUFicy5jaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGkubUFicy5tTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1BSRVNTVVJFXSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIDw9IDAsIHRoZSBwb2ludGVyIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3duLCBzbyBrZWVwIGl0IGluIHRoZSBjb3VudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaS5tQWJzLm1OZXh0RGF0YVtkaS5tQWJzLm1BZGRpbmdQb2ludGVyT2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1vdGlvbkV2ZW50LlNBTVBMRV9QUkVTU1VSRV0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG51bSA9IGRpLm1BYnMubU5leHROdW1Qb2ludGVycysxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkubUFicy5tTmV4dE51bVBvaW50ZXJzID0gbnVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX1BPSU5URVJTKSBTbG9nLnYoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTVRfUkVQT1JUOiBub3cgaGF2ZSAiICsgbnVtICsgIiBwb2ludGVycyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG5ld09mZnNldCA9IChudW0gPD0gSW5wdXREZXZpY2UuTUFYX1BPSU5URVJTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChudW0gKiBNb3Rpb25FdmVudC5OVU1fU0FNUExFX0RBVEEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKElucHV0RGV2aWNlLk1BWF9QT0lOVEVSUyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpLm1BYnMubUFkZGluZ1BvaW50ZXJPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaS5tQWJzLm1OZXh0RGF0YVtuZXdPZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNb3Rpb25FdmVudC5TQU1QTEVfUFJFU1NVUkVdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19QT0lOVEVSUykgU2xvZy52KFRBRywgIk1UX1JFUE9SVDogbm8gcG9pbnRlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZ2VuZXJhbCBldmVudCBzeW5jOiBhbGwgZGF0YSBmb3IgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHVwZGF0ZSBoYXMgYmVlbiBkZWxpdmVyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbmQgfHwgKGV2LnR5cGUgPT0gUmF3SW5wdXRFdmVudC5FVl9TWU4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXYuc2NhbmNvZGUgPT0gUmF3SW5wdXRFdmVudC5TWU5fUkVQT1JUKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGlzcGxheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUhhdmVHbG9iYWxNZXRhU3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVHbG9iYWxNZXRhU3RhdGVMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQgbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dERldmljZS5Nb3Rpb25TdGF0ZSBtcyA9IGRpLm1BYnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtcy5jaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy5ldmVyQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy5jaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2xhc3NlcyYoUmF3SW5wdXRFdmVudC5DTEFTU19UT1VDSFNDUkVFTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8UmF3SW5wdXRFdmVudC5DTEFTU19UT1VDSFNDUkVFTl9NVCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFJhd0lucHV0RXZlbnQuQ0xBU1NfVE9VQ0hTQ1JFRU4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy5tTmV4dE51bVBvaW50ZXJzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXMubURvd25bMF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkaS5jdXJUb3VjaFZhbHMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXMubU5leHREYXRhLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50Lk5VTV9TQU1QTEVfREFUQSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLm1OZXh0TnVtUG9pbnRlcnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCQURfVE9VQ0hfSEFDSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLmRyb3BCYWRQb2ludChkaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlVNUFlfVE9VQ0hfSEFDSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLmRyb3BKdW1weVBvaW50KGRpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb01vdGlvbiA9ICFtb25pdG9yVmlydHVhbEtleShkaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYsIGN1clRpbWUsIGN1clRpbWVOYW5vKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvTW90aW9uICYmIG1zLm1OZXh0TnVtUG9pbnRlcnMgPiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtcy5tTGFzdE51bVBvaW50ZXJzID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtcy5tU2tpcExhc3RQb2ludGVycykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb01vdGlvbiA9ICFnZW5lcmF0ZVZpcnR1YWxLZXlEb3duKGRpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYsIGN1clRpbWUsIGN1clRpbWVOYW5vKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvTW90aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIE5lZWQgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGV2ZW50cyBoZXJlLCBmb3IgZXhhbXBsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHR3byBmaW5nZXJzIGNoYW5nZSB1cC9kb3duIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIHNhbWUgdGltZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lID0gbXMuZ2VuZXJhdGVBYnNNb3Rpb24oZGksIGN1clRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVGltZU5hbm8sIG1EaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbiwgbUdsb2JhbE1ldGFTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19QT0lOVEVSUykgU2xvZy52KFRBRywgIkFic29sdXRlOiB4PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRpLm1BYnMubU5leHREYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9YXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB5PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRpLm1BYnMubU5leHREYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9ZXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBldj0iICsgbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJQb2xpY3kuV0FUQ0hfUE9JTlRFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJFbnF1ZXVlaW5nOiAiICsgbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTG9ja2VkKGRpLCBjdXJUaW1lTmFubywgZXYuZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0lucHV0RXZlbnQuQ0xBU1NfVE9VQ0hTQ1JFRU4sIG1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG1zLmhhc01vcmUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb25zdW1pbmcgbW92ZW1lbnQgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmlydHVhbCBrZXkgYXJlYS4uLiAgYnV0IHN0aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHRoaXMgdG8gdGhlIHByZXZpb3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBmb3IgY29tcGFyaXNvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bSA9IG1zLm1OZXh0TnVtUG9pbnRlcnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bSA+IElucHV0RGV2aWNlLk1BWF9QT0lOVEVSUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBJbnB1dERldmljZS5NQVhfUE9JTlRFUlM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobXMubU5leHREYXRhLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXMubUxhc3REYXRhLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtICogTW90aW9uRXZlbnQuTlVNX1NBTVBMRV9EQVRBKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy5tTGFzdE51bVBvaW50ZXJzID0gbnVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLm1Ta2lwTGFzdFBvaW50ZXJzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXMuZmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zID0gZGkubVJlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zLmNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLmV2ZXJDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLmNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUgPSBtcy5nZW5lcmF0ZVJlbE1vdGlvbihkaSwgY3VyVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVGltZU5hbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbiwgbUdsb2JhbE1ldGFTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFsc2UpIFNsb2cudihUQUcsICJSZWxhdGl2ZTogeD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGkubVJlbC5tTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1hdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB5PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaS5tUmVsLm1OZXh0RGF0YVtNb3Rpb25FdmVudC5TQU1QTEVfWV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGV2PSIgKyBtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExvY2tlZChkaSwgY3VyVGltZU5hbm8sIGV2LmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3SW5wdXRFdmVudC5DTEFTU19UUkFDS0JBTEwsIG1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbnB1dFJlYWRlclRocmVhZCB1bmNhdWdodCBleGNlcHRpb24iLCBleGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbnNpZGVEaXNwbGF5KElucHV0RGV2aWNlIGRldikgewotICAgICAgICBmaW5hbCBJbnB1dERldmljZS5BYnNvbHV0ZUluZm8gYWJzeCA9IGRldi5hYnNYOwotICAgICAgICBmaW5hbCBJbnB1dERldmljZS5BYnNvbHV0ZUluZm8gYWJzeSA9IGRldi5hYnNZOwotICAgICAgICBmaW5hbCBJbnB1dERldmljZS5Nb3Rpb25TdGF0ZSBhYnNtID0gZGV2Lm1BYnM7Ci0gICAgICAgIGlmIChhYnN4ID09IG51bGwgfHwgYWJzeSA9PSBudWxsIHx8IGFic20gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChhYnNtLm1OZXh0RGF0YVtNb3Rpb25FdmVudC5TQU1QTEVfWF0gPj0gYWJzeC5taW5WYWx1ZQotICAgICAgICAgICAgICAgICYmIGFic20ubU5leHREYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9YXSA8PSBhYnN4Lm1heFZhbHVlCi0gICAgICAgICAgICAgICAgJiYgYWJzbS5tTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1ldID49IGFic3kubWluVmFsdWUKLSAgICAgICAgICAgICAgICAmJiBhYnNtLm1OZXh0RGF0YVtNb3Rpb25FdmVudC5TQU1QTEVfWV0gPD0gYWJzeS5tYXhWYWx1ZSkgewotICAgICAgICAgICAgaWYgKERFQlVHX1ZJUlRVQUxfS0VZUykgU2xvZy52KFRBRywgIklucHV0ICgiCi0gICAgICAgICAgICAgICAgICAgICsgYWJzbS5tTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1hdCi0gICAgICAgICAgICAgICAgICAgICsgIiwiICsgYWJzbS5tTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1ldCi0gICAgICAgICAgICAgICAgICAgICsgIikgaW5zaWRlIG9mIGRpc3BsYXkiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgVmlydHVhbEtleSBmaW5kVmlydHVhbEtleShJbnB1dERldmljZSBkZXYpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtVmlydHVhbEtleXMuc2l6ZSgpOwotICAgICAgICBpZiAoTiA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgSW5wdXREZXZpY2UuTW90aW9uU3RhdGUgYWJzbSA9IGRldi5tQWJzOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBWaXJ0dWFsS2V5IHNiID0gbVZpcnR1YWxLZXlzLmdldChpKTsKLSAgICAgICAgICAgIHNiLmNvbXB1dGVIaXRSZWN0KGRldiwgbURpc3BsYXlXaWR0aCwgbURpc3BsYXlIZWlnaHQpOwotICAgICAgICAgICAgaWYgKERFQlVHX1ZJUlRVQUxfS0VZUykgU2xvZy52KFRBRywgIkhpdCB0ZXN0ICgiCi0gICAgICAgICAgICAgICAgICAgICsgYWJzbS5tTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1hdICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICsgYWJzbS5tTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1ldICsgIikgaW4gY29kZSAiCi0gICAgICAgICAgICAgICAgICAgICsgc2Iuc2NhbmNvZGUgKyAiIC0gKCIgKyBzYi5oaXRMZWZ0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwiICsgc2IuaGl0VG9wICsgIiktKCIgKyBzYi5oaXRSaWdodCArICIsIgotICAgICAgICAgICAgICAgICAgICArIHNiLmhpdEJvdHRvbSArICIpIik7Ci0gICAgICAgICAgICBpZiAoc2IuY2hlY2tIaXQoYWJzbS5tTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1hdLAotICAgICAgICAgICAgICAgICAgICBhYnNtLm1OZXh0RGF0YVtNb3Rpb25FdmVudC5TQU1QTEVfWV0pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX1ZJUlRVQUxfS0VZUykgU2xvZy52KFRBRywgIkhpdCEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVWaXJ0dWFsS2V5RG93bihJbnB1dERldmljZSBkaSwgUmF3SW5wdXRFdmVudCBldiwKLSAgICAgICAgICAgIGxvbmcgY3VyVGltZSwgbG9uZyBjdXJUaW1lTmFubykgewotICAgICAgICBpZiAoaXNJbnNpZGVEaXNwbGF5KGRpKSkgewotICAgICAgICAgICAgLy8gRGlkbid0IGNvbnN1bWUgZXZlbnQuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWaXJ0dWFsS2V5IHZrID0gZmluZFZpcnR1YWxLZXkoZGkpOwotICAgICAgICBpZiAodmsgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgSW5wdXREZXZpY2UuTW90aW9uU3RhdGUgbXMgPSBkaS5tQWJzOwotICAgICAgICAgICAgbVByZXNzZWRWaXJ0dWFsS2V5ID0gdms7Ci0gICAgICAgICAgICB2ay5sYXN0S2V5Y29kZSA9IHNjYW5jb2RlVG9LZXljb2RlKGRpLmlkLCB2ay5zY2FuY29kZSk7Ci0gICAgICAgICAgICBtcy5tTGFzdE51bVBvaW50ZXJzID0gbXMubU5leHROdW1Qb2ludGVyczsKLSAgICAgICAgICAgIGRpLm1LZXlEb3duVGltZSA9IGN1clRpbWU7Ci0gICAgICAgICAgICBpZiAoREVCVUdfVklSVFVBTF9LRVlTKSBTbG9nLnYoVEFHLAotICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUga2V5IGRvd24gZm9yOiAiICsgdmsuc2NhbmNvZGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIChrZXljb2RlPSIgKyB2ay5sYXN0S2V5Y29kZSArICIpIik7Ci0gICAgICAgICAgICBLZXlFdmVudCBldmVudCA9IG5ld0tleUV2ZW50KGRpLCBkaS5tS2V5RG93blRpbWUsIGN1clRpbWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIHZrLmxhc3RLZXljb2RlLCAwLCB2ay5zY2FuY29kZSwKLSAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuRkxBR19WSVJUVUFMX0hBUkRfS0VZKTsKLSAgICAgICAgICAgIG1IYXB0aWNGZWVkYmFja0NhbGxiYWNrLnZpcnR1YWxLZXlGZWVkYmFjayhldmVudCk7Ci0gICAgICAgICAgICBhZGRMb2NrZWQoZGksIGN1clRpbWVOYW5vLCBldi5mbGFncywgUmF3SW5wdXRFdmVudC5DTEFTU19LRVlCT0FSRCwKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBXZSBhbHdheXMgY29uc3VtZSB0aGUgZXZlbnQsIGV2ZW4gaWYgd2UgZGlkbid0Ci0gICAgICAgIC8vIGdlbmVyYXRlIGEga2V5IGV2ZW50LiAgVGhlcmUgYXJlIHR3byByZWFzb25zIGZvcgotICAgICAgICAvLyB0aGlzOiB0byBhdm9pZCBzcHVyaW91cyB0b3VjaGVzIHdoZW4gaG9sZGluZwotICAgICAgICAvLyB0aGUgZWRnZXMgb2YgdGhlIGRldmljZSBuZWFyIHRoZSB0b3VjaHNjcmVlbiwKLSAgICAgICAgLy8gYW5kIHRvIGF2b2lkIHJlcG9ydGluZyBldmVudHMgaWYgdGhlcmUgYXJlIHZpcnR1YWwKLSAgICAgICAgLy8ga2V5cyBvbiB0aGUgdG91Y2hzY3JlZW4gb3V0c2lkZSBvZiB0aGUgZGlzcGxheQotICAgICAgICAvLyBhcmVhLgotICAgICAgICAvLyBOb3RlIHRoYXQgZm9yIGFsbCBvZiB0aGlzIHdlIGFyZSBvbmx5IGxvb2tpbmcgYXQgdGhlCi0gICAgICAgIC8vIGZpcnN0IHBvaW50ZXIsIHNpbmNlIHdoYXQgd2UgYXJlIGhhbmRsaW5nIGhlcmUgaXMgdGhlCi0gICAgICAgIC8vIGZpcnN0IHBvaW50ZXIgZ29pbmcgZG93biwgYW5kIHRoaXMgaXMgdGhlIGNvb3JkaW5hdGUKLSAgICAgICAgLy8gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGlzcGF0Y2ggdGhlIGV2ZW50LgotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlLkFic29sdXRlSW5mbyBhYnN4ID0gZGkuYWJzWDsKLSAgICAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlLkFic29sdXRlSW5mbyBhYnN5ID0gZGkuYWJzWTsKLSAgICAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlLk1vdGlvblN0YXRlIGFic20gPSBkaS5tQWJzOwotICAgICAgICAgICAgU2xvZy52KFRBRywgIlJlamVjdGluZyAoIgotICAgICAgICAgICAgICAgICsgYWJzbS5tTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1hdICsgIiwiCi0gICAgICAgICAgICAgICAgKyBhYnNtLm1OZXh0RGF0YVtNb3Rpb25FdmVudC5TQU1QTEVfWV0gKyAiKTogb3V0c2lkZSBvZiAoIgotICAgICAgICAgICAgICAgICsgYWJzeC5taW5WYWx1ZSArICIsIiArIGFic3kubWluVmFsdWUKLSAgICAgICAgICAgICAgICArICIpLSgiICsgYWJzeC5tYXhWYWx1ZSArICIsIgotICAgICAgICAgICAgICAgICsgYWJzeC5tYXhWYWx1ZSArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtb25pdG9yVmlydHVhbEtleShJbnB1dERldmljZSBkaSwgUmF3SW5wdXRFdmVudCBldiwKLSAgICAgICAgICAgIGxvbmcgY3VyVGltZSwgbG9uZyBjdXJUaW1lTmFubykgewotICAgICAgICBWaXJ0dWFsS2V5IHZrID0gbVByZXNzZWRWaXJ0dWFsS2V5OwotICAgICAgICBpZiAodmsgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJbnB1dERldmljZS5Nb3Rpb25TdGF0ZSBtcyA9IGRpLm1BYnM7Ci0gICAgICAgIGlmIChtcy5tTmV4dE51bVBvaW50ZXJzIDw9IDApIHsKLSAgICAgICAgICAgIG1QcmVzc2VkVmlydHVhbEtleSA9IG51bGw7Ci0gICAgICAgICAgICBtcy5tTGFzdE51bVBvaW50ZXJzID0gMDsKLSAgICAgICAgICAgIGlmIChERUJVR19WSVJUVUFMX0tFWVMpIFNsb2cudihUQUcsICJHZW5lcmF0ZSBrZXkgdXAgZm9yOiAiICsgdmsuc2NhbmNvZGUpOwotICAgICAgICAgICAgS2V5RXZlbnQgZXZlbnQgPSBuZXdLZXlFdmVudChkaSwgZGkubUtleURvd25UaW1lLCBjdXJUaW1lLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgdmsubGFzdEtleWNvZGUsIDAsIHZrLnNjYW5jb2RlLAotICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5GTEFHX1ZJUlRVQUxfSEFSRF9LRVkpOwotICAgICAgICAgICAgbUhhcHRpY0ZlZWRiYWNrQ2FsbGJhY2sudmlydHVhbEtleUZlZWRiYWNrKGV2ZW50KTsKLSAgICAgICAgICAgIGFkZExvY2tlZChkaSwgY3VyVGltZU5hbm8sIGV2LmZsYWdzLCBSYXdJbnB1dEV2ZW50LkNMQVNTX0tFWUJPQVJELAotICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKGlzSW5zaWRlRGlzcGxheShkaSkpIHsKLSAgICAgICAgICAgIC8vIFdob29wcyB0aGUgcG9pbnRlciBoYXMgbW92ZWQgaW50bwotICAgICAgICAgICAgLy8gdGhlIGRpc3BsYXkgYXJlYSEgIENhbmNlbCB0aGUKLSAgICAgICAgICAgIC8vIHZpcnR1YWwga2V5IGFuZCBzdGFydCBhIHBvaW50ZXIKLSAgICAgICAgICAgIC8vIG1vdGlvbi4KLSAgICAgICAgICAgIG1QcmVzc2VkVmlydHVhbEtleSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoREVCVUdfVklSVFVBTF9LRVlTKSBTbG9nLnYoVEFHLCAiQ2FuY2VsIGtleSB1cCBmb3I6ICIgKyB2ay5zY2FuY29kZSk7Ci0gICAgICAgICAgICBLZXlFdmVudCBldmVudCA9IG5ld0tleUV2ZW50KGRpLCBkaS5tS2V5RG93blRpbWUsIGN1clRpbWUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICB2ay5sYXN0S2V5Y29kZSwgMCwgdmsuc2NhbmNvZGUsCi0gICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkZMQUdfQ0FOQ0VMRUQgfCBLZXlFdmVudC5GTEFHX1ZJUlRVQUxfSEFSRF9LRVkpOwotICAgICAgICAgICAgbUhhcHRpY0ZlZWRiYWNrQ2FsbGJhY2sudmlydHVhbEtleUZlZWRiYWNrKGV2ZW50KTsKLSAgICAgICAgICAgIGFkZExvY2tlZChkaSwgY3VyVGltZU5hbm8sIGV2LmZsYWdzLCBSYXdJbnB1dEV2ZW50LkNMQVNTX0tFWUJPQVJELAotICAgICAgICAgICAgICAgICAgICBldmVudCk7Ci0gICAgICAgICAgICBtcy5tTGFzdE51bVBvaW50ZXJzID0gMDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgbWV0YSBzdGF0ZSBmb3IgdGhlIGdpdmVuIGtleXMgYW5kIG9sZCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbWFrZU1ldGFTdGF0ZShpbnQga2V5Y29kZSwgYm9vbGVhbiBkb3duLCBpbnQgb2xkKSB7Ci0gICAgICAgIGludCBtYXNrOwotICAgICAgICBzd2l0Y2ggKGtleWNvZGUpIHsKLSAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0FMVF9MRUZUOgotICAgICAgICAgICAgbWFzayA9IEtleUV2ZW50Lk1FVEFfQUxUX0xFRlRfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0FMVF9SSUdIVDoKLSAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX0FMVF9SSUdIVF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVDoKLSAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX1NISUZUX0xFRlRfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX1JJR0hUOgotICAgICAgICAgICAgbWFzayA9IEtleUV2ZW50Lk1FVEFfU0hJRlRfUklHSFRfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX1NZTToKLSAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX1NZTV9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIG9sZDsKLSAgICAgICAgfQotICAgICAgICBpbnQgcmVzdWx0ID0gfihLZXlFdmVudC5NRVRBX0FMVF9PTiB8IEtleUV2ZW50Lk1FVEFfU0hJRlRfT04pCi0gICAgICAgICAgICAgICAgICAgICYgKGRvd24gPyAob2xkIHwgbWFzaykgOiAob2xkICYgfm1hc2spKTsKLSAgICAgICAgaWYgKDAgIT0gKHJlc3VsdCAmIChLZXlFdmVudC5NRVRBX0FMVF9MRUZUX09OIHwgS2V5RXZlbnQuTUVUQV9BTFRfUklHSFRfT04pKSkgewotICAgICAgICAgICAgcmVzdWx0IHw9IEtleUV2ZW50Lk1FVEFfQUxUX09OOwotICAgICAgICB9Ci0gICAgICAgIGlmICgwICE9IChyZXN1bHQgJiAoS2V5RXZlbnQuTUVUQV9TSElGVF9MRUZUX09OIHwgS2V5RXZlbnQuTUVUQV9TSElGVF9SSUdIVF9PTikpKSB7Ci0gICAgICAgICAgICByZXN1bHQgfD0gS2V5RXZlbnQuTUVUQV9TSElGVF9PTjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb21wdXRlR2xvYmFsTWV0YVN0YXRlTG9ja2VkKCkgewotICAgICAgICBpbnQgaSA9IG1EZXZpY2VzLnNpemUoKTsKLSAgICAgICAgbUdsb2JhbE1ldGFTdGF0ZSA9IDA7Ci0gICAgICAgIHdoaWxlICgoLS1pKSA+PSAwKSB7Ci0gICAgICAgICAgICBtR2xvYmFsTWV0YVN0YXRlIHw9IG1EZXZpY2VzLnZhbHVlQXQoaSkubU1ldGFLZXlzU3RhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgbUhhdmVHbG9iYWxNZXRhU3RhdGUgPSB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFJldHVybiB0cnVlIGlmIHlvdSB3YW50IHRoZSBldmVudCB0byBnZXQgcGFzc2VkIG9uIHRvIHRoZSAKLSAgICAgKiByZXN0IG9mIHRoZSBzeXN0ZW0sIGFuZCBmYWxzZSBpZiB5b3UndmUgaGFuZGxlZCBpdCBhbmQgd2FudAotICAgICAqIGl0IGRyb3BwZWQuCi0gICAgICovCi0gICAgYWJzdHJhY3QgYm9vbGVhbiBwcmVwcm9jZXNzRXZlbnQoSW5wdXREZXZpY2UgZGV2aWNlLCBSYXdJbnB1dEV2ZW50IGV2ZW50KTsKLQotICAgIElucHV0RGV2aWNlIGdldElucHV0RGV2aWNlKGludCBkZXZpY2VJZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1GaXJzdCkgewotICAgICAgICAgICAgcmV0dXJuIGdldElucHV0RGV2aWNlTG9ja2VkKGRldmljZUlkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElucHV0RGV2aWNlIGdldElucHV0RGV2aWNlTG9ja2VkKGludCBkZXZpY2VJZCkgewotICAgICAgICByZXR1cm4gbURldmljZXMuZ2V0KGRldmljZUlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24pIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1GaXJzdCkgewotICAgICAgICAgICAgbU9yaWVudGF0aW9uID0gb3JpZW50YXRpb247Ci0gICAgICAgICAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTdXJmYWNlLlJPVEFUSU9OXzkwOgotICAgICAgICAgICAgICAgICAgICBtS2V5Um90YXRpb25NYXAgPSBLRVlfOTBfTUFQOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFN1cmZhY2UuUk9UQVRJT05fMTgwOgotICAgICAgICAgICAgICAgICAgICBtS2V5Um90YXRpb25NYXAgPSBLRVlfMTgwX01BUDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTdXJmYWNlLlJPVEFUSU9OXzI3MDoKLSAgICAgICAgICAgICAgICAgICAgbUtleVJvdGF0aW9uTWFwID0gS0VZXzI3MF9NQVA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1LZXlSb3RhdGlvbk1hcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgcm90YXRlS2V5Q29kZShpbnQga2V5Q29kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUZpcnN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gcm90YXRlS2V5Q29kZUxvY2tlZChrZXlDb2RlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCByb3RhdGVLZXlDb2RlTG9ja2VkKGludCBrZXlDb2RlKSB7Ci0gICAgICAgIGludFtdIG1hcCA9IG1LZXlSb3RhdGlvbk1hcDsKLSAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1hcC5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSs9MikgewotICAgICAgICAgICAgICAgIGlmIChtYXBbaV0gPT0ga2V5Q29kZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwW2krMV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBrZXlDb2RlOwotICAgIH0KLSAgICAKLSAgICBib29sZWFuIGhhc0V2ZW50cygpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtRmlyc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBtRmlyc3QubmV4dCAhPSBtTGFzdDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIHJldHVybnMgdHJ1ZSBpZiB3ZSByZXR1cm5lZCBhbiBldmVudCwgYW5kIGZhbHNlIGlmIHdlIHRpbWVkIG91dAotICAgICAqLwotICAgIFF1ZXVlZEV2ZW50IGdldEV2ZW50KGxvbmcgdGltZW91dE1TKSB7Ci0gICAgICAgIGxvbmcgYmVnaW4gPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBlbmQgPSBiZWdpbit0aW1lb3V0TVM7Ci0gICAgICAgIGxvbmcgbm93ID0gYmVnaW47Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUZpcnN0KSB7Ci0gICAgICAgICAgICB3aGlsZSAobUZpcnN0Lm5leHQgPT0gbUxhc3QgJiYgZW5kID4gbm93KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUZpcnN0LndhaXQoZW5kLW5vdyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGlmIChiZWdpbiA+IG5vdykgewotICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IG5vdzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUZpcnN0Lm5leHQgPT0gbUxhc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFF1ZXVlZEV2ZW50IHAgPSBtRmlyc3QubmV4dDsKLSAgICAgICAgICAgIG1GaXJzdC5uZXh0ID0gcC5uZXh0OwotICAgICAgICAgICAgbUZpcnN0Lm5leHQucHJldiA9IG1GaXJzdDsKLSAgICAgICAgICAgIHAuaW5RdWV1ZSA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcXVldWUgaGFzIGFuIHVwIGV2ZW50IHBlbmRpbmcgdGhhdCBjb3JyZXNwb25kcwotICAgICAqIHRvIHRoZSBzYW1lIGtleSBhcyB0aGUgZ2l2ZW4ga2V5IGV2ZW50LgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzS2V5VXBFdmVudChLZXlFdmVudCBvcmlnRXZlbnQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtRmlyc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBrZXlDb2RlID0gb3JpZ0V2ZW50LmdldEtleUNvZGUoKTsKLSAgICAgICAgICAgIFF1ZXVlZEV2ZW50IGN1ciA9IG1MYXN0LnByZXY7Ci0gICAgICAgICAgICB3aGlsZSAoY3VyLnByZXYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjdXIuY2xhc3NUeXBlID09IFJhd0lucHV0RXZlbnQuQ0xBU1NfS0VZQk9BUkQpIHsKLSAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQga2UgPSAoS2V5RXZlbnQpY3VyLmV2ZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoa2UuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX1VQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYga2UuZ2V0S2V5Q29kZSgpID09IGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ciA9IGN1ci5wcmV2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHZvaWQgcmVjeWNsZUV2ZW50KFF1ZXVlZEV2ZW50IGV2KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUZpcnN0KSB7Ci0gICAgICAgICAgICAvL1Nsb2cuaShUQUcsICJSZWN5Y2xlIGV2ZW50OiAiICsgZXYpOwotICAgICAgICAgICAgaWYgKGV2LmV2ZW50ID09IGV2LmlucHV0RGV2aWNlLm1BYnMuY3VycmVudE1vdmUpIHsKLSAgICAgICAgICAgICAgICBldi5pbnB1dERldmljZS5tQWJzLmN1cnJlbnRNb3ZlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChldi5ldmVudCA9PSBldi5pbnB1dERldmljZS5tUmVsLmN1cnJlbnRNb3ZlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZhbHNlKSBTbG9nLmkoVEFHLCAiRGV0YWNoIHJlbCAiICsgZXYuZXZlbnQpOwotICAgICAgICAgICAgICAgIGV2LmlucHV0RGV2aWNlLm1SZWwuY3VycmVudE1vdmUgPSBudWxsOwotICAgICAgICAgICAgICAgIGV2LmlucHV0RGV2aWNlLm1SZWwubU5leHREYXRhW01vdGlvbkV2ZW50LlNBTVBMRV9YXSA9IDA7Ci0gICAgICAgICAgICAgICAgZXYuaW5wdXREZXZpY2UubVJlbC5tTmV4dERhdGFbTW90aW9uRXZlbnQuU0FNUExFX1ldID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlY3ljbGVMb2NrZWQoZXYpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHZvaWQgZmlsdGVyUXVldWUoRmlsdGVyQ2FsbGJhY2sgY2IpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtRmlyc3QpIHsKLSAgICAgICAgICAgIFF1ZXVlZEV2ZW50IGN1ciA9IG1MYXN0LnByZXY7Ci0gICAgICAgICAgICB3aGlsZSAoY3VyLnByZXYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY2IuZmlsdGVyRXZlbnQoY3VyKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZJTFRFUl9SRU1PVkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXIucHJldi5uZXh0ID0gY3VyLm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXIubmV4dC5wcmV2ID0gY3VyLnByZXY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUxURVJfQUJPUlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ciA9IGN1ci5wcmV2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUXVldWVkRXZlbnQgb2J0YWluTG9ja2VkKElucHV0RGV2aWNlIGRldmljZSwgbG9uZyB3aGVuTmFubywKLSAgICAgICAgICAgIGludCBmbGFncywgaW50IGNsYXNzVHlwZSwgT2JqZWN0IGV2ZW50KSB7Ci0gICAgICAgIFF1ZXVlZEV2ZW50IGV2OwotICAgICAgICBpZiAobUNhY2hlQ291bnQgPT0gMCkgewotICAgICAgICAgICAgZXYgPSBuZXcgUXVldWVkRXZlbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV2ID0gbUNhY2hlOwotICAgICAgICAgICAgZXYuaW5RdWV1ZSA9IGZhbHNlOwotICAgICAgICAgICAgbUNhY2hlID0gZXYubmV4dDsKLSAgICAgICAgICAgIG1DYWNoZUNvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgZXYuaW5wdXREZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIGV2LndoZW5OYW5vID0gd2hlbk5hbm87Ci0gICAgICAgIGV2LmZsYWdzID0gZmxhZ3M7Ci0gICAgICAgIGV2LmNsYXNzVHlwZSA9IGNsYXNzVHlwZTsKLSAgICAgICAgZXYuZXZlbnQgPSBldmVudDsKLSAgICAgICAgcmV0dXJuIGV2OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWN5Y2xlTG9ja2VkKFF1ZXVlZEV2ZW50IGV2KSB7Ci0gICAgICAgIGlmIChldi5pblF1ZXVlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXZlbnQgYWxyZWFkeSBpbiBxdWV1ZSEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNhY2hlQ291bnQgPCAxMCkgewotICAgICAgICAgICAgbUNhY2hlQ291bnQrKzsKLSAgICAgICAgICAgIGV2Lm5leHQgPSBtQ2FjaGU7Ci0gICAgICAgICAgICBtQ2FjaGUgPSBldjsKLSAgICAgICAgICAgIGV2LmluUXVldWUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZExvY2tlZChJbnB1dERldmljZSBkZXZpY2UsIGxvbmcgd2hlbk5hbm8sIGludCBmbGFncywKLSAgICAgICAgICAgIGludCBjbGFzc1R5cGUsIE9iamVjdCBldmVudCkgewotICAgICAgICBib29sZWFuIHBva2UgPSBtRmlyc3QubmV4dCA9PSBtTGFzdDsKLQotICAgICAgICBRdWV1ZWRFdmVudCBldiA9IG9idGFpbkxvY2tlZChkZXZpY2UsIHdoZW5OYW5vLCBmbGFncywgY2xhc3NUeXBlLCBldmVudCk7Ci0gICAgICAgIFF1ZXVlZEV2ZW50IHAgPSBtTGFzdC5wcmV2OwotICAgICAgICB3aGlsZSAocCAhPSBtRmlyc3QgJiYgZXYud2hlbk5hbm8gPCBwLndoZW5OYW5vKSB7Ci0gICAgICAgICAgICBwID0gcC5wcmV2OwotICAgICAgICB9Ci0KLSAgICAgICAgZXYubmV4dCA9IHAubmV4dDsKLSAgICAgICAgZXYucHJldiA9IHA7Ci0gICAgICAgIHAubmV4dCA9IGV2OwotICAgICAgICBldi5uZXh0LnByZXYgPSBldjsKLSAgICAgICAgZXYuaW5RdWV1ZSA9IHRydWU7Ci0KLSAgICAgICAgaWYgKHBva2UpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZTsKLSAgICAgICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kpIHsKLSAgICAgICAgICAgICAgICB0aW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmlyc3Qubm90aWZ5KCk7Ci0gICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgewotICAgICAgICAgICAgICAgIGx0LnNhbXBsZSgiMSBhZGRMb2NrZWQtcXVldWVkIGV2ZW50ICIsIFN5c3RlbS5uYW5vVGltZSgpIC0gdGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElucHV0RGV2aWNlIG5ld0lucHV0RGV2aWNlKGludCBkZXZpY2VJZCkgewotICAgICAgICBpbnQgY2xhc3NlcyA9IGdldERldmljZUNsYXNzZXMoZGV2aWNlSWQpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IGdldERldmljZU5hbWUoZGV2aWNlSWQpOwotICAgICAgICBJbnB1dERldmljZS5BYnNvbHV0ZUluZm8gYWJzWCA9IG51bGw7Ci0gICAgICAgIElucHV0RGV2aWNlLkFic29sdXRlSW5mbyBhYnNZID0gbnVsbDsKLSAgICAgICAgSW5wdXREZXZpY2UuQWJzb2x1dGVJbmZvIGFic1ByZXNzdXJlID0gbnVsbDsKLSAgICAgICAgSW5wdXREZXZpY2UuQWJzb2x1dGVJbmZvIGFic1NpemUgPSBudWxsOwotICAgICAgICBpZiAoY2xhc3NlcyAhPSAwKSB7Ci0gICAgICAgICAgICBTbG9nLmkoVEFHLCAiRGV2aWNlIGFkZGVkOiBpZD0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGRldmljZUlkKQotICAgICAgICAgICAgICAgICAgICArICIsIG5hbWU9IiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjbGFzc2VzPSIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNsYXNzZXMpKTsKLSAgICAgICAgICAgIGlmICgoY2xhc3NlcyZSYXdJbnB1dEV2ZW50LkNMQVNTX1RPVUNIU0NSRUVOX01UKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYWJzWCA9IGxvYWRBYnNvbHV0ZUluZm8oZGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBSYXdJbnB1dEV2ZW50LkFCU19NVF9QT1NJVElPTl9YLCAiWCIpOwotICAgICAgICAgICAgICAgIGFic1kgPSBsb2FkQWJzb2x1dGVJbmZvKGRldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgUmF3SW5wdXRFdmVudC5BQlNfTVRfUE9TSVRJT05fWSwgIlkiKTsKLSAgICAgICAgICAgICAgICBhYnNQcmVzc3VyZSA9IGxvYWRBYnNvbHV0ZUluZm8oZGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBSYXdJbnB1dEV2ZW50LkFCU19NVF9UT1VDSF9NQUpPUiwgIlByZXNzdXJlIik7Ci0gICAgICAgICAgICAgICAgYWJzU2l6ZSA9IGxvYWRBYnNvbHV0ZUluZm8oZGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBSYXdJbnB1dEV2ZW50LkFCU19NVF9XSURUSF9NQUpPUiwgIlNpemUiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNsYXNzZXMmUmF3SW5wdXRFdmVudC5DTEFTU19UT1VDSFNDUkVFTikgIT0gMCkgewotICAgICAgICAgICAgICAgIGFic1ggPSBsb2FkQWJzb2x1dGVJbmZvKGRldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgUmF3SW5wdXRFdmVudC5BQlNfWCwgIlgiKTsKLSAgICAgICAgICAgICAgICBhYnNZID0gbG9hZEFic29sdXRlSW5mbyhkZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJhd0lucHV0RXZlbnQuQUJTX1ksICJZIik7Ci0gICAgICAgICAgICAgICAgYWJzUHJlc3N1cmUgPSBsb2FkQWJzb2x1dGVJbmZvKGRldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgUmF3SW5wdXRFdmVudC5BQlNfUFJFU1NVUkUsICJQcmVzc3VyZSIpOwotICAgICAgICAgICAgICAgIGFic1NpemUgPSBsb2FkQWJzb2x1dGVJbmZvKGRldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgUmF3SW5wdXRFdmVudC5BQlNfVE9PTF9XSURUSCwgIlNpemUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ldyBJbnB1dERldmljZShkZXZpY2VJZCwgY2xhc3NlcywgbmFtZSwgYWJzWCwgYWJzWSwgYWJzUHJlc3N1cmUsIGFic1NpemUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElucHV0RGV2aWNlLkFic29sdXRlSW5mbyBsb2FkQWJzb2x1dGVJbmZvKGludCBpZCwgaW50IGNoYW5uZWwsCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSkgewotICAgICAgICBJbnB1dERldmljZS5BYnNvbHV0ZUluZm8gaW5mbyA9IG5ldyBJbnB1dERldmljZS5BYnNvbHV0ZUluZm8oKTsKLSAgICAgICAgaWYgKGdldEFic29sdXRlSW5mbyhpZCwgY2hhbm5lbCwgaW5mbykKLSAgICAgICAgICAgICAgICAmJiBpbmZvLm1pblZhbHVlICE9IGluZm8ubWF4VmFsdWUpIHsKLSAgICAgICAgICAgIFNsb2cuaShUQUcsICIgICIgKyBuYW1lICsgIjogbWluPSIgKyBpbmZvLm1pblZhbHVlCi0gICAgICAgICAgICAgICAgICAgICsgIiBtYXg9IiArIGluZm8ubWF4VmFsdWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZsYXQ9IiArIGluZm8uZmxhdAotICAgICAgICAgICAgICAgICAgICArICIgZnV6ej0iICsgaW5mby5mdXp6KTsKLSAgICAgICAgICAgIGluZm8ucmFuZ2UgPSBpbmZvLm1heFZhbHVlLWluZm8ubWluVmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgfQotICAgICAgICBTbG9nLmkoVEFHLCAiICAiICsgbmFtZSArICI6IHVua25vd24gdmFsdWVzIik7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiByZWFkRXZlbnQoUmF3SW5wdXRFdmVudCBvdXRFdmVudCk7Ci0gICAgCi0gICAgdm9pZCBkdW1wKFByaW50V3JpdGVyIHB3LCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUZpcnN0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bURldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJbnB1dERldmljZSBkZXYgPSBtRGV2aWNlcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJEZXZpY2UgIyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQobURldmljZXMua2V5QXQoaSkpOyBwdy5wcmludCgiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoZGV2Lm5hbWUpOyBwdy5wcmludCgiIChjbGFzc2VzPTB4Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKGRldi5jbGFzc2VzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIpOiIpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCIgIG1LZXlEb3duVGltZT0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KGRldi5tS2V5RG93blRpbWUpOyBwdy5wcmludCgiIG1NZXRhS2V5c1N0YXRlPSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihkZXYubU1ldGFLZXlzU3RhdGUpOwotICAgICAgICAgICAgICAgIGlmIChkZXYuYWJzWCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCIgIGFic1g6ICIpOyBkZXYuYWJzWC5kdW1wKHB3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRldi5hYnNZICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIiAgYWJzWTogIik7IGRldi5hYnNZLmR1bXAocHcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZGV2LmFic1ByZXNzdXJlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIiAgYWJzUHJlc3N1cmU6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi5hYnNQcmVzc3VyZS5kdW1wKHB3KTsgcHcucHJpbnRsbigiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZXYuYWJzU2l6ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCIgIGFic1NpemU6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi5hYnNTaXplLmR1bXAocHcpOyBwdy5wcmludGxuKCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRldi5tQWJzLmV2ZXJDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50bG4oIiAgbUFiczoiKTsKLSAgICAgICAgICAgICAgICAgICAgZGV2Lm1BYnMuZHVtcChwdywgcHJlZml4ICsgIiAgICAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRldi5tUmVsLmV2ZXJDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50bG4oIiAgbVJlbDoiKTsKLSAgICAgICAgICAgICAgICAgICAgZGV2Lm1SZWwuZHVtcChwdywgcHJlZml4ICsgIiAgICAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIik7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUlnbm9yZWREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXREZXZpY2UgZGV2ID0gbUlnbm9yZWREZXZpY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIklnbm9yZWQgRGV2aWNlICMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KG1JZ25vcmVkRGV2aWNlcy5rZXlBdChpKSk7IHB3LnByaW50KCIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludChkZXYubmFtZSk7IHB3LnByaW50KCIgKGNsYXNzZXM9MHgiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcoZGV2LmNsYXNzZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtVmlydHVhbEtleXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBWaXJ0dWFsS2V5IHZrID0gbVZpcnR1YWxLZXlzLmdldChpKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiVmlydHVhbCBLZXkgIyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoaSk7IHB3LnByaW50bG4oIjoiKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiICBzY2FuY29kZT0iKTsgcHcucHJpbnRsbih2ay5zY2FuY29kZSk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIiAgY2VudGVyeD0iKTsgcHcucHJpbnQodmsuY2VudGVyeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGNlbnRlcnk9Iik7IHB3LnByaW50KHZrLmNlbnRlcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiB3aWR0aD0iKTsgcHcucHJpbnQodmsud2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBoZWlnaHQ9Iik7IHB3LnByaW50bG4odmsuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiICBoaXRMZWZ0PSIpOyBwdy5wcmludCh2ay5oaXRMZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgaGl0VG9wPSIpOyBwdy5wcmludCh2ay5oaXRUb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBoaXRSaWdodD0iKTsgcHcucHJpbnQodmsuaGl0UmlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBoaXRCb3R0b209Iik7IHB3LnByaW50bG4odmsuaGl0Qm90dG9tKTsKLSAgICAgICAgICAgICAgICBpZiAodmsubGFzdERldmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCIgIGxhc3REZXZpY2U9IyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4odmsubGFzdERldmljZS5pZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2ay5sYXN0S2V5Y29kZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCIgIGxhc3RLZXljb2RlPSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4odmsubGFzdEtleWNvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAiKTsKLSAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCIgIERlZmF1bHQga2V5Ym9hcmQ6ICIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJody5rZXlib2FyZHMuMC5kZXZuYW1lIikpOwotICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIiAgbUdsb2JhbE1ldGFTdGF0ZT0iKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQobUdsb2JhbE1ldGFTdGF0ZSk7IHB3LnByaW50KCIgbUhhdmVHbG9iYWxNZXRhU3RhdGU9Iik7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obUhhdmVHbG9iYWxNZXRhU3RhdGUpOwotICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIiAgbURpc3BsYXlXaWR0aD0iKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQobURpc3BsYXlXaWR0aCk7IHB3LnByaW50KCIgbURpc3BsYXlIZWlnaHQ9Iik7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obURpc3BsYXlIZWlnaHQpOwotICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIiAgbU9yaWVudGF0aW9uPSIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1PcmllbnRhdGlvbik7Ci0gICAgICAgICAgICBpZiAobVByZXNzZWRWaXJ0dWFsS2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiICBtUHJlc3NlZFZpcnR1YWxLZXkuc2NhbmNvZGU9Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1QcmVzc2VkVmlydHVhbEtleS5zY2FuY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDFmZDA1M2YuLmFmMjE0NWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00NTgzLDYgKzQ1ODMsOCBAQAogICAgICAgICB9CiAgICAgfTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfT0JCID0gZmFsc2U7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHNlbmRQYWNrYWdlQnJvYWRjYXN0KFN0cmluZyBhY3Rpb24sIFN0cmluZyBwa2csCiAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzLCBJSW50ZW50UmVjZWl2ZXIgZmluaXNoZWRSZWNlaXZlcikgewogICAgICAgICBJQWN0aXZpdHlNYW5hZ2VyIGFtID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKTsKQEAgLTQ3NTcsNiArNDc1OSwyOSBAQAogICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VPYmJQYXRoKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKERFQlVHX09CQikKKyAgICAgICAgICAgIExvZy52KFRBRywgIlNldHRpbmcgLm9iYiBwYXRoIGZvciAiICsgcGFja2FnZU5hbWUgKyAiIHRvOiAiICsgcGF0aCk7CisgICAgICAgIFBhY2thZ2VTZXR0aW5nIHBrZ1NldHRpbmc7CisgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICBmaW5hbCBpbnQgcGVybWlzc2lvbiA9IG1Db250ZXh0LmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLklOU1RBTExfUEFDS0FHRVMpOworICAgICAgICBmaW5hbCBib29sZWFuIGFsbG93ZWRCeVBlcm1pc3Npb24gPSAocGVybWlzc2lvbiA9PSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYWNrYWdlcykgeworICAgICAgICAgICAgcGtnU2V0dGluZyA9IG1TZXR0aW5ncy5tUGFja2FnZXMuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChwa2dTZXR0aW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHBhY2thZ2U6ICIgKyBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWFsbG93ZWRCeVBlcm1pc3Npb24gJiYgKHVpZCAhPSBwa2dTZXR0aW5nLnVzZXJJZCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlBlcm1pc3Npb24gZGVuaWFsOiBhdHRlbXB0IHRvIHNldCAub2JiIGZpbGUgZnJvbSBwaWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpICsgIiwgdWlkPSIgKyB1aWQgKyAiLCBwYWNrYWdlIHVpZD0iCisgICAgICAgICAgICAgICAgICAgICAgICArIHBrZ1NldHRpbmcudXNlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBrZ1NldHRpbmcub2JiUGF0aFN0cmluZyA9IHBhdGg7CisgICAgICAgICAgICBtU2V0dGluZ3Mud3JpdGVMUCgpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQZW5kaW5nSW5zdGFsbChmaW5hbCBJbnN0YWxsQXJncyBhcmdzLCBmaW5hbCBpbnQgY3VycmVudFN0YXR1cykgewogICAgICAgICAvLyBRdWV1ZSB1cCBhbiBhc3luYyBvcGVyYXRpb24gc2luY2UgdGhlIHBhY2thZ2UgaW5zdGFsbGF0aW9uIG1heSB0YWtlIGEgbGl0dGxlIHdoaWxlLgogICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKQEAgLTcxMTgsNiArNzE0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgcGtnPSIpOyBwdy5wcmludGxuKHBzLnBrZyk7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgY29kZVBhdGg9Iik7IHB3LnByaW50bG4ocHMuY29kZVBhdGhTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiICAgIHJlc291cmNlUGF0aD0iKTsgcHcucHJpbnRsbihwcy5yZXNvdXJjZVBhdGhTdHJpbmcpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiICAgIG9iYlBhdGg9Iik7IHB3LnByaW50bG4ocHMub2JiUGF0aFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwcy5wa2cgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgICBkYXRhRGlyPSIpOyBwdy5wcmludGxuKHBzLnBrZy5hcHBsaWNhdGlvbkluZm8uZGF0YURpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiICAgIHRhcmdldFNkaz0iKTsgcHcucHJpbnRsbihwcy5wa2cuYXBwbGljYXRpb25JbmZvLnRhcmdldFNka1ZlcnNpb24pOwpAQCAtNzY4NCw2ICs3NzEwLDcgQEAKICAgICAgICAgU3RyaW5nIGNvZGVQYXRoU3RyaW5nOwogICAgICAgICBGaWxlIHJlc291cmNlUGF0aDsKICAgICAgICAgU3RyaW5nIHJlc291cmNlUGF0aFN0cmluZzsKKyAgICAgICAgU3RyaW5nIG9iYlBhdGhTdHJpbmc7CiAgICAgICAgIHByaXZhdGUgbG9uZyB0aW1lU3RhbXA7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIHRpbWVTdGFtcFN0cmluZyA9ICIwIjsKICAgICAgICAgaW50IHZlcnNpb25Db2RlOwpAQCAtODY4NCw2ICs4NzExLDkgQEAKICAgICAgICAgICAgIGlmIChwa2cuaW5zdGFsbGVyUGFja2FnZU5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJpbnN0YWxsZXIiLCBwa2cuaW5zdGFsbGVyUGFja2FnZU5hbWUpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBrZy5vYmJQYXRoU3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAib2JiUGF0aCIsIHBrZy5vYmJQYXRoU3RyaW5nKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBrZy5zaWduYXR1cmVzLndyaXRlWG1sKHNlcmlhbGl6ZXIsICJzaWdzIiwgbVBhc3RTaWduYXR1cmVzKTsKICAgICAgICAgICAgIGlmICgocGtnLnBrZ0ZsYWdzJkFwcGxpY2F0aW9uSW5mby5GTEFHX1NZU1RFTSkgPT0gMCkgewogICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgInBlcm1zIik7CkBAIC05MDYwLDYgKzkwOTAsNyBAQAogICAgICAgICAgICAgU3RyaW5nIHNoYXJlZElkU3RyID0gbnVsbDsKICAgICAgICAgICAgIFN0cmluZyBjb2RlUGF0aFN0ciA9IG51bGw7CiAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VQYXRoU3RyID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBvYmJQYXRoU3RyID0gbnVsbDsKICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1TdHIgPSBudWxsOwogICAgICAgICAgICAgU3RyaW5nIGluc3RhbGxlclBhY2thZ2VOYW1lID0gbnVsbDsKICAgICAgICAgICAgIFN0cmluZyB1aWRFcnJvciA9IG51bGw7CkBAIC05MDc3LDYgKzkxMDgsNyBAQAogICAgICAgICAgICAgICAgIHNoYXJlZElkU3RyID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJzaGFyZWRVc2VySWQiKTsKICAgICAgICAgICAgICAgICBjb2RlUGF0aFN0ciA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAiY29kZVBhdGgiKTsKICAgICAgICAgICAgICAgICByZXNvdXJjZVBhdGhTdHIgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInJlc291cmNlUGF0aCIpOworICAgICAgICAgICAgICAgIG9iYlBhdGhTdHIgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgIm9iYlBhdGgiKTsKICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2ZXJzaW9uIik7CiAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewpAQCAtOTE3NCw2ICs5MjA2LDcgQEAKICAgICAgICAgICAgIGlmIChwYWNrYWdlU2V0dGluZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcGFja2FnZVNldHRpbmcudWlkRXJyb3IgPSAidHJ1ZSIuZXF1YWxzKHVpZEVycm9yKTsKICAgICAgICAgICAgICAgICBwYWNrYWdlU2V0dGluZy5pbnN0YWxsZXJQYWNrYWdlTmFtZSA9IGluc3RhbGxlclBhY2thZ2VOYW1lOworICAgICAgICAgICAgICAgIHBhY2thZ2VTZXR0aW5nLm9iYlBhdGhTdHJpbmcgPSBvYmJQYXRoU3RyOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmFibGVkU3RyID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJlbmFibGVkIik7CiAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWRTdHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0OTNhMzQ4Li5lOWQ1ZWZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNDcsNiArMjQ3LDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIG1TcGV3ID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBtRGVidWdQcm94aW1pdHlTZW5zb3IgPSAodHJ1ZSB8fCBtU3Bldyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBtRGVidWdMaWdodFNlbnNvciA9IChmYWxzZSB8fCBtU3Bldyk7CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVJbml0KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRQb3dlclN0YXRlKGJvb2xlYW4gc2NyZWVuT24sIGJvb2xlYW4gc2NyZWVuQnJpZ2h0KTsKIAogICAgIC8qCiAgICAgc3RhdGljIFByaW50U3RyZWFtIG1Mb2c7CkBAIC00ODEsNiArNDg0LDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBuYXRpdmVJbml0KCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2tzKSB7CisgICAgICAgICAgICB1cGRhdGVOYXRpdmVQb3dlclN0YXRlTG9ja2VkKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIGluaXRJblRocmVhZCgpIHsKQEAgLTE1NTcsOCArMTU2NSwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB1cGRhdGVOYXRpdmVQb3dlclN0YXRlTG9ja2VkKCk7CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5hdGl2ZVBvd2VyU3RhdGVMb2NrZWQoKSB7CisgICAgICAgIG5hdGl2ZVNldFBvd2VyU3RhdGUoCisgICAgICAgICAgICAgICAgKG1Qb3dlclN0YXRlICYgU0NSRUVOX09OX0JJVCkgIT0gMCwKKyAgICAgICAgICAgICAgICAobVBvd2VyU3RhdGUgJiBTQ1JFRU5fQlJJR0hUKSA9PSBTQ1JFRU5fQlJJR0hUKTsKKyAgICB9CiAKICAgICBwcml2YXRlIGludCBzY3JlZW5PZmZGaW5pc2hlZEFuaW1hdGluZ0xvY2tlZChpbnQgcmVhc29uKSB7CiAgICAgICAgIC8vIEkgZG9uJ3QgdGhpbmsgd2UgbmVlZCB0byBjaGVjayB0aGUgY3VycmVudCBzdGF0ZSBoZXJlIGJlY2F1c2UgYWxsIG9mIHRoZXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCmluZGV4IDQzYTg3ZjIuLmRmYjhmMTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCkBAIC03Nyw2ICs3Nyw3IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLlRIUkVBRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKIAogICAgICAgICBCaW5kZXJJbnRlcm5hbC5kaXNhYmxlQmFja2dyb3VuZFNjaGVkdWxpbmcodHJ1ZSk7CisgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5zZXRDYW5TZWxmQmFja2dyb3VuZChmYWxzZSk7CiAKICAgICAgICAgU3RyaW5nIGZhY3RvcnlUZXN0U3RyID0gU3lzdGVtUHJvcGVydGllcy5nZXQoInJvLmZhY3Rvcnl0ZXN0Iik7CiAgICAgICAgIGludCBmYWN0b3J5VGVzdCA9ICIiLmVxdWFscyhmYWN0b3J5VGVzdFN0cikgPyBTeXN0ZW1TZXJ2ZXIuRkFDVE9SWV9URVNUX09GRgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVmlld1NlcnZlci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVmlld1NlcnZlci5qYXZhCmluZGV4IGFlMDA0MzguLjljN2RiOWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1ZpZXdTZXJ2ZXIuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9WaWV3U2VydmVyLmphdmEKQEAgLTIxLDYgKzIxLDggQEAKIGltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CkBAIC00MSwxMSArNDMsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSUVXX1NFUlZFUl9ERUZBVUxUX1BPUlQgPSA0OTM5OwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJRVdfU0VSVkVSX01BWF9DT05ORUNUSU9OUyA9IDEwOworCiAgICAgLy8gRGVidWcgZmFjaWxpdHkKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWaWV3U2VydmVyIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QUk9UT0NPTF9WRVJTSU9OID0gIjIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9TRVJWRVJfVkVSU0lPTiA9ICIzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfUFJPVE9DT0xfVkVSU0lPTiA9ICIzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU0VSVkVSX1ZFUlNJT04gPSAiNCI7CiAKICAgICAvLyBQcm90b2NvbCBjb21tYW5kcwogICAgIC8vIFJldHVybnMgdGhlIHByb3RvY29sIHZlcnNpb24KQEAgLTU0LDYgKzU4LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVJWRVJfVkVSU0lPTiA9ICJTRVJWRVIiOwogICAgIC8vIExpc3RzIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHdpbmRvd3MgaW4gdGhlIHN5c3RlbQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1dJTkRPV19NQU5BR0VSX0xJU1QgPSAiTElTVCI7CisgICAgLy8gS2VlcHMgYSBjb25uZWN0aW9uIG9wZW4gYW5kIG5vdGlmaWVzIHdoZW4gdGhlIGxpc3Qgb2Ygd2luZG93cyBjaGFuZ2VzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfV0lORE9XX01BTkFHRVJfQVVUT0xJU1QgPSAiQVVUT0xJU1QiOwogCiAgICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgbVNlcnZlcjsKICAgICBwcml2YXRlIFRocmVhZCBtVGhyZWFkOwpAQCAtNjEsNiArNjcsOCBAQAogICAgIHByaXZhdGUgZmluYWwgV2luZG93TWFuYWdlclNlcnZpY2UgbVdpbmRvd01hbmFnZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVBvcnQ7CiAKKyAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBtVGhyZWFkUG9vbDsKKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgVmlld1NlcnZlciBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCB3aW5kb3cgbWFuYWdlci4KICAgICAgKiBUaGUgc2VydmVyIHVzZXMgdGhlIGRlZmF1bHQgcG9ydCB7QGxpbmsgI1ZJRVdfU0VSVkVSX0RFRkFVTFRfUE9SVH0uIFRoZSBzZXJ2ZXIKQEAgLTEwMyw4ICsxMTEsOSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgbVNlcnZlciA9IG5ldyBTZXJ2ZXJTb2NrZXQobVBvcnQsIDEsIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICAgICAgbVNlcnZlciA9IG5ldyBTZXJ2ZXJTb2NrZXQobVBvcnQsIFZJRVdfU0VSVkVSX01BWF9DT05ORUNUSU9OUywgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOwogICAgICAgICBtVGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLCAiUmVtb3RlIFZpZXcgU2VydmVyIFtwb3J0PSIgKyBtUG9ydCArICJdIik7CisgICAgICAgIG1UaHJlYWRQb29sID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChWSUVXX1NFUlZFUl9NQVhfQ09OTkVDVElPTlMpOwogICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7CiAKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xMjIsNyArMTMxLDE2IEBACiAgICAgICovCiAgICAgYm9vbGVhbiBzdG9wKCkgewogICAgICAgICBpZiAobVRocmVhZCAhPSBudWxsKSB7CisKICAgICAgICAgICAgIG1UaHJlYWQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBpZiAobVRocmVhZFBvb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRQb29sLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIkNvdWxkIG5vdCBzdG9wIGFsbCB2aWV3IHNlcnZlciB0aHJlYWRzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRocmVhZFBvb2wgPSBudWxsOwogICAgICAgICAgICAgbVRocmVhZCA9IG51bGw7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIG1TZXJ2ZXIuY2xvc2UoKTsKQEAgLTE1Miw2MiArMTcwLDIxIEBACiAgICAgICogTWFpbiBzZXJ2ZXIgbG9vcC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGZpbmFsIFNlcnZlclNvY2tldCBzZXJ2ZXIgPSBtU2VydmVyOwotCiAgICAgICAgIHdoaWxlIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IG1UaHJlYWQpIHsKLSAgICAgICAgICAgIFNvY2tldCBjbGllbnQgPSBudWxsOwogICAgICAgICAgICAgLy8gQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiB3aWxsIGNyYXNoIHRoZSBzeXN0ZW0gcHJvY2VzcwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGllbnQgPSBzZXJ2ZXIuYWNjZXB0KCk7Ci0KLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNsaWVudC5nZXRJbnB1dFN0cmVhbSgpKSwgMTAyNCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3QgPSBpbi5yZWFkTGluZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyczsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSByZXF1ZXN0LmluZGV4T2YoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gcmVxdWVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSByZXF1ZXN0LnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzID0gcmVxdWVzdC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBpZiAoQ09NTUFORF9QUk9UT0NPTF9WRVJTSU9OLmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHdyaXRlVmFsdWUoY2xpZW50LCBWQUxVRV9QUk9UT0NPTF9WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDT01NQU5EX1NFUlZFUl9WRVJTSU9OLmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHdyaXRlVmFsdWUoY2xpZW50LCBWQUxVRV9TRVJWRVJfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ09NTUFORF9XSU5ET1dfTUFOQUdFUl9MSVNULmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1XaW5kb3dNYW5hZ2VyLnZpZXdTZXJ2ZXJMaXN0V2luZG93cyhjbGllbnQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbVdpbmRvd01hbmFnZXIudmlld1NlcnZlcldpbmRvd0NvbW1hbmQoY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLCBwYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIkFuIGVycm9yIG9jY3VyZWQgd2l0aCB0aGUgY29tbWFuZDogIiArIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFNsb2cudyhMT0dfVEFHLCAiQ29ubmVjdGlvbiBlcnJvcjogIiwgZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNvY2tldCBjbGllbnQgPSBtU2VydmVyLmFjY2VwdCgpOworICAgICAgICAgICAgICAgIGlmKG1UaHJlYWRQb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRocmVhZFBvb2wuc3VibWl0KG5ldyBWaWV3U2VydmVyV29ya2VyKGNsaWVudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJDb25uZWN0aW9uIGVycm9yOiAiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTIzNSw0ICsyMTIsMTA2IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CisKKyAgICBjbGFzcyBWaWV3U2VydmVyV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUsIFdpbmRvd01hbmFnZXJTZXJ2aWNlLldpbmRvd0NoYW5nZUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBTb2NrZXQgbUNsaWVudDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkV2luZG93TGlzdFVwZGF0ZTsKKyAgICAgICAgcHVibGljIFZpZXdTZXJ2ZXJXb3JrZXIoU29ja2V0IGNsaWVudCkgeworICAgICAgICAgICAgbUNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobUNsaWVudC5nZXRJbnB1dFN0cmVhbSgpKSwgMTAyNCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdCA9IGluLnJlYWRMaW5lKCk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29tbWFuZDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyczsKKworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHJlcXVlc3QuaW5kZXhPZignICcpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gcmVxdWVzdDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyA9ICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSByZXF1ZXN0LnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgPSByZXF1ZXN0LnN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0OworICAgICAgICAgICAgICAgIGlmIChDT01NQU5EX1BST1RPQ09MX1ZFUlNJT04uZXF1YWxzSWdub3JlQ2FzZShjb21tYW5kKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB3cml0ZVZhbHVlKG1DbGllbnQsIFZBTFVFX1BST1RPQ09MX1ZFUlNJT04pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ09NTUFORF9TRVJWRVJfVkVSU0lPTi5lcXVhbHNJZ25vcmVDYXNlKGNvbW1hbmQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHdyaXRlVmFsdWUobUNsaWVudCwgVkFMVUVfU0VSVkVSX1ZFUlNJT04pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ09NTUFORF9XSU5ET1dfTUFOQUdFUl9MSVNULmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbVdpbmRvd01hbmFnZXIudmlld1NlcnZlckxpc3RXaW5kb3dzKG1DbGllbnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZihDT01NQU5EX1dJTkRPV19NQU5BR0VSX0FVVE9MSVNULmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gd2luZG93TWFuYWdlckF1dG9saXN0TG9vcCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1XaW5kb3dNYW5hZ2VyLnZpZXdTZXJ2ZXJXaW5kb3dDb21tYW5kKG1DbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCwgcGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJBbiBlcnJvciBvY2N1cmVkIHdpdGggdGhlIGNvbW1hbmQ6ICIgKyBjb21tYW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIkNvbm5lY3Rpb24gZXJyb3I6ICIsIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd3NDaGFuZ2VkKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBtTmVlZFdpbmRvd0xpc3RVcGRhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHdpbmRvd01hbmFnZXJBdXRvbGlzdExvb3AoKSB7CisgICAgICAgICAgICBtV2luZG93TWFuYWdlci5hZGRXaW5kb3dDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG1DbGllbnQuZ2V0T3V0cHV0U3RyZWFtKCkpKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIVRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFtTmVlZFdpbmRvd0xpc3RVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtTmVlZFdpbmRvd0xpc3RVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlVQREFURVxuIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJDb25uZWN0aW9uIGVycm9yOiAiLCBlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLnJlbW92ZVdpbmRvd0NoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBkOGMwM2NjLi5jOTg2ZGNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTQ4LDcgKzQ4LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dE1ldGhvZENsaWVudDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5XaW5kb3dNYW5hZ2VyUG9saWN5VGhyZWFkOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5LZXlJbnB1dFF1ZXVlLlF1ZXVlZEV2ZW50OwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5CYXR0ZXJ5U3RhdHNTZXJ2aWNlOwogCiBpbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKQEAgLTk1LDYgKzk0LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudmlldy5JQXBwbGljYXRpb25Ub2tlbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSU9uS2V5Z3VhcmRFeGl0UmVzdWx0OwogaW1wb3J0IGFuZHJvaWQudmlldy5JUm90YXRpb25XYXRjaGVyOwpAQCAtMTA1LDcgKzEwNSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0UXVldWU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuUmF3SW5wdXRFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVNlc3Npb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0xMzcsNyArMTM2LDcgQEAKIAogLyoqIHtAaGlkZX0gKi8KIHB1YmxpYyBjbGFzcyBXaW5kb3dNYW5hZ2VyU2VydmljZSBleHRlbmRzIElXaW5kb3dNYW5hZ2VyLlN0dWIKLSAgICAgICAgaW1wbGVtZW50cyBXYXRjaGRvZy5Nb25pdG9yLCBLZXlJbnB1dFF1ZXVlLkhhcHRpY0ZlZWRiYWNrQ2FsbGJhY2sgeworICAgICAgICBpbXBsZW1lbnRzIFdhdGNoZG9nLk1vbml0b3IgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpbmRvd01hbmFnZXIiOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRk9DVVMgPSBmYWxzZTsKQEAgLTE1OCwxNyArMTU3LDEyIEBACiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19UUkFOU0FDVElPTlMgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX1NUQUNLX0NSQVdMUyA9IHRydWU7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVBU1VSRV9MQVRFTkNZID0gZmFsc2U7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCA9Ci0gICAgICAgIFdpbmRvd01hbmFnZXJQb2xpY3kuRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSDsKICAgICBzdGF0aWMgcHJpdmF0ZSBMYXRlbmN5VGltZXIgbHQ7CiAKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9GSUxFX09SSUVOVEFUSU9OID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gQkxVUiA9IHRydWU7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWID0gREVCVUc7CiAKLSAgICAvKiogSG93IGxvbmcgdG8gd2FpdCBmb3Igc3Vic2VxdWVudCBrZXkgcmVwZWF0cywgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgc3RhdGljIGZpbmFsIGludCBLRVlfUkVQRUFUX0RFTEFZID0gNTA7Ci0KICAgICAvKiogSG93IG11Y2ggdG8gbXVsdGlwbHkgdGhlIHBvbGljeSdzIHR5cGUgbGF5ZXIsIHRvIHJlc2VydmUgcm9vbQogICAgICAqIGZvciBtdWx0aXBsZSB3aW5kb3dzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIFotb3JkZXJpbmcgYWRqdXN0bWVudAogICAgICAqIHdpdGggVFlQRV9MQVlFUl9PRkZTRVQuICovCkBAIC0yMDksMzQgKzIwMywxMSBAQAogICAgIC8vIERlZmF1bHQgaW5wdXQgZGlzcGF0Y2hpbmcgdGltZW91dCBpbiBuYW5vc2Vjb25kcy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfSU5QVVRfRElTUEFUQ0hJTkdfVElNRU9VVF9OQU5PUyA9IDUwMDAgKiAxMDAwMDAwTDsKIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5KRUNUX0ZBSUxFRCA9IDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBJTkpFQ1RfU1VDQ0VFREVEID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IElOSkVDVF9OT19QRVJNSVNTSU9OID0gLTE7Ci0KICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9GT0NVU19OT1JNQUwgPSAwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0ZPQ1VTX1dJTExfQVNTSUdOX0xBWUVSUyA9IDE7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfRk9DVVNfUExBQ0lOR19TVVJGQUNFUyA9IDI7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfRk9DVVNfV0lMTF9QTEFDRV9TVVJGQUNFUyA9IDM7CiAKLSAgICAvKiogVGhlIG1pbmltdW0gdGltZSBiZXR3ZWVuIGRpc3BhdGNoaW5nIHRvdWNoIGV2ZW50cy4gKi8KLSAgICBpbnQgbU1pbldhaXRUaW1lQmV0d2VlblRvdWNoRXZlbnRzID0gMTAwMCAvIDM1OwotCi0gICAgLy8gTGFzdCB0b3VjaCBldmVudCB0aW1lCi0gICAgbG9uZyBtTGFzdFRvdWNoRXZlbnRUaW1lID0gMDsKLQotICAgIC8vIExhc3QgdG91Y2ggZXZlbnQgdHlwZQotICAgIGludCBtTGFzdFRvdWNoRXZlbnRUeXBlID0gT1RIRVJfRVZFTlQ7Ci0KLSAgICAvLyBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdXNlcmFjdGl2aXR5IGFnYWluLiBUaGlzIHNhdmVzIENQVSB1c2FnZQotICAgIC8vIHdoZW4gd2UgZ2V0IGEgZmxvb2Qgb2YgdG91Y2ggZXZlbnRzLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1RJTUVfQkVUV0VFTl9VU0VSQUNUSVZJVElFUyA9IDEwMDA7Ci0KLSAgICAvLyBMYXN0IHRpbWUgd2UgY2FsbCB1c2VyIGFjdGl2aXR5Ci0gICAgbG9uZyBtTGFzdFVzZXJBY3Rpdml0eUNhbGxUaW1lID0gMDsKLQotICAgIC8vIExhc3QgdGltZSB3ZSB1cGRhdGVkIGJhdHRlcnkgc3RhdHMKLSAgICBsb25nIG1MYXN0QmF0dGVyeVN0YXRzQ2FsbFRpbWUgPSAwOwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9TRUNVUkUgPSAicm8uc2VjdXJlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0RFQlVHR0FCTEUgPSAicm8uZGVidWdnYWJsZSI7CiAKQEAgLTQ4NSw3ICs0NTYsNiBAQAogICAgIGZsb2F0IG1MYXN0V2FsbHBhcGVyWSA9IC0xOwogICAgIGZsb2F0IG1MYXN0V2FsbHBhcGVyWFN0ZXAgPSAtMTsKICAgICBmbG9hdCBtTGFzdFdhbGxwYXBlcllTdGVwID0gLTE7Ci0gICAgYm9vbGVhbiBtU2VuZGluZ1BvaW50ZXJzVG9XYWxscGFwZXIgPSBmYWxzZTsKICAgICAvLyBUaGlzIGlzIHNldCB3aGVuIHdlIGFyZSB3YWl0aW5nIGZvciBhIHdhbGxwYXBlciB0byB0ZWxsIHVzIGl0IGlzIGRvbmUKICAgICAvLyBjaGFuZ2luZyBpdHMgc2Nyb2xsIHBvc2l0aW9uLgogICAgIFdpbmRvd1N0YXRlIG1XYWl0aW5nT25XYWxscGFwZXI7CkBAIC01MDMsMTAgKzQ3Myw3IEBACiAgICAgZmxvYXQgbVdpbmRvd0FuaW1hdGlvblNjYWxlID0gMS4wZjsKICAgICBmbG9hdCBtVHJhbnNpdGlvbkFuaW1hdGlvblNjYWxlID0gMS4wZjsKIAotICAgIGZpbmFsIEtleVdhaXRlciBtS2V5V2FpdGVyID0gbmV3IEtleVdhaXRlcigpOwotICAgIGZpbmFsIEtleVEgbVF1ZXVlOwogICAgIGZpbmFsIElucHV0TWFuYWdlciBtSW5wdXRNYW5hZ2VyOwotICAgIGZpbmFsIElucHV0RGlzcGF0Y2hlclRocmVhZCBtSW5wdXRUaHJlYWQ7CiAKICAgICAvLyBXaG8gaXMgaG9sZGluZyB0aGUgc2NyZWVuIG9uLgogICAgIFNlc3Npb24gbUhvbGRpbmdTY3JlZW5PbjsKQEAgLTUyMSw4ICs0ODgsMTMgQEAKICAgICBib29sZWFuIG1JblRvdWNoTW9kZSA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBWaWV3U2VydmVyIG1WaWV3U2VydmVyOworICAgIHByaXZhdGUgQXJyYXlMaXN0PFdpbmRvd0NoYW5nZUxpc3RlbmVyPiBtV2luZG93Q2hhbmdlTGlzdGVuZXJzID0KKyAgICAgICAgbmV3IEFycmF5TGlzdDxXaW5kb3dDaGFuZ2VMaXN0ZW5lcj4oKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVdpbmRvd3NDaGFuZ2VkID0gZmFsc2U7CiAKLSAgICBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgcHVibGljIGludGVyZmFjZSBXaW5kb3dDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd3NDaGFuZ2VkKCk7CisgICAgfQogCiAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBtVGVtcENvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOwogICAgIGludCBtU2NyZWVuTGF5b3V0ID0gQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9VTkRFRklORUQ7CkBAIC01NzEsNiArNTQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbUhhdmVJbnB1dE1ldGhvZHMpOwogICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLnNldFRocmVhZFByaW9yaXR5KAogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0RJU1BMQVkpOworICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLnNldENhblNlbGZCYWNrZ3JvdW5kKGZhbHNlKTsKIAogICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAgICAgbVNlcnZpY2UgPSBzOwpAQCAtNjA2LDYgKzU3OSw3IEBACiAgICAgICAgICAgICAvLyAgICAgICAgTG9nLlZFUkJPU0UsICJXaW5kb3dNYW5hZ2VyUG9saWN5IiwgTG9nLkxPR19JRF9TWVNURU0pKTsKICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5zZXRUaHJlYWRQcmlvcml0eSgKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLlRIUkVBRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKKyAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5zZXRDYW5TZWxmQmFja2dyb3VuZChmYWxzZSk7CiAgICAgICAgICAgICBtUG9saWN5LmluaXQobUNvbnRleHQsIG1TZXJ2aWNlLCBtUE0pOwogCiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTY0OSwyOCArNjIzLDExIEBACiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oRGV2aWNlUG9saWN5TWFuYWdlci5BQ1RJT05fREVWSUNFX1BPTElDWV9NQU5BR0VSX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKIAotICAgICAgICBpbnQgbWF4X2V2ZW50c19wZXJfc2VjID0gMzU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXhfZXZlbnRzX3Blcl9zZWMgPSBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbVByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldCgid2luZG93c21nci5tYXhfZXZlbnRzX3Blcl9zZWMiKSk7Ci0gICAgICAgICAgICBpZiAobWF4X2V2ZW50c19wZXJfc2VjIDwgMSkgewotICAgICAgICAgICAgICAgIG1heF9ldmVudHNfcGVyX3NlYyA9IDM1OwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIG1NaW5XYWl0VGltZUJldHdlZW5Ub3VjaEV2ZW50cyA9IDEwMDAgLyBtYXhfZXZlbnRzX3Blcl9zZWM7Ci0KICAgICAgICAgbUhvbGRpbmdTY3JlZW5XYWtlTG9jayA9IHBtYy5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuU0NSRUVOX0JSSUdIVF9XQUtFX0xPQ0ssCiAgICAgICAgICAgICAgICAgIktFRVBfU0NSRUVOX09OX0ZMQUciKTsKICAgICAgICAgbUhvbGRpbmdTY3JlZW5XYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKIAotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgbUlucHV0TWFuYWdlciA9IG5ldyBJbnB1dE1hbmFnZXIoY29udGV4dCwgdGhpcywgbVBvbGljeSwgcG1jLCBtUG93ZXJNYW5hZ2VyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIG1RdWV1ZSA9IG5ldyBLZXlRKCk7Ci0gICAgICAgIG1JbnB1dFRocmVhZCA9IG5ldyBJbnB1dERpc3BhdGNoZXJUaHJlYWQoKTsKKyAgICAgICAgbUlucHV0TWFuYWdlciA9IG5ldyBJbnB1dE1hbmFnZXIoY29udGV4dCwgdGhpcywgcG1jLCBtUG93ZXJNYW5hZ2VyKTsKIAogICAgICAgICBQb2xpY3lUaHJlYWQgdGhyID0gbmV3IFBvbGljeVRocmVhZChtUG9saWN5LCB0aGlzLCBjb250ZXh0LCBwbSk7CiAgICAgICAgIHRoci5zdGFydCgpOwpAQCAtNjg0LDExICs2NDEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuc3RhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnB1dFRocmVhZC5zdGFydCgpOwotICAgICAgICB9CisgICAgICAgIG1JbnB1dE1hbmFnZXIuc3RhcnQoKTsKIAogICAgICAgICAvLyBBZGQgb3Vyc2VsZiB0byB0aGUgV2F0Y2hkb2cgbW9uaXRvcnMuCiAgICAgICAgIFdhdGNoZG9nLmdldEluc3RhbmNlKCkuYWRkTW9uaXRvcih0aGlzKTsKQEAgLTcxNSw2ICs2NjgsNyBAQAogICAgICAgICAgICAgVEFHLCAiQWRkaW5nIHdpbmRvdyAiICsgd2luZG93ICsgIiBhdCAiCiAgICAgICAgICAgICArIChpKzEpICsgIiBvZiAiICsgbVdpbmRvd3Muc2l6ZSgpICsgIiAoYWZ0ZXIgIiArIHBvcyArICIpIik7CiAgICAgICAgIG1XaW5kb3dzLmFkZChpKzEsIHdpbmRvdyk7CisgICAgICAgIG1XaW5kb3dzQ2hhbmdlZCA9IHRydWU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHBsYWNlV2luZG93QmVmb3JlKE9iamVjdCBwb3MsIFdpbmRvd1N0YXRlIHdpbmRvdykgewpAQCAtNzIzLDYgKzY3Nyw3IEBACiAgICAgICAgICAgICBUQUcsICJBZGRpbmcgd2luZG93ICIgKyB3aW5kb3cgKyAiIGF0ICIKICAgICAgICAgICAgICsgaSArICIgb2YgIiArIG1XaW5kb3dzLnNpemUoKSArICIgKGJlZm9yZSAiICsgcG9zICsgIikiKTsKICAgICAgICAgbVdpbmRvd3MuYWRkKGksIHdpbmRvdyk7CisgICAgICAgIG1XaW5kb3dzQ2hhbmdlZCA9IHRydWU7CiAgICAgfQogCiAgICAgLy9UaGlzIG1ldGhvZCBmaW5kcyBvdXQgdGhlIGluZGV4IG9mIGEgd2luZG93IHRoYXQgaGFzIHRoZSBzYW1lIGFwcCB0b2tlbiBhcwpAQCAtNzgwLDYgKzczNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHLCAiQWRkaW5nIHdpbmRvdyAiICsgd2luICsgIiBhdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAobmV3SWR4KzEpICsgIiBvZiAiICsgTik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsbVdpbmRvd3MuYWRkKG5ld0lkeCsxLCB3aW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtODYyLDYgKzgxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUcsICJBZGRpbmcgd2luZG93ICIgKyB3aW4gKyAiIGF0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaSArICIgb2YgIiArIE4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsbVdpbmRvd3MuYWRkKGksIHdpbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpbmRvd3NDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTg3OSw2ICs4MzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgVEFHLCAiQWRkaW5nIHdpbmRvdyAiICsgd2luICsgIiBhdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIGkgKyAiIG9mICIgKyBOKTsKICAgICAgICAgICAgICAgICBsb2NhbG1XaW5kb3dzLmFkZChpLCB3aW4pOworICAgICAgICAgICAgICAgIG1XaW5kb3dzQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYWRkVG9Ub2tlbikgewogICAgICAgICAgICAgICAgIHRva2VuLndpbmRvd3MuYWRkKHRva2VuV2luZG93c1Bvcywgd2luKTsKQEAgLTEwODcsNiArMTA0NSw3IEBACiAgICAgICAgICAgICBpZiAoREVCVUdfV0lORE9XX01PVkVNRU5UKSBTbG9nLnYoCiAgICAgICAgICAgICAgICAgICAgIFRBRywgIkFkZGluZyBpbnB1dCBtZXRob2Qgd2luZG93ICIgKyB3aW4gKyAiIGF0ICIgKyBwb3MpOwogICAgICAgICAgICAgbVdpbmRvd3MuYWRkKHBvcywgd2luKTsKKyAgICAgICAgICAgIG1XaW5kb3dzQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICBtb3ZlSW5wdXRNZXRob2REaWFsb2dzTG9ja2VkKHBvcysxKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTEyOCw2ICsxMDg3LDcgQEAKICAgICAgICAgICAgIGlmICh3cG9zIDwgaW50ZXJlc3RpbmdQb3MpIGludGVyZXN0aW5nUG9zLS07CiAgICAgICAgICAgICBpZiAoREVCVUdfV0lORE9XX01PVkVNRU5UKSBTbG9nLnYoVEFHLCAiVGVtcCByZW1vdmluZyBhdCAiICsgd3BvcyArICI6ICIgKyB3aW4pOwogICAgICAgICAgICAgbVdpbmRvd3MucmVtb3ZlKHdwb3MpOworICAgICAgICAgICAgbVdpbmRvd3NDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgIGludCBOQyA9IHdpbi5tQ2hpbGRXaW5kb3dzLnNpemUoKTsKICAgICAgICAgICAgIHdoaWxlIChOQyA+IDApIHsKICAgICAgICAgICAgICAgICBOQy0tOwpAQCAtMTE1NCw2ICsxMTE0LDcgQEAKICAgICAgICAgICAgIGlmIChERUJVR19XSU5ET1dfTU9WRU1FTlQpIFNsb2cudihUQUcsICJSZUFkZCByZW1vdmluZyBmcm9tICIgKyB3cG9zCiAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIHdpbik7CiAgICAgICAgICAgICBtV2luZG93cy5yZW1vdmUod3Bvcyk7CisgICAgICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgcmVBZGRXaW5kb3dMb2NrZWQod3Bvcywgd2luKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE2MTQsNiArMTU3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19XSU5ET1dfTU9WRU1FTlQpIFNsb2cudihUQUcsICJXYWxscGFwZXIgcmVtb3ZpbmcgYXQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb2xkSW5kZXggKyAiOiAiICsgd2FsbHBhcGVyKTsKICAgICAgICAgICAgICAgICAgICAgbG9jYWxtV2luZG93cy5yZW1vdmUob2xkSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBpZiAob2xkSW5kZXggPCBmb3VuZEkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSS0tOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNjI1LDYgKzE1ODcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gIiArIG9sZEluZGV4ICsgIiB0byAiICsgZm91bmRJKTsKIAogICAgICAgICAgICAgICAgIGxvY2FsbVdpbmRvd3MuYWRkKGZvdW5kSSwgd2FsbHBhcGVyKTsKKyAgICAgICAgICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gQURKVVNUX1dBTExQQVBFUl9MQVlFUlNfQ0hBTkdFRDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTgxNCw3MCArMTc3Nyw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICB2b2lkIHNlbmRQb2ludGVyVG9XYWxscGFwZXJMb2NrZWQoV2luZG93U3RhdGUgc3JjV2luLAotICAgICAgICAgICAgTW90aW9uRXZlbnQgcG9pbnRlciwgbG9uZyBldmVudFRpbWUpIHsKLSAgICAgICAgaW50IGN1clRva2VuSW5kZXggPSBtV2FsbHBhcGVyVG9rZW5zLnNpemUoKTsKLSAgICAgICAgd2hpbGUgKGN1clRva2VuSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICBjdXJUb2tlbkluZGV4LS07Ci0gICAgICAgICAgICBXaW5kb3dUb2tlbiB0b2tlbiA9IG1XYWxscGFwZXJUb2tlbnMuZ2V0KGN1clRva2VuSW5kZXgpOwotICAgICAgICAgICAgaW50IGN1cldhbGxwYXBlckluZGV4ID0gdG9rZW4ud2luZG93cy5zaXplKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY3VyV2FsbHBhcGVySW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgY3VyV2FsbHBhcGVySW5kZXgtLTsKLSAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB3YWxscGFwZXIgPSB0b2tlbi53aW5kb3dzLmdldChjdXJXYWxscGFwZXJJbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKCh3YWxscGFwZXIubUF0dHJzLmZsYWdzICYKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIQUJMRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQgZXYgPSBNb3Rpb25FdmVudC5vYnRhaW5Ob0hpc3RvcnkocG9pbnRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNXaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXYub2Zmc2V0TG9jYXRpb24oc3JjV2luLm1GcmFtZS5sZWZ0LXdhbGxwYXBlci5tRnJhbWUubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjV2luLm1GcmFtZS50b3Atd2FsbHBhcGVyLm1GcmFtZS50b3ApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXYub2Zmc2V0TG9jYXRpb24oLXdhbGxwYXBlci5tRnJhbWUubGVmdCwgLXdhbGxwYXBlci5tRnJhbWUudG9wKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBvaW50ZXIuZ2V0QWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRpbmdQb2ludGVyc1RvV2FsbHBhcGVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZW5kaW5nUG9pbnRlcnNUb1dhbGxwYXBlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdhbGxwYXBlci5tQ2xpZW50LmRpc3BhdGNoUG9pbnRlcihldiwgZXZlbnRUaW1lLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkZhaWx1cmUgc2VuZGluZyBwb2ludGVyIHRvIHdhbGxwYXBlciIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGlzcGF0Y2hQb2ludGVyRWxzZXdoZXJlTG9ja2VkKFdpbmRvd1N0YXRlIHNyY1dpbiwgV2luZG93U3RhdGUgcmVsV2luLAotICAgICAgICAgICAgTW90aW9uRXZlbnQgcG9pbnRlciwgbG9uZyBldmVudFRpbWUsIGJvb2xlYW4gc2tpcHBlZCkgewotICAgICAgICBpZiAocmVsV2luICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qb2xpY3kuZGlzcGF0Y2hlZFBvaW50ZXJFdmVudEx3KHBvaW50ZXIsIHJlbFdpbi5tRnJhbWUubGVmdCwgcmVsV2luLm1GcmFtZS50b3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBvbGljeS5kaXNwYXRjaGVkUG9pbnRlckV2ZW50THcocG9pbnRlciwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHdlIHNlbnQgYW4gaW5pdGlhbCBkb3duIHRvIHRoZSB3YWxscGFwZXIsIHRoZW4gY29udGludWUKLSAgICAgICAgLy8gc2VuZGluZyBldmVudHMgdW50aWwgdGhlIGZpbmFsIHVwLgotICAgICAgICBpZiAobVNlbmRpbmdQb2ludGVyc1RvV2FsbHBhcGVyKSB7Ci0gICAgICAgICAgICBpZiAoc2tpcHBlZCkgewotICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJTZW5kaW5nIHNraXBwZWQgcG9pbnRlciB0byB3YWxscGFwZXIhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZW5kUG9pbnRlclRvV2FsbHBhcGVyTG9ja2VkKHJlbFdpbiwgcG9pbnRlciwgZXZlbnRUaW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICAvLyBJZiB3ZSBhcmUgb24gdG9wIG9mIHRoZSB3YWxscGFwZXIsIHRoZW4gdGhlIHdhbGxwYXBlciBhbHNvCi0gICAgICAgIC8vIGdldHMgdG8gc2VlIHRoaXMgbW92ZW1lbnQuCi0gICAgICAgIH0gZWxzZSBpZiAoc3JjV2luICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBwb2ludGVyLmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOCi0gICAgICAgICAgICAgICAgJiYgbVdhbGxwYXBlclRhcmdldCA9PSBzcmNXaW4KLSAgICAgICAgICAgICAgICAmJiBzcmNXaW4ubUF0dHJzLnR5cGUgIT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9LRVlHVUFSRCkgewotICAgICAgICAgICAgc2VuZFBvaW50ZXJUb1dhbGxwYXBlckxvY2tlZChyZWxXaW4sIHBvaW50ZXIsIGV2ZW50VGltZSk7Ci0gICAgICAgIH0KLSAgICB9CiAgICAgCiAgICAgcHVibGljIGludCBhZGRXaW5kb3coU2Vzc2lvbiBzZXNzaW9uLCBJV2luZG93IGNsaWVudCwKICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzLCBpbnQgdmlld1Zpc2liaWxpdHksCkBAIC0xOTAwLDEyICsxNzk5LDcgQEAKICAgICAgICAgICAgICAgICBtRGlzcGxheSA9IHdtLmdldERlZmF1bHREaXNwbGF5KCk7CiAgICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5V2lkdGggPSBtRGlzcGxheS5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgIG1Jbml0aWFsRGlzcGxheUhlaWdodCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwotICAgICAgICAgICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuc2V0RGlzcGxheVNpemUoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCwgbUluaXRpYWxEaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUXVldWUuc2V0RGlzcGxheShtRGlzcGxheSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuc2V0RGlzcGxheVNpemUoMCwgbUluaXRpYWxEaXNwbGF5V2lkdGgsIG1Jbml0aWFsRGlzcGxheUhlaWdodCk7CiAgICAgICAgICAgICAgICAgcmVwb3J0TmV3Q29uZmlnID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIApAQCAtMTk5OSwxNSArMTg5MywxMyBAQAogICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dElucHV0Q2hhbm5lbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gd2luLm1ha2VJbnB1dENoYW5uZWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0Q2hhbm5lbFtdIGlucHV0Q2hhbm5lbHMgPSBJbnB1dENoYW5uZWwub3BlbklucHV0Q2hhbm5lbFBhaXIobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdpbi5tSW5wdXRDaGFubmVsID0gaW5wdXRDaGFubmVsc1swXTsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRDaGFubmVsc1sxXS50cmFuc2ZlclRvQmluZGVyT3V0UGFyYW1ldGVyKG91dElucHV0Q2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnJlZ2lzdGVySW5wdXRDaGFubmVsKHdpbi5tSW5wdXRDaGFubmVsKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0SW5wdXRDaGFubmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHdpbi5tYWtlSW5wdXRDaGFubmVsTmFtZSgpOworICAgICAgICAgICAgICAgIElucHV0Q2hhbm5lbFtdIGlucHV0Q2hhbm5lbHMgPSBJbnB1dENoYW5uZWwub3BlbklucHV0Q2hhbm5lbFBhaXIobmFtZSk7CisgICAgICAgICAgICAgICAgd2luLm1JbnB1dENoYW5uZWwgPSBpbnB1dENoYW5uZWxzWzBdOworICAgICAgICAgICAgICAgIGlucHV0Q2hhbm5lbHNbMV0udHJhbnNmZXJUb0JpbmRlck91dFBhcmFtZXRlcihvdXRJbnB1dENoYW5uZWwpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIucmVnaXN0ZXJJbnB1dENoYW5uZWwod2luLm1JbnB1dENoYW5uZWwpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBGcm9tIG5vdyBvbiwgbm8gZXhjZXB0aW9ucyBvciBlcnJvcnMgYWxsb3dlZCEKQEAgLTIxODMsMTQgKzIwNzUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZW1vdmVXaW5kb3dJbm5lckxvY2tlZChTZXNzaW9uIHNlc3Npb24sIFdpbmRvd1N0YXRlIHdpbikgewotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgbUlucHV0TW9uaXRvci53aW5kb3dJc0JlaW5nUmVtb3ZlZEx3KHdpbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtS2V5V2FpdGVyLmZpbmlzaGVkS2V5KHNlc3Npb24sIHdpbi5tQ2xpZW50LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBLZXlXYWl0ZXIuUkVUVVJOX05PVEhJTkcpOwotICAgICAgICAgICAgbUtleVdhaXRlci5yZWxlYXNlUGVuZGluZ1BvaW50ZXJMb2NrZWQod2luLm1TZXNzaW9uKTsKLSAgICAgICAgICAgIG1LZXlXYWl0ZXIucmVsZWFzZVBlbmRpbmdUcmFja2JhbGxMb2NrZWQod2luLm1TZXNzaW9uKTsKLSAgICAgICAgfQorICAgICAgICBtSW5wdXRNb25pdG9yLndpbmRvd0lzQmVpbmdSZW1vdmVkTHcod2luKTsKIAogICAgICAgICB3aW4ubVJlbW92ZWQgPSB0cnVlOwogCkBAIC0yMjA5LDYgKzIwOTQsNyBAQAogCiAgICAgICAgIG1XaW5kb3dNYXAucmVtb3ZlKHdpbi5tQ2xpZW50LmFzQmluZGVyKCkpOwogICAgICAgICBtV2luZG93cy5yZW1vdmUod2luKTsKKyAgICAgICAgbVdpbmRvd3NDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgaWYgKERFQlVHX1dJTkRPV19NT1ZFTUVOVCkgU2xvZy52KFRBRywgIkZpbmFsIHJlbW92ZSBvZiB3aW5kb3c6ICIgKyB3aW4pOwogCiAgICAgICAgIGlmIChtSW5wdXRNZXRob2RXaW5kb3cgPT0gd2luKSB7CkBAIC0yNTU4LDEyICsyNDQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5QW5pbWF0aW9uTG9ja2VkKHdpbiwgdHJhbnNpdCwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNNYXlDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbi5tRXhpdGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0TW9uaXRvci53aW5kb3dJc0JlY29taW5nSW52aXNpYmxlTHcod2luKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLmZpbmlzaGVkS2V5KHNlc3Npb24sIGNsaWVudCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlXYWl0ZXIuUkVUVVJOX05PVEhJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb25pdG9yLndpbmRvd0lzQmVjb21pbmdJbnZpc2libGVMdyh3aW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aW4uaXNBbmltYXRpbmcoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSBpbiBhIGhpZGUgYW5pbWF0aW9uLi4uIHR1cm4gdGhpcyBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gZXhpdC4KQEAgLTMwMjQsMTIgKzI5MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbi5pc1Zpc2libGVOb3coKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5QW5pbWF0aW9uTG9ja2VkKHdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXJQb2xpY3kuVFJBTlNJVF9FWElULCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0TW9uaXRvci53aW5kb3dJc0JlaW5nUmVtb3ZlZEx3KHdpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUtleVdhaXRlci5maW5pc2hlZEtleSh3aW4ubVNlc3Npb24sIHdpbi5tQ2xpZW50LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleVdhaXRlci5SRVRVUk5fTk9USElORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3Iud2luZG93SXNCZWluZ1JlbW92ZWRMdyh3aW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMzQ2LDEyICszMjIyLDggQEAKICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRk9DVVMpIFNsb2cudihUQUcsICJDbGVhcmluZyBmb2N1c2VkIGFwcCwgd2FzICIgKyBtRm9jdXNlZEFwcCk7CiAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IG1Gb2N1c2VkQXBwICE9IG51bGw7CiAgICAgICAgICAgICAgICAgbUZvY3VzZWRBcHAgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb25pdG9yLnNldEZvY3VzZWRBcHBMdyhudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1LZXlXYWl0ZXIudGlja2xlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0TW9uaXRvci5zZXRGb2N1c2VkQXBwTHcobnVsbCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBcHBXaW5kb3dUb2tlbiBuZXdGb2N1cyA9IGZpbmRBcHBXaW5kb3dUb2tlbih0b2tlbik7CkBAIC0zMzYyLDEyICszMjM0LDggQEAKICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gbUZvY3VzZWRBcHAgIT0gbmV3Rm9jdXM7CiAgICAgICAgICAgICAgICAgbUZvY3VzZWRBcHAgPSBuZXdGb2N1czsKICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRk9DVVMpIFNsb2cudihUQUcsICJTZXQgZm9jdXNlZCBhcHAgdG86ICIgKyBtRm9jdXNlZEFwcCk7Ci0gICAgICAgICAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3Iuc2V0Rm9jdXNlZEFwcEx3KG5ld0ZvY3VzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1LZXlXYWl0ZXIudGlja2xlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0TW9uaXRvci5zZXRGb2N1c2VkQXBwTHcobmV3Rm9jdXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMzUwOSw2ICszMzc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19XSU5ET1dfTU9WRU1FTlQpIFNsb2cudihUQUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZW1vdmluZyBzdGFydGluZyB3aW5kb3c6ICIgKyBzdGFydGluZ1dpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2luZG93cy5yZW1vdmUoc3RhcnRpbmdXaW5kb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgbVdpbmRvd3NDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHR0b2tlbi53aW5kb3dzLnJlbW92ZShzdGFydGluZ1dpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0dG9rZW4uYWxsQXBwV2luZG93cy5yZW1vdmUoc3RhcnRpbmdXaW5kb3cpOwogICAgICAgICAgICAgICAgICAgICAgICAgYWRkV2luZG93VG9MaXN0SW5PcmRlckxvY2tlZChzdGFydGluZ1dpbmRvdywgdHJ1ZSk7CkBAIC0zNjc5LDEyICszNTQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5QW5pbWF0aW9uTG9ja2VkKHdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlclBvbGljeS5UUkFOU0lUX0VYSVQsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0TW9uaXRvci53aW5kb3dJc0JlY29taW5nSW52aXNpYmxlTHcod2luKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlXYWl0ZXIuZmluaXNoZWRLZXkod2luLm1TZXNzaW9uLCB3aW4ubUNsaWVudCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5V2FpdGVyLlJFVFVSTl9OT1RISU5HKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb25pdG9yLndpbmRvd0lzQmVjb21pbmdJbnZpc2libGVMdyh3aW4pOwogICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0zOTY5LDExICszODMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0ZPQ1VTKSBTbG9nLnYoVEFHLCAiUmVtb3ZpbmcgZm9jdXNlZCBhcHAgdG9rZW46IiArIHd0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgIG1Gb2N1c2VkQXBwID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRm9jdXNlZFdpbmRvd0xvY2tlZChVUERBVEVfRk9DVVNfTk9STUFMKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3Iuc2V0Rm9jdXNlZEFwcEx3KG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUtleVdhaXRlci50aWNrbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb25pdG9yLnNldEZvY3VzZWRBcHBMdyhudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJBdHRlbXB0ZWQgdG8gcmVtb3ZlIG5vbi1leGlzdGluZyBhcHAgdG9rZW46ICIgKyB0b2tlbik7CkBAIC0zOTk5LDYgKzM4NTksNyBAQAogICAgICAgICAgICAgV2luZG93U3RhdGUgd2luID0gdG9rZW4ud2luZG93cy5nZXQoaSk7CiAgICAgICAgICAgICBpZiAoREVCVUdfV0lORE9XX01PVkVNRU5UKSBTbG9nLnYoVEFHLCAiVG1wIHJlbW92aW5nIGFwcCB3aW5kb3cgIiArIHdpbik7CiAgICAgICAgICAgICBtV2luZG93cy5yZW1vdmUod2luKTsKKyAgICAgICAgICAgIG1XaW5kb3dzQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICBpbnQgaiA9IHdpbi5tQ2hpbGRXaW5kb3dzLnNpemUoKTsKICAgICAgICAgICAgIHdoaWxlIChqID4gMCkgewogICAgICAgICAgICAgICAgIGotLTsKQEAgLTQxMDMsNiArMzk2NCw3IEBACiAgICAgICAgICAgICBtV2luZG93cy5hZGQoaW5kZXgsIHdpbik7CiAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICB9CisgICAgICAgIG1XaW5kb3dzQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgIHJldHVybiBpbmRleDsKICAgICB9CiAKQEAgLTQ0MzgsMTEgKzQzMDAsNyBAQAogICAgICAgICAgICAgICAgICJnZXRTd2l0Y2hTdGF0ZSgpIikpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUmVxdWlyZXMgUkVBRF9JTlBVVF9TVEFURSBwZXJtaXNzaW9uIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5wdXRNYW5hZ2VyLmdldFN3aXRjaFN0YXRlKHN3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBLZXlJbnB1dFF1ZXVlLmdldFN3aXRjaFN0YXRlKHN3KTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0TWFuYWdlci5nZXRTd2l0Y2hTdGF0ZShzdyk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRTd2l0Y2hTdGF0ZUZvckRldmljZShpbnQgZGV2aWQsIGludCBzdykgewpAQCAtNDQ1MCwxMSArNDMwOCw3IEBACiAgICAgICAgICAgICAgICAgImdldFN3aXRjaFN0YXRlRm9yRGV2aWNlKCkiKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBSRUFEX0lOUFVUX1NUQVRFIHBlcm1pc3Npb24iKTsKICAgICAgICAgfQotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuZ2V0U3dpdGNoU3RhdGUoZGV2aWQsIHN3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBLZXlJbnB1dFF1ZXVlLmdldFN3aXRjaFN0YXRlKGRldmlkLCBzdyk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuZ2V0U3dpdGNoU3RhdGUoZGV2aWQsIHN3KTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldFNjYW5jb2RlU3RhdGUoaW50IHN3KSB7CkBAIC00NDYyLDExICs0MzE2LDcgQEAKICAgICAgICAgICAgICAgICAiZ2V0U2NhbmNvZGVTdGF0ZSgpIikpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUmVxdWlyZXMgUkVBRF9JTlBVVF9TVEFURSBwZXJtaXNzaW9uIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5wdXRNYW5hZ2VyLmdldFNjYW5jb2RlU3RhdGUoc3cpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1RdWV1ZS5nZXRTY2FuY29kZVN0YXRlKHN3KTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0TWFuYWdlci5nZXRTY2FuY29kZVN0YXRlKHN3KTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldFNjYW5jb2RlU3RhdGVGb3JEZXZpY2UoaW50IGRldmlkLCBpbnQgc3cpIHsKQEAgLTQ0NzQsMTEgKzQzMjQsNyBAQAogICAgICAgICAgICAgICAgICJnZXRTY2FuY29kZVN0YXRlRm9yRGV2aWNlKCkiKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBSRUFEX0lOUFVUX1NUQVRFIHBlcm1pc3Npb24iKTsKICAgICAgICAgfQotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuZ2V0U2NhbmNvZGVTdGF0ZShkZXZpZCwgc3cpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1RdWV1ZS5nZXRTY2FuY29kZVN0YXRlKGRldmlkLCBzdyk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuZ2V0U2NhbmNvZGVTdGF0ZShkZXZpZCwgc3cpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0VHJhY2tiYWxsU2NhbmNvZGVTdGF0ZShpbnQgc3cpIHsKQEAgLTQ0ODYsMTEgKzQzMzIsNyBAQAogICAgICAgICAgICAgICAgICJnZXRUcmFja2JhbGxTY2FuY29kZVN0YXRlKCkiKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBSRUFEX0lOUFVUX1NUQVRFIHBlcm1pc3Npb24iKTsKICAgICAgICAgfQotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuZ2V0VHJhY2tiYWxsU2NhbmNvZGVTdGF0ZShzdyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVF1ZXVlLmdldFRyYWNrYmFsbFNjYW5jb2RlU3RhdGUoc3cpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5wdXRNYW5hZ2VyLmdldFRyYWNrYmFsbFNjYW5jb2RlU3RhdGUoc3cpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0RFBhZFNjYW5jb2RlU3RhdGUoaW50IHN3KSB7CkBAIC00NDk4LDExICs0MzQwLDcgQEAKICAgICAgICAgICAgICAgICAiZ2V0RFBhZFNjYW5jb2RlU3RhdGUoKSIpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIFJFQURfSU5QVVRfU1RBVEUgcGVybWlzc2lvbiIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUlucHV0TWFuYWdlci5nZXREUGFkU2NhbmNvZGVTdGF0ZShzdyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVF1ZXVlLmdldERQYWRTY2FuY29kZVN0YXRlKHN3KTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0TWFuYWdlci5nZXREUGFkU2NhbmNvZGVTdGF0ZShzdyk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRLZXljb2RlU3RhdGUoaW50IHN3KSB7CkBAIC00NTEwLDExICs0MzQ4LDcgQEAKICAgICAgICAgICAgICAgICAiZ2V0S2V5Y29kZVN0YXRlKCkiKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBSRUFEX0lOUFVUX1NUQVRFIHBlcm1pc3Npb24iKTsKICAgICAgICAgfQotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuZ2V0S2V5Y29kZVN0YXRlKHN3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtUXVldWUuZ2V0S2V5Y29kZVN0YXRlKHN3KTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0TWFuYWdlci5nZXRLZXljb2RlU3RhdGUoc3cpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0S2V5Y29kZVN0YXRlRm9yRGV2aWNlKGludCBkZXZpZCwgaW50IHN3KSB7CkBAIC00NTIyLDExICs0MzU2LDcgQEAKICAgICAgICAgICAgICAgICAiZ2V0S2V5Y29kZVN0YXRlRm9yRGV2aWNlKCkiKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBSRUFEX0lOUFVUX1NUQVRFIHBlcm1pc3Npb24iKTsKICAgICAgICAgfQotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuZ2V0S2V5Y29kZVN0YXRlKGRldmlkLCBzdyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVF1ZXVlLmdldEtleWNvZGVTdGF0ZShkZXZpZCwgc3cpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5wdXRNYW5hZ2VyLmdldEtleWNvZGVTdGF0ZShkZXZpZCwgc3cpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0VHJhY2tiYWxsS2V5Y29kZVN0YXRlKGludCBzdykgewpAQCAtNDUzNCwxMSArNDM2NCw3IEBACiAgICAgICAgICAgICAgICAgImdldFRyYWNrYmFsbEtleWNvZGVTdGF0ZSgpIikpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUmVxdWlyZXMgUkVBRF9JTlBVVF9TVEFURSBwZXJtaXNzaW9uIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5wdXRNYW5hZ2VyLmdldFRyYWNrYmFsbEtleWNvZGVTdGF0ZShzdyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVF1ZXVlLmdldFRyYWNrYmFsbEtleWNvZGVTdGF0ZShzdyk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuZ2V0VHJhY2tiYWxsS2V5Y29kZVN0YXRlKHN3KTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldERQYWRLZXljb2RlU3RhdGUoaW50IHN3KSB7CkBAIC00NTQ2LDE5ICs0MzcyLDExIEBACiAgICAgICAgICAgICAgICAgImdldERQYWRLZXljb2RlU3RhdGUoKSIpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIFJFQURfSU5QVVRfU1RBVEUgcGVybWlzc2lvbiIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUlucHV0TWFuYWdlci5nZXREUGFkS2V5Y29kZVN0YXRlKHN3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtUXVldWUuZ2V0RFBhZEtleWNvZGVTdGF0ZShzdyk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuZ2V0RFBhZEtleWNvZGVTdGF0ZShzdyk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaGFzS2V5cyhpbnRbXSBrZXljb2RlcywgYm9vbGVhbltdIGtleUV4aXN0cykgewotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuaGFzS2V5cyhrZXljb2Rlcywga2V5RXhpc3RzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBLZXlJbnB1dFF1ZXVlLmhhc0tleXMoa2V5Y29kZXMsIGtleUV4aXN0cyk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuaGFzS2V5cyhrZXljb2Rlcywga2V5RXhpc3RzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBlbmFibGVTY3JlZW5BZnRlckJvb3QoKSB7CkBAIC00NzAyLDExICs0NTIwLDcgQEAKICAgICAgICAgICAgIG1MYXlvdXROZWVkZWQgPSB0cnVlOwogICAgICAgICAgICAgc3RhcnRGcmVlemluZ0Rpc3BsYXlMb2NrZWQoKTsKICAgICAgICAgICAgIFNsb2cuaShUQUcsICJTZXR0aW5nIHJvdGF0aW9uIHRvICIgKyByb3RhdGlvbiArICIsIGFuaW1GbGFncz0iICsgYW5pbUZsYWdzKTsKLSAgICAgICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5zZXREaXNwbGF5T3JpZW50YXRpb24oMCwgcm90YXRpb24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUXVldWUuc2V0T3JpZW50YXRpb24ocm90YXRpb24pOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUlucHV0TWFuYWdlci5zZXREaXNwbGF5T3JpZW50YXRpb24oMCwgcm90YXRpb24pOwogICAgICAgICAgICAgaWYgKG1EaXNwbGF5RW5hYmxlZCkgewogICAgICAgICAgICAgICAgIFN1cmZhY2Uuc2V0T3JpZW50YXRpb24oMCwgcm90YXRpb24sIGFuaW1GbGFncyk7CiAgICAgICAgICAgICB9CkBAIC00OTg4LDYgKzQ4MDIsMzMgQEAKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgYWRkV2luZG93Q2hhbmdlTGlzdGVuZXIoV2luZG93Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKKyAgICAgICAgICAgIG1XaW5kb3dDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVdpbmRvd0NoYW5nZUxpc3RlbmVyKFdpbmRvd0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7CisgICAgICAgICAgICBtV2luZG93Q2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5V2luZG93c0NoYW5nZWQoKSB7CisgICAgICAgIFdpbmRvd0NoYW5nZUxpc3RlbmVyW10gd2luZG93Q2hhbmdlTGlzdGVuZXJzOworICAgICAgICBzeW5jaHJvbml6ZWQobVdpbmRvd01hcCkgeworICAgICAgICAgICAgaWYobVdpbmRvd0NoYW5nZUxpc3RlbmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aW5kb3dDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgV2luZG93Q2hhbmdlTGlzdGVuZXJbbVdpbmRvd0NoYW5nZUxpc3RlbmVycy5zaXplKCldOworICAgICAgICAgICAgd2luZG93Q2hhbmdlTGlzdGVuZXJzID0gbVdpbmRvd0NoYW5nZUxpc3RlbmVycy50b0FycmF5KHdpbmRvd0NoYW5nZUxpc3RlbmVycyk7CisgICAgICAgIH0KKyAgICAgICAgaW50IE4gPSB3aW5kb3dDaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICB3aW5kb3dDaGFuZ2VMaXN0ZW5lcnNbaV0ud2luZG93c0NoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgV2luZG93U3RhdGUgZmluZFdpbmRvdyhpbnQgaGFzaENvZGUpIHsKICAgICAgICAgaWYgKGhhc2hDb2RlID09IC0xKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0Rm9jdXNlZFdpbmRvdygpOwpAQCAtNTAzNywxMSArNDg3OCw4IEBACiAgICAgICAgIGlmIChtRGlzcGxheSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuZ2V0SW5wdXRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUXVldWUuZ2V0SW5wdXRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0gICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1JbnB1dE1hbmFnZXIuZ2V0SW5wdXRDb25maWd1cmF0aW9uKGNvbmZpZyk7CiAKICAgICAgICAgLy8gVXNlIHRoZSBlZmZlY3RpdmUgInZpc3VhbCIgZGltZW5zaW9ucyBiYXNlZCBvbiBjdXJyZW50IHJvdGF0aW9uCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gcm90YXRlZCA9IChtUm90YXRpb24gPT0gU3VyZmFjZS5ST1RBVElPTl85MApAQCAtNTMyMiw2ICs1MTYwLDEzIEBACiAgICAgICAgICAgICBtVGVtcElucHV0V2luZG93cy5jbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIAorICAgICAgICAvKiBQcm92aWRlcyBmZWVkYmFjayBmb3IgYSB2aXJ0dWFsIGtleSBkb3duLiAqLworICAgICAgICBwdWJsaWMgdm9pZCB2aXJ0dWFsS2V5RG93bkZlZWRiYWNrKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7CisgICAgICAgICAgICAgICAgbVBvbGljeS5wZXJmb3JtSGFwdGljRmVlZGJhY2tMdyhudWxsLCBIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5WSVJUVUFMX0tFWSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAogICAgICAgICAvKiBOb3RpZmllcyB0aGF0IGFuIGFwcCBzd2l0Y2gga2V5IChCQUNLIC8gSE9NRSkgaGFzIGp1c3QgYmVlbiBwcmVzc2VkLgogICAgICAgICAgKiBUaGlzIGVzc2VudGlhbGx5IHN0YXJ0cyBhIC41IHNlY29uZCB0aW1lb3V0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gcHJvY2VzcwogICAgICAgICAgKiBzdWJzZXF1ZW50IGlucHV0IGV2ZW50cyB3aGlsZSB3YWl0aW5nIGZvciB0aGUgYXBwIHN3aXRjaCB0byBvY2N1ci4gIElmIGl0IHRha2VzIGxvbmdlcgpAQCAtNTMzMCwzMCArNTE3NSwyOCBAQAogICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlBcHBTd2l0Y2hDb21pbmcoKSB7CiAgICAgICAgICAgICAvLyBUT0RPIE5vdCBpbXBsZW1lbnRlZCB5ZXQuICBTaG91bGQgZ28gaW4gdGhlIG5hdGl2ZSBzaWRlLgogICAgICAgICB9Ci0KKyAgICAgICAgCisgICAgICAgIC8qIE5vdGlmaWVzIHRoYXQgdGhlIGxpZCBzd2l0Y2ggY2hhbmdlZCBzdGF0ZS4gKi8KKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5TGlkU3dpdGNoQ2hhbmdlZChsb25nIHdoZW5OYW5vcywgYm9vbGVhbiBsaWRPcGVuKSB7CisgICAgICAgICAgICBtUG9saWN5Lm5vdGlmeUxpZFN3aXRjaENoYW5nZWQod2hlbk5hbm9zLCBsaWRPcGVuKTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgLyogUHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBwb2xpY3kgdG8gaW50ZXJjZXB0IGVhcmx5IGtleQogICAgICAgICAgKiBwcm9jZXNzaW5nIGFzIHNvb24gYXMgdGhlIGtleSBoYXMgYmVlbiByZWFkIGZyb20gdGhlIGRldmljZS4gKi8KLSAgICAgICAgcHVibGljIGludCBpbnRlcmNlcHRLZXlCZWZvcmVRdWV1ZWluZyhpbnQgZGV2aWNlSWQsIGludCB0eXBlLCBpbnQgc2NhbkNvZGUsCi0gICAgICAgICAgICAgICAgaW50IGtleUNvZGUsIGludCBwb2xpY3lGbGFncywgaW50IHZhbHVlLCBsb25nIHdoZW5OYW5vcywgYm9vbGVhbiBpc1NjcmVlbk9uKSB7Ci0gICAgICAgICAgICBSYXdJbnB1dEV2ZW50IGV2ZW50ID0gbmV3IFJhd0lucHV0RXZlbnQoKTsKLSAgICAgICAgICAgIGV2ZW50LmRldmljZUlkID0gZGV2aWNlSWQ7Ci0gICAgICAgICAgICBldmVudC50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIGV2ZW50LnNjYW5jb2RlID0gc2NhbkNvZGU7Ci0gICAgICAgICAgICBldmVudC5rZXljb2RlID0ga2V5Q29kZTsKLSAgICAgICAgICAgIGV2ZW50LmZsYWdzID0gcG9saWN5RmxhZ3M7Ci0gICAgICAgICAgICBldmVudC52YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgZXZlbnQud2hlbiA9IHdoZW5OYW5vcyAvIDEwMDAwMDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5LmludGVyY2VwdEtleVRxKGV2ZW50LCBpc1NjcmVlbk9uKTsKKyAgICAgICAgcHVibGljIGludCBpbnRlcmNlcHRLZXlCZWZvcmVRdWV1ZWluZyhsb25nIHdoZW5OYW5vcywgaW50IGtleUNvZGUsIGJvb2xlYW4gZG93biwKKyAgICAgICAgICAgICAgICBpbnQgcG9saWN5RmxhZ3MsIGJvb2xlYW4gaXNTY3JlZW5PbikgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3kuaW50ZXJjZXB0S2V5QmVmb3JlUXVldWVpbmcod2hlbk5hbm9zLAorICAgICAgICAgICAgICAgICAgICBrZXlDb2RlLCBkb3duLCBwb2xpY3lGbGFncywgaXNTY3JlZW5Pbik7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8qIFByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IGZvciB0aGUgd2luZG93IG1hbmFnZXIgcG9saWN5IHRvIHByb2Nlc3MgYSBrZXkgYmVmb3JlCiAgICAgICAgICAqIG9yZGluYXJ5IGRpc3BhdGNoLiAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcmNlcHRLZXlCZWZvcmVEaXNwYXRjaGluZyhJbnB1dENoYW5uZWwgZm9jdXMsIGludCBrZXlDb2RlLAotICAgICAgICAgICAgICAgIGludCBtZXRhU3RhdGUsIGJvb2xlYW4gZG93biwgaW50IHJlcGVhdENvdW50LCBpbnQgcG9saWN5RmxhZ3MpIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJjZXB0S2V5QmVmb3JlRGlzcGF0Y2hpbmcoSW5wdXRDaGFubmVsIGZvY3VzLAorICAgICAgICAgICAgICAgIGludCBhY3Rpb24sIGludCBmbGFncywgaW50IGtleUNvZGUsIGludCBtZXRhU3RhdGUsIGludCByZXBlYXRDb3VudCwKKyAgICAgICAgICAgICAgICBpbnQgcG9saWN5RmxhZ3MpIHsKICAgICAgICAgICAgIFdpbmRvd1N0YXRlIHdpbmRvd1N0YXRlID0gZ2V0V2luZG93U3RhdGVGb3JJbnB1dENoYW5uZWwoZm9jdXMpOwotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3kuaW50ZXJjZXB0S2V5VGkod2luZG93U3RhdGUsIGtleUNvZGUsIG1ldGFTdGF0ZSwgZG93biwgcmVwZWF0Q291bnQsCi0gICAgICAgICAgICAgICAgICAgIHBvbGljeUZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5LmludGVyY2VwdEtleUJlZm9yZURpc3BhdGNoaW5nKHdpbmRvd1N0YXRlLCBhY3Rpb24sIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBrZXlDb2RlLCBtZXRhU3RhdGUsIHJlcGVhdENvdW50LCBwb2xpY3lGbGFncyk7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8qIENhbGxlZCB3aGVuIHRoZSBjdXJyZW50IGlucHV0IGZvY3VzIGNoYW5nZXMuCkBAIC01NDkyLDQ1NSArNTMzNSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgd2FrZXVwSWZOZWVkZWQoV2luZG93U3RhdGUgdGFyZ2V0V2luLCBpbnQgZXZlbnRUeXBlKSB7Ci0gICAgICAgIGxvbmcgY3VyVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotCi0gICAgICAgIGlmIChldmVudFR5cGUgPT0gVE9VQ0hfRVZFTlQgfHwgZXZlbnRUeXBlID09IExPTkdfVE9VQ0hfRVZFTlQgfHwgZXZlbnRUeXBlID09IENIRUVLX0VWRU5UKSB7Ci0gICAgICAgICAgICBpZiAobUxhc3RUb3VjaEV2ZW50VHlwZSA9PSBldmVudFR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgKGN1clRpbWUgLSBtTGFzdFVzZXJBY3Rpdml0eUNhbGxUaW1lKSA8IE1JTl9USU1FX0JFVFdFRU5fVVNFUkFDVElWSVRJRVMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTGFzdFVzZXJBY3Rpdml0eUNhbGxUaW1lID0gY3VyVGltZTsKLSAgICAgICAgICAgIG1MYXN0VG91Y2hFdmVudFR5cGUgPSBldmVudFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFyZ2V0V2luID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCB0YXJnZXRXaW4ubUF0dHJzLnR5cGUgIT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9LRVlHVUFSRCkgewotICAgICAgICAgICAgbVBvd2VyTWFuYWdlci51c2VyQWN0aXZpdHkoY3VyVGltZSwgZmFsc2UsIGV2ZW50VHlwZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdGVsbHMgaWYgaXQncyBhIGNoZWVrIGV2ZW50IG9yIG5vdCAtLSB0aGlzIGZ1bmN0aW9uIGlzIHN0YXRlZnVsCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05PTkUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9VTktOT1dOID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ0hFRUsgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JR05PUkVfRFVSQVRJT04gPSAzMDA7IC8vIG1zCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgQ0hFRUtfVEhSRVNIT0xEID0gMC42ZjsKLSAgICBwcml2YXRlIGludCBtRXZlbnRTdGF0ZSA9IEVWRU5UX05PTkU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRXZlbnRTaXplOwotCi0gICAgcHJpdmF0ZSBpbnQgZXZlbnRUeXBlKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIGZsb2F0IHNpemUgPSBldi5nZXRTaXplKCk7Ci0gICAgICAgIHN3aXRjaCAoZXYuZ2V0QWN0aW9uKCkpIHsKLSAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKLSAgICAgICAgICAgIG1FdmVudFNpemUgPSBzaXplOwotICAgICAgICAgICAgcmV0dXJuIChtRXZlbnRTaXplID4gQ0hFRUtfVEhSRVNIT0xEKSA/IENIRUVLX0VWRU5UIDogVE9VQ0hfRVZFTlQ7Ci0gICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgotICAgICAgICAgICAgaWYgKHNpemUgPiBtRXZlbnRTaXplKSBtRXZlbnRTaXplID0gc2l6ZTsKLSAgICAgICAgICAgIHJldHVybiAobUV2ZW50U2l6ZSA+IENIRUVLX1RIUkVTSE9MRCkgPyBDSEVFS19FVkVOVCA6IFRPVUNIX1VQX0VWRU5UOwotICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgotICAgICAgICAgICAgZmluYWwgaW50IE4gPSBldi5nZXRIaXN0b3J5U2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiBtRXZlbnRTaXplKSBtRXZlbnRTaXplID0gc2l6ZTsKLSAgICAgICAgICAgIGlmIChtRXZlbnRTaXplID4gQ0hFRUtfVEhSRVNIT0xEKSByZXR1cm4gQ0hFRUtfRVZFTlQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IGV2LmdldEhpc3RvcmljYWxTaXplKGkpOwotICAgICAgICAgICAgICAgIGlmIChzaXplID4gbUV2ZW50U2l6ZSkgbUV2ZW50U2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgaWYgKG1FdmVudFNpemUgPiBDSEVFS19USFJFU0hPTEQpIHJldHVybiBDSEVFS19FVkVOVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChldi5nZXRFdmVudFRpbWUoKSA8IGV2LmdldERvd25UaW1lKCkgKyBFVkVOVF9JR05PUkVfRFVSQVRJT04pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVE9VQ0hfRVZFTlQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBMT05HX1RPVUNIX0VWRU5UOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gbm90IGdvb2QKLSAgICAgICAgICAgIHJldHVybiBPVEhFUl9FVkVOVDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZhdFRvdWNoOyAvLyByZW1vdmUgbWUgdG9nZXRoZXIgd2l0aCBkaXNwYXRjaFBvaW50ZXIKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGV2ZW50IHdhcyBkaXNwYXRjaGVkLCBmYWxzZSBpZiBpdCB3YXMgZHJvcHBlZCBmb3IgYW55IHJlYXNvbgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGRpc3BhdGNoUG9pbnRlcihRdWV1ZWRFdmVudCBxZXYsIE1vdGlvbkV2ZW50IGV2LCBpbnQgcGlkLCBpbnQgdWlkKSB7Ci0gICAgICAgIGlmIChERUJVR19JTlBVVCB8fCBXaW5kb3dNYW5hZ2VyUG9saWN5LldBVENIX1BPSU5URVIpIFNsb2cudihUQUcsCi0gICAgICAgICAgICAgICAgImRpc3BhdGNoUG9pbnRlciAiICsgZXYpOwotCi0gICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kpIHsKLSAgICAgICAgICAgIGx0LnNhbXBsZSgiMyBXYWl0IGZvciBsYXN0IGRpc3BhdGNoICIsIFN5c3RlbS5uYW5vVGltZSgpIC0gcWV2LndoZW5OYW5vKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB0YXJnZXRPYmogPSBtS2V5V2FpdGVyLndhaXRGb3JOZXh0RXZlbnRUYXJnZXQobnVsbCwgcWV2LAotICAgICAgICAgICAgICAgIGV2LCB0cnVlLCBmYWxzZSwgcGlkLCB1aWQpOwotCi0gICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kpIHsKLSAgICAgICAgICAgIGx0LnNhbXBsZSgiMyBMYXN0IGRpc3BhdGNoIGZpbmlzaGVkICIsIFN5c3RlbS5uYW5vVGltZSgpIC0gcWV2LndoZW5OYW5vKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKLQotICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgLy8gbGV0IGdvIG9mIG91ciB0YXJnZXQKLSAgICAgICAgICAgIG1LZXlXYWl0ZXIubU1vdGlvblRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLmxvZ1BvaW50ZXJVcEV2ZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7Ci0gICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLmxvZ1BvaW50ZXJEb3duRXZlbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0YXJnZXRPYmogPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIGFyZSBlaXRoZXIgZHJvcHBpbmcgdGhlIGV2ZW50LCBvciBoYXZlIHJlY2VpdmVkCi0gICAgICAgICAgICAvLyBhIG1vdmUgb3IgdXAgd2l0aG91dCBhIGRvd24uICBJdCBpcyBjb21tb24gdG8gcmVjZWl2ZSBtb3ZlCi0gICAgICAgICAgICAvLyBldmVudHMgaW4gc3VjaCBhIHdheSwgc2luY2UgdGhpcyBtZWFucyB0aGUgdXNlciBpcyBtb3ZpbmcgdGhlCi0gICAgICAgICAgICAvLyBwb2ludGVyIHdpdGhvdXQgYWN0dWFsbHkgcHJlc3NpbmcgZG93bi4gIEFsbCBvdGhlciBjYXNlcyBzaG91bGQKLSAgICAgICAgICAgIC8vIGJlIGF0eXBpY2FsLCBzbyBsZXQncyBsb2cgdGhlbS4KLSAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiTm8gd2luZG93IHRvIGRpc3BhdGNoIHBvaW50ZXIgYWN0aW9uICIgKyBldi5nZXRBY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaFBvaW50ZXJFbHNld2hlcmVMb2NrZWQobnVsbCwgbnVsbCwgZXYsIGV2LmdldEV2ZW50VGltZSgpLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChxZXYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1RdWV1ZS5yZWN5Y2xlRXZlbnQocWV2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV2LnJlY3ljbGUoKTsKLSAgICAgICAgICAgIHJldHVybiBJTkpFQ1RfRkFJTEVEOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0YXJnZXRPYmogPT0gbUtleVdhaXRlci5DT05TVU1FRF9FVkVOVF9UT0tFTikgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2hQb2ludGVyRWxzZXdoZXJlTG9ja2VkKG51bGwsIG51bGwsIGV2LCBldi5nZXRFdmVudFRpbWUoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocWV2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUXVldWUucmVjeWNsZUV2ZW50KHFldik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBldi5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICByZXR1cm4gSU5KRUNUX1NVQ0NFRURFRDsKLSAgICAgICAgfQotCi0gICAgICAgIFdpbmRvd1N0YXRlIHRhcmdldCA9IChXaW5kb3dTdGF0ZSl0YXJnZXRPYmo7Ci0KLSAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWUgPSBldi5nZXRFdmVudFRpbWUoKTsKLSAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWVOYW5vID0gZXYuZ2V0RXZlbnRUaW1lTmFubygpOwotCi0gICAgICAgIC8vU2xvZy5pKFRBRywgIlNlbmRpbmcgIiArIGV2ICsgIiB0byAiICsgdGFyZ2V0KTsKLQotICAgICAgICBpZiAodWlkICE9IDAgJiYgdWlkICE9IHRhcmdldC5tU2Vzc2lvbi5tVWlkKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tQZXJtaXNzaW9uKAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5KRUNUX0VWRU5UUywgcGlkLCB1aWQpCi0gICAgICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewotICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJQZXJtaXNzaW9uIGRlbmllZDogaW5qZWN0aW5nIHBvaW50ZXIgZXZlbnQgZnJvbSBwaWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwaWQgKyAiIHVpZCAiICsgdWlkICsgIiB0byB3aW5kb3cgIiArIHRhcmdldAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG93bmVkIGJ5IHVpZCAiICsgdGFyZ2V0Lm1TZXNzaW9uLm1VaWQpOwotICAgICAgICAgICAgICAgIGlmIChxZXYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUXVldWUucmVjeWNsZUV2ZW50KHFldik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV2LnJlY3ljbGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5KRUNUX05PX1BFUk1JU1NJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7Ci0gICAgICAgICAgICBsdC5zYW1wbGUoIjQgaW4gZGlzcGF0Y2hQb2ludGVyICAgICAiLCBTeXN0ZW0ubmFub1RpbWUoKSAtIGV2ZW50VGltZU5hbm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCh0YXJnZXQubUF0dHJzLmZsYWdzICYKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMpICE9IDApIHsKLSAgICAgICAgICAgIC8vdGFyZ2V0IHdhbnRzIHRvIGlnbm9yZSBmYXQgdG91Y2ggZXZlbnRzCi0gICAgICAgICAgICBib29sZWFuIGNoZWVrUHJlc3MgPSBtUG9saWN5LmlzQ2hlZWtQcmVzc2VkQWdhaW5zdFNjcmVlbihldik7Ci0gICAgICAgICAgICAvL2V4cGxpY2l0IGZsYWcgdG8gcmV0dXJuIHdpdGhvdXQgcHJvY2Vzc2luZyBldmVudCBmdXJ0aGVyCi0gICAgICAgICAgICBib29sZWFuIHJldHVybkZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmKChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pKSB7Ci0gICAgICAgICAgICAgICAgbUZhdFRvdWNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYoY2hlZWtQcmVzcykgewotICAgICAgICAgICAgICAgICAgICBtRmF0VG91Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm5GbGFnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobUZhdFRvdWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2VhcmxpZXIgZXZlbiB3YXMgaW52YWxpZCBkb2VzbnQgbWF0dGVyIGlmIGN1cnJlbnQgdXAgaXMgY2hlZWtwcmVzcyBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GYXRUb3VjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmxhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihjaGVla1ByZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2NhbmNlbCB0aGUgZWFybGllciBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobUZhdFRvdWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3R3byBjYXNlcyBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2FuIGludmFsaWQgZG93biBmb2xsb3dlZCBieSAwIG9yIG1vdmVzKHZhbGlkIG9yIGludmFsaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2EgdmFsaWQgZG93biwgIGludmFsaWQgbW92ZSwgbW9yZSBtb3Zlcy4gd2FudCB0byBpZ25vcmUgdGlsbCB1cAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmxhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihjaGVla1ByZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3ZhbGlkIGRvd24gZm9sbG93ZWQgYnkgaW52YWxpZCBtb3ZlcwotICAgICAgICAgICAgICAgICAgICAgICAgLy9hbiBpbnZhbGlkIG1vdmUgaGF2ZSB0byBjYW5jZWwgZWFybGllciBhY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfSU5QVVQpIFNsb2cudihUQUcsICJTZW5kaW5nIGNhbmNlbCBmb3IgaW52YWxpZCBBQ1RJT05fTU9WRSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9ub3RlIHRoYXQgdGhlIHN1YnNlcXVlbnQgaW52YWxpZCBtb3ZlcyB3aWxsIG5vdCBnZXQgaGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgbUZhdFRvdWNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLy9lbHNlIGlmIGFjdGlvbgotICAgICAgICAgICAgaWYocmV0dXJuRmxhZykgewotICAgICAgICAgICAgICAgIC8vcmVjeWNsZSBxdWUsIGV2Ci0gICAgICAgICAgICAgICAgaWYgKHFldiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1RdWV1ZS5yZWN5Y2xlRXZlbnQocWV2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXYucmVjeWNsZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTkpFQ1RfRkFJTEVEOwotICAgICAgICAgICAgfQotICAgICAgICB9IC8vZW5kIGlmIHRhcmdldAotCi0gICAgICAgIC8vIEVuYWJsZSB0aGlzIGZvciB0ZXN0aW5nIHRoZSAicmlnaHQiIHZhbHVlCi0gICAgICAgIGlmIChmYWxzZSAmJiBhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKLSAgICAgICAgICAgIGludCBtYXhfZXZlbnRzX3Blcl9zZWMgPSAzNTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWF4X2V2ZW50c19wZXJfc2VjID0gSW50ZWdlci5wYXJzZUludChTeXN0ZW1Qcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCJ3aW5kb3dzbWdyLm1heF9ldmVudHNfcGVyX3NlYyIpKTsKLSAgICAgICAgICAgICAgICBpZiAobWF4X2V2ZW50c19wZXJfc2VjIDwgMSkgewotICAgICAgICAgICAgICAgICAgICBtYXhfZXZlbnRzX3Blcl9zZWMgPSAzNTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1pbldhaXRUaW1lQmV0d2VlblRvdWNoRXZlbnRzID0gMTAwMCAvIG1heF9ldmVudHNfcGVyX3NlYzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRocm90dGxlIGV2ZW50cyB0byBtaW5pbWl6ZSBDUFUgdXNhZ2Ugd2hlbiB0aGVyZSdzIGEgZmxvb2Qgb2YgZXZlbnRzCi0gICAgICAgICAqIGUuZy4gY29uc3RhbnQgY29udGFjdCB3aXRoIHRoZSBzY3JlZW4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKLSAgICAgICAgICAgIGxvbmcgbmV4dEV2ZW50VGltZSA9IG1MYXN0VG91Y2hFdmVudFRpbWUgKyBtTWluV2FpdFRpbWVCZXR3ZWVuVG91Y2hFdmVudHM7Ci0gICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgaWYgKG5vdyA8IG5leHRFdmVudFRpbWUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAobmV4dEV2ZW50VGltZSAtIG5vdyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGFzdFRvdWNoRXZlbnRUaW1lID0gbmV4dEV2ZW50VGltZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUb3VjaEV2ZW50VGltZSA9IG5vdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kpIHsKLSAgICAgICAgICAgIGx0LnNhbXBsZSgiNSBpbiBkaXNwYXRjaFBvaW50ZXIgICAgICIsIFN5c3RlbS5uYW5vVGltZSgpIC0gZXZlbnRUaW1lTmFubyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQobVdpbmRvd01hcCkgewotICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNWaXNpYmxlTHcoKSkgewotICAgICAgICAgICAgICAgIC8vIER1cmluZyB0aGlzIG1vdGlvbiBkaXNwYXRjaCwgdGhlIHRhcmdldCB3aW5kb3cgaGFzIGJlY29tZQotICAgICAgICAgICAgICAgIC8vIGludmlzaWJsZS4KLSAgICAgICAgICAgICAgICBkaXNwYXRjaFBvaW50ZXJFbHNld2hlcmVMb2NrZWQobnVsbCwgbnVsbCwgZXYsIGV2LmdldEV2ZW50VGltZSgpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHFldiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1RdWV1ZS5yZWN5Y2xlRXZlbnQocWV2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXYucmVjeWNsZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTkpFQ1RfU1VDQ0VFREVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocWV2ICE9IG51bGwgJiYgYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7Ci0gICAgICAgICAgICAgICAgbUtleVdhaXRlci5iaW5kVGFyZ2V0V2luZG93TG9ja2VkKHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleVdhaXRlci5SRVRVUk5fUEVORElOR19QT0lOVEVSLCBxZXYpOwotICAgICAgICAgICAgICAgIGV2ID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewotICAgICAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSBvdXQgPSBtS2V5V2FpdGVyLm1PdXRzaWRlVG91Y2hUYXJnZXRzOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50IG9ldiA9IE1vdGlvbkV2ZW50Lm9idGFpbihldik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX09VVFNJREUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCBmcmFtZSA9IG91dC5tRnJhbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ldi5vZmZzZXRMb2NhdGlvbigtKGZsb2F0KWZyYW1lLmxlZnQsIC0oZmxvYXQpZnJhbWUudG9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5tQ2xpZW50LmRpc3BhdGNoUG9pbnRlcihvZXYsIGV2ZW50VGltZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0lORE9XIERJRUQgZHVyaW5nIG91dHNpZGUgbW90aW9uIGRpc3BhdGNoOiAiICsgb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZXYub2Zmc2V0TG9jYXRpb24oKGZsb2F0KWZyYW1lLmxlZnQsIChmbG9hdClmcmFtZS50b3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSBvdXQubU5leHRPdXRzaWRlVG91Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob3V0ICE9IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlXYWl0ZXIubU91dHNpZGVUb3VjaFRhcmdldHMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZXYucmVjeWNsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGlzcGF0Y2hQb2ludGVyRWxzZXdoZXJlTG9ja2VkKHRhcmdldCwgbnVsbCwgZXYsIGV2LmdldEV2ZW50VGltZSgpLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IGZyYW1lID0gdGFyZ2V0Lm1GcmFtZTsKLSAgICAgICAgICAgICAgICBldi5vZmZzZXRMb2NhdGlvbigtKGZsb2F0KWZyYW1lLmxlZnQsIC0oZmxvYXQpZnJhbWUudG9wKTsKLSAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLmJpbmRUYXJnZXRXaW5kb3dMb2NrZWQodGFyZ2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmFsbHkgb2Zmc2V0IHRoZSBldmVudCB0byB0aGUgdGFyZ2V0J3MgY29vcmRpbmF0ZSBzeXN0ZW0gYW5kCi0gICAgICAgIC8vIGRpc3BhdGNoIHRoZSBldmVudC4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChERUJVR19JTlBVVCB8fCBERUJVR19GT0NVUyB8fCBXaW5kb3dNYW5hZ2VyUG9saWN5LldBVENIX1BPSU5URVIpIHsKLSAgICAgICAgICAgICAgICBTbG9nLnYoVEFHLCAiRGVsaXZlcmluZyBwb2ludGVyICIgKyBxZXYgKyAiIHRvICIgKyB0YXJnZXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7Ci0gICAgICAgICAgICAgICAgbHQuc2FtcGxlKCI2IGJlZm9yZSBzdnItPmNsaWVudCBpcGMgIiwgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudFRpbWVOYW5vKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGFyZ2V0Lm1DbGllbnQuZGlzcGF0Y2hQb2ludGVyKGV2LCBldmVudFRpbWUsIHRydWUpOwotCi0gICAgICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7Ci0gICAgICAgICAgICAgICAgbHQuc2FtcGxlKCI3IGFmdGVyICBzdnItPmNsaWVudCBpcGMgIiwgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudFRpbWVOYW5vKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBJTkpFQ1RfU1VDQ0VFREVEOwotICAgICAgICB9IGNhdGNoIChhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTbG9nLmkoVEFHLCAiV0lORE9XIERJRUQgZHVyaW5nIG1vdGlvbiBkaXNwYXRjaDogIiArIHRhcmdldCk7Ci0gICAgICAgICAgICBtS2V5V2FpdGVyLm1Nb3Rpb25UYXJnZXQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZW1vdmVXaW5kb3codGFyZ2V0Lm1TZXNzaW9uLCB0YXJnZXQubUNsaWVudCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBoYXBwZW4gaWYgdGhlIHdpbmRvdyBoYXMgYWxyZWFkeSBiZWVuCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlZC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSU5KRUNUX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBldmVudCB3YXMgZGlzcGF0Y2hlZCwgZmFsc2UgaWYgaXQgd2FzIGRyb3BwZWQgZm9yIGFueSByZWFzb24KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBkaXNwYXRjaFRyYWNrYmFsbChRdWV1ZWRFdmVudCBxZXYsIE1vdGlvbkV2ZW50IGV2LCBpbnQgcGlkLCBpbnQgdWlkKSB7Ci0gICAgICAgIGlmIChERUJVR19JTlBVVCkgU2xvZy52KAotICAgICAgICAgICAgICAgIFRBRywgImRpc3BhdGNoVHJhY2tiYWxsIFsiICsgZXYuZ2V0QWN0aW9uKCkgKyJdIDwiICsgZXYuZ2V0WCgpICsgIiwgIiArIGV2LmdldFkoKSArICI+Iik7Ci0KLSAgICAgICAgT2JqZWN0IGZvY3VzT2JqID0gbUtleVdhaXRlci53YWl0Rm9yTmV4dEV2ZW50VGFyZ2V0KG51bGwsIHFldiwKLSAgICAgICAgICAgICAgICBldiwgZmFsc2UsIGZhbHNlLCBwaWQsIHVpZCk7Ci0gICAgICAgIGlmIChmb2N1c09iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTbG9nLncoVEFHLCAiTm8gZm9jdXMgd2luZG93LCBkcm9wcGluZyB0cmFja2JhbGw6ICIgKyBldik7Ci0gICAgICAgICAgICBpZiAocWV2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUXVldWUucmVjeWNsZUV2ZW50KHFldik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBldi5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICByZXR1cm4gSU5KRUNUX0ZBSUxFRDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZm9jdXNPYmogPT0gbUtleVdhaXRlci5DT05TVU1FRF9FVkVOVF9UT0tFTikgewotICAgICAgICAgICAgaWYgKHFldiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVF1ZXVlLnJlY3ljbGVFdmVudChxZXYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXYucmVjeWNsZSgpOwotICAgICAgICAgICAgcmV0dXJuIElOSkVDVF9TVUNDRUVERUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBXaW5kb3dTdGF0ZSBmb2N1cyA9IChXaW5kb3dTdGF0ZSlmb2N1c09iajsKLQotICAgICAgICBpZiAodWlkICE9IDAgJiYgdWlkICE9IGZvY3VzLm1TZXNzaW9uLm1VaWQpIHsKLSAgICAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja1Blcm1pc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTkpFQ1RfRVZFTlRTLCBwaWQsIHVpZCkKLSAgICAgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlBlcm1pc3Npb24gZGVuaWVkOiBpbmplY3Rpbmcga2V5IGV2ZW50IGZyb20gcGlkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGlkICsgIiB1aWQgIiArIHVpZCArICIgdG8gd2luZG93ICIgKyBmb2N1cwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG93bmVkIGJ5IHVpZCAiICsgZm9jdXMubVNlc3Npb24ubVVpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHFldiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1RdWV1ZS5yZWN5Y2xlRXZlbnQocWV2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXYucmVjeWNsZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTkpFQ1RfTk9fUEVSTUlTU0lPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGxvbmcgZXZlbnRUaW1lID0gZXYuZ2V0RXZlbnRUaW1lKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgIGlmIChxZXYgIT0gbnVsbCAmJiBldi5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgewotICAgICAgICAgICAgICAgIG1LZXlXYWl0ZXIuYmluZFRhcmdldFdpbmRvd0xvY2tlZChmb2N1cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleVdhaXRlci5SRVRVUk5fUEVORElOR19UUkFDS0JBTEwsIHFldik7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgZGVsaXZlciBtb3ZlbWVudCBldmVudHMgdG8gdGhlIGNsaWVudCwgd2UgaG9sZAotICAgICAgICAgICAgICAgIC8vIHRoZW0gYW5kIHdhaXQgZm9yIHRoZW0gdG8gY2FsbCBiYWNrLgotICAgICAgICAgICAgICAgIGV2ID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUtleVdhaXRlci5iaW5kVGFyZ2V0V2luZG93TG9ja2VkKGZvY3VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb2N1cy5tQ2xpZW50LmRpc3BhdGNoVHJhY2tiYWxsKGV2LCBldmVudFRpbWUsIHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIElOSkVDVF9TVUNDRUVERUQ7Ci0gICAgICAgIH0gY2F0Y2ggKGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cuaShUQUcsICJXSU5ET1cgRElFRCBkdXJpbmcga2V5IGRpc3BhdGNoOiAiICsgZm9jdXMpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZW1vdmVXaW5kb3coZm9jdXMubVNlc3Npb24sIGZvY3VzLm1DbGllbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIGlmIHRoZSB3aW5kb3cgaGFzIGFscmVhZHkgYmVlbgotICAgICAgICAgICAgICAgIC8vIHJlbW92ZWQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSU5KRUNUX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBldmVudCB3YXMgZGlzcGF0Y2hlZCwgZmFsc2UgaWYgaXQgd2FzIGRyb3BwZWQgZm9yIGFueSByZWFzb24KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBkaXNwYXRjaEtleShLZXlFdmVudCBldmVudCwgaW50IHBpZCwgaW50IHVpZCkgewotICAgICAgICBpZiAoREVCVUdfSU5QVVQpIFNsb2cudihUQUcsICJEaXNwYXRjaCBrZXk6ICIgKyBldmVudCk7Ci0KLSAgICAgICAgT2JqZWN0IGZvY3VzT2JqID0gbUtleVdhaXRlci53YWl0Rm9yTmV4dEV2ZW50VGFyZ2V0KGV2ZW50LCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIGZhbHNlLCBmYWxzZSwgcGlkLCB1aWQpOwotICAgICAgICBpZiAoZm9jdXNPYmogPT0gbnVsbCkgewotICAgICAgICAgICAgU2xvZy53KFRBRywgIk5vIGZvY3VzIHdpbmRvdywgZHJvcHBpbmc6ICIgKyBldmVudCk7Ci0gICAgICAgICAgICByZXR1cm4gSU5KRUNUX0ZBSUxFRDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZm9jdXNPYmogPT0gbUtleVdhaXRlci5DT05TVU1FRF9FVkVOVF9UT0tFTikgewotICAgICAgICAgICAgcmV0dXJuIElOSkVDVF9TVUNDRUVERUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPa2F5IHdlIGhhdmUgZmluaXNoZWQgd2FpdGluZyBmb3IgdGhlIGxhc3QgZXZlbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgICAgICAvLyBGaXJzdCBvZmYsIGlmIHRoaXMgaXMgYSByZXBlYXQgZXZlbnQsIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcwotICAgICAgICAvLyBhIGNvcnJlc3BvbmRpbmcgdXAgZXZlbnQgaW4gdGhlIHF1ZXVlLiAgSWYgdGhlcmUgaXMsIHdlIHdpbGwKLSAgICAgICAgLy8ganVzdCBkcm9wIHRoZSByZXBlYXQsIGJlY2F1c2UgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmVwZWF0IGFmdGVyCi0gICAgICAgIC8vIHRoZSB1c2VyIGhhcyByZWxlYXNlZCBhIGtleS4gIChUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvcgotICAgICAgICAvLyBsb25nIHByZXNzZXMuKQotICAgICAgICBpZiAoZXZlbnQuZ2V0UmVwZWF0Q291bnQoKSA+IDAgJiYgbVF1ZXVlLmhhc0tleVVwRXZlbnQoZXZlbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5KRUNUX1NVQ0NFRURFRDsKLSAgICAgICAgfQotCi0gICAgICAgIFdpbmRvd1N0YXRlIGZvY3VzID0gKFdpbmRvd1N0YXRlKWZvY3VzT2JqOwotCi0gICAgICAgIGlmIChERUJVR19JTlBVVCkgU2xvZy52KAotICAgICAgICAgICAgVEFHLCAiRGlzcGF0Y2hpbmcgdG8gIiArIGZvY3VzICsgIjogIiArIGV2ZW50KTsKLQotICAgICAgICBpZiAodWlkICE9IDAgJiYgdWlkICE9IGZvY3VzLm1TZXNzaW9uLm1VaWQpIHsKLSAgICAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja1Blcm1pc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTkpFQ1RfRVZFTlRTLCBwaWQsIHVpZCkKLSAgICAgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlBlcm1pc3Npb24gZGVuaWVkOiBpbmplY3Rpbmcga2V5IGV2ZW50IGZyb20gcGlkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGlkICsgIiB1aWQgIiArIHVpZCArICIgdG8gd2luZG93ICIgKyBmb2N1cwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG93bmVkIGJ5IHVpZCAiICsgZm9jdXMubVNlc3Npb24ubVVpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOSkVDVF9OT19QRVJNSVNTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgIG1LZXlXYWl0ZXIuYmluZFRhcmdldFdpbmRvd0xvY2tlZChmb2N1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOT1NISVAgZXh0cmEgc3RhdGUgbG9nZ2luZwotICAgICAgICBtS2V5V2FpdGVyLnJlY29yZERpc3BhdGNoU3RhdGUoZXZlbnQsIGZvY3VzKTsKLSAgICAgICAgLy8gRU5EIE5PU0hJUAotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoREVCVUdfSU5QVVQgfHwgREVCVUdfRk9DVVMpIHsKLSAgICAgICAgICAgICAgICBTbG9nLnYoVEFHLCAiRGVsaXZlcmluZyBrZXkgIiArIGV2ZW50LmdldEtleUNvZGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRvICIgKyBmb2N1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb2N1cy5tQ2xpZW50LmRpc3BhdGNoS2V5KGV2ZW50KTsKLSAgICAgICAgICAgIHJldHVybiBJTkpFQ1RfU1VDQ0VFREVEOwotICAgICAgICB9IGNhdGNoIChhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTbG9nLmkoVEFHLCAiV0lORE9XIERJRUQgZHVyaW5nIGtleSBkaXNwYXRjaDogIiArIGZvY3VzKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlV2luZG93KGZvY3VzLm1TZXNzaW9uLCBmb2N1cy5tQ2xpZW50KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGhhcHBlbiBpZiB0aGUgd2luZG93IGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAgICAgICAvLyByZW1vdmVkLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElOSkVDVF9GQUlMRUQ7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgcGF1c2VLZXlEaXNwYXRjaGluZyhJQmluZGVyIF90b2tlbikgewogICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1BTkFHRV9BUFBfVE9LRU5TLAogICAgICAgICAgICAgICAgICJwYXVzZUtleURpc3BhdGNoaW5nKCkiKSkgewpAQCAtNTk1MCwxMSArNTM0NCw3IEBACiAgICAgICAgIHN5bmNocm9uaXplZCAobVdpbmRvd01hcCkgewogICAgICAgICAgICAgV2luZG93VG9rZW4gdG9rZW4gPSBtVG9rZW5NYXAuZ2V0KF90b2tlbik7CiAgICAgICAgICAgICBpZiAodG9rZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3IucGF1c2VEaXNwYXRjaGluZ0x3KHRva2VuKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLnBhdXNlRGlzcGF0Y2hpbmdMb2NrZWQodG9rZW4pOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtSW5wdXRNb25pdG9yLnBhdXNlRGlzcGF0Y2hpbmdMdyh0b2tlbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01OTY4LDExICs1MzU4LDcgQEAKICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7CiAgICAgICAgICAgICBXaW5kb3dUb2tlbiB0b2tlbiA9IG1Ub2tlbk1hcC5nZXQoX3Rva2VuKTsKICAgICAgICAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0TW9uaXRvci5yZXN1bWVEaXNwYXRjaGluZ0x3KHRva2VuKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLnJlc3VtZURpc3BhdGNoaW5nTG9ja2VkKHRva2VuKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUlucHV0TW9uaXRvci5yZXN1bWVEaXNwYXRjaGluZ0x3KHRva2VuKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTU5ODQsMTEgKzUzNzAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7Ci0gICAgICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3Iuc2V0RXZlbnREaXNwYXRjaGluZ0x3KGVuYWJsZWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLnNldEV2ZW50RGlzcGF0Y2hpbmdMb2NrZWQoZW5hYmxlZCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5wdXRNb25pdG9yLnNldEV2ZW50RGlzcGF0Y2hpbmdMdyhlbmFibGVkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjAyMSwxNiArNTQwMyw4IEBACiAgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICBmaW5hbCBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIAotICAgICAgICBmaW5hbCBpbnQgcmVzdWx0OwotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbUlucHV0TWFuYWdlci5pbmplY3RLZXlFdmVudChuZXdFdmVudCwgSW5wdXRRdWV1ZS5JTlBVVF9FVkVOVF9OQVRVUkVfS0VZLAotICAgICAgICAgICAgICAgICAgICBwaWQsIHVpZCwgc3luYywgSU5KRUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGRpc3BhdGNoS2V5KG5ld0V2ZW50LCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICBpZiAoc3luYykgewotICAgICAgICAgICAgICAgIG1LZXlXYWl0ZXIud2FpdEZvck5leHRFdmVudFRhcmdldChudWxsLCBudWxsLCBudWxsLCBmYWxzZSwgdHJ1ZSwgcGlkLCB1aWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSBtSW5wdXRNYW5hZ2VyLmluamVjdEtleUV2ZW50KG5ld0V2ZW50LAorICAgICAgICAgICAgICAgIElucHV0UXVldWUuSU5QVVRfRVZFTlRfTkFUVVJFX0tFWSwgcGlkLCB1aWQsIHN5bmMsIElOSkVDVElPTl9USU1FT1VUX01JTExJUyk7CiAgICAgICAgIAogICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CiAgICAgICAgIHJldHVybiByZXBvcnRJbmplY3Rpb25SZXN1bHQocmVzdWx0KTsKQEAgLTYwNTAsMTYgKzU0MjQsOCBAQAogICAgICAgICBmaW5hbCBpbnQgdWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgZmluYWwgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAKLSAgICAgICAgZmluYWwgaW50IHJlc3VsdDsKLSAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG1JbnB1dE1hbmFnZXIuaW5qZWN0TW90aW9uRXZlbnQoZXYsIElucHV0UXVldWUuSU5QVVRfRVZFTlRfTkFUVVJFX1RPVUNILAotICAgICAgICAgICAgICAgICAgICBwaWQsIHVpZCwgc3luYywgSU5KRUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGRpc3BhdGNoUG9pbnRlcihudWxsLCBldiwgcGlkLCB1aWQpOwotICAgICAgICAgICAgaWYgKHN5bmMpIHsKLSAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLndhaXRGb3JOZXh0RXZlbnRUYXJnZXQobnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UsIHRydWUsIHBpZCwgdWlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gbUlucHV0TWFuYWdlci5pbmplY3RNb3Rpb25FdmVudChldiwKKyAgICAgICAgICAgICAgICBJbnB1dFF1ZXVlLklOUFVUX0VWRU5UX05BVFVSRV9UT1VDSCwgcGlkLCB1aWQsIHN5bmMsIElOSkVDVElPTl9USU1FT1VUX01JTExJUyk7CiAgICAgICAgIAogICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CiAgICAgICAgIHJldHVybiByZXBvcnRJbmplY3Rpb25SZXN1bHQocmVzdWx0KTsKQEAgLTYwNzksNDggKzU0NDUsMjkgQEAKICAgICAgICAgZmluYWwgaW50IHVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgIGZpbmFsIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgCi0gICAgICAgIGZpbmFsIGludCByZXN1bHQ7Ci0gICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBtSW5wdXRNYW5hZ2VyLmluamVjdE1vdGlvbkV2ZW50KGV2LCBJbnB1dFF1ZXVlLklOUFVUX0VWRU5UX05BVFVSRV9UUkFDS0JBTEwsCi0gICAgICAgICAgICAgICAgICAgIHBpZCwgdWlkLCBzeW5jLCBJTkpFQ1RJT05fVElNRU9VVF9NSUxMSVMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gZGlzcGF0Y2hUcmFja2JhbGwobnVsbCwgZXYsIHBpZCwgdWlkKTsKLSAgICAgICAgICAgIGlmIChzeW5jKSB7Ci0gICAgICAgICAgICAgICAgbUtleVdhaXRlci53YWl0Rm9yTmV4dEV2ZW50VGFyZ2V0KG51bGwsIG51bGwsIG51bGwsIGZhbHNlLCB0cnVlLCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IG1JbnB1dE1hbmFnZXIuaW5qZWN0TW90aW9uRXZlbnQoZXYsCisgICAgICAgICAgICAgICAgSW5wdXRRdWV1ZS5JTlBVVF9FVkVOVF9OQVRVUkVfVFJBQ0tCQUxMLCBwaWQsIHVpZCwgc3luYywgSU5KRUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKICAgICAgICAgCiAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKICAgICAgICAgcmV0dXJuIHJlcG9ydEluamVjdGlvblJlc3VsdChyZXN1bHQpOwogICAgIH0KICAgICAKICAgICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0SW5qZWN0aW9uUmVzdWx0KGludCByZXN1bHQpIHsKLSAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBJbnB1dE1hbmFnZXIuSU5QVVRfRVZFTlRfSU5KRUNUSU9OX1BFUk1JU1NJT05fREVOSUVEOgotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiSW5wdXQgZXZlbnQgaW5qZWN0aW9uIHBlcm1pc3Npb24gZGVuaWVkLiIpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluamVjdGluZyB0byBhbm90aGVyIGFwcGxpY2F0aW9uIHJlcXVpcmVzIElOSkVDVF9FVkVOVFMgcGVybWlzc2lvbiIpOwotICAgICAgICAgICAgICAgIGNhc2UgSW5wdXRNYW5hZ2VyLklOUFVUX0VWRU5UX0lOSkVDVElPTl9TVUNDRUVERUQ6Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cudihUQUcsICJJbnB1dCBldmVudCBpbmplY3Rpb24gc3VjY2VlZGVkLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjYXNlIElucHV0TWFuYWdlci5JTlBVVF9FVkVOVF9JTkpFQ1RJT05fVElNRURfT1VUOgotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiSW5wdXQgZXZlbnQgaW5qZWN0aW9uIHRpbWVkIG91dC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGNhc2UgSW5wdXRNYW5hZ2VyLklOUFVUX0VWRU5UX0lOSkVDVElPTl9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklucHV0IGV2ZW50IGluamVjdGlvbiBmYWlsZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBJTkpFQ1RfTk9fUEVSTUlTU0lPTjoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmplY3RpbmcgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiByZXF1aXJlcyBJTkpFQ1RfRVZFTlRTIHBlcm1pc3Npb24iKTsKLSAgICAgICAgICAgICAgICBjYXNlIElOSkVDVF9TVUNDRUVERUQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICAgICAgY2FzZSBJbnB1dE1hbmFnZXIuSU5QVVRfRVZFTlRfSU5KRUNUSU9OX1BFUk1JU1NJT05fREVOSUVEOgorICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJJbnB1dCBldmVudCBpbmplY3Rpb24gcGVybWlzc2lvbiBkZW5pZWQuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkluamVjdGluZyB0byBhbm90aGVyIGFwcGxpY2F0aW9uIHJlcXVpcmVzIElOSkVDVF9FVkVOVFMgcGVybWlzc2lvbiIpOworICAgICAgICAgICAgY2FzZSBJbnB1dE1hbmFnZXIuSU5QVVRfRVZFTlRfSU5KRUNUSU9OX1NVQ0NFRURFRDoKKyAgICAgICAgICAgICAgICBTbG9nLnYoVEFHLCAiSW5wdXQgZXZlbnQgaW5qZWN0aW9uIHN1Y2NlZWRlZC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgSW5wdXRNYW5hZ2VyLklOUFVUX0VWRU5UX0lOSkVDVElPTl9USU1FRF9PVVQ6CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklucHV0IGV2ZW50IGluamVjdGlvbiB0aW1lZCBvdXQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY2FzZSBJbnB1dE1hbmFnZXIuSU5QVVRfRVZFTlRfSU5KRUNUSU9OX0ZBSUxFRDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklucHV0IGV2ZW50IGluamVjdGlvbiBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCkBAIC02MTM0LDg2NyArNTQ4MSw2IEBACiAgICAgICAgIHJldHVybiBtQ3VycmVudEZvY3VzOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIHN0YXRlIGZvciBkaXNwYXRjaGluZyBrZXkgZXZlbnRzLiAgVGhpcyBzdGF0ZQotICAgICAqIGlzIHByb3RlY3RlZCBieSB0aGUgS2V5V2FpdGVyIGluc3RhbmNlLCBOT1QgYnkgdGhlIHdpbmRvdyBsb2NrLiAgWW91Ci0gICAgICogY2FuIGJlIGhvbGRpbmcgdGhlIG1haW4gd2luZG93IGxvY2sgd2hpbGUgYWNxdWlyZSB0aGUgS2V5V2FpdGVyIGxvY2ssCi0gICAgICogYnV0IG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KLSAgICAgKi8KLSAgICBmaW5hbCBjbGFzcyBLZXlXYWl0ZXIgewotICAgICAgICAvLyBOT1NISVAgZGVidWdnaW5nCi0gICAgICAgIHB1YmxpYyBjbGFzcyBEaXNwYXRjaFN0YXRlIHsKLSAgICAgICAgICAgIHByaXZhdGUgS2V5RXZlbnQgZXZlbnQ7Ci0gICAgICAgICAgICBwcml2YXRlIFdpbmRvd1N0YXRlIGZvY3VzOwotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHRpbWU7Ci0gICAgICAgICAgICBwcml2YXRlIFdpbmRvd1N0YXRlIGxhc3RXaW47Ci0gICAgICAgICAgICBwcml2YXRlIElCaW5kZXIgbGFzdEJpbmRlcjsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBmaW5pc2hlZDsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBnb3RGaXJzdFdpbmRvdzsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBldmVudERpc3BhdGNoaW5nOwotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHRpbWVUb1N3aXRjaDsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiB3YXNGcm96ZW47Ci0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gZm9jdXNQYXVzZWQ7Ci0gICAgICAgICAgICBwcml2YXRlIFdpbmRvd1N0YXRlIGN1ckZvY3VzOwotCi0gICAgICAgICAgICBEaXNwYXRjaFN0YXRlKEtleUV2ZW50IHRoZUV2ZW50LCBXaW5kb3dTdGF0ZSB0aGVGb2N1cykgewotICAgICAgICAgICAgICAgIGZvY3VzID0gdGhlRm9jdXM7Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSB0aGVFdmVudDsKLSAgICAgICAgICAgICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgLy8gc25hcHNob3QgS2V5V2FpdGVyIHN0YXRlCi0gICAgICAgICAgICAgICAgbGFzdFdpbiA9IG1MYXN0V2luOwotICAgICAgICAgICAgICAgIGxhc3RCaW5kZXIgPSBtTGFzdEJpbmRlcjsKLSAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IG1GaW5pc2hlZDsKLSAgICAgICAgICAgICAgICBnb3RGaXJzdFdpbmRvdyA9IG1Hb3RGaXJzdFdpbmRvdzsKLSAgICAgICAgICAgICAgICBldmVudERpc3BhdGNoaW5nID0gbUV2ZW50RGlzcGF0Y2hpbmc7Ci0gICAgICAgICAgICAgICAgdGltZVRvU3dpdGNoID0gbVRpbWVUb1N3aXRjaDsKLSAgICAgICAgICAgICAgICB3YXNGcm96ZW4gPSBtV2FzRnJvemVuOwotICAgICAgICAgICAgICAgIGN1ckZvY3VzID0gbUN1cnJlbnRGb2N1czsKLSAgICAgICAgICAgICAgICAvLyBjYWNoZSB0aGUgcGF1c2VkIHN0YXRlIGF0IGN0b3IgdGltZSBhcyB3ZWxsCi0gICAgICAgICAgICAgICAgaWYgKHRoZUZvY3VzID09IG51bGwgfHwgdGhlRm9jdXMubVRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9jdXNQYXVzZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb2N1c1BhdXNlZCA9IHRoZUZvY3VzLm1Ub2tlbi5wYXVzZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAie3siICsgZXZlbnQgKyAiIHRvICIgKyBmb2N1cyArICIgQCAiICsgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGx3PSIgKyBsYXN0V2luICsgIiBsYj0iICsgbGFzdEJpbmRlcgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZpbj0iICsgZmluaXNoZWQgKyAiIGdmdz0iICsgZ290Rmlyc3RXaW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBlZD0iICsgZXZlbnREaXNwYXRjaGluZyArICIgdHRzPSIgKyB0aW1lVG9Td2l0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3Zj0iICsgd2FzRnJvemVuICsgIiBmcD0iICsgZm9jdXNQYXVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtY2Y9IiArIGN1ckZvY3VzICsgIn19IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgcHJpdmF0ZSBEaXNwYXRjaFN0YXRlIG1EaXNwYXRjaFN0YXRlID0gbnVsbDsKLSAgICAgICAgcHVibGljIHZvaWQgcmVjb3JkRGlzcGF0Y2hTdGF0ZShLZXlFdmVudCB0aGVFdmVudCwgV2luZG93U3RhdGUgdGhlRm9jdXMpIHsKLSAgICAgICAgICAgIG1EaXNwYXRjaFN0YXRlID0gbmV3IERpc3BhdGNoU3RhdGUodGhlRXZlbnQsIHRoZUZvY3VzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBFTkQgTk9TSElQCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVUVVJOX05PVEhJTkcgPSAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVRVUk5fUEVORElOR19QT0lOVEVSID0gMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVUVVJOX1BFTkRJTkdfVFJBQ0tCQUxMID0gMjsKLQotICAgICAgICBmaW5hbCBPYmplY3QgU0tJUF9UQVJHRVRfVE9LRU4gPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIGZpbmFsIE9iamVjdCBDT05TVU1FRF9FVkVOVF9UT0tFTiA9IG5ldyBPYmplY3QoKTsKLQotICAgICAgICBwcml2YXRlIFdpbmRvd1N0YXRlIG1MYXN0V2luID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBJQmluZGVyIG1MYXN0QmluZGVyID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hlZCA9IHRydWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtR290Rmlyc3RXaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FdmVudERpc3BhdGNoaW5nID0gdHJ1ZTsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1UaW1lVG9Td2l0Y2ggPSAwOwotICAgICAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gbVdhc0Zyb3plbiA9IGZhbHNlOwotCi0gICAgICAgIC8vIFRhcmdldCBvZiBNb3Rpb24gZXZlbnRzCi0gICAgICAgIFdpbmRvd1N0YXRlIG1Nb3Rpb25UYXJnZXQ7Ci0KLSAgICAgICAgLy8gV2luZG93cyBhYm92ZSB0aGUgdGFyZ2V0IHdobyB3b3VsZCBsaWtlIHRvIHJlY2VpdmUgYW4gIm91dHNpZGUiCi0gICAgICAgIC8vIHRvdWNoIGV2ZW50IGZvciBhbnkgZG93biBldmVudHMgb3V0c2lkZSBvZiB0aGVtLgotICAgICAgICBXaW5kb3dTdGF0ZSBtT3V0c2lkZVRvdWNoVGFyZ2V0czsKLQotICAgICAgICAvKioKLSAgICAgICAgICogV2FpdCBmb3IgdGhlIGxhc3QgZXZlbnQgZGlzcGF0Y2ggdG8gY29tcGxldGUsIHRoZW4gZmluZCB0aGUgbmV4dAotICAgICAgICAgKiB0YXJnZXQgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZ2l2ZW4gZXZlbnQgYW5kIHdhaXQgZm9yIHRoYXQgb25lCi0gICAgICAgICAqIHRvIGJlIHJlYWR5IHRvIHJlY2VpdmUgaXQuCi0gICAgICAgICAqLwotICAgICAgICBPYmplY3Qgd2FpdEZvck5leHRFdmVudFRhcmdldChLZXlFdmVudCBuZXh0S2V5LCBRdWV1ZWRFdmVudCBxZXYsCi0gICAgICAgICAgICAgICAgTW90aW9uRXZlbnQgbmV4dE1vdGlvbiwgYm9vbGVhbiBpc1BvaW50ZXJFdmVudCwKLSAgICAgICAgICAgICAgICBib29sZWFuIGZhaWxJZlRpbWVvdXQsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCkgewotICAgICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGxvbmcga2V5RGlzcGF0Y2hpbmdUaW1lb3V0ID0gNSAqIDEwMDA7Ci0gICAgICAgICAgICBsb25nIHdhaXRlZEZvciA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCB3aW5kb3cgd2UgY2FyZSBhYm91dC4gIEl0IGlzIGVpdGhlciB0aGUKLSAgICAgICAgICAgICAgICAvLyBsYXN0IHdpbmRvdyB3ZSBhcmUgd2FpdGluZyB0byBoYXZlIHByb2Nlc3MgdGhlIGV2ZW50IG9yLAotICAgICAgICAgICAgICAgIC8vIGlmIG5vbmUsIHRoZW4gdGhlIG5leHQgd2luZG93IHdlIHRoaW5rIHRoZSBldmVudCBzaG91bGQgZ28KLSAgICAgICAgICAgICAgICAvLyB0by4gIE5vdGU6IHdlIHJldHJpZXZlIG1MYXN0V2luIG91dHNpZGUgb2YgdGhlIGxvY2ssIHNvCi0gICAgICAgICAgICAgICAgLy8gaXQgbWF5IGNoYW5nZSBiZWZvcmUgd2UgbG9jay4gIFRodXMgd2UgbXVzdCBjaGVjayBpdCBhZ2Fpbi4KLSAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB0YXJnZXRXaW4gPSBtTGFzdFdpbjsKLSAgICAgICAgICAgICAgICBib29sZWFuIHRhcmdldElzTmV3ID0gdGFyZ2V0V2luID09IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoCi0gICAgICAgICAgICAgICAgICAgICAgICBUQUcsICJ3YWl0Rm9yTGFzdEtleTogbUZpbmlzaGVkPSIgKyBtRmluaXNoZWQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgbUxhc3RXaW49IiArIG1MYXN0V2luKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXNOZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHRhcmdldCA9IGZpbmRUYXJnZXRXaW5kb3cobmV4dEtleSwgcWV2LCBuZXh0TW90aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUG9pbnRlckV2ZW50LCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBTS0lQX1RBUkdFVF9UT0tFTikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHVzZXIgaGFzIHByZXNzZWQgYSBzcGVjaWFsIGtleSwgYW5kIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBpbmcgYWxsIHBlbmRpbmcgZXZlbnRzIGJlZm9yZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19JTlBVVCkgU2xvZy52KFRBRywgIlNraXBwaW5nOiAiICsgbmV4dEtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIiArIG5leHRNb3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBDT05TVU1FRF9FVkVOVF9UT0tFTikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoVEFHLCAiQ29uc3VtZWQ6ICIgKyBuZXh0S2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAiICsgbmV4dE1vdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldFdpbiA9IChXaW5kb3dTdGF0ZSl0YXJnZXQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQXBwV2luZG93VG9rZW4gdGFyZ2V0QXBwID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIC8vIE5vdzogaXMgaXQgb2theSB0byBzZW5kIHRoZSBuZXh0IGV2ZW50IHRvIHRoaXMgd2luZG93PwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdDogZGlkIHdlIGNvbWUgaGVyZSBiYXNlZCBvbiB0aGUgbGFzdCB3aW5kb3cgbm90Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJlaW5nIG51bGwsIGJ1dCBpdCBjaGFuZ2VkIGJ5IHRoZSB0aW1lIHdlIGdvdCBoZXJlPwotICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbywgdHJ5IGFnYWluLgotICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldElzTmV3ICYmIG1MYXN0V2luID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmV2ZXIgZGlzcGF0Y2ggZXZlbnRzIGlmIG5vdCBmaW5pc2hlZCB3aXRoIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IG9uZSwgb3IgdGhlIGRpc3BsYXkgaXMgZnJvemVuLgotICAgICAgICAgICAgICAgICAgICBpZiAobUZpbmlzaGVkICYmICFtRGlzcGxheUZyb3plbikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZXZlbnQgZGlzcGF0Y2hpbmcgaXMgZGlzYWJsZWQsIHRoZW4gd2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgY29uc3VtZSB0aGUgZXZlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRXZlbnREaXNwYXRjaGluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19JTlBVVCkgU2xvZy52KFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTa2lwcGluZyBldmVudDsgZGlzcGF0Y2hpbmcgZGlzYWJsZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV4dEtleSArICIgIiArIG5leHRNb3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIG5ldyB0YXJnZXQsIGFuZCB0aGF0IHRhcmdldCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXVzZWQgb3IgdW5yZXNwb25zaXZlLCB0aGVuIGFsbCBsb29rcyBnb29kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBldmVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXNOZXcgJiYgIXRhcmdldFdpbi5tVG9rZW4ucGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRXaW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhIHRhcmdldCB3aW5kb3csIGFuZCB0aGVyZSBpcyBubwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXNlZCBhcHAgd2luZG93LCB0aGVuIGp1c3QgZWF0IHRoZSBldmVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Gb2N1c2VkQXBwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfSU5QVVQpIFNsb2cudihUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgZXZlbnQ7IG5vIGZvY3VzZWQgYXBwOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5leHRLZXkgKyAiICIgKyBuZXh0TW90aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19JTlBVVCkgU2xvZy52KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBRywgIldhaXRpbmcgZm9yIGxhc3Qga2V5IGluICIgKyBtTGFzdEJpbmRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0YXJnZXQ9IiArIHRhcmdldFdpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtRmluaXNoZWQ9IiArIG1GaW5pc2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtRGlzcGxheUZyb3plbj0iICsgbURpc3BsYXlGcm96ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGFyZ2V0SXNOZXc9IiArIHRhcmdldElzTmV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBhdXNlZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0V2luICE9IG51bGwgPyB0YXJnZXRXaW4ubVRva2VuLnBhdXNlZCA6IGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtRm9jdXNlZEFwcD0iICsgbUZvY3VzZWRBcHAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbUN1cnJlbnRGb2N1cz0iICsgbUN1cnJlbnRGb2N1cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXBwID0gdGFyZ2V0V2luICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldFdpbi5tQXBwVG9rZW4gOiBtRm9jdXNlZEFwcDsKLQotICAgICAgICAgICAgICAgICAgICBsb25nIGN1clRpbWVvdXQgPSBrZXlEaXNwYXRjaGluZ1RpbWVvdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVGltZVRvU3dpdGNoICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVUb1N3aXRjaCA8PSBub3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBhcHAgc3dpdGNoIGtleSBoYXMgYmVlbiBwcmVzc2VkLCBhbmQgd2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRlZCB0b28gbG9uZyBmb3IgdGhlIGN1cnJlbnQgYXBwIHRvIGZpbmlzaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3Npbmcga2V5cywgdGhlbiB3YWl0IG5vIG1vcmUhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9GaW5pc2hlZEtleUxvY2tlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHN3aXRjaFRpbWVvdXQgPSBtVGltZVRvU3dpdGNoIC0gbm93OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRpbWVvdXQgPiBzd2l0Y2hUaW1lb3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVGltZW91dCA9IHN3aXRjaFRpbWVvdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhhdCBjb250aW51ZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBrZXlzLCBzbyB3ZSBkb24ndCBnZXQgc3R1Y2suCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfSU5QVVQpIFNsb2cudigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHLCAiV2FpdGluZyBmb3Iga2V5IGRpc3BhdGNoOiAiICsgY3VyVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3YWl0KGN1clRpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoVEFHLCAiRmluaXNoZWQgd2FpdGluZyBAIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpICsgIiBzdGFydFRpbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXJ0VGltZSArICIgc3dpdGNoVGltZT0iICsgbVRpbWVUb1N3aXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGFyZ2V0PSIgKyB0YXJnZXRXaW4gKyAiIG1MVz0iICsgbUxhc3RXaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1MQj0iICsgbUxhc3RCaW5kZXIgKyAiIGZpbj0iICsgbUZpbmlzaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ3VycmVudEZvY3VzPSIgKyBtQ3VycmVudEZvY3VzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZSBmcm96ZW4gZHVyaW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlLCByZXN0YXJ0IHRoZQotICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQgY2hlY2tzIGZyb20gbm93OyBvdGhlcndpc2UgbG9vayBhdCB3aGV0aGVyIHdlIHRpbWVkCi0gICAgICAgICAgICAgICAgLy8gb3V0IGJlZm9yZSBhd2FrZW5pbmcuCi0gICAgICAgICAgICAgICAgaWYgKG1XYXNGcm96ZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgd2FpdGVkRm9yID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbVdhc0Zyb3plbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXRlZEZvciA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh3YWl0ZWRGb3IgPj0ga2V5RGlzcGF0Y2hpbmdUaW1lb3V0ICYmIG1UaW1lVG9Td2l0Y2ggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBJQXBwbGljYXRpb25Ub2tlbiBhdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIktleSBkaXNwYXRjaGluZyB0aW1lZCBvdXQgc2VuZGluZyB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXRXaW4gIT0gbnVsbCA/IHRhcmdldFdpbi5tQXR0cnMuZ2V0VGl0bGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPG51bGw+OiBubyB3aW5kb3cgcmVhZHkgZm9yIGtleSBkaXNwYXRjaCIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PU0hJUCBkZWJ1Z2dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJQcmV2aW91cyBkaXNwYXRjaCBzdGF0ZTogIiArIG1EaXNwYXRjaFN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJDdXJyZW50IGRpc3BhdGNoIHN0YXRlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpc3BhdGNoU3RhdGUobmV4dEtleSwgdGFyZ2V0V2luKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBFTkQgTk9TSElQCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRXaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gdGFyZ2V0V2luLmdldEFwcFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldEFwcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgPSB0YXJnZXRBcHAuYXBwVG9rZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFib3J0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lb3V0ID0gYXQuZ2V0S2V5RGlzcGF0Y2hpbmdUaW1lb3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPiB3YWl0ZWRGb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZGlkIG5vdCB3YWl0IHRoZSBwcm9wZXIgYW1vdW50IG9mIHRpbWUgZm9yIHRoaXMgYXBwbGljYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgdGltZW91dCB0byBiZSB0aGUgcmVhbCB0aW1lb3V0IGFuZCB3YWl0IGFnYWluLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlEaXNwYXRjaGluZ1RpbWVvdXQgPSB0aW1lb3V0IC0gd2FpdGVkRm9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCA9IGF0LmtleURpc3BhdGNoaW5nVGltZWRPdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFib3J0ICYmIChtTGFzdFdpbiA9PSB0YXJnZXRXaW4gfHwgdGFyZ2V0V2luID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RXaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfSU5QVVQpIFNsb2cudihUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldpbmRvdyAiICsgbUxhc3RXaW4gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGltZWQgb3V0IG9uIGtleSBpbnB1dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RXaW4ubVRva2VuLnBhdXNlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVuLXBhdXNpbmcgZGlzcGF0Y2hpbmcgdG8gdGhpcyB3aW5kb3ciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0V2luLm1Ub2tlbi5wYXVzZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU1vdGlvblRhcmdldCA9PSB0YXJnZXRXaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0V2luID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEJpbmRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxJZlRpbWVvdXQgfHwgdGFyZ2V0V2luID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ29udGludWluZyB0byB3YWl0IGZvciBrZXkgdG8gYmUgZGlzcGF0Y2hlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGZpbmRUYXJnZXRXaW5kb3coS2V5RXZlbnQgbmV4dEtleSwgUXVldWVkRXZlbnQgcWV2LAotICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50IG5leHRNb3Rpb24sIGJvb2xlYW4gaXNQb2ludGVyRXZlbnQsCi0gICAgICAgICAgICAgICAgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKSB7Ci0gICAgICAgICAgICBtT3V0c2lkZVRvdWNoVGFyZ2V0cyA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChuZXh0S2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSB0YXJnZXQgd2luZG93IGZvciBhIG5vcm1hbCBrZXkgZXZlbnQuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGtleWNvZGUgPSBuZXh0S2V5LmdldEtleUNvZGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVwZWF0Q291bnQgPSBuZXh0S2V5LmdldFJlcGVhdENvdW50KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkb3duID0gbmV4dEtleS5nZXRBY3Rpb24oKSAhPSBLZXlFdmVudC5BQ1RJT05fVVA7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNwYXRjaCA9IG1LZXlXYWl0ZXIuY2hlY2tTaG91bGREaXNwYXRjaEtleShrZXljb2RlKTsKLQotICAgICAgICAgICAgICAgIGlmICghZGlzcGF0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxpbmdVaWQgPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmNoZWNrUGVybWlzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTkpFQ1RfRVZFTlRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeS5pbnRlcmNlcHRLZXlUaShudWxsLCBrZXljb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0S2V5LmdldE1ldGFTdGF0ZSgpLCBkb3duLCByZXBlYXRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEtleS5nZXRGbGFncygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRXZlbnQgdGltZW91dCBkdXJpbmcgYXBwIHN3aXRjaDogZHJvcHBpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV4dEtleSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX1RBUkdFVF9UT0tFTjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyMjIFsiICsgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgKyAiXSBXaW5kb3dNYW5hZ2VyU2VydmljZS5kaXNwYXRjaEtleSgiICsga2V5Y29kZSArICIsICIgKyBkb3duICsgIiwgIiArIHJlcGVhdENvdW50ICsgIikiKTsKLQotICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIGZvY3VzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobVdpbmRvd01hcCkgewotICAgICAgICAgICAgICAgICAgICBmb2N1cyA9IGdldEZvY3VzZWRXaW5kb3dMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3YWtldXBJZk5lZWRlZChmb2N1cywgTG9jYWxQb3dlck1hbmFnZXIuQlVUVE9OX0VWRU5UKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsaW5nVWlkID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyAhPSBudWxsICYmIGNhbGxpbmdVaWQgPT0gZm9jdXMubVNlc3Npb24ubVVpZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmNoZWNrUGVybWlzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLklOSkVDVF9FVkVOVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeS5pbnRlcmNlcHRLZXlUaShmb2N1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXljb2RlLCBuZXh0S2V5LmdldE1ldGFTdGF0ZSgpLCBkb3duLCByZXBlYXRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0S2V5LmdldEZsYWdzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ09OU1VNRURfRVZFTlRfVE9LRU47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXM7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUG9pbnRlckV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNwYXRjaCA9IG1LZXlXYWl0ZXIuY2hlY2tTaG91bGREaXNwYXRjaEtleSgtMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNwYXRjaCkgewotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRXZlbnQgdGltZW91dCBkdXJpbmcgYXBwIHN3aXRjaDogZHJvcHBpbmcgdHJhY2tiYWxsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5leHRNb3Rpb24pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0tJUF9UQVJHRVRfVE9LRU47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgV2luZG93U3RhdGUgZm9jdXMgPSBudWxsOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvY3VzID0gZ2V0Rm9jdXNlZFdpbmRvd0xvY2tlZCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdha2V1cElmTmVlZGVkKGZvY3VzLCBMb2NhbFBvd2VyTWFuYWdlci5CVVRUT05fRVZFTlQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmb2N1czsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5leHRNb3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX1RBUkdFVF9UT0tFTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBkaXNwYXRjaCA9IG1LZXlXYWl0ZXIuY2hlY2tTaG91bGREaXNwYXRjaEtleSgKLSAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOKTsKLSAgICAgICAgICAgIGlmICghZGlzcGF0Y2gpIHsKLSAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRXZlbnQgdGltZW91dCBkdXJpbmcgYXBwIHN3aXRjaDogZHJvcHBpbmcgcG9pbnRlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG5leHRNb3Rpb24pOwotICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX1RBUkdFVF9UT0tFTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmluZCB0aGUgdGFyZ2V0IHdpbmRvdyBmb3IgYSBwb2ludGVyIGV2ZW50LgotICAgICAgICAgICAgaW50IGFjdGlvbiA9IG5leHRNb3Rpb24uZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB4ZiA9IG5leHRNb3Rpb24uZ2V0WCgpOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgeWYgPSBuZXh0TW90aW9uLmdldFkoKTsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgZXZlbnRUaW1lID0gbmV4dE1vdGlvbi5nZXRFdmVudFRpbWUoKTsKLQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzY3JlZW5XYXNPZmYgPSBxZXYgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAocWV2LmZsYWdzJldpbmRvd01hbmFnZXJQb2xpY3kuRkxBR19CUklHSFRfSEVSRSkgIT0gMDsKLQotICAgICAgICAgICAgV2luZG93U3RhdGUgdGFyZ2V0ID0gbnVsbDsKLQotICAgICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb3Rpb25UYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgd2VpcmQsIHdlIGdvdCBhIHBlbiBkb3duLCBidXQgd2UgdGhvdWdodCBpdCB3YXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGRvd24hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYOiBXZSBzaG91bGQgcHJvYmFibHkgc2VuZCBhbiBBQ1RJT05fVVAgdG8gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlBvaW50ZXIgZG93biByZWNlaXZlZCB3aGlsZSBhbHJlYWR5IGRvd24gaW46ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbU1vdGlvblRhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFDVElPTl9ET1dOIGlzIHNwZWNpYWwsIGJlY2F1c2Ugd2UgbmVlZCB0byBsb2NrIG5leHQgZXZlbnRzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2luZG93IHdlJ2xsIGxhbmQgb250by4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB4ID0gKGludCl4ZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCl5ZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0IHdpbmRvd3MgPSBtV2luZG93czsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gd2luZG93cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB0b3BFcnJXaW5kb3cgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCB0bXBSZWN0ID0gbVRlbXBSZWN0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1OLTE7IGk+PTA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIGNoaWxkID0gKFdpbmRvd1N0YXRlKXdpbmRvd3MuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2xvZy5pKFRBRywgIkNoZWNraW5nIGRpc3BhdGNoIHRvOiAiICsgY2hpbGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBmbGFncyA9IGNoaWxkLm1BdHRycy5mbGFnczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TWVNURU1fRVJST1IpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcEVycldpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BFcnJXaW5kb3cgPSBjaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLmlzVmlzaWJsZUx3KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TbG9nLmkoVEFHLCAiTm90IHZpc2libGUhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hBQkxFKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2xvZy5pKFRBRywgIk5vdCB0b3VjaGFibGUhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GTEFHX1dBVENIX09VVFNJREVfVE9VQ0gpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm1OZXh0T3V0c2lkZVRvdWNoID0gbU91dHNpZGVUb3VjaFRhcmdldHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0c2lkZVRvdWNoVGFyZ2V0cyA9IGNoaWxkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBSZWN0LnNldChjaGlsZC5tRnJhbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5tVG91Y2hhYmxlSW5zZXRzID09IFZpZXdUcmVlT2JzZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW50ZXJuYWxJbnNldHNJbmZvLlRPVUNIQUJMRV9JTlNFVFNfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdG91Y2ggaXMgaW5zaWRlIG9mIHRoZSB3aW5kb3cgaWYgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSBmcmFtZSwgQU5EIHRoZSBjb250ZW50IHBhcnQgb2YgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZSB0aGF0IHdhcyBnaXZlbiBieSB0aGUgYXBwbGljYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QubGVmdCArPSBjaGlsZC5tR2l2ZW5Db250ZW50SW5zZXRzLmxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QudG9wICs9IGNoaWxkLm1HaXZlbkNvbnRlbnRJbnNldHMudG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBSZWN0LnJpZ2h0IC09IGNoaWxkLm1HaXZlbkNvbnRlbnRJbnNldHMucmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QuYm90dG9tIC09IGNoaWxkLm1HaXZlbkNvbnRlbnRJbnNldHMuYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQubVRvdWNoYWJsZUluc2V0cyA9PSBWaWV3VHJlZU9ic2VydmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkludGVybmFsSW5zZXRzSW5mby5UT1VDSEFCTEVfSU5TRVRTX1ZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRvdWNoIGlzIGluc2lkZSBvZiB0aGUgd2luZG93IGlmIGl0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgZnJhbWUsIEFORCB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWUgdGhhdCB3YXMgZ2l2ZW4gYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBSZWN0LmxlZnQgKz0gY2hpbGQubUdpdmVuVmlzaWJsZUluc2V0cy5sZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBSZWN0LnRvcCArPSBjaGlsZC5tR2l2ZW5WaXNpYmxlSW5zZXRzLnRvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wUmVjdC5yaWdodCAtPSBjaGlsZC5tR2l2ZW5WaXNpYmxlSW5zZXRzLnJpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBSZWN0LmJvdHRvbSAtPSBjaGlsZC5tR2l2ZW5WaXNpYmxlSW5zZXRzLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRvdWNoRmxhZ3MgPSBmbGFncyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wUmVjdC5jb250YWlucyh4LCB5KSB8fCB0b3VjaEZsYWdzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TbG9nLmkoVEFHLCAiVXNpbmcgdGhpcyB0YXJnZXQhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NyZWVuV2FzT2ZmIHx8IChmbGFncyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UT1VDSEFCTEVfV0hFTl9XQUtJTkcpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25UYXJnZXQgPSBjaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2xvZy5pKFRBRywgIldha2luZywgc2tpcCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25UYXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZMQUdfV0FUQ0hfT1VUU0lERV9UT1VDSCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5tTmV4dE91dHNpZGVUb3VjaCA9IG1PdXRzaWRlVG91Y2hUYXJnZXRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0c2lkZVRvdWNoVGFyZ2V0cyA9IGNoaWxkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Nsb2cuaShUQUcsICJBZGRpbmcgdG8gb3V0c2lkZSB0YXJnZXQgbGlzdDogIiArIGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgYW4gZXJyb3Igd2luZG93IGJ1dCBpdCdzIG5vdCBhY2NlcHRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvY3VzICh0eXBpY2FsbHkgYmVjYXVzZSBpdCBpcyBub3QgeWV0IHZpc2libGUpIGp1c3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIGl0IC0tIGFueSBvdGhlciBmb2N1c2VkIHdpbmRvdyBtYXkgaW4gZmFjdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgaW4gQU5SIHN0YXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcEVycldpbmRvdyAhPSBudWxsICYmIG1Nb3Rpb25UYXJnZXQgIT0gdG9wRXJyV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBtTW90aW9uVGFyZ2V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2FrZXVwSWZOZWVkZWQodGFyZ2V0LCBldmVudFR5cGUobmV4dE1vdGlvbikpOwotCi0gICAgICAgICAgICAvLyBQb2ludGVyIGV2ZW50cyBhcmUgYSBsaXR0bGUgZGlmZmVyZW50IC0tIGlmIHRoZXJlIGlzbid0IGEKLSAgICAgICAgICAgIC8vIHRhcmdldCBmb3VuZCBmb3IgYW55IGV2ZW50LCB0aGVuIGp1c3QgZHJvcCBpdC4KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXQgIT0gbnVsbCA/IHRhcmdldCA6IFNLSVBfVEFSR0VUX1RPS0VOOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBjaGVja1Nob3VsZERpc3BhdGNoS2V5KGludCBrZXljb2RlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobVBvbGljeS5pc0FwcFN3aXRjaEtleVRxVGlMd0xpKGtleWNvZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaW1lVG9Td2l0Y2ggPSAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1UaW1lVG9Td2l0Y2ggIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVRpbWVUb1N3aXRjaCA8IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGJpbmRUYXJnZXRXaW5kb3dMb2NrZWQoV2luZG93U3RhdGUgd2luLAotICAgICAgICAgICAgICAgIGludCBwZW5kaW5nV2hhdCwgUXVldWVkRXZlbnQgcGVuZGluZ01vdGlvbikgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgYmluZFRhcmdldFdpbmRvd0xvY2tlZExvY2tlZCh3aW4sIHBlbmRpbmdXaGF0LCBwZW5kaW5nTW90aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYmluZFRhcmdldFdpbmRvd0xvY2tlZChXaW5kb3dTdGF0ZSB3aW4pIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIGJpbmRUYXJnZXRXaW5kb3dMb2NrZWRMb2NrZWQod2luLCBSRVRVUk5fTk9USElORywgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGJpbmRUYXJnZXRXaW5kb3dMb2NrZWRMb2NrZWQoV2luZG93U3RhdGUgd2luLAotICAgICAgICAgICAgICAgIGludCBwZW5kaW5nV2hhdCwgUXVldWVkRXZlbnQgcGVuZGluZ01vdGlvbikgewotICAgICAgICAgICAgbUxhc3RXaW4gPSB3aW47Ci0gICAgICAgICAgICBtTGFzdEJpbmRlciA9IHdpbi5tQ2xpZW50LmFzQmluZGVyKCk7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChwZW5kaW5nTW90aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTZXNzaW9uIHMgPSB3aW4ubVNlc3Npb247Ci0gICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdXaGF0ID09IFJFVFVSTl9QRU5ESU5HX1BPSU5URVIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVBlbmRpbmdQb2ludGVyTG9ja2VkKHMpOwotICAgICAgICAgICAgICAgICAgICBzLm1QZW5kaW5nUG9pbnRlck1vdmUgPSBwZW5kaW5nTW90aW9uOwotICAgICAgICAgICAgICAgICAgICBzLm1QZW5kaW5nUG9pbnRlcldpbmRvdyA9IHdpbjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaW5kVGFyZ2V0VG9XaW5kb3cgIiArIHMubVBlbmRpbmdQb2ludGVyTW92ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZW5kaW5nV2hhdCA9PSBSRVRVUk5fUEVORElOR19UUkFDS0JBTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVBlbmRpbmdUcmFja2JhbGxMb2NrZWQocyk7Ci0gICAgICAgICAgICAgICAgICAgIHMubVBlbmRpbmdUcmFja2JhbGxNb3ZlID0gcGVuZGluZ01vdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgcy5tUGVuZGluZ1RyYWNrYmFsbFdpbmRvdyA9IHdpbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlbGVhc2VQZW5kaW5nUG9pbnRlckxvY2tlZChTZXNzaW9uIHMpIHsKLSAgICAgICAgICAgIGlmIChERUJVR19JTlBVVCkgU2xvZy52KFRBRywKLSAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VQZW5kaW5nUG9pbnRlciAiICsgcy5tUGVuZGluZ1BvaW50ZXJNb3ZlKTsKLSAgICAgICAgICAgIGlmIChzLm1QZW5kaW5nUG9pbnRlck1vdmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1RdWV1ZS5yZWN5Y2xlRXZlbnQocy5tUGVuZGluZ1BvaW50ZXJNb3ZlKTsKLSAgICAgICAgICAgICAgICBzLm1QZW5kaW5nUG9pbnRlck1vdmUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZWxlYXNlUGVuZGluZ1RyYWNrYmFsbExvY2tlZChTZXNzaW9uIHMpIHsKLSAgICAgICAgICAgIGlmIChzLm1QZW5kaW5nVHJhY2tiYWxsTW92ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVF1ZXVlLnJlY3ljbGVFdmVudChzLm1QZW5kaW5nVHJhY2tiYWxsTW92ZSk7Ci0gICAgICAgICAgICAgICAgcy5tUGVuZGluZ1RyYWNrYmFsbE1vdmUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTW90aW9uRXZlbnQgZmluaXNoZWRLZXkoU2Vzc2lvbiBzZXNzaW9uLCBJV2luZG93IGNsaWVudCwgYm9vbGVhbiBmb3JjZSwKLSAgICAgICAgICAgICAgICBpbnQgcmV0dXJuV2hhdCkgewotICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoCi0gICAgICAgICAgICAgICAgVEFHLCAiZmluaXNoZWRLZXk6IGNsaWVudD0iICsgY2xpZW50ICsgIiwgZm9yY2U9IiArIGZvcmNlKTsKLQotICAgICAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1vdGlvbkV2ZW50IHJlcyA9IG51bGw7Ci0gICAgICAgICAgICBRdWV1ZWRFdmVudCBxZXYgPSBudWxsOwotICAgICAgICAgICAgV2luZG93U3RhdGUgd2luID0gbnVsbDsKLQotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoCi0gICAgICAgICAgICAgICAgICAgIFRBRywgImZpbmlzaGVkS2V5OiBjbGllbnQ9IiArIGNsaWVudC5hc0JpbmRlcigpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZm9yY2U9IiArIGZvcmNlICsgIiwgbGFzdD0iICsgbUxhc3RCaW5kZXIKLSAgICAgICAgICAgICAgICAgICAgKyAiICh0b2tlbj0iICsgKG1MYXN0V2luICE9IG51bGwgPyBtTGFzdFdpbi5tVG9rZW4gOiBudWxsKSArICIpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuV2hhdCA9PSBSRVRVUk5fUEVORElOR19QT0lOVEVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIHFldiA9IHNlc3Npb24ubVBlbmRpbmdQb2ludGVyTW92ZTsKLSAgICAgICAgICAgICAgICAgICAgd2luID0gc2Vzc2lvbi5tUGVuZGluZ1BvaW50ZXJXaW5kb3c7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24ubVBlbmRpbmdQb2ludGVyTW92ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24ubVBlbmRpbmdQb2ludGVyV2luZG93ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHVybldoYXQgPT0gUkVUVVJOX1BFTkRJTkdfVFJBQ0tCQUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHFldiA9IHNlc3Npb24ubVBlbmRpbmdUcmFja2JhbGxNb3ZlOwotICAgICAgICAgICAgICAgICAgICB3aW4gPSBzZXNzaW9uLm1QZW5kaW5nVHJhY2tiYWxsV2luZG93OwotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLm1QZW5kaW5nVHJhY2tiYWxsTW92ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24ubVBlbmRpbmdUcmFja2JhbGxXaW5kb3cgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtTGFzdEJpbmRlciA9PSBjbGllbnQuYXNCaW5kZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfSU5QVVQpIFNsb2cudigKLSAgICAgICAgICAgICAgICAgICAgICAgIFRBRywgImZpbmlzaGVkS2V5OiBsYXN0IHBhdXNlZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICArICgobUxhc3RXaW4gIT0gbnVsbCkgPyBtTGFzdFdpbi5tVG9rZW4ucGF1c2VkIDogIm51bGwiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFdpbiAhPSBudWxsICYmICghbUxhc3RXaW4ubVRva2VuLnBhdXNlZCB8fCBmb3JjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtRXZlbnREaXNwYXRjaGluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvRmluaXNoZWRLZXlMb2NrZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gd2FrZSB1cCBhbnlvbmUgY3VycmVudGx5IHdhaXRpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGEga2V5LCBzbyB0aGV5IGNhbiByZS1ldmFsdWF0ZSB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzaXR1YXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocWV2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gKE1vdGlvbkV2ZW50KXFldi5ldmVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXR1cm5pbmcgcGVuZGluZyBtb3Rpb246ICIgKyByZXMpOwotICAgICAgICAgICAgICAgICAgICBtUXVldWUucmVjeWNsZUV2ZW50KHFldik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aW4gIT0gbnVsbCAmJiByZXR1cm5XaGF0ID09IFJFVFVSTl9QRU5ESU5HX1BPSU5URVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5vZmZzZXRMb2NhdGlvbigtd2luLm1GcmFtZS5sZWZ0LCAtd2luLm1GcmFtZS50b3ApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVzICE9IG51bGwgJiYgcmV0dXJuV2hhdCA9PSBSRVRVUk5fUEVORElOR19QT0lOVEVSKSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoUG9pbnRlckVsc2V3aGVyZUxvY2tlZCh3aW4sIHdpbiwgcmVzLCByZXMuZ2V0RXZlbnRUaW1lKCksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRpY2tsZSgpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIG5vdGlmeUFsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBoYW5kbGVOZXdXaW5kb3dMb2NrZWQoV2luZG93U3RhdGUgbmV3V2luZG93KSB7Ci0gICAgICAgICAgICBpZiAoIW5ld1dpbmRvdy5jYW5SZWNlaXZlS2V5cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoCi0gICAgICAgICAgICAgICAgICAgIFRBRywgIk5ldyBrZXkgZGlzcGF0Y2ggd2luZG93OiB3aW49IgotICAgICAgICAgICAgICAgICAgICArIG5ld1dpbmRvdy5tQ2xpZW50LmFzQmluZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBsYXN0PSIgKyBtTGFzdEJpbmRlcgotICAgICAgICAgICAgICAgICAgICArICIgKHRva2VuPSIgKyAobUxhc3RXaW4gIT0gbnVsbCA/IG1MYXN0V2luLm1Ub2tlbiA6IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICsgIiksIGZpbmlzaGVkPSIgKyBtRmluaXNoZWQgKyAiLCBwYXVzZWQ9IgotICAgICAgICAgICAgICAgICAgICArIG5ld1dpbmRvdy5tVG9rZW4ucGF1c2VkKTsKLQotICAgICAgICAgICAgICAgIC8vIERpc3BsYXlpbmcgYSB3aW5kb3cgaW1wbGljaXRseSBjYXVzZXMgZGlzcGF0Y2hpbmcgdG8KLSAgICAgICAgICAgICAgICAvLyBiZSB1bnBhdXNlZC4gIChUaGlzIGlzIHRvIHByb3RlY3QgYWdhaW5zdCBidWdzIGlmIHNvbWVvbmUKLSAgICAgICAgICAgICAgICAvLyBwYXVzZXMgZGlzcGF0Y2hpbmcgYnV0IGZvcmdldHMgdG8gcmVzdW1lLikKLSAgICAgICAgICAgICAgICBuZXdXaW5kb3cubVRva2VuLnBhdXNlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgbUdvdEZpcnN0V2luZG93ID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGlmICgobmV3V2luZG93Lm1BdHRycy5mbGFncyAmIEZMQUdfU1lTVEVNX0VSUk9SKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19JTlBVVCkgU2xvZy52KFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmV3IFNZU1RFTV9FUlJPUiB3aW5kb3c7IHJlc2V0dGluZyBzdGF0ZSIpOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFdpbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0QmluZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIG1GaW5pc2hlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTGFzdFdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgd2luZG93IGlzIGFib3ZlIHRoZSB3aW5kb3cgd2UgYXJlCi0gICAgICAgICAgICAgICAgICAgIC8vIHdhaXRpbmcgb24sIHRoZW4gc3RvcCB3YWl0aW5nIGFuZCBsZXQga2V5IGRpc3BhdGNoaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG9uIHRoZSBuZXcgZ3V5LgotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfSU5QVVQpIFNsb2cudigKLSAgICAgICAgICAgICAgICAgICAgICAgIFRBRywgIkxhc3Qgd2luIGxheWVyPSIgKyBtTGFzdFdpbi5tTGF5ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbmV3IHdpbiBsYXllcj0iICsgbmV3V2luZG93Lm1MYXllcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdXaW5kb3cubUxheWVyID49IG1MYXN0V2luLm1MYXllcikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5ldyB3aW5kb3cgaXMgYWJvdmUgdGhlIG9sZDsgZmluaXNoIHBlbmRpbmcgaW5wdXQgdG8gdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdyBhbmQgc3RhcnQgZGlyZWN0aW5nIGl0IHRvIHRoZSBuZXcgb25lLgotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RXaW4ubVRva2VuLnBhdXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgZG9GaW5pc2hlZEtleUxvY2tlZChmYWxzZSk7ICAvLyBkb2VzIGEgbm90aWZ5QWxsKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIHB1dCBhIG5ldyB3aW5kb3cgc3RhdGUgaW4gcGxhY2UsIG1ha2UgdGhlIGV2ZW50IHdhaXRlcgotICAgICAgICAgICAgICAgIC8vIHRha2Ugbm90aWNlIGFuZCByZXRhcmdldCBpdHMgYXR0ZW50aW9ucy4KLSAgICAgICAgICAgICAgICBub3RpZnlBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcGF1c2VEaXNwYXRjaGluZ0xvY2tlZChXaW5kb3dUb2tlbiB0b2tlbikgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChERUJVR19JTlBVVCkgU2xvZy52KFRBRywgIlBhdXNpbmcgV2luZG93VG9rZW4gIiArIHRva2VuKTsKLSAgICAgICAgICAgICAgICB0b2tlbi5wYXVzZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBpZiAobUxhc3RXaW4gIT0gbnVsbCAmJiAhbUZpbmlzaGVkICYmIG1MYXN0V2luLm1CYXNlTGF5ZXIgPD0gbGF5ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0V2luID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJLZXkgZGlzcGF0Y2hpbmcgbm90IHBhdXNlZDogbm8gbGFzdCB3aW5kb3cuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZpbmlzaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiS2V5IGRpc3BhdGNoaW5nIG5vdCBwYXVzZWQ6IGZpbmlzaGVkIGxhc3Qga2V5LiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIktleSBkaXNwYXRjaGluZyBub3QgcGF1c2VkOiB3aW5kb3cgaW4gaGlnaGVyIGxheWVyLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJlc3VtZURpc3BhdGNoaW5nTG9ja2VkKFdpbmRvd1Rva2VuIHRva2VuKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW4ucGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19JTlBVVCkgU2xvZy52KAotICAgICAgICAgICAgICAgICAgICAgICAgVEFHLCAiUmVzdW1pbmcgV2luZG93VG9rZW4gIiArIHRva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIGxhc3Q9IiArIG1MYXN0QmluZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgKHRva2VuPSIgKyAobUxhc3RXaW4gIT0gbnVsbCA/IG1MYXN0V2luLm1Ub2tlbiA6IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIpLCBmaW5pc2hlZD0iICsgbUZpbmlzaGVkICsgIiwgcGF1c2VkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdG9rZW4ucGF1c2VkKTsKLSAgICAgICAgICAgICAgICAgICAgdG9rZW4ucGF1c2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFdpbiAhPSBudWxsICYmIG1MYXN0V2luLm1Ub2tlbiA9PSB0b2tlbiAmJiBtRmluaXNoZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvRmluaXNoZWRLZXlMb2NrZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldEV2ZW50RGlzcGF0Y2hpbmdMb2NrZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBtRXZlbnREaXNwYXRjaGluZyA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFwcFN3aXRjaENvbWluZygpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIC8vIERvbid0IHdhaXQgZm9yIG1vcmUgdGhhbiAuNSBzZWNvbmRzIGZvciBhcHAgdG8gZmluaXNoCi0gICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyB0aGUgcGVuZGluZyBldmVudHMuCi0gICAgICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSArIDUwMDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfSU5QVVQpIFNsb2cudihUQUcsICJhcHBTd2l0Y2hDb21pbmc6ICIgKyBub3cpOwotICAgICAgICAgICAgICAgIGlmIChtVGltZVRvU3dpdGNoID09IDAgfHwgbm93IDwgbVRpbWVUb1N3aXRjaCkgewotICAgICAgICAgICAgICAgICAgICBtVGltZVRvU3dpdGNoID0gbm93OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBub3RpZnlBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCBkb0ZpbmlzaGVkS2V5TG9ja2VkKGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgICAgIGlmIChtTGFzdFdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZVBlbmRpbmdQb2ludGVyTG9ja2VkKG1MYXN0V2luLm1TZXNzaW9uKTsKLSAgICAgICAgICAgICAgICByZWxlYXNlUGVuZGluZ1RyYWNrYmFsbExvY2tlZChtTGFzdFdpbi5tU2Vzc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb3JjZSB8fCBtTGFzdFdpbiA9PSBudWxsIHx8ICFtTGFzdFdpbi5tVG9rZW4ucGF1c2VkCi0gICAgICAgICAgICAgICAgICAgIHx8ICFtTGFzdFdpbi5pc1Zpc2libGVMdygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgd2luZG93IGhhcyBiZWVuIHBhdXNlZCwgd2UgYXJlbid0IC1yZWFsbHktCi0gICAgICAgICAgICAgICAgLy8gZmluaXNoZWQuLi4gIHNvIGxldCB0aGUgd2FpdGVycyBzdGlsbCB3YWl0LgotICAgICAgICAgICAgICAgIG1MYXN0V2luID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtTGFzdEJpbmRlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEtleVEgZXh0ZW5kcyBLZXlJbnB1dFF1ZXVlCi0gICAgICAgICAgICBpbXBsZW1lbnRzIEtleUlucHV0UXVldWUuRmlsdGVyQ2FsbGJhY2sgewotICAgICAgICBLZXlRKCkgewotICAgICAgICAgICAgc3VwZXIobUNvbnRleHQsIFdpbmRvd01hbmFnZXJTZXJ2aWNlLnRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIGJvb2xlYW4gcHJlcHJvY2Vzc0V2ZW50KElucHV0RGV2aWNlIGRldmljZSwgUmF3SW5wdXRFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKG1Qb2xpY3kucHJlcHJvY2Vzc0lucHV0RXZlbnRUcShldmVudCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSYXdJbnB1dEV2ZW50LkVWX0tFWTogewotICAgICAgICAgICAgICAgICAgICAvLyBYWFggYmVnaW4gaGFjawotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXljb2RlID09IEtleUV2ZW50LktFWUNPREVfRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC52YWx1ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEcgZG93bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5LnNjcmVlblR1cm5lZE9mZihXaW5kb3dNYW5hZ2VyUG9saWN5Lk9GRl9CRUNBVVNFX09GX1VTRVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Y29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudmFsdWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFhYWCBlbmQgaGFjawotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2NyZWVuSXNPZmYgPSAhbVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2NyZWVuSXNEaW0gPSAhbVBvd2VyTWFuYWdlci5pc1NjcmVlbkJyaWdodCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9ucyA9IG1Qb2xpY3kuaW50ZXJjZXB0S2V5VHEoZXZlbnQsICFzY3JlZW5Jc09mZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChhY3Rpb25zICYgV2luZG93TWFuYWdlclBvbGljeS5BQ1RJT05fR09fVE9fU0xFRVApICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuZ29Ub1NsZWVwKGV2ZW50LndoZW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmVlbklzT2ZmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyUG9saWN5LkZMQUdfV09LRV9IRVJFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY3JlZW5Jc0RpbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZmxhZ3MgfD0gV2luZG93TWFuYWdlclBvbGljeS5GTEFHX0JSSUdIVF9IRVJFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYWN0aW9ucyAmIFdpbmRvd01hbmFnZXJQb2xpY3kuQUNUSU9OX1BPS0VfVVNFUl9BQ1RJVklUWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci51c2VyQWN0aXZpdHkoZXZlbnQud2hlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsUG93ZXJNYW5hZ2VyLkJVVFRPTl9FVkVOVCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChhY3Rpb25zICYgV2luZG93TWFuYWdlclBvbGljeS5BQ1RJT05fUEFTU19UT19VU0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudmFsdWUgIT0gMCAmJiBtUG9saWN5LmlzQXBwU3dpdGNoS2V5VHFUaUx3TGkoZXZlbnQua2V5Y29kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRdWV1ZSh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLmFwcFN3aXRjaENvbWluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFJhd0lucHV0RXZlbnQuRVZfUkVMOiB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2NyZWVuSXNPZmYgPSAhbVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2NyZWVuSXNEaW0gPSAhbVBvd2VyTWFuYWdlci5pc1NjcmVlbkJyaWdodCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NyZWVuSXNPZmYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVBvbGljeS5pc1dha2VSZWxNb3ZlbWVudFRxKGV2ZW50LmRldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuY2xhc3NlcywgZXZlbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TbG9nLmkoVEFHLCAiZHJvcHBpbmcgYmVjYXVzZSBzY3JlZW5Jc09mZiBhbmQgIWlzV2FrZUtleSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmZsYWdzIHw9IFdpbmRvd01hbmFnZXJQb2xpY3kuRkxBR19XT0tFX0hFUkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmVlbklzRGltKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyUG9saWN5LkZMQUdfQlJJR0hUX0hFUkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBSYXdJbnB1dEV2ZW50LkVWX0FCUzogewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNjcmVlbklzT2ZmID0gIW1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNjcmVlbklzRGltID0gIW1Qb3dlck1hbmFnZXIuaXNTY3JlZW5CcmlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmVlbklzT2ZmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Qb2xpY3kuaXNXYWtlQWJzTW92ZW1lbnRUcShldmVudC5kZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmNsYXNzZXMsIGV2ZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2xvZy5pKFRBRywgImRyb3BwaW5nIGJlY2F1c2Ugc2NyZWVuSXNPZmYgYW5kICFpc1dha2VLZXkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyUG9saWN5LkZMQUdfV09LRV9IRVJFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY3JlZW5Jc0RpbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZmxhZ3MgfD0gV2luZG93TWFuYWdlclBvbGljeS5GTEFHX0JSSUdIVF9IRVJFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBmaWx0ZXJFdmVudChRdWV1ZWRFdmVudCBldikgewotICAgICAgICAgICAgc3dpdGNoIChldi5jbGFzc1R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJhd0lucHV0RXZlbnQuQ0xBU1NfS0VZQk9BUkQ6Ci0gICAgICAgICAgICAgICAgICAgIEtleUV2ZW50IGtlID0gKEtleUV2ZW50KWV2LmV2ZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeS5pc01vdmVtZW50S2V5VGkoa2UuZ2V0S2V5Q29kZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkRyb3BwaW5nIG1vdmVtZW50IGtleSBkdXJpbmcgYXBwIHN3aXRjaDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtlLmdldEtleUNvZGUoKSArICIsIGFjdGlvbj0iICsga2UuZ2V0QWN0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZJTFRFUl9SRU1PVkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZJTFRFUl9BQk9SVDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRklMVEVSX0tFRVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBkZXRlY3RTYWZlTW9kZSgpIHsKICAgICAgICAgbVNhZmVNb2RlID0gbVBvbGljeS5kZXRlY3RTYWZlTW9kZSgpOwogICAgICAgICByZXR1cm4gbVNhZmVNb2RlOwpAQCAtNzAwNCwyMTkgKzU0OTAsNiBAQAogICAgICAgICBtUG9saWN5LnN5c3RlbVJlYWR5KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBJbnB1dERpc3BhdGNoZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAvLyBUaW1lIHRvIHdhaXQgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvOiA5OTk5IHNlY29uZHMuCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9OR19XQUlUPTk5OTkqMTAwMDsKLQotICAgICAgICBwdWJsaWMgSW5wdXREaXNwYXRjaGVyVGhyZWFkKCkgewotICAgICAgICAgICAgc3VwZXIoIklucHV0RGlzcGF0Y2hlciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2VzcygpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJFeGNlcHRpb24gaW4gaW5wdXQgZGlzcGF0Y2hlciIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLnNldFRocmVhZFByaW9yaXR5KAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX1VSR0VOVF9ESVNQTEFZKTsKLQotICAgICAgICAgICAgLy8gVGhlIGxhc3Qga2V5IGV2ZW50IHdlIHNhdwotICAgICAgICAgICAgS2V5RXZlbnQgbGFzdEtleSA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIExhc3Qga2V5ZG93biB0aW1lIGZvciBhdXRvLXJlcGVhdGluZyBrZXlzCi0gICAgICAgICAgICBsb25nIGxhc3RLZXlUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBsb25nIG5leHRLZXlUaW1lID0gbGFzdEtleVRpbWUrTE9OR19XQUlUOwotICAgICAgICAgICAgbG9uZyBkb3duVGltZSA9IDA7Ci0KLSAgICAgICAgICAgIC8vIEhvdyBtYW55IHN1Y2Nlc3NpdmUgcmVwZWF0cyB3ZSBnZW5lcmF0ZWQKLSAgICAgICAgICAgIGludCBrZXlSZXBlYXRDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gcmVwb3J0IHRoYXQgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZD8KLSAgICAgICAgICAgIGJvb2xlYW4gY29uZmlnQ2hhbmdlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGxvbmcgY3VyVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoCi0gICAgICAgICAgICAgICAgICAgIFRBRywgIldhaXRpbmcgZm9yIG5leHQga2V5OiBub3c9IiArIGN1clRpbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCByZXBlYXQgQCAiICsgbmV4dEtleVRpbWUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmV0cmlldmUgbmV4dCBldmVudCwgd2FpdGluZyBvbmx5IGFzIGxvbmcgYXMgdGhlIG5leHQKLSAgICAgICAgICAgICAgICAvLyByZXBlYXQgdGltZW91dC4gIElmIHRoZSBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkLCB0aGVuCi0gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd2FpdCBhdCBhbGwgLS0gd2UnbGwgcmVwb3J0IHRoZSBjaGFuZ2UgYXMgc29vbiBhcwotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgcHJvY2Vzc2VkIGFsbCBldmVudHMuCi0gICAgICAgICAgICAgICAgUXVldWVkRXZlbnQgZXYgPSBtUXVldWUuZ2V0RXZlbnQoCi0gICAgICAgICAgICAgICAgICAgIChpbnQpKCghY29uZmlnQ2hhbmdlZCAmJiBjdXJUaW1lIDwgbmV4dEtleVRpbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAobmV4dEtleVRpbWUtY3VyVGltZSkgOiAwKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfSU5QVVQgJiYgZXYgIT0gbnVsbCkgU2xvZy52KAotICAgICAgICAgICAgICAgICAgICAgICAgVEFHLCAiRXZlbnQ6IHR5cGU9IiArIGV2LmNsYXNzVHlwZSArICIgZGF0YT0iICsgZXYuZXZlbnQpOwotCi0gICAgICAgICAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgewotICAgICAgICAgICAgICAgICAgICBsdC5zYW1wbGUoIjIgZ290IGV2ZW50ICAgICAgICAgICAgICAiLCBTeXN0ZW0ubmFub1RpbWUoKSAtIGV2LndoZW5OYW5vKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobGFzdEtleSAhPSBudWxsICYmICFtUG9saWN5LmFsbG93S2V5UmVwZWF0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsIGtleSByZXBlYXQgYXQgdGhlIHJlcXVlc3Qgb2YgdGhlIHBvbGljeS4KLSAgICAgICAgICAgICAgICAgICAgbGFzdEtleSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGRvd25UaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEtleVRpbWUgPSBjdXJUaW1lOwotICAgICAgICAgICAgICAgICAgICBuZXh0S2V5VGltZSA9IGN1clRpbWUgKyBMT05HX1dBSVQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChldiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnRUeXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2LmNsYXNzVHlwZSA9PSBSYXdJbnB1dEV2ZW50LkNMQVNTX1RPVUNIU0NSRUVOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlKChNb3Rpb25FdmVudClldi5ldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2LmNsYXNzVHlwZSA9PSBSYXdJbnB1dEV2ZW50LkNMQVNTX0tFWUJPQVJEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5jbGFzc1R5cGUgPT0gUmF3SW5wdXRFdmVudC5DTEFTU19UUkFDS0JBTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBMb2NhbFBvd2VyTWFuYWdlci5CVVRUT05fRVZFTlQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IExvY2FsUG93ZXJNYW5hZ2VyLk9USEVSX0VWRU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGN1clRpbWUgLSBtTGFzdEJhdHRlcnlTdGF0c0NhbGxUaW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj0gTUlOX1RJTUVfQkVUV0VFTl9VU0VSQUNUSVZJVElFUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEJhdHRlcnlTdGF0c0NhbGxUaW1lID0gY3VyVGltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlSW5wdXRFdmVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldi5jbGFzc1R5cGUgPT0gUmF3SW5wdXRFdmVudC5DTEFTU19DT05GSUdVUkFUSU9OX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3Qgd2FrZSBzY3JlZW4gaW4gdGhpcyBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAhPSBUT1VDSF9FVkVOVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBldmVudFR5cGUgIT0gTE9OR19UT1VDSF9FVkVOVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBldmVudFR5cGUgIT0gQ0hFRUtfRVZFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnVzZXJBY3Rpdml0eShjdXJUaW1lLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTGFzdFRvdWNoRXZlbnRUeXBlICE9IGV2ZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY3VyVGltZSAtIG1MYXN0VXNlckFjdGl2aXR5Q2FsbFRpbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE1JTl9USU1FX0JFVFdFRU5fVVNFUkFDVElWSVRJRVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFVzZXJBY3Rpdml0eUNhbGxUaW1lID0gY3VyVGltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoRXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIudXNlckFjdGl2aXR5KGN1clRpbWUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXYuY2xhc3NUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSYXdJbnB1dEV2ZW50LkNMQVNTX0tFWUJPQVJEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudCBrZSA9IChLZXlFdmVudClldi5ldmVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtlLmlzRG93bigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0S2V5VGltZSA9IGN1clRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEtleSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlLmdldEtleUNvZGUoKSA9PSBsYXN0S2V5LmdldEtleUNvZGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVJlcGVhdENvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXJiaXRyYXJ5IGxvbmcgdGltZW91dCB0byBibG9jawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGVhdGluZyBoZXJlIHNpbmNlIHdlIGtub3cgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZXZpY2UgZHJpdmVyIHRha2VzIGNhcmUgb2YgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEtleVRpbWUgPSBsYXN0S2V5VGltZSArIExPTkdfV0FJVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfSU5QVVQpIFNsb2cudigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBRywgIlJlY2VpdmVkIHJlcGVhdGVkIGtleSBkb3duIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25UaW1lID0gY3VyVGltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlSZXBlYXRDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEtleVRpbWUgPSBsYXN0S2V5VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBWaWV3Q29uZmlndXJhdGlvbi5nZXRMb25nUHJlc3NUaW1lb3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBRywgIlJlY2VpdmVkIGtleSBkb3duOiBmaXJzdCByZXBlYXQgQCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV4dEtleVRpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEtleSA9IGtlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEtleSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duVGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlSZXBlYXRDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcmJpdHJhcnkgbG9uZyB0aW1lb3V0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEtleVRpbWUgPSBjdXJUaW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEtleVRpbWUgPSBjdXJUaW1lICsgTE9OR19XQUlUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHLCAiUmVjZWl2ZWQga2V5IHVwOiBpZ25vcmUgcmVwZWF0IEAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV4dEtleVRpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlSZXBlYXRDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoS2V5KEtleUV2ZW50LmNoYW5nZVRpbWVSZXBlYXQoa2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlLmdldEV2ZW50VGltZSgpLCBrZXlSZXBlYXRDb3VudCksIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkoa2UsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZS5yZWN5Y2xlRXZlbnQoZXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJhd0lucHV0RXZlbnQuQ0xBU1NfVE9VQ0hTQ1JFRU46Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2xvZy5pKFRBRywgIlJlYWQgbmV4dCBldmVudCAiICsgZXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaFBvaW50ZXIoZXYsIChNb3Rpb25FdmVudClldi5ldmVudCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUmF3SW5wdXRFdmVudC5DTEFTU19UUkFDS0JBTEw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoVHJhY2tiYWxsKGV2LCAoTW90aW9uRXZlbnQpZXYuZXZlbnQsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJhd0lucHV0RXZlbnQuQ0xBU1NfQ09ORklHVVJBVElPTl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlLnJlY3ljbGVFdmVudChldik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWdDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kTmV3Q29uZmlndXJhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdEtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXQgb2NjdXJyZWQgd2hpbGUga2V5IHdhcyBkb3duLiAgSWYgaXQgaXMgYXQgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3QgdGhlIGtleSByZXBlYXQgdGltZSwgZGlzcGF0Y2ggdGhlIHJlcGVhdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19JTlBVVCkgU2xvZy52KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBRywgIktleSB0aW1lb3V0OiByZXBlYXQ9IiArIG5leHRLZXlUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBub3c9IiArIGN1clRpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRpbWUgPCBuZXh0S2V5VGltZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0S2V5VGltZSA9IG5leHRLZXlUaW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEtleVRpbWUgPSBuZXh0S2V5VGltZSArIEtFWV9SRVBFQVRfREVMQVk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZXlSZXBlYXRDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0lOUFVUKSBTbG9nLnYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHLCAiS2V5IHJlcGVhdDogY291bnQ9IiArIGtleVJlcGVhdENvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBuZXh0IEAgIiArIG5leHRLZXlUaW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50IG5ld0V2ZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvd25UaW1lICE9IDAgJiYgKGRvd25UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBjdXJUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQgPSBLZXlFdmVudC5jaGFuZ2VUaW1lUmVwZWF0KGxhc3RLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJUaW1lLCBrZXlSZXBlYXRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RLZXkuZ2V0RmxhZ3MoKSB8IEtleUV2ZW50LkZMQUdfTE9OR19QUkVTUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blRpbWUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudCA9IEtleUV2ZW50LmNoYW5nZVRpbWVSZXBlYXQobGFzdEtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clRpbWUsIGtleVJlcGVhdENvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoS2V5KG5ld0V2ZW50LCAwLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VyVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0S2V5VGltZSA9IGN1clRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0S2V5VGltZSA9IGN1clRpbWUgKyBMT05HX1dBSVQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSW5wdXQgdGhyZWFkIHJlY2VpdmVkIHVuY2F1Z2h0IGV4Y2VwdGlvbjogIiArIGUsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBDbGllbnQgU2Vzc2lvbiBTdGF0ZQogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTcyMzIsMjAgKzU1MDUsNiBAQAogICAgICAgICBpbnQgbU51bVdpbmRvdyA9IDA7CiAgICAgICAgIGJvb2xlYW4gbUNsaWVudERlYWQgPSBmYWxzZTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3VycmVudCBwb2ludGVyIG1vdmUgZXZlbnQgYmVpbmcgZGlzcGF0Y2hlZCB0byBjbGllbnQgd2luZG93Li4uICBtdXN0Ci0gICAgICAgICAqIGhvbGQga2V5IGxvY2sgdG8gYWNjZXNzLgotICAgICAgICAgKi8KLSAgICAgICAgUXVldWVkRXZlbnQgbVBlbmRpbmdQb2ludGVyTW92ZTsKLSAgICAgICAgV2luZG93U3RhdGUgbVBlbmRpbmdQb2ludGVyV2luZG93OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDdXJyZW50IHRyYWNrYmFsbCBtb3ZlIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQgdG8gY2xpZW50IHdpbmRvdy4uLiAgbXVzdAotICAgICAgICAgKiBob2xkIGtleSBsb2NrIHRvIGFjY2Vzcy4KLSAgICAgICAgICovCi0gICAgICAgIFF1ZXVlZEV2ZW50IG1QZW5kaW5nVHJhY2tiYWxsTW92ZTsKLSAgICAgICAgV2luZG93U3RhdGUgbVBlbmRpbmdUcmFja2JhbGxXaW5kb3c7Ci0KICAgICAgICAgcHVibGljIFNlc3Npb24oSUlucHV0TWV0aG9kQ2xpZW50IGNsaWVudCwgSUlucHV0Q29udGV4dCBpbnB1dENvbnRleHQpIHsKICAgICAgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7CiAgICAgICAgICAgICBtSW5wdXRDb250ZXh0ID0gaW5wdXRDb250ZXh0OwpAQCAtNzM2NCwzNiArNTYyMyw2IEBACiAgICAgICAgICAgICBmaW5pc2hEcmF3aW5nV2luZG93KHRoaXMsIHdpbmRvdyk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2hLZXkoSVdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIFNsb2cudigKLSAgICAgICAgICAgICAgICBUQUcsICJJV2luZG93IGZpbmlzaEtleSBjYWxsZWQgZm9yICIgKyB3aW5kb3cpOwotICAgICAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTaG91bGQgbm90IGJlIGNhbGxlZCBhbnltb3JlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUtleVdhaXRlci5maW5pc2hlZEtleSh0aGlzLCB3aW5kb3csIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBLZXlXYWl0ZXIuUkVUVVJOX05PVEhJTkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1vdGlvbkV2ZW50IGdldFBlbmRpbmdQb2ludGVyTW92ZShJV2luZG93IHdpbmRvdykgewotICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgU2xvZy52KAotICAgICAgICAgICAgICAgICAgICBUQUcsICJJV2luZG93IGdldFBlbmRpbmdNb3Rpb25FdmVudCBjYWxsZWQgZm9yICIgKyB3aW5kb3cpOwotICAgICAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTaG91bGQgbm90IGJlIGNhbGxlZCBhbnltb3JlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1LZXlXYWl0ZXIuZmluaXNoZWRLZXkodGhpcywgd2luZG93LCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgS2V5V2FpdGVyLlJFVFVSTl9QRU5ESU5HX1BPSU5URVIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1vdGlvbkV2ZW50IGdldFBlbmRpbmdUcmFja2JhbGxNb3ZlKElXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgICAgICBpZiAobG9jYWxMT0dWKSBTbG9nLnYoCi0gICAgICAgICAgICAgICAgICAgIFRBRywgIklXaW5kb3cgZ2V0UGVuZGluZ01vdGlvbkV2ZW50IGNhbGxlZCBmb3IgIiArIHdpbmRvdyk7Ci0gICAgICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNob3VsZCBub3QgYmUgY2FsbGVkIGFueW1vcmUuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUtleVdhaXRlci5maW5pc2hlZEtleSh0aGlzLCB3aW5kb3csIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBLZXlXYWl0ZXIuUkVUVVJOX1BFTkRJTkdfVFJBQ0tCQUxMKTsKLSAgICAgICAgfQotCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEluVG91Y2hNb2RlKGJvb2xlYW4gbW9kZSkgewogICAgICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKICAgICAgICAgICAgICAgICBtSW5Ub3VjaE1vZGUgPSBtb2RlOwpAQCAtNzQ5NywxNiArNTcyNiw2IEBACiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibU51bVdpbmRvdz0iKTsgcHcucHJpbnQobU51bVdpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgbUNsaWVudERlYWQ9Iik7IHB3LnByaW50KG1DbGllbnREZWFkKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBtU3VyZmFjZVNlc3Npb249Iik7IHB3LnByaW50bG4obVN1cmZhY2VTZXNzaW9uKTsKLSAgICAgICAgICAgIGlmIChtUGVuZGluZ1BvaW50ZXJXaW5kb3cgIT0gbnVsbCB8fCBtUGVuZGluZ1BvaW50ZXJNb3ZlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIm1QZW5kaW5nUG9pbnRlcldpbmRvdz0iKTsgcHcucHJpbnQobVBlbmRpbmdQb2ludGVyV2luZG93KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgbVBlbmRpbmdQb2ludGVyTW92ZT0iKTsgcHcucHJpbnRsbihtUGVuZGluZ1BvaW50ZXJNb3ZlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUGVuZGluZ1RyYWNrYmFsbFdpbmRvdyAhPSBudWxsIHx8IG1QZW5kaW5nVHJhY2tiYWxsTW92ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCJtUGVuZGluZ1RyYWNrYmFsbFdpbmRvdz0iKTsgcHcucHJpbnQobVBlbmRpbmdUcmFja2JhbGxXaW5kb3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBtUGVuZGluZ1RyYWNrYmFsbE1vdmU9Iik7IHB3LnByaW50bG4obVBlbmRpbmdUcmFja2JhbGxNb3ZlKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtNzU1Nyw4ICs1Nzc2LDYgQEAKICAgICAgICAgYm9vbGVhbiBtT2JzY3VyZWQ7CiAgICAgICAgIGJvb2xlYW4gbVR1cm5PblNjcmVlbjsKIAotICAgICAgICBXaW5kb3dTdGF0ZSBtTmV4dE91dHNpZGVUb3VjaDsKLQogICAgICAgICBpbnQgbUxheW91dFNlcSA9IC0xOwogICAgICAgICAKICAgICAgICAgQ29uZmlndXJhdGlvbiBtQ29uZmlndXJhdGlvbiA9IG51bGw7CkBAIC04MDc1LDE2ICs2MjkyLDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIHZvaWQgZGVzdHJveVN1cmZhY2VMb2NrZWQoKSB7Ci0gICAgICAgICAgICAvLyBXaW5kb3cgaXMgbm8gbG9uZ2VyIG9uLXNjcmVlbiwgc28gY2FuIG5vIGxvbmdlciByZWNlaXZlCi0gICAgICAgICAgICAvLyBrZXkgZXZlbnRzLi4uICBpZiB3ZSB3ZXJlIHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaAotICAgICAgICAgICAgLy8gaGFuZGxpbmcgYSBrZXkgZXZlbnQsIHRoZSB3YWl0IGlzIG92ZXIhCi0gICAgICAgICAgICBpZiAoISBFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgbUtleVdhaXRlci5maW5pc2hlZEtleShtU2Vzc2lvbiwgbUNsaWVudCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleVdhaXRlci5SRVRVUk5fTk9USElORyk7Ci0gICAgICAgICAgICAgICAgbUtleVdhaXRlci5yZWxlYXNlUGVuZGluZ1BvaW50ZXJMb2NrZWQobVNlc3Npb24pOwotICAgICAgICAgICAgICAgIG1LZXlXYWl0ZXIucmVsZWFzZVBlbmRpbmdUcmFja2JhbGxMb2NrZWQobVNlc3Npb24pOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBpZiAobUFwcFRva2VuICE9IG51bGwgJiYgdGhpcyA9PSBtQXBwVG9rZW4uc3RhcnRpbmdXaW5kb3cpIHsKICAgICAgICAgICAgICAgICBtQXBwVG9rZW4uc3RhcnRpbmdEaXNwbGF5ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KQEAgLTgxMDAsOSArNjMwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIGMgPSAoV2luZG93U3RhdGUpbUNoaWxkV2luZG93cy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgICAgIGMubUF0dGFjaGVkSGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb25pdG9yLndpbmRvd0lzQmVjb21pbmdJbnZpc2libGVMdyhjKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb25pdG9yLndpbmRvd0lzQmVjb21pbmdJbnZpc2libGVMdyhjKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobVJlcG9ydERlc3Ryb3lTdXJmYWNlKSB7CkBAIC04NDExLDEyICs2NjE2LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RIaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3Iud2luZG93SXNCZWNvbWluZ0ludmlzaWJsZUx3KChXaW5kb3dTdGF0ZSltQ2hpbGRXaW5kb3dzLmdldChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLnJlbGVhc2VQZW5kaW5nUG9pbnRlckxvY2tlZChtU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb25pdG9yLndpbmRvd0lzQmVjb21pbmdJbnZpc2libGVMdygoV2luZG93U3RhdGUpbUNoaWxkV2luZG93cy5nZXQoaSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1FeGl0aW5nID0gZmFsc2U7CkBAIC04NzUxLDEzICs2OTUyLDExIEBACiAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGRvaW5nIHRoaXMgYXMgcGFydCBvZiBwcm9jZXNzaW5nIGEgZGVhdGggbm90ZS4pCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dENoYW5uZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnVucmVnaXN0ZXJJbnB1dENoYW5uZWwobUlucHV0Q2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0Q2hhbm5lbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1JbnB1dENoYW5uZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIudW5yZWdpc3RlcklucHV0Q2hhbm5lbChtSW5wdXRDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC05NTE3LDYgKzc3MTYsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfU0NSRUVOID0gMTY7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9GUkVFWkVfVElNRU9VVCA9IDE3OwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5EX05FV19DT05GSUdVUkFUSU9OID0gMTg7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJTkRPV1NfQ0hBTkdFRCA9IDE5OwogCiAgICAgICAgIHByaXZhdGUgU2Vzc2lvbiBtTGFzdFJlcG9ydGVkSG9sZDsKIApAQCAtOTg0OCw2ICs4MDQ4LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGNhc2UgV0lORE9XU19DSEFOR0VEOiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtV2luZG93c0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdpbmRvd01hcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5V2luZG93c0NoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTk5MzIsNiArODE0Miw3IEBACiAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB3ID0gKFdpbmRvd1N0YXRlKW1XaW5kb3dzLmdldChpKTsKICAgICAgICAgICAgIGlmICh3Lm1BcHBUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgd2luID0gKFdpbmRvd1N0YXRlKW1XaW5kb3dzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGlmIChERUJVR19XSU5ET1dfTU9WRU1FTlQpIFNsb2cudihUQUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAiUmVidWlsZCByZW1vdmluZyB3aW5kb3c6ICIgKyB3aW4pOwogICAgICAgICAgICAgICAgIE5XLS07CkBAIC0xMDA2Nyw2ICs4Mjc4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25Mb2NrZWQoMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1XaW5kb3dzQ2hhbmdlZCAmJiAhbVdpbmRvd0NoYW5nZUxpc3RlbmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtSC5yZW1vdmVNZXNzYWdlcyhILldJTkRPV1NfQ0hBTkdFRCk7CisgICAgICAgICAgICAgICAgbUguc2VuZE1lc3NhZ2UobUgub2J0YWluTWVzc2FnZShILldJTkRPV1NfQ0hBTkdFRCkpOworICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG1JbkxheW91dCA9IGZhbHNlOwogICAgICAgICAgICAgU2xvZy5lKFRBRywgIlVuaGFuZGxlZCBleGNlcHRpb24gd2hpbGUgbGF5b3V0IG91dCB3aW5kb3dzIiwgZSk7CkBAIC0xMDE3MywxNSArODM4OCwxOCBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAvLyBXaW5kb3cgZnJhbWVzIG1heSBoYXZlIGNoYW5nZWQuICBUZWxsIHRoZSBpbnB1dCBkaXNwYXRjaGVyIGFib3V0IGl0LgotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgbUlucHV0TW9uaXRvci51cGRhdGVJbnB1dFdpbmRvd3NMdygpOwotICAgICAgICB9CisgICAgICAgIG1JbnB1dE1vbml0b3IudXBkYXRlSW5wdXRXaW5kb3dzTHcoKTsKIAogICAgICAgICByZXR1cm4gbVBvbGljeS5maW5pc2hMYXlvdXRMdygpOwogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgdm9pZCBwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZElubmVyKAogICAgICAgICAgICAgYm9vbGVhbiByZWNvdmVyaW5nTWVtb3J5KSB7CisgICAgICAgIGlmIChtRGlzcGxheSA9PSBudWxsKSB7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAic2tpcHBpbmcgcGVyZm9ybUxheW91dEFuZFBsYWNlU3VyZmFjZXNMb2NrZWRJbm5lciB3aXRoIG5vIG1EaXNwbGF5Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgIGZpbmFsIGludCBkdyA9IG1EaXNwbGF5LmdldFdpZHRoKCk7CiAgICAgICAgIGZpbmFsIGludCBkaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwpAQCAtMTA5NzAsMTEgKzkxODgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkV4Y2VwdGlvbiBoaWRpbmcgc3VyZmFjZSBpbiAiICsgdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVOQUJMRV9OQVRJVkVfSU5QVVRfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0TW9uaXRvci53aW5kb3dJc0JlY29taW5nSW52aXNpYmxlTHcodyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUtleVdhaXRlci5yZWxlYXNlUGVuZGluZ1BvaW50ZXJMb2NrZWQody5tU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3Iud2luZG93SXNCZWNvbWluZ0ludmlzaWJsZUx3KHcpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHdhaXRpbmcgZm9yIHRoaXMgd2luZG93IHRvIGhhbmRsZSBhbgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZW50YXRpb24gY2hhbmdlLCB3ZWxsLCBpdCBpcyBoaWRkZW4sIHNvCkBAIC0xMTU3MSwxMyArOTc4NSw3IEBACiAgICAgfQogICAgIAogICAgIHByaXZhdGUgdm9pZCBmaW5pc2hVcGRhdGVGb2N1c2VkV2luZG93QWZ0ZXJBc3NpZ25MYXllcnNMb2NrZWQoKSB7Ci0gICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICBtSW5wdXRNb25pdG9yLnNldElucHV0Rm9jdXNMdyhtQ3VycmVudEZvY3VzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudEZvY3VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLmhhbmRsZU5ld1dpbmRvd0xvY2tlZChtQ3VycmVudEZvY3VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtSW5wdXRNb25pdG9yLnNldElucHV0Rm9jdXNMdyhtQ3VycmVudEZvY3VzKTsKICAgICB9CiAKICAgICBwcml2YXRlIFdpbmRvd1N0YXRlIGNvbXB1dGVGb2N1c2VkV2luZG93TG9ja2VkKCkgewpAQCAtMTE2NTEsMTcgKzk4NTksNiBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0RnJlZXppbmdEaXNwbGF5TG9ja2VkKCkgewogICAgICAgICBpZiAobURpc3BsYXlGcm96ZW4pIHsKLSAgICAgICAgICAgIC8vIEZyZWV6aW5nIHRoZSBkaXNwbGF5IGFsc28gc3VzcGVuZHMga2V5IGV2ZW50IGRlbGl2ZXJ5LCB0bwotICAgICAgICAgICAgLy8ga2VlcCBldmVudHMgZnJvbSBnb2luZyBhc3RyYXkgd2hpbGUgdGhlIGRpc3BsYXkgaXMgcmVjb25maWd1cmVkLgotICAgICAgICAgICAgLy8gSWYgc29tZW9uZSBoYXMgY2hhbmdlZCBvcmllbnRhdGlvbiBhZ2FpbiB3aGlsZSB0aGUgc2NyZWVuIGlzCi0gICAgICAgICAgICAvLyBzdGlsbCBmcm96ZW4sIHRoZSBldmVudHMgd2lsbCBjb250aW51ZSB0byBiZSBibG9ja2VkIHdoaWxlIHRoZQotICAgICAgICAgICAgLy8gc3VjY2Vzc2l2ZSBvcmllbnRhdGlvbiBjaGFuZ2UgaXMgcHJvY2Vzc2VkLiAgVG8gcHJldmVudCBzcHVyaW91cwotICAgICAgICAgICAgLy8gQU5Scywgd2UgcmVzZXQgdGhlIGV2ZW50IGRpc3BhdGNoIHRpbWVvdXQgaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgaWYgKCEgRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUtleVdhaXRlcikgewotICAgICAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLm1XYXNGcm96ZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0xMTY4Miw5ICs5ODc5LDcgQEAKIAogICAgICAgICBtRGlzcGxheUZyb3plbiA9IHRydWU7CiAgICAgICAgIAotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgbUlucHV0TW9uaXRvci5mcmVlemVJbnB1dERpc3BhdGNoaW5nTHcoKTsKLSAgICAgICAgfQorICAgICAgICBtSW5wdXRNb25pdG9yLmZyZWV6ZUlucHV0RGlzcGF0Y2hpbmdMdygpOwogICAgICAgICAKICAgICAgICAgaWYgKG1OZXh0QXBwVHJhbnNpdGlvbiAhPSBXaW5kb3dNYW5hZ2VyUG9saWN5LlRSQU5TSVRfVU5TRVQpIHsKICAgICAgICAgICAgIG1OZXh0QXBwVHJhbnNpdGlvbiA9IFdpbmRvd01hbmFnZXJQb2xpY3kuVFJBTlNJVF9VTlNFVDsKQEAgLTExNzE1LDE2ICs5OTEwLDcgQEAKICAgICAgICAgfQogICAgICAgICBTdXJmYWNlLnVuZnJlZXplRGlzcGxheSgwKTsKIAotICAgICAgICAvLyBSZXNldCB0aGUga2V5IGRlbGl2ZXJ5IHRpbWVvdXQgb24gdW5mcmVlemUsIHRvby4gIFdlIGZvcmNlIGEgd2FrZXVwIGhlcmUKLSAgICAgICAgLy8gdG9vIGJlY2F1c2UgcmVndWxhciBrZXkgZGVsaXZlcnkgcHJvY2Vzc2luZyBzaG91bGQgcmVzdW1lIGltbWVkaWF0ZWx5LgotICAgICAgICBpZiAoRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgbUlucHV0TW9uaXRvci50aGF3SW5wdXREaXNwYXRjaGluZ0x3KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1LZXlXYWl0ZXIpIHsKLSAgICAgICAgICAgICAgICBtS2V5V2FpdGVyLm1XYXNGcm96ZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIG1LZXlXYWl0ZXIubm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbUlucHV0TW9uaXRvci50aGF3SW5wdXREaXNwYXRjaGluZ0x3KCk7CiAKICAgICAgICAgLy8gV2hpbGUgdGhlIGRpc3BsYXkgaXMgZnJvemVuIHdlIGRvbid0IHJlLWNvbXB1dGUgdGhlIG9yaWVudGF0aW9uCiAgICAgICAgIC8vIHRvIGF2b2lkIGluY29uc2lzdGVudCBzdGF0ZXMuICBIb3dldmVyLCBzb21ldGhpbmcgaW50ZXJlc3RpbmcKQEAgLTExNzU2LDEzICs5OTQyLDggQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChFTkFCTEVfTkFUSVZFX0lOUFVUX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJJbnB1dCBEaXNwYXRjaGVyIFN0YXRlOiIpOwotICAgICAgICAgICAgbUlucHV0TWFuYWdlci5kdW1wKHB3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIklucHV0IFN0YXRlOiIpOwotICAgICAgICAgICAgbVF1ZXVlLmR1bXAocHcsICIgICIpOwotICAgICAgICB9CisgICAgICAgIHB3LnByaW50bG4oIklucHV0IERpc3BhdGNoZXIgU3RhdGU6Iik7CisgICAgICAgIG1JbnB1dE1hbmFnZXIuZHVtcChwdyk7CiAgICAgICAgIHB3LnByaW50bG4oIiAiKTsKICAgICAgICAgCiAgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7CkBAIC0xMTk3OSwxNiArMTAxNjAsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHcucHJpbnQoIiAgRGlzcGxheVdpZHRoPSIpOyBwdy5wcmludChtRGlzcGxheS5nZXRXaWR0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBEaXNwbGF5SGVpZ2h0PSIpOyBwdy5wcmludGxuKG1EaXNwbGF5LmdldEhlaWdodCgpKTsKLQotICAgICAgICAgICAgaWYgKCEgRU5BQkxFX05BVElWRV9JTlBVVF9ESVNQQVRDSCkgewotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgS2V5V2FpdGVyIHN0YXRlOiIpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgbUxhc3RXaW49Iik7IHB3LnByaW50KG1LZXlXYWl0ZXIubUxhc3RXaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBtTGFzdEJpbmRlcj0iKTsgcHcucHJpbnRsbihtS2V5V2FpdGVyLm1MYXN0QmluZGVyKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludCgiICAgIG1GaW5pc2hlZD0iKTsgcHcucHJpbnQobUtleVdhaXRlci5tRmluaXNoZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBtR290Rmlyc3RXaW5kb3c9Iik7IHB3LnByaW50KG1LZXlXYWl0ZXIubUdvdEZpcnN0V2luZG93KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgbUV2ZW50RGlzcGF0Y2hpbmc9Iik7IHB3LnByaW50KG1LZXlXYWl0ZXIubUV2ZW50RGlzcGF0Y2hpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBtVGltZVRvU3dpdGNoPSIpOyBwdy5wcmludGxuKG1LZXlXYWl0ZXIubVRpbWVUb1N3aXRjaCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExOTk2LDEyICsxMDE2Nyw2IEBACiAgICAgcHVibGljIHZvaWQgbW9uaXRvcigpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7IH0KICAgICAgICAgc3luY2hyb25pemVkIChtS2V5Z3VhcmRUb2tlbldhdGNoZXIpIHsgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1LZXlXYWl0ZXIpIHsgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dE1vbml0b3IpIHsgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpcnR1YWxLZXlGZWVkYmFjayhLZXlFdmVudCBldmVudCkgewotICAgICAgICBtUG9saWN5LmtleUZlZWRiYWNrRnJvbUlucHV0KGV2ZW50KTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0Njg2MWVlLi41OGFhYjA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xMjU5LDYgKzEyNTksNyBAQAogCiAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3Muc2V0VGhyZWFkUHJpb3JpdHkoCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfRk9SRUdST1VORCk7CisgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3Muc2V0Q2FuU2VsZkJhY2tncm91bmQoZmFsc2UpOwogCiAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIG0gPSBuZXcgQWN0aXZpdHlNYW5hZ2VyU2VydmljZSgpOwogCkBAIC0xMTU2MSw3ICsxMTU2Miw2OSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHVibGljIGJvb2xlYW4gZHVtcEhlYXAoU3RyaW5nIHByb2Nlc3MsIGJvb2xlYW4gbWFuYWdlZCwKKyAgICAgICAgICAgIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIC8vIG5vdGU6IGhpamFja2luZyBTRVRfQUNUSVZJVFlfV0FUQ0hFUiwgYnV0IHNob3VsZCBiZSBjaGFuZ2VkIHRvCisgICAgICAgICAgICAgICAgLy8gaXRzIG93biBwZXJtaXNzaW9uIChzYW1lIGFzIHByb2ZpbGVDb250cm9sKS4KKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0VUX0FDVElWSVRZX1dBVENIRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBwZXJtaXNzaW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TRVRfQUNUSVZJVFlfV0FUQ0hFUik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCBmZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFByb2Nlc3NSZWNvcmQgcHJvYyA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBpZCA9IEludGVnZXIucGFyc2VJbnQocHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBpZHNTZWxmTG9ja2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jID0gbVBpZHNTZWxmTG9ja2VkLmdldChwaWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHJvYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTcGFyc2VBcnJheTxQcm9jZXNzUmVjb3JkPj4gYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBtUHJvY2Vzc05hbWVzLmdldE1hcCgpOworICAgICAgICAgICAgICAgICAgICBTcGFyc2VBcnJheTxQcm9jZXNzUmVjb3JkPiBwcm9jcyA9IGFsbC5nZXQocHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jcyAhPSBudWxsICYmIHByb2NzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2MgPSBwcm9jcy52YWx1ZUF0KDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHByb2MgPT0gbnVsbCB8fCBwcm9jLnRocmVhZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gcHJvY2VzczogIiArIHByb2Nlc3MpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTZWN1cmUgPSAiMSIuZXF1YWxzKFN5c3RlbVByb3BlcnRpZXMuZ2V0KFNZU1RFTV9TRUNVUkUsICIwIikpOworICAgICAgICAgICAgICAgIGlmIChpc1NlY3VyZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2MuaW5mby5mbGFncyZBcHBsaWNhdGlvbkluZm8uRkxBR19ERUJVR0dBQkxFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlByb2Nlc3Mgbm90IGRlYnVnZ2FibGU6ICIgKyBwcm9jKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb2MudGhyZWFkLmR1bXBIZWFwKG1hbmFnZWQsIHBhdGgsIGZkKTsKKyAgICAgICAgICAgICAgICBmZCA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9jZXNzIGRpc2FwcGVhcmVkIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZkLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKiBJbiB0aGlzIG1ldGhvZCB3ZSB0cnkgdG8gYWNxdWlyZSBvdXIgbG9jayB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIG5vdCBkZWFkbG9ja2VkICovCiAgICAgcHVibGljIHZvaWQgbW9uaXRvcigpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7IH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9BbmRyb2lkLm1rIGIvc2VydmljZXMvam5pL0FuZHJvaWQubWsKaW5kZXggNDk5Y2E4Ni4uMGNmMzZiMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvam5pL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvam5pL0FuZHJvaWQubWsKQEAgLTQsOSArNCw5IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX0FsYXJtTWFuYWdlclNlcnZpY2UuY3BwIFwKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfQmF0dGVyeVNlcnZpY2UuY3BwIFwKLSAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfS2V5SW5wdXRRdWV1ZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIuY3BwIFwKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZS5jcHAgXAorICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1NlbnNvclNlcnZpY2UuY3BwIFwKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfU3lzdGVtU2VydmVyLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1ZpYnJhdG9yU2VydmljZS5jcHAgXApkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIuY3BwCmluZGV4IGQwZjg1NmIuLjI2ZTEwNWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlci5jcHAKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlICIuLi8uLi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfS2V5RXZlbnQuaCIKICNpbmNsdWRlICIuLi8uLi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnQuaCIKICNpbmNsdWRlICIuLi8uLi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfSW5wdXRDaGFubmVsLmgiCisjaW5jbHVkZSAiY29tX2FuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMDcsMTYgKzEwOCw2IEBACiAgICAgTEFTVF9TWVNURU1fV0lORE9XICAgICAgPSAyOTk5LAogfTsKIAotZW51bSB7Ci0gICAgUE9XRVJfTUFOQUdFUl9PVEhFUl9FVkVOVCA9IDAsCi0gICAgUE9XRVJfTUFOQUdFUl9DSEVFS19FVkVOVCA9IDEsCi0gICAgUE9XRVJfTUFOQUdFUl9UT1VDSF9FVkVOVCA9IDIsIC8vIHRvdWNoIGV2ZW50cyBhcmUgVE9VQ0ggZm9yIDMwMG1zLCBhbmQgdGhlbiBlaXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgZXZlbnRzIG9yIExPTkdfVE9VQ0ggZXZlbnRzLgotICAgIFBPV0VSX01BTkFHRVJfTE9OR19UT1VDSF9FVkVOVCA9IDMsCi0gICAgUE9XRVJfTUFOQUdFUl9UT1VDSF9VUF9FVkVOVCA9IDQsCi0gICAgUE9XRVJfTUFOQUdFUl9CVVRUT05fRVZFTlQgPSA1LCAvLyBCdXR0b24gYW5kIHRyYWNrYmFsbCBldmVudHMuCi19OwotCiAvLyBEZWxheSBiZXR3ZWVuIHJlcG9ydGluZyBsb25nIHRvdWNoIGV2ZW50cyB0byB0aGUgcG93ZXIgbWFuYWdlci4KIGNvbnN0IG5zZWNzX3QgRVZFTlRfSUdOT1JFX0RVUkFUSU9OID0gMzAwICogMTAwMDAwMExMOyAvLyAzMDAgbXMKIApAQCAtMTMzLDIwICsxMjQsMTYgQEAKIHN0YXRpYyBzdHJ1Y3QgewogICAgIGpjbGFzcyBjbGF6ejsKIAotICAgIGptZXRob2RJRCBpc1NjcmVlbk9uOwotICAgIGptZXRob2RJRCBpc1NjcmVlbkJyaWdodDsKICAgICBqbWV0aG9kSUQgbm90aWZ5Q29uZmlndXJhdGlvbkNoYW5nZWQ7CiAgICAgam1ldGhvZElEIG5vdGlmeUxpZFN3aXRjaENoYW5nZWQ7CiAgICAgam1ldGhvZElEIG5vdGlmeUlucHV0Q2hhbm5lbEJyb2tlbjsKICAgICBqbWV0aG9kSUQgbm90aWZ5SW5wdXRDaGFubmVsQU5SOwogICAgIGptZXRob2RJRCBub3RpZnlJbnB1dENoYW5uZWxSZWNvdmVyZWRGcm9tQU5SOwogICAgIGptZXRob2RJRCBub3RpZnlBTlI7Ci0gICAgam1ldGhvZElEIHZpcnR1YWxLZXlGZWVkYmFjazsKKyAgICBqbWV0aG9kSUQgdmlydHVhbEtleURvd25GZWVkYmFjazsKICAgICBqbWV0aG9kSUQgaW50ZXJjZXB0S2V5QmVmb3JlUXVldWVpbmc7CiAgICAgam1ldGhvZElEIGludGVyY2VwdEtleUJlZm9yZURpc3BhdGNoaW5nOwogICAgIGptZXRob2RJRCBjaGVja0luamVjdEV2ZW50c1Blcm1pc3Npb247Ci0gICAgam1ldGhvZElEIGdvVG9TbGVlcDsKLSAgICBqbWV0aG9kSUQgcG9rZVVzZXJBY3Rpdml0eTsKICAgICBqbWV0aG9kSUQgbm90aWZ5QXBwU3dpdGNoQ29taW5nOwogICAgIGptZXRob2RJRCBmaWx0ZXJUb3VjaEV2ZW50czsKICAgICBqbWV0aG9kSUQgZmlsdGVySnVtcHlUb3VjaEV2ZW50czsKQEAgLTIyOCw5ICsyMTUsNyBAQAogCiAgICAgdmlydHVhbCBib29sIGdldERpc3BsYXlJbmZvKGludDMyX3QgZGlzcGxheUlkLAogICAgICAgICAgICAgaW50MzJfdCogd2lkdGgsIGludDMyX3QqIGhlaWdodCwgaW50MzJfdCogb3JpZW50YXRpb24pOwotICAgIHZpcnR1YWwgdm9pZCB2aXJ0dWFsS2V5RmVlZGJhY2sobnNlY3NfdCB3aGVuLCBpbnQzMl90IGRldmljZUlkLAotICAgICAgICAgICAgaW50MzJfdCBhY3Rpb24sIGludDMyX3QgZmxhZ3MsIGludDMyX3Qga2V5Q29kZSwKLSAgICAgICAgICAgIGludDMyX3Qgc2NhbkNvZGUsIGludDMyX3QgbWV0YVN0YXRlLCBuc2Vjc190IGRvd25UaW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgdmlydHVhbEtleURvd25GZWVkYmFjaygpOwogICAgIHZpcnR1YWwgaW50MzJfdCBpbnRlcmNlcHRLZXkobnNlY3NfdCB3aGVuLCBpbnQzMl90IGRldmljZUlkLAogICAgICAgICAgICAgYm9vbCBkb3duLCBpbnQzMl90IGtleUNvZGUsIGludDMyX3Qgc2NhbkNvZGUsIHVpbnQzMl90IHBvbGljeUZsYWdzKTsKICAgICB2aXJ0dWFsIGludDMyX3QgaW50ZXJjZXB0VHJhY2tiYWxsKG5zZWNzX3Qgd2hlbiwgYm9vbCBidXR0b25DaGFuZ2VkLCBib29sIGJ1dHRvbkRvd24sCkBAIC0zMjEsNyArMzA2LDcgQEAKICAgICBpbnQzMl90IG1EaXNwbGF5V2lkdGgsIG1EaXNwbGF5SGVpZ2h0OwogICAgIGludDMyX3QgbURpc3BsYXlPcmllbnRhdGlvbjsKIAotICAgIC8vIENhbGxiYWNrcy4KKyAgICAvLyBQb3dlciBtYW5hZ2VyIGludGVyYWN0aW9ucy4KICAgICBib29sIGlzU2NyZWVuT24oKTsKICAgICBib29sIGlzU2NyZWVuQnJpZ2h0KCk7CiAKQEAgLTM2OSw5ICszNTQsOSBAQAogCiAgICAgdm9pZCByZWxlYXNlVG91Y2hlZFdpbmRvd0xkKCk7CiAKLSAgICBpbnQzMl90IGlkZW50aWZ5VHJhY2tiYWxsRXZlbnRUYXJnZXRzKE1vdGlvbkV2ZW50KiBtb3Rpb25FdmVudCwgdWludDMyX3QgcG9saWN5RmxhZ3MsCisgICAgaW50MzJfdCB3YWl0Rm9yVHJhY2tiYWxsRXZlbnRUYXJnZXRzKE1vdGlvbkV2ZW50KiBtb3Rpb25FdmVudCwgdWludDMyX3QgcG9saWN5RmxhZ3MsCiAgICAgICAgICAgICBpbnQzMl90IGluamVjdG9yUGlkLCBpbnQzMl90IGluamVjdG9yVWlkLCBWZWN0b3I8SW5wdXRUYXJnZXQ+JiBvdXRUYXJnZXRzKTsKLSAgICBpbnQzMl90IGlkZW50aWZ5VG91Y2hFdmVudFRhcmdldHMoTW90aW9uRXZlbnQqIG1vdGlvbkV2ZW50LCB1aW50MzJfdCBwb2xpY3lGbGFncywKKyAgICBpbnQzMl90IHdhaXRGb3JUb3VjaEV2ZW50VGFyZ2V0cyhNb3Rpb25FdmVudCogbW90aW9uRXZlbnQsIHVpbnQzMl90IHBvbGljeUZsYWdzLAogICAgICAgICAgICAgaW50MzJfdCBpbmplY3RvclBpZCwgaW50MzJfdCBpbmplY3RvclVpZCwgVmVjdG9yPElucHV0VGFyZ2V0PiYgb3V0VGFyZ2V0cyk7CiAKICAgICBib29sIGludGVyY2VwdEtleUJlZm9yZURpc3BhdGNoaW5nKGNvbnN0IElucHV0VGFyZ2V0JiB0YXJnZXQsCkBAIC0zOTEsNiArMzc2LDcgQEAKICAgICB9CiAKICAgICBzdGF0aWMgYm9vbCBpc0FwcFN3aXRjaEtleShpbnQzMl90IGtleUNvZGUpOworICAgIHN0YXRpYyBib29sIGlzUG9saWN5S2V5KGludDMyX3Qga2V5Q29kZSwgYm9vbCBpc1NjcmVlbk9uKTsKICAgICBzdGF0aWMgYm9vbCBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBtZXRob2ROYW1lKTsKIH07CiAKQEAgLTQxOSw3ICs0MDUsMzcgQEAKIH0KIAogYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmlzQXBwU3dpdGNoS2V5KGludDMyX3Qga2V5Q29kZSkgewotICAgIHJldHVybiBrZXlDb2RlID09IEtFWUNPREVfSE9NRSB8fCBrZXlDb2RlID09IEtFWUNPREVfRU5EQ0FMTDsKKyAgICByZXR1cm4ga2V5Q29kZSA9PSBBS0VZQ09ERV9IT01FIHx8IGtleUNvZGUgPT0gQUtFWUNPREVfRU5EQ0FMTDsKK30KKworYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmlzUG9saWN5S2V5KGludDMyX3Qga2V5Q29kZSwgYm9vbCBpc1NjcmVlbk9uKSB7CisgICAgLy8gU3BlY2lhbCBrZXlzIHRoYXQgdGhlIFdpbmRvd01hbmFnZXJQb2xpY3kgbWlnaHQgY2FyZSBhYm91dC4KKyAgICBzd2l0Y2ggKGtleUNvZGUpIHsKKyAgICBjYXNlIEFLRVlDT0RFX1ZPTFVNRV9VUDoKKyAgICBjYXNlIEFLRVlDT0RFX1ZPTFVNRV9ET1dOOgorICAgIGNhc2UgQUtFWUNPREVfRU5EQ0FMTDoKKyAgICBjYXNlIEFLRVlDT0RFX1BPV0VSOgorICAgIGNhc2UgQUtFWUNPREVfQ0FMTDoKKyAgICBjYXNlIEFLRVlDT0RFX0hPTUU6CisgICAgY2FzZSBBS0VZQ09ERV9NRU5VOgorICAgIGNhc2UgQUtFWUNPREVfU0VBUkNIOgorICAgICAgICAvLyBtZWRpYSBrZXlzCisgICAgY2FzZSBBS0VZQ09ERV9IRUFEU0VUSE9PSzoKKyAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BMQVlfUEFVU0U6CisgICAgY2FzZSBBS0VZQ09ERV9NRURJQV9TVE9QOgorICAgIGNhc2UgQUtFWUNPREVfTUVESUFfTkVYVDoKKyAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BSRVZJT1VTOgorICAgIGNhc2UgQUtFWUNPREVfTUVESUFfUkVXSU5EOgorICAgIGNhc2UgQUtFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBXZSBuZWVkIHRvIHBhc3MgYWxsIGtleXMgdG8gdGhlIHBvbGljeSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorICAgICAgICAvLyAtIHNjcmVlbiBpcyBvZmYKKyAgICAgICAgLy8gLSBrZXlndWFyZCBpcyB2aXNpYmxlCisgICAgICAgIC8vIC0gcG9saWN5IGlzIHBlcmZvcm1pbmcga2V5IGNob3JkaW5nCisgICAgICAgIC8vcmV0dXJuICEgaXNTY3JlZW5PbiB8fCBrZXlndWFyZFZpc2libGUgfHwgY2hvcmRpbmc7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBYWFggc3R1YmJlZCBvdXQgZm9yIG5vdworICAgIH0KIH0KIAogYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1ldGhvZE5hbWUpIHsKQEAgLTU0NiwzOSArNTYyLDIyIEBACiB9CiAKIGJvb2wgTmF0aXZlSW5wdXRNYW5hZ2VyOjppc1NjcmVlbk9uKCkgewotICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7Ci0KLSAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1DYWxsYmFja3NPYmosIGdDYWxsYmFja3NDbGFzc0luZm8uaXNTY3JlZW5Pbik7Ci0gICAgaWYgKGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiaXNTY3JlZW5PbiIpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBhbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlX2lzU2NyZWVuT24oKTsKIH0KIAogYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmlzU2NyZWVuQnJpZ2h0KCkgewotICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7Ci0KLSAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1DYWxsYmFja3NPYmosIGdDYWxsYmFja3NDbGFzc0luZm8uaXNTY3JlZW5CcmlnaHQpOwotICAgIGlmIChjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImlzU2NyZWVuQnJpZ2h0IikpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIGFuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2VfaXNTY3JlZW5CcmlnaHQoKTsKIH0KIAotdm9pZCBOYXRpdmVJbnB1dE1hbmFnZXI6OnZpcnR1YWxLZXlGZWVkYmFjayhuc2Vjc190IHdoZW4sIGludDMyX3QgZGV2aWNlSWQsCi0gICAgICAgIGludDMyX3QgYWN0aW9uLCBpbnQzMl90IGZsYWdzLCBpbnQzMl90IGtleUNvZGUsCi0gICAgICAgIGludDMyX3Qgc2NhbkNvZGUsIGludDMyX3QgbWV0YVN0YXRlLCBuc2Vjc190IGRvd25UaW1lKSB7Cit2b2lkIE5hdGl2ZUlucHV0TWFuYWdlcjo6dmlydHVhbEtleURvd25GZWVkYmFjaygpIHsKICNpZiBERUJVR19JTlBVVF9SRUFERVJfUE9MSUNZCi0gICAgTE9HRCgidmlydHVhbEtleUZlZWRiYWNrIC0gd2hlbj0lbGxkLCBkZXZpY2VJZD0lZCwgYWN0aW9uPSVkLCBmbGFncz0lZCwga2V5Q29kZT0lZCwgIgotICAgICAgICAgICAgInNjYW5Db2RlPSVkLCBtZXRhU3RhdGU9JWQsIGRvd25UaW1lPSVsbGQiLAotICAgICAgICAgICAgd2hlbiwgZGV2aWNlSWQsIGFjdGlvbiwgZmxhZ3MsIGtleUNvZGUsIHNjYW5Db2RlLCBtZXRhU3RhdGUsIGRvd25UaW1lKTsKKyAgICBMT0dEKCJ2aXJ0dWFsS2V5RG93bkZlZWRiYWNrIik7CiAjZW5kaWYKIAogICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7CiAKLSAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIGdDYWxsYmFja3NDbGFzc0luZm8udmlydHVhbEtleUZlZWRiYWNrLAotICAgICAgICAgICAgd2hlbiwgZGV2aWNlSWQsIGFjdGlvbiwgZmxhZ3MsIGtleUNvZGUsIHNjYW5Db2RlLCBtZXRhU3RhdGUsIGRvd25UaW1lKTsKLSAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgInZpcnR1YWxLZXlGZWVkYmFjayIpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUNhbGxiYWNrc09iaiwgZ0NhbGxiYWNrc0NsYXNzSW5mby52aXJ0dWFsS2V5RG93bkZlZWRiYWNrKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgInZpcnR1YWxLZXlEb3duRmVlZGJhY2siKTsKIH0KIAogaW50MzJfdCBOYXRpdmVJbnB1dE1hbmFnZXI6OmludGVyY2VwdEtleShuc2Vjc190IHdoZW4sCkBAIC01OTMsMTYgKzU5MiwyMSBAQAogICAgIGNvbnN0IGludDMyX3QgV01fQUNUSU9OX1BPS0VfVVNFUl9BQ1RJVklUWSA9IDI7CiAgICAgY29uc3QgaW50MzJfdCBXTV9BQ1RJT05fR09fVE9fU0xFRVAgPSA0OwogCi0gICAgSk5JRW52KiBlbnYgPSBqbmlFbnYoKTsKLQogICAgIGJvb2wgaXNTY3JlZW5PbiA9IHRoaXMtPmlzU2NyZWVuT24oKTsKICAgICBib29sIGlzU2NyZWVuQnJpZ2h0ID0gdGhpcy0+aXNTY3JlZW5CcmlnaHQoKTsKIAotICAgIGppbnQgd21BY3Rpb25zID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCi0gICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmludGVyY2VwdEtleUJlZm9yZVF1ZXVlaW5nLAotICAgICAgICAgICAgZGV2aWNlSWQsIEVWX0tFWSwgc2NhbkNvZGUsIGtleUNvZGUsIHBvbGljeUZsYWdzLCBkb3duID8gMSA6IDAsIHdoZW4sIGlzU2NyZWVuT24pOwotICAgIGlmIChjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImludGVyY2VwdEtleUJlZm9yZVF1ZXVlaW5nIikpIHsKLSAgICAgICAgd21BY3Rpb25zID0gMDsKKyAgICBqaW50IHdtQWN0aW9ucyA9IDA7CisgICAgaWYgKGlzUG9saWN5S2V5KGtleUNvZGUsIGlzU2NyZWVuT24pKSB7CisgICAgICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7CisKKyAgICAgICAgd21BY3Rpb25zID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCisgICAgICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5pbnRlcmNlcHRLZXlCZWZvcmVRdWV1ZWluZywKKyAgICAgICAgICAgICAgICB3aGVuLCBrZXlDb2RlLCBkb3duLCBwb2xpY3lGbGFncywgaXNTY3JlZW5Pbik7CisgICAgICAgIGlmIChjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImludGVyY2VwdEtleUJlZm9yZVF1ZXVlaW5nIikpIHsKKyAgICAgICAgICAgIHdtQWN0aW9ucyA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3bUFjdGlvbnMgPSBXTV9BQ1RJT05fUEFTU19UT19VU0VSOwogICAgIH0KIAogICAgIGludDMyX3QgYWN0aW9ucyA9IElucHV0UmVhZGVyUG9saWN5SW50ZXJmYWNlOjpBQ1RJT05fTk9ORTsKQEAgLTYxNyw4ICs2MjEsNyBAQAogICAgIH0KIAogICAgIGlmICh3bUFjdGlvbnMgJiBXTV9BQ1RJT05fR09fVE9fU0xFRVApIHsKLSAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQ2FsbGJhY2tzT2JqLCBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdvVG9TbGVlcCwgd2hlbik7Ci0gICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZ29Ub1NsZWVwIik7CisgICAgICAgIGFuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2VfZ29Ub1NsZWVwKHdoZW4pOwogICAgIH0KIAogICAgIGlmICh3bUFjdGlvbnMgJiBXTV9BQ1RJT05fUE9LRV9VU0VSX0FDVElWSVRZKSB7CkBAIC02MjksNiArNjMyLDggQEAKICAgICAgICAgYWN0aW9ucyB8PSBJbnB1dFJlYWRlclBvbGljeUludGVyZmFjZTo6QUNUSU9OX0RJU1BBVENIOwogCiAgICAgICAgIGlmIChkb3duICYmIGlzQXBwU3dpdGNoS2V5KGtleUNvZGUpKSB7CisgICAgICAgICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOworCiAgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIGdDYWxsYmFja3NDbGFzc0luZm8ubm90aWZ5QXBwU3dpdGNoQ29taW5nKTsKICAgICAgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAibm90aWZ5QXBwU3dpdGNoQ29taW5nIik7CiAKQEAgLTE1MzEsMTEgKzE1MzYsMTMgQEAKICAgICAgICAgd2luZG93VHlwZSA9IGZvY3VzZWRXaW5kb3ctPmxheW91dFBhcmFtc1R5cGU7CiAgICAgfSAvLyByZWxlYXNlIGxvY2sKIAotICAgIGNvbnN0IElucHV0VGFyZ2V0JiB0YXJnZXQgPSBvdXRUYXJnZXRzLnRvcCgpOwotICAgIGJvb2wgY29uc3VtZWQgPSBpbnRlcmNlcHRLZXlCZWZvcmVEaXNwYXRjaGluZyh0YXJnZXQsIGtleUV2ZW50LCBwb2xpY3lGbGFncyk7Ci0gICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgIG91dFRhcmdldHMuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIElOUFVUX0VWRU5UX0lOSkVDVElPTl9TVUNDRUVERUQ7CisgICAgaWYgKGlzUG9saWN5S2V5KGtleUV2ZW50LT5nZXRLZXlDb2RlKCksIGlzU2NyZWVuT24oKSkpIHsKKyAgICAgICAgY29uc3QgSW5wdXRUYXJnZXQmIHRhcmdldCA9IG91dFRhcmdldHMudG9wKCk7CisgICAgICAgIGJvb2wgY29uc3VtZWQgPSBpbnRlcmNlcHRLZXlCZWZvcmVEaXNwYXRjaGluZyh0YXJnZXQsIGtleUV2ZW50LCBwb2xpY3lGbGFncyk7CisgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgb3V0VGFyZ2V0cy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIElOUFVUX0VWRU5UX0lOSkVDVElPTl9TVUNDRUVERUQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwb2tlVXNlckFjdGl2aXR5SWZOZWVkZWQod2luZG93VHlwZSwgUE9XRVJfTUFOQUdFUl9CVVRUT05fRVZFTlQpOwpAQCAtMTU1MiwxMSArMTU1OSwxMSBAQAogCiAgICAgc3dpdGNoIChtb3Rpb25FdmVudC0+Z2V0TmF0dXJlKCkpIHsKICAgICBjYXNlIElOUFVUX0VWRU5UX05BVFVSRV9UUkFDS0JBTEw6Ci0gICAgICAgIHJldHVybiBpZGVudGlmeVRyYWNrYmFsbEV2ZW50VGFyZ2V0cyhtb3Rpb25FdmVudCwgcG9saWN5RmxhZ3MsIGluamVjdG9yUGlkLCBpbmplY3RvclVpZCwKKyAgICAgICAgcmV0dXJuIHdhaXRGb3JUcmFja2JhbGxFdmVudFRhcmdldHMobW90aW9uRXZlbnQsIHBvbGljeUZsYWdzLCBpbmplY3RvclBpZCwgaW5qZWN0b3JVaWQsCiAgICAgICAgICAgICAgICAgb3V0VGFyZ2V0cyk7CiAKICAgICBjYXNlIElOUFVUX0VWRU5UX05BVFVSRV9UT1VDSDoKLSAgICAgICAgcmV0dXJuIGlkZW50aWZ5VG91Y2hFdmVudFRhcmdldHMobW90aW9uRXZlbnQsIHBvbGljeUZsYWdzLCBpbmplY3RvclBpZCwgaW5qZWN0b3JVaWQsCisgICAgICAgIHJldHVybiB3YWl0Rm9yVG91Y2hFdmVudFRhcmdldHMobW90aW9uRXZlbnQsIHBvbGljeUZsYWdzLCBpbmplY3RvclBpZCwgaW5qZWN0b3JVaWQsCiAgICAgICAgICAgICAgICAgb3V0VGFyZ2V0cyk7CiAKICAgICBkZWZhdWx0OgpAQCAtMTU2NSwxMSArMTU3MiwxMSBAQAogICAgIH0KIH0KIAotaW50MzJfdCBOYXRpdmVJbnB1dE1hbmFnZXI6OmlkZW50aWZ5VHJhY2tiYWxsRXZlbnRUYXJnZXRzKE1vdGlvbkV2ZW50KiBtb3Rpb25FdmVudCwKK2ludDMyX3QgTmF0aXZlSW5wdXRNYW5hZ2VyOjp3YWl0Rm9yVHJhY2tiYWxsRXZlbnRUYXJnZXRzKE1vdGlvbkV2ZW50KiBtb3Rpb25FdmVudCwKICAgICAgICAgdWludDMyX3QgcG9saWN5RmxhZ3MsIGludDMyX3QgaW5qZWN0b3JQaWQsIGludDMyX3QgaW5qZWN0b3JVaWQsCiAgICAgICAgIFZlY3RvcjxJbnB1dFRhcmdldD4mIG91dFRhcmdldHMpIHsKICNpZiBERUJVR19JTlBVVF9ESVNQQVRDSEVSX1BPTElDWQotICAgIExPR0QoImlkZW50aWZ5VHJhY2tiYWxsRXZlbnRUYXJnZXRzIC0gcG9saWN5RmxhZ3M9JWQsIGluamVjdG9yUGlkPSVkLCBpbmplY3RvclVpZD0lZCIsCisgICAgTE9HRCgid2FpdEZvclRyYWNrYmFsbEV2ZW50VGFyZ2V0cyAtIHBvbGljeUZsYWdzPSVkLCBpbmplY3RvclBpZD0lZCwgaW5qZWN0b3JVaWQ9JWQiLAogICAgICAgICAgICAgcG9saWN5RmxhZ3MsIGluamVjdG9yUGlkLCBpbmplY3RvclVpZCk7CiAjZW5kaWYKIApAQCAtMTU5MSwxMSArMTU5OCwxMSBAQAogICAgIHJldHVybiBJTlBVVF9FVkVOVF9JTkpFQ1RJT05fU1VDQ0VFREVEOwogfQogCi1pbnQzMl90IE5hdGl2ZUlucHV0TWFuYWdlcjo6aWRlbnRpZnlUb3VjaEV2ZW50VGFyZ2V0cyhNb3Rpb25FdmVudCogbW90aW9uRXZlbnQsCitpbnQzMl90IE5hdGl2ZUlucHV0TWFuYWdlcjo6d2FpdEZvclRvdWNoRXZlbnRUYXJnZXRzKE1vdGlvbkV2ZW50KiBtb3Rpb25FdmVudCwKICAgICAgICAgdWludDMyX3QgcG9saWN5RmxhZ3MsIGludDMyX3QgaW5qZWN0b3JQaWQsIGludDMyX3QgaW5qZWN0b3JVaWQsCiAgICAgICAgIFZlY3RvcjxJbnB1dFRhcmdldD4mIG91dFRhcmdldHMpIHsKICNpZiBERUJVR19JTlBVVF9ESVNQQVRDSEVSX1BPTElDWQotICAgIExPR0QoImlkZW50aWZ5VG91Y2hFdmVudFRhcmdldHMgLSBwb2xpY3lGbGFncz0lZCwgaW5qZWN0b3JQaWQ9JWQsIGluamVjdG9yVWlkPSVkIiwKKyAgICBMT0dEKCJ3YWl0Rm9yVG91Y2hFdmVudFRhcmdldHMgLSBwb2xpY3lGbGFncz0lZCwgaW5qZWN0b3JQaWQ9JWQsIGluamVjdG9yVWlkPSVkIiwKICAgICAgICAgICAgIHBvbGljeUZsYWdzLCBpbmplY3RvclBpZCwgaW5qZWN0b3JVaWQpOwogI2VuZGlmCiAKQEAgLTE2NDIsOCArMTY0OSw4IEBACiAgICAgaWYgKGlucHV0Q2hhbm5lbE9iaikgewogICAgICAgICBqYm9vbGVhbiBjb25zdW1lZCA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUNhbGxiYWNrc09iaiwKICAgICAgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmludGVyY2VwdEtleUJlZm9yZURpc3BhdGNoaW5nLAotICAgICAgICAgICAgICAgIGlucHV0Q2hhbm5lbE9iaiwga2V5RXZlbnQtPmdldEtleUNvZGUoKSwga2V5RXZlbnQtPmdldE1ldGFTdGF0ZSgpLAotICAgICAgICAgICAgICAgIGtleUV2ZW50LT5nZXRBY3Rpb24oKSA9PSBLRVlfRVZFTlRfQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgaW5wdXRDaGFubmVsT2JqLCBrZXlFdmVudC0+Z2V0QWN0aW9uKCksIGtleUV2ZW50LT5nZXRGbGFncygpLAorICAgICAgICAgICAgICAgIGtleUV2ZW50LT5nZXRLZXlDb2RlKCksIGtleUV2ZW50LT5nZXRNZXRhU3RhdGUoKSwKICAgICAgICAgICAgICAgICBrZXlFdmVudC0+Z2V0UmVwZWF0Q291bnQoKSwgcG9saWN5RmxhZ3MpOwogICAgICAgICBib29sIGVycm9yID0gY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJpbnRlcmNlcHRLZXlCZWZvcmVEaXNwYXRjaGluZyIpOwogCkBAIC0xNjY1LDEwICsxNjcyLDcgQEAKIH0KIAogdm9pZCBOYXRpdmVJbnB1dE1hbmFnZXI6OnBva2VVc2VyQWN0aXZpdHkobnNlY3NfdCBldmVudFRpbWUsIGludDMyX3QgZXZlbnRUeXBlKSB7Ci0gICAgSk5JRW52KiBlbnYgPSBqbmlFbnYoKTsKLSAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1DYWxsYmFja3NPYmosIGdDYWxsYmFja3NDbGFzc0luZm8ucG9rZVVzZXJBY3Rpdml0eSwKLSAgICAgICAgICAgIGV2ZW50VGltZSwgZXZlbnRUeXBlKTsKLSAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgInBva2VVc2VyQWN0aXZpdHkiKTsKKyAgICBhbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlX3VzZXJBY3Rpdml0eShldmVudFRpbWUsIGV2ZW50VHlwZSk7CiB9CiAKIHZvaWQgTmF0aXZlSW5wdXRNYW5hZ2VyOjpkdW1wRGlzcGF0Y2hTdGF0ZUxkKCkgewpAQCAtMjA4MiwxMiArMjA4Niw2IEBACiAKICAgICBGSU5EX0NMQVNTKGdDYWxsYmFja3NDbGFzc0luZm8uY2xhenosICJjb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNYW5hZ2VyJENhbGxiYWNrcyIpOwogCi0gICAgR0VUX01FVEhPRF9JRChnQ2FsbGJhY2tzQ2xhc3NJbmZvLmlzU2NyZWVuT24sIGdDYWxsYmFja3NDbGFzc0luZm8uY2xhenosCi0gICAgICAgICAgICAiaXNTY3JlZW5PbiIsICIoKVoiKTsKLQotICAgIEdFVF9NRVRIT0RfSUQoZ0NhbGxiYWNrc0NsYXNzSW5mby5pc1NjcmVlbkJyaWdodCwgZ0NhbGxiYWNrc0NsYXNzSW5mby5jbGF6eiwKLSAgICAgICAgICAgICJpc1NjcmVlbkJyaWdodCIsICIoKVoiKTsKLQogICAgIEdFVF9NRVRIT0RfSUQoZ0NhbGxiYWNrc0NsYXNzSW5mby5ub3RpZnlDb25maWd1cmF0aW9uQ2hhbmdlZCwgZ0NhbGxiYWNrc0NsYXNzSW5mby5jbGF6eiwKICAgICAgICAgICAgICJub3RpZnlDb25maWd1cmF0aW9uQ2hhbmdlZCIsICIoSklJSSlWIik7CiAKQEAgLTIxMDYsMjQgKzIxMDQsMTggQEAKICAgICBHRVRfTUVUSE9EX0lEKGdDYWxsYmFja3NDbGFzc0luZm8ubm90aWZ5QU5SLCBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmNsYXp6LAogICAgICAgICAgICAgIm5vdGlmeUFOUiIsICIoTGphdmEvbGFuZy9PYmplY3Q7KUoiKTsKIAotICAgIEdFVF9NRVRIT0RfSUQoZ0NhbGxiYWNrc0NsYXNzSW5mby52aXJ0dWFsS2V5RmVlZGJhY2ssIGdDYWxsYmFja3NDbGFzc0luZm8uY2xhenosCi0gICAgICAgICAgICAidmlydHVhbEtleUZlZWRiYWNrIiwgIihKSUlJSUlJSilWIik7CisgICAgR0VUX01FVEhPRF9JRChnQ2FsbGJhY2tzQ2xhc3NJbmZvLnZpcnR1YWxLZXlEb3duRmVlZGJhY2ssIGdDYWxsYmFja3NDbGFzc0luZm8uY2xhenosCisgICAgICAgICAgICAidmlydHVhbEtleURvd25GZWVkYmFjayIsICIoKVYiKTsKIAogICAgIEdFVF9NRVRIT0RfSUQoZ0NhbGxiYWNrc0NsYXNzSW5mby5pbnRlcmNlcHRLZXlCZWZvcmVRdWV1ZWluZywgZ0NhbGxiYWNrc0NsYXNzSW5mby5jbGF6eiwKLSAgICAgICAgICAgICJpbnRlcmNlcHRLZXlCZWZvcmVRdWV1ZWluZyIsICIoSUlJSUlJSlopSSIpOworICAgICAgICAgICAgImludGVyY2VwdEtleUJlZm9yZVF1ZXVlaW5nIiwgIihKSVpJWilJIik7CiAKICAgICBHRVRfTUVUSE9EX0lEKGdDYWxsYmFja3NDbGFzc0luZm8uaW50ZXJjZXB0S2V5QmVmb3JlRGlzcGF0Y2hpbmcsIGdDYWxsYmFja3NDbGFzc0luZm8uY2xhenosCi0gICAgICAgICAgICAiaW50ZXJjZXB0S2V5QmVmb3JlRGlzcGF0Y2hpbmciLCAiKExhbmRyb2lkL3ZpZXcvSW5wdXRDaGFubmVsO0lJWklJKVoiKTsKKyAgICAgICAgICAgICJpbnRlcmNlcHRLZXlCZWZvcmVEaXNwYXRjaGluZyIsICIoTGFuZHJvaWQvdmlldy9JbnB1dENoYW5uZWw7SUlJSUlJKVoiKTsKIAogICAgIEdFVF9NRVRIT0RfSUQoZ0NhbGxiYWNrc0NsYXNzSW5mby5jaGVja0luamVjdEV2ZW50c1Blcm1pc3Npb24sIGdDYWxsYmFja3NDbGFzc0luZm8uY2xhenosCiAgICAgICAgICAgICAiY2hlY2tJbmplY3RFdmVudHNQZXJtaXNzaW9uIiwgIihJSSlaIik7CiAKLSAgICBHRVRfTUVUSE9EX0lEKGdDYWxsYmFja3NDbGFzc0luZm8uZ29Ub1NsZWVwLCBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmNsYXp6LAotICAgICAgICAgICAgImdvVG9TbGVlcCIsICIoSilWIik7Ci0KLSAgICBHRVRfTUVUSE9EX0lEKGdDYWxsYmFja3NDbGFzc0luZm8ucG9rZVVzZXJBY3Rpdml0eSwgZ0NhbGxiYWNrc0NsYXNzSW5mby5jbGF6eiwKLSAgICAgICAgICAgICJwb2tlVXNlckFjdGl2aXR5IiwgIihKSSlWIik7Ci0KICAgICBHRVRfTUVUSE9EX0lEKGdDYWxsYmFja3NDbGFzc0luZm8ubm90aWZ5QXBwU3dpdGNoQ29taW5nLCBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmNsYXp6LAogICAgICAgICAgICAgIm5vdGlmeUFwcFN3aXRjaENvbWluZyIsICIoKVYiKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfS2V5SW5wdXRRdWV1ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZTM1ODUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJJbnB1dCIKLQotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDx1aS9FdmVudEh1Yi5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgc3RydWN0IGlucHV0X29mZnNldHNfdAotewotICAgIGpmaWVsZElEIG1NaW5WYWx1ZTsKLSAgICBqZmllbGRJRCBtTWF4VmFsdWU7Ci0gICAgamZpZWxkSUQgbUZsYXQ7Ci0gICAgamZpZWxkSUQgbUZ1eno7Ci0gICAgCi0gICAgamZpZWxkSUQgbURldmljZUlkOwotICAgIGpmaWVsZElEIG1UeXBlOwotICAgIGpmaWVsZElEIG1TY2FuY29kZTsKLSAgICBqZmllbGRJRCBtS2V5Y29kZTsKLSAgICBqZmllbGRJRCBtRmxhZ3M7Ci0gICAgamZpZWxkSUQgbVZhbHVlOwotICAgIGpmaWVsZElEIG1XaGVuOwotfSBnSW5wdXRPZmZzZXRzOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBNdXRleCBnTG9jazsKLXN0YXRpYyBzcDxFdmVudEh1Yj4gZ0h1YjsKLQotc3RhdGljIGpib29sZWFuCi1hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX3JlYWRFdmVudChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgZXZlbnQpCi17Ci0gICAgZ0xvY2subG9jaygpOwotICAgIHNwPEV2ZW50SHViPiBodWIgPSBnSHViOwotICAgIGlmIChodWIgPT0gTlVMTCkgewotICAgICAgICBodWIgPSBuZXcgRXZlbnRIdWI7Ci0gICAgICAgIGdIdWIgPSBodWI7Ci0gICAgfQotICAgIGdMb2NrLnVubG9jaygpOwotCi0gICAgaW50MzJfdCBkZXZpY2VJZDsKLSAgICBpbnQzMl90IHR5cGU7Ci0gICAgaW50MzJfdCBzY2FuY29kZSwga2V5Y29kZTsKLSAgICB1aW50MzJfdCBmbGFnczsKLSAgICBpbnQzMl90IHZhbHVlOwotICAgIG5zZWNzX3Qgd2hlbjsKLSAgICBib29sIHJlcyA9IGh1Yi0+Z2V0RXZlbnQoJmRldmljZUlkLCAmdHlwZSwgJnNjYW5jb2RlLCAma2V5Y29kZSwKLSAgICAgICAgICAgICZmbGFncywgJnZhbHVlLCAmd2hlbik7Ci0KLSAgICBlbnYtPlNldEludEZpZWxkKGV2ZW50LCBnSW5wdXRPZmZzZXRzLm1EZXZpY2VJZCwgKGppbnQpZGV2aWNlSWQpOwotICAgIGVudi0+U2V0SW50RmllbGQoZXZlbnQsIGdJbnB1dE9mZnNldHMubVR5cGUsIChqaW50KXR5cGUpOwotICAgIGVudi0+U2V0SW50RmllbGQoZXZlbnQsIGdJbnB1dE9mZnNldHMubVNjYW5jb2RlLCAoamludClzY2FuY29kZSk7Ci0gICAgZW52LT5TZXRJbnRGaWVsZChldmVudCwgZ0lucHV0T2Zmc2V0cy5tS2V5Y29kZSwgKGppbnQpa2V5Y29kZSk7Ci0gICAgZW52LT5TZXRJbnRGaWVsZChldmVudCwgZ0lucHV0T2Zmc2V0cy5tRmxhZ3MsIChqaW50KWZsYWdzKTsKLSAgICBlbnYtPlNldEludEZpZWxkKGV2ZW50LCBnSW5wdXRPZmZzZXRzLm1WYWx1ZSwgdmFsdWUpOwotICAgIGVudi0+U2V0TG9uZ0ZpZWxkKGV2ZW50LCBnSW5wdXRPZmZzZXRzLm1XaGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgKGpsb25nKShuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMod2hlbikpKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBqaW50Ci1hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX2dldERldmljZUNsYXNzZXMoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBkZXZpY2VJZCkKLXsKLSAgICBqaW50IGNsYXNzZXMgPSAwOwotICAgIGdMb2NrLmxvY2soKTsKLSAgICBpZiAoZ0h1YiAhPSBOVUxMKSBjbGFzc2VzID0gZ0h1Yi0+Z2V0RGV2aWNlQ2xhc3NlcyhkZXZpY2VJZCk7Ci0gICAgZ0xvY2sudW5sb2NrKCk7Ci0gICAgcmV0dXJuIGNsYXNzZXM7Ci19Ci0KLXN0YXRpYyBqc3RyaW5nCi1hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX2dldERldmljZU5hbWUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBkZXZpY2VJZCkKLXsKLSAgICBTdHJpbmc4IG5hbWU7Ci0gICAgZ0xvY2subG9jaygpOwotICAgIGlmIChnSHViICE9IE5VTEwpIG5hbWUgPSBnSHViLT5nZXREZXZpY2VOYW1lKGRldmljZUlkKTsKLSAgICBnTG9jay51bmxvY2soKTsKLSAgICAKLSAgICBpZiAobmFtZS5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURihuYW1lLnN0cmluZygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX2FkZEV4Y2x1ZGVkRGV2aWNlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgZGV2aWNlTmFtZSkKLXsKLSAgICBnTG9jay5sb2NrKCk7Ci0gICAgc3A8RXZlbnRIdWI+IGh1YiA9IGdIdWI7Ci0gICAgaWYgKGh1YiA9PSBOVUxMKSB7Ci0gICAgICAgIGh1YiA9IG5ldyBFdmVudEh1YjsKLSAgICAgICAgZ0h1YiA9IGh1YjsKLSAgICB9Ci0gICAgZ0xvY2sudW5sb2NrKCk7Ci0KLSAgICBjb25zdCBjaGFyKiBuYW1lU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhkZXZpY2VOYW1lLCBOVUxMKTsKLSAgICBnSHViLT5hZGRFeGNsdWRlZERldmljZShuYW1lU3RyKTsKLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkZXZpY2VOYW1lLCBuYW1lU3RyKTsKLX0KLQotc3RhdGljIGpib29sZWFuCi1hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX2dldEFic29sdXRlSW5mbyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgZGV2aWNlSWQsIGppbnQgYXhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgaW5mbykKLXsKLSAgICBpbnQzMl90IG1pblZhbHVlLCBtYXhWYWx1ZSwgZmxhdCwgZnV6ejsKLSAgICBpbnQgcmVzID0gLTE7Ci0gICAgZ0xvY2subG9jaygpOwotICAgIGlmIChnSHViICE9IE5VTEwpIHsKLSAgICAgICAgcmVzID0gZ0h1Yi0+Z2V0QWJzb2x1dGVJbmZvKGRldmljZUlkLCBheGlzLAotICAgICAgICAgICAgICAgICZtaW5WYWx1ZSwgJm1heFZhbHVlLCAmZmxhdCwgJmZ1enopOwotICAgIH0KLSAgICBnTG9jay51bmxvY2soKTsKLSAgICAKLSAgICBpZiAocmVzIDwgMCkgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICAKLSAgICBlbnYtPlNldEludEZpZWxkKGluZm8sIGdJbnB1dE9mZnNldHMubU1pblZhbHVlLCAoamludCltaW5WYWx1ZSk7Ci0gICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBnSW5wdXRPZmZzZXRzLm1NYXhWYWx1ZSwgKGppbnQpbWF4VmFsdWUpOwotICAgIGVudi0+U2V0SW50RmllbGQoaW5mbywgZ0lucHV0T2Zmc2V0cy5tRmxhdCwgKGppbnQpZmxhdCk7Ci0gICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBnSW5wdXRPZmZzZXRzLm1GdXp6LCAoamludClmdXp6KTsKLSAgICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLXN0YXRpYyBqaW50Ci1hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX2dldFN3aXRjaFN0YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3cpCi17Ci0gICAgamludCBzdCA9IC0xOwotICAgIGdMb2NrLmxvY2soKTsKLSAgICBpZiAoZ0h1YiAhPSBOVUxMKSBzdCA9IGdIdWItPmdldFN3aXRjaFN0YXRlKC0xLCAtMSwgc3cpOwotICAgIGdMb2NrLnVubG9jaygpOwotICAgIAotICAgIHJldHVybiBzdDsKLX0KLQotc3RhdGljIGppbnQKLWFuZHJvaWRfc2VydmVyX0tleUlucHV0UXVldWVfZ2V0U3dpdGNoU3RhdGVEZXZpY2UoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgZGV2aWNlSWQsIGppbnQgc3cpCi17Ci0gICAgamludCBzdCA9IC0xOwotICAgIGdMb2NrLmxvY2soKTsKLSAgICBpZiAoZ0h1YiAhPSBOVUxMKSBzdCA9IGdIdWItPmdldFN3aXRjaFN0YXRlKGRldmljZUlkLCAtMSwgc3cpOwotICAgIGdMb2NrLnVubG9jaygpOwotICAgIAotICAgIHJldHVybiBzdDsKLX0KLQotc3RhdGljIGppbnQKLWFuZHJvaWRfc2VydmVyX0tleUlucHV0UXVldWVfZ2V0U2NhbmNvZGVTdGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN3KQotewotICAgIGppbnQgc3QgPSAtMTsKLSAgICBnTG9jay5sb2NrKCk7Ci0gICAgaWYgKGdIdWIgIT0gTlVMTCkgc3QgPSBnSHViLT5nZXRTY2FuQ29kZVN0YXRlKDAsIC0xLCBzdyk7Ci0gICAgZ0xvY2sudW5sb2NrKCk7Ci0gICAgCi0gICAgcmV0dXJuIHN0OwotfQotCi1zdGF0aWMgamludAotYW5kcm9pZF9zZXJ2ZXJfS2V5SW5wdXRRdWV1ZV9nZXRTY2FuY29kZVN0YXRlRGV2aWNlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGRldmljZUlkLCBqaW50IHN3KQotewotICAgIGppbnQgc3QgPSAtMTsKLSAgICBnTG9jay5sb2NrKCk7Ci0gICAgaWYgKGdIdWIgIT0gTlVMTCkgc3QgPSBnSHViLT5nZXRTY2FuQ29kZVN0YXRlKGRldmljZUlkLCAtMSwgc3cpOwotICAgIGdMb2NrLnVubG9jaygpOwotICAgIAotICAgIHJldHVybiBzdDsKLX0KLQotc3RhdGljIGppbnQKLWFuZHJvaWRfc2VydmVyX0tleUlucHV0UXVldWVfZ2V0S2V5Y29kZVN0YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3cpCi17Ci0gICAgamludCBzdCA9IC0xOwotICAgIGdMb2NrLmxvY2soKTsKLSAgICBpZiAoZ0h1YiAhPSBOVUxMKSBzdCA9IGdIdWItPmdldEtleUNvZGVTdGF0ZSgwLCAtMSwgc3cpOwotICAgIGdMb2NrLnVubG9jaygpOwotICAgIAotICAgIHJldHVybiBzdDsKLX0KLQotc3RhdGljIGppbnQKLWFuZHJvaWRfc2VydmVyX0tleUlucHV0UXVldWVfZ2V0S2V5Y29kZVN0YXRlRGV2aWNlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGRldmljZUlkLCBqaW50IHN3KQotewotICAgIGppbnQgc3QgPSAtMTsKLSAgICBnTG9jay5sb2NrKCk7Ci0gICAgaWYgKGdIdWIgIT0gTlVMTCkgc3QgPSBnSHViLT5nZXRLZXlDb2RlU3RhdGUoZGV2aWNlSWQsLTEsIHN3KTsKLSAgICBnTG9jay51bmxvY2soKTsKLSAgICAKLSAgICByZXR1cm4gc3Q7Ci19Ci0KLXN0YXRpYyBqaW50Ci1hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX3NjYW5jb2RlVG9LZXljb2RlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGRldmljZUlkLCBqaW50IHNjYW5jb2RlKQotewotICAgIGppbnQgcmVzID0gMDsKLSAgICBnTG9jay5sb2NrKCk7Ci0gICAgaWYgKGdIdWIgIT0gTlVMTCkgewotICAgICAgICBpbnQzMl90IGtleWNvZGU7Ci0gICAgICAgIHVpbnQzMl90IGZsYWdzOwotICAgICAgICBnSHViLT5zY2FuY29kZVRvS2V5Y29kZShkZXZpY2VJZCwgc2NhbmNvZGUsICZrZXljb2RlLCAmZmxhZ3MpOwotICAgICAgICByZXMgPSBrZXljb2RlOwotICAgIH0KLSAgICBnTG9jay51bmxvY2soKTsKLSAgICAKLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgamJvb2xlYW4KLWFuZHJvaWRfc2VydmVyX0tleUlucHV0UXVldWVfaGFzS2V5cyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50QXJyYXkga2V5Q29kZXMsIGpib29sZWFuQXJyYXkgb3V0RmxhZ3MpCi17Ci0gICAgamJvb2xlYW4gcmV0ID0gSk5JX0ZBTFNFOwotCi0gICAgaW50MzJfdCogY29kZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoa2V5Q29kZXMsIE5VTEwpOwotICAgIHVpbnQ4X3QqIGZsYWdzID0gZW52LT5HZXRCb29sZWFuQXJyYXlFbGVtZW50cyhvdXRGbGFncywgTlVMTCk7Ci0gICAganNpemUgbnVtQ29kZXMgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGtleUNvZGVzKTsKLSAgICBpZiAobnVtQ29kZXMgPT0gZW52LT5HZXRBcnJheUxlbmd0aChvdXRGbGFncykpIHsKLSAgICAgICAgZ0xvY2subG9jaygpOwotICAgICAgICBpZiAoZ0h1YiAhPSBOVUxMKSByZXQgPSBnSHViLT5oYXNLZXlzKG51bUNvZGVzLCBjb2RlcywgZmxhZ3MpOwotICAgICAgICBnTG9jay51bmxvY2soKTsKLSAgICB9Ci0KLSAgICBlbnYtPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhvdXRGbGFncywgZmxhZ3MsIDApOwotICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoa2V5Q29kZXMsIGNvZGVzLCAwKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiBKTkkgcmVnaXN0cmF0aW9uLgotICovCi1zdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdJbnB1dE1ldGhvZHNbXSA9IHsKLSAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KLSAgICB7ICJyZWFkRXZlbnQiLCAgICAgICAiKExhbmRyb2lkL3ZpZXcvUmF3SW5wdXRFdmVudDspWiIsCi0gICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfc2VydmVyX0tleUlucHV0UXVldWVfcmVhZEV2ZW50IH0sCi0gICAgeyAiZ2V0RGV2aWNlQ2xhc3NlcyIsICIoSSlJIiwKLSAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX2dldERldmljZUNsYXNzZXMgfSwKLSAgICB7ICJnZXREZXZpY2VOYW1lIiwgIihJKUxqYXZhL2xhbmcvU3RyaW5nOyIsCi0gICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfS2V5SW5wdXRRdWV1ZV9nZXREZXZpY2VOYW1lIH0sCi0gICAgeyAiYWRkRXhjbHVkZWREZXZpY2UiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwKLSAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX2FkZEV4Y2x1ZGVkRGV2aWNlIH0sCi0gICAgeyAiZ2V0QWJzb2x1dGVJbmZvIiwgIihJSUxjb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXREZXZpY2UkQWJzb2x1dGVJbmZvOylaIiwKLSAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX2dldEFic29sdXRlSW5mbyB9LAotICAgIHsgImdldFN3aXRjaFN0YXRlIiwgIihJKUkiLAotICAgICAgICAodm9pZCopIGFuZHJvaWRfc2VydmVyX0tleUlucHV0UXVldWVfZ2V0U3dpdGNoU3RhdGUgfSwKLSAgICB7ICJnZXRTd2l0Y2hTdGF0ZSIsICIoSUkpSSIsCi0gICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfS2V5SW5wdXRRdWV1ZV9nZXRTd2l0Y2hTdGF0ZURldmljZSB9LAotICAgIHsgIm5hdGl2ZUdldFNjYW5jb2RlU3RhdGUiLCAiKEkpSSIsCi0gICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfS2V5SW5wdXRRdWV1ZV9nZXRTY2FuY29kZVN0YXRlIH0sCi0gICAgeyAibmF0aXZlR2V0U2NhbmNvZGVTdGF0ZSIsICIoSUkpSSIsCi0gICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfS2V5SW5wdXRRdWV1ZV9nZXRTY2FuY29kZVN0YXRlRGV2aWNlIH0sCi0gICAgeyAibmF0aXZlR2V0S2V5Y29kZVN0YXRlIiwgIihJKUkiLAotICAgICAgICAodm9pZCopIGFuZHJvaWRfc2VydmVyX0tleUlucHV0UXVldWVfZ2V0S2V5Y29kZVN0YXRlIH0sCi0gICAgeyAibmF0aXZlR2V0S2V5Y29kZVN0YXRlIiwgIihJSSlJIiwKLSAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlX2dldEtleWNvZGVTdGF0ZURldmljZSB9LAotICAgIHsgImhhc0tleXMiLCAiKFtJW1opWiIsCi0gICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfS2V5SW5wdXRRdWV1ZV9oYXNLZXlzIH0sCi0gICAgeyAic2NhbmNvZGVUb0tleWNvZGUiLCAiKElJKUkiLAotICAgICAgICAodm9pZCopIGFuZHJvaWRfc2VydmVyX0tleUlucHV0UXVldWVfc2NhbmNvZGVUb0tleWNvZGUgfSwKLX07Ci0KLWludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlKEpOSUVudiogZW52KQotewotICAgIGpjbGFzcyBpbnB1dCA9IGVudi0+RmluZENsYXNzKCJjb20vYW5kcm9pZC9zZXJ2ZXIvS2V5SW5wdXRRdWV1ZSIpOwotICAgIExPR19GQVRBTF9JRihpbnB1dCA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgY29tL2FuZHJvaWQvc2VydmVyL0tleUlucHV0UXVldWUiKTsKLSAgICBpbnQgcmVzID0gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImNvbS9hbmRyb2lkL3NlcnZlci9LZXlJbnB1dFF1ZXVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnSW5wdXRNZXRob2RzLCBORUxFTShnSW5wdXRNZXRob2RzKSk7Ci0KLSAgICBqY2xhc3MgYWJzb2x1dGVJbmZvID0gZW52LT5GaW5kQ2xhc3MoImNvbS9hbmRyb2lkL3NlcnZlci9JbnB1dERldmljZSRBYnNvbHV0ZUluZm8iKTsKLSAgICBMT0dfRkFUQUxfSUYoYWJzb2x1dGVJbmZvID09IE5VTEwsICJVbmFibGUgdG8gZmluZCBjbGFzcyBjb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXREZXZpY2UkQWJzb2x1dGVJbmZvIik7Ci0gICAgCi0gICAgZ0lucHV0T2Zmc2V0cy5tTWluVmFsdWUKLSAgICAgICAgPSBlbnYtPkdldEZpZWxkSUQoYWJzb2x1dGVJbmZvLCAibWluVmFsdWUiLCAiSSIpOwotICAgIExPR19GQVRBTF9JRihnSW5wdXRPZmZzZXRzLm1NaW5WYWx1ZSA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgSW5wdXREZXZpY2UuQWJzb2x1dGVJbmZvLm1pblZhbHVlIik7Ci0gICAgCi0gICAgZ0lucHV0T2Zmc2V0cy5tTWF4VmFsdWUKLSAgICAgICAgPSBlbnYtPkdldEZpZWxkSUQoYWJzb2x1dGVJbmZvLCAibWF4VmFsdWUiLCAiSSIpOwotICAgIExPR19GQVRBTF9JRihnSW5wdXRPZmZzZXRzLm1NYXhWYWx1ZSA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgSW5wdXREZXZpY2UuQWJzb2x1dGVJbmZvLm1heFZhbHVlIik7Ci0gICAgCi0gICAgZ0lucHV0T2Zmc2V0cy5tRmxhdAotICAgICAgICA9IGVudi0+R2V0RmllbGRJRChhYnNvbHV0ZUluZm8sICJmbGF0IiwgIkkiKTsKLSAgICBMT0dfRkFUQUxfSUYoZ0lucHV0T2Zmc2V0cy5tRmxhdCA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgSW5wdXREZXZpY2UuQWJzb2x1dGVJbmZvLmZsYXQiKTsKLSAgICAKLSAgICBnSW5wdXRPZmZzZXRzLm1GdXp6Ci0gICAgICAgID0gZW52LT5HZXRGaWVsZElEKGFic29sdXRlSW5mbywgImZ1enoiLCAiSSIpOwotICAgIExPR19GQVRBTF9JRihnSW5wdXRPZmZzZXRzLm1GdXp6ID09IE5VTEwsICJVbmFibGUgdG8gZmluZCBJbnB1dERldmljZS5BYnNvbHV0ZUluZm8uZnV6eiIpOwotICAgIAotICAgIGpjbGFzcyBpbnB1dEV2ZW50ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvdmlldy9SYXdJbnB1dEV2ZW50Iik7Ci0gICAgTE9HX0ZBVEFMX0lGKGlucHV0RXZlbnQgPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzIGFuZHJvaWQvdmlldy9SYXdJbnB1dEV2ZW50Iik7Ci0KLSAgICBnSW5wdXRPZmZzZXRzLm1EZXZpY2VJZAotICAgICAgICA9IGVudi0+R2V0RmllbGRJRChpbnB1dEV2ZW50LCAiZGV2aWNlSWQiLCAiSSIpOwotICAgIExPR19GQVRBTF9JRihnSW5wdXRPZmZzZXRzLm1EZXZpY2VJZCA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgUmF3SW5wdXRFdmVudC5kZXZpY2VJZCIpOwotICAgIAotICAgIGdJbnB1dE9mZnNldHMubVR5cGUKLSAgICAgICAgPSBlbnYtPkdldEZpZWxkSUQoaW5wdXRFdmVudCwgInR5cGUiLCAiSSIpOwotICAgIExPR19GQVRBTF9JRihnSW5wdXRPZmZzZXRzLm1UeXBlID09IE5VTEwsICJVbmFibGUgdG8gZmluZCBSYXdJbnB1dEV2ZW50LnR5cGUiKTsKLSAgICAKLSAgICBnSW5wdXRPZmZzZXRzLm1TY2FuY29kZQotICAgICAgICA9IGVudi0+R2V0RmllbGRJRChpbnB1dEV2ZW50LCAic2NhbmNvZGUiLCAiSSIpOwotICAgIExPR19GQVRBTF9JRihnSW5wdXRPZmZzZXRzLm1TY2FuY29kZSA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgUmF3SW5wdXRFdmVudC5zY2FuY29kZSIpOwotCi0gICAgZ0lucHV0T2Zmc2V0cy5tS2V5Y29kZQotICAgICAgICA9IGVudi0+R2V0RmllbGRJRChpbnB1dEV2ZW50LCAia2V5Y29kZSIsICJJIik7Ci0gICAgTE9HX0ZBVEFMX0lGKGdJbnB1dE9mZnNldHMubUtleWNvZGUgPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIFJhd0lucHV0RXZlbnQua2V5Y29kZSIpOwotCi0gICAgZ0lucHV0T2Zmc2V0cy5tRmxhZ3MKLSAgICAgICAgPSBlbnYtPkdldEZpZWxkSUQoaW5wdXRFdmVudCwgImZsYWdzIiwgIkkiKTsKLSAgICBMT0dfRkFUQUxfSUYoZ0lucHV0T2Zmc2V0cy5tRmxhZ3MgPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIFJhd0lucHV0RXZlbnQuZmxhZ3MiKTsKLQotICAgIGdJbnB1dE9mZnNldHMubVZhbHVlCi0gICAgICAgID0gZW52LT5HZXRGaWVsZElEKGlucHV0RXZlbnQsICJ2YWx1ZSIsICJJIik7Ci0gICAgTE9HX0ZBVEFMX0lGKGdJbnB1dE9mZnNldHMubVZhbHVlID09IE5VTEwsICJVbmFibGUgdG8gZmluZCBSYXdJbnB1dEV2ZW50LnZhbHVlIik7Ci0gICAgCi0gICAgZ0lucHV0T2Zmc2V0cy5tV2hlbgotICAgICAgICA9IGVudi0+R2V0RmllbGRJRChpbnB1dEV2ZW50LCAid2hlbiIsICJKIik7Ci0gICAgTE9HX0ZBVEFMX0lGKGdJbnB1dE9mZnNldHMubVdoZW4gPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIFJhd0lucHV0RXZlbnQud2hlbiIpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwZGJjNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZS5jcHAKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlBvd2VyTWFuYWdlclNlcnZpY2UtSk5JIgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSAiY29tX2FuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIGptZXRob2RJRCBnb1RvU2xlZXA7CisgICAgam1ldGhvZElEIHVzZXJBY3Rpdml0eTsKK30gZ1Bvd2VyTWFuYWdlclNlcnZpY2VDbGFzc0luZm87CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGpvYmplY3QgZ1Bvd2VyTWFuYWdlclNlcnZpY2VPYmo7CisKK3N0YXRpYyBNdXRleCBnUG93ZXJNYW5hZ2VyTG9jazsKK3N0YXRpYyBib29sIGdTY3JlZW5PbjsKK3N0YXRpYyBib29sIGdTY3JlZW5CcmlnaHQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGJvb2wgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZV9pc1NjcmVlbk9uKCkgeworICAgIEF1dG9NdXRleCBfbChnUG93ZXJNYW5hZ2VyTG9jayk7CisgICAgcmV0dXJuIGdTY3JlZW5PbjsKK30KKworYm9vbCBhbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlX2lzU2NyZWVuQnJpZ2h0KCkgeworICAgIEF1dG9NdXRleCBfbChnUG93ZXJNYW5hZ2VyTG9jayk7CisgICAgcmV0dXJuIGdTY3JlZW5CcmlnaHQ7Cit9CisKK3ZvaWQgYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZV91c2VyQWN0aXZpdHkobnNlY3NfdCBldmVudFRpbWUsIGludDMyX3QgZXZlbnRUeXBlKSB7CisgICAgaWYgKGdQb3dlck1hbmFnZXJTZXJ2aWNlT2JqKSB7CisgICAgICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworCisgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZ1Bvd2VyTWFuYWdlclNlcnZpY2VPYmosIGdQb3dlck1hbmFnZXJTZXJ2aWNlQ2xhc3NJbmZvLnVzZXJBY3Rpdml0eSwKKyAgICAgICAgICAgICAgICBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoZXZlbnRUaW1lKSwgZmFsc2UsIGV2ZW50VHlwZSwgZmFsc2UpOworICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgInVzZXJBY3Rpdml0eSIpOworICAgIH0KK30KKwordm9pZCBhbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlX2dvVG9TbGVlcChuc2Vjc190IGV2ZW50VGltZSkgeworICAgIGlmIChnUG93ZXJNYW5hZ2VyU2VydmljZU9iaikgeworICAgICAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKworICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGdQb3dlck1hbmFnZXJTZXJ2aWNlT2JqLCBnUG93ZXJNYW5hZ2VyU2VydmljZUNsYXNzSW5mby5nb1RvU2xlZXAsCisgICAgICAgICAgICAgICAgbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKGV2ZW50VGltZSkpOworICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdvVG9TbGVlcCIpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlX25hdGl2ZUluaXQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKSB7CisgICAgZ1Bvd2VyTWFuYWdlclNlcnZpY2VPYmogPSBlbnYtPk5ld0dsb2JhbFJlZihvYmopOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlX25hdGl2ZVNldFBvd2VyU3RhdGUoSk5JRW52KiBlbnYsCisgICAgICAgIGpvYmplY3Qgc2VydmljZU9iaiwgamJvb2xlYW4gc2NyZWVuT24sIGpib29sZWFuIHNjcmVlbkJyaWdodCkgeworICAgIEF1dG9NdXRleCBfbChnUG93ZXJNYW5hZ2VyTG9jayk7CisgICAgZ1NjcmVlbk9uID0gc2NyZWVuT247CisgICAgZ1NjcmVlbkJyaWdodCA9IHNjcmVlbkJyaWdodDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdQb3dlck1hbmFnZXJTZXJ2aWNlTWV0aG9kc1tdID0geworICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLworICAgIHsgIm5hdGl2ZUluaXQiLCAiKClWIiwKKyAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZV9uYXRpdmVJbml0IH0sCisgICAgeyAibmF0aXZlU2V0UG93ZXJTdGF0ZSIsICIoWlopViIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2VfbmF0aXZlU2V0UG93ZXJTdGF0ZSB9LAorfTsKKworI2RlZmluZSBGSU5EX0NMQVNTKHZhciwgY2xhc3NOYW1lKSBcCisgICAgICAgIHZhciA9IGVudi0+RmluZENsYXNzKGNsYXNzTmFtZSk7IFwKKyAgICAgICAgTE9HX0ZBVEFMX0lGKCEgdmFyLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgIiBjbGFzc05hbWUpOyBcCisgICAgICAgIHZhciA9IGpjbGFzcyhlbnYtPk5ld0dsb2JhbFJlZih2YXIpKTsKKworI2RlZmluZSBHRVRfTUVUSE9EX0lEKHZhciwgY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpIFwKKyAgICAgICAgdmFyID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgbWV0aG9kTmFtZSwgbWV0aG9kRGVzY3JpcHRvcik7IFwKKyAgICAgICAgTE9HX0ZBVEFMX0lGKCEgdmFyLCAiVW5hYmxlIHRvIGZpbmQgbWV0aG9kICIgbWV0aG9kTmFtZSk7CisKKyNkZWZpbmUgR0VUX0ZJRUxEX0lEKHZhciwgY2xhenosIGZpZWxkTmFtZSwgZmllbGREZXNjcmlwdG9yKSBcCisgICAgICAgIHZhciA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgZmllbGROYW1lLCBmaWVsZERlc2NyaXB0b3IpOyBcCisgICAgICAgIExPR19GQVRBTF9JRighIHZhciwgIlVuYWJsZSB0byBmaW5kIGZpZWxkICIgZmllbGROYW1lKTsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2UoSk5JRW52KiBlbnYpIHsKKyAgICBpbnQgcmVzID0gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImNvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlIiwKKyAgICAgICAgICAgIGdQb3dlck1hbmFnZXJTZXJ2aWNlTWV0aG9kcywgTkVMRU0oZ1Bvd2VyTWFuYWdlclNlcnZpY2VNZXRob2RzKSk7CisgICAgTE9HX0ZBVEFMX0lGKHJlcyA8IDAsICJVbmFibGUgdG8gcmVnaXN0ZXIgbmF0aXZlIG1ldGhvZHMuIik7CisKKyAgICAvLyBDYWxsYmFja3MKKworICAgIEZJTkRfQ0xBU1MoZ1Bvd2VyTWFuYWdlclNlcnZpY2VDbGFzc0luZm8uY2xhenosICJjb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZSIpOworCisgICAgR0VUX01FVEhPRF9JRChnUG93ZXJNYW5hZ2VyU2VydmljZUNsYXNzSW5mby5nb1RvU2xlZXAsIGdQb3dlck1hbmFnZXJTZXJ2aWNlQ2xhc3NJbmZvLmNsYXp6LAorICAgICAgICAgICAgImdvVG9TbGVlcCIsICIoSilWIik7CisKKyAgICBHRVRfTUVUSE9EX0lEKGdQb3dlck1hbmFnZXJTZXJ2aWNlQ2xhc3NJbmZvLnVzZXJBY3Rpdml0eSwgZ1Bvd2VyTWFuYWdlclNlcnZpY2VDbGFzc0luZm8uY2xhenosCisgICAgICAgICAgICAidXNlckFjdGl2aXR5IiwgIihKWklaKVYiKTsKKworICAgIHJldHVybiAwOworfQorCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2UuaCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDVmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2UuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQU5EUk9JRF9TRVJWRVJfUE9XRVJfTUFOQUdFUl9TRVJWSUNFX0gKKyNkZWZpbmUgX0FORFJPSURfU0VSVkVSX1BPV0VSX01BTkFHRVJfU0VSVklDRV9ICisKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiam5pLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgUE9XRVJfTUFOQUdFUl9PVEhFUl9FVkVOVCA9IDAsCisgICAgUE9XRVJfTUFOQUdFUl9DSEVFS19FVkVOVCA9IDEsCisgICAgUE9XRVJfTUFOQUdFUl9UT1VDSF9FVkVOVCA9IDIsIC8vIHRvdWNoIGV2ZW50cyBhcmUgVE9VQ0ggZm9yIDMwMG1zLCBhbmQgdGhlbiBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgZXZlbnRzIG9yIExPTkdfVE9VQ0ggZXZlbnRzLgorICAgIFBPV0VSX01BTkFHRVJfTE9OR19UT1VDSF9FVkVOVCA9IDMsCisgICAgUE9XRVJfTUFOQUdFUl9UT1VDSF9VUF9FVkVOVCA9IDQsCisgICAgUE9XRVJfTUFOQUdFUl9CVVRUT05fRVZFTlQgPSA1LCAvLyBCdXR0b24gYW5kIHRyYWNrYmFsbCBldmVudHMuCit9OworCitleHRlcm4gYm9vbCBhbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlX2lzU2NyZWVuT24oKTsKK2V4dGVybiBib29sIGFuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2VfaXNTY3JlZW5CcmlnaHQoKTsKK2V4dGVybiB2b2lkIGFuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2VfdXNlckFjdGl2aXR5KG5zZWNzX3QgZXZlbnRUaW1lLCBpbnQzMl90IGV2ZW50VHlwZSk7CitleHRlcm4gdm9pZCBhbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlX2dvVG9TbGVlcChuc2Vjc190IGV2ZW50VGltZSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9BTkRST0lEX1NFUlZFUl9QT1dFUl9NQU5BR0VSX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL29ubG9hZC5jcHAgYi9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcAppbmRleCBhMWE2ODM4Li4xYTJkOGI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcApAQCAtNiw5ICs2LDkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9BbGFybU1hbmFnZXJTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CYXR0ZXJ5U2VydmljZShKTklFbnYqIGVudik7Ci1pbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfS2V5SW5wdXRRdWV1ZShKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9MaWdodHNTZXJ2aWNlKEpOSUVudiogZW52KTsKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9TZW5zb3JTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlcihKTklFbnYqIGVudik7CkBAIC0yOCw3ICsyOCw3IEBACiAgICAgfQogICAgIExPR19BU1NFUlQoZW52LCAiQ291bGQgbm90IHJldHJpZXZlIHRoZSBlbnYhIik7CiAKLSAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9LZXlJbnB1dFF1ZXVlKGVudik7CisgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcihlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0xpZ2h0c1NlcnZpY2UoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9BbGFybU1hbmFnZXJTZXJ2aWNlKGVudik7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Bob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCA5ZjhlNTdmLi40ODI1N2NjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NQaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEKQEAgLTYyLDggKzYyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dkKCJHRVRfUkVDT1JEX1NJWkUgU2l6ZSAiICsgcmVjb3JkU2l6ZVswXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvdGFsICIgKyByZWNvcmRTaXplWzFdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgI3JlY29yZCAiICsgcmVjb3JkU2l6ZVsyXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5QWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnlBbGwoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9ET05FOgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGUuamF2YQppbmRleCBiNzNjMmY3Li41ZGQyOWFmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGUuamF2YQpAQCAtMjMsMzQ2ICsyMywxMyBAQAogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBUaGUgdGFibGUgYmVsb3cgaXMgYnVpbHQgZnJvbSB0d28gcmVzb3VyY2VzOgotICoKLSAqIDEpIElUVSAiTW9iaWxlIE5ldHdvcmsgQ29kZSAoTU5DKSBmb3IgdGhlIGludGVybmF0aW9uYWwKLSAqICAgaWRlbnRpZmljYXRpb24gcGxhbiBmb3IgbW9iaWxlIHRlcm1pbmFscyBhbmQgbW9iaWxlIHVzZXJzIgotICogICB3aGljaCBpcyBhdmFpbGFibGUgYXMgYW4gYW5uZXggdG8gdGhlIElUVSBvcGVyYXRpb25hbCBidWxsZXRpbgotICogICBhdmFpbGFibGUgaGVyZTogaHR0cDovL3d3dy5pdHUuaW50L2l0dS10L2J1bGxldGluL2FubmV4Lmh0bWwKLSAqCi0gKiAyKSBUaGUgSVNPIDMxNjYgY291bnRyeSBjb2RlcyBsaXN0LCBhdmFpbGFibGUgaGVyZToKLSAqICAgIGh0dHA6Ly93d3cuaXNvLm9yZy9pc28vZW4vcHJvZHMtc2VydmljZXMvaXNvMzE2Nm1hLzAyaXNvLTMxNjYtY29kZS1saXN0cy9pbmRleC5odG1sCi0gKgotICogVGhpcyB0YWJsZSB3YXMgdmVyaWZpZWQgKDI4IEF1ZyAyMDA5KSBhZ2FpbnN0Ci0gKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfbW9iaWxlX2NvdW50cnlfY29kZXMgd2l0aCB0aGUKLSAqIG9ubHkgdW5yZXNvbHZlZCBkaXNjcmVwYW5jeSBiZWluZyB0aGF0IHRoaXMgbGlzdCBoYXMgYW4gZXh0cmEgZW50cnkKLSAqICg0NjEpIGZvciBDaGluYS4KLSAqCi0gKiBUT0RPOiBDb21wbGV0ZSB0aGUgbWFwcGluZ3MgZm9yIHRpbWV6b25lcyBhbmQgbGFuZ3VhZ2UvbG9jYWxlIGNvZGVzLgotICoKLSAqIFRoZSBhY3R1YWwgdGFibGUgZGF0YSB1c2VkIGluIHRoZSBKYXZhIGNvZGUgaXMgZ2VuZXJhdGVkIGZyb20gdGhlCi0gKiBiZWxvdyBQeXRob24gY29kZSBmb3IgZWZmaWNpZW5jeS4gIFRoZSBpbmZvcm1hdGlvbiBpcyBleHBlY3RlZCB0bwotICogYmUgc3RhdGljLCBidXQgaWYgY2hhbmdlcyBhcmUgcmVxdWlyZWQsIHRoZSB0YWJsZSBpbiB0aGUgcHl0aG9uCi0gKiBjb2RlIGNhbiBiZSBtb2RpZmllZCBhbmQgdGhlIHRyYWlsaW5nIGNvZGUgcnVuIHRvIHJlLWdlbmVyYXRlIHRoZQotICogdGFibGVzIHRoYXQgYXJlIHRvIGJlIHVzZWQgYnkgSmF2YS4KLQotbWNjX3RhYmxlID0gWwotICAoMjAyLCAnZ3InLCAyLCAnR3JlZWNlJyksCi0gICgyMDQsICdubCcsIDIsICdFdXJvcGUvQW1zdGVyZGFtJywgJ25sJywgMTMsICdOZXRoZXJsYW5kcyAoS2luZ2RvbSBvZiB0aGUpJyksCi0gICgyMDYsICdiZScsIDIsICdCZWxnaXVtJyksCi0gICgyMDgsICdmcicsIDIsICdFdXJvcGUvUGFyaXMnLCAnZnInLCAnRnJhbmNlJyksCi0gICgyMTIsICdtYycsIDIsICdNb25hY28gKFByaW5jaXBhbGl0eSBvZiknKSwKLSAgKDIxMywgJ2FkJywgMiwgJ0FuZG9ycmEgKFByaW5jaXBhbGl0eSBvZiknKSwKLSAgKDIxNCwgJ2VzJywgMiwgJ0V1cm9wZS9NYWRyaWQnLCAnZXMnLCAnU3BhaW4nKSwKLSAgKDIxNiwgJ2h1JywgMiwgJ0h1bmdhcnkgKFJlcHVibGljIG9mKScpLAotICAoMjE4LCAnYmEnLCAyLCAnQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYScpLAotICAoMjE5LCAnaHInLCAyLCAnQ3JvYXRpYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyMjAsICdycycsIDIsICdTZXJiaWEgYW5kIE1vbnRlbmVncm8nKSwKLSAgKDIyMiwgJ2l0JywgMiwgJ0V1cm9wZS9Sb21lJywgJ2l0JywgJ0l0YWx5JyksCi0gICgyMjUsICd2YScsIDIsICdFdXJvcGUvUm9tZScsICdpdCcsICdWYXRpY2FuIENpdHkgU3RhdGUnKSwKLSAgKDIyNiwgJ3JvJywgMiwgJ1JvbWFuaWEnKSwKLSAgKDIyOCwgJ2NoJywgMiwgJ0V1cm9wZS9adXJpY2gnLCAnZGUnLCAnU3dpdHplcmxhbmQgKENvbmZlZGVyYXRpb24gb2YpJyksCi0gICgyMzAsICdjeicsIDIsICdFdXJvcGUvUHJhZ3VlJywgJ2NzJywgMTMsICdDemVjaCBSZXB1YmxpYycpLAotICAoMjMxLCAnc2snLCAyLCAnU2xvdmFrIFJlcHVibGljJyksCi0gICgyMzIsICdhdCcsIDIsICdFdXJvcGUvVmllbm5hJywgJ2RlJywgMTMsICdBdXN0cmlhJyksCi0gICgyMzQsICdnYicsIDIsICdFdXJvcGUvTG9uZG9uJywgJ2VuJywgMTMsICdVbml0ZWQgS2luZ2RvbSBvZiBHcmVhdCBCcml0YWluIGFuZCBOb3J0aGVybiBJcmVsYW5kJyksCi0gICgyMzUsICdnYicsIDIsICdFdXJvcGUvTG9uZG9uJywgJ2VuJywgMTMsICdVbml0ZWQgS2luZ2RvbSBvZiBHcmVhdCBCcml0YWluIGFuZCBOb3J0aGVybiBJcmVsYW5kJyksCi0gICgyMzgsICdkaycsIDIsICdEZW5tYXJrJyksCi0gICgyNDAsICdzZScsIDIsICdTd2VkZW4nKSwKLSAgKDI0MiwgJ25vJywgMiwgJ05vcndheScpLAotICAoMjQ0LCAnZmknLCAyLCAnRmlubGFuZCcpLAotICAoMjQ2LCAnbHQnLCAyLCAnTGl0aHVhbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI0NywgJ2x2JywgMiwgJ0xhdHZpYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNDgsICdlZScsIDIsICdFc3RvbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI1MCwgJ3J1JywgMiwgJ1J1c3NpYW4gRmVkZXJhdGlvbicpLAotICAoMjU1LCAndWEnLCAyLCAnVWtyYWluZScpLAotICAoMjU3LCAnYnknLCAyLCAnQmVsYXJ1cyAoUmVwdWJsaWMgb2YpJyksCi0gICgyNTksICdtZCcsIDIsICdNb2xkb3ZhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI2MCwgJ3BsJywgMiwgJ0V1cm9wZS9XYXJzYXcnLCAnUG9sYW5kIChSZXB1YmxpYyBvZiknKSwKLSAgKDI2MiwgJ2RlJywgMiwgJ0V1cm9wZS9CZXJsaW4nLCAnZGUnLCAxMywgJ0dlcm1hbnkgKEZlZGVyYWwgUmVwdWJsaWMgb2YpJyksCi0gICgyNjYsICdnaScsIDIsICdHaWJyYWx0YXInKSwKLSAgKDI2OCwgJ3B0JywgMiwgJ1BvcnR1Z2FsJyksCi0gICgyNzAsICdsdScsIDIsICdMdXhlbWJvdXJnJyksCi0gICgyNzIsICdpZScsIDIsICdFdXJvcGUvRHVibGluJywgJ2VuJywgJ0lyZWxhbmQnKSwKLSAgKDI3NCwgJ2lzJywgMiwgJ0ljZWxhbmQnKSwKLSAgKDI3NiwgJ2FsJywgMiwgJ0FsYmFuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjc4LCAnbXQnLCAyLCAnTWFsdGEnKSwKLSAgKDI4MCwgJ2N5JywgMiwgJ0N5cHJ1cyAoUmVwdWJsaWMgb2YpJyksCi0gICgyODIsICdnZScsIDIsICdHZW9yZ2lhJyksCi0gICgyODMsICdhbScsIDIsICdBcm1lbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI4NCwgJ2JnJywgMiwgJ0J1bGdhcmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI4NiwgJ3RyJywgMiwgJ1R1cmtleScpLAotICAoMjg4LCAnZm8nLCAyLCAnRmFyb2UgSXNsYW5kcycpLAotICAoMjg5LCAnZ2UnLCAyLCAnQWJraGF6aWEgKEdlb3JnaWEpJyksCi0gICgyOTAsICdnbCcsIDIsICdHcmVlbmxhbmQgKERlbm1hcmspJyksCi0gICgyOTIsICdzbScsIDIsICdTYW4gTWFyaW5vIChSZXB1YmxpYyBvZiknKSwKLSAgKDI5MywgJ3NsJywgMiwgJ1Nsb3ZlbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI5NCwgJ21rJywgMiwgJ1RoZSBGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhJyksCi0gICgyOTUsICdsaScsIDIsICdMaWVjaHRlbnN0ZWluIChQcmluY2lwYWxpdHkgb2YpJyksCi0gICgyOTcsICdtZScsIDIsICdNb250ZW5lZ3JvIChSZXB1YmxpYyBvZiknKSwKLSAgKDMwMiwgJ2NhJywgMywgJycsICcnLCAxMSwgJ0NhbmFkYScpLAotICAoMzA4LCAncG0nLCAyLCAnU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiAoQ29sbGVjdGl2aXQgdGVycml0b3JpYWxlIGRlIGxhIFJwdWJsaXF1ZSBmcmFuYWlzZSknKSwKLSAgKDMxMCwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTEsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzEyLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxMywgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTQsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzE1LCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxNiwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMzAsICdwcicsIDIsICdQdWVydG8gUmljbycpLAotICAoMzMyLCAndmknLCAyLCAnVW5pdGVkIFN0YXRlcyBWaXJnaW4gSXNsYW5kcycpLAotICAoMzM0LCAnbXgnLCAzLCAnTWV4aWNvJyksCi0gICgzMzgsICdqbScsIDMsICdKYW1haWNhJyksCi0gICgzNDAsICdncCcsIDIsICdHdWFkZWxvdXBlIChGcmVuY2ggRGVwYXJ0bWVudCBvZiknKSwKLSAgKDM0MiwgJ2JiJywgMywgJ0JhcmJhZG9zJyksCi0gICgzNDQsICdhZycsIDMsICdBbnRpZ3VhIGFuZCBCYXJidWRhJyksCi0gICgzNDYsICdreScsIDMsICdDYXltYW4gSXNsYW5kcycpLAotICAoMzQ4LCAndmcnLCAzLCAnQnJpdGlzaCBWaXJnaW4gSXNsYW5kcycpLAotICAoMzUwLCAnYm0nLCAyLCAnQmVybXVkYScpLAotICAoMzUyLCAnZ2QnLCAyLCAnR3JlbmFkYScpLAotICAoMzU0LCAnbXMnLCAyLCAnTW9udHNlcnJhdCcpLAotICAoMzU2LCAna24nLCAyLCAnU2FpbnQgS2l0dHMgYW5kIE5ldmlzJyksCi0gICgzNTgsICdsYycsIDIsICdTYWludCBMdWNpYScpLAotICAoMzYwLCAndmMnLCAyLCAnU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMnKSwKLSAgKDM2MiwgJ25sJywgMiwgJ05ldGhlcmxhbmRzIEFudGlsbGVzJyksCi0gICgzNjMsICdhdycsIDIsICdBcnViYScpLAotICAoMzY0LCAnYnMnLCAyLCAnQmFoYW1hcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSknKSwKLSAgKDM2NSwgJ2FpJywgMywgJ0FuZ3VpbGxhJyksCi0gICgzNjYsICdkbScsIDIsICdEb21pbmljYSAoQ29tbW9ud2VhbHRoIG9mKScpLAotICAoMzY4LCAnY3UnLCAyLCAnQ3ViYScpLAotICAoMzcwLCAnZG8nLCAyLCAnRG9taW5pY2FuIFJlcHVibGljJyksCi0gICgzNzIsICdodCcsIDIsICdIYWl0aSAoUmVwdWJsaWMgb2YpJyksCi0gICgzNzQsICd0dCcsIDIsICdUcmluaWRhZCBhbmQgVG9iYWdvJyksCi0gICgzNzYsICd0YycsIDIsICdUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMnKSwKLSAgKDQwMCwgJ2F6JywgMiwgJ0F6ZXJiYWlqYW5pIFJlcHVibGljJyksCi0gICg0MDEsICdreicsIDIsICdLYXpha2hzdGFuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQwMiwgJ2J0JywgMiwgJ0JodXRhbiAoS2luZ2RvbSBvZiknKSwKLSAgKDQwNCwgJ2luJywgMiwgJ0luZGlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDQwNSwgJ2luJywgMiwgJ0luZGlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDQxMCwgJ3BrJywgMiwgJ1Bha2lzdGFuIChJc2xhbWljIFJlcHVibGljIG9mKScpLAotICAoNDEyLCAnYWYnLCAyLCAnQWZnaGFuaXN0YW4nKSwKLSAgKDQxMywgJ2xrJywgMiwgJ1NyaSBMYW5rYSAoRGVtb2NyYXRpYyBTb2NpYWxpc3QgUmVwdWJsaWMgb2YpJyksCi0gICg0MTQsICdtbScsIDIsICdNeWFubWFyIChVbmlvbiBvZiknKSwKLSAgKDQxNSwgJ2xiJywgMiwgJ0xlYmFub24nKSwKLSAgKDQxNiwgJ2pvJywgMiwgJ0pvcmRhbiAoSGFzaGVtaXRlIEtpbmdkb20gb2YpJyksCi0gICg0MTcsICdzeScsIDIsICdTeXJpYW4gQXJhYiBSZXB1YmxpYycpLAotICAoNDE4LCAnaXEnLCAyLCAnSXJhcSAoUmVwdWJsaWMgb2YpJyksCi0gICg0MTksICdrdycsIDIsICdLdXdhaXQgKFN0YXRlIG9mKScpLAotICAoNDIwLCAnc2EnLCAyLCAnU2F1ZGkgQXJhYmlhIChLaW5nZG9tIG9mKScpLAotICAoNDIxLCAneWUnLCAyLCAnWWVtZW4gKFJlcHVibGljIG9mKScpLAotICAoNDIyLCAnb20nLCAyLCAnT21hbiAoU3VsdGFuYXRlIG9mKScpLAotICAoNDIzLCAncHMnLCAyLCAnUGFsZXN0aW5lJyksCi0gICg0MjQsICdhZScsIDIsICdVbml0ZWQgQXJhYiBFbWlyYXRlcycpLAotICAoNDI1LCAnaWwnLCAyLCAnSXNyYWVsIChTdGF0ZSBvZiknKSwKLSAgKDQyNiwgJ2JoJywgMiwgJ0JhaHJhaW4gKEtpbmdkb20gb2YpJyksCi0gICg0MjcsICdxYScsIDIsICdRYXRhciAoU3RhdGUgb2YpJyksCi0gICg0MjgsICdtbicsIDIsICdNb25nb2xpYScpLAotICAoNDI5LCAnbnAnLCAyLCAnTmVwYWwnKSwKLSAgKDQzMCwgJ2FlJywgMiwgJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJyksCi0gICg0MzEsICdhZScsIDIsICdVbml0ZWQgQXJhYiBFbWlyYXRlcycpLAotICAoNDMyLCAnaXInLCAyLCAnSXJhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZiknKSwKLSAgKDQzNCwgJ3V6JywgMiwgJ1V6YmVraXN0YW4gKFJlcHVibGljIG9mKScpLAotICAoNDM2LCAndGonLCAyLCAnVGFqaWtpc3RhbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MzcsICdrZycsIDIsICdLeXJneXogUmVwdWJsaWMnKSwKLSAgKDQzOCwgJ3RtJywgMiwgJ1R1cmttZW5pc3RhbicpLAotICAoNDQwLCAnanAnLCAyLCAnQXNpYS9Ub2t5bycsICdqYScsIDE0LCAnSmFwYW4nKSwKLSAgKDQ0MSwgJ2pwJywgMiwgJ0FzaWEvVG9reW8nLCAnamEnLCAxNCwgJ0phcGFuJyksCi0gICg0NTAsICdrcicsIDIsICdLb3JlYSAoUmVwdWJsaWMgb2YpJyksCi0gICg0NTIsICd2bicsIDIsICdWaWV0IE5hbSAoU29jaWFsaXN0IFJlcHVibGljIG9mKScpLAotICAoNDU0LCAnaGsnLCAyLCAnIkhvbmcgS29uZywgQ2hpbmEiJyksCi0gICg0NTUsICdtbycsIDIsICciTWFjYW8sIENoaW5hIicpLAotICAoNDU2LCAna2gnLCAyLCAnQ2FtYm9kaWEgKEtpbmdkb20gb2YpJyksCi0gICg0NTcsICdsYScsIDIsICJMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyIpLAotICAoNDYwLCAnY24nLCAyLCAiQXNpYS9CZWlqaW5nIiwgJ3poJywgMTMsICJDaGluYSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpIiksCi0gICg0NjEsICdjbicsIDIsICJBc2lhL0JlaWppbmciLCAnemgnLCAxMywgIkNoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikiKSwKLSAgKDQ2NiwgJ3R3JywgMiwgIlRhaXdhbiAoUmVwdWJsaWMgb2YgQ2hpbmEpIiksCi0gICg0NjcsICdrcCcsIDIsICJEZW1vY3JhdGljIFBlb3BsZSdzIFJlcHVibGljIG9mIEtvcmVhIiksCi0gICg0NzAsICdiZCcsIDIsICJCYW5nbGFkZXNoIChQZW9wbGUncyBSZXB1YmxpYyBvZikiKSwKLSAgKDQ3MiwgJ212JywgMiwgJ01hbGRpdmVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDUwMiwgJ215JywgMiwgJ01hbGF5c2lhJyksCi0gICg1MDUsICdhdScsIDIsICdBdXN0cmFsaWEvU3lkbmV5JywgJ2VuJywgMTEsICdBdXN0cmFsaWEnKSwKLSAgKDUxMCwgJ2lkJywgMiwgJ0luZG9uZXNpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg1MTQsICd0bCcsIDIsICdEZW1vY3JhdGljIFJlcHVibGljIG9mIFRpbW9yLUxlc3RlJyksCi0gICg1MTUsICdwaCcsIDIsICdQaGlsaXBwaW5lcyAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNTIwLCAndGgnLCAyLCAnVGhhaWxhbmQnKSwKLSAgKDUyNSwgJ3NnJywgMiwgJ0FzaWEvU2luZ2Fwb3JlJywgJ2VuJywgMTEsICdTaW5nYXBvcmUgKFJlcHVibGljIG9mKScpLAotICAoNTI4LCAnYm4nLCAyLCAnQnJ1bmVpIERhcnVzc2FsYW0nKSwKLSAgKDUzMCwgJ256JywgMiwgJ1BhY2lmaWMvQXVja2xhbmQnLCAnZW4nLCAnTmV3IFplYWxhbmQnKSwKLSAgKDUzNCwgJ21wJywgMiwgJ05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSknKSwKLSAgKDUzNSwgJ2d1JywgMiwgJ0d1YW0nKSwKLSAgKDUzNiwgJ25yJywgMiwgJ05hdXJ1IChSZXB1YmxpYyBvZiknKSwKLSAgKDUzNywgJ3BnJywgMiwgJ1BhcHVhIE5ldyBHdWluZWEnKSwKLSAgKDUzOSwgJ3RvJywgMiwgJ1RvbmdhIChLaW5nZG9tIG9mKScpLAotICAoNTQwLCAnc2InLCAyLCAnU29sb21vbiBJc2xhbmRzJyksCi0gICg1NDEsICd2dScsIDIsICdWYW51YXR1IChSZXB1YmxpYyBvZiknKSwKLSAgKDU0MiwgJ2ZqJywgMiwgJ0ZpamkgKFJlcHVibGljIG9mKScpLAotICAoNTQzLCAnd2YnLCAyLCAiV2FsbGlzIGFuZCBGdXR1bmEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikiKSwKLSAgKDU0NCwgJ2FzJywgMiwgJ0FtZXJpY2FuIFNhbW9hJyksCi0gICg1NDUsICdraScsIDIsICdLaXJpYmF0aSAoUmVwdWJsaWMgb2YpJyksCi0gICg1NDYsICduYycsIDIsICJOZXcgQ2FsZWRvbmlhIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpIiksCi0gICg1NDcsICdwZicsIDIsICJGcmVuY2ggUG9seW5lc2lhIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpIiksCi0gICg1NDgsICdjaycsIDIsICdDb29rIElzbGFuZHMnKSwKLSAgKDU0OSwgJ3dzJywgMiwgJ1NhbW9hIChJbmRlcGVuZGVudCBTdGF0ZSBvZiknKSwKLSAgKDU1MCwgJ2ZtJywgMiwgJ01pY3JvbmVzaWEgKEZlZGVyYXRlZCBTdGF0ZXMgb2YpJyksCi0gICg1NTEsICdtaCcsIDIsICdNYXJzaGFsbCBJc2xhbmRzIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg1NTIsICdwdycsIDIsICdQYWxhdSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MDIsICdlZycsIDIsICdFZ3lwdCAoQXJhYiBSZXB1YmxpYyBvZiknKSwKLSAgKDYwMywgJ2R6JywgMiwgIkFsZ2VyaWEgKFBlb3BsZSdzIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpIiksCi0gICg2MDQsICdtYScsIDIsICdNb3JvY2NvIChLaW5nZG9tIG9mKScpLAotICAoNjA1LCAndG4nLCAyLCAnVHVuaXNpYScpLAotICAoNjA2LCAnbHknLCAyLCAiTGlieWEgKFNvY2lhbGlzdCBQZW9wbGUncyBMaWJ5YW4gQXJhYiBKYW1haGlyaXlhKSIpLAotICAoNjA3LCAnZ20nLCAyLCAnR2FtYmlhIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg2MDgsICdzbicsIDIsICdTZW5lZ2FsIChSZXB1YmxpYyBvZiknKSwKLSAgKDYwOSwgJ21yJywgMiwgJ01hdXJpdGFuaWEgKElzbGFtaWMgUmVwdWJsaWMgb2YpJyksCi0gICg2MTAsICdtbCcsIDIsICdNYWxpIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxMSwgJ2duJywgMiwgJ0d1aW5lYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTIsICdjaScsIDIsICJDdGUgZCdJdm9pcmUgKFJlcHVibGljIG9mKSIpLAotICAoNjEzLCAnYmYnLCAyLCAnQnVya2luYSBGYXNvJyksCi0gICg2MTQsICduZScsIDIsICdOaWdlciAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjE1LCAndGcnLCAyLCAnVG9nb2xlc2UgUmVwdWJsaWMnKSwKLSAgKDYxNiwgJ2JqJywgMiwgJ0JlbmluIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxNywgJ211JywgMiwgJ01hdXJpdGl1cyAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTgsICdscicsIDIsICdMaWJlcmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxOSwgJ3NsJywgMiwgJ1NpZXJyYSBMZW9uZScpLAotICAoNjIwLCAnZ2gnLCAyLCAnR2hhbmEnKSwKLSAgKDYyMSwgJ25nJywgMiwgJ05pZ2VyaWEgKEZlZGVyYWwgUmVwdWJsaWMgb2YpJyksCi0gICg2MjIsICd0ZCcsIDIsICdDaGFkIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyMywgJ2NmJywgMiwgJ0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYycpLAotICAoNjI0LCAnY20nLCAyLCAnQ2FtZXJvb24gKFJlcHVibGljIG9mKScpLAotICAoNjI1LCAnY3YnLCAyLCAnQ2FwZSBWZXJkZSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MjYsICdzdCcsIDIsICdTYW8gVG9tZSBhbmQgUHJpbmNpcGUgKERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpJyksCi0gICg2MjcsICdncScsIDIsICdFcXVhdG9yaWFsIEd1aW5lYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MjgsICdnYScsIDIsICdHYWJvbmVzZSBSZXB1YmxpYycpLAotICAoNjI5LCAnY2cnLCAyLCAnQ29uZ28gKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYzMCwgJ2NnJywgMiwgJ0RlbW9jcmF0aWMgUmVwdWJsaWMgb2YgdGhlIENvbmdvJyksCi0gICg2MzEsICdhbycsIDIsICdBbmdvbGEgKFJlcHVibGljIG9mKScpLAotICAoNjMyLCAnZ3cnLCAyLCAnR3VpbmVhLUJpc3NhdSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzMsICdzYycsIDIsICdTZXljaGVsbGVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzNCwgJ3NkJywgMiwgJ1N1ZGFuIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg2MzUsICdydycsIDIsICdSd2FuZGEgKFJlcHVibGljIG9mKScpLAotICAoNjM2LCAnZXQnLCAyLCAnRXRoaW9waWEgKEZlZGVyYWwgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiknKSwKLSAgKDYzNywgJ3NvJywgMiwgJ1NvbWFsaSBEZW1vY3JhdGljIFJlcHVibGljJyksCi0gICg2MzgsICdkaicsIDIsICdEamlib3V0aSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzksICdrZScsIDIsICdLZW55YSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDAsICd0eicsIDIsICdUYW56YW5pYSAoVW5pdGVkIFJlcHVibGljIG9mKScpLAotICAoNjQxLCAndWcnLCAyLCAnVWdhbmRhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0MiwgJ2JpJywgMiwgJ0J1cnVuZGkgKFJlcHVibGljIG9mKScpLAotICAoNjQzLCAnbXonLCAyLCAnTW96YW1iaXF1ZSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDUsICd6bScsIDIsICdaYW1iaWEgKFJlcHVibGljIG9mKScpLAotICAoNjQ2LCAnbWcnLCAyLCAnTWFkYWdhc2NhciAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDcsICdyZScsIDIsICdSZXVuaW9uIChGcmVuY2ggRGVwYXJ0bWVudCBvZiknKSwKLSAgKDY0OCwgJ3p3JywgMiwgJ1ppbWJhYndlIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0OSwgJ25hJywgMiwgJ05hbWliaWEgKFJlcHVibGljIG9mKScpLAotICAoNjUwLCAnbXcnLCAyLCAnTWFsYXdpJyksCi0gICg2NTEsICdscycsIDIsICdMZXNvdGhvIChLaW5nZG9tIG9mKScpLAotICAoNjUyLCAnYncnLCAyLCAnQm90c3dhbmEgKFJlcHVibGljIG9mKScpLAotICAoNjUzLCAnc3onLCAyLCAnU3dhemlsYW5kIChLaW5nZG9tIG9mKScpLAotICAoNjU0LCAna20nLCAyLCAnQ29tb3JvcyAoVW5pb24gb2YgdGhlKScpLAotICAoNjU1LCAnemEnLCAyLCAnQWZyaWNhL0pvaGFubmVzYnVyZycsICdlbicsICdTb3V0aCBBZnJpY2EgKFJlcHVibGljIG9mKScpLAotICAoNjU3LCAnZXInLCAyLCAnRXJpdHJlYScpLAotICAoNzAyLCAnYnonLCAyLCAnQmVsaXplJyksCi0gICg3MDQsICdndCcsIDIsICdHdWF0ZW1hbGEgKFJlcHVibGljIG9mKScpLAotICAoNzA2LCAnc3YnLCAyLCAnRWwgU2FsdmFkb3IgKFJlcHVibGljIG9mKScpLAotICAoNzA4LCAnaG4nLCAzLCAnSG9uZHVyYXMgKFJlcHVibGljIG9mKScpLAotICAoNzEwLCAnbmknLCAyLCAnTmljYXJhZ3VhJyksCi0gICg3MTIsICdjcicsIDIsICdDb3N0YSBSaWNhJyksCi0gICg3MTQsICdwYScsIDIsICdQYW5hbWEgKFJlcHVibGljIG9mKScpLAotICAoNzE2LCAncGUnLCAyLCAnUGVydScpLAotICAoNzIyLCAnYXInLCAzLCAnQXJnZW50aW5lIFJlcHVibGljJyksCi0gICg3MjQsICdicicsIDIsICdCcmF6aWwgKEZlZGVyYXRpdmUgUmVwdWJsaWMgb2YpJyksCi0gICg3MzAsICdjbCcsIDIsICdDaGlsZScpLAotICAoNzMyLCAnY28nLCAzLCAnQ29sb21iaWEgKFJlcHVibGljIG9mKScpLAotICAoNzM0LCAndmUnLCAyLCAnVmVuZXp1ZWxhIChCb2xpdmFyaWFuIFJlcHVibGljIG9mKScpLAotICAoNzM2LCAnYm8nLCAyLCAnQm9saXZpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MzgsICdneScsIDIsICdHdXlhbmEnKSwKLSAgKDc0MCwgJ2VjJywgMiwgJ0VjdWFkb3InKSwKLSAgKDc0MiwgJ2dmJywgMiwgJ0ZyZW5jaCBHdWlhbmEgKEZyZW5jaCBEZXBhcnRtZW50IG9mKScpLAotICAoNzQ0LCAncHknLCAyLCAnUGFyYWd1YXkgKFJlcHVibGljIG9mKScpLAotICAoNzQ2LCAnc3InLCAyLCAnU3VyaW5hbWUgKFJlcHVibGljIG9mKScpLAotICAoNzQ4LCAndXknLCAyLCAnVXJ1Z3VheSAoRWFzdGVybiBSZXB1YmxpYyBvZiknKSwKLSAgKDc1MCwgJ2ZrJywgMiwgJ0ZhbGtsYW5kIElzbGFuZHMgKE1hbHZpbmFzKScpXQotCi1nZXRfbWNjID0gbGFtYmRhIGVsdDogZWx0WzBdCi1nZXRfaXNvID0gbGFtYmRhIGVsdDogZWx0WzFdCi1nZXRfc2QgPSBsYW1iZGEgZWx0OiBlbHRbMl0KLWdldF90eiA9IGxhbWJkYSBlbHQ6IGxlbihlbHQpID4gNCBhbmQgZWx0WzNdIG9yICcnCi1nZXRfbGFuZyA9IGxhbWJkYSBlbHQ6IGxlbihlbHQpID4gNSBhbmQgZWx0WzRdIG9yICcnCi1nZXRfd2lmaSA9IGxhbWJkYSBlbHQ6IGxlbihlbHQpID4gNiBhbmQgZWx0WzVdIG9yIDAKLQotbWNjX2NvZGVzID0gWycweCUwNHgnICUgZ2V0X21jYyhlbHQpIGZvciBlbHQgaW4gbWNjX3RhYmxlXQotdHpfc2V0ID0gc29ydGVkKHggZm9yIHggaW4gc2V0KGdldF90eihlbHQpIGZvciBlbHQgaW4gbWNjX3RhYmxlKSkKLWxhbmdfc2V0ID0gc29ydGVkKHggZm9yIHggaW4gc2V0KGdldF9sYW5nKGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGUpKQotCi1kZWYgbWtfaW5kX2NvZGUoZWx0KToKLSAgaXNvID0gZ2V0X2lzbyhlbHQpCi0gIGlzb19jb2RlID0gKChvcmQoaXNvWzBdKSA8PCA4KSB8IG9yZChpc29bMV0pKSAmIDB4RkZGRiAjIDE2IGJpdHMKLSAgd2lmaSA9IGdldF93aWZpKGVsdCkgJiAweDAwMEYgICAgICAgICAgICAgICAgICAgICAgICAgICMgIDQgYml0cwotICBzZCA9IGdldF9zZChlbHQpICYgMHgwMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgMiBiaXRzCi0gIHR6X2luZCA9IHR6X3NldC5pbmRleChnZXRfdHooZWx0KSkgJiAweDAwMUYgICAgICAgICAgICAjICA1IGJpdHMKLSAgbGFuZ19pbmQgPSBsYW5nX3NldC5pbmRleChnZXRfbGFuZyhlbHQpKSAmIDB4MDAwRiAgICAgICMgIDQgYml0cwotICByZXR1cm4gKGlzb19jb2RlIDw8IDE2KSB8ICh3aWZpIDw8IDExKSB8IChzZCA8PCA5KSB8ICh0el9pbmQgPDwgNCkgfCBsYW5nX2luZAotCi1pbmRfY29kZXMgPSBbJzB4JTA4eCcgJSBta19pbmRfY29kZShlbHQpIGZvciBlbHQgaW4gbWNjX3RhYmxlXQotCi1kZWYgZm10X2xpc3QodGl0bGUsIGwsIGJhdGNoX3N6KToKLSAgc2wgPSBbXQotICBmb3IgaSBpbiByYW5nZShsZW4obCkgLyBiYXRjaF9zeiArIChsZW4obCkgJSBiYXRjaF9zeiBhbmQgMSBvciAwKSk6Ci0gICAgaiA9IGkgKiBiYXRjaF9zegotICAgIHNsLmFwcGVuZCgoJyAnICogOCkgKyAnLCAnLmpvaW4obFtqOmogKyBiYXRjaF9zel0pKQotICByZXR1cm4gJyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCAlcyA9IHtcbicgJSB0aXRsZSArICcsXG4nLmpvaW4oc2wpICsgJ1xuICAgIH07XG4nCi0KLWRlZiBkb19hdXRvZ2VuX2NvbW1lbnQoZXh0cmFfZGVzYz1bXSk6Ci0gIHByaW50ICcgICAgLycgKyAnKipcbiAgICAqIEFVVE8gR0VORVJBVEVEIChieSB0aGUgUHl0aG9uIGNvZGUgYWJvdmUpJwotICBmb3IgbGluZSBpbiBleHRyYV9kZXNjOgotICAgIHByaW50ICcgICAgKiAlcycgJSBsaW5lCi0gIHByaW50ICcgICAgKicgKyAnLycKLQotZG9fYXV0b2dlbl9jb21tZW50KCkKLXByaW50IGZtdF9saXN0KCdTdHJpbmdbXSBUWl9TVFJJTkdTJywgWyciJXMiJyAlIHggZm9yIHggaW4gdHpfc2V0XSwgMSkKLWRvX2F1dG9nZW5fY29tbWVudCgpCi1wcmludCBmbXRfbGlzdCgnU3RyaW5nW10gTEFOR19TVFJJTkdTJywgWyciJXMiJyAlIHggZm9yIHggaW4gbGFuZ19zZXRdLCAxMCkKLWRvX2F1dG9nZW5fY29tbWVudChbJ1RoaXMgdGFibGUgaXMgYSBsaXN0IG9mIE1DQyBjb2Rlcy4gIFRoZSBpbmRleCBpbiB0aGlzIHRhYmxlJywKLSAgICAgICAgICAgICAgICAgICAgJ29mIGEgZ2l2ZW4gTUNDIGNvZGUgaXMgdGhlIGluZGV4IG9mIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0JywKLSAgICAgICAgICAgICAgICAgICAgJ3RoYXQgTUNDIGluIHRoZSBJTkRfQ09ERVMgdGFibGUuJ10pCi1wcmludCBmbXRfbGlzdCgnc2hvcnRbXSBNQ0NfQ09ERVMnLCBtY2NfY29kZXMsIDEwKQotZG9fYXV0b2dlbl9jb21tZW50KFsnVGhlIHZhbHVlcyBpbiB0aGlzIHRhYmxlIGFyZSBicm9rZW4gZG93biBhcyBmb2xsb3dzIChtc2IgdG8gbHNiKTonLAotICAgICAgICAgICAgICAgICAgICAnICAgIGlzbyBjb3VudHJ5IGNvZGUgMTYgYml0cycsCi0gICAgICAgICAgICAgICAgICAgICcgICAgKHVudXNlZCkgICAgICAgICAgMSBiaXQnLAotICAgICAgICAgICAgICAgICAgICAnICAgIHdpZmkgY2hhbm5lbCAgICAgIDQgYml0cycsCi0gICAgICAgICAgICAgICAgICAgICcgICAgc21hbGxlZCBkaWdpdCAgICAgMiBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBkZWZhdWx0IHRpbWV6b25lICA1IGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgIGRlZmF1bHQgbGFuZ3VhZ2UgIDQgYml0cyddKQotcHJpbnQgZm10X2xpc3QoJ2ludFtdIElORF9DT0RFUycsIGluZF9jb2RlcywgNikKLQotZGVmIHBhcnNlX2luZF9jb2RlKGluZCk6Ci0gIG1jYyA9IGV2YWwobWNjX2NvZGVzW2luZF0pCi0gIGNvZGUgPSBldmFsKGluZF9jb2Rlc1tpbmRdKQotICBpc29fbHNiID0gaW50KChjb2RlID4+IDE2KSAmIDB4MDBGRikKLSAgaXNvX21zYiA9IGludCgoY29kZSA+PiAyNCkgJiAweDAwRkYpCi0gIGlzbyA9ICclcyVzJyAlIChjaHIoaXNvX21zYiksIGNocihpc29fbHNiKSkKLSAgd2lmaSA9IGludCgoY29kZSA+PiAxMSkgJiAweDAwMEYpCi0gIHNkID0gaW50KChjb2RlID4+IDkpICYgMHgwMDAzKQotICB0el9pbmQgPSAoY29kZSA+PiA0KSAmIDB4MDAxRgotICBsYW5nX2luZCA9IChjb2RlID4+IDApICYgMHgwMDBGCi0gIHJldHVybiAobWNjLCBpc28sIHNkLCB0el9zZXRbdHpfaW5kXSwgbGFuZ19zZXRbbGFuZ19pbmRdLCB3aWZpKQotCi1mbXRfc3RyID0gJ21jYyA9ICVzLCBpc28gPSAlcywgc2QgPSAlcywgdHogPSAlcywgbGFuZyA9ICVzLCB3aWZpID0gJXMnCi1vcmlnX3RhYmxlID0gW2ZtdF9zdHIgJSAoZ2V0X21jYyhlbHQpLCBnZXRfaXNvKGVsdCksIGdldF9zZChlbHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldF90eihlbHQpLCBnZXRfbGFuZyhlbHQpLCBnZXRfd2lmaShlbHQpKQotICAgICAgICAgICAgICBmb3IgZWx0IGluIG1jY190YWJsZV0KLWRlcml2ZWRfdGFibGUgPSBbZm10X3N0ciAlIHBhcnNlX2luZF9jb2RlKGkpIGZvciBpIGluIHJhbmdlKGxlbihpbmRfY29kZXMpKV0KLWZvciBpIGluIHJhbmdlKGxlbihvcmlnX3RhYmxlKSk6Ci0gIGlmIG9yaWdfdGFibGVbaV0gPT0gZGVyaXZlZF90YWJsZVtpXTogY29udGludWUKLSAgcHJpbnQgJ01JU01BVENIIEVSUk9SIDogJywgb3JpZ190YWJsZVtpXSwgIiAhPSAiLCBkZXJpdmVkX3RhYmxlW2ldCi0KLSovCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBsaWJjb3JlLmljdS5UaW1lWm9uZXM7CiAKIC8qKgogICogTW9iaWxlIENvdW50cnkgQ29kZQpAQCAtMzcxLDIwMCArMzgsMTUzIEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBNY2NUYWJsZQogewotICAgIC8qKgotICAgICAqIEFVVE8gR0VORVJBVEVEIChieSB0aGUgUHl0aG9uIGNvZGUgYWJvdmUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVFpfU1RSSU5HUyA9IHsKLSAgICAgICAgIiIsCi0gICAgICAgICJBZnJpY2EvSm9oYW5uZXNidXJnIiwKLSAgICAgICAgIkFzaWEvQmVpamluZyIsCi0gICAgICAgICJBc2lhL1NpbmdhcG9yZSIsCi0gICAgICAgICJBc2lhL1Rva3lvIiwKLSAgICAgICAgIkF1c3RyYWxpYS9TeWRuZXkiLAotICAgICAgICAiRXVyb3BlL0Ftc3RlcmRhbSIsCi0gICAgICAgICJFdXJvcGUvQmVybGluIiwKLSAgICAgICAgIkV1cm9wZS9EdWJsaW4iLAotICAgICAgICAiRXVyb3BlL0xvbmRvbiIsCi0gICAgICAgICJFdXJvcGUvTWFkcmlkIiwKLSAgICAgICAgIkV1cm9wZS9QYXJpcyIsCi0gICAgICAgICJFdXJvcGUvUHJhZ3VlIiwKLSAgICAgICAgIkV1cm9wZS9Sb21lIiwKLSAgICAgICAgIkV1cm9wZS9WaWVubmEiLAotICAgICAgICAiRXVyb3BlL1dhcnNhdyIsCi0gICAgICAgICJFdXJvcGUvWnVyaWNoIiwKLSAgICAgICAgIlBhY2lmaWMvQXVja2xhbmQiCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIEFVVE8gR0VORVJBVEVEIChieSB0aGUgUHl0aG9uIGNvZGUgYWJvdmUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFOR19TVFJJTkdTID0gewotICAgICAgICAiIiwgImNzIiwgImRlIiwgImVuIiwgImVzIiwgImZyIiwgIml0IiwgImphIiwgIm5sIiwgInpoIgotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqIFRoaXMgdGFibGUgaXMgYSBsaXN0IG9mIE1DQyBjb2Rlcy4gIFRoZSBpbmRleCBpbiB0aGlzIHRhYmxlCi0gICAgICogb2YgYSBnaXZlbiBNQ0MgY29kZSBpcyB0aGUgaW5kZXggb2YgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQKLSAgICAgKiB0aGF0IE1DQyBpbiB0aGUgSU5EX0NPREVTIHRhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0W10gTUNDX0NPREVTID0gewotICAgICAgICAweDAwY2EsIDB4MDBjYywgMHgwMGNlLCAweDAwZDAsIDB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkOCwgMHgwMGRhLCAweDAwZGIsCi0gICAgICAgIDB4MDBkYywgMHgwMGRlLCAweDAwZTEsIDB4MDBlMiwgMHgwMGU0LCAweDAwZTYsIDB4MDBlNywgMHgwMGU4LCAweDAwZWEsIDB4MDBlYiwKLSAgICAgICAgMHgwMGVlLCAweDAwZjAsIDB4MDBmMiwgMHgwMGY0LCAweDAwZjYsIDB4MDBmNywgMHgwMGY4LCAweDAwZmEsIDB4MDBmZiwgMHgwMTAxLAotICAgICAgICAweDAxMDMsIDB4MDEwNCwgMHgwMTA2LCAweDAxMGEsIDB4MDEwYywgMHgwMTBlLCAweDAxMTAsIDB4MDExMiwgMHgwMTE0LCAweDAxMTYsCi0gICAgICAgIDB4MDExOCwgMHgwMTFhLCAweDAxMWIsIDB4MDExYywgMHgwMTFlLCAweDAxMjAsIDB4MDEyMSwgMHgwMTIyLCAweDAxMjQsIDB4MDEyNSwKLSAgICAgICAgMHgwMTI2LCAweDAxMjcsIDB4MDEyOSwgMHgwMTJlLCAweDAxMzQsIDB4MDEzNiwgMHgwMTM3LCAweDAxMzgsIDB4MDEzOSwgMHgwMTNhLAotICAgICAgICAweDAxM2IsIDB4MDEzYywgMHgwMTRhLCAweDAxNGMsIDB4MDE0ZSwgMHgwMTUyLCAweDAxNTQsIDB4MDE1NiwgMHgwMTU4LCAweDAxNWEsCi0gICAgICAgIDB4MDE1YywgMHgwMTVlLCAweDAxNjAsIDB4MDE2MiwgMHgwMTY0LCAweDAxNjYsIDB4MDE2OCwgMHgwMTZhLCAweDAxNmIsIDB4MDE2YywKLSAgICAgICAgMHgwMTZkLCAweDAxNmUsIDB4MDE3MCwgMHgwMTcyLCAweDAxNzQsIDB4MDE3NiwgMHgwMTc4LCAweDAxOTAsIDB4MDE5MSwgMHgwMTkyLAotICAgICAgICAweDAxOTQsIDB4MDE5NSwgMHgwMTlhLCAweDAxOWMsIDB4MDE5ZCwgMHgwMTllLCAweDAxOWYsIDB4MDFhMCwgMHgwMWExLCAweDAxYTIsCi0gICAgICAgIDB4MDFhMywgMHgwMWE0LCAweDAxYTUsIDB4MDFhNiwgMHgwMWE3LCAweDAxYTgsIDB4MDFhOSwgMHgwMWFhLCAweDAxYWIsIDB4MDFhYywKLSAgICAgICAgMHgwMWFkLCAweDAxYWUsIDB4MDFhZiwgMHgwMWIwLCAweDAxYjIsIDB4MDFiNCwgMHgwMWI1LCAweDAxYjYsIDB4MDFiOCwgMHgwMWI5LAotICAgICAgICAweDAxYzIsIDB4MDFjNCwgMHgwMWM2LCAweDAxYzcsIDB4MDFjOCwgMHgwMWM5LCAweDAxY2MsIDB4MDFjZCwgMHgwMWQyLCAweDAxZDMsCi0gICAgICAgIDB4MDFkNiwgMHgwMWQ4LCAweDAxZjYsIDB4MDFmOSwgMHgwMWZlLCAweDAyMDIsIDB4MDIwMywgMHgwMjA4LCAweDAyMGQsIDB4MDIxMCwKLSAgICAgICAgMHgwMjEyLCAweDAyMTYsIDB4MDIxNywgMHgwMjE4LCAweDAyMTksIDB4MDIxYiwgMHgwMjFjLCAweDAyMWQsIDB4MDIxZSwgMHgwMjFmLAotICAgICAgICAweDAyMjAsIDB4MDIyMSwgMHgwMjIyLCAweDAyMjMsIDB4MDIyNCwgMHgwMjI1LCAweDAyMjYsIDB4MDIyNywgMHgwMjI4LCAweDAyNWEsCi0gICAgICAgIDB4MDI1YiwgMHgwMjVjLCAweDAyNWQsIDB4MDI1ZSwgMHgwMjVmLCAweDAyNjAsIDB4MDI2MSwgMHgwMjYyLCAweDAyNjMsIDB4MDI2NCwKLSAgICAgICAgMHgwMjY1LCAweDAyNjYsIDB4MDI2NywgMHgwMjY4LCAweDAyNjksIDB4MDI2YSwgMHgwMjZiLCAweDAyNmMsIDB4MDI2ZCwgMHgwMjZlLAotICAgICAgICAweDAyNmYsIDB4MDI3MCwgMHgwMjcxLCAweDAyNzIsIDB4MDI3MywgMHgwMjc0LCAweDAyNzUsIDB4MDI3NiwgMHgwMjc3LCAweDAyNzgsCi0gICAgICAgIDB4MDI3OSwgMHgwMjdhLCAweDAyN2IsIDB4MDI3YywgMHgwMjdkLCAweDAyN2UsIDB4MDI3ZiwgMHgwMjgwLCAweDAyODEsIDB4MDI4MiwKLSAgICAgICAgMHgwMjgzLCAweDAyODUsIDB4MDI4NiwgMHgwMjg3LCAweDAyODgsIDB4MDI4OSwgMHgwMjhhLCAweDAyOGIsIDB4MDI4YywgMHgwMjhkLAotICAgICAgICAweDAyOGUsIDB4MDI4ZiwgMHgwMjkxLCAweDAyYmUsIDB4MDJjMCwgMHgwMmMyLCAweDAyYzQsIDB4MDJjNiwgMHgwMmM4LCAweDAyY2EsCi0gICAgICAgIDB4MDJjYywgMHgwMmQyLCAweDAyZDQsIDB4MDJkYSwgMHgwMmRjLCAweDAyZGUsIDB4MDJlMCwgMHgwMmUyLCAweDAyZTQsIDB4MDJlNiwKLSAgICAgICAgMHgwMmU4LCAweDAyZWEsIDB4MDJlYywgMHgwMmVlCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIEFVVE8gR0VORVJBVEVEIChieSB0aGUgUHl0aG9uIGNvZGUgYWJvdmUpCi0gICAgICogVGhlIHZhbHVlcyBpbiB0aGlzIHRhYmxlIGFyZSBicm9rZW4gZG93biBhcyBmb2xsb3dzIChtc2IgdG8gbHNiKToKLSAgICAgKiAgICAgaXNvIGNvdW50cnkgY29kZSAxNiBiaXRzCi0gICAgICogICAgICh1bnVzZWQpICAgICAgICAgIDEgYml0Ci0gICAgICogICAgIHdpZmkgY2hhbm5lbCAgICAgIDQgYml0cwotICAgICAqICAgICBzbWFsbGVkIGRpZ2l0ICAgICAyIGJpdHMKLSAgICAgKiAgICAgZGVmYXVsdCB0aW1lem9uZSAgNSBiaXRzCi0gICAgICogICAgIGRlZmF1bHQgbGFuZ3VhZ2UgIDQgYml0cwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIElORF9DT0RFUyA9IHsKLSAgICAgICAgMHg2NzcyMDQwMCwgMHg2ZTZjNmM2OCwgMHg2MjY1MDQwMCwgMHg2NjcyMDRiNSwgMHg2ZDYzMDQwMCwgMHg2MTY0MDQwMCwKLSAgICAgICAgMHg2NTczMDRhNCwgMHg2ODc1MDQwMCwgMHg2MjYxMDQwMCwgMHg2ODcyMDQwMCwgMHg3MjczMDQwMCwgMHg2OTc0MDRkNiwKLSAgICAgICAgMHg3NjYxMDRkNiwgMHg3MjZmMDQwMCwgMHg2MzY4MDUwMiwgMHg2MzdhNmNjMSwgMHg3MzZiMDQwMCwgMHg2MTc0NmNlMiwKLSAgICAgICAgMHg2NzYyNmM5MywgMHg2NzYyNmM5MywgMHg2NDZiMDQwMCwgMHg3MzY1MDQwMCwgMHg2ZTZmMDQwMCwgMHg2NjY5MDQwMCwKLSAgICAgICAgMHg2Yzc0MDQwMCwgMHg2Yzc2MDQwMCwgMHg2NTY1MDQwMCwgMHg3Mjc1MDQwMCwgMHg3NTYxMDQwMCwgMHg2Mjc5MDQwMCwKLSAgICAgICAgMHg2ZDY0MDQwMCwgMHg3MDZjMDRmMCwgMHg2NDY1NmM3MiwgMHg2NzY5MDQwMCwgMHg3MDc0MDQwMCwgMHg2Yzc1MDQwMCwKLSAgICAgICAgMHg2OTY1MDQ4MywgMHg2OTczMDQwMCwgMHg2MTZjMDQwMCwgMHg2ZDc0MDQwMCwgMHg2Mzc5MDQwMCwgMHg2NzY1MDQwMCwKLSAgICAgICAgMHg2MTZkMDQwMCwgMHg2MjY3MDQwMCwgMHg3NDcyMDQwMCwgMHg2NjZmMDQwMCwgMHg2NzY1MDQwMCwgMHg2NzZjMDQwMCwKLSAgICAgICAgMHg3MzZkMDQwMCwgMHg3MzZjMDQwMCwgMHg2ZDZiMDQwMCwgMHg2YzY5MDQwMCwgMHg2ZDY1MDQwMCwgMHg2MzYxNWUwMCwKLSAgICAgICAgMHg3MDZkMDQwMCwgMHg3NTczNWUwMywgMHg3NTczNWUwMywgMHg3NTczNWUwMywgMHg3NTczNWUwMywgMHg3NTczNWUwMywKLSAgICAgICAgMHg3NTczNWUwMywgMHg3NTczNWUwMywgMHg3MDcyMDQwMCwgMHg3NjY5MDQwMCwgMHg2ZDc4MDYwMCwgMHg2YTZkMDYwMCwKLSAgICAgICAgMHg2NzcwMDQwMCwgMHg2MjYyMDYwMCwgMHg2MTY3MDYwMCwgMHg2Yjc5MDYwMCwgMHg3NjY3MDYwMCwgMHg2MjZkMDQwMCwKLSAgICAgICAgMHg2NzY0MDQwMCwgMHg2ZDczMDQwMCwgMHg2YjZlMDQwMCwgMHg2YzYzMDQwMCwgMHg3NjYzMDQwMCwgMHg2ZTZjMDQwMCwKLSAgICAgICAgMHg2MTc3MDQwMCwgMHg2MjczMDQwMCwgMHg2MTY5MDYwMCwgMHg2NDZkMDQwMCwgMHg2Mzc1MDQwMCwgMHg2NDZmMDQwMCwKLSAgICAgICAgMHg2ODc0MDQwMCwgMHg3NDc0MDQwMCwgMHg3NDYzMDQwMCwgMHg2MTdhMDQwMCwgMHg2YjdhMDQwMCwgMHg2Mjc0MDQwMCwKLSAgICAgICAgMHg2OTZlMDQwMCwgMHg2OTZlMDQwMCwgMHg3MDZiMDQwMCwgMHg2MTY2MDQwMCwgMHg2YzZiMDQwMCwgMHg2ZDZkMDQwMCwKLSAgICAgICAgMHg2YzYyMDQwMCwgMHg2YTZmMDQwMCwgMHg3Mzc5MDQwMCwgMHg2OTcxMDQwMCwgMHg2Yjc3MDQwMCwgMHg3MzYxMDQwMCwKLSAgICAgICAgMHg3OTY1MDQwMCwgMHg2ZjZkMDQwMCwgMHg3MDczMDQwMCwgMHg2MTY1MDQwMCwgMHg2OTZjMDQwMCwgMHg2MjY4MDQwMCwKLSAgICAgICAgMHg3MTYxMDQwMCwgMHg2ZDZlMDQwMCwgMHg2ZTcwMDQwMCwgMHg2MTY1MDQwMCwgMHg2MTY1MDQwMCwgMHg2OTcyMDQwMCwKLSAgICAgICAgMHg3NTdhMDQwMCwgMHg3NDZhMDQwMCwgMHg2YjY3MDQwMCwgMHg3NDZkMDQwMCwgMHg2YTcwNzQ0NywgMHg2YTcwNzQ0NywKLSAgICAgICAgMHg2YjcyMDQwMCwgMHg3NjZlMDQwMCwgMHg2ODZiMDQwMCwgMHg2ZDZmMDQwMCwgMHg2YjY4MDQwMCwgMHg2YzYxMDQwMCwKLSAgICAgICAgMHg2MzZlNmMyOSwgMHg2MzZlNmMyOSwgMHg3NDc3MDQwMCwgMHg2YjcwMDQwMCwgMHg2MjY0MDQwMCwgMHg2ZDc2MDQwMCwKLSAgICAgICAgMHg2ZDc5MDQwMCwgMHg2MTc1NWM1MywgMHg2OTY0MDQwMCwgMHg3NDZjMDQwMCwgMHg3MDY4MDQwMCwgMHg3NDY4MDQwMCwKLSAgICAgICAgMHg3MzY3NWMzMywgMHg2MjZlMDQwMCwgMHg2ZTdhMDUxMywgMHg2ZDcwMDQwMCwgMHg2Nzc1MDQwMCwgMHg2ZTcyMDQwMCwKLSAgICAgICAgMHg3MDY3MDQwMCwgMHg3NDZmMDQwMCwgMHg3MzYyMDQwMCwgMHg3Njc1MDQwMCwgMHg2NjZhMDQwMCwgMHg3NzY2MDQwMCwKLSAgICAgICAgMHg2MTczMDQwMCwgMHg2YjY5MDQwMCwgMHg2ZTYzMDQwMCwgMHg3MDY2MDQwMCwgMHg2MzZiMDQwMCwgMHg3NzczMDQwMCwKLSAgICAgICAgMHg2NjZkMDQwMCwgMHg2ZDY4MDQwMCwgMHg3MDc3MDQwMCwgMHg2NTY3MDQwMCwgMHg2NDdhMDQwMCwgMHg2ZDYxMDQwMCwKLSAgICAgICAgMHg3NDZlMDQwMCwgMHg2Yzc5MDQwMCwgMHg2NzZkMDQwMCwgMHg3MzZlMDQwMCwgMHg2ZDcyMDQwMCwgMHg2ZDZjMDQwMCwKLSAgICAgICAgMHg2NzZlMDQwMCwgMHg2MzY5MDQwMCwgMHg2MjY2MDQwMCwgMHg2ZTY1MDQwMCwgMHg3NDY3MDQwMCwgMHg2MjZhMDQwMCwKLSAgICAgICAgMHg2ZDc1MDQwMCwgMHg2YzcyMDQwMCwgMHg3MzZjMDQwMCwgMHg2NzY4MDQwMCwgMHg2ZTY3MDQwMCwgMHg3NDY0MDQwMCwKLSAgICAgICAgMHg2MzY2MDQwMCwgMHg2MzZkMDQwMCwgMHg2Mzc2MDQwMCwgMHg3Mzc0MDQwMCwgMHg2NzcxMDQwMCwgMHg2NzYxMDQwMCwKLSAgICAgICAgMHg2MzY3MDQwMCwgMHg2MzY3MDQwMCwgMHg2MTZmMDQwMCwgMHg2Nzc3MDQwMCwgMHg3MzYzMDQwMCwgMHg3MzY0MDQwMCwKLSAgICAgICAgMHg3Mjc3MDQwMCwgMHg2NTc0MDQwMCwgMHg3MzZmMDQwMCwgMHg2NDZhMDQwMCwgMHg2YjY1MDQwMCwgMHg3NDdhMDQwMCwKLSAgICAgICAgMHg3NTY3MDQwMCwgMHg2MjY5MDQwMCwgMHg2ZDdhMDQwMCwgMHg3YTZkMDQwMCwgMHg2ZDY3MDQwMCwgMHg3MjY1MDQwMCwKLSAgICAgICAgMHg3YTc3MDQwMCwgMHg2ZTYxMDQwMCwgMHg2ZDc3MDQwMCwgMHg2YzczMDQwMCwgMHg2Mjc3MDQwMCwgMHg3MzdhMDQwMCwKLSAgICAgICAgMHg2YjZkMDQwMCwgMHg3YTYxMDQxMywgMHg2NTcyMDQwMCwgMHg2MjdhMDQwMCwgMHg2Nzc0MDQwMCwgMHg3Mzc2MDQwMCwKLSAgICAgICAgMHg2ODZlMDYwMCwgMHg2ZTY5MDQwMCwgMHg2MzcyMDQwMCwgMHg3MDYxMDQwMCwgMHg3MDY1MDQwMCwgMHg2MTcyMDYwMCwKLSAgICAgICAgMHg2MjcyMDQwMCwgMHg2MzZjMDQwMCwgMHg2MzZmMDYwMCwgMHg3NjY1MDQwMCwgMHg2MjZmMDQwMCwgMHg2Nzc5MDQwMCwKLSAgICAgICAgMHg2NTYzMDQwMCwgMHg2NzY2MDQwMCwgMHg3MDc5MDQwMCwgMHg3MzcyMDQwMCwgMHg3NTc5MDQwMCwgMHg2NjZiMDQwMAotICAgIH07Ci0KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTWNjVGFibGUiOwogCisgICAgc3RhdGljIEFycmF5TGlzdDxNY2NFbnRyeT4gdGFibGU7CisKKyAgICBzdGF0aWMgY2xhc3MgTWNjRW50cnkgaW1wbGVtZW50cyBDb21wYXJhYmxlPE1jY0VudHJ5PgorICAgIHsKKyAgICAgICAgaW50IG1jYzsKKyAgICAgICAgU3RyaW5nIGlzbzsKKyAgICAgICAgaW50IHNtYWxsZXN0RGlnaXRzTW5jOworICAgICAgICBTdHJpbmcgbGFuZ3VhZ2U7CisgICAgICAgIGludCB3aWZpQ2hhbm5lbHM7CisKKyAgICAgICAgTWNjRW50cnkoaW50IG1uYywgU3RyaW5nIGlzbywgaW50IHNtYWxsZXN0RGlnaXRzTUNDKSB7CisgICAgICAgICAgICB0aGlzKG1uYywgaXNvLCBzbWFsbGVzdERpZ2l0c01DQywgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBNY2NFbnRyeShpbnQgbW5jLCBTdHJpbmcgaXNvLCBpbnQgc21hbGxlc3REaWdpdHNNQ0MsIFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICAgICAgdGhpcyhtbmMsIGlzbywgc21hbGxlc3REaWdpdHNNQ0MsIGxhbmd1YWdlLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIE1jY0VudHJ5KGludCBtbmMsIFN0cmluZyBpc28sIGludCBzbWFsbGVzdERpZ2l0c01DQywgU3RyaW5nIGxhbmd1YWdlLCBpbnQgd2lmaUNoYW5uZWxzKSB7CisgICAgICAgICAgICB0aGlzLm1jYyA9IG1uYzsKKyAgICAgICAgICAgIHRoaXMuaXNvID0gaXNvOworICAgICAgICAgICAgdGhpcy5zbWFsbGVzdERpZ2l0c01uYyA9IHNtYWxsZXN0RGlnaXRzTUNDOworICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOworICAgICAgICAgICAgdGhpcy53aWZpQ2hhbm5lbHMgPSB3aWZpQ2hhbm5lbHM7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE1jY0VudHJ5IG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtY2MgLSBvLm1jYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1jY0VudHJ5CisgICAgZW50cnlGb3JNY2MoaW50IG1jYykKKyAgICB7CisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICBNY2NFbnRyeSBtOworCisgICAgICAgIG0gPSBuZXcgTWNjRW50cnkobWNjLCBudWxsLCAwKTsKKworICAgICAgICBpbmRleCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaCh0YWJsZSwgbSk7CisKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdGFibGUuZ2V0KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgotICAgICAqIEdpdmVuIGEgTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyBhIGRlZmF1bHQgdGltZSB6b25lIElECi0gICAgICogaWYgYXZhaWxhYmxlLiAgUmV0dXJucyBudWxsIGlmIHVuYXZhaWxhYmxlLgorICAgICAqIFJldHVybnMgYSBkZWZhdWx0IHRpbWUgem9uZSBJRCBmb3IgdGhlIGdpdmVuIE1DQy4KKyAgICAgKiBAcGFyYW0gbWNjIE1vYmlsZSBDb3VudHJ5IENvZGUKKyAgICAgKiBAcmV0dXJuIGRlZmF1bHQgVGltZVpvbmUgSUQsIG9yIG51bGwgaWYgbm90IHNwZWNpZmllZAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRUaW1lWm9uZUZvck1jYyhpbnQgbWNjKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goTUNDX0NPREVTLCAoc2hvcnQpbWNjKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmlzbyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvY2FsZSBsb2NhbGU7CisgICAgICAgICAgICBpZiAoZW50cnkubGFuZ3VhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoZW50cnkuaXNvKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZShlbnRyeS5sYW5ndWFnZSwgZW50cnkuaXNvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ1tdIHR6ID0gVGltZVpvbmVzLmZvckxvY2FsZShsb2NhbGUpOworICAgICAgICAgICAgaWYgKHR6Lmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiB0elswXTsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCB0ekluZCA9IChpbmRDb2RlID4+PiA0KSAmIDB4MDAxRjsKLSAgICAgICAgU3RyaW5nIHR6ID0gVFpfU1RSSU5HU1t0ekluZF07Ci0gICAgICAgIGlmICh0eiA9PSAiIikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR6OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVuIGEgTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyBhbiBJU08gdHdvLWNoYXJhY3RlcgotICAgICAqIGNvdW50cnkgY29kZSBpZiBhdmFpbGFibGUuICBSZXR1cm5zICIiIGlmIHVuYXZhaWxhYmxlLgorICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMKKyAgICAgKiBhbiBJU08gdHdvLWNoYXJhY3RlciBjb3VudHJ5IGNvZGUgaWYgYXZhaWxhYmxlLgorICAgICAqIFJldHVybnMgIiIgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY291bnRyeUNvZGVGb3JNY2MoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZworICAgIGNvdW50cnlDb2RlRm9yTWNjKGludCBtY2MpCisgICAgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5pc287CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBieXRlW10gaXNvID0geyhieXRlKSgoaW5kQ29kZSA+Pj4gMjQpICYgMHgwMEZGKSwgKGJ5dGUpKChpbmRDb2RlID4+PiAxNikgJiAweDAwRkYpfTsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoaXNvKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zIGFuIElTTyAyLTMgY2hhcmFjdGVyCi0gICAgICogbGFuZ3VhZ2UgY29kZSBpZiBhdmFpbGFibGUuICBSZXR1cm5zIG51bGwgaWYgdW5hdmFpbGFibGUuCisgICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucworICAgICAqIGFuIElTTyAyLTMgY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUgaWYgYXZhaWxhYmxlLgorICAgICAqIFJldHVybnMgbnVsbCBpZiB1bmF2YWlsYWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0TGFuZ3VhZ2VGb3JNY2MoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5sYW5ndWFnZTsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCBsYW5nSW5kID0gaW5kQ29kZSAmIDB4MDAwRjsKLSAgICAgICAgU3RyaW5nIGxhbmcgPSBMQU5HX1NUUklOR1NbbGFuZ0luZF07Ci0gICAgICAgIGlmIChsYW5nID09ICIiKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGFuZzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICogc21hbGxlc3QgbnVtYmVyIG9mIGRpZ2l0cyBmaWVsZC4gIFJldHVybnMgMiBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zCisgICAgICogdGhlIHNtYWxsZXN0IG51bWJlciBvZiBkaWdpdHMgdGhhdCBNIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIDIgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgc21hbGxlc3REaWdpdHNNY2NGb3JNbmMoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICBwdWJsaWMgc3RhdGljIGludAorICAgIHNtYWxsZXN0RGlnaXRzTWNjRm9yTW5jKGludCBtY2MpCisgICAgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnNtYWxsZXN0RGlnaXRzTW5jOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgaW50IHNtRGlnID0gKGluZENvZGUgPj4+IDkpICYgMHgwMDAzOwotICAgICAgICByZXR1cm4gc21EaWc7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHdpZmkKICAgICAgKiBjaGFubmVscyBhbGxvd2VkIGluIHRoYXQgY291bnRyeS4gIFJldHVybnMgMCBpZiB1bmF2YWlsYWJsZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCB3aWZpQ2hhbm5lbHNGb3JNY2MoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICBwdWJsaWMgc3RhdGljIGludAorICAgIHdpZmlDaGFubmVsc0Zvck1jYyhpbnQgbWNjKSB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkud2lmaUNoYW5uZWxzOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgaW50IHdpZmkgPSAoaW5kQ29kZSA+Pj4gMTEpICYgMHgwMDBGOwotICAgICAgICByZXR1cm4gd2lmaTsKICAgICB9CiAKICAgICAvKioKQEAgLTY1Niw0ICsyNzYsMjYyIEBACiAgICAgICAgICAgICB3TS5zZXROdW1BbGxvd2VkQ2hhbm5lbHMod2lmaUNoYW5uZWxzLCB0cnVlKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHN0YXRpYyB7CisgICAgICAgIHRhYmxlID0gbmV3IEFycmF5TGlzdDxNY2NFbnRyeT4oMjQwKTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSB0YWJsZSBiZWxvdyBpcyBidWlsdCBmcm9tIHR3byByZXNvdXJjZXM6CisgICAgICAgICAqCisgICAgICAgICAqIDEpIElUVSAiTW9iaWxlIE5ldHdvcmsgQ29kZSAoTU5DKSBmb3IgdGhlIGludGVybmF0aW9uYWwKKyAgICAgICAgICogICBpZGVudGlmaWNhdGlvbiBwbGFuIGZvciBtb2JpbGUgdGVybWluYWxzIGFuZCBtb2JpbGUgdXNlcnMiCisgICAgICAgICAqICAgd2hpY2ggaXMgYXZhaWxhYmxlIGFzIGFuIGFubmV4IHRvIHRoZSBJVFUgb3BlcmF0aW9uYWwgYnVsbGV0aW4KKyAgICAgICAgICogICBhdmFpbGFibGUgaGVyZTogaHR0cDovL3d3dy5pdHUuaW50L2l0dS10L2J1bGxldGluL2FubmV4Lmh0bWwKKyAgICAgICAgICoKKyAgICAgICAgICogMikgVGhlIElTTyAzMTY2IGNvdW50cnkgY29kZXMgbGlzdCwgYXZhaWxhYmxlIGhlcmU6CisgICAgICAgICAqICAgIGh0dHA6Ly93d3cuaXNvLm9yZy9pc28vZW4vcHJvZHMtc2VydmljZXMvaXNvMzE2Nm1hLzAyaXNvLTMxNjYtY29kZS1saXN0cy9pbmRleC5odG1sCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgdGFibGUgaGFzIG5vdCBiZWVuIHZlcmlmaWVkLgorICAgICAgICAgKgorICAgICAgICAgKi8KKworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIwMiwiZ3IiLDIpKTsJLy9HcmVlY2UKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMDQsIm5sIiwyLCJubCIsMTMpKTsJLy9OZXRoZXJsYW5kcyAoS2luZ2RvbSBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjA2LCJiZSIsMikpOwkvL0JlbGdpdW0KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMDgsImZyIiwyLCJmciIpKTsJLy9GcmFuY2UKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTIsIm1jIiwyKSk7CS8vTW9uYWNvIChQcmluY2lwYWxpdHkgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjEzLCJhZCIsMikpOwkvL0FuZG9ycmEgKFByaW5jaXBhbGl0eSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTQsImVzIiwyLCJlcyIpKTsJLy9TcGFpbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxNiwiaHUiLDIpKTsJLy9IdW5nYXJ5IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTgsImJhIiwyKSk7CS8vQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxOSwiaHIiLDIpKTsJLy9Dcm9hdGlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjAsInJzIiwyKSk7CS8vU2VyYmlhIGFuZCBNb250ZW5lZ3JvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjIyLCJpdCIsMiwiaXQiKSk7CS8vSXRhbHkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjUsInZhIiwyLCJpdCIpKTsJLy9WYXRpY2FuIENpdHkgU3RhdGUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjYsInJvIiwyKSk7CS8vUm9tYW5pYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyOCwiY2giLDIsImRlIikpOwkvL1N3aXR6ZXJsYW5kIChDb25mZWRlcmF0aW9uIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzMCwiY3oiLDIsImNzIiwxMykpOwkvL0N6ZWNoIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjMxLCJzayIsMikpOwkvL1Nsb3ZhayBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzMiwiYXQiLDIsImRlIiwxMykpOwkvL0F1c3RyaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzQsImdiIiwyLCJlbiIsMTMpKTsJLy9Vbml0ZWQgS2luZ2RvbSBvZiBHcmVhdCBCcml0YWluIGFuZCBOb3J0aGVybiBJcmVsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjM1LCJnYiIsMiwiZW4iLDEzKSk7CS8vVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzOCwiZGsiLDIpKTsJLy9EZW5tYXJrCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQwLCJzZSIsMikpOwkvL1N3ZWRlbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0Miwibm8iLDIpKTsJLy9Ob3J3YXkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDQsImZpIiwyKSk7CS8vRmlubGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0NiwibHQiLDIpKTsJLy9MaXRodWFuaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0NywibHYiLDIpKTsJLy9MYXR2aWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0OCwiZWUiLDIpKTsJLy9Fc3RvbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNTAsInJ1IiwyKSk7CS8vUnVzc2lhbiBGZWRlcmF0aW9uCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjU1LCJ1YSIsMikpOwkvL1VrcmFpbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNTcsImJ5IiwyKSk7CS8vQmVsYXJ1cyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjU5LCJtZCIsMikpOwkvL01vbGRvdmEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI2MCwicGwiLDIpKTsJLy9Qb2xhbmQgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI2MiwiZGUiLDIsImRlIiwxMykpOwkvL0dlcm1hbnkgKEZlZGVyYWwgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjY2LCJnaSIsMikpOwkvL0dpYnJhbHRhcgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI2OCwicHQiLDIpKTsJLy9Qb3J0dWdhbAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3MCwibHUiLDIpKTsJLy9MdXhlbWJvdXJnCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjcyLCJpZSIsMiwiZW4iKSk7CS8vSXJlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3NCwiaXMiLDIpKTsJLy9JY2VsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjc2LCJhbCIsMikpOwkvL0FsYmFuaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3OCwibXQiLDIpKTsJLy9NYWx0YQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4MCwiY3kiLDIpKTsJLy9DeXBydXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4MiwiZ2UiLDIpKTsJLy9HZW9yZ2lhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjgzLCJhbSIsMikpOwkvL0FybWVuaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4NCwiYmciLDIpKTsJLy9CdWxnYXJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjg2LCJ0ciIsMikpOwkvL1R1cmtleQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4OCwiZm8iLDIpKTsJLy9GYXJvZSBJc2xhbmRzCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODksImdlIiwyKSk7ICAgIC8vQWJraGF6aWEgKEdlb3JnaWEpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjkwLCJnbCIsMikpOwkvL0dyZWVubGFuZCAoRGVubWFyaykKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTIsInNtIiwyKSk7CS8vU2FuIE1hcmlubyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjkzLCJzbCIsMikpOwkvL1Nsb3ZlbmlhIChSZXB1YmxpYyBvZikKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5NCwibWsiLDIpKTsgICAvL1RoZSBGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjk1LCJsaSIsMikpOwkvL0xpZWNodGVuc3RlaW4gKFByaW5jaXBhbGl0eSBvZikKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5NywibWUiLDIpKTsgICAgLy9Nb250ZW5lZ3JvIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMDIsImNhIiwzLCIiLDExKSk7CS8vQ2FuYWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzA4LCJwbSIsMikpOwkvL1NhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24gKENvbGxlY3Rpdml0IHRlcnJpdG9yaWFsZSBkZSBsYSBScHVibGlxdWUgZnJhbmFpc2UpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzEwLCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzExLCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzEyLCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzEzLCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzE0LCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzE1LCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzE2LCJ1cyIsMywiZW4iLDExKSk7CS8vVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzMwLCJwciIsMikpOwkvL1B1ZXJ0byBSaWNvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzMyLCJ2aSIsMikpOwkvL1VuaXRlZCBTdGF0ZXMgVmlyZ2luIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMzQsIm14IiwzKSk7CS8vTWV4aWNvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzM4LCJqbSIsMykpOwkvL0phbWFpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNDAsImdwIiwyKSk7CS8vR3VhZGVsb3VwZSAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQyLCJiYiIsMykpOwkvL0JhcmJhZG9zCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQ0LCJhZyIsMykpOwkvL0FudGlndWEgYW5kIEJhcmJ1ZGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNDYsImt5IiwzKSk7CS8vQ2F5bWFuIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNDgsInZnIiwzKSk7CS8vQnJpdGlzaCBWaXJnaW4gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1MCwiYm0iLDIpKTsJLy9CZXJtdWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzUyLCJnZCIsMikpOwkvL0dyZW5hZGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTQsIm1zIiwyKSk7CS8vTW9udHNlcnJhdAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1Niwia24iLDIpKTsJLy9TYWludCBLaXR0cyBhbmQgTmV2aXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTgsImxjIiwyKSk7CS8vU2FpbnQgTHVjaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjAsInZjIiwyKSk7CS8vU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjIsIm5sIiwyKSk7CS8vTmV0aGVybGFuZHMgQW50aWxsZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjMsImF3IiwyKSk7CS8vQXJ1YmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjQsImJzIiwyKSk7CS8vQmFoYW1hcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjUsImFpIiwzKSk7CS8vQW5ndWlsbGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjYsImRtIiwyKSk7CS8vRG9taW5pY2EgKENvbW1vbndlYWx0aCBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNjgsImN1IiwyKSk7CS8vQ3ViYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM3MCwiZG8iLDIpKTsJLy9Eb21pbmljYW4gUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzIsImh0IiwyKSk7CS8vSGFpdGkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM3NCwidHQiLDIpKTsJLy9UcmluaWRhZCBhbmQgVG9iYWdvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzc2LCJ0YyIsMikpOwkvL1R1cmtzIGFuZCBDYWljb3MgSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwMCwiYXoiLDIpKTsJLy9BemVyYmFpamFuaSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwMSwia3oiLDIpKTsJLy9LYXpha2hzdGFuIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDIsImJ0IiwyKSk7CS8vQmh1dGFuIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwNCwiaW4iLDIpKTsJLy9JbmRpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDA1LCJpbiIsMikpOwkvL0luZGlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTAsInBrIiwyKSk7CS8vUGFraXN0YW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDEyLCJhZiIsMikpOwkvL0FmZ2hhbmlzdGFuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDEzLCJsayIsMikpOwkvL1NyaSBMYW5rYSAoRGVtb2NyYXRpYyBTb2NpYWxpc3QgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE0LCJtbSIsMikpOwkvL015YW5tYXIgKFVuaW9uIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNSwibGIiLDIpKTsJLy9MZWJhbm9uCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE2LCJqbyIsMikpOwkvL0pvcmRhbiAoSGFzaGVtaXRlIEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE3LCJzeSIsMikpOwkvL1N5cmlhbiBBcmFiIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE4LCJpcSIsMikpOwkvL0lyYXEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxOSwia3ciLDIpKTsJLy9LdXdhaXQgKFN0YXRlIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMCwic2EiLDIpKTsJLy9TYXVkaSBBcmFiaWEgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDIxLCJ5ZSIsMikpOwkvL1llbWVuIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjIsIm9tIiwyKSk7CS8vT21hbiAoU3VsdGFuYXRlIG9mKQorICAgICAgICAgICAgICAgIHRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDIzLCJwcyIsMikpOyAgICAvL1BhbGVzdGluZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyNCwiYWUiLDIpKTsJLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyNSwiaWwiLDIpKTsJLy9Jc3JhZWwgKFN0YXRlIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyNiwiYmgiLDIpKTsJLy9CYWhyYWluIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyNywicWEiLDIpKTsJLy9RYXRhciAoU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI4LCJtbiIsMikpOwkvL01vbmdvbGlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI5LCJucCIsMikpOwkvL05lcGFsCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDMwLCJhZSIsMikpOwkvL1VuaXRlZCBBcmFiIEVtaXJhdGVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDMxLCJhZSIsMikpOwkvL1VuaXRlZCBBcmFiIEVtaXJhdGVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDMyLCJpciIsMikpOwkvL0lyYW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDM0LCJ1eiIsMikpOwkvL1V6YmVraXN0YW4gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzNiwidGoiLDIpKTsJLy9UYWppa2lzdGFuIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzcsImtnIiwyKSk7CS8vS3lyZ3l6IFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDM4LCJ0bSIsMikpOwkvL1R1cmttZW5pc3RhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ0MCwianAiLDIsImphIiwxNCkpOwkvL0phcGFuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDQxLCJqcCIsMiwiamEiLDE0KSk7CS8vSmFwYW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTAsImtyIiwyKSk7CS8vS29yZWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1Miwidm4iLDIpKTsJLy9WaWV0IE5hbSAoU29jaWFsaXN0IFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1NCwiaGsiLDIpKTsJLy8iSG9uZyBLb25nLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTUsIm1vIiwyKSk7CS8vIk1hY2FvLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTYsImtoIiwyKSk7CS8vQ2FtYm9kaWEgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDU3LCJsYSIsMikpOwkvL0xhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDYwLCJjbiIsMiwiemgiLDEzKSk7CS8vQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ2MSwiY24iLDIsInpoIiwxMykpOwkvL0NoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NjYsInR3IiwyKSk7CS8vIlRhaXdhbiwgQ2hpbmEiCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDY3LCJrcCIsMikpOwkvL0RlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YgS29yZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NzAsImJkIiwyKSk7CS8vQmFuZ2xhZGVzaCAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDcyLCJtdiIsMikpOwkvL01hbGRpdmVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MDIsIm15IiwyKSk7CS8vTWFsYXlzaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MDUsImF1IiwyLCJlbiIsMTEpKTsJLy9BdXN0cmFsaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTAsImlkIiwyKSk7CS8vSW5kb25lc2lhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTQsInRsIiwyKSk7CS8vRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBUaW1vci1MZXN0ZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUxNSwicGgiLDIpKTsJLy9QaGlsaXBwaW5lcyAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyMCwidGgiLDIpKTsJLy9UaGFpbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyNSwic2ciLDIsImVuIiwxMSkpOwkvL1NpbmdhcG9yZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTI4LCJibiIsMikpOwkvL0JydW5laSBEYXJ1c3NhbGFtCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTMwLCJueiIsMiwgImVuIikpOwkvL05ldyBaZWFsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM0LCJtcCIsMikpOwkvL05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzUsImd1IiwyKSk7CS8vR3VhbQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzNiwibnIiLDIpKTsJLy9OYXVydSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM3LCJwZyIsMikpOwkvL1BhcHVhIE5ldyBHdWluZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzksInRvIiwyKSk7CS8vVG9uZ2EgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQwLCJzYiIsMikpOwkvL1NvbG9tb24gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0MSwidnUiLDIpKTsJLy9WYW51YXR1IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDIsImZqIiwyKSk7CS8vRmlqaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQzLCJ3ZiIsMikpOwkvL1dhbGxpcyBhbmQgRnV0dW5hIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ0LCJhcyIsMikpOwkvL0FtZXJpY2FuIFNhbW9hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ1LCJraSIsMikpOwkvL0tpcmliYXRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDYsIm5jIiwyKSk7CS8vTmV3IENhbGVkb25pYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0NywicGYiLDIpKTsJLy9GcmVuY2ggUG9seW5lc2lhIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ4LCJjayIsMikpOwkvL0Nvb2sgSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0OSwid3MiLDIpKTsJLy9TYW1vYSAoSW5kZXBlbmRlbnQgU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUwLCJmbSIsMikpOwkvL01pY3JvbmVzaWEgKEZlZGVyYXRlZCBTdGF0ZXMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUxLCJtaCIsMikpOwkvL01hcnNoYWxsIElzbGFuZHMgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NTIsInB3IiwyKSk7CS8vUGFsYXUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwMiwiZWciLDIpKTsJLy9FZ3lwdCAoQXJhYiBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDMsImR6IiwyKSk7CS8vQWxnZXJpYSAoUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDQsIm1hIiwyKSk7CS8vTW9yb2NjbyAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDUsInRuIiwyKSk7CS8vVHVuaXNpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwNiwibHkiLDIpKTsJLy9MaWJ5YSAoU29jaWFsaXN0IFBlb3BsZSdzIExpYnlhbiBBcmFiIEphbWFoaXJpeWEpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA3LCJnbSIsMikpOwkvL0dhbWJpYSAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwOCwic24iLDIpKTsJLy9TZW5lZ2FsIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDksIm1yIiwyKSk7CS8vTWF1cml0YW5pYSAoSXNsYW1pYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTAsIm1sIiwyKSk7CS8vTWFsaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjExLCJnbiIsMikpOwkvL0d1aW5lYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEyLCJjaSIsMikpOwkvL0N0ZSBkJ0l2b2lyZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEzLCJiZiIsMikpOwkvL0J1cmtpbmEgRmFzbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNCwibmUiLDIpKTsJLy9OaWdlciAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNSwidGciLDIpKTsJLy9Ub2dvbGVzZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNiwiYmoiLDIpKTsJLy9CZW5pbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE3LCJtdSIsMikpOwkvL01hdXJpdGl1cyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE4LCJsciIsMikpOwkvL0xpYmVyaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxOSwic2wiLDIpKTsJLy9TaWVycmEgTGVvbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjAsImdoIiwyKSk7CS8vR2hhbmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjEsIm5nIiwyKSk7CS8vTmlnZXJpYSAoRmVkZXJhbCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjIsInRkIiwyKSk7CS8vQ2hhZCAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIzLCJjZiIsMikpOwkvL0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNCwiY20iLDIpKTsJLy9DYW1lcm9vbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI1LCJjdiIsMikpOwkvL0NhcGUgVmVyZGUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNiwic3QiLDIpKTsJLy9TYW8gVG9tZSBhbmQgUHJpbmNpcGUgKERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI3LCJncSIsMikpOwkvL0VxdWF0b3JpYWwgR3VpbmVhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjgsImdhIiwyKSk7CS8vR2Fib25lc2UgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjksImNnIiwyKSk7CS8vQ29uZ28gKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzAsImNnIiwyKSk7CS8vRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzEsImFvIiwyKSk7CS8vQW5nb2xhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzIsImd3IiwyKSk7CS8vR3VpbmVhLUJpc3NhdSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMzLCJzYyIsMikpOwkvL1NleWNoZWxsZXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNCwic2QiLDIpKTsJLy9TdWRhbiAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNSwicnciLDIpKTsJLy9Sd2FuZGEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNiwiZXQiLDIpKTsJLy9FdGhpb3BpYSAoRmVkZXJhbCBEZW1vY3JhdGljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNywic28iLDIpKTsJLy9Tb21hbGkgRGVtb2NyYXRpYyBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzOCwiZGoiLDIpKTsJLy9Eamlib3V0aSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjM5LCJrZSIsMikpOwkvL0tlbnlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDAsInR6IiwyKSk7CS8vVGFuemFuaWEgKFVuaXRlZCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDEsInVnIiwyKSk7CS8vVWdhbmRhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDIsImJpIiwyKSk7CS8vQnVydW5kaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQzLCJteiIsMikpOwkvL01vemFtYmlxdWUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NSwiem0iLDIpKTsJLy9aYW1iaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NiwibWciLDIpKTsJLy9NYWRhZ2FzY2FyIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDcsInJlIiwyKSk7CS8vUmV1bmlvbiAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ4LCJ6dyIsMikpOwkvL1ppbWJhYndlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDksIm5hIiwyKSk7CS8vTmFtaWJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUwLCJtdyIsMikpOwkvL01hbGF3aQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MSwibHMiLDIpKTsJLy9MZXNvdGhvIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MiwiYnciLDIpKTsJLy9Cb3Rzd2FuYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUzLCJzeiIsMikpOwkvL1N3YXppbGFuZCAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTQsImttIiwyKSk7CS8vQ29tb3JvcyAoVW5pb24gb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1NSwiemEiLDIsImVuIikpOwkvL1NvdXRoIEFmcmljYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjU3LCJlciIsMikpOwkvL0VyaXRyZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDIsImJ6IiwyKSk7CS8vQmVsaXplCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA0LCJndCIsMikpOwkvL0d1YXRlbWFsYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA2LCJzdiIsMikpOwkvL0VsIFNhbHZhZG9yIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDgsImhuIiwzKSk7CS8vSG9uZHVyYXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxMCwibmkiLDIpKTsJLy9OaWNhcmFndWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTIsImNyIiwyKSk7CS8vQ29zdGEgUmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxNCwicGEiLDIpKTsJLy9QYW5hbWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxNiwicGUiLDIpKTsJLy9QZXJ1CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzIyLCJhciIsMykpOwkvL0FyZ2VudGluZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcyNCwiYnIiLDIpKTsJLy9CcmF6aWwgKEZlZGVyYXRpdmUgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzMwLCJjbCIsMikpOwkvL0NoaWxlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzMyLCJjbyIsMykpOwkvL0NvbG9tYmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzQsInZlIiwyKSk7CS8vVmVuZXp1ZWxhIChCb2xpdmFyaWFuIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczNiwiYm8iLDIpKTsJLy9Cb2xpdmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzgsImd5IiwyKSk7CS8vR3V5YW5hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQwLCJlYyIsMikpOwkvL0VjdWFkb3IKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDIsImdmIiwyKSk7CS8vRnJlbmNoIEd1aWFuYSAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQ0LCJweSIsMikpOwkvL1BhcmFndWF5IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDYsInNyIiwyKSk7CS8vU3VyaW5hbWUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0OCwidXkiLDIpKTsJLy9VcnVndWF5IChFYXN0ZXJuIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc1MCwiZmsiLDIpKTsJLy9GYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcykKKyAgICAgICAgLy90YWJsZS5hZGQobmV3IE1jY0VudHJ5KDkwMSwiIiwyKSk7CS8vIkludGVybmF0aW9uYWwgTW9iaWxlLCBzaGFyZWQgY29kZSIKKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRhYmxlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZVRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlVGVzdC5qYXZhCmluZGV4IDJkNjk3N2MuLjdlYjNkZjggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlVGVzdC5qYXZhCkBAIC0yOCw3ICsyOCw3IEBACiAKICAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRpbWVab25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoMjA4KSwgIkV1cm9wZS9QYXJpcyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDIwOCksICJFQ1QiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYygyMzIpLCAiRXVyb3BlL1ZpZW5uYSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDY1NSksICJBZnJpY2EvSm9oYW5uZXNidXJnIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoNDQwKSwgIkFzaWEvVG9reW8iKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhCmluZGV4IGE3NGM1YzIuLmRlNTliODEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpAQCAtNDk2LDkgKzQ5NiwxMSBAQAogICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCIrMTgwMDEyMzQ1NjciKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIiIpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcihudWxsKSk7Ci0gICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXIgPQorICAgICAgICAvLyBUaGlzIHRlc3QgZmFpbHMgb24gYSBkZXZpY2Ugd2l0aG91dCBhIHNpbSBjYXJkCisgICAgICAgIC8qVGVsZXBob255TWFuYWdlciBtVGVsZXBob255TWFuYWdlciA9CiAgICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcilnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKICAgICAgICAgU3RyaW5nIG1Wb2ljZU1haWxOdW1iZXIgPSBtVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0Vm9pY2VNYWlsTnVtYmVyKCk7CiAgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcihtVm9pY2VNYWlsTnVtYmVyKSk7CisgICAgICAgICovCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIuamF2YQppbmRleCA2M2Q1MGM3Li43MGQxNjQzIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIuamF2YQpAQCAtNDk2LDkgKzQ5NiwxOCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBjdXJyZW50IHRocmVhZCBhcyBhIGxvb3Blci4KKyAgICAgKiA8cC8+CisgICAgICogRXhwb3NlZCBmb3IgdW5pdCB0ZXN0aW5nLgorICAgICAqLworICAgIHZvaWQgcHJlcGFyZUxvb3BlcigpIHsKKyAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAgICBMb29wZXIucHJlcGFyZSgpOworICAgICAgICBwcmVwYXJlTG9vcGVyKCk7CiAKICAgICAgICAgaWYgKG1KdXN0Q291bnQpIHsKICAgICAgICAgICAgIG1SZXN1bHRzLnB1dFN0cmluZyhJbnN0cnVtZW50YXRpb24uUkVQT1JUX0tFWV9JREVOVElGSUVSLCBSRVBPUlRfVkFMVUVfSUQpOwpAQCAtNTIxLDYgKzUzMCwxMSBAQAogICAgICAgICAgICAgICAgIGxvbmcgcnVuVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOwogCiAgICAgICAgICAgICAgICAgcmVzdWx0UHJpbnRlci5wcmludChtVGVzdFJ1bm5lci5nZXRUZXN0UmVzdWx0KCksIHJ1blRpbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAvLyBjYXRjaCBhbGwgZXhjZXB0aW9ucyBzbyBhIG1vcmUgdmVyYm9zZSBlcnJvciBtZXNzYWdlIGNhbiBiZSBvdXRwdXR0ZWQKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJUZXN0IHJ1biBhYm9ydGVkIGR1ZSB0byB1bmV4cGVjdGVkIGV4Y2VwdGlvbjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldE1lc3NhZ2UoKSkpOworICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIG1SZXN1bHRzLnB1dFN0cmluZyhJbnN0cnVtZW50YXRpb24uUkVQT1JUX0tFWV9TVFJFQU1SRVNVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJcblRlc3QgcmVzdWx0cyBmb3IgJXM9JXMiLApAQCAtNzYyLDkgKzc3NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVkVGVzdC5jbGFzcykuaW5jbHVkZURldGFpbGVkU3RhdHMoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUgLSB0aGUgdGVzdCB3aXRoIGdpdmVuIG5hbWUgY2Fubm90IGJlIGFjY2Vzc2VkLiBXaWxsIGJlIGhhbmRsZWQgZHVyaW5nCisgICAgICAgICAgICAgICAgLy8gdGVzdCBleGVjdXRpb24KICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUtIHRoZSB0ZXN0IHdpdGggZ2l2ZW4gbmFtZSBkb2VzIG5vdCBleGlzdC4gV2lsbCBiZSBoYW5kbGVkIGR1cmluZyB0ZXN0CisgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtSXNUaW1lZFRlc3QgJiYgbUluY2x1ZGVEZXRhaWxlZFN0YXRzKSB7CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEKaW5kZXggMjhlY2VlNS4uMWZiNTUzOCAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZTIuamF2YQpAQCAtMjcsMTUgKzI3LDQ0IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogCiAvKioKLSAqIFRoaXMgVGVzdENhc2UgY2xhc3MgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIGlzb2xhdGVkIHRlc3Rpbmcgb2YgYSBzaW5nbGUKLSAqIENvbnRlbnRQcm92aWRlci4gIEl0IHVzZXMgYSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0gdG8KLSAqIGFjY2VzcyB0aGUgcHJvdmlkZXIsIHJlc3RyaWN0cyB0aGUgcHJvdmlkZXIgdG8gYW4gaXNvbGF0ZWQgYXJlYSBvZiB0aGUKLSAqIGZpbGVzeXN0ZW0gKGZvciBzYWZlbHkgY3JlYXRpbmcgJiBtb2RpZnlpbmcgZGF0YWJhc2VzICYgZmlsZXMpLCBhbmQgaW5qZWN0cwotICoge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9IHRvIGlzb2xhdGUgdGhlIENvbnRlbnRQcm92aWRlciBmcm9tIHRoZQotICogcmVzdCBvZiB0aGUgcnVubmluZyBzeXN0ZW0uCi0gKgotICogPHA+VGhpcyBlbnZpcm9ubWVudCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkge0BsaW5rICNzZXRVcH0gYW5kIHtAbGluawotICogI3RlYXJEb3dufS4KKyAqIFRoaXMgdGVzdCBjYXNlIGNsYXNzIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciB0ZXN0aW5nIGEgc2luZ2xlCisgKiB7QGxpbmsgQ29udGVudFByb3ZpZGVyfSBhbmQgZm9yIHRlc3RpbmcgeW91ciBhcHAgY29kZSB3aXRoIGFuCisgKiBpc29sYXRlZCBjb250ZW50IHByb3ZpZGVyLiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBzeXN0ZW0gbWFwIG9mCisgKiBwcm92aWRlcnMgdGhhdCBpcyBiYXNlZCBvbiB0aGUgbWFuaWZlc3RzIG9mIG90aGVyIGFwcGxpY2F0aW9ucywgdGhlIHRlc3QKKyAqIGNhc2UgY3JlYXRlcyBpdHMgb3duIGludGVybmFsIG1hcC4gSXQgdGhlbiB1c2VzIHRoaXMgbWFwIHRvIHJlc29sdmUgcHJvdmlkZXJzCisgKiBnaXZlbiBhbiBhdXRob3JpdHkuIFRoaXMgYWxsb3dzIHlvdSB0byBpbmplY3QgdGVzdCBwcm92aWRlcnMgYW5kIHRvIG51bGwgb3V0CisgKiBwcm92aWRlcnMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gdXNlLgorICogPHA+CisgKiAgICAgIFRoaXMgdGVzdCBjYXNlIGFsc28gc2V0cyB1cCB0aGUgZm9sbG93aW5nIG1vY2sgb2JqZWN0czoKKyAqIDwvcD4KKyAqIDx1bD4KKyAqICAgICAgPGxpPgorICogICAgICAgICAgQW4ge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9IHRoYXQgc3R1YnMgb3V0IENvbnRleHQgbWV0aG9kcyB0aGF0IG1pZ2h0CisgKiAgICAgICAgICBhZmZlY3QgdGhlIHJlc3Qgb2YgdGhlIHJ1bm5pbmcgc3lzdGVtLCB3aGlsZSBhbGxvd2luZyB0ZXN0cyB0byBkbyByZWFsIGZpbGUgYW5kCisgKiAgICAgICAgICBkYXRhYmFzZSB3b3JrLgorICogICAgICA8L2xpPgorICogICAgICA8bGk+CisgKiAgICAgICAgICBBIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSB0aGF0IHByb3ZpZGVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGEKKyAqICAgICAgICAgIHJlZ3VsYXIgY29udGVudCByZXNvbHZlciwgYnV0IHVzZXMge0BsaW5rIElzb2xhdGVkQ29udGV4dH0uIEl0IHN0dWJzIG91dAorICogICAgICAgICAge0BsaW5rIENvbnRlbnRSZXNvbHZlciNub3RpZnlDaGFuZ2UoVXJpLCBDb250ZW50T2JzZXJ2ZXIsIGJvb2xlYW4pfSB0bworICogICAgICAgICAgcHJldmVudCB0aGUgdGVzdCBmcm9tIGFmZmVjdGluZyB0aGUgcnVubmluZyBzeXN0ZW0uCisgKiAgICAgIDwvbGk+CisgKiAgICAgIDxsaT4KKyAqICAgICAgICAgIEFuIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0LCBydW5uaW5nIGluIGFuIHtAbGluayBJc29sYXRlZENvbnRleHR9LgorICogICAgICA8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogICAgICBUaGlzIGZyYW1ld29yayBpcyBzZXQgdXAgYXV0b21hdGljYWxseSBieSB0aGUgYmFzZSBjbGFzcycge0BsaW5rICNzZXRVcCgpfSBtZXRob2QuIElmIHlvdQorICogICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCwgeW91IG11c3QgY2FsbCB0aGUgc3VwZXIgbWV0aG9kIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4KKyAqICAgICAgeW91ciBvdmVycmlkZS4KKyAqIDwvcD4KKyAqIDxwPgorICogICAgIEluIG9yZGVyIGZvciB0aGVpciB0ZXN0cyB0byBiZSBydW4sIGNvbmNyZXRlIHN1YmNsYXNzZXMgbXVzdCBwcm92aWRlIHRoZWlyIG93bgorICogICAgIGNvbnN0cnVjdG9yIHdpdGggbm8gYXJndW1lbnRzLiBUaGlzIGNvbnN0cnVjdG9yIG11c3QgY2FsbAorICogICAgIHtAbGluayAjUHJvdmlkZXJUZXN0Q2FzZTIoQ2xhc3MsIFN0cmluZyl9IGFzICBpdHMgZmlyc3Qgb3BlcmF0aW9uLgorICogPC9wPgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGVudCBwcm92aWRlciB0ZXN0aW5nLCBwbGVhc2Ugc2VlCisgKiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvcHJvdmlkZXJfdGVzdGluZy5odG1sIj5Db250ZW50IFByb3ZpZGVyIFRlc3Rpbmc8L2E+LgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvdmlkZXJUZXN0Q2FzZTI8VCBleHRlbmRzIENvbnRlbnRQcm92aWRlcj4gZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogCkBAIC01NCwzNCArODMsNTMgQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEZpbGUgZ2V0RGlyKFN0cmluZyBuYW1lLCBpbnQgbW9kZSkgewotICAgICAgICAgICAgLy8gbmFtZSB0aGUgZGlyZWN0b3J5IHNvIHRoZSBkaXJlY3Rvcnkgd2lsbCBiZSBzZXBlcmF0ZWQgZnJvbQorICAgICAgICAgICAgLy8gbmFtZSB0aGUgZGlyZWN0b3J5IHNvIHRoZSBkaXJlY3Rvcnkgd2lsbCBiZSBzZXBhcmF0ZWQgZnJvbQogICAgICAgICAgICAgLy8gb25lIGNyZWF0ZWQgdGhyb3VnaCB0aGUgcmVndWxhciBDb250ZXh0CiAgICAgICAgICAgICByZXR1cm4gZ2V0Q29udGV4dCgpLmdldERpcigibW9ja2NvbnRleHQyXyIgKyBuYW1lLCBtb2RlKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVyQ2xhc3MgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIHByb3ZpZGVyIHVuZGVyIHRlc3QKKyAgICAgKiBAcGFyYW0gcHJvdmlkZXJBdXRob3JpdHkgVGhlIHByb3ZpZGVyJ3MgYXV0aG9yaXR5IHN0cmluZworICAgICAqLwogICAgIHB1YmxpYyBQcm92aWRlclRlc3RDYXNlMihDbGFzczxUPiBwcm92aWRlckNsYXNzLCBTdHJpbmcgcHJvdmlkZXJBdXRob3JpdHkpIHsKICAgICAgICAgbVByb3ZpZGVyQ2xhc3MgPSBwcm92aWRlckNsYXNzOwogICAgICAgICBtUHJvdmlkZXJBdXRob3JpdHkgPSBwcm92aWRlckF1dGhvcml0eTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY29udGVudCBwcm92aWRlciB0aGF0IHdpbGwgYmUgc2V0IHVwIGZvciB1c2UgaW4gZWFjaCB0ZXN0IG1ldGhvZC4KLSAgICAgKi8KICAgICBwcml2YXRlIFQgbVByb3ZpZGVyOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudCBwcm92aWRlciBjcmVhdGVkIGJ5IHRoaXMgY2xhc3MgaW4gdGhlIHtAbGluayAjc2V0VXAoKX0gbWV0aG9kLgorICAgICAqIEByZXR1cm4gVCBBbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgY2xhc3MgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIHRlc3QgY2FzZSBjbGFzcy4KKyAgICAgKi8KICAgICBwdWJsaWMgVCBnZXRQcm92aWRlcigpIHsKICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QgZml4dHVyZS4KKyAgICAgKiA8cD4KKyAgICAgKiBDcmVhdGVzIGEgbmV3CisgICAgICoge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9LCBhIG5ldyBJc29sYXRlZENvbnRleHQKKyAgICAgKiB0aGF0IGlzb2xhdGVzIHRoZSBwcm92aWRlcidzIGZpbGUgb3BlcmF0aW9ucywgYW5kIGEgbmV3IGluc3RhbmNlIG9mCisgICAgICogdGhlIHByb3ZpZGVyIHVuZGVyIHRlc3Qgd2l0aGluIHRoZSBpc29sYXRlZCBlbnZpcm9ubWVudC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAKICAgICAgICAgbVJlc29sdmVyID0gbmV3IE1vY2tDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lUHJlZml4ID0gInRlc3QuIjsKLSAgICAgICAgUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dCB0YXJnZXRDb250ZXh0V3JhcHBlciA9IG5ldyBSZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0KAotICAgICAgICAgICAgICAgIG5ldyBNb2NrQ29udGV4dDIoKSwgLy8gVGhlIGNvbnRleHQgdGhhdCBtb3N0IG1ldGhvZHMgYXJlIGRlbGVnYXRlZCB0bworICAgICAgICBSZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0IHRhcmdldENvbnRleHRXcmFwcGVyID0gbmV3CisgICAgICAgICAgICAgICAgUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dCgKKyAgICAgICAgICAgICAgICBuZXcgTW9ja0NvbnRleHQyKCksIC8vIFRoZSBjb250ZXh0IHRoYXQgbW9zdCBtZXRob2RzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kZWxlZ2F0ZWQgdG8KICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCksIC8vIFRoZSBjb250ZXh0IHRoYXQgZmlsZSBtZXRob2RzIGFyZSBkZWxlZ2F0ZWQgdG8KICAgICAgICAgICAgICAgICBmaWxlbmFtZVByZWZpeCk7CiAgICAgICAgIG1Qcm92aWRlckNvbnRleHQgPSBuZXcgSXNvbGF0ZWRDb250ZXh0KG1SZXNvbHZlciwgdGFyZ2V0Q29udGV4dFdyYXBwZXIpOwpAQCAtOTIsMTQgKzE0MCw1NSBAQAogICAgICAgICBtUmVzb2x2ZXIuYWRkUHJvdmlkZXIobVByb3ZpZGVyQXV0aG9yaXR5LCBnZXRQcm92aWRlcigpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgTW9ja0NvbnRlbnRSZXNvbHZlcn0gY3JlYXRlZCBieSB0aGlzIGNsYXNzIGR1cmluZyBpbml0aWFsaXphdGlvbi4gWW91CisgICAgICogbXVzdCB1c2UgdGhlIG1ldGhvZHMgb2YgdGhpcyByZXNvbHZlciB0byBhY2Nlc3MgdGhlIHByb3ZpZGVyIHVuZGVyIHRlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIE1vY2tDb250ZW50UmVzb2x2ZXJ9IGluc3RhbmNlLgorICAgICAqLwogICAgIHB1YmxpYyBNb2NrQ29udGVudFJlc29sdmVyIGdldE1vY2tDb250ZW50UmVzb2x2ZXIoKSB7CiAgICAgICAgIHJldHVybiBtUmVzb2x2ZXI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIElzb2xhdGVkQ29udGV4dH0gY3JlYXRlZCBieSB0aGlzIGNsYXNzIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgSXNvbGF0ZWRDb250ZXh0fSBpbnN0YW5jZQorICAgICAqLwogICAgIHB1YmxpYyBJc29sYXRlZENvbnRleHQgZ2V0TW9ja0NvbnRleHQoKSB7CiAgICAgICAgIHJldHVybiBtUHJvdmlkZXJDb250ZXh0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIDxwPgorICAgICAqICAgICAgQ3JlYXRlcyBhIG5ldyBjb250ZW50IHByb3ZpZGVyIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhhdCBwYXNzZWQgdG8gdGhlIHRlc3QgY2FzZSBjbGFzcywKKyAgICAgKiAgICAgIHdpdGggYW4gYXV0aG9yaXR5IG5hbWUgc2V0IHRvIHRoZSBhdXRob3JpdHkgcGFyYW1ldGVyLCBhbmQgdXNpbmcgYW4gU1FMaXRlIGRhdGFiYXNlIGFzCisgICAgICogICAgICB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZS4gVGhlIFNRTCBzdGF0ZW1lbnQgcGFyYW1ldGVyIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBkYXRhYmFzZS4KKyAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGFsc28gY3JlYXRlcyBhIG5ldyB7QGxpbmsgTW9ja0NvbnRlbnRSZXNvbHZlcn0gYW5kIGFkZHMgdGhlIHByb3ZpZGVyIHRvIGl0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiAgICAgIEJvdGggdGhlIG5ldyBwcm92aWRlciBhbmQgdGhlIG5ldyByZXNvbHZlciBhcmUgcHV0IGludG8gYW4ge0BsaW5rIElzb2xhdGVkQ29udGV4dH0KKyAgICAgKiAgICAgIHRoYXQgdXNlcyB0aGUgdGFyZ2V0Q29udGV4dCBwYXJhbWV0ZXIgZm9yIGZpbGUgb3BlcmF0aW9ucyBhbmQgYSB7QGxpbmsgTW9ja0NvbnRleHR9CisgICAgICogICAgICBmb3IgZXZlcnl0aGluZyBlbHNlLiBUaGUgSXNvbGF0ZWRDb250ZXh0IHByZXBlbmRzIHRoZSBmaWxlbmFtZVByZWZpeCBwYXJhbWV0ZXIgdG8KKyAgICAgKiAgICAgIGZpbGUsIGRhdGFiYXNlLCBhbmQgZGlyZWN0b3J5IG5hbWVzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgIm1vY2siIHByb3ZpZGVyIHRoYXQgY2FuIGNvbnRhaW4gdGVzdCBkYXRhLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXRDb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSBhcyB0aGUgYmFzaXMgb2YgdGhlIElzb2xhdGVkQ29udGV4dAorICAgICAqIEBwYXJhbSBmaWxlbmFtZVByZWZpeCBBIHN0cmluZyB0aGF0IGlzIHByZXBlbmRlZCB0byBmaWxlLCBkYXRhYmFzZSwgYW5kIGRpcmVjdG9yeSBuYW1lcworICAgICAqIEBwYXJhbSBwcm92aWRlckNsYXNzIFRoZSB0eXBlIG9mIHRoZSBwcm92aWRlciBiZWluZyB0ZXN0ZWQKKyAgICAgKiBAcGFyYW0gYXV0aG9yaXR5IFRoZSBhdXRob3JpdHkgc3RyaW5nIHRvIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGVzdCBwcm92aWRlcgorICAgICAqIEBwYXJhbSBkYXRhYmFzZU5hbWUgVGhlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGRhdGFiYXNlVmVyc2lvbiBUaGUgdmVyc2lvbiBhc3NpZ25lZCB0byB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gc3FsIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFNRTCBzdGF0ZW1lbnRzIHRoYXQgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGRlc2lyZWQKKyAgICAgKiBkYXRhYmFzZSBhbmQgaXRzIHRhYmxlcy4gVGhlIGZvcm1hdCBpcyB0aGUgc2FtZSBhcyB0aGF0IGdlbmVyYXRlZCBieSB0aGUKKyAgICAgKiA8YSBocmVmPSJodHRwOi8vd3d3LnNxbGl0ZS5vcmcvc3FsaXRlLmh0bWwiPnNxbGl0ZTM8L2E+IHRvb2wncyA8Y29kZT4uZHVtcDwvY29kZT4gY29tbWFuZC4KKyAgICAgKiBAcmV0dXJuIENvbnRlbnRSZXNvbHZlciBBIG5ldyB7QGxpbmsgTW9ja0NvbnRlbnRSZXNvbHZlcn0gbGlua2VkIHRvIHRoZSBwcm92aWRlcgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIENvbnRlbnRQcm92aWRlcj4gQ29udGVudFJlc29sdmVyIG5ld1Jlc29sdmVyV2l0aENvbnRlbnRQcm92aWRlckZyb21TcWwoCiAgICAgICAgICAgICBDb250ZXh0IHRhcmdldENvbnRleHQsIFN0cmluZyBmaWxlbmFtZVByZWZpeCwgQ2xhc3M8VD4gcHJvdmlkZXJDbGFzcywgU3RyaW5nIGF1dGhvcml0eSwKICAgICAgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUsIGludCBkYXRhYmFzZVZlcnNpb24sIFN0cmluZyBzcWwpCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1NlcnZpY2VUZXN0Q2FzZS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9TZXJ2aWNlVGVzdENhc2UuamF2YQppbmRleCBkOTI2MmY2Li5mOWU4YWRiIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1NlcnZpY2VUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvU2VydmljZVRlc3RDYXNlLmphdmEKQEAgLTMxLDQyICszMSw2NCBAQAogLyoqCiAgKiBUaGlzIHRlc3QgY2FzZSBwcm92aWRlcyBhIGZyYW1ld29yayBpbiB3aGljaCB5b3UgY2FuIHRlc3QgU2VydmljZSBjbGFzc2VzIGluCiAgKiBhIGNvbnRyb2xsZWQgZW52aXJvbm1lbnQuICBJdCBwcm92aWRlcyBiYXNpYyBzdXBwb3J0IGZvciB0aGUgbGlmZWN5Y2xlIG9mIGEKLSAqIFNlcnZpY2UsIGFuZCBob29rcyBieSB3aGljaCB5b3UgY2FuIGluamVjdCB2YXJpb3VzIGRlcGVuZGVuY2llcyBhbmQgY29udHJvbAorICogU2VydmljZSwgYW5kIGhvb2tzIHdpdGggd2hpY2ggeW91IGNhbiBpbmplY3QgdmFyaW91cyBkZXBlbmRlbmNpZXMgYW5kIGNvbnRyb2wKICAqIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB5b3VyIFNlcnZpY2UgaXMgdGVzdGVkLgogICoKICAqIDxwPjxiPkxpZmVjeWNsZSBTdXBwb3J0LjwvYj4KLSAqIEV2ZXJ5IFNlcnZpY2UgaXMgZGVzaWduZWQgdG8gYmUgYWNjZXNzZWQgd2l0aGluIGEgc3BlY2lmaWMgc2VxdWVuY2Ugb2YKLSAqIGNhbGxzLiAgPGluc2VydCBsaW5rIHRvIFNlcnZpY2UgbGlmZWN5Y2xlIGRvYyBoZXJlPi4gCi0gKiBJbiBvcmRlciB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgb2YgYSBTZXJ2aWNlLCB0aGlzIHRlc3QgY2FzZSB3aWxsIG1ha2UgdGhlCi0gKiBmb2xsb3dpbmcgY2FsbHMgYXQgdGhlIGZvbGxvd2luZyB0aW1lcy4KKyAqIEEgU2VydmljZSBpcyBhY2Nlc3NlZCB3aXRoIGEgc3BlY2lmaWMgc2VxdWVuY2Ugb2YKKyAqIGNhbGxzLCBhcyBkb2N1bWVudGVkIGluIHRoZSBzZWN0aW9uCisgKiA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuaHRtbCNzZXJ2bGlmZSI+CisgKiBTZXJ2aWNlIGxpZmVjeWNsZTwvYT4gaW4gdGhlIERldmVsb3BlciBHdWlkZS4gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG9mIGEgU2VydmljZSwKKyAqIDxjb2RlPlNlcnZpY2VUZXN0Q2FzZTwvY29kZT4gZW5mb3JjZXMgdGhpcyBwcm90b2NvbDoKICAqCi0gKiA8dWw+PGxpPlRoZSB0ZXN0IGNhc2Ugd2lsbCBub3QgY2FsbCBvbkNyZWF0ZSgpIHVudGlsIHlvdXIgdGVzdCBjYWxscyAKLSAqIHtAbGluayAjc3RhcnRTZXJ2aWNlfSBvciB7QGxpbmsgI2JpbmRTZXJ2aWNlfS4gIFRoaXMgZ2l2ZXMgeW91IGEgY2hhbmNlCi0gKiB0byBzZXQgdXAgb3IgYWRqdXN0IGFueSBhZGRpdGlvbmFsIGZyYW1ld29yayBvciB0ZXN0IGxvZ2ljIGJlZm9yZQotICogb25DcmVhdGUoKS48L2xpPgotICogPGxpPldoZW4geW91ciB0ZXN0IGNhbGxzIHtAbGluayAjc3RhcnRTZXJ2aWNlfSBvciB7QGxpbmsgI2JpbmRTZXJ2aWNlfQotICogdGhlIHRlc3QgY2FzZSB3aWxsIGNhbGwgb25DcmVhdGUoKSwgYW5kIHRoZW4gY2FsbCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBwb2ludCBpbiB5b3VyIHNlcnZpY2UuCi0gKiBJdCB3aWxsIHJlY29yZCBhbnkgcGFyYW1ldGVycyBvciBvdGhlciBzdXBwb3J0IHZhbHVlcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlLjwvbGk+Ci0gKiA8bGk+QWZ0ZXIgeW91ciB0ZXN0IGNvbXBsZXRlcywgdGhlIHRlc3QgY2FzZSB7QGxpbmsgI3RlYXJEb3dufSBmdW5jdGlvbiBpcwotICogYXV0b21hdGljYWxseSBjYWxsZWQsIGFuZCBpdCB3aWxsIHN0b3AgYW5kIGRlc3Ryb3kgeW91ciBzZXJ2aWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0gKiBjYWxscyAoZGVwZW5kaW5nIG9uIGhvdyB5b3VyIHRlc3QgaW52b2tlZCB0aGUgc2VydmljZS4pPC9saT4KKyAqIDx1bD4KKyAqICAgICAgPGxpPgorICogICAgICAgICAgVGhlIHtAbGluayAjc2V0VXAoKX0gbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgZWFjaCB0ZXN0IG1ldGhvZC4gVGhlIGJhc2UgaW1wbGVtZW50YXRpb24KKyAqICAgICAgICAgIGdldHMgdGhlIHN5c3RlbSBjb250ZXh0LiBJZiB5b3Ugb3ZlcnJpZGUgPGNvZGU+c2V0VXAoKTwvY29kZT4sIHlvdSBtdXN0IGNhbGwKKyAqICAgICAgICAgIDxjb2RlPnN1cGVyLnNldFVwKCk8L2NvZGU+IGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4geW91ciBvdmVycmlkZS4KKyAqICAgICAgPC9saT4KKyAqICAgICAgPGxpPgorICogICAgICAgICAgVGhlIHRlc3QgY2FzZSB3YWl0cyB0byBjYWxsIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uQ3JlYXRlKCl9IHVudGlsIG9uZSBvZiB5b3VyCisgKiAgICAgICAgICB0ZXN0IG1ldGhvZHMgY2FsbHMge0BsaW5rICNzdGFydFNlcnZpY2V9IG9yIHtAbGluayAjYmluZFNlcnZpY2V9LiAgVGhpcyBnaXZlcyB5b3UgYW4KKyAqICAgICAgICAgIG9wcG9ydHVuaXR5IHRvIHNldCB1cCBvciBhZGp1c3QgYW55IGFkZGl0aW9uYWwgZnJhbWV3b3JrIG9yIHRlc3QgbG9naWMgYmVmb3JlIHlvdSB0ZXN0CisgKiAgICAgICAgICB0aGUgcnVubmluZyBzZXJ2aWNlLgorICogICAgICA8L2xpPgorICogICAgICA8bGk+CisgKiAgICAgICAgICBXaGVuIG9uZSBvZiB5b3VyIHRlc3QgbWV0aG9kcyBjYWxscyB7QGxpbmsgI3N0YXJ0U2VydmljZSBTZXJ2aWNlVGVzdENhc2Uuc3RhcnRTZXJ2aWNlKCl9CisgKiAgICAgICAgICBvciB7QGxpbmsgI2JpbmRTZXJ2aWNlICBTZXJ2aWNlVGVzdENhc2UuYmluZFNlcnZpY2UoKX0sIHRoZSB0ZXN0IGNhc2UgY2FsbHMKKyAqICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uQ3JlYXRlKCkgU2VydmljZS5vbkNyZWF0ZSgpfSBhbmQgdGhlbiBjYWxscyBlaXRoZXIKKyAqICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI3N0YXJ0U2VydmljZShJbnRlbnQpIFNlcnZpY2Uuc3RhcnRTZXJ2aWNlKEludGVudCl9IG9yCisgKiAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNiaW5kU2VydmljZShJbnRlbnQsIFNlcnZpY2VDb25uZWN0aW9uLCBpbnQpCisgKiAgICAgICAgICBTZXJ2aWNlLmJpbmRTZXJ2aWNlKEludGVudCwgU2VydmljZUNvbm5lY3Rpb24sIGludCl9LCBhcyBhcHByb3ByaWF0ZS4gSXQgYWxzbyBzdG9yZXMKKyAqICAgICAgICAgIHZhbHVlcyBuZWVkZWQgdG8gdHJhY2sgYW5kIHN1cHBvcnQgdGhlIGxpZmVjeWNsZS4KKyAqICAgICAgPC9saT4KKyAqICAgICAgPGxpPgorICogICAgICAgICAgQWZ0ZXIgZWFjaCB0ZXN0IG1ldGhvZCBmaW5pc2hlcywgdGhlIHRlc3QgY2FzZSBjYWxscyB0aGUge0BsaW5rICN0ZWFyRG93bn0gbWV0aG9kLiBUaGlzCisgKiAgICAgICAgICBtZXRob2Qgc3RvcHMgYW5kIGRlc3Ryb3lzIHRoZSBzZXJ2aWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNhbGxzLCBkZXBlbmRpbmcgb24gaG93IHRoZQorICogICAgICAgICAgc2VydmljZSB3YXMgc3RhcnRlZC4gSWYgeW91IG92ZXJyaWRlIDxjb2RlPnRlYXJEb3duKCk8L2NvZGU+LCB5b3VyIG11c3QgY2FsbCB0aGUKKyAqICAgICAgICAgIDxjb2RlPnN1cGVyLnRlYXJEb3duKCk8L2NvZGU+IGFzIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB5b3VyIG92ZXJyaWRlLgorICogICAgICA8L2xpPgogICogPC91bD4KLSAqIAotICogPHA+PGI+RGVwZW5kZW5jeSBJbmplY3Rpb24uPC9iPgotICogRXZlcnkgc2VydmljZSBoYXMgdHdvIGluaGVyZW50IGRlcGVuZGVuY2llcywgdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCBDb250ZXh0fSBpbgotICogd2hpY2ggaXQgcnVucywgYW5kIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQXBwbGljYXRpb24gQXBwbGljYXRpb259IHdpdGggd2hpY2ggaXQgaXMgYXNzb2NpYXRlZC4KLSAqIFRoaXMgZnJhbWV3b3JrIGFsbG93cyB5b3UgdG8gaW5qZWN0IG1vZGlmaWVkLCBtb2NrLCBvciBpc29sYXRlZCByZXBsYWNlbWVudHMgZm9yIHRoZXNlIAotICogZGVwZW5kZW5jaWVzLCBhbmQgdGh1cyBwZXJmb3JtIGEgdHJ1ZSB1bml0IHRlc3QuCi0gKiAKLSAqIDxwPklmIHNpbXBseSBydW4geW91ciB0ZXN0cyBhcy1pcywgeW91ciBTZXJ2aWNlIHdpbGwgYmUgaW5qZWN0ZWQgd2l0aCBhIGZ1bGx5LWZ1bmN0aW9uYWwKLSAqIENvbnRleHQsIGFuZCBhIGdlbmVyaWMge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbiBNb2NrQXBwbGljYXRpb259IG9iamVjdC4KLSAqIFlvdSBjYW4gY3JlYXRlIGFuZCBpbmplY3QgYWx0ZXJuYXRpdmVzIHRvIGVpdGhlciBvZiB0aGVzZSBieSBjYWxsaW5nIAotICoge0BsaW5rIEFuZHJvaWRUZXN0Q2FzZSNzZXRDb250ZXh0KENvbnRleHQpIHNldENvbnRleHQoKX0gb3IgCi0gKiB7QGxpbmsgI3NldEFwcGxpY2F0aW9uIHNldEFwcGxpY2F0aW9uKCl9LiAgWW91IG11c3QgZG8gdGhpcyA8aT5iZWZvcmU8L2k+IGNhbGxpbmcKLSAqIHN0YXJ0U2VydmljZSgpIG9yIGJpbmRTZXJ2aWNlKCkuICBUaGUgdGVzdCBmcmFtZXdvcmsgcHJvdmlkZXMgYQotICogbnVtYmVyIG9mIGFsdGVybmF0aXZlcyBmb3IgQ29udGV4dCwgaW5jbHVkaW5nIHtsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0IE1vY2tDb250ZXh0fSwgCi0gKiB7QGxpbmsgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQgUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0sIGFuZCAKLSAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXIgQ29udGV4dFdyYXBwZXJ9LgorICoKKyAqIDxwPgorICogICAgICA8c3Ryb25nPkRlcGVuZGVuY3kgSW5qZWN0aW9uLjwvc3Ryb25nPgorICogICAgICBBIHNlcnZpY2UgaGFzIHR3byBpbmhlcmVudCBkZXBlbmRlbmNpZXMsIGl0cyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgQ29udGV4dH0gYW5kIGl0cworICogICAgICBhc3NvY2lhdGVkIHtAbGluayBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbiBBcHBsaWNhdGlvbn0uIFRoZSBTZXJ2aWNlVGVzdENhc2UgZnJhbWV3b3JrCisgKiAgICAgIGFsbG93cyB5b3UgdG8gaW5qZWN0IG1vZGlmaWVkLCBtb2NrLCBvciBpc29sYXRlZCByZXBsYWNlbWVudHMgZm9yIHRoZXNlIGRlcGVuZGVuY2llcywgYW5kCisgKiAgICAgIHRodXMgcGVyZm9ybSB1bml0IHRlc3RzIHdpdGggY29udHJvbGxlZCBkZXBlbmRlbmNpZXMgaW4gYW4gaXNvbGF0ZWQgZW52aXJvbm1lbnQuCisgKiA8L3A+CisgKiA8cD4KKyAqICAgICAgQnkgZGVmYXVsdCwgdGhlIHRlc3QgY2FzZSBpcyBpbmplY3RlZCB3aXRoIGEgZnVsbCBzeXN0ZW0gY29udGV4dCBhbmQgYSBnZW5lcmljCisgKiAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb24gTW9ja0FwcGxpY2F0aW9ufSBvYmplY3QuIFlvdSBjYW4gaW5qZWN0CisgKiAgICAgIGFsdGVybmF0aXZlcyB0byBlaXRoZXIgb2YgdGhlc2UgYnkgaW52b2tpbmcKKyAqICAgICAge0BsaW5rIEFuZHJvaWRUZXN0Q2FzZSNzZXRDb250ZXh0KENvbnRleHQpIHNldENvbnRleHQoKX0gb3IKKyAqICAgICAge0BsaW5rICNzZXRBcHBsaWNhdGlvbiBzZXRBcHBsaWNhdGlvbigpfS4gIFlvdSBtdXN0IGRvIHRoaXMgPGVtPmJlZm9yZTwvZW0+IGNhbGxpbmcKKyAqICAgICAgc3RhcnRTZXJ2aWNlKCkgb3IgYmluZFNlcnZpY2UoKS4gIFRoZSB0ZXN0IGZyYW1ld29yayBwcm92aWRlcyBhCisgKiAgICAgIG51bWJlciBvZiBhbHRlcm5hdGl2ZXMgZm9yIENvbnRleHQsIGluY2x1ZGluZworICogICAgICB7bGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGV4dCBNb2NrQ29udGV4dH0sCisgKiAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dCBSZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0fSwKKyAqICAgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlciBDb250ZXh0V3JhcHBlcn0sIGFuZAorICogICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0uCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2aWNlVGVzdENhc2U8VCBleHRlbmRzIFNlcnZpY2U+IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIApAQCAtNzUsNiArOTcsMTAgQEAKICAgICBwcml2YXRlIENvbnRleHQgbVN5c3RlbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbiBtQXBwbGljYXRpb247CiAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBzZXJ2aWNlQ2xhc3MgVGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKi8KICAgICBwdWJsaWMgU2VydmljZVRlc3RDYXNlKENsYXNzPFQ+IHNlcnZpY2VDbGFzcykgewogICAgICAgICBtU2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOwogICAgIH0KQEAgLTg4LDMwICsxMTQsMzUgQEAKICAgICBwcml2YXRlIGludCBtU2VydmljZUlkOwogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhY3R1YWwgc2VydmljZSB1bmRlciB0ZXN0LgorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4gVGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbgorICAgICAqIGEgdGVzdCBjYWxscyB7QGxpbmsgI3N0YXJ0U2VydmljZX0gb3Ige0BsaW5rICNiaW5kU2VydmljZX0uCiAgICAgICovCiAgICAgcHVibGljIFQgZ2V0U2VydmljZSgpIHsKICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBkbyB0aGUgd29yayB0byBpbnN0YW50aWF0ZSB0aGUgU2VydmljZSB1bmRlciB0ZXN0LiAgQWZ0ZXIgdGhpcywgeW91ciB0ZXN0IAotICAgICAqIGNvZGUgbXVzdCBhbHNvIHN0YXJ0IGFuZCBzdG9wIHRoZSBzZXJ2aWNlLgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgc3lzdGVtIGNvbnRleHQgYW5kIHN0b3JlcyBpdC4KKyAgICAgKgorICAgICAqIEV4dGVuZCB0aGlzIG1ldGhvZCB0byBkbyB5b3VyIG93biB0ZXN0IGluaXRpYWxpemF0aW9uLiBJZiB5b3UgZG8gc28sIHlvdQorICAgICAqIG11c3QgY2FsbCA8Y29kZT5zdXBlci5zZXRVcCgpPC9jb2RlPiBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHlvdXIgb3ZlcnJpZGUuIFRoZSBtZXRob2QgaXMKKyAgICAgKiBjYWxsZWQgYmVmb3JlIGVhY2ggdGVzdCBtZXRob2QgaXMgZXhlY3V0ZWQuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gZ2V0IHRoZSByZWFsIGNvbnRleHQsIGJlZm9yZSB0aGUgaW5kaXZpZHVhbCB0ZXN0cyBoYXZlIGEgY2hhbmNlIHRvIG11Y2sgd2l0aCBpdAogICAgICAgICBtU3lzdGVtQ29udGV4dCA9IGdldENvbnRleHQoKTsKIAogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgc2VydmljZSB1bmRlciB0ZXN0IGFuZCBhdHRhY2ggYWxsIGluamVjdGVkIGRlcGVuZGVuY2llcyAoQ29udGV4dCwgQXBwbGljYXRpb24pIHRvCi0gICAgICogaXQuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkge0BsaW5rICNzdGFydFNlcnZpY2V9IG9yIGJ5IHtAbGluayAjYmluZFNlcnZpY2V9LgotICAgICAqIElmIHlvdSB3aXNoIHRvIGNhbGwge0BsaW5rIEFuZHJvaWRUZXN0Q2FzZSNzZXRDb250ZXh0KENvbnRleHQpIHNldENvbnRleHQoKX0gb3IgCi0gICAgICoge0BsaW5rICNzZXRBcHBsaWNhdGlvbiBzZXRBcHBsaWNhdGlvbigpfSwgeW91IG11c3QgZG8gc28gIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICAgICogQ3JlYXRlcyB0aGUgc2VydmljZSB1bmRlciB0ZXN0IGFuZCBhdHRhY2hlcyBhbGwgaW5qZWN0ZWQgZGVwZW5kZW5jaWVzCisgICAgICogKENvbnRleHQsIEFwcGxpY2F0aW9uKSB0byBpdC4gIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkge0BsaW5rICNzdGFydFNlcnZpY2V9IG9yCisgICAgICogYnkge0BsaW5rICNiaW5kU2VydmljZX0uCisgICAgICogSWYgeW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgQW5kcm9pZFRlc3RDYXNlI3NldENvbnRleHQoQ29udGV4dCkgc2V0Q29udGV4dCgpfSBvcgorICAgICAqIHtAbGluayAjc2V0QXBwbGljYXRpb24gc2V0QXBwbGljYXRpb24oKX0sIGRvIHNvIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHNldHVwU2VydmljZSgpIHsKICAgICAgICAgbVNlcnZpY2UgPSBudWxsOwpAQCAtMTMxLDYwICsxNjIsNzQgQEAKICAgICAgICAgICAgICAgICBnZXRBcHBsaWNhdGlvbigpLAogICAgICAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgLy8gbW9ja2VkIHNlcnZpY2VzIGRvbid0IHRhbGsgd2l0aCB0aGUgYWN0aXZpdHkgbWFuYWdlcgogICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIAorCiAgICAgICAgIGFzc2VydE5vdE51bGwobVNlcnZpY2UpOwotICAgICAgICAKKwogICAgICAgICBtU2VydmljZUlkID0gbmV3IFJhbmRvbSgpLm5leHRJbnQoKTsKICAgICAgICAgbVNlcnZpY2VBdHRhY2hlZCA9IHRydWU7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU3RhcnQgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdCwgaW4gdGhlIHNhbWUgd2F5IGFzIGlmIGl0IHdhcyBzdGFydGVkIGJ5Ci0gICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3N0YXJ0U2VydmljZSBDb250ZXh0LnN0YXJ0U2VydmljZSgpfSwgcHJvdmlkaW5nIHRoZSAKLSAgICAgKiBhcmd1bWVudHMgaXQgc3VwcGxpZWQuICBJZiB5b3UgdXNlIHRoaXMgbWV0aG9kIHRvIHN0YXJ0IHRoZSBzZXJ2aWNlLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkKLSAgICAgKiBiZSBzdG9wcGVkIGJ5IHtAbGluayAjdGVhckRvd259LgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBJbnRlbnQgYXMgaWYgc3VwcGxpZWQgdG8ge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3N0YXJ0U2VydmljZX0uCisgICAgICogU3RhcnRzIHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QsIGluIHRoZSBzYW1lIHdheSBhcyBpZiBpdCB3ZXJlIHN0YXJ0ZWQgYnkKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjc3RhcnRTZXJ2aWNlKEludGVudCkgQ29udGV4dC5zdGFydFNlcnZpY2UoSW50ZW50KX0gd2l0aAorICAgICAqIGFuIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50fSB0aGF0IGlkZW50aWZpZXMgYSBzZXJ2aWNlLgorICAgICAqIElmIHlvdSB1c2UgdGhpcyBtZXRob2QgdG8gc3RhcnQgdGhlIHNlcnZpY2UsIGl0IGlzIGF1dG9tYXRpY2FsbHkgc3RvcHBlZCBieQorICAgICAqIHtAbGluayAjdGVhckRvd259LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVudCBBbiBJbnRlbnQgdGhhdCBpZGVudGlmaWVzIGEgc2VydmljZSwgb2YgdGhlIHNhbWUgZm9ybSBhcyB0aGUgSW50ZW50IHBhc3NlZCB0bworICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdGFydFNlcnZpY2UoSW50ZW50KSBDb250ZXh0LnN0YXJ0U2VydmljZShJbnRlbnQpfS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydFNlcnZpY2UoSW50ZW50IGludGVudCkgewogICAgICAgICBpZiAoIW1TZXJ2aWNlQXR0YWNoZWQpIHsKICAgICAgICAgICAgIHNldHVwU2VydmljZSgpOwogICAgICAgICB9CiAgICAgICAgIGFzc2VydE5vdE51bGwobVNlcnZpY2UpOwotICAgICAgICAKKwogICAgICAgICBpZiAoIW1TZXJ2aWNlQ3JlYXRlZCkgewogICAgICAgICAgICAgbVNlcnZpY2Uub25DcmVhdGUoKTsKICAgICAgICAgICAgIG1TZXJ2aWNlQ3JlYXRlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgbVNlcnZpY2Uub25TdGFydENvbW1hbmQoaW50ZW50LCAwLCBtU2VydmljZUlkKTsKLSAgICAgICAgCisKICAgICAgICAgbVNlcnZpY2VTdGFydGVkID0gdHJ1ZTsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3RhcnQgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdCwgaW4gdGhlIHNhbWUgd2F5IGFzIGlmIGl0IHdhcyBzdGFydGVkIGJ5Ci0gICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2JpbmRTZXJ2aWNlIENvbnRleHQuYmluZFNlcnZpY2UoKX0sIHByb3ZpZGluZyB0aGUgCi0gICAgICogYXJndW1lbnRzIGl0IHN1cHBsaWVkLgotICAgICAqICAKLSAgICAgKiBSZXR1cm4gdGhlIGNvbW11bmljYXRpb24gY2hhbm5lbCB0byB0aGUgc2VydmljZS4gIE1heSByZXR1cm4gbnVsbCBpZiAKLSAgICAgKiBjbGllbnRzIGNhbiBub3QgYmluZCB0byB0aGUgc2VydmljZS4gIFRoZSByZXR1cm5lZAotICAgICAqIHtAbGluayBhbmRyb2lkLm9zLklCaW5kZXJ9IGlzIHVzdWFsbHkgZm9yIGEgY29tcGxleCBpbnRlcmZhY2UKLSAgICAgKiB0aGF0IGhhcyBiZWVuIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FpZGwuaHRtbCI+ZGVzY3JpYmVkIHVzaW5nCi0gICAgICogYWlkbDwvYT4uIAotICAgICAqIAotICAgICAqIE5vdGU6ICBJbiBvcmRlciB0byB0ZXN0IHdpdGggdGhpcyBpbnRlcmZhY2UsIHlvdXIgc2VydmljZSBtdXN0IGltcGxlbWVudCBhIGdldFNlcnZpY2UoKQotICAgICAqIG1ldGhvZCwgYXMgc2hvd24gaW4gc2FtcGxlcy5BcGlEZW1vcy5hcHAuTG9jYWxTZXJ2aWNlLgogCi0gICAgICogQHBhcmFtIGludGVudCBUaGUgSW50ZW50IGFzIGlmIHN1cHBsaWVkIHRvIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNiaW5kU2VydmljZX0uCi0gICAgICogCi0gICAgICogQHJldHVybiBSZXR1cm4gYW4gSUJpbmRlciBmb3IgbWFraW5nIGZ1cnRoZXIgY2FsbHMgaW50byB0aGUgU2VydmljZS4KKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiAgICAgIFN0YXJ0cyB0aGUgc2VydmljZSB1bmRlciB0ZXN0LCBpbiB0aGUgc2FtZSB3YXkgYXMgaWYgaXQgd2VyZSBzdGFydGVkIGJ5CisgICAgICogICAgICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjYmluZFNlcnZpY2UoSW50ZW50LCBTZXJ2aWNlQ29ubmVjdGlvbiwgaW50KQorICAgICAqICAgICAgQ29udGV4dC5iaW5kU2VydmljZShJbnRlbnQsIFNlcnZpY2VDb25uZWN0aW9uLCBmbGFncyl9IHdpdGggYW4KKyAgICAgKiAgICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50fSB0aGF0IGlkZW50aWZpZXMgYSBzZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiAgICAgIE5vdGljZSB0aGF0IHRoZSBwYXJhbWV0ZXJzIGFyZSBkaWZmZXJlbnQuIFlvdSBkbyBub3QgcHJvdmlkZSBhCisgICAgICogICAgICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9ufSBvYmplY3Qgb3IgdGhlIGZsYWdzIHBhcmFtZXRlci4gSW5zdGVhZCwKKyAgICAgKiAgICAgIHlvdSBvbmx5IHByb3ZpZGUgdGhlIEludGVudC4gVGhlIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCB3aG9zZSB0eXBlIGlzIGEKKyAgICAgKiAgICAgIHN1YmNsYXNzIG9mIHtAbGluayBhbmRyb2lkLm9zLklCaW5kZXJ9LCBvciBudWxsIGlmIHRoZSBtZXRob2QgZmFpbHMuIEFuIElCaW5kZXIKKyAgICAgKiAgICAgIG9iamVjdCByZWZlcnMgdG8gYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgYmV0d2VlbiB0aGUgYXBwbGljYXRpb24gYW5kCisgICAgICogICAgICB0aGUgc2VydmljZS4gVGhlIGZsYWcgaXMgYXNzdW1lZCB0byBiZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjQklORF9BVVRPX0NSRUFURX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqICAgICAgU2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FpZGwuaHRtbCI+RGVzaWduaW5nIGEgUmVtb3RlIEludGVyZmFjZQorICAgICAqICAgICAgVXNpbmcgQUlETDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbW11bmljYXRpb24gY2hhbm5lbCBvYmplY3QgcmV0dXJuZWQKKyAgICAgKiAgICAgIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiBOb3RlOiAgVG8gYmUgYWJsZSB0byB1c2UgYmluZFNlcnZpY2UgaW4gYSB0ZXN0LCB0aGUgc2VydmljZSBtdXN0IGltcGxlbWVudCBnZXRTZXJ2aWNlKCkKKyAgICAgKiBtZXRob2QuIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyBpbiB0aGUgQXBpRGVtb3Mgc2FtcGxlIGFwcGxpY2F0aW9uLCBpbiB0aGUKKyAgICAgKiBMb2NhbFNlcnZpY2UgZGVtby4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgQW4gSW50ZW50IG9iamVjdCBvZiB0aGUgZm9ybSBleHBlY3RlZCBieQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNiaW5kU2VydmljZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIG9iamVjdCB3aG9zZSB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgSUJpbmRlciwgZm9yIG1ha2luZyBmdXJ0aGVyIGNhbGxzIGludG8KKyAgICAgKiB0aGUgc2VydmljZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUJpbmRlciBiaW5kU2VydmljZShJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIGlmICghbVNlcnZpY2VBdHRhY2hlZCkgewogICAgICAgICAgICAgc2V0dXBTZXJ2aWNlKCk7CiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0Tm90TnVsbChtU2VydmljZSk7Ci0gICAgICAgIAorCiAgICAgICAgIGlmICghbVNlcnZpY2VDcmVhdGVkKSB7CiAgICAgICAgICAgICBtU2VydmljZS5vbkNyZWF0ZSgpOwogICAgICAgICAgICAgbVNlcnZpY2VDcmVhdGVkID0gdHJ1ZTsKQEAgLTE5MiwxNSArMjM3LDE1IEBACiAgICAgICAgIC8vIG5vIGV4dHJhcyBhcmUgZXhwZWN0ZWQgYnkgdW5iaW5kCiAgICAgICAgIG1TZXJ2aWNlSW50ZW50ID0gaW50ZW50LmNsb25lRmlsdGVyKCk7CiAgICAgICAgIElCaW5kZXIgcmVzdWx0ID0gbVNlcnZpY2Uub25CaW5kKGludGVudCk7Ci0gICAgICAgIAorCiAgICAgICAgIG1TZXJ2aWNlQm91bmQgPSB0cnVlOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBtYWtlIHRoZSBuZWNlc3NhcnkgY2FsbHMgdG8gc3RvcCAob3IgdW5iaW5kKSB0aGUgU2VydmljZSB1bmRlciB0ZXN0LCBhbmQKLSAgICAgKiBjYWxsIG9uRGVzdHJveSgpLiAgT3JkaW5hcmlseSB0aGlzIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgKGJ5IHtAbGluayAjdGVhckRvd259LCBidXQKLSAgICAgKiB5b3UgY2FuIGNhbGwgaXQgZGlyZWN0bHkgZnJvbSB5b3VyIHRlc3QgaW4gb3JkZXIgdG8gY2hlY2sgZm9yIHByb3BlciBzaHV0ZG93biBiZWhhdmlvcnMuCisgICAgICogTWFrZXMgdGhlIG5lY2Vzc2FyeSBjYWxscyB0byBzdG9wIChvciB1bmJpbmQpIHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QsIGFuZAorICAgICAqIGNhbGxzIG9uRGVzdHJveSgpLiAgT3JkaW5hcmlseSB0aGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IChieSB7QGxpbmsgI3RlYXJEb3dufSwgYnV0CisgICAgICogeW91IGNhbiBjYWxsIGl0IGRpcmVjdGx5IGZyb20geW91ciB0ZXN0IGluIG9yZGVyIHRvIGNoZWNrIGZvciBwcm9wZXIgc2h1dGRvd24gYmVoYXZpb3IuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgc2h1dGRvd25TZXJ2aWNlKCkgewogICAgICAgICBpZiAobVNlcnZpY2VTdGFydGVkKSB7CkBAIC0yMTQsMTMgKzI1OSwxOCBAQAogICAgICAgICAgICAgbVNlcnZpY2Uub25EZXN0cm95KCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBTaHV0cyBkb3duIHRoZSBTZXJ2aWNlIHVuZGVyIHRlc3QuICBBbHNvIG1ha2VzIHN1cmUgYWxsIHJlc291cmNlcyBhcmUgY2xlYW5lZCB1cCBhbmQgCi0gICAgICogZ2FyYmFnZSBjb2xsZWN0ZWQgYmVmb3JlIG1vdmluZyBvbiB0byB0aGUgbmV4dAotICAgICAqIHRlc3QuICBTdWJjbGFzc2VzIHRoYXQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgc2hvdWxkIG1ha2Ugc3VyZSB0aGV5IGNhbGwgc3VwZXIudGVhckRvd24oKQotICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIG92ZXJyaWRpbmcgbWV0aG9kLgotICAgICAqIAorICAgICAqIDxwPgorICAgICAqICAgICAgU2h1dHMgZG93biB0aGUgc2VydmljZSB1bmRlciB0ZXN0LiAgRW5zdXJlcyBhbGwgcmVzb3VyY2VzIGFyZSBjbGVhbmVkIHVwIGFuZAorICAgICAqICAgICAgZ2FyYmFnZSBjb2xsZWN0ZWQgYmVmb3JlIG1vdmluZyBvbiB0byB0aGUgbmV4dCB0ZXN0LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgZWFjaAorICAgICAqICAgICAgdGVzdCBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqICAgICAgU3ViY2xhc3NlcyB0aGF0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIG11c3QgY2FsbCA8Y29kZT5zdXBlci50ZWFyRG93bigpPC9jb2RlPiBhcyB0aGVpcgorICAgICAqICAgICAgbGFzdCBzdGF0ZW1lbnQuCisgICAgICogPC9wPgorICAgICAqCiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTIyOCw0NSArMjc4LDU0IEBACiAgICAgICAgIHNodXRkb3duU2VydmljZSgpOwogICAgICAgICBtU2VydmljZSA9IG51bGw7CiAKLSAgICAgICAgLy8gU2NydWIgb3V0IG1lbWJlcnMgLSBwcm90ZWN0cyBhZ2FpbnN0IG1lbW9yeSBsZWFrcyBpbiB0aGUgY2FzZSB3aGVyZSBzb21lb25lIAorICAgICAgICAvLyBTY3J1YiBvdXQgbWVtYmVycyAtIHByb3RlY3RzIGFnYWluc3QgbWVtb3J5IGxlYWtzIGluIHRoZSBjYXNlIHdoZXJlIHNvbWVvbmUKICAgICAgICAgLy8gY3JlYXRlcyBhIG5vbi1zdGF0aWMgaW5uZXIgY2xhc3MgKHRodXMgcmVmZXJlbmNpbmcgdGhlIHRlc3QgY2FzZSkgYW5kIGdpdmVzIGl0IHRvCiAgICAgICAgIC8vIHNvbWVvbmUgZWxzZSB0byBob2xkIG9udG8KICAgICAgICAgc2NydWJDbGFzcyhTZXJ2aWNlVGVzdENhc2UuY2xhc3MpOwogCiAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBhcHBsaWNhdGlvbiBmb3IgdXNlIGR1cmluZyB0aGUgdGVzdC4gIElmIHlvdXIgdGVzdCBkb2VzIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sCi0gICAgICogYSBuZXcge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbiBNb2NrQXBwbGljYXRpb259IG9iamVjdCB3aWxsIGJlIGdlbmVyYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXBwbGljYXRpb24gVGhlIEFwcGxpY2F0aW9uIG9iamVjdCB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQgaW50byB0aGUgU2VydmljZSB1bmRlciB0ZXN0LgorICAgICAqIFNldHMgdGhlIGFwcGxpY2F0aW9uIHRoYXQgaXMgdXNlZCBkdXJpbmcgdGhlIHRlc3QuICBJZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBtZXRob2QsCisgICAgICogYSBuZXcge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbiBNb2NrQXBwbGljYXRpb259IG9iamVjdCBpcyB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uIFRoZSBBcHBsaWNhdGlvbiBvYmplY3QgdGhhdCBpcyB1c2VkIGJ5IHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKICAgICAgICAgbUFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBBcHBsaWNhdGlvbiBvYmplY3QgYmVpbmcgdXNlZCBieSB0aGUgU2VydmljZSB1bmRlciB0ZXN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXBwbGljYXRpb24gb2JqZWN0LgotICAgICAqIAorICAgICAqIFJldHVybnMgdGhlIEFwcGxpY2F0aW9uIG9iamVjdCBpbiB1c2UgYnkgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGFwcGxpY2F0aW9uIG9iamVjdC4KKyAgICAgKgogICAgICAqIEBzZWUgI3NldEFwcGxpY2F0aW9uCiAgICAgICovCiAgICAgcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkgewogICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFJldHVybiBhIHJlYWwgKG5vdCBtb2NrZWQgb3IgaW5zdHJ1bWVudGVkKSBzeXN0ZW0gQ29udGV4dCB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZwotICAgICAqIE1vY2sgb3Igb3RoZXIgQ29udGV4dCBvYmplY3RzIGZvciB5b3VyIFNlcnZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBub3JtYWwgQ29udGV4dC4KKyAgICAgKiBSZXR1cm5zIHRoZSByZWFsIHN5c3RlbSBjb250ZXh0IHRoYXQgaXMgc2F2ZWQgYnkge0BsaW5rICNzZXRVcCgpfS4gVXNlIGl0IHRvIGNyZWF0ZQorICAgICAqIG1vY2sgb3Igb3RoZXIgdHlwZXMgb2YgY29udGV4dCBvYmplY3RzIGZvciB0aGUgc2VydmljZSB1bmRlciB0ZXN0LgorICAgICAqCisgICAgICogQHJldHVybiBBIG5vcm1hbCBzeXN0ZW0gY29udGV4dC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29udGV4dCBnZXRTeXN0ZW1Db250ZXh0KCkgewogICAgICAgICByZXR1cm4gbVN5c3RlbUNvbnRleHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB7QGxpbmsgI3NldHVwU2VydmljZSgpfSBydW5zIGNvcnJlY3RseSBhbmQgaXNzdWVzIGFuCisgICAgICoge0BsaW5rIGp1bml0LmZyYW1ld29yay5Bc3NlcnQjYXNzZXJ0Tm90TnVsbChTdHJpbmcsIE9iamVjdCl9IGlmIGl0IGRvZXMuCisgICAgICogWW91IGNhbiBvdmVycmlkZSB0aGlzIHRlc3QgbWV0aG9kIGlmIHlvdSB3aXNoLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVRlc3RDYXNlU2V0VXBQcm9wZXJseSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzZXR1cFNlcnZpY2UoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgic2VydmljZSBzaG91bGQgYmUgbGF1bmNoZWQgc3VjY2Vzc2Z1bGx5IiwgbVNlcnZpY2UpOwpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZW50UmVzb2x2ZXIuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFJlc29sdmVyLmphdmEKaW5kZXggM2ExZGMzNmMuLmFiNTExZjggMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFJlc29sdmVyLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZW50UmVzb2x2ZXIuamF2YQpAQCAtMjgsMjkgKzI4LDU5IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCi0gKiBBIG1vY2sge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXJ9IGNsYXNzIHRoYXQgaXNvbGF0ZXMgdGhlIHRlc3QgY29kZSBmcm9tIHRoZSByZWFsCi0gKiBjb250ZW50IHN5c3RlbS4gIEFsbCBtZXRob2RzIGFyZSBub24tZnVuY3Rpb25hbCBhbmQgdGhyb3cKLSAqIHtAbGluayBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LiAgCi0gKgotICogPHA+VGhpcyBvbmx5IGlzb2xhdGVzIHRoZSB0ZXN0IGNvZGUgaW4gd2F5cyB0aGF0IGhhdmUgcHJvdmVuIHVzZWZ1bCBzbyBmYXIuIE1vcmUgc2hvdWxkIGJlCi0gKiBhZGRlZCBhcyB0aGV5IGJlY29tZSBhIHByb2JsZW0uCisgKiA8cD4KKyAqICAgICAgQW4gZXh0ZW5zaW9uIG9mIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyfSB0aGF0IGlzIGRlc2lnbmVkIGZvcgorICogICAgICB0ZXN0aW5nLgorICogPC9wPgorICogPHA+CisgKiAgICAgIE1vY2tDb250ZW50UmVzb2x2ZXIgb3ZlcnJpZGVzIEFuZHJvaWQncyBub3JtYWwgd2F5IG9mIHJlc29sdmluZyBwcm92aWRlcnMgYnkKKyAqICAgICAgYXV0aG9yaXR5LiBUbyBoYXZlIGFjY2VzcyB0byBhIHByb3ZpZGVyIGJhc2VkIG9uIGl0cyBhdXRob3JpdHksIHVzZXJzIG9mCisgKiAgICAgIE1vY2tDb250ZW50UmVzb2x2ZXIgZmlyc3QgaW5zdGFudGlhdGUgdGhlIHByb3ZpZGVyIGFuZAorICogICAgICB1c2Uge0BsaW5rIE1vY2tDb250ZW50UmVzb2x2ZXIjYWRkUHJvdmlkZXIoU3RyaW5nLCBDb250ZW50UHJvdmlkZXIpfS4gUmVzb2x1dGlvbiBvZiBhbgorICogICAgICBhdXRob3JpdHkgb2NjdXJzIGVudGlyZWx5IHdpdGhpbiBNb2NrQ29udGVudFJlc29sdmVyLgorICogPC9wPgorICogPHA+CisgKiAgICAgIFVzZXJzIGNhbiBhbHNvIHNldCBhbiBhdXRob3JpdHkncyBlbnRyeSBpbiB0aGUgbWFwIHRvIG51bGwsIHNvIHRoYXQgYSBwcm92aWRlciBpcyBjb21wbGV0ZWx5CisgKiAgICAgIG1vY2tlZCBvdXQuCisgKiA8L3A+CiAgKi8KKwogcHVibGljIGNsYXNzIE1vY2tDb250ZW50UmVzb2x2ZXIgZXh0ZW5kcyBDb250ZW50UmVzb2x2ZXIgewogICAgIE1hcDxTdHJpbmcsIENvbnRlbnRQcm92aWRlcj4gbVByb3ZpZGVyczsKIAorICAgIC8qCisgICAgICogQ3JlYXRlcyBhIGxvY2FsIG1hcCBvZiBwcm92aWRlcnMuIFRoaXMgbWFwIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIG1hcCB3aGVuIGFuCisgICAgICogQVBJIGNhbGwgdHJpZXMgdG8gYWNxdWlyZSBhIHByb3ZpZGVyLgorICAgICAqLwogICAgIHB1YmxpYyBNb2NrQ29udGVudFJlc29sdmVyKCkgewogICAgICAgICBzdXBlcihudWxsKTsKICAgICAgICAgbVByb3ZpZGVycyA9IE1hcHMubmV3SGFzaE1hcCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFkZHMgYWNjZXNzIHRvIGEgcHJvdmlkZXIgYmFzZWQgb24gaXRzIGF1dGhvcml0eQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIGF1dGhvcml0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIHByb3ZpZGVyIEFuIGluc3RhbmNlIG9mIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSBvciBvbmUgb2YgaXRzCisgICAgICogc3ViY2xhc3Nlcywgb3IgbnVsbC4KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihTdHJpbmcgbmFtZSwgQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKSB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFwcyB0aGUgYXV0aG9yaXR5IHRvIHRoZSBwcm92aWRlciBsb2NhbGx5LgorICAgICAgICAgKi8KICAgICAgICAgbVByb3ZpZGVycy5wdXQobmFtZSwgcHJvdmlkZXIpOwogICAgIH0KIAogICAgIC8qKiBAaGlkZSAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBJQ29udGVudFByb3ZpZGVyIGFjcXVpcmVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0cyB0aGUgY29udGVudCBwcm92aWRlciBmcm9tIHRoZSBsb2NhbCBtYXAKKyAgICAgICAgICovCiAgICAgICAgIGZpbmFsIENvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KG5hbWUpOworCiAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0SUNvbnRlbnRQcm92aWRlcigpOwogICAgICAgICB9IGVsc2UgewpAQCAtNjQsNyArOTQsMTggQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI25vdGlmeUNoYW5nZShVcmksIENvbnRlbnRPYnNlcnZlciwgYm9vbGVhbikKKyAgICAgKiBDb250ZW50UmVzb2x2ZXIubm90aWZDaGFuZ2UoVXJpLCBDb250ZW50T2JzZXJ2ZXIsIGJvb2xlYW4pfS4gQWxsIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWQuCisgICAgICogVGhlIG1ldGhvZCBoaWRlcyBwcm92aWRlcnMgbGlua2VkIHRvIE1vY2tDb250ZW50UmVzb2x2ZXIgZnJvbSBvdGhlciBvYnNlcnZlcnMgaW4gdGhlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgKElnbm9yZWQpIFRoZSB1cmkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIG9ic2VydmVyIChJZ25vcmVkKSBUaGUgb2JzZXJ2ZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBjaGFuZ2UuCisgICAgICogQHBhcmFtIHN5bmNUb05ldHdvcmsgKElnbm9yZWQpIElmIHRydWUsIGF0dGVtcHQgdG8gc3luYyB0aGUgY2hhbmdlIHRvIHRoZSBuZXR3b3JrLgorICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZShVcmkgdXJpLCBDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIsIGJvb2xlYW4gc3luY1RvTmV0d29yaykgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZShVcmkgdXJpLAorICAgICAgICAgICAgQ29udGVudE9ic2VydmVyIG9ic2VydmVyLAorICAgICAgICAgICAgYm9vbGVhbiBzeW5jVG9OZXR3b3JrKSB7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tQYWNrYWdlTWFuYWdlci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tQYWNrYWdlTWFuYWdlci5qYXZhCmluZGV4IDNlNzdiOWIuLmU5NjE3M2IgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrUGFja2FnZU1hbmFnZXIuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja1BhY2thZ2VNYW5hZ2VyLmphdmEKQEAgLTQ4Myw0ICs0ODMsOSBAQAogICAgIHB1YmxpYyBib29sZWFuIGlzU2FmZU1vZGUoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VPYmJQYXRoKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyVGVzdC5qYXZhCmluZGV4IDZkYjcyYWQuLmQ5OGIyMTcgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3QvSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lclRlc3QuamF2YQorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXJUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRlc3Q7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHQ7CkBAIC04OSw2ICs5MCw0MiBAQAogICAgICAgICAKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgcnVudGltZSBleGNlcHRpb25zIGR1cmluZyBydW5UZXN0IGFyZSBoYW5kbGVkIGdyYWNlZnVsbHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5oYW5kbGVkRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0dWJBbmRyb2lkVGVzdFJ1bm5lciBzdHViQW5kcm9pZFRlc3RSdW5uZXIgPSBuZXcgU3R1YkFuZHJvaWRUZXN0UnVubmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW5UZXN0KCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIFN0dWJJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIGluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgPSBuZXcgU3R1Ykluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIoCisgICAgICAgICAgICAgICAgbmV3IFN0dWJDb250ZXh0KCJjb20uZ29vZ2xlLmZvby50ZXN0cyIpLAorICAgICAgICAgICAgICAgIG5ldyBTdHViQ29udGV4dChtVGFyZ2V0Q29udGV4dFBhY2thZ2VOYW1lKSwgc3R1YkFuZHJvaWRUZXN0UnVubmVyKTsKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lci5vbkNyZWF0ZShuZXcgQnVuZGxlKCkpOworICAgICAgICBpbnN0cnVtZW50YXRpb25UZXN0UnVubmVyLm9uU3RhcnQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5zdHJ1bWVudGF0aW9uIGRpZCBub3QgZmluaXNoIiwgaW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lci5pc0ZpbmlzaGVkKCkpOworICAgICAgICAvLyBlbnN1cmUgYSBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2UgcGxhY2VkIGluIHJlc3VsdHMKKyAgICAgICAgU3RyaW5nIHJlc3VsdHNEYXRhID0gaW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lci5tUmVzdWx0cy5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uLlJFUE9SVF9LRVlfU1RSRUFNUkVTVUxUKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5zdHJ1bWVudGF0aW9uIHJlc3VsdHMgaXMgbWlzc2luZyBSdW50aW1lRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICByZXN1bHRzRGF0YS5jb250YWlucygiUnVudGltZUV4Y2VwdGlvbiIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgc3BlY2lmeWluZyBhIG1ldGhvZCB3aGljaCBkb2VzIG5vdCBleGlzdCBpcyBoYW5kbGVkIGdyYWNlZnVsbHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkTWV0aG9kQXJndW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRlc3RDbGFzc05hbWUgPSBQbGFjZUhvbGRlclRlc3QuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgaW52YWxpZE1ldGhvZE5hbWUgPSAidGVzdE5vRXhpc3QiOworICAgICAgICBTdHJpbmcgY2xhc3NBbmRNZXRob2QgPSB0ZXN0Q2xhc3NOYW1lICsgIiMiICsgaW52YWxpZE1ldGhvZE5hbWU7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyLm9uQ3JlYXRlKGNyZWF0ZUJ1bmRsZSgKKyAgICAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyLkFSR1VNRU5UX1RFU1RfQ0xBU1MsIGNsYXNzQW5kTWV0aG9kKSk7CisgICAgICAgIGFzc2VydFRlc3RSdW5uZXJDYWxsZWRXaXRoRXhwZWN0ZWRQYXJhbWV0ZXJzKHRlc3RDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgaW52YWxpZE1ldGhvZE5hbWUpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3REZWxheVBhcmFtZXRlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpbnQgZGVsYXlNc2VjID0gMTAwMDsKICAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7CkBAIC0xNzAsNiArMjA3LDcgQEAKICAgICAgICAgcHJpdmF0ZSBUZXN0U3VpdGUgbVRlc3RTdWl0ZTsKICAgICAgICAgcHJpdmF0ZSBUZXN0U3VpdGUgbURlZmF1bHRUZXN0U3VpdGU7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlTmFtZUZvckRlZmF1bHRUZXN0czsKKyAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbVJlc3VsdHM7CiAKICAgICAgICAgcHVibGljIFN0dWJJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyKENvbnRleHQgY29udGV4dCwgQ29udGV4dCB0YXJnZXRDb250ZXh0LAogICAgICAgICAgICAgICAgIEFuZHJvaWRUZXN0UnVubmVyIGFuZHJvaWRUZXN0UnVubmVyKSB7CkBAIC0yMDAsNiArMjM4LDcgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2goaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHRzKSB7CiAgICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworICAgICAgICAgICAgbVJlc3VsdHMgPSByZXN1bHRzOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdGFydGVkKCkgewpAQCAtMjIxLDYgKzI2MCwxMSBAQAogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lRm9yRGVmYXVsdFRlc3RzKCkgewogICAgICAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZUZvckRlZmF1bHRUZXN0czsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIHByZXBhcmVMb29wZXIoKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0dWJDb250ZXh0IGV4dGVuZHMgTW9ja0NvbnRleHQgewpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKaW5kZXggMDg4MzM4Ny4uNDQ3NWU5MiAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCkBAIC03Nyw3ICs3Nyw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICgocy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpKQorICAgICAgICAgICAgaWYgKChzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5odG1sIikKKyAgICAgICAgICAgICAgICAgICAgfHwgcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueG1sIikKKyAgICAgICAgICAgICAgICAgICAgfHwgcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueGh0bWwiKSkKICAgICAgICAgICAgICAgICAgICAgJiYgIXMuZW5kc1dpdGgoIlRFTVBMQVRFLmh0bWwiKSkgewogICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIlJlY29yZGluZyAiICsgcyk7CiAgICAgICAgICAgICAgICAgYm9zLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQppbmRleCBmYWJiZjg5Li42OGQwMWQ0IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKQEAgLTIyMiwxNCArMjIyLDIyIEBACiAgICAgICAgIC8vIFRoZSBnZW5lcmljIHJlc3VsdCBpcyBhdCA8cGF0aD4vPG5hbWU+LWV4cGVjdGVkLnR4dAogICAgICAgICAvLyBGaXJzdCB0cnkgdGhlIEFuZHJvaWQtc3BlY2lmaWMgcmVzdWx0IGF0CiAgICAgICAgIC8vIHBsYXRmb3JtL2FuZHJvaWQtPGpzLWVuZ2luZT4vPHBhdGg+LzxuYW1lPi1leHBlY3RlZC50eHQKKyAgICAgICAgLy8gdGhlbgorICAgICAgICAvLyBwbGF0Zm9ybS9hbmRyb2lkLzxwYXRoPi88bmFtZT4tZXhwZWN0ZWQudHh0CiAgICAgICAgIGludCBwb3MgPSB0ZXN0Lmxhc3RJbmRleE9mKCcuJyk7CiAgICAgICAgIGlmIChwb3MgPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgU3RyaW5nIGdlbmVyaWNFeHBlY3RlZFJlc3VsdCA9IHRlc3Quc3Vic3RyaW5nKDAsIHBvcykgKyAiLWV4cGVjdGVkLnR4dCI7CiAgICAgICAgIFN0cmluZyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyID0gInBsYXRmb3JtL2FuZHJvaWQtIiArIG1Kc0VuZ2luZSArICIvIjsKLSAgICAgICAgU3RyaW5nIGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA9Ci0gICAgICAgICAgICBnZW5lcmljRXhwZWN0ZWRSZXN1bHQucmVwbGFjZUZpcnN0KExBWU9VVF9URVNUU19ST09ULCBMQVlPVVRfVEVTVFNfUk9PVCArIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIpOworICAgICAgICBTdHJpbmcgYW5kcm9pZEV4cGVjdGVkUmVzdWx0ID0gZ2VuZXJpY0V4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChMQVlPVVRfVEVTVFNfUk9PVCwKKyAgICAgICAgICAgICAgICBMQVlPVVRfVEVTVFNfUk9PVCArIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIpOwogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShhbmRyb2lkRXhwZWN0ZWRSZXN1bHQpOworICAgICAgICBpZiAoZi5leGlzdHMoKSkKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQ7CisgICAgICAgIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIgPSAicGxhdGZvcm0vYW5kcm9pZC8iOworICAgICAgICBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgPSBnZW5lcmljRXhwZWN0ZWRSZXN1bHQucmVwbGFjZUZpcnN0KExBWU9VVF9URVNUU19ST09ULAorICAgICAgICAgICAgICAgIExBWU9VVF9URVNUU19ST09UICsgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0Rpcik7CisgICAgICAgIGYgPSBuZXcgRmlsZShhbmRyb2lkRXhwZWN0ZWRSZXN1bHQpOwogICAgICAgICByZXR1cm4gZi5leGlzdHMoKSA/IGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA6IGdlbmVyaWNFeHBlY3RlZFJlc3VsdDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkLm1rIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhNjc5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gRHVtcFJlbmRlclRyZWUyCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhMzY1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCitDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMiI+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudWkuRGlyTGlzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iRHVtcCBSZW5kZXIgVHJlZSAyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9mb2xkZXIucG5nIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9mb2xkZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViM2ZjZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvcnVudGVzdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwYzY1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvcnVudGVzdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9sYXlvdXQvZGlybGlzdF9yb3cueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9sYXlvdXQvZGlybGlzdF9yb3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTc4YTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI4MHB4IgorICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNXB4IgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNjBweCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE0c3AiCisgICAgLz4KKworPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNkM2NhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCI+RGlyZWN0b3J5Ojwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnIj5UaGlzIHdpbGwgcnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIGFsbAorICAgICAgICAgICAgdGhlIHN1YmRpcmVjdG9yaWVzLiBJdCBtYXkgdGFrZSBhIGZldyBob3VycyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiI+UnVuIHRlc3RzITwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uIj5BYm9ydDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfdGl0bGUiPkxvYWRpbmcgaXRlbXMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfbXNnIj5QbGVhc2Ugd2FpdC4uLjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRmlsZUZpbHRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRmlsZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWY4YTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9GaWxlRmlsdGVyLmphdmEKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSB1dGlsaXR5IHRvIGZpbHRlciBvdXQgc29tZSBmaWxlcy9kaXJlY3RvcmllcyBmcm9tIHRoZSB2aWV3cyBhbmQgdGVzdHMgdGhhdCBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlRmlsdGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJGaWxlRmlsdGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VYUEVDVEFUSU9OU19UWFRfUEFUSCA9CisgICAgICAgICAgICAicGxhdGZvcm0vYW5kcm9pZC90ZXN0X2V4cGVjdGF0aW9ucy50eHQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX1NLSVAgPSAiU0tJUCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX0lHTk9SRV9SRVNVTFQgPSAiSUdOT1JFX1JFU1VMVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX1NMT1cgPSAiU0xPVyI7CisKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1Ta2lwTGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1JZ25vcmVSZXN1bHRMaXN0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gbVNsb3dMaXN0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJvb3REaXJQYXRoOworCisgICAgcHVibGljIEZpbGVGaWx0ZXIoU3RyaW5nIHJvb3REaXJQYXRoKSB7CisgICAgICAgIC8qKiBJdCBtYXkgb3IgbWF5IG5vdCBjb250YWluIGEgdHJhaWxpbmcgc2xhc2ggKi8KKyAgICAgICAgdGhpcy5tUm9vdERpclBhdGggPSByb290RGlyUGF0aDsKKworICAgICAgICByZWxvYWRDb25maWd1cmF0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRyaW1UcmFpbGluZ1NsYXNoSWZQcmVzZW50KFN0cmluZyBwYXRoKSB7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOworICAgICAgICByZXR1cm4gZmlsZS5nZXRQYXRoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsb2FkQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OnJlbG9hZENvbmZpZ3VyYXRpb24iLCAiQmVnaW4uIik7CisKKyAgICAgICAgRmlsZSB0eHRfZXhwID0gbmV3IEZpbGUobVJvb3REaXJQYXRoLCBURVNUX0VYUEVDVEFUSU9OU19UWFRfUEFUSCk7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWRSZWFkZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWZmZXJlZFJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcih0eHRfZXhwKSk7CisKKyAgICAgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICAgICAgU3RyaW5nIGVudHJ5OworICAgICAgICAgICAgU3RyaW5nW10gcGFydHM7CisgICAgICAgICAgICBTdHJpbmcgcGF0aDsKKyAgICAgICAgICAgIFNldDxTdHJpbmc+IHRva2VuczsKKyAgICAgICAgICAgIEJvb2xlYW4gc2tpcHBlZDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgbGluZSA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiogUmVtb3ZlIHRoZSBjb21tZW50IGFuZCB0cmltICovCisgICAgICAgICAgICAgICAgZW50cnkgPSBsaW5lLnNwbGl0KCIvLyIsIDIpWzBdLnRyaW0oKTsKKworICAgICAgICAgICAgICAgIC8qKiBPbWl0IGVtcHR5IGxpbmVzLCBhZHZhbmNlIHRvIG5leHQgbGluZSAqLworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqIFNwbGl0IG9uIHdoaXRlc3BhY2UgaW50byBwYXRoIHBhcnQgYW5kIHRoZSByZXN0ICovCisgICAgICAgICAgICAgICAgcGFydHMgPSBlbnRyeS5zcGxpdCgiXFxzIiwgMik7CisKKyAgICAgICAgICAgICAgICAvKiogQXQgdGhpcyBwb2ludCBwYXJ0cy5sZW5ndGggPj0gMSAqLworICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6cmVsb2FkQ29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGFyZSBubyBvcHRpb25zIHNwZWNpZmllZCBmb3IgdGhlIHRlc3QhIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBhdGggPSB0cmltVHJhaWxpbmdTbGFzaElmUHJlc2VudChwYXJ0c1swXSk7CisKKyAgICAgICAgICAgICAgICAvKiogU3BsaXQgb24gd2hpdGVzcGFjZSAqLworICAgICAgICAgICAgICAgIHRva2VucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChwYXJ0c1sxXS5zcGxpdCgiXFxzIiwgMCkpKTsKKworICAgICAgICAgICAgICAgIC8qKiBDaG9zZSB0aGUgcmlnaHQgY29sbGVjdGlvbnMgdG8gYWRkIHRvICovCisgICAgICAgICAgICAgICAgc2tpcHBlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnMoVE9LRU5fU0tJUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNraXBMaXN0LmFkZChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqIElmIHRlc3QgaXMgb24gc2tpcCBsaXN0IHdlIGlnbm9yZSBhbnkgZnVydGhlciBvcHRpb25zICovCisgICAgICAgICAgICAgICAgaWYgKHNraXBwZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRva2Vucy5jb250YWlucyhUT0tFTl9JR05PUkVfUkVTVUxUKSkgeworICAgICAgICAgICAgICAgICAgICBtSWdub3JlUmVzdWx0TGlzdC5hZGQocGF0aCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRva2Vucy5jb250YWlucyhUT0tFTl9TTE9XKSkgeworICAgICAgICAgICAgICAgICAgICBtU2xvd0xpc3QuYWRkKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpyZWxvYWRDb25maWd1cmF0aW9uIiwgIkZpbGUgbm90IGZvdW5kOiAiICsgdHh0X2V4cC5nZXRQYXRoKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHICsgIjo6cmVsb2FkQ29uZmlndXJhdGlvbiIsICJJT0V4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0ZXN0IGlzIHN1cHBvc2VkIHRvIGJlIHNraXBwZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBQYXRoIGdpdmVuIHNob3VsZCByZWxhdGl2ZSB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyLCBlLmcuIGZhc3QvZG9tL2Zvby5odG1sCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdFBhdGgKKyAgICAgKiAgICAgICAgICAgIC0gYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIKKyAgICAgKiBAcmV0dXJuIGlmIHRoZSB0ZXN0IGlzIHN1cHBvc2VkIHRvIGJlIHNraXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXAoU3RyaW5nIHRlc3RQYXRoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGdldFByZWZpeGVzKHRlc3RQYXRoKSkgeworICAgICAgICAgICAgaWYgKG1Ta2lwTGlzdC5jb250YWlucyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRlc3QgcmVzdWx0IGlzIHN1cHBvc2VkIHRvIGJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBQYXRoIGdpdmVuIHNob3VsZCByZWxhdGl2ZSB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyLCBlLmcuIGZhc3QvZG9tL2Zvby5odG1sCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdFBhdGgKKyAgICAgKiAgICAgICAgICAgIC0gYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIKKyAgICAgKiBAcmV0dXJuIGlmIHRoZSB0ZXN0IHJlc3VsdCBpcyBzdXBwb3NlZCB0byBiZSBpZ25vcmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmVSZXMoU3RyaW5nIHRlc3RQYXRoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGdldFByZWZpeGVzKHRlc3RQYXRoKSkgeworICAgICAgICAgICAgaWYgKG1JZ25vcmVSZXN1bHRMaXN0LmNvbnRhaW5zKHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGVzdCBpcyBzbG93IGFuZCBzaG91bGQgaGF2ZSB0aW1lb3V0IGluY3JlYXNlZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFBhdGggZ2l2ZW4gc2hvdWxkIHJlbGF0aXZlIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIsIGUuZy4gZmFzdC9kb20vZm9vLmh0bWwKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0UGF0aAorICAgICAqICAgICAgICAgICAgLSBhIHJlbGF0aXZlIHBhdGggd2l0aGluIExheW91dFRlc3RzIGZvbGRlcgorICAgICAqIEByZXR1cm4gaWYgdGhlIHRlc3QgaXMgc2xvdyBhbmQgc2hvdWxkIGhhdmUgdGltZW91dCBpbmNyZWFzZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTbG93KFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtU2xvd0xpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHBhdGggcHJlZml4ZXMgb2YgdGhlIGdpdmVuIHBhdGguCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBlLmcuIHRoaXMvaXMvYS9wYXRoIHJldHVybnMgdGhlIGxpc3Q6IHRoaXMgdGhpcy9pcyB0aGlzL2lzL2EgdGhpcy9pcy9hL3BhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBhbGwgcGF0aCBwcmVmaXhlcyBvZiB0aGUgZ2l2ZW4gcGF0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UHJlZml4ZXMoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBwcmVmaXhlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPig4KTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBwcmVmaXhlcy5hZGQoZmlsZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICB9IHdoaWxlIChmaWxlICE9IG51bGwpOworCisgICAgICAgIHJldHVybiBwcmVmaXhlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGRpcmVjdG9yeSBtYXkgY29udGFpbiB0ZXN0cyBvciBjb250YWlucyBqdXN0IGhlbHBlciBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJOYW1lCisgICAgICogQHJldHVybgorICAgICAqICAgICAgaWYgdGhlIGRpcmVjdG9yeSBtYXkgY29udGFpbiB0ZXN0cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Rlc3REaXIoU3RyaW5nIGRpck5hbWUpIHsKKyAgICAgICAgcmV0dXJuICghZGlyTmFtZS5lcXVhbHMoInNjcmlwdC10ZXN0cyIpCisgICAgICAgICAgICAgICAgJiYgIWRpck5hbWUuZXF1YWxzKCJyZXNvdXJjZXMiKQorICAgICAgICAgICAgICAgICYmICFkaXJOYW1lLnN0YXJ0c1dpdGgoIi4iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBmaWxlIGlzIGEgdGVzdC4KKyAgICAgKiBDdXJyZW50bHkgd2UgcnVuIC5odG1sIGFuZCAueGh0bWwgdGVzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdE5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBpZiB0aGUgZmlsZSBpcyBhIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUZXN0RmlsZShTdHJpbmcgdGVzdE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHRlc3ROYW1lLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHRlc3ROYW1lLmVuZHNXaXRoKCIueGh0bWwiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3VpL0Rpckxpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NTA5YzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnVpOworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLkZpbGVGaWx0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLlByb2dyZXNzRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIEFjdGl2aXR5IHRoYXQgYWxsb3dzIG5hdmlnYXRpbmcgdGhyb3VnaCB0ZXN0cyBmb2xkZXJzIGFuZCBjaG9vc2luZyBmb2xkZXJzIG9yIHRlc3RzIHRvIHJ1bi4KKyAqLworcHVibGljIGNsYXNzIERpckxpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJEaXJMaXN0QWN0aXZpdHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImFuZHJvaWQiICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgIkxheW91dFRlc3RzIjsKKworICAgIC8qKiBUT0RPOiBUaGlzIGlzIGp1c3QgYSBndWVzcyAtIHRoaW5rIG9mIGEgYmV0dGVyIHdheSB0byBhY2hpZXZlIGl0ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FQU5fVElUTEVfQ0hBUl9TSVpFID0gMTM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfRElBTE9HX0RFTEFZX01TID0gMjAwOworCisgICAgLyoqIENvZGUgZm9yIHRoZSBkaWFsb2csIHVzZWQgaW4gc2hvd0RpYWxvZyBhbmQgb25DcmVhdGVEaWFsb2cgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElBTE9HX1JVTl9BQk9SVF9ESVIgPSAwOworCisgICAgLyoqIE1lc3NhZ2VzIGNvZGVzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19MT0FERURfSVRFTVMgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cgPSAxOworCisgICAgLyoqIEluaXRpYWxpemVkIGxhemlseSBiZWZvcmUgZmlyc3Qgc1Byb2dyZXNzRGlhbG9nLnNob3coKSAqLworICAgIHByaXZhdGUgc3RhdGljIFByb2dyZXNzRGlhbG9nIHNQcm9ncmVzc0RpYWxvZzsKKworICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OworCisgICAgLyoqIFRoaXMgaXMgYSByZWxhdGl2ZSBwYXRoISAqLworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50RGlyUGF0aDsKKworICAgIC8qKgorICAgICAqIFRPRE86IFRoaXMgc2hvdWxkIG5vdCBiZSBhIGNvbnN0YW50LCBidXQgcmF0aGVyIGJlIGNvbmZpZ3VyYWJsZSBmcm9tIHNvbWV3aGVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtUm9vdERpclBhdGggPSBST09UX0RJUl9QQVRIOworCisgICAgLyoqCisgICAgICogQSB0aHJlYWQgcmVzcG9uc2libGUgZm9yIGxvYWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgZnJvbSBzZCBjYXJkCisgICAgICogYW5kIHNlbmRpbmcgdGhlbSB2aWEgTWVzc2FnZSB0byBtYWluIHRocmVhZCB0aGF0IHRoZW4gbG9hZHMgdGhlbSBpbnRvCisgICAgICogTGlzdFZpZXcKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIExvYWRMaXN0SXRlbXNUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisKKyAgICAgICAgcHVibGljIExvYWRMaXN0SXRlbXNUaHJlYWQoU3RyaW5nIHJlbGF0aXZlUGF0aCwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfTE9BREVEX0lURU1TKTsKKyAgICAgICAgICAgIG1zZy5vYmogPSBnZXREaXJMaXN0KG1SZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcnkgc2ltcGxlIG9iamVjdCB0byB1c2UgaW5zaWRlIExpc3RWaWV3IGFzIGFuIGl0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdEl0ZW0gaW1wbGVtZW50cyBDb21wYXJhYmxlPExpc3RJdGVtPiB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzRGlyZWN0b3J5OworCisgICAgICAgIHB1YmxpYyBMaXN0SXRlbShTdHJpbmcgcmVsYXRpdmVQYXRoLCBib29sZWFuIGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbU5hbWUgPSBuZXcgRmlsZShyZWxhdGl2ZVBhdGgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG1Jc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhMaXN0SXRlbSBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5jb21wYXJlVG8oYW5vdGhlci5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdEl0ZW0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5lcXVhbHMoKChMaXN0SXRlbSkgbykuZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGN1c3RvbSBhZGFwdGVyIHRoYXQgc2V0cyB0aGUgcHJvcGVyIGljb24gYW5kIGxhYmVsIGluIHRoZSBsaXN0IHZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlyTGlzdEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TGlzdEl0ZW0+IHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0SXRlbVtdIG1JdGVtczsKKworICAgICAgICBwdWJsaWMgRGlyTGlzdEFkYXB0ZXIoQWN0aXZpdHkgY29udGV4dCwgTGlzdEl0ZW1bXSBpdGVtcykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgUi5sYXlvdXQuZGlybGlzdF9yb3csIGl0ZW1zKTsKKworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbUl0ZW1zID0gaXRlbXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gbUNvbnRleHQuZ2V0TGF5b3V0SW5mbGF0ZXIoKTsKKyAgICAgICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5kaXJsaXN0X3JvdywgbnVsbCk7CisKKyAgICAgICAgICAgIFRleHRWaWV3IGxhYmVsID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQubGFiZWwpOworICAgICAgICAgICAgbGFiZWwuc2V0VGV4dChtSXRlbXNbcG9zaXRpb25dLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIEltYWdlVmlldyBpY29uID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOworICAgICAgICAgICAgaWYgKG1JdGVtc1twb3NpdGlvbl0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmZvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnJ1bnRlc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcm93OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIG1MaXN0VmlldyA9IGdldExpc3RWaWV3KCk7CisKKyAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICBMaXN0SXRlbSBpdGVtID0gKExpc3RJdGVtKSBwYXJlbnQuZ2V0SXRlbUF0UG9zaXRpb24ocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBzaG93RGlyKGl0ZW0uZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBydW4gdGhlIHRlc3QgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1MaXN0Vmlldy5zZXRPbkl0ZW1Mb25nQ2xpY2tMaXN0ZW5lcihuZXcgQWRhcHRlclZpZXcuT25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSXRlbUxvbmdDbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICAgICAgTGlzdEl0ZW0gaXRlbSA9IChMaXN0SXRlbSkgcGFyZW50LmdldEl0ZW1BdFBvc2l0aW9uKHBvc2l0aW9uKTsKKworICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoMSk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRTdHJpbmcoIm5hbWUiLCBpdGVtLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRTdHJpbmcoInJlbGF0aXZlUGF0aCIsIGl0ZW0uZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBzaG93RGlhbG9nKERJQUxPR19SVU5fQUJPUlRfRElSLCBhcmd1bWVudHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBNYXliZSBzaG93IHNvbWUgaW5mbyBhYm91dCBhIHRlc3Q/ICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8qKiBBbGwgdGhlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0ZXN0IHJvb3QgZGlyIHdoZXJlIHBvc3NpYmxlICovCisgICAgICAgIHNob3dEaXIoIiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIC8qKgorICAgICAqIE1vdmVzIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGlmIG9uZSBleGlzdHMuIERvZXMgbm90IGFsbG93IHRvIG1vdmUgYWJvdmUKKyAgICAgKiB0aGUgdGVzdCAncm9vdCcgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQmFja1ByZXNzZWQoKSB7CisgICAgICAgIEZpbGUgY3VycmVudERpclBhcmVudCA9IG5ldyBGaWxlKG1DdXJyZW50RGlyUGF0aCkuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICBpZiAoY3VycmVudERpclBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBzaG93RGlyKGN1cnJlbnREaXJQYXJlbnQuZ2V0UGF0aCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNob3dEaXIoIiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJldmVudHMgdGhlIGFjdGl2aXR5IGZyb20gcmVjcmVhdGluZyBvbiBjaGFuZ2Ugb2Ygb3JpZW50YXRpb24uIFRoZSB0aXRsZSBuZWVkcyB0bworICAgICAqIGJlIHJlY2FsY3VsYXRlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKKworICAgICAgICBzZXRUaXRsZShzaG9ydGVuVGl0bGUobUN1cnJlbnREaXJQYXRoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhpbnQgaWQsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIERpYWxvZyBkaWFsb2cgPSBudWxsOworICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKTsKKworICAgICAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgICAgICBjYXNlIERJQUxPR19SVU5fQUJPUlRfRElSOgorICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUoZ2V0VGV4dChSLnN0cmluZy5kaWFsb2dfcnVuX2Fib3J0X2Rpcl90aXRsZV9wcmVmaXgpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZ2V0U3RyaW5nKCJuYW1lIikpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0TWVzc2FnZShSLnN0cmluZy5kaWFsb2dfcnVuX2Fib3J0X2Rpcl9tc2cpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q2FuY2VsYWJsZSh0cnVlKTsKKworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfb2tfYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IFJ1biB0ZXN0cyBmcm9tIHRoZSBkaXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0TmVnYXRpdmVCdXR0b24oUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGlhbG9nKERJQUxPR19SVU5fQUJPUlRfRElSKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgZGlhbG9nID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICBkaWFsb2cuc2V0T25DYW5jZWxMaXN0ZW5lcihuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbChEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGlhbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIHRoZSBjb250ZW50cyBvZiBkaXIgaW50byB0aGUgbGlzdCB2aWV3LgorICAgICAqCisgICAgICogQHBhcmFtIGRpclBhdGgKKyAgICAgKiAgICAgIGRpcmVjdG9yeSB0byBsb2FkIGludG8gbGlzdCB2aWV3CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNob3dEaXIoU3RyaW5nIGRpclBhdGgpIHsKKyAgICAgICAgbUN1cnJlbnREaXJQYXRoID0gZGlyUGF0aDsKKworICAgICAgICAvKiogU2hvdyBwcm9ncmVzcyBkaWFsb2cgd2l0aCBhIGRlbGF5ICovCisgICAgICAgIGZpbmFsIEhhbmRsZXIgZGVsYXllZERpYWxvZ0hhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNQcm9ncmVzc0RpYWxvZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coRGlyTGlzdEFjdGl2aXR5LnRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldENhbmNlbGFibGUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFByb2dyZXNzU3R5bGUoUHJvZ3Jlc3NEaWFsb2cuU1RZTEVfU1BJTk5FUik7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0VGl0bGUoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRNZXNzYWdlKGdldFRleHQoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX21zZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zaG93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBNZXNzYWdlIG1zZ1Nob3dEaWFsb2cgPSBkZWxheWVkRGlhbG9nSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRyk7CisgICAgICAgIGRlbGF5ZWREaWFsb2dIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2dTaG93RGlhbG9nLCBQUk9HUkVTU19ESUFMT0dfREVMQVlfTVMpOworCisgICAgICAgIC8qKiBEZWxlZ2F0ZSBsb2FkaW5nIGNvbnRlbnRzIGZyb20gU0QgY2FyZCB0byBhIG5ldyB0aHJlYWQgKi8KKyAgICAgICAgbmV3IExvYWRMaXN0SXRlbXNUaHJlYWQobUN1cnJlbnREaXJQYXRoLCBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfTE9BREVEX0lURU1TKSB7CisgICAgICAgICAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG5ldyBEaXJMaXN0QWRhcHRlcihEaXJMaXN0QWN0aXZpdHkudGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTGlzdEl0ZW1bXSltc2cub2JqKSk7CisgICAgICAgICAgICAgICAgICAgIGRlbGF5ZWREaWFsb2dIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRyk7CisgICAgICAgICAgICAgICAgICAgIHNldFRpdGxlKHNob3J0ZW5UaXRsZShtQ3VycmVudERpclBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNQcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KS5zdGFydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGZpbmQgYSBuZWF0IHdheSB0byBkZXRlcm1pbmUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBmaXQgaW4gdGhlIHRpdGxlCisgICAgICogYmFyLgorICAgICAqICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2hvcnRlblRpdGxlKFN0cmluZyB0aXRsZSkgeworICAgICAgICBpZiAodGl0bGUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgcmV0dXJuICJUZXN0cycgcm9vdCBkaXI6IjsKKyAgICAgICAgfQorICAgICAgICBpbnQgY2hhckNvdW50ID0gbUxpc3RWaWV3LmdldFdpZHRoKCkgLyBNRUFOX1RJVExFX0NIQVJfU0laRTsKKworICAgICAgICBpZiAodGl0bGUubGVuZ3RoKCkgPiBjaGFyQ291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiAiLi4uIiArIHRpdGxlLnN1YnN0cmluZyh0aXRsZS5sZW5ndGgoKSAtIGNoYXJDb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdGl0bGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFycmF5IHdpdGggY29udGVudHMgb2YgdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyAgICAgKiBGaXJzdCBpdCBjb250YWlucyB0aGUgc3ViZm9sZGVycywgdGhlbiB0aGUgZmlsZXMuIEJvdGggc29ydGVkCisgICAgICogYWxwaGFiZXRpY2FsbHkuCisgICAgICoKKyAgICAgKiBUaGUgZGlyUGF0aCBpcyByZWxhdGl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3RJdGVtW10gZ2V0RGlyTGlzdChTdHJpbmcgZGlyUGF0aCkgeworICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKG1Sb290RGlyUGF0aCwgZGlyUGF0aCk7CisKKyAgICAgICAgTGlzdDxMaXN0SXRlbT4gc3ViRGlycyA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZW0+KCk7CisgICAgICAgIExpc3Q8TGlzdEl0ZW0+IHN1YkZpbGVzID0gbmV3IEFycmF5TGlzdDxMaXN0SXRlbT4oKTsKKworICAgICAgICBmb3IgKEZpbGUgaXRlbSA6IGRpci5saXN0RmlsZXMoKSkgeworICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXJlY3RvcnkoKSAmJiBGaWxlRmlsdGVyLmlzVGVzdERpcihpdGVtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBzdWJEaXJzLmFkZChuZXcgTGlzdEl0ZW0oZ2V0UmVsYXRpdmVQYXRoKGl0ZW0pLCB0cnVlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEZpbGVGaWx0ZXIuaXNUZXN0RmlsZShpdGVtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBzdWJGaWxlcy5hZGQobmV3IExpc3RJdGVtKGdldFJlbGF0aXZlUGF0aChpdGVtKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3ViRGlycyk7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3ViRmlsZXMpOworCisgICAgICAgIC8qKiBDb25jYXRlbmF0ZSB0aGUgdHdvIGxpc3RzICovCisgICAgICAgIHN1YkRpcnMuYWRkQWxsKHN1YkZpbGVzKTsKKworICAgICAgICByZXR1cm4gc3ViRGlycy50b0FycmF5KG5ldyBMaXN0SXRlbVtzdWJEaXJzLnNpemUoKV0pOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChGaWxlIGZpbGUpIHsKKyAgICAgICAgRmlsZSByb290RGlyID0gbmV3IEZpbGUobVJvb3REaXJQYXRoKTsKKyAgICAgICAgcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZUZpcnN0KHJvb3REaXIuZ2V0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3IsICIiKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBmOWIyODIzLi5mMTNjZmFmIDEwMDY0NAotLS0gYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzMsNyArMzMsNyBAQAogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkxheWVyc0FjdGl2aXR5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9MYXllcnMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQiPgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgpAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlhmZXJtb2RlQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1hmZXJtb2RlcyIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudCI+CisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CkBAIC01Myw3ICs1MywzNSBAQAogICAgICAgICA8YWN0aXZpdHkKICAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkJpdG1hcHNBY3Rpdml0eSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQml0bWFwcyIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudCI+CisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkJpdG1hcHNSZWN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0JpdG1hcHNSZWN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJOaW5lUGF0Y2hlc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il85cGF0Y2giPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJRdWlja1JlamVjdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9RdWlja1JlamVjdCI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDEuanBnIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg1MWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDIucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FjdGl2aXR5LmphdmEKaW5kZXggODVlN2JmMC4uZGZjOGE3MSAxMDA2NDQKLS0tIGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWN0aXZpdHkuamF2YQpAQCAtMjYsMTMgKzI2LDI0IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5TY2FsZUFuaW1hdGlvbjsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQogcHVibGljIGNsYXNzIEJpdG1hcHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBCaXRtYXBzVmlldyh0aGlzKSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgICAgICAKKyAgICAgICAgU2NhbGVBbmltYXRpb24gYSA9IG5ldyBTY2FsZUFuaW1hdGlvbigxLjBmLCAyLjBmLCAxLjBmLCAyLjBmLAorICAgICAgICAgICAgICAgIFNjYWxlQW5pbWF0aW9uLlJFTEFUSVZFX1RPX1NFTEYsIDAuNWYsCisgICAgICAgICAgICAgICAgU2NhbGVBbmltYXRpb24uUkVMQVRJVkVfVE9fU0VMRiwwLjVmKTsKKyAgICAgICAgYS5zZXREdXJhdGlvbigyMDAwKTsKKyAgICAgICAgYS5zZXRSZXBlYXRDb3VudChBbmltYXRpb24uSU5GSU5JVEUpOworICAgICAgICBhLnNldFJlcGVhdE1vZGUoQW5pbWF0aW9uLlJFVkVSU0UpOworICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGEpOwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBCaXRtYXBzVmlldyBleHRlbmRzIFZpZXcgewpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzUmVjdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3MjZjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzUmVjdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQml0bWFwc1JlY3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCaXRtYXBzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1CaXRtYXBQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVNyY1JlY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbURzdFJlY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbURzdFJlY3QyOworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKworICAgICAgICAgICAgZmluYWwgZmxvYXQgZm91cnRoID0gbUJpdG1hcDEuZ2V0V2lkdGgoKSAvIDQuMGY7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBoYWxmID0gbUJpdG1hcDEuZ2V0SGVpZ2h0KCkgLyAyLjBmOworICAgICAgICAgICAgbVNyY1JlY3QgPSBuZXcgUmVjdCgoaW50KSBmb3VydGgsIChpbnQpIChoYWxmIC0gaGFsZiAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoZm91cnRoICsgZm91cnRoKSwgKGludCkgKGhhbGYgKyBoYWxmIC8gMi4wZikpOworICAgICAgICAgICAgbURzdFJlY3QgPSBuZXcgUmVjdEYoZm91cnRoLCBoYWxmIC0gaGFsZiAvIDIuMGYsIGZvdXJ0aCArIGZvdXJ0aCwgaGFsZiArIGhhbGYgLyAyLjBmKTsKKyAgICAgICAgICAgIG1Ec3RSZWN0MiA9IG5ldyBSZWN0Rihmb3VydGgsIGhhbGYgLSBoYWxmIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgKGZvdXJ0aCArIGZvdXJ0aCkgKiAzLjBmLCAoaGFsZiArIGhhbGYgLyAyLjBmKSAqIDMuMGYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYsIDUwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBtU3JjUmVjdCwgbURzdFJlY3QsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtMTAwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgbVNyY1JlY3QsIG1Ec3RSZWN0MiwgbUJpdG1hcFBhaW50KTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTmluZVBhdGNoZXNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjY4ZmJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTmluZVBhdGNoZXNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIAorICAgICAgICBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbih0aGlzKTsKKyAgICAgICAgYi5zZXRMYXlvdXRQYXJhbXMobmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyhGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIGIuc2V0VGV4dCgiOSBwYXRjaGVzIik7CisgICAgICAgIGxheW91dC5hZGRWaWV3KGIpOworICAgICAgICBsYXlvdXQuc2V0QmFja2dyb3VuZENvbG9yKDB4ZmZmZmZmZmYpOworICAgICAgICAKKyAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUXVpY2tSZWplY3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdhMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBRdWlja1JlamVjdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgUXVpY2tSZWplY3RWaWV3IHZpZXcgPSBuZXcgUXVpY2tSZWplY3RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUXVpY2tSZWplY3RWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKworICAgICAgICBRdWlja1JlamVjdFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMC4wZiwgMC4wZiwgNDAuMGYsIDQwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIC1tQml0bWFwMS5nZXRXaWR0aCgpLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDUwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcGhvbmUucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODE1NTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdF9zeXNfcGhvbmUucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXRfc3lzX3Bob25lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJhYmM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXRfc3lzX3Bob25lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvU3RhdHVzQmFyVGVzdC5qYXZhIGIvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YQppbmRleCBjNmE0MTM0Li5iNjY1ZDJmIDEwMDY0NAotLS0gYS90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvU3RhdHVzQmFyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEKQEAgLTg5LDExICs4OSwxMiBAQAogICAgICAgICBuZXcgVGVzdCgiUHJpb3JpdHkgbm90aWZpY2F0aW9uIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3QgPSBuZXcgTm90aWZpY2F0aW9uKFN0YXR1c0JhclRlc3QudGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19zdGF0dXNiYXJfbWlzc2VkY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpY2sgdGljayB0aWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5zdGF0X3N5c19waG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluY29taW5nIGNhbGwgZnJvbTogSW1wZXJpb3VzIExlYWRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLSgxMDAwKjYwKjYwKjI0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig0NTMpIDEyMy0yMzI4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkltcGVyaW91cyBMZWFkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDg4OCkgNTU1LTUwMzgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgbm90LmZsYWdzIHw9IE5vdGlmaWNhdGlvbi5GTEFHX0hJR0hfUFJJT1JJVFk7CiAgICAgICAgICAgICAgICAgSW50ZW50IGZ1bGxTY3JlZW5JbnRlbnQgPSBuZXcgSW50ZW50KFN0YXR1c0JhclRlc3QudGhpcywgVGVzdEFsZXJ0QWN0aXZpdHkuY2xhc3MpOwo=