ZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmggYi9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCmluZGV4IDczZjExYTQuLmMwYTVlM2IgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaApAQCAtMzA5LDcgKzMwOSw3IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICogRFJNIGZyYW1ld29yay4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmggYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCmluZGV4IDE4MzdhMTEuLmE1NDU5NDEgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaApAQCAtMjUwLDcgKzI1MCw3IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICogRFJNIGZyYW1ld29yay4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKaW5kZXggMzg1ODY3NS4uOGM4NzgzYiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKQEAgLTIzMCw3ICsyMzAsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqIERSTSBmcmFtZXdvcmsuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KICAgICAgKiBAcmV0dXJuIHN0YXR1c190CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKaW5kZXggYjYyZGRiOS4uZWI1YjBmNiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaApAQCAtMjUyLDggKzI1Miw3IEBACiAKIC8qKgogICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0IGJ1dCBkb2VzIG5vdGhpbmcgZm9yCi0gKiBGb3J3YXJkIExvY2sgRW5naW5lLgorICogRFJNIGZyYW1ld29yay4gRG9lcyBub3RoaW5nIGZvciBGb3J3YXJkIExvY2sgRW5naW5lLgogICoKICAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCiAgKiBAcmV0dXJuIHN0YXR1c190CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbAppbmRleCA4Zjk1Y2QyLi5jMWQ1YjNkIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwKQEAgLTQ4OCw3ICs0ODgsNyBAQAogPHAgY2xhc3M9TXNvQm9keVRleHQ+PGI+Tm90ZTo8L2I+IFRoZSBrZXktZW5jcnlwdGlvbiBrZXkgbXVzdCBiZSB1bmlxdWUgdG8gZWFjaAogZGV2aWNlOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhlIGZpbGVzIGZvcndhcmQgbG9ja5Zwcm90ZWN0ZWQuIElkZWFsbHksIGl0IHNob3VsZAogYmUgZGVyaXZlZCBmcm9tIHNlY3JldCBoYXJkd2FyZSBwYXJhbWV0ZXJzLCBidXQgYXQgdGhlIHZlcnkgbGVhc3QgaXQgc2hvdWxkIGJlCi1wZXJzaXN0ZW50IGZyb20gb25lIG1hc3RlciByZXNldCB0byB0aGUgbmV4dC48L3A+CitwZXJzaXN0ZW50IGZyb20gb25lIGZhY3RvcnkgcmVzZXQgdG8gdGhlIG5leHQuPC9wPgogCiA8ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDtwYWRkaW5nOjEuMHB0IDQuMHB0IDEuMHB0IDQuMHB0OwogYmFja2dyb3VuZDojRjJGMkYyJz4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaCBiL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaAppbmRleCA4NjZlZGFjLi5hMzhhYTliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKKysrIGIvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCkBAIC0zMTgsNyArMzE4LDcgQEAKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKiBEUk0gZnJhbWV3b3JrLgogICAgICAqCiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKZGlmZiAtLWdpdCBhL21lZGlhL09XTkVSUyBiL21lZGlhL09XTkVSUwppbmRleCAxYWZjMjUzLi5iZDgzYWQ5IDEwMDY0NAotLS0gYS9tZWRpYS9PV05FUlMKKysrIGIvbWVkaWEvT1dORVJTCkBAIC04LDcgKzgsNiBAQAogaHVuZ2FAZ29vZ2xlLmNvbQogamlhYmluQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQota3JvY2FyZEBnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCiBtYXJjb25lQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAKaW5kZXggMzYxMzdlNi4uYmIwNTBjOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAKQEAgLTUwNCwzMCArNTA0LDI4IEBACiB9CiAKIHN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCiAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKLSAgICB1aW50OF90KiBkc3RTdGFydCA9IGRzdDsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgc3JjWSwgd2lkdGgpOworICAgICAgICBtZW1jcHkoZHN0WSwgc3JjWSwgd2lkdGgpOwogICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CiAgICAgfQogCi0gICAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNWLCB3aWR0aCAvIDIpOworICAgICAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggLyAyKTsKICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQogCi0gICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgd2lkdGggLyAyKTsKKyAgICAgICAgbWVtY3B5KGRzdFUsIHNyY1UsIHdpZHRoIC8gMik7CiAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwogICAgIH0KIH0KIApAQCAtNTk0LDE2ICs1OTIsMTIgQEAKICAgICByZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKAorICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAogICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAogICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKLSAgICBzaXplX3QgZHN0WVNpemUgPSBkc3RZU3RyaWRlICogaGVpZ2h0OwotICAgIHNpemVfdCBkc3RVVlNpemUgPSBkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDI7Ci0gICAgdWludDhfdCAqZHN0ViA9IGRzdFkgKyBkc3RZU2l6ZTsKLSAgICB1aW50OF90ICpkc3RVID0gZHN0ViArIGRzdFVWU2l6ZTsKKyAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewpAQCAtNjk0LDcgKzY4OCw5IEBACiAgICAgICAgICAgYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LAogICAgICAgICAgIChpbnQpKihpbnQ2NF90KilpbWctPnVzZXJfcHJpdik7CiAKLSAgICB1aW50OF90KiBkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90KiBkc3RZID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCogZHN0VSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIHVpbnQ4X3QqIGRzdFYgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IGltZy0+c3RyaWRlW0FPTV9QTEFORV9ZXTsKICAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IGltZy0+c3RyaWRlW0FPTV9QTEFORV9VXTsKICAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IGltZy0+c3RyaWRlW0FPTV9QTEFORV9WXTsKQEAgLTcwOCwxMyArNzA0LDE0IEBACiAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdOwogCiAgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKLSAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKCh1aW50MzJfdCAqKWRzdFksIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdFksIGRzdFUsIGRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgfQpAQCAtNzIzLDcgKzcyMCw3IEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9VXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdOwogICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgICAgICAgICBkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwKICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLAogICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAogICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCmluZGV4IDkzMmExNmEuLjU0ODBkMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCkBAIC0zNCw3ICszNCwxMSBAQAogCiBjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiOwogY29uc3RleHByIHVpbnQzMl90IGtEZWZhdWx0T3V0cHV0RGVsYXkgPSA4OwotY29uc3RleHByIHVpbnQzMl90IGtNYXhPdXRwdXREZWxheSA9IDE2OworLyogYXZjIHNwZWNpZmljYXRpb24gYWxsb3dzIGZvciBhIG1heGltdW0gZGVsYXkgb2YgMTYgZnJhbWVzLgorICAgQXMgc29mdCBhdmMgZGVjb2RlciBzdXBwb3J0cyBpbnRlcmxhY2VkLCB0aGlzIGRlbGF5IHdvdWxkIGJlIDMyIGZpZWxkcy4KKyAgIEFuZCBhdmMgZGVjb2RlciBpbXBsZW1lbnRhdGlvbiBoYXMgYW4gYWRkaXRpb25hbCBkZWxheSBvZiAyIGRlY29kZSBjYWxscy4KKyAgIFNvIHRvdGFsIG1heGltdW0gb3V0cHV0IGRlbGF5IGlzIDM0ICovCitjb25zdGV4cHIgdWludDMyX3Qga01heE91dHB1dERlbGF5ID0gMzQ7CiBjb25zdGV4cHIgdWludDMyX3Qga01pbklucHV0Qnl0ZXMgPSA0OwogfSAgLy8gbmFtZXNwYWNlCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwCmluZGV4IGVjNWY1NDkuLjVkZmZhNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcApAQCAtNDcwLDMzICs0NzAsMjggQEAKICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICBjb25zdCBzaXplX3QgZHN0WVN0cmlkZSA9IGFsaWduKHdpZHRoLCAxNik7Ci0gIGNvbnN0IHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFlTdHJpZGUgLyAyLCAxNik7Ci0gIHVpbnQ4X3QgKmNvbnN0IGRzdFN0YXJ0ID0gZHN0OwogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgZHN0WSArPSBkc3RZU3RyaWRlOwogICB9CiAKLSAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgbWVtY3B5KGRzdFYsIHNyY1YsIHdpZHRoIC8gMik7CiAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwogICB9CiAKLSAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCAvIDIpOwogICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKICAgfQogfQogCkBAIC01NjgsMTUgKzU2MywxMSBAQAogfQogCiBzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKLSAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwKLSAgICBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLAotICAgIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLSAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OwotICBzaXplX3QgZHN0WVNpemUgPSBkc3RTdHJpZGUgKiBoZWlnaHQ7Ci0gIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFN0cmlkZSAvIDIsIDE2KTsKLSAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKLSAgdWludDhfdCAqZHN0ViA9IGRzdFkgKyBkc3RZU2l6ZTsKLSAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKKyAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKIAogICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CkBAIC01ODQsNyArNTc1LDcgQEAKICAgICB9CiAKICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgZHN0WSArPSBkc3RTdHJpZGU7CisgICAgZHN0WSArPSBkc3RZU3RyaWRlOwogICB9CiAKICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKQEAgLTY3OSwxMSArNjcwLDE3IEBACiAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCksIG91dCBmcmFtZWluZGV4ICVkIiwgYmxvY2stPndpZHRoKCksCiAgICAgICAgIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LCAoaW50KWJ1ZmZlci0+dXNlcl9wcml2YXRlX2RhdGEpOwogCi0gIHVpbnQ4X3QgKmRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgdWludDhfdCAqZHN0WSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgdWludDhfdCAqZHN0VSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgdWludDhfdCAqZHN0ViA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBidWZmZXItPnN0cmlkZVswXTsKICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBidWZmZXItPnN0cmlkZVsxXTsKICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBidWZmZXItPnN0cmlkZVsyXTsKIAorICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB3Vmlldy5sYXlvdXQoKTsKKyAgc2l6ZV90IGRzdFlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKwogICBpZiAoYnVmZmVyLT5iaXRkZXB0aCA9PSAxMCkgewogICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZID0gKGNvbnN0IHVpbnQxNl90ICopYnVmZmVyLT5wbGFuZVswXTsKICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSA9IChjb25zdCB1aW50MTZfdCAqKWJ1ZmZlci0+cGxhbmVbMV07CkBAIC02OTEsMTkgKzY4OCwyNCBAQAogCiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgewogICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKAotICAgICAgICAgICh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLAotICAgICAgICAgIHNyY1ZTdHJpZGUgLyAyLCBhbGlnbihtV2lkdGgsIDE2KSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsCisgICAgICAgICAgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3RZLCBkc3RVLCBkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgfQogICB9IGVsc2UgewogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+cGxhbmVbMF07CiAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5wbGFuZVsxXTsKICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPnBsYW5lWzJdOwotICAgIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZShkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKGRzdFksIGRzdFUsIGRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICB9CiAgIGZpbmlzaFdvcmsoYnVmZmVyLT51c2VyX3ByaXZhdGVfZGF0YSwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CiAgIGJsb2NrID0gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKaW5kZXggN2U2Njg1ZS4uZDQ1M2EwYSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKQEAgLTQ2NywzNCArNDY3LDM0IEBACiAvKiBUT0RPOiBjYW4gcmVtb3ZlIHRlbXBvcmFyeSBjb3B5IGFmdGVyIGxpYnJhcnkgc3VwcG9ydHMgd3JpdGluZyB0byBkaXNwbGF5CiAgKiBidWZmZXIgWSwgVSBhbmQgViBwbGFuZSBwb2ludGVycyB1c2luZyBzdHJpZGUgaW5mby4gKi8KIHN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICB1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgdWludDhfdCAqc3JjLAogICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAogICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgdWludDMyX3Qgd2lkdGgsCiAgICAgICAgIHVpbnQzMl90IGhlaWdodCkgewogICAgIHNpemVfdCBzcmNVVlN0cmlkZSA9IHNyY1lTdHJpZGUgLyAyOwogICAgIHVpbnQ4X3QgKnNyY1N0YXJ0ID0gc3JjOwotICAgIHVpbnQ4X3QgKmRzdFN0YXJ0ID0gZHN0OworCiAgICAgc2l6ZV90IHZTdHJpZGUgPSBhbGlnbihoZWlnaHQsIDE2KTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgIG1lbWNweShkc3RZLCBzcmMsIHdpZHRoKTsKICAgICAgICAgIHNyYyArPSBzcmNZU3RyaWRlOwotICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CiAgICAgfQorCiAgICAgLyogVSBidWZmZXIgKi8KICAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlOwotICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggLyAyKTsKKyAgICAgICAgIG1lbWNweShkc3RVLCBzcmMsIHdpZHRoIC8gMik7CiAgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwogICAgIH0KKwogICAgIC8qIFYgYnVmZmVyICovCiAgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZSAqIDUgLyA0OwotICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBtZW1jcHkoZHN0Viwgc3JjLCB3aWR0aCAvIDIpOwogICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOwotICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKICAgICB9CiB9CiAKQEAgLTY3NSwxMSArNjc1LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICB1aW50OF90ICpvdXRwdXRCdWZmZXJZID0gd1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyVSA9IHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHVpbnQ4X3QgKm91dHB1dEJ1ZmZlclYgPSB3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCiAgICAgICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHdWaWV3LmxheW91dCgpOwogICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKICAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOwogICAgICAgICAodm9pZCljb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJZLAorICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlclksIG91dHB1dEJ1ZmZlclUsIG91dHB1dEJ1ZmZlclYsCiAgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdLAogICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAogICAgICAgICAgICAgICAgIGFsaWduKG1XaWR0aCwgMTYpLCBtV2lkdGgsIG1IZWlnaHQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcAppbmRleCBmYmM5YzhhLi42NWYwM2ZhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcApAQCAtNjMwLDMxICs2MzAsMzAgQEAKIH0KIAogc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgIHVpbnQ4X3QgKmRzdFN0YXJ0ID0gZHN0OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjWSwgd2lkdGgpOworICAgICAgICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOwogICAgIH0KIAotICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgIG1lbWNweShkc3RWLCBzcmNWLCB3aWR0aCAvIDIpOwogICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKICAgICB9CiAKLSAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdFUsIHNyY1UsIHdpZHRoIC8gMik7CiAgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwogICAgIH0KKwogfQogCiBzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAodWludDMyX3QgKmRzdCwKQEAgLTcyMCwxNiArNzE5LDEyIEBACiAgICAgcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcih1aW50OF90ICpkc3QsCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7Ci0KLSAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7Ci0gICAgc2l6ZV90IGRzdFlTaXplID0gZHN0WVN0cmlkZSAqIGhlaWdodDsKLSAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOwotICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7Ci0gICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewogCiAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKQEAgLTgyMiw3ICs4MTcsMTAgQEAKICAgICAgICAgICAgYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LAogICAgICAgICAgICAoKGMyX2NudHI2NF90ICopaW1nLT51c2VyX3ByaXYpLT5wZWVrbGwoKSk7CiAKLSAgICB1aW50OF90ICpkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqZHN0WSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90ICpkc3RVID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIHVpbnQ4X3QgKmRzdFYgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisKICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKICAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKICAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKQEAgLTg0MSwxOCArODM5LDE4IEBACiAgICAgICAgICAgICBjb25zdGV4cHIgc2l6ZV90IGtIZWlnaHQgPSA2NDsKICAgICAgICAgICAgIGZvciAoOyBpIDwgbUhlaWdodDsgaSArPSBrSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgcXVldWUtPmVudHJpZXMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgW2RzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsIGRzdFlTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBtV2lkdGgsIGhlaWdodCA9IHN0ZDo6bWluKG1IZWlnaHQgLSBpLCBrSGVpZ2h0KV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAvIDIgKiBrSGVpZ2h0OwogICAgICAgICAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZSAvIDIgKiAoa0hlaWdodCAvIDIpOwogICAgICAgICAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZSAvIDIgKiAoa0hlaWdodCAvIDIpOwotICAgICAgICAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlICoga0hlaWdodDsKKyAgICAgICAgICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGUgKiBrSGVpZ2h0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHF1ZXVlLT5udW1QZW5kaW5nKTsKICAgICAgICAgICAgIHF1ZXVlLT5udW1QZW5kaW5nID0gcXVldWUtPmVudHJpZXMuc2l6ZSgpOwpAQCAtODYxLDggKzg1OSw5IEBACiAgICAgICAgICAgICAgICAgcXVldWUud2FpdEZvckNvbmRpdGlvbihxdWV1ZS0+Y29uZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0WSwgZHN0VSwgZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9CkBAIC04NzAsOCArODY5LDEwIEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisKICAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgIGRzdFksIGRzdFUsIGRzdFYsCisgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLAogICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAogICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZFRlc3QueG1sCmluZGV4IDFmMTdkNDIuLmZjODE1MmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZFRlc3QueG1sCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZFRlc3QueG1sCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkV4dHJhY3RvclVuaXRUZXN0LT4vZGF0YS9sb2NhbC90bXAvRXh0cmFjdG9yVW5pdFRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvZXh0cmFjdG9yLTEuMy56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL2V4dHJhY3Rvci0xLjQuemlwP3VuemlwPXRydWUiCiAgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0V4dHJhY3RvclVuaXRUZXN0UmVzLyIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcAppbmRleCBiN2M2YzU5Li5kOTFmZmZhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcApAQCAtMTM4LDEwICsxMzgsMjMgQEAKICAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CiAKICAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGFuZGFyZEV4dHJhY3RvcnM+IG1hcEV4dHJhY3RvciA9IHsKLSAgICAgICAgICAgICAgICB7ImFhYyIsIEFBQ30sICAgICB7ImFtciIsIEFNUn0sICAgICAgICAgeyJtcDMiLCBNUDN9LCAgICAgICAgIHsib2dnIiwgT0dHfSwKLSAgICAgICAgICAgICAgICB7IndhdiIsIFdBVn0sICAgICB7Im1rdiIsIE1LVn0sICAgICAgICAgeyJmbGFjIiwgRkxBQ30sICAgICAgIHsibWlkaSIsIE1JREl9LAotICAgICAgICAgICAgICAgIHsibXBlZzQiLCBNUEVHNH0sIHsibXBlZzJ0cyIsIE1QRUcyVFN9LCB7Im1wZWcycHMiLCBNUEVHMlBTfSwgeyJtcDQiLCBNUEVHNH0sCi0gICAgICAgICAgICAgICAgeyJ3ZWJtIiwgTUtWfSwgICAgeyJ0cyIsIE1QRUcyVFN9LCAgICAgIHsibXBlZyIsIE1QRUcyUFN9fTsKKyAgICAgICAgICAgICAgICB7ImFhYyIsIEFBQ30sCisgICAgICAgICAgICAgICAgeyJhbXIiLCBBTVJ9LAorICAgICAgICAgICAgICAgIHsiZmxhYyIsIEZMQUN9LAorICAgICAgICAgICAgICAgIHsibWlkIiwgTUlESX0sCisgICAgICAgICAgICAgICAgeyJtaWRpIiwgTUlESX0sCisgICAgICAgICAgICAgICAgeyJta3YiLCBNS1Z9LAorICAgICAgICAgICAgICAgIHsibXAzIiwgTVAzfSwKKyAgICAgICAgICAgICAgICB7Im1wNCIsIE1QRUc0fSwKKyAgICAgICAgICAgICAgICB7Im1wZWcycHMiLCBNUEVHMlBTfSwKKyAgICAgICAgICAgICAgICB7Im1wZWcydHMiLCBNUEVHMlRTfSwKKyAgICAgICAgICAgICAgICB7Im1wZWc0IiwgTVBFRzR9LAorICAgICAgICAgICAgICAgIHsibXBnIiwgTVBFRzJQU30sCisgICAgICAgICAgICAgICAgeyJvZ2ciLCBPR0d9LAorICAgICAgICAgICAgICAgIHsib3B1cyIsIE9HR30sCisgICAgICAgICAgICAgICAgeyJ0cyIsIE1QRUcyVFN9LAorICAgICAgICAgICAgICAgIHsid2F2IiwgV0FWfSwKKyAgICAgICAgICAgICAgICB7IndlYm0iLCBNS1Z9fTsKICAgICAgICAgLy8gRmluZCB0aGUgY29tcG9uZW50IHR5cGUKICAgICAgICAgaWYgKG1hcEV4dHJhY3Rvci5maW5kKHdyaXRlckZvcm1hdCkgIT0gbWFwRXh0cmFjdG9yLmVuZCgpKSB7CiAgICAgICAgICAgICBtRXh0cmFjdG9yTmFtZSA9IG1hcEV4dHJhY3Rvci5hdCh3cml0ZXJGb3JtYXQpOwpAQCAtOTQwLDM2ICs5NTMsNTUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICAgICAgc3RyaW5nIGlucHV0MCA9IEdldFBhcmFtKCkuZmlyc3Q7Ci0gICAgICAgIHN0cmluZyBpbnB1dDEgPSBHZXRQYXJhbSgpLnNlY29uZDsKLQotICAgICAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCBleHRyYWN0ZWQgZGF0YSBmb3IgYm90aCBleHRyYWN0b3JzCi0gICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBzdGF0KChnRW52LT5nZXRSZXMoKSArIGlucHV0MCkuY19zdHIoKSwgJmJ1Zik7Ci0gICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJVbmFibGUgdG8gZ2V0IGZpbGUgcHJvcGVydGllcyI7Ci0KLSAgICAgICAgLy8gYWxsb2NhdGluZyB0aGUgYnVmZmVyIHNpemUgYXMgMnggc2luY2Ugc29tZQotICAgICAgICAvLyBleHRyYWN0b3JzIGxpa2UgZmxhYywgbWlkaSBhbmQgd2F2IGRlY29kZXMgdGhlIGZpbGUuCi0gICAgICAgIG1FeHRyYWN0b3JPdXRwdXRbMF0gPSAoaW50OF90ICopY2FsbG9jKDEsIGJ1Zi5zdF9zaXplICogMik7Ci0gICAgICAgIEFTU0VSVF9ORShtRXh0cmFjdG9yT3V0cHV0WzBdLCBudWxscHRyKQotICAgICAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB3cml0aW5nIGV4dHJhY3RvcidzIG91dHB1dCI7Ci0gICAgICAgIG1FeHRyYWN0b3JPdXB1dFNpemVbMF0gPSBidWYuc3Rfc2l6ZSAqIDI7Ci0KLSAgICAgICAgc3RhdHVzID0gc3RhdCgoZ0Vudi0+Z2V0UmVzKCkgKyBpbnB1dDEpLmNfc3RyKCksICZidWYpOwotICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiVW5hYmxlIHRvIGdldCBmaWxlIHByb3BlcnRpZXMiOwotCi0gICAgICAgIC8vIGFsbG9jYXRlIGJ1ZmZlciBmb3IgZXh0cmFjdG9yIG91dHB1dCwgMnggaW5wdXQgZmlsZSBzaXplLgotICAgICAgICBtRXh0cmFjdG9yT3V0cHV0WzFdID0gKGludDhfdCAqKWNhbGxvYygxLCBidWYuc3Rfc2l6ZSAqIDIpOwotICAgICAgICBBU1NFUlRfTkUobUV4dHJhY3Rvck91dHB1dFsxXSwgbnVsbHB0cikKLSAgICAgICAgICAgICAgICA8PCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igd3JpdGluZyBleHRyYWN0b3IncyBvdXRwdXQiOwotICAgICAgICBtRXh0cmFjdG9yT3VwdXRTaXplWzFdID0gYnVmLnN0X3NpemUgKiAyOwotICAgIH0KLQogICAgIGludDhfdCAqbUV4dHJhY3Rvck91dHB1dFsyXXt9OwogICAgIHNpemVfdCBtRXh0cmFjdG9yT3VwdXRTaXplWzJde307CiB9OwogCitzaXplX3QgYWxsb2NhdGVPdXRwdXRCdWZmZXJzKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBBTWVkaWFGb3JtYXQgKmV4dHJhY3RvckZvcm1hdCkgeworICAgIHNpemVfdCBidWZmZXJTaXplID0gMHU7CisgICAgLy8gYWxsb2NhdGluZyB0aGUgYnVmZmVyIHNpemUgYXMgc2FtcGxlUmF0ZSAqIGNoYW5uZWxDb3VudCAqIGNsaXBEdXJhdGlvbiBzaW5jZQorICAgIC8vIHNvbWUgZXh0cmFjdG9ycyBsaWtlIGZsYWMsIG1pZGkgYW5kIHdhdiBkZWNvZGVzIHRoZSBmaWxlLiBUaGVzZSBleHRyYWN0b3JzCisgICAgLy8gYWR2ZXJ0aXNlIHRoZSBtaW1lIHR5cGUgYXMgcmF3LgorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpIHsKKyAgICAgICAgaW50NjRfdCBjbGlwRHVyYXRpb25VcyA9IC0xOworICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IC0xOworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAtMTsKKyAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcHBsZSA9IC0xOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxDb3VudCkgfHwgY2hhbm5lbENvdW50IDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWxDb3VudCBmb3IgaW5wdXQgZmlsZSA6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpIHx8CisgICAgICAgICAgICBzYW1wbGVSYXRlIDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNhbXBsZVJhdGUgZm9yIGlucHV0IGZpbGUgOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQ2NChleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZjbGlwRHVyYXRpb25VcykgfHwKKyAgICAgICAgICAgIGNsaXBEdXJhdGlvblVzIDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNsaXAgZHVyYXRpb24gZm9yIGlucHV0IGZpbGUgOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYml0c1BlclNhbXBwbGUpIHx8IGJpdHNQZXJTYW1wcGxlIDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJpdHMgcGVyIHNhbXBsZSBmb3IgaW5wdXQgZmlsZSA6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlclNpemUgPSBiaXRzUGVyU2FtcHBsZSAqIGNoYW5uZWxDb3VudCAqIHNhbXBsZVJhdGUgKiAoY2xpcER1cmF0aW9uVXMgLyAxMDAwMDAwICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBpbnQzMl90IHN0YXR1cyA9IHN0YXQoaW5wdXRGaWxlTmFtZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGdldCBmaWxlIHByb3BlcnRpZXMgZm9yOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBidWZmZXJTaXplID0gYnVmLnN0X3NpemU7CisgICAgfQorICAgIHJldHVybiBidWZmZXJTaXplOworfQorCiAvLyBDb21wYXJlIG91dHB1dCBvZiB0d28gZXh0cmFjdG9ycyBmb3IgaWRlbnRpY2FsIGNvbnRlbnQKIFRFU1RfUChFeHRyYWN0b3JDb21wYXJpc29uLCBFeHRyYWN0b3JDb21wYXJpc29uVGVzdCkgewogICAgIHZlY3RvcjxzdHJpbmc+IGlucHV0RmlsZU5hbWVzID0ge0dldFBhcmFtKCkuZmlyc3QsIEdldFBhcmFtKCkuc2Vjb25kfTsKQEAgLTEwMTEsNiArMTA0MywxMyBAQAogICAgICAgICBDTWVkaWFUcmFjayAqY1RyYWNrID0gd3JhcCh0cmFjayk7CiAgICAgICAgIEFTU0VSVF9ORShjVHJhY2ssIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIHdyYXBwZXIgZm9yIGluZGV4ICIgPDwgdHJhY2tJZHg7CiAKKyAgICAgICAgbUV4dHJhY3Rvck91cHV0U2l6ZVtpZHhdID0gYWxsb2NhdGVPdXRwdXRCdWZmZXJzKGlucHV0RmlsZU5hbWUsIGV4dHJhY3RvckZvcm1hdFtpZHhdKTsKKyAgICAgICAgQVNTRVJUX0dUKG1FeHRyYWN0b3JPdXB1dFNpemVbaWR4XSwgMHUpIDw8ICIgSW52YWxpZCBzaXplIGZvciBvdXRwdXQgYnVmZmVycyI7CisKKyAgICAgICAgbUV4dHJhY3Rvck91dHB1dFtpZHhdID0gKGludDhfdCAqKWNhbGxvYygxLCBtRXh0cmFjdG9yT3VwdXRTaXplW2lkeF0pOworICAgICAgICBBU1NFUlRfTkUobUV4dHJhY3Rvck91dHB1dFtpZHhdLCBudWxscHRyKQorICAgICAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB3cml0aW5nIGV4dHJhY3RvcidzIG91dHB1dCI7CisKICAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOwogICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKICAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFjayI7CkBAIC0xMDg3LDE0ICsxMTI2LDQ0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5wdXRGaWxlTmFtZXNbMV0gPDwgIiBleHRyYWN0b3JzIjsKIH0KIAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEV4dHJhY3RvckNvbXBhcmlzb25BbGwsIEV4dHJhY3RvckNvbXBhcmlzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X3ZwOS5tcDQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dpcmxfMTQ0eDEzNl92cDkud2VibSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidmlkZW9fNDgweDM2MF9tcDRfdnA5XzMzM2ticHNfMjVmcHMubXA0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzQ4MHgzNjBfd2VibV92cDlfMzMza2Jwc18yNWZwcy53ZWJtIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ2aWRlb18xMjgweDcyMF9hdjFfaGRyX3N0YXRpY18zbWJwcy5tcDQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTI4MHg3MjBfYXYxX2hkcl9zdGF0aWNfM21icHMud2VibSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibG91ZHNvZnRhYWMuYWFjIiwgImxvdWRzb2Z0YWFjLm1rdiIpKSk7CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEV4dHJhY3RvckNvbXBhcmlzb25BbGwsIEV4dHJhY3RvckNvbXBhcmlzb24sCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigic3dpcmxfMTQ0eDEzNl92cDkubXA0IiwgInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ2aWRlb180ODB4MzYwX21wNF92cDlfMzMza2Jwc18yNWZwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzQ4MHgzNjBfd2VibV92cDlfMzMza2Jwc18yNWZwcy53ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidmlkZW9fMTI4MHg3MjBfYXYxX2hkcl9zdGF0aWNfM21icHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xMjgweDcyMF9hdjFfaGRyX3N0YXRpY18zbWJwcy53ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTMyeDEzMF9tcGVnNC4zZ3AiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X2F2Yy5ta3YiLCAic3dpcmxfMTQ0eDEzNl9hdmMubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF81MDh4MjQwXzI1ZnBzX2hldmMubXA0IiwiY3Jvd2RfNTA4eDI0MF8yNWZwc19oZXZjLm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnMi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnMi50cyIpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibG91ZHNvZnRhYWMuYWFjIiwgImxvdWRzb2Z0YWFjLm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcGZsYWNta3YubWt2IiwgInNpbmVzd2VlcGZsYWNtcDQubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwbXAzbGFtZS5tcDMiLCAic2luZXN3ZWVwbXAzbGFtZS5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBvZ2dtcDQubXA0IiwgInNpbmVzd2VlcG9nZy5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXB2b3JiaXMubXA0IiwgInNpbmVzd2VlcHZvcmJpcy5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXB2b3JiaXMubWt2IiwgInNpbmVzd2VlcHZvcmJpcy5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ0ZXN0b3B1cy5ta3YiLCAidGVzdG9wdXMubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidGVzdG9wdXMubXA0IiwgInRlc3RvcHVzLm9wdXMiKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImxvdWRzb2Z0YWFjLmFhYyIsICJsb3Vkc29mdGFhYy5hYWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ0ZXN0YW1yLmFtciIsICJ0ZXN0YW1yLmFtciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcGZsYWMuZmxhYyIsICJzaW5lc3dlZXBmbGFjLmZsYWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtaWRpX2EubWlkIiwgIm1pZGlfYS5taWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXB2b3JiaXMubWt2IiwgInNpbmVzd2VlcHZvcmJpcy5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBtcDNsYW1lLm1wMyIsICJzaW5lc3dlZXBtcDNsYW1lLm1wMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcG9nZ21wNC5tcDQiLCAic2luZXN3ZWVwb2dnbXA0Lm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInRlc3RvcHVzLm9wdXMiLCAidGVzdG9wdXMub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImpvaG5fY2FnZS5vZ2ciLCAiam9obl9jYWdlLm9nZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1vbm90ZXN0Z3NtLndhdiIsICJtb25vdGVzdGdzbS53YXYiKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiwgInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X3ZwOS53ZWJtIiwgInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X3ZwOC53ZWJtIiwgInN3aXJsXzE0NHgxMzZfdnA4LndlYm0iKSkpOwogCiBJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQ29uZmlnUGFyYW1UZXN0QWxsLCBDb25maWdQYXJhbVRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJhYWMiLCBBQUNfMSksCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL1JFQURNRS5tZCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kCmluZGV4IDY5NTM4YjYuLmNmZjA5Y2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kCkBAIC0yMiw3ICsyMiw3IEBACiBhZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L0V4dHJhY3RvclVuaXRUZXN0L0V4dHJhY3RvclVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KIGBgYAogCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9leHRyYWN0b3IuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvZXh0cmFjdG9yLTEuNC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCiAKIGBgYAogYWRiIHB1c2ggZXh0cmFjdG9yIC9kYXRhL2xvY2FsL3RtcC8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUwppbmRleCA0ODJiOWZiLi4wMzRkMTYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTCkBAIC0xLDMgKzEsNCBAQAogZ2thc3RlbkBnb29nbGUuY29tCitodW5nYUBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUyBiL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUwppbmRleCAxNDU2YWI2Li43MWIxN2U2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTCkBAIC0xLDIgKzEgQEAKLWtyb2NhcmRAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKaW5kZXggOTZkNjEwNC4uMWFhY2ZkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCkBAIC0yNSw3ICsyNSw2IEBACiAKICNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL09XTkVSUyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCmluZGV4IDdmOWFlODEuLmI3ODMyZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCkBAIC0xLDQgKzEsMyBAQAogaHVuZ2FAZ29vZ2xlLmNvbQota3JvY2FyZEBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCiByYWdvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDY3NGMyNDYuLmFlYTc3MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icApAQCAtNDQsNiArNDQsMzYgQEAKIH0KIAogY2NfdGVzdCB7CisgICAgbmFtZTogInJldmVyYl90ZXN0IiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIiCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlicmV2ZXJid3JhcHBlciIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInJldmVyYl90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKICAgICBuYW1lOiAic25yIiwKICAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHNfcmV2ZXJiLnNoIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0c19yZXZlcmIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWE5NzJkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHNfcmV2ZXJiLnNoCkBAIC0wLDAgKzEsODcgQEAKKyMhL2Jpbi9iYXNoCisjCisjIHJldmVyYiB0ZXN0CisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjIGxvY2F0aW9uIG9mIHRlc3QgZmlsZXMKK3Rlc3RkaXI9Ii9kYXRhL2xvY2FsL3RtcC9yZXZUZXN0IgorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyByZXZlcmIiCithZGIgc2hlbGwgbWtkaXIgLXAgJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCisKK0VfVkFMPTEKK2NtZHM9ImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3JldmVyYl90ZXN0L2FybS9yZXZlcmJfdGVzdCAkdGVzdGRpciIKKworZnNfYXJyPSgKKyAgICA4MDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDMyMDAwCisgICAgNDQxMDAKKyAgICA0ODAwMAorICAgIDg4MjAwCisgICAgOTYwMDAKKyAgICAxNzY0MDAKKyAgICAxOTIwMDAKKykKKworIyBydW4gcmV2ZXJiIGF0IGRpZmZlcmVudCBjb25maWdzLCBzYXZpbmcgb25seSB0aGUgc3RlcmVvIGNoYW5uZWwKKyMgcGFpci4KK2Vycm9yX2NvdW50PTAKK2ZvciBjbWQgaW4gIiR7Y21kc1tAXX0iCitkbworICAgICRjbWQKKyAgICBmb3IgcHJlc2V0X3ZhbCBpbiB7MC4uNn0KKyAgICBkbworICAgICAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgICAgIGRvCisgICAgICAgICAgICBmb3IgY2hNYXNrIGluIHsxLi4yMn0KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgYWRiIHNoZWxsIExEX0xJQlJBUllfUEFUSD0vc3lzdGVtL3ZlbmRvci9saWIvc291bmRmeCAkdGVzdGRpci9yZXZlcmJfdGVzdCBcCisgICAgICAgICAgICAgICAgICAgIC0taW5wdXQgJHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgIC0tY2hNYXNrICRjaE1hc2sgLS1mcyAkZnMgLS1wcmVzZXQgJHByZXNldF92YWwKKworICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgIGlmIFsgJHNoZWxsX3JldCAtbmUgMCBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGVjaG8gImVycm9yOiAkc2hlbGxfcmV0IgorICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAjIGNvbXB1dGF0aW9uIChmaXJzdCAyIGNoYW5uZWxzKS4KKyAgICAgICAgICAgICAgICBpZiBbWyAiJGNoTWFzayIgLWd0IDEgXV0KKyAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBjbXAgJHRlc3RkaXIvc2luZXN3ZWVwXzFfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3CisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAjIGNtcCByZXR1cm5zIEVYSVRfRkFJTFVSRSBvbiBtaXNtYXRjaC4KKyAgICAgICAgICAgICAgICBzaGVsbF9yZXQ9JD8KKyAgICAgICAgICAgICAgICBpZiBbICRzaGVsbF9yZXQgLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBlY2hvICJlcnJvcjogJHNoZWxsX3JldCIKKyAgICAgICAgICAgICAgICAgICAgKCgrK2Vycm9yX2NvdW50KSkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICBkb25lCisgICAgZG9uZQorZG9uZQorCithZGIgc2hlbGwgcm0gLXIgJHRlc3RkaXIKK2VjaG8gIiRlcnJvcl9jb3VudCBlcnJvcnMiCitleGl0ICRlcnJvcl9jb3VudApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvcmV2ZXJiX3Rlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvcmV2ZXJiX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Y2YzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9yZXZlcmJfdGVzdC5jcHAKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgIkVmZmVjdFJldmVyYi5oIgorCisvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCitleHRlcm4gYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTTsKKworLy8gR2xvYmFsIFZhcmlhYmxlcworZW51bSBSZXZlcmJQYXJhbXMgeworICBBUkdfSEVMUCA9IDEsCisgIEFSR19JTlBVVCwKKyAgQVJHX09VVFBVVCwKKyAgQVJHX0ZTLAorICBBUkdfQ0hfTUFTSywKKyAgQVJHX1BSRVNFVCwKKyAgQVJHX0FVWCwKKyAgQVJHX01PTk9fTU9ERSwKKyAgQVJHX0ZJTEVfQ0gsCit9OworCitjb25zdCBlZmZlY3RfdXVpZF90IGtSZXZlcmJVdWlkc1tdID0geworICAgIHsweDE3MmNkZjAwLAorICAgICAweGEzYmMsCisgICAgIDB4MTFkZiwKKyAgICAgMHhhNzJmLAorICAgICB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gcHJlc2V0LWluc2VydCBtb2RlCisgICAgezB4ZjI5YTE0MDAsCisgICAgIDB4YTNiYiwKKyAgICAgMHgxMWRmLAorICAgICAweDhkZGMsCisgICAgIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBwcmVzZXQtYXV4IG1vZGUKK307CisKKy8vIHN0cnVjdHVyZXMKK3N0cnVjdCByZXZlcmJDb25maWdQYXJhbXNfdCB7CisgIGludCBmQ2hhbm5lbHMgPSAyOworICBpbnQgbW9ub01vZGUgPSBmYWxzZTsKKyAgaW50IGZyYW1lTGVuZ3RoID0gMjU2OworICBpbnQgcHJlc2V0ID0gMDsKKyAgaW50IG5yQ2hhbm5lbHMgPSAyOworICBpbnQgc2FtcGxlUmF0ZSA9IDQ4MDAwOworICBpbnQgYXV4aWxpYXJ5ID0gMDsKKyAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworfTsKKworY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGtSZXZlcmJDb25maWdDaE1hc2tbXSA9IHsKKyAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAorICAgICgxIDw8IDQpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCisgICAgKDEgPDwgNSkgLSAxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAorICAgICgxIDw8IDYpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLAorICAgICgxIDw8IDcpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgKDEgPDwgOCkgLSAxLAorfTsKKworY29uc3RleHByIGludCBrUmV2ZXJiQ29uZmlnQ2hNYXNrQ291bnQgPSBzdGQ6OnNpemUoa1JldmVyYkNvbmZpZ0NoTWFzayk7CisKK2ludCByZXZlcmJDcmVhdGVFZmZlY3QoZWZmZWN0X2hhbmRsZV90ICpwRWZmZWN0SGFuZGxlLCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcsIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpb0lkLCBpbnQgYXV4RmxhZykgeworICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoJmtSZXZlcmJVdWlkc1thdXhGbGFnXSwgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9JZCwgcEVmZmVjdEhhbmRsZSk7CisgICAgICBzdGF0dXMgIT0gMCkgeworICAgIEFMT0dFKCJSZXZlcmIgY3JlYXRlIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBpbnQgcmVwbHkgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAoKipwRWZmZWN0SGFuZGxlKQorICAgICAgLT5jb21tYW5kKCpwRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLCBwQ29uZmlnLAorICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgIHJldHVybiByZXBseTsKK30KKworaW50IHJldmVyYlNldENvbmZpZ1BhcmFtKHVpbnQzMl90IHBhcmFtVHlwZSwgdWludDMyX3QgcGFyYW1WYWx1ZSwgZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSkgeworICBpbnQgcmVwbHkgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICB1aW50MzJfdCBwYXJhbURhdGFbMl0gPSB7cGFyYW1UeXBlLCBwYXJhbVZhbHVlfTsKKyAgZWZmZWN0X3BhcmFtX3QgKmVmZmVjdFBhcmFtID0KKyAgICAgIChlZmZlY3RfcGFyYW1fdCAqKW1hbGxvYyhzaXplb2YoKmVmZmVjdFBhcmFtKSArIHNpemVvZihwYXJhbURhdGEpKTsKKyAgbWVtY3B5KCZlZmZlY3RQYXJhbS0+ZGF0YVswXSwgJnBhcmFtRGF0YVswXSwgc2l6ZW9mKHBhcmFtRGF0YSkpOworICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKKyAgZWZmZWN0UGFyYW0tPnZzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVsxXSk7CisgIGludCBzdGF0dXMgPQorICAgICAgKCplZmZlY3RIYW5kbGUpCisgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YocGFyYW1EYXRhKSwgZWZmZWN0UGFyYW0sICZyZXBseVNpemUsICZyZXBseSk7CisgIGZyZWUoZWZmZWN0UGFyYW0pOworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICBBTE9HRSgiUmV2ZXJiIHNldCBjb25maWcgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisgIHJldHVybiByZXBseTsKK30KKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICA8ZXhlY3V0YWJsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlIG9wdGlvbnMgYXJlLCAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1pbnB1dCA8aW5wdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBpbnB1dCBmaWxlIik7CisgIHByaW50ZigiXG4gICAgIC0tb3V0cHV0IDxvdXRwdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBvdXRwdXQgZmlsZSIpOworICBwcmludGYoIlxuICAgICAtLWhlbHAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgcHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1jaE1hc2sgPGNoYW5uZWxfbWFzaz5cbiIpOworICBwcmludGYoIlxuICAgICAgICAgICAwICAtIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDMgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNiAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNyAgLSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCIpOworICBwcmludGYoIlxuICAgICAgICAgICA4ICAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDQgY2g6ICgxIDw8IDQpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgICA5ICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDExIC0gQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTIgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA1IGNoOiAoMSA8PCA1KSAtIDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTMgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDE0IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxNSAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSyIpOworICBwcmludGYoIlxuICAgICAgICAgICAxNiAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxNyAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDYgY2g6ICgxIDw8IDYpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxOCAtIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTkgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA3IGNoOiAoMSA8PCA3KSAtIDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMjAgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDIxIC0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIpOworICBwcmludGYoIlxuICAgICAgICAgICAyMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDggY2g6ICgxIDw8IDgpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1mcyA8c2FtcGxpbmdfZnJlcT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCBkZWZhdWx0IDQ4MDAwLiIpOworICBwcmludGYoIlxuICAgICAtLXByZXNldCA8cHJlc2V0X3ZhbHVlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICAwIC0gTm9uZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxIC0gU21hbGwgUm9vbSIpOworICBwcmludGYoIlxuICAgICAgICAgICAyIC0gTWVkaXVtIFJvb20iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMyAtIExhcmdlIFJvb20iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNCAtIE1lZGl1bSBIYWxsIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDUgLSBMYXJnZSBIYWxsIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDYgLSBQbGF0ZSIpOworICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1mY2ggPGZpbGVfY2hhbm5lbHM+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIG51bWJlciBvZiBjaGFubmVscyBpbiBpbnB1dCBmaWxlICgxIHRocm91Z2ggOCksIGRlZmF1bHQgMSIpOworICBwcmludGYoIlxuICAgICAtLU0iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgTW9ubyBtb2RlIChmb3JjZSBhbGwgaW5wdXQgYXVkaW8gY2hhbm5lbHMgdG8gYmUgaWRlbnRpY2FsKSIpOworICBwcmludGYoIlxuICAgICAtLWF1eCA8YXV4aWxpYXJ5X2ZsYWc+ICIpOworICBwcmludGYoIlxuICAgICAgICAgICAwIC0gSW5zZXJ0IE1vZGUgb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAtIGF1eGlsaWFyeSBNb2RlIG9uIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgcmV2ZXJiQ29uZmlnUGFyYW1zX3QgcmV2Q29uZmlnUGFyYW1ze307ICAvLyBkZWZhdWx0IGluaXRpYWxpemUKKyAgY29uc3QgY2hhciAqaW5wdXRGaWxlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqb3V0cHV0RmlsZSA9IG51bGxwdHI7CisKKyAgY29uc3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0geworICAgICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIG51bGxwdHIsIEFSR19IRUxQfSwKKyAgICAgIHsiaW5wdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0lOUFVUfSwKKyAgICAgIHsib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19PVVRQVVR9LAorICAgICAgeyJmcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRlN9LAorICAgICAgeyJjaE1hc2siLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0NIX01BU0t9LAorICAgICAgeyJwcmVzZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX1BSRVNFVH0sCisgICAgICB7ImF1eCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQVVYfSwKKyAgICAgIHsiTSIsIG5vX2FyZ3VtZW50LCAmcmV2Q29uZmlnUGFyYW1zLm1vbm9Nb2RlLCB0cnVlfSwKKyAgICAgIHsiZmNoIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19GSUxFX0NIfSwKKyAgICAgIHtudWxscHRyLCAwLCBudWxscHRyLCAwfSwKKyAgfTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnN0IGludCBvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCAoY2hhciAqY29uc3QgKilhcmd2LCAiaTpvOiIsIGxvbmdfb3B0cywgbnVsbHB0cik7CisgICAgaWYgKG9wdCA9PSAtMSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAob3B0KSB7CisgICAgICBjYXNlIEFSR19IRUxQOgorICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiBFWElUX1NVQ0NFU1M7CisgICAgICBjYXNlIEFSR19JTlBVVDogeworICAgICAgICBpbnB1dEZpbGUgPSAoY2hhciAqKW9wdGFyZzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19PVVRQVVQ6IHsKKyAgICAgICAgb3V0cHV0RmlsZSA9IChjaGFyICopb3B0YXJnOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQVJHX0ZTOiB7CisgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5zYW1wbGVSYXRlID0gYXRvaShvcHRhcmcpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQVJHX0NIX01BU0s6IHsKKyAgICAgICAgaW50IGNoTWFza0lkeCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgaWYgKGNoTWFza0lkeCA8IDAgb3IgY2hNYXNrSWR4ID4ga1JldmVyYkNvbmZpZ0NoTWFza0NvdW50KSB7CisgICAgICAgICAgQUxPR0UoIkNoYW5uZWwgTWFzayBpbmRleCBub3QgaW4gY29ycmVjdCByYW5nZVxuIik7CisgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmNoTWFzayA9IGtSZXZlcmJDb25maWdDaE1hc2tbY2hNYXNrSWR4XTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19QUkVTRVQ6IHsKKyAgICAgICAgcmV2Q29uZmlnUGFyYW1zLnByZXNldCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19BVVg6IHsKKyAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmF1eGlsaWFyeSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19NT05PX01PREU6IHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19GSUxFX0NIOiB7CisgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGlucHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkVycm9yOiBtaXNzaW5nIGlucHV0IGZpbGVzXG4iKTsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGlucHV0RnAoZm9wZW4oaW5wdXRGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisKKyAgaWYgKGlucHV0RnAgPT0gbnVsbHB0cikgeworICAgIEFMT0dFKCJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBpbnB1dEZpbGUpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICBpZiAob3V0cHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkVycm9yOiBtaXNzaW5nIG91dHB1dCBmaWxlc1xuIik7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBvdXRwdXRGcChmb3BlbihvdXRwdXRGaWxlLCAid2IiKSwgJmZjbG9zZSk7CisKKyAgaWYgKG91dHB1dEZwID09IG51bGxwdHIpIHsKKyAgICBBTE9HRSgiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIG91dHB1dEZpbGUpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICBpbnQzMl90IHNlc3Npb25JZCA9IDE7CisgIGludDMyX3QgaW9JZCA9IDE7CisgIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGUgPSBudWxscHRyOworICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSByZXZDb25maWdQYXJhbXMuc2FtcGxlUmF0ZTsKKyAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IHJldkNvbmZpZ1BhcmFtcy5jaE1hc2s7CisgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICByZXZlcmJDcmVhdGVFZmZlY3QoJmVmZmVjdEhhbmRsZSwgJmNvbmZpZywgc2Vzc2lvbklkLCBpb0lkLCByZXZDb25maWdQYXJhbXMuYXV4aWxpYXJ5KTsKKyAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgQUxPR0UoIkNyZWF0ZSBlZmZlY3QgY2FsbCByZXR1cm5lZCBlcnJvciAlaSIsIHN0YXR1cyk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIGludCByZXBseSA9IDA7CisgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICgqZWZmZWN0SGFuZGxlKS0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICBpZiAocmVwbHkgIT0gMCkgeworICAgIEFMT0dFKCJDb21tYW5kIGVuYWJsZSBjYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCByZXBseSk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIGlmIChpbnQgc3RhdHVzID0gcmV2ZXJiU2V0Q29uZmlnUGFyYW0oUkVWRVJCX1BBUkFNX1BSRVNFVCwgKHVpbnQzMl90KXJldkNvbmZpZ1BhcmFtcy5wcmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SGFuZGxlKTsKKyAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgQUxPR0UoIkludmFsaWQgcmV2ZXJiIHByZXNldC4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIHJldkNvbmZpZ1BhcmFtcy5uckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHJldkNvbmZpZ1BhcmFtcy5jaE1hc2spOworICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcmV2Q29uZmlnUGFyYW1zLm5yQ2hhbm5lbHM7CisgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHJldkNvbmZpZ1BhcmFtcy5mcmFtZUxlbmd0aDsKKyNpZmRlZiBCWVBBU1NfRVhFQworICBjb25zdCBpbnQgZnJhbWVTaXplID0gKGludCljaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOworI2VuZGlmCisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHJldkNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHM7CisgIGNvbnN0IGludCBpb0ZyYW1lU2l6ZSA9IGlvQ2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KTsKKyAgY29uc3QgaW50IG1heENoYW5uZWxDb3VudCA9IHN0ZDo6bWF4KGNoYW5uZWxDb3VudCwgaW9DaGFubmVsQ291bnQpOworICAvKgorICAgKiBNb25vIGlucHV0IHdpbGwgYmUgY29udmVydGVkIHRvIDIgY2hhbm5lbHMgaW50ZXJuYWxseSBpbiB0aGUgcHJvY2VzcyBjYWxsCisgICAqIGJ5IGNvcHlpbmcgdGhlIHNhbWUgZGF0YSBpbnRvIHRoZSBzZWNvbmQgY2hhbm5lbC4KKyAgICogSGVuY2Ugd2hlbiBjaGFubmVsQ291bnQgaXMgMSwgb3V0cHV0IGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIGZvcgorICAgKiAyIGNoYW5uZWxzLiBUaGUgbWVtQWxsb2NDaENvdW50IHRha2VzIGNhcmUgb2YgYWxsb2NhdGlvbiBvZiBzdWZmaWNpZW50CisgICAqIG1lbW9yeSBmb3IgdGhlIG91dHB1dCBidWZmZXIuCisgICAqLworICBjb25zdCBpbnQgbWVtQWxsb2NDaENvdW50ID0gKGNoYW5uZWxDb3VudCA9PSAxID8gMiA6IGNoYW5uZWxDb3VudCk7CisKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdEluKGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0T3V0KGZyYW1lTGVuZ3RoICogbWVtQWxsb2NDaENvdW50KTsKKworICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKworICB3aGlsZSAoZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGlucHV0RnAuZ2V0KCkpID09IChzaXplX3QpZnJhbWVMZW5ndGgpIHsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBjaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBpb0ZyYW1lU2l6ZSk7CisgICAgfQorICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmbG9hdEluLmRhdGEoKSwgaW4uZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAvLyBNb25vIG1vZGUgd2lsbCByZXBsaWNhdGUgdGhlIGZpcnN0IGNoYW5uZWwgdG8gYWxsIG90aGVyIGNoYW5uZWxzLgorICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgYXVkaW8gY2hhbm5lbHMgYXJlIGlkZW50aWNhbC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcKKyAgICAvLyBCYXNzIEJvb3N0LCB3aGljaCBleHRyYWN0cyBhIG1vbm8gc2lnbmFsIGZvciBwcm9jZXNzaW5nLgorICAgIGlmIChyZXZDb25maWdQYXJhbXMubW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUxlbmd0aDsgKytpKSB7CisgICAgICAgIGF1dG8gKmZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgIHN0ZDo6ZmlsbChmcCArIDEsIGZwICsgY2hhbm5lbENvdW50LCAqZnApOyAgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19idWZmZXJfdCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyOworICAgIGlucHV0QnVmZmVyLmZyYW1lQ291bnQgPSBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lTGVuZ3RoOworICAgIGlucHV0QnVmZmVyLmYzMiA9IGZsb2F0SW4uZGF0YSgpOworICAgIG91dHB1dEJ1ZmZlci5mMzIgPSBmbG9hdE91dC5kYXRhKCk7CisjaWZuZGVmIEJZUEFTU19FWEVDCisgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZSktPnByb2Nlc3MoZWZmZWN0SGFuZGxlLCAmaW5wdXRCdWZmZXIsICZvdXRwdXRCdWZmZXIpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIlxuRXJyb3I6IFByb2Nlc3MgcmV0dXJuZWQgd2l0aCBlcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorI2Vsc2UKKyAgICBtZW1jcHkoZmxvYXRPdXQuZGF0YSgpLCBmbG9hdEluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBmcmFtZVNpemUpOworI2VuZGlmCisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KG91dC5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgeworICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIGNoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgaW9DaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICB9CisgICAgKHZvaWQpZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgb3V0cHV0RnAuZ2V0KCkpOworICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgfQorCisgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoZWZmZWN0SGFuZGxlKTsKKyAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgQUxPR0UoIkF1ZGlvIFByZXByb2Nlc3NpbmcgcmVsZWFzZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisKKyAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmNmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIGF1ZGlvIHByZXByb2Nlc3NpbmcgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiQXVkaW9QcmVQcm9jZXNzaW5nVGVzdCIsCisKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHNyY3M6IFsiUHJlUHJvY2Vzc2luZ1Rlc3QuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9wcmVwcm9jZXNzaW5nIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYndlYnJ0Y19hdWRpb19wcmVwcm9jZXNzaW5nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFdFQlJUQ19QT1NJWCIsCisgICAgICAgICItZnZpc2liaWxpdHk9ZGVmYXVsdCIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL1ByZVByb2Nlc3NpbmdUZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9QcmVQcm9jZXNzaW5nVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4MWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9QcmVQcm9jZXNzaW5nVGVzdC5jcHAKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KKyNpbmNsdWRlIDxhdWRpb19wcm9jZXNzaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bW9kdWxlX2NvbW1vbl90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgaW1wb3J0ZWQKK2V4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHR5cGVzIG9mIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKK2VudW0gUHJlUHJvY0lkIHsKKyAgUFJFUFJPQ19BR0MsICAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sCisgIFBSRVBST0NfQUVDLCAgLy8gQWNvdXN0aWMgRWNobyBDYW5jZWxlcgorICBQUkVQUk9DX05TLCAgIC8vIE5vaXNlIFN1cHByZXNzb3IKKyAgUFJFUFJPQ19OVU1fRUZGRUNUUworfTsKKworZW51bSBQcmVQcm9jUGFyYW1zIHsKKyAgQVJHX0hFTFAgPSAxLAorICBBUkdfSU5QVVQsCisgIEFSR19PVVRQVVQsCisgIEFSR19GQVIsCisgIEFSR19GUywKKyAgQVJHX0NIX01BU0ssCisgIEFSR19BR0NfVEdUX0xWTCwKKyAgQVJHX0FHQ19DT01QX0xWTCwKKyAgQVJHX0FFQ19ERUxBWSwKKyAgQVJHX05TX0xWTCwKK307CisKK3N0cnVjdCBwcmVQcm9jQ29uZmlnUGFyYW1zX3QgeworICBpbnQgc2FtcGxpbmdGcmVxID0gMTYwMDA7CisgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTzsKKyAgaW50IG5zTGV2ZWwgPSAwOyAgICAgICAgIC8vIGEgdmFsdWUgYmV0d2VlbiAwLTMKKyAgaW50IGFnY1RhcmdldExldmVsID0gMzsgIC8vIGluIGRCCisgIGludCBhZ2NDb21wTGV2ZWwgPSA5OyAgICAvLyBpbiBkQgorICBpbnQgYWVjRGVsYXkgPSAwOyAgICAgICAgLy8gaW4gbXMKK307CisKK2NvbnN0IGVmZmVjdF91dWlkX3Qga1ByZVByb2NVdWlkc1tQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHsKKyAgICB7MHhhYTgxMzBlMCwgMHg2NmZjLCAweDExZTAsIDB4YmFkMCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIGFnYyB1dWlkCisgICAgezB4YmIzOTJlYzAsIDB4OGQ0ZCwgMHgxMWUwLCAweGE4OTYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBhZWMgdXVpZAorICAgIHsweGMwNmM4NDAwLCAweDhlMDYsIDB4MTFlMCwgMHg5Y2I2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gbnMgIHV1aWQKK307CisKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrUHJlUHJvY0NvbmZpZ0NoTWFza1tdID0geworICAgIEFVRElPX0NIQU5ORUxfSU5fTU9OTywKKyAgICBBVURJT19DSEFOTkVMX0lOX1NURVJFTywKKyAgICBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9JTl82LAorICAgIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTywKKyAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PLAorICAgIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfQ0FMTF9NT05PLAorfTsKKworY29uc3RleHByIGludCBrUHJlUHJvY0NvbmZpZ0NoTWFza0NvdW50ID0gc3RkOjpzaXplKGtQcmVQcm9jQ29uZmlnQ2hNYXNrKTsKKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICA8ZXhlY3V0YWJsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlIG9wdGlvbnMgYXJlLCAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1pbnB1dCA8aW5wdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBpbnB1dCBmaWxlIik7CisgIHByaW50ZigiXG4gICAgIC0tb3V0cHV0IDxvdXRwdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBvdXRwdXQgZmlsZSIpOworICBwcmludGYoIlxuICAgICAtLWhlbHAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgUHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1mcyA8c2FtcGxpbmdfZnJlcT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCBkZWZhdWx0IDE2MDAwLiIpOworICBwcmludGYoIlxuICAgICAtY2hfbWFzayA8Y2hhbm5lbF9tYXNrPlxuIik7CisgIHByaW50ZigiXG4gICAgICAgICAwICAtIEFVRElPX0NIQU5ORUxfSU5fTU9OTyIpOworICBwcmludGYoIlxuICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIpOworICBwcmludGYoIlxuICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDMgIC0gQVVESU9fQ0hBTk5FTF9JTl82Iik7CisgIHByaW50ZigiXG4gICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDYgIC0gQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICA3ICAtIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgOCAgLSBBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDkgIC0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTyIpOworICBwcmludGYoIlxuICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PICIpOworICBwcmludGYoIlxuICAgICAgICAgMTEgLSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0NBTExfTU9OTyAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuICAgICAtLWZhciA8ZmFyZW5kX2ZpbGU+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIFBhdGggdG8gZmFyLWVuZCBmaWxlIG5lZWRlZCBmb3IgZWNobyBjYW5jZWxsYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1hZWMiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEVjaG8gQ2FuY2VsbGF0aW9uLCBkZWZhdWx0IGRpc2FibGVkIik7CisgIHByaW50ZigiXG4gICAgIC0tbnMiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIE5vaXNlIFN1cHByZXNzaW9uLCBkZWZhdWx0IGRpc2FibGVkIik7CisgIHByaW50ZigiXG4gICAgIC0tYWdjIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBHYWluIENvbnRyb2wsIGRlZmF1bHQgZGlzYWJsZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1uc19sdmwgPG5zX2xldmVsPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBOb2lzZSBTdXBwcmVzc2lvbiBsZXZlbCBpbiBkQiwgZGVmYXVsdCB2YWx1ZSAwZEIiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1hZ2NfdGd0X2x2bCA8dGFyZ2V0X2xldmVsPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBBR0MgVGFyZ2V0IExldmVsIGluIGRCLCBkZWZhdWx0IHZhbHVlIDNkQiIpOworICBwcmludGYoIlxuICAgICAtLWFnY19jb21wX2x2bCA8Y29tcF9sZXZlbD4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgQUdDIENvbXAgTGV2ZWwgaW4gZEIsIGRlZmF1bHQgdmFsdWUgOWRCIik7CisgIHByaW50ZigiXG4gICAgIC0tYWVjX2RlbGF5IDxkZWxheT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgQUVDIGRlbGF5IHZhbHVlIGluIG1zLCBkZWZhdWx0IHZhbHVlIDBtcyIpOworICBwcmludGYoIlxuIik7Cit9CisKK2NvbnN0ZXhwciBmbG9hdCBrVGVuTWlsbGlTZWNWYWwgPSAwLjAxOworCitpbnQgcHJlUHJvY0NyZWF0ZUVmZmVjdChlZmZlY3RfaGFuZGxlX3QgKnBFZmZlY3RIYW5kbGUsIHVpbnQzMl90IGVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcsIGludCBzZXNzaW9uSWQsIGludCBpb0lkKSB7CisgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0uY3JlYXRlX2VmZmVjdCgma1ByZVByb2NVdWlkc1tlZmZlY3RUeXBlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgaW9JZCwgcEVmZmVjdEhhbmRsZSk7CisgICAgICBzdGF0dXMgIT0gMCkgeworICAgIEFMT0dFKCJBdWRpbyBQcmVwcm9jZXNzaW5nIGNyZWF0ZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgaW50IHJlcGx5ID0gMDsKKyAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgaWYgKGVmZmVjdFR5cGUgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAoKipwRWZmZWN0SGFuZGxlKQorICAgICAgICAtPmNvbW1hbmQoKnBFZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgcENvbmZpZywKKyAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgIH0KKyAgKCoqcEVmZmVjdEhhbmRsZSkKKyAgICAgIC0+Y29tbWFuZCgqcEVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgcENvbmZpZywKKyAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICByZXR1cm4gcmVwbHk7Cit9CisKK2ludCBwcmVQcm9jU2V0Q29uZmlnUGFyYW0odWludDMyX3QgcGFyYW1UeXBlLCB1aW50MzJfdCBwYXJhbVZhbHVlLCBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlKSB7CisgIGludCByZXBseSA9IDA7CisgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHtwYXJhbVR5cGUsIHBhcmFtVmFsdWV9OworICBlZmZlY3RfcGFyYW1fdCAqZWZmZWN0UGFyYW0gPQorICAgICAgKGVmZmVjdF9wYXJhbV90ICopbWFsbG9jKHNpemVvZigqZWZmZWN0UGFyYW0pICsgc2l6ZW9mKHBhcmFtRGF0YSkpOworICBtZW1jcHkoJmVmZmVjdFBhcmFtLT5kYXRhWzBdLCAmcGFyYW1EYXRhWzBdLCBzaXplb2YocGFyYW1EYXRhKSk7CisgIGVmZmVjdFBhcmFtLT5wc2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMF0pOworICAoKmVmZmVjdEhhbmRsZSkKKyAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICBmcmVlKGVmZmVjdFBhcmFtKTsKKyAgcmV0dXJuIHJlcGx5OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGlmIChhcmdjID09IDEpIHsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBjb25zdCBjaGFyICppbnB1dEZpbGUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpvdXRwdXRGaWxlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqZmFyRmlsZSA9IG51bGxwdHI7CisgIGludCBlZmZlY3RFbltQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHswfTsKKworICBjb25zdCBvcHRpb24gbG9uZ19vcHRzW10gPSB7CisgICAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0hFTFB9LAorICAgICAgeyJpbnB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfSU5QVVR9LAorICAgICAgeyJvdXRwdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX09VVFBVVH0sCisgICAgICB7ImZhciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRkFSfSwKKyAgICAgIHsiZnMiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0ZTfSwKKyAgICAgIHsiY2hfbWFzayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQ0hfTUFTS30sCisgICAgICB7ImFnY190Z3RfbHZsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BR0NfVEdUX0xWTH0sCisgICAgICB7ImFnY19jb21wX2x2bCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQUdDX0NPTVBfTFZMfSwKKyAgICAgIHsiYWVjX2RlbGF5IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BRUNfREVMQVl9LAorICAgICAgeyJuc19sdmwiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX05TX0xWTH0sCisgICAgICB7ImFlYyIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19BRUNdLCAxfSwKKyAgICAgIHsiYWdjIiwgbm9fYXJndW1lbnQsICZlZmZlY3RFbltQUkVQUk9DX0FHQ10sIDF9LAorICAgICAgeyJucyIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19OU10sIDF9LAorICAgICAge251bGxwdHIsIDAsIG51bGxwdHIsIDB9LAorICB9OworICBzdHJ1Y3QgcHJlUHJvY0NvbmZpZ1BhcmFtc190IHByZVByb2NDZmdQYXJhbXMge307CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjb25zdCBpbnQgb3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgKGNoYXIgKmNvbnN0ICopYXJndiwgImk6bzoiLCBsb25nX29wdHMsIG51bGxwdHIpOworICAgIGlmIChvcHQgPT0gLTEpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgY2FzZSBBUkdfSEVMUDoKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIGNhc2UgQVJHX0lOUFVUOiB7CisgICAgICAgIGlucHV0RmlsZSA9IChjaGFyICopb3B0YXJnOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQVJHX09VVFBVVDogeworICAgICAgICBvdXRwdXRGaWxlID0gKGNoYXIgKilvcHRhcmc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfRkFSOiB7CisgICAgICAgIGZhckZpbGUgPSAoY2hhciAqKW9wdGFyZzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19GUzogeworICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19DSF9NQVNLOiB7CisgICAgICAgIGludCBjaE1hc2tJZHggPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGlmIChjaE1hc2tJZHggPCAwIG9yIGNoTWFza0lkeCA+IGtQcmVQcm9jQ29uZmlnQ2hNYXNrQ291bnQpIHsKKyAgICAgICAgICBBTE9HRSgiQ2hhbm5lbCBNYXNrIGluZGV4IG5vdCBpbiBjb3JyZWN0IHJhbmdlXG4iKTsKKyAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLmNoTWFzayA9IGtQcmVQcm9jQ29uZmlnQ2hNYXNrW2NoTWFza0lkeF07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfQUdDX1RHVF9MVkw6IHsKKyAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2NUYXJnZXRMZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19BR0NfQ09NUF9MVkw6IHsKKyAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2NDb21wTGV2ZWwgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfQUVDX0RFTEFZOiB7CisgICAgICAgIHByZVByb2NDZmdQYXJhbXMuYWVjRGVsYXkgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfTlNfTFZMOiB7CisgICAgICAgIHByZVByb2NDZmdQYXJhbXMubnNMZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoaW5wdXRGaWxlID09IG51bGxwdHIpIHsKKyAgICBBTE9HRSgiRXJyb3I6IG1pc3NpbmcgaW5wdXQgZmlsZVxuIik7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGlucHV0RnAoZm9wZW4oaW5wdXRGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisgIGlmIChpbnB1dEZwID09IG51bGxwdHIpIHsKKyAgICBBTE9HRSgiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgaW5wdXRGaWxlKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBmYXJGcChmb3BlbihmYXJGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gb3V0cHV0RnAoZm9wZW4ob3V0cHV0RmlsZSwgIndiIiksICZmY2xvc2UpOworICBpZiAoZWZmZWN0RW5bUFJFUFJPQ19BRUNdKSB7CisgICAgaWYgKGZhckZpbGUgPT0gbnVsbHB0cikgeworICAgICAgQUxPR0UoIkZhciBlbmQgc2lnbmFsIGZpbGUgcmVxdWlyZWQgZm9yIGVjaG8gY2FuY2VsbGF0aW9uIFxuIik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoZmFyRnAgPT0gbnVsbHB0cikgeworICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIGZhciBlbmQgc3RyZWFtIGZpbGUgJXNcbiIsIGZhckZpbGUpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgc3RydWN0IHN0YXQgc3RhdElucHV0LCBzdGF0RmFyOworICAgICh2b2lkKWZzdGF0KGZpbGVubyhpbnB1dEZwLmdldCgpKSwgJnN0YXRJbnB1dCk7CisgICAgKHZvaWQpZnN0YXQoZmlsZW5vKGZhckZwLmdldCgpKSwgJnN0YXRGYXIpOworICAgIGlmIChzdGF0SW5wdXQuc3Rfc2l6ZSAhPSBzdGF0RmFyLnN0X3NpemUpIHsKKyAgICAgIEFMT0dFKCJOZWFyIGFuZCBmYXIgZW5kIHNpZ25hbHMgYXJlIG9mIGRpZmZlcmVudCBzaXplcyIpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgIH0KKyAgaWYgKG91dHB1dEZpbGUgIT0gbnVsbHB0ciAmJiBvdXRwdXRGcCA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBvdXRwdXRGaWxlKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgaW50MzJfdCBzZXNzaW9uSWQgPSAxOworICBpbnQzMl90IGlvSWQgPSAxOworICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlW1BSRVBST0NfTlVNX0VGRkVDVFNdID0ge251bGxwdHJ9OworICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcTsKKyAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IHByZVByb2NDZmdQYXJhbXMuY2hNYXNrOworICBjb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworICAvLyBDcmVhdGUgYWxsIHRoZSBlZmZlY3QgaGFuZGxlcworICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY0NyZWF0ZUVmZmVjdCgmZWZmZWN0SGFuZGxlW2ldLCBpLCAmY29uZmlnLCBzZXNzaW9uSWQsIGlvSWQpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkNyZWF0ZSBlZmZlY3QgY2FsbCByZXR1cm5lZCBlcnJvciAlaSIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CisgICAgaWYgKGVmZmVjdEVuW2ldID09IDEpIHsKKyAgICAgIGludCByZXBseSA9IDA7CisgICAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgICAgKCplZmZlY3RIYW5kbGVbaV0pCisgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZVtpXSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICBpZiAocmVwbHkgIT0gMCkgeworICAgICAgICBBTE9HRSgiQ29tbWFuZCBlbmFibGUgY2FsbCByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmVwbHkpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFNldCBDb25maWcgUGFyYW1zIG9mIHRoZSBlZmZlY3RzCisgIGlmIChlZmZlY3RFbltQUkVQUk9DX0FHQ10pIHsKKyAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShBR0NfUEFSQU1fVEFSR0VUX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLmFnY1RhcmdldExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FHQ10pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkludmFsaWQgQUdDIFRhcmdldCBMZXZlbC4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoaW50IHN0YXR1cyA9CisgICAgICAgICAgICBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUdDX1BBUkFNX0NPTVBfR0FJTiwgKHVpbnQzMl90KXByZVByb2NDZmdQYXJhbXMuYWdjQ29tcExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FHQ10pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkludmFsaWQgQUdDIENvbXAgR2Fpbi4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgfQorICBpZiAoZWZmZWN0RW5bUFJFUFJPQ19OU10pIHsKKyAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShOU19QQVJBTV9MRVZFTCwgKHVpbnQzMl90KXByZVByb2NDZmdQYXJhbXMubnNMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19OU10pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkludmFsaWQgTm9pc2UgU3VwcHJlc3Npb24gbGV2ZWwgRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgfQorCisgIC8vIFByb2Nlc3MgQ2FsbAorICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSAoaW50KShwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcSAqIGtUZW5NaWxsaVNlY1ZhbCk7CisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKHByZVByb2NDZmdQYXJhbXMuY2hNYXNrKTsKKyAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOworICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW4oZnJhbWVMZW5ndGggKiBpb0NoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIGlvQ2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gZmFySW4oZnJhbWVMZW5ndGggKiBpb0NoYW5uZWxDb3VudCk7CisgICAgc2l6ZV90IHNhbXBsZXNSZWFkID0gZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGlucHV0RnAuZ2V0KCkpOworICAgIGlmIChzYW1wbGVzUmVhZCA9PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYXVkaW9fYnVmZmVyX3QgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlcjsKKyAgICBhdWRpb19idWZmZXJfdCBmYXJJbkJ1ZmZlcnt9OworICAgIGlucHV0QnVmZmVyLmZyYW1lQ291bnQgPSBzYW1wbGVzUmVhZDsKKyAgICBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCA9IHNhbXBsZXNSZWFkOworICAgIGlucHV0QnVmZmVyLnMxNiA9IGluLmRhdGEoKTsKKyAgICBvdXRwdXRCdWZmZXIuczE2ID0gb3V0LmRhdGEoKTsKKworICAgIGlmIChmYXJGcCAhPSBudWxscHRyKSB7CisgICAgICBzYW1wbGVzUmVhZCA9IGZyZWFkKGZhckluLmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmYXJGcC5nZXQoKSk7CisgICAgICBpZiAoc2FtcGxlc1JlYWQgPT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZhckluQnVmZmVyLmZyYW1lQ291bnQgPSBzYW1wbGVzUmVhZDsKKyAgICAgIGZhckluQnVmZmVyLnMxNiA9IGZhckluLmRhdGEoKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgaWYgKGVmZmVjdEVuW2ldID09IDEpIHsKKyAgICAgICAgaWYgKGkgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAgICAgICBpZiAoaW50IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgICBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUVDX1BBUkFNX0VDSE9fREVMQVksICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLmFlY0RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FFQ10pOworICAgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoInByZVByb2NTZXRDb25maWdQYXJhbSByZXR1cm5lZCBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAoKmVmZmVjdEhhbmRsZVtpXSktPnByb2Nlc3MoZWZmZWN0SGFuZGxlW2ldLCAmaW5wdXRCdWZmZXIsICZvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyBpID0gJWQgcmV0dXJuZWQgd2l0aCBlcnJvciAlZFxuIiwgaSwgc3RhdHVzKTsKKyAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IFBSRVBST0NfQUVDKSB7CisgICAgICAgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnByb2Nlc3NfcmV2ZXJzZShlZmZlY3RIYW5kbGVbaV0sICZmYXJJbkJ1ZmZlciwgJm91dHB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyByZXZlcnNlIGkgPSAlZCByZXR1cm5lZCB3aXRoIGVycm9yICVkXG4iLCBpLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG91dHB1dEZwICE9IG51bGxwdHIpIHsKKyAgICAgIHNpemVfdCBzYW1wbGVzV3JpdHRlbiA9CisgICAgICAgICAgZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCwgb3V0cHV0RnAuZ2V0KCkpOworICAgICAgaWYgKHNhbXBsZXNXcml0dGVuICE9IG91dHB1dEJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgIEFMT0dFKCJcbkVycm9yOiBPdXRwdXQgZmlsZSB3cml0aW5nIGZhaWxlZCIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZnJhbWVDb3VudGVyICs9IGZyYW1lTGVuZ3RoOworICB9CisgIC8vIFJlbGVhc2UgYWxsIHRoZSBlZmZlY3QgaGFuZGxlcyBjcmVhdGVkCisgIGZvciAoaW50IGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CisgICAgaWYgKGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5yZWxlYXNlX2VmZmVjdChlZmZlY3RIYW5kbGVbaV0pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkF1ZGlvIFByZXByb2Nlc3NpbmcgcmVsZWFzZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggYzEwMzIzNi4uZmVlOWNhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTU3LDYgKzU3LDggQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VDSE9fQ0FOQ0VMTEVSKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpLAogICAgIC8vIFNUVUIgbXVzdCBiZSBhZnRlciBERUZBVUxULCBzbyB0aGUgbGF0dGVyIGlzIHBpY2tlZCB1cCBieSB0b1N0cmluZyBmaXJzdC4KICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9TVFVCKSwKQEAgLTk2LDYgKzk4LDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VUKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9CTEUpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fREVGQVVMVCksCiAgICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fU1RVQiksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCA5NWM5NzNhLi5kZTdmZTA4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTExOCw2ICsxMTgsNyBAQAogICAgIHVwZGF0ZU1ldHJpY3MoImRlc3RydWN0b3IiKTsKICAgICBsb2dNZXRyaWNzKCJkZXN0cnVjdG9yIik7CiAKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1ldHJpY3NMb2NrKTsKICAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewogICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW07CiAgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTlVMTDsKQEAgLTEzMSw2ICsxMzIsOCBAQAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldFVJRCh1aWRfdCB1aWQpIHsKICAgICBtUGxheWVyLT5zZXRVSUQodWlkKTsKICAgICBtQ2xpZW50VWlkID0gdWlkOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NZXRyaWNzTG9jayk7CiAgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7CiAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CiAgICAgfQpAQCAtNTQ0LDEwICs1NDcsNDYgQEAKICAgICB9CiAgICAgQUxPR1YoInVwZGF0ZU1ldHJpY3MoJXApIGZyb20gJXMgYXQgc3RhdGUgJWQiLCB0aGlzLCB3aGVyZSwgbVN0YXRlKTsKIAotICAgIC8vIGdhdGhlciB0aGUgZmluYWwgc3RhdHMgZm9yIHRoaXMgcmVjb3JkCisgICAgLy8gZ2F0aGVyIHRoZSBmaW5hbCB0cmFjayBzdGF0aXN0aWNzIGZvciB0aGlzIHJlY29yZAogICAgIFZlY3RvcjxzcDxBTWVzc2FnZT4+IHRyYWNrU3RhdHM7CiAgICAgbVBsYXllci0+Z2V0U3RhdHMoJnRyYWNrU3RhdHMpOwogCisgICAgLy8gZ2V0RHVyYXRpb24oKSB1c2VzIG1Mb2NrCisgICAgaW50IGR1cmF0aW9uX21zID0gLTE7CisgICAgZ2V0RHVyYXRpb24oJmR1cmF0aW9uX21zKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckR1cmF0aW9uLCBkdXJhdGlvbl9tcyk7CisKKyAgICBtUGxheWVyLT51cGRhdGVJbnRlcm5hbFRpbWVycygpOworCisgICAgaW50NjRfdCBwbGF5aW5nVGltZVVzOworICAgIGludDY0X3QgcmVidWZmZXJpbmdUaW1lVXM7CisgICAgaW50MzJfdCByZWJ1ZmZlcmluZ0V2ZW50czsKKyAgICBib29sIHJlYnVmZmVyaW5nQXRFeGl0OworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgICAgICBwbGF5aW5nVGltZVVzID0gbVBsYXlpbmdUaW1lVXM7CisgICAgICAgIHJlYnVmZmVyaW5nVGltZVVzID0gbVJlYnVmZmVyaW5nVGltZVVzOworICAgICAgICByZWJ1ZmZlcmluZ0V2ZW50cyA9IG1SZWJ1ZmZlcmluZ0V2ZW50czsKKyAgICAgICAgcmVidWZmZXJpbmdBdEV4aXQgPSBtUmVidWZmZXJpbmdBdEV4aXQ7CisgICAgfQorCisgICAgLy8gZmluaXNoIHRoZSByZXN0IG9mIHRoZSBnYXRoZXJpbmcgaG9sZGluZyBtTG9jazsKKyAgICAvLyBzb21lIG9mIHRoZSBmaWVsZHMgd2UgcmVhZCBhcmUgdXBkYXRlZCB1bmRlciBtTG9jay4KKyAgICAvLyB3ZSBhbHNvIGF2b2lkIGFueSByYWNlcyB3aXRoaW4gbUFuYWx5dGljc0l0ZW0gbWFjaGluZXJ5CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NZXRyaWNzTG9jayk7CisKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclBsYXlpbmcsIChwbGF5aW5nVGltZVVzKzUwMCkvMTAwMCApOworCisgICAgaWYgKG1SZWJ1ZmZlcmluZ0V2ZW50cyAhPSAwKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUmVidWZmZXJpbmcsIChyZWJ1ZmZlcmluZ1RpbWVVcys1MDApLzEwMDAgKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0NvdW50LCByZWJ1ZmZlcmluZ0V2ZW50cyk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdBdEV4aXQsIHJlYnVmZmVyaW5nQXRFeGl0KTsKKworICAgICB9CisKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOworCiAgICAgaWYgKHRyYWNrU3RhdHMuc2l6ZSgpID4gMCkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrU3RhdHMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc3RhdHMgPSB0cmFja1N0YXRzLml0ZW1BdChpKTsKQEAgLTU5MiwyNiArNjMxLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIC8vIGFsd2F5cyBwcm92aWRlIGR1cmF0aW9uIGFuZCBwbGF5aW5nIHRpbWUsIGV2ZW4gaWYgdGhleSBoYXZlIDAvdW5rbm93biB2YWx1ZXMuCi0KLSAgICAvLyBnZXREdXJhdGlvbigpIHVzZXMgbUxvY2sgZm9yIG11dGV4IC0tIGNhcmVmdWwgd2hlcmUgd2UgdXNlIGl0LgotICAgIGludCBkdXJhdGlvbl9tcyA9IC0xOwotICAgIGdldER1cmF0aW9uKCZkdXJhdGlvbl9tcyk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJEdXJhdGlvbiwgZHVyYXRpb25fbXMpOwotCi0gICAgbVBsYXllci0+dXBkYXRlSW50ZXJuYWxUaW1lcnMoKTsKLQotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUGxheWluZywgKG1QbGF5aW5nVGltZVVzKzUwMCkvMTAwMCApOwotCi0gICAgaWYgKG1SZWJ1ZmZlcmluZ0V2ZW50cyAhPSAwKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdDb3VudCwgbVJlYnVmZmVyaW5nRXZlbnRzKTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgbVJlYnVmZmVyaW5nQXRFeGl0KTsKLQotICAgIH0KLQotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7CiB9CiAKIApAQCAtNjIxLDYgKzY0MCw5IEBACiAgICAgfQogICAgIEFMT0dWKCJsb2dNZXRyaWNzKCVwKSBmcm9tICVzIGF0IHN0YXRlICVkIiwgdGhpcywgd2hlcmUsIG1TdGF0ZSk7CiAKKyAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgc3RhdHMgYXJlIHN0YWJsZSB3aGlsZSB3ZSdyZSB3cml0aW5nIHRoZW0uCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NZXRyaWNzTG9jayk7CisKICAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCB8fCBtQW5hbHl0aWNzSXRlbS0+aXNFbmFibGVkKCkgPT0gZmFsc2UpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTc3OSwxMSArODAxLDE2IEBACiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgewogCi0gICAgaWYgKGtleSA9PSBGT1VSQ0MoJ20nLCd0JywncicsJ1gnKSAmJiBtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgaWYgKGtleSA9PSBGT1VSQ0MoJ20nLCd0JywncicsJ1gnKSkgewogICAgICAgICAvLyBtdHJYIC0tIGEgcGxheSBvbiAnbWV0cmljcycgKG5vdCBtYXRyaXgpCiAgICAgICAgIC8vIGdhdGhlciBjdXJyZW50IGluZm8gYWxsIHRvZ2V0aGVyLCBwYXJjZWwgaXQsIGFuZCBzZW5kIGl0IGJhY2sKICAgICAgICAgdXBkYXRlTWV0cmljcygiYXBpIik7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKworICAgICAgICAvLyBlbnN1cmUgbUFuYWx5dGljc0l0ZW0gc3RhYmlsaXR5IHdoaWxlIHdyaXRpbmcgdG8gcGFyY2VsCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTWV0cmljc0xvY2spOworICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPndyaXRlVG9QYXJjZWwocmVwbHkpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKQEAgLTEwMDcsMTIgKzEwMzQsMTUgQEAKICAgICAgICAgICAgIC8vIHdoZW4gd2UgaGF2ZSBhbiBlcnJvciwgYWRkIGl0IHRvIHRoZSBhbmFseXRpY3MgZm9yIHRoaXMgcGxheWJhY2suCiAgICAgICAgICAgICAvLyBleHQxIGlzIG91ciBwcmltYXJ5ICdlcnJvciB0eXBlJyB2YWx1ZS4gT25seSBhZGQgZXh0MiB3aGVuIG5vbi16ZXJvLgogICAgICAgICAgICAgLy8gW3Rlc3QgYWdhaW5zdCBtc2cgaXMgZHVlIHRvIGZhbGwgdGhyb3VnaCBmcm9tIHByZXZpb3VzIHN3aXRjaCB2YWx1ZV0KLSAgICAgICAgICAgIGlmIChtc2cgPT0gTUVESUFfRVJST1IgJiYgbUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyRXJyb3IsIGV4dDEpOwotICAgICAgICAgICAgICAgIGlmIChleHQyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvckNvZGUsIGV4dDIpOworICAgICAgICAgICAgaWYgKG1zZyA9PSBNRURJQV9FUlJPUikgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTWV0cmljc0xvY2spOworICAgICAgICAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyRXJyb3IsIGV4dDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0MiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckVycm9yQ29kZSwgZXh0Mik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckVycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF0RU9TID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaAppbmRleCBhZDg3OGY4Li4zN2M1M2IwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaApAQCAtMTQyLDYgKzE0Miw3IEBACiAgICAgdWludDMyX3QgbVBsYXllckZsYWdzOwogCiAgICAgTWVkaWFBbmFseXRpY3NJdGVtICptQW5hbHl0aWNzSXRlbTsKKyAgICBtdXRhYmxlIE11dGV4IG1NZXRyaWNzTG9jazsKICAgICB1aWRfdCBtQ2xpZW50VWlkOwogCiAgICAgYm9vbCBtQXRFT1M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAKaW5kZXggZWU3MDMwNi4uN2RjZWU3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmNwcApAQCAtMzQsOCArMzQsNiBAQAogICAgICAgbVRhcmdldEhhbmRsZXIodGFyZ2V0SGFuZGxlciksCiAgICAgICBtRU9TKGZhbHNlKSwKICAgICAgIG1TZW5kRGF0YU5vdGlmaWNhdGlvbih0cnVlKSB7Ci0gICAgbVNvdXJjZS0+c2V0TGlzdGVuZXIodGhpcyk7Ci0KICAgICBtTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTnVtQnVmZmVycyAqIGtCdWZmZXJTaXplKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1CdWZmZXJzOyArK2kpIHsKICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbU1lbW9yeURlYWxlci0+YWxsb2NhdGUoa0J1ZmZlclNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAppbmRleCBmMjFkMmIzLi4zMjUwYTQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcApAQCAtNzksNiArNzksNyBAQAogCiB2b2lkIE51UGxheWVyOjpTdHJlYW1pbmdTb3VyY2U6OnN0YXJ0KCkgewogICAgIG1TdHJlYW1MaXN0ZW5lciA9IG5ldyBOdVBsYXllclN0cmVhbUxpc3RlbmVyKG1Tb3VyY2UsIE5VTEwpOworICAgIG1Tb3VyY2UtPnNldExpc3RlbmVyKG1TdHJlYW1MaXN0ZW5lcik7CiAKICAgICB1aW50MzJfdCBzb3VyY2VGbGFncyA9IG1Tb3VyY2UtPmZsYWdzKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKaW5kZXggM2QxMDA4Ni4uYmM3MDhlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKQEAgLTUwNiw2ICs1MDYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEZ1bmN0aW9uIENvZGUgRk9SIGlkY3Ryb3cKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93KAogICAgIGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgKICkKQEAgLTgyOCw2ICs4MjksNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEZ1bmN0aW9uIENvZGUgRk9SIGlkY3Rjb2wKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0Y29sKAogICAgIGludDE2ICpibGsKICkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcAppbmRleCBmMzVjZTRmLi4wYmE0OTQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0X3ZjYS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdF92Y2EuY3BwCkBAIC05NCw2ICs5NCw3IEBACiAgICAgcmV0dXJuOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3cyKGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1OwpAQCAtMTgyLDYgKzE4Myw3IEBACiAgICAgcmV0dXJuIDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93MyhpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CkBAIC0yOTEsNiArMjkzLDcgQEAKIH0KIAogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3c0KGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKQEAgLTM2OCw2ICszNzEsNyBAQAogICAgIHJldHVybiA7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdGNvbDQoaW50MTYgKmJsaykKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtNDQ1LDYgKzQ0OSw3IEBACiAgICAgcmV0dXJuOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3cyX2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1LCB0ZW1wOwpAQCAtNTAyLDYgKzUwNyw3IEBACiAgICAgcmV0dXJuIDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93M19pbnRyYShpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoKQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDgsIHRlbXA7CkBAIC01NzUsNiArNTgxLDcgQEAKICAgICByZXR1cm4gOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3c0X2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCwgdGVtcDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCmluZGV4IDY3OWIwOTEuLmExMWY1NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcApAQCAtNDA5LDcgKzQwOSw5IEBACiAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOwogCiAgICAgICAgIC8qIHZpZGVvX29iamVjdF9sYXllcl93aWR0aCAoMTMgYml0cykgKi8KLSAgICAgICAgdmlkZW8tPmRpc3BsYXlXaWR0aCA9IHZpZGVvLT53aWR0aCA9IChpbnQpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAxMyk7CisgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAxMyk7CisgICAgICAgIGlmICghdG1wdmFyKSByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgdmlkZW8tPmRpc3BsYXlXaWR0aCA9IHZpZGVvLT53aWR0aCA9IHRtcHZhcjsKIAogICAgICAgICAvKiByb3VuZCB1cCB0byBhIG11bHRpcGxlIG9mIE1CX1NJWkUuICAgMDgvMDkvMjAwMCAqLwogICAgICAgICB2aWRlby0+d2lkdGggPSAodmlkZW8tPndpZHRoICsgMTUpICYgLTE2OwpAQCAtNDE5LDcgKzQyMSw5IEBACiAgICAgICAgIGlmICghQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpIHJldHVybiBQVl9GQUlMOwogCiAgICAgICAgIC8qIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQgKDEzIGJpdHMpICovCi0gICAgICAgIHZpZGVvLT5kaXNwbGF5SGVpZ2h0ID0gdmlkZW8tPmhlaWdodCA9IChpbnQpIEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAxMyk7CisgICAgICAgIHRtcHZhciA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAxMyk7CisgICAgICAgIGlmICghdG1wdmFyKSByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgdmlkZW8tPmRpc3BsYXlIZWlnaHQgPSB2aWRlby0+aGVpZ2h0ID0gdG1wdmFyOwogCiAgICAgICAgIC8qIHJvdW5kIHVwIHRvIGEgbXVsdGlwbGUgb2YgTUJfU0laRS4gICAwOC8wOS8yMDAwICovCiAgICAgICAgIHZpZGVvLT5oZWlnaHQgPSAodmlkZW8tPmhlaWdodCArIDE1KSAmIC0xNjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKaW5kZXggNjdmNDc4ZS4uYjVjMTE2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKQEAgLTU0LDYgKzU0LDI0IEBACiAgICAgICAgIH0pOwogICAgIH0KIAorICAgIGlmICghbm9kZXMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGFueU5vZGUgPSBub2Rlcy5jYmVnaW4oKTsKKyAgICAgICAgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGZpcnN0ID0gYW55Tm9kZS0+Y2JlZ2luKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBsYXN0ID0gYW55Tm9kZS0+Y2VuZCgpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lIDogbm9kZXMpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdDEgPSBmaXJzdDsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0MiA9IG5hbWUuY2JlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGl0MSAhPSBsYXN0ICYmIGl0MiAhPSBuYW1lLmNlbmQoKSAmJiB0b2xvd2VyKCppdDEpID09IHRvbG93ZXIoKml0Mik7CisgICAgICAgICAgICAgICAgICAgICsraXQxLCArK2l0MikgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdCA9IGl0MTsKKyAgICAgICAgfQorICAgICAgICBtUHJlZml4ID0gc3RkOjpzdHJpbmcoZmlyc3QsIGxhc3QpOworICAgICAgICBMT0coSU5GTykgPDwgIm9teCBjb21tb24gcHJlZml4OiAnIiA8PCBtUHJlZml4LmNfc3RyKCkgPDwgIiciOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAib214IGNvbW1vbiBwcmVmaXg6IG5vIG5vZGVzIjsKKyAgICB9CisKICAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXI7CiAgICAgcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoeG1sTmFtZXMsIHNlYXJjaERpcnMpOwogICAgIGlmIChwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCAhPSBudWxscHRyKSB7CkBAIC0xMTIsOCArMTMwLDYgQEAKICAgICAgICAgbVJvbGVMaXN0W2ldID0gc3RkOjptb3ZlKHJvbGUpOwogICAgICAgICArK2k7CiAgICAgfQotCi0gICAgbVByZWZpeCA9IHBhcnNlci5nZXRDb21tb25QcmVmaXgoKTsKIH0KIAogT214U3RvcmU6On5PbXhTdG9yZSgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKaW5kZXggZDA1OGVkMy4uYjVkNDUzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKQEAgLTI5LDEzICsyOSwxNCBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLAotICAgICAgICAibGliZGF0YXNvdXJjZSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgICAgICJsaWJvZ2ciLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWRUZXN0LnhtbAppbmRleCBhMjFiZThhLi5jYzg5MGZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZFRlc3QueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkVGVzdC54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0id3JpdGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0UmVzLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0UmVzLTEuMS56aXA/dW56aXA9dHJ1ZSIKICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvV3JpdGVyVGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1JFQURNRS5tZAppbmRleCBlMTAzNjEzLi4wZTU0Y2E3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvUkVBRE1FLm1kCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9SRUFETUUubWQKQEAgLTE5LDEwICsxOSwxMCBAQAogCiBhZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L3dyaXRlclRlc3Qvd3JpdGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCiAKLVRoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdFJlcy56aXApLgorVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0UmVzLTEuMS56aXApLgogRG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIGZvbGRlci4gUHVzaCBhbGwgdGhlIGZpbGVzIGluIHRoaXMgZm9sZGVyIHRvIC9kYXRhL2xvY2FsL3RtcC8gb24gdGhlIGRldmljZS4KIGBgYAotYWRiIHB1c2ggV3JpdGVyVGVzdFJlcyAvZGF0YS9sb2NhbC90bXAvCithZGIgcHVzaCBXcml0ZXJUZXN0UmVzLTEuMS8uIC9kYXRhL2xvY2FsL3RtcC9Xcml0ZXJUZXN0UmVzLwogYGBgCiAKIHVzYWdlOiB3cml0ZXJUZXN0IC1QIFw8cGF0aF90b19yZXNfZm9sZGVyXD4gLUMgPHJlbW92ZV9vdXRwdXRfZmlsZT4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0LmNwcAppbmRleCA0YzBhZGQ0Li5kMTcwZTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3QuY3BwCkBAIC0xOCw5ICsxOCwxMyBAQAogI2RlZmluZSBMT0dfVEFHICJXcml0ZXJUZXN0IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC0zOSwxNSArNDMsMTMgQEAKIAogI2RlZmluZSBPVVRQVVRfRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvd3JpdGVyLm91dCIKIAotc3RhdGljIFdyaXRlclRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisvLyBTdHRzIHZhbHVlcyB3aXRoaW4gMC4xbXMoMTAwdXMpIGRpZmZlcmVuY2UgYXJlIGZ1ZGdlZCB0byBzYXZlIHRvbworLy8gbWFueSBzdHRzIGVudHJpZXMgaW4gTVBFRzRXcml0ZXIuCitjb25zdGV4cHIgaW50MzJfdCBrTXBlZzRNdXhUb2xlcmFuY2VUaW1lVXMgPSAxMDA7CisvLyBUb2xlcmFuY2UgdmFsdWUgZm9yIG90aGVyIHdyaXRlcnMKK2NvbnN0ZXhwciBpbnQzMl90IGtNdXhUb2xlcmFuY2VUaW1lVXMgPSAxOwogCi1zdHJ1Y3QgY29uZmlnRm9ybWF0IHsKLSAgICBjaGFyIG1pbWVbMTI4XTsKLSAgICBpbnQzMl90IHdpZHRoOwotICAgIGludDMyX3QgaGVpZ2h0OwotICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKLX07CitzdGF0aWMgV3JpdGVyVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKIAogZW51bSBpbnB1dElkIHsKICAgICAvLyBhdWRpbyBzdHJlYW1zCkBAIC04Miw4ICs4NCw4IEBACiAgICAgaW50MzJfdCBzZWNvbmRQYXJhbTsKICAgICBib29sIGlzQXVkaW87CiB9IGtJbnB1dERhdGFbXSA9IHsKLSAgICAgICAge0FBQ18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwKLSAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKKyAgICAgICAge0FBQ18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJhdWRpb19hYWNfc3RlcmVvXzhrYnBzXzExMDI1aHouYWFjIiwKKyAgICAgICAgICJhdWRpb19hYWNfc3RlcmVvXzhrYnBzXzExMDI1aHouaW5mbyIsIDExMDI1LCAyLCB0cnVlfSwKICAgICAgICAge0FBQ19BRFRTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTLCAiTXBzXzJfYzJfZnIxX1NjMV9EYzJfMHgwM19yYXcuYWR0cyIsCiAgICAgICAgICAiTXBzXzJfYzJfZnIxX1NjMV9EYzJfMHgwM19yYXcuaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKICAgICAgICAge0FNUl9OQl8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwKQEAgLTk0LDE3ICs5NiwxNyBAQAogICAgICAgICAgImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKICAgICAgICAge09QVVNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyIsCiAgICAgICAgICAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAotICAgICAgICB7Vk9SQklTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMiLAotICAgICAgICAgImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAorICAgICAgICB7Vk9SQklTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgImJiYl92b3JiaXNfMWNoXzY0a2Jwc18xNmtIei52b3JiaXMiLAorICAgICAgICAgImJiYl92b3JiaXNfMWNoXzY0a2Jwc18xNmtIei5pbmZvIiwgMTYwMDAsIDEsIHRydWV9LAogCiAgICAgICAgIHtBVjFfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxLCAiYmJiX2F2MV8xNzZfMTQ0LmF2MSIsICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyIsIDE3NiwgMTQ0LAogICAgICAgICAgZmFsc2V9LAotICAgICAgICB7QVZDXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQiLAotICAgICAgICAgImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAorICAgICAgICB7QVZDXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgImJiYl9hdmNfMzUyeDI4OF83NjhrYnBzXzMwZnBzLmF2YyIsCisgICAgICAgICAiYmJiX2F2Y18zNTJ4Mjg4Xzc2OGticHNfMzBmcHMuaW5mbyIsIDM1MiwgMjg4LCBmYWxzZX0sCiAgICAgICAgIHtIMjYzXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyIsCiAgICAgICAgICAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8iLCAzNTIsIDI4OCwgZmFsc2V9LAotICAgICAgICB7SEVWQ18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCAiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMiLAotICAgICAgICAgImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKKyAgICAgICAge0hFVkNfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgImJiYl9oZXZjXzM0MHgyODBfNzY4a2Jwc18zMGZwcy5oZXZjIiwKKyAgICAgICAgICJiYmJfaGV2Y18zNDB4MjgwXzc2OGticHNfMzBmcHMuaW5mbyIsIDM0MCwgMjgwLCBmYWxzZX0sCiAgICAgICAgIHtNUEVHNF8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2IiwKICAgICAgICAgICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8iLCAzNTIsIDI4OCwgZmFsc2V9LAogICAgICAgICB7VlA4XzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCIsCkBAIC0xNjQsNiArMTY2LDE0IEBACiAKICAgICBpbnQzMl90IGFkZFdyaXRlclNvdXJjZShib29sIGlzQXVkaW8sIGNvbmZpZ0Zvcm1hdCBwYXJhbXMsIGludDMyX3QgaWR4ID0gMCk7CiAKKyAgICB2b2lkIHNldHVwRXh0cmFjdG9yKEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBzdHJpbmcgaW5wdXRGaWxlTmFtZSwgaW50MzJfdCAmdHJhY2tDb3VudCk7CisKKyAgICB2b2lkIGV4dHJhY3QoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbmZpZ0Zvcm1hdCAmcGFyYW1zLCB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IGJ1ZlNpemUsIHNpemVfdCAqYnl0ZXNFeHRyYWN0ZWQsIGludDMyX3QgaWR4KTsKKworICAgIHZvaWQgY29tcGFyZVBhcmFtcyhjb25maWdGb3JtYXQgc3JjUGFyYW0sIGNvbmZpZ0Zvcm1hdCBkc3RQYXJhbSwgdmVjdG9yPEJ1ZmZlckluZm8+IGRzdEJ1ZkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgpOworCiAgICAgZW51bSBzdGFuZGFyZFdyaXRlcnMgewogICAgICAgICBPR0csCiAgICAgICAgIEFBQywKQEAgLTMxNiw2ICszMjYsMTQ2IEBACiAgICAgcmV0dXJuOwogfQogCit2b2lkIFdyaXRlclRlc3Q6OnNldHVwRXh0cmFjdG9yKEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBzdHJpbmcgaW5wdXRGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmdHJhY2tDb3VudCkgeworICAgIEFMT0dWKCJJbnB1dCBmaWxlIGZvciBleHRyYWN0b3I6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKworICAgIGludDMyX3QgZmQgPSBvcGVuKGlucHV0RmlsZU5hbWUuY19zdHIoKSwgT19SRE9OTFkpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIHdyaXRlcidzIG91dHB1dCBmaWxlIHRvIHZhbGlkYXRlIjsKKworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBpbnQzMl90IHN0YXR1cyA9IGZzdGF0KGZkLCAmYnVmKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0IGZpbGUgZm9yIGV4dHJhY3RvciI7CisKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBBTE9HVigiU2l6ZSBvZiBpbnB1dCBmaWxlIHRvIGV4dHJhY3RvcjogJXp1IiwgZmlsZVNpemUpOworCisgICAgc3RhdHVzID0gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChleHRyYWN0b3IsIGZkLCAwLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRmFpbGVkIHRvIHNldCBkYXRhIHNvdXJjZSBmb3IgZXh0cmFjdG9yIjsKKworICAgIHRyYWNrQ291bnQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChleHRyYWN0b3IpOworICAgIEFTU0VSVF9HVCh0cmFja0NvdW50LCAwKSA8PCAiTm8gdHJhY2tzIHJlcG9ydGVkIGJ5IGV4dHJhY3RvciI7CisgICAgQUxPR1YoIk51bWJlciBvZiB0cmFja3MgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yIDogJWQiLCB0cmFja0NvdW50KTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgV3JpdGVyVGVzdDo6ZXh0cmFjdChBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwgY29uZmlnRm9ybWF0ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJJbmZvLCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYnl0ZXNFeHRyYWN0ZWQsIGludDMyX3QgaWR4KSB7CisgICAgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKGV4dHJhY3RvciwgaWR4KTsKKyAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChleHRyYWN0b3IsIGlkeCk7CisgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgIlRyYWNrIGZvcm1hdCBpcyBOVUxMIjsKKyAgICBBTE9HSSgiVHJhY2sgZm9ybWF0ID0gJXMiLCBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoZm9ybWF0KSk7CisKKyAgICBjb25zdCBjaGFyICptaW1lID0gbnVsbHB0cjsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgQVNTRVJUX05FKG1pbWUsIG51bGxwdHIpIDw8ICJUcmFjayBtaW1lIGlzIE5VTEwiOworICAgIEFMT0dJKCJUcmFjayBtaW1lID0gJXMiLCBtaW1lKTsKKyAgICBzdHJsY3B5KHBhcmFtcy5taW1lLCBtaW1lLCBrTWltZVNpemUpOworCisgICAgaWYgKCFzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZwYXJhbXMuY2hhbm5lbENvdW50KSkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIGRpZCBub3QgcmVwb3J0IGNoYW5uZWwgY291bnQiOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmcGFyYW1zLnNhbXBsZVJhdGUpKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgZGlkIG5vdCByZXBvcnQgc2FtcGxlIHJhdGUiOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpIHx8ICFzdHJuY21wKG1pbWUsICJpbWFnZS8iLCA2KSkgeworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmcGFyYW1zLndpZHRoKSkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIGRpZCBub3QgcmVwb3J0IHdpZHRoIjsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZwYXJhbXMuaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIGRpZCBub3QgcmVwb3J0IGhlaWdodCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJJbnZhbGlkIG1pbWUgIiA8PCBtaW1lOworICAgIH0KKworICAgIGludDMyX3QgYnVmZmVyT2Zmc2V0ID0gMDsKKyAgICAvLyBHZXQgQ1NEIGRhdGEKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHZvaWQgKmNzZEJ1ZjsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBjc2RCdWYgPSBudWxscHRyOworICAgICAgICBjaGFyIGNzZE5hbWVbMTZdOworICAgICAgICBzbnByaW50Zihjc2ROYW1lLCAxNiwgImNzZC0lZCIsIGluZGV4KTsKKyAgICAgICAgc2l6ZV90IGNzZFNpemUgPSAwOworICAgICAgICBib29sIGNzZEZvdW5kID0gQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihmb3JtYXQsIGNzZE5hbWUsICZjc2RCdWYsICZjc2RTaXplKTsKKyAgICAgICAgaWYgKCFjc2RGb3VuZCB8fCAhY3NkQnVmIHx8ICFjc2RTaXplKSBicmVhazsKKworICAgICAgICBidWZmZXJJbmZvLnB1c2hfYmFjayh7c3RhdGljX2Nhc3Q8aW50MzJfdD4oY3NkU2l6ZSksIENPREVDX0NPTkZJR19GTEFHLCAwfSk7CisgICAgICAgIG1lbWNweShidWZmZXIgKyBidWZmZXJPZmZzZXQsIGNzZEJ1ZiwgY3NkU2l6ZSk7CisgICAgICAgIGJ1ZmZlck9mZnNldCArPSBjc2RTaXplOworICAgICAgICBpbmRleCsrOworICAgIH0KKworICAgIC8vIEdldCBmcmFtZSBkYXRhCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgc3NpemVfdCBzYW1wbGVTaXplID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUoZXh0cmFjdG9yKTsKKyAgICAgICAgaWYgKHNhbXBsZVNpemUgPCAwKSBicmVhazsKKworICAgICAgICB1aW50OF90ICpzYW1wbGVCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhzYW1wbGVTaXplKTsKKyAgICAgICAgQVNTRVJUX05FKHNhbXBsZUJ1ZmZlciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyIG9mIHNpemUgIiA8PCBzYW1wbGVTaXplOworCisgICAgICAgIGludCBieXRlc1JlYWQgPSBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEoZXh0cmFjdG9yLCBzYW1wbGVCdWZmZXIsIHNhbXBsZVNpemUpOworICAgICAgICBBU1NFUlRfRVEoYnl0ZXNSZWFkLCBzYW1wbGVTaXplKQorICAgICAgICAgICAgICAgIDw8ICJOdW1iZXIgb2YgYnl0ZXMgZXh0cmFjdGVkIGRvZXMgbm90IG1hdGNoIHdpdGggc2FtcGxlIHNpemUiOworICAgICAgICBpbnQ2NF90IHB0cyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKGV4dHJhY3Rvcik7CisgICAgICAgIHVpbnQzMl90IGZsYWcgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MoZXh0cmFjdG9yKTsKKworICAgICAgICBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpIHsKKyAgICAgICAgICAgIC8vIFJlbW92aW5nIDQgYnl0ZXMgb2YgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTIGZyb20gc2FtcGxlIHNpemUKKyAgICAgICAgICAgIGJ5dGVzUmVhZCA9IGJ5dGVzUmVhZCAtIDQ7CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlRfTEUoYnVmZmVyT2Zmc2V0ICsgYnl0ZXNSZWFkLCBidWZTaXplKQorICAgICAgICAgICAgICAgIDw8ICJTaXplIG9mIHRoZSBidWZmZXIgaXMgaW5zdWZmaWNpZW50IHRvIHN0b3JlIHRoZSBleHRyYWN0ZWQgZGF0YSI7CisgICAgICAgIGJ1ZmZlckluZm8ucHVzaF9iYWNrKHtieXRlc1JlYWQsIGZsYWcsIHB0c30pOworICAgICAgICBtZW1jcHkoYnVmZmVyICsgYnVmZmVyT2Zmc2V0LCBzYW1wbGVCdWZmZXIsIGJ5dGVzUmVhZCk7CisgICAgICAgIGJ1ZmZlck9mZnNldCArPSBieXRlc1JlYWQ7CisKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UoZXh0cmFjdG9yKTsKKyAgICAgICAgZnJlZShzYW1wbGVCdWZmZXIpOworICAgIH0KKyAgICAqYnl0ZXNFeHRyYWN0ZWQgPSBidWZmZXJPZmZzZXQ7CisgICAgcmV0dXJuOworfQorCit2b2lkIFdyaXRlclRlc3Q6OmNvbXBhcmVQYXJhbXMoY29uZmlnRm9ybWF0IHNyY1BhcmFtLCBjb25maWdGb3JtYXQgZHN0UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEJ1ZmZlckluZm8+IGRzdEJ1ZkluZm8sIGludDMyX3QgaW5kZXgpIHsKKyAgICBBU1NFUlRfU1RSRVEoc3JjUGFyYW0ubWltZSwgZHN0UGFyYW0ubWltZSkKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgbWltZSB0eXBlIGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgbWltZSB0eXBlIjsKKworICAgIGlmICghc3RybmNtcChzcmNQYXJhbS5taW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgQVNTRVJUX0VRKHNyY1BhcmFtLmNoYW5uZWxDb3VudCwgZHN0UGFyYW0uY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgY2hhbm5lbCBjb3VudCBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IGNoYW5uZWwgY291bnQiOworICAgICAgICBBU1NFUlRfRVEoc3JjUGFyYW0uc2FtcGxlUmF0ZSwgZHN0UGFyYW0uc2FtcGxlUmF0ZSkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIHNhbXBsZSByYXRlIGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgc2FtcGxlIHJhdGUiOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoc3JjUGFyYW0ubWltZSwgInZpZGVvLyIsIDYpIHx8ICFzdHJuY21wKHNyY1BhcmFtLm1pbWUsICJpbWFnZS8iLCA2KSkgeworICAgICAgICBBU1NFUlRfRVEoc3JjUGFyYW0ud2lkdGgsIGRzdFBhcmFtLndpZHRoKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgd2lkdGggZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCB3aWR0aCI7CisgICAgICAgIEFTU0VSVF9FUShzcmNQYXJhbS5oZWlnaHQsIGRzdFBhcmFtLmhlaWdodCkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIGhlaWdodCBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IGhlaWdodCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJJbnZhbGlkIG1pbWUgdHlwZSIgPDwgc3JjUGFyYW0ubWltZTsKKyAgICB9CisKKyAgICBpbnQzMl90IHRvbGVyYW5jZVZhbHVlVXMgPSBrTXV4VG9sZXJhbmNlVGltZVVzOworICAgIGlmIChtV3JpdGVyTmFtZSA9PSBNUEVHNCkgeworICAgICAgICB0b2xlcmFuY2VWYWx1ZVVzID0ga01wZWc0TXV4VG9sZXJhbmNlVGltZVVzOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkc3RCdWZJbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFTU0VSVF9FUShtQnVmZmVySW5mb1tpbmRleF1baV0uc2l6ZSwgZHN0QnVmSW5mb1tpXS5zaXplKQorICAgICAgICAgICAgICAgIDw8ICJJbnB1dCBzaXplICIgPDwgbUJ1ZmZlckluZm9baW5kZXhdW2ldLnNpemUgPDwgIiBtaXNtYXRjaGVkIHdpdGggZXh0cmFjdGVkIHNpemUgIgorICAgICAgICAgICAgICAgIDw8IGRzdEJ1ZkluZm9baV0uc2l6ZTsKKyAgICAgICAgQVNTRVJUX0VRKG1CdWZmZXJJbmZvW2luZGV4XVtpXS5mbGFncywgZHN0QnVmSW5mb1tpXS5mbGFncykKKyAgICAgICAgICAgICAgICA8PCAiSW5wdXQgZmxhZyAiIDw8IG1CdWZmZXJJbmZvW2luZGV4XVtpXS5mbGFncworICAgICAgICAgICAgICAgIDw8ICIgbWlzbWF0Y2hlZCB3aXRoIGV4dHJhY3RlZCBzaXplICIgPDwgZHN0QnVmSW5mb1tpXS5mbGFnczsKKyAgICAgICAgQVNTRVJUX0xFKGFicyhtQnVmZmVySW5mb1tpbmRleF1baV0udGltZVVzIC0gZHN0QnVmSW5mb1tpXS50aW1lVXMpLCB0b2xlcmFuY2VWYWx1ZVVzKQorICAgICAgICAgICAgICAgIDw8ICJEaWZmZXJlbmNlIGJldHdlZW4gb3JpZ2luYWwgdGltZXN0YW1wICIgPDwgbUJ1ZmZlckluZm9baW5kZXhdW2ldLnRpbWVVcworICAgICAgICAgICAgICAgIDw8ICIgYW5kIGV4dHJhY3RlZCB0aW1lc3RhbXAgIiA8PCBkc3RCdWZJbmZvW2ldLnRpbWVVcworICAgICAgICAgICAgICAgIDw8ICJpcyBncmVhdGVyIHRoYW4gdG9sZXJhbmNlIHZhbHVlID0gIiA8PCB0b2xlcmFuY2VWYWx1ZVVzIDw8ICIgbWljcm8gc2Vjb25kcyI7CisgICAgfQorICAgIHJldHVybjsKK30KKwogVEVTVF9QKFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsIENyZWF0ZVdyaXRlclRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAgICAgQUxPR1YoIlRlc3RzIHRoZSBjcmVhdGlvbiBvZiB3cml0ZXJzIik7CkBAIC0zNTAsMTYgKzUwMCwyMyBAQAogICAgIGlmIChpbnBJZFsxXSAhPSBVTlVTRURfSUQpIHsKICAgICAgICAgbnVtVHJhY2tzKys7CiAgICAgfQorCisgICAgc2l6ZV90IGZpbGVTaXplW251bVRyYWNrc107CisgICAgY29uZmlnRm9ybWF0IHBhcmFtW251bVRyYWNrc107CiAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKICAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOwogICAgICAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7Ci0gICAgICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKICAgICAgICAgYm9vbCBpc0F1ZGlvOwotICAgICAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkW2lkeF0pOworICAgICAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW1baWR4XSwgaXNBdWRpbywgaW5wSWRbaWR4XSk7CiAgICAgICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CiAKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXMgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBvZiBpbnB1dCBmaWxlOiIgPDwgaW5wdXRGaWxlOworICAgICAgICBmaWxlU2l6ZVtpZHhdID0gYnVmLnN0X3NpemU7CisKICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBpZHgpKTsKLSAgICAgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtLCBpZHgpOworICAgICAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW1baWR4XSwgaWR4KTsKICAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICJXcml0ZXIiOwogICAgIH0KIApAQCAtMzg5LDYgKzU0Niw1MCBAQAogICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKICAgICBjbG9zZShmZCk7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgb3V0cHV0IG11eGVkIGZpbGUgY3JlYXRlZCBieSB3cml0ZXIKKyAgICAvLyBUT0RPKGIvMTQ2NDIzMDIyKTogU2tpcCB2YWxpZGF0aW5nIG91dHB1dCBmb3Igd2VibSB3cml0ZXIKKyAgICAvLyBUT0RPKGIvMTQ2NDIxMDE4KTogU2tpcCB2YWxpZGF0aW5nIG91dHB1dCBmb3Igb2dnIHdyaXRlcgorICAgIGlmIChtV3JpdGVyTmFtZSAhPSBPR0cgJiYgbVdyaXRlck5hbWUgIT0gV0VCTSkgeworICAgICAgICBjb25maWdGb3JtYXQgZXh0cmFjdG9yUGFyYW1zW251bVRyYWNrc107CisgICAgICAgIHZlY3RvcjxCdWZmZXJJbmZvPiBleHRyYWN0b3JCdWZmZXJJbmZvW251bVRyYWNrc107CisgICAgICAgIGludDMyX3QgdHJhY2tDb3VudCA9IC0xOworCisgICAgICAgIEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yID0gQU1lZGlhRXh0cmFjdG9yX25ldygpOworICAgICAgICBBU1NFUlRfTkUoZXh0cmFjdG9yLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBleHRyYWN0b3IiOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXR1cEV4dHJhY3RvcihleHRyYWN0b3IsIG91dHB1dEZpbGUsIHRyYWNrQ291bnQpKTsKKyAgICAgICAgQVNTRVJUX0VRKHRyYWNrQ291bnQsIG51bVRyYWNrcykKKyAgICAgICAgICAgICAgICA8PCAiVHJhY2tzIHJlcG9ydGVkIGJ5IGV4dHJhY3RvciBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IG51bWJlciBvZiB0cmFja3MiOworCisgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgICAgICBjaGFyICppbnB1dEJ1ZmZlciA9IChjaGFyICopbWFsbG9jKGZpbGVTaXplW2lkeF0pOworICAgICAgICAgICAgQVNTRVJUX05FKGlucHV0QnVmZmVyLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBidWZmZXIgb2Ygc2l6ZSAiIDw8IGZpbGVTaXplW2lkeF07CisgICAgICAgICAgICBtSW5wdXRTdHJlYW1baWR4XS5zZWVrZygwLCBtSW5wdXRTdHJlYW1baWR4XS5iZWcpOworICAgICAgICAgICAgbUlucHV0U3RyZWFtW2lkeF0ucmVhZChpbnB1dEJ1ZmZlciwgZmlsZVNpemVbaWR4XSk7CisgICAgICAgICAgICBBU1NFUlRfRVEobUlucHV0U3RyZWFtW2lkeF0uZ2NvdW50KCksIGZpbGVTaXplW2lkeF0pOworCisgICAgICAgICAgICB1aW50OF90ICpleHRyYWN0ZWRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhmaWxlU2l6ZVtpZHhdKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShleHRyYWN0ZWRCdWZmZXIsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBvZiBzaXplICIgPDwgZmlsZVNpemVbaWR4XTsKKyAgICAgICAgICAgIHNpemVfdCBieXRlc0V4dHJhY3RlZCA9IDA7CisKKyAgICAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGV4dHJhY3QoZXh0cmFjdG9yLCBleHRyYWN0b3JQYXJhbXNbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yQnVmZmVySW5mb1tpZHhdLCBleHRyYWN0ZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplW2lkeF0sICZieXRlc0V4dHJhY3RlZCwgaWR4KSk7CisgICAgICAgICAgICBBU1NFUlRfR1QoYnl0ZXNFeHRyYWN0ZWQsIDApIDw8ICJUb3RhbCBieXRlcyBleHRyYWN0ZWQgYnkgZXh0cmFjdG9yIGNhbm5vdCBiZSB6ZXJvIjsKKworICAgICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVQYXJhbXMocGFyYW1baWR4XSwgZXh0cmFjdG9yUGFyYW1zW2lkeF0sIGV4dHJhY3RvckJ1ZmZlckluZm9baWR4XSwgaWR4KSk7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShtZW1jbXAoZXh0cmFjdGVkQnVmZmVyLCAodWludDhfdCAqKWlucHV0QnVmZmVyLCBieXRlc0V4dHJhY3RlZCksIDApCisgICAgICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgYml0IHN0cmVhbSBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IGJpdCBzdHJlYW0iOworCisgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIGZyZWUoZXh0cmFjdGVkQnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKGV4dHJhY3Rvcik7CisgICAgfQogfQogCiBURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgUGF1c2VXcml0ZXJUZXN0KSB7CkBAIC01MjUsNiArNzI2LDE3NiBAQAogICAgIGNsb3NlKGZkKTsKIH0KIAorY2xhc3MgV3JpdGVyVmFsaWRpdHlUZXN0CisgICAgOiBwdWJsaWMgV3JpdGVyVGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPHN0cmluZyAvKiB3cml0ZXJGb3JtYXQqLywgaW5wdXRJZCAvKiBpbnB1dElkMCovLCBib29sIC8qIGFkZFNvdXJjZUZhaWwqLz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2V0dXBXcml0ZXJUeXBlKGdldDwwPihHZXRQYXJhbSgpKSk7IH0KK307CisKK1RFU1RfUChXcml0ZXJWYWxpZGl0eVRlc3QsIEludmFsaWRJbnB1dFRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIlZhbGlkYXRlcyB3cml0ZXIncyBiZWhhdmlvciBmb3IgaW52YWxpZCBpbnB1dHMiKTsKKworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgaW5wdXRJZCBpbnBJZCA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBib29sIGFkZFNvdXJjZUZhaWxFeHBlY3RlZCA9IGdldDwyPihHZXRQYXJhbSgpKTsKKworICAgIC8vIFRlc3Qgd3JpdGVycyBmb3IgaW52YWxpZCBGRCB2YWx1ZQorICAgIGludDMyX3QgZmQgPSAtMTsKKyAgICBpbnQzMl90IHN0YXR1cyA9IGNyZWF0ZVdyaXRlcihmZCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HVigiY3JlYXRlV3JpdGVyIGZhaWxlZCBmb3IgaW52YWxpZCBGRCwgdGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgd3JpdGVyIHdhcyBjcmVhdGVkIGZvciBpbnZhbGlkIGZkLCB0ZXN0IGl0IGZ1cnRoZXIuCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworICAgIEFTU0VSVF9ORShpbnBJZCwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkKTsKKyAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7CisgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGFkZFNvdXJjZUZhaWxFeHBlY3RlZCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIjsKKyAgICAgICAgQUxPR1YoImFkZFdyaXRlclNvdXJjZSBmYWlsZWQgZm9yIGludmFsaWQgRkQsIHRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3IiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHN0YXJ0IHRoZSB3cml0ZXIgd2l0aCB2YWxpZCBhcmd1bWVudCBidXQgaW52YWxpZCBGRAorICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgQVNTRVJUX05FKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiV3JpdGVyIGRpZCBub3QgZmFpbCBmb3IgaW52YWxpZCBGRCI7CisKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCAwLCBtQnVmZmVySW5mb1swXS5zaXplKCkpOworICAgIEFTU0VSVF9ORSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIldyaXRlciBkaWQgbm90IHJlcG9ydCBlcnJvciBmb3IgaW52YWxpZCBGRCI7CisKKyAgICBzdGF0dXMgPSBtQ3VycmVudFRyYWNrWzBdLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHRyYWNrIjsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCAiIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciI7Cit9CisKK1RFU1RfUChXcml0ZXJWYWxpZGl0eVRlc3QsIE1hbEZvcm1lZERhdGFUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIC8vIEVuYWJsZSB0ZXN0IGZvciBPZ2cgd3JpdGVyCisgICAgQVNTRVJUX05FKG1Xcml0ZXJOYW1lLCBPR0cpIDw8ICJUT0RPKGIvMTYwMTA1NjQ2KSI7CisgICAgQUxPR1YoIlRlc3Qgd3JpdGVyIGZvciBtYWxmb3JtZWQgaW5wdXRzIik7CisKKyAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gZ2V0PDA+KEdldFBhcmFtKCkpOworICAgIGlucHV0SWQgaW5wSWQgPSBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgYm9vbCBhZGRTb3VyY2VGYWlsRXhwZWN0ZWQgPSBnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgaW50MzJfdCBmZCA9CisgICAgICAgICAgICBvcGVuKE9VVFBVVF9GSUxFX05BTUUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSB0byBkdW1wIHdyaXRlcidzIGRhdGEiOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIChzdGF0dXNfdClPSykKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIiBvdXRwdXQgZm9ybWF0IjsKKworICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgY29uZmlnRm9ybWF0IHBhcmFtOworICAgIGJvb2wgaXNBdWRpbzsKKyAgICBBU1NFUlRfTkUoaW5wSWQsIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZCk7CisgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOworICAgIC8vIFJlbW92ZSBDU0QgZGF0YSBmcm9tIGlucHV0CisgICAgbU51bUNzZHNbMF0gPSAwOworICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBU1NFUlRfVFJVRShhZGRTb3VyY2VGYWlsRXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciI7CisgICAgICAgIEFMT0dWKCIlcyB3cml0ZXIgZmFpbGVkIHRvIGFkZFNvdXJjZSBhZnRlciByZW1vdmluZyBDU0QgZnJvbSBpbnB1dCIsIHdyaXRlckZvcm1hdC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiQ291bGQgbm90IHN0YXJ0ICIgPDwgd3JpdGVyRm9ybWF0IDw8ICJ3cml0ZXIiOworCisgICAgLy8gU2tpcCBmaXJzdCBmZXcgZnJhbWVzLiBUaGVzZSBtYXkgY29udGFpbiBzeW5jIGZyYW1lcyBhbHNvLgorICAgIGludDMyX3QgZnJhbWVJRCA9IG1JbnB1dEZyYW1lSWRbMF0gKyBtQnVmZmVySW5mb1swXS5zaXplKCkgLyA0OworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgZnJhbWVJRCwgbUN1cnJlbnRUcmFja1swXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJJbmZvWzBdLnNpemUoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKKworICAgIHN0YXR1cyA9IG1DdXJyZW50VHJhY2tbMF0tPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworCisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIHN0YXR1cyA9IG1Xcml0ZXItPmR1bXAoZmQsIGFyZ3MpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBkdW1wIHN0YXRpc3RpY3MgZnJvbSB3cml0ZXIiOworCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wICIgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIjsKKyAgICBjbG9zZShmZCk7Cit9CisKKy8vIFRoaXMgdGVzdCBpcyBzcGVjaWZpYyB0byBNUEVHNFdyaXRlciB0byB0ZXN0IG1vcmUgQVBJcworVEVTVF9QKFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsIE1wZWc0V3JpdGVyVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBpZiAobVdyaXRlck5hbWUgIT0gc3RhbmRhcmRXcml0ZXJzOjpNUEVHNCkgcmV0dXJuOworICAgIEFMT0dWKCJUZXN0IE1QRUc0IHdyaXRlciBzcGVjaWZpYyBBUElzIik7CisKKyAgICBpbnB1dElkIGlucElkID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgIGludDMyX3QgZmQgPQorICAgICAgICAgICAgb3BlbihPVVRQVVRfRklMRV9OQU1FLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgdG8gZHVtcCB3cml0ZXIncyBkYXRhIjsKKworICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAoc3RhdHVzX3QpT0spIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3IgbXBlZzQgb3V0cHV0IGZvcm1hdCI7CisKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOworICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKKyAgICBib29sIGlzQXVkaW87CisgICAgQVNTRVJUX05FKGlucElkLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWQpOworICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKKyAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0pOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciBtcGVnNCBXcml0ZXIiOworCisgICAgLy8gc2lnbmFsIG1ldGEgZGF0YSBmb3IgdGhlIHdyaXRlcgorICAgIHNwPE1QRUc0V3JpdGVyPiBtcDR3cml0ZXIgPSBzdGF0aWNfY2FzdDxNUEVHNFdyaXRlciAqPihtV3JpdGVyLmdldCgpKTsKKyAgICBzdGF0dXMgPSBtcDR3cml0ZXItPnNldEludGVybGVhdmVEdXJhdGlvbihrRGVmYXVsdEludGVybGVhdmVEdXJhdGlvbik7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAic2V0SW50ZXJsZWF2ZUR1cmF0aW9uIGZhaWxlZCI7CisKKyAgICBzdGF0dXMgPSBtcDR3cml0ZXItPnNldEdlb0RhdGEoa0RlZmF1bHRMYXRpdHVkZXgxMDAwMCwga0RlZmF1bHRMb25naXR1ZGV4MTAwMDApOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgInNldEdlb0RhdGEgZmFpbGVkIjsKKworICAgIHN0YXR1cyA9IG1wNHdyaXRlci0+c2V0Q2FwdHVyZVJhdGUoa0RlZmF1bHRGUFMpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgInNldENhcHR1cmVSYXRlIGZhaWxlZCI7CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkNvdWxkIG5vdCBzdGFydCB0aGUgd3JpdGVyIjsKKworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIDAsIG1CdWZmZXJJbmZvWzBdLnNpemUoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAibXBlZzQgd3JpdGVyIGZhaWxlZCI7CisKKyAgICBzdGF0dXMgPSBtQ3VycmVudFRyYWNrWzBdLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHRyYWNrIjsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKKyAgICBtcDR3cml0ZXIuY2xlYXIoKTsKKyAgICBjbG9zZShmZCk7Cit9CisKIGNsYXNzIExpc3RlbmVyVGVzdAogICAgIDogcHVibGljIFdyaXRlclRlc3QsCiAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPApAQCAtNjU3LDYgKzEwMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcndiIiwgQU1SX1dCXzEsIFVOVVNFRF9JRCwgMC41LCAwLjUsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcyVHMiLCBBQUNfMSwgVU5VU0VEX0lELCAwLjIsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIFVOVVNFRF9JRCwgMC40LCAwLjMsIDAuMjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQUFDXzEsIFVOVVNFRF9JRCwgMC4zLCAxLCAwLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsIE9QVVNfMSwgVU5VU0VEX0lELCAwLjcsIDAuMywgMSkpKTsKIAogLy8gVE9ETzogKGIvMTQ0NDc2MTY0KQpAQCAtNzAzLDcgKzEwNzUsMzEgQEAKICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVlA4XzEsIE9QVVNfMSwgMC41MCksCiAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZPUkJJU18xLCBWUDhfMSwgMC4yNSkpKTsKIAorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBXcml0ZXJWYWxpZGl0eVRlc3QsIFdyaXRlclZhbGlkaXR5VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYWFjIiwgQUFDXzEsIHRydWUpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1ybmIiLCBBTVJfTkJfMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1yd2IiLCBBTVJfV0JfMSwgdHJ1ZSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFBQ18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBTVJfTkJfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQVZDXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEgyNjNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSEVJQ18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIRVZDXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIE1QRUc0XzEsIGZhbHNlKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsIE9QVVNfMSwgdHJ1ZSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgT1BVU18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZPUkJJU18xLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVlA4XzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVlA5XzEsIGZhbHNlKSkpOworCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgZ0VudiA9IG5ldyBXcml0ZXJUZXN0RW52aXJvbm1lbnQoKTsKICAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5oCmluZGV4IDVlNzkyOTguLjZiNDU2ZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuaApAQCAtMzQsNiArMzQsMTIgQEAKIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4VHJhY2tDb3VudCA9IDI7CiBjb25zdGV4cHIgdWludDMyX3Qga01heENTRFN0cmxlbiA9IDE2OwogY29uc3RleHByIHVpbnQzMl90IGtNYXhDb3VudCA9IDIwOworY29uc3RleHByIGludDMyX3Qga01pbWVTaXplID0gMTI4OworY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRJbnRlcmxlYXZlRHVyYXRpb24gPSAwOworLy8gR2VvZGF0YSBpcyBzZXQgYWNjb3JkaW5nIHRvIElTTy02NzA5IHN0YW5kYXJkLgorY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRMYXRpdHVkZXgxMDAwMCA9IDUwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0TG9uZ2l0dWRleDEwMDAwID0gMTAwMDAwMDsKK2NvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdEZQUyA9IDMwLjBmOwogCiBzdHJ1Y3QgQnVmZmVySW5mbyB7CiAgICAgaW50MzJfdCBzaXplOwpAQCAtNDEsNiArNDcsMTQgQEAKICAgICBpbnQ2NF90IHRpbWVVczsKIH07CiAKK3N0cnVjdCBjb25maWdGb3JtYXQgeworICAgIGNoYXIgbWltZVtrTWltZVNpemVdOworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgIGludDMyX3QgY2hhbm5lbENvdW50OworfTsKKwogaW50MzJfdCBzZW5kQnVmZmVyc1RvV3JpdGVyKGlmc3RyZWFtICZpbnB1dFN0cmVhbSwgdmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJmlucHV0RnJhbWVJZCwgc3A8TWVkaWFBZGFwdGVyPiAmY3VycmVudFRyYWNrLCBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlLCBib29sIGlzUGF1c2VkID0gZmFsc2UsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKaW5kZXggY2E4ZmQyZC4uZTk3MmFiYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcApAQCAtMjkxLDYgKzI5MSw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBQcmV2ZW50IGNhbGxzIHRvIHByb2Nlc3MoKSBhbmQgb3RoZXIgZnVuY3Rpb25zIG9uIGVmZmVjdCBpbnRlcmZhY2UgZnJvbSBub3cgb24uCisgICAgLy8gVGhlIGVmZmVjdCBlbmdpbmUgd2lsbCBiZSByZWxlYXNlZCBieSB0aGUgZGVzdHJ1Y3RvciB3aGVuIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2Ugb24KKyAgICAvLyB0aGlzIG9iamVjdCBpcyByZWxlYXNlZCB3aGljaCBjYW4gaGFwcGVuIGFmdGVyIG5leHQgcHJvY2VzcyBpcyBjYWxsZWQuCiAgICAgaWYgKG1IYW5kbGVzLnNpemUoKSA9PSAwICYmICFtUGlubmVkKSB7CiAgICAgICAgIG1TdGF0ZSA9IERFU1RST1lFRDsKICAgICB9CkBAIC01NjQsMjAgKzU2Nyw2IEBACiAKIH0KIAotc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6cmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpCi17Ci0gICAgc3NpemVfdCBzdGF0dXMgPSBFZmZlY3RCYXNlOjpyZW1vdmVIYW5kbGVfbChoYW5kbGUpOwotCi0gICAgLy8gUHJldmVudCBjYWxscyB0byBwcm9jZXNzKCkgYW5kIG90aGVyIGZ1bmN0aW9ucyBvbiBlZmZlY3QgaW50ZXJmYWNlIGZyb20gbm93IG9uLgotICAgIC8vIFRoZSBlZmZlY3QgZW5naW5lIHdpbGwgYmUgcmVsZWFzZWQgYnkgdGhlIGRlc3RydWN0b3Igd2hlbiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9uCi0gICAgLy8gdGhpcyBvYmplY3QgaXMgcmVsZWFzZWQgd2hpY2ggY2FuIGhhcHBlbiBhZnRlciBuZXh0IHByb2Nlc3MgaXMgY2FsbGVkLgotICAgIGlmIChzdGF0dXMgPT0gMCAmJiAhbVBpbm5lZCkgewotICAgICAgICBtRWZmZWN0SW50ZXJmYWNlLT5jbG9zZSgpOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnVwZGF0ZVN0YXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCmluZGV4IDQwYmIyMjYuLjkwMWY5M2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaApAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgc3RhdHVzX3QgYWRkSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKICAgICBzc2l6ZV90IGRpc2Nvbm5lY3RIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUsIGJvb2wgdW5waW5JZkxhc3QpOwogICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpOworICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpOwogICAgIEVmZmVjdEhhbmRsZSogY29udHJvbEhhbmRsZV9sKCk7CiAgICAgYm9vbCBwdXJnZUhhbmRsZXMoKTsKIApAQCAtMjQwLDggKzI0MCw2IEBACiAgICAgICAgIHJldHVybiBtT3V0QnVmZmVyICE9IDAgPyByZWludGVycHJldF9jYXN0PGludDE2X3QqPihtT3V0QnVmZmVyLT5wdHIoKSkgOiBOVUxMOwogICAgIH0KIAotICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpIG92ZXJyaWRlOwotCiAgICAgc3RhdHVzX3QgICAgICAgICBzZXREZXZpY2VzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOwogICAgIHN0YXR1c190ICAgICAgICAgc2V0SW5wdXREZXZpY2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKICAgICBzdGF0dXNfdCAgICAgICAgIHNldFZvbHVtZSh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0LCBib29sIGNvbnRyb2xsZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCBiZjJlOTUzLi5jZDNjNzQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtMjcsNyArMjcsNiBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCmluZGV4IGE0MmUwOWMuLjNmMjAyODIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KICNlbmRpZgogI2VuZGlmCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlICJGYXN0TWl4ZXJEdW1wU3RhdGUuaCIKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKaW5kZXggZDAyZDllMC4uMDM0ZDE2MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCkBAIC0xLDQgKzEsNCBAQAorZ2thc3RlbkBnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KLWdrYXN0ZW5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTCmluZGV4IGE4NDgzZmEuLmRhOWQzMmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMKQEAgLTEsMyArMSwyIEBACiBqbXRyaXZpQGdvb2dsZS5jb20KLWtyb2NhcmRAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAppbmRleCA3YzhjZTgzLi43MzZmOGIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMTI2LDYgKzEyNiw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFEU0VUOwogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEOwpAQCAtMTM5LDYgKzE0MCw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUjoKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKaW5kZXggMTMzYjNkMC4uYWQ0ZWMyOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCkBAIC00NjAsNyArNDYwLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBhdXRvIG11c2ljU3RyYXRlZ3kgPSBzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAvLyBtdXRlIG1lZGlhIHN0cmF0ZWdpZXMgYW5kIGRlbGF5IGRldmljZSBzd2l0Y2ggYnkgdGhlIGxhcmdlc3QKKyAgICAgICAvLyBUaGlzIGF2b2lkIHNlbmRpbmcgdGhlIG11c2ljIHRhaWwgaW50byB0aGUgZWFycGllY2Ugb3IgaGVhZHNldC4KKyAgICAgICBzZXRTdHJhdGVneU11dGUobXVzaWNTdHJhdGVneSwgdHJ1ZSwgZGVzYyk7CisgICAgICAgc2V0U3RyYXRlZ3lNdXRlKG11c2ljU3RyYXRlZ3ksIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgdHJ1ZSAvKmZyb21DYWNoZSovKS50eXBlcygpKTsKKyAgICB9CiAgICAgLy8gVG9nZ2xlIHRoZSBkZXZpY2Ugc3RhdGU6IFVOQVZBSUxBQkxFIC0+IEFWQUlMQUJMRQogICAgIC8vIFRoaXMgd2lsbCBmb3JjZSByZWFkaW5nIGFnYWluIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbgogICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCkBAIC0xNzEyLDcgKzE3MjEsOCBAQAogICAgICAgICBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIGNsaWVudC0+dm9sdW1lU291cmNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlcy5nZXRWb2x1bWVJbmRleChvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCksIDAgLypkZWxheSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT51c2VId0dhaW4oKSAvKmZvcmNlKi8pOwogCiAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCiAgICAgICAgIC8vIHJvdXRpbmcKQEAgLTU4MzEsNyArNTg0MSw4IEBACiAgICAgaWYgKCFJbnRlcnNlY3Rpb24oZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICB7QVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTLAogICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUsCi0gICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRH0pLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlELAorICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVR9KS5lbXB0eSgpICYmCiAgICAgICAgICAgICAoKHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAogICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykgfHwKICAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pKSB8fApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKaW5kZXggZWQ1YWNkOC4uODMzZjYyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCkBAIC0yMjI2LDEwICsyMjI2LDEyIEBACiAKICAgICBtU3RhdHVzV2FpdGVycysrOwogCisgICAgYm9vbCBzaWduYWxQaXBlbGluZURyYWluID0gZmFsc2U7CiAgICAgaWYgKCFhY3RpdmUgJiYgbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICAgICAgYXV0byBzdHJlYW1JZHMgPSBtT3V0cHV0U3RyZWFtcy5nZXRTdHJlYW1JZHMoKTsKICAgICAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkgewogICAgICAgICAgICAgbVJlcXVlc3RUaHJlYWQtPnNpZ25hbFBpcGVsaW5lRHJhaW4oc3RyZWFtSWRzKTsKKyAgICAgICAgICAgIHNpZ25hbFBpcGVsaW5lRHJhaW4gPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00ub25XYWl0VW50aWxJZGxlKCk7CiAgICAgfQpAQCAtMjI1OSw2ICsyMjYxLDEwIEBACiAgICAgICAgIH0KICAgICB9IHdoaWxlICghc3RhdGVTZWVuKTsKIAorICAgIGlmIChzaWduYWxQaXBlbGluZURyYWluKSB7CisgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5yZXNldFBpcGVsaW5lRHJhaW4oKTsKKyAgICB9CisKICAgICBtU3RhdHVzV2FpdGVycy0tOwogCiAgICAgcmV0dXJuIHJlczsKQEAgLTU4ODQsNiArNTg5MCwxMiBAQAogICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZCA9IHN0cmVhbUlkczsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpyZXNldFBpcGVsaW5lRHJhaW4oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIHBsKG1QYXVzZUxvY2spOworICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gZmFsc2U7CisgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkLmNsZWFyKCk7Cit9CisKIG5zZWNzX3QgQ2FtZXJhM0RldmljZTo6Z2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1JbkZsaWdodExvY2spOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCA5YjA2NDhkLi42Yjg2MDFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtODM4LDYgKzgzOCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKTsKKyAgICAgICAgdm9pZCByZXNldFBpcGVsaW5lRHJhaW4oKTsKIAogICAgICAgcHJvdGVjdGVkOgogCg==